diff --git a/.gitmodules b/.gitmodules index 64b59f463..0d74bef6a 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,6 +4,3 @@ [submodule "oasp4j-ide"] path = oasp4j-ide url = https://github.com/oasp/oasp4j-ide.git -[submodule "samples/server/src/main/client"] - path = samples/server/src/main/client - url = https://github.com/oasp/oasp4js.git diff --git a/pom.xml b/pom.xml index cb6d6a165..053f2c0ce 100644 --- a/pom.xml +++ b/pom.xml @@ -23,17 +23,8 @@ UTF-8 UTF-8 3.0.0-SNAPSHOT - 81 oss 1.5.3.RELEASE - src/main/client - OASP ${project.name} - Service Documentation - This is the documentation of the REST-Services of ${project.name}. - oasp-ci.cloudapp.net - 80 - - oasp4j-sample/services/rest - 1.0.0-beta-3 3.0.1 @@ -319,11 +310,6 @@ flatten-maven-plugin 1.0.1 - - org.codehaus.mojo - servicedocgen-maven-plugin - ${servicedocgen.version} - org.codehaus.mojo license-maven-plugin @@ -424,26 +410,6 @@ - - org.codehaus.mojo - servicedocgen-maven-plugin - - - - ${servicedoc.info.title} - ${servicedoc.info.description} - - ${servicedoc.host} - ${servicedoc.port} - ${servicedoc.basePath} - - http - - - - - - org.codehaus.mojo license-maven-plugin @@ -469,17 +435,6 @@ -Xdoclint:none - - all - - - pom.xml - - - - samples - - security @@ -680,5 +635,4 @@ file://${user.dir}/target/oasp4j/maven - diff --git a/samples/batch/billExport.bat b/samples/batch/billExport.bat deleted file mode 100644 index 5a8df919a..000000000 --- a/samples/batch/billExport.bat +++ /dev/null @@ -1,2 +0,0 @@ -@echo off -call %~dp0\runbatch.bat classpath:config/app/batch/beans-billexport.xml billExportJob bills.file=bills.csv date(date)=2015/12/20 diff --git a/samples/batch/pom.xml b/samples/batch/pom.xml deleted file mode 100644 index de96bf98b..000000000 --- a/samples/batch/pom.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - 4.0.0 - - io.oasp.java.dev - oasp4j-samples - dev-SNAPSHOT - - io.oasp.java.samples - oasp4j-sample-batch - ${project.artifactId} - pom - Batches for the restaurant application - a simple example using the Open Application Standard Platform for Java (OASP4J). - - - ${project.groupId} - oasp4j-sample-core - ${project.version} - - - junit - junit - test - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - - - org.apache.maven.plugins - maven-dependency-plugin - - - copy-dependencies - package - - copy-dependencies - - - - ${project.build.directory}/lib/ - - - - - - - - diff --git a/samples/batch/productImport.bat b/samples/batch/productImport.bat deleted file mode 100644 index 7f17e8f07..000000000 --- a/samples/batch/productImport.bat +++ /dev/null @@ -1,2 +0,0 @@ -@echo off -call %~dp0\runbatch.bat classpath:config/app/batch/beans-productimport.xml productImportJob drinks.file=file:src/test/resources/drinks.csv meals.file=file:src/test/resources/meals.csv date(date)=2015/12/20 diff --git a/samples/batch/readme.txt b/samples/batch/readme.txt deleted file mode 100644 index 313a08850..000000000 --- a/samples/batch/readme.txt +++ /dev/null @@ -1,18 +0,0 @@ -To actually run a batch you have to execute the following command in the oasp4j directory once: - - mvn clean install - -It might be OK if not all projects can be build successfully. - -Afterwards, go to the oasp4j/samples directory and execute (must be executed once after each modification): - - mvn clean package - -Then you can invoke the batch with - - billExport.bat or productImport.bat - -When the batch finishes successfully, you will see something like this in the console log: - -2016-03-14 14:29:09.955 INFO 5524 --- [main] i.o.m.b.c.b.SpringBootBatchCommandLine : Batch Status: COMPLETED -2016-03-14 14:29:09.955 INFO 5524 --- [main] i.o.m.b.c.b.SpringBootBatchCommandLine : Return Code: 0 diff --git a/samples/batch/runbatch.bat b/samples/batch/runbatch.bat deleted file mode 100644 index 6b04f8455..000000000 --- a/samples/batch/runbatch.bat +++ /dev/null @@ -1,2 +0,0 @@ -rem This skript demonstrates how to run oasp batches via commandline -java -cp "%~dp0\target\lib\*" -Doasp.db.port=8143 io.oasp.module.batch.common.base.SpringBootBatchCommandLine io.oasp.gastronomy.restaurant.SpringBootBatchApp %* \ No newline at end of file diff --git a/samples/batch/src/test/resources/drinks.csv b/samples/batch/src/test/resources/drinks.csv deleted file mode 100644 index 5870f32c7..000000000 --- a/samples/batch/src/test/resources/drinks.csv +++ /dev/null @@ -1,3 +0,0 @@ -Heineken, Pretty good beer, 1, true -Dilmah, Very tasty black tea, 2, false -Pepsi, Nice drink, 3, false diff --git a/samples/batch/src/test/resources/meals.csv b/samples/batch/src/test/resources/meals.csv deleted file mode 100644 index 914d8717a..000000000 --- a/samples/batch/src/test/resources/meals.csv +++ /dev/null @@ -1,4 +0,0 @@ -Bratwurst, Tasty sausage, 1 -Hamburger, Big bun with meat, 2 -Tofu, Food made from soy milk, 3 -Pierogi, Very good filled dumplings, 4 diff --git a/samples/core/pom.xml b/samples/core/pom.xml deleted file mode 100644 index ea906b940..000000000 --- a/samples/core/pom.xml +++ /dev/null @@ -1,274 +0,0 @@ - - - 4.0.0 - - io.oasp.java.dev - oasp4j-samples - dev-SNAPSHOT - - io.oasp.java.samples - oasp4j-sample-core - jar - ${project.artifactId} - Core of the server for the restaurant application - a simple example using the Open Application Standard Platform for Java (OASP4J). - - - 1.7 - - - - - io.oasp.java.modules - oasp4j-batch - - - - io.oasp.java.modules - oasp4j-logging - - - - io.oasp.java.modules - oasp4j-beanmapping - - - - io.oasp.java.modules - oasp4j-security - - - - io.oasp.java.starters - oasp4j-starter-cxf-client-rest - - - io.oasp.java.starters - oasp4j-starter-cxf-client-ws - - - - io.oasp.java.starters - oasp4j-starter-cxf-server-rest - - - io.oasp.java.starters - oasp4j-starter-cxf-server-ws - - - - io.oasp.java.modules - oasp4j-jpa-envers - - - - io.oasp.java.modules - oasp4j-web - - - - javax.servlet - javax.servlet-api - provided - - - - org.springframework - spring-aop - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - org.springframework - spring-webmvc - - - - - org.springframework - spring-web - - - - - org.springframework - spring-orm - - - - - org.hibernate - hibernate-entitymanager - - - - - com.h2database - h2 - - - - org.flywaydb - flyway-core - - - - - org.hibernate.javax.persistence - hibernate-jpa-2.1-api - - - cglib - cglib - - - org.hibernate - hibernate-validator - - - - - org.apache.cxf - cxf-rt-rs-service-description - - - - - org.springframework - spring-websocket - - - - org.springframework - spring-messaging - - - - - org.springframework.batch - spring-batch-test - test - - - - io.oasp.java.modules - oasp4j-test - test - - - - javax.el - javax.el-api - - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-tomcat - - - org.springframework.boot - spring-boot-starter-validation - - - - - - org.springframework.boot - spring-boot-starter-actuator - - - - com.mysema.querydsl - querydsl-apt - 3.4.3 - provided - - - - com.mysema.querydsl - querydsl-jpa - 3.7.1 - - - - org.skyscreamer - jsonassert - 1.3.0 - test - - - - - - - - - - - - - - - embedded - - true - - - - org.springframework.boot - spring-boot-starter-tomcat - ${spring.boot.version} - - - - - - - - - src/main/resources - true - - - - - org.apache.maven.plugins - maven-jar-plugin - - - config/application.properties - - - - - - - diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/SpringBootApp.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/SpringBootApp.java deleted file mode 100644 index 848b4ead1..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/SpringBootApp.java +++ /dev/null @@ -1,24 +0,0 @@ -package io.oasp.gastronomy.restaurant; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.autoconfigure.domain.EntityScan; -import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; - -import io.oasp.module.jpa.dataaccess.api.AdvancedRevisionEntity; - -@SpringBootApplication -@EntityScan(basePackages = { "io.oasp.gastronomy.restaurant" }, basePackageClasses = { AdvancedRevisionEntity.class }) -@EnableGlobalMethodSecurity(jsr250Enabled = true) -public class SpringBootApp { - - /** - * Entry point for spring-boot based app - * - * @param args - arguments - */ - public static void main(String[] args) { - - SpringApplication.run(SpringBootApp.class, args); - } -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/SpringBootBatchApp.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/SpringBootBatchApp.java deleted file mode 100644 index cc8ea25b4..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/SpringBootBatchApp.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.oasp.gastronomy.restaurant; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.actuate.autoconfigure.EndpointAutoConfiguration; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.autoconfigure.domain.EntityScan; -import org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration; -import org.springframework.boot.autoconfigure.security.SecurityFilterAutoConfiguration; -import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; - -import io.oasp.module.jpa.dataaccess.api.AdvancedRevisionEntity; - -@SpringBootApplication(exclude = { EndpointAutoConfiguration.class, SecurityAutoConfiguration.class, -SecurityFilterAutoConfiguration.class, }) -@EntityScan(basePackages = { "io.oasp.gastronomy.restaurant" }, basePackageClasses = { AdvancedRevisionEntity.class }) -@EnableGlobalMethodSecurity(jsr250Enabled = false) -public class SpringBootBatchApp { - - /** - * Entry point for spring-boot based app - * - * @param args - arguments - */ - public static void main(String[] args) { - - SpringApplication.run(SpringBootBatchApp.class, args); - } -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/batch/impl/config/BeansBatchConfig.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/batch/impl/config/BeansBatchConfig.java deleted file mode 100644 index 2e1c6b158..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/batch/impl/config/BeansBatchConfig.java +++ /dev/null @@ -1,196 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.batch.impl.config; - -import javax.inject.Inject; -import javax.sql.DataSource; - -import org.springframework.batch.core.configuration.support.JobRegistryBeanPostProcessor; -import org.springframework.batch.core.configuration.support.MapJobRegistry; -import org.springframework.batch.core.explore.support.JobExplorerFactoryBean; -import org.springframework.batch.core.launch.support.RunIdIncrementer; -import org.springframework.batch.core.launch.support.SimpleJobOperator; -import org.springframework.batch.core.repository.support.JobRepositoryFactoryBean; -import org.springframework.beans.factory.BeanCreationException; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.DependsOn; -import org.springframework.transaction.PlatformTransactionManager; - -/** - * This class contains the configuration like jobLauncher,Jobrepository etc. - */ - -import io.oasp.module.batch.common.impl.JobLauncherWithAdditionalRestartCapabilities; - -/** - * This class contains configuration of batch beans. - */ -@Configuration -public class BeansBatchConfig { - - private JobRepositoryFactoryBean jobRepository; - - private MapJobRegistry jobRegistry; - - private JobLauncherWithAdditionalRestartCapabilities jobLauncher; - - private JobExplorerFactoryBean jobExplorer; - - private DataSource dataSource; - - private PlatformTransactionManager transactionManager; - - @Value("ISOLATION_DEFAULT") - private String isolationLevelForCreate; - - /** - * This method is creating joboperator bean - * - * @return SimpleJobOperator - */ - @Bean - @DependsOn({ "jobRepository", "jobExplorer", "jobRegistry", "jobLauncher" }) - public SimpleJobOperator jobOperator() { - - SimpleJobOperator jobOperator = new SimpleJobOperator(); - try { - jobOperator.setJobExplorer(this.jobExplorer.getObject()); - } catch (Exception e) { - throw new BeanCreationException("Could not create BatchJobOperator", e); - } - - jobOperator.setJobLauncher(this.jobLauncher); - jobOperator.setJobRegistry(this.jobRegistry); - - try { - jobOperator.setJobRepository(this.jobRepository.getObject()); - } catch (Exception e) { - throw new BeanCreationException("Could not create BatchJobOperator", e); - } - - return jobOperator; - } - - /** - * This method is creating jobrepository - * - * @return JobRepositoryFactoryBean - */ - @Bean(name = "jobRepository") - public JobRepositoryFactoryBean jobRepository() { - - this.jobRepository = new JobRepositoryFactoryBean(); - this.jobRepository.setDataSource(this.dataSource); - this.jobRepository.setTransactionManager(this.transactionManager); - this.jobRepository.setIsolationLevelForCreate(this.isolationLevelForCreate); - return this.jobRepository; - } - - /** - * This method is creating jobLauncher bean - * - * @return SimpleJobLauncher - */ - @Bean - @DependsOn("jobRepository") - public JobLauncherWithAdditionalRestartCapabilities jobLauncher() { - - this.jobLauncher = new JobLauncherWithAdditionalRestartCapabilities(); - - try { - this.jobLauncher.setJobRepository(this.jobRepository.getObject()); - } catch (Exception e) { - throw new BeanCreationException("Could not create BatchJobOperator", e); - } - - return this.jobLauncher; - } - - /** - * This method is creating jobExplorer bean - * - * @return JobExplorerFactoryBean - */ - @Bean - @DependsOn("dataSource") - public JobExplorerFactoryBean jobExplorer() { - - this.jobExplorer = new JobExplorerFactoryBean(); - this.jobExplorer.setDataSource(this.dataSource); - return this.jobExplorer; - } - - /** - * This method is creating jobRegistry bean - * - * @return MapJobRegistry - */ - @Bean - public MapJobRegistry jobRegistry() { - - this.jobRegistry = new MapJobRegistry(); - return this.jobRegistry; - } - - /** - * This method is creating JobRegistryBeanPostProcessor - * - * @return JobRegistryBeanPostProcessor - */ - @Bean - @DependsOn("jobRegistry") - public JobRegistryBeanPostProcessor jobRegistryBeanPostProcessor() { - - JobRegistryBeanPostProcessor postProcessor = new JobRegistryBeanPostProcessor(); - postProcessor.setJobRegistry(this.jobRegistry); - return postProcessor; - } - - /** - * This method is creating incrementer - * - * @return RunIdIncrementer - */ - @Bean - public RunIdIncrementer incrementer() { - - return new RunIdIncrementer(); - } - - /** - * @return datasource - */ - public DataSource getDataSource() { - - return this.dataSource; - } - - /** - * @param datasource the datasource to set - */ - @Inject - public void setDataSource(DataSource datasource) { - - this.dataSource = datasource; - } - - /** - * - * @return transactionManager - */ - public PlatformTransactionManager getTransactionManager() { - - return this.transactionManager; - } - - /** - * - * @param transactionManager the transactionManager to set - */ - @Inject - public void setTransactionManager(PlatformTransactionManager transactionManager) { - - this.transactionManager = transactionManager; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/ApplicationEntity.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/ApplicationEntity.java deleted file mode 100644 index ae1e7eadb..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/ApplicationEntity.java +++ /dev/null @@ -1,12 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.common.api; - -import net.sf.mmm.util.entity.api.MutableGenericEntity; - -/** - * This is the abstract interface for a {@link MutableGenericEntity} of this application. We are using {@link Long} for - * all {@link #getId() primary keys}. - * - */ -public abstract interface ApplicationEntity extends MutableGenericEntity { - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/BinaryObject.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/BinaryObject.java deleted file mode 100644 index 504d575c5..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/BinaryObject.java +++ /dev/null @@ -1,33 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.common.api; - -/** - * This is the interface for a {@link BinaryObject} of the restaurant. - * - */ -public interface BinaryObject extends ApplicationEntity { - - /** - * @param mimeType is the MIME-Type of this {@link BinaryObject} - */ - void setMimeType(String mimeType); - - /** - * Returns MIME-Type of thie {@link BinaryObject} - * - * @return the MIME-Type, e.g image/jpeg - */ - String getMimeType(); - - /** - * @return Returns the size in bytes - */ - long getSize(); - - /** - * Sets the size of bytes - * - * @param size the size in bytes - */ - void setSize(long size); - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/MoneyHelper.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/MoneyHelper.java deleted file mode 100644 index 0ac8d4688..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/MoneyHelper.java +++ /dev/null @@ -1,88 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.common.api; - -import io.oasp.gastronomy.restaurant.general.common.api.datatype.Money; - -import java.math.BigDecimal; -import java.util.List; - -/** - * This class is a little helper to deal with {@link Money}. It provides convenience methods to get a {@link Money}. - * - */ -public final class MoneyHelper { - - /** - * String representation of the default currency Euro (ISO 4217). - */ - public static final String DEFAULT_CURRENCY_STRING = "EUR"; - - /** - * MonetaryAmount with amount 0 and default currency. - */ - public static final Money ZERO_MONEY = Money.ZERO; - - /** - * Construction prohibited. - */ - private MoneyHelper() { - - super(); - } - - /** - * Returns a {@link Money} with the default currency and the given amount. - * - * @param amount of the {@link Money} - * @return {@link Money} with default currency - */ - public static Money getMoneyWithDefaultCurrency(Number amount) { - - BigDecimal value; - if (amount instanceof BigDecimal) { - value = (BigDecimal) amount; - } else { - value = BigDecimal.valueOf(amount.doubleValue()); - } - return new Money(value); - } - - /** - * - * Returns a {@link Money} with the given currency and the given amount. - * - * @param amount amount of the {@link Money} - * @param currencyCode ISO 4217 Code of the currency - * @return {@link Money} with given currency - */ - public static Money getMoney(Number amount, String currencyCode) { - - return getMoneyWithDefaultCurrency(amount); - } - - /** - * Sums a list of {@link Money}s. The returned {@link Money} has the currency of the {@link Money}s in the given list. - * If the list is empty the {@link #ZERO_MONEY} is returned. - * - * @param moneyToSum list of {@link Money}s to sum - * @return sum of given {@link Money}s, {@link #ZERO_MONEY} if list is empty - */ - public static Money sumMoneys(List moneyToSum) { - - Money sum = null; - - for (Money monetaryAmount : moneyToSum) { - if (sum == null) { - sum = monetaryAmount; - } else { - sum = sum.add(monetaryAmount); - } - } - - if (sum == null) { - sum = ZERO_MONEY; - } - - return sum; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/NlsBundleApplicationRoot.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/NlsBundleApplicationRoot.java deleted file mode 100644 index a149a0af0..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/NlsBundleApplicationRoot.java +++ /dev/null @@ -1,77 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.common.api; - -import javax.inject.Named; - -import net.sf.mmm.util.nls.api.NlsBundle; -import net.sf.mmm.util.nls.api.NlsBundleMessage; -import net.sf.mmm.util.nls.api.NlsMessage; - -/** - * This is the {@link NlsBundle} for this application. - * - */ -public interface NlsBundleApplicationRoot extends NlsBundle { - - /** - * @see io.oasp.gastronomy.restaurant.general.common.api.exception.IllegalEntityStateException - * - * @param entity is the entity relevant for the error. - * @param state is the state of the entity that caused the operation to fail. - * @return the {@link NlsMessage}. - */ - @NlsBundleMessage("The entity {entity} is in state {state}!") - NlsMessage errorIllegalEntityState(@Named("entity") Object entity, @Named("state") Object state); - - /** - * @see io.oasp.gastronomy.restaurant.general.common.api.exception.IllegalEntityStateException - * - * @param entity is the entity relevant for the error. - * @param currentState is the current state of the entity. - * @param newState is the new state for the entity that is illegal. - * @return the {@link NlsMessage}. - */ - @NlsBundleMessage("The entity {entity} in state {currentState} can not be changed to state {newState}!") - NlsMessage errorIllegalEntityStateChange(@Named("entity") Object entity, @Named("currentState") Object currentState, - @Named("newState") Object newState); - - /** - * @see io.oasp.gastronomy.restaurant.general.common.api.exception.IllegalEntityStateException - * - * @param object is the entity relevant for the error. - * @param property is the property of the entity that can not be changed. - * @return the {@link NlsMessage}. - */ - @NlsBundleMessage("The property {property} of object {object} can not be changed!") - NlsMessage errorIllegalPropertyChange(@Named("object") Object object, @Named("property") Object property); - - /** - * @see io.oasp.gastronomy.restaurant.general.common.api.exception.NoActiveUserException - * - * @return the {@link NlsMessage}. - */ - @NlsBundleMessage("There is currently no user logged in") - NlsMessage errorNoActiveUser(); - - // BEGIN ARCHETYPE SKIP - /** - * @see io.oasp.gastronomy.restaurant.offermanagement.common.api.exception.OfferEmptyException - * - * @return the {@link NlsMessage}. - */ - @NlsBundleMessage("The offer is empty - it must contain a drink, meal, or side-dish!") - NlsMessage errorOfferEmpty(); - - /** - * @see io.oasp.gastronomy.restaurant.salesmanagement.common.api.exception.ChangeTableIllegalStateCombinationException - * - * @param orderId The id of the order which is going to be transfered to the targetTable - * @param tableNumber of the targetTable which is causing the problem - * @return the {@link NlsMessage}. - */ - @NlsBundleMessage("The order with the Id {orderId} can''t be transfered to the table with the Number {tableNumber}" - + " because this table is already occupied.") - NlsMessage errorChangeTableIllegalStateCombination(@Named("orderId") Long orderId, - @Named("tableNumber") Long tableNumber); - // END ARCHETYPE SKIP - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/RestService.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/RestService.java deleted file mode 100644 index 9cfe326e7..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/RestService.java +++ /dev/null @@ -1,9 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.common.api; - -/** - * A marker interface for REST services. REST service interfaces of components should extend this interface. - * - */ -public interface RestService { - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/UserProfile.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/UserProfile.java deleted file mode 100644 index ac5b256db..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/UserProfile.java +++ /dev/null @@ -1,40 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.common.api; - -import io.oasp.gastronomy.restaurant.general.common.api.datatype.Role; - -import java.security.Principal; - -/** - * This is the interface for the profile of a user interacting with this application. Currently this can only be a - * {@link io.oasp.gastronomy.restaurant.staffmanagement.dataaccess.api.StaffMemberEntity} however in the future a - * customer may login and make a reservation, etc.
- * TODO: Also an external system may access the application via some service. Then there would be no user profile or it - * would be empty... - * - */ -public interface UserProfile extends Principal { - /** - * @return the technical ID of the user for calling REST services. - */ - Long getId(); - - /** - * @return the unique login of the user for authentication and identification. - */ - String getName(); - - /** - * @return the first name of the users real name. - */ - String getFirstName(); - - /** - * @return the last name of the users real name. - */ - String getLastName(); - - /** - * @return {@link Role} of this {@link UserProfile}. - */ - Role getRole(); -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/Usermanagement.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/Usermanagement.java deleted file mode 100644 index 7a84b5f24..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/Usermanagement.java +++ /dev/null @@ -1,15 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.common.api; - -/** - * Interface to get a user from its login. - * - */ -public interface Usermanagement { - - /** - * @param login The login of the requested user. - * @return The {@link UserProfile} with the given login or {@code null} if no such object exists. - */ - UserProfile findUserProfileByLogin(String login); - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/constants/NamedQueries.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/constants/NamedQueries.java deleted file mode 100644 index 2fefef6f8..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/constants/NamedQueries.java +++ /dev/null @@ -1,32 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.common.api.constants; - -/** - * Constants of the named queries defined in NamedQueries.xml. - * - */ -public abstract class NamedQueries { - - // put your query names from NamedQueries.xml as constants here (or generate with cobigen) - // BEGIN ARCHETYPE SKIP - /** @see io.oasp.gastronomy.restaurant.tablemanagement.dataaccess.impl.dao.TableDaoImpl#getFreeTables() */ - public static final String GET_FREE_TABLES = "get.free.tables"; - - /** @see io.oasp.gastronomy.restaurant.staffmanagement.dataaccess.impl.dao.StaffMemberDaoImpl#findByLogin(String) */ - public static final String GET_STAFF_MEMBER_BY_LOGIN = "get.staff.member.by.login"; - - /** @see io.oasp.gastronomy.restaurant.salesmanagement.dataaccess.impl.dao.OrderPositionDaoImpl */ - public static final String GET_ALL_ORDER_POSITIONS = "get.all.order.positions"; - - /** @see io.oasp.gastronomy.restaurant.salesmanagement.dataaccess.impl.dao.OrderPositionDaoImpl */ - public static final String GET_ALL_OPEN_ORDER_POSITIONS = "get.all.open.order.positions"; - - /** @see io.oasp.gastronomy.restaurant.salesmanagement.dataaccess.impl.dao.OrderPositionDaoImpl */ - public static final String GET_OPEN_ORDER_POSITIONS_FOR_ORDER = "get.open.order.positions.for.order"; - - /** @see io.oasp.gastronomy.restaurant.salesmanagement.dataaccess.impl.dao.OrderDaoImpl */ - public static final String GET_OPEN_ORDER_FOR_TABLE = "get.open.order.for.table"; - - /** @see io.oasp.gastronomy.restaurant.salesmanagement.dataaccess.impl.dao.BillDaoImpl */ - public static final String GET_ALL_IDS_OF_PAYED_BILLS = "get.all.ids.of.payed.bills"; - // END ARCHETYPE SKIP -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/constants/PermissionConstants.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/constants/PermissionConstants.java deleted file mode 100644 index 6746b0a20..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/constants/PermissionConstants.java +++ /dev/null @@ -1,84 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.common.api.constants; - -/** - * Contains constants for the keys of all - * {@link io.oasp.module.security.common.api.accesscontrol.AccessControlPermission}s. - * - */ -public abstract class PermissionConstants { - - // put your permission names from access-control-schema.xml as constants here (or generate with cobigen) - // BEGIN ARCHETYPE SKIP - /** {@link io.oasp.module.security.common.api.accesscontrol.AccessControlPermission} to retrieve offer. */ - public static final String FIND_OFFER = "FindOffer"; - - /** {@link io.oasp.module.security.common.api.accesscontrol.AccessControlPermission} to save offer. */ - public static final String SAVE_OFFER = "SaveOffer"; - - /** {@link io.oasp.module.security.common.api.accesscontrol.AccessControlPermission} to remove offer. */ - public static final String DELETE_OFFER = "DeleteOffer"; - - /** {@link io.oasp.module.security.common.api.accesscontrol.AccessControlPermission} to retrieve product. */ - public static final String FIND_PRODUCT = "FindProduct"; - - /** {@link io.oasp.module.security.common.api.accesscontrol.AccessControlPermission} to save product. */ - public static final String SAVE_PRODUCT = "SaveProduct"; - - /** {@link io.oasp.module.security.common.api.accesscontrol.AccessControlPermission} to remove product. */ - public static final String DELETE_PRODUCT = "DeleteProduct"; - - /** {@link io.oasp.module.security.common.api.accesscontrol.AccessControlPermission} to retrieve product picture. */ - public static final String FIND_PRODUCT_PICTURE = "FindProductPicture"; - - /** {@link io.oasp.module.security.common.api.accesscontrol.AccessControlPermission} to save product picture. */ - public static final String SAVE_PRODUCT_PICTURE = "SaveProductPicture"; - - /** {@link io.oasp.module.security.common.api.accesscontrol.AccessControlPermission} to remove product picture. */ - public static final String DELETE_PRODUCT_PICTURE = "DeleteProductPicture"; - - /** {@link io.oasp.module.security.common.api.accesscontrol.AccessControlPermission} to retrieve order. */ - public static final String FIND_ORDER = "FindOrder"; - - /** {@link io.oasp.module.security.common.api.accesscontrol.AccessControlPermission} to save order. */ - public static final String SAVE_ORDER = "SaveOrder"; - - /** {@link io.oasp.module.security.common.api.accesscontrol.AccessControlPermission} to remove order. */ - public static final String DELETE_ORDER = "DeleteOrder"; - - /** {@link io.oasp.module.security.common.api.accesscontrol.AccessControlPermission} to retrieve order position. */ - public static final String FIND_ORDER_POSITION = "FindOrderPosition"; - - /** {@link io.oasp.module.security.common.api.accesscontrol.AccessControlPermission} to save order position. */ - public static final String SAVE_ORDER_POSITION = "SaveOrderPosition"; - - /** {@link io.oasp.module.security.common.api.accesscontrol.AccessControlPermission} to remove order position. */ - public static final String DELETE_ORDER_POSITION = "DeleteOrderPosition"; - - /** {@link io.oasp.module.security.common.api.accesscontrol.AccessControlPermission} to retrieve bill. */ - public static final String FIND_BILL = "FindBill"; - - /** {@link io.oasp.module.security.common.api.accesscontrol.AccessControlPermission} to save bill. */ - public static final String SAVE_BILL = "SaveBill"; - - /** {@link io.oasp.module.security.common.api.accesscontrol.AccessControlPermission} to remove bill. */ - public static final String DELETE_BILL = "DeleteBill"; - - /** {@link io.oasp.module.security.common.api.accesscontrol.AccessControlPermission} to retrieve staff member. */ - public static final String FIND_STAFF_MEMBER = "FindStaffMember"; - - /** {@link io.oasp.module.security.common.api.accesscontrol.AccessControlPermission} to save staff member. */ - public static final String SAVE_STAFF_MEMBER = "SaveStaffMember"; - - /** {@link io.oasp.module.security.common.api.accesscontrol.AccessControlPermission} to remove staff member. */ - public static final String DELETE_STAFF_MEMBER = "DeleteStaffMember"; - - /** {@link io.oasp.module.security.common.api.accesscontrol.AccessControlPermission} to retrieve table. */ - public static final String FIND_TABLE = "FindTable"; - - /** {@link io.oasp.module.security.common.api.accesscontrol.AccessControlPermission} to save table. */ - public static final String SAVE_TABLE = "SaveTable"; - - /** {@link io.oasp.module.security.common.api.accesscontrol.AccessControlPermission} to remove table. */ - public static final String DELETE_TABLE = "DeleteTable"; - // END ARCHETYPE SKIP -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/datatype/Money.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/datatype/Money.java deleted file mode 100644 index d5b543dc2..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/datatype/Money.java +++ /dev/null @@ -1,97 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.common.api.datatype; - -import java.math.BigDecimal; -import java.util.Currency; -import java.util.Objects; - -import net.sf.mmm.util.lang.api.AbstractSimpleDatatype; - -/** - * This is the implementation of a {@link net.sf.mmm.util.lang.api.Datatype} to represent an amount of money.
- * We recommend to use JSR354 (javax.money.MonetaryAmount) instead. However, we created this when the JSR - * was still in progress and the API had a licensing model that incompatible with ASL 2.0. - * - */ -public class Money extends AbstractSimpleDatatype implements Comparable { - - /** A {@link Money} instance where the {@link #getValue() amount} is 0. */ - public static final Money ZERO = new Money(BigDecimal.ZERO); - - /** - * For simplicity we use a fixed currency. This appears reasonable for a restaurant as you would only accept money is - * the local currency. However, be aware that even in such case a variable currency can make sense if you consider - * that the currency of a country can change (for instance when the Euro was introduced). In such case the historical - * money amounts in storage still have to be loaded and interpreted in the correct currency. Therefore, using - * javax.money.MonetaryAmount instead would make sense.
- * In case you would like to change the currency to use the restaurant in a different country, you have to change it - * here but also in the JS client. - */ - private static final Currency CURRENCY = Currency.getInstance("EUR"); - - /** UID for serialization. */ - private static final long serialVersionUID = 1L; - - /** - * The constructor. - * - * @param value is the {@link #getValue() amount}. - */ - public Money(BigDecimal value) { - - super(value); - Objects.requireNonNull(value, "value"); - } - - /** - * - * The constructor. - */ - public Money() { - - super(); - } - - /** - * The constructor. - * - * @param value is the {@link #getValue() amount}. - */ - public Money(Number value) { - - this(BigDecimal.valueOf(value.doubleValue())); - } - - /** - * @return the currency the {@link Money} is represented in. - */ - public Currency getCurrency() { - - return CURRENCY; - } - - /** - * @param money is the {@link Money} to add. - * @return the sum of this {@link Money} and the given money. - */ - public Money add(Money money) { - - return new Money(getValue().add(money.getValue())); - } - - @Override - public String toString() { - - return getValue().toPlainString() + " " + getCurrency(); - } - - /** - * {@inheritDoc} - */ - @Override - public int compareTo(Object o) { - - Money other = (Money) o; - return getValue().compareTo(other.getValue()); - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/datatype/Role.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/datatype/Role.java deleted file mode 100644 index 45edb0902..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/datatype/Role.java +++ /dev/null @@ -1,53 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.common.api.datatype; - -import java.security.Principal; - -// BEGIN ARCHETYPE SKIP -/** - * Defines the available roles of a {@link io.oasp.gastronomy.restaurant.staffmanagement.common.api.StaffMember}. - * - * @see io.oasp.gastronomy.restaurant.staffmanagement.common.api.StaffMember#getRole() - * - */ -// END ARCHETYPE SKIP -public enum Role implements Principal { - - // BEGIN ARCHETYPE SKIP - /** - * AccessControlGroup of a cook who works in the kitchen and can see the orders with their positions. He prepares the - * menus and side-dishes and can mark order-positions as prepared. - */ - COOK("Cook"), - - /** - * AccessControlGroup of a waiter who manages the table states, takes orders at the tables and serves drinks and the - * prepared food from the kitchen. Further, he is responsible for billing the payments of orders, etc. - */ - WAITER("Waiter"), - - /** - * AccessControlGroup of a barkeeper who is responsible for taking orders for drinks at the bar as well as serving and - * billing them. - */ - BARKEEPER("Barkeeper"), - - /** - * AccessControlGroup of a chief on the restaurant who can manage the master-data such as offers, products, and other - * {@link io.oasp.gastronomy.restaurant.staffmanagement.common.api.StaffMember}s. - */ - // END ARCHETYPE SKIP - CHIEF("Chief"); - - private final String name; - - private Role(String name) { - - this.name = name; - } - - @Override - public String getName() { - - return this.name; - } -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/datatype/validation/NotNegativeMoney.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/datatype/validation/NotNegativeMoney.java deleted file mode 100644 index b711f801a..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/datatype/validation/NotNegativeMoney.java +++ /dev/null @@ -1,38 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.common.api.datatype.validation; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -import javax.validation.Constraint; -import javax.validation.Payload; - -/** - * Constraint for validator {@link NotNegativeMoneyValidator}. - * - */ -@Documented -@Target({ METHOD, FIELD }) -@Retention(RetentionPolicy.RUNTIME) -@Constraint(validatedBy = NotNegativeMoneyValidator.class) -public @interface NotNegativeMoney { - - /** - * The default message displayed when the validation fails. - */ - String message() default "The price must not be negative"; - - /** - * The default groups of this constraint. - */ - Class[] groups() default {}; - - /** - * The payload element of this constraint. - */ - Class[] payload() default {}; -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/datatype/validation/NotNegativeMoneyValidator.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/datatype/validation/NotNegativeMoneyValidator.java deleted file mode 100644 index 6e1f539f6..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/datatype/validation/NotNegativeMoneyValidator.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.common.api.datatype.validation; - -import java.math.BigDecimal; - -import javax.validation.ConstraintValidator; -import javax.validation.ConstraintValidatorContext; - -import io.oasp.gastronomy.restaurant.general.common.api.datatype.Money; - -/** - * Validates that an instance of Money must not have a negative price. - * - */ -public class NotNegativeMoneyValidator implements ConstraintValidator { - - @Override - public void initialize(NotNegativeMoney constraintAnnotation) { - - } - - @Override - public boolean isValid(Money value, ConstraintValidatorContext context) { - - if (value == null) { - return true; - } - return value.getValue().compareTo(BigDecimal.ZERO) >= 0; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/exception/ApplicationBusinessException.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/exception/ApplicationBusinessException.java deleted file mode 100644 index 851217672..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/exception/ApplicationBusinessException.java +++ /dev/null @@ -1,36 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.common.api.exception; - -import net.sf.mmm.util.nls.api.NlsMessage; - -/** - * Abstract business checked main exception. - * - */ -public abstract class ApplicationBusinessException extends ApplicationException { - - private static final long serialVersionUID = 1L; - - /** - * @param message the error {@link #getNlsMessage() message}. - */ - public ApplicationBusinessException(NlsMessage message) { - - super(message); - } - - /** - * @param cause the error {@link #getCause() cause}. - * @param message the error {@link #getNlsMessage() message}. - */ - public ApplicationBusinessException(Throwable cause, NlsMessage message) { - - super(cause, message); - } - - @Override - public boolean isTechnical() { - - return false; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/exception/ApplicationException.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/exception/ApplicationException.java deleted file mode 100644 index 4e31721b1..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/exception/ApplicationException.java +++ /dev/null @@ -1,31 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.common.api.exception; - -import net.sf.mmm.util.exception.api.NlsRuntimeException; -import net.sf.mmm.util.nls.api.NlsMessage; - -/** - * Abstract main exception. - * - */ -public abstract class ApplicationException extends NlsRuntimeException { - - private static final long serialVersionUID = 1L; - - /** - * @param message the error {@link #getNlsMessage() message}. - */ - public ApplicationException(NlsMessage message) { - - super(message); - } - - /** - * @param cause the error {@link #getCause() cause}. - * @param message the error {@link #getNlsMessage() message}. - */ - public ApplicationException(Throwable cause, NlsMessage message) { - - super(cause, message); - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/exception/ApplicationTechnicalException.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/exception/ApplicationTechnicalException.java deleted file mode 100644 index a666f2a4e..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/exception/ApplicationTechnicalException.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.common.api.exception; - -import net.sf.mmm.util.nls.api.NlsMessage; - -/** - * Abstract technical checked main exception. - * - */ -public abstract class ApplicationTechnicalException extends ApplicationException { - - private static final long serialVersionUID = 1L; - - /** - * @param message the error {@link #getNlsMessage() message}. - */ - public ApplicationTechnicalException(NlsMessage message) { - - super(message); - } - - /** - * @param cause the error {@link #getCause() cause}. - * @param message the error {@link #getNlsMessage() message}. - */ - public ApplicationTechnicalException(Throwable cause, NlsMessage message) { - - super(cause, message); - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/exception/IllegalEntityStateException.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/exception/IllegalEntityStateException.java deleted file mode 100644 index 5520bda4a..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/exception/IllegalEntityStateException.java +++ /dev/null @@ -1,64 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.common.api.exception; - -import io.oasp.gastronomy.restaurant.general.common.api.NlsBundleApplicationRoot; - -/** - * This exception is thrown if an {@link io.oasp.gastronomy.restaurant.general.common.api.ApplicationEntity entity} has - * a specific state that is illegal for the current operation and caused it to fail. - * - */ -public class IllegalEntityStateException extends ApplicationBusinessException { - - /** UID for serialization. */ - private static final long serialVersionUID = 1L; - - /** - * The constructor. - * - * @param entity the entity that caused this error. - * @param state the state of the entity that is illegal for the failed operation. - */ - public IllegalEntityStateException(Object entity, Object state) { - - this((Throwable) null, entity, state); - } - - /** - * The constructor. - * - * @param entity the entity that caused this error. - * @param currentState the state of the RestaurantEntity entity. - * @param newState is the new state for the entity that is illegal. - */ - public IllegalEntityStateException(Object entity, Object currentState, Object newState) { - - this(null, entity, currentState, newState); - } - - /** - * The constructor. - * - * @param cause the {@link #getCause() cause} of this error. - * @param entity the entity that caused this error. - * @param state the state of the entity that is illegal for the failed operation. - */ - public IllegalEntityStateException(Throwable cause, Object entity, Object state) { - - super(cause, createBundle(NlsBundleApplicationRoot.class).errorIllegalEntityState(entity, state)); - } - - /** - * The constructor. - * - * @param cause the {@link #getCause() cause} of this error. - * @param entity the entity that caused this error. - * @param currentState the state of the entity. - * @param newState is the new state for the entity that is illegal. - */ - public IllegalEntityStateException(Throwable cause, Object entity, Object currentState, Object newState) { - - super(cause, createBundle(NlsBundleApplicationRoot.class).errorIllegalEntityStateChange(entity, currentState, - newState)); - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/exception/IllegalPropertyChangeException.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/exception/IllegalPropertyChangeException.java deleted file mode 100644 index 4b5e6ae8d..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/exception/IllegalPropertyChangeException.java +++ /dev/null @@ -1,38 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.common.api.exception; - -import io.oasp.gastronomy.restaurant.general.common.api.NlsBundleApplicationRoot; - -/** - * This exception is thrown if an {@link io.oasp.gastronomy.restaurant.general.common.api.ApplicationEntity entity} has - * a specific state that is illegal for the current operation and caused it to fail. - * - */ -public class IllegalPropertyChangeException extends ApplicationBusinessException { - - /** UID for serialization. */ - private static final long serialVersionUID = 1L; - - /** - * The constructor. - * - * @param object the object that caused this error. - * @param property is the property that can not be changed (typically a {@link String}). - */ - public IllegalPropertyChangeException(Object object, Object property) { - - this((Throwable) null, object, property); - } - - /** - * The constructor. - * - * @param cause the {@link #getCause() cause} of this error. - * @param object the object that caused this error. - * @param property is the property that can not be changed (typically a {@link String}). - */ - public IllegalPropertyChangeException(Throwable cause, Object object, Object property) { - - super(cause, createBundle(NlsBundleApplicationRoot.class).errorIllegalPropertyChange(object, property)); - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/exception/NoActiveUserException.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/exception/NoActiveUserException.java deleted file mode 100644 index cab067a72..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/exception/NoActiveUserException.java +++ /dev/null @@ -1,32 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.common.api.exception; - -import io.oasp.gastronomy.restaurant.general.common.api.NlsBundleApplicationRoot; - -/** - * Thrown when an operation is requested that requires a user to be logged in, but no such user exists. - * - */ -public class NoActiveUserException extends ApplicationBusinessException { - - /** UID for serialization. */ - private static final long serialVersionUID = 1L; - - /** - * The constructor. - */ - public NoActiveUserException() { - - this(null); - } - - /** - * The constructor. - * - * @param cause The root cause of this exception. - */ - public NoActiveUserException(Throwable cause) { - - super(cause, createBundle(NlsBundleApplicationRoot.class).errorNoActiveUser()); - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/security/UserData.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/security/UserData.java deleted file mode 100644 index 2c5fb4dcf..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/security/UserData.java +++ /dev/null @@ -1,123 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.common.api.security; - -import io.oasp.gastronomy.restaurant.general.common.api.UserProfile; -import io.oasp.gastronomy.restaurant.general.common.api.to.UserDetailsClientTo; - -import java.security.Principal; -import java.util.Collection; - -import org.springframework.security.core.Authentication; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.core.userdetails.User; - -/** - * Container class for the profile of a user. - * - */ -public class UserData extends User implements Principal { - - private static final long serialVersionUID = 1L; - - private UserProfile userProfile; - - /** - * The constructor. - * - * @param username sets the username - * @param password sets the password - * @param enabled check if user is enabled - * @param accountNonExpired check if user account is not expired - * @param credentialsNonExpired check if user credentials are not expired - * @param accountNonLocked check if user account is not locked - * @param authorities the authorities/permissions the user has - */ - public UserData(String username, String password, boolean enabled, boolean accountNonExpired, - boolean credentialsNonExpired, boolean accountNonLocked, Collection authorities) { - - super(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities); - } - - /** - * The constructor. - * - * @param username sets the username - * @param password sets the password - * @param authorities the authorities/permissions the user has - */ - public UserData(String username, String password, Collection authorities) { - - super(username, password, authorities); - } - - @Override - public String getName() { - - return getUsername(); - } - - /** - * @return an instance of {@link UserDetailsClientTo} with the client side representation of this {@link UserData} - * instance. - */ - public UserDetailsClientTo toClientTo() { - - UserDetailsClientTo clientTo = new UserDetailsClientTo(); - clientTo.setId(this.userProfile.getId()); - clientTo.setName(this.userProfile.getName()); - clientTo.setFirstName(this.userProfile.getFirstName()); - clientTo.setLastName(this.userProfile.getLastName()); - clientTo.setRole(this.userProfile.getRole()); - return clientTo; - } - - @Override - public String toString() { - - return getName(); - } - - /** - * @return userProfile - */ - public UserProfile getUserProfile() { - - return this.userProfile; - } - - /** - * @param userProfile the userProfile to set - */ - public void setUserProfile(UserProfile userProfile) { - - this.userProfile = userProfile; - } - - /** - * @return the {@link UserData} of the user currently logged in. - */ - public static UserData get() { - - return get(SecurityContextHolder.getContext().getAuthentication()); - } - - /** - * @param authentication is the {@link Authentication} where to retrieve the user from. - * @return the {@link UserData} of the logged in user from the given {@link Authentication}. - */ - public static UserData get(Authentication authentication) { - - if (authentication == null) { - throw new IllegalStateException("Authentication not available!"); - } - Object principal = authentication.getPrincipal(); - if (principal == null) { - throw new IllegalStateException("Principal not available!"); - } - try { - return (UserData) principal; - } catch (ClassCastException e) { - throw new IllegalStateException("Principal (" + principal + ") is not an instance of UserData!", e); - } - } -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/to/UserDetailsClientTo.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/to/UserDetailsClientTo.java deleted file mode 100644 index 062af5c01..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/api/to/UserDetailsClientTo.java +++ /dev/null @@ -1,106 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.common.api.to; - -import io.oasp.gastronomy.restaurant.general.common.api.UserProfile; -import io.oasp.gastronomy.restaurant.general.common.api.datatype.Role; -import io.oasp.module.basic.common.api.to.AbstractTo; - -/** - * This is the {@link AbstractTo TO} for the client view on the user details. - * - */ -public class UserDetailsClientTo extends AbstractTo implements UserProfile { - - /** UID for serialization. */ - private static final long serialVersionUID = 1L; - - private Long id; - - private String name; - - private String firstName; - - private String lastName; - - private Role role; - - /** - * The constructor. - */ - public UserDetailsClientTo() { - - super(); - } - - @Override - public Long getId() { - - return this.id; - } - - @Override - public String getName() { - - return this.name; - } - - @Override - public String getFirstName() { - - return this.firstName; - } - - @Override - public String getLastName() { - - return this.lastName; - } - - @Override - public Role getRole() { - - return this.role; - } - - /** - * Sets the ID. - * - * @param id the ID to set - */ - public void setId(Long id) { - - this.id = id; - } - - /** - * @param name the name to set - */ - public void setName(String name) { - - this.name = name; - } - - /** - * @param firstName the firstName to set - */ - public void setFirstName(String firstName) { - - this.firstName = firstName; - } - - /** - * @param lastName the lastName to set - */ - public void setLastName(String lastName) { - - this.lastName = lastName; - } - - /** - * @param role the role to set - */ - public void setRole(Role role) { - - this.role = role; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/base/AbstractBeanMapperSupport.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/base/AbstractBeanMapperSupport.java deleted file mode 100644 index 9d93c8bfc..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/base/AbstractBeanMapperSupport.java +++ /dev/null @@ -1,33 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.common.base; - -import io.oasp.module.beanmapping.common.api.BeanMapper; - -import javax.inject.Inject; - -/** - * This abstract class provides {@link #getBeanMapper() access} to the {@link BeanMapper}. - * - */ -public abstract class AbstractBeanMapperSupport { - - /** @see #getBeanMapper() */ - private BeanMapper beanMapper; - - /** - * @param beanMapper is the {@link BeanMapper} to {@link Inject} - */ - @Inject - public void setBeanMapper(BeanMapper beanMapper) { - - this.beanMapper = beanMapper; - } - - /** - * @return the {@link BeanMapper} instance. - */ - protected BeanMapper getBeanMapper() { - - return this.beanMapper; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/impl/config/BeansDozerConfig.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/impl/config/BeansDozerConfig.java deleted file mode 100644 index 13dadee0b..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/impl/config/BeansDozerConfig.java +++ /dev/null @@ -1,32 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.common.impl.config; - -import java.util.ArrayList; -import java.util.List; - -import org.dozer.DozerBeanMapper; -import org.dozer.Mapper; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; - -/** - * Java bean configuration for Dozer - */ -@Configuration -@ComponentScan(basePackages = { "io.oasp.module.beanmapping" }) -public class BeansDozerConfig { - - private static final String DOZER_MAPPING_XML = "config/app/common/dozer-mapping.xml"; - - /** - * @return the {@link DozerBeanMapper}. - */ - @Bean - public Mapper getDozer() { - - List beanMappings = new ArrayList<>(); - beanMappings.add(DOZER_MAPPING_XML); - return new DozerBeanMapper(beanMappings); - - } -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/impl/security/ApplicationAuthenticationProvider.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/impl/security/ApplicationAuthenticationProvider.java deleted file mode 100644 index 10a5ec296..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/impl/security/ApplicationAuthenticationProvider.java +++ /dev/null @@ -1,97 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.common.impl.security; - -import java.util.Set; - -import javax.inject.Inject; -import javax.inject.Named; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; -import org.springframework.security.core.AuthenticationException; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.security.core.userdetails.UsernameNotFoundException; - -import io.oasp.gastronomy.restaurant.general.common.api.UserProfile; -import io.oasp.gastronomy.restaurant.general.common.api.Usermanagement; -import io.oasp.gastronomy.restaurant.general.common.api.security.UserData; -import io.oasp.module.security.common.base.accesscontrol.AbstractAccessControlBasedAuthenticationProvider; - -/** - * This class is responsible for the security aspects of authentication as well as providing user profile - * data and the access-controls for authoriziation. - * @deprecated As of bug-fix release 2.1.2 the authentication mechanism changes. It is now based upon custom - * implementations of {@link UserDetailsService} in combination with {@link WebSecurityConfigurerAdapter}. - * For further information have a look at the sample application.
- *
- * - */ -@Deprecated -@Named("ApplicationAuthenticationProvider") -public class ApplicationAuthenticationProvider - extends AbstractAccessControlBasedAuthenticationProvider { - - /** Logger instance. */ - private static final Logger LOG = LoggerFactory.getLogger(ApplicationAuthenticationProvider.class); - - private Usermanagement usermanagement; - - /** - * The constructor. - */ - public ApplicationAuthenticationProvider() { - - super(); - } - - @Override - protected void additionalAuthenticationChecks(UserDetails userDetails, - UsernamePasswordAuthenticationToken authentication) throws AuthenticationException { - - authentication.setDetails(userDetails); - } - - /** - * @param usermanagement the {@link Usermanagement} to set - */ - @Inject - public void setUsermanagement(Usermanagement usermanagement) { - - this.usermanagement = usermanagement; - } - - @Override - protected UserProfile retrievePrincipal(String username, UsernamePasswordAuthenticationToken authentication) { - - try { - return this.usermanagement.findUserProfileByLogin(username); - } catch (RuntimeException e) { - e.printStackTrace(); - UsernameNotFoundException exception = new UsernameNotFoundException("Authentication failed.", e); - LOG.warn("Failed to get user {}.", username, exception); - throw exception; - } - } - - @Override - protected UserData createUser(String username, String password, UserProfile principal, - Set authorities) { - - UserData user = new UserData(username, password, authorities); - user.setUserProfile(principal); - return user; - } - - /* - * Leave empty on purpose. Not used in this version. - */ - @Override - protected UserProfile retrievePrincipal(String username) { - - return null; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/impl/security/BaseUserDetailsService.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/impl/security/BaseUserDetailsService.java deleted file mode 100644 index b23fa597b..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/impl/security/BaseUserDetailsService.java +++ /dev/null @@ -1,205 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.common.impl.security; - -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; - -import javax.inject.Inject; -import javax.inject.Named; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; -import org.springframework.security.core.AuthenticationException; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.security.core.userdetails.UsernameNotFoundException; - -import io.oasp.gastronomy.restaurant.general.common.api.UserProfile; -import io.oasp.gastronomy.restaurant.general.common.api.Usermanagement; -import io.oasp.gastronomy.restaurant.general.common.api.security.UserData; -import io.oasp.module.security.common.api.accesscontrol.AccessControl; -import io.oasp.module.security.common.api.accesscontrol.AccessControlProvider; -import io.oasp.module.security.common.api.accesscontrol.PrincipalAccessControlProvider; -import io.oasp.module.security.common.base.accesscontrol.AccessControlGrantedAuthority; - -/** - * This class represents a customized implementation of the {@link UserDetailsService} interface.
- *
- * It should be used in custom subclasses of {@link WebSecurityConfigurerAdapter} in the following way: - *
    - *
  • Inject a fully configured instance of {@link BaseUserDetailsService} into the subclass of - * {@link WebSecurityConfigurerAdapter}
  • - *
  • Override method {@code configure(HttpSecurity)} of {@link WebSecurityConfigurerAdapter}
  • - *
  • Add the {@link BaseUserDetailsService} to the {@code HttpSecurity} object.
  • - *
- * The following code snippet shows the above steps:
- * - *
- * @Configuration
- * @EnableWebSecurity
- * public class MyWebSecurityConfig extends WebSecurityConfigurerAdapter {
- *   // ...
- *   @Inject
- *   private UserDetailsService userDetailsService;
- *   // ...
- *   @Override
- *   public void configure(HttpSecurity http) throws Exception {
- *      http.userDetailsService(this.userDetailsService)... //add matchers and other stuff
- *   }
- * }
- * 
- * - *
- * For another example, have a look at {@link BaseWebSecurityConfig}. - */ -@Named -public class BaseUserDetailsService implements UserDetailsService { - - /** Logger instance. */ - private static final Logger LOG = LoggerFactory.getLogger(BaseUserDetailsService.class); - - private Usermanagement usermanagement; - - private AuthenticationManagerBuilder amBuilder; - - private AccessControlProvider accessControlProvider; - - private PrincipalAccessControlProvider principalAccessControlProvider; - - @Override - public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { - - UserProfile principal = retrievePrincipal(username); - Set authorities = getAuthorities(principal); - UserDetails user; - try { - // amBuilder uses the InMemoryUserDetailsManager, because it is configured in BaseWebSecurityConfig - user = getAmBuilder().getDefaultUserDetailsService().loadUserByUsername(username); - UserData userData = new UserData(user.getUsername(), user.getPassword(), authorities); - userData.setUserProfile(principal); - return userData; - } catch (Exception e) { - e.printStackTrace(); - UsernameNotFoundException exception = new UsernameNotFoundException("Authentication failed.", e); - LOG.warn("Failed to get user {}.", username, exception); - throw exception; - } - } - - /** - * Returns the {@link GrantedAuthority}s of the user associated with the provided {@link UserProfile}. - * - * @param principal the {@link UserProfile} of the user - * @return the associated {@link GrantedAuthority}s - * @throws AuthenticationException if no principal is retrievable for the given {@code username} - */ - protected Set getAuthorities(UserProfile principal) throws AuthenticationException { - - if (principal == null) { - LOG.warn("Principal must not be null."); - throw new IllegalArgumentException(); - } - // determine granted authorities for spring-security... - Set authorities = new HashSet<>(); - Collection accessControlIds = this.principalAccessControlProvider.getAccessControlIds(principal); - Set accessControlSet = new HashSet<>(); - for (String id : accessControlIds) { - boolean success = this.accessControlProvider.collectAccessControls(id, accessControlSet); - if (!success) { - LOG.warn("Undefined access control {}.", id); - } - } - for (AccessControl accessControl : accessControlSet) { - authorities.add(new AccessControlGrantedAuthority(accessControl)); - } - return authorities; - } - - /** - * @param username The {@code username} for which the {@code UserProfile} will be queried. - * @return An instance of type {@link UserProfile} obtained by querying the {@code username}. - */ - protected UserProfile retrievePrincipal(String username) { - - try { - return this.usermanagement.findUserProfileByLogin(username); - } catch (RuntimeException e) { - e.printStackTrace(); - UsernameNotFoundException exception = new UsernameNotFoundException("Authentication failed.", e); - LOG.warn("Failed to get user {}.", username, exception); - throw exception; - } - } - - /** - * @return usermanagement - */ - public Usermanagement getUsermanagement() { - - return this.usermanagement; - } - - /** - * @param usermanagement new value of {@link #getUsermanagement}. - */ - @Inject - public void setUsermanagement(Usermanagement usermanagement) { - - this.usermanagement = usermanagement; - } - - /** - * @return amBuilder - */ - public AuthenticationManagerBuilder getAmBuilder() { - - return this.amBuilder; - } - - /** - * @param amBuilder new value of {@link #getAmBuilder}. - */ - @Inject - public void setAmBuilder(AuthenticationManagerBuilder amBuilder) { - - this.amBuilder = amBuilder; - } - - /** - * @return accessControlProvider - */ - public AccessControlProvider getAccessControlProvider() { - - return this.accessControlProvider; - } - - /** - * @param accessControlProvider new value of {@link #getAccessControlProvider}. - */ - @Inject - public void setAccessControlProvider(AccessControlProvider accessControlProvider) { - - this.accessControlProvider = accessControlProvider; - } - - /** - * @return principalAccessControlProvider - */ - public PrincipalAccessControlProvider getPrincipalAccessControlProvider() { - - return this.principalAccessControlProvider; - } - - /** - * @param principalAccessControlProvider new value of {@link #getPrincipalAccessControlProvider}. - */ - @Inject - public void setPrincipalAccessControlProvider( - PrincipalAccessControlProvider principalAccessControlProvider) { - - this.principalAccessControlProvider = principalAccessControlProvider; - } -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/impl/security/CsrfRequestMatcher.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/impl/security/CsrfRequestMatcher.java deleted file mode 100644 index 9daa2dad9..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/impl/security/CsrfRequestMatcher.java +++ /dev/null @@ -1,55 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.common.impl.security; - -import java.util.regex.Pattern; - -import javax.servlet.http.HttpServletRequest; - -import org.springframework.security.web.util.matcher.RequestMatcher; - -/** - * This is the implementation of {@link RequestMatcher}, which decides which {@link HttpServletRequest Requests} require - * a correct CSRF token. - * - * @see Cross-site request forgery - * - */ -public class CsrfRequestMatcher implements RequestMatcher { - - private static final Pattern HTTP_METHOD_PATTERN = Pattern.compile("^GET$"); - - private static final String[] PATH_PREFIXES_WITHOUT_CSRF_PROTECTION = - { "/login", "/logout", "/services/rest/login", "/websocket" }; - - @Override - public boolean matches(HttpServletRequest request) { - - // GET requests are read-only and therefore do not need CSRF protection - if (HTTP_METHOD_PATTERN.matcher(request.getMethod()).matches()) { - - return false; - } - - // There are specific URLs which can not be protected from CSRF. For example, in case of the the login page, - // the CSRF token can only be accessed after a successful authentication ("login"). - String requestPath = getRequestPath(request); - for (String path : PATH_PREFIXES_WITHOUT_CSRF_PROTECTION) { - if (requestPath.startsWith(path)) { - return false; - } - } - - return true; - } - - private String getRequestPath(HttpServletRequest request) { - - String url = request.getServletPath(); - String pathInfo = request.getPathInfo(); - - if (pathInfo != null) { - url += pathInfo; - } - - return url; - } -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/impl/security/PrincipalAccessControlProviderImpl.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/impl/security/PrincipalAccessControlProviderImpl.java deleted file mode 100644 index fd1da2226..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/common/impl/security/PrincipalAccessControlProviderImpl.java +++ /dev/null @@ -1,37 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.common.impl.security; - -import java.util.Arrays; -import java.util.Collection; - -import javax.inject.Named; - -import io.oasp.gastronomy.restaurant.general.common.api.UserProfile; -import io.oasp.module.security.common.api.accesscontrol.PrincipalAccessControlProvider; - -/** - * The implementation of {@link PrincipalAccessControlProvider} for this sample application.
- * ATTENTION:
- * In reality you would typically receive the user-profile from the central identity-management (via LDAP) and the roles - * (and groups) from a central access manager (that might also implement the identify-management). This design was only - * chosen to keep our sample application simple. Otherwise one would have to start a separate external server - * application to make everything work what would be too complicated to get things running easily. - * - */ -@Named -public class PrincipalAccessControlProviderImpl implements PrincipalAccessControlProvider { - - /** - * The constructor. - */ - public PrincipalAccessControlProviderImpl() { - - super(); - } - - @Override - public Collection getAccessControlIds(UserProfile principal) { - - return Arrays.asList(principal.getRole().getName()); - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/dataaccess/api/ApplicationPersistenceEntity.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/dataaccess/api/ApplicationPersistenceEntity.java deleted file mode 100644 index 45979e32f..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/dataaccess/api/ApplicationPersistenceEntity.java +++ /dev/null @@ -1,108 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.dataaccess.api; - -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.MappedSuperclass; -import javax.persistence.Transient; -import javax.persistence.Version; - -import io.oasp.gastronomy.restaurant.general.common.api.ApplicationEntity; -import io.oasp.module.jpa.dataaccess.api.MutablePersistenceEntity; - -/** - * Abstract Entity for all Entities with an id and a version field. - * - */ -@MappedSuperclass -public abstract class ApplicationPersistenceEntity implements ApplicationEntity, MutablePersistenceEntity { - - private static final long serialVersionUID = 1L; - - /** @see #getId() */ - private Long id; - - /** @see #getModificationCounter() */ - private int modificationCounter; - - /** @see #getRevision() */ - private Number revision; - - /** - * The constructor. - */ - public ApplicationPersistenceEntity() { - - super(); - } - - @Override - @Id - @GeneratedValue(strategy = GenerationType.AUTO) - public Long getId() { - - return this.id; - } - - /** - * {@inheritDoc} - */ - @Override - public void setId(Long id) { - - this.id = id; - } - - @Override - @Version - public int getModificationCounter() { - - return this.modificationCounter; - } - - @Override - public void setModificationCounter(int version) { - - this.modificationCounter = version; - } - - @Override - @Transient - public Number getRevision() { - - return this.revision; - } - - /** - * @param revision the revision to set - */ - @Override - public void setRevision(Number revision) { - - this.revision = revision; - } - - @Override - public String toString() { - - StringBuilder buffer = new StringBuilder(); - toString(buffer); - return buffer.toString(); - } - - /** - * Method to extend {@link #toString()} logic. - * - * @param buffer is the {@link StringBuilder} where to {@link StringBuilder#append(Object) append} the string - * representation. - */ - protected void toString(StringBuilder buffer) { - - buffer.append(getClass().getSimpleName()); - if (this.id != null) { - buffer.append("[id="); - buffer.append(this.id); - buffer.append("]"); - } - } -} \ No newline at end of file diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/dataaccess/api/BinaryObjectEntity.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/dataaccess/api/BinaryObjectEntity.java deleted file mode 100644 index 33a70391f..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/dataaccess/api/BinaryObjectEntity.java +++ /dev/null @@ -1,82 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.dataaccess.api; - -import java.sql.Blob; - -import javax.persistence.Entity; -import javax.persistence.Lob; -import javax.persistence.Table; - -import io.oasp.gastronomy.restaurant.general.common.api.BinaryObject; - -/** - * {@link ApplicationPersistenceEntity Entity} for {@link BinaryObject}. Contains the actual {@link Blob}. - * - */ -@Entity -@Table(name = "BinaryObject") -public class BinaryObjectEntity extends ApplicationPersistenceEntity implements BinaryObject { - - private static final long serialVersionUID = 1L; - - private Blob data; - - private String mimeType; - - private long size; - - /** - * The constructor. - */ - public BinaryObjectEntity() { - - super(); - } - - @Override - public void setMimeType(String mimeType) { - - this.mimeType = mimeType; - - } - - @Override - public String getMimeType() { - - return this.mimeType; - } - - /** - * @return data - */ - - /** - * Remove the following line completely (Type Annotation) in case of database other than PostGres and Uncomment the - * annotation for @Lob - */ - // @Type(type = "org.hibernate.type.BinaryType") - @Lob - public Blob getData() { - - return this.data; - } - - /** - * @param data the data to set - */ - public void setData(Blob data) { - - this.data = data; - } - - @Override - public long getSize() { - - return this.size; - } - - @Override - public void setSize(long size) { - - this.size = size; - } -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/dataaccess/api/dao/ApplicationDao.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/dataaccess/api/dao/ApplicationDao.java deleted file mode 100644 index 0f735a81e..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/dataaccess/api/dao/ApplicationDao.java +++ /dev/null @@ -1,15 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.dataaccess.api.dao; - -import io.oasp.module.jpa.dataaccess.api.Dao; -import io.oasp.module.jpa.dataaccess.api.GenericRevisionedDao; -import io.oasp.module.jpa.dataaccess.api.MutablePersistenceEntity; - -/** - * Interface for all {@link GenericRevisionedDao DAOs} (Data Access Object) of this application. - * - * - * @param is the type of the managed entity. - */ -public interface ApplicationDao> extends Dao { - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/dataaccess/api/dao/ApplicationRevisionedDao.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/dataaccess/api/dao/ApplicationRevisionedDao.java deleted file mode 100644 index 1b7b35117..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/dataaccess/api/dao/ApplicationRevisionedDao.java +++ /dev/null @@ -1,16 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.dataaccess.api.dao; - -import io.oasp.module.jpa.dataaccess.api.GenericRevisionedDao; -import io.oasp.module.jpa.dataaccess.api.RevisionedDao; -import io.oasp.module.jpa.dataaccess.api.MutablePersistenceEntity; - -/** - * Interface for all {@link GenericRevisionedDao DAOs} (Data Access Object) of this application. - * - * - * @param is the type of the managed entity. - */ -public interface ApplicationRevisionedDao> extends - ApplicationDao, RevisionedDao { - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/dataaccess/api/dao/BinaryObjectDao.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/dataaccess/api/dao/BinaryObjectDao.java deleted file mode 100644 index fee2b77fe..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/dataaccess/api/dao/BinaryObjectDao.java +++ /dev/null @@ -1,11 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.dataaccess.api.dao; - -import io.oasp.gastronomy.restaurant.general.dataaccess.api.BinaryObjectEntity; - -/** - * {@link ApplicationDao Data Access Object} for {@link BinaryObjectEntity} entity. - * - */ -public interface BinaryObjectDao extends ApplicationDao { - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/dataaccess/base/DatabaseMigrator.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/dataaccess/base/DatabaseMigrator.java deleted file mode 100644 index aec498866..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/dataaccess/base/DatabaseMigrator.java +++ /dev/null @@ -1,113 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.dataaccess.base; - -import javax.sql.DataSource; - -import org.flywaydb.core.Flyway; - -/** - * Type to migrate the database. Gets initialized before hibernate. - * - */ -public class DatabaseMigrator { - - /** Path of test data location. */ - private static final String testDataPath = "classpath:db/test-data"; - - /** Path of master data location. */ - private static final String masterDataPath = "classpath:db/migration"; - - /** Property is true if database migration is enabled. */ - private boolean enabled; - - /** The JDBC data source. */ - private DataSource dataSource; - - /** Property is true if test data should be included in migration. */ - private boolean testdata; - - /** Property is true if database should be cleaned before migration. */ - private boolean clean; - - /** - * Migrate the database to the latest available migration. - */ - public void migrate() { - - if (this.enabled) { - final Flyway flyway = new Flyway(); - flyway.setDataSource(this.dataSource); - if (this.testdata) { - flyway.setLocations(masterDataPath, testDataPath); - } else { - flyway.setLocations(masterDataPath); - } - if (this.clean) { - flyway.clean(); - } - flyway.migrate(); - } - } - - /** - * Import test data. - * - * @param importTestDataPath path to directory with files with test data - */ - public void importTestData(String importTestDataPath) { - - final Flyway flyway = new Flyway(); - flyway.setDataSource(this.dataSource); - flyway.setLocations(importTestDataPath); - flyway.setIgnoreMissingMigrations(true); - flyway.migrate(); - } - - /** - * @return enabled - */ - public boolean isEnabled() { - - return this.enabled; - } - - /** - * @param enabled the enabled to set - */ - public void setEnabled(boolean enabled) { - - this.enabled = enabled; - } - - /** - * @return datasource - */ - public DataSource getDataSource() { - - return this.dataSource; - } - - /** - * @param datasource the datasource to set - */ - public void setDataSource(DataSource datasource) { - - this.dataSource = datasource; - } - - /** - * @param testdata the testdata to set - */ - public void setTestdata(boolean testdata) { - - this.testdata = testdata; - } - - /** - * @param clean the clean to set - */ - public void setClean(boolean clean) { - - this.clean = clean; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/dataaccess/base/MoneyAttributeConverter.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/dataaccess/base/MoneyAttributeConverter.java deleted file mode 100644 index e3ce5020a..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/dataaccess/base/MoneyAttributeConverter.java +++ /dev/null @@ -1,44 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.dataaccess.base; - -import io.oasp.gastronomy.restaurant.general.common.api.datatype.Money; - -import java.math.BigDecimal; - -import javax.persistence.AttributeConverter; -import javax.persistence.Converter; - -/** - * This is the {@link AttributeConverter} to allow that JPA vendors can persist instances of {@link Money} if used in - * {@link io.oasp.gastronomy.restaurant.general.common.api.ApplicationEntity entities}. - * - */ -@Converter(autoApply = true) -public class MoneyAttributeConverter implements AttributeConverter { - - /** - * The constructor. - */ - public MoneyAttributeConverter() { - - super(); - } - - @Override - public BigDecimal convertToDatabaseColumn(Money attribute) { - - if (attribute == null) { - return null; - } - return attribute.getValue(); - } - - @Override - public Money convertToEntityAttribute(BigDecimal dbData) { - - if (dbData == null) { - return null; - } - return new Money(dbData); - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/dataaccess/base/dao/ApplicationDaoImpl.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/dataaccess/base/dao/ApplicationDaoImpl.java deleted file mode 100644 index 2fdd14198..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/dataaccess/base/dao/ApplicationDaoImpl.java +++ /dev/null @@ -1,27 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.dataaccess.base.dao; - -import io.oasp.gastronomy.restaurant.general.dataaccess.api.dao.ApplicationDao; -import io.oasp.module.jpa.dataaccess.api.MutablePersistenceEntity; -import io.oasp.module.jpa.dataaccess.base.AbstractRevisionedDao; - -import org.springframework.stereotype.Repository; - -/** - * This is the abstract base implementation of {@link ApplicationDao}. - * - * @param is the {@link #getEntityClass() type} of the managed entity. - * - */ -@Repository -public abstract class ApplicationDaoImpl> extends - AbstractRevisionedDao implements ApplicationDao { - - /** - * The constructor. - */ - public ApplicationDaoImpl() { - - super(); - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/dataaccess/base/dao/ApplicationMasterDataDaoImpl.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/dataaccess/base/dao/ApplicationMasterDataDaoImpl.java deleted file mode 100644 index 035e436d1..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/dataaccess/base/dao/ApplicationMasterDataDaoImpl.java +++ /dev/null @@ -1,31 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.dataaccess.base.dao; - -import java.util.List; - -import io.oasp.module.jpa.dataaccess.api.MutablePersistenceEntity; -import io.oasp.module.jpa.dataaccess.api.RevisionedMasterDataDao; - -/** - * This is the abstract base implementation of {@link RevisionedMasterDataDao} based on {@link ApplicationDaoImpl}. - * - * @param is the {@link #getEntityClass() type} of the managed entity. - * - */ -public abstract class ApplicationMasterDataDaoImpl> - extends ApplicationDaoImpl implements RevisionedMasterDataDao { - - /** - * The constructor. - */ - public ApplicationMasterDataDaoImpl() { - - super(); - } - - @Override - public List findAll() { - - return super.findAll(); - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/dataaccess/base/dao/BinaryObjectDaoImpl.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/dataaccess/base/dao/BinaryObjectDaoImpl.java deleted file mode 100644 index 62f62f4b9..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/dataaccess/base/dao/BinaryObjectDaoImpl.java +++ /dev/null @@ -1,21 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.dataaccess.base.dao; - -import io.oasp.gastronomy.restaurant.general.dataaccess.api.BinaryObjectEntity; -import io.oasp.gastronomy.restaurant.general.dataaccess.api.dao.BinaryObjectDao; - -import javax.inject.Named; - -/** - * Implementation of {@link BinaryObjectDao}. - * - */ -@Named -public class BinaryObjectDaoImpl extends ApplicationDaoImpl implements BinaryObjectDao { - - @Override - public Class getEntityClass() { - - return BinaryObjectEntity.class; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/gui/api/LoginController.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/gui/api/LoginController.java deleted file mode 100644 index 4f76b5db9..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/gui/api/LoginController.java +++ /dev/null @@ -1,58 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.gui.api; - -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.servlet.ModelAndView; - -/** - * Controller for Login-Page. - * - */ -@Controller -public class LoginController { - - /** - * Default URL to redirect to after successfully login. - */ - public final static String defaultTargetUrl = "/"; - - /** - * Builds the model for the login page---mainly focusing on the error message handling. - * - * @param authentication_failed flag for authentication failed - * @param invalid_session flag for invalid session - * @param access_denied flag for access denied - * @param logout flag for successful logout - * @return the view model - */ - @RequestMapping(value = "/login**", method = RequestMethod.GET) - public ModelAndView login( - @RequestParam(value = "authentication_failed", required = false) boolean authentication_failed, - @RequestParam(value = "invalid_session", required = false) boolean invalid_session, - @RequestParam(value = "access_denied", required = false) boolean access_denied, - @RequestParam(value = "logout", required = false) boolean logout) { - - final Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); - if (!authentication.getPrincipal().equals("anonymousUser")) { - return new ModelAndView("redirect:" + defaultTargetUrl); - } - - ModelAndView model = new ModelAndView(); - if (authentication_failed) { - model.addObject("error", "Authentication failed!"); - } else if (invalid_session) { - model.addObject("error", "You are currently not logged in!"); - } else if (access_denied) { - model.addObject("error", "You have insufficient permissions to access this page!"); - } else if (logout) { - model.addObject("msg", "Logout successful!"); - } - - return model; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/logic/api/UseCase.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/logic/api/UseCase.java deleted file mode 100644 index 0ebf31d33..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/logic/api/UseCase.java +++ /dev/null @@ -1,20 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.logic.api; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -import javax.inject.Qualifier; - -/** - * This is a {@link Qualifier} to mark all use-cases. In your use-case implementation add the annotations - * {@link javax.inject.Named} and {@link UseCase}. In your component facade implementation add the annotations - * {@link javax.inject.Inject} and {@link UseCase} to the setters in order to inject your use case implementations. - * - */ -@Documented -@Retention(RetentionPolicy.RUNTIME) -@Qualifier -public @interface UseCase { - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/logic/api/to/BinaryObjectEto.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/logic/api/to/BinaryObjectEto.java deleted file mode 100644 index ca49e375f..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/logic/api/to/BinaryObjectEto.java +++ /dev/null @@ -1,51 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.logic.api.to; - -import io.oasp.gastronomy.restaurant.general.common.api.BinaryObject; -import io.oasp.module.basic.common.api.to.AbstractEto; - -/** - * The {@link io.oasp.module.basic.common.api.to.AbstractEto ETO} for a {@link BinaryObject}. - * - */ -public class BinaryObjectEto extends AbstractEto implements BinaryObject { - - private static final long serialVersionUID = 1L; - - private String mimeType; - - private long size; - - /** - * Constructor. - */ - public BinaryObjectEto() { - - super(); - } - - @Override - public void setMimeType(String mimeType) { - - this.mimeType = mimeType; - - } - - @Override - public String getMimeType() { - - return this.mimeType; - } - - @Override - public long getSize() { - - return this.size; - } - - @Override - public void setSize(long size) { - - this.size = size; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/logic/base/AbstractComponentFacade.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/logic/base/AbstractComponentFacade.java deleted file mode 100644 index 44fe41611..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/logic/base/AbstractComponentFacade.java +++ /dev/null @@ -1,15 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.logic.base; - -/** - * Abstract base class for any logic implementation class in this application that directly implements Uc - */ -public abstract class AbstractComponentFacade extends AbstractGenericEntityUtils { - /** - * The constructor. - */ - public AbstractComponentFacade() { - - super(); - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/logic/base/AbstractGenericEntityUtils.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/logic/base/AbstractGenericEntityUtils.java deleted file mode 100644 index ea45aedc2..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/logic/base/AbstractGenericEntityUtils.java +++ /dev/null @@ -1,99 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.logic.base; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import net.sf.mmm.util.entity.api.GenericEntity; -import net.sf.mmm.util.entity.api.PersistenceEntity; -import net.sf.mmm.util.transferobject.api.AbstractTransferObject; -import net.sf.mmm.util.transferobject.api.TransferObject; - -import io.oasp.gastronomy.restaurant.general.common.base.AbstractBeanMapperSupport; -import io.oasp.module.jpa.common.api.to.PaginatedListTo; - -/** - * Common code utilities for both AbstractUc and AbstractComponentFacade - * - */ -public class AbstractGenericEntityUtils extends AbstractBeanMapperSupport { - /** - * - * The limit for {@link net.sf.mmm.util.search.base.AbstractSearchCriteria#getMaximumHitCount() maximum hit count} for - * UI requests. - */ - protected static final int MAXIMUM_HIT_LIMIT = 500; - - /** - * Maps a {@link PaginatedListTo paginated list} of persistent entities to a {@link PaginatedListTo paginated list} of - * transfer objects. - * - * @param is the generic type of the {@link AbstractTransferObject transfer object}. - * @param is the generic type of the {@link PersistenceEntity entity}. - * @param paginatedList is the paginated list to map from. - * @param klass is the target class to map the paginated entities to. - * @return a {@link PaginatedListTo paginated list of entity transfer objects}. - */ - protected > PaginatedListTo mapPaginatedEntityList( - PaginatedListTo paginatedList, Class klass) { - - List etoList = getBeanMapper().mapList(paginatedList.getResult(), klass); - PaginatedListTo result = new PaginatedListTo<>(etoList, paginatedList.getPagination()); - - return result; - } - - /** - * Creates a {@link Map} with all {@link GenericEntity entities} from the given {@link Collection} using their - * {@link GenericEntity#getId() ID} as key. All {@link GenericEntity entities} without an {@link GenericEntity#getId() - * ID} ({@code null}) will be ignored. - * - * @param is the generic type of the {@link GenericEntity#getId() ID}. - * @param is the generic type of the {@link GenericEntity entity}. - * @param entities is the {@link Collection} of {@link GenericEntity entities}. - * @return a {@link Map} mapping from {@link GenericEntity#getId() ID} to {@link GenericEntity entity}. - */ - protected static > Map getEntityMap(Collection entities) { - - Map id2EntityMap = new HashMap<>(); - for (E entity : entities) { - ID id = entity.getId(); - if (id != null) { - id2EntityMap.put(id, entity); - } - } - return id2EntityMap; - } - - /** - * Determines the {@link GenericEntity entities} to delete if currentList is the current list from the - * persistence and listToSave is the new list that shall be saved. In other words this method selects the - * {@link GenericEntity entities} from currentList that are not contained in listToSave. - * - * @param is the generic type of the {@link GenericEntity#getId() ID}. - * @param is the generic type of the {@link GenericEntity entity}. - * @param currentEntities is the {@link Collection} of the {@link GenericEntity entities} currently persisted. We - * assume that all objects in this list have an {@link GenericEntity#getId() ID} value (that is not - * {@code null}). - * @param entitiesToSave is the {@link Collection} that contains the {@link GenericEntity entities} that shall be - * saved. It may contain {@link GenericEntity entities} that have no {@link GenericEntity#getId() ID} that - * shall be newly created. - * @return the {@link List} with the {@link GenericEntity entities} to delete. - */ - protected static > List getEntities2Delete(Collection currentEntities, - Collection entitiesToSave) { - - List result = new ArrayList<>(currentEntities.size()); - Map entityMap = getEntityMap(entitiesToSave); - for (E entity : currentEntities) { - if (!entityMap.containsKey(entity.getId())) { - // entity from currentList is not contained in listToSave... - result.add(entity); - } - } - return result; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/logic/base/AbstractUc.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/logic/base/AbstractUc.java deleted file mode 100644 index a823a4529..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/logic/base/AbstractUc.java +++ /dev/null @@ -1,18 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.logic.base; - -/** - * Abstract base class for any use case in this application. Actual implementations need to be annotated with - * {@link javax.inject.Named} and {@link io.oasp.gastronomy.restaurant.general.logic.api.UseCase}. - * - */ -public abstract class AbstractUc extends AbstractGenericEntityUtils { - - /** - * The constructor. - */ - public AbstractUc() { - - super(); - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/logic/base/UcManageBinaryObject.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/logic/base/UcManageBinaryObject.java deleted file mode 100644 index deaf2cd03..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/logic/base/UcManageBinaryObject.java +++ /dev/null @@ -1,37 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.logic.base; - -import io.oasp.gastronomy.restaurant.general.logic.api.to.BinaryObjectEto; - -import java.sql.Blob; - -/** - * Use case for managing BinaryObject. - * - */ -public interface UcManageBinaryObject { - - /** - * @param data the Blob data to save - * @param binaryObjectEto the {@link BinaryObjectEto} - * @return {@link BinaryObjectEto} - */ - BinaryObjectEto saveBinaryObject(Blob data, BinaryObjectEto binaryObjectEto); - - /** - * @param binaryObjectId the ID of the {@link BinaryObjectEto} that should be deleted - */ - void deleteBinaryObject(Long binaryObjectId); - - /** - * @param binaryObjectId the ID of the {@link BinaryObjectEto} to find - * @return {@link BinaryObjectEto} - */ - BinaryObjectEto findBinaryObject(Long binaryObjectId); - - /** - * @param binaryObjectId the ID of the {@link BinaryObjectEto} the blob corresponds to - * @return {@link Blob} - */ - Blob getBinaryObjectBlob(Long binaryObjectId); - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/logic/impl/UcManageBinaryObjectImpl.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/logic/impl/UcManageBinaryObjectImpl.java deleted file mode 100644 index 50999e63d..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/logic/impl/UcManageBinaryObjectImpl.java +++ /dev/null @@ -1,69 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.logic.impl; - -import io.oasp.gastronomy.restaurant.general.dataaccess.api.BinaryObjectEntity; -import io.oasp.gastronomy.restaurant.general.dataaccess.api.dao.BinaryObjectDao; -import io.oasp.gastronomy.restaurant.general.logic.api.to.BinaryObjectEto; -import io.oasp.gastronomy.restaurant.general.logic.base.AbstractUc; -import io.oasp.gastronomy.restaurant.general.logic.base.UcManageBinaryObject; - -import java.sql.Blob; - -import javax.inject.Inject; -import javax.inject.Named; - -/** - * Implementation of the {@link UcManageBinaryObject} intreface. - * - */ -@Named -public class UcManageBinaryObjectImpl extends AbstractUc implements UcManageBinaryObject { - - /** @see #binaryObjectDao */ - private BinaryObjectDao binaryObjectDao; - - /** - * @return binaryObjectDao - */ - public BinaryObjectDao binaryObjectDao() { - - return this.binaryObjectDao; - } - - /** - * @param binaryObjectDao the binaryObjectDao to set - */ - @Inject - public void setBinaryObjectDao(BinaryObjectDao binaryObjectDao) { - - this.binaryObjectDao = binaryObjectDao; - } - - @Override - public BinaryObjectEto saveBinaryObject(Blob data, BinaryObjectEto binaryObjectEto) { - - BinaryObjectEntity binaryObjectEntity = getBeanMapper().map(binaryObjectEto, BinaryObjectEntity.class); - binaryObjectEntity.setData(data); - this.binaryObjectDao.save(binaryObjectEntity); - return getBeanMapper().map(binaryObjectEntity, BinaryObjectEto.class); - } - - @Override - public void deleteBinaryObject(Long binaryObjectId) { - - this.binaryObjectDao.delete(binaryObjectId); - - } - - @Override - public BinaryObjectEto findBinaryObject(Long binaryObjectId) { - - return getBeanMapper().map(this.binaryObjectDao.findOne(binaryObjectId), BinaryObjectEto.class); - } - - @Override - public Blob getBinaryObjectBlob(Long binaryObjectId) { - - return this.binaryObjectDao.findOne(binaryObjectId).getData(); - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/logic/impl/config/DefaultRolesPrefixPostProcessor.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/logic/impl/config/DefaultRolesPrefixPostProcessor.java deleted file mode 100644 index 98c20beca..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/logic/impl/config/DefaultRolesPrefixPostProcessor.java +++ /dev/null @@ -1,61 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.logic.impl.config; - -import org.springframework.beans.BeansException; -import org.springframework.beans.factory.config.BeanPostProcessor; -import org.springframework.core.PriorityOrdered; -import org.springframework.security.access.annotation.Jsr250MethodSecurityMetadataSource; -import org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler; -import org.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandler; -import org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter; - -/** - * This is an implementation of {@link BeanPostProcessor} that allows to change the role prefix of spring-security. By - * default spring-security is magically adding a strange prefix called "ROLE_" to your granted authorities. In order to - * prevent this we use this class with an empty prefix. - */ -public class DefaultRolesPrefixPostProcessor implements BeanPostProcessor, PriorityOrdered { - - private final String rolePrefix; - - /** - * Der Konstruktor. - * - * @param rolePrefix das gewünschte Rollen-Präfix (z.B. der leere String). - */ - public DefaultRolesPrefixPostProcessor(String rolePrefix) { - super(); - this.rolePrefix = rolePrefix; - } - - @Override - public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { - - // remove this if you are not using JSR-250 - if (bean instanceof Jsr250MethodSecurityMetadataSource) { - ((Jsr250MethodSecurityMetadataSource) bean).setDefaultRolePrefix(this.rolePrefix); - } - - if (bean instanceof DefaultMethodSecurityExpressionHandler) { - ((DefaultMethodSecurityExpressionHandler) bean).setDefaultRolePrefix(this.rolePrefix); - } - if (bean instanceof DefaultWebSecurityExpressionHandler) { - ((DefaultWebSecurityExpressionHandler) bean).setDefaultRolePrefix(this.rolePrefix); - } - if (bean instanceof SecurityContextHolderAwareRequestFilter) { - ((SecurityContextHolderAwareRequestFilter) bean).setRolePrefix(this.rolePrefix); - } - return bean; - } - - @Override - public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { - - return bean; - } - - @Override - public int getOrder() { - - return PriorityOrdered.HIGHEST_PRECEDENCE; - } -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/service/impl/config/BaseWebSecurityConfig.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/service/impl/config/BaseWebSecurityConfig.java deleted file mode 100644 index 35fa3dedb..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/service/impl/config/BaseWebSecurityConfig.java +++ /dev/null @@ -1,141 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.service.impl.config; - -import javax.inject.Inject; -import javax.servlet.Filter; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; -import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler; -import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler; -import org.springframework.security.web.authentication.logout.LogoutFilter; -import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler; -import org.springframework.security.web.authentication.www.BasicAuthenticationFilter; -import org.springframework.security.web.csrf.CsrfFilter; -import org.springframework.security.web.util.matcher.AntPathRequestMatcher; -import org.springframework.web.cors.CorsConfiguration; -import org.springframework.web.cors.UrlBasedCorsConfigurationSource; -import org.springframework.web.filter.CorsFilter; - -import io.oasp.gastronomy.restaurant.general.common.impl.security.CsrfRequestMatcher; -import io.oasp.module.security.common.impl.rest.AuthenticationSuccessHandlerSendingOkHttpStatusCode; -import io.oasp.module.security.common.impl.rest.JsonUsernamePasswordAuthenticationFilter; -import io.oasp.module.security.common.impl.rest.LogoutSuccessHandlerReturningOkHttpStatusCode; - -/** - * This type serves as a base class for extensions of the {@code WebSecurityConfigurerAdapter} and provides a default - * configuration.
- * Security configuration is based on {@link WebSecurityConfigurerAdapter}. This configuration is by purpose designed - * most simple for two channels of authentication: simple login form and rest-url. - */ -public abstract class BaseWebSecurityConfig extends WebSecurityConfigurerAdapter { - - @Value("${security.cors.enabled}") - boolean corsEnabled = false; - - @Inject - private UserDetailsService userDetailsService; - - private CorsFilter getCorsFilter() { - - UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); - CorsConfiguration config = new CorsConfiguration(); - config.setAllowCredentials(true); - config.addAllowedOrigin("*"); - config.addAllowedHeader("*"); - config.addAllowedMethod("OPTIONS"); - config.addAllowedMethod("HEAD"); - config.addAllowedMethod("GET"); - config.addAllowedMethod("PUT"); - config.addAllowedMethod("POST"); - config.addAllowedMethod("DELETE"); - config.addAllowedMethod("PATCH"); - source.registerCorsConfiguration("/**", config); - return new CorsFilter(source); - } - - /** - * Configure spring security to enable a simple webform-login + a simple rest login. - */ - @Override - public void configure(HttpSecurity http) throws Exception { - - String[] unsecuredResources = - new String[] { "/login", "/security/**", "/services/rest/login", "/services/rest/logout" }; - - http - // - .userDetailsService(this.userDetailsService) - // define all urls that are not to be secured - .authorizeRequests().antMatchers(unsecuredResources).permitAll().anyRequest().authenticated().and() - - // activate crsf check for a selection of urls (but not for login & logout) - .csrf().requireCsrfProtectionMatcher(new CsrfRequestMatcher()).and() - - // configure parameters for simple form login (and logout) - .formLogin().successHandler(new SimpleUrlAuthenticationSuccessHandler()).defaultSuccessUrl("/") - .failureUrl("/login.html?error").loginProcessingUrl("/j_spring_security_login").usernameParameter("username") - .passwordParameter("password").and() - // logout via POST is possible - .logout().logoutSuccessUrl("/login.html").and() - - // register login and logout filter that handles rest logins - .addFilterAfter(getSimpleRestAuthenticationFilter(), BasicAuthenticationFilter.class) - .addFilterAfter(getSimpleRestLogoutFilter(), LogoutFilter.class); - - if (this.corsEnabled) { - http.addFilterBefore(getCorsFilter(), CsrfFilter.class); - } - } - - /** - * Create a simple filter that allows logout on a REST Url /services/rest/logout and returns a simple HTTP status 200 - * ok. - * - * @return the filter. - */ - protected Filter getSimpleRestLogoutFilter() { - - LogoutFilter logoutFilter = - new LogoutFilter(new LogoutSuccessHandlerReturningOkHttpStatusCode(), new SecurityContextLogoutHandler()); - - // configure logout for rest logouts - logoutFilter.setLogoutRequestMatcher(new AntPathRequestMatcher("/services/rest/logout")); - - return logoutFilter; - } - - /** - * Create a simple authentication filter for REST logins that reads user-credentials from a json-parameter and returns - * status 200 instead of redirect after login. - * - * @return the {@link JsonUsernamePasswordAuthenticationFilter}. - * @throws Exception if something goes wrong. - */ - protected JsonUsernamePasswordAuthenticationFilter getSimpleRestAuthenticationFilter() throws Exception { - - JsonUsernamePasswordAuthenticationFilter jsonFilter = - new JsonUsernamePasswordAuthenticationFilter(new AntPathRequestMatcher("/services/rest/login")); - jsonFilter.setPasswordParameter("j_password"); - jsonFilter.setUsernameParameter("j_username"); - jsonFilter.setAuthenticationManager(authenticationManager()); - // set failurehandler that uses no redirect in case of login failure; just HTTP-status: 401 - jsonFilter.setAuthenticationManager(authenticationManagerBean()); - jsonFilter.setAuthenticationFailureHandler(new SimpleUrlAuthenticationFailureHandler()); - // set successhandler that uses no redirect in case of login success; just HTTP-status: 200 - jsonFilter.setAuthenticationSuccessHandler(new AuthenticationSuccessHandlerSendingOkHttpStatusCode()); - return jsonFilter; - } - - @SuppressWarnings("javadoc") - @Inject - public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { - - auth.inMemoryAuthentication().withUser("waiter").password("waiter").roles("Waiter").and().withUser("cook") - .password("cook").roles("Cook").and().withUser("barkeeper").password("barkeeper").roles("Barkeeper").and() - .withUser("chief").password("chief").roles("Chief"); - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/service/impl/config/ServletInitializer.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/service/impl/config/ServletInitializer.java deleted file mode 100644 index 992193dd0..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/service/impl/config/ServletInitializer.java +++ /dev/null @@ -1,23 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.service.impl.config; - -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.boot.web.support.SpringBootServletInitializer; -import org.springframework.context.annotation.Configuration; - -import io.oasp.gastronomy.restaurant.SpringBootApp; - -/** - * This auto configuration will be used by spring boot to enable traditional deployment to a servlet container. You may - * remove this class if you run your application with embedded tomcat only. Tomcat startup will be twice as fast. - */ -@Configuration -@EnableAutoConfiguration -public class ServletInitializer extends SpringBootServletInitializer { - - @Override - protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { - - return application.sources(SpringBootApp.class); - } -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/service/impl/config/WebConfig.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/service/impl/config/WebConfig.java deleted file mode 100644 index 50f35d29a..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/service/impl/config/WebConfig.java +++ /dev/null @@ -1,92 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.service.impl.config; - -import javax.servlet.Filter; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.config.AutowireCapableBeanFactory; -import org.springframework.boot.web.servlet.FilterRegistrationBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.filter.CharacterEncodingFilter; - -import io.oasp.module.logging.common.api.DiagnosticContextFacade; -import io.oasp.module.logging.common.impl.DiagnosticContextFacadeImpl; -import io.oasp.module.logging.common.impl.DiagnosticContextFilter; -import io.oasp.module.logging.common.impl.PerformanceLogFilter; - -import io.oasp.module.logging.common.api.DiagnosticContextFacade; -import io.oasp.module.logging.common.impl.DiagnosticContextFacadeImpl; -import io.oasp.module.logging.common.impl.DiagnosticContextFilter; -import io.oasp.module.logging.common.impl.PerformanceLogFilter; -import io.oasp.module.service.common.api.constants.ServiceConstants; - -/** - * Registers a number of filters for web requests. - * - */ -@Configuration -public class WebConfig { - - private @Autowired AutowireCapableBeanFactory beanFactory; - - /** - * Register PerformanceLogFilter to log running time of requests. - * - * @return filter - */ - @Bean - public FilterRegistrationBean performanceLogFilter() { - - FilterRegistrationBean registration = new FilterRegistrationBean(); - Filter performanceLogFilter = new PerformanceLogFilter(); - this.beanFactory.autowireBean(performanceLogFilter); - registration.setFilter(performanceLogFilter); - registration.addUrlPatterns("/*"); - return registration; - } - - /** - * Bean definition for DiagnosticContextFacade. - * - * @return DiagnosticContextFacade - */ - @Bean(name = "DiagnosticContextFacade") - public DiagnosticContextFacade diagnosticContextFacade() { - - return new DiagnosticContextFacadeImpl(); - } - - /** - * Register DiagnosticContextFilter to log service calls with correlation id. - * - * @return filter - */ - @Bean - public FilterRegistrationBean diagnosticContextFilter() { - - FilterRegistrationBean registration = new FilterRegistrationBean(); - Filter diagnosticContextFilter = new DiagnosticContextFilter(); - this.beanFactory.autowireBean(diagnosticContextFilter); - registration.setFilter(diagnosticContextFilter); - registration.addUrlPatterns(ServiceConstants.URL_PATH_SERVICES + "/*"); - return registration; - } - - /** - * Register SetCharacterEncodingFilter to convert specical characters correctly. - * - * @return filter - */ - @Bean - public FilterRegistrationBean setCharacterEncodingFilter() { - - FilterRegistrationBean registration = new FilterRegistrationBean(); - CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter(); - characterEncodingFilter.setEncoding("UTF-8"); - characterEncodingFilter.setForceEncoding(false); - this.beanFactory.autowireBean(characterEncodingFilter); - registration.setFilter(characterEncodingFilter); - registration.addUrlPatterns("/*"); - return registration; - } -} \ No newline at end of file diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/service/impl/config/WebSecurityBeansConfig.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/service/impl/config/WebSecurityBeansConfig.java deleted file mode 100644 index e2e26ef18..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/service/impl/config/WebSecurityBeansConfig.java +++ /dev/null @@ -1,66 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.service.impl.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.web.csrf.CsrfTokenRepository; -import org.springframework.security.web.csrf.HttpSessionCsrfTokenRepository; - -import io.oasp.gastronomy.restaurant.general.logic.impl.config.DefaultRolesPrefixPostProcessor; -import io.oasp.module.security.common.api.accesscontrol.AccessControlProvider; -import io.oasp.module.security.common.base.accesscontrol.AccessControlSchemaProvider; -import io.oasp.module.security.common.impl.accesscontrol.AccessControlProviderImpl; -import io.oasp.module.security.common.impl.accesscontrol.AccessControlSchemaProviderImpl; - -/** - * This configuration class provides factory methods for several Spring security related beans. - * - */ -@Configuration -public class WebSecurityBeansConfig { - - /** - * This method provides a new instance of {@code AccessControlProvider} - * - * @return the newly created {@code AccessControlProvider} - */ - @Bean - public AccessControlProvider accessControlProvider() { - - return new AccessControlProviderImpl(); - } - - /** - * This method provides a new instance of {@code AccessControlSchemaProvider} - * - * @return the newly created {@code AccessControlSchemaProvider} - */ - @Bean - public AccessControlSchemaProvider accessControlSchemaProvider() { - - return new AccessControlSchemaProviderImpl(); - } - - /** - * This method provides a new instance of {@code CsrfTokenRepository} - * - * @return the newly created {@code CsrfTokenRepository} - */ - @Bean - public CsrfTokenRepository csrfTokenRepository() { - - return new HttpSessionCsrfTokenRepository(); - } - - /** - * This method provides a new instance of {@code DefaultRolesPrefixPostProcessor} - * - * @return the newly create {@code DefaultRolesPrefixPostProcessor} - */ - @Bean - public static DefaultRolesPrefixPostProcessor defaultRolesPrefixPostProcessor() { - - // By default Spring-Security is setting the prefix "ROLE_" for all permissions/authorities. - // We disable this undesired behavior here... - return new DefaultRolesPrefixPostProcessor(""); - } -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/service/impl/config/WebSecurityConfig.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/service/impl/config/WebSecurityConfig.java deleted file mode 100644 index 4fb69ff06..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/service/impl/config/WebSecurityConfig.java +++ /dev/null @@ -1,21 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.service.impl.config; - -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Profile; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; - -import io.oasp.module.basic.common.api.config.SpringProfileConstants; - -/** - * Security configuration based on {@link WebSecurityConfigurerAdapter}. This configuration is by purpose designed most - * simple for two channels of authentication: simple login form and rest-url. (Copied from - * {@link io.oasp.gastronomy.restaurant.general.service.impl.config.BaseWebSecurityConfig} - * - */ -@Configuration -@EnableWebSecurity -@Profile(SpringProfileConstants.NOT_JUNIT) -public class WebSecurityConfig extends BaseWebSecurityConfig { - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/service/impl/rest/ApplicationAccessDeniedHandler.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/service/impl/rest/ApplicationAccessDeniedHandler.java deleted file mode 100644 index 7ba0bdcc9..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/service/impl/rest/ApplicationAccessDeniedHandler.java +++ /dev/null @@ -1,46 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.service.impl.rest; - -import io.oasp.module.rest.service.impl.RestServiceExceptionFacade; - -import java.io.IOException; - -import javax.inject.Inject; -import javax.inject.Named; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.ws.rs.core.Response; - -import org.springframework.security.access.AccessDeniedException; -import org.springframework.security.web.access.AccessDeniedHandler; - -/** - * - */ -@Named("ApplicationAccessDeniedHandler") -public class ApplicationAccessDeniedHandler implements AccessDeniedHandler { - - private RestServiceExceptionFacade exceptionFacade; - - @Override - public void handle(HttpServletRequest request, HttpServletResponse response, - AccessDeniedException accessDeniedException) throws IOException, ServletException { - - Response restResponse = this.exceptionFacade.toResponse(accessDeniedException); - Object entity = restResponse.getEntity(); - response.setStatus(restResponse.getStatus()); - if (entity != null) { - response.getWriter().write(entity.toString()); - } - } - - /** - * @param exceptionFacade the exceptionFacade to set - */ - @Inject - public void setExceptionFacade(RestServiceExceptionFacade exceptionFacade) { - - this.exceptionFacade = exceptionFacade; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/service/impl/rest/ApplicationObjectMapperFactory.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/service/impl/rest/ApplicationObjectMapperFactory.java deleted file mode 100644 index 818162c2f..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/service/impl/rest/ApplicationObjectMapperFactory.java +++ /dev/null @@ -1,47 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.service.impl.rest; - -import javax.inject.Named; - -import com.fasterxml.jackson.databind.jsontype.NamedType; -import com.fasterxml.jackson.databind.module.SimpleModule; - -// BEGIN ARCHETYPE SKIP -import io.oasp.gastronomy.restaurant.general.common.api.datatype.Money; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.DrinkEto; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.MealEto; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.ProductEto; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.SideDishEto; -// END ARCHETYPE SKIP -import io.oasp.module.json.common.base.ObjectMapperFactory; - -/** - * The MappingFactory class to resolve polymorphic conflicts within the restaurant application. - */ -@Named("ApplicationObjectMapperFactory") -public class ApplicationObjectMapperFactory extends ObjectMapperFactory { - - /** - * The constructor. - */ - public ApplicationObjectMapperFactory() { - - super(); - // register polymorphic base classes - // BEGIN ARCHETYPE SKIP - setBaseClasses(ProductEto.class); - // END ARCHETYPE SKIP - - NamedType[] subtypes; - // register mapping for polymorphic sub-classes - // BEGIN ARCHETYPE SKIP - subtypes = new NamedType[] { new NamedType(MealEto.class, "Meal"), new NamedType(DrinkEto.class, "Drink"), - new NamedType(SideDishEto.class, "SideDish") }; - setSubtypes(subtypes); - - // register (de)serializers for custom datatypes - SimpleModule module = getExtensionModule(); - module.addDeserializer(Money.class, new MoneyJsonDeserializer()); - module.addSerializer(Money.class, new MoneyJsonSerializer()); - // END ARCHETYPE SKIP - } -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/service/impl/rest/MoneyJsonDeserializer.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/service/impl/rest/MoneyJsonDeserializer.java deleted file mode 100644 index d0980d515..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/service/impl/rest/MoneyJsonDeserializer.java +++ /dev/null @@ -1,29 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.service.impl.rest; - -import io.oasp.gastronomy.restaurant.general.common.api.datatype.Money; - -import java.io.IOException; -import java.math.BigDecimal; - -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; - -/** - * The {@link JsonDeserializer JSON deserializer} for {@link Money}. - * - */ -public final class MoneyJsonDeserializer extends JsonDeserializer { - - @Override - public Money deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException { - - BigDecimal value = jp.readValueAs(BigDecimal.class); - if (value == null) { - return null; - } else { - return new Money(value); - } - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/service/impl/rest/MoneyJsonSerializer.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/service/impl/rest/MoneyJsonSerializer.java deleted file mode 100644 index 6a69a6e11..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/service/impl/rest/MoneyJsonSerializer.java +++ /dev/null @@ -1,24 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.service.impl.rest; - -import io.oasp.gastronomy.restaurant.general.common.api.datatype.Money; - -import java.io.IOException; - -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.SerializerProvider; - -/** - * The {@link JsonSerializer} for {@link Money}. - * - */ -public final class MoneyJsonSerializer extends JsonSerializer { - - @Override - public void serialize(Money value, JsonGenerator jgen, SerializerProvider provider) throws IOException { - - if (value != null) { - jgen.writeString(value.getValue().toString()); - } - } -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/service/impl/rest/SecurityRestServiceImpl.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/service/impl/rest/SecurityRestServiceImpl.java deleted file mode 100644 index 7b4123ea0..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/general/service/impl/rest/SecurityRestServiceImpl.java +++ /dev/null @@ -1,93 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.service.impl.rest; - -import javax.annotation.security.PermitAll; -import javax.inject.Inject; -import javax.inject.Named; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.transaction.Transactional; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.MediaType; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.security.web.csrf.CsrfToken; -import org.springframework.security.web.csrf.CsrfTokenRepository; - -import io.oasp.gastronomy.restaurant.general.common.api.exception.NoActiveUserException; -import io.oasp.gastronomy.restaurant.general.common.api.security.UserData; -import io.oasp.gastronomy.restaurant.general.common.api.to.UserDetailsClientTo; -import io.oasp.module.rest.common.api.RestService; - -/** - * The security REST service provides access to the csrf token, the authenticated user's meta-data. Furthermore, it - * provides functionality to check permissions and roles of the authenticated user. - * - */ -@Path("/security/v1") -@Named("SecurityRestService") -@Transactional -public class SecurityRestServiceImpl implements RestService { - - /** Logger instance. */ - private static final Logger LOG = LoggerFactory.getLogger(SecurityRestServiceImpl.class); - - /** - * Use {@link CsrfTokenRepository} for CSRF protection. - */ - private CsrfTokenRepository csrfTokenRepository; - - /** - * Retrieves the CSRF token from the server session. - * - * @param request {@link HttpServletRequest} to retrieve the current session from - * @param response {@link HttpServletResponse} to send additional information - * @return the Spring Security {@link CsrfToken} - */ - @Produces(MediaType.APPLICATION_JSON) - @GET - @Path("/csrftoken/") - @PermitAll - public CsrfToken getCsrfToken(@Context HttpServletRequest request, @Context HttpServletResponse response) { - - // return (CsrfToken) request.getSession().getAttribute( - // HttpSessionCsrfTokenRepository.class.getName().concat(".CSRF_TOKEN")); - CsrfToken token = this.csrfTokenRepository.loadToken(request); - if (token == null) { - LOG.warn("No CsrfToken could be found - instanciating a new Token"); - token = this.csrfTokenRepository.generateToken(request); - this.csrfTokenRepository.saveToken(token, request, response); - } - return token; - } - - /** - * Gets the profile of the user being currently logged in. - * - * @param request provided by the RS-Context - * @return the {@link UserData} taken from the Spring Security context - */ - @Produces(MediaType.APPLICATION_JSON) - @GET - @Path("/currentuser/") - @PermitAll - public UserDetailsClientTo getCurrentUser(@Context HttpServletRequest request) { - - if (request.getRemoteUser() == null) { - throw new NoActiveUserException(); - } - return UserData.get().toClientTo(); - } - - /** - * @param csrfTokenRepository the csrfTokenRepository to set - */ - @Inject - public void setCsrfTokenRepository(CsrfTokenRepository csrfTokenRepository) { - - this.csrfTokenRepository = csrfTokenRepository; - } -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/batch/impl/productimport/writer/ProductWriter.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/batch/impl/productimport/writer/ProductWriter.java deleted file mode 100644 index 8f8c95814..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/batch/impl/productimport/writer/ProductWriter.java +++ /dev/null @@ -1,47 +0,0 @@ -package io.oasp.gastronomy.restaurant.offermanagement.batch.impl.productimport.writer; - -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.Offermanagement; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.ProductEto; - -import java.util.List; - -import javax.inject.Inject; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.batch.item.ItemWriter; - -/** - * ProductWriter is responsible for writing ProductEto to database. - * - */ -public class ProductWriter implements ItemWriter { - - private static final Logger LOG = LoggerFactory.getLogger(ProductWriter.class); - - private Offermanagement offerManagement; - - /** - * {@inheritDoc} - */ - @Override - public void write(List items) throws Exception { - - LOG.debug("Writing " + items.size() + " products"); - - for (ProductEto item : items) { - LOG.debug("Saving product: " + item.getName()); - this.offerManagement.saveProduct(item); - } - - } - - /** - * @param offerManagement the offerManagement to set - */ - @Inject - public void setOfferManagement(Offermanagement offerManagement) { - - this.offerManagement = offerManagement; - } -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/common/api/Drink.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/common/api/Drink.java deleted file mode 100644 index f9843704c..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/common/api/Drink.java +++ /dev/null @@ -1,19 +0,0 @@ -package io.oasp.gastronomy.restaurant.offermanagement.common.api; - -/** - * This is the interface for a {@link Product} that represents a {@link Drink}. - * - */ -public interface Drink extends Product { - - /** - * @return {@code true} if this drink is containing alcohol, {@code false} otherwise. - */ - boolean isAlcoholic(); - - /** - * @param alcoholic is the new value of {@link #isAlcoholic() alcoholic}. - */ - void setAlcoholic(boolean alcoholic); - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/common/api/Meal.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/common/api/Meal.java deleted file mode 100644 index 4418faa79..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/common/api/Meal.java +++ /dev/null @@ -1,9 +0,0 @@ -package io.oasp.gastronomy.restaurant.offermanagement.common.api; - -/** - * This is the interface for a {@link Product} that represents a {@link Meal}. - * - */ -public interface Meal extends Product { - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/common/api/MenuItem.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/common/api/MenuItem.java deleted file mode 100644 index 800d868b9..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/common/api/MenuItem.java +++ /dev/null @@ -1,31 +0,0 @@ -package io.oasp.gastronomy.restaurant.offermanagement.common.api; - -import io.oasp.gastronomy.restaurant.general.common.api.ApplicationEntity; - -/** - * This is the interface for a {@link MenuItem} what is either a {@link Product} or an {@link Offer}. - * - */ -public interface MenuItem extends ApplicationEntity { - - /** - * @return a description with the details of this item. - */ - String getDescription(); - - /** - * @param description is the new {@link #getDescription() description}. - */ - void setDescription(String description); - - /** - * @return the display name of this item. - */ - String getName(); - - /** - * @param name is the new {@link #getName() name}. - */ - void setName(String name); - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/common/api/Offer.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/common/api/Offer.java deleted file mode 100644 index 64a7d2a35..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/common/api/Offer.java +++ /dev/null @@ -1,78 +0,0 @@ -package io.oasp.gastronomy.restaurant.offermanagement.common.api; - -import io.oasp.gastronomy.restaurant.general.common.api.datatype.Money; -import io.oasp.gastronomy.restaurant.offermanagement.common.api.datatype.OfferState; - -/** - * This is the interface for an {@link Offer} that combines {@link Product}s with a price for the menu of the - * restaurant. The combined {@link Product}s are a {@link Meal}, a {@link SideDish}, and a {@link Drink}. All of them - * are optional but at least one of the three has to be present in a valid {@link Offer}. - * - */ -public interface Offer extends MenuItem { - - /** - * @return the unique number of this {@link Offer} used in the menu. While the {@link #getId() ID} of an {@link Offer} - * is auto-generated and will never change, the number may be changed if the menu gets updated. This is the - * identifier used by customers to displace orders. - */ - Long getNumber(); - - /** - * @param number is the new {@link #getNumber() number}. - */ - void setNumber(Long number); - - /** - * @return the current price of the offer. - */ - Money getPrice(); - - /** - * @param price is the new {@link #getPrice() price}. - */ - void setPrice(Money price); - - /** - * @return is the {@link Meal#getId() ID} of the {@link Meal} or {@code null} if no {@link Meal} is contained in - * this {@link Offer}. - */ - Long getMealId(); - - /** - * @param mealId is the new {@link #getMealId() mealId}. - */ - void setMealId(Long mealId); - - /** - * @return is the {@link Drink#getId() ID} of the {@link Drink} or {@code null} if no {@link Drink} is contained - * in this {@link Offer}. - */ - Long getDrinkId(); - - /** - * @param drinkId is the new {@link #getDrinkId() drinkId}. - */ - void setDrinkId(Long drinkId); - - /** - * @return is the {@link SideDish#getId() ID} of the {@link SideDish} or {@code null} if no {@link SideDish} is - * contained in this {@link Offer}. - */ - Long getSideDishId(); - - /** - * @param sideDishId is the new {@link #getSideDishId() sideDishId}. - */ - void setSideDishId(Long sideDishId); - - /** - * @return the {@link OfferState state} of this {@link Offer}. - */ - OfferState getState(); - - /** - * @param state is the new {@link #getState() state}. - */ - void setState(OfferState state); -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/common/api/Product.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/common/api/Product.java deleted file mode 100644 index 3160d7c3d..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/common/api/Product.java +++ /dev/null @@ -1,21 +0,0 @@ -package io.oasp.gastronomy.restaurant.offermanagement.common.api; - -import io.oasp.gastronomy.restaurant.general.logic.api.to.BinaryObjectEto; - -/** - * This is the interface for a {@link Product} of the restaurant. - * - */ -public interface Product extends MenuItem { - - /** - * @return the ID of a {@link BinaryObjectEto} that represents the picture - */ - Long getPictureId(); - - /** - * @param binaryObjectId the ID of a {@link BinaryObjectEto} that represents the picture - */ - void setPictureId(Long binaryObjectId); - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/common/api/SideDish.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/common/api/SideDish.java deleted file mode 100644 index a81c095bd..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/common/api/SideDish.java +++ /dev/null @@ -1,9 +0,0 @@ -package io.oasp.gastronomy.restaurant.offermanagement.common.api; - -/** - * This is the interface for a {@link Product} that represents a {@link SideDish}. - * - */ -public interface SideDish extends Product { - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/common/api/datatype/OfferSortByHitEntry.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/common/api/datatype/OfferSortByHitEntry.java deleted file mode 100644 index 0e93ebf17..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/common/api/datatype/OfferSortByHitEntry.java +++ /dev/null @@ -1,65 +0,0 @@ -package io.oasp.gastronomy.restaurant.offermanagement.common.api.datatype; - -/** - * This enum identifies the entity, on which the sorting should be executed. - * - */ -public enum OfferSortByHitEntry { - - /** - * Sort by id. - */ - ID("id"), - /** - * Sort by description. - */ - DESCRIPTION("description"), - /** - * Sort by price. - */ - PRICE("price"), - /** - * Sort by meal. - */ - MEAL("meal"), - /** - * Sort by side dish. - */ - SIDEDISH("sideDish"), - /** - * Sort by drink. - */ - DRINK("drink"); - - private final String sortByAttributeName; - - private OfferSortByHitEntry(String sortByAttributeName) { - - this.sortByAttributeName = sortByAttributeName; - } - - /** - * @return sortByAttributeName - */ - public String getSortByAttributeName() { - - return this.sortByAttributeName; - } - - /** - * This method returns an {@link OfferSortByHitEntry} for a given {@link #getSortByAttributeName() attribute name}. - * - * @param sortByAttributeName the name. - * @return an {@link OfferSortByHitEntry} - */ - public static OfferSortByHitEntry getEntryForAttributeName(String sortByAttributeName) { - - for (OfferSortByHitEntry entry : OfferSortByHitEntry.values()) { - if (entry.sortByAttributeName.equals(sortByAttributeName)) { - return entry; - } - } - - return null; - } -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/common/api/datatype/OfferState.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/common/api/datatype/OfferState.java deleted file mode 100644 index 1e34a4ab3..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/common/api/datatype/OfferState.java +++ /dev/null @@ -1,45 +0,0 @@ -package io.oasp.gastronomy.restaurant.offermanagement.common.api.datatype; - -/** - * Represents the {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Offer#getState() state} of an - * {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Offer}. - * - */ -public enum OfferState { - - /** The state of a normal {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Offer}. */ - NORMAL, - - /** The state of a special {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Offer}. */ - SPECIAL, - - /** The state of a {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Offer} that is soled-out. */ - SOLDOUT; - - /** - * @return {@code true} if the - * {@link io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.OfferEntity} is normal. - */ - public boolean isNormal() { - - return (this == NORMAL); - } - - /** - * @return {@code true} if the - * {@link io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.OfferEntity} is special. - */ - public boolean isSpecial() { - - return (this == SPECIAL); - } - - /** - * @return {@code true} if the - * {@link io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.OfferEntity} is sold out. - */ - public boolean isSoldout() { - - return (this == SOLDOUT); - } -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/common/api/datatype/ProductSortByHitEntry.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/common/api/datatype/ProductSortByHitEntry.java deleted file mode 100644 index 144fb1a4a..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/common/api/datatype/ProductSortByHitEntry.java +++ /dev/null @@ -1,58 +0,0 @@ -package io.oasp.gastronomy.restaurant.offermanagement.common.api.datatype; - -/** - * This enum identifies the entity, on which the sorting should be executed. - * - */ -public enum ProductSortByHitEntry { - - // to implement: Type column - /** Sort by {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Product#getId() product id}. */ - ID("id"), - - /** - * Sort by {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Product#getDescription() product - * description}. - */ - DESCRIPTION("description"), - - /** - * Sort by {@link javax.persistence.DiscriminatorValue} - * - * @see Object#getClass() - */ - DTYPE("dtype"); - - private String sortByAttributeName; - - private ProductSortByHitEntry(String sortByAttributeName) { - - this.sortByAttributeName = sortByAttributeName; - } - - /** - * @return the name of the represented attribute of - * {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Product}. - */ - public String getSortByAttributeName() { - - return this.sortByAttributeName; - } - - /** - * This method returns an {@link ProductSortByHitEntry} for a given {@link #getSortByAttributeName() attribute name}. - * - * @param sortByAttributeName the name. - * @return an {@link ProductSortByHitEntry} - */ - public static ProductSortByHitEntry getEntryForAttributeName(String sortByAttributeName) { - - for (ProductSortByHitEntry entry : ProductSortByHitEntry.values()) { - if (entry.sortByAttributeName.equals(sortByAttributeName)) { - return entry; - } - } - - return null; - } -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/common/api/datatype/ProductType.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/common/api/datatype/ProductType.java deleted file mode 100644 index be087551b..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/common/api/datatype/ProductType.java +++ /dev/null @@ -1,49 +0,0 @@ -package io.oasp.gastronomy.restaurant.offermanagement.common.api.datatype; - - -/** - * This enum contains the available types of a {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Product}. - * - */ -public enum ProductType { - - /** - * This value identifies a {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Drink}. - */ - DRINK, - - /** - * This value identifies a {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Meal}. - */ - MEAL, - - /** - * This value identifies a {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.SideDish}. - */ - SIDEDISH; - - /** - * @return {@code true}, if this value equals {@link ProductType#DRINK} . {@code false} otherwise. - */ - public boolean isDrink() { - - return equals(DRINK); - } - - /** - * @return {@code true}, if this value equals {@link ProductType#MEAL}. {@code false} otherwise. - */ - public boolean isMeal() { - - return equals(MEAL); - } - - /** - * @return {@code true}, if this value equals {@link ProductType#SIDEDISH}. {@code false} otherwise. - */ - public boolean isSideDish() { - - return equals(SIDEDISH); - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/common/api/exception/OfferEmptyException.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/common/api/exception/OfferEmptyException.java deleted file mode 100644 index 5576bcfe8..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/common/api/exception/OfferEmptyException.java +++ /dev/null @@ -1,29 +0,0 @@ -package io.oasp.gastronomy.restaurant.offermanagement.common.api.exception; - -import io.oasp.gastronomy.restaurant.general.common.api.NlsBundleApplicationRoot; -import io.oasp.gastronomy.restaurant.general.common.api.exception.ApplicationBusinessException; -import io.oasp.gastronomy.restaurant.offermanagement.common.api.Offer; - -/** - * This exception is thrown if an {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Offer} is empty. Here - * empty means that is has no {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Offer#getDrinkId() drink}, - * no {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Offer#getMealId() meal}, and no - * {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Offer#getSideDishId() side-dish} associated. - * - */ -public class OfferEmptyException extends ApplicationBusinessException { - - /** UID for serialization. */ - private static final long serialVersionUID = 1L; - - /** - * The constructor. - * - * @param offer is the empty {@link Offer}. - */ - public OfferEmptyException(Offer offer) { - - super(createBundle(NlsBundleApplicationRoot.class).errorOfferEmpty()); - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/dataaccess/api/DrinkEntity.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/dataaccess/api/DrinkEntity.java deleted file mode 100644 index 95eee50dc..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/dataaccess/api/DrinkEntity.java +++ /dev/null @@ -1,54 +0,0 @@ -package io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api; - -import io.oasp.gastronomy.restaurant.offermanagement.common.api.Drink; - -import javax.persistence.DiscriminatorValue; -import javax.persistence.Entity; - -import org.hibernate.envers.Audited; - -/** - * The {@link io.oasp.gastronomy.restaurant.general.dataaccess.api.ApplicationPersistenceEntity persistent entity} for - * {@link Drink}. - * - */ -@Entity -@DiscriminatorValue("Drink") -@Audited -public class DrinkEntity extends ProductEntity implements Drink { - - private static final long serialVersionUID = 1L; - - private boolean alcoholic; - - /** - * The constructor. - */ - public DrinkEntity() { - - super(); - } - - /** - * Returns the field 'alcoholic'. - * - * @return Value of alcoholic - */ - @Override - public boolean isAlcoholic() { - - return this.alcoholic; - } - - /** - * Sets the field 'alcoholic'. - * - * @param alcoholic New value for alcoholic - */ - @Override - public void setAlcoholic(boolean alcoholic) { - - this.alcoholic = alcoholic; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/dataaccess/api/MealEntity.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/dataaccess/api/MealEntity.java deleted file mode 100644 index a286cc4da..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/dataaccess/api/MealEntity.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api; - -import io.oasp.gastronomy.restaurant.offermanagement.common.api.Meal; - -import javax.persistence.DiscriminatorValue; -import javax.persistence.Entity; - -import org.hibernate.envers.Audited; - -/** - * The {@link io.oasp.gastronomy.restaurant.general.dataaccess.api.ApplicationPersistenceEntity persistent entity} for - * {@link Meal}. - * - */ -@Entity -@DiscriminatorValue("Meal") -@Audited -public class MealEntity extends ProductEntity implements Meal { - - private static final long serialVersionUID = 1L; - - /** - * The constructor. - */ - public MealEntity() { - - super(); - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/dataaccess/api/MenuItemEntity.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/dataaccess/api/MenuItemEntity.java deleted file mode 100644 index fe5822514..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/dataaccess/api/MenuItemEntity.java +++ /dev/null @@ -1,60 +0,0 @@ -package io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api; - -import io.oasp.gastronomy.restaurant.general.dataaccess.api.ApplicationPersistenceEntity; -import io.oasp.gastronomy.restaurant.offermanagement.common.api.MenuItem; - -import javax.persistence.Column; -import javax.persistence.MappedSuperclass; - -import org.hibernate.envers.Audited; - -/** - * The {@link io.oasp.gastronomy.restaurant.general.dataaccess.api.ApplicationPersistenceEntity persistent entity} for - * {@link MenuItem}. - * - */ -@MappedSuperclass -@Audited -public abstract class MenuItemEntity extends ApplicationPersistenceEntity implements MenuItem { - - private static final long serialVersionUID = 1L; - - private String name; - - private String description; - - /** - * The constructor. - */ - public MenuItemEntity() { - - super(); - } - - @Column(name = "name", unique = true) - @Override - public String getName() { - - return this.name; - } - - @Override - public void setName(String name) { - - this.name = name; - } - - @Column(name = "description") - @Override - public String getDescription() { - - return this.description; - } - - @Override - public void setDescription(String description) { - - this.description = description; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/dataaccess/api/OfferEntity.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/dataaccess/api/OfferEntity.java deleted file mode 100644 index 3db0e3db1..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/dataaccess/api/OfferEntity.java +++ /dev/null @@ -1,234 +0,0 @@ -package io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Table; -import javax.persistence.Transient; -import javax.persistence.UniqueConstraint; - -import io.oasp.gastronomy.restaurant.general.common.api.datatype.Money; -import io.oasp.gastronomy.restaurant.offermanagement.common.api.Offer; -import io.oasp.gastronomy.restaurant.offermanagement.common.api.datatype.OfferState; - -/** - * The {@link io.oasp.gastronomy.restaurant.general.dataaccess.api.ApplicationPersistenceEntity persistent entity} for - * {@link Offer}. - * - */ -@Entity -@Table(name = "Offer", uniqueConstraints = { @UniqueConstraint(columnNames = { "description" }) }) -public class OfferEntity extends MenuItemEntity implements Offer { - - private static final long serialVersionUID = 1L; - - private Long number; - - private Money price; - - private MealEntity meal; - - private DrinkEntity drink; - - private SideDishEntity sideDish; - - private OfferState state; - - /** - * The constructor. - */ - public OfferEntity() { - - super(); - } - - /* - * Uncomment the following Column annotation if the database used is Oracle 11g and comment the Column annotation just - * before @Override annotation - */ - // @Column(name = "\"number\"", unique = true) - - @Column(name = "number", unique = true) - @Override - public Long getNumber() { - - return this.number; - } - - @Override - public void setNumber(Long number) { - - this.number = number; - } - - @Override - public Money getPrice() { - - return this.price; - } - - /** - * Sets the field 'currentPrice'. - * - * @param currentPrice New value for currentPrice - */ - @Override - public void setPrice(Money currentPrice) { - - this.price = currentPrice; - } - - /** - * Returns the field 'meal'. - * - * @return Value of meal - */ - @ManyToOne(fetch = FetchType.EAGER) - @JoinColumn(name = "mealId") - public MealEntity getMeal() { - - return this.meal; - } - - /** - * Sets the field 'meal'. - * - * @param meal New value for meal - */ - public void setMeal(MealEntity meal) { - - this.meal = meal; - } - - @Override - @Transient - public Long getMealId() { - - if (this.meal == null) { - return null; - } - return this.meal.getId(); - } - - @Override - public void setMealId(Long mealId) { - - if (mealId == null) { - this.meal = null; - } else { - MealEntity mealEntity = new MealEntity(); - mealEntity.setId(mealId); - this.meal = mealEntity; - } - } - - /** - * @return Value of drink - */ - @ManyToOne(fetch = FetchType.EAGER) - @JoinColumn(name = "drinkId") - public DrinkEntity getDrink() { - - return this.drink; - } - - /** - * Sets the field 'drink'. - * - * @param drink New value for drink - */ - public void setDrink(DrinkEntity drink) { - - this.drink = drink; - } - - @Override - @Transient - public Long getDrinkId() { - - if (this.drink == null) { - return null; - } - return this.drink.getId(); - } - - @Override - public void setDrinkId(Long drinkId) { - - if (drinkId == null) { - this.drink = null; - } else { - DrinkEntity drinkEntity = new DrinkEntity(); - drinkEntity.setId(drinkId); - this.drink = drinkEntity; - } - } - - /** - * Returns the field 'sideDish'. - * - * @return Value of sideDish - */ - @ManyToOne(fetch = FetchType.EAGER) - @JoinColumn(name = "sideDishId") - public SideDishEntity getSideDish() { - - return this.sideDish; - } - - /** - * Sets the field 'sideDish'. - * - * @param sideDish New value for sideDish - */ - public void setSideDish(SideDishEntity sideDish) { - - this.sideDish = sideDish; - } - - @Override - @Transient - public Long getSideDishId() { - - if (this.sideDish == null) { - return null; - } - return this.sideDish.getId(); - } - - @Override - public void setSideDishId(Long sideDishId) { - - if (sideDishId == null) { - this.sideDish = null; - } else { - SideDishEntity sideDishEntity = new SideDishEntity(); - sideDishEntity.setId(sideDishId); - this.sideDish = sideDishEntity; - } - } - - /** - * Returns the field 'state'. - * - * @return Value of state - */ - @Override - public OfferState getState() { - - return this.state; - } - - /** - * Sets the field 'state'. - * - * @param state New value for state - */ - @Override - public void setState(OfferState state) { - - this.state = state; - } -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/dataaccess/api/ProductEntity.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/dataaccess/api/ProductEntity.java deleted file mode 100644 index eb4baed85..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/dataaccess/api/ProductEntity.java +++ /dev/null @@ -1,50 +0,0 @@ -package io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api; - -import io.oasp.gastronomy.restaurant.offermanagement.common.api.Product; - -import javax.persistence.DiscriminatorColumn; -import javax.persistence.DiscriminatorType; -import javax.persistence.Entity; -import javax.persistence.Inheritance; -import javax.persistence.InheritanceType; -import javax.persistence.Table; - -import org.hibernate.envers.Audited; - -/** - * The {@link io.oasp.gastronomy.restaurant.general.dataaccess.api.ApplicationPersistenceEntity persistent entity} for - * {@link Product}. - * - */ -@Entity -@Table(name = "Product") -@Inheritance(strategy = InheritanceType.SINGLE_TABLE) -@DiscriminatorColumn(name = "dType", discriminatorType = DiscriminatorType.STRING) -@Audited -public abstract class ProductEntity extends MenuItemEntity implements Product { - - private static final long serialVersionUID = 1L; - - private Long pictureId; - - /** - * The constructor. - */ - public ProductEntity() { - - super(); - } - - @Override - public Long getPictureId() { - - return this.pictureId; - } - - @Override - public void setPictureId(Long binaryObjectId) { - - this.pictureId = binaryObjectId; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/dataaccess/api/SideDishEntity.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/dataaccess/api/SideDishEntity.java deleted file mode 100644 index e5d6eb77a..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/dataaccess/api/SideDishEntity.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api; - -import io.oasp.gastronomy.restaurant.offermanagement.common.api.SideDish; - -import javax.persistence.DiscriminatorValue; -import javax.persistence.Entity; - -import org.hibernate.envers.Audited; - -/** - * The {@link io.oasp.gastronomy.restaurant.general.dataaccess.api.ApplicationPersistenceEntity persistent entity} for - * {@link SideDish}. - * - */ -@Entity -@DiscriminatorValue("SideDish") -@Audited -public class SideDishEntity extends ProductEntity implements SideDish { - - private static final long serialVersionUID = 1L; - - /** - * The constructor. - */ - public SideDishEntity() { - - super(); - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/dataaccess/api/dao/DrinkDao.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/dataaccess/api/dao/DrinkDao.java deleted file mode 100644 index 98f21369e..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/dataaccess/api/dao/DrinkDao.java +++ /dev/null @@ -1,13 +0,0 @@ -package io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.dao; - -import io.oasp.gastronomy.restaurant.general.dataaccess.api.dao.ApplicationRevisionedDao; -import io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.DrinkEntity; -import io.oasp.module.jpa.dataaccess.api.MasterDataDao; - -/** - * {@link ApplicationRevisionedDao Data Access Object} for {@link DrinkEntity}. - * - */ -public interface DrinkDao extends ApplicationRevisionedDao, MasterDataDao { - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/dataaccess/api/dao/MealDao.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/dataaccess/api/dao/MealDao.java deleted file mode 100644 index 8ff52d8b4..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/dataaccess/api/dao/MealDao.java +++ /dev/null @@ -1,13 +0,0 @@ -package io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.dao; - -import io.oasp.gastronomy.restaurant.general.dataaccess.api.dao.ApplicationRevisionedDao; -import io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.MealEntity; -import io.oasp.module.jpa.dataaccess.api.MasterDataDao; - -/** - * {@link ApplicationRevisionedDao Data Access Object} for {@link MealEntity}. - * - */ -public interface MealDao extends ApplicationRevisionedDao, MasterDataDao { - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/dataaccess/api/dao/OfferDao.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/dataaccess/api/dao/OfferDao.java deleted file mode 100644 index 12ba27866..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/dataaccess/api/dao/OfferDao.java +++ /dev/null @@ -1,39 +0,0 @@ -package io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.dao; - -import io.oasp.gastronomy.restaurant.general.dataaccess.api.dao.ApplicationDao; -import io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.OfferEntity; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.OfferFilter; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.OfferSearchCriteriaTo; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.OfferSortBy; -import io.oasp.module.jpa.common.api.to.PaginatedListTo; -import io.oasp.module.jpa.dataaccess.api.MasterDataDao; - -import java.util.List; - -/** - * {@link ApplicationDao Data Access Object} for {@link OfferEntity} entity. - * - */ -public interface OfferDao extends ApplicationDao, MasterDataDao { - - /** - * Returns a {@link List} of filtered {@link OfferEntity}s. - * - * @param offerFilterBo is the {@link OfferFilter offers filter criteria}. Any value, that should be applied as a - * filter, have to be different to {@code null}. - * @param sortBy is the {@link OfferSortBy} attribute, which defines the sorting. - * - * @return the {@link List} with all {@link OfferEntity}s that match the {@link OfferFilter offers filter criteria}. - */ - @Deprecated - List findOffersFiltered(OfferFilter offerFilterBo, OfferSortBy sortBy); - - /** - * Finds the {@link OfferEntity} objects matching the given {@link OfferSearchCriteriaTo}. - * - * @param criteria is the {@link OfferSearchCriteriaTo}. - * @return the {@link List} with the matching {@link OfferEntity} objects. - */ - PaginatedListTo findOffers(OfferSearchCriteriaTo criteria); - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/dataaccess/api/dao/ProductDao.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/dataaccess/api/dao/ProductDao.java deleted file mode 100644 index a8337463c..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/dataaccess/api/dao/ProductDao.java +++ /dev/null @@ -1,35 +0,0 @@ -package io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.dao; - -import io.oasp.gastronomy.restaurant.general.dataaccess.api.dao.ApplicationRevisionedDao; -import io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.ProductEntity; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.ProductFilter; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.ProductSearchCriteriaTo; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.ProductSortBy; -import io.oasp.module.jpa.common.api.to.PaginatedListTo; -import io.oasp.module.jpa.dataaccess.api.MasterDataDao; - -import java.util.List; - -/** - * {@link ApplicationRevisionedDao Data Access Object} for {@link ProductEntity} entity. - * - */ -public interface ProductDao extends ApplicationRevisionedDao, MasterDataDao { - - /** - * @param productFilter is the {@link ProductFilter}. - * @param sortBy is the {@link ProductSortBy} criteria. - * @return the {@link List} of filtered and sorted {@link ProductEntity products}. - */ - @Deprecated - List findProductsFiltered(ProductFilter productFilter, ProductSortBy sortBy); - - /** - * Finds the {@link ProductEntity} objects matching the given {@link ProductSearchCriteriaTo}. - * - * @param criteria is the {@link ProductSearchCriteriaTo}. - * @return the {@link List} with the matching {@link ProductEntity} objects. - */ - PaginatedListTo findProducts(ProductSearchCriteriaTo criteria); - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/dataaccess/api/dao/SideDishDao.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/dataaccess/api/dao/SideDishDao.java deleted file mode 100644 index bb1a36a9a..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/dataaccess/api/dao/SideDishDao.java +++ /dev/null @@ -1,13 +0,0 @@ -package io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.dao; - -import io.oasp.gastronomy.restaurant.general.dataaccess.api.dao.ApplicationRevisionedDao; -import io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.SideDishEntity; -import io.oasp.module.jpa.dataaccess.api.MasterDataDao; - -/** - * {@link ApplicationRevisionedDao Data Access Object} for {@link SideDishEntity}. - * - */ -public interface SideDishDao extends ApplicationRevisionedDao, MasterDataDao { - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/dataaccess/impl/dao/DrinkDaoImpl.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/dataaccess/impl/dao/DrinkDaoImpl.java deleted file mode 100644 index aa5e57448..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/dataaccess/impl/dao/DrinkDaoImpl.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.oasp.gastronomy.restaurant.offermanagement.dataaccess.impl.dao; - -import io.oasp.gastronomy.restaurant.general.dataaccess.base.dao.ApplicationMasterDataDaoImpl; -import io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.DrinkEntity; -import io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.dao.DrinkDao; - -import javax.inject.Named; - -/** - * Implementation of {@link DrinkDao}. - * - */ -@Named -public class DrinkDaoImpl extends ApplicationMasterDataDaoImpl implements DrinkDao { - - /** - * The constructor. - */ - public DrinkDaoImpl() { - - super(); - } - - @Override - protected Class getEntityClass() { - - return DrinkEntity.class; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/dataaccess/impl/dao/MealDaoImpl.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/dataaccess/impl/dao/MealDaoImpl.java deleted file mode 100644 index 01710068e..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/dataaccess/impl/dao/MealDaoImpl.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.oasp.gastronomy.restaurant.offermanagement.dataaccess.impl.dao; - -import io.oasp.gastronomy.restaurant.general.dataaccess.base.dao.ApplicationMasterDataDaoImpl; -import io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.MealEntity; -import io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.dao.MealDao; - -import javax.inject.Named; - -/** - * Implementation of {@link MealDao}. - * - */ -@Named -public class MealDaoImpl extends ApplicationMasterDataDaoImpl implements MealDao { - - /** - * The constructor. - */ - public MealDaoImpl() { - - super(); - } - - @Override - protected Class getEntityClass() { - - return MealEntity.class; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/dataaccess/impl/dao/OfferDaoImpl.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/dataaccess/impl/dao/OfferDaoImpl.java deleted file mode 100644 index 565ea5d0f..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/dataaccess/impl/dao/OfferDaoImpl.java +++ /dev/null @@ -1,179 +0,0 @@ -package io.oasp.gastronomy.restaurant.offermanagement.dataaccess.impl.dao; - -import static com.mysema.query.alias.Alias.$; -import io.oasp.gastronomy.restaurant.general.common.api.datatype.Money; -import io.oasp.gastronomy.restaurant.general.dataaccess.base.dao.ApplicationMasterDataDaoImpl; -import io.oasp.gastronomy.restaurant.offermanagement.common.api.datatype.OfferSortByHitEntry; -import io.oasp.gastronomy.restaurant.offermanagement.common.api.datatype.OfferState; -import io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.DrinkEntity; -import io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.MealEntity; -import io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.OfferEntity; -import io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.SideDishEntity; -import io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.dao.OfferDao; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.OfferFilter; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.OfferSearchCriteriaTo; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.OfferSortBy; -import io.oasp.module.jpa.common.api.to.PaginatedListTo; - -import java.util.ArrayList; -import java.util.List; - -import javax.inject.Named; - -import com.mysema.query.BooleanBuilder; -import com.mysema.query.alias.Alias; -import com.mysema.query.jpa.JPQLQuery; -import com.mysema.query.jpa.impl.JPAQuery; -import com.mysema.query.types.path.EntityPathBase; - -/** - * Implementation of {@link OfferDao}. - * - */ -@Named -public class OfferDaoImpl extends ApplicationMasterDataDaoImpl implements OfferDao { - - /** - * The constructor. - */ - public OfferDaoImpl() { - - super(); - } - - @Override - public Class getEntityClass() { - - return OfferEntity.class; - } - - @Override - @Deprecated - public List findOffersFiltered(OfferFilter offerFilterBo, OfferSortBy sortBy) { - - /* - * Default error handling - */ - if (offerFilterBo == null || sortBy == null) { - return new ArrayList<>(0); - } - - OfferEntity offer = Alias.alias(OfferEntity.class); - JPQLQuery query = new JPAQuery(getEntityManager()).from($(offer)); - BooleanBuilder builder = new BooleanBuilder(); - - /* - * Applying the filters - */ - // Meal - MealEntity meal = Alias.alias(MealEntity.class); - if (offerFilterBo.getMealId() != null && offerFilterBo.getMealId() > 0) { - query = query.join($(offer.getMeal()), $(meal)); - builder.and($(meal.getId()).eq(offerFilterBo.getMealId())); - } - - // Drink - DrinkEntity drink = Alias.alias(DrinkEntity.class); - if (offerFilterBo.getDrinkId() != null && offerFilterBo.getDrinkId() > 0) { - query.join($(offer.getDrink()), $(drink)); - builder.and($(drink.getId()).eq(offerFilterBo.getDrinkId())); - } - - // SideDish - SideDishEntity sideDish = Alias.alias(SideDishEntity.class); - if (offerFilterBo.getSideDishId() != null && offerFilterBo.getSideDishId() > 0) { - query.join($(offer.getSideDish()), $(sideDish)); - builder.and($(sideDish.getId()).eq(offerFilterBo.getSideDishId())); - } - - // only min price is given - if (offerFilterBo.getMinPrice() != null) { - builder.and($(offer.getPrice()).goe(offerFilterBo.getMinPrice())); - } - - // only max price is given - if (offerFilterBo.getMaxPrice() != null) { - builder.and($(offer.getPrice()).loe(offerFilterBo.getMaxPrice())); - } - - // sorting - if (sortBy.getSortByEntry().equals(OfferSortByHitEntry.DESCRIPTION)) { - if (sortBy.getOrderBy().isDesc()) - query.where(builder).orderBy($(offer.getDescription()).desc()); - else - query.where(builder).orderBy($(offer.getDescription()).asc()); - } else if (sortBy.getSortByEntry().equals(OfferSortByHitEntry.PRICE)) { - if (sortBy.getOrderBy().isDesc()) - query.where(builder).orderBy($(offer.getPrice()).desc()); - else - query.where(builder).orderBy($(offer.getPrice()).asc()); - } else if (sortBy.getSortByEntry().equals(OfferSortByHitEntry.MEAL)) { - if (sortBy.getOrderBy().isDesc()) - query.where(builder).orderBy($(offer.getMeal().getDescription()).desc()); - else - query.where(builder).orderBy($(offer.getMeal().getDescription()).asc()); - } else if (sortBy.getSortByEntry().equals(OfferSortByHitEntry.DRINK)) { - if (sortBy.getOrderBy().isDesc()) - query.where(builder).orderBy($(offer.getDrink().getDescription()).desc()); - else - query.where(builder).orderBy($(offer.getDrink().getDescription()).asc()); - } else if (sortBy.getSortByEntry().equals(OfferSortByHitEntry.SIDEDISH)) { - if (sortBy.getOrderBy().isDesc()) - query.where(builder).orderBy($(offer.getSideDish().getDescription()).desc()); - else - query.where(builder).orderBy($(offer.getSideDish().getDescription()).asc()); - } else { - if (sortBy.getOrderBy().isDesc()) - query.where(builder).orderBy($(offer.getId()).desc()); - else - query.where(builder).orderBy($(offer.getId()).asc()); - } - - /* - * Result - */ - List result = query.where(builder).list($(offer)); - return result; - } - - @Override - public PaginatedListTo findOffers(OfferSearchCriteriaTo criteria) { - - OfferEntity offer = Alias.alias(OfferEntity.class); - EntityPathBase alias = $(offer); - JPAQuery query = new JPAQuery(getEntityManager()).from(alias); - - Long number = criteria.getNumber(); - if (number != null) { - query.where($(offer.getNumber()).eq(number)); - } - Long mealId = criteria.getMealId(); - if (mealId != null) { - query.where($(offer.getMealId()).eq(mealId)); - } - Long drinkId = criteria.getDrinkId(); - if (drinkId != null) { - query.where($(offer.getDrinkId()).eq(drinkId)); - } - Long sideDishId = criteria.getSideDishId(); - if (sideDishId != null) { - query.where($(offer.getSideDishId()).eq(sideDishId)); - } - OfferState state = criteria.getState(); - if (state != null) { - query.where($(offer.getState()).eq(state)); - } - - Money minPrice = criteria.getMinPrice(); - if (minPrice != null) { - query.where($(offer.getPrice()).goe(minPrice)); - } - - Money maxPrice = criteria.getMaxPrice(); - if (maxPrice != null) { - query.where($(offer.getPrice()).loe(maxPrice)); - } - - return findPaginated(criteria, query, alias); - } -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/dataaccess/impl/dao/ProductDaoImpl.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/dataaccess/impl/dao/ProductDaoImpl.java deleted file mode 100644 index c273f7e92..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/dataaccess/impl/dao/ProductDaoImpl.java +++ /dev/null @@ -1,148 +0,0 @@ -package io.oasp.gastronomy.restaurant.offermanagement.dataaccess.impl.dao; - -import static com.mysema.query.alias.Alias.$; -import io.oasp.gastronomy.restaurant.general.dataaccess.base.dao.ApplicationMasterDataDaoImpl; -import io.oasp.gastronomy.restaurant.offermanagement.common.api.datatype.ProductSortByHitEntry; -import io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.DrinkEntity; -import io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.MealEntity; -import io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.ProductEntity; -import io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.SideDishEntity; -import io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.dao.ProductDao; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.ProductFilter; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.ProductSearchCriteriaTo; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.ProductSortBy; -import io.oasp.module.jpa.common.api.to.PaginatedListTo; -import io.oasp.module.jpa.common.api.to.PaginationResultTo; -import io.oasp.module.jpa.common.api.to.PaginationTo; - -import java.util.ArrayList; -import java.util.List; - -import javax.inject.Named; - -import com.mysema.query.BooleanBuilder; -import com.mysema.query.alias.Alias; -import com.mysema.query.jpa.JPQLQuery; -import com.mysema.query.jpa.impl.JPAQuery; -import com.mysema.query.types.path.EntityPathBase; - -/** - * Implementation of {@link ProductDao}. - * - */ -@Named -public class ProductDaoImpl extends ApplicationMasterDataDaoImpl implements ProductDao { - - /** - * The constructor. - */ - public ProductDaoImpl() { - - super(); - } - - @Override - public Class getEntityClass() { - - return ProductEntity.class; - } - - @Override - @Deprecated - public List findProductsFiltered(ProductFilter productFilterBo, ProductSortBy sortBy) { - - /* - * Basic error handling - */ - if (productFilterBo == null) { - return new ArrayList<>(); - } - - ProductEntity product = Alias.alias(ProductEntity.class); - JPQLQuery query = new JPAQuery(getEntityManager()).from($(product)); - BooleanBuilder builder = new BooleanBuilder(); - - /* - * Drinks - */ - if (productFilterBo.getFetchDrinks()) { - builder.or($(product).instanceOf(DrinkEntity.class)); - } - - /* - * Meals - */ - if (productFilterBo.getFetchMeals()) { - builder.or($(product).instanceOf(MealEntity.class)); - } - - /* - * SideDishes - */ - if (productFilterBo.getFetchSideDishes()) { - builder.or($(product).instanceOf(SideDishEntity.class)); - } - - if (sortBy.getSortByEntry().equals(ProductSortByHitEntry.DESCRIPTION)) { - if (sortBy.getOrderBy().isDesc()) { - query.where(builder).orderBy($(product.getDescription()).desc()); - } else { - query.where(builder).orderBy($(product.getDescription()).asc()); - } - } else { - if (sortBy.getOrderBy().isDesc()) { - query.where(builder).orderBy($(product.getId()).desc()); - } else { - query.where(builder).orderBy($(product.getId()).asc()); - } - - } - - List result = query.list($(product)); - return result; - } - - @Override - public PaginatedListTo findProducts(ProductSearchCriteriaTo criteria) { - - ProductEntity product = Alias.alias(ProductEntity.class); - EntityPathBase alias = $(product); - JPAQuery query = new JPAQuery(getEntityManager()).from(alias); - - String name = criteria.getName(); - if (name != null) { - query.where($(product.getName()).eq(name)); - } - - String description = criteria.getDescription(); - if (description != null) { - query.where($(product.getDescription()).eq(description)); - } - - // include filter for entity type - - if (!(criteria.isFetchDrinks() || criteria.isFetchMeals() || criteria.isFetchSideDishes())) { - // no product type was selected, return empty result - PaginationTo pagination = criteria.getPagination(); - - PaginationResultTo paginationResult = new PaginationResultTo(pagination, 0L); - List paginatedList = new ArrayList<>(); - - return new PaginatedListTo<>(paginatedList, paginationResult); - } - - BooleanBuilder builder = new BooleanBuilder(); - if (criteria.isFetchSideDishes()) { - builder.or($(product).instanceOf(SideDishEntity.class)); - } - if (criteria.isFetchMeals()) { - builder.or($(product).instanceOf(MealEntity.class)); - } - if (criteria.isFetchDrinks()) { - builder.or($(product).instanceOf(DrinkEntity.class)); - } - query.where(builder); - - return findPaginated(criteria, query, alias); - } -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/dataaccess/impl/dao/SideDishDaoImpl.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/dataaccess/impl/dao/SideDishDaoImpl.java deleted file mode 100644 index f4bee95eb..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/dataaccess/impl/dao/SideDishDaoImpl.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.oasp.gastronomy.restaurant.offermanagement.dataaccess.impl.dao; - -import io.oasp.gastronomy.restaurant.general.dataaccess.base.dao.ApplicationMasterDataDaoImpl; -import io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.SideDishEntity; -import io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.dao.SideDishDao; - -import javax.inject.Named; - -/** - * Implementation of {@link SideDishDao}. - * - */ -@Named -public class SideDishDaoImpl extends ApplicationMasterDataDaoImpl implements SideDishDao { - - /** - * The constructor. - */ - public SideDishDaoImpl() { - - super(); - } - - @Override - protected Class getEntityClass() { - - return SideDishEntity.class; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/logic/api/Offermanagement.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/logic/api/Offermanagement.java deleted file mode 100644 index f20929742..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/logic/api/Offermanagement.java +++ /dev/null @@ -1,223 +0,0 @@ -package io.oasp.gastronomy.restaurant.offermanagement.logic.api; - -import io.oasp.gastronomy.restaurant.general.logic.api.to.BinaryObjectEto; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.DrinkEto; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.MealEto; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.OfferCto; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.OfferEto; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.OfferFilter; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.OfferSearchCriteriaTo; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.OfferSortBy; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.ProductEto; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.ProductFilter; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.ProductSearchCriteriaTo; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.ProductSortBy; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.SideDishEto; -import io.oasp.module.jpa.common.api.to.PaginatedListTo; - -import java.sql.Blob; -import java.util.List; - -import javax.validation.Valid; - -/** - * Interface for OfferManagement. - * - */ -public interface Offermanagement { - - /** - * Gets an {@link OfferEto} using its entity identifier. - * - * @param id is the {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Offer#getId() offer ID}. - * @return the requested {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Offer} or {@code null} if no - * such {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Offer} exists. - */ - OfferEto findOffer(Long id); - - /** - * Gets an {@link OfferCto} using its entity identifier. - * - * @param id is the {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Offer#getId() offer ID}. - * @return the requested {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Offer} or {@code null} if no - * such {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Offer} exists. - */ - OfferCto findOfferCto(Long id); - - /** - * @return the {@link List} with all available {@link OfferEto}s. - */ - List findAllOffers(); - - /** - * Returns a list of offers matching the search criteria. - * - * @param criteria the {@link OfferSearchCriteriaTo}. - * @return the {@link List} of matching {@link OfferEto}s. - */ - PaginatedListTo findOfferEtos(OfferSearchCriteriaTo criteria); - - /** - * Checks, whether a given {@link ProductEto} is in use by at least one {@link OfferEto}. - * - * @param product product to check if it is in use - * @return {@code true}, if there are no {@link OfferEto offers}, that use the given {@link ProductEto}. {@code false} - * otherwise. - */ - boolean isProductInUseByOffer(ProductEto product); - - /** - * @param offerFilterBo is the {@link OfferFilter offers filter criteria} - * @param sortBy is the {@link OfferSortBy} attribute, which defines the sorting. - * - * @return the {@link List} with all {@link OfferEto}s that match the {@link OfferFilter} criteria. - */ - List findOffersFiltered(OfferFilter offerFilterBo, OfferSortBy sortBy); - - /** - * Deletes an {@link OfferEto} by its {@link OfferEto#getId() id}. - * - * @param offerId is the {@link OfferEto#getId() id} that identifies the {@link OfferEto} to be deleted. - */ - void deleteOffer(Long offerId); - - /** - * If no ID is contained creates the {@link OfferEto} for the first time. Else it updates the {@link OfferEto} with - * given ID. If no {@link OfferEto} with given ID is present, an exception will be thrown. - * - * @param offer the {@link OfferEto} to persist. - * @return the generated/updated offer - */ - OfferEto saveOffer(@Valid OfferEto offer); - - /** - * Gets a {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Product} using its entity identifier. - * - * @param id is the {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Product#getId() product ID}. - * @return the requested {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Product} or {@code null} if - * no such {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Product} exists. - */ - ProductEto findProduct(Long id); - - /** - * Gets a {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Product} with a specific revision using its - * entity identifier and a revision. - * - * @param id is the {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Product#getId() product ID}. - * @param revision is the revision of the {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Product - * Product} - * @return the requested {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Product} or {@code null} if - * no such {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Product} exists. - */ - ProductEto findProductByRevision(Long id, Number revision); - - /** - * Gets a {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Meal} using its entity identifier. - * - * @param id is the {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Meal#getId() product ID}. - * @return the requested {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Meal} or {@code null} if no - * such {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Meal} exists. - */ - MealEto findMeal(Long id); - - /** - * Gets a {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Drink} using its entity identifier. - * - * @param id is the {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Drink#getId() product ID}. - * @return the requested {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Drink} or {@code null} if no - * such {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Drink} exists. - */ - DrinkEto findDrink(Long id); - - /** - * Gets a {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.SideDish} using its entity identifier. - * - * @param id is the {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.SideDish#getId() product ID}. - * @return the requested {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.SideDish} or {@code null} if - * no such {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.SideDish} exists. - */ - SideDishEto findSideDish(Long id); - - /** - * @return the {@link List} with all {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Product}s. - */ - List findAllProducts(); - - /** - * @return the {@link List} with all {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Meal meals}. - */ - List findAllMeals(); - - /** - * @return the {@link List} with all {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Drink drinks}. - */ - List findAllDrinks(); - - /** - * @return the {@link List} with all {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.SideDish side - * dishes}. - */ - List findAllSideDishes(); - - /** - * Returns the {@link List} of filtered products sorted according to the specification. - * - * @param productFilterBo filter specification - * @param sortBy sorting specification - * @return a {@link List} of filtered products - */ - List findProductsFiltered(ProductFilter productFilterBo, ProductSortBy sortBy); - - /** - * @param productId the ID of the {@link ProductEto} to get the picture - * @return the {@link BinaryObjectEto} that contains meta data about the picture - */ - BinaryObjectEto findProductPicture(Long productId); - - /** - * Returns a list of products matching the search criteria. - * - * @param criteria the {@link ProductSearchCriteriaTo}. - * @return the {@link List} of matching {@link ProductEto}s. - */ - PaginatedListTo findProductEtos(ProductSearchCriteriaTo criteria); - - /** - * @param productId the ID of the {@link ProductEto} to get the picture data - * @return the {@link Blob} that contains the data - */ - Blob findProductPictureBlob(Long productId); - - /** - * If no ID is contained creates the {@link ProductEto} for the first time. Else it updates the {@link ProductEto} - * with given ID. If no {@link ProductEto} with given ID is present, an exception will be thrown. - * - * @param product the {@link ProductEto} to persist. - * @return the persisted {@link ProductEto}. - */ - ProductEto saveProduct(ProductEto product); - - /** - * Deletes a {@link ProductEto}. - * - * @param productId is the ID of the {@link ProductEto} to delete - */ - void deleteProduct(Long productId); - - /** - * Updates the picture of the product. - * - * @param productId is the ID of the {@link ProductEto} to update the picture - * @param blob is the binary representation of the picture - * @param binaryObjectEto is the mimeType of the blob - */ - void updateProductPicture(Long productId, Blob blob, BinaryObjectEto binaryObjectEto); - - /** - * Deletes the Picture of the {@link ProductEto}. - * - * @param productId is the ID of the {@link ProductEto} to delte the picture - */ - void deleteProductPicture(Long productId); - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/logic/api/to/DrinkEto.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/logic/api/to/DrinkEto.java deleted file mode 100644 index 520461f12..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/logic/api/to/DrinkEto.java +++ /dev/null @@ -1,45 +0,0 @@ -package io.oasp.gastronomy.restaurant.offermanagement.logic.api.to; - -import io.oasp.gastronomy.restaurant.offermanagement.common.api.Drink; - -/** - * The {@link io.oasp.module.basic.common.api.to.AbstractEto ETO} for a {@link Drink}. - * - */ -public class DrinkEto extends ProductEto implements Drink { - - private static final long serialVersionUID = 1L; - - private boolean alcoholic; - - /** - * The constructor. - */ - public DrinkEto() { - - super(); - } - - /** - * Returns the field 'alcoholic'. - * - * @return Value of alcoholic - */ - @Override - public boolean isAlcoholic() { - - return this.alcoholic; - } - - /** - * Sets the field 'alcoholic'. - * - * @param alcoholic New value for alcoholic - */ - @Override - public void setAlcoholic(boolean alcoholic) { - - this.alcoholic = alcoholic; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/logic/api/to/MealEto.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/logic/api/to/MealEto.java deleted file mode 100644 index 3c6e31371..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/logic/api/to/MealEto.java +++ /dev/null @@ -1,22 +0,0 @@ -package io.oasp.gastronomy.restaurant.offermanagement.logic.api.to; - -import io.oasp.gastronomy.restaurant.offermanagement.common.api.Meal; - -/** - * The {@link io.oasp.module.basic.common.api.to.AbstractEto ETO} for a {@link Meal}. - * - */ -public class MealEto extends ProductEto implements Meal { - - /** UID for serialization. */ - private static final long serialVersionUID = 1L; - - /** - * The constructor. - */ - public MealEto() { - - super(); - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/logic/api/to/MenuItemEto.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/logic/api/to/MenuItemEto.java deleted file mode 100644 index 8746241c4..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/logic/api/to/MenuItemEto.java +++ /dev/null @@ -1,49 +0,0 @@ -package io.oasp.gastronomy.restaurant.offermanagement.logic.api.to; - -import io.oasp.gastronomy.restaurant.offermanagement.common.api.MenuItem; -import io.oasp.module.basic.common.api.to.AbstractEto; - -/** - * The {@link AbstractEto ETO} for a {@link MenuItem}. - * - */ -public abstract class MenuItemEto extends AbstractEto implements MenuItem { - - private static final long serialVersionUID = 1L; - - private String name; - - private String description; - - /** - * The constructor. - */ - public MenuItemEto() { - - super(); - } - - @Override - public String getName() { - - return this.name; - } - - @Override - public void setName(String name) { - - this.name = name; - } - - @Override - public String getDescription() { - - return this.description; - } - - @Override - public void setDescription(String description) { - - this.description = description; - } -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/logic/api/to/OfferCto.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/logic/api/to/OfferCto.java deleted file mode 100644 index 215275095..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/logic/api/to/OfferCto.java +++ /dev/null @@ -1,92 +0,0 @@ -package io.oasp.gastronomy.restaurant.offermanagement.logic.api.to; - -import io.oasp.module.basic.common.api.to.AbstractCto; - -/** - * The {@link AbstractCto CTO} for an {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Offer}. - * - */ -public class OfferCto extends AbstractCto { - - private static final long serialVersionUID = 1L; - - private OfferEto offer; - - private MealEto meal; - - private DrinkEto drink; - - private SideDishEto sideDish; - - /** - * The constructor. - */ - public OfferCto() { - - } - - /** - * @return offer - */ - public OfferEto getOffer() { - - return this.offer; - } - - /** - * @param offer the offer to set - */ - public void setOffer(OfferEto offer) { - - this.offer = offer; - } - - /** - * @return meal - */ - public MealEto getMeal() { - - return this.meal; - } - - /** - * @param meal the meal to set - */ - public void setMeal(MealEto meal) { - - this.meal = meal; - } - - /** - * @return drink - */ - public DrinkEto getDrink() { - - return this.drink; - } - - /** - * @param drink the drink to set - */ - public void setDrink(DrinkEto drink) { - - this.drink = drink; - } - - /** - * @return sideDish - */ - public SideDishEto getSideDish() { - - return this.sideDish; - } - - /** - * @param sideDish the sideDish to set - */ - public void setSideDish(SideDishEto sideDish) { - - this.sideDish = sideDish; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/logic/api/to/OfferEto.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/logic/api/to/OfferEto.java deleted file mode 100644 index a46381fdf..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/logic/api/to/OfferEto.java +++ /dev/null @@ -1,108 +0,0 @@ -package io.oasp.gastronomy.restaurant.offermanagement.logic.api.to; - -import io.oasp.gastronomy.restaurant.general.common.api.datatype.Money; -import io.oasp.gastronomy.restaurant.general.common.api.datatype.validation.NotNegativeMoney; -import io.oasp.gastronomy.restaurant.offermanagement.common.api.Offer; -import io.oasp.gastronomy.restaurant.offermanagement.common.api.datatype.OfferState; - -/** - * The {@link io.oasp.module.basic.common.api.to.AbstractEto ETO} for an {@link Offer}. - * - */ -public class OfferEto extends MenuItemEto implements Offer { - - private static final long serialVersionUID = 1L; - - private Long number; - - @NotNegativeMoney - private Money currentPrice; - - private Long mealId; - - private Long drinkId; - - private Long sideDishId; - - private OfferState state; - - /** - * The constructor. - */ - public OfferEto() { - - super(); - } - - @Override - public Long getNumber() { - - return this.number; - } - - @Override - public void setNumber(Long number) { - - this.number = number; - } - - @Override - public Money getPrice() { - - return this.currentPrice; - } - - @Override - public void setPrice(Money currentPrice) { - - this.currentPrice = currentPrice; - } - - @Override - public Long getMealId() { - - return this.mealId; - } - - @Override - public void setMealId(Long mealId) { - - this.mealId = mealId; - } - - @Override - public Long getDrinkId() { - - return this.drinkId; - } - - @Override - public void setDrinkId(Long drinkId) { - - this.drinkId = drinkId; - } - - @Override - public Long getSideDishId() { - - return this.sideDishId; - } - - @Override - public void setSideDishId(Long sideDishId) { - - this.sideDishId = sideDishId; - } - - @Override - public OfferState getState() { - - return this.state; - } - - @Override - public void setState(OfferState state) { - - this.state = state; - } -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/logic/api/to/OfferFilter.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/logic/api/to/OfferFilter.java deleted file mode 100644 index cecd8f79e..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/logic/api/to/OfferFilter.java +++ /dev/null @@ -1,158 +0,0 @@ -package io.oasp.gastronomy.restaurant.offermanagement.logic.api.to; - -import io.oasp.gastronomy.restaurant.general.common.api.datatype.Money; -import io.oasp.module.basic.common.api.to.AbstractTo; - -import net.sf.mmm.util.transferobject.api.AbstractTransferObject; - -/** - * {@link AbstractTransferObject TO} to filter {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Offer}s. - * - */ -public class OfferFilter extends AbstractTo { - - private static final long serialVersionUID = 1L; - - private Long mealId; - - private Long sideDishId; - - private Long drinkId; - - private Money minPrice; - - private Money maxPrice; - - /** - * The constructor. - */ - public OfferFilter() { - - // initialize - this.mealId = null; - this.sideDishId = null; - this.drinkId = null; - this.minPrice = null; - this.maxPrice = null; - } - - /* - * Constructor - */ - /** - * @param mealId Id of a meal as a Long - * @param sideDishId Id of a Sidedish as a Long - * @param drinkId Id of a Drink as a Long - * @param minPrice minimal price for the filtered offers or null to ignore - * @param maxPrice maximal price for the filtered offers or null to ignore - */ - public OfferFilter(Long mealId, Long sideDishId, Long drinkId, Money minPrice, Money maxPrice) { - - this.mealId = mealId; - this.sideDishId = sideDishId; - this.drinkId = drinkId; - this.minPrice = minPrice; - this.maxPrice = maxPrice; - } - - /** - * Returns the field 'mealId'. - * - * @return Value of mealId - */ - public Long getMealId() { - - return this.mealId; - } - - /** - * Returns the field 'sideDishId'. - * - * @return Value of sideDishId - */ - public Long getSideDishId() { - - return this.sideDishId; - } - - /** - * Returns the field 'drinkId'. - * - * @return Value of drinkId - */ - public Long getDrinkId() { - - return this.drinkId; - } - - /** - * Returns the field 'minPrice'. - * - * @return Value of minPrice - */ - public Money getMinPrice() { - - return this.minPrice; - } - - /** - * Returns the field 'maxPrice'. - * - * @return Value of maxPrice - */ - public Money getMaxPrice() { - - return this.maxPrice; - } - - /** - * Sets the field 'mealId'. - * - * @param mealId New value for mealId - */ - public void setMealId(Long mealId) { - - this.mealId = mealId; - } - - /** - * Sets the field 'sideDishId'. - * - * @param sideDishId New value for sideDishId - */ - public void setSideDishId(Long sideDishId) { - - this.sideDishId = sideDishId; - } - - /** - * Sets the field 'drinkId'. - * - * @param drinkId New value for drinkId - */ - public void setDrinkId(Long drinkId) { - - this.drinkId = drinkId; - } - - /** - * Sets the field 'minPrice'. - * - * @param minPrice New value for minPrice - */ - public void setMinPrice(Money minPrice) { - - this.minPrice = minPrice; - } - - /** - * Sets the field 'maxPrice'. - * - * @param maxPrice New value for maxPrice - */ - public void setMaxPrice(Money maxPrice) { - - this.maxPrice = maxPrice; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/logic/api/to/OfferSearchCriteriaTo.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/logic/api/to/OfferSearchCriteriaTo.java deleted file mode 100644 index f3e104a69..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/logic/api/to/OfferSearchCriteriaTo.java +++ /dev/null @@ -1,151 +0,0 @@ -package io.oasp.gastronomy.restaurant.offermanagement.logic.api.to; - -import io.oasp.gastronomy.restaurant.general.common.api.datatype.Money; -import io.oasp.gastronomy.restaurant.offermanagement.common.api.datatype.OfferState; -import io.oasp.module.jpa.common.api.to.SearchCriteriaTo; - -/** - * This is the {@link SearchCriteriaTo search criteria} {@link net.sf.mmm.util.transferobject.api.TransferObject TO} - * used to find {@link io.oasp.gastronomy.restaurant.salesmanagement.common.api.Order}s. - * - */ -public class OfferSearchCriteriaTo extends SearchCriteriaTo { - - /** UID for serialization. */ - private static final long serialVersionUID = 1L; - - private Long number; - - private Money minPrice; - - private Money maxPrice; - - private Long mealId; - - private Long drinkId; - - private Long sideDishId; - - private OfferState state; - - /** - * The constructor. - */ - public OfferSearchCriteriaTo() { - - super(); - } - - /** - * @return number - */ - public Long getNumber() { - - return this.number; - } - - /** - * @param number the number to set - */ - public void setNumber(Long number) { - - this.number = number; - } - - /** - * @return minPrice - */ - public Money getMinPrice() { - - return this.minPrice; - } - - /** - * @param minPrice the minPrice to set - */ - public void setMinPrice(Money minPrice) { - - this.minPrice = minPrice; - } - - /** - * @return maxPrice - */ - public Money getMaxPrice() { - - return this.maxPrice; - } - - /** - * @param maxPrice the maxPrice to set - */ - public void setMaxPrice(Money maxPrice) { - - this.maxPrice = maxPrice; - } - - /** - * @return mealId - */ - public Long getMealId() { - - return this.mealId; - } - - /** - * @param mealId the mealId to set - */ - public void setMealId(Long mealId) { - - this.mealId = mealId; - } - - /** - * @return drinkId - */ - public Long getDrinkId() { - - return this.drinkId; - } - - /** - * @param drinkId the drinkId to set - */ - public void setDrinkId(Long drinkId) { - - this.drinkId = drinkId; - } - - /** - * @return sideDishId - */ - public Long getSideDishId() { - - return this.sideDishId; - } - - /** - * @param sideDishId the sideDishId to set - */ - public void setSideDishId(Long sideDishId) { - - this.sideDishId = sideDishId; - } - - /** - * @return state - */ - public OfferState getState() { - - return this.state; - } - - /** - * @param state the state to set - */ - public void setState(OfferState state) { - - this.state = state; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/logic/api/to/OfferSortBy.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/logic/api/to/OfferSortBy.java deleted file mode 100644 index 559ff1574..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/logic/api/to/OfferSortBy.java +++ /dev/null @@ -1,64 +0,0 @@ -package io.oasp.gastronomy.restaurant.offermanagement.logic.api.to; - -import io.oasp.gastronomy.restaurant.offermanagement.common.api.datatype.OfferSortByHitEntry; -import io.oasp.module.jpa.common.api.to.OrderDirection; - -/** - * - */ -public class OfferSortBy { - - private OfferSortByHitEntry sortByEntry; - - private OrderDirection orderBy; - - /** - * The constructor. - */ - public OfferSortBy() { - - this.sortByEntry = OfferSortByHitEntry.ID; - this.orderBy = OrderDirection.ASC; - } - - /** - * Returns the field 'sortByEntry'. - * - * @return Value of sortByEntry - */ - public OfferSortByHitEntry getSortByEntry() { - - return this.sortByEntry; - } - - /** - * Sets the field 'sortByEntry'. - * - * @param sortByEntry New value for sortByEntry - */ - public void setSortByEntry(OfferSortByHitEntry sortByEntry) { - - this.sortByEntry = sortByEntry; - } - - /** - * Returns the field 'orderBy'. - * - * @return Value of orderBy - */ - public OrderDirection getOrderBy() { - - return this.orderBy; - } - - /** - * Sets the field 'orderBy'. - * - * @param orderBy New value for orderBy - */ - public void setOrderBy(OrderDirection orderBy) { - - this.orderBy = orderBy; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/logic/api/to/ProductEto.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/logic/api/to/ProductEto.java deleted file mode 100644 index 60d674621..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/logic/api/to/ProductEto.java +++ /dev/null @@ -1,35 +0,0 @@ -package io.oasp.gastronomy.restaurant.offermanagement.logic.api.to; - -import io.oasp.gastronomy.restaurant.offermanagement.common.api.Product; - -/** - * The {@link io.oasp.module.basic.common.api.to.AbstractEto ETO} for a {@link Product}. - * - */ -public abstract class ProductEto extends MenuItemEto implements Product { - - private static final long serialVersionUID = 1L; - - private Long pictureId; - - /** - * Constructor. - */ - public ProductEto() { - - super(); - } - - @Override - public void setPictureId(Long binaryObjectId) { - - this.pictureId = binaryObjectId; - } - - @Override - public Long getPictureId() { - - return this.pictureId; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/logic/api/to/ProductFilter.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/logic/api/to/ProductFilter.java deleted file mode 100644 index b52aa30ef..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/logic/api/to/ProductFilter.java +++ /dev/null @@ -1,109 +0,0 @@ -package io.oasp.gastronomy.restaurant.offermanagement.logic.api.to; - -import io.oasp.module.basic.common.api.to.AbstractTo; - -import net.sf.mmm.util.transferobject.api.AbstractTransferObject; - -/** - * {@link AbstractTransferObject TO} to filter {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Product - * products}. - * - */ -public class ProductFilter extends AbstractTo { - - private static final long serialVersionUID = 1L; - - private boolean fetchDrinks; - - private boolean fetchMeals; - - private boolean fetchSideDishes; - - /** - * Constructor. - * - * Initializes the private fields fetchDrinks, fetchMeals and fetchSideDishes with {@code false}. So nothing is - * fetched by default. - */ - public ProductFilter() { - - this.fetchDrinks = false; - this.fetchMeals = false; - this.fetchSideDishes = false; - } - - /** - * Constructor. - * - * @param fetchDrinks is the flag for getting {@link DrinkEto drinks} from db (set this to {@code true}) - * @param fetchMeals is the flag for getting {@link MealEto meals} from db (set this to {@code true}) - * @param fetchSideDishes is the flag for getting {@link SideDishEto side dishes} from db (set this to {@code true}) - */ - public ProductFilter(boolean fetchDrinks, boolean fetchMeals, boolean fetchSideDishes) { - - this.fetchDrinks = fetchDrinks; - this.fetchMeals = fetchMeals; - this.fetchSideDishes = fetchSideDishes; - } - - /** - * Returns the field 'fetchSideDishes'. - * - * @return Value of fetchSideDishes - */ - public boolean getFetchSideDishes() { - - return this.fetchSideDishes; - } - - /** - * Sets the field 'fetchSideDishes'. - * - * @param fetchSideDishes New value for fetchSideDishes - */ - public void setFetchSideDishes(boolean fetchSideDishes) { - - this.fetchSideDishes = fetchSideDishes; - } - - /** - * Returns the field 'fetchMeals'. - * - * @return Value of fetchMeals - */ - public boolean getFetchMeals() { - - return this.fetchMeals; - } - - /** - * Sets the field 'fetchMeals'. - * - * @param fetchMeals New value for fetchMeals - */ - public void setFetchMeals(boolean fetchMeals) { - - this.fetchMeals = fetchMeals; - } - - /** - * Returns the field 'fetchDrinks'. - * - * @return Value of fetchDrinks - */ - public boolean getFetchDrinks() { - - return this.fetchDrinks; - } - - /** - * Sets the field 'fetchDrinks'. - * - * @param fetchDrinks New value for fetchDrinks - */ - public void setFetchDrinks(boolean fetchDrinks) { - - this.fetchDrinks = fetchDrinks; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/logic/api/to/ProductSearchCriteriaTo.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/logic/api/to/ProductSearchCriteriaTo.java deleted file mode 100644 index 566d8ec9f..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/logic/api/to/ProductSearchCriteriaTo.java +++ /dev/null @@ -1,129 +0,0 @@ -package io.oasp.gastronomy.restaurant.offermanagement.logic.api.to; - -import io.oasp.gastronomy.restaurant.offermanagement.common.api.Product; -import io.oasp.module.jpa.common.api.to.SearchCriteriaTo; - -/** - * This is the {@link SearchCriteriaTo search criteria} {@link net.sf.mmm.util.transferobject.api.TransferObject TO} - * used to find {@link Product}s. - * - * If no boolean is set to true, no {@link Product}s will be found. - * - */ -public class ProductSearchCriteriaTo extends SearchCriteriaTo { - - /** UID for serialization. */ - private static final long serialVersionUID = 1L; - - private boolean fetchDrinks; - - private boolean fetchMeals; - - private boolean fetchSideDishes; - - private String name; - - private String description; - - /** - * The constructor. - */ - public ProductSearchCriteriaTo() { - - super(); - - this.fetchDrinks = true; - this.fetchMeals = true; - this.fetchSideDishes = true; - - } - - /** - * @return fetchDrinks - */ - public boolean isFetchDrinks() { - - return this.fetchDrinks; - } - - /** - * @param fetchDrinks the fetchDrinks to set - */ - public void setFetchDrinks(boolean fetchDrinks) { - - this.fetchDrinks = fetchDrinks; - } - - /** - * @return fetchMeals - */ - public boolean isFetchMeals() { - - return this.fetchMeals; - } - - /** - * @param fetchMeals the fetchMeals to set - */ - public void setFetchMeals(boolean fetchMeals) { - - this.fetchMeals = fetchMeals; - } - - /** - * @return fetchSideDishes - */ - public boolean isFetchSideDishes() { - - return this.fetchSideDishes; - } - - /** - * @param fetchSideDishes the fetchSideDishes to set - */ - public void setFetchSideDishes(boolean fetchSideDishes) { - - this.fetchSideDishes = fetchSideDishes; - } - - /** - * @return name - */ - public String getName() { - - return this.name; - } - - /** - * @param name the name to set - */ - public void setName(String name) { - - this.name = name; - } - - /** - * @return description - */ - public String getDescription() { - - return this.description; - } - - /** - * @param description the description to set - */ - public void setDescription(String description) { - - this.description = description; - } - - @Override - protected void toString(StringBuilder buffer) { - - buffer.append("ProductSearchCriteriaTo [fetchDrinks=" + this.fetchDrinks + ", fetchMeals=" + this.fetchMeals - + ", fetchSideDishes=" + this.fetchSideDishes + ", name=" + this.name + ", description=" + this.description - + "]"); - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/logic/api/to/ProductSortBy.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/logic/api/to/ProductSortBy.java deleted file mode 100644 index 403a2621c..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/logic/api/to/ProductSortBy.java +++ /dev/null @@ -1,62 +0,0 @@ -package io.oasp.gastronomy.restaurant.offermanagement.logic.api.to; - -import io.oasp.gastronomy.restaurant.offermanagement.common.api.datatype.ProductSortByHitEntry; -import io.oasp.module.jpa.common.api.to.OrderDirection; - -/** - * - */ -public class ProductSortBy { - private ProductSortByHitEntry sortByEntry; - - private OrderDirection orderBy; - - /** - * Constructor for {@link ProductSortBy}. - */ - public ProductSortBy() { - - this.sortByEntry = ProductSortByHitEntry.ID; - this.orderBy = OrderDirection.ASC; - } - - /** - * Returns the field 'sortByEntry'. - * - * @return Value of sortByEntry - */ - public ProductSortByHitEntry getSortByEntry() { - - return this.sortByEntry; - } - - /** - * Sets the field 'sortByEntry'. - * - * @param sortByEntry New value for sortByEntry - */ - public void setSortByEntry(ProductSortByHitEntry sortByEntry) { - - this.sortByEntry = sortByEntry; - } - - /** - * Returns the field 'orderBy'. - * - * @return Value of orderBy - */ - public OrderDirection getOrderBy() { - - return this.orderBy; - } - - /** - * Sets the field 'orderBy'. - * - * @param orderBy New value for orderBy - */ - public void setOrderBy(OrderDirection orderBy) { - - this.orderBy = orderBy; - } -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/logic/api/to/SideDishEto.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/logic/api/to/SideDishEto.java deleted file mode 100644 index 30dcb879e..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/logic/api/to/SideDishEto.java +++ /dev/null @@ -1,22 +0,0 @@ -package io.oasp.gastronomy.restaurant.offermanagement.logic.api.to; - -import io.oasp.gastronomy.restaurant.offermanagement.common.api.SideDish; - -/** - * The {@link io.oasp.module.basic.common.api.to.AbstractEto ETO} for a {@link SideDish}. - * - */ -public class SideDishEto extends ProductEto implements SideDish { - - /** UID for serialization. */ - private static final long serialVersionUID = 1L; - - /** - * The constructor. - */ - public SideDishEto() { - - super(); - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/logic/impl/OffermanagementImpl.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/logic/impl/OffermanagementImpl.java deleted file mode 100644 index 88d6c606f..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/logic/impl/OffermanagementImpl.java +++ /dev/null @@ -1,502 +0,0 @@ -package io.oasp.gastronomy.restaurant.offermanagement.logic.impl; - -import io.oasp.gastronomy.restaurant.general.common.api.constants.PermissionConstants; -import io.oasp.gastronomy.restaurant.general.logic.api.to.BinaryObjectEto; -import io.oasp.gastronomy.restaurant.general.logic.base.AbstractComponentFacade; -import io.oasp.gastronomy.restaurant.general.logic.base.UcManageBinaryObject; -import io.oasp.gastronomy.restaurant.offermanagement.common.api.Product; -import io.oasp.gastronomy.restaurant.offermanagement.common.api.datatype.ProductType; -import io.oasp.gastronomy.restaurant.offermanagement.common.api.exception.OfferEmptyException; -import io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.OfferEntity; -import io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.ProductEntity; -import io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.dao.DrinkDao; -import io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.dao.MealDao; -import io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.dao.OfferDao; -import io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.dao.ProductDao; -import io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.dao.SideDishDao; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.Offermanagement; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.DrinkEto; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.MealEto; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.OfferCto; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.OfferEto; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.OfferFilter; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.OfferSearchCriteriaTo; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.OfferSortBy; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.ProductEto; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.ProductFilter; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.ProductSearchCriteriaTo; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.ProductSortBy; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.SideDishEto; -import io.oasp.module.jpa.common.api.to.PaginatedListTo; - -import java.sql.Blob; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; - -import javax.annotation.security.RolesAllowed; -import javax.inject.Inject; -import javax.inject.Named; -import javax.transaction.Transactional; -import javax.validation.Valid; - -import net.sf.mmm.util.exception.api.ObjectMismatchException; -import net.sf.mmm.util.exception.api.ObjectNotFoundUserException; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Implementation class for {@link Offermanagement}. - * - */ -@Named -@Transactional -public class OffermanagementImpl extends AbstractComponentFacade implements Offermanagement { - - private static final Logger LOG = LoggerFactory.getLogger(OffermanagementImpl.class); - - /** @see #getOfferDao() */ - private OfferDao offerDao; - - /** @see #setProductDao(ProductDao) */ - private ProductDao productDao; - - /** @see #setMealDao(MealDao) */ - private MealDao mealDao; - - /** @see #setDrinkDao(DrinkDao) */ - private DrinkDao drinkDao; - - /** @see #setSideDishDao(SideDishDao) */ - private SideDishDao sideDishDao; - - /** **/ - private UcManageBinaryObject ucManageBinaryObject; - - /** - * The constructor. - */ - public OffermanagementImpl() { - - super(); - } - - @Override - @RolesAllowed(PermissionConstants.FIND_OFFER) - public OfferEto findOffer(Long id) { - - LOG.debug("Get OfferEto with id '{}' from database.", id); - return getBeanMapper().map(getOfferDao().findOne(id), OfferEto.class); - } - - @Override - @RolesAllowed(PermissionConstants.FIND_OFFER) - public OfferCto findOfferCto(Long id) { - - LOG.debug("Get OfferCTO with id '{}' from database.", id); - OfferCto result = new OfferCto(); - // offer - OfferEto offerEto = findOffer(id); - if (offerEto == null) { - return null; - } - result.setOffer(offerEto); - // meal - Long mealId = offerEto.getMealId(); - if (mealId != null) { - result.setMeal(findMeal(mealId)); - } - // drink - Long drinkId = offerEto.getDrinkId(); - if (drinkId != null) { - result.setDrink(findDrink(drinkId)); - } - // sideDish - Long sideDishId = offerEto.getSideDishId(); - if (sideDishId != null) { - result.setSideDish(findSideDish(sideDishId)); - } - return result; - } - - @Override - @RolesAllowed(PermissionConstants.FIND_OFFER) - public List findAllOffers() { - - LOG.debug("Get all offers from database."); - return getBeanMapper().mapList(getOfferDao().findAll(), OfferEto.class); - } - - @Override - @RolesAllowed({ PermissionConstants.FIND_OFFER, PermissionConstants.FIND_PRODUCT }) - public boolean isProductInUseByOffer(ProductEto product) { - - LOG.debug("Get all offers from database for the given product with id '" + product.getId() + "'."); - - List persistedOffers = findAllOffers(); - - /* - * Check the occurrence of a product within all offers. Therefore, only check for a instance of a product type - * product type. - */ - ProductType productType = null; - - if (product instanceof DrinkEto) { - LOG.debug("The given product is an instance of Drink '" + product.getDescription() + "', id '" + product.getId() - + "'. Check all Offer-Drinks for that given occurrence."); - productType = ProductType.DRINK; - } else if (product instanceof MealEto) { - LOG.debug("The given product is an instance of Meal '" + product.getDescription() + "', id '" + product.getId() - + "'. Check all Offer-Meals for that given occurrence."); - productType = ProductType.MEAL; - } else if (product instanceof SideDishEto) { - LOG.debug("The given product is an instance of SideDish '" + product.getDescription() + "', id '" - + product.getId() + "'. Check all Offer-SideDishes for that given occurrence."); - productType = ProductType.SIDEDISH; - } - - if (productType == null) { - LOG.debug("The given product not in use by an offer."); - return false; - } - - for (OfferEto offer : persistedOffers) { - - if (productType.isDrink()) { - if (Objects.equals(offer.getDrinkId(), product.getId())) { - LOG.debug("The given product is in use by offer with id '" + offer.getId() + "', description '" - + offer.getDescription() + "'."); - return true; - } - continue; - - } - - if (productType.isMeal()) { - if (Objects.equals(offer.getMealId(), product.getId())) { - LOG.debug("The given product is in use by offer with id '" + offer.getId() + "', description '" - + offer.getDescription() + "'."); - return true; - } - continue; - } - - if (productType.isSideDish()) { - if (Objects.equals(offer.getSideDishId(), product.getId())) { - LOG.debug("The given product is in use by offer with id '" + offer.getId() + "', description '" - + offer.getDescription() + "'."); - return true; - } - continue; - } - } - - LOG.debug("The given product not in use by an offer."); - return false; - } - - @Override - @RolesAllowed(PermissionConstants.FIND_OFFER) - public List findOffersFiltered(OfferFilter offerFilterBo, OfferSortBy sortBy) { - - List offers = getOfferDao().findOffersFiltered(offerFilterBo, sortBy); - LOG.debug("'" + offers.size() + "' offers fetched."); - - List offerBos = new ArrayList<>(offers.size()); - for (OfferEntity o : offers) { - offerBos.add(getBeanMapper().map(o, OfferEto.class)); - } - return offerBos; - } - - @Override - @RolesAllowed(PermissionConstants.DELETE_OFFER) - public void deleteOffer(Long offerId) { - - getOfferDao().delete(offerId); - } - - @Override - @RolesAllowed(PermissionConstants.SAVE_OFFER) - public OfferEto saveOffer(@Valid OfferEto offer) { - - Objects.requireNonNull(offer, "offer"); - - if ((offer.getMealId() == null) && (offer.getDrinkId() == null) && (offer.getSideDishId() == null)) { - throw new OfferEmptyException(offer); - } else { - OfferEntity persistedOffer = getOfferDao().save(getBeanMapper().map(offer, OfferEntity.class)); - return getBeanMapper().map(persistedOffer, OfferEto.class); - } - } - - @Override - @RolesAllowed(PermissionConstants.FIND_PRODUCT) - public ProductEto findProduct(Long id) { - - LOG.debug("Get Product with id '" + id + "' from database."); - ProductEntity product = getProductDao().findOne(id); - if (product == null) { - return null; - } else { - return getBeanMapper().map(product, ProductEto.class); - } - } - - @Override - @RolesAllowed(PermissionConstants.FIND_PRODUCT) - public MealEto findMeal(Long id) { - - ProductEto product = findProduct(id); - try { - return (MealEto) product; - } catch (ClassCastException e) { - throw new ObjectMismatchException(product, MealEto.class, e); - } - } - - @Override - @RolesAllowed(PermissionConstants.FIND_PRODUCT) - public DrinkEto findDrink(Long id) { - - ProductEto product = findProduct(id); - try { - return (DrinkEto) product; - } catch (ClassCastException e) { - throw new ObjectMismatchException(product, DrinkEto.class, e); - } - } - - @Override - @RolesAllowed(PermissionConstants.FIND_PRODUCT) - public SideDishEto findSideDish(Long id) { - - ProductEto product = findProduct(id); - try { - return (SideDishEto) product; - } catch (ClassCastException e) { - throw new ObjectMismatchException(product, SideDishEto.class, e); - } - } - - @Override - @RolesAllowed(PermissionConstants.FIND_PRODUCT) - public List findAllProducts() { - - LOG.debug("Get all products from database."); - return getBeanMapper().mapList(getProductDao().findAll(), ProductEto.class); - } - - @Override - @RolesAllowed(PermissionConstants.FIND_PRODUCT) - public List findAllMeals() { - - LOG.debug("Get all meals with from database."); - return getBeanMapper().mapList(this.mealDao.findAll(), MealEto.class); - } - - @Override - @RolesAllowed(PermissionConstants.FIND_PRODUCT) - public List findAllDrinks() { - - LOG.debug("Get all drinks with from database."); - return getBeanMapper().mapList(this.drinkDao.findAll(), DrinkEto.class); - } - - @Override - @RolesAllowed(PermissionConstants.FIND_PRODUCT) - public List findAllSideDishes() { - - LOG.debug("Get all sidedishes with from database."); - return getBeanMapper().mapList(this.sideDishDao.findAll(), SideDishEto.class); - } - - @Override - @RolesAllowed(PermissionConstants.FIND_OFFER) - public List findProductsFiltered(ProductFilter productFilterBo, ProductSortBy sortBy) { - - LOG.debug("Fetch filtered offers."); - return getBeanMapper().mapList(getProductDao().findProductsFiltered(productFilterBo, sortBy), ProductEto.class); - } - - @Override - @RolesAllowed(PermissionConstants.FIND_PRODUCT) - public BinaryObjectEto findProductPicture(Long productId) { - - ProductEto product = findProduct(productId); - if (product != null) { - return getUcManageBinaryObject().findBinaryObject(product.getPictureId()); - } else { - return null; - } - } - - @Override - @RolesAllowed(PermissionConstants.FIND_PRODUCT_PICTURE) - public Blob findProductPictureBlob(Long productId) { - - ProductEto product = findProduct(productId); - if (product != null) { - return getUcManageBinaryObject().getBinaryObjectBlob(product.getPictureId()); - } else { - return null; - } - } - - @Override - @RolesAllowed(PermissionConstants.FIND_PRODUCT_PICTURE) - public ProductEto findProductByRevision(Long id, Number revision) { - - LOG.debug("Get Product with id '" + id + "' and revision '" + revision + "' from database."); - ProductEntity product = getProductDao().load(id, revision); - if (product == null) { - return null; - } else { - return getBeanMapper().map(product, ProductEto.class); - } - } - - @Override - @RolesAllowed(PermissionConstants.SAVE_PRODUCT) - public ProductEto saveProduct(ProductEto product) { - - Objects.requireNonNull(product, "product"); - - ProductEntity persistedProduct = getProductDao().save(getBeanMapper().map(product, ProductEntity.class)); - return getBeanMapper().map(persistedProduct, ProductEto.class); - } - - @Override - @RolesAllowed(PermissionConstants.DELETE_PRODUCT) - public void deleteProduct(Long productId) { - - getProductDao().delete(productId); - } - - @Override - @RolesAllowed(PermissionConstants.SAVE_PRODUCT_PICTURE) - public void updateProductPicture(Long productId, Blob blob, BinaryObjectEto binaryObjectEto) { - - ProductEntity product = getProductDao().findOne(productId); - if (product != null) { - binaryObjectEto = getUcManageBinaryObject().saveBinaryObject(blob, binaryObjectEto); - product.setPictureId(binaryObjectEto.getId()); - getProductDao().save(product); - } else { - throw new ObjectNotFoundUserException(Product.class, productId); - } - - } - - @Override - @RolesAllowed(PermissionConstants.DELETE_PRODUCT_PICTURE) - public void deleteProductPicture(Long productId) { - - ProductEntity product = getProductDao().findOne(productId); - if (product != null) { - getUcManageBinaryObject().deleteBinaryObject(product.getPictureId()); - } - } - - @Override - @RolesAllowed(PermissionConstants.FIND_OFFER) - public PaginatedListTo findOfferEtos(OfferSearchCriteriaTo criteria) { - - criteria.limitMaximumPageSize(MAXIMUM_HIT_LIMIT); - PaginatedListTo offers = getOfferDao().findOffers(criteria); - return mapPaginatedEntityList(offers, OfferEto.class); - } - - @Override - @RolesAllowed(PermissionConstants.FIND_PRODUCT) - public PaginatedListTo findProductEtos(ProductSearchCriteriaTo criteria) { - - criteria.limitMaximumPageSize(MAXIMUM_HIT_LIMIT); - PaginatedListTo products = getProductDao().findProducts(criteria); - return mapPaginatedEntityList(products, ProductEto.class); - } - - /** - * @return {@link OfferDao} instance. - */ - public OfferDao getOfferDao() { - - return this.offerDao; - } - - /** - * Sets the field 'offerDao'. - * - * @param offerDao New value for offerDao - */ - @Inject - public void setOfferDao(OfferDao offerDao) { - - this.offerDao = offerDao; - } - - /** - * @param ucManageBinaryObject the ucManageBinaryObject to set - */ - @Inject - public void setUcManageBinaryObject(UcManageBinaryObject ucManageBinaryObject) { - - this.ucManageBinaryObject = ucManageBinaryObject; - } - - /** - * @return ucManageBinaryObject - */ - public UcManageBinaryObject getUcManageBinaryObject() { - - return this.ucManageBinaryObject; - } - - /** - * @return productDao - */ - public ProductDao getProductDao() { - - return this.productDao; - } - - /** - * Sets the field 'productDao'. - * - * @param productDao New value for productDao - */ - @Inject - public void setProductDao(ProductDao productDao) { - - this.productDao = productDao; - } - - /** - * @param mealDao the {@link MealDao} to {@link Inject}. - */ - @Inject - public void setMealDao(MealDao mealDao) { - - this.mealDao = mealDao; - } - - /** - * @param drinkDao the {@link DrinkDao} to {@link Inject}. - */ - @Inject - public void setDrinkDao(DrinkDao drinkDao) { - - this.drinkDao = drinkDao; - } - - /** - * @param sideDishDao the {@link SideDishDao} to {@link Inject}. - */ - @Inject - public void setSideDishDao(SideDishDao sideDishDao) { - - this.sideDishDao = sideDishDao; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/service/api/rest/OffermanagementRestService.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/service/api/rest/OffermanagementRestService.java deleted file mode 100644 index 909f19db8..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/service/api/rest/OffermanagementRestService.java +++ /dev/null @@ -1,285 +0,0 @@ -package io.oasp.gastronomy.restaurant.offermanagement.service.api.rest; - -import java.io.IOException; -import java.io.InputStream; -import java.sql.SQLException; -import java.util.List; - -import javax.sql.rowset.serial.SerialException; -import javax.ws.rs.Consumes; -import javax.ws.rs.DELETE; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; - -import org.apache.cxf.jaxrs.ext.multipart.Multipart; -import org.apache.cxf.jaxrs.ext.multipart.MultipartBody; - -import io.oasp.gastronomy.restaurant.general.common.api.RestService; -import io.oasp.gastronomy.restaurant.general.logic.api.to.BinaryObjectEto; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.Offermanagement; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.DrinkEto; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.MealEto; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.OfferEto; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.OfferFilter; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.OfferSearchCriteriaTo; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.OfferSortBy; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.ProductEto; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.ProductFilter; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.ProductSearchCriteriaTo; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.ProductSortBy; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.SideDishEto; -import io.oasp.gastronomy.restaurant.offermanagement.service.impl.rest.OffermanagementRestServiceImpl; -import io.oasp.module.jpa.common.api.to.PaginatedListTo; - -/** - * - * This class contains methods for REST calls. Some URI structures may seem deprecated, but in fact are not. See the - * correspondent comments on top. - * - */ - -@Path("/offermanagement/v1") -@Consumes(MediaType.APPLICATION_JSON) -@Produces(MediaType.APPLICATION_JSON) -public interface OffermanagementRestService extends RestService { - - /** - * Delegates to {@link Offermanagement#findOffer}. - * - * @param id the ID of the {@link OfferEto} - * @return the {@link OfferEto} - */ - @GET - @Path("/offer/{id}") - OfferEto getOffer(@PathParam("id") long id); - - /** - * Delegates to {@link Offermanagement#saveOffer}. - * - * @param offer the {@link OfferEto} to save - * - * @return the saved {@link OfferEto} - */ - @POST - @Path("/offer/") - public OfferEto saveOffer(OfferEto offer); - - // although id in path is redundant, this structure is intentionally chosen - // for further reasons behind this decision see one of the other ***ManagementRestServiceImpl - /** - * Delegates to {@link Offermanagement#saveOffer}. - * - * @param offer the {@link OfferEto} to be updated - * - * @return the updated {@link OfferEto} - */ - @PUT - @Path("/offer/{id}") - @Deprecated - OfferEto updateOffer(OfferEto offer); - - /** - * Delegates to {@link Offermanagement#findAllOffers}. - * - * @return all {@link OfferEto}s as list - */ - @GET - @Path("/offer/") - @Deprecated - public List getAllOffers(); - - /** - * Delegates to {@link Offermanagement#findAllProducts}. - * - * @return all {@link ProductEto}s as list - */ - @GET - @Path("/product/") - @Deprecated - List getAllProducts(); - - /** - * Delegates to {@link Offermanagement#saveProduct}. - * - * @param product the product to save - * @return the saved product - */ - @POST - @Path("/product/") - ProductEto saveProduct(ProductEto product); - - /** - * Delegates to {@link Offermanagement#findAllMeals}. - * - * @deprecated use {@link OffermanagementRestServiceImpl#findProductEtosByPost(ProductSearchCriteriaTo)} with - * fetchMeals=true - * @return all {@link MealEto}s as list - */ - @GET - @Path("/product/meal/") - @Deprecated - List getAllMeals(); - - /** - * Delegates to {@link Offermanagement#findAllDrinks}. - * - * @deprecated use {@link OffermanagementRestServiceImpl#findProductEtosByPost(ProductSearchCriteriaTo)} with - * fetchDrinks=true - * @return all {@link DrinkEto}s as list - */ - @GET - @Path("/product/drink/") - @Deprecated - List getAllDrinks(); - - /** - * Delegates to {@link Offermanagement#findAllSideDishes}. - * - * @deprecated use {@link OffermanagementRestServiceImpl#findProductEtosByPost(ProductSearchCriteriaTo)} with - * fetchSideDishes=true - * @return all {@link SideDishEto}s as list - */ - @GET - @Path("/product/side/") - @Deprecated - List getAllSideDishes(); - - /** - * Delegates to {@link Offermanagement#deleteOffer}. - * - * @param id ID of the {@link OfferEto} to delete - */ - @DELETE - @Path("/offer/{id}") - void deleteOffer(@PathParam("id") long id); - - /** - * Delegates to {@link Offermanagement#findProductByRevision}. - * - * @param id ID of the {@link ProductEto} - * @param revision revision of the {@link ProductEto} - * @return the {@link ProductEto} - */ - @GET - @Path("/product/{id}/{revision}") - ProductEto findProductByRevision(@PathParam("id") long id, @PathParam("revision") Long revision); - - /** - * Delegates to {@link Offermanagement#findProduct}. - * - * @param id ID of the {@link ProductEto} - * @return the {@link ProductEto} - */ - @GET - @Path("/product/{id}") - ProductEto findProduct(@PathParam("id") long id); - - // although id in path is redundant, this structure is intentionally chosen - // for further reasons behind this decision see one of the other - // *ManagementRestServiceImpl - /** - * Delegates to {@link Offermanagement#saveProduct}. - * - * @param product the {@link ProductEto} to be updated - */ - @PUT - @Path("/product/{id}") - @Deprecated - void updateProduct(ProductEto product); - - /** - * Delegates to {@link Offermanagement#isProductInUseByOffer}. - * - * @param id ID of the {@link ProductEto} - * @return true, if there are no offers, that use the given ProductEto. false otherwise. - */ - @GET - @Path("/product/{id}/inuse") - boolean isProductInUseByOffer(@PathParam("id") long id); - - /** - * Delegates to {@link Offermanagement#deleteProduct}. - * - * @param id ID of the ProductEto to delete - */ - @DELETE - @Path("/product/{id}") - void deleteProduct(@PathParam("id") long id); - - /** - * Delegates to {@link Offermanagement#findOffersFiltered}. - * - * @param offerFilter the offers filter criteria - * @param sortBy sorting specification - * @return list with all {@link OfferEto}s that match the {@link OfferFilter} criteria - */ - @GET - @Path("/sortby/{sortBy}") - @Deprecated - List getFilteredOffers(OfferFilter offerFilter, @PathParam("sortBy") OfferSortBy sortBy); - - /** - * Delegates to {@link Offermanagement#findProductsFiltered}. - * - * @param productFilter filter specification - * @param sortBy sorting specification - * @return list with all {@link ProductEto}s that match the {@link ProductFilter} criteria - */ - @GET - @Path("/product/sortby/{sortBy}") - @Deprecated - List getFilteredProducts(ProductFilter productFilter, @PathParam("sortBy") ProductSortBy sortBy); - - @SuppressWarnings("javadoc") - @Consumes("multipart/mixed") - @POST - @Path("/product/{id}/picture") - public void updateProductPicture(@PathParam("id") long productId, - @Multipart(value = "binaryObjectEto", type = MediaType.APPLICATION_JSON) BinaryObjectEto binaryObjectEto, - @Multipart(value = "blob", type = MediaType.APPLICATION_OCTET_STREAM) InputStream picture) - throws SerialException, SQLException, IOException; - - @SuppressWarnings("javadoc") - @Produces("multipart/mixed") - @GET - @Path("/product/{id}/picture") - public MultipartBody getProductPicture(@PathParam("id") long productId) throws SQLException, IOException; - - @SuppressWarnings("javadoc") - @Produces(MediaType.APPLICATION_OCTET_STREAM) - @GET - @Path("/product/{id}/rawpicture") - @Deprecated - public Response getProductRawPicture(@PathParam("id") long productId) throws SQLException, IOException; - - @SuppressWarnings("javadoc") - @DELETE - @Path("/product/{id}/picture") - public void deleteProductPicture(long productId); - - /** - * Delegates to {@link Offermanagement#findOfferEtos}. - * - * @param searchCriteriaTo the pagination and search criteria to be used for finding offers. - * @return the {@link PaginatedListTo list} of matching {@link OfferEto}s. - */ - @Path("/offer/search") - @POST - public PaginatedListTo findOfferEtosByPost(OfferSearchCriteriaTo searchCriteriaTo); - - /** - * Delegates to {@link Offermanagement#findProductEtos}. - * - * @param searchCriteriaTo the pagination and search criteria to be used for finding products. - * @return the {@link PaginatedListTo list} of matching {@link ProductEto}s. - */ - @Path("/product/search") - @POST - public PaginatedListTo findProductEtosByPost(ProductSearchCriteriaTo searchCriteriaTo); -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/service/impl/rest/OffermanagementRestServiceImpl.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/service/impl/rest/OffermanagementRestServiceImpl.java deleted file mode 100644 index 0dc031906..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/offermanagement/service/impl/rest/OffermanagementRestServiceImpl.java +++ /dev/null @@ -1,226 +0,0 @@ -package io.oasp.gastronomy.restaurant.offermanagement.service.impl.rest; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.sql.Blob; -import java.sql.SQLException; -import java.util.LinkedList; -import java.util.List; - -import javax.inject.Inject; -import javax.inject.Named; -import javax.sql.rowset.serial.SerialBlob; -import javax.sql.rowset.serial.SerialException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; - -import org.apache.cxf.helpers.IOUtils; -import org.apache.cxf.jaxrs.ext.multipart.Attachment; -import org.apache.cxf.jaxrs.ext.multipart.MultipartBody; - -import io.oasp.gastronomy.restaurant.general.logic.api.to.BinaryObjectEto; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.Offermanagement; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.DrinkEto; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.MealEto; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.OfferEto; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.OfferFilter; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.OfferSearchCriteriaTo; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.OfferSortBy; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.ProductEto; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.ProductFilter; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.ProductSearchCriteriaTo; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.ProductSortBy; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.SideDishEto; -import io.oasp.gastronomy.restaurant.offermanagement.service.api.rest.OffermanagementRestService; -import io.oasp.module.jpa.common.api.to.PaginatedListTo; - -/** - */ -@Named("OffermanagementRestService") -public class OffermanagementRestServiceImpl implements OffermanagementRestService { - - private Offermanagement offermanagement; - - /** - * @param offerManagement the offerManagement to be set - */ - @Inject - public void setOffermanagement(Offermanagement offerManagement) { - - this.offermanagement = offerManagement; - } - - @Override - public OfferEto getOffer(long id) { - - return this.offermanagement.findOffer(id); - } - - @Override - public OfferEto saveOffer(OfferEto offer) { - - return this.offermanagement.saveOffer(offer); - } - - @Override - @Deprecated - public OfferEto updateOffer(OfferEto offer) { - - return this.offermanagement.saveOffer(offer); - } - - @Override - @Deprecated - public List getAllOffers() { - - return this.offermanagement.findAllOffers(); - } - - @Override - @Deprecated - public List getAllProducts() { - - return this.offermanagement.findAllProducts(); - } - - @Override - public ProductEto saveProduct(ProductEto product) { - - return this.offermanagement.saveProduct(product); - } - - @Override - @Deprecated - public List getAllMeals() { - - return this.offermanagement.findAllMeals(); - } - - @Override - @Deprecated - public List getAllDrinks() { - - return this.offermanagement.findAllDrinks(); - } - - @Override - @Deprecated - public List getAllSideDishes() { - - return this.offermanagement.findAllSideDishes(); - } - - @Override - public void deleteOffer(long id) { - - this.offermanagement.deleteOffer(id); - } - - @Override - public ProductEto findProductByRevision(long id, Long revision) { - - if (revision != null) { - return this.offermanagement.findProductByRevision(id, revision); - } else { - return this.offermanagement.findProduct(id); - } - } - - @Override - public ProductEto findProduct(long id) { - - return this.offermanagement.findProduct(id); - } - - @Override - @Deprecated - public void updateProduct(ProductEto product) { - - this.offermanagement.saveProduct(product); - } - - @Override - public boolean isProductInUseByOffer(long id) { - - return this.offermanagement.isProductInUseByOffer(findProduct(id)); - } - - @Override - public void deleteProduct(long id) { - - this.offermanagement.deleteProduct(id); - } - - @Override - @Deprecated - public List getFilteredOffers(OfferFilter offerFilter, OfferSortBy sortBy) { - - return this.offermanagement.findOffersFiltered(offerFilter, sortBy); - } - - @Override - @Deprecated - public List getFilteredProducts(ProductFilter productFilter, ProductSortBy sortBy) { - - return this.offermanagement.findProductsFiltered(productFilter, sortBy); - } - - @Override - public void updateProductPicture(long productId, BinaryObjectEto binaryObjectEto, InputStream picture) - throws SerialException, SQLException, IOException { - - Blob blob = new SerialBlob(IOUtils.readBytesFromStream(picture)); - this.offermanagement.updateProductPicture(productId, blob, binaryObjectEto); - - } - - @Override - public MultipartBody getProductPicture(long productId) throws SQLException, IOException { - - Blob blob = this.offermanagement.findProductPictureBlob(productId); - // REVIEW arturk88 (hohwille) we need to find another way to stream the blob without loading into heap. - // https://github.com/oasp/oasp4j-sample/pull/45 - byte[] data = IOUtils.readBytesFromStream(blob.getBinaryStream()); - - List atts = new LinkedList<>(); - atts.add(new Attachment("binaryObjectEto", MediaType.APPLICATION_JSON, - this.offermanagement.findProductPicture(productId))); - atts.add(new Attachment("blob", MediaType.APPLICATION_OCTET_STREAM, new ByteArrayInputStream(data))); - return new MultipartBody(atts, true); - - } - - @Override - @Deprecated - public Response getProductRawPicture(long productId) throws SQLException, IOException { - - Blob blob = this.offermanagement.findProductPictureBlob(productId); - if (blob != null) { - byte[] data = IOUtils.readBytesFromStream(blob.getBinaryStream()); - BinaryObjectEto metadata = this.offermanagement.findProductPicture(productId); - return Response.ok(new ByteArrayInputStream(data)).header("Content-Type", metadata.getMimeType()).build(); - } else { - return Response.noContent().build(); - } - } - - @Override - public void deleteProductPicture(long productId) { - - this.offermanagement.deleteProductPicture(productId); - } - - @Override - public PaginatedListTo findOfferEtosByPost(OfferSearchCriteriaTo searchCriteriaTo) { - - return this.offermanagement.findOfferEtos(searchCriteriaTo); - } - - @Override - public PaginatedListTo findProductEtosByPost(ProductSearchCriteriaTo searchCriteriaTo) { - - return this.offermanagement.findProductEtos(searchCriteriaTo); - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/batch/impl/billexport/processor/BillProcessor.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/batch/impl/billexport/processor/BillProcessor.java deleted file mode 100644 index 8f9081d0d..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/batch/impl/billexport/processor/BillProcessor.java +++ /dev/null @@ -1,36 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.batch.impl.billexport.processor; - -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.Salesmanagement; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.BillCto; - -import javax.inject.Inject; - -import org.springframework.batch.item.ItemProcessor; - -/** - * Implementation of ItemProcessor. It finds BillCto by id and returns it. - * - */ -public class BillProcessor implements ItemProcessor { - - private Salesmanagement salesmanagement; - - /** - * {@inheritDoc} - */ - @Override - public BillCto process(Long item) throws Exception { - - return this.salesmanagement.findBill(item); - } - - /** - * @param salesmanagement the salesmanagement to set - */ - @Inject - public void setSalesmanagement(Salesmanagement salesmanagement) { - - this.salesmanagement = salesmanagement; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/batch/impl/billexport/writer/BillCompositeWriter.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/batch/impl/billexport/writer/BillCompositeWriter.java deleted file mode 100644 index 1ef079937..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/batch/impl/billexport/writer/BillCompositeWriter.java +++ /dev/null @@ -1,130 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.batch.impl.billexport.writer; - -import static com.google.common.collect.Lists.newArrayList; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.BillCto; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.BillEto; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderPositionEto; - -import java.util.List; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.batch.item.ExecutionContext; -import org.springframework.batch.item.ItemStreamException; -import org.springframework.batch.item.file.ResourceAwareItemWriterItemStream; -import org.springframework.batch.item.file.transform.LineAggregator; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.core.io.Resource; - -/** - * Implementation of ItemWriter. It gets BillCto and writes it in csv format into file. - * - */ -public class BillCompositeWriter implements ResourceAwareItemWriterItemStream, InitializingBean { - - private static final Logger LOG = LoggerFactory.getLogger(BillCompositeWriter.class); - - private ResourceAwareItemWriterItemStream delegate; - - private LineAggregator billLineAggregator; - - private LineAggregator positionLineAggregator; - - private Resource resource; - - /** - * {@inheritDoc} - */ - @Override - public void afterPropertiesSet() throws Exception { - - LOG.debug("Resource: " + this.resource); - - this.delegate.setResource(this.resource); - - } - - /** - * {@inheritDoc} - */ - @Override - public void open(ExecutionContext executionContext) throws ItemStreamException { - - this.delegate.open(executionContext); - - LOG.debug("Bill composite writed opened"); - } - - /** - * {@inheritDoc} - */ - @Override - public void update(ExecutionContext executionContext) throws ItemStreamException { - - this.delegate.update(executionContext); - } - - /** - * {@inheritDoc} - */ - @Override - public void close() throws ItemStreamException { - - this.delegate.close(); - - LOG.debug("Bill composite writed closed"); - } - - /** - * {@inheritDoc} - */ - @Override - public void write(List items) throws Exception { - - List lines = newArrayList(); - for (BillCto item : items) { - String billLine = this.billLineAggregator.aggregate(item.getBill()); - for (OrderPositionEto position : item.getPositions()) { - String positionLine = this.positionLineAggregator.aggregate(position); - lines.add(billLine + "," + positionLine); - LOG.debug("Write bill line, offer name: " + position.getOfferName()); - } - } - this.delegate.write(lines); - } - - /** - * {@inheritDoc} - */ - - @Override - public void setResource(Resource resource) { - - this.resource = resource; - } - - /** - * @param delegate the delegate to set - */ - public void setDelegate(ResourceAwareItemWriterItemStream delegate) { - - this.delegate = delegate; - } - - /** - * @param billLineAggregator the billLineAggregator to set - */ - public void setBillLineAggregator(LineAggregator billLineAggregator) { - - this.billLineAggregator = billLineAggregator; - } - - /** - * @param positionLineAggregator the positionLineAggregator to set - */ - public void setPositionLineAggregator(LineAggregator positionLineAggregator) { - - this.positionLineAggregator = positionLineAggregator; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/common/api/Bill.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/common/api/Bill.java deleted file mode 100644 index 0e90ff839..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/common/api/Bill.java +++ /dev/null @@ -1,56 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.common.api; - -import io.oasp.gastronomy.restaurant.general.common.api.ApplicationEntity; -import io.oasp.gastronomy.restaurant.general.common.api.datatype.Money; -import io.oasp.gastronomy.restaurant.general.common.api.datatype.validation.NotNegativeMoney; - -import java.util.List; - -/** - * This is the interface for a {@link Bill}. It represents the actual payment for an {@link Order}. - * - */ -public interface Bill extends ApplicationEntity { - - /** - * @return the total amount that has to be payed for this {@link Bill}. - */ - Money getTotal(); - - /** - * @param total is the new {@link #getTotal() total amount}. - */ - void setTotal(Money total); - - /** - * @return the tip (voluntary payment in addition to {@link #getTotal() total amount}). - */ - @NotNegativeMoney(message = "The tip must not be negative!") - Money getTip(); - - /** - * @param tip is the new {@link #getTip() tip}. - */ - void setTip(Money tip); - - /** - * @return {@code true} if this {@link Bill} has been payed, {@code false} otherwise. - */ - boolean isPayed(); - - /** - * @param payed is the new value of {@link #isPayed() payed}. - */ - void setPayed(boolean payed); - - /** - * @return the {@link List} with the {@link OrderPosition#getId() IDs} of the {@link OrderPosition}s. - */ - List getOrderPositionIds(); - - /** - * @param ids are the new {@link #getOrderPositionIds() orderPositionIds}. - */ - void setOrderPositionIds(List ids); - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/common/api/Order.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/common/api/Order.java deleted file mode 100644 index ecb350819..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/common/api/Order.java +++ /dev/null @@ -1,39 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.common.api; - -import javax.validation.constraints.NotNull; - -import io.oasp.gastronomy.restaurant.general.common.api.ApplicationEntity; -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype.OrderState; - -/** - * This is the interface for an {@link Order}. It is {@link #getTableId() associated} with a - * {@link io.oasp.gastronomy.restaurant.tablemanagement.common.api.Table} and consists of multiple {@link OrderPosition - * positions}. - * - */ -public interface Order extends ApplicationEntity { - - /** - * @return the {@link io.oasp.gastronomy.restaurant.tablemanagement.common.api.Table#getId() ID} of the associated - * {@link io.oasp.gastronomy.restaurant.tablemanagement.common.api.Table} where this {@link Order} was - * disposed. - */ - @NotNull - long getTableId(); - - /** - * @param tableId the new {@link #getTableId() tableId}. - */ - void setTableId(long tableId); - - /** - * @return the {@link OrderState state} of this {@link Order}. - */ - @NotNull - OrderState getState(); - - /** - * @param state is the new {@link #getState() state}. - */ - void setState(OrderState state); -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/common/api/OrderPosition.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/common/api/OrderPosition.java deleted file mode 100644 index e09d6750b..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/common/api/OrderPosition.java +++ /dev/null @@ -1,114 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.common.api; - -import javax.validation.constraints.NotNull; - -import io.oasp.gastronomy.restaurant.general.common.api.ApplicationEntity; -import io.oasp.gastronomy.restaurant.general.common.api.datatype.Money; -import io.oasp.gastronomy.restaurant.general.common.api.datatype.validation.NotNegativeMoney; -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype.OrderPositionState; -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype.ProductOrderState; - -/** - * This is the interface for an {@link OrderPosition}. - * - */ -public interface OrderPosition extends ApplicationEntity { - - /** - * @return the {@link Order#getId ID} of the {@link Order} this {@link OrderPosition} belongs to. - */ - @NotNull - Long getOrderId(); - - /** - * @param orderId is the new {@link #getOrderId() orderId}. - */ - void setOrderId(Long orderId); - - /** - * @return the {@link io.oasp.gastronomy.restaurant.staffmanagement.common.api.StaffMember#getId() ID} of the - * {@link io.oasp.gastronomy.restaurant.staffmanagement.common.api.StaffMember Cook} assigned to this - * {@link OrderPosition} or {@code null} if it is unassigned. - */ - Long getCookId(); - - /** - * @param cookId the new {@link #getCookId() cook ID} or {@code null} to remove the assignment. - */ - void setCookId(Long cookId); - - /** - * @return the {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Offer#getId() ID} of the - * {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Offer} associated. Not stored as foreign - * key and might not point to an existing - * {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Offer} for historic {@link OrderPosition}s. - */ - @NotNull - Long getOfferId(); - - /** - * @param offerId is the new {@link #getOfferId() offerId}. - */ - void setOfferId(Long offerId); - - /** - * @return the {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Offer#getName() name} of the - * {@link #getOfferId() associated} {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Offer}. - * This is stored redundant so that it is still available later if the - * {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Offer} has been changed. - */ - @NotNull - String getOfferName(); - - /** - * @param offerName is the new {@link #getOfferName() offerName}. - */ - void setOfferName(String offerName); - - /** - * @return the current {@link OrderPositionState state}. - */ - @NotNull - OrderPositionState getState(); - - /** - * @return the current {@link ProductOrderState state}. - */ - ProductOrderState getDrinkState(); - - /** - * @param state the new {@link #getState() state}. - */ - void setState(OrderPositionState state); - - /** - * @param drinkState the new {@link #getDrinkState() state}. - */ - void setDrinkState(ProductOrderState drinkState); - - /** - * @return the price of the {@link #getOfferId() associated} - * {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Offer}. This is stored redundant so that it - * is still available later if the {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Offer} has - * been changed. - */ - @NotNull - @NotNegativeMoney - Money getPrice(); - - /** - * @param price is the new {@link #getPrice() price}. - */ - void setPrice(Money price); - - /** - * @return the comment for this {@link OrderPosition} (e.g. "extra spicy"). - */ - String getComment(); - - /** - * @param comment is the new {@link #getComment() comment}. - */ - void setComment(String comment); - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/common/api/datatype/CreditCardType.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/common/api/datatype/CreditCardType.java deleted file mode 100644 index a2a2492f8..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/common/api/datatype/CreditCardType.java +++ /dev/null @@ -1,44 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype; - -/** - * Enum with the types of a credit card. - * - */ -public enum CreditCardType { - - /** This represents the VISA card. */ - VISA, - - /** This represents the American Express card. */ - AMEX, - - /** This represents the Mastercard. */ - MASTERCARD; - - /** - * @return {@code true}, if the {@link CreditCardType} equals {@link CreditCardType#VISA}. {@code false} - * otherwise. - */ - public boolean isVisa() { - - return this == VISA; - } - - /** - * @return {@code true}, if the {@link CreditCardType} equals {@link CreditCardType#AMEX}. {@code false} - * otherwise. - */ - public boolean isAmex() { - - return this == AMEX; - } - - /** - * @return {@code true}, if the {@link CreditCardType} equals {@link CreditCardType#MASTERCARD}. - * {@code false} otherwise. - */ - public boolean isMastercard() { - - return this == MASTERCARD; - } -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/common/api/datatype/OrderPositionState.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/common/api/datatype/OrderPositionState.java deleted file mode 100644 index 25bff1fe5..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/common/api/datatype/OrderPositionState.java +++ /dev/null @@ -1,85 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype; - -/** - * Represents the {@link io.oasp.gastronomy.restaurant.salesmanagement.common.api.OrderPosition#getState() state} of an - * {@link io.oasp.gastronomy.restaurant.salesmanagement.common.api.OrderPosition}. - * - */ -public enum OrderPositionState { - - /** - * The initial state of an {@link io.oasp.gastronomy.restaurant.salesmanagement.common.api.OrderPosition}. - */ - ORDERED, - - /** - * The state of an {@link io.oasp.gastronomy.restaurant.salesmanagement.common.api.OrderPosition} that has been - * prepared by the kitchen and can be served by the waiter. - */ - PREPARED, - - /** - * The state of an {@link io.oasp.gastronomy.restaurant.salesmanagement.common.api.OrderPosition} that has been - * delivered been delivered to the table by the waiter. - */ - DELIVERED, - - /** - * The state of an {@link io.oasp.gastronomy.restaurant.salesmanagement.common.api.OrderPosition} that has been payed - * by the customer. - */ - PAYED, - - /** - * The state of an {@link io.oasp.gastronomy.restaurant.salesmanagement.common.api.OrderPosition} that has been - * cancelled. - */ - CANCELLED; - - /** - * @return {@code true} if the - * {@link io.oasp.gastronomy.restaurant.salesmanagement.dataaccess.api.OrderPositionEntity} is ordered - */ - public boolean isOrdered() { - - return (this == ORDERED); - } - - /** - * @return {@code true} if the - * {@link io.oasp.gastronomy.restaurant.salesmanagement.dataaccess.api.OrderPositionEntity} is closed (has - * reached its final state). - */ - public boolean isClosed() { - - return ((this == PAYED) || (this == CANCELLED)); - } - - /** - * @return {@code true} if the - * {@link io.oasp.gastronomy.restaurant.salesmanagement.dataaccess.api.OrderPositionEntity} is delivered. - */ - public boolean isDelivered() { - - return (this == DELIVERED); - } - - /** - * @return {@code true} if the - * {@link io.oasp.gastronomy.restaurant.salesmanagement.dataaccess.api.OrderPositionEntity} is prepared - */ - public boolean isPrepared() { - - return (this == PREPARED); - } - - /** - * @return {@code true} if the - * {@link io.oasp.gastronomy.restaurant.salesmanagement.dataaccess.api.OrderPositionEntity} is payed - */ - public boolean isPayed() { - - return (this == PAYED); - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/common/api/datatype/OrderState.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/common/api/datatype/OrderState.java deleted file mode 100644 index bc4a02680..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/common/api/datatype/OrderState.java +++ /dev/null @@ -1,39 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype; - -/** - * Represents the state of an {@link io.oasp.gastronomy.restaurant.salesmanagement.common.api.Order}. - * - */ -public enum OrderState { - - /** - * The state if the {@link io.oasp.gastronomy.restaurant.salesmanagement.common.api.Order} has at least one open - * {@link io.oasp.gastronomy.restaurant.salesmanagement.common.api.OrderPosition}. - */ - OPEN, - - /** - * The state if the {@link io.oasp.gastronomy.restaurant.salesmanagement.common.api.Order} is closed. Then also all - * {@link io.oasp.gastronomy.restaurant.salesmanagement.common.api.OrderPosition} have to be closed. - */ - CLOSED; - - /** - * @return {@code true} if the {@link io.oasp.gastronomy.restaurant.salesmanagement.dataaccess.api.OrderEntity} - * is ordered - */ - public boolean isOpen() { - - return (this == OPEN); - } - - /** - * @return {@code true} if the {@link io.oasp.gastronomy.restaurant.salesmanagement.dataaccess.api.OrderEntity} - * is closed (has reached its final state). - */ - public boolean isClosed() { - - return ((this == CLOSED)); - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/common/api/datatype/PaymentStatus.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/common/api/datatype/PaymentStatus.java deleted file mode 100644 index 14a231eb7..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/common/api/datatype/PaymentStatus.java +++ /dev/null @@ -1,39 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype; - -/** - * - */ -public enum PaymentStatus { - - /** - * This status describes a successful payment transaction. - */ - SUCCESS, - - /** - * This status describes a unsuccessful payment transaction. The input data is not correct. - */ - INPUT_DATA_ERROR, - - /** - * This status describes a unsuccessful payment transaction. The connection timed out. - */ - TIME_OUT_ERROR; - - /** - * @return {@code true}, if the {@link PaymentStatus} equals {@link PaymentStatus#SUCCESS}. - * {@code false} otherwise. - */ - public boolean isSuccessful() { - return this == SUCCESS; - } - - /** - * - * @return {@code true}, if the {@link PaymentStatus} equals {@link PaymentStatus#INPUT_DATA_ERROR} - * or {@link PaymentStatus#TIME_OUT_ERROR}. {@code false} otherwise. - */ - public boolean isUnsuccessful() { - return (this == INPUT_DATA_ERROR || this == TIME_OUT_ERROR); - } -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/common/api/datatype/ProductOrderState.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/common/api/datatype/ProductOrderState.java deleted file mode 100644 index a6bdba3bd..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/common/api/datatype/ProductOrderState.java +++ /dev/null @@ -1,54 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype; - -/** - * Represents the {@link io.oasp.gastronomy.restaurant.salesmanagement.common.api.OrderPosition#getDrinkState() state} - * of an {@link io.oasp.gastronomy.restaurant.salesmanagement.common.api.OrderPosition}. - * - */ -public enum ProductOrderState { - - /** - * The initial state of a {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Drink }. - */ - ORDERED, - - /** - * The state of a {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Drink} that has been prepared by the - * bar keeper and can be served by the waiter. - */ - PREPARED, - - /** - * The state of a {@link io.oasp.gastronomy.restaurant.offermanagement.common.api.Drink} that has been delivered to - * the table by the waiter. - */ - DELIVERED; - - /** - * @return true if the {@link io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.DrinkEntity} - * is ordered - */ - public boolean isOrdered() { - - return (this == ORDERED); - } - - /** - * @return true if the {@link io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.DrinkEntity} - * is prepared - */ - public boolean isPrepared() { - - return (this == PREPARED); - } - - /** - * @return true if the {@link io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.DrinkEntity} - * is delivered. - */ - public boolean isDelivered() { - - return (this == DELIVERED); - } - -} \ No newline at end of file diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/common/api/exception/ChangeTableIllegalStateCombinationException.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/common/api/exception/ChangeTableIllegalStateCombinationException.java deleted file mode 100644 index 0b35f35fe..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/common/api/exception/ChangeTableIllegalStateCombinationException.java +++ /dev/null @@ -1,33 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.common.api.exception; - -import io.oasp.gastronomy.restaurant.general.common.api.NlsBundleApplicationRoot; -import io.oasp.gastronomy.restaurant.general.common.api.exception.ApplicationBusinessException; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderEto; -import io.oasp.gastronomy.restaurant.tablemanagement.logic.api.to.TableEto; - -/** - * This exception is thrown if a table has a specific state(occupied) that is illegal for the UcChangeTableImpl and - * caused it to fail. - * - */ -public class ChangeTableIllegalStateCombinationException extends ApplicationBusinessException { - - /** - * UID for serialization. - */ - private static final long serialVersionUID = 1L; - - /** - * - * The constructor. - * - * @param order OrderEto which is going to be transfered to the targetTable - * @param targetTable is the table which is getting the Order - */ - public ChangeTableIllegalStateCombinationException(OrderEto order, TableEto targetTable) { - - super(createBundle(NlsBundleApplicationRoot.class).errorChangeTableIllegalStateCombination(order.getId(), - targetTable.getNumber())); - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/dataaccess/api/BillEntity.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/dataaccess/api/BillEntity.java deleted file mode 100644 index 88d90b286..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/dataaccess/api/BillEntity.java +++ /dev/null @@ -1,137 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.dataaccess.api; - -import java.util.ArrayList; -import java.util.List; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.JoinColumn; -import javax.persistence.JoinTable; -import javax.persistence.ManyToMany; -import javax.persistence.Table; -import javax.persistence.Transient; - -import io.oasp.gastronomy.restaurant.general.common.api.datatype.Money; -import io.oasp.gastronomy.restaurant.general.dataaccess.api.ApplicationPersistenceEntity; -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.Bill; -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.OrderPosition; - -/** - * {@link ApplicationPersistenceEntity Entity} that represents the {@link Bill} related to one or multiple - * {@link OrderPosition order positions}. - * - */ -@Entity -@Table(name = "Bill") -public class BillEntity extends ApplicationPersistenceEntity implements Bill { - - private static final long serialVersionUID = 1L; - - private boolean payed; - - private List orderPositions; - - private Money total; - - private Money tip; - - /** - * The constructor. - */ - public BillEntity() { - - super(); - } - - /** - * @return the {@link List} of {@link OrderPositionEntity} objects associated with this {@link BillEntity}. - */ - @ManyToMany(fetch = FetchType.EAGER) - @Column(name = "orderPositionsId") - @JoinTable(name = "BillOrderPosition", joinColumns = { - @JoinColumn(name = "billId") }, inverseJoinColumns = @JoinColumn(name = "orderPositionsId") - - ) - - public List getOrderPositions() { - - return this.orderPositions; - } - - @Override - @Transient - public List getOrderPositionIds() { - - if (this.orderPositions == null) { - return null; - } - List result = new ArrayList<>(this.orderPositions.size()); - for (OrderPositionEntity position : this.orderPositions) { - result.add(position.getId()); - } - return result; - } - - @Override - public void setOrderPositionIds(List ids) { - - if (ids == null) { - this.orderPositions = null; - } else { - List list = new ArrayList<>(ids.size()); - for (Long id : ids) { - OrderPositionEntity position = new OrderPositionEntity(); - position.setId(id); - list.add(position); - } - this.orderPositions = list; - } - } - - /** - * Sets the field 'orderPositions'. - * - * @param orderPositions New value for orderPositions - */ - public void setOrderPositions(List orderPositions) { - - this.orderPositions = orderPositions; - } - - @Override - public Money getTotal() { - - return this.total; - } - - @Override - public void setTotal(Money total) { - - this.total = total; - } - - @Override - public Money getTip() { - - return this.tip; - } - - @Override - public void setTip(Money tip) { - - this.tip = tip; - } - - @Override - public boolean isPayed() { - - return this.payed; - } - - @Override - public void setPayed(boolean payed) { - - this.payed = payed; - } -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/dataaccess/api/OrderEntity.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/dataaccess/api/OrderEntity.java deleted file mode 100644 index 11dca3ec9..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/dataaccess/api/OrderEntity.java +++ /dev/null @@ -1,64 +0,0 @@ -/** - * - */ -package io.oasp.gastronomy.restaurant.salesmanagement.dataaccess.api; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Table; - -import io.oasp.gastronomy.restaurant.general.dataaccess.api.ApplicationPersistenceEntity; -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.Order; -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype.OrderState; - -/** - * {@link ApplicationPersistenceEntity Entity} that represents an {@link Order} of a customer associated with the - * according {@link io.oasp.gastronomy.restaurant.tablemanagement.dataaccess.api.TableEntity}. - * - */ -@Entity -// Order is a reserved word in SQL/RDBMS and can not be used as table name -@Table(name = "RestaurantOrder") -public class OrderEntity extends ApplicationPersistenceEntity implements Order { - - private static final long serialVersionUID = 1L; - - private long tableId; - - private OrderState state; - - /** - * The constructor. - */ - public OrderEntity() { - - super(); - this.state = OrderState.OPEN; - } - - @Override - @Column(name = "tableId") - public long getTableId() { - - return this.tableId; - } - - @Override - public void setTableId(long tableId) { - - this.tableId = tableId; - } - - @Override - public OrderState getState() { - - return this.state; - } - - @Override - public void setState(OrderState state) { - - this.state = state; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/dataaccess/api/OrderPositionEntity.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/dataaccess/api/OrderPositionEntity.java deleted file mode 100644 index 43aa75267..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/dataaccess/api/OrderPositionEntity.java +++ /dev/null @@ -1,191 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.dataaccess.api; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Table; -import javax.persistence.Transient; -import javax.validation.constraints.NotNull; - -import io.oasp.gastronomy.restaurant.general.common.api.datatype.Money; -import io.oasp.gastronomy.restaurant.general.dataaccess.api.ApplicationPersistenceEntity; -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.OrderPosition; -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype.OrderPositionState; -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype.ProductOrderState; - -/** - * {@link ApplicationPersistenceEntity Entity} that represents a single {@link OrderPosition position} of an - * {@link OrderEntity}. - * - */ -@Entity -@Table(name = "OrderPosition") -public class OrderPositionEntity extends ApplicationPersistenceEntity implements OrderPosition { - - private static final long serialVersionUID = 1L; - - private OrderEntity order; - - private Long cookId; - - private Long offerId; - - private String offerName; - - private OrderPositionState state; - - private ProductOrderState drinkState; - - private Money price; - - private String comment; - - /** - * The constructor. - */ - public OrderPositionEntity() { - - super(); - this.state = OrderPositionState.ORDERED; - } - - /** - * @return the {@link OrderEntity order} this {@link OrderPositionEntity} is associated with. - */ - @ManyToOne(fetch = FetchType.EAGER) - @JoinColumn(name = "orderId") - @NotNull - public OrderEntity getOrder() { - - return this.order; - } - - /** - * @param order the new value of {@link #getOrder()}. - */ - public void setOrder(OrderEntity order) { - - this.order = order; - } - - @Override - @Transient - public Long getOrderId() { - - if (this.order == null) { - return null; - } - return this.order.getId(); - } - - @Override - public void setOrderId(Long orderId) { - - if (orderId == null) { - this.order = null; - } - OrderEntity orderEntity = new OrderEntity(); - orderEntity.setId(orderId); - this.order = orderEntity; - } - - @Override - @Column(name = "cookId") - public Long getCookId() { - - return this.cookId; - } - - @Override - public void setCookId(Long cookId) { - - this.cookId = cookId; - } - - @Override - @Column(name = "offerId") - public Long getOfferId() { - - return this.offerId; - } - - @Override - public void setOfferId(Long offerId) { - - this.offerId = offerId; - } - - @Override - public String getOfferName() { - - return this.offerName; - } - - @Override - public void setOfferName(String offerName) { - - this.offerName = offerName; - } - - @Override - public OrderPositionState getState() { - - return this.state; - } - - @Override - public void setState(OrderPositionState state) { - - this.state = state; - } - - @Override - public Money getPrice() { - - return this.price; - } - - @Override - public void setPrice(Money price) { - - this.price = price; - } - - @Override - /* - * Uncomment the following Column annotation if the database used is Oracle 11g - */ - // @Column(name = "\"comment\"") - public String getComment() { - - return this.comment; - } - - @Override - public void setComment(String comment) { - - this.comment = comment; - } - - /** - * {@inheritDoc} - */ - @Override - public ProductOrderState getDrinkState() { - - return this.drinkState; - } - - /** - * {@inheritDoc} - */ - @Override - public void setDrinkState(ProductOrderState drinkState) { - - this.drinkState = drinkState; - - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/dataaccess/api/dao/BillDao.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/dataaccess/api/dao/BillDao.java deleted file mode 100644 index b4a9a1114..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/dataaccess/api/dao/BillDao.java +++ /dev/null @@ -1,12 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.dataaccess.api.dao; - -import io.oasp.gastronomy.restaurant.general.dataaccess.api.dao.ApplicationDao; -import io.oasp.gastronomy.restaurant.salesmanagement.dataaccess.api.BillEntity; - -/** - * {@link ApplicationDao Data Access Object} for {@link BillEntity} entity. - * - */ -public interface BillDao extends ApplicationDao { - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/dataaccess/api/dao/OrderDao.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/dataaccess/api/dao/OrderDao.java deleted file mode 100644 index 0f830fb98..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/dataaccess/api/dao/OrderDao.java +++ /dev/null @@ -1,34 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.dataaccess.api.dao; - -import io.oasp.gastronomy.restaurant.general.dataaccess.api.dao.ApplicationDao; -import io.oasp.gastronomy.restaurant.salesmanagement.dataaccess.api.OrderEntity; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderSearchCriteriaTo; -import io.oasp.module.jpa.common.api.to.PaginatedListTo; - -import java.util.List; - -/** - * {@link ApplicationDao Data Access Object} for {@link OrderEntity} entity. - * - */ -public interface OrderDao extends ApplicationDao { - - /** - * @param tableId the {@link io.oasp.gastronomy.restaurant.tablemanagement.dataaccess.api.TableEntity#getNumber() - * table ID} for which the open {@link OrderEntity} is requested. - * @return the {@link OrderEntity} with the given {@link OrderEntity#getTableId() table ID} in - * {@link OrderEntity#getState() state} - * {@link io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype.OrderState#OPEN} or - * {@code null} if no such entity exists. - */ - OrderEntity findOpenOrderByTable(long tableId); - - /** - * Finds the {@link OrderEntity orders} matching the given {@link OrderSearchCriteriaTo}. - * - * @param criteria is the {@link OrderSearchCriteriaTo}. - * @return the {@link List} with the matching {@link OrderEntity} objects. - */ - PaginatedListTo findOrders(OrderSearchCriteriaTo criteria); - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/dataaccess/api/dao/OrderPositionDao.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/dataaccess/api/dao/OrderPositionDao.java deleted file mode 100644 index 83dea7ee7..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/dataaccess/api/dao/OrderPositionDao.java +++ /dev/null @@ -1,41 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.dataaccess.api.dao; - -import io.oasp.gastronomy.restaurant.general.dataaccess.api.dao.ApplicationDao; -import io.oasp.gastronomy.restaurant.salesmanagement.dataaccess.api.OrderPositionEntity; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderPositionSearchCriteriaTo; - -import java.util.List; - -/** - * {@link ApplicationDao Data Access Object} for {@link OrderPositionEntity} entity. - * - */ -public interface OrderPositionDao extends ApplicationDao { - - /** - * @param orderId is the {@link io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderEto#getId() ID} for - * which the {@link OrderPositionEntity}s are requested. - * @return the {@link List} of all {@link OrderPositionEntity}s {@link OrderPositionEntity#getOrderId() associated} - * with the given orderId. - */ - List findOrderPositionsByOrder(Long orderId); - - /** - * @param orderId is the {@link io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderEto#getId() table ID} - * for which the {@link OrderPositionEntity}s are requested. - * @return the {@link List} of all {@link OrderPositionEntity}s that are NOT - * {@link io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype.OrderPositionState#isClosed() - * closed} and are {@link io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderEto#getId() table - * ID} with the given {@link io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderEto}. Will be the - * empty {@link List} if no such {@link OrderPositionEntity} exists. - */ - List findOpenOrderPositionsByOrder(Long orderId); - - /** - * Finds the {@link OrderPositionEntity order positions} matching the given {@link OrderPositionSearchCriteriaTo}. - * - * @param criteria is the {@link OrderPositionSearchCriteriaTo}. - * @return the {@link List} with the matching {@link OrderPositionEntity} objects. - */ - List findOrderPositions(OrderPositionSearchCriteriaTo criteria); -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/dataaccess/impl/dao/BillDaoImpl.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/dataaccess/impl/dao/BillDaoImpl.java deleted file mode 100644 index aed0f6a75..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/dataaccess/impl/dao/BillDaoImpl.java +++ /dev/null @@ -1,22 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.dataaccess.impl.dao; - -import io.oasp.gastronomy.restaurant.general.dataaccess.base.dao.ApplicationDaoImpl; -import io.oasp.gastronomy.restaurant.salesmanagement.dataaccess.api.BillEntity; -import io.oasp.gastronomy.restaurant.salesmanagement.dataaccess.api.dao.BillDao; - -import javax.inject.Named; - -/** - * Implementation of {@link BillDao}. - * - */ -@Named -public class BillDaoImpl extends ApplicationDaoImpl implements BillDao { - - @Override - public Class getEntityClass() { - - return BillEntity.class; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/dataaccess/impl/dao/OrderDaoImpl.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/dataaccess/impl/dao/OrderDaoImpl.java deleted file mode 100644 index 4d8e4c790..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/dataaccess/impl/dao/OrderDaoImpl.java +++ /dev/null @@ -1,82 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.dataaccess.impl.dao; - -import static com.mysema.query.alias.Alias.$; -import io.oasp.gastronomy.restaurant.general.common.api.constants.NamedQueries; -import io.oasp.gastronomy.restaurant.general.dataaccess.base.dao.ApplicationDaoImpl; -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype.OrderState; -import io.oasp.gastronomy.restaurant.salesmanagement.dataaccess.api.OrderEntity; -import io.oasp.gastronomy.restaurant.salesmanagement.dataaccess.api.dao.OrderDao; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderSearchCriteriaTo; -import io.oasp.module.jpa.common.api.to.PaginatedListTo; - -import java.util.List; - -import javax.inject.Named; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.mysema.query.alias.Alias; -import com.mysema.query.jpa.impl.JPAQuery; -import com.mysema.query.types.path.EntityPathBase; - -/** - * Implementation of {@link OrderDao}. - * - */ -@Named -public class OrderDaoImpl extends ApplicationDaoImpl implements OrderDao { - - /** Logger instance. */ - private static final Logger LOG = LoggerFactory.getLogger(OrderDaoImpl.class); - - /** - * The constructor. - */ - public OrderDaoImpl() { - - super(); - } - - @Override - public Class getEntityClass() { - - return OrderEntity.class; - } - - @Override - public OrderEntity findOpenOrderByTable(long tableId) { - - List resultList = - getEntityManager().createNamedQuery(NamedQueries.GET_OPEN_ORDER_FOR_TABLE, OrderEntity.class) - .setParameter("tableId", tableId).getResultList(); - if (resultList.isEmpty()) { - return null; - } else { - if (resultList.size() > 1) { - // In this case we can be robust and continue even though a data inconsistency has been detected. - LOG.error("Multiple open orders found for table {}: {}", Long.valueOf(tableId), resultList); - } - return resultList.get(0); - } - } - - @Override - public PaginatedListTo findOrders(OrderSearchCriteriaTo criteria) { - - OrderEntity order = Alias.alias(OrderEntity.class); - EntityPathBase alias = $(order); - JPAQuery query = new JPAQuery(getEntityManager()).from(alias); - - Long tableId = criteria.getTableId(); - if (tableId != null) { - query.where($(order.getTableId()).eq(tableId)); - } - OrderState state = criteria.getState(); - if (state != null) { - query.where($(order.getState()).eq(state)); - } - - return findPaginated(criteria, query, alias); - } -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/dataaccess/impl/dao/OrderPositionDaoImpl.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/dataaccess/impl/dao/OrderPositionDaoImpl.java deleted file mode 100644 index 6caad226e..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/dataaccess/impl/dao/OrderPositionDaoImpl.java +++ /dev/null @@ -1,92 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.dataaccess.impl.dao; - -import io.oasp.gastronomy.restaurant.general.common.api.constants.NamedQueries; -import io.oasp.gastronomy.restaurant.general.dataaccess.base.dao.ApplicationDaoImpl; -import io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.OfferEntity; -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype.OrderPositionState; -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype.ProductOrderState; -import io.oasp.gastronomy.restaurant.salesmanagement.dataaccess.api.OrderPositionEntity; -import io.oasp.gastronomy.restaurant.salesmanagement.dataaccess.api.dao.OrderPositionDao; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderPositionSearchCriteriaTo; - -import java.util.List; - -import javax.inject.Named; - -import com.mysema.query.alias.Alias; -import com.mysema.query.jpa.JPASubQuery; -import com.mysema.query.jpa.impl.JPAQuery; -import com.mysema.query.types.path.EntityPathBase; -import com.mysema.query.types.query.ListSubQuery; - -/** - * Implementation of {@link OrderPositionDao}. - * - */ -@Named -public class OrderPositionDaoImpl extends ApplicationDaoImpl implements OrderPositionDao { - - @Override - public Class getEntityClass() { - - return OrderPositionEntity.class; - } - - @Override - public List findOrderPositionsByOrder(Long orderId) { - - OrderPositionEntity orderPosition = Alias.alias(OrderPositionEntity.class); - EntityPathBase alias = Alias.$(orderPosition); - JPAQuery query = new JPAQuery(getEntityManager()).from(alias); - query.where(Alias.$(orderPosition.getOrder().getId()).eq(orderId)); - return query.list(alias); - } - - @Override - public List findOpenOrderPositionsByOrder(Long orderId) { - - return getEntityManager() - .createNamedQuery(NamedQueries.GET_OPEN_ORDER_POSITIONS_FOR_ORDER, OrderPositionEntity.class) - .setParameter("orderId", orderId).getResultList(); - } - - @Override - public List findOrderPositions(OrderPositionSearchCriteriaTo criteria) { - - OrderPositionEntity orderPosition = Alias.alias(OrderPositionEntity.class); - EntityPathBase alias = Alias.$(orderPosition); - JPAQuery query = new JPAQuery(getEntityManager()).from(alias); - Long orderId = criteria.getOrderId(); - if (orderId != null) { - query.where(Alias.$(orderPosition.getOrder().getId()).eq(orderId)); - } - Long cookId = criteria.getCookId(); - if (cookId != null) { - query.where(Alias.$(orderPosition.getCookId()).eq(cookId)); - } - OrderPositionState state = criteria.getState(); - if (state != null) { - query.where(Alias.$(orderPosition.getState()).eq(state)); - } - ProductOrderState drinkState = criteria.getDrinkState(); - if (drinkState != null) { - query.where(Alias.$(orderPosition.getDrinkState()).eq(drinkState)); - } - if (criteria.isMealOrSideDish()) { - OfferEntity offer = Alias.alias(OfferEntity.class); - EntityPathBase offerAlias = Alias.$(offer); - JPASubQuery subQuery = - new JPASubQuery().from(offerAlias).where( - Alias.$(offer.getMeal().getId()).isNotNull().or(Alias.$(offer.getSideDish().getId()).isNotNull())); - ListSubQuery listSubQuery = subQuery.list(Alias.$(offer.getId())); - query.where(Alias.$(orderPosition.getOfferId()).in(listSubQuery)); - - // - // - // query.innerJoin(offer.).on(Alias.$(orderPosition.getOfferId()).eq(Alias.$(offer.getId()))) - // .where(Alias.$(offer.getMealId()).isNotNull().or(Alias.$(offer.getSideDishId()).isNotNull())); - } - applyPagination(criteria.getPagination(), query); - return query.list(alias); - } -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/Salesmanagement.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/Salesmanagement.java deleted file mode 100644 index dbf5deb0a..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/Salesmanagement.java +++ /dev/null @@ -1,18 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.logic.api; - -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.usecase.UcChangeTable; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.usecase.UcFindBill; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.usecase.UcFindOrder; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.usecase.UcFindOrderPosition; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.usecase.UcManageBill; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.usecase.UcManageOrder; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.usecase.UcManageOrderPosition; - -/** - * This is the interface for the {@link Salesmanagement} component of the application core. - * - */ -public interface Salesmanagement extends UcChangeTable, UcFindBill, UcFindOrder, UcFindOrderPosition, UcManageBill, - UcManageOrder, UcManageOrderPosition { - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/to/BankPaymentData.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/to/BankPaymentData.java deleted file mode 100644 index 046c3c986..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/to/BankPaymentData.java +++ /dev/null @@ -1,99 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to; - -/** - * This class acts as a POJO. - * - */ -public class BankPaymentData extends PaymentData { - - private static final long serialVersionUID = 1L; - - private String accountOwnerName; - - private Long accountNumber; - - private Long bankCode; - - private String bankName; - - /** - * Returns the field 'accountOwnerName'. - * - * @return Value of accountOwnerName - */ - public String getAccountOwnerName() { - - return this.accountOwnerName; - } - - /** - * Sets the field 'accountOwnerName'. - * - * @param accountOwnerName New value for accountOwnerName - */ - public void setAccountOwnerName(String accountOwnerName) { - - this.accountOwnerName = accountOwnerName; - } - - /** - * Returns the field 'accountNumber'. - * - * @return Value of accountNumber - */ - public Long getAccountNumber() { - - return this.accountNumber; - } - - /** - * Sets the field 'accountNumber'. - * - * @param accountNumber New value for accountNumber - */ - public void setAccountNumber(Long accountNumber) { - - this.accountNumber = accountNumber; - } - - /** - * Returns the field 'bankCode'. - * - * @return Value of bankCode - */ - public Long getBankCode() { - - return this.bankCode; - } - - /** - * Sets the field 'bankCode'. - * - * @param bankCode New value for bankCode - */ - public void setBankCode(Long bankCode) { - - this.bankCode = bankCode; - } - - /** - * Returns the field 'bankName'. - * - * @return Value of bankName - */ - public String getBankName() { - - return this.bankName; - } - - /** - * Sets the field 'bankName'. - * - * @param bankName New value for bankName - */ - public void setBankName(String bankName) { - - this.bankName = bankName; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/to/BillCto.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/to/BillCto.java deleted file mode 100644 index 7a270da55..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/to/BillCto.java +++ /dev/null @@ -1,64 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to; - -import io.oasp.module.basic.common.api.to.AbstractCto; - -import java.util.ArrayList; -import java.util.List; - -/** - * {@link AbstractCto CTO} for an {@link #getBill() bill} with its {@link #getPositions() positions}. - * - */ -public class BillCto extends AbstractCto { - - /** UID for serialization. */ - private static final long serialVersionUID = 1L; - - private BillEto bill; - - private List positions; - - /** - * The constructor. - */ - public BillCto() { - - super(); - } - - /** - * @return positions - */ - public List getPositions() { - - if (this.positions == null) { - this.positions = new ArrayList<>(); - } - return this.positions; - } - - /** - * @param positions the positions to set - */ - public void setPositions(List positions) { - - this.positions = positions; - } - - /** - * @param bill the bill to set - */ - public void setBill(BillEto bill) { - - this.bill = bill; - } - - /** - * @return bill - */ - public BillEto getBill() { - - return this.bill; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/to/BillEto.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/to/BillEto.java deleted file mode 100644 index 6d6cf4706..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/to/BillEto.java +++ /dev/null @@ -1,81 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to; - -import io.oasp.gastronomy.restaurant.general.common.api.datatype.Money; -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.Bill; -import io.oasp.module.basic.common.api.to.AbstractEto; - -import java.util.List; - -/** - * {@link AbstractEto ETO} for {@link Bill}. - * - */ -public class BillEto extends AbstractEto implements Bill { - - private static final long serialVersionUID = 1L; - - private boolean payed; - - private List orderPositionIds; - - private Money total; - - private Money tip; - - /** - * The constructor. - */ - public BillEto() { - - super(); - } - - @Override - public List getOrderPositionIds() { - - return this.orderPositionIds; - } - - @Override - public void setOrderPositionIds(List orderPositions) { - - this.orderPositionIds = orderPositions; - } - - @Override - public Money getTotal() { - - return this.total; - } - - @Override - public void setTotal(Money total) { - - this.total = total; - } - - @Override - public Money getTip() { - - return this.tip; - } - - @Override - public void setTip(Money tip) { - - this.tip = tip; - } - - @Override - public boolean isPayed() { - - return this.payed; - } - - @Override - public void setPayed(boolean payed) { - - this.payed = payed; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/to/CreditCardPaymentData.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/to/CreditCardPaymentData.java deleted file mode 100644 index 05d9f8132..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/to/CreditCardPaymentData.java +++ /dev/null @@ -1,145 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to; - -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype.CreditCardType; - -/** - * This class acts as a POJO. - * - */ -public class CreditCardPaymentData extends PaymentData { - - private static final long serialVersionUID = 1L; - - private String creditCardNumber; - - private String creditCardCode; - - private String creditCardOwnerName; - - private String creditCardOwnerSurname; - - private String creditCardEndOfValidity; - - private CreditCardType creditCardType; - - /** - * Returns the field 'creditCardNumber'. - * - * @return Value of creditCardNumber - */ - public String getCreditCardNumber() { - - return this.creditCardNumber; - } - - /** - * Sets the field 'creditCardNumber'. - * - * @param creditCardNumber New value for creditCardNumber - */ - public void setCreditCardNumber(String creditCardNumber) { - - this.creditCardNumber = creditCardNumber; - } - - /** - * Returns the field 'creditCardCode'. - * - * @return Value of creditCardCode - */ - public String getCreditCardCode() { - - return this.creditCardCode; - } - - /** - * Sets the field 'creditCardCode'. - * - * @param creditCardCode New value for creditCardCode - */ - public void setCreditCardCode(String creditCardCode) { - - this.creditCardCode = creditCardCode; - } - - /** - * Returns the field 'creditCardOwnerName'. - * - * @return Value of creditCardOwnerName - */ - public String getCreditCardOwnerName() { - - return this.creditCardOwnerName; - } - - /** - * Sets the field 'creditCardOwnerName'. - * - * @param creditCardOwnerName New value for creditCardOwnerName - */ - public void setCreditCardOwnerName(String creditCardOwnerName) { - - this.creditCardOwnerName = creditCardOwnerName; - } - - /** - * Returns the field 'creditCardOwnerSurname'. - * - * @return Value of creditCardOwnerSurname - */ - public String getCreditCardOwnerSurname() { - - return this.creditCardOwnerSurname; - } - - /** - * Sets the field 'creditCardOwnerSurname'. - * - * @param creditCardOwnerSurname New value for creditCardOwnerSurname - */ - public void setCreditCardOwnerSurname(String creditCardOwnerSurname) { - - this.creditCardOwnerSurname = creditCardOwnerSurname; - } - - /** - * Returns the field 'creditCardEndOfValidity'. - * - * @return Value of creditCardEndOfValidity - */ - public String getCreditCardEndOfValidity() { - - return this.creditCardEndOfValidity; - } - - /** - * Sets the field 'creditCardEndOfValidity'. - * - * @param creditCardEndOfValidity New value for creditCardEndOfValidity - */ - public void setCreditCardEndOfValidity(String creditCardEndOfValidity) { - - this.creditCardEndOfValidity = creditCardEndOfValidity; - } - - /** - * Returns the field 'creditCardType'. - * - * @return Value of creditCardType - */ - public CreditCardType getCreditCardType() { - - return this.creditCardType; - } - - /** - * Sets the field 'creditCardType'. - * - * @param creditCardType New value for creditCardType - */ - public void setCreditCardType(CreditCardType creditCardType) { - - this.creditCardType = creditCardType; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/to/OrderCto.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/to/OrderCto.java deleted file mode 100644 index b17ca2fa5..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/to/OrderCto.java +++ /dev/null @@ -1,63 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to; - -import io.oasp.module.basic.common.api.to.AbstractCto; - -import java.util.ArrayList; -import java.util.List; - -/** - * {@link AbstractCto CTO} for an {@link #getOrder() order} with its {@link #getPositions() positions}. - * - */ -public class OrderCto extends AbstractCto { - - /** UID for serialization. */ - private static final long serialVersionUID = 1L; - - private OrderEto order; - - private List positions; - - /** - * The constructor. - */ - public OrderCto() { - - super(); - } - - /** - * @return orderEto - */ - public OrderEto getOrder() { - - return this.order; - } - - /** - * @param orderEto the orderEto to set - */ - public void setOrder(OrderEto orderEto) { - - this.order = orderEto; - } - - /** - * @return positions - */ - public List getPositions() { - - if (this.positions == null) { - this.positions = new ArrayList<>(); - } - return this.positions; - } - - /** - * @param positions the positions to set - */ - public void setPositions(List positions) { - - this.positions = positions; - } -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/to/OrderEto.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/to/OrderEto.java deleted file mode 100644 index 2ea38a15d..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/to/OrderEto.java +++ /dev/null @@ -1,54 +0,0 @@ -/** - * - */ -package io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to; - -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.Order; -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype.OrderState; -import io.oasp.module.basic.common.api.to.AbstractEto; - -/** - * {@link AbstractEto ETO} for an {@link Order}. - * - */ -public class OrderEto extends AbstractEto implements Order { - - private static final long serialVersionUID = 1L; - - private long tableId; - - private OrderState state; - - /** - * The constructor. - */ - public OrderEto() { - - this.state = OrderState.OPEN; - } - - @Override - public long getTableId() { - - return this.tableId; - } - - @Override - public void setTableId(long tableId) { - - this.tableId = tableId; - } - - @Override - public OrderState getState() { - - return this.state; - } - - @Override - public void setState(OrderState state) { - - this.state = state; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/to/OrderPositionEto.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/to/OrderPositionEto.java deleted file mode 100644 index 2217eee06..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/to/OrderPositionEto.java +++ /dev/null @@ -1,156 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to; - -import io.oasp.gastronomy.restaurant.general.common.api.datatype.Money; -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.OrderPosition; -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype.OrderPositionState; -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype.ProductOrderState; -import io.oasp.module.basic.common.api.to.AbstractEto; - -/** - * {@link AbstractEto ETO} for an {@link OrderPosition}. - * - */ -public class OrderPositionEto extends AbstractEto implements OrderPosition { - - private static final long serialVersionUID = 1L; - - private Long orderId; - - private Long cookId; - - private Long offerId; - - private String offerName; - - private OrderPositionState state; - - private ProductOrderState drinkState; - - private Money price; - - private String comment; - - /** - * The constructor. - */ - public OrderPositionEto() { - - this.state = OrderPositionState.ORDERED; - - } - - @Override - public Long getOrderId() { - - return this.orderId; - } - - @Override - public void setOrderId(Long orderId) { - - this.orderId = orderId; - } - - @Override - public Long getCookId() { - - return this.cookId; - } - - @Override - public void setCookId(Long cookId) { - - this.cookId = cookId; - } - - @Override - public Long getOfferId() { - - return this.offerId; - } - - @Override - public void setOfferId(Long offerId) { - - this.offerId = offerId; - } - - @Override - public String getOfferName() { - - return this.offerName; - } - - @Override - public void setOfferName(String offerName) { - - this.offerName = offerName; - } - - @Override - public OrderPositionState getState() { - - return this.state; - } - - @Override - public void setState(OrderPositionState state) { - - this.state = state; - } - - @Override - public Money getPrice() { - - return this.price; - } - - @Override - public void setPrice(Money price) { - - this.price = price; - } - - /** - * Returns the field 'comment'. - * - * @return Comment as string - */ - @Override - public String getComment() { - - return this.comment; - } - - /** - * Sets the field 'comment'. - * - * @param comment new value for comment - */ - @Override - public void setComment(String comment) { - - this.comment = comment; - } - - /** - * {@inheritDoc} - */ - @Override - public ProductOrderState getDrinkState() { - - return this.drinkState; - - } - - /** - * {@inheritDoc} - */ - @Override - public void setDrinkState(ProductOrderState drinkState) { - - this.drinkState = drinkState; - - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/to/OrderPositionSearchCriteriaTo.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/to/OrderPositionSearchCriteriaTo.java deleted file mode 100644 index 26650a48a..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/to/OrderPositionSearchCriteriaTo.java +++ /dev/null @@ -1,121 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to; - -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype.OrderPositionState; -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype.ProductOrderState; -import io.oasp.module.jpa.common.api.to.SearchCriteriaTo; - -/** - * This is the {@link SearchCriteriaTo search criteria} {@link net.sf.mmm.util.transferobject.api.TransferObject TO} - * used to find {@link io.oasp.gastronomy.restaurant.salesmanagement.common.api.OrderPosition}s. - * - */ -public class OrderPositionSearchCriteriaTo extends SearchCriteriaTo { - - /** UID for serialization. */ - private static final long serialVersionUID = 1L; - - private OrderPositionState state; - - private ProductOrderState drinkState; - - private Long orderId; - - private Long cookId; - - private boolean mealOrSideDish; - - /** - * The constructor. - */ - public OrderPositionSearchCriteriaTo() { - - super(); - } - - /** - * @return orderPositionState - */ - public OrderPositionState getState() { - - return this.state; - } - - /** - * @param orderPositionState the orderPositionState to set - */ - public void setState(OrderPositionState orderPositionState) { - - this.state = orderPositionState; - } - - /** - * @return drinkState of the {@link io.oasp.gastronomy.restaurant.salesmanagement.common.api.OrderPosition } - */ - public ProductOrderState getDrinkState() { - - return this.drinkState; - } - - /** - * @param drinkState the drinkState to set - */ - public void setDrinkState(ProductOrderState drinkState) { - - this.drinkState = drinkState; - } - - /** - * @return the {@link io.oasp.gastronomy.restaurant.salesmanagement.common.api.OrderPosition#getOrderId() order ID} of - * the {@link io.oasp.gastronomy.restaurant.salesmanagement.common.api.OrderPosition}s to find or {@code null} - * if no such criteria shall be added. - */ - public Long getOrderId() { - - return this.orderId; - } - - /** - * @param orderId the orderId to set - */ - public void setOrderId(Long orderId) { - - this.orderId = orderId; - } - - /** - * @return the {@link io.oasp.gastronomy.restaurant.salesmanagement.common.api.OrderPosition#getCookId() cook ID} of - * the {@link io.oasp.gastronomy.restaurant.salesmanagement.common.api.OrderPosition}s to find or {@code null} - * if no such criteria shall be added. - */ - public Long getCookId() { - - return this.cookId; - } - - /** - * @param cookId the cookId to set - */ - public void setCookId(Long cookId) { - - this.cookId = cookId; - } - - /** - * @return {@code true} if only {@link io.oasp.gastronomy.restaurant.salesmanagement.common.api.OrderPosition}s shall - * be found that have a meal or a side-dish associated (exclude drink only positions), {@code false} if no - * such criteria shall be added. - */ - public boolean isMealOrSideDish() { - - return this.mealOrSideDish; - } - - /** - * @param mealOrSideDish the mealOrSideDish to set - */ - public void setMealOrSideDish(boolean mealOrSideDish) { - - this.mealOrSideDish = mealOrSideDish; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/to/OrderSearchCriteriaTo.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/to/OrderSearchCriteriaTo.java deleted file mode 100644 index 5e9b3bf04..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/to/OrderSearchCriteriaTo.java +++ /dev/null @@ -1,60 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to; - -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype.OrderState; -import io.oasp.module.jpa.common.api.to.SearchCriteriaTo; - -/** - * This is the {@link SearchCriteriaTo search criteria} {@link net.sf.mmm.util.transferobject.api.TransferObject TO} - * used to find {@link io.oasp.gastronomy.restaurant.salesmanagement.common.api.Order}s. - * - */ -public class OrderSearchCriteriaTo extends SearchCriteriaTo { - - /** UID for serialization. */ - private static final long serialVersionUID = 1L; - - private OrderState state; - - private Long tableId; - - /** - * The constructor. - */ - public OrderSearchCriteriaTo() { - - super(); - } - - /** - * @return state - */ - public OrderState getState() { - - return this.state; - } - - /** - * @param state the state to set - */ - public void setState(OrderState state) { - - this.state = state; - } - - /** - * @return tableId - */ - public Long getTableId() { - - return this.tableId; - } - - /** - * @param tableId the tableId to set - */ - public void setTableId(Long tableId) { - - this.tableId = tableId; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/to/PaymentData.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/to/PaymentData.java deleted file mode 100644 index 9250df8af..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/to/PaymentData.java +++ /dev/null @@ -1,13 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to; - -import java.io.Serializable; - -/** - * This class describes the abstract data type {@link PaymentData}. - * - */ -public abstract class PaymentData implements Serializable { - - private static final long serialVersionUID = 1L; - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/usecase/UcChangeTable.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/usecase/UcChangeTable.java deleted file mode 100644 index f3fb72fa0..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/usecase/UcChangeTable.java +++ /dev/null @@ -1,24 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.logic.api.usecase; - -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderEto; -import io.oasp.gastronomy.restaurant.tablemanagement.logic.api.to.TableEto; - -/** - * Interface of {@link io.oasp.gastronomy.restaurant.general.logic.base.AbstractUc use case} to - * {@link #changeTable(long, long) change the table}. - * - * Interface of UcChangeTable to centralize documentation and signatures of methods. - * - */ -public interface UcChangeTable { - - /** - * UseCase to change from one {@link TableEto table} to another. The people sitting at a table are identified by their - * {@link OrderEto order} that has to be provided as argument. - * - * @param orderId the {@link OrderEto order} - * @param newTableId the new {@link TableEto table} to switch to. - */ - void changeTable(long orderId, long newTableId); - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/usecase/UcFindBill.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/usecase/UcFindBill.java deleted file mode 100644 index 8c7fa7338..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/usecase/UcFindBill.java +++ /dev/null @@ -1,20 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.logic.api.usecase; - -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.BillCto; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.BillEto; - -/** - * Interface of {@link io.oasp.gastronomy.restaurant.general.logic.base.AbstractUc use case} to get specific or all - * {@link BillEto bills}. - * - */ -public interface UcFindBill { - - /** - * This method will return a {@link BillCto bill} identified the given id. - * - * @param id is the {@link BillEto#getId() id} of the Bill to fetch. - * @return the {@link BillCto bill} for the given id. - */ - BillCto findBill(long id); -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/usecase/UcFindOrder.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/usecase/UcFindOrder.java deleted file mode 100644 index 5b12b87aa..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/usecase/UcFindOrder.java +++ /dev/null @@ -1,56 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.logic.api.usecase; - -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderCto; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderEto; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderSearchCriteriaTo; -import io.oasp.module.jpa.common.api.to.PaginatedListTo; - -import java.util.List; - -/** - * Interface of {@link io.oasp.gastronomy.restaurant.general.logic.base.AbstractUc use case} to get specific or all - * {@link OrderEto orders}. - * - */ -public interface UcFindOrder { - - /** - * @param criteria the {@link OrderSearchCriteriaTo}. - * @return the {@link List} of matching {@link OrderEto}s. - */ - PaginatedListTo findOrderEtos(OrderSearchCriteriaTo criteria); - - /** - * @param criteria the {@link OrderSearchCriteriaTo}. - * @return the {@link List} of matching {@link OrderCto}s. - */ - PaginatedListTo findOrderCtos(OrderSearchCriteriaTo criteria); - - /** - * @param order the {@link OrderEto}. - * @return the corresponding {@link OrderCto} (order with order-positions). - */ - OrderCto findOrderCto(OrderEto order); - - /** - * This method returns an {@link OrderEto order}. - * - * @param orderId identifier of the searched {@link OrderEto order} - * @return the {@link OrderEto order} with the given identifier. Will be {@code null} if the {@link OrderEto order} - * does not exist. - */ - OrderEto findOrder(long orderId); - - /** - * This method returns a the {@link io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype.OrderState#OPEN - * open} {@link OrderEto order} for the specified table. - * - * @param tableId the {@link io.oasp.gastronomy.restaurant.tablemanagement.common.api.Table#getId() table ID} the - * requested order shall be {@link OrderEto#getTableId() associated} with. - * @return the {@link OrderEto order} {@link OrderEto#getTableId() associated} with the given tableId in - * {@link io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype.OrderState#OPEN open} - * {@link OrderEto#getState() state} or {@code null} if no such {@link OrderEto order} exists. - */ - OrderEto findOpenOrderForTable(long tableId); - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/usecase/UcFindOrderPosition.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/usecase/UcFindOrderPosition.java deleted file mode 100644 index c7274a40e..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/usecase/UcFindOrderPosition.java +++ /dev/null @@ -1,44 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.logic.api.usecase; - -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderPositionEto; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderPositionSearchCriteriaTo; - -import java.util.List; - -/** - * Interface of {@link io.oasp.gastronomy.restaurant.general.logic.base.AbstractUc use case} to get or find specific - * {@link OrderPositionEto order position}s. - * - */ -public interface UcFindOrderPosition { - - /** - * @param orderPositionId is the {@link OrderPositionEto#getId() ID} of the requested {@link OrderPositionEto}. - * @return the {@link OrderPositionEto} with the given ID. Will be {@code null} if the {@link OrderPositionEto} does - * not exist. - */ - OrderPositionEto findOrderPosition(long orderPositionId); - - /** - * @param orderId is the {@link io.oasp.gastronomy.restaurant.salesmanagement.common.api.Order#getId() ID} of the - * {@link io.oasp.gastronomy.restaurant.salesmanagement.common.api.Order} for which the - * {@link OrderPositionEto positions} are requested. - * @return the {@link List} of {@link OrderPositionEto}s {@link OrderPositionEto#getOrderId() associated} with the - * given orderId. - */ - List findOrderPositionsByOrderId(long orderId); - - /** - * @param criteria the {@link OrderPositionSearchCriteriaTo}. - * @return the {@link List} of matching {@link OrderPositionEto}s. - */ - List findOrderPositions(OrderPositionSearchCriteriaTo criteria); - - /** - * @param orderId for which the {@link OrderPositionEto}s are requested. - * @return the {@link List} of all {@link OrderPositionEto}s {@link OrderPositionEto#getId() associated} with the - * given orderId. Will be the empty {@link List} if no such {@link OrderPositionEto} exists. - */ - List findOpenOrderPositionsByOrderId(long orderId); - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/usecase/UcManageBill.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/usecase/UcManageBill.java deleted file mode 100644 index d99e57df9..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/usecase/UcManageBill.java +++ /dev/null @@ -1,50 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.logic.api.usecase; - -import io.oasp.gastronomy.restaurant.general.common.api.datatype.Money; -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype.PaymentStatus; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.BillEto; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderPositionEto; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.PaymentData; - -/** - * Interface of UcManageBill to centralize documentation and signatures of methods. - * - */ -public interface UcManageBill { - - /** - * Create a {@link BillEto} and save it in the database by linking the billed {@link OrderPositionEto order positions} - * with it. A bill also consists of the {@link Money total amount} as well as the {@link Money tip}, the waiter could - * fill in. The tip is at default 0.0. - * - * @param bill that gets created in the database. - * @return the created {@link BillEto} - */ - BillEto createBill(BillEto bill); - - /** - * This method deletes a {@link BillEto} from the database by its given id. - * - * @param billId the ID of the {@link BillEto} that has to be deleted. - */ - void deleteBill(long billId); - - /** - * This method provides the payment process. It provides the cash-only functionality without any additional - * {@link PaymentData}. - * - * @param bill is the identifier of the {@link BillEto} on which the payment process takes place. - * @return the {@link PaymentStatus status code} of the payment process. - */ - PaymentStatus doPayment(BillEto bill); - - /** - * This method provides the payment process. - * - * @param paymentDataDebitor is the {@link PaymentData} which holds special data for the payment process. - * @param bill is the identifier of the {@link BillEto} on which the payment process takes place. - * @return the {@link PaymentStatus status code} of the payment process. - */ - PaymentStatus doPayment(BillEto bill, PaymentData paymentDataDebitor); - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/usecase/UcManageOrder.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/usecase/UcManageOrder.java deleted file mode 100644 index 122ec6461..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/usecase/UcManageOrder.java +++ /dev/null @@ -1,38 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.logic.api.usecase; - -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderCto; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderEto; - -import javax.validation.Valid; -import javax.validation.constraints.NotNull; - -/** - * Interface of UcMangeOrder to centralize documentation and signatures of methods. - * - */ -public interface UcManageOrder { - - /** - * If no ID is contained creates the {@link OrderCto} for the first time. Else it updates the {@link OrderCto} with - * given ID. If no {@link OrderCto} with given ID is present, an exception will be thrown. - * - * @param order the {@link OrderCto} to persist. - * @return the persisted {@link OrderCto}. - */ - OrderCto saveOrder(@NotNull OrderCto order); - - /** - * If no ID is contained creates the {@link OrderEto} for the first time. Else it updates the {@link OrderEto} with - * given ID. If no {@link OrderEto} with given ID is present, an exception will be thrown. - * - * @param order the {@link OrderEto} to persist. - * @return the persisted {@link OrderEto}. - */ - OrderEto saveOrder(@NotNull @Valid OrderEto order); - - /** - * @param id is the {@link OrderEto#getId() ID} of the order to delete. - */ - void deleteOrder(long id); - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/usecase/UcManageOrderPosition.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/usecase/UcManageOrderPosition.java deleted file mode 100644 index bc18efe4e..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/api/usecase/UcManageOrderPosition.java +++ /dev/null @@ -1,34 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.logic.api.usecase; - -import javax.validation.Valid; - -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.OfferEto; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderEto; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderPositionEto; - -/** - * Interface of UcManageOrderPosition to centralize documentation and signatures of methods. - * - */ -public interface UcManageOrderPosition { - - /** - * Creates an {@link OrderPositionEto} for the given {@link OfferEto} and a given {@link OrderEto}. - * - * @param offer is the {@link OfferEto} to be ordered. - * @param order is the {@link OrderEto order} for which the {@link OrderPositionEto}s are - * @param comment is the comment for special orders - * - * @return the new {@link OrderPositionEto} - */ - OrderPositionEto createOrderPosition(OfferEto offer, OrderEto order, String comment); - - /** - * Saves or updates the given {@link OrderPositionEto}. - * - * @param orderPosition is the {@link OrderPositionEto} to persist. - * @return the saved {@link OrderPositionEto}. - */ - OrderPositionEto saveOrderPosition(@Valid OrderPositionEto orderPosition); - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/base/usecase/AbstractBillUc.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/base/usecase/AbstractBillUc.java deleted file mode 100644 index 9c529b47e..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/base/usecase/AbstractBillUc.java +++ /dev/null @@ -1,35 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.logic.base.usecase; - -import io.oasp.gastronomy.restaurant.general.logic.base.AbstractUc; -import io.oasp.gastronomy.restaurant.salesmanagement.dataaccess.api.dao.BillDao; - -import javax.inject.Inject; - -/** - * - */ -public abstract class AbstractBillUc extends AbstractUc { - - /** @see #getBillDao() */ - private BillDao billDao; - - /** - * @return the {@link BillDao} instance. - */ - public BillDao getBillDao() { - - return this.billDao; - } - - /** - * Sets the field 'billDao'. - * - * @param billDao New value for billDao - */ - @Inject - public void setBillDao(BillDao billDao) { - - this.billDao = billDao; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/base/usecase/AbstractOrderPositionUc.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/base/usecase/AbstractOrderPositionUc.java deleted file mode 100644 index 853b7d4a6..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/base/usecase/AbstractOrderPositionUc.java +++ /dev/null @@ -1,35 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.logic.base.usecase; - -import io.oasp.gastronomy.restaurant.general.logic.base.AbstractUc; -import io.oasp.gastronomy.restaurant.salesmanagement.dataaccess.api.dao.OrderPositionDao; - -import javax.inject.Inject; - -/** - * - */ -public abstract class AbstractOrderPositionUc extends AbstractUc { - - /** @see #getOrderPositionDao() */ - private OrderPositionDao orderPositionDao; - - /** - * @return the {@link OrderPositionDao} instance. - */ - public OrderPositionDao getOrderPositionDao() { - - return this.orderPositionDao; - } - - /** - * Sets the field 'orderPositionDao'. - * - * @param orderPositionDao New value for orderPositionDao - */ - @Inject - public void setOrderPositionDao(OrderPositionDao orderPositionDao) { - - this.orderPositionDao = orderPositionDao; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/base/usecase/AbstractOrderUc.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/base/usecase/AbstractOrderUc.java deleted file mode 100644 index 732a050b2..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/base/usecase/AbstractOrderUc.java +++ /dev/null @@ -1,35 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.logic.base.usecase; - -import io.oasp.gastronomy.restaurant.general.logic.base.AbstractUc; -import io.oasp.gastronomy.restaurant.salesmanagement.dataaccess.api.dao.OrderDao; - -import javax.inject.Inject; - -/** - * - */ -public abstract class AbstractOrderUc extends AbstractUc { - - /** @see #getOrderDao() */ - private OrderDao orderDao; - - /** - * @return orderDao - */ - public OrderDao getOrderDao() { - - return this.orderDao; - } - - /** - * Sets the field 'orderPositionDao'. - * - * @param orderDao New value for orderDao - */ - @Inject - public void setOrderDao(OrderDao orderDao) { - - this.orderDao = orderDao; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/impl/SalesmanagementImpl.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/impl/SalesmanagementImpl.java deleted file mode 100644 index fe3ba1db8..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/impl/SalesmanagementImpl.java +++ /dev/null @@ -1,253 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.logic.impl; - -import io.oasp.gastronomy.restaurant.general.logic.api.UseCase; -import io.oasp.gastronomy.restaurant.general.logic.base.AbstractComponentFacade; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.OfferEto; -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype.PaymentStatus; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.Salesmanagement; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.BillCto; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.BillEto; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderCto; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderEto; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderPositionEto; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderPositionSearchCriteriaTo; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderSearchCriteriaTo; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.PaymentData; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.usecase.UcChangeTable; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.usecase.UcFindBill; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.usecase.UcFindOrder; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.usecase.UcFindOrderPosition; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.usecase.UcManageBill; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.usecase.UcManageOrder; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.usecase.UcManageOrderPosition; -import io.oasp.module.jpa.common.api.to.PaginatedListTo; - -import java.util.List; - -import javax.inject.Inject; -import javax.inject.Named; -import javax.transaction.Transactional; - -/** - * This is the implementation of {@link Salesmanagement}. - * - */ -@Named -@Transactional -public class SalesmanagementImpl extends AbstractComponentFacade implements Salesmanagement { - - private UcFindOrderPosition ucFindOrderPosition; - - private UcManageOrderPosition ucManageOrderPosition; - - private UcFindOrder ucFindOrder; - - private UcManageOrder ucManageOrder; - - private UcFindBill ucFindBill; - - private UcManageBill ucManageBill; - - private UcChangeTable ucChangeTable; - - /** - * The constructor. - */ - public SalesmanagementImpl() { - - super(); - } - - /** - * @param ucFindOrderPosition the {@link UcFindOrderPosition} to {@link Inject}. - */ - @Inject - @UseCase - public void setUcFindOrderPosition(UcFindOrderPosition ucFindOrderPosition) { - - this.ucFindOrderPosition = ucFindOrderPosition; - } - - /** - * @param ucManageOrderPosition the {@link UcManageOrderPosition} to {@link Inject}. - */ - @Inject - @UseCase - public void setUcManageOrderPosition(UcManageOrderPosition ucManageOrderPosition) { - - this.ucManageOrderPosition = ucManageOrderPosition; - } - - /** - * @param ucFindBill the {@link UcFindBill} to {@link Inject}. - */ - @Inject - @UseCase - public void setUcFindBill(UcFindBill ucFindBill) { - - this.ucFindBill = ucFindBill; - } - - /** - * @param ucFindOrder the {@link UcFindOrder} to {@link Inject}. - */ - @Inject - @UseCase - public void setUcFindOrder(UcFindOrder ucFindOrder) { - - this.ucFindOrder = ucFindOrder; - } - - /** - * @param ucManageOrder the {@link UcManageOrder} to {@link Inject}. - */ - @Inject - @UseCase - public void setUcManageOrder(UcManageOrder ucManageOrder) { - - this.ucManageOrder = ucManageOrder; - } - - /** - * @param ucManageBill the {@link UcManageBill} to {@link Inject}. - */ - @Inject - @UseCase - public void setUcManageBill(UcManageBill ucManageBill) { - - this.ucManageBill = ucManageBill; - } - - /** - * @param ucChangeTable the {@link UcChangeTable} to {@link Inject}. - */ - @Inject - @UseCase - public void setUcChangeTable(UcChangeTable ucChangeTable) { - - this.ucChangeTable = ucChangeTable; - } - - @Override - public OrderEto findOrder(long id) { - - return this.ucFindOrder.findOrder(id); - } - - @Override - public PaginatedListTo findOrderEtos(OrderSearchCriteriaTo criteria) { - - return this.ucFindOrder.findOrderEtos(criteria); - } - - @Override - public PaginatedListTo findOrderCtos(OrderSearchCriteriaTo criteria) { - - return this.ucFindOrder.findOrderCtos(criteria); - } - - @Override - public OrderCto findOrderCto(OrderEto order) { - - return this.ucFindOrder.findOrderCto(order); - } - - @Override - public OrderEto findOpenOrderForTable(long tableId) { - - return this.ucFindOrder.findOpenOrderForTable(tableId); - } - - @Override - public void changeTable(long orderId, long tableId) { - - this.ucChangeTable.changeTable(orderId, tableId); - - } - - @Override - public OrderPositionEto createOrderPosition(OfferEto offer, OrderEto order, String comment) { - - return this.ucManageOrderPosition.createOrderPosition(offer, order, comment); - } - - @Override - public OrderPositionEto findOrderPosition(long orderPositionId) { - - return this.ucFindOrderPosition.findOrderPosition(orderPositionId); - } - - @Override - public List findOrderPositions(OrderPositionSearchCriteriaTo criteria) { - - return this.ucFindOrderPosition.findOrderPositions(criteria); - } - - @Override - public List findOrderPositionsByOrderId(long orderId) { - - return this.ucFindOrderPosition.findOrderPositionsByOrderId(orderId); - } - - @Override - public List findOpenOrderPositionsByOrderId(long orderId) { - - return this.ucFindOrderPosition.findOpenOrderPositionsByOrderId(orderId); - } - - @Override - public PaymentStatus doPayment(BillEto bill) { - - return this.ucManageBill.doPayment(bill); - } - - @Override - public PaymentStatus doPayment(BillEto bill, PaymentData paymentData) { - - return this.ucManageBill.doPayment(bill, paymentData); - } - - @Override - public BillCto findBill(long id) { - - return this.ucFindBill.findBill(id); - - } - - @Override - public void deleteBill(long billId) { - - this.ucManageBill.deleteBill(billId); - } - - @Override - public void deleteOrder(long id) { - - this.ucManageOrder.deleteOrder(id); - } - - @Override - public OrderCto saveOrder(OrderCto order) { - - return this.ucManageOrder.saveOrder(order); - } - - @Override - public OrderEto saveOrder(OrderEto order) { - - return this.ucManageOrder.saveOrder(order); - } - - @Override - public OrderPositionEto saveOrderPosition(OrderPositionEto orderPosition) { - - return this.ucManageOrderPosition.saveOrderPosition(orderPosition); - } - - @Override - public BillEto createBill(BillEto bill) { - - return this.ucManageBill.createBill(bill); - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/impl/paymentadapter/PaymentAdapter.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/impl/paymentadapter/PaymentAdapter.java deleted file mode 100644 index 7200abcef..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/impl/paymentadapter/PaymentAdapter.java +++ /dev/null @@ -1,16 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.logic.impl.paymentadapter; - -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype.PaymentStatus; - -/** - * Interface of the adapter for external payment. - * - */ -public interface PaymentAdapter { - - /** - * @param paymentTransactionData paymentTransactionData - * @return PaymentStatus - */ - PaymentStatus pay(PaymentTransactionData paymentTransactionData); -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/impl/paymentadapter/PaymentTransactionData.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/impl/paymentadapter/PaymentTransactionData.java deleted file mode 100644 index b58722101..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/impl/paymentadapter/PaymentTransactionData.java +++ /dev/null @@ -1,85 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.logic.impl.paymentadapter; - -import io.oasp.gastronomy.restaurant.general.common.api.datatype.Money; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.PaymentData; - -import java.io.Serializable; - -/** - * This class acts as a simple POJO. The creditor acts as the receiver of the transfered total amount. The total amount - * will be charged the debtor. - * - */ -public class PaymentTransactionData implements Serializable { - - private static final long serialVersionUID = 1L; - - /** The creditor and his payment data of that payment transaction. */ - private PaymentData creditor; - - /** The debitor and his payment data of that payment transaction. */ - private PaymentData debitor; - - /** The total amount to transfer. */ - private Money totalAmount; - - /** - * Returns the field 'creditor'. - * - * @return Value of creditor - */ - public PaymentData getCreditor() { - - return this.creditor; - } - - /** - * Sets the field 'creditor'. - * - * @param creditor New value for creditor - */ - public void setCreditor(PaymentData creditor) { - - this.creditor = creditor; - } - - /** - * Returns the field 'debitor'. - * - * @return Value of debitor - */ - public PaymentData getDebitor() { - - return this.debitor; - } - - /** - * Sets the field 'debitor'. - * - * @param debitor New value for debitor - */ - public void setDebitor(PaymentData debitor) { - - this.debitor = debitor; - } - - /** - * Returns the field 'totalAmount'. - * - * @return Value of totalAmount - */ - public Money getTotalAmount() { - - return this.totalAmount; - } - - /** - * Sets the field 'totalAmount'. - * - * @param totalAmount New value for totalAmount - */ - public void setTotalAmount(Money totalAmount) { - - this.totalAmount = totalAmount; - } -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/impl/paymentadapter/impl/PaymentAdapterImpl.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/impl/paymentadapter/impl/PaymentAdapterImpl.java deleted file mode 100644 index 0c22d9108..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/impl/paymentadapter/impl/PaymentAdapterImpl.java +++ /dev/null @@ -1,25 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.logic.impl.paymentadapter.impl; - -import io.oasp.gastronomy.restaurant.general.common.base.AbstractBeanMapperSupport; -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype.PaymentStatus; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.impl.paymentadapter.PaymentAdapter; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.impl.paymentadapter.PaymentTransactionData; - -import javax.inject.Named; - -/** - * Implementation of the external payment functionalities. - * - */ -@Named -public class PaymentAdapterImpl extends AbstractBeanMapperSupport implements PaymentAdapter { - - @Override - public PaymentStatus pay(PaymentTransactionData paymentTransactionData) { - - return PaymentStatus.SUCCESS; - - // return dozer.map(statusTo, PaymentStatus.class); - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/impl/usecase/UcChangeTableImpl.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/impl/usecase/UcChangeTableImpl.java deleted file mode 100644 index 0b0744f65..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/impl/usecase/UcChangeTableImpl.java +++ /dev/null @@ -1,85 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.logic.impl.usecase; - -import io.oasp.gastronomy.restaurant.general.common.api.constants.PermissionConstants; -import io.oasp.gastronomy.restaurant.general.logic.api.UseCase; -import io.oasp.gastronomy.restaurant.general.logic.base.AbstractUc; -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.exception.ChangeTableIllegalStateCombinationException; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.Salesmanagement; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderEto; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.usecase.UcChangeTable; -import io.oasp.gastronomy.restaurant.tablemanagement.common.api.datatype.TableState; -import io.oasp.gastronomy.restaurant.tablemanagement.logic.api.Tablemanagement; -import io.oasp.gastronomy.restaurant.tablemanagement.logic.api.to.TableEto; - -import javax.annotation.security.RolesAllowed; -import javax.inject.Inject; -import javax.inject.Named; - -/** - * UseCase: The guests can change a table to get a better table. - * - */ -@Named -@UseCase -public class UcChangeTableImpl extends AbstractUc implements UcChangeTable { - - private Tablemanagement tableManagement; - - private Salesmanagement salesManagement; - - @Override - @RolesAllowed(PermissionConstants.SAVE_TABLE) - public void changeTable(long orderId, long newTableId) { - - OrderEto order = this.salesManagement.findOrder(orderId); - // save old table data - long oldTableId = order.getTableId(); - if (oldTableId == newTableId) { - return; // nothing to do... - } - TableEto oldTable = this.tableManagement.findTable(oldTableId); - TableState oldTableState = oldTable.getState(); - - // throw exception if the newTableState is occupied - TableEto newTable = this.tableManagement.findTable(newTableId); - if (newTable.getState().isOccupied()) { - throw new ChangeTableIllegalStateCombinationException(order, newTable); - } - - // update order - order.setTableId(newTableId); - - // marks new table with copied status - newTable.setState(oldTableState); - - this.tableManagement.saveTable(newTable); - - // saves Order for the new table - this.salesManagement.saveOrder(order); - - // change table status: - // marks old table as free - oldTable.setState(TableState.FREE); - this.tableManagement.saveTable(oldTable); - - } - - /** - * @param tableManagement the {@link Tablemanagement} to {@link Inject}. - */ - @Inject - public void setTableManagement(Tablemanagement tableManagement) { - - this.tableManagement = tableManagement; - } - - /** - * @param salesManagement the {@link Salesmanagement} to {@link Inject}. - */ - @Inject - public void setSalesManagement(Salesmanagement salesManagement) { - - this.salesManagement = salesManagement; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/impl/usecase/UcFindBillImpl.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/impl/usecase/UcFindBillImpl.java deleted file mode 100644 index 668dcecc2..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/impl/usecase/UcFindBillImpl.java +++ /dev/null @@ -1,65 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.logic.impl.usecase; - -import io.oasp.gastronomy.restaurant.general.common.api.constants.PermissionConstants; -import io.oasp.gastronomy.restaurant.general.logic.api.UseCase; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.Salesmanagement; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.BillCto; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.BillEto; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderPositionEto; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.usecase.UcFindBill; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.base.usecase.AbstractBillUc; - -import java.util.ArrayList; -import java.util.List; - -import javax.annotation.security.RolesAllowed; -import javax.inject.Inject; -import javax.inject.Named; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Implementation of {@link UcFindBill}. - * - */ -@Named -@UseCase -public class UcFindBillImpl extends AbstractBillUc implements UcFindBill { - - private static final Logger LOG = LoggerFactory.getLogger(UcFindBillImpl.class); - - private Salesmanagement salesmanagement; - - @Override - @RolesAllowed(PermissionConstants.FIND_BILL) - public BillCto findBill(long id) { - - LOG.debug("Get Bill with id '" + id + "' from database."); - BillCto billCto = new BillCto(); - BillEto bill = getBeanMapper().map(getBillDao().findOne(id), BillEto.class); - if (bill == null) { - return null; - } - billCto.setBill(bill); - - List orderPositions = new ArrayList<>(); - for (Long orderPositionId : bill.getOrderPositionIds()) { - OrderPositionEto position = this.salesmanagement.findOrderPosition(orderPositionId); - orderPositions.add(position); - } - billCto.setPositions(orderPositions); - - return billCto; - } - - /** - * @param salesmanagement the salesmanagement to set - */ - @Inject - public void setSalesmanagement(Salesmanagement salesmanagement) { - - this.salesmanagement = salesmanagement; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/impl/usecase/UcFindOrderImpl.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/impl/usecase/UcFindOrderImpl.java deleted file mode 100644 index db480be24..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/impl/usecase/UcFindOrderImpl.java +++ /dev/null @@ -1,99 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.logic.impl.usecase; - -import io.oasp.gastronomy.restaurant.general.common.api.constants.PermissionConstants; -import io.oasp.gastronomy.restaurant.general.logic.api.UseCase; -import io.oasp.gastronomy.restaurant.salesmanagement.dataaccess.api.OrderEntity; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.Salesmanagement; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderCto; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderEto; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderPositionEto; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderSearchCriteriaTo; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.usecase.UcFindOrder; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.base.usecase.AbstractOrderUc; -import io.oasp.module.jpa.common.api.to.PaginatedListTo; - -import java.util.ArrayList; -import java.util.List; - -import javax.annotation.security.RolesAllowed; -import javax.inject.Inject; -import javax.inject.Named; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Use Case to find an order. - * - */ -@Named -@UseCase -public class UcFindOrderImpl extends AbstractOrderUc implements UcFindOrder { - - private static final Logger LOG = LoggerFactory.getLogger(UcFindOrderImpl.class); - - private Salesmanagement salesManagement; - - @Override - @RolesAllowed(PermissionConstants.FIND_ORDER) - public OrderEto findOrder(long orderId) { - - LOG.debug("Get order."); - return getBeanMapper().map(getOrderDao().findOne(orderId), OrderEto.class); - } - - @Override - @RolesAllowed(PermissionConstants.FIND_ORDER) - public PaginatedListTo findOrderEtos(OrderSearchCriteriaTo criteria) { - - criteria.limitMaximumPageSize(MAXIMUM_HIT_LIMIT); - PaginatedListTo orders = getOrderDao().findOrders(criteria); - - return mapPaginatedEntityList(orders, OrderEto.class); - } - - @Override - @RolesAllowed(PermissionConstants.FIND_ORDER) - public PaginatedListTo findOrderCtos(OrderSearchCriteriaTo criteria) { - - PaginatedListTo orderEtos = findOrderEtos(criteria); - - List page = new ArrayList<>(orderEtos.getResult().size()); - for (OrderEto order : orderEtos.getResult()) { - // REVIEW (hohwille) N+1 problem. Find a better and more efficient way to load the order positions. - page.add(findOrderCto(order)); - } - - PaginatedListTo result = new PaginatedListTo<>(page, orderEtos.getPagination()); - return result; - } - - @Override - @RolesAllowed(PermissionConstants.FIND_ORDER) - public OrderCto findOrderCto(OrderEto order) { - - OrderCto result = new OrderCto(); - result.setOrder(order); - List positions = this.salesManagement.findOrderPositionsByOrderId(order.getId()); - result.setPositions(positions); - return result; - } - - @Override - @RolesAllowed(PermissionConstants.FIND_ORDER) - public OrderEto findOpenOrderForTable(long tableId) { - - OrderEntity order = getOrderDao().findOpenOrderByTable(tableId); - return getBeanMapper().map(order, OrderEto.class); - } - - /** - * @param salesManagement the {@link Salesmanagement} to {@link Inject}. - */ - @Inject - public void setSalesManagement(Salesmanagement salesManagement) { - - this.salesManagement = salesManagement; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/impl/usecase/UcFindOrderPositionImpl.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/impl/usecase/UcFindOrderPositionImpl.java deleted file mode 100644 index 1ff30e383..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/impl/usecase/UcFindOrderPositionImpl.java +++ /dev/null @@ -1,64 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.logic.impl.usecase; - -import io.oasp.gastronomy.restaurant.general.common.api.constants.PermissionConstants; -import io.oasp.gastronomy.restaurant.general.logic.api.UseCase; -import io.oasp.gastronomy.restaurant.salesmanagement.dataaccess.api.OrderPositionEntity; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderPositionEto; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderPositionSearchCriteriaTo; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.usecase.UcFindOrderPosition; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.base.usecase.AbstractOrderPositionUc; - -import java.util.List; - -import javax.annotation.security.RolesAllowed; -import javax.inject.Named; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Implementation of {@link UcFindOrderPosition}. - * - */ -@Named -@UseCase -public class UcFindOrderPositionImpl extends AbstractOrderPositionUc implements UcFindOrderPosition { - - private static final Logger LOG = LoggerFactory.getLogger(UcFindOrderPositionImpl.class); - - @Override - @RolesAllowed(PermissionConstants.FIND_ORDER_POSITION) - public OrderPositionEto findOrderPosition(long orderPositionId) { - - LOG.debug("Get order position."); - OrderPositionEntity orderPositionEntities = getOrderPositionDao().findOne(orderPositionId); - OrderPositionEto orderPositionBo = getBeanMapper().map(orderPositionEntities, OrderPositionEto.class); - return orderPositionBo; - } - - @Override - @RolesAllowed(PermissionConstants.FIND_ORDER_POSITION) - public List findOrderPositionsByOrderId(long orderId) { - - List positions = getOrderPositionDao().findOrderPositionsByOrder(orderId); - return getBeanMapper().mapList(positions, OrderPositionEto.class); - } - - @Override - @RolesAllowed(PermissionConstants.FIND_ORDER_POSITION) - public List findOpenOrderPositionsByOrderId(long orderId) { - - LOG.debug("Get all open order positions for order id '" + orderId + "'."); - return getBeanMapper() - .mapList(getOrderPositionDao().findOpenOrderPositionsByOrder(orderId), OrderPositionEto.class); - } - - @Override - @RolesAllowed(PermissionConstants.FIND_ORDER_POSITION) - public List findOrderPositions(OrderPositionSearchCriteriaTo criteria) { - - List positions = getOrderPositionDao().findOrderPositions(criteria); - return getBeanMapper().mapList(positions, OrderPositionEto.class); - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/impl/usecase/UcManageBillImpl.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/impl/usecase/UcManageBillImpl.java deleted file mode 100644 index f2c1e9b17..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/impl/usecase/UcManageBillImpl.java +++ /dev/null @@ -1,216 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.logic.impl.usecase; - -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; - -import javax.annotation.security.RolesAllowed; -import javax.inject.Inject; -import javax.inject.Named; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import io.oasp.gastronomy.restaurant.general.common.api.constants.PermissionConstants; -import io.oasp.gastronomy.restaurant.general.common.api.datatype.Money; -import io.oasp.gastronomy.restaurant.general.common.api.exception.IllegalEntityStateException; -import io.oasp.gastronomy.restaurant.general.logic.api.UseCase; -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.OrderPosition; -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype.OrderPositionState; -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype.PaymentStatus; -import io.oasp.gastronomy.restaurant.salesmanagement.dataaccess.api.BillEntity; -import io.oasp.gastronomy.restaurant.salesmanagement.dataaccess.api.OrderPositionEntity; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.Salesmanagement; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.BankPaymentData; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.BillEto; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderPositionEto; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.PaymentData; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.usecase.UcManageBill; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.base.usecase.AbstractBillUc; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.impl.paymentadapter.PaymentAdapter; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.impl.paymentadapter.PaymentTransactionData; - -/** - * Implementation of {@link UcManageBill}. - * - */ -@Named -@UseCase -public class UcManageBillImpl extends AbstractBillUc implements UcManageBill { - - /** Logger instance. */ - private static final Logger LOG = LoggerFactory.getLogger(UcManageBillImpl.class); - - private Salesmanagement salesmanagement; - - private PaymentAdapter paymentAdapter; - - @Override - @RolesAllowed(PermissionConstants.SAVE_BILL) - public BillEto createBill(BillEto bill) { - - List orderPositions = bill.getOrderPositionIds(); - Objects.requireNonNull(bill, "bill must not be null"); - - Money total = Money.ZERO; - List myOrderPositions = new ArrayList<>(); - - for (Long id : orderPositions) { - OrderPositionEto orderPosition = this.salesmanagement.findOrderPosition(id); - verifyNotClosed(orderPosition); - total = total.add(orderPosition.getPrice()); - - myOrderPositions.add(getBeanMapper().map(orderPosition, OrderPositionEntity.class)); - } - - Money localTip = bill.getTip(); - if (localTip == null) { - localTip = Money.ZERO; - } - - // Declare the bill - BillEntity billEntity = new BillEntity(); - - billEntity.setOrderPositions(myOrderPositions); - billEntity.setTip(localTip); - billEntity.setPayed(false); - billEntity.setTotal(total); - - BillEntity savedBill = getBillDao().save(billEntity); - - BillEto returnBill = getBeanMapper().map(savedBill, BillEto.class); - - LOG.debug("The bill with id '{}' has been created.", returnBill.getId()); - - return returnBill; - } - - private void verifyNotClosed(OrderPosition position) { - - OrderPositionState state = position.getState(); - if ((state == null) || state.isClosed()) { - throw new IllegalEntityStateException(position, state); - } - } - - /** - * This method updates a {@link BillEntity} by checking the existence of a bill with that {@link BillEntity#getId() - * id} in the database. If no such {@link BillEntity} exists, a new bill will be created by calling - * {@link UcManageBillImpl#createBill(BillEto)}. Otherwise, the existing {@link BillEntity} will be updated by - * overriding the set {@link BillEntity#getOrderPositions() order positions}, {@link BillEntity#getTip() tip} and the - * {@link BillEntity#getTotal() total amount}. - * - * @param bill The {@link BillEntity} to update. - * - * @return the updated {@link BillEntity} - */ - private BillEto update(BillEto bill) { - - Objects.requireNonNull(bill, "bill"); - - Long billId = bill.getId(); - BillEntity targetBill = getBillDao().findOne(billId); - - List orderPositionIds = bill.getOrderPositionIds(); - if (targetBill == null) { - // Bill does not yet exist. -> new Bill - List orderPositions = new ArrayList<>(); - for (Long id : orderPositionIds) { - OrderPositionEto position = this.salesmanagement.findOrderPosition(id); - orderPositions.add(position); - } - return createBill(bill); - } else { - // Bill already exists. -> Update bill - targetBill.setOrderPositionIds(orderPositionIds); - targetBill.setPayed(bill.isPayed()); - targetBill.setTip(bill.getTip()); - targetBill.setTotal(bill.getTotal()); - - /* - * Save updated bill - */ - getBillDao().save(targetBill); - LOG.debug("The bill with id '{}' has been updated.", billId); - - return getBeanMapper().map(targetBill, BillEto.class); - } - } - - @Override - @RolesAllowed(PermissionConstants.DELETE_BILL) - public void deleteBill(long billId) { - - getBillDao().delete(billId); - } - - @Override - @RolesAllowed(PermissionConstants.SAVE_BILL) - public PaymentStatus doPayment(BillEto bill) { - - LOG.debug("The bill with id '" + bill.getId() + "' will be marked as payed."); - - // Return a PaymentStatus - LOG.debug("The bill with id '" + bill.getId() + "' is succesfuly payed."); - return PaymentStatus.SUCCESS; - } - - @Override - @RolesAllowed(PermissionConstants.SAVE_BILL) - public PaymentStatus doPayment(BillEto bill, PaymentData paymentDataDebitor) { - - // REVIEW (hohwille) Remove this hack or replace with something reasonable. - PaymentStatus status = null; - - // Creditor data: constant - BankPaymentData paymentDataCreditor = new BankPaymentData(); - paymentDataCreditor.setAccountOwnerName("Restaurant_BlockHouse"); - paymentDataCreditor.setAccountNumber(191919L); - paymentDataCreditor.setBankCode(760087698L); - paymentDataCreditor.setBankName("RestaurantBank"); - - // Step1: Prepare the TransactionDataTo object - PaymentTransactionData paymentTransactionData = new PaymentTransactionData(); - paymentTransactionData.setCreditor(paymentDataCreditor); - paymentTransactionData.setDebitor(paymentDataDebitor); - paymentTransactionData.setTotalAmount(bill.getTotal()); - - // Step2: Call the external system with the transactionDataTo - status = this.paymentAdapter.pay(paymentTransactionData); - - // Step3: Call the function markBillAndOrderPositionsAsPayed (Mark - // orderPositions and the current bill - // as payed and eventually free table) if Step2 was successful - if (PaymentStatus.SUCCESS == status) { - - bill.setPayed(true); - for (Long orderPositionId : bill.getOrderPositionIds()) { - this.salesmanagement.findOrderPosition(orderPositionId).setState(OrderPositionState.PAYED); - } - } - - // Step4: Return a PaymentStatus - LOG.debug("The payment of bill with id '" + bill.getId() + "' has given that status '" + status + "' back."); - return status; - } - - /** - * Sets the field 'paymentAdapter'. - * - * @param paymentAdapter New value for paymentAdapter - */ - @Inject - public void setPaymentAdapter(PaymentAdapter paymentAdapter) { - - this.paymentAdapter = paymentAdapter; - } - - /** - * @param salesmanagement the salesmanagement to set - */ - @Inject - public void setSalesmanagement(Salesmanagement salesmanagement) { - - this.salesmanagement = salesmanagement; - } -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/impl/usecase/UcManageOrderImpl.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/impl/usecase/UcManageOrderImpl.java deleted file mode 100644 index 2977ac94a..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/impl/usecase/UcManageOrderImpl.java +++ /dev/null @@ -1,188 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.logic.impl.usecase; - -import io.oasp.gastronomy.restaurant.general.common.api.constants.PermissionConstants; -import io.oasp.gastronomy.restaurant.general.common.api.exception.IllegalEntityStateException; -import io.oasp.gastronomy.restaurant.general.logic.api.UseCase; -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.Order; -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype.OrderPositionState; -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype.OrderState; -import io.oasp.gastronomy.restaurant.salesmanagement.dataaccess.api.OrderEntity; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.Salesmanagement; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderCto; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderEto; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderPositionEto; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.usecase.UcManageOrder; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.base.usecase.AbstractOrderUc; - -import java.util.Collections; -import java.util.List; -import java.util.Objects; - -import javax.annotation.security.RolesAllowed; -import javax.inject.Inject; -import javax.inject.Named; - -import net.sf.mmm.util.exception.api.ObjectMismatchException; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.validation.annotation.Validated; - -/** - * Implementation of {@link UcManageOrder}. - * - */ -@Named -@UseCase -@Validated -public class UcManageOrderImpl extends AbstractOrderUc implements UcManageOrder { - - /** Logger instance. */ - private static final Logger LOG = LoggerFactory.getLogger(UcManageOrderImpl.class); - - private Salesmanagement salesmanagement; - - /** - * The constructor. - */ - public UcManageOrderImpl() { - - super(); - } - - /** - * @param salesmanagement the {@link Salesmanagement} to {@link Inject}. - */ - @Inject - public void setSalesmanagement(Salesmanagement salesmanagement) { - - this.salesmanagement = salesmanagement; - } - - @Override - @RolesAllowed(PermissionConstants.SAVE_ORDER) - public OrderEto saveOrder(OrderEto order) { - - return saveOrder(order, null); - } - - private OrderEto saveOrder(OrderEto order, List positions) { - - Objects.requireNonNull(order, "order"); - Long orderId = order.getId(); - if (orderId == null) { - OrderState state = order.getState(); - if (state != OrderState.OPEN) { - throw new IllegalEntityStateException(order, state); - } - } else { - OrderEntity currentOrder = getOrderDao().find(orderId); - verifyUpdate(currentOrder, order, positions); - } - OrderEntity orderEntity = getBeanMapper().map(order, OrderEntity.class); - orderEntity = getOrderDao().save(orderEntity); - LOG.debug("Saved order with id {}.", orderEntity.getId()); - return getBeanMapper().map(orderEntity, OrderEto.class); - } - - /** - * @param currentOrder is the current {@link Order} from the persistence. - * @param updateOrder is the new {@link Order} to update to. - * @param positions the {@link List} of {@link OrderPositionEto positions} or {@code null} if undefined. - */ - private void verifyUpdate(Order currentOrder, Order updateOrder, List positions) { - - if (currentOrder.getTableId() != updateOrder.getTableId()) { - LOG.info("Changing order from table-id {} to table-id {}", currentOrder.getTableId(), updateOrder.getTableId()); - } - verifyOrderStateChange(updateOrder, currentOrder.getState(), updateOrder.getState(), positions); - } - - /** - * Verifies if an update of the {@link OrderPositionState} is legal. - * - * @param updateOrder the new {@link Order} to update to. - * @param currentState the old/current {@link OrderState} of the {@link Order}. - * @param newState new {@link OrderState} of the {@link Order} to be updated to. - * @param positions the {@link List} of {@link OrderPositionEto positions} or {@code null} if undefined. - */ - private void verifyOrderStateChange(Order updateOrder, OrderState currentState, OrderState newState, - List positions) { - - if (currentState == newState) { - return; - } - if (newState == OrderState.CLOSED) { - if (positions == null) { - throw new IllegalEntityStateException(updateOrder, currentState, newState); - } - // we can only close an order if all its positions are closed... - for (OrderPositionEto position : positions) { - OrderPositionState positionState = position.getState(); - if ((positionState == null) || !positionState.isClosed()) { - IllegalEntityStateException cause = new IllegalEntityStateException(position, positionState); - throw new IllegalEntityStateException(cause, updateOrder, currentState, newState); - } - } - } - } - - @Override - @RolesAllowed(PermissionConstants.SAVE_ORDER) - public OrderCto saveOrder(OrderCto order) { - - Objects.requireNonNull(order, "order"); - - OrderEto orderEto = order.getOrder(); - Long orderId = orderEto.getId(); - List currentOrderPositionList; - if (orderId == null) { - currentOrderPositionList = Collections.emptyList(); - } else { - // we could add a relation OrderEntity.positions of type List... - currentOrderPositionList = this.salesmanagement.findOrderPositionsByOrderId(orderId); - } - List positions = order.getPositions(); - orderEto = saveOrder(orderEto, positions); - if (orderId == null) { - orderId = orderEto.getId(); - } - OrderCto result = new OrderCto(); - result.setOrder(orderEto); - - // we can not use hibernate (Cascade and Delete orphaned) as we need to validate and react on them... - - List positions2DeleteList = getEntities2Delete(currentOrderPositionList, positions); - List savedPositionList = result.getPositions(); - if (positions2DeleteList.size() > 0) { - LOG.warn("Marking {} number of order position(s) as cancelled that are missing in update of order with id {}", - positions2DeleteList.size(), orderId); - for (OrderPositionEto position : positions2DeleteList) { - // only logically delete, actually the client should still send the cancelled positions... - position.setState(OrderPositionState.CANCELLED); - OrderPositionEto updatedOrderPosition = this.salesmanagement.saveOrderPosition(position); - savedPositionList.add(updatedOrderPosition); - } - } - - for (OrderPositionEto position : positions) { - Long positionOrderId = position.getOrderId(); - if (positionOrderId == null) { - position.setOrderId(orderId); - } else if (!positionOrderId.equals(orderId)) { - throw new ObjectMismatchException(positionOrderId, orderId, "position.orderId"); - } - OrderPositionEto updatedOrderPosition = this.salesmanagement.saveOrderPosition(position); - savedPositionList.add(updatedOrderPosition); - } - return result; - } - - @Override - @RolesAllowed(PermissionConstants.DELETE_ORDER) - public void deleteOrder(long id) { - - getOrderDao().delete(id); - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/impl/usecase/UcManageOrderPositionImpl.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/impl/usecase/UcManageOrderPositionImpl.java deleted file mode 100644 index 62d74628f..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/impl/usecase/UcManageOrderPositionImpl.java +++ /dev/null @@ -1,249 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.logic.impl.usecase; - -import java.util.Objects; - -import javax.annotation.security.RolesAllowed; -import javax.inject.Inject; -import javax.inject.Named; - -import net.sf.mmm.util.exception.api.ObjectNotFoundUserException; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.validation.annotation.Validated; - -import io.oasp.gastronomy.restaurant.general.common.api.constants.PermissionConstants; -import io.oasp.gastronomy.restaurant.general.common.api.exception.IllegalEntityStateException; -import io.oasp.gastronomy.restaurant.general.common.api.exception.IllegalPropertyChangeException; -import io.oasp.gastronomy.restaurant.general.logic.api.UseCase; -import io.oasp.gastronomy.restaurant.offermanagement.common.api.Offer; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.Offermanagement; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.OfferEto; -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.OrderPosition; -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype.OrderPositionState; -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype.OrderState; -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype.ProductOrderState; -import io.oasp.gastronomy.restaurant.salesmanagement.dataaccess.api.OrderEntity; -import io.oasp.gastronomy.restaurant.salesmanagement.dataaccess.api.OrderPositionEntity; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.Salesmanagement; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderEto; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderPositionEto; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.usecase.UcManageOrderPosition; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.base.usecase.AbstractOrderPositionUc; - -/** - * Implementation of {@link UcManageOrderPosition}. - * - */ -@Named -@UseCase -@Validated -public class UcManageOrderPositionImpl extends AbstractOrderPositionUc implements UcManageOrderPosition { - - /** Logger instance. */ - private static final Logger LOG = LoggerFactory.getLogger(UcManageOrderPositionImpl.class); - - private Salesmanagement salesManagement; - - private Offermanagement offerManagement; - - /** - * The constructor. - */ - public UcManageOrderPositionImpl() { - - super(); - } - - @Override - @RolesAllowed(PermissionConstants.SAVE_ORDER_POSITION) - public OrderPositionEto createOrderPosition(OfferEto offer, OrderEto order, String comment) { - - Objects.requireNonNull(offer, "offer"); - Long offerId = offer.getId(); - OfferEto offerFromDb = this.offerManagement.findOffer(offerId); - if (offerFromDb == null) { - throw new ObjectNotFoundUserException(Offer.class, offerId); - } - OrderPositionEntity orderPosition = new OrderPositionEntity(); - - order.setState(OrderState.OPEN); - // Declare the order position. - orderPosition.setOfferId(offerId); - orderPosition.setOfferName(offerFromDb.getDescription()); - orderPosition.setPrice(offerFromDb.getPrice()); - orderPosition.setOrder(getBeanMapper().map(this.salesManagement.saveOrder(order), OrderEntity.class)); - orderPosition.setComment(comment); - - // Save the order position and return it. - getOrderPositionDao().save(orderPosition); - - LOG.debug("The order position with id '" + orderPosition.getId() + "' has been created. It's linked with order id '" - + order.getId() + "' and offer id '" + offerId + "'."); - - return getBeanMapper().map(orderPosition, OrderPositionEto.class); - } - - @Override - @RolesAllowed(PermissionConstants.SAVE_ORDER_POSITION) - public OrderPositionEto saveOrderPosition(OrderPositionEto orderPosition) { - - Objects.requireNonNull(orderPosition, "orderPosition"); - - Long orderPositionId = orderPosition.getId(); - String action; - if (orderPositionId == null) { - action = "saved"; - Long offerId = orderPosition.getOfferId(); - OfferEto offer = this.offerManagement.findOffer(offerId); - Objects.requireNonNull(offer, "Offer@" + offerId); - orderPosition.setPrice(offer.getPrice()); - orderPosition.setOfferName(offer.getName()); - } else { - OrderPositionEntity currentOrderPosition = getOrderPositionDao().find(orderPositionId); - verifyUpdate(currentOrderPosition, orderPosition); - action = "updated"; - } - - OrderPositionEntity orderPositionEntity = getBeanMapper().map(orderPosition, OrderPositionEntity.class); - orderPositionEntity = getOrderPositionDao().save(orderPositionEntity); - LOG.debug("The order position with id {} has been {}.", orderPositionEntity.getId(), action); - return getBeanMapper().map(orderPositionEntity, OrderPositionEto.class); - } - - /** - * @param currentOrderPosition is the current {@link OrderPosition} from the persistence. - * @param updateOrderPosition is the new {@link OrderPosition} to update to. - */ - private void verifyUpdate(OrderPosition currentOrderPosition, OrderPosition updateOrderPosition) { - - if (!Objects.equals(currentOrderPosition.getOrderId(), currentOrderPosition.getOrderId())) { - throw new IllegalPropertyChangeException(updateOrderPosition, "orderId"); - } - if (!Objects.equals(currentOrderPosition.getOfferId(), currentOrderPosition.getOfferId())) { - throw new IllegalPropertyChangeException(updateOrderPosition, "offerId"); - } - if (!Objects.equals(currentOrderPosition.getPrice(), currentOrderPosition.getPrice())) { - throw new IllegalPropertyChangeException(updateOrderPosition, "price"); - } - if (!Objects.equals(currentOrderPosition.getOfferName(), currentOrderPosition.getOfferName())) { - throw new IllegalPropertyChangeException(updateOrderPosition, "offerName"); - } - OrderPositionState currentState = currentOrderPosition.getState(); - OrderPositionState newState = updateOrderPosition.getState(); - ProductOrderState newDrinkState = updateOrderPosition.getDrinkState(); - - verifyOrderPositionStateChange(updateOrderPosition, currentState, newState); - - // TODO add verification methods of other sub-states of OrderPosition (i.e. Meal and SideDish) - verifyDrinkStateChange(updateOrderPosition, currentState, newState, newDrinkState); - - } - - /** - * Verifies if an update of the {@link OrderPositionState} is legal. - * - * @param updateOrderPosition the new {@link OrderPosition} to update to. - * @param currentState the old/current {@link OrderPositionState} of the {@link OrderPosition}. - * @param newState new {@link OrderPositionState} of the {@link OrderPosition} to be updated to. - */ - private void verifyOrderPositionStateChange(OrderPosition updateOrderPosition, OrderPositionState currentState, - OrderPositionState newState) { - - switch (currentState) { - case CANCELLED: - if ((newState != OrderPositionState.CANCELLED) && (newState != OrderPositionState.ORDERED)) { - throw new IllegalEntityStateException(updateOrderPosition, currentState, newState); - } - break; - case ORDERED: - if ((newState != OrderPositionState.ORDERED) && (newState != OrderPositionState.CANCELLED) - && (newState != OrderPositionState.PREPARED)) { - throw new IllegalEntityStateException(updateOrderPosition, currentState, newState); - } - break; - case PREPARED: - // from here we can go to any other state (back to ORDERED in case that the kitchen has to rework) - break; - case DELIVERED: - if ((newState == OrderPositionState.PREPARED) || (newState == OrderPositionState.ORDERED)) { - throw new IllegalEntityStateException(updateOrderPosition, currentState, newState); - } - break; - case PAYED: - if (newState != OrderPositionState.PAYED) { - throw new IllegalEntityStateException(updateOrderPosition, currentState, newState); - } - break; - default: - LOG.error("Illegal state {}", currentState); - break; - } - - } - - /** - * Verifies if an update of the {@link ProductOrderState} is legal. This verification is based on both the states of - * {@link ProductOrderState} and {@link OrderPositionState}. - * - * @param updateOrderPosition the new {@link OrderPosition} to update to. - * @param currentState the old/current {@link OrderPositionState} of the {@link OrderPosition}. - * @param newState new {@link OrderPositionState} of the {@link OrderPosition} to be updated to. - * @param newDrinkState new {@link ProductOrderState} of the drink of the {@link OrderPosition} to be updated to. - */ - private void verifyDrinkStateChange(OrderPosition updateOrderPosition, OrderPositionState currentState, - OrderPositionState newState, ProductOrderState newDrinkState) { - - switch (currentState) { - case CANCELLED: - if ((newState != OrderPositionState.CANCELLED) && (newState != OrderPositionState.ORDERED)) { - throw new IllegalEntityStateException(updateOrderPosition, currentState, newDrinkState); - } - break; - case ORDERED: - if ((newState != OrderPositionState.ORDERED) && (newState != OrderPositionState.CANCELLED) - && (newState != OrderPositionState.PREPARED) && (newDrinkState != ProductOrderState.ORDERED) - && (newDrinkState != ProductOrderState.PREPARED)) { - throw new IllegalEntityStateException(updateOrderPosition, currentState, newDrinkState); - } - break; - case PREPARED: - // from here we can go to any other state (back to ORDERED in case that the kitchen has to rework) - break; - case DELIVERED: - if ((newState == OrderPositionState.PREPARED) || (newState == OrderPositionState.ORDERED) - || (newDrinkState == ProductOrderState.PREPARED) || (newDrinkState == ProductOrderState.ORDERED)) { - throw new IllegalEntityStateException(updateOrderPosition, currentState, newDrinkState); - } - break; - case PAYED: - if (newState != OrderPositionState.PAYED) { - throw new IllegalEntityStateException(updateOrderPosition, currentState, newDrinkState); - } - break; - default: - LOG.error("Illegal state {}", currentState); - break; - } - - } - - /** - * @param salesManagement the {@link Salesmanagement} to {@link Inject}. - */ - @Inject - public void setSalesManagement(Salesmanagement salesManagement) { - - this.salesManagement = salesManagement; - } - - /** - * @param offerManagement the {@link Offermanagement} to {@link Inject}. - */ - @Inject - public void setOfferManagement(Offermanagement offerManagement) { - - this.offerManagement = offerManagement; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/service/api/rest/SalesmanagementRestService.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/service/api/rest/SalesmanagementRestService.java deleted file mode 100644 index e4e6a9aa5..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/service/api/rest/SalesmanagementRestService.java +++ /dev/null @@ -1,205 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.service.api.rest; - -import java.util.List; - -import javax.ws.rs.Consumes; -import javax.ws.rs.DELETE; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.UriInfo; - -import io.oasp.gastronomy.restaurant.general.common.api.RestService; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.OfferEto; -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype.PaymentStatus; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.Salesmanagement; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.BillCto; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.BillEto; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderCto; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderEto; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderPositionEto; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderSearchCriteriaTo; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.PaymentData; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.usecase.UcChangeTable; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.usecase.UcFindBill; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.usecase.UcFindOrder; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.usecase.UcFindOrderPosition; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.usecase.UcManageBill; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.usecase.UcManageOrder; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.usecase.UcManageOrderPosition; -import io.oasp.module.jpa.common.api.to.PaginatedListTo; - -/** - * - * The service class for REST calls in order to execute the methods in {@link Salesmanagement}. - * - */ - -@Path("/salesmanagement/v1") -@Consumes(MediaType.APPLICATION_JSON) -@Produces(MediaType.APPLICATION_JSON) -public interface SalesmanagementRestService extends RestService { - - /** - * Delegates to {@link UcFindOrder#findOrder}. - * - * @param orderId specified for the order - * @return the order - */ - @Path("/order/{orderId}") - @GET - OrderEto findOrder(@PathParam("orderId") long orderId); - - /** - * Delegates to {@link UcFindOrderPosition#findOrderPositions}. - * - * @param info is the {@link UriInfo}. - * @return the {@link List} of matching {@link OrderCto}s. - */ - @Path("/order") - @GET - PaginatedListTo findOrders(@Context UriInfo info); - - /** - * Delegates to {@link UcFindOrderPosition#findOrderPositions}. - * - * @param searchCriteriaTo the pagination and search criteria to be used for finding orders. - * @return the {@link PaginatedListTo list} of matching {@link OrderCto}s. - */ - @Path("/order/search") - @POST - PaginatedListTo findOrdersByPost(OrderSearchCriteriaTo searchCriteriaTo); - - /** - * Delegates to {@link UcFindOrderPosition#findOrderPositions}. - * - * @param info is the {@link UriInfo}. - * @return the {@link List} of matching {@link OrderPositionEto}s. - */ - @Path("/orderposition") - @GET - List findOrderPositions(@Context UriInfo info); - - /** - * Delegates to {@link UcManageOrder#saveOrder}. - * - * @param order the {@link OrderCto} to update. - * @param orderId the {@link OrderEto#getId() ID} of the order. - * @return the updated {@link OrderCto}. - */ - @Path("/order/{orderId}") - @PUT - @Deprecated - public OrderCto updateOrder(OrderCto order, @PathParam("orderId") long orderId); - - /** - * Delegates to {@link UcManageOrder#saveOrder}. - * - * @param order the {@link OrderCto} to save. - * @return the saved {@link OrderCto} (with {@link OrderEto#getId() ID}(s) assigned). - */ - @Path("/order/") - @POST - OrderCto saveOrder(OrderCto order); - - /** - * Delegates to {@link UcFindOrderPosition#findOrderPosition}. - * - * @param orderPositionId id of the {@link OrderPositionEto} - * @return the {@link OrderPositionEto}. - */ - @Path("/orderposition/{orderPositionId}") - @GET - OrderPositionEto findOrderPosition(@PathParam("orderPositionId") long orderPositionId); - - /** - * Delegates to {@link UcManageOrderPosition#createOrderPosition}. - * - * @param offer the offer as new position within an order as JSON - * @param orderId the order id - * @param comment the comment together with an orderPosition - * @return a new orderPosition - * @deprecated not REST style, will be removed. - */ - @Path("/order/{orderId}/position/{comment}") - @POST - @Deprecated - OrderPositionEto createOrderPosition(OfferEto offer, @PathParam("orderId") long orderId, - @PathParam("comment") String comment); - - /** - * Delegates to {@link UcManageOrderPosition#saveOrderPosition}. - * - * @param orderPosition the OrderPositionEto to save - * @return the saved OrderPositionEto - */ - @POST - @Path("/orderposition/") - OrderPositionEto saveOrderPosition(OrderPositionEto orderPosition); - - /** - * Delegates to {@link UcFindBill#findBill}. - * - * @param billId id of the {@link BillEto} - * @return the {@link BillEto} - */ - @GET - @Path("/bill/{billId}") - BillCto findBill(@PathParam("billId") long billId); - - /** - * Delegates to {@link UcManageBill#doPayment}. - * - * @param billId id of the bill - * @return the {@link PaymentStatus} - */ - @POST - @Path("/bill/{billId}/payment") - PaymentStatus doPayment(@PathParam("billId") long billId); - - /** - * Delegates to {@link UcManageBill#doPayment(BillEto bill, PaymentData paymentDataDebitor)}. - * - * @param billId id of the {@link BillEto} - * @param paymentData the {@link PaymentData} - * @return the {@link PaymentStatus} - */ - @Path("/bill/{billId}/payment") - @POST - PaymentStatus doPayment(@PathParam("billId") long billId, PaymentData paymentData); - - /** - * Delegates to {@link UcManageBill#createBill}. - * - * @param bill the bill to create - * @return the created {@link BillEto} - */ - @POST - @Path("/bill/") - BillEto createBill(BillEto bill); - - /** - * Delegates to {@link UcManageBill#deleteBill}. - * - * @param billId id of the {@link BillEto} - */ - @Path("/bill/{billId}") - @DELETE - void deleteBill(@PathParam("billId") long billId); - - /** - * Delegates to {@link UcChangeTable#changeTable}. - * - * @param orderId the Id of the order - * @param newTableId the Id of the new table - */ - @Path("/order/{orderId}") - @POST - void changeTable(@PathParam("orderId") long orderId, long newTableId); - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/service/api/websocket/PositionStatusChangeTo.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/service/api/websocket/PositionStatusChangeTo.java deleted file mode 100644 index 019c47cde..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/service/api/websocket/PositionStatusChangeTo.java +++ /dev/null @@ -1,42 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.service.api.websocket; - -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype.OrderPositionState; - -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonProperty; - -public class PositionStatusChangeTo { - private Long id; - - private OrderPositionState status; - - /** - * - * The constructor. - * - * @param id OrderId - * @param status OrderPositionState - */ - @JsonCreator - public PositionStatusChangeTo(@JsonProperty("id") Long id, @JsonProperty("status") OrderPositionState status) { - - this.id = id; - this.status = status; - } - - /** - * @return id - */ - public Long getId() { - - return this.id; - } - - /** - * @return OrderPosition status - */ - public OrderPositionState getStatus() { - - return this.status; - } -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/service/impl/rest/SalesmanagementRestServiceImpl.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/service/impl/rest/SalesmanagementRestServiceImpl.java deleted file mode 100644 index 14b6830a5..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/service/impl/rest/SalesmanagementRestServiceImpl.java +++ /dev/null @@ -1,168 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.service.impl.rest; - -import java.util.List; -import java.util.Objects; - -import javax.inject.Inject; -import javax.inject.Named; -import javax.ws.rs.BadRequestException; -import javax.ws.rs.core.UriInfo; - -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.OfferEto; -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype.OrderPositionState; -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype.OrderState; -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype.PaymentStatus; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.Salesmanagement; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.BillCto; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.BillEto; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderCto; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderEto; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderPositionEto; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderPositionSearchCriteriaTo; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderSearchCriteriaTo; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.PaymentData; -import io.oasp.gastronomy.restaurant.salesmanagement.service.api.rest.SalesmanagementRestService; -import io.oasp.module.jpa.common.api.to.PaginatedListTo; -import io.oasp.module.jpa.common.api.to.PaginationTo; -import io.oasp.module.rest.service.api.RequestParameters; - -/** - */ -@Named("SalesmanagementRestService") -public class SalesmanagementRestServiceImpl implements SalesmanagementRestService { - - private Salesmanagement salesmanagement; - - @Override - public OrderEto findOrder(long orderId) { - - return this.salesmanagement.findOrder(orderId); - } - - @Override - public PaginatedListTo findOrders(UriInfo info) { - - RequestParameters parameters = RequestParameters.fromQuery(info); - OrderSearchCriteriaTo criteria = new OrderSearchCriteriaTo(); - criteria.setTableId(parameters.get("tableId", Long.class, false)); - criteria.setState(parameters.get("state", OrderState.class, false)); - - Integer page = parameters.get("pagination[page]", Integer.class, false); - if (page != null) { - PaginationTo pagination = new PaginationTo(); - pagination.setPage(page); - pagination.setSize(parameters.get("pagination[size]", Integer.class, false)); - criteria.setPagination(pagination); - } - - return this.salesmanagement.findOrderCtos(criteria); - } - - @Override - public PaginatedListTo findOrdersByPost(OrderSearchCriteriaTo searchCriteriaTo) { - - return this.salesmanagement.findOrderCtos(searchCriteriaTo); - } - - @Override - public List findOrderPositions(UriInfo info) { - - RequestParameters parameters = RequestParameters.fromQuery(info); - OrderPositionSearchCriteriaTo criteria = new OrderPositionSearchCriteriaTo(); - criteria.setOrderId(parameters.get("orderId", Long.class, false)); - criteria.setCookId(parameters.get("cookId", Long.class, false)); - criteria.setState(parameters.get("state", OrderPositionState.class, false)); - criteria.setMealOrSideDish(parameters.get("mealOrSideDish", boolean.class, false)); - return this.salesmanagement.findOrderPositions(criteria); - } - - @Override - @Deprecated - public OrderCto updateOrder(OrderCto order, long orderId) { - - Objects.requireNonNull(order, "order"); - OrderEto orderEto = order.getOrder(); - Objects.requireNonNull(orderEto, "order"); - Long jsonOrderId = orderEto.getId(); - if (jsonOrderId == null) { - orderEto.setId(orderId); - } else if (!jsonOrderId.equals(orderId)) { - throw new BadRequestException("Order ID of URL does not match JSON payload!"); - } - return this.salesmanagement.saveOrder(order); - } - - @Override - public OrderCto saveOrder(OrderCto order) { - - return this.salesmanagement.saveOrder(order); - } - - @Override - public OrderPositionEto findOrderPosition(long orderPositionId) { - - return this.salesmanagement.findOrderPosition(orderPositionId); - - } - - @Override - @Deprecated - public OrderPositionEto createOrderPosition(OfferEto offer, long orderId, String comment) { - - return this.salesmanagement.createOrderPosition(offer, findOrder(orderId), comment); - } - - @Override - public OrderPositionEto saveOrderPosition(OrderPositionEto orderPosition) { - - return this.salesmanagement.saveOrderPosition(orderPosition); - } - - @Override - public BillCto findBill(long billId) { - - return this.salesmanagement.findBill(billId); - } - - @Override - public PaymentStatus doPayment(long billId) { - - return this.salesmanagement.doPayment(findBill(billId).getBill()); - } - - @Override - public PaymentStatus doPayment(long billId, PaymentData paymentData) { - - return this.salesmanagement.doPayment(findBill(billId).getBill(), paymentData); - } - - @Override - public BillEto createBill(BillEto bill) { - - return this.salesmanagement.createBill(bill); - } - - @Override - public void deleteBill(long billId) { - - this.salesmanagement.deleteBill(billId); - } - - @Override - public void changeTable(long orderId, long newTableId) { - - this.salesmanagement.changeTable(orderId, newTableId); - } - - /** - * This method sets the field salesmanagement. - * - * @param salesmanagement the new value of the field salesmanagement - */ - @Inject - public void setSalesmanagement(Salesmanagement salesmanagement) { - - this.salesmanagement = salesmanagement; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/service/impl/websocket/OrderPositionWebSocketController.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/service/impl/websocket/OrderPositionWebSocketController.java deleted file mode 100644 index 73ff83c7c..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/service/impl/websocket/OrderPositionWebSocketController.java +++ /dev/null @@ -1,16 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.service.impl.websocket; - -import org.springframework.messaging.handler.annotation.MessageMapping; -import org.springframework.messaging.handler.annotation.SendTo; -import org.springframework.stereotype.Controller; - -import io.oasp.gastronomy.restaurant.salesmanagement.service.api.websocket.PositionStatusChangeTo; - -@Controller -public class OrderPositionWebSocketController { - @MessageMapping("/positions") - @SendTo("/topic/positionStatusChange") - public PositionStatusChangeTo statusChanged(PositionStatusChangeTo positionStatusChange) { - return positionStatusChange; - } -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/service/impl/websocket/config/WebSocketConfig.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/service/impl/websocket/config/WebSocketConfig.java deleted file mode 100644 index 6086a3171..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/salesmanagement/service/impl/websocket/config/WebSocketConfig.java +++ /dev/null @@ -1,26 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.service.impl.websocket.config; - -import org.springframework.context.annotation.Configuration; -import org.springframework.messaging.simp.config.MessageBrokerRegistry; -import org.springframework.web.socket.config.annotation.AbstractWebSocketMessageBrokerConfigurer; -import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; -import org.springframework.web.socket.config.annotation.StompEndpointRegistry; - -@Configuration -@EnableWebSocketMessageBroker -public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer { - - @Override - public void configureMessageBroker(MessageBrokerRegistry config) { - - config.enableSimpleBroker("/topic"); - config.setApplicationDestinationPrefixes("/sample"); - } - - @Override - public void registerStompEndpoints(StompEndpointRegistry registry) { - - registry.addEndpoint("/websocket/positions").withSockJS(); - } - -} \ No newline at end of file diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/staffmanagement/common/api/StaffMember.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/staffmanagement/common/api/StaffMember.java deleted file mode 100644 index 12eb9569a..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/staffmanagement/common/api/StaffMember.java +++ /dev/null @@ -1,33 +0,0 @@ -package io.oasp.gastronomy.restaurant.staffmanagement.common.api; - -import io.oasp.gastronomy.restaurant.general.common.api.ApplicationEntity; -import io.oasp.gastronomy.restaurant.general.common.api.UserProfile; -import io.oasp.gastronomy.restaurant.general.common.api.datatype.Role; - -/** - * This is the interface for a {@link StaffMember} that is an employee of the restaurant. - * - */ -public interface StaffMember extends ApplicationEntity, UserProfile { - - /** - * @param name is the new {@link #getName() login}. - */ - void setName(String name); - - /** - * @param firstName is the new {@link #getFirstName() first name}. - */ - void setFirstName(String firstName); - - /** - * @param lastName is the new {@link #getLastName() last name}. - */ - void setLastName(String lastName); - - /** - * @param role the new {@link #getRole() role}. - */ - void setRole(Role role); - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/staffmanagement/dataaccess/api/StaffMemberEntity.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/staffmanagement/dataaccess/api/StaffMemberEntity.java deleted file mode 100644 index f73f86ad6..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/staffmanagement/dataaccess/api/StaffMemberEntity.java +++ /dev/null @@ -1,87 +0,0 @@ -package io.oasp.gastronomy.restaurant.staffmanagement.dataaccess.api; - -import io.oasp.gastronomy.restaurant.general.common.api.datatype.Role; -import io.oasp.gastronomy.restaurant.general.dataaccess.api.ApplicationPersistenceEntity; -import io.oasp.gastronomy.restaurant.staffmanagement.common.api.StaffMember; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Table; - -/** - * The {@link io.oasp.gastronomy.restaurant.general.dataaccess.api.ApplicationPersistenceEntity persistent entity} for - * {@link StaffMember}. - * - */ -@Entity -@Table(name = "StaffMember") -public class StaffMemberEntity extends ApplicationPersistenceEntity implements StaffMember { - - private static final long serialVersionUID = 1L; - - private String name; - - private String firstName; - - private String lastName; - - private Role role; - - /** - * The constructor. - */ - public StaffMemberEntity() { - - super(); - } - - @Column(name = "login", unique = true) - @Override - public String getName() { - - return this.name; - } - - @Override - public void setName(String login) { - - this.name = login; - } - - @Override - public String getFirstName() { - - return this.firstName; - } - - @Override - public void setFirstName(String firstName) { - - this.firstName = firstName; - } - - @Override - public String getLastName() { - - return this.lastName; - } - - @Override - public void setLastName(String lastName) { - - this.lastName = lastName; - } - - @Override - public Role getRole() { - - return this.role; - } - - @Override - public void setRole(Role role) { - - this.role = role; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/staffmanagement/dataaccess/api/dao/StaffMemberDao.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/staffmanagement/dataaccess/api/dao/StaffMemberDao.java deleted file mode 100644 index ffbf5c5d0..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/staffmanagement/dataaccess/api/dao/StaffMemberDao.java +++ /dev/null @@ -1,31 +0,0 @@ -package io.oasp.gastronomy.restaurant.staffmanagement.dataaccess.api.dao; - -import io.oasp.gastronomy.restaurant.general.dataaccess.api.dao.ApplicationDao; -import io.oasp.gastronomy.restaurant.staffmanagement.dataaccess.api.StaffMemberEntity; -import io.oasp.gastronomy.restaurant.staffmanagement.logic.api.to.StaffMemberSearchCriteriaTo; -import io.oasp.module.jpa.common.api.to.PaginatedListTo; -import io.oasp.module.jpa.dataaccess.api.MasterDataDao; - -/** - * {@link ApplicationDao Data Access Object} for {@link StaffMemberEntity} entity. - * - */ -public interface StaffMemberDao extends ApplicationDao, MasterDataDao { - - /** - * Searchs the restaurant staff member with identifier 'login' within the database. - * - * @param login staff member identifier - * @return Staffmember - */ - StaffMemberEntity findByLogin(String login); - - /** - * Finds the {@link StaffMemberEntity} objects matching the given {@link StaffMemberSearchCriteriaTo}- - * - * @param criteria is the {@link StaffMemberSearchCriteriaTo}. - * @return the {@link PaginatedListTo} with the matching {@link StaffMemberEntity} objects. - */ - PaginatedListTo findStaffMembers(StaffMemberSearchCriteriaTo criteria); - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/staffmanagement/dataaccess/impl/dao/StaffMemberDaoImpl.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/staffmanagement/dataaccess/impl/dao/StaffMemberDaoImpl.java deleted file mode 100644 index 4809b0a2e..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/staffmanagement/dataaccess/impl/dao/StaffMemberDaoImpl.java +++ /dev/null @@ -1,78 +0,0 @@ -package io.oasp.gastronomy.restaurant.staffmanagement.dataaccess.impl.dao; - -import static com.mysema.query.alias.Alias.$; -import io.oasp.gastronomy.restaurant.general.common.api.constants.NamedQueries; -import io.oasp.gastronomy.restaurant.general.common.api.datatype.Role; -import io.oasp.gastronomy.restaurant.general.dataaccess.base.dao.ApplicationMasterDataDaoImpl; -import io.oasp.gastronomy.restaurant.staffmanagement.dataaccess.api.StaffMemberEntity; -import io.oasp.gastronomy.restaurant.staffmanagement.dataaccess.api.dao.StaffMemberDao; -import io.oasp.gastronomy.restaurant.staffmanagement.logic.api.to.StaffMemberSearchCriteriaTo; -import io.oasp.module.jpa.common.api.to.PaginatedListTo; - -import javax.inject.Named; -import javax.persistence.TypedQuery; - -import com.mysema.query.alias.Alias; -import com.mysema.query.jpa.impl.JPAQuery; -import com.mysema.query.types.path.EntityPathBase; - -/** - * Implementation of {@link StaffMemberDao}. - * - */ -@Named -public class StaffMemberDaoImpl extends ApplicationMasterDataDaoImpl implements StaffMemberDao { - - /** - * The constructor. - */ - public StaffMemberDaoImpl() { - - super(); - } - - @Override - public Class getEntityClass() { - - return StaffMemberEntity.class; - } - - @Override - public StaffMemberEntity findByLogin(String login) { - - TypedQuery query = - getEntityManager().createNamedQuery(NamedQueries.GET_STAFF_MEMBER_BY_LOGIN, StaffMemberEntity.class); - query.setParameter("login", login); - return query.getSingleResult(); - } - - /** - * {@inheritDoc} - */ - @Override - public PaginatedListTo findStaffMembers(StaffMemberSearchCriteriaTo criteria) { - - StaffMemberEntity staffMember = Alias.alias(StaffMemberEntity.class); - EntityPathBase alias = $(staffMember); - JPAQuery query = new JPAQuery(getEntityManager()).from(alias); - - String firstName = criteria.getFirstName(); - if (firstName != null) { - query.where($(staffMember.getFirstName()).eq(firstName)); - } - String lastName = criteria.getLastName(); - if (lastName != null) { - query.where($(staffMember.getLastName()).eq(lastName)); - } - String name = criteria.getName(); - if (name != null) { - query.where($(staffMember.getName()).eq(name)); - } - Role role = criteria.getRole(); - if (role != null) { - query.where($(staffMember.getRole()).eq(role)); - } - - return findPaginated(criteria, query, alias); - } -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/staffmanagement/logic/api/Staffmanagement.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/staffmanagement/logic/api/Staffmanagement.java deleted file mode 100644 index b7870f973..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/staffmanagement/logic/api/Staffmanagement.java +++ /dev/null @@ -1,58 +0,0 @@ -package io.oasp.gastronomy.restaurant.staffmanagement.logic.api; - -import io.oasp.gastronomy.restaurant.staffmanagement.logic.api.to.StaffMemberEto; -import io.oasp.gastronomy.restaurant.staffmanagement.logic.api.to.StaffMemberSearchCriteriaTo; -import io.oasp.module.jpa.common.api.to.PaginatedListTo; - -import java.util.List; - -/** - * Interface for StaffManagement component. - * - */ -public interface Staffmanagement { - - /** - * @param id the {@link StaffMemberEto#getId() ID} of the requested staff member. - * @return The {@link StaffMemberEto} with the given id or {@code null} if no such object exists. - */ - StaffMemberEto findStaffMember(Long id); - - /** - * @param login The {@link StaffMemberEto#getName() login} of the requested staff member. - * @return The {@link StaffMemberEto} with the given login or {@code null} if no such object exists. - */ - StaffMemberEto findStaffMemberByLogin(String login); - - /** - * @return {@link List} of all existing {@link StaffMemberEto staff members}. - */ - List findAllStaffMembers(); - - /** - * Returns a list of staff memberss matching the search criteria. - * - * @param criteria the {@link StaffMemberSearchCriteriaTo}. - * @return the {@link List} of matching {@link StaffMemberEto}s. - */ - PaginatedListTo findStaffMemberEtos(StaffMemberSearchCriteriaTo criteria); - - /** - * @param staffMemberId the {@link StaffMemberEto#getId() ID} of a {@link StaffMemberEto} to delete. - */ - void deleteStaffMember(Long staffMemberId); - - /** - * @param login {@link StaffMemberEto#getName() login} of a {@link StaffMemberEto} to delete. - */ - void deleteStaffMemberByLogin(String login); - - /** - * Creates or updates a {@link StaffMemberEto}. - * - * @param staffMember The {@link StaffMemberEto} to create or update. - * @return the saved {@link StaffMemberEto} - */ - StaffMemberEto saveStaffMember(StaffMemberEto staffMember); - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/staffmanagement/logic/api/to/StaffMemberEto.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/staffmanagement/logic/api/to/StaffMemberEto.java deleted file mode 100644 index 833a80083..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/staffmanagement/logic/api/to/StaffMemberEto.java +++ /dev/null @@ -1,99 +0,0 @@ -package io.oasp.gastronomy.restaurant.staffmanagement.logic.api.to; - -import io.oasp.gastronomy.restaurant.general.common.api.datatype.Role; -import io.oasp.gastronomy.restaurant.staffmanagement.common.api.StaffMember; -import io.oasp.module.basic.common.api.to.AbstractEto; - -import java.util.Locale; - -/** - * The {@link AbstractEto ETO} for a {@link StaffMember}. - * - */ -public class StaffMemberEto extends AbstractEto implements StaffMember { - - // UUID - private static final long serialVersionUID = 1L; - - private String name; - - private String firstName; - - private String lastName; - - private Role role; - - private Locale language; - - /** - * The constructor. - */ - public StaffMemberEto() { - - super(); - } - - @Override - public String getName() { - - return this.name; - } - - @Override - public void setName(String name) { - - this.name = name; - } - - @Override - public String getFirstName() { - - return this.firstName; - } - - @Override - public void setFirstName(String firstName) { - - this.firstName = firstName; - } - - @Override - public String getLastName() { - - return this.lastName; - } - - @Override - public void setLastName(String lastName) { - - this.lastName = lastName; - } - - @Override - public Role getRole() { - - return this.role; - } - - @Override - public void setRole(Role role) { - - this.role = role; - } - - /** - * @return language - */ - public Locale getLanguage() { - - return this.language; - } - - /** - * @param language the language to set - */ - public void setLanguage(Locale language) { - - this.language = language; - } -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/staffmanagement/logic/api/to/StaffMemberSearchCriteriaTo.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/staffmanagement/logic/api/to/StaffMemberSearchCriteriaTo.java deleted file mode 100644 index 14d5e8cfc..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/staffmanagement/logic/api/to/StaffMemberSearchCriteriaTo.java +++ /dev/null @@ -1,96 +0,0 @@ -package io.oasp.gastronomy.restaurant.staffmanagement.logic.api.to; - -import io.oasp.gastronomy.restaurant.general.common.api.datatype.Role; -import io.oasp.module.jpa.common.api.to.SearchCriteriaTo; - -/** - * This is the {@link SearchCriteriaTo search criteria} {@link net.sf.mmm.util.transferobject.api.TransferObject TO} - * used to find {@link io.oasp.gastronomy.restaurant.staffmanagement.common.api.StaffMember}s. - * - */ -public class StaffMemberSearchCriteriaTo extends SearchCriteriaTo { - - /** UID for serialization. */ - private static final long serialVersionUID = 1L; - - private String name; - - private String firstName; - - private String lastName; - - private Role role; - - /** - * The constructor. - */ - public StaffMemberSearchCriteriaTo() { - - super(); - } - - /** - * @return name - */ - public String getName() { - - return this.name; - } - - /** - * @param name the name to set - */ - public void setName(String name) { - - this.name = name; - } - - /** - * @return firstName - */ - public String getFirstName() { - - return this.firstName; - } - - /** - * @param firstName the firstName to set - */ - public void setFirstName(String firstName) { - - this.firstName = firstName; - } - - /** - * @return lastName - */ - public String getLastName() { - - return this.lastName; - } - - /** - * @param lastName the lastName to set - */ - public void setLastName(String lastName) { - - this.lastName = lastName; - } - - /** - * @return role - */ - public Role getRole() { - - return this.role; - } - - /** - * @param role the role to set - */ - public void setRole(Role role) { - - this.role = role; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/staffmanagement/logic/impl/StaffmanagementImpl.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/staffmanagement/logic/impl/StaffmanagementImpl.java deleted file mode 100644 index 5d05134db..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/staffmanagement/logic/impl/StaffmanagementImpl.java +++ /dev/null @@ -1,160 +0,0 @@ -package io.oasp.gastronomy.restaurant.staffmanagement.logic.impl; - -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; - -import javax.annotation.security.RolesAllowed; -import javax.inject.Inject; -import javax.inject.Named; -import javax.transaction.Transactional; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; - -import io.oasp.gastronomy.restaurant.general.common.api.UserProfile; -import io.oasp.gastronomy.restaurant.general.common.api.Usermanagement; -import io.oasp.gastronomy.restaurant.general.common.api.constants.PermissionConstants; -import io.oasp.gastronomy.restaurant.general.logic.base.AbstractComponentFacade; -import io.oasp.gastronomy.restaurant.staffmanagement.dataaccess.api.StaffMemberEntity; -import io.oasp.gastronomy.restaurant.staffmanagement.dataaccess.api.dao.StaffMemberDao; -import io.oasp.gastronomy.restaurant.staffmanagement.logic.api.Staffmanagement; -import io.oasp.gastronomy.restaurant.staffmanagement.logic.api.to.StaffMemberEto; -import io.oasp.gastronomy.restaurant.staffmanagement.logic.api.to.StaffMemberSearchCriteriaTo; -import io.oasp.module.jpa.common.api.to.PaginatedListTo; - -/** - * Implementation of {@link Staffmanagement}. - * - */ -@Named -@Component -@Transactional -public class StaffmanagementImpl extends AbstractComponentFacade implements Staffmanagement, Usermanagement { - - /** Logger instance. */ - private static final Logger LOG = LoggerFactory.getLogger(StaffmanagementImpl.class); - - /** @see #getStaffMemberDao() */ - private StaffMemberDao staffMemberDao; - - /** - * Do not extract this method as a service, because of PermitAll. (only for login) - */ - @Override - @RolesAllowed(PermissionConstants.FIND_STAFF_MEMBER) - public StaffMemberEto findStaffMemberByLogin(String login) { - - return privateFindStaffMemberByLogin(login); - } - - @Override - @RolesAllowed(PermissionConstants.FIND_STAFF_MEMBER) - public StaffMemberEto findStaffMember(Long id) { - - return getBeanMapper().map(getStaffMemberDao().find(id), StaffMemberEto.class); - } - - @Override - @RolesAllowed(PermissionConstants.FIND_STAFF_MEMBER) - public List findAllStaffMembers() { - - List members = getStaffMemberDao().findAll(); - List membersBo = new ArrayList<>(); - - for (StaffMemberEntity member : members) { - membersBo.add(getBeanMapper().map(member, StaffMemberEto.class)); - } - - return membersBo; - } - - @Override - @RolesAllowed(PermissionConstants.FIND_STAFF_MEMBER) - public PaginatedListTo findStaffMemberEtos(StaffMemberSearchCriteriaTo criteria) { - - // Uncomment next line in order to limit the maximum page size for the staff member search - // criteria.limitMaximumPageSize(MAXIMUM_HIT_LIMIT); - - PaginatedListTo offers = getStaffMemberDao().findStaffMembers(criteria); - return mapPaginatedEntityList(offers, StaffMemberEto.class); - } - - @Override - // used during authentication so not authorization annotation (not even @PermitAll) can be used here - public UserProfile findUserProfileByLogin(String login) { - - return privateFindStaffMemberByLogin(login); - } - - /** - * Do not extract this method as a service, because of PermitAll. (only for login) - */ - private StaffMemberEto privateFindStaffMemberByLogin(String login) { - - return getBeanMapper().map(getStaffMemberDao().findByLogin(login), StaffMemberEto.class); - } - - @Override - @RolesAllowed(PermissionConstants.DELETE_STAFF_MEMBER) - public void deleteStaffMemberByLogin(String login) { - - getStaffMemberDao().delete(getStaffMemberDao().findByLogin(login)); - } - - @Override - @RolesAllowed(PermissionConstants.DELETE_STAFF_MEMBER) - public void deleteStaffMember(Long staffMemberId) { - - getStaffMemberDao().delete(staffMemberId); - } - - @Override - @RolesAllowed(PermissionConstants.SAVE_STAFF_MEMBER) - public StaffMemberEto saveStaffMember(StaffMemberEto staffMember) { - - Objects.requireNonNull(staffMember, "staffMember"); - - Long id = staffMember.getId(); - StaffMemberEntity targetStaffMember = null; - - if (id != null) { - targetStaffMember = getStaffMemberDao().find(id); - } - if (targetStaffMember == null) { - // StaffMember is new: -> create - LOG.debug("Saving StaffMember with id '{}' to the database.", id); - } else { - // StaffMember already exists: -> Update - LOG.debug("Updating StaffMember with id '{}' in the database.", id); - if (!Objects.equals(targetStaffMember.getName(), staffMember.getName())) { - LOG.debug("Changing login of StaffMember with id '{}' from '{}' to '{}' in the database.", id, - targetStaffMember.getName(), staffMember.getName()); - } - } - StaffMemberEntity persistedStaffMember = - getStaffMemberDao().save(getBeanMapper().map(staffMember, StaffMemberEntity.class)); - return getBeanMapper().map(persistedStaffMember, StaffMemberEto.class); - } - - /** - * @return the {@link StaffMemberDao} instance. - */ - public StaffMemberDao getStaffMemberDao() { - - return this.staffMemberDao; - } - - /** - * Sets the field 'staffMemberDao'. - * - * @param staffMemberDao New value for staffMemberDao - */ - @Inject - public void setStaffMemberDao(StaffMemberDao staffMemberDao) { - - this.staffMemberDao = staffMemberDao; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/staffmanagement/service/api/rest/StaffmanagementRestService.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/staffmanagement/service/api/rest/StaffmanagementRestService.java deleted file mode 100644 index dc6cd0401..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/staffmanagement/service/api/rest/StaffmanagementRestService.java +++ /dev/null @@ -1,83 +0,0 @@ -package io.oasp.gastronomy.restaurant.staffmanagement.service.api.rest; - -import java.util.List; - -import javax.ws.rs.Consumes; -import javax.ws.rs.DELETE; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; - -import io.oasp.gastronomy.restaurant.general.common.api.RestService; -import io.oasp.gastronomy.restaurant.staffmanagement.logic.api.Staffmanagement; -import io.oasp.gastronomy.restaurant.staffmanagement.logic.api.to.StaffMemberEto; -import io.oasp.gastronomy.restaurant.staffmanagement.logic.api.to.StaffMemberSearchCriteriaTo; -import io.oasp.module.jpa.common.api.to.PaginatedListTo; - -/** - * - * The service class for REST calls in order to execute the methods in {@link Staffmanagement}. - * - */ -@Path("/staffmanagement/v1/staff") -@Consumes(MediaType.APPLICATION_JSON) -@Produces(MediaType.APPLICATION_JSON) -public interface StaffmanagementRestService extends RestService { - - /** - * @return a list of all {@link StaffMemberEto} - * - */ - @GET - @Path("/") - @Deprecated - List getAllStaffMember(); - - /** - * @param login the login of a staff member - * @return {@link StaffMemberEto} - */ - @GET - @Path("/{login}") - StaffMemberEto getStaffMember(@PathParam("login") String login); - - /** - * @param staffMemberBo the staffMember to be updated as JSON - */ - @PUT - @Path("/{login}") - @Deprecated - void updateStaffMember(StaffMemberEto staffMemberBo); - - /** - * Calls {@link Staffmanagement#saveStaffMember}. - * - * @param staffMemberEto the staffMember to be created or updated - * @return the saved {@link StaffMemberEto} - */ - @POST - @Path("/") - StaffMemberEto saveStaffMember(StaffMemberEto staffMemberEto); - - /** - * @param login the login - */ - @DELETE - @Path("/{login}") - void deleteStaffMember(@PathParam("login") String login); - - /** - * Delegates to {@link Staffmanagement#findStaffMemberEtos}. - * - * @param searchCriteriaTo the pagination and search criteria to be used for finding staffmembers. - * @return the {@link PaginatedListTo list} of matching {@link StaffMemberEto}s. - */ - @Path("/search") - @POST - PaginatedListTo findStaffMembersByPost(StaffMemberSearchCriteriaTo searchCriteriaTo); - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/staffmanagement/service/impl/rest/StaffmanagementRestServiceImpl.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/staffmanagement/service/impl/rest/StaffmanagementRestServiceImpl.java deleted file mode 100644 index c17799c9f..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/staffmanagement/service/impl/rest/StaffmanagementRestServiceImpl.java +++ /dev/null @@ -1,70 +0,0 @@ -package io.oasp.gastronomy.restaurant.staffmanagement.service.impl.rest; - -import java.util.List; - -import javax.inject.Inject; -import javax.inject.Named; - -import io.oasp.gastronomy.restaurant.staffmanagement.logic.api.Staffmanagement; -import io.oasp.gastronomy.restaurant.staffmanagement.logic.api.to.StaffMemberEto; -import io.oasp.gastronomy.restaurant.staffmanagement.logic.api.to.StaffMemberSearchCriteriaTo; -import io.oasp.gastronomy.restaurant.staffmanagement.service.api.rest.StaffmanagementRestService; -import io.oasp.module.jpa.common.api.to.PaginatedListTo; - -/** - */ -@Named("StaffmanagementRestService") -public class StaffmanagementRestServiceImpl implements StaffmanagementRestService { - - private Staffmanagement staffmanagement; - - /** - * @param staffManagement the staffManagement to be set - */ - @Inject - public void setStaffmanagement(Staffmanagement staffManagement) { - - this.staffmanagement = staffManagement; - } - - @Override - public List getAllStaffMember() { - - return this.staffmanagement.findAllStaffMembers(); - } - - @Override - public StaffMemberEto getStaffMember(String login) { - - return this.staffmanagement.findStaffMemberByLogin(login); - } - - // although login is not explicitly needed here, the path structure is intentionally chosen - // it is up to the GUI-Team to either insert a (maybe redundant) call on getStaffMember or to leave it - // like that and do the update right in the view of a previously "loaded" StaffMember - - @Override - @Deprecated - public void updateStaffMember(StaffMemberEto staffMemberBo) { - - this.staffmanagement.saveStaffMember(staffMemberBo); - } - - @Override - public StaffMemberEto saveStaffMember(StaffMemberEto staffMemberEto) { - - return this.staffmanagement.saveStaffMember(staffMemberEto); - } - - @Override - public void deleteStaffMember(String login) { - - this.staffmanagement.deleteStaffMemberByLogin(login); - } - - @Override - public PaginatedListTo findStaffMembersByPost(StaffMemberSearchCriteriaTo searchCriteriaTo) { - - return this.staffmanagement.findStaffMemberEtos(searchCriteriaTo); - } -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/tablemanagement/common/api/Table.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/tablemanagement/common/api/Table.java deleted file mode 100644 index 9d7c4ca1d..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/tablemanagement/common/api/Table.java +++ /dev/null @@ -1,52 +0,0 @@ -package io.oasp.gastronomy.restaurant.tablemanagement.common.api; - -import io.oasp.gastronomy.restaurant.general.common.api.ApplicationEntity; -import io.oasp.gastronomy.restaurant.tablemanagement.common.api.datatype.TableState; - -import javax.validation.constraints.Min; -import javax.validation.constraints.NotNull; - -/** - * This is the interface for a table of the restaurant. It has a unique {@link #getNumber() number} can be - * {@link TableState#isReserved() reserved}, {@link TableState#isOccupied() occupied} and may have a - * {@link #getWaiterId() waiter} assigned. - * - */ -public interface Table extends ApplicationEntity { - - /** - * @return the unique table number. - */ - @NotNull - @Min(0) - Long getNumber(); - - /** - * @param number is the new {@link #getNumber() number}. - */ - void setNumber(Long number); - - /** - * @return the current {@link TableState state} of this {@link Table}. - */ - TableState getState(); - - /** - * @param state is the new {@link #getState() state}. - */ - void setState(TableState state); - - /** - * @return the {@link io.oasp.gastronomy.restaurant.staffmanagement.common.api.StaffMember#getId() ID} of the waiter - * currently responsible for this table. - */ - Long getWaiterId(); - - /** - * Sets the field 'waiterId'. - * - * @param waiterId New value for waiterId - */ - void setWaiterId(Long waiterId); - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/tablemanagement/common/api/datatype/TableState.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/tablemanagement/common/api/datatype/TableState.java deleted file mode 100644 index bf0410fe6..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/tablemanagement/common/api/datatype/TableState.java +++ /dev/null @@ -1,50 +0,0 @@ -package io.oasp.gastronomy.restaurant.tablemanagement.common.api.datatype; - -/** - * Represents the {@link io.oasp.gastronomy.restaurant.tablemanagement.common.api.Table#getState() state} of a - * {@link io.oasp.gastronomy.restaurant.tablemanagement.common.api.Table}. - * - */ -public enum TableState { - /** The state of a free {@link io.oasp.gastronomy.restaurant.tablemanagement.common.api.Table}. */ - FREE, - - /** The state of a reserved {@link io.oasp.gastronomy.restaurant.tablemanagement.common.api.Table}. */ - RESERVED, - - /** The state of a occupied {@link io.oasp.gastronomy.restaurant.tablemanagement.common.api.Table}. */ - OCCUPIED; - - /** - * @return {@code true} if {@link #FREE}, {@code false} otherwise. - */ - public boolean isFree() { - - return (this == FREE); - } - - /** - * @return {@code true} if {@link #RESERVED}, {@code false} otherwise. - */ - public boolean isReserved() { - - return (this == RESERVED); - } - - /** - * @return {@code true} if {@link #OCCUPIED}, {@code false} otherwise. - */ - public boolean isOccupied() { - - return (this == OCCUPIED); - } - - // /** - // * @return {@code true} if the - // * {@link io.oasp.gastronomy.restaurant.tablemanagement.persistence.api.entity.Table} has opened orders. - // */ - // public boolean isOrdersopen() { - // - // return (this == ORDERSOPEN); - // } -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/tablemanagement/dataaccess/api/TableEntity.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/tablemanagement/dataaccess/api/TableEntity.java deleted file mode 100644 index 89132b457..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/tablemanagement/dataaccess/api/TableEntity.java +++ /dev/null @@ -1,73 +0,0 @@ -package io.oasp.gastronomy.restaurant.tablemanagement.dataaccess.api; - -import javax.persistence.Column; -import javax.persistence.Entity; - -import io.oasp.gastronomy.restaurant.general.dataaccess.api.ApplicationPersistenceEntity; -import io.oasp.gastronomy.restaurant.tablemanagement.common.api.Table; -import io.oasp.gastronomy.restaurant.tablemanagement.common.api.datatype.TableState; - -/** - * {@link ApplicationPersistenceEntity Entity} representing a {@link Table} of the restaurant. A table has a unique - * {@link #getNumber() number} can be {@link TableState#isReserved() reserved}, {@link TableState#isOccupied() occupied} - * and may have a {@link io.oasp.gastronomy.restaurant.staffmanagement.dataaccess.api.StaffMemberEntity waiter} - * assigned. - * - */ -@Entity -// Table is a reserved word in SQL/RDBMS and can not be used as table name -@javax.persistence.Table(name = "RestaurantTable") -public class TableEntity extends ApplicationPersistenceEntity implements Table { - - private static final long serialVersionUID = 1L; - - private Long number; - - private Long waiterId; - - private TableState state; - - @Override - /* - * Uncomment the following Column annotation if the database used is Oracle 11g and comment the Column annotation just - * before @Override annotation - */ - // @Column(name = "\"number\"", unique = true) - @Column(unique = true) - public Long getNumber() { - - return this.number; - } - - @Override - public void setNumber(Long number) { - - this.number = number; - } - - @Override - @Column(name = "waiterId") - public Long getWaiterId() { - - return this.waiterId; - } - - @Override - public void setWaiterId(Long waiterId) { - - this.waiterId = waiterId; - } - - @Override - public TableState getState() { - - return this.state; - } - - @Override - public void setState(TableState state) { - - this.state = state; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/tablemanagement/dataaccess/api/dao/TableDao.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/tablemanagement/dataaccess/api/dao/TableDao.java deleted file mode 100644 index baffc89d2..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/tablemanagement/dataaccess/api/dao/TableDao.java +++ /dev/null @@ -1,32 +0,0 @@ -package io.oasp.gastronomy.restaurant.tablemanagement.dataaccess.api.dao; - -import io.oasp.gastronomy.restaurant.general.dataaccess.api.dao.ApplicationDao; -import io.oasp.gastronomy.restaurant.tablemanagement.dataaccess.api.TableEntity; -import io.oasp.gastronomy.restaurant.tablemanagement.logic.api.to.TableSearchCriteriaTo; -import io.oasp.module.jpa.common.api.to.PaginatedListTo; -import io.oasp.module.jpa.dataaccess.api.MasterDataDao; - -import java.util.List; - -/** - * {@link ApplicationDao Data Access Object} for {@link TableEntity} entity. - * - */ -public interface TableDao extends ApplicationDao, MasterDataDao { - - /** - * Returns a list of free restaurant tables. - * - * @return {@link List} of free restaurant {@link TableEntity}s - */ - List getFreeTables(); - - /** - * Finds the {@link TableEntity orders} matching the given {@link TableSearchCriteriaTo}. - * - * @param criteria is the {@link TableSearchCriteriaTo}. - * @return the {@link List} with the matching {@link TableEntity} objects. - */ - PaginatedListTo findTables(TableSearchCriteriaTo criteria); - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/tablemanagement/dataaccess/impl/dao/TableDaoImpl.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/tablemanagement/dataaccess/impl/dao/TableDaoImpl.java deleted file mode 100644 index 6326bf2eb..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/tablemanagement/dataaccess/impl/dao/TableDaoImpl.java +++ /dev/null @@ -1,112 +0,0 @@ -package io.oasp.gastronomy.restaurant.tablemanagement.dataaccess.impl.dao; - -import static com.mysema.query.alias.Alias.$; -import io.oasp.gastronomy.restaurant.general.common.api.constants.NamedQueries; -import io.oasp.gastronomy.restaurant.general.dataaccess.base.dao.ApplicationMasterDataDaoImpl; -import io.oasp.gastronomy.restaurant.tablemanagement.common.api.datatype.TableState; -import io.oasp.gastronomy.restaurant.tablemanagement.dataaccess.api.TableEntity; -import io.oasp.gastronomy.restaurant.tablemanagement.dataaccess.api.dao.TableDao; -import io.oasp.gastronomy.restaurant.tablemanagement.logic.api.to.TableSearchCriteriaTo; -import io.oasp.module.jpa.common.api.to.OrderByTo; -import io.oasp.module.jpa.common.api.to.OrderDirection; -import io.oasp.module.jpa.common.api.to.PaginatedListTo; - -import java.util.List; - -import javax.inject.Named; -import javax.persistence.Query; - -import com.mysema.query.alias.Alias; -import com.mysema.query.jpa.impl.JPAQuery; -import com.mysema.query.types.path.EntityPathBase; - -/** - * Implementation of {@link TableDao}. - * - */ -@Named -public class TableDaoImpl extends ApplicationMasterDataDaoImpl implements TableDao { - - /** - * The constructor. - */ - public TableDaoImpl() { - - super(); - } - - @Override - public Class getEntityClass() { - - return TableEntity.class; - } - - @Override - public List getFreeTables() { - - Query query = getEntityManager().createNamedQuery(NamedQueries.GET_FREE_TABLES, TableEntity.class); - return query.getResultList(); - } - - @Override - public PaginatedListTo findTables(TableSearchCriteriaTo criteria) { - - TableEntity table = Alias.alias(TableEntity.class); - EntityPathBase alias = $(table); - JPAQuery query = new JPAQuery(getEntityManager()).from(alias); - - Long waiterId = criteria.getWaiterId(); - if (waiterId != null) { - query.where($(table.getWaiterId()).eq(waiterId)); - } - Long number = criteria.getNumber(); - if (number != null) { - query.where($(table.getNumber()).eq(number)); - } - TableState state = criteria.getState(); - if (state != null) { - query.where($(table.getState()).eq(state)); - } - - // Add order by fields - addOrderBy(query, alias, table, criteria.getSort()); - - return findPaginated(criteria, query, alias); - } - - private void addOrderBy(JPAQuery query, EntityPathBase alias, TableEntity table, List sort) { - - if (sort != null && !sort.isEmpty()) { - for (OrderByTo orderEntry : sort) { - if ("number".equals(orderEntry.getName())) { - - if (OrderDirection.ASC.equals(orderEntry.getDirection())) { - query.orderBy($(table.getNumber()).asc()); - } else { - query.orderBy($(table.getNumber()).desc()); - } - - } else if ("waiterId".equals(orderEntry.getName())) { - - if (OrderDirection.ASC.equals(orderEntry.getDirection())) { - query.orderBy($(table.getWaiterId()).asc()); - } else { - query.orderBy($(table.getWaiterId()).desc()); - } - - } else if ("state".equals(orderEntry.getName())) { - - if (OrderDirection.ASC.equals(orderEntry.getDirection())) { - query.orderBy($(table.getState()).asc()); - } else { - query.orderBy($(table.getState()).desc()); - } - - } - - } - } - - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/tablemanagement/logic/api/Tablemanagement.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/tablemanagement/logic/api/Tablemanagement.java deleted file mode 100644 index 764ad11f1..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/tablemanagement/logic/api/Tablemanagement.java +++ /dev/null @@ -1,71 +0,0 @@ -package io.oasp.gastronomy.restaurant.tablemanagement.logic.api; - -import io.oasp.gastronomy.restaurant.tablemanagement.logic.api.to.TableEto; -import io.oasp.gastronomy.restaurant.tablemanagement.logic.api.to.TableSearchCriteriaTo; -import io.oasp.module.jpa.common.api.to.PaginatedListTo; - -import java.util.List; - -import javax.validation.Valid; - -/** - * Interface for TableManagement component. - * - */ -public interface Tablemanagement { - - /** - * Returns a restaurant table by its id 'id'. - * - * @param id The id 'id' of the restaurant table. - * @return The restaurant {@link TableEto} with id 'id' - */ - TableEto findTable(Long id); - - /** - * Returns a list of all existing restaurant tables. - * - * @return {@link List} of all existing restaurant {@link TableEto}s - */ - List findAllTables(); - - /** - * Returns a list of all existing free restaurant tables. - * - * @return {@link List} of all existing free restaurant {@link TableEto}s - */ - List findFreeTables(); - - /** - * Returns a list of restaurant tables matching the search criteria. - * - * @param criteria the {@link TableSearchCriteriaTo}. - * @return the {@link List} of matching {@link TableEto}s. - */ - PaginatedListTo findTableEtos(TableSearchCriteriaTo criteria); - - /** - * Deletes a restaurant table from the database by its id 'id'. - * - * @param tableId Id of the restaurant table to delete - */ - void deleteTable(Long tableId); - - /** - * Creates a new restaurant table and store it in the database. - * - * @param table the {@link TableEto} to create. - * @return the new {@link TableEto} that has been saved with ID and version. - */ - TableEto saveTable(@Valid TableEto table); - - /** - * Evaluate if this table could marked as free. - * - * @param table {@link TableEto} to be evaluate - * @return {@code true} if the table could be released
- * {@code false} , otherwise - */ - boolean isTableReleasable(@Valid TableEto table); - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/tablemanagement/logic/api/to/TableEto.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/tablemanagement/logic/api/to/TableEto.java deleted file mode 100644 index 0945d9e83..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/tablemanagement/logic/api/to/TableEto.java +++ /dev/null @@ -1,67 +0,0 @@ -package io.oasp.gastronomy.restaurant.tablemanagement.logic.api.to; - -import io.oasp.gastronomy.restaurant.tablemanagement.common.api.Table; -import io.oasp.gastronomy.restaurant.tablemanagement.common.api.datatype.TableState; -import io.oasp.module.basic.common.api.to.AbstractEto; - -import javax.validation.constraints.Max; - -/** - * {@link AbstractEto ETO} for {@link Table}. - * - */ -public class TableEto extends AbstractEto implements Table { - - private static final long serialVersionUID = 1L; - - private Long waiterId; - - @Max(value = 1000) - private Long number; - - private TableState state; - - /** - * The constructor. - */ - public TableEto() { - - super(); - } - - @Override - public Long getNumber() { - - return this.number; - } - - @Override - public void setNumber(Long number) { - - this.number = number; - } - - @Override - public Long getWaiterId() { - - return this.waiterId; - } - - @Override - public void setWaiterId(Long waiterId) { - - this.waiterId = waiterId; - } - - @Override - public TableState getState() { - - return this.state; - } - - @Override - public void setState(TableState state) { - - this.state = state; - } -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/tablemanagement/logic/api/to/TableSearchCriteriaTo.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/tablemanagement/logic/api/to/TableSearchCriteriaTo.java deleted file mode 100644 index 345ca18d3..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/tablemanagement/logic/api/to/TableSearchCriteriaTo.java +++ /dev/null @@ -1,78 +0,0 @@ -package io.oasp.gastronomy.restaurant.tablemanagement.logic.api.to; - -import io.oasp.gastronomy.restaurant.tablemanagement.common.api.datatype.TableState; -import io.oasp.module.jpa.common.api.to.SearchCriteriaTo; - -/** - * This is the {@link SearchCriteriaTo search criteria} {@link net.sf.mmm.util.transferobject.api.TransferObject TO} - * used to find {@link io.oasp.gastronomy.restaurant.salesmanagement.common.api.Order}s. - * - */ -public class TableSearchCriteriaTo extends SearchCriteriaTo { - - /** UID for serialization. */ - private static final long serialVersionUID = 1L; - - private Long waiterId; - - private Long number; - - private TableState state; - - /** - * The constructor. - */ - public TableSearchCriteriaTo() { - - super(); - } - - /** - * @return waiterId - */ - public Long getWaiterId() { - - return this.waiterId; - } - - /** - * @param waiterId the waiterId to set - */ - public void setWaiterId(Long waiterId) { - - this.waiterId = waiterId; - } - - /** - * @return state - */ - public TableState getState() { - - return this.state; - } - - /** - * @param state the state to set - */ - public void setState(TableState state) { - - this.state = state; - } - - /** - * @return number - */ - public Long getNumber() { - - return this.number; - } - - /** - * @param number the number to set - */ - public void setNumber(Long number) { - - this.number = number; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/tablemanagement/logic/impl/TablemanagementImpl.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/tablemanagement/logic/impl/TablemanagementImpl.java deleted file mode 100644 index 67a6dd5a0..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/tablemanagement/logic/impl/TablemanagementImpl.java +++ /dev/null @@ -1,183 +0,0 @@ -package io.oasp.gastronomy.restaurant.tablemanagement.logic.impl; - -import io.oasp.gastronomy.restaurant.general.common.api.constants.PermissionConstants; -import io.oasp.gastronomy.restaurant.general.common.api.datatype.Role; -import io.oasp.gastronomy.restaurant.general.common.api.exception.IllegalEntityStateException; -import io.oasp.gastronomy.restaurant.general.logic.base.AbstractComponentFacade; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.Salesmanagement; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderEto; -import io.oasp.gastronomy.restaurant.staffmanagement.logic.api.Staffmanagement; -import io.oasp.gastronomy.restaurant.staffmanagement.logic.api.to.StaffMemberEto; -import io.oasp.gastronomy.restaurant.tablemanagement.common.api.datatype.TableState; -import io.oasp.gastronomy.restaurant.tablemanagement.dataaccess.api.TableEntity; -import io.oasp.gastronomy.restaurant.tablemanagement.dataaccess.api.dao.TableDao; -import io.oasp.gastronomy.restaurant.tablemanagement.logic.api.Tablemanagement; -import io.oasp.gastronomy.restaurant.tablemanagement.logic.api.to.TableEto; -import io.oasp.gastronomy.restaurant.tablemanagement.logic.api.to.TableSearchCriteriaTo; -import io.oasp.module.jpa.common.api.to.PaginatedListTo; - -import java.util.List; -import java.util.Objects; - -import javax.annotation.security.RolesAllowed; -import javax.inject.Inject; -import javax.inject.Named; -import javax.transaction.Transactional; -import javax.validation.Valid; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Implementation of {@link Tablemanagement}. - * - */ -@Named -@Transactional -public class TablemanagementImpl extends AbstractComponentFacade implements Tablemanagement { - - /** Logger instance. */ - private static final Logger LOG = LoggerFactory.getLogger(TablemanagementImpl.class); - - /** @see #getTableDao() */ - private TableDao tableDao; - - private Salesmanagement salesmanagement; - - private Staffmanagement staffmanagement; - - /** - * The constructor. - */ - public TablemanagementImpl() { - - super(); - } - - @Override - @RolesAllowed(PermissionConstants.FIND_TABLE) - public TableEto findTable(Long id) { - - LOG.debug("Get table with id '" + id + "' from database."); - return getBeanMapper().map(getTableDao().findOne(id), TableEto.class); - } - - @Override - @RolesAllowed(PermissionConstants.FIND_TABLE) - public List findAllTables() { - - LOG.debug("Get all restaurant tables from database."); - List tables = getTableDao().findAll(); - return getBeanMapper().mapList(tables, TableEto.class); - } - - @Override - @RolesAllowed(PermissionConstants.FIND_TABLE) - public List findFreeTables() { - - LOG.debug("Get all free restaurant tables from database."); - - List tables = getTableDao().getFreeTables(); - return getBeanMapper().mapList(tables, TableEto.class); - } - - @Override - @RolesAllowed(PermissionConstants.FIND_TABLE) - public PaginatedListTo findTableEtos(TableSearchCriteriaTo criteria) { - - criteria.limitMaximumPageSize(MAXIMUM_HIT_LIMIT); - PaginatedListTo tables = getTableDao().findTables(criteria); - - return mapPaginatedEntityList(tables, TableEto.class); - } - - @Override - @RolesAllowed(PermissionConstants.DELETE_TABLE) - public void deleteTable(Long tableId) { - - TableEntity table = getTableDao().find(tableId); - - if (!table.getState().isFree()) { - throw new IllegalEntityStateException(table, table.getState()); - } - - getTableDao().delete(table); - } - - @Override - @RolesAllowed(PermissionConstants.SAVE_TABLE) - public TableEto saveTable(@Valid TableEto table) { - - Objects.requireNonNull(table, "table"); - - Long tableId = table.getId(); - - TableEntity tableEntity = getBeanMapper().map(table, TableEntity.class); - // initialize - if (tableEntity.getState() == null) { - tableEntity.setState(TableState.FREE); - } - Long waiterId = tableEntity.getWaiterId(); - if (waiterId != null) { - StaffMemberEto staffMember = this.staffmanagement.findStaffMember(waiterId); - if (Role.WAITER != staffMember.getRole()) { - throw new IllegalArgumentException("Staffmember with id " + waiterId + " has role " + staffMember.getRole() - + " and can not be associated as waiter for table with ID " + tableId + "!"); - } - } - - getTableDao().save(tableEntity); - LOG.debug("Table with id '{}' has been created.", tableEntity.getId()); - return getBeanMapper().map(tableEntity, TableEto.class); - } - - @Override - @RolesAllowed(PermissionConstants.FIND_TABLE) - public boolean isTableReleasable(TableEto table) { - - if (table.getState() != TableState.OCCUPIED) { - return true; - } - OrderEto order = this.salesmanagement.findOpenOrderForTable(table.getId()); - // no open order so the table is actually free... - return order == null; - } - - /** - * @return the {@link TableDao} instance. - */ - public TableDao getTableDao() { - - return this.tableDao; - } - - /** - * @param tableDao the {@link TableDao} to {@link Inject}. - */ - @Inject - public void setTableDao(TableDao tableDao) { - - this.tableDao = tableDao; - } - - /** - * Sets the field 'salesManagement'. - * - * @param salesManagement new value for salesManagement - */ - @Inject - public void setSalesmanagement(Salesmanagement salesManagement) { - - this.salesmanagement = salesManagement; - } - - /** - * @param staffmanagement the staffmanagement to set - */ - @Inject - public void setStaffmanagement(Staffmanagement staffmanagement) { - - this.staffmanagement = staffmanagement; - } - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/tablemanagement/service/api/rest/TablemanagementRestService.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/tablemanagement/service/api/rest/TablemanagementRestService.java deleted file mode 100644 index 2ff253874..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/tablemanagement/service/api/rest/TablemanagementRestService.java +++ /dev/null @@ -1,110 +0,0 @@ -package io.oasp.gastronomy.restaurant.tablemanagement.service.api.rest; - -import java.util.List; - -import javax.inject.Named; -import javax.ws.rs.Consumes; -import javax.ws.rs.DELETE; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; - -import io.oasp.gastronomy.restaurant.general.common.api.RestService; -import io.oasp.gastronomy.restaurant.tablemanagement.logic.api.Tablemanagement; -import io.oasp.gastronomy.restaurant.tablemanagement.logic.api.to.TableEto; -import io.oasp.gastronomy.restaurant.tablemanagement.logic.api.to.TableSearchCriteriaTo; -import io.oasp.module.jpa.common.api.to.PaginatedListTo; - -/** - * The service class for REST calls in order to execute the methods in {@link Tablemanagement}. - * - */ -@Path("/tablemanagement/v1") -@Consumes(MediaType.APPLICATION_JSON) -@Produces(MediaType.APPLICATION_JSON) -public interface TablemanagementRestService extends RestService { - - /** - * Delegates to {@link Tablemanagement#findTable}. - * - * @param id the ID of the {@link TableEto} - * @return the {@link TableEto} - */ - @GET - @Path("/table/{id}/") - TableEto getTable(@PathParam("id") long id); - - /** - * Delegates to {@link Tablemanagement#findAllTables}. - * - * @return list of all existing restaurant {@link TableEto}s - */ - @GET - @Path("/table/") - @Deprecated - List getAllTables(); - - /** - * Delegates to {@link Tablemanagement#saveTable}. - * - * @param table the {@link TableEto} to be created - * @return the recently created {@link TableEto} - */ - @POST - @Path("/table/") - @Deprecated - TableEto createTable(TableEto table); - - /** - * Delegates to {@link Tablemanagement#saveTable}. - * - * @param table the {@link TableEto} to be created - * @return the recently created {@link TableEto} - */ - @POST - @Path("/table/") - TableEto saveTable(TableEto table); - - /** - * Delegates to {@link Tablemanagement#deleteTable}. - * - * @param id ID of the {@link TableEto} to be deleted - */ - @DELETE - @Path("/table/{id}/") - void deleteTable(@PathParam("id") long id); - - /** - * Delegates to {@link Tablemanagement#findFreeTables}. - * - * @return list of all existing free {@link TableEto}s - */ - @GET - @Path("/freetables/") - @Deprecated - List getFreeTables(); - - /** - * Delegates to {@link Tablemanagement#isTableReleasable}. - * - * @param id ID of the {@link TableEto} - * @return {@code true} if the table could be released
- * {@code false}, otherwise - */ - @GET - @Path("/table/{id}/istablereleasable/") - boolean isTableReleasable(@PathParam("id") long id); - - /** - * Delegates to {@link Tablemanagement#findTableEtos}. - * - * @param searchCriteriaTo the pagination and search criteria to be used for finding tables. - * @return the {@link PaginatedListTo list} of matching {@link TableEto}s. - */ - @Path("/table/search") - @POST - PaginatedListTo findTablesByPost(TableSearchCriteriaTo searchCriteriaTo); -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/tablemanagement/service/api/ws/v1_0/TablemanagementWebService.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/tablemanagement/service/api/ws/v1_0/TablemanagementWebService.java deleted file mode 100644 index cb1edce1e..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/tablemanagement/service/api/ws/v1_0/TablemanagementWebService.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.oasp.gastronomy.restaurant.tablemanagement.service.api.ws.v1_0; - -import javax.jws.WebMethod; -import javax.jws.WebParam; -import javax.jws.WebResult; -import javax.jws.WebService; - -import io.oasp.gastronomy.restaurant.tablemanagement.logic.api.to.TableEto; - -/** - * This is the interface for a service exposing the functionality of the - * {@link io.oasp.gastronomy.restaurant.tablemanagement.logic.api.Tablemanagement} component. - * - */ -@WebService -public interface TablemanagementWebService { - - /** - * @see io.oasp.gastronomy.restaurant.tablemanagement.logic.api.Tablemanagement#findTable(Long) - * - * @param id is the {@link TableEto#getId() ID}. - * @return the requested {@link TableEto table}. - */ - @WebMethod - @WebResult(name = "message") - TableEto getTable(@WebParam(name = "id") long id); - -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/tablemanagement/service/impl/rest/TablemanagementRestServiceImpl.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/tablemanagement/service/impl/rest/TablemanagementRestServiceImpl.java deleted file mode 100644 index 2f2caa415..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/tablemanagement/service/impl/rest/TablemanagementRestServiceImpl.java +++ /dev/null @@ -1,91 +0,0 @@ -package io.oasp.gastronomy.restaurant.tablemanagement.service.impl.rest; - -import java.util.List; - -import javax.inject.Inject; -import javax.inject.Named; - -import net.sf.mmm.util.exception.api.ObjectNotFoundUserException; - -import io.oasp.gastronomy.restaurant.tablemanagement.common.api.Table; -import io.oasp.gastronomy.restaurant.tablemanagement.logic.api.Tablemanagement; -import io.oasp.gastronomy.restaurant.tablemanagement.logic.api.to.TableEto; -import io.oasp.gastronomy.restaurant.tablemanagement.logic.api.to.TableSearchCriteriaTo; -import io.oasp.gastronomy.restaurant.tablemanagement.service.api.rest.TablemanagementRestService; -import io.oasp.module.jpa.common.api.to.PaginatedListTo; - -/** - */ -@Named("TablemanagementRestService") -public class TablemanagementRestServiceImpl implements TablemanagementRestService { - - private Tablemanagement tableManagement; - - /** - * This method sets the field tableManagement. - * - * @param tableManagement the new value of the field tableManagement - */ - @Inject - public void setTableManagement(Tablemanagement tableManagement) { - - this.tableManagement = tableManagement; - } - - @Override - public TableEto getTable(long id) { - - return this.tableManagement.findTable(id); - } - - @Override - @Deprecated - public List getAllTables() { - - List allTables = this.tableManagement.findAllTables(); - return allTables; - } - - @Override - @Deprecated - public TableEto createTable(TableEto table) { - - return this.tableManagement.saveTable(table); - } - - @Override - public TableEto saveTable(TableEto table) { - - return this.tableManagement.saveTable(table); - } - - @Override - public void deleteTable(long id) { - - this.tableManagement.deleteTable(id); - } - - @Override - @Deprecated - public List getFreeTables() { - - return this.tableManagement.findFreeTables(); - } - - @Override - public boolean isTableReleasable(long id) { - - TableEto table = this.tableManagement.findTable(id); - if (table == null) { - throw new ObjectNotFoundUserException(Table.class, id); - } else { - return this.tableManagement.isTableReleasable(table); - } - } - - @Override - public PaginatedListTo findTablesByPost(TableSearchCriteriaTo searchCriteriaTo) { - - return this.tableManagement.findTableEtos(searchCriteriaTo); - } -} diff --git a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/tablemanagement/service/impl/ws/v1_0/TablemanagementWebServiceImpl.java b/samples/core/src/main/java/io/oasp/gastronomy/restaurant/tablemanagement/service/impl/ws/v1_0/TablemanagementWebServiceImpl.java deleted file mode 100644 index 2237d9017..000000000 --- a/samples/core/src/main/java/io/oasp/gastronomy/restaurant/tablemanagement/service/impl/ws/v1_0/TablemanagementWebServiceImpl.java +++ /dev/null @@ -1,38 +0,0 @@ -package io.oasp.gastronomy.restaurant.tablemanagement.service.impl.ws.v1_0; - -import javax.inject.Inject; -import javax.inject.Named; -import javax.jws.WebService; - -import io.oasp.gastronomy.restaurant.tablemanagement.logic.api.Tablemanagement; -import io.oasp.gastronomy.restaurant.tablemanagement.logic.api.to.TableEto; -import io.oasp.gastronomy.restaurant.tablemanagement.service.api.ws.v1_0.TablemanagementWebService; - -/** - * Implementation of {@link TablemanagementWebService}. - * - */ -@Named("TablemanagementWebService") -@WebService(endpointInterface = "io.oasp.gastronomy.restaurant.tablemanagement.service.api.ws.v1_0.TablemanagementWebService", portName = "TablemanagementWebService", serviceName = "TablemanagementWebService") -public class TablemanagementWebServiceImpl implements TablemanagementWebService { - - private Tablemanagement tableManagement; - - /** - * This method sets the field tableManagement. - * - * @param tableManagement the new value of the field ${bare_field_name} - */ - @Inject - public void setTableManagement(Tablemanagement tableManagement) { - - this.tableManagement = tableManagement; - } - - @Override - public TableEto getTable(long id) { - - return this.tableManagement.findTable(id); - } - -} diff --git a/samples/core/src/main/resources/META-INF/cxf/org.apache.cxf.Logger b/samples/core/src/main/resources/META-INF/cxf/org.apache.cxf.Logger deleted file mode 100644 index 27dd788b3..000000000 --- a/samples/core/src/main/resources/META-INF/cxf/org.apache.cxf.Logger +++ /dev/null @@ -1 +0,0 @@ -org.apache.cxf.common.logging.Slf4jLogger \ No newline at end of file diff --git a/samples/core/src/main/resources/META-INF/orm.xml b/samples/core/src/main/resources/META-INF/orm.xml deleted file mode 100644 index a3fc3f183..000000000 --- a/samples/core/src/main/resources/META-INF/orm.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/samples/core/src/main/resources/application.properties b/samples/core/src/main/resources/application.properties deleted file mode 100644 index 20a748f5e..000000000 --- a/samples/core/src/main/resources/application.properties +++ /dev/null @@ -1,24 +0,0 @@ -# This is the configuration file shipped with the application that contains reasonable defaults. -# Environment specific configurations are configured in config/application.properties. -# If you are running in a servlet container you may add this to lib/config/application.properties in case you do not -# want to touch the WAR file. - -#You can simply choose the DB of your choice by setting spring.profiles.active=XXX in config/application.properties - -#server.port=8080 - -spring.application.name=restaurant -#server.context-path=/ - -security.expose.error.details=false -security.cors.enabled=false -spring.jpa.hibernate.ddl-auto=validate - -#Hibernate NamingStrategy has been deprecated and then removed in favor of two step naming strategy ImplicitNamingStrategy and PhysicalNamingStrategy -spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl -spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl - -# to prevent that Spring Boot launches batch jobs on startup -# might otherwise lead to errors if job parameters are needed (or lead to unwanted modifications and longer startup times) -# see http://stackoverflow.com/questions/22318907/how-to-stop-spring-batch-scheduled-jobs-from-running-at-first-time-when-executin -spring.batch.job.enabled=false \ No newline at end of file diff --git a/samples/core/src/main/resources/config/app/batch/beans-billexport.xml b/samples/core/src/main/resources/config/app/batch/beans-billexport.xml deleted file mode 100644 index c40e16167..000000000 --- a/samples/core/src/main/resources/config/app/batch/beans-billexport.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/samples/core/src/main/resources/config/app/batch/beans-productimport.xml b/samples/core/src/main/resources/config/app/batch/beans-productimport.xml deleted file mode 100644 index fd316c8c0..000000000 --- a/samples/core/src/main/resources/config/app/batch/beans-productimport.xml +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/samples/core/src/main/resources/config/app/common/dozer-mapping.xml b/samples/core/src/main/resources/config/app/common/dozer-mapping.xml deleted file mode 100644 index 2d564f2e6..000000000 --- a/samples/core/src/main/resources/config/app/common/dozer-mapping.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - true - - - - io.oasp.gastronomy.restaurant.general.common.api.datatype.Money - - java.lang.Long - java.lang.Integer - java.lang.Number - - - - - - - - io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.DrinkEto - io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.DrinkEntity - - - io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.MealEto - io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.MealEntity - - - io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.SideDishEto - io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.SideDishEntity - - - - - - io.oasp.gastronomy.restaurant.general.dataaccess.api.ApplicationPersistenceEntity - io.oasp.module.basic.common.api.to.AbstractEto - - this - persistentEntity - - - diff --git a/samples/core/src/main/resources/config/app/gui/dispatcher-servlet.xml b/samples/core/src/main/resources/config/app/gui/dispatcher-servlet.xml deleted file mode 100644 index 999fe88c6..000000000 --- a/samples/core/src/main/resources/config/app/gui/dispatcher-servlet.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/samples/core/src/main/resources/config/app/security/access-control-schema.xml b/samples/core/src/main/resources/config/app/security/access-control-schema.xml deleted file mode 100644 index 6d0189582..000000000 --- a/samples/core/src/main/resources/config/app/security/access-control-schema.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - Barkeeper - - - - - - - - - Cook - - - - - - - - - - - - ReadMasterData - - - - - - - - - - - - Waiter - - - - - - - - - - - - - - - - - - - diff --git a/samples/core/src/main/resources/config/app/websocket/websocket-context.xml b/samples/core/src/main/resources/config/app/websocket/websocket-context.xml deleted file mode 100644 index c4d0a303c..000000000 --- a/samples/core/src/main/resources/config/app/websocket/websocket-context.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - diff --git a/samples/core/src/main/resources/config/application-h2file.properties b/samples/core/src/main/resources/config/application-h2file.properties deleted file mode 100644 index ad882ac5c..000000000 --- a/samples/core/src/main/resources/config/application-h2file.properties +++ /dev/null @@ -1,8 +0,0 @@ -# Datasource for accessing the database -spring.jpa.database=h2 -spring.datasource.url=jdbc:h2:./.restaurant; -spring.jpa.database-platform=org.hibernate.dialect.H2Dialect -spring.datasource.username=sa -spring.datasource.password= -spring.datasource.driver-class-name=org.h2.Driver -flyway.locations=classpath:db/migration/common,classpath:db/migration/h2 \ No newline at end of file diff --git a/samples/core/src/main/resources/config/application-h2mem.properties b/samples/core/src/main/resources/config/application-h2mem.properties deleted file mode 100644 index 3e6de35c5..000000000 --- a/samples/core/src/main/resources/config/application-h2mem.properties +++ /dev/null @@ -1,8 +0,0 @@ -# Datasource for accessing the database -spring.jpa.database=h2 -spring.datasource.url=jdbc:h2:mem:app; -spring.jpa.database-platform=org.hibernate.dialect.H2Dialect -spring.datasource.username=sa -spring.datasource.password= -spring.datasource.driver-class-name=org.h2.Driver -flyway.locations=classpath:db/migration/common,classpath:db/migration/h2 \ No newline at end of file diff --git a/samples/core/src/main/resources/config/application-mssql.properties b/samples/core/src/main/resources/config/application-mssql.properties deleted file mode 100644 index 825031499..000000000 --- a/samples/core/src/main/resources/config/application-mssql.properties +++ /dev/null @@ -1,8 +0,0 @@ -#spring.jpa.database=sqlserver -#spring.datasource.url= -spring.jpa.database-platform=org.hibernate.dialect.SQLServer2008Dialect -#spring.datasource.username= -#spring.datasource.password= -spring.datasource.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver -#The following can be enabled in case of any errors in the SQL to investigate the issue by looking at SQL -#spring.jpa.show-sql=true \ No newline at end of file diff --git a/samples/core/src/main/resources/config/application-mysql.properties b/samples/core/src/main/resources/config/application-mysql.properties deleted file mode 100644 index 2caec4274..000000000 --- a/samples/core/src/main/resources/config/application-mysql.properties +++ /dev/null @@ -1,8 +0,0 @@ -#spring.jpa.database=mysql -#spring.datasource.url= -spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect -#spring.datasource.username= -#spring.datasource.password= -spring.datasource.driver-class-name=org.mariadb.jdbc.Driver -#The following can be enabled in case of any errors in the SQL to investigate the issue by looking at SQL -#spring.jpa.show-sql=true diff --git a/samples/core/src/main/resources/config/application-orcl.properties b/samples/core/src/main/resources/config/application-orcl.properties deleted file mode 100644 index aaba3746a..000000000 --- a/samples/core/src/main/resources/config/application-orcl.properties +++ /dev/null @@ -1,5 +0,0 @@ -spring.jpa.database=oracle -spring.jpa.database-platform=org.hibernate.dialect.Oracle10gDialect -spring.datasource.driver-class-name=oracle.jdbc.OracleDriver -#The following can be enabled in case of any errors in the SQL to investigate the issue by looking at SQL -#spring.jpa.show-sql=true \ No newline at end of file diff --git a/samples/core/src/main/resources/config/application-postgres.properties b/samples/core/src/main/resources/config/application-postgres.properties deleted file mode 100644 index bcbed922b..000000000 --- a/samples/core/src/main/resources/config/application-postgres.properties +++ /dev/null @@ -1,5 +0,0 @@ -spring.jpa.database=postgresql -spring.jpa.database-platform=org.hibernate.dialect.PostgreSQL9Dialect -spring.datasource.driver-class-name=org.postgresql.Driver -#The following can be enabled in case of any errors in the SQL to investigate the issue by looking at SQL -#spring.jpa.show-sql=true \ No newline at end of file diff --git a/samples/core/src/main/resources/config/application.properties b/samples/core/src/main/resources/config/application.properties deleted file mode 100644 index f08a4a55f..000000000 --- a/samples/core/src/main/resources/config/application.properties +++ /dev/null @@ -1,33 +0,0 @@ -# This is the spring boot configuration file for development. It will not be included into the application. -# In order to set specific configurations in a regular installed environment create an according file -# config/application.properties in the server. If you are deploying the application to a servlet container as untouched -# WAR file you can locate this config folder in ${CATALINA_BASE}/lib. If you want to deploy multiple applications to -# the same container (not recommended by default) you need to ensure the WARs are extracted in webapps folder and locate -# the config folder inside the WEB-INF/classes folder of the webapplication. - -#You can simply choose the DB of your choice by setting spring.profiles.active=XXX in this application.properties - -server.port=8081 -server.context-path=/oasp4j-sample-server - -#UnComment the following profile 'mysql' if the database used is MariaDB 10.0.27 -#spring.profiles.active=mysql - -http.mappers.jsonPrettyPrint=true -security.basic.enabled=false - -# Flyway for Database Setup and Migrations -flyway.enabled=true -flyway.clean-on-validation-error=true - -#UnComment the following profile 'mssql' if the database used is MS SQL Server 2008 -#spring.profiles.active=mssql - -#Comment the following profile 'h2mem' if the database used is other than in-memory database H2 -spring.profiles.active=h2mem - -#UnComment the following profile 'orcl' if the database used is Oracle 11g -#spring.profiles.active=orcl - -#UnComment the following profile 'postgres' if the database used is PostGres 9.5.4 -#spring.profiles.active=postgres \ No newline at end of file diff --git a/samples/core/src/main/resources/db/migration/common/V0002__R001_Master_data.sql b/samples/core/src/main/resources/db/migration/common/V0002__R001_Master_data.sql deleted file mode 100644 index 961859493..000000000 --- a/samples/core/src/main/resources/db/migration/common/V0002__R001_Master_data.sql +++ /dev/null @@ -1,53 +0,0 @@ -INSERT INTO RestaurantTable (id, modificationCounter, number, state) VALUES (101, 1, 1, 2); -INSERT INTO RestaurantTable (id, modificationCounter, number, state) VALUES (102, 1, 2, 0); -INSERT INTO RestaurantTable (id, modificationCounter, number, state) VALUES (103, 1, 3, 0); -INSERT INTO RestaurantTable (id, modificationCounter, number, state) VALUES (104, 1, 4, 0); -INSERT INTO RestaurantTable (id, modificationCounter, number, state) VALUES (105, 1, 5, 0); - -INSERT INTO Product (id, modificationCounter, dType, description) VALUES (1, 1, 'Meal', 'Schnitzel'); -INSERT INTO Product (id, modificationCounter, dType, description) VALUES (2, 1, 'Meal', 'Goulasch'); -INSERT INTO Product (id, modificationCounter, dType, description) VALUES (3, 1, 'Meal', 'Pfifferlinge'); -INSERT INTO Product (id, modificationCounter, dType, description) VALUES (4, 1, 'Meal', 'Salat'); -INSERT INTO Product (id, modificationCounter, dType, description) VALUES (5, 1, 'Meal', 'Pizza'); -INSERT INTO Product (id, modificationCounter, dType, description) VALUES (6, 1, 'Meal', 'Flammkuchen'); - -INSERT INTO Product (id, modificationCounter, dType, description) VALUES (7, 1, 'SideDish', 'Pommes'); -INSERT INTO Product (id, modificationCounter, dType, description) VALUES (8, 1, 'SideDish', 'Reis'); -INSERT INTO Product (id, modificationCounter, dType, description) VALUES (9, 1, 'SideDish', 'Brot'); -INSERT INTO Product (id, modificationCounter, dType, description) VALUES (10, 1, 'SideDish', 'Knödel'); - -INSERT INTO Product (id, modificationCounter, alcoholic, dType, description) VALUES (11, 1, false, 'Drink', 'Wasser'); -INSERT INTO Product (id, modificationCounter, alcoholic, dType, description) VALUES (12, 1, false, 'Drink', 'Cola'); -INSERT INTO Product (id, modificationCounter, alcoholic, dType, description) VALUES (13, 1, false, 'Drink', 'Bier'); -INSERT INTO Product (id, modificationCounter, alcoholic, dType, description) VALUES (14, 1, false, 'Drink', 'Wein / Apfelwein'); - -INSERT INTO Offer (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (1, 1, 0, 6.99, 1, 7, 12, 'Schnitzel-Menü', 'Description of Schnitzel-Menü'); -INSERT INTO Offer (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (2, 1, 0, 7.99, 2, 8, 13, 'Goulasch-Menü', 'Description of Goulasch-Menü'); -INSERT INTO Offer (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (3, 1, 0, 8.99, 3, 10, 14, 'Pfifferlinge-Menü', 'Description of Pfifferlinge-Menü'); -INSERT INTO Offer (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (4, 1, 0, 5.99, 4, 9, 11, 'Salat-Menü', 'Description of Salat-Menü'); -INSERT INTO Offer (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (5, 1, 0, 1.20, null, null, 12, 'Cola', 'Description of Salat-Menü'); -INSERT INTO Offer (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (6, 1, 0, 6.23, 5, null, 12, 'Pizza-Menü', 'Description of Pizza-Menü'); -INSERT INTO Offer (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (7, 1, 0, 5.99, 6, null, 12, 'Flammkuchen-Menü', 'Description of Flammkuchen-Menü'); - - -INSERT INTO RestaurantOrder (id, modificationCounter, tableId, state) VALUES (1, 1, 101, 1); - -INSERT INTO OrderPosition (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (1, 1, 1, 2, 2, 1, 6.99, 'Schnitzel-Menü', 'mit Ketschup'); -INSERT INTO OrderPosition (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (2, 1, 2, 2, 2, 1, 7.99, 'Goulasch-Menü', ''); -INSERT INTO OrderPosition (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (3, 1, 3, 2, 2, 1, 8.99, 'Pfifferlinge-Menü',''); -INSERT INTO OrderPosition (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (4, 1, 4, 2, 2, 1, 5.99, 'Salat-Menü', ''); -INSERT INTO OrderPosition (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (5, 1, 5, 2, 2, 1, 5.99, 'Cola', ''); - -INSERT INTO Bill (id, modificationCounter, payed, total, tip) VALUES (1, 1, true, 14.98, 1.3); -INSERT INTO BillOrderPosition (billId, orderPositionsId) VALUES (1,1); -INSERT INTO BillOrderPosition (billId, orderPositionsId) VALUES (1,2); - -INSERT INTO Bill (id, modificationCounter, payed, total,tip) VALUES (2, 1, true, 14.98, 1.4); -INSERT INTO BillOrderPosition (billId, orderPositionsId) VALUES (2,3); -INSERT INTO BillOrderPosition (billId, orderPositionsId) VALUES (2,4); - - -INSERT INTO StaffMember (id, modificationCounter, role, login, firstname, lastname) VALUES (0, 0, 3, 'chief', 'Charly', 'Chief'); -INSERT INTO StaffMember (id, modificationCounter, role, login, firstname, lastname) VALUES (1, 0, 0, 'cook', 'Carl', 'Cook'); -INSERT INTO StaffMember (id, modificationCounter, role, login, firstname, lastname) VALUES (2, 0, 1, 'waiter', 'Willy', 'Waiter'); -INSERT INTO StaffMember (id, modificationCounter, role, login, firstname, lastname) VALUES (3, 0, 2, 'barkeeper', 'Bianca', 'Barkeeper'); diff --git a/samples/core/src/main/resources/db/migration/common/V0003__R001_Add_blob_table_and_data.sql b/samples/core/src/main/resources/db/migration/common/V0003__R001_Add_blob_table_and_data.sql deleted file mode 100644 index 9e8abab15..000000000 --- a/samples/core/src/main/resources/db/migration/common/V0003__R001_Add_blob_table_and_data.sql +++ /dev/null @@ -1,2 +0,0 @@ -INSERT INTO BinaryObject(id, ModificationCounter, size, data, mimeType) VALUES (10, 0, 72861 ,'89504e470d0a1a0a0000000d49484452000000c8000000c81006000000fdc872dd0000800049444154789cec5d077c5545d69ffb92d04297d8404db020c15e028a9817052c5850888b65dd447445d85d753fb16b6eec8a5d41455c13171509764511352f7614ac80080a449a0816a4a4e77e73dffccfbc37e7bec90b5d77f7ee6f3d9c977bcf3d77e6cc9c32e7cca48aff5d9b731d618174f552c00114f9cda4db8bc16d754d6ee67d7314f0ca4c9cff3d00e76e2a63ffbbb6e945726a9343926b7e5fb2eb8ccde26ae32f2e7fc92ec8b3677b8eff5eb6a98cfda75cff5320cdbbc280ae024e1ef0df003b00ee88bf17b3e7803b4e92f7d0c0a48976de46f2b9b9d7b30a786e92fba6e0be29e6cf5e2efe41fcaf06fc1a10dfef95031fc9eeffdfb56d2f57012daf7451bf91bc925c5700477f3ad4afc39a7e8d83f78803369ec5cdba52009b29d7de7e0a3ac9e49afecec6b357847f2479cfffaeffd42b0c185180267c0d31d042c04310cc140ca054086cea4d0aa6a501deac608b1680b798b0654bc083016f05fc50c156adb60e24fafa7dc7317e5a327ecfc6f7bc0f38c0fc5efafe941b01430a866e50902620872bd4086058fcefda1a571830a280966718425aae8f5190fa8dfa3120d7e8779283160301494e3e5050cb11c9d5ef55ae312e699cd2b8b5c935c97340aea93d49ae5dc0b0f80fbdfedb3d9030a0ab80f62c4820e83e36e139c702920091e52205eec4d20b96b56923c49ec507cedae502299cff6a35a0ad540ca9d35aeedaee2d298453437f4e4f9737f7747af802e81ded558b1931961c57fecfe76b77d128241daf44acf7ffeefc2caec02d51e8fcec98f815c0afc07da728dc29717e32bef97871a46f29354ca83b61fd7542d416d7fcb6f63221aa2f5c377eddde427cfedadb137eb84b88f7d6bcd0a3bab77ac4c38012cf032708cbcc7b0f1003cef300df357141f7870129a451c1a063d2d70ae67f57f3aeb0020e6f573ed145f03b148743f046f3795fae8767de7a48468610ed4eeadca5f34572926ddde2fc761ba45ca7a535b693cf39f3424b5bc909dba9768ac4c742349ed47843546ed738a3a3445a8a1ba372bd9b926bb1935807b96f9e3c0bc8b31e07cee5d1fffea4f0c6eac6f7ebea84a8ffb276e9ba57a45c2fa89ebd6e9d10bfcdfbf9e835ff924ec8b47bc6af947cff72daca168d6f290a24d75a6e49de489e09f6078422d1f24d3064b62f89bb9e40e8776a6f1790f03fec952ca4f29f7665039242a009cc054e03260218e781b4bfa24b17e71d212e587ddbb85e6542b46dd3b9e4d46952213c99b2c721df4a6ba45de8f283baca7bf70a3dd8ed1ce10fca637c0523d54104ef54c336ac70e9d62b3c0ff85c312a8af7528101f96b187f575c8515ee54e86941e111e079b83fac70799f8bbb8a814780e7a9f703cf1379461b79725c1c2dc11d8d5d974c9403b35363ff05e3e5803cacbacb872f09b17cf477e35fbe5d8847ca479ffacd3772c05e52bbccbb5e3dda08179e42548dd79b38b9f88d6f037f1010fdc207a61e6080ff5328962bac80291971bf931cbb0c9713ffa90ffcada1cd1d52ec86f46dd7f74839cfaf6bd3ed4cd9dfa195a18b7bf490f08ed08bfb3c296fbed2f9a5c3bdd17714c7539352a4702e7f2ef062c24d794b302e5c3c077a5c7e03f21dc1572a7a118b3cd3f59e1853552565af5bc3830b779306d47d0d5fce7f5488758dbffee5f97f08f1e592770ade950ae3c5cc07effdf967f5889647926bc8ad96732ecf24e7d7b3e7c38024bfae79ff1f57a1fcb72890b0027a8061f1cf41ac375e6174fba5c7d490b49ccf9973dd5b474b0bbde5fa36a9674b8590727ecab24172a089279d3332e6c64dd0d910f0af930834298e0a61d87ff2bfa448e6021f053cb1e220dc351587c68bf1b5f9186853028ac4059fc5e0d3051d1e096ff2f2def5fef2a3b4e86a8baac3af1f21c4ea51cb9e9afc8c100f3ef08fbf7c78bc1035876c98d0d04fddab0718065603299ca1803fe0ef3400b985470ac535effbe30ebc2d746111376008f1d0ab84e7ae2aceedd041883dceec396cc810e9391cd562c8b07952417c18fab4ef1bf2a6a39c375adc6a18244a1e36da7031479be32491b78d378c22b82b0fb8499f29ae665fbee124e5b2e1a086215f49b9ac9eb86eda0bd2d39efbf6870ba64c11e2e9cadbce5abab7ba953c98c646402886c6a31524b9df648512de28ceb7e3f59fae40220ae8d014b227686085fe2ec45f6a6e0c771c2c3deb8f7a9c34525ac2a97f4d7bfcfce1f29e5d9cfebb2d147605908d097f0ad4d128780e6e12cfc1a600ca809fc13c94e2c080c157255554a3807f0d3c8caf570331b987b34957e3418d177d5f2ac4fa9fd69cf2c47942bc7ec0e315fffa8b101ff678e9a33558e3696800dc17cf9c0e9c069acdb223c807de7fcbe26518d055c01907488610290c2909a3cb4a2e3df06221da7cd5eefacb5e91b2fe51ca8cc1f7c83f5ee3bcde6a4693868c033c0cbc690fd8c5046ef3b08b418f8d8b0413bda2175030f04c2a347d07385a63ebcab39c4322bea2a89f5a7bd4fba942ac1ab674b7717244dd79eef997bd592f656f60e3cb0d4ca1d41f059c0ca5a34dc83d1aae58fe381e77687b33b085afb0027cd19bf4a4bfe670f6e1d7f56ebf548ea369cf7c75538a1099a7f55af7dd04e96134a6762ff645746771acaf38bcb0a7a81509356d45142e3b55e1655ed47e96ff2dc3dfa3dd2def8a44f172747f44e15e2ec3c3c0cb81e78b223ca7dee32a5c3e17c6730af78097030f6bbe8a0c3e87629a21be72357de253e1459aaf22834f21c81edaa82bf479e8a1dda5c268b7a4d309d74a4531f4c54bbb7e768a103764bc10bee66a21fafe6df01d3b22aba7e58b0aa66111360db1e894774d18a2c5784c0521f295220ae829e23f35add25540875809fe4941bf5d464f2e2dcdb95c88ebcf9cf2f68b2f08913ebb43c3cc41f29e502832cc4ff2a815aff98a2320c7246f618d73f950d35b4cfe144ef2e7327a11462fc2e811fd987c937f69c833d10ff01b93e748b3f8cdd5fc6e923cfb8ac897bfd43b5aa4f6930a629743baaf78ba8710b7674f7bf46de9698c4effd7d7a79e2adbf9aa50eb5658b40f2ccad3623cc937d65242b496fa0e2019ba11e0866afd3d5e29db9b812d74b90a38a50ccf5230243be8f2034abf3be61821323eef5659faaafc2d2b74f219afc93f9e25766b3922cea2c914a6055608fda32d1ae0b94ed4c2971e880a20643825782e338ae7295c3e95a99e032e804780e70177912c59a83c1a892beeb3c88557b87c2a8ce7b2705f18f765197c4e15e90a075f64c1656a3e155ea8f9cc637c9a1e0ed1dfc8cb0939bd5b494fa345bf56e123a402d9f7829cefcf7c5888bd871dd2ed2b69817d32e1f52f9677c5bde729187a023838d1592d05c023c02bd9cb5e05244552b2291cff8eae88024e21c3e5771714dcf846875a214e9a72d1f0b1b365fbd6b5aabfbfb3fcdbbad0ebfb3c1dbd2d4fca52bc45afa8c42c7a856792e50fb9ce0bc8877a2bc94725f04cbd96a1e86731fa25c00b40af447b382506bde41eb5c96f4c9e33151f49f8ad60fc4634bf345d6fd2159a93b27aa72ba4a1744ca7f5833b0a71ccddc3e6f6a91662e6fd6fe4bdb45688ea97d77f010e63f28c7ea47989feee3039760ad8cbe8ef2e60647338df92d71f5d814414e0032c24f11da675ede47b1c173ff2f0928b074b2be08456a32748d7d2e928fe6ff7cb842f8833a3cf6eac2b4c782926d47c087819043c4f2f062a3c4baf4144713900159e093c160250cf459c3151bc10d3656c00293c532f5e2abc50d32f009f0acf56d92ff22b2fc7f7d173cde3b3c49c789c32e0bd366fe039739dddda48cbb8d3693bfd69b0f4040fab1d78defa3942bc77d0f3fd67af97377c2c9ed116363c0fddbf61e018507aea590c380ab084c1c50cfedeaf8802da838e33844666dc5bbb4b8d103bdd97b5f76bf2efa191a15927f83ded4849f27b46cb99368894a14172ed3043a3848552638ac48de25a3eb421a30cac126d6099f42a809362aa04bd4c162a73f8b8b018709c5f32e0285416534c8c5f2ecfa6e1a5e955f2e97bd3ae94dcd4637797be50dff5831f3bbe95103b7f9ab9fc0be9617f59f5ce0d3f7f2af0c980590c87bc9342d10a02bf7b7fc17d6c9edbfe06d21f2d84155620517dc60e27ef7a89ef1a5ef1d8c49b2f9396e8888abbf3abe4d499724beadb779e246fbac2dba7e521712e385c5dc2c9d5952eb4f1bbf5be6c06c3faef70d1f573b98c4eae41c705de53d309b3f787d9fbc38ccf30a3aff0fc24df97cb20bdcf765fbeca95dadc10175dcefdcefc96b709d165c7aeab6e7c4f88bb9e29fff3a27385b83a34b174947c93b3a7f36afa27eade361f2bd8fa76055ba2ce200da18254d425a4a0f092425d8101ea6e0ec75bf17215e072ed7fc788fbef7978974764bbbc30e9dee9470ad1f9c25d5f583a51fe7181d3eb9056861c303913a69c858173b9e6fd6c9563848838bddc24e3c43ebe368d5f3bff4d8fbb00bf0cdfd41017bb52d3d21ecc96f27bf0b5c7be37ed2a21ee5835fd377fede4ac4bafbee4f057d43de92a36a0e5bad5f10a527d4a1ae45b87bc28bd9a0c0a2627342f6efbeb8fe2818415d01341448190b43d8e4a39addc8f399ed6f9921f1f9d2f3fa943eac4ffbb2cfae7f342c3e35cd60258f8e3d00d8360afc203901e45a67a9776b9159ec742539570c15d71a2a2a7435cf9e0d1e8d69845c72c38edf910ae426222839e33435c01d7ddc6a70bbc58d5b54b5c2df2f31017b71423c00b359f59069fd92a24e6ccdcb2212e7df51367a7ec2907d5c0f61d730b8438b2f4d495bb5c29c4274fbdfef67b7200d6fd5253438b8f3a04e0022a0e847707f0b180e094f2ef7588b3c07c6ebb5d78bfe6ab44015faeff71cfc3693d2609d16179467ab954acce0fcee107f96b46310f7843f4e67c27fab53a6444728610a8bc2f0ceaa62762f5b059c888cbb14d3e329907efe8f45d176f2f34e8337e93876c897e9210977ddc317e81f390dc9692675ca12f535674bc54885dd6779f709a84596fedf7ca37c3849875f3f44796eca5eed11e495e621a7c319df2ceb45c43b1e89e5ebc25386fcef57b5720a80f50c12661288ed39ebbf895f4b652d31fd3bfdbe4d6f2b70ea1be43fd18b86dad8026e8b0521c7a82aeb4645971973b8fc5564b31e0b2a13866824b5b6880b2aef400c18020d73d177caeb684b8f800d4316c169a2ad4aebc7aae1821311ee2c2341a17232f60f44dbc140561f92a241608716da1d8325d2d3f69dd61bf9385e833e1a4437b7e24c4d7bd679c551e1162dda45f9e6df8b3ba470f38c569ac9e84f6682a31a107c84362db3cb4e5323e4a14f0e5fad2d327bc947385b4521f68b7ea8db3e48f473b3bef72b508aea5e5a2ff660a55c6aa0d01c859a596b3e8dba49c15a8fbb4bc642a26f85a1d8d8766cbb1a25702fab15092a25fcce8050c17d02b64e322a6984c7ef39284e42a412fb399fc16b0905c1e70572bae4ab1052ea79d33d0af70ef727ad76306ad1262dff29c65cba5c73163c2ab777efb286e2295b5185071a04358f4bb561c61866f7345f27b5720aaeb759ebbefb2f51f77eeedad4608b1ffcbfd4e7db1a3ff5be8bd81fea2a17d714de13958a476510f5d29da466120b64a038759302e048b2cba7c65014a8f661470d0c180cc648be585164f42683cead1480f643ff01dc673598c4f12b330eecb32f80c93258745fe584cb8047f570ab0447b380a77816769854a7c293c171ecd4c78343cb6be9562cb69b35aeeb0e7b1421cb25fffcbf6972a7ad67dd3fff646ad1035376fa8e079f35e4fe087038f002f31e1761b706410d15e4ae0c3571c97ecf6e88043d709d1eaa3f475d3fbca1fab9db69d3a095feec860898057c255126f3e0ca29842cf54f7b1fe136cb1991b44b1fa8a02e08a5e72392683cba45fa80db002f57ae6f1307ee3e42fb3297e35bda007a5e871c32819bf31c55a01fa61f06fd2afd49e378dbf4dbbfa8973fcecab8e13339e1d203deb1ee71cbe6ed92d5291944f5dbe00c9247c2d84d27ff9da87a738b57b245bfdfabd2a90b0023a0b474e1cfb1edafbdad41be53c76ceb09d9e901de0fc14aa3ce96f22e83904f3da155e06415985e18bd08ef624b82b6fb7e894a04d45b7e5a28069a61660d322b765bf04b355c6814f2a2474f11d8a6f872d9697989e439ca7021c218e6215e210b49858c13c9cd8402b34db8185e22a40cf926da62dce2c66d1966c999040daf72d4ede437272e84e037aef2e3d9077339f7bcc27ecbdd158aff3ea115bf6bae0a102e02ef00860097e07becd1409d56d60b1df571ca3fefce02b7b2f971e47dbf69f4cf73d8dd9cec79d4e8ff3282bd9623059e6b92ca4c843300ef3ac2bf5c4e9aafb40dfd1868732902a028686a2c72bc8b35808a9c44cce207e831e8e85dfc266f2cb43ca4e52c388f31b01bf0a2f481c0a0ef0bba543b65231fba1ab8e6376bc3b4f52ec76fc3e977ebdb3109fcd7beb8325efe29eb002dee326d4f24b38c1c59ab671dfd65b6cffbd2990b0023a0b679582a1ef653fef78f3fa3183e4bfbd50bff3a422117031a547607a0e3aeb435be80a1f8461ebaab45ba778e3d26c039e43bef268e4b49f0b5c790e2c7416c767624f2253e36afacb09585ec4679ec1676c002abcd0f41c4891c8e7f603fd30be2fa1e7104b070e588a0a2f08649b450c3e93a74f46f0f6cd1a782d17b45edf437aa087b43bf6afad3e948ae4e5e71efd4405e9627b735d04e89abfeb104026231a062c002cd91c0e135ca0ef4c0594beef79336fbdc9df5baad3e89d2e8ff80af06ef17ad737a3f2a3dac7b69641064c2926eafcc45973564320e0b1b290514c91287ac90d0d538e89bec3c69f13480736e83797dfb82c3193dec61a46997cbe08648935c9ef160bd91e2d3d923da55df641d773fa4b8fa4edba0e377c749b105fd7ccb861f549ea16ed81907cbbc00b184e8a2413300258c2e016bb7e6f0aa444010a7e84e440bbe41f8fb61a72bd64759fb49bfd6caae8c4e78b5465920a59be15020dc4626ed1359dbe1ab7c80e41043e1591ec5c65bf4a2f4929289e665b6949b3e5ae760ed26e2348bbddc834dbc000c947086baa9e284ad47396e48042aba5081c21c01c786e1116e2d3138f9e8e1ddc17c67d0ebe07f8e685b8dad4b49f7ec8fdd2723b719f31f3a649cbedf5b71eada401471e090d382a557381534cb988118d009630b899974e3b960651b7a77bec9422278a9cc8a04e9356c81f478bb2c3e78a449eafe2b632b0369519c57361c0d8428a3c64c4d70688be635bfb4abc961833882c86464c3131fa01f9d8347e631e2fc68596bf84fc26358c821e8e8bfb0a9be4770b876c9dfd9d65fe1ac9ae1bf67ce3882b855878d897535e953eff2f7356de545d8d9b10b2f588a3087092ef45c04b80937c9702d2738b3787d3f8ebf7a2405c05e20b6d865f7d5bddce774bd7fe938e4fbdee87ac16887e7e419ad5c58c854c144e9e0362ab729a3f11ef52825c8a8167cbce2041a9b4780ed9ba9010d95316cf2116c3263ef3189f0a2fc3692083f404adde53c806888d4f3e00a712df1b991c602bec2a80c22b43b2c0c62eaab2ba15f9dc68d0d9b463861c650b7629df7555df3a217ed87571e3cbd2725bb9b872ce06b5ba151b5805c049a1ec81df6940d2df29df3e0f7fa7cd37576d128746e19f7ff99ef4f9d78c993c7aacfcf7e9a13347dc16e74904e5577141f25bca4230a5f8aa0cd433e9898dd1b37bd6444fd18f6d1552095cd1b31b44267dbe56e268f9a9041e06fd0ab48949df05fd2c6d6025e437e6f1327a317e2b8cf6284cc22f85fa2c1e9495df606859d1ab741cb1195768ef942eed2f16a2e7b23ec7ecd1284568ce336ba6d7abbfe92d7b4a80ff85c14cfc7d3120c97744c12dbf36b2bd154858019dc61851c0df3a205c3dec9f974b8d1aaa09650cf0b7baa0892e3621bba0014bc1e262566a4f42ad3114e318a3b0ca4ed2169760829167f11c08d769948a9e54001be29fb3c7b0399f68854158944f163a13cd5c83c8469af14c240bc442020ee887f19cc263969c83b784711f2c47840073b445a8ded3dc4555168a93efeb055c29cc4db4e09ccc502bff1c889dbfc93ca4aab710ef2f7ef1894fcfc41f6960e55a6026eee303d3054e27ed453692a93078c380f50da2bf5e7cf79cdda527ddfac1f405cf4bc3487cef94f869e601c5cd437e956cad81d6d0682784d57a622b51cf594330067dab67ad4359da63b51944d42a26bf2cbd564a8fcbe867a2554c7ef98e08b6f4dae09a5f26e337339e5fc7257963ed51a2e91780be1b4f3f29bfb68a7a9a1f36d32369d9adf569ddf714e283da97de2a95946a1757fdd688ec43ed41bbc01799bf6b1c7f0fc82fbe68f33d91ed5d488845456a087f517178e11d859997cb0eb83b943ab23a5a2814cdadf18abc0c752ff09e48d61c0bdc53b8bc4fe161e03d919b33dceb13c5fb20d973ac17567f47415111f0b0898bb1820afd143e12f840a22bfae07dc467b681f7d4ef233eb34d3e9502f22e1543f15cf43bbda198d6c602efa9f7fac9c073268ebdb4e4fb543b4d10c38def9f8cf7802f79b7c2f3894f4458476abea8104be1d9f88e22c6674f85c7f13994f1893dc3c0d758e07dc047ac7d894f1e586ad695f1efdd479fb58310877bc737ec8182c3560b0171c0508b73144cfb55413f29c3bf42df281838dfe53110cf6e2613741fc9356dde29e5baed9c8e7fbdee0ef99dc778f9a9efc7b707f65443bfc5c92fe480da09f2ec01773dd5bf28f0f3747b9bf4347dcfa42f9f37c707d1efc9e42e6cd297eadea43f99f15b64d2a382bdb8f1c6e538b17c107dd61eba00d065f4c65ac685cbe88d34e557ca5b2ef07093fc4e66ed61e33726cf54b0b849f24cd725d5e32aaf951e8833cc59d11a5bf5b47e59413a80ae05b2b7b85ca71cab6008597f0ef6a0d3f2b9d9d7f6f2405c05f46ea2ca691429ef48c36acc9f163d2b159bf3b2f3dbbefe80a6900c59fcb00bb5c59fa32dd90db88fecc60db84fe1678a5fa2f8550e85aea27469fb0b692d66e277013a0acf005e067c10a8ff13ffaa95ff13069fe98ccf74c667bac127e1d761bac9c722ff6850c991fff371daa6a358e1c4a7b4c072189f0aefa70eda9578187c636f2cbc370b7886e6330bf7115f59b84fe1282414fbd19bc05719f0189f198ccf0c7c4f0eee53f834b45f2f1520927406e1fd8bf15c41f4f766a64f86e6868e6bb59310ddafdfffcebd3e95defbc2499fbc7110fe488b8b74fe088ed2d5a12caa1ba1b4609c0def41f1e8b62e698a0311db5e1d9bc784ae10e2c26fee796d5f3905b65cda7aef470ef16939e3fc73389ca9d46f2804a47eabd4f54a9003edf9a9509f8bfe58a5e439ee585ab437e88da1f6d65978aa7f4ab52429fa65267d87f611cb31e54cca2bc95986c1ef203cc1e967805f0a076620c443f40b997c4cb5d02f34db234e0a329be2578f0bc1f9857c825f3d5ac3144283fc717e07b1f6b0f19ba343d2617ce7623ca7e86d645662eb5e6d2bfd7359ba8dd8a76ea91cd19f3df0d6238b60207998e93c54b87b3f02c213a1dd80057674f090deae0b6d0b0023cde124d1b59d14885eee2e51c08f0d8f68bcefec7ef283d3c6b6ec71bddf00d95428d574819e70292bc51ab3a41829290e35614530b02a2d69b622c9e25a2c0f5f85b0a6b2823d96661b17322860ef53782e14de4cf065cd26e17c5a43534ac1165a425cd64d1dcd7c7c6fbc77ac7fd25b6d7df5aa5f779122735ada9036a31384b874cc197cc4d68c1cbccde433072118969e2978b6d946a64fb6d8bb55763769b1b5c86ffdf9c7270831ffa5992b7fa42c2d3a10687740da5e1b8a446fabbd8709b5d110065ccc5e8adf75c80a7ff743b1fdcecfef30460e6ca7ceb9d8af2497d20c4388cb970e2166a9ef27f9e56b72907f92a7e2666e92e830fa9516fae84f6b882b58f1eee03e937e89a60ff9481ce2b28f374b7b8441cf16e27218fd60c5bbfabe2c8e379dbedc5c7e25be58e19610d726662576d8a3cbfb590572ae7fe999752fbe2465736de3127d901b9d4b028fbb118650e3b90a9afb1dcbdf6150e942d64dbeb6b5027115a0652682fe59cc7d1f3e7d8f47ae94c8df9ce3bb0f8fb3649215e8553673ad2007b6046ded51890aded8449765e0c9d2295d780ee3b48554c8f8cc637ce6313ef30c3e4991f042c264e9c0b64ae16226e0c9765565f9f8cb977c37f35d39018e9f76f9f83ba50bfcdae0c786bf2227c2da11d5dfcf961371e617bd2a0e90967ecadc947fb43a41d8d78c2c15efda831c048bb9b99b3a264f9f8cd62677b96bd7e37638540eb85f9e297d13e73378ff5290ce19a181a4cf6bd8ddbc4f57b6e7c67f89087a22c0f562b984e7e5dfbe47a684ad32d3873df2bafcdb27ce14ac7960cdc75291cd176fb5a2c677c310908a830a6351cfd4b45c2438f0c955efb5243bd8924738bf9516fab4d8ece8f180fec3df5141ee7dea0da9f70b275778cf44dbff48a7b79fd66a6d8f40d624537cc9f8658bef0179b3ad51062ade2df429bd3db6f6c2f865f2eceafe85f424be5217a6eddae9342176fc7eb7cf174945f0c5b28af98b17abbfe903da48aee95c1dac859082d16b7f8b18f102c048531c24bab6b10249e4790c5f3226fd40e99ab538a4f5c5b71f0f01f4bb86b6f6d8dc023d1a1865505fab90764b27fff102bd98001518efe3e994a5420599b2e1d190e760e33360d16945a504bf0016799916a812f099a9de9f24cd962d6a3b6c7b7841969b9e4098e78001f853edf27f7f76b7100fdc3f6a8f871e16a2aa68ed71d5c3d4030d3f08f1fda3732b7ff4cf6aefe2a52f385b883d8f3d78515e963160884fa59878b619f13988da178a5c0fec24167833d3275b6e685de1171cae3ff9b7b96fcb81f3fd075fafff15e78fd8065c23290e0a0150653b425ab6cd18290924def3387a7efe946bbbc9df760cbd78a4bf5545cca3863f1450ac99eabb9821c417c72b7532897abe9879e836f97518fd4a6bb24325e82b7ac1745d93df589698491f8befbffe75d59b73ba08b1d0fbbc6e9a94a70fc6bc745a991c3191479e29f6e1d457c6ffe519d9ce150b262ff18f969d77e327d3a73d22f5c9a3df1ef1ee5eb2af4e6d9cb7441a982d8e6b55eb9f0fd332adcd313b0d13f6ac2b7bc5bb6a0fb6f81e935b3d2e98bc252d1730da63a3b32737b2e2bdfdf22e37ed2447f6dbdf3e5df71ad27bc9d3d0903c11e6a19047ad3d6f78269b9e9db5ad1488ab802e1044d3443d8f6ea77d769914b0d017a1257d8e1031019c89b4dbf06616e85187c60a0915ac4c1a322901a6048c7b0ef9caa371c66182b61412dad381599e3bf19db38969b6bcf2b6580f1835c16469cbcb059f05a01fc5ebcea969f5ebc542947e77fd2f77fe24c4bad77fb9b5ea35f5223a71adee1a05eba70bb1b870ce052b6f97e4669f5179c233b2ff86a53ceb9fab62b7e4b8e5851060a13e39d1453b1434c56720dd9314ea547542a4549b3be2bdd137b77fa5f3e55539427cb8fce57b67dd8defc191a30dbb29a8435a8d26f44600a7ac977062a83d6aa9480ebea3fff8162be4eb67ecdf6ac2b5f2c74b4446dbb651c5617aaa95a6a72a5c9d9e4bf216c1f7e7c57fbf80a72615c738e06a0dab34a9fc2a7af61d1b5ce0eaabec068b29776c2fb9eac675bb2ebf40888fb35e2ffa979cd0260dbea572f22742cc7de1c3590ba442fde1c64537fed44ecad79c5fe76cf017851bc4f4fa057e238b37ebbacadf1ffbe57d7f7bffe56bbe1bff93f47c67bff8de937e9dcf8737bff48c5f70997e4687d3174ac5dfa5a1eb375972fe487d256d40fbf64204f6e0ca4a5a70abf8d705b7d6745d458f57d4575ada23a6a82a403f0cfa8a9e6dcfb0ace6856cd3f66c79d68e52d2d7ecba7afadbb21d967e3e7fed9a2fd4df1ab96144f2bc7b62a843b111c030fb3de9b5adb3b05c05fc0197fde491e3fc13bb4237a4f43e7398089ea8d7939da8c74e34132e3b412f76629ac26327f65156959ae85d64a5509655849dfc579eec6434d02f4336d550289088de369af83470bd6db4ed64b76c64af94e33d31bec3463b683e3d337b449ff406bc48f1a5b7b7e6ed1bcb568972feeef8673b3f2c2dc41f462f7af89703a37f11feda877fd51e09788a823535d2f618975a59eba70f3ce2ecec677b48be5cc6a7cbf874f13ee293b27458fb5af8a476099ed4188df87a433d9cb06e5e3bb6dcfda601ef4b393b3ca5550b9c7c48d02fdcf2afd45440ca5ea16c2c828e4953af7590e516062ea78c3ea9a7f41ff87e344cb072a79de2daa327b50ff8f5c03fc91765156979a6ef2779c6f32e9767d0a3f6487ab29f0e6418f4253d17bf96030f1bfc5ac687f741e3098d52217fbdef87d74cea21c43d2dffbae09aa38478ebfc7faffc049ba0d64d57b0f62a056b8e50b01ab0ea4ac02a05375c01b821085f39e1e1fc0ad92f631a0a8e1c31497a36f3bfac79ec3bc9c780c69b7d3ebc64edc1e42d0e57e3c463f21666f42cfdc7db3be9b88bc933e7b7dca0173c3621bacad3e79293fe791c9d8048c71ba499509fec896c2c92eb106d0f4f72ed32d8ec6b1b7920daf38828e8bbf8837b5fd2e318f941a98569e32fbc4d04d720289b293f693e7a099e53b8ad10ab582f66533d48f30a0979c8843c876c58105370767386c573e079f396453a67aea2db785fa3e74fcc553bac9bbde40969695cfee3a039d252fb6ddd4fcb16f41562fde85f572f9296c6bab5bf5ee9c3aa9cb5af2cd9533eb8d4bbd08f25a7b44bfbb6cd6449ef84d08ea917f8efc31a8325c4b764e9bc6b5e3d4c88672bee396cda1baa7feabb2958d71710bb85d67604bc5a88d36fbac4c9919662d7017b753f4e0ee4384bcec5fb14ce0baf62bb052b0fb3d8b2a9a50e11008f2daa3ab8cfc4f99a19da37e5c4d453da4a8b37343de5e799d2a25df0dba75faf6cad5ea03d10e4d737c0b56fa0b512a44b36926a5a0c1811c6458587fec03c62d4a91baef50f2e7bdc396bfffde3da23e651b755fcd93cea2415deb1c5f3d1b86f83d11ec92aa66d3b3654b2f6b6edc185f1d1b053dd90f5526e2aae2913f7490bf88d6e8f77fea0859cf84a1abfa8c39a13c951edae800b14240552b30b7e27c57235f04780cf57b0ee6cfc0e58ffad7cffabf5f7fa86cde7bfbd3d66f63a21dafcadc379f3a4c7bccbfdddff7984348442a9ce9d2d2e4cd01e6c735289a9ef250fadb97b8655b2f9c2d5f4d5df5ded4134e9513abca25eb0d07226e1a647d2eaa3f4fb3aaf918afafd2797bd78a97a904257b45b3585640936c03321b9d79b912e0674c5465e5b5b81b80a6805028bcd5ffbe8b3eee409e74bcb2f549752dcd79fa8f81a44aea013f594fdc13b3469819e5ebb50f7bb586328463a60330bf4f4a2652973614b112ac95779dfce6a4c84997c20269ef8ea47d435ac9382ffe382ca3bfdf32ede2d7eeeb5c7e54435e5e33b4794e408f1c1292f9cf5e63942ccfc7ada981972c2fbf4cbe90fcfdc4f8859def4b299ab25ac7a63d1277f937faf78fdc78fef90f72f7af196e913249d82673f7abe83106b1ffbf9838fbe14a2ddfb9dbeabdd5b88d617b7fd79a7a9b2cba7a78c6e257d9d0df7af1db0500adca30f5d7ecedda74a7eaa6ae7d76260d761a06bcbb13606bb7dd7e328df823ff1ace157ddb28fecbf6b52f66cbbbf0886f892145ec56d2d8173549a9e38addbe1d3c4165b338ba01f9462c6c04b393275e755720a9f31e3d5c8e734e0e0f2375c0788ba8f86ef000fc57de4f253a156045f580a28f1d4f92dc685ce132267c089d3eef7d75a5e74be687b725c482a1ffc4ea5ad4758ecdeb6e54d3069840ca332f0906fb4472c0463d2e715d3961d1bf45a9f650f2eefee86e36a5e17e2b5d6131eb8f578297fe74ccb9b0f43a3a141419af0497eaa7756d07f2e0aa7019222a901443d4e0d14482d2994b3400f864c3de4b31e8acaefbf050fcfba7fe900c9ef4da1533f9d25c41e5ff53ae2b8e512efe0f44ceddf647b44bf3781e19285f631be3f2e09c1a44786512c5406838d19463cb4ce16f503fde7249ed752f74bbba9c3a7d26e1c36ffd6d7657bae7a71c95deb90ce4b21672dc7906fad482628c80b10f55500181149aeadad40c20a680b0d21b3507739d0f63ca9ff0d7e139de164743d5b04d7202a903595c1b6f6d0961813709be545965d31703a8276aab6c82351bcc4f41c028b967c0d82ce639882dd7d359f81ec97e8fbd6afff75dfefa44536eba8e9fbf8f34ed9cb77ac795c76e0cc5ba6dd31738c102beefaae66f5d7b233a778136b07ab0faa234f804de87c80d6a190a8de178c57bd35fefd2b567fb77ef59fe4fb96be21663d2bc487552f1dfae21affececd6fdbf9696da67d7be75ee6b122efd7efe9b3ffd4d3d5f8b350e1ab014baa2815e7b8f1023eebe679fabef950aa9b1ed91071d248203442b00d37390ada0f02c8d2bc380efdebbf9dbe12b0b3f2607d1f7a6f44d9be01f711c99f8cc9269e3d5937a8001d69fc37edfcd847aa0458471f98ae4dcd537dcd173a5102debda7c35daaf03e115e4537545b6da01a1d25c246fc2a38ee03b4c4b36960e3e26617b704328593a69255b2be04923ae28f183329ff47eadfdc37d84f8e8d1972f9d834a0b9ac8eb497e208fe45954fd49410a5955f701c42230290c4ad6a885e751831d05b4070285a23d9c37158cefc7c52fccfe6a956c91aee97bdebefc292176c8ea76ed3195688fbc84ed51093c1cc59bbb6798ade2bd90d622217fb63db8d8fc60ed3fdd4f6c5ef3e9c97fa5d4a49dbd502a882f9e89ccff0e0a9cd6f8eaa128b4a70d83a91e5ba3e83de358faba9e514b44926b2baf81e858311558b9429cd6f6922f77f4832a45ce9b87fa165eb01257e103bd760ad795a25e3cae8f6ca50aeac9ece84a1c65491e8237d453627d29d62e6215b854c16b54bc7bb14a72aae8a54a72aa88cf4ec467c3e2fa89d5d2025ad17ae12be51709f1e686270ebe51b6f3037346ce2e8ac8b9e7e0a73b7e3c480e869bab076c58acdaa5eadf0a6e4001da0614feac8745b10e1dbb6e06208ec05cfb92097ffba709d7de03280756ddbf6b26af918ae5b571138ea890bed3177323efcdc75ac75a646fac830bbcfe44c08f63fc0c7ffeb6c3fbef223d9a5b3bed729c7ff426551c4750d14eed393269c5bbc287072a788b8cf62dd2b1e5e655bc0f14c7014f58499ffe7d871f7b491fb4ebf0bd0777fc5c7d57da7813a6a23d52fea16008213bff2c72ff925ea682730151d9ebec24156a8b76734ed83d8e5f5e41ce77406015e47a6d8e5790072bbc893edf512171c57491b5e29ded7ca02bbe15bda16645f6fcf6339f2b7385786bfcc4111f97a8efae5fae60dda90a560f57b00a9be76c808221795af77f89e15a58c6be471effbb1f228be22700ee61e26b6f033c9ed191cf3ff9eecdad5e92bfaf7c6df1fb6357c5b507af201fca7644f0d891b7d41e3d59857ab0e29df09ec069ed4bd11b69ce634d54bc9bf4279bf2ccf9edda6eefc5bd4f56df9dfabc825caed3fa2b980205ede0e867078a5dcb33cdd330f8935f5bcb034165af660c16aef3b0107d469e72ee215223b678a6658f027fc2ccd7a125551fbc0af86342e5ccacc256762e62f91482ca053e4587a4541a6d6cbb7685e7029f08fc38b5c587f3b25908284621bd97f8c857c758c9bbdc785c8c02de127cfe5344a7ebda43aa57fdf49010730ffee0d5674608f1d26b0f2e7ef93269e1dffecd8495be28948bf2fa6b553bd42d037c4ac1da0e0ad6c092aac1d9c8351898dac53f9fe1f7e2f9bd418f2c34ac65d43eac60fd5f81e37d759840f52239fe5e07fab57b01d64a011db6f79f53df15e2e891f9136eb8d75f5348e9d4c55f7329d66b0eaa1dc6b1131f113214c5c8b2ca659b4fd2a98213a9bd11e21b05e929a658327047870c95a7477510b85fa72d5fed5c055c992fc4e79ee22e7f8de2d78f7e6cf37e9a108be67ef5fa8fa8a9afef04482191a781a37d1aa058745d485841da64d1f7ac73da0cea70de9df2bd8f38671e74b6881d9d9c8b42d3b1e0e31c3a5a194fafc2f7f1b5b97cc8277d5f31a337d1514ba8a728f993edaae885891eda8fe8e582fe14e073751697a24ffcba3abb302aef359f6e707e5821c48b550ffcb9245d2a8715eb6ac8732005a23dd72715acc1dfaba050c820d21e478d096b272aa8c7057918b094ebd55a8668c0f869d817b033e00e0aeaac23aa8378501a53537f2a5e280dd5eccffb1c32509a90a1f9a1933a7410b1dd8c6321f362033f03f34abe3312ed31cac04709926fcac2541ef68e783e1ff4c6e95099c2298d38368f297a537436a2c2295b7494f6008b417f94c1efd7ce57fe32fbdbaf3ffdedd402b417daa9fe74b40fc9f32405699ed05986b4f3023c11ed6127dd4c746b29103a4190425758fd4f9113dae1b79db8f4646971877e4c39cdb764f5561f83ccad3d44bade72444de4a59a3a6da14158e22d1708a72d1d0e545b7bc8e1a6fe32574f402a0db2d8dceac3194d69b56cab8f4af0f94f75fffaba355f2d3c4488c7cfbdf685623991cccd7d7fc9824765a72c6e58418a81424d3ac6bb54c1aabb14acbe13385c77da4db6ea6b4028e06a0a052c017c02f43010abe1f2eb9013063029a2daf780c3c2aebd1838dd079c16316b2f10a2a0ed0dd34e91aabced2e9d479fd943f85b9990a2588c762a403b299cd26c8bf5d25c66f4f7587f291c29b5dab51f450760995bd3e8ad5432d8d634d87c92fa4bec8aad3dc2a0ab4fb653176d4553bba4eaeb6fe544f2f98af28af9ea89687d8b7fd5af003c44c13aaa7f414cd91b0262b4058f0a4644f71a3afc85412baff163eef78a11bba8d04dbac16f3fc261c8e8ad31a0584b316a32743d90c22bd9963763f4d63cd180859ca0143d1a07a400686b13c1e8d9b7fe498fff268171f6c56e919c27ce1362cef3efdff71d26ea7ad4d3d462c2a7b58d2a84a6aa10d9a87a48c1f5eb815f69deaf17cd2959833c1aac5135c0c368c0c447fda4712890465230a45848a1484fe5a78796bd54f5ac10fbfce3b0bdd6499fa3fdaa2e6306a4c5b547265a89b62aa20d50686b96a9d8fa24836ddd53c8fa6f2a19b2a037956d8544e9bac58cfe18b615901bd80a485d597a6562713cbfa9a569b9ed657bbe7fc88b9f3c2b3de5baa535abeab047563d0cd17a0a6da15d2944aeeb419024423b3548ef495d24191161b9b6551aaf1b83ce15a193fc92fc409a6d2cdd8d5c35a4c76e629a2d4f839c03fb912c5aa4d9c6a5039b69b66196661b36d3f2d64efaf932ff70fca965e3d3c6ca37adebf8f3573450ea6940d01a024df0a8abd83055c12a0a59214d713df0f5879b90ee5f3fd5bc7f436f86e7307812fbbb0556810ed57dd040f763d5e3aebbb4ffbfa582a9776b8e7f6fe766a5259afdc5d312cb81e7436ccb95787aae968308e823a4005ca703e3fe58fab6c28706d281cb0dbec067bb833a1fbe0b146d0869bbdac041a84aa73b3eaba0aef340faa3bec2b1df9d0bc4c0acc238fecb59faf9641d3252fc146939758def41ba6edcb830db03df2fca4c7ab1f476fa7e9dae6bd0a3f68ea55bd3f460a6897b7735cef5eb7d3e796d6a8b2fa8ce008bb1e4a9515d904eb2a0c5719277521464d0604d442b0c82f0f4c8e3d031fc6bcddf35ce3c94ba6b193fe4811f117bff8c8b5e7d64baff9e77bc54df93d1eda1d3994d794936efc4cd336e14f7d8bce331f9e3e9ba113e8f9969f881798cc61de7b79fa8f7e5b86763efdb7726b9869c521a2fc9b75e83a690ac6342addc9a7d6d250512a86c0ce377dfba395e74e830387e2059ea006880f0fa02aa2760f5058109c533078c541f141356f727cfef36263ec9a7c2531b07344a8bf4fd6ecf9ff5e43ed21c58347be44a6c62a605188aa31a03aa1a79ed7aa2a6099e4fe870f54901e809bd8a419ae05f37a1ceaf47a8a0fadfe6dfabc047f595ec3e067568410ec486417573fcc5cbaf3bcfb8d15f1cf676693ccf5f9b89b52fda27ccea5492d5ad509d4a38902f6fe2ac9e461431454f8abf0c6b0d49ea2852af6931371ded4c8a22850f3082b48b293c693de08a63789bbaf655fefdde55e2b7f6a78844f5408a8f7c9851b13aa688c9af6950c51946667b20d02047876bb6ab45b1daeaa2787b7ba601b7e6c59f5e9f374fc26f56f72279a42c2b3d81d3c44da150a648f4446e59fcd68be0fd18a4ac210a491d6de281fbb962e17cc9f1f8e5ea8aaad5bdfc7071f527b366c5b547a0ee83d53159e61dddbe5a51139e989e94dbb0412f502705455ec4e9b3f9d1c26fbbbf763ea62d3686d4f24b8ae418f3772dcfb4d6e10286857125af50dfda8be8aec9485481dc2c1e6fe71718252ba0eac90af43c4b819e6d42619e83f440a890d028d86b6e811ef1396fc38cf113270a31fbf877ee5bd84a7d17290ef238aa6169d1c4bd810aa492790228bca2095e4ff83c764c96de5589210ddcc0dfe9f923ccf76885516b426d19ca813ee5ddbbe67ffbad10cbe67cdb7f841f3bf5156c6efc00b158b6dc728e595aaec2614971cfa1b91e4e446f633fd4c02d1367eadea9e7b569a3be4b2b0458647a80918536c5bc2f6ee75bfdfba139c76d481f13e5372f74acb07a3e310fc422b731c38559baac3dc8b22d33e9698f9a8f83a485858c5ff4db8693d7ac5a413172aa1f6069cf5aee69a2ee6b420add9247ae1507267af26878e5b43ee39e6079629cef1ca0d3b1a158ead8fbfcb59afa4beb667d776e5c7b700f2d28c7d4be24c7890d195a7c8f24f6f8ac1e362b90f602111166205b3ccad6eddb4648aeb921a4e599e43c7e3e6e0226bfb676088b34981b070f14f5fed60eda7308685c5de9adfe1e1c90061ea8c48d584226d95481ae36ddf6ec21828402f3f3c72bbc99d2729d3ae49177de244bac8782b4285d43212b4a5f24cf837b100429664c9e045314a49074ba2e06aade52c4627969d8a379f769ba34d0eb4d486b008d938478f4b4d13fbe2d07ecfa49bf0d9ee26725d92b6f9b54fc71e73c84d5733c04600be930cb90f032411e48583d9778e24cc94acb6b8d2c1e3dd0a8e29c2c35b2d0b006a5150d0d2c175052eed465e73dfdad3482a13dc67fbe0e9d8641c394db60a88f4df42ce4423b20b09046131e35574c89f945bf554d5877f6af385f424fd4344193e7408a84e4c8a228eaaf33ef6f2479a22f8242a076d58ac2b340b2f9c3a0430ae668461f38c9b9fffec661f507afe811d71edcd0d8dc0af2dcc4864ba0e23de0a958765848ee5146e9b53c2c7d581bf240489e690d9a1407f7a4499ee90b8405b75e5b69115d33481f701ea0fcb0434e3a6ec2b97bc87f5738ab3233857dcf9d5c76a21e2fd0b355260b56c949db8dd3b907abe85c05cb26706c93396f61e35e7ed6c2ebb5139c7ba5a25853b96adadab5ea4575c83aa9c5a238ad7150e19486489bd3163fe5b943d1e858f07d0ad2e21759527a7334b2d468f16b1120069cce3ec9657036e05fcce7f9ae9d7a80d2807e1cb04401bf7ec7bffcad11d6d5fdb2c3a71d84d8e7b8c3efcabf4cfeedd250a7367efe4816ab7fe09b5a52e52df672726c9b5a9600cf0b6c0a5860d06fee76f8d883ab7a870d4fafbc4d88f7663eb73682cfab43be7ca0f21e8b8df5d82a425bcc686f5f727abe73e4822eb27ddbfdbbd3cea37a097b21a43e6f05fcd09e56a556b9cd427ba8e7790539eddc908176d015d3ba1d157d5e31ad0be92cbbf71638d166f9a17cd1cc19cf08b160d6cc65df9282a0fa0e181cba10f01186935c53012065b3513d0d2dd6421ef54990e4334544d317fd5d7d89f608a9c053ef8e0c34deb2ee33eee4ef7bc97e6ad1bef585c7a688c09e619b5d411edc234be185963dc93293f41f3fb29bd307bf2b5a7f37e8a35b8598fbce87d316832352e4d46f753008abd15f3c54e861bc9b41b9a6ae6da5406871724fe9f2b71e78cbd9f2839c9cd0b8a802b16d12480386d236835b3a44f1b84a5957dd67d99e9ab2765ca4411653168f9e880ac1353d17c5970c9ad7fe95ff13e2a3092f8dfa18e74250c1590ded0d457bfa509614ad29208b4757e2526c185b3be8024178149425d1882c13bd391adb3d534ff87b98bfebc29f08201d3073387b9ed1a14c144d2793d151538d767dfd45bb953316bfe65b767b5f7668ffd52709d17e8f1d861cefe7e387d90467a9bc75b01d7ee02853db76f8b64d2d9bb91dbe83c2aeeaeaf52d562c970ae487e7a645162b0a75df0292278681568bf45d4a57a5100e296c5f027becddbbb6f34b42b4ddb7d39051a384bd827c100c22da7d58ef50d0ec0af202751f7032b0ca40cf5a60cbe805779735f9c5a69fbf1dfbd305f3a4dcce9bf4d1c35f53c1206513a2be406f39429e33853e69cd83da1385806400e982b512e024771b7b2d06545f168bd933e87cafa0ef711e15397d5a584e90691b5a743fdaef477d9e0dda61732bc8c35a91b8784e29024adfcd0a9ce3a3e8c50ce22cbcd7a417dc44d5e07759ea82ca0fff2ac4d76f7df436350b9f5f743628221c3a6d9d0a0da97f9aad40b655165638f64f5adb48ba4920154a59b2a244735dcd58cc59c5c85de52807b22858164cdde29aa3d75c22c4b4871f7bcbafe7f02fbd884816197920b4c6408be6e469b0dfe93e1e3bd6a122a48936248b099367c15cfac0efd90ce7210097d12d372159da74704dc33380d7c5f8fef79fdd892f1f2aff7d7c5ddfa5be27966c53cb5c0a15e842c0701426cbb6b3255b503f0fd55fc343911edea7e8f5f0d692ead1138c6342bdd60148975e740cc7c1bb301d06f93743529303a1d36685fa026b3d14922a33e9c58d0b93be48ba6668f28b71d0ea9ef48cf6b3e229c4c903c90785b6204fdab3cd35ef377b260e92a7bbb957c444ada12ff9bed02b298f76f85c240855631eb085d4692d231892cac53b18aee8f135bfc0a23b5bcb08acbdd8d76815fd224d4f5fa46a78d2876d6b297d8539a524bf6f350542052894474c79f352e4bd3bbd9ce8df939dc5ede20c73cf52394b8ba6634d3c703634559e0e5795cad6b3b86395a2517c8937eff16972e25fbf68cda4aa4ac57f3d424cb554e0870af06a58b0d5773148d951b4484d8b8d503cf5a729a8d71860d97917019207d105902cb530a0cb60449817ffbb6b3eaf0716cebdd0037b2520425f742e4623141c15def90ab0667155e76ae989ad2a5de2de7f94d067c77b4549ce9a469a76ac421d490e5a0ee80c76aaec653b088c34cf9e97f2d215df8401ce2ab2a9027ba47719358fae4d1965e27a80bdc1ee73d97d7280363cd470b2d34b24ad20977267ec5890ac023969057970a706b46b62fab18a77b33d38bf342e3a2edc714c4f928b0820970fc1f0b889dac06d1e46c4f2fb265e640805e803fa4719a75e9e569053123f4f6067047d563cab201f9bb8825cca6d58dda777c2207c24f09ef1f4f5ce0df68a77cfa017ebbfb1c013d2f388df06efdfdaf3823ceb826e9267ccc35c2168c36994f9bb3eea99dd1fbb526d7fd8cc8b0a090952a8ec26e16f25b2abff7b741130e20f462ffad95e3e0a078b142eba392aa073bed2b4e402ca8ea3ca5c132717712e2626e0ce19848bf651fc1e78404345b44ede2973682253dcbe2efa357c29c45723de7978c6e312bf434e122898d28be6fb28588b02bf1a1432d5a06ea0166b05b5d892a10eae7d7da982e4c934c2a2270bdfc3de571e751cc1ad7d61c7006d29128e89b211bf372284a73d3128c014d91eef3dfdec35af458438fde74befbdbcc23fa33c25bf4b6eb41fa84c49f56bb6c29dbb3d65410f55ed2fe540e190030772e015432e862adc29d6fda5f022e08f79d1ad109df355c1a8fcab7a2fdeee105e1bd7aa249fae890b6ca9217663bf634d443488d87591f748f4ef3b6322c65e6be20c2d97eabb2e253916bfa9ef56fcc8bfce51cf9147a670c7a5ad3620c748531673411f49266229e8b94e91fa4e25c79abe8bb3f6e7821ebe558ec184fc0a143eb6ba307dd73d4e1062d74bf72aef200d9ce5f77cfb455577d61ea87bc22e6431886c426d406e2b39a6f7cd0dfee9c4832e78cdaf407746a71c70a05fd0eb7aeffabfcbf688a64ac87e32e5aa58b527e1e20c87fc2ff5f524c7b1f98bf029c013cb7136e84f017d57d19372ace89f81fe8bd19b6bd03b23f1b8107ff3909a234ed3fd93095802480a06862aef179aaf05222cba3d6d06c0363f0f44c469deb170c5b2a1798b74baacc269ef201796422ef091c0b3f55e400acf87459acbf6aacad678747a96ffa5e7e8efb9f1f47fedb672da6772c25f74c797237eb85ff14c15ca3aa68b186fcd5e8058f4d685529fe13ef2342886fea5828d0fa02d4824a96d86e31f6e8286db96d748405701f2841ae18951c5af6e976b8498f3eb075d7f3e56880d67ac5df6fa7971fd45fde07966bb77d338c901f6c0d22e3ff50b79a8745f6ec2fbfa883ec02107823c1af433f017bcc302df7b46f39ac5e995e8572fcba03fd622b7aec836f0b1b07c21c71ef60c8bb597498fe8d3f372ba37e9b93a7462d2d7e30296accbda83f38b3de6c4c5ce9329f385e83724ffbd41d8132d440a97422358f3d36b63fbe1f7fdd8fd488736427f22410865332f8719043aed2022c47efbf5abbfc0f728677a0fb77ac5680f53ceca30ffd0bc40ede19af3846c37a3ffa43c8e8c7f2e209f14d21dcbe8537fba5abe397df2145de33eceefad62a2ad3dc803e3f2abfb6593afeda040c46c585c2ccd36560fc2f2dc9b9966eb253b588a0e1c9a0c8f24162a08c73ff7cbbb2bdd05c85ad0f9efac325617449d66c23a5639ab3d0dbea641ae3d8f05bbe2f7714514d02181b002b4670e2fe88a4ffb5d3f60cdd84f55411d09ba1bfd238fdd4ed685848a7a2c8d32ac9e4b9a4649fdae9e2f6331e6403e3ef053bd82649fdffc3c7849af87b8d7a06f4b0f1f8aefb6542027af20a7e741af88d18ba5931af4e32ade4dfa9c5faa7f60e9a93b75c97cd6df72a8e3f93b465adfa15ec00bd5fcfa9728bcd1fcdd61e9a4d6f451829b7a45189db8b5ad434eef3fbba5e43f756c8b4e237a8860ba78b0504f8d467b9900eb3f536ead72ccd2ade32ade4dfa96ba1d2f58706bf23bd17b8a9a832be6c0e68861b185aeede181f4828665057b818ee58584b6bce9e62ec2e24cf4d8161a1880ae39d1fdd276c5dbcbc9632005427bc990e2a0ad1cb0c543fd97e6ef7a4de36d130616f5d804fdbbbb5c05744c3bdbc4797d80fffd3f9cbee8b8599f8ae0222057fc083d26ad4f089e10a770deef3ce9829ff818d68be9cf27fdee70d23be22eef21d0a78998f837e5b60c316b4b057260f1365905b9cbe859166f1354bc47e2e9f1c5775e601b9a97529f7e921027de7be1a167232d579f7487d0b43ef12e8541dc1782c2e05b68f045dd8d1e07f43c5350ba504efe7eeccde79e77d93af9ef13c45ed1ad3ef8e2b82d2943f7a7c2931944d47f71725c6ed0b757bc9bf4f9e23b37b439bf504ce2a9a00762bb9abfdb6eb26bbb7820818a5cd37388b96670d99bb64485ad32996bf05821a18bbfe732fa517cf9bc85cf2d43e8494f90b46502dfca810af5f862382b64f2980209584cbff7cb05249165f528f195c0533f1b7ffcfcf1f29e8cc6aefe76dc3605109714e102373d078ba5ac71a6f8a581c02df1723c1706a60660913778e31bc07e79592a8425023b2bb0013f142b4a16851ad8932d59057911a367d983ab193b35103daea822f1f4773c6af71f4f919e65dfc543f20ec0669cd1839a7cf81e60aa89936209912221cf85425e3491a937050b356d17dd5fcc70f270a4e733eac007661d7cb010690569a3afec23e22315bc3d4cb9e35951aec5a3b4f45f6cab1379473cfd8ddd934cd3e70616e317868637513c656baead776d170f44efe1138e429b02a09013dfacacb995c9969089c059dc7c0faec69bbd5b7c05f1fdd3734e58892c283d3162c2d4bb5a12fcd2c4f9d60a81fa8d306079a296f91d5f1105680156437c5723148b5fb752fb53f50dbea7d698dd78d81a7f5750ee39c4fadd05ee014f3cc0936c6aa92d7dcae2b2a73d2a3e0ac4819bd002492f3e1127d8db2ddbc0b9428dc9bf527c94aecbf7648b7920263dcb1e5ccdd8a9c1507cc2b6075758bced4fcc87bc31a0cdb5d70871d075c74eec8e02e1d49b14d46772bf6f42522ce499e8901729148b22e1e9d581bdc8f09cde2c503e575875eb65592542b47ba6f30f53fcaccf63c4f4285fb69051305dd754a4cdad202fd2b849cfee512696e3a0a7e202cf6d8a5f31d1c3fe0adbf2da3e1e08d22f93e6b9bbf87bb28e4de849789690492c5d4fbd47d33fda2bf72deb864bea3b9342f09885ad435254214e959c5fb1fbc85227c5e1e2db23806ee2a6f9dd5f2a9fc71a8ad347c4faed748ed7d3af8309780eb1d000ad45259ee02c13a8280ab8f20ab7af9945f07eb204bfd8f80fb75ff03fe2d7325cc507b314f96ec17ca20fac65f01046127a963db8ec215e1682c94d1a8289e22963530677b857887edf0e6db8335d88c38e3ffee21e384fa6052af65bdc02d84241522cdc43d16b26965d6203e305502b0e0a8d49055238fdb653bb0f979ed28bbb757bcd4f9f2f715ee8f65882f6e0f34dd06041fb24f128f95a46cc03e11e0e4649807e62390e1a5ce67cc63d4aa2f764f343585beeda3e6b2054afe1467fe09e83d08b8ee676eef68e350752929089ece832e0864617478a2ba396947ff00ba61ada6327b0691b5b14a73a09bd5680e779e8475f11f1c7bc26333ca24020ff5f2a5eef79ef86680125b7b88a580c3f18630e834ac209d4baddf5d0666ebe79803877633f3bc9751fe847a2305948b6b99e74b26dec9bb9fb305fe3b32a561a07c9f6e002fdd0b8d4dace4384e89b7afaa78f7c23c4e9fb5f5a7b1a0e386b3950c116043f30210f79e93513be2bf20d0cb24d2f7d7849f7478e3ffd7ea93886765b3de323f9630731b47bf720bf812404dd1ecc80b184f612242118f4899e97dc2032e927db43adb97b703de5fd7784b0c46cc46e5d8be7e069975f291addf0dc42b2c41a6d8b60aeae80a7b44ad3427064574b8ba6c5b256ed298b444f88982075488a2c6eaa70e0277a8581d3d0734d7a7ff8cb5520a03872e37e6f2316f81e5bc0e222055014908348146fee04ca43037ccd8c5b7224079f6b7f708b5c5e778fb2b0546b240bc942ed7af65838a48b293e6e79ea106f20a461d00f78eaf68a77e0dc830a846014bfe83731dcd9ada59cb8773f36bbf2ea3a21463c7ddf19e3e70b31e0f1821b7ae3fc9a561f29d812e9eea460d20628988a50570a4261742e4b886d43eee317ed7e5fd121bf0971d90d250f3df78b1caf43db9c35e942c9dfd3de24bfc2dcc66f6ca2e7910bd902f1380f19053ccaa6fbaf191ea5a2675df3e3f4d5f35e207984fa93e80b54696dcb6bfb78202a5f3f567199118f7bb133aefb00372a30636743377d16b7ceaba74ae7a19e12dbe1fcec691d3a8be219237617eddb8357d4435045b6560c54794b59497dd8fd432d1f1f69a261fe08d712cbef6140f9fd5d17ec7370caf3521fefe13c919515df7f7ac700d55fc351491d93032f1ea709d38b9d05ad26d0b1ac527832f081e8df91141aa333d959c5fbeebadc6dcb5c2f0bb277696237e5aaa7ae43523b2178da13a309c5f8ee0467a687d5f38cdeddd859a127ab700e9bf4b5c2e615d3818a778df39d1acc7626fac18af728def2f836030e5b2f44af2f8e7aa4f4092146653df8c1d37f15e282c231df5c8b1d0c5a2d0244a1664b759abd68f18282a937034a0fe592631e1d7c459510ff77cce383a7bd2e445bd1f1a419df49f95a1b7a75503a0cc23c11dc59a299fcea0aef9ee6fce2d17c633933ddd67f7afea13539a2ef592bde13f69f2832e905e49855bc6f9f6bfb1412aa7aeb5801190aa3b4c657781f35e0e20ab2f20d3c5b77101540914b4f03361ff7111eddf2305921e1de8d879eb72f16d129e64f15d9fa9acbfefe6192fbff53ae8f92fc5db6cb311f9ebd60af1ad99eb78bf7a37503e4f9c50adc14de2d20076a20c6e440e1b142420ff7990a07f77ba4905841a9c70b4aefa3ad25b7cce5fd038584b1d0922957f9baf06f7814c60a66738de79215d6c60ad1a8107338701a0fae41cfd516aa493f9fb5ab6bf21b37be5cf69ccbbed3e097eee3fd96766acb8cc373a4437a5fc70f0b7174733a7aa00d60abe3156c814d4a29d4e5af9d844e4be97d81bf13c4a54e873ce999786748fea6249c0f5ca33decfcf2f6a6423d935eaede5ac76cdf228b673256f727d133e42ec0afc7f865fd17777e0876d260723c562b14f5fc96358b9a796d8f10962d3d91af69c416456d2e3834344fc76378ac90109689b650c9d20dc7d3ef94beeb817b3ea11875c280b4a8075c7b1254e95966fe5ddfff9f76d9b6a40803ba42b4df6187b17bfb039ec79a7956dc1ccba26233172d3d1e6ba6b52d1e6a60a101f142f242c28dba10f7b7adc169cf21183a0d83cfe6b5838ee983fe1c331925c1e22dd133e87bb62484728d1bf43c5bfaab3d4b8cd3a7f18bd413215ab75690140779202d61886905223d11ef786f98e38af8f4e508e8e536c92f0ff959d6209286b878fbdab305c3c00d7a4d842813d3e7fd972cc455a45722b7830ad93e1e881bfd87250b443758ac9030acfede74fa5cb0e159c7d2eea5ec2c6e1e836fdbaae3cabdf602b32c2f9da71386b03500df84cf766de9ad1bb6db1566d055c0ffbe56dddaec99fbb631108d81ad073a7990c9d6b6bc246b5b34307921a1251dd87b5e3cb7e91f1ebcbc87bc1e06dfc16cb3281ea748c07792c55b7b3b28fad981f160d24b9a7cc2e88739ceb28c38bfc9ea5402fc0bd7512d215add06c8d64674d616d646a2d95b03bdf7fd7115e731c1c30964b599fc06179b13f2ebf15dbeedf38da297acff8259a389f90d26fbf0fe2b37e8d9d2dad11ee284ff922c2c315bf0ad44127b0e7393669944f1b8504018f7299c2fbec7f61c220f84776c146f7d7bdb3b7aac10a2dbf13d1677c1eeb3fa842f2a80a274c33f3168cb5b4fa258fe70575881f86da1b3ae3ee0deb4542152f35bcc39cd4f948d0d94849e43dc11af9128e495d83afb2760d1d144685a746582ced00fe3a98496a73875cb16128a7bbdfb0cbeb9e5e96a45926ff24d7c5a166f93b5c31cdb963c4d7b7e49b72bdff48a69d7a0a7e983de3b6af342ffd28be9dcf3600ac42f54f4da791da2060ad10b7a50890dcb66f29bd4830ad4d524e93f9b47c9f9e51e6539a3c7e538d7a4a7e917690f15e5cfdbf2da3e8be8aa5a80bbf8bcc17ab22c137b564544ddc77096bd2326eb89c7051ddeb10acf15f57e7efac1ff1a784efffe8ae71014813e9c9e200e8cb21d56af3d8e306b048eff512ebee9605801ff7b4fb8f0825f8ff1dbe53491bec3ecf889c98bdec5157fdc11afca82b285063c6671c506ba69d1f56c5e41a9b4d80ed8a46fb75df7a92096e6db9eb64c3b21440c3e83d966a621656b876cdb963c8c3e4fd74d56b0b98915d3090c41d007bd7e5e3f9297409a2f656561f13cbe2051d26deb8fa3380f246cb60fe797cb41805fa33db43c153143d5ea5126996f2ca1b200bfd6746e4e1ff492ecc1e59df85f12c212b3bd68e0c76ad9101e3be33ae1c014b68a595bc884151226e85885a363bb84ba5d3be016a93486a64ed7854fb0a1f45e40d8be3d85e5a9071409ad89b80cfec12e87efc61a075b17b7f5860d4b608186032ebd61917bf602af307b2eac9eb3841ae65ad6cc825b4e6ce140224a0923cc320ca62dbbc04d791501790d839ed90e82d19fccb6e4b1574c1bf4032118cfe4d70b564ce71af42c15d3090cc172e08a5e85d06748a691e2a050d5cd26d40587124a0fe43d78205c514536915fdede241711835f8bfc26283f30e9894df328adfdd75c8f72bb5cdb672b13da4a2412fd816b72c287b2421f36303d9bcb99bc90d005ce2d26435052af4bdb31234388a37ae6ffb92fb671d78ae358c0330161d3eaad1a6837525220150ce2f73f8c271206c422ba5e03920a73f8f9b7add8ffeff2df4353960dd941042d509b0270931494da423bb64a6fbe66669383bf78a76e5a2358affbc04f389ecf80651bdb4287cb6b79423eada138d0679b516e6cc5b4675b1b48bab6a1432606fda46b91d77ad7fb7b6039439defd26090a552a8ea2606e31488785e4cf67fd7f4b807b599fc7ac93ca864060cef3fbb47e919f4994769edbf66eec1e50ddac2e9e9cdbab68f07a24258c1c530d352a0dd4bf9c0d96897532f629207825874924577746cf76107655d7081101dffbe53e7b66dd52704368fc3feaebaa2f64605b52281cdeb44d0062ef0dffbda485801adf890beec2b9094c753d7fa0aa4c3fd3bfde94eff00a172f1564affe4ed99c022e7169dc23736db2e5921214da052856c424b582fef3e5a03b1868ca278cc80015f8158b82d04a3cb504dfa939379668943880185cdd706ac21183e719af4ad15ef9007c775a6fb85827be51c7af8ae38ab9bc64b2205b2c794fd3a75fa428ea10f4207ec382e48cfea416d24bf493d289bfcdafacfee51961bf439bf36cf3ad91e5cda10f8ef590351b94bb6c5256aa0a17ab3bda6356f304bc1f024122c62366bb1953a36a543daec2e63853876af734f2b54c10aad38d2b02d5fea01e6ef7c9b6bbec74f4071b8e2f779b9806105f44141526e46f4bab7d5e9fe00bfde79e2e8a3134c1cc916592d9b5a5a074a320b976fbe19b618145b7a2b45a4f1c6f19dcbf85696a6cbf6760bc4c293acedf1104cbe99c5d6ec8a69aeb0051b5fd6104cd3e9a4d6f45ad65fbdcf3ff9a2331f9672d323b4418f17185cbe61e6b4748ef3d73e8ebdef9c23fe7970947e91734c7c7b04264ec3b0b4f21b0c1945e2bf7b63f70cb3f65f528fd2c2afcdb34ee651825fe97ffc776c65e2dd2d7a4721af4c1ecb2a88e94cf4b0ae4c0e1b38cede8eab10557fb79d113d5c552a4baa668568cfc0da48763c2e5008d6e9cb9dc5e07b8438e1a00b773c1ddbb7b73819f0604054d2ea5d4829c445a12d0c140747e1d2d2885e6cef96b8cdb6d94567d993a7419e07f80d2d938ae3ddfbfaf5bf588856b9e9a73cf08c4854d14bfd659c711fa8e81d8afafd7c76c6fd4876a6bd3ecb5bf75786f13e8f9d40e9e9c56b920385931c3cea6d4e0b052e6f847819fc848defa509295f2bb8c467f1f38ae9226b653ed157f42e853cdb2aa67bea1d194cfac18a7793be67a9c84e5ef19e983e3bebbee3f53b7e70e435429c7ffd9dad1f1821c4d9ab8b6eb9f45121fe9c5efcd5e819425cf8e2bd839fec2044db833b9d3a647682f618da7485b7955fcf6c0fcd6fccb04c5c419e6c070cd67f62b296df9e06fdd8f8189b905f9b7c8c35e7c9d859ee6cfe7ac74355cdb6bc52b60e591efb8fdfcb66bfa5b9ddcf962eac13728ecd2c88d650288f24476c88c230f074f10b7045ab549ff0abf032e039f821ac70799f898f067ea6889ee2e15c2556e1ef61d051efadc47bc3f2cd8a8ec233804744beff5dedfb76e9d6e74a213ae7ee5a5f394988851f7dbe68d10cf58a86110ad2aeb41edeadcf032907a423631f071e018ee771d8e6b6bbf07e0795c2b4581e2a54d04f1638bfef98ab0f962dd7f6b78ec7bc395dfe385a8c4af763da6384f2cb72d05ea3142e9522b5e7e2283e1a7bf5e4002f134abdf652fd4167d3cbbbd4dbc33803ba549f5c3e0acf293c47e192bec2d31d17f8283cb7187801de1fc5ab0fdd307ac50a213efef8d59ff1d9faa8e2da5a138f6e06e9e37d156c64e7a0f857f7f483a674ea24db65c74eb346668ba0bc66002fc3f7f712fb01ef85efcd029f6183ef0cf05d06bc12f488fe2425cf12df318a4fd5f2aae88d52b8ec0793fe18d0cb51f4a55fb418f76502a7e7e800d47483df9c00bff0cbf57822fa99c077c4771ae32bf5bdd4b6edf712a275a4ddcabd4e95704d7af77dae95b256975ad9b95f13ed3117e335037c4614bdc0f81d13e0b757427e2b402f205f49e6034bffc9bf621e73480ecf30f8b5cd37acff02f3e228d02bd6e36314be338aaf98b770e70f3e1062c1ac590f2c562d163b829bc97775b582fae454da5d3c817c1b5784ffb03d3c90a1d87a90a5d906b22b82a10dee1a96e3b9309e4b1cda2057317022a1356b83870ccc90045cccdd4ee879cac5efca7efce4eca3fb623b6b7e1e8276d1fb2ba8b7af2605cbd748a8d23b0218165be772f13e87bd3fcfe4cf57fc5ddbef3dc6df9b28fdb58e6fded53bda5e22e53d114cff8c850c9565172cf4324353d93c446973e193ac6d45588832991c3c4f6b0a5be6f2b2843a562cd9f6dc96906c732ba603a18c9eec402916e24a5a316d5bbc4d16e22a67f42c8bd9942ce0250b716d6c7b3437e4d75c7e75882b69ba6ef3f82ddaec1025e79f3c26d7e097876ab7cbb53d16d1c77b9fd5bd99a083b9c0bb1b5d48e8e23e72595ddca7f06c1d7337cee26e6e0c9ec71c433d53f6e9226de78ce3bb0d3af21ef5695a81603150676ddd68427da00ecbca7278e8886082b459f5edcd83d60247dca60b24c963947c0e5a3cf2067fbbee218b2ffbfc057f73c4494edfa3de12cd99e89ad79e939b793265b2b5ad5c8db3b52dbe28acf0c6bf37b6a4f35e6cd7a60c49ab3c85d9227fa0308d2dae0acbe2ad6e4fd09bcb0e94d28bb901c3caa4dfdcb468c29b5b31cde421704055330d8ba4ed212c868b7db1b9697e2301c5b479fc52d2446ceda579fc0a937ee0802a7b01289eff2fd98db7f1096f8775eb445c077b346144f1e0a2289b5002f504cc73b0580a34619162b26655d82c66b61856fdcafa57e7ba427cfaeb1b67bf70b6fa369dc74ef03d40f240a85e843c0fc2c903f81a907b0604052e97dd9704ea1055317b1f16f77581a4541c7f1e72c327fb4d1162cfa507b67cdf5fd4ac087903fd4a61bd379965719c5b5e490abde20a09c3f8a6c472d05c4545167e845978ccd3ad3fa2eeb9eadec2bc2249f0262e0fc71a5b2d455abc1daa0bffc2e0c79828ac3b28d82abc7b363dd107dbd3b2381eb46c153ddb1e5ce58c5e7031dbc57711ae9edff40a72b33d62f2602896048bcd090dbf00bf76c5caf92d4fc82fefbf60ba6ef3f8b5f45fb33dca27bd89629b5f5b6b0d8426b04a05e3d7407a3dd9efe5e356c8bf8543571d70801fc3c4aa8583804d1831c0a93ac61d8dc43b154e4914cf54e548f2398557a23c29ac7087ca95328147800fc28e5548e795cfed07fa613c67c64623c0f3c0970bbe4a15bee0a14fa68d8b08f1e5fac805f3a020eadf04a4d8e277807f56509f6088a9454f31f466ca72c2d6283a7b8b26fcef01b13641ed9b4c8184ce33e984ba034a7a47be70daee6d4f12e2a4ab463e71d96142a44fecf0b709fe1ac7c14e64a779d176516fcb75c64569cc546b0cb27d5db4534114afd46b10515cf6978baf527804789e8ebd2316ec8c05aefab954cb41947bd98b613ce7e0be30ee73709fc2a7ead873897a3f62fa313988e26b3bfd7cdcbc2384f86cda9b8f7ddc463158f7a882b5470222565cfb06fe8e359006f49fb748e82bebf4031f89ae81d477ba076b20fcfb33812bf9cb51f2a7e5ab92be57f99b0ee199c023c01dd6be33f59a613edaa94979d5f4757bc2bfd5edc9fb4fdb2b6183df3c46af8202ad8cdf4a920f3d4e0b412d8cbbb3d03a267d27497b503b64425e74fb307948d61ec46fa5a4a0e8d1bce25af87512f2cbfbaf02f4c2a057c9f905ee30fa167e05f1e7825e29a35fa2e8adb8675155740d64d2ac8fb6dd1ac8d6522098d8e237d98bbe4e4e643d5fea3b39574e9c2977a6dc72b8bf9d334d2861085c05f06c35409c990e2d299b1d90870e70f15ca9a06955e111e079c0b1062256811b5a2c2c8580d3a27b09f03ce0b10110c5d79df8eb159f7d26c4b41e13264ff2f320de12f7345cabde5c3b5dc1fa6b00bf55d0efa0837f1b58d1b1a310bb2ceade316589103fcc5ef8514d0d38a6897e0af08780d3444f0aa01438790ca4602a4c5cc3bf03fea4a01f52ebfcf42ebfa55d20c4397f2a3ef01cc9ef6e55fb3e3579a5fcdbcba97d4ff987bce91c71458bbfc60df0d862a65aacccc7845c02c59ca7db4f097405c363eda9ee77f17c312916a8cdc040b44ca495f85a3db08167a39f676a3988e0bfc46714fff5c455b77fb583105f8c2f5ff3d93fd49db5e8afbaab814361d420345987ddb31a707e858ea24b8a59b30ffa47a7355281ccefe88cf44bb91cf6fd3401e4e27b573b33d577e9ef75f1bd99e0bb047c67826f931eb56f362912935edc045890903e53a8b23d39fd4ae061f05f9190bec3e897307e31e169032fa6a8ccfe2b019ed7ccf6d0133d53845c1e92b5472c29210b6f013dc8fdc6f30bfa307cb46205fd08a36fe7b702fc0287e2d2e383d1cf54f47e882cdc3faa40e67e3af18faf403021ea45594c807e0867df1ffa9cd2e329f9ea7d53db0e9013999e504a9927518a0ec947d64aa5d960b109857548a5c5b219048fc645964e31d3e415014b44e198f81a3eab7f66cd0b424c3ff95f9fdcbaaf101b0a7ecb589fa9beab1e618c3a84b2ea4881c88e69f9489b6ffc0967c053856f4fbc5188aea17de6de9c26c4411dfb2fec7982103d4ee9dd77c3ab422c3ce0f31b964a8bb7eed39a17424fc4dacbbf52f604de9de15024baee64490c4ffd6b8b23529f136258f1b517f4f95a7a1abd073f7589e4ffc05bf2863f34d73f052eedecb37c3ed39c15ed4f89b64b816a778b27912ba23965daf2cd648adab10ab883fb145e499e04fa23a6384af01c5ad53291ba946dc7147f29b27df2b545aede93670ec4e5950b2eae9053e4bccf663c3c1f1e07f5572d2910f2440e347fd7d975e441ee216787d107a5777e497a6ead3b7d3c72a4889727d56e427bd0ea7b33f44451827623b98f44d14aed4147c0b7c2631e4821be7f1cbe57194236455dcae897980a35c06f6c622b01ff9906bf79568fdfe4b752e305c0897ea6413f93d14fd61ea4b8207f09e43673a3daa342d3e386cac6f25b62d00b7a50aed11e8e95dfcc787eb5e27341cfe251ae7865d15dbe02f9f6c64fbfdc760a24d572e356bc6aa755fffddb3f0bd162c7562be37ff7105384580b6f2835b8171d289e70f0772fda615e9ec245ae4713be8a090a86e7295c60f15c52a5fc6b81f7e51a389d1406e527bb279a293f7b69c583e33f1162f5c0a5ed7e3b053c66016262a7a36e756260b110832b2ffde06f525186faa4387d7c8fa34244fd8ed09e29b7f80cb59bda39922fff71d6f9452f2e6b2f3b2fad7ecd47e7caceed5abb6ab69c98aafeb5e18c6fe64bda4b1a4eae7ad727ea7cdff896042f88a57ec7a79cd9e2cbd633846895d2e6c17d0e90fae0a116bbf798247fdf3ded8ade55f23d53433bf4f0155cd851f6f60962a03fe57858dc73cae94b1d8aa9266ecf32d51f5e2f6f14dacd453ba9e9b40803b258b5a4a73d00e0346121e6ec50619deb94e339d5af61e0aeeee772c66739e353e143892ffd1dc5ea6e2d07517cd590657badf04bae1e93ffbf0bfd76392079162e703a03fe13615e11c05c5f8978ca4fb9cfbb25f66b549ea254e4305738d6689c71e057cb25e4ba58f11727e70aa7f6cdc5f3114d4f18df4fed51eed0da05b5a7490f752a7457805f4eafc2c403fc127d97f14b6301df238a40af18f404eb3f6a8f5cc66fa03dcc792081dc6e647b00af30ff1ee097e8b949f80db3792af9bcd524bf02f22cf1c4f489df89dba390705b792071b1fc5d2ed8f352ffdf6d77e95c71913f95c72c9e523c0edc1a328944a13d26a8f03ce6499026cf77a28122672ad64292844c7e7df7c7a73e94137064d65357bef28a62b01e057fb51d15a41879ed55313cf7b6337bee2fdfb4d3d2ac95637e94f416398f473d31b2204bcc509cf38833a3bd7c3e7476ca91d9274a45b0a4e55561c941ebf5e9f70c1922e19eed27f99b15b679b7dd9567cafb5aa7b7ffe02ce9f1b4fe579b7f9d2127c0d4c6160f1c3b5c3e7f7aca80033b487a5f398bba74897edf587c5f217ac1c5f715e2fd61b49fe939104eae7d01428a654d87f8b4255669099938da9388eedd2365a22dde17c6fb95f4649a9e83954f41b8b6f00b0dbe9805fafee1cf1efb9454e86bd6af7e6feda1e837788e7aede311056bb06b56dd3205297b8b3c11bf42216bc881ed3a7f293d909a8e472a0f24b036e002577b15e5a8ef6dae076db53c4b21bff9e897580846b5970ec1f0b5bd4008c6e457b72ff3a06cfc06d6326c2118e641c5220a8e41df491a51803c680f44d12b65f49bdb1ee411f39027e7b7c2baf6c2db43d1b3785071f356b3f88df3d84bc07f5e227e7f58b06848d403f9eed367ffe3ea40b42527a7b20f1e78ee81cade92c98b1a2e5fe81f2c434741f6d495a10a1fe8758d3e333250d9a94ab3f22d95c954e1cecfe2a60387eeb69cc5ed253e8bbbf2d239e203ec1e4a0ddb8833d21b309134ec8bdfbf92f3c3f893bbec7b9d9c585e3ab0c758ff88db2fbd0bfdba095e912bf9322be0fba0f29e57d2db2b8733e2f98c3be33d17f4a892351b7fa7f6cb36db13672bb3b3a1637ca25296ce92d7edabb34050290b9b932a673d9da5427c16197c0ec711af492a86359f439354bc0f44ff4ee67c2abc2ab476dc1239757fffe3d7b7fe8423a51a719a3459f3d8a54d3492cdf70c203c138f56e38c424f6f77bcc794a79ec0e90cf2817a13cf6655203751e1ed815ed315d3aeb562daa43f3640dfb2434380df9189f8f558e5bf673f233c71457673e561632bc8f32ded413b2024ab20f72cedd133d01e43f15c86c97f604705ceafd11ebaff680f35be6303e7f76641e5c9dbf0daca1e08d96021dabae34f7270ded4509b22e13e27f72eecf6a1fcdb8fa9837b5f29fccad982e83dc54e148a7f8a0ba37095ae1ca7ca4e552d9121a87254e13982b2b6e6aafb6091e2140b0ac188bdc411784ee0b9cc785e79c57bcd37ebbf59f89d5424f3befa753ead6d7ca9602d2cd4fac142ec11ea35a59d9c120f7becc45f1f978a24f459e8881d2e13c10ad45845ee06bc4fe17d54e5bd3345bf3a33099f39f17ccafb72709fc2ef465e382a95e32a93d3f13b55e62a3cc6673ae35355ca8e4799232abfb5bf8837c6f19993904fc2c7003f5074c073613ca72c39375041adf0d1492adeff09be5721e9220cbe4a15befcba6febdf9828c4ece5ef957d75bfe2a516753bb4585e8bcaf31aac79d41cab60dd170a3674c6378ed6df2eb2661f98d7e945e981ccebf8eaa874115be328831c0f42bffd13df5fac2dfda62b90b9a5cf2bc8ff097c2ea3576aa9201f64a9c8d6fc6afa838027ab984e6f92dfa9849b15d3baff908517b76341f32ac87985f7665690cb7e1a0b3c2721fd58c57be2f688f19b6ed0cbb1d0b3f36bce07d47f15a09741e32c31bf2b672dba3eea814cfbec95641e48d56b0a363c06f87b5b440fd429c0e9d27510d2f3d9e3ed035aa7be2f44cbc5adbbff692711cc0629c59444698a3cc445e9bf3aed4de17169a04a40622118ea10c55d8e0e7544149389171bd3fb75ccdbed2d217ec95ef1d8c77708b1f6b39feefa0d1349dd3e42b45f95d1d5df96fad813fef2d66d2b84481bd36270d613069f3c64e02a3e3011c4421c6a5ad2218924d966b16c1285f345ed4148bb8d40b16e6c9a2de793f89aaa27e864a102b8f2ccb5a750046d499163cd0aca049f25782e137c2a9c87cc4a11220a2344c4425c9f5ff476b749d2535cf6c482c77ff841fd81b2af74e88a14c859c0b1cb320dc0c67f29a8f7f3952dd3ede6ec99edee12a2dd1e9d0ffdfbc922b8784bf254aadb75a6c91f5b5ccdb32edee6b1ef2f003e135f1906fda8bcc5a5eb2a7ab6e403c6afa45709dca4b7b1fc9201a443386c3cd8b3ee4cfa7cb19916edad212ed06f667b68c5c7435c443f9875d534bf791b1b924bc26f01e805e60393dfe58bbefdeadd638458f8f9171f5562a6ac4356282581105ebdb3820d6f01feee14485801ad402a002b01df11e2a7ef97edbde25669c1753ca824da22e7893fb5e9156d10377a139d3d3155ea784533338a2749b3b5d601500cba97eee07cd06972a24b7935e59bd62708b1fb7dfb5dd44f7a22dd9edaf74f6de590dd6bcca1693dae1562ffbfe4b62a9478cb35ad77df7fb89d4f6bb6190db05ca530e574908ff76781cf30be2f8bf19915dfda4eb06e057b046d629a2de773aa4e53dc0fef0fa37d2b4c3e2d69955ca1e604d2ad238ccf089ea3892d62f019cba251783e14e654f24415fdba236b7aac5e2dc40be7dc7be413d270f17ef56eaf437d07d5799002a9c1e697b5f38123cd9a62c58dbb8323173053fed6507fbb9f7db7dbf2ec97aff06dca2c35c429c9404a53259e214b14dfc9fa3fd34c7f4dbab657862c2ced295aeb5f14fd4a4bfbf2fa873cbd984efc6736c56f5c9658627e0ba0e86213a0a217933393be3d3d9ce8170057f4820650e6c6b4475c9618975b17ed53b091ed5100fe938d83e6f14b6bb781f9c0a4bfe0da99f3a65e2ec4d286f9e52b919e54cbb20cc910aa56db98c6d640909efefb5320d4642e704c797e3a6af51deb3ef7ffbdf7f8c3e775f33751bb2ab5dda17ec8270c4f424f046a00264bb30d4c287c51ac0013dd384cd08360b9694dce3a9ce7bf0f0c7dd5e238e991fcd0fe929e1749d8b7e3b707a609913a33756c863f84c9420f2cb6f1c2246dd917824fc2d57d194a6126b0f00a0cfae1c0c054f793a7528cb45b72bd791aa85600cc62aab428d46cb8de3375ef96e0b94cf05982f6cc447b96804e26f82c019f0a8f6db2478575ea3dda1223cb0b78d0b233f99c4aa13933bd7445d577f3df909ec55713df39f1f34e8a73aaf3a00156f30d202990f1c05127528f901729104ae3f525e4b76f574ff57baee74b474d1979bbfced5ab14bab9ed1f62835f82b259ccba9ceae528aa61272a0e5ded24f836893cfa63de88d586cfe7ff2be034e8a62f9bf672f9025a380ca9d020f0e13064cf86ecf848ae23360fee9617a2afa147366c02c6605b31ea2a21c2604c4802c0a2819942808778020395fbe9b7fcff6b76a776a76d8232afefb7d1e65efcdd4f4f47477e52a1c50011254d0beca49b2ae0a7d125404ef9918bfcf3ddc67ccce433f27117ebdfe0dbe60f765cf7c308325d7ad12125ff5e7230ffd0c8c9fc69bb1cdf908fa7eb94c5873c5f83de39ddef8bbc73e3d5433e6f3963fb601ebbcbc25a09044d888fe9681248110646f44d922f287dd4540d058f200e1905e596e29d8666d3267ad3b5c1fc80736f8e6aaabe2287016473e93ee3de18112a832c9433f870f428adc2537d448b41fa43291feef32e29d38f26c31cea481435244463f9775a36661e7f838521a678e679c7ed5066da47cf469fe32f17c332e252487208e890f408cb3bb6f434680c7f49373baa6df9539bb7e98a75c739f509df954040104354bc4a9b884798c52e3c6e7bffa8626186b162c7b6e3d050e529c07241092344a8fc7efa4d26a6d6005d2f53301810a8b332de8959655d079e3156e40696b6b73e326f1848e37fc5d98475a8761338fc954b13e158ce9e7132324f0258d9816eb404a904ca899e3eee1c15fe8c59f34e2bd95c9fa54797f45f196a3f461f65dc9bf574dd487d8f95b2f58a219c9ada91b9fff4d4b7c459b373dbd48cf6fe5191543369cabe77a6de58325aeae3ed77ac5fd8ea14ea189355c47e92a75a575b54a24a1da78cf1edb331f715e6211dc4784c9c67d3db6673ee2bcc4bcf882c69b13c0586648fcdb96287f9830e4990fd3f51a5e5834abe41ef3a07214ee6249041917988020d0b90281d0aca26d8591dacadb0a447fb711103c8854587c6481907060a1fefb9211b316afb959a97ffdfbb8369df546b7daa62c38f0611517482874c6d55599f007659b87b131c402d848975f88fb6cf4cd824966832095c900783f7487e4e0e71472cd7d01075f06a78e209b407fbc5f0fbc9f775c4c0004472a5571745005ab0a3230ce3ce0317dc93111a1ca86dbed14b8ddfa360c1f505675c669e5e33b74e5f9a571e68871e6c48f3390a092cd0c81849b4e5fb376c6e74a7d73ebbb978c4092ca72a8a658f280c44184830849590b4018d92b8719c804041b8cddd3dd00d91b4f7ca3db3efab7f7ac051919caaf82f1dbf4e43a357d3ee8f940c930d789ef84d43cac8ab5b62d41c7addf5c8cdaf6e0cb912a988088691530de1fd538373ea9f8aacda316ea03695561c1bd63aa94faeec2813d5e68a0d4cf277e3e65a8dec9bf2c1933e26b3dcfb33efbe1b988be73ce27e3d7fcfcb35273c74d786ea296e0667d3076dd58bd4266fefa7dff516eca99bc6f2bbf98a9ffde64c2eccf349e0697343b75c3adfae8da2f2d9a4d2aed98f470e30bf478d65b75a3d9af99a14c12416e13c1e1ef24f75726e623bc5df3919324c096e62ba39ab697dc6d4b50554d2aa7b881c8911b06bf936fdc8d54b949f41f5bc714208bf5cf2a2c100eb2853001a1144b11c00215d076b304e233a60f042c04a4941c9a13699ed2face559394aab5a25e2337ae411f58a43289e0eabce8bffe140fd17e9c686bfad238988f0dbc1a1bce463c08734e92334b628320954936ab76c039f838051a578e679c5244ee24527bf042dfee9c46e8b32aab07ee8be0fd7230ce88679cc93826da304d49e514a03a1be84b71910bfc369e67fae09c351e43c883547c52a511e49f4f8176530c219f78c0f0975ed51b65f9bb0b1f5b897a2de5a49a2255158ce52597a04fc64682cb0dac34456b5595e0ccb0ac5548efa3b6bd8ffb2c53cf586845ea9693ae8c9b570b57d33d03b76dd3ab6e04b95ecdb9d17e57c697eb998f64127450c47b8ed99d3e094a8cb7f2c18ac65bbed4f3fbc0c289c3ce576af49fefd57be90ea5a65c3bf28dafbf56eaf7b9d3facc9aa5e7f6e32d955b47623e4917ffade893c457e6edb30a66812bb994bee81e7c0b9f9cd677eeb14afdfa4ee4b9eff5f798bbfea7559fd557aade7e8d26ba755eeaae6aa85a3dec563c4c39a55e370fa396703ee2be5318f33316f313c6fc8cadce7cb06a96e7910995b99ff6af94fc839c5b32d8092113fd30eecbc4f8a3fd4d87aeebffeb16a5a6bdfccdd21f0e8acd57fc7c32240282f5ceaa2b8a6f5a64a08f8004b6dd4d40c20670c5bd5c401bbf9ba956217d1414fc3e73e4b2f17a237e78dcdc937bb81e5ba19f5bb81bbcbb9114f4673264278737a459e8037d3a63d3cf50b4114c9f921ddb6634fa5f8fb1d5e715954c65d21d2a890170336e2a24079fee5970224c007c1c79d8e0a9a6734090f712a5f6608e97cf3be01792838d71048d930209d724519d091b848fa0c624895cdc9738a9257362c992e211e137f3b765fefab4394d951afed880eb3ea9672e6095153616491cc489b10da4b981ecf688acca958d0de48d6546eeb1e91dd8aac3b7558b95aaf951edf2fffbbfb8f1865925553d9b1ecf2347b217e23ad3275b495756c59a7e500eae205d7b4040a9ee1798be175fd5db15076d3e52a965dffc36fcf3e95ab298f0ee9103b464372ffcd393335fd273397eeb7745501e9623a92879b9b16a909c1630dfecac405e6f046581af050212613951ff7f4ee9545772fc7dfcf4450b75ffd737c6fedfb097b5a4f2bf669b975fa7094a9786d35bb9b9f73e4e5d52bfbef2d93294cce955fd9c6489e7374718dd837270f99d26bcf8fd4e0863813f1c8fef8fe7e7bffdad5edff3664fec3717de55c40095d27c8371622fc3d70cac80a4c25e58309ec7e77adb76dbdd040403600984fa03012959e05840dd6f7c7dcbf4dff402a91b6a78d6655f4739ca4894d0c4447d7377a1d8a031ddfe403ccbf4c998c939b070e0efacca6424249a6c1cd06b701006700a499304766523a699a5ea1bed22629ca6df1d0b6f249c0562a2b10dfcb9789e8d71e6e279369e978b7152dfa8009bb2e440787a88fb7a609c36c69998a0f68117117b272551f1c5c69981e7e5457fa7fe0fce6dce051ad4f938eb39bdae572d5ff2d15a24916495155454c481913b23111096401099ce223e558a8c0016284f7373926de8f867c51a3dd3ad061dbef4262df158f7584535baa81867db9d9d43e83d0d21118c449c243910d7997e80adc46f746709c4cc73908a33c89d54d8b4365eb9a6f5142d6b7ffdef37cf78aa963ea88ef8e98e5ff4015d3ebae4fb121006962828abb17087269d3b3b2790ca10991b28f29fbde128a383cc5146df074e106404a6cc10e557e843f0d9cacfdcbfffbe7cfa9085bf2b353bedc71786eb757140a3f6dfb939e46a3fbf4fd6a13747e73dc3cd6abdd339c9644609697497e78cdcbf7e9ba1c147b69798d13dc3831fe39df4c257a3df5fa6d7fbe38591b553314ff41d48454b8419fba0e45ecc1b083d491eaca2a53437052a49db5391e814d90b33334572bb91db6ea3486e37abed84a3f2374efd4abfec1d251d877ee389e49491ad3272d61b994cf5422872f61a53f17b97d5e26e6922da93d6e2ae66c4bb1e574bdcd7d433ee6435918322f37b7104bae127fa8b08f7ea47bc9b3e229fe3e6b7bb1867f7f871aa21de1af71401cfe3c4fb6aac8923e91d8e78cff6cc4b40c4fbaa37969e30e609a5664d19f79f455035957d602067d9ad0f78adb75f3ec30b2b071b58b5c140e74640c70bb9145013a5d63db77c909bf2a4626ee9800fdac67f7facd3e7f07ddbfb22c8134720d33cdee4c8086c83ef1ae0eb9db8c6bf9eff1d8a202ffa6063c96f9a00cf787ff4214f6b82f1c569cf5ffcbc9ebf4d5dd634580f89acf41c038bc108163d6de0d62d066e419afccd389036773170d326c01a8020001b7f42ff0b40d89c36e2ef9b7ef2fece90aeef25f00f8b3da7ecf39233dd710f1df674c4adc13eb1df975bafd4e3da6cafff6c74e7f875b5ed08722728a25e6694101910f4f9b0ed08f2dee25c9119001c276cfadecc0f5b8fddf4e4efe97abd6ff8717421050652660c043af3b94a9932a89c04dc7cb9d436f5b30021693bb35592b6bb25106a1103b8e21ec111806b705d1ff46f763db4d2de99fd88524dd20e987e855e20d62bd6e7e97ac21445a6f60307c691c9e0f038b2d54402732dee4b0d3dd57caf4985c8b5b8d99bc58c8a543e14f1ae0222de6f374911d56aae5b427efe05e89be7cb08e230c63150f4fb21f2be3bc67517f07642c46a2c92dc533b9e8de532e2fd24d4148f457a2bdc9781fba865e03a85eb32709dc275a68f4340cf5f187f3792c85ddedacd7191be729c32e2dd685e11772b23e9154792f3381346bc571554dce3aa4e46f47975f9b3fa08dce26c98b7f94b7349e9c10612a75c02955631245fca75553addc032a46dafc0015709c9a48a529d08f746ae24b9af81218ddfa9e5349df6ac7ecda733deb866a9fe5baef559541239dc7c5f3dfed518ffb62390791e5912c13ca27f9cf922d65052a18a752a3309248920affcb9fcd24d1d95ca5ff7c45df7e87db7326ff147cb911eb21c84b80c11fba5eb309f3f623e3f0144a1ae22d4d62f869341515df451e7a6e439c06b808ff09224422a97530141c859a5456ed894fd9a545a22f2ba02b6abf217d03f52a93f272cfa6ecd214afdf2cc98c563c24a1df65cce92933421497d38edd7a6ae8c4d11e4f062d4fb8d723b542f829cfb5c86629b11e4b1887781bf9023f60b300e05fcd1fb7f9ef5c5d32f6a867b79b7853dff840a8a5557349fa980ef63beb09e4bb02f2a487545297b28b50fad7322201115d0f61401a166036618e035d3aa98bbafde226b1e5df244f1c94ab5a8dfa6cb2afd42358beb6e3ac3a5a40538901947a0ad804450eae746fb1d38421b8184425530b67aaa03b6a1d838f0abeb66eb4fff6cfa490309ab19a0276c05d5284813c17d34ce8818a71dedb2ea05de66dbeb662b03be726143228297345ec1a72a88bae9fe725ce4ce0177ebb53e6edcb5f321519412a40d035515a952d86d17aa167673a4c2515718489c1a07564500330ca037a3025fae2d6fedd43f46bb3680d6a5471fdff876bdc51aa71edfe91e97699205a5aa1d319d2be623037d8fd7996f9d4a95a9df6d3b8aaff2818ad3dd0aa1933e1ef6f9139a43dfb06ee5cfeb9ef3ce07ab0071c03341862e9de695e13c5c0f5514ab08bff1e223a706b66d60de59374f91d29502e23a4ec541bfcb026eef88df2960ae0a5073e0ab9e5e72f6587dce64b63eec8113f57852de4ec9744b39fbe2a1aa1b419ed49b935494c96c7dc027ca4e14e56fdce4ba3d7ff9d280538676f0ce1fbba5932a906c7bc2bb909c4868fe4875c581b211c002017d6d4f131034e62a3d5ac138481b72ad528ba7cdf86ac179fa034fedf8c57e7a81a67e9a3ee1d07a71c8329863b6a3f792d191fa647ccf85ce9ddc6e27c37ba5ba6eb6d256605bd124e09a90dc84fbbc8184c974d0d2a84d6ebc4d038c77d50cd08b2bd87416f0d4c5b8c3b8cfc2f3c2783f2bc938cdc2ce12de662ad0389e23c69923c64904561ca8c9e215bc04f5cf768b078ed207d8c8b75eb787233715a9a44a5090ab14075909d93ea84f5e57d00d13c74a070f7ba5089515415ebfe00a99f18164e3164eab5559afc782854a357cbbc5e357bb6f3c5ddd977a9d8a8f7bc930ef19e81c61e6d5efc51789f6b3b9a0543fcc8fe907474c7bf03ba32b2f2f1ea9d4d482afee7c7a88528b7e9cfefd6252fd1161a5c0331c3825703228c6fcf27c1e97b8cf368fb82cd56eab808e9e22a12bc88d14849a0fb6ef13c34a4a6a2a74f7fcdda0aa61f75452ed900ae7cad87d9bfbad9ded8e6fd3b2353d22faa438b0ef2103c28bf5d9d3227471832312326a76b4e78f5bcac055f84e89d76db5c30e0ad9abcbac2e10aa5f668f7de31dfdde4b96ce99bf6c901918db3cc82961be8022c302650daf10f3cc95362380052a49db4336106e1103c8482337267106b4107881698ee4fb4ff3163fac5fb47c76e9b3df8f4e88db8ee28ad58e367daac59d0fdd6577aa89ee84a370476b71dbb095f86a713b36f043b76cde3ab0283e6645e3e91d3f2efdef1831ce31629c63e2c7453597b9c67b6feffbc7d510878d2171edf8b871f6f68c13f3c778148fb3b71867e2f98c8dd3f4b3a846b8a8711f3ccee82a595f77e59d939e52ea93ab9ef962d0523312aa0059d6c640f23e2925ce998cb5a4022115078c88cce9d201436f28bd5108a2b1ae98d631d6b5bb8e674efdeea11583f5613b65d3f98f1a55c21c310f63f09e61e0f27c6f7d1d7d8f30aef3ce2b7f0fc627d7a917bfe3c5fffb05d3bb0ed4046f61fe9435bf8333a7fd26032c892014df23fac580d0c1930a8bbddc4679f1b1e441aaa607bdcf6548bf7716bf770ef8fb775e4878cbc5f727899309dea8d8f87f9f30fdb83ff4fa99f5d4d883ee18aee7ab8b33cd4d79c335c855e275ecfb7ec135f9e97b1a7c1151e33ce0fbd1be58f79f95ff9a3449a91f27e40f9b0a1521a9a0f8bd1ff0ce17f7854447e72c9fc3b4deb3bdbf276f7f9104c2818644db491229f0f64303f07b5f3d099f96bde94ef5aa39051b22b65207fc9255e738bd10429b5216366feec14d58c2d17b93051206b903077ac770df70e403c876b29d6eb632e27d2cdc6e3b89d41e390192830a901c689c9475b79ade66dbe0784d9f395eaadc4ef32b6b65cb88f7c40159d50e248437cc96633714cdd1339d5ff8d4f8e76fd59be3c9d247493545eea27c206084acb2a2fa1e929040f4272f1e4ee5f02ee0558074841400da06703cd340efef21f42dcda02dde7fc6cc5f6729d576ff63d79f3d59ffb63af46713f70b0749ce314ed46009f236cc467f8a74271539b8622a98e8fad87cf9bafda7efa3cfafbeefe70c5985f7874a880ef6629224b0af48a2639515b93fd3bc929b2e54246493a8b8dc8b9f5548240148ef1f48404c90a18262828eefc18ca8b85e465257d1f70367cde518c85d15df9957aaadd4b225f3bf5f7ba852ad738eeceb9e4fb546d57df75823b1627e93781f2697282378a657a2cc10f811f15ef95179cb8d1b95fae2df2f76795a334e4543370dde0aab0c49d0d20d9dbf8f9024997063fdb32a8f54b479cadb222a49fb8b09888fb3cb330089b0a31b300aa1ec71376cc9335b9ea85ca839d10bffbcf05b4d699b9fd4a676c719fa5566a5aed9bf7382a7d0464520a13eb648076d12a7076dd06411ef64cccca2003645c74904ffd2016dde2e990d82fcbdf3456a8fed0dd02b64ddb9b131b0d15d2c7419a0e7cb6924547163b9846a4f8cdbaed638830a4b753504936d510139b836ffb06ec22fe729f5e9c2e7c63eab0fbea29f374ddfbad50c8ce2059853ee6ba02420acb222b7533ae0c84d57a83ef860a2b4ed71e9dbe31b138e5cf433bdbf87f48a707eae7ac435801e909675836bb4af51b3f6a2330f8c435280d51fb3b999752675e103799ddae89be4a04d45812abf4d2f7a7fe53b9553b76ace7a5c8d8f073e3345cfd19b9b8ab7bc82f90848f7cd9cfa5cfc0e022d397a72df65151508728548d247f556e4c12f09b3efe0a27e9ee8033a825030be3ceff3e877ba8e739ae1b9cc796bbc8bbf9ef9ed2f33f5f63ee9c4abc2ba9f529cd2b9996bde962aa96405a5628c9a8d7734fb69602023e8c137e3f8efef76eb0acdbbeae73e0bc1e0708439158822b774b23d918d4fe476e3004d4a5db2c8ffde1e98b4fd5504845a9e01c4c971a0a1e8d3c68c37be6ffd76c3603797cbf2b1f3cffc5a4fd4fe9ddb4f6b7d8d52a91bd31a1e7c6d8267e52bb8e5527a73dab88263080a20923688eeb0310c807f44925adc496d1063d9ebca2cb01d0dd00b33a112a933b633402f281dfe94ed0c240c26a8b9e63e11a782036fdd0b2bce1f3f5e7fb6664f757da991de1c2f6fb9bd085e7b4c38289e000759710f4088f864ece500411190c61c31447be67ce9c001a1f26da802bc19181b3a0a9880647aff1e5aa2d48a090b3bfeae39bd8c9cc31f3a42738c29dfa674ce3cc883d360cdc0bdc99c43b24158d690d34560c474ae0b96a6ce993ef871a516749a346d16fc838880b29b33248a22230bc76c1d225e866d1aa492a29c4a24c9615e1d92348860900461a3df9bdfdddb643fa8d9de2e7b2a45c4f3d058699c873e7de730eecfc5effaefe545a5eb5c09a6ded0c68fcf3956a926630e1873c9ab985ff70bf873c7d9e8e79a3ef63d4b94017161858919d6b2fb4ad7ace9a0d46739cfddf736dc99652a1e628828ae83bf13314ce4cd86efcbaa404884acc222d5556feffc246f7bda0612d078e061f4a54d041b9c757b7480e88363cbaaf5376cb953a9af7f7b7d7aafdb35c77aceda7b5e772732a22274bfa7d9b00df44ea6834e6283c857d103dab910bafc885797bf1dbafd6ce0e92eee0b639c5e5dabe3b395085d39fa725cd9c2b621c6a96cdf389d78fc2adfeb971ed3edd2fc117ed18fe9f4b33de3b439aec43ce714e747f7205fd2744eedfc2ca586bcf5e4b12ee7557e4969334a0ee79338b07198632689438aee14e8465e56a40b26880d54253931aaa419d078dde27ab68190aa04ebcf3da88b9b6fea553a48a91f6f1fdcf08695fab719654dc68fdb06eed8f717b60c87be07e28fbc362227ecb541551e51b160cb1d4a4ddffccdb01fe0564b121707ea617ed87b4710661949ce8443d828a48ebd4ada88b2bd9079701b3022672149b3bd909f13a0d377e8bbd0381ff28e9fe6a13c2ed9e60ffb7e74d84c2d01977f5cf2c44f676cd39611463f823eed2fd3e7f5bf6d1b5fd9d8b2e3dca49f5faf7e7bc163e4464dde700fc4c6e5b6d280b204acaa123611b2f1c9f991f358fdf6574b20d4228921ab08f2d00787c91c838dbe9efaaa0595ebdcfb167d31eda9a9f594aafb75a3bb7f395f73108d1b3f78821bd1bec0ea5c3bcbf3cc0ce08a624bc0317824099fe49005afaba190689a52ea942491a8413608728bed847a1bac3a4b5a235a7036901c46727c0aa9a0308b4272c809901ca4089e2bb2c006e5e00af62e19eb1927249e67033dd20000800049444154caa3ca87ba1b66f26923af7976ad3e60af1c72f658f7ca91ce264ebb4e1b8674bc50a530c188338646fb58d7e44dc48483bc73c8ff9d4478e2446df4893050cc49508b18c01274d8db9792734813bc92f95b4a5cafa0351f2cbbed3bcdb1ef5fdaaef258cdf18756a76c6af140c267640077d8e0c6aea0dc5f6bc87622243de4e05af3e2d2b1a3f4fcfcfef2d46f669c6750920a8f732441a2209bc756a8b64a496585dfd96b8d5454940e9ceaa5d07c1600d2c12de6b7da12c68eb608609e80384f1cf1770e27a0f3260c988bbfebdf0fb832eb3e37f757bd48c3b6dddcacce4111e46cd3622fce0cf38c00491dfd8aec8affb9b68ed175deebf2689a3ec78e99f1d41f88df609514f601bba5cff3f6e93b9542526155ad34a2c3fbca2779d86a3bdbdf4402e11636806a4f578d07840e95bd2f28bf3d71a4ad0d242f91a20c7d20fdfbcb5bc7eeab0fa403078f3e671f2d994c58bbe01d3d7155232b07accc8c7b26710c4111ef170644bcdba8617ebada662deeea46bc3b594e17f42982381bf76db366368f5346bcb7445c697f6f847a825af10923de7db5e8af412df9b037925e2f3a1a97e3196740647ee59d95735c4e7c79f8b7b69f6a517b48a727b27a757175bddf1d3313077cf1b3800840db8a0379abd1faaba263007301efc6f51420380d1001826ee548b75520c2bc92ea7b50e01445e2eee046a29aea24b1502df5aa8f00c1f9961f65a04b10d79eb5aceb86054a7df7e2db9b2fefa5d4fa352b8e7a70a6be765ce5a7cbae49f010b94e6d451910bceb08dfabe2f48a6c37427bdac0af5f183e09cf072165c9830e28cc13a9a64ae877ec2bf26ea3e492151f1a58f92f406494a00c13d2bb67bb258b5dddc20670a09c5166b3719e22b8697dd0f94292ab1b883772c1ab678eeaa67f3bbaacdfa433a3fb26610479dc3e8d3e554690d33950d9a5a2b4d82d0075f382673fff4ca9a1673f7ddb9d13955a78c2d4cf0bb19e4b4cc873ccdb4d7abd615f9420854929e277caaec3f8b1ee99612209846c4f36607fff9455affd5d2410d9e88550471ad60ba584570ccd83036f12f2f776b061aa36eb491eb4e93d97822fda326dee143df16b2e583a6aa4a6f08df25a6eae5d5ba9f409355f3bf860cd096cb55a44d34147d8a869227fef0a8878efa9aec1184d2470402dee6dd43236c917a9667896157d5b2dd1a076322250f31149df097c5b4fd4aceec311efa62f22deadb7e9efe0847aa296791f964c2ec2fb7922dee3bca32ec2fdc668fe86ba0ff72170922d5634ce0ce051b82eda776654f67625855537169eeda6f11e7dfec0d00b6f6882317bf449938bdce8d8e2a94593cd2da5f06ba70d41b078898145308e93bb28110cf63a815b6f296c60954702526a121ce894a2c141ca0d07a938f88db6b751ce029258f03e9cc0330c084e922bc7e8755a5e5a3ada4de9535038337f9e269c4bface6efa8996c49aefdbfa81ba75f4fa1c5cf3b5435c770fcdc9227bf56a3c0b91ca58477db8f67cf47b6dbc66f5e73ff4556a5eebf133c693919b2295895060be8a6f01a448f25c5cf7878144402ae840fad9c02a404a5144df5eda1afe360de9cef97cb1013300c1a038b6ffbeaa82aa37dcefdca6d9d1fb86f4795173459dae5d5c964f4690d3faef09c983ec323817b6feb461c9af8d94faeaeb37521ed18469ca355f7d39493fb7b8ffe69fb69888320e842d39d4c0adc420cdf542fa7e25fbe0bec30d2c0781af4837d0976d370c4836a2016a079bb5a337eea1661b40eebe246a5af0b60941824a79c4c0d454c0470d4c433d87f4d30dac09d1ad065255d4d222e9be3533af6dd64ca943ea865b5ea245c17aa58d979fad3772e8b494468d1ac586e24b72689b842c7a81a060933517630dc78f3ace3bc6abf2e923543e03d0ef095584ed353afb8cd0d20d508948f21ccad66ac6b51d11ca89555159f0fe998bf0b970e271563c593e73fd7abde7862ca9fc5e733c13bffde2beafee556add172b6edd0486a092b2b5922449ba5be2f8c8dd561c783e9dbc4c578d03af02aa1ae6bc84ad43eacaf980dfd9063cec9e1e31209403089543da1106a6c206920e5d37adcb1ac8fd54e309a5da1d7542d7767f2a95f951c70e376a0258ebd8ba634f7d34faac309543c0b3c3e6d9e6e985f7fc7ac7f35ab298d26944d308c6c1b643d88e8a88a3c5a147d97437dd81eb288219f3cbba7472772677580ca1fa69c0ff5e8dbd3ce93be1fba588f3c44da514ae77e9afffd292579b4b8e29ffa98bf265809049294b4ed9faeb6fcd959a3f67e2ad6e4dfe9fed2ffe37f37c838f032729ee4dda38608ba11c63ec05777c62c8650828be895457e40587f54e8cf6ceaffbbfab04422d02980748bae602c00cc031dedb7c015e8bbdd7b9c9efa2504b365b2b364c2bba58a9c54533c64ed3a2e4c24953d33fd194bfc63575be993f5f2f9aaf6b2d4e75bdbbaad2fa367373f9740bbdef12262b56f02a7aa0ca5adc49dd6c65c47bb6a8a827d377e724cbbaeaf54f8fab999d386d7d6c9c1918675e140645bc537a78789b390f54ce710f9c4d9bd67ce88af4f39f9db4e103cd517ddbeeed7fbf5da5d46f23274d706d50c5f3b78c22b75b3606524a05e45422d19b75b9e455026f124ea141de2564cc953a7910204a26c77106bb9b70502bf0e225ee9374ee1671a739e2f964d4cc0324ce30434bcc2b962e700b282d7c79f2f831eef8dba84b7fd0eb719f679a5c72e0937a5dfe9036bba5cb2815eaa767c6b0cea933aeebeb5a32db327cdda68d4836c8f34e11cba433271d3ba57ea182437410891421aca2c230399ec29613b297b488b7cb2c19be1f7d4797d014b69f7dc9a61795ea58e7f4f3720bf48fedd40375bac6f65fc9595bef9bac25d0df474c1bdc5f9f2f5ffcf6e2b9eef42c1b38ffee15a4faa3c03fcae54569efc93984e26bc0301161a78c00e49e5b2ee23b2a64ca161161ee0b8c2d48381bdbd1feee12886c1103e23f6814e2779248429048524e319038bd347cb0741c3c35e07e980e512f1d1c60da63dedfd3c66b1cb7a53f525373846daee8d4b1dd4aa59a6f6d5d7292e66c6bf5ae5bd1467368e967d6ce3d584b2e2993537aed333d36aa6a4b0e739062b22724073b201ea08f90246cafe42025891d4d0f5f59a762999b5caf7c63c9d9cbaf576a73cd75bfcc7b4d6fa06eb38e9a3849138c777e3e72d122b75a5fc585c499929fbf2f771179d151d237923c90f48db2e6b22421385ff23e61ef128a3778d00b2b4d3a4acef2bcc70847508b18c0ebf566035390543024d667eaa906b2e44ceb1212740d482ae990506a6e56aad5c8c31ecc385ac38687f4f9b726dcb5ebd5df98b55aa95187bcdae83170d0243190ff3f49763eef35106e8eb301072c250ff66e0c1b1058437b2f6b7c9ea0cf1a0e30daa9a719983e41a92b3eed3bb34f58cfc5a4cacb5c82baa4e79cab7fd0d78f3b20ff8e25b061d1f723092605f888a160db2e24058ec711927711050eca887eec2319cfe4abef21bc0b77ddf7dadb0808b5880124724a5581057745df02000746aaaef4cf0de40dfb98b7cff0746f5f6ef45470c6295a826970e2bee3ea7753aad1c21637367e45e33ca3d6e3759ed6b071cdc1aecd25f5fbf4776b3ea52f1e6ff572c76b7550b746399d4354dba859f432abab7551ec552963b16e207fea32ef64982bace1dc37ff759f32cba8b3155d8ed665e63e67ae7393bb80ca37960e71dd5dcb528abbbbbaefd2014583dc0364cdf5cb2e5ff789521b5baecad82a74da94fe9923834564af8f7090682e52d33001211d3b1112e2a888609ce8859cb2a2b3173fe73a42dd0e075e447f19e1902d6200a9b6422028ccf08090f03ac5fa4c23c687080741acbb1ab0f1a4c3af3f158c133150d4e8fbc814179cda0384830f2c541094f3cd1c2d4920d20d746f6fb601fc9d08d2f7014c032171558c513801f04903ebd4c175743ee07b90ea9d244e522d717c0649e8c438a14fce419260f07d54d783548b58f755c22964d713fabd9580508b182009090770914e9308c9615e980aa3136f5810102610c419c21b2c6dbcb89e16c8a780500d50adec9493bdcf67db4d8e183771a8648cede07bd33ddb8840d8807410531d1778b3c46735755ba5486227e377e401560e6f114ea34e816de5debe8c33e09c5522c29973fc8401ff6ac2211b9531803157ae4f863f1ac89209ad37b10e99a010a7fb88170fad2b960c313fe542d7cec91331efacc292849a525e8481f71f2279700b1bc03657fcecfb2ec4809e2e20be43ad5ab88e248f142f5e22bc559280906a8b54b4987fb271c81c60fc5dc8c64784ddf1becfeeb34da5ee6a847bb8850d70002deadb06b20a031bd5c142a882c4e0c0cba10a1fb8121f9c3e7c05e627053ac854b88fb24a8c080844fe14480129901a52f03b4b4404a9c200f02ae0b5268b7e8edaa38d0f5c8ccbc1387cb98928fd33057ade893ede9b0f7ae26045c05605d5c87e0f7d72b3edec85952778f155e17747a8529c30a074c70d277ccdbfaed1b84c121d5515419fd627cd33b95b82e1a0f5c9f34db5ac6104a7832705de3accb0a02f8da7155059955344f9d180142f83038c395a1c74be38193bc13beecd2d6200c789d0814f8498246e3a1fb01e2d48060ae7818244920a15217f0fc22308884c1e4b92067de732b87f57e2fb5491c41110b0b9fb0907b5bd5d02912d6c803701b38a25b9830eda221db4e0fc885320af2e3af049224911a26c2a9449a4db4cbd15fd1f12e36742421208cdff58316e15f01ebbba450ce085269a2f8218aa21592783d36dcbfa0d32bbb2c87e5b3113f0bfdeeb181f491a528516c469ed2d075bd800e9ad25555c969464c9b607c2429c700a189a1470c8b46e99e31591d8940edd2721922e9e0e2a996c0fe3fec7491eb2850d604984f62bbe0b7d8f14712e30630915177d0fb68111a3400484f60b7d0f620cc43e621522ed071167238de37bce1b6e6f9740648b18c0eb1b134c924915fcf45955441f000739492895d8a02910f52b2142a6c08d2e04513f85206d6c10a0907033e603812412aac468893ec511900d049ca1daa2764f23fc22e7933c881d3c9fbc6d48b75a0509c58db78942704a7cf0904a8b36c828f13b119883c47d64fcc30672285755588c8fc6bbb7e9e2230638610359720624826991bb2511568af8a66478a8049882f52955a5167e575049b16e1c2a2b2e814a121d491cf83bcfab7003dd6be679475bc4009644b07fc98b939d08305f0adfc3c139e040b2e3ef019b8682ad89093a9c45f87b200ea70ae70a13187c47a74a3c5fdaf8a497d56e6fff3402225bd800aaf5ab1090a668e32020870eee2a3ad049e70ee36e08128b850867f2e70f81530b216297bc6bacb3c47d504d8540182c04c4b1044204060190aa55d237db3ded2a2f245520135ad88eaa28e00a91d75517a08f886cb6912010902280abe0865d05c25c85646f74305204b783bfb304d45d8c8772544112dadbe20eb8450ce0f5490736a93a6c40bca745019158375520ec15f062e3f586804cb6a521a2994a94b21304d9b41aa28fefc811fa34aede025fbeb76fd1efddd5ded9f03e5c039c20924a2a042ad33aacc2fb32e389b80e0bb63c5215f2bc50013cda0fcf7a9f47dfc181130947f45366030a80a5d2ca14584deb251cfc6abbb7fdd3090835923810c8c6120a1d40c268cc111644f1b1404254a43e823eb295b24a0cbae310227759f4c586b6f6f1f65975015b8005dd342db4bfac8150d2c1c32a2c44ca3acb00893382379583dad3cc61e1c0639d3e7170c4e92215066f20da50b6f7b9ccf1ae12e39c539d97d90b1abd876d00af4ffa0f312f746054e180b3d60082f072f4f379e2394845e280602892ec40c09930930414c1dfc1f8d07ae7030b0c183340bb5be5ba9b9a430cdd50f13b1110aa4bd453dc88f7ad0aa3ff27fab061f077682beea3752f55502471df0848eb9fbe3fe2d75456c2d7f80bda3fcd06b2b32d62007f781b7dd2855adebf87a81f4a7c1dd93aa48d435ec73a57e2ec68c1ee6123ba6cbe5c4680b2029f34daf1df49f5618bdf855717a5a2f1d95c8274bb76c038edc057f967b48801bc2e88e3c7c1266d68bcaee43a0a27c61bf8f7b0c06f0bbcd4efa312b748c038f65093ebd4f777a9b2a5835dda12e8ba1cef7581f31b09788e7cbe7c0e8d23c9b8fffaf6ff8b0492acd906c885604963b72d206d1821babb3aed86afeeb74fe854a58e79ec8cad75ce56aac9432d3bee73ae52b50bebdd55e75a4d5c5aa62c8e1ad95e77d2d4f59a6b79d3f9dc72259d03f4fd86e3eb15e55c56eb63d88ec30d4700759b35573c759ea77bba7a31faeb8b94e1c7fcdd5ac8d79bfbc9b1e0e618e668ffead0b7ee73ad5be80a15e59cac2f4365d1837d95bacf95204a5a16854ade556a43fecabe9bef506af2daaf9f7253962cf978eebc0a18731dd8867c2534c92b8e6c1e82c028499068e30a6f1696182defef7bad6a2ba8850d600905ebce92bf538b00ca830bd7cb1441ded05215637c88513a3576dff1cf743ba2865e59077538eccb7afb2a556765fdd13517b96aafaab91e4276b1732dd5d97055b34e4b6768743ddfa6c0675bd138796b8142bcbc65e4dc5e588737a1aff8efbfc5bf8a55687e2fdfafec4cd7bd7bc584df5fdbfca552e353beb8329a2961e1daf57c109fe69d176654e81c0474e065c5eb16467207c673ae8d4ff3d4c7fb3bafdf20afa8b04ad898c0fce5aaa9eab6ff5f2510da7824b286016dfc2e378e15fbfd3ceb9661753541c8fad709bf759dacd75c4afab747eb051bea9ff2d8e1b7ea6bda85de6ef387eebf199ad8c20d5cb454dfa85153e696c253e372e750295b332a99bb4a449cc7e1c3a8ab9d0bcb06be1ce08b005f0ef045043e1bbd20fed2db7e503fb85e3d55af55951716ba2e8f95df2db84ca9d29e45ddbed71bf9f73b674e1b79b75279231ece5f4a2a32d2bd1361116ea7acfaa2be9080b84fa27d77efdffffe1b71275b18d03680d76f90244d90eed7fd6b073e795c132d11b6fcad4df7cbf4ba0df54abdaffd0d1a8e0f75683b58c39b42b96d96b96a1c6b79e368a4bf35c60d70d4abc53c2556d1b20f9e6146c5b9d7c4bab2d1ef233224d8de0a7efa5f83bf8fafefc527332e387a5968c6c4395b9db3e5680d5fad4a29cc74d54b1583172c50aae2ea8aeb16bca9d4cae282db3fdfa8d41ba3ee9ee7964c2e1eb7e54d760f172a26b91e7deb8f246e257ecff6e2f349d461b597b6ffdf0808057291712b82be543de925fadf55cfddbaef6b4a35bd63ff79975ca209c592d48fcf9be94a25a1f1c70c77f977ab221a21dc412e6c2f7f973449219a950fdfb08b387715369e0f9f02be08f07937640ef7e7603c1d802f022c1e3e3330d58a4c918292b51a5ff5084950d31bdbe5b02a4696771fa30ffa0d9fad9efdde337a037f78d7a4e123945a73c31fe754483752f2d6a20d4c8183bd459f8cbfa4331692c83f4e32b10d88cbf86afac4f044445fc3bbde7cf78dc30ed392f0c6fa4f5caa097b4af394a74fd39cb9f57ba8c6a1435d75acd5075e5c8610f8bf7bd8e016a97682d6ab95842149ca580510a25dc5f0a039eb9c27d7eaf7aff8b1ecc2715a02d9dc6ebdfd4547a53ebff895ab467dadd4ac93c73d568cf828197f210b8871802b412240d2fddc06c41bec7debf39f4e40c206f0d224c98308c9c54ad56dd3e04bd76ffee606afdc75c64f4aa57d5ef38a1b87e88d7549e8a6d3ddc8f453acb1513f7b5ae8b69018628423d9c11fc67d3646b3472486c05c5882d3f3718e010470473768b2567955e569f335c15e75d992268fe979eff7758f15a3e00ee9cbf143fef244382820eb65031d383b54495d7618fdbd5d32891840465d5ecf7184e2922beefdb46e5da55abf78e491572f8d265d2cca6da599a3f3436f1cea26b16482c0c93e693d58e887d10f627c4cdf7fd01b7cb1c264169ee2c1c77d99955ae480f311b01dcd26bd83cdc972c66efa424bd02d8b370fbb5da9826b66a5bf71b9667826ddfdf81ca485e7754801b314f84a714b24d190242d55b6c2b6e7b3e94576e60d7667fba712908801be1427cd946a92d3b224454b14d77ef2d4c8f3ffa509c62b356add73affe5be75051c78edba12aa2e4871d5073dcc6c1df67070ffe7c98d02fe23a1c11735da0c460035fe2833f1f7fbf88379e8dbf6e2f2769eecb0781bc08efb98b3668502bbfacece1896728b5f8fa5f8f7f3455a9d786ddf1d464533d3d963c6eb4e8534022a9c468a312874884c3c6efb451c3bb7efcbbb4850d905e4e1679611da2d4559ff57dbc4103a50e98d86ed04d599a607c98fae9ad6ee5bcabad798d676d839190ebcbf2fa545583f1d9397cbc7eab8dbfba8484f027dc6f3bdc5cd5983ef8cb524be67eadcf8d82b1b39bbd709e5e9f9fde71e1346495e688fe208687080af5a5ad4f12149f71ebefd252feea01eca21636804b8912cc34d05549ddf29ffedf645eadd48925e71dffec417a832d4febf7886b2cfbb7b5a079f3b8859821544516a735370b310f7fa1c24d362c297d50f64a9686f5951a1584240fcfedaaea98ebf0774b6c1c2a8599419c19927767066ca0ae286d4b7d4b96c6c5719421383fcc597464f1e3eecaf8bbe33d88c02acfbc64c630ec4c4bf9352567ff2b946a5cd062f9a5f3943a36e5ac4eee86fab1eba7fb4cd31cb433c35948df990237991050c1201a4944f40bc4ef79e2f7825df106bba0d906706967eaebf768f8e4bea342b728d5ebcbb786e4dea954a3b1cd6b7d76ae9e8bd2948e679fad5c9373ddda37c57d97d8411cc5a2bf5e0f6033fd08fa19fcdd33cc7d62fd5329d70c71d05b027f21f0c54a387bf031639519b0bf72846a3693f1e761fc1918ffb6c71b542f6747d7a9e56ae5f4fa74529bb63e4dafcf035ad4bee24da5b29b77ef79f0294a8d9ef9e19bdf2070308400d910dcf42939236708a09185f1bb0d18f1fe9dbf3faefbdbaccfbd9e80840d084c09a1e11d33dfbdafb3e654eb5cdfe0eee1ada21b605ce793a20bc9f0b3969018620b3d8267781762064b20c6d9f622e6e423c0e73df8f37c12430f8cd13c9708d61cfcbd13fe4ea27b266d742131f410124321e333ef910fefabaee63d59b2caf4a9206ce0cbf08cbb5010c07cd411e96af5c3dd1909e7656737a86c6e253e8db9e69175da9cd852a9cef75e30a8ed754a2dfa78e6033f0c526ac386d55f539d0acae1c592751e600ee3327fcef3f6a5fbe45f5e492f62001f1c790684f44a68f7c1b193dc142657edd337edf5e7dc3203a9a7f72ed07f6c667d56c7b576c56ae0dbd19b32a85e4c1023216aec5b98bd0ca1eacc14eb97189f1c5ccf12297f77c2efc5470c490fb91f02c6dbc3871ffd80751a63d4c47859f58afd45e3e78af63bd6ac284e95ba5f7a797b2df9e5fcef92ff1e778f52f54e6e3479da614acd1b3671e566646ab010c82cbd3bb9767e2efa79e8033221e983df6dc0c84e8d7c17b4d05f3d801d6c949204594de9bc706d19b73df2c6191d224add97f9e1d0f73fd007cf05b53ff9de55750c745e77bda29c5ecad41e478deeb85ae261f33b6a18a3c6b4fe48a6e6346a8aab21a8817c3a6aa2f752de5ae8ed4d9f6b8ca346b5ea8d38d608d730bf49e0cbc275a8796daee71ae543ccf50ed76a1735d01df47be33dbaa3e42ee313b5cb8770adf230f0f5f68cdbc17b50adedee2a2b1ebf9e97dede7911f340b5d667735cef2e69b5dfadfbfad95395ea79cc8ba3bfd51cf74dfd5f38edac2bf137e41eaa81ca93e95f1898b6dec054144c0a217b72086e99e4c0cca49502fbf6df9523df46cbf23e979d3a9a29d5e681a36e4bd59cedddbf0ebaf1c2214a5d70e8ed874cd5479e7556e8f91e4be2d703d5e446dfc1fa89d5d837eb275663ff265c87f5c9b5ec69bd9aef68cb9adf8caf3fae33d747047ec2d75eaca3a0f112fe64e395fb4baed370d078057e1bfbaf373b39ef92759a3ebf66a9cbb076ce38effed18d94ead3e1d3d7fbeaef9873f1251f1c8075596ba28135871958a38b81692d0d4c81a332650de7dc667806c78bd13afdcb020bf73209842936118eba0686f446baabf3c0963d0af4c7685efbae2f57eabfadb5aa5c6f1375b6becd3d286e47edf02755cde84d61d82ea68063a2f4003670f7e1eac6d1bfe88f66fa5df1f96e578703df6ce03335c5fb015327d442b7717d0c5f07e0335503baa27f3bfa7d703dd556ef072f2aa8b814d56a1fc9e30e47fb11f4495ee9ae4c65e5662cf866e2b961e0234e54011fbd6d27e06b0a7c9d80af03f0d14c29efbc900a0ff78fc47bc4f0992765ee24c787163a2074627d2d8934fa7ebfaa73de53aac1a9cd668fd75f76f6e4f1456bb04e426464a6f5b22f6e46640c4b1a1429938b3ebd214936f9bb62c4095a18cf856d87eac0b892c6058d6fcfa8a3bfd0491f759f32448f2ff58dd49ef7df161d5b8b669ae0591fd17a404dee91b09da146b75ec7a8814f5e785091d27aea84fb6df45932c177cba4f5eaabf94df88a701df934d6c175a6df83d79b771d058cd742cd7e9564bc8c8ff717fa7d766cbc711611acd35d23415b2badba692ddc9a2db59a1c75a6526df38f742e7d4da903b6b6fdcf2f8d959aee7c3ff44f387db0aa8b522b916deb1903391b32358a8807c9f3852314ecccc8b7a7ed25048408076f383a2034a776d71b03e7dfad45c69473d256bfb0c188e42197f796222de9fc5192551f70fd8035c35c87855318647b80086c4304865fbaa6fe51c1d29ae253e598bff7205d3089f401b6873e166aabab6812ee043699305e7eac075f4c34cff08c7b2497ae9d82f708c7bf07eb8c7d3699009df94861dc97aa03a9ea504215219d120a770d2189aab8f4939a3cdb6245a69eb9d1151fce1b0e0e8f0f875cc0020302dd7bdf15b8a9985707effd3bddc20648d5ab9bb9e0aafe8f0c6c74817eadfa873c3a7cb3be666668f529efab7895615ef4e22c43f6f4d73d241e2b3312f4bda5b139f6fd73cd75acea01fe242a2e52a15a02bf5c5f36f0fb55509909c72b55b201ebdfa95fd5c4ad1d5ef665c95b6b3421dd7adba6d396680e7d53ceda110bde50aa746151e3959a23af9c59317bcb1dfafa6b9c196e6126eb736b7ff7bcb06aa70c4cff207a86e446d747d88c6fb7a9b8d0ace3ad9a35ced0f4f2f203569ca319df36fd8f7c60712ba5263f3beaad82025c43e75c8617fab265cb759a8bfb07a21f062cd8f9716fbb59bbfb013bd96c037c711a2ee1683af0bc871f76a58fd4c60f3d1ce5b448b318c1bfa69fc307bf39e8fbf8bc3f22789ab91eb6072b99df3b0e7e2b76f00fc558c39e5163215a7d026c0ffeb88d2077601bff9a71260ba4ea6e3849cd9d780f7ee115e6ccaabaccdd90eb87fe79c8cc864aadbdffcfe68bae526acda0a5c3ff68add4ea17ffe8b57a8de6a41eaaf9a4ab02aa734b83a1b58f566affd7db4e3ee86a7d70dfd8b2fdbf062bb54fc3c60ddbb5d3dfa379ca996ec9d5a4de31dde1b63c5446d4ef5c5b76c182579fd1b2e673adaefbf89dc5e637aeb8478593088a8a87be825522f7d04e7bc3000fbf71c4009770fcdfd17d521bbea454cb21ad7f1ddd595ff366e8f9c30e57c1713a63b15ec25c02d936d761ddc6d6b19721925e81e85b7d183fed8b6daed7eac61559b140432f0321f1c7dc7573dcacb745ef6f6a5ea80fc4e55f2e7a69b2e6c47f7de98733a6d6536aca41dfdc5290a7bfc5ad55abd84d5606f8496fa6480c663cd861647d2d9b1fd7bbdb7f0e5fa754bb538efefc0c2db9d679b941fdb6cbf5b778c03a3e5a386a17bb03fbda58d5d775fb5d7cc3ac7e776e51eae5336f3eea8b4de64fa5a2a433ad5b99769f0b49492fae3de65df87725206103a4ea216a146ff2ced737acd422fd41e9435efe4599051de524e48296073f1f5c66830c95077000a71cecf76e8e83ee4680d4ff7a321225c087bf061efc7410903b305ae28da982dc13e5b8c5bc946e28deb24673d4f3ea4c0c0dd784e0fbe683bff9596fa0d5d72f7d6333158612f53d387d3b6a8d5396504a6fedb6167d5bd7ab7b8e52e7bcf2df3f4f3f5da956cb3bac38ab9652e9e7d6287439eaa407e02edaa0ce994e5d371071d8b503be385faf8fb1e3f31f5908555409d2c9134129439c0913124adf4f8404f1249c057567736e897202ae31f5dc26b74c724b1db71b74ecac51c7baf310fae9c48a040c90747725c9776e124662bbddc1b7bdbeaa1b572423c683189f8ac165cf6dbc4da985d7ce58f055b152931e1ff1cdc4a795fa6df5d4f6ab90ec4406e8518132ae8f416eda14f7438444e654132d9e31dd2f2da37bdd7e4a759df7df534f0e6909e19e8ebf5ca8bf7bdaf1351a377a396e3e6cf1fe3bd99cb39c7a6e05ced923279c7ce3c74abd73fb031b23f81b5522a4daf55cd256961afecb08c9df558595678075b58121bdb16ebbf9cd87ceeba53fe8313526bcfd968abaf5b97f67cec812aaa23c293140273b4091c410d589c689dede833f99aa882410c6b773aa22bd308d57978c1cdf5e5591e58d1c77d63ac32af5425bb4f59716233447fd66e3bbafed7fb752d3fb8c3ee237bd708bbedc34b518151a99c381f1984bcca25f8eaaec1528454b2537ddeb378f5957563c52a9a95bbf7d7c96e6a826ffe7ebefbed2a4b0ed9d47ffeaa67ea997d6e08ab6e3310f99712a8e4ce1d5b593eec0d642abcc5561367ffee04f9b0cd704e48921bf4532ccdf9c568057011600ca248f74e05056541c48568f1d1991f2d999dcecb919a587eeefd68fc97eb1fb231fd5d0bffdc76a71da872ace6b891816cc03ab8cb08e07324364bebf543d92043250ee0be0cf11f8c672df327d1fe1b0d1033ee10e2cc7db83fbe6793d0cbeaaa72af34a4a94fafd8c19ab877da1d4bbff7d70547f2d234fbef8ab4db3f58e5c5bb4a2ffe697cc83b9c4eb5b80587f65afa30fa373199548461d8d72147a2ba3f5faa0171fc337013521da52b5614e895eafd35f1a3d7cde7e9a905df8d58523f4789a576436700309eb7769bae4e0befa2cda907242ad1be3e62373e70889b5c02a73d741d34ff77ff5d4a57a9fdcd430ebe71b949afbddcf43d7ac35d7500550525d39229e890904fd9e011801cc15fd5dd6fe6e1248c400aee075b35237747b3ebfcd377a6237363a61d299fac7bbadd16e52c26d04fc4989c136d7414240dc86255545317c36ee4ec68199fbbb5b9068a80c545289c106be3eb8cef31ebe1c41313ffd3e786ed833ee0055515593aacfcaba2935eadc7787f4bb47a909977d3e7c3e361e979a254e9b2ad1d1ef540f850a3f550a48e9d9856e96393a8c9c0b6dfda8d48513ee687d8216cd8f59dae53f7777d2bf2d4d9d58bb9f0a5425ee74c4fb18157109c1f7bd06e75ead8fb8e127bf9e311df51a88a32b46019f12a4d12f433d06aa155e81b4e795548f4170b6d59644220690249d728896a47f7a77c8bd5a024a599f7afc238f6c53d20d9b5f452068966138b4bc9a4cf235f8aa8d9fefc377f1ae2f9f4a96f0fb23c84dbf8feeeb795bfee7c21a63341c76efab5b3f5daffb072e6cbcfe7083992bf15124b7286d2cd723d50ce7f54b017bb2467eb28c0311037c9549e3d66d14ea03bec109cd9ad49ea8d4d5573e3ae1cac54ab5dcd26659f7598a3520bb4a82aea85f3ee68f3fb424b2f48153bacf566a9e3de9df2b5698bf95922a966aa6a3e473b9a8f4292b17d2fbeffa54297f17021236800f20fdff13979edf387d9852c7adec963e417314d69fd6931d37051f983e559114356163d0c73d490c73e39f99f4e0f7e3b381af0ff04580af7a07bf24803652a3f44132c5edddf842b73de3a631cdf2ee52ea93c6cfdd3b1aaa18b92159c280ae953938ba4e88ca95e00cf94015aa81f8f89b28c406e492c07a639ef5cd75271fae0f9070db8b173ea32593d0d050abf474153bb0923306dbd5b65ebfe9a969cf2af550dd6e5fdd081b4411fc758aef01446d71d2359752adf0190656a07ec3769776b50de075ad19a2ff1df97a8dec0b94aa19aab5e05b577576b26523550e1152dcc5eb2c12fd5dda32068070f4c43af6ad273ee83df892aab8c2162490c07d66630e128e57e29f7ac2b757bff186261ca7f55f376e9cb9900e7c5e8fb40e2149706df072efdfe977b20d708964590a99321088e49c7c70d29b813521776e82b2c22895aaa512c22ebca2cb83a373f4fd879f9c73c15dc7e87b4f0dadaf556bd71192ad6f6dec3646afaf87e69cbbe946d42d625b1e6c24bc4e69de683ea87225a9fe0252faec7cfb9ba8b0d8cfc136c03d80ce2feca52ef9440ff1fd94e76f724bae5ae200cef32de88ce8ef41816d8510e46c480c0385aa282f89c420039cc83bc5a72a403f2f89c4205566851489ee8bf40e1b7c811c690ef045c7bdbed39fb9bf36d21ccca2fb8ffad02deeff917ab13cddcc2b198bcbc169978283296d6e600912c2970212675e8af8891294462dbd1678a02220dd6c192a0c92caabe20a402ac1aa39a30583a62d5ef9b352878ee8bcb4566da5eaded1b0ede1876f635ee43c14729855a6aa464b9f5aa37373fd9e15b795678ed7846cf107bf46d6a1146c15545a6484ad5a642097ee251b086ac13b19401a01b4459f9a19b92710f09c277afe5a477fd97d7bb71a35da55c9acb316357851c5af337a2fb96e131ff4d99040a6601dcb08f2c21d8c201f8bb7f207d6e6e19dcdfd03b71d41be6ac592d1131e53eafd5bfb8efd0405ca985090ea098480243eb249955c6a2011f492fd005f33b018925ce9ebdeeb48b55586380a7696c0f398415ae01d47051dc02875c00c962050f112f82fbffff0de6237a5c980e2d77f7a422fc68f0f7dc7cdca9d7246ea0d510dc94e7a19a61f59f3d24c4dca67341d73d5fb7add6efd65e3c072a8dc58d5da4af4096600c2898409461e60c1ce8c2cbefdd504c436c08224c4a947b42879e2fee79dfb8a1bc179acbafe40d7b81b5be019d18b3244aa0d69632814077f3efce357b3ea2a027c7400dbc0670881d4394b5b493e0efad56a35aeeb0e7c99786ed8e0f3b93ddac0e77d8f58a4f714e033f7c7085806f0e5019fe760a9a85976ece62395fae0fc479feba739fb4d83d7debc152572cb5a0362a3968280d0c62cc5c62cc1062e25633371e42030c4f1947d0e482234085305e99c4972a11c5504e3921f6e18b47aeba29a9a839b179e79be6b343e3e5437bdad4ae40e6ae62933e080ada6ada466699d92f5d395faf9cbe1c3676ec43840302a1188286bb257de803e15bea20d2b39b93cf130f4793deb1575d629d72fb84413e6d0b89443aecc56c111d362ddb2243110fa8230f74d1c43f700062876d0db1815182069cba075c6712079e87b18131e6fe1b619acdf3bcd48fd5c33046f1f73ffddefbb9cfbbbaa8a0f6c405a37ec6d4484830806312eb42e014bc1c0903344d97c014108ca6003619b1d313242455bf196f89d246d6133a93c0050a8ca5cdb44e1cb733e5fffa9668cde9fb6efb7fabee346749d77c5026518da4cb5d336bdd677776ce1aa84c7f7fbfc9529887be375482a557272c13a261b1fdb4cc2e2f70cc0c88e8c28befd5591e8941597bc5222068634cf7ecb3bafaebee61cdd39441d7ae227d1c931db35e2845de0b447e4e810f4c3c647c6b91011d14191b8dd9d6b70dd71c087c8718af4c6f5b148effe5e7c88aced8dc86fc493687ca79bebccf5848fc6ed0445bc3b1cf11e06be2ef1f835368a1c0f035f6fe0a37930be4139ceab6e65bfc8531f7dfaca10a59655fd36721d365cd9930612612846a9dc22d468dfbad5c0cd58685bde411f46bb2dc3011168b7159ce1d677bdf713a1da32d97bfd162cf42d5bfdf8e776fdf9a56573f4c61b3cf5babeb7e81f5f71aadcc0285f44bdcd11efd17e60c4fb52fdbf6db4fdfe9571f0197a83d568576b582dc477d4a801888324fd7103d31e3530a591811c094c56ae382faa68a38262367e27abc4214a9ddae4caffd63c4ae3b825f58ffb3b2ace701018312dd6adb20322b29109212ee3c185b8cfec83ee02ff106f4436e3ef2ff1f3bef0e08bed0bef3eab6a52f953e5794acd6c1ab9e25dfd5ddfefdab7db276ea4ff494e791924d3122419245521af3fac9bcd38f868dd31440a90cd20f4bc4eefc2fd19c057e4c55bdc03f019ef7319c206567437200ee6a25c2fdead5827bc9eef0c1eef9203e70efb73b452f35e987865ef889ea78bab3e2b3d28b65f7734e27ddf9456196eaeb32bda3f38258cdf6ae3b9357f3790322ea483b14b23953145b2938d87322e5060ec4ed7b0ffab24102ad94a91e4fa052f19727faba65b94aadfbfe9db23dc83a797ba3bfd9aa8aed71b28950f01ac2b07ce450f6e6b2422519b627a6c4496f6c176ce52e746fb03ac6bcc7588d4a52cb85d832265a122202fae3ee03bb3a0721a600e7e7dd56a8ccf5c5f2802b2a67823c735be02e0cb00be289f630dc5676d2a22c70bf1dea4aa9b622270d71cf3c7d953f2941a3af4d99787c36ba87c8281a53f195832c8c06214f72fc6bc17a3c6753172f41443075cbacc40524995d507bcc340e6d848558583b61235b82b7f01444d743676fe6c60552dc0364a4d2b1cfde6224d584e9a77fe39c7acd28b7f6cfa99fbbb78fb307f5f807930f31414f17e9c8a92376b0d6f0f0fc797b23c35a59eded035fad61ee79efff35e9af8c3f20f310e4818aca280a4547996b7cf7121385898a32386080717b99f87862a754ef39e993df503439d530a2e7b38ba5e282ec7acb37e14318d754a190d060644785304f9ed58c773185f7fdc47fbc01b91ddd51b91cdf89bfaf09bbfe71b7c7add25de174d745f73c0d30b472f786ba652c3faf69f301611d5a412225512312ec590208a0ff1fe5e04425c82f92b012b504292c5fb80b42ec90b0b35ded9f9e348032bc138f13a942a28591e0011e19535c5fd483d52b9c97b3d49a695641b834dd075739fb6e9bb977ed7077cd32d07b499afc7bb5f8dccbbbbb859a2af52ff87837cbb22dead19d6b2d0251a5fc3fd5b1ca925e79fbf1f71f5679ad1297bbcf8d5ca2fcd35ce99804f611c2499d40624f7deb3bcd0ba7b5b4fae4edbd304c43680371a168e1bca9fd3e3f2c9f71c1755651c78ca23d183c190194add413add0c615c1ce8335a1bec8542053505a276368c7f6b025505f4414d9f5450854205350509304817bd06c748863062c6540819c097077c5eddf6148e1cef67ded7abe28a534944802fda9fdce2ab8f3fd01c73c1c8598bc95b83dc134bf17dc958cc711001360ef23b972a804a703a643cafc2c265ff7bf27e81ce9503bbe877481eec3e4b07af79b368ca86c337872fafa3dfbc5eed866961330f799887c4aa14a9fa198803b829ab6acc3cc90dda4ebdb55a4b6a135f1ab1744643f17e7440e0e0280701a434f1bef78384c549ee32d01fa8d4c92bfe2fada626e8cd171c74f4604dd0adc5eae87a87a96da83aa5bbae2fc27b2cae33fd42a4e6b0814faab8f2808fddd871ff40815fd812797d06a9b8b02ffef8e8b795df2ed082cd374fbf341c3c35db384855059569111815b661d07aa4f507e330a9b0c81b8e6d16a42225a3bb5425617d914a92fa52e5e88364337857dc87dfd918bfd8db27b75a5621d1df81d73dd77eadfcf197657a5f1e9a7ed2bdeedfebdedaf0944ecd12a8d6e97b2649f1136a98b2c1adefd2b269ebc6abb5a435a5ff372fcdc7bef515b27a578c5fb8fffa9c3f720123db1a41c2516def0d3bd9c280b601aeede3d497af3aa3f624371a37e5b29b5ca138623e2f275b8b18ef662dda9bbbc7c0dbd9367d279b974314ab1619b3715dc4dccff8cc53f3595560fa6370bd6dae8fe1431f2a288daf37f099e75e88b0b07c88fa0e9e3706d793ea25dba1b71e037cdef788e1ebeee93bf8fb185c6fe37ee0734ead3add354a4fedf1ed01bf81d3abc482218e8c3620e998894094d2c6a5dfb171c9b8eef3d612de32e4e5213939f93b491ed2ab860e84b236b1f1fcba6cdccddf552498976cef3cd0f7d5f360e33aeff795f3dcdbeb6c5cefcc065f1e88832295bcc4c8bb06de3629a700c2d84e2a00cea23a36004600f5baee70c8095d2f7725b886aaa2c5e5d1f119956304ebcae175dadbfb5ebcce8cea13aa4e5a574e2cd9a7c127d76d84d7ad07bfde2f89f187197f18f7d9e87bf1017fc594b2269b6f57ead3675ff8231f9204af0f923c28821a360e22144c384812811b7531181bf682fbda8b870908d924681d3ee4855501859c92c14a799face3216c22bcafc896739f78dfb880d5813d7b5ff4ae66982a9cf26e2baef79f3b4ed877ee6cb3658ce890eea68fb736841ea8010d433a9c64d2a07948850a96d633953be0e4a116908505dceeb6a70848d8005f1a63bdf1da743ceafa735c9bc7bdce870dce8beafa23d13fe6fb0e608f0d20688113e1f06dc87cb66d40c5e1fd8071f8e8b944383c07121f6844382ef4967d71c2b81e3afc0404d06bcba071e78300127e98be9cb0d7564207e6d6a337375db244a9cd75d6e6916e970f6e3ab0c9ed91bca428ce81bcb1be155046b88a8d042d79cc2d50787f70c4bae0882a094a82029597bb2147b77d7fd992abf53d7f547de21e5071071de6218031c8e6f502428e79a20d2a0ed89a7dea3ed3021216b969b2dbe629dedf69e35962e3791dab63d00ac5ae0bdd9c72e19557c6addf7cb34e785df9d6b3785fff3af0ae2b1bf87a07ae5bef3aeb2df03b9230739ff685171ff0ff366cdac5c38e526ae3b9ab3f2a426024ad17f6c6c3fa222f3f22204438a43b2a7b61915306b9ef0232c1a0f588a3d657bb5c014a092309a4efc7c668405eb7a2e2a06f9f4982124710d7fcf78f8e9bf47a5e7ad2dcfb5f7831363a870877f0f7c3f7f7b6f4949a8bf6d71272b78b6efcace306fc06c291960638de406688683d932d4f9ec339de79a87edbc30484250f827ae02975d39a5deeaa4ae860204e2996fedccb710651ee086f98ea490cd9019c1d6df8884f6290f8ba039f314afa2506410069dc011c1e73a8c0cf1c2aaeb7bd0766c9775b8e5d0d5d3b2f74e29870509743c72f37b8f4b7e7d41dc489112442404799024cb6216df4e9bede5ebccc391201f92e36aecaf5e567ba49e6f43cd8e67d933006c449b304b26dc6206540ca43758c1521162846101b8ce302c8f848128694402ceffbbafddc471efbf2a0f7f47f7f66159d70a28aaddff6db96a8e3181471d0f33a30d7cbfd21d759d0bab5057e264c5efc8e9048085fe996e25fd7e81d34f2aad7978e16de75c49933a322e269386e81240bf2e6a380385a8fa2d224c77708ef385faa124130e479930c26252c63c43868fd0a0985256bbc0f4b54fafd5fbffcae8bbee8a5ffbb53c9e639ee97a3f94ef6fd025ad665c73f76066c364438d24f479f080849d630aa33432419215bc06ab73d444038b2dcc60f7ae0ff19786b59e3c67a086f875e3e6d5c8283df262f10c17186bd077f1ce50ee3fec41b32dfd4dbf0a98ac2e2e0f7e1f31efc3e89e142ce94047ce2e0979c72108717e350b11d02541138302b0fab7881381f5ed82232970f68caa123fddbbff35eef13f189070ae30d2181547b434a4985f090919a601c47e76439cfb91baeda8c0171ea73aac71884ce4dbdb8168cf84c2088609c22fab0154909440608c6ab06ea0e69f8e1c5cdf4f3729c68481e7f771e1fcf02adab30c68bf715eb4cac03de0fbc3f707fb275db5be077121366494808df6f1d271ffde51d9a7119bcf5675285922d82545714195d2adc7439829a6c6c227095dd67b11e39923adb0b791d4a421151bbb6d9dee7480987f6054bd8224343b9c8ade612ca8ab7cb5bbb9258c1f1b346bdd8c8238184a330e8fb0548248ddaef777858afbf9aa3ea8cae09e7149640004995c51236ad6b4948f0be2c8954bbed6e0212167d22247ae0fbe6b652e1ded1859b937a9af21ffcbd213148ddad14e9934b0c36f099fe1ca12af26f181bf70571b211830f84638e38f8fd9c7244e04bc8e1313ebf4aaeb7675e306e6774551a1104aaf92d0fe440af932aeff5b2e83f46e613edb9804d759bb89f555df49cb8b8108697a8d9d1852d3794cfb6216c25edb1ed831903d3bf4cbd4ea2bd45ba61824410481221b7dd20c923ec85eecfd63ed69da7a62a1fc1675527ad03c7c75044f0be5ec2e9f86c19065f6fe0b3036c4272ddfa6d7c0909b364809cb4aa9aae0a73c215c3f22691571ad61b4bb6a4c221098402048354a622b29c0907312e42a2e0f54323dfd32d2c9e2ffa4ce884244f048425134d5887b67feea748445f7b61e58d9b7ab9124892ef1770aea58c4f5d52af9e52279f7ee9891d5619fc8922e6a3d712630442224bebfa92058513ce4282b6a708886d403cc796124e6f1276ff1e2c721b892189eed67fd004705e36faed85aa2899c42074961ca7413ae8f6e2e00f9018e238633c3740a72d74ce71f3e239306b0eafd3ac314548d34623ce883622b2e77a0e68e5cf19c4f7670b483c8fad76aed1fd11c08003c21d57a867ca93fbb9018ec96c48ac92c168e7409518cc1898fb7f549d6958216268089e2c7e879138d0681ec7109d74f88517d47a5a774684ba1d7bac9fe0fb54a7ca67c4f67ef76cf1be31c6cae00b92d08325302ffe00159a648036e5af7d7bee5ca5d6a42eddb889dc59c996859964c201c9830908491a4438a4c421555401eb62b7491adbdbf0fc404282f1cadc5e2c91e8f75fbf70e58b6e2a9de22bb73c3eda7dff64df4fdaf48426a4f5f48ec38e42bc4cda69064a02c292086c213e9b9e90acff3604c49294cdc6ef7ac0564f2b3fdb51db10b9abadbb355803383bd61153e0949418fc2a02efc1ef0889c11612c31c71f007480c719cb1c0276d3e42b20a30bad79a5d77c6fe70b365ed3f71f6b4a08788df09d2060d63066cef7dbc5109ee6c8b88e7d3f3bac7c673d8f3d94fb8de24d689d6fe51afa56436a4de4222a4c0ca648cc149ce0f3cae3802108524c20b49434a1c52127161db099d1a1cefaa6a1e721e720b07c5a98ccc78a4ead44fe8bcdfddcf4078f7436fe0b305839244028b93e812e277c22ce144fb7f7cffdbd39310a0c792ab3022b37712110ab26d947baf9312b12f0d7b10e1f8bbb58801bc5f6c6f9f35024448a4d15d1394b5f5ff78db4d5fef24fb7e496c7a8dbb36afd71199154855e5231c9040c8d6e7b3e9d1391d16fda46d4fd940e236da11b79ed2b1c613bae3580bdbb846de40919b8ccd4215954c55e49718c2069f5189f92406bf8a200c2cf401c3f837b1c4208da30112431c01b43de3669db6cf98461bdaf6cc0bc69df24ada61f5672875f0594774776d499e16069c1d3f23ca4f18007dc9e6226af7348937ce1faecbdcdc338f776d1f396a4cd436d17bdb8c81f4ae8aa926036c4834cf3fa893e8f13e49428af6542ad416bf87c5ef7a5da716d4d81a2da11ca4328a79d9c983c2cb5044844a23c8966133a3e55d678ecf2d97f079f1fbdc4979bf918413bd7ec66763eace6860de93549e32b961b928cc452a2ab6bd05481c3ed5540430acf68e1631404a2444109940d2bcc5b9c78fb8fecda3c6e8fb9d39cee212d7bd599e13f4fd82dcb8f13d6b85eb763808019ca94428c8e6417d481e6cfb206f2ccbfb1edb9f0672771110db0be3b35e1edef594d5ae88af272cfa628e4c11c2a93fb84f0bdef02732450871febd59e4a3dfc3660cb8bf3d19abc575b1e786f17b76003e07f8687c59c0d73e009fe31db7f73d742f5be033d7b1e4e3887951621e0cecb2aac7ffae44ae1e2b02489c051608ab64141aae93dfc7e795b19b1b17a6d2e3a9b1b4f6ff32725deecd09b94654e6cc28b5c91831affeef6ebe476f25e61990f0a92ade263c5fc22b25c8b828090c1bcff5fc8516855a1dff4dc2ef9e641d38def51c4be5e2fdeefef567fad9bef52cf6071b6b3df883d629f5cb6e2a7d71c3ad4a1566cd3e7035b218578a780f361207a9aec8bb0a84c497351707abcf38beb7b588012c81e03d581221c98b547f7a5e1675fb25cd75ef2d7fa56cc4ac2671eb43ac074ee9131646757ce7d0d1a96fd69ba6d43137745977e0bb063f1bd36113a1d43c2c919024229c4868bd57df2b6b4fb9f1da3198767ffa8ad6cb5452375535a79ade507edb83b95fda1ec80b260b7caf9f53a4e54b9c3f9eeb93244c9fbcbab2a04a902aae00e3afcf1b4672a83e7760c1910a91b6fee5cd4e3e567330077d7ef861248910c1a022fd1c0847c6e21fbcd705e940a568bbcb5b87d87f3efad5c53fbcad09e18a7b7e6f7eaee678abdeaedcb2fc031533e6063b2598fe6ccef514bddea7e2a2f5f65ddcf393799d5c24fa76e2cba22ad94bacc1adaf518924611a1fe5f00a47fb3e6f3261bc6609354012cb4fa2e2ca162a34a9d293fb4d792595d21fb6beb70ac659e6a885f3057bf38980be4a59a7830ed63180b4d36cf4817faf6f1140db00270c88f7f505306ac252f95e45ad684a9d00dbde36545ca68f73e2802bda95b6844a9b09c3235e9822e34072c4b8abadbaa2b6bb084838713f7a207da886377c21da8db8ff385295136189c11b0712e40d15e055e213eddb8370f046164671bfedc17bf0cb0f7821fab369c30b1597cf5819a0daa0f7087007f6cd8b50e558abadabdd08d43322d70cb81eb98178c1502435380e1fe7418485088ee0b477dc3f5cb4b0f739d4ac0ee2ba8852af8cbfe5b309a72b35acd5802da7a52b555cb065ca2837f99d3f80903690f9de8231f0a9b8687d9c1c6373f9201bb363ef132ffa3be3d49f6e4df3c008f22ccc62f519212208def725e33b656a0874d715ef2f55be315b5fb667bce8177fb965161390002f3f8ed416ba7e261ce48e4bce1ad9de799307ee3fa505c6a9e0f77842527970f92b7fb409667c7cde867e679c68bf76ee3e87d6ef66f0fadcd3699f13e328dd780318c5e4b690dd44406464230f24a2ffdfc87aa5eeb32ad83d514a0cc9bca102bc4a7cc6f739220e84f8032931f88c974924862c1cfcd59418a4118c251f8a0311fef9810788e0401ad46e36a8b3dec0675e705d8be3906d348544d77102e2772634b4a04842913601fa7ed575e30d0346bc787c7d3be07efdfba4efbfba7afd7aa51e5970d1c33dd728b574c86f115bbf715566d5668fce988c8d823108f46a1a1d934158071f348e8066253242663a6fb9b98a826c67091897c4eb205904b9f4eaf2d90e03bcaefc715684afb767bcd86f1567971d45190ef840146edf4c508860c80054922cc2b81f045b1ea8ffb81601b40de0f7264984243a4d982bc655348de6b08b313ef4fd480209c7f7f91c1212657ab79abd6a2379a2641019d23e972a59a9c2adb62d64777b618983c2ed5bcdd5a6ba261bac38a805a58df9cd4b8e2e0c9cde835fc98d27269cd2c0c754455e7c81c64b9fc4609e4369c467e3e0f7abd01273ca4111ef2c81046c787980080e84f01dee648fb9ef78a50efd39fbdffb23a92245a2728e9c53bd90080d1bdb607cf3796b501a732b09140b91346489dc5f3d7f171c4f3cc7f66ac3db9efef8267dfe37fae0b6cb5a2a55fa7bf1dc052d30032a8e3188cd4b62c6e014e764c61fe0c6cc0740b2c4dbb69ea3d343f3a2f3f3b5da58d78d700f3266fb559d89d781dc0ff2a08f88f7150c852f854e75256ac7eb7d18aa9d3a9e722c51524c9f719822c3a91f14318ef92552c52da2fe99cd4efcb3741a70e72734d46aeb468e3b01818581aa582151a65d57f3813af096234d4248a8ac7dfb4e3a85a8807e60db535e5871ba6667b8dac74d02262506dfc2ce177efd82a34ba02ab20dbe00551179e9c45445369e6b0e7a7fc47bc4834f72b273e0d545f882536d78c61de856198b440f9a9731021f1d5076fcb8adffa64cabf38c52279f7269b8572f97605b1f51ae9cf4c70c247f714e79400405120a1312d2a1caf80882c2586f89bfb32d46afb30e734e5ce91af7ee993be8fd136074256f11a94a936e9155713af6315d060f5eb850a917ac1b9ec81da8d42ab5b4d110378dbd6d948a8e7f9ee9bb19acdfc5bcb0d81be87beff3989090917f1b6ddf469923a34919f5735252e3d69b4cee392489aad36feb0be33a2f23e424b399057af379f0fb23dea96ff0a594a40ea0d418b8d39ff283084a6ff13bedd86cef752ce94504fca7371b30021836c09daf50b7d4171acc543146437c3f474a94010c66ca8b2947a4a19e8db471b0338d545d4986ef6f63030968d101df84823481c911e9a00fe0907654554412c30eaa8a7c9c1db903e7b304b243124360f6e1ed35b60ae372edd7ea571d7f9d52ff6bffea03cf68cef8a0470fcf6b028e9ab27846dda9555c364f4a8120090ad94e3e053c59c0bede3ebb11ea0335f79e470f6ab6af5217be7f47cfe177ea710da957f707bdeeeeebf161bd9b517889236689701141c102c74cb091d635de6e7c6bf51ab7a0d50bf7fff7b867f7516ae9a6f96fbef6a38a9b67b13e22fcbd79c55410611211f17c1052c11d3c5fb6e8c62b51996e12459f842ab3eda2c053e0fa0d625c826c39d54da1932cfbabe46cb1ce422f871e6302922de6c5d9f6ef3edb19416a1101ffa18d096902c923da22ee9e09fdbbd1ccb8ef279c26b61150eb6530573a875be64ebf8a55120a12f9717df5250ed9f63001719b73a953e9be685255114b20011cddf6aa8af285c4b09daa221f6737872b12423591444510b4c18372256dafb135c0ebacf63df51ffdb7beb27b9f3b8b3ffe48a9cbb21f6c71b616756b1e53a77e2d14a2e1b4d0e06098a0484905f50758159600b66f77dcc9356b2875eff20f5ebefa3da55aed97654daead176dba75f9a9711c7acd2db5ef7b7ab1be6ef0fb331faa54aae18cfdbea959d38b8f0809736c58091cb8462922ca947a7551af05795d959a3b64d2b8c7f473aa52aace8f56aa93eb23ce599403dc44723c964c3ef63e97ad7163e2c63551dd10edc7387a8c56304843b0fe8224deed8d200f60841c29010bdb6102db9097b3c5f7495f5cb369a35f94b74504b4bd50da92feb1368eeab648403f6c803bd3d67ba1371ab905d9e8fbd9de73414a24b1ef89fe183e1fdfe1e74855f1d8c4cfafb6c4110efac39e222011c0b07ecd9e8ea974964c55149c1bcaf4b7575574a19018765255a425101bf88424c5e3b13de35662dc3eaf336527999788c0e7796ea0d719f085ee4c9dbeef254a65947578b6df14a56e5df1dacfa38e55eafa179ebdedba6b953af3b46b1ecdbac9f58cb2eea6e46c3ec2d2d1c03452856989e5daf14fe71e32541382e68316dcb5454b1a23efdc34e33ffade4b6a5ef6eac5faa20daa5f8b0509086077f5b0f58952b57eabbbf80e7ddfcddfbefcea174728755adb2b27646418fc6ca379247e06e38cb838f029f2d9cdbd34a8a1fdf897472bf5c519fdcfeea1f194d85b87ccbd286e5e4e5227d0d1cab98a449c027b191101210e1bf771b3f56f673a515f3287e27afc9c22492059f1fd9d8e20af3e23d43b1e9fe3b70d79c78bfd5763609d06075ea554dd760d66d7385d256e610145dbfee47cff9f34db0097910e2d0aed9f9119f7fd64260c29a106e5505bed4ce5cc0ab6f739b46f7c0405cd2791c8160e7a913de4c6ebb1faf757d1c2ab811c17896c1439bebd5959835445f94262d85955d11caec54ec64cafc4106cfc4a7c80ec2eafb3800324f476ea0cf78068b2aae5570f684ebce331a7b51e3d5a13821b3e5835f559a5ee5e36e8fccf6ed5b0c17b470dba5aa97bf61f74e23b9ab0dcf7ebe0d3bfd39cff83ed3f2e9bff9a52cd4765f69bac39ffb4f76bcdecfba3722bdc8d3a68d0361803e27845e478ea88b4ab8ee9a4d489adce3bf5eb12a5aee9f2e481ddce3133215332d00620632d491214c0e6d69b987cf857372f6aa5d433b3af29baee0fa556b658f2e77b99ee1f9de3495545d961298b2ca71327027201be84e3851ecef27de7e1e8fa664982be8b773d680964db043fc03dd3a7ea7498714119017a5eb519212f3ec9d9a26fdd6fddefaa140fc9fbf78083969a2b2cbcb7cf3946e8d4abad1a49f6f7bdbcf95284c44906976ebc7fc97eafebff3e2b54b3bd5b2297be5f6c1fd3f7ab9e44a9544c0209b0552675970e57efbd626d4fc581c435bde04d8a3a108ad8c16cfabe485b8ea0c5f5d9c2c8e888eb6291ca38b8189f377790c3d7399e71385e4ec09191cf8c4f65019f39a81d7140cae7c4c647e3cef6cc837c8fd8f8685eb23df320df37763f5dd75ecc73e2f71011efd68a508d7df7d587f680b48b5c63775a56fa88b326ebfe55e9ff3bff7c7d88df90727027d7bdf302ebf3e697c573de81efebf97e32125b7e37f580fa639fe7953af084762fbd3c4bbff67f3fbb6a66032de99cf6e484eea8494eb61ab2b900334b1454b8c84d5a57d466d34d1b8729f562ee0d573fdb4da987ac6ef54f82cda308b5cd8ba8521edc56b9a4aa2028e46de4310e77b5bae27d6ceffb7823c8b504e29d7fff3acc16df29db834f46906751b2d1c075b06dfc0e7bf978f0cbef71f0811dcf391139add8cd1be706a707c7c1c801aa32608d088c99a15da07bdfbb9acf6d3da254eb9e1defbeb6b5fb9b13553925fb7ef29c60233b9d5b4d9cf4406f2a40291132c15789ff9ebcfd05361035ce69eb524827a6ca21ce9f16b2a1bc417eee7eddad97f30aca0d4491e3dd252716a022607c01920479c17417712001a266a031940eced94974e422302d59c47b9c7bb113302f633ce30ed4b5621cb37d1c347d37db332f7ea78488c067ee1be2fdbe41f36ccdb71ad4d647f4019ddbad7afc27a5eeba3d6fcad36729d5eaccac99f5a71bcc64c4a7c871527171ae262af0739fc6fbb17330153ae21adca40213751c2a6103e08038e20169e5b97d1021bf6a3540e519a0e2daee08f25841a96daedf40c95a79f153c4bb23545c8d6f6a7e44e76f95aaf57dbde135a0caf4c5179ce2ed4b2f3c3ea8a4ce3dacfe99cd060c7b61bc113bb54eda9453b5c4ee24dbc722c9a54fc5458ceb3dce8d5638603cf2f7a0ebb6bbfd1546f42aa18292221b2d6c7fa9583351a4e2aaee4654c2ab2be64ee93d30a58a20b9178ce1f08778e340020f4cbff192c66dde83031203545cbce1c5c11fe4069ae535ee27cb6aec4b99210b606579239f39995fb08d27e14267154d775f4a19c918780f4210c0baf51b2c3bbbae52570ee85336b4835267bf7263e611879b1b3820d2dcc111d09c0d952ae751b658cae1244aa99271be7230f0887a296c047567e05bab962b89c40efa00e3f81ca45a0950716d7704b92d9c2e02d6af13e4841140f0e5ba0ae5a60edfe75cfdca0b2e69dd190499250d221c7dbd9024134eda8769f37903fd536d24612f8c271c3ddbbf38a25d3bfddf2d42758ee8a5e2bcacbc1a0635461acb03545c247fbf1b53614942e2cb00b1cbe6fdaf9040945ae9fe938093357de985b59da562b72131187c31774a1bcfdde6c11f687b20afaeeee2e097de50e2e08f335e7a0fc8d9d0698b0513ac230fe0745962f0e65e4a5691cee7c61cf112eeb848ea88171fcf4bf5188318beacf87ed21af28231487d2fed8f03ae54ea983bba341d74b05257f47b78fca9a79a275160241d681caf40c6774a6a4715f5446956999a8303e412a4e4b086a82b3ce30c8bef4fdf4f38353852b21611c881363f9a87dec2e92228075790e41e90be3d88a1387068d6e0b310e94c39957c258101397e8824122228749062a47cd0daea1fd582926fba04a4f165fbdf75bf6b7b8b387dddf9915e57beefe767a4bceb8af6f1db9a8450135e58bbaffd151288e3ec1bfd8fd886b0a3bffb7243f90e603a686c73dd76aa8ac86ba5faaaa230f0790f7e123163f86ce00b039ff7e00f2e8065c78f5b73f8e80b955cb650150573ba112f3e6feea504f31211f80421f78e3b4112cade09e7253901b4812fd93cd3c6f1be87e4d08f57f7a78e57aa75f38ecdfa7552eaeaa18f7ffe1fa8b652e96003a74c1b99664012145f52c08f701dae270984655b9ac9eabc77b292bb3102ea9dd720e3b82df0f9253d2ffe18e392f83bd9dca77de961286a75a8bb7f3bcdfa753af8ac3fff8579a1b81de9ce4dbf73a0a89438e860b3f1fb6e3fe8f6500b03da0610a174dffb16eb95473aacd673f25dca63e7bf14cf0026f97e52a20c92fcef756aec799560caee41eb8b802491577322471c78ca2ab7187ce8e894eb8f3a2a3ac9615c6c9659d8f4ad81aa28da6f6a38737d5d66b45f88ebc3e67a8bfa19c644a7afcb00be3ce0cb31f880bf03e1b3fa015f06f0e5015f0ef045802f07f86ce0eb017c3d81af27f045802f07f86ce0eb61f0619cb6790ffd7e346ef31e882b519dcc7bc7e605ef4df39287f7c8e17930cf198bf7c8c07bcc51b9069f35c58b8fdf2303f8f2808fc61d013e9a071bf82e02be3c312f11e0cb013e1bf87a78c63d16ef8179d0f83281cfc6bcf4f0cc4b18f394877e8e581f63715f06de639c15496dae5403d5f4a253b424724c9b335a1e788052cbd6cf9f3371a2521b37acd958f646f40e9f5755d581808b0089b0a0067cd59706aa3c40f3c6d1755ef7a0861fb86ecd6d271cb3efbdf746dfdb4af8de5966bde8af81f520d657a1585fb1f7eb81ebcc3c58c06f03df409a67e0abeefa95dfc906fe42c69f07fc9e75d1ecb1569fb53d4da95f52239f7d3d4fcfd18f15fdcb903287eb7e1041fe7fec7d77605455d6f87d93425540042c28a189065054c4b5918958f613bb045d154d5c5c0bbbbaea5ad6c68bbaeaeaea2a2aabd8829505549a28b6bc8080080a0a845e8288945002a46732bffbe69e73dedcf3e6e64d4050bfdf77ffc8cd9d7973deb9f5f4735175a864348f005fab8f23d561a8d78adf66295055e80da84b54ed3230e76ecb7be1993e723c3787b6f61c183b2fd4d316db777cfe2cd8c7b80f6d687786f9136afdeff8dbe62317970bf1ed639f7df15d1bf505bf0992bc14ab544d715018ff84296bc059c4372f0eeff02f2181dc141d19fba790a98ab298aac8f37377d4733e4e595715906ac7a02a1a047ef84c5514ec4e6950150d82f6deaa8ad0c633489718a261c66927ebc6cc6d48c973a20c9ec186e48d3383a7ab128d1203aa4e32992a918bf2ceded9905a766c7dc405170a71ed930f6f1adf4b880b3bdd7ce771db558f30309238659eaa4561e41547242e71cf45fd2a23bddf5e6a9ec4ebcb6783e2b60c068f3851834a2350d5c9e6c946fc0d363380df24bfd9135dd70b7151cead17e7a8882ee31ddc741737aab2186349e31c861adbbfb5e2a88abbcdbafdbea3dfab3767c9110e3d9bb2f4d26745431a06d5e6b642de3648fee2b53815d67e2bbf800472dca6018b410299091248624e761e719c4a62f0382613a7acda7e8e2b36ad526250ed9ed036490c45206023a7ec001e16937c4683c4d0d30278d02e619c32b63d7836c0d3fb313a5062c806780ec053bfb7e9f738ead88f61008f8f8ba3c1f3c6355fc3bb484fb5469c743f92f4f2138e4bb0c4a0de5b0cdff72389908fb30df0b2019e8e77913e0e12de48803710e0c5be0fb508ddd9ea62210efba86b8f4b24679679e5296595770931f7fb8f972f9ca43a0882882791a08aeb55f87cb3fe3d969804d2abcdad693f4a0964665f9040988457049c66969a5f39bbbd00efb0d66f2e591741db2459dbe2bc587334c033ac37b93e70bd227c05af00d65b364980198047676887e1779da1bb1abe2d67b769d3ab54888af3777570e4139be7942cdbfe817a30b24ad5751da106db52fd35aa26d604254138fa7e73467547553c49618a9440869ef9cf9423d708d1b6eed0cfa62e96df75b386b839ea1248946a7c69fe98a4ee804408eb5fce961aa5ceba4459f68fcde58be57bbeddf4d982ffdd12c80b9003354862c01bff7cc9e07e5e89419892cb9923de7589617192eec63c4d370ff4da575e677b2b3170afb3e00b9e1a9618b80d29c8f81c0ef03a1334bf0da794b95754baf1236d9f397c4b6eaefa653acb05c6d3de87e03e15ce10696e9ac78add6e1d0dca863b8e05c61a8cd846af35be4f4c81b64101abdeb86af0d10695acdb79b463746c441e34cd3f3e60fe01dfa807f815aa3cb719dd3783840258145f565847fcba8ba32adf55c8727d9c71fba00b9b49d27ec888ce156336ca0fcf1135ed068b04de71060d03cfa1166612a59df87cabdf54ff61a4ee67ef6940f925bcb0268b0bdda51a3547c6dab1b6ef46427e00b383df6c5c56ef4137ca9f4b554491e83f93aa88671ff63676e2033359af336f01da6c5c1c1d5e925e6741aa4454a1e181e71da81c5e725e6704cfa0eaf16ee84b8e31c88eb64542d0e45c5563d2404cd942aa18c8fde54b6b1f7fe09d2e5e8ad5a6f9f218988619224f6554a8f79bef139a271d9e699ff855b4dafa8a32c2170dc8c1157daefe30d7fdf99b73a7f57f44128c39cba6ac5bf50a8c539ca641ab71fcd0cd9aabb2b0c6e71847ff8babb6c2503baaf2a54587feb884f28c8acbce7fb6b5fcecbfd6cebe7db5759c2c83c5d78703ed2cf85661c1ceb7daef6ab250c2082a688bdafbb2af088863fe2ada29dacffdde7777b32f3216efb8c68399080c5fd8c8c13178f01c6e8ca840375e741fd5e179ef55cf7bf8c1ef710275f81e3cc22f0ccf6569cf65b17e107ecc26e0f5177fc7decb36b8cdee4a47424691ca8c73e411c71e7e0a6f9bf00b03bc2c8007e34cf8f171d1da1e7ef49e2cedf7997ab2cc04f3c6c68f71d4a6c8ec2c46c8bd718e3d5fff7c7d6bdcf8787f42f339aa6efab8aa314b715a1f55935b300b94730fbc68b598c4f0e7f3a5f0cc6177e767b1798efad661d4303e0a3e839760ddf0f1373da7e065b175c0c6bffcf4b2a7961f2ac4eb4fdebbf2baae42ccbafc8377173eafc681526730c21062f12029a648769450f8ef385c4e581ca86df1f394b00e8f13b810c75ff6eb8cf0a0b79a4b89e3efe2ed889b2a2774704a6bf79a01fff9a38fafff1c309e177adb3f9f317835732ab7b8297c12159221b138f0f95e1392fd4440349de726a134cadc48c7384d311639e8004e36c9c03684279fc3802e5b3da54b2222d9c036c8ae6a74a7f4738e85002f6c80a71bf793cf6564c7e38dfda0649426151771f48ca331b98112bc00d586cf4fdd2051993868c1545026bf777f64b69d181e53d5f58f7e8e0702651d86fb527ce9ecaf50351d704ce5122320a1fa2bdd83cdb88e094f76a1145f0f5cf5668a8f42c921f8022dd5662acf2857ed390c5fb67e2b9bedea59922bc4fbdf3d5dfa640b2176ff6dfb6d9590fa852ee462358e041622089c60e0418c07f30cfd797e256b8813143e1fecc027c212509bd29d936451c46a89d71f86dd3bbe5d7b29801e7269e64715f2b35353875df19248a4a2c47da69f0f81b9cf683e615e988681a940eb1ea919822978b050f24f07da9c6084d9f38d2628298dfd4172c53701e8d6261742a761bd0fdae2a613ff7d8b2fb333e43363acbbdadc16fb3a1cfb0d1a150792fbae72e7252323b8777aeebbea7932fa817109dcdbc85d6e20180d6d6bbc7a0e36201a154b7437586193fbaf03f0b2019e0df00603bc20774a1be0e5c1736180d719fa1706789d35f816738365c6359f71941b5b4b2c2070308ea399511cdf93ac1b730918a96dd113e015b07171005e36c0b3015e5e3cde16b963f371a179cbd3c6a5841b190d4e0925caa82ce1f5d2c6058e058417e91a79a542cedc8c35ef954dc25425afe975e40855d7bd0335b8a7d6032b4189b373a514734deb12d766d27d52dfbbeebe1b301571eb18ddad6dd66f72d7c5f953c65263bf8b58bffd4e0d6a9cb9bb2eed13b6de4ceee1b96a1e6be657fcfda7a38498b4f5f9618fbe2bc4b697366c2f5b00e3016eba649cc51a23fc0ff7be1f5635f2fec90709d1fbd3334eaeea20c4f799cee38b5d9bc0eafad7d13c4fa94f500586e705aabcf2588d073dfc1e56b02f69a0ec3b0c4992751ec30309c6000faf5bda8ebc3f5bc26d37e5c8e87bf3e4678bad938f9b20bcf92b817d9141fb42b54b02dce44df35744e1081909e18313cd0f672ceb375de2bd7cd1bc37d78e56f852668515aaae394cd564446781b3e8c64e2cb3037598b5a9ec2f0282290de4902c1f33a7748be4642a0acad2c66d11a2c3f0ce151def93dcde92b4944cf728a6380188d3002f1ddf81c90e86b88da90696792b91d74f31c17b12e0213fe3c05f3c301d06cf0678f900cf0678f900cf61f06c80a7be37c7afa836d804242169afe01141e4077f118367033cede017e02f6ee52bafaeb803d8d6c6050f7eee15e6793fd9006f18c0e3e3e2307836c0cbd7decbe357301e269fe62d3fe1b878de68450c9e0df0149eb83ef28931e0e31c7b3ed2ad6e4d453b21befce2bd6d9320db2ee6baaa03af2bcaa1f523b47f82e73022fd7555bb5bba456aab9b52df12a25bffbeb35d0212371e19301e05b1b689c099bcd738431486f9c47ef7032f2c07bcb0282e08c6b5c8b04f02e269eaeeabb24b25eb31f5ea510f3f365b884dcfae99b5f529180ff0aa425d3b72bc985b8cee673955882127e7d75ee31ad9971cb87ad09d52dabbbad9a503cf17a26fd6ef6b4fbf4a88c3da769b307fbe104be7cca9d8f19dfa5dca0faa2655d13aa851758804c78aef591ca180ef434868b2d9f3863ad405ea7cf6de87253dbde2e137bac8f79f939277d78bff91fd58d23ced1f43e56f1f11e7b51921fcf3970b84c45b9f0a1b1bf629329ab49f818c9ae62f0cf08a0c8c6c9e82b764e857d33f3c4988752f16cfdc04d71010e1c0543d10af43046425d490890119a868277813be11cb5ad6dee704046b9cf8380abfad6e4365e4152116bd5bb4e63349013ba6f578f50749e99ba51ed8379673e74831dc5531c8815207a0ffc0cc88b533920c6cebc72486fc464a0c3cb0ad1fb93be600bc0a782e0cf0d4f7268941308961a092182cb33bb00df032005e01c03311c091d0ee09e352c0c6458d53b6cf8d392f1e6f2e311839253a000338e7464a0c46b7584e004b48c244c62003e015c48f4bfd1b75a754b477737abe3f61ca1dea094e382867166cb8da09aaa61b0b7183c937b658d2bacc35ba776f79e2532081581a5e660267436f159ede3a56ed12365fbcdfc9ba41fb25eb0c353e89d7c3b496aff61d7eade468c72e1dba2913fa8fe3006ea17820d52c871a08894b582e3ff09ef517b712a2ed791d6f18fe9a50eb23cf5b07d68ad031ee3502ad1e6e3ffe1a591f7fe759d38f900758c6885ec76d7f46f26375b3a66c512b43a4c0418ea95342d7a9da4730f0c007c98552a7e4b1ef99ea8c54644840fe28c4b5473f34abfb39429c75d1906bfeb64b8803d71c5cf3ea03ee6f42a5bdfe22d439d459c4cf5f2e8c2f8e37b499c4172c49279e3f848f8484ef336034e6fccf944e2e43be75e38617cbe0de1e4e38709eaa0e5135057c82c44d044433028806023bf7310181ae7b0404269e7499c069b89cc7f20d739f59293770fdfbf56d3e937587c99deec85a289fc90c2d6bd55d98233739a7ec570da889f44b0cb1b6912308f2cb2f8603b098543b7ba72af222c79f04781900af00e0f103533ff8b9aaa858b400780e608307910dcfe5417f55bf8222de6d5225c201c83825bfc460c3731900af00e0357ca0369631f038bca41883c89975b67b53e197cefb4fb9174fb985240eccc68b2a99eed0060212014283a2bedbd316a9addbbb2aac6ec3fafe8b492080178c27321886086f5fbc8ba742b5e16d305f3a4344fb229badafa224256b580f5b42eb4639c38598fdf5843ed3e15c40d51d1d4090bdb81a0ea6ea6aa85f12e2e26db7560de82ac4a11f743be65177dc72459ebbbf7d2a185c076bc4d5ae9b6f4a76da9bc7dd2a0feadd6dbb5c2d259c7ef5e7bd78d1d342f46edbffde1692f5397848c721650749823664e95bbb17c9b1ffb0ae06770411162410261bcbc350cff0ea36fd0fc948bb5e883ffdf95f136ee821c419a70c3ae4e9de421cd0e5a0198f7493bf3d2fe5a053e4816bd55b9fc5bcf24c8c1b8e37ce5fae3ae502254aae6237cd5f18e099f659811573079abaf5e5766fca7ed66dab995af312cc17645e20427fa5375f6e410984c781f80888b1a4063db067058d374847c8bc081349815a80701db84fd63d2ec4c29e855bd63e22ff4fab5e7de345429c78cbfffcfb3f374b54c369b7755a2b1fcab262a61ecb89c606381ab662d0adc2289025f4c6828d8346e46cd08c0e57ee9e388d51f0c64211118d8c56218a8cf07b7c8f0defcd061b03a4d5465d24fdbec842235736c0031315e15dc8e0d9d00f484a6e156abf2f62ed420b47355feb07e201fdf5c685f0c987fe67c17b553fc17887042a6e1cf03d2a30d1f18d8b03fd0803bce1000f091ec7bb90c11b1e302e850c9ede8f4281cbdd06787c9c71ded4383d21d4f1375c900a2474178c5039d4f0b9053733c256f574ecc089c7cc9c078a7b636f769465242ac4990a4fc40bc6d386f9403c102f87b57deb187e57c4da8bf93804f43b1bbdef00ab7cd5ded175cb3fe75f28c407539f3ea26084faae0e541cb5a8aa02425b0381974848dcefcfeb79c359a7dc26c46129475dfff86cd7901e1d1efa87d7ff288e9d791d68f88624577bd44f42b41407d9ae4dbee767a7e5bb75e6a053d7efde2d71eb5b7b6ca1fca0aeaca6f9e276f20c59587fc94e8997b5c8aaaa7d57d6432dabee3e09efa1e8837592e4a6ffa5c9991d24614ff973da693d6e90f5a6d49d3d24c108cd0a1dd0fd18e1badb96346b26dc837e934be2093fc457e86ddff8f2f9f3cf271272fd3cf0ef6713fc22369fb82f62edc89c9a6bddfe57aedcfde75a60d0a3e0e480eb36fa37d6fe2bb43f869a393d245ff691048245526955f008038ae25369a1ce136d2572884aeb7f78a75c1e31eb2a8abb7c2c3986c31fed71e3c152226932b6594a8fdf8b384e99eb10939318485564d6ad6700bc028097586228a648f4bd53153189218ef3b6015e1ef4370cf0748981ab8a8a81e3251b922107974962e0c6ba71ba7343032a98c4124309937cc6412eb1814c62301a17717e133b51c4d990745522cbc155ff565d9e2b81cc5cfdc15353c00d1575fb5c678c9c760dd84250e4c7c86997536b3eb9759dcba1766b75e2a7779f1c9b1fd54fcf76941bc38324109454b9c417b08eb96acfcb999603bfb31aeab7cf763643a4d5cbfe7c3cfa95822786c5bcabf2cae1a0a9bd978d470d1b0ff9f980b4210f1cbb5588ae6f1cffd4888972efe6583bd2ddf4f716c79faf5f2e39027e41e371b035d55569a74453eb7b9c2b44da9f9a5c79bae49c9bbcdaecd9014325a158d874f039f2fbf4922639bf97e743bad5ec23377b70cacd6977f5970764cae294ea580e2a61e576f89dac57593531afbbeca0fdd6487c730d1225d700706711d3fc99ce1fc0b7eaa7f287d7cbf539ab7462d927304f2441a3e481f386f3f8a2aa2977d910556304bacf886e2cfb8a80ac5515a9b26c6823e118ad7f4f4a9a7cfdfb90e4f1ab36956f7693b22d1935f3f5996f4bd1f395439b96c8e70eac3e78ecc99273b4aaad9bd36f10f1c6db8c58cd554559b0a047e241a35445356d2b4ffee91d49b0eef961b8237fb9fa9905674e96846ae9a1b3cf99f88c105f1ff261fa98a385587ef5dcb61f4a4e6c7d9f65d33e7b45e2e594b7582c0f12eb71eb8f3b66bab103cd0f73addfd62da1264d8f168d5715f5635e6726a35ab2aaa27e70702569434ad6eb2c89247036c053fd26db4623bdcef801d2581b9281318814d6f58f1190fc0f9e9e324541226f95aba08ebb80ca2d3590dd170908dd0f2209488b6b5b2d88119009273eea1210d9ffb580871a8f121adfdcd8e7dca9c15b27b96c3c54bfbc75acdac1c93213f65b62a39e07d56ded9b95176dfe5a8ec32def5d3fb9addebf6a50752001a9fe03b45f16e2b49b2edddcbd9b10c71c715ac10b27b97687d0e466634522860bda7870e2fae5b601a3513fe178908a9933145c65c4192b4184541b0f09cf82b60e2f797c8be039d5c6649444b8a11dc40099e6af08090bacf702d82780eff6d19bbe58f06f21be7974da9a3990fc13558eb47e519204d51519d1210094bc1021a928b9f3ae1501c50a7a60ef0a2720ae4ef2d049dd9e7275c63f5db8f20efc1ed36ea742923bf4c76f0a2a84a6bf57350678b911c35d671ebff348d9f17e951754e43bf2bbb79a171cebe6e2416fa87ca6032e56edead6950f9648d2f16dc7699151db25617a7556edea6bd59338704889c9eb060f0cf073a7f4de70c5aa582c712c6a999b76b810fd870fbe2cdb8e39059c71c92512d7754d4b0e7727cabcb01596c51243b778d97dd5f79c2385b134e68612646445783d019e03dfea07bf6de294e8a056ef1d076f1eccbcce689c698326c6db070fae041e6c2d318c0b872734bcb98e7f1ce4fef2e08944e3529b555dbe658b104f9c73cd7537dca0bea850245b94dfa9d73b77aada559db80575fe683371ef0769f7c591954d9a0871eeeaebe76dbbc51d4fc4970869be1a2772ab1e0c6d07f054e36d1be6c764cbc8268239527b9f693db0f9af1f5a5f512d39f182b4bfbf7b8364782227d42eae8683a51c547ad5703570e5c7429cb0f89c8f0f9784e5a453cfbbe5c543e45ebe32a557ab0566f871f8e743db56fd84b6373ed9da78240f8faf2b9b8d8f93e478e07a56f0f269dd2687af7ffef2017ed03e407c75f81c5ff44e34ec8b65cbe7defc9a3c07c76e7e62cb44309ed37a0695eceebe7a7b273c873772220345f7e08057229edb2491f8cabe0a243415478e53f59005af5d23c49513f2ffe348c4ce7deffa9bdca4636e419b08a681c68ee1c6ad3c19ea7e42ac3a6dfe81ab25c57cf7ac870ef9e30f427cfec6e897cf6f2107e5a25d59731e1714a9593ba0eae61fa588376dcaab6fe47e28c4dbd38657dd3243118e458a57f50df46e10e5778197ce4ed0fd9695410d46d532d025ee3847be376b774169a9109f38af5df05e6f215efbf4eed6d7ac16e2a32f5e5efa876512e7c9bbc4f76e364e87451a0fa7486f88a43646d44380178b78775804ab17990d014b0111f53c72d910f14e11f78608e74644bc033c91a3c17344e27ef823bcb57ec4e1a7f7c3d123ea699ccf326f07536930c0ea52a84d11de384e98dbcdf6451c67b1dfb179308cc720ca80108def676044337c1eba2a34a78964d0aedcf9e07b0fc9a32863fdb119ed8ba1bf92816af141eb9753ff21c415afdf7ffc1db74bc23162e08bef6e9407d721d63897703436a23ec1ddfce184e3c13354f0f1308f0fc2cf6ad4789823f693c397cf5fe0bef2e1dbe0fc61060513fedfcf99de767eabd8933e8697ae62fe82d5c800e34e08439bd94278db5ff6b50d04240c324a4ae1ab775df83237adb1b52254f1fb3942342f6eb5e41ad9d1eeaf9c74847bd02f7965e69aa510928f5e1314405402801d55e100442501da192ddd5e2e37c0e267bf3ce5d34f2567b8f188b93f49ce70e6f071bd5e949cd5c6c7563fbf0d44710c84aafb93aab97b62f52950a397097a9f804848ba6008acaa7d06da40506ad17be57e49649ede3c7ed77342140f9879c8a7a70971d4fc7ef77791fd485fdde4c14e19223ea02e7176559f3714798f65c0a814c4fe722f1b54998c06afaec6deffc16d0f39ca46634d35a8b84a1a0e7cf4b929e6800e7f2aa89cb88a2bc08dd9a74acb010e8fe0311517a892226fd43d5d2e198559df4da89ad24e3dc9afb2a5f8865ba18d596613a9b09ab6badf5561753de784ee3115164a66e4dd47b622e51cd1ce375f05d04f9df3cc609c32f7ba9b0af04c2a2eb32d4a839f7a69fa55ade4baedf2d5710f9df3b614588f3ee37727ee12a24ffd590f5fdf4d4ad607b43cb6f7fb225ea7aff035ab3c1d6861bb00dab91afe45c6f5dbf07894c029e0ad2b1bc627a3a1f1f0e1ebc1c7534587b7a7f88e067826155792f87a92148e23ec0b5071452aeb6eda7da21013fb3cfff8dbaed7dbf3d1f76bd1eb0acf27e63587b6adea43551d81f88f48dc7a8ed59cc57284a1ec2b09c4863aacb75d82122d89c63616716896283fe069219a8d689935ea65212edff6c0752f7610e2d017ba0d6a0692890570b063f578510d1ed4a05270377ef48afa47aaa4c8fde9f3af4d9eb043882dd53f0cdaa2941ba26234d428e24d85badc507f08f549ac0df5eed7f59abeff9b1f5eed84ead777c909ffe0f6a77b3ff0a094489e297fed9b961e2722fcd9559d589b272fb4d5f30992eec5da71f06c8017067885002f0cf0d4ef1d8207fc46d48e7f2fa53a19674cfa662b780cefa0acc6e328058c03ef054e0e9ef75f99abe18dfda07118c752ca18c6257247dd0d55a09a3116c0c8554d265172155ea6943ad0366547c6f9f22545649223bf67e6988653c644fda931d838eaf88a2a7152ca979260fcd4a2b97bf3a0d526747af327e3e08775f8c29ce43321fe22e8c6cb64c70339faa0ecd6415761f36cd9fe248689f135ed37c7908cd4846fc0cda5512f755196363e006fc7d39b6efbee12d93ebafeaa7ac6d804d5285113033e5c6f071bcfb1ec2b09c456154a2014e1290956af57b35a5f32517e3729f47aef03848f330a7d9472bc1b917e44e7ccf1bde5371b6a965f39ed13b9be57edfe368a0405e0214f8057a9d45f0b35da2ac0bb00757a753da086c8d75a3016d600e789c6c26ac8c24a9208506cf2af46ef068c13000eb60e03ae90b2c34d6c75433c7c6a2755ad7139dd8d7d563d34fd612979f5ef37e4fcb9b24fbfb31e6bde3381c4c0bca11a8878571c2f1ae76c901838c7c5bca17c5e25dcf6e0c1ab80e7f43810b3f112df9301f0543f1a29319838679ff13d07e240a612e7efc05fe41463cf573f5ef9c5c6638498b3794acde72c25874f125d0f6d304252e015d4ae91514a20bd5c09a4cbd9277ca8241070b3e511e4a375af38cb176f14e02cc125b279e86d66bda0c6c710001a646ca6f9c73649b8ba445910606c3644bcc771f4008f38fac4f8068d47d03af02460abc1f14089b724d0f6a2e34bfb03e0737cfd124e627c4bd87898e62f3bb144b9e2866fb74f3a4888e5efcffb76354f2dc334296444875433a84921891a090ab03cfce64d73d9470484dc77c3d0c6009f755244be3c6bfd25cfc8cf2eb32e74233b4d399042a194f69daf13a2eb9613be3efb47c919fdabc5b5df5e2009caf815d377802d02fdf2a31950a384c2ae26c52b35d1eba0162e5ca96103ee0bbc398c7d8f6e8d2c42b9ee5968636e197c1fdead0d1213710a474aa9e4d31d6fb984e9d0a15d8fdafa2f210e7ce4e0d7cfba5ec4e78672605c0c0b8f368a5a685c555442eebb78f087019e5ae849aa8a28702a9fbc78e669f032d8c19fac1bb35f05930df01c80871bc606786a5ce80064de6c53c9edd10678093764e5985dc3d7ff20c4dce73e7abe285f0d08b9abc2bc9317cb36f8bcb5aa2371f387a5c531adb6b84e215d17f5d97df7e5c21dcf5cadfffc42a952f0c2ca40c2ccbccb3c6f9b0cd54f168887f032d90555662706058f474cfb097506e001f3448c40513cbe0d44bc27864f81a348a882025603c6837b4599dcd983c6a38445782321c88036a98c1a89af0dbf1f9de4ba2d32306ed98c5065d339b92efa85101fad1cf5e62b5709b17beef67fed06679e1af41e44c2810c32a8b28890c07986aa2bbae80b0849f2570aef2b0262e9757ca468afda33465c2c452f6b86f5975eeed2f74da0eef5639d16fae3c172800e7ea7e3c84193a56432f6987776ed9214f898b97f2b768d7e9f895118f18efef9382014a888feceb7431b6feac203033950a0d048209080d0cd5e90248e72c8408ea40824e5237f6a885846c907ef808eb01bbf5c896a45c6dca295f2b93e9d063c30d09163f46eca336d8e12892486d871c775a10d2c6c95d2c39c1b4a3def71a0ea3d9c132b21c9a788c1b3019e76f007725e96211300da623c5dbb0df054bf4d9cb945fdc0f88af60d8dcb8e6ea55d162e1462c1a8cfc5dc52d5614afe87840475c567c1e760e3c21bf68880480c5b0c3cf0ab5429a97439fcf8f6b15426b61c319180131d0d190bda91575c41accd75e1e61b367578f3005e18bcf6826c443c62da1ff18eed5c68dbd04b1d9e39e2bd40c3d78bafc855fd4c52420d1a0fef8e70be0e6c809f9b683c8c11e445942f438797ac44cdf11d4d84a933400def09be3edb11c47155dc5dd66ce569427c3ee5ad411f82b71cad5b94a08111260d0aba65e3f9067504d631119046abb0f6b51756186a5b55ee104697467fe72e85e8708c1c661703a1ce2f076f9803c1ea44f117d76ba4cdaa430e7a401ec4397ffa7bfb918b85386475d75e6d2e86ee3ca4bf1e25109400e860b848d55520caa14e1cdb6834a71c3f6884fa94d56844afd56b5489d5a228f9771d8e6694bf4df472fdb2ab6fab983c6b56bc4e95bc316c6d5cc2ccc660ba000bd3cc07a46bf7ebb27db61284a7dd2f62d43507a453275d3ed90a0c69c54d1760719df070ea87cdc6c5d1e1a9e777b62f7d68438ff89ec6e980d1eb0445f941f13d10dec6c2dafdee2a826543bfb2b4fe23fe7863a27f7c13dba28cb60c80770cc04bd646e4e8f03cdb00c337783d986c6709e1474d17956519f0f5db067478a6eb068cb61e80671bc6c3c33ffab3e0ebed8f84fb2d597ce3c6db01fc63f0d6a62d7eb6507d425e56116048f19ce3353d870c2cb381708211ec7d85653fb9f152564c2726265d1de3016c66546513c8af8ae546d5f4639be566c95fa414a6a6377b4241483b5bd598fb069540a4ca8283a3f628a841e423d10e233991400021c06c95946c0f251a3e610fe8cfa34aab96a5bb265d24720892a0943f525638fb766d5c007bfdc0a4833f7861dbb1cfd13dd1605c361efc85fce0f719f1193cc3c1cf1803e1dd07720c3c67c37bf1a077e2e105deb36293317310eb874650715cb6166f68bee16dc03c6aa8c350c3914fe6704e7050e48fc7d74fb0551b8dfccc88ed1df4cc481e4448f98d9d821b69099e0e9f5f49ccf1e54661ef601bde20bed1c4f07df3c40fceb03e1e41f7d724bd7e931d0f8f9014360e5fbe1f38fe81fbad30197ca3c01846064406574909d7f96cccbbb3e09c8b80ad1755ab980414cf1f1f21c15c576cfd1221b1a1764492655fabb080705072b33f0a9179e9e9cb2e961243e8f194a1bd5a8a7811db89fd0645ec7e24f229674b6654adfbbcbafd5229397cf5ce84f1e3c72bf898251507060f74cc361981ab4beb20608602c230491e1a495105863ac223f59a6c2dc8a1420428ea0e6942a04d4be95a68db50e7aaca750a68ff7da7c56e60e2c11b3a76cfeb171b1701e352a08d8b29402a83b9fb9580111d5551c62494f07ca01137c9fb243c5d33aacc04c02b80be2b3cf349459003fd28827e08c0bb2021defeb4f5086f18c0cb4b3c2e566ccb3aa78e99f366aa10bbc66c5dbb1b22d16b408a20d11f25d1f7554dc914d1af1e55586b85687e6dab9b5d1b48977f1d7f674c856572cfcc82c0bf5250010645201790f13917e0d9aa5f002f53a9eaac7949ba419bdd4975f85c05e3d9063a37882fcb2e8b2a4a2f4b32da06d87a2b602a234fa55a04fdd2f1f5dc5cf3607c747864d44f723c7c467db2e1a8b6d10941cf864bf8fa03406d03be5632f8e2fedd7cfaba99d31f1262ceb153de980daa739f711c6bd4702c85ef8151e6ce3ea44a87739308c75a9164d9d76ebc50280ec4fdbc507ceebae5468d2276142510bc7a3621e5aeb4cb5f5b0321f878a73546b0f3ec9ba4da824339ba48d5a4e2eaafd7148063727f43112f47ef2fff1e27884447245c4ca27125a19297163df5c381c03917261a97645545b00cc62679039dff0e7907dea3493e283144fd2a3487c1d32506136767921844e3541a096e244cc8d955debb7b841b67f4e345cb9d1d10df518f841d6be4d0701e619d906492150f512fc6f51c656ec6d186dd338d9c2ee7948b991bb449b517ec4ecae13bd0ce6a14be519f0a15f177a09d95103e735715413781728924f9f59b783c7c123093d01a8b2f977092c557f8f085f18fc676d2b70f7d72e23450a993648192076388a9e64e3c78ae0d8f7f63dcfa86759f7cd9df91e8f92eb58b2e720fd4a829421323b133e9ea59f5398b742defbde3e09f40254577599f0b35de690da9515250d21aa7d7bed425583342c007d8a8fae03527282c429426da2520172ebaa5ec5cf7dd910bd60f4d342ebe71c8d2c74fbfe3dd1799edbf633c8bc1d3e7c31f819bc9e099f00b27c4cf1cf91b4e8c9fef3955fb2295c1629163e807e0b1be68f9c58ea3c69b083a4a9c98c281ab24f1c229e4d490c084a196906b2ea84c71bf378e0bb6bd3be5c31afee6fe373c3fc1f39595103e9f87ac86e1fbf0cd6a1cbe41f823bca4c7c3bc1ff66c3c4cf0ccf39914be4111e441e381eb7ee1cdd327bfb44c88efbf2e9ab61abc4b6b98ea9d246696fb0a55f474f32012129e34d16675d2657f131059a2cbea2f8805dc393aa729b871ce33b2ab360f3c3a2c7a76ea230a26e5d24a5575ca0055d3d59478c10c3a3c16072019065ce1e06ffcc0eabf23420470894021018b272c9dc45a37d797715cfc014dc3d53b98aefc18c691fb395a5bc1d34dc451936efc18e6f41066b60d8749263e9d2eebc73144c6b3583fc21ade6663a8de8f418600c22c455abfeb515831076c6534de983a871b19f17b4e4060c3c5df35bdb3bc343346801e12ff709d217cf36653ff6d684735fcb9edcfacd3d7e77131049e9a6c45c1c6db84fb2fca25493b495b94095ff3fad2e16519f0e53699e16cbdf9ef086fd478c449128e86af49b2e6e3e19f3f24a476427c93b5f501be9fbcfaba331dce319238507381b656544d611b6cb8c408e17d1f1ac6c22f493ba291655f1110c7fc55b42a5ab77b72fc428bb283868c51902b891d3ca0e24ae99352d9748e8210429515a685c78baa30fe040909deb4610332e1807ed801df275b108e03356c299cc8fa7842522a3a366d1a6b6a1bdceffdc48cac5c45402a0ef5bc77501b1676d4b751f48dcd5526fe833f0af08603bc30c04b7cf01753ee2ffd20e2c64b5f843033dee2861c87c65c1ddeee8edb9f5b364a885537ce9fb969930248aa4bdc58cc8b8502510d91bbb46e602462df1d503f77f71d22fe0009c3b8e8eb39300239ca0f7a369e001f72a7892423a68d077d6162959979dd717cd97c717c03545c81aa5aee1516a4e26a64047934ec234c3afcc68f8703edac84f89abc2619bebb7b6c3f78d915724d7e5977335d7486b60c76f119d52871a06603afaa652a793a7f6ca8392149baa4ece90f1b2e74e564b65ebbc6f4a33a9dbcb4c7e3525a589d3ac4cddf2f20ecd0e2c62ecfaf9f5d15ab9e8ffc3552b863be102b3ef87ae32c50651185c6fb1d1885ae05ef1b8cdbc0ab4cc938be063ae0ec61c74d65adaad0b980dc9a95592d2621f5fdf8bc875b7f22c4213bba0cb957e55eca73cd701633629b8c96be34e03960b4f522bd99511c9e4f36e23d13ee519907f79e987270251bf19e09c6c5798d355e1afcf3b32097582904d6c1b8ac1efc7dcf897f95ebe41ff32a56a0771daa00c0784e990720130119d3c11859f78eaa493201824359a6d7c9ee743d7df2607784fa586d3adcd3c07af6ae3e56fd2d51712371f3383a61ff0d7152749f0a18ad13dcb0a9569dd159c2179867011e0a7e70c4b4d520be682c6611e409e280549ba52bf7dd6343c66780b79711e45e3b30275972e361c16e0fbe262121bed18b230b2bef12e2c3ba178f72efa4dfb162d3bced10c85a839932c0385e7505b4d1688e1933307e0d8ce518404d57d776024c6ca197b5a291655f111038288970a064200fcace438eefd1fa2221d2bb37abf9c3dffd1b830e9a7c4ae9a17be9c042083d9532c935962fa99d593ab59ffa0239482420387058534a0a14ed56a99a544c9ab02d3c4e736dd25d6fb8005c22b050bb12d2299f5fdcefd85b846832b4c5c0bcf31b1897d1466f1d5c88b1b748c2910bed79f1ef4a7a6197b088e47970e1559037d4681a35fd60f2a7e2600431e00e79cf6b09068f6df879ba5757a46fe45c57d29d78e9b377bc243754f5c6ca6995b0e16a1981c08d878484bc5bb6c3f390f61ddd26f9fd36eefaeeb1fed4bb4f97eb29342c745a4f77a4bcf4df19b167319dbbb79e470334d5ffe4d37fc7e049c2d11eda70877ec30c460311deb9eabd041fdadccba8e1886923be2574db4f1ec00f27c437e8022c824f8c8f82976c04b9613ce292992a784111e441e3c103404b1a87efa2d367747b79b910df144cfbf762c8d987779863ba7dbccf03e3d7f08228b4819084020c129e733c43c75eabe8f71b0141159294400ed8d836afa25c8883761d7aea5fb6c69eb2dd5427164fade045c4ea17f0c084847aa40c3cf04229ea5db5fda019338428fb7cf3524caf5e8ba94430e508729c18d701a947ea4e5035456222655e0b75186aa771fd37155f8a171c9f3784387ee23983cf1a2025b3c969a75fd025f62d1e98ea692e3114b11b03b9bb6e0e480c53496270e02f2e6c07e0a9dff31b036961c3c6c88103612acb32cb73701922dee3e0a9f7e480c43015e6976fc41276d079d94a75bc9153a4d41e8af15877d992c5932e1562c16d9fbfffdd0ef502cab67ba55e1321c100529448c02db20e52dfa06a8b245528ee9dfe479dd9efd9ae727da76c4ebb23fbcc04e3eccf8eacdae608f20ce87faccdddb825398afd5e0c84f1f3180c5b835f409cb30ecf8bf0566d2f82bc04da61c05f27fcc9e2eb3120d9807f18e01725856fb62f823c4383e7112a7d7d992454c12ea82aa10baa609e70bd353227191f0f8b13429e832b31bea5e11f87bae7d8077ff9f7f4f160abc5f55ad941d5d570052d12106ab3c067241c18af863901298d3b128e0ca81db187653f1bd15d0e7ffec269f76fdd26a9e2c591655f7f1dfb340c7fb9eed38e7d1ea05befbaf1844bfa834a81c79d58d3f5766809d4ef410dcf939b31d44438c27bd2cb0485c121028bef7384481b94bee1cc0e0d1ae7c2f0acae733605788d6336246f9c193cb49d446df81c6d1b4e627849bb2726345a12dee358f661a1eb861b1df15e0c92c7a8baa9ee7d318591b71f9806e9f82909226c28f44ae13a65d41d932d84b97b93111d4614379e4b58ca3a6ceef4f129c26ccb209b1ec39fad676f1e13dbfe087e0ef08d30bec66cb3cc481e940d37c17c35b8ff8cf84669feb212c14f1a5fbfad445f5ffe7da2e36bda27c375a7019fd38879fd363c1ed1002339b31d96656d39f3fb4b84f86f97c7ae1f05aa27be3ec9dbea13bdcd039fc9db0a6d1fe814a28d54dcfab5c55e967d2d81600d3c6bbc2aabdb8d271edfb6af44e180f4c2ec6ce10f6cc36cb2fce62fa64b6dfa5ccb6333e494fcd06a49e9d46239a89f55ae40dd208a6e38b0357de073e6474d5e3638b0195017409d0bb593f410e805e090ca231f6a49d8ba0ce993e7ba21670ce9ddf7b977e533b345bb666e3a787f6e28f576ce819902bc7c3a66e08882ef90470e0990060e330738b8a94c22f4020805c02b0078c8e13a002f1be03900af1fc083d131a9d0b8caccc0d965aaf69a59dfcd1f3b4788ef1efce22d37e7955b304710e604229515ba3fb2eccb6803411d72046e2624093517fbaaaa90942c4b9e5ff8f87629011f7ddc690b2f973db3beb1cadbdc1e879f0db63e5f7664d8c619600bf15424163ca7da0520bfc2bc490944a9140772152271dc20491247afaf03bc2a958fa7ff8e70862f9754c9f696789de52699838b2495007cfd39b8747c4d7790737c4ba85d00ed8c84f0837292f1f1b04833a0e019727055cc2d5bbe42128c31998fce78f2cfb10be9dead5059dcbc24ae205954808abe1ace354ab904eb95182134a2a35b3ad451d4b020abb6166a47ec65d9c7048422ad5132c0a48af2e06cdbace3dcedad843860c94157fcc90d04f4eb3eed584dc9e9885eaa361c98d677a122f74ef4832e3c2cd78df45ef3c682d71740a01837aa9331e946a89c40844e00001c4c494441548f563511103ec0af431d2729c44a41d008e8cf63fa79b27960fd8610e7e5dd34e5afcfc8a9989f3a6ba01bc9cc23598dc66538e84daa01cf58cb23bdd5f7a6acaa5e1658077eaf36ca545fe4b80df032009e03f0f483df3b386cf87d1ec0d3dbc9a6e93644bcd75d573d73abdc80635e7bf4a0e72546f56323c5b4119173830d59c5084715e89089a383e474987433f2aeaa697d20a3a18e742d5968f793fa0d3d52129a50e79473faf513222ec2fb3ce8474b357e487e0c4e249e0a86cf9b1a9781e24ef89d9a67ae82290960300cb6810446774bc737c96cb8088fd2aa9b549e0c7e10befc8ef012dd0943f0bbf80322c805e2c79d46b88a36d9f1c880effd8c500c5ec5e96597af3c5c88f71f7dbaf8898142ec7ca1f48b5d23142052ad628e3e24202a6da6a8445b0710125ad7a8ba02491a8de5513cd710d302a81df133957da4c2f2b98539f0392a3fa46835fbe5f7aadc2b69eb2745be5fe2c66570916f38a6232711d08e871265ee726daf3cac26679110bd1fcfbebef72dea498c4477534dc4ea54a8e1e0c038120c34a4c875507d910405dd2042801fd8896bfa1d7b3e0484c855ad5dbae9ce4fdd9bdf52e7a7df606789b8c86cd93311a7da493e3256570d7891de8e0e8fa98a7c11ea0655d170701b0dcac1956c72442f729cc163eec64946bcffd86e45e9e7cfc943ffb29a7198b4323ed23f56b37b3f303b29cf0c40eebd90a286447f4d7927fc81a312a3dd39db8f8e397570f7cce110f7e2b079f4bb4367b17189c6f797543c6341c56b52c1f0e4a449469037a092dc337c93cdc165c697c38736c00b7267770c714b368f0351e3da08156dc2f1f0abcad4f75b0b7e3c7ae65942bcf5a2ddfb61596f5bfad3573bc0664b2a299028785257aaabf5e729fe23ee8efed83b794034f608199f9fadec2309048bcf688c072a06f649dadef44f2dfff985e4d8da2c3fe4d63c5b7e38445c997a968873df0511d0a6fb007201a6a380c0e79d24cdef2244bb778f18786e0f210e3feae84d4d25e7b86ae3b7abbebd50bd0f250fb1595538e05658c79328354a1e79f09cc5fa63196ae061425d549df206d4b25f7f98611f7987241ccd1e6bf9d23b6fc7f0bfc6bd09ce1a692982d98e386d8585973e3bd6ef38ce477d6e037d2ba1cf15073412daed54d8a4275930d54891d07b65c3b89690224f00bcf3005e4b801706780efc3a03e0091d3fa62210d00f0f3fa1e3c7eea7b0e17e8d0ce20033a09731bc4b5bacbf64865c4fe3a63e71fd9beb152c727384ab91dd24746ea9ac84fa23a8f17bf072418e8e6c2290d9a01eee5b201516f6240c354820d65a2901bfb7e02337434297bb8f1fed322e299bd2569d7a6aacbf5ba0bf27417fd702ac0ce8979a37baaa18dafe7156e3d142cc85b68297cbe0d9d02e61f06d9d538ee3c4117e18debe36beb77b8a6f9c4a2a0cbfcb80df69f01bc037231e5f092f17da1abc24f05d0bcf69f88acea442cdd84bf8561c54b1eb93ad35df3d23c4c42b9ffb6fbe3c0767df38615aa11c89bac2da372a4f56cfa031bcf272a8c1468b2a2bba39b55c7f9eaed406c983ae1960f11e941b1025e7b0f899cbbe22206b55c50f54aae1407603fd36ce5bf5df8a17e4869b7fc2ea56f32547fe4adaf893dc3cf799a02ac19bd73c115e9125aecaf1bc7e6cb76afa5c8bd37af796cd6f7b8fe8305872a8ad97dd33e75a79386cae7eb60e0e882824d32333b30df88d66fdb0597f4aa0ee9cb89f2120182e0169b1bb75852be90c3af39ec71e7958f6efb5d4290fb8aa3557b4ce8bc33b0b44e1525da71ae83668f2563224eff379bf08dffd0628723b002f1be029afae71e0d5956df09b174c0565ba002b0bf01d872a02a6d20a5069543d5df1c98f438578efdc27434f1f283793a89a500984826c19c8d1018120f747cc828c6ebb702f0ca9acd05f1e37e44dd0339bd5c81001d10ca1a429d77575a4fc964552223eb453f727af7209d349e2fa1603ddfe820d299bcd9bffceed0c18970218171c67d5f6bcceb40baa8c49128bc88b4d87ef8f7f2881b682674892484917b97b31c3d7536922c3e24b9298781d9bf035dc116ec2374e15aa8f8747a8d4fa32a8b812b8cd17c17309c763d103d35b3db750128ebf8fb8ebdd1be4e1ffef1dcb773daf3acc250db2c5c14da74450eed63f47c607555c787f0dd970212720b9e9a2a4910bf55a56ff6c655f4b203a6feb3b8051a5e346924746d7dcba4812920e83babe78b514c9acefad1db1886cd3c499379e5ab0a0534fbfa859e55172223b457a2de9fa8dfc608bf871999c98adbbd76f2d03ca4d8403f1c40e00a123c20747381188e9ac4649a3ab10170eb975ed09238438ee8133ad31f2fda1d294f3738a85d9f6309a38fc5ed08f30f4836f1085add948e7403b57c1838ba54c07465080176ef42230daf6f319156d784a1dfc4cf7eedb881ebcc457bc06300675ebaa1fdfb64d888faa47e53f9a2e259089eb5fd90ef7bbd4cc5775d58150a32482840475c84860f09e179438d046862a0030c247bf861a3839ea890d6dc650b846f5b2755b46b917f6742aea1d71df9b3eaae91167a7094f7a4932dbb037cef0b6305d58a534e33970419527b1e23c16a8e78c362907e021e140f8b6d6363318050de34bed5c6823fc0c866f4663f025781ec391db20bed90c5f6e7c2f315c5065769bd7e0572d2e9fb74eaefcef7a177ef0a29ce79967bd37eaabff516fc0839e6e38854040b46de07ae4711d14df012a2b6474284d3bbbb08e240e18005dd92f7efec0682afb9880709b001192d150838ac7dd78dbab373eeb0ef89107677eb6fb39b9e1ea9b7d73b69bf77e2d898ab15fc771140d6e3c1ed8967a54faca0cf99e0ed33a77bae023f99e493dffe3265dacaeaed8b25a1e183b976c5982ba47c28fa74219cdda923368726bf359a9c70a3170c4b067c352d239befaec7f3c2027b669a4e588a7fe251fbada6ad9f1558d3382b1600b3a0b16b05f62009c92f456f2e00d03787989c7854b0cb8710c0158283194ea91b7be48617ffc0a124001f0543f82af7885a29eafdf56d7ad5c4a8c859fbefdcc637f1262f5b8ef66fd78bd7a0275c1d540389063ab423f79241ce82f8f5e56e8fe88de2bb821d1f88812ea5ca81dbd26f76f201cb46e60bdbb12e8c6b12b2f5c7a8f94b05f3ea1c9204990ac2facb456178b78d5870db0800c41db81b6c7308d86e7543b0bbc14e7f99c0f54db8bc3d0e1d33e22950bc0c7f887c632180d1b9b050ff84c94665fc39718435cb70c3e6314397cbf338603fdd4e163c4bbe72596110fdfe42556dea6ecc3e27652d2387c7ac757e53a99d2fe8587dceb017ebc6bd93f7f04152a19b7c1890319962a8c244723394a1ca05245c281120a8783aaaa08dc881a05c9c3678b43e71f5bece362edeb17c06be03d3c4e03931ea681313b1db2e8ba92c785b7dc367f4c441efcebd3c79c716302a0e835918f1c056e3cb0b4302f1df937f6bdc854df5b4ba03ddd4a738d5091acda794bffe306dfd43ef68d94546a5b57d72e7545c86662612cf9e3fbd1735ddd64ea75e9d9ad1748c2715fb3b4e3a4089a529ef6f7134e907d3a36f4524f0bdea4b0092bfc8833d217348f1c1fa9ae26153d415564764b74183c1b5af9f09c7aef48c0a3a7cfcdd186e7f2015b354e4101592381e3ed0957a8261f399db81f23ad6206cf4e342e91136bcfd875bbe4ecc6bd3ffe09294b2dba67fa8c15e025558b374c822451b156d5e570e0574c55352728da8d9022ce888e81573ced35b27636d4d84324206ae42969273a6de0f5022ea332a0e2baa7064bd6a0d5d5ed36bf005e355a31a878e2ae12566d1ce791c0680cb362b7e1906dc3e78d67501999e68d477c0b7695b23f50af61f8843f5b7741f8227c5b87e7c13748508dc5d7a25974e06f0c5eeddc9aa1dbde938ced811b577dfd8410cba7cd9d3b5dceefe2dfcf18ba0a24803a8c2fc2b000583f64ec46a70dbc89146d17d3f43649c4681c47af2a804757d0a2b11c53eaa0713cce89c3ebd9fe28fb8980708e8d3878880b41ef28370bad5b9acc16e2a4d0f965279e28c4116d7a9e3b65977039aeacd08c04b0935dc818998d777af7b496a8e78c0bcd0678c87939f07bd5ce5407a0dcbe08af51073f7172f970f0636ea825a45977183c1be025de807c1cd086b4c41adfe0b8e081e1c1b313e29d0907fd126b493cbcb87ee804d10e509564423f96f8c625d6ae3bba7a52694f213e7fe2cd371fffa79438ae5f70c5fa6eea41221c58a3bba38af116e519d0863ba3c9f8788ffe3b525d419c10110ee6b54204841592aca107c418a1f7df59aa4e4f97df6d4fbdacc59d52527df0cf47bcbe5b12971f9b34397b5642b0e1186c0341250913d7df12603c928fc8ce0f800f8c888f21083ae8f708de1ee08bed86096192f856f7ad18b16eb41065af95e62d1c24c4da9edf977cf59510dfffcda95bbe5ccefdb0fa1f78ba7fbad707af65c0005538e0719dd1454e6cbda2ea94240cf41ac414242ce0b50e08d1af877060d95f04c486d7e5eb3512129f24d244d5cde4c171f6eb43bfbaf926210e98dcf6837b6b1b78879f6381cf6921ab8d96091c1bdb781e8e3e0edf8196612383e4b3c4d20e7e12817df0020e7edf01dcf00649000fbe050e3f0c07bf6ddc70221eef2424869e498d8b0f1e7bef4838107ad281107bbe7c6259ee7229ea7fb2e3b5839f1d21c4c693579f5a5aaa20d2d5c0b82181d3ab0209a37c34d4cde1f37bf4e790f3abe191bbe8b6cb7204910ed916890b7cce2511cc029d02eb192591a6d708d17e52e72eedfa0b714ad5a54fbd7fac7c664cea573dc618e0c7dec118172eb10e03c685136ce3fa0b98b7b0228b494b9241490d6d80e749503640cd07787663f0956d0bda084fdb17d173c4e31139af911935f76dbb45ae99ba9adc2d72c757e6eccafba1ab9428c4c6c3dc388c1f1e5d72ff324920567fb160e5065085f20be47c17ce2121e1f7f9b01a1916f2ea83f54636b74ff59a22cf791a76765f8def7e22241c36d48ed8cf657f11102c0ebc16365c0809c9c3aa46498436dc89aa6ede498801cfe755e69508d1ca6e97769f7b80f4b7ee4bf9d2fc2adf42ce018e2d7fcf2406d9b2e1398535a492900b3e1fe0393a3c347a82ca2ce8e0cf018961fcbe95188c9ce71e4a0cc62ca8744018086026a962b2dd0db161c1aac953ee1062eafd2f968cdd2237d55335a328391c120e4ce980c645201095a09aaa28811a545864f3c0da94b204bd590ae3474a78571507dc1f432a5a6c2363849208aceb26c818fd8f109dafeb73cae12b84e8bd38fb8a172f97cf1c9ebee1845d0dbcc42f61dab136635ccceb5967e37ceb399091311026801f7db07eb49b4266e7275b2f9e7f913ca85ffbe9ab457245576edcf5c3767990d71d53f38d6b634c7ba7c989ee78a4ce6b729b2b99a57d956e357954b64f4b3fc35561a7be9a36d3d540847e48f92e458e636453dd37eebc45fe5377b73bff7503aa8b5d9564ddbdb5396ebb6af0ee27dda499a57f5edf7fcb9f25c3f1fdea66db24618e4cab1b42778023c78e71122ca54784a5efaf67f7c3d0818e8403250396361d3f4755a9ef9e8ed3d8f3a7eb35bfbb9cd6a549e2b0a176c42f54f63701b1e1b5b8e48157456fac14d86828fa37295375b335aa766d23279f77f16dfde5001f36bffb09fffe56c23825b42866943415cfab44bd3570e3b1837fffa98a748981ebc23de3a281c3f71dfc98fd75b07a6fa0c460033cc3c1cf556806db4b902a11fa119952fbfd8e51422cc8f96ce9c85e427c73c9b4260b2f553fc4540cb54cc4279515c66fa0311209489eaa2b5bc2ef180748120712103c60d0680e88373a4b293c479208ae6bb489c4a9b2dc8237663695758b49ad171df0b41059b75df5dcc30fc9cf8e6bd9fad2850dbc0bc7196d5cc3603ddb64fb53d824cbb8980807ad8bc4b6c5e898e83dee3cfc74cbcaac09b709317bf3fbf77e2c39ef9a77ab5a2381a7ecd8a822c403d1a48a0992f84c05558dd0539a3f06bf9ea9244d0403e3c37c3754627f0c81a73c7715111aac9150601bc7e30b563fa8f7e397575599cafe2620581c783d974450878c9208184b9b422ea2780eeea892df3dd6ed2d218ee973ea8dcfb595bfc94e7bbc6bd706de693389616f5545392213e029c2316c2f554539f0fbf12431c0d3c9a98a3cce9071f8811243e283df67bc25788d3c90b00001ab4cdb55b2f26521a6f71b33f8b94142ac5b5b7cdf46b8cf05ef6f41af28ae2bae42c90309c7eff436facfe3e7fc821d9fc4f173e992e179eab1a32a7e23661a787fa5dfa66a97d38ed510b0e8aeeb339ddc19d77516a2f5651deebcc3f502cb12592989bc253361fdf9254cd3fad3b08c9b371b7e8d8c87056d058fade7dae6d54fbbf335ebbcf7224f0e940464d0ca8f36429c0c2718940980dfe5cd6e7e345d1d1dc859db7ad3a77a849a130eba629a110aba480c250f7ed531339a930481eeb568f4fe34f1f344a8b8c4838ccc170ccf30eb8f2d7e65e5972220581c55190989ba5849a44352bb74b8e33c9ddd7ddef42b210e38ba6daa1b887852eb0beaaeee2844abefdb3d79ed9112f6ef43a52d2ff0bfda7830db49aaa08ae1fb9e012a013341417836c0432fac868dfb6663a52e998c037883c17b2a799db80df06036e0bde3008fc181de2fb1bca9e5cfee9cb0e43f42ac7867ee9913270a316fc347b316b869f41df1003f68c8fb84491ca4b262de2adc8b8a9e0337dedaa374f868f44482810705cec0cfe62f0ff07c84049c455220a0311572b5e19dfd2499004171d773ac2dd779ef36d9d13edb85e8d4bff7c45b8f93cfa6349b7dd25d09df1d56ef6ea4d7958111e0eb7973b8e483896592d9bfe98d4563c7aa5fd2018ac6622018949b099358a24a0725402e8920216964c474b430f1f3bed433d846c28504050809d9c0b8ea88db401ed09fe384019faf636d7e11192794bcdfbe6cb98ef895965f9a808455e5db70701422e7950a3611748f4c3f1b6a20204d58ed66b76d1fca38b6dd22218ebd7ac0ca6b5e17a2e5e96dbebea052c2fe38e5cd56d76b38d80a074b3f3083365e26f3ea1a0c9ca07923db002ff1c18f5e35681c35d9364c07bf4f05e56b3b0c9e0df0d4f7a05a6bc0ed1302fe40e2428ef4b19a9ea512e3ad9ffc9839e32c218a2f9b79fd74f98bb5cdbfbf7f03dce4176157c6e2c153fba3aa310090a7a9f6a5b166c9e3f84155cb6e1c347a55617b5fa9046c55914a0bf6194a22b4aed1c88e5e88404888419aadd74de5e77dcf1ff8e619723c0f4b3d6ade2d9240a786d29b76a98e7bb78971e15e7f06e378dc7a89fdbeaa7877c6f24385f8f0af2fbcf7d0003987436b3f22f767640018c1e7354a8475ccbb881376ce69277dd5aac37e8f6d4e4870fe1921a9e777e1f7d7db51d6f6d559ec775c1565221836c3b7b1aad35fbcfcd204048bad2ada700ed4209c23c7461b0f75caff50751ab8ffa69fa36abef15cf7e096d7b4296bdd5d88eeb3fbbdd2e72a213a0ce8f2e4f9e7cb4df942cb97dcaca9a11742e9cd9b37a8ca11f1d8c5490ce3e1533cf88be27e9dc87dd70178d90c5e36c073e0536d63d3c1efb36518085631b47b1a545c49aaa0eaff50bfcee520abca77b75c2125c1d259eb87cf6d21c4bacb8bc38bda09b1b2fe9bc37f7073419d1c9d100952013077c71a20e4d518498e5e2aa60389130ae6868b1ca2cf5f9e7174fb4d97eca88aac6d7f56750ae43e42552d7921028344eb1925136cc7ad6bab87f559b3c992efb8b17fc7e3e43ee8d0a1736d7fd9df961fb69978861ce7d4caf45d47ac4e5e051ab7de62a742746474b4eb7cf0e584ff5e7aeb07426cbc7ed588cd2079d432af218a6b401b15c63540bb0a02e55045c9bd8be88a602d8d6123ca70f63bd6364a24cc1642073c12166e8b40c26070f32655145799fdaf2118bcfc5a08081647557cc385e046ae14f0d622ef16e4e0b0c68d0684c5c7d1dd0e6dc829e3ba0ba7b6489bdd649610873f7ff42387ad10a26ddee157674889a5e9a52d7b1efcbc7cd79d69fd9a3f21eb05a9bd5db76271ae382d66244d17b70b298358d789d6966ba65e635d163357cfc4ce58eabf6fa31fbbbc9e351d7d73a01c27ee73793df97b554055261ea68d1d3b4e306f98f8a3a545c14868f00d40c88354227f1400d1528a93e9640c8d7d6e5d690d72554c91eeb52fbbc6ceba3135356e246cedef6aeeadb85b888a93767e503641884da135976ce821c44fafaf1ce0065445cba2371087851bcaa0cb454242e9f499b7091110943ce0ae7a327aa34a04dba7eb9f73a324e215015b0aa620f1795519541efbbc38aab2c01d3934186a201cb89e7d9209aab8205e240dd63512942693a18608658ca3727f77c83fbb7ed05eaecf76e7747a24a3408803fe79d0968e574bd80fa51f71e005f25d57a655bb0c53a87d685e6c9fac1617c5d6e36a71ad0b6377687b97b5f2bfafaa26f4f902c697e21ed046850404558ba86a646ed3e8d6ca0908a98ad841baa72a459f0462806bb2b9f822ba79cd0810ad2b0e2fcaf037e0f3db2fbf360282c55115b78dc091e88b64a774ed2099e0c6a30d88f524f81c2384e1ea5b4af3ce3842dcd0a87a203ca08d040efc9de880301d509e1403c54efcdc2f566cbda9df151827f2b31bfac81889124090dba3e1c6359e769d7bbb90b19271aef5f83ecc5d05d996f906ffc5c61bf0b0b6400d0c11caa674632632486c5d23e1f0a970e1c2b42613a1fd28fb1d3cc709145d5b10d26be6f6e071dc502301a13bb7d1c681b6282424a8620406006d56e4ccc024443a786df6fea8d8b3e2c0efb3d8e700df47580ceeb151ae5ae370b9e483bfe34e00765258ff064bea2f8d80a184551505fffb7a68a36da41e099f03356c083ad06003920a05366064a0aae9c22048934c04086be00029d0110906236016a45ba65c48904c11d2047a0707271c581219437fc1421bc881f69dd0fe5055f519f0f965d0462323777fc47187f18d407a6a1e7055cbef35b8873d87aa29ee1f8fb60d788e0e80c5806f0eb47f2dde2b8eaae8a081839a0e1a94111f60cfc37a8b02475f0f1c7e3decdb08ac331cdfda93549d066d92d4611e8880601be0e3bab6eed4d18ef685f7fd0dde8304e478a8e1fd35f03e5235a2c4c19c1de8aa55945819e72eee177b548c84e633f61caeef0758db81f619faf74420f0f3fefae7bef7ffeadc6cf775f9b54a2058d41546640be1b612baa0894b26c8713149220db262a68277174a22292c9091736c248120e140a328e0451120889f8960fc468a89e38a425aea7abcc9112513ee478fa91e78ae206ca36482de52dfb1e7b0662a325299e1c6e64671201ce2661dff5f5d715485f122dc7984d617974cd8ba4e05556c1aac677e711aad6b6088683da35718638cf8b50bf52c4e069d2188016092087762e0dffb22aa11be2db4b2c792475071003e974cd8f77cddfcff235134b6fcda090896b0aa9879db8b0076544d073c2728b86160a3a5409a6fdc70c499618dfefbb0517d2a2cdc70600c251516120e5b47ffd74a507c1b83d5dcaf9e0e6c6efb084a01c1b2dce24152f72c7c0e048908467ff67ee61f6f348a23e108881cffd594b0aa685ddbd0b6f49ae2499071428282eb783bb471fd1a6c2bb4aeb9ea0a094936c30f19049c4f1637c1bdaa7ca93d3070ee741d8e31cea1b1c56175234bd0faffbf12547e2b04841747559c83f3d94c70232201818d4784856d241fc1e01b0d37f4437a5b200119ccf0b493e9ccafa038ac86c28dcef5ff85cf17e9df932d020ffe00b7c7084b3181924994fbc9f33aace3f98bdb367eae1256156790b05f5c32a15429b85e0d0c135fbf21b6fe79c4bcc5ce036e1ce671124448b8a4c9920e22e1f125a774f4cff7f8e076f6f2f7ff57f6b0fc56090816aee2823679baf7841a0f7eb8e8c5ba03da904f9f36144814a1f17a9b366e2fd606b74a52619da2a3479fffca4b14dc33c558f6c538fdfb285c901385c0309f3be42068ff57afebc71a3e8700d1e8013a1cb26160bb98e1395cfffc7f5de10c098c0724bbf1d61facf310ae532619a3b797f51eb4c71bbe5f92f8bd34efc83030b757f2765bc83e8775500fb632b84d9f728b91ca2a47fc5ff94d97ff170000fffff898dda83e6a16740000000049454e44ae426082', 'image/png'); -UPDATE Product SET PictureId=10; diff --git a/samples/core/src/main/resources/db/migration/common/V0004__R001_Add_batch_tables.sql b/samples/core/src/main/resources/db/migration/common/V0004__R001_Add_batch_tables.sql deleted file mode 100644 index 980d37d43..000000000 --- a/samples/core/src/main/resources/db/migration/common/V0004__R001_Add_batch_tables.sql +++ /dev/null @@ -1,81 +0,0 @@ --- Autogenerated: do not edit this file - -CREATE TABLE BATCH_JOB_INSTANCE ( - JOB_INSTANCE_ID BIGINT IDENTITY NOT NULL PRIMARY KEY , - VERSION BIGINT , - JOB_NAME VARCHAR(100) NOT NULL, - JOB_KEY VARCHAR(32) NOT NULL, - constraint JOB_INST_UN unique (JOB_NAME, JOB_KEY) -) ; - -CREATE TABLE BATCH_JOB_EXECUTION ( - JOB_EXECUTION_ID BIGINT IDENTITY NOT NULL PRIMARY KEY , - VERSION BIGINT , - JOB_INSTANCE_ID BIGINT NOT NULL, - CREATE_TIME TIMESTAMP NOT NULL, - START_TIME TIMESTAMP DEFAULT NULL , - END_TIME TIMESTAMP DEFAULT NULL , - STATUS VARCHAR(10) , - EXIT_CODE VARCHAR(2500) , - EXIT_MESSAGE VARCHAR(2500) , - LAST_UPDATED TIMESTAMP, - JOB_CONFIGURATION_LOCATION VARCHAR(2500) NULL, - constraint JOB_INST_EXEC_FK foreign key (JOB_INSTANCE_ID) - references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID) -) ; - -CREATE TABLE BATCH_JOB_EXECUTION_PARAMS ( - JOB_EXECUTION_ID BIGINT NOT NULL , - TYPE_CD VARCHAR(6) NOT NULL , - KEY_NAME VARCHAR(100) NOT NULL , - STRING_VAL VARCHAR(250) , - DATE_VAL TIMESTAMP DEFAULT NULL , - LONG_VAL BIGINT , - DOUBLE_VAL DOUBLE PRECISION , - IDENTIFYING CHAR(1) NOT NULL , - constraint JOB_EXEC_PARAMS_FK foreign key (JOB_EXECUTION_ID) - references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) -) ; - -CREATE TABLE BATCH_STEP_EXECUTION ( - STEP_EXECUTION_ID BIGINT IDENTITY NOT NULL PRIMARY KEY , - VERSION BIGINT NOT NULL, - STEP_NAME VARCHAR(100) NOT NULL, - JOB_EXECUTION_ID BIGINT NOT NULL, - START_TIME TIMESTAMP NOT NULL , - END_TIME TIMESTAMP DEFAULT NULL , - STATUS VARCHAR(10) , - COMMIT_COUNT BIGINT , - READ_COUNT BIGINT , - FILTER_COUNT BIGINT , - WRITE_COUNT BIGINT , - READ_SKIP_COUNT BIGINT , - WRITE_SKIP_COUNT BIGINT , - PROCESS_SKIP_COUNT BIGINT , - ROLLBACK_COUNT BIGINT , - EXIT_CODE VARCHAR(2500) , - EXIT_MESSAGE VARCHAR(2500) , - LAST_UPDATED TIMESTAMP, - constraint JOB_EXEC_STEP_FK foreign key (JOB_EXECUTION_ID) - references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) -) ; - -CREATE TABLE BATCH_STEP_EXECUTION_CONTEXT ( - STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, - SHORT_CONTEXT VARCHAR(2500) NOT NULL, - SERIALIZED_CONTEXT LONGVARCHAR , - constraint STEP_EXEC_CTX_FK foreign key (STEP_EXECUTION_ID) - references BATCH_STEP_EXECUTION(STEP_EXECUTION_ID) -) ; - -CREATE TABLE BATCH_JOB_EXECUTION_CONTEXT ( - JOB_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, - SHORT_CONTEXT VARCHAR(2500) NOT NULL, - SERIALIZED_CONTEXT LONGVARCHAR , - constraint JOB_EXEC_CTX_FK foreign key (JOB_EXECUTION_ID) - references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) -) ; - -CREATE SEQUENCE BATCH_STEP_EXECUTION_SEQ; -CREATE SEQUENCE BATCH_JOB_EXECUTION_SEQ; -CREATE SEQUENCE BATCH_JOB_SEQ; diff --git a/samples/core/src/main/resources/db/migration/h2/V0001__R001_Create_schema.sql b/samples/core/src/main/resources/db/migration/h2/V0001__R001_Create_schema.sql deleted file mode 100644 index 89ac7706d..000000000 --- a/samples/core/src/main/resources/db/migration/h2/V0001__R001_Create_schema.sql +++ /dev/null @@ -1,136 +0,0 @@ --- This is the SQL script for setting up the DDL for the h2 database --- In a typical project you would only distinguish between main and test for flyway SQLs --- However, in this sample application we provde support for multiple databases in parallel --- You can simply choose the DB of your choice by setting spring.profiles.active=XXX in config/application.properties --- Assuming that the preconfigured user exists with according credentials using the included SQLs - -CREATE SEQUENCE HIBERNATE_SEQUENCE START WITH 1000000; - --- *** Staffmemeber *** -CREATE TABLE StaffMember( - id BIGINT NOT NULL AUTO_INCREMENT, - modificationCounter INTEGER NOT NULL, - firstname VARCHAR(255), - lastname VARCHAR(255), - login VARCHAR(255), - role INTEGER, - CONSTRAINT PK_StaffMember PRIMARY KEY(id), - CONSTRAINT UC_StaffMember_login UNIQUE(login) -); - --- *** Product *** -CREATE TABLE Product( - dType VARCHAR(31) NOT NULL, - id BIGINT NOT NULL AUTO_INCREMENT, - modificationCounter INTEGER NOT NULL, - description VARCHAR(255), - name VARCHAR(255), - alcoholic BOOLEAN, - pictureId BIGINT, - CONSTRAINT PK_Product PRIMARY KEY(id) -); - -CREATE TABLE Product_AUD( - revType TINYINT, - description VARCHAR(255), - name VARCHAR(255), - pictureId BIGINT, - alcoholic BOOLEAN, - dType VARCHAR(31) NOT NULL, - id BIGINT NOT NULL, - rev BIGINT NOT NULL -); - --- *** Offer *** -CREATE TABLE Offer( - id BIGINT NOT NULL AUTO_INCREMENT, - modificationCounter INTEGER NOT NULL, - description VARCHAR(255), - name VARCHAR(255), - price DECIMAL(19, 2), - number BIGINT, - state INTEGER, - drinkId BIGINT, - mealId BIGINT, - sideDishId BIGINT, - CONSTRAINT PK_Offer PRIMARY KEY(id), - CONSTRAINT UC_Offer_name UNIQUE(name), - CONSTRAINT UC_Offer_number UNIQUE(number), - CONSTRAINT FK_Offer_sideDishId FOREIGN KEY(sideDishId) REFERENCES Product(id) NOCHECK, - CONSTRAINT FK_Offer_mealId FOREIGN KEY(mealId) REFERENCES Product(id) NOCHECK, - CONSTRAINT FK_Offer_drinkId FOREIGN KEY(drinkId) REFERENCES Product(id) NOCHECK - -); - --- *** RestaurantTable (Table is a reserved keyword in Oracle) *** -CREATE TABLE RestaurantTable( - id BIGINT NOT NULL AUTO_INCREMENT, - modificationCounter INTEGER NOT NULL, - number BIGINT NOT NULL CHECK (number >= 0), - state INTEGER, - waiterId BIGINT, - CONSTRAINT PK_RestaurantTable PRIMARY KEY(id), - CONSTRAINT UC_Table_number UNIQUE(number) - -); - --- *** RestaurantOrder (Order is a reserved keyword in Oracle) *** -CREATE TABLE RestaurantOrder( - id BIGINT NOT NULL AUTO_INCREMENT, - modificationCounter INTEGER NOT NULL, - state INTEGER, - tableId BIGINT NOT NULL, - CONSTRAINT PK_RestaurantOrder PRIMARY KEY(id) -); - --- *** OrderPosition *** -CREATE TABLE OrderPosition( - id BIGINT NOT NULL AUTO_INCREMENT, - modificationCounter INTEGER NOT NULL, - comment VARCHAR(255), - cookId BIGINT, - offerId BIGINT, - offerName VARCHAR(255), - price DECIMAL(19, 2), - state INTEGER, - drinkState INTEGER, - orderId BIGINT, - CONSTRAINT PK_OrderPosition PRIMARY KEY(id), - CONSTRAINT FK_OrderPosition_orderId FOREIGN KEY(orderId) REFERENCES RestaurantOrder(id) NOCHECK, - CONSTRAINT FK_OrderPosition_cookId FOREIGN KEY(cookId) REFERENCES StaffMember(id) NOCHECK - -); - --- *** Bill *** -CREATE TABLE Bill( - id BIGINT NOT NULL AUTO_INCREMENT, - modificationCounter INTEGER NOT NULL, - payed BOOLEAN NOT NULL, - tip DECIMAL(19, 2), - total DECIMAL(19, 2), - CONSTRAINT PK_Bill PRIMARY KEY(id) -); - -CREATE TABLE BillOrderPosition( - billId BIGINT NOT NULL AUTO_INCREMENT, - orderPositionsId BIGINT NOT NULL, - CONSTRAINT FK_BillOrderPosition_billId FOREIGN KEY(billId) REFERENCES Bill(id) NOCHECK, - CONSTRAINT FK_BillOrderPosition_orderPositionsId FOREIGN KEY(orderPositionsId) REFERENCES OrderPosition(id) NOCHECK -); - --- *** BinaryObject (BLOBs) *** -CREATE TABLE BinaryObject ( - id BIGINT NOT NULL AUTO_INCREMENT, - modificationCounter INTEGER NOT NULL, - data BLOB(2147483647), - size BIGINT NOT NULL, - mimeType VARCHAR(255), - PRIMARY KEY (ID) -); - --- *** RevInfo (Commit log for envers audit trail) *** -CREATE TABLE RevInfo( - id BIGINT NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1), - "timestamp" BIGINT NOT NULL, - userLogin VARCHAR(255) -); \ No newline at end of file diff --git a/samples/core/src/main/resources/db/migration/mssql/V0001__R001_Create_schema_MSSQL.sql.mssql b/samples/core/src/main/resources/db/migration/mssql/V0001__R001_Create_schema_MSSQL.sql.mssql deleted file mode 100644 index 687e07e75..000000000 --- a/samples/core/src/main/resources/db/migration/mssql/V0001__R001_Create_schema_MSSQL.sql.mssql +++ /dev/null @@ -1,135 +0,0 @@ ---Rename this file to V0001__R001_Create_schema_MSSQL.sql.mssql if the database used is not MS SQL Server 2008 --- This is the SQL script for setting up the DDL for MS SQL Server 2008 database --- In a typical project you would only distinguish between main and test for flyway SQLs --- However, in this sample application we provde support for multiple databases in parallel --- You can simply choose the DB of your choice by setting spring.profiles.active=XXX in config/application.properties --- Assuming that the preconfigured user exists with according credentials using the included SQLs - --- *** Staffmemeber *** - -CREATE TABLE STAFFMEMBER( - id BIGINT NOT NULL IDENTITY(0,1), - modificationCounter INTEGER NOT NULL, - firstname VARCHAR(255), - lastname VARCHAR(255), - login VARCHAR(255), - role INTEGER -); -ALTER TABLE STAFFMEMBER ADD CONSTRAINT PK_STAFFMEMEBER PRIMARY KEY(id); -ALTER TABLE STAFFMEMBER ADD CONSTRAINT UC_STAFFMEMBER_LOGIN UNIQUE(login); - --- *** Product *** -CREATE TABLE PRODUCT( - dType VARCHAR(31) NOT NULL, - id BIGINT NOT NULL IDENTITY(0,1), - modificationCounter INTEGER NOT NULL, - description VARCHAR(255), - name VARCHAR(255), - alcoholic BIT, - pictureId BIGINT -); -ALTER TABLE PRODUCT ADD CONSTRAINT PK_PRODUCT PRIMARY KEY(id); -CREATE TABLE PRODUCT_AUD( - revType TINYINT, - description VARCHAR(255), - name VARCHAR(255), - pictureId BIGINT, - alcoholic BIT, - dType VARCHAR(31) NOT NULL, - id BIGINT NOT NULL, - rev BIGINT NOT NULL -); - --- *** Offer *** -CREATE TABLE OFFER( - id BIGINT NOT NULL IDENTITY(0,1), - modificationCounter INTEGER NOT NULL, - description VARCHAR(255), - name VARCHAR(255), - price NUMERIC(19, 2), - number BIGINT, - state INTEGER, - drinkId BIGINT, - mealId BIGINT, - sideDishId BIGINT -); - -ALTER TABLE OFFER ADD CONSTRAINT PK_OFFER PRIMARY KEY(id); -ALTER TABLE OFFER ADD CONSTRAINT UC_OFFER_NAME UNIQUE(name); -ALTER TABLE OFFER ADD CONSTRAINT UC_OFFER_NUMBER UNIQUE(number); - -ALTER TABLE OFFER WITH NOCHECK ADD CONSTRAINT FK_OFFER2SIDEDISH FOREIGN KEY(sideDishId) REFERENCES PRODUCT(id) ; -ALTER TABLE OFFER WITH NOCHECK ADD CONSTRAINT FK_OFFER2MEAL FOREIGN KEY(mealId) REFERENCES PRODUCT(id) ; -ALTER TABLE OFFER WITH NOCHECK ADD CONSTRAINT FK_OFFER2DRINK FOREIGN KEY(drinkId) REFERENCES PRODUCT(id) ; - --- *** RestaurantTable (Table is a reserved keyword in Oracle) *** -CREATE TABLE RESTAURANTTABLE( - id BIGINT NOT NULL IDENTITY(101,1), - modificationCounter INTEGER NOT NULL, - number BIGINT NOT NULL CHECK (NUMBER >= 0), - state INTEGER, - waiterId BIGINT -); -ALTER TABLE RESTAURANTTABLE ADD CONSTRAINT PK_RESTAURANTTABLE PRIMARY KEY(id); -ALTER TABLE RESTAURANTTABLE ADD CONSTRAINT UC_TABLE_NUMBER UNIQUE(number); - --- *** RestaurantOrder (Order is a reserved keyword in Oracle) *** -CREATE TABLE RESTAURANTORDER( - id BIGINT NOT NULL IDENTITY(1,1), - modificationCounter INTEGER NOT NULL, - state INTEGER, - tableId BIGINT NOT NULL -); -ALTER TABLE RESTAURANTORDER ADD CONSTRAINT PK_RESTAURANTORDER PRIMARY KEY(id); - --- *** OrderPosition *** -CREATE TABLE ORDERPOSITION( - id BIGINT NOT NULL IDENTITY(1,1), - modificationCounter INTEGER NOT NULL, - comment VARCHAR(255), - cookId BIGINT, - offerId BIGINT, - offerName VARCHAR(255), - price NUMERIC(19, 2), - state INTEGER, - drinkState INTEGER, - orderId BIGINT -); -ALTER TABLE ORDERPOSITION ADD CONSTRAINT PK_ORDERPOSITON PRIMARY KEY(id); -ALTER TABLE ORDERPOSITION WITH NOCHECK ADD CONSTRAINT FK_ORDPOS2ORDER FOREIGN KEY(orderId) REFERENCES RESTAURANTORDER(id) ; -ALTER TABLE ORDERPOSITION WITH NOCHECK ADD CONSTRAINT FK_ORDPOS2COOK FOREIGN KEY(cookId) REFERENCES STAFFMEMBER(id); - --- *** Bill *** - -CREATE TABLE BILL( - id BIGINT NOT NULL IDENTITY(1,1), - modificationCounter INTEGER NOT NULL, - payed BIT NOT NULL, - tip NUMERIC(19, 2), - total NUMERIC(19, 2) -); -ALTER TABLE BILL ADD CONSTRAINT PK_BILL PRIMARY KEY(id); -CREATE TABLE BILLORDERPOSITION( - billId BIGINT NOT NULL IDENTITY(1,1), - orderPositionsId BIGINT NOT NULL -); -ALTER TABLE BILLORDERPOSITION WITH NOCHECK ADD CONSTRAINT FK_BILLORDPOS2BILL FOREIGN KEY(billId) REFERENCES BILL(id); -ALTER TABLE BILLORDERPOSITION WITH NOCHECK ADD CONSTRAINT FK_BILLORDPOS2ORDPOS FOREIGN KEY(orderPositionsId) REFERENCES ORDERPOSITION(id); - --- *** BinaryObject (BLOBs) *** - -CREATE TABLE BINARYOBJECT ( - id BIGINT NOT NULL IDENTITY(10,1), - modificationCounter INTEGER NOT NULL, - data varbinary(max), - size BIGINT NOT NULL, - mimeType VARCHAR(255), - PRIMARY KEY (ID) -); - --- *** RevInfo (Commit log for envers audit trail) *** - CREATE TABLE REVINFO( - id BIGINT NOT NULL IDENTITY(1,1), - timestamp BIGINT NOT NULL, - userLogin VARCHAR(255) -); \ No newline at end of file diff --git a/samples/core/src/main/resources/db/migration/mssql/V0002__R001_Master_data_MSSQL.sql.mssql b/samples/core/src/main/resources/db/migration/mssql/V0002__R001_Master_data_MSSQL.sql.mssql deleted file mode 100644 index d57e0fb25..000000000 --- a/samples/core/src/main/resources/db/migration/mssql/V0002__R001_Master_data_MSSQL.sql.mssql +++ /dev/null @@ -1,71 +0,0 @@ ---Rename this file to V0002__R001_Master_data_MSSQL.sql.mssql if the database used is not MS SQL Server 2008 -SET IDENTITY_INSERT RESTAURANTTABLE ON -INSERT INTO RESTAURANTTABLE (id, modificationCounter, number, state) VALUES (101, 1, 1, 2); -INSERT INTO RESTAURANTTABLE (id, modificationCounter, number, state) VALUES (102, 1, 2, 0); -INSERT INTO RESTAURANTTABLE (id, modificationCounter, number, state) VALUES (103, 1, 3, 0); -INSERT INTO RESTAURANTTABLE (id, modificationCounter, number, state) VALUES (104, 1, 4, 0); -INSERT INTO RESTAURANTTABLE (id, modificationCounter, number, state) VALUES (105, 1, 5, 0); -SET IDENTITY_INSERT RESTAURANTTABLE OFF - -SET IDENTITY_INSERT PRODUCT ON -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (1, 1, 'Meal', 'Schnitzel'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (2, 1, 'Meal', 'Goulasch'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (3, 1, 'Meal', 'Pfifferlinge'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (4, 1, 'Meal', 'Salat'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (5, 1, 'Meal', 'Pizza'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (6, 1, 'Meal', 'Flammkuchen'); - -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (7, 1, 'SideDish', 'Pommes'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (8, 1, 'SideDish', 'Reis'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (9, 1, 'SideDish', 'Brot'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (10, 1, 'SideDish', 'Knödel'); - -/* Changed FALSE to 0 for MS SQL Server 2008 in the below insert statements for the column 'alcoholic' */ -INSERT INTO PRODUCT (id, modificationCounter, alcoholic, dType, description) VALUES (11, 1, 0, 'Drink', 'Wasser'); -INSERT INTO PRODUCT (id, modificationCounter, alcoholic, dType, description) VALUES (12, 1, 0, 'Drink', 'Cola'); -INSERT INTO PRODUCT (id, modificationCounter, alcoholic, dType, description) VALUES (13, 1, 0, 'Drink', 'Bier'); -INSERT INTO PRODUCT (id, modificationCounter, alcoholic, dType, description) VALUES (14, 1, 0, 'Drink', 'Wein / Apfelwein'); -SET IDENTITY_INSERT PRODUCT OFF - -SET IDENTITY_INSERT OFFER ON -INSERT INTO OFFER (id, modificationCounter, number, state, price, mealId, sideDishId, drinkId, name, description) VALUES (1, 1, 1, 0, 6.99, 1, 7, 12, 'Schnitzel-Menü', 'Description of Schnitzel-Menü'); -INSERT INTO OFFER (id, modificationCounter, number, state, price, mealId, sideDishId, drinkId, name, description) VALUES (2, 1, 2, 0, 7.99, 2, 8, 13, 'Goulasch-Menü', 'Description of Goulasch-Menü'); -INSERT INTO OFFER (id, modificationCounter, number, state, price, mealId, sideDishId, drinkId, name, description) VALUES (3, 1, 3, 0, 8.99, 3, 10, 14, 'Pfifferlinge-Menü', 'Description of Pfifferlinge-Menü'); -INSERT INTO OFFER (id, modificationCounter, number, state, price, mealId, sideDishId, drinkId, name, description) VALUES (4, 1, 4, 0, 5.99, 4, 9, 11, 'Salat-Menü', 'Description of Salat-Menü'); -INSERT INTO OFFER (id, modificationCounter, number, state, price, mealId, sideDishId, drinkId, name, description) VALUES (5, 1, 5, 0, 1.20, null, null, 12, 'Cola', 'Description of Salat-Menü'); -INSERT INTO OFFER (id, modificationCounter, number, state, price, mealId, sideDishId, drinkId, name, description) VALUES (6, 1, 6, 0, 6.23, 5, null, 12, 'Pizza-Menü', 'Description of Pizza-Menü'); -INSERT INTO OFFER (id, modificationCounter, number, state, price, mealId, sideDishId, drinkId, name, description) VALUES (7, 1, 7, 0, 5.99, 6, null, 12, 'Flammkuchen-Menü', 'Description of Flammkuchen-Menü'); -SET IDENTITY_INSERT OFFER OFF - -SET IDENTITY_INSERT RESTAURANTORDER ON -INSERT INTO RESTAURANTORDER (id, modificationCounter, tableId, state) VALUES (1, 1, 101, 1); -SET IDENTITY_INSERT RESTAURANTORDER OFF - -SET IDENTITY_INSERT ORDERPOSITION ON -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (1, 1, 1, 2, 2, 1, 6.99, 'Schnitzel-Menü', 'mit Ketschup'); -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (2, 1, 2, 2, 2, 1, 7.99, 'Goulasch-Menü', ''); -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (3, 1, 3, 2, 2, 1, 8.99, 'Pfifferlinge-Menü',''); -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (4, 1, 4, 2, 2, 1, 5.99, 'Salat-Menü', ''); -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (5, 1, 5, 2, 2, 1, 5.99, 'Cola', ''); -SET IDENTITY_INSERT ORDERPOSITION OFF - -/*Changed the value of true to 1 in the below insert statement for the column 'payed' */ -SET IDENTITY_INSERT BILL ON -INSERT INTO BILL (id, modificationCounter, payed, total, tip) VALUES (1, 1, 1, 14.98, 1.3); -/*Changed the value of true to 1 in the below insert statement for the column 'payed' */ -INSERT INTO BILL (id, modificationCounter, payed, total,tip) VALUES (2, 1, 1, 14.98, 1.4); -SET IDENTITY_INSERT BILL OFF - -SET IDENTITY_INSERT BILLORDERPOSITION ON -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (1,1); -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (1,2); -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (2,3); -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (2,4); -SET IDENTITY_INSERT BILLORDERPOSITION OFF - -SET IDENTITY_INSERT STAFFMEMBER ON -INSERT INTO STAFFMEMBER (id, modificationCounter, role, login, firstname, lastname) VALUES (0, 0, 3, 'chief', 'Charly', 'Chief'); -INSERT INTO STAFFMEMBER (id, modificationCounter, role, login, firstname, lastname) VALUES (1, 0, 0, 'cook', 'Carl', 'Cook'); -INSERT INTO STAFFMEMBER (id, modificationCounter, role, login, firstname, lastname) VALUES (2, 0, 1, 'waiter', 'Willy', 'Waiter'); -INSERT INTO STAFFMEMBER (id, modificationCounter, role, login, firstname, lastname) VALUES (3, 0, 2, 'barkeeper', 'Bianca', 'Barkeeper'); -SET IDENTITY_INSERT STAFFMEMBER OFF \ No newline at end of file diff --git a/samples/core/src/main/resources/db/migration/mssql/V0003__R001_Add_blob_table_and_data_MSSQL.sql.mssql b/samples/core/src/main/resources/db/migration/mssql/V0003__R001_Add_blob_table_and_data_MSSQL.sql.mssql deleted file mode 100644 index 781c52141..000000000 --- a/samples/core/src/main/resources/db/migration/mssql/V0003__R001_Add_blob_table_and_data_MSSQL.sql.mssql +++ /dev/null @@ -1,5 +0,0 @@ ---Rename this file to V0003__R001_Add_blob_table_and_data_MSSQL.mssql if the database used is not MS SQL Server 2008 -SET IDENTITY_INSERT BINARYOBJECT ON -INSERT INTO BINARYOBJECT(ID, MODIFICATIONCOUNTER, SIZE, DATA, MIMETYPE) VALUES (10, 0, 72861 , CONVERT(varbinary(max),'89504e470d0a1a0a0000000d49484452000000c8000000c81006000000fdc872dd0000800049444154789cec5d077c5545d69ffb92d04297d8404db020c15e028a9817052c5850888b65dd447445d85d753fb16b6eec8a5d41455c13171509764511352f7614ac80080a449a0816a4a4e77e73dffccfbc37e7bec90b5d77f7ee6f3d9c977bcf3d77e6cc9c32e7cca48aff5d9b731d618174f552c00114f9cda4db8bc16d754d6ee67d7314f0ca4c9cff3d00e76e2a63ffbbb6e945726a9343926b7e5fb2eb8ccde26ae32f2e7fc92ec8b3677b8eff5eb6a98cfda75cff5320cdbbc280ae024e1ef0df003b00ee88bf17b3e7803b4e92f7d0c0a48976de46f2b9b9d7b30a786e92fba6e0be29e6cf5e2efe41fcaf06fc1a10dfef95031fc9eeffdfb56d2f57012daf7451bf91bc925c5700477f3ad4afc39a7e8d83f78803369ec5cdba52009b29d7de7e0a3ac9e49afecec6b357847f2479cfffaeffd42b0c185180267c0d31d042c04310cc140ca054086cea4d0aa6a501deac608b1680b798b0654bc083016f05fc50c156adb60e24fafa7dc7317e5a327ecfc6f7bc0f38c0fc5efafe941b01430a866e50902620872bd4086058fcefda1a571830a280966718425aae8f5190fa8dfa3120d7e8779283160301494e3e5050cb11c9d5ef55ae312e699cd2b8b5c935c97340aea93d49ae5dc0b0f80fbdfedb3d9030a0ab80f62c4820e83e36e139c702920091e52205eec4d20b96b56923c49ec507cedae502299cff6a35a0ad540ca9d35aeedaee2d298453437f4e4f9737f7747af802e81ded558b1931961c57fecfe76b77d128241daf44acf7ffeefc2caec02d51e8fcec98f815c0afc07da728dc29717e32bef97871a46f29354ca83b61fd7542d416d7fcb6f63221aa2f5c377eddde427cfedadb137eb84b88f7d6bcd0a3bab77ac4c38012cf032708cbcc7b0f1003cef300df357141f7870129a451c1a063d2d70ae67f57f3aeb0020e6f573ed145f03b148743f046f3795fae8767de7a48468610ed4eeadca5f34572926ddde2fc761ba45ca7a535b693cf39f3424b5bc909dba9768ac4c742349ed47843546ed738a3a3445a8a1ba372bd9b926bb1935807b96f9e3c0bc8b31e07cee5d1fffea4f0c6eac6f7ebea84a8ffb276e9ba57a45c2fa89ebd6e9d10bfcdfbf9e835ff924ec8b47bc6af947cff72daca168d6f290a24d75a6e49de489e09f6078422d1f24d3064b62f89bb9e40e8776a6f1790f03fec952ca4f29f7665039242a009cc054e03260218e781b4bfa24b17e71d212e587ddbb85e6542b46dd3b9e4d46952213c99b2c721df4a6ba45de8f283baca7bf70a3dd8ed1ce10fca637c0523d54104ef54c336ac70e9d62b3c0ff85c312a8af7528101f96b187f575c8515ee54e86941e111e079b83fac70799f8bbb8a814780e7a9f703cf1379461b79725c1c2dc11d8d5d974c9403b35363ff05e3e5803cacbacb872f09b17cf477e35fbe5d8847ca479ffacd3772c05e52bbccbb5e3dda08179e42548dd79b38b9f88d6f037f1010fdc207a61e6080ff5328962bac80291971bf931cbb0c9713ffa90ffcada1cd1d52ec86f46dd7f74839cfaf6bd3ed4cd9dfa195a18b7bf490f08ed08bfb3c296fbed2f9a5c3bdd17714c7539352a4702e7f2ef062c24d794b302e5c3c077a5c7e03f21dc1572a7a118b3cd3f59e1853552565af5bc3830b779306d47d0d5fce7f5488758dbffee5f97f08f1e592770ade950ae3c5cc07effdf967f5889647926bc8ad96732ecf24e7d7b3e7c38024bfae79ff1f57a1fcb72890b0027a8061f1cf41ac375e6174fba5c7d490b49ccf9973dd5b474b0bbde5fa36a9674b8590727ecab24172a089279d3332e6c64dd0d910f0af930834298e0a61d87ff2bfa448e6021f053cb1e220dc351587c68bf1b5f9186853028ac4059fc5e0d3051d1e096ff2f2def5fef2a3b4e86a8baac3af1f21c4ea51cb9e9afc8c100f3ef08fbf7c78bc1035876c98d0d04fddab0718065603299ca1803fe0ef3400b985470ac535effbe30ebc2d746111376008f1d0ab84e7ae2aceedd041883dceec396cc810e9391cd562c8b07952417c18fab4ef1bf2a6a39c375adc6a18244a1e36da7031479be32491b78d378c22b82b0fb8499f29ae665fbee124e5b2e1a086215f49b9ac9eb86eda0bd2d39efbf6870ba64c11e2e9cadbce5abab7ba953c98c646402886c6a31524b9df648512de28ceb7e3f59fae40220ae8d014b227686085fe2ec45f6a6e0c771c2c3deb8f7a9c34525ac2a97f4d7bfcfce1f29e5d9cfebb2d147605908d097f0ad4d128780e6e12cfc1a600ca809fc13c94e2c080c157255554a3807f0d3c8caf570331b987b34957e3418d177d5f2ac4fa9fd69cf2c47942bc7ec0e315fffa8b101ff678e9a33558e3696800dc17cf9c0e9c069acdb223c807de7fcbe26518d055c01907488610290c2909a3cb4a2e3df06221da7cd5eefacb5e91b2fe51ca8cc1f7c83f5ee3bcde6a4693868c033c0cbc690fd8c5046ef3b08b418f8d8b0413bda2175030f04c2a347d07385a63ebcab39c4322bea2a89f5a7bd4fba942ac1ab674b7717244dd79eef997bd592f656f60e3cb0d4ca1d41f059c0ca5a34dc83d1aae58fe381e77687b33b085afb0027cd19bf4a4bfe670f6e1d7f56ebf548ea369cf7c75538a1099a7f55af7dd04e96134a6762ff645746771acaf38bcb0a7a81509356d45142e3b55e1655ed47e96ff2dc3dfa3dd2def8a44f172747f44e15e2ec3c3c0cb81e78b223ca7dee32a5c3e17c6730af78097030f6bbe8a0c3e87629a21be72357de253e1459aaf22834f21c81edaa82bf479e8a1dda5c268b7a4d309d74a4531f4c54bbb7e768a103764bc10bee66a21fafe6df01d3b22aba7e58b0aa66111360db1e894774d18a2c5784c0521f295220ae829e23f35add25540875809fe4941bf5d464f2e2dcdb95c88ebcf9cf2f68b2f08913ebb43c3cc41f29e502832cc4ff2a815aff98a2320c7246f618d73f950d35b4cfe144ef2e7327a11462fc2e811fd987c937f69c833d10ff01b93e748b3f8cdd5fc6e923cfb8ac897bfd43b5aa4f6930a629743baaf78ba8710b7674f7bf46de9698c4effd7d7a79e2adbf9aa50eb5658b40f2ccad3623cc937d65242b496fa0e2019ba11e0866afd3d5e29db9b812d74b90a38a50ccf5230243be8f2034abf3be61821323eef5659faaafc2d2b74f219afc93f9e25766b3922cea2c914a6055608fda32d1ae0b94ed4c2971e880a20643825782e338ae7295c3e95a99e032e804780e70177912c59a83c1a892beeb3c88557b87c2a8ce7b2705f18f765197c4e15e90a075f64c1656a3e155ea8f9cc637c9a1e0ed1dfc8cb0939bd5b494fa345bf56e123a402d9f7829cefcf7c5888bd871dd2ed2b69817d32e1f52f9677c5bde729187a023838d1592d05c023c02bd9cb5e05244552b2291cff8eae88024e21c3e5771714dcf846875a214e9a72d1f0b1b365fbd6b5aabfbfb3fcdbbad0ebfb3c1dbd2d4fca52bc45afa8c42c7a856792e50fb9ce0bc8877a2bc94725f04cbd96a1e86731fa25c00b40af447b382506bde41eb5c96f4c9e33151f49f8ad60fc4634bf345d6fd2159a93b27aa72ba4a1744ca7f5833b0a71ccddc3e6f6a91662e6fd6fe4bdb45688ea97d77f010e63f28c7ea47989feee3039760ad8cbe8ef2e60647338df92d71f5d814414e0032c24f11da675ede47b1c173ff2f0928b074b2be08456a32748d7d2e928fe6ff7cb842f8833a3cf6eac2b4c782926d47c087819043c4f2f062a3c4baf4144713900159e093c160250cf459c3151bc10d3656c00293c532f5e2abc50d32f009f0acf56d92ff22b2fc7f7d173cde3b3c49c789c32e0bd366fe039739dddda48cbb8d3693bfd69b0f4040fab1d78defa3942bc77d0f3fd67af97377c2c9ed116363c0fddbf61e018507aea590c380ab084c1c50cfedeaf8802da838e33844666dc5bbb4b8d103bdd97b5f76bf2efa191a15927f83ded4849f27b46cb99368894a14172ed3043a3848552638ac48de25a3eb421a30cac126d6099f42a809362aa04bd4c162a73f8b8b018709c5f32e0285416534c8c5f2ecfa6e1a5e955f2e97bd3ae94dcd4637797be50dff5831f3bbe95103b7f9ab9fc0be9617f59f5ce0d3f7f2af0c980590c87bc9342d10a02bf7b7fc17d6c9edbfe06d21f2d84155620517dc60e27ef7a89ef1a5ef1d8c49b2f9396e8888abbf3abe4d499724beadb779e246fbac2dba7e521712e385c5dc2c9d5952eb4f1bbf5be6c06c3faef70d1f573b98c4eae41c705de53d309b3f787d9fbc38ccf30a3aff0fc24df97cb20bdcf765fbeca95dadc10175dcefdcefc96b709d165c7aeab6e7c4f88bb9e29fff3a27385b83a34b174947c93b3a7f36afa27eade361f2bd8fa76055ba2ce200da18254d425a4a0f092425d8101ea6e0ec75bf17215e072ed7fc788fbef7978974764bbbc30e9dee9470ad1f9c25d5f583a51fe7181d3eb9056861c303913a69c858173b9e6fd6c9563848838bddc24e3c43ebe368d5f3bff4d8fbb00bf0cdfd41017bb52d3d21ecc96f27bf0b5c7be37ed2a21ee5835fd377fede4ac4bafbee4f057d43de92a36a0e5bad5f10a527d4a1ae45b87bc28bd9a0c0a2627342f6efbeb8fe2818415d01341448190b43d8e4a39addc8f399ed6f9921f1f9d2f3fa943eac4ffbb2cfae7f342c3e35cd60258f8e3d00d8360afc203901e45a67a9776b9159ec742539570c15d71a2a2a7435cf9e0d1e8d69845c72c38edf910ae426222839e33435c01d7ddc6a70bbc58d5b54b5c2df2f31017b71423c00b359f59069fd92a24e6ccdcb2212e7df51367a7ec2907d5c0f61d730b8438b2f4d495bb5c29c4274fbdfef67b7200d6fd5253438b8f3a04e0022a0e847707f0b180e094f2ef7588b3c07c6ebb5d78bfe6ab44015faeff71cfc3693d2609d16179467ab954acce0fcee107f96b46310f7843f4e67c27fab53a6444728610a8bc2f0ceaa62762f5b059c888cbb14d3e329907efe8f45d176f2f34e8337e93876c897e9210977ddc317e81f390dc9692675ca12f535674bc54885dd6779f709a84596fedf7ca37c3849875f3f44796eca5eed11e495e621a7c319df2ceb45c43b1e89e5ebc25386fcef57b5720a80f50c12661288ed39ebbf895f4b652d31fd3bfdbe4d6f2b70ea1be43fd18b86dad8026e8b0521c7a82aeb4645971973b8fc5564b31e0b2a13866824b5b6880b2aef400c18020d73d177caeb684b8f800d4316c169a2ad4aebc7aae1821311ee2c2341a17232f60f44dbc140561f92a241608716da1d8325d2d3f69dd61bf9385e833e1a4437b7e24c4d7bd679c551e1162dda45f9e6df8b3ba470f38c569ac9e84f6682a31a107c84362db3cb4e5323e4a14f0e5fad2d327bc947385b4521f68b7ea8db3e48f473b3bef72b508aea5e5a2ff660a55c6aa0d01c859a596b3e8dba49c15a8fbb4bc642a26f85a1d8d8766cbb1a25702fab15092a25fcce8050c17d02b64e322a6984c7ef39284e42a412fb399fc16b0905c1e70572bae4ab1052ea79d33d0af70ef727ad76306ad1262dff29c65cba5c73163c2ab777efb286e2295b5185071a04358f4bb561c61866f7345f27b5720aaeb759ebbefb2f51f77eeedad4608b1ffcbfd4e7db1a3ff5be8bd81fea2a17d714de13958a476510f5d29da466120b64a038759302e048b2cba7c65014a8f661470d0c180cc648be585164f42683cead1480f643ff01dc673598c4f12b330eecb32f80c93258745fe584cb8047f570ab0447b380a77816769854a7c293c171ecd4c78343cb6be9562cb69b35aeeb0e7b1421cb25fffcbf6972a7ad67dd3fff646ad1035376fa8e079f35e4fe087038f002f31e1761b706410d15e4ae0c3571c97ecf6e88043d709d1eaa3f475d3fbca1fab9db69d3a095feec860898057c255126f3e0ca29842cf54f7b1fe136cb1991b44b1fa8a02e08a5e72392683cba45fa80db002f57ae6f1307ee3e42fb3297e35bda007a5e871c32819bf31c55a01fa61f06fd2afd49e378dbf4dbbfa8973fcecab8e13339e1d203deb1ee71cbe6ed92d5291944f5dbe00c9247c2d84d27ff9da87a738b57b245bfdfabd2a90b0023a0b474e1cfb1edafbdad41be53c76ceb09d9e901de0fc14aa3ce96f22e83904f3da155e06415985e18bd08ef624b82b6fb7e894a04d45b7e5a28069a61660d322b765bf04b355c6814f2a2474f11d8a6f872d9697989e439ca7021c218e6215e210b49858c13c9cd8402b34db8185e22a40cf926da62dce2c66d1966c999040daf72d4ede437272e84e037aef2e3d9077339f7bcc27ecbdd158aff3ea115bf6bae0a102e02ef00860097e07becd1409d56d60b1df571ca3fefce02b7b2f971e47dbf69f4cf73d8dd9cec79d4e8ff3282bd9623059e6b92ca4c843300ef3ac2bf5c4e9aafb40dfd1868732902a028686a2c72bc8b35808a9c44cce207e831e8e85dfc266f2cb43ca4e52c388f31b01bf0a2f481c0a0ef0bba543b65231fba1ab8e6376bc3b4f52ec76fc3e977ebdb3109fcd7beb8325efe29eb002dee326d4f24b38c1c59ab671dfd65b6cffbd2990b0023a0b679582a1ef653fef78f3fa3183e4bfbd50bff3a422117031a547607a0e3aeb435be80a1f8461ebaab45ba778e3d26c039e43bef268e4b49f0b5c790e2c7416c767624f2253e36afacb09585ec4679ec1676c002abcd0f41c4891c8e7f603fd30be2fa1e7104b070e588a0a2f08649b450c3e93a74f46f0f6cd1a782d17b45edf437aa087b43bf6afad3e948ae4e5e71efd4405e9627b735d04e89abfeb104026231a062c002cd91c0e135ca0ef4c0594beef79336fbdc9df5baad3e89d2e8ff80af06ef17ad737a3f2a3dac7b69641064c2926eafcc45973564320e0b1b290514c91287ac90d0d538e89bec3c69f13480736e83797dfb82c3193dec61a46997cbe08648935c9ef160bd91e2d3d923da55df641d773fa4b8fa4edba0e377c749b105fd7ccb861f549ea16ed81907cbbc00b184e8a2413300258c2e016bb7e6f0aa444010a7e84e440bbe41f8fb61a72bd64759fb49bfd6caae8c4e78b5465920a59be15020dc4626ed1359dbe1ab7c80e41043e1591ec5c65bf4a2f4929289e665b6949b3e5ae760ed26e2348bbddc834dbc000c947086baa9e284ad47396e48042aba5081c21c01c786e1116e2d3138f9e8e1ddc17c67d0ebe07f8e685b8dad4b49f7ec8fdd2723b719f31f3a649cbedf5b71eada401471e090d382a557381534cb988118d009630b899974e3b960651b7a77bec9422278a9cc8a04e9356c81f478bb2c3e78a449eafe2b632b0369519c57361c0d8428a3c64c4d70688be635bfb4abc961833882c86464c3131fa01f9d8347e631e2fc68596bf84fc26358c821e8e8bfb0a9be4770b876c9dfd9d65fe1ac9ae1bf67ce3882b855878d897535e953eff2f7356de545d8d9b10b2f588a3087092ef45c04b80937c9702d2738b3787d3f8ebf7a2405c05e20b6d865f7d5bddce774bd7fe938e4fbdee87ac16887e7e419ad5c58c854c144e9e0362ab729a3f11ef52825c8a8167cbce2041a9b4780ed9ba9010d95316cf2116c3263ef3189f0a2fc3692083f404adde53c806888d4f3e00a712df1b991c602bec2a80c22b43b2c0c62eaab2ba15f9dc68d0d9b463861c650b7629df7555df3a217ed87571e3cbd2725bb9b872ce06b5ba151b5805c049a1ec81df6940d2df29df3e0f7fa7cd37576d128746e19f7ff99ef4f9d78c993c7aacfcf7e9a13347dc16e74904e5577141f25bca4230a5f8aa0cd433e9898dd1b37bd6444fd18f6d1552095cd1b31b44267dbe56e268f9a9041e06fd0ab48949df05fd2c6d6025e437e6f1327a317e2b8cf6284cc22f85fa2c1e9495df606859d1ab741cb1195768ef942eed2f16a2e7b23ec7ecd1284568ce336ba6d7abbfe92d7b4a80ff85c14cfc7d3120c97744c12dbf36b2bd154858019dc61851c0df3a205c3dec9f974b8d1aaa09650cf0b7baa0892e3621bba0014bc1e262566a4f42ad3114e318a3b0ca4ed2169760829167f11c08d769948a9e54001be29fb3c7b0399f68854158944f163a13cd5c83c8469af14c240bc442020ee887f19cc263969c83b784711f2c47840073b445a8ded3dc4555168a93efeb055c29cc4db4e09ccc502bff1c889dbfc93ca4aab710ef2f7ef1894fcfc41f6960e55a6026eee303d3054e27ed453692a93078c380f50da2bf5e7cf79cdda527ddfac1f405cf4bc3487cef94f869e601c5cd437e956cad81d6d0682784d57a622b51cf594330067dab67ad4359da63b51944d42a26bf2cbd564a8fcbe867a2554c7ef98e08b6f4dae09a5f26e337339e5fc7257963ed51a2e91780be1b4f3f29bfb68a7a9a1f36d32369d9adf569ddf714e283da97de2a95946a1757fdd688ec43ed41bbc01799bf6b1c7f0fc82fbe68f33d91ed5d488845456a087f517178e11d859997cb0eb83b943ab23a5a2814cdadf18abc0c752ff09e48d61c0bdc53b8bc4fe161e03d919b33dceb13c5fb20d973ac17567f47415111f0b0898bb1820afd143e12f840a22bfae07dc467b681f7d4ef233eb34d3e9502f22e1543f15cf43bbda198d6c602efa9f7fac9c073268ebdb4e4fb543b4d10c38def9f8cf7802f79b7c2f3894f4458476abea8104be1d9f88e22c6674f85c7f13994f1893dc3c0d758e07dc047ac7d894f1e586ad695f1efdd479fb58310877bc737ec8182c3560b0171c0508b73144cfb55413f29c3bf42df281838dfe53110cf6e2613741fc9356dde29e5baed9c8e7fbdee0ef99dc778f9a9efc7b707f65443bfc5c92fe480da09f2ec01773dd5bf28f0f3747b9bf4347dcfa42f9f37c707d1efc9e42e6cd297eadea43f99f15b64d2a382bdb8f1c6e538b17c107dd61eba00d065f4c65ac685cbe88d34e557ca5b2ef07093fc4e66ed61e33726cf54b0b849f24cd725d5e32aaf951e8833cc59d11a5bf5b47e59413a80ae05b2b7b85ca71cab6008597f0ef6a0d3f2b9d9d7f6f2405c05f46ea2ca691429ef48c36acc9f163d2b159bf3b2f3dbbefe80a6900c59fcb00bb5c59fa32dd90db88fecc60db84fe1678a5fa2f8550e85aea27469fb0b692d66e277013a0acf005e067c10a8ff13ffaa95ff13069fe98ccf74c667bac127e1d761bac9c722ff6850c991fff371daa6a358e1c4a7b4c072189f0aefa70eda9578187c636f2cbc370b7886e6330bf7115f59b84fe1282414fbd19bc05719f0189f198ccf0c7c4f0eee53f834b45f2f1520927406e1fd8bf15c41f4f766a64f86e6868e6bb59310ddafdfffcebd3e95defbc2499fbc7110fe488b8b74fe088ed2d5a12caa1ba1b4609c0def41f1e8b62e698a0311db5e1d9bc784ae10e2c26fee796d5f3905b65cda7aef470ef16939e3fc73389ca9d46f2804a47eabd4f54a9003edf9a9509f8bfe58a5e439ee585ab437e88da1f6d65978aa7f4ab52429fa65267d87f611cb31e54cca2bc95986c1ef203cc1e967805f0a076620c443f40b997c4cb5d02f34db234e0a329be2578f0bc1f9857c825f3d5ac3144283fc717e07b1f6b0f19ba343d2617ce7623ca7e86d645662eb5e6d2bfd7359ba8dd8a76ea91cd19f3df0d6238b60207998e93c54b87b3f02c213a1dd80057674f090deae0b6d0b0023cde124d1b59d14885eee2e51c08f0d8f68bcefec7ef283d3c6b6ec71bddf00d95428d574819e70292bc51ab3a41829290e35614530b02a2d69b622c9e25a2c0f5f85b0a6b2823d96661b17322860ef53782e14de4cf065cd26e17c5a43534ac1165a425cd64d1dcd7c7c6fbc77ac7fd25b6d7df5aa5f779122735ada9036a31384b874cc197cc4d68c1cbccde433072118969e2978b6d946a64fb6d8bb55763769b1b5c86ffdf9c7270831ffa5992b7fa42c2d3a10687740da5e1b8a446fabbd8709b5d110065ccc5e8adf75c80a7ff743b1fdcecfef30460e6ca7ceb9d8af2497d20c4388cb970e2166a9ef27f9e56b72907f92a7e2666e92e830fa9516fae84f6b882b58f1eee03e937e89a60ff9481ce2b28f374b7b8441cf16e27218fd60c5bbfabe2c8e379dbedc5c7e25be58e19610d726662576d8a3cbfb590572ae7fe999752fbe2465736de3127d901b9d4b028fbb118650e3b90a9afb1dcbdf6150e942d64dbeb6b5027115a0652682fe59cc7d1f3e7d8f47ae94c8df9ce3bb0f8fb3649215e8553673ad2007b6046ded51890aded8449765e0c9d2295d780ee3b48554c8f8cc637ce6313ef30c3e4991f042c264e9c0b64ae16226e0c9765565f9f8cb977c37f35d39018e9f76f9f83ba50bfcdae0c786bf2227c2da11d5dfcf961371e617bd2a0e90967ecadc947fb43a41d8d78c2c15efda831c048bb9b99b3a264f9f8cd62677b96bd7e37638540eb85f9e297d13e73378ff5290ce19a181a4cf6bd8ddbc4f57b6e7c67f89087a22c0f562b984e7e5dfbe47a684ad32d3873df2bafcdb27ce14ac7960cdc75291cd176fb5a2c677c310908a830a6351cfd4b45c2438f0c955efb5243bd8924738bf9516fab4d8ece8f180fec3df5141ee7dea0da9f70b275778cf44dbff48a7b79fd66a6d8f40d624537cc9f8658bef0179b3ad51062ade2df429bd3db6f6c2f865f2eceafe85f424be5217a6eddae9342176fc7eb7cf174945f0c5b28af98b17abbfe903da48aee95c1dac859082d16b7f8b18f102c048531c24bab6b10249e4790c5f3226fd40e99ab538a4f5c5b71f0f01f4bb86b6f6d8dc023d1a1865505fab90764b27fff102bd98001518efe3e994a5420599b2e1d190e760e33360d16945a504bf0016799916a812f099a9de9f24cd962d6a3b6c7b7841969b9e4098e78001f853edf27f7f76b7100fdc3f6a8f871e16a2aa68ed71d5c3d4030d3f08f1fda3732b7ff4cf6aefe2a52f385b883d8f3d78515e963160884fa59878b619f13988da178a5c0fec24167833d3275b6e685de1171cae3ff9b7b96fcb81f3fd075fafff15e78fd8065c23290e0a0150653b425ab6cd18290924def3387a7efe946bbbc9df760cbd78a4bf5545cca3863f1450ac99eabb9821c417c72b7532897abe9879e836f97518fd4a6bb24325e82b7ac1745d93df589698491f8befbffe75d59b73ba08b1d0fbbc6e9a94a70fc6bc745a991c3191479e29f6e1d457c6ffe519d9ce150b262ff18f969d77e327d3a73d22f5c9a3df1ef1ee5eb2af4e6d9cb7441a982d8e6b55eb9f0fd332adcd313b0d13f6ac2b7bc5bb6a0fb6f81e935b3d2e98bc252d1730da63a3b32737b2e2bdfdf22e37ed2447f6dbdf3e5df71ad27bc9d3d0903c11e6a19047ad3d6f78269b9e9db5ad1488ab802e1044d3443d8f6ea77d769914b0d017a1257d8e1031019c89b4dbf06616e85187c60a0915ac4c1a322901a6048c7b0ef9caa371c66182b61412dad381599e3bf19db38969b6bcf2b6580f1835c16469cbcb059f05a01fc5ebcea969f5ebc542947e77fd2f77fe24c4bad77fb9b5ea35f5223a71adee1a05eba70bb1b870ce052b6f97e4669f5179c233b2ff86a53ceb9fab62b7e4b8e5851060a13e39d1453b1434c56720dd9314ea547542a4549b3be2bdd137b77fa5f3e55539427cb8fce57b67dd8defc191a30dbb29a8435a8d26f44600a7ac977062a83d6aa9480ebea3fff8162be4eb67ecdf6ac2b5f2c74b4446dbb651c5617aaa95a6a72a5c9d9e4bf216c1f7e7c57fbf80a72615c738e06a0dab34a9fc2a7af61d1b5ce0eaabec068b29776c2fb9eac675bb2ebf40888fb35e2ffa979cd0260dbea572f22742cc7de1c3590ba442fde1c64537fed44ecad79c5fe76cf017851bc4f4fa057e238b37ebbacadf1ffbe57d7f7bffe56bbe1bff93f47c67bff8de937e9dcf8737bff48c5f70997e4687d3174ac5dfa5a1eb375972fe487d256d40fbf64204f6e0ca4a5a70abf8d705b7d6745d458f57d4575ada23a6a82a403f0cfa8a9e6dcfb0ace6856cd3f66c79d68e52d2d7ecba7afadbb21d967e3e7fed9a2fd4df1ab96144f2bc7b62a843b111c030fb3de9b5adb3b05c05fc0197fde491e3fc13bb4237a4f43e7398089ea8d7939da8c74e34132e3b412f76629ac26327f65156959ae85d64a5509655849dfc579eec6434d02f4336d550289088de369af83470bd6db4ed64b76c64af94e33d31bec3463b683e3d337b449ff406bc48f1a5b7b7e6ed1bcb568972feeef8673b3f2c2dc41f462f7af89703a37f11feda877fd51e09788a823535d2f618975a59eba70f3ce2ecec677b48be5cc6a7cbf874f13ee293b27458fb5af8a476099ed4188df87a433d9cb06e5e3bb6dcfda601ef4b393b3ca5550b9c7c48d02fdcf2afd45440ca5ea16c2c828e4953af7590e516062ea78c3ea9a7f41ff87e344cb072a79de2daa327b50ff8f5c03fc91765156979a6ef2779c6f32e9767d0a3f6487ab29f0e6418f4253d17bf96030f1bfc5ac687f741e3098d52217fbdef87d74cea21c43d2dffbae09aa38478ebfc7faffc049ba0d64d57b0f62a056b8e50b01ab0ea4ac02a05375c01b821085f39e1e1fc0ad92f631a0a8e1c31497a36f3bfac79ec3bc9c780c69b7d3ebc64edc1e42d0e57e3c463f21666f42cfdc7db3be9b88bc933e7b7dca0173c3621bacad3e79293fe791c9d8048c71ba499509fec896c2c92eb106d0f4f72ed32d8ec6b1b7920daf38828e8bbf8837b5fd2e318f941a98569e32fbc4d04d720289b293f693e7a099e53b8ad10ab582f66533d48f30a0979c8843c876c58105370767386c573e079f396453a67aea2db785fa3e74fcc553bac9bbde40969695cfee3a039d252fb6ddd4fcb16f41562fde85f572f9296c6bab5bf5ee9c3aa9cb5af2cd9533eb8d4bbd08f25a7b44bfbb6cd6449ef84d08ea917f8efc31a8325c4b764e9bc6b5e3d4c88672bee396cda1baa7feabb2958d71710bb85d67604bc5a88d36fbac4c9919662d7017b753f4e0ee4384bcec5fb14ce0baf62bb052b0fb3d8b2a9a50e11008f2daa3ab8cfc4f99a19da37e5c4d453da4a8b37343de5e799d2a25df0dba75faf6cad5ea03d10e4d737c0b56fa0b512a44b36926a5a0c1811c6458587fec03c62d4a91baef50f2e7bdc396bfffde3da23e651b755fcd93cea2415deb1c5f3d1b86f83d11ec92aa66d3b3654b2f6b6edc185f1d1b053dd90f5526e2aae2913f7490bf88d6e8f77fea0859cf84a1abfa8c39a13c951edae800b14240552b30b7e27c57235f04780cf57b0ee6cfc0e58ffad7cffabf5f7fa86cde7bfbd3d66f63a21dafcadc379f3a4c7bccbfdddff7984348442a9ce9d2d2e4cd01e6c735289a9ef250fadb97b8655b2f9c2d5f4d5df5ded4134e9513abca25eb0d07226e1a647d2eaa3f4fb3aaf918afafd2797bd78a97a904257b45b3585640936c03321b9d79b912e0674c5465e5b5b81b80a6805028bcd5ffbe8b3eee409e74bcb2f549752dcd79fa8f81a44aea013f594fdc13b3469819e5ebb50f7bb586328463a60330bf4f4a2652973614b112ac95779dfce6a4c84997c20269ef8ea47d435ac9382ffe382ca3bfdf32ede2d7eeeb5c7e54435e5e33b4794e408f1c1292f9cf5e63942ccfc7ada981972c2fbf4cbe90fcfdc4f8859def4b299ab25ac7a63d1277f937faf78fdc78fef90f72f7af196e913249d82673f7abe83106b1ffbf9838fbe14a2ddfb9dbeabdd5b88d617b7fd79a7a9b2cba7a78c6e257d9d0df7af1db0500adca30f5d7ecedda74a7eaa6ae7d76260d761a06bcbb13606bb7dd7e328df823ff1ace157ddb28fecbf6b52f66cbbbf0886f892145ec56d2d8173549a9e38addbe1d3c4165b338ba01f9462c6c04b393275e755720a9f31e3d5c8e734e0e0f2375c0788ba8f86ef000fc57de4f253a156045f580a28f1d4f92dc685ce132267c089d3eef7d75a5e74be687b725c482a1ffc4ea5ad4758ecdeb6e54d3069840ca332f0906fb4472c0463d2e715d3961d1bf45a9f650f2eefee86e36a5e17e2b5d6131eb8f578297fe74ccb9b0f43a3a141419af0497eaa7756d07f2e0aa7019222a901443d4e0d14482d2994b3400f864c3de4b31e8acaefbf050fcfba7fe900c9ef4da1533f9d25c41e5ff53ae2b8e512efe0f44ceddf647b44bf3781e19285f631be3f2e09c1a44786512c5406838d19463cb4ce16f503fde7249ed752f74bbba9c3a7d26e1c36ffd6d7657bae7a71c95deb90ce4b21672dc7906fad482628c80b10f55500181149aeadad40c20a680b0d21b3507739d0f63ca9ff0d7e139de164743d5b04d7202a903595c1b6f6d0961813709be545965d31703a8276aab6c82351bcc4f41c028b967c0d82ce639882dd7d359f81ec97e8fbd6afff75dfefa44536eba8e9fbf8f34ed9cb77ac795c76e0cc5ba6dd31738c102beefaae66f5d7b233a778136b07ab0faa234f804de87c80d6a190a8de178c57bd35fefd2b567fb77ef59fe4fb96be21663d2bc487552f1dfae21affececd6fdbf9696da67d7be75ee6b122efd7efe9b3ffd4d3d5f8b350e1ab014baa2815e7b8f1023eebe679fabef950aa9b1ed91071d248203442b00d37390ada0f02c8d2bc380efdebbf9dbe12b0b3f2607d1f7a6f44d9be01f711c99f8cc9269e3d5937a8001d69fc37edfcd847aa0458471f98ae4dcd537dcd173a5102debda7c35daaf03e115e4537545b6da01a1d25c246fc2a38ee03b4c4b36960e3e26617b704328593a69255b2be04923ae28f183329ff47eadfdc37d84f8e8d1972f9d834a0b9ac8eb497e208fe45954fd49410a5955f701c42230290c4ad6a885e751831d05b4070285a23d9c37158cefc7c52fccfe6a956c91aee97bdebefc292176c8ea76ed3195688fbc84ed51093c1cc59bbb6798ade2bd90d622217fb63db8d8fc60ed3fdd4f6c5ef3e9c97fa5d4a49dbd502a882f9e89ccff0e0a9cd6f8eaa128b4a70d83a91e5ba3e83de358faba9e514b44926b2baf81e858311558b9429cd6f6922f77f4832a45ce9b87fa165eb01257e103bd760ad795a25e3cae8f6ca50aeac9ece84a1c65491e8237d453627d29d62e6215b854c16b54bc7bb14a72aae8a54a72aa88cf4ec467c3e2fa89d5d2025ad17ae12be51709f1e686270ebe51b6f3037346ce2e8ac8b9e7e0a73b7e3c480e869bab076c58acdaa5eadf0a6e4001da0614feac8745b10e1dbb6e06208ec05cfb92097ffba709d7de03280756ddbf6b26af918ae5b571138ea890bed3177323efcdc75ac75a646fac830bbcfe44c08f63fc0c7ffeb6c3fbef223d9a5b3bed729c7ff426551c4750d14eed393269c5bbc287072a788b8cf62dd2b1e5e655bc0f14c7014f58499ffe7d871f7b491fb4ebf0bd0777fc5c7d57da7813a6a23d52fea16008213bff2c72ff925ea682730151d9ebec24156a8b76734ed83d8e5f5e41ce77406015e47a6d8e5790072bbc893edf512171c57491b5e29ded7ca02bbe15bda16645f6fcf6339f2b7385786bfcc4111f97a8efae5fae60dda90a560f57b00a9be76c808221795af77f89e15a58c6be471effbb1f228be22700ee61e26b6f033c9ed191cf3ff9eecdad5e92bfaf7c6df1fb6357c5b507af201fca7644f0d891b7d41e3d59857ab0e29df09ec069ed4bd11b69ce634d54bc9bf4279bf2ccf9edda6eefc5bd4f56df9dfabc825caed3fa2b980205ede0e867078a5dcb33cdd330f8935f5bcb034165af660c16aef3b0107d469e72ee215223b678a6658f027fc2ccd7a125551fbc0af86342e5ccacc256762e62f91482ca053e4587a4541a6d6cbb7685e7029f08fc38b5c587f3b25908284621bd97f8c857c758c9bbdc785c8c02de127cfe5344a7ebda43aa57fdf49010730ffee0d5674608f1d26b0f2e7ef93269e1dffecd8495be28948bf2fa6b553bd42d037c4ac1da0e0ad6c092aac1d9c8351898dac53f9fe1f7e2f9bd418f2c34ac65d43eac60fd5f81e37d759840f52239fe5e07fab57b01d64a011db6f79f53df15e2e891f9136eb8d75f5348e9d4c55f7329d66b0eaa1dc6b1131f113214c5c8b2ca659b4fd2a98213a9bd11e21b05e929a658327047870c95a7477510b85fa72d5fed5c055c992fc4e79ee22e7f8de2d78f7e6cf37e9a108be67ef5fa8fa8a9afef04482191a781a37d1aa058745d485841da64d1f7ac73da0cea70de9df2bd8f38671e74b6881d9d9c8b42d3b1e0e31c3a5a194fafc2f7f1b5b97cc8277d5f31a337d1514ba8a728f993edaae885891eda8fe8e582fe14e073751697a24ffcba3abb302aef359f6e707e5821c48b550ffcb9245d2a8715eb6ac8732005a23dd72715acc1dfaba050c820d21e478d096b272aa8c7057918b094ebd55a8668c0f869d817b033e00e0aeaac23aa8378501a53537f2a5e280dd5eccffb1c32509a90a1f9a1933a7410b1dd8c6321f362033f03f34abe3312ed31cac04709926fcac2541ef68e783e1ff4c6e95099c2298d38368f297a537436a2c2295b7494f6008b417f94c1efd7ce57fe32fbdbaf3ffdedd402b417daa9fe74b40fc9f32405699ed05986b4f3023c11ed6127dd4c746b29103a4190425758fd4f9113dae1b79db8f4646971877e4c39cdb764f5561f83ccad3d44bade72444de4a59a3a6da14158e22d1708a72d1d0e545b7bc8e1a6fe32574f402a0db2d8dceac3194d69b56cab8f4af0f94f75fffaba355f2d3c4488c7cfbdf685623991cccd7d7fc9824765a72c6e58418a81424d3ac6bb54c1aabb14acbe13385c77da4db6ea6b4028e06a0a052c017c02f43010abe1f2eb9013063029a2daf780c3c2aebd1838dd079c16316b2f10a2a0ed0dd34e91aabced2e9d479fd943f85b9990a2588c762a403b299cd26c8bf5d25c66f4f7587f291c29b5dab51f450760995bd3e8ad5432d8d634d87c92fa4bec8aad3dc2a0ab4fb653176d4553bba4eaeb6fe544f2f98af28af9ea89687d8b7fd5af003c44c13aaa7f414cd91b0262b4058f0a4644f71a3afc85412baff163eef78a11bba8d04dbac16f3fc261c8e8ad31a0584b316a32743d90c22bd9963763f4d63cd180859ca0143d1a07a400686b13c1e8d9b7fe498fff268171f6c56e919c27ce1362cef3efdff71d26ea7ad4d3d462c2a7b58d2a84a6aa10d9a87a48c1f5eb815f69deaf17cd2959833c1aac5135c0c368c0c447fda4712890465230a45848a1484fe5a78796bd54f5ac10fbfce3b0bdd6499fa3fdaa2e6306a4c5b547265a89b62aa20d50686b96a9d8fa24836ddd53c8fa6f2a19b2a037956d8544e9bac58cfe18b615901bd80a485d597a6562713cbfa9a569b9ed657bbe7fc88b9f3c2b3de5baa535abeab047563d0cd17a0a6da15d2944aeeb419024423b3548ef495d24191161b9b6551aaf1b83ce15a193fc92fc409a6d2cdd8d5c35a4c76e629a2d4f839c03fb912c5aa4d9c6a5039b69b66196661b36d3f2d64efaf932ff70fca965e3d3c6ca37adebf8f3573450ea6940d01a024df0a8abd83055c12a0a59214d713df0f5879b90ee5f3fd5bc7f436f86e7307812fbbb0556810ed57dd040f763d5e3aebbb4ffbfa582a9776b8e7f6fe766a5259afdc5d312cb81e7436ccb95787aae968308e823a4005ca703e3fe58fab6c28706d281cb0dbec067bb833a1fbe0b146d0869bbdac041a84aa73b3eaba0aef340faa3bec2b1df9d0bc4c0acc238fecb59faf9641d3252fc146939758def41ba6edcb830db03df2fca4c7ab1f476fa7e9dae6bd0a3f68ea55bd3f460a6897b7735cef5eb7d3e796d6a8b2fa8ce008bb1e4a9515d904eb2a0c5719277521464d0604d442b0c82f0f4c8e3d031fc6bcddf35ce3c94ba6b193fe4811f117bff8c8b5e7d64baff9e77bc54df93d1eda1d3994d794936efc4cd336e14f7d8bce331f9e3e9ba113e8f9969f881798cc61de7b79fa8f7e5b86763efdb7726b9869c521a2fc9b75e83a690ac6342addc9a7d6d250512a86c0ce377dfba395e74e830387e2059ea006880f0fa02aa2760f5058109c533078c541f141356f727cfef36263ec9a7c2531b07344a8bf4fd6ecf9ff5e43ed21c58347be44a6c62a605188aa31a03aa1a79ed7aa2a6099e4fe870f54901e809bd8a419ae05f37a1ceaf47a8a0fadfe6dfabc047f595ec3e067568410ec486417573fcc5cbaf3bcfb8d15f1cf676693ccf5f9b89b52fda27ccea5492d5ad509d4a38902f6fe2ac9e461431454f8abf0c6b0d49ea2852af6931371ded4c8a22850f3082b48b293c693de08a63789bbaf655fefdde55e2b7f6a78844f5408a8f7c9851b13aa688c9af6950c51946667b20d02047876bb6ab45b1daeaa2787b7ba601b7e6c59f5e9f374fc26f56f72279a42c2b3d81d3c44da150a648f4446e59fcd68be0fd18a4ac210a491d6de281fbb962e17cc9f1f8e5ea8aaad5bdfc7071f527b366c5b547a0ee83d53159e61dddbe5a51139e989e94dbb0412f502705455ec4e9b3f9d1c26fbbbf763ea62d3686d4f24b8ae418f3772dcfb4d6e10286857125af50dfda8be8aec9485481dc2c1e6fe71718252ba0eac90af43c4b819e6d42619e83f440a890d028d86b6e811ef1396fc38cf113270a31fbf877ee5bd84a7d17290ef238aa6169d1c4bd810aa492790228bca2095e4ff83c764c96de5589210ddcc0dfe9f923ccf76885516b426d19ca813ee5ddbbe67ffbad10cbe67cdb7f841f3bf5156c6efc00b158b6dc728e595aaec2614971cfa1b91e4e446f633fd4c02d1367eadea9e7b569a3be4b2b0458647a80918536c5bc2f6ee75bfdfba139c76d481f13e5372f74acb07a3e310fc422b731c38559baac3dc8b22d33e9698f9a8f83a485858c5ff4db8693d7ac5a413172aa1f6069cf5aee69a2ee6b420add9247ae1507267af26878e5b43ee39e6079629cef1ca0d3b1a158ead8fbfcb59afa4beb667d776e5c7b700f2d28c7d4be24c7890d195a7c8f24f6f8ac1e362b90f602111166205b3ccad6eddb4648aeb921a4e599e43c7e3e6e0226bfb676088b34981b070f14f5fed60eda7308685c5de9adfe1e1c90061ea8c48d584226d95481ae36ddf6ec21828402f3f3c72bbc99d2729d3ae49177de244bac8782b4285d43212b4a5f24cf837b100429664c9e045314a49074ba2e06aade52c4627969d8a379f769ba34d0eb4d486b008d938478f4b4d13fbe2d07ecfa49bf0d9ee26725d92b6f9b54fc71e73c84d5733c04600be930cb90f032411e48583d9778e24cc94acb6b8d2c1e3dd0a8e29c2c35b2d0b006a5150d0d2c175052eed465e73dfdad3482a13dc67fbe0e9d8641c394db60a88f4df42ce4423b20b09046131e35574c89f945bf554d5877f6af385f424fd4344193e7408a84e4c8a228eaaf33ef6f2479a22f8242a076d58ac2b340b2f9c3a0430ae668461f38c9b9fffec661f507afe811d71edcd0d8dc0af2dcc4864ba0e23de0a958765848ee5146e9b53c2c7d581bf240489e690d9a1407f7a4499ee90b8405b75e5b69115d33481f701ea0fcb0434e3a6ec2b97bc87f5738ab3233857dcf9d5c76a21e2fd0b355260b56c949db8dd3b907abe85c05cb26706c93396f61e35e7ed6c2ebb5139c7ba5a25853b96adadab5ea4575c83aa9c5a238ad7150e19486489bd3163fe5b943d1e858f07d0ad2e21759527a7334b2d468f16b1120069cce3ec9657036e05fcce7f9ae9d7a80d2807e1cb04401bf7ec7bffcad11d6d5fdb2c3a71d84d8e7b8c3efcabf4cfeedd250a7367efe4816ab7fe09b5a52e52df672726c9b5a9600cf0b6c0a5860d06fee76f8d883ab7a870d4fafbc4d88f7663eb73682cfab43be7ca0f21e8b8df5d82a425bcc686f5f727abe73e4822eb27ddbfdbbd3cea37a097b21a43e6f05fcd09e56a556b9cd427ba8e7790539eddc908176d015d3ba1d157d5e31ad0be92cbbf71638d166f9a17cd1cc19cf08b160d6cc65df9282a0fa0e181cba10f01186935c53012065b3513d0d2dd6421ef54990e4334544d317fd5d7d89f608a9c053ef8e0c34deb2ee33eee4ef7bc97e6ad1bef585c7a688c09e619b5d411edc234be185963dc93293f41f3fb29bd307bf2b5a7f37e8a35b8598fbce87d316832352e4d46f753008abd15f3c54e861bc9b41b9a6ae6da5406871724fe9f2b71e78cbd9f2839c9cd0b8a802b16d12480386d236835b3a44f1b84a5957dd67d99e9ab2765ca4411653168f9e880ac1353d17c5970c9ad7fe95ff13e2a3092f8dfa18e74250c1590ded0d457bfa509614ad29208b4757e2526c185b3be8024178149425d1882c13bd391adb3d534ff87b98bfebc29f08201d3073387b9ed1a14c144d2793d151538d767dfd45bb953316bfe65b767b5f7668ffd52709d17e8f1d861cefe7e387d90467a9bc75b01d7ee02853db76f8b64d2d9bb91dbe83c2aeeaeaf52d562c970ae487e7a645162b0a75df0292278681568bf45d4a57a5100e296c5f027becddbbb6f34b42b4ddb7d39051a384bd827c100c22da7d58ef50d0ec0af202751f7032b0ca40cf5a60cbe805779735f9c5a69fbf1dfbd305f3a4dcce9bf4d1c35f53c1206513a2be406f39429e33853e69cd83da1385806400e982b512e024771b7b2d06545f168bd933e87cafa0ef711e15397d5a584e90691b5a743fdaef477d9e0dda61732bc8c35a91b8784e29024adfcd0a9ce3a3e8c50ce22cbcd7a417dc44d5e07759ea82ca0fff2ac4d76f7df436350b9f5f743628221c3a6d9d0a0da97f9aad40b655165638f64f5adb48ba4920154a59b2a244735dcd58cc59c5c85de52807b22858164cdde29aa3d75c22c4b4871f7bcbafe7f02fbd884816197920b4c6408be6e469b0dfe93e1e3bd6a122a48936248b099367c15cfac0efd90ce7210097d12d372159da74704dc33380d7c5f8fef79fdd892f1f2aff7d7c5ddfa5be27966c53cb5c0a15e842c0701426cbb6b3255b503f0fd55fc343911edea7e8f5f0d692ead1138c6342bdd60148975e740cc7c1bb301d06f93743529303a1d36685fa026b3d14922a33e9c58d0b93be48ba6668f28b71d0ea9ef48cf6b3e229c4c903c90785b6204fdab3cd35ef377b260e92a7bbb957c444ada12ff9bed02b298f76f85c240855631eb085d4692d231892cac53b18aee8f135bfc0a23b5bcb08acbdd8d76815fd224d4f5fa46a78d2876d6b297d8539a524bf6f350542052894474c79f352e4bd3bbd9ce8df939dc5ede20c73cf52394b8ba6634d3c703634559e0e5795cad6b3b86395a2517c8937eff16972e25fbf68cda4aa4ac57f3d424cb554e0870af06a58b0d5773148d951b4484d8b8d503cf5a729a8d71860d97917019207d105902cb530a0cb60449817ffbb6b3eaf0716cebdd0037b2520425f742e4623141c15def90ab0667155e76ae989ad2a5de2de7f94d067c77b4549ce9a469a76ac421d490e5a0ee80c76aaec653b088c34cf9e97f2d215df8401ce2ab2a9027ba47719358fae4d1965e27a80bdc1ee73d97d7280363cd470b2d34b24ad20977267ec5890ac023969057970a706b46b62fab18a77b33d38bf342e3a2edc714c4f928b0820970fc1f0b889dac06d1e46c4f2fb265e640805e803fa4719a75e9e569053123f4f6067047d563cab201f9bb8825cca6d58dda777c2207c24f09ef1f4f5ce0df68a77cfa017ebbfb1c013d2f388df06efdfdaf3823ceb826e9267ccc35c2168c36994f9bb3eea99dd1fbb526d7fd8cc8b0a090952a8ec26e16f25b2abff7b741130e20f462ffad95e3e0a078b142eba392aa073bed2b4e402ca8ea3ca5c132717712e2626e0ce19848bf651fc1e78404345b44ede2973682253dcbe2efa357c29c45723de7978c6e312bf434e122898d28be6fb28588b02bf1a1432d5a06ea0166b05b5d892a10eae7d7da982e4c934c2a2270bdfc3de571e751cc1ad7d61c7006d29128e89b211bf372284a73d3128c014d91eef3dfdec35af458438fde74befbdbcc23fa33c25bf4b6eb41fa84c49f56bb6c29dbb3d65410f55ed2fe540e190030772e015432e862adc29d6fda5f022e08f79d1ad109df355c1a8fcab7a2fdeee105e1bd7aa249fae890b6ca9217663bf634d443488d87591f748f4ef3b6322c65e6be20c2d97eabb2e253916bfa9ef56fcc8bfce51cf9147a670c7a5ad3620c748531673411f49266229e8b94e91fa4e25c79abe8bb3f6e7821ebe558ec184fc0a143eb6ba307dd73d4e1062d74bf72aef200d9ce5f77cfb455577d61ea87bc22e6431886c426d406e2b39a6f7cd0dfee9c4832e78cdaf407746a71c70a05fd0eb7aeffabfcbf688a64ac87e32e5aa58b527e1e20c87fc2ff5f524c7b1f98bf029c013cb7136e84f017d57d19372ace89f81fe8bd19b6bd03b23f1b8107ff3909a234ed3fd93095802480a06862aef179aaf05222cba3d6d06c0363f0f44c469deb170c5b2a1798b74baacc269ef201796422ef091c0b3f55e400acf87459acbf6aacad678747a96ffa5e7e8efb9f1f47fedb672da6772c25f74c797237eb85ff14c15ca3aa68b186fcd5e8058f4d685529fe13ef2342886fea5828d0fa02d4824a96d86e31f6e8286db96d748405701f2841ae18951c5af6e976b8498f3eb075d7f3e56880d67ac5df6fa7971fd45fde07966bb77d338c901f6c0d22e3ff50b79a8745f6ec2fbfa883ec02107823c1af433f017bcc302df7b46f39ac5e995e8572fcba03fd622b7aec836f0b1b07c21c71ef60c8bb597498fe8d3f372ba37e9b93a7462d2d7e30296accbda83f38b3de6c4c5ce9329f385e83724ffbd41d8132d440a97422358f3d36b63fbe1f7fdd8fd488736427f22410865332f8719043aed2022c47efbf5abbfc0f728677a0fb77ac5680f53ceca30ffd0bc40ede19af3846c37a3ffa43c8e8c7f2e209f14d21dcbe8537fba5abe397df2145de33eceefad62a2ad3dc803e3f2abfb6593afeda040c46c585c2ccd36560fc2f2dc9b9966eb253b588a0e1c9a0c8f24162a08c73ff7cbbb2bdd05c85ad0f9efac325617449d66c23a5639ab3d0dbea641ae3d8f05bbe2f7714514d02181b002b4670e2fe88a4ffb5d3f60cdd84f55411d09ba1bfd238fdd4ed685848a7a2c8d32ac9e4b9a4649fdae9e2f6331e6403e3ef053bd82649fdffc3c7849af87b8d7a06f4b0f1f8aefb6542027af20a7e741af88d18ba5931af4e32ade4dfa9c5faa7f60e9a93b75c97cd6df72a8e3f93b465adfa15ec00bd5fcfa9728bcd1fcdd61e9a4d6f451829b7a45189db8b5ad434eef3fbba5e43f756c8b4e237a8860ba78b0504f8d467b9900eb3f536ead72ccd2ade32ade4dfa96ba1d2f58706bf23bd17b8a9a832be6c0e68861b185aeede181f4828665057b818ee58584b6bce9e62ec2e24cf4d8161a1880ae39d1fdd276c5dbcbc9632005427bc990e2a0ad1cb0c543fd97e6ef7a4de36d130616f5d804fdbbbb5c05744c3bdbc4797d80fffd3f9cbee8b8599f8ae0222057fc083d26ad4f089e10a770deef3ce9829ff818d68be9cf27fdee70d23be22eef21d0a78998f837e5b60c316b4b057260f1365905b9cbe859166f1354bc47e2e9f1c5775e601b9a97529f7e921027de7be1a167232d579f7487d0b43ef12e8541dc1782c2e05b68f045dd8d1e07f43c5350ba504efe7eeccde79e77d93af9ef13c45ed1ad3ef8e2b82d2943f7a7c2931944d47f71725c6ed0b757bc9bf4f9e23b37b439bf504ce2a9a00762bb9abfdb6eb26bbb7820818a5cd37388b96670d99bb64485ad32996bf05821a18bbfe732fa517cf9bc85cf2d43e8494f90b46502dfca810af5f862382b64f2980209584cbff7cb05249165f528f195c0533f1b7ffcfcf1f29e8cc6aefe76dc3605109714e102373d078ba5ac71a6f8a581c02df1723c1706a60660913778e31bc07e79592a8425023b2bb0013f142b4a16851ad8932d59057911a367d983ab193b35103daea822f1f4773c6af71f4f919e65dfc543f20ec0669cd1839a7cf81e60aa89936209912221cf85425e3491a937050b356d17dd5fcc70f270a4e733eac007661d7cb010690569a3afec23e22315bc3d4cb9e35951aec5a3b4f45f6cab1379473cfd8ddd934cd3e70616e317868637513c656baead776d170f44efe1138e429b02a09013dfacacb995c9969089c059dc7c0faec69bbd5b7c05f1fdd3734e58892c283d3162c2d4bb5a12fcd2c4f9d60a81fa8d306079a296f91d5f1105680156437c5723148b5fb752fb53f50dbea7d698dd78d81a7f5750ee39c4fadd05ee014f3cc0936c6aa92d7dcae2b2a73d2a3e0ac4819bd002492f3e1127d8db2ddbc0b9428dc9bf527c94aecbf7648b7920263dcb1e5ccdd8a9c1507cc2b6075758bced4fcc87bc31a0cdb5d70871d075c74eec8e02e1d49b14d46772bf6f42522ce499e8901729148b22e1e9d581bdc8f09cde2c503e575875eb65592542b47ba6f30f53fcaccf63c4f4285fb69051305dd754a4cdad202fd2b849cfee512696e3a0a7e202cf6d8a5f31d1c3fe0adbf2da3e1e08d22f93e6b9bbf87bb28e4de849789690492c5d4fbd47d33fda2bf72deb864bea3b9342f09885ad435254214e959c5fb1fbc85227c5e1e2db23806ee2a6f9dd5f2a9fc71a8ad347c4faed748ed7d3af8309780eb1d000ad45259ee02c13a8280ab8f20ab7af9945f07eb204bfd8f80fb75ff03fe2d7325cc507b314f96ec17ca20fac65f01046127a963db8ec215e1682c94d1a8289e22963530677b857887edf0e6db8335d88c38e3ffee21e384fa6052af65bdc02d84241522cdc43d16b26965d6203e305502b0e0a8d49055238fdb653bb0f979ed28bbb757bcd4f9f2f715ee8f65882f6e0f34dd06041fb24f128f95a46cc03e11e0e4649807e62390e1a5ce67cc63d4aa2f764f343585beeda3e6b2054afe1467fe09e83d08b8ee676eef68e350752929089ece832e0864617478a2ba396947ff00ba61ada6327b0691b5b14a73a09bd5680e779e8475f11f1c7bc26333ca24020ff5f2a5eef79ef86680125b7b88a580c3f18630e834ac209d4baddf5d0666ebe79803877633f3bc9751fe847a2305948b6b99e74b26dec9bb9fb305fe3b32a561a07c9f6e002fdd0b8d4dace4384e89b7afaa78f7c23c4e9fb5f5a7b1a0e386b3950c116043f30210f79e93513be2bf20d0cb24d2f7d7849f7478e3ffd7ea93886765b3de323f9630731b47bf720bf812404dd1ecc80b184f612242118f4899e97dc2032e927db43adb97b703de5fd7784b0c46cc46e5d8be7e069975f291addf0dc42b2c41a6d8b60aeae80a7b44ad3427064574b8ba6c5b256ed298b444f88982075488a2c6eaa70e0277a8581d3d0734d7a7ff8cb5520a03872e37e6f2316f81e5bc0e222055014908348146fee04ca43037ccd8c5b7224079f6b7f708b5c5e778fb2b0546b240bc942ed7af65838a48b293e6e79ea106f20a461d00f78eaf68a77e0dc830a846014bfe83731dcd9ada59cb8773f36bbf2ea3a21463c7ddf19e3e70b31e0f1821b7ae3fc9a561f29d812e9eea460d20628988a50570a4261742e4b886d43eee317ed7e5fd121bf0971d90d250f3df78b1caf43db9c35e942c9dfd3de24bfc2dcc66f6ca2e7910bd902f1380f19053ccaa6fbaf191ea5a2675df3e3f4d5f35e207984fa93e80b54696dcb6bfb78202a5f3f567199118f7bb133aefb00372a30636743377d16b7ceaba74ae7a19e12dbe1fcec691d3a8be219237617eddb8357d4435045b6560c54794b59497dd8fd432d1f1f69a261fe08d712cbef6140f9fd5d17ec7370caf3521fefe13c919515df7f7ac700d55fc351491d93032f1ea709d38b9d05ad26d0b1ac527832f081e8df91141aa333d959c5fbeebadc6dcb5c2f0bb277696237e5aaa7ae43523b2178da13a309c5f8ee0467a687d5f38cdeddd859a127ab700e9bf4b5c2e615d3818a778df39d1acc7626fac18af728def2f836030e5b2f44af2f8e7aa4f4092146653df8c1d37f15e282c231df5c8b1d0c5a2d0244a1664b759abd68f18282a937034a0fe592631e1d7c459510ff77cce383a7bd2e445bd1f1a419df49f95a1b7a75503a0cc23c11dc59a299fcea0aef9ee6fce2d17c633933ddd67f7afea13539a2ef592bde13f69f2832e905e49855bc6f9f6bfb1412aa7aeb5801190aa3b4c657781f35e0e20ab2f20d3c5b77101540914b4f03361ff7111eddf2305921e1de8d879eb72f16d129e64f15d9fa9acbfefe6192fbff53ae8f92fc5db6cb311f9ebd60af1ad99eb78bf7a37503e4f9c50adc14de2d20076a20c6e440e1b142420ff7990a07f77ba4905841a9c70b4aefa3ad25b7cce5fd038584b1d0922957f9baf06f7814c60a66738de79215d6c60ad1a8107338701a0fae41cfd516aa493f9fb5ab6bf21b37be5cf69ccbbed3e097eee3fd96766acb8cc373a4437a5fc70f0b7174733a7aa00d60abe3156c814d4a29d4e5af9d844e4be97d81bf13c4a54e873ce999786748fea6249c0f5ca33decfcf2f6a6423d935eaede5ac76cdf228b673256f727d133e42ec0afc7f865fd17777e0876d260723c562b14f5fc96358b9a796d8f10962d3d91af69c416456d2e3834344fc76378ac90109689b650c9d20dc7d3ef94beeb817b3ea11875c280b4a8075c7b1254e95966fe5ddfff9f76d9b6a40803ba42b4df6187b17bfb039ec79a7956dc1ccba26233172d3d1e6ba6b52d1e6a60a101f142f242c28dba10f7b7adc169cf21183a0d83cfe6b5838ee983fe1c331925c1e22dd133e87bb62484728d1bf43c5bfaab3d4b8cd3a7f18bd413215ab75690140779202d61886905223d11ef786f98e38af8f4e508e8e536c92f0ff959d6209286b878fbdab305c3c00d7a4d842813d3e7fd972cc455a45722b7830ad93e1e881bfd87250b443758ac9030acfede74fa5cb0e159c7d2eea5ec2c6e1e836fdbaae3cabdf602b32c2f9da71386b03500df84cf766de9ad1bb6db1566d055c0ffbe56dddaec99fbb631108d81ad073a7990c9d6b6bc246b5b34307921a1251dd87b5e3cb7e91f1ebcbc87bc1e06dfc16cb3281ea748c07792c55b7b3b28fad981f160d24b9a7cc2e88739ceb28c38bfc9ea5402fc0bd7512d215add06c8d64674d616d646a2d95b03bdf7fd7115e731c1c30964b599fc06179b13f2ebf15dbeedf38da297acff8259a389f90d26fbf0fe2b37e8d9d2dad11ee284ff922c2c315bf0ad44127b0e7393669944f1b8504018f7299c2fbec7f61c220f84776c146f7d7bdb3b7aac10a2dbf13d1677c1eeb3fa842f2a80a274c33f3168cb5b4fa258fe70575881f86da1b3ae3ee0deb4542152f35bcc39cd4f948d0d94849e43dc11af9128e495d83afb2760d1d144685a746582ced00fe3a98496a73875cb16128a7bbdfb0cbeb9e5e96a45926ff24d7c5a166f93b5c31cdb963c4d7b7e49b72bdff48a69d7a0a7e983de3b6af342ffd28be9dcf3600ac42f54f4da791da2060ad10b7a50890dcb66f29bd4830ad4d524e93f9b47c9f9e51e6539a3c7e538d7a4a7e917690f15e5cfdbf2da3e8be8aa5a80bbf8bcc17ab22c137b564544ddc77096bd2326eb89c7051ddeb10acf15f57e7efac1ff1a784efffe8ae71014813e9c9e200e8cb21d56af3d8e306b048eff512ebee9605801ff7b4fb8f0825f8ff1dbe53491bec3ecf889c98bdec5157fdc11afca82b285063c6671c506ba69d1f56c5e41a9b4d80ed8a46fb75df7a92096e6db9eb64c3b21440c3e83d966a621656b876cdb963c8c3e4fd74d56b0b98915d3090c41d007bd7e5e3f9297409a2f656561f13cbe2051d26deb8fa3380f246cb60fe797cb41805fa33db43c153143d5ea5126996f2ca1b200bfd6746e4e1ff492ecc1e59df85f12c212b3bd68e0c76ad9101e3be33ae1c014b68a595bc884151226e85885a363bb84ba5d3be016a93486a64ed7854fb0a1f45e40d8be3d85e5a9071409ad89b80cfec12e87efc61a075b17b7f5860d4b608186032ebd61917bf602af307b2eac9eb3841ae65ad6cc825b4e6ce140224a0923cc320ca62dbbc04d791501790d839ed90e82d19fccb6e4b1574c1bf4032118cfe4d70b564ce71af42c15d3090cc172e08a5e85d06748a691e2a050d5cd26d40587124a0fe43d78205c514536915fdede241711835f8bfc26283f30e9894df328adfdd75c8f72bb5cdb672b13da4a2412fd816b72c287b2421f36303d9bcb99bc90d005ce2d26435052af4bdb31234388a37ae6ffb92fb671d78ae358c0330161d3eaad1a6837525220150ce2f73f8c271206c422ba5e03920a73f8f9b7add8ffeff2df4353960dd941042d509b0270931494da423bb64a6fbe66669383bf78a76e5a2358affbc04f389ecf80651bdb4287cb6b79423eada138d0679b516e6cc5b4675b1b48bab6a1432606fda46b91d77ad7fb7b6039439defd26090a552a8ea2606e31488785e4cf67fd7f4b807b599fc7ac93ca864060cef3fbb47e919f4994769edbf66eec1e50ddac2e9e9cdbab68f07a24258c1c530d352a0dd4bf9c0d96897532f629207825874924577746cf76107655d7081101dffbe53e7b66dd52704368fc3feaebaa2f64605b52281cdeb44d0062ef0dffbda485801adf890beec2b9094c753d7fa0aa4c3fd3bfde94eff00a172f1564affe4ed99c022e7169dc23736db2e5921214da052856c424b582fef3e5a03b1868ca278cc80015f8158b82d04a3cb504dfa939379668943880185cdd706ac21183e719af4ad15ef9007c775a6fb85827be51c7af8ae38ab9bc64b2205b2c794fd3a75fa428ea10f4207ec382e48cfea416d24bf493d289bfcdafacfee51961bf439bf36cf3ad91e5cda10f8ef590351b94bb6c5256aa0a17ab3bda6356f304bc1f024122c62366bb1953a36a543daec2e63853876af734f2b54c10aad38d2b02d5fea01e6ef7c9b6bbec74f4071b8e2f779b9806105f44141526e46f4bab7d5e9fe00bfde79e2e8a3134c1cc916592d9b5a5a074a320b976fbe19b618145b7a2b45a4f1c6f19dcbf85696a6cbf6760bc4c293acedf1104cbe99c5d6ec8a69aeb0051b5fd6104cd3e9a4d6f45ad65fbdcf3ff9a2331f9672d323b4418f17185cbe61e6b4748ef3d73e8ebdef9c23fe7970947e91734c7c7b04264ec3b0b4f21b0c1945e2bf7b63f70cb3f65f528fd2c2afcdb34ee651825fe97ffc776c65e2dd2d7a4721af4c1ecb2a88e94cf4b0ae4c0e1b38cede8eab10557fb79d113d5c552a4baa668568cfc0da48763c2e5008d6e9cb9dc5e07b8438e1a00b773c1ddbb7b73819f0604054d2ea5d4829c445a12d0c140747e1d2d2885e6cef96b8cdb6d94567d993a7419e07f80d2d938ae3ddfbfaf5bf588856b9e9a73cf08c4854d14bfd659c711fa8e81d8afafd7c76c6fd4876a6bd3ecb5bf75786f13e8f9d40e9e9c56b920385931c3cea6d4e0b052e6f847819fc848defa509295f2bb8c467f1f38ae9226b653ed157f42e853cdb2aa67bea1d194cfac18a7793be67a9c84e5ef19e983e3bebbee3f53b7e70e435429c7ffd9dad1f1821c4d9ab8b6eb9f45121fe9c5efcd5e819425cf8e2bd839fec2044db833b9d3a647682f618da7485b7955fcf6c0fcd6fccb04c5c419e6c070cd67f62b296df9e06fdd8f8189b905f9b7c8c35e7c9d859ee6cfe7ac74355cdb6bc52b60e591efb8fdfcb66bfa5b9ddcf962eac13728ecd2c88d650288f24476c88c230f074f10b7045ab549ff0abf032e039f821ac70799f898f067ea6889ee2e15c2556e1ef61d051efadc47bc3f2cd8a8ec233804744beff5dedfb76e9d6e74a213ae7ee5a5f394988851f7dbe68d10cf58a86110ad2aeb41edeadcf032907a423631f071e018ee771d8e6b6bbf07e0795c2b4581e2a54d04f1638bfef98ab0f962dd7f6b78ec7bc395dfe385a8c4af763da6384f2cb72d05ea3142e9522b5e7e2283e1a7bf5e4002f134abdf652fd4167d3cbbbd4dbc33803ba549f5c3e0acf293c47e192bec2d31d17f8283cb7187801de1fc5ab0fdd307ac50a213efef8d59ff1d9faa8e2da5a138f6e06e9e37d156c64e7a0f857f7f483a674ea24db65c74eb346668ba0bc66002fc3f7f712fb01ef85efcd029f6183ef0cf05d06bc12f488fe2425cf12df318a4fd5f2aae88d52b8ec0793fe18d0cb51f4a55fb418f76502a7e7e800d47483df9c00bff0cbf57822fa99c077c4771ae32bf5bdd4b6edf712a275a4ddcabd4e95704d7af77dae95b256975ad9b95f13ed3117e335037c4614bdc0f81d13e0b757427e2b402f205f49e6034bffc9bf621e73480ecf30f8b5cd37acff02f3e228d02bd6e36314be338aaf98b770e70f3e1062c1ac590f2c562d163b829bc97775b582fae454da5d3c817c1b5784ffb03d3c90a1d87a90a5d906b22b82a10dee1a96e3b9309e4b1cda2057317022a1356b83870ccc90045cccdd4ee879cac5efca7efce4eca3fb623b6b7e1e8276d1fb2ba8b7af2605cbd748a8d23b0218165be772f13e87bd3fcfe4cf57fc5ddbef3dc6df9b28fdb58e6fded53bda5e22e53d114cff8c850c9565172cf4324353d93c446973e193ac6d45588832991c3c4f6b0a5be6f2b2843a562cd9f6dc96906c732ba603a18c9eec402916e24a5a316d5bbc4d16e22a67f42c8bd9942ce0250b716d6c7b3437e4d75c7e75882b69ba6ef3f82ddaec1025e79f3c26d7e097876ab7cbb53d16d1c77b9fd5bd99a083b9c0bb1b5d48e8e23e72595ddca7f06c1d7337cee26e6e0c9ec71c433d53f6e9226de78ce3bb0d3af21ef5695a81603150676ddd68427da00ecbca7278e8886082b459f5edcd83d60247dca60b24c963947c0e5a3cf2067fbbee218b2ffbfc057f73c4494edfa3de12cd99e89ad79e939b793265b2b5ad5c8db3b52dbe28acf0c6bf37b6a4f35e6cd7a60c49ab3c85d9227fa0308d2dae0acbe2ad6e4fd09bcb0e94d28bb901c3caa4dfdcb468c29b5b31cde421704055330d8ba4ed212c868b7db1b9697e2301c5b479fc52d2446ceda579fc0a937ee0802a7b01289eff2fd98db7f1096f8775eb445c077b346144f1e0a2289b5002f504cc73b0580a34619162b26655d82c66b61856fdcafa57e7ba427cfaeb1b67bf70b6fa369dc74ef03d40f240a85e843c0fc2c903f81a907b0604052e97dd9704ea1055317b1f16f77581a4541c7f1e72c327fb4d1162cfa507b67cdf5fd4ac087903fd4a61bd379965719c5b5e490abde20a09c3f8a6c472d05c4545167e845978ccd3ad3fa2eeb9eadec2bc2249f0262e0fc71a5b2d455abc1daa0bffc2e0c79828ac3b28d82abc7b363dd107dbd3b2381eb46c153ddb1e5ce58c5e7031dbc57711ae9edff40a72b33d62f2602896048bcd090dbf00bf76c5caf92d4fc82fefbf60ba6ef3f8b5f45fb33dca27bd89629b5f5b6b0d8426b04a05e3d7407a3dd9efe5e356c8bf8543571d70801fc3c4aa8583804d1831c0a93ac61d8dc43b154e4914cf54e548f2398557a23c29ac7087ca95328147800fc28e5548e795cfed07fa613c67c64623c0f3c0970bbe4a15bee0a14fa68d8b08f1e5fac805f3a020eadf04a4d8e277807f56509f6088a9454f31f466ca72c2d6283a7b8b26fcef01b13641ed9b4c8184ce33e984ba034a7a47be70daee6d4f12e2a4ab463e71d96142a44fecf0b709fe1ac7c14e64a779d176516fcb75c64569cc546b0cb27d5db4534114afd46b10515cf6978baf527804789e8ebd2316ec8c05aefab954cb41947bd98b613ce7e0be30ee73709fc2a7ead873897a3f62fa313988e26b3bfd7cdcbc2384f86cda9b8f7ddc463158f7a882b5470222565cfb06fe8e359006f49fb748e82bebf4031f89ae81d477ba076b20fcfb33812bf9cb51f2a7e5ab92be57f99b0ee199c023c01dd6be33f59a613edaa94979d5f4757bc2bfd5edc9fb4fdb2b6183df3c46af8202ad8cdf4a920f3d4e0b412d8cbbb3d03a267d27497b503b64425e74fb307948d61ec46fa5a4a0e8d1bce25af87512f2cbfbaf02f4c2a057c9f905ee30fa167e05f1e7825e29a35fa2e8adb8675155740d64d2ac8fb6dd1ac8d6522098d8e237d98bbe4e4e643d5fea3b39574e9c2977a6dc72b8bf9d334d2861085c05f06c35409c990e2d299b1d90870e70f15ca9a06955e111e079c0b1062256811b5a2c2c8580d3a27b09f03ce0b10110c5d79df8eb159f7d26c4b41e13264ff2f320de12f7345cabde5c3b5dc1fa6b00bf55d0efa0837f1b58d1b1a310bb2ceade316589103fcc5ef8514d0d38a6897e0af08780d3444f0aa01438790ca4602a4c5cc3bf03fea4a01f52ebfcf42ebfa55d20c4397f2a3ef01cc9ef6e55fb3e3579a5fcdbcba97d4ff987bce91c71458bbfc60df0d862a65aacccc7845c02c59ca7db4f097405c363eda9ee77f17c312916a8cdc040b44ca495f85a3db08167a39f676a3988e0bfc46714fff5c455b77fb583105f8c2f5ff3d93fd49db5e8afbaab814361d420345987ddb31a707e858ea24b8a59b30ffa47a7355281ccefe88cf44bb91cf6fd3401e4e27b573b33d577e9ef75f1bd99e0bb047c67826f931eb56f362912935edc045890903e53a8b23d39fd4ae061f05f9190bec3e897307e31e169032fa6a8ccfe2b019ed7ccf6d0133d53845c1e92b5472c29210b6f013dc8fdc6f30bfa307cb46205fd08a36fe7b702fc0287e2d2e383d1cf54f47e882cdc3faa40e67e3af18faf403021ea45594c807e0867df1ffa9cd2e329f9ea7d53db0e9013999e504a9927518a0ec947d64aa5d960b109857548a5c5b219048fc645964e31d3e415014b44e198f81a3eab7f66cd0b424c3ff95f9fdcbaaf101b0a7ecb589fa9beab1e618c3a84b2ea4881c88e69f9489b6ffc0967c053856f4fbc5188aea17de6de9c26c4411dfb2fec7982103d4ee9dd77c3ab422c3ce0f31b964a8bb7eed39a17424fc4dacbbf52f604de9de15024baee64490c4ffd6b8b23529f136258f1b517f4f95a7a1abd073f7589e4ffc05bf2863f34d73f052eedecb37c3ed39c15ed4f89b64b816a778b27912ba23965daf2cd648adab10ab883fb145e499e04fa23a6384af01c5ad53291ba946dc7147f29b27df2b545aede93670ec4e5950b2eae9053e4bccf663c3c1f1e07f5572d2910f2440e347fd7d975e441ee216787d107a5777e497a6ead3b7d3c72a4889727d56e427bd0ea7b33f44451827623b98f44d14aed4147c0b7c2631e4821be7f1cbe57194236455dcae897980a35c06f6c622b01ff9906bf79568fdfe4b752e305c0897ea6413f93d14fd61ea4b8207f09e43673a3daa342d3e386cac6f25b62d00b7a50aed11e8e95dfcc787eb5e27341cfe251ae7865d15dbe02f9f6c64fbfdc760a24d572e356bc6aa755fffddb3f0bd162c7562be37ff7105384580b6f2835b8171d289e70f0772fda615e9ec245ae4713be8a090a86e7295c60f15c52a5fc6b81f7e51a389d1406e527bb279a293f7b69c583e33f1162f5c0a5ed7e3b053c66016262a7a36e756260b110832b2ffde06f525186faa4387d7c8fa34244fd8ed09e29b7f80cb59bda39922fff71d6f9452f2e6b2f3b2fad7ecd47e7caceed5abb6ab69c98aafeb5e18c6fe64bda4b1a4eae7ad727ea7cdff896042f88a57ec7a79cd9e2cbd633846895d2e6c17d0e90fae0a116bbf798247fdf3ded8ade55f23d53433bf4f0155cd851f6f60962a03fe57858dc73cae94b1d8aa9266ecf32d51f5e2f6f14dacd453ba9e9b40803b258b5a4a73d00e0346121e6ec50619deb94e339d5af61e0aeeee772c66739e353e143892ffd1dc5ea6e2d07517cd590657badf04bae1e93ffbf0bfd76392079162e703a03fe13615e11c05c5f8978ca4fb9cfbb25f66b549ea254e4305738d6689c71e057cb25e4ba58f11727e70aa7f6cdc5f3114d4f18df4fed51eed0da05b5a7490f752a7457805f4eafc2c403fc127d97f14b6301df238a40af18f404eb3f6a8f5cc66fa03dcc792081dc6e647b00af30ff1ee097e8b949f80db3792af9bcd524bf02f22cf1c4f489df89dba390705b792071b1fc5d2ed8f352ffdf6d77e95c71913f95c72c9e523c0edc1a328944a13d26a8f03ce6499026cf77a28122672ad64292844c7e7df7c7a73e94137064d65357bef28a62b01e057fb51d15a41879ed55313cf7b6337bee2fdfb4d3d2ac95637e94f416398f473d31b2204bcc509cf38833a3bd7c3e7476ca91d9274a45b0a4e55561c941ebf5e9f70c1922e19eed27f99b15b679b7dd9567cafb5aa7b7ffe02ce9f1b4fe579b7f9d2127c0d4c6160f1c3b5c3e7f7aca80033b487a5f398bba74897edf587c5f217ac1c5f715e2fd61b49fe939104eae7d01428a654d87f8b4255669099938da9388eedd2365a22dde17c6fb95f4649a9e83954f41b8b6f00b0dbe9805fafee1cf1efb9454e86bd6af7e6feda1e837788e7aede311056bb06b56dd3205297b8b3c11bf42216bc881ed3a7f293d909a8e472a0f24b036e002577b15e5a8ef6dae076db53c4b21bff9e897580846b5970ec1f0b5bd4008c6e457b72ff3a06cfc06d6326c2118e641c5220a8e41df491a51803c680f44d12b65f49bdb1ee411f39027e7b7c2baf6c2db43d1b3785071f356b3f88df3d84bc07f5e227e7f58b06848d403f9eed367ffe3ea40b42527a7b20f1e78ee81cade92c98b1a2e5fe81f2c434741f6d495a10a1fe8758d3e333250d9a94ab3f22d95c954e1cecfe2a60387eeb69cc5ed253e8bbbf2d239e203ec1e4a0ddb8833d21b309134ec8bdfbf92f3c3f893bbec7b9d9c585e3ab0c758ff88db2fbd0bfdba095e912bf9322be0fba0f29e57d2db2b8733e2f98c3be33d17f4a892351b7fa7f6cb36db13672bb3b3a1637ca25296ce92d7edabb34050290b9b932a673d9da5427c16197c0ec711af492a86359f439354bc0f44ff4ee67c2abc2ab476dc1239757fffe3d7b7fe8423a51a719a3459f3d8a54d3492cdf70c203c138f56e38c424f6f77bcc794a79ec0e90cf2817a13cf6655203751e1ed815ed315d3aeb562daa43f3640dfb2434380df9189f8f558e5bf673f233c71457673e561632bc8f32ded413b2024ab20f72cedd133d01e43f15c86c97f604705ceafd11ebaff680f35be6303e7f76641e5c9dbf0daca1e08d96021dabae34f7270ded4509b22e13e27f72eecf6a1fcdb8fa9837b5f29fccad982e83dc54e148a7f8a0ba37095ae1ca7ca4e552d9121a87254e13982b2b6e6aafb6091e2140b0ac188bdc411784ee0b9cc785e79c57bcd37ebbf59f89d5424f3befa753ead6d7ca9602d2cd4fac142ec11ea35a59d9c120f7becc45f1f978a24f459e8881d2e13c10ad45845ee06bc4fe17d54e5bd3345bf3a33099f39f17ccafb72709fc2ef465e382a95e32a93d3f13b55e62a3cc6673ae35355ca8e4799232abfb5bf8837c6f19993904fc2c7003f5074c073613ca72c39375041adf0d1492adeff09be5721e9220cbe4a15befcba6febdf9828c4ece5ef957d75bfe2a516753bb4585e8bcaf31aac79d41cab60dd170a3674c6378ed6df2eb2661f98d7e945e981ccebf8eaa874115be328831c0f42bffd13df5fac2dfda62b90b9a5cf2bc8ff097c2ea3576aa9201f64a9c8d6fc6afa838027ab984e6f92dfa9849b15d3baff908517b76341f32ac87985f7665690cb7e1a0b3c2721fd58c57be2f688f19b6ed0cbb1d0b3f36bce07d47f15a09741e32c31bf2b672dba3eea814cfbec95641e48d56b0a363c06f87b5b440fd429c0e9d27510d2f3d9e3ed035aa7be2f44cbc5adbbff692711cc0629c59444698a3cc445e9bf3aed4de17169a04a40622118ea10c55d8e0e7544149389171bd3fb75ccdbed2d217ec95ef1d8c77708b1f6b39feefa0d1349dd3e42b45f95d1d5df96fad813fef2d66d2b84481bd36270d613069f3c64e02a3e3011c4421c6a5ad2218924d966b16c1285f345ed4148bb8d40b16e6c9a2de793f89aaa27e864a102b8f2ccb5a750046d499163cd0aca049f25782e137c2a9c87cc4a11220a2344c4425c9f5ff476b749d2535cf6c482c77ff841fd81b2af74e88a14c859c0b1cb320dc0c67f29a8f7f3952dd3ede6ec99edee12a2dd1e9d0ffdfbc922b8784bf254aadb75a6c91f5b5ccdb32edee6b1ef2f003e135f1906fda8bcc5a5eb2a7ab6e403c6afa45709dca4b7b1fc9201a443386c3cd8b3ee4cfa7cb19916edad212ed06f667b68c5c7435c443f9875d534bf791b1b924bc26f01e805e60393dfe58bbefdeadd638458f8f9171f5562a6ac4356282581105ebdb3820d6f01feee14485801ad402a002b01df11e2a7ef97edbde25669c1753ca824da22e7893fb5e9156d10377a139d3d3155ea784533338a2749b3b5d601500cba97eee07cd06972a24b7935e59bd62708b1fb7dfb5dd44f7a22dd9edaf74f6de590dd6bcca1693dae1562ffbfe4b62a9478cb35ad77df7fb89d4f6bb6190db05ca530e574908ff76781cf30be2f8bf19915dfda4eb06e057b046d629a2de773aa4e53dc0fef0fa37d2b4c3e2d69955ca1e604d2ad238ccf089ea3892d62f019cba251783e14e654f24415fdba236b7aac5e2dc40be7dc7be413d270f17ef56eaf437d07d5799002a9c1e697b5f38123cd9a62c58dbb8323173053fed6507fbb9f7db7dbf2ec97aff06dca2c35c429c9404a53259e214b14dfc9fa3fd34c7f4dbab657862c2ced295aeb5f14fd4a4bfbf2fa873cbd984efc6736c56f5c9658627e0ba0e86213a0a217933393be3d3d9ce8170057f4820650e6c6b4475c9618975b17ed53b091ed5100fe938d83e6f14b6bb781f9c0a4bfe0da99f3a65e2ec4d286f9e52b919e54cbb20cc910aa56db98c6d640909efefb5320d4642e704c797e3a6af51deb3ef7ffbdf7f8c3e775f33751bb2ab5dda17ec8270c4f424f046a00264bb30d4c287c51ac0013dd384cd08360b9694dce3a9ce7bf0f0c7dd5e238e991fcd0fe929e1749d8b7e3b707a609913a33756c863f84c9420f2cb6f1c2246dd917824fc2d57d194a6126b0f00a0cfae1c0c054f793a7528cb45b72bd791aa85600cc62aab428d46cb8de3375ef96e0b94cf05982f6cc447b96804e26f82c019f0a8f6db2478575ea3dda1223cb0b78d0b233f99c4aa13933bd7445d577f3df909ec55713df39f1f34e8a73aaf3a00156f30d202990f1c05127528f901729104ae3f525e4b76f574ff57baee74b474d1979bbfced5ab14bab9ed1f62835f82b259ccba9ceae528aa61272a0e5ded24f836893cfa63de88d586cfe7ff2be034e8a62f9bf672f9025a380ca9d020f0e13064cf86ecf848ae23360fee9617a2afa147366c02c6605b31ea2a21c2604c4802c0a2819942808778020395fbe9b7fcff6b76a776a76d8232afefb7d1e65efcdd4f4f47477e52a1c50011254d0beca49b2ae0a7d125404ef9918bfcf3ddc67ccce433f27117ebdfe0dbe60f765cf7c308325d7ad12125ff5e7230ffd0c8c9fc69bb1cdf908fa7eb94c5873c5f83de39ddef8bbc73e3d5433e6f3963fb601ebbcbc25a09044d888fe9681248110646f44d922f287dd4540d058f200e1905e596e29d8666d3267ad3b5c1fc80736f8e6aaabe2287016473e93ee3de18112a832c9433f870f428adc2537d448b41fa43291feef32e29d38f26c31cea481435244463f9775a36661e7f838521a678e679c7ed5066da47cf469fe32f17c332e252487208e890f408cb3bb6f434680c7f49373baa6df9539bb7e98a75c739f509df954040104354bc4a9b884798c52e3c6e7bffa8626186b162c7b6e3d050e529c07241092344a8fc7efa4d26a6d6005d2f53301810a8b332de8959655d079e3156e40696b6b73e326f1848e37fc5d98475a8761338fc954b13e158ce9e7132324f0258d9816eb404a904ca899e3eee1c15fe8c59f34e2bd95c9fa54797f45f196a3f461f65dc9bf574dd487d8f95b2f58a219c9ada91b9fff4d4b7c459b373dbd48cf6fe5191543369cabe77a6de58325aeae3ed77ac5fd8ea14ea189355c47e92a75a575b54a24a1da78cf1edb331f715e6211dc4784c9c67d3db6673ee2bcc4bcf882c69b13c0586648fcdb96287f9830e4990fd3f51a5e5834abe41ef3a07214ee6249041917988020d0b90281d0aca26d8591dacadb0a447fb711103c8854587c6481907060a1fefb9211b316afb959a97ffdfbb8369df546b7daa62c38f0611517482874c6d55599f007659b87b131c402d848975f88fb6cf4cd824966832095c900783f7487e4e0e71472cd7d01075f06a78e209b407fbc5f0fbc9f775c4c0004472a5571745005ab0a3230ce3ce0317dc93111a1ca86dbed14b8ddfa360c1f505675c669e5e33b74e5f9a571e68871e6c48f3390a092cd0c81849b4e5fb376c6e74a7d73ebbb978c4092ca72a8a658f280c44184830849590b4018d92b8719c804041b8cddd3dd00d91b4f7ca3db3efab7f7ac051919caaf82f1dbf4e43a357d3ee8f940c930d789ef84d43cac8ab5b62d41c7addf5c8cdaf6e0cb912a988088691530de1fd538373ea9f8aacda316ea03695561c1bd63aa94faeec2813d5e68a0d4cf277e3e65a8dec9bf2c1933e26b3dcfb33efbe1b988be73ce27e3d7fcfcb35273c74d786ea296e0667d3076dd58bd4266fefa7dff516eca99bc6f2bbf98a9ffde64c2eccf349e0697343b75c3adfae8da2f2d9a4d2aed98f470e30bf478d65b75a3d9af99a14c12416e13c1e1ef24f75726e623bc5df3919324c096e62ba39ab697dc6d4b50554d2aa7b881c8911b06bf936fdc8d54b949f41f5bc714208bf5cf2a2c100eb2853001a1144b11c00215d076b304e233a60f042c04a4941c9a13699ed2face559394aab5a25e2337ae411f58a43289e0eabce8bffe140fd17e9c686bfad238988f0dbc1a1bce463c08734e92334b628320954936ab76c039f838051a578e679c5244ee24527bf042dfee9c46e8b32aab07ee8be0fd7230ce88679cc93826da304d49e514a03a1be84b71910bfc369e67fae09c351e43c883547c52a511e49f4f8176530c219f78c0f0975ed51b65f9bb0b1f5b897a2de5a49a2255158ce52597a04fc64682cb0dac34456b5595e0ccb0ac5548efa3b6bd8ffb2c53cf586845ea9693ae8c9b570b57d33d03b76dd3ab6e04b95ecdb9d17e57c697eb998f64127450c47b8ed99d3e094a8cb7f2c18ac65bbed4f3fbc0c289c3ce576af49fefd57be90ea5a65c3bf28dafbf56eaf7b9d3facc9aa5e7f6e32d955b47623e4917ffade893c457e6edb30a66812bb994bee81e7c0b9f9cd677eeb14afdfa4ee4b9eff5f798bbfea7559fd557aade7e8d26ba755eeaae6aa85a3dec563c4c39a55e370fa396703ee2be5318f33316f313c6fc8cadce7cb06a96e7910995b99ff6af94fc839c5b32d8092113fd30eecbc4f8a3fd4d87aeebffeb16a5a6bdfccdd21f0e8acd57fc7c32240282f5ceaa2b8a6f5a64a08f8004b6dd4d40c20670c5bd5c401bbf9ba956217d1414fc3e73e4b2f17a237e78dcdc937bb81e5ba19f5bb81bbcbb9114f4673264278737a459e8037d3a63d3cf50b4114c9f921ddb6634fa5f8fb1d5e715954c65d21d2a890170336e2a24079fee5970224c007c1c79d8e0a9a6734090f712a5f6608e97cf3be01792838d71048d930209d724519d091b848fa0c624895cdc9738a9257362c992e211e137f3b765fefab4394d951afed880eb3ea9672e6095153616491cc489b10da4b981ecf688acca958d0de48d6546eeb1e91dd8aac3b7558b95aaf951edf2fffbbfb8f1865925553d9b1ecf2347b217e23ad3275b495756c59a7e500eae205d7b4040a9ee1798be175fd5db15076d3e52a965dffc36fcf3e95ab298f0ee9103b464372ffcd393335fd273397eeb7745501e9623a92879b9b16a909c1630dfecac405e6f046581af050212613951ff7f4ee9545772fc7dfcf4450b75ffd737c6fedfb097b5a4f2bf669b975fa7094a9786d35bb9b9f73e4e5d52bfbef2d93294cce955fd9c6489e7374718dd837270f99d26bcf8fd4e0863813f1c8fef8fe7e7bffdad5edff3664fec3717de55c40095d27c8371622fc3d70cac80a4c25e58309ec7e77adb76dbdd040403600984fa03012959e05840dd6f7c7dcbf4dff402a91b6a78d6655f4739ca4894d0c4447d7377a1d8a031ddfe403ccbf4c998c939b070e0efacca6424249a6c1cd06b701006700a499304766523a699a5ea1bed22629ca6df1d0b6f249c0562a2b10dfcb9789e8d71e6e279369e978b7152dfa8009bb2e440787a88fb7a609c36c69998a0f68117117b272551f1c5c69981e7e5457fa7fe0fce6dce051ad4f938eb39bdae572d5ff2d15a24916495155454c481913b23111096401099ce223e558a8c0016284f7373926de8f867c51a3dd3ad061dbef4262df158f7584535baa81867db9d9d43e83d0d21118c449c243910d7997e80adc46f746709c4cc73908a33c89d54d8b4365eb9a6f5142d6b7ffdef37cf78aa963ea88ef8e98e5ff4015d3ebae4fb121006962828abb17087269d3b3b2790ca10991b28f29fbde128a383cc5146df074e106404a6cc10e557e843f0d9cacfdcbfffbe7cfa9085bf2b353bedc71786eb757140a3f6dfb939e46a3fbf4fd6a13747e73dc3cd6abdd339c9644609697497e78cdcbf7e9ba1c147b69798d13dc3831fe39df4c257a3df5fa6d7fbe38591b553314ff41d48454b8419fba0e45ecc1b083d491eaca2a53437052a49db5391e814d90b33334572bb91db6ea3486e37abed84a3f2374efd4abfec1d251d877ee389e49491ad3272d61b994cf5422872f61a53f17b97d5e26e6922da93d6e2ae66c4bb1e574bdcd7d433ee6435918322f37b7104bae127fa8b08f7ea47bc9b3e229fe3e6b7bb1867f7f871aa21de1af71401cfe3c4fb6aac8923e91d8e78cff6cc4b40c4fbaa37969e30e609a5664d19f79f455035957d602067d9ad0f78adb75f3ec30b2b071b58b5c140e74640c70bb9145013a5d63db77c909bf2a4626ee9800fdac67f7facd3e7f07ddbfb22c8134720d33cdee4c8086c83ef1ae0eb9db8c6bf9eff1d8a202ffa6063c96f9a00cf787ff4214f6b82f1c569cf5ffcbc9ebf4d5dd634580f89acf41c038bc108163d6de0d62d066e419afccd389036773170d326c01a8020001b7f42ff0b40d89c36e2ef9b7ef2fece90aeef25f00f8b3da7ecf39233dd710f1df674c4adc13eb1df975bafd4e3da6cafff6c74e7f875b5ed08722728a25e6694101910f4f9b0ed08f2dee25c9119001c276cfadecc0f5b8fddf4e4efe97abd6ff8717421050652660c043af3b94a9932a89c04dc7cb9d436f5b30021693bb35592b6bb25106a1103b8e21ec111806b705d1ff46f763db4d2de99fd88524dd20e987e855e20d62bd6e7e97ac21445a6f60307c691c9e0f038b2d54402732dee4b0d3dd57caf4985c8b5b8d99bc58c8a543e14f1ae0222de6f374911d56aae5b427efe05e89be7cb08e230c63150f4fb21f2be3bc67517f07642c46a2c92dc533b9e8de532e2fd24d4148f457a2bdc9781fba865e03a85eb32709dc275a68f4340cf5f187f3792c85ddedacd7191be729c32e2dd685e11772b23e9154792f3381346bc571554dce3aa4e46f47975f9b3fa08dce26c98b7f94b7349e9c10612a75c02955631245fca75553addc032a46dafc0015709c9a48a529d08f746ae24b9af81218ddfa9e5349df6ac7ecda733deb866a9fe5baef559541239dc7c5f3dfed518ffb62390791e5912c13ca27f9cf922d65052a18a752a3309248920affcb9fcd24d1d95ca5ff7c45df7e87db7326ff147cb911eb21c84b80c11fba5eb309f3f623e3f0144a1ae22d4d62f869341515df451e7a6e439c06b808ff09224422a97530141c859a5456ed894fd9a545a22f2ba02b6abf217d03f52a93f272cfa6ecd214afdf2cc98c563c24a1df65cce92933421497d38edd7a6ae8c4d11e4f062d4fb8d723b542f829cfb5c86629b11e4b1887781bf9023f60b300e05fcd1fb7f9ef5c5d32f6a867b79b7853dff840a8a5557349fa980ef63beb09e4bb02f2a487545297b28b50fad7322201115d0f61401a166036618e035d3aa98bbafde226b1e5df244f1c94ab5a8dfa6cb2afd42358beb6e3ac3a5a40538901947a0ad804450eae746fb1d38421b8184425530b67aaa03b6a1d838f0abeb66eb4fff6cfa490309ab19a0276c05d5284813c17d34ce8818a71dedb2ea05de66dbeb662b03be726143228297345ec1a72a88bae9fe725ce4ce0177ebb53e6edcb5f321519412a40d035515a952d86d17aa167673a4c2515718489c1a07564500330ca037a3025fae2d6fedd43f46bb3680d6a5471fdff876bdc51aa71edfe91e97699205a5aa1d319d2be623037d8fd7996f9d4a95a9df6d3b8aaff2818ad3dd0aa1933e1ef6f9139a43dfb06ee5cfeb9ef3ce07ab0071c03341862e9de695e13c5c0f5514ab08bff1e223a706b66d60de59374f91d29502e23a4ec541bfcb026eef88df2960ae0a5073e0ab9e5e72f6587dce64b63eec8113f57852de4ec9744b39fbe2a1aa1b419ed49b935494c96c7dc027ca4e14e56fdce4ba3d7ff9d280538676f0ce1fbba5932a906c7bc2bb909c4868fe4875c581b211c002017d6d4f131034e62a3d5ac138481b72ad528ba7cdf86ac179fa034fedf8c57e7a81a67e9a3ee1d07a71c8329863b6a3f792d191fa647ccf85ce9ddc6e27c37ba5ba6eb6d256605bd124e09a90dc84fbbc8184c974d0d2a84d6ebc4d038c77d50cd08b2bd87416f0d4c5b8c3b8cfc2f3c2783f2bc938cdc2ce12de662ad0389e23c69923c64904561ca8c9e215bc04f5cf768b078ed207d8c8b75eb787233715a9a44a5090ab14075909d93ea84f5e57d00d13c74a070f7ba5089515415ebfe00a99f18164e3164eab5559afc782854a357cbbc5e357bb6f3c5ddd977a9d8a8f7bc930ef19e81c61e6d5efc51789f6b3b9a0543fcc8fe907474c7bf03ba32b2f2f1ea9d4d482afee7c7a88528b7e9cfefd6252fd1161a5c0331c3825703228c6fcf27c1e97b8cf368fb82cd56eab808e9e22a12bc88d14849a0fb6ef13c34a4a6a2a74f7fcdda0aa61f75452ed900ae7cad87d9bfbad9ded8e6fd3b2353d22faa438b0ef2103c28bf5d9d3227471832312326a76b4e78f5bcac055f84e89d76db5c30e0ad9abcbac2e10aa5f668f7de31dfdde4b96ce99bf6c901918db3cc82961be8022c302650daf10f3cc95362380052a49db4336106e1103c8482337267106b4107881698ee4fb4ff3163fac5fb47c76e9b3df8f4e88db8ee28ad58e367daac59d0fdd6577aa89ee84a370476b71dbb095f86a713b36f043b76cde3ab0283e6645e3e91d3f2efdef1831ce31629c63e2c7453597b9c67b6feffbc7d510878d2171edf8b871f6f68c13f3c778148fb3b71867e2f98c8dd3f4b3a846b8a8711f3ccee82a595f77e59d939e52ea93ab9ef962d0523312aa0059d6c640f23e2925ce998cb5a4022115078c88cce9d201436f28bd5108a2b1ae98d631d6b5bb8e674efdeea11583f5613b65d3f98f1a55c21c310f63f09e61e0f27c6f7d1d7d8f30aef3ce2b7f0fc627d7a917bfe3c5fffb05d3bb0ed4046f61fe9435bf8333a7fd26032c892014df23fac580d0c1930a8bbddc4679f1b1e441aaa607bdcf6548bf7716bf770ef8fb775e4878cbc5f727899309dea8d8f87f9f30fdb83ff4fa99f5d4d883ee18aee7ab8b33cd4d79c335c855e275ecfb7ec135f9e97b1a7c1151e33ce0fbd1be58f79f95ff9a3449a91f27e40f9b0a1521a9a0f8bd1ff0ce17f7854447e72c9fc3b4deb3bdbf276f7f9104c2818644db491229f0f64303f07b5f3d099f96bde94ef5aa39051b22b65207fc9255e738bd10429b5216366feec14d58c2d17b93051206b903077ac770df70e403c876b29d6eb632e27d2cdc6e3b89d41e390192830a901c689c9475b79ade66dbe0784d9f395eaadc4ef32b6b65cb88f7c40159d50e248437cc96633714cdd1339d5ff8d4f8e76fd59be3c9d247493545eea27c206084acb2a2fa1e929040f4272f1e4ee5f02ee0558074841400da06703cd340efef21f42dcda02dde7fc6cc5f6729d576ff63d79f3d59ffb63af46713f70b0749ce314ed46009f236cc467f8a74271539b8622a98e8fad87cf9bafda7efa3cfafbeefe70c5985f7874a880ef6629224b0af48a2639515b93fd3bc929b2e54246493a8b8dc8b9f5548240148ef1f48404c90a18262828eefc18ca8b85e465257d1f70367cde518c85d15df9957aaadd4b225f3bf5f7ba852ad738eeceb9e4fb546d57df75823b1627e93781f2697282378a657a2cc10f811f15ef95179cb8d1b95fae2df2f76795a334e4543370dde0aab0c49d0d20d9dbf8f9024997063fdb32a8f54b479cadb222a49fb8b09888fb3cb330089b0a31b300aa1ec71376cc9335b9ea85ca839d10bffbcf05b4d699b9fd4a676c719fa5566a5aed9bf7382a7d0464520a13eb648076d12a7076dd06411ef64cccca2003645c74904ffd2016dde2e990d82fcbdf3456a8fed0dd02b64ddb9b131b0d15d2c7419a0e7cb6924547163b9846a4f8cdbaed638830a4b753504936d510139b836ffb06ec22fe729f5e9c2e7c63eab0fbea29f374ddfbad50c8ce2059853ee6ba02420acb222b7533ae0c84d57a83ef860a2b4ed71e9dbe31b138e5cf433bdbf87f48a707eae7ac435801e909675836bb4af51b3f6a2330f8c435280d51fb3b999752675e103799ddae89be4a04d45812abf4d2f7a7fe53b9553b76ace7a5c8d8f073e3345cfd19b9b8ab7bc82f90848f7cd9cfa5cfc0e022d397a72df65151508728548d247f556e4c12f09b3efe0a27e9ee8033a825030be3ceff3e877ba8e739ae1b9cc796bbc8bbf9ef9ed2f33f5f63ee9c4abc2ba9f529cd2b9996bde962aa96405a5628c9a8d7734fb69602023e8c137e3f8efef76eb0acdbbeae73e0bc1e0708439158822b774b23d918d4fe476e3004d4a5db2c8ffde1e98b4fd5504845a9e01c4c971a0a1e8d3c68c37be6ffd76c3603797cbf2b1f3cffc5a4fd4fe9ddb4f6b7d8d52a91bd31a1e7c6d8267e52bb8e5527a73dab88263080a20923688eeb0310c807f44925adc496d1063d9ebca2cb01d0dd00b33a112a933b633402f281dfe94ed0c240c26a8b9e63e11a782036fdd0b2bce1f3f5e7fb6664f757da991de1c2f6fb9bd085e7b4c38289e000759710f4088f864ece500411190c61c31447be67ce9c001a1f26da802bc19181b3a0a9880647aff1e5aa2d48a090b3bfeae39bd8c9cc31f3a42738c29dfa674ce3cc883d360cdc0bdc99c43b24158d690d34560c474ae0b96a6ce993ef871a516749a346d16fc838880b29b33248a22230bc76c1d225e866d1aa492a29c4a24c9615e1d92348860900461a3df9bdfdddb643fa8d9de2e7b2a45c4f3d058699c873e7de730eecfc5effaefe545a5eb5c09a6ded0c68fcf3956a926630e1873c9ab985ff70bf873c7d9e8e79a3ef63d4b94017161858919d6b2fb4ad7ace9a0d46739cfddf736dc99652a1e628828ae83bf13314ce4cd86efcbaa404884acc222d5556feffc246f7bda0612d078e061f4a54d041b9c757b7480e88363cbaaf5376cb953a9af7f7b7d7aafdb35c77aceda7b5e772732a22274bfa7d9b00df44ea6834e6283c857d103dab910bafc885797bf1dbafd6ce0e92eee0b639c5e5dabe3b395085d39fa725cd9c2b621c6a96cdf389d78fc2adfeb971ed3edd2fc117ed18fe9f4b33de3b439aec43ce714e747f7205fd2744eedfc2ca586bcf5e4b12ee7557e4969334a0ee79338b07198632689438aee14e8465e56a40b26880d54253931aaa419d078dde27ab68190aa04ebcf3da88b9b6fea553a48a91f6f1fdcf08695fab719654dc68fdb06eed8f717b60c87be07e28fbc362227ecb541551e51b160cb1d4a4ddffccdb01fe0564b121707ea617ed87b4710661949ce8443d828a48ebd4ada88b2bd9079701b3022672149b3bd909f13a0d377e8bbd0381ff28e9fe6a13c2ed9e60ffb7e74d84c2d01977f5cf2c44f676cd39611463f823eed2fd3e7f5bf6d1b5fd9d8b2e3dca49f5faf7e7bc163e4464dde700fc4c6e5b6d280b204acaa123611b2f1c9f991f358fdf6574b20d4228921ab08f2d00787c91c838dbe9efaaa0595ebdcfb167d31eda9a9f594aafb75a3bb7f395f73108d1b3f78821bd1bec0ea5c3bcbf3cc0ce08a624bc0317824099fe49005afaba190689a52ea942491a8413608728bed847a1bac3a4b5a235a7036901c46727c0aa9a0308b4272c809901ca4089e2bb2c006e5e00af62e19eb1927249e67033dd20000800049444154caa3ca87ba1b66f26923af7976ad3e60af1c72f658f7ca91ce264ebb4e1b8674bc50a530c188338646fb58d7e44dc48483bc73c8ff9d4478e2446df4893050cc49508b18c01274d8db9792734813bc92f95b4a5cafa0351f2cbbed3bcdb1ef5fdaaef258cdf18756a76c6af140c267640077d8e0c6aea0dc5f6bc87622243de4e05af3e2d2b1a3f4fcfcfef2d46f669c6750920a8f732441a2209bc756a8b64a496585dfd96b8d5454940e9ceaa5d07c1600d2c12de6b7da12c68eb608609e80384f1cf1770e27a0f3260c988bbfebdf0fb832eb3e37f757bd48c3b6dddcacce4111e46cd3622fce0cf38c00491dfd8aec8affb9b68ed175deebf2689a3ec78e99f1d41f88df609514f601bba5cff3f6e93b9542526155ad34a2c3fbca2779d86a3bdbdf4402e11636806a4f578d07840e95bd2f28bf3d71a4ad0d242f91a20c7d20fdfbcb5bc7eeab0fa403078f3e671f2d994c58bbe01d3d7155232b07accc8c7b26710c4111ef170644bcdba8617ebada662deeea46bc3b594e17f42982381bf76db366368f5346bcb7445c697f6f847a825af10923de7db5e8af412df9b037925e2f3a1a97e3196740647ee59d95735c4e7c79f8b7b69f6a517b48a727b27a757175bddf1d3313077cf1b3800840db8a0379abd1faaba263007301efc6f51420380d1001826ee548b75520c2bc92ea7b50e01445e2eee046a29aea24b1502df5aa8f00c1f9961f65a04b10d79eb5aceb86054a7df7e2db9b2fefa5d4fa352b8e7a70a6be765ce5a7cbae49f010b94e6d451910bceb08dfabe2f48a6c37427bdac0af5f183e09cf072165c9830e28cc13a9a64ae877ec2bf26ea3e492151f1a58f92f406494a00c13d2bb67bb258b5dddc20670a09c5166b3719e22b8697dd0f94292ab1b883772c1ab678eeaa67f3bbaacdfa433a3fb26610479dc3e8d3e554690d33950d9a5a2b4d82d0075f382673fff4ca9a1673f7ddb9d13955a78c2d4cf0bb19e4b4cc873ccdb4d7abd615f9420854929e277caaec3f8b1ee99612209846c4f36607fff9455affd5d2410d9e88550471ad60ba584570ccd83036f12f2f776b061aa36eb491eb4e93d97822fda326dee143df16b2e583a6aa4a6f08df25a6eae5d5ba9f409355f3bf860cd096cb55a44d34147d8a869227fef0a8878efa9aec1184d2470402dee6dd43236c917a9667896157d5b2dd1a076322250f31149df097c5b4fd4aceec311efa62f22deadb7e9efe0847aa296791f964c2ec2fb7922dee3bca32ec2fdc668fe86ba0ff72170922d5634ce0ce051b82eda776654f67625855537169eeda6f11e7dfec0d00b6f6882317bf449938bdce8d8e2a94593cd2da5f06ba70d41b078898145308e93bb28110cf63a815b6f296c60954702526a121ce894a2c141ca0d07a938f88db6b751ce029258f03e9cc0330c084e922bc7e8755a5e5a3ada4de9535038337f9e269c4bface6efa8996c49aefdbfa81ba75f4fa1c5cf3b5435c770fcdc9227bf56a3c0b91ca58477db8f67cf47b6dbc66f5e73ff4556a5eebf133c693919b2295895060be8a6f01a448f25c5cf7878144402ae840fad9c02a404a5144df5eda1afe360de9cef97cb1013300c1a038b6ffbeaa82aa37dcefdca6d9d1fb86f4795173459dae5d5c964f4690d3faef09c983ec323817b6feb461c9af8d94faeaeb37521ed18469ca355f7d39493fb7b8ffe69fb69888320e842d39d4c0adc420cdf542fa7e25fbe0bec30d2c0781af4837d0976d370c4836a2016a079bb5a337eea1661b40eebe246a5af0b60941824a79c4c0d454c0470d4c433d87f4d30dac09d1ad065255d4d222e9be3533af6dd64ca943ea865b5ea245c17aa58d979fad3772e8b494468d1ac586e24b72689b842c7a81a060933517630dc78f3ace3bc6abf2e923543e03d0ef095584ed353afb8cd0d20d508948f21ccad66ac6b51d11ca89555159f0fe998bf0b970e271563c593e73fd7abde7862ca9fc5e733c13bffde2beafee556add172b6edd0486a092b2b5922449ba5be2f8c8dd561c783e9dbc4c578d03af02aa1ae6bc84ad43eacaf980dfd9063cec9e1e31209403089543da1106a6c206920e5d37adcb1ac8fd54e309a5da1d7542d7767f2a95f951c70e376a0258ebd8ba634f7d34faac309543c0b3c3e6d9e6e985f7fc7ac7f35ab298d26944d308c6c1b643d88e8a88a3c5a147d97437dd81eb288219f3cbba7472772677580ca1fa69c0ff5e8dbd3ce93be1fba588f3c44da514ae77e9afffd292579b4b8e29ffa98bf265809049294b4ed9faeb6fcd959a3f67e2ad6e4dfe9fed2ffe37f37c838f032729ee4dda38608ba11c63ec05777c62c8650828be895457e40587f54e8cf6ceaffbbfab04422d02980748bae602c00cc031dedb7c015e8bbdd7b9c9efa2504b365b2b364c2bba58a9c54533c64ed3a2e4c24953d33fd194bfc63575be993f5f2f9aaf6b2d4e75bdbbaad2fa367373f9740bbdef12262b56f02a7aa0ca5adc49dd6c65c47bb6a8a827d377e724cbbaeaf54f8fab999d386d7d6c9c1918675e140645bc537a78789b390f54ce710f9c4d9bd67ce88af4f39f9db4e103cd517ddbeeed7fbf5da5d46f23274d706d50c5f3b78c22b75b3606524a05e45422d19b75b9e455026f124ea141de2564cc953a7910204a26c77106bb9b70502bf0e225ee9374ee1671a739e2f964d4cc0324ce30434bcc2b962e700b282d7c79f2f831eef8dba84b7fd0eb719f679a5c72e0937a5dfe9036bba5cb2815eaa767c6b0cea933aeebeb5a32db327cdda68d4836c8f34e11cba433271d3ba57ea182437410891421aca2c230399ec29613b297b488b7cb2c19be1f7d4797d014b69f7dc9a61795ea58e7f4f3720bf48fedd40375bac6f65fc9595bef9bac25d0df474c1bdc5f9f2f5ffcf6e2b9eef42c1b38ffee15a4faa3c03fcae54569efc93984e26bc0301161a78c00e49e5b2ee23b2a64ca161161ee0b8c2d48381bdbd1feee12886c1103e23f6814e2779248429048524e319038bd347cb0741c3c35e07e980e512f1d1c60da63dedfd3c66b1cb7a53f525373846daee8d4b1dd4aa59a6f6d5d7292e66c6bf5ae5bd1467368e967d6ce3d584b2e2993537aed333d36aa6a4b0e739062b22724073b201ea08f90246cafe42025891d4d0f5f59a762999b5caf7c63c9d9cbaf576a73cd75bfcc7b4d6fa06eb38e9a3849138c777e3e72d122b75a5fc585c499929fbf2f771179d151d237923c90f48db2e6b22421385ff23e61ef128a3778d00b2b4d3a4acef2bcc70847508b18c0ebf566035390543024d667eaa906b2e44ceb1212740d482ae990506a6e56aad5c8c31ecc385ac38687f4f9b726dcb5ebd5df98b55aa95187bcdae83170d0243190ff3f49763eef35106e8eb301072c250ff66e0c1b1058437b2f6b7c9ea0cf1a0e30daa9a719983e41a92b3eed3bb34f58cfc5a4cacb5c82baa4e79cab7fd0d78f3b20ff8e25b061d1f723092605f888a160db2e24058ec711927711050eca887eec2319cfe4abef21bc0b77ddf7dadb0808b5880124724a5581057745df02000746aaaef4cf0de40dfb98b7cff0746f5f6ef45470c6295a826970e2bee3ea7753aad1c21637367e45e33ca3d6e3759ed6b071cdc1aecd25f5fbf4776b3ea52f1e6ff572c76b7550b746399d4354dba859f432abab7551ec552963b16e207fea32ef64982bace1dc37ff759f32cba8b3155d8ed665e63e67ae7393bb80ca37960e71dd5dcb528abbbbbaefd2014583dc0364cdf5cb2e5ff789521b5baecad82a74da94fe9923834564af8f7090682e52d33001211d3b1112e2a888609ce8859cb2a2b3173fe73a42dd0e075e447f19e1902d6200a9b6422028ccf08090f03ac5fa4c23c687080741acbb1ab0f1a4c3af3f158c133150d4e8fbc814179cda0384830f2c541094f3cd1c2d4920d20d746f6fb601fc9d08d2f7014c032171558c513801f04903ebd4c175743ee07b90ea9d244e522d717c0649e8c438a14fce419260f07d54d783548b58f755c22964d713fabd9580508b182009090770914e9308c9615e980aa3136f5810102610c419c21b2c6dbcb89e16c8a780500d50adec9493bdcf67db4d8e183771a8648cede07bd33ddb8840d8807410531d1778b3c46735755ba5486227e377e401560e6f114ea34e816de5debe8c33e09c5522c29973fc8401ff6ac2211b9531803157ae4f863f1ac89209ad37b10e99a010a7fb88170fad2b960c313fe542d7cec91331efacc292849a525e8481f71f2279700b1bc03657fcecfb2ec4809e2e20be43ad5ab88e248f142f5e22bc559280906a8b54b4987fb271c81c60fc5dc8c64784ddf1becfeeb34da5ee6a847bb8850d70002deadb06b20a031bd5c142a882c4e0c0cba10a1fb8121f9c3e7c05e627053ac854b88fb24a8c080844fe14480129901a52f03b4b4404a9c200f02ae0b5268b7e8edaa38d0f5c8ccbc1387cb98928fd33057ade893ede9b0f7ae26045c05605d5c87e0f7d72b3edec85952778f155e17747a8529c30a074c70d277ccdbfaed1b84c121d5515419fd627cd33b95b82e1a0f5c9f34db5ac6104a7832705de3accb0a02f8da7155059955344f9d180142f83038c395a1c74be38193bc13beecd2d6200c789d0814f8498246e3a1fb01e2d48060ae7818244920a15217f0fc22308884c1e4b92067de732b87f57e2fb5491c41110b0b9fb0907b5bd5d02912d6c803701b38a25b9830eda221db4e0fc885320af2e3af049224911a26c2a9449a4db4cbd15fd1f12e36742421208cdff58316e15f01ebbba450ce085269a2f8218aa21592783d36dcbfa0d32bbb2c87e5b3113f0bfdeeb181f491a528516c469ed2d075bd800e9ad25555c969464c9b607c2429c700a189a1470c8b46e99e31591d8940edd2721922e9e0e2a996c0fe3fec7491eb2850d604984f62bbe0b7d8f14712e30630915177d0fb68111a3400484f60b7d0f620cc43e621522ed071167238de37bce1b6e6f9740648b18c0eb1b134c924915fcf45955441f000739492895d8a02910f52b2142a6c08d2e04513f85206d6c10a0907033e603812412aac468893ec511900d049ca1daa2764f23fc22e7933c881d3c9fbc6d48b75a0509c58db78942704a7cf0904a8b36c828f13b119883c47d64fcc30672285755588c8fc6bbb7e9e2230638610359720624826991bb2511568af8a66478a8049882f52955a5167e575049b16e1c2a2b2e814a121d491cf83bcfab7003dd6be679475bc4009644b07fc98b939d08305f0adfc3c139e040b2e3ef019b8682ad89093a9c45f87b200ea70ae70a13187c47a74a3c5fdaf8a497d56e6fff3402225bd800aaf5ab1090a668e32020870eee2a3ad049e70ee36e08128b850867f2e70f81530b216297bc6bacb3c47d504d8540182c04c4b1044204060190aa55d237db3ded2a2f245520135ad88eaa28e00a91d75517a08f886cb6912010902280abe0865d05c25c85646f74305204b783bfb304d45d8c8772544112dadbe20eb8450ce0f5490736a93a6c40bca745019158375520ec15f062e3f586804cb6a521a2994a94b21304d9b41aa28fefc811fa34aede025fbeb76fd1efddd5ded9f03e5c039c20924a2a042ad33aacc2fb32e389b80e0bb63c5215f2bc50013cda0fcf7a9f47dfc181130947f45366030a80a5d2ca14584deb251cfc6abbb7fdd3090835923810c8c6120a1d40c268cc111644f1b1404254a43e823eb295b24a0cbae310227759f4c586b6f6f1f65975015b8005dd342db4bfac8150d2c1c32a2c44ca3acb00893382379583dad3cc61e1c0639d3e7170c4e92215066f20da50b6f7b9ccf1ae12e39c539d97d90b1abd876d00af4ffa0f312f746054e180b3d60082f072f4f379e2394845e280602892ec40c09930930414c1dfc1f8d07ae7030b0c183340bb5be5ba9b9a430cdd50f13b1110aa4bd453dc88f7ad0aa3ff27fab061f077682beea3752f55502471df0848eb9fbe3fe2d75456c2d7f80bda3fcd06b2b32d62007f781b7dd2855adebf87a81f4a7c1dd93aa48d435ec73a57e2ec68c1ee6123ba6cbe5c4680b2029f34daf1df49f5618bdf855717a5a2f1d95c8274bb76c038edc057f967b48801bc2e88e3c7c1266d68bcaee43a0a27c61bf8f7b0c06f0bbcd4efa312b748c038f65093ebd4f777a9b2a5835dda12e8ba1cef7581f31b09788e7cbe7c0e8d23c9b8fffaf6ff8b0492acd906c885604963b72d206d1821babb3aed86afeeb74fe854a58e79ec8cad75ce56aac9432d3bee73ae52b50bebdd55e75a4d5c5aa62c8e1ad95e77d2d4f59a6b79d3f9dc72259d03f4fd86e3eb15e55c56eb63d88ec30d4700759b35573c759ea77bba7a31faeb8b94e1c7fcdd5ac8d79bfbc9b1e0e618e668ffead0b7ee73ad5be80a15e59cac2f4365d1837d95bacf95204a5a16854ade556a43fecabe9bef506af2daaf9f7253962cf978eebc0a18731dd8867c2534c92b8e6c1e82c028499068e30a6f1696182defef7bad6a2ba8850d600905ebce92bf538b00ca830bd7cb1441ded05215637c88513a3576dff1cf743ba2865e59077538eccb7afb2a556765fdd13517b96aafaab91e4276b1732dd5d97055b34e4b6768743ddfa6c0675bd138796b8142bcbc65e4dc5e588737a1aff8efbfc5bf8a55687e2fdfafec4cd7bd7bc584df5fdbfca552e353beb8329a2961e1daf57c109fe69d176654e81c0474e065c5eb16467207c673ae8d4ff3d4c7fb3bafdf20afa8b04ad898c0fce5aaa9eab6ff5f2510da7824b286016dfc2e378e15fbfd3ceb9661753541c8fad709bf759dacd75c4afab747eb051bea9ff2d8e1b7ea6bda85de6ef387eebf199ad8c20d5cb454dfa85153e696c253e372e750295b332a99bb4a449cc7e1c3a8ab9d0bcb06be1ce08b005f0ef045043e1bbd20fed2db7e503fb85e3d55af55951716ba2e8f95df2db84ca9d29e45ddbed71bf9f73b674e1b79b75279231ece5f4a2a32d2bd1361116ea7acfaa2be9080b84fa27d77efdffffe1b71275b18d03680d76f90244d90eed7fd6b073e795c132d11b6fcad4df7cbf4ba0df54abdaffd0d1a8e0f75683b58c39b42b96d96b96a1c6b79e368a4bf35c60d70d4abc53c2556d1b20f9e6146c5b9d7c4bab2d1ef233224d8de0a7efa5f83bf8fafefc527332e387a5968c6c4395b9db3e5680d5fad4a29cc74d54b1583172c50aae2ea8aeb16bca9d4cae282db3fdfa8d41ba3ee9ee7964c2e1eb7e54d760f172a26b91e7deb8f246e257ecff6e2f349d461b597b6ffdf0808057291712b82be543de925fadf55cfddbaef6b4a35bd63ff79975ca209c592d48fcf9be94a25a1f1c70c77f977ab221a21dc412e6c2f7f973449219a950fdfb08b387715369e0f9f02be08f07937640ef7e7603c1d802f022c1e3e3330d58a4c918292b51a5ff5084950d31bdbe5b02a4696771fa30ffa0d9fad9efdde337a037f78d7a4e123945a73c31fe754483752f2d6a20d4c8183bd459f8cbfa4331692c83f4e32b10d88cbf86afac4f044445fc3bbde7cf78dc30ed392f0c6fa4f5caa097b4af394a74fd39cb9f57ba8c6a1435d75acd5075e5c8610f8bf7bd8e016a97682d6ab95842149ca580510a25dc5f0a039eb9c27d7eaf7aff8b1ecc2715a02d9dc6ebdfd4547a53ebff895ab467dadd4ac93c73d568cf828197f210b8871802b412240d2fddc06c41bec7debf39f4e40c206f0d224c98308c9c54ad56dd3e04bd76ffee606afdc75c64f4aa57d5ef38a1b87e88d7549e8a6d3ddc8f453acb1513f7b5ae8b69018628423d9c11fc67d3646b3472486c05c5882d3f3718e010470473768b2567955e569f335c15e75d992268fe979eff7758f15a3e00ee9cbf143fef244382820eb65031d383b54495d7618fdbd5d32891840465d5ecf7184e2922beefdb46e5da55abf78e491572f8d265d2cca6da599a3f3436f1cea26b16482c0c93e693d58e887d10f627c4cdf7fd01b7cb1c264169ee2c1c77d99955ae480f311b01dcd26bd83cdc972c66efa424bd02d8b370fbb5da9826b66a5bf71b9667826ddfdf81ca485e7754801b314f84a714b24d190242d55b6c2b6e7b3e94576e60d7667fba712908801be1427cd946a92d3b224454b14d77ef2d4c8f3ffa509c62b356add73affe5be75051c78edba12aa2e4871d5073dcc6c1df67070ffe7c98d02fe23a1c11735da0c460035fe2833f1f7fbf88379e8dbf6e2f2769eecb0781bc08efb98b3668502bbfacece1896728b5f8fa5f8f7f3455a9d786ddf1d464533d3d963c6eb4e8534022a9c468a312874884c3c6efb451c3bb7efcbbb4850d905e4e1679611da2d4559ff57dbc4103a50e98d86ed04d599a607c98fae9ad6ee5bcabad798d676d839190ebcbf2fa545583f1d9397cbc7eab8dbfba8484f027dc6f3bdc5cd5983ef8cb524be67eadcf8d82b1b39bbd709e5e9f9fde71e1346495e688fe208687080af5a5ad4f12149f71ebefd252feea01eca21636804b8912cc34d05549ddf29ffedf645eadd48925e71dffec417a832d4febf7886b2cfbb7b5a079f3b8859821544516a735370b310f7fa1c24d362c297d50f64a9686f5951a1584240fcfedaaea98ebf0774b6c1c2a8599419c19927767066ca0ae286d4b7d4b96c6c5719421383fcc597464f1e3eecaf8bbe33d88c02acfbc64c630ec4c4bf9352567ff2b946a5cd062f9a5f3943a36e5ac4eee86fab1eba7fb4cd31cb433c35948df990237991050c1201a4944f40bc4ef79e2f7825df106bba0d906706967eaebf768f8e4bea342b728d5ebcbb786e4dea954a3b1cd6b7d76ae9e8bd2948e679fad5c9373ddda37c57d97d8411cc5a2bf5e0f6033fd08fa19fcdd33cc7d62fd5329d70c71d05b027f21f0c54a387bf031639519b0bf72846a3693f1e761fc1918ffb6c71b542f6747d7a9e56ae5f4fa74529bb63e4dafcf035ad4bee24da5b29b77ef79f0294a8d9ef9e19bdf2070308400d910dcf42939236708a09185f1bb0d18f1fe9dbf3faefbdbaccfbd9e80840d084c09a1e11d33dfbdafb3e654eb5cdfe0eee1ada21b605ce793a20bc9f0b3969018620b3d8267781762064b20c6d9f622e6e423c0e73df8f37c12430f8cd13c9708d61cfcbd13fe4ea27b266d742131f410124321e333ef910fefabaee63d59b2caf4a9206ce0cbf08cbb5010c07cd411e96af5c3dd1909e7656737a86c6e253e8db9e69175da9cd852a9cef75e30a8ed754a2dfa78e6033f0c526ac386d55f539d0acae1c592751e600ee3327fcef3f6a5fbe45f5e492f62001f1c790684f44a68f7c1b193dc142657edd337edf5e7dc3203a9a7f72ed07f6c667d56c7b576c56ae0dbd19b32a85e4c1023216aec5b98bd0ca1eacc14eb97189f1c5ccf12297f77c2efc5470c490fb91f02c6dbc3871ffd80751a63d4c47859f58afd45e3e78af63bd6ac284e95ba5f7a797b2df9e5fcef92ff1e778f52f54e6e3479da614acd1b3671e566646ab010c82cbd3bb9767e2efa79e8033221e983df6dc0c84e8d7c17b4d05f3d801d6c949204594de9bc706d19b73df2c6191d224add97f9e1d0f73fd007cf05b53ff9de55750c745e77bda29c5ecad41e478deeb85ae261f33b6a18a3c6b4fe48a6e6346a8aab21a8817c3a6aa2f752de5ae8ed4d9f6b8ca346b5ea8d38d608d730bf49e0cbc275a8796daee71ae543ccf50ed76a1735d01df47be33dbaa3e42ee313b5cb8770adf230f0f5f68cdbc17b50adedee2a2b1ebf9e97dede7911f340b5d667735cef2e69b5dfadfbfad95395ea79cc8ba3bfd51cf74dfd5f38edac2bf137e41eaa81ca93e95f1898b6dec054144c0a217b72086e99e4c0cca49502fbf6df9523df46cbf23e979d3a9a29d5e681a36e4bd59cedddbf0ebaf1c2214a5d70e8ed874cd5479e7556e8f91e4be2d703d5e446dfc1fa89d5d837eb275663ff265c87f5c9b5ec69bd9aef68cb9adf8caf3fae33d747047ec2d75eaca3a0f112fe64e395fb4baed370d078057e1bfbaf373b39ef92759a3ebf66a9cbb076ce38effed18d94ead3e1d3d7fbeaef9873f1251f1c8075596ba28135871958a38b81692d0d4c81a332650de7dc667806c78bd13afdcb020bf73209842936118eba0686f446baabf3c0963d0af4c7685efbae2f57eabfadb5aa5c6f1375b6becd3d286e47edf02755cde84d61d82ea68063a2f4003670f7e1eac6d1bfe88f66fa5df1f96e578703df6ce03335c5fb015327d442b7717d0c5f07e0335503baa27f3bfa7d703dd556ef072f2aa8b814d56a1fc9e30e47fb11f4495ee9ae4c65e5662cf866e2b961e0234e54011fbd6d27e06b0a7c9d80af03f0d14c29efbc900a0ff78fc47bc4f0992765ee24c787163a2074627d2d8934fa7ebfaa73de53aac1a9cd668fd75f76f6e4f1456bb04e426464a6f5b22f6e46640c4b1a1429938b3ebd214936f9bb62c4095a18cf856d87eac0b892c6058d6fcfa8a3bfd0491f759f32448f2ff58dd49ef7df161d5b8b669ae0591fd17a404dee91b09da146b75ec7a8814f5e785091d27aea84fb6df45932c177cba4f5eaabf94df88a701df934d6c175a6df83d79b771d058cd742cd7e9564bc8c8ff717fa7d766cbc711611acd35d23415b2badba692ddc9a2db59a1c75a6526df38f742e7d4da903b6b6fdcf2f8d959aee7c3ff44f387db0aa8b522b916deb1903391b32358a8807c9f3852314ecccc8b7a7ed25048408076f383a2034a776d71b03e7dfad45c69473d256bfb0c188e42197f796222de9fc5192551f70fd8035c35c87855318647b80086c4304865fbaa6fe51c1d29ae253e598bff7205d3089f401b6873e166aabab6812ee043699305e7eac075f4c34cff08c7b2497ae9d82f708c7bf07eb8c7d3699009df94861dc97aa03a9ea504215219d120a770d2189aab8f4939a3cdb6245a69eb9d1151fce1b0e0e8f0f875cc0020302dd7bdf15b8a9985707effd3bddc20648d5ab9bb9e0aafe8f0c6c74817eadfa873c3a7cb3be666668f529efab7895615ef4e22c43f6f4d73d241e2b3312f4bda5b139f6fd73cd75acea01fe242a2e52a15a02bf5c5f36f0fb55509909c72b55b201ebdfa95fd5c4ad1d5ef665c95b6b3421dd7adba6d396680e7d53ceda110bde50aa746151e3959a23af9c59317bcb1dfafa6b9c196e6126eb736b7ff7bcb06aa70c4cff207a86e446d747d88c6fb7a9b8d0ace3ad9a35ced0f4f2f203569ca319df36fd8f7c60712ba5263f3beaad82025c43e75c8617fab265cb759a8bfb07a21f062cd8f9716fbb59bbfb013bd96c037c711a2ee1683af0bc871f76a58fd4c60f3d1ce5b448b318c1bfa69fc307bf39e8fbf8bc3f22789ab91eb6072b99df3b0e7e2b76f00fc558c39e5163215a7d026c0ffeb88d2077601bff9a71260ba4ea6e3849cd9d780f7ee115e6ccaabaccdd90eb87fe79c8cc864aadbdffcfe68bae526acda0a5c3ff68add4ea17ffe8b57a8de6a41eaaf9a4ab02aa734b83a1b58f566affd7db4e3ee86a7d70dfd8b2fdbf062bb54fc3c60ddbb5d3dfa379ca996ec9d5a4de31dde1b63c5446d4ef5c5b76c182579fd1b2e673adaefbf89dc5e637aeb8478593088a8a87be825522f7d04e7bc3000fbf71c4009770fcdfd17d521bbea454cb21ad7f1ddd595ff366e8f9c30e57c1713a63b15ec25c02d936d761ddc6d6b19721925e81e85b7d183fed8b6daed7eac61559b140432f0321f1c7dc7573dcacb745ef6f6a5ea80fc4e55f2e7a69b2e6c47f7de98733a6d6536aca41dfdc5290a7bfc5ad55abd84d5606f8496fa6480c663cd861647d2d9b1fd7bbdb7f0e5fa754bb538efefc0c2db9d679b941fdb6cbf5b778c03a3e5a386a17bb03fbda58d5d775fb5d7cc3ac7e776e51eae5336f3eea8b4de64fa5a2a433ad5b99769f0b49492fae3de65df87725206103a4ea216a146ff2ced737acd422fd41e9435efe4599051de524e48296073f1f5c66830c95077000a71cecf76e8e83ee4680d4ff7a321225c087bf061efc7410903b305ae28da982dc13e5b8c5bc946e28deb24673d4f3ea4c0c0dd784e0fbe683bff9596fa0d5d72f7d6333158612f53d387d3b6a8d5396504a6fedb6167d5bd7ab7b8e52e7bcf2df3f4f3f5da956cb3bac38ab9652e9e7d6287439eaa407e02edaa0ce994e5d371071d8b503be385faf8fb1e3f31f5908555409d2c9134129439c0913124adf4f8404f1249c057567736e897202ae31f5dc26b74c724b1db71b74ecac51c7baf310fae9c48a040c90747725c9776e124662bbddc1b7bdbeaa1b572423c683189f8ac165cf6dbc4da985d7ce58f055b152931e1ff1cdc4a795fa6df5d4f6ab90ec4406e8518132ae8f416eda14f7438444e654132d9e31dd2f2da37bdd7e4a759df7df534f0e6909e19e8ebf5ca8bf7bdaf1351a377a396e3e6cf1fe3bd99cb39c7a6e05ced923279c7ce3c74abd73fb031b23f81b5522a4daf55cd256961afecb08c9df558595678075b58121bdb16ebbf9cd87ceeba53fe8313526bcfd968abaf5b97f67cec812aaa23c293140273b4091c410d589c689dede833f99aa882410c6b773aa22bd308d57978c1cdf5e5591e58d1c77d63ac32af5425bb4f59716233447fd66e3bbafed7fb752d3fb8c3ee237bd708bbedc34b518151a99c381f1984bcca25f8eaaec1528454b2537ddeb378f5957563c52a9a95bbf7d7c96e6a826ffe7ebefbed2a4b0ed9d47ffeaa67ea997d6e08ab6e3310f99712a8e4ce1d5b593eec0d642abcc5561367ffee04f9b0cd704e48921bf4532ccdf9c568057011600ca248f74e05056541c48568f1d1991f2d999dcecb919a587eeefd68fc97eb1fb231fd5d0bffdc76a71da872ace6b891816cc03ab8cb08e07324364bebf543d92043250ee0be0cf11f8c672df327d1fe1b0d1033ee10e2cc7db83fbe6793d0cbeaaa72af34a4a94fafd8c19ab877da1d4bbff7d70547f2d234fbef8ab4db3f58e5c5bb4a2ffe697cc83b9c4eb5b80587f65afa30fa373199548461d8d72147a2ba3f5faa0171fc337013521da52b5614e895eafd35f1a3d7cde7e9a905df8d58523f4789a576436700309eb7769bae4e0befa2cda907242ad1be3e62373e70889b5c02a73d741d34ff77ff5d4a57a9fdcd430ebe71b949afbddcf43d7ac35d7500550525d39229e890904fd9e011801cc15fd5dd6fe6e1248c400aee075b35237747b3ebfcd377a6237363a61d299fac7bbadd16e52c26d04fc4989c136d7414240dc86255545317c36ee4ec68199fbbb5b9068a80c545289c106be3eb8cef31ebe1c41313ffd3e786ed833ee0055515593aacfcaba2935eadc7787f4bb47a909977d3e7c3e361e979a254e9b2ad1d1ef540f850a3f550a48e9d9856e96393a8c9c0b6dfda8d48513ee687d8216cd8f59dae53f7777d2bf2d4d9d58bb9f0a5425ee74c4fb18157109c1f7bd06e75ead8fb8e127bf9e311df51a88a32b46019f12a4d12f433d06aa155e81b4e795548f4170b6d59644220690249d728896a47f7a77c8bd5a024a599f7afc238f6c53d20d9b5f452068966138b4bc9a4cf235f8aa8d9fefc377f1ae2f9f4a96f0fb23c84dbf8feeeb795bfee7c21a63341c76efab5b3f5daffb072e6cbcfe7083992bf15124b7286d2cd723d50ce7f54b017bb2467eb28c0311037c9549e3d66d14ea03bec109cd9ad49ea8d4d5573e3ae1cac54ab5dcd26659f7598a3520bb4a82aea85f3ee68f3fb424b2f48153bacf566a9e3de9df2b5698bf95922a966aa6a3e473b9a8f4292b17d2fbeffa54297f17021236800f20fdff13979edf387d9852c7adec963e417314d69fd6931d37051f983e559114356163d0c73d490c73e39f99f4e0f7e3b381af0ff04580af7a07bf24803652a3f44132c5edddf842b73de3a631cdf2ee52ea93c6cfdd3b1aaa18b92159c280ae953938ba4e88ca95e00cf94015aa81f8f89b28c406e492c07a639ef5cd75271fae0f9070db8b173ea32593d0d050abf474153bb0923306dbd5b65ebfe9a969cf2af550dd6e5fdd081b4411fc758aef01446d71d2359752adf0190656a07ec3769776b50de075ad19a2ff1df97a8dec0b94aa19aab5e05b577576b26523550e1152dcc5eb2c12fd5dda32068070f4c43af6ad273ee83df892aab8c2162490c07d66630e128e57e29f7ac2b757bff186261ca7f55f376e9cb9900e7c5e8fb40e2149706df072efdfe977b20d708964590a99321088e49c7c70d29b813521776e82b2c22895aaa512c22ebca2cb83a373f4fd879f9c73c15dc7e87b4f0dadaf556bd71192ad6f6dec3646afaf87e69cbbe946d42d625b1e6c24bc4e69de683ea87225a9fe0252faec7cfb9ba8b0d8cfc136c03d80ce2feca52ef9440ff1fd94e76f724bae5ae200cef32de88ce8ef41816d8510e46c480c0385aa282f89c420039cc83bc5a72a403f2f89c4205566851489ee8bf40e1b7c811c690ef045c7bdbed39fb9bf36d21ccca2fb8ffad02deeff917ab13cddcc2b198bcbc169978283296d6e600912c2970212675e8af8891294462dbd1678a02220dd6c192a0c92caabe20a402ac1aa39a30583a62d5ef9b352878ee8bcb4566da5eaded1b0ede1876f635ee43c14729855a6aa464b9f5aa37373fd9e15b795678ed7846cf107bf46d6a1146c15545a6484ad5a642097ee251b086ac13b19401a01b4459f9a19b92710f09c277afe5a477fd97d7bb71a35da55c9acb316357851c5af337a2fb96e131ff4d99040a6601dcb08f2c21d8c201f8bb7f207d6e6e19dcdfd03b71d41be6ac592d1131e53eafd5bfb8efd0405ca985090ea098480243eb249955c6a2011f492fd005f33b018925ce9ebdeeb48b55586380a7696c0f398415ae01d47051dc02875c00c962050f112f82fbffff0de6237a5c980e2d77f7a422fc68f0f7dc7cdca9d7246ea0d510dc94e7a19a61f59f3d24c4dca67341d73d5fb7add6efd65e3c072a8dc58d5da4af4096600c2898409461e60c1ce8c2cbefdd504c436c08224c4a947b42879e2fee79dfb8a1bc179acbafe40d7b81b5be019d18b3244aa0d69632814077f3efce357b3ea2a027c7400dbc0670881d4394b5b493e0efad56a35aeeb0e7c99786ed8e0f3b93ddac0e77d8f58a4f714e033f7c7085806f0e5019fe760a9a85976ece62395fae0fc479feba739fb4d83d7debc152572cb5a0362a3968280d0c62cc5c62cc1062e25633371e42030c4f1947d0e482234085305e99c4972a11c5504e3921f6e18b47aeba29a9a839b179e79be6b343e3e5437bdad4ae40e6ae62933e080ada6ada466699d92f5d395faf9cbe1c3676ec43840302a1188286bb257de803e15bea20d2b39b93cf130f4793deb1575d629d72fb84413e6d0b89443aecc56c111d362ddb2243110fa8230f74d1c43f700062876d0db1815182069cba075c6712079e87b18131e6fe1b619acdf3bcd48fd5c33046f1f73ffddefbb9cfbbbaa8a0f6c405a37ec6d4484830806312eb42e014bc1c0903344d97c014108ca6003619b1d313242455bf196f89d246d6133a93c0050a8ca5cdb44e1cb733e5fffa9668cde9fb6efb7fabee346749d77c5026518da4cb5d336bdd677776ce1aa84c7f7fbfc9529887be375482a557272c13a261b1fdb4cc2e2f70cc0c88e8c28befd5591e8941597bc5222068634cf7ecb3bafaebee61cdd39441d7ae227d1c931db35e2845de0b447e4e810f4c3c647c6b91011d14191b8dd9d6b70dd71c087c8718af4c6f5b148effe5e7c88aced8dc86fc493687ca79bebccf5848fc6ed0445bc3b1cf11e06be2ef1f835368a1c0f035f6fe0a37930be4139ceab6e65bfc8531f7dfaca10a59655fd36721d365cd9930612612846a9dc22d468dfbad5c0cd58685bde411f46bb2dc3011168b7159ce1d677bdf713a1da32d97bfd162cf42d5bfdf8e776fdf9a56573f4c61b3cf5babeb7e81f5f71aadcc0285f44bdcd11efd17e60c4fb52fdbf6db4fdfe9571f0197a83d568576b582dc477d4a801888324fd7103d31e3530a591811c094c56ae382faa68a38262367e27abc4214a9ddae4caffd63c4ae3b825f58ffb3b2ace701018312dd6adb20322b29109212ee3c185b8cfec83ee02ff106f4436e3ef2ff1f3bef0e08bed0bef3eab6a52f953e5794acd6c1ab9e25dfd5ddfefdab7db276ea4ff494e791924d3122419245521af3fac9bcd38f868dd31440a90cd20f4bc4eefc2fd19c057e4c55bdc03f019ef7319c206567437200ee6a25c2fdead5827bc9eef0c1eef9203e70efb73b452f35e987865ef889ea78bab3e2b3d28b65f7734e27ddf9456196eaeb32bda3f38258cdf6ae3b9357f3790322ea483b14b23953145b2938d87322e5060ec4ed7b0ffab24102ad94a91e4fa052f19727faba65b94aadfbfe9db23dc83a797ba3bfd9aa8aed71b28950f01ac2b07ce450f6e6b2422519b627a6c4496f6c176ce52e746fb03ac6bcc7588d4a52cb85d832265a122202fae3ee03bb3a0721a600e7e7dd56a8ccf5c5f2802b2a67823c735be02e0cb00be289f630dc5676d2a22c70bf1dea4aa9b622270d71cf3c7d953f2941a3af4d99787c36ba87c8281a53f195832c8c06214f72fc6bc17a3c6753172f41443075cbacc40524995d507bcc340e6d848558583b61235b82b7f01444d743676fe6c60552dc0364a4d2b1cfde6224d584e9a77fe39c7acd28b7f6cfa99fbbb78fb307f5f807930f31414f17e9c8a92376b0d6f0f0fc797b23c35a59eded035fad61ee79efff35e9af8c3f20f310e4818aca280a4547996b7cf7121385898a32386080717b99f87862a754ef39e993df503439d530a2e7b38ba5e282ec7acb37e14318d754a190d060644785304f9ed58c773185f7fdc47fbc01b91ddd51b91cdf89bfaf09bbfe71b7c7add25de174d745f73c0d30b472f786ba652c3faf69f301611d5a412225512312ec590208a0ff1fe5e04425c82f92b012b504292c5fb80b42ec90b0b35ded9f9e348032bc138f13a942a28591e0011e19535c5fd483d52b9c97b3d49a695641b834dd075739fb6e9bb977ed7077cd32d07b499afc7bb5f8dccbbbbb859a2af52ff87837cbb22dead19d6b2d0251a5fc3fd5b1ca925e79fbf1f71f5679ad1297bbcf8d5ca2fcd35ce99804f611c2499d40624f7deb3bcd0ba7b5b4fae4edbd304c43680371a168e1bca9fd3e3f2c9f71c1755651c78ca23d183c190194add413add0c615c1ce8335a1bec8542053505a276368c7f6b025505f4414d9f5450854205350509304817bd06c748863062c6540819c097077c5eddf6148e1cef67ded7abe28a534944802fda9fdce2ab8f3fd01c73c1c8598bc95b83dc134bf17dc958cc711001360ef23b972a804a703a643cafc2c265ff7bf27e81ce9503bbe877481eec3e4b07af79b368ca86c337872fafa3dfbc5eed866961330f799887c4aa14a9fa198803b829ab6acc3cc90dda4ebdb55a4b6a135f1ab1744643f17e7440e0e0280701a434f1bef78384c549ee32d01fa8d4c92bfe2fada626e8cd171c74f4604dd0adc5eae87a87a96da83aa5bbae2fc27b2cae33fd42a4e6b0814faab8f2808fddd871ff40815fd812797d06a9b8b02ffef8e8b795df2ed082cd374fbf341c3c35db384855059569111815b661d07aa4f507e330a9b0c81b8e6d16a42225a3bb5425617d914a92fa52e5e88364337857dc87dfd918bfd8db27b75a5621d1df81d73dd77eadfcf197657a5f1e9a7ed2bdeedfebdedaf0944ecd12a8d6e97b2649f1136a98b2c1adefd2b269ebc6abb5a435a5ff372fcdc7bef515b27a578c5fb8fffa9c3f720123db1a41c2516def0d3bd9c280b601aeede3d497af3aa3f624371a37e5b29b5ca138623e2f275b8b18ef662dda9bbbc7c0dbd9367d279b974314ab1619b3715dc4dccff8cc53f3595560fa6370bd6dae8fe1431f2a288daf37f099e75e88b0b07c88fa0e9e3706d793ea25dba1b71e037cdef788e1ebeee93bf8fb185c6fe37ee0734ead3add354a4fedf1ed01bf81d3abc482218e8c3620e998894094d2c6a5dfb171c9b8eef3d612de32e4e5213939f93b491ed2ab860e84b236b1f1fcba6cdccddf552498976cef3cd0f7d5f360e33aeff795f3dcdbeb6c5cefcc065f1e88832295bcc4c8bb06de3629a700c2d84e2a00cea23a36004600f5baee70c8095d2f7725b886aaa2c5e5d1f119956304ebcae175dadbfb5ebcce8cea13aa4e5a574e2cd9a7c127d76d84d7ad07bfde2f89f187197f18f7d9e87bf1017fc594b2269b6f57ead3675ff8231f9204af0f923c28821a360e22144c384812811b7531181bf682fbda8b870908d924681d3ee4855501859c92c14a799face3216c22bcafc896739f78dfb880d5813d7b5ff4ae66982a9cf26e2baef79f3b4ed877ee6cb3658ce890eea68fb736841ea8010d433a9c64d2a07948850a96d633953be0e4a116908505dceeb6a70848d8005f1a63bdf1da743ceafa735c9bc7bdce870dce8beafa23d13fe6fb0e608f0d20688113e1f06dc87cb66d40c5e1fd8071f8e8b944383c07121f6844382ef4967d71c2b81e3afc0404d06bcba071e78300127e98be9cb0d7564207e6d6a337375db244a9cd75d6e6916e970f6e3ab0c9ed91bca428ce81bcb1be155046b88a8d042d79cc2d50787f70c4bae0882a094a82029597bb2147b77d7fd992abf53d7f547de21e5071071de6218031c8e6f502428e79a20d2a0ed89a7dea3ed3021216b969b2dbe629dedf69e35962e3791dab63d00ac5ae0bdd9c72e19557c6addf7cb34e785df9d6b3785fff3af0ae2b1bf87a07ae5bef3aeb2df03b9230739ff685171ff0ff366cdac5c38e526ae3b9ab3f2a426024ad17f6c6c3fa222f3f22204438a43b2a7b61915306b9ef0232c1a0f588a3d657bb5c014a092309a4efc7c668405eb7a2e2a06f9f4982124710d7fcf78f8e9bf47a5e7ad2dcfb5f7831363a870877f0f7c3f7f7b6f4949a8bf6d71272b78b6efcace306fc06c291960638de406688683d932d4f9ec339de79a87edbc30484250f827ae02975d39a5deeaa4ae860204e2996fedccb710651ee086f98ea490cd9019c1d6df8884f6290f8ba039f314afa2506410069dc011c1e73a8c0cf1c2aaeb7bd0766c9775b8e5d0d5d3b2f74e29870509743c72f37b8f4b7e7d41dc489112442404799024cb6216df4e9bede5ebccc391201f92e36aecaf5e567ba49e6f43cd8e67d933006c449b304b26dc6206540ca43758c1521162846101b8ce302c8f848128694402ceffbbafddc471efbf2a0f7f47f7f66159d70a28aaddff6db96a8e3181471d0f33a30d7cbfd21d759d0bab5057e264c5efc8e9048085fe996e25fd7e81d34f2aad7978e16de75c49933a322e269386e81240bf2e6a380385a8fa2d224c77708ef385faa124130e479930c26252c63c43868fd0a0985256bbc0f4b54fafd5fbffcae8bbee8a5ffbb53c9e639ee97a3f94ef6fd025ad665c73f76066c364438d24f479f080849d630aa33432419215bc06ab73d444038b2dcc60f7ae0ff19786b59e3c67a086f875e3e6d5c8283df262f10c17186bd077f1ce50ee3fec41b32dfd4dbf0a98ac2e2e0f7e1f31efc3e89e142ce94047ce2e0979c72108717e350b11d02541138302b0fab7881381f5ed82232970f68caa123fddbbff35eef13f189070ae30d2181547b434a4985f090919a601c47e76439cfb91baeda8c0171ea73aac71884ce4dbdb8168cf84c2088609c22fab0154909440608c6ab06ea0e69f8e1c5cdf4f3729c68481e7f771e1fcf02adab30c68bf715eb4cac03de0fbc3f707fb275db5be077121366494808df6f1d271ffde51d9a7119bcf5675285922d82545714195d2adc7439829a6c6c227095dd67b11e39923adb0b791d4a421151bbb6d9dee7480987f6054bd8224343b9c8ade612ca8ab7cb5bbb9258c1f1b346bdd8c8238184a330e8fb0548248ddaef777858afbf9aa3ea8cae09e7149640004995c51236ad6b4948f0be2c8954bbed6e0212167d22247ae0fbe6b652e1ded1859b937a9af21ffcbd213148ddad14e9934b0c36f099fe1ca12af26f181bf70571b211830f84638e38f8fd9c7244e04bc8e1313ebf4aaeb7675e306e6774551a1104aaf92d0fe440af932aeff5b2e83f46e613edb9804d759bb89f555df49cb8b8108697a8d9d1852d3794cfb6216c25edb1ed831903d3bf4cbd4ea2bd45ba61824410481221b7dd20c923ec85eecfd63ed69da7a62a1fc1675527ad03c7c75044f0be5ec2e9f86c19065f6fe0b3036c4272ddfa6d7c0909b364809cb4aa9aae0a73c215c3f22691571ad61b4bb6a4c221098402048354a622b29c0907312e42a2e0f54323dfd32d2c9e2ffa4ce884244f048425134d5887b67feea748445f7b61e58d9b7ab9124892ef1770aea58c4f5d52af9e52279f7ee9891d5619fc8922e6a3d712630442224bebfa92058513ce4282b6a708886d403cc796124e6f1276ff1e2c721b892189eed67fd004705e36faed85aa2899c42074961ca7413ae8f6e2e00f9018e238633c3740a72d74ce71f3e239306b0eafd3ac314548d34623ce883622b2e77a0e68e5cf19c4f7670b483c8fad76aed1fd11c08003c21d57a867ca93fbb9018ec96c48ac92c168e7409518cc1898fb7f549d6958216268089e2c7e879138d0681ec7109d74f88517d47a5a774684ba1d7bac9fe0fb54a7ca67c4f67ef76cf1be31c6cae00b92d08325302ffe00159a648036e5af7d7bee5ca5d6a42eddb889dc59c996859964c201c9830908491a4438a4c421555401eb62b7491adbdbf0fc404282f1cadc5e2c91e8f75fbf70e58b6e2a9de22bb73c3eda7dff64df4fdaf48426a4f5f48ec38e42bc4cda69064a02c292086c213e9b9e90acff3604c49294cdc6ef7ac0564f2b3fdb51db10b9abadbb355803383bd61153e0949418fc2a02efc1ef0889c11612c31c71f007480c719cb1c0276d3e42b20a30bad79a5d77c6fe70b365ed3f71f6b4a08788df09d2060d63066cef7dbc5109ee6c8b88e7d3f3bac7c673d8f3d94fb8de24d689d6fe51afa56436a4de4222a4c0ca648cc149ce0f3cae3802108524c20b49434a1c52127161db099d1a1cefaa6a1e721e720b07c5a98ccc78a4ead44fe8bcdfddcf4078f7436fe0b305839244028b93e812e277c22ce144fb7f7cffdbd39310a0c792ab3022b37712110ab26d947baf9312b12f0d7b10e1f8bbb58801bc5f6c6f9f35024448a4d15d1394b5f5ff78db4d5fef24fb7e496c7a8dbb36afd71199154855e5231c9040c8d6e7b3e9d1391d16fda46d4fd940e236da11b79ed2b1c613bae3580bdbb846de40919b8ccd4215954c55e49718c2069f5189f92406bf8a200c2cf401c3f837b1c4208da30112431c01b43de3669db6cf98461bdaf6cc0bc69df24ada61f5672875f0594774776d499e16069c1d3f23ca4f18007dc9e6226af7348937ce1faecbdcdc338f776d1f396a4cd436d17bdb8c81f4ae8aa926036c4834cf3fa893e8f13e49428af6542ad416bf87c5ef7a5da716d4d81a2da11ca4328a79d9c983c2cb5044844a23c8966133a3e55d678ecf2d97f079f1fbdc4979bf918413bd7ec66763eace6860de93549e32b961b928cc452a2ab6bd05481c3ed5540430acf68e1631404a2444109940d2bcc5b9c78fb8fecda3c6e8fb9d39cee212d7bd599e13f4fd82dcb8f13d6b85eb763808019ca94428c8e6417d481e6cfb206f2ccbfb1edb9f0672771110db0be3b35e1edef594d5ae88af272cfa628e4c11c2a93fb84f0bdef02732450871febd59e4a3dfc3660cb8bf3d19abc575b1e786f17b76003e07f8687c59c0d73e009fe31db7f73d742f5be033d7b1e4e3887951621e0cecb2aac7ffae44ae1e2b02489c051608ab64141aae93dfc7e795b19b1b17a6d2e3a9b1b4f6ff32725deecd09b94654e6cc28b5c91831affeef6ebe476f25e61990f0a92ade263c5fc22b25c8b828090c1bcff5fc8516855a1dff4dc2ef9e641d38def51c4be5e2fdeefef567fad9bef52cf6071b6b3df883d629f5cb6e2a7d71c3ad4a1566cd3e7035b218578a780f361207a9aec8bb0a84c497351707abcf38beb7b588012c81e03d581221c98b547f7a5e1675fb25cd75ef2d7fa56cc4ac2671eb43ac074ee9131646757ce7d0d1a96fd69ba6d43137745977e0bb063f1bd36113a1d43c2c919024229c4868bd57df2b6b4fb9f1da3198767ffa8ad6cb5452375535a79ade507edb83b95fda1ec80b260b7caf9f53a4e54b9c3f9eeb93244c9fbcbab2a04a902aae00e3afcf1b4672a83e7760c1910a91b6fee5cd4e3e567330077d7ef861248910c1a022fd1c0847c6e21fbcd705e940a568bbcb5b87d87f3efad5c53fbcad09e18a7b7e6f7eaee678abdeaedcb2fc031533e6063b2598fe6ccef514bddea7e2a2f5f65ddcf393799d5c24fa76e2cba22ad94bacc1adaf518924611a1fe5f00a47fb3e6f3261bc6609354012cb4fa2e2ca162a34a9d293fb4d792595d21fb6beb70ac659e6a885f3057bf38980be4a59a7830ed63180b4d36cf4817faf6f1140db00270c88f7f505306ac252f95e45ad684a9d00dbde36545ca68f73e2802bda95b6844a9b09c3235e9822e34072c4b8abadbaa2b6bb084838713f7a207da886377c21da8db8ff385295136189c11b0712e40d15e055e213eddb8370f046164671bfedc17bf0cb0f7821fab369c30b1597cf5819a0daa0f7087007f6cd8b50e558abadabdd08d43322d70cb81eb98178c1502435380e1fe7418485088ee0b477dc3f5cb4b0f739d4ac0ee2ba8852af8cbfe5b309a72b35acd5802da7a52b555cb065ca2837f99d3f80903690f9de8231f0a9b8687d9c1c6373f9201bb363ef132ffa3be3d49f6e4df3c008f22ccc62f519212208def725e33b656a0874d715ef2f55be315b5fb667bce8177fb965161390002f3f8ed416ba7e261ce48e4bce1ad9de799307ee3fa505c6a9e0f77842527970f92b7fb409667c7cde867e679c68bf76ee3e87d6ef66f0fadcd3699f13e328dd780318c5e4b690dd44406464230f24a2ffdfc87aa5eeb32ad83d514a0cc9bca102bc4a7cc6f739220e84f8032931f88c974924862c1cfcd59418a4118c251f8a0311fef9810788e0401ad46e36a8b3dec0675e705d8be3906d348544d77102e2772634b4a04842913601fa7ed575e30d0346bc787c7d3be07efdfba4efbfba7afd7aa51e5970d1c33dd728b574c86f115bbf715566d5668fce988c8d823108f46a1a1d934158071f348e8066253242663a6fb9b98a826c67091897c4eb205904b9f4eaf2d90e03bcaefc715684afb767bcd86f1567971d45190ef840146edf4c508860c80054922cc2b81f045b1ea8ffb81601b40de0f7264984243a4d982bc655348de6b08b313ef4fd480209c7f7f91c1212657ab79abd6a2379a2641019d23e972a59a9c2adb62d64777b618983c2ed5bcdd5a6ba261bac38a805a58df9cd4b8e2e0c9cde835fc98d27269cd2c0c754455e7c81c64b9fc4609e4369c467e3e0f7abd01273ca4111ef2c81046c787980080e84f01dee648fb9ef78a50efd39fbdffb23a92245a2728e9c53bd90080d1bdb607cf3796b501a732b09140b91346489dc5f3d7f171c4f3cc7f66ac3db9efef8267dfe37fae0b6cb5a2a55fa7bf1dc052d30032a8e3188cd4b62c6e014e764c61fe0c6cc0740b2c4dbb69ea3d343f3a2f3f3b5da58d78d700f3266fb559d89d781dc0ff2a08f88f7150c852f854e75256ac7eb7d18aa9d3a9e722c51524c9f719822c3a91f14318ef92552c52da2fe99cd4efcb3741a70e72734d46aeb468e3b01818581aa582151a65d57f3813af096234d4248a8ac7dfb4e3a85a8807e60db535e5871ba6667b8dac74d02262506dfc2ce177efd82a34ba02ab20dbe00551179e9c45445369e6b0e7a7fc47bc4834f72b273e0d545f882536d78c61de856198b440f9a9731021f1d5076fcb8adffa64cabf38c52279f7269b8572f97605b1f51ae9cf4c70c247f714e79400405120a1312d2a1caf80882c2586f89bfb32d46afb30e734e5ce91af7ee993be8fd136074256f11a94a936e9155713af6315d060f5eb850a917ac1b9ec81da8d42ab5b4d110378dbd6d948a8e7f9ee9bb19acdfc5bcb0d81be87beff3989090917f1b6ddf469923a34919f5735252e3d69b4cee392489aad36feb0be33a2f23e424b399057af379f0fb23dea96ff0a594a40ea0d418b8d39ff283084a6ff13bedd86cef752ce94504fca7371b30021836c09daf50b7d4171acc543146437c3f474a94010c66ca8b2947a4a19e8db471b0338d545d4986ef6f63030968d101df84823481c911e9a00fe0907654554412c30eaa8a7c9c1db903e7b304b243124360f6e1ed35b60ae372edd7ea571d7f9d52ff6bffea03cf68cef8a0470fcf6b028e9ab27846dda9555c364f4a8120090ad94e3e053c59c0bede3ebb11ea0335f79e470f6ab6af5217be7f47cfe177ea710da957f707bdeeeeebf161bd9b517889236689701141c102c74cb091d635de6e7c6bf51ab7a0d50bf7fff7b867f7516ae9a6f96fbef6a38a9b67b13e22fcbd79c55410611211f17c1052c11d3c5fb6e8c62b51996e12459f842ab3eda2c053e0fa0d625c826c39d54da1932cfbabe46cb1ce422f871e6302922de6c5d9f6ef3edb19416a1101ffa18d096902c923da22ee9e09fdbbd1ccb8ef279c26b61150eb6530573a875be64ebf8a55120a12f9717df5250ed9f63001719b73a953e9be685255114b20011cddf6aa8af285c4b09daa221f6737872b12423591444510b4c18372256dafb135c0ebacf63df51ffdb7beb27b9f3b8b3ffe48a9cbb21f6c71b616756b1e53a77e2d14a2e1b4d0e06098a0484905f50758159600b66f77dcc9356b2875eff20f5ebefa3da55aed97654daead176dba75f9a9711c7acd2db5ef7b7ab1be6ef0fb331faa54aae18cfdbea959d38b8f0809736c58091cb8462922ca947a7551af05795d959a3b64d2b8c7f473aa52aace8f56aa93eb23ce599403dc44723c964c3ef63e97ad7163e2c63551dd10edc7387a8c56304843b0fe8224deed8d200f60841c29010bdb6102db9097b3c5f7495f5cb369a35f94b74504b4bd50da92feb1368eeab648403f6c803bd3d67ba1371ab905d9e8fbd9de73414a24b1ef89fe183e1fdfe1e74855f1d8c4cfafb6c4110efac39e222011c0b07ecd9e8ea974964c55149c1bcaf4b7575574a19018765255a425101bf88424c5e3b13de35662dc3eaf336527999788c0e7796ea0d719f085ee4c9dbeef254a65947578b6df14a56e5df1dacfa38e55eafa179ebdedba6b953af3b46b1ecdbac9f58cb2eea6e46c3ec2d2d1c03452856989e5daf14fe71e32541382e68316dcb5454b1a23efdc34e33ffade4b6a5ef6eac5faa20daa5f8b0509086077f5b0f58952b57eabbbf80e7ddfcddfbefcea174728755adb2b27646418fc6ca379247e06e38cb838f029f2d9cdbd34a8a1fdf897472bf5c519fdcfeea1f194d85b87ccbd286e5e4e5227d0d1cab98a449c027b191101210e1bf771b3f56f673a515f3287e27afc9c22492059f1fd9d8e20af3e23d43b1e9fe3b70d79c78bfd5763609d06075ea554dd760d66d7385d256e610145dbfee47cff9f34db0097910e2d0aed9f9119f7fd64260c29a106e5505bed4ce5cc0ab6f739b46f7c0405cd2791c8160e7a913de4c6ebb1faf757d1c2ab811c17896c1439bebd5959835445f94262d85955d11caec54ec64cafc4106cfc4a7c80ec2eafb3800324f476ea0cf78068b2aae5570f684ebce331a7b51e3d5a13821b3e5835f559a5ee5e36e8fccf6ed5b0c17b470dba5aa97bf61f74e23b9ab0dcf7ebe0d3bfd39cff83ed3f2e9bff9a52cd4765f69bac39ffb4f76bcdecfba3722bdc8d3a68d0361803e27845e478ea88b4ab8ee9a4d489adce3bf5eb12a5aee9f2e481ddce3133215332d00620632d491214c0e6d69b987cf857372f6aa5d433b3af29baee0fa556b658f2e77b99ee1f9de3495545d961298b2ca71327027201be84e3851ecef27de7e1e8fa664982be8b773d680964db043fc03dd3a7ea7498714119017a5eb519212f3ec9d9a26fdd6fddefaa140fc9fbf78083969a2b2cbcb7cf3946e8d4abad1a49f6f7bdbcf95284c44906976ebc7fc97eafebff3e2b54b3bd5b2297be5f6c1fd3f7ab9e44a9544c0209b0552675970e57efbd626d4fc581c435bde04d8a3a108ad8c16cfabe485b8ea0c5f5d9c2c8e888eb6291ca38b8189f377790c3d7399e71385e4ec09191cf8c4f65019f39a81d7140cae7c4c647e3cef6cc837c8fd8f8685eb23df320df37763f5dd75ecc73e2f71011efd68a508d7df7d587f680b48b5c63775a56fa88b326ebfe55e9ff3bff7c7d88df90727027d7bdf302ebf3e697c573de81efebf97e32125b7e37f580fa639fe7953af084762fbd3c4bbff67f3fbb6a66032de99cf6e484eea8494eb61ab2b900334b1454b8c84d5a57d466d34d1b8729f562ee0d573fdb4da987ac6ef54f82cda308b5cd8ba8521edc56b9a4aa2028e46de4310e77b5bae27d6ceffb7823c8b504e29d7fff3acc16df29db834f46906751b2d1c075b06dfc0e7bf978f0cbef71f0811dcf391139add8cd1be706a707c7c1c801aa32608d088c99a15da07bdfbb9acf6d3da254eb9e1defbeb6b5fb9b13553925fb7ef29c60233b9d5b4d9cf4406f2a40291132c15789ff9ebcfd05361035ce69eb524827a6ca21ce9f16b2a1bc417eee7eddad97f30aca0d4491e3dd252716a022607c01920479c17417712001a266a031940eced94974e422302d59c47b9c7bb113302f633ce30ed4b5621cb37d1c347d37db332f7ea78488c067ee1be2fdbe41f36ccdb71ad4d647f4019ddbad7afc27a5eeba3d6fcad36729d5eaccac99f5a71bcc64c4a7c871527171ae262af0739fc6fbb17330153ae21adca40213751c2a6103e08038e20169e5b97d1021bf6a3540e519a0e2daee08f25841a96daedf40c95a79f153c4bb23545c8d6f6a7e44e76f95aaf57dbde135a0caf4c5179ce2ed4b2f3c3ea8a4ce3dacfe99cd060c7b61bc113bb54eda9453b5c4ee24dbc722c9a54fc5458ceb3dce8d5638603cf2f7a0ebb6bbfd1546f42aa18292221b2d6c7fa9583351a4e2aaee4654c2ab2be64ee93d30a58a20b9178ce1f08778e340020f4cbff192c66dde83031203545cbce1c5c11fe4069ae535ee27cb6aec4b99210b606579239f39995fb08d27e14267154d775f4a19c918780f4210c0baf51b2c3bbbae52570ee85336b4835267bf7263e611879b1b3820d2dcc111d09c0d952ae751b658cae1244aa99271be7230f0887a296c047567e05bab962b89c40efa00e3f81ca45a0950716d7704b92d9c2e02d6af13e4841140f0e5ba0ae5a60edfe75cfdca0b2e69dd190499250d221c7dbd9024134eda8769f37903fd536d24612f8c271c3ddbbf38a25d3bfddf2d42758ee8a5e2bcacbc1a0635461acb03545c247fbf1b53614942e2cb00b1cbe6fdaf9040945ae9fe938093357de985b59da562b72131187c31774a1bcfdde6c11f687b20afaeeee2e097de50e2e08f335e7a0fc8d9d0698b0513ac230fe0745962f0e65e4a5691cee7c61cf112eeb848ea88171fcf4bf5188318beacf87ed21af28231487d2fed8f03ae54ea983bba341d74b05257f47b78fca9a79a275160241d681caf40c6774a6a4715f5446956999a8303e412a4e4b086a82b3ce30c8bef4fdf4f38353852b21611c881363f9a87dec2e92228075790e41e90be3d88a1387068d6e0b310e94c39957c258101397e8824122228749062a47cd0daea1fd582926fba04a4f165fbdf75bf6b7b8b387dddf9915e57beefe767a4bceb8af6f1db9a8450135e58bbaffd151288e3ec1bfd8fd886b0a3bffb7243f90e603a686c73dd76aa8ac86ba5faaaa230f0790f7e123163f86ce00b039ff7e00f2e8065c78f5b73f8e80b955cb650150573ba112f3e6feea504f31211f80421f78e3b4112cade09e7253901b4812fd93cd3c6f1be87e4d08f57f7a78e57aa75f38ecdfa7552eaeaa18f7ffe1fa8b652e96003a74c1b99664012145f52c08f701dae270984655b9ac9eabc77b292bb3102ea9dd720e3b82df0f9253d2ffe18e392f83bd9dca77de961286a75a8bb7f3bcdfa753af8ac3fff8579a1b81de9ce4dbf73a0a89438e860b3f1fb6e3fe8f6500b03da0610a174dffb16eb95473aacd673f25dca63e7bf14cf0026f97e52a20c92fcef756aec799560caee41eb8b802491577322471c78ca2ab7187ce8e894eb8f3a2a3ac9615c6c9659d8f4ad81aa28da6f6a38737d5d66b45f88ebc3e67a8bfa19c644a7afcb00be3ce0cb31f880bf03e1b3fa015f06f0e5015f0ef045802f07f86ce0eb017c3d81af27f045802f07f86ce0eb61f0619cb6790ffd7e346ef31e882b519dcc7bc7e605ef4df39287f7c8e17930cf198bf7c8c07bcc51b9069f35c58b8fdf2303f8f2808fc61d013e9a071bf82e02be3c312f11e0cb013e1bf87a78c63d16ef8179d0f83281cfc6bcf4f0cc4b18f394877e8e581f63715f06de639c15496dae5403d5f4a253b424724c9b335a1e788052cbd6cf9f3371a2521b37acd958f646f40e9f5755d581808b0089b0a0067cd59706aa3c40f3c6d1755ef7a0861fb86ecd6d271cb3efbdf746dfdb4af8de5966bde8af81f520d657a1585fb1f7eb81ebcc3c58c06f03df409a67e0abeefa95dfc906fe42c69f07fc9e75d1ecb1569fb53d4da95f52239f7d3d4fcfd18f15fdcb903287eb7e1041fe7fec7d77605455d6f87d93425540042c28a189065054c4b5918958f613bb045d154d5c5c0bbbbaea5ad6c68bbaeaeaea2a2aabd8829505549a28b6bc8080080a0a845e8288945002a46732bffbe69e73dedcf3e6e64d4050bfdf77ffc8cd9d7973deb9f5f4735175a864348f005fab8f23d561a8d78adf66295055e80da84b54ed3230e76ecb7be1993e723c3787b6f61c183b2fd4d316db777cfe2cd8c7b80f6d687786f9136afdeff8dbe62317970bf1ed639f7df15d1bf505bf0992bc14ab544d715018ff84296bc059c4372f0eeff02f2181dc141d19fba790a98ab298aac8f37377d4733e4e595715906ac7a02a1a047ef84c5514ec4e6950150d82f6deaa8ad0c633489718a261c66927ebc6cc6d48c973a20c9ec186e48d3383a7ab128d1203aa4e32992a918bf2ceded9905a766c7dc405170a71ed930f6f1adf4b880b3bdd7ce771db558f30309238659eaa4561e41547242e71cf45fd2a23bddf5e6a9ec4ebcb6783e2b60c068f3851834a2350d5c9e6c946fc0d363380df24bfd9135dd70b7151cead17e7a8882ee31ddc741737aab2186349e31c861adbbfb5e2a88abbcdbafdbea3dfab3767c9110e3d9bb2f4d26745431a06d5e6b642de3648fee2b53815d67e2bbf800472dca6018b410299091248624e761e719c4a62f0382613a7acda7e8e2b36ad526250ed9ed036490c45206023a7ec001e16937c4683c4d0d30278d02e619c32b63d7836c0d3fb313a5062c806780ec053bfb7e9f738ead88f61008f8f8ba3c1f3c6355fc3bb484fb5469c743f92f4f2138e4bb0c4a0de5b0cdff72389908fb30df0b2019e8e77913e0e12de48803710e0c5be0fb508ddd9ea62210efba86b8f4b24679679e5296595770931f7fb8f972f9ca43a0882882791a08aeb55f87cb3fe3d969804d2abcdad693f4a0964665f9040988457049c66969a5f39bbbd00efb0d66f2e591741db2459dbe2bc587334c033ac37b93e70bd227c05af00d65b364980198047676887e1779da1bb1abe2d67b769d3ab54888af3777570e4139be7942cdbfe817a30b24ad5751da106db52fd35aa26d604254138fa7e73467547553c49618a9440869ef9cf9423d708d1b6eed0cfa62e96df75b386b839ea1248946a7c69fe98a4ee804408eb5fce961aa5ceba4459f68fcde58be57bbeddf4d982ffdd12c80b9003354862c01bff7cc9e07e5e89419892cb9923de7589617192eec63c4d370ff4da575e677b2b3170afb3e00b9e1a9618b80d29c8f81c0ef03a1334bf0da794b95754baf1236d9f397c4b6eaefa653acb05c6d3de87e03e15ce10696e9ac78add6e1d0dca863b8e05c61a8cd846af35be4f4c81b64101abdeb86af0d10695acdb79b463746c441e34cd3f3e60fe01dfa807f815aa3cb719dd3783840258145f565847fcba8ba32adf55c8727d9c71fba00b9b49d27ec888ce156336ca0fcf1135ed068b04de71060d03cfa1166612a59df87cabdf54ff61a4ee67ef6940f925bcb0268b0bdda51a3547c6dab1b6ef46427e00b383df6c5c56ef4137ca9f4b554491e83f93aa88671ff63676e2033359af336f01da6c5c1c1d5e925e6741aa4454a1e181e71da81c5e725e6704cfa0eaf16ee84b8e31c88eb64542d0e45c5563d2404cd942aa18c8fde54b6b1f7fe09d2e5e8ad5a6f9f218988619224f6554a8f79bef139a271d9e699ff855b4dafa8a32c2170dc8c1157daefe30d7fdf99b73a7f57f44128c39cba6ac5bf50a8c539ca641ab71fcd0cd9aabb2b0c6e71847ff8babb6c2503baaf2a54587feb884f28c8acbce7fb6b5fcecbfd6cebe7db5759c2c83c5d78703ed2cf85661c1ceb7daef6ab250c2082a688bdafbb2af088863fe2ada29dacffdde7777b32f3216efb8c68399080c5fd8c8c13178f01c6e8ca840375e741fd5e179ef55cf7bf8c1ef710275f81e3cc22f0ccf6569cf65b17e107ecc26e0f5177fc7decb36b8cdee4a47424691ca8c73e411c71e7e0a6f9bf00b03bc2c8007e34cf8f171d1da1e7ef49e2cedf7997ab2cc04f3c6c68f71d4a6c8ec2c46c8bd718e3d5fff7c7d6bdcf8787f42f339aa6efab8aa314b715a1f55935b300b94730fbc68b598c4f0e7f3a5f0cc6177e767b1798efad661d4303e0a3e839760ddf0f1373da7e065b175c0c6bffcf4b2a7961f2ac4eb4fdebbf2baae42ccbafc8377173eafc681526730c21062f12029a648769450f8ef385c4e581ca86df1f394b00e8f13b810c75ff6eb8cf0a0b79a4b89e3efe2ed889b2a2774704a6bf79a01fff9a38fafff1c309e177adb3f9f317835732ab7b8297c12159221b138f0f95e1392fd4440349de726a134cadc48c7384d311639e8004e36c9c03684279fc3802e5b3da54b2222d9c036c8ae6a74a7f4738e85002f6c80a71bf793cf6564c7e38dfda0649426151771f48ca331b98112bc00d586cf4fdd2051993868c1545026bf777f64b69d181e53d5f58f7e8e0702651d86fb527ce9ecaf50351d704ce5122320a1fa2bdd83cdb88e094f76a1145f0f5cf5668a8f42c921f8022dd5662acf2857ed390c5fb67e2b9bedea59922bc4fbdf3d5dfa640b2176ff6dfb6d9590fa852ee462358e041622089c60e0418c07f30cfd797e256b8813143e1fecc027c212509bd29d936451c46a89d71f86dd3bbe5d7b29801e7269e64715f2b35353875df19248a4a2c47da69f0f81b9cf683e615e988681a940eb1ea919822978b050f24f07da9c6084d9f38d2628298dfd4172c53701e8d6261742a761bd0fdae2a613ff7d8b2fb333e43363acbbdadc16fb3a1cfb0d1a150792fbae72e7252323b8777aeebbea7932fa817109dcdbc85d6e20180d6d6bbc7a0e36201a154b7437586193fbaf03f0b2019e0df00603bc20774a1be0e5c1736180d719fa1706789d35f816738365c6359f71941b5b4b2c2070308ea399511cdf93ac1b730918a96dd113e015b07171005e36c0b3015e5e3cde16b963f371a179cbd3c6a5841b190d4e0925caa82ce1f5d2c6058e058417e91a79a542cedc8c35ef954dc25425afe975e40855d7bd0335b8a7d6032b4189b373a514734deb12d766d27d52dfbbeebe1b301571eb18ddad6dd66f72d7c5f953c65263bf8b58bffd4e0d6a9cb9bb2eed13b6de4ceee1b96a1e6be657fcfda7a38498b4f5f9618fbe2bc4b697366c2f5b00e3016eba649cc51a23fc0ff7be1f5635f2fec90709d1fbd3334eaeea20c4f799cee38b5d9bc0eafad7d13c4fa94f500586e705aabcf2588d073dfc1e56b02f69a0ec3b0c4992751ec30309c6000faf5bda8ebc3f5bc26d37e5c8e87bf3e4678bad938f9b20bcf92b817d9141fb42b54b02dce44df35744e1081909e18313cd0f672ceb375de2bd7cd1bc37d78e56f852668515aaae394cd564446781b3e8c64e2cb3037598b5a9ec2f0282290de4902c1f33a7748be4642a0acad2c66d11a2c3f0ce151def93dcde92b4944cf728a6380188d3002f1ddf81c90e86b88da90696792b91d74f31c17b12e0213fe3c05f3c301d06cf0678f900cf0678f900cf61f06c80a7be37c7afa836d804242169afe01141e4077f118367033cede017e02f6ee52bafaeb803d8d6c6050f7eee15e6793fd9006f18c0e3e3e2307836c0cbd7decbe357301e269fe62d3fe1b878de68450c9e0df0149eb83ef28931e0e31c7b3ed2ad6e4d453b21befce2bd6d9320db2ee6baaa03af2bcaa1f523b47f82e73022fd7555bb5bba456aab9b52df12a25bffbeb35d0212371e19301e05b1b689c099bcd738431486f9c47ef7032f2c07bcb0282e08c6b5c8b04f02e269eaeeabb24b25eb31f5ea510f3f365b884dcfae99b5f529180ff0aa425d3b72bc985b8cee673955882127e7d75ee31ad9971cb87ad09d52dabbbad9a503cf17a26fd6ef6b4fbf4a88c3da769b307fbe104be7cca9d8f19dfa5dca0faa2655d13aa851758804c78aef591ca180ef434868b2d9f3863ad405ea7cf6de87253dbde2e137bac8f79f939277d78bff91fd58d23ced1f43e56f1f11e7b51921fcf3970b84c45b9f0a1b1bf629329ab49f818c9ae62f0cf08a0c8c6c9e82b764e857d33f3c4988752f16cfdc04d71010e1c0543d10af43046425d490890119a868277813be11cb5ad6dee704046b9cf8380abfad6e4365e4152116bd5bb4e63349013ba6f578f50749e99ba51ed8379673e74831dc5531c8815207a0ffc0cc88b533920c6cebc72486fc464a0c3cb0ad1fb93be600bc0a782e0cf0d4f7268941308961a092182cb33bb00df032005e01c03311c091d0ee09e352c0c6458d53b6cf8d392f1e6f2e311839253a000338e7464a0c46b7584e004b48c244c62003e015c48f4bfd1b75a754b477737abe3f61ca1dea094e382867166cb8da09aaa61b0b7183c937b658d2bacc35ba776f79e2532081581a5e660267436f159ede3a56ed12365fbcdfc9ba41fb25eb0c353e89d7c3b496aff61d7eade468c72e1dba2913fa8fe3006ea17820d52c871a08894b582e3ff09ef517b712a2ed791d6f18fe9a50eb23cf5b07d68ad031ee3502ad1e6e3ffe1a591f7fe759d38f900758c6885ec76d7f46f26375b3a66c512b43a4c0418ea95342d7a9da4730f0c007c98552a7e4b1ef99ea8c54644840fe28c4b5473f34abfb39429c75d1906bfeb64b8803d71c5cf3ea03ee6f42a5bdfe22d439d459c4cf5f2e8c2f8e37b499c4172c49279e3f848f8484ef336034e6fccf944e2e43be75e38617cbe0de1e4e38709eaa0e5135057c82c44d044433028806023bf7310181ae7b0404269e7499c069b89cc7f20d739f59293770fdfbf56d3e937587c99deec85a289fc90c2d6bd55d98233739a7ec570da889f44b0cb1b6912308f2cb2f8603b098543b7ba72af222c79f04781900af00e0f103533ff8b9aaa858b400780e608307910dcfe5417f55bf8222de6d5225c201c83825bfc460c3731900af00e0357ca0369631f038bca41883c89975b67b53e197cefb4fb9174fb985240eccc68b2a99eed0060212014283a2bedbd316a9addbbb2aac6ec3fafe8b492080178c27321886086f5fbc8ba742b5e16d305f3a4344fb229badafa224256b580f5b42eb4639c38598fdf5843ed3e15c40d51d1d4090bdb81a0ea6ea6aa85f12e2e26db7560de82ac4a11f743be65177dc72459ebbbf7d2a185c076bc4d5ae9b6f4a76da9bc7dd2a0feadd6dbb5c2d259c7ef5e7bd78d1d342f46edbffde1692f5397848c721650749823664e95bbb17c9b1ffb0ae06770411162410261bcbc350cff0ea36fd0fc948bb5e883ffdf95f136ee821c419a70c3ae4e9de421cd0e5a0198f7493bf3d2fe5a053e4816bd55b9fc5bcf24c8c1b8e37ce5fae3ae502254aae6237cd5f18e099f659811573079abaf5e5766fca7ed66dab995af312cc17645e20427fa5375f6e410984c781f80888b1a4063db067058d374847c8bc081349815a80701db84fd63d2ec4c29e855bd63e22ff4fab5e7de345429c78cbfffcfb3f374b54c369b7755a2b1fcab262a61ecb89c606381ab662d0adc2289025f4c6828d8346e46cd08c0e57ee9e388d51f0c64211118d8c56218a8cf07b7c8f0defcd061b03a4d5465d24fdbec842235736c0031315e15dc8e0d9d00f484a6e156abf2f62ed420b47355feb07e201fdf5c685f0c987fe67c17b553fc17887042a6e1cf03d2a30d1f18d8b03fd0803bce1000f091ec7bb90c11b1e302e850c9ede8f4281cbdd06787c9c71ded4383d21d4f1375c900a2474178c5039d4f0b9053733c256f574ecc089c7cc9c078a7b636f769465242ac4990a4fc40bc6d386f9403c102f87b57deb187e57c4da8bf93804f43b1bbdef00ab7cd5ded175cb3fe75f28c407539f3ea26084faae0e541cb5a8aa02425b0381974848dcefcfeb79c359a7dc26c46129475dfff86cd7901e1d1efa87d7ff288e9d791d68f88624577bd44f42b41407d9ae4dbee767a7e5bb75e6a053d7efde2d71eb5b7b6ca1fca0aeaca6f9e276f20c59587fc94e8997b5c8aaaa7d57d6432dabee3e09efa1e8837592e4a6ffa5c9991d24614ff973da693d6e90f5a6d49d3d24c108cd0a1dd0fd18e1badb96346b26dc837e934be2093fc457e86ddff8f2f9f3cf271272fd3cf0ef6713fc22369fb82f62edc89c9a6bddfe57aedcfde75a60d0a3e0e480eb36fa37d6fe2bb43f869a393d245ff691048245526955f008038ae25369a1ce136d2572884aeb7f78a75c1e31eb2a8abb7c2c3986c31fed71e3c152226932b6594a8fdf8b384e99eb10939318485564d6ad6700bc028097586228a648f4bd53153189218ef3b6015e1ef4370cf0748981ab8a8a81e3251b922107974962e0c6ba71ba7343032a98c4124309937cc6412eb1814c62301a17717e133b51c4d990745522cbc155ff565d9e2b81cc5cfdc15353c00d1575fb5c678c9c760dd84250e4c7c86997536b3eb9759dcba1766b75e2a7779f1c9b1fd54fcf76941bc38324109454b9c417b08eb96acfcb999603bfb31aeab7cf763643a4d5cbfe7c3cfa95822786c5bcabf2cae1a0a9bd978d470d1b0ff9f980b4210f1cbb5588ae6f1cffd4888972efe6583bd2ddf4f716c79faf5f2e39027e41e371b035d55569a74453eb7b9c2b44da9f9a5c79bae49c9bbcdaecd9014325a158d874f039f2fbf4922639bf97e743bad5ec23377b70cacd6977f5970764cae294ea580e2a61e576f89dac57593531afbbeca0fdd6487c730d1225d700706711d3fc99ce1fc0b7eaa7f287d7cbf539ab7462d927304f2441a3e481f386f3f8a2aa2977d910556304bacf886e2cfb8a80ac5515a9b26c6823e118ad7f4f4a9a7cfdfb90e4f1ab36956f7693b22d1935f3f5996f4bd1f395439b96c8e70eac3e78ecc99273b4aaad9bd36f10f1c6db8c58cd554559b0a047e241a35445356d2b4ffee91d49b0eef961b8237fb9fa9905674e96846ae9a1b3cf99f88c105f1ff261fa98a385587ef5dcb61f4a4e6c7d9f65d33e7b45e2e594b7582c0f12eb71eb8f3b66bab103cd0f73addfd62da1264d8f168d5715f5635e6726a35ab2aaa27e70702569434ad6eb2c89247036c053fd26db4623bdcef801d2581b9281318814d6f58f1190fc0f9e9e324541226f95aba08ebb80ca2d3590dd170908dd0f2209488b6b5b2d88119009273eea1210d9ffb580871a8f121adfdcd8e7dca9c15b27b96c3c54bfbc75acdac1c93213f65b62a39e07d56ded9b95176dfe5a8ec32def5d3fb9addebf6a50752001a9fe03b45f16e2b49b2edddcbd9b10c71c715ac10b27b97687d0e466634522860bda7870e2fae5b601a3513fe178908a9933145c65c4192b4184541b0f09cf82b60e2f797c8be039d5c6649444b8a11dc40099e6af08090bacf702d82780eff6d19bbe58f06f21be7974da9a3990fc13558eb47e519204d51519d1210094bc1021a928b9f3ae1501c50a7a60ef0a2720ae4ef2d049dd9e7275c63f5db8f20efc1ed36ea742923bf4c76f0a2a84a6bf57350678b911c35d671ebff348d9f17e951754e43bf2bbb79a171cebe6e2416fa87ca6032e56edead6950f9648d2f16dc7699151db25617a7556edea6bd59338704889c9eb060f0cf073a7f4de70c5aa582c712c6a999b76b810fd870fbe2cdb8e39059c71c92512d7754d4b0e7727cabcb01596c51243b778d97dd5f79c2385b134e68612646445783d019e03dfea07bf6de294e8a056ef1d076f1eccbcce689c698326c6db070fae041e6c2d318c0b872734bcb98e7f1ce4fef2e08944e3529b555dbe658b104f9c73cd7537dca0bea850245b94dfa9d73b77aada559db80575fe683371ef0769f7c591954d9a0871eeeaebe76dbbc51d4fc4970869be1a2772ab1e0c6d07f054e36d1be6c764cbc8268239527b9f693db0f9af1f5a5f512d39f182b4bfbf7b8364782227d42eae8683a51c547ad5703570e5c7429cb0f89c8f0f9784e5a453cfbbe5c543e45ebe32a557ab0566f871f8e743db56fd84b6373ed9da78240f8faf2b9b8d8f93e478e07a56f0f269dd2687af7ffef2017ed03e407c75f81c5ff44e34ec8b65cbe7defc9a3c07c76e7e62cb44309ed37a0695eceebe7a7b273c873772220345f7e08057229edb2491f8cabe0a243415478e53f59005af5d23c49513f2ffe348c4ce7deffa9bdca4636e419b08a681c68ee1c6ad3c19ea7e42ac3a6dfe81ab25c57cf7ac870ef9e30f427cfec6e897cf6f2107e5a25d59731e1714a9593ba0eae61fa588376dcaab6fe47e28c4dbd38657dd3243118e458a57f50df46e10e5778197ce4ed0fd9695410d46d532d025ee3847be376b774169a9109f38af5df05e6f215efbf4eed6d7ac16e2a32f5e5efa876512e7c9bbc4f76e364e87451a0fa7486f88a43646d44380178b78775804ab17990d014b0111f53c72d910f14e11f78608e74644bc033c91a3c17344e27ef823bcb57ec4e1a7f7c3d123ea699ccf326f07536930c0ea52a84d11de384e98dbcdf6451c67b1dfb179308cc720ca80108def676044337c1eba2a34a78964d0aedcf9e07b0fc9a32863fdb119ed8ba1bf92816af141eb9753ff21c415afdf7ffc1db74bc23162e08bef6e9407d721d63897703436a23ec1ddfce184e3c13354f0f1308f0fc2cf6ad4789823f693c397cf5fe0bef2e1dbe0fc61060513fedfcf99de767eabd8933e8697ae62fe82d5c800e34e08439bd94278db5ff6b50d04240c324a4ae1ab775df83237adb1b52254f1fb3942342f6eb5e41ad9d1eeaf9c74847bd02f7965e69aa510928f5e1314405402801d55e100442501da192ddd5e2e37c0e267bf3ce5d34f2567b8f188b93f49ce70e6f071bd5e949cd5c6c7563fbf0d44710c84aafb93aab97b62f52950a397097a9f804848ba6008acaa7d06da40506ad17be57e49649ede3c7ed77342140f9879c8a7a70971d4fc7ef77791fd485fdde4c14e19223ea02e7176559f3714798f65c0a814c4fe722f1b54998c06afaec6deffc16d0f39ca46634d35a8b84a1a0e7cf4b929e6800e7f2aa89cb88a2bc08dd9a74acb010e8fe0311517a892226fd43d5d2e198559df4da89ad24e3dc9afb2a5f8865ba18d596613a9b09ab6badf5561753de784ee3115164a66e4dd47b622e51cd1ce375f05d04f9df3cc609c32f7ba9b0af04c2a2eb32d4a839f7a69fa55ade4baedf2d5710f9df3b614588f3ee37727ee12a24ffd590f5fdf4d4ad607b43cb6f7fb225ea7aff035ab3c1d6861bb00dab91afe45c6f5dbf07894c029e0ad2b1bc627a3a1f1f0e1ebc1c7534587b7a7f88e067826155792f87a92148e23ec0b5071452aeb6eda7da21013fb3cfff8dbaed7dbf3d1f76bd1eb0acf27e63587b6adea43551d81f88f48dc7a8ed59cc57284a1ec2b09c4863aacb75d82122d89c63616716896283fe069219a8d689935ea65212edff6c0752f7610e2d017ba0d6a0692890570b063f578510d1ed4a05270377ef48afa47aaa4c8fde9f3af4d9eb043882dd53f0cdaa2941ba26234d428e24d85badc507f08f549ac0df5eed7f59abeff9b1f5eed84ead777c909ffe0f6a77b3ff0a094489e297fed9b961e2722fcd9559d589b272fb4d5f30992eec5da71f06c8017067885002f0cf0d4ef1d8207fc46d48e7f2fa53a19674cfa662b780cefa0acc6e328058c03ef054e0e9ef75f99abe18dfda07118c752ca18c6257247dd0d55a09a3116c0c8554d265172155ea6943ad0366547c6f9f22545649223bf67e6988653c644fda931d838eaf88a2a7152ca979260fcd4a2b97bf3a0d526747af327e3e08775f8c29ce43321fe22e8c6cb64c70339faa0ecd6415761f36cd9fe248689f135ed37c7908cd4846fc0cda5512f755196363e006fc7d39b6efbee12d93ebafeaa7ac6d804d5285113033e5c6f071bcfb1ec2b09c456154a2014e1290956af57b35a5f32517e3729f47aef03848f330a7d9472bc1b917e44e7ccf1bde5371b6a965f39ed13b9be57edfe368a0405e0214f8057a9d45f0b35da2ac0bb00757a753da086c8d75a3016d600e789c6c26ac8c24a9208506cf2af46ef068c13000eb60e03ae90b2c34d6c75433c7c6a2755ad7139dd8d7d563d34fd612979f5ef37e4fcb9b24fbfb31e6bde3381c4c0bca11a8878571c2f1ae76c901838c7c5bca17c5e25dcf6e0c1ab80e7f43810b3f112df9301f0543f1a29319838679ff13d07e240a612e7efc05fe41463cf573f5ef9c5c6638498b3794acde72c25874f125d0f6d304252e015d4ae91514a20bd5c09a4cbd9277ca8241070b3e511e4a375af38cb176f14e02cc125b279e86d66bda0c6c710001a646ca6f9c73649b8ba445910606c3644bcc771f4008f38fac4f8068d47d03af02460abc1f14089b724d0f6a2e34bfb03e0737cfd124e627c4bd87898e62f3bb144b9e2866fb74f3a4888e5efcffb76354f2dc334296444875433a84921891a090ab03cfce64d73d9470484dc77c3d0c6009f755244be3c6bfd25cfc8cf2eb32e74233b4d399042a194f69daf13a2eb9613be3efb47c919fdabc5b5df5e2009caf815d377802d02fdf2a31950a384c2ae26c52b35d1eba0162e5ca96103ee0bbc398c7d8f6e8d2c42b9ee5968636e197c1fdead0d1213710a474aa9e4d31d6fb984e9d0a15d8fdafa2f210e7ce4e0d7cfba5ec4e78672605c0c0b8f368a5a685c555442eebb78f087019e5ae849aa8a28702a9fbc78e669f032d8c19fac1bb35f05930df01c80871bc606786a5ce80064de6c53c9edd10678093764e5985dc3d7ff20c4dce73e7abe285f0d08b9abc2bc9317cb36f8bcb5aa2371f387a5c531adb6b84e215d17f5d97df7e5c21dcf5cadfffc42a952f0c2ca40c2ccbccb3c6f9b0cd54f168887f032d90555662706058f474cfb097506e001f3448c40513cbe0d44bc27864f81a348a882025603c6837b4599dcd983c6a38445782321c88036a98c1a89af0dbf1f9de4ba2d32306ed98c5065d339b92efa85101fad1cf5e62b5709b17beef67fed06679e1af41e44c2810c32a8b28890c07986aa2bbae80b0849f2570aef2b0262e9757ca468afda33465c2c452f6b86f5975eeed2f74da0eef5639d16fae3c172800e7ea7e3c84193a56432f6987776ed9214f898b97f2b768d7e9f895118f18efef9382014a888feceb7431b6feac203033950a0d048209080d0cd5e90248e72c8408ea40824e5237f6a885846c907ef808eb01bbf5c896a45c6dca295f2b93e9d063c30d09163f46eca336d8e12892486d871c775a10d2c6c95d2c39c1b4a3def71a0ea3d9c132b21c9a788c1b3019e76f007725e96211300da623c5dbb0df054bf4d9cb945fdc0f88af60d8dcb8e6ea55d162e1462c1a8cfc5dc52d5614afe87840475c567c1e760e3c21bf68880480c5b0c3cf0ab5429a97439fcf8f6b15426b61c319180131d0d190bda91575c41accd75e1e61b367578f3005e18bcf6826c443c62da1ff18eed5c68dbd04b1d9e39e2bd40c3d78bafc855fd4c52420d1a0fef8e70be0e6c809f9b683c8c11e445942f438797ac44cdf11d4d84a933400def09be3edb11c47155dc5dd66ce569427c3ee5ad411f82b71cad5b94a08111260d0aba65e3f9067504d631119046abb0f6b51756186a5b55ee104697467fe72e85e8708c1c661703a1ce2f076f9803c1ea44f117d76ba4cdaa430e7a401ec4397ffa7bfb918b85386475d75e6d2e86ee3ca4bf1e25109400e860b848d55520caa14e1cdb6834a71c3f6884fa94d56844afd56b5489d5a228f9771d8e6694bf4df472fdb2ab6fab983c6b56bc4e95bc316c6d5cc2ccc660ba000bd3cc07a46bf7ebb27db61284a7dd2f62d43507a453275d3ed90a0c69c54d1760719df070ea87cdc6c5d1e1a9e777b62f7d68438ff89ec6e980d1eb0445f941f13d10dec6c2dafdee2a826543bfb2b4fe23fe7863a27f7c13dba28cb60c80770cc04bd646e4e8f03cdb00c337783d986c6709e1474d17956519f0f5db067478a6eb068cb61e80671bc6c3c33ffab3e0ebed8f84fb2d597ce3c6db01fc63f0d6a62d7eb6507d425e56116048f19ce3353d870c2cb381708211ec7d85653fb9f152564c2726265d1de3016c66546513c8af8ae546d5f4639be566c95fa414a6a6377b4241483b5bd598fb069540a4ca8283a3f628a841e423d10e233991400021c06c95946c0f251a3e610fe8cfa34aab96a5bb265d24720892a0943f525638fb766d5c007bfdc0a4833f7861dbb1cfd13dd1605c361efc85fce0f719f1193cc3c1cf1803e1dd07720c3c67c37bf1a077e2e105deb36293317310eb874650715cb6166f68bee16dc03c6aa8c350c3914fe6704e7050e48fc7d74fb0551b8dfccc88ed1df4cc481e4448f98d9d821b69099e0e9f5f49ccf1e54661ef601bde20bed1c4f07df3c40fceb03e1e41f7d724bd7e931d0f8f9014360e5fbe1f38fe81fbad30197ca3c01846064406574909d7f96cccbbb3e09c8b80ad1755ab980414cf1f1f21c15c576cfd1221b1a1764492655fabb080705072b33f0a9179e9e9cb2e961243e8f194a1bd5a8a7811db89fd0645ec7e24f229674b6654adfbbcbafd5229397cf5ce84f1e3c72bf898251507060f74cc361981ab4beb20608602c230491e1a495105863ac223f59a6c2dc8a1420428ea0e6942a04d4be95a68db50e7aaca750a68ff7da7c56e60e2c11b3a76cfeb171b1701e352a08d8b29402a83b9fb9580111d5551c62494f07ca01137c9fb243c5d33aacc04c02b80be2b3cf349459003fd28827e08c0bb2021defeb4f5086f18c0cb4b3c2e566ccb3aa78e99f366aa10bbc66c5dbb1b22d16b408a20d11f25d1f7554dc914d1af1e55586b85687e6dab9b5d1b48977f1d7f674c856572cfcc82c0bf5250010645201790f13917e0d9aa5f002f53a9eaac7949ba419bdd4975f85c05e3d9063a37882fcb2e8b2a4a2f4b32da06d87a2b602a234fa55a04fdd2f1f5dc5cf3607c747864d44f723c7c467db2e1a8b6d10941cf864bf8fa03406d03be5632f8e2fedd7cfaba99d31f1262ceb153de980daa739f711c6bd4702c85ef8151e6ce3ea44a87739308c75a9164d9d76ebc50280ec4fdbc507ceebae5468d2276142510bc7a3621e5aeb4cb5f5b0321f878a73546b0f3ec9ba4da824339ba48d5a4e2eaafd7148063727f43112f47ef2fff1e27884447245c4ca27125a19297163df5c381c03917261a97645545b00cc62679039dff0e7907dea3493e283144fd2a3487c1d32506136767921844e3541a096e244cc8d955debb7b841b67f4e345cb9d1d10df518f841d6be4d0701e619d906492150f512fc6f51c656ec6d186dd338d9c2ee7948b991bb449b517ec4ecae13bd0ce6a14be519f0a15f177a09d95103e735715413781728924f9f59b783c7c123093d01a8b2f977092c557f8f085f18fc676d2b70f7d72e23450a993648192076388a9e64e3c78ae0d8f7f63dcfa86759f7cd9df91e8f92eb58b2e720fd4a829421323b133e9ea59f5398b742defbde3e09f40254577599f0b35de690da9515250d21aa7d7bed425583342c007d8a8fae03527282c429426da2520172ebaa5ec5cf7dd910bd60f4d342ebe71c8d2c74fbfe3dd1799edbf633c8bc1d3e7c31f819bc9e099f00b27c4cf1cf91b4e8c9fef3955fb2295c1629163e807e0b1be68f9c58ea3c69b083a4a9c98c281ab24f1c229e4d490c084a196906b2ea84c71bf378e0bb6bd3be5c31afee6fe373c3fc1f39595103e9f87ac86e1fbf0cd6a1cbe41f823bca4c7c3bc1ff66c3c4cf0ccf39914be4111e441e381eb7ee1cdd327bfb44c88efbf2e9ab61abc4b6b98ea9d246696fb0a55f474f32012129e34d16675d2657f131059a2cbea2f8805dc393aa729b871ce33b2ab360f3c3a2c7a76ea230a26e5d24a5575ca0055d3d59478c10c3a3c16072019065ce1e06ffcc0eabf23420470894021018b272c9dc45a37d797715cfc014dc3d53b98aefc18c691fb395a5bc1d34dc451936efc18e6f41066b60d8749263e9d2eebc73144c6b3583fc21ade6663a8de8f418600c22c455abfeb515831076c6534de983a871b19f17b4e4060c3c5df35bdb3bc343346801e12ff709d217cf36653ff6d684735fcb9edcfacd3d7e77131049e9a6c45c1c6db84fb2fca25493b495b94095ff3fad2e16519f0e53699e16cbdf9ef086fd478c449128e86af49b2e6e3e19f3f24a476427c93b5f501be9fbcfaba331dce319238507381b656544d611b6cb8c408e17d1f1ac6c22f493ba291655f1110c7fc55b42a5ab77b72fc428bb283868c51902b891d3ca0e24ae99352d9748e8210429515a685c78baa30fe040909deb4610332e1807ed801df275b108e03356c299cc8fa7842522a3a366d1a6b6a1bdceffdc48cac5c45402a0ef5bc77501b1676d4b751f48dcd5526fe833f0af08603bc30c04b7cf01753ee2ffd20e2c64b5f843033dee2861c87c65c1ddeee8edb9f5b364a885537ce9fb969930248aa4bdc58cc8b8502510d91bbb46e602462df1d503f77f71d22fe0009c3b8e8eb39300239ca0f7a369e001f72a7892423a68d077d6162959979dd717cd97c717c03545c81aa5aee1516a4e26a64047934ec234c3afcc68f8703edac84f89abc2619bebb7b6c3f78d915724d7e5977335d7486b60c76f119d52871a06603afaa652a793a7f6ca8392149baa4ece90f1b2e74e564b65ebbc6f4a33a9dbcb4c7e3525a589d3ac4cddf2f20ecd0e2c62ecfaf9f5d15ab9e8ffc3552b863be102b3ef87ae32c50651185c6fb1d1885ae05ef1b8cdbc0ab4cc938be063ae0ec61c74d65adaad0b980dc9a95592d2621f5fdf8bc875b7f22c4213bba0cb957e55eca73cd701633629b8c96be34e03960b4f522bd99511c9e4f36e23d13ee519907f79e987270251bf19e09c6c5798d355e1afcf3b32097582904d6c1b8ac1efc7dcf897f95ebe41ff32a56a0771daa00c0784e990720130119d3c11859f78eaa493201824359a6d7c9ee743d7df2607784fa586d3adcd3c07af6ae3e56fd2d51712371f3383a61ff0d7152749f0a18ad13dcb0a9569dd159c2179867011e0a7e70c4b4d520be682c6611e409e280549ba52bf7dd6343c66780b79711e45e3b30275972e361c16e0fbe262121bed18b230b2bef12e2c3ba178f72efa4dfb162d3bced10c85a839932c0385e7505b4d1688e1933307e0d8ce518404d57d776024c6ca197b5a291655f111038288970a064200fcace438eefd1fa2221d2bb37abf9c3dffd1b830e9a7c4ae9a17be9c042083d9532c935962fa99d593ab59ffa0239482420387058534a0a14ed56a99a544c9ab02d3c4e736dd25d6fb8005c22b050bb12d2299f5fdcefd85b846832b4c5c0bcf31b1897d1466f1d5c88b1b748c2910bed79f1ef4a7a6197b088e47970e1559037d4681a35fd60f2a7e2600431e00e79cf6b09068f6df879ba5757a46fe45c57d29d78e9b377bc243754f5c6ca6995b0e16a1981c08d878484bc5bb6c3f390f61ddd26f9fd36eefaeeb1fed4bb4f97eb29342c745a4f77a4bcf4df19b167319dbbb79e470334d5ffe4d37fc7e049c2d11eda70877ec30c460311deb9eabd041fdadccba8e1886923be2574db4f1ec00f27c437e8022c824f8c8f82976c04b9613ce292992a784111e441e3c103404b1a87efa2d367747b79b910df144cfbf762c8d987779863ba7dbccf03e3d7f08228b4819084020c129e733c43c75eabe8f71b0141159294400ed8d836afa25c8883761d7aea5fb6c69eb2dd5427164fade045c4ea17f0c084847aa40c3cf04229ea5db5fda019338428fb7cf3524caf5e8ba94430e508729c18d701a947ea4e5035456222655e0b75186aa771fd37155f8a171c9f3784387ee23983cf1a2025b3c969a75fd025f62d1e98ea692e3114b11b03b9bb6e0e480c53496270e02f2e6c07e0a9dff31b036961c3c6c88103612acb32cb73701922dee3e0a9f7e480c43015e6976fc41276d079d94a75bc9153a4d41e8af15877d992c5932e1562c16d9fbfffdd0ef502cab67ba55e1321c100529448c02db20e52dfa06a8b245528ee9dfe479dd9efd9ae727da76c4ebb23fbcc04e3eccf8eacdae608f20ce87faccdddb825398afd5e0c84f1f3180c5b835f409cb30ecf8bf0566d2f82bc04da61c05f27fcc9e2eb3120d9807f18e01725856fb62f823c4383e7112a7d7d992454c12ea82aa10baa609e70bd353227191f0f8b13429e832b31bea5e11f87bae7d8077ff9f7f4f160abc5f55ad941d5d570052d12106ab3c067241c18af863901298d3b128e0ca81db187653f1bd15d0e7ffec269f76fdd26a9e2c591655f7f1dfb340c7fb9eed38e7d1ea05befbaf1844bfa834a81c79d58d3f5766809d4ef410dcf939b31d44438c27bd2cb0485c121028bef7384481b94bee1cc0e0d1ae7c2f0acae733605788d6336246f9c193cb49d446df81c6d1b4e627849bb2726345a12dee358f661a1eb861b1df15e0c92c7a8baa9ee7d318591b71f9806e9f82909226c28f44ae13a65d41d932d84b97b93111d4614379e4b58ca3a6ceef4f129c26ccb209b1ec39fad676f1e13dbfe087e0ef08d30bec66cb3cc481e940d37c17c35b8ff8cf84669feb212c14f1a5fbfad445f5ffe7da2e36bda27c375a7019fd38879fd363c1ed1002339b31d96656d39f3fb4b84f86f97c7ae1f05aa27be3ec9dbea13bdcd039fc9db0a6d1fe814a28d54dcfab5c55e967d2d81600d3c6bbc2aabdb8d271edfb6af44e180f4c2ec6ce10f6cc36cb2fce62fa64b6dfa5ccb6333e494fcd06a49e9d46239a89f55ae40dd208a6e38b0357de073e6474d5e3638b0195017409d0bb593f410e805e090ca231f6a49d8ba0ce993e7ba21670ce9ddf7b977e533b345bb666e3a787f6e28f576ce819902bc7c3a66e08882ef90470e0990060e330738b8a94c22f4020805c02b0078c8e13a002f1be03900af1fc083d131a9d0b8caccc0d965aaf69a59dfcd1f3b4788ef1efce22d37e7955b304710e604229515ba3fb2eccb6803411d72046e2624093517fbaaaa90942c4b9e5ff8f87629011f7ddc690b2f973db3beb1cadbdc1e879f0db63e5f7664d8c619600bf15424163ca7da0520bfc2bc490944a9140772152271dc20491247afaf03bc2a958fa7ff8e70862f9754c9f696789de52699838b2495007cfd39b8747c4d7790737c4ba85d00ed8c84f0837292f1f1b04833a0e019727055cc2d5bbe42128c31998fce78f2cfb10be9dead5059dcbc24ae205954808abe1ace354ab904eb95182134a2a35b3ad451d4b020abb6166a47ec65d9c7048422ad5132c0a48af2e06cdbace3dcedad843860c94157fcc90d04f4eb3eed584dc9e9885eaa361c98d677a122f74ef4832e3c2cd78df45ef3c682d71740a01837aa9331e946a89c40844e00001c4c494441548f563511103ec0af431d2729c44a41d008e8cf63fa79b27960fd8610e7e5dd34e5afcfc8a9989f3a6ba01bc9cc23598dc66538e84daa01cf58cb23bdd5f7a6acaa5e1658077eaf36ca545fe4b80df032009e03f0f483df3b386cf87d1ec0d3dbc9a6e93644bcd75d573d73abdc80635e7bf4a0e72546f56323c5b4119173830d59c5084715e89089a383e474987433f2aeaa697d20a3a18e742d5968f793fa0d3d52129a50e79473faf513222ec2fb3ce8474b357e487e0c4e249e0a86cf9b1a9781e24ef89d9a67ae82290960300cb6810446774bc737c96cb8088fd2aa9b549e0c7e10befc8ef012dd0943f0bbf80322c805e2c79d46b88a36d9f1c880effd8c500c5ec5e96597af3c5c88f71f7dbaf8898142ec7ca1f48b5d23142052ad628e3e24202a6da6a8445b0710125ad7a8ba02491a8de5513cd710d302a81df133957da4c2f2b98539f0392a3fa46835fbe5f7aadc2b69eb2745be5fe2c66570916f38a6232711d08e871265ee726daf3cac26679110bd1fcfbebef72dea498c4477534dc4ea54a8e1e0c038120c34a4c875507d910405dd2042801fd8896bfa1d7b3e0484c855ad5dbae9ce4fdd9bdf52e7a7df606789b8c86cd93311a7da493e3256570d7891de8e0e8fa98a7c11ea0655d170701b0dcac1956c72442f729cc163eec64946bcffd86e45e9e7cfc943ffb29a7198b4323ed23f56b37b3f303b29cf0c40eebd90a286447f4d7927fc81a312a3dd39db8f8e397570f7cce110f7e2b079f4bb4367b17189c6f797543c6341c56b52c1f0e4a449469037a092dc337c93cdc165c697c38736c00b7267770c714b368f0351e3da08156dc2f1f0abcad4f75b0b7e3c7ae65942bcf5a2ddfb61596f5bfad3573bc0664b2a299028785257aaabf5e729fe23ee8efed83b794034f608199f9fadec2309048bcf688c072a06f649dadef44f2dfff985e4d8da2c3fe4d63c5b7e38445c997a968873df0511d0a6fb007201a6a380c0e79d24cdef2244bb778f18786e0f210e3feae84d4d25e7b86ae3b7abbebd50bd0f250fb1595538e05658c79328354a1e79f09cc5fa63196ae061425d549df206d4b25f7f98611f7987241ccd1e6bf9d23b6fc7f0bfc6bd09ce1a692982d98e386d8585973e3bd6ef38ce477d6e037d2ba1cf15073412daed54d8a4275930d54891d07b65c3b89690224f00bcf3005e4b801706780efc3a03e0091d3fa62210d00f0f3fa1e3c7eea7b0e17e8d0ce20033a09731bc4b5bacbf64865c4fe3a63e71fd9beb152c727384ab91dd24746ea9ac84fa23a8f17bf072418e8e6c2290d9a01eee5b201516f6240c354820d65a2901bfb7e02337434297bb8f1fed322e299bd2569d7a6aacbf5ba0bf27417fd702ac0ce8979a37baaa18dafe7156e3d142cc85b68297cbe0d9d02e61f06d9d538ee3c4117e18debe36beb77b8a6f9c4a2a0cbfcb80df69f01bc037231e5f092f17da1abc24f05d0bcf69f88acea442cdd84bf8561c54b1eb93ad35df3d23c4c42b9ffb6fbe3c0767df38615aa11c89bac2da372a4f56cfa031bcf272a8c1468b2a2bba39b55c7f9eaed406c983ae1960f11e941b1025e7b0f899cbbe22206b55c50f54aae1407603fd36ce5bf5df8a17e4869b7fc2ea56f32547fe4adaf893dc3cf799a02ac19bd73c115e9125aecaf1bc7e6cb76afa5c8bd37af796cd6f7b8fe8305872a8ad97dd33e75a79386cae7eb60e0e882824d32333b30df88d66fdb0597f4aa0ee9cb89f2120182e0169b1bb75852be90c3af39ec71e7958f6efb5d4290fb8aa3557b4ce8bc33b0b44e1525da71ae83668f2563224eff379bf08dffd0628723b002f1be029afae71e0d5956df09b174c0565ba002b0bf01d872a02a6d20a5069543d5df1c98f438578efdc27434f1f283793a89a500984826c19c8d1018120f747cc828c6ebb702f0ca9acd05f1e37e44dd0339bd5c81001d10ca1a429d77575a4fc964552223eb453f727af7209d349e2fa1603ddfe820d299bcd9bffceed0c18970218171c67d5f6bcceb40baa8c49128bc88b4d87ef8f7f2881b682674892484917b97b31c3d7536922c3e24b9298781d9bf035dc116ec2374e15aa8f8747a8d4fa32a8b812b8cd17c17309c763d103d35b3db750128ebf8fb8ebdd1be4e1ffef1dcb773daf3acc250db2c5c14da74450eed63f47c607555c787f0dd970212720b9e9a2a4910bf55a56ff6c655f4b203a6feb3b8051a5e346924746d7dcba4812920e83babe78b514c9acefad1db1886cd3c499379e5ab0a0534fbfa859e55172223b457a2de9fa8dfc608bf871999c98adbbd76f2d03ca4d8403f1c40e00a123c20747381188e9ac4649a3ab10170eb975ed09238438ee8133ad31f2fda1d294f3738a85d9f6309a38fc5ed08f30f4836f1085add948e7403b57c1838ba54c07465080176ef42230daf6f319156d784a1dfc4cf7eedb881ebcc457bc06300675ebaa1fdfb64d888faa47e53f9a2e259089eb5fd90ef7bbd4cc5775d58150a32482840475c84860f09e179438d046862a0030c247bf861a3839ea890d6dc650b846f5b2755b46b917f6742aea1d71df9b3eaae91167a7094f7a4932dbb037cef0b6305d58a534e33970419527b1e23c16a8e78c362907e021e140f8b6d6363318050de34bed5c6823fc0c866f4663f025781ec391db20bed90c5f6e7c2f315c5065769bd7e0572d2e9fb74eaefcef7a177ef0a29ce79967bd37eaabff516fc0839e6e38854040b46de07ae4711d14df012a2b6474284d3bbbb08e240e18005dd92f7efec0682afb9880709b001192d150838ac7dd78dbab373eeb0ef89107677eb6fb39b9e1ea9b7d73b69bf77e2d898ab15fc771140d6e3c1ed8967a54faca0cf99e0ed33a77bae023f99e493dffe3265dacaeaed8b25a1e183b976c5982ba47c28fa74219cdda923368726bf359a9c70a3170c4b067c352d239befaec7f3c2027b669a4e588a7fe251fbada6ad9f1558d3382b1600b3a0b16b05f62009c92f456f2e00d03787989c7854b0cb8710c0158283194ea91b7be48617ffc0a124001f0543f82af7885a29eafdf56d7ad5c4a8c859fbefdcc637f1262f5b8ef66fd78bd7a0275c1d540389063ab423f79241ce82f8f5e56e8fe88de2bb821d1f88812ea5ca81dbd26f76f201cb46e60bdbb12e8c6b12b2f5c7a8f94b05f3ea1c9204990ac2facb456178b78d5870db0800c41db81b6c7308d86e7543b0bbc14e7f99c0f54db8bc3d0e1d33e22950bc0c7f887c632180d1b9b050ff84c94665fc39718435cb70c3e6314397cbf338603fdd4e163c4bbe72596110fdfe42556dea6ecc3e27652d2387c7ac757e53a99d2fe8587dceb017ebc6bd93f7f04152a19b7c1890319962a8c244723394a1ca05245c281120a8783aaaa08dc881a05c9c3678b43e71f5bece362edeb17c06be03d3c4e03931ea681313b1db2e8ba92c785b7dc367f4c441efcebd3c79c716302a0e835918f1c056e3cb0b4302f1df937f6bdc854df5b4ba03ddd4a738d5091acda794bffe306dfd43ef68d94546a5b57d72e7545c86662612cf9e3fbd1735ddd64ea75e9d9ad1748c2715fb3b4e3a4089a529ef6f7134e907d3a36f4524f0bdea4b0092bfc8833d217348f1c1fa9ae26153d415564764b74183c1b5af9f09c7aef48c0a3a7cfcdd186e7f2015b354e4101592381e3ed0957a8261f399db81f23ad6206cf4e342e91136bcfd875bbe4ecc6bd3ffe09294b2dba67fa8c15e025558b374c822451b156d5e570e0574c55352728da8d9022ce888e81573ced35b27636d4d84324206ae42969273a6de0f5022ea332a0e2baa7064bd6a0d5d5ed36bf005e355a31a878e2ae12566d1ce791c0680cb362b7e1906dc3e78d67501999e68d477c0b7695b23f50af61f8843f5b7741f8227c5b87e7c13748508dc5d7a25974e06f0c5eeddc9aa1dbde938ced811b577dfd8410cba7cd9d3b5dceefe2dfcf18ba0a24803a8c2fc2b000583f64ec46a70dbc89146d17d3f43649c4681c47af2a804757d0a2b11c53eaa0713cce89c3ebd9fe28fb8980708e8d3878880b41ef28370bad5b9acc16e2a4d0f965279e28c4116d7a9e3b65977039aeacd08c04b0935dc818998d777af7b496a8e78c0bcd0678c87939f07bd5ce5407a0dcbe08af51073f7172f970f0636ea825a45977183c1be025de807c1cd086b4c41adfe0b8e081e1c1b313e29d0907fd126b493cbcb87ee804d10e509564423f96f8c625d6ae3bba7a52694f213e7fe2cd371fffa79438ae5f70c5fa6eea41221c58a3bba38af116e519d0863ba3c9f8788ffe3b525d419c10110ee6b54204841592aca107c418a1f7df59aa4e4f97df6d4fbdacc59d52527df0cf47bcbe5b12971f9b34397b5642b0e1186c0341250913d7df12603c928fc8ce0f800f8c888f21083ae8f708de1ee08bed86096192f856f7ad18b16eb41065af95e62d1c24c4da9edf977cf59510dfffcda95bbe5ccefdb0fa1f78ba7fbad707af65c0005538e0719dd1454e6cbda2ea94240cf41ac414242ce0b50e08d1af877060d95f04c486d7e5eb3512129f24d244d5cde4c171f6eb43bfbaf926210e98dcf6837b6b1b78879f6381cf6921ab8d96091c1bdb781e8e3e0edf8196612383e4b3c4d20e7e12817df0020e7edf01dcf00649000fbe050e3f0c07bf6ddc70221eef2424869e498d8b0f1e7bef4838107ad281107bbe7c6259ee7229ea7fb2e3b5839f1d21c4c693579f5a5aaa20d2d5c0b82181d3ab0209a37c34d4cde1f37bf4e790f3abe191bbe8b6cb7204910ed916890b7cce2511cc029d02eb192591a6d708d17e52e72eedfa0b714ad5a54fbd7fac7c664cea573dc618e0c7dec118172eb10e03c685136ce3fa0b98b7b0228b494b9241490d6d80e749503640cd07787663f0956d0bda084fdb17d173c4e31139af911935f76dbb45ae99ba9adc2d72c757e6eccafba1ab9428c4c6c3dc388c1f1e5d72ff324920567fb160e5065085f20be47c17ce2121e1f7f9b01a1916f2ea83f54636b74ff59a22cf791a76765f8def7e22241c36d48ed8cf657f11102c0ebc16365c0809c9c3aa46498436dc89aa6ede498801cfe755e69508d1ca6e97769f7b80f4b7ee4bf9d2fc2adf42ce018e2d7fcf2406d9b2e1398535a492900b3e1fe0393a3c347a82ca2ce8e0cf018961fcbe95188c9ce71e4a0cc62ca8744018086026a962b2dd0db161c1aac953ee1062eafd2f968cdd2237d55335a328391c120e4ce980c645201095a09aaa28811a545864f3c0da94b204bd590ae3474a78571507dc1f432a5a6c2363849208aceb26c818fd8f109dafeb73cae12b84e8bd38fb8a172f97cf1c9ebee1845d0dbcc42f61dab136635ccceb5967e37ceb399091311026801f7db07eb49b4266e7275b2f9e7f913ca85ffbe9ab457245576edcf5c3767990d71d53f38d6b634c7ba7c989ee78a4ce6b729b2b99a57d956e357954b64f4b3fc35561a7be9a36d3d540847e48f92e458e636453dd37eebc45fe5377b73bff7503aa8b5d9564ddbdb5396ebb6af0ee27dda499a57f5edf7fcb9f25c3f1fdea66db24618e4cab1b42778023c78e71122ca54784a5efaf67f7c3d0818e8403250396361d3f4755a9ef9e8ed3d8f3a7eb35bfbb9cd6a549e2b0a176c42f54f63701b1e1b5b8e48157456fac14d86828fa37295375b335aa766d23279f77f16dfde5001f36bffb09fffe56c23825b42866943415cfab44bd3570e3b1837fffa98a748981ebc23de3a281c3f71dfc98fd75b07a6fa0c460033cc3c1cf556806db4b902a11fa119952fbfd8e51422cc8f96ce9c85e427c73c9b4260b2f553fc4540cb54cc4279515c66fa0311209489eaa2b5bc2ef180748120712103c60d0680e88373a4b293c479208ae6bb489c4a9b2dc8237663695758b49ad171df0b41059b75df5dcc30fc9cf8e6bd9fad2850dbc0bc7196d5cc3603ddb64fb53d824cbb8980807ad8bc4b6c5e898e83dee3cfc74cbcaac09b709317bf3fbf77e2c39ef9a77ab5a2381a7ecd8a822c403d1a48a0992f84c05558dd0539a3f06bf9ea9244d0403e3c37c3754627f0c81a73c7715111aac9150601bc7e30b563fa8f7e397575599cafe2620581c783d974450878c9208184b9b422ea2780eeea892df3dd6ed2d218ee973ea8dcfb595bfc94e7bbc6bd706de693389616f5545392213e029c2316c2f554539f0fbf12431c0d3c9a98a3cce9071f8811243e283df67bc25788d3c90b00001ab4cdb55b2f26521a6f71b33f8b94142ac5b5b7cdf46b8cf05ef6f41af28ae2bae42c90309c7eff436facfe3e7fc821d9fc4f173e992e179eab1a32a7e23661a787fa5dfa66a97d38ed510b0e8aeeb339ddc19d77516a2f5651deebcc3f502cb12592989bc253361fdf9254cd3fad3b08c9b371b7e8d8c87056d058fade7dae6d54fbbf335ebbcf7224f0e940464d0ca8f36429c0c2718940980dfe5cd6e7e345d1d1dc859db7ad3a77a849a130eba629a110aba480c250f7ed531339a930481eeb568f4fe34f1f344a8b8c4838ccc170ccf30eb8f2d7e65e5972220581c55190989ba5849a44352bb74b8e33c9ddd7ddef42b210e38ba6daa1b887852eb0beaaeee2844abefdb3d79ed9112f6ef43a52d2ff0bfda7830db49aaa08ae1fb9e012a013341417836c0432fac868dfb6663a52e998c037883c17b2a799db80df06036e0bde3008fc181de2fb1bca9e5cfee9cb0e43f42ac7867ee9913270a316fc347b316b869f41df1003f68c8fb84491ca4b262de2adc8b8a9e0337dedaa374f868f44482810705cec0cfe62f0ff07c84049c455220a0311572b5e19dfd2499004171d773ac2dd779ef36d9d13edb85e8d4bff7c45b8f93cfa6349b7dd25d09df1d56ef6ea4d7958111e0eb7973b8e483896592d9bfe98d4563c7aa5fd2018ac6622018949b099358a24a0725402e8920216964c474b430f1f3bed433d846c28504050809d9c0b8ea88db401ed09fe384019faf636d7e11192794bcdfbe6cb98ef895965f9a808455e5db70701422e7950a3611748f4c3f1b6a20204d58ed66b76d1fca38b6dd22218ebd7ac0ca6b5e17a2e5e96dbebea052c2fe38e5cd56d76b38d80a074b3f3083365e26f3ea1a0c9ca07923db002ff1c18f5e35681c35d9364c07bf4f05e56b3b0c9e0df0d4f7a05a6bc0ed1302fe40e2428ef4b19a9ea512e3ad9ffc9839e32c218a2f9b79fd74f98bb5cdbfbf7f03dce4176157c6e2c153fba3aa310090a7a9f6a5b166c9e3f84155cb6e1c347a55617b5fa9046c55914a0bf6194a22b4aed1c88e5e88404888419aadd74de5e77dcf1ff8e619723c0f4b3d6ade2d9240a786d29b76a98e7bb78971e15e7f06e378dc7a89fdbeaa7877c6f24385f8f0af2fbcf7d0003987436b3f22f767640018c1e7354a8475ccbb881376ce69277dd5aac37e8f6d4e4870fe1921a9e777e1f7d7db51d6f6d559ec775c1565221836c3b7b1aad35fbcfcd204048bad2ada700ed4209c23c7461b0f75caff50751ab8ffa69fa36abef15cf7e096d7b4296bdd5d88eeb3fbbdd2e72a213a0ce8f2e4f9e7cb4df942cb97dcaca9a11742e9cd9b37a8ca11f1d8c5490ce3e1533cf88be27e9dc87dd70178d90c5e36c073e0536d63d3c1efb36518085631b47b1a545c49aaa0eaff50bfcee520abca77b75c2125c1d259eb87cf6d21c4bacb8bc38bda09b1b2fe9bc37f7073419d1c9d100952013077c71a20e4d518498e5e2aa60389130ae6868b1ca2cf5f9e7174fb4d97eca88aac6d7f56750ae43e42552d7921028344eb1925136cc7ad6bab87f559b3c992efb8b17fc7e3e43ee8d0a1736d7fd9df961fb69978861ce7d4caf45d47ac4e5e051ab7de62a742746474b4eb7cf0e584ff5e7aeb07426cbc7ed588cd2079d432af218a6b401b15c63540bb0a02e55045c9bd8be88a602d8d6123ca70f63bd6364a24cc1642073c12166e8b40c26070f32655145799fdaf2118bcfc5a08081647557cc385e046ae14f0d622ef16e4e0b0c68d0684c5c7d1dd0e6dc829e3ba0ba7b6489bdd649610873f7ff42387ad10a26ddee157674889a5e9a52d7b1efcbc7cd79d69fd9a3f21eb05a9bd5db76271ae382d66244d17b70b298358d789d6966ba65e635d163357cfc4ce58eabf6fa31fbbbc9e351d7d73a01c27ee73793df97b554055261ea68d1d3b4e306f98f8a3a545c14868f00d40c88354227f1400d1528a93e9640c8d7d6e5d690d72554c91eeb52fbbc6ceba3135356e246cedef6aeeadb85b888a93767e503641884da135976ce821c44fafaf1ce0065445cba2371087851bcaa0cb454242e9f499b7091110943ce0ae7a327aa34a04dba7eb9f73a324e215015b0aa620f1795519541efbbc38aab2c01d3934186a201cb89e7d9209aab8205e240dd63512942693a18608658ca3727f77c83fbb7ed05eaecf76e7747a24a3408803fe79d0968e574bd80fa51f71e005f25d57a655bb0c53a87d685e6c9fac1617c5d6e36a71ad0b6377687b97b5f2bfafaa26f4f902c697e21ed046850404558ba86a646ed3e8d6ca0908a98ad841baa72a459f0462806bb2b9f822ba79cd0810ad2b0e2fcaf037e0f3db2fbf360282c55115b78dc091e88b64a774ed2099e0c6a30d88f524f81c2384e1ea5b4af3ce3842dcd0a87a203ca08d040efc9de880301d509e1403c54efcdc2f566cbda9df151827f2b31bfac81889124090dba3e1c6359e769d7bbb90b19271aef5f83ecc5d05d996f906ffc5c61bf0b0b6400d0c11caa674632632486c5d23e1f0a970e1c2b42613a1fd28fb1d3cc709145d5b10d26be6f6e071dc502301a13bb7d1c681b6282424a8620406006d56e4ccc024443a786df6fea8d8b3e2c0efb3d8e700df47580ceeb151ae5ae370b9e483bfe34e00765258ff064bea2f8d80a184551505fffb7a68a36da41e099f03356c083ad06003920a05366064a0aae9c22048934c04086be00029d0110906236016a45ba65c48904c11d2047a0707271c581219437fc1421bc881f69dd0fe5055f519f0f965d0462323777fc47187f18d407a6a1e7055cbef35b8873d87aa29ee1f8fb60d788e0e80c5806f0eb47f2dde2b8eaae8a081839a0e1a94111f60cfc37a8b02475f0f1c7e3decdb08ac331cdfda93549d066d92d4611e8880601be0e3bab6eed4d18ef685f7fd0dde8304e478a8e1fd35f03e5235a2c4c19c1de8aa55945819e72eee177b548c84e633f61caeef0758db81f619faf74420f0f3fefae7bef7ffeadc6cf775f9b54a2058d41546640be1b612baa0894b26c8713149220db262a68277174a22292c9091736c248120e140a328e0451120889f8960fc468a89e38a425aea7abcc9112513ee478fa91e78ae206ca36482de52dfb1e7b0662a325299e1c6e64671201ce2661dff5f5d715485f122dc7984d617974cd8ba4e05556c1aac677e711aad6b6088683da35718638cf8b50bf52c4e069d2188016092087762e0dffb22aa11be2db4b2c792475071003e974cd8f77cddfcff235134b6fcda090896b0aa9879db8b0076544d073c2728b86160a3a5409a6fdc70c499618dfefbb0517d2a2cdc70600c251516120e5b47ffd74a507c1b83d5dcaf9e0e6c6efb084a01c1b2dce24152f72c7c0e048908467ff67ee61f6f348a23e108881cffd594b0aa685ddbd0b6f49ae2499071428282eb783bb471fd1a6c2bb4aeb9ea0a094936c30f19049c4f1637c1bdaa7ca93d3070ee741d8e31cea1b1c56175234bd0faffbf12547e2b04841747559c83f3d94c70232201818d4784856d241fc1e01b0d37f4437a5b200119ccf0b493e9ccafa038ac86c28dcef5ff85cf17e9df932d020ffe00b7c7084b3181924994fbc9f33aace3f98bdb367eae1256156790b05f5c32a15429b85e0d0c135fbf21b6fe79c4bcc5ce036e1ce671124448b8a4c9920e22e1f125a774f4cff7f8e076f6f2f7ff57f6b0fc56090816aee2823679baf7841a0f7eb8e8c5ba03da904f9f36144814a1f17a9b366e2fd606b74a52619da2a3479fffca4b14dc33c558f6c538fdfb285c901385c0309f3be42068ff57afebc71a3e8700d1e8013a1cb26160bb98e1395cfffc7f5de10c098c0724bbf1d61facf310ae532619a3b797f51eb4c71bbe5f92f8bd34efc83030b757f2765bc83e8775500fb632b84d9f728b91ca2a47fc5ff94d97ff170000fffff898dda83e6a16740000000049454e44ae426082'),'image/png'); -SET IDENTITY_INSERT BINARYOBJECT OFF -UPDATE PRODUCT set PICTUREID=10; diff --git a/samples/core/src/main/resources/db/migration/mssql/V0004__R001_Add_batch_tables_MSSQL.sql.mssql b/samples/core/src/main/resources/db/migration/mssql/V0004__R001_Add_batch_tables_MSSQL.sql.mssql deleted file mode 100644 index d0b891572..000000000 --- a/samples/core/src/main/resources/db/migration/mssql/V0004__R001_Add_batch_tables_MSSQL.sql.mssql +++ /dev/null @@ -1,78 +0,0 @@ ---Rename this file to V0004__R001_Add_batch_tables_MSSQL.sql.mssql if the database used is not MS SQL Server 2008 --- Autogenerated: do not edit this file - -CREATE TABLE BATCH_JOB_INSTANCE ( - JOB_INSTANCE_ID BIGINT NOT NULL PRIMARY KEY , - VERSION BIGINT , - JOB_NAME VARCHAR(100) NOT NULL, - JOB_KEY VARCHAR(32) NOT NULL, - constraint JOB_INST_UN unique (JOB_NAME, JOB_KEY) -) ; - -CREATE TABLE BATCH_JOB_EXECUTION ( - JOB_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY , - VERSION BIGINT , - JOB_INSTANCE_ID BIGINT NOT NULL, - CREATE_TIME DATETIME NOT NULL, - START_TIME DATETIME DEFAULT NULL , - END_TIME DATETIME DEFAULT NULL , - STATUS VARCHAR(10) , - EXIT_CODE VARCHAR(2500) , - EXIT_MESSAGE VARCHAR(2500) , - LAST_UPDATED DATETIME, - JOB_CONFIGURATION_LOCATION VARCHAR(2500) NULL, - constraint JOB_INST_EXEC_FK foreign key (JOB_INSTANCE_ID) - references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID) -) ; - -CREATE TABLE BATCH_JOB_EXECUTION_PARAMS ( - JOB_EXECUTION_ID BIGINT NOT NULL , - TYPE_CD VARCHAR(6) NOT NULL , - KEY_NAME VARCHAR(100) NOT NULL , - STRING_VAL VARCHAR(250) , - DATE_VAL DATETIME DEFAULT NULL , - LONG_VAL BIGINT , - DOUBLE_VAL DOUBLE PRECISION , - IDENTIFYING CHAR(1) NOT NULL , - constraint JOB_EXEC_PARAMS_FK foreign key (JOB_EXECUTION_ID) - references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) -) ; - -CREATE TABLE BATCH_STEP_EXECUTION ( - STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY , - VERSION BIGINT NOT NULL, - STEP_NAME VARCHAR(100) NOT NULL, - JOB_EXECUTION_ID BIGINT NOT NULL, - START_TIME DATETIME NOT NULL , - END_TIME DATETIME DEFAULT NULL , - STATUS VARCHAR(10) , - COMMIT_COUNT BIGINT , - READ_COUNT BIGINT , - FILTER_COUNT BIGINT , - WRITE_COUNT BIGINT , - READ_SKIP_COUNT BIGINT , - WRITE_SKIP_COUNT BIGINT , - PROCESS_SKIP_COUNT BIGINT , - ROLLBACK_COUNT BIGINT , - EXIT_CODE VARCHAR(2500) , - EXIT_MESSAGE VARCHAR(2500) , - LAST_UPDATED DATETIME, - constraint JOB_EXEC_STEP_FK foreign key (JOB_EXECUTION_ID) - references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) -) ; - -CREATE TABLE BATCH_STEP_EXECUTION_CONTEXT ( - STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, - SHORT_CONTEXT VARCHAR(2500) NOT NULL, - SERIALIZED_CONTEXT NVARCHAR , - constraint STEP_EXEC_CTX_FK foreign key (STEP_EXECUTION_ID) - references BATCH_STEP_EXECUTION(STEP_EXECUTION_ID) -) ; - -CREATE TABLE BATCH_JOB_EXECUTION_CONTEXT ( - JOB_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, - SHORT_CONTEXT VARCHAR(2500) NOT NULL, - SERIALIZED_CONTEXT NVARCHAR , - constraint JOB_EXEC_CTX_FK foreign key (JOB_EXECUTION_ID) - references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) -) ; \ No newline at end of file diff --git a/samples/core/src/main/resources/db/migration/mysql/V0001__R001_Create_schema_MYSQL.sql.mysql b/samples/core/src/main/resources/db/migration/mysql/V0001__R001_Create_schema_MYSQL.sql.mysql deleted file mode 100644 index 548704695..000000000 --- a/samples/core/src/main/resources/db/migration/mysql/V0001__R001_Create_schema_MYSQL.sql.mysql +++ /dev/null @@ -1,137 +0,0 @@ --- Rename this file to V0001__R001_Create_schema_MYSQL.sql.mysql if the database used is not MariaDB 10.0.27 - --- This is the SQL script for setting up the DDL for the h2 database --- In a typical project you would only distinguish between main and test for flyway SQLs --- However, in this sample application we provde support for multiple databases in parallel --- You can simply choose the DB of your choice by setting spring.profiles.active=XXX in config/application.properties --- Assuming that the preconfigured user exists with according credentials using the included SQLs - -USE RESTAURANT; - -SET FOREIGN_KEY_CHECKS = 0; - --- *** Staffmemeber *** -CREATE TABLE STAFFMEMBER( - id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, - modificationCounter INT NOT NULL, - firstname VARCHAR(255), - lastname VARCHAR(255), - login VARCHAR(255), - role INTEGER -); - -ALTER TABLE STAFFMEMBER ADD CONSTRAINT UC_STAFFMEMBER_LOGIN UNIQUE(login); - --- *** Product *** -CREATE TABLE PRODUCT( - id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, - dType VARCHAR(31) NOT NULL, - modificationCounter INT NOT NULL, - description VARCHAR(255), - name VARCHAR(255), - alcoholic BIT, - pictureId BIGINT -); - -CREATE TABLE PRODUCT_AUD( - revType TINYINT, - description VARCHAR(255), - name VARCHAR(255), - pictureId BIGINT, - alcoholic BIT, - dType VARCHAR(31) NOT NULL, - id BIGINT NOT NULL, - rev BIGINT NOT NULL -); - --- *** Offer *** -CREATE TABLE OFFER( - id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, - modificationCounter INT NOT NULL, - description VARCHAR(255), - name VARCHAR(255), - price DECIMAL(19, 2), - number BIGINT, - state INT, - drinkId BIGINT, - mealId BIGINT, - sideDishId BIGINT -); - -ALTER TABLE OFFER ADD CONSTRAINT UC_OFFER_NAME UNIQUE(name); -ALTER TABLE OFFER ADD CONSTRAINT UC_OFFER_NUMBER UNIQUE(number); - -ALTER TABLE OFFER ADD CONSTRAINT FK_OFFER2SIDEDISH FOREIGN KEY(sideDishId) REFERENCES PRODUCT(id); -ALTER TABLE OFFER ADD CONSTRAINT FK_OFFER2MEAL FOREIGN KEY(mealId) REFERENCES PRODUCT(id); -ALTER TABLE OFFER ADD CONSTRAINT FK_OFFER2DRINK FOREIGN KEY(drinkId) REFERENCES PRODUCT(id); - --- *** RestaurantTable (Table is a reserved keyword in Oracle) *** -CREATE TABLE RESTAURANTTABLE( - id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, - modificationCounter INT NOT NULL, - number BIGINT NOT NULL CHECK (NUMBER >= 0), - state INT, - waiterId BIGINT -); - -ALTER TABLE RESTAURANTTABLE ADD CONSTRAINT UC_TABLE_NUMBER UNIQUE(number); - --- *** RestaurantOrder (Order is a reserved keyword in Oracle) *** -CREATE TABLE RESTAURANTORDER( - id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, - modificationCounter INTEGER NOT NULL, - state INT, - tableId BIGINT NOT NULL -); - --- *** OrderPosition *** -CREATE TABLE ORDERPOSITION( - id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, - modificationCounter INT NOT NULL, - comment VARCHAR(255), - cookId BIGINT, - offerId BIGINT, - offerName VARCHAR(255), - price DECIMAL(19, 2), - state INT, - drinkState INT, - orderId BIGINT -); - -ALTER TABLE ORDERPOSITION ADD CONSTRAINT FK_ORDPOS2ORDER FOREIGN KEY(orderId) REFERENCES RESTAURANTORDER(id); -ALTER TABLE ORDERPOSITION ADD CONSTRAINT FK_ORDPOS2COOK FOREIGN KEY(cookId) REFERENCES STAFFMEMBER(id); - --- *** Bill *** -CREATE TABLE BILL( - id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, - modificationCounter INT NOT NULL, - payed BIT NOT NULL, - tip DECIMAL(19, 2), - total DECIMAL(19, 2) -); - -CREATE TABLE BILLORDERPOSITION( - billId BIGINT NOT NULL, - orderPositionsId BIGINT NOT NULL -); - -ALTER TABLE BILLORDERPOSITION ADD CONSTRAINT FK_BILLORDPOS2BILL FOREIGN KEY(billId) REFERENCES BILL(id); -ALTER TABLE BILLORDERPOSITION ADD CONSTRAINT FK_BILLORDPOS2ORDPOS FOREIGN KEY(orderPositionsId) REFERENCES ORDERPOSITION(id); - --- *** BinaryObject (BLOBs) *** -CREATE TABLE BINARYOBJECT ( - id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, - modificationCounter INT NOT NULL, - data LONGBLOB, - size BIGINT NOT NULL, - mimeType VARCHAR(255) -); - --- *** RevInfo (Commit log for envers audit trail) *** -CREATE TABLE REVINFO( - id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, - timestamp BIGINT NOT NULL, - userLogin VARCHAR(255) -); - -SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/samples/core/src/main/resources/db/migration/mysql/V0002__R001_Master_data_MYSQL.sql.mysql b/samples/core/src/main/resources/db/migration/mysql/V0002__R001_Master_data_MYSQL.sql.mysql deleted file mode 100644 index d8df04884..000000000 --- a/samples/core/src/main/resources/db/migration/mysql/V0002__R001_Master_data_MYSQL.sql.mysql +++ /dev/null @@ -1,55 +0,0 @@ --- Rename this file to V0002__R001_Master_data_MYSQL.sql.mysql if the database used is not MariaDB 10.0.27 - -INSERT INTO RESTAURANTTABLE (id, modificationCounter, number, state) VALUES (101, 1, 1, 2); -INSERT INTO RESTAURANTTABLE (id, modificationCounter, number, state) VALUES (102, 1, 2, 0); -INSERT INTO RESTAURANTTABLE (id, modificationCounter, number, state) VALUES (103, 1, 3, 0); -INSERT INTO RESTAURANTTABLE (id, modificationCounter, number, state) VALUES (104, 1, 4, 0); -INSERT INTO RESTAURANTTABLE (id, modificationCounter, number, state) VALUES (105, 1, 5, 0); - -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (1, 1, 'Meal', 'Schnitzel'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (2, 1, 'Meal', 'Goulasch'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (3, 1, 'Meal', 'Pfifferlinge'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (4, 1, 'Meal', 'Salat'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (5, 1, 'Meal', 'Pizza'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (6, 1, 'Meal', 'Flammkuchen'); - -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (7, 1, 'SideDish', 'Pommes'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (8, 1, 'SideDish', 'Reis'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (9, 1, 'SideDish', 'Brot'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (10, 1, 'SideDish', 'Knödel'); - -INSERT INTO PRODUCT (id, modificationCounter, alcoholic, dType, description) VALUES (11, 1, false, 'Drink', 'Wasser'); -INSERT INTO PRODUCT (id, modificationCounter, alcoholic, dType, description) VALUES (12, 1, false, 'Drink', 'Cola'); -INSERT INTO PRODUCT (id, modificationCounter, alcoholic, dType, description) VALUES (13, 1, false, 'Drink', 'Bier'); -INSERT INTO PRODUCT (id, modificationCounter, alcoholic, dType, description) VALUES (14, 1, false, 'Drink', 'Wein / Apfelwein'); - -INSERT INTO OFFER (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (1, 1, 0, 6.99, 1, 7, 12, 'Schnitzel-Menü', 'Description of Schnitzel-Menü'); -INSERT INTO OFFER (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (2, 1, 0, 7.99, 2, 8, 13, 'Goulasch-Menü', 'Description of Goulasch-Menü'); -INSERT INTO OFFER (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (3, 1, 0, 8.99, 3, 10, 14, 'Pfifferlinge-Menü', 'Description of Pfifferlinge-Menü'); -INSERT INTO OFFER (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (4, 1, 0, 5.99, 4, 9, 11, 'Salat-Menü', 'Description of Salat-Menü'); -INSERT INTO OFFER (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (5, 1, 0, 1.20, null, null, 12, 'Cola', 'Description of Salat-Menü'); -INSERT INTO OFFER (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (6, 1, 0, 6.23, 5, null, 12, 'Pizza-Menü', 'Description of Pizza-Menü'); -INSERT INTO OFFER (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (7, 1, 0, 5.99, 6, null, 12, 'Flammkuchen-Menü', 'Description of Flammkuchen-Menü'); - -INSERT INTO RESTAURANTORDER (id, modificationCounter, tableId, state) VALUES (1, 1, 101, 1); - -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (1, 1, 1, 2, 2, 1, 6.99, 'Schnitzel-Menü', 'mit Ketschup'); -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (2, 1, 2, 2, 2, 1, 7.99, 'Goulasch-Menü', ''); -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (3, 1, 3, 2, 2, 1, 8.99, 'Pfifferlinge-Menü',''); -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (4, 1, 4, 2, 2, 1, 5.99, 'Salat-Menü', ''); -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (5, 1, 5, 2, 2, 1, 5.99, 'Cola', ''); - -INSERT INTO BILL (id, modificationCounter, payed, total, tip) VALUES (1, 1, TRUE, 14.98, 1.3); - -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (1,1); -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (1,2); - -INSERT INTO BILL (id, modificationCounter, payed, total,tip) VALUES (2, 1, TRUE, 14.98, 1.4); - -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (2,3); -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (2,4); - -INSERT INTO STAFFMEMBER (id, modificationCounter, role, login, firstname, lastname) VALUES (1, 0, 3, 'chief', 'Charly', 'Chief'); -INSERT INTO STAFFMEMBER (id, modificationCounter, role, login, firstname, lastname) VALUES (2, 0, 0, 'cook', 'Carl', 'Cook'); -INSERT INTO STAFFMEMBER (id, modificationCounter, role, login, firstname, lastname) VALUES (3, 0, 1, 'waiter', 'Willy', 'Waiter'); -INSERT INTO STAFFMEMBER (id, modificationCounter, role, login, firstname, lastname) VALUES (4, 0, 2, 'barkeeper', 'Bianca', 'Barkeeper'); \ No newline at end of file diff --git a/samples/core/src/main/resources/db/migration/mysql/V0003__R001_Add_blob_table_and_data_MYSQL.sql.mysql b/samples/core/src/main/resources/db/migration/mysql/V0003__R001_Add_blob_table_and_data_MYSQL.sql.mysql deleted file mode 100644 index c8bc9fa4a..000000000 --- a/samples/core/src/main/resources/db/migration/mysql/V0003__R001_Add_blob_table_and_data_MYSQL.sql.mysql +++ /dev/null @@ -1,4 +0,0 @@ --- Rename this file to V0003__R001_Add_blob_table_and_data_MYSQL.sql.mysql if the database used is not MariaDB 10.0.27 - -INSERT INTO BINARYOBJECT(ID, MODIFICATIONCOUNTER, SIZE, DATA, MIMETYPE) VALUES (10, 0, 72861 ,'89504e470d0a1a0a0000000d49484452000000c8000000c81006000000fdc872dd0000800049444154789cec5d077c5545d69ffb92d04297d8404db020c15e028a9817052c5850888b65dd447445d85d753fb16b6eec8a5d41455c13171509764511352f7614ac80080a449a0816a4a4e77e73dffccfbc37e7bec90b5d77f7ee6f3d9c977bcf3d77e6cc9c32e7cca48aff5d9b731d618174f552c00114f9cda4db8bc16d754d6ee67d7314f0ca4c9cff3d00e76e2a63ffbbb6e945726a9343926b7e5fb2eb8ccde26ae32f2e7fc92ec8b3677b8eff5eb6a98cfda75cff5320cdbbc280ae024e1ef0df003b00ee88bf17b3e7803b4e92f7d0c0a48976de46f2b9b9d7b30a786e92fba6e0be29e6cf5e2efe41fcaf06fc1a10dfef95031fc9eeffdfb56d2f57012daf7451bf91bc925c5700477f3ad4afc39a7e8d83f78803369ec5cdba52009b29d7de7e0a3ac9e49afecec6b357847f2479cfffaeffd42b0c185180267c0d31d042c04310cc140ca054086cea4d0aa6a501deac608b1680b798b0654bc083016f05fc50c156adb60e24fafa7dc7317e5a327ecfc6f7bc0f38c0fc5efafe941b01430a866e50902620872bd4086058fcefda1a571830a280966718425aae8f5190fa8dfa3120d7e8779283160301494e3e5050cb11c9d5ef55ae312e699cd2b8b5c935c97340aea93d49ae5dc0b0f80fbdfedb3d9030a0ab80f62c4820e83e36e139c702920091e52205eec4d20b96b56923c49ec507cedae502299cff6a35a0ad540ca9d35aeedaee2d298453437f4e4f9737f7747af802e81ded558b1931961c57fecfe76b77d128241daf44acf7ffeefc2caec02d51e8fcec98f815c0afc07da728dc29717e32bef97871a46f29354ca83b61fd7542d416d7fcb6f63221aa2f5c377eddde427cfedadb137eb84b88f7d6bcd0a3bab77ac4c38012cf032708cbcc7b0f1003cef300df357141f7870129a451c1a063d2d70ae67f57f3aeb0020e6f573ed145f03b148743f046f3795fae8767de7a48468610ed4eeadca5f34572926ddde2fc761ba45ca7a535b693cf39f3424b5bc909dba9768ac4c742349ed47843546ed738a3a3445a8a1ba372bd9b926bb1935807b96f9e3c0bc8b31e07cee5d1fffea4f0c6eac6f7ebea84a8ffb276e9ba57a45c2fa89ebd6e9d10bfcdfbf9e835ff924ec8b47bc6af947cff72daca168d6f290a24d75a6e49de489e09f6078422d1f24d3064b62f89bb9e40e8776a6f1790f03fec952ca4f29f7665039242a009cc054e03260218e781b4bfa24b17e71d212e587ddbb85e6542b46dd3b9e4d46952213c99b2c721df4a6ba45de8f283baca7bf70a3dd8ed1ce10fca637c0523d54104ef54c336ac70e9d62b3c0ff85c312a8af7528101f96b187f575c8515ee54e86941e111e079b83fac70799f8bbb8a814780e7a9f703cf1379461b79725c1c2dc11d8d5d974c9403b35363ff05e3e5803cacbacb872f09b17cf477e35fbe5d8847ca479ffacd3772c05e52bbccbb5e3dda08179e42548dd79b38b9f88d6f037f1010fdc207a61e6080ff5328962bac80291971bf931cbb0c9713ffa90ffcada1cd1d52ec86f46dd7f74839cfaf6bd3ed4cd9dfa195a18b7bf490f08ed08bfb3c296fbed2f9a5c3bdd17714c7539352a4702e7f2ef062c24d794b302e5c3c077a5c7e03f21dc1572a7a118b3cd3f59e1853552565af5bc3830b779306d47d0d5fce7f5488758dbffee5f97f08f1e592770ade950ae3c5cc07effdf967f5889647926bc8ad96732ecf24e7d7b3e7c38024bfae79ff1f57a1fcb72890b0027a8061f1cf41ac375e6174fba5c7d490b49ccf9973dd5b474b0bbde5fa36a9674b8590727ecab24172a089279d3332e6c64dd0d910f0af930834298e0a61d87ff2bfa448e6021f053cb1e220dc351587c68bf1b5f9186853028ac4059fc5e0d3051d1e096ff2f2def5fef2a3b4e86a8baac3af1f21c4ea51cb9e9afc8c100f3ef08fbf7c78bc1035876c98d0d04fddab0718065603299ca1803fe0ef3400b985470ac535effbe30ebc2d746111376008f1d0ab84e7ae2aceedd041883dceec396cc810e9391cd562c8b07952417c18fab4ef1bf2a6a39c375adc6a18244a1e36da7031479be32491b78d378c22b82b0fb8499f29ae665fbee124e5b2e1a086215f49b9ac9eb86eda0bd2d39efbf6870ba64c11e2e9cadbce5abab7ba953c98c646402886c6a31524b9df648512de28ceb7e3f59fae40220ae8d014b227686085fe2ec45f6a6e0c771c2c3deb8f7a9c34525ac2a97f4d7bfcfce1f29e5d9cfebb2d147605908d097f0ad4d128780e6e12cfc1a600ca809fc13c94e2c080c157255554a3807f0d3c8caf570331b987b34957e3418d177d5f2ac4fa9fd69cf2c47942bc7ec0e315fffa8b101ff678e9a33558e3696800dc17cf9c0e9c069acdb223c807de7fcbe26518d055c01907488610290c2909a3cb4a2e3df06221da7cd5eefacb5e91b2fe51ca8cc1f7c83f5ee3bcde6a4693868c033c0cbc690fd8c5046ef3b08b418f8d8b0413bda2175030f04c2a347d07385a63ebcab39c4322bea2a89f5a7bd4fba942ac1ab674b7717244dd79eef997bd592f656f60e3cb0d4ca1d41f059c0ca5a34dc83d1aae58fe381e77687b33b085afb0027cd19bf4a4bfe670f6e1d7f56ebf548ea369cf7c75538a1099a7f55af7dd04e96134a6762ff645746771acaf38bcb0a7a81509356d45142e3b55e1655ed47e96ff2dc3dfa3dd2def8a44f172747f44e15e2ec3c3c0cb81e78b223ca7dee32a5c3e17c6730af78097030f6bbe8a0c3e87629a21be72357de253e1459aaf22834f21c81edaa82bf479e8a1dda5c268b7a4d309d74a4531f4c54bbb7e768a103764bc10bee66a21fafe6df01d3b22aba7e58b0aa66111360db1e894774d18a2c5784c0521f295220ae829e23f35add25540875809fe4941bf5d464f2e2dcdb95c88ebcf9cf2f68b2f08913ebb43c3cc41f29e502832cc4ff2a815aff98a2320c7246f618d73f950d35b4cfe144ef2e7327a11462fc2e811fd987c937f69c833d10ff01b93e748b3f8cdd5fc6e923cfb8ac897bfd43b5aa4f6930a629743baaf78ba8710b7674f7bf46de9698c4effd7d7a79e2adbf9aa50eb5658b40f2ccad3623cc937d65242b496fa0e2019ba11e0866afd3d5e29db9b812d74b90a38a50ccf5230243be8f2034abf3be61821323eef5659faaafc2d2b74f219afc93f9e25766b3922cea2c914a6055608fda32d1ae0b94ed4c2971e880a20643825782e338ae7295c3e95a99e032e804780e70177912c59a83c1a892beeb3c88557b87c2a8ce7b2705f18f765197c4e15e90a075f64c1656a3e155ea8f9cc637c9a1e0ed1dfc8cb0939bd5b494fa345bf56e123a402d9f7829cefcf7c5888bd871dd2ed2b69817d32e1f52f9677c5bde729187a023838d1592d05c023c02bd9cb5e05244552b2291cff8eae88024e21c3e5771714dcf846875a214e9a72d1f0b1b365fbd6b5aabfbfb3fcdbbad0ebfb3c1dbd2d4fca52bc45afa8c42c7a856792e50fb9ce0bc8877a2bc94725f04cbd96a1e86731fa25c00b40af447b382506bde41eb5c96f4c9e33151f49f8ad60fc4634bf345d6fd2159a93b27aa72ba4a1744ca7f5833b0a71ccddc3e6f6a91662e6fd6fe4bdb45688ea97d77f010e63f28c7ea47989feee3039760ad8cbe8ef2e60647338df92d71f5d814414e0032c24f11da675ede47b1c173ff2f0928b074b2be08456a32748d7d2e928fe6ff7cb842f8833a3cf6eac2b4c782926d47c087819043c4f2f062a3c4baf4144713900159e093c160250cf459c3151bc10d3656c00293c532f5e2abc50d32f009f0acf56d92ff22b2fc7f7d173cde3b3c49c789c32e0bd366fe039739dddda48cbb8d3693bfd69b0f4040fab1d78defa3942bc77d0f3fd67af97377c2c9ed116363c0fddbf61e018507aea590c380ab084c1c50cfedeaf8802da838e33844666dc5bbb4b8d103bdd97b5f76bf2efa191a15927f83ded4849f27b46cb99368894a14172ed3043a3848552638ac48de25a3eb421a30cac126d6099f42a809362aa04bd4c162a73f8b8b018709c5f32e0285416534c8c5f2ecfa6e1a5e955f2e97bd3ae94dcd4637797be50dff5831f3bbe95103b7f9ab9fc0be9617f59f5ce0d3f7f2af0c980590c87bc9342d10a02bf7b7fc17d6c9edbfe06d21f2d84155620517dc60e27ef7a89ef1a5ef1d8c49b2f9396e8888abbf3abe4d499724beadb779e246fbac2dba7e521712e385c5dc2c9d5952eb4f1bbf5be6c06c3faef70d1f573b98c4eae41c705de53d309b3f787d9fbc38ccf30a3aff0fc24df97cb20bdcf765fbeca95dadc10175dcefdcefc96b709d165c7aeab6e7c4f88bb9e29fff3a27385b83a34b174947c93b3a7f36afa27eade361f2bd8fa76055ba2ce200da18254d425a4a0f092425d8101ea6e0ec75bf17215e072ed7fc788fbef7978974764bbbc30e9dee9470ad1f9c25d5f583a51fe7181d3eb9056861c303913a69c858173b9e6fd6c9563848838bddc24e3c43ebe368d5f3bff4d8fbb00bf0cdfd41017bb52d3d21ecc96f27bf0b5c7be37ed2a21ee5835fd377fede4ac4bafbee4f057d43de92a36a0e5bad5f10a527d4a1ae45b87bc28bd9a0c0a2627342f6efbeb8fe2818415d01341448190b43d8e4a39addc8f399ed6f9921f1f9d2f3fa943eac4ffbb2cfae7f342c3e35cd60258f8e3d00d8360afc203901e45a67a9776b9159ec742539570c15d71a2a2a7435cf9e0d1e8d69845c72c38edf910ae426222839e33435c01d7ddc6a70bbc58d5b54b5c2df2f31017b71423c00b359f59069fd92a24e6ccdcb2212e7df51367a7ec2907d5c0f61d730b8438b2f4d495bb5c29c4274fbdfef67b7200d6fd5253438b8f3a04e0022a0e847707f0b180e094f2ef7588b3c07c6ebb5d78bfe6ab44015faeff71cfc3693d2609d16179467ab954acce0fcee107f96b46310f7843f4e67c27fab53a6444728610a8bc2f0ceaa62762f5b059c888cbb14d3e329907efe8f45d176f2f34e8337e93876c897e9210977ddc317e81f390dc9692675ca12f535674bc54885dd6779f709a84596fedf7ca37c3849875f3f44796eca5eed11e495e621a7c319df2ceb45c43b1e89e5ebc25386fcef57b5720a80f50c12661288ed39ebbf895f4b652d31fd3bfdbe4d6f2b70ea1be43fd18b86dad8026e8b0521c7a82aeb4645971973b8fc5564b31e0b2a13866824b5b6880b2aef400c18020d73d177caeb684b8f800d4316c169a2ad4aebc7aae1821311ee2c2341a17232f60f44dbc140561f92a241608716da1d8325d2d3f69dd61bf9385e833e1a4437b7e24c4d7bd679c551e1162dda45f9e6df8b3ba470f38c569ac9e84f6682a31a107c84362db3cb4e5323e4a14f0e5fad2d327bc947385b4521f68b7ea8db3e48f473b3bef72b508aea5e5a2ff660a55c6aa0d01c859a596b3e8dba49c15a8fbb4bc642a26f85a1d8d8766cbb1a25702fab15092a25fcce8050c17d02b64e322a6984c7ef39284e42a412fb399fc16b0905c1e70572bae4ab1052ea79d33d0af70ef727ad76306ad1262dff29c65cba5c73163c2ab777efb286e2295b5185071a04358f4bb561c61866f7345f27b5720aaeb759ebbefb2f51f77eeedad4608b1ffcbfd4e7db1a3ff5be8bd81fea2a17d714de13958a476510f5d29da466120b64a038759302e048b2cba7c65014a8f661470d0c180cc648be585164f42683cead1480f643ff01dc673598c4f12b330eecb32f80c93258745fe584cb8047f570ab0447b380a77816769854a7c293c171ecd4c78343cb6be9562cb69b35aeeb0e7b1421cb25fffcbf6972a7ad67dd3fff646ad1035376fa8e079f35e4fe087038f002f31e1761b706410d15e4ae0c3571c97ecf6e88043d709d1eaa3f475d3fbca1fab9db69d3a095feec860898057c255126f3e0ca29842cf54f7b1fe136cb1991b44b1fa8a02e08a5e72392683cba45fa80db002f57ae6f1307ee3e42fb3297e35bda007a5e871c32819bf31c55a01fa61f06fd2afd49e378dbf4dbbfa8973fcecab8e13339e1d203deb1ee71cbe6ed92d5291944f5dbe00c9247c2d84d27ff9da87a738b57b245bfdfabd2a90b0023a0b474e1cfb1edafbdad41be53c76ceb09d9e901de0fc14aa3ce96f22e83904f3da155e06415985e18bd08ef624b82b6fb7e894a04d45b7e5a28069a61660d322b765bf04b355c6814f2a2474f11d8a6f872d9697989e439ca7021c218e6215e210b49858c13c9cd8402b34db8185e22a40cf926da62dce2c66d1966c999040daf72d4ede437272e84e037aef2e3d9077339f7bcc27ecbdd158aff3ea115bf6bae0a102e02ef00860097e07becd1409d56d60b1df571ca3fefce02b7b2f971e47dbf69f4cf73d8dd9cec79d4e8ff3282bd9623059e6b92ca4c843300ef3ac2bf5c4e9aafb40dfd1868732902a028686a2c72bc8b35808a9c44cce207e831e8e85dfc266f2cb43ca4e52c388f31b01bf0a2f481c0a0ef0bba543b65231fba1ab8e6376bc3b4f52ec76fc3e977ebdb3109fcd7beb8325efe29eb002dee326d4f24b38c1c59ab671dfd65b6cffbd2990b0023a0b679582a1ef653fef78f3fa3183e4bfbd50bff3a422117031a547607a0e3aeb435be80a1f8461ebaab45ba778e3d26c039e43bef268e4b49f0b5c790e2c7416c767624f2253e36afacb09585ec4679ec1676c002abcd0f41c4891c8e7f603fd30be2fa1e7104b070e588a0a2f08649b450c3e93a74f46f0f6cd1a782d17b45edf437aa087b43bf6afad3e948ae4e5e71efd4405e9627b735d04e89abfeb104026231a062c002cd91c0e135ca0ef4c0594beef79336fbdc9df5baad3e89d2e8ff80af06ef17ad737a3f2a3dac7b69641064c2926eafcc45973564320e0b1b290514c91287ac90d0d538e89bec3c69f13480736e83797dfb82c3193dec61a46997cbe08648935c9ef160bd91e2d3d923da55df641d773fa4b8fa4edba0e377c749b105fd7ccb861f549ea16ed81907cbbc00b184e8a2413300258c2e016bb7e6f0aa444010a7e84e440bbe41f8fb61a72bd64759fb49bfd6caae8c4e78b5465920a59be15020dc4626ed1359dbe1ab7c80e41043e1591ec5c65bf4a2f4929289e665b6949b3e5ae760ed26e2348bbddc834dbc000c947086baa9e284ad47396e48042aba5081c21c01c786e1116e2d3138f9e8e1ddc17c67d0ebe07f8e685b8dad4b49f7ec8fdd2723b719f31f3a649cbedf5b71eada401471e090d382a557381534cb988118d009630b899974e3b960651b7a77bec9422278a9cc8a04e9356c81f478bb2c3e78a449eafe2b632b0369519c57361c0d8428a3c64c4d70688be635bfb4abc961833882c86464c3131fa01f9d8347e631e2fc68596bf84fc26358c821e8e8bfb0a9be4770b876c9dfd9d65fe1ac9ae1bf67ce3882b855878d897535e953eff2f7356de545d8d9b10b2f588a3087092ef45c04b80937c9702d2738b3787d3f8ebf7a2405c05e20b6d865f7d5bddce774bd7fe938e4fbdee87ac16887e7e419ad5c58c854c144e9e0362ab729a3f11ef52825c8a8167cbce2041a9b4780ed9ba9010d95316cf2116c3263ef3189f0a2fc3692083f404adde53c806888d4f3e00a712df1b991c602bec2a80c22b43b2c0c62eaab2ba15f9dc68d0d9b463861c650b7629df7555df3a217ed87571e3cbd2725bb9b872ce06b5ba151b5805c049a1ec81df6940d2df29df3e0f7fa7cd37576d128746e19f7ff99ef4f9d78c993c7aacfcf7e9a13347dc16e74904e5577141f25bca4230a5f8aa0cd433e9898dd1b37bd6444fd18f6d1552095cd1b31b44267dbe56e268f9a9041e06fd0ab48949df05fd2c6d6025e437e6f1327a317e2b8cf6284cc22f85fa2c1e9495df606859d1ab741cb1195768ef942eed2f16a2e7b23ec7ecd1284568ce336ba6d7abbfe92d7b4a80ff85c14cfc7d3120c97744c12dbf36b2bd154858019dc61851c0df3a205c3dec9f974b8d1aaa09650cf0b7baa0892e3621bba0014bc1e262566a4f42ad3114e318a3b0ca4ed2169760829167f11c08d769948a9e54001be29fb3c7b0399f68854158944f163a13cd5c83c8469af14c240bc442020ee887f19cc263969c83b784711f2c47840073b445a8ded3dc4555168a93efeb055c29cc4db4e09ccc502bff1c889dbfc93ca4aab710ef2f7ef1894fcfc41f6960e55a6026eee303d3054e27ed453692a93078c380f50da2bf5e7cf79cdda527ddfac1f405cf4bc3487cef94f869e601c5cd437e956cad81d6d0682784d57a622b51cf594330067dab67ad4359da63b51944d42a26bf2cbd564a8fcbe867a2554c7ef98e08b6f4dae09a5f26e337339e5fc7257963ed51a2e91780be1b4f3f29bfb68a7a9a1f36d32369d9adf569ddf714e283da97de2a95946a1757fdd688ec43ed41bbc01799bf6b1c7f0fc82fbe68f33d91ed5d488845456a087f517178e11d859997cb0eb83b943ab23a5a2814cdadf18abc0c752ff09e48d61c0bdc53b8bc4fe161e03d919b33dceb13c5fb20d973ac17567f47415111f0b0898bb1820afd143e12f840a22bfae07dc467b681f7d4ef233eb34d3e9502f22e1543f15cf43bbda198d6c602efa9f7fac9c073268ebdb4e4fb543b4d10c38def9f8cf7802f79b7c2f3894f4458476abea8104be1d9f88e22c6674f85c7f13994f1893dc3c0d758e07dc047ac7d894f1e586ad695f1efdd479fb58310877bc737ec8182c3560b0171c0508b73144cfb55413f29c3bf42df281838dfe53110cf6e2613741fc9356dde29e5baed9c8e7fbdee0ef99dc778f9a9efc7b707f65443bfc5c92fe480da09f2ec01773dd5bf28f0f3747b9bf4347dcfa42f9f37c707d1efc9e42e6cd297eadea43f99f15b64d2a382bdb8f1c6e538b17c107dd61eba00d065f4c65ac685cbe88d34e557ca5b2ef07093fc4e66ed61e33726cf54b0b849f24cd725d5e32aaf951e8833cc59d11a5bf5b47e59413a80ae05b2b7b85ca71cab6008597f0ef6a0d3f2b9d9d7f6f2405c05f46ea2ca691429ef48c36acc9f163d2b159bf3b2f3dbbefe80a6900c59fcb00bb5c59fa32dd90db88fecc60db84fe1678a5fa2f8550e85aea27469fb0b692d66e277013a0acf005e067c10a8ff13ffaa95ff13069fe98ccf74c667bac127e1d761bac9c722ff6850c991fff371daa6a358e1c4a7b4c072189f0aefa70eda9578187c636f2cbc370b7886e6330bf7115f59b84fe1282414fbd19bc05719f0189f198ccf0c7c4f0eee53f834b45f2f1520927406e1fd8bf15c41f4f766a64f86e6868e6bb59310ddafdfffcebd3e95defbc2499fbc7110fe488b8b74fe088ed2d5a12caa1ba1b4609c0def41f1e8b62e698a0311db5e1d9bc784ae10e2c26fee796d5f3905b65cda7aef470ef16939e3fc73389ca9d46f2804a47eabd4f54a9003edf9a9509f8bfe58a5e439ee585ab437e88da1f6d65978aa7f4ab52429fa65267d87f611cb31e54cca2bc95986c1ef203cc1e967805f0a076620c443f40b997c4cb5d02f34db234e0a329be2578f0bc1f9857c825f3d5ac3144283fc717e07b1f6b0f19ba343d2617ce7623ca7e86d645662eb5e6d2bfd7359ba8dd8a76ea91cd19f3df0d6238b60207998e93c54b87b3f02c213a1dd80057674f090deae0b6d0b0023cde124d1b59d14885eee2e51c08f0d8f68bcefec7ef283d3c6b6ec71bddf00d95428d574819e70292bc51ab3a41829290e35614530b02a2d69b622c9e25a2c0f5f85b0a6b2823d96661b17322860ef53782e14de4cf065cd26e17c5a43534ac1165a425cd64d1dcd7c7c6fbc77ac7fd25b6d7df5aa5f779122735ada9036a31384b874cc197cc4d68c1cbccde433072118969e2978b6d946a64fb6d8bb55763769b1b5c86ffdf9c7270831ffa5992b7fa42c2d3a10687740da5e1b8a446fabbd8709b5d110065ccc5e8adf75c80a7ff743b1fdcecfef30460e6ca7ceb9d8af2497d20c4388cb970e2166a9ef27f9e56b72907f92a7e2666e92e830fa9516fae84f6b882b58f1eee03e937e89a60ff9481ce2b28f374b7b8441cf16e27218fd60c5bbfabe2c8e379dbedc5c7e25be58e19610d726662576d8a3cbfb590572ae7fe999752fbe2465736de3127d901b9d4b028fbb118650e3b90a9afb1dcbdf6150e942d64dbeb6b5027115a0652682fe59cc7d1f3e7d8f47ae94c8df9ce3bb0f8fb3649215e8553673ad2007b6046ded51890aded8449765e0c9d2295d780ee3b48554c8f8cc637ce6313ef30c3e4991f042c264e9c0b64ae16226e0c9765565f9f8cb977c37f35d39018e9f76f9f83ba50bfcdae0c786bf2227c2da11d5dfcf961371e617bd2a0e90967ecadc947fb43a41d8d78c2c15efda831c048bb9b99b3a264f9f8cd62677b96bd7e37638540eb85f9e297d13e73378ff5290ce19a181a4cf6bd8ddbc4f57b6e7c67f89087a22c0f562b984e7e5dfbe47a684ad32d3873df2bafcdb27ce14ac7960cdc75291cd176fb5a2c677c310908a830a6351cfd4b45c2438f0c955efb5243bd8924738bf9516fab4d8ece8f180fec3df5141ee7dea0da9f70b275778cf44dbff48a7b79fd66a6d8f40d624537cc9f8658bef0179b3ad51062ade2df429bd3db6f6c2f865f2eceafe85f424be5217a6eddae9342176fc7eb7cf174945f0c5b28af98b17abbfe903da48aee95c1dac859082d16b7f8b18f102c048531c24bab6b10249e4790c5f3226fd40e99ab538a4f5c5b71f0f01f4bb86b6f6d8dc023d1a1865505fab90764b27fff102bd98001518efe3e994a5420599b2e1d190e760e33360d16945a504bf0016799916a812f099a9de9f24cd962d6a3b6c7b7841969b9e4098e78001f853edf27f7f76b7100fdc3f6a8f871e16a2aa68ed71d5c3d4030d3f08f1fda3732b7ff4cf6aefe2a52f385b883d8f3d78515e963160884fa59878b619f13988da178a5c0fec24167833d3275b6e685de1171cae3ff9b7b96fcb81f3fd075fafff15e78fd8065c23290e0a0150653b425ab6cd18290924def3387a7efe946bbbc9df760cbd78a4bf5545cca3863f1450ac99eabb9821c417c72b7532897abe9879e836f97518fd4a6bb24325e82b7ac1745d93df589698491f8befbffe75d59b73ba08b1d0fbbc6e9a94a70fc6bc745a991c3191479e29f6e1d457c6ffe519d9ce150b262ff18f969d77e327d3a73d22f5c9a3df1ef1ee5eb2af4e6d9cb7441a982d8e6b55eb9f0fd332adcd313b0d13f6ac2b7bc5bb6a0fb6f81e935b3d2e98bc252d1730da63a3b32737b2e2bdfdf22e37ed2447f6dbdf3e5df71ad27bc9d3d0903c11e6a19047ad3d6f78269b9e9db5ad1488ab802e1044d3443d8f6ea77d769914b0d017a1257d8e1031019c89b4dbf06616e85187c60a0915ac4c1a322901a6048c7b0ef9caa371c66182b61412dad381599e3bf19db38969b6bcf2b6580f1835c16469cbcb059f05a01fc5ebcea969f5ebc542947e77fd2f77fe24c4bad77fb9b5ea35f5223a71adee1a05eba70bb1b870ce052b6f97e4669f5179c233b2ff86a53ceb9fab62b7e4b8e5851060a13e39d1453b1434c56720dd9314ea547542a4549b3be2bdd137b77fa5f3e55539427cb8fce57b67dd8defc191a30dbb29a8435a8d26f44600a7ac977062a83d6aa9480ebea3fff8162be4eb67ecdf6ac2b5f2c74b4446dbb651c5617aaa95a6a72a5c9d9e4bf216c1f7e7c57fbf80a72615c738e06a0dab34a9fc2a7af61d1b5ce0eaabec068b29776c2fb9eac675bb2ebf40888fb35e2ffa979cd0260dbea572f22742cc7de1c3590ba442fde1c64537fed44ecad79c5fe76cf017851bc4f4fa057e238b37ebbacadf1ffbe57d7f7bffe56bbe1bff93f47c67bff8de937e9dcf8737bff48c5f70997e4687d3174ac5dfa5a1eb375972fe487d256d40fbf64204f6e0ca4a5a70abf8d705b7d6745d458f57d4575ada23a6a82a403f0cfa8a9e6dcfb0ace6856cd3f66c79d68e52d2d7ecba7afadbb21d967e3e7fed9a2fd4df1ab96144f2bc7b62a843b111c030fb3de9b5adb3b05c05fc0197fde491e3fc13bb4237a4f43e7398089ea8d7939da8c74e34132e3b412f76629ac26327f65156959ae85d64a5509655849dfc579eec6434d02f4336d550289088de369af83470bd6db4ed64b76c64af94e33d31bec3463b683e3d337b449ff406bc48f1a5b7b7e6ed1bcb568972feeef8673b3f2c2dc41f462f7af89703a37f11feda877fd51e09788a823535d2f618975a59eba70f3ce2ecec677b48be5cc6a7cbf874f13ee293b27458fb5af8a476099ed4188df87a433d9cb06e5e3bb6dcfda601ef4b393b3ca5550b9c7c48d02fdcf2afd45440ca5ea16c2c828e4953af7590e516062ea78c3ea9a7f41ff87e344cb072a79de2daa327b50ff8f5c03fc91765156979a6ef2779c6f32e9767d0a3f6487ab29f0e6418f4253d17bf96030f1bfc5ac687f741e3098d52217fbdef87d74cea21c43d2dffbae09aa38478ebfc7faffc049ba0d64d57b0f62a056b8e50b01ab0ea4ac02a05375c01b821085f39e1e1fc0ad92f631a0a8e1c31497a36f3bfac79ec3bc9c780c69b7d3ebc64edc1e42d0e57e3c463f21666f42cfdc7db3be9b88bc933e7b7dca0173c3621bacad3e79293fe791c9d8048c71ba499509fec896c2c92eb106d0f4f72ed32d8ec6b1b7920daf38828e8bbf8837b5fd2e318f941a98569e32fbc4d04d720289b293f693e7a099e53b8ad10ab582f66533d48f30a0979c8843c876c58105370767386c573e079f396453a67aea2db785fa3e74fcc553bac9bbde40969695cfee3a039d252fb6ddd4fcb16f41562fde85f572f9296c6bab5bf5ee9c3aa9cb5af2cd9533eb8d4bbd08f25a7b44bfbb6cd6449ef84d08ea917f8efc31a8325c4b764e9bc6b5e3d4c88672bee396cda1baa7feabb2958d71710bb85d67604bc5a88d36fbac4c9919662d7017b753f4e0ee4384bcec5fb14ce0baf62bb052b0fb3d8b2a9a50e11008f2daa3ab8cfc4f99a19da37e5c4d453da4a8b37343de5e799d2a25df0dba75faf6cad5ea03d10e4d737c0b56fa0b512a44b36926a5a0c1811c6458587fec03c62d4a91baef50f2e7bdc396bfffde3da23e651b755fcd93cea2415deb1c5f3d1b86f83d11ec92aa66d3b3654b2f6b6edc185f1d1b053dd90f5526e2aae2913f7490bf88d6e8f77fea0859cf84a1abfa8c39a13c951edae800b14240552b30b7e27c57235f04780cf57b0ee6cfc0e58ffad7cffabf5f7fa86cde7bfbd3d66f63a21dafcadc379f3a4c7bccbfdddff7984348442a9ce9d2d2e4cd01e6c735289a9ef250fadb97b8655b2f9c2d5f4d5df5ded4134e9513abca25eb0d07226e1a647d2eaa3f4fb3aaf918afafd2797bd78a97a904257b45b3585640936c03321b9d79b912e0674c5465e5b5b81b80a6805028bcd5ffbe8b3eee409e74bcb2f549752dcd79fa8f81a44aea013f594fdc13b3469819e5ebb50f7bb586328463a60330bf4f4a2652973614b112ac95779dfce6a4c84997c20269ef8ea47d435ac9382ffe382ca3bfdf32ede2d7eeeb5c7e54435e5e33b4794e408f1c1292f9cf5e63942ccfc7ada981972c2fbf4cbe90fcfdc4f8859def4b299ab25ac7a63d1277f937faf78fdc78fef90f72f7af196e913249d82673f7abe83106b1ffbf9838fbe14a2ddfb9dbeabdd5b88d617b7fd79a7a9b2cba7a78c6e257d9d0df7af1db0500adca30f5d7ecedda74a7eaa6ae7d76260d761a06bcbb13606bb7dd7e328df823ff1ace157ddb28fecbf6b52f66cbbbf0886f892145ec56d2d8173549a9e38addbe1d3c4165b338ba01f9462c6c04b393275e755720a9f31e3d5c8e734e0e0f2375c0788ba8f86ef000fc57de4f253a156045f580a28f1d4f92dc685ce132267c089d3eef7d75a5e74be687b725c482a1ffc4ea5ad4758ecdeb6e54d3069840ca332f0906fb4472c0463d2e715d3961d1bf45a9f650f2eefee86e36a5e17e2b5d6131eb8f578297fe74ccb9b0f43a3a141419af0497eaa7756d07f2e0aa7019222a901443d4e0d14482d2994b3400f864c3de4b31e8acaefbf050fcfba7fe900c9ef4da1533f9d25c41e5ff53ae2b8e512efe0f44ceddf647b44bf3781e19285f631be3f2e09c1a44786512c5406838d19463cb4ce16f503fde7249ed752f74bbba9c3a7d26e1c36ffd6d7657bae7a71c95deb90ce4b21672dc7906fad482628c80b10f55500181149aeadad40c20a680b0d21b3507739d0f63ca9ff0d7e139de164743d5b04d7202a903595c1b6f6d0961813709be545965d31703a8276aab6c82351bcc4f41c028b967c0d82ce639882dd7d359f81ec97e8fbd6afff75dfefa44536eba8e9fbf8f34ed9cb77ac795c76e0cc5ba6dd31738c102beefaae66f5d7b233a778136b07ab0faa234f804de87c80d6a190a8de178c57bd35fefd2b567fb77ef59fe4fb96be21663d2bc487552f1dfae21affececd6fdbf9696da67d7be75ee6b122efd7efe9b3ffd4d3d5f8b350e1ab014baa2815e7b8f1023eebe679fabef950aa9b1ed91071d248203442b00d37390ada0f02c8d2bc380efdebbf9dbe12b0b3f2607d1f7a6f44d9be01f711c99f8cc9269e3d5937a8001d69fc37edfcd847aa0458471f98ae4dcd537dcd173a5102debda7c35daaf03e115e4537545b6da01a1d25c246fc2a38ee03b4c4b36960e3e26617b704328593a69255b2be04923ae28f183329ff47eadfdc37d84f8e8d1972f9d834a0b9ac8eb497e208fe45954fd49410a5955f701c42230290c4ad6a885e751831d05b4070285a23d9c37158cefc7c52fccfe6a956c91aee97bdebefc292176c8ea76ed3195688fbc84ed51093c1cc59bbb6798ade2bd90d622217fb63db8d8fc60ed3fdd4f6c5ef3e9c97fa5d4a49dbd502a882f9e89ccff0e0a9cd6f8eaa128b4a70d83a91e5ba3e83de358faba9e514b44926b2baf81e858311558b9429cd6f6922f77f4832a45ce9b87fa165eb01257e103bd760ad795a25e3cae8f6ca50aeac9ece84a1c65491e8237d453627d29d62e6215b854c16b54bc7bb14a72aae8a54a72aa88cf4ec467c3e2fa89d5d2025ad17ae12be51709f1e686270ebe51b6f3037346ce2e8ac8b9e7e0a73b7e3c480e869bab076c58acdaa5eadf0a6e4001da0614feac8745b10e1dbb6e06208ec05cfb92097ffba709d7de03280756ddbf6b26af918ae5b571138ea890bed3177323efcdc75ac75a646fac830bbcfe44c08f63fc0c7ffeb6c3fbef223d9a5b3bed729c7ff426551c4750d14eed393269c5bbc287072a788b8cf62dd2b1e5e655bc0f14c7014f58499ffe7d871f7b491fb4ebf0bd0777fc5c7d57da7813a6a23d52fea16008213bff2c72ff925ea682730151d9ebec24156a8b76734ed83d8e5f5e41ce77406015e47a6d8e5790072bbc893edf512171c57491b5e29ded7ca02bbe15bda16645f6fcf6339f2b7385786bfcc4111f97a8efae5fae60dda90a560f57b00a9be76c808221795af77f89e15a58c6be471effbb1f228be22700ee61e26b6f033c9ed191cf3ff9eecdad5e92bfaf7c6df1fb6357c5b507af201fca7644f0d891b7d41e3d59857ab0e29df09ec069ed4bd11b69ce634d54bc9bf4279bf2ccf9edda6eefc5bd4f56df9dfabc825caed3fa2b980205ede0e867078a5dcb33cdd330f8935f5bcb034165af660c16aef3b0107d469e72ee215223b678a6658f027fc2ccd7a125551fbc0af86342e5ccacc256762e62f91482ca053e4587a4541a6d6cbb7685e7029f08fc38b5c587f3b25908284621bd97f8c857c758c9bbdc785c8c02de127cfe5344a7ebda43aa57fdf49010730ffee0d5674608f1d26b0f2e7ef93269e1dffecd8495be28948bf2fa6b553bd42d037c4ac1da0e0ad6c092aac1d9c8351898dac53f9fe1f7e2f9bd418f2c34ac65d43eac60fd5f81e37d759840f52239fe5e07fab57b01d64a011db6f79f53df15e2e891f9136eb8d75f5348e9d4c55f7329d66b0eaa1dc6b1131f113214c5c8b2ca659b4fd2a98213a9bd11e21b05e929a658327047870c95a7477510b85fa72d5fed5c055c992fc4e79ee22e7f8de2d78f7e6cf37e9a108be67ef5fa8fa8a9afef04482191a781a37d1aa058745d485841da64d1f7ac73da0cea70de9df2bd8f38671e74b6881d9d9c8b42d3b1e0e31c3a5a194fafc2f7f1b5b97cc8277d5f31a337d1514ba8a728f993edaae885891eda8fe8e582fe14e073751697a24ffcba3abb302aef359f6e707e5821c48b550ffcb9245d2a8715eb6ac8732005a23dd72715acc1dfaba050c820d21e478d096b272aa8c7057918b094ebd55a8668c0f869d817b033e00e0aeaac23aa8378501a53537f2a5e280dd5eccffb1c32509a90a1f9a1933a7410b1dd8c6321f362033f03f34abe3312ed31cac04709926fcac2541ef68e783e1ff4c6e95099c2298d38368f297a537436a2c2295b7494f6008b417f94c1efd7ce57fe32fbdbaf3ffdedd402b417daa9fe74b40fc9f32405699ed05986b4f3023c11ed6127dd4c746b29103a4190425758fd4f9113dae1b79db8f4646971877e4c39cdb764f5561f83ccad3d44bade72444de4a59a3a6da14158e22d1708a72d1d0e545b7bc8e1a6fe32574f402a0db2d8dceac3194d69b56cab8f4af0f94f75fffaba355f2d3c4488c7cfbdf685623991cccd7d7fc9824765a72c6e58418a81424d3ac6bb54c1aabb14acbe13385c77da4db6ea6b4028e06a0a052c017c02f43010abe1f2eb9013063029a2daf780c3c2aebd1838dd079c16316b2f10a2a0ed0dd34e91aabced2e9d479fd943f85b9990a2588c762a403b299cd26c8bf5d25c66f4f7587f291c29b5dab51f450760995bd3e8ad5432d8d634d87c92fa4bec8aad3dc2a0ab4fb653176d4553bba4eaeb6fe544f2f98af28af9ea89687d8b7fd5af003c44c13aaa7f414cd91b0262b4058f0a4644f71a3afc85412baff163eef78a11bba8d04dbac16f3fc261c8e8ad31a0584b316a32743d90c22bd9963763f4d63cd180859ca0143d1a07a400686b13c1e8d9b7fe498fff268171f6c56e919c27ce1362cef3efdff71d26ea7ad4d3d462c2a7b58d2a84a6aa10d9a87a48c1f5eb815f69deaf17cd2959833c1aac5135c0c368c0c447fda4712890465230a45848a1484fe5a78796bd54f5ac10fbfce3b0bdd6499fa3fdaa2e6306a4c5b547265a89b62aa20d50686b96a9d8fa24836ddd53c8fa6f2a19b2a037956d8544e9bac58cfe18b615901bd80a485d597a6562713cbfa9a569b9ed657bbe7fc88b9f3c2b3de5baa535abeab047563d0cd17a0a6da15d2944aeeb419024423b3548ef495d24191161b9b6551aaf1b83ce15a193fc92fc409a6d2cdd8d5c35a4c76e629a2d4f839c03fb912c5aa4d9c6a5039b69b66196661b36d3f2d64efaf932ff70fca965e3d3c6ca37adebf8f3573450ea6940d01a024df0a8abd83055c12a0a59214d713df0f5879b90ee5f3fd5bc7f436f86e7307812fbbb0556810ed57dd040f763d5e3aebbb4ffbfa582a9776b8e7f6fe766a5259afdc5d312cb81e7436ccb95787aae968308e823a4005ca703e3fe58fab6c28706d281cb0dbec067bb833a1fbe0b146d0869bbdac041a84aa73b3eaba0aef340faa3bec2b1df9d0bc4c0acc238fecb59faf9641d3252fc146939758def41ba6edcb830db03df2fca4c7ab1f476fa7e9dae6bd0a3f68ea55bd3f460a6897b7735cef5eb7d3e796d6a8b2fa8ce008bb1e4a9515d904eb2a0c5719277521464d0604d442b0c82f0f4c8e3d031fc6bcddf35ce3c94ba6b193fe4811f117bff8c8b5e7d64baff9e77bc54df93d1eda1d3994d794936efc4cd336e14f7d8bce331f9e3e9ba113e8f9969f881798cc61de7b79fa8f7e5b86763efdb7726b9869c521a2fc9b75e83a690ac6342addc9a7d6d250512a86c0ce377dfba395e74e830387e2059ea006880f0fa02aa2760f5058109c533078c541f141356f727cfef36263ec9a7c2531b07344a8bf4fd6ecf9ff5e43ed21c58347be44a6c62a605188aa31a03aa1a79ed7aa2a6099e4fe870f54901e809bd8a419ae05f37a1ceaf47a8a0fadfe6dfabc047f595ec3e067568410ec486417573fcc5cbaf3bcfb8d15f1cf676693ccf5f9b89b52fda27ccea5492d5ad509d4a38902f6fe2ac9e461431454f8abf0c6b0d49ea2852af6931371ded4c8a22850f3082b48b293c693de08a63789bbaf655fefdde55e2b7f6a78844f5408a8f7c9851b13aa688c9af6950c51946667b20d02047876bb6ab45b1daeaa2787b7ba601b7e6c59f5e9f374fc26f56f72279a42c2b3d81d3c44da150a648f4446e59fcd68be0fd18a4ac210a491d6de281fbb962e17cc9f1f8e5ea8aaad5bdfc7071f527b366c5b547a0ee83d53159e61dddbe5a51139e989e94dbb0412f502705455ec4e9b3f9d1c26fbbbf763ea62d3686d4f24b8ae418f3772dcfb4d6e10286857125af50dfda8be8aec9485481dc2c1e6fe71718252ba0eac90af43c4b819e6d42619e83f440a890d028d86b6e811ef1396fc38cf113270a31fbf877ee5bd84a7d17290ef238aa6169d1c4bd810aa492790228bca2095e4ff83c764c96de5589210ddcc0dfe9f923ccf76885516b426d19ca813ee5ddbbe67ffbad10cbe67cdb7f841f3bf5156c6efc00b158b6dc728e595aaec2614971cfa1b91e4e446f633fd4c02d1367eadea9e7b569a3be4b2b0458647a80918536c5bc2f6ee75bfdfba139c76d481f13e5372f74acb07a3e310fc422b731c38559baac3dc8b22d33e9698f9a8f83a485858c5ff4db8693d7ac5a413172aa1f6069cf5aee69a2ee6b420add9247ae1507267af26878e5b43ee39e6079629cef1ca0d3b1a158ead8fbfcb59afa4beb667d776e5c7b700f2d28c7d4be24c7890d195a7c8f24f6f8ac1e362b90f602111166205b3ccad6eddb4648aeb921a4e599e43c7e3e6e0226bfb676088b34981b070f14f5fed60eda7308685c5de9adfe1e1c90061ea8c48d584226d95481ae36ddf6ec21828402f3f3c72bbc99d2729d3ae49177de244bac8782b4285d43212b4a5f24cf837b100429664c9e045314a49074ba2e06aade52c4627969d8a379f769ba34d0eb4d486b008d938478f4b4d13fbe2d07ecfa49bf0d9ee26725d92b6f9b54fc71e73c84d5733c04600be930cb90f032411e48583d9778e24cc94acb6b8d2c1e3dd0a8e29c2c35b2d0b006a5150d0d2c175052eed465e73dfdad3482a13dc67fbe0e9d8641c394db60a88f4df42ce4423b20b09046131e35574c89f945bf554d5877f6af385f424fd4344193e7408a84e4c8a228eaaf33ef6f2479a22f8242a076d58ac2b340b2f9c3a0430ae668461f38c9b9fffec661f507afe811d71edcd0d8dc0af2dcc4864ba0e23de0a958765848ee5146e9b53c2c7d581bf240489e690d9a1407f7a4499ee90b8405b75e5b69115d33481f701ea0fcb0434e3a6ec2b97bc87f5738ab3233857dcf9d5c76a21e2fd0b355260b56c949db8dd3b907abe85c05cb26706c93396f61e35e7ed6c2ebb5139c7ba5a25853b96adadab5ea4575c83aa9c5a238ad7150e19486489bd3163fe5b943d1e858f07d0ad2e21759527a7334b2d468f16b1120069cce3ec9657036e05fcce7f9ae9d7a80d2807e1cb04401bf7ec7bffcad11d6d5fdb2c3a71d84d8e7b8c3efcabf4cfeedd250a7367efe4816ab7fe09b5a52e52df672726c9b5a9600cf0b6c0a5860d06fee76f8d883ab7a870d4fafbc4d88f7663eb73682cfab43be7ca0f21e8b8df5d82a425bcc686f5f727abe73e4822eb27ddbfdbbd3cea37a097b21a43e6f05fcd09e56a556b9cd427ba8e7790539eddc908176d015d3ba1d157d5e31ad0be92cbbf71638d166f9a17cd1cc19cf08b160d6cc65df9282a0fa0e181cba10f01186935c53012065b3513d0d2dd6421ef54990e4334544d317fd5d7d89f608a9c053ef8e0c34deb2ee33eee4ef7bc97e6ad1bef585c7a688c09e619b5d411edc234be185963dc93293f41f3fb29bd307bf2b5a7f37e8a35b8598fbce87d316832352e4d46f753008abd15f3c54e861bc9b41b9a6ae6da5406871724fe9f2b71e78cbd9f2839c9cd0b8a802b16d12480386d236835b3a44f1b84a5957dd67d99e9ab2765ca4411653168f9e880ac1353d17c5970c9ad7fe95ff13e2a3092f8dfa18e74250c1590ded0d457bfa509614ad29208b4757e2526c185b3be8024178149425d1882c13bd391adb3d534ff87b98bfebc29f08201d3073387b9ed1a14c144d2793d151538d767dfd45bb953316bfe65b767b5f7668ffd52709d17e8f1d861cefe7e387d90467a9bc75b01d7ee02853db76f8b64d2d9bb91dbe83c2aeeaeaf52d562c970ae487e7a645162b0a75df0292278681568bf45d4a57a5100e296c5f027becddbbb6f34b42b4ddb7d39051a384bd827c100c22da7d58ef50d0ec0af202751f7032b0ca40cf5a60cbe805779735f9c5a69fbf1dfbd305f3a4dcce9bf4d1c35f53c1206513a2be406f39429e33853e69cd83da1385806400e982b512e024771b7b2d06545f168bd933e87cafa0ef711e15397d5a584e90691b5a743fdaef477d9e0dda61732bc8c35a91b8784e29024adfcd0a9ce3a3e8c50ce22cbcd7a417dc44d5e07759ea82ca0fff2ac4d76f7df436350b9f5f743628221c3a6d9d0a0da97f9aad40b655165638f64f5adb48ba4920154a59b2a244735dcd58cc59c5c85de52807b22858164cdde29aa3d75c22c4b4871f7bcbafe7f02fbd884816197920b4c6408be6e469b0dfe93e1e3bd6a122a48936248b099367c15cfac0efd90ce7210097d12d372159da74704dc33380d7c5f8fef79fdd892f1f2aff7d7c5ddfa5be27966c53cb5c0a15e842c0701426cbb6b3255b503f0fd55fc343911edea7e8f5f0d692ead1138c6342bdd60148975e740cc7c1bb301d06f93743529303a1d36685fa026b3d14922a33e9c58d0b93be48ba6668f28b71d0ea9ef48cf6b3e229c4c903c90785b6204fdab3cd35ef377b260e92a7bbb957c444ada12ff9bed02b298f76f85c240855631eb085d4692d231892cac53b18aee8f135bfc0a23b5bcb08acbdd8d76815fd224d4f5fa46a78d2876d6b297d8539a524bf6f350542052894474c79f352e4bd3bbd9ce8df939dc5ede20c73cf52394b8ba6634d3c703634559e0e5795cad6b3b86395a2517c8937eff16972e25fbf68cda4aa4ac57f3d424cb554e0870af06a58b0d5773148d951b4484d8b8d503cf5a729a8d71860d97917019207d105902cb530a0cb60449817ffbb6b3eaf0716cebdd0037b2520425f742e4623141c15def90ab0667155e76ae989ad2a5de2de7f94d067c77b4549ce9a469a76ac421d490e5a0ee80c76aaec653b088c34cf9e97f2d215df8401ce2ab2a9027ba47719358fae4d1965e27a80bdc1ee73d97d7280363cd470b2d34b24ad20977267ec5890ac023969057970a706b46b62fab18a77b33d38bf342e3a2edc714c4f928b0820970fc1f0b889dac06d1e46c4f2fb265e640805e803fa4719a75e9e569053123f4f6067047d563cab201f9bb8825cca6d58dda777c2207c24f09ef1f4f5ce0df68a77cfa017ebbfb1c013d2f388df06efdfdaf3823ceb826e9267ccc35c2168c36994f9bb3eea99dd1fbb526d7fd8cc8b0a090952a8ec26e16f25b2abff7b741130e20f462ffad95e3e0a078b142eba392aa073bed2b4e402ca8ea3ca5c132717712e2626e0ce19848bf651fc1e78404345b44ede2973682253dcbe2efa357c29c45723de7978c6e312bf434e122898d28be6fb28588b02bf1a1432d5a06ea0166b05b5d892a10eae7d7da982e4c934c2a2270bdfc3de571e751cc1ad7d61c7006d29128e89b211bf372284a73d3128c014d91eef3dfdec35af458438fde74befbdbcc23fa33c25bf4b6eb41fa84c49f56bb6c29dbb3d65410f55ed2fe540e190030772e015432e862adc29d6fda5f022e08f79d1ad109df355c1a8fcab7a2fdeee105e1bd7aa249fae890b6ca9217663bf634d443488d87591f748f4ef3b6322c65e6be20c2d97eabb2e253916bfa9ef56fcc8bfce51cf9147a670c7a5ad3620c748531673411f49266229e8b94e91fa4e25c79abe8bb3f6e7821ebe558ec184fc0a143eb6ba307dd73d4e1062d74bf72aef200d9ce5f77cfb455577d61ea87bc22e6431886c426d406e2b39a6f7cd0dfee9c4832e78cdaf407746a71c70a05fd0eb7aeffabfcbf688a64ac87e32e5aa58b527e1e20c87fc2ff5f524c7b1f98bf029c013cb7136e84f017d57d19372ace89f81fe8bd19b6bd03b23f1b8107ff3909a234ed3fd93095802480a06862aef179aaf05222cba3d6d06c0363f0f44c469deb170c5b2a1798b74baacc269ef201796422ef091c0b3f55e400acf87459acbf6aacad678747a96ffa5e7e8efb9f1f47fedb672da6772c25f74c797237eb85ff14c15ca3aa68b186fcd5e8058f4d685529fe13ef2342886fea5828d0fa02d4824a96d86e31f6e8286db96d748405701f2841ae18951c5af6e976b8498f3eb075d7f3e56880d67ac5df6fa7971fd45fde07966bb77d338c901f6c0d22e3ff50b79a8745f6ec2fbfa883ec02107823c1af433f017bcc302df7b46f39ac5e995e8572fcba03fd622b7aec836f0b1b07c21c71ef60c8bb597498fe8d3f372ba37e9b93a7462d2d7e30296accbda83f38b3de6c4c5ce9329f385e83724ffbd41d8132d440a97422358f3d36b63fbe1f7fdd8fd488736427f22410865332f8719043aed2022c47efbf5abbfc0f728677a0fb77ac5680f53ceca30ffd0bc40ede19af3846c37a3ffa43c8e8c7f2e209f14d21dcbe8537fba5abe397df2145de33eceefad62a2ad3dc803e3f2abfb6593afeda040c46c585c2ccd36560fc2f2dc9b9966eb253b588a0e1c9a0c8f24162a08c73ff7cbbb2bdd05c85ad0f9efac325617449d66c23a5639ab3d0dbea641ae3d8f05bbe2f7714514d02181b002b4670e2fe88a4ffb5d3f60cdd84f55411d09ba1bfd238fdd4ed685848a7a2c8d32ac9e4b9a4649fdae9e2f6331e6403e3ef053bd82649fdffc3c7849af87b8d7a06f4b0f1f8aefb6542027af20a7e741af88d18ba5931af4e32ade4dfa9c5faa7f60e9a93b75c97cd6df72a8e3f93b465adfa15ec00bd5fcfa9728bcd1fcdd61e9a4d6f451829b7a45189db8b5ad434eef3fbba5e43f756c8b4e237a8860ba78b0504f8d467b9900eb3f536ead72ccd2ade32ade4dfa96ba1d2f58706bf23bd17b8a9a832be6c0e68861b185aeede181f4828665057b818ee58584b6bce9e62ec2e24cf4d8161a1880ae39d1fdd276c5dbcbc9632005427bc990e2a0ad1cb0c543fd97e6ef7a4de36d130616f5d804fdbbbb5c05744c3bdbc4797d80fffd3f9cbee8b8599f8ae0222057fc083d26ad4f089e10a770deef3ce9829ff818d68be9cf27fdee70d23be22eef21d0a78998f837e5b60c316b4b057260f1365905b9cbe859166f1354bc47e2e9f1c5775e601b9a97529f7e921027de7be1a167232d579f7487d0b43ef12e8541dc1782c2e05b68f045dd8d1e07f43c5350ba504efe7eeccde79e77d93af9ef13c45ed1ad3ef8e2b82d2943f7a7c2931944d47f71725c6ed0b757bc9bf4f9e23b37b439bf504ce2a9a00762bb9abfdb6eb26bbb7820818a5cd37388b96670d99bb64485ad32996bf05821a18bbfe732fa517cf9bc85cf2d43e8494f90b46502dfca810af5f862382b64f2980209584cbff7cb05249165f528f195c0533f1b7ffcfcf1f29e8cc6aefe76dc3605109714e102373d078ba5ac71a6f8a581c02df1723c1706a60660913778e31bc07e79592a8425023b2bb0013f142b4a16851ad8932d59057911a367d983ab193b35103daea822f1f4773c6af71f4f919e65dfc543f20ec0669cd1839a7cf81e60aa89936209912221cf85425e3491a937050b356d17dd5fcc70f270a4e733eac007661d7cb010690569a3afec23e22315bc3d4cb9e35951aec5a3b4f45f6cab1379473cfd8ddd934cd3e70616e317868637513c656baead776d170f44efe1138e429b02a09013dfacacb995c9969089c059dc7c0faec69bbd5b7c05f1fdd3734e58892c283d3162c2d4bb5a12fcd2c4f9d60a81fa8d306079a296f91d5f1105680156437c5723148b5fb752fb53f50dbea7d698dd78d81a7f5750ee39c4fadd05ee014f3cc0936c6aa92d7dcae2b2a73d2a3e0ac4819bd002492f3e1127d8db2ddbc0b9428dc9bf527c94aecbf7648b7920263dcb1e5ccdd8a9c1507cc2b6075758bced4fcc87bc31a0cdb5d70871d075c74eec8e02e1d49b14d46772bf6f42522ce499e8901729148b22e1e9d581bdc8f09cde2c503e575875eb65592542b47ba6f30f53fcaccf63c4f4285fb69051305dd754a4cdad202fd2b849cfee512696e3a0a7e202cf6d8a5f31d1c3fe0adbf2da3e1e08d22f93e6b9bbf87bb28e4de849789690492c5d4fbd47d33fda2bf72deb864bea3b9342f09885ad435254214e959c5fb1fbc85227c5e1e2db23806ee2a6f9dd5f2a9fc71a8ad347c4faed748ed7d3af8309780eb1d000ad45259ee02c13a8280ab8f20ab7af9945f07eb204bfd8f80fb75ff03fe2d7325cc507b314f96ec17ca20fac65f01046127a963db8ec215e1682c94d1a8289e22963530677b857887edf0e6db8335d88c38e3ffee21e384fa6052af65bdc02d84241522cdc43d16b26965d6203e305502b0e0a8d49055238fdb653bb0f979ed28bbb757bcd4f9f2f715ee8f65882f6e0f34dd06041fb24f128f95a46cc03e11e0e4649807e62390e1a5ce67cc63d4aa2f764f343585beeda3e6b2054afe1467fe09e83d08b8ee676eef68e350752929089ece832e0864617478a2ba396947ff00ba61ada6327b0691b5b14a73a09bd5680e779e8475f11f1c7bc26333ca24020ff5f2a5eef79ef86680125b7b88a580c3f18630e834ac209d4baddf5d0666ebe79803877633f3bc9751fe847a2305948b6b99e74b26dec9bb9fb305fe3b32a561a07c9f6e002fdd0b8d4dace4384e89b7afaa78f7c23c4e9fb5f5a7b1a0e386b3950c116043f30210f79e93513be2bf20d0cb24d2f7d7849f7478e3ffd7ea93886765b3de323f9630731b47bf720bf812404dd1ecc80b184f612242118f4899e97dc2032e927db43adb97b703de5fd7784b0c46cc46e5d8be7e069975f291addf0dc42b2c41a6d8b60aeae80a7b44ad3427064574b8ba6c5b256ed298b444f88982075488a2c6eaa70e0277a8581d3d0734d7a7ff8cb5520a03872e37e6f2316f81e5bc0e222055014908348146fee04ca43037ccd8c5b7224079f6b7f708b5c5e778fb2b0546b240bc942ed7af65838a48b293e6e79ea106f20a461d00f78eaf68a77e0dc830a846014bfe83731dcd9ada59cb8773f36bbf2ea3a21463c7ddf19e3e70b31e0f1821b7ae3fc9a561f29d812e9eea460d20628988a50570a4261742e4b886d43eee317ed7e5fd121bf0971d90d250f3df78b1caf43db9c35e942c9dfd3de24bfc2dcc66f6ca2e7910bd902f1380f19053ccaa6fbaf191ea5a2675df3e3f4d5f35e207984fa93e80b54696dcb6bfb78202a5f3f567199118f7bb133aefb00372a30636743377d16b7ceaba74ae7a19e12dbe1fcec691d3a8be219237617eddb8357d4435045b6560c54794b59497dd8fd432d1f1f69a261fe08d712cbef6140f9fd5d17ec7370caf3521fefe13c919515df7f7ac700d55fc351491d93032f1ea709d38b9d05ad26d0b1ac527832f081e8df91141aa333d959c5fbeebadc6dcb5c2f0bb277696237e5aaa7ae43523b2178da13a309c5f8ee0467a687d5f38cdeddd859a127ab700e9bf4b5c2e615d3818a778df39d1acc7626fac18af728def2f836030e5b2f44af2f8e7aa4f4092146653df8c1d37f15e282c231df5c8b1d0c5a2d0244a1664b759abd68f18282a937034a0fe592631e1d7c459510ff77cce383a7bd2e445bd1f1a419df49f95a1b7a75503a0cc23c11dc59a299fcea0aef9ee6fce2d17c633933ddd67f7afea13539a2ef592bde13f69f2832e905e49855bc6f9f6bfb1412aa7aeb5801190aa3b4c657781f35e0e20ab2f20d3c5b77101540914b4f03361ff7111eddf2305921e1de8d879eb72f16d129e64f15d9fa9acbfefe6192fbff53ae8f92fc5db6cb311f9ebd60af1ad99eb78bf7a37503e4f9c50adc14de2d20076a20c6e440e1b142420ff7990a07f77ba4905841a9c70b4aefa3ad25b7cce5fd038584b1d0922957f9baf06f7814c60a66738de79215d6c60ad1a8107338701a0fae41cfd516aa493f9fb5ab6bf21b37be5cf69ccbbed3e097eee3fd96766acb8cc373a4437a5fc70f0b7174733a7aa00d60abe3156c814d4a29d4e5af9d844e4be97d81bf13c4a54e873ce999786748fea6249c0f5ca33decfcf2f6a6423d935eaede5ac76cdf228b673256f727d133e42ec0afc7f865fd17777e0876d260723c562b14f5fc96358b9a796d8f10962d3d91af69c416456d2e3834344fc76378ac90109689b650c9d20dc7d3ef94beeb817b3ea11875c280b4a8075c7b1254e95966fe5ddfff9f76d9b6a40803ba42b4df6187b17bfb039ec79a7956dc1ccba26233172d3d1e6ba6b52d1e6a60a101f142f242c28dba10f7b7adc169cf21183a0d83cfe6b5838ee983fe1c331925c1e22dd133e87bb62484728d1bf43c5bfaab3d4b8cd3a7f18bd413215ab75690140779202d61886905223d11ef786f98e38af8f4e508e8e536c92f0ff959d6209286b878fbdab305c3c00d7a4d842813d3e7fd972cc455a45722b7830ad93e1e881bfd87250b443758ac9030acfede74fa5cb0e159c7d2eea5ec2c6e1e836fdbaae3cabdf602b32c2f9da71386b03500df84cf766de9ad1bb6db1566d055c0ffbe56dddaec99fbb631108d81ad073a7990c9d6b6bc246b5b34307921a1251dd87b5e3cb7e91f1ebcbc87bc1e06dfc16cb3281ea748c07792c55b7b3b28fad981f160d24b9a7cc2e88739ceb28c38bfc9ea5402fc0bd7512d215add06c8d64674d616d646a2d95b03bdf7fd7115e731c1c30964b599fc06179b13f2ebf15dbeedf38da297acff8259a389f90d26fbf0fe2b37e8d9d2dad11ee284ff922c2c315bf0ad44127b0e7393669944f1b8504018f7299c2fbec7f61c220f84776c146f7d7bdb3b7aac10a2dbf13d1677c1eeb3fa842f2a80a274c33f3168cb5b4fa258fe70575881f86da1b3ae3ee0deb4542152f35bcc39cd4f948d0d94849e43dc11af9128e495d83afb2760d1d144685a746582ced00fe3a98496a73875cb16128a7bbdfb0cbeb9e5e96a45926ff24d7c5a166f93b5c31cdb963c4d7b7e49b72bdff48a69d7a0a7e983de3b6af342ffd28be9dcf3600ac42f54f4da791da2060ad10b7a50890dcb66f29bd4830ad4d524e93f9b47c9f9e51e6539a3c7e538d7a4a7e917690f15e5cfdbf2da3e8be8aa5a80bbf8bcc17ab22c137b564544ddc77096bd2326eb89c7051ddeb10acf15f57e7efac1ff1a784efffe8ae71014813e9c9e200e8cb21d56af3d8e306b048eff512ebee9605801ff7b4fb8f0825f8ff1dbe53491bec3ecf889c98bdec5157fdc11afca82b285063c6671c506ba69d1f56c5e41a9b4d80ed8a46fb75df7a92096e6db9eb64c3b21440c3e83d966a621656b876cdb963c8c3e4fd74d56b0b98915d3090c41d007bd7e5e3f9297409a2f656561f13cbe2051d26deb8fa3380f246cb60fe797cb41805fa33db43c153143d5ea5126996f2ca1b200bfd6746e4e1ff492ecc1e59df85f12c212b3bd68e0c76ad9101e3be33ae1c014b68a595bc884151226e85885a363bb84ba5d3be016a93486a64ed7854fb0a1f45e40d8be3d85e5a9071409ad89b80cfec12e87efc61a075b17b7f5860d4b608186032ebd61917bf602af307b2eac9eb3841ae65ad6cc825b4e6ce140224a0923cc320ca62dbbc04d791501790d839ed90e82d19fccb6e4b1574c1bf4032118cfe4d70b564ce71af42c15d3090cc172e08a5e85d06748a691e2a050d5cd26d40587124a0fe43d78205c514536915fdede241711835f8bfc26283f30e9894df328adfdd75c8f72bb5cdb672b13da4a2412fd816b72c287b2421f36303d9bcb99bc90d005ce2d26435052af4bdb31234388a37ae6ffb92fb671d78ae358c0330161d3eaad1a6837525220150ce2f73f8c271206c422ba5e03920a73f8f9b7add8ffeff2df4353960dd941042d509b0270931494da423bb64a6fbe66669383bf78a76e5a2358affbc04f389ecf80651bdb4287cb6b79423eada138d0679b516e6cc5b4675b1b48bab6a1432606fda46b91d77ad7fb7b6039439defd26090a552a8ea2606e31488785e4cf67fd7f4b807b599fc7ac93ca864060cef3fbb47e919f4994769edbf66eec1e50ddac2e9e9cdbab68f07a24258c1c530d352a0dd4bf9c0d96897532f629207825874924577746cf76107655d7081101dffbe53e7b66dd52704368fc3feaebaa2f64605b52281cdeb44d0062ef0dffbda485801adf890beec2b9094c753d7fa0aa4c3fd3bfde94eff00a172f1564affe4ed99c022e7169dc23736db2e5921214da052856c424b582fef3e5a03b1868ca278cc80015f8158b82d04a3cb504dfa939379668943880185cdd706ac21183e719af4ad15ef9007c775a6fb85827be51c7af8ae38ab9bc64b2205b2c794fd3a75fa428ea10f4207ec382e48cfea416d24bf493d289bfcdafacfee51961bf439bf36cf3ad91e5cda10f8ef590351b94bb6c5256aa0a17ab3bda6356f304bc1f024122c62366bb1953a36a543daec2e63853876af734f2b54c10aad38d2b02d5fea01e6ef7c9b6bbec74f4071b8e2f779b9806105f44141526e46f4bab7d5e9fe00bfde79e2e8a3134c1cc916592d9b5a5a074a320b976fbe19b618145b7a2b45a4f1c6f19dcbf85696a6cbf6760bc4c293acedf1104cbe99c5d6ec8a69aeb0051b5fd6104cd3e9a4d6f45ad65fbdcf3ff9a2331f9672d323b4418f17185cbe61e6b4748ef3d73e8ebdef9c23fe7970947e91734c7c7b04264ec3b0b4f21b0c1945e2bf7b63f70cb3f65f528fd2c2afcdb34ee651825fe97ffc776c65e2dd2d7a4721af4c1ecb2a88e94cf4b0ae4c0e1b38cede8eab10557fb79d113d5c552a4baa668568cfc0da48763c2e5008d6e9cb9dc5e07b8438e1a00b773c1ddbb7b73819f0604054d2ea5d4829c445a12d0c140747e1d2d2885e6cef96b8cdb6d94567d993a7419e07f80d2d938ae3ddfbfaf5bf588856b9e9a73cf08c4854d14bfd659c711fa8e81d8afafd7c76c6fd4876a6bd3ecb5bf75786f13e8f9d40e9e9c56b920385931c3cea6d4e0b052e6f847819fc848defa509295f2bb8c467f1f38ae9226b653ed157f42e853cdb2aa67bea1d194cfac18a7793be67a9c84e5ef19e983e3bebbee3f53b7e70e435429c7ffd9dad1f1821c4d9ab8b6eb9f45121fe9c5efcd5e819425cf8e2bd839fec2044db833b9d3a647682f618da7485b7955fcf6c0fcd6fccb04c5c419e6c070cd67f62b296df9e06fdd8f8189b905f9b7c8c35e7c9d859ee6cfe7ac74355cdb6bc52b60e591efb8fdfcb66bfa5b9ddcf962eac13728ecd2c88d650288f24476c88c230f074f10b7045ab549ff0abf032e039f821ac70799f898f067ea6889ee2e15c2556e1ef61d051efadc47bc3f2cd8a8ec233804744beff5dedfb76e9d6e74a213ae7ee5a5f394988851f7dbe68d10cf58a86110ad2aeb41edeadcf032907a423631f071e018ee771d8e6b6bbf07e0795c2b4581e2a54d04f1638bfef98ab0f962dd7f6b78ec7bc395dfe385a8c4af763da6384f2cb72d05ea3142e9522b5e7e2283e1a7bf5e4002f134abdf652fd4167d3cbbbd4dbc33803ba549f5c3e0acf293c47e192bec2d31d17f8283cb7187801de1fc5ab0fdd307ac50a213efef8d59ff1d9faa8e2da5a138f6e06e9e37d156c64e7a0f857f7f483a674ea24db65c74eb346668ba0bc66002fc3f7f712fb01ef85efcd029f6183ef0cf05d06bc12f488fe2425cf12df318a4fd5f2aae88d52b8ec0793fe18d0cb51f4a55fb418f76502a7e7e800d47483df9c00bff0cbf57822fa99c077c4771ae32bf5bdd4b6edf712a275a4ddcabd4e95704d7af77dae95b256975ad9b95f13ed3117e335037c4614bdc0f81d13e0b757427e2b402f205f49e6034bffc9bf621e73480ecf30f8b5cd37acff02f3e228d02bd6e36314be338aaf98b770e70f3e1062c1ac590f2c562d163b829bc97775b582fae454da5d3c817c1b5784ffb03d3c90a1d87a90a5d906b22b82a10dee1a96e3b9309e4b1cda2057317022a1356b83870ccc90045cccdd4ee879cac5efca7efce4eca3fb623b6b7e1e8276d1fb2ba8b7af2605cbd748a8d23b0218165be772f13e87bd3fcfe4cf57fc5ddbef3dc6df9b28fdb58e6fded53bda5e22e53d114cff8c850c9565172cf4324353d93c446973e193ac6d45588832991c3c4f6b0a5be6f2b2843a562cd9f6dc96906c732ba603a18c9eec402916e24a5a316d5bbc4d16e22a67f42c8bd9942ce0250b716d6c7b3437e4d75c7e75882b69ba6ef3f82ddaec1025e79f3c26d7e097876ab7cbb53d16d1c77b9fd5bd99a083b9c0bb1b5d48e8e23e72595ddca7f06c1d7337cee26e6e0c9ec71c433d53f6e9226de78ce3bb0d3af21ef5695a81603150676ddd68427da00ecbca7278e8886082b459f5edcd83d60247dca60b24c963947c0e5a3cf2067fbbee218b2ffbfc057f73c4494edfa3de12cd99e89ad79e939b793265b2b5ad5c8db3b52dbe28acf0c6bf37b6a4f35e6cd7a60c49ab3c85d9227fa0308d2dae0acbe2ad6e4fd09bcb0e94d28bb901c3caa4dfdcb468c29b5b31cde421704055330d8ba4ed212c868b7db1b9697e2301c5b479fc52d2446ceda579fc0a937ee0802a7b01289eff2fd98db7f1096f8775eb445c077b346144f1e0a2289b5002f504cc73b0580a34619162b26655d82c66b61856fdcafa57e7ba427cfaeb1b67bf70b6fa369dc74ef03d40f240a85e843c0fc2c903f81a907b0604052e97dd9704ea1055317b1f16f77581a4541c7f1e72c327fb4d1162cfa507b67cdf5fd4ac087903fd4a61bd379965719c5b5e490abde20a09c3f8a6c472d05c4545167e845978ccd3ad3fa2eeb9eadec2bc2249f0262e0fc71a5b2d455abc1daa0bffc2e0c79828ac3b28d82abc7b363dd107dbd3b2381eb46c153ddb1e5ce58c5e7031dbc57711ae9edff40a72b33d62f2602896048bcd090dbf00bf76c5caf92d4fc82fefbf60ba6ef3f8b5f45fb33dca27bd89629b5f5b6b0d8426b04a05e3d7407a3dd9efe5e356c8bf8543571d70801fc3c4aa8583804d1831c0a93ac61d8dc43b154e4914cf54e548f2398557a23c29ac7087ca95328147800fc28e5548e795cfed07fa613c67c64623c0f3c0970bbe4a15bee0a14fa68d8b08f1e5fac805f3a020eadf04a4d8e277807f56509f6088a9454f31f466ca72c2d6283a7b8b26fcef01b13641ed9b4c8184ce33e984ba034a7a47be70daee6d4f12e2a4ab463e71d96142a44fecf0b709fe1ac7c14e64a779d176516fcb75c64569cc546b0cb27d5db4534114afd46b10515cf6978baf527804789e8ebd2316ec8c05aefab954cb41947bd98b613ce7e0be30ee73709fc2a7ead873897a3f62fa313988e26b3bfd7cdcbc2384f86cda9b8f7ddc463158f7a882b5470222565cfb06fe8e359006f49fb748e82bebf4031f89ae81d477ba076b20fcfb33812bf9cb51f2a7e5ab92be57f99b0ee199c023c01dd6be33f59a613edaa94979d5f4757bc2bfd5edc9fb4fdb2b6183df3c46af8202ad8cdf4a920f3d4e0b412d8cbbb3d03a267d27497b503b64425e74fb307948d61ec46fa5a4a0e8d1bce25af87512f2cbfbaf02f4c2a057c9f905ee30fa167e05f1e7825e29a35fa2e8adb8675155740d64d2ac8fb6dd1ac8d6522098d8e237d98bbe4e4e643d5fea3b39574e9c2977a6dc72b8bf9d334d2861085c05f06c35409c990e2d299b1d90870e70f15ca9a06955e111e079c0b1062256811b5a2c2c8580d3a27b09f03ce0b10110c5d79df8eb159f7d26c4b41e13264ff2f320de12f7345cabde5c3b5dc1fa6b00bf55d0efa0837f1b58d1b1a310bb2ceade316589103fcc5ef8514d0d38a6897e0af08780d3444f0aa01438790ca4602a4c5cc3bf03fea4a01f52ebfcf42ebfa55d20c4397f2a3ef01cc9ef6e55fb3e3579a5fcdbcba97d4ff987bce91c71458bbfc60df0d862a65aacccc7845c02c59ca7db4f097405c363eda9ee77f17c312916a8cdc040b44ca495f85a3db08167a39f676a3988e0bfc46714fff5c455b77fb583105f8c2f5ff3d93fd49db5e8afbaab814361d420345987ddb31a707e858ea24b8a59b30ffa47a7355281ccefe88cf44bb91cf6fd3401e4e27b573b33d577e9ef75f1bd99e0bb047c67826f931eb56f362912935edc045890903e53a8b23d39fd4ae061f05f9190bec3e897307e31e169032fa6a8ccfe2b019ed7ccf6d0133d53845c1e92b5472c29210b6f013dc8fdc6f30bfa307cb46205fd08a36fe7b702fc0287e2d2e383d1cf54f47e882cdc3faa40e67e3af18faf403021ea45594c807e0867df1ffa9cd2e329f9ea7d53db0e9013999e504a9927518a0ec947d64aa5d960b109857548a5c5b219048fc645964e31d3e415014b44e198f81a3eab7f66cd0b424c3ff95f9fdcbaaf101b0a7ecb589fa9beab1e618c3a84b2ea4881c88e69f9489b6ffc0967c053856f4fbc5188aea17de6de9c26c4411dfb2fec7982103d4ee9dd77c3ab422c3ce0f31b964a8bb7eed39a17424fc4dacbbf52f604de9de15024baee64490c4ffd6b8b23529f136258f1b517f4f95a7a1abd073f7589e4ffc05bf2863f34d73f052eedecb37c3ed39c15ed4f89b64b816a778b27912ba23965daf2cd648adab10ab883fb145e499e04fa23a6384af01c5ad53291ba946dc7147f29b27df2b545aede93670ec4e5950b2eae9053e4bccf663c3c1f1e07f5572d2910f2440e347fd7d975e441ee216787d107a5777e497a6ead3b7d3c72a4889727d56e427bd0ea7b33f44451827623b98f44d14aed4147c0b7c2631e4821be7f1cbe57194236455dcae897980a35c06f6c622b01ff9906bf79568fdfe4b752e305c0897ea6413f93d14fd61ea4b8207f09e43673a3daa342d3e386cac6f25b62d00b7a50aed11e8e95dfcc787eb5e27341cfe251ae7865d15dbe02f9f6c64fbfdc760a24d572e356bc6aa755fffddb3f0bd162c7562be37ff7105384580b6f2835b8171d289e70f0772fda615e9ec245ae4713be8a090a86e7295c60f15c52a5fc6b81f7e51a389d1406e527bb279a293f7b69c583e33f1162f5c0a5ed7e3b053c66016262a7a36e756260b110832b2ffde06f525186faa4387d7c8fa34244fd8ed09e29b7f80cb59bda39922fff71d6f9452f2e6b2f3b2fad7ecd47e7caceed5abb6ab69c98aafeb5e18c6fe64bda4b1a4eae7ad727ea7cdff896042f88a57ec7a79cd9e2cbd633846895d2e6c17d0e90fae0a116bbf798247fdf3ded8ade55f23d53433bf4f0155cd851f6f60962a03fe57858dc73cae94b1d8aa9266ecf32d51f5e2f6f14dacd453ba9e9b40803b258b5a4a73d00e0346121e6ec50619deb94e339d5af61e0aeeee772c66739e353e143892ffd1dc5ea6e2d07517cd590657badf04bae1e93ffbf0bfd76392079162e703a03fe13615e11c05c5f8978ca4fb9cfbb25f66b549ea254e4305738d6689c71e057cb25e4ba58f11727e70aa7f6cdc5f3114d4f18df4fed51eed0da05b5a7490f752a7457805f4eafc2c403fc127d97f14b6301df238a40af18f404eb3f6a8f5cc66fa03dcc792081dc6e647b00af30ff1ee097e8b949f80db3792af9bcd524bf02f22cf1c4f489df89dba390705b792071b1fc5d2ed8f352ffdf6d77e95c71913f95c72c9e523c0edc1a328944a13d26a8f03ce6499026cf77a28122672ad64292844c7e7df7c7a73e94137064d65357bef28a62b01e057fb51d15a41879ed55313cf7b6337bee2fdfb4d3d2ac95637e94f416398f473d31b2204bcc509cf38833a3bd7c3e7476ca91d9274a45b0a4e55561c941ebf5e9f70c1922e19eed27f99b15b679b7dd9567cafb5aa7b7ffe02ce9f1b4fe579b7f9d2127c0d4c6160f1c3b5c3e7f7aca80033b487a5f398bba74897edf587c5f217ac1c5f715e2fd61b49fe939104eae7d01428a654d87f8b4255669099938da9388eedd2365a22dde17c6fb95f4649a9e83954f41b8b6f00b0dbe9805fafee1cf1efb9454e86bd6af7e6feda1e837788e7aede311056bb06b56dd3205297b8b3c11bf42216bc881ed3a7f293d909a8e472a0f24b036e002577b15e5a8ef6dae076db53c4b21bff9e897580846b5970ec1f0b5bd4008c6e457b72ff3a06cfc06d6326c2118e641c5220a8e41df491a51803c680f44d12b65f49bdb1ee411f39027e7b7c2baf6c2db43d1b3785071f356b3f88df3d84bc07f5e227e7f58b06848d403f9eed367ffe3ea40b42527a7b20f1e78ee81cade92c98b1a2e5fe81f2c434741f6d495a10a1fe8758d3e333250d9a94ab3f22d95c954e1cecfe2a60387eeb69cc5ed253e8bbbf2d239e203ec1e4a0ddb8833d21b309134ec8bdfbf92f3c3f893bbec7b9d9c585e3ab0c758ff88db2fbd0bfdba095e912bf9322be0fba0f29e57d2db2b8733e2f98c3be33d17f4a892351b7fa7f6cb36db13672bb3b3a1637ca25296ce92d7edabb34050290b9b932a673d9da5427c16197c0ec711af492a86359f439354bc0f44ff4ee67c2abc2ab476dc1239757fffe3d7b7fe8423a51a719a3459f3d8a54d3492cdf70c203c138f56e38c424f6f77bcc794a79ec0e90cf2817a13cf6655203751e1ed815ed315d3aeb562daa43f3640dfb2434380df9189f8f558e5bf673f233c71457673e561632bc8f32ded413b2024ab20f72cedd133d01e43f15c86c97f604705ceafd11ebaff680f35be6303e7f76641e5c9dbf0daca1e08d96021dabae34f7270ded4509b22e13e27f72eecf6a1fcdb8fa9837b5f29fccad982e83dc54e148a7f8a0ba37095ae1ca7ca4e552d9121a87254e13982b2b6e6aafb6091e2140b0ac188bdc411784ee0b9cc785e79c57bcd37ebbf59f89d5424f3befa753ead6d7ca9602d2cd4fac142ec11ea35a59d9c120f7becc45f1f978a24f459e8881d2e13c10ad45845ee06bc4fe17d54e5bd3345bf3a33099f39f17ccafb72709fc2ef465e382a95e32a93d3f13b55e62a3cc6673ae35355ca8e4799232abfb5bf8837c6f19993904fc2c7003f5074c073613ca72c39375041adf0d1492adeff09be5721e9220cbe4a15befcba6febdf9828c4ece5ef957d75bfe2a516753bb4585e8bcaf31aac79d41cab60dd170a3674c6378ed6df2eb2661f98d7e945e981ccebf8eaa874115be328831c0f42bffd13df5fac2dfda62b90b9a5cf2bc8ff097c2ea3576aa9201f64a9c8d6fc6afa838027ab984e6f92dfa9849b15d3baff908517b76341f32ac87985f7665690cb7e1a0b3c2721fd58c57be2f688f19b6ed0cbb1d0b3f36bce07d47f15a09741e32c31bf2b672dba3eea814cfbec95641e48d56b0a363c06f87b5b440fd429c0e9d27510d2f3d9e3ed035aa7be2f44cbc5adbbff692711cc0629c59444698a3cc445e9bf3aed4de17169a04a40622118ea10c55d8e0e7544149389171bd3fb75ccdbed2d217ec95ef1d8c77708b1f6b39feefa0d1349dd3e42b45f95d1d5df96fad813fef2d66d2b84481bd36270d613069f3c64e02a3e3011c4421c6a5ad2218924d966b16c1285f345ed4148bb8d40b16e6c9a2de793f89aaa27e864a102b8f2ccb5a750046d499163cd0aca049f25782e137c2a9c87cc4a11220a2344c4425c9f5ff476b749d2535cf6c482c77ff841fd81b2af74e88a14c859c0b1cb320dc0c67f29a8f7f3952dd3ede6ec99edee12a2dd1e9d0ffdfbc922b8784bf254aadb75a6c91f5b5ccdb32edee6b1ef2f003e135f1906fda8bcc5a5eb2a7ab6e403c6afa45709dca4b7b1fc9201a443386c3cd8b3ee4cfa7cb19916edad212ed06f667b68c5c7435c443f9875d534bf791b1b924bc26f01e805e60393dfe58bbefdeadd638458f8f9171f5562a6ac4356282581105ebdb3820d6f01feee14485801ad402a002b01df11e2a7ef97edbde25669c1753ca824da22e7893fb5e9156d10377a139d3d3155ea784533338a2749b3b5d601500cba97eee07cd06972a24b7935e59bd62708b1fb7dfb5dd44f7a22dd9edaf74f6de590dd6bcca1693dae1562ffbfe4b62a9478cb35ad77df7fb89d4f6bb6190db05ca530e574908ff76781cf30be2f8bf19915dfda4eb06e057b046d629a2de773aa4e53dc0fef0fa37d2b4c3e2d69955ca1e604d2ad238ccf089ea3892d62f019cba251783e14e654f24415fdba236b7aac5e2dc40be7dc7be413d270f17ef56eaf437d07d5799002a9c1e697b5f38123cd9a62c58dbb8323173053fed6507fbb9f7db7dbf2ec97aff06dca2c35c429c9404a53259e214b14dfc9fa3fd34c7f4dbab657862c2ced295aeb5f14fd4a4bfbf2fa873cbd984efc6736c56f5c9658627e0ba0e86213a0a217933393be3d3d9ce8170057f4820650e6c6b4475c9618975b17ed53b091ed5100fe938d83e6f14b6bb781f9c0a4bfe0da99f3a65e2ec4d286f9e52b919e54cbb20cc910aa56db98c6d640909efefb5320d4642e704c797e3a6af51deb3ef7ffbdf7f8c3e775f33751bb2ab5dda17ec8270c4f424f046a00264bb30d4c287c51ac0013dd384cd08360b9694dce3a9ce7bf0f0c7dd5e238e991fcd0fe929e1749d8b7e3b707a609913a33756c863f84c9420f2cb6f1c2246dd917824fc2d57d194a6126b0f00a0cfae1c0c054f793a7528cb45b72bd791aa85600cc62aab428d46cb8de3375ef96e0b94cf05982f6cc447b96804e26f82c019f0a8f6db2478575ea3dda1223cb0b78d0b233f99c4aa13933bd7445d577f3df909ec55713df39f1f34e8a73aaf3a00156f30d202990f1c05127528f901729104ae3f525e4b76f574ff57baee74b474d1979bbfced5ab14bab9ed1f62835f82b259ccba9ceae528aa61272a0e5ded24f836893cfa63de88d586cfe7ff2be034e8a62f9bf672f9025a380ca9d020f0e13064cf86ecf848ae23360fee9617a2afa147366c02c6605b31ea2a21c2604c4802c0a2819942808778020395fbe9b7fcff6b76a776a76d8232afefb7d1e65efcdd4f4f47477e52a1c50011254d0beca49b2ae0a7d125404ef9918bfcf3ddc67ccce433f27117ebdfe0dbe60f765cf7c308325d7ad12125ff5e7230ffd0c8c9fc69bb1cdf908fa7eb94c5873c5f83de39ddef8bbc73e3d5433e6f3963fb601ebbcbc25a09044d888fe9681248110646f44d922f287dd4540d058f200e1905e596e29d8666d3267ad3b5c1fc80736f8e6aaabe2287016473e93ee3de18112a832c9433f870f428adc2537d448b41fa43291feef32e29d38f26c31cea481435244463f9775a36661e7f838521a678e679c7ed5066da47cf469fe32f17c332e252487208e890f408cb3bb6f434680c7f49373baa6df9539bb7e98a75c739f509df954040104354bc4a9b884798c52e3c6e7bffa8626186b162c7b6e3d050e529c07241092344a8fc7efa4d26a6d6005d2f53301810a8b332de8959655d079e3156e40696b6b73e326f1848e37fc5d98475a8761338fc954b13e158ce9e7132324f0258d9816eb404a904ca899e3eee1c15fe8c59f34e2bd95c9fa54797f45f196a3f461f65dc9bf574dd487d8f95b2f58a219c9ada91b9fff4d4b7c459b373dbd48cf6fe5191543369cabe77a6de58325aeae3ed77ac5fd8ea14ea189355c47e92a75a575b54a24a1da78cf1edb331f715e6211dc4784c9c67d3db6673ee2bcc4bcf882c69b13c0586648fcdb96287f9830e4990fd3f51a5e5834abe41ef3a07214ee6249041917988020d0b90281d0aca26d8591dacadb0a447fb711103c8854587c6481907060a1fefb9211b316afb959a97ffdfbb8369df546b7daa62c38f0611517482874c6d55599f007659b87b131c402d848975f88fb6cf4cd824966832095c900783f7487e4e0e71472cd7d01075f06a78e209b407fbc5f0fbc9f775c4c0004472a5571745005ab0a3230ce3ce0317dc93111a1ca86dbed14b8ddfa360c1f505675c669e5e33b74e5f9a571e68871e6c48f3390a092cd0c81849b4e5fb376c6e74a7d73ebbb978c4092ca72a8a658f280c44184830849590b4018d92b8719c804041b8cddd3dd00d91b4f7ca3db3efab7f7ac051919caaf82f1dbf4e43a357d3ee8f940c930d789ef84d43cac8ab5b62d41c7addf5c8cdaf6e0cb912a988088691530de1fd538373ea9f8aacda316ea03695561c1bd63aa94faeec2813d5e68a0d4cf277e3e65a8dec9bf2c1933e26b3dcfb33efbe1b988be73ce27e3d7fcfcb35273c74d786ea296e0667d3076dd58bd4266fefa7dff516eca99bc6f2bbf98a9ffde64c2eccf349e0697343b75c3adfae8da2f2d9a4d2aed98f470e30bf478d65b75a3d9af99a14c12416e13c1e1ef24f75726e623bc5df3919324c096e62ba39ab697dc6d4b50554d2aa7b881c8911b06bf936fdc8d54b949f41f5bc714208bf5cf2a2c100eb2853001a1144b11c00215d076b304e233a60f042c04a4941c9a13699ed2face559394aab5a25e2337ae411f58a43289e0eabce8bffe140fd17e9c686bfad238988f0dbc1a1bce463c08734e92334b628320954936ab76c039f838051a578e679c5244ee24527bf042dfee9c46e8b32aab07ee8be0fd7230ce88679cc93826da304d49e514a03a1be84b71910bfc369e67fae09c351e43c883547c52a511e49f4f8176530c219f78c0f0975ed51b65f9bb0b1f5b897a2de5a49a2255158ce52597a04fc64682cb0dac34456b5595e0ccb0ac5548efa3b6bd8ffb2c53cf586845ea9693ae8c9b570b57d33d03b76dd3ab6e04b95ecdb9d17e57c697eb998f64127450c47b8ed99d3e094a8cb7f2c18ac65bbed4f3fbc0c289c3ce576af49fefd57be90ea5a65c3bf28dafbf56eaf7b9d3facc9aa5e7f6e32d955b47623e4917ffade893c457e6edb30a66812bb994bee81e7c0b9f9cd677eeb14afdfa4ee4b9eff5f798bbfea7559fd557aade7e8d26ba755eeaae6aa85a3dec563c4c39a55e370fa396703ee2be5318f33316f313c6fc8cadce7cb06a96e7910995b99ff6af94fc839c5b32d8092113fd30eecbc4f8a3fd4d87aeebffeb16a5a6bdfccdd21f0e8acd57fc7c32240282f5ceaa2b8a6f5a64a08f8004b6dd4d40c20670c5bd5c401bbf9ba956217d1414fc3e73e4b2f17a237e78dcdc937bb81e5ba19f5bb81bbcbb9114f4673264278737a459e8037d3a63d3cf50b4114c9f921ddb6634fa5f8fb1d5e715954c65d21d2a890170336e2a24079fee5970224c007c1c79d8e0a9a6734090f712a5f6608e97cf3be01792838d71048d930209d724519d091b848fa0c624895cdc9738a9257362c992e211e137f3b765fefab4394d951afed880eb3ea9672e6095153616491cc489b10da4b981ecf688acca958d0de48d6546eeb1e91dd8aac3b7558b95aaf951edf2fffbbfb8f1865925553d9b1ecf2347b217e23ad3275b495756c59a7e500eae205d7b4040a9ee1798be175fd5db15076d3e52a965dffc36fcf3e95ab298f0ee9103b464372ffcd393335fd273397eeb7745501e9623a92879b9b16a909c1630dfecac405e6f046581af050212613951ff7f4ee9545772fc7dfcf4450b75ffd737c6fedfb097b5a4f2bf669b975fa7094a9786d35bb9b9f73e4e5d52bfbef2d93294cce955fd9c6489e7374718dd837270f99d26bcf8fd4e0863813f1c8fef8fe7e7bffdad5edff3664fec3717de55c40095d27c8371622fc3d70cac80a4c25e58309ec7e77adb76dbdd040403600984fa03012959e05840dd6f7c7dcbf4dff402a91b6a78d6655f4739ca4894d0c4447d7377a1d8a031ddfe403ccbf4c998c939b070e0efacca6424249a6c1cd06b701006700a499304766523a699a5ea1bed22629ca6df1d0b6f249c0562a2b10dfcb9789e8d71e6e279369e978b7152dfa8009bb2e440787a88fb7a609c36c69998a0f68117117b272551f1c5c69981e7e5457fa7fe0fce6dce051ad4f938eb39bdae572d5ff2d15a24916495155454c481913b23111096401099ce223e558a8c0016284f7373926de8f867c51a3dd3ad061dbef4262df158f7584535baa81867db9d9d43e83d0d21118c449c243910d7997e80adc46f746709c4cc73908a33c89d54d8b4365eb9a6f5142d6b7ffdef37cf78aa963ea88ef8e98e5ff4015d3ebae4fb121006962828abb17087269d3b3b2790ca10991b28f29fbde128a383cc5146df074e106404a6cc10e557e843f0d9cacfdcbfffbe7cfa9085bf2b353bedc71786eb757140a3f6dfb939e46a3fbf4fd6a13747e73dc3cd6abdd339c9644609697497e78cdcbf7e9ba1c147b69798d13dc3831fe39df4c257a3df5fa6d7fbe38591b553314ff41d48454b8419fba0e45ecc1b083d491eaca2a53437052a49db5391e814d90b33334572bb91db6ea3486e37abed84a3f2374efd4abfec1d251d877ee389e49491ad3272d61b994cf5422872f61a53f17b97d5e26e6922da93d6e2ae66c4bb1e574bdcd7d433ee6435918322f37b7104bae127fa8b08f7ea47bc9b3e229fe3e6b7bb1867f7f871aa21de1af71401cfe3c4fb6aac8923e91d8e78cff6cc4b40c4fbaa37969e30e609a5664d19f79f455035957d602067d9ad0f78adb75f3ec30b2b071b58b5c140e74640c70bb9145013a5d63db77c909bf2a4626ee9800fdac67f7facd3e7f07ddbfb22c8134720d33cdee4c8086c83ef1ae0eb9db8c6bf9eff1d8a202ffa6063c96f9a00cf787ff4214f6b82f1c569cf5ffcbc9ebf4d5dd634580f89acf41c038bc108163d6de0d62d066e419afccd389036773170d326c01a8020001b7f42ff0b40d89c36e2ef9b7ef2fece90aeef25f00f8b3da7ecf39233dd710f1df674c4adc13eb1df975bafd4e3da6cafff6c74e7f875b5ed08722728a25e6694101910f4f9b0ed08f2dee25c9119001c276cfadecc0f5b8fddf4e4efe97abd6ff8717421050652660c043af3b94a9932a89c04dc7cb9d436f5b30021693bb35592b6bb25106a1103b8e21ec111806b705d1ff46f763db4d2de99fd88524dd20e987e855e20d62bd6e7e97ac21445a6f60307c691c9e0f038b2d54402732dee4b0d3dd57caf4985c8b5b8d99bc58c8a543e14f1ae0222de6f374911d56aae5b427efe05e89be7cb08e230c63150f4fb21f2be3bc67517f07642c46a2c92dc533b9e8de532e2fd24d4148f457a2bdc9781fba865e03a85eb32709dc275a68f4340cf5f187f3792c85ddedacd7191be729c32e2dd685e11772b23e9154792f3381346bc571554dce3aa4e46f47975f9b3fa08dce26c98b7f94b7349e9c10612a75c02955631245fca75553addc032a46dafc0015709c9a48a529d08f746ae24b9af81218ddfa9e5349df6ac7ecda733deb866a9fe5baef559541239dc7c5f3dfed518ffb62390791e5912c13ca27f9cf922d65052a18a752a3309248920affcb9fcd24d1d95ca5ff7c45df7e87db7326ff147cb911eb21c84b80c11fba5eb309f3f623e3f0144a1ae22d4d62f869341515df451e7a6e439c06b808ff09224422a97530141c859a5456ed894fd9a545a22f2ba02b6abf217d03f52a93f272cfa6ecd214afdf2cc98c563c24a1df65cce92933421497d38edd7a6ae8c4d11e4f062d4fb8d723b542f829cfb5c86629b11e4b1887781bf9023f60b300e05fcd1fb7f9ef5c5d32f6a867b79b7853dff840a8a5557349fa980ef63beb09e4bb02f2a487545297b28b50fad7322201115d0f61401a166036618e035d3aa98bbafde226b1e5df244f1c94ab5a8dfa6cb2afd42358beb6e3ac3a5a40538901947a0ad804450eae746fb1d38421b8184425530b67aaa03b6a1d838f0abeb66eb4fff6cfa490309ab19a0276c05d5284813c17d34ce8818a71dedb2ea05de66dbeb662b03be726143228297345ec1a72a88bae9fe725ce4ce0177ebb53e6edcb5f321519412a40d035515a952d86d17aa167673a4c2515718489c1a07564500330ca037a3025fae2d6fedd43f46bb3680d6a5471fdff876bdc51aa71edfe91e97699205a5aa1d319d2be623037d8fd7996f9d4a95a9df6d3b8aaff2818ad3dd0aa1933e1ef6f9139a43dfb06ee5cfeb9ef3ce07ab0071c03341862e9de695e13c5c0f5514ab08bff1e223a706b66d60de59374f91d29502e23a4ec541bfcb026eef88df2960ae0a5073e0ab9e5e72f6587dce64b63eec8113f57852de4ec9744b39fbe2a1aa1b419ed49b935494c96c7dc027ca4e14e56fdce4ba3d7ff9d280538676f0ce1fbba5932a906c7bc2bb909c4868fe4875c581b211c002017d6d4f131034e62a3d5ac138481b72ad528ba7cdf86ac179fa034fedf8c57e7a81a67e9a3ee1d07a71c8329863b6a3f792d191fa647ccf85ce9ddc6e27c37ba5ba6eb6d256605bd124e09a90dc84fbbc8184c974d0d2a84d6ebc4d038c77d50cd08b2bd87416f0d4c5b8c3b8cfc2f3c2783f2bc938cdc2ce12de662ad0389e23c69923c64904561ca8c9e215bc04f5cf768b078ed207d8c8b75eb787233715a9a44a5090ab14075909d93ea84f5e57d00d13c74a070f7ba5089515415ebfe00a99f18164e3164eab5559afc782854a357cbbc5e357bb6f3c5ddd977a9d8a8f7bc930ef19e81c61e6d5efc51789f6b3b9a0543fcc8fe907474c7bf03ba32b2f2f1ea9d4d482afee7c7a88528b7e9cfefd6252fd1161a5c0331c3825703228c6fcf27c1e97b8cf368fb82cd56eab808e9e22a12bc88d14849a0fb6ef13c34a4a6a2a74f7fcdda0aa61f75452ed900ae7cad87d9bfbad9ded8e6fd3b2353d22faa438b0ef2103c28bf5d9d3227471832312326a76b4e78f5bcac055f84e89d76db5c30e0ad9abcbac2e10aa5f668f7de31dfdde4b96ce99bf6c901918db3cc82961be8022c302650daf10f3cc95362380052a49db4336106e1103c8482337267106b4107881698ee4fb4ff3163fac5fb47c76e9b3df8f4e88db8ee28ad58e367daac59d0fdd6577aa89ee84a370476b71dbb095f86a713b36f043b76cde3ab0283e6645e3e91d3f2efdef1831ce31629c63e2c7453597b9c67b6feffbc7d510878d2171edf8b871f6f68c13f3c778148fb3b71867e2f98c8dd3f4b3a846b8a8711f3ccee82a595f77e59d939e52ea93ab9ef962d0523312aa0059d6c640f23e2925ce998cb5a4022115078c88cce9d201436f28bd5108a2b1ae98d631d6b5bb8e674efdeea11583f5613b65d3f98f1a55c21c310f63f09e61e0f27c6f7d1d7d8f30aef3ce2b7f0fc627d7a917bfe3c5fffb05d3bb0ed4046f61fe9435bf8333a7fd26032c892014df23fac580d0c1930a8bbddc4679f1b1e441aaa607bdcf6548bf7716bf770ef8fb775e4878cbc5f727899309dea8d8f87f9f30fdb83ff4fa99f5d4d883ee18aee7ab8b33cd4d79c335c855e275ecfb7ec135f9e97b1a7c1151e33ce0fbd1be58f79f95ff9a3449a91f27e40f9b0a1521a9a0f8bd1ff0ce17f7854447e72c9fc3b4deb3bdbf276f7f9104c2818644db491229f0f64303f07b5f3d099f96bde94ef5aa39051b22b65207fc9255e738bd10429b5216366feec14d58c2d17b93051206b903077ac770df70e403c876b29d6eb632e27d2cdc6e3b89d41e390192830a901c689c9475b79ade66dbe0784d9f395eaadc4ef32b6b65cb88f7c40159d50e248437cc96633714cdd1339d5ff8d4f8e76fd59be3c9d247493545eea27c206084acb2a2fa1e929040f4272f1e4ee5f02ee0558074841400da06703cd340efef21f42dcda02dde7fc6cc5f6729d576ff63d79f3d59ffb63af46713f70b0749ce314ed46009f236cc467f8a74271539b8622a98e8fad87cf9bafda7efa3cfafbeefe70c5985f7874a880ef6629224b0af48a2639515b93fd3bc929b2e54246493a8b8dc8b9f5548240148ef1f48404c90a18262828eefc18ca8b85e465257d1f70367cde518c85d15df9957aaadd4b225f3bf5f7ba852ad738eeceb9e4fb546d57df75823b1627e93781f2697282378a657a2cc10f811f15ef95179cb8d1b95fae2df2f76795a334e4543370dde0aab0c49d0d20d9dbf8f9024997063fdb32a8f54b479cadb222a49fb8b09888fb3cb330089b0a31b300aa1ec71376cc9335b9ea85ca839d10bffbcf05b4d699b9fd4a676c719fa5566a5aed9bf7382a7d0464520a13eb648076d12a7076dd06411ef64cccca2003645c74904ffd2016dde2e990d82fcbdf3456a8fed0dd02b64ddb9b131b0d15d2c7419a0e7cb6924547163b9846a4f8cdbaed638830a4b753504936d510139b836ffb06ec22fe729f5e9c2e7c63eab0fbea29f374ddfbad50c8ce2059853ee6ba02420acb222b7533ae0c84d57a83ef860a2b4ed71e9dbe31b138e5cf433bdbf87f48a707eae7ac435801e909675836bb4af51b3f6a2330f8c435280d51fb3b999752675e103799ddae89be4a04d45812abf4d2f7a7fe53b9553b76ace7a5c8d8f073e3345cfd19b9b8ab7bc82f90848f7cd9cfa5cfc0e022d397a72df65151508728548d247f556e4c12f09b3efe0a27e9ee8033a825030be3ceff3e877ba8e739ae1b9cc796bbc8bbf9ef9ed2f33f5f63ee9c4abc2ba9f529cd2b9996bde962aa96405a5628c9a8d7734fb69602023e8c137e3f8efef76eb0acdbbeae73e0bc1e0708439158822b774b23d918d4fe476e3004d4a5db2c8ffde1e98b4fd5504845a9e01c4c971a0a1e8d3c68c37be6ffd76c3603797cbf2b1f3cffc5a4fd4fe9ddb4f6b7d8d52a91bd31a1e7c6d8267e52bb8e5527a73dab88263080a20923688eeb0310c807f44925adc496d1063d9ebca2cb01d0dd00b33a112a933b633402f281dfe94ed0c240c26a8b9e63e11a782036fdd0b2bce1f3f5e7fb6664f757da991de1c2f6fb9bd085e7b4c38289e000759710f4088f864ece500411190c61c31447be67ce9c001a1f26da802bc19181b3a0a9880647aff1e5aa2d48a090b3bfeae39bd8c9cc31f3a42738c29dfa674ce3cc883d360cdc0bdc99c43b24158d690d34560c474ae0b96a6ce993ef871a516749a346d16fc838880b29b33248a22230bc76c1d225e866d1aa492a29c4a24c9615e1d92348860900461a3df9bdfdddb643fa8d9de2e7b2a45c4f3d058699c873e7de730eecfc5effaefe545a5eb5c09a6ded0c68fcf3956a926630e1873c9ab985ff70bf873c7d9e8e79a3ef63d4b94017161858919d6b2fb4ad7ace9a0d46739cfddf736dc99652a1e628828ae83bf13314ce4cd86efcbaa404884acc222d5556feffc246f7bda0612d078e061f4a54d041b9c757b7480e88363cbaaf5376cb953a9af7f7b7d7aafdb35c77aceda7b5e772732a22274bfa7d9b00df44ea6834e6283c857d103dab910bafc885797bf1dbafd6ce0e92eee0b639c5e5dabe3b395085d39fa725cd9c2b621c6a96cdf389d78fc2adfeb971ed3edd2fc117ed18fe9f4b33de3b439aec43ce714e747f7205fd2744eedfc2ca586bcf5e4b12ee7557e4969334a0ee79338b07198632689438aee14e8465e56a40b26880d54253931aaa419d078dde27ab68190aa04ebcf3da88b9b6fea553a48a91f6f1fdcf08695fab719654dc68fdb06eed8f717b60c87be07e28fbc362227ecb541551e51b160cb1d4a4ddffccdb01fe0564b121707ea617ed87b4710661949ce8443d828a48ebd4ada88b2bd9079701b3022672149b3bd909f13a0d377e8bbd0381ff28e9fe6a13c2ed9e60ffb7e74d84c2d01977f5cf2c44f676cd39611463f823eed2fd3e7f5bf6d1b5fd9d8b2e3dca49f5faf7e7bc163e4464dde700fc4c6e5b6d280b204acaa123611b2f1c9f991f358fdf6574b20d4228921ab08f2d00787c91c838dbe9efaaa0595ebdcfb167d31eda9a9f594aafb75a3bb7f395f73108d1b3f78821bd1bec0ea5c3bcbf3cc0ce08a624bc0317824099fe49005afaba190689a52ea942491a8413608728bed847a1bac3a4b5a235a7036901c46727c0aa9a0308b4272c809901ca4089e2bb2c006e5e00af62e19eb1927249e67033dd20000800049444154caa3ca87ba1b66f26923af7976ad3e60af1c72f658f7ca91ce264ebb4e1b8674bc50a530c188338646fb58d7e44dc48483bc73c8ff9d4478e2446df4893050cc49508b18c01274d8db9792734813bc92f95b4a5cafa0351f2cbbed3bcdb1ef5fdaaef258cdf18756a76c6af140c267640077d8e0c6aea0dc5f6bc87622243de4e05af3e2d2b1a3f4fcfcfef2d46f669c6750920a8f732441a2209bc756a8b64a496585dfd96b8d5454940e9ceaa5d07c1600d2c12de6b7da12c68eb608609e80384f1cf1770e27a0f3260c988bbfebdf0fb832eb3e37f757bd48c3b6dddcacce4111e46cd3622fce0cf38c00491dfd8aec8affb9b68ed175deebf2689a3ec78e99f1d41f88df609514f601bba5cff3f6e93b9542526155ad34a2c3fbca2779d86a3bdbdf4402e11636806a4f578d07840e95bd2f28bf3d71a4ad0d242f91a20c7d20fdfbcb5bc7eeab0fa403078f3e671f2d994c58bbe01d3d7155232b07accc8c7b26710c4111ef170644bcdba8617ebada662deeea46bc3b594e17f42982381bf76db366368f5346bcb7445c697f6f847a825af10923de7db5e8af412df9b037925e2f3a1a97e3196740647ee59d95735c4e7c79f8b7b69f6a517b48a727b27a757175bddf1d3313077cf1b3800840db8a0379abd1faaba263007301efc6f51420380d1001826ee548b75520c2bc92ea7b50e01445e2eee046a29aea24b1502df5aa8f00c1f9961f65a04b10d79eb5aceb86054a7df7e2db9b2fefa5d4fa352b8e7a70a6be765ce5a7cbae49f010b94e6d451910bceb08dfabe2f48a6c37427bdac0af5f183e09cf072165c9830e28cc13a9a64ae877ec2bf26ea3e492151f1a58f92f406494a00c13d2bb67bb258b5dddc20670a09c5166b3719e22b8697dd0f94292ab1b883772c1ab678eeaa67f3bbaacdfa433a3fb26610479dc3e8d3e554690d33950d9a5a2b4d82d0075f382673fff4ca9a1673f7ddb9d13955a78c2d4cf0bb19e4b4cc873ccdb4d7abd615f9420854929e277caaec3f8b1ee99612209846c4f36607fff9455affd5d2410d9e88550471ad60ba584570ccd83036f12f2f776b061aa36eb491eb4e93d97822fda326dee143df16b2e583a6aa4a6f08df25a6eae5d5ba9f409355f3bf860cd096cb55a44d34147d8a869227fef0a8878efa9aec1184d2470402dee6dd43236c917a9667896157d5b2dd1a076322250f31149df097c5b4fd4aceec311efa62f22deadb7e9efe0847aa296791f964c2ec2fb7922dee3bca32ec2fdc668fe86ba0ff72170922d5634ce0ce051b82eda776654f67625855537169eeda6f11e7dfec0d00b6f6882317bf449938bdce8d8e2a94593cd2da5f06ba70d41b078898145308e93bb28110cf63a815b6f296c60954702526a121ce894a2c141ca0d07a938f88db6b751ce029258f03e9cc0330c084e922bc7e8755a5e5a3ada4de9535038337f9e269c4bface6efa8996c49aefdbfa81ba75f4fa1c5cf3b5435c770fcdc9227bf56a3c0b91ca58477db8f67cf47b6dbc66f5e73ff4556a5eebf133c693919b2295895060be8a6f01a448f25c5cf7878144402ae840fad9c02a404a5144df5eda1afe360de9cef97cb1013300c1a038b6ffbeaa82aa37dcefdca6d9d1fb86f4795173459dae5d5c964f4690d3faef09c983ec323817b6feb461c9af8d94faeaeb37521ed18469ca355f7d39493fb7b8ffe69fb69888320e842d39d4c0adc420cdf542fa7e25fbe0bec30d2c0781af4837d0976d370c4836a2016a079bb5a337eea1661b40eebe246a5af0b60941824a79c4c0d454c0470d4c433d87f4d30dac09d1ad065255d4d222e9be3533af6dd64ca943ea865b5ea245c17aa58d979fad3772e8b494468d1ac586e24b72689b842c7a81a060933517630dc78f3ace3bc6abf2e923543e03d0ef095584ed353afb8cd0d20d508948f21ccad66ac6b51d11ca89555159f0fe998bf0b970e271563c593e73fd7abde7862ca9fc5e733c13bffde2beafee556add172b6edd0486a092b2b5922449ba5be2f8c8dd561c783e9dbc4c578d03af02aa1ae6bc84ad43eacaf980dfd9063cec9e1e31209403089543da1106a6c206920e5d37adcb1ac8fd54e309a5da1d7542d7767f2a95f951c70e376a0258ebd8ba634f7d34faac309543c0b3c3e6d9e6e985f7fc7ac7f35ab298d26944d308c6c1b643d88e8a88a3c5a147d97437dd81eb288219f3cbba7472772677580ca1fa69c0ff5e8dbd3ce93be1fba588f3c44da514ae77e9afffd292579b4b8e29ffa98bf265809049294b4ed9faeb6fcd959a3f67e2ad6e4dfe9fed2ffe37f37c838f032729ee4dda38608ba11c63ec05777c62c8650828be895457e40587f54e8cf6ceaffbbfab04422d02980748bae602c00cc031dedb7c015e8bbdd7b9c9efa2504b365b2b364c2bba58a9c54533c64ed3a2e4c24953d33fd194bfc63575be993f5f2f9aaf6b2d4e75bdbbaad2fa367373f9740bbdef12262b56f02a7aa0ca5adc49dd6c65c47bb6a8a827d377e724cbbaeaf54f8fab999d386d7d6c9c1918675e140645bc537a78789b390f54ce710f9c4d9bd67ce88af4f39f9db4e103cd517ddbeeed7fbf5da5d46f23274d706d50c5f3b78c22b75b3606524a05e45422d19b75b9e455026f124ea141de2564cc953a7910204a26c77106bb9b70502bf0e225ee9374ee1671a739e2f964d4cc0324ce30434bcc2b962e700b282d7c79f2f831eef8dba84b7fd0eb719f679a5c72e0937a5dfe9036bba5cb2815eaa767c6b0cea933aeebeb5a32db327cdda68d4836c8f34e11cba433271d3ba57ea182437410891421aca2c230399ec29613b297b488b7cb2c19be1f7d4797d014b69f7dc9a61795ea58e7f4f3720bf48fedd40375bac6f65fc9595bef9bac25d0df474c1bdc5f9f2f5ffcf6e2b9eef42c1b38ffee15a4faa3c03fcae54569efc93984e26bc0301161a78c00e49e5b2ee23b2a64ca161161ee0b8c2d48381bdbd1feee12886c1103e23f6814e2779248429048524e319038bd347cb0741c3c35e07e980e512f1d1c60da63dedfd3c66b1cb7a53f525373846daee8d4b1dd4aa59a6f6d5d7292e66c6bf5ae5bd1467368e967d6ce3d584b2e2993537aed333d36aa6a4b0e739062b22724073b201ea08f90246cafe42025891d4d0f5f59a762999b5caf7c63c9d9cbaf576a73cd75bfcc7b4d6fa06eb38e9a3849138c777e3e72d122b75a5fc585c499929fbf2f771179d151d237923c90f48db2e6b22421385ff23e61ef128a3778d00b2b4d3a4acef2bcc70847508b18c0ebf566035390543024d667eaa906b2e44ceb1212740d482ae990506a6e56aad5c8c31ecc385ac38687f4f9b726dcb5ebd5df98b55aa95187bcdae83170d0243190ff3f49763eef35106e8eb301072c250ff66e0c1b1058437b2f6b7c9ea0cf1a0e30daa9a719983e41a92b3eed3bb34f58cfc5a4cacb5c82baa4e79cab7fd0d78f3b20ff8e25b061d1f723092605f888a160db2e24058ec711927711050eca887eec2319cfe4abef21bc0b77ddf7dadb0808b5880124724a5581057745df02000746aaaef4cf0de40dfb98b7cff0746f5f6ef45470c6295a826970e2bee3ea7753aad1c21637367e45e33ca3d6e3759ed6b071cdc1aecd25f5fbf4776b3ea52f1e6ff572c76b7550b746399d4354dba859f432abab7551ec552963b16e207fea32ef64982bace1dc37ff759f32cba8b3155d8ed665e63e67ae7393bb80ca37960e71dd5dcb528abbbbbaefd2014583dc0364cdf5cb2e5ff789521b5baecad82a74da94fe9923834564af8f7090682e52d33001211d3b1112e2a888609ce8859cb2a2b3173fe73a42dd0e075e447f19e1902d6200a9b6422028ccf08090f03ac5fa4c23c687080741acbb1ab0f1a4c3af3f158c133150d4e8fbc814179cda0384830f2c541094f3cd1c2d4920d20d746f6fb601fc9d08d2f7014c032171558c513801f04903ebd4c175743ee07b90ea9d244e522d717c0649e8c438a14fce419260f07d54d783548b58f755c22964d713fabd9580508b182009090770914e9308c9615e980aa3136f5810102610c419c21b2c6dbcb89e16c8a780500d50adec9493bdcf67db4d8e183771a8648cede07bd33ddb8840d8807410531d1778b3c46735755ba5486227e377e401560e6f114ea34e816de5debe8c33e09c5522c29973fc8401ff6ac2211b9531803157ae4f863f1ac89209ad37b10e99a010a7fb88170fad2b960c313fe542d7cec91331efacc292849a525e8481f71f2279700b1bc03657fcecfb2ec4809e2e20be43ad5ab88e248f142f5e22bc559280906a8b54b4987fb271c81c60fc5dc8c64784ddf1becfeeb34da5ee6a847bb8850d70002deadb06b20a031bd5c142a882c4e0c0cba10a1fb8121f9c3e7c05e627053ac854b88fb24a8c080844fe14480129901a52f03b4b4404a9c200f02ae0b5268b7e8edaa38d0f5c8ccbc1387cb98928fd33057ade893ede9b0f7ae26045c05605d5c87e0f7d72b3edec85952778f155e17747a8529c30a074c70d277ccdbfaed1b84c121d5515419fd627cd33b95b82e1a0f5c9f34db5ac6104a7832705de3accb0a02f8da7155059955344f9d180142f83038c395a1c74be38193bc13beecd2d6200c789d0814f8498246e3a1fb01e2d48060ae7818244920a15217f0fc22308884c1e4b92067de732b87f57e2fb5491c41110b0b9fb0907b5bd5d02912d6c803701b38a25b9830eda221db4e0fc885320af2e3af049224911a26c2a9449a4db4cbd15fd1f12e36742421208cdff58316e15f01ebbba450ce085269a2f8218aa21592783d36dcbfa0d32bbb2c87e5b3113f0bfdeeb181f491a528516c469ed2d075bd800e9ad25555c969464c9b607c2429c700a189a1470c8b46e99e31591d8940edd2721922e9e0e2a996c0fe3fec7491eb2850d604984f62bbe0b7d8f14712e30630915177d0fb68111a3400484f60b7d0f620cc43e621522ed071167238de37bce1b6e6f9740648b18c0eb1b134c924915fcf45955441f000739492895d8a02910f52b2142a6c08d2e04513f85206d6c10a0907033e603812412aac468893ec511900d049ca1daa2764f23fc22e7933c881d3c9fbc6d48b75a0509c58db78942704a7cf0904a8b36c828f13b119883c47d64fcc30672285755588c8fc6bbb7e9e2230638610359720624826991bb2511568af8a66478a8049882f52955a5167e575049b16e1c2a2b2e814a121d491cf83bcfab7003dd6be679475bc4009644b07fc98b939d08305f0adfc3c139e040b2e3ef019b8682ad89093a9c45f87b200ea70ae70a13187c47a74a3c5fdaf8a497d56e6fff3402225bd800aaf5ab1090a668e32020870eee2a3ad049e70ee36e08128b850867f2e70f81530b216297bc6bacb3c47d504d8540182c04c4b1044204060190aa55d237db3ded2a2f245520135ad88eaa28e00a91d75517a08f886cb6912010902280abe0865d05c25c85646f74305204b783bfb304d45d8c8772544112dadbe20eb8450ce0f5490736a93a6c40bca745019158375520ec15f062e3f586804cb6a521a2994a94b21304d9b41aa28fefc811fa34aede025fbeb76fd1efddd5ded9f03e5c039c20924a2a042ad33aacc2fb32e389b80e0bb63c5215f2bc50013cda0fcf7a9f47dfc181130947f45366030a80a5d2ca14584deb251cfc6abbb7fdd3090835923810c8c6120a1d40c268cc111644f1b1404254a43e823eb295b24a0cbae310227759f4c586b6f6f1f65975015b8005dd342db4bfac8150d2c1c32a2c44ca3acb00893382379583dad3cc61e1c0639d3e7170c4e92215066f20da50b6f7b9ccf1ae12e39c539d97d90b1abd876d00af4ffa0f312f746054e180b3d60082f072f4f379e2394845e280602892ec40c09930930414c1dfc1f8d07ae7030b0c183340bb5be5ba9b9a430cdd50f13b1110aa4bd453dc88f7ad0aa3ff27fab061f077682beea3752f55502471df0848eb9fbe3fe2d75456c2d7f80bda3fcd06b2b32d62007f781b7dd2855adebf87a81f4a7c1dd93aa48d435ec73a57e2ec68c1ee6123ba6cbe5c4680b2029f34daf1df49f5618bdf855717a5a2f1d95c8274bb76c038edc057f967b48801bc2e88e3c7c1266d68bcaee43a0a27c61bf8f7b0c06f0bbcd4efa312b748c038f65093ebd4f777a9b2a5835dda12e8ba1cef7581f31b09788e7cbe7c0e8d23c9b8fffaf6ff8b0492acd906c885604963b72d206d1821babb3aed86afeeb74fe854a58e79ec8cad75ce56aac9432d3bee73ae52b50bebdd55e75a4d5c5aa62c8e1ad95e77d2d4f59a6b79d3f9dc72259d03f4fd86e3eb15e55c56eb63d88ec30d4700759b35573c759ea77bba7a31faeb8b94e1c7fcdd5ac8d79bfbc9b1e0e618e668ffead0b7ee73ad5be80a15e59cac2f4365d1837d95bacf95204a5a16854ade556a43fecabe9bef506af2daaf9f7253962cf978eebc0a18731dd8867c2534c92b8e6c1e82c028499068e30a6f1696182defef7bad6a2ba8850d600905ebce92bf538b00ca830bd7cb1441ded05215637c88513a3576dff1cf743ba2865e59077538eccb7afb2a556765fdd13517b96aafaab91e4276b1732dd5d97055b34e4b6768743ddfa6c0675bd138796b8142bcbc65e4dc5e588737a1aff8efbfc5bf8a55687e2fdfafec4cd7bd7bc584df5fdbfca552e353beb8329a2961e1daf57c109fe69d176654e81c0474e065c5eb16467207c673ae8d4ff3d4c7fb3bafdf20afa8b04ad898c0fce5aaa9eab6ff5f2510da7824b286016dfc2e378e15fbfd3ceb9661753541c8fad709bf759dacd75c4afab747eb051bea9ff2d8e1b7ea6bda85de6ef387eebf199ad8c20d5cb454dfa85153e696c253e372e750295b332a99bb4a449cc7e1c3a8ab9d0bcb06be1ce08b005f0ef045043e1bbd20fed2db7e503fb85e3d55af55951716ba2e8f95df2db84ca9d29e45ddbed71bf9f73b674e1b79b75279231ece5f4a2a32d2bd1361116ea7acfaa2be9080b84fa27d77efdffffe1b71275b18d03680d76f90244d90eed7fd6b073e795c132d11b6fcad4df7cbf4ba0df54abdaffd0d1a8e0f75683b58c39b42b96d96b96a1c6b79e368a4bf35c60d70d4abc53c2556d1b20f9e6146c5b9d7c4bab2d1ef233224d8de0a7efa5f83bf8fafefc527332e387a5968c6c4395b9db3e5680d5fad4a29cc74d54b1583172c50aae2ea8aeb16bca9d4cae282db3fdfa8d41ba3ee9ee7964c2e1eb7e54d760f172a26b91e7deb8f246e257ecff6e2f349d461b597b6ffdf0808057291712b82be543de925fadf55cfddbaef6b4a35bd63ff79975ca209c592d48fcf9be94a25a1f1c70c77f977ab221a21dc412e6c2f7f973449219a950fdfb08b387715369e0f9f02be08f07937640ef7e7603c1d802f022c1e3e3330d58a4c918292b51a5ff5084950d31bdbe5b02a4696771fa30ffa0d9fad9efdde337a037f78d7a4e123945a73c31fe754483752f2d6a20d4c8183bd459f8cbfa4331692c83f4e32b10d88cbf86afac4f044445fc3bbde7cf78dc30ed392f0c6fa4f5caa097b4af394a74fd39cb9f57ba8c6a1435d75acd5075e5c8610f8bf7bd8e016a97682d6ab95842149ca580510a25dc5f0a039eb9c27d7eaf7aff8b1ecc2715a02d9dc6ebdfd4547a53ebff895ab467dadd4ac93c73d568cf828197f210b8871802b412240d2fddc06c41bec7debf39f4e40c206f0d224c98308c9c54ad56dd3e04bd76ffee606afdc75c64f4aa57d5ef38a1b87e88d7549e8a6d3ddc8f453acb1513f7b5ae8b69018628423d9c11fc67d3646b3472486c05c5882d3f3718e010470473768b2567955e569f335c15e75d992268fe979eff7758f15a3e00ee9cbf143fef244382820eb65031d383b54495d7618fdbd5d32891840465d5ecf7184e2922beefdb46e5da55abf78e491572f8d265d2cca6da599a3f3436f1cea26b16482c0c93e693d58e887d10f627c4cdf7fd01b7cb1c264169ee2c1c77d99955ae480f311b01dcd26bd83cdc972c66efa424bd02d8b370fbb5da9826b66a5bf71b9667826ddfdf81ca485e7754801b314f84a714b24d190242d55b6c2b6e7b3e94576e60d7667fba712908801be1427cd946a92d3b224454b14d77ef2d4c8f3ffa509c62b356add73affe5be75051c78edba12aa2e4871d5073dcc6c1df67070ffe7c98d02fe23a1c11735da0c460035fe2833f1f7fbf88379e8dbf6e2f2769eecb0781bc08efb98b3668502bbfacece1896728b5f8fa5f8f7f3455a9d786ddf1d464533d3d963c6eb4e8534022a9c468a312874884c3c6efb451c3bb7efcbbb4850d905e4e1679611da2d4559ff57dbc4103a50e98d86ed04d599a607c98fae9ad6ee5bcabad798d676d839190ebcbf2fa545583f1d9397cbc7eab8dbfba8484f027dc6f3bdc5cd5983ef8cb524be67eadcf8d82b1b39bbd709e5e9f9fde71e1346495e688fe208687080af5a5ad4f12149f71ebefd252feea01eca21636804b8912cc34d05549ddf29ffedf645eadd48925e71dffec417a832d4febf7886b2cfbb7b5a079f3b8859821544516a735370b310f7fa1c24d362c297d50f64a9686f5951a1584240fcfedaaea98ebf0774b6c1c2a8599419c19927767066ca0ae286d4b7d4b96c6c5719421383fcc597464f1e3eecaf8bbe33d88c02acfbc64c630ec4c4bf9352567ff2b946a5cd062f9a5f3943a36e5ac4eee86fab1eba7fb4cd31cb433c35948df990237991050c1201a4944f40bc4ef79e2f7825df106bba0d906706967eaebf768f8e4bea342b728d5ebcbb786e4dea954a3b1cd6b7d76ae9e8bd2948e679fad5c9373ddda37c57d97d8411cc5a2bf5e0f6033fd08fa19fcdd33cc7d62fd5329d70c71d05b027f21f0c54a387bf031639519b0bf72846a3693f1e761fc1918ffb6c71b542f6747d7a9e56ae5f4fa74529bb63e4dafcf035ad4bee24da5b29b77ef79f0294a8d9ef9e19bdf2070308400d910dcf42939236708a09185f1bb0d18f1fe9dbf3faefbdbaccfbd9e80840d084c09a1e11d33dfbdafb3e654eb5cdfe0eee1ada21b605ce793a20bc9f0b3969018620b3d8267781762064b20c6d9f622e6e423c0e73df8f37c12430f8cd13c9708d61cfcbd13fe4ea27b266d742131f410124321e333ef910fefabaee63d59b2caf4a9206ce0cbf08cbb5010c07cd411e96af5c3dd1909e7656737a86c6e253e8db9e69175da9cd852a9cef75e30a8ed754a2dfa78e6033f0c526ac386d55f539d0acae1c592751e600ee3327fcef3f6a5fbe45f5e492f62001f1c790684f44a68f7c1b193dc142657edd337edf5e7dc3203a9a7f72ed07f6c667d56c7b576c56ae0dbd19b32a85e4c1023216aec5b98bd0ca1eacc14eb97189f1c5ccf12297f77c2efc5470c490fb91f02c6dbc3871ffd80751a63d4c47859f58afd45e3e78af63bd6ac284e95ba5f7a797b2df9e5fcef92ff1e778f52f54e6e3479da614acd1b3671e566646ab010c82cbd3bb9767e2efa79e8033221e983df6dc0c84e8d7c17b4d05f3d801d6c949204594de9bc706d19b73df2c6191d224add97f9e1d0f73fd007cf05b53ff9de55750c745e77bda29c5ecad41e478deeb85ae261f33b6a18a3c6b4fe48a6e6346a8aab21a8817c3a6aa2f752de5ae8ed4d9f6b8ca346b5ea8d38d608d730bf49e0cbc275a8796daee71ae543ccf50ed76a1735d01df47be33dbaa3e42ee313b5cb8770adf230f0f5f68cdbc17b50adedee2a2b1ebf9e97dede7911f340b5d667735cef2e69b5dfadfbfad95395ea79cc8ba3bfd51cf74dfd5f38edac2bf137e41eaa81ca93e95f1898b6dec054144c0a217b72086e99e4c0cca49502fbf6df9523df46cbf23e979d3a9a29d5e681a36e4bd59cedddbf0ebaf1c2214a5d70e8ed874cd5479e7556e8f91e4be2d703d5e446dfc1fa89d5d837eb275663ff265c87f5c9b5ec69bd9aef68cb9adf8caf3fae33d747047ec2d75eaca3a0f112fe64e395fb4baed370d078057e1bfbaf373b39ef92759a3ebf66a9cbb076ce38effed18d94ead3e1d3d7fbeaef9873f1251f1c8075596ba28135871958a38b81692d0d4c81a332650de7dc667806c78bd13afdcb020bf73209842936118eba0686f446baabf3c0963d0af4c7685efbae2f57eabfadb5aa5c6f1375b6becd3d286e47edf02755cde84d61d82ea68063a2f4003670f7e1eac6d1bfe88f66fa5df1f96e578703df6ce03335c5fb015327d442b7717d0c5f07e0335503baa27f3bfa7d703dd556ef072f2aa8b814d56a1fc9e30e47fb11f4495ee9ae4c65e5662cf866e2b961e0234e54011fbd6d27e06b0a7c9d80af03f0d14c29efbc900a0ff78fc47bc4f0992765ee24c787163a2074627d2d8934fa7ebfaa73de53aac1a9cd668fd75f76f6e4f1456bb04e426464a6f5b22f6e46640c4b1a1429938b3ebd214936f9bb62c4095a18cf856d87eac0b892c6058d6fcfa8a3bfd0491f759f32448f2ff58dd49ef7df161d5b8b669ae0591fd17a404dee91b09da146b75ec7a8814f5e785091d27aea84fb6df45932c177cba4f5eaabf94df88a701df934d6c175a6df83d79b771d058cd742cd7e9564bc8c8ff717fa7d766cbc711611acd35d23415b2badba692ddc9a2db59a1c75a6526df38f742e7d4da903b6b6fdcf2f8d959aee7c3ff44f387db0aa8b522b916deb1903391b32358a8807c9f3852314ecccc8b7a7ed25048408076f383a2034a776d71b03e7dfad45c69473d256bfb0c188e42197f796222de9fc5192551f70fd8035c35c87855318647b80086c4304865fbaa6fe51c1d29ae253e598bff7205d3089f401b6873e166aabab6812ee043699305e7eac075f4c34cff08c7b2497ae9d82f708c7bf07eb8c7d3699009df94861dc97aa03a9ea504215219d120a770d2189aab8f4939a3cdb6245a69eb9d1151fce1b0e0e8f0f875cc0020302dd7bdf15b8a9985707effd3bddc20648d5ab9bb9e0aafe8f0c6c74817eadfa873c3a7cb3be666668f529efab7895615ef4e22c43f6f4d73d241e2b3312f4bda5b139f6fd73cd75acea01fe242a2e52a15a02bf5c5f36f0fb55509909c72b55b201ebdfa95fd5c4ad1d5ef665c95b6b3421dd7adba6d396680e7d53ceda110bde50aa746151e3959a23af9c59317bcb1dfafa6b9c196e6126eb736b7ff7bcb06aa70c4cff207a86e446d747d88c6fb7a9b8d0ace3ad9a35ced0f4f2f203569ca319df36fd8f7c60712ba5263f3beaad82025c43e75c8617fab265cb759a8bfb07a21f062cd8f9716fbb59bbfb013bd96c037c711a2ee1683af0bc871f76a58fd4c60f3d1ce5b448b318c1bfa69fc307bf39e8fbf8bc3f22789ab91eb6072b99df3b0e7e2b76f00fc558c39e5163215a7d026c0ffeb88d2077601bff9a71260ba4ea6e3849cd9d780f7ee115e6ccaabaccdd90eb87fe79c8cc864aadbdffcfe68bae526acda0a5c3ff68add4ea17ffe8b57a8de6a41eaaf9a4ab02aa734b83a1b58f566affd7db4e3ee86a7d70dfd8b2fdbf062bb54fc3c60ddbb5d3dfa379ca996ec9d5a4de31dde1b63c5446d4ef5c5b76c182579fd1b2e673adaefbf89dc5e637aeb8478593088a8a87be825522f7d04e7bc3000fbf71c4009770fcdfd17d521bbea454cb21ad7f1ddd595ff366e8f9c30e57c1713a63b15ec25c02d936d761ddc6d6b19721925e81e85b7d183fed8b6daed7eac61559b140432f0321f1c7dc7573dcacb745ef6f6a5ea80fc4e55f2e7a69b2e6c47f7de98733a6d6536aca41dfdc5290a7bfc5ad55abd84d5606f8496fa6480c663cd861647d2d9b1fd7bbdb7f0e5fa754bb538efefc0c2db9d679b941fdb6cbf5b778c03a3e5a386a17bb03fbda58d5d775fb5d7cc3ac7e776e51eae5336f3eea8b4de64fa5a2a433ad5b99769f0b49492fae3de65df87725206103a4ea216a146ff2ced737acd422fd41e9435efe4599051de524e48296073f1f5c66830c95077000a71cecf76e8e83ee4680d4ff7a321225c087bf061efc7410903b305ae28da982dc13e5b8c5bc946e28deb24673d4f3ea4c0c0dd784e0fbe683bff9596fa0d5d72f7d6333158612f53d387d3b6a8d5396504a6fedb6167d5bd7ab7b8e52e7bcf2df3f4f3f5da956cb3bac38ab9652e9e7d6287439eaa407e02edaa0ce994e5d371071d8b503be385faf8fb1e3f31f5908555409d2c9134129439c0913124adf4f8404f1249c057567736e897202ae31f5dc26b74c724b1db71b74ecac51c7baf310fae9c48a040c90747725c9776e124662bbddc1b7bdbeaa1b572423c683189f8ac165cf6dbc4da985d7ce58f055b152931e1ff1cdc4a795fa6df5d4f6ab90ec4406e8518132ae8f416eda14f7438444e654132d9e31dd2f2da37bdd7e4a759df7df534f0e6909e19e8ebf5ca8bf7bdaf1351a377a396e3e6cf1fe3bd99cb39c7a6e05ced923279c7ce3c74abd73fb031b23f81b5522a4daf55cd256961afecb08c9df558595678075b58121bdb16ebbf9cd87ceeba53fe8313526bcfd968abaf5b97f67cec812aaa23c293140273b4091c410d589c689dede833f99aa882410c6b773aa22bd308d57978c1cdf5e5591e58d1c77d63ac32af5425bb4f59716233447fd66e3bbafed7fb752d3fb8c3ee237bd708bbedc34b518151a99c381f1984bcca25f8eaaec1528454b2537ddeb378f5957563c52a9a95bbf7d7c96e6a826ffe7ebefbed2a4b0ed9d47ffeaa67ea997d6e08ab6e3310f99712a8e4ce1d5b593eec0d642abcc5561367ffee04f9b0cd704e48921bf4532ccdf9c568057011600ca248f74e05056541c48568f1d1991f2d999dcecb919a587eeefd68fc97eb1fb231fd5d0bffdc76a71da872ace6b891816cc03ab8cb08e07324364bebf543d92043250ee0be0cf11f8c672df327d1fe1b0d1033ee10e2cc7db83fbe6793d0cbeaaa72af34a4a94fafd8c19ab877da1d4bbff7d70547f2d234fbef8ab4db3f58e5c5bb4a2ffe697cc83b9c4eb5b80587f65afa30fa373199548461d8d72147a2ba3f5faa0171fc337013521da52b5614e895eafd35f1a3d7cde7e9a905df8d58523f4789a576436700309eb7769bae4e0befa2cda907242ad1be3e62373e70889b5c02a73d741d34ff77ff5d4a57a9fdcd430ebe71b949afbddcf43d7ac35d7500550525d39229e890904fd9e011801cc15fd5dd6fe6e1248c400aee075b35237747b3ebfcd377a6237363a61d299fac7bbadd16e52c26d04fc4989c136d7414240dc86255545317c36ee4ec68199fbbb5b9068a80c545289c106be3eb8cef31ebe1c41313ffd3e786ed833ee0055515593aacfcaba2935eadc7787f4bb47a909977d3e7c3e361e979a254e9b2ad1d1ef540f850a3f550a48e9d9856e96393a8c9c0b6dfda8d48513ee687d8216cd8f59dae53f7777d2bf2d4d9d58bb9f0a5425ee74c4fb18157109c1f7bd06e75ead8fb8e127bf9e311df51a88a32b46019f12a4d12f433d06aa155e81b4e795548f4170b6d59644220690249d728896a47f7a77c8bd5a024a599f7afc238f6c53d20d9b5f452068966138b4bc9a4cf235f8aa8d9fefc377f1ae2f9f4a96f0fb23c84dbf8feeeb795bfee7c21a63341c76efab5b3f5daffb072e6cbcfe7083992bf15124b7286d2cd723d50ce7f54b017bb2467eb28c0311037c9549e3d66d14ea03bec109cd9ad49ea8d4d5573e3ae1cac54ab5dcd26659f7598a3520bb4a82aea85f3ee68f3fb424b2f48153bacf566a9e3de9df2b5698bf95922a966aa6a3e473b9a8f4292b17d2fbeffa54297f17021236800f20fdff13979edf387d9852c7adec963e417314d69fd6931d37051f983e559114356163d0c73d490c73e39f99f4e0f7e3b381af0ff04580af7a07bf24803652a3f44132c5edddf842b73de3a631cdf2ee52ea93c6cfdd3b1aaa18b92159c280ae953938ba4e88ca95e00cf94015aa81f8f89b28c406e492c07a639ef5cd75271fae0f9070db8b173ea32593d0d050abf474153bb0923306dbd5b65ebfe9a969cf2af550dd6e5fdd081b4411fc758aef01446d71d2359752adf0190656a07ec3769776b50de075ad19a2ff1df97a8dec0b94aa19aab5e05b577576b26523550e1152dcc5eb2c12fd5dda32068070f4c43af6ad273ee83df892aab8c2162490c07d66630e128e57e29f7ac2b757bff186261ca7f55f376e9cb9900e7c5e8fb40e2149706df072efdfe977b20d708964590a99321088e49c7c70d29b813521776e82b2c22895aaa512c22ebca2cb83a373f4fd879f9c73c15dc7e87b4f0dadaf556bd71192ad6f6dec3646afaf87e69cbbe946d42d625b1e6c24bc4e69de683ea87225a9fe0252faec7cfb9ba8b0d8cfc136c03d80ce2feca52ef9440ff1fd94e76f724bae5ae200cef32de88ce8ef41816d8510e46c480c0385aa282f89c420039cc83bc5a72a403f2f89c4205566851489ee8bf40e1b7c811c690ef045c7bdbed39fb9bf36d21ccca2fb8ffad02deeff917ab13cddcc2b198bcbc169978283296d6e600912c2970212675e8af8891294462dbd1678a02220dd6c192a0c92caabe20a402ac1aa39a30583a62d5ef9b352878ee8bcb4566da5eaded1b0ede1876f635ee43c14729855a6aa464b9f5aa37373fd9e15b795678ed7846cf107bf46d6a1146c15545a6484ad5a642097ee251b086ac13b19401a01b4459f9a19b92710f09c277afe5a477fd97d7bb71a35da55c9acb316357851c5af337a2fb96e131ff4d99040a6601dcb08f2c21d8c201f8bb7f207d6e6e19dcdfd03b71d41be6ac592d1131e53eafd5bfb8efd0405ca985090ea098480243eb249955c6a2011f492fd005f33b018925ce9ebdeeb48b55586380a7696c0f398415ae01d47051dc02875c00c962050f112f82fbffff0de6237a5c980e2d77f7a422fc68f0f7dc7cdca9d7246ea0d510dc94e7a19a61f59f3d24c4dca67341d73d5fb7add6efd65e3c072a8dc58d5da4af4096600c2898409461e60c1ce8c2cbefdd504c436c08224c4a947b42879e2fee79dfb8a1bc179acbafe40d7b81b5be019d18b3244aa0d69632814077f3efce357b3ea2a027c7400dbc0670881d4394b5b493e0efad56a35aeeb0e7c99786ed8e0f3b93ddac0e77d8f58a4f714e033f7c7085806f0e5019fe760a9a85976ece62395fae0fc479feba739fb4d83d7debc152572cb5a0362a3968280d0c62cc5c62cc1062e25633371e42030c4f1947d0e482234085305e99c4972a11c5504e3921f6e18b47aeba29a9a839b179e79be6b343e3e5437bdad4ae40e6ae62933e080ada6ada466699d92f5d395faf9cbe1c3676ec43840302a1188286bb257de803e15bea20d2b39b93cf130f4793deb1575d629d72fb84413e6d0b89443aecc56c111d362ddb2243110fa8230f74d1c43f700062876d0db1815182069cba075c6712079e87b18131e6fe1b619acdf3bcd48fd5c33046f1f73ffddefbb9cfbbbaa8a0f6c405a37ec6d4484830806312eb42e014bc1c0903344d97c014108ca6003619b1d313242455bf196f89d246d6133a93c0050a8ca5cdb44e1cb733e5fffa9668cde9fb6efb7fabee346749d77c5026518da4cb5d336bdd677776ce1aa84c7f7fbfc9529887be375482a557272c13a261b1fdb4cc2e2f70cc0c88e8c28befd5591e8941597bc5222068634cf7ecb3bafaebee61cdd39441d7ae227d1c931db35e2845de0b447e4e810f4c3c647c6b91011d14191b8dd9d6b70dd71c087c8718af4c6f5b148effe5e7c88aced8dc86fc493687ca79bebccf5848fc6ed0445bc3b1cf11e06be2ef1f835368a1c0f035f6fe0a37930be4139ceab6e65bfc8531f7dfaca10a59655fd36721d365cd9930612612846a9dc22d468dfbad5c0cd58685bde411f46bb2dc3011168b7159ce1d677bdf713a1da32d97bfd162cf42d5bfdf8e776fdf9a56573f4c61b3cf5babeb7e81f5f71aadcc0285f44bdcd11efd17e60c4fb52fdbf6db4fdfe9571f0197a83d568576b582dc477d4a801888324fd7103d31e3530a591811c094c56ae382faa68a38262367e27abc4214a9ddae4caffd63c4ae3b825f58ffb3b2ace701018312dd6adb20322b29109212ee3c185b8cfec83ee02ff106f4436e3ef2ff1f3bef0e08bed0bef3eab6a52f953e5794acd6c1ab9e25dfd5ddfefdab7db276ea4ff494e791924d3122419245521af3fac9bcd38f868dd31440a90cd20f4bc4eefc2fd19c057e4c55bdc03f019ef7319c206567437200ee6a25c2fdead5827bc9eef0c1eef9203e70efb73b452f35e987865ef889ea78bab3e2b3d28b65f7734e27ddf9456196eaeb32bda3f38258cdf6ae3b9357f3790322ea483b14b23953145b2938d87322e5060ec4ed7b0ffab24102ad94a91e4fa052f19727faba65b94aadfbfe9db23dc83a797ba3bfd9aa8aed71b28950f01ac2b07ce450f6e6b2422519b627a6c4496f6c176ce52e746fb03ac6bcc7588d4a52cb85d832265a122202fae3ee03bb3a0721a600e7e7dd56a8ccf5c5f2802b2a67823c735be02e0cb00be289f630dc5676d2a22c70bf1dea4aa9b622270d71cf3c7d953f2941a3af4d99787c36ba87c8281a53f195832c8c06214f72fc6bc17a3c6753172f41443075cbacc40524995d507bcc340e6d848558583b61235b82b7f01444d743676fe6c60552dc0364a4d2b1cfde6224d584e9a77fe39c7acd28b7f6cfa99fbbb78fb307f5f807930f31414f17e9c8a92376b0d6f0f0fc797b23c35a59eded035fad61ee79efff35e9af8c3f20f310e4818aca280a4547996b7cf7121385898a32386080717b99f87862a754ef39e993df503439d530a2e7b38ba5e282ec7acb37e14318d754a190d060644785304f9ed58c773185f7fdc47fbc01b91ddd51b91cdf89bfaf09bbfe71b7c7add25de174d745f73c0d30b472f786ba652c3faf69f301611d5a412225512312ec590208a0ff1fe5e04425c82f92b012b504292c5fb80b42ec90b0b35ded9f9e348032bc138f13a942a28591e0011e19535c5fd483d52b9c97b3d49a695641b834dd075739fb6e9bb977ed7077cd32d07b499afc7bb5f8dccbbbbb859a2af52ff87837cbb22dead19d6b2d0251a5fc3fd5b1ca925e79fbf1f71f5679ad1297bbcf8d5ca2fcd35ce99804f611c2499d40624f7deb3bcd0ba7b5b4fae4edbd304c43680371a168e1bca9fd3e3f2c9f71c1755651c78ca23d183c190194add413add0c615c1ce8335a1bec8542053505a276368c7f6b025505f4414d9f5450854205350509304817bd06c748863062c6540819c097077c5eddf6148e1cef67ded7abe28a534944802fda9fdce2ab8f3fd01c73c1c8598bc95b83dc134bf17dc958cc711001360ef23b972a804a703a643cafc2c265ff7bf27e81ce9503bbe877481eec3e4b07af79b368ca86c337872fafa3dfbc5eed866961330f799887c4aa14a9fa198803b829ab6acc3cc90dda4ebdb55a4b6a135f1ab1744643f17e7440e0e0280701a434f1bef78384c549ee32d01fa8d4c92bfe2fada626e8cd171c74f4604dd0adc5eae87a87a96da83aa5bbae2fc27b2cae33fd42a4e6b0814faab8f2808fddd871ff40815fd812797d06a9b8b02ffef8e8b795df2ed082cd374fbf341c3c35db384855059569111815b661d07aa4f507e330a9b0c81b8e6d16a42225a3bb5425617d914a92fa52e5e88364337857dc87dfd918bfd8db27b75a5621d1df81d73dd77eadfcf197657a5f1e9a7ed2bdeedfebdedaf0944ecd12a8d6e97b2649f1136a98b2c1adefd2b269ebc6abb5a435a5ff372fcdc7bef515b27a578c5fb8fffa9c3f720123db1a41c2516def0d3bd9c280b601aeede3d497af3aa3f624371a37e5b29b5ca138623e2f275b8b18ef662dda9bbbc7c0dbd9367d279b974314ab1619b3715dc4dccff8cc53f3595560fa6370bd6dae8fe1431f2a288daf37f099e75e88b0b07c88fa0e9e3706d793ea25dba1b71e037cdef788e1ebeee93bf8fb185c6fe37ee0734ead3add354a4fedf1ed01bf81d3abc482218e8c3620e998894094d2c6a5dfb171c9b8eef3d612de32e4e5213939f93b491ed2ab860e84b236b1f1fcba6cdccddf552498976cef3cd0f7d5f360e33aeff795f3dcdbeb6c5cefcc065f1e88832295bcc4c8bb06de3629a700c2d84e2a00cea23a36004600f5baee70c8095d2f7725b886aaa2c5e5d1f119956304ebcae175dadbfb5ebcce8cea13aa4e5a574e2cd9a7c127d76d84d7ad07bfde2f89f187197f18f7d9e87bf1017fc594b2269b6f57ead3675ff8231f9204af0f923c28821a360e22144c384812811b7531181bf682fbda8b870908d924681d3ee4855501859c92c14a799face3216c22bcafc896739f78dfb880d5813d7b5ff4ae66982a9cf26e2baef79f3b4ed877ee6cb3658ce890eea68fb736841ea8010d433a9c64d2a07948850a96d633953be0e4a116908505dceeb6a70848d8005f1a63bdf1da743ceafa735c9bc7bdce870dce8beafa23d13fe6fb0e608f0d20688113e1f06dc87cb66d40c5e1fd8071f8e8b944383c07121f6844382ef4967d71c2b81e3afc0404d06bcba071e78300127e98be9cb0d7564207e6d6a337375db244a9cd75d6e6916e970f6e3ab0c9ed91bca428ce81bcb1be155046b88a8d042d79cc2d50787f70c4bae0882a094a82029597bb2147b77d7fd992abf53d7f547de21e5071071de6218031c8e6f502428e79a20d2a0ed89a7dea3ed3021216b969b2dbe629dedf69e35962e3791dab63d00ac5ae0bdd9c72e19557c6addf7cb34e785df9d6b3785fff3af0ae2b1bf87a07ae5bef3aeb2df03b9230739ff685171ff0ff366cdac5c38e526ae3b9ab3f2a426024ad17f6c6c3fa222f3f22204438a43b2a7b61915306b9ef0232c1a0f588a3d657bb5c014a092309a4efc7c668405eb7a2e2a06f9f4982124710d7fcf78f8e9bf47a5e7ad2dcfb5f7831363a870877f0f7c3f7f7b6f4949a8bf6d71272b78b6efcace306fc06c291960638de406688683d932d4f9ec339de79a87edbc30484250f827ae02975d39a5deeaa4ae860204e2996fedccb710651ee086f98ea490cd9019c1d6df8884f6290f8ba039f314afa2506410069dc011c1e73a8c0cf1c2aaeb7bd0766c9775b8e5d0d5d3b2f74e29870509743c72f37b8f4b7e7d41dc489112442404799024cb6216df4e9bede5ebccc391201f92e36aecaf5e567ba49e6f43cd8e67d933006c449b304b26dc6206540ca43758c1521162846101b8ce302c8f848128694402ceffbbafddc471efbf2a0f7f47f7f66159d70a28aaddff6db96a8e3181471d0f33a30d7cbfd21d759d0bab5057e264c5efc8e9048085fe996e25fd7e81d34f2aad7978e16de75c49933a322e269386e81240bf2e6a380385a8fa2d224c77708ef385faa124130e479930c26252c63c43868fd0a0985256bbc0f4b54fafd5fbffcae8bbee8a5ffbb53c9e639ee97a3f94ef6fd025ad665c73f76066c364438d24f479f080849d630aa33432419215bc06ab73d444038b2dcc60f7ae0ff19786b59e3c67a086f875e3e6d5c8283df262f10c17186bd077f1ce50ee3fec41b32dfd4dbf0a98ac2e2e0f7e1f31efc3e89e142ce94047ce2e0979c72108717e350b11d02541138302b0fab7881381f5ed82232970f68caa123fddbbff35eef13f189070ae30d2181547b434a4985f090919a601c47e76439cfb91baeda8c0171ea73aac71884ce4dbdb8168cf84c2088609c22fab0154909440608c6ab06ea0e69f8e1c5cdf4f3729c68481e7f771e1fcf02adab30c68bf715eb4cac03de0fbc3f707fb275db5be077121366494808df6f1d271ffde51d9a7119bcf5675285922d82545714195d2adc7439829a6c6c227095dd67b11e39923adb0b791d4a421151bbb6d9dee7480987f6054bd8224343b9c8ade612ca8ab7cb5bbb9258c1f1b346bdd8c8238184a330e8fb0548248ddaef777858afbf9aa3ea8cae09e7149640004995c51236ad6b4948f0be2c8954bbed6e0212167d22247ae0fbe6b652e1ded1859b937a9af21ffcbd213148ddad14e9934b0c36f099fe1ca12af26f181bf70571b211830f84638e38f8fd9c7244e04bc8e1313ebf4aaeb7675e306e6774551a1104aaf92d0fe440af932aeff5b2e83f46e613edb9804d759bb89f555df49cb8b8108697a8d9d1852d3794cfb6216c25edb1ed831903d3bf4cbd4ea2bd45ba61824410481221b7dd20c923ec85eecfd63ed69da7a62a1fc1675527ad03c7c75044f0be5ec2e9f86c19065f6fe0b3036c4272ddfa6d7c0909b364809cb4aa9aae0a73c215c3f22691571ad61b4bb6a4c221098402048354a622b29c0907312e42a2e0f54323dfd32d2c9e2ffa4ce884244f048425134d5887b67feea748445f7b61e58d9b7ab9124892ef1770aea58c4f5d52af9e52279f7ee9891d5619fc8922e6a3d712630442224bebfa92058513ce4282b6a708886d403cc796124e6f1276ff1e2c721b892189eed67fd004705e36faed85aa2899c42074961ca7413ae8f6e2e00f9018e238633c3740a72d74ce71f3e239306b0eafd3ac314548d34623ce883622b2e77a0e68e5cf19c4f7670b483c8fad76aed1fd11c08003c21d57a867ca93fbb9018ec96c48ac92c168e7409518cc1898fb7f549d6958216268089e2c7e879138d0681ec7109d74f88517d47a5a774684ba1d7bac9fe0fb54a7ca67c4f67ef76cf1be31c6cae00b92d08325302ffe00159a648036e5af7d7bee5ca5d6a42eddb889dc59c996859964c201c9830908491a4438a4c421555401eb62b7491adbdbf0fc404282f1cadc5e2c91e8f75fbf70e58b6e2a9de22bb73c3eda7dff64df4fdaf48426a4f5f48ec38e42bc4cda69064a02c292086c213e9b9e90acff3604c49294cdc6ef7ac0564f2b3fdb51db10b9abadbb355803383bd61153e0949418fc2a02efc1ef0889c11612c31c71f007480c719cb1c0276d3e42b20a30bad79a5d77c6fe70b365ed3f71f6b4a08788df09d2060d63066cef7dbc5109ee6c8b88e7d3f3bac7c673d8f3d94fb8de24d689d6fe51afa56436a4de4222a4c0ca648cc149ce0f3cae3802108524c20b49434a1c52127161db099d1a1cefaa6a1e721e720b07c5a98ccc78a4ead44fe8bcdfddcf4078f7436fe0b305839244028b93e812e277c22ce144fb7f7cffdbd39310a0c792ab3022b37712110ab26d947baf9312b12f0d7b10e1f8bbb58801bc5f6c6f9f35024448a4d15d1394b5f5ff78db4d5fef24fb7e496c7a8dbb36afd71199154855e5231c9040c8d6e7b3e9d1391d16fda46d4fd940e236da11b79ed2b1c613bae3580bdbb846de40919b8ccd4215954c55e49718c2069f5189f92406bf8a200c2cf401c3f837b1c4208da30112431c01b43de3669db6cf98461bdaf6cc0bc69df24ada61f5672875f0594774776d499e16069c1d3f23ca4f18007dc9e6226af7348937ce1faecbdcdc338f776d1f396a4cd436d17bdb8c81f4ae8aa926036c4834cf3fa893e8f13e49428af6542ad416bf87c5ef7a5da716d4d81a2da11ca4328a79d9c983c2cb5044844a23c8966133a3e55d678ecf2d97f079f1fbdc4979bf918413bd7ec66763eace6860de93549e32b961b928cc452a2ab6bd05481c3ed5540430acf68e1631404a2444109940d2bcc5b9c78fb8fecda3c6e8fb9d39cee212d7bd599e13f4fd82dcb8f13d6b85eb763808019ca94428c8e6417d481e6cfb206f2ccbfb1edb9f0672771110db0be3b35e1edef594d5ae88af272cfa628e4c11c2a93fb84f0bdef02732450871febd59e4a3dfc3660cb8bf3d19abc575b1e786f17b76003e07f8687c59c0d73e009fe31db7f73d742f5be033d7b1e4e3887951621e0cecb2aac7ffae44ae1e2b02489c051608ab64141aae93dfc7e795b19b1b17a6d2e3a9b1b4f6ff32725deecd09b94654e6cc28b5c91831affeef6ebe476f25e61990f0a92ade263c5fc22b25c8b828090c1bcff5fc8516855a1dff4dc2ef9e641d38def51c4be5e2fdeefef567fad9bef52cf6071b6b3df883d629f5cb6e2a7d71c3ad4a1566cd3e7035b218578a780f361207a9aec8bb0a84c497351707abcf38beb7b588012c81e03d581221c98b547f7a5e1675fb25cd75ef2d7fa56cc4ac2671eb43ac074ee9131646757ce7d0d1a96fd69ba6d43137745977e0bb063f1bd36113a1d43c2c919024229c4868bd57df2b6b4fb9f1da3198767ffa8ad6cb5452375535a79ade507edb83b95fda1ec80b260b7caf9f53a4e54b9c3f9eeb93244c9fbcbab2a04a902aae00e3afcf1b4672a83e7760c1910a91b6fee5cd4e3e567330077d7ef861248910c1a022fd1c0847c6e21fbcd705e940a568bbcb5b87d87f3efad5c53fbcad09e18a7b7e6f7eaee678abdeaedcb2fc031533e6063b2598fe6ccef514bddea7e2a2f5f65ddcf393799d5c24fa76e2cba22ad94bacc1adaf518924611a1fe5f00a47fb3e6f3261bc6609354012cb4fa2e2ca162a34a9d293fb4d792595d21fb6beb70ac659e6a885f3057bf38980be4a59a7830ed63180b4d36cf4817faf6f1140db00270c88f7f505306ac252f95e45ad684a9d00dbde36545ca68f73e2802bda95b6844a9b09c3235e9822e34072c4b8abadbaa2b6bb084838713f7a207da886377c21da8db8ff385295136189c11b0712e40d15e055e213eddb8370f046164671bfedc17bf0cb0f7821fab369c30b1597cf5819a0daa0f7087007f6cd8b50e558abadabdd08d43322d70cb81eb98178c1502435380e1fe7418485088ee0b477dc3f5cb4b0f739d4ac0ee2ba8852af8cbfe5b309a72b35acd5802da7a52b555cb065ca2837f99d3f80903690f9de8231f0a9b8687d9c1c6373f9201bb363ef132ffa3be3d49f6e4df3c008f22ccc62f519212208def725e33b656a0874d715ef2f55be315b5fb667bce8177fb965161390002f3f8ed416ba7e261ce48e4bce1ad9de799307ee3fa505c6a9e0f77842527970f92b7fb409667c7cde867e679c68bf76ee3e87d6ef66f0fadcd3699f13e328dd780318c5e4b690dd44406464230f24a2ffdfc87aa5eeb32ad83d514a0cc9bca102bc4a7cc6f739220e84f8032931f88c974924862c1cfcd59418a4118c251f8a0311fef9810788e0401ad46e36a8b3dec0675e705d8be3906d348544d77102e2772634b4a04842913601fa7ed575e30d0346bc787c7d3be07efdfba4efbfba7afd7aa51e5970d1c33dd728b574c86f115bbf715566d5668fce988c8d823108f46a1a1d934158071f348e8066253242663a6fb9b98a826c67091897c4eb205904b9f4eaf2d90e03bcaefc715684afb767bcd86f1567971d45190ef840146edf4c508860c80054922cc2b81f045b1ea8ffb81601b40de0f7264984243a4d982bc655348de6b08b313ef4fd480209c7f7f91c1212657ab79abd6a2379a2641019d23e972a59a9c2adb62d64777b618983c2ed5bcdd5a6ba261bac38a805a58df9cd4b8e2e0c9cde835fc98d27269cd2c0c754455e7c81c64b9fc4609e4369c467e3e0f7abd01273ca4111ef2c81046c787980080e84f01dee648fb9ef78a50efd39fbdffb23a92245a2728e9c53bd90080d1bdb607cf3796b501a732b09140b91346489dc5f3d7f171c4f3cc7f66ac3db9efef8267dfe37fae0b6cb5a2a55fa7bf1dc052d30032a8e3188cd4b62c6e014e764c61fe0c6cc0740b2c4dbb69ea3d343f3a2f3f3b5da58d78d700f3266fb559d89d781dc0ff2a08f88f7150c852f854e75256ac7eb7d18aa9d3a9e722c51524c9f719822c3a91f14318ef92552c52da2fe99cd4efcb3741a70e72734d46aeb468e3b01818581aa582151a65d57f3813af096234d4248a8ac7dfb4e3a85a8807e60db535e5871ba6667b8dac74d02262506dfc2ce177efd82a34ba02ab20dbe00551179e9c45445369e6b0e7a7fc47bc4834f72b273e0d545f882536d78c61de856198b440f9a9731021f1d5076fcb8adffa64cabf38c52279f7269b8572f97605b1f51ae9cf4c70c247f714e79400405120a1312d2a1caf80882c2586f89bfb32d46afb30e734e5ce91af7ee993be8fd136074256f11a94a936e9155713af6315d060f5eb850a917ac1b9ec81da8d42ab5b4d110378dbd6d948a8e7f9ee9bb19acdfc5bcb0d81be87beff3989090917f1b6ddf469923a34919f5735252e3d69b4cee392489aad36feb0be33a2f23e424b399057af379f0fb23dea96ff0a594a40ea0d418b8d39ff283084a6ff13bedd86cef752ce94504fca7371b30021836c09daf50b7d4171acc543146437c3f474a94010c66ca8b2947a4a19e8db471b0338d545d4986ef6f63030968d101df84823481c911e9a00fe0907654554412c30eaa8a7c9c1db903e7b304b243124360f6e1ed35b60ae372edd7ea571d7f9d52ff6bffea03cf68cef8a0470fcf6b028e9ab27846dda9555c364f4a8120090ad94e3e053c59c0bede3ebb11ea0335f79e470f6ab6af5217be7f47cfe177ea710da957f707bdeeeeebf161bd9b517889236689701141c102c74cb091d635de6e7c6bf51ab7a0d50bf7fff7b867f7516ae9a6f96fbef6a38a9b67b13e22fcbd79c55410611211f17c1052c11d3c5fb6e8c62b51996e12459f842ab3eda2c053e0fa0d625c826c39d54da1932cfbabe46cb1ce422f871e6302922de6c5d9f6ef3edb19416a1101ffa18d096902c923da22ee9e09fdbbd1ccb8ef279c26b61150eb6530573a875be64ebf8a55120a12f9717df5250ed9f63001719b73a953e9be685255114b20011cddf6aa8af285c4b09daa221f6737872b12423591444510b4c18372256dafb135c0ebacf63df51ffdb7beb27b9f3b8b3ffe48a9cbb21f6c71b616756b1e53a77e2d14a2e1b4d0e06098a0484905f50758159600b66f77dcc9356b2875eff20f5ebefa3da55aed97654daead176dba75f9a9711c7acd2db5ef7b7ab1be6ef0fb331faa54aae18cfdbea959d38b8f0809736c58091cb8462922ca947a7551af05795d959a3b64d2b8c7f473aa52aace8f56aa93eb23ce599403dc44723c964c3ef63e97ad7163e2c63551dd10edc7387a8c56304843b0fe8224deed8d200f60841c29010bdb6102db9097b3c5f7495f5cb369a35f94b74504b4bd50da92feb1368eeab648403f6c803bd3d67ba1371ab905d9e8fbd9de73414a24b1ef89fe183e1fdfe1e74855f1d8c4cfafb6c4110efac39e222011c0b07ecd9e8ea974964c55149c1bcaf4b7575574a19018765255a425101bf88424c5e3b13de35662dc3eaf336527999788c0e7796ea0d719f085ee4c9dbeef254a65947578b6df14a56e5df1dacfa38e55eafa179ebdedba6b953af3b46b1ecdbac9f58cb2eea6e46c3ec2d2d1c03452856989e5daf14fe71e32541382e68316dcb5454b1a23efdc34e33ffade4b6a5ef6eac5faa20daa5f8b0509086077f5b0f58952b57eabbbf80e7ddfcddfbefcea174728755adb2b27646418fc6ca379247e06e38cb838f029f2d9cdbd34a8a1fdf897472bf5c519fdcfeea1f194d85b87ccbd286e5e4e5227d0d1cab98a449c027b191101210e1bf771b3f56f673a515f3287e27afc9c22492059f1fd9d8e20af3e23d43b1e9fe3b70d79c78bfd5763609d06075ea554dd760d66d7385d256e610145dbfee47cff9f34db0097910e2d0aed9f9119f7fd64260c29a106e5505bed4ce5cc0ab6f739b46f7c0405cd2791c8160e7a913de4c6ebb1faf757d1c2ab811c17896c1439bebd5959835445f94262d85955d11caec54ec64cafc4106cfc4a7c80ec2eafb3800324f476ea0cf78068b2aae5570f684ebce331a7b51e3d5a13821b3e5835f559a5ee5e36e8fccf6ed5b0c17b470dba5aa97bf61f74e23b9ab0dcf7ebe0d3bfd39cff83ed3f2e9bff9a52cd4765f69bac39ffb4f76bcdecfba3722bdc8d3a68d0361803e27845e478ea88b4ab8ee9a4d489adce3bf5eb12a5aee9f2e481ddce3133215332d00620632d491214c0e6d69b987cf857372f6aa5d433b3af29baee0fa556b658f2e77b99ee1f9de3495545d961298b2ca71327027201be84e3851ecef27de7e1e8fa664982be8b773d680964db043fc03dd3a7ea7498714119017a5eb519212f3ec9d9a26fdd6fddefaa140fc9fbf78083969a2b2cbcb7cf3946e8d4abad1a49f6f7bdbcf95284c44906976ebc7fc97eafebff3e2b54b3bd5b2297be5f6c1fd3f7ab9e44a9544c0209b0552675970e57efbd626d4fc581c435bde04d8a3a108ad8c16cfabe485b8ea0c5f5d9c2c8e888eb6291ca38b8189f377790c3d7399e71385e4ec09191cf8c4f65019f39a81d7140cae7c4c647e3cef6cc837c8fd8f8685eb23df320df37763f5dd75ecc73e2f71011efd68a508d7df7d587f680b48b5c63775a56fa88b326ebfe55e9ff3bff7c7d88df90727027d7bdf302ebf3e697c573de81efebf97e32125b7e37f580fa639fe7953af084762fbd3c4bbff67f3fbb6a66032de99cf6e484eea8494eb61ab2b900334b1454b8c84d5a57d466d34d1b8729f562ee0d573fdb4da987ac6ef54f82cda308b5cd8ba8521edc56b9a4aa2028e46de4310e77b5bae27d6ceffb7823c8b504e29d7fff3acc16df29db834f46906751b2d1c075b06dfc0e7bf978f0cbef71f0811dcf391139add8cd1be706a707c7c1c801aa32608d088c99a15da07bdfbb9acf6d3da254eb9e1defbeb6b5fb9b13553925fb7ef29c60233b9d5b4d9cf4406f2a40291132c15789ff9ebcfd05361035ce69eb524827a6ca21ce9f16b2a1bc417eee7eddad97f30aca0d4491e3dd252716a022607c01920479c17417712001a266a031940eced94974e422302d59c47b9c7bb113302f633ce30ed4b5621cb37d1c347d37db332f7ea78488c067ee1be2fdbe41f36ccdb71ad4d647f4019ddbad7afc27a5eeba3d6fcad36729d5eaccac99f5a71bcc64c4a7c871527171ae262af0739fc6fbb17330153ae21adca40213751c2a6103e08038e20169e5b97d1021bf6a3540e519a0e2daee08f25841a96daedf40c95a79f153c4bb23545c8d6f6a7e44e76f95aaf57dbde135a0caf4c5179ce2ed4b2f3c3ea8a4ce3dacfe99cd060c7b61bc113bb54eda9453b5c4ee24dbc722c9a54fc5458ceb3dce8d5638603cf2f7a0ebb6bbfd1546f42aa18292221b2d6c7fa9583351a4e2aaee4654c2ab2be64ee93d30a58a20b9178ce1f08778e340020f4cbff192c66dde83031203545cbce1c5c11fe4069ae535ee27cb6aec4b99210b606579239f39995fb08d27e14267154d775f4a19c918780f4210c0baf51b2c3bbbae52570ee85336b4835267bf7263e611879b1b3820d2dcc111d09c0d952ae751b658cae1244aa99271be7230f0887a296c047567e05bab962b89c40efa00e3f81ca45a0950716d7704b92d9c2e02d6af13e4841140f0e5ba0ae5a60edfe75cfdca0b2e69dd190499250d221c7dbd9024134eda8769f37903fd536d24612f8c271c3ddbbf38a25d3bfddf2d42758ee8a5e2bcacbc1a0635461acb03545c247fbf1b53614942e2cb00b1cbe6fdaf9040945ae9fe938093357de985b59da562b72131187c31774a1bcfdde6c11f687b20afaeeee2e097de50e2e08f335e7a0fc8d9d0698b0513ac230fe0745962f0e65e4a5691cee7c61cf112eeb848ea88171fcf4bf5188318beacf87ed21af28231487d2fed8f03ae54ea983bba341d74b05257f47b78fca9a79a275160241d681caf40c6774a6a4715f5446956999a8303e412a4e4b086a82b3ce30c8bef4fdf4f38353852b21611c881363f9a87dec2e92228075790e41e90be3d88a1387068d6e0b310e94c39957c258101397e8824122228749062a47cd0daea1fd582926fba04a4f165fbdf75bf6b7b8b387dddf9915e57beefe767a4bceb8af6f1db9a8450135e58bbaffd151288e3ec1bfd8fd886b0a3bffb7243f90e603a686c73dd76aa8ac86ba5faaaa230f0790f7e123163f86ce00b039ff7e00f2e8065c78f5b73f8e80b955cb650150573ba112f3e6feea504f31211f80421f78e3b4112cade09e7253901b4812fd93cd3c6f1be87e4d08f57f7a78e57aa75f38ecdfa7552eaeaa18f7ffe1fa8b652e96003a74c1b99664012145f52c08f701dae270984655b9ac9eabc77b292bb3102ea9dd720e3b82df0f9253d2ffe18e392f83bd9dca77de961286a75a8bb7f3bcdfa753af8ac3fff8579a1b81de9ce4dbf73a0a89438e860b3f1fb6e3fe8f6500b03da0610a174dffb16eb95473aacd673f25dca63e7bf14cf0026f97e52a20c92fcef756aec799560caee41eb8b802491577322471c78ca2ab7187ce8e894eb8f3a2a3ac9615c6c9659d8f4ad81aa28da6f6a38737d5d66b45f88ebc3e67a8bfa19c644a7afcb00be3ce0cb31f880bf03e1b3fa015f06f0e5015f0ef045802f07f86ce0eb017c3d81af27f045802f07f86ce0eb61f0619cb6790ffd7e346ef31e882b519dcc7bc7e605ef4df39287f7c8e17930cf198bf7c8c07bcc51b9069f35c58b8fdf2303f8f2808fc61d013e9a071bf82e02be3c312f11e0cb013e1bf87a78c63d16ef8179d0f83281cfc6bcf4f0cc4b18f394877e8e581f63715f06de639c15496dae5403d5f4a253b424724c9b335a1e788052cbd6cf9f3371a2521b37acd958f646f40e9f5755d581808b0089b0a0067cd59706aa3c40f3c6d1755ef7a0861fb86ecd6d271cb3efbdf746dfdb4af8de5966bde8af81f520d657a1585fb1f7eb81ebcc3c58c06f03df409a67e0abeefa95dfc906fe42c69f07fc9e75d1ecb1569fb53d4da95f52239f7d3d4fcfd18f15fdcb903287eb7e1041fe7fec7d77605455d6f87d93425540042c28a189065054c4b5918958f613bb045d154d5c5c0bbbbaea5ad6c68bbaeaeaea2a2aabd8829505549a28b6bc8080080a0a845e8288945002a46732bffbe69e73dedcf3e6e64d4050bfdf77ffc8cd9d7973deb9f5f4735175a864348f005fab8f23d561a8d78adf66295055e80da84b54ed3230e76ecb7be1993e723c3787b6f61c183b2fd4d316db777cfe2cd8c7b80f6d687786f9136afdeff8dbe62317970bf1ed639f7df15d1bf505bf0992bc14ab544d715018ff84296bc059c4372f0eeff02f2181dc141d19fba790a98ab298aac8f37377d4733e4e595715906ac7a02a1a047ef84c5514ec4e6950150d82f6deaa8ad0c633489718a261c66927ebc6cc6d48c973a20c9ec186e48d3383a7ab128d1203aa4e32992a918bf2ceded9905a766c7dc405170a71ed930f6f1adf4b880b3bdd7ce771db558f30309238659eaa4561e41547242e71cf45fd2a23bddf5e6a9ec4ebcb6783e2b60c068f3851834a2350d5c9e6c946fc0d363380df24bfd9135dd70b7151cead17e7a8882ee31ddc741737aab2186349e31c861adbbfb5e2a88abbcdbafdbea3dfab3767c9110e3d9bb2f4d26745431a06d5e6b642de3648fee2b53815d67e2bbf800472dca6018b410299091248624e761e719c4a62f0382613a7acda7e8e2b36ad526250ed9ed036490c45206023a7ec001e16937c4683c4d0d30278d02e619c32b63d7836c0d3fb313a5062c806780ec053bfb7e9f738ead88f61008f8f8ba3c1f3c6355fc3bb484fb5469c743f92f4f2138e4bb0c4a0de5b0cdff72389908fb30df0b2019e8e77913e0e12de48803710e0c5be0fb508ddd9ea62210efba86b8f4b24679679e5296595770931f7fb8f972f9ca43a0882882791a08aeb55f87cb3fe3d969804d2abcdad693f4a0964665f9040988457049c66969a5f39bbbd00efb0d66f2e591741db2459dbe2bc587334c033ac37b93e70bd227c05af00d65b364980198047676887e1779da1bb1abe2d67b769d3ab54888af3777570e4139be7942cdbfe817a30b24ad5751da106db52fd35aa26d604254138fa7e73467547553c49618a9440869ef9cf9423d708d1b6eed0cfa62e96df75b386b839ea1248946a7c69fe98a4ee804408eb5fce961aa5ceba4459f68fcde58be57bbeddf4d982ffdd12c80b9003354862c01bff7cc9e07e5e89419892cb9923de7589617192eec63c4d370ff4da575e677b2b3170afb3e00b9e1a9618b80d29c8f81c0ef03a1334bf0da794b95754baf1236d9f397c4b6eaefa653acb05c6d3de87e03e15ce10696e9ac78add6e1d0dca863b8e05c61a8cd846af35be4f4c81b64101abdeb86af0d10695acdb79b463746c441e34cd3f3e60fe01dfa807f815aa3cb719dd3783840258145f565847fcba8ba32adf55c8727d9c71fba00b9b49d27ec888ce156336ca0fcf1135ed068b04de71060d03cfa1166612a59df87cabdf54ff61a4ee67ef6940f925bcb0268b0bdda51a3547c6dab1b6ef46427e00b383df6c5c56ef4137ca9f4b554491e83f93aa88671ff63676e2033359af336f01da6c5c1c1d5e925e6741aa4454a1e181e71da81c5e725e6704cfa0eaf16ee84b8e31c88eb64542d0e45c5563d2404cd942aa18c8fde54b6b1f7fe09d2e5e8ad5a6f9f218988619224f6554a8f79bef139a271d9e699ff855b4dafa8a32c2170dc8c1157daefe30d7fdf99b73a7f57f44128c39cba6ac5bf50a8c539ca641ab71fcd0cd9aabb2b0c6e71847ff8babb6c2503baaf2a54587feb884f28c8acbce7fb6b5fcecbfd6cebe7db5759c2c83c5d78703ed2cf85661c1ceb7daef6ab250c2082a688bdafbb2af088863fe2ada29dacffdde7777b32f3216efb8c68399080c5fd8c8c13178f01c6e8ca840375e741fd5e179ef55cf7bf8c1ef710275f81e3cc22f0ccf6569cf65b17e107ecc26e0f5177fc7decb36b8cdee4a47424691ca8c73e411c71e7e0a6f9bf00b03bc2c8007e34cf8f171d1da1e7ef49e2cedf7997ab2cc04f3c6c68f71d4a6c8ec2c46c8bd718e3d5fff7c7d6bdcf8787f42f339aa6efab8aa314b715a1f55935b300b94730fbc68b598c4f0e7f3a5f0cc6177e767b1798efad661d4303e0a3e839760ddf0f1373da7e065b175c0c6bffcf4b2a7961f2ac4eb4fdebbf2baae42ccbafc8377173eafc681526730c21062f12029a648769450f8ef385c4e581ca86df1f394b00e8f13b810c75ff6eb8cf0a0b79a4b89e3efe2ed889b2a2774704a6bf79a01fff9a38fafff1c309e177adb3f9f317835732ab7b8297c12159221b138f0f95e1392fd4440349de726a134cadc48c7384d311639e8004e36c9c03684279fc3802e5b3da54b2222d9c036c8ae6a74a7f4738e85002f6c80a71bf793cf6564c7e38dfda0649426151771f48ca331b98112bc00d586cf4fdd2051993868c1545026bf777f64b69d181e53d5f58f7e8e0702651d86fb527ce9ecaf50351d704ce5122320a1fa2bdd83cdb88e094f76a1145f0f5cf5668a8f42c921f8022dd5662acf2857ed390c5fb67e2b9bedea59922bc4fbdf3d5dfa640b2176ff6dfb6d9590fa852ee462358e041622089c60e0418c07f30cfd797e256b8813143e1fecc027c212509bd29d936451c46a89d71f86dd3bbe5d7b29801e7269e64715f2b35353875df19248a4a2c47da69f0f81b9cf683e615e988681a940eb1ea919822978b050f24f07da9c6084d9f38d2628298dfd4172c53701e8d6261742a761bd0fdae2a613ff7d8b2fb333e43363acbbdadc16fb3a1cfb0d1a150792fbae72e7252323b8777aeebbea7932fa817109dcdbc85d6e20180d6d6bbc7a0e36201a154b7437586193fbaf03f0b2019e0df00603bc20774a1be0e5c1736180d719fa1706789d35f816738365c6359f71941b5b4b2c2070308ea399511cdf93ac1b730918a96dd113e015b07171005e36c0b3015e5e3cde16b963f371a179cbd3c6a5841b190d4e0925caa82ce1f5d2c6058e058417e91a79a542cedc8c35ef954dc25425afe975e40855d7bd0335b8a7d6032b4189b373a514734deb12d766d27d52dfbbeebe1b301571eb18ddad6dd66f72d7c5f953c65263bf8b58bffd4e0d6a9cb9bb2eed13b6de4ceee1b96a1e6be657fcfda7a38498b4f5f9618fbe2bc4b697366c2f5b00e3016eba649cc51a23fc0ff7be1f5635f2fec90709d1fbd3334eaeea20c4f799cee38b5d9bc0eafad7d13c4fa94f500586e705aabcf2588d073dfc1e56b02f69a0ec3b0c4992751ec30309c6000faf5bda8ebc3f5bc26d37e5c8e87bf3e4678bad938f9b20bcf92b817d9141fb42b54b02dce44df35744e1081909e18313cd0f672ceb375de2bd7cd1bc37d78e56f852668515aaae394cd564446781b3e8c64e2cb3037598b5a9ec2f0282290de4902c1f33a7748be4642a0acad2c66d11a2c3f0ce151def93dcde92b4944cf728a6380188d3002f1ddf81c90e86b88da90696792b91d74f31c17b12e0213fe3c05f3c301d06cf0678f900cf0678f900cf61f06c80a7be37c7afa836d804242169afe01141e4077f118367033cede017e02f6ee52bafaeb803d8d6c6050f7eee15e6793fd9006f18c0e3e3e2307836c0cbd7decbe357301e269fe62d3fe1b878de68450c9e0df0149eb83ef28931e0e31c7b3ed2ad6e4d453b21befce2bd6d9320db2ee6baaa03af2bcaa1f523b47f82e73022fd7555bb5bba456aab9b52df12a25bffbeb35d0212371e19301e05b1b689c099bcd738431486f9c47ef7032f2c07bcb0282e08c6b5c8b04f02e269eaeeabb24b25eb31f5ea510f3f365b884dcfae99b5f529180ff0aa425d3b72bc985b8cee673955882127e7d75ee31ad9971cb87ad09d52dabbbad9a503cf17a26fd6ef6b4fbf4a88c3da769b307fbe104be7cca9d8f19dfa5dca0faa2655d13aa851758804c78aef591ca180ef434868b2d9f3863ad405ea7cf6de87253dbde2e137bac8f79f939277d78bff91fd58d23ced1f43e56f1f11e7b51921fcf3970b84c45b9f0a1b1bf629329ab49f818c9ae62f0cf08a0c8c6c9e82b764e857d33f3c4988752f16cfdc04d71010e1c0543d10af43046425d490890119a868277813be11cb5ad6dee704046b9cf8380abfad6e4365e4152116bd5bb4e63349013ba6f578f50749e99ba51ed8379673e74831dc5531c8815207a0ffc0cc88b533920c6cebc72486fc464a0c3cb0ad1fb93be600bc0a782e0cf0d4f7268941308961a092182cb33bb00df032005e01c03311c091d0ee09e352c0c6458d53b6cf8d392f1e6f2e311839253a000338e7464a0c46b7584e004b48c244c62003e015c48f4bfd1b75a754b477737abe3f61ca1dea094e382867166cb8da09aaa61b0b7183c937b658d2bacc35ba776f79e2532081581a5e660267436f159ede3a56ed12365fbcdfc9ba41fb25eb0c353e89d7c3b496aff61d7eade468c72e1dba2913fa8fe3006ea17820d52c871a08894b582e3ff09ef517b712a2ed791d6f18fe9a50eb23cf5b07d68ad031ee3502ad1e6e3ffe1a591f7fe759d38f900758c6885ec76d7f46f26375b3a66c512b43a4c0418ea95342d7a9da4730f0c007c98552a7e4b1ef99ea8c54644840fe28c4b5473f34abfb39429c75d1906bfeb64b8803d71c5cf3ea03ee6f42a5bdfe22d439d459c4cf5f2e8c2f8e37b499c4172c49279e3f848f8484ef336034e6fccf944e2e43be75e38617cbe0de1e4e38709eaa0e5135057c82c44d044433028806023bf7310181ae7b0404269e7499c069b89cc7f20d739f59293770fdfbf56d3e937587c99deec85a289fc90c2d6bd55d98233739a7ec570da889f44b0cb1b6912308f2cb2f8603b098543b7ba72af222c79f04781900af00e0f103533ff8b9aaa858b400780e608307910dcfe5417f55bf8222de6d5225c201c83825bfc460c3731900af00e0357ca0369631f038bca41883c89975b67b53e197cefb4fb9174fb985240eccc68b2a99eed0060212014283a2bedbd316a9addbbb2aac6ec3fafe8b492080178c27321886086f5fbc8ba742b5e16d305f3a4344fb229badafa224256b580f5b42eb4639c38598fdf5843ed3e15c40d51d1d4090bdb81a0ea6ea6aa85f12e2e26db7560de82ac4a11f743be65177dc72459ebbbf7d2a185c076bc4d5ae9b6f4a76da9bc7dd2a0feadd6dbb5c2d259c7ef5e7bd78d1d342f46edbffde1692f5397848c721650749823664e95bbb17c9b1ffb0ae06770411162410261bcbc350cff0ea36fd0fc948bb5e883ffdf95f136ee821c419a70c3ae4e9de421cd0e5a0198f7493bf3d2fe5a053e4816bd55b9fc5bcf24c8c1b8e37ce5fae3ae502254aae6237cd5f18e099f659811573079abaf5e5766fca7ed66dab995af312cc17645e20427fa5375f6e410984c781f80888b1a4063db067058d374847c8bc081349815a80701db84fd63d2ec4c29e855bd63e22ff4fab5e7de345429c78cbfffcfb3f374b54c369b7755a2b1fcab262a61ecb89c606381ab662d0adc2289025f4c6828d8346e46cd08c0e57ee9e388d51f0c64211118d8c56218a8cf07b7c8f0defcd061b03a4d5465d24fdbec842235736c0031315e15dc8e0d9d00f484a6e156abf2f62ed420b47355feb07e201fdf5c685f0c987fe67c17b553fc17887042a6e1cf03d2a30d1f18d8b03fd0803bce1000f091ec7bb90c11b1e302e850c9ede8f4281cbdd06787c9c71ded4383d21d4f1375c900a2474178c5039d4f0b9053733c256f574ecc089c7cc9c078a7b636f769465242ac4990a4fc40bc6d386f9403c102f87b57deb187e57c4da8bf93804f43b1bbdef00ab7cd5ded175cb3fe75f28c407539f3ea26084faae0e541cb5a8aa02425b0381974848dcefcfeb79c359a7dc26c46129475dfff86cd7901e1d1efa87d7ff288e9d791d68f88624577bd44f42b41407d9ae4dbee767a7e5bb75e6a053d7efde2d71eb5b7b6ca1fca0aeaca6f9e276f20c59587fc94e8997b5c8aaaa7d57d6432dabee3e09efa1e8837592e4a6ffa5c9991d24614ff973da693d6e90f5a6d49d3d24c108cd0a1dd0fd18e1badb96346b26dc837e934be2093fc457e86ddff8f2f9f3cf271272fd3cf0ef6713fc22369fb82f62edc89c9a6bddfe57aedcfde75a60d0a3e0e480eb36fa37d6fe2bb43f869a393d245ff691048245526955f008038ae25369a1ce136d2572884aeb7f78a75c1e31eb2a8abb7c2c3986c31fed71e3c152226932b6594a8fdf8b384e99eb10939318485564d6ad6700bc028097586228a648f4bd53153189218ef3b6015e1ef4370cf0748981ab8a8a81e3251b922107974962e0c6ba71ba7343032a98c4124309937cc6412eb1814c62301a17717e133b51c4d990745522cbc155ff565d9e2b81cc5cfdc15353c00d1575fb5c678c9c760dd84250e4c7c86997536b3eb9759dcba1766b75e2a7779f1c9b1fd54fcf76941bc38324109454b9c417b08eb96acfcb999603bfb31aeab7cf763643a4d5cbfe7c3cfa95822786c5bcabf2cae1a0a9bd978d470d1b0ff9f980b4210f1cbb5588ae6f1cffd4888972efe6583bd2ddf4f716c79faf5f2e39027e41e371b035d55569a74453eb7b9c2b44da9f9a5c79bae49c9bbcdaecd9014325a158d874f039f2fbf4922639bf97e743bad5ec23377b70cacd6977f5970764cae294ea580e2a61e576f89dac57593531afbbeca0fdd6487c730d1225d700706711d3fc99ce1fc0b7eaa7f287d7cbf539ab7462d927304f2441a3e481f386f3f8a2aa2977d910556304bacf886e2cfb8a80ac5515a9b26c6823e118ad7f4f4a9a7cfdfb90e4f1ab36956f7693b22d1935f3f5996f4bd1f395439b96c8e70eac3e78ecc99273b4aaad9bd36f10f1c6db8c58cd554559b0a047e241a35445356d2b4ffee91d49b0eef961b8237fb9fa9905674e96846ae9a1b3cf99f88c105f1ff261fa98a385587ef5dcb61f4a4e6c7d9f65d33e7b45e2e594b7582c0f12eb71eb8f3b66bab103cd0f73addfd62da1264d8f168d5715f5635e6726a35ab2aaa27e70702569434ad6eb2c89247036c053fd26db4623bdcef801d2581b9281318814d6f58f1190fc0f9e9e324541226f95aba08ebb80ca2d3590dd170908dd0f2209488b6b5b2d88119009273eea1210d9ffb580871a8f121adfdcd8e7dca9c15b27b96c3c54bfbc75acdac1c93213f65b62a39e07d56ded9b95176dfe5a8ec32def5d3fb9addebf6a50752001a9fe03b45f16e2b49b2edddcbd9b10c71c715ac10b27b97687d0e466634522860bda7870e2fae5b601a3513fe178908a9933145c65c4192b4184541b0f09cf82b60e2f797c8be039d5c6649444b8a11dc40099e6af08090bacf702d82780eff6d19bbe58f06f21be7974da9a3990fc13558eb47e519204d51519d1210094bc1021a928b9f3ae1501c50a7a60ef0a2720ae4ef2d049dd9e7275c63f5db8f20efc1ed36ea742923bf4c76f0a2a84a6bf57350678b911c35d671ebff348d9f17e951754e43bf2bbb79a171cebe6e2416fa87ca6032e56edead6950f9648d2f16dc7699151db25617a7556edea6bd59338704889c9eb060f0cf073a7f4de70c5aa582c712c6a999b76b810fd870fbe2cdb8e39059c71c92512d7754d4b0e7727cabcb01596c51243b778d97dd5f79c2385b134e68612646445783d019e03dfea07bf6de294e8a056ef1d076f1eccbcce689c698326c6db070fae041e6c2d318c0b872734bcb98e7f1ce4fef2e08944e3529b555dbe658b104f9c73cd7537dca0bea850245b94dfa9d73b77aada559db80575fe683371ef0769f7c591954d9a0871eeeaebe76dbbc51d4fc4970869be1a2772ab1e0c6d07f054e36d1be6c764cbc8268239527b9f693db0f9af1f5a5f512d39f182b4bfbf7b8364782227d42eae8683a51c547ad5703570e5c7429cb0f89c8f0f9784e5a453cfbbe5c543e45ebe32a557ab0566f871f8e743db56fd84b6373ed9da78240f8faf2b9b8d8f93e478e07a56f0f269dd2687af7ffef2017ed03e407c75f81c5ff44e34ec8b65cbe7defc9a3c07c76e7e62cb44309ed37a0695eceebe7a7b273c873772220345f7e08057229edb2491f8cabe0a243415478e53f59005af5d23c49513f2ffe348c4ce7deffa9bdca4636e419b08a681c68ee1c6ad3c19ea7e42ac3a6dfe81ab25c57cf7ac870ef9e30f427cfec6e897cf6f2107e5a25d59731e1714a9593ba0eae61fa588376dcaab6fe47e28c4dbd38657dd3243118e458a57f50df46e10e5778197ce4ed0fd9695410d46d532d025ee3847be376b774169a9109f38af5df05e6f215efbf4eed6d7ac16e2a32f5e5efa876512e7c9bbc4f76e364e87451a0fa7486f88a43646d44380178b78775804ab17990d014b0111f53c72d910f14e11f78608e74644bc033c91a3c17344e27ef823bcb57ec4e1a7f7c3d123ea699ccf326f07536930c0ea52a84d11de384e98dbcdf6451c67b1dfb179308cc720ca80108def676044337c1eba2a34a78964d0aedcf9e07b0fc9a32863fdb119ed8ba1bf92816af141eb9753ff21c415afdf7ffc1db74bc23162e08bef6e9407d721d63897703436a23ec1ddfce184e3c13354f0f1308f0fc2cf6ad4789823f693c397cf5fe0bef2e1dbe0fc61060513fedfcf99de767eabd8933e8697ae62fe82d5c800e34e08439bd94278db5ff6b50d04240c324a4ae1ab775df83237adb1b52254f1fb3942342f6eb5e41ad9d1eeaf9c74847bd02f7965e69aa510928f5e1314405402801d55e100442501da192ddd5e2e37c0e267bf3ce5d34f2567b8f188b93f49ce70e6f071bd5e949cd5c6c7563fbf0d44710c84aafb93aab97b62f52950a397097a9f804848ba6008acaa7d06da40506ad17be57e49649ede3c7ed77342140f9879c8a7a70971d4fc7ef77791fd485fdde4c14e19223ea02e7176559f3714798f65c0a814c4fe722f1b54998c06afaec6deffc16d0f39ca46634d35a8b84a1a0e7cf4b929e6800e7f2aa89cb88a2bc08dd9a74acb010e8fe0311517a892226fd43d5d2e198559df4da89ad24e3dc9afb2a5f8865ba18d596613a9b09ab6badf5561753de784ee3115164a66e4dd47b622e51cd1ce375f05d04f9df3cc609c32f7ba9b0af04c2a2eb32d4a839f7a69fa55ade4baedf2d5710f9df3b614588f3ee37727ee12a24ffd590f5fdf4d4ad607b43cb6f7fb225ea7aff035ab3c1d6861bb00dab91afe45c6f5dbf07894c029e0ad2b1bc627a3a1f1f0e1ebc1c7534587b7a7f88e067826155792f87a92148e23ec0b5071452aeb6eda7da21013fb3cfff8dbaed7dbf3d1f76bd1eb0acf27e63587b6adea43551d81f88f48dc7a8ed59cc57284a1ec2b09c4863aacb75d82122d89c63616716896283fe069219a8d689935ea65212edff6c0752f7610e2d017ba0d6a0692890570b063f578510d1ed4a05270377ef48afa47aaa4c8fde9f3af4d9eb043882dd53f0cdaa2941ba26234d428e24d85badc507f08f549ac0df5eed7f59abeff9b1f5eed84ead777c909ffe0f6a77b3ff0a094489e297fed9b961e2722fcd9559d589b272fb4d5f30992eec5da71f06c8017067885002f0cf0d4ef1d8207fc46d48e7f2fa53a19674cfa662b780cefa0acc6e328058c03ef054e0e9ef75f99abe18dfda07118c752ca18c6257247dd0d55a09a3116c0c8554d265172155ea6943ad0366547c6f9f22545649223bf67e6988653c644fda931d838eaf88a2a7152ca979260fcd4a2b97bf3a0d526747af327e3e08775f8c29ce43321fe22e8c6cb64c70339faa0ecd6415761f36cd9fe248689f135ed37c7908cd4846fc0cda5512f755196363e006fc7d39b6efbee12d93ebafeaa7ac6d804d5285113033e5c6f071bcfb1ec2b09c456154a2014e1290956af57b35a5f32517e3729f47aef03848f330a7d9472bc1b917e44e7ccf1bde5371b6a965f39ed13b9be57edfe368a0405e0214f8057a9d45f0b35da2ac0bb00757a753da086c8d75a3016d600e789c6c26ac8c24a9208506cf2af46ef068c13000eb60e03ae90b2c34d6c75433c7c6a2755ad7139dd8d7d563d34fd612979f5ef37e4fcb9b24fbfb31e6bde3381c4c0bca11a8878571c2f1ae76c901838c7c5bca17c5e25dcf6e0c1ab80e7f43810b3f112df9301f0543f1a29319838679ff13d07e240a612e7efc05fe41463cf573f5ef9c5c6638498b3794acde72c25874f125d0f6d304252e015d4ae91514a20bd5c09a4cbd9277ca8241070b3e511e4a375af38cb176f14e02cc125b279e86d66bda0c6c710001a646ca6f9c73649b8ba445910606c3644bcc771f4008f38fac4f8068d47d03af02460abc1f14089b724d0f6a2e34bfb03e0737cfd124e627c4bd87898e62f3bb144b9e2866fb74f3a4888e5efcffb76354f2dc334296444875433a84921891a090ab03cfce64d73d9470484dc77c3d0c6009f755244be3c6bfd25cfc8cf2eb32e74233b4d399042a194f69daf13a2eb9613be3efb47c919fdabc5b5df5e2009caf815d377802d02fdf2a31950a384c2ae26c52b35d1eba0162e5ca96103ee0bbc398c7d8f6e8d2c42b9ee5968636e197c1fdead0d1213710a474aa9e4d31d6fb984e9d0a15d8fdafa2f210e7ce4e0d7cfba5ec4e78672605c0c0b8f368a5a685c555442eebb78f087019e5ae849aa8a28702a9fbc78e669f032d8c19fac1bb35f05930df01c80871bc606786a5ce80064de6c53c9edd10678093764e5985dc3d7ff20c4dce73e7abe285f0d08b9abc2bc9317cb36f8bcb5aa2371f387a5c531adb6b84e215d17f5d97df7e5c21dcf5cadfffc42a952f0c2ca40c2ccbccb3c6f9b0cd54f168887f032d90555662706058f474cfb097506e001f3448c40513cbe0d44bc27864f81a348a882025603c6837b4599dcd983c6a38445782321c88036a98c1a89af0dbf1f9de4ba2d32306ed98c5065d339b92efa85101fad1cf5e62b5709b17beef67fed06679e1af41e44c2810c32a8b28890c07986aa2bbae80b0849f2570aef2b0262e9757ca468afda33465c2c452f6b86f5975eeed2f74da0eef5639d16fae3c172800e7ea7e3c84193a56432f6987776ed9214f898b97f2b768d7e9f895118f18efef9382014a888feceb7431b6feac203033950a0d048209080d0cd5e90248e72c8408ea40824e5237f6a885846c907ef808eb01bbf5c896a45c6dca295f2b93e9d063c30d09163f46eca336d8e12892486d871c775a10d2c6c95d2c39c1b4a3def71a0ea3d9c132b21c9a788c1b3019e76f007725e96211300da623c5dbb0df054bf4d9cb945fdc0f88af60d8dcb8e6ea55d162e1462c1a8cfc5dc52d5614afe87840475c567c1e760e3c21bf68880480c5b0c3cf0ab5429a97439fcf8f6b15426b61c319180131d0d190bda91575c41accd75e1e61b367578f3005e18bcf6826c443c62da1ff18eed5c68dbd04b1d9e39e2bd40c3d78bafc855fd4c52420d1a0fef8e70be0e6c809f9b683c8c11e445942f438797ac44cdf11d4d84a933400def09be3edb11c47155dc5dd66ce569427c3ee5ad411f82b71cad5b94a08111260d0aba65e3f9067504d631119046abb0f6b51756186a5b55ee104697467fe72e85e8708c1c661703a1ce2f076f9803c1ea44f117d76ba4cdaa430e7a401ec4397ffa7bfb918b85386475d75e6d2e86ee3ca4bf1e25109400e860b848d55520caa14e1cdb6834a71c3f6884fa94d56844afd56b5489d5a228f9771d8e6694bf4df472fdb2ab6fab983c6b56bc4e95bc316c6d5cc2ccc660ba000bd3cc07a46bf7ebb27db61284a7dd2f62d43507a453275d3ed90a0c69c54d1760719df070ea87cdc6c5d1e1a9e777b62f7d68438ff89ec6e980d1eb0445f941f13d10dec6c2dafdee2a826543bfb2b4fe23fe7863a27f7c13dba28cb60c80770cc04bd646e4e8f03cdb00c337783d986c6709e1474d17956519f0f5db067478a6eb068cb61e80671bc6c3c33ffab3e0ebed8f84fb2d597ce3c6db01fc63f0d6a62d7eb6507d425e56116048f19ce3353d870c2cb381708211ec7d85653fb9f152564c2726265d1de3016c66546513c8af8ae546d5f4639be566c95fa414a6a6377b4241483b5bd598fb069540a4ca8283a3f628a841e423d10e233991400021c06c95946c0f251a3e610fe8cfa34aab96a5bb265d24720892a0943f525638fb766d5c007bfdc0a4833f7861dbb1cfd13dd1605c361efc85fce0f719f1193cc3c1cf1803e1dd07720c3c67c37bf1a077e2e105deb36293317310eb874650715cb6166f68bee16dc03c6aa8c350c3914fe6704e7050e48fc7d74fb0551b8dfccc88ed1df4cc481e4448f98d9d821b69099e0e9f5f49ccf1e54661ef601bde20bed1c4f07df3c40fceb03e1e41f7d724bd7e931d0f8f9014360e5fbe1f38fe81fbad30197ca3c01846064406574909d7f96cccbbb3e09c8b80ad1755ab980414cf1f1f21c15c576cfd1221b1a1764492655fabb080705072b33f0a9179e9e9cb2e961243e8f194a1bd5a8a7811db89fd0645ec7e24f229674b6654adfbbcbafd5229397cf5ce84f1e3c72bf898251507060f74cc361981ab4beb20608602c230491e1a495105863ac223f59a6c2dc8a1420428ea0e6942a04d4be95a68db50e7aaca750a68ff7da7c56e60e2c11b3a76cfeb171b1701e352a08d8b29402a83b9fb9580111d5551c62494f07ca01137c9fb243c5d33aacc04c02b80be2b3cf349459003fd28827e08c0bb2021defeb4f5086f18c0cb4b3c2e566ccb3aa78e99f366aa10bbc66c5dbb1b22d16b408a20d11f25d1f7554dc914d1af1e55586b85687e6dab9b5d1b48977f1d7f674c856572cfcc82c0bf5250010645201790f13917e0d9aa5f002f53a9eaac7949ba419bdd4975f85c05e3d9063a37882fcb2e8b2a4a2f4b32da06d87a2b602a234fa55a04fdd2f1f5dc5cf3607c747864d44f723c7c467db2e1a8b6d10941cf864bf8fa03406d03be5632f8e2fedd7cfaba99d31f1262ceb153de980daa739f711c6bd4702c85ef8151e6ce3ea44a87739308c75a9164d9d76ebc50280ec4fdbc507ceebae5468d2276142510bc7a3621e5aeb4cb5f5b0321f878a73546b0f3ec9ba4da824339ba48d5a4e2eaafd7148063727f43112f47ef2fff1e27884447245c4ca27125a19297163df5c381c03917261a97645545b00cc62679039dff0e7907dea3493e283144fd2a3487c1d32506136767921844e3541a096e244cc8d955debb7b841b67f4e345cb9d1d10df518f841d6be4d0701e619d906492150f512fc6f51c656ec6d186dd338d9c2ee7948b991bb449b517ec4ecae13bd0ce6a14be519f0a15f177a09d95103e735715413781728924f9f59b783c7c123093d01a8b2f977092c557f8f085f18fc676d2b70f7d72e23450a993648192076388a9e64e3c78ae0d8f7f63dcfa86759f7cd9df91e8f92eb58b2e720fd4a829421323b133e9ea59f5398b742defbde3e09f40254577599f0b35de690da9515250d21aa7d7bed425583342c007d8a8fae03527282c429426da2520172ebaa5ec5cf7dd910bd60f4d342ebe71c8d2c74fbfe3dd1799edbf633c8bc1d3e7c31f819bc9e099f00b27c4cf1cf91b4e8c9fef3955fb2295c1629163e807e0b1be68f9c58ea3c69b083a4a9c98c281ab24f1c229e4d490c084a196906b2ea84c71bf378e0bb6bd3be5c31afee6fe373c3fc1f39595103e9f87ac86e1fbf0cd6a1cbe41f823bca4c7c3bc1ff66c3c4cf0ccf39914be4111e441e381eb7ee1cdd327bfb44c88efbf2e9ab61abc4b6b98ea9d246696fb0a55f474f32012129e34d16675d2657f131059a2cbea2f8805dc393aa729b871ce33b2ab360f3c3a2c7a76ea230a26e5d24a5575ca0055d3d59478c10c3a3c16072019065ce1e06ffcc0eabf23420470894021018b272c9dc45a37d797715cfc014dc3d53b98aefc18c691fb395a5bc1d34dc451936efc18e6f41066b60d8749263e9d2eebc73144c6b3583fc21ade6663a8de8f418600c22c455abfeb515831076c6534de983a871b19f17b4e4060c3c5df35bdb3bc343346801e12ff709d217cf36653ff6d684735fcb9edcfacd3d7e77131049e9a6c45c1c6db84fb2fca25493b495b94095ff3fad2e16519f0e53699e16cbdf9ef086fd478c449128e86af49b2e6e3e19f3f24a476427c93b5f501be9fbcfaba331dce319238507381b656544d611b6cb8c408e17d1f1ac6c22f493ba291655f1110c7fc55b42a5ab77b72fc428bb283868c51902b891d3ca0e24ae99352d9748e8210429515a685c78baa30fe040909deb4610332e1807ed801df275b108e03356c299cc8fa7842522a3a366d1a6b6a1bdceffdc48cac5c45402a0ef5bc77501b1676d4b751f48dcd5526fe833f0af08603bc30c04b7cf01753ee2ffd20e2c64b5f843033dee2861c87c65c1ddeee8edb9f5b364a885537ce9fb969930248aa4bdc58cc8b8502510d91bbb46e602462df1d503f77f71d22fe0009c3b8e8eb39300239ca0f7a369e001f72a7892423a68d077d6162959979dd717cd97c717c03545c81aa5aee1516a4e26a64047934ec234c3afcc68f8703edac84f89abc2619bebb7b6c3f78d915724d7e5977335d7486b60c76f119d52871a06603afaa652a793a7f6ca8392149baa4ece90f1b2e74e564b65ebbc6f4a33a9dbcb4c7e3525a589d3ac4cddf2f20ecd0e2c62ecfaf9f5d15ab9e8ffc3552b863be102b3ef87ae32c50651185c6fb1d1885ae05ef1b8cdbc0ab4cc938be063ae0ec61c74d65adaad0b980dc9a95592d2621f5fdf8bc875b7f22c4213bba0cb957e55eca73cd701633629b8c96be34e03960b4f522bd99511c9e4f36e23d13ee519907f79e987270251bf19e09c6c5798d355e1afcf3b32097582904d6c1b8ac1efc7dcf897f95ebe41ff32a56a0771daa00c0784e990720130119d3c11859f78eaa493201824359a6d7c9ee743d7df2607784fa586d3adcd3c07af6ae3e56fd2d51712371f3383a61ff0d7152749f0a18ad13dcb0a9569dd159c2179867011e0a7e70c4b4d520be682c6611e409e280549ba52bf7dd6343c66780b79711e45e3b30275972e361c16e0fbe262121bed18b230b2bef12e2c3ba178f72efa4dfb162d3bced10c85a839932c0385e7505b4d1688e1933307e0d8ce518404d57d776024c6ca197b5a291655f111038288970a064200fcace438eefd1fa2221d2bb37abf9c3dffd1b830e9a7c4ae9a17be9c042083d9532c935962fa99d593ab59ffa0239482420387058534a0a14ed56a99a544c9ab02d3c4e736dd25d6fb8005c22b050bb12d2299f5fdcefd85b846832b4c5c0bcf31b1897d1466f1d5c88b1b748c2910bed79f1ef4a7a6197b088e47970e1559037d4681a35fd60f2a7e2600431e00e79cf6b09068f6df879ba5757a46fe45c57d29d78e9b377bc243754f5c6ca6995b0e16a1981c08d878484bc5bb6c3f390f61ddd26f9fd36eefaeeb1fed4bb4f97eb29342c745a4f77a4bcf4df19b167319dbbb79e470334d5ffe4d37fc7e049c2d11eda70877ec30c460311deb9eabd041fdadccba8e1886923be2574db4f1ec00f27c437e8022c824f8c8f82976c04b9613ce292992a784111e441e3c103404b1a87efa2d367747b79b910df144cfbf762c8d987779863ba7dbccf03e3d7f08228b4819084020c129e733c43c75eabe8f71b0141159294400ed8d836afa25c8883761d7aea5fb6c69eb2dd5427164fade045c4ea17f0c084847aa40c3cf04229ea5db5fda019338428fb7cf3524caf5e8ba94430e508729c18d701a947ea4e5035456222655e0b75186aa771fd37155f8a171c9f3784387ee23983cf1a2025b3c969a75fd025f62d1e98ea692e3114b11b03b9bb6e0e480c53496270e02f2e6c07e0a9dff31b036961c3c6c88103612acb32cb73701922dee3e0a9f7e480c43015e6976fc41276d079d94a75bc9153a4d41e8af15877d992c5932e1562c16d9fbfffdd0ef502cab67ba55e1321c100529448c02db20e52dfa06a8b245528ee9dfe479dd9efd9ae727da76c4ebb23fbcc04e3eccf8eacdae608f20ce87faccdddb825398afd5e0c84f1f3180c5b835f409cb30ecf8bf0566d2f82bc04da61c05f27fcc9e2eb3120d9807f18e01725856fb62f823c4383e7112a7d7d992454c12ea82aa10baa609e70bd353227191f0f8b13429e832b31bea5e11f87bae7d8077ff9f7f4f160abc5f55ad941d5d570052d12106ab3c067241c18af863901298d3b128e0ca81db187653f1bd15d0e7ffec269f76fdd26a9e2c591655f7f1dfb340c7fb9eed38e7d1ea05befbaf1844bfa834a81c79d58d3f5766809d4ef410dcf939b31d44438c27bd2cb0485c121028bef7384481b94bee1cc0e0d1ae7c2f0acae733605788d6336246f9c193cb49d446df81c6d1b4e627849bb2726345a12dee358f661a1eb861b1df15e0c92c7a8baa9ee7d318591b71f9806e9f82909226c28f44ae13a65d41d932d84b97b93111d4614379e4b58ca3a6ceef4f129c26ccb209b1ec39fad676f1e13dbfe087e0ef08d30bec66cb3cc481e940d37c17c35b8ff8cf84669feb212c14f1a5fbfad445f5ffe7da2e36bda27c375a7019fd38879fd363c1ed1002339b31d96656d39f3fb4b84f86f97c7ae1f05aa27be3ec9dbea13bdcd039fc9db0a6d1fe814a28d54dcfab5c55e967d2d81600d3c6bbc2aabdb8d271edfb6af44e180f4c2ec6ce10f6cc36cb2fce62fa64b6dfa5ccb6333e494fcd06a49e9d46239a89f55ae40dd208a6e38b0357de073e6474d5e3638b0195017409d0bb593f410e805e090ca231f6a49d8ba0ce993e7ba21670ce9ddf7b977e533b345bb666e3a787f6e28f576ce819902bc7c3a66e08882ef90470e0990060e330738b8a94c22f4020805c02b0078c8e13a002f1be03900af1fc083d131a9d0b8caccc0d965aaf69a59dfcd1f3b4788ef1efce22d37e7955b304710e604229515ba3fb2eccb6803411d72046e2624093517fbaaaa90942c4b9e5ff8f87629011f7ddc690b2f973db3beb1cadbdc1e879f0db63e5f7664d8c619600bf15424163ca7da0520bfc2bc490944a9140772152271dc20491247afaf03bc2a958fa7ff8e70862f9754c9f696789de52699838b2495007cfd39b8747c4d7790737c4ba85d00ed8c84f0837292f1f1b04833a0e019727055cc2d5bbe42128c31998fce78f2cfb10be9dead5059dcbc24ae205954808abe1ace354ab904eb95182134a2a35b3ad451d4b020abb6166a47ec65d9c7048422ad5132c0a48af2e06cdbace3dcedad843860c94157fcc90d04f4eb3eed584dc9e9885eaa361c98d677a122f74ef4832e3c2cd78df45ef3c682d71740a01837aa9331e946a89c40844e00001c4c494441548f563511103ec0af431d2729c44a41d008e8cf63fa79b27960fd8610e7e5dd34e5afcfc8a9989f3a6ba01bc9cc23598dc66538e84daa01cf58cb23bdd5f7a6acaa5e1658077eaf36ca545fe4b80df032009e03f0f483df3b386cf87d1ec0d3dbc9a6e93644bcd75d573d73abdc80635e7bf4a0e72546f56323c5b4119173830d59c5084715e89089a383e474987433f2aeaa697d20a3a18e742d5968f793fa0d3d52129a50e79473faf513222ec2fb3ce8474b357e487e0c4e249e0a86cf9b1a9781e24ef89d9a67ae82290960300cb6810446774bc737c96cb8088fd2aa9b549e0c7e10befc8ef012dd0943f0bbf80322c805e2c79d46b88a36d9f1c880effd8c500c5ec5e96597af3c5c88f71f7dbaf8898142ec7ca1f48b5d23142052ad628e3e24202a6da6a8445b0710125ad7a8ba02491a8de5513cd710d302a81df133957da4c2f2b98539f0392a3fa46835fbe5f7aadc2b69eb2745be5fe2c66570916f38a6232711d08e871265ee726daf3cac26679110bd1fcfbebef72dea498c4477534dc4ea54a8e1e0c038120c34a4c875507d910405dd2042801fd8896bfa1d7b3e0484c855ad5dbae9ce4fdd9bdf52e7a7df606789b8c86cd93311a7da493e3256570d7891de8e0e8fa98a7c11ea0655d170701b0dcac1956c72442f729cc163eec64946bcffd86e45e9e7cfc943ffb29a7198b4323ed23f56b37b3f303b29cf0c40eebd90a286447f4d7927fc81a312a3dd39db8f8e397570f7cce110f7e2b079f4bb4367b17189c6f797543c6341c56b52c1f0e4a449469037a092dc337c93cdc165c697c38736c00b7267770c714b368f0351e3da08156dc2f1f0abcad4f75b0b7e3c7ae65942bcf5a2ddfb61596f5bfad3573bc0664b2a299028785257aaabf5e729fe23ee8efed83b794034f608199f9fadec2309048bcf688c072a06f649dadef44f2dfff985e4d8da2c3fe4d63c5b7e38445c997a968873df0511d0a6fb007201a6a380c0e79d24cdef2244bb778f18786e0f210e3feae84d4d25e7b86ae3b7abbebd50bd0f250fb1595538e05658c79328354a1e79f09cc5fa63196ae061425d549df206d4b25f7f98611f7987241ccd1e6bf9d23b6fc7f0bfc6bd09ce1a692982d98e386d8585973e3bd6ef38ce477d6e037d2ba1cf15073412daed54d8a4275930d54891d07b65c3b89690224f00bcf3005e4b801706780efc3a03e0091d3fa62210d00f0f3fa1e3c7eea7b0e17e8d0ce20033a09731bc4b5bacbf64865c4fe3a63e71fd9beb152c727384ab91dd24746ea9ac84fa23a8f17bf072418e8e6c2290d9a01eee5b201516f6240c354820d65a2901bfb7e02337434297bb8f1fed322e299bd2569d7a6aacbf5ba0bf27417fd702ac0ce8979a37baaa18dafe7156e3d142cc85b68297cbe0d9d02e61f06d9d538ee3c4117e18debe36beb77b8a6f9c4a2a0cbfcb80df69f01bc037231e5f092f17da1abc24f05d0bcf69f88acea442cdd84bf8561c54b1eb93ad35df3d23c4c42b9ffb6fbe3c0767df38615aa11c89bac2da372a4f56cfa031bcf272a8c1468b2a2bba39b55c7f9eaed406c983ae1960f11e941b1025e7b0f899cbbe22206b55c50f54aae1407603fd36ce5bf5df8a17e4869b7fc2ea56f32547fe4adaf893dc3cf799a02ac19bd73c115e9125aecaf1bc7e6cb76afa5c8bd37af796cd6f7b8fe8305872a8ad97dd33e75a79386cae7eb60e0e882824d32333b30df88d66fdb0597f4aa0ee9cb89f2120182e0169b1bb75852be90c3af39ec71e7958f6efb5d4290fb8aa3557b4ce8bc33b0b44e1525da71ae83668f2563224eff379bf08dffd0628723b002f1be029afae71e0d5956df09b174c0565ba002b0bf01d872a02a6d20a5069543d5df1c98f438578efdc27434f1f283793a89a500984826c19c8d1018120f747cc828c6ebb702f0ca9acd05f1e37e44dd0339bd5c81001d10ca1a429d77575a4fc964552223eb453f727af7209d349e2fa1603ddfe820d299bcd9bffceed0c18970218171c67d5f6bcceb40baa8c49128bc88b4d87ef8f7f2881b682674892484917b97b31c3d7536922c3e24b9298781d9bf035dc116ec2374e15aa8f8747a8d4fa32a8b812b8cd17c17309c763d103d35b3db750128ebf8fb8ebdd1be4e1ffef1dcb773daf3acc250db2c5c14da74450eed63f47c607555c787f0dd970212720b9e9a2a4910bf55a56ff6c655f4b203a6feb3b8051a5e346924746d7dcba4812920e83babe78b514c9acefad1db1886cd3c499379e5ab0a0534fbfa859e55172223b457a2de9fa8dfc608bf871999c98adbbd76f2d03ca4d8403f1c40e00a123c20747381188e9ac4649a3ab10170eb975ed09238438ee8133ad31f2fda1d294f3738a85d9f6309a38fc5ed08f30f4836f1085add948e7403b57c1838ba54c07465080176ef42230daf6f319156d784a1dfc4cf7eedb881ebcc457bc06300675ebaa1fdfb64d888faa47e53f9a2e259089eb5fd90ef7bbd4cc5775d58150a32482840475c84860f09e179438d046862a0030c247bf861a3839ea890d6dc650b846f5b2755b46b917f6742aea1d71df9b3eaae91167a7094f7a4932dbb037cef0b6305d58a534e33970419527b1e23c16a8e78c362907e021e140f8b6d6363318050de34bed5c6823fc0c866f4663f025781ec391db20bed90c5f6e7c2f315c5065769bd7e0572d2e9fb74eaefcef7a177ef0a29ce79967bd37eaabff516fc0839e6e38854040b46de07ae4711d14df012a2b6474284d3bbbb08e240e18005dd92f7efec0682afb9880709b001192d150838ac7dd78dbab373eeb0ef89107677eb6fb39b9e1ea9b7d73b69bf77e2d898ab15fc771140d6e3c1ed8967a54faca0cf99e0ed33a77bae023f99e493dffe3265dacaeaed8b25a1e183b976c5982ba47c28fa74219cdda923368726bf359a9c70a3170c4b067c352d239befaec7f3c2027b669a4e588a7fe251fbada6ad9f1558d3382b1600b3a0b16b05f62009c92f456f2e00d03787989c7854b0cb8710c0158283194ea91b7be48617ffc0a124001f0543f82af7885a29eafdf56d7ad5c4a8c859fbefdcc637f1262f5b8ef66fd78bd7a0275c1d540389063ab423f79241ce82f8f5e56e8fe88de2bb821d1f88812ea5ca81dbd26f76f201cb46e60bdbb12e8c6b12b2f5c7a8f94b05f3ea1c9204990ac2facb456178b78d5870db0800c41db81b6c7308d86e7543b0bbc14e7f99c0f54db8bc3d0e1d33e22950bc0c7f887c632180d1b9b050ff84c94665fc39718435cb70c3e6314397cbf338603fdd4e163c4bbe72596110fdfe42556dea6ecc3e27652d2387c7ac757e53a99d2fe8587dceb017ebc6bd93f7f04152a19b7c1890319962a8c244723394a1ca05245c281120a8783aaaa08dc881a05c9c3678b43e71f5bece362edeb17c06be03d3c4e03931ea681313b1db2e8ba92c785b7dc367f4c441efcebd3c79c716302a0e835918f1c056e3cb0b4302f1df937f6bdc854df5b4ba03ddd4a738d5091acda794bffe306dfd43ef68d94546a5b57d72e7545c86662612cf9e3fbd1735ddd64ea75e9d9ad1748c2715fb3b4e3a4089a529ef6f7134e907d3a36f4524f0bdea4b0092bfc8833d217348f1c1fa9ae26153d415564764b74183c1b5af9f09c7aef48c0a3a7cfcdd186e7f2015b354e4101592381e3ed0957a8261f399db81f23ad6206cf4e342e91136bcfd875bbe4ecc6bd3ffe09294b2dba67fa8c15e025558b374c822451b156d5e570e0574c55352728da8d9022ce888e81573ced35b27636d4d84324206ae42969273a6de0f5022ea332a0e2baa7064bd6a0d5d5ed36bf005e355a31a878e2ae12566d1ce791c0680cb362b7e1906dc3e78d67501999e68d477c0b7695b23f50af61f8843f5b7741f8227c5b87e7c13748508dc5d7a25974e06f0c5eeddc9aa1dbde938ced811b577dfd8410cba7cd9d3b5dceefe2dfcf18ba0a24803a8c2fc2b000583f64ec46a70dbc89146d17d3f43649c4681c47af2a804757d0a2b11c53eaa0713cce89c3ebd9fe28fb8980708e8d3878880b41ef28370bad5b9acc16e2a4d0f965279e28c4116d7a9e3b65977039aeacd08c04b0935dc818998d777af7b496a8e78c0bcd0678c87939f07bd5ce5407a0dcbe08af51073f7172f970f0636ea825a45977183c1be025de807c1cd086b4c41adfe0b8e081e1c1b313e29d0907fd126b493cbcb87ee804d10e509564423f96f8c625d6ae3bba7a52694f213e7fe2cd371fffa79438ae5f70c5fa6eea41221c58a3bba38af116e519d0863ba3c9f8788ffe3b525d419c10110ee6b54204841592aca107c418a1f7df59aa4e4f97df6d4fbdacc59d52527df0cf47bcbe5b12971f9b34397b5642b0e1186c0341250913d7df12603c928fc8ce0f800f8c888f21083ae8f708de1ee08bed86096192f856f7ad18b16eb41065af95e62d1c24c4da9edf977cf59510dfffcda95bbe5ccefdb0fa1f78ba7fbad707af65c0005538e0719dd1454e6cbda2ea94240cf41ac414242ce0b50e08d1af877060d95f04c486d7e5eb3512129f24d244d5cde4c171f6eb43bfbaf926210e98dcf6837b6b1b78879f6381cf6921ab8d96091c1bdb781e8e3e0edf8196612383e4b3c4d20e7e12817df0020e7edf01dcf00649000fbe050e3f0c07bf6ddc70221eef2424869e498d8b0f1e7bef4838107ad281107bbe7c6259ee7229ea7fb2e3b5839f1d21c4c693579f5a5aaa20d2d5c0b82181d3ab0209a37c34d4cde1f37bf4e790f3abe191bbe8b6cb7204910ed916890b7cce2511cc029d02eb192591a6d708d17e52e72eedfa0b714ad5a54fbd7fac7c664cea573dc618e0c7dec118172eb10e03c685136ce3fa0b98b7b0228b494b9241490d6d80e749503640cd07787663f0956d0bda084fdb17d173c4e31139af911935f76dbb45ae99ba9adc2d72c757e6eccafba1ab9428c4c6c3dc388c1f1e5d72ff324920567fb160e5065085f20be47c17ce2121e1f7f9b01a1916f2ea83f54636b74ff59a22cf791a76765f8def7e22241c36d48ed8cf657f11102c0ebc16365c0809c9c3aa46498436dc89aa6ede498801cfe755e69508d1ca6e97769f7b80f4b7ee4bf9d2fc2adf42ce018e2d7fcf2406d9b2e1398535a492900b3e1fe0393a3c347a82ca2ce8e0cf018961fcbe95188c9ce71e4a0cc62ca8744018086026a962b2dd0db161c1aac953ee1062eafd2f968cdd2237d55335a328391c120e4ce980c645201095a09aaa28811a545864f3c0da94b204bd590ae3474a78571507dc1f432a5a6c2363849208aceb26c818fd8f109dafeb73cae12b84e8bd38fb8a172f97cf1c9ebee1845d0dbcc42f61dab136635ccceb5967e37ceb399091311026801f7db07eb49b4266e7275b2f9e7f913ca85ffbe9ab457245576edcf5c3767990d71d53f38d6b634c7ba7c989ee78a4ce6b729b2b99a57d956e357954b64f4b3fc35561a7be9a36d3d540847e48f92e458e636453dd37eebc45fe5377b73bff7503aa8b5d9564ddbdb5396ebb6af0ee27dda499a57f5edf7fcb9f25c3f1fdea66db24618e4cab1b42778023c78e71122ca54784a5efaf67f7c3d0818e8403250396361d3f4755a9ef9e8ed3d8f3a7eb35bfbb9cd6a549e2b0a176c42f54f63701b1e1b5b8e48157456fac14d86828fa37295375b335aa766d23279f77f16dfde5001f36bffb09fffe56c23825b42866943415cfab44bd3570e3b1837fffa98a748981ebc23de3a281c3f71dfc98fd75b07a6fa0c460033cc3c1cf556806db4b902a11fa119952fbfd8e51422cc8f96ce9c85e427c73c9b4260b2f553fc4540cb54cc4279515c66fa0311209489eaa2b5bc2ef180748120712103c60d0680e88373a4b293c479208ae6bb489c4a9b2dc8237663695758b49ad171df0b41059b75df5dcc30fc9cf8e6bd9fad2850dbc0bc7196d5cc3603ddb64fb53d824cbb8980807ad8bc4b6c5e898e83dee3cfc74cbcaac09b709317bf3fbf77e2c39ef9a77ab5a2381a7ecd8a822c403d1a48a0992f84c05558dd0539a3f06bf9ea9244d0403e3c37c3754627f0c81a73c7715111aac9150601bc7e30b563fa8f7e397575599cafe2620581c783d974450878c9208184b9b422ea2780eeea892df3dd6ed2d218ee973ea8dcfb595bfc94e7bbc6bd706de693389616f5545392213e029c2316c2f554539f0fbf12431c0d3c9a98a3cce9071f8811243e283df67bc25788d3c90b00001ab4cdb55b2f26521a6f71b33f8b94142ac5b5b7cdf46b8cf05ef6f41af28ae2bae42c90309c7eff436facfe3e7fc821d9fc4f173e992e179eab1a32a7e23661a787fa5dfa66a97d38ed510b0e8aeeb339ddc19d77516a2f5651deebcc3f502cb12592989bc253361fdf9254cd3fad3b08c9b371b7e8d8c87056d058fade7dae6d54fbbf335ebbcf7224f0e940464d0ca8f36429c0c2718940980dfe5cd6e7e345d1d1dc859db7ad3a77a849a130eba629a110aba480c250f7ed531339a930481eeb568f4fe34f1f344a8b8c4838ccc170ccf30eb8f2d7e65e5972220581c55190989ba5849a44352bb74b8e33c9ddd7ddef42b210e38ba6daa1b887852eb0beaaeee2844abefdb3d79ed9112f6ef43a52d2ff0bfda7830db49aaa08ae1fb9e012a013341417836c0432fac868dfb6663a52e998c037883c17b2a799db80df06036e0bde3008fc181de2fb1bca9e5cfee9cb0e43f42ac7867ee9913270a316fc347b316b869f41df1003f68c8fb84491ca4b262de2adc8b8a9e0337dedaa374f868f44482810705cec0cfe62f0ff07c84049c455220a0311572b5e19dfd2499004171d773ac2dd779ef36d9d13edb85e8d4bff7c45b8f93cfa6349b7dd25d09df1d56ef6ea4d7958111e0eb7973b8e483896592d9bfe98d4563c7aa5fd2018ac6622018949b099358a24a0725402e8920216964c474b430f1f3bed433d846c28504050809d9c0b8ea88db401ed09fe384019faf636d7e11192794bcdfbe6cb98ef895965f9a808455e5db70701422e7950a3611748f4c3f1b6a20204d58ed66b76d1fca38b6dd22218ebd7ac0ca6b5e17a2e5e96dbebea052c2fe38e5cd56d76b38d80a074b3f3083365e26f3ea1a0c9ca07923db002ff1c18f5e35681c35d9364c07bf4f05e56b3b0c9e0df0d4f7a05a6bc0ed1302fe40e2428ef4b19a9ea512e3ad9ffc9839e32c218a2f9b79fd74f98bb5cdbfbf7f03dce4176157c6e2c153fba3aa310090a7a9f6a5b166c9e3f84155cb6e1c347a55617b5fa9046c55914a0bf6194a22b4aed1c88e5e88404888419aadd74de5e77dcf1ff8e619723c0f4b3d6ade2d9240a786d29b76a98e7bb78971e15e7f06e378dc7a89fdbeaa7877c6f24385f8f0af2fbcf7d0003987436b3f22f767640018c1e7354a8475ccbb881376ce69277dd5aac37e8f6d4e4870fe1921a9e777e1f7d7db51d6f6d559ec775c1565221836c3b7b1aad35fbcfcd204048bad2ada700ed4209c23c7461b0f75caff50751ab8ffa69fa36abef15cf7e096d7b4296bdd5d88eeb3fbbdd2e72a213a0ce8f2e4f9e7cb4df942cb97dcaca9a11742e9cd9b37a8ca11f1d8c5490ce3e1533cf88be27e9dc87dd70178d90c5e36c073e0536d63d3c1efb36518085631b47b1a545c49aaa0eaff50bfcee520abca77b75c2125c1d259eb87cf6d21c4bacb8bc38bda09b1b2fe9bc37f7073419d1c9d100952013077c71a20e4d518498e5e2aa60389130ae6868b1ca2cf5f9e7174fb4d97eca88aac6d7f56750ae43e42552d7921028344eb1925136cc7ad6bab87f559b3c992efb8b17fc7e3e43ee8d0a1736d7fd9df961fb69978861ce7d4caf45d47ac4e5e051ab7de62a742746474b4eb7cf0e584ff5e7aeb07426cbc7ed588cd2079d432af218a6b401b15c63540bb0a02e55045c9bd8be88a602d8d6123ca70f63bd6364a24cc1642073c12166e8b40c26070f32655145799fdaf2118bcfc5a08081647557cc385e046ae14f0d622ef16e4e0b0c68d0684c5c7d1dd0e6dc829e3ba0ba7b6489bdd649610873f7ff42387ad10a26ddee157674889a5e9a52d7b1efcbc7cd79d69fd9a3f21eb05a9bd5db76271ae382d66244d17b70b298358d789d6966ba65e635d163357cfc4ce58eabf6fa31fbbbc9e351d7d73a01c27ee73793df97b554055261ea68d1d3b4e306f98f8a3a545c14868f00d40c88354227f1400d1528a93e9640c8d7d6e5d690d72554c91eeb52fbbc6ceba3135356e246cedef6aeeadb85b888a93767e503641884da135976ce821c44fafaf1ce0065445cba2371087851bcaa0cb454242e9f499b7091110943ce0ae7a327aa34a04dba7eb9f73a324e215015b0aa620f1795519541efbbc38aab2c01d3934186a201cb89e7d9209aab8205e240dd63512942693a18608658ca3727f77c83fbb7ed05eaecf76e7747a24a3408803fe79d0968e574bd80fa51f71e005f25d57a655bb0c53a87d685e6c9fac1617c5d6e36a71ad0b6377687b97b5f2bfafaa26f4f902c697e21ed046850404558ba86a646ed3e8d6ca0908a98ad841baa72a459f0462806bb2b9f822ba79cd0810ad2b0e2fcaf037e0f3db2fbf360282c55115b78dc091e88b64a774ed2099e0c6a30d88f524f81c2384e1ea5b4af3ce3842dcd0a87a203ca08d040efc9de880301d509e1403c54efcdc2f566cbda9df151827f2b31bfac81889124090dba3e1c6359e769d7bbb90b19271aef5f83ecc5d05d996f906ffc5c61bf0b0b6400d0c11caa674632632486c5d23e1f0a970e1c2b42613a1fd28fb1d3cc709145d5b10d26be6f6e071dc502301a13bb7d1c681b6282424a8620406006d56e4ccc024443a786df6fea8d8b3e2c0efb3d8e700df47580ceeb151ae5ae370b9e483bfe34e00765258ff064bea2f8d80a184551505fffb7a68a36da41e099f03356c083ad06003920a05366064a0aae9c22048934c04086be00029d0110906236016a45ba65c48904c11d2047a0707271c581219437fc1421bc881f69dd0fe5055f519f0f965d0462323777fc47187f18d407a6a1e7055cbef35b8873d87aa29ee1f8fb60d788e0e80c5806f0eb47f2dde2b8eaae8a081839a0e1a94111f60cfc37a8b02475f0f1c7e3decdb08ac331cdfda93549d066d92d4611e8880601be0e3bab6eed4d18ef685f7fd0dde8304e478a8e1fd35f03e5235a2c4c19c1de8aa55945819e72eee177b548c84e633f61caeef0758db81f619faf74420f0f3fefae7bef7ffeadc6cf775f9b54a2058d41546640be1b612baa0894b26c8713149220db262a68277174a22292c9091736c248120e140a328e0451120889f8960fc468a89e38a425aea7abcc9112513ee478fa91e78ae206ca36482de52dfb1e7b0662a325299e1c6e64671201ce2661dff5f5d715485f122dc7984d617974cd8ba4e05556c1aac677e711aad6b6088683da35718638cf8b50bf52c4e069d2188016092087762e0dffb22aa11be2db4b2c792475071003e974cd8f77cddfcff235134b6fcda090896b0aa9879db8b0076544d073c2728b86160a3a5409a6fdc70c499618dfefbb0517d2a2cdc70600c251516120e5b47ffd74a507c1b83d5dcaf9e0e6c6efb084a01c1b2dce24152f72c7c0e048908467ff67ee61f6f348a23e108881cffd594b0aa685ddbd0b6f49ae2499071428282eb783bb471fd1a6c2bb4aeb9ea0a094936c30f19049c4f1637c1bdaa7ca93d3070ee741d8e31cea1b1c56175234bd0faffbf12547e2b04841747559c83f3d94c70232201818d4784856d241fc1e01b0d37f4437a5b200119ccf0b493e9ccafa038ac86c28dcef5ff85cf17e9df932d020ffe00b7c7084b3181924994fbc9f33aace3f98bdb367eae1256156790b05f5c32a15429b85e0d0c135fbf21b6fe79c4bcc5ce036e1ce671124448b8a4c9920e22e1f125a774f4cff7f8e076f6f2f7ff57f6b0fc56090816aee2823679baf7841a0f7eb8e8c5ba03da904f9f36144814a1f17a9b366e2fd606b74a52619da2a3479fffca4b14dc33c558f6c538fdfb285c901385c0309f3be42068ff57afebc71a3e8700d1e8013a1cb26160bb98e1395cfffc7f5de10c098c0724bbf1d61facf310ae532619a3b797f51eb4c71bbe5f92f8bd34efc83030b757f2765bc83e8775500fb632b84d9f728b91ca2a47fc5ff94d97ff170000fffff898dda83e6a16740000000049454e44ae426082', 'image/png'); -UPDATE PRODUCT set PICTUREID=10; diff --git a/samples/core/src/main/resources/db/migration/mysql/V0004__R001_Add_batch_tables_MYSQL.sql.mysql b/samples/core/src/main/resources/db/migration/mysql/V0004__R001_Add_batch_tables_MYSQL.sql.mysql deleted file mode 100644 index b32e03c2c..000000000 --- a/samples/core/src/main/resources/db/migration/mysql/V0004__R001_Add_batch_tables_MYSQL.sql.mysql +++ /dev/null @@ -1,103 +0,0 @@ --- Rename this file to V0004__R001_Add_batch_tables_MYSQL.sql.mysql if the database used is not MariaDB 10.0.27 - --- Autogenerated: do not edit this file - -CREATE TABLE BATCH_JOB_INSTANCE ( - JOB_INSTANCE_ID BIGINT NOT NULL PRIMARY KEY , - VERSION BIGINT , - JOB_NAME VARCHAR(100) NOT NULL, - JOB_KEY VARCHAR(32) NOT NULL, - constraint JOB_INST_UN unique (JOB_NAME, JOB_KEY) -) ENGINE=InnoDB; - -CREATE TABLE BATCH_JOB_EXECUTION ( - JOB_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY , - VERSION BIGINT , - JOB_INSTANCE_ID BIGINT NOT NULL, - CREATE_TIME DATETIME NOT NULL, - START_TIME DATETIME DEFAULT NULL , - END_TIME DATETIME DEFAULT NULL , - STATUS VARCHAR(10) , - EXIT_CODE VARCHAR(2500) , - EXIT_MESSAGE VARCHAR(2500) , - LAST_UPDATED DATETIME, - JOB_CONFIGURATION_LOCATION VARCHAR(2500) NULL, - constraint JOB_INST_EXEC_FK foreign key (JOB_INSTANCE_ID) - references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID) -) ENGINE=InnoDB; - -CREATE TABLE BATCH_JOB_EXECUTION_PARAMS ( - JOB_EXECUTION_ID BIGINT NOT NULL , - TYPE_CD VARCHAR(6) NOT NULL , - KEY_NAME VARCHAR(100) NOT NULL , - STRING_VAL VARCHAR(250) , - DATE_VAL DATETIME DEFAULT NULL , - LONG_VAL BIGINT , - DOUBLE_VAL DOUBLE PRECISION , - IDENTIFYING CHAR(1) NOT NULL , - constraint JOB_EXEC_PARAMS_FK foreign key (JOB_EXECUTION_ID) - references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) -) ENGINE=InnoDB; - -CREATE TABLE BATCH_STEP_EXECUTION ( - STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY , - VERSION BIGINT NOT NULL, - STEP_NAME VARCHAR(100) NOT NULL, - JOB_EXECUTION_ID BIGINT NOT NULL, - START_TIME DATETIME NOT NULL , - END_TIME DATETIME DEFAULT NULL , - STATUS VARCHAR(10) , - COMMIT_COUNT BIGINT , - READ_COUNT BIGINT , - FILTER_COUNT BIGINT , - WRITE_COUNT BIGINT , - READ_SKIP_COUNT BIGINT , - WRITE_SKIP_COUNT BIGINT , - PROCESS_SKIP_COUNT BIGINT , - ROLLBACK_COUNT BIGINT , - EXIT_CODE VARCHAR(2500) , - EXIT_MESSAGE VARCHAR(2500) , - LAST_UPDATED DATETIME, - constraint JOB_EXEC_STEP_FK foreign key (JOB_EXECUTION_ID) - references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) -) ENGINE=InnoDB; - -CREATE TABLE BATCH_STEP_EXECUTION_CONTEXT ( - STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, - SHORT_CONTEXT VARCHAR(2500) NOT NULL, - SERIALIZED_CONTEXT TEXT , - constraint STEP_EXEC_CTX_FK foreign key (STEP_EXECUTION_ID) - references BATCH_STEP_EXECUTION(STEP_EXECUTION_ID) -) ENGINE=InnoDB; - -CREATE TABLE BATCH_JOB_EXECUTION_CONTEXT ( - JOB_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, - SHORT_CONTEXT VARCHAR(2500) NOT NULL, - SERIALIZED_CONTEXT TEXT , - constraint JOB_EXEC_CTX_FK foreign key (JOB_EXECUTION_ID) - references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) -) ENGINE=InnoDB; - -CREATE TABLE BATCH_STEP_EXECUTION_SEQ ( - ID BIGINT NOT NULL, - UNIQUE_KEY CHAR(1) NOT NULL, - constraint UNIQUE_KEY_UN unique (UNIQUE_KEY) -) ENGINE=InnoDB; - -INSERT INTO BATCH_STEP_EXECUTION_SEQ (ID, UNIQUE_KEY) select * from (select 0 as ID, '0' as UNIQUE_KEY) as tmp where not exists(select * from BATCH_STEP_EXECUTION_SEQ); - -CREATE TABLE BATCH_JOB_EXECUTION_SEQ ( - ID BIGINT NOT NULL, - UNIQUE_KEY CHAR(1) NOT NULL, - constraint UNIQUE_KEY_UN unique (UNIQUE_KEY) -) ENGINE=InnoDB; - -INSERT INTO BATCH_JOB_EXECUTION_SEQ (ID, UNIQUE_KEY) select * from (select 0 as ID, '0' as UNIQUE_KEY) as tmp where not exists(select * from BATCH_JOB_EXECUTION_SEQ); - -CREATE TABLE BATCH_JOB_SEQ ( - ID BIGINT NOT NULL, - UNIQUE_KEY CHAR(1) NOT NULL, - constraint UNIQUE_KEY_UN unique (UNIQUE_KEY) -) ENGINE=InnoDB; - -INSERT INTO BATCH_JOB_SEQ (ID, UNIQUE_KEY) select * from (select 0 as ID, '0' as UNIQUE_KEY) as tmp where not exists(select * from BATCH_JOB_SEQ); \ No newline at end of file diff --git a/samples/core/src/main/resources/db/migration/orcl/V0001__R001_Create_schema_ORCL.sql.orcl b/samples/core/src/main/resources/db/migration/orcl/V0001__R001_Create_schema_ORCL.sql.orcl deleted file mode 100644 index 89ba0f8d9..000000000 --- a/samples/core/src/main/resources/db/migration/orcl/V0001__R001_Create_schema_ORCL.sql.orcl +++ /dev/null @@ -1,136 +0,0 @@ --- Rename this file to V0001__R001_Create_schema_ORCL.sql.orcl if the database used is not Oracle 11g - --- This is the SQL script for setting up the DDL for the h2 database --- In a typical project you would only distinguish between main and test for flyway SQLs --- However, in this sample application we provde support for multiple databases in parallel --- You can simply choose the DB of your choice by setting spring.profiles.active=XXX in config/application.properties --- Assuming that the preconfigured user exists with according credentials using the included SQLs - -CREATE SEQUENCE HIBERNATE_SEQUENCE START WITH 1000000; - --- *** Staffmemeber *** -CREATE TABLE STAFFMEMBER( - id NUMBER(19), - modificationCounter INTEGER NOT NULL, - firstname VARCHAR(255), - lastname VARCHAR(255), - login VARCHAR(255), - role INTEGER -); - -ALTER TABLE STAFFMEMBER ADD CONSTRAINT PK_STAFFMEMEBER PRIMARY KEY(id); -ALTER TABLE STAFFMEMBER ADD CONSTRAINT UC_STAFFMEMBER_LOGIN UNIQUE(login); - --- *** Product *** -CREATE TABLE PRODUCT( - dtype VARCHAR(31) NOT NULL, - id NUMBER(19), - modificationCounter INTEGER NOT NULL, - description VARCHAR(255), - name VARCHAR(255), - alcoholic NUMBER(1,0), - pictureId NUMBER(19) -); - -ALTER TABLE PRODUCT ADD CONSTRAINT PK_PRODUCT PRIMARY KEY(id); -CREATE TABLE PRODUCT_AUD( - revtype NUMBER(3), - description VARCHAR(255), - name VARCHAR(255), - pictureId NUMBER(19), - alcoholic NUMBER(1,0), - dtype VARCHAR(31) NOT NULL, - id NUMBER(19) NOT NULL, - rev NUMBER(19) NOT NULL -); --- *** Offer *** -CREATE TABLE OFFER( - id NUMBER(19), - modificationCounter INTEGER NOT NULL, - description VARCHAR(255), - name VARCHAR(255), - price DECIMAL(19, 3), - "number" NUMBER(19), - state INTEGER, - drinkId NUMBER(19), - mealId NUMBER(19), - sideDishId NUMBER(19) -); -ALTER TABLE OFFER ADD CONSTRAINT PK_OFFER PRIMARY KEY(id); -ALTER TABLE OFFER ADD CONSTRAINT UC_OFFER_NAME UNIQUE(name); -ALTER TABLE OFFER ADD CONSTRAINT UC_OFFER_NUMBER UNIQUE("number"); -ALTER TABLE OFFER ADD CONSTRAINT FK_OFFER2SIDEDISH FOREIGN KEY(sideDishId) REFERENCES PRODUCT(id) ENABLE NOVALIDATE; -ALTER TABLE OFFER ADD CONSTRAINT FK_OFFER2MEAL FOREIGN KEY(mealId) REFERENCES PRODUCT(id) ENABLE NOVALIDATE; -ALTER TABLE OFFER ADD CONSTRAINT FK_OFFER2DRINK FOREIGN KEY(drinkId) REFERENCES PRODUCT(id) ENABLE NOVALIDATE; - --- *** RestaurantTable (Table is a reserved keyword in Oracle) *** -CREATE TABLE RESTAURANTTABLE( - id NUMBER(19), - modificationCounter INTEGER NOT NULL, - "number" NUMBER(19), --NOT NULL CHECK (NUMBER >= 0), - state INTEGER, - waiterId NUMBER(19) -); - -ALTER TABLE RESTAURANTTABLE ADD CONSTRAINT PK_RESTAURANTTABLE PRIMARY KEY(id); -ALTER TABLE RESTAURANTTABLE ADD CONSTRAINT UC_TABLE_NUMBER UNIQUE("number"); - --- *** RestaurantOrder (Order is a reserved keyword in Oracle) *** -CREATE TABLE RESTAURANTORDER( - id NUMBER(19), - modificationCounter INTEGER NOT NULL, - state INTEGER, - tableId NUMBER(19) NOT NULL -); -ALTER TABLE RESTAURANTORDER ADD CONSTRAINT PK_RESTAURANTORDER PRIMARY KEY(id); - --- *** OrderPosition *** -CREATE TABLE ORDERPOSITION( - id NUMBER(19), - modificationCounter INTEGER NOT NULL, - "comment" VARCHAR(255), - cookId NUMBER(19), - offerId NUMBER(19), - offerName VARCHAR(255), - price DECIMAL(19, 3), - state INTEGER, - drinkState INTEGER, - orderId NUMBER(19) -); -ALTER TABLE ORDERPOSITION ADD CONSTRAINT PK_ORDERPOSITON PRIMARY KEY(id); -ALTER TABLE ORDERPOSITION ADD CONSTRAINT FK_ORDPOS2ORDER FOREIGN KEY(orderId) REFERENCES RESTAURANTORDER(id) ENABLE NOVALIDATE; -ALTER TABLE ORDERPOSITION ADD CONSTRAINT FK_ORDPOS2COOK FOREIGN KEY(cookId) REFERENCES STAFFMEMBER(id) ENABLE NOVALIDATE; - --- *** Bill *** -CREATE TABLE BILL( - id NUMBER(19), - modificationCounter INTEGER NOT NULL, - --Changed type of the column payed from CHAR(1) to NUMBER(1,0) - payed NUMBER(1,0), - tip DECIMAL(19, 3), - total DECIMAL(19, 3) -); -ALTER TABLE BILL ADD CONSTRAINT PK_BILL PRIMARY KEY(id); -CREATE TABLE BILLORDERPOSITION( - billId NUMBER(19), - orderPositionsId NUMBER(19) NOT NULL -); -ALTER TABLE BILLORDERPOSITION ADD CONSTRAINT FK_BILLORDPOS2BILL FOREIGN KEY(billId) REFERENCES BILL(id) ENABLE NOVALIDATE; -ALTER TABLE BILLORDERPOSITION ADD CONSTRAINT FK_BILLORDPOS2ORDPOS FOREIGN KEY(orderPositionsId) REFERENCES ORDERPOSITION(id) ENABLE NOVALIDATE; - --- *** BinaryObject (BLOBs) *** -CREATE TABLE BINARYOBJECT ( - id NUMBER(19), - modificationCounter INTEGER NOT NULL, - data BLOB, - "SIZE" NUMBER(19) NOT NULL, - mimetype VARCHAR(255), - PRIMARY KEY (ID) -); - --- *** RevInfo (Commit log for envers audit trail) *** -CREATE TABLE REVINFO( - id NUMBER(19), - timestamp NUMBER(19) NOT NULL, - userLogin VARCHAR(255) -); \ No newline at end of file diff --git a/samples/core/src/main/resources/db/migration/orcl/V0002__R001_Master_data_ORCL.sql.orcl b/samples/core/src/main/resources/db/migration/orcl/V0002__R001_Master_data_ORCL.sql.orcl deleted file mode 100644 index 400ea7147..000000000 --- a/samples/core/src/main/resources/db/migration/orcl/V0002__R001_Master_data_ORCL.sql.orcl +++ /dev/null @@ -1,52 +0,0 @@ ---Rename this file to V0002__R001_Master_data_ORCL.sql.orcl if the database used is not Oracle 11g -INSERT INTO RESTAURANTTABLE (id, modificationCounter, "number", state) VALUES (101, 1, 1, 2); -INSERT INTO RESTAURANTTABLE (id, modificationCounter, "number", state) VALUES (102, 1, 2, 0); -INSERT INTO RESTAURANTTABLE (id, modificationCounter, "number", state) VALUES (103, 1, 3, 0); -INSERT INTO RESTAURANTTABLE (id, modificationCounter, "number", state) VALUES (104, 1, 4, 0); -INSERT INTO RESTAURANTTABLE (id, modificationCounter, "number", state) VALUES (105, 1, 5, 0); - -INSERT INTO PRODUCT (id, modificationCounter, dtype, description) VALUES (1, 1, 'Meal', 'Schnitzel'); -INSERT INTO PRODUCT (id, modificationCounter, dtype, description) VALUES (2, 1, 'Meal', 'Goulasch'); -INSERT INTO PRODUCT (id, modificationCounter, dtype, description) VALUES (3, 1, 'Meal', 'Pfifferlinge'); -INSERT INTO PRODUCT (id, modificationCounter, dtype, description) VALUES (4, 1, 'Meal', 'Salat'); -INSERT INTO PRODUCT (id, modificationCounter, dtype, description) VALUES (5, 1, 'Meal', 'Pizza'); -INSERT INTO PRODUCT (id, modificationCounter, dtype, description) VALUES (6, 1, 'Meal', 'Flammkuchen'); - -INSERT INTO PRODUCT (id, modificationCounter, dtype, description) VALUES (7, 1, 'SideDish', 'Pommes'); -INSERT INTO PRODUCT (id, modificationCounter, dtype, description) VALUES (8, 1, 'SideDish', 'Reis'); -INSERT INTO PRODUCT (id, modificationCounter, dtype, description) VALUES (9, 1, 'SideDish', 'Brot'); -INSERT INTO PRODUCT (id, modificationCounter, dtype, description) VALUES (10, 1, 'SideDish', 'Knödel'); - -INSERT INTO PRODUCT (id, modificationCounter, dtype, description, alcoholic) VALUES (11, 1, 'Drink', 'Wasser', 0); -INSERT INTO PRODUCT (id, modificationCounter, dtype, description, alcoholic) VALUES (12, 1, 'Drink', 'Cola', 0); -INSERT INTO PRODUCT (id, modificationCounter, dtype, description, alcoholic) VALUES (13, 1, 'Drink', 'Bier', 0); -INSERT INTO PRODUCT (id, modificationCounter, dtype, description, alcoholic) VALUES (14, 1, 'Drink', 'Wein / Apfelwein', 0); - -INSERT INTO OFFER (id, modificationCounter, name, description, state, mealId, sideDishId, drinkId, price) VALUES (1, 1, 'Schnitzel-Menü', 'Description of Schnitzel-Menü', 0, 1, 7, 12, 6.99); -INSERT INTO OFFER (id, modificationCounter, name, description, state, mealId, sideDishId, drinkId, price) VALUES (2, 1, 'Goulasch-Menü', 'Description of Goulasch-Menü', 0, 2, 8, 13, 7.99); -INSERT INTO OFFER (id, modificationCounter, name, description, state, mealId, sideDishId, drinkId, price) VALUES (3, 1, 'Pfifferlinge-Menü', 'Description of Pfifferlinge-Menü', 0, 3, 10, 14, 8.99); -INSERT INTO OFFER (id, modificationCounter, name, description, state, mealId, sideDishId, drinkId, price) VALUES (4, 1, 'Salat-Menü', 'Description of Salat-Menü', 0, 4, 9, 11, 5.99); -INSERT INTO OFFER (id, modificationCounter, name, description, state, mealId, sideDishId, drinkId, price) VALUES (5, 1, 'Cola', 'Description of Salat-Menü', 0, null, null, 12, 1.20); -INSERT INTO OFFER (id, modificationCounter, name, description, state, mealId, sideDishId, drinkId, price) VALUES (6, 1, 'Pizza-Menü', 'Description of Pizza-Menü', 0, 5, null, 12, 6.23); -INSERT INTO OFFER (id, modificationCounter, name, description, state, mealId, sideDishId, drinkId, price) VALUES (7, 1, 'Flammkuchen-Menü', 'Description of Flammkuchen-Menü', 0, 6, null, 12, 5.99); - -INSERT INTO RESTAURANTORDER (id, modificationCounter, tableId, state) VALUES (1, 1, 101, 1); - -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, offername, "comment", state, drinkState, orderId, price) VALUES (1, 1, 1, 'Schnitzel-Menü', 'mit Ketschup', 2, 2, 1, 6.99); -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, offername, "comment", state, drinkState, orderId, price) VALUES (2, 1, 2, 'Goulasch-Menü', '', 2, 2, 1, 7.99); -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, offername, "comment", state, drinkState, orderId, price) VALUES (3, 1, 3, 'Pfifferlinge-Menü','', 2, 2, 1, 8.99); -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, offername, "comment", state, drinkState, orderId, price) VALUES (4, 1, 4, 'Salat-Menü', '', 2, 2, 1, 5.99); -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, offername, "comment", state, drinkState, orderId, price) VALUES (5, 1, 5, 'Cola', '', 2, 2, 1, 5.99); - -INSERT INTO BILL (id, modificationCounter, payed, total, tip) VALUES (1, 1, 1, 14.98, 1.30); -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (1,1); -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (1,2); - -INSERT INTO BILL (id, modificationCounter, payed, total,tip) VALUES (2, 1, 1, 14.98, 1.40); -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (2,3); -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (2,4); - -INSERT INTO STAFFMEMBER (id, login, role, firstname, lastname, modificationCounter) VALUES (0, 'chief', 3, 'Charly', 'Chief', 0); -INSERT INTO STAFFMEMBER (id, login, role, firstname, lastname, modificationCounter) VALUES (1, 'cook', 0, 'Carl', 'Cook', 0); -INSERT INTO STAFFMEMBER (id, login, role, firstname, lastname, modificationCounter) VALUES (2, 'waiter', 1, 'Willy', 'Waiter', 0); -INSERT INTO STAFFMEMBER (id, login, role, firstname, lastname, modificationCounter) VALUES (3, 'barkeeper', 2, 'Bianca', 'Barkeeper', 0); \ No newline at end of file diff --git a/samples/core/src/main/resources/db/migration/orcl/V0003__R001_Add_blob_table_and_data_ORCL.sql.orcl b/samples/core/src/main/resources/db/migration/orcl/V0003__R001_Add_blob_table_and_data_ORCL.sql.orcl deleted file mode 100644 index 495ec101e..000000000 --- a/samples/core/src/main/resources/db/migration/orcl/V0003__R001_Add_blob_table_and_data_ORCL.sql.orcl +++ /dev/null @@ -1,762 +0,0 @@ ---Rename this file to V0003__R001_Add_blob_table_and_data_ORCL.sql.orcl if the database used is not Oracle 11g - -DECLARE - buf BLOB; -BEGIN - INSERT INTO BINARYOBJECT VALUES (11, 0, empty_blob(),72861,'image/png'); - - dbms_lob.createtemporary(buf, FALSE); - - dbms_lob.append(buf, HEXTORAW('89504e470d0a1a0a0000000d49484452000000c8000000c81006000000fdc872dd0000800049444154789cec5d077c5545d69ffb92d04297d8404db020c15e028a9817052c5850888b65dd447445d85d753fb16b6eec8a5d41455c13')); - dbms_lob.append(buf, HEXTORAW('171509764511352f7614ac80080a449a0816a4a4e77e73dffccfbc37e7bec90b5d77f7ee6f3d9c977bcf3d77e6cc9c32e7cca48aff5d9b731d618174f552c00114f9cda4db8bc16d754d6ee67d7314f0ca4c9cff3d00e76e2a63ffbb')); - dbms_lob.append(buf, HEXTORAW('b6e945726a9343926b7e5fb2eb8ccde26ae32f2e7fc92ec8b3677b8eff5eb6a98cfda75cff5320cdbbc280ae024e1ef0df003b00ee88bf17b3e7803b4e92f7d0c0a48976de46f2b9b9d7b30a786e92fba6e0be29e6cf5e2efe41fcaf')); - dbms_lob.append(buf, HEXTORAW('06fc1a10dfef95031fc9eeffdfb56d2f57012daf7451bf91bc925c5700477f3ad4afc39a7e8d83f78803369ec5cdba52009b29d7de7e0a3ac9e49afecec6b357847f2479cfffaeffd42b0c185180267c0d31d042c04310cc140ca054')); - dbms_lob.append(buf, HEXTORAW('086cea4d0aa6a501deac608b1680b798b0654bc083016f05fc50c156adb60e24fafa7dc7317e5a327ecfc6f7bc0f38c0fc5efafe941b01430a866e50902620872bd4086058fcefda1a571830a280966718425aae8f5190fa8dfa3120')); - dbms_lob.append(buf, HEXTORAW('d7e8779283160301494e3e5050cb11c9d5ef55ae312e699cd2b8b5c935c97340aea93d49ae5dc0b0f80fbdfedb3d9030a0ab80f62c4820e83e36e139c702920091e52205eec4d20b96b56923c49ec507cedae502299cff6a35a0ad54')); - dbms_lob.append(buf, HEXTORAW('0ca9d35aeedaee2d298453437f4e4f9737f7747af802e81ded558b1931961c57fecfe76b77d128241daf44acf7ffeefc2caec02d51e8fcec98f815c0afc07da728dc29717e32bef97871a46f29354ca83b61fd7542d416d7fcb6f632')); - dbms_lob.append(buf, HEXTORAW('21aa2f5c377eddde427cfedadb137eb84b88f7d6bcd0a3bab77ac4c38012cf032708cbcc7b0f1003cef300df357141f7870129a451c1a063d2d70ae67f57f3aeb0020e6f573ed145f03b148743f046f3795fae8767de7a48468610ed')); - dbms_lob.append(buf, HEXTORAW('4eeadca5f34572926ddde2fc761ba45ca7a535b693cf39f3424b5bc909dba9768ac4c742349ed47843546ed738a3a3445a8a1ba372bd9b926bb1935807b96f9e3c0bc8b31e07cee5d1fffea4f0c6eac6f7ebea84a8ffb276e9ba57a4')); - dbms_lob.append(buf, HEXTORAW('5c2fa89ebd6e9d10bfcdfbf9e835ff924ec8b47bc6af947cff72daca168d6f290a24d75a6e49de489e09f6078422d1f24d3064b62f89bb9e40e8776a6f1790f03fec952ca4f29f7665039242a009cc054e03260218e781b4bfa24b17')); - dbms_lob.append(buf, HEXTORAW('e71d212e587ddbb85e6542b46dd3b9e4d46952213c99b2c721df4a6ba45de8f283baca7bf70a3dd8ed1ce10fca637c0523d54104ef54c336ac70e9d62b3c0ff85c312a8af7528101f96b187f575c8515ee54e86941e111e079b83fac')); - dbms_lob.append(buf, HEXTORAW('70799f8bbb8a814780e7a9f703cf1379461b79725c1c2dc11d8d5d974c9403b35363ff05e3e5803cacbacb872f09b17cf477e35fbe5d8847ca479ffacd3772c05e52bbccbb5e3dda08179e42548dd79b38b9f88d6f037f1010fdc207')); - dbms_lob.append(buf, HEXTORAW('a61e6080ff5328962bac80291971bf931cbb0c9713ffa90ffcada1cd1d52ec86f46dd7f74839cfaf6bd3ed4cd9dfa195a18b7bf490f08ed08bfb3c296fbed2f9a5c3bdd17714c7539352a4702e7f2ef062c24d794b302e5c3c077a5c')); - dbms_lob.append(buf, HEXTORAW('7e03f21dc1572a7a118b3cd3f59e1853552565af5bc3830b779306d47d0d5fce7f5488758dbffee5f97f08f1e592770ade950ae3c5cc07effdf967f5889647926bc8ad96732ecf24e7d7b3e7c38024bfae79ff1f57a1fcb72890b002')); - dbms_lob.append(buf, HEXTORAW('7a8061f1cf41ac375e6174fba5c7d490b49ccf9973dd5b474b0bbde5fa36a9674b8590727ecab24172a089279d3332e6c64dd0d910f0af930834298e0a61d87ff2bfa448e6021f053cb1e220dc351587c68bf1b5f9186853028ac405')); - dbms_lob.append(buf, HEXTORAW('9fc5e0d3051d1e096ff2f2def5fef2a3b4e86a8baac3af1f21c4ea51cb9e9afc8c100f3ef08fbf7c78bc1035876c98d0d04fddab0718065603299ca1803fe0ef3400b985470ac535effbe30ebc2d746111376008f1d0ab84e7ae2ace')); - dbms_lob.append(buf, HEXTORAW('edd041883dceec396cc810e9391cd562c8b07952417c18fab4ef1bf2a6a39c375adc6a18244a1e36da7031479be32491b78d378c22b82b0fb8499f29ae665fbee124e5b2e1a086215f49b9ac9eb86eda0bd2d39efbf6870ba64c11e2')); - dbms_lob.append(buf, HEXTORAW('e9cadbce5abab7ba953c98c646402886c6a31524b9df648512de28ceb7e3f59fae40220ae8d014b227686085fe2ec45f6a6e0c771c2c3deb8f7a9c34525ac2a97f4d7bfcfce1f29e5d9cfebb2d147605908d097f0ad4d128780e6e12')); - dbms_lob.append(buf, HEXTORAW('cfc1a600ca809fc13c94e2c080c157255554a3807f0d3c8caf570331b987b34957e3418d177d5f2ac4fa9fd69cf2c47942bc7ec0e315fffa8b101ff678e9a33558e3696800dc17cf9c0e9c069acdb223c807de7fcbe26518d055c019')); - dbms_lob.append(buf, HEXTORAW('07488610290c2909a3cb4a2e3df06221da7cd5eefacb5e91b2fe51ca8cc1f7c83f5ee3bcde6a4693868c033c0cbc690fd8c5046ef3b08b418f8d8b0413bda2175030f04c2a347d07385a63ebcab39c4322bea2a89f5a7bd4fba942ac')); - dbms_lob.append(buf, HEXTORAW('1ab674b7717244dd79eef997bd592f656f60e3cb0d4ca1d41f059c0ca5a34dc83d1aae58fe381e77687b33b085afb0027cd19bf4a4bfe670f6e1d7f56ebf548ea369cf7c75538a1099a7f55af7dd04e96134a6762ff645746771acaf')); - dbms_lob.append(buf, HEXTORAW('38bcb0a7a81509356d45142e3b55e1655ed47e96ff2dc3dfa3dd2def8a44f172747f44e15e2ec3c3c0cb81e78b223ca7dee32a5c3e17c6730af78097030f6bbe8a0c3e87629a21be72357de253e1459aaf22834f21c81edaa82bf479')); - dbms_lob.append(buf, HEXTORAW('e8a1dda5c268b7a4d309d74a4531f4c54bbb7e768a103764bc10bee66a21fafe6df01d3b22aba7e58b0aa66111360db1e894774d18a2c5784c0521f295220ae829e23f35add25540875809fe4941bf5d464f2e2dcdb95c88ebcf9cf2')); - dbms_lob.append(buf, HEXTORAW('f68b2f08913ebb43c3cc41f29e502832cc4ff2a815aff98a2320c7246f618d73f950d35b4cfe144ef2e7327a11462fc2e811fd987c937f69c833d10ff01b93e748b3f8cdd5fc6e923cfb8ac897bfd43b5aa4f6930a629743baaf78ba')); - dbms_lob.append(buf, HEXTORAW('8710b7674f7bf46de9698c4effd7d7a79e2adbf9aa50eb5658b40f2ccad3623cc937d65242b496fa0e2019ba11e0866afd3d5e29db9b812d74b90a38a50ccf5230243be8f2034abf3be61821323eef5659faaafc2d2b74f219afc93f')); - dbms_lob.append(buf, HEXTORAW('9e25766b3922cea2c914a6055608fda32d1ae0b94ed4c2971e880a20643825782e338ae7295c3e95a99e032e804780e70177912c59a83c1a892beeb3c88557b87c2a8ce7b2705f18f765197c4e15e90a075f64c1656a3e155ea8f9cc')); - dbms_lob.append(buf, HEXTORAW('637c9a1e0ed1dfc8cb0939bd5b494fa345bf56e123a402d9f7829cefcf7c5888bd871dd2ed2b69817d32e1f52f9677c5bde729187a023838d1592d05c023c02bd9cb5e05244552b2291cff8eae88024e21c3e5771714dcf846875a21')); - dbms_lob.append(buf, HEXTORAW('4e9a72d1f0b1b365fbd6b5aabfbfb3fcdbbad0ebfb3c1dbd2d4fca52bc45afa8c42c7a856792e50fb9ce0bc8877a2bc94725f04cbd96a1e86731fa25c00b40af447b382506bde41eb5c96f4c9e33151f49f8ad60fc4634bf345d6fd2')); - dbms_lob.append(buf, HEXTORAW('159a93b27aa72ba4a1744ca7f5833b0a71ccddc3e6f6a91662e6fd6fe4bdb45688ea97d77f010e63f28c7ea47989feee3039760ad8cbe8ef2e60647338df92d71f5d814414e0032c24f11da675ede47b1c173ff2f0928b074b2be084')); - dbms_lob.append(buf, HEXTORAW('56a32748d7d2e928fe6ff7cb842f8833a3cf6eac2b4c782926d47c087819043c4f2f062a3c4baf4144713900159e093c160250cf459c3151bc10d3656c00293c532f5e2abc50d32f009f0acf56d92ff22b2fc7f7d173cde3b3c49c78')); - dbms_lob.append(buf, HEXTORAW('9c32e0bd366fe039739dddda48cbb8d3693bfd69b0f4040fab1d78defa3942bc77d0f3fd67af97377c2c9ed116363c0fddbf61e018507aea590c380ab084c1c50cfedeaf8802da838e33844666dc5bbb4b8d103bdd97b5f76bf2efa1')); - dbms_lob.append(buf, HEXTORAW('91a15927f83ded4849f27b46cb99368894a14172ed3043a3848552638ac48de25a3eb421a30cac126d6099f42a809362aa04bd4c162a73f8b8b018709c5f32e0285416534c8c5f2ecfa6e1a5e955f2e97bd3ae94dcd4637797be50df')); - dbms_lob.append(buf, HEXTORAW('f5831f3bbe95103b7f9ab9fc0be9617f59f5ce0d3f7f2af0c980590c87bc9342d10a02bf7b7fc17d6c9edbfe06d21f2d84155620517dc60e27ef7a89ef1a5ef1d8c49b2f9396e8888abbf3abe4d499724beadb779e246fbac2dba7e5')); - dbms_lob.append(buf, HEXTORAW('21712e385c5dc2c9d5952eb4f1bbf5be6c06c3faef70d1f573b98c4eae41c705de53d309b3f787d9fbc38ccf30a3aff0fc24df97cb20bdcf765fbeca95dadc10175dcefdcefc96b709d165c7aeab6e7c4f88bb9e29fff3a27385b83a')); - dbms_lob.append(buf, HEXTORAW('34b174947c93b3a7f36afa27eade361f2bd8fa76055ba2ce200da18254d425a4a0f092425d8101ea6e0ec75bf17215e072ed7fc788fbef7978974764bbbc30e9dee9470ad1f9c25d5f583a51fe7181d3eb9056861c303913a69c8581')); - dbms_lob.append(buf, HEXTORAW('73b9e6fd6c9563848838bddc24e3c43ebe368d5f3bff4d8fbb00bf0cdfd41017bb52d3d21ecc96f27bf0b5c7be37ed2a21ee5835fd377fede4ac4bafbee4f057d43de92a36a0e5bad5f10a527d4a1ae45b87bc28bd9a0c0a2627342f')); - dbms_lob.append(buf, HEXTORAW('6efbeb8fe2818415d01341448190b43d8e4a39addc8f399ed6f9921f1f9d2f3fa943eac4ffbb2cfae7f342c3e35cd60258f8e3d00d8360afc203901e45a67a9776b9159ec742539570c15d71a2a2a7435cf9e0d1e8d69845c72c38')); - dbms_lob.append(buf, HEXTORAW('edf910ae426222839e33435c01d7ddc6a70bbc58d5b54b5c2df2f31017b71423c00b359f59069fd92a24e6ccdcb2212e7df51367a7ec2907d5c0f61d730b8438b2f4d495bb5c29c4274fbdfef67b7200d6fd5253438b8f3a04e0022')); - dbms_lob.append(buf, HEXTORAW('a0e847707f0b180e094f2ef7588b3c07c6ebb5d78bfe6ab44015faeff71cfc3693d2609d16179467ab954acce0fcee107f96b46310f7843f4e67c27fab53a6444728610a8bc2f0ceaa62762f5b059c888cbb14d3e329907efe8f45')); - dbms_lob.append(buf, HEXTORAW('d176f2f34e8337e93876c897e9210977ddc317e81f390dc9692675ca12f535674bc54885dd6779f709a84596fedf7ca37c3849875f3f44796eca5eed11e495e621a7c319df2ceb45c43b1e89e5ebc25386fcef57b5720a80f50c12')); - dbms_lob.append(buf, HEXTORAW('661288ed39ebbf895f4b652d31fd3bfdbe4d6f2b70ea1be43fd18b86dad8026e8b0521c7a82aeb4645971973b8fc5564b31e0b2a13866824b5b6880b2aef400c18020d73d177caeb684b8f800d4316c169a2ad4aebc7aae1821311')); - dbms_lob.append(buf, HEXTORAW('ee2c2341a17232f60f44dbc140561f92a241608716da1d8325d2d3f69dd61bf9385e833e1a4437b7e24c4d7bd679c551e1162dda45f9e6df8b3ba470f38c569ac9e84f6682a31a107c84362db3cb4e5323e4a14f0e5fad2d327bc9')); - dbms_lob.append(buf, HEXTORAW('47385b4521f68b7ea8db3e48f473b3bef72b508aea5e5a2ff660a55c6aa0d01c859a596b3e8dba49c15a8fbb4bc642a26f85a1d8d8766cbb1a25702fab15092a25fcce8050c17d02b64e322a6984c7ef39284e42a412fb399fc16b')); - dbms_lob.append(buf, HEXTORAW('0905c1e70572bae4ab1052ea79d33d0af70ef727ad76306ad1262dff29c65cba5c73163c2ab777efb286e2295b5185071a04358f4bb561c61866f7345f27b5720aaeb759ebbefb2f51f77eeedad4608b1ffcbfd4e7db1a3ff5be8b')); - dbms_lob.append(buf, HEXTORAW('d81fea2a17d714de13958a476510f5d29da466120b64a038759302e048b2cba7c65014a8f661470d0c180cc648be585164f42683cead1480f643ff01dc673598c4f12b330eecb32f80c93258745fe584cb8047f570ab0447b380a7')); - dbms_lob.append(buf, HEXTORAW('7816769854a7c293c171ecd4c78343cb6be9562cb69b35aeeb0e7b1421cb25fffcbf6972a7ad67dd3fff646ad1035376fa8e079f35e4fe087038f002f31e1761b706410d15e4ae0c3571c97ecf6e88043d709d1eaa3f475d3fbca1')); - dbms_lob.append(buf, HEXTORAW('fab9db69d3a095feec860898057c255126f3e0ca29842cf54f7b1fe136cb1991b44b1fa8a02e08a5e72392683cba45fa80db002f57ae6f1307ee3e42fb3297e35bda007a5e871c32819bf31c55a01fa61f06fd2afd49e378dbf4db')); - dbms_lob.append(buf, HEXTORAW('bfa8973fcecab8e13339e1d203deb1ee71cbe6ed92d5291944f5dbe00c9247c2d84d27ff9da87a738b57b245bfdfabd2a90b0023a0b474e1cfb1edafbdad41be53c76ceb09d9e901de0fc14aa3ce96f22e83904f3da155e0641598')); - dbms_lob.append(buf, HEXTORAW('5e18bd08ef624b82b6fb7e894a04d45b7e5a28069a61660d322b765bf04b355c6814f2a2474f11d8a6f872d9697989e439ca7021c218e6215e210b49858c13c9cd8402b34db8185e22a40cf926da62dce2c66d1966c999040daf72')); - dbms_lob.append(buf, HEXTORAW('d4ede437272e84e037aef2e3d9077339f7bcc27ecbdd158aff3ea115bf6bae0a102e02ef00860097e07becd1409d56d60b1df571ca3fefce02b7b2f971e47dbf69f4cf73d8dd9cec79d4e8ff3282bd9623059e6b92ca4c843300ef')); - dbms_lob.append(buf, HEXTORAW('3ac2bf5c4e9aafb40dfd1868732902a028686a2c72bc8b35808a9c44cce207e831e8e85dfc266f2cb43ca4e52c388f31b01bf0a2f481c0a0ef0bba543b65231fba1ab8e6376bc3b4f52ec76fc3e977ebdb3109fcd7beb8325efe29')); - dbms_lob.append(buf, HEXTORAW('eb002dee326d4f24b38c1c59ab671dfd65b6cffbd2990b0023a0b679582a1ef653fef78f3fa3183e4bfbd50bff3a422117031a547607a0e3aeb435be80a1f8461ebaab45ba778e3d26c039e43bef268e4b49f0b5c790e2c7416c76')); - dbms_lob.append(buf, HEXTORAW('7624f2253e36afacb09585ec4679ec1676c002abcd0f41c4891c8e7f603fd30be2fa1e7104b070e588a0a2f08649b450c3e93a74f46f0f6cd1a782d17b45edf437aa087b43bf6afad3e948ae4e5e71efd4405e9627b735d04e89ab')); - dbms_lob.append(buf, HEXTORAW('feb104026231a062c002cd91c0e135ca0ef4c0594beef79336fbdc9df5baad3e89d2e8ff80af06ef17ad737a3f2a3dac7b69641064c2926eafcc45973564320e0b1b290514c91287ac90d0d538e89bec3c69f13480736e83797dfb')); - dbms_lob.append(buf, HEXTORAW('82c3193dec61a46997cbe08648935c9ef160bd91e2d3d923da55df641d773fa4b8fa4edba0e377c749b105fd7ccb861f549ea16ed81907cbbc00b184e8a2413300258c2e016bb7e6f0aa444010a7e84e440bbe41f8fb61a72bd647')); - dbms_lob.append(buf, HEXTORAW('59fb49bfd6caae8c4e78b5465920a59be15020dc4626ed1359dbe1ab7c80e41043e1591ec5c65bf4a2f4929289e665b6949b3e5ae760ed26e2348bbddc834dbc000c947086baa9e284ad47396e48042aba5081c21c01c786e1116e')); - dbms_lob.append(buf, HEXTORAW('2d3138f9e8e1ddc17c67d0ebe07f8e685b8dad4b49f7ec8fdd2723b719f31f3a649cbedf5b71eada401471e090d382a557381534cb988118d009630b899974e3b960651b7a77bec9422278a9cc8a04e9356c81f478bb2c3e78a449')); - dbms_lob.append(buf, HEXTORAW('eafe2b632b0369519c57361c0d8428a3c64c4d70688be635bfb4abc961833882c86464c3131fa01f9d8347e631e2fc68596bf84fc26358c821e8e8bfb0a9be4770b876c9dfd9d65fe1ac9ae1bf67ce3882b855878d897535e953ef')); - dbms_lob.append(buf, HEXTORAW('f2f7356de545d8d9b10b2f588a3087092ef45c04b80937c9702d2738b3787d3f8ebf7a2405c05e20b6d865f7d5bddce774bd7fe938e4fbdee87ac16887e7e419ad5c58c854c144e9e0362ab729a3f11ef52825c8a8167cbce2041a')); - dbms_lob.append(buf, HEXTORAW('9b4780ed9ba9010d95316cf2116c3263ef3189f0a2fc3692083f404adde53c806888d4f3e00a712df1b991c602bec2a80c22b43b2c0c62eaab2ba15f9dc68d0d9b463861c650b7629df7555df3a217ed87571e3cbd2725bb9b872c')); - dbms_lob.append(buf, HEXTORAW('e06b5ba151b5805c049a1ec81df6940d2df29df3e0f7fa7cd37576d128746e19f7ff99ef4f9d78c993c7aacfcf7e9a13347dc16e74904e5577141f25bca4230a5f8aa0cd433e9898dd1b37bd6444fd18f6d1552095cd1b31b44267')); - dbms_lob.append(buf, HEXTORAW('dbe56e268f9a9041e06fd0ab48949df05fd2c6d6025e437e6f1327a317e2b8cf6284cc22f85fa2c1e9495df606859d1ab741cb1195768ef942eed2f16a2e7b23ec7ecd1284568ce336ba6d7abbfe92d7b4a80ff85c14cfc7d3120c')); - dbms_lob.append(buf, HEXTORAW('97744c12dbf36b2bd154858019dc61851c0df3a205c3dec9f974b8d1aaa09650cf0b7baa0892e3621bba0014bc1e262566a4f42ad3114e318a3b0ca4ed2169760829167f11c08d769948a9e54001be29fb3c7b0399f68854158944')); - dbms_lob.append(buf, HEXTORAW('f163a13cd5c83c8469af14c240bc442020ee887f19cc263969c83b784711f2c47840073b445a8ded3dc4555168a93efeb055c29cc4db4e09ccc502bff1c889dbfc93ca4aab710ef2f7ef1894fcfc41f6960e55a6026eee303d3054')); - dbms_lob.append(buf, HEXTORAW('e27ed453692a93078c380f50da2bf5e7cf79cdda527ddfac1f405cf4bc3487cef94f869e601c5cd437e956cad81d6d0682784d57a622b51cf594330067dab67ad4359da63b51944d42a26bf2cbd564a8fcbe867a2554c7ef98e08b')); - dbms_lob.append(buf, HEXTORAW('6f4dae09a5f26e337339e5fc7257963ed51a2e91780be1b4f3f29bfb68a7a9a1f36d32369d9adf569ddf714e283da97de2a95946a1757fdd688ec43ed41bbc01799bf6b1c7f0fc82fbe68f33d91ed5d488845456a087f517178e11')); - dbms_lob.append(buf, HEXTORAW('d859997cb0eb83b943ab23a5a2814cdadf18abc0c752ff09e48d61c0bdc53b8bc4fe161e03d919b33dceb13c5fb20d973ac17567f47415111f0b0898bb1820afd143e12f840a22bfae07dc467b681f7d4ef233eb34d3e9502f22e1')); - dbms_lob.append(buf, HEXTORAW('543f15cf43bbda198d6c602efa9f7fac9c073268ebdb4e4fb543b4d10c38def9f8cf7802f79b7c2f3894f4458476abea8104be1d9f88e22c6674f85c7f13994f1893dc3c0d758e07dc047ac7d894f1e586ad695f1efdd479fb5831')); - dbms_lob.append(buf, HEXTORAW('0877bc737ec8182c3560b0171c0508b73144cfb55413f29c3bf42df281838dfe53110cf6e2613741fc9356dde29e5baed9c8e7fbdee0ef99dc778f9a9efc7b707f65443bfc5c92fe480da09f2ec01773dd5bf28f0f3747b9bf4347')); - dbms_lob.append(buf, HEXTORAW('dcfa42f9f37c707d1efc9e42e6cd297eadea43f99f15b64d2a382bdb8f1c6e538b17c107dd61eba00d065f4c65ac685cbe88d34e557ca5b2ef07093fc4e66ed61e33726cf54b0b849f24cd725d5e32aaf951e8833cc59d11a5bf5b')); - dbms_lob.append(buf, HEXTORAW('47e59413a80ae05b2b7b85ca71cab6008597f0ef6a0d3f2b9d9d7f6f2405c05f46ea2ca691429ef48c36acc9f163d2b159bf3b2f3dbbefe80a6900c59fcb00bb5c59fa32dd90db88fecc60db84fe1678a5fa2f8550e85aea27469f')); - dbms_lob.append(buf, HEXTORAW('b0b692d66e277013a0acf005e067c10a8ff13ffaa95ff13069fe98ccf74c667bac127e1d761bac9c722ff6850c991fff371daa6a358e1c4a7b4c072189f0aefa70eda9578187c636f2cbc370b7886e6330bf7115f59b84fe128241')); - dbms_lob.append(buf, HEXTORAW('4fbd19bc05719f0189f198ccf0c7c4f0eee53f834b45f2f1520927406e1fd8bf15c41f4f766a64f86e6868e6bb59310ddafdfffcebd3e95defbc2499fbc7110fe488b8b74fe088ed2d5a12caa1ba1b4609c0def41f1e8b62e698a0')); - dbms_lob.append(buf, HEXTORAW('311db5e1d9bc784ae10e2c26fee796d5f3905b65cda7aef470ef16939e3fc73389ca9d46f2804a47eabd4f54a9003edf9a9509f8bfe58a5e439ee585ab437e88da1f6d65978aa7f4ab52429fa65267d87f611cb31e54cca2bc9598')); - dbms_lob.append(buf, HEXTORAW('6c1ef203cc1e967805f0a076620c443f40b997c4cb5d02f34db234e0a329be2578f0bc1f9857c825f3d5ac3144283fc717e07b1f6b0f19ba343d2617ce7623ca7e86d645662eb5e6d2bfd7359ba8dd8a76ea91cd19f3df0d6238b6')); - dbms_lob.append(buf, HEXTORAW('0207998e93c54b87b3f02c213a1dd80057674f090deae0b6d0b0023cde124d1b59d14885eee2e51c08f0d8f68bcefec7ef283d3c6b6ec71bddf00d95428d574819e70292bc51ab3a41829290e35614530b02a2d69b622c9e25a2c0')); - dbms_lob.append(buf, HEXTORAW('f5f85b0a6b2823d96661b17322860ef53782e14de4cf065cd26e17c5a43534ac1165a425cd64d1dcd7c7c6fbc77ac7fd25b6d7df5aa5f779122735ada9036a31384b874cc197cc4d68c1cbccde433072118969e2978b6d946a64fb')); - dbms_lob.append(buf, HEXTORAW('6d8bb55763769b1b5c86ffdf9c7270831ffa5992b7fa42c2d3a10687740da5e1b8a446fabbd8709b5d110065ccc5e8adf75c80a7ff743b1fdcecfef30460e6ca7ceb9d8af2497d20c4388cb970e2166a9ef27f9e56b72907f92a7e')); - dbms_lob.append(buf, HEXTORAW('2666e92e830fa9516fae84f6b882b58f1eee03e937e89a60ff9481ce2b28f374b7b8441cf16e27218fd60c5bbfabe2c8e379dbedc5c7e25be58e19610d726662576d8a3cbfb590572ae7fe999752fbe2465736de3127d901b9d4b0')); - dbms_lob.append(buf, HEXTORAW('28fbb118650e3b90a9afb1dcbdf6150e942d64dbeb6b5027115a0652682fe59cc7d1f3e7d8f47ae94c8df9ce3bb0f8fb3649215e8553673ad2007b6046ded51890aded8449765e0c9d2295d780ee3b48554c8f8cc637ce6313ef30')); - dbms_lob.append(buf, HEXTORAW('c3e4991f042c264e9c0b64ae16226e0c9765565f9f8cb977c37f35d39018e9f76f9f83ba50bfcdae0c786bf2227c2da11d5dfcf961371e617bd2a0e90967ecadc947fb43a41d8d78c2c15efda831c048bb9b99b3a264f9f8cd6267')); - dbms_lob.append(buf, HEXTORAW('7b96bd7e37638540eb85f9e297d13e73378ff5290ce19a181a4cf6bd8ddbc4f57b6e7c67f89087a22c0f562b984e7e5dfbe47a684ad32d3873df2bafcdb27ce14ac7960cdc75291cd176fb5a2c677c310908a830a6351cfd4b45c2')); - dbms_lob.append(buf, HEXTORAW('438f0c955efb5243bd8924738bf9516fab4d8ece8f180fec3df5141ee7dea0da9f70b275778cf44dbff48a7b79fd66a6d8f40d624537cc9f8658bef0179b3ad51062ade2df429bd3db6f6c2f865f2eceafe85f424be5217a6eddae')); - dbms_lob.append(buf, HEXTORAW('9342176fc7eb7cf174945f0c5b28af98b17abbfe903da48aee95c1dac859082d16b7f8b18f102c048531c24bab6b10249e4790c5f3226fd40e99ab538a4f5c5b71f0f01f4bb86b6f6d8dc023d1a1865505fab90764b27fff102bd9')); - dbms_lob.append(buf, HEXTORAW('8001518efe3e994a5420599b2e1d190e760e33360d16945a504bf0016799916a812f099a9de9f24cd962d6a3b6c7b7841969b9e4098e78001f853edf27f7f76b7100fdc3f6a8f871e16a2aa68ed71d5c3d4030d3f08f1fda3732b7')); - dbms_lob.append(buf, HEXTORAW('ff4cf6aefe2a52f385b883d8f3d78515e963160884fa59878b619f13988da178a5c0fec24167833d3275b6e685de1171cae3ff9b7b96fcb81f3fd075fafff15e78fd8065c23290e0a0150653b425ab6cd18290924def3387a7efe94')); - dbms_lob.append(buf, HEXTORAW('6bbbc9df760cbd78a4bf5545cca3863f1450ac99eabb9821c417c72b7532897abe9879e836f97518fd4a6bb24325e82b7ac1745d93df589698491f8befbffe75d59b73ba08b1d0fbbc6e9a94a70fc6bc745a991c3191479e29f6e1')); - dbms_lob.append(buf, HEXTORAW('d457c6ffe519d9ce150b262ff18f969d77e327d3a73d22f5c9a3df1ef1ee5eb2af4e6d9cb7441a982d8e6b55eb9f0fd332adcd313b0d13f6ac2b7bc5bb6a0fb6f81e935b3d2e98bc252d1730da63a3b32737b2e2bdfdf22e37ed24')); - dbms_lob.append(buf, HEXTORAW('47f6dbdf3e5df71ad27bc9d3d0903c11e6a19047ad3d6f78269b9e9db5ad1488ab802e1044d3443d8f6ea77d769914b0d017a1257d8e1031019c89b4dbf06616e85187c60a0915ac4c1a322901a6048c7b0ef9caa371c66182b614')); - dbms_lob.append(buf, HEXTORAW('12dad381599e3bf19db38969b6bcf2b6580f1835c16469cbcb059f05a01fc5ebcea969f5ebc542947e77fd2f77fe24c4bad77fb9b5ea35f5223a71adee1a05eba70bb1b870ce052b6f97e4669f5179c233b2ff86a53ceb9fab62b7')); - dbms_lob.append(buf, HEXTORAW('e4b8e5851060a13e39d1453b1434c56720dd9314ea547542a4549b3be2bdd137b77fa5f3e55539427cb8fce57b67dd8defc191a30dbb29a8435a8d26f44600a7ac977062a83d6aa9480ebea3fff8162be4eb67ecdf6ac2b5f2c74b')); - dbms_lob.append(buf, HEXTORAW('4446dbb651c5617aaa95a6a72a5c9d9e4bf216c1f7e7c57fbf80a72615c738e06a0dab34a9fc2a7af61d1b5ce0eaabec068b29776c2fb9eac675bb2ebf40888fb35e2ffa979cd0260dbea572f22742cc7de1c3590ba442fde1c645')); - dbms_lob.append(buf, HEXTORAW('37fed44ecad79c5fe76cf017851bc4f4fa057e238b37ebbacadf1ffbe57d7f7bffe56bbe1bff93f47c67bff8de937e9dcf8737bff48c5f70997e4687d3174ac5dfa5a1eb375972fe487d256d40fbf64204f6e0ca4a5a70abf8d705')); - dbms_lob.append(buf, HEXTORAW('b7d6745d458f57d4575ada23a6a82a403f0cfa8a9e6dcfb0ace6856cd3f66c79d68e52d2d7ecba7afadbb21d967e3e7fed9a2fd4df1ab96144f2bc7b62a843b111c030fb3de9b5adb3b05c05fc0197fde491e3fc13bb4237a4f43e')); - dbms_lob.append(buf, HEXTORAW('7398089ea8d7939da8c74e34132e3b412f76629ac26327f65156959ae85d64a5509655849dfc579eec6434d02f4336d550289088de369af83470bd6db4ed64b76c64af94e33d31bec3463b683e3d337b449ff406bc48f1a5b7b7e')); - dbms_lob.append(buf, HEXTORAW('6ed1bcb568972feeef8673b3f2c2dc41f462f7af89703a37f11feda877fd51e09788a823535d2f618975a59eba70f3ce2ecec677b48be5cc6a7cbf874f13ee293b27458fb5af8a476099ed4188df87a433d9cb06e5e3bb6dcfda60')); - dbms_lob.append(buf, HEXTORAW('1ef4b393b3ca5550b9c7c48d02fdcf2afd45440ca5ea16c2c828e4953af7590e516062ea78c3ea9a7f41ff87e344cb072a79de2daa327b50ff8f5c03fc91765156979a6ef2779c6f32e9767d0a3f6487ab29f0e6418f4253d17bf9')); - dbms_lob.append(buf, HEXTORAW('6030f1bfc5ac687f741e3098d52217fbdef87d74cea21c43d2dffbae09aa38478ebfc7faffc049ba0d64d57b0f62a056b8e50b01ab0ea4ac02a05375c01b821085f39e1e1fc0ad92f631a0a8e1c31497a36f3bfac79ec3bc9c780c')); - dbms_lob.append(buf, HEXTORAW('69b7d3ebc64edc1e42d0e57e3c463f21666f42cfdc7db3be9b88bc933e7b7dca0173c3621bacad3e79293fe791c9d8048c71ba499509fec896c2c92eb106d0f4f72ed32d8ec6b1b7920daf38828e8bbf8837b5fd2e318f941a9856')); - dbms_lob.append(buf, HEXTORAW('9e32fbc4d04d720289b293f693e7a099e53b8ad10ab582f66533d48f30a0979c8843c876c58105370767386c573e079f396453a67aea2db785fa3e74fcc553bac9bbde40969695cfee3a039d252fb6ddd4fcb16f41562fde85f572')); - dbms_lob.append(buf, HEXTORAW('f9296c6bab5bf5ee9c3aa9cb5af2cd9533eb8d4bbd08f25a7b44bfbb6cd6449ef84d08ea917f8efc31a8325c4b764e9bc6b5e3d4c88672bee396cda1baa7feabb2958d71710bb85d67604bc5a88d36fbac4c9919662d7017b753f4')); - dbms_lob.append(buf, HEXTORAW('e0ee4384bcec5fb14ce0baf62bb052b0fb3d8b2a9a50e11008f2daa3ab8cfc4f99a19da37e5c4d453da4a8b37343de5e799d2a25df0dba75faf6cad5ea03d10e4d737c0b56fa0b512a44b36926a5a0c1811c6458587fec03c62d4a')); - dbms_lob.append(buf, HEXTORAW('91baef50f2e7bdc396bfffde3da23e651b755fcd93cea2415deb1c5f3d1b86f83d11ec92aa66d3b3654b2f6b6edc185f1d1b053dd90f5526e2aae2913f7490bf88d6e8f77fea0859cf84a1abfa8c39a13c951edae800b14240552b')); - dbms_lob.append(buf, HEXTORAW('30b7e27c57235f04780cf57b0ee6cfc0e58ffad7cffabf5f7fa86cde7bfbd3d66f63a21dafcadc379f3a4c7bccbfdddff7984348442a9ce9d2d2e4cd01e6c735289a9ef250fadb97b8655b2f9c2d5f4d5df5ded4134e9513abca25')); - dbms_lob.append(buf, HEXTORAW('eb0d07226e1a647d2eaa3f4fb3aaf918afafd2797bd78a97a904257b45b3585640936c03321b9d79b912e0674c5465e5b5b81b80a6805028bcd5ffbe8b3eee409e74bcb2f549752dcd79fa8f81a44aea013f594fdc13b3469819e5')); - dbms_lob.append(buf, HEXTORAW('ebb50f7bb586328463a60330bf4f4a2652973614b112ac95779dfce6a4c84997c20269ef8ea47d435ac9382ffe382ca3bfdf32ede2d7eeeb5c7e54435e5e33b4794e408f1c1292f9cf5e63942ccfc7ada981972c2fbf4cbe90fcfd')); - dbms_lob.append(buf, HEXTORAW('c4f8859def4b299ab25ac7a63d1277f937faf78fdc78fef90f72f7af196e913249d82673f7abe83106b1ffbf9838fbe14a2ddfb9dbeabdd5b88d617b7fd79a7a9b2cba7a78c6e257d9d0df7af1db0500adca30f5d7ecedda74a7ea')); - dbms_lob.append(buf, HEXTORAW('a6ae7d76260d761a06bcbb13606bb7dd7e328df823ff1ace157ddb28fecbf6b52f66cbbbf0886f892145ec56d2d8173549a9e38addbe1d3c4165b338ba01f9462c6c04b393275e755720a9f31e3d5c8e734e0e0f2375c0788ba8f8')); - dbms_lob.append(buf, HEXTORAW('6ef000fc57de4f253a156045f580a28f1d4f92dc685ce132267c089d3eef7d75a5e74be687b725c482a1ffc4ea5ad4758ecdeb6e54d3069840ca332f0906fb4472c0463d2e715d3961d1bf45a9f650f2eefee86e36a5e17e2b5d613')); - dbms_lob.append(buf, HEXTORAW('1eb8f578297fe74ccb9b0f43a3a141419af0497eaa7756d07f2e0aa7019222a901443d4e0d14482d2994b3400f864c3de4b31e8acaefbf050fcfba7fe900c9ef4da1533f9d25c41e5ff53ae2b8e512efe0f44ceddf647b44bf3781')); - dbms_lob.append(buf, HEXTORAW('e19285f631be3f2e09c1a44786512c5406838d19463cb4ce16f503fde7249ed752f74bbba9c3a7d26e1c36ffd6d7657bae7a71c95deb90ce4b21672dc7906fad482628c80b10f55500181149aeadad40c20a680b0d21b3507739d0')); - dbms_lob.append(buf, HEXTORAW('f63ca9ff0d7e139de164743d5b04d7202a903595c1b6f6d0961813709be545965d31703a8276aab6c82351bcc4f41c028b967c0d82ce639882dd7d359f81ec97e8fbd6afff75dfefa44536eba8e9fbf8f34ed9cb77ac795c76e0cc')); - dbms_lob.append(buf, HEXTORAW('5ba6dd31738c102beefaae66f5d7b233a778136b07ab0faa234f804de87c80d6a190a8de178c57bd35fefd2b567fb77ef59fe4fb96be21663d2bc487552f1dfae21affececd6fdbf9696da67d7be75ee6b122efd7efe9b3ffd4d3d')); - dbms_lob.append(buf, HEXTORAW('5f8b350e1ab014baa2815e7b8f1023eebe679fabef950aa9b1ed91071d248203442b00d37390ada0f02c8d2bc380efdebbf9dbe12b0b3f2607d1f7a6f44d9be01f711c99f8cc9269e3d5937a8001d69fc37edfcd847aa0458471f9')); - dbms_lob.append(buf, HEXTORAW('8ae4dcd537dcd173a5102debda7c35daaf03e115e4537545b6da01a1d25c246fc2a38ee03b4c4b36960e3e26617b704328593a69255b2be04923ae28f183329ff47eadfdc37d84f8e8d1972f9d834a0b9ac8eb497e208fe45954fd')); - dbms_lob.append(buf, HEXTORAW('49410a5955f701c42230290c4ad6a885e751831d05b4070285a23d9c37158cefc7c52fccfe6a956c91aee97bdebefc292176c8ea76ed3195688fbc84ed51093c1cc59bbb6798ade2bd90d622217fb63db8d8fc60ed3fdd4f6c5ef3')); - dbms_lob.append(buf, HEXTORAW('e9c97fa5d4a49dbd502a882f9e89ccff0e0a9cd6f8eaa128b4a70d83a91e5ba3e83de358faba9e514b44926b2baf81e858311558b9429cd6f6922f77f4832a45ce9b87fa165eb01257e103bd760ad795a25e3cae8f6ca50aeac9ec')); - dbms_lob.append(buf, HEXTORAW('e84a1c65491e8237d453627d29d62e6215b854c16b54bc7bb14a72aae8a54a72aa88cf4ec467c3e2fa89d5d2025ad17ae12be51709f1e686270ebe51b6f3037346ce2e8ac8b9e7e0a73b7e3c480e869bab076c58acdaa5eadf0a6e')); - dbms_lob.append(buf, HEXTORAW('4001da0614feac8745b10e1dbb6e06208ec05cfb92097ffba709d7de03280756ddbf6b26af918ae5b571138ea890bed3177323efcdc75ac75a646fac830bbcfe44c08f63fc0c7ffeb6c3fbef223d9a5b3bed729c7ff426551c4750')); - dbms_lob.append(buf, HEXTORAW('d14eed393269c5bbc287072a788b8cf62dd2b1e5e655bc0f14c7014f58499ffe7d871f7b491fb4ebf0bd0777fc5c7d57da7813a6a23d52fea16008213bff2c72ff925ea682730151d9ebec24156a8b76734ed83d8e5f5e41ce7740')); - dbms_lob.append(buf, HEXTORAW('6015e47a6d8e5790072bbc893edf512171c57491b5e29ded7ca02bbe15bda16645f6fcf6339f2b7385786bfcc4111f97a8efae5fae60dda90a560f57b00a9be76c808221795af77f89e15a58c6be471effbb1f228be22700ee61e2')); - dbms_lob.append(buf, HEXTORAW('6b6f033c9ed191cf3ff9eecdad5e92bfaf7c6df1fb6357c5b507af201fca7644f0d891b7d41e3d59857ab0e29df09ec069ed4bd11b69ce634d54bc9bf4279bf2ccf9edda6eefc5bd4f56df9dfabc825caed3fa2b980205ede0e867')); - dbms_lob.append(buf, HEXTORAW('078a5dcb33cdd330f8935f5bcb034165af660c16aef3b0107d469e72ee215223b678a6658f027fc2ccd7a125551fbc0af86342e5ccacc256762e62f91482ca053e4587a4541a6d6cbb7685e7029f08fc38b5c587f3b25908284621')); - dbms_lob.append(buf, HEXTORAW('bd97f8c857c758c9bbdc785c8c02de127cfe5344a7ebda43aa57fdf49010730ffee0d5674608f1d26b0f2e7ef93269e1dffecd8495be28948bf2fa6b553bd42d037c4ac1da0e0ad6c092aac1d9c8351898dac53f9fe1f7e2f9bd41')); - dbms_lob.append(buf, HEXTORAW('8f2c34ac65d43eac60fd5f81e37d759840f52239fe5e07fab57b01d64a011db6f79f53df15e2e891f9136eb8d75f5348e9d4c55f7329d66b0eaa1dc6b1131f113214c5c8b2ca659b4fd2a98213a9bd11e21b05e929a65832704787')); - dbms_lob.append(buf, HEXTORAW('0c95a7477510b85fa72d5fed5c055c992fc4e79ee22e7f8de2d78f7e6cf37e9a108be67ef5fa8fa8a9afef04482191a781a37d1aa058745d485841da64d1f7ac73da0cea70de9df2bd8f38671e74b6881d9d9c8b42d3b1e0e31c3a')); - dbms_lob.append(buf, HEXTORAW('5a194fafc2f7f1b5b97cc8277d5f31a337d1514ba8a728f993edaae885891eda8fe8e582fe14e073751697a24ffcba3abb302aef359f6e707e5821c48b550ffcb9245d2a8715eb6ac8732005a23dd72715acc1dfaba050c820d21e')); - dbms_lob.append(buf, HEXTORAW('478d096b272aa8c7057918b094ebd55a8668c0f869d817b033e00e0aeaac23aa8378501a53537f2a5e280dd5eccffb1c32509a90a1f9a1933a7410b1dd8c6321f362033f03f34abe3312ed31cac04709926fcac2541ef68e783e1f')); - dbms_lob.append(buf, HEXTORAW('f4c6e95099c2298d38368f297a537436a2c2295b7494f6008b417f94c1efd7ce57fe32fbdbaf3ffdedd402b417daa9fe74b40fc9f32405699ed05986b4f3023c11ed6127dd4c746b29103a4190425758fd4f9113dae1b79db8f464')); - dbms_lob.append(buf, HEXTORAW('6971877e4c39cdb764f5561f83ccad3d44bade72444de4a59a3a6da14158e22d1708a72d1d0e545b7bc8e1a6fe32574f402a0db2d8dceac3194d69b56cab8f4af0f94f75fffaba355f2d3c4488c7cfbdf685623991cccd7d7fc982')); - dbms_lob.append(buf, HEXTORAW('4765a72c6e58418a81424d3ac6bb54c1aabb14acbe13385c77da4db6ea6b4028e06a0a052c017c02f43010abe1f2eb9013063029a2daf780c3c2aebd1838dd079c16316b2f10a2a0ed0dd34e91aabced2e9d479fd943f85b9990a2')); - dbms_lob.append(buf, HEXTORAW('588c762a403b299cd26c8bf5d25c66f4f7587f291c29b5dab51f450760995bd3e8ad5432d8d634d87c92fa4bec8aad3dc2a0ab4fb653176d4553bba4eaeb6fe544f2f98af28af9ea89687d8b7fd5af003c44c13aaa7f414cd91b02')); - dbms_lob.append(buf, HEXTORAW('62b4058f0a4644f71a3afc85412baff163eef78a11bba8d04dbac16f3fc261c8e8ad31a0584b316a32743d90c22bd9963763f4d63cd180859ca0143d1a07a400686b13c1e8d9b7fe498fff268171f6c56e919c27ce1362cef3efdf')); - dbms_lob.append(buf, HEXTORAW('f71d26ea7ad4d3d462c2a7b58d2a84a6aa10d9a87a48c1f5eb815f69deaf17cd2959833c1aac5135c0c368c0c447fda4712890465230a45848a1484fe5a78796bd54f5ac10fbfce3b0bdd6499fa3fdaa2e6306a4c5b547265a89b6')); - dbms_lob.append(buf, HEXTORAW('2aa20d50686b96a9d8fa24836ddd53c8fa6f2a19b2a037956d8544e9bac58cfe18b615901bd80a485d597a6562713cbfa9a569b9ed657bbe7fc88b9f3c2b3de5baa535abeab047563d0cd17a0a6da15d2944aeeb419024423b3548')); - dbms_lob.append(buf, HEXTORAW('ef495d24191161b9b6551aaf1b83ce15a193fc92fc409a6d2cdd8d5c35a4c76e629a2d4f839c03fb912c5aa4d9c6a5039b69b66196661b36d3f2d64efaf932ff70fca965e3d3c6ca37adebf8f3573450ea6940d01a024df0a8abd8')); - dbms_lob.append(buf, HEXTORAW('3055c12a0a59214d713df0f5879b90ee5f3fd5bc7f436f86e7307812fbbb0556810ed57dd040f763d5e3aebbb4ffbfa582a9776b8e7f6fe766a5259afdc5d312cb81e7436ccb95787aae968308e823a4005ca703e3fe58fab6c287')); - dbms_lob.append(buf, HEXTORAW('06d281cb0dbec067bb833a1fbe0b146d0869bbdac041a84aa73b3eaba0aef340faa3bec2b1df9d0bc4c0acc238fecb59faf9641d3252fc146939758def41ba6edcb830db03df2fca4c7ab1f476fa7e9dae6bd0a3f68ea55bd3f460')); - dbms_lob.append(buf, HEXTORAW('a6897b7735cef5eb7d3e796d6a8b2fa8ce008bb1e4a9515d904eb2a0c5719277521464d0604d442b0c82f0f4c8e3d031fc6bcddf35ce3c94ba6b193fe4811f117bff8c8b5e7d64baff9e77bc54df93d1eda1d3994d794936efc4cd')); - dbms_lob.append(buf, HEXTORAW('336e14f7d8bce331f9e3e9ba113e8f9969f881798cc61de7b79fa8f7e5b86763efdb7726b9869c521a2fc9b75e83a690ac6342addc9a7d6d250512a86c0ce377dfba395e74e830387e2059ea006880f0fa02aa2760f5058109c533')); - dbms_lob.append(buf, HEXTORAW('078c541f141356f727cfef36263ec9a7c2531b07344a8bf4fd6ecf9ff5e43ed21c58347be44a6c62a605188aa31a03aa1a79ed7aa2a6099e4fe870f54901e809bd8a419ae05f37a1ceaf47a8a0fadfe6dfabc047f595ec3e067568')); - dbms_lob.append(buf, HEXTORAW('410ec486417573fcc5cbaf3bcfb8d15f1cf676693ccf5f9b89b52fda27ccea5492d5ad509d4a38902f6fe2ac9e461431454f8abf0c6b0d49ea2852af6931371ded4c8a22850f3082b48b293c693de08a63789bbaf655fefdde55e2')); - dbms_lob.append(buf, HEXTORAW('b7f6a78844f5408a8f7c9851b13aa688c9af6950c51946667b20d02047876bb6ab45b1daeaa2787b7ba601b7e6c59f5e9f374fc26f56f72279a42c2b3d81d3c44da150a648f4446e59fcd68be0fd18a4ac210a491d6de281fbb962')); - dbms_lob.append(buf, HEXTORAW('e17cc9f1f8e5ea8aaad5bdfc7071f527b366c5b547a0ee83d53159e61dddbe5a51139e989e94dbb0412f502705455ec4e9b3f9d1c26fbbbf763ea62d3686d4f24b8ae418f3772dcfb4d6e10286857125af50dfda8be8aec9485481')); - dbms_lob.append(buf, HEXTORAW('dc2c1e6fe71718252ba0eac90af43c4b819e6d42619e83f440a890d028d86b6e811ef1396fc38cf113270a31fbf877ee5bd84a7d17290ef238aa6169d1c4bd810aa492790228bca2095e4ff83c764c96de5589210ddcc0dfe9f923')); - dbms_lob.append(buf, HEXTORAW('ccf76885516b426d19ca813ee5ddbbe67ffbad10cbe67cdb7f841f3bf5156c6efc00b158b6dc728e595aaec2614971cfa1b91e4e446f633fd4c02d1367eadea9e7b569a3be4b2b0458647a80918536c5bc2f6ee75bfdfba139c76d')); - dbms_lob.append(buf, HEXTORAW('481f13e5372f74acb07a3e310fc422b731c38559baac3dc8b22d33e9698f9a8f83a485858c5ff4db8693d7ac5a413172aa1f6069cf5aee69a2ee6b420add9247ae1507267af26878e5b43ee39e6079629cef1ca0d3b1a158ead8fb')); - dbms_lob.append(buf, HEXTORAW('fcb59afa4beb667d776e5c7b700f2d28c7d4be24c7890d195a7c8f24f6f8ac1e362b90f602111166205b3ccad6eddb4648aeb921a4e599e43c7e3e6e0226bfb676088b34981b070f14f5fed60eda7308685c5de9adfe1e1c90061e')); - dbms_lob.append(buf, HEXTORAW('a8c48d584226d95481ae36ddf6ec21828402f3f3c72bbc99d2729d3ae49177de244bac8782b4285d43212b4a5f24cf837b100429664c9e045314a49074ba2e06aade52c4627969d8a379f769ba34d0eb4d486b008d938478f4b4d1')); - dbms_lob.append(buf, HEXTORAW('3fbe2d07ecfa49bf0d9ee26725d92b6f9b54fc71e73c84d5733c04600be930cb90f032411e48583d9778e24cc94acb6b8d2c1e3dd0a8e29c2c35b2d0b006a5150d0d2c175052eed465e73dfdad3482a13dc67fbe0e9d8641c394db')); - dbms_lob.append(buf, HEXTORAW('60a88f4df42ce4423b20b09046131e35574c89f945bf554d5877f6af385f424fd4344193e7408a84e4c8a228eaaf33ef6f2479a22f8242a076d58ac2b340b2f9c3a0430ae668461f38c9b9fffec661f507afe811d71edcd0d8dc0a')); - dbms_lob.append(buf, HEXTORAW('f2dcc4864ba0e23de0a958765848ee5146e9b53c2c7d581bf240489e690d9a1407f7a4499ee90b8405b75e5b69115d33481f701ea0fcb0434e3a6ec2b97bc87f5738ab3233857dcf9d5c76a21e2fd0b355260b56c949db8dd3b907')); - dbms_lob.append(buf, HEXTORAW('abe85c05cb26706c93396f61e35e7ed6c2ebb5139c7ba5a25853b96adadab5ea4575c83aa9c5a238ad7150e19486489bd3163fe5b943d1e858f07d0ad2e21759527a7334b2d468f16b1120069cce3ec9657036e05fcce7f9ae9d7a')); - dbms_lob.append(buf, HEXTORAW('80d2807e1cb04401bf7ec7bffcad11d6d5fdb2c3a71d84d8e7b8c3efcabf4cfeedd250a7367efe4816ab7fe09b5a52e52df672726c9b5a9600cf0b6c0a5860d06fee76f8d883ab7a870d4fafbc4d88f7663eb73682cfab43be7ca0')); - dbms_lob.append(buf, HEXTORAW('f21e8b8df5d82a425bcc686f5f727abe73e4822eb27ddbfdbbd3cea37a097b21a43e6f05fcd09e56a556b9cd427ba8e7790539eddc908176d015d3ba1d157d5e31ad0be92cbbf71638d166f9a17cd1cc19cf08b160d6cc65df9282')); - dbms_lob.append(buf, HEXTORAW('a0fa0e181cba10f01186935c53012065b3513d0d2dd6421ef54990e4334544d317fd5d7d89f608a9c053ef8e0c34deb2ee33eee4ef7bc97e6ad1bef585c7a688c09e619b5d411edc234be185963dc93293f41f3fb29bd307bf2b5a')); - dbms_lob.append(buf, HEXTORAW('7f37e8a35b8598fbce87d316832352e4d46f753008abd15f3c54e861bc9b41b9a6ae6da5406871724fe9f2b71e78cbd9f2839c9cd0b8a802b16d12480386d236835b3a44f1b84a5957dd67d99e9ab2765ca4411653168f9e880ac1')); - dbms_lob.append(buf, HEXTORAW('353d17c5970c9ad7fe95ff13e2a3092f8dfa18e74250c1590ded0d457bfa509614ad29208b4757e2526c185b3be8024178149425d1882c13bd391adb3d534ff87b98bfebc29f08201d3073387b9ed1a14c144d2793d151538d767d')); - dbms_lob.append(buf, HEXTORAW('fd45bb953316bfe65b767b5f7668ffd52709d17e8f1d861cefe7e387d90467a9bc75b01d7ee02853db76f8b64d2d9bb91dbe83c2aeeaeaf52d562c970ae487e7a645162b0a75df0292278681568bf45d4a57a5100e296c5f027bec')); - dbms_lob.append(buf, HEXTORAW('ddbbb6f34b42b4ddb7d39051a384bd827c100c22da7d58ef50d0ec0af202751f7032b0ca40cf5a60cbe805779735f9c5a69fbf1dfbd305f3a4dcce9bf4d1c35f53c1206513a2be406f39429e33853e69cd83da1385806400e982b')); - dbms_lob.append(buf, HEXTORAW('512e024771b7b2d06545f168bd933e87cafa0ef711e15397d5a584e90691b5a743fdaef477d9e0dda61732bc8c35a91b8784e29024adfcd0a9ce3a3e8c50ce22cbcd7a417dc44d5e07759ea82ca0fff2ac4d76f7df436350b9f5f7')); - dbms_lob.append(buf, HEXTORAW('43628221c3a6d9d0a0da97f9aad40b655165638f64f5adb48ba4920154a59b2a244735dcd58cc59c5c85de52807b22858164cdde29aa3d75c22c4b4871f7bcbafe7f02fbd884816197920b4c6408be6e469b0dfe93e1e3bd6a122a')); - dbms_lob.append(buf, HEXTORAW('48936248b099367c15cfac0efd90ce7210097d12d372159da74704dc33380d7c5f8fef79fdd892f1f2aff7d7c5ddfa5be27966c53cb5c0a15e842c0701426cbb6b3255b503f0fd55fc343911edea7e8f5f0d692ead1138c6342bdd')); - dbms_lob.append(buf, HEXTORAW('60148975e740cc7c1bb301d06f93743529303a1d36685fa026b3d14922a33e9c58d0b93be48ba6668f28b71d0ea9ef48cf6b3e229c4c903c90785b6204fdab3cd35ef377b260e92a7bbb957c444ada12ff9bed02b298f76f85c240')); - dbms_lob.append(buf, HEXTORAW('855631eb085d4692d231892cac53b18aee8f135bfc0a23b5bcb08acbdd8d76815fd224d4f5fa46a78d2876d6b297d8539a524bf6f350542052894474c79f352e4bd3bbd9ce8df939dc5ede20c73cf52394b8ba6634d3c703634559')); - dbms_lob.append(buf, HEXTORAW('e0e5795cad6b3b86395a2517c8937eff16972e25fbf68cda4aa4ac57f3d424cb554e0870af06a58b0d5773148d951b4484d8b8d503cf5a729a8d71860d97917019207d105902cb530a0cb60449817ffbb6b3eaf0716cebdd0037b2')); - dbms_lob.append(buf, HEXTORAW('520425f742e4623141c15def90ab0667155e76ae989ad2a5de2de7f94d067c77b4549ce9a469a76ac421d490e5a0ee80c76aaec653b088c34cf9e97f2d215df8401ce2ab2a9027ba47719358fae4d1965e27a80bdc1ee73d97d728')); - dbms_lob.append(buf, HEXTORAW('0363cd470b2d34b24ad20977267ec5890ac023969057970a706b46b62fab18a77b33d38bf342e3a2edc714c4f928b0820970fc1f0b889dac06d1e46c4f2fb265e640805e803fa4719a75e9e569053123f4f6067047d563cab201f9')); - dbms_lob.append(buf, HEXTORAW('bb8825cca6d58dda777c2207c24f09ef1f4f5ce0df68a77cfa017ebbfb1c013d2f388df06efdfdaf3823ceb826e9267ccc35c2168c36994f9bb3eea99dd1fbb526d7fd8cc8b0a090952a8ec26e16f25b2abff7b741130e20f462ff')); - dbms_lob.append(buf, HEXTORAW('ad95e3e0a078b142eba392aa073bed2b4e402ca8ea3ca5c132717712e2626e0ce19848bf651fc1e78404345b44ede2973682253dcbe2efa357c29c45723de7978c6e312bf434e122898d28be6fb28588b02bf1a1432d5a06ea0166')); - dbms_lob.append(buf, HEXTORAW('b05b5d892a10eae7d7da982e4c934c2a2270bdfc3de571e751cc1ad7d61c7006d29128e89b211bf372284a73d3128c014d91eef3dfdec35af458438fde74befbdbcc23fa33c25bf4b6eb41fa84c49f56bb6c29dbb3d65410f55ed2')); - dbms_lob.append(buf, HEXTORAW('fe540e190030772e015432e862adc29d6fda5f022e08f79d1ad109df355c1a8fcab7a2fdeee105e1bd7aa249fae890b6ca9217663bf634d443488d87591f748f4ef3b6322c65e6be20c2d97eabb2e253916bfa9ef56fcc8bfce51c')); - dbms_lob.append(buf, HEXTORAW('f9147a670c7a5ad3620c748531673411f49266229e8b94e91fa4e25c79abe8bb3f6e7821ebe558ec184fc0a143eb6ba307dd73d4e1062d74bf72aef200d9ce5f77cfb455577d61ea87bc22e6431886c426d406e2b39a6f7cd0dfee')); - dbms_lob.append(buf, HEXTORAW('9c4832e78cdaf407746a71c70a05fd0eb7aeffabfcbf688a64ac87e32e5aa58b527e1e20c87fc2ff5f524c7b1f98bf029c013cb7136e84f017d57d19372ace89f81fe8bd19b6bd03b23f1b8107ff3909a234ed3fd93095802480a0')); - dbms_lob.append(buf, HEXTORAW('6862aef179aaf05222cba3d6d06c0363f0f44c469deb170c5b2a1798b74baacc269ef201796422ef091c0b3f55e400acf87459acbf6aacad678747a96ffa5e7e8efb9f1f47fedb672da6772c25f74c797237eb85ff14c15ca3aa68')); - dbms_lob.append(buf, HEXTORAW('b186fcd5e8058f4d685529fe13ef2342886fea5828d0fa02d4824a96d86e31f6e8286db96d748405701f2841ae18951c5af6e976b8498f3eb075d7f3e56880d67ac5df6fa7971fd45fde07966bb77d338c901f6c0d22e3ff50b79a8')); - dbms_lob.append(buf, HEXTORAW('745f6ec2fbfa883ec02107823c1af433f017bcc302df7b46f39ac5e995e8572fcba03fd622b7aec836f0b1b07c21c71ef60c8bb597498fe8d3f372ba37e9b93a7462d2d7e30296accbda83f38b3de6c4c5ce9329f385e83724ffbd')); - dbms_lob.append(buf, HEXTORAW('41d8132d440a97422358f3d36b63fbe1f7fdd8fd488736427f22410865332f8719043aed2022c47efbf5abbfc0f728677a0fb77ac5680f53ceca30ffd0bc40ede19af3846c37a3ffa43c8e8c7f2e209f14d21dcbe8537fba5abe39')); - dbms_lob.append(buf, HEXTORAW('7df2145de33eceefad62a2ad3dc803e3f2abfb6593afeda040c46c585c2ccd36560fc2f2dc9b9966eb253b588a0e1c9a0c8f24162a08c73ff7cbbb2bdd05c85ad0f9efac325617449d66c23a5639ab3d0dbea641ae3d8f05bbe2f7')); - dbms_lob.append(buf, HEXTORAW('714514d02181b002b4670e2fe88a4ffb5d3f60cdd84f55411d09ba1bfd238fdd4ed685848a7a2c8d32ac9e4b9a4649fdae9e2f6331e6403e3ef053bd82649fdffc3c7849af87b8d7a06f4b0f1f8aefb6542027af20a7e741af88d1')); - dbms_lob.append(buf, HEXTORAW('8ba5931af4e32ade4dfa9c5faa7f60e9a93b75c97cd6df72a8e3f93b465adfa15ec00bd5fcfa9728bcd1fcdd61e9a4d6f451829b7a45189db8b5ad434eef3fbba5e43f756c8b4e237a8860ba78b0504f8d467b9900eb3f536ead72')); - dbms_lob.append(buf, HEXTORAW('ccd2ade32ade4dfa96ba1d2f58706bf23bd17b8a9a832be6c0e68861b185aeede181f4828665057b818ee58584b6bce9e62ec2e24cf4d8161a1880ae39d1fdd276c5dbcbc9632005427bc990e2a0ad1cb0c543fd97e6ef7a4de36d')); - dbms_lob.append(buf, HEXTORAW('130616f5d804fdbbbb5c05744c3bdbc4797d80fffd3f9cbee8b8599f8ae0222057fc083d26ad4f089e10a770deef3ce9829ff818d68be9cf27fdee70d23be22eef21d0a78998f837e5b60c316b4b057260f1365905b9cbe859166f')); - dbms_lob.append(buf, HEXTORAW('1354bc47e2e9f1c5775e601b9a97529f7e921027de7be1a167232d579f7487d0b43ef12e8541dc1782c2e05b68f045dd8d1e07f43c5350ba504efe7eeccde79e77d93af9ef13c45ed1ad3ef8e2b82d2943f7a7c2931944d47f7172')); - dbms_lob.append(buf, HEXTORAW('5c6ed0b757bc9bf4f9e23b37b439bf504ce2a9a00762bb9abfdb6eb26bbb7820818a5cd37388b96670d99bb64485ad32996bf05821a18bbfe732fa517cf9bc85cf2d43e8494f90b46502dfca810af5f862382b64f2980209584cbf')); - dbms_lob.append(buf, HEXTORAW('f7cb05249165f528f195c0533f1b7ffcfcf1f29e8cc6aefe76dc3605109714e102373d078ba5ac71a6f8a581c02df1723c1706a60660913778e31bc07e79592a8425023b2bb0013f142b4a16851ad8932d59057911a367d983ab19')); - dbms_lob.append(buf, HEXTORAW('3b35103daea822f1f4773c6af71f4f919e65dfc543f20ec0669cd1839a7cf81e60aa89936209912221cf85425e3491a937050b356d17dd5fcc70f270a4e733eac007661d7cb010690569a3afec23e22315bc3d4cb9e35951aec5a3')); - dbms_lob.append(buf, HEXTORAW('b4f45f6cab1379473cfd8ddd934cd3e70616e317868637513c656baead776d170f44efe1138e429b02a09013dfacacb995c9969089c059dc7c0faec69bbd5b7c05f1fdd3734e58892c283d3162c2d4bb5a12fcd2c4f9d60a81fa8d')); - dbms_lob.append(buf, HEXTORAW('306079a296f91d5f1105680156437c5723148b5fb752fb53f50dbea7d698dd78d81a7f5750ee39c4fadd05ee014f3cc0936c6aa92d7dcae2b2a73d2a3e0ac4819bd002492f3e1127d8db2ddbc0b9428dc9bf527c94aecbf7648b79')); - dbms_lob.append(buf, HEXTORAW('20263dcb1e5ccdd8a9c1507cc2b6075758bced4fcc87bc31a0cdb5d70871d075c74eec8e02e1d49b14d46772bf6f42522ce499e8901729148b22e1e9d581bdc8f09cde2c503e575875eb65592542b47ba6f30f53fcaccf63c4f428')); - dbms_lob.append(buf, HEXTORAW('5fb69051305dd754a4cdad202fd2b849cfee512696e3a0a7e202cf6d8a5f31d1c3fe0adbf2da3e1e08d22f93e6b9bbf87bb28e4de849789690492c5d4fbd47d33fda2bf72deb864bea3b9342f09885ad435254214e959c5fb1fbc8')); - dbms_lob.append(buf, HEXTORAW('5227c5e1e2db23806ee2a6f9dd5f2a9fc71a8ad347c4faed748ed7d3af8309780eb1d000ad45259ee02c13a8280ab8f20ab7af9945f07eb204bfd8f80fb75ff03fe2d7325cc507b314f96ec17ca20fac65f01046127a963db8ec21')); - dbms_lob.append(buf, HEXTORAW('5e1682c94d1a8289e22963530677b857887edf0e6db8335d88c38e3ffee21e384fa6052af65bdc02d84241522cdc43d16b26965d6203e305502b0e0a8d49055238fdb653bb0f979ed28bbb757bcd4f9f2f715ee8f65882f6e0f34d')); - dbms_lob.append(buf, HEXTORAW('d06041fb24f128f95a46cc03e11e0e4649807e62390e1a5ce67cc63d4aa2f764f343585beeda3e6b2054afe1467fe09e83d08b8ee676eef68e350752929089ece832e0864617478a2ba396947ff00ba61ada6327b0691b5b14a73')); - dbms_lob.append(buf, HEXTORAW('a09bd5680e779e8475f11f1c7bc26333ca24020ff5f2a5eef79ef86680125b7b88a580c3f18630e834ac209d4baddf5d0666ebe79803877633f3bc9751fe847a2305948b6b99e74b26dec9bb9fb305fe3b32a561a07c9f6e002fdd')); - dbms_lob.append(buf, HEXTORAW('0b8d4dace4384e89b7afaa78f7c23c4e9fb5f5a7b1a0e386b3950c116043f30210f79e93513be2bf20d0cb24d2f7d7849f7478e3ffd7ea93886765b3de323f9630731b47bf720bf812404dd1ecc80b184f612242118f4899e97dc')); - dbms_lob.append(buf, HEXTORAW('2032e927db43adb97b703de5fd7784b0c46cc46e5d8be7e069975f291addf0dc42b2c41a6d8b60aeae80a7b44ad3427064574b8ba6c5b256ed298b444f88982075488a2c6eaa70e0277a8581d3d0734d7a7ff8cb5520a03872e37')); - dbms_lob.append(buf, HEXTORAW('e6f2316f81e5bc0e222055014908348146fee04ca43037ccd8c5b7224079f6b7f708b5c5e778fb2b0546b240bc942ed7af65838a48b293e6e79ea106f20a461d00f78eaf68a77e0dc830a846014bfe83731dcd9ada59cb8773f36bb')); - dbms_lob.append(buf, HEXTORAW('f2ea3a21463c7ddf19e3e70b31e0f1821b7ae3fc9a561f29d812e9eea460d20628988a50570a4261742e4b886d43eee317ed7e5fd121bf0971d90d250f3df78b1caf43db9c35e942c9dfd3de24bfc2dcc66f6ca2e7910bd902f1380')); - dbms_lob.append(buf, HEXTORAW('f19053ccaa6fbaf191ea5a2675df3e3f4d5f35e207984fa93e80b54696dcb6bfb78202a5f3f567199118f7bb133aefb00372a30636743377d16b7ceaba74ae7a19e12dbe1fcec691d3a8be219237617eddb8357d4435045b6560c54')); - dbms_lob.append(buf, HEXTORAW('794b59497dd8fd432d1f1f69a261fe08d712cbef6140f9fd5d17ec7370caf3521fefe13c919515df7f7ac700d55fc351491d93032f1ea709d38b9d05ad26d0b1ac527832f081e8df91141aa333d959c5fbeebadc6dcb5c2f0bb2776')); - dbms_lob.append(buf, HEXTORAW('96237e5aaa7ae43523b2178da13a309c5f8ee0467a687d5f38cdeddd859a127ab700e9bf4b5c2e615d3818a778df39d1acc7626fac18af728def2f836030e5b2f44af2f8e7aa4f4092146653df8c1d37f15e282c231df5c8b1d0c5a')); - dbms_lob.append(buf, HEXTORAW('2d0244a1664b759abd68f18282a937034a0fe592631e1d7c459510ff77cce383a7bd2e445bd1f1a419df49f95a1b7a75503a0cc23c11dc59a299fcea0aef9ee6fce2d17c633933ddd67f7afea13539a2ef592bde13f69f2832e905e')); - dbms_lob.append(buf, HEXTORAW('49855bc6f9f6bfb1412aa7aeb5801190aa3b4c657781f35e0e20ab2f20d3c5b77101540914b4f03361ff7111eddf2305921e1de8d879eb72f16d129e64f15d9fa9acbfefe6192fbff53ae8f92fc5db6cb311f9ebd60af1ad99eb78b')); - dbms_lob.append(buf, HEXTORAW('f7a37503e4f9c50adc14de2d20076a20c6e440e1b142420ff7990a07f77ba4905841a9c70b4aefa3ad25b7cce5fd038584b1d0922957f9baf06f7814c60a66738de79215d6c60ad1a8107338701a0fae41cfd516aa493f9fb5ab6b')); - dbms_lob.append(buf, HEXTORAW('f21b37be5cf69ccbbed3e097eee3fd96766acb8cc373a4437a5fc70f0b7174733a7aa00d60abe3156c814d4a29d4e5af9d844e4be97d81bf13c4a54e873ce999786748fea6249c0f5ca33decfcf2f6a6423d935eaede5ac76cdf22')); - dbms_lob.append(buf, HEXTORAW('8b673256f727d133e42ec0afc7f865fd17777e0876d260723c562b14f5fc96358b9a796d8f10962d3d91af69c416456d2e3834344fc76378ac90109689b650c9d20dc7d3ef94beeb817b3ea11875c280b4a8075c7b1254e95966fe')); - dbms_lob.append(buf, HEXTORAW('5ddfff9f76d9b6a40803ba42b4df6187b17bfb039ec79a7956dc1ccba26233172d3d1e6ba6b52d1e6a60a101f142f242c28dba10f7b7adc169cf21183a0d83cfe6b5838ee983fe1c331925c1e22dd133e87bb62484728d1bf43c5b')); - dbms_lob.append(buf, HEXTORAW('faab3d4b8cd3a7f18bd413215ab75690140779202d61886905223d11ef786f98e38af8f4e508e8e536c92f0ff959d6209286b878fbdab305c3c00d7a4d842813d3e7fd972cc455a45722b7830ad93e1e881bfd87250b443758ac90')); - dbms_lob.append(buf, HEXTORAW('30acfede74fa5cb0e159c7d2eea5ec2c6e1e836fdbaae3cabdf602b32c2f9da71386b03500df84cf766de9ad1bb6db1566d055c0ffbe56dddaec99fbb631108d81ad073a7990c9d6b6bc246b5b34307921a1251dd87b5e3cb7e91f')); - dbms_lob.append(buf, HEXTORAW('1ebcbc87bc1e06dfc16cb3281ea748c07792c55b7b3b28fad981f160d24b9a7cc2e88739ceb28c38bfc9ea5402fc0bd7512d215add06c8d64674d616d646a2d95b03bdf7fd7115e731c1c30964b599fc06179b13f2ebf15dbeedf3')); - dbms_lob.append(buf, HEXTORAW('8da297acff8259a389f90d26fbf0fe2b37e8d9d2dad11ee284ff922c2c315bf0ad44127b0e7393669944f1b8504018f7299c2fbec7f61c220f84776c146f7d7bdb3b7aac10a2dbf13d1677c1eeb3fa842f2a80a274c33f3168cb5b')); - dbms_lob.append(buf, HEXTORAW('4fa258fe70575881f86da1b3ae3ee0deb4542152f35bcc39cd4f948d0d94849e43dc11af9128e495d83afb2760d1d144685a746582ced00fe3a98496a73875cb16128a7bbdfb0cbeb9e5e96a45926ff24d7c5a166f93b5c31cdb96')); - dbms_lob.append(buf, HEXTORAW('3c4d7b7e49b72bdff48a69d7a0a7e983de3b6af342ffd28be9dcf3600ac42f54f4da791da2060ad10b7a50890dcb66f29bd4830ad4d524e93f9b47c9f9e51e6539a3c7e538d7a4a7e917690f15e5cfdbf2da3e8be8aa5a80bbf8bc')); - dbms_lob.append(buf, HEXTORAW('c17ab22c137b564544ddc77096bd2326eb89c7051ddeb10acf15f57e7efac1ff1a784efffe8ae71014813e9c9e200e8cb21d56af3d8e306b048eff512ebee9605801ff7b4fb8f0825f8ff1dbe53491bec3ecf889c98bdec5157fdc')); - dbms_lob.append(buf, HEXTORAW('11afca82b285063c6671c506ba69d1f56c5e41a9b4d80ed8a46fb75df7a92096e6db9eb64c3b21440c3e83d966a621656b876cdb963c8c3e4fd74d56b0b98915d3090c41d007bd7e5e3f9297409a2f656561f13cbe2051d26deb8f')); - dbms_lob.append(buf, HEXTORAW('a3380f246cb60fe797cb41805fa33db43c153143d5ea5126996f2ca1b200bfd6746e4e1ff492ecc1e59df85f12c212b3bd68e0c76ad9101e3be33ae1c014b68a595bc884151226e85885a363bb84ba5d3be016a93486a64ed7854f')); - dbms_lob.append(buf, HEXTORAW('b0a1f45e40d8be3d85e5a9071409ad89b80cfec12e87efc61a075b17b7f5860d4b608186032ebd61917bf602af307b2eac9eb3841ae65ad6cc825b4e6ce140224a0923cc320ca62dbbc04d791501790d839ed90e82d19fccb6e4b1')); - dbms_lob.append(buf, HEXTORAW('574c1bf4032118cfe4d70b564ce71af42c15d3090cc172e08a5e85d06748a691e2a050d5cd26d40587124a0fe43d78205c514536915fdede241711835f8bfc26283f30e9894df328adfdd75c8f72bb5cdb672b13da4a2412fd816b7')); - dbms_lob.append(buf, HEXTORAW('2c287b2421f36303d9bcb99bc90d005ce2d26435052af4bdb31234388a37ae6ffb92fb671d78ae358c0330161d3eaad1a6837525220150ce2f73f8c271206c422ba5e03920a73f8f9b7add8ffeff2df4353960dd941042d509b027')); - dbms_lob.append(buf, HEXTORAW('0931494da423bb64a6fbe66669383bf78a76e5a2358affbc04f389ecf80651bdb4287cb6b79423eada138d0679b516e6cc5b4675b1b48bab6a1432606fda46b91d77ad7fb7b6039439defd26090a552a8ea2606e31488785e4cf67')); - dbms_lob.append(buf, HEXTORAW('fd7f4b807b599fc7ac93ca864060cef3fbb47e919f4994769edbf66eec1e50ddac2e9e9cdbab68f07a24258c1c530d352a0dd4bf9c0d96897532f629207825874924577746cf76107655d7081101dffbe53e7b66dd52704368fc3f')); - dbms_lob.append(buf, HEXTORAW('eaebaa2f64605b52281cdeb44d0062ef0dffbda485801adf890beec2b9094c753d7fa0aa4c3fd3bfde94eff00a172f1564affe4ed99c022e7169dc23736db2e5921214da052856c424b582fef3e5a03b1868ca278cc80015f8158b')); - dbms_lob.append(buf, HEXTORAW('82d04a3cb504dfa939379668943880185cdd706ac21183e719af4ad15ef9007c775a6fb85827be51c7af8ae38ab9bc64b2205b2c794fd3a75fa428ea10f4207ec382e48cfea416d24bf493d289bfcdafacfee51961bf439bf36cf3')); - dbms_lob.append(buf, HEXTORAW('ad91e5cda10f8ef590351b94bb6c5256aa0a17ab3bda6356f304bc1f024122c62366bb1953a36a543daec2e63853876af734f2b54c10aad38d2b02d5fea01e6ef7c9b6bbec74f4071b8e2f779b9806105f44141526e46f4bab7d5e')); - dbms_lob.append(buf, HEXTORAW('9fe00bfde79e2e8a3134c1cc916592d9b5a5a074a320b976fbe19b618145b7a2b45a4f1c6f19dcbf85696a6cbf6760bc4c293acedf1104cbe99c5d6ec8a69aeb0051b5fd6104cd3e9a4d6f45ad65fbdcf3ff9a2331f9672d323b44')); - dbms_lob.append(buf, HEXTORAW('18f17185cbe61e6b4748ef3d73e8ebdef9c23fe7970947e91734c7c7b04264ec3b0b4f21b0c1945e2bf7b63f70cb3f65f528fd2c2afcdb34ee651825fe97ffc776c65e2dd2d7a4721af4c1ecb2a88e94cf4b0ae4c0e1b38cede8e')); - dbms_lob.append(buf, HEXTORAW('ab10557fb79d113d5c552a4baa668568cfc0da48763c2e5008d6e9cb9dc5e07b8438e1a00b773c1ddbb7b73819f0604054d2ea5d4829c445a12d0c140747e1d2d2885e6cef96b8cdb6d94567d993a7419e07f80d2d938ae3ddfbf')); - dbms_lob.append(buf, HEXTORAW('af5bf588856b9e9a73cf08c4854d14bfd659c711fa8e81d8afafd7c76c6fd4876a6bd3ecb5bf75786f13e8f9d40e9e9c56b920385931c3cea6d4e0b052e6f847819fc848defa509295f2bb8c467f1f38ae9226b653ed157f42e85')); - dbms_lob.append(buf, HEXTORAW('3cdb2aa67bea1d194cfac18a7793be67a9c84e5ef19e983e3bebbee3f53b7e70e435429c7ffd9dad1f1821c4d9ab8b6eb9f45121fe9c5efcd5e819425cf8e2bd839fec2044db833b9d3a647682f618da7485b7955fcf6c0fcd6fc')); - dbms_lob.append(buf, HEXTORAW('cb04c5c419e6c070cd67f62b296df9e06fdd8f8189b905f9b7c8c35e7c9d859ee6cfe7ac74355cdb6bc52b60e591efb8fdfcb66bfa5b9ddcf962eac13728ecd2c88d650288f24476c88c230f074f10b7045ab549ff0abf032e039')); - dbms_lob.append(buf, HEXTORAW('f821ac70799f898f067ea6889ee2e15c2556e1ef61d051efadc47bc3f2cd8a8ec233804744beff5dedfb76e9d6e74a213ae7ee5a5f394988851f7dbe68d10cf58a86110ad2aeb41edeadcf032907a423631f071e018ee771d8e6b6')); - dbms_lob.append(buf, HEXTORAW('bbf07e0795c2b4581e2a54d04f1638bfef98ab0f962dd7f6b78ec7bc395dfe385a8c4af763da6384f2cb72d05ea3142e9522b5e7e2283e1a7bf5e4002f134abdf652fd4167d3cbbbd4dbc33803ba549f5c3e0acf293c47e192bec')); - dbms_lob.append(buf, HEXTORAW('2d31d17f8283cb7187801de1fc5ab0fdd307ac50a213efef8d59ff1d9faa8e2da5a138f6e06e9e37d156c64e7a0f857f7f483a674ea24db65c74eb346668ba0bc66002fc3f7f712fb01ef85efcd029f6183ef0cf05d06bc12f488f')); - dbms_lob.append(buf, HEXTORAW('e2425cf12df318a4fd5f2aae88d52b8ec0793fe18d0cb51f4a55fb418f76502a7e7e800d47483df9c00bff0cbf57822fa99c077c4771ae32bf5bdd4b6edf712a275a4ddcabd4e95704d7af77dae95b256975ad9b95f13ed3117e33')); - dbms_lob.append(buf, HEXTORAW('5037c4614bdc0f81d13e0b757427e2b402f205f49e6034bffc9bf621e73480ecf30f8b5cd37acff02f3e228d02bd6e36314be338aaf98b770e70f3e1062c1ac590f2c562d163b829bc97775b582fae454da5d3c817c1b5784ffb03')); - dbms_lob.append(buf, HEXTORAW('d3c90a1d87a90a5d906b22b82a10dee1a96e3b9309e4b1cda2057317022a1356b83870ccc90045cccdd4ee879cac5efca7efce4eca3fb623b6b7e1e8276d1fb2ba8b7af2605cbd748a8d23b0218165be772f13e87bd3fcfe4cf57fc')); - dbms_lob.append(buf, HEXTORAW('5ddbef3dc6df9b28fdb58e6fded53bda5e22e53d114cff8c850c9565172cf4324353d93c446973e193ac6d45588832991c3c4f6b0a5be6f2b2843a562cd9f6dc96906c732ba603a18c9eec402916e24a5a316d5bbc4d16e22a67f42')); - dbms_lob.append(buf, HEXTORAW('c8bd9942ce0250b716d6c7b3437e4d75c7e75882b69ba6ef3f82ddaec1025e79f3c26d7e097876ab7cbb53d16d1c77b9fd5bd99a083b9c0bb1b5d48e8e23e72595ddca7f06c1d7337cee26e6e0c9ec71c433d53f6e9226de78ce3bb')); - dbms_lob.append(buf, HEXTORAW('0d3af21ef5695a81603150676ddd68427da00ecbca7278e8886082b459f5edcd83d60247dca60b24c963947c0e5a3cf2067fbbee218b2ffbfc057f73c4494edfa3de12cd99e89ad79e939b793265b2b5ad5c8db3b52dbe28acf0c6b')); - dbms_lob.append(buf, HEXTORAW('f37b6a4f35e6cd7a60c49ab3c85d9227fa0308d2dae0acbe2ad6e4fd09bcb0e94d28bb901c3caa4dfdcb468c29b5b31cde421704055330d8ba4ed212c868b7db1b9697e2301c5b479fc52d2446ceda579fc0a937ee0802a7b01289')); - dbms_lob.append(buf, HEXTORAW('eff2fd98db7f1096f8775eb445c077b346144f1e0a2289b5002f504cc73b0580a34619162b26655d82c66b61856fdcafa57e7ba427cfaeb1b67bf70b6fa369dc74ef03d40f240a85e843c0fc2c903f81a907b0604052e97dd9704e')); - dbms_lob.append(buf, HEXTORAW('a1055317b1f16f77581a4541c7f1e72c327fb4d1162cfa507b67cdf5fd4ac087903fd4a61bd379965719c5b5e490abde20a09c3f8a6c472d05c4545167e845978ccd3ad3fa2eeb9eadec2bc2249f0262e0fc71a5b2d455abc1daa0')); - dbms_lob.append(buf, HEXTORAW('bffc2e0c79828ac3b28d82abc7b363dd107dbd3b2381eb46c153ddb1e5ce58c5e7031dbc57711ae9edff40a72b33d62f2602896048bcd090dbf00bf76c5caf92d4fc82fefbf60ba6ef3f8b5f45fb33dca27bd89629b5f5b6b0d8426')); - dbms_lob.append(buf, HEXTORAW('b04a05e3d7407a3dd9efe5e356c8bf8543571d70801fc3c4aa8583804d1831c0a93ac61d8dc43b154e4914cf54e548f2398557a23c29ac7087ca95328147800fc28e5548e795cfed07fa613c67c64623c0f3c0970bbe4a15bee0a1')); - dbms_lob.append(buf, HEXTORAW('4fa68d8b08f1e5fac805f3a020eadf04a4d8e277807f56509f6088a9454f31f466ca72c2d6283a7b8b26fcef01b13641ed9b4c8184ce33e984ba034a7a47be70daee6d4f12e2a4ab463e71d96142a44fecf0b709fe1ac7c14e64a7')); - dbms_lob.append(buf, HEXTORAW('79d176516fcb75c64569cc546b0cb27d5db4534114afd46b10515cf6978baf527804789e8ebd2316ec8c05aefab954cb41947bd98b613ce7e0be30ee73709fc2a7ead873897a3f62fa313988e26b3bfd7cdcbc2384f86cda9b8f7d')); - dbms_lob.append(buf, HEXTORAW('dc463158f7a882b5470222565cfb06fe8e359006f49fb748e82bebf4031f89ae81d477ba076b20fcfb33812bf9cb51f2a7e5ab92be57f99b0ee199c023c01dd6be33f59a613edaa94979d5f4757bc2bfd5edc9fb4fdb2b6183df3c')); - dbms_lob.append(buf, HEXTORAW('46af8202ad8cdf4a920f3d4e0b412d8cbbb3d03a267d27497b503b64425e74fb307948d61ec46fa5a4a0e8d1bce25af87512f2cbfbaf02f4c2a057c9f905ee30fa167e05f1e7825e29a35fa2e8adb8675155740d64d2ac8fb6dd')); - dbms_lob.append(buf, HEXTORAW('1ac8d6522098d8e237d98bbe4e4e643d5fea3b39574e9c2977a6dc72b8bf9d334d2861085c05f06c35409c990e2d299b1d90870e70f15ca9a06955e111e079c0b1062256811b5a2c2c8580d3a27b09f03ce0b10110c5d79df8eb1')); - dbms_lob.append(buf, HEXTORAW('59f7d26c4b41e13264ff2f320de12f7345cabde5c3b5dc1fa6b00bf55d0efa0837f1b58d1b1a310bb2ceade316589103fcc5ef8514d0d38a6897e0af08780d3444f0aa01438790ca4602a4c5cc3bf03fea4a01f52ebfcf42ebfa55')); - dbms_lob.append(buf, HEXTORAW('d20c4397f2a3ef01cc9ef6e55fb3e3579a5fcdbcba97d4ff987bce91c71458bbfc60df0d862a65aacccc7845c02c59ca7db4f097405c363eda9ee77f17c312916a8cdc040b44ca495f85a3db08167a39f676a3988e0bfc46714fff')); - dbms_lob.append(buf, HEXTORAW('5c455b77fb583105f8c2f5ff3d93fd49db5e8afbaab814361d420345987ddb31a707e858ea24b8a59b30ffa47a7355281ccefe88cf44bb91cf6fd3401e4e27b573b33d577e9ef75f1bd99e0bb047c67826f931eb56f362912935ed')); - dbms_lob.append(buf, HEXTORAW('c045890903e53a8b23d39fd4ae061f05f9190bec3e897307e31e169032fa6a8ccfe2b019ed7ccf6d0133d53845c1e92b5472c29210b6f013dc8fdc6f30bfa307cb46205fd08a36fe7b702fc0287e2d2e383d1cf54f47e882cdc3f')); - dbms_lob.append(buf, HEXTORAW('aa40e67e3af18faf403021ea45594c807e0867df1ffa9cd2e329f9ea7d53db0e9013999e504a9927518a0ec947d64aa5d960b109857548a5c5b219048fc645964e31d3e415014b44e198f81a3eab7f66cd0b424c3ff95f9fdcbaaf')); - dbms_lob.append(buf, HEXTORAW('101b0a7ecb589fa9beab1e618c3a84b2ea4881c88e69f9489b6ffc0967c053856f4fbc5188aea17de6de9c26c4411dfb2fec7982103d4ee9dd77c3ab422c3ce0f31b964a8bb7eed39a17424fc4dacbbf52f604de9de15024baee64')); - dbms_lob.append(buf, HEXTORAW('490c4ffd6b8b23529f136258f1b517f4f95a7a1abd073f7589e4ffc05bf2863f34d73f052eedecb37c3ed39c15ed4f89b64b816a778b27912ba23965daf2cd648adab10ab883fb145e499e04fa23a6384af01c5ad53291ba946dc')); - dbms_lob.append(buf, HEXTORAW('7147f29b27df2b545aede93670ec4e5950b2eae9053e4bccf663c3c1f1e07f5572d2910f2440e347fd7d975e441ee216787d107a5777e497a6ead3b7d3c72a4889727d56e427bd0ea7b33f44451827623b98f44d14aed4147c0b7c')); - dbms_lob.append(buf, HEXTORAW('2631e4821be7f1cbe57194236455dcae897980a35c06f6c622b01ff9906bf79568fdfe4b752e305c0897ea6413f93d14fd61ea4b8207f09e43673a3daa342d3e386cac6f25b62d00b7a50aed11e8e95dfcc787eb5e27341cfe251ae')); - dbms_lob.append(buf, HEXTORAW('7865d15dbe02f9f6c64fbfdc760a24d572e356bc6aa755fffddb3f0bd162c7562be37ff7105384580b6f2835b8171d289e70f0772fda615e9ec245ae4713be8a090a86e7295c60f15c52a5fc6b81f7e51a389d1406e527bb279a29')); - dbms_lob.append(buf, HEXTORAW('3f7b69c583e33f1162f5c0a5ed7e3b053c66016262a7a36e756260b110832b2ffde06f525186faa4387d7c8fa34244fd8ed09e29b7f80cb59bda39922fff71d6f9452f2e6b2f3b2fad7ecd47e7caceed5abb6ab69c98aafeb5e18c')); - dbms_lob.append(buf, HEXTORAW('6fe64bda4b1a4eae7ad727ea7cdff896042f88a57ec7a79cd9e2cbd633846895d2e6c17d0e90fae0a116bbf798247fdf3ded8ade55f23d53433bf4f0155cd851f6f60962a03fe57858dc73cae94b1d8aa9266ecf32d51f5e2f6f14d')); - dbms_lob.append(buf, HEXTORAW('acd453ba9e9b40803b258b5a4a73d00e0346121e6ec50619deb94e339d5af61e0aeeee772c66739e353e143892ffd1dc5ea6e2d07517cd590657badf04bae1e93ffbf0bfd76392079162e703a03fe13615e11c05c5f8978ca4fb9c')); - dbms_lob.append(buf, HEXTORAW('fbb25f66b549ea254e4305738d6689c71e057cb25e4ba58f11727e70aa7f6cdc5f3114d4f18df4fed51eed0da05b5a7490f752a7457805f4eafc2c403fc127d97f14b6301df238a40af18f404eb3f6a8f5cc66fa03dcc792081dc6')); - dbms_lob.append(buf, HEXTORAW('e647b00af30ff1ee097e8b949f80db3792af9bcd524bf02f22cf1c4f489df89dba390705b792071b1fc5d2ed8f352ffdf6d77e95c71913f95c72c9e523c0edc1a328944a13d26a8f03ce6499026cf77a28122672ad64292844c7e7')); - dbms_lob.append(buf, HEXTORAW('df7c7a73e94137064d65357bef28a62b01e057fb51d15a41879ed55313cf7b6337bee2fdfb4d3d2ac95637e94f416398f473d31b2204bcc509cf38833a3bd7c3e7476ca91d9274a45b0a4e55561c941ebf5e9f70c1922e19eed27f')); - dbms_lob.append(buf, HEXTORAW('99b15b679b7dd9567cafb5aa7b7ffe02ce9f1b4fe579b7f9d2127c0d4c6160f1c3b5c3e7f7aca80033b487a5f398bba74897edf587c5f217ac1c5f715e2fd61b49fe939104eae7d01428a654d87f8b4255669099938da9388eedd2')); - dbms_lob.append(buf, HEXTORAW('365a22dde17c6fb95f4649a9e83954f41b8b6f00b0dbe9805fafee1cf1efb9454e86bd6af7e6feda1e837788e7aede311056bb06b56dd3205297b8b3c11bf42216bc881ed3a7f293d909a8e472a0f24b036e002577b15e5a8ef6d')); - dbms_lob.append(buf, HEXTORAW('ae076db53c4b21bff9e897580846b5970ec1f0b5bd4008c6e457b72ff3a06cfc06d6326c2118e641c5220a8e41df491a51803c680f44d12b65f49bdb1ee411f39027e7b7c2baf6c2db43d1b3785071f356b3f88df3d84bc07f5e22')); - dbms_lob.append(buf, HEXTORAW('7e7f58b06848d403f9eed367ffe3ea40b42527a7b20f1e78ee81cade92c98b1a2e5fe81f2c434741f6d495a10a1fe8758d3e333250d9a94ab3f22d95c954e1cecfe2a60387eeb69cc5ed253e8bbbf2d239e203ec1e4a0ddb8833d2')); - dbms_lob.append(buf, HEXTORAW('1b309134ec8bdfbf92f3c3f893bbec7b9d9c585e3ab0c758ff88db2fbd0bfdba095e912bf9322be0fba0f29e57d2db2b8733e2f98c3be33d17f4a892351b7fa7f6cb36db13672bb3b3a1637ca25296ce92d7edabb34050290b9b93')); - dbms_lob.append(buf, HEXTORAW('2a673d9da5427c16197c0ec711af492a86359f439354bc0f44ff4ee67c2abc2ab476dc1239757fffe3d7b7fe8423a51a719a3459f3d8a54d3492cdf70c203c138f56e38c424f6f77bcc794a79ec0e90cf2817a13cf6655203751e1')); - dbms_lob.append(buf, HEXTORAW('ed815ed315d3aeb562daa43f3640dfb2434380df9189f8f558e5bf673f233c71457673e561632bc8f32ded413b2024ab20f72cedd133d01e43f15c86c97f604705ceafd11ebaff680f35be6303e7f76641e5c9dbf0daca1e08d9602')); - dbms_lob.append(buf, HEXTORAW('1dabae34f7270ded4509b22e13e27f72eecf6a1fcdb8fa9837b5f29fccad982e83dc54e148a7f8a0ba37095ae1ca7ca4e552d9121a87254e13982b2b6e6aafb6091e2140b0ac188bdc411784ee0b9cc785e79c57bcd37ebbf59f89d')); - dbms_lob.append(buf, HEXTORAW('5424f3befa753ead6d7ca9602d2cd4fac142ec11ea35a59d9c120f7becc45f1f978a24f459e8881d2e13c10ad45845ee06bc4fe17d54e5bd3345bf3a33099f39f17ccafb72709fc2ef465e382a95e32a93d3f13b55e62a3cc6673a')); - dbms_lob.append(buf, HEXTORAW('e35355ca8e4799232abfb5bf8837c6f19993904fc2c7003f5074c073613ca72c39375041adf0d1492adeff09be5721e9220cbe4a15befcba6febdf9828c4ece5ef957d75bfe2a516753bb4585e8bcaf31aac79d41cab60dd170a36')); - dbms_lob.append(buf, HEXTORAW('74c6378ed6df2eb2661f98d7e945e981ccebf8eaa874115be328831c0f42bffd13df5fac2dfda62b90b9a5cf2bc8ff097c2ea3576aa9201f64a9c8d6fc6afa838027ab984e6f92dfa9849b15d3baff908517b76341f32ac87985f7')); - dbms_lob.append(buf, HEXTORAW('665690cb7e1a0b3c2721fd58c57be2f688f19b6ed0cbb1d0b3f36bce07d47f15a09741e32c31bf2b672dba3eea814cfbec95641e48d56b0a363c06f87b5b440fd429c0e9d27510d2f3d9e3ed035aa7be2f44cbc5adbbff692711cc')); - dbms_lob.append(buf, HEXTORAW('0629c59444698a3cc445e9bf3aed4de17169a04a40622118ea10c55d8e0e7544149389171bd3fb75ccdbed2d217ec95ef1d8c77708b1f6b39feefa0d1349dd3e42b45f95d1d5df96fad813fef2d66d2b84481bd36270d613069f3c')); - dbms_lob.append(buf, HEXTORAW('64e02a3e3011c4421c6a5ad2218924d966b16c1285f345ed4148bb8d40b16e6c9a2de793f89aaa27e864a102b8f2ccb5a750046d499163cd0aca049f25782e137c2a9c87cc4a11220a2344c4425c9f5ff476b749d2535cf6c482c7')); - dbms_lob.append(buf, HEXTORAW('7ff841fd81b2af74e88a14c859c0b1cb320dc0c67f29a8f7f3952dd3ede6ec99edee12a2dd1e9d0ffdfbc922b8784bf254aadb75a6c91f5b5ccdb32edee6b1ef2f003e135f1906fda8bcc5a5eb2a7ab6e403c6afa45709dca4b7b1')); - dbms_lob.append(buf, HEXTORAW('fc9201a443386c3cd8b3ee4cfa7cb19916edad212ed06f667b68c5c7435c443f9875d534bf791b1b924bc26f01e805e60393dfe58bbefdeadd638458f8f9171f5562a6ac4356282581105ebdb3820d6f01feee14485801ad402a00')); - dbms_lob.append(buf, HEXTORAW('2b01df11e2a7ef97edbde25669c1753ca824da22e7893fb5e9156d10377a139d3d3155ea784533338a2749b3b5d601500cba97eee07cd06972a24b7935e59bd62708b1fb7dfb5dd44f7a22dd9edaf74f6de590dd6bcca1693dae1')); - dbms_lob.append(buf, HEXTORAW('562ffbfe4b62a9478cb35ad77df7fb89d4f6bb6190db05ca530e574908ff76781cf30be2f8bf19915dfda4eb06e057b046d629a2de773aa4e53dc0fef0fa37d2b4c3e2d69955ca1e604d2ad238ccf089ea3892d62f019cba25178')); - dbms_lob.append(buf, HEXTORAW('3e14e654f24415fdba236b7aac5e2dc40be7dc7be413d270f17ef56eaf437d07d5799002a9c1e697b5f38123cd9a62c58dbb8323173053fed6507fbb9f7db7dbf2ec97aff06dca2c35c429c9404a53259e214b14dfc9fa3fd34c7')); - dbms_lob.append(buf, HEXTORAW('f4dbab657862c2ced295aeb5f14fd4a4bfbf2fa873cbd984efc6736c56f5c9658627e0ba0e86213a0a217933393be3d3d9ce8170057f4820650e6c6b4475c9618975b17ed53b091ed5100fe938d83e6f14b6bb781f9c0a4bfe0da')); - dbms_lob.append(buf, HEXTORAW('99f3a65e2ec4d286f9e52b919e54cbb20cc910aa56db98c6d640909efefb5320d4642e704c797e3a6af51deb3ef7ffbdf7f8c3e775f33751bb2ab5dda17ec8270c4f424f046a00264bb30d4c287c51ac0013dd384cd08360b9694')); - dbms_lob.append(buf, HEXTORAW('dce3a9ce7bf0f0c7dd5e238e991fcd0fe929e1749d8b7e3b707a609913a33756c863f84c9420f2cb6f1c2246dd917824fc2d57d194a6126b0f00a0cfae1c0c054f793a7528cb45b72bd791aa85600cc62aab428d46cb8de3375e')); - dbms_lob.append(buf, HEXTORAW('f96e0b94cf05982f6cc447b96804e26f82c019f0a8f6db2478575ea3dda1223cb0b78d0b233f99c4aa13933bd7445d577f3df909ec55713df39f1f34e8a73aaf3a00156f30d202990f1c05127528f901729104ae3f525e4b76f5')); - dbms_lob.append(buf, HEXTORAW('74ff57baee74b474d1979bbfced5ab14bab9ed1f62835f82b259ccba9ceae528aa61272a0e5ded24f836893cfa63de88d586cfe7ff2be034e8a62f9bf672f9025a380ca9d020f0e13064cf86ecf848ae23360fee9617a2afa147')); - dbms_lob.append(buf, HEXTORAW('366c02c6605b31ea2a21c2604c4802c0a2819942808778020395fbe9b7fcff6b76a776a76d8232afefb7d1e65efcdd4f4f47477e52a1c50011254d0beca49b2ae0a7d125404ef9918bfcf3ddc67ccce433f27117ebdfe0dbe60f')); - dbms_lob.append(buf, HEXTORAW('765cf7c308325d7ad12125ff5e7230ffd0c8c9fc69bb1cdf908fa7eb94c5873c5f83de39ddef8bbc73e3d5433e6f3963fb601ebbcbc25a09044d888fe9681248110646f44d922f287dd4540d058f200e1905e596e29d8666d326')); - dbms_lob.append(buf, HEXTORAW('7ad3b5c1fc80736f8e6aaabe2287016473e93ee3de18112a832c9433f870f428adc2537d448b41fa43291feef32e29d38f26c31cea481435244463f9775a36661e7f838521a678e679c7ed5066da47cf469fe32f17c332e25248')); - dbms_lob.append(buf, HEXTORAW('7208e890f408cb3bb6f434680c7f49373baa6df9539bb7e98a75c739f509df954040104354bc4a9b884798c52e3c6e7bffa8626186b162c7b6e3d050e529c07241092344a8fc7efa4d26a6d6005d2f53301810a8b332de895965')); - dbms_lob.append(buf, HEXTORAW('5d079e3156e40696b6b73e326f1848e37fc5d98475a8761338fc954b13e158ce9e7132324f0258d9816eb404a904ca899e3eee1c15fe8c59f34e2bd95c9fa54797f45f196a3f461f65dc9bf574dd487d8f95b2f58a219c9ada91')); - dbms_lob.append(buf, HEXTORAW('b9fff4d4b7c459b373dbd48cf6fe5191543369cabe77a6de58325aeae3ed77ac5fd8ea14ea189355c47e92a75a575b54a24a1da78cf1edb331f715e6211dc4784c9c67d3db6673ee2bcc4bcf882c69b13c0586648fcdb96287f9')); - dbms_lob.append(buf, HEXTORAW('830e4990fd3f51a5e5834abe41ef3a07214ee6249041917988020d0b90281d0aca26d8591dacadb0a447fb711103c8854587c6481907060a1fefb9211b316afb959a97ffdfbb8369df546b7daa62c38f0611517482874c6d5559')); - dbms_lob.append(buf, HEXTORAW('9f007659b87b131c402d848975f88fb6cf4cd824966832095c900783f7487e4e0e71472cd7d01075f06a78e209b407fbc5f0fbc9f775c4c0004472a5571745005ab0a3230ce3ce0317dc93111a1ca86dbed14b8ddfa360c1f5056')); - dbms_lob.append(buf, HEXTORAW('75c669e5e33b74e5f9a571e68871e6c48f3390a092cd0c81849b4e5fb376c6e74a7d73ebbb978c4092ca72a8a658f280c44184830849590b4018d92b8719c804041b8cddd3dd00d91b4f7ca3db3efab7f7ac051919caaf82f1dbf')); - dbms_lob.append(buf, HEXTORAW('4e43a357d3ee8f940c930d789ef84d43cac8ab5b62d41c7addf5c8cdaf6e0cb912a988088691530de1fd538373ea9f8aacda316ea03695561c1bd63aa94faeec2813d5e68a0d4cf277e3e65a8dec9bf2c1933e26b3dcfb33efbe1')); - dbms_lob.append(buf, HEXTORAW('b988be73ce27e3d7fcfcb35273c74d786ea296e0667d3076dd58bd4266fefa7dff516eca99bc6f2bbf98a9ffde64c2eccf349e0697343b75c3adfae8da2f2d9a4d2aed98f470e30bf478d65b75a3d9af99a14c12416e13c1e1ef24')); - dbms_lob.append(buf, HEXTORAW('f75726e623bc5df3919324c096e62ba39ab697dc6d4b50554d2aa7b881c8911b06bf936fdc8d54b949f41f5bc714208bf5cf2a2c100eb2853001a1144b11c00215d076b304e233a60f042c04a4941c9a13699ed2face559394aab5')); - dbms_lob.append(buf, HEXTORAW('a25e2337ae411f58a43289e0eabce8bffe140fd17e9c686bfad238988f0dbc1a1bce463c08734e92334b628320954936ab76c039f838051a578e679c5244ee24527bf042dfee9c46e8b32aab07ee8be0fd7230ce88679cc93826da')); - dbms_lob.append(buf, HEXTORAW('304d49e514a03a1be84b71910bfc369e67fae09c351e43c883547c52a511e49f4f8176530c219f78c0f0975ed51b65f9bb0b1f5b897a2de5a49a2255158ce52597a04fc64682cb0dac34456b5595e0ccb0ac5548efa3b6bd8ffb2c')); - dbms_lob.append(buf, HEXTORAW('53cf586845ea9693ae8c9b570b57d33d03b76dd3ab6e04b95ecdb9d17e57c697eb998f64127450c47b8ed99d3e094a8cb7f2c18ac65bbed4f3fbc0c289c3ce576af49fefd57be90ea5a65c3bf28dafbf56eaf7b9d3facc9aa5e7f6')); - dbms_lob.append(buf, HEXTORAW('e32d955b47623e4917ffade893c457e6edb30a66812bb994bee81e7c0b9f9cd677eeb14afdfa4ee4b9eff5f798bbfea7559fd557aade7e8d26ba755eeaae6aa85a3dec563c4c39a55e370fa396703ee2be5318f33316f313c6fc8c')); - dbms_lob.append(buf, HEXTORAW('adce7cb06a96e7910995b99ff6af94fc839c5b32d8092113fd30eecbc4f8a3fd4d87aeebffeb16a5a6bdfccdd21f0e8acd57fc7c32240282f5ceaa2b8a6f5a64a08f8004b6dd4d40c20670c5bd5c401bbf9ba956217d1414fc3e73')); - dbms_lob.append(buf, HEXTORAW('e4b2f17a237e78dcdc937bb81e5ba19f5bb81bbcbb9114f4673264278737a459e8037d3a63d3cf50b4114c9f921ddb6634fa5f8fb1d5e715954c65d21d2a890170336e2a24079fee5970224c007c1c79d8e0a9a6734090f712a5f6')); - dbms_lob.append(buf, HEXTORAW('608e97cf3be01792838d71048d930209d724519d091b848fa0c624895cdc9738a9257362c992e211e137f3b765fefab4394d951afed880eb3ea9672e6095153616491cc489b10da4b981ecf688acca958d0de48d6546eeb1e91dd8')); - dbms_lob.append(buf, HEXTORAW('aac3b7558b95aaf951edf2fffbbfb8f1865925553d9b1ecf2347b217e23ad3275b495756c59a7e500eae205d7b4040a9ee1798be175fd5db15076d3e52a965dffc36fcf3e95ab298f0ee9103b464372ffcd393335fd273397eeb77')); - dbms_lob.append(buf, HEXTORAW('45501e9623a92879b9b16a909c1630dfecac405e6f046581af050212613951ff7f4ee9545772fc7dfcf4450b75ffd737c6fedfb097b5a4f2bf669b975fa7094a9786d35bb9b9f73e4e5d52bfbef2d93294cce955fd9c6489e73747')); - dbms_lob.append(buf, HEXTORAW('18dd837270f99d26bcf8fd4e0863813f1c8fef8fe7e7bffdad5edff3664fec3717de55c40095d27c8371622fc3d70cac80a4c25e58309ec7e77adb76dbdd040403600984fa03012959e05840dd6f7c7dcbf4dff402a91b6a78d665')); - dbms_lob.append(buf, HEXTORAW('5f4739ca4894d0c4447d7377a1d8a031ddfe403ccbf4c998c939b070e0efacca6424249a6c1cd06b701006700a499304766523a699a5ea1bed22629ca6df1d0b6f249c0562a2b10dfcb9789e8d71e6e279369e978b7152dfa8009b')); - dbms_lob.append(buf, HEXTORAW('b2e440787a88fb7a609c36c69998a0f68117117b272551f1c5c69981e7e5457fa7fe0fce6dce051ad4f938eb39bdae572d5ff2d15a24916495155454c481913b23111096401099ce223e558a8c0016284f7373926de8f867c51a3d')); - dbms_lob.append(buf, HEXTORAW('d3ad061dbef4262df158f7584535baa81867db9d9d43e83d0d21118c449c243910d7997e80adc46f746709c4cc73908a33c89d54d8b4365eb9a6f5142d6b7ffdef37cf78aa963ea88ef8e98e5ff4015d3ebae4fb121006962828ab')); - dbms_lob.append(buf, HEXTORAW('b17087269d3b3b2790ca10991b28f29fbde128a383cc5146df074e106404a6cc10e557e843f0d9cacfdcbfffbe7cfa9085bf2b353bedc71786eb757140a3f6dfb939e46a3fbf4fd6a13747e73dc3cd6abdd339c9644609697497e7')); - dbms_lob.append(buf, HEXTORAW('8cdcbf7e9ba1c147b69798d13dc3831fe39df4c257a3df5fa6d7fbe38591b553314ff41d48454b8419fba0e45ecc1b083d491eaca2a53437052a49db5391e814d90b33334572bb91db6ea3486e37abed84a3f2374efd4abfec1d25')); - dbms_lob.append(buf, HEXTORAW('1d877ee389e49491ad3272d61b994cf5422872f61a53f17b97d5e26e6922da93d6e2ae66c4bb1e574bdcd7d433ee6435918322f37b7104bae127fa8b08f7ea47bc9b3e229fe3e6b7bb1867f7f871aa21de1af71401cfe3c4fb6aac')); - dbms_lob.append(buf, HEXTORAW('8923e91d8e78cff6cc4b40c4fbaa37969e30e609a5664d19f79f455035957d602067d9ad0f78adb75f3ec30b2b071b58b5c140e74640c70bb9145013a5d63db77c909bf2a4626ee9800fdac67f7facd3e7f07ddbfb22c8134720d3')); - dbms_lob.append(buf, HEXTORAW('3cdee4c8086c83ef1ae0eb9db8c6bf9eff1d8a202ffa6063c96f9a00cf787ff4214f6b82f1c569cf5ffcbc9ebf4d5dd634580f89acf41c038bc108163d6de0d62d066e419afccd389036773170d326c01a8020001b7f42ff0b40d8')); - dbms_lob.append(buf, HEXTORAW('9c36e2ef9b7ef2fece90aeef25f00f8b3da7ecf39233dd710f1df674c4adc13eb1df975bafd4e3da6cafff6c74e7f875b5ed08722728a25e6694101910f4f9b0ed08f2dee25c9119001c276cfadecc0f5b8fddf4e4efe97abd6ff8')); - dbms_lob.append(buf, HEXTORAW('717421050652660c043af3b94a9932a89c04dc7cb9d436f5b30021693bb35592b6bb25106a1103b8e21ec111806b705d1ff46f763db4d2de99fd88524dd20e987e855e20d62bd6e7e97ac21445a6f60307c691c9e0f038b2d54402')); - dbms_lob.append(buf, HEXTORAW('732dee4b0d3dd57caf4985c8b5b8d99bc58c8a543e14f1ae0222de6f374911d56aae5b427efe05e89be7cb08e230c63150f4fb21f2be3bc67517f07642c46a2c92dc533b9e8de532e2fd24d4148f457a2bdc9781fba865e03a85eb')); - dbms_lob.append(buf, HEXTORAW('32709dc275a68f4340cf5f187f3792c85ddedacd7191be729c32e2dd685e11772b23e9154792f3381346bc571554dce3aa4e46f47975f9b3fa08dce26c98b7f94b7349e9c10612a75c02955631245fca75553addc032a46dafc001')); - dbms_lob.append(buf, HEXTORAW('5709c9a48a529d08f746ae24b9af81218ddfa9e5349df6ac7ecda733deb866a9fe5baef559541239dc7c5f3dfed518ffb62390791e5912c13ca27f9cf922d65052a18a752a3309248920affcb9fcd24d1d95ca5ff7c45df7e87db7')); - dbms_lob.append(buf, HEXTORAW('326ff147cb911eb21c84b80c11fba5eb309f3f623e3f0144a1ae22d4d62f869341515df451e7a6e439c06b808ff09224422a97530141c859a5456ed894fd9a545a22f2ba02b6abf217d03f52a93f272cfa6ecd214afdf2cc98c563')); - dbms_lob.append(buf, HEXTORAW('c24a1df65cce92933421497d38edd7a6ae8c4d11e4f062d4fb8d723b542f829cfb5c86629b11e4b1887781bf9023f60b300e05fcd1fb7f9ef5c5d32f6a867b79b7853dff840a8a5557349fa980ef63beb09e4bb02f2a487545297b')); - dbms_lob.append(buf, HEXTORAW('28b50fad7322201115d0f61401a166036618e035d3aa98bbafde226b1e5df244f1c94ab5a8dfa6cb2afd42358beb6e3ac3a5a40538901947a0ad804450eae746fb1d38421b8184425530b67aaa03b6a1d838f0abeb66eb4fff6cfa')); - dbms_lob.append(buf, HEXTORAW('490309ab19a0276c05d5284813c17d34ce8818a71dedb2ea05de66dbeb662b03be726143228297345ec1a72a88bae9fe725ce4ce0177ebb53e6edcb5f321519412a40d035515a952d86d17aa167673a4c2515718489c1a07564500')); - dbms_lob.append(buf, HEXTORAW('330ca037a3025fae2d6fedd43f46bb3680d6a5471fdff876bdc51aa71edfe91e97699205a5aa1d319d2be623037d8fd7996f9d4a95a9df6d3b8aaff2818ad3dd0aa1933e1ef6f9139a43dfb06ee5cfeb9ef3ce07ab0071c0334186')); - dbms_lob.append(buf, HEXTORAW('2e9de695e13c5c0f5514ab08bff1e223a706b66d60de59374f91d29502e23a4ec541bfcb026eef88df2960ae0a5073e0ab9e5e72f6587dce64b63eec8113f57852de4ec9744b39fbe2a1aa1b419ed49b935494c96c7dc027ca4e14e')); - dbms_lob.append(buf, HEXTORAW('56fdce4ba3d7ff9d280538676f0ce1fbba5932a906c7bc2bb909c4868fe4875c581b211c002017d6d4f131034e62a3d5ac138481b72ad528ba7cdf86ac179fa034fedf8c57e7a81a67e9a3ee1d07a71c8329863b6a3f792d191fa64')); - dbms_lob.append(buf, HEXTORAW('7ccf85ce9ddc6e27c37ba5ba6eb6d256605bd124e09a90dc84fbbc8184c974d0d2a84d6ebc4d038c77d50cd08b2bd87416f0d4c5b8c3b8cfc2f3c2783f2bc938cdc2ce12de662ad0389e23c69923c64904561ca8c9e215bc04f5cf7')); - dbms_lob.append(buf, HEXTORAW('68b078ed207d8c8b75eb787233715a9a44a5090ab14075909d93ea84f5e57d00d13c74a070f7ba5089515415ebfe00a99f18164e3164eab5559afc782854a357cbbc5e357bb6f3c5ddd977a9d8a8f7bc930ef19e81c61e6d5efc517')); - dbms_lob.append(buf, HEXTORAW('89f6b3b9a0543fcc8fe907474c7bf03ba32b2f2f1ea9d4d482afee7c7a88528b7e9cfefd6252fd1161a5c0331c3825703228c6fcf27c1e97b8cf368fb82cd56eab808e9e22a12bc88d14849a0fb6ef13c34a4a6a2a74f7fcdda0aa')); - dbms_lob.append(buf, HEXTORAW('61f75452ed900ae7cad87d9bfbad9ded8e6fd3b2353d22faa438b0ef2103c28bf5d9d3227471832312326a76b4e78f5bcac055f84e89d76db5c30e0ad9abcbac2e10aa5f668f7de31dfdde4b96ce99bf6c901918db3cc82961be80')); - dbms_lob.append(buf, HEXTORAW('22c302650daf10f3cc95362380052a49db4336106e1103c8482337267106b4107881698ee4fb4ff3163fac5fb47c76e9b3df8f4e88db8ee28ad58e367daac59d0fdd6577aa89ee84a370476b71dbb095f86a713b36f043b76cde3a')); - dbms_lob.append(buf, HEXTORAW('b0283e6645e3e91d3f2efdef1831ce31629c63e2c7453597b9c67b6feffbc7d510878d2171edf8b871f6f68c13f3c778148fb3b71867e2f98c8dd3f4b3a846b8a8711f3ccee82a595f77e59d939e52ea93ab9ef962d0523312aa00')); - dbms_lob.append(buf, HEXTORAW('59d6c640f23e2925ce998cb5a4022115078c88cce9d201436f28bd5108a2b1ae98d631d6b5bb8e674efdeea11583f5613b65d3f98f1a55c21c310f63f09e61e0f27c6f7d1d7d8f30aef3ce2b7f0fc627d7a917bfe3c5fffb05d3bb')); - dbms_lob.append(buf, HEXTORAW('0ed4046f61fe9435bf8333a7fd26032c892014df23fac580d0c1930a8bbddc4679f1b1e441aaa607bdcf6548bf7716bf770ef8fb775e4878cbc5f727899309dea8d8f87f9f30fdb83ff4fa99f5d4d883ee18aee7ab8b33cd4d79c3')); - dbms_lob.append(buf, HEXTORAW('35c855e275ecfb7ec135f9e97b1a7c1151e33ce0fbd1be58f79f95ff9a3449a91f27e40f9b0a1521a9a0f8bd1ff0ce17f7854447e72c9fc3b4deb3bdbf276f7f9104c2818644db491229f0f64303f07b5f3d099f96bde94ef5aa39')); - dbms_lob.append(buf, HEXTORAW('051b22b65207fc9255e738bd10429b5216366feec14d58c2d17b93051206b903077ac770df70e403c876b29d6eb632e27d2cdc6e3b89d41e390192830a901c689c9475b79ade66dbe0784d9f395eaadc4ef32b6b65cb88f7c40159')); - dbms_lob.append(buf, HEXTORAW('d50e248437cc96633714cdd1339d5ff8d4f8e76fd59be3c9d247493545eea27c206084acb2a2fa1e929040f4272f1e4ee5f02ee0558074841400da06703cd340efef21f42dcda02dde7fc6cc5f6729d576ff63d79f3d59ffb63af4')); - dbms_lob.append(buf, HEXTORAW('6713f70b0749ce314ed46009f236cc467f8a74271539b8622a98e8fad87cf9bafda7efa3cfafbeefe70c5985f7874a880ef6629224b0af48a2639515b93fd3bc929b2e54246493a8b8dc8b9f5548240148ef1f48404c90a1826282')); - dbms_lob.append(buf, HEXTORAW('8eefc18ca8b85e465257d1f70367cde518c85d15df9957aaadd4b225f3bf5f7ba852ad738eeceb9e4fb546d57df75823b1627e93781f2697282378a657a2cc10f811f15ef95179cb8d1b95fae2df2f76795a334e4543370dde0aab')); - dbms_lob.append(buf, HEXTORAW('0c49d0d20d9dbf8f9024997063fdb32a8f54b479cadb222a49fb8b09888fb3cb330089b0a31b300aa1ec71376cc9335b9ea85ca839d10bffbcf05b4d699b9fd4a676c719fa5566a5aed9bf7382a7d0464520a13eb648076d12a707')); - dbms_lob.append(buf, HEXTORAW('6dd06411ef64cccca2003645c74904ffd2016dde2e990d82fcbdf3456a8fed0dd02b64ddb9b131b0d15d2c7419a0e7cb6924547163b9846a4f8cdbaed638830a4b753504936d510139b836ffb06ec22fe729f5e9c2e7c63eab0fbe')); - dbms_lob.append(buf, HEXTORAW('a29f374ddfbad50c8ce2059853ee6ba02420acb222b7533ae0c84d57a83ef860a2b4ed71e9dbe31b138e5cf433bdbf87f48a707eae7ac435801e909675836bb4af51b3f6a2330f8c435280d51fb3b999752675e103799ddae89be4')); - dbms_lob.append(buf, HEXTORAW('a04d45812abf4d2f7a7fe53b9553b76ace7a5c8d8f073e3345cfd19b9b8ab7bc82f90848f7cd9cfa5cfc0e022d397a72df65151508728548d247f556e4c12f09b3efe0a27e9ee8033a825030be3ceff3e877ba8e739ae1b9cc796b')); - dbms_lob.append(buf, HEXTORAW('bc8bbf9ef9ed2f33f5f63ee9c4abc2ba9f529cd2b9996bde962aa96405a5628c9a8d7734fb69602023e8c137e3f8efef76eb0acdbbeae73e0bc1e0708439158822b774b23d918d4fe476e3004d4a5db2c8ffde1e98b4fd5504845a')); - dbms_lob.append(buf, HEXTORAW('9e01c4c971a0a1e8d3c68c37be6ffd76c3603797cbf2b1f3cffc5a4fd4fe9ddb4f6b7d8d52a91bd31a1e7c6d8267e52bb8e5527a73dab88263080a20923688eeb0310c807f44925adc496d1063d9ebca2cb01d0dd00b33a112a933')); - dbms_lob.append(buf, HEXTORAW('b633402f281dfe94ed0c240c26a8b9e63e11a782036fdd0b2bce1f3f5e7fb6664f757da991de1c2f6fb9bd085e7b4c38289e000759710f4088f864ece500411190c61c31447be67ce9c001a1f26da802bc19181b3a0a9880647aff')); - dbms_lob.append(buf, HEXTORAW('1e5aa2d48a090b3bfeae39bd8c9cc31f3a42738c29dfa674ce3cc883d360cdc0bdc99c43b24158d690d34560c474ae0b96a6ce993ef871a516749a346d16fc838880b29b33248a22230bc76c1d225e866d1aa492a29c4a24c9615e')); - dbms_lob.append(buf, HEXTORAW('1d92348860900461a3df9bdfdddb643fa8d9de2e7b2a45c4f3d058699c873e7de730eecfc5effaefe545a5eb5c09a6ded0c68fcf3956a926630e1873c9ab985ff70bf873c7d9e8e79a3ef63d4b94017161858919d6b2fb4ad7ace9')); - dbms_lob.append(buf, HEXTORAW('a0d46739cfddf736dc99652a1e628828ae83bf13314ce4cd86efcbaa404884acc222d5556feffc246f7bda0612d078e061f4a54d041b9c757b7480e88363cbaaf5376cb953a9af7f7b7d7aafdb35c77aceda7b5e772732a22274bf')); - dbms_lob.append(buf, HEXTORAW('a7d9b00df44ea6834e6283c857d103dab910bafc885797bf1dbafd6ce0e92eee0b639c5e5dabe3b395085d39fa725cd9c2b621c6a96cdf389d78fc2adfeb971ed3edd2fc117ed18fe9f4b33de3b439aec43ce714e747f7205fd274')); - dbms_lob.append(buf, HEXTORAW('4eedfc2ca586bcf5e4b12ee7557e4969334a0ee79338b07198632689438aee14e8465e56a40b26880d54253931aaa419d078dde27ab68190aa04ebcf3da88b9b6fea553a48a91f6f1fdcf08695fab719654dc68fdb06eed8f717b6')); - dbms_lob.append(buf, HEXTORAW('0c87be07e28fbc362227ecb541551e51b160cb1d4a4ddffccdb01fe0564b121707ea617ed87b4710661949ce8443d828a48ebd4ada88b2bd9079701b3022672149b3bd909f13a0d377e8bbd0381ff28e9fe6a13c2ed9e60ffb7e74')); - dbms_lob.append(buf, HEXTORAW('d84c2d01977f5cf2c44f676cd39611463f823eed2fd3e7f5bf6d1b5fd9d8b2e3dca49f5faf7e7bc163e4464dde700fc4c6e5b6d280b204acaa123611b2f1c9f991f358fdf6574b20d4228921ab08f2d00787c91c838dbe9efaaa05')); - dbms_lob.append(buf, HEXTORAW('95ebdcfb167d31eda9a9f594aafb75a3bb7f395f73108d1b3f78821bd1bec0ea5c3bcbf3cc0ce08a624bc0317824099fe49005afaba190689a52ea942491a8413608728bed847a1bac3a4b5a235a7036901c46727c0aa9a0308b42')); - dbms_lob.append(buf, HEXTORAW('72c809901ca4089e2bb2c006e5e00af62e19eb1927249e67033dd20000800049444154caa3ca87ba1b66f26923af7976ad3e60af1c72f658f7ca91ce264ebb4e1b8674bc50a530c188338646fb58d7e44dc48483bc73c8ff9d4478')); - dbms_lob.append(buf, HEXTORAW('e2446df4893050cc49508b18c01274d8db9792734813bc92f95b4a5cafa0351f2cbbed3bcdb1ef5fdaaef258cdf18756a76c6af140c267640077d8e0c6aea0dc5f6bc87622243de4e05af3e2d2b1a3f4fcfcfef2d46f669c675092')); - dbms_lob.append(buf, HEXTORAW('0a8f732441a2209bc756a8b64a496585dfd96b8d5454940e9ceaa5d07c1600d2c12de6b7da12c68eb608609e80384f1cf1770e27a0f3260c988bbfebdf0fb832eb3e37f757bd48c3b6dddcacce4111e46cd3622fce0cf38c00491d')); - dbms_lob.append(buf, HEXTORAW('fd8aec8affb9b68ed175deebf2689a3ec78e99f1d41f88df609514f601bba5cff3f6e93b9542526155ad34a2c3fbca2779d86a3bdbdf4402e11636806a4f578d07840e95bd2f28bf3d71a4ad0d242f91a20c7d20fdfbcb5bc7eeab')); - dbms_lob.append(buf, HEXTORAW('0fa403078f3e671f2d994c58bbe01d3d7155232b07accc8c7b26710c4111ef170644bcdba8617ebada662deeea46bc3b594e17f42982381bf76db366368f5346bcb7445c697f6f847a825af10923de7db5e8af412df9b037925e2f')); - dbms_lob.append(buf, HEXTORAW('3a1a97e3196740647ee59d95735c4e7c79f8b7b69f6a517b48a727b27a757175bddf1d3313077cf1b3800840db8a0379abd1faaba263007301efc6f51420380d1001826ee548b75520c2bc92ea7b50e01445e2eee046a29aea24b1')); - dbms_lob.append(buf, HEXTORAW('502df5aa8f00c1f9961f65a04b10d79eb5aceb86054a7df7e2db9b2fefa5d4fa352b8e7a70a6be765ce5a7cbae49f010b94e6d451910bceb08dfabe2f48a6c37427bdac0af5f183e09cf072165c9830e28cc13a9a64ae877ec2bf2')); - dbms_lob.append(buf, HEXTORAW('6ea3e492151f1a58f92f406494a00c13d2bb67bb258b5dddc20670a09c5166b3719e22b8697dd0f94292ab1b883772c1ab678eeaa67f3bbaacdfa433a3fb26610479dc3e8d3e554690d33950d9a5a2b4d82d0075f382673fff4ca9')); - dbms_lob.append(buf, HEXTORAW('a1673f7ddb9d13955a78c2d4cf0bb19e4b4cc873ccdb4d7abd615f9420854929e277caaec3f8b1ee99612209846c4f36607fff9455affd5d2410d9e88550471ad60ba584570ccd83036f12f2f776b061aa36eb491eb4e93d97822f')); - dbms_lob.append(buf, HEXTORAW('da326dee143df16b2e583a6aa4a6f08df25a6eae5d5ba9f409355f3bf860cd096cb55a44d34147d8a869227fef0a8878efa9aec1184d2470402dee6dd43236c917a9667896157d5b2dd1a076322250f31149df097c5b4fd4aceec3')); - dbms_lob.append(buf, HEXTORAW('11efa62f22deadb7e9efe0847aa296791f964c2ec2fb7922dee3bca32ec2fdc668fe86ba0ff72170922d5634ce0ce051b82eda776654f67625855537169eeda6f11e7dfec0d00b6f6882317bf449938bdce8d8e2a94593cd2da5f0')); - dbms_lob.append(buf, HEXTORAW('6ba70d41b078898145308e93bb28110cf63a815b6f296c60954702526a121ce894a2c141ca0d07a938f88db6b751ce029258f03e9cc0330c084e922bc7e8755a5e5a3ada4de9535038337f9e269c4bface6efa8996c49aefdbfa81')); - dbms_lob.append(buf, HEXTORAW('ba75f4fa1c5cf3b5435c770fcdc9227bf56a3c0b91ca58477db8f67cf47b6dbc66f5e73ff4556a5eebf133c693919b2295895060be8a6f01a448f25c5cf7878144402ae840fad9c02a404a5144df5eda1afe360de9cef97cb10133')); - dbms_lob.append(buf, HEXTORAW('00c1a038b6ffbeaa82aa37dcefdca6d9d1fb86f4795173459dae5d5c964f4690d3faef09c983ec323817b6feb461c9af8d94faeaeb37521ed18469ca355f7d39493fb7b8ffe69fb69888320e842d39d4c0adc420cdf542fa7e25fb')); - dbms_lob.append(buf, HEXTORAW('e0bec30d2c0781af4837d0976d370c4836a2016a079bb5a337eea1661b40eebe246a5af0b60941824a79c4c0d454c0470d4c433d87f4d30dac09d1ad065255d4d222e9be3533af6dd64ca943ea865b5ea245c17aa58d979fad3772')); - dbms_lob.append(buf, HEXTORAW('e8b494468d1ac586e24b72689b842c7a81a060933517630dc78f3ace3bc6abf2e923543e03d0ef095584ed353afb8cd0d20d508948f21ccad66ac6b51d11ca89555159f0fe998bf0b970e271563c593e73fd7abde7862ca9fc5e73')); - dbms_lob.append(buf, HEXTORAW('3c13bffde2beafee556add172b6edd0486a092b2b5922449ba5be2f8c8dd561c783e9dbc4c578d03af02aa1ae6bc84ad43eacaf980dfd9063cec9e1e31209403089543da1106a6c206920e5d37adcb1ac8fd54e309a5da1d7542d7')); - dbms_lob.append(buf, HEXTORAW('767f2a95f951c70e376a0258ebd8ba634f7d34faac309543c0b3c3e6d9e6e985f7fc7ac7f35ab298d26944d308c6c1b643d88e8a88a3c5a147d97437dd81eb288219f3cbba7472772677580ca1fa69c0ff5e8dbd3ce93be1fba588')); - dbms_lob.append(buf, HEXTORAW('f3c44da514ae77e9afffd292579b4b8e29ffa98bf265809049294b4ed9faeb6fcd959a3f67e2ad6e4dfe9fed2ffe37f37c838f032729ee4dda38608ba11c63ec05777c62c8650828be895457e40587f54e8cf6ceaffbbfab04422d')); - dbms_lob.append(buf, HEXTORAW('02980748bae602c00cc031dedb7c015e8bbdd7b9c9efa2504b365b2b364c2bba58a9c54533c64ed3a2e4c24953d33fd194bfc63575be993f5f2f9aaf6b2d4e75bdbbaad2fa367373f9740bbdef12262b56f02a7aa0ca5adc49dd6c')); - dbms_lob.append(buf, HEXTORAW('65c47bb6a8a827d377e724cbbaeaf54f8fab999d386d7d6c9c1918675e140645bc537a78789b390f54ce710f9c4d9bd67ce88af4f39f9db4e103cd517ddbeeed7fbf5da5d46f23274d706d50c5f3b78c22b75b3606524a05e45422')); - dbms_lob.append(buf, HEXTORAW('d19b75b9e455026f124ea141de2564cc953a7910204a26c77106bb9b70502bf0e225ee9374ee1671a739e2f964d4cc0324ce30434bcc2b962e700b282d7c79f2f831eef8dba84b7fd0eb719f679a5c72e0937a5dfe9036bba5cb28')); - dbms_lob.append(buf, HEXTORAW('15eaa767c6b0cea933aeebeb5a32db327cdda68d4836c8f34e11cba433271d3ba57ea182437410891421aca2c230399ec29613b297b488b7cb2c19be1f7d4797d014b69f7dc9a61795ea58e7f4f3720bf48fedd40375bac6f65fc9')); - dbms_lob.append(buf, HEXTORAW('595bef9bac25d0df474c1bdc5f9f2f5ffcf6e2b9eef42c1b38ffee15a4faa3c03fcae54569efc93984e26bc0301161a78c00e49e5b2ee23b2a64ca161161ee0b8c2d48381bdbd1feee12886c1103e23f6814e2779248429048524e')); - dbms_lob.append(buf, HEXTORAW('319038bd347cb0741c3c35e07e980e512f1d1c60da63dedfd3c66b1cb7a53f525373846daee8d4b1dd4aa59a6f6d5d7292e66c6bf5ae5bd1467368e967d6ce3d584b2e2993537aed333d36aa6a4b0e739062b22724073b201ea08f')); - dbms_lob.append(buf, HEXTORAW('90246cafe42025891d4d0f5f59a762999b5caf7c63c9d9cbaf576a73cd75bfcc7b4d6fa06eb38e9a3849138c777e3e72d122b75a5fc585c499929fbf2f771179d151d237923c90f48db2e6b22421385ff23e61ef128a3778d00b2b')); - dbms_lob.append(buf, HEXTORAW('4d3a4acef2bcc70847508b18c0ebf566035390543024d667eaa906b2e44ceb1212740d482ae990506a6e56aad5c8c31ecc385ac38687f4f9b726dcb5ebd5df98b55aa95187bcdae83170d0243190ff3f49763eef35106e8eb30107')); - dbms_lob.append(buf, HEXTORAW('2c250ff66e0c1b1058437b2f6b7c9ea0cf1a0e30daa9a719983e41a92b3eed3bb34f58cfc5a4cacb5c82baa4e79cab7fd0d78f3b20ff8e25b061d1f723092605f888a160db2e24058ec711927711050eca887eec2319cfe4abef21')); - dbms_lob.append(buf, HEXTORAW('bc0b77ddf7dadb0808b5880124724a5581057745df02000746aaaef4cf0de40dfb98b7cff0746f5f6ef45470c6295a826970e2bee3ea7753aad1c21637367e45e33ca3d6e3759ed6b071cdc1aecd25f5fbf4776b3ea52f1e6ff572')); - dbms_lob.append(buf, HEXTORAW('c76b7550b746399d4354dba859f432abab7551ec552963b16e207fea32ef64982bace1dc37ff759f32cba8b3155d8ed665e63e67ae7393bb80ca37960e71dd5dcb528abbbbbaefd2014583dc0364cdf5cb2e5ff789521b5baecad8')); - dbms_lob.append(buf, HEXTORAW('2a74da94fe9923834564af8f7090682e52d33001211d3b1112e2a888609ce8859cb2a2b3173fe73a42dd0e075e447f19e1902d6200a9b6422028ccf08090f03ac5fa4c23c687080741acbb1ab0f1a4c3af3f158c133150d4e8fbc8')); - dbms_lob.append(buf, HEXTORAW('14179cda0384830f2c541094f3cd1c2d4920d20d746f6fb601fc9d08d2f7014c032171558c513801f04903ebd4c175743ee07b90ea9d244e522d717c0649e8c438a14fce419260f07d54d783548b58f755c22964d713fabd958050')); - dbms_lob.append(buf, HEXTORAW('8b182009090770914e9308c9615e980aa3136f5810102610c419c21b2c6dbcb89e16c8a780500d50adec9493bdcf67db4d8e183771a8648cede07bd33ddb8840d8807410531d1778b3c46735755ba5486227e377e401560e6f114e')); - dbms_lob.append(buf, HEXTORAW('a34e816de5debe8c33e09c5522c29973fc8401ff6ac2211b9531803157ae4f863f1ac89209ad37b10e99a010a7fb88170fad2b960c313fe542d7cec91331efacc292849a525e8481f71f2279700b1bc03657fcecfb2ec4809e2e2')); - dbms_lob.append(buf, HEXTORAW('0be43ad5ab88e248f142f5e22bc559280906a8b54b4987fb271c81c60fc5dc8c64784ddf1becfeeb34da5ee6a847bb8850d70002deadb06b20a031bd5c142a882c4e0c0cba10a1fb8121f9c3e7c05e627053ac854b88fb24a8c08')); - dbms_lob.append(buf, HEXTORAW('0844fe14480129901a52f03b4b4404a9c200f02ae0b5268b7e8edaa38d0f5c8ccbc1387cb98928fd33057ade893ede9b0f7ae26045c05605d5c87e0f7d72b3edec85952778f155e17747a8529c30a074c70d277ccdbfaed1b84c1')); - dbms_lob.append(buf, HEXTORAW('21d5515419fd627cd33b95b82e1a0f5c9f34db5ac6104a7832705de3accb0a02f8da7155059955344f9d180142f83038c395a1c74be38193bc13beecd2d6200c789d0814f8498246e3a1fb01e2d48060ae7818244920a15217f0f')); - dbms_lob.append(buf, HEXTORAW('c22308884c1e4b92067de732b87f57e2fb5491c41110b0b9fb0907b5bd5d02912d6c803701b38a25b9830eda221db4e0fc885320af2e3af049224911a26c2a9449a4db4cbd15fd1f12e36742421208cdff58316e15f01ebbba450')); - dbms_lob.append(buf, HEXTORAW('ce085269a2f8218aa21592783d36dcbfa0d32bbb2c87e5b3113f0bfdeeb181f491a528516c469ed2d075bd800e9ad25555c969464c9b607c2429c700a189a1470c8b46e99e31591d8940edd2721922e9e0e2a996c0fe3fec7491e')); - dbms_lob.append(buf, HEXTORAW('b2850d604984f62bbe0b7d8f14712e30630915177d0fb68111a3400484f60b7d0f620cc43e621522ed071167238de37bce1b6e6f9740648b18c0eb1b134c924915fcf45955441f000739492895d8a02910f52b2142a6c08d2e045')); - dbms_lob.append(buf, HEXTORAW('13f85206d6c10a0907033e603812412aac468893ec511900d049ca1daa2764f23fc22e7933c881d3c9fbc6d48b75a0509c58db78942704a7cf0904a8b36c828f13b119883c47d64fcc30672285755588c8fc6bbb7e9e223063861')); - dbms_lob.append(buf, HEXTORAW('0359720624826991bb2511568af8a66478a8049882f52955a5167e575049b16e1c2a2b2e814a121d491cf83bcfab7003dd6be679475bc4009644b07fc98b939d08305f0adfc3c139e040b2e3ef019b8682ad89093a9c45f87b200')); - dbms_lob.append(buf, HEXTORAW('ea70ae70a13187c47a74a3c5fdaf8a497d56e6fff3402225bd800aaf5ab1090a668e32020870eee2a3ad049e70ee36e08128b850867f2e70f81530b216297bc6bacb3c47d504d8540182c04c4b1044204060190aa55d237db3ded')); - dbms_lob.append(buf, HEXTORAW('2a2f245520135ad88eaa28e00a91d75517a08f886cb6912010902280abe0865d05c25c85646f74305204b783bfb304d45d8c8772544112dadbe20eb8450ce0f5490736a93a6c40bca745019158375520ec15f062e3f586804cb6a')); - dbms_lob.append(buf, HEXTORAW('521a2994a94b21304d9b41aa28fefc811fa34aede025fbeb76fd1efddd5ded9f03e5c039c20924a2a042ad33aacc2fb32e389b80e0bb63c5215f2bc50013cda0fcf7a9f47dfc181130947f45366030a80a5d2ca14584deb251cfc')); - dbms_lob.append(buf, HEXTORAW('6abbb7fdd3090835923810c8c6120a1d40c268cc111644f1b1404254a43e823eb295b24a0cbae310227759f4c586b6f6f1f65975015b8005dd342db4bfac8150d2c1c32a2c44ca3acb00893382379583dad3cc61e1c0639d3e717')); - dbms_lob.append(buf, HEXTORAW('0c4e92215066f20da50b6f7b9ccf1ae12e39c539d97d90b1abd876d00af4ffa0f312f746054e180b3d60082f072f4f379e2394845e280602892ec40c09930930414c1dfc1f8d07ae7030b0c183340bb5be5ba9b9a430cdd50f13b')); - dbms_lob.append(buf, HEXTORAW('1110aa4bd453dc88f7ad0aa3ff27fab061f077682beea3752f55502471df0848eb9fbe3fe2d75456c2d7f80bda3fcd06b2b32d62007f781b7dd2855adebf87a81f4a7c1dd93aa48d435ec73a57e2ec68c1ee6123ba6cbe5c4680b')); - dbms_lob.append(buf, HEXTORAW('2029f34daf1df49f5618bdf855717a5a2f1d95c8274bb76c038edc057f967b48801bc2e88e3c7c1266d68bcaee43a0a27c61bf8f7b0c06f0bbcd4efa312b748c038f65093ebd4f777a9b2a5835dda12e8ba1cef7581f31b09788e')); - dbms_lob.append(buf, HEXTORAW('7cbe7c0e8d23c9b8fffaf6ff8b0492acd906c885604963b72d206d1821babb3aed86afeeb74fe854a58e79ec8cad75ce56aac9432d3bee73ae52b50bebdd55e75a4d5c5aa62c8e1ad95e77d2d4f59a6b79d3f9dc72259d03f4fd8')); - dbms_lob.append(buf, HEXTORAW('6e3eb15e55c56eb63d88ec30d4700759b35573c759ea77bba7a31faeb8b94e1c7fcdd5ac8d79bfbc9b1e0e618e668ffead0b7ee73ad5be80a15e59cac2f4365d1837d95bacf95204a5a16854ade556a43fecabe9bef506af2daaf9')); - dbms_lob.append(buf, HEXTORAW('f7253962cf978eebc0a18731dd8867c2534c92b8e6c1e82c028499068e30a6f1696182defef7bad6a2ba8850d600905ebce92bf538b00ca830bd7cb1441ded05215637c88513a3576dff1cf743ba2865e59077538eccb7afb2a556')); - dbms_lob.append(buf, HEXTORAW('765fdd13517b96aafaab91e4276b1732dd5d97055b34e4b6768743ddfa6c0675bd138796b8142bcbc65e4dc5e588737a1aff8efbfc5bf8a55687e2fdfafec4cd7bd7bc584df5fdbfca552e353beb8329a2961e1daf57c109fe69d17')); - dbms_lob.append(buf, HEXTORAW('6654e81c0474e065c5eb16467207c673ae8d4ff3d4c7fb3bafdf20afa8b04ad898c0fce5aaa9eab6ff5f2510da7824b286016dfc2e378e15fbfd3ceb9661753541c8fad709bf759dacd75c4afab747eb051bea9ff2d8e1b7ea6bda8')); - dbms_lob.append(buf, HEXTORAW('5de6ef387eebf199ad8c20d5cb454dfa85153e696c253e372e750295b332a99bb4a449cc7e1c3a8ab9d0bcb06be1ce08b005f0ef045043e1bbd20fed2db7e503fb85e3d55af55951716ba2e8f95df2db84ca9d29e45ddbed71bf9f7')); - dbms_lob.append(buf, HEXTORAW('3b674e1b79b75279231ece5f4a2a32d2bd1361116ea7acfaa2be9080b84fa27d77efdffffe1b71275b18d03680d76f90244d90eed7fd6b073e795c132d11b6fcad4df7cbf4ba0df54abdaffd0d1a8e0f75683b58c39b42b96d96b96')); - dbms_lob.append(buf, HEXTORAW('a1c6b79e368a4bf35c60d70d4abc53c2556d1b20f9e6146c5b9d7c4bab2d1ef233224d8de0a7efa5f83bf8fafefc527332e387a5968c6c4395b9db3e5680d5fad4a29cc74d54b1583172c50aae2ea8aeb16bca9d4cae282db3fdfa')); - dbms_lob.append(buf, HEXTORAW('8d41ba3ee9ee7964c2e1eb7e54d760f172a26b91e7deb8f246e257ecff6e2f349d461b597b6ffdf0808057291712b82be543de925fadf55cfddbaef6b4a35bd63ff79975ca209c592d48fcf9be94a25a1f1c70c77f977ab221a21d')); - dbms_lob.append(buf, HEXTORAW('c412e6c2f7f973449219a950fdfb08b387715369e0f9f02be08f07937640ef7e7603c1d802f022c1e3e3330d58a4c918292b51a5ff5084950d31bdbe5b02a4696771fa30ffa0d9fad9efdde337a037f78d7a4e123945a73c31fe75')); - dbms_lob.append(buf, HEXTORAW('4483752f2d6a20d4c8183bd459f8cbfa4331692c83f4e32b10d88cbf86afac4f044445fc3bbde7cf78dc30ed392f0c6fa4f5caa097b4af394a74fd39cb9f57ba8c6a1435d75acd5075e5c8610f8bf7bd8e016a97682d6ab9584214')); - dbms_lob.append(buf, HEXTORAW('9ca580510a25dc5f0a039eb9c27d7eaf7aff8b1ecc2715a02d9dc6ebdfd4547a53ebff895ab467dadd4ac93c73d568cf828197f210b8871802b412240d2fddc06c41bec7debf39f4e40c206f0d224c98308c9c54ad56dd3e04bd76')); - dbms_lob.append(buf, HEXTORAW('ffee606afdc75c64f4aa57d5ef38a1b87e88d7549e8a6d3ddc8f453acb1513f7b5ae8b69018628423d9c11fc67d3646b3472486c05c5882d3f3718e010470473768b2567955e569f335c15e75d992268fe979eff7758f15a3e00e')); - dbms_lob.append(buf, HEXTORAW('e9cbf143fef244382820eb65031d383b54495d7618fdbd5d32891840465d5ecf7184e2922beefdb46e5da55abf78e491572f8d265d2cca6da599a3f3436f1cea26b16482c0c93e693d58e887d10f627c4cdf7fd01b7cb1c264169')); - dbms_lob.append(buf, HEXTORAW('ee2c1c77d99955ae480f311b01dcd26bd83cdc972c66efa424bd02d8b370fbb5da9826b66a5bf71b9667826ddfdf81ca485e7754801b314f84a714b24d190242d55b6c2b6e7b3e94576e60d7667fba712908801be1427cd946a92')); - dbms_lob.append(buf, HEXTORAW('d3b224454b14d77ef2d4c8f3ffa509c62b356add73affe5be75051c78edba12aa2e4871d5073dcc6c1df67070ffe7c98d02fe23a1c11735da0c460035fe2833f1f7fbf88379e8dbf6e2f2769eecb0781bc08efb98b3668502bbfa')); - dbms_lob.append(buf, HEXTORAW('cece1896728b5f8fa5f8f7f3455a9d786ddf1d464533d3d963c6eb4e8534022a9c468a312874884c3c6efb451c3bb7efcbbb4850d905e4e1679611da2d4559ff57dbc4103a50e98d86ed04d599a607c98fae9ad6ee5bcabad798d')); - dbms_lob.append(buf, HEXTORAW('676d839190ebcbf2fa545583f1d9397cbc7eab8dbfba8484f027dc6f3bdc5cd5983ef8cb524be67eadcf8d82b1b39bbd709e5e9f9fde71e1346495e688fe208687080af5a5ad4f12149f71ebefd252feea01eca21636804b8912c')); - dbms_lob.append(buf, HEXTORAW('c34d05549ddf29ffedf645eadd48925e71dffec417a832d4febf7886b2cfbb7b5a079f3b8859821544516a735370b310f7fa1c24d362c297d50f64a9686f5951a1584240fcfedaaea98ebf0774b6c1c2a8599419c19927767066c')); - dbms_lob.append(buf, HEXTORAW('a0ae286d4b7d4b96c6c5719421383fcc597464f1e3eecaf8bbe33d88c02acfbc64c630ec4c4bf9352567ff2b946a5cd062f9a5f3943a36e5ac4eee86fab1eba7fb4cd31cb433c35948df990237991050c1201a4944f40bc4ef79e')); - dbms_lob.append(buf, HEXTORAW('2f7825df106bba0d906706967eaebf768f8e4bea342b728d5ebcbb786e4dea954a3b1cd6b7d76ae9e8bd2948e679fad5c9373ddda37c57d97d8411cc5a2bf5e0f6033fd08fa19fcdd33cc7d62fd5329d70c71d05b027f21f0c54a')); - dbms_lob.append(buf, HEXTORAW('387bf031639519b0bf72846a3693f1e761fc1918ffb6c71b542f6747d7a9e56ae5f4fa74529bb63e4dafcf035ad4bee24da5b29b77ef79f0294a8d9ef9e19bdf2070308400d910dcf42939236708a09185f1bb0d18f1fe9dbf3fa')); - dbms_lob.append(buf, HEXTORAW('efbdbaccfbd9e80840d084c09a1e11d33dfbdafb3e654eb5cdfe0eee1ada21b605ce793a20bc9f0b3969018620b3d8267781762064b20c6d9f622e6e423c0e73df8f37c12430f8cd13c9708d61cfcbd13fe4ea27b266d742131f4')); - dbms_lob.append(buf, HEXTORAW('10124321e333ef910fefabaee63d59b2caf4a9206ce0cbf08cbb5010c07cd411e96af5c3dd1909e7656737a86c6e253e8db9e69175da9cd852a9cef75e30a8ed754a2dfa78e6033f0c526ac386d55f539d0acae1c592751e600ee')); - dbms_lob.append(buf, HEXTORAW('3327fcef3f6a5fbe45f5e492f62001f1c790684f44a68f7c1b193dc142657edd337edf5e7dc3203a9a7f72ed07f6c667d56c7b576c56ae0dbd19b32a85e4c1023216aec5b98bd0ca1eacc14eb97189f1c5ccf12297f77c2efc547')); - dbms_lob.append(buf, HEXTORAW('0c490fb91f02c6dbc3871ffd80751a63d4c47859f58afd45e3e78af63bd6ac284e95ba5f7a797b2df9e5fcef92ff1e778f52f54e6e3479da614acd1b3671e566646ab010c82cbd3bb9767e2efa79e8033221e983df6dc0c84e8d7')); - dbms_lob.append(buf, HEXTORAW('c17b4d05f3d801d6c949204594de9bc706d19b73df2c6191d224add97f9e1d0f73fd007cf05b53ff9de55750c745e77bda29c5ecad41e478deeb85ae261f33b6a18a3c6b4fe48a6e6346a8aab21a8817c3a6aa2f752de5ae8ed4d')); - dbms_lob.append(buf, HEXTORAW('9f6b8ca346b5ea8d38d608d730bf49e0cbc275a8796daee71ae543ccf50ed76a1735d01df47be33dbaa3e42ee313b5cb8770adf230f0f5f68cdbc17b50adedee2a2b1ebf9e97dede7911f340b5d667735cef2e69b5dfadfbfad95')); - dbms_lob.append(buf, HEXTORAW('395ea79cc8ba3bfd51cf74dfd5f38edac2bf137e41eaa81ca93e95f1898b6dec054144c0a217b72086e99e4c0cca49502fbf6df9523df46cbf23e979d3a9a29d5e681a36e4bd59cedddbf0ebaf1c2214a5d70e8ed874cd5479e75')); - dbms_lob.append(buf, HEXTORAW('56e8f91e4be2d703d5e446dfc1fa89d5d837eb275663ff265c87f5c9b5ec69bd9aef68cb9adf8caf3fae33d747047ec2d75eaca3a0f112fe64e395fb4baed370d078057e1bfbaf373b39ef92759a3ebf66a9cbb076ce38effed18')); - dbms_lob.append(buf, HEXTORAW('d94ead3e1d3d7fbeaef9873f1251f1c8075596ba28135871958a38b81692d0d4c81a332650de7dc667806c78bd13afdcb020bf73209842936118eba0686f446baabf3c0963d0af4c7685efbae2f57eabfadb5aa5c6f1375b6becd')); - dbms_lob.append(buf, HEXTORAW('3d286e47edf02755cde84d61d82ea68063a2f4003670f7e1eac6d1bfe88f66fa5df1f96e578703df6ce03335c5fb015327d442b7717d0c5f07e0335503baa27f3bfa7d703dd556ef072f2aa8b814d56a1fc9e30e47fb11f4495ee')); - dbms_lob.append(buf, HEXTORAW('9ae4c65e5662cf866e2b961e0234e54011fbd6d27e06b0a7c9d80af03f0d14c29efbc900a0ff78fc47bc4f0992765ee24c787163a2074627d2d8934fa7ebfaa73de53aac1a9cd668fd75f76f6e4f1456bb04e426464a6f5b22f6e')); - dbms_lob.append(buf, HEXTORAW('46640c4b1a1429938b3ebd214936f9bb62c4095a18cf856d87eac0b892c6058d6fcfa8a3bfd0491f759f32448f2ff58dd49ef7df161d5b8b669ae0591fd17a404dee91b09da146b75ec7a8814f5e785091d27aea84fb6df45932c')); - dbms_lob.append(buf, HEXTORAW('177cba4f5eaabf94df88a701df934d6c175a6df83d79b771d058cd742cd7e9564bc8c8ff717fa7d766cbc711611acd35d23415b2badba692ddc9a2db59a1c75a6526df38f742e7d4da903b6b6fdcf2f8d959aee7c3ff44f387db0')); - dbms_lob.append(buf, HEXTORAW('aa8b522b916deb1903391b32358a8807c9f3852314ecccc8b7a7ed25048408076f383a2034a776d71b03e7dfad45c69473d256bfb0c188e42197f796222de9fc5192551f70fd8035c35c87855318647b80086c4304865fbaa6fe51')); - dbms_lob.append(buf, HEXTORAW('c1d29ae253e598bff7205d3089f401b6873e166aabab6812ee043699305e7eac075f4c34cff08c7b2497ae9d82f708c7bf07eb8c7d3699009df94861dc97aa03a9ea504215219d120a770d2189aab8f4939a3cdb6245a69eb9d11')); - dbms_lob.append(buf, HEXTORAW('51fce1b0e0e8f0f875cc0020302dd7bdf15b8a9985707effd3bddc20648d5ab9bb9e0aafe8f0c6c74817eadfa873c3a7cb3be666668f529efab7895615ef4e22c43f6f4d73d241e2b3312f4bda5b139f6fd73cd75acea01fe242a2')); - dbms_lob.append(buf, HEXTORAW('e52a15a02bf5c5f36f0fb55509909c72b55b201ebdfa95fd5c4ad1d5ef665c95b6b3421dd7adba6d396680e7d53ceda110bde50aa746151e3959a23af9c59317bcb1dfafa6b9c196e6126eb736b7ff7bcb06aa70c4cff207a86e44')); - dbms_lob.append(buf, HEXTORAW('6d747d88c6fb7a9b8d0ace3ad9a35ced0f4f2f203569ca319df36fd8f7c60712ba5263f3beaad82025c43e75c8617fab265cb759a8bfb07a21f062cd8f9716fbb59bbfb013bd96c037c711a2ee1683af0bc871f76a58fd4c60f3d1')); - dbms_lob.append(buf, HEXTORAW('ce5b448b318c1bfa69fc307bf39e8fbf8bc3f22789ab91eb6072b99df3b0e7e2b76f00fc558c39e5163215a7d026c0ffeb88d2077601bff9a71260ba4ea6e3849cd9d780f7ee115e6ccaabaccdd90eb87fe79c8cc864aadbdffcfe')); - dbms_lob.append(buf, HEXTORAW('68bae526acda0a5c3ff68add4ea17ffe8b57a8de6a41eaaf9a4ab02aa734b83a1b58f566affd7db4e3ee86a7d70dfd8b2fdbf062bb54fc3c60ddbb5d3dfa379ca996ec9d5a4de31dde1b63c5446d4ef5c5b76c182579fd1b2e673a')); - dbms_lob.append(buf, HEXTORAW('daefbf89dc5e637aeb8478593088a8a87be825522f7d04e7bc3000fbf71c4009770fcdfd17d521bbea454cb21ad7f1ddd595ff366e8f9c30e57c1713a63b15ec25c02d936d761ddc6d6b19721925e81e85b7d183fed8b6daed7eac')); - dbms_lob.append(buf, HEXTORAW('61559b140432f0321f1c7dc7573dcacb745ef6f6a5ea80fc4e55f2e7a69b2e6c47f7de98733a6d6536aca41dfdc5290a7bfc5ad55abd84d5606f8496fa6480c663cd861647d2d9b1fd7bbdb7f0e5fa754bb538efefc0c2db9d679b9')); - dbms_lob.append(buf, HEXTORAW('41fdb6cbf5b778c03a3e5a386a17bb03fbda58d5d775fb5d7cc3ac7e776e51eae5336f3eea8b4de64fa5a2a433ad5b99769f0b49492fae3de65df87725206103a4ea216a146ff2ced737acd422fd41e9435efe4599051de524e4829')); - dbms_lob.append(buf, HEXTORAW('6073f1f5c66830c95077000a71cecf76e8e83ee4680d4ff7a321225c087bf061efc7410903b305ae28da982dc13e5b8c5bc946e28deb24673d4f3ea4c0c0dd784e0fbe683bff9596fa0d5d72f7d6333158612f53d387d3b6a8d539')); - dbms_lob.append(buf, HEXTORAW('6504a6fedb6167d5bd7ab7b8e52e7bcf2df3f4f3f5da956cb3bac38ab9652e9e7d6287439eaa407e02edaa0ce994e5d371071d8b503be385faf8fb1e3f31f5908555409d2c9134129439c0913124adf4f8404f1249c057567736e8')); - dbms_lob.append(buf, HEXTORAW('97202ae31f5dc26b74c724b1db71b74ecac51c7baf310fae9c48a040c90747725c9776e124662bbddc1b7bdbeaa1b572423c683189f8ac165cf6dbc4da985d7ce58f055b152931e1ff1cdc4a795fa6df5d4f6ab90ec4406e851813')); - dbms_lob.append(buf, HEXTORAW('2ae8f416eda14f7438444e654132d9e31dd2f2da37bdd7e4a759df7df534f0e6909e19e8ebf5ca8bf7bdaf1351a377a396e3e6cf1fe3bd99cb39c7a6e05ced923279c7ce3c74abd73fb031b23f81b5522a4daf55cd256961afecb0')); - dbms_lob.append(buf, HEXTORAW('8c9df558595678075b58121bdb16ebbf9cd87ceeba53fe8313526bcfd968abaf5b97f67cec812aaa23c293140273b4091c410d589c689dede833f99aa882410c6b773aa22bd308d57978c1cdf5e5591e58d1c77d63ac32af5425bb')); - dbms_lob.append(buf, HEXTORAW('4f59716233447fd66e3bbafed7fb752d3fb8c3ee237bd708bbedc34b518151a99c381f1984bcca25f8eaaec1528454b2537ddeb378f5957563c52a9a95bbf7d7c96e6a826ffe7ebefbed2a4b0ed9d47ffeaa67ea997d6e08ab6e331')); - dbms_lob.append(buf, HEXTORAW('0f99712a8e4ce1d5b593eec0d642abcc5561367ffee04f9b0cd704e48921bf4532ccdf9c568057011600ca248f74e05056541c48568f1d1991f2d999dcecb919a587eeefd68fc97eb1fb231fd5d0bffdc76a71da872ace6b891816')); - dbms_lob.append(buf, HEXTORAW('cc03ab8cb08e07324364bebf543d92043250ee0be0cf11f8c672df327d1fe1b0d1033ee10e2cc7db83fbe6793d0cbeaaa72af34a4a94fafd8c19ab877da1d4bbff7d70547f2d234fbef8ab4db3f58e5c5bb4a2ffe697cc83b9c4eb')); - dbms_lob.append(buf, HEXTORAW('5b80587f65afa30fa373199548461d8d72147a2ba3f5faa0171fc337013521da52b5614e895eafd35f1a3d7cde7e9a905df8d58523f4789a576436700309eb7769bae4e0befa2cda907242ad1be3e62373e70889b5c02a73d741d3')); - dbms_lob.append(buf, HEXTORAW('4ff77ff5d4a57a9fdcd430ebe71b949afbddcf43d7ac35d7500550525d39229e890904fd9e011801cc15fd5dd6fe6e1248c400aee075b35237747b3ebfcd377a6237363a61d299fac7bbadd16e52c26d04fc4989c136d7414240dc')); - dbms_lob.append(buf, HEXTORAW('86255545317c36ee4ec68199fbbb5b9068a80c545289c106be3eb8cef31ebe1c41313ffd3e786ed833ee0055515593aacfcaba2935eadc7787f4bb47a909977d3e7c3e361e979a254e9b2ad1d1ef540f850a3f550a48e9d9856e96')); - dbms_lob.append(buf, HEXTORAW('393a8c9c0b6dfda8d48513ee687d8216cd8f59dae53f7777d2bf2d4d9d58bb9f0a5425ee74c4fb18157109c1f7bd06e75ead8fb8e127bf9e311df51a88a32b46019f12a4d12f433d06aa155e81b4e795548f4170b6d59644220690')); - dbms_lob.append(buf, HEXTORAW('249d728896a47f7a77c8bd5a024a599f7afc238f6c53d20d9b5f452068966138b4bc9a4cf235f8aa8d9fefc377f1ae2f9f4a96f0fb23c84dbf8feeeb795bfee7c21a63341c76efab5b3f5daffb072e6cbcfe7083992bf15124b728')); - dbms_lob.append(buf, HEXTORAW('6d2cd723d50ce7f54b017bb2467eb28c0311037c9549e3d66d14ea03bec109cd9ad49ea8d4d5573e3ae1cac54ab5dcd26659f7598a3520bb4a82aea85f3ee68f3fb424b2f48153bacf566a9e3de9df2b5698bf95922a966aa6a3e4')); - dbms_lob.append(buf, HEXTORAW('73b9a8f4292b17d2fbeffa54297f17021236800f20fdff13979edf387d9852c7adec963e417314d69fd6931d37051f983e559114356163d0c73d490c73e39f99f4e0f7e3b381af0ff04580af7a07bf24803652a3f44132c5edddf8')); - dbms_lob.append(buf, HEXTORAW('42b73de3a631cdf2ee52ea93c6cfdd3b1aaa18b92159c280ae953938ba4e88ca95e00cf94015aa81f8f89b28c406e492c07a639ef5cd75271fae0f9070db8b173ea32593d0d050abf474153bb0923306dbd5b65ebfe9a969cf2af5')); - dbms_lob.append(buf, HEXTORAW('50dd6e5fdd081b4411fc758aef01446d71d2359752adf0190656a07ec3769776b50de075ad19a2ff1df97a8dec0b94aa19aab5e05b577576b26523550e1152dcc5eb2c12fd5dda32068070f4c43af6ad273ee83df892aab8c216249')); - dbms_lob.append(buf, HEXTORAW('0c07d66630e128e57e29f7ac2b757bff186261ca7f55f376e9cb9900e7c5e8fb40e2149706df072efdfe977b20d708964590a99321088e49c7c70d29b813521776e82b2c22895aaa512c22ebca2cb83a373f4fd879f9c73c15dc7e8')); - dbms_lob.append(buf, HEXTORAW('7b4f0dadaf556bd71192ad6f6dec3646afaf87e69cbbe946d42d625b1e6c24bc4e69de683ea87225a9fe0252faec7cfb9ba8b0d8cfc136c03d80ce2feca52ef9440ff1fd94e76f724bae5ae200cef32de88ce8ef41816d8510e46c4')); - dbms_lob.append(buf, HEXTORAW('80c0385aa282f89c420039cc83bc5a72a403f2f89c4205566851489ee8bf40e1b7c811c690ef045c7bdbed39fb9bf36d21ccca2fb8ffad02deeff917ab13cddcc2b198bcbc169978283296d6e600912c2970212675e8af889129446')); - dbms_lob.append(buf, HEXTORAW('2dbd1678a02220dd6c192a0c92caabe20a402ac1aa39a30583a62d5ef9b352878ee8bcb4566da5eaded1b0ede1876f635ee43c14729855a6aa464b9f5aa37373fd9e15b795678ed7846cf107bf46d6a1146c15545a6484ad5a64209')); - dbms_lob.append(buf, HEXTORAW('7ee251b086ac13b19401a01b4459f9a19b92710f09c277afe5a477fd97d7bb71a35da55c9acb316357851c5af337a2fb96e131ff4d99040a6601dcb08f2c21d8c201f8bb7f207d6e6e19dcdfd03b71d41be6ac592d1131e53eafd5b')); - dbms_lob.append(buf, HEXTORAW('fb8efd0405ca985090ea098480243eb249955c6a2011f492fd005f33b018925ce9ebdeeb48b55586380a7696c0f398415ae01d47051dc02875c00c962050f112f82fbffff0de6237a5c980e2d77f7a422fc68f0f7dc7cdca9d7246e')); - dbms_lob.append(buf, HEXTORAW('a0d510dc94e7a19a61f59f3d24c4dca67341d73d5fb7add6efd65e3c072a8dc58d5da4af4096600c2898409461e60c1ce8c2cbefdd504c436c08224c4a947b42879e2fee79dfb8a1bc179acbafe40d7b81b5be019d18b3244aa0d69')); - dbms_lob.append(buf, HEXTORAW('632814077f3efce357b3ea2a027c7400dbc0670881d4394b5b493e0efad56a35aeeb0e7c99786ed8e0f3b93ddac0e77d8f58a4f714e033f7c7085806f0e5019fe760a9a85976ece62395fae0fc479feba739fb4d83d7debc152572c')); - dbms_lob.append(buf, HEXTORAW('b5a0362a3968280d0c62cc5c62cc1062e25633371e42030c4f1947d0e482234085305e99c4972a11c5504e3921f6e18b47aeba29a9a839b179e79be6b343e3e5437bdad4ae40e6ae62933e080ada6ada466699d92f5d395faf9cbe1')); - dbms_lob.append(buf, HEXTORAW('c3676ec43840302a1188286bb257de803e15bea20d2b39b93cf130f4793deb1575d629d72fb84413e6d0b89443aecc56c111d362ddb2243110fa8230f74d1c43f700062876d0db1815182069cba075c6712079e87b18131e6fe1b61')); - dbms_lob.append(buf, HEXTORAW('9acdf3bcd48fd5c33046f1f73ffddefbb9cfbbbaa8a0f6c405a37ec6d4484830806312eb42e014bc1c0903344d97c014108ca6003619b1d313242455bf196f89d246d6133a93c0050a8ca5cdb44e1cb733e5fffa9668cde9fb6efb7')); - dbms_lob.append(buf, HEXTORAW('fabee346749d77c5026518da4cb5d336bdd677776ce1aa84c7f7fbfc9529887be375482a557272c13a261b1fdb4cc2e2f70cc0c88e8c28befd5591e8941597bc5222068634cf7ecb3bafaebee61cdd39441d7ae227d1c931db35e28')); - dbms_lob.append(buf, HEXTORAW('45de0b447e4e810f4c3c647c6b91011d14191b8dd9d6b70dd71c087c8718af4c6f5b148effe5e7c88aced8dc86fc493687ca79bebccf5848fc6ed0445bc3b1cf11e06be2ef1f835368a1c0f035f6fe0a37930be4139ceab6e65bfc8')); - dbms_lob.append(buf, HEXTORAW('531f7dfaca10a59655fd36721d365cd9930612612846a9dc22d468dfbad5c0cd58685bde411f46bb2dc3011168b7159ce1d677bdf713a1da32d97bfd162cf42d5bfdf8e776fdf9a56573f4c61b3cf5babeb7e81f5f71aadcc0285f4')); - dbms_lob.append(buf, HEXTORAW('4bdcd11efd17e60c4fb52fdbf6db4fdfe9571f0197a83d568576b582dc477d4a801888324fd7103d31e3530a591811c094c56ae382faa68a38262367e27abc4214a9ddae4caffd63c4ae3b825f58ffb3b2ace701018312dd6adb203')); - dbms_lob.append(buf, HEXTORAW('22b29109212ee3c185b8cfec83ee02ff106f4436e3ef2ff1f3bef0e08bed0bef3eab6a52f953e5794acd6c1ab9e25dfd5ddfefdab7db276ea4ff494e791924d3122419245521af3fac9bcd38f868dd31440a90cd20f4bc4eefc2fd1')); - dbms_lob.append(buf, HEXTORAW('9c057e4c55bdc03f019ef7319c206567437200ee6a25c2fdead5827bc9eef0c1eef9203e70efb73b452f35e987865ef889ea78bab3e2b3d28b65f7734e27ddf9456196eaeb32bda3f38258cdf6ae3b9357f3790322ea483b14b2395')); - dbms_lob.append(buf, HEXTORAW('3145b2938d87322e5060ec4ed7b0ffab24102ad94a91e4fa052f19727faba65b94aadfbfe9db23dc83a797ba3bfd9aa8aed71b28950f01ac2b07ce450f6e6b2422519b627a6c4496f6c176ce52e746fb03ac6bcc7588d4a52cb85d8')); - dbms_lob.append(buf, HEXTORAW('32265a122202fae3ee03bb3a0721a600e7e7dd56a8ccf5c5f2802b2a67823c735be02e0cb00be289f630dc5676d2a22c70bf1dea4aa9b622270d71cf3c7d953f2941a3af4d99787c36ba87c8281a53f195832c8c06214f72fc6bc17')); - dbms_lob.append(buf, HEXTORAW('a3c6753172f41443075cbacc40524995d507bcc340e6d848558583b61235b82b7f01444d743676fe6c60552dc0364a4d2b1cfde6224d584e9a77fe39c7acd28b7f6cfa99fbbb78fb307f5f807930f31414f17e9c8a92376b0d6f0f0')); - dbms_lob.append(buf, HEXTORAW('fc797b23c35a59eded035fad61ee79efff35e9af8c3f20f310e4818aca280a4547996b7cf7121385898a32386080717b99f87862a754ef39e993df503439d530a2e7b38ba5e282ec7acb37e14318d754a190d060644785304f9ed58')); - dbms_lob.append(buf, HEXTORAW('c773185f7fdc47fbc01b91ddd51b91cdf89bfaf09bbfe71b7c7add25de174d745f73c0d30b472f786ba652c3faf69f301611d5a412225512312ec590208a0ff1fe5e04425c82f92b012b504292c5fb80b42ec90b0b35ded9f9e3480')); - dbms_lob.append(buf, HEXTORAW('32bc138f13a942a28591e0011e19535c5fd483d52b9c97b3d49a695641b834dd075739fb6e9bb977ed7077cd32d07b499afc7bb5f8dccbbbbb859a2af52ff87837cbb22dead19d6b2d0251a5fc3fd5b1ca925e79fbf1f71f5679ad1')); - dbms_lob.append(buf, HEXTORAW('297bbcf8d5ca2fcd35ce99804f611c2499d40624f7deb3bcd0ba7b5b4fae4edbd304c43680371a168e1bca9fd3e3f2c9f71c1755651c78ca23d183c190194add413add0c615c1ce8335a1bec8542053505a276368c7f6b025505f44')); - dbms_lob.append(buf, HEXTORAW('14d9f5450854205350509304817bd06c748863062c6540819c097077c5eddf6148e1cef67ded7abe28a534944802fda9fdce2ab8f3fd01c73c1c8598bc95b83dc134bf17dc958cc711001360ef23b972a804a703a643cafc2c265ff')); - dbms_lob.append(buf, HEXTORAW('7bf27e81ce9503bbe877481eec3e4b07af79b368ca86c337872fafa3dfbc5eed866961330f799887c4aa14a9fa198803b829ab6acc3cc90dda4ebdb55a4b6a135f1ab1744643f17e7440e0e0280701a434f1bef78384c549ee32d01')); - dbms_lob.append(buf, HEXTORAW('fa8d4c92bfe2fada626e8cd171c74f4604dd0adc5eae87a87a96da83aa5bbae2fc27b2cae33fd42a4e6b0814faab8f2808fddd871ff40815fd812797d06a9b8b02ffef8e8b795df2ed082cd374fbf341c3c35db3848550595691118')); - dbms_lob.append(buf, HEXTORAW('15b661d07aa4f507e330a9b0c81b8e6d16a42225a3bb5425617d914a92fa52e5e88364337857dc87dfd918bfd8db27b75a5621d1df81d73dd77eadfcf197657a5f1e9a7ed2bdeedfebdedaf0944ecd12a8d6e97b2649f1136a98b2c')); - dbms_lob.append(buf, HEXTORAW('1adefd2b269ebc6abb5a435a5ff372fcdc7bef515b27a578c5fb8fffa9c3f720123db1a41c2516def0d3bd9c280b601aeede3d497af3aa3f624371a37e5b29b5ca138623e2f275b8b18ef662dda9bbbc7c0dbd9367d279b974314ab')); - dbms_lob.append(buf, HEXTORAW('1619b3715dc4dccff8cc53f3595560fa6370bd6dae8fe1431f2a288daf37f099e75e88b0b07c88fa0e9e3706d793ea25dba1b71e037cdef788e1ebeee93bf8fb185c6fe37ee0734ead3add354a4fedf1ed01bf81d3abc482218e8c')); - dbms_lob.append(buf, HEXTORAW('3620e998894094d2c6a5dfb171c9b8eef3d612de32e4e5213939f93b491ed2ab860e84b236b1f1fcba6cdccddf552498976cef3cd0f7d5f360e33aeff795f3dcdbeb6c5cefcc065f1e88832295bcc4c8bb06de3629a700c2d84e2a')); - dbms_lob.append(buf, HEXTORAW('00cea23a36004600f5baee70c8095d2f7725b886aaa2c5e5d1f119956304ebcae175dadbfb5ebcce8cea13aa4e5a574e2cd9a7c127d76d84d7ad07bfde2f89f187197f18f7d9e87bf1017fc594b2269b6f57ead3675ff8231f9204')); - dbms_lob.append(buf, HEXTORAW('af0f923c28821a360e22144c384812811b7531181bf682fbda8b870908d924681d3ee4855501859c92c14a799face3216c22bcafc896739f78dfb880d5813d7b5ff4ae66982a9cf26e2baef79f3b4ed877ee6cb3658ce890eea68f')); - dbms_lob.append(buf, HEXTORAW('b736841ea8010d433a9c64d2a07948850a96d633953be0e4a116908505dceeb6a70848d8005f1a63bdf1da743ceafa735c9bc7bdce870dce8beafa23d13fe6fb0e608f0d20688113e1f06dc87cb66d40c5e1fd8071f8e8b944383')); - dbms_lob.append(buf, HEXTORAW('c07121f6844382ef4967d71c2b81e3afc0404d06bcba071e78300127e98be9cb0d7564207e6d6a337375db244a9cd75d6e6916e970f6e3ab0c9ed91bca428ce81bcb1be155046b88a8d042d79cc2d50787f70c4bae0882a094a82')); - dbms_lob.append(buf, HEXTORAW('029597bb2147b77d7fd992abf53d7f547de21e5071071de6218031c8e6f502428e79a20d2a0ed89a7dea3ed3021216b969b2dbe629dedf69e35962e3791dab63d00ac5ae0bdd9c72e19557c6addf7cb34e785df9d6b3785fff3af')); - dbms_lob.append(buf, HEXTORAW('0ae2b1bf87a07ae5bef3aeb2df03b9230739ff685171ff0ff366cdac5c38e526ae3b9ab3f2a426024ad17f6c6c3fa222f3f22204438a43b2a7b61915306b9ef0232c1a0f588a3d657bb5c014a092309a4efc7c668405eb7a2e2a0')); - dbms_lob.append(buf, HEXTORAW('6f9f4982124710d7fcf78f8e9bf47a5e7ad2dcfb5f7831363a870877f0f7c3f7f7b6f4949a8bf6d71272b78b6efcace306fc06c291960638de406688683d932d4f9ec339de79a87edbc30484250f827ae02975d39a5deeaa4ae86')); - dbms_lob.append(buf, HEXTORAW('0204e2996fedccb710651ee086f98ea490cd9019c1d6df8884f6290f8ba039f314afa2506410069dc011c1e73a8c0cf1c2aaeb7bd0766c9775b8e5d0d5d3b2f74e29870509743c72f37b8f4b7e7d41dc489112442404799024cb6')); - dbms_lob.append(buf, HEXTORAW('216df4e9bede5ebccc391201f92e36aecaf5e567ba49e6f43cd8e67d933006c449b304b26dc6206540ca43758c1521162846101b8ce302c8f848128694402ceffbbafddc471efbf2a0f7f47f7f66159d70a28aaddff6db96a8e31')); - dbms_lob.append(buf, HEXTORAW('81471d0f33a30d7cbfd21d759d0bab5057e264c5efc8e9048085fe996e25fd7e81d34f2aad7978e16de75c49933a322e269386e81240bf2e6a380385a8fa2d224c77708ef385faa124130e479930c26252c63c43868fd0a098525')); - dbms_lob.append(buf, HEXTORAW('6bbc0f4b54fafd5fbffcae8bbee8a5ffbb53c9e639ee97a3f94ef6fd025ad665c73f76066c364438d24f479f080849d630aa33432419215bc06ab73d444038b2dcc60f7ae0ff19786b59e3c67a086f875e3e6d5c8283df262f10c')); - dbms_lob.append(buf, HEXTORAW('17186bd077f1ce50ee3fec41b32dfd4dbf0a98ac2e2e0f7e1f31efc3e89e142ce94047ce2e0979c72108717e350b11d02541138302b0fab7881381f5ed82232970f68caa123fddbbff35eef13f189070ae30d2181547b434a4985')); - dbms_lob.append(buf, HEXTORAW('f090919a601c47e76439cfb91baeda8c0171ea73aac71884ce4dbdb8168cf84c2088609c22fab0154909440608c6ab06ea0e69f8e1c5cdf4f3729c68481e7f771e1fcf02adab30c68bf715eb4cac03de0fbc3f707fb275db5be07')); - dbms_lob.append(buf, HEXTORAW('7121366494808df6f1d271ffde51d9a7119bcf5675285922d82545714195d2adc7439829a6c6c227095dd67b11e39923adb0b791d4a421151bbb6d9dee7480987f6054bd8224343b9c8ade612ca8ab7cb5bbb9258c1f1b346bdd8')); - dbms_lob.append(buf, HEXTORAW('c8238184a330e8fb0548248ddaef777858afbf9aa3ea8cae09e7149640004995c51236ad6b4948f0be2c8954bbed6e0212167d22247ae0fbe6b652e1ded1859b937a9af21ffcbd213148ddad14e9934b0c36f099fe1ca12af26f1')); - dbms_lob.append(buf, HEXTORAW('81bf70571b211830f84638e38f8fd9c7244e04bc8e1313ebf4aaeb7675e306e6774551a1104aaf92d0fe440af932aeff5b2e83f46e613edb9804d759bb89f555df49cb8b8108697a8d9d1852d3794cfb6216c25edb1ed831903d3')); - dbms_lob.append(buf, HEXTORAW('bf4cbd4ea2bd45ba61824410481221b7dd20c923ec85eecfd63ed69da7a62a1fc1675527ad03c7c75044f0be5ec2e9f86c19065f6fe0b3036c4272ddfa6d7c0909b364809cb4aa9aae0a73c215c3f22691571ad61b4bb6a4c2210')); - dbms_lob.append(buf, HEXTORAW('98402048354a622b29c0907312e42a2e0f54323dfd32d2c9e2ffa4ce884244f048425134d5887b67feea748445f7b61e58d9b7ab9124892ef1770aea58c4f5d52af9e52279f7ee9891d5619fc8922e6a3d712630442224bebfa92')); - dbms_lob.append(buf, HEXTORAW('058513ce4282b6a708886d403cc796124e6f1276ff1e2c721b892189eed67fd004705e36faed85aa2899c42074961ca7413ae8f6e2e00f9018e238633c3740a72d74ce71f3e239306b0eafd3ac314548d34623ce883622b2e77a0')); - dbms_lob.append(buf, HEXTORAW('e68e5cf19c4f7670b483c8fad76aed1fd11c08003c21d57a867ca93fbb9018ec96c48ac92c168e7409518cc1898fb7f549d6958216268089e2c7e879138d0681ec7109d74f88517d47a5a774684ba1d7bac9fe0fb54a7ca67c4f6')); - dbms_lob.append(buf, HEXTORAW('7ef76cf1be31c6cae00b92d08325302ffe00159a648036e5af7d7bee5ca5d6a42eddb889dc59c996859964c201c9830908491a4438a4c421555401eb62b7491adbdbf0fc404282f1cadc5e2c91e8f75fbf70e58b6e2a9de22bb73')); - dbms_lob.append(buf, HEXTORAW('c3eda7dff64df4fdaf48426a4f5f48ec38e42bc4cda69064a02c292086c213e9b9e90acff3604c49294cdc6ef7ac0564f2b3fdb51db10b9abadbb355803383bd61153e0949418fc2a02efc1ef0889c11612c31c71f007480c719c')); - dbms_lob.append(buf, HEXTORAW('b1c0276d3e42b20a30bad79a5d77c6fe70b365ed3f71f6b4a08788df09d2060d63066cef7dbc5109ee6c8b88e7d3f3bac7c673d8f3d94fb8de24d689d6fe51afa56436a4de4222a4c0ca648cc149ce0f3cae3802108524c20b494')); - dbms_lob.append(buf, HEXTORAW('34a1c52127161db099d1a1cefaa6a1e721e720b07c5a98ccc78a4ead44fe8bcdfddcf4078f7436fe0b305839244028b93e812e277c22ce144fb7f7cffdbd39310a0c792ab3022b37712110ab26d947baf9312b12f0d7b10e1f8bb')); - dbms_lob.append(buf, HEXTORAW('b58801bc5f6c6f9f35024448a4d15d1394b5f5ff78db4d5fef24fb7e496c7a8dbb36afd71199154855e5231c9040c8d6e7b3e9d1391d16fda46d4fd940e236da11b79ed2b1c613bae3580bdbb846de40919b8ccd4215954c55e49')); - dbms_lob.append(buf, HEXTORAW('718c2069f5189f92406bf8a200c2cf401c3f837b1c4208da30112431c01b43de3669db6cf98461bdaf6cc0bc69df24ada61f5672875f0594774776d499e16069c1d3f23ca4f18007dc9e6226af7348937ce1faecbdcdc338f776d')); - dbms_lob.append(buf, HEXTORAW('1f396a4cd436d17bdb8c81f4ae8aa926036c4834cf3fa893e8f13e49428af6542ad416bf87c5ef7a5da716d4d81a2da11ca4328a79d9c983c2cb5044844a23c8966133a3e55d678ecf2d97f079f1fbdc4979bf918413bd7ec6676')); - dbms_lob.append(buf, HEXTORAW('3eace6860de93549e32b961b928cc452a2ab6bd05481c3ed5540430acf68e1631404a2444109940d2bcc5b9c78fb8fecda3c6e8fb9d39cee212d7bd599e13f4fd82dcb8f13d6b85eb763808019ca94428c8e6417d481e6cfb206f2')); - dbms_lob.append(buf, HEXTORAW('ccbfb1edb9f0672771110db0be3b35e1edef594d5ae88af272cfa628e4c11c2a93fb84f0bdef02732450871febd59e4a3dfc3660cb8bf3d19abc575b1e786f17b76003e07f8687c59c0d73e009fe31db7f73d742f5be033d7b1e4e')); - dbms_lob.append(buf, HEXTORAW('3887951621e0cecb2aac7ffae44ae1e2b02489c051608ab64141aae93dfc7e795b19b1b17a6d2e3a9b1b4f6ff32725deecd09b94654e6cc28b5c91831affeef6ebe476f25e61990f0a92ade263c5fc22b25c8b828090c1bcff5fc8')); - dbms_lob.append(buf, HEXTORAW('516855a1dff4dc2ef9e641d38def51c4be5e2fdeefef567fad9bef52cf6071b6b3df883d629f5cb6e2a7d71c3ad4a1566cd3e7035b218578a780f361207a9aec8bb0a84c497351707abcf38beb7b588012c81e03d581221c98b547')); - dbms_lob.append(buf, HEXTORAW('f7a5e1675fb25cd75ef2d7fa56cc4ac2671eb43ac074ee9131646757ce7d0d1a96fd69ba6d43137745977e0bb063f1bd36113a1d43c2c919024229c4868bd57df2b6b4fb9f1da3198767ffa8ad6cb5452375535a79ade507edb83b')); - dbms_lob.append(buf, HEXTORAW('95fda1ec80b260b7caf9f53a4e54b9c3f9eeb93244c9fbcbab2a04a902aae00e3afcf1b4672a83e7760c1910a91b6fee5cd4e3e567330077d7ef861248910c1a022fd1c0847c6e21fbcd705e940a568bbcb5b87d87f3efad5c53fb')); - dbms_lob.append(buf, HEXTORAW('cad09e18a7b7e6f7eaee678abdeaedcb2fc031533e6063b2598fe6ccef514bddea7e2a2f5f65ddcf393799d5c24fa76e2cba22ad94bacc1adaf518924611a1fe5f00a47fb3e6f3261bc6609354012cb4fa2e2ca162a34a9d293fb4')); - dbms_lob.append(buf, HEXTORAW('d792595d21fb6beb70ac659e6a885f3057bf38980be4a59a7830ed63180b4d36cf4817faf6f1140db00270c88f7f505306ac252f95e45ad684a9d00dbde36545ca68f73e2802bda95b6844a9b09c3235e9822e34072c4b8abadbaa')); - dbms_lob.append(buf, HEXTORAW('2b6bb084838713f7a207da886377c21da8db8ff385295136189c11b0712e40d15e055e213eddb8370f046164671bfedc17bf0cb0f7821fab369c30b1597cf5819a0daa0f7087007f6cd8b50e558abadabdd08d43322d70cb81eb98')); - dbms_lob.append(buf, HEXTORAW('178c1502435380e1fe7418485088ee0b477dc3f5cb4b0f739d4ac0ee2ba8852af8cbfe5b309a72b35acd5802da7a52b555cb065ca2837f99d3f80903690f9de8231f0a9b8687d9c1c6373f9201bb363ef132ffa3be3d49f6e4df3c')); - dbms_lob.append(buf, HEXTORAW('008f22ccc62f519212208def725e33b656a0874d715ef2f55be315b5fb667bce8177fb965161390002f3f8ed416ba7e261ce48e4bce1ad9de799307ee3fa505c6a9e0f77842527970f92b7fb409667c7cde867e679c68bf76ee3e8')); - dbms_lob.append(buf, HEXTORAW('7d6ef66f0fadcd3699f13e328dd780318c5e4b690dd44406464230f24a2ffdfc87aa5eeb32ad83d514a0cc9bca102bc4a7cc6f739220e84f8032931f88c974924862c1cfcd59418a4118c251f8a0311fef9810788e0401ad46e36a')); - dbms_lob.append(buf, HEXTORAW('8b3dec0675e705d8be3906d348544d77102e2772634b4a04842913601fa7ed575e30d0346bc787c7d3be07efdfba4efbfba7afd7aa51e5970d1c33dd728b574c86f115bbf715566d5668fce988c8d823108f46a1a1d934158071f3')); - dbms_lob.append(buf, HEXTORAW('48e8066253242663a6fb9b98a826c67091897c4eb205904b9f4eaf2d90e03bcaefc715684afb767bcd86f1567971d45190ef840146edf4c508860c80054922cc2b81f045b1ea8ffb81601b40de0f7264984243a4d982bc655348de')); - dbms_lob.append(buf, HEXTORAW('6b08b313ef4fd480209c7f7f91c1212657ab79abd6a2379a2641019d23e972a59a9c2adb62d64777b618983c2ed5bcdd5a6ba261bac38a805a58df9cd4b8e2e0c9cde835fc98d27269cd2c0c754455e7c81c64b9fc4609e4369c46')); - dbms_lob.append(buf, HEXTORAW('7e3e0f7abd01273ca4111ef2c81046c787980080e84f01dee648fb9ef78a50efd39fbdffb23a92245a2728e9c53bd90080d1bdb607cf3796b501a732b09140b91346489dc5f3d7f171c4f3cc7f66ac3db9efef8267dfe37fae0b6c')); - dbms_lob.append(buf, HEXTORAW('b5a2a55fa7bf1dc052d30032a8e3188cd4b62c6e014e764c61fe0c6cc0740b2c4dbb69ea3d343f3a2f3f3b5da58d78d700f3266fb559d89d781dc0ff2a08f88f7150c852f854e75256ac7eb7d18aa9d3a9e722c51524c9f719822c')); - dbms_lob.append(buf, HEXTORAW('3a91f14318ef92552c52da2fe99cd4efcb3741a70e72734d46aeb468e3b01818581aa582151a65d57f3813af096234d4248a8ac7dfb4e3a85a8807e60db535e5871ba6667b8dac74d02262506dfc2ce177efd82a34ba02ab20dbe0')); - dbms_lob.append(buf, HEXTORAW('0551179e9c45445369e6b0e7a7fc47bc4834f72b273e0d545f882536d78c61de856198b440f9a9731021f1d5076fcb8adffa64cabf38c52279f7269b8572f97605b1f51ae9cf4c70c247f714e79400405120a1312d2a1caf80882c')); - dbms_lob.append(buf, HEXTORAW('2586f89bfb32d46afb30e734e5ce91af7ee993be8fd136074256f11a94a936e9155713af6315d060f5eb850a917ac1b9ec81da8d42ab5b4d110378dbd6d948a8e7f9ee9bb19acdfc5bcb0d81be87beff3989090917f1b6ddf46992')); - dbms_lob.append(buf, HEXTORAW('3a34919f5735252e3d69b4cee392489aad36feb0be33a2f23e424b399057af379f0fb23dea96ff0a594a40ea0d418b8d39ff283084a6ff13bedd86cef752ce94504fca7371b30021836c09daf50b7d4171acc543146437c3f474a')); - dbms_lob.append(buf, HEXTORAW('94010c66ca8b2947a4a19e8db471b0338d545d4986ef6f63030968d101df84823481c911e9a00fe0907654554412c30eaa8a7c9c1db903e7b304b243124360f6e1ed35b60ae372edd7ea571d7f9d52ff6bffea03cf68cef8a0470f')); - dbms_lob.append(buf, HEXTORAW('cf6b028e9ab27846dda9555c364f4a8120090ad94e3e053c59c0bede3ebb11ea0335f79e470f6ab6af5217be7f47cfe177ea710da957f707bdeeeeebf161bd9b517889236689701141c102c74cb091d635de6e7c6bf51ab7a0d50b')); - dbms_lob.append(buf, HEXTORAW('f7fff7b867f7516ae9a6f96fbef6a38a9b67b13e22fcbd79c55410611211f17c1052c11d3c5fb6e8c62b51996e12459f842ab3eda2c053e0fa0d625c826c39d54da1932cfbabe46cb1ce422f871e6302922de6c5d9f6ef3edb1941')); - dbms_lob.append(buf, HEXTORAW('6a1101ffa18d096902c923da22ee9e09fdbbd1ccb8ef279c26b61150eb6530573a875be64ebf8a55120a12f9717df5250ed9f63001719b73a953e9be685255114b20011cddf6aa8af285c4b09daa221f6737872b12423591444510')); - dbms_lob.append(buf, HEXTORAW('b4c18372256dafb135c0ebacf63df51ffdb7beb27b9f3b8b3ffe48a9cbb21f6c71b616756b1e53a77e2d14a2e1b4d0e06098a0484905f50758159600b66f77dcc9356b2875eff20f5ebefa3da55aed97654daead176dba75f9a97')); - dbms_lob.append(buf, HEXTORAW('11c7acd2db5ef7b7ab1be6ef0fb331faa54aae18cfdbea959d38b8f0809736c58091cb8462922ca947a7551af05795d959a3b64d2b8c7f473aa52aace8f56aa93eb23ce599403dc44723c964c3ef63e97ad7163e2c63551dd10ed')); - dbms_lob.append(buf, HEXTORAW('c7387a8c56304843b0fe8224deed8d200f60841c29010bdb6102db9097b3c5f7495f5cb369a35f94b74504b4bd50da92feb1368eeab648403f6c803bd3d67ba1371ab905d9e8fbd9de73414a24b1ef89fe183e1fdfe1e74855f1d8')); - dbms_lob.append(buf, HEXTORAW('c4cfafb6c4110efac39e222011c0b07ecd9e8ea974964c55149c1bcaf4b7575574a19018765255a425101bf88424c5e3b13de35662dc3eaf336527999788c0e7796ea0d719f085ee4c9dbeef254a65947578b6df14a56e5df1dacf')); - dbms_lob.append(buf, HEXTORAW('a38e55eafa179ebdedba6b953af3b46b1ecdbac9f58cb2eea6e46c3ec2d2d1c03452856989e5daf14fe71e32541382e68316dcb5454b1a23efdc34e33ffade4b6a5ef6eac5faa20daa5f8b0509086077f5b0f58952b57eabbbf80e')); - dbms_lob.append(buf, HEXTORAW('7ddfcddfbefcea174728755adb2b27646418fc6ca379247e06e38cb838f029f2d9cdbd34a8a1fdf897472bf5c519fdcfeea1f194d85b87ccbd286e5e4e5227d0d1cab98a449c027b191101210e1bf771b3f56f673a515f3287e27af')); - dbms_lob.append(buf, HEXTORAW('c9c22492059f1fd9d8e20af3e23d43b1e9fe3b70d79c78bfd5763609d06075ea554dd760d66d7385d256e610145dbfee47cff9f34db0097910e2d0aed9f9119f7fd64260c29a106e5505bed4ce5cc0ab6f739b46f7c0405cd2791c8')); - dbms_lob.append(buf, HEXTORAW('160e7a913de4c6ebb1faf757d1c2ab811c17896c1439bebd5959835445f94262d85955d11caec54ec64cafc4106cfc4a7c80ec2eafb3800324f476ea0cf78068b2aae5570f684ebce331a7b51e3d5a13821b3e5835f559a5ee5e3')); - dbms_lob.append(buf, HEXTORAW('6e8fccf6ed5b0c17b470dba5aa97bf61f74e23b9ab0dcf7ebe0d3bfd39cff83ed3f2e9bff9a52cd4765f69bac39ffb4f76bcdecfba3722bdc8d3a68d0361803e27845e478ea88b4ab8ee9a4d489adce3bf5eb12a5aee9f2e481dd')); - dbms_lob.append(buf, HEXTORAW('ce3133215332d00620632d491214c0e6d69b987cf857372f6aa5d433b3af29baee0fa556b658f2e77b99ee1f9de3495545d961298b2ca71327027201be84e3851ecef27de7e1e8fa664982be8b773d680964db043fc03dd3a7ea7')); - dbms_lob.append(buf, HEXTORAW('498714119017a5eb519212f3ec9d9a26fdd6fddefaa140fc9fbf78083969a2b2cbcb7cf3946e8d4abad1a49f6f7bdbcf95284c44906976ebc7fc97eafebff3e2b54b3bd5b2297be5f6c1fd3f7ab9e44a9544c0209b0552675970e')); - dbms_lob.append(buf, HEXTORAW('57efbd626d4fc581c435bde04d8a3a108ad8c16cfabe485b8ea0c5f5d9c2c8e888eb6291ca38b8189f377790c3d7399e71385e4ec09191cf8c4f65019f39a81d7140cae7c4c647e3cef6cc837c8fd8f8685eb23df320df37763f5d')); - dbms_lob.append(buf, HEXTORAW('d75ecc73e2f71011efd68a508d7df7d587f680b48b5c63775a56fa88b326ebfe55e9ff3bff7c7d88df90727027d7bdf302ebf3e697c573de81efebf97e32125b7e37f580fa639fe7953af084762fbd3c4bbff67f3fbb6a66032de9')); - dbms_lob.append(buf, HEXTORAW('9cf6e484eea8494eb61ab2b900334b1454b8c84d5a57d466d34d1b8729f562ee0d573fdb4da987ac6ef54f82cda308b5cd8ba8521edc56b9a4aa2028e46de4310e77b5bae27d6ceffb7823c8b504e29d7fff3acc16df29db834f46')); - dbms_lob.append(buf, HEXTORAW('906751b2d1c075b06dfc0e7bf978f0cbef71f0811dcf391139add8cd1be706a707c7c1c801aa32608d088c99a15da07bdfbb9acf6d3da254eb9e1defbeb6b5fb9b13553925fb7ef29c60233b9d5b4d9cf4406f2a40291132c15789')); - dbms_lob.append(buf, HEXTORAW('ff9ebcfd05361035ce69eb524827a6ca21ce9f16b2a1bc417eee7eddad97f30aca0d4491e3dd252716a022607c01920479c17417712001a266a031940eced94974e422302d59c47b9c7bb113302f633ce30ed4b5621cb37d1c347d')); - dbms_lob.append(buf, HEXTORAW('37db332f7ea78488c067ee1be2fdbe41f36ccdb71ad4d647f4019ddbad7afc27a5eeba3d6fcad36729d5eaccac99f5a71bcc64c4a7c871527171ae262af0739fc6fbb17330153ae21adca40213751c2a6103e08038e20169e5b97d1')); - dbms_lob.append(buf, HEXTORAW('021bf6a3540e519a0e2daee08f25841a96daedf40c95a79f153c4bb23545c8d6f6a7e44e76f95aaf57dbde135a0caf4c5179ce2ed4b2f3c3ea8a4ce3dacfe99cd060c7b61bc113bb54eda9453b5c4ee24dbc722c9a54fc5458ceb3')); - dbms_lob.append(buf, HEXTORAW('dce8d5638603cf2f7a0ebb6bbfd1546f42aa18292221b2d6c7fa9583351a4e2aaee4654c2ab2be64ee93d30a58a20b9178ce1f08778e340020f4cbff192c66dde83031203545cbce1c5c11fe4069ae535ee27cb6aec4b99210b60')); - dbms_lob.append(buf, HEXTORAW('6579239f39995fb08d27e14267154d775f4a19c918780f4210c0baf51b2c3bbbae52570ee85336b4835267bf7263e611879b1b3820d2dcc111d09c0d952ae751b658cae1244aa99271be7230f0887a296c047567e05bab962b89c4')); - dbms_lob.append(buf, HEXTORAW('0efa00e3f81ca45a0950716d7704b92d9c2e02d6af13e4841140f0e5ba0ae5a60edfe75cfdca0b2e69dd190499250d221c7dbd9024134eda8769f37903fd536d24612f8c271c3ddbbf38a25d3bfddf2d42758ee8a5e2bcacbc1a06')); - dbms_lob.append(buf, HEXTORAW('35461acb03545c247fbf1b53614942e2cb00b1cbe6fdaf9040945ae9fe938093357de985b59da562b72131187c31774a1bcfdde6c11f687b20afaeeee2e097de50e2e08f335e7a0fc8d9d0698b0513ac230fe0745962f0e65e4a56')); - dbms_lob.append(buf, HEXTORAW('91cee7c61cf112eeb848ea88171fcf4bf5188318beacf87ed21af28231487d2fed8f03ae54ea983bba341d74b05257f47b78fca9a79a275160241d681caf40c6774a6a4715f5446956999a8303e412a4e4b086a82b3ce30c8bef4f')); - dbms_lob.append(buf, HEXTORAW('df4f38353852b21611c881363f9a87dec2e92228075790e41e90be3d88a1387068d6e0b310e94c39957c258101397e8824122228749062a47cd0daea1fd582926fba04a4f165fbdf75bf6b7b8b387dddf9915e57beefe767a4bceb')); - dbms_lob.append(buf, HEXTORAW('8af6f1db9a8450135e58bbaffd151288e3ec1bfd8fd886b0a3bffb7243f90e603a686c73dd76aa8ac86ba5faaaa230f0790f7e123163f86ce00b039ff7e00f2e8065c78f5b73f8e80b955cb650150573ba112f3e6feea504f31211')); - dbms_lob.append(buf, HEXTORAW('f80421f78e3b4112cade09e7253901b4812fd93cd3c6f1be87e4d08f57f7a78e57aa75f38ecdfa7552eaeaa18f7ffe1fa8b652e96003a74c1b99664012145f52c08f701dae270984655b9ac9eabc77b292bb3102ea9dd720e3b82')); - dbms_lob.append(buf, HEXTORAW('df0f9253d2ffe18e392f83bd9dca77de961286a75a8bb7f3bcdfa753af8ac3fff8579a1b81de9ce4dbf73a0a89438e860b3f1fb6e3fe8f6500b03da0610a174dffb16eb95473aacd673f25dca63e7bf14cf0026f97e52a20c92fce')); - dbms_lob.append(buf, HEXTORAW('f756aec799560caee41eb8b802491577322471c78ca2ab7187ce8e894eb8f3a2a3ac9615c6c9659d8f4ad81aa28da6f6a38737d5d66b45f88ebc3e67a8bfa19c644a7afcb00be3ce0cb31f880bf03e1b3fa015f06f0e5015f0ef04')); - dbms_lob.append(buf, HEXTORAW('5802f07f86ce0eb017c3d81af27f045802f07f86ce0eb61f0619cb6790ffd7e346ef31e882b519dcc7bc7e605ef4df39287f7c8e17930cf198bf7c8c07bcc51b9069f35c58b8fdf2303f8f2808fc61d013e9a071bf82e02be3c31')); - dbms_lob.append(buf, HEXTORAW('2f11e0cb013e1bf87a78c63d16ef8179d0f83281cfc6bcf4f0cc4b18f394877e8e581f63715f06de639c15496dae5403d5f4a253b424724c9b335a1e788052cbd6cf9f3371a2521b37acd958f646f40e9f5755d581808b0089b0a0')); - dbms_lob.append(buf, HEXTORAW('067cd59706aa3c40f3c6d1755ef7a0861fb86ecd6d271cb3efbdf746dfdb4af8de5966bde8af81f520d657a1585fb1f7eb81ebcc3c58c06f03df409a67e0abeefa95dfc906fe42c69f07fc9e75d1ecb1569fb53d4da95f52239f7')); - dbms_lob.append(buf, HEXTORAW('d3d4fcfd18f15fdcb903287eb7e1041fe7fec7d77605455d6f87d93425540042c28a189065054c4b5918958f613bb045d154d5c5c0bbbbaea5ad6c68bbaeaeaea2a2aabd8829505549a28b6bc8080080a0a845e8288945002a467')); - dbms_lob.append(buf, HEXTORAW('32bffbe69e73dedcf3e6e64d4050bfdf77ffc8cd9d7973deb9f5f4735175a864348f005fab8f23d561a8d78adf66295055e80da84b54ed3230e76ecb7be1993e723c3787b6f61c183b2fd4d316db777cfe2cd8c7b80f6d687786f')); - dbms_lob.append(buf, HEXTORAW('9136afdeff8dbe62317970bf1ed639f7df15d1bf505bf0992bc14ab544d715018ff84296bc059c4372f0eeff02f2181dc141d19fba790a98ab298aac8f37377d4733e4e595715906ac7a02a1a047ef84c5514ec4e6950150d82f6de')); - dbms_lob.append(buf, HEXTORAW('aa8ad0c633489718a261c66927ebc6cc6d48c973a20c9ec186e48d3383a7ab128d1203aa4e32992a918bf2ceded9905a766c7dc405170a71ed930f6f1adf4b880b3bdd7ce771db558f30309238659eaa4561e41547242e71cf45fd')); - dbms_lob.append(buf, HEXTORAW('2a23bddf5e6a9ec4ebcb6783e2b60c068f3851834a2350d5c9e6c946fc0d363380df24bfd9135dd70b7151cead17e7a8882ee31ddc741737aab2186349e31c861adbbfb5e2a88abbcdbafdbea3dfab3767c9110e3d9bb2f4d26745')); - dbms_lob.append(buf, HEXTORAW('431a06d5e6b642de3648fee2b53815d67e2bbf800472dca6018b410299091248624e761e719c4a62f0382613a7acda7e8e2b36ad526250ed9ed036490c45206023a7ec001e16937c4683c4d0d30278d02e619c32b63d7836c0d3fb')); - dbms_lob.append(buf, HEXTORAW('313a5062c806780ec053bfb7e9f738ead88f61008f8f8ba3c1f3c6355fc3bb484fb5469c743f92f4f2138e4bb0c4a0de5b0cdff72389908fb30df0b2019e8e77913e0e12de48803710e0c5be0fb508ddd9ea62210efba86b8f4b24')); - dbms_lob.append(buf, HEXTORAW('679679e5296595770931f7fb8f972f9ca43a0882882791a08aeb55f87cb3fe3d969804d2abcdad693f4a0964665f9040988457049c66969a5f39bbbd00efb0d66f2e591741db2459dbe2bc587334c033ac37b93e70bd227c05af00')); - dbms_lob.append(buf, HEXTORAW('d65b364980198047676887e1779da1bb1abe2d67b769d3ab54888af3777570e4139be7942cdbfe817a30b24ad5751da106db52fd35aa26d604254138fa7e73467547553c49618a9440869ef9cf9423d708d1b6eed0cfa62e96df75b')); - dbms_lob.append(buf, HEXTORAW('386b839ea1248946a7c69fe98a4ee804408eb5fce961aa5ceba4459f68fcde58be57bbeddf4d982ffdd12c80b9003354862c01bff7cc9e07e5e89419892cb9923de7589617192eec63c4d370ff4da575e677b2b3170afb3e00b9e1')); - dbms_lob.append(buf, HEXTORAW('a9618b80d29c8f81c0ef03a1334bf0da794b95754baf1236d9f397c4b6eaefa653acb05c6d3de87e03e15ce10696e9ac78add6e1d0dca863b8e05c61a8cd846af35be4f4c81b64101abdeb86af0d10695acdb79b463746c441e34c')); - dbms_lob.append(buf, HEXTORAW('d3f3e60fe01dfa807f815aa3cb719dd3783840258145f565847fcba8ba32adf55c8727d9c71fba00b9b49d27ec888ce156336ca0fcf1135ed068b04de71060d03cfa1166612a59df87cabdf54ff61a4ee67ef6940f925bcb0268b0')); - dbms_lob.append(buf, HEXTORAW('bdda51a3547c6dab1b6ef46427e00b383df6c5c56ef4137ca9f4b554491e83f93aa88671ff63676e2033359af336f01da6c5c1c1d5e925e6741aa4454a1e181e71da81c5e725e6704cfa0eaf16ee84b8e31c88eb64542d0e45c556')); - dbms_lob.append(buf, HEXTORAW('3d2404cd942aa18c8fde54b6b1f7fe09d2e5e8ad5a6f9f218988619224f6554a8f79bef139a271d9e699ff855b4dafa8a32c2170dc8c1157daefe30d7fdf99b73a7f57f44128c39cba6ac5bf50a8c539ca641ab71fcd0cd9aabb2b')); - dbms_lob.append(buf, HEXTORAW('0c6e71847ff8babb6c2503baaf2a54587feb884f28c8acbce7fb6b5fcecbfd6cebe7db5759c2c83c5d78703ed2cf85661c1ceb7daef6ab250c2082a688bdafbb2af088863fe2ada29dacffdde7777b32f3216efb8c68399080c5fd')); - dbms_lob.append(buf, HEXTORAW('8c8c13178f01c6e8ca840375e741fd5e179ef55cf7bf8c1ef710275f81e3cc22f0ccf6569cf65b17e107ecc26e0f5177fc7decb36b8cdee4a47424691ca8c73e411c71e7e0a6f9bf00b03bc2c8007e34cf8f171d1da1e7ef49e2ce')); - dbms_lob.append(buf, HEXTORAW('df7997ab2cc04f3c6c68f71d4a6c8ec2c46c8bd718e3d5fff7c7d6bdcf8787f42f339aa6efab8aa314b715a1f55935b300b94730fbc68b598c4f0e7f3a5f0cc6177e767b1798efad661d4303e0a3e839760ddf0f1373da7e065b17')); - dbms_lob.append(buf, HEXTORAW('5c0c6bffcf4b2a7961f2ac4eb4fdebbf2baae42ccbafc8377173eafc681526730c21062f12029a648769450f8ef385c4e581ca86df1f394b00e8f13b810c75ff6eb8cf0a0b79a4b89e3efe2ed889b2a2774704a6bf79a01fff9a38')); - dbms_lob.append(buf, HEXTORAW('fafff1c309e177adb3f9f317835732ab7b8297c12159221b138f0f95e1392fd4440349de726a134cadc48c7384d311639e8004e36c9c03684279fc3802e5b3da54b2222d9c036c8ae6a74a7f4738e85002f6c80a71bf793cf6564c')); - dbms_lob.append(buf, HEXTORAW('7e38dfda0649426151771f48ca331b98112bc00d586cf4fdd2051993868c1545026bf777f64b69d181e53d5f58f7e8e0702651d86fb527ce9ecaf50351d704ce5122320a1fa2bdd83cdb88e094f76a1145f0f5cf5668a8f42c921f8')); - dbms_lob.append(buf, HEXTORAW('022dd5662acf2857ed390c5fb67e2b9bedea59922bc4fbdf3d5dfa640b2176ff6dfb6d9590fa852ee462358e041622089c60e0418c07f30cfd797e256b8813143e1fecc027c212509bd29d936451c46a89d71f86dd3bbe5d7b29801')); - dbms_lob.append(buf, HEXTORAW('e7269e64715f2b35353875df19248a4a2c47da69f0f81b9cf683e615e988681a940eb1ea919822978b050f24f07da9c6084d9f38d2628298dfd4172c53701e8d6261742a761bd0fdae2a613ff7d8b2fb333e43363acbbdadc16fb3a')); - dbms_lob.append(buf, HEXTORAW('1cfb0d1a150792fbae72e7252323b8777aeebbea7932fa817109dcdbc85d6e20180d6d6bbc7a0e36201a154b7437586193fbaf03f0b2019e0df00603bc20774a1be0e5c1736180d719fa1706789d35f816738365c6359f71941b5b')); - dbms_lob.append(buf, HEXTORAW('4b2c2070308ea399511cdf93ac1b730918a96dd113e015b07171005e36c0b3015e5e3cde16b963f371a179cbd3c6a5841b190d4e0925caa82ce1f5d2c6058e058417e91a79a542cedc8c35ef954dc25425afe975e40855d7bd0335')); - dbms_lob.append(buf, HEXTORAW('b8a7d6032b4189b373a514734deb12d766d27d52dfbbeebe1b301571eb18ddad6dd66f72d7c5f953c65263bf8b58bffd4e0d6a9cb9bb2eed13b6de4ceee1b96a1e6be657fcfda7a38498b4f5f9618fbe2bc4b697366c2f5b00e301')); - dbms_lob.append(buf, HEXTORAW('6eba649cc51a23fc0ff7be1f5635f2fec90709d1fbd3334eaeea20c4f799cee38b5d9bc0eafad7d13c4fa94f500586e705aabcf2588d073dfc1e56b02f69a0ec3b0c4992751ec30309c6000faf5bda8ebc3f5bc26d37e5c8e87bf')); - dbms_lob.append(buf, HEXTORAW('3e4678bad938f9b20bcf92b817d9141fb42b54b02dce44df35744e1081909e18313cd0f672ceb375de2bd7cd1bc37d78e56f852668515aaae394cd564446781b3e8c64e2cb3037598b5a9ec2f0282290de4902c1f33a7748be4642')); - dbms_lob.append(buf, HEXTORAW('a0acad2c66d11a2c3f0ce151def93dcde92b4944cf728a6380188d3002f1ddf81c90e86b88da90696792b91d74f31c17b12e0213fe3c05f3c301d06cf0678f900cf0678f900cf61f06c80a7be37c7afa836d804242169afe01141e')); - dbms_lob.append(buf, HEXTORAW('4077f118367033cede017e02f6ee52bafaeb803d8d6c6050f7eee15e6793fd9006f18c0e3e3e2307836c0cbd7decbe357301e269fe62d3fe1b878de68450c9e0df0149eb83ef28931e0e31c7b3ed2ad6e4d453b21befce2bd6d932')); - dbms_lob.append(buf, HEXTORAW('0db2ee6baaa03af2bcaa1f523b47f82e73022fd7555bb5bba456aab9b52df12a25bffbeb35d0212371e19301e05b1b689c099bcd738431486f9c47ef7032f2c07bcb0282e08c6b5c8b04f02e269eaeeabb24b25eb31f5ea510f3f3')); - dbms_lob.append(buf, HEXTORAW('65b884dcfae99b5f529180ff0aa425d3b72bc985b8cee673955882127e7d75ee31ad9971cb87ad09d52dabbbad9a503cf17a26fd6ef6b4fbf4a88c3da769b307fbe104be7cca9d8f19dfa5dca0faa2655d13aa851758804c78aef5')); - dbms_lob.append(buf, HEXTORAW('91ca180ef434868b2d9f3863ad405ea7cf6de87253dbde2e137bac8f79f939277d78bff91fd58d23ced1f43e56f1f11e7b51921fcf3970b84c45b9f0a1b1bf629329ab49f818c9ae62f0cf08a0c8c6c9e82b764e857d33f3c498875')); - dbms_lob.append(buf, HEXTORAW('2f16cfdc04d71010e1c0543d10af43046425d490890119a868277813be11cb5ad6dee704046b9cf8380abfad6e4365e4152116bd5bb4e63349013ba6f578f50749e99ba51ed8379673e74831dc5531c8815207a0ffc0cc88b533920')); - dbms_lob.append(buf, HEXTORAW('c6cebc72486fc464a0c3cb0ad1fb93be600bc0a782e0cf0d4f7268941308961a092182cb33bb00df032005e01c03311c091d0ee09e352c0c6458d53b6cf8d392f1e6f2e311839253a000338e7464a0c46b7584e004b48c244c62003')); - dbms_lob.append(buf, HEXTORAW('e015c48f4bfd1b75a754b477737abe3f61ca1dea094e382867166cb8da09aaa61b0b7183c937b658d2bacc35ba776f79e2532081581a5e660267436f159ede3a56ed12365fbcdfc9ba41fb25eb0c353e89d7c3b496aff61d7eade46')); - dbms_lob.append(buf, HEXTORAW('8c72e1dba2913fa8fe3006ea17820d52c871a08894b582e3ff09ef517b712a2ed791d6f18fe9a50eb23cf5b07d68ad031ee3502ad1e6e3ffe1a591f7fe759d38f900758c6885ec76d7f46f26375b3a66c512b43a4c0418ea95342d7')); - dbms_lob.append(buf, HEXTORAW('a9da4730f0c007c98552a7e4b1ef99ea8c54644840fe28c4b5473f34abfb39429c75d1906bfeb64b8803d71c5cf3ea03ee6f42a5bdfe22d439d459c4cf5f2e8c2f8e37b499c4172c49279e3f848f8484ef336034e6fccf944e2e43b')); - dbms_lob.append(buf, HEXTORAW('e75e38617cbe0de1e4e38709eaa0e5135057c82c44d044433028806023bf7310181ae7b0404269e7499c069b89cc7f20d739f59293770fdfbf56d3e937587c99deec85a289fc90c2d6bd55d98233739a7ec570da889f44b0cb1b691')); - dbms_lob.append(buf, HEXTORAW('2308f2cb2f8603b098543b7ba72af222c79f04781900af00e0f103533ff8b9aaa858b400780e608307910dcfe5417f55bf8222de6d5225c201c83825bfc460c3731900af00e0357ca0369631f038bca41883c89975b67b53e197cef')); - dbms_lob.append(buf, HEXTORAW('b4fb9174fb985240eccc68b2a99eed0060212014283a2bedbd316a9addbbb2aac6ec3fafe8b492080178c27321886086f5fbc8ba742b5e16d305f3a4344fb229badafa224256b580f5b42eb4639c38598fdf5843ed3e15c40d51d1d')); - dbms_lob.append(buf, HEXTORAW('4090bdb81a0ea6ea6aa85f12e2e26db7560de82ac4a11f743be65177dc72459ebbbf7d2a185c076bc4d5ae9b6f4a76da9bc7dd2a0feadd6dbb5c2d259c7ef5e7bd78d1d342f46edbffde1692f5397848c721650749823664e95bbb1')); - dbms_lob.append(buf, HEXTORAW('7c9b1ffb0ae06770411162410261bcbc350cff0ea36fd0fc948bb5e883ffdf95f136ee821c419a70c3ae4e9de421cd0e5a0198f7493bf3d2fe5a053e4816bd55b9fc5bcf24c8c1b8e37ce5fae3ae502254aae6237cd5f18e099f659')); - dbms_lob.append(buf, HEXTORAW('811573079abaf5e5766fca7ed66dab995af312cc17645e20427fa5375f6e410984c781f80888b1a4063db067058d374847c8bc081349815a80701db84fd63d2ec4c29e855bd63e22ff4fab5e7de345429c78cbfffcfb3f374b54c36')); - dbms_lob.append(buf, HEXTORAW('9b7755a2b1fcab262a61ecb89c606381ab662d0adc2289025f4c6828d8346e46cd08c0e57ee9e388d51f0c64211118d8c56218a8cf07b7c8f0defcd061b03a4d5465d24fdbec842235736c0031315e15dc8e0d9d00f484a6e156abf')); - dbms_lob.append(buf, HEXTORAW('2f62ed420b47355feb07e201fdf5c685f0c987fe67c17b553fc17887042a6e1cf03d2a30d1f18d8b03fd0803bce1000f091ec7bb90c11b1e302e850c9ede8f4281cbdd06787c9c71ded4383d21d4f1375c900a2474178c5039d4f0b')); - dbms_lob.append(buf, HEXTORAW('9053733c256f574ecc089c7cc9c078a7b636f769465242ac4990a4fc40bc6d386f9403c102f87b57deb187e57c4da8bf93804f43b1bbdef00ab7cd5ded175cb3fe75f28c407539f3ea26084faae0e541cb5a8aa02425b0381974848')); - dbms_lob.append(buf, HEXTORAW('dcefcfeb79c359a7dc26c46129475dfff86cd7901e1d1efa87d7ff288e9d791d68f88624577bd44f42b41407d9ae4dbee767a7e5bb75e6a053d7efde2d71eb5b7b6ca1fca0aeaca6f9e276f20c59587fc94e8997b5c8aaaa7d57d64')); - dbms_lob.append(buf, HEXTORAW('32dabee3e09efa1e8837592e4a6ffa5c9991d24614ff973da693d6e90f5a6d49d3d24c108cd0a1dd0fd18e1badb96346b26dc837e934be2093fc457e86ddff8f2f9f3cf271272fd3cf0ef6713fc22369fb82f62edc89c9a6bddfe57')); - dbms_lob.append(buf, HEXTORAW('aedcfde75a60d0a3e0e480eb36fa37d6fe2bb43f869a393d245ff691048245526955f008038ae25369a1ce136d2572884aeb7f78a75c1e31eb2a8abb7c2c3986c31fed71e3c152226932b6594a8fdf8b384e99eb10939318485564d')); - dbms_lob.append(buf, HEXTORAW('6ad6700bc028097586228a648f4bd53153189218ef3b6015e1ef4370cf0748981ab8a8a81e3251b922107974962e0c6ba71ba7343032a98c4124309937cc6412eb1814c62301a17717e133b51c4d990745522cbc155ff565d9e2b81')); - dbms_lob.append(buf, HEXTORAW('cc5cfdc15353c00d1575fb5c678c9c760dd84250e4c7c86997536b3eb9759dcba1766b75e2a7779f1c9b1fd54fcf76941bc38324109454b9c417b08eb96acfcb999603bfb31aeab7cf763643a4d5cbfe7c3cfa95822786c5bcabf2c')); - dbms_lob.append(buf, HEXTORAW('ae1a0a9bd978d470d1b0ff9f980b4210f1cbb5588ae6f1cffd4888972efe6583bd2ddf4f716c79faf5f2e39027e41e371b035d55569a74453eb7b9c2b44da9f9a5c79bae49c9bbcdaecd9014325a158d874f039f2fbf4922639bf9')); - dbms_lob.append(buf, HEXTORAW('7e743bad5ec23377b70cacd6977f5970764cae294ea580e2a61e576f89dac57593531afbbeca0fdd6487c730d1225d700706711d3fc99ce1fc0b7eaa7f287d7cbf539ab7462d927304f2441a3e481f386f3f8a2aa2977d91055630')); - dbms_lob.append(buf, HEXTORAW('4bacf886e2cfb8a80ac5515a9b26c6823e118ad7f4f4a9a7cfdfb90e4f1ab36956f7693b22d1935f3f5996f4bd1f395439b96c8e70eac3e78ecc99273b4aaad9bd36f10f1c6db8c58cd554559b0a047e241a35445356d2b4ffee91')); - dbms_lob.append(buf, HEXTORAW('d49b0eef961b8237fb9fa9905674e96846ae9a1b3cf99f88c105f1ff261fa98a385587ef5dcb61f4a4e6c7d9f65d33e7b45e2e594b7582c0f12eb71eb8f3b66bab103cd0f73addfd62da1264d8f168d5715f5635e6726a35ab2aaa')); - dbms_lob.append(buf, HEXTORAW('27e70702569434ad6eb2c89247036c053fd26db4623bdcef801d2581b9281318814d6f58f1190fc0f9e9e324541226f95aba08ebb80ca2d3590dd170908dd0f2209488b6b5b2d88119009273eea1210d9ffb580871a8f121adfdcd')); - dbms_lob.append(buf, HEXTORAW('8e7dca9c15b27b96c3c54bfbc75acdac1c93213f65b62a39e07d56ded9b95176dfe5a8ec32def5d3fb9addebf6a50752001a9fe03b45f16e2b49b2edddcbd9b10c71c715ac10b27b97687d0e466634522860bda7870e2fae5b601a')); - dbms_lob.append(buf, HEXTORAW('3513fe178908a9933145c65c4192b4184541b0f09cf82b60e2f797c8be039d5c6649444b8a11dc40099e6af08090bacf702d82780eff6d19bbe58f06f21be7974da9a3990fc13558eb47e519204d51519d1210094bc1021a928b9f')); - dbms_lob.append(buf, HEXTORAW('3ae1501c50a7a60ef0a2720ae4ef2d049dd9e7275c63f5db8f20efc1ed36ea742923bf4c76f0a2a84a6bf57350678b911c35d671ebff348d9f17e951754e43bf2bbb79a171cebe6e2416fa87ca6032e56edead6950f9648d2f16dc')); - dbms_lob.append(buf, HEXTORAW('7699151db25617a7556edea6bd59338704889c9eb060f0cf073a7f4de70c5aa582c712c6a999b76b810fd870fbe2cdb8e39059c71c92512d7754d4b0e7727cabcb01596c51243b778d97dd5f79c2385b134e68612646445783d019')); - dbms_lob.append(buf, HEXTORAW('e03dfea07bf6de294e8a056ef1d076f1eccbcce689c698326c6db070fae041e6c2d318c0b872734bcb98e7f1ce4fef2e08944e3529b555dbe658b104f9c73cd7537dca0bea850245b94dfa9d73b77aada559db80575fe683371ef0')); - dbms_lob.append(buf, HEXTORAW('769f7c591954d9a0871eeeaebe76dbbc51d4fc4970869be1a2772ab1e0c6d07f054e36d1be6c764cbc8268239527b9f693db0f9af1f5a5f512d39f182b4bfbf7b8364782227d42eae8683a51c547ad5703570e5c7429cb0f89c8f0f')); - dbms_lob.append(buf, HEXTORAW('9784e5a453cfbbe5c543e45ebe32a557ab0566f871f8e743db56fd84b6373ed9da78240f8faf2b9b8d8f93e478e07a56f0f269dd2687af7ffef2017ed03e407c75f81c5ff44e34ec8b65cbe7defc9a3c07c76e7e62cb44309ed37a')); - dbms_lob.append(buf, HEXTORAW('0695eceebe7a7b273c873772220345f7e08057229edb2491f8cabe0a243415478e53f59005af5d23c49513f2ffe348c4ce7deffa9bdca4636e419b08a681c68ee1c6ad3c19ea7e42ac3a6dfe81ab25c57cf7ac870ef9e30f427cfe')); - dbms_lob.append(buf, HEXTORAW('c6e897cf6f2107e5a25d59731e1714a9593ba0eae61fa588376dcaab6fe47e28c4dbd38657dd3243118e458a57f50df46e10e5778197ce4ed0fd9695410d46d532d025ee3847be376b774169a9109f38af5df05e6f215efbf4eed6d')); - dbms_lob.append(buf, HEXTORAW('7ac16e2a32f5e5efa876512e7c9bbc4f76e364e87451a0fa7486f88a43646d44380178b78775804ab17990d014b0111f53c72d910f14e11f78608e74644bc033c91a3c17344e27ef823bcb57ec4e1a7f7c3d123ea699ccf326f0753')); - dbms_lob.append(buf, HEXTORAW('6930c0ea52a84d11de384e98dbcdf6451c67b1dfb179308cc720ca80108def676044337c1eba2a34a78964d0aedcf9e07b0fc9a32863fdb119ed8ba1bf92816af141eb9753ff21c415afdf7ffc1db74bc23162e08bef6e9407d721d')); - dbms_lob.append(buf, HEXTORAW('63897703436a23ec1ddfce184e3c13354f0f1308f0fc2cf6ad4789823f693c397cf5fe0bef2e1dbe0fc61060513fedfcf99de767eabd8933e8697ae62fe82d5c800e34e08439bd94278db5ff6b50d04240c324a4ae1ab775df83237')); - dbms_lob.append(buf, HEXTORAW('adb1b52254f1fb3942342f6eb5e41ad9d1eeaf9c74847bd02f7965e69aa510928f5e1314405402801d55e100442501da192ddd5e2e37c0e267bf3ce5d34f2567b8f188b93f49ce70e6f071bd5e949cd5c6c7563fbf0d44710c84aaf')); - dbms_lob.append(buf, HEXTORAW('b93aab97b62f52950a397097a9f804848ba6008acaa7d06da40506ad17be57e49649ede3c7ed77342140f9879c8a7a70971d4fc7ef77791fd485fdde4c14e19223ea02e7176559f3714798f65c0a814c4fe722f1b54998c06afaec6')); - dbms_lob.append(buf, HEXTORAW('deffc16d0f39ca46634d35a8b84a1a0e7cf4b929e6800e7f2aa89cb88a2bc08dd9a74acb010e8fe0311517a892226fd43d5d2e198559df4da89ad24e3dc9afb2a5f8865ba18d596613a9b09ab6badf5561753de784ee3115164a66e')); - dbms_lob.append(buf, HEXTORAW('4dd47b622e51cd1ce375f05d04f9df3cc609c32f7ba9b0af04c2a2eb32d4a839f7a69fa55ade4baedf2d5710f9df3b614588f3ee37727ee12a24ffd590f5fdf4d4ad607b43cb6f7fb225ea7aff035ab3c1d6861bb00dab91afe45c6')); - dbms_lob.append(buf, HEXTORAW('f5dbf07894c029e0ad2b1bc627a3a1f1f0e1ebc1c7534587b7a7f88e067826155792f87a92148e23ec0b5071452aeb6eda7da21013fb3cfff8dbaed7dbf3d1f76bd1eb0acf27e63587b6adea43551d81f88f48dc7a8ed59cc57284a')); - dbms_lob.append(buf, HEXTORAW('1ec2b09c4863aacb75d82122d89c63616716896283fe069219a8d689935ea65212edff6c0752f7610e2d017ba0d6a0692890570b063f578510d1ed4a05270377ef48afa47aaa4c8fde9f3af4d9eb043882dd53f0cdaa2941ba26234')); - dbms_lob.append(buf, HEXTORAW('d428e24d85badc507f08f549ac0df5eed7f59abeff9b1f5eed84ead777c909ffe0f6a77b3ff0a094489e297fed9b961e2722fcd9559d589b272fb4d5f30992eec5da71f06c8017067885002f0cf0d4ef1d8207fc46d48e7f2fa53a1')); - dbms_lob.append(buf, HEXTORAW('9674cfa662b780cefa0acc6e328058c03ef054e0e9ef75f99abe18dfda07118c752ca18c6257247dd0d55a09a3116c0c8554d265172155ea6943ad0366547c6f9f22545649223bf67e6988653c644fda931d838eaf88a2a7152ca97')); - dbms_lob.append(buf, HEXTORAW('9260fcd4a2b97bf3a0d526747af327e3e08775f8c29ce43321fe22e8c6cb64c70339faa0ecd6415761f36cd9fe248689f135ed37c7908cd4846fc0cda5512f755196363e006fc7d39b6efbee12d93ebafeaa7ac6d804d5285113033')); - dbms_lob.append(buf, HEXTORAW('e5c6f071bcfb1ec2b09c456154a2014e1290956af57b35a5f32517e3729f47aef03848f330a7d9472bc1b917e44e7ccf1bde5371b6a965f39ed13b9be57edfe368a0405e0214f8057a9d45f0b35da2ac0bb00757a753da086c8d75a')); - dbms_lob.append(buf, HEXTORAW('3016d600e789c6c26ac8c24a9208506cf2af46ef068c13000eb60e03ae90b2c34d6c75433c7c6a2755ad7139dd8d7d563d34fd612979f5ef37e4fcb9b24fbfb31e6bde3381c4c0bca11a8878571c2f1ae76c901838c7c5bca17c5e2')); - dbms_lob.append(buf, HEXTORAW('5dcf6e0c1ab80e7f43810b3f112df9301f0543f1a29319838679ff13d07e240a612e7efc05fe41463cf573f5ef9c5c6638498b3794acde72c25874f125d0f6d304252e015d4ae91514a20bd5c09a4cbd9277ca8241070b3e511e4a3')); - dbms_lob.append(buf, HEXTORAW('75af38cb176f14e02cc125b279e86d66bda0c6c710001a646ca6f9c73649b8ba445910606c3644bcc771f4008f38fac4f8068d47d03af02460abc1f14089b724d0f6a2e34bfb03e0737cfd124e627c4bd87898e62f3bb144b9e2866')); - dbms_lob.append(buf, HEXTORAW('fb74f3a4888e5efcffb76354f2dc334296444875433a84921891a090ab03cfce64d73d9470484dc77c3d0c6009f755244be3c6bfd25cfc8cf2eb32e74233b4d399042a194f69daf13a2eb9613be3efb47c919fdabc5b5df5e2009ca')); - dbms_lob.append(buf, HEXTORAW('f815d377802d02fdf2a31950a384c2ae26c52b35d1eba0162e5ca96103ee0bbc398c7d8f6e8d2c42b9ee5968636e197c1fdead0d1213710a474aa9e4d31d6fb984e9d0a15d8fdafa2f210e7ce4e0d7cfba5ec4e78672605c0c0b8f3')); - dbms_lob.append(buf, HEXTORAW('68a5a685c555442eebb78f087019e5ae849aa8a28702a9fbc78e669f032d8c19fac1bb35f05930df01c80871bc606786a5ce80064de6c53c9edd10678093764e5985dc3d7ff20c4dce73e7abe285f0d08b9abc2bc9317cb36f8bcb5')); - dbms_lob.append(buf, HEXTORAW('aa2371f387a5c531adb6b84e215d17f5d97df7e5c21dcf5cadfffc42a952f0c2ca40c2ccbccb3c6f9b0cd54f168887f032d90555662706058f474cfb097506e001f3448c40513cbe0d44bc27864f81a348a882025603c6837b4599d')); - dbms_lob.append(buf, HEXTORAW('cd983c6a38445782321c88036a98c1a89af0dbf1f9de4ba2d32306ed98c5065d339b92efa85101fad1cf5e62b5709b17beef67fed06679e1af41e44c2810c32a8b28890c07986aa2bbae80b0849f2570aef2b0262e9757ca468afda')); - dbms_lob.append(buf, HEXTORAW('33465c2c452f6b86f5975eeed2f74da0eef5639d16fae3c172800e7ea7e3c84193a56432f6987776ed9214f898b97f2b768d7e9f895118f18efef9382014a888feceb7431b6feac203033950a0d048209080d0cd5e90248e72c8408')); - dbms_lob.append(buf, HEXTORAW('ea40824e5237f6a885846c907ef808eb01bbf5c896a45c6dca295f2b93e9d063c30d09163f46eca336d8e12892486d871c775a10d2c6c95d2c39c1b4a3def71a0ea3d9c132b21c9a788c1b3019e76f007725e96211300da623c5dbb')); - dbms_lob.append(buf, HEXTORAW('0df054bf4d9cb945fdc0f88af60d8dcb8e6ea55d162e1462c1a8cfc5dc52d5614afe87840475c567c1e760e3c21bf68880480c5b0c3cf0ab5429a97439fcf8f6b15426b61c319180131d0d190bda91575c41accd75e1e61b367578f')); - dbms_lob.append(buf, HEXTORAW('3005e18bcf6826c443c62da1ff18eed5c68dbd04b1d9e39e2bd40c3d78bafc855fd4c52420d1a0fef8e70be0e6c809f9b683c8c11e445942f438797ac44cdf11d4d84a933400def09be3edb11c47155dc5dd66ce569427c3ee5ad4')); - dbms_lob.append(buf, HEXTORAW('11f82b71cad5b94a08111260d0aba65e3f9067504d631119046abb0f6b51756186a5b55ee104697467fe72e85e8708c1c661703a1ce2f076f9803c1ea44f117d76ba4cdaa430e7a401ec4397ffa7bfb918b85386475d75e6d2e86ee')); - dbms_lob.append(buf, HEXTORAW('3ca4bf1e25109400e860b848d55520caa14e1cdb6834a71c3f6884fa94d56844afd56b5489d5a228f9771d8e6694bf4df472fdb2ab6fab983c6b56bc4e95bc316c6d5cc2ccc660ba000bd3cc07a46bf7ebb27db61284a7dd2f62d4')); - dbms_lob.append(buf, HEXTORAW('3507a453275d3ed90a0c69c54d1760719df070ea87cdc6c5d1e1a9e777b62f7d68438ff89ec6e980d1eb0445f941f13d10dec6c2dafdee2a826543bfb2b4fe23fe7863a27f7c13dba28cb60c80770cc04bd646e4e8f03cdb00c337')); - dbms_lob.append(buf, HEXTORAW('783d986c6709e1474d17956519f0f5db067478a6eb068cb61e80671bc6c3c33ffab3e0ebed8f84fb2d597ce3c6db01fc63f0d6a62d7eb6507d425e56116048f19ce3353d870c2cb381708211ec7d85653fb9f152564c2726265d1de')); - dbms_lob.append(buf, HEXTORAW('3016c66546513c8af8ae546d5f4639be566c95fa414a6a6377b4241483b5bd598fb069540a4ca8283a3f628a841e423d10e233991400021c06c95946c0f251a3e610fe8cfa34aab96a5bb265d24720892a0943f525638fb766d5c00')); - dbms_lob.append(buf, HEXTORAW('7bfdc0a4833f7861dbb1cfd13dd1605c361efc85fce0f719f1193cc3c1cf1803e1dd07720c3c67c37bf1a077e2e105deb36293317310eb874650715cb6166f68bee16dc03c6aa8c350c3914fe6704e7050e48fc7d74fb0551b8dfcc')); - dbms_lob.append(buf, HEXTORAW('c88ed1df4cc481e4448f98d9d821b69099e0e9f5f49ccf1e54661ef601bde20bed1c4f07df3c40fceb03e1e41f7d724bd7e931d0f8f9014360e5fbe1f38fe81fbad30197ca3c01846064406574909d7f96cccbbb3e09c8b80ad1755')); - dbms_lob.append(buf, HEXTORAW('ab980414cf1f1f21c15c576cfd1221b1a1764492655fabb080705072b33f0a9179e9e9cb2e961243e8f194a1bd5a8a7811db89fd0645ec7e24f229674b6654adfbbcbafd5229397cf5ce84f1e3c72bf898251507060f74cc361981a')); - dbms_lob.append(buf, HEXTORAW('b4beb20608602c230491e1a495105863ac223f59a6c2dc8a1420428ea0e6942a04d4be95a68db50e7aaca750a68ff7da7c56e60e2c11b3a76cfeb171b1701e352a08d8b29402a83b9fb9580111d5551c62494f07ca01137c9fb243c')); - dbms_lob.append(buf, HEXTORAW('5d33aacc04c02b80be2b3cf349459003fd28827e08c0bb2021defeb4f5086f18c0cb4b3c2e566ccb3aa78e99f366aa10bbc66c5dbb1b22d16b408a20d11f25d1f7554dc914d1af1e55586b85687e6dab9b5d1b48977f1d7f674c85')); - dbms_lob.append(buf, HEXTORAW('6572cfcc82c0bf5250010645201790f13917e0d9aa5f002f53a9eaac7949ba419bdd4975f85c05e3d9063a37882fcb2e8b2a4a2f4b32da06d87a2b602a234fa55a04fdd2f1f5dc5cf3607c747864d44f723c7c467db2e1a8b6d109')); - dbms_lob.append(buf, HEXTORAW('41cf864bf8fa03406d03be5632f8e2fedd7cfaba99d31f1262ceb153de980daa739f711c6bd4702c85ef8151e6ce3ea44a87739308c75a9164d9d76ebc50280ec4fdbc507ceebae5468d2276142510bc7a3621e5aeb4cb5f5b0321f')); - dbms_lob.append(buf, HEXTORAW('878a73546b0f3ec9ba4da824339ba48d5a4e2eaafd7148063727f43112f47ef2fff1e27884447245c4ca27125a19297163df5c381c03917261a97645545b00cc62679039dff0e7907dea3493e283144fd2a3487c1d325061367679')); - dbms_lob.append(buf, HEXTORAW('21844e3541a096e244cc8d955debb7b841b67f4e345cb9d1d10df518f841d6be4d0701e619d906492150f512fc6f51c656ec6d186dd338d9c2ee7948b991bb449b517ec4ecae13bd0ce6a14be519f0a15f177a09d95103e73571541')); - dbms_lob.append(buf, HEXTORAW('3781728924f9f59b783c7c123093d01a8b2f977092c557f8f085f18fc676d2b70f7d72e23450a993648192076388a9e64e3c78ae0d8f7f63dcfa86759f7cd9df91e8f92eb58b2e720fd4a829421323b133e9ea59f5398b742defbd')); - dbms_lob.append(buf, HEXTORAW('e3e09f40254577599f0b35de690da9515250d21aa7d7bed425583342c007d8a8fae03527282c429426da2520172ebaa5ec5cf7dd910bd60f4d342ebe71c8d2c74fbfe3dd1799edbf633c8bc1d3e7c31f819bc9e099f00b27c4cf1c')); - dbms_lob.append(buf, HEXTORAW('f91b4e8c9fef3955fb2295c1629163e807e0b1be68f9c58ea3c69b083a4a9c98c281ab24f1c229e4d490c084a196906b2ea84c71bf378e0bb6bd3be5c31afee6fe373c3fc1f39595103e9f87ac86e1fbf0cd6a1cbe41f823bca4c7')); - dbms_lob.append(buf, HEXTORAW('c3bc1ff66c3c4cf0ccf39914be4111e441e381eb7ee1cdd327bfb44c88efbf2e9ab61abc4b6b98ea9d246696fb0a55f474f32012129e34d16675d2657f131059a2cbea2f8805dc393aa729b871ce33b2ab360f3c3a2c7a76ea230a')); - dbms_lob.append(buf, HEXTORAW('26e5d24a5575ca0055d3d59478c10c3a3c16072019065ce1e06ffcc0eabf23420470894021018b272c9dc45a37d797715cfc014dc3d53b98aefc18c691fb395a5bc1d34dc451936efc18e6f41066b60d8749263e9d2eebc73144c6')); - dbms_lob.append(buf, HEXTORAW('b3583fc21ade6663a8de8f418600c22c455abfeb515831076c6534de983a871b19f17b4e4060c3c5df35bdb3bc343346801e12ff709d217cf36653ff6d684735fcb9edcfacd3d7e77131049e9a6c45c1c6db84fb2fca25493b495b')); - dbms_lob.append(buf, HEXTORAW('94095ff3fad2e16519f0e53699e16cbdf9ef086fd478c449128e86af49b2e6e3e19f3f24a476427c93b5f501be9fbcfaba331dce319238507381b656544d611b6cb8c408e17d1f1ac6c22f493ba291655f1110c7fc55b42a5ab77b')); - dbms_lob.append(buf, HEXTORAW('72fc428bb283868c51902b891d3ca0e24ae99352d9748e8210429515a685c78baa30fe040909deb4610332e1807ed801df275b108e03356c299cc8fa7842522a3a366d1a6b6a1bdceffdc48cac5c45402a0ef5bc77501b1676d4b7')); - dbms_lob.append(buf, HEXTORAW('51f48dcd5526fe833f0af08603bc30c04b7cf01753ee2ffd20e2c64b5f843033dee2861c87c65c1ddeee8edb9f5b364a885537ce9fb969930248aa4bdc58cc8b8502510d91bbb46e602462df1d503f77f71d22fe0009c3b8e8eb39')); - dbms_lob.append(buf, HEXTORAW('300239ca0f7a369e001f72a7892423a68d077d6162959979dd717cd97c717c03545c81aa5aee1516a4e26a64047934ec234c3afcc68f8703edac84f89abc2619bebb7b6c3f78d915724d7e5977335d7486b60c76f119d52871a066')); - dbms_lob.append(buf, HEXTORAW('03afaa652a793a7f6ca8392149baa4ece90f1b2e74e564b65ebbc6f4a33a9dbcb4c7e3525a589d3ac4cddf2f20ecd0e2c62ecfaf9f5d15ab9e8ffc3552b863be102b3ef87ae32c50651185c6fb1d1885ae05ef1b8cdbc0ab4cc938')); - dbms_lob.append(buf, HEXTORAW('be063ae0ec61c74d65adaad0b980dc9a95592d2621f5fdf8bc875b7f22c4213bba0cb957e55eca73cd701633629b8c96be34e03960b4f522bd99511c9e4f36e23d13ee519907f79e987270251bf19e09c6c5798d355e1afcf3b320')); - dbms_lob.append(buf, HEXTORAW('97582904d6c1b8ac1efc7dcf897f95ebe41ff32a56a0771daa00c0784e990720130119d3c11859f78eaa493201824359a6d7c9ee743d7df2607784fa586d3adcd3c07af6ae3e56fd2d51712371f3383a61ff0d7152749f0a18ad13')); - dbms_lob.append(buf, HEXTORAW('dcb0a9569dd159c2179867011e0a7e70c4b4d520be682c6611e409e280549ba52bf7dd6343c66780b79711e45e3b30275972e361c16e0fbe262121bed18b230b2bef12e2c3ba178f72efa4dfb162d3bced10c85a839932c0385e75')); - dbms_lob.append(buf, HEXTORAW('05b4d1688e1933307e0d8ce518404d57d776024c6ca197b5a291655f111038288970a064200fcace438eefd1fa2221d2bb37abf9c3dffd1b830e9a7c4ae9a17be9c042083d9532c935962fa99d593ab59ffa023948242038705853')); - dbms_lob.append(buf, HEXTORAW('4a0a14ed56a99a544c9ab02d3c4e736dd25d6fb8005c22b050bb12d2299f5fdcefd85b846832b4c5c0bcf31b1897d1466f1d5c88b1b748c2910bed79f1ef4a7a6197b088e47970e1559037d4681a35fd60f2a7e2600431e00e79cf')); - dbms_lob.append(buf, HEXTORAW('6b09068f6df879ba5757a46fe45c57d29d78e9b377bc243754f5c6ca6995b0e16a1981c08d878484bc5bb6c3f390f61ddd26f9fd36eefaeeb1fed4bb4f97eb29342c745a4f77a4bcf4df19b167319dbbb79e470334d5ffe4d37fc7')); - dbms_lob.append(buf, HEXTORAW('e049c2d11eda70877ec30c460311deb9eabd041fdadccba8e1886923be2574db4f1ec00f27c437e8022c824f8c8f82976c04b9613ce292992a784111e441e3c103404b1a87efa2d367747b79b910df144cfbf762c8d987779863ba')); - dbms_lob.append(buf, HEXTORAW('7dbccf03e3d7f08228b4819084020c129e733c43c75eabe8f71b0141159294400ed8d836afa25c8883761d7aea5fb6c69eb2dd5427164fade045c4ea17f0c084847aa40c3cf04229ea5db5fda019338428fb7cf3524caf5e8ba944')); - dbms_lob.append(buf, HEXTORAW('30e508729c18d701a947ea4e5035456222655e0b75186aa771fd37155f8a171c9f3784387ee23983cf1a2025b3c969a75fd025f62d1e98ea692e3114b11b03b9bb6e0e480c53496270e02f2e6c07e0a9dff31b036961c3c6c88103')); - dbms_lob.append(buf, HEXTORAW('612acb32cb73701922dee3e0a9f7e480c43015e6976fc41276d079d94a75bc9153a4d41e8af15877d992c5932e1562c16d9fbfffdd0ef502cab67ba55e1321c100529448c02db20e52dfa06a8b245528ee9dfe479dd9efd9ae727d')); - dbms_lob.append(buf, HEXTORAW('a76c4ebb23fbcc04e3eccf8eacdae608f20ce87faccdddb825398afd5e0c84f1f3180c5b835f409cb30ecf8bf0566d2f82bc04da61c05f27fcc9e2eb3120d9807f18e01725856fb62f823c4383e7112a7d7d992454c12ea82aa10b')); - dbms_lob.append(buf, HEXTORAW('aa609e70bd353227191f0f8b13429e832b31bea5e11f87bae7d8077ff9f7f4f160abc5f55ad941d5d570052d12106ab3c067241c18af863901298d3b128e0ca81db187653f1bd15d0e7ffec269f76fdd26a9e2c591655f7f1dfb340')); - dbms_lob.append(buf, HEXTORAW('c7fb9eed38e7d1ea05befbaf1844bfa834a81c79d58d3f5766809d4ef410dcf939b31d44438c27bd2cb0485c121028bef7384481b94bee1cc0e0d1ae7c2f0acae733605788d6336246f9c193cb49d446df81c6d1b4e627849bb2726')); - dbms_lob.append(buf, HEXTORAW('345a12dee358f661a1eb861b1df15e0c92c7a8baa9ee7d318591b71f9806e9f82909226c28f44ae13a65d41d932d84b97b93111d4614379e4b58ca3a6ceef4f129c26ccb209b1ec39fad676f1e13dbfe087e0ef08d30bec66cb3cc4')); - dbms_lob.append(buf, HEXTORAW('81e940d37c17c35b8ff8cf84669feb212c14f1a5fbfad445f5ffe7da2e36bda27c375a7019fd38879fd363c1ed1002339b31d96656d39f3fb4b84f86f97c7ae1f05aa27be3ec9dbea13bdcd039fc9db0a6d1fe814a28d54dcfab5c')); - dbms_lob.append(buf, HEXTORAW('55e967d2d81600d3c6bbc2aabdb8d271edfb6af44e180f4c2ec6ce10f6cc36cb2fce62fa64b6dfa5ccb6333e494fcd06a49e9d46239a89f55ae40dd208a6e38b0357de073e6474d5e3638b0195017409d0bb593f410e805e090ca2')); - dbms_lob.append(buf, HEXTORAW('31f6a49d8ba0ce993e7ba21670ce9ddf7b977e533b345bb666e3a787f6e28f576ce819902bc7c3a66e08882ef90470e0990060e330738b8a94c22f4020805c02b0078c8e13a002f1be03900af1fc083d131a9d0b8caccc0d965aaf')); - dbms_lob.append(buf, HEXTORAW('69a59dfcd1f3b4788ef1efce22d37e7955b304710e604229515ba3fb2eccb6803411d72046e2624093517fbaaaa90942c4b9e5ff8f87629011f7ddc690b2f973db3beb1cadbdc1e879f0db63e5f7664d8c619600bf15424163ca7da')); - dbms_lob.append(buf, HEXTORAW('0520bfc2bc490944a9140772152271dc20491247afaf03bc2a958fa7ff8e70862f9754c9f696789de52699838b2495007cfd39b8747c4d7790737c4ba85d00ed8c84f0837292f1f1b04833a0e019727055cc2d5bbe42128c31998fc')); - dbms_lob.append(buf, HEXTORAW('e78f2cfb10be9dead5059dcbc24ae205954808abe1ace354ab904eb95182134a2a35b3ad451d4b020abb6166a47ec65d9c7048422ad5132c0a48af2e06cdbace3dcedad843860c94157fcc90d04f4eb3eed584dc9e9885eaa361c98')); - dbms_lob.append(buf, HEXTORAW('d677a122f74ef4832e3c2cd78df45ef3c682d71740a01837aa9331e946a89c40844e00001c4c494441548f563511103ec0af431d2729c44a41d008e8cf63fa79b27960fd8610e7e5dd34e5afcfc8a9989f3a6ba01bc9cc23598dc66')); - dbms_lob.append(buf, HEXTORAW('538e84daa01cf58cb23bdd5f7a6acaa5e1658077eaf36ca545fe4b80df032009e03f0f483df3b386cf87d1ec0d3dbc9a6e93644bcd75d573d73abdc80635e7bf4a0e72546f56323c5b4119173830d59c5084715e89089a383e47498')); - dbms_lob.append(buf, HEXTORAW('7433f2aeaa697d20a3a18e742d5968f793fa0d3d52129a50e79473faf513222ec2fb3ce8474b357e487e0c4e249e0a86cf9b1a9781e24ef89d9a67ae82290960300cb6810446774bc737c96cb8088fd2aa9b549e0c7e10befc8ef01')); - dbms_lob.append(buf, HEXTORAW('2dd0943f0bbf80322c805e2c79d46b88a36d9f1c880effd8c500c5ec5e96597af3c5c88f71f7dbaf8898142ec7ca1f48b5d23142052ad628e3e24202a6da6a8445b0710125ad7a8ba02491a8de5513cd710d302a81df133957da4c2')); - dbms_lob.append(buf, HEXTORAW('f2b98539f0392a3fa46835fbe5f7aadc2b69eb2745be5fe2c66570916f38a6232711d08e871265ee726daf3cac26679110bd1fcfbebef72dea498c4477534dc4ea54a8e1e0c038120c34a4c875507d910405dd2042801fd8896bfa1')); - dbms_lob.append(buf, HEXTORAW('d7b3e0484c855ad5dbae9ce4fdd9bdf52e7a7df606789b8c86cd93311a7da493e3256570d7891de8e0e8fa98a7c11ea0655d170701b0dcac1956c72442f729cc163eec64946bcffd86e45e9e7cfc943ffb29a7198b4323ed23f56b3')); - dbms_lob.append(buf, HEXTORAW('7b3f303b29cf0c40eebd90a286447f4d7927fc81a312a3dd39db8f8e397570f7cce110f7e2b079f4bb4367b17189c6f797543c6341c56b52c1f0e4a449469037a092dc337c93cdc165c697c38736c00b7267770c714b368f0351e3d')); - dbms_lob.append(buf, HEXTORAW('a08156dc2f1f0abcad4f75b0b7e3c7ae65942bcf5a2ddfb61596f5bfad3573bc0664b2a299028785257aaabf5e729fe23ee8efed83b794034f608199f9fadec2309048bcf688c072a06f649dadef44f2dfff985e4d8da2c3fe4d63c')); - dbms_lob.append(buf, HEXTORAW('5b7e38445c997a968873df0511d0a6fb007201a6a380c0e79d24cdef2244bb778f18786e0f210e3feae84d4d25e7b86ae3b7abbebd50bd0f250fb1595538e05658c79328354a1e79f09cc5fa63196ae061425d549df206d4b25f7f9')); - dbms_lob.append(buf, HEXTORAW('8611f7987241ccd1e6bf9d23b6fc7f0bfc6bd09ce1a692982d98e386d8585973e3bd6ef38ce477d6e037d2ba1cf15073412daed54d8a4275930d54891d07b65c3b89690224f00bcf3005e4b801706780efc3a03e0091d3fa62210d0')); - dbms_lob.append(buf, HEXTORAW('0f0f3fa1e3c7eea7b0e17e8d0ce20033a09731bc4b5bacbf64865c4fe3a63e71fd9beb152c727384ab91dd24746ea9ac84fa23a8f17bf072418e8e6c2290d9a01eee5b201516f6240c354820d65a2901bfb7e02337434297bb8f1f')); - dbms_lob.append(buf, HEXTORAW('ed322e299bd2569d7a6aacbf5ba0bf27417fd702ac0ce8979a37baaa18dafe7156e3d142cc85b68297cbe0d9d02e61f06d9d538ee3c4117e18debe36beb77b8a6f9c4a2a0cbfcb80df69f01bc037231e5f092f17da1abc24f05d0b')); - dbms_lob.append(buf, HEXTORAW('cf69f88acea442cdd84bf8561c54b1eb93ad35df3d23c4c42b9ffb6fbe3c0767df38615aa11c89bac2da372a4f56cfa031bcf272a8c1468b2a2bba39b55c7f9eaed406c983ae1960f11e941b1025e7b0f899cbbe22206b55c50f54a')); - dbms_lob.append(buf, HEXTORAW('ae1407603fd36ce5bf5df8a17e4869b7fc2ea56f32547fe4adaf893dc3cf799a02ac19bd73c115e9125aecaf1bc7e6cb76afa5c8bd37af796cd6f7b8fe8305872a8ad97dd33e75a79386cae7eb60e0e882824d32333b30df88d66f')); - dbms_lob.append(buf, HEXTORAW('db0597f4aa0ee9cb89f2120182e0169b1bb75852be90c3af39ec71e7958f6efb5d4290fb8aa3557b4ce8bc33b0b44e1525da71ae83668f2563224eff379bf08dffd0628723b002f1be029afae71e0d5956df09b174c0565ba002b0')); - dbms_lob.append(buf, HEXTORAW('bf01d872a02a6d20a5069543d5df1c98f438578efdc27434f1f283793a89a500984826c19c8d1018120f747cc828c6ebb702f0ca9acd05f1e37e44dd0339bd5c81001d10ca1a429d77575a4fc964552223eb453f727af7209d349e')); - dbms_lob.append(buf, HEXTORAW('2fa1603ddfe820d299bcd9bffceed0c18970218171c67d5f6bcceb40baa8c49128bc88b4d87ef8f7f2881b682674892484917b97b31c3d7536922c3e24b9298781d9bf035dc116ec2374e15aa8f8747a8d4fa32a8b812b8cd17c17')); - dbms_lob.append(buf, HEXTORAW('309c763d103d35b3db750128ebf8fb8ebdd1be4e1ffef1dcb773daf3acc250db2c5c14da74450eed63f47c607555c787f0dd970212720b9e9a2a4910bf55a56ff6c655f4b203a6feb3b8051a5e346924746d7dcba4812920e83babe')); - dbms_lob.append(buf, HEXTORAW('78b514c9acefad1db1886cd3c499379e5ab0a0534fbfa859e55172223b457a2de9fa8dfc608bf871999c98adbbd76f2d03ca4d8403f1c40e00a123c20747381188e9ac4649a3ab10170eb975ed09238438ee8133ad31f2fda1d294f')); - dbms_lob.append(buf, HEXTORAW('3738a85d9f6309a38fc5ed08f30f4836f1085add948e7403b57c1838ba54c07465080176ef42230daf6f319156d784a1dfc4cf7eedb881ebcc457bc06300675ebaa1fdfb64d888faa47e53f9a2e259089eb5fd90ef7bbd4cc5775d5')); - dbms_lob.append(buf, HEXTORAW('8150a32482840475c84860f09e179438d046862a0030c247bf861a3839ea890d6dc650b846f5b2755b46b917f6742aea1d71df9b3eaae91167a7094f7a4932dbb037cef0b6305d58a534e33970419527b1e23c16a8e78c362907e02')); - dbms_lob.append(buf, HEXTORAW('1e140f8b6d6363318050de34bed5c6823fc0c866f4663f025781ec391db20bed90c5f6e7c2f315c5065769bd7e0572d2e9fb74eaefcef7a177ef0a29ce79967bd37eaabff516fc0839e6e38854040b46de07ae4711d14df012a2b64')); - dbms_lob.append(buf, HEXTORAW('74284d3bbbb08e240e18005dd92f7efec0682afb9880709b001192d150838ac7dd78dbab373eeb0ef89107677eb6fb39b9e1ea9b7d73b69bf77e2d898ab15fc771140d6e3c1ed8967a54faca0cf99e0ed33a77bae023f99e493dffe')); - - UPDATE BINARYOBJECT - SET data = buf - WHERE ID = 10; - - UPDATE PRODUCT set PICTUREID=10; - - COMMIT; -END; -/ \ No newline at end of file diff --git a/samples/core/src/main/resources/db/migration/orcl/V0004__R001_Add_batch_tables_ORCL.sql.orcl b/samples/core/src/main/resources/db/migration/orcl/V0004__R001_Add_batch_tables_ORCL.sql.orcl deleted file mode 100644 index f7d10023b..000000000 --- a/samples/core/src/main/resources/db/migration/orcl/V0004__R001_Add_batch_tables_ORCL.sql.orcl +++ /dev/null @@ -1,80 +0,0 @@ ---Rename this file to V0004__R001_Add_batch_tables_ORCL.sql.orcl if the database used is not Oracle 11g -CREATE TABLE BATCH_JOB_INSTANCE ( - JOB_INSTANCE_ID NUMBER(19,0) NOT NULL PRIMARY KEY , - VERSION NUMBER(19,0) , - JOB_NAME VARCHAR2(100) NOT NULL, - JOB_KEY VARCHAR2(32) NOT NULL, - constraint JOB_INST_UN unique (JOB_NAME, JOB_KEY) -) ; - -CREATE TABLE BATCH_JOB_EXECUTION ( - JOB_EXECUTION_ID NUMBER(19,0) NOT NULL PRIMARY KEY , - VERSION NUMBER(19,0) , - JOB_INSTANCE_ID NUMBER(19,0) NOT NULL, - CREATE_TIME TIMESTAMP NOT NULL, - START_TIME TIMESTAMP DEFAULT NULL , - END_TIME TIMESTAMP DEFAULT NULL , - STATUS VARCHAR2(10) , - EXIT_CODE VARCHAR2(2500) , - EXIT_MESSAGE VARCHAR2(2500) , - LAST_UPDATED TIMESTAMP, - JOB_CONFIGURATION_LOCATION VARCHAR(2500) NULL, - constraint JOB_INST_EXEC_FK foreign key (JOB_INSTANCE_ID) - references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID) -) ; - -CREATE TABLE BATCH_JOB_EXECUTION_PARAMS ( - JOB_EXECUTION_ID NUMBER(19,0) NOT NULL , - TYPE_CD VARCHAR2(6) NOT NULL , - KEY_NAME VARCHAR2(100) NOT NULL , - STRING_VAL VARCHAR2(250) , - DATE_VAL TIMESTAMP DEFAULT NULL , - LONG_VAL NUMBER(19,0) , - DOUBLE_VAL NUMBER , - IDENTIFYING CHAR(1) NOT NULL , - constraint JOB_EXEC_PARAMS_FK foreign key (JOB_EXECUTION_ID) - references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) -) ; - -CREATE TABLE BATCH_STEP_EXECUTION ( - STEP_EXECUTION_ID NUMBER(19,0) NOT NULL PRIMARY KEY , - VERSION NUMBER(19,0) NOT NULL, - STEP_NAME VARCHAR2(100) NOT NULL, - JOB_EXECUTION_ID NUMBER(19,0) NOT NULL, - START_TIME TIMESTAMP NOT NULL , - END_TIME TIMESTAMP DEFAULT NULL , - STATUS VARCHAR2(10) , - COMMIT_COUNT NUMBER(19,0) , - READ_COUNT NUMBER(19,0) , - FILTER_COUNT NUMBER(19,0) , - WRITE_COUNT NUMBER(19,0) , - READ_SKIP_COUNT NUMBER(19,0) , - WRITE_SKIP_COUNT NUMBER(19,0) , - PROCESS_SKIP_COUNT NUMBER(19,0) , - ROLLBACK_COUNT NUMBER(19,0) , - EXIT_CODE VARCHAR2(2500) , - EXIT_MESSAGE VARCHAR2(2500) , - LAST_UPDATED TIMESTAMP, - constraint JOB_EXEC_STEP_FK foreign key (JOB_EXECUTION_ID) - references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) -) ; - -CREATE TABLE BATCH_STEP_EXECUTION_CONTEXT ( - STEP_EXECUTION_ID NUMBER(19,0) NOT NULL PRIMARY KEY, - SHORT_CONTEXT VARCHAR2(2500) NOT NULL, - SERIALIZED_CONTEXT CLOB , - constraint STEP_EXEC_CTX_FK foreign key (STEP_EXECUTION_ID) - references BATCH_STEP_EXECUTION(STEP_EXECUTION_ID) -) ; - -CREATE TABLE BATCH_JOB_EXECUTION_CONTEXT ( - JOB_EXECUTION_ID NUMBER(19,0) NOT NULL PRIMARY KEY, - SHORT_CONTEXT VARCHAR2(2500) NOT NULL, - SERIALIZED_CONTEXT CLOB , - constraint JOB_EXEC_CTX_FK foreign key (JOB_EXECUTION_ID) - references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) -) ; - -CREATE SEQUENCE BATCH_STEP_EXECUTION_SEQ START WITH 0 MINVALUE 0 MAXVALUE 9223372036854775807 NOCYCLE; -CREATE SEQUENCE BATCH_JOB_EXECUTION_SEQ START WITH 0 MINVALUE 0 MAXVALUE 9223372036854775807 NOCYCLE; -CREATE SEQUENCE BATCH_JOB_SEQ START WITH 0 MINVALUE 0 MAXVALUE 9223372036854775807 NOCYCLE; \ No newline at end of file diff --git a/samples/core/src/main/resources/db/migration/postgres/V0001__R001_Create_schema_pg.sql.pg b/samples/core/src/main/resources/db/migration/postgres/V0001__R001_Create_schema_pg.sql.pg deleted file mode 100644 index d7c42fb56..000000000 --- a/samples/core/src/main/resources/db/migration/postgres/V0001__R001_Create_schema_pg.sql.pg +++ /dev/null @@ -1,135 +0,0 @@ --- This is the SQL script for setting up the DDL for the PostGres database --- In a typical project you would only distinguish between main and test for flyway SQLs --- However, in this sample application we provde support for multiple databases in parallel --- You can simply choose the DB of your choice by setting spring.profiles.active=XXX in config/application.properties --- Assuming that the preconfigured user exists with according credentials using the included SQLs - -CREATE SEQUENCE HIBERNATE_SEQUENCE START WITH 1000000; - --- *** Staffmemeber *** -CREATE TABLE STAFFMEMBER( - id BIGSERIAL NOT NULL, - modificationCounter INTEGER NOT NULL, - firstname VARCHAR(255), - lastname VARCHAR(255), - login VARCHAR(255), - role INTEGER -); -ALTER TABLE STAFFMEMBER ADD CONSTRAINT PK_STAFFMEMEBER PRIMARY KEY(id); -ALTER TABLE STAFFMEMBER ADD CONSTRAINT UC_STAFFMEMBER_LOGIN UNIQUE(login); - --- *** Product *** -CREATE TABLE PRODUCT( - dType VARCHAR(31) NOT NULL, - id BIGSERIAL NOT NULL, - modificationCounter INTEGER NOT NULL, - description VARCHAR(255), - name VARCHAR(255), - alcoholic BOOLEAN, - pictureId BIGINT -); -ALTER TABLE PRODUCT ADD CONSTRAINT PK_PRODUCT PRIMARY KEY(id); -CREATE TABLE PRODUCT_AUD( - revtype smallint, - description VARCHAR(255), - name VARCHAR(255), - pictureId BIGINT, - alcoholic BOOLEAN, - dtype VARCHAR(31) NOT NULL, - id BIGINT NOT NULL, - rev BIGINT NOT NULL -); - --- *** Offer *** -CREATE TABLE OFFER( - id BIGSERIAL NOT NULL, - modificationCounter INTEGER NOT NULL, - description VARCHAR(255), - name VARCHAR(255), - price DECIMAL(19, 2), - number BIGINT, - state INTEGER, - drinkId BIGINT, - mealId BIGINT, - sideDishId BIGINT -); - -ALTER TABLE OFFER ADD CONSTRAINT PK_OFFER PRIMARY KEY(id); -ALTER TABLE OFFER ADD CONSTRAINT UC_OFFER_NAME UNIQUE(name); -ALTER TABLE OFFER ADD CONSTRAINT UC_OFFER_NUMBER UNIQUE(number); - -ALTER TABLE OFFER ADD CONSTRAINT FK_OFFER2SIDEDISH FOREIGN KEY(sideDishId) REFERENCES PRODUCT(id) ; -ALTER TABLE OFFER ADD CONSTRAINT FK_OFFER2MEAL FOREIGN KEY(mealId) REFERENCES PRODUCT(id) ; -ALTER TABLE OFFER ADD CONSTRAINT FK_OFFER2DRINK FOREIGN KEY(drinkId) REFERENCES PRODUCT(id) ; - --- *** RestaurantTable (Table is a reserved keyword in Oracle) *** -CREATE TABLE RESTAURANTTABLE( - id BIGSERIAL NOT NULL, - modificationCounter INTEGER NOT NULL, - number BIGINT NOT NULL CHECK (NUMBER >= 0), - state INTEGER, - waiterId BIGINT -); -ALTER TABLE RESTAURANTTABLE ADD CONSTRAINT PK_RESTAURANTTABLE PRIMARY KEY(id); -ALTER TABLE RESTAURANTTABLE ADD CONSTRAINT UC_TABLE_NUMBER UNIQUE(number); - --- *** RestaurantOrder (Order is a reserved keyword in Oracle) *** -CREATE TABLE RESTAURANTORDER( - id BIGSERIAL NOT NULL, - modificationCounter INTEGER NOT NULL, - state INTEGER, - tableId BIGINT NOT NULL -); -ALTER TABLE RESTAURANTORDER ADD CONSTRAINT PK_RESTAURANTORDER PRIMARY KEY(id); - --- *** OrderPosition *** -CREATE TABLE ORDERPOSITION( - id BIGSERIAL NOT NULL, - modificationCounter INTEGER NOT NULL, - comment VARCHAR(255), - cookId BIGINT, - offerId BIGINT, - offerName VARCHAR(255), - price DECIMAL(19, 2), - state INTEGER, - drinkState INTEGER, - orderId BIGINT -); - -ALTER TABLE ORDERPOSITION ADD CONSTRAINT PK_ORDERPOSITON PRIMARY KEY(id); -ALTER TABLE ORDERPOSITION ADD CONSTRAINT FK_ORDPOS2ORDER FOREIGN KEY(orderId) REFERENCES RESTAURANTORDER(id) ; -ALTER TABLE ORDERPOSITION ADD CONSTRAINT FK_ORDPOS2COOK FOREIGN KEY(cookId) REFERENCES STAFFMEMBER(id) ; - --- *** Bill *** -CREATE TABLE BILL( - id BIGSERIAL NOT NULL, - modificationCounter INTEGER NOT NULL, - payed BOOLEAN NOT NULL, - tip DECIMAL(19, 2), - total DECIMAL(19, 2) -); -ALTER TABLE BILL ADD CONSTRAINT PK_BILL PRIMARY KEY(id); -CREATE TABLE BILLORDERPOSITION( - billId BIGSERIAL NOT NULL, - orderPositionsId BIGINT NOT NULL -); - -ALTER TABLE BILLORDERPOSITION ADD CONSTRAINT FK_BILLORDPOS2BILL FOREIGN KEY(billId) REFERENCES BILL(id) ; -ALTER TABLE BILLORDERPOSITION ADD CONSTRAINT FK_BILLORDPOS2ORDPOS FOREIGN KEY(orderPositionsId) REFERENCES ORDERPOSITION(id) ; - --- *** BinaryObject (BLOBs) *** -CREATE TABLE BINARYOBJECT ( - id BIGSERIAL NOT NULL, - modificationCounter INTEGER NOT NULL, - data BYTEA, - size BIGINT NOT NULL, - mimeType VARCHAR(255), - PRIMARY KEY (ID) -); - --- *** RevInfo (Commit log for envers audit trail) *** -CREATE TABLE REVINFO( - id BIGINT NOT NULL, - timestamp BIGINT NOT NULL, - userLogin VARCHAR(255) -); \ No newline at end of file diff --git a/samples/core/src/main/resources/db/migration/postgres/V0002__R001_Master_data_pg.sql.pg b/samples/core/src/main/resources/db/migration/postgres/V0002__R001_Master_data_pg.sql.pg deleted file mode 100644 index 371c93f69..000000000 --- a/samples/core/src/main/resources/db/migration/postgres/V0002__R001_Master_data_pg.sql.pg +++ /dev/null @@ -1,52 +0,0 @@ -INSERT INTO RESTAURANTTABLE (id, modificationCounter, number, state) VALUES (101, 1, 1, 2); -INSERT INTO RESTAURANTTABLE (id, modificationCounter, number, state) VALUES (102, 1, 2, 0); -INSERT INTO RESTAURANTTABLE (id, modificationCounter, number, state) VALUES (103, 1, 3, 0); -INSERT INTO RESTAURANTTABLE (id, modificationCounter, number, state) VALUES (104, 1, 4, 0); -INSERT INTO RESTAURANTTABLE (id, modificationCounter, number, state) VALUES (105, 1, 5, 0); - -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (1, 1, 'Meal', 'Schnitzel'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (2, 1, 'Meal', 'Goulasch'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (3, 1, 'Meal', 'Pfifferlinge'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (4, 1, 'Meal', 'Salat'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (5, 1, 'Meal', 'Pizza'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (6, 1, 'Meal', 'Flammkuchen'); - -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (7, 1, 'SideDish', 'Pommes'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (8, 1, 'SideDish', 'Reis'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (9, 1, 'SideDish', 'Brot'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (10, 1, 'SideDish', 'Knödel'); - -INSERT INTO PRODUCT (id, modificationCounter, alcoholic, dType, description) VALUES (11, 1, false, 'Drink', 'Wasser'); -INSERT INTO PRODUCT (id, modificationCounter, alcoholic, dType, description) VALUES (12, 1, false, 'Drink', 'Cola'); -INSERT INTO PRODUCT (id, modificationCounter, alcoholic, dType, description) VALUES (13, 1, false, 'Drink', 'Bier'); -INSERT INTO PRODUCT (id, modificationCounter, alcoholic, dType, description) VALUES (14, 1, false, 'Drink', 'Wein / Apfelwein'); - -INSERT INTO OFFER (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (1, 1, 0, 6.99, 1, 7, 12, 'Schnitzel-Menü', 'Description of Schnitzel-Menü'); -INSERT INTO OFFER (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (2, 1, 0, 7.99, 2, 8, 13, 'Goulasch-Menü', 'Description of Goulasch-Menü'); -INSERT INTO OFFER (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (3, 1, 0, 8.99, 3, 10, 14, 'Pfifferlinge-Menü', 'Description of Pfifferlinge-Menü'); -INSERT INTO OFFER (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (4, 1, 0, 5.99, 4, 9, 11, 'Salat-Menü', 'Description of Salat-Menü'); -INSERT INTO OFFER (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (5, 1, 0, 1.20, null, null, 12, 'Cola', 'Description of Salat-Menü'); -INSERT INTO OFFER (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (6, 1, 0, 6.23, 5, null, 12, 'Pizza-Menü', 'Description of Pizza-Menü'); -INSERT INTO OFFER (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (7, 1, 0, 5.99, 6, null, 12, 'Flammkuchen-Menü', 'Description of Flammkuchen-Menü'); - - -INSERT INTO RESTAURANTORDER (id, modificationCounter, tableId, state) VALUES (1, 1, 101, 1); - -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (1, 1, 1, 2, 2, 1, 6.99, 'Schnitzel-Menü', 'mit Ketschup'); -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (2, 1, 2, 2, 2, 1, 7.99, 'Goulasch-Menü', ''); -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (3, 1, 3, 2, 2, 1, 8.99, 'Pfifferlinge-Menü',''); -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (4, 1, 4, 2, 2, 1, 5.99, 'Salat-Menü', ''); -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (5, 1, 5, 2, 2, 1, 5.99, 'Cola', ''); - -INSERT INTO BILL (id, modificationCounter, payed, total, tip) VALUES (1, 1, true, 14.98, 1.3); -INSERT INTO BillOrderPosition (billId, orderPositionsId) VALUES (1,1); -INSERT INTO BillOrderPosition (billId, orderPositionsId) VALUES (1,2); - -INSERT INTO BILL (id, modificationCounter, payed, total,tip) VALUES (2, 1, true, 14.98, 1.4); -INSERT INTO BillOrderPosition (billId, orderPositionsId) VALUES (2,3); -INSERT INTO BillOrderPosition (billId, orderPositionsId) VALUES (2,4); - -INSERT INTO STAFFMEMBER (id, modificationCounter, role, login, firstname, lastname) VALUES (0, 0, 3, 'chief', 'Charly', 'Chief'); -INSERT INTO STAFFMEMBER (id, modificationCounter, role, login, firstname, lastname) VALUES (1, 0, 0, 'cook', 'Carl', 'Cook'); -INSERT INTO STAFFMEMBER (id, modificationCounter, role, login, firstname, lastname) VALUES (2, 0, 1, 'waiter', 'Willy', 'Waiter'); -INSERT INTO STAFFMEMBER (id, modificationCounter, role, login, firstname, lastname) VALUES (3, 0, 2, 'barkeeper', 'Bianca', 'Barkeeper'); diff --git a/samples/core/src/main/resources/db/migration/postgres/V0003__R001_Add_blob_table_and_data_pg.sql.pg b/samples/core/src/main/resources/db/migration/postgres/V0003__R001_Add_blob_table_and_data_pg.sql.pg deleted file mode 100644 index a070e18a1..000000000 --- a/samples/core/src/main/resources/db/migration/postgres/V0003__R001_Add_blob_table_and_data_pg.sql.pg +++ /dev/null @@ -1,2 +0,0 @@ -INSERT INTO BINARYOBJECT(ID, MODIFICATIONCOUNTER, SIZE, DATA, MIMETYPE) VALUES (10, 0, 72861 ,'89504e470d0a1a0a0000000d49484452000000c8000000c81006000000fdc872dd0000800049444154789cec5d077c5545d69ffb92d04297d8404db020c15e028a9817052c5850888b65dd447445d85d753fb16b6eec8a5d41455c13171509764511352f7614ac80080a449a0816a4a4e77e73dffccfbc37e7bec90b5d77f7ee6f3d9c977bcf3d77e6cc9c32e7cca48aff5d9b731d618174f552c00114f9cda4db8bc16d754d6ee67d7314f0ca4c9cff3d00e76e2a63ffbbb6e945726a9343926b7e5fb2eb8ccde26ae32f2e7fc92ec8b3677b8eff5eb6a98cfda75cff5320cdbbc280ae024e1ef0df003b00ee88bf17b3e7803b4e92f7d0c0a48976de46f2b9b9d7b30a786e92fba6e0be29e6cf5e2efe41fcaf06fc1a10dfef95031fc9eeffdfb56d2f57012daf7451bf91bc925c5700477f3ad4afc39a7e8d83f78803369ec5cdba52009b29d7de7e0a3ac9e49afecec6b357847f2479cfffaeffd42b0c185180267c0d31d042c04310cc140ca054086cea4d0aa6a501deac608b1680b798b0654bc083016f05fc50c156adb60e24fafa7dc7317e5a327ecfc6f7bc0f38c0fc5efafe941b01430a866e50902620872bd4086058fcefda1a571830a280966718425aae8f5190fa8dfa3120d7e8779283160301494e3e5050cb11c9d5ef55ae312e699cd2b8b5c935c97340aea93d49ae5dc0b0f80fbdfedb3d9030a0ab80f62c4820e83e36e139c702920091e52205eec4d20b96b56923c49ec507cedae502299cff6a35a0ad540ca9d35aeedaee2d298453437f4e4f9737f7747af802e81ded558b1931961c57fecfe76b77d128241daf44acf7ffeefc2caec02d51e8fcec98f815c0afc07da728dc29717e32bef97871a46f29354ca83b61fd7542d416d7fcb6f63221aa2f5c377eddde427cfedadb137eb84b88f7d6bcd0a3bab77ac4c38012cf032708cbcc7b0f1003cef300df357141f7870129a451c1a063d2d70ae67f57f3aeb0020e6f573ed145f03b148743f046f3795fae8767de7a48468610ed4eeadca5f34572926ddde2fc761ba45ca7a535b693cf39f3424b5bc909dba9768ac4c742349ed47843546ed738a3a3445a8a1ba372bd9b926bb1935807b96f9e3c0bc8b31e07cee5d1fffea4f0c6eac6f7ebea84a8ffb276e9ba57a45c2fa89ebd6e9d10bfcdfbf9e835ff924ec8b47bc6af947cff72daca168d6f290a24d75a6e49de489e09f6078422d1f24d3064b62f89bb9e40e8776a6f1790f03fec952ca4f29f7665039242a009cc054e03260218e781b4bfa24b17e71d212e587ddbb85e6542b46dd3b9e4d46952213c99b2c721df4a6ba45de8f283baca7bf70a3dd8ed1ce10fca637c0523d54104ef54c336ac70e9d62b3c0ff85c312a8af7528101f96b187f575c8515ee54e86941e111e079b83fac70799f8bbb8a814780e7a9f703cf1379461b79725c1c2dc11d8d5d974c9403b35363ff05e3e5803cacbacb872f09b17cf477e35fbe5d8847ca479ffacd3772c05e52bbccbb5e3dda08179e42548dd79b38b9f88d6f037f1010fdc207a61e6080ff5328962bac80291971bf931cbb0c9713ffa90ffcada1cd1d52ec86f46dd7f74839cfaf6bd3ed4cd9dfa195a18b7bf490f08ed08bfb3c296fbed2f9a5c3bdd17714c7539352a4702e7f2ef062c24d794b302e5c3c077a5c7e03f21dc1572a7a118b3cd3f59e1853552565af5bc3830b779306d47d0d5fce7f5488758dbffee5f97f08f1e592770ade950ae3c5cc07effdf967f5889647926bc8ad96732ecf24e7d7b3e7c38024bfae79ff1f57a1fcb72890b0027a8061f1cf41ac375e6174fba5c7d490b49ccf9973dd5b474b0bbde5fa36a9674b8590727ecab24172a089279d3332e6c64dd0d910f0af930834298e0a61d87ff2bfa448e6021f053cb1e220dc351587c68bf1b5f9186853028ac4059fc5e0d3051d1e096ff2f2def5fef2a3b4e86a8baac3af1f21c4ea51cb9e9afc8c100f3ef08fbf7c78bc1035876c98d0d04fddab0718065603299ca1803fe0ef3400b985470ac535effbe30ebc2d746111376008f1d0ab84e7ae2aceedd041883dceec396cc810e9391cd562c8b07952417c18fab4ef1bf2a6a39c375adc6a18244a1e36da7031479be32491b78d378c22b82b0fb8499f29ae665fbee124e5b2e1a086215f49b9ac9eb86eda0bd2d39efbf6870ba64c11e2e9cadbce5abab7ba953c98c646402886c6a31524b9df648512de28ceb7e3f59fae40220ae8d014b227686085fe2ec45f6a6e0c771c2c3deb8f7a9c34525ac2a97f4d7bfcfce1f29e5d9cfebb2d147605908d097f0ad4d128780e6e12cfc1a600ca809fc13c94e2c080c157255554a3807f0d3c8caf570331b987b34957e3418d177d5f2ac4fa9fd69cf2c47942bc7ec0e315fffa8b101ff678e9a33558e3696800dc17cf9c0e9c069acdb223c807de7fcbe26518d055c01907488610290c2909a3cb4a2e3df06221da7cd5eefacb5e91b2fe51ca8cc1f7c83f5ee3bcde6a4693868c033c0cbc690fd8c5046ef3b08b418f8d8b0413bda2175030f04c2a347d07385a63ebcab39c4322bea2a89f5a7bd4fba942ac1ab674b7717244dd79eef997bd592f656f60e3cb0d4ca1d41f059c0ca5a34dc83d1aae58fe381e77687b33b085afb0027cd19bf4a4bfe670f6e1d7f56ebf548ea369cf7c75538a1099a7f55af7dd04e96134a6762ff645746771acaf38bcb0a7a81509356d45142e3b55e1655ed47e96ff2dc3dfa3dd2def8a44f172747f44e15e2ec3c3c0cb81e78b223ca7dee32a5c3e17c6730af78097030f6bbe8a0c3e87629a21be72357de253e1459aaf22834f21c81edaa82bf479e8a1dda5c268b7a4d309d74a4531f4c54bbb7e768a103764bc10bee66a21fafe6df01d3b22aba7e58b0aa66111360db1e894774d18a2c5784c0521f295220ae829e23f35add25540875809fe4941bf5d464f2e2dcdb95c88ebcf9cf2f68b2f08913ebb43c3cc41f29e502832cc4ff2a815aff98a2320c7246f618d73f950d35b4cfe144ef2e7327a11462fc2e811fd987c937f69c833d10ff01b93e748b3f8cdd5fc6e923cfb8ac897bfd43b5aa4f6930a629743baaf78ba8710b7674f7bf46de9698c4effd7d7a79e2adbf9aa50eb5658b40f2ccad3623cc937d65242b496fa0e2019ba11e0866afd3d5e29db9b812d74b90a38a50ccf5230243be8f2034abf3be61821323eef5659faaafc2d2b74f219afc93f9e25766b3922cea2c914a6055608fda32d1ae0b94ed4c2971e880a20643825782e338ae7295c3e95a99e032e804780e70177912c59a83c1a892beeb3c88557b87c2a8ce7b2705f18f765197c4e15e90a075f64c1656a3e155ea8f9cc637c9a1e0ed1dfc8cb0939bd5b494fa345bf56e123a402d9f7829cefcf7c5888bd871dd2ed2b69817d32e1f52f9677c5bde729187a023838d1592d05c023c02bd9cb5e05244552b2291cff8eae88024e21c3e5771714dcf846875a214e9a72d1f0b1b365fbd6b5aabfbfb3fcdbbad0ebfb3c1dbd2d4fca52bc45afa8c42c7a856792e50fb9ce0bc8877a2bc94725f04cbd96a1e86731fa25c00b40af447b382506bde41eb5c96f4c9e33151f49f8ad60fc4634bf345d6fd2159a93b27aa72ba4a1744ca7f5833b0a71ccddc3e6f6a91662e6fd6fe4bdb45688ea97d77f010e63f28c7ea47989feee3039760ad8cbe8ef2e60647338df92d71f5d814414e0032c24f11da675ede47b1c173ff2f0928b074b2be08456a32748d7d2e928fe6ff7cb842f8833a3cf6eac2b4c782926d47c087819043c4f2f062a3c4baf4144713900159e093c160250cf459c3151bc10d3656c00293c532f5e2abc50d32f009f0acf56d92ff22b2fc7f7d173cde3b3c49c789c32e0bd366fe039739dddda48cbb8d3693bfd69b0f4040fab1d78defa3942bc77d0f3fd67af97377c2c9ed116363c0fddbf61e018507aea590c380ab084c1c50cfedeaf8802da838e33844666dc5bbb4b8d103bdd97b5f76bf2efa191a15927f83ded4849f27b46cb99368894a14172ed3043a3848552638ac48de25a3eb421a30cac126d6099f42a809362aa04bd4c162a73f8b8b018709c5f32e0285416534c8c5f2ecfa6e1a5e955f2e97bd3ae94dcd4637797be50dff5831f3bbe95103b7f9ab9fc0be9617f59f5ce0d3f7f2af0c980590c87bc9342d10a02bf7b7fc17d6c9edbfe06d21f2d84155620517dc60e27ef7a89ef1a5ef1d8c49b2f9396e8888abbf3abe4d499724beadb779e246fbac2dba7e521712e385c5dc2c9d5952eb4f1bbf5be6c06c3faef70d1f573b98c4eae41c705de53d309b3f787d9fbc38ccf30a3aff0fc24df97cb20bdcf765fbeca95dadc10175dcefdcefc96b709d165c7aeab6e7c4f88bb9e29fff3a27385b83a34b174947c93b3a7f36afa27eade361f2bd8fa76055ba2ce200da18254d425a4a0f092425d8101ea6e0ec75bf17215e072ed7fc788fbef7978974764bbbc30e9dee9470ad1f9c25d5f583a51fe7181d3eb9056861c303913a69c858173b9e6fd6c9563848838bddc24e3c43ebe368d5f3bff4d8fbb00bf0cdfd41017bb52d3d21ecc96f27bf0b5c7be37ed2a21ee5835fd377fede4ac4bafbee4f057d43de92a36a0e5bad5f10a527d4a1ae45b87bc28bd9a0c0a2627342f6efbeb8fe2818415d01341448190b43d8e4a39addc8f399ed6f9921f1f9d2f3fa943eac4ffbb2cfae7f342c3e35cd60258f8e3d00d8360afc203901e45a67a9776b9159ec742539570c15d71a2a2a7435cf9e0d1e8d69845c72c38edf910ae426222839e33435c01d7ddc6a70bbc58d5b54b5c2df2f31017b71423c00b359f59069fd92a24e6ccdcb2212e7df51367a7ec2907d5c0f61d730b8438b2f4d495bb5c29c4274fbdfef67b7200d6fd5253438b8f3a04e0022a0e847707f0b180e094f2ef7588b3c07c6ebb5d78bfe6ab44015faeff71cfc3693d2609d16179467ab954acce0fcee107f96b46310f7843f4e67c27fab53a6444728610a8bc2f0ceaa62762f5b059c888cbb14d3e329907efe8f45d176f2f34e8337e93876c897e9210977ddc317e81f390dc9692675ca12f535674bc54885dd6779f709a84596fedf7ca37c3849875f3f44796eca5eed11e495e621a7c319df2ceb45c43b1e89e5ebc25386fcef57b5720a80f50c12661288ed39ebbf895f4b652d31fd3bfdbe4d6f2b70ea1be43fd18b86dad8026e8b0521c7a82aeb4645971973b8fc5564b31e0b2a13866824b5b6880b2aef400c18020d73d177caeb684b8f800d4316c169a2ad4aebc7aae1821311ee2c2341a17232f60f44dbc140561f92a241608716da1d8325d2d3f69dd61bf9385e833e1a4437b7e24c4d7bd679c551e1162dda45f9e6df8b3ba470f38c569ac9e84f6682a31a107c84362db3cb4e5323e4a14f0e5fad2d327bc947385b4521f68b7ea8db3e48f473b3bef72b508aea5e5a2ff660a55c6aa0d01c859a596b3e8dba49c15a8fbb4bc642a26f85a1d8d8766cbb1a25702fab15092a25fcce8050c17d02b64e322a6984c7ef39284e42a412fb399fc16b0905c1e70572bae4ab1052ea79d33d0af70ef727ad76306ad1262dff29c65cba5c73163c2ab777efb286e2295b5185071a04358f4bb561c61866f7345f27b5720aaeb759ebbefb2f51f77eeedad4608b1ffcbfd4e7db1a3ff5be8bd81fea2a17d714de13958a476510f5d29da466120b64a038759302e048b2cba7c65014a8f661470d0c180cc648be585164f42683cead1480f643ff01dc673598c4f12b330eecb32f80c93258745fe584cb8047f570ab0447b380a77816769854a7c293c171ecd4c78343cb6be9562cb69b35aeeb0e7b1421cb25fffcbf6972a7ad67dd3fff646ad1035376fa8e079f35e4fe087038f002f31e1761b706410d15e4ae0c3571c97ecf6e88043d709d1eaa3f475d3fbca1fab9db69d3a095feec860898057c255126f3e0ca29842cf54f7b1fe136cb1991b44b1fa8a02e08a5e72392683cba45fa80db002f57ae6f1307ee3e42fb3297e35bda007a5e871c32819bf31c55a01fa61f06fd2afd49e378dbf4dbbfa8973fcecab8e13339e1d203deb1ee71cbe6ed92d5291944f5dbe00c9247c2d84d27ff9da87a738b57b245bfdfabd2a90b0023a0b474e1cfb1edafbdad41be53c76ceb09d9e901de0fc14aa3ce96f22e83904f3da155e06415985e18bd08ef624b82b6fb7e894a04d45b7e5a28069a61660d322b765bf04b355c6814f2a2474f11d8a6f872d9697989e439ca7021c218e6215e210b49858c13c9cd8402b34db8185e22a40cf926da62dce2c66d1966c999040daf72d4ede437272e84e037aef2e3d9077339f7bcc27ecbdd158aff3ea115bf6bae0a102e02ef00860097e07becd1409d56d60b1df571ca3fefce02b7b2f971e47dbf69f4cf73d8dd9cec79d4e8ff3282bd9623059e6b92ca4c843300ef3ac2bf5c4e9aafb40dfd1868732902a028686a2c72bc8b35808a9c44cce207e831e8e85dfc266f2cb43ca4e52c388f31b01bf0a2f481c0a0ef0bba543b65231fba1ab8e6376bc3b4f52ec76fc3e977ebdb3109fcd7beb8325efe29eb002dee326d4f24b38c1c59ab671dfd65b6cffbd2990b0023a0b679582a1ef653fef78f3fa3183e4bfbd50bff3a422117031a547607a0e3aeb435be80a1f8461ebaab45ba778e3d26c039e43bef268e4b49f0b5c790e2c7416c767624f2253e36afacb09585ec4679ec1676c002abcd0f41c4891c8e7f603fd30be2fa1e7104b070e588a0a2f08649b450c3e93a74f46f0f6cd1a782d17b45edf437aa087b43bf6afad3e948ae4e5e71efd4405e9627b735d04e89abfeb104026231a062c002cd91c0e135ca0ef4c0594beef79336fbdc9df5baad3e89d2e8ff80af06ef17ad737a3f2a3dac7b69641064c2926eafcc45973564320e0b1b290514c91287ac90d0d538e89bec3c69f13480736e83797dfb82c3193dec61a46997cbe08648935c9ef160bd91e2d3d923da55df641d773fa4b8fa4edba0e377c749b105fd7ccb861f549ea16ed81907cbbc00b184e8a2413300258c2e016bb7e6f0aa444010a7e84e440bbe41f8fb61a72bd64759fb49bfd6caae8c4e78b5465920a59be15020dc4626ed1359dbe1ab7c80e41043e1591ec5c65bf4a2f4929289e665b6949b3e5ae760ed26e2348bbddc834dbc000c947086baa9e284ad47396e48042aba5081c21c01c786e1116e2d3138f9e8e1ddc17c67d0ebe07f8e685b8dad4b49f7ec8fdd2723b719f31f3a649cbedf5b71eada401471e090d382a557381534cb988118d009630b899974e3b960651b7a77bec9422278a9cc8a04e9356c81f478bb2c3e78a449eafe2b632b0369519c57361c0d8428a3c64c4d70688be635bfb4abc961833882c86464c3131fa01f9d8347e631e2fc68596bf84fc26358c821e8e8bfb0a9be4770b876c9dfd9d65fe1ac9ae1bf67ce3882b855878d897535e953eff2f7356de545d8d9b10b2f588a3087092ef45c04b80937c9702d2738b3787d3f8ebf7a2405c05e20b6d865f7d5bddce774bd7fe938e4fbdee87ac16887e7e419ad5c58c854c144e9e0362ab729a3f11ef52825c8a8167cbce2041a9b4780ed9ba9010d95316cf2116c3263ef3189f0a2fc3692083f404adde53c806888d4f3e00a712df1b991c602bec2a80c22b43b2c0c62eaab2ba15f9dc68d0d9b463861c650b7629df7555df3a217ed87571e3cbd2725bb9b872ce06b5ba151b5805c049a1ec81df6940d2df29df3e0f7fa7cd37576d128746e19f7ff99ef4f9d78c993c7aacfcf7e9a13347dc16e74904e5577141f25bca4230a5f8aa0cd433e9898dd1b37bd6444fd18f6d1552095cd1b31b44267dbe56e268f9a9041e06fd0ab48949df05fd2c6d6025e437e6f1327a317e2b8cf6284cc22f85fa2c1e9495df606859d1ab741cb1195768ef942eed2f16a2e7b23ec7ecd1284568ce336ba6d7abbfe92d7b4a80ff85c14cfc7d3120c97744c12dbf36b2bd154858019dc61851c0df3a205c3dec9f974b8d1aaa09650cf0b7baa0892e3621bba0014bc1e262566a4f42ad3114e318a3b0ca4ed2169760829167f11c08d769948a9e54001be29fb3c7b0399f68854158944f163a13cd5c83c8469af14c240bc442020ee887f19cc263969c83b784711f2c47840073b445a8ded3dc4555168a93efeb055c29cc4db4e09ccc502bff1c889dbfc93ca4aab710ef2f7ef1894fcfc41f6960e55a6026eee303d3054e27ed453692a93078c380f50da2bf5e7cf79cdda527ddfac1f405cf4bc3487cef94f869e601c5cd437e956cad81d6d0682784d57a622b51cf594330067dab67ad4359da63b51944d42a26bf2cbd564a8fcbe867a2554c7ef98e08b6f4dae09a5f26e337339e5fc7257963ed51a2e91780be1b4f3f29bfb68a7a9a1f36d32369d9adf569ddf714e283da97de2a95946a1757fdd688ec43ed41bbc01799bf6b1c7f0fc82fbe68f33d91ed5d488845456a087f517178e11d859997cb0eb83b943ab23a5a2814cdadf18abc0c752ff09e48d61c0bdc53b8bc4fe161e03d919b33dceb13c5fb20d973ac17567f47415111f0b0898bb1820afd143e12f840a22bfae07dc467b681f7d4ef233eb34d3e9502f22e1543f15cf43bbda198d6c602efa9f7fac9c073268ebdb4e4fb543b4d10c38def9f8cf7802f79b7c2f3894f4458476abea8104be1d9f88e22c6674f85c7f13994f1893dc3c0d758e07dc047ac7d894f1e586ad695f1efdd479fb58310877bc737ec8182c3560b0171c0508b73144cfb55413f29c3bf42df281838dfe53110cf6e2613741fc9356dde29e5baed9c8e7fbdee0ef99dc778f9a9efc7b707f65443bfc5c92fe480da09f2ec01773dd5bf28f0f3747b9bf4347dcfa42f9f37c707d1efc9e42e6cd297eadea43f99f15b64d2a382bdb8f1c6e538b17c107dd61eba00d065f4c65ac685cbe88d34e557ca5b2ef07093fc4e66ed61e33726cf54b0b849f24cd725d5e32aaf951e8833cc59d11a5bf5b47e59413a80ae05b2b7b85ca71cab6008597f0ef6a0d3f2b9d9d7f6f2405c05f46ea2ca691429ef48c36acc9f163d2b159bf3b2f3dbbefe80a6900c59fcb00bb5c59fa32dd90db88fecc60db84fe1678a5fa2f8550e85aea27469fb0b692d66e277013a0acf005e067c10a8ff13ffaa95ff13069fe98ccf74c667bac127e1d761bac9c722ff6850c991fff371daa6a358e1c4a7b4c072189f0aefa70eda9578187c636f2cbc370b7886e6330bf7115f59b84fe1282414fbd19bc05719f0189f198ccf0c7c4f0eee53f834b45f2f1520927406e1fd8bf15c41f4f766a64f86e6868e6bb59310ddafdfffcebd3e95defbc2499fbc7110fe488b8b74fe088ed2d5a12caa1ba1b4609c0def41f1e8b62e698a0311db5e1d9bc784ae10e2c26fee796d5f3905b65cda7aef470ef16939e3fc73389ca9d46f2804a47eabd4f54a9003edf9a9509f8bfe58a5e439ee585ab437e88da1f6d65978aa7f4ab52429fa65267d87f611cb31e54cca2bc95986c1ef203cc1e967805f0a076620c443f40b997c4cb5d02f34db234e0a329be2578f0bc1f9857c825f3d5ac3144283fc717e07b1f6b0f19ba343d2617ce7623ca7e86d645662eb5e6d2bfd7359ba8dd8a76ea91cd19f3df0d6238b60207998e93c54b87b3f02c213a1dd80057674f090deae0b6d0b0023cde124d1b59d14885eee2e51c08f0d8f68bcefec7ef283d3c6b6ec71bddf00d95428d574819e70292bc51ab3a41829290e35614530b02a2d69b622c9e25a2c0f5f85b0a6b2823d96661b17322860ef53782e14de4cf065cd26e17c5a43534ac1165a425cd64d1dcd7c7c6fbc77ac7fd25b6d7df5aa5f779122735ada9036a31384b874cc197cc4d68c1cbccde433072118969e2978b6d946a64fb6d8bb55763769b1b5c86ffdf9c7270831ffa5992b7fa42c2d3a10687740da5e1b8a446fabbd8709b5d110065ccc5e8adf75c80a7ff743b1fdcecfef30460e6ca7ceb9d8af2497d20c4388cb970e2166a9ef27f9e56b72907f92a7e2666e92e830fa9516fae84f6b882b58f1eee03e937e89a60ff9481ce2b28f374b7b8441cf16e27218fd60c5bbfabe2c8e379dbedc5c7e25be58e19610d726662576d8a3cbfb590572ae7fe999752fbe2465736de3127d901b9d4b028fbb118650e3b90a9afb1dcbdf6150e942d64dbeb6b5027115a0652682fe59cc7d1f3e7d8f47ae94c8df9ce3bb0f8fb3649215e8553673ad2007b6046ded51890aded8449765e0c9d2295d780ee3b48554c8f8cc637ce6313ef30c3e4991f042c264e9c0b64ae16226e0c9765565f9f8cb977c37f35d39018e9f76f9f83ba50bfcdae0c786bf2227c2da11d5dfcf961371e617bd2a0e90967ecadc947fb43a41d8d78c2c15efda831c048bb9b99b3a264f9f8cd62677b96bd7e37638540eb85f9e297d13e73378ff5290ce19a181a4cf6bd8ddbc4f57b6e7c67f89087a22c0f562b984e7e5dfbe47a684ad32d3873df2bafcdb27ce14ac7960cdc75291cd176fb5a2c677c310908a830a6351cfd4b45c2438f0c955efb5243bd8924738bf9516fab4d8ece8f180fec3df5141ee7dea0da9f70b275778cf44dbff48a7b79fd66a6d8f40d624537cc9f8658bef0179b3ad51062ade2df429bd3db6f6c2f865f2eceafe85f424be5217a6eddae9342176fc7eb7cf174945f0c5b28af98b17abbfe903da48aee95c1dac859082d16b7f8b18f102c048531c24bab6b10249e4790c5f3226fd40e99ab538a4f5c5b71f0f01f4bb86b6f6d8dc023d1a1865505fab90764b27fff102bd98001518efe3e994a5420599b2e1d190e760e33360d16945a504bf0016799916a812f099a9de9f24cd962d6a3b6c7b7841969b9e4098e78001f853edf27f7f76b7100fdc3f6a8f871e16a2aa68ed71d5c3d4030d3f08f1fda3732b7ff4cf6aefe2a52f385b883d8f3d78515e963160884fa59878b619f13988da178a5c0fec24167833d3275b6e685de1171cae3ff9b7b96fcb81f3fd075fafff15e78fd8065c23290e0a0150653b425ab6cd18290924def3387a7efe946bbbc9df760cbd78a4bf5545cca3863f1450ac99eabb9821c417c72b7532897abe9879e836f97518fd4a6bb24325e82b7ac1745d93df589698491f8befbffe75d59b73ba08b1d0fbbc6e9a94a70fc6bc745a991c3191479e29f6e1d457c6ffe519d9ce150b262ff18f969d77e327d3a73d22f5c9a3df1ef1ee5eb2af4e6d9cb7441a982d8e6b55eb9f0fd332adcd313b0d13f6ac2b7bc5bb6a0fb6f81e935b3d2e98bc252d1730da63a3b32737b2e2bdfdf22e37ed2447f6dbdf3e5df71ad27bc9d3d0903c11e6a19047ad3d6f78269b9e9db5ad1488ab802e1044d3443d8f6ea77d769914b0d017a1257d8e1031019c89b4dbf06616e85187c60a0915ac4c1a322901a6048c7b0ef9caa371c66182b61412dad381599e3bf19db38969b6bcf2b6580f1835c16469cbcb059f05a01fc5ebcea969f5ebc542947e77fd2f77fe24c4bad77fb9b5ea35f5223a71adee1a05eba70bb1b870ce052b6f97e4669f5179c233b2ff86a53ceb9fab62b7e4b8e5851060a13e39d1453b1434c56720dd9314ea547542a4549b3be2bdd137b77fa5f3e55539427cb8fce57b67dd8defc191a30dbb29a8435a8d26f44600a7ac977062a83d6aa9480ebea3fff8162be4eb67ecdf6ac2b5f2c74b4446dbb651c5617aaa95a6a72a5c9d9e4bf216c1f7e7c57fbf80a72615c738e06a0dab34a9fc2a7af61d1b5ce0eaabec068b29776c2fb9eac675bb2ebf40888fb35e2ffa979cd0260dbea572f22742cc7de1c3590ba442fde1c64537fed44ecad79c5fe76cf017851bc4f4fa057e238b37ebbacadf1ffbe57d7f7bffe56bbe1bff93f47c67bff8de937e9dcf8737bff48c5f70997e4687d3174ac5dfa5a1eb375972fe487d256d40fbf64204f6e0ca4a5a70abf8d705b7d6745d458f57d4575ada23a6a82a403f0cfa8a9e6dcfb0ace6856cd3f66c79d68e52d2d7ecba7afadbb21d967e3e7fed9a2fd4df1ab96144f2bc7b62a843b111c030fb3de9b5adb3b05c05fc0197fde491e3fc13bb4237a4f43e7398089ea8d7939da8c74e34132e3b412f76629ac26327f65156959ae85d64a5509655849dfc579eec6434d02f4336d550289088de369af83470bd6db4ed64b76c64af94e33d31bec3463b683e3d337b449ff406bc48f1a5b7b7e6ed1bcb568972feeef8673b3f2c2dc41f462f7af89703a37f11feda877fd51e09788a823535d2f618975a59eba70f3ce2ecec677b48be5cc6a7cbf874f13ee293b27458fb5af8a476099ed4188df87a433d9cb06e5e3bb6dcfda601ef4b393b3ca5550b9c7c48d02fdcf2afd45440ca5ea16c2c828e4953af7590e516062ea78c3ea9a7f41ff87e344cb072a79de2daa327b50ff8f5c03fc91765156979a6ef2779c6f32e9767d0a3f6487ab29f0e6418f4253d17bf96030f1bfc5ac687f741e3098d52217fbdef87d74cea21c43d2dffbae09aa38478ebfc7faffc049ba0d64d57b0f62a056b8e50b01ab0ea4ac02a05375c01b821085f39e1e1fc0ad92f631a0a8e1c31497a36f3bfac79ec3bc9c780c69b7d3ebc64edc1e42d0e57e3c463f21666f42cfdc7db3be9b88bc933e7b7dca0173c3621bacad3e79293fe791c9d8048c71ba499509fec896c2c92eb106d0f4f72ed32d8ec6b1b7920daf38828e8bbf8837b5fd2e318f941a98569e32fbc4d04d720289b293f693e7a099e53b8ad10ab582f66533d48f30a0979c8843c876c58105370767386c573e079f396453a67aea2db785fa3e74fcc553bac9bbde40969695cfee3a039d252fb6ddd4fcb16f41562fde85f572f9296c6bab5bf5ee9c3aa9cb5af2cd9533eb8d4bbd08f25a7b44bfbb6cd6449ef84d08ea917f8efc31a8325c4b764e9bc6b5e3d4c88672bee396cda1baa7feabb2958d71710bb85d67604bc5a88d36fbac4c9919662d7017b753f4e0ee4384bcec5fb14ce0baf62bb052b0fb3d8b2a9a50e11008f2daa3ab8cfc4f99a19da37e5c4d453da4a8b37343de5e799d2a25df0dba75faf6cad5ea03d10e4d737c0b56fa0b512a44b36926a5a0c1811c6458587fec03c62d4a91baef50f2e7bdc396bfffde3da23e651b755fcd93cea2415deb1c5f3d1b86f83d11ec92aa66d3b3654b2f6b6edc185f1d1b053dd90f5526e2aae2913f7490bf88d6e8f77fea0859cf84a1abfa8c39a13c951edae800b14240552b30b7e27c57235f04780cf57b0ee6cfc0e58ffad7cffabf5f7fa86cde7bfbd3d66f63a21dafcadc379f3a4c7bccbfdddff7984348442a9ce9d2d2e4cd01e6c735289a9ef250fadb97b8655b2f9c2d5f4d5df5ded4134e9513abca25eb0d07226e1a647d2eaa3f4fb3aaf918afafd2797bd78a97a904257b45b3585640936c03321b9d79b912e0674c5465e5b5b81b80a6805028bcd5ffbe8b3eee409e74bcb2f549752dcd79fa8f81a44aea013f594fdc13b3469819e5ebb50f7bb586328463a60330bf4f4a2652973614b112ac95779dfce6a4c84997c20269ef8ea47d435ac9382ffe382ca3bfdf32ede2d7eeeb5c7e54435e5e33b4794e408f1c1292f9cf5e63942ccfc7ada981972c2fbf4cbe90fcfdc4f8859def4b299ab25ac7a63d1277f937faf78fdc78fef90f72f7af196e913249d82673f7abe83106b1ffbf9838fbe14a2ddfb9dbeabdd5b88d617b7fd79a7a9b2cba7a78c6e257d9d0df7af1db0500adca30f5d7ecedda74a7eaa6ae7d76260d761a06bcbb13606bb7dd7e328df823ff1ace157ddb28fecbf6b52f66cbbbf0886f892145ec56d2d8173549a9e38addbe1d3c4165b338ba01f9462c6c04b393275e755720a9f31e3d5c8e734e0e0f2375c0788ba8f86ef000fc57de4f253a156045f580a28f1d4f92dc685ce132267c089d3eef7d75a5e74be687b725c482a1ffc4ea5ad4758ecdeb6e54d3069840ca332f0906fb4472c0463d2e715d3961d1bf45a9f650f2eefee86e36a5e17e2b5d6131eb8f578297fe74ccb9b0f43a3a141419af0497eaa7756d07f2e0aa7019222a901443d4e0d14482d2994b3400f864c3de4b31e8acaefbf050fcfba7fe900c9ef4da1533f9d25c41e5ff53ae2b8e512efe0f44ceddf647b44bf3781e19285f631be3f2e09c1a44786512c5406838d19463cb4ce16f503fde7249ed752f74bbba9c3a7d26e1c36ffd6d7657bae7a71c95deb90ce4b21672dc7906fad482628c80b10f55500181149aeadad40c20a680b0d21b3507739d0f63ca9ff0d7e139de164743d5b04d7202a903595c1b6f6d0961813709be545965d31703a8276aab6c82351bcc4f41c028b967c0d82ce639882dd7d359f81ec97e8fbd6afff75dfefa44536eba8e9fbf8f34ed9cb77ac795c76e0cc5ba6dd31738c102beefaae66f5d7b233a778136b07ab0faa234f804de87c80d6a190a8de178c57bd35fefd2b567fb77ef59fe4fb96be21663d2bc487552f1dfae21affececd6fdbf9696da67d7be75ee6b122efd7efe9b3ffd4d3d5f8b350e1ab014baa2815e7b8f1023eebe679fabef950aa9b1ed91071d248203442b00d37390ada0f02c8d2bc380efdebbf9dbe12b0b3f2607d1f7a6f44d9be01f711c99f8cc9269e3d5937a8001d69fc37edfcd847aa0458471f98ae4dcd537dcd173a5102debda7c35daaf03e115e4537545b6da01a1d25c246fc2a38ee03b4c4b36960e3e26617b704328593a69255b2be04923ae28f183329ff47eadfdc37d84f8e8d1972f9d834a0b9ac8eb497e208fe45954fd49410a5955f701c42230290c4ad6a885e751831d05b4070285a23d9c37158cefc7c52fccfe6a956c91aee97bdebefc292176c8ea76ed3195688fbc84ed51093c1cc59bbb6798ade2bd90d622217fb63db8d8fc60ed3fdd4f6c5ef3e9c97fa5d4a49dbd502a882f9e89ccff0e0a9cd6f8eaa128b4a70d83a91e5ba3e83de358faba9e514b44926b2baf81e858311558b9429cd6f6922f77f4832a45ce9b87fa165eb01257e103bd760ad795a25e3cae8f6ca50aeac9ece84a1c65491e8237d453627d29d62e6215b854c16b54bc7bb14a72aae8a54a72aa88cf4ec467c3e2fa89d5d2025ad17ae12be51709f1e686270ebe51b6f3037346ce2e8ac8b9e7e0a73b7e3c480e869bab076c58acdaa5eadf0a6e4001da0614feac8745b10e1dbb6e06208ec05cfb92097ffba709d7de03280756ddbf6b26af918ae5b571138ea890bed3177323efcdc75ac75a646fac830bbcfe44c08f63fc0c7ffeb6c3fbef223d9a5b3bed729c7ff426551c4750d14eed393269c5bbc287072a788b8cf62dd2b1e5e655bc0f14c7014f58499ffe7d871f7b491fb4ebf0bd0777fc5c7d57da7813a6a23d52fea16008213bff2c72ff925ea682730151d9ebec24156a8b76734ed83d8e5f5e41ce77406015e47a6d8e5790072bbc893edf512171c57491b5e29ded7ca02bbe15bda16645f6fcf6339f2b7385786bfcc4111f97a8efae5fae60dda90a560f57b00a9be76c808221795af77f89e15a58c6be471effbb1f228be22700ee61e26b6f033c9ed191cf3ff9eecdad5e92bfaf7c6df1fb6357c5b507af201fca7644f0d891b7d41e3d59857ab0e29df09ec069ed4bd11b69ce634d54bc9bf4279bf2ccf9edda6eefc5bd4f56df9dfabc825caed3fa2b980205ede0e867078a5dcb33cdd330f8935f5bcb034165af660c16aef3b0107d469e72ee215223b678a6658f027fc2ccd7a125551fbc0af86342e5ccacc256762e62f91482ca053e4587a4541a6d6cbb7685e7029f08fc38b5c587f3b25908284621bd97f8c857c758c9bbdc785c8c02de127cfe5344a7ebda43aa57fdf49010730ffee0d5674608f1d26b0f2e7ef93269e1dffecd8495be28948bf2fa6b553bd42d037c4ac1da0e0ad6c092aac1d9c8351898dac53f9fe1f7e2f9bd418f2c34ac65d43eac60fd5f81e37d759840f52239fe5e07fab57b01d64a011db6f79f53df15e2e891f9136eb8d75f5348e9d4c55f7329d66b0eaa1dc6b1131f113214c5c8b2ca659b4fd2a98213a9bd11e21b05e929a658327047870c95a7477510b85fa72d5fed5c055c992fc4e79ee22e7f8de2d78f7e6cf37e9a108be67ef5fa8fa8a9afef04482191a781a37d1aa058745d485841da64d1f7ac73da0cea70de9df2bd8f38671e74b6881d9d9c8b42d3b1e0e31c3a5a194fafc2f7f1b5b97cc8277d5f31a337d1514ba8a728f993edaae885891eda8fe8e582fe14e073751697a24ffcba3abb302aef359f6e707e5821c48b550ffcb9245d2a8715eb6ac8732005a23dd72715acc1dfaba050c820d21e478d096b272aa8c7057918b094ebd55a8668c0f869d817b033e00e0aeaac23aa8378501a53537f2a5e280dd5eccffb1c32509a90a1f9a1933a7410b1dd8c6321f362033f03f34abe3312ed31cac04709926fcac2541ef68e783e1ff4c6e95099c2298d38368f297a537436a2c2295b7494f6008b417f94c1efd7ce57fe32fbdbaf3ffdedd402b417daa9fe74b40fc9f32405699ed05986b4f3023c11ed6127dd4c746b29103a4190425758fd4f9113dae1b79db8f4646971877e4c39cdb764f5561f83ccad3d44bade72444de4a59a3a6da14158e22d1708a72d1d0e545b7bc8e1a6fe32574f402a0db2d8dceac3194d69b56cab8f4af0f94f75fffaba355f2d3c4488c7cfbdf685623991cccd7d7fc9824765a72c6e58418a81424d3ac6bb54c1aabb14acbe13385c77da4db6ea6b4028e06a0a052c017c02f43010abe1f2eb9013063029a2daf780c3c2aebd1838dd079c16316b2f10a2a0ed0dd34e91aabced2e9d479fd943f85b9990a2588c762a403b299cd26c8bf5d25c66f4f7587f291c29b5dab51f450760995bd3e8ad5432d8d634d87c92fa4bec8aad3dc2a0ab4fb653176d4553bba4eaeb6fe544f2f98af28af9ea89687d8b7fd5af003c44c13aaa7f414cd91b0262b4058f0a4644f71a3afc85412baff163eef78a11bba8d04dbac16f3fc261c8e8ad31a0584b316a32743d90c22bd9963763f4d63cd180859ca0143d1a07a400686b13c1e8d9b7fe498fff268171f6c56e919c27ce1362cef3efdff71d26ea7ad4d3d462c2a7b58d2a84a6aa10d9a87a48c1f5eb815f69deaf17cd2959833c1aac5135c0c368c0c447fda4712890465230a45848a1484fe5a78796bd54f5ac10fbfce3b0bdd6499fa3fdaa2e6306a4c5b547265a89b62aa20d50686b96a9d8fa24836ddd53c8fa6f2a19b2a037956d8544e9bac58cfe18b615901bd80a485d597a6562713cbfa9a569b9ed657bbe7fc88b9f3c2b3de5baa535abeab047563d0cd17a0a6da15d2944aeeb419024423b3548ef495d24191161b9b6551aaf1b83ce15a193fc92fc409a6d2cdd8d5c35a4c76e629a2d4f839c03fb912c5aa4d9c6a5039b69b66196661b36d3f2d64efaf932ff70fca965e3d3c6ca37adebf8f3573450ea6940d01a024df0a8abd83055c12a0a59214d713df0f5879b90ee5f3fd5bc7f436f86e7307812fbbb0556810ed57dd040f763d5e3aebbb4ffbfa582a9776b8e7f6fe766a5259afdc5d312cb81e7436ccb95787aae968308e823a4005ca703e3fe58fab6c28706d281cb0dbec067bb833a1fbe0b146d0869bbdac041a84aa73b3eaba0aef340faa3bec2b1df9d0bc4c0acc238fecb59faf9641d3252fc146939758def41ba6edcb830db03df2fca4c7ab1f476fa7e9dae6bd0a3f68ea55bd3f460a6897b7735cef5eb7d3e796d6a8b2fa8ce008bb1e4a9515d904eb2a0c5719277521464d0604d442b0c82f0f4c8e3d031fc6bcddf35ce3c94ba6b193fe4811f117bff8c8b5e7d64baff9e77bc54df93d1eda1d3994d794936efc4cd336e14f7d8bce331f9e3e9ba113e8f9969f881798cc61de7b79fa8f7e5b86763efdb7726b9869c521a2fc9b75e83a690ac6342addc9a7d6d250512a86c0ce377dfba395e74e830387e2059ea006880f0fa02aa2760f5058109c533078c541f141356f727cfef36263ec9a7c2531b07344a8bf4fd6ecf9ff5e43ed21c58347be44a6c62a605188aa31a03aa1a79ed7aa2a6099e4fe870f54901e809bd8a419ae05f37a1ceaf47a8a0fadfe6dfabc047f595ec3e067568410ec486417573fcc5cbaf3bcfb8d15f1cf676693ccf5f9b89b52fda27ccea5492d5ad509d4a38902f6fe2ac9e461431454f8abf0c6b0d49ea2852af6931371ded4c8a22850f3082b48b293c693de08a63789bbaf655fefdde55e2b7f6a78844f5408a8f7c9851b13aa688c9af6950c51946667b20d02047876bb6ab45b1daeaa2787b7ba601b7e6c59f5e9f374fc26f56f72279a42c2b3d81d3c44da150a648f4446e59fcd68be0fd18a4ac210a491d6de281fbb962e17cc9f1f8e5ea8aaad5bdfc7071f527b366c5b547a0ee83d53159e61dddbe5a51139e989e94dbb0412f502705455ec4e9b3f9d1c26fbbbf763ea62d3686d4f24b8ae418f3772dcfb4d6e10286857125af50dfda8be8aec9485481dc2c1e6fe71718252ba0eac90af43c4b819e6d42619e83f440a890d028d86b6e811ef1396fc38cf113270a31fbf877ee5bd84a7d17290ef238aa6169d1c4bd810aa492790228bca2095e4ff83c764c96de5589210ddcc0dfe9f923ccf76885516b426d19ca813ee5ddbbe67ffbad10cbe67cdb7f841f3bf5156c6efc00b158b6dc728e595aaec2614971cfa1b91e4e446f633fd4c02d1367eadea9e7b569a3be4b2b0458647a80918536c5bc2f6ee75bfdfba139c76d481f13e5372f74acb07a3e310fc422b731c38559baac3dc8b22d33e9698f9a8f83a485858c5ff4db8693d7ac5a413172aa1f6069cf5aee69a2ee6b420add9247ae1507267af26878e5b43ee39e6079629cef1ca0d3b1a158ead8fbfcb59afa4beb667d776e5c7b700f2d28c7d4be24c7890d195a7c8f24f6f8ac1e362b90f602111166205b3ccad6eddb4648aeb921a4e599e43c7e3e6e0226bfb676088b34981b070f14f5fed60eda7308685c5de9adfe1e1c90061ea8c48d584226d95481ae36ddf6ec21828402f3f3c72bbc99d2729d3ae49177de244bac8782b4285d43212b4a5f24cf837b100429664c9e045314a49074ba2e06aade52c4627969d8a379f769ba34d0eb4d486b008d938478f4b4d13fbe2d07ecfa49bf0d9ee26725d92b6f9b54fc71e73c84d5733c04600be930cb90f032411e48583d9778e24cc94acb6b8d2c1e3dd0a8e29c2c35b2d0b006a5150d0d2c175052eed465e73dfdad3482a13dc67fbe0e9d8641c394db60a88f4df42ce4423b20b09046131e35574c89f945bf554d5877f6af385f424fd4344193e7408a84e4c8a228eaaf33ef6f2479a22f8242a076d58ac2b340b2f9c3a0430ae668461f38c9b9fffec661f507afe811d71edcd0d8dc0af2dcc4864ba0e23de0a958765848ee5146e9b53c2c7d581bf240489e690d9a1407f7a4499ee90b8405b75e5b69115d33481f701ea0fcb0434e3a6ec2b97bc87f5738ab3233857dcf9d5c76a21e2fd0b355260b56c949db8dd3b907abe85c05cb26706c93396f61e35e7ed6c2ebb5139c7ba5a25853b96adadab5ea4575c83aa9c5a238ad7150e19486489bd3163fe5b943d1e858f07d0ad2e21759527a7334b2d468f16b1120069cce3ec9657036e05fcce7f9ae9d7a80d2807e1cb04401bf7ec7bffcad11d6d5fdb2c3a71d84d8e7b8c3efcabf4cfeedd250a7367efe4816ab7fe09b5a52e52df672726c9b5a9600cf0b6c0a5860d06fee76f8d883ab7a870d4fafbc4d88f7663eb73682cfab43be7ca0f21e8b8df5d82a425bcc686f5f727abe73e4822eb27ddbfdbbd3cea37a097b21a43e6f05fcd09e56a556b9cd427ba8e7790539eddc908176d015d3ba1d157d5e31ad0be92cbbf71638d166f9a17cd1cc19cf08b160d6cc65df9282a0fa0e181cba10f01186935c53012065b3513d0d2dd6421ef54990e4334544d317fd5d7d89f608a9c053ef8e0c34deb2ee33eee4ef7bc97e6ad1bef585c7a688c09e619b5d411edc234be185963dc93293f41f3fb29bd307bf2b5a7f37e8a35b8598fbce87d316832352e4d46f753008abd15f3c54e861bc9b41b9a6ae6da5406871724fe9f2b71e78cbd9f2839c9cd0b8a802b16d12480386d236835b3a44f1b84a5957dd67d99e9ab2765ca4411653168f9e880ac1353d17c5970c9ad7fe95ff13e2a3092f8dfa18e74250c1590ded0d457bfa509614ad29208b4757e2526c185b3be8024178149425d1882c13bd391adb3d534ff87b98bfebc29f08201d3073387b9ed1a14c144d2793d151538d767dfd45bb953316bfe65b767b5f7668ffd52709d17e8f1d861cefe7e387d90467a9bc75b01d7ee02853db76f8b64d2d9bb91dbe83c2aeeaeaf52d562c970ae487e7a645162b0a75df0292278681568bf45d4a57a5100e296c5f027becddbbb6f34b42b4ddb7d39051a384bd827c100c22da7d58ef50d0ec0af202751f7032b0ca40cf5a60cbe805779735f9c5a69fbf1dfbd305f3a4dcce9bf4d1c35f53c1206513a2be406f39429e33853e69cd83da1385806400e982b512e024771b7b2d06545f168bd933e87cafa0ef711e15397d5a584e90691b5a743fdaef477d9e0dda61732bc8c35a91b8784e29024adfcd0a9ce3a3e8c50ce22cbcd7a417dc44d5e07759ea82ca0fff2ac4d76f7df436350b9f5f743628221c3a6d9d0a0da97f9aad40b655165638f64f5adb48ba4920154a59b2a244735dcd58cc59c5c85de52807b22858164cdde29aa3d75c22c4b4871f7bcbafe7f02fbd884816197920b4c6408be6e469b0dfe93e1e3bd6a122a48936248b099367c15cfac0efd90ce7210097d12d372159da74704dc33380d7c5f8fef79fdd892f1f2aff7d7c5ddfa5be27966c53cb5c0a15e842c0701426cbb6b3255b503f0fd55fc343911edea7e8f5f0d692ead1138c6342bdd60148975e740cc7c1bb301d06f93743529303a1d36685fa026b3d14922a33e9c58d0b93be48ba6668f28b71d0ea9ef48cf6b3e229c4c903c90785b6204fdab3cd35ef377b260e92a7bbb957c444ada12ff9bed02b298f76f85c240855631eb085d4692d231892cac53b18aee8f135bfc0a23b5bcb08acbdd8d76815fd224d4f5fa46a78d2876d6b297d8539a524bf6f350542052894474c79f352e4bd3bbd9ce8df939dc5ede20c73cf52394b8ba6634d3c703634559e0e5795cad6b3b86395a2517c8937eff16972e25fbf68cda4aa4ac57f3d424cb554e0870af06a58b0d5773148d951b4484d8b8d503cf5a729a8d71860d97917019207d105902cb530a0cb60449817ffbb6b3eaf0716cebdd0037b2520425f742e4623141c15def90ab0667155e76ae989ad2a5de2de7f94d067c77b4549ce9a469a76ac421d490e5a0ee80c76aaec653b088c34cf9e97f2d215df8401ce2ab2a9027ba47719358fae4d1965e27a80bdc1ee73d97d7280363cd470b2d34b24ad20977267ec5890ac023969057970a706b46b62fab18a77b33d38bf342e3a2edc714c4f928b0820970fc1f0b889dac06d1e46c4f2fb265e640805e803fa4719a75e9e569053123f4f6067047d563cab201f9bb8825cca6d58dda777c2207c24f09ef1f4f5ce0df68a77cfa017ebbfb1c013d2f388df06efdfdaf3823ceb826e9267ccc35c2168c36994f9bb3eea99dd1fbb526d7fd8cc8b0a090952a8ec26e16f25b2abff7b741130e20f462ffad95e3e0a078b142eba392aa073bed2b4e402ca8ea3ca5c132717712e2626e0ce19848bf651fc1e78404345b44ede2973682253dcbe2efa357c29c45723de7978c6e312bf434e122898d28be6fb28588b02bf1a1432d5a06ea0166b05b5d892a10eae7d7da982e4c934c2a2270bdfc3de571e751cc1ad7d61c7006d29128e89b211bf372284a73d3128c014d91eef3dfdec35af458438fde74befbdbcc23fa33c25bf4b6eb41fa84c49f56bb6c29dbb3d65410f55ed2fe540e190030772e015432e862adc29d6fda5f022e08f79d1ad109df355c1a8fcab7a2fdeee105e1bd7aa249fae890b6ca9217663bf634d443488d87591f748f4ef3b6322c65e6be20c2d97eabb2e253916bfa9ef56fcc8bfce51cf9147a670c7a5ad3620c748531673411f49266229e8b94e91fa4e25c79abe8bb3f6e7821ebe558ec184fc0a143eb6ba307dd73d4e1062d74bf72aef200d9ce5f77cfb455577d61ea87bc22e6431886c426d406e2b39a6f7cd0dfee9c4832e78cdaf407746a71c70a05fd0eb7aeffabfcbf688a64ac87e32e5aa58b527e1e20c87fc2ff5f524c7b1f98bf029c013cb7136e84f017d57d19372ace89f81fe8bd19b6bd03b23f1b8107ff3909a234ed3fd93095802480a06862aef179aaf05222cba3d6d06c0363f0f44c469deb170c5b2a1798b74baacc269ef201796422ef091c0b3f55e400acf87459acbf6aacad678747a96ffa5e7e8efb9f1f47fedb672da6772c25f74c797237eb85ff14c15ca3aa68b186fcd5e8058f4d685529fe13ef2342886fea5828d0fa02d4824a96d86e31f6e8286db96d748405701f2841ae18951c5af6e976b8498f3eb075d7f3e56880d67ac5df6fa7971fd45fde07966bb77d338c901f6c0d22e3ff50b79a8745f6ec2fbfa883ec02107823c1af433f017bcc302df7b46f39ac5e995e8572fcba03fd622b7aec836f0b1b07c21c71ef60c8bb597498fe8d3f372ba37e9b93a7462d2d7e30296accbda83f38b3de6c4c5ce9329f385e83724ffbd41d8132d440a97422358f3d36b63fbe1f7fdd8fd488736427f22410865332f8719043aed2022c47efbf5abbfc0f728677a0fb77ac5680f53ceca30ffd0bc40ede19af3846c37a3ffa43c8e8c7f2e209f14d21dcbe8537fba5abe397df2145de33eceefad62a2ad3dc803e3f2abfb6593afeda040c46c585c2ccd36560fc2f2dc9b9966eb253b588a0e1c9a0c8f24162a08c73ff7cbbb2bdd05c85ad0f9efac325617449d66c23a5639ab3d0dbea641ae3d8f05bbe2f7714514d02181b002b4670e2fe88a4ffb5d3f60cdd84f55411d09ba1bfd238fdd4ed685848a7a2c8d32ac9e4b9a4649fdae9e2f6331e6403e3ef053bd82649fdffc3c7849af87b8d7a06f4b0f1f8aefb6542027af20a7e741af88d18ba5931af4e32ade4dfa9c5faa7f60e9a93b75c97cd6df72a8e3f93b465adfa15ec00bd5fcfa9728bcd1fcdd61e9a4d6f451829b7a45189db8b5ad434eef3fbba5e43f756c8b4e237a8860ba78b0504f8d467b9900eb3f536ead72ccd2ade32ade4dfa96ba1d2f58706bf23bd17b8a9a832be6c0e68861b185aeede181f4828665057b818ee58584b6bce9e62ec2e24cf4d8161a1880ae39d1fdd276c5dbcbc9632005427bc990e2a0ad1cb0c543fd97e6ef7a4de36d130616f5d804fdbbbb5c05744c3bdbc4797d80fffd3f9cbee8b8599f8ae0222057fc083d26ad4f089e10a770deef3ce9829ff818d68be9cf27fdee70d23be22eef21d0a78998f837e5b60c316b4b057260f1365905b9cbe859166f1354bc47e2e9f1c5775e601b9a97529f7e921027de7be1a167232d579f7487d0b43ef12e8541dc1782c2e05b68f045dd8d1e07f43c5350ba504efe7eeccde79e77d93af9ef13c45ed1ad3ef8e2b82d2943f7a7c2931944d47f71725c6ed0b757bc9bf4f9e23b37b439bf504ce2a9a00762bb9abfdb6eb26bbb7820818a5cd37388b96670d99bb64485ad32996bf05821a18bbfe732fa517cf9bc85cf2d43e8494f90b46502dfca810af5f862382b64f2980209584cbff7cb05249165f528f195c0533f1b7ffcfcf1f29e8cc6aefe76dc3605109714e102373d078ba5ac71a6f8a581c02df1723c1706a60660913778e31bc07e79592a8425023b2bb0013f142b4a16851ad8932d59057911a367d983ab193b35103daea822f1f4773c6af71f4f919e65dfc543f20ec0669cd1839a7cf81e60aa89936209912221cf85425e3491a937050b356d17dd5fcc70f270a4e733eac007661d7cb010690569a3afec23e22315bc3d4cb9e35951aec5a3b4f45f6cab1379473cfd8ddd934cd3e70616e317868637513c656baead776d170f44efe1138e429b02a09013dfacacb995c9969089c059dc7c0faec69bbd5b7c05f1fdd3734e58892c283d3162c2d4bb5a12fcd2c4f9d60a81fa8d306079a296f91d5f1105680156437c5723148b5fb752fb53f50dbea7d698dd78d81a7f5750ee39c4fadd05ee014f3cc0936c6aa92d7dcae2b2a73d2a3e0ac4819bd002492f3e1127d8db2ddbc0b9428dc9bf527c94aecbf7648b7920263dcb1e5ccdd8a9c1507cc2b6075758bced4fcc87bc31a0cdb5d70871d075c74eec8e02e1d49b14d46772bf6f42522ce499e8901729148b22e1e9d581bdc8f09cde2c503e575875eb65592542b47ba6f30f53fcaccf63c4f4285fb69051305dd754a4cdad202fd2b849cfee512696e3a0a7e202cf6d8a5f31d1c3fe0adbf2da3e1e08d22f93e6b9bbf87bb28e4de849789690492c5d4fbd47d33fda2bf72deb864bea3b9342f09885ad435254214e959c5fb1fbc85227c5e1e2db23806ee2a6f9dd5f2a9fc71a8ad347c4faed748ed7d3af8309780eb1d000ad45259ee02c13a8280ab8f20ab7af9945f07eb204bfd8f80fb75ff03fe2d7325cc507b314f96ec17ca20fac65f01046127a963db8ec215e1682c94d1a8289e22963530677b857887edf0e6db8335d88c38e3ffee21e384fa6052af65bdc02d84241522cdc43d16b26965d6203e305502b0e0a8d49055238fdb653bb0f979ed28bbb757bcd4f9f2f715ee8f65882f6e0f34dd06041fb24f128f95a46cc03e11e0e4649807e62390e1a5ce67cc63d4aa2f764f343585beeda3e6b2054afe1467fe09e83d08b8ee676eef68e350752929089ece832e0864617478a2ba396947ff00ba61ada6327b0691b5b14a73a09bd5680e779e8475f11f1c7bc26333ca24020ff5f2a5eef79ef86680125b7b88a580c3f18630e834ac209d4baddf5d0666ebe79803877633f3bc9751fe847a2305948b6b99e74b26dec9bb9fb305fe3b32a561a07c9f6e002fdd0b8d4dace4384e89b7afaa78f7c23c4e9fb5f5a7b1a0e386b3950c116043f30210f79e93513be2bf20d0cb24d2f7d7849f7478e3ffd7ea93886765b3de323f9630731b47bf720bf812404dd1ecc80b184f612242118f4899e97dc2032e927db43adb97b703de5fd7784b0c46cc46e5d8be7e069975f291addf0dc42b2c41a6d8b60aeae80a7b44ad3427064574b8ba6c5b256ed298b444f88982075488a2c6eaa70e0277a8581d3d0734d7a7ff8cb5520a03872e37e6f2316f81e5bc0e222055014908348146fee04ca43037ccd8c5b7224079f6b7f708b5c5e778fb2b0546b240bc942ed7af65838a48b293e6e79ea106f20a461d00f78eaf68a77e0dc830a846014bfe83731dcd9ada59cb8773f36bbf2ea3a21463c7ddf19e3e70b31e0f1821b7ae3fc9a561f29d812e9eea460d20628988a50570a4261742e4b886d43eee317ed7e5fd121bf0971d90d250f3df78b1caf43db9c35e942c9dfd3de24bfc2dcc66f6ca2e7910bd902f1380f19053ccaa6fbaf191ea5a2675df3e3f4d5f35e207984fa93e80b54696dcb6bfb78202a5f3f567199118f7bb133aefb00372a30636743377d16b7ceaba74ae7a19e12dbe1fcec691d3a8be219237617eddb8357d4435045b6560c54794b59497dd8fd432d1f1f69a261fe08d712cbef6140f9fd5d17ec7370caf3521fefe13c919515df7f7ac700d55fc351491d93032f1ea709d38b9d05ad26d0b1ac527832f081e8df91141aa333d959c5fbeebadc6dcb5c2f0bb277696237e5aaa7ae43523b2178da13a309c5f8ee0467a687d5f38cdeddd859a127ab700e9bf4b5c2e615d3818a778df39d1acc7626fac18af728def2f836030e5b2f44af2f8e7aa4f4092146653df8c1d37f15e282c231df5c8b1d0c5a2d0244a1664b759abd68f18282a937034a0fe592631e1d7c459510ff77cce383a7bd2e445bd1f1a419df49f95a1b7a75503a0cc23c11dc59a299fcea0aef9ee6fce2d17c633933ddd67f7afea13539a2ef592bde13f69f2832e905e49855bc6f9f6bfb1412aa7aeb5801190aa3b4c657781f35e0e20ab2f20d3c5b77101540914b4f03361ff7111eddf2305921e1de8d879eb72f16d129e64f15d9fa9acbfefe6192fbff53ae8f92fc5db6cb311f9ebd60af1ad99eb78bf7a37503e4f9c50adc14de2d20076a20c6e440e1b142420ff7990a07f77ba4905841a9c70b4aefa3ad25b7cce5fd038584b1d0922957f9baf06f7814c60a66738de79215d6c60ad1a8107338701a0fae41cfd516aa493f9fb5ab6bf21b37be5cf69ccbbed3e097eee3fd96766acb8cc373a4437a5fc70f0b7174733a7aa00d60abe3156c814d4a29d4e5af9d844e4be97d81bf13c4a54e873ce999786748fea6249c0f5ca33decfcf2f6a6423d935eaede5ac76cdf228b673256f727d133e42ec0afc7f865fd17777e0876d260723c562b14f5fc96358b9a796d8f10962d3d91af69c416456d2e3834344fc76378ac90109689b650c9d20dc7d3ef94beeb817b3ea11875c280b4a8075c7b1254e95966fe5ddfff9f76d9b6a40803ba42b4df6187b17bfb039ec79a7956dc1ccba26233172d3d1e6ba6b52d1e6a60a101f142f242c28dba10f7b7adc169cf21183a0d83cfe6b5838ee983fe1c331925c1e22dd133e87bb62484728d1bf43c5bfaab3d4b8cd3a7f18bd413215ab75690140779202d61886905223d11ef786f98e38af8f4e508e8e536c92f0ff959d6209286b878fbdab305c3c00d7a4d842813d3e7fd972cc455a45722b7830ad93e1e881bfd87250b443758ac9030acfede74fa5cb0e159c7d2eea5ec2c6e1e836fdbaae3cabdf602b32c2f9da71386b03500df84cf766de9ad1bb6db1566d055c0ffbe56dddaec99fbb631108d81ad073a7990c9d6b6bc246b5b34307921a1251dd87b5e3cb7e91f1ebcbc87bc1e06dfc16cb3281ea748c07792c55b7b3b28fad981f160d24b9a7cc2e88739ceb28c38bfc9ea5402fc0bd7512d215add06c8d64674d616d646a2d95b03bdf7fd7115e731c1c30964b599fc06179b13f2ebf15dbeedf38da297acff8259a389f90d26fbf0fe2b37e8d9d2dad11ee284ff922c2c315bf0ad44127b0e7393669944f1b8504018f7299c2fbec7f61c220f84776c146f7d7bdb3b7aac10a2dbf13d1677c1eeb3fa842f2a80a274c33f3168cb5b4fa258fe70575881f86da1b3ae3ee0deb4542152f35bcc39cd4f948d0d94849e43dc11af9128e495d83afb2760d1d144685a746582ced00fe3a98496a73875cb16128a7bbdfb0cbeb9e5e96a45926ff24d7c5a166f93b5c31cdb963c4d7b7e49b72bdff48a69d7a0a7e983de3b6af342ffd28be9dcf3600ac42f54f4da791da2060ad10b7a50890dcb66f29bd4830ad4d524e93f9b47c9f9e51e6539a3c7e538d7a4a7e917690f15e5cfdbf2da3e8be8aa5a80bbf8bcc17ab22c137b564544ddc77096bd2326eb89c7051ddeb10acf15f57e7efac1ff1a784efffe8ae71014813e9c9e200e8cb21d56af3d8e306b048eff512ebee9605801ff7b4fb8f0825f8ff1dbe53491bec3ecf889c98bdec5157fdc11afca82b285063c6671c506ba69d1f56c5e41a9b4d80ed8a46fb75df7a92096e6db9eb64c3b21440c3e83d966a621656b876cdb963c8c3e4fd74d56b0b98915d3090c41d007bd7e5e3f9297409a2f656561f13cbe2051d26deb8fa3380f246cb60fe797cb41805fa33db43c153143d5ea5126996f2ca1b200bfd6746e4e1ff492ecc1e59df85f12c212b3bd68e0c76ad9101e3be33ae1c014b68a595bc884151226e85885a363bb84ba5d3be016a93486a64ed7854fb0a1f45e40d8be3d85e5a9071409ad89b80cfec12e87efc61a075b17b7f5860d4b608186032ebd61917bf602af307b2eac9eb3841ae65ad6cc825b4e6ce140224a0923cc320ca62dbbc04d791501790d839ed90e82d19fccb6e4b1574c1bf4032118cfe4d70b564ce71af42c15d3090cc172e08a5e85d06748a691e2a050d5cd26d40587124a0fe43d78205c514536915fdede241711835f8bfc26283f30e9894df328adfdd75c8f72bb5cdb672b13da4a2412fd816b72c287b2421f36303d9bcb99bc90d005ce2d26435052af4bdb31234388a37ae6ffb92fb671d78ae358c0330161d3eaad1a6837525220150ce2f73f8c271206c422ba5e03920a73f8f9b7add8ffeff2df4353960dd941042d509b0270931494da423bb64a6fbe66669383bf78a76e5a2358affbc04f389ecf80651bdb4287cb6b79423eada138d0679b516e6cc5b4675b1b48bab6a1432606fda46b91d77ad7fb7b6039439defd26090a552a8ea2606e31488785e4cf67fd7f4b807b599fc7ac93ca864060cef3fbb47e919f4994769edbf66eec1e50ddac2e9e9cdbab68f07a24258c1c530d352a0dd4bf9c0d96897532f629207825874924577746cf76107655d7081101dffbe53e7b66dd52704368fc3feaebaa2f64605b52281cdeb44d0062ef0dffbda485801adf890beec2b9094c753d7fa0aa4c3fd3bfde94eff00a172f1564affe4ed99c022e7169dc23736db2e5921214da052856c424b582fef3e5a03b1868ca278cc80015f8158b82d04a3cb504dfa939379668943880185cdd706ac21183e719af4ad15ef9007c775a6fb85827be51c7af8ae38ab9bc64b2205b2c794fd3a75fa428ea10f4207ec382e48cfea416d24bf493d289bfcdafacfee51961bf439bf36cf3ad91e5cda10f8ef590351b94bb6c5256aa0a17ab3bda6356f304bc1f024122c62366bb1953a36a543daec2e63853876af734f2b54c10aad38d2b02d5fea01e6ef7c9b6bbec74f4071b8e2f779b9806105f44141526e46f4bab7d5e9fe00bfde79e2e8a3134c1cc916592d9b5a5a074a320b976fbe19b618145b7a2b45a4f1c6f19dcbf85696a6cbf6760bc4c293acedf1104cbe99c5d6ec8a69aeb0051b5fd6104cd3e9a4d6f45ad65fbdcf3ff9a2331f9672d323b4418f17185cbe61e6b4748ef3d73e8ebdef9c23fe7970947e91734c7c7b04264ec3b0b4f21b0c1945e2bf7b63f70cb3f65f528fd2c2afcdb34ee651825fe97ffc776c65e2dd2d7a4721af4c1ecb2a88e94cf4b0ae4c0e1b38cede8eab10557fb79d113d5c552a4baa668568cfc0da48763c2e5008d6e9cb9dc5e07b8438e1a00b773c1ddbb7b73819f0604054d2ea5d4829c445a12d0c140747e1d2d2885e6cef96b8cdb6d94567d993a7419e07f80d2d938ae3ddfbfaf5bf588856b9e9a73cf08c4854d14bfd659c711fa8e81d8afafd7c76c6fd4876a6bd3ecb5bf75786f13e8f9d40e9e9c56b920385931c3cea6d4e0b052e6f847819fc848defa509295f2bb8c467f1f38ae9226b653ed157f42e853cdb2aa67bea1d194cfac18a7793be67a9c84e5ef19e983e3bebbee3f53b7e70e435429c7ffd9dad1f1821c4d9ab8b6eb9f45121fe9c5efcd5e819425cf8e2bd839fec2044db833b9d3a647682f618da7485b7955fcf6c0fcd6fccb04c5c419e6c070cd67f62b296df9e06fdd8f8189b905f9b7c8c35e7c9d859ee6cfe7ac74355cdb6bc52b60e591efb8fdfcb66bfa5b9ddcf962eac13728ecd2c88d650288f24476c88c230f074f10b7045ab549ff0abf032e039f821ac70799f898f067ea6889ee2e15c2556e1ef61d051efadc47bc3f2cd8a8ec233804744beff5dedfb76e9d6e74a213ae7ee5a5f394988851f7dbe68d10cf58a86110ad2aeb41edeadcf032907a423631f071e018ee771d8e6b6bbf07e0795c2b4581e2a54d04f1638bfef98ab0f962dd7f6b78ec7bc395dfe385a8c4af763da6384f2cb72d05ea3142e9522b5e7e2283e1a7bf5e4002f134abdf652fd4167d3cbbbd4dbc33803ba549f5c3e0acf293c47e192bec2d31d17f8283cb7187801de1fc5ab0fdd307ac50a213efef8d59ff1d9faa8e2da5a138f6e06e9e37d156c64e7a0f857f7f483a674ea24db65c74eb346668ba0bc66002fc3f7f712fb01ef85efcd029f6183ef0cf05d06bc12f488fe2425cf12df318a4fd5f2aae88d52b8ec0793fe18d0cb51f4a55fb418f76502a7e7e800d47483df9c00bff0cbf57822fa99c077c4771ae32bf5bdd4b6edf712a275a4ddcabd4e95704d7af77dae95b256975ad9b95f13ed3117e335037c4614bdc0f81d13e0b757427e2b402f205f49e6034bffc9bf621e73480ecf30f8b5cd37acff02f3e228d02bd6e36314be338aaf98b770e70f3e1062c1ac590f2c562d163b829bc97775b582fae454da5d3c817c1b5784ffb03d3c90a1d87a90a5d906b22b82a10dee1a96e3b9309e4b1cda2057317022a1356b83870ccc90045cccdd4ee879cac5efca7efce4eca3fb623b6b7e1e8276d1fb2ba8b7af2605cbd748a8d23b0218165be772f13e87bd3fcfe4cf57fc5ddbef3dc6df9b28fdb58e6fded53bda5e22e53d114cff8c850c9565172cf4324353d93c446973e193ac6d45588832991c3c4f6b0a5be6f2b2843a562cd9f6dc96906c732ba603a18c9eec402916e24a5a316d5bbc4d16e22a67f42c8bd9942ce0250b716d6c7b3437e4d75c7e75882b69ba6ef3f82ddaec1025e79f3c26d7e097876ab7cbb53d16d1c77b9fd5bd99a083b9c0bb1b5d48e8e23e72595ddca7f06c1d7337cee26e6e0c9ec71c433d53f6e9226de78ce3bb0d3af21ef5695a81603150676ddd68427da00ecbca7278e8886082b459f5edcd83d60247dca60b24c963947c0e5a3cf2067fbbee218b2ffbfc057f73c4494edfa3de12cd99e89ad79e939b793265b2b5ad5c8db3b52dbe28acf0c6bf37b6a4f35e6cd7a60c49ab3c85d9227fa0308d2dae0acbe2ad6e4fd09bcb0e94d28bb901c3caa4dfdcb468c29b5b31cde421704055330d8ba4ed212c868b7db1b9697e2301c5b479fc52d2446ceda579fc0a937ee0802a7b01289eff2fd98db7f1096f8775eb445c077b346144f1e0a2289b5002f504cc73b0580a34619162b26655d82c66b61856fdcafa57e7ba427cfaeb1b67bf70b6fa369dc74ef03d40f240a85e843c0fc2c903f81a907b0604052e97dd9704ea1055317b1f16f77581a4541c7f1e72c327fb4d1162cfa507b67cdf5fd4ac087903fd4a61bd379965719c5b5e490abde20a09c3f8a6c472d05c4545167e845978ccd3ad3fa2eeb9eadec2bc2249f0262e0fc71a5b2d455abc1daa0bffc2e0c79828ac3b28d82abc7b363dd107dbd3b2381eb46c153ddb1e5ce58c5e7031dbc57711ae9edff40a72b33d62f2602896048bcd090dbf00bf76c5caf92d4fc82fefbf60ba6ef3f8b5f45fb33dca27bd89629b5f5b6b0d8426b04a05e3d7407a3dd9efe5e356c8bf8543571d70801fc3c4aa8583804d1831c0a93ac61d8dc43b154e4914cf54e548f2398557a23c29ac7087ca95328147800fc28e5548e795cfed07fa613c67c64623c0f3c0970bbe4a15bee0a14fa68d8b08f1e5fac805f3a020eadf04a4d8e277807f56509f6088a9454f31f466ca72c2d6283a7b8b26fcef01b13641ed9b4c8184ce33e984ba034a7a47be70daee6d4f12e2a4ab463e71d96142a44fecf0b709fe1ac7c14e64a779d176516fcb75c64569cc546b0cb27d5db4534114afd46b10515cf6978baf527804789e8ebd2316ec8c05aefab954cb41947bd98b613ce7e0be30ee73709fc2a7ead873897a3f62fa313988e26b3bfd7cdcbc2384f86cda9b8f7ddc463158f7a882b5470222565cfb06fe8e359006f49fb748e82bebf4031f89ae81d477ba076b20fcfb33812bf9cb51f2a7e5ab92be57f99b0ee199c023c01dd6be33f59a613edaa94979d5f4757bc2bfd5edc9fb4fdb2b6183df3c46af8202ad8cdf4a920f3d4e0b412d8cbbb3d03a267d27497b503b64425e74fb307948d61ec46fa5a4a0e8d1bce25af87512f2cbfbaf02f4c2a057c9f905ee30fa167e05f1e7825e29a35fa2e8adb8675155740d64d2ac8fb6dd1ac8d6522098d8e237d98bbe4e4e643d5fea3b39574e9c2977a6dc72b8bf9d334d2861085c05f06c35409c990e2d299b1d90870e70f15ca9a06955e111e079c0b1062256811b5a2c2c8580d3a27b09f03ce0b10110c5d79df8eb159f7d26c4b41e13264ff2f320de12f7345cabde5c3b5dc1fa6b00bf55d0efa0837f1b58d1b1a310bb2ceade316589103fcc5ef8514d0d38a6897e0af08780d3444f0aa01438790ca4602a4c5cc3bf03fea4a01f52ebfcf42ebfa55d20c4397f2a3ef01cc9ef6e55fb3e3579a5fcdbcba97d4ff987bce91c71458bbfc60df0d862a65aacccc7845c02c59ca7db4f097405c363eda9ee77f17c312916a8cdc040b44ca495f85a3db08167a39f676a3988e0bfc46714fff5c455b77fb583105f8c2f5ff3d93fd49db5e8afbaab814361d420345987ddb31a707e858ea24b8a59b30ffa47a7355281ccefe88cf44bb91cf6fd3401e4e27b573b33d577e9ef75f1bd99e0bb047c67826f931eb56f362912935edc045890903e53a8b23d39fd4ae061f05f9190bec3e897307e31e169032fa6a8ccfe2b019ed7ccf6d0133d53845c1e92b5472c29210b6f013dc8fdc6f30bfa307cb46205fd08a36fe7b702fc0287e2d2e383d1cf54f47e882cdc3faa40e67e3af18faf403021ea45594c807e0867df1ffa9cd2e329f9ea7d53db0e9013999e504a9927518a0ec947d64aa5d960b109857548a5c5b219048fc645964e31d3e415014b44e198f81a3eab7f66cd0b424c3ff95f9fdcbaaf101b0a7ecb589fa9beab1e618c3a84b2ea4881c88e69f9489b6ffc0967c053856f4fbc5188aea17de6de9c26c4411dfb2fec7982103d4ee9dd77c3ab422c3ce0f31b964a8bb7eed39a17424fc4dacbbf52f604de9de15024baee64490c4ffd6b8b23529f136258f1b517f4f95a7a1abd073f7589e4ffc05bf2863f34d73f052eedecb37c3ed39c15ed4f89b64b816a778b27912ba23965daf2cd648adab10ab883fb145e499e04fa23a6384af01c5ad53291ba946dc7147f29b27df2b545aede93670ec4e5950b2eae9053e4bccf663c3c1f1e07f5572d2910f2440e347fd7d975e441ee216787d107a5777e497a6ead3b7d3c72a4889727d56e427bd0ea7b33f44451827623b98f44d14aed4147c0b7c2631e4821be7f1cbe57194236455dcae897980a35c06f6c622b01ff9906bf79568fdfe4b752e305c0897ea6413f93d14fd61ea4b8207f09e43673a3daa342d3e386cac6f25b62d00b7a50aed11e8e95dfcc787eb5e27341cfe251ae7865d15dbe02f9f6c64fbfdc760a24d572e356bc6aa755fffddb3f0bd162c7562be37ff7105384580b6f2835b8171d289e70f0772fda615e9ec245ae4713be8a090a86e7295c60f15c52a5fc6b81f7e51a389d1406e527bb279a293f7b69c583e33f1162f5c0a5ed7e3b053c66016262a7a36e756260b110832b2ffde06f525186faa4387d7c8fa34244fd8ed09e29b7f80cb59bda39922fff71d6f9452f2e6b2f3b2fad7ecd47e7caceed5abb6ab69c98aafeb5e18c6fe64bda4b1a4eae7ad727ea7cdff896042f88a57ec7a79cd9e2cbd633846895d2e6c17d0e90fae0a116bbf798247fdf3ded8ade55f23d53433bf4f0155cd851f6f60962a03fe57858dc73cae94b1d8aa9266ecf32d51f5e2f6f14dacd453ba9e9b40803b258b5a4a73d00e0346121e6ec50619deb94e339d5af61e0aeeee772c66739e353e143892ffd1dc5ea6e2d07517cd590657badf04bae1e93ffbf0bfd76392079162e703a03fe13615e11c05c5f8978ca4fb9cfbb25f66b549ea254e4305738d6689c71e057cb25e4ba58f11727e70aa7f6cdc5f3114d4f18df4fed51eed0da05b5a7490f752a7457805f4eafc2c403fc127d97f14b6301df238a40af18f404eb3f6a8f5cc66fa03dcc792081dc6e647b00af30ff1ee097e8b949f80db3792af9bcd524bf02f22cf1c4f489df89dba390705b792071b1fc5d2ed8f352ffdf6d77e95c71913f95c72c9e523c0edc1a328944a13d26a8f03ce6499026cf77a28122672ad64292844c7e7df7c7a73e94137064d65357bef28a62b01e057fb51d15a41879ed55313cf7b6337bee2fdfb4d3d2ac95637e94f416398f473d31b2204bcc509cf38833a3bd7c3e7476ca91d9274a45b0a4e55561c941ebf5e9f70c1922e19eed27f99b15b679b7dd9567cafb5aa7b7ffe02ce9f1b4fe579b7f9d2127c0d4c6160f1c3b5c3e7f7aca80033b487a5f398bba74897edf587c5f217ac1c5f715e2fd61b49fe939104eae7d01428a654d87f8b4255669099938da9388eedd2365a22dde17c6fb95f4649a9e83954f41b8b6f00b0dbe9805fafee1cf1efb9454e86bd6af7e6feda1e837788e7aede311056bb06b56dd3205297b8b3c11bf42216bc881ed3a7f293d909a8e472a0f24b036e002577b15e5a8ef6dae076db53c4b21bff9e897580846b5970ec1f0b5bd4008c6e457b72ff3a06cfc06d6326c2118e641c5220a8e41df491a51803c680f44d12b65f49bdb1ee411f39027e7b7c2baf6c2db43d1b3785071f356b3f88df3d84bc07f5e227e7f58b06848d403f9eed367ffe3ea40b42527a7b20f1e78ee81cade92c98b1a2e5fe81f2c434741f6d495a10a1fe8758d3e333250d9a94ab3f22d95c954e1cecfe2a60387eeb69cc5ed253e8bbbf2d239e203ec1e4a0ddb8833d21b309134ec8bdfbf92f3c3f893bbec7b9d9c585e3ab0c758ff88db2fbd0bfdba095e912bf9322be0fba0f29e57d2db2b8733e2f98c3be33d17f4a892351b7fa7f6cb36db13672bb3b3a1637ca25296ce92d7edabb34050290b9b932a673d9da5427c16197c0ec711af492a86359f439354bc0f44ff4ee67c2abc2ab476dc1239757fffe3d7b7fe8423a51a719a3459f3d8a54d3492cdf70c203c138f56e38c424f6f77bcc794a79ec0e90cf2817a13cf6655203751e1ed815ed315d3aeb562daa43f3640dfb2434380df9189f8f558e5bf673f233c71457673e561632bc8f32ded413b2024ab20f72cedd133d01e43f15c86c97f604705ceafd11ebaff680f35be6303e7f76641e5c9dbf0daca1e08d96021dabae34f7270ded4509b22e13e27f72eecf6a1fcdb8fa9837b5f29fccad982e83dc54e148a7f8a0ba37095ae1ca7ca4e552d9121a87254e13982b2b6e6aafb6091e2140b0ac188bdc411784ee0b9cc785e79c57bcd37ebbf59f89d5424f3befa753ead6d7ca9602d2cd4fac142ec11ea35a59d9c120f7becc45f1f978a24f459e8881d2e13c10ad45845ee06bc4fe17d54e5bd3345bf3a33099f39f17ccafb72709fc2ef465e382a95e32a93d3f13b55e62a3cc6673ae35355ca8e4799232abfb5bf8837c6f19993904fc2c7003f5074c073613ca72c39375041adf0d1492adeff09be5721e9220cbe4a15befcba6febdf9828c4ece5ef957d75bfe2a516753bb4585e8bcaf31aac79d41cab60dd170a3674c6378ed6df2eb2661f98d7e945e981ccebf8eaa874115be328831c0f42bffd13df5fac2dfda62b90b9a5cf2bc8ff097c2ea3576aa9201f64a9c8d6fc6afa838027ab984e6f92dfa9849b15d3baff908517b76341f32ac87985f7665690cb7e1a0b3c2721fd58c57be2f688f19b6ed0cbb1d0b3f36bce07d47f15a09741e32c31bf2b672dba3eea814cfbec95641e48d56b0a363c06f87b5b440fd429c0e9d27510d2f3d9e3ed035aa7be2f44cbc5adbbff692711cc0629c59444698a3cc445e9bf3aed4de17169a04a40622118ea10c55d8e0e7544149389171bd3fb75ccdbed2d217ec95ef1d8c77708b1f6b39feefa0d1349dd3e42b45f95d1d5df96fad813fef2d66d2b84481bd36270d613069f3c64e02a3e3011c4421c6a5ad2218924d966b16c1285f345ed4148bb8d40b16e6c9a2de793f89aaa27e864a102b8f2ccb5a750046d499163cd0aca049f25782e137c2a9c87cc4a11220a2344c4425c9f5ff476b749d2535cf6c482c77ff841fd81b2af74e88a14c859c0b1cb320dc0c67f29a8f7f3952dd3ede6ec99edee12a2dd1e9d0ffdfbc922b8784bf254aadb75a6c91f5b5ccdb32edee6b1ef2f003e135f1906fda8bcc5a5eb2a7ab6e403c6afa45709dca4b7b1fc9201a443386c3cd8b3ee4cfa7cb19916edad212ed06f667b68c5c7435c443f9875d534bf791b1b924bc26f01e805e60393dfe58bbefdeadd638458f8f9171f5562a6ac4356282581105ebdb3820d6f01feee14485801ad402a002b01df11e2a7ef97edbde25669c1753ca824da22e7893fb5e9156d10377a139d3d3155ea784533338a2749b3b5d601500cba97eee07cd06972a24b7935e59bd62708b1fb7dfb5dd44f7a22dd9edaf74f6de590dd6bcca1693dae1562ffbfe4b62a9478cb35ad77df7fb89d4f6bb6190db05ca530e574908ff76781cf30be2f8bf19915dfda4eb06e057b046d629a2de773aa4e53dc0fef0fa37d2b4c3e2d69955ca1e604d2ad238ccf089ea3892d62f019cba251783e14e654f24415fdba236b7aac5e2dc40be7dc7be413d270f17ef56eaf437d07d5799002a9c1e697b5f38123cd9a62c58dbb8323173053fed6507fbb9f7db7dbf2ec97aff06dca2c35c429c9404a53259e214b14dfc9fa3fd34c7f4dbab657862c2ced295aeb5f14fd4a4bfbf2fa873cbd984efc6736c56f5c9658627e0ba0e86213a0a217933393be3d3d9ce8170057f4820650e6c6b4475c9618975b17ed53b091ed5100fe938d83e6f14b6bb781f9c0a4bfe0da99f3a65e2ec4d286f9e52b919e54cbb20cc910aa56db98c6d640909efefb5320d4642e704c797e3a6af51deb3ef7ffbdf7f8c3e775f33751bb2ab5dda17ec8270c4f424f046a00264bb30d4c287c51ac0013dd384cd08360b9694dce3a9ce7bf0f0c7dd5e238e991fcd0fe929e1749d8b7e3b707a609913a33756c863f84c9420f2cb6f1c2246dd917824fc2d57d194a6126b0f00a0cfae1c0c054f793a7528cb45b72bd791aa85600cc62aab428d46cb8de3375ef96e0b94cf05982f6cc447b96804e26f82c019f0a8f6db2478575ea3dda1223cb0b78d0b233f99c4aa13933bd7445d577f3df909ec55713df39f1f34e8a73aaf3a00156f30d202990f1c05127528f901729104ae3f525e4b76f574ff57baee74b474d1979bbfced5ab14bab9ed1f62835f82b259ccba9ceae528aa61272a0e5ded24f836893cfa63de88d586cfe7ff2be034e8a62f9bf672f9025a380ca9d020f0e13064cf86ecf848ae23360fee9617a2afa147366c02c6605b31ea2a21c2604c4802c0a2819942808778020395fbe9b7fcff6b76a776a76d8232afefb7d1e65efcdd4f4f47477e52a1c50011254d0beca49b2ae0a7d125404ef9918bfcf3ddc67ccce433f27117ebdfe0dbe60f765cf7c308325d7ad12125ff5e7230ffd0c8c9fc69bb1cdf908fa7eb94c5873c5f83de39ddef8bbc73e3d5433e6f3963fb601ebbcbc25a09044d888fe9681248110646f44d922f287dd4540d058f200e1905e596e29d8666d3267ad3b5c1fc80736f8e6aaabe2287016473e93ee3de18112a832c9433f870f428adc2537d448b41fa43291feef32e29d38f26c31cea481435244463f9775a36661e7f838521a678e679c7ed5066da47cf469fe32f17c332e252487208e890f408cb3bb6f434680c7f49373baa6df9539bb7e98a75c739f509df954040104354bc4a9b884798c52e3c6e7bffa8626186b162c7b6e3d050e529c07241092344a8fc7efa4d26a6d6005d2f53301810a8b332de8959655d079e3156e40696b6b73e326f1848e37fc5d98475a8761338fc954b13e158ce9e7132324f0258d9816eb404a904ca899e3eee1c15fe8c59f34e2bd95c9fa54797f45f196a3f461f65dc9bf574dd487d8f95b2f58a219c9ada91b9fff4d4b7c459b373dbd48cf6fe5191543369cabe77a6de58325aeae3ed77ac5fd8ea14ea189355c47e92a75a575b54a24a1da78cf1edb331f715e6211dc4784c9c67d3db6673ee2bcc4bcf882c69b13c0586648fcdb96287f9830e4990fd3f51a5e5834abe41ef3a07214ee6249041917988020d0b90281d0aca26d8591dacadb0a447fb711103c8854587c6481907060a1fefb9211b316afb959a97ffdfbb8369df546b7daa62c38f0611517482874c6d55599f007659b87b131c402d848975f88fb6cf4cd824966832095c900783f7487e4e0e71472cd7d01075f06a78e209b407fbc5f0fbc9f775c4c0004472a5571745005ab0a3230ce3ce0317dc93111a1ca86dbed14b8ddfa360c1f505675c669e5e33b74e5f9a571e68871e6c48f3390a092cd0c81849b4e5fb376c6e74a7d73ebbb978c4092ca72a8a658f280c44184830849590b4018d92b8719c804041b8cddd3dd00d91b4f7ca3db3efab7f7ac051919caaf82f1dbf4e43a357d3ee8f940c930d789ef84d43cac8ab5b62d41c7addf5c8cdaf6e0cb912a988088691530de1fd538373ea9f8aacda316ea03695561c1bd63aa94faeec2813d5e68a0d4cf277e3e65a8dec9bf2c1933e26b3dcfb33efbe1b988be73ce27e3d7fcfcb35273c74d786ea296e0667d3076dd58bd4266fefa7dff516eca99bc6f2bbf98a9ffde64c2eccf349e0697343b75c3adfae8da2f2d9a4d2aed98f470e30bf478d65b75a3d9af99a14c12416e13c1e1ef24f75726e623bc5df3919324c096e62ba39ab697dc6d4b50554d2aa7b881c8911b06bf936fdc8d54b949f41f5bc714208bf5cf2a2c100eb2853001a1144b11c00215d076b304e233a60f042c04a4941c9a13699ed2face559394aab5a25e2337ae411f58a43289e0eabce8bffe140fd17e9c686bfad238988f0dbc1a1bce463c08734e92334b628320954936ab76c039f838051a578e679c5244ee24527bf042dfee9c46e8b32aab07ee8be0fd7230ce88679cc93826da304d49e514a03a1be84b71910bfc369e67fae09c351e43c883547c52a511e49f4f8176530c219f78c0f0975ed51b65f9bb0b1f5b897a2de5a49a2255158ce52597a04fc64682cb0dac34456b5595e0ccb0ac5548efa3b6bd8ffb2c53cf586845ea9693ae8c9b570b57d33d03b76dd3ab6e04b95ecdb9d17e57c697eb998f64127450c47b8ed99d3e094a8cb7f2c18ac65bbed4f3fbc0c289c3ce576af49fefd57be90ea5a65c3bf28dafbf56eaf7b9d3facc9aa5e7f6e32d955b47623e4917ffade893c457e6edb30a66812bb994bee81e7c0b9f9cd677eeb14afdfa4ee4b9eff5f798bbfea7559fd557aade7e8d26ba755eeaae6aa85a3dec563c4c39a55e370fa396703ee2be5318f33316f313c6fc8cadce7cb06a96e7910995b99ff6af94fc839c5b32d8092113fd30eecbc4f8a3fd4d87aeebffeb16a5a6bdfccdd21f0e8acd57fc7c32240282f5ceaa2b8a6f5a64a08f8004b6dd4d40c20670c5bd5c401bbf9ba956217d1414fc3e73e4b2f17a237e78dcdc937bb81e5ba19f5bb81bbcbb9114f4673264278737a459e8037d3a63d3cf50b4114c9f921ddb6634fa5f8fb1d5e715954c65d21d2a890170336e2a24079fee5970224c007c1c79d8e0a9a6734090f712a5f6608e97cf3be01792838d71048d930209d724519d091b848fa0c624895cdc9738a9257362c992e211e137f3b765fefab4394d951afed880eb3ea9672e6095153616491cc489b10da4b981ecf688acca958d0de48d6546eeb1e91dd8aac3b7558b95aaf951edf2fffbbfb8f1865925553d9b1ecf2347b217e23ad3275b495756c59a7e500eae205d7b4040a9ee1798be175fd5db15076d3e52a965dffc36fcf3e95ab298f0ee9103b464372ffcd393335fd273397eeb7745501e9623a92879b9b16a909c1630dfecac405e6f046581af050212613951ff7f4ee9545772fc7dfcf4450b75ffd737c6fedfb097b5a4f2bf669b975fa7094a9786d35bb9b9f73e4e5d52bfbef2d93294cce955fd9c6489e7374718dd837270f99d26bcf8fd4e0863813f1c8fef8fe7e7bffdad5edff3664fec3717de55c40095d27c8371622fc3d70cac80a4c25e58309ec7e77adb76dbdd040403600984fa03012959e05840dd6f7c7dcbf4dff402a91b6a78d6655f4739ca4894d0c4447d7377a1d8a031ddfe403ccbf4c998c939b070e0efacca6424249a6c1cd06b701006700a499304766523a699a5ea1bed22629ca6df1d0b6f249c0562a2b10dfcb9789e8d71e6e279369e978b7152dfa8009bb2e440787a88fb7a609c36c69998a0f68117117b272551f1c5c69981e7e5457fa7fe0fce6dce051ad4f938eb39bdae572d5ff2d15a24916495155454c481913b23111096401099ce223e558a8c0016284f7373926de8f867c51a3dd3ad061dbef4262df158f7584535baa81867db9d9d43e83d0d21118c449c243910d7997e80adc46f746709c4cc73908a33c89d54d8b4365eb9a6f5142d6b7ffdef37cf78aa963ea88ef8e98e5ff4015d3ebae4fb121006962828abb17087269d3b3b2790ca10991b28f29fbde128a383cc5146df074e106404a6cc10e557e843f0d9cacfdcbfffbe7cfa9085bf2b353bedc71786eb757140a3f6dfb939e46a3fbf4fd6a13747e73dc3cd6abdd339c9644609697497e78cdcbf7e9ba1c147b69798d13dc3831fe39df4c257a3df5fa6d7fbe38591b553314ff41d48454b8419fba0e45ecc1b083d491eaca2a53437052a49db5391e814d90b33334572bb91db6ea3486e37abed84a3f2374efd4abfec1d251d877ee389e49491ad3272d61b994cf5422872f61a53f17b97d5e26e6922da93d6e2ae66c4bb1e574bdcd7d433ee6435918322f37b7104bae127fa8b08f7ea47bc9b3e229fe3e6b7bb1867f7f871aa21de1af71401cfe3c4fb6aac8923e91d8e78cff6cc4b40c4fbaa37969e30e609a5664d19f79f455035957d602067d9ad0f78adb75f3ec30b2b071b58b5c140e74640c70bb9145013a5d63db77c909bf2a4626ee9800fdac67f7facd3e7f07ddbfb22c8134720d33cdee4c8086c83ef1ae0eb9db8c6bf9eff1d8a202ffa6063c96f9a00cf787ff4214f6b82f1c569cf5ffcbc9ebf4d5dd634580f89acf41c038bc108163d6de0d62d066e419afccd389036773170d326c01a8020001b7f42ff0b40d89c36e2ef9b7ef2fece90aeef25f00f8b3da7ecf39233dd710f1df674c4adc13eb1df975bafd4e3da6cafff6c74e7f875b5ed08722728a25e6694101910f4f9b0ed08f2dee25c9119001c276cfadecc0f5b8fddf4e4efe97abd6ff8717421050652660c043af3b94a9932a89c04dc7cb9d436f5b30021693bb35592b6bb25106a1103b8e21ec111806b705d1ff46f763db4d2de99fd88524dd20e987e855e20d62bd6e7e97ac21445a6f60307c691c9e0f038b2d54402732dee4b0d3dd57caf4985c8b5b8d99bc58c8a543e14f1ae0222de6f374911d56aae5b427efe05e89be7cb08e230c63150f4fb21f2be3bc67517f07642c46a2c92dc533b9e8de532e2fd24d4148f457a2bdc9781fba865e03a85eb32709dc275a68f4340cf5f187f3792c85ddedacd7191be729c32e2dd685e11772b23e9154792f3381346bc571554dce3aa4e46f47975f9b3fa08dce26c98b7f94b7349e9c10612a75c02955631245fca75553addc032a46dafc0015709c9a48a529d08f746ae24b9af81218ddfa9e5349df6ac7ecda733deb866a9fe5baef559541239dc7c5f3dfed518ffb62390791e5912c13ca27f9cf922d65052a18a752a3309248920affcb9fcd24d1d95ca5ff7c45df7e87db7326ff147cb911eb21c84b80c11fba5eb309f3f623e3f0144a1ae22d4d62f869341515df451e7a6e439c06b808ff09224422a97530141c859a5456ed894fd9a545a22f2ba02b6abf217d03f52a93f272cfa6ecd214afdf2cc98c563c24a1df65cce92933421497d38edd7a6ae8c4d11e4f062d4fb8d723b542f829cfb5c86629b11e4b1887781bf9023f60b300e05fcd1fb7f9ef5c5d32f6a867b79b7853dff840a8a5557349fa980ef63beb09e4bb02f2a487545297b28b50fad7322201115d0f61401a166036618e035d3aa98bbafde226b1e5df244f1c94ab5a8dfa6cb2afd42358beb6e3ac3a5a40538901947a0ad804450eae746fb1d38421b8184425530b67aaa03b6a1d838f0abeb66eb4fff6cfa490309ab19a0276c05d5284813c17d34ce8818a71dedb2ea05de66dbeb662b03be726143228297345ec1a72a88bae9fe725ce4ce0177ebb53e6edcb5f321519412a40d035515a952d86d17aa167673a4c2515718489c1a07564500330ca037a3025fae2d6fedd43f46bb3680d6a5471fdff876bdc51aa71edfe91e97699205a5aa1d319d2be623037d8fd7996f9d4a95a9df6d3b8aaff2818ad3dd0aa1933e1ef6f9139a43dfb06ee5cfeb9ef3ce07ab0071c03341862e9de695e13c5c0f5514ab08bff1e223a706b66d60de59374f91d29502e23a4ec541bfcb026eef88df2960ae0a5073e0ab9e5e72f6587dce64b63eec8113f57852de4ec9744b39fbe2a1aa1b419ed49b935494c96c7dc027ca4e14e56fdce4ba3d7ff9d280538676f0ce1fbba5932a906c7bc2bb909c4868fe4875c581b211c002017d6d4f131034e62a3d5ac138481b72ad528ba7cdf86ac179fa034fedf8c57e7a81a67e9a3ee1d07a71c8329863b6a3f792d191fa647ccf85ce9ddc6e27c37ba5ba6eb6d256605bd124e09a90dc84fbbc8184c974d0d2a84d6ebc4d038c77d50cd08b2bd87416f0d4c5b8c3b8cfc2f3c2783f2bc938cdc2ce12de662ad0389e23c69923c64904561ca8c9e215bc04f5cf768b078ed207d8c8b75eb787233715a9a44a5090ab14075909d93ea84f5e57d00d13c74a070f7ba5089515415ebfe00a99f18164e3164eab5559afc782854a357cbbc5e357bb6f3c5ddd977a9d8a8f7bc930ef19e81c61e6d5efc51789f6b3b9a0543fcc8fe907474c7bf03ba32b2f2f1ea9d4d482afee7c7a88528b7e9cfefd6252fd1161a5c0331c3825703228c6fcf27c1e97b8cf368fb82cd56eab808e9e22a12bc88d14849a0fb6ef13c34a4a6a2a74f7fcdda0aa61f75452ed900ae7cad87d9bfbad9ded8e6fd3b2353d22faa438b0ef2103c28bf5d9d3227471832312326a76b4e78f5bcac055f84e89d76db5c30e0ad9abcbac2e10aa5f668f7de31dfdde4b96ce99bf6c901918db3cc82961be8022c302650daf10f3cc95362380052a49db4336106e1103c8482337267106b4107881698ee4fb4ff3163fac5fb47c76e9b3df8f4e88db8ee28ad58e367daac59d0fdd6577aa89ee84a370476b71dbb095f86a713b36f043b76cde3ab0283e6645e3e91d3f2efdef1831ce31629c63e2c7453597b9c67b6feffbc7d510878d2171edf8b871f6f68c13f3c778148fb3b71867e2f98c8dd3f4b3a846b8a8711f3ccee82a595f77e59d939e52ea93ab9ef962d0523312aa0059d6c640f23e2925ce998cb5a4022115078c88cce9d201436f28bd5108a2b1ae98d631d6b5bb8e674efdeea11583f5613b65d3f98f1a55c21c310f63f09e61e0f27c6f7d1d7d8f30aef3ce2b7f0fc627d7a917bfe3c5fffb05d3bb0ed4046f61fe9435bf8333a7fd26032c892014df23fac580d0c1930a8bbddc4679f1b1e441aaa607bdcf6548bf7716bf770ef8fb775e4878cbc5f727899309dea8d8f87f9f30fdb83ff4fa99f5d4d883ee18aee7ab8b33cd4d79c335c855e275ecfb7ec135f9e97b1a7c1151e33ce0fbd1be58f79f95ff9a3449a91f27e40f9b0a1521a9a0f8bd1ff0ce17f7854447e72c9fc3b4deb3bdbf276f7f9104c2818644db491229f0f64303f07b5f3d099f96bde94ef5aa39051b22b65207fc9255e738bd10429b5216366feec14d58c2d17b93051206b903077ac770df70e403c876b29d6eb632e27d2cdc6e3b89d41e390192830a901c689c9475b79ade66dbe0784d9f395eaadc4ef32b6b65cb88f7c40159d50e248437cc96633714cdd1339d5ff8d4f8e76fd59be3c9d247493545eea27c206084acb2a2fa1e929040f4272f1e4ee5f02ee0558074841400da06703cd340efef21f42dcda02dde7fc6cc5f6729d576ff63d79f3d59ffb63af46713f70b0749ce314ed46009f236cc467f8a74271539b8622a98e8fad87cf9bafda7efa3cfafbeefe70c5985f7874a880ef6629224b0af48a2639515b93fd3bc929b2e54246493a8b8dc8b9f5548240148ef1f48404c90a18262828eefc18ca8b85e465257d1f70367cde518c85d15df9957aaadd4b225f3bf5f7ba852ad738eeceb9e4fb546d57df75823b1627e93781f2697282378a657a2cc10f811f15ef95179cb8d1b95fae2df2f76795a334e4543370dde0aab0c49d0d20d9dbf8f9024997063fdb32a8f54b479cadb222a49fb8b09888fb3cb330089b0a31b300aa1ec71376cc9335b9ea85ca839d10bffbcf05b4d699b9fd4a676c719fa5566a5aed9bf7382a7d0464520a13eb648076d12a7076dd06411ef64cccca2003645c74904ffd2016dde2e990d82fcbdf3456a8fed0dd02b64ddb9b131b0d15d2c7419a0e7cb6924547163b9846a4f8cdbaed638830a4b753504936d510139b836ffb06ec22fe729f5e9c2e7c63eab0fbea29f374ddfbad50c8ce2059853ee6ba02420acb222b7533ae0c84d57a83ef860a2b4ed71e9dbe31b138e5cf433bdbf87f48a707eae7ac435801e909675836bb4af51b3f6a2330f8c435280d51fb3b999752675e103799ddae89be4a04d45812abf4d2f7a7fe53b9553b76ace7a5c8d8f073e3345cfd19b9b8ab7bc82f90848f7cd9cfa5cfc0e022d397a72df65151508728548d247f556e4c12f09b3efe0a27e9ee8033a825030be3ceff3e877ba8e739ae1b9cc796bbc8bbf9ef9ed2f33f5f63ee9c4abc2ba9f529cd2b9996bde962aa96405a5628c9a8d7734fb69602023e8c137e3f8efef76eb0acdbbeae73e0bc1e0708439158822b774b23d918d4fe476e3004d4a5db2c8ffde1e98b4fd5504845a9e01c4c971a0a1e8d3c68c37be6ffd76c3603797cbf2b1f3cffc5a4fd4fe9ddb4f6b7d8d52a91bd31a1e7c6d8267e52bb8e5527a73dab88263080a20923688eeb0310c807f44925adc496d1063d9ebca2cb01d0dd00b33a112a933b633402f281dfe94ed0c240c26a8b9e63e11a782036fdd0b2bce1f3f5e7fb6664f757da991de1c2f6fb9bd085e7b4c38289e000759710f4088f864ece500411190c61c31447be67ce9c001a1f26da802bc19181b3a0a9880647aff1e5aa2d48a090b3bfeae39bd8c9cc31f3a42738c29dfa674ce3cc883d360cdc0bdc99c43b24158d690d34560c474ae0b96a6ce993ef871a516749a346d16fc838880b29b33248a22230bc76c1d225e866d1aa492a29c4a24c9615e1d92348860900461a3df9bdfdddb643fa8d9de2e7b2a45c4f3d058699c873e7de730eecfc5effaefe545a5eb5c09a6ded0c68fcf3956a926630e1873c9ab985ff70bf873c7d9e8e79a3ef63d4b94017161858919d6b2fb4ad7ace9a0d46739cfddf736dc99652a1e628828ae83bf13314ce4cd86efcbaa404884acc222d5556feffc246f7bda0612d078e061f4a54d041b9c757b7480e88363cbaaf5376cb953a9af7f7b7d7aafdb35c77aceda7b5e772732a22274bfa7d9b00df44ea6834e6283c857d103dab910bafc885797bf1dbafd6ce0e92eee0b639c5e5dabe3b395085d39fa725cd9c2b621c6a96cdf389d78fc2adfeb971ed3edd2fc117ed18fe9f4b33de3b439aec43ce714e747f7205fd2744eedfc2ca586bcf5e4b12ee7557e4969334a0ee79338b07198632689438aee14e8465e56a40b26880d54253931aaa419d078dde27ab68190aa04ebcf3da88b9b6fea553a48a91f6f1fdcf08695fab719654dc68fdb06eed8f717b60c87be07e28fbc362227ecb541551e51b160cb1d4a4ddffccdb01fe0564b121707ea617ed87b4710661949ce8443d828a48ebd4ada88b2bd9079701b3022672149b3bd909f13a0d377e8bbd0381ff28e9fe6a13c2ed9e60ffb7e74d84c2d01977f5cf2c44f676cd39611463f823eed2fd3e7f5bf6d1b5fd9d8b2e3dca49f5faf7e7bc163e4464dde700fc4c6e5b6d280b204acaa123611b2f1c9f991f358fdf6574b20d4228921ab08f2d00787c91c838dbe9efaaa0595ebdcfb167d31eda9a9f594aafb75a3bb7f395f73108d1b3f78821bd1bec0ea5c3bcbf3cc0ce08a624bc0317824099fe49005afaba190689a52ea942491a8413608728bed847a1bac3a4b5a235a7036901c46727c0aa9a0308b4272c809901ca4089e2bb2c006e5e00af62e19eb1927249e67033dd20000800049444154caa3ca87ba1b66f26923af7976ad3e60af1c72f658f7ca91ce264ebb4e1b8674bc50a530c188338646fb58d7e44dc48483bc73c8ff9d4478e2446df4893050cc49508b18c01274d8db9792734813bc92f95b4a5cafa0351f2cbbed3bcdb1ef5fdaaef258cdf18756a76c6af140c267640077d8e0c6aea0dc5f6bc87622243de4e05af3e2d2b1a3f4fcfcfef2d46f669c6750920a8f732441a2209bc756a8b64a496585dfd96b8d5454940e9ceaa5d07c1600d2c12de6b7da12c68eb608609e80384f1cf1770e27a0f3260c988bbfebdf0fb832eb3e37f757bd48c3b6dddcacce4111e46cd3622fce0cf38c00491dfd8aec8affb9b68ed175deebf2689a3ec78e99f1d41f88df609514f601bba5cff3f6e93b9542526155ad34a2c3fbca2779d86a3bdbdf4402e11636806a4f578d07840e95bd2f28bf3d71a4ad0d242f91a20c7d20fdfbcb5bc7eeab0fa403078f3e671f2d994c58bbe01d3d7155232b07accc8c7b26710c4111ef170644bcdba8617ebada662deeea46bc3b594e17f42982381bf76db366368f5346bcb7445c697f6f847a825af10923de7db5e8af412df9b037925e2f3a1a97e3196740647ee59d95735c4e7c79f8b7b69f6a517b48a727b27a757175bddf1d3313077cf1b3800840db8a0379abd1faaba263007301efc6f51420380d1001826ee548b75520c2bc92ea7b50e01445e2eee046a29aea24b1502df5aa8f00c1f9961f65a04b10d79eb5aceb86054a7df7e2db9b2fefa5d4fa352b8e7a70a6be765ce5a7cbae49f010b94e6d451910bceb08dfabe2f48a6c37427bdac0af5f183e09cf072165c9830e28cc13a9a64ae877ec2bf26ea3e492151f1a58f92f406494a00c13d2bb67bb258b5dddc20670a09c5166b3719e22b8697dd0f94292ab1b883772c1ab678eeaa67f3bbaacdfa433a3fb26610479dc3e8d3e554690d33950d9a5a2b4d82d0075f382673fff4ca9a1673f7ddb9d13955a78c2d4cf0bb19e4b4cc873ccdb4d7abd615f9420854929e277caaec3f8b1ee99612209846c4f36607fff9455affd5d2410d9e88550471ad60ba584570ccd83036f12f2f776b061aa36eb491eb4e93d97822fda326dee143df16b2e583a6aa4a6f08df25a6eae5d5ba9f409355f3bf860cd096cb55a44d34147d8a869227fef0a8878efa9aec1184d2470402dee6dd43236c917a9667896157d5b2dd1a076322250f31149df097c5b4fd4aceec311efa62f22deadb7e9efe0847aa296791f964c2ec2fb7922dee3bca32ec2fdc668fe86ba0ff72170922d5634ce0ce051b82eda776654f67625855537169eeda6f11e7dfec0d00b6f6882317bf449938bdce8d8e2a94593cd2da5f06ba70d41b078898145308e93bb28110cf63a815b6f296c60954702526a121ce894a2c141ca0d07a938f88db6b751ce029258f03e9cc0330c084e922bc7e8755a5e5a3ada4de9535038337f9e269c4bface6efa8996c49aefdbfa81ba75f4fa1c5cf3b5435c770fcdc9227bf56a3c0b91ca58477db8f67cf47b6dbc66f5e73ff4556a5eebf133c693919b2295895060be8a6f01a448f25c5cf7878144402ae840fad9c02a404a5144df5eda1afe360de9cef97cb1013300c1a038b6ffbeaa82aa37dcefdca6d9d1fb86f4795173459dae5d5c964f4690d3faef09c983ec323817b6feb461c9af8d94faeaeb37521ed18469ca355f7d39493fb7b8ffe69fb69888320e842d39d4c0adc420cdf542fa7e25fbe0bec30d2c0781af4837d0976d370c4836a2016a079bb5a337eea1661b40eebe246a5af0b60941824a79c4c0d454c0470d4c433d87f4d30dac09d1ad065255d4d222e9be3533af6dd64ca943ea865b5ea245c17aa58d979fad3772e8b494468d1ac586e24b72689b842c7a81a060933517630dc78f3ace3bc6abf2e923543e03d0ef095584ed353afb8cd0d20d508948f21ccad66ac6b51d11ca89555159f0fe998bf0b970e271563c593e73fd7abde7862ca9fc5e733c13bffde2beafee556add172b6edd0486a092b2b5922449ba5be2f8c8dd561c783e9dbc4c578d03af02aa1ae6bc84ad43eacaf980dfd9063cec9e1e31209403089543da1106a6c206920e5d37adcb1ac8fd54e309a5da1d7542d7767f2a95f951c70e376a0258ebd8ba634f7d34faac309543c0b3c3e6d9e6e985f7fc7ac7f35ab298d26944d308c6c1b643d88e8a88a3c5a147d97437dd81eb288219f3cbba7472772677580ca1fa69c0ff5e8dbd3ce93be1fba588f3c44da514ae77e9afffd292579b4b8e29ffa98bf265809049294b4ed9faeb6fcd959a3f67e2ad6e4dfe9fed2ffe37f37c838f032729ee4dda38608ba11c63ec05777c62c8650828be895457e40587f54e8cf6ceaffbbfab04422d02980748bae602c00cc031dedb7c015e8bbdd7b9c9efa2504b365b2b364c2bba58a9c54533c64ed3a2e4c24953d33fd194bfc63575be993f5f2f9aaf6b2d4e75bdbbaad2fa367373f9740bbdef12262b56f02a7aa0ca5adc49dd6c65c47bb6a8a827d377e724cbbaeaf54f8fab999d386d7d6c9c1918675e140645bc537a78789b390f54ce710f9c4d9bd67ce88af4f39f9db4e103cd517ddbeeed7fbf5da5d46f23274d706d50c5f3b78c22b75b3606524a05e45422d19b75b9e455026f124ea141de2564cc953a7910204a26c77106bb9b70502bf0e225ee9374ee1671a739e2f964d4cc0324ce30434bcc2b962e700b282d7c79f2f831eef8dba84b7fd0eb719f679a5c72e0937a5dfe9036bba5cb2815eaa767c6b0cea933aeebeb5a32db327cdda68d4836c8f34e11cba433271d3ba57ea182437410891421aca2c230399ec29613b297b488b7cb2c19be1f7d4797d014b69f7dc9a61795ea58e7f4f3720bf48fedd40375bac6f65fc9595bef9bac25d0df474c1bdc5f9f2f5ffcf6e2b9eef42c1b38ffee15a4faa3c03fcae54569efc93984e26bc0301161a78c00e49e5b2ee23b2a64ca161161ee0b8c2d48381bdbd1feee12886c1103e23f6814e2779248429048524e319038bd347cb0741c3c35e07e980e512f1d1c60da63dedfd3c66b1cb7a53f525373846daee8d4b1dd4aa59a6f6d5d7292e66c6bf5ae5bd1467368e967d6ce3d584b2e2993537aed333d36aa6a4b0e739062b22724073b201ea08f90246cafe42025891d4d0f5f59a762999b5caf7c63c9d9cbaf576a73cd75bfcc7b4d6fa06eb38e9a3849138c777e3e72d122b75a5fc585c499929fbf2f771179d151d237923c90f48db2e6b22421385ff23e61ef128a3778d00b2b4d3a4acef2bcc70847508b18c0ebf566035390543024d667eaa906b2e44ceb1212740d482ae990506a6e56aad5c8c31ecc385ac38687f4f9b726dcb5ebd5df98b55aa95187bcdae83170d0243190ff3f49763eef35106e8eb301072c250ff66e0c1b1058437b2f6b7c9ea0cf1a0e30daa9a719983e41a92b3eed3bb34f58cfc5a4cacb5c82baa4e79cab7fd0d78f3b20ff8e25b061d1f723092605f888a160db2e24058ec711927711050eca887eec2319cfe4abef21bc0b77ddf7dadb0808b5880124724a5581057745df02000746aaaef4cf0de40dfb98b7cff0746f5f6ef45470c6295a826970e2bee3ea7753aad1c21637367e45e33ca3d6e3759ed6b071cdc1aecd25f5fbf4776b3ea52f1e6ff572c76b7550b746399d4354dba859f432abab7551ec552963b16e207fea32ef64982bace1dc37ff759f32cba8b3155d8ed665e63e67ae7393bb80ca37960e71dd5dcb528abbbbbaefd2014583dc0364cdf5cb2e5ff789521b5baecad82a74da94fe9923834564af8f7090682e52d33001211d3b1112e2a888609ce8859cb2a2b3173fe73a42dd0e075e447f19e1902d6200a9b6422028ccf08090f03ac5fa4c23c687080741acbb1ab0f1a4c3af3f158c133150d4e8fbc814179cda0384830f2c541094f3cd1c2d4920d20d746f6fb601fc9d08d2f7014c032171558c513801f04903ebd4c175743ee07b90ea9d244e522d717c0649e8c438a14fce419260f07d54d783548b58f755c22964d713fabd9580508b182009090770914e9308c9615e980aa3136f5810102610c419c21b2c6dbcb89e16c8a780500d50adec9493bdcf67db4d8e183771a8648cede07bd33ddb8840d8807410531d1778b3c46735755ba5486227e377e401560e6f114ea34e816de5debe8c33e09c5522c29973fc8401ff6ac2211b9531803157ae4f863f1ac89209ad37b10e99a010a7fb88170fad2b960c313fe542d7cec91331efacc292849a525e8481f71f2279700b1bc03657fcecfb2ec4809e2e20be43ad5ab88e248f142f5e22bc559280906a8b54b4987fb271c81c60fc5dc8c64784ddf1becfeeb34da5ee6a847bb8850d70002deadb06b20a031bd5c142a882c4e0c0cba10a1fb8121f9c3e7c05e627053ac854b88fb24a8c080844fe14480129901a52f03b4b4404a9c200f02ae0b5268b7e8edaa38d0f5c8ccbc1387cb98928fd33057ade893ede9b0f7ae26045c05605d5c87e0f7d72b3edec85952778f155e17747a8529c30a074c70d277ccdbfaed1b84c121d5515419fd627cd33b95b82e1a0f5c9f34db5ac6104a7832705de3accb0a02f8da7155059955344f9d180142f83038c395a1c74be38193bc13beecd2d6200c789d0814f8498246e3a1fb01e2d48060ae7818244920a15217f0fc22308884c1e4b92067de732b87f57e2fb5491c41110b0b9fb0907b5bd5d02912d6c803701b38a25b9830eda221db4e0fc885320af2e3af049224911a26c2a9449a4db4cbd15fd1f12e36742421208cdff58316e15f01ebbba450ce085269a2f8218aa21592783d36dcbfa0d32bbb2c87e5b3113f0bfdeeb181f491a528516c469ed2d075bd800e9ad25555c969464c9b607c2429c700a189a1470c8b46e99e31591d8940edd2721922e9e0e2a996c0fe3fec7491eb2850d604984f62bbe0b7d8f14712e30630915177d0fb68111a3400484f60b7d0f620cc43e621522ed071167238de37bce1b6e6f9740648b18c0eb1b134c924915fcf45955441f000739492895d8a02910f52b2142a6c08d2e04513f85206d6c10a0907033e603812412aac468893ec511900d049ca1daa2764f23fc22e7933c881d3c9fbc6d48b75a0509c58db78942704a7cf0904a8b36c828f13b119883c47d64fcc30672285755588c8fc6bbb7e9e2230638610359720624826991bb2511568af8a66478a8049882f52955a5167e575049b16e1c2a2b2e814a121d491cf83bcfab7003dd6be679475bc4009644b07fc98b939d08305f0adfc3c139e040b2e3ef019b8682ad89093a9c45f87b200ea70ae70a13187c47a74a3c5fdaf8a497d56e6fff3402225bd800aaf5ab1090a668e32020870eee2a3ad049e70ee36e08128b850867f2e70f81530b216297bc6bacb3c47d504d8540182c04c4b1044204060190aa55d237db3ded2a2f245520135ad88eaa28e00a91d75517a08f886cb6912010902280abe0865d05c25c85646f74305204b783bfb304d45d8c8772544112dadbe20eb8450ce0f5490736a93a6c40bca745019158375520ec15f062e3f586804cb6a521a2994a94b21304d9b41aa28fefc811fa34aede025fbeb76fd1efddd5ded9f03e5c039c20924a2a042ad33aacc2fb32e389b80e0bb63c5215f2bc50013cda0fcf7a9f47dfc181130947f45366030a80a5d2ca14584deb251cfc6abbb7fdd3090835923810c8c6120a1d40c268cc111644f1b1404254a43e823eb295b24a0cbae310227759f4c586b6f6f1f65975015b8005dd342db4bfac8150d2c1c32a2c44ca3acb00893382379583dad3cc61e1c0639d3e7170c4e92215066f20da50b6f7b9ccf1ae12e39c539d97d90b1abd876d00af4ffa0f312f746054e180b3d60082f072f4f379e2394845e280602892ec40c09930930414c1dfc1f8d07ae7030b0c183340bb5be5ba9b9a430cdd50f13b1110aa4bd453dc88f7ad0aa3ff27fab061f077682beea3752f55502471df0848eb9fbe3fe2d75456c2d7f80bda3fcd06b2b32d62007f781b7dd2855adebf87a81f4a7c1dd93aa48d435ec73a57e2ec68c1ee6123ba6cbe5c4680b2029f34daf1df49f5618bdf855717a5a2f1d95c8274bb76c038edc057f967b48801bc2e88e3c7c1266d68bcaee43a0a27c61bf8f7b0c06f0bbcd4efa312b748c038f65093ebd4f777a9b2a5835dda12e8ba1cef7581f31b09788e7cbe7c0e8d23c9b8fffaf6ff8b0492acd906c885604963b72d206d1821babb3aed86afeeb74fe854a58e79ec8cad75ce56aac9432d3bee73ae52b50bebdd55e75a4d5c5aa62c8e1ad95e77d2d4f59a6b79d3f9dc72259d03f4fd86e3eb15e55c56eb63d88ec30d4700759b35573c759ea77bba7a31faeb8b94e1c7fcdd5ac8d79bfbc9b1e0e618e668ffead0b7ee73ad5be80a15e59cac2f4365d1837d95bacf95204a5a16854ade556a43fecabe9bef506af2daaf9f7253962cf978eebc0a18731dd8867c2534c92b8e6c1e82c028499068e30a6f1696182defef7bad6a2ba8850d600905ebce92bf538b00ca830bd7cb1441ded05215637c88513a3576dff1cf743ba2865e59077538eccb7afb2a556765fdd13517b96aafaab91e4276b1732dd5d97055b34e4b6768743ddfa6c0675bd138796b8142bcbc65e4dc5e588737a1aff8efbfc5bf8a55687e2fdfafec4cd7bd7bc584df5fdbfca552e353beb8329a2961e1daf57c109fe69d176654e81c0474e065c5eb16467207c673ae8d4ff3d4c7fb3bafdf20afa8b04ad898c0fce5aaa9eab6ff5f2510da7824b286016dfc2e378e15fbfd3ceb9661753541c8fad709bf759dacd75c4afab747eb051bea9ff2d8e1b7ea6bda85de6ef387eebf199ad8c20d5cb454dfa85153e696c253e372e750295b332a99bb4a449cc7e1c3a8ab9d0bcb06be1ce08b005f0ef045043e1bbd20fed2db7e503fb85e3d55af55951716ba2e8f95df2db84ca9d29e45ddbed71bf9f73b674e1b79b75279231ece5f4a2a32d2bd1361116ea7acfaa2be9080b84fa27d77efdffffe1b71275b18d03680d76f90244d90eed7fd6b073e795c132d11b6fcad4df7cbf4ba0df54abdaffd0d1a8e0f75683b58c39b42b96d96b96a1c6b79e368a4bf35c60d70d4abc53c2556d1b20f9e6146c5b9d7c4bab2d1ef233224d8de0a7efa5f83bf8fafefc527332e387a5968c6c4395b9db3e5680d5fad4a29cc74d54b1583172c50aae2ea8aeb16bca9d4cae282db3fdfa8d41ba3ee9ee7964c2e1eb7e54d760f172a26b91e7deb8f246e257ecff6e2f349d461b597b6ffdf0808057291712b82be543de925fadf55cfddbaef6b4a35bd63ff79975ca209c592d48fcf9be94a25a1f1c70c77f977ab221a21dc412e6c2f7f973449219a950fdfb08b387715369e0f9f02be08f07937640ef7e7603c1d802f022c1e3e3330d58a4c918292b51a5ff5084950d31bdbe5b02a4696771fa30ffa0d9fad9efdde337a037f78d7a4e123945a73c31fe754483752f2d6a20d4c8183bd459f8cbfa4331692c83f4e32b10d88cbf86afac4f044445fc3bbde7cf78dc30ed392f0c6fa4f5caa097b4af394a74fd39cb9f57ba8c6a1435d75acd5075e5c8610f8bf7bd8e016a97682d6ab95842149ca580510a25dc5f0a039eb9c27d7eaf7aff8b1ecc2715a02d9dc6ebdfd4547a53ebff895ab467dadd4ac93c73d568cf828197f210b8871802b412240d2fddc06c41bec7debf39f4e40c206f0d224c98308c9c54ad56dd3e04bd76ffee606afdc75c64f4aa57d5ef38a1b87e88d7549e8a6d3ddc8f453acb1513f7b5ae8b69018628423d9c11fc67d3646b3472486c05c5882d3f3718e010470473768b2567955e569f335c15e75d992268fe979eff7758f15a3e00ee9cbf143fef244382820eb65031d383b54495d7618fdbd5d32891840465d5ecf7184e2922beefdb46e5da55abf78e491572f8d265d2cca6da599a3f3436f1cea26b16482c0c93e693d58e887d10f627c4cdf7fd01b7cb1c264169ee2c1c77d99955ae480f311b01dcd26bd83cdc972c66efa424bd02d8b370fbb5da9826b66a5bf71b9667826ddfdf81ca485e7754801b314f84a714b24d190242d55b6c2b6e7b3e94576e60d7667fba712908801be1427cd946a92d3b224454b14d77ef2d4c8f3ffa509c62b356add73affe5be75051c78edba12aa2e4871d5073dcc6c1df67070ffe7c98d02fe23a1c11735da0c460035fe2833f1f7fbf88379e8dbf6e2f2769eecb0781bc08efb98b3668502bbfacece1896728b5f8fa5f8f7f3455a9d786ddf1d464533d3d963c6eb4e8534022a9c468a312874884c3c6efb451c3bb7efcbbb4850d905e4e1679611da2d4559ff57dbc4103a50e98d86ed04d599a607c98fae9ad6ee5bcabad798d676d839190ebcbf2fa545583f1d9397cbc7eab8dbfba8484f027dc6f3bdc5cd5983ef8cb524be67eadcf8d82b1b39bbd709e5e9f9fde71e1346495e688fe208687080af5a5ad4f12149f71ebefd252feea01eca21636804b8912cc34d05549ddf29ffedf645eadd48925e71dffec417a832d4febf7886b2cfbb7b5a079f3b8859821544516a735370b310f7fa1c24d362c297d50f64a9686f5951a1584240fcfedaaea98ebf0774b6c1c2a8599419c19927767066ca0ae286d4b7d4b96c6c5719421383fcc597464f1e3eecaf8bbe33d88c02acfbc64c630ec4c4bf9352567ff2b946a5cd062f9a5f3943a36e5ac4eee86fab1eba7fb4cd31cb433c35948df990237991050c1201a4944f40bc4ef79e2f7825df106bba0d906706967eaebf768f8e4bea342b728d5ebcbb786e4dea954a3b1cd6b7d76ae9e8bd2948e679fad5c9373ddda37c57d97d8411cc5a2bf5e0f6033fd08fa19fcdd33cc7d62fd5329d70c71d05b027f21f0c54a387bf031639519b0bf72846a3693f1e761fc1918ffb6c71b542f6747d7a9e56ae5f4fa74529bb63e4dafcf035ad4bee24da5b29b77ef79f0294a8d9ef9e19bdf2070308400d910dcf42939236708a09185f1bb0d18f1fe9dbf3faefbdbaccfbd9e80840d084c09a1e11d33dfbdafb3e654eb5cdfe0eee1ada21b605ce793a20bc9f0b3969018620b3d8267781762064b20c6d9f622e6e423c0e73df8f37c12430f8cd13c9708d61cfcbd13fe4ea27b266d742131f410124321e333ef910fefabaee63d59b2caf4a9206ce0cbf08cbb5010c07cd411e96af5c3dd1909e7656737a86c6e253e8db9e69175da9cd852a9cef75e30a8ed754a2dfa78e6033f0c526ac386d55f539d0acae1c592751e600ee3327fcef3f6a5fbe45f5e492f62001f1c790684f44a68f7c1b193dc142657edd337edf5e7dc3203a9a7f72ed07f6c667d56c7b576c56ae0dbd19b32a85e4c1023216aec5b98bd0ca1eacc14eb97189f1c5ccf12297f77c2efc5470c490fb91f02c6dbc3871ffd80751a63d4c47859f58afd45e3e78af63bd6ac284e95ba5f7a797b2df9e5fcef92ff1e778f52f54e6e3479da614acd1b3671e566646ab010c82cbd3bb9767e2efa79e8033221e983df6dc0c84e8d7c17b4d05f3d801d6c949204594de9bc706d19b73df2c6191d224add97f9e1d0f73fd007cf05b53ff9de55750c745e77bda29c5ecad41e478deeb85ae261f33b6a18a3c6b4fe48a6e6346a8aab21a8817c3a6aa2f752de5ae8ed4d9f6b8ca346b5ea8d38d608d730bf49e0cbc275a8796daee71ae543ccf50ed76a1735d01df47be33dbaa3e42ee313b5cb8770adf230f0f5f68cdbc17b50adedee2a2b1ebf9e97dede7911f340b5d667735cef2e69b5dfadfbfad95395ea79cc8ba3bfd51cf74dfd5f38edac2bf137e41eaa81ca93e95f1898b6dec054144c0a217b72086e99e4c0cca49502fbf6df9523df46cbf23e979d3a9a29d5e681a36e4bd59cedddbf0ebaf1c2214a5d70e8ed874cd5479e7556e8f91e4be2d703d5e446dfc1fa89d5d837eb275663ff265c87f5c9b5ec69bd9aef68cb9adf8caf3fae33d747047ec2d75eaca3a0f112fe64e395fb4baed370d078057e1bfbaf373b39ef92759a3ebf66a9cbb076ce38effed18d94ead3e1d3d7fbeaef9873f1251f1c8075596ba28135871958a38b81692d0d4c81a332650de7dc667806c78bd13afdcb020bf73209842936118eba0686f446baabf3c0963d0af4c7685efbae2f57eabfadb5aa5c6f1375b6becd3d286e47edf02755cde84d61d82ea68063a2f4003670f7e1eac6d1bfe88f66fa5df1f96e578703df6ce03335c5fb015327d442b7717d0c5f07e0335503baa27f3bfa7d703dd556ef072f2aa8b814d56a1fc9e30e47fb11f4495ee9ae4c65e5662cf866e2b961e0234e54011fbd6d27e06b0a7c9d80af03f0d14c29efbc900a0ff78fc47bc4f0992765ee24c787163a2074627d2d8934fa7ebfaa73de53aac1a9cd668fd75f76f6e4f1456bb04e426464a6f5b22f6e46640c4b1a1429938b3ebd214936f9bb62c4095a18cf856d87eac0b892c6058d6fcfa8a3bfd0491f759f32448f2ff58dd49ef7df161d5b8b669ae0591fd17a404dee91b09da146b75ec7a8814f5e785091d27aea84fb6df45932c177cba4f5eaabf94df88a701df934d6c175a6df83d79b771d058cd742cd7e9564bc8c8ff717fa7d766cbc711611acd35d23415b2badba692ddc9a2db59a1c75a6526df38f742e7d4da903b6b6fdcf2f8d959aee7c3ff44f387db0aa8b522b916deb1903391b32358a8807c9f3852314ecccc8b7a7ed25048408076f383a2034a776d71b03e7dfad45c69473d256bfb0c188e42197f796222de9fc5192551f70fd8035c35c87855318647b80086c4304865fbaa6fe51c1d29ae253e598bff7205d3089f401b6873e166aabab6812ee043699305e7eac075f4c34cff08c7b2497ae9d82f708c7bf07eb8c7d3699009df94861dc97aa03a9ea504215219d120a770d2189aab8f4939a3cdb6245a69eb9d1151fce1b0e0e8f0f875cc0020302dd7bdf15b8a9985707effd3bddc20648d5ab9bb9e0aafe8f0c6c74817eadfa873c3a7cb3be666668f529efab7895615ef4e22c43f6f4d73d241e2b3312f4bda5b139f6fd73cd75acea01fe242a2e52a15a02bf5c5f36f0fb55509909c72b55b201ebdfa95fd5c4ad1d5ef665c95b6b3421dd7adba6d396680e7d53ceda110bde50aa746151e3959a23af9c59317bcb1dfafa6b9c196e6126eb736b7ff7bcb06aa70c4cff207a86e446d747d88c6fb7a9b8d0ace3ad9a35ced0f4f2f203569ca319df36fd8f7c60712ba5263f3beaad82025c43e75c8617fab265cb759a8bfb07a21f062cd8f9716fbb59bbfb013bd96c037c711a2ee1683af0bc871f76a58fd4c60f3d1ce5b448b318c1bfa69fc307bf39e8fbf8bc3f22789ab91eb6072b99df3b0e7e2b76f00fc558c39e5163215a7d026c0ffeb88d2077601bff9a71260ba4ea6e3849cd9d780f7ee115e6ccaabaccdd90eb87fe79c8cc864aadbdffcfe68bae526acda0a5c3ff68add4ea17ffe8b57a8de6a41eaaf9a4ab02aa734b83a1b58f566affd7db4e3ee86a7d70dfd8b2fdbf062bb54fc3c60ddbb5d3dfa379ca996ec9d5a4de31dde1b63c5446d4ef5c5b76c182579fd1b2e673adaefbf89dc5e637aeb8478593088a8a87be825522f7d04e7bc3000fbf71c4009770fcdfd17d521bbea454cb21ad7f1ddd595ff366e8f9c30e57c1713a63b15ec25c02d936d761ddc6d6b19721925e81e85b7d183fed8b6daed7eac61559b140432f0321f1c7dc7573dcacb745ef6f6a5ea80fc4e55f2e7a69b2e6c47f7de98733a6d6536aca41dfdc5290a7bfc5ad55abd84d5606f8496fa6480c663cd861647d2d9b1fd7bbdb7f0e5fa754bb538efefc0c2db9d679b941fdb6cbf5b778c03a3e5a386a17bb03fbda58d5d775fb5d7cc3ac7e776e51eae5336f3eea8b4de64fa5a2a433ad5b99769f0b49492fae3de65df87725206103a4ea216a146ff2ced737acd422fd41e9435efe4599051de524e48296073f1f5c66830c95077000a71cecf76e8e83ee4680d4ff7a321225c087bf061efc7410903b305ae28da982dc13e5b8c5bc946e28deb24673d4f3ea4c0c0dd784e0fbe683bff9596fa0d5d72f7d6333158612f53d387d3b6a8d5396504a6fedb6167d5bd7ab7b8e52e7bcf2df3f4f3f5da956cb3bac38ab9652e9e7d6287439eaa407e02edaa0ce994e5d371071d8b503be385faf8fb1e3f31f5908555409d2c9134129439c0913124adf4f8404f1249c057567736e897202ae31f5dc26b74c724b1db71b74ecac51c7baf310fae9c48a040c90747725c9776e124662bbddc1b7bdbeaa1b572423c683189f8ac165cf6dbc4da985d7ce58f055b152931e1ff1cdc4a795fa6df5d4f6ab90ec4406e8518132ae8f416eda14f7438444e654132d9e31dd2f2da37bdd7e4a759df7df534f0e6909e19e8ebf5ca8bf7bdaf1351a377a396e3e6cf1fe3bd99cb39c7a6e05ced923279c7ce3c74abd73fb031b23f81b5522a4daf55cd256961afecb08c9df558595678075b58121bdb16ebbf9cd87ceeba53fe8313526bcfd968abaf5b97f67cec812aaa23c293140273b4091c410d589c689dede833f99aa882410c6b773aa22bd308d57978c1cdf5e5591e58d1c77d63ac32af5425bb4f59716233447fd66e3bbafed7fb752d3fb8c3ee237bd708bbedc34b518151a99c381f1984bcca25f8eaaec1528454b2537ddeb378f5957563c52a9a95bbf7d7c96e6a826ffe7ebefbed2a4b0ed9d47ffeaa67ea997d6e08ab6e3310f99712a8e4ce1d5b593eec0d642abcc5561367ffee04f9b0cd704e48921bf4532ccdf9c568057011600ca248f74e05056541c48568f1d1991f2d999dcecb919a587eeefd68fc97eb1fb231fd5d0bffdc76a71da872ace6b891816cc03ab8cb08e07324364bebf543d92043250ee0be0cf11f8c672df327d1fe1b0d1033ee10e2cc7db83fbe6793d0cbeaaa72af34a4a94fafd8c19ab877da1d4bbff7d70547f2d234fbef8ab4db3f58e5c5bb4a2ffe697cc83b9c4eb5b80587f65afa30fa373199548461d8d72147a2ba3f5faa0171fc337013521da52b5614e895eafd35f1a3d7cde7e9a905df8d58523f4789a576436700309eb7769bae4e0befa2cda907242ad1be3e62373e70889b5c02a73d741d34ff77ff5d4a57a9fdcd430ebe71b949afbddcf43d7ac35d7500550525d39229e890904fd9e011801cc15fd5dd6fe6e1248c400aee075b35237747b3ebfcd377a6237363a61d299fac7bbadd16e52c26d04fc4989c136d7414240dc86255545317c36ee4ec68199fbbb5b9068a80c545289c106be3eb8cef31ebe1c41313ffd3e786ed833ee0055515593aacfcaba2935eadc7787f4bb47a909977d3e7c3e361e979a254e9b2ad1d1ef540f850a3f550a48e9d9856e96393a8c9c0b6dfda8d48513ee687d8216cd8f59dae53f7777d2bf2d4d9d58bb9f0a5425ee74c4fb18157109c1f7bd06e75ead8fb8e127bf9e311df51a88a32b46019f12a4d12f433d06aa155e81b4e795548f4170b6d59644220690249d728896a47f7a77c8bd5a024a599f7afc238f6c53d20d9b5f452068966138b4bc9a4cf235f8aa8d9fefc377f1ae2f9f4a96f0fb23c84dbf8feeeb795bfee7c21a63341c76efab5b3f5daffb072e6cbcfe7083992bf15124b7286d2cd723d50ce7f54b017bb2467eb28c0311037c9549e3d66d14ea03bec109cd9ad49ea8d4d5573e3ae1cac54ab5dcd26659f7598a3520bb4a82aea85f3ee68f3fb424b2f48153bacf566a9e3de9df2b5698bf95922a966aa6a3e473b9a8f4292b17d2fbeffa54297f17021236800f20fdff13979edf387d9852c7adec963e417314d69fd6931d37051f983e559114356163d0c73d490c73e39f99f4e0f7e3b381af0ff04580af7a07bf24803652a3f44132c5edddf842b73de3a631cdf2ee52ea93c6cfdd3b1aaa18b92159c280ae953938ba4e88ca95e00cf94015aa81f8f89b28c406e492c07a639ef5cd75271fae0f9070db8b173ea32593d0d050abf474153bb0923306dbd5b65ebfe9a969cf2af550dd6e5fdd081b4411fc758aef01446d71d2359752adf0190656a07ec3769776b50de075ad19a2ff1df97a8dec0b94aa19aab5e05b577576b26523550e1152dcc5eb2c12fd5dda32068070f4c43af6ad273ee83df892aab8c2162490c07d66630e128e57e29f7ac2b757bff186261ca7f55f376e9cb9900e7c5e8fb40e2149706df072efdfe977b20d708964590a99321088e49c7c70d29b813521776e82b2c22895aaa512c22ebca2cb83a373f4fd879f9c73c15dc7e87b4f0dadaf556bd71192ad6f6dec3646afaf87e69cbbe946d42d625b1e6c24bc4e69de683ea87225a9fe0252faec7cfb9ba8b0d8cfc136c03d80ce2feca52ef9440ff1fd94e76f724bae5ae200cef32de88ce8ef41816d8510e46c480c0385aa282f89c420039cc83bc5a72a403f2f89c4205566851489ee8bf40e1b7c811c690ef045c7bdbed39fb9bf36d21ccca2fb8ffad02deeff917ab13cddcc2b198bcbc169978283296d6e600912c2970212675e8af8891294462dbd1678a02220dd6c192a0c92caabe20a402ac1aa39a30583a62d5ef9b352878ee8bcb4566da5eaded1b0ede1876f635ee43c14729855a6aa464b9f5aa37373fd9e15b795678ed7846cf107bf46d6a1146c15545a6484ad5a642097ee251b086ac13b19401a01b4459f9a19b92710f09c277afe5a477fd97d7bb71a35da55c9acb316357851c5af337a2fb96e131ff4d99040a6601dcb08f2c21d8c201f8bb7f207d6e6e19dcdfd03b71d41be6ac592d1131e53eafd5bfb8efd0405ca985090ea098480243eb249955c6a2011f492fd005f33b018925ce9ebdeeb48b55586380a7696c0f398415ae01d47051dc02875c00c962050f112f82fbffff0de6237a5c980e2d77f7a422fc68f0f7dc7cdca9d7246ea0d510dc94e7a19a61f59f3d24c4dca67341d73d5fb7add6efd65e3c072a8dc58d5da4af4096600c2898409461e60c1ce8c2cbefdd504c436c08224c4a947b42879e2fee79dfb8a1bc179acbafe40d7b81b5be019d18b3244aa0d69632814077f3efce357b3ea2a027c7400dbc0670881d4394b5b493e0efad56a35aeeb0e7c99786ed8e0f3b93ddac0e77d8f58a4f714e033f7c7085806f0e5019fe760a9a85976ece62395fae0fc479feba739fb4d83d7debc152572cb5a0362a3968280d0c62cc5c62cc1062e25633371e42030c4f1947d0e482234085305e99c4972a11c5504e3921f6e18b47aeba29a9a839b179e79be6b343e3e5437bdad4ae40e6ae62933e080ada6ada466699d92f5d395faf9cbe1c3676ec43840302a1188286bb257de803e15bea20d2b39b93cf130f4793deb1575d629d72fb84413e6d0b89443aecc56c111d362ddb2243110fa8230f74d1c43f700062876d0db1815182069cba075c6712079e87b18131e6fe1b619acdf3bcd48fd5c33046f1f73ffddefbb9cfbbbaa8a0f6c405a37ec6d4484830806312eb42e014bc1c0903344d97c014108ca6003619b1d313242455bf196f89d246d6133a93c0050a8ca5cdb44e1cb733e5fffa9668cde9fb6efb7fabee346749d77c5026518da4cb5d336bdd677776ce1aa84c7f7fbfc9529887be375482a557272c13a261b1fdb4cc2e2f70cc0c88e8c28befd5591e8941597bc5222068634cf7ecb3bafaebee61cdd39441d7ae227d1c931db35e2845de0b447e4e810f4c3c647c6b91011d14191b8dd9d6b70dd71c087c8718af4c6f5b148effe5e7c88aced8dc86fc493687ca79bebccf5848fc6ed0445bc3b1cf11e06be2ef1f835368a1c0f035f6fe0a37930be4139ceab6e65bfc8531f7dfaca10a59655fd36721d365cd9930612612846a9dc22d468dfbad5c0cd58685bde411f46bb2dc3011168b7159ce1d677bdf713a1da32d97bfd162cf42d5bfdf8e776fdf9a56573f4c61b3cf5babeb7e81f5f71aadcc0285f44bdcd11efd17e60c4fb52fdbf6db4fdfe9571f0197a83d568576b582dc477d4a801888324fd7103d31e3530a591811c094c56ae382faa68a38262367e27abc4214a9ddae4caffd63c4ae3b825f58ffb3b2ace701018312dd6adb20322b29109212ee3c185b8cfec83ee02ff106f4436e3ef2ff1f3bef0e08bed0bef3eab6a52f953e5794acd6c1ab9e25dfd5ddfefdab7db276ea4ff494e791924d3122419245521af3fac9bcd38f868dd31440a90cd20f4bc4eefc2fd19c057e4c55bdc03f019ef7319c206567437200ee6a25c2fdead5827bc9eef0c1eef9203e70efb73b452f35e987865ef889ea78bab3e2b3d28b65f7734e27ddf9456196eaeb32bda3f38258cdf6ae3b9357f3790322ea483b14b23953145b2938d87322e5060ec4ed7b0ffab24102ad94a91e4fa052f19727faba65b94aadfbfe9db23dc83a797ba3bfd9aa8aed71b28950f01ac2b07ce450f6e6b2422519b627a6c4496f6c176ce52e746fb03ac6bcc7588d4a52cb85d832265a122202fae3ee03bb3a0721a600e7e7dd56a8ccf5c5f2802b2a67823c735be02e0cb00be289f630dc5676d2a22c70bf1dea4aa9b622270d71cf3c7d953f2941a3af4d99787c36ba87c8281a53f195832c8c06214f72fc6bc17a3c6753172f41443075cbacc40524995d507bcc340e6d848558583b61235b82b7f01444d743676fe6c60552dc0364a4d2b1cfde6224d584e9a77fe39c7acd28b7f6cfa99fbbb78fb307f5f807930f31414f17e9c8a92376b0d6f0f0fc797b23c35a59eded035fad61ee79efff35e9af8c3f20f310e4818aca280a4547996b7cf7121385898a32386080717b99f87862a754ef39e993df503439d530a2e7b38ba5e282ec7acb37e14318d754a190d060644785304f9ed58c773185f7fdc47fbc01b91ddd51b91cdf89bfaf09bbfe71b7c7add25de174d745f73c0d30b472f786ba652c3faf69f301611d5a412225512312ec590208a0ff1fe5e04425c82f92b012b504292c5fb80b42ec90b0b35ded9f9e348032bc138f13a942a28591e0011e19535c5fd483d52b9c97b3d49a695641b834dd075739fb6e9bb977ed7077cd32d07b499afc7bb5f8dccbbbbb859a2af52ff87837cbb22dead19d6b2d0251a5fc3fd5b1ca925e79fbf1f71f5679ad1297bbcf8d5ca2fcd35ce99804f611c2499d40624f7deb3bcd0ba7b5b4fae4edbd304c43680371a168e1bca9fd3e3f2c9f71c1755651c78ca23d183c190194add413add0c615c1ce8335a1bec8542053505a276368c7f6b025505f4414d9f5450854205350509304817bd06c748863062c6540819c097077c5eddf6148e1cef67ded7abe28a534944802fda9fdce2ab8f3fd01c73c1c8598bc95b83dc134bf17dc958cc711001360ef23b972a804a703a643cafc2c265ff7bf27e81ce9503bbe877481eec3e4b07af79b368ca86c337872fafa3dfbc5eed866961330f799887c4aa14a9fa198803b829ab6acc3cc90dda4ebdb55a4b6a135f1ab1744643f17e7440e0e0280701a434f1bef78384c549ee32d01fa8d4c92bfe2fada626e8cd171c74f4604dd0adc5eae87a87a96da83aa5bbae2fc27b2cae33fd42a4e6b0814faab8f2808fddd871ff40815fd812797d06a9b8b02ffef8e8b795df2ed082cd374fbf341c3c35db384855059569111815b661d07aa4f507e330a9b0c81b8e6d16a42225a3bb5425617d914a92fa52e5e88364337857dc87dfd918bfd8db27b75a5621d1df81d73dd77eadfcf197657a5f1e9a7ed2bdeedfebdedaf0944ecd12a8d6e97b2649f1136a98b2c1adefd2b269ebc6abb5a435a5ff372fcdc7bef515b27a578c5fb8fffa9c3f720123db1a41c2516def0d3bd9c280b601aeede3d497af3aa3f624371a37e5b29b5ca138623e2f275b8b18ef662dda9bbbc7c0dbd9367d279b974314ab1619b3715dc4dccff8cc53f3595560fa6370bd6dae8fe1431f2a288daf37f099e75e88b0b07c88fa0e9e3706d793ea25dba1b71e037cdef788e1ebeee93bf8fb185c6fe37ee0734ead3add354a4fedf1ed01bf81d3abc482218e8c3620e998894094d2c6a5dfb171c9b8eef3d612de32e4e5213939f93b491ed2ab860e84b236b1f1fcba6cdccddf552498976cef3cd0f7d5f360e33aeff795f3dcdbeb6c5cefcc065f1e88832295bcc4c8bb06de3629a700c2d84e2a00cea23a36004600f5baee70c8095d2f7725b886aaa2c5e5d1f119956304ebcae175dadbfb5ebcce8cea13aa4e5a574e2cd9a7c127d76d84d7ad07bfde2f89f187197f18f7d9e87bf1017fc594b2269b6f57ead3675ff8231f9204af0f923c28821a360e22144c384812811b7531181bf682fbda8b870908d924681d3ee4855501859c92c14a799face3216c22bcafc896739f78dfb880d5813d7b5ff4ae66982a9cf26e2baef79f3b4ed877ee6cb3658ce890eea68fb736841ea8010d433a9c64d2a07948850a96d633953be0e4a116908505dceeb6a70848d8005f1a63bdf1da743ceafa735c9bc7bdce870dce8beafa23d13fe6fb0e608f0d20688113e1f06dc87cb66d40c5e1fd8071f8e8b944383c07121f6844382ef4967d71c2b81e3afc0404d06bcba071e78300127e98be9cb0d7564207e6d6a337375db244a9cd75d6e6916e970f6e3ab0c9ed91bca428ce81bcb1be155046b88a8d042d79cc2d50787f70c4bae0882a094a82029597bb2147b77d7fd992abf53d7f547de21e5071071de6218031c8e6f502428e79a20d2a0ed89a7dea3ed3021216b969b2dbe629dedf69e35962e3791dab63d00ac5ae0bdd9c72e19557c6addf7cb34e785df9d6b3785fff3af0ae2b1bf87a07ae5bef3aeb2df03b9230739ff685171ff0ff366cdac5c38e526ae3b9ab3f2a426024ad17f6c6c3fa222f3f22204438a43b2a7b61915306b9ef0232c1a0f588a3d657bb5c014a092309a4efc7c668405eb7a2e2a06f9f4982124710d7fcf78f8e9bf47a5e7ad2dcfb5f7831363a870877f0f7c3f7f7b6f4949a8bf6d71272b78b6efcace306fc06c291960638de406688683d932d4f9ec339de79a87edbc30484250f827ae02975d39a5deeaa4ae860204e2996fedccb710651ee086f98ea490cd9019c1d6df8884f6290f8ba039f314afa2506410069dc011c1e73a8c0cf1c2aaeb7bd0766c9775b8e5d0d5d3b2f74e29870509743c72f37b8f4b7e7d41dc489112442404799024cb6216df4e9bede5ebccc391201f92e36aecaf5e567ba49e6f43cd8e67d933006c449b304b26dc6206540ca43758c1521162846101b8ce302c8f848128694402ceffbbafddc471efbf2a0f7f47f7f66159d70a28aaddff6db96a8e3181471d0f33a30d7cbfd21d759d0bab5057e264c5efc8e9048085fe996e25fd7e81d34f2aad7978e16de75c49933a322e269386e81240bf2e6a380385a8fa2d224c77708ef385faa124130e479930c26252c63c43868fd0a0985256bbc0f4b54fafd5fbffcae8bbee8a5ffbb53c9e639ee97a3f94ef6fd025ad665c73f76066c364438d24f479f080849d630aa33432419215bc06ab73d444038b2dcc60f7ae0ff19786b59e3c67a086f875e3e6d5c8283df262f10c17186bd077f1ce50ee3fec41b32dfd4dbf0a98ac2e2e0f7e1f31efc3e89e142ce94047ce2e0979c72108717e350b11d02541138302b0fab7881381f5ed82232970f68caa123fddbbff35eef13f189070ae30d2181547b434a4985f090919a601c47e76439cfb91baeda8c0171ea73aac71884ce4dbdb8168cf84c2088609c22fab0154909440608c6ab06ea0e69f8e1c5cdf4f3729c68481e7f771e1fcf02adab30c68bf715eb4cac03de0fbc3f707fb275db5be077121366494808df6f1d271ffde51d9a7119bcf5675285922d82545714195d2adc7439829a6c6c227095dd67b11e39923adb0b791d4a421151bbb6d9dee7480987f6054bd8224343b9c8ade612ca8ab7cb5bbb9258c1f1b346bdd8c8238184a330e8fb0548248ddaef777858afbf9aa3ea8cae09e7149640004995c51236ad6b4948f0be2c8954bbed6e0212167d22247ae0fbe6b652e1ded1859b937a9af21ffcbd213148ddad14e9934b0c36f099fe1ca12af26f181bf70571b211830f84638e38f8fd9c7244e04bc8e1313ebf4aaeb7675e306e6774551a1104aaf92d0fe440af932aeff5b2e83f46e613edb9804d759bb89f555df49cb8b8108697a8d9d1852d3794cfb6216c25edb1ed831903d3bf4cbd4ea2bd45ba61824410481221b7dd20c923ec85eecfd63ed69da7a62a1fc1675527ad03c7c75044f0be5ec2e9f86c19065f6fe0b3036c4272ddfa6d7c0909b364809cb4aa9aae0a73c215c3f22691571ad61b4bb6a4c221098402048354a622b29c0907312e42a2e0f54323dfd32d2c9e2ffa4ce884244f048425134d5887b67feea748445f7b61e58d9b7ab9124892ef1770aea58c4f5d52af9e52279f7ee9891d5619fc8922e6a3d712630442224bebfa92058513ce4282b6a708886d403cc796124e6f1276ff1e2c721b892189eed67fd004705e36faed85aa2899c42074961ca7413ae8f6e2e00f9018e238633c3740a72d74ce71f3e239306b0eafd3ac314548d34623ce883622b2e77a0e68e5cf19c4f7670b483c8fad76aed1fd11c08003c21d57a867ca93fbb9018ec96c48ac92c168e7409518cc1898fb7f549d6958216268089e2c7e879138d0681ec7109d74f88517d47a5a774684ba1d7bac9fe0fb54a7ca67c4f67ef76cf1be31c6cae00b92d08325302ffe00159a648036e5af7d7bee5ca5d6a42eddb889dc59c996859964c201c9830908491a4438a4c421555401eb62b7491adbdbf0fc404282f1cadc5e2c91e8f75fbf70e58b6e2a9de22bb73c3eda7dff64df4fdaf48426a4f5f48ec38e42bc4cda69064a02c292086c213e9b9e90acff3604c49294cdc6ef7ac0564f2b3fdb51db10b9abadbb355803383bd61153e0949418fc2a02efc1ef0889c11612c31c71f007480c719cb1c0276d3e42b20a30bad79a5d77c6fe70b365ed3f71f6b4a08788df09d2060d63066cef7dbc5109ee6c8b88e7d3f3bac7c673d8f3d94fb8de24d689d6fe51afa56436a4de4222a4c0ca648cc149ce0f3cae3802108524c20b49434a1c52127161db099d1a1cefaa6a1e721e720b07c5a98ccc78a4ead44fe8bcdfddcf4078f7436fe0b305839244028b93e812e277c22ce144fb7f7cffdbd39310a0c792ab3022b37712110ab26d947baf9312b12f0d7b10e1f8bbb58801bc5f6c6f9f35024448a4d15d1394b5f5ff78db4d5fef24fb7e496c7a8dbb36afd71199154855e5231c9040c8d6e7b3e9d1391d16fda46d4fd940e236da11b79ed2b1c613bae3580bdbb846de40919b8ccd4215954c55e49718c2069f5189f92406bf8a200c2cf401c3f837b1c4208da30112431c01b43de3669db6cf98461bdaf6cc0bc69df24ada61f5672875f0594774776d499e16069c1d3f23ca4f18007dc9e6226af7348937ce1faecbdcdc338f776d1f396a4cd436d17bdb8c81f4ae8aa926036c4834cf3fa893e8f13e49428af6542ad416bf87c5ef7a5da716d4d81a2da11ca4328a79d9c983c2cb5044844a23c8966133a3e55d678ecf2d97f079f1fbdc4979bf918413bd7ec66763eace6860de93549e32b961b928cc452a2ab6bd05481c3ed5540430acf68e1631404a2444109940d2bcc5b9c78fb8fecda3c6e8fb9d39cee212d7bd599e13f4fd82dcb8f13d6b85eb763808019ca94428c8e6417d481e6cfb206f2ccbfb1edb9f0672771110db0be3b35e1edef594d5ae88af272cfa628e4c11c2a93fb84f0bdef02732450871febd59e4a3dfc3660cb8bf3d19abc575b1e786f17b76003e07f8687c59c0d73e009fe31db7f73d742f5be033d7b1e4e3887951621e0cecb2aac7ffae44ae1e2b02489c051608ab64141aae93dfc7e795b19b1b17a6d2e3a9b1b4f6ff32725deecd09b94654e6cc28b5c91831affeef6ebe476f25e61990f0a92ade263c5fc22b25c8b828090c1bcff5fc8516855a1dff4dc2ef9e641d38def51c4be5e2fdeefef567fad9bef52cf6071b6b3df883d629f5cb6e2a7d71c3ad4a1566cd3e7035b218578a780f361207a9aec8bb0a84c497351707abcf38beb7b588012c81e03d581221c98b547f7a5e1675fb25cd75ef2d7fa56cc4ac2671eb43ac074ee9131646757ce7d0d1a96fd69ba6d43137745977e0bb063f1bd36113a1d43c2c919024229c4868bd57df2b6b4fb9f1da3198767ffa8ad6cb5452375535a79ade507edb83b95fda1ec80b260b7caf9f53a4e54b9c3f9eeb93244c9fbcbab2a04a902aae00e3afcf1b4672a83e7760c1910a91b6fee5cd4e3e567330077d7ef861248910c1a022fd1c0847c6e21fbcd705e940a568bbcb5b87d87f3efad5c53fbcad09e18a7b7e6f7eaee678abdeaedcb2fc031533e6063b2598fe6ccef514bddea7e2a2f5f65ddcf393799d5c24fa76e2cba22ad94bacc1adaf518924611a1fe5f00a47fb3e6f3261bc6609354012cb4fa2e2ca162a34a9d293fb4d792595d21fb6beb70ac659e6a885f3057bf38980be4a59a7830ed63180b4d36cf4817faf6f1140db00270c88f7f505306ac252f95e45ad684a9d00dbde36545ca68f73e2802bda95b6844a9b09c3235e9822e34072c4b8abadbaa2b6bb084838713f7a207da886377c21da8db8ff385295136189c11b0712e40d15e055e213eddb8370f046164671bfedc17bf0cb0f7821fab369c30b1597cf5819a0daa0f7087007f6cd8b50e558abadabdd08d43322d70cb81eb98178c1502435380e1fe7418485088ee0b477dc3f5cb4b0f739d4ac0ee2ba8852af8cbfe5b309a72b35acd5802da7a52b555cb065ca2837f99d3f80903690f9de8231f0a9b8687d9c1c6373f9201bb363ef132ffa3be3d49f6e4df3c008f22ccc62f519212208def725e33b656a0874d715ef2f55be315b5fb667bce8177fb965161390002f3f8ed416ba7e261ce48e4bce1ad9de799307ee3fa505c6a9e0f77842527970f92b7fb409667c7cde867e679c68bf76ee3e87d6ef66f0fadcd3699f13e328dd780318c5e4b690dd44406464230f24a2ffdfc87aa5eeb32ad83d514a0cc9bca102bc4a7cc6f739220e84f8032931f88c974924862c1cfcd59418a4118c251f8a0311fef9810788e0401ad46e36a8b3dec0675e705d8be3906d348544d77102e2772634b4a04842913601fa7ed575e30d0346bc787c7d3be07efdfba4efbfba7afd7aa51e5970d1c33dd728b574c86f115bbf715566d5668fce988c8d823108f46a1a1d934158071f348e8066253242663a6fb9b98a826c67091897c4eb205904b9f4eaf2d90e03bcaefc715684afb767bcd86f1567971d45190ef840146edf4c508860c80054922cc2b81f045b1ea8ffb81601b40de0f7264984243a4d982bc655348de6b08b313ef4fd480209c7f7f91c1212657ab79abd6a2379a2641019d23e972a59a9c2adb62d64777b618983c2ed5bcdd5a6ba261bac38a805a58df9cd4b8e2e0c9cde835fc98d27269cd2c0c754455e7c81c64b9fc4609e4369c467e3e0f7abd01273ca4111ef2c81046c787980080e84f01dee648fb9ef78a50efd39fbdffb23a92245a2728e9c53bd90080d1bdb607cf3796b501a732b09140b91346489dc5f3d7f171c4f3cc7f66ac3db9efef8267dfe37fae0b6cb5a2a55fa7bf1dc052d30032a8e3188cd4b62c6e014e764c61fe0c6cc0740b2c4dbb69ea3d343f3a2f3f3b5da58d78d700f3266fb559d89d781dc0ff2a08f88f7150c852f854e75256ac7eb7d18aa9d3a9e722c51524c9f719822c3a91f14318ef92552c52da2fe99cd4efcb3741a70e72734d46aeb468e3b01818581aa582151a65d57f3813af096234d4248a8ac7dfb4e3a85a8807e60db535e5871ba6667b8dac74d02262506dfc2ce177efd82a34ba02ab20dbe00551179e9c45445369e6b0e7a7fc47bc4834f72b273e0d545f882536d78c61de856198b440f9a9731021f1d5076fcb8adffa64cabf38c52279f7269b8572f97605b1f51ae9cf4c70c247f714e79400405120a1312d2a1caf80882c2586f89bfb32d46afb30e734e5ce91af7ee993be8fd136074256f11a94a936e9155713af6315d060f5eb850a917ac1b9ec81da8d42ab5b4d110378dbd6d948a8e7f9ee9bb19acdfc5bcb0d81be87beff3989090917f1b6ddf469923a34919f5735252e3d69b4cee392489aad36feb0be33a2f23e424b399057af379f0fb23dea96ff0a594a40ea0d418b8d39ff283084a6ff13bedd86cef752ce94504fca7371b30021836c09daf50b7d4171acc543146437c3f474a94010c66ca8b2947a4a19e8db471b0338d545d4986ef6f63030968d101df84823481c911e9a00fe0907654554412c30eaa8a7c9c1db903e7b304b243124360f6e1ed35b60ae372edd7ea571d7f9d52ff6bffea03cf68cef8a0470fcf6b028e9ab27846dda9555c364f4a8120090ad94e3e053c59c0bede3ebb11ea0335f79e470f6ab6af5217be7f47cfe177ea710da957f707bdeeeeebf161bd9b517889236689701141c102c74cb091d635de6e7c6bf51ab7a0d50bf7fff7b867f7516ae9a6f96fbef6a38a9b67b13e22fcbd79c55410611211f17c1052c11d3c5fb6e8c62b51996e12459f842ab3eda2c053e0fa0d625c826c39d54da1932cfbabe46cb1ce422f871e6302922de6c5d9f6ef3edb19416a1101ffa18d096902c923da22ee9e09fdbbd1ccb8ef279c26b61150eb6530573a875be64ebf8a55120a12f9717df5250ed9f63001719b73a953e9be685255114b20011cddf6aa8af285c4b09daa221f6737872b12423591444510b4c18372256dafb135c0ebacf63df51ffdb7beb27b9f3b8b3ffe48a9cbb21f6c71b616756b1e53a77e2d14a2e1b4d0e06098a0484905f50758159600b66f77dcc9356b2875eff20f5ebefa3da55aed97654daead176dba75f9a9711c7acd2db5ef7b7ab1be6ef0fb331faa54aae18cfdbea959d38b8f0809736c58091cb8462922ca947a7551af05795d959a3b64d2b8c7f473aa52aace8f56aa93eb23ce599403dc44723c964c3ef63e97ad7163e2c63551dd10edc7387a8c56304843b0fe8224deed8d200f60841c29010bdb6102db9097b3c5f7495f5cb369a35f94b74504b4bd50da92feb1368eeab648403f6c803bd3d67ba1371ab905d9e8fbd9de73414a24b1ef89fe183e1fdfe1e74855f1d8c4cfafb6c4110efac39e222011c0b07ecd9e8ea974964c55149c1bcaf4b7575574a19018765255a425101bf88424c5e3b13de35662dc3eaf336527999788c0e7796ea0d719f085ee4c9dbeef254a65947578b6df14a56e5df1dacfa38e55eafa179ebdedba6b953af3b46b1ecdbac9f58cb2eea6e46c3ec2d2d1c03452856989e5daf14fe71e32541382e68316dcb5454b1a23efdc34e33ffade4b6a5ef6eac5faa20daa5f8b0509086077f5b0f58952b57eabbbf80e7ddfcddfbefcea174728755adb2b27646418fc6ca379247e06e38cb838f029f2d9cdbd34a8a1fdf897472bf5c519fdcfeea1f194d85b87ccbd286e5e4e5227d0d1cab98a449c027b191101210e1bf771b3f56f673a515f3287e27afc9c22492059f1fd9d8e20af3e23d43b1e9fe3b70d79c78bfd5763609d06075ea554dd760d66d7385d256e610145dbfee47cff9f34db0097910e2d0aed9f9119f7fd64260c29a106e5505bed4ce5cc0ab6f739b46f7c0405cd2791c8160e7a913de4c6ebb1faf757d1c2ab811c17896c1439bebd5959835445f94262d85955d11caec54ec64cafc4106cfc4a7c80ec2eafb3800324f476ea0cf78068b2aae5570f684ebce331a7b51e3d5a13821b3e5835f559a5ee5e36e8fccf6ed5b0c17b470dba5aa97bf61f74e23b9ab0dcf7ebe0d3bfd39cff83ed3f2e9bff9a52cd4765f69bac39ffb4f76bcdecfba3722bdc8d3a68d0361803e27845e478ea88b4ab8ee9a4d489adce3bf5eb12a5aee9f2e481ddce3133215332d00620632d491214c0e6d69b987cf857372f6aa5d433b3af29baee0fa556b658f2e77b99ee1f9de3495545d961298b2ca71327027201be84e3851ecef27de7e1e8fa664982be8b773d680964db043fc03dd3a7ea7498714119017a5eb519212f3ec9d9a26fdd6fddefaa140fc9fbf78083969a2b2cbcb7cf3946e8d4abad1a49f6f7bdbcf95284c44906976ebc7fc97eafebff3e2b54b3bd5b2297be5f6c1fd3f7ab9e44a9544c0209b0552675970e57efbd626d4fc581c435bde04d8a3a108ad8c16cfabe485b8ea0c5f5d9c2c8e888eb6291ca38b8189f377790c3d7399e71385e4ec09191cf8c4f65019f39a81d7140cae7c4c647e3cef6cc837c8fd8f8685eb23df320df37763f5dd75ecc73e2f71011efd68a508d7df7d587f680b48b5c63775a56fa88b326ebfe55e9ff3bff7c7d88df90727027d7bdf302ebf3e697c573de81efebf97e32125b7e37f580fa639fe7953af084762fbd3c4bbff67f3fbb6a66032de99cf6e484eea8494eb61ab2b900334b1454b8c84d5a57d466d34d1b8729f562ee0d573fdb4da987ac6ef54f82cda308b5cd8ba8521edc56b9a4aa2028e46de4310e77b5bae27d6ceffb7823c8b504e29d7fff3acc16df29db834f46906751b2d1c075b06dfc0e7bf978f0cbef71f0811dcf391139add8cd1be706a707c7c1c801aa32608d088c99a15da07bdfbb9acf6d3da254eb9e1defbeb6b5fb9b13553925fb7ef29c60233b9d5b4d9cf4406f2a40291132c15789ff9ebcfd05361035ce69eb524827a6ca21ce9f16b2a1bc417eee7eddad97f30aca0d4491e3dd252716a022607c01920479c17417712001a266a031940eced94974e422302d59c47b9c7bb113302f633ce30ed4b5621cb37d1c347d37db332f7ea78488c067ee1be2fdbe41f36ccdb71ad4d647f4019ddbad7afc27a5eeba3d6fcad36729d5eaccac99f5a71bcc64c4a7c871527171ae262af0739fc6fbb17330153ae21adca40213751c2a6103e08038e20169e5b97d1021bf6a3540e519a0e2daee08f25841a96daedf40c95a79f153c4bb23545c8d6f6a7e44e76f95aaf57dbde135a0caf4c5179ce2ed4b2f3c3ea8a4ce3dacfe99cd060c7b61bc113bb54eda9453b5c4ee24dbc722c9a54fc5458ceb3dce8d5638603cf2f7a0ebb6bbfd1546f42aa18292221b2d6c7fa9583351a4e2aaee4654c2ab2be64ee93d30a58a20b9178ce1f08778e340020f4cbff192c66dde83031203545cbce1c5c11fe4069ae535ee27cb6aec4b99210b606579239f39995fb08d27e14267154d775f4a19c918780f4210c0baf51b2c3bbbae52570ee85336b4835267bf7263e611879b1b3820d2dcc111d09c0d952ae751b658cae1244aa99271be7230f0887a296c047567e05bab962b89c40efa00e3f81ca45a0950716d7704b92d9c2e02d6af13e4841140f0e5ba0ae5a60edfe75cfdca0b2e69dd190499250d221c7dbd9024134eda8769f37903fd536d24612f8c271c3ddbbf38a25d3bfddf2d42758ee8a5e2bcacbc1a0635461acb03545c247fbf1b53614942e2cb00b1cbe6fdaf9040945ae9fe938093357de985b59da562b72131187c31774a1bcfdde6c11f687b20afaeeee2e097de50e2e08f335e7a0fc8d9d0698b0513ac230fe0745962f0e65e4a5691cee7c61cf112eeb848ea88171fcf4bf5188318beacf87ed21af28231487d2fed8f03ae54ea983bba341d74b05257f47b78fca9a79a275160241d681caf40c6774a6a4715f5446956999a8303e412a4e4b086a82b3ce30c8bef4fdf4f38353852b21611c881363f9a87dec2e92228075790e41e90be3d88a1387068d6e0b310e94c39957c258101397e8824122228749062a47cd0daea1fd582926fba04a4f165fbdf75bf6b7b8b387dddf9915e57beefe767a4bceb8af6f1db9a8450135e58bbaffd151288e3ec1bfd8fd886b0a3bffb7243f90e603a686c73dd76aa8ac86ba5faaaa230f0790f7e123163f86ce00b039ff7e00f2e8065c78f5b73f8e80b955cb650150573ba112f3e6feea504f31211f80421f78e3b4112cade09e7253901b4812fd93cd3c6f1be87e4d08f57f7a78e57aa75f38ecdfa7552eaeaa18f7ffe1fa8b652e96003a74c1b99664012145f52c08f701dae270984655b9ac9eabc77b292bb3102ea9dd720e3b82df0f9253d2ffe18e392f83bd9dca77de961286a75a8bb7f3bcdfa753af8ac3fff8579a1b81de9ce4dbf73a0a89438e860b3f1fb6e3fe8f6500b03da0610a174dffb16eb95473aacd673f25dca63e7bf14cf0026f97e52a20c92fcef756aec799560caee41eb8b802491577322471c78ca2ab7187ce8e894eb8f3a2a3ac9615c6c9659d8f4ad81aa28da6f6a38737d5d66b45f88ebc3e67a8bfa19c644a7afcb00be3ce0cb31f880bf03e1b3fa015f06f0e5015f0ef045802f07f86ce0eb017c3d81af27f045802f07f86ce0eb61f0619cb6790ffd7e346ef31e882b519dcc7bc7e605ef4df39287f7c8e17930cf198bf7c8c07bcc51b9069f35c58b8fdf2303f8f2808fc61d013e9a071bf82e02be3c312f11e0cb013e1bf87a78c63d16ef8179d0f83281cfc6bcf4f0cc4b18f394877e8e581f63715f06de639c15496dae5403d5f4a253b424724c9b335a1e788052cbd6cf9f3371a2521b37acd958f646f40e9f5755d581808b0089b0a0067cd59706aa3c40f3c6d1755ef7a0861fb86ecd6d271cb3efbdf746dfdb4af8de5966bde8af81f520d657a1585fb1f7eb81ebcc3c58c06f03df409a67e0abeefa95dfc906fe42c69f07fc9e75d1ecb1569fb53d4da95f52239f7d3d4fcfd18f15fdcb903287eb7e1041fe7fec7d77605455d6f87d93425540042c28a189065054c4b5918958f613bb045d154d5c5c0bbbbaea5ad6c68bbaeaeaea2a2aabd8829505549a28b6bc8080080a0a845e8288945002a46732bffbe69e73dedcf3e6e64d4050bfdf77ffc8cd9d7973deb9f5f4735175a864348f005fab8f23d561a8d78adf66295055e80da84b54ed3230e76ecb7be1993e723c3787b6f61c183b2fd4d316db777cfe2cd8c7b80f6d687786f9136afdeff8dbe62317970bf1ed639f7df15d1bf505bf0992bc14ab544d715018ff84296bc059c4372f0eeff02f2181dc141d19fba790a98ab298aac8f37377d4733e4e595715906ac7a02a1a047ef84c5514ec4e6950150d82f6deaa8ad0c633489718a261c66927ebc6cc6d48c973a20c9ec186e48d3383a7ab128d1203aa4e32992a918bf2ceded9905a766c7dc405170a71ed930f6f1adf4b880b3bdd7ce771db558f30309238659eaa4561e41547242e71cf45fd2a23bddf5e6a9ec4ebcb6783e2b60c068f3851834a2350d5c9e6c946fc0d363380df24bfd9135dd70b7151cead17e7a8882ee31ddc741737aab2186349e31c861adbbfb5e2a88abbcdbafdbea3dfab3767c9110e3d9bb2f4d26745431a06d5e6b642de3648fee2b53815d67e2bbf800472dca6018b410299091248624e761e719c4a62f0382613a7acda7e8e2b36ad526250ed9ed036490c45206023a7ec001e16937c4683c4d0d30278d02e619c32b63d7836c0d3fb313a5062c806780ec053bfb7e9f738ead88f61008f8f8ba3c1f3c6355fc3bb484fb5469c743f92f4f2138e4bb0c4a0de5b0cdff72389908fb30df0b2019e8e77913e0e12de48803710e0c5be0fb508ddd9ea62210efba86b8f4b24679679e5296595770931f7fb8f972f9ca43a0882882791a08aeb55f87cb3fe3d969804d2abcdad693f4a0964665f9040988457049c66969a5f39bbbd00efb0d66f2e591741db2459dbe2bc587334c033ac37b93e70bd227c05af00d65b364980198047676887e1779da1bb1abe2d67b769d3ab54888af3777570e4139be7942cdbfe817a30b24ad5751da106db52fd35aa26d604254138fa7e73467547553c49618a9440869ef9cf9423d708d1b6eed0cfa62e96df75b386b839ea1248946a7c69fe98a4ee804408eb5fce961aa5ceba4459f68fcde58be57bbeddf4d982ffdd12c80b9003354862c01bff7cc9e07e5e89419892cb9923de7589617192eec63c4d370ff4da575e677b2b3170afb3e00b9e1a9618b80d29c8f81c0ef03a1334bf0da794b95754baf1236d9f397c4b6eaefa653acb05c6d3de87e03e15ce10696e9ac78add6e1d0dca863b8e05c61a8cd846af35be4f4c81b64101abdeb86af0d10695acdb79b463746c441e34cd3f3e60fe01dfa807f815aa3cb719dd3783840258145f565847fcba8ba32adf55c8727d9c71fba00b9b49d27ec888ce156336ca0fcf1135ed068b04de71060d03cfa1166612a59df87cabdf54ff61a4ee67ef6940f925bcb0268b0bdda51a3547c6dab1b6ef46427e00b383df6c5c56ef4137ca9f4b554491e83f93aa88671ff63676e2033359af336f01da6c5c1c1d5e925e6741aa4454a1e181e71da81c5e725e6704cfa0eaf16ee84b8e31c88eb64542d0e45c5563d2404cd942aa18c8fde54b6b1f7fe09d2e5e8ad5a6f9f218988619224f6554a8f79bef139a271d9e699ff855b4dafa8a32c2170dc8c1157daefe30d7fdf99b73a7f57f44128c39cba6ac5bf50a8c539ca641ab71fcd0cd9aabb2b0c6e71847ff8babb6c2503baaf2a54587feb884f28c8acbce7fb6b5fcecbfd6cebe7db5759c2c83c5d78703ed2cf85661c1ceb7daef6ab250c2082a688bdafbb2af088863fe2ada29dacffdde7777b32f3216efb8c68399080c5fd8c8c13178f01c6e8ca840375e741fd5e179ef55cf7bf8c1ef710275f81e3cc22f0ccf6569cf65b17e107ecc26e0f5177fc7decb36b8cdee4a47424691ca8c73e411c71e7e0a6f9bf00b03bc2c8007e34cf8f171d1da1e7ef49e2cedf7997ab2cc04f3c6c68f71d4a6c8ec2c46c8bd718e3d5fff7c7d6bdcf8787f42f339aa6efab8aa314b715a1f55935b300b94730fbc68b598c4f0e7f3a5f0cc6177e767b1798efad661d4303e0a3e839760ddf0f1373da7e065b175c0c6bffcf4b2a7961f2ac4eb4fdebbf2baae42ccbafc8377173eafc681526730c21062f12029a648769450f8ef385c4e581ca86df1f394b00e8f13b810c75ff6eb8cf0a0b79a4b89e3efe2ed889b2a2774704a6bf79a01fff9a38fafff1c309e177adb3f9f317835732ab7b8297c12159221b138f0f95e1392fd4440349de726a134cadc48c7384d311639e8004e36c9c03684279fc3802e5b3da54b2222d9c036c8ae6a74a7f4738e85002f6c80a71bf793cf6564c7e38dfda0649426151771f48ca331b98112bc00d586cf4fdd2051993868c1545026bf777f64b69d181e53d5f58f7e8e0702651d86fb527ce9ecaf50351d704ce5122320a1fa2bdd83cdb88e094f76a1145f0f5cf5668a8f42c921f8022dd5662acf2857ed390c5fb67e2b9bedea59922bc4fbdf3d5dfa640b2176ff6dfb6d9590fa852ee462358e041622089c60e0418c07f30cfd797e256b8813143e1fecc027c212509bd29d936451c46a89d71f86dd3bbe5d7b29801e7269e64715f2b35353875df19248a4a2c47da69f0f81b9cf683e615e988681a940eb1ea919822978b050f24f07da9c6084d9f38d2628298dfd4172c53701e8d6261742a761bd0fdae2a613ff7d8b2fb333e43363acbbdadc16fb3a1cfb0d1a150792fbae72e7252323b8777aeebbea7932fa817109dcdbc85d6e20180d6d6bbc7a0e36201a154b7437586193fbaf03f0b2019e0df00603bc20774a1be0e5c1736180d719fa1706789d35f816738365c6359f71941b5b4b2c2070308ea399511cdf93ac1b730918a96dd113e015b07171005e36c0b3015e5e3cde16b963f371a179cbd3c6a5841b190d4e0925caa82ce1f5d2c6058e058417e91a79a542cedc8c35ef954dc25425afe975e40855d7bd0335b8a7d6032b4189b373a514734deb12d766d27d52dfbbeebe1b301571eb18ddad6dd66f72d7c5f953c65263bf8b58bffd4e0d6a9cb9bb2eed13b6de4ceee1b96a1e6be657fcfda7a38498b4f5f9618fbe2bc4b697366c2f5b00e3016eba649cc51a23fc0ff7be1f5635f2fec90709d1fbd3334eaeea20c4f799cee38b5d9bc0eafad7d13c4fa94f500586e705aabcf2588d073dfc1e56b02f69a0ec3b0c4992751ec30309c6000faf5bda8ebc3f5bc26d37e5c8e87bf3e4678bad938f9b20bcf92b817d9141fb42b54b02dce44df35744e1081909e18313cd0f672ceb375de2bd7cd1bc37d78e56f852668515aaae394cd564446781b3e8c64e2cb3037598b5a9ec2f0282290de4902c1f33a7748be4642a0acad2c66d11a2c3f0ce151def93dcde92b4944cf728a6380188d3002f1ddf81c90e86b88da90696792b91d74f31c17b12e0213fe3c05f3c301d06cf0678f900cf0678f900cf61f06c80a7be37c7afa836d804242169afe01141e4077f118367033cede017e02f6ee52bafaeb803d8d6c6050f7eee15e6793fd9006f18c0e3e3e2307836c0cbd7decbe357301e269fe62d3fe1b878de68450c9e0df0149eb83ef28931e0e31c7b3ed2ad6e4d453b21befce2bd6d9320db2ee6baaa03af2bcaa1f523b47f82e73022fd7555bb5bba456aab9b52df12a25bffbeb35d0212371e19301e05b1b689c099bcd738431486f9c47ef7032f2c07bcb0282e08c6b5c8b04f02e269eaeeabb24b25eb31f5ea510f3f365b884dcfae99b5f529180ff0aa425d3b72bc985b8cee673955882127e7d75ee31ad9971cb87ad09d52dabbbad9a503cf17a26fd6ef6b4fbf4a88c3da769b307fbe104be7cca9d8f19dfa5dca0faa2655d13aa851758804c78aef591ca180ef434868b2d9f3863ad405ea7cf6de87253dbde2e137bac8f79f939277d78bff91fd58d23ced1f43e56f1f11e7b51921fcf3970b84c45b9f0a1b1bf629329ab49f818c9ae62f0cf08a0c8c6c9e82b764e857d33f3c4988752f16cfdc04d71010e1c0543d10af43046425d490890119a868277813be11cb5ad6dee704046b9cf8380abfad6e4365e4152116bd5bb4e63349013ba6f578f50749e99ba51ed8379673e74831dc5531c8815207a0ffc0cc88b533920c6cebc72486fc464a0c3cb0ad1fb93be600bc0a782e0cf0d4f7268941308961a092182cb33bb00df032005e01c03311c091d0ee09e352c0c6458d53b6cf8d392f1e6f2e311839253a000338e7464a0c46b7584e004b48c244c62003e015c48f4bfd1b75a754b477737abe3f61ca1dea094e382867166cb8da09aaa61b0b7183c937b658d2bacc35ba776f79e2532081581a5e660267436f159ede3a56ed12365fbcdfc9ba41fb25eb0c353e89d7c3b496aff61d7eade468c72e1dba2913fa8fe3006ea17820d52c871a08894b582e3ff09ef517b712a2ed791d6f18fe9a50eb23cf5b07d68ad031ee3502ad1e6e3ffe1a591f7fe759d38f900758c6885ec76d7f46f26375b3a66c512b43a4c0418ea95342d7a9da4730f0c007c98552a7e4b1ef99ea8c54644840fe28c4b5473f34abfb39429c75d1906bfeb64b8803d71c5cf3ea03ee6f42a5bdfe22d439d459c4cf5f2e8c2f8e37b499c4172c49279e3f848f8484ef336034e6fccf944e2e43be75e38617cbe0de1e4e38709eaa0e5135057c82c44d044433028806023bf7310181ae7b0404269e7499c069b89cc7f20d739f59293770fdfbf56d3e937587c99deec85a289fc90c2d6bd55d98233739a7ec570da889f44b0cb1b6912308f2cb2f8603b098543b7ba72af222c79f04781900af00e0f103533ff8b9aaa858b400780e608307910dcfe5417f55bf8222de6d5225c201c83825bfc460c3731900af00e0357ca0369631f038bca41883c89975b67b53e197cefb4fb9174fb985240eccc68b2a99eed0060212014283a2bedbd316a9addbbb2aac6ec3fafe8b492080178c27321886086f5fbc8ba742b5e16d305f3a4344fb229badafa224256b580f5b42eb4639c38598fdf5843ed3e15c40d51d1d4090bdb81a0ea6ea6aa85f12e2e26db7560de82ac4a11f743be65177dc72459ebbbf7d2a185c076bc4d5ae9b6f4a76da9bc7dd2a0feadd6dbb5c2d259c7ef5e7bd78d1d342f46edbffde1692f5397848c721650749823664e95bbb17c9b1ffb0ae06770411162410261bcbc350cff0ea36fd0fc948bb5e883ffdf95f136ee821c419a70c3ae4e9de421cd0e5a0198f7493bf3d2fe5a053e4816bd55b9fc5bcf24c8c1b8e37ce5fae3ae502254aae6237cd5f18e099f659811573079abaf5e5766fca7ed66dab995af312cc17645e20427fa5375f6e410984c781f80888b1a4063db067058d374847c8bc081349815a80701db84fd63d2ec4c29e855bd63e22ff4fab5e7de345429c78cbfffcfb3f374b54c369b7755a2b1fcab262a61ecb89c606381ab662d0adc2289025f4c6828d8346e46cd08c0e57ee9e388d51f0c64211118d8c56218a8cf07b7c8f0defcd061b03a4d5465d24fdbec842235736c0031315e15dc8e0d9d00f484a6e156abf2f62ed420b47355feb07e201fdf5c685f0c987fe67c17b553fc17887042a6e1cf03d2a30d1f18d8b03fd0803bce1000f091ec7bb90c11b1e302e850c9ede8f4281cbdd06787c9c71ded4383d21d4f1375c900a2474178c5039d4f0b9053733c256f574ecc089c7cc9c078a7b636f769465242ac4990a4fc40bc6d386f9403c102f87b57deb187e57c4da8bf93804f43b1bbdef00ab7cd5ded175cb3fe75f28c407539f3ea26084faae0e541cb5a8aa02425b0381974848dcefcfeb79c359a7dc26c46129475dfff86cd7901e1d1efa87d7ff288e9d791d68f88624577bd44f42b41407d9ae4dbee767a7e5bb75e6a053d7efde2d71eb5b7b6ca1fca0aeaca6f9e276f20c59587fc94e8997b5c8aaaa7d57d6432dabee3e09efa1e8837592e4a6ffa5c9991d24614ff973da693d6e90f5a6d49d3d24c108cd0a1dd0fd18e1badb96346b26dc837e934be2093fc457e86ddff8f2f9f3cf271272fd3cf0ef6713fc22369fb82f62edc89c9a6bddfe57aedcfde75a60d0a3e0e480eb36fa37d6fe2bb43f869a393d245ff691048245526955f008038ae25369a1ce136d2572884aeb7f78a75c1e31eb2a8abb7c2c3986c31fed71e3c152226932b6594a8fdf8b384e99eb10939318485564d6ad6700bc028097586228a648f4bd53153189218ef3b6015e1ef4370cf0748981ab8a8a81e3251b922107974962e0c6ba71ba7343032a98c4124309937cc6412eb1814c62301a17717e133b51c4d990745522cbc155ff565d9e2b81cc5cfdc15353c00d1575fb5c678c9c760dd84250e4c7c86997536b3eb9759dcba1766b75e2a7779f1c9b1fd54fcf76941bc38324109454b9c417b08eb96acfcb999603bfb31aeab7cf763643a4d5cbfe7c3cfa95822786c5bcabf2cae1a0a9bd978d470d1b0ff9f980b4210f1cbb5588ae6f1cffd4888972efe6583bd2ddf4f716c79faf5f2e39027e41e371b035d55569a74453eb7b9c2b44da9f9a5c79bae49c9bbcdaecd9014325a158d874f039f2fbf4922639bf97e743bad5ec23377b70cacd6977f5970764cae294ea580e2a61e576f89dac57593531afbbeca0fdd6487c730d1225d700706711d3fc99ce1fc0b7eaa7f287d7cbf539ab7462d927304f2441a3e481f386f3f8a2aa2977d910556304bacf886e2cfb8a80ac5515a9b26c6823e118ad7f4f4a9a7cfdfb90e4f1ab36956f7693b22d1935f3f5996f4bd1f395439b96c8e70eac3e78ecc99273b4aaad9bd36f10f1c6db8c58cd554559b0a047e241a35445356d2b4ffee91d49b0eef961b8237fb9fa9905674e96846ae9a1b3cf99f88c105f1ff261fa98a385587ef5dcb61f4a4e6c7d9f65d33e7b45e2e594b7582c0f12eb71eb8f3b66bab103cd0f73addfd62da1264d8f168d5715f5635e6726a35ab2aaa27e70702569434ad6eb2c89247036c053fd26db4623bdcef801d2581b9281318814d6f58f1190fc0f9e9e324541226f95aba08ebb80ca2d3590dd170908dd0f2209488b6b5b2d88119009273eea1210d9ffb580871a8f121adfdcd8e7dca9c15b27b96c3c54bfbc75acdac1c93213f65b62a39e07d56ded9b95176dfe5a8ec32def5d3fb9addebf6a50752001a9fe03b45f16e2b49b2edddcbd9b10c71c715ac10b27b97687d0e466634522860bda7870e2fae5b601a3513fe178908a9933145c65c4192b4184541b0f09cf82b60e2f797c8be039d5c6649444b8a11dc40099e6af08090bacf702d82780eff6d19bbe58f06f21be7974da9a3990fc13558eb47e519204d51519d1210094bc1021a928b9f3ae1501c50a7a60ef0a2720ae4ef2d049dd9e7275c63f5db8f20efc1ed36ea742923bf4c76f0a2a84a6bf57350678b911c35d671ebff348d9f17e951754e43bf2bbb79a171cebe6e2416fa87ca6032e56edead6950f9648d2f16dc7699151db25617a7556edea6bd59338704889c9eb060f0cf073a7f4de70c5aa582c712c6a999b76b810fd870fbe2cdb8e39059c71c92512d7754d4b0e7727cabcb01596c51243b778d97dd5f79c2385b134e68612646445783d019e03dfea07bf6de294e8a056ef1d076f1eccbcce689c698326c6db070fae041e6c2d318c0b872734bcb98e7f1ce4fef2e08944e3529b555dbe658b104f9c73cd7537dca0bea850245b94dfa9d73b77aada559db80575fe683371ef0769f7c591954d9a0871eeeaebe76dbbc51d4fc4970869be1a2772ab1e0c6d07f054e36d1be6c764cbc8268239527b9f693db0f9af1f5a5f512d39f182b4bfbf7b8364782227d42eae8683a51c547ad5703570e5c7429cb0f89c8f0f9784e5a453cfbbe5c543e45ebe32a557ab0566f871f8e743db56fd84b6373ed9da78240f8faf2b9b8d8f93e478e07a56f0f269dd2687af7ffef2017ed03e407c75f81c5ff44e34ec8b65cbe7defc9a3c07c76e7e62cb44309ed37a0695eceebe7a7b273c873772220345f7e08057229edb2491f8cabe0a243415478e53f59005af5d23c49513f2ffe348c4ce7deffa9bdca4636e419b08a681c68ee1c6ad3c19ea7e42ac3a6dfe81ab25c57cf7ac870ef9e30f427cfec6e897cf6f2107e5a25d59731e1714a9593ba0eae61fa588376dcaab6fe47e28c4dbd38657dd3243118e458a57f50df46e10e5778197ce4ed0fd9695410d46d532d025ee3847be376b774169a9109f38af5df05e6f215efbf4eed6d7ac16e2a32f5e5efa876512e7c9bbc4f76e364e87451a0fa7486f88a43646d44380178b78775804ab17990d014b0111f53c72d910f14e11f78608e74644bc033c91a3c17344e27ef823bcb57ec4e1a7f7c3d123ea699ccf326f07536930c0ea52a84d11de384e98dbcdf6451c67b1dfb179308cc720ca80108def676044337c1eba2a34a78964d0aedcf9e07b0fc9a32863fdb119ed8ba1bf92816af141eb9753ff21c415afdf7ffc1db74bc23162e08bef6e9407d721d63897703436a23ec1ddfce184e3c13354f0f1308f0fc2cf6ad4789823f693c397cf5fe0bef2e1dbe0fc61060513fedfcf99de767eabd8933e8697ae62fe82d5c800e34e08439bd94278db5ff6b50d04240c324a4ae1ab775df83237adb1b52254f1fb3942342f6eb5e41ad9d1eeaf9c74847bd02f7965e69aa510928f5e1314405402801d55e100442501da192ddd5e2e37c0e267bf3ce5d34f2567b8f188b93f49ce70e6f071bd5e949cd5c6c7563fbf0d44710c84aafb93aab97b62f52950a397097a9f804848ba6008acaa7d06da40506ad17be57e49649ede3c7ed77342140f9879c8a7a70971d4fc7ef77791fd485fdde4c14e19223ea02e7176559f3714798f65c0a814c4fe722f1b54998c06afaec6deffc16d0f39ca46634d35a8b84a1a0e7cf4b929e6800e7f2aa89cb88a2bc08dd9a74acb010e8fe0311517a892226fd43d5d2e198559df4da89ad24e3dc9afb2a5f8865ba18d596613a9b09ab6badf5561753de784ee3115164a66e4dd47b622e51cd1ce375f05d04f9df3cc609c32f7ba9b0af04c2a2eb32d4a839f7a69fa55ade4baedf2d5710f9df3b614588f3ee37727ee12a24ffd590f5fdf4d4ad607b43cb6f7fb225ea7aff035ab3c1d6861bb00dab91afe45c6f5dbf07894c029e0ad2b1bc627a3a1f1f0e1ebc1c7534587b7a7f88e067826155792f87a92148e23ec0b5071452aeb6eda7da21013fb3cfff8dbaed7dbf3d1f76bd1eb0acf27e63587b6adea43551d81f88f48dc7a8ed59cc57284a1ec2b09c4863aacb75d82122d89c63616716896283fe069219a8d689935ea65212edff6c0752f7610e2d017ba0d6a0692890570b063f578510d1ed4a05270377ef48afa47aaa4c8fde9f3af4d9eb043882dd53f0cdaa2941ba26234d428e24d85badc507f08f549ac0df5eed7f59abeff9b1f5eed84ead777c909ffe0f6a77b3ff0a094489e297fed9b961e2722fcd9559d589b272fb4d5f30992eec5da71f06c8017067885002f0cf0d4ef1d8207fc46d48e7f2fa53a19674cfa662b780cefa0acc6e328058c03ef054e0e9ef75f99abe18dfda07118c752ca18c6257247dd0d55a09a3116c0c8554d265172155ea6943ad0366547c6f9f22545649223bf67e6988653c644fda931d838eaf88a2a7152ca979260fcd4a2b97bf3a0d526747af327e3e08775f8c29ce43321fe22e8c6cb64c70339faa0ecd6415761f36cd9fe248689f135ed37c7908cd4846fc0cda5512f755196363e006fc7d39b6efbee12d93ebafeaa7ac6d804d5285113033e5c6f071bcfb1ec2b09c456154a2014e1290956af57b35a5f32517e3729f47aef03848f330a7d9472bc1b917e44e7ccf1bde5371b6a965f39ed13b9be57edfe368a0405e0214f8057a9d45f0b35da2ac0bb00757a753da086c8d75a3016d600e789c6c26ac8c24a9208506cf2af46ef068c13000eb60e03ae90b2c34d6c75433c7c6a2755ad7139dd8d7d563d34fd612979f5ef37e4fcb9b24fbfb31e6bde3381c4c0bca11a8878571c2f1ae76c901838c7c5bca17c5e25dcf6e0c1ab80e7f43810b3f112df9301f0543f1a29319838679ff13d07e240a612e7efc05fe41463cf573f5ef9c5c6638498b3794acde72c25874f125d0f6d304252e015d4ae91514a20bd5c09a4cbd9277ca8241070b3e511e4a375af38cb176f14e02cc125b279e86d66bda0c6c710001a646ca6f9c73649b8ba445910606c3644bcc771f4008f38fac4f8068d47d03af02460abc1f14089b724d0f6a2e34bfb03e0737cfd124e627c4bd87898e62f3bb144b9e2866fb74f3a4888e5efcffb76354f2dc334296444875433a84921891a090ab03cfce64d73d9470484dc77c3d0c6009f755244be3c6bfd25cfc8cf2eb32e74233b4d399042a194f69daf13a2eb9613be3efb47c919fdabc5b5df5e2009caf815d377802d02fdf2a31950a384c2ae26c52b35d1eba0162e5ca96103ee0bbc398c7d8f6e8d2c42b9ee5968636e197c1fdead0d1213710a474aa9e4d31d6fb984e9d0a15d8fdafa2f210e7ce4e0d7cfba5ec4e78672605c0c0b8f368a5a685c555442eebb78f087019e5ae849aa8a28702a9fbc78e669f032d8c19fac1bb35f05930df01c80871bc606786a5ce80064de6c53c9edd10678093764e5985dc3d7ff20c4dce73e7abe285f0d08b9abc2bc9317cb36f8bcb5aa2371f387a5c531adb6b84e215d17f5d97df7e5c21dcf5cadfffc42a952f0c2ca40c2ccbccb3c6f9b0cd54f168887f032d90555662706058f474cfb097506e001f3448c40513cbe0d44bc27864f81a348a882025603c6837b4599dcd983c6a38445782321c88036a98c1a89af0dbf1f9de4ba2d32306ed98c5065d339b92efa85101fad1cf5e62b5709b17beef67fed06679e1af41e44c2810c32a8b28890c07986aa2bbae80b0849f2570aef2b0262e9757ca468afda33465c2c452f6b86f5975eeed2f74da0eef5639d16fae3c172800e7ea7e3c84193a56432f6987776ed9214f898b97f2b768d7e9f895118f18efef9382014a888feceb7431b6feac203033950a0d048209080d0cd5e90248e72c8408ea40824e5237f6a885846c907ef808eb01bbf5c896a45c6dca295f2b93e9d063c30d09163f46eca336d8e12892486d871c775a10d2c6c95d2c39c1b4a3def71a0ea3d9c132b21c9a788c1b3019e76f007725e96211300da623c5dbb0df054bf4d9cb945fdc0f88af60d8dcb8e6ea55d162e1462c1a8cfc5dc52d5614afe87840475c567c1e760e3c21bf68880480c5b0c3cf0ab5429a97439fcf8f6b15426b61c319180131d0d190bda91575c41accd75e1e61b367578f3005e18bcf6826c443c62da1ff18eed5c68dbd04b1d9e39e2bd40c3d78bafc855fd4c52420d1a0fef8e70be0e6c809f9b683c8c11e445942f438797ac44cdf11d4d84a933400def09be3edb11c47155dc5dd66ce569427c3ee5ad411f82b71cad5b94a08111260d0aba65e3f9067504d631119046abb0f6b51756186a5b55ee104697467fe72e85e8708c1c661703a1ce2f076f9803c1ea44f117d76ba4cdaa430e7a401ec4397ffa7bfb918b85386475d75e6d2e86ee3ca4bf1e25109400e860b848d55520caa14e1cdb6834a71c3f6884fa94d56844afd56b5489d5a228f9771d8e6694bf4df472fdb2ab6fab983c6b56bc4e95bc316c6d5cc2ccc660ba000bd3cc07a46bf7ebb27db61284a7dd2f62d43507a453275d3ed90a0c69c54d1760719df070ea87cdc6c5d1e1a9e777b62f7d68438ff89ec6e980d1eb0445f941f13d10dec6c2dafdee2a826543bfb2b4fe23fe7863a27f7c13dba28cb60c80770cc04bd646e4e8f03cdb00c337783d986c6709e1474d17956519f0f5db067478a6eb068cb61e80671bc6c3c33ffab3e0ebed8f84fb2d597ce3c6db01fc63f0d6a62d7eb6507d425e56116048f19ce3353d870c2cb381708211ec7d85653fb9f152564c2726265d1de3016c66546513c8af8ae546d5f4639be566c95fa414a6a6377b4241483b5bd598fb069540a4ca8283a3f628a841e423d10e233991400021c06c95946c0f251a3e610fe8cfa34aab96a5bb265d24720892a0943f525638fb766d5c007bfdc0a4833f7861dbb1cfd13dd1605c361efc85fce0f719f1193cc3c1cf1803e1dd07720c3c67c37bf1a077e2e105deb36293317310eb874650715cb6166f68bee16dc03c6aa8c350c3914fe6704e7050e48fc7d74fb0551b8dfccc88ed1df4cc481e4448f98d9d821b69099e0e9f5f49ccf1e54661ef601bde20bed1c4f07df3c40fceb03e1e41f7d724bd7e931d0f8f9014360e5fbe1f38fe81fbad30197ca3c01846064406574909d7f96cccbbb3e09c8b80ad1755ab980414cf1f1f21c15c576cfd1221b1a1764492655fabb080705072b33f0a9179e9e9cb2e961243e8f194a1bd5a8a7811db89fd0645ec7e24f229674b6654adfbbcbafd5229397cf5ce84f1e3c72bf898251507060f74cc361981ab4beb20608602c230491e1a495105863ac223f59a6c2dc8a1420428ea0e6942a04d4be95a68db50e7aaca750a68ff7da7c56e60e2c11b3a76cfeb171b1701e352a08d8b29402a83b9fb9580111d5551c62494f07ca01137c9fb243c5d33aacc04c02b80be2b3cf349459003fd28827e08c0bb2021defeb4f5086f18c0cb4b3c2e566ccb3aa78e99f366aa10bbc66c5dbb1b22d16b408a20d11f25d1f7554dc914d1af1e55586b85687e6dab9b5d1b48977f1d7f674c856572cfcc82c0bf5250010645201790f13917e0d9aa5f002f53a9eaac7949ba419bdd4975f85c05e3d9063a37882fcb2e8b2a4a2f4b32da06d87a2b602a234fa55a04fdd2f1f5dc5cf3607c747864d44f723c7c467db2e1a8b6d10941cf864bf8fa03406d03be5632f8e2fedd7cfaba99d31f1262ceb153de980daa739f711c6bd4702c85ef8151e6ce3ea44a87739308c75a9164d9d76ebc50280ec4fdbc507ceebae5468d2276142510bc7a3621e5aeb4cb5f5b0321f878a73546b0f3ec9ba4da824339ba48d5a4e2eaafd7148063727f43112f47ef2fff1e27884447245c4ca27125a19297163df5c381c03917261a97645545b00cc62679039dff0e7907dea3493e283144fd2a3487c1d32506136767921844e3541a096e244cc8d955debb7b841b67f4e345cb9d1d10df518f841d6be4d0701e619d906492150f512fc6f51c656ec6d186dd338d9c2ee7948b991bb449b517ec4ecae13bd0ce6a14be519f0a15f177a09d95103e735715413781728924f9f59b783c7c123093d01a8b2f977092c557f8f085f18fc676d2b70f7d72e23450a993648192076388a9e64e3c78ae0d8f7f63dcfa86759f7cd9df91e8f92eb58b2e720fd4a829421323b133e9ea59f5398b742defbde3e09f40254577599f0b35de690da9515250d21aa7d7bed425583342c007d8a8fae03527282c429426da2520172ebaa5ec5cf7dd910bd60f4d342ebe71c8d2c74fbfe3dd1799edbf633c8bc1d3e7c31f819bc9e099f00b27c4cf1cf91b4e8c9fef3955fb2295c1629163e807e0b1be68f9c58ea3c69b083a4a9c98c281ab24f1c229e4d490c084a196906b2ea84c71bf378e0bb6bd3be5c31afee6fe373c3fc1f39595103e9f87ac86e1fbf0cd6a1cbe41f823bca4c7c3bc1ff66c3c4cf0ccf39914be4111e441e381eb7ee1cdd327bfb44c88efbf2e9ab61abc4b6b98ea9d246696fb0a55f474f32012129e34d16675d2657f131059a2cbea2f8805dc393aa729b871ce33b2ab360f3c3a2c7a76ea230a26e5d24a5575ca0055d3d59478c10c3a3c16072019065ce1e06ffcc0eabf23420470894021018b272c9dc45a37d797715cfc014dc3d53b98aefc18c691fb395a5bc1d34dc451936efc18e6f41066b60d8749263e9d2eebc73144c6b3583fc21ade6663a8de8f418600c22c455abfeb515831076c6534de983a871b19f17b4e4060c3c5df35bdb3bc343346801e12ff709d217cf36653ff6d684735fcb9edcfacd3d7e77131049e9a6c45c1c6db84fb2fca25493b495b94095ff3fad2e16519f0e53699e16cbdf9ef086fd478c449128e86af49b2e6e3e19f3f24a476427c93b5f501be9fbcfaba331dce319238507381b656544d611b6cb8c408e17d1f1ac6c22f493ba291655f1110c7fc55b42a5ab77b72fc428bb283868c51902b891d3ca0e24ae99352d9748e8210429515a685c78baa30fe040909deb4610332e1807ed801df275b108e03356c299cc8fa7842522a3a366d1a6b6a1bdceffdc48cac5c45402a0ef5bc77501b1676d4b751f48dcd5526fe833f0af08603bc30c04b7cf01753ee2ffd20e2c64b5f843033dee2861c87c65c1ddeee8edb9f5b364a885537ce9fb969930248aa4bdc58cc8b8502510d91bbb46e602462df1d503f77f71d22fe0009c3b8e8eb39300239ca0f7a369e001f72a7892423a68d077d6162959979dd717cd97c717c03545c81aa5aee1516a4e26a64047934ec234c3afcc68f8703edac84f89abc2619bebb7b6c3f78d915724d7e5977335d7486b60c76f119d52871a06603afaa652a793a7f6ca8392149baa4ece90f1b2e74e564b65ebbc6f4a33a9dbcb4c7e3525a589d3ac4cddf2f20ecd0e2c62ecfaf9f5d15ab9e8ffc3552b863be102b3ef87ae32c50651185c6fb1d1885ae05ef1b8cdbc0ab4cc938be063ae0ec61c74d65adaad0b980dc9a95592d2621f5fdf8bc875b7f22c4213bba0cb957e55eca73cd701633629b8c96be34e03960b4f522bd99511c9e4f36e23d13ee519907f79e987270251bf19e09c6c5798d355e1afcf3b32097582904d6c1b8ac1efc7dcf897f95ebe41ff32a56a0771daa00c0784e990720130119d3c11859f78eaa493201824359a6d7c9ee743d7df2607784fa586d3adcd3c07af6ae3e56fd2d51712371f3383a61ff0d7152749f0a18ad13dcb0a9569dd159c2179867011e0a7e70c4b4d520be682c6611e409e280549ba52bf7dd6343c66780b79711e45e3b30275972e361c16e0fbe262121bed18b230b2bef12e2c3ba178f72efa4dfb162d3bced10c85a839932c0385e7505b4d1688e1933307e0d8ce518404d57d776024c6ca197b5a291655f111038288970a064200fcace438eefd1fa2221d2bb37abf9c3dffd1b830e9a7c4ae9a17be9c042083d9532c935962fa99d593ab59ffa0239482420387058534a0a14ed56a99a544c9ab02d3c4e736dd25d6fb8005c22b050bb12d2299f5fdcefd85b846832b4c5c0bcf31b1897d1466f1d5c88b1b748c2910bed79f1ef4a7a6197b088e47970e1559037d4681a35fd60f2a7e2600431e00e79cf6b09068f6df879ba5757a46fe45c57d29d78e9b377bc243754f5c6ca6995b0e16a1981c08d878484bc5bb6c3f390f61ddd26f9fd36eefaeeb1fed4bb4f97eb29342c745a4f77a4bcf4df19b167319dbbb79e470334d5ffe4d37fc7e049c2d11eda70877ec30c460311deb9eabd041fdadccba8e1886923be2574db4f1ec00f27c437e8022c824f8c8f82976c04b9613ce292992a784111e441e3c103404b1a87efa2d367747b79b910df144cfbf762c8d987779863ba7dbccf03e3d7f08228b4819084020c129e733c43c75eabe8f71b0141159294400ed8d836afa25c8883761d7aea5fb6c69eb2dd5427164fade045c4ea17f0c084847aa40c3cf04229ea5db5fda019338428fb7cf3524caf5e8ba94430e508729c18d701a947ea4e5035456222655e0b75186aa771fd37155f8a171c9f3784387ee23983cf1a2025b3c969a75fd025f62d1e98ea692e3114b11b03b9bb6e0e480c53496270e02f2e6c07e0a9dff31b036961c3c6c88103612acb32cb73701922dee3e0a9f7e480c43015e6976fc41276d079d94a75bc9153a4d41e8af15877d992c5932e1562c16d9fbfffdd0ef502cab67ba55e1321c100529448c02db20e52dfa06a8b245528ee9dfe479dd9efd9ae727da76c4ebb23fbcc04e3eccf8eacdae608f20ce87faccdddb825398afd5e0c84f1f3180c5b835f409cb30ecf8bf0566d2f82bc04da61c05f27fcc9e2eb3120d9807f18e01725856fb62f823c4383e7112a7d7d992454c12ea82aa10baa609e70bd353227191f0f8b13429e832b31bea5e11f87bae7d8077ff9f7f4f160abc5f55ad941d5d570052d12106ab3c067241c18af863901298d3b128e0ca81db187653f1bd15d0e7ffec269f76fdd26a9e2c591655f7f1dfb340c7fb9eed38e7d1ea05befbaf1844bfa834a81c79d58d3f5766809d4ef410dcf939b31d44438c27bd2cb0485c121028bef7384481b94bee1cc0e0d1ae7c2f0acae733605788d6336246f9c193cb49d446df81c6d1b4e627849bb2726345a12dee358f661a1eb861b1df15e0c92c7a8baa9ee7d318591b71f9806e9f82909226c28f44ae13a65d41d932d84b97b93111d4614379e4b58ca3a6ceef4f129c26ccb209b1ec39fad676f1e13dbfe087e0ef08d30bec66cb3cc481e940d37c17c35b8ff8cf84669feb212c14f1a5fbfad445f5ffe7da2e36bda27c375a7019fd38879fd363c1ed1002339b31d96656d39f3fb4b84f86f97c7ae1f05aa27be3ec9dbea13bdcd039fc9db0a6d1fe814a28d54dcfab5c55e967d2d81600d3c6bbc2aabdb8d271edfb6af44e180f4c2ec6ce10f6cc36cb2fce62fa64b6dfa5ccb6333e494fcd06a49e9d46239a89f55ae40dd208a6e38b0357de073e6474d5e3638b0195017409d0bb593f410e805e090ca231f6a49d8ba0ce993e7ba21670ce9ddf7b977e533b345bb666e3a787f6e28f576ce819902bc7c3a66e08882ef90470e0990060e330738b8a94c22f4020805c02b0078c8e13a002f1be03900af1fc083d131a9d0b8caccc0d965aaf69a59dfcd1f3b4788ef1efce22d37e7955b304710e604229515ba3fb2eccb6803411d72046e2624093517fbaaaa90942c4b9e5ff8f87629011f7ddc690b2f973db3beb1cadbdc1e879f0db63e5f7664d8c619600bf15424163ca7da0520bfc2bc490944a9140772152271dc20491247afaf03bc2a958fa7ff8e70862f9754c9f696789de52699838b2495007cfd39b8747c4d7790737c4ba85d00ed8c84f0837292f1f1b04833a0e019727055cc2d5bbe42128c31998fce78f2cfb10be9dead5059dcbc24ae205954808abe1ace354ab904eb95182134a2a35b3ad451d4b020abb6166a47ec65d9c7048422ad5132c0a48af2e06cdbace3dcedad843860c94157fcc90d04f4eb3eed584dc9e9885eaa361c98d677a122f74ef4832e3c2cd78df45ef3c682d71740a01837aa9331e946a89c40844e00001c4c494441548f563511103ec0af431d2729c44a41d008e8cf63fa79b27960fd8610e7e5dd34e5afcfc8a9989f3a6ba01bc9cc23598dc66538e84daa01cf58cb23bdd5f7a6acaa5e1658077eaf36ca545fe4b80df032009e03f0f483df3b386cf87d1ec0d3dbc9a6e93644bcd75d573d73abdc80635e7bf4a0e72546f56323c5b4119173830d59c5084715e89089a383e474987433f2aeaa697d20a3a18e742d5968f793fa0d3d52129a50e79473faf513222ec2fb3ce8474b357e487e0c4e249e0a86cf9b1a9781e24ef89d9a67ae82290960300cb6810446774bc737c96cb8088fd2aa9b549e0c7e10befc8ef012dd0943f0bbf80322c805e2c79d46b88a36d9f1c880effd8c500c5ec5e96597af3c5c88f71f7dbaf8898142ec7ca1f48b5d23142052ad628e3e24202a6da6a8445b0710125ad7a8ba02491a8de5513cd710d302a81df133957da4c2f2b98539f0392a3fa46835fbe5f7aadc2b69eb2745be5fe2c66570916f38a6232711d08e871265ee726daf3cac26679110bd1fcfbebef72dea498c4477534dc4ea54a8e1e0c038120c34a4c875507d910405dd2042801fd8896bfa1d7b3e0484c855ad5dbae9ce4fdd9bdf52e7a7df606789b8c86cd93311a7da493e3256570d7891de8e0e8fa98a7c11ea0655d170701b0dcac1956c72442f729cc163eec64946bcffd86e45e9e7cfc943ffb29a7198b4323ed23f56b37b3f303b29cf0c40eebd90a286447f4d7927fc81a312a3dd39db8f8e397570f7cce110f7e2b079f4bb4367b17189c6f797543c6341c56b52c1f0e4a449469037a092dc337c93cdc165c697c38736c00b7267770c714b368f0351e3da08156dc2f1f0abcad4f75b0b7e3c7ae65942bcf5a2ddfb61596f5bfad3573bc0664b2a299028785257aaabf5e729fe23ee8efed83b794034f608199f9fadec2309048bcf688c072a06f649dadef44f2dfff985e4d8da2c3fe4d63c5b7e38445c997a968873df0511d0a6fb007201a6a380c0e79d24cdef2244bb778f18786e0f210e3feae84d4d25e7b86ae3b7abbebd50bd0f250fb1595538e05658c79328354a1e79f09cc5fa63196ae061425d549df206d4b25f7f98611f7987241ccd1e6bf9d23b6fc7f0bfc6bd09ce1a692982d98e386d8585973e3bd6ef38ce477d6e037d2ba1cf15073412daed54d8a4275930d54891d07b65c3b89690224f00bcf3005e4b801706780efc3a03e0091d3fa62210d00f0f3fa1e3c7eea7b0e17e8d0ce20033a09731bc4b5bacbf64865c4fe3a63e71fd9beb152c727384ab91dd24746ea9ac84fa23a8f17bf072418e8e6c2290d9a01eee5b201516f6240c354820d65a2901bfb7e02337434297bb8f1fed322e299bd2569d7a6aacbf5ba0bf27417fd702ac0ce8979a37baaa18dafe7156e3d142cc85b68297cbe0d9d02e61f06d9d538ee3c4117e18debe36beb77b8a6f9c4a2a0cbfcb80df69f01bc037231e5f092f17da1abc24f05d0bcf69f88acea442cdd84bf8561c54b1eb93ad35df3d23c4c42b9ffb6fbe3c0767df38615aa11c89bac2da372a4f56cfa031bcf272a8c1468b2a2bba39b55c7f9eaed406c983ae1960f11e941b1025e7b0f899cbbe22206b55c50f54aae1407603fd36ce5bf5df8a17e4869b7fc2ea56f32547fe4adaf893dc3cf799a02ac19bd73c115e9125aecaf1bc7e6cb76afa5c8bd37af796cd6f7b8fe8305872a8ad97dd33e75a79386cae7eb60e0e882824d32333b30df88d66fdb0597f4aa0ee9cb89f2120182e0169b1bb75852be90c3af39ec71e7958f6efb5d4290fb8aa3557b4ce8bc33b0b44e1525da71ae83668f2563224eff379bf08dffd0628723b002f1be029afae71e0d5956df09b174c0565ba002b0bf01d872a02a6d20a5069543d5df1c98f438578efdc27434f1f283793a89a500984826c19c8d1018120f747cc828c6ebb702f0ca9acd05f1e37e44dd0339bd5c81001d10ca1a429d77575a4fc964552223eb453f727af7209d349e2fa1603ddfe820d299bcd9bffceed0c18970218171c67d5f6bcceb40baa8c49128bc88b4d87ef8f7f2881b682674892484917b97b31c3d7536922c3e24b9298781d9bf035dc116ec2374e15aa8f8747a8d4fa32a8b812b8cd17c17309c763d103d35b3db750128ebf8fb8ebdd1be4e1ffef1dcb773daf3acc250db2c5c14da74450eed63f47c607555c787f0dd970212720b9e9a2a4910bf55a56ff6c655f4b203a6feb3b8051a5e346924746d7dcba4812920e83babe78b514c9acefad1db1886cd3c499379e5ab0a0534fbfa859e55172223b457a2de9fa8dfc608bf871999c98adbbd76f2d03ca4d8403f1c40e00a123c20747381188e9ac4649a3ab10170eb975ed09238438ee8133ad31f2fda1d294f3738a85d9f6309a38fc5ed08f30f4836f1085add948e7403b57c1838ba54c07465080176ef42230daf6f319156d784a1dfc4cf7eedb881ebcc457bc06300675ebaa1fdfb64d888faa47e53f9a2e259089eb5fd90ef7bbd4cc5775d58150a32482840475c84860f09e179438d046862a0030c247bf861a3839ea890d6dc650b846f5b2755b46b917f6742aea1d71df9b3eaae91167a7094f7a4932dbb037cef0b6305d58a534e33970419527b1e23c16a8e78c362907e021e140f8b6d6363318050de34bed5c6823fc0c866f4663f025781ec391db20bed90c5f6e7c2f315c5065769bd7e0572d2e9fb74eaefcef7a177ef0a29ce79967bd37eaabff516fc0839e6e38854040b46de07ae4711d14df012a2b6474284d3bbbb08e240e18005dd92f7efec0682afb9880709b001192d150838ac7dd78dbab373eeb0ef89107677eb6fb39b9e1ea9b7d73b69bf77e2d898ab15fc771140d6e3c1ed8967a54faca0cf99e0ed33a77bae023f99e493dffe3265dacaeaed8b25a1e183b976c5982ba47c28fa74219cdda923368726bf359a9c70a3170c4b067c352d239befaec7f3c2027b669a4e588a7fe251fbada6ad9f1558d3382b1600b3a0b16b05f62009c92f456f2e00d03787989c7854b0cb8710c0158283194ea91b7be48617ffc0a124001f0543f82af7885a29eafdf56d7ad5c4a8c859fbefdcc637f1262f5b8ef66fd78bd7a0275c1d540389063ab423f79241ce82f8f5e56e8fe88de2bb821d1f88812ea5ca81dbd26f76f201cb46e60bdbb12e8c6b12b2f5c7a8f94b05f3ea1c9204990ac2facb456178b78d5870db0800c41db81b6c7308d86e7543b0bbc14e7f99c0f54db8bc3d0e1d33e22950bc0c7f887c632180d1b9b050ff84c94665fc39718435cb70c3e6314397cbf338603fdd4e163c4bbe72596110fdfe42556dea6ecc3e27652d2387c7ac757e53a99d2fe8587dceb017ebc6bd93f7f04152a19b7c1890319962a8c244723394a1ca05245c281120a8783aaaa08dc881a05c9c3678b43e71f5bece362edeb17c06be03d3c4e03931ea681313b1db2e8ba92c785b7dc367f4c441efcebd3c79c716302a0e835918f1c056e3cb0b4302f1df937f6bdc854df5b4ba03ddd4a738d5091acda794bffe306dfd43ef68d94546a5b57d72e7545c86662612cf9e3fbd1735ddd64ea75e9d9ad1748c2715fb3b4e3a4089a529ef6f7134e907d3a36f4524f0bdea4b0092bfc8833d217348f1c1fa9ae26153d415564764b74183c1b5af9f09c7aef48c0a3a7cfcdd186e7f2015b354e4101592381e3ed0957a8261f399db81f23ad6206cf4e342e91136bcfd875bbe4ecc6bd3ffe09294b2dba67fa8c15e025558b374c822451b156d5e570e0574c55352728da8d9022ce888e81573ced35b27636d4d84324206ae42969273a6de0f5022ea332a0e2baa7064bd6a0d5d5ed36bf005e355a31a878e2ae12566d1ce791c0680cb362b7e1906dc3e78d67501999e68d477c0b7695b23f50af61f8843f5b7741f8227c5b87e7c13748508dc5d7a25974e06f0c5eeddc9aa1dbde938ced811b577dfd8410cba7cd9d3b5dceefe2dfcf18ba0a24803a8c2fc2b000583f64ec46a70dbc89146d17d3f43649c4681c47af2a804757d0a2b11c53eaa0713cce89c3ebd9fe28fb8980708e8d3878880b41ef28370bad5b9acc16e2a4d0f965279e28c4116d7a9e3b65977039aeacd08c04b0935dc818998d777af7b496a8e78c0bcd0678c87939f07bd5ce5407a0dcbe08af51073f7172f970f0636ea825a45977183c1be025de807c1cd086b4c41adfe0b8e081e1c1b313e29d0907fd126b493cbcb87ee804d10e509564423f96f8c625d6ae3bba7a52694f213e7fe2cd371fffa79438ae5f70c5fa6eea41221c58a3bba38af116e519d0863ba3c9f8788ffe3b525d419c10110ee6b54204841592aca107c418a1f7df59aa4e4f97df6d4fbdacc59d52527df0cf47bcbe5b12971f9b34397b5642b0e1186c0341250913d7df12603c928fc8ce0f800f8c888f21083ae8f708de1ee08bed86096192f856f7ad18b16eb41065af95e62d1c24c4da9edf977cf59510dfffcda95bbe5ccefdb0fa1f78ba7fbad707af65c0005538e0719dd1454e6cbda2ea94240cf41ac414242ce0b50e08d1af877060d95f04c486d7e5eb3512129f24d244d5cde4c171f6eb43bfbaf926210e98dcf6837b6b1b78879f6381cf6921ab8d96091c1bdb781e8e3e0edf8196612383e4b3c4d20e7e12817df0020e7edf01dcf00649000fbe050e3f0c07bf6ddc70221eef2424869e498d8b0f1e7bef4838107ad281107bbe7c6259ee7229ea7fb2e3b5839f1d21c4c693579f5a5aaa20d2d5c0b82181d3ab0209a37c34d4cde1f37bf4e790f3abe191bbe8b6cb7204910ed916890b7cce2511cc029d02eb192591a6d708d17e52e72eedfa0b714ad5a54fbd7fac7c664cea573dc618e0c7dec118172eb10e03c685136ce3fa0b98b7b0228b494b9241490d6d80e749503640cd07787663f0956d0bda084fdb17d173c4e31139af911935f76dbb45ae99ba9adc2d72c757e6eccafba1ab9428c4c6c3dc388c1f1e5d72ff324920567fb160e5065085f20be47c17ce2121e1f7f9b01a1916f2ea83f54636b74ff59a22cf791a76765f8def7e22241c36d48ed8cf657f11102c0ebc16365c0809c9c3aa46498436dc89aa6ede498801cfe755e69508d1ca6e97769f7b80f4b7ee4bf9d2fc2adf42ce018e2d7fcf2406d9b2e1398535a492900b3e1fe0393a3c347a82ca2ce8e0cf018961fcbe95188c9ce71e4a0cc62ca8744018086026a962b2dd0db161c1aac953ee1062eafd2f968cdd2237d55335a328391c120e4ce980c645201095a09aaa28811a545864f3c0da94b204bd590ae3474a78571507dc1f432a5a6c2363849208aceb26c818fd8f109dafeb73cae12b84e8bd38fb8a172f97cf1c9ebee1845d0dbcc42f61dab136635ccceb5967e37ceb399091311026801f7db07eb49b4266e7275b2f9e7f913ca85ffbe9ab457245576edcf5c3767990d71d53f38d6b634c7ba7c989ee78a4ce6b729b2b99a57d956e357954b64f4b3fc35561a7be9a36d3d540847e48f92e458e636453dd37eebc45fe5377b73bff7503aa8b5d9564ddbdb5396ebb6af0ee27dda499a57f5edf7fcb9f25c3f1fdea66db24618e4cab1b42778023c78e71122ca54784a5efaf67f7c3d0818e8403250396361d3f4755a9ef9e8ed3d8f3a7eb35bfbb9cd6a549e2b0a176c42f54f63701b1e1b5b8e48157456fac14d86828fa37295375b335aa766d23279f77f16dfde5001f36bffb09fffe56c23825b42866943415cfab44bd3570e3b1837fffa98a748981ebc23de3a281c3f71dfc98fd75b07a6fa0c460033cc3c1cf556806db4b902a11fa119952fbfd8e51422cc8f96ce9c85e427c73c9b4260b2f553fc4540cb54cc4279515c66fa0311209489eaa2b5bc2ef180748120712103c60d0680e88373a4b293c479208ae6bb489c4a9b2dc8237663695758b49ad171df0b41059b75df5dcc30fc9cf8e6bd9fad2850dbc0bc7196d5cc3603ddb64fb53d824cbb8980807ad8bc4b6c5e898e83dee3cfc74cbcaac09b709317bf3fbf77e2c39ef9a77ab5a2381a7ecd8a822c403d1a48a0992f84c05558dd0539a3f06bf9ea9244d0403e3c37c3754627f0c81a73c7715111aac9150601bc7e30b563fa8f7e397575599cafe2620581c783d974450878c9208184b9b422ea2780eeea892df3dd6ed2d218ee973ea8dcfb595bfc94e7bbc6bd706de693389616f5545392213e029c2316c2f554539f0fbf12431c0d3c9a98a3cce9071f8811243e283df67bc25788d3c90b00001ab4cdb55b2f26521a6f71b33f8b94142ac5b5b7cdf46b8cf05ef6f41af28ae2bae42c90309c7eff436facfe3e7fc821d9fc4f173e992e179eab1a32a7e23661a787fa5dfa66a97d38ed510b0e8aeeb339ddc19d77516a2f5651deebcc3f502cb12592989bc253361fdf9254cd3fad3b08c9b371b7e8d8c87056d058fade7dae6d54fbbf335ebbcf7224f0e940464d0ca8f36429c0c2718940980dfe5cd6e7e345d1d1dc859db7ad3a77a849a130eba629a110aba480c250f7ed531339a930481eeb568f4fe34f1f344a8b8c4838ccc170ccf30eb8f2d7e65e5972220581c55190989ba5849a44352bb74b8e33c9ddd7ddef42b210e38ba6daa1b887852eb0beaaeee2844abefdb3d79ed9112f6ef43a52d2ff0bfda7830db49aaa08ae1fb9e012a013341417836c0432fac868dfb6663a52e998c037883c17b2a799db80df06036e0bde3008fc181de2fb1bca9e5cfee9cb0e43f42ac7867ee9913270a316fc347b316b869f41df1003f68c8fb84491ca4b262de2adc8b8a9e0337dedaa374f868f44482810705cec0cfe62f0ff07c84049c455220a0311572b5e19dfd2499004171d773ac2dd779ef36d9d13edb85e8d4bff7c45b8f93cfa6349b7dd25d09df1d56ef6ea4d7958111e0eb7973b8e483896592d9bfe98d4563c7aa5fd2018ac6622018949b099358a24a0725402e8920216964c474b430f1f3bed433d846c28504050809d9c0b8ea88db401ed09fe384019faf636d7e11192794bcdfbe6cb98ef895965f9a808455e5db70701422e7950a3611748f4c3f1b6a20204d58ed66b76d1fca38b6dd22218ebd7ac0ca6b5e17a2e5e96dbebea052c2fe38e5cd56d76b38d80a074b3f3083365e26f3ea1a0c9ca07923db002ff1c18f5e35681c35d9364c07bf4f05e56b3b0c9e0df0d4f7a05a6bc0ed1302fe40e2428ef4b19a9ea512e3ad9ffc9839e32c218a2f9b79fd74f98bb5cdbfbf7f03dce4176157c6e2c153fba3aa310090a7a9f6a5b166c9e3f84155cb6e1c347a55617b5fa9046c55914a0bf6194a22b4aed1c88e5e88404888419aadd74de5e77dcf1ff8e619723c0f4b3d6ade2d9240a786d29b76a98e7bb78971e15e7f06e378dc7a89fdbeaa7877c6f24385f8f0af2fbcf7d0003987436b3f22f767640018c1e7354a8475ccbb881376ce69277dd5aac37e8f6d4e4870fe1921a9e777e1f7d7db51d6f6d559ec775c1565221836c3b7b1aad35fbcfcd204048bad2ada700ed4209c23c7461b0f75caff50751ab8ffa69fa36abef15cf7e096d7b4296bdd5d88eeb3fbbdd2e72a213a0ce8f2e4f9e7cb4df942cb97dcaca9a11742e9cd9b37a8ca11f1d8c5490ce3e1533cf88be27e9dc87dd70178d90c5e36c073e0536d63d3c1efb36518085631b47b1a545c49aaa0eaff50bfcee520abca77b75c2125c1d259eb87cf6d21c4bacb8bc38bda09b1b2fe9bc37f7073419d1c9d100952013077c71a20e4d518498e5e2aa60389130ae6868b1ca2cf5f9e7174fb4d97eca88aac6d7f56750ae43e42552d7921028344eb1925136cc7ad6bab87f559b3c992efb8b17fc7e3e43ee8d0a1736d7fd9df961fb69978861ce7d4caf45d47ac4e5e051ab7de62a742746474b4eb7cf0e584ff5e7aeb07426cbc7ed588cd2079d432af218a6b401b15c63540bb0a02e55045c9bd8be88a602d8d6123ca70f63bd6364a24cc1642073c12166e8b40c26070f32655145799fdaf2118bcfc5a08081647557cc385e046ae14f0d622ef16e4e0b0c68d0684c5c7d1dd0e6dc829e3ba0ba7b6489bdd649610873f7ff42387ad10a26ddee157674889a5e9a52d7b1efcbc7cd79d69fd9a3f21eb05a9bd5db76271ae382d66244d17b70b298358d789d6966ba65e635d163357cfc4ce58eabf6fa31fbbbc9e351d7d73a01c27ee73793df97b554055261ea68d1d3b4e306f98f8a3a545c14868f00d40c88354227f1400d1528a93e9640c8d7d6e5d690d72554c91eeb52fbbc6ceba3135356e246cedef6aeeadb85b888a93767e503641884da135976ce821c44fafaf1ce0065445cba2371087851bcaa0cb454242e9f499b7091110943ce0ae7a327aa34a04dba7eb9f73a324e215015b0aa620f1795519541efbbc38aab2c01d3934186a201cb89e7d9209aab8205e240dd63512942693a18608658ca3727f77c83fbb7ed05eaecf76e7747a24a3408803fe79d0968e574bd80fa51f71e005f25d57a655bb0c53a87d685e6c9fac1617c5d6e36a71ad0b6377687b97b5f2bfafaa26f4f902c697e21ed046850404558ba86a646ed3e8d6ca0908a98ad841baa72a459f0462806bb2b9f822ba79cd0810ad2b0e2fcaf037e0f3db2fbf360282c55115b78dc091e88b64a774ed2099e0c6a30d88f524f81c2384e1ea5b4af3ce3842dcd0a87a203ca08d040efc9de880301d509e1403c54efcdc2f566cbda9df151827f2b31bfac81889124090dba3e1c6359e769d7bbb90b19271aef5f83ecc5d05d996f906ffc5c61bf0b0b6400d0c11caa674632632486c5d23e1f0a970e1c2b42613a1fd28fb1d3cc709145d5b10d26be6f6e071dc502301a13bb7d1c681b6282424a8620406006d56e4ccc024443a786df6fea8d8b3e2c0efb3d8e700df47580ceeb151ae5ae370b9e483bfe34e00765258ff064bea2f8d80a184551505fffb7a68a36da41e099f03356c083ad06003920a05366064a0aae9c22048934c04086be00029d0110906236016a45ba65c48904c11d2047a0707271c581219437fc1421bc881f69dd0fe5055f519f0f965d0462323777fc47187f18d407a6a1e7055cbef35b8873d87aa29ee1f8fb60d788e0e80c5806f0eb47f2dde2b8eaae8a081839a0e1a94111f60cfc37a8b02475f0f1c7e3decdb08ac331cdfda93549d066d92d4611e8880601be0e3bab6eed4d18ef685f7fd0dde8304e478a8e1fd35f03e5235a2c4c19c1de8aa55945819e72eee177b548c84e633f61caeef0758db81f619faf74420f0f3fefae7bef7ffeadc6cf775f9b54a2058d41546640be1b612baa0894b26c8713149220db262a68277174a22292c9091736c248120e140a328e0451120889f8960fc468a89e38a425aea7abcc9112513ee478fa91e78ae206ca36482de52dfb1e7b0662a325299e1c6e64671201ce2661dff5f5d715485f122dc7984d617974cd8ba4e05556c1aac677e711aad6b6088683da35718638cf8b50bf52c4e069d2188016092087762e0dffb22aa11be2db4b2c792475071003e974cd8f77cddfcff235134b6fcda090896b0aa9879db8b0076544d073c2728b86160a3a5409a6fdc70c499618dfefbb0517d2a2cdc70600c251516120e5b47ffd74a507c1b83d5dcaf9e0e6c6efb084a01c1b2dce24152f72c7c0e048908467ff67ee61f6f348a23e108881cffd594b0aa685ddbd0b6f49ae2499071428282eb783bb471fd1a6c2bb4aeb9ea0a094936c30f19049c4f1637c1bdaa7ca93d3070ee741d8e31cea1b1c56175234bd0faffbf12547e2b04841747559c83f3d94c70232201818d4784856d241fc1e01b0d37f4437a5b200119ccf0b493e9ccafa038ac86c28dcef5ff85cf17e9df932d020ffe00b7c7084b3181924994fbc9f33aace3f98bdb367eae1256156790b05f5c32a15429b85e0d0c135fbf21b6fe79c4bcc5ce036e1ce671124448b8a4c9920e22e1f125a774f4cff7f8e076f6f2f7ff57f6b0fc56090816aee2823679baf7841a0f7eb8e8c5ba03da904f9f36144814a1f17a9b366e2fd606b74a52619da2a3479fffca4b14dc33c558f6c538fdfb285c901385c0309f3be42068ff57afebc71a3e8700d1e8013a1cb26160bb98e1395cfffc7f5de10c098c0724bbf1d61facf310ae532619a3b797f51eb4c71bbe5f92f8bd34efc83030b757f2765bc83e8775500fb632b84d9f728b91ca2a47fc5ff94d97ff170000fffff898dda83e6a16740000000049454e44ae426082', 'image/png'); -UPDATE PRODUCT set PICTUREID=10; diff --git a/samples/core/src/main/resources/db/migration/postgres/V0004__R001_Add_batch_tables_pg.sql.pg b/samples/core/src/main/resources/db/migration/postgres/V0004__R001_Add_batch_tables_pg.sql.pg deleted file mode 100644 index b83928e04..000000000 --- a/samples/core/src/main/resources/db/migration/postgres/V0004__R001_Add_batch_tables_pg.sql.pg +++ /dev/null @@ -1,82 +0,0 @@ --- Autogenerated: do not edit this file - -CREATE TABLE BATCH_JOB_INSTANCE ( - JOB_INSTANCE_ID BIGINT NOT NULL PRIMARY KEY , - VERSION BIGINT , - JOB_NAME VARCHAR(100) NOT NULL, - JOB_KEY VARCHAR(32) NOT NULL, - constraint JOB_INST_UN unique (JOB_NAME, JOB_KEY) -) ; - -CREATE TABLE BATCH_JOB_EXECUTION ( - JOB_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY , - VERSION BIGINT , - JOB_INSTANCE_ID BIGINT NOT NULL, - CREATE_TIME TIMESTAMP NOT NULL, - START_TIME TIMESTAMP DEFAULT NULL , - END_TIME TIMESTAMP DEFAULT NULL , - STATUS VARCHAR(10) , - EXIT_CODE VARCHAR(2500) , - EXIT_MESSAGE VARCHAR(2500) , - LAST_UPDATED TIMESTAMP, - JOB_CONFIGURATION_LOCATION VARCHAR(2500) NULL, - constraint JOB_INST_EXEC_FK foreign key (JOB_INSTANCE_ID) - references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID) -) ; - -CREATE TABLE BATCH_JOB_EXECUTION_PARAMS ( - JOB_EXECUTION_ID BIGINT NOT NULL , - TYPE_CD VARCHAR(6) NOT NULL , - KEY_NAME VARCHAR(100) NOT NULL , - STRING_VAL VARCHAR(250) , - DATE_VAL TIMESTAMP DEFAULT NULL , - LONG_VAL BIGINT , - DOUBLE_VAL DOUBLE PRECISION , - IDENTIFYING CHAR(1) NOT NULL , - constraint JOB_EXEC_PARAMS_FK foreign key (JOB_EXECUTION_ID) - references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) -) ; - -CREATE TABLE BATCH_STEP_EXECUTION ( - STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY , - VERSION BIGINT NOT NULL, - STEP_NAME VARCHAR(100) NOT NULL, - JOB_EXECUTION_ID BIGINT NOT NULL, - START_TIME TIMESTAMP NOT NULL , - END_TIME TIMESTAMP DEFAULT NULL , - STATUS VARCHAR(10) , - COMMIT_COUNT BIGINT , - READ_COUNT BIGINT , - FILTER_COUNT BIGINT , - WRITE_COUNT BIGINT , - READ_SKIP_COUNT BIGINT , - WRITE_SKIP_COUNT BIGINT , - PROCESS_SKIP_COUNT BIGINT , - ROLLBACK_COUNT BIGINT , - EXIT_CODE VARCHAR(2500) , - EXIT_MESSAGE VARCHAR(2500) , - LAST_UPDATED TIMESTAMP, - constraint JOB_EXEC_STEP_FK foreign key (JOB_EXECUTION_ID) - references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) -) ; - -CREATE TABLE BATCH_STEP_EXECUTION_CONTEXT ( - STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, - SHORT_CONTEXT VARCHAR(2500) NOT NULL, - --data type of the following field 'SERIALIZED_CONTEXT' is mentioned as TEXT as of now . Have to double check on this - SERIALIZED_CONTEXT TEXT , - constraint STEP_EXEC_CTX_FK foreign key (STEP_EXECUTION_ID) - references BATCH_STEP_EXECUTION(STEP_EXECUTION_ID) -) ; - -CREATE TABLE BATCH_JOB_EXECUTION_CONTEXT ( - JOB_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, - SHORT_CONTEXT VARCHAR(2500) NOT NULL, - SERIALIZED_CONTEXT TEXT , - constraint JOB_EXEC_CTX_FK foreign key (JOB_EXECUTION_ID) - references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) -) ; - -CREATE SEQUENCE BATCH_STEP_EXECUTION_SEQ; -CREATE SEQUENCE BATCH_JOB_EXECUTION_SEQ; -CREATE SEQUENCE BATCH_JOB_SEQ; diff --git a/samples/core/src/main/resources/static/index.html b/samples/core/src/main/resources/static/index.html deleted file mode 100644 index 6d3ae41d9..000000000 --- a/samples/core/src/main/resources/static/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - -Welcome - - -

Welcome

- This is a test! -
- Services Overview (CXF) -
- 1. Table -
-
- -
- -
- - \ No newline at end of file diff --git a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/AbstractSpringBatchIntegrationTest.java b/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/AbstractSpringBatchIntegrationTest.java deleted file mode 100644 index 686854657..000000000 --- a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/AbstractSpringBatchIntegrationTest.java +++ /dev/null @@ -1,95 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.common; - -import java.io.File; - -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; - -import javax.inject.Inject; - -import org.apache.commons.io.FileUtils; -import org.junit.Before; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.launch.JobLauncher; -import org.springframework.batch.test.JobLauncherTestUtils; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.context.SecurityContextHolder; - -import io.oasp.gastronomy.restaurant.general.common.api.security.UserData; -import io.oasp.gastronomy.restaurant.general.dataaccess.base.DatabaseMigrator; -import io.oasp.module.security.common.api.accesscontrol.AccessControlPermission; -import io.oasp.module.security.common.base.accesscontrol.AccessControlGrantedAuthority; -import io.oasp.module.test.common.base.ComponentTest; - -/** - * Base class for all spring batch integration tests. It helps to do End-to-End job tests. - * - */ -// @DirtiesContext(classMode = ClassMode.AFTER_CLASS) -public abstract class AbstractSpringBatchIntegrationTest extends ComponentTest { - private static final Logger LOG = LoggerFactory.getLogger(AbstractSpringBatchIntegrationTest.class); - - /** directory for temporary test files */ - private static final String TMP_DIR = "./tmp"; - - /** scripts for all tests db setup */ - private static final String ALL_TESTS_DB_SETUP_DIR = "classpath:AllTests/setup/db"; - - protected static void login(String login, String password, String... permissions) { - - Set groups = new HashSet<>(Arrays.asList(permissions)); - - Set authorities = new HashSet<>(); - for (String permission : groups) { - authorities.add(new AccessControlGrantedAuthority(new AccessControlPermission(permission))); - } - SecurityContextHolder.getContext().setAuthentication( - new UsernamePasswordAuthenticationToken(new UserData(login, password, authorities), password)); - } - - public static void logout() { - - SecurityContextHolder.getContext().setAuthentication(null); - } - - /** - * database migration helper - */ - @Inject - protected DatabaseMigrator flyway; - - @Inject - private JobLauncher jobLauncher; - - /** - * @param job job to configure - * @return jobLauncherTestUtils - */ - public JobLauncherTestUtils getJobLauncherTestUtils(Job job) { - - JobLauncherTestUtils jobLauncherTestUtils = new JobLauncherTestUtils(); - jobLauncherTestUtils.setJob(job); - jobLauncherTestUtils.setJobLauncher(this.jobLauncher); - - return jobLauncherTestUtils; - } - - /** - * setup run before all tests - * - * @throws Exception throw by FileUtils - */ - @Before - public void setup() throws Exception { - - // setup test data - this.flyway.importTestData(ALL_TESTS_DB_SETUP_DIR); - - LOG.debug("Delete tmp directory"); - FileUtils.deleteDirectory(new File(TMP_DIR)); - } -} diff --git a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/AccessControlSchemaXmlValidationTest.java b/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/AccessControlSchemaXmlValidationTest.java deleted file mode 100644 index e79351bfa..000000000 --- a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/AccessControlSchemaXmlValidationTest.java +++ /dev/null @@ -1,57 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.common; - -import io.oasp.module.test.common.base.ModuleTest; - -import java.io.File; -import java.io.IOException; -import java.net.URL; - -import javax.xml.XMLConstants; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.transform.dom.DOMSource; -import javax.xml.validation.Schema; -import javax.xml.validation.SchemaFactory; -import javax.xml.validation.Validator; - -import org.junit.Test; -import org.w3c.dom.Document; -import org.xml.sax.SAXException; - -/** - * Class for XML Validation Tests. - * - */ -public class AccessControlSchemaXmlValidationTest extends ModuleTest { - - /** - * Tests if the access-control-schema.xml is valid. - * - * @throws ParserConfigurationException If a DocumentBuilder cannot be created which satisfies the configuration - * requested. - * @throws IOException If any IO errors occur. - * @throws SAXException If an error occurs during the validation. - */ - @Test - public void validateAccessControllSchema() throws ParserConfigurationException, SAXException, IOException { - - // parse an XML document into a DOM tree - DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder(); - String xmlPath = getClass().getResource("/config/app/security/access-control-schema.xml").getPath(); - Document document = parser.parse(new File(xmlPath)); - - // create a SchemaFactory capable of understanding WXS schemas - SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); - - // load a WXS schema, represented by a Schema instance - URL schemaPath = getClass().getResource("/io/oasp/module/security/access-control-schema.xsd"); - Schema schema = factory.newSchema(schemaPath); - - // create a Validator instance, which can be used to validate an instance document - Validator validator = schema.newValidator(); - - // validate the DOM tree - validator.validate(new DOMSource(document)); - } -} diff --git a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/DbTestHelper.java b/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/DbTestHelper.java deleted file mode 100644 index 8c528865a..000000000 --- a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/DbTestHelper.java +++ /dev/null @@ -1,57 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.common; - -import org.flywaydb.core.Flyway; -import org.flywaydb.core.api.MigrationVersion; - -/** - * This class provides methods for handling the database during testing where resets (and other operations) may be - * necessary. - * - */ -public class DbTestHelper { - private Flyway flyway; - - private MigrationVersion migrationVersion; - - /** - * The constructor. - * - * @param flyway an instance of type {@link Flyway}. - */ - public DbTestHelper(Flyway flyway) { - super(); - this.flyway = flyway; - } - - /** - * Drops the whole database. - */ - public void dropDatabase() { - - this.flyway.clean(); - } - - /** - * Calls {@link #dropDatabase()} internally, and migrates to the highest available migration (default) or to the - * {@code migrationVersion} specified by {@link #setMigrationVersion(String)}. - */ - public void resetDatabase() { - - dropDatabase(); - if (this.migrationVersion != null) { - this.flyway.setTarget(this.migrationVersion); - } - this.flyway.migrate(); - } - - /** - * This method sets the internal value of the {@code migrationVersion}. - * - * @param migrationVersion new {@code String} value of {@code migrationVersion}. Must not be null - */ - public void setMigrationVersion(String migrationVersion) { - - this.migrationVersion = MigrationVersion.fromVersion(migrationVersion); - } - -} diff --git a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/MoneyHelperTest.java b/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/MoneyHelperTest.java deleted file mode 100644 index 00c5c8ea6..000000000 --- a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/MoneyHelperTest.java +++ /dev/null @@ -1,72 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.common; - -import io.oasp.gastronomy.restaurant.general.common.api.MoneyHelper; -import io.oasp.gastronomy.restaurant.general.common.api.datatype.Money; -import io.oasp.module.test.common.base.ModuleTest; - -import java.util.ArrayList; -import java.util.List; - -import org.junit.Test; - -/** - * This class tests the {@link MoneyHelper}. Especially summing a List of @Link {@link Money}s. - * - */ -public class MoneyHelperTest extends ModuleTest { - - // /** - // * Test for summing up {@link Money}s with other currency (USD) then default (EUR). - // */ - // @Test - // public void sumTestUSDList() { - // - // List moneyList = new ArrayList<>(); - // - // double[] amounts = { 10.0, 15.2, 47.11, 42.0 }; - // double sum = 0.0; - // - // for (double amount : amounts) { - // moneyList.add(MoneyHelper.getMoney(amount, "USD")); - // sum += amount; - // } - // - // Money summedAmount = MoneyHelper.sumMoneys(moneyList); - // - // assertThat(MoneyHelper.getMoney(sum, "USD")).isEqualTo(summedAmount); - // - // } - - /** - * Test behavior when passing an empty list. - */ - @Test - public void sumTestEmptyList() { - - List moneyList = new ArrayList<>(); - Money summedAmount = MoneyHelper.sumMoneys(moneyList); - assertThat(MoneyHelper.ZERO_MONEY).isEqualTo(summedAmount); - } - - /** - * Test for summing up {@link Money}s with default currency (EUR). - */ - @Test - public void sumTestEURList() { - - List moneyList = new ArrayList<>(); - - double[] amounts = { 15.28, 11.47, 4.20 }; - double sum = 0.0; - - for (double amount : amounts) { - moneyList.add(MoneyHelper.getMoneyWithDefaultCurrency(amount)); - sum += amount; - } - - Money summedAmount = MoneyHelper.sumMoneys(moneyList); - - assertThat(MoneyHelper.getMoney(sum, "EUR")).isEqualTo(summedAmount); - } - -} diff --git a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/PermissionCheckTest.java b/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/PermissionCheckTest.java deleted file mode 100644 index 476078257..000000000 --- a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/PermissionCheckTest.java +++ /dev/null @@ -1,68 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.common; - -import io.oasp.module.test.common.base.ModuleTest; - -import java.lang.reflect.Method; -import java.util.Set; - -import javax.annotation.security.DenyAll; -import javax.annotation.security.PermitAll; -import javax.annotation.security.RolesAllowed; - -import net.sf.mmm.util.filter.api.Filter; -import net.sf.mmm.util.reflect.api.ReflectionUtil; -import net.sf.mmm.util.reflect.base.ReflectionUtilImpl; - -import org.assertj.core.api.SoftAssertions; -import org.junit.Test; - -/** - * Tests the permission check in logic layer. - * - */ -public class PermissionCheckTest extends ModuleTest { - - /** - * Check if all relevant methods in use case implementations have permission checks i.e. {@link RolesAllowed}, - * {@link DenyAll} or {@link PermitAll} annotation is applied. This is only checked for methods that are declared in - * the corresponding interface and thus have the {@link Override} annotations applied. - */ - @Test - public void permissionCheckAnnotationPresent() { - - String packageName = "io.oasp.gastronomy.restaurant"; - Filter filter = new Filter() { - - @Override - public boolean accept(String value) { - - return value.contains(".logic.impl.usecase.Uc") && value.endsWith("Impl"); - } - - }; - ReflectionUtil ru = ReflectionUtilImpl.getInstance(); - Set classNames = ru.findClassNames(packageName, true, filter); - Set> classes = ru.loadClasses(classNames); - SoftAssertions assertions = new SoftAssertions(); - for (Class clazz : classes) { - Method[] methods = clazz.getDeclaredMethods(); - for (Method method : methods) { - Method parentMethod = ru.getParentMethod(method); - if (parentMethod != null) { - Class declaringClass = parentMethod.getDeclaringClass(); - if (declaringClass.isInterface() && declaringClass.getSimpleName().startsWith("Uc")) { - boolean hasAnnotation = false; - if (method.getAnnotation(RolesAllowed.class) != null || method.getAnnotation(DenyAll.class) != null - || method.getAnnotation(PermitAll.class) != null) { - hasAnnotation = true; - } - assertions.assertThat(hasAnnotation) - .as("Method " + method.getName() + " in Class " + clazz.getSimpleName() + " is missing access control") - .isTrue(); - } - } - } - } - assertions.assertAll(); - } -} diff --git a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/RestTestClientBuilder.java b/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/RestTestClientBuilder.java deleted file mode 100644 index a4d93c10d..000000000 --- a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/RestTestClientBuilder.java +++ /dev/null @@ -1,129 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.common; - -import java.util.Arrays; -import java.util.HashMap; - -import org.apache.cxf.common.util.Base64Utility; -import org.apache.cxf.jaxrs.client.JAXRSClientFactoryBean; - -import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; - -import io.oasp.gastronomy.restaurant.general.common.api.RestService; - -/** - * This class contains a method to aid simulating a REST client. - * - */ -public class RestTestClientBuilder { - - /** - * The port to which the server is bound during testing. - */ - private int localServerPort; - - private JacksonJsonProvider jacksonJsonProvider; - - /* - * The user used for authentication during testing. - */ - private String login; - - /** - * This method creates a proxy for the specified {@code RestService} interface. Use {@code #setLogin(String)} to set - * login ID which will be used as both user name and pasword for authentication. - * - * @param The generic type for which a proxy must be created. - * @param clazz The interface specifying the generic type. - * @return a proxy of the specified type. - */ - public T build(Class clazz) { - - if (this.login == null) { - throw new IllegalStateException("RestTestClientBuilder not properly initialized. No login provided."); - } - return this.build(clazz, this.login, this.login, createRestServiceUrl()); - } - - /** - * This method creates a proxy for the specified {@code RestService} interface. The provided {@code String login} is - * used as both user name and password for authentication. The method {@code setLocalServerPort} MUST be called in - * advance. The method {@code setLocalServerPort} MUST be called in advance. - * - * @param The generic type for which a proxy must be created. - * @param clazz The interface specifying the generic type. - * @param login the {@code String} used as for authentcation. - * @return a proxy of the specified type. - */ - public T build(Class clazz, String login) { - - return this.build(clazz, login, login, createRestServiceUrl()); - } - - /** - * This method returns an instance of an implementation the specified {@code clazz} (which should be a REST service - * interface, e.g. TablemanagementRestService.class).
- * The caller must take care that no parameter value is equal to {@code NULL}.
- * The caller will be authenticated using basic authentication with the provided credentials. The method - * {@code setLocalServerPort} MUST be called in advance. - * - * @param The return type. - * @param clazz This must be an interface type. - * @param userName The userName for basic authentication. - * @param tmpPassword The password for basic authentication. - * @param tmpUrl The URL through which the server is reached. - * @return A REST proxy of type {@code T} - */ - public T build(Class clazz, String userName, String tmpPassword, String tmpUrl) { - - JAXRSClientFactoryBean factoryBean = new JAXRSClientFactoryBean(); - factoryBean.setAddress(tmpUrl); - factoryBean.setHeaders(new HashMap()); - // example for basic auth - String payload = userName + ":" + tmpPassword; - String authorizationHeader = "Basic " + Base64Utility.encode(payload.getBytes()); - factoryBean.getHeaders().put("Authorization", Arrays.asList(authorizationHeader)); - factoryBean.setProviders(Arrays.asList(this.jacksonJsonProvider)); - - factoryBean.setServiceClass(clazz); - return factoryBean.create(clazz); - } - - /* - * @return the URL of the REST service. - */ - private String createRestServiceUrl() { - - return "http://localhost:" + this.localServerPort + "/services/rest"; - } - - /** - * Sets the {@code jacksonJsonProvider}. - * - * @param jacksonJsonProvider An instance of {@link JacksonJsonProvider} - */ - public void setJacksonJsonProvider(JacksonJsonProvider jacksonJsonProvider) { - - this.jacksonJsonProvider = jacksonJsonProvider; - } - - /** - * Sets the {@code localServerPort}. - * - * @param localServerPort The port through which the server is available during testing - */ - public void setLocalServerPort(int localServerPort) { - - this.localServerPort = localServerPort; - } - - /** - * Sets the {@code login}. - * - * @param login Used for authentication. - */ - public void setLogin(String login) { - - this.login = login; - } - -} diff --git a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/SecurityTestHelper.java b/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/SecurityTestHelper.java deleted file mode 100644 index ff9a47db7..000000000 --- a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/SecurityTestHelper.java +++ /dev/null @@ -1,27 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.common; - -/** - * This class provides security related operations to facilitate testing. - * - */ - -public class SecurityTestHelper { - - /** - * The constructor. - */ - public SecurityTestHelper() { - super(); - } - - public void login(String name) { - - // TODO implement in later iteration - } - - public void logout() { - - // TODO implement in later iteration - } - -} diff --git a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/TestUtil.java b/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/TestUtil.java deleted file mode 100644 index d87334b86..000000000 --- a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/TestUtil.java +++ /dev/null @@ -1,31 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.common; - -import org.springframework.security.authentication.TestingAuthenticationToken; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContextHolder; - -/** - * This is a utility for testing. It allows to simulate authentication for component testing. - * - */ -public class TestUtil { - - /** - * @param login the id of the user to run the test as. - * @param permissions the permissions for the test. - */ - public static void login(String login, String... permissions) { - - Authentication authentication = new TestingAuthenticationToken(login, login, permissions); - SecurityContextHolder.getContext().setAuthentication(authentication); - } - - /** - * Logs off any {@link #login(String, String...) previously logged on user}. - */ - public static void logout() { - - SecurityContextHolder.getContext().setAuthentication(null); - } - -} diff --git a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/api/builders/BillEntityBuilder.java b/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/api/builders/BillEntityBuilder.java deleted file mode 100644 index 23894651c..000000000 --- a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/api/builders/BillEntityBuilder.java +++ /dev/null @@ -1,116 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.common.api.builders; - -import java.util.LinkedList; -import java.util.List; - -import io.oasp.gastronomy.restaurant.general.common.api.datatype.Money; -import io.oasp.gastronomy.restaurant.salesmanagement.dataaccess.api.BillEntity; -import io.oasp.gastronomy.restaurant.salesmanagement.dataaccess.api.OrderPositionEntity; - -public class BillEntityBuilder { - - private List> parameterToBeApplied; - - public BillEntityBuilder() { - - this.parameterToBeApplied = new LinkedList<>(); - fillMandatoryFields(); - fillMandatoryFields_custom(); - } - - public BillEntityBuilder orderPositions(final List orderPositions) { - - this.parameterToBeApplied.add(new P() { - @Override - public void apply(BillEntity target) { - - target.setOrderPositions(orderPositions); - } - }); - return this; - } - - public BillEntityBuilder total(final Money total) { - - this.parameterToBeApplied.add(new P() { - @Override - public void apply(BillEntity target) { - - target.setTotal(total); - } - }); - return this; - } - - public BillEntityBuilder tip(final Money tip) { - - this.parameterToBeApplied.add(new P() { - @Override - public void apply(BillEntity target) { - - target.setTip(tip); - } - }); - return this; - } - - public BillEntityBuilder payed(final boolean payed) { - - this.parameterToBeApplied.add(new P() { - @Override - public void apply(BillEntity target) { - - target.setPayed(payed); - } - }); - return this; - } - - public BillEntityBuilder revision(final Number revision) { - - this.parameterToBeApplied.add(new P() { - @Override - public void apply(BillEntity target) { - - target.setRevision(revision); - } - }); - return this; - } - - public BillEntityBuilder orderPositionIds(final List orderPositionIds) { - - this.parameterToBeApplied.add(new P() { - @Override - public void apply(BillEntity target) { - - target.setOrderPositionIds(orderPositionIds); - } - }); - return this; - } - - public BillEntity createNew() { - - BillEntity billentity = new BillEntity(); - for (P parameter : this.parameterToBeApplied) { - parameter.apply(billentity); - } - return billentity; - } - - /** - * Might be enrichted to users needs (will not be overwritten) - */ - private void fillMandatoryFields_custom() { - - } - - /** - * Fills all mandatory fields by default. (will be overwritten on re-generation) - */ - private void fillMandatoryFields() { - - } - -} diff --git a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/api/builders/DrinkEntityBuilder.java b/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/api/builders/DrinkEntityBuilder.java deleted file mode 100644 index 5791981e5..000000000 --- a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/api/builders/DrinkEntityBuilder.java +++ /dev/null @@ -1,102 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.common.api.builders; - -import java.util.LinkedList; -import java.util.List; - -import io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.DrinkEntity; - -public class DrinkEntityBuilder { - - private List> parameterToBeApplied; - - public DrinkEntityBuilder() { - - this.parameterToBeApplied = new LinkedList<>(); - fillMandatoryFields(); - fillMandatoryFields_custom(); - } - - /** - * Might be enrichted to users needs (will not be overwritten) - */ - private void fillMandatoryFields_custom() { - - } - - /** - * Fills all mandatory fields by default. (will be overwritten on re-generation) - */ - private void fillMandatoryFields() { - - } - - public DrinkEntityBuilder alcoholic(final boolean alcoholic) { - - this.parameterToBeApplied.add(new P() { - @Override - public void apply(DrinkEntity target) { - - target.setAlcoholic(alcoholic); - } - }); - return this; - } - - public DrinkEntityBuilder pictureId(final Long pictureId) { - - this.parameterToBeApplied.add(new P() { - @Override - public void apply(DrinkEntity target) { - - target.setPictureId(pictureId); - } - }); - return this; - } - - public DrinkEntityBuilder name(final String name) { - - this.parameterToBeApplied.add(new P() { - @Override - public void apply(DrinkEntity target) { - - target.setName(name); - } - }); - return this; - } - - public DrinkEntityBuilder description(final String description) { - - this.parameterToBeApplied.add(new P() { - @Override - public void apply(DrinkEntity target) { - - target.setDescription(description); - } - }); - return this; - } - - public DrinkEntityBuilder revision(final Number revision) { - - this.parameterToBeApplied.add(new P() { - @Override - public void apply(DrinkEntity target) { - - target.setRevision(revision); - } - }); - return this; - } - - public DrinkEntity createNew() { - - DrinkEntity drinkentity = new DrinkEntity(); - for (P parameter : this.parameterToBeApplied) { - parameter.apply(drinkentity); - } - return drinkentity; - } - -} diff --git a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/api/builders/OrderEtoBuilder.java b/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/api/builders/OrderEtoBuilder.java deleted file mode 100644 index 92da523af..000000000 --- a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/api/builders/OrderEtoBuilder.java +++ /dev/null @@ -1,79 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.common.api.builders; - -import java.util.LinkedList; -import java.util.List; - -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype.OrderState; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderEto; - -public class OrderEtoBuilder { - - private List> parameterToBeApplied; - - public OrderEtoBuilder() { - - this.parameterToBeApplied = new LinkedList<>(); - fillMandatoryFields(); - fillMandatoryFields_custom(); - } - - public OrderEtoBuilder tableId(final long tableId) { - - this.parameterToBeApplied.add(new P() { - @Override - public void apply(OrderEto target) { - - target.setTableId(tableId); - } - }); - return this; - } - - public OrderEtoBuilder state(final OrderState state) { - - this.parameterToBeApplied.add(new P() { - @Override - public void apply(OrderEto target) { - - target.setState(state); - } - }); - return this; - } - - public OrderEtoBuilder revision(final Number revision) { - - this.parameterToBeApplied.add(new P() { - @Override - public void apply(OrderEto target) { - - target.setRevision(revision); - } - }); - return this; - } - - public OrderEto createNew() { - - OrderEto ordereto = new OrderEto(); - for (P parameter : this.parameterToBeApplied) { - parameter.apply(ordereto); - } - return ordereto; - } - - /** - * Fills all mandatory fields by default. (will be overwritten on re-generation) - */ - private void fillMandatoryFields() { - - } - - /** - * Might be enrichted to users needs (will not be overwritten) - */ - private void fillMandatoryFields_custom() { - - } - -} diff --git a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/api/builders/OrderPositionEtoBuilder.java b/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/api/builders/OrderPositionEtoBuilder.java deleted file mode 100644 index 2b217e7c4..000000000 --- a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/api/builders/OrderPositionEtoBuilder.java +++ /dev/null @@ -1,153 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.common.api.builders; - -import java.util.LinkedList; -import java.util.List; - -import io.oasp.gastronomy.restaurant.general.common.api.datatype.Money; -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype.OrderPositionState; -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype.ProductOrderState; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderPositionEto; - -public class OrderPositionEtoBuilder { - - private List> parameterToBeApplied; - - public OrderPositionEtoBuilder() { - - this.parameterToBeApplied = new LinkedList<>(); - fillMandatoryFields(); - fillMandatoryFields_custom(); - } - - /** - * Fills all mandatory fields by default. (will be overwritten on re-generation) - */ - private void fillMandatoryFields() { - - } - - /** - * Might be enrichted to users needs (will not be overwritten) - */ - private void fillMandatoryFields_custom() { - - } - - public OrderPositionEtoBuilder orderId(final Long orderId) { - - this.parameterToBeApplied.add(new P() { - @Override - public void apply(OrderPositionEto target) { - - target.setOrderId(orderId); - } - }); - return this; - } - - public OrderPositionEtoBuilder cookId(final Long cookId) { - - this.parameterToBeApplied.add(new P() { - @Override - public void apply(OrderPositionEto target) { - - target.setCookId(cookId); - } - }); - return this; - } - - public OrderPositionEtoBuilder offerId(final Long offerId) { - - this.parameterToBeApplied.add(new P() { - @Override - public void apply(OrderPositionEto target) { - - target.setOfferId(offerId); - } - }); - return this; - } - - public OrderPositionEtoBuilder offerName(final String offerName) { - - this.parameterToBeApplied.add(new P() { - @Override - public void apply(OrderPositionEto target) { - - target.setOfferName(offerName); - } - }); - return this; - } - - public OrderPositionEtoBuilder state(final OrderPositionState state) { - - this.parameterToBeApplied.add(new P() { - @Override - public void apply(OrderPositionEto target) { - - target.setState(state); - } - }); - return this; - } - - public OrderPositionEtoBuilder price(final Money price) { - - this.parameterToBeApplied.add(new P() { - @Override - public void apply(OrderPositionEto target) { - - target.setPrice(price); - } - }); - return this; - } - - public OrderPositionEtoBuilder comment(final String comment) { - - this.parameterToBeApplied.add(new P() { - @Override - public void apply(OrderPositionEto target) { - - target.setComment(comment); - } - }); - return this; - } - - public OrderPositionEtoBuilder drinkState(final ProductOrderState drinkState) { - - this.parameterToBeApplied.add(new P() { - @Override - public void apply(OrderPositionEto target) { - - target.setDrinkState(drinkState); - } - }); - return this; - } - - public OrderPositionEtoBuilder revision(final Number revision) { - - this.parameterToBeApplied.add(new P() { - @Override - public void apply(OrderPositionEto target) { - - target.setRevision(revision); - } - }); - return this; - } - - public OrderPositionEto createNew() { - - OrderPositionEto orderpositioneto = new OrderPositionEto(); - for (P parameter : this.parameterToBeApplied) { - parameter.apply(orderpositioneto); - } - return orderpositioneto; - } - -} diff --git a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/api/builders/P.java b/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/api/builders/P.java deleted file mode 100644 index 313c57592..000000000 --- a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/api/builders/P.java +++ /dev/null @@ -1,6 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.common.api.builders; - -public interface P { - - public void apply(T target); -} \ No newline at end of file diff --git a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/api/builders/TableEtoBuilder.java b/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/api/builders/TableEtoBuilder.java deleted file mode 100644 index 224de36df..000000000 --- a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/api/builders/TableEtoBuilder.java +++ /dev/null @@ -1,92 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.common.api.builders; - -import java.util.LinkedList; -import java.util.List; - -import io.oasp.gastronomy.restaurant.tablemanagement.common.api.datatype.TableState; -import io.oasp.gastronomy.restaurant.tablemanagement.logic.api.to.TableEto; - -public class TableEtoBuilder { - - private List> parameterToBeApplied; - - public TableEtoBuilder() { - - this.parameterToBeApplied = new LinkedList<>(); - fillMandatoryFields(); - fillMandatoryFields_custom(); - } - - /** - * Might be enrichted to users needs (will not be overwritten) - */ - private void fillMandatoryFields_custom() { - - } - - /** - * Fills all mandatory fields by default. (will be overwritten on re-generation) - */ - private void fillMandatoryFields() { - - } - - public TableEtoBuilder number(final Long number) { - - this.parameterToBeApplied.add(new P() { - @Override - public void apply(TableEto target) { - - target.setNumber(number); - } - }); - return this; - } - - public TableEtoBuilder waiterId(final Long waiterId) { - - this.parameterToBeApplied.add(new P() { - @Override - public void apply(TableEto target) { - - target.setWaiterId(waiterId); - } - }); - return this; - } - - public TableEtoBuilder state(final TableState state) { - - this.parameterToBeApplied.add(new P() { - @Override - public void apply(TableEto target) { - - target.setState(state); - } - }); - return this; - } - - public TableEtoBuilder revision(final Number revision) { - - this.parameterToBeApplied.add(new P() { - @Override - public void apply(TableEto target) { - - target.setRevision(revision); - } - }); - return this; - } - - public TableEto createNew() { - - TableEto tableeto = new TableEto(); - tableeto.setState(TableState.FREE); - for (P parameter : this.parameterToBeApplied) { - parameter.apply(tableeto); - } - return tableeto; - } - -} diff --git a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/api/security/SecurityRestServiceImplTest.java b/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/api/security/SecurityRestServiceImplTest.java deleted file mode 100644 index 808d7144b..000000000 --- a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/api/security/SecurityRestServiceImplTest.java +++ /dev/null @@ -1,208 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.common.api.security; - -import java.util.List; - -import org.json.JSONObject; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.skyscreamer.jsonassert.JSONAssert; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpMethod; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.web.client.RestTemplate; - -import io.oasp.gastronomy.restaurant.general.common.api.to.UserDetailsClientTo; -import io.oasp.gastronomy.restaurant.general.common.base.AbstractRestServiceTest; -import io.oasp.gastronomy.restaurant.general.service.impl.rest.SecurityRestServiceImpl; - -/** - * This class tests the login functionality of {@link SecurityRestServiceImpl}. - */ -@RunWith(SpringRunner.class) -@TestPropertySource(properties = { "flyway.locations=filesystem:src/test/resources/db/tablemanagement" }) -public class SecurityRestServiceImplTest extends AbstractRestServiceTest { - - /** Logger instance. */ - private static final Logger LOG = LoggerFactory.getLogger(SecurityRestServiceImplTest.class); - - private static final String _CSRF = "_csrf"; - - private static final String X_CSRF_TOKEN = "X-CSRF-TOKEN"; - - private RestTemplate template = new RestTemplate(); - - /** - * Test the login functionality as it will be used from a JavaScript client. - */ - @Test - @DirtiesContext - public void testLogin() { - - String userName = "waiter"; - String tmpPassword = "waiter"; - - ResponseEntity postResponse = login(userName, tmpPassword); - LOG.debug("Body: " + postResponse.getBody()); - assertThat(postResponse.getStatusCode()).isEqualTo(HttpStatus.OK); - assertThat(postResponse.getHeaders().containsKey(HttpHeaders.SET_COOKIE)).isTrue(); - } - - /** - * This test depends on the login and csrf functionaility. These are tested in {@link #testLogin()} and - * {@link #testGetCsrfToken()} respectively. - */ - @Test - @DirtiesContext - public void testGetCurrentUser() { - - String userName = "waiter"; - String tmpPassword = "waiter"; - String tmpUrl = "http://localhost:" + String.valueOf(this.port) + "/services/rest/security/v1/currentuser"; - - ResponseEntity loginResponse = login(userName, tmpPassword); - - String jsessionId = loginResponse.getHeaders().get(HttpHeaders.SET_COOKIE).get(0); - ResponseEntity csrfEntity = csrf(jsessionId); - - HttpEntity entity = new HttpEntity<>(prepareHeaders(new StrTup(HttpHeaders.COOKIE, jsessionId), - new StrTup(X_CSRF_TOKEN, new JSONObject(csrfEntity.getBody()).getString("token")))); - ResponseEntity userEntity = - this.template.exchange(tmpUrl, HttpMethod.GET, entity, UserDetailsClientTo.class); - UserDetailsClientTo userDetailsClientTo = userEntity.getBody(); - assertThat(userDetailsClientTo.getId()).isNotNull(); - assertThat(userDetailsClientTo.getFirstName()).isNotEmpty(); - assertThat(userDetailsClientTo.getLastName()).isNotEmpty(); - assertThat(userDetailsClientTo.getName()).isNotEmpty(); - assertThat(userDetailsClientTo.getRole()).isNotNull(); - LOG.debug("GET Response User: " + userDetailsClientTo.getFirstName()); - } - - /** - * This test depends on the successful login which is tested by {@link #testLogin()}. Then, a csrf token is queried - * and checked. - */ - @Test - @DirtiesContext - public void testGetCsrfToken() { - - String userName = "waiter"; - String tmpPassword = "waiter"; - - ResponseEntity loginResponse = login(userName, tmpPassword); - - LOG.debug("Body: " + loginResponse.getBody()); - assertThat(loginResponse.getStatusCode()).isEqualTo(HttpStatus.OK); - List setCookie = loginResponse.getHeaders().get(HttpHeaders.SET_COOKIE); - assertThat(setCookie).hasSize(1); - String jsessionId = setCookie.get(0); - - ResponseEntity csrfEntity = csrf(jsessionId); - - JSONObject actual = new JSONObject(csrfEntity.getBody()); - JSONObject expected = - new JSONObject("{\"headerName\":\"" + X_CSRF_TOKEN + "\",\"parameterName\":\"" + _CSRF + "\"}"); - JSONAssert.assertEquals(expected, actual, false); - assertThat(actual.get("token")).isNotNull(); - - LOG.debug("GET Response Csrf: " + actual.toString()); - - } - - /** - * Performs a query for a csrf token. - * - * @param jsessionId the cookie returned after a successful login. - * @return a {@link ResponseEntity} containing an JSON object as its body. - */ - private ResponseEntity csrf(String jsessionId) { - - String tmpUrl = "http://localhost:" + String.valueOf(this.port) + "/services/rest/security/v1/csrftoken"; - HttpHeaders headers = prepareHeaders(new StrTup(HttpHeaders.COOKIE, jsessionId)); - HttpEntity entity = new HttpEntity<>(headers); - ResponseEntity responseEntity = this.template.exchange(tmpUrl, HttpMethod.GET, entity, String.class); - return responseEntity; - } - - /** - * Performs the login as required by a JavaScript client. - * - * @param userName the username of the user - * @param tmpPassword the password of the user - * @return @ {@link ResponseEntity} containing containing a cookie in its header. - */ - private ResponseEntity login(String userName, String tmpPassword) { - - String tmpUrl = "http://localhost:" + String.valueOf(this.port) + "/services/rest/login"; - - HttpEntity postRequest = new HttpEntity<>( - prepareJson(new StrTup("j_username", userName), new StrTup("j_password", tmpPassword)), prepareHeaders()); - - ResponseEntity postResponse = this.template.exchange(tmpUrl, HttpMethod.POST, postRequest, String.class); - return postResponse; - } - - /* - * Helpers (class and methods) - */ - - private class StrTup { - private String key; - - private String value; - - public StrTup(String key, String value) { - this.key = key; - this.value = value; - } - - /** - * @return key - */ - public String getKey() { - - return this.key; - } - - /** - * @return value - */ - public String getValue() { - - return this.value; - } - - } - - private String prepareJson(StrTup... stringTuples) { - - JSONObject result = new JSONObject(); - for (StrTup t : stringTuples) { - result.put(t.getKey(), t.getValue()); - } - return result.toString(); - } - - private HttpHeaders prepareHeaders(StrTup... stringTuples) - - { - - HttpHeaders result = new HttpHeaders(); - if (stringTuples != null) { - - for (StrTup t : stringTuples) { - result.add(t.getKey(), t.getValue()); - } - } - result.setContentType(MediaType.APPLICATION_JSON); - return result; - } - -} diff --git a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/base/AbstractRestServiceTest.java b/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/base/AbstractRestServiceTest.java deleted file mode 100644 index cdbab8257..000000000 --- a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/base/AbstractRestServiceTest.java +++ /dev/null @@ -1,78 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.common.base; - -import javax.inject.Inject; - -import org.springframework.boot.context.embedded.LocalServerPort; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; - -import io.oasp.gastronomy.restaurant.SpringBootApp; -import io.oasp.gastronomy.restaurant.general.common.DbTestHelper; -import io.oasp.gastronomy.restaurant.general.common.SecurityTestHelper; -import io.oasp.gastronomy.restaurant.general.service.impl.config.RestaurantTestConfig; -import io.oasp.module.basic.common.api.config.SpringProfileConstants; -import io.oasp.module.test.common.base.SubsystemTest; - -/** - * Abstract base class for {@link SubsystemTest}s which runs the tests within a local server.
- *
- * The local server's port is randomly assigned. - * - */ - -@SpringBootTest(classes = { RestaurantTestConfig.class, -SpringBootApp.class }, webEnvironment = WebEnvironment.RANDOM_PORT) -public abstract class AbstractRestServiceTest extends SubsystemTest { - - - /** - * The port of the web server during the test. - */ - @LocalServerPort - protected int port; - - /** - * The {@code RestaurantTestHelper}. - */ - @Inject - private SecurityTestHelper securityTestHelper; - - @Inject - private DbTestHelper dbTestHelper; - - /** - * Sets up the test. - */ - @Override - protected void doSetUp() { - - super.doSetUp(); - } - - /** - * Cleans up the test. - */ - @Override - protected void doTearDown() { - - super.doTearDown(); - this.securityTestHelper.logout(); - } - - /** - * @return the {@link SecurityTestHelper} - */ - public SecurityTestHelper getSecurityTestHelper() { - - return this.securityTestHelper; - } - - /** - * @return the {@link DbTestHelper} - */ - public DbTestHelper getDbTestHelper() { - - return this.dbTestHelper; - } - -} diff --git a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/base/OaspPackageCheckTest.java b/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/base/OaspPackageCheckTest.java deleted file mode 100644 index 00f5d1ca6..000000000 --- a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/common/base/OaspPackageCheckTest.java +++ /dev/null @@ -1,72 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.common.base; - -import java.util.HashSet; -import java.util.Set; - -import net.sf.mmm.util.reflect.api.ReflectionUtil; -import net.sf.mmm.util.reflect.base.ReflectionUtilImpl; - -import org.assertj.core.api.SoftAssertions; -import org.junit.Ignore; -import org.junit.Test; - -import io.oasp.module.basic.common.api.reflect.OaspPackage; -import io.oasp.module.test.common.base.ModuleTest; - -/** - * This test verifies that the entire code of your code-base is located in {@link OaspPackage#isValid() valid OASP - * packages}. - */ -@Ignore("Currently fails, see #498") -public class OaspPackageCheckTest extends ModuleTest { - - /** - * Scans all the packages of this application root pacakge namespace. Will verify that these are - * {@link OaspPackage#isValid() valid OASP packages}. - */ - @Test - public void testPackages() { - - OaspPackage pkg = OaspPackage.of(OaspPackageCheckTest.class); - assertThat(pkg.isValid()).isTrue(); - - ReflectionUtil ru = ReflectionUtilImpl.getInstance(); - Set classNames = ru.findClassNames(getRootPackage2Scan(pkg), true); - String appPackage = pkg.getRoot() + "." + pkg.getApplication(); - Set packages = new HashSet<>(128); - packages.add(appPackage); // allow SpringBootApp, etc. in application package - SoftAssertions assertion = new SoftAssertions(); - for (String className : classNames) { - int lastDot = className.lastIndexOf('.'); - if (lastDot > 0) { - String packageName = className.substring(0, lastDot); - boolean added = packages.add(packageName); - if (added) { - pkg = OaspPackage.of(packageName); - if (!pkg.isValid()) { - assertion.assertThat(pkg.isValid()) - .as("package " + packageName + " is invalid (component: " + pkg.getComponent() + ", layer: " - + pkg.getLayer() + ", scope: " + pkg.getScope() + "). Hint contains e.g. " - + className.substring(lastDot + 1)) - .isTrue(); - } - } - } - } - assertion.assertAll(); - } - - /** - * @param pkg the {@link OaspPackage} of this test. - * @return the root package to scan for {@link Class}es to get the actual packages to check. - */ - protected String getRootPackage2Scan(OaspPackage pkg) { - - String root = pkg.getRoot(); - if (root.startsWith("io.oasp")) { - return "io.oasp"; - } - return root; - } - -} diff --git a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/dataaccess/impl/config/BeansJpaConfig.java b/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/dataaccess/impl/config/BeansJpaConfig.java deleted file mode 100644 index fec35366f..000000000 --- a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/dataaccess/impl/config/BeansJpaConfig.java +++ /dev/null @@ -1,53 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.dataaccess.impl.config; - -import javax.annotation.PostConstruct; -import javax.inject.Inject; -import javax.persistence.EntityManagerFactory; -import javax.sql.DataSource; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import io.oasp.gastronomy.restaurant.general.dataaccess.base.DatabaseMigrator; - -/** - * Java configuration for JPA - */ -@Configuration -public class BeansJpaConfig { - - @Inject - private EntityManagerFactory entityManagerFactory; - - @Inject - private DataSource appDataSource; - - @Value("${database.migration.auto}") - private Boolean enabled; - - @Value("${database.migration.testdata}") - private Boolean testdata; - - @Value("${database.migration.clean}") - private Boolean clean; - - @Bean - public DatabaseMigrator getFlyway() { - - DatabaseMigrator migrator = new DatabaseMigrator(); - migrator.setClean(this.clean); - migrator.setDataSource(this.appDataSource); - migrator.setEnabled(this.enabled); - migrator.setTestdata(this.testdata); - return migrator; - - } - - @PostConstruct - public void migrate() { - - getFlyway().migrate(); - } - -} \ No newline at end of file diff --git a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/service/impl/config/RestaurantTestConfig.java b/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/service/impl/config/RestaurantTestConfig.java deleted file mode 100644 index e84171866..000000000 --- a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/service/impl/config/RestaurantTestConfig.java +++ /dev/null @@ -1,62 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.service.impl.config; - -import org.flywaydb.core.Flyway; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Profile; - -import io.oasp.gastronomy.restaurant.general.common.DbTestHelper; -import io.oasp.gastronomy.restaurant.general.common.RestTestClientBuilder; -import io.oasp.gastronomy.restaurant.general.common.SecurityTestHelper; -import io.oasp.gastronomy.restaurant.general.common.base.AbstractRestServiceTest; -import io.oasp.module.basic.common.api.config.SpringProfileConstants; - -/** - * This configuration class provides {@code @Bean} annotated methods. It is applied to a test class by using the - * following class annotation: {@code @SpringApplicationConfiguration(classes = RestaurantTestConfig.class)}. Hence, - * beans provided by {@code @Bean} annotated methods will not be available outside the test configuration.
- *
- * See {@link AbstractRestServiceTest} as an example. - * - */ -@Configuration -@Profile(SpringProfileConstants.JUNIT) -public class RestaurantTestConfig { - - /** - * The constructor. - */ - public RestaurantTestConfig() { - super(); - } - - /** - * @return an instance of type {@code RestTestClientBuilder} - */ - @Bean - public RestTestClientBuilder restTestClientBuilder() { - - return new RestTestClientBuilder(); - } - - /** - * @return an instance of type {@link SecurityTestHelper} - */ - @Bean - public SecurityTestHelper securityTestHelper() { - - return new SecurityTestHelper(); - } - - /** - * @param flyway an instance of type {@link Flyway}. - * @return an instance of type {@link DbTestHelper}. - */ - @Bean - public DbTestHelper dbTestHelper(Flyway flyway) { - - return new DbTestHelper(flyway); - - } - -} diff --git a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/service/impl/config/TestWebSecurityConfig.java b/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/service/impl/config/TestWebSecurityConfig.java deleted file mode 100644 index 5d7b5e76c..000000000 --- a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/general/service/impl/config/TestWebSecurityConfig.java +++ /dev/null @@ -1,55 +0,0 @@ -package io.oasp.gastronomy.restaurant.general.service.impl.config; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Profile; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.web.AuthenticationEntryPoint; -import org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint; -import org.springframework.security.web.authentication.www.BasicAuthenticationFilter; - -import io.oasp.gastronomy.restaurant.general.service.impl.config.BaseWebSecurityConfig; -import io.oasp.module.basic.common.api.config.SpringProfileConstants; - -/** - * This type provides web security configuration for testing purposes. - * - */ -@Configuration -@EnableWebSecurity -@Profile(SpringProfileConstants.JUNIT) -public class TestWebSecurityConfig extends BaseWebSecurityConfig { - private static Logger LOG = LoggerFactory.getLogger(TestWebSecurityConfig.class); - - /** - * Configure spring security to enable a simple webform-login + a simple rest login. - */ - @Override - public void configure(HttpSecurity http) throws Exception { - - super.configure(http); - // usage of addFilter is sufficient for BasicAuthenticationFilter.class. The filter will be added according to the - // order defined in: - // http://docs.spring.io/autorepo/docs/spring-security/4.1.0.RC1/apidocs/org/springframework/security/config/annotation/web/builders/HttpSecurity.html#addFilter-javax.servlet.Filter- - http.addFilter(basicAuthenticationFilter()); - - // Use the following to disable csrf in tests - http.csrf().disable(); - - LOG.debug("used non static class"); - } - - @Bean - protected BasicAuthenticationFilter basicAuthenticationFilter() throws Exception { - - AuthenticationEntryPoint authenticationEntryPoint = new BasicAuthenticationEntryPoint(); - BasicAuthenticationFilter basicAuthenticationFilter = - new BasicAuthenticationFilter(authenticationManagerBean(), authenticationEntryPoint); - LOG.debug("created basicAuthenticationFilter"); - return basicAuthenticationFilter; - } - -} diff --git a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/offermanagement/batch/impl/productimport/OfferManagementTest.java b/samples/core/src/test/java/io/oasp/gastronomy/restaurant/offermanagement/batch/impl/productimport/OfferManagementTest.java deleted file mode 100644 index 1909b08b4..000000000 --- a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/offermanagement/batch/impl/productimport/OfferManagementTest.java +++ /dev/null @@ -1,132 +0,0 @@ -package io.oasp.gastronomy.restaurant.offermanagement.batch.impl.productimport; - -import static org.junit.Assert.assertEquals; - -import java.util.List; - -import javax.inject.Inject; - -import org.flywaydb.core.Flyway; -import org.junit.Test; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.web.WebAppConfiguration; - -import io.oasp.gastronomy.restaurant.SpringBootApp; -import io.oasp.gastronomy.restaurant.general.common.TestUtil; -import io.oasp.gastronomy.restaurant.general.common.api.constants.PermissionConstants; -import io.oasp.gastronomy.restaurant.general.common.api.datatype.Money; -import io.oasp.gastronomy.restaurant.offermanagement.common.api.Offer; -import io.oasp.gastronomy.restaurant.offermanagement.common.api.datatype.OfferSortByHitEntry; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.Offermanagement; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.OfferEto; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.OfferFilter; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.OfferSortBy; -import io.oasp.module.jpa.common.api.to.OrderDirection; -import io.oasp.module.test.common.base.ComponentTest; - -/** - * This is the test-case of {@link Offermanagement} - * - * @since dev - */ -@SpringBootTest(classes = { SpringBootApp.class }) -@WebAppConfiguration -public class OfferManagementTest extends ComponentTest { - - @Inject - private Offermanagement offerManagement; - - @Inject - private Flyway flyway; - - /** - * Login - */ - @Override - public void doSetUp() { - - super.doSetUp(); - this.flyway.clean(); - this.flyway.migrate(); - - TestUtil.login("waiter", PermissionConstants.FIND_OFFER); - } - - /** - * Logout - */ - @Override - public void doTearDown() { - - super.doTearDown(); - TestUtil.logout(); - } - - /** - * Tests if the {@link Offer} is filtered correctly. - */ - @Test - public void testFindOffersFiltered() { - - OfferFilter filter = new OfferFilter(); - filter.setDrinkId(12L); - filter.setMinPrice(new Money(5)); - filter.setMaxPrice(new Money(7)); - - OfferSortBy sort = new OfferSortBy(); - sort.setSortByEntry(OfferSortByHitEntry.PRICE); - List offerEntity = this.offerManagement.findOffersFiltered(filter, sort); - assertEquals(offerEntity.size(), 3); - assertEquals(offerEntity.get(0).getPrice(), new Money(5.99)); - assertEquals(offerEntity.get(1).getPrice(), new Money(6.23)); - assertEquals(offerEntity.get(2).getPrice(), new Money(6.99)); - - sort.setOrderBy(OrderDirection.DESC); - offerEntity = this.offerManagement.findOffersFiltered(filter, sort); - assertEquals(offerEntity.get(0).getPrice(), new Money(6.99)); - assertEquals(offerEntity.get(1).getPrice(), new Money(6.23)); - assertEquals(offerEntity.get(2).getPrice(), new Money(5.99)); - - sort.setOrderBy(OrderDirection.ASC); - sort.setSortByEntry(OfferSortByHitEntry.ID); - offerEntity = this.offerManagement.findOffersFiltered(filter, sort); - assertEquals(offerEntity.get(0).getId(), new Long(1)); - assertEquals(offerEntity.get(1).getId(), new Long(6)); - assertEquals(offerEntity.get(2).getId(), new Long(7)); - - sort.setSortByEntry(OfferSortByHitEntry.DESCRIPTION); - offerEntity = this.offerManagement.findOffersFiltered(filter, sort); - assertEquals(offerEntity.size(), 3); - assertEquals(offerEntity.get(0).getDescription(), "Description of Flammkuchen-Menü"); - assertEquals(offerEntity.get(1).getDescription(), "Description of Pizza-Menü"); - assertEquals(offerEntity.get(2).getDescription(), "Description of Schnitzel-Menü"); - - sort.setSortByEntry(OfferSortByHitEntry.MEAL); - offerEntity = this.offerManagement.findOffersFiltered(filter, sort); - assertEquals(offerEntity.size(), 3); - assertEquals(offerEntity.get(0).getMealId(), new Long(6)); - assertEquals(offerEntity.get(1).getMealId(), new Long(5)); - assertEquals(offerEntity.get(2).getMealId(), new Long(1)); - - sort.setSortByEntry(OfferSortByHitEntry.ID); - offerEntity = this.offerManagement.findOffersFiltered(filter, sort); - assertEquals(offerEntity.get(0).getPrice(), new Money(6.99)); - assertEquals(offerEntity.get(1).getPrice(), new Money(6.23)); - assertEquals(offerEntity.get(2).getPrice(), new Money(5.99)); - - filter.setMealId(1L); - offerEntity = this.offerManagement.findOffersFiltered(filter, sort); - assertEquals(offerEntity.size(), 1); - assertEquals(offerEntity.get(0).getPrice(), new Money(6.99)); - - filter.setSideDishId(7L); - offerEntity = this.offerManagement.findOffersFiltered(filter, sort); - assertEquals(offerEntity.size(), 1); - assertEquals(offerEntity.get(0).getId(), new Long(1)); - assertEquals(offerEntity.get(0).getDescription(), "Description of Schnitzel-Menü"); - assertEquals(offerEntity.get(0).getDrinkId(), new Long(12)); - assertEquals(offerEntity.get(0).getMealId(), new Long(1)); - assertEquals(offerEntity.get(0).getSideDishId(), new Long(7)); - - } -} diff --git a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/offermanagement/batch/impl/productimport/ProductImportJobTest.java b/samples/core/src/test/java/io/oasp/gastronomy/restaurant/offermanagement/batch/impl/productimport/ProductImportJobTest.java deleted file mode 100644 index 62b813258..000000000 --- a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/offermanagement/batch/impl/productimport/ProductImportJobTest.java +++ /dev/null @@ -1,90 +0,0 @@ -package io.oasp.gastronomy.restaurant.offermanagement.batch.impl.productimport; - -import java.util.List; - -import javax.inject.Inject; - -import org.junit.Test; -import org.springframework.batch.core.BatchStatus; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.JobParameters; -import org.springframework.batch.core.JobParametersBuilder; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; -import org.springframework.context.annotation.ImportResource; - -import io.oasp.gastronomy.restaurant.SpringBootBatchApp; -import io.oasp.gastronomy.restaurant.general.common.AbstractSpringBatchIntegrationTest; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.Offermanagement; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.DrinkEto; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.MealEto; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.OfferEto; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.ProductEto; - -/** - * End-To-End test job "import offer management from csv" - * - */ -@SpringBootTest(classes = { SpringBootBatchApp.class }, webEnvironment = WebEnvironment.RANDOM_PORT) -@ImportResource("classpath:config/app/batch/beans-productimport.xml") -@EnableAutoConfiguration -public class ProductImportJobTest extends AbstractSpringBatchIntegrationTest { - - @Inject - private Job productImportJob; - - @Inject - private Offermanagement offermanagement; - - /** - * @throws Exception thrown by JobLauncherTestUtils - */ - @Test - public void testJob() throws Exception { - - cleanDatabase(); - - // configure job - JobParametersBuilder jobParameterBuilder = new JobParametersBuilder(); - jobParameterBuilder.addString("drinks.file", "classpath:ProductImportJobTest/data/drinks.csv"); - jobParameterBuilder.addString("meals.file", "classpath:ProductImportJobTest/data/meals.csv"); - JobParameters jobParameters = jobParameterBuilder.toJobParameters(); - - // run job - JobExecution jobExecution = getJobLauncherTestUtils(this.productImportJob).launchJob(jobParameters); - - // check results - // - job status - assertThat(jobExecution.getStatus()).isEqualTo(BatchStatus.COMPLETED); - - // - imported data (there is 7 products in setup data) - List allProducts = this.offermanagement.findAllProducts(); - assertThat(allProducts).hasSize(7); - - // - exemplary drink - DrinkEto drink = (DrinkEto) allProducts.get(0); - assertThat(drink.getName()).isEqualTo("Heineken"); - assertThat(drink.getDescription()).isEqualTo("Pretty good beer"); - assertThat(drink.getPictureId()).isEqualTo(1); - assertThat(drink.isAlcoholic()).isTrue(); - - // - exemplary meal - MealEto meal = (MealEto) allProducts.get(3); - assertThat(meal.getName()).isEqualTo("Bratwurst"); - assertThat(meal.getDescription()).isEqualTo("Tasty sausage"); - assertThat(meal.getPictureId()).isEqualTo(1); - } - - private void cleanDatabase() { - - for (OfferEto offer : this.offermanagement.findAllOffers()) { - this.offermanagement.deleteOffer(offer.getId()); - } - - for (ProductEto product : this.offermanagement.findAllProducts()) { - this.offermanagement.deleteProduct(product.getId()); - } - } -} diff --git a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/offermanagement/batch/impl/productimport/ProductManagementTest.java b/samples/core/src/test/java/io/oasp/gastronomy/restaurant/offermanagement/batch/impl/productimport/ProductManagementTest.java deleted file mode 100644 index e2f14cd15..000000000 --- a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/offermanagement/batch/impl/productimport/ProductManagementTest.java +++ /dev/null @@ -1,116 +0,0 @@ -package io.oasp.gastronomy.restaurant.offermanagement.batch.impl.productimport; - -import static org.junit.Assert.assertEquals; - -import java.util.List; - -import javax.inject.Inject; - -import org.flywaydb.core.Flyway; -import org.junit.Test; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.web.WebAppConfiguration; - -import io.oasp.gastronomy.restaurant.SpringBootApp; -import io.oasp.gastronomy.restaurant.general.common.TestUtil; -import io.oasp.gastronomy.restaurant.general.common.api.constants.PermissionConstants; -import io.oasp.gastronomy.restaurant.offermanagement.common.api.Product; -import io.oasp.gastronomy.restaurant.offermanagement.common.api.datatype.ProductSortByHitEntry; -import io.oasp.gastronomy.restaurant.offermanagement.dataaccess.impl.dao.ProductDaoImpl; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.Offermanagement; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.ProductEto; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.ProductFilter; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.ProductSortBy; -import io.oasp.module.jpa.common.api.to.OrderDirection; -import io.oasp.module.test.common.base.ComponentTest; - -/** - * This is the test case of {@link ProductDaoImpl} - * - * @since dev - */ -@SpringBootTest(classes = { SpringBootApp.class }) -@WebAppConfiguration -public class ProductManagementTest extends ComponentTest { - - @Inject - private Offermanagement offerManagement; - - @Inject - private Flyway flyway; - - /** - * Login - */ - @Override - public void doSetUp() { - - super.doSetUp(); - this.flyway.clean(); - this.flyway.migrate(); - TestUtil.login("waiter", PermissionConstants.FIND_OFFER); - } - - /** - * Logout - */ - @Override - public void doTearDown() { - - super.doTearDown(); - TestUtil.logout(); - } - - /** - * Tests if the {@link Product} is filtered correctly. - */ - @Test - - public void testFindProductsFiltered() { - - ProductFilter filter = new ProductFilter(); - filter.setFetchMeals(true); - ProductSortBy sort = new ProductSortBy(); - - List products = this.offerManagement.findProductsFiltered(filter, sort); - assertEquals(products.size(), 6); - - filter.setFetchDrinks(true); - filter.setFetchMeals(false); - sort.setSortByEntry(ProductSortByHitEntry.DESCRIPTION); - products = this.offerManagement.findProductsFiltered(filter, sort); - assertEquals(products.size(), 4); - assertEquals(products.get(0).getId(), new Long(13)); - assertEquals(products.get(1).getId(), new Long(12)); - assertEquals(products.get(2).getId(), new Long(11)); - assertEquals(products.get(3).getId(), new Long(14)); - - filter.setFetchSideDishes(true); - filter.setFetchDrinks(false); - products = this.offerManagement.findProductsFiltered(filter, sort); - assertEquals(products.size(), 4); - assertEquals(products.get(0).getId(), new Long(9)); - assertEquals(products.get(1).getId(), new Long(10)); - assertEquals(products.get(2).getId(), new Long(7)); - assertEquals(products.get(3).getId(), new Long(8)); - - filter.setFetchMeals(true); - products = this.offerManagement.findProductsFiltered(filter, sort); - assertEquals(products.size(), 10); - - filter.setFetchMeals(true); - filter.setFetchDrinks(true); - sort.setSortByEntry(ProductSortByHitEntry.ID); - products = this.offerManagement.findProductsFiltered(filter, sort); - assertEquals(products.size(), 14); - assertEquals(products.get(5).getDescription(), "Flammkuchen"); - sort.setOrderBy(OrderDirection.DESC); - products = this.offerManagement.findProductsFiltered(filter, sort); - assertEquals(products.get(5).getDescription(), "Brot"); - assertEquals(products.get(0).getId(), new Long(14)); - assertEquals(products.get(1).getId(), new Long(13)); - assertEquals(products.get(2).getId(), new Long(12)); - assertEquals(products.get(3).getId(), new Long(11)); - - } -} diff --git a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/offermanagement/logic/impl/OffermanagementImplTest.java b/samples/core/src/test/java/io/oasp/gastronomy/restaurant/offermanagement/logic/impl/OffermanagementImplTest.java deleted file mode 100644 index b40f40779..000000000 --- a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/offermanagement/logic/impl/OffermanagementImplTest.java +++ /dev/null @@ -1,116 +0,0 @@ -package io.oasp.gastronomy.restaurant.offermanagement.logic.impl; - -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -import org.junit.After; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.mockito.Mock; -import org.mockito.junit.MockitoJUnit; -import org.mockito.junit.MockitoRule; - -import io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.OfferEntity; -import io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.dao.OfferDao; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.OfferCto; -import io.oasp.gastronomy.restaurant.offermanagement.logic.api.to.OfferEto; -import io.oasp.module.beanmapping.common.api.BeanMapper; -import io.oasp.module.test.common.base.ModuleTest; - -/** - * This class tests the correct execution of the methods findOffer and findOfferCto belonging to the - * {@link OffermanagementImpl} - * - */ - -public class OffermanagementImplTest extends ModuleTest { - - private static final long ID = 1; - - /** - * The System Under Test (SUT) - */ - - private OffermanagementImpl offerManagementImpl; - - @Rule - public MockitoRule rule = MockitoJUnit.rule(); - - @Mock - private OfferDao offerDao; - - @Mock - private BeanMapper beanMapper; - - /** - * This method initializes the object {@link OffermanagementImpl} and assigns the mocked objects of the classes - * {@link OfferDao} and {@link BeanMapper} to the attributes of the {@link OffermanagementImpl} object before tests, - * if they are not null. - */ - @Before - public void init() { - - this.offerManagementImpl = new OffermanagementImpl(); - this.offerManagementImpl.setOfferDao(this.offerDao); - this.offerManagementImpl.setBeanMapper(this.beanMapper); - } - - /** - * This method dereferences all object after each test - */ - @After - public void clean() { - - this.beanMapper = null; - this.offerDao = null; - this.offerManagementImpl = null; - } - - /** - * This method tests the execution of the findOffer method belonging to the {@link OffermanagementImpl} class - */ - @Test - public void findOffer() { - - // given - OfferEntity offerEntity = mock(OfferEntity.class); - OfferEto offerEto = new OfferEto(); - - when(this.offerDao.findOne(ID)).thenReturn(offerEntity); - when(this.beanMapper.map(offerEntity, OfferEto.class)).thenReturn(offerEto); - - // when - OfferEto responseOfferEto = this.offerManagementImpl.findOffer(ID); - - // then - assertThat(responseOfferEto).isNotNull(); - assertThat(responseOfferEto).isEqualTo(offerEto); - } - - /** - * This method tests the execution of the findOfferCto method belonging to the {@link OffermanagementImpl} class - */ - @Test - public void findOfferCto() { - - // given - OfferCto offerCto = new OfferCto(); - OfferEto offerEto = new OfferEto(); - - offerCto.setOffer(offerEto); - OfferEntity offerEntity = mock(OfferEntity.class); - - when(this.offerDao.findOne(ID)).thenReturn(offerEntity); - when(this.beanMapper.map(offerEntity, OfferEto.class)).thenReturn(offerEto); - - // when - OfferCto responseOfferCto = this.offerManagementImpl.findOfferCto(ID); - - // then - assertThat(responseOfferCto).isNotNull(); - assertThat(responseOfferCto.getOffer()).isEqualTo(offerEto); - - } - -} diff --git a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/salesmanagement/batch/impl/billexport/BillExportJobTest.java b/samples/core/src/test/java/io/oasp/gastronomy/restaurant/salesmanagement/batch/impl/billexport/BillExportJobTest.java deleted file mode 100644 index df49bb6ee..000000000 --- a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/salesmanagement/batch/impl/billexport/BillExportJobTest.java +++ /dev/null @@ -1,123 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.batch.impl.billexport; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileReader; -import java.io.IOException; - -import javax.inject.Inject; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.batch.core.BatchStatus; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.JobParameters; -import org.springframework.batch.core.JobParametersBuilder; -import org.springframework.batch.test.AssertFile; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; -import org.springframework.context.annotation.ImportResource; -import org.springframework.core.io.ClassPathResource; - -import io.oasp.gastronomy.restaurant.SpringBootBatchApp; -import io.oasp.gastronomy.restaurant.general.common.AbstractSpringBatchIntegrationTest; - -/** - * End-To-End test job "import offer management from csv" - * - */ -@SpringBootTest(classes = { SpringBootBatchApp.class }, webEnvironment = WebEnvironment.RANDOM_PORT) -@ImportResource("classpath:/config/app/batch/beans-billexport.xml") -@EnableAutoConfiguration -public class BillExportJobTest extends AbstractSpringBatchIntegrationTest { - private static final Logger LOG = LoggerFactory.getLogger(AbstractSpringBatchIntegrationTest.class); - - @Inject - private Job billExportJob; - - /** - * Clean up database before test. - */ - @Before - public void init() { - - this.flyway.setClean(true); - this.flyway.migrate(); - - } - - /** - * Clean up database after test. - */ - @After - public void clean() { - - this.flyway.setClean(true); - this.flyway.migrate(); - - } - - /** - * @throws Exception thrown by JobLauncherTestUtils - */ - @Test - public void testJob() throws Exception { - - // setup test data - this.flyway.importTestData("classpath:BillExportJobTest/setup/db"); - - File targetFile = new File("./tmp/bills.csv"); - File expectedFile = new ClassPathResource("BillExportJobTest/expected/bills.csv").getFile(); - - // configure job - JobParametersBuilder jobParameterBuilder = new JobParametersBuilder(); - jobParameterBuilder.addString("bills.file", targetFile.getPath()); - JobParameters jobParameters = jobParameterBuilder.toJobParameters(); - - // run job - JobExecution jobExecution = getJobLauncherTestUtils(this.billExportJob).launchJob(jobParameters); - - // check results - // - job status - assertThat(jobExecution.getStatus()).isEqualTo(BatchStatus.COMPLETED); - - // - exported data - assertThat(targetFile.exists()).isTrue(); - assertThat(expectedFile.exists()).isTrue(); - - logFileContent(expectedFile); - logFileContent(targetFile); - - AssertFile.assertFileEquals(expectedFile, targetFile); - } - - private void logFileContent(File file) { - - try { - LOG.debug("--> file content: " + file.getPath()); - BufferedReader br = null; - - String line; - try { - br = new BufferedReader(new FileReader(file)); - - while ((line = br.readLine()) != null) { - LOG.debug(line); - } - } finally { - if (br != null) { - br.close(); - } - } - LOG.debug("<-- file content: " + file.getPath()); - } catch (IOException e) { - LOG.debug(e.toString()); - e.printStackTrace(); - } - } -} diff --git a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/salesmanagement/dataaccess/impl/dao/BillDaoTest.java b/samples/core/src/test/java/io/oasp/gastronomy/restaurant/salesmanagement/dataaccess/impl/dao/BillDaoTest.java deleted file mode 100644 index 05fd70d01..000000000 --- a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/salesmanagement/dataaccess/impl/dao/BillDaoTest.java +++ /dev/null @@ -1,81 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.dataaccess.impl.dao; - -import java.math.BigDecimal; -import java.util.List; - -import javax.inject.Inject; -import javax.persistence.AttributeConverter; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.TypedQuery; -import javax.transaction.Transactional; - -import org.junit.Test; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; - -import io.oasp.gastronomy.restaurant.SpringBootApp; -import io.oasp.gastronomy.restaurant.general.common.api.builders.BillEntityBuilder; -import io.oasp.gastronomy.restaurant.general.common.api.datatype.Money; -import io.oasp.gastronomy.restaurant.salesmanagement.dataaccess.api.BillEntity; -import io.oasp.gastronomy.restaurant.salesmanagement.dataaccess.api.dao.BillDao; -import io.oasp.module.test.common.base.ComponentTest; - -/** - * Test of {@link BillDao}. - * - */ -@Transactional -@SpringBootTest(classes = { SpringBootApp.class }, webEnvironment = WebEnvironment.RANDOM_PORT) -public class BillDaoTest extends ComponentTest { - - @Inject - private BillDao billDao; - - @PersistenceContext - private EntityManager entityManager; - - /** - * Tests if a Bill is persisted correctly. Special focus is on the mapping of {@link Money} and furthermore the query - * of one of the {@link Money} fields is tested. - */ - @Test - public void testPersist() { - - BillEntity bill = new BillEntityBuilder().total(new Money(42.42)).tip(new Money(1.0)).payed(true).createNew(); - assertThat(bill.getId()).isNull(); - this.billDao.save(bill); - assertThat(bill.getId()).isNotNull(); - BillEntity loadedBill = this.billDao.findOne(bill.getId()); - assertThat(bill).isEqualTo(loadedBill); - - MoneyConverter moneyConverter = new MoneyConverter(); - TypedQuery query = - this.entityManager.createQuery("SELECT b from BillEntity b where b.total > :param", BillEntity.class); - query.setParameter("param", moneyConverter.convertToEntityAttribute(BigDecimal.valueOf(43))); - List resultList = query.getResultList(); - assertThat(resultList.isEmpty()).isTrue(); - - query = this.entityManager.createQuery("SELECT b from BillEntity b where b.total < :param", BillEntity.class); - query.setParameter("param", moneyConverter.convertToEntityAttribute(BigDecimal.valueOf(43))); - resultList = query.getResultList(); - assertThat(!resultList.isEmpty()).isTrue(); - - } - - class MoneyConverter implements AttributeConverter { - - @Override - public BigDecimal convertToDatabaseColumn(Money money) { - - return money.getValue(); - } - - @Override - public Money convertToEntityAttribute(BigDecimal dbData) { - - return new Money(dbData); - } - } - -} diff --git a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/salesmanagement/dataaccess/impl/dao/DrinkDaoTest.java b/samples/core/src/test/java/io/oasp/gastronomy/restaurant/salesmanagement/dataaccess/impl/dao/DrinkDaoTest.java deleted file mode 100644 index 42c76f8d2..000000000 --- a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/salesmanagement/dataaccess/impl/dao/DrinkDaoTest.java +++ /dev/null @@ -1,123 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.dataaccess.impl.dao; - -import java.util.List; - -import javax.inject.Inject; -import javax.inject.Named; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.transaction.Transactional; - -import org.hibernate.envers.AuditReader; -import org.hibernate.envers.AuditReaderFactory; -import org.junit.Test; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; -import org.springframework.context.annotation.Import; - -import io.oasp.gastronomy.restaurant.SpringBootApp; -import io.oasp.gastronomy.restaurant.general.common.api.builders.DrinkEntityBuilder; -import io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.DrinkEntity; -import io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.dao.DrinkDao; -import io.oasp.module.jpa.dataaccess.api.RevisionMetadata; -import io.oasp.module.test.common.base.ComponentTest; - -/** - * Test class to test the {@link DrinkDao}. - * - */ - -@SpringBootTest(classes = { SpringBootApp.class }, webEnvironment = WebEnvironment.RANDOM_PORT) -@Import(DrinkDaoTest.DrinkDaoTestBean.class) -public class DrinkDaoTest extends ComponentTest { - - @Inject - DrinkDaoTestBean testBean; - - /** - * Test to check if the DrinkEntity is audited. All steps are executed in separate transactions in order to actually - * write to the database. Otherwise hibernate envers won't work. - */ - @Test - public void checkAudit() { - - DrinkEntity drink = this.testBean.create(); - long drinkId = drink.getId(); - this.testBean.update(drinkId); - this.testBean.verify(drinkId); - - } - - /** - * - * This type provides methods in a transactional environment for the containing test class. All methods, annotated - * with the {@link Transactional} annotation, are executed in separate transaction, thus one test case can execute - * multiple transactions. - * - */ - @Named - static class DrinkDaoTestBean { - - private final String description = "some description"; - - private final String changedDescription = "some changed description"; - - @Inject - private DrinkDao drinkDao; - - @PersistenceContext - private EntityManager entityManager; - - @Transactional - public DrinkEntity create() { - - DrinkEntity drink = - new DrinkEntityBuilder().alcoholic(false).description(this.description).name("some name").createNew(); - assertThat(drink.getId()).isNull(); - drink = this.drinkDao.save(drink); - return drink; - } - - @Transactional - public void update(long id) { - - DrinkEntity drink = this.drinkDao.find(id); - drink.setAlcoholic(true); - drink.setDescription(this.changedDescription); - this.drinkDao.save(drink); - } - - @Transactional - public void verify(long id) { - - AuditReader auditReader = AuditReaderFactory.get(this.entityManager); - - assertThat(auditReader.isEntityClassAudited(DrinkEntity.class)).isTrue(); - - List revisions = auditReader.getRevisions(DrinkEntity.class, id); - assertThat(2).isEqualTo(revisions.size()); - - List history = this.drinkDao.getRevisionHistoryMetadata(id); - assertThat(2).isEqualTo(history.size()); - - // get first revision - Number rev = history.get(0).getRevision(); - DrinkEntity drink = this.drinkDao.load(id, rev); - assertThat(drink.getDescription()).isEqualTo(this.description); - - // get second revision - rev = history.get(1).getRevision(); - drink = this.drinkDao.load(id, rev); - assertThat(drink.getDescription()).isEqualTo(this.changedDescription); - } - - /** - * @param entityManager the entityManager to set - */ - public void setEntityManager(EntityManager entityManager) { - - this.entityManager = entityManager; - } - }; - -} \ No newline at end of file diff --git a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/impl/SalesManagementTest.java b/samples/core/src/test/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/impl/SalesManagementTest.java deleted file mode 100644 index 697223412..000000000 --- a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/salesmanagement/logic/impl/SalesManagementTest.java +++ /dev/null @@ -1,106 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.logic.impl; - -import javax.inject.Inject; -import javax.validation.ConstraintViolation; -import javax.validation.ConstraintViolationException; - -import org.junit.Test; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.web.WebAppConfiguration; - -import io.oasp.gastronomy.restaurant.SpringBootApp; -import io.oasp.gastronomy.restaurant.general.common.DbTestHelper; -import io.oasp.gastronomy.restaurant.general.common.TestUtil; -import io.oasp.gastronomy.restaurant.general.common.api.builders.OrderEtoBuilder; -import io.oasp.gastronomy.restaurant.general.common.api.builders.OrderPositionEtoBuilder; -import io.oasp.gastronomy.restaurant.general.common.api.constants.PermissionConstants; -import io.oasp.gastronomy.restaurant.general.common.api.datatype.Money; -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype.OrderPositionState; -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype.ProductOrderState; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.Salesmanagement; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderEto; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderPositionEto; -import io.oasp.module.test.common.base.ComponentTest; - -/** - * This is the test-case of {@link Salesmanagement}. - * - */ -@SpringBootTest(classes = { SpringBootApp.class }) -@WebAppConfiguration -public class SalesManagementTest extends ComponentTest { - - @Inject - private Salesmanagement salesManagement; - - @Inject - private DbTestHelper dbTestHelper; - - /** - * Initialization for the test. - */ - @Override - public void doSetUp() { - - super.doSetUp(); - TestUtil.login("waiter", PermissionConstants.FIND_ORDER_POSITION, PermissionConstants.SAVE_ORDER_POSITION, - PermissionConstants.SAVE_ORDER, PermissionConstants.FIND_OFFER); - this.dbTestHelper.setMigrationVersion("0002"); - this.dbTestHelper.resetDatabase(); - } - - /** - * Log out utility for the test. - */ - @Override - public void doTearDown() { - - TestUtil.logout(); - } - - /** - * Tests if the {@link OrderPositionState} is persisted correctly. The test modifies the {@link OrderPositionState} as - * well as the drinkState {@link ProductOrderState}. The test focuses on saving {@link OrderPositionEto} saving and - * verification of state change. Test data is created using Cobigen generated builders. - */ - @Test - public void testOrderPositionStateChange() { - - try { - // given - OrderEto order = new OrderEtoBuilder().tableId(1L).createNew(); - order = this.salesManagement.saveOrder(order); - OrderPositionEto orderPosition = new OrderPositionEtoBuilder().offerId(5L).orderId(order.getId()) - .offerName("Cola").price(new Money(1.2)).createNew(); - orderPosition = this.salesManagement.saveOrderPosition(orderPosition); - assertThat(orderPosition).isNotNull(); - orderPosition.setState(OrderPositionState.ORDERED); - orderPosition.setDrinkState(ProductOrderState.ORDERED); - - OrderPositionEto updatedOrderPosition = this.salesManagement.saveOrderPosition(orderPosition); - assertThat(updatedOrderPosition.getState()).isEqualTo(OrderPositionState.ORDERED); - - // when - updatedOrderPosition.setState(OrderPositionState.PREPARED); - updatedOrderPosition.setDrinkState(ProductOrderState.PREPARED); - updatedOrderPosition = this.salesManagement.saveOrderPosition(updatedOrderPosition); - - // then - assertThat(updatedOrderPosition.getState()).isEqualTo(OrderPositionState.PREPARED); - - } catch (ConstraintViolationException e) { - // BV is really painful as you need such code to see the actual error in JUnit. - StringBuilder sb = new StringBuilder(64); - sb.append("Constraints violated:"); - for (ConstraintViolation v : e.getConstraintViolations()) { - sb.append("\n"); - sb.append(v.getPropertyPath()); - sb.append(":"); - sb.append(v.getMessage()); - } - throw new IllegalStateException(sb.toString(), e); - } - - } - -} diff --git a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/salesmanagement/service/impl/rest/SalesmanagementHttpRestServiceTest.java b/samples/core/src/test/java/io/oasp/gastronomy/restaurant/salesmanagement/service/impl/rest/SalesmanagementHttpRestServiceTest.java deleted file mode 100644 index a16d842f4..000000000 --- a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/salesmanagement/service/impl/rest/SalesmanagementHttpRestServiceTest.java +++ /dev/null @@ -1,397 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.service.impl.rest; - -import static io.oasp.gastronomy.restaurant.salesmanagement.service.impl.rest.SalesmanagementRestServiceTestHelper.BASE_URL_PRAEFIX; -import static io.oasp.gastronomy.restaurant.salesmanagement.service.impl.rest.SalesmanagementRestServiceTestHelper.BASE_URL_SUFFIX_1; -import static io.oasp.gastronomy.restaurant.salesmanagement.service.impl.rest.SalesmanagementRestServiceTestHelper.BASE_URL_SUFFIX_2; -import static io.oasp.gastronomy.restaurant.salesmanagement.service.impl.rest.SalesmanagementRestServiceTestHelper.NUMBER_OF_SAMPLE_ORDER_POSITIONS; -import static io.oasp.gastronomy.restaurant.salesmanagement.service.impl.rest.SalesmanagementRestServiceTestHelper.ROLE; -import static io.oasp.gastronomy.restaurant.salesmanagement.service.impl.rest.SalesmanagementRestServiceTestHelper.SAMPLE_COMMENT; -import static io.oasp.gastronomy.restaurant.salesmanagement.service.impl.rest.SalesmanagementRestServiceTestHelper.SAMPLE_DRINK_STATE; -import static io.oasp.gastronomy.restaurant.salesmanagement.service.impl.rest.SalesmanagementRestServiceTestHelper.SAMPLE_OFFER_ID; -import static io.oasp.gastronomy.restaurant.salesmanagement.service.impl.rest.SalesmanagementRestServiceTestHelper.SAMPLE_OFFER_NAME; -import static io.oasp.gastronomy.restaurant.salesmanagement.service.impl.rest.SalesmanagementRestServiceTestHelper.SAMPLE_ORDER_POSITION_STATE; -import static io.oasp.gastronomy.restaurant.salesmanagement.service.impl.rest.SalesmanagementRestServiceTestHelper.SAMPLE_PRICE; -import static io.oasp.gastronomy.restaurant.salesmanagement.service.impl.rest.SalesmanagementRestServiceTestHelper.SAMPLE_TABLE_ID; - -import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.List; - -import javax.inject.Inject; -import javax.servlet.Servlet; - -import org.apache.commons.codec.binary.Base64; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.skyscreamer.jsonassert.JSONAssert; -import org.springframework.boot.test.web.client.TestRestTemplate; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpMethod; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringRunner; - -import io.oasp.gastronomy.restaurant.general.common.api.builders.OrderPositionEtoBuilder; -import io.oasp.gastronomy.restaurant.general.common.api.datatype.Money; -import io.oasp.gastronomy.restaurant.general.common.base.AbstractRestServiceTest; -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.OrderPosition; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderCto; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderEto; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderPositionEto; -import io.oasp.gastronomy.restaurant.salesmanagement.service.api.rest.SalesmanagementRestService; -import io.oasp.module.service.common.api.client.ServiceClientFactory; - -/** - * This class serves as an example of how to perform a subsystem test (e.g., call a *RestService interface). The test - * database is accessed via HTTP requests to the server running the restaurant application. - * - */ -@RunWith(SpringRunner.class) -@ContextConfiguration(classes = { SalesmanagementRestTestConfig.class }) -@TestPropertySource(properties = { "flyway.locations=filesystem:src/test/resources/db/tablemanagement", -"service.client.app.restaurant.user.login=waiter" }) -public class SalesmanagementHttpRestServiceTest extends AbstractRestServiceTest { - - private final HttpHeaders AUTHENTIFICATED_HEADERS = getAuthentificatedHeaders(); - - private SalesmanagementRestService service; - - private Servlet servlet; - - @Inject - private SalesmanagementRestServiceTestHelper helper; - - @Inject - private TestRestTemplate template; - - @Inject - private ServiceClientFactory serviceClientFactory; - - /** - * Provides initialization previous to the creation of the text fixture. - */ - @Override - public void doSetUp() { - - super.doSetUp(); - getDbTestHelper().resetDatabase(); - this.service = this.serviceClientFactory.create(SalesmanagementRestService.class); - } - - /** - * Provides clean up after tests. - */ - @Override - public void doTearDown() { - - this.service = null; - super.doTearDown(); - } - - /** - * This test method creates a sample instance of {@link OrderCto} and saves it into the database. Thereafter a HTTP - * GET request specifying the same id as the previously created {@link OrderCto} object is sent. Finally the body of - * the response {@link JSONObject} is tested, if it comprises the same attributes as the sample {@link OrderCto} - * object. - */ - @Test - public void getOrder() { - - // given - OrderCto sampleOrderCto = this.helper.createSampleOrderCto(SAMPLE_TABLE_ID); - OrderCto responseOrderCto = this.service.saveOrder(sampleOrderCto); - assertThat(responseOrderCto).isNotNull(); - - HttpEntity getRequest = new HttpEntity<>(this.AUTHENTIFICATED_HEADERS); - - // when - ResponseEntity getResponse = this.template.exchange( - generateBaseUrl() + "order/" + responseOrderCto.getOrder().getId(), HttpMethod.GET, getRequest, String.class); - - // then - assertThat(getResponse).isNotNull(); - String getResponseJson = getResponse.getBody(); - assertThat(getResponseJson).isNotNull(); - JSONAssert.assertEquals("{id:" + responseOrderCto.getOrder().getId() + "}", getResponseJson, false); - JSONAssert.assertEquals("{tableId:" + Long.toString(SAMPLE_TABLE_ID) + "}", getResponseJson, false); - } - - /** - * At first this method creates a {@link JSONObject} specifying a sample instance of {@link OrderCto} and a sample - * instance of {@link OrderPositionEto} linked to it by the id/orderId. Thereafter the HTTP Post request is sent. - * Finally the {@link OrderCto} object and the {@link OrderPositionEto} object are loaded from the database and its - * attributes are tested for correctness. - */ - @Test - public void postOrderWithOrderPosition() { - - // given - HttpHeaders postRequestHeaders = this.AUTHENTIFICATED_HEADERS; - postRequestHeaders.setContentType(MediaType.APPLICATION_JSON); - - JSONObject postRequest = new JSONObject(); - - JSONObject order = new JSONObject(); - order.put("tableId", SAMPLE_TABLE_ID); - postRequest.put("order", order); - - JSONArray orderPositions = new JSONArray(); - JSONObject orderPosition = new JSONObject(); - orderPosition.put("offerId", SAMPLE_OFFER_ID); - orderPosition.put("state", SAMPLE_ORDER_POSITION_STATE); - orderPosition.put("drinkState", SAMPLE_DRINK_STATE); - orderPosition.put("offerName", "dummy"); - orderPosition.put("price", "2.99"); - orderPosition.put("comment", SAMPLE_COMMENT); - orderPositions.put(orderPosition); - postRequest.put("positions", orderPositions); - - HttpEntity postRequestEntity = new HttpEntity<>(postRequest.toString(), postRequestHeaders); - - // when - ResponseEntity postResponse = - this.template.exchange(generateBaseUrl() + "order/", HttpMethod.POST, postRequestEntity, String.class); - - // then - JSONObject postResponseJson = new JSONObject(postResponse.getBody()); - assertThat(postResponseJson).isNotNull(); - - JSONArray responseOrderPositionEtos = postResponseJson.getJSONArray("positions"); - assertThat(responseOrderPositionEtos).isNotNull(); - assertThat(responseOrderPositionEtos.length()).isEqualTo(1); - - int responseOrderId = postResponseJson.getJSONObject("order").getInt("id"); - int responseOrderPositionEtoId = responseOrderPositionEtos.getJSONObject(0).getInt("id"); - assertThat(responseOrderId).isEqualTo(responseOrderPositionEtos.getJSONObject(0).getInt("orderId")); - - OrderEto responseOrderEto = this.service.findOrder(responseOrderId); - assertThat(responseOrderEto).isNotNull(); - assertThat(responseOrderEto.getId()).isEqualTo(responseOrderId); - assertThat(responseOrderEto.getTableId()).isEqualTo(SAMPLE_TABLE_ID); - - OrderPositionEto responseOrderPositionEto = this.service.findOrderPosition(responseOrderPositionEtoId); - assertThat(responseOrderPositionEto).isNotNull(); - assertThat(responseOrderPositionEto.getId()).isEqualTo(responseOrderPositionEtoId); - assertThat(responseOrderPositionEto.getOrderId()).isEqualTo(responseOrderId); - assertThat(responseOrderPositionEto.getOfferName()).isEqualTo(SAMPLE_OFFER_NAME); - assertThat(responseOrderPositionEto.getState()).isEqualTo(SAMPLE_ORDER_POSITION_STATE); - assertThat(responseOrderPositionEto.getDrinkState()).isEqualTo(SAMPLE_DRINK_STATE); - assertThat(responseOrderPositionEto.getPrice()).isEqualTo(SAMPLE_PRICE); - assertThat(responseOrderPositionEto.getComment()).isEqualTo(SAMPLE_COMMENT); - } - - /** - * This test method creates a sample instance of {@link OrderCto} and a sample instance of {@link OrderPositionEto} - * linked to it and saves them to the database. Thereafter a HTTP GET request containing a {@link JSONObject} - * specifying the same id/orderId as the previously created {@link OrderPositionEto} object is sent. Finally the body - * of the response {@link JSONObject} is tested, if it comprises the same attributes as the sample - * {@link OrderPositionEto} object. - */ - @Test - public void getOrderPosition() { - - // given - OrderCto sampleOrderCto = this.helper.createSampleOrderCto(SAMPLE_TABLE_ID); - OrderCto responseOrderCto = this.service.saveOrder(sampleOrderCto); - assertThat(responseOrderCto).isNotNull(); - - OrderPositionEto sampleOrderPositionEto = - this.helper.createSampleOrderPositionEto(responseOrderCto.getOrder().getId()); - OrderPositionEto responseOrderPositionEto = this.service.saveOrderPosition(sampleOrderPositionEto); - assertThat(responseOrderPositionEto).isNotNull(); - assertThat(responseOrderPositionEto.getOrderId()).isEqualTo(responseOrderCto.getOrder().getId()); - - HttpEntity getRequest = new HttpEntity<>(this.AUTHENTIFICATED_HEADERS); - - // when - ResponseEntity getResponse = - this.template.exchange(generateBaseUrl() + "orderposition/" + Long.toString(responseOrderPositionEto.getId()), - HttpMethod.GET, getRequest, String.class); - - // then - assertThat(getResponse).isNotNull(); - String getResponseJson = getResponse.getBody(); - assertThat(getResponseJson).isNotNull(); - - JSONAssert.assertEquals("{id:" + Long.toString(responseOrderPositionEto.getId()) + "}", getResponseJson, false); - JSONAssert.assertEquals("{orderId:" + Long.toString(responseOrderCto.getOrder().getId()) + "}", getResponseJson, - false); - JSONAssert.assertEquals("{offerId:" + Long.toString(SAMPLE_OFFER_ID) + "}", getResponseJson, false); - JSONAssert.assertEquals("{offerName:" + SAMPLE_OFFER_NAME + "}", getResponseJson, false); - JSONAssert.assertEquals("{state:" + SAMPLE_ORDER_POSITION_STATE.toString() + "}", getResponseJson, false); - JSONAssert.assertEquals("{drinkState:" + SAMPLE_DRINK_STATE.toString() + "}", getResponseJson, false); - JSONAssert.assertEquals("{price:" + "\"" + SAMPLE_PRICE.getValue() + "\"" + "}", getResponseJson, false); - JSONAssert.assertEquals("{comment:" + SAMPLE_COMMENT + "}", getResponseJson, false); - } - - /** - * This test method creates a sample instance of {@link OrderCto} and saves it into the database. In addition some - * sample instances of {@link OrderPositionEto} are created, linked to the sample {@link OrderCto} object by the - * id/orderId and saved into the database. Thereafter a HTTP GET request is sent demanding all saved - * {@link OrderPositionEto} objects in the database. Finally the body of the response {@link JSONObject} is tested - * concerning the number of loaded orderPositionEtos and the correctness attributes of the sample instances. - */ - @Test - public void getAllOrderPositions() { - - // given - OrderCto sampleOrderCto = this.helper.createSampleOrderCto(SAMPLE_TABLE_ID); - OrderCto responseOrderCto = this.service.saveOrder(sampleOrderCto); - assertThat(responseOrderCto).isNotNull(); - - int oldNumberOfOrderPositions = getNumberOfOrderPositions(); - int numberOfOrderPositionsToSave = NUMBER_OF_SAMPLE_ORDER_POSITIONS; - - OrderPositionEto sampleOrderPositionEto; - ArrayList savedOrderPositionEtos = new ArrayList<>(); - for (int i = 0; i < numberOfOrderPositionsToSave; ++i) { - sampleOrderPositionEto = new OrderPositionEtoBuilder().orderId(responseOrderCto.getOrder().getId()) - .offerId(SAMPLE_OFFER_ID).createNew(); - sampleOrderPositionEto.setPrice(new Money(2.99)); - sampleOrderPositionEto.setOfferName("dummy"); - savedOrderPositionEtos.add(this.service.saveOrderPosition(sampleOrderPositionEto)); - } - - int newNumberOfOrderPositions = getNumberOfOrderPositions(); - - HttpEntity getRequest = new HttpEntity<>(this.AUTHENTIFICATED_HEADERS); - - // when - ResponseEntity getResponse = - this.template.exchange(generateBaseUrl() + "orderposition/", HttpMethod.GET, getRequest, String.class); - - // then - assertThat(getResponse).isNotNull(); - - JSONArray responseOrderPositions = new JSONArray(getResponse.getBody()); - assertThat(responseOrderPositions).isNotNull(); - - assertThat(oldNumberOfOrderPositions + numberOfOrderPositionsToSave).isEqualTo(newNumberOfOrderPositions); - assertThat(responseOrderPositions.length()).isEqualTo(newNumberOfOrderPositions); - - int responseOrderPositionId = 0; - int countNumberOfSavedOrderPositions = 0; - - for (int i = 0; i < responseOrderPositions.length(); ++i) { - responseOrderPositionId = responseOrderPositions.getJSONObject(i).getInt("id"); - for (OrderPositionEto orderPositionEto : savedOrderPositionEtos) { - if (responseOrderPositionId == orderPositionEto.getId()) { - - JSONAssert.assertEquals("{orderId:" + Long.toString(orderPositionEto.getOrderId()) + "}", - responseOrderPositions.getJSONObject(i), false); - JSONAssert.assertEquals("{offerId:" + Long.toString(SAMPLE_OFFER_ID) + "}", - responseOrderPositions.getJSONObject(i), false); - JSONAssert.assertEquals("{offerName:" + SAMPLE_OFFER_NAME + "}", responseOrderPositions.getJSONObject(i), - false); - JSONAssert.assertEquals("{price:" + "\"" + SAMPLE_PRICE.getValue() + "\"" + "}", - responseOrderPositions.getJSONObject(i).toString(), false); - - countNumberOfSavedOrderPositions++; - } - } - } - - assertThat(countNumberOfSavedOrderPositions).isEqualTo(numberOfOrderPositionsToSave); - } - - /** - * At first the method creates a sample instance of {@link OrderCto} and saves it to the database. Thereafter a - * {@link JSONObject} specifying a sample instance of {@link OrderPosition} linked to the sample {@link OrderCto} - * object is created and the corresponding HTTP Post request is sent. Finally the {@link OrderPositionEto} object is - * loaded from the database and its attributes are tested for correctness. - */ - @Test - public void postOrderPosition() { - - // given - OrderCto sampleOrderCto = this.helper.createSampleOrderCto(SAMPLE_TABLE_ID); - OrderCto responseOrderCto = this.service.saveOrder(sampleOrderCto); - assertThat(responseOrderCto).isNotNull(); - - HttpHeaders postRequestHeaders = this.AUTHENTIFICATED_HEADERS; - postRequestHeaders.setContentType(MediaType.APPLICATION_JSON); - JSONObject postRequest = new JSONObject(); - - postRequest.put("orderId", responseOrderCto.getOrder().getId()); - postRequest.put("offerId", SAMPLE_OFFER_ID); - postRequest.put("state", SAMPLE_ORDER_POSITION_STATE); - postRequest.put("drinkState", SAMPLE_DRINK_STATE); - postRequest.put("comment", SAMPLE_COMMENT); - - try { - postRequest.put("offerName", URLEncoder.encode(SAMPLE_OFFER_NAME, "UTF-8")); - } catch (JSONException | UnsupportedEncodingException e) { - - } - postRequest.put("price", SAMPLE_PRICE.getValue()); - - HttpEntity postRequestEntity = new HttpEntity<>(postRequest.toString(), postRequestHeaders); - - // when - ResponseEntity postResponse = - this.template.exchange(generateBaseUrl() + "orderposition/", HttpMethod.POST, postRequestEntity, String.class); - - // then - assertThat(postResponse).isNotNull(); - JSONObject postResponseJson = new JSONObject(postResponse.getBody()); - assertThat(postResponseJson).isNotNull(); - - OrderPositionEto responseOrderPositionEto = this.service.findOrderPosition(postResponseJson.getInt("id")); - assertThat(responseOrderPositionEto).isNotNull(); - assertThat(responseOrderPositionEto.getId()).isEqualTo(postResponseJson.getInt("id")); - assertThat(responseOrderPositionEto.getOrderId()).isEqualTo(responseOrderCto.getOrder().getId()); - assertThat(responseOrderPositionEto.getOfferId()).isEqualTo(SAMPLE_OFFER_ID); - assertThat(responseOrderPositionEto.getOfferName()).isEqualTo(SAMPLE_OFFER_NAME); - assertThat(responseOrderPositionEto.getState()).isEqualTo(SAMPLE_ORDER_POSITION_STATE); - assertThat(responseOrderPositionEto.getDrinkState()).isEqualTo(SAMPLE_DRINK_STATE); - assertThat(responseOrderPositionEto.getPrice()).isEqualTo(SAMPLE_PRICE); - assertThat(responseOrderPositionEto.getComment()).isEqualTo(SAMPLE_COMMENT); - } - - /** - * This method builds an encoded authentication header and returns it - */ - private HttpHeaders getAuthentificatedHeaders() { - - String plainCreds = ROLE + ":" + ROLE; - byte[] plainCredsBytes = plainCreds.getBytes(); - byte[] base64CredsBytes = Base64.encodeBase64(plainCredsBytes); - String base64Creds = new String(base64CredsBytes); - HttpHeaders headers = new HttpHeaders(); - headers.add("Authorization", "Basic " + base64Creds); - - return headers; - } - - /** - * This method creates the base uri of the salesmanagement service. As the port changes in between the invocation of - * the constructor and the execution of the test method this method is necessary - */ - private String generateBaseUrl() { - - return BASE_URL_PRAEFIX + this.port + BASE_URL_SUFFIX_1 + BASE_URL_SUFFIX_2; - } - - /** - * This test method loads all saved {@link OrderPositionEto} objects from the database, counts the number and returns - * it. - * - * @return number of orderPositions saved in the database - */ - protected int getNumberOfOrderPositions() { - - int numberOfOrderPositions = 0; - List orderPositions = this.service.findOrderPositions(null); - if (orderPositions != null) { - numberOfOrderPositions = orderPositions.size(); - } - return numberOfOrderPositions; - } -} diff --git a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/salesmanagement/service/impl/rest/SalesmanagementRestServiceTest.java b/samples/core/src/test/java/io/oasp/gastronomy/restaurant/salesmanagement/service/impl/rest/SalesmanagementRestServiceTest.java deleted file mode 100644 index 8a433da56..000000000 --- a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/salesmanagement/service/impl/rest/SalesmanagementRestServiceTest.java +++ /dev/null @@ -1,338 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.service.impl.rest; - -import static io.oasp.gastronomy.restaurant.salesmanagement.service.impl.rest.SalesmanagementRestServiceTestHelper.NUMBER_OF_SAMPLE_ORDERS; -import static io.oasp.gastronomy.restaurant.salesmanagement.service.impl.rest.SalesmanagementRestServiceTestHelper.NUMBER_OF_SAMPLE_ORDER_POSITIONS; -import static io.oasp.gastronomy.restaurant.salesmanagement.service.impl.rest.SalesmanagementRestServiceTestHelper.SAMPLE_DRINK_STATE; -import static io.oasp.gastronomy.restaurant.salesmanagement.service.impl.rest.SalesmanagementRestServiceTestHelper.SAMPLE_OFFER_ID; -import static io.oasp.gastronomy.restaurant.salesmanagement.service.impl.rest.SalesmanagementRestServiceTestHelper.SAMPLE_OFFER_NAME; -import static io.oasp.gastronomy.restaurant.salesmanagement.service.impl.rest.SalesmanagementRestServiceTestHelper.SAMPLE_ORDER_POSITION_STATE; -import static io.oasp.gastronomy.restaurant.salesmanagement.service.impl.rest.SalesmanagementRestServiceTestHelper.SAMPLE_ORDER_STATE; -import static io.oasp.gastronomy.restaurant.salesmanagement.service.impl.rest.SalesmanagementRestServiceTestHelper.SAMPLE_PRICE; -import static io.oasp.gastronomy.restaurant.salesmanagement.service.impl.rest.SalesmanagementRestServiceTestHelper.SAMPLE_TABLE_ID; - -import java.util.ArrayList; -import java.util.List; - -import javax.inject.Inject; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringRunner; - -import io.oasp.gastronomy.restaurant.general.common.api.datatype.Money; -import io.oasp.gastronomy.restaurant.general.common.base.AbstractRestServiceTest; -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype.OrderPositionState; -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype.OrderState; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderCto; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderEto; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderPositionEto; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderSearchCriteriaTo; -import io.oasp.gastronomy.restaurant.salesmanagement.service.api.rest.SalesmanagementRestService; -import io.oasp.module.jpa.common.api.to.PaginatedListTo; -import io.oasp.module.jpa.common.api.to.PaginationTo; -import io.oasp.module.service.common.api.client.ServiceClientFactory; - -/** - * This class serves as an example of how to perform a subsystem test (e.g., call a *RestService interface). The test - * database is accessed via an instance of the class {@link SalesmanagementRestService}. - * - */ -@RunWith(SpringRunner.class) -@ContextConfiguration(classes = { SalesmanagementRestTestConfig.class }) -@TestPropertySource(properties = { "flyway.locations=filesystem:src/test/resources/db/tablemanagement", -"service.client.app.restaurant.user.login=waiter" }) - -public class SalesmanagementRestServiceTest extends AbstractRestServiceTest { - - private SalesmanagementRestService service; - - @Inject - private ServiceClientFactory serviceClientFactory; - - @Inject - private SalesmanagementRestServiceTestHelper helper; - - /** - * Provides initialization previous to the creation of the text fixture. - */ - @Override - public void doSetUp() { - - super.doSetUp(); - getDbTestHelper().resetDatabase(); - this.service = this.serviceClientFactory.create(SalesmanagementRestService.class); - } - - /** - * Provides clean up after tests. - */ - @Override - public void doTearDown() { - - this.service = null; - super.doTearDown(); - } - - /** - * This test method creates a sample instance of {@link OrderCto} and saves it into the database. Thereafter the - * {@link OrderEto} object linked to the sample object of {@link OrderCto} is loaded from the database and its - * attributes are tested for correctness. - */ - @Test - public void findOrder() { - - // given - OrderCto sampleOrderCto = this.helper.createSampleOrderCto(SAMPLE_TABLE_ID); - OrderCto responseOrderCto = this.service.saveOrder(sampleOrderCto); - assertThat(responseOrderCto).isNotNull(); - - // when - OrderEto responseOrderEto = this.service.findOrder(responseOrderCto.getOrder().getId()); - - // then - assertThat(responseOrderEto).isNotNull(); - assertThat(responseOrderEto.getId()).isEqualTo(responseOrderCto.getOrder().getId()); - assertThat(responseOrderEto.getTableId()).isEqualTo(SAMPLE_TABLE_ID); - } - - /** - * This test method creates some sample instances of {@link OrderCto} and saves them into the database. Thereafter all - * {@link OrderCto} objects are loaded from the database. The method tests the number of loaded OrderCto and the - * attributes of the sample instances for correctness. - */ - @Test - public void findAllOrders() { - - // given - int oldNumberOfOrders = getNumberOfOrders(); - - OrderCto sampleOrderCto; - OrderCto responseOrderCto; - - ArrayList savedOrderCtos = new ArrayList<>(); - for (int i = 0; i < NUMBER_OF_SAMPLE_ORDERS; ++i) { - - sampleOrderCto = this.helper.createSampleOrderCto(SAMPLE_TABLE_ID); - responseOrderCto = this.service.saveOrder(sampleOrderCto); - assertThat(responseOrderCto).isNotNull(); - savedOrderCtos.add(responseOrderCto); - } - - int newNumberOfOrders = getNumberOfOrders(); - - // when - PaginatedListTo responseOrderCtos = this.service.findOrders(null); - assertThat(responseOrderCtos).isNotNull(); - - // then - assertThat(responseOrderCtos).isNotNull(); - - assertThat(oldNumberOfOrders + NUMBER_OF_SAMPLE_ORDERS).isEqualTo(newNumberOfOrders); - assertThat(responseOrderCtos.getResult().size()).isEqualTo(newNumberOfOrders); - - int countNumberOfSavedOrders = 0; - - for (OrderCto responseOrder : responseOrderCtos.getResult()) { - for (OrderCto savedOrder : savedOrderCtos) { - if (responseOrder.getOrder().getId().equals(savedOrder.getOrder().getId())) { - assertThat(responseOrder.getOrder().getTableId()).isEqualTo(savedOrder.getOrder().getTableId()); - countNumberOfSavedOrders++; - } - } - } - assertThat(countNumberOfSavedOrders).isEqualTo(NUMBER_OF_SAMPLE_ORDERS); - - } - - /** - * This test method creates a sample instance of {@link OrderCto} and saves it into the database. Subsequently - * {@link OrderSearchCriteriaTo} like tableId and {@link OrderState} are defined. Thereafter the sample - * {@link OrderCto} object is loaded from the database, if its attributes match the {@link OrderSearchCriteriaTo}. - * Finally the attributes of the sample instance of {@link OrderCto} are tested for correctness. - */ - @Test - public void findOrderByPost() { - - // given - OrderCto sampleOrderCto = this.helper.createSampleOrderCto(SAMPLE_TABLE_ID); - OrderCto responseOrderCto = this.service.saveOrder(sampleOrderCto); - assertThat(responseOrderCto).isNotNull(); - - OrderSearchCriteriaTo criteria = new OrderSearchCriteriaTo(); - criteria.setTableId(SAMPLE_TABLE_ID); - criteria.setState(SAMPLE_ORDER_STATE); - PaginationTo pagination = PaginationTo.NO_PAGINATION; - criteria.setPagination(pagination); - - // when - PaginatedListTo orderCtoList = this.service.findOrdersByPost(criteria); - - // then - assertThat(orderCtoList).isNotNull(); - assertThat(orderCtoList.getResult().size()).isEqualTo(1); - assertThat(orderCtoList.getResult().get(0).getOrder().getId()).isEqualTo(responseOrderCto.getOrder().getId()); - assertThat(orderCtoList.getResult().get(0).getOrder().getTableId()).isEqualTo(SAMPLE_TABLE_ID); - assertThat(orderCtoList.getResult().get(0).getOrder().getState()).isEqualTo(SAMPLE_ORDER_STATE); - - } - - /** - * This test method creates a sample instance of {@link OrderCto} and saves it into the database. In addition a sample - * instance of {@link OrderPositionEto} is created, linked to the sample {@link OrderCto} object by the id/orderId and - * saved into the database. Finally a the sample instance of {@link OrderPositionEto} is identified by its id, loaded - * from the database and its attributes are tested for correctness. - */ - @Test - public void findOrderPosition() { - - // given - OrderCto sampleOrderCto = this.helper.createSampleOrderCto(SAMPLE_TABLE_ID); - OrderCto responseOrderCto = this.service.saveOrder(sampleOrderCto); - assertThat(responseOrderCto).isNotNull(); - - OrderPositionEto sampleOrderPositionEto = - this.helper.createSampleOrderPositionEto(responseOrderCto.getOrder().getId()); - assertThat(sampleOrderPositionEto).isNotNull(); - OrderPositionEto responseSaveOrderPositionEto = this.service.saveOrderPosition(sampleOrderPositionEto); - assertThat(responseSaveOrderPositionEto).isNotNull(); - - // when - OrderPositionEto responseFindOrderPositionEto = - this.service.findOrderPosition(responseSaveOrderPositionEto.getId()); - - // then - assertThat(responseFindOrderPositionEto).isNotNull(); - assertThat(responseFindOrderPositionEto.getId()).isEqualTo(responseSaveOrderPositionEto.getId()); - assertThat(responseFindOrderPositionEto.getOrderId()).isEqualTo(responseSaveOrderPositionEto.getOrderId()); - assertThat(responseFindOrderPositionEto.getOfferId()).isEqualTo(SAMPLE_OFFER_ID); - assertThat(responseFindOrderPositionEto.getOfferName()).isEqualTo(SAMPLE_OFFER_NAME); - assertThat(responseFindOrderPositionEto.getState()).isEqualTo(SAMPLE_ORDER_POSITION_STATE); - assertThat(responseFindOrderPositionEto.getDrinkState()).isEqualTo(SAMPLE_DRINK_STATE); - assertThat(responseFindOrderPositionEto.getPrice()).isEqualTo(SAMPLE_PRICE); - } - - /** - * This test method creates a sample instance of {@link OrderCto} and saves it into the database. In addition some - * sample instances of {@link OrderPositionEto} are created, linked to sampleOrderCto by the id/orderId and saved into - * the database. Thereafter all {@link OrderPositionEto} objects are loaded from the database. The method tests the - * number of loaded orderPositionEtos and the attributes of the sample instances for correctness. - */ - @Test - public void findAllOrderPositions() { - - // given - OrderCto sampleOrderCto = this.helper.createSampleOrderCto(SAMPLE_TABLE_ID); - OrderCto responseOrderCto = this.service.saveOrder(sampleOrderCto); - assertThat(responseOrderCto).isNotNull(); - - int oldNumberOfOrderPositions = getNumberOfOrderPositions(); - OrderPositionEto sampleOrderPositionEto; - OrderPositionEto responseOrderPositionEto; - - ArrayList savedOrderPositionEtos = new ArrayList<>(); - for (int i = 0; i < NUMBER_OF_SAMPLE_ORDER_POSITIONS; ++i) { - sampleOrderPositionEto = new OrderPositionEto(); - sampleOrderPositionEto.setOrderId(responseOrderCto.getOrder().getId()); - sampleOrderPositionEto.setOfferId(SAMPLE_OFFER_ID); - sampleOrderPositionEto.setPrice(new Money(2.99)); - sampleOrderPositionEto.setOfferName("dummy"); - responseOrderPositionEto = this.service.saveOrderPosition(sampleOrderPositionEto); - assertThat(responseOrderPositionEto).isNotNull(); - savedOrderPositionEtos.add(responseOrderPositionEto); - } - - int newNumberOfOrderPositions = getNumberOfOrderPositions(); - - // when - List responseOrderPositionEtos = this.service.findOrderPositions(null); - - // then - assertThat(responseOrderPositionEtos).isNotNull(); - - assertThat(oldNumberOfOrderPositions + NUMBER_OF_SAMPLE_ORDER_POSITIONS).isEqualTo(newNumberOfOrderPositions); - assertThat(responseOrderPositionEtos.size()).isEqualTo(newNumberOfOrderPositions); - - int countNumberOfSavedOrderPositions = 0; - - for (OrderPositionEto responseOrderPosition : responseOrderPositionEtos) { - for (OrderPositionEto savedOrderPosition : savedOrderPositionEtos) { - if (responseOrderPosition.getId().equals(savedOrderPosition.getId())) { - - assertThat(responseOrderPosition.getOrderId()).isEqualTo(savedOrderPosition.getOrderId()); - assertThat(responseOrderPosition.getOfferId()).isEqualTo(savedOrderPosition.getOfferId()); - assertThat(responseOrderPosition.getOfferName()).isEqualTo(savedOrderPosition.getOfferName()); - assertThat(responseOrderPosition.getPrice()).isEqualTo(savedOrderPosition.getPrice()); - - countNumberOfSavedOrderPositions++; - } - } - } - assertThat(countNumberOfSavedOrderPositions).isEqualTo(NUMBER_OF_SAMPLE_ORDER_POSITIONS); - } - - /** - * This test method creates a sample instance of {@link OrderCto} and saves it into the database. In addition a sample - * instance of {@link OrderPositionEto} is created, linked to the sample {@link OrderCto} object by the id/orderId and - * saved into the database. After that another {@link OrderCto} object comprising a {@link OrderEto} object with the - * same id/orderId as the the previously saved {@link OrderCto}/{@link OrderEto} object is saved into the database. - * The resulting effect of the all {@link OrderPositionEto} objects being cancelled is tested. - */ - @Test - public void cancelOrderPosition() { - - // given - OrderCto sampleOrderCto = this.helper.createSampleOrderCto(SAMPLE_TABLE_ID); - OrderCto responseOrderCto = this.service.saveOrder(sampleOrderCto); - assertThat(responseOrderCto).isNotNull(); - - OrderPositionEto sampleOrderPositionEto = - this.helper.createSampleOrderPositionEto(responseOrderCto.getOrder().getId()); - OrderPositionEto responseOrderPositionEto = this.service.saveOrderPosition(sampleOrderPositionEto); - assertThat(responseOrderPositionEto).isNotNull(); - - OrderEto sampleOrderEto = new OrderEto(); - sampleOrderEto.setId(responseOrderCto.getOrder().getId()); - sampleOrderCto.setOrder(sampleOrderEto); - - // when - this.service.saveOrder(sampleOrderCto); - - // then - responseOrderPositionEto = this.service.findOrderPosition(responseOrderPositionEto.getId()); - assertThat(responseOrderPositionEto.getState()).isEqualTo(OrderPositionState.CANCELLED); - assertThat(responseOrderCto.getOrder().getId()).isEqualTo(sampleOrderCto.getOrder().getId()); - } - - /** - * This test method loads all saved {@link OrderCto} objects from the database, counts the number and returns it. - * - * @return number of orders saved in the database - */ - protected int getNumberOfOrders() { - - int numberOfOrders = 0; - PaginatedListTo orders = this.service.findOrders(null); - if (orders != null) { - numberOfOrders = orders.getResult().size(); - } - return numberOfOrders; - } - - /** - * This test method loads all saved {@link OrderPositionEto} objects from the database, counts the number and returns - * it. - * - * @return number of orderPositions saved in the database - */ - protected int getNumberOfOrderPositions() { - - int numberOfOrderPositions = 0; - List orderPositions = this.service.findOrderPositions(null); - if (orderPositions != null) { - numberOfOrderPositions = orderPositions.size(); - } - return numberOfOrderPositions; - } -} \ No newline at end of file diff --git a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/salesmanagement/service/impl/rest/SalesmanagementRestServiceTestHelper.java b/samples/core/src/test/java/io/oasp/gastronomy/restaurant/salesmanagement/service/impl/rest/SalesmanagementRestServiceTestHelper.java deleted file mode 100644 index 7b1faeb95..000000000 --- a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/salesmanagement/service/impl/rest/SalesmanagementRestServiceTestHelper.java +++ /dev/null @@ -1,88 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.service.impl.rest; - -import java.math.BigDecimal; - -import io.oasp.gastronomy.restaurant.general.common.api.datatype.Money; -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype.OrderPositionState; -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype.OrderState; -import io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype.ProductOrderState; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderCto; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderEto; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderPositionEto; - -/** - * This is a helper class for the classes {@link SalesmanagementRestServiceTest} and - * {@link SalesmanagementHttpRestServiceTest}. It capsulates some sample attributes as constants used both testing - * classes. Moreover it provides two methods to create sample {@link OrderCto} and {@link OrderPositionEto} objects - * using the sample attributes defined by this class. - * - */ -public class SalesmanagementRestServiceTestHelper { - - protected static final String ROLE = "chief"; - - protected static final long SAMPLE_OFFER_ID = 4L; - - protected static final int NUMBER_OF_SAMPLE_ORDERS = 2; - - protected static final int NUMBER_OF_SAMPLE_ORDER_POSITIONS = 2; - - protected static final String SAMPLE_OFFER_NAME = "Salat-Menü"; - - protected static final OrderState SAMPLE_ORDER_STATE = OrderState.OPEN; - - protected static final OrderPositionState SAMPLE_ORDER_POSITION_STATE = OrderPositionState.ORDERED; - - protected static final ProductOrderState SAMPLE_DRINK_STATE = ProductOrderState.DELIVERED; - - protected static final Money SAMPLE_PRICE = new Money(new BigDecimal("5.99")); - - protected static final String SAMPLE_COMMENT = null; - - protected static final long SAMPLE_TABLE_ID = 101; - - protected static final String BASE_URL_PRAEFIX = "http://localhost:"; - - protected static final String BASE_URL_SUFFIX_1 = "/services/rest"; - - protected static final String BASE_URL_SUFFIX_2 = "/salesmanagement/v1/"; - - protected static long numberOfOrderPositions = 0; - - /** - * This method creates a sample {@link OrderCto} depending on the constants defined by this class. - * - * @param tableId - * @return {@link OrderCto} - */ - protected OrderCto createSampleOrderCto(long tableId) { - - OrderCto sampleOrderCto = new OrderCto(); - OrderEto sampleOrderEto = new OrderEto(); - sampleOrderEto.setTableId(SAMPLE_TABLE_ID); - sampleOrderCto.setOrder(sampleOrderEto); - - return sampleOrderCto; - } - - /** - * This method creates a sample {@link OrderPositionEto} depending on the constants defined by this class. - * - * @param orderId - * @return {@link OrderPositionEto} - */ - public OrderPositionEto createSampleOrderPositionEto(long orderId) { - - OrderPositionEto sampleOrderPositionEto = new OrderPositionEto(); - sampleOrderPositionEto.setOrderId(orderId); - sampleOrderPositionEto.setOfferId(SAMPLE_OFFER_ID); - sampleOrderPositionEto.setOfferName(SAMPLE_OFFER_NAME); - sampleOrderPositionEto.setState(SAMPLE_ORDER_POSITION_STATE); - sampleOrderPositionEto.setDrinkState(SAMPLE_DRINK_STATE); - sampleOrderPositionEto.setPrice(SAMPLE_PRICE); - sampleOrderPositionEto.setComment(SAMPLE_COMMENT); - - return sampleOrderPositionEto; - } - -} diff --git a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/salesmanagement/service/impl/rest/SalesmanagementRestTestConfig.java b/samples/core/src/test/java/io/oasp/gastronomy/restaurant/salesmanagement/service/impl/rest/SalesmanagementRestTestConfig.java deleted file mode 100644 index 1c14c18d4..000000000 --- a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/salesmanagement/service/impl/rest/SalesmanagementRestTestConfig.java +++ /dev/null @@ -1,37 +0,0 @@ -package io.oasp.gastronomy.restaurant.salesmanagement.service.impl.rest; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.client.RestTemplate; - -/** - * This configuration class provides a {@link SalesmanagementRestServiceTestHelper} and a {@link RestTemplate} bean - */ -@Configuration -public class SalesmanagementRestTestConfig { - - /** - * This method is creating {@link SalesmanagementRestServiceTestHelper} bean - * - * @return {@link SalesmanagementRestServiceTestHelper} - */ - @Bean - public SalesmanagementRestServiceTestHelper salesmanagementRestServiceTestHelper() { - - SalesmanagementRestServiceTestHelper salesmanagementRestServiceTestHelper = - new SalesmanagementRestServiceTestHelper(); - return salesmanagementRestServiceTestHelper; - } - - /** - * This method is creating {@link RestTemplate} bean - * - * @return {@link RestTemplate} - */ - @Bean - public RestTemplate restTemplate() { - - RestTemplate restTemplate = new RestTemplate(); - return restTemplate; - } -} \ No newline at end of file diff --git a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/staffmanagement/logic/impl/StaffmanagementImplTest.java b/samples/core/src/test/java/io/oasp/gastronomy/restaurant/staffmanagement/logic/impl/StaffmanagementImplTest.java deleted file mode 100644 index 94af784a6..000000000 --- a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/staffmanagement/logic/impl/StaffmanagementImplTest.java +++ /dev/null @@ -1,96 +0,0 @@ -package io.oasp.gastronomy.restaurant.staffmanagement.logic.impl; - -import static org.mockito.Mockito.when; - -import org.junit.Rule; -import org.junit.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.junit.MockitoJUnit; -import org.mockito.junit.MockitoRule; - -import io.oasp.gastronomy.restaurant.staffmanagement.dataaccess.api.StaffMemberEntity; -import io.oasp.gastronomy.restaurant.staffmanagement.dataaccess.api.dao.StaffMemberDao; -import io.oasp.gastronomy.restaurant.staffmanagement.logic.api.to.StaffMemberEto; -import io.oasp.module.beanmapping.common.api.BeanMapper; -import io.oasp.module.test.common.base.ModuleTest; - -/** - * This class provides a basic implementation of a {@code ModuleTest} which employs the Mockito framework to provide - * fake objects to the SUT. For a limited number of test cases per class it can be convenient to use the annotation - * {@code @InjectMocks} to inject all needed mocks in the class under test. - * - */ - -public class StaffmanagementImplTest extends ModuleTest { - - /** - * Initializes mocks before each test method. - */ - @Rule - public MockitoRule rule = MockitoJUnit.rule(); - - @Mock - private BeanMapper beanMapper; - - @Mock - private StaffMemberEntity staffMemberEntity; - - @Mock - private StaffMemberEto staffMemberEto; - - @Mock - private StaffMemberDao staffMemberDao; - - @InjectMocks - StaffmanagementImpl staffmanagementImpl = new StaffmanagementImpl(); - - /** - * This test method tests the {@code findStaffMember} method of {@link StaffmanagementImpl} by mocking needed - * dependencies. - */ - @Test - public void testFindStaffMember() { - - // given - long id = 1L; - Class targetClass = StaffMemberEto.class; - - when(this.staffMemberDao.find(id)).thenReturn(this.staffMemberEntity); - when(this.beanMapper.map(this.staffMemberEntity, targetClass)).thenReturn(this.staffMemberEto); - - // when - StaffMemberEto resultEto = this.staffmanagementImpl.findStaffMember(id); - - // then - assertThat(resultEto).isNotNull(); - assertThat(resultEto).isEqualTo(this.staffMemberEto); - } - - /** - * This test method updates a saved staffMemberEntity. It demonstrates the approach when there is a method call in the - * method under test. To solve this in the given case you need to override the {@code @Inject} of the tested method by - * using the appropriate setter {@code setStaffMemberDao()}. - */ - @Test - public void testSaveStaffMember() { - - // given - long id = 1L; - - when(this.staffMemberEto.getId()).thenReturn(id); - when(this.staffMemberDao.find(id)).thenReturn(this.staffMemberEntity); - when(this.staffMemberEto.getName()).thenReturn("new Name"); - when(this.staffMemberEntity.getName()).thenReturn("old Name"); - when(this.beanMapper.map(this.staffMemberEto, StaffMemberEntity.class)).thenReturn(this.staffMemberEntity); - when(this.staffMemberDao.save(this.staffMemberEntity)).thenReturn(this.staffMemberEntity); - when(this.beanMapper.map(this.staffMemberEntity, StaffMemberEto.class)).thenReturn(this.staffMemberEto); - - // when - this.staffmanagementImpl.setStaffMemberDao(this.staffMemberDao); - StaffMemberEto resultEto = this.staffmanagementImpl.saveStaffMember(this.staffMemberEto); - - // then - assertThat(resultEto.getId()).isEqualTo(this.staffMemberEto.getId()); - } -} \ No newline at end of file diff --git a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/tablemanagement/logic/impl/TablemanagementImplTest.java b/samples/core/src/test/java/io/oasp/gastronomy/restaurant/tablemanagement/logic/impl/TablemanagementImplTest.java deleted file mode 100644 index 26c93cd5c..000000000 --- a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/tablemanagement/logic/impl/TablemanagementImplTest.java +++ /dev/null @@ -1,99 +0,0 @@ -package io.oasp.gastronomy.restaurant.tablemanagement.logic.impl; - -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -import org.junit.Rule; -import org.junit.Test; -import org.mockito.Mock; -import org.mockito.junit.MockitoJUnit; -import org.mockito.junit.MockitoRule; - -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.Salesmanagement; -import io.oasp.gastronomy.restaurant.staffmanagement.logic.api.Staffmanagement; -import io.oasp.gastronomy.restaurant.tablemanagement.dataaccess.api.TableEntity; -import io.oasp.gastronomy.restaurant.tablemanagement.dataaccess.api.dao.TableDao; -import io.oasp.gastronomy.restaurant.tablemanagement.logic.api.to.TableEto; -import io.oasp.module.beanmapping.common.api.BeanMapper; -import io.oasp.module.test.common.base.ModuleTest; - -/** - * This class provides a basic implementation of a {@code ComponentTest} which employs the Mockito framework to provide - * fake objects to the SUT. - * - */ -public class TablemanagementImplTest extends ModuleTest { - - /** - * Initializes mocks before each test method. - */ - @Rule - public MockitoRule rule = MockitoJUnit.rule(); - - /** - * The System Under Test (SUT) - */ - private TablemanagementImpl tableManagementImpl; - - @Mock - private Salesmanagement salesManagement; - - @Mock - private Staffmanagement staffManagement; - - @Mock - private TableDao tableDao; - - @Mock - private BeanMapper beanMapper; - - /** - * Injection of the mocked objects into the SUT. - */ - @Override - public void doSetUp() { - - super.doSetUp(); - this.tableManagementImpl = new TablemanagementImpl(); - this.tableManagementImpl.setSalesmanagement(this.salesManagement); - this.tableManagementImpl.setStaffmanagement(this.staffManagement); - this.tableManagementImpl.setTableDao(this.tableDao); - this.tableManagementImpl.setBeanMapper(this.beanMapper); - - } - - /** - * Delete the used mocks. - */ - @Override - public void doTearDown() { - - super.doTearDown(); - this.salesManagement = null; - this.staffManagement = null; - this.beanMapper = null; - this.tableDao = null; - this.tableManagementImpl = null; - } - - /** - * This method tests the findTable method. - */ - @Test - public void findTable() { - - // given - TableEntity entity = mock(TableEntity.class); - TableEto eto = new TableEto(); - - when(this.tableDao.findOne(1L)).thenReturn(entity); - when(this.beanMapper.map(entity, TableEto.class)).thenReturn(eto); - - // when - TableEto resultEto = this.tableManagementImpl.findTable(1L); - - // then - assertThat(resultEto).isNotNull(); - assertThat(resultEto).isEqualTo(eto); - } -} diff --git a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/tablemanagement/logic/impl/TablemanagementTest.java b/samples/core/src/test/java/io/oasp/gastronomy/restaurant/tablemanagement/logic/impl/TablemanagementTest.java deleted file mode 100644 index dc05f9eaa..000000000 --- a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/tablemanagement/logic/impl/TablemanagementTest.java +++ /dev/null @@ -1,227 +0,0 @@ -package io.oasp.gastronomy.restaurant.tablemanagement.logic.impl; - -import java.util.List; - -import javax.inject.Inject; - -import net.sf.mmm.util.exception.api.ObjectNotFoundUserException; - -import org.junit.Test; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.security.access.AccessDeniedException; -import org.springframework.test.context.web.WebAppConfiguration; - -import io.oasp.gastronomy.restaurant.SpringBootApp; -import io.oasp.gastronomy.restaurant.general.common.DbTestHelper; -import io.oasp.gastronomy.restaurant.general.common.TestUtil; -import io.oasp.gastronomy.restaurant.general.common.api.builders.OrderEtoBuilder; -import io.oasp.gastronomy.restaurant.general.common.api.builders.OrderPositionEtoBuilder; -import io.oasp.gastronomy.restaurant.general.common.api.constants.PermissionConstants; -import io.oasp.gastronomy.restaurant.general.common.api.datatype.Money; -import io.oasp.gastronomy.restaurant.general.common.api.exception.IllegalEntityStateException; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.Salesmanagement; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderEto; -import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderPositionEto; -import io.oasp.gastronomy.restaurant.tablemanagement.common.api.datatype.TableState; -import io.oasp.gastronomy.restaurant.tablemanagement.logic.api.Tablemanagement; -import io.oasp.gastronomy.restaurant.tablemanagement.logic.api.to.TableEto; -import io.oasp.module.test.common.base.ComponentTest; - -/** - * This is the test case for the component {@link Tablemanagement}. - * - * - */ - -@SpringBootTest(classes = { SpringBootApp.class }) -@WebAppConfiguration -public class TablemanagementTest extends ComponentTest { - - @Inject - private Salesmanagement salesmanagement; - - @Inject - private Tablemanagement tablemanagement; - - @Inject - private DbTestHelper dbTestHelper; - - /** - * Provides login credentials and permissions and resets database. The database is migrated to Version 0002 in order - * to have a common basis for test. - */ - @Override - public void doSetUp() { - - super.doSetUp(); - TestUtil.login("waiter", PermissionConstants.SAVE_ORDER_POSITION, PermissionConstants.SAVE_ORDER, - PermissionConstants.FIND_TABLE, PermissionConstants.FIND_ORDER, PermissionConstants.SAVE_TABLE, - PermissionConstants.FIND_OFFER); - this.dbTestHelper.setMigrationVersion("0002"); - this.dbTestHelper.resetDatabase(); - - } - - /** - * Logs out used credentials. - */ - @Override - public void doTearDown() { - - super.doTearDown(); - TestUtil.logout(); - } - - /** - * This test method tests if a table is releasable without and with an open order attached to it. - */ - @Test - public void testIsTableReleasable() { - - // given - // initially table is releasable (despite TableState is OCCUPIED - but there is no open order) - Long tableNumber = 101L; - Long offerId = 2L; - TableEto table = this.tablemanagement.findTable(tableNumber); - assertThat(table.getState()).isEqualTo(TableState.OCCUPIED); - assertThat(this.tablemanagement.isTableReleasable(table)).isTrue(); - - // when - // add order with open orderPosition to table - OrderEto newOrder = new OrderEtoBuilder().tableId(table.getId()).createNew(); - OrderEto order = this.salesmanagement.saveOrder(newOrder); - long orderId = order.getId(); - OrderPositionEto newOrderPosition = new OrderPositionEtoBuilder().orderId(orderId).offerId(offerId).createNew(); - newOrderPosition.setPrice(new Money(2.99)); - newOrderPosition.setOfferName("dummy"); - OrderPositionEto orderPosition = this.salesmanagement.saveOrderPosition(newOrderPosition); - - // then - // table should be OCCUPIED - assertThat(order).isNotNull(); - assertThat(orderPosition).isNotNull(); - assertThat(this.tablemanagement.isTableReleasable(table)).isFalse(); - assertThat(table.getState()).isEqualTo(TableState.OCCUPIED); - } - - /** - * This test method finds all free tables, occupies one of them and checks if the number of free tables is reduced by - * 1. - */ - @Test - public void testFindFreeTables() { - - // given - List freeTables = this.tablemanagement.findFreeTables(); - assertThat(freeTables).isNotNull(); - assertThat(freeTables).isNotEmpty(); - int numberOfFreeTables = freeTables.size(); - - // when - // occupy the first free table in the list - Long idOfFirstFreeTable = freeTables.get(0).getId(); - TableEto firstFreeTable = this.tablemanagement.findTable(idOfFirstFreeTable); - assertThat(firstFreeTable).isNotNull(); - firstFreeTable.setState(TableState.OCCUPIED); - TableEto updatedTable = this.tablemanagement.saveTable(firstFreeTable); - assertThat(updatedTable).isNotNull(); - - // then - List newFreeTables = this.tablemanagement.findFreeTables(); - assertThat(newFreeTables).isNotNull(); - assertThat(newFreeTables).isNotEmpty(); - assertThat(newFreeTables.size()).isEqualTo(numberOfFreeTables - 1); - - } - - /** - * This test method finds all tables currently in the database and checks if a specific one is in the retrieved list. - */ - @Test - public void testFindAllTables() { - - // given - Long tableNumber = 101L; - TableEto table = this.tablemanagement.findTable(tableNumber); - - // when - List allTables = this.tablemanagement.findAllTables(); - - // then - assertThat(allTables).isNotNull(); - assertThat(allTables).isNotEmpty(); - assertThat(allTables).hasOnlyElementsOfType(TableEto.class); - assertThat(allTables).extracting("state").contains(table.getState()); - assertThat(allTables).extracting("waiterId").contains(table.getWaiterId()); - assertThat(allTables).extracting("number").contains(table.getNumber()); - - } - - /** - * This test tries to delete a table without credentials. - */ - @Test(expected = AccessDeniedException.class) - public void testDeleteTableWithoutCredentials() { - - // given - Long tableNumber = 101L; - - // when - this.tablemanagement.deleteTable(tableNumber); - - // then - assertThat(this.tablemanagement.findTable(tableNumber)).isNotNull(); - } - - /** - * This test tries to delete a table that is occupied. - */ - @Test(expected = IllegalEntityStateException.class) - public void testDeleteTableWithCredentialsButNotDeletable() { - - // given - TestUtil.login("waiter", PermissionConstants.DELETE_TABLE, PermissionConstants.FIND_TABLE); - Long tableNumber = 101L; - - // when - this.tablemanagement.deleteTable(tableNumber); - - // then - assertThat(this.tablemanagement.findTable(tableNumber)).isNotNull(); - } - - /** - * This table tries to delete a table that does not exist. - */ - @Test(expected = ObjectNotFoundUserException.class) - public void testDeleteTableWithCredentialsNotExisting() { - - // given - TestUtil.login("waiter", PermissionConstants.DELETE_TABLE, PermissionConstants.FIND_TABLE); - Long tableNumber = 100L; - - // when - this.tablemanagement.deleteTable(tableNumber); - - // then - assertThat(this.tablemanagement.findTable(tableNumber)).isNull(); - } - - /** - * This table deletes a table that is free. - */ - @Test - public void testDeleteTableWithCredentials() { - - // given - TestUtil.login("waiter", PermissionConstants.DELETE_TABLE, PermissionConstants.FIND_TABLE); - Long tableNumber = 102L; - - // when - this.tablemanagement.deleteTable(tableNumber); - - // then - assertThat(this.tablemanagement.findTable(tableNumber)).isNull(); - } - -} diff --git a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/tablemanagement/service/impl/rest/TablemanagementRestServiceTest.java b/samples/core/src/test/java/io/oasp/gastronomy/restaurant/tablemanagement/service/impl/rest/TablemanagementRestServiceTest.java deleted file mode 100644 index e7f4b0925..000000000 --- a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/tablemanagement/service/impl/rest/TablemanagementRestServiceTest.java +++ /dev/null @@ -1,154 +0,0 @@ -package io.oasp.gastronomy.restaurant.tablemanagement.service.impl.rest; - -import java.util.List; - -import javax.inject.Inject; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringRunner; - -import io.oasp.gastronomy.restaurant.general.common.api.builders.TableEtoBuilder; -import io.oasp.gastronomy.restaurant.general.common.base.AbstractRestServiceTest; -import io.oasp.gastronomy.restaurant.tablemanagement.common.api.datatype.TableState; -import io.oasp.gastronomy.restaurant.tablemanagement.logic.api.to.TableEto; -import io.oasp.gastronomy.restaurant.tablemanagement.logic.api.to.TableSearchCriteriaTo; -import io.oasp.gastronomy.restaurant.tablemanagement.service.api.rest.TablemanagementRestService; -import io.oasp.module.jpa.common.api.to.PaginatedListTo; -import io.oasp.module.service.common.api.client.ServiceClientFactory; -import io.oasp.module.service.common.api.client.config.ServiceClientConfigBuilder; - -/** - * This class serves as an example of how to perform a subsystem test (e.g., call a *RestService interface). - * - */ -@RunWith(SpringRunner.class) -@TestPropertySource(properties = { "flyway.locations=filesystem:src/test/resources/db/tablemanagement" }) -// , locations = {"file:src/test/resources/config" }) - -public class TablemanagementRestServiceTest extends AbstractRestServiceTest { - - private static final String LOGIN_WAITER = "waiter"; - - private static final String LOGIN_CHIEF = "chief"; - - @Inject - private ServiceClientFactory serviceClientFactory; - - /** - * Provides initialization previous to the creation of the text fixture. - */ - @Override - public void doSetUp() { - - super.doSetUp(); - getDbTestHelper().resetDatabase(); - } - - private TablemanagementRestService createService(String login) { - - return this.serviceClientFactory.create(TablemanagementRestService.class, - new ServiceClientConfigBuilder().userLogin(login).buildMap()); - } - - /** - * This test method serves as an example of how to use {@link AbstractRestServiceTest} in practice. - */ - @Test - public void testFindTable() { - - // given - long id = 102; - - // when - - TableEto table = createService(LOGIN_WAITER).getTable(id); - - // then - assertThat(table).isNotNull(); - assertThat(table.getId()).isEqualTo(id); - - } - - /** - * This test method deletes a table. As a waiter (default login defined in application.properties) does not have the - * permission to do so, a workaround is needed to login as member "chief". Do not try to delete table 101 as is has an - * attached order and will fail with error code 400. - */ - @Test - public void testDeleteTable() { - - // setup - TablemanagementRestService service = createService(LOGIN_CHIEF); - - // given - int deleteTableNumber = 102; - assertThat(service.getTable(deleteTableNumber)).isNotNull(); - - // when - service.deleteTable(deleteTableNumber); - - // then - assertThat(service.getTable(deleteTableNumber)).isNull(); - } - - /** - * This test method creates a table using {@link TableEtoBuilder} and saves it into the database. As a waiter (default - * login defined in application.properties) does not have the permission to do so, a workaround is needed to login as - * member "chief". - */ - @Test - public void testSaveTable() { - - // given - long tableNumber = 7L; - long waiterId = 2L; - TableEto table = new TableEtoBuilder().number(tableNumber).waiterId(waiterId).createNew(); - assertThat(table.getId()).isNull(); - - // when - TableEto savedTable = createService(LOGIN_CHIEF).saveTable(table); - - // then - assertThat(savedTable).isNotNull(); - assertThat(savedTable.getId()).isNotNull(); - assertThat(savedTable.getState()).isEqualTo(TableState.FREE); - assertThat(savedTable.getNumber()).isEqualTo(tableNumber); - assertThat(savedTable.getWaiterId()).isEqualTo(waiterId); - } - - /** - * This test method demonstrates a simple usage of {@link TableSearchCriteriaTo} for searching a table by post with - * {@link TableState} {@code RESERVED} that is created prior to the search job. - */ - @Test - public void testFindTablesByPost() { - - // given - long tableNumber = 7L; - long waiterId = 2L; - TableEto table = - new TableEtoBuilder().number(tableNumber).waiterId(waiterId).state(TableState.RESERVED).createNew(); - assertThat(table).isNotNull(); - TablemanagementRestService service = createService(LOGIN_WAITER); - TableEto savedTable = service.saveTable(table); - assertThat(savedTable).isNotNull(); - TableSearchCriteriaTo criteria = new TableSearchCriteriaTo(); - assertThat(criteria).isNotNull(); - criteria.setState(TableState.RESERVED); - - // when - PaginatedListTo tables = service.findTablesByPost(criteria); - List result = tables.getResult(); - - // then - assertThat(result).isNotEmpty(); - assertThat(result).hasAtLeastOneElementOfType(TableEto.class).extracting("state").contains(TableState.RESERVED); - assertThat(result).extracting("state").doesNotContain(TableState.FREE); - assertThat(result).extracting("state").doesNotContain(TableState.OCCUPIED); - assertThat(result).extracting("waiterId").contains(waiterId); - assertThat(result).extracting("number").contains(tableNumber); - } - -} diff --git a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/tablemanagement/service/impl/ws/TablemanagementWebServiceTest.java b/samples/core/src/test/java/io/oasp/gastronomy/restaurant/tablemanagement/service/impl/ws/TablemanagementWebServiceTest.java deleted file mode 100644 index 6b5030555..000000000 --- a/samples/core/src/test/java/io/oasp/gastronomy/restaurant/tablemanagement/service/impl/ws/TablemanagementWebServiceTest.java +++ /dev/null @@ -1,50 +0,0 @@ -package io.oasp.gastronomy.restaurant.tablemanagement.service.impl.ws; - -import javax.inject.Inject; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringRunner; - -import io.oasp.gastronomy.restaurant.general.common.base.AbstractRestServiceTest; -import io.oasp.gastronomy.restaurant.tablemanagement.logic.api.to.TableEto; -import io.oasp.gastronomy.restaurant.tablemanagement.service.api.ws.v1_0.TablemanagementWebService; -import io.oasp.module.service.common.api.client.ServiceClientFactory; - -/** - * Test of {@link TablemanagementWebService} over the wire (via HTTP). - */ -@RunWith(SpringRunner.class) -@TestPropertySource(properties = { "flyway.locations=filesystem:src/test/resources/db/tablemanagement", -"service.client.app.restaurant.user.login=waiter" }) -public class TablemanagementWebServiceTest extends AbstractRestServiceTest { - - @Inject - private ServiceClientFactory serviceClientFactory; - - private TablemanagementWebService tablemanagementWebService; - - @Override - protected void doSetUp() { - - super.doSetUp(); - getDbTestHelper().resetDatabase(); - this.tablemanagementWebService = this.serviceClientFactory.create(TablemanagementWebService.class); - } - - @Test - public void testWebService() { - - // given - long id = 102; - - // when - TableEto table = this.tablemanagementWebService.getTable(id); - - // then - assertThat(table).isNotNull(); - assertThat(table.getId()).isEqualTo(id); - } - -} diff --git a/samples/core/src/test/resources/AllTests/setup/db/V9001_1__Delete_data.sql b/samples/core/src/test/resources/AllTests/setup/db/V9001_1__Delete_data.sql deleted file mode 100644 index 8b1a7dee3..000000000 --- a/samples/core/src/test/resources/AllTests/setup/db/V9001_1__Delete_data.sql +++ /dev/null @@ -1,13 +0,0 @@ -SET FOREIGN_KEY_CHECKS=0; - -DELETE FROM RestaurantTable; -DELETE FROM RestaurantOrder; -DELETE FROM Product; -DELETE FROM Offer; -DELETE FROM OrderPosition; -DELETE FROM Bill; - ---Keep Staffmembers to allow authentication ---DELETE FROM StaffMember; - -SET FOREIGN_KEY_CHECKS=1; diff --git a/samples/core/src/test/resources/AllTests/setup/db/V9001_1__Delete_data_MSSQL.sql.mssql b/samples/core/src/test/resources/AllTests/setup/db/V9001_1__Delete_data_MSSQL.sql.mssql deleted file mode 100644 index 19df35396..000000000 --- a/samples/core/src/test/resources/AllTests/setup/db/V9001_1__Delete_data_MSSQL.sql.mssql +++ /dev/null @@ -1,24 +0,0 @@ ---Rename this file to V9001_1__Delete_data_MSSQL.sql.mssql if the database used is not MS SQL Server 2008 -ALTER TABLE ORDERPOSITION NOCHECK CONSTRAINT FK_ORDPOS2ORDER; -ALTER TABLE OFFER NOCHECK CONSTRAINT FK_OFFER2MEAL; -ALTER TABLE OFFER NOCHECK CONSTRAINT FK_OFFER2SIDEDISH; -ALTER TABLE OFFER NOCHECK CONSTRAINT FK_OFFER2DRINK; -ALTER TABLE BILLORDERPOSITION NOCHECK CONSTRAINT FK_BILLORDPOS2BILL; -ALTER TABLE BILLORDERPOSITION NOCHECK CONSTRAINT FK_BILLORDPOS2ORDPOS; - -DELETE FROM RESTAURANTTABLE; -DELETE FROM RESTAURANTORDER; -DELETE FROM PRODUCT; -DELETE FROM OFFER; -DELETE FROM ORDERPOSITION; -DELETE FROM BILL; - ---Keep Staffmembers to allow authentication ---DELETE FROM STAFFMEMBER; - -ALTER TABLE ORDERPOSITION CHECK CONSTRAINT FK_ORDPOS2ORDER; -ALTER TABLE OFFER CHECK CONSTRAINT FK_OFFER2MEAL; -ALTER TABLE OFFER CHECK CONSTRAINT FK_OFFER2SIDEDISH; -ALTER TABLE OFFER CHECK CONSTRAINT FK_OFFER2DRINK; -ALTER TABLE BILLORDERPOSITION CHECK CONSTRAINT FK_BILLORDPOS2BILL; -ALTER TABLE BILLORDERPOSITION CHECK CONSTRAINT FK_BILLORDPOS2ORDPOS; \ No newline at end of file diff --git a/samples/core/src/test/resources/AllTests/setup/db/V9001_1__Delete_data_MYSQL.sql.mysql b/samples/core/src/test/resources/AllTests/setup/db/V9001_1__Delete_data_MYSQL.sql.mysql deleted file mode 100644 index 7e80babe0..000000000 --- a/samples/core/src/test/resources/AllTests/setup/db/V9001_1__Delete_data_MYSQL.sql.mysql +++ /dev/null @@ -1,12 +0,0 @@ --- Rename this file to V9001_1__Delete_data_MYSQL.sql.mysql if the database used is not MariaDB 10.0.27 - -SET FOREIGN_KEY_CHECKS=0; - -DELETE FROM RESTAURANTTABLE; -DELETE FROM RESTAURANTORDER; -DELETE FROM PRODUCT; -DELETE FROM OFFER; -DELETE FROM ORDERPOSITION; -DELETE FROM BILL; - -SET FOREIGN_KEY_CHECKS=1; diff --git a/samples/core/src/test/resources/AllTests/setup/db/V9001_1__Delete_data_ORCL.sql.orcl b/samples/core/src/test/resources/AllTests/setup/db/V9001_1__Delete_data_ORCL.sql.orcl deleted file mode 100644 index 5bbfa7089..000000000 --- a/samples/core/src/test/resources/AllTests/setup/db/V9001_1__Delete_data_ORCL.sql.orcl +++ /dev/null @@ -1,27 +0,0 @@ ---Rename this file to V9001_1__Delete_data_ORCL.sql.orcl if the database used is not Oracle 11g - -ALTER TABLE ORDERPOSITION DISABLE CONSTRAINT FK_ORDPOS2ORDER; -ALTER TABLE OFFER DISABLE CONSTRAINT FK_OFFER2MEAL; -ALTER TABLE OFFER DISABLE CONSTRAINT FK_OFFER2SIDEDISH; -ALTER TABLE OFFER DISABLE CONSTRAINT FK_OFFER2DRINK; -ALTER TABLE BILLORDERPOSITION DISABLE CONSTRAINT FK_BILLORDPOS2BILL; -ALTER TABLE BILLORDERPOSITION DISABLE CONSTRAINT FK_BILLORDPOS2ORDPOS; - -DELETE FROM RESTAURANTTABLE; -DELETE FROM PRODUCT; -DELETE FROM OFFER; -DELETE FROM ORDERPOSITION; -DELETE FROM BILL; -DELETE FROM BILLORDERPOSITION; -DELETE FROM RESTAURANTORDER; -DELETE FROM STAFFMEMBER; - ---Keep Staffmembers to allow authentication ---DELETE FROM STAFFMEMBER; - -ALTER TABLE ORDERPOSITION ENABLE CONSTRAINT FK_ORDPOS2ORDER; -ALTER TABLE OFFER ENABLE CONSTRAINT FK_OFFER2MEAL; -ALTER TABLE OFFER ENABLE CONSTRAINT FK_OFFER2SIDEDISH; -ALTER TABLE OFFER ENABLE CONSTRAINT FK_OFFER2DRINK; -ALTER TABLE BILLORDERPOSITION ENABLE CONSTRAINT FK_BILLORDPOS2BILL; -ALTER TABLE BILLORDERPOSITION ENABLE CONSTRAINT FK_BILLORDPOS2ORDPOS; \ No newline at end of file diff --git a/samples/core/src/test/resources/AllTests/setup/db/V9001_1__Delete_data_pg.sql.pg b/samples/core/src/test/resources/AllTests/setup/db/V9001_1__Delete_data_pg.sql.pg deleted file mode 100644 index 743fdb5a3..000000000 --- a/samples/core/src/test/resources/AllTests/setup/db/V9001_1__Delete_data_pg.sql.pg +++ /dev/null @@ -1,31 +0,0 @@ ---Rename this file to V9001_1__Delete_data_pg.sql.pg if the database used is not PostGres -ALTER TABLE OFFER ALTER CONSTRAINT FK_OFFER2SIDEDISH DEFERRABLE; -ALTER TABLE OFFER ALTER CONSTRAINT FK_OFFER2MEAL DEFERRABLE; -ALTER TABLE OFFER ALTER CONSTRAINT FK_OFFER2DRINK DEFERRABLE; - -ALTER TABLE ORDERPOSITION ALTER CONSTRAINT FK_ORDPOS2ORDER DEFERRABLE; -ALTER TABLE ORDERPOSITION ALTER CONSTRAINT FK_ORDPOS2COOK DEFERRABLE; - -ALTER TABLE BILLORDERPOSITION ALTER CONSTRAINT FK_BILLORDPOS2BILL DEFERRABLE; -ALTER TABLE BILLORDERPOSITION ALTER CONSTRAINT FK_BILLORDPOS2ORDPOS DEFERRABLE; - -DELETE FROM RESTAURANTTABLE; -DELETE FROM BILLORDERPOSITION; -DELETE FROM ORDERPOSITION; -DELETE FROM RESTAURANTORDER; -DELETE FROM OFFER; -DELETE FROM PRODUCT; -DELETE FROM BILL; - ---Keep Staffmembers to allow authentication ---DELETE FROM STAFFMEMBER; - -ALTER TABLE OFFER ALTER CONSTRAINT FK_OFFER2SIDEDISH NOT DEFERRABLE; -ALTER TABLE OFFER ALTER CONSTRAINT FK_OFFER2MEAL NOT DEFERRABLE; -ALTER TABLE OFFER ALTER CONSTRAINT FK_OFFER2DRINK NOT DEFERRABLE; - -ALTER TABLE ORDERPOSITION ALTER CONSTRAINT FK_ORDPOS2ORDER NOT DEFERRABLE; -ALTER TABLE ORDERPOSITION ALTER CONSTRAINT FK_ORDPOS2COOK NOT DEFERRABLE; - -ALTER TABLE BILLORDERPOSITION ALTER CONSTRAINT FK_BILLORDPOS2BILL NOT DEFERRABLE; -ALTER TABLE BILLORDERPOSITION ALTER CONSTRAINT FK_BILLORDPOS2ORDPOS NOT DEFERRABLE; \ No newline at end of file diff --git a/samples/core/src/test/resources/BillExportJobTest/expected/bills.csv b/samples/core/src/test/resources/BillExportJobTest/expected/bills.csv deleted file mode 100644 index 81d4e4dce..000000000 --- a/samples/core/src/test/resources/BillExportJobTest/expected/bills.csv +++ /dev/null @@ -1,10 +0,0 @@ -1,true,14.98 EUR,1.30 EUR,1,1,,1,Schnitzel-Menü,DELIVERED,6.99 EUR,mit Ketschup -1,true,14.98 EUR,1.30 EUR,2,1,,2,Goulasch-Menü,DELIVERED,7.99 EUR, -1,true,14.98 EUR,1.30 EUR,1,1,,1,Schnitzel-Menü,DELIVERED,6.99 EUR,mit Ketschup -1,true,14.98 EUR,1.30 EUR,2,1,,2,Goulasch-Menü,DELIVERED,7.99 EUR, -2,true,14.98 EUR,1.40 EUR,3,1,,3,Pfifferlinge-Menü,DELIVERED,8.99 EUR, -2,true,14.98 EUR,1.40 EUR,4,1,,4,Salat-Menü,DELIVERED,5.99 EUR, -2,true,14.98 EUR,1.40 EUR,3,1,,3,Pfifferlinge-Menü,DELIVERED,8.99 EUR, -2,true,14.98 EUR,1.40 EUR,4,1,,4,Salat-Menü,DELIVERED,5.99 EUR, -2,true,14.98 EUR,1.40 EUR,3,1,,3,Pfifferlinge-Menü,DELIVERED,8.99 EUR, -2,true,14.98 EUR,1.40 EUR,4,1,,4,Salat-Menü,DELIVERED,5.99 EUR, diff --git a/samples/core/src/test/resources/BillExportJobTest/expected/bills_orcl.csv b/samples/core/src/test/resources/BillExportJobTest/expected/bills_orcl.csv deleted file mode 100644 index 4f68307a8..000000000 --- a/samples/core/src/test/resources/BillExportJobTest/expected/bills_orcl.csv +++ /dev/null @@ -1,6 +0,0 @@ -1,true,14.98 EUR,1.3 EUR,1,1,,1,Schnitzel-Menü,DELIVERED,6.99 EUR,mit Ketschup -1,true,14.98 EUR,1.3 EUR,2,1,,2,Goulasch-Menü,DELIVERED,7.99 EUR, -2,true,14.98 EUR,1.4 EUR,3,1,,3,Pfifferlinge-Menü,DELIVERED,8.99 EUR, -2,true,14.98 EUR,1.4 EUR,4,1,,4,Salat-Menü,DELIVERED,5.99 EUR, -2,true,14.98 EUR,1.4 EUR,3,1,,3,Pfifferlinge-Menü,DELIVERED,8.99 EUR, -2,true,14.98 EUR,1.4 EUR,4,1,,4,Salat-Menü,DELIVERED,5.99 EUR, diff --git a/samples/core/src/test/resources/BillExportJobTest/expected/bills_pg.csv b/samples/core/src/test/resources/BillExportJobTest/expected/bills_pg.csv deleted file mode 100644 index e31564d32..000000000 --- a/samples/core/src/test/resources/BillExportJobTest/expected/bills_pg.csv +++ /dev/null @@ -1,6 +0,0 @@ -1,true,14.98 EUR,1.30 EUR,1,1,,1,Schnitzel-Menü,DELIVERED,6.99 EUR,mit Ketschup -1,true,14.98 EUR,1.30 EUR,2,1,,2,Goulasch-Menü,DELIVERED,7.99 EUR, -2,true,14.98 EUR,1.40 EUR,3,1,,3,Pfifferlinge-Menü,DELIVERED,8.99 EUR, -2,true,14.98 EUR,1.40 EUR,3,1,,3,Pfifferlinge-Menü,DELIVERED,8.99 EUR, -2,true,14.98 EUR,1.40 EUR,4,1,,4,Salat-Menü,DELIVERED,5.99 EUR, -2,true,14.98 EUR,1.40 EUR,4,1,,4,Salat-Menü,DELIVERED,5.99 EUR, diff --git a/samples/core/src/test/resources/BillExportJobTest/setup/db/V9901_1__Import_data.sql b/samples/core/src/test/resources/BillExportJobTest/setup/db/V9901_1__Import_data.sql deleted file mode 100644 index 895459acf..000000000 --- a/samples/core/src/test/resources/BillExportJobTest/setup/db/V9901_1__Import_data.sql +++ /dev/null @@ -1,46 +0,0 @@ -INSERT INTO RestaurantTable (id, modificationCounter, number, state) VALUES (101, 1, 1, 2); -INSERT INTO RestaurantTable (id, modificationCounter, number, state) VALUES (102, 1, 2, 0); -INSERT INTO RestaurantTable (id, modificationCounter, number, state) VALUES (103, 1, 3, 0); -INSERT INTO RestaurantTable (id, modificationCounter, number, state) VALUES (104, 1, 4, 0); -INSERT INTO RestaurantTable (id, modificationCounter, number, state) VALUES (105, 1, 5, 0); - -INSERT INTO Product (id, modificationCounter, dType, description) VALUES (1, 1, 'Meal', 'Schnitzel'); -INSERT INTO Product (id, modificationCounter, dType, description) VALUES (2, 1, 'Meal', 'Goulasch'); -INSERT INTO Product (id, modificationCounter, dType, description) VALUES (3, 1, 'Meal', 'Pfifferlinge'); -INSERT INTO Product (id, modificationCounter, dType, description) VALUES (4, 1, 'Meal', 'Salat'); - -INSERT INTO Product (id, modificationCounter, dType, description) VALUES (5, 1, 'SideDish', 'Pommes'); -INSERT INTO Product (id, modificationCounter, dType, description) VALUES (6, 1, 'SideDish', 'Reis'); -INSERT INTO Product (id, modificationCounter, dType, description) VALUES (7, 1, 'SideDish', 'Brot'); -INSERT INTO Product (id, modificationCounter, dType, description) VALUES (8, 1, 'SideDish', 'Knödel'); - -INSERT INTO Product (id, modificationCounter, alcoholic, dType, description) VALUES (9, 1, false, 'Drink', 'Wasser'); -INSERT INTO Product (id, modificationCounter, alcoholic, dType, description) VALUES (10, 1, false, 'Drink', 'Cola'); -INSERT INTO Product (id, modificationCounter, alcoholic, dType, description) VALUES (11, 1, false, 'Drink', 'Bier'); -INSERT INTO Product (id, modificationCounter, alcoholic, dType, description) VALUES (12, 1, false, 'Drink', 'Wein / Apfelwein'); - -INSERT INTO Offer (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (1, 1, 0, 6.99, 1, 7, 10, 'Schnitzel-Menü', 'Description of Schnitzel-Menü'); -INSERT INTO Offer (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (2, 1, 0, 7.99, 2, 8, 11, 'Goulasch-Menü', 'Description of Goulasch-Menü'); -INSERT INTO Offer (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (3, 1, 0, 8.99, 3, 10, 12, 'Pfifferlinge-Menü', 'Description of Pfifferlinge-Menü'); -INSERT INTO Offer (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (4, 1, 0, 5.99, 4, 9, 9, 'Salat-Menü', 'Description of Salat-Menü'); -INSERT INTO Offer (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (5, 1, 0, 1.20, null, null, 10, 'Cola', 'Description of Salat-Menü'); - -INSERT INTO RestaurantOrder (id, modificationCounter, tableId, state) VALUES (1, 1, 101, 1); - -INSERT INTO OrderPosition (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (1, 1, 1, 2, 2, 1, 6.99, 'Schnitzel-Menü', 'mit Ketschup'); -INSERT INTO OrderPosition (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (2, 1, 2, 2, 2, 1, 7.99, 'Goulasch-Menü', ''); -INSERT INTO OrderPosition (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (3, 1, 3, 2, 2, 1, 8.99, 'Pfifferlinge-Menü',''); -INSERT INTO OrderPosition (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (4, 1, 4, 2, 2, 1, 5.99, 'Salat-Menü', ''); -INSERT INTO OrderPosition (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (5, 1, 5, 2, 2, 1, 5.99, 'Cola', ''); - -INSERT INTO Bill (id, modificationCounter, payed, total, tip) VALUES (1, 1, true, 14.98, 1.3); -INSERT INTO BillOrderPosition (billId, orderPositionsId) VALUES (1,1); -INSERT INTO BillOrderPosition (billId, orderPositionsId) VALUES (1,2); - -INSERT INTO Bill (id, modificationCounter, payed, total,tip) VALUES (2, 1, true, 14.98, 1.4); -INSERT INTO BillOrderPosition (billId, orderPositionsId) VALUES (2,3); -INSERT INTO BillOrderPosition (billId, orderPositionsId) VALUES (2,4); - -INSERT INTO Bill (id, modificationCounter, payed, total,tip) VALUES (3, 1, true, 15.98, 1.5); -INSERT INTO BillOrderPosition (billId, orderPositionsId) VALUES (2,3); -INSERT INTO BillOrderPosition (billId, orderPositionsId) VALUES (2,4); \ No newline at end of file diff --git a/samples/core/src/test/resources/BillExportJobTest/setup/db/V9901_1__Import_data_MSSQL.sql.mssql b/samples/core/src/test/resources/BillExportJobTest/setup/db/V9901_1__Import_data_MSSQL.sql.mssql deleted file mode 100644 index 71375140f..000000000 --- a/samples/core/src/test/resources/BillExportJobTest/setup/db/V9901_1__Import_data_MSSQL.sql.mssql +++ /dev/null @@ -1,60 +0,0 @@ ---Rename this file to V9001_1__Delete_data_MSSQL.sql.mssql if the database used is not MS SQL Server 2008 -SET IDENTITY_INSERT RESTAURANTTABLE ON -INSERT INTO RESTAURANTTABLE (id, modificationCounter, number, state) VALUES (101, 1, 1, 2); -INSERT INTO RESTAURANTTABLE (id, modificationCounter, number, state) VALUES (102, 1, 2, 0); -INSERT INTO RESTAURANTTABLE (id, modificationCounter, number, state) VALUES (103, 1, 3, 0); -INSERT INTO RESTAURANTTABLE (id, modificationCounter, number, state) VALUES (104, 1, 4, 0); -INSERT INTO RESTAURANTTABLE (id, modificationCounter, number, state) VALUES (105, 1, 5, 0); -SET IDENTITY_INSERT RESTAURANTTABLE OFF - -SET IDENTITY_INSERT PRODUCT ON -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (1, 1, 'Meal', 'Schnitzel'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (2, 1, 'Meal', 'Goulasch'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (3, 1, 'Meal', 'Pfifferlinge'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (4, 1, 'Meal', 'Salat'); - -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (5, 1, 'SideDish', 'Pommes'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (6, 1, 'SideDish', 'Reis'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (7, 1, 'SideDish', 'Brot'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (8, 1, 'SideDish', 'Knödel'); - -INSERT INTO PRODUCT (id, modificationCounter, alcoholic, dType, description) VALUES (9, 1, 0, 'Drink', 'Wasser'); -INSERT INTO PRODUCT (id, modificationCounter, alcoholic, dType, description) VALUES (10, 1, 0, 'Drink', 'Cola'); -INSERT INTO PRODUCT (id, modificationCounter, alcoholic, dType, description) VALUES (11, 1, 0, 'Drink', 'Bier'); -INSERT INTO PRODUCT (id, modificationCounter, alcoholic, dType, description) VALUES (12, 1, 0, 'Drink', 'Wein / Apfelwein'); -SET IDENTITY_INSERT PRODUCT OFF - -SET IDENTITY_INSERT OFFER ON -INSERT INTO OFFER (id, modificationCounter, number, state, price, mealId, sideDishId, drinkId, name, description) VALUES (1, 1, 1, 0, 6.99, 1, 7, 10, 'Schnitzel-Menü', 'Description of Schnitzel-Menü'); -INSERT INTO OFFER (id, modificationCounter, number, state, price, mealId, sideDishId, drinkId, name, description) VALUES (2, 1, 2, 0, 7.99, 2, 8, 11, 'Goulasch-Menü', 'Description of Goulasch-Menü'); -INSERT INTO OFFER (id, modificationCounter, number, state, price, mealId, sideDishId, drinkId, name, description) VALUES (3, 1, 3, 0, 8.99, 3, 10, 12, 'Pfifferlinge-Menü', 'Description of Pfifferlinge-Menü'); -INSERT INTO OFFER (id, modificationCounter, number, state, price, mealId, sideDishId, drinkId, name, description) VALUES (4, 1, 4, 0, 5.99, 4, 9, 9, 'Salat-Menü', 'Description of Salat-Menü'); -INSERT INTO OFFER (id, modificationCounter, number, state, price, mealId, sideDishId, drinkId, name, description) VALUES (5, 1, 5, 0, 1.20, null, null, 10, 'Cola', 'Description of Salat-Menü'); -SET IDENTITY_INSERT OFFER OFF - -SET IDENTITY_INSERT RESTAURANTORDER ON -INSERT INTO RESTAURANTORDER (id, modificationCounter, tableId, state) VALUES (1, 1, 101, 1); -SET IDENTITY_INSERT RESTAURANTORDER OFF - -SET IDENTITY_INSERT ORDERPOSITION ON -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (1, 1, 1, 2, 2, 1, 6.99, 'Schnitzel-Menü', 'mit Ketschup'); -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (2, 1, 2, 2, 2, 1, 7.99, 'Goulasch-Menü', ''); -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (3, 1, 3, 2, 2, 1, 8.99, 'Pfifferlinge-Menü',''); -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (4, 1, 4, 2, 2, 1, 5.99, 'Salat-Menü', ''); -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (5, 1, 5, 2, 2, 1, 5.99, 'Cola', ''); -SET IDENTITY_INSERT ORDERPOSITION OFF - -SET IDENTITY_INSERT BILL ON -INSERT INTO BILL (id, modificationCounter, payed, total, tip) VALUES (1, 1, 1, 14.98, 1.3); -INSERT INTO BILL (id, modificationCounter, payed, total,tip) VALUES (2, 1, 1, 14.98, 1.4); -INSERT INTO BILL (id, modificationCounter, payed, total,tip) VALUES (3, 1, 1, 15.98, 1.5); -SET IDENTITY_INSERT BILL OFF - -SET IDENTITY_INSERT BILLORDERPOSITION ON -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (1,1); -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (1,2); -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (2,3); -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (2,4); -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (2,3); -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (2,4); -SET IDENTITY_INSERT BILLORDERPOSITION OFF \ No newline at end of file diff --git a/samples/core/src/test/resources/BillExportJobTest/setup/db/V9901_1__Import_data_MYSQL.sql.mysql b/samples/core/src/test/resources/BillExportJobTest/setup/db/V9901_1__Import_data_MYSQL.sql.mysql deleted file mode 100644 index b7f7955fe..000000000 --- a/samples/core/src/test/resources/BillExportJobTest/setup/db/V9901_1__Import_data_MYSQL.sql.mysql +++ /dev/null @@ -1,48 +0,0 @@ --- Rename this file to V9901_1__Import_data_MYSQL.sql.mysql if the database used is not MariaDB 10.0.27 - -INSERT INTO RESTAURANTTABLE (id, modificationCounter, number, state) VALUES (101, 1, 1, 2); -INSERT INTO RESTAURANTTABLE (id, modificationCounter, number, state) VALUES (102, 1, 2, 0); -INSERT INTO RESTAURANTTABLE (id, modificationCounter, number, state) VALUES (103, 1, 3, 0); -INSERT INTO RESTAURANTTABLE (id, modificationCounter, number, state) VALUES (104, 1, 4, 0); -INSERT INTO RESTAURANTTABLE (id, modificationCounter, number, state) VALUES (105, 1, 5, 0); - -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (1, 1, 'Meal', 'Schnitzel'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (2, 1, 'Meal', 'Goulasch'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (3, 1, 'Meal', 'Pfifferlinge'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (4, 1, 'Meal', 'Salat'); - -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (5, 1, 'SideDish', 'Pommes'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (6, 1, 'SideDish', 'Reis'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (7, 1, 'SideDish', 'Brot'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (8, 1, 'SideDish', 'Knödel'); - -INSERT INTO PRODUCT (id, modificationCounter, alcoholic, dType, description) VALUES (9, 1, false, 'Drink', 'Wasser'); -INSERT INTO PRODUCT (id, modificationCounter, alcoholic, dType, description) VALUES (10, 1, false, 'Drink', 'Cola'); -INSERT INTO PRODUCT (id, modificationCounter, alcoholic, dType, description) VALUES (11, 1, false, 'Drink', 'Bier'); -INSERT INTO PRODUCT (id, modificationCounter, alcoholic, dType, description) VALUES (12, 1, false, 'Drink', 'Wein / Apfelwein'); - -INSERT INTO OFFER (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (1, 1, 0, 6.99, 1, 7, 10, 'Schnitzel-Menü', 'Description of Schnitzel-Menü'); -INSERT INTO OFFER (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (2, 1, 0, 7.99, 2, 8, 11, 'Goulasch-Menü', 'Description of Goulasch-Menü'); -INSERT INTO OFFER (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (3, 1, 0, 8.99, 3, 10, 12, 'Pfifferlinge-Menü', 'Description of Pfifferlinge-Menü'); -INSERT INTO OFFER (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (4, 1, 0, 5.99, 4, 9, 9, 'Salat-Menü', 'Description of Salat-Menü'); -INSERT INTO OFFER (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (5, 1, 0, 1.20, null, null, 10, 'Cola', 'Description of Salat-Menü'); - -INSERT INTO RESTAURANTORDER (id, modificationCounter, tableId, state) VALUES (1, 1, 101, 1); - -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (1, 1, 1, 2, 2, 1, 6.99, 'Schnitzel-Menü', 'mit Ketschup'); -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (2, 1, 2, 2, 2, 1, 7.99, 'Goulasch-Menü', ''); -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (3, 1, 3, 2, 2, 1, 8.99, 'Pfifferlinge-Menü',''); -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (4, 1, 4, 2, 2, 1, 5.99, 'Salat-Menü', ''); -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (5, 1, 5, 2, 2, 1, 5.99, 'Cola', ''); - -INSERT INTO BILL (id, modificationCounter, payed, total, tip) VALUES (1, 1, true, 14.98, 1.3); -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (1,1); -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (1,2); - -INSERT INTO BILL (id, modificationCounter, payed, total,tip) VALUES (2, 1, true, 14.98, 1.4); -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (2,3); -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (2,4); - -INSERT INTO BILL (id, modificationCounter, payed, total,tip) VALUES (3, 1, true, 15.98, 1.5); -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (2,3); -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (2,4); \ No newline at end of file diff --git a/samples/core/src/test/resources/BillExportJobTest/setup/db/V9901_1__Import_data_ORCL.sql.orcl b/samples/core/src/test/resources/BillExportJobTest/setup/db/V9901_1__Import_data_ORCL.sql.orcl deleted file mode 100644 index 9fa511c73..000000000 --- a/samples/core/src/test/resources/BillExportJobTest/setup/db/V9901_1__Import_data_ORCL.sql.orcl +++ /dev/null @@ -1,48 +0,0 @@ ---Rename this file to V9901_1__Import_data_ORCL.sql.orcl if the database used is not Oracle 11g - -INSERT INTO RESTAURANTTABLE (id, modificationCounter, "number", state) VALUES (101, 1, 1, 2); -INSERT INTO RESTAURANTTABLE (id, modificationCounter, "number", state) VALUES (102, 1, 2, 0); -INSERT INTO RESTAURANTTABLE (id, modificationCounter, "number", state) VALUES (103, 1, 3, 0); -INSERT INTO RESTAURANTTABLE (id, modificationCounter, "number", state) VALUES (104, 1, 4, 0); -INSERT INTO RESTAURANTTABLE (id, modificationCounter, "number", state) VALUES (105, 1, 5, 0); - -INSERT INTO PRODUCT (id, modificationCounter, dtype, description) VALUES (1, 1, 'Meal', 'Schnitzel'); -INSERT INTO PRODUCT (id, modificationCounter, dtype, description) VALUES (2, 1, 'Meal', 'Goulasch'); -INSERT INTO PRODUCT (id, modificationCounter, dtype, description) VALUES (3, 1, 'Meal', 'Pfifferlinge'); -INSERT INTO PRODUCT (id, modificationCounter, dtype, description) VALUES (4, 1, 'Meal', 'Salat'); - -INSERT INTO PRODUCT (id, modificationCounter, dtype, description) VALUES (5, 1, 'SideDish', 'Pommes'); -INSERT INTO PRODUCT (id, modificationCounter, dtype, description) VALUES (6, 1, 'SideDish', 'Reis'); -INSERT INTO PRODUCT (id, modificationCounter, dtype, description) VALUES (7, 1, 'SideDish', 'Brot'); -INSERT INTO PRODUCT (id, modificationCounter, dtype, description) VALUES (8, 1, 'SideDish', 'Knödel'); - -INSERT INTO PRODUCT (id, modificationCounter, dtype, description, alcoholic) VALUES (9, 1, 'Drink', 'Wasser', 0); -INSERT INTO PRODUCT (id, modificationCounter, dtype, description, alcoholic) VALUES (10, 1, 'Drink', 'Cola', 0); -INSERT INTO PRODUCT (id, modificationCounter, dtype, description, alcoholic) VALUES (11, 1, 'Drink', 'Bier', 0); -INSERT INTO PRODUCT (id, modificationCounter, dtype, description, alcoholic) VALUES (12, 1, 'Drink', 'Wein / Apfelwein', 0); - -INSERT INTO OFFER (id, modificationCounter, name, description, state, mealId, sideDishId, drinkId, price) VALUES (1, 1, 'Schnitzel-Menü', 'Description of Schnitzel-Menü', 0, 1, 5, 10, 6.99); -INSERT INTO OFFER (id, modificationCounter, name, description, state, mealId, sideDishId, drinkId, price) VALUES (2, 1, 'Goulasch-Menü', 'Description of Goulasch-Menü', 0, 2, 6, 11, 7.99); -INSERT INTO OFFER (id, modificationCounter, name, description, state, mealId, sideDishId, drinkId, price) VALUES (3, 1, 'Pfifferlinge-Menü', 'Description of Pfifferlinge-Menü', 0, 3, 8, 12, 8.99); -INSERT INTO OFFER (id, modificationCounter, name, description, state, mealId, sideDishId, drinkId, price) VALUES (4, 1, 'Salat-Menü', 'Description of Salat-Menü', 0, 4, 7, 9, 5.99); -INSERT INTO OFFER (id, modificationCounter, name, description, state, mealId, sideDishId, drinkId, price) VALUES (5, 1, 'Cola', 'Description of Cola-Menü', 0, null, null, 10, 1.20); - -INSERT INTO RESTAURANTORDER (id, modificationCounter, tableId, state) VALUES (1, 1, 101, 1); - -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, offername, "comment", state, drinkState, orderId, price) VALUES (1, 1, 1, 'Schnitzel-Menü', 'mit Ketschup', 2, 2, 1, 6.99); -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, offername, "comment", state, drinkState, orderId, price) VALUES (2, 1, 2, 'Goulasch-Menü', '', 2, 2, 1, 7.99); -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, offername, "comment", state, drinkState, orderId, price) VALUES (3, 1, 3, 'Pfifferlinge-Menü','', 2, 2, 1, 8.99); -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, offername, "comment", state, drinkState, orderId, price) VALUES (4, 1, 4, 'Salat-Menü', '', 2, 2, 1, 5.99); -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, offername, "comment", state, drinkState, orderId, price) VALUES (5, 1, 5, 'Cola', '', 2, 2, 1, 5.99); - -INSERT INTO BILL (id, modificationCounter, payed, total, tip) VALUES (1, 1, 1, 14.98, 1.3); -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (1,1); -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (1,2); - -INSERT INTO BILL (id, modificationCounter, payed, total,tip) VALUES (2, 1, 1, 14.98, 1.4); -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (2,3); -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (2,4); - -INSERT INTO BILL (id, modificationCounter, payed, total,tip) VALUES (3, 1, 1, 15.98, 1.5); -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (2,3); -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (2,4); \ No newline at end of file diff --git a/samples/core/src/test/resources/BillExportJobTest/setup/db/V9901_1__Import_data_pg.sql.pg b/samples/core/src/test/resources/BillExportJobTest/setup/db/V9901_1__Import_data_pg.sql.pg deleted file mode 100644 index 509c9a1c3..000000000 --- a/samples/core/src/test/resources/BillExportJobTest/setup/db/V9901_1__Import_data_pg.sql.pg +++ /dev/null @@ -1,49 +0,0 @@ ---Rename this file to V9001_1__Delete_data_pg.sql.pg if the database used is not PostGres - -INSERT INTO RESTAURANTTABLE (id, modificationCounter, number, state) VALUES (101, 1, 1, 2); -INSERT INTO RESTAURANTTABLE (id, modificationCounter, number, state) VALUES (102, 1, 2, 0); -INSERT INTO RESTAURANTTABLE (id, modificationCounter, number, state) VALUES (103, 1, 3, 0); -INSERT INTO RESTAURANTTABLE (id, modificationCounter, number, state) VALUES (104, 1, 4, 0); -INSERT INTO RESTAURANTTABLE (id, modificationCounter, number, state) VALUES (105, 1, 5, 0); - -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (1, 1, 'Meal', 'Schnitzel'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (2, 1, 'Meal', 'Goulasch'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (3, 1, 'Meal', 'Pfifferlinge'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (4, 1, 'Meal', 'Salat'); - -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (5, 1, 'SideDish', 'Pommes'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (6, 1, 'SideDish', 'Reis'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (7, 1, 'SideDish', 'Brot'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (8, 1, 'SideDish', 'Knödel'); - -INSERT INTO PRODUCT (id, modificationCounter, alcoholic, dType, description) VALUES (9, 1, false, 'Drink', 'Wasser'); -INSERT INTO PRODUCT (id, modificationCounter, alcoholic, dType, description) VALUES (10, 1, false, 'Drink', 'Cola'); -INSERT INTO PRODUCT (id, modificationCounter, alcoholic, dType, description) VALUES (11, 1, false, 'Drink', 'Bier'); -INSERT INTO PRODUCT (id, modificationCounter, alcoholic, dType, description) VALUES (12, 1, false, 'Drink', 'Wein / Apfelwein'); - -INSERT INTO OFFER (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (1, 1, 0, 6.99, 1, 7, 10, 'Schnitzel-Menü', 'Description of Schnitzel-Menü'); -INSERT INTO OFFER (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (2, 1, 0, 7.99, 2, 8, 11, 'Goulasch-Menü', 'Description of Goulasch-Menü'); -INSERT INTO OFFER (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (3, 1, 0, 8.99, 3, 10, 12, 'Pfifferlinge-Menü', 'Description of Pfifferlinge-Menü'); -INSERT INTO OFFER (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (4, 1, 0, 5.99, 4, 9, 9, 'Salat-Menü', 'Description of Salat-Menü'); -INSERT INTO OFFER (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (5, 1, 0, 1.20, null, null, 10, 'Cola', 'Description of Salat-Menü'); - -INSERT INTO RESTAURANTORDER (id, modificationCounter, tableId, state) VALUES (1, 1, 101, 1); - -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (1, 1, 1, 2, 2, 1, 6.99, 'Schnitzel-Menü', 'mit Ketschup'); -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (2, 1, 2, 2, 2, 1, 7.99, 'Goulasch-Menü', ''); -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (3, 1, 3, 2, 2, 1, 8.99, 'Pfifferlinge-Menü',''); -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (4, 1, 4, 2, 2, 1, 5.99, 'Salat-Menü', ''); -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (5, 1, 5, 2, 2, 1, 5.99, 'Cola', ''); - -INSERT INTO BILL (id, modificationCounter, payed, total, tip) VALUES (1, 1, true, 14.98, 1.3); - -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (1,1); -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (1,2); - -INSERT INTO BILL (id, modificationCounter, payed, total,tip) VALUES (2, 1, true, 14.98, 1.4); -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (2,3); -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (2,4); - -INSERT INTO BILL (id, modificationCounter, payed, total,tip) VALUES (3, 1, true, 15.98, 1.5); -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (2,3); -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (2,4); \ No newline at end of file diff --git a/samples/core/src/test/resources/ProductImportJobTest/data/drinks.csv b/samples/core/src/test/resources/ProductImportJobTest/data/drinks.csv deleted file mode 100644 index 5870f32c7..000000000 --- a/samples/core/src/test/resources/ProductImportJobTest/data/drinks.csv +++ /dev/null @@ -1,3 +0,0 @@ -Heineken, Pretty good beer, 1, true -Dilmah, Very tasty black tea, 2, false -Pepsi, Nice drink, 3, false diff --git a/samples/core/src/test/resources/ProductImportJobTest/data/meals.csv b/samples/core/src/test/resources/ProductImportJobTest/data/meals.csv deleted file mode 100644 index 914d8717a..000000000 --- a/samples/core/src/test/resources/ProductImportJobTest/data/meals.csv +++ /dev/null @@ -1,4 +0,0 @@ -Bratwurst, Tasty sausage, 1 -Hamburger, Big bun with meat, 2 -Tofu, Food made from soy milk, 3 -Pierogi, Very good filled dumplings, 4 diff --git a/samples/core/src/test/resources/config/application.properties b/samples/core/src/test/resources/config/application.properties deleted file mode 100644 index 30fd62fb1..000000000 --- a/samples/core/src/test/resources/config/application.properties +++ /dev/null @@ -1,38 +0,0 @@ -# https://docs.spring.io/spring-boot/docs/current/reference/html/howto-embedded-servlet-containers.html#howto-user-a-random-unassigned-http-port -server.port=0 -#Comment the following line in the case of database other than in-memory database H2 -spring.profiles.active=junit - -#UnComment the following line in the case of MS SQL Server 2008 database -#spring.profiles.active=junit,mssql - -#UnComment the following line in the case of Oracle 11g database -#spring.profiles.active=junit,orcl - -#UnComment the following line in the case of PostGres 9.5.4 database -#spring.profiles.active=junit,postgres - -#UnComment the following profile 'mysql' if the database used is MariaDB 10.0.27 -#spring.profiles.active=junit,mysql - -# Flyway for Database Setup and Migrations -flyway.enabled=true -flyway.clean-on-validation-error=true -flyway.validate-on-migrate=false -#flyway.baseline-on-migrate=true - -#the following line configures both src/test/resources and src/main/resources as locations for migration scripts -#flyway.locations=db/migration,AllTests/setup/db - -# Flyway for setting up testdata in database -database.migration.auto=false -database.migration.testdata=false -database.migration.clean=false - - -#UnComment the following profile 'mysql' if the database used is MariaDB 10.0.27 -#spring.profiles.active=junit,mysql - -# Service configuration -service.client.app.restaurant.auth=basic -service.client.app.restaurant.host=localhost \ No newline at end of file diff --git a/samples/core/src/test/resources/db/tablemanagement/V0001__R001_Create_schema.sql b/samples/core/src/test/resources/db/tablemanagement/V0001__R001_Create_schema.sql deleted file mode 100644 index fba30a272..000000000 --- a/samples/core/src/test/resources/db/tablemanagement/V0001__R001_Create_schema.sql +++ /dev/null @@ -1,137 +0,0 @@ --- This is the SQL script for setting up the DDL for the h2 database --- In a typical project you would only distinguish between main and test for flyway SQLs --- However, in this sample application we provde support for multiple databases in parallel --- You can simply choose the DB of your choice by setting spring.profiles.active=XXX in config/application.properties --- Assuming that the preconfigured user exists with according credentials using the included SQLs - -CREATE SEQUENCE HIBERNATE_SEQUENCE START WITH 1000000; - --- *** Staffmemeber *** -CREATE TABLE StaffMember( - id BIGINT NOT NULL AUTO_INCREMENT, - modificationCounter INTEGER NOT NULL, - firstname VARCHAR(255), - lastname VARCHAR(255), - login VARCHAR(255), - role INTEGER, - CONSTRAINT PK_StaffMember PRIMARY KEY(id), - CONSTRAINT UC_StaffMember_login UNIQUE(login) -); - --- *** Product *** -CREATE TABLE Product( - dType VARCHAR(31) NOT NULL, - id BIGINT NOT NULL AUTO_INCREMENT, - modificationCounter INTEGER NOT NULL, - description VARCHAR(255), - name VARCHAR(255), - alcoholic BOOLEAN, - pictureId BIGINT, - CONSTRAINT PK_Product PRIMARY KEY(id) -); - -CREATE TABLE Product_AUD( - revType TINYINT, - description VARCHAR(255), - name VARCHAR(255), - pictureId BIGINT, - alcoholic BOOLEAN, - dType VARCHAR(31) NOT NULL, - id BIGINT NOT NULL, - rev BIGINT NOT NULL -); - --- *** Offer *** -CREATE TABLE Offer( - id BIGINT NOT NULL AUTO_INCREMENT, - modificationCounter INTEGER NOT NULL, - description VARCHAR(255), - name VARCHAR(255), - price DECIMAL(19, 2), - number BIGINT, - state INTEGER, - drinkId BIGINT, - mealId BIGINT, - sideDishId BIGINT, - CONSTRAINT PK_Offer PRIMARY KEY(id), - CONSTRAINT UC_Offer_name UNIQUE(name), - CONSTRAINT UC_Offer_number UNIQUE(number), - CONSTRAINT FK_Offer_sideDishId FOREIGN KEY(sideDishId) REFERENCES Product(id) NOCHECK, - CONSTRAINT FK_Offer_mealId FOREIGN KEY(mealId) REFERENCES Product(id) NOCHECK, - CONSTRAINT FK_Offer_drinkId FOREIGN KEY(drinkId) REFERENCES Product(id) NOCHECK - -); - --- *** RestaurantTable (Table is a reserved keyword in Oracle) *** -CREATE TABLE RestaurantTable( - id BIGINT NOT NULL AUTO_INCREMENT, - modificationCounter INTEGER NOT NULL, - number BIGINT NOT NULL CHECK (number >= 0), - state INTEGER, - waiterId BIGINT, - CONSTRAINT PK_RestaurantTable PRIMARY KEY(id), - CONSTRAINT UC_Table_number UNIQUE(number) - -); - --- *** RestaurantOrder (Order is a reserved keyword in Oracle) *** -CREATE TABLE RestaurantOrder( - id BIGINT NOT NULL AUTO_INCREMENT, - modificationCounter INTEGER NOT NULL, - state INTEGER, - tableId BIGINT NOT NULL, - CONSTRAINT PK_RestaurantOrder PRIMARY KEY(id) -); - --- *** OrderPosition *** -CREATE TABLE OrderPosition( - id BIGINT NOT NULL AUTO_INCREMENT, - modificationCounter INTEGER NOT NULL, - comment VARCHAR(255), - cookId BIGINT, - offerId BIGINT, - offerName VARCHAR(255), - price DECIMAL(19, 2), - state INTEGER, - drinkState INTEGER, - orderId BIGINT, - CONSTRAINT PK_OrderPosition PRIMARY KEY(id), - CONSTRAINT FK_OrderPosition_orderId FOREIGN KEY(orderId) REFERENCES RestaurantOrder(id) NOCHECK, - CONSTRAINT FK_OrderPosition_cookId FOREIGN KEY(cookId) REFERENCES StaffMember(id) NOCHECK - -); - --- *** Bill *** -CREATE TABLE Bill( - id BIGINT NOT NULL AUTO_INCREMENT, - modificationCounter INTEGER NOT NULL, - payed BOOLEAN NOT NULL, - tip DECIMAL(19, 2), - total DECIMAL(19, 2), - CONSTRAINT PK_Bill PRIMARY KEY(id) -); - -CREATE TABLE BillOrderPosition( - billId BIGINT NOT NULL AUTO_INCREMENT, - orderPositionsId BIGINT NOT NULL, - CONSTRAINT FK_BillOrderPosition_billId FOREIGN KEY(billId) REFERENCES Bill(id) NOCHECK, - CONSTRAINT FK_BillOrderPosition_orderPositionsId FOREIGN KEY(orderPositionsId) REFERENCES OrderPosition(id) NOCHECK -); - --- *** BinaryObject (BLOBs) *** -CREATE TABLE BinaryObject ( - id BIGINT NOT NULL AUTO_INCREMENT, - modificationCounter INTEGER NOT NULL, - data BLOB(2147483647), - size BIGINT NOT NULL, - mimeType VARCHAR(255), - PRIMARY KEY (ID) -); - --- *** RevInfo (Commit log for envers audit trail) *** -CREATE TABLE RevInfo( - id BIGINT NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1), - "timestamp" BIGINT NOT NULL, - userLogin VARCHAR(255) -); - diff --git a/samples/core/src/test/resources/db/tablemanagement/V0001__R001_Create_schema_MSSQL.sql.mssql b/samples/core/src/test/resources/db/tablemanagement/V0001__R001_Create_schema_MSSQL.sql.mssql deleted file mode 100644 index af9fa9168..000000000 --- a/samples/core/src/test/resources/db/tablemanagement/V0001__R001_Create_schema_MSSQL.sql.mssql +++ /dev/null @@ -1,136 +0,0 @@ ---Rename this file to V0001__R001_Create_schema_MSSQL.sql.mssql if the database used is not MS SQL Server 2008 - --- This is the SQL script for setting up the DDL for the MS SQL Server 2008 database --- In a typical project you would only distinguish between main and test for flyway SQLs --- However, in this sample application we provde support for multiple databases in parallel --- You can simply choose the DB of your choice by setting spring.profiles.active=XXX in config/application.properties --- Assuming that the preconfigured user exists with according credentials using the included SQLs - --- *** Staffmemeber *** - -CREATE TABLE STAFFMEMBER( - id BIGINT NOT NULL IDENTITY(0,1), - modificationCounter INTEGER NOT NULL, - firstname VARCHAR(255), - lastname VARCHAR(255), - login VARCHAR(255), - role INTEGER -); -ALTER TABLE STAFFMEMBER ADD CONSTRAINT PK_STAFFMEMEBER PRIMARY KEY(id); -ALTER TABLE STAFFMEMBER ADD CONSTRAINT UC_STAFFMEMBER_LOGIN UNIQUE(login); - --- *** Product *** -CREATE TABLE PRODUCT( - dType VARCHAR(31) NOT NULL, - id BIGINT NOT NULL IDENTITY(0,1), - modificationCounter INTEGER NOT NULL, - description VARCHAR(255), - name VARCHAR(255), - alcoholic BIT, - pictureId BIGINT -); -ALTER TABLE PRODUCT ADD CONSTRAINT PK_PRODUCT PRIMARY KEY(id); -CREATE TABLE PRODUCT_AUD( - revType TINYINT, - description VARCHAR(255), - name VARCHAR(255), - pictureId BIGINT, - alcoholic BIT, - dType VARCHAR(31) NOT NULL, - id BIGINT NOT NULL, - rev BIGINT NOT NULL -); - --- *** Offer *** -CREATE TABLE OFFER( - id BIGINT NOT NULL IDENTITY(0,1), - modificationCounter INTEGER NOT NULL, - description VARCHAR(255), - name VARCHAR(255), - price NUMERIC(19, 2), - number BIGINT, - state INTEGER, - drinkId BIGINT, - mealId BIGINT, - sideDishId BIGINT -); - -ALTER TABLE OFFER ADD CONSTRAINT PK_OFFER PRIMARY KEY(id); -ALTER TABLE OFFER ADD CONSTRAINT UC_OFFER_NAME UNIQUE(name); -ALTER TABLE OFFER ADD CONSTRAINT UC_OFFER_NUMBER UNIQUE(number); - -ALTER TABLE OFFER WITH NOCHECK ADD CONSTRAINT FK_OFFER2SIDEDISH FOREIGN KEY(sideDishId) REFERENCES PRODUCT(id) ; -ALTER TABLE OFFER WITH NOCHECK ADD CONSTRAINT FK_OFFER2MEAL FOREIGN KEY(mealId) REFERENCES PRODUCT(id) ; -ALTER TABLE OFFER WITH NOCHECK ADD CONSTRAINT FK_OFFER2DRINK FOREIGN KEY(drinkId) REFERENCES PRODUCT(id) ; - --- *** RestaurantTable (Table is a reserved keyword in Oracle) *** -CREATE TABLE RESTAURANTTABLE( - id BIGINT NOT NULL IDENTITY(101,1), - modificationCounter INTEGER NOT NULL, - number BIGINT NOT NULL CHECK (NUMBER >= 0), - state INTEGER, - waiterId BIGINT -); -ALTER TABLE RESTAURANTTABLE ADD CONSTRAINT PK_RESTAURANTTABLE PRIMARY KEY(id); -ALTER TABLE RESTAURANTTABLE ADD CONSTRAINT UC_TABLE_NUMBER UNIQUE(number); - --- *** RestaurantOrder (Order is a reserved keyword in Oracle) *** -CREATE TABLE RESTAURANTORDER( - id BIGINT NOT NULL IDENTITY(1,1), - modificationCounter INTEGER NOT NULL, - state INTEGER, - tableId BIGINT NOT NULL -); -ALTER TABLE RESTAURANTORDER ADD CONSTRAINT PK_RESTAURANTORDER PRIMARY KEY(id); - --- *** OrderPosition *** -CREATE TABLE ORDERPOSITION( - id BIGINT NOT NULL IDENTITY(1,1), - modificationCounter INTEGER NOT NULL, - comment VARCHAR(255), - cookId BIGINT, - offerId BIGINT, - offerName VARCHAR(255), - price NUMERIC(19, 2), - state INTEGER, - drinkState INTEGER, - orderId BIGINT -); -ALTER TABLE ORDERPOSITION ADD CONSTRAINT PK_ORDERPOSITON PRIMARY KEY(id); -ALTER TABLE ORDERPOSITION WITH NOCHECK ADD CONSTRAINT FK_ORDPOS2ORDER FOREIGN KEY(orderId) REFERENCES RESTAURANTORDER(id) ; -ALTER TABLE ORDERPOSITION WITH NOCHECK ADD CONSTRAINT FK_ORDPOS2COOK FOREIGN KEY(cookId) REFERENCES STAFFMEMBER(id); - --- *** Bill *** - -CREATE TABLE BILL( - id BIGINT NOT NULL IDENTITY(1,1), - modificationCounter INTEGER NOT NULL, - payed BIT NOT NULL, - tip NUMERIC(19, 2), - total NUMERIC(19, 2) -); -ALTER TABLE BILL ADD CONSTRAINT PK_BILL PRIMARY KEY(id); -CREATE TABLE BILLORDERPOSITION( - billId BIGINT NOT NULL IDENTITY(1,1), - orderPositionsId BIGINT NOT NULL -); -ALTER TABLE BILLORDERPOSITION WITH NOCHECK ADD CONSTRAINT FK_BILLORDPOS2BILL FOREIGN KEY(billId) REFERENCES BILL(id); -ALTER TABLE BILLORDERPOSITION WITH NOCHECK ADD CONSTRAINT FK_BILLORDPOS2ORDPOS FOREIGN KEY(orderPositionsId) REFERENCES ORDERPOSITION(id); - --- *** BinaryObject (BLOBs) *** - -CREATE TABLE BINARYOBJECT ( - id BIGINT NOT NULL IDENTITY(10,1), - modificationCounter INTEGER NOT NULL, - data varbinary(max), - size BIGINT NOT NULL, - mimeType VARCHAR(255), - PRIMARY KEY (ID) -); - --- *** RevInfo (Commit log for envers audit trail) *** - CREATE TABLE REVINFO( - id BIGINT NOT NULL IDENTITY(1,1), - timestamp BIGINT NOT NULL, - userLogin VARCHAR(255) -); \ No newline at end of file diff --git a/samples/core/src/test/resources/db/tablemanagement/V0001__R001_Create_schema_MYSQL.sql.mysql b/samples/core/src/test/resources/db/tablemanagement/V0001__R001_Create_schema_MYSQL.sql.mysql deleted file mode 100644 index 548704695..000000000 --- a/samples/core/src/test/resources/db/tablemanagement/V0001__R001_Create_schema_MYSQL.sql.mysql +++ /dev/null @@ -1,137 +0,0 @@ --- Rename this file to V0001__R001_Create_schema_MYSQL.sql.mysql if the database used is not MariaDB 10.0.27 - --- This is the SQL script for setting up the DDL for the h2 database --- In a typical project you would only distinguish between main and test for flyway SQLs --- However, in this sample application we provde support for multiple databases in parallel --- You can simply choose the DB of your choice by setting spring.profiles.active=XXX in config/application.properties --- Assuming that the preconfigured user exists with according credentials using the included SQLs - -USE RESTAURANT; - -SET FOREIGN_KEY_CHECKS = 0; - --- *** Staffmemeber *** -CREATE TABLE STAFFMEMBER( - id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, - modificationCounter INT NOT NULL, - firstname VARCHAR(255), - lastname VARCHAR(255), - login VARCHAR(255), - role INTEGER -); - -ALTER TABLE STAFFMEMBER ADD CONSTRAINT UC_STAFFMEMBER_LOGIN UNIQUE(login); - --- *** Product *** -CREATE TABLE PRODUCT( - id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, - dType VARCHAR(31) NOT NULL, - modificationCounter INT NOT NULL, - description VARCHAR(255), - name VARCHAR(255), - alcoholic BIT, - pictureId BIGINT -); - -CREATE TABLE PRODUCT_AUD( - revType TINYINT, - description VARCHAR(255), - name VARCHAR(255), - pictureId BIGINT, - alcoholic BIT, - dType VARCHAR(31) NOT NULL, - id BIGINT NOT NULL, - rev BIGINT NOT NULL -); - --- *** Offer *** -CREATE TABLE OFFER( - id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, - modificationCounter INT NOT NULL, - description VARCHAR(255), - name VARCHAR(255), - price DECIMAL(19, 2), - number BIGINT, - state INT, - drinkId BIGINT, - mealId BIGINT, - sideDishId BIGINT -); - -ALTER TABLE OFFER ADD CONSTRAINT UC_OFFER_NAME UNIQUE(name); -ALTER TABLE OFFER ADD CONSTRAINT UC_OFFER_NUMBER UNIQUE(number); - -ALTER TABLE OFFER ADD CONSTRAINT FK_OFFER2SIDEDISH FOREIGN KEY(sideDishId) REFERENCES PRODUCT(id); -ALTER TABLE OFFER ADD CONSTRAINT FK_OFFER2MEAL FOREIGN KEY(mealId) REFERENCES PRODUCT(id); -ALTER TABLE OFFER ADD CONSTRAINT FK_OFFER2DRINK FOREIGN KEY(drinkId) REFERENCES PRODUCT(id); - --- *** RestaurantTable (Table is a reserved keyword in Oracle) *** -CREATE TABLE RESTAURANTTABLE( - id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, - modificationCounter INT NOT NULL, - number BIGINT NOT NULL CHECK (NUMBER >= 0), - state INT, - waiterId BIGINT -); - -ALTER TABLE RESTAURANTTABLE ADD CONSTRAINT UC_TABLE_NUMBER UNIQUE(number); - --- *** RestaurantOrder (Order is a reserved keyword in Oracle) *** -CREATE TABLE RESTAURANTORDER( - id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, - modificationCounter INTEGER NOT NULL, - state INT, - tableId BIGINT NOT NULL -); - --- *** OrderPosition *** -CREATE TABLE ORDERPOSITION( - id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, - modificationCounter INT NOT NULL, - comment VARCHAR(255), - cookId BIGINT, - offerId BIGINT, - offerName VARCHAR(255), - price DECIMAL(19, 2), - state INT, - drinkState INT, - orderId BIGINT -); - -ALTER TABLE ORDERPOSITION ADD CONSTRAINT FK_ORDPOS2ORDER FOREIGN KEY(orderId) REFERENCES RESTAURANTORDER(id); -ALTER TABLE ORDERPOSITION ADD CONSTRAINT FK_ORDPOS2COOK FOREIGN KEY(cookId) REFERENCES STAFFMEMBER(id); - --- *** Bill *** -CREATE TABLE BILL( - id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, - modificationCounter INT NOT NULL, - payed BIT NOT NULL, - tip DECIMAL(19, 2), - total DECIMAL(19, 2) -); - -CREATE TABLE BILLORDERPOSITION( - billId BIGINT NOT NULL, - orderPositionsId BIGINT NOT NULL -); - -ALTER TABLE BILLORDERPOSITION ADD CONSTRAINT FK_BILLORDPOS2BILL FOREIGN KEY(billId) REFERENCES BILL(id); -ALTER TABLE BILLORDERPOSITION ADD CONSTRAINT FK_BILLORDPOS2ORDPOS FOREIGN KEY(orderPositionsId) REFERENCES ORDERPOSITION(id); - --- *** BinaryObject (BLOBs) *** -CREATE TABLE BINARYOBJECT ( - id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, - modificationCounter INT NOT NULL, - data LONGBLOB, - size BIGINT NOT NULL, - mimeType VARCHAR(255) -); - --- *** RevInfo (Commit log for envers audit trail) *** -CREATE TABLE REVINFO( - id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, - timestamp BIGINT NOT NULL, - userLogin VARCHAR(255) -); - -SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/samples/core/src/test/resources/db/tablemanagement/V0001__R001_Create_schema_ORCL.sql.orcl b/samples/core/src/test/resources/db/tablemanagement/V0001__R001_Create_schema_ORCL.sql.orcl deleted file mode 100644 index 2dd0ac383..000000000 --- a/samples/core/src/test/resources/db/tablemanagement/V0001__R001_Create_schema_ORCL.sql.orcl +++ /dev/null @@ -1,136 +0,0 @@ ---Rename this file to V0001__R001_Create_schema_ORCL.sql.orcl if the database used is not Oracle 11g - --- This is the SQL script for setting up the DDL for the h2 database --- In a typical project you would only distinguish between main and test for flyway SQLs --- However, in this sample application we provde support for multiple databases in parallel --- You can simply choose the DB of your choice by setting spring.profiles.active=XXX in config/application.properties --- Assuming that the preconfigured user exists with according credentials using the included SQLs - -CREATE SEQUENCE HIBERNATE_SEQUENCE START WITH 1000000; - --- *** Staffmemeber *** -CREATE TABLE STAFFMEMBER( - id NUMBER(19), - modificationCounter INTEGER NOT NULL, - firstname VARCHAR(255), - lastname VARCHAR(255), - login VARCHAR(255), - role INTEGER -); - -ALTER TABLE STAFFMEMBER ADD CONSTRAINT PK_STAFFMEMEBER PRIMARY KEY(id); -ALTER TABLE STAFFMEMBER ADD CONSTRAINT UC_STAFFMEMBER_LOGIN UNIQUE(login); - --- *** Product *** -CREATE TABLE PRODUCT( - dtype VARCHAR(31) NOT NULL, - id NUMBER(19), - modificationCounter INTEGER NOT NULL, - description VARCHAR(255), - name VARCHAR(255), - alcoholic NUMBER(1,0), - pictureId NUMBER(19) -); - -ALTER TABLE PRODUCT ADD CONSTRAINT PK_PRODUCT PRIMARY KEY(id); -CREATE TABLE PRODUCT_AUD( - revtype NUMBER(3), - description VARCHAR(255), - name VARCHAR(255), - pictureId NUMBER(19), - alcoholic NUMBER(1,0), - dtype VARCHAR(31) NOT NULL, - id NUMBER(19) NOT NULL, - rev NUMBER(19) NOT NULL -); --- *** Offer *** -CREATE TABLE OFFER( - id NUMBER(19), - modificationCounter INTEGER NOT NULL, - description VARCHAR(255), - name VARCHAR(255), - price DECIMAL(19, 3), - "number" NUMBER(19), - state INTEGER, - drinkId NUMBER(19), - mealId NUMBER(19), - sideDishId NUMBER(19) -); -ALTER TABLE OFFER ADD CONSTRAINT PK_OFFER PRIMARY KEY(id); -ALTER TABLE OFFER ADD CONSTRAINT UC_OFFER_NAME UNIQUE(name); -ALTER TABLE OFFER ADD CONSTRAINT UC_OFFER_NUMBER UNIQUE("number"); -ALTER TABLE OFFER ADD CONSTRAINT FK_OFFER2SIDEDISH FOREIGN KEY(sideDishId) REFERENCES PRODUCT(id) ENABLE NOVALIDATE; -ALTER TABLE OFFER ADD CONSTRAINT FK_OFFER2MEAL FOREIGN KEY(mealId) REFERENCES PRODUCT(id) ENABLE NOVALIDATE; -ALTER TABLE OFFER ADD CONSTRAINT FK_OFFER2DRINK FOREIGN KEY(drinkId) REFERENCES PRODUCT(id) ENABLE NOVALIDATE; - --- *** RestaurantTable (Table is a reserved keyword in Oracle) *** -CREATE TABLE RESTAURANTTABLE( - id NUMBER(19), - modificationCounter INTEGER NOT NULL, - "number" NUMBER(19), --NOT NULL CHECK (NUMBER >= 0), - state INTEGER, - waiterId NUMBER(19) -); - -ALTER TABLE RESTAURANTTABLE ADD CONSTRAINT PK_RESTAURANTTABLE PRIMARY KEY(id); -ALTER TABLE RESTAURANTTABLE ADD CONSTRAINT UC_TABLE_NUMBER UNIQUE("number"); - --- *** RestaurantOrder (Order is a reserved keyword in Oracle) *** -CREATE TABLE RESTAURANTORDER( - id NUMBER(19), - modificationCounter INTEGER NOT NULL, - state INTEGER, - tableId NUMBER(19) NOT NULL -); -ALTER TABLE RESTAURANTORDER ADD CONSTRAINT PK_RESTAURANTORDER PRIMARY KEY(id); - --- *** OrderPosition *** -CREATE TABLE ORDERPOSITION( - id NUMBER(19), - modificationCounter INTEGER NOT NULL, - "comment" VARCHAR(255), - cookId NUMBER(19), - offerId NUMBER(19), - offerName VARCHAR(255), - price DECIMAL(19, 3), - state INTEGER, - drinkState INTEGER, - orderId NUMBER(19) -); -ALTER TABLE ORDERPOSITION ADD CONSTRAINT PK_ORDERPOSITON PRIMARY KEY(id); -ALTER TABLE ORDERPOSITION ADD CONSTRAINT FK_ORDPOS2ORDER FOREIGN KEY(orderId) REFERENCES RESTAURANTORDER(id) ENABLE NOVALIDATE; -ALTER TABLE ORDERPOSITION ADD CONSTRAINT FK_ORDPOS2COOK FOREIGN KEY(cookId) REFERENCES STAFFMEMBER(id) ENABLE NOVALIDATE; - --- *** Bill *** -CREATE TABLE BILL( - id NUMBER(19), - modificationCounter INTEGER NOT NULL, - --Changed type of the column payed from CHAR(1) to NUMBER(1,0) - payed NUMBER(1,0), - tip DECIMAL(19, 3), - total DECIMAL(19, 3) -); -ALTER TABLE BILL ADD CONSTRAINT PK_BILL PRIMARY KEY(id); -CREATE TABLE BILLORDERPOSITION( - billId NUMBER(19), - orderPositionsId NUMBER(19) NOT NULL -); -ALTER TABLE BILLORDERPOSITION ADD CONSTRAINT FK_BILLORDPOS2BILL FOREIGN KEY(billId) REFERENCES BILL(id) ENABLE NOVALIDATE; -ALTER TABLE BILLORDERPOSITION ADD CONSTRAINT FK_BILLORDPOS2ORDPOS FOREIGN KEY(orderPositionsId) REFERENCES ORDERPOSITION(id) ENABLE NOVALIDATE; - --- *** BinaryObject (BLOBs) *** -CREATE TABLE BINARYOBJECT ( - id NUMBER(19), - modificationCounter INTEGER NOT NULL, - data BLOB, - "SIZE" NUMBER(19) NOT NULL, - mimetype VARCHAR(255), - PRIMARY KEY (ID) -); - --- *** RevInfo (Commit log for envers audit trail) *** -CREATE TABLE REVINFO( - id NUMBER(19), - timestamp NUMBER(19) NOT NULL, - userLogin VARCHAR(255) -); \ No newline at end of file diff --git a/samples/core/src/test/resources/db/tablemanagement/V0001__R001_Create_schema_pg.sql.pg b/samples/core/src/test/resources/db/tablemanagement/V0001__R001_Create_schema_pg.sql.pg deleted file mode 100644 index f158142bb..000000000 --- a/samples/core/src/test/resources/db/tablemanagement/V0001__R001_Create_schema_pg.sql.pg +++ /dev/null @@ -1,137 +0,0 @@ ---Rename this file to V0001__R001_Create_schema_pg.sql.pg if the database used is not PostGres 9.5.4 - --- This is the SQL script for setting up the DDL for the PostGres database --- In a typical project you would only distinguish between main and test for flyway SQLs --- However, in this sample application we provde support for multiple databases in parallel --- You can simply choose the DB of your choice by setting spring.profiles.active=XXX in config/application.properties --- Assuming that the preconfigured user exists with according credentials using the included SQLs - -CREATE SEQUENCE HIBERNATE_SEQUENCE START WITH 1000000; - --- *** Staffmemeber *** -CREATE TABLE STAFFMEMBER( - id BIGSERIAL NOT NULL, - modificationCounter INTEGER NOT NULL, - firstname VARCHAR(255), - lastname VARCHAR(255), - login VARCHAR(255), - role INTEGER -); -ALTER TABLE STAFFMEMBER ADD CONSTRAINT PK_STAFFMEMEBER PRIMARY KEY(id); -ALTER TABLE STAFFMEMBER ADD CONSTRAINT UC_STAFFMEMBER_LOGIN UNIQUE(login); - --- *** Product *** -CREATE TABLE PRODUCT( - dType VARCHAR(31) NOT NULL, - id BIGSERIAL NOT NULL, - modificationCounter INTEGER NOT NULL, - description VARCHAR(255), - name VARCHAR(255), - alcoholic BOOLEAN, - pictureId BIGINT -); -ALTER TABLE PRODUCT ADD CONSTRAINT PK_PRODUCT PRIMARY KEY(id); -CREATE TABLE PRODUCT_AUD( - revtype smallint, - description VARCHAR(255), - name VARCHAR(255), - pictureId BIGINT, - alcoholic BOOLEAN, - dtype VARCHAR(31) NOT NULL, - id BIGINT NOT NULL, - rev BIGINT NOT NULL -); - --- *** Offer *** -CREATE TABLE OFFER( - id BIGSERIAL NOT NULL, - modificationCounter INTEGER NOT NULL, - description VARCHAR(255), - name VARCHAR(255), - price DECIMAL(19, 2), - number BIGINT, - state INTEGER, - drinkId BIGINT, - mealId BIGINT, - sideDishId BIGINT -); - -ALTER TABLE OFFER ADD CONSTRAINT PK_OFFER PRIMARY KEY(id); -ALTER TABLE OFFER ADD CONSTRAINT UC_OFFER_NAME UNIQUE(name); -ALTER TABLE OFFER ADD CONSTRAINT UC_OFFER_NUMBER UNIQUE(number); ---NO CHECK IS REMOVED FOR BELOW THREE ALTER STATEMENTS -ALTER TABLE OFFER ADD CONSTRAINT FK_OFFER2SIDEDISH FOREIGN KEY(sideDishId) REFERENCES PRODUCT(id) DEFERRABLE; -ALTER TABLE OFFER ADD CONSTRAINT FK_OFFER2MEAL FOREIGN KEY(mealId) REFERENCES PRODUCT(id) DEFERRABLE; -ALTER TABLE OFFER ADD CONSTRAINT FK_OFFER2DRINK FOREIGN KEY(drinkId) REFERENCES PRODUCT(id) DEFERRABLE; - --- *** RestaurantTable (Table is a reserved keyword in Oracle) *** -CREATE TABLE RESTAURANTTABLE( - id BIGSERIAL NOT NULL, - modificationCounter INTEGER NOT NULL, - number BIGINT NOT NULL CHECK (NUMBER >= 0), - state INTEGER, - waiterId BIGINT -); -ALTER TABLE RESTAURANTTABLE ADD CONSTRAINT PK_RESTAURANTTABLE PRIMARY KEY(id); -ALTER TABLE RESTAURANTTABLE ADD CONSTRAINT UC_TABLE_NUMBER UNIQUE(number); - --- *** RestaurantOrder (Order is a reserved keyword in Oracle) *** -CREATE TABLE RESTAURANTORDER( - id BIGSERIAL NOT NULL, - modificationCounter INTEGER NOT NULL, - state INTEGER, - tableId BIGINT NOT NULL -); -ALTER TABLE RESTAURANTORDER ADD CONSTRAINT PK_RESTAURANTORDER PRIMARY KEY(id); - --- *** OrderPosition *** -CREATE TABLE ORDERPOSITION( - id BIGSERIAL NOT NULL, - modificationCounter INTEGER NOT NULL, - comment VARCHAR(255), - cookId BIGINT, - offerId BIGINT, - offerName VARCHAR(255), - price DECIMAL(19, 2), - state INTEGER, - drinkState INTEGER, - orderId BIGINT -); - -ALTER TABLE ORDERPOSITION ADD CONSTRAINT PK_ORDERPOSITON PRIMARY KEY(id); -ALTER TABLE ORDERPOSITION ADD CONSTRAINT FK_ORDPOS2ORDER FOREIGN KEY(orderId) REFERENCES RESTAURANTORDER(id) ; -ALTER TABLE ORDERPOSITION ADD CONSTRAINT FK_ORDPOS2COOK FOREIGN KEY(cookId) REFERENCES STAFFMEMBER(id) ; - --- *** Bill *** -CREATE TABLE BILL( - id BIGSERIAL NOT NULL, - modificationCounter INTEGER NOT NULL, - payed BOOLEAN NOT NULL, - tip DECIMAL(19, 2), - total DECIMAL(19, 2) -); -ALTER TABLE BILL ADD CONSTRAINT PK_BILL PRIMARY KEY(id); -CREATE TABLE BILLORDERPOSITION( - billId BIGSERIAL NOT NULL, - orderPositionsId BIGINT NOT NULL -); - -ALTER TABLE BILLORDERPOSITION ADD CONSTRAINT FK_BILLORDPOS2BILL FOREIGN KEY(billId) REFERENCES BILL(id); -ALTER TABLE BILLORDERPOSITION ADD CONSTRAINT FK_BILLORDPOS2ORDPOS FOREIGN KEY(orderPositionsId) REFERENCES ORDERPOSITION(id); - --- *** BinaryObject (BLOBs) *** -CREATE TABLE BINARYOBJECT ( - id BIGSERIAL NOT NULL, - modificationCounter INTEGER NOT NULL, - data BYTEA, - size BIGINT NOT NULL, - mimeType VARCHAR(255), - PRIMARY KEY (ID) -); - --- *** RevInfo (Commit log for envers audit trail) *** -CREATE TABLE REVINFO( - id BIGINT NOT NULL, - timestamp BIGINT NOT NULL, - userLogin VARCHAR(255) -); \ No newline at end of file diff --git a/samples/core/src/test/resources/db/tablemanagement/V0002__R001_Master_data.sql b/samples/core/src/test/resources/db/tablemanagement/V0002__R001_Master_data.sql deleted file mode 100644 index 961859493..000000000 --- a/samples/core/src/test/resources/db/tablemanagement/V0002__R001_Master_data.sql +++ /dev/null @@ -1,53 +0,0 @@ -INSERT INTO RestaurantTable (id, modificationCounter, number, state) VALUES (101, 1, 1, 2); -INSERT INTO RestaurantTable (id, modificationCounter, number, state) VALUES (102, 1, 2, 0); -INSERT INTO RestaurantTable (id, modificationCounter, number, state) VALUES (103, 1, 3, 0); -INSERT INTO RestaurantTable (id, modificationCounter, number, state) VALUES (104, 1, 4, 0); -INSERT INTO RestaurantTable (id, modificationCounter, number, state) VALUES (105, 1, 5, 0); - -INSERT INTO Product (id, modificationCounter, dType, description) VALUES (1, 1, 'Meal', 'Schnitzel'); -INSERT INTO Product (id, modificationCounter, dType, description) VALUES (2, 1, 'Meal', 'Goulasch'); -INSERT INTO Product (id, modificationCounter, dType, description) VALUES (3, 1, 'Meal', 'Pfifferlinge'); -INSERT INTO Product (id, modificationCounter, dType, description) VALUES (4, 1, 'Meal', 'Salat'); -INSERT INTO Product (id, modificationCounter, dType, description) VALUES (5, 1, 'Meal', 'Pizza'); -INSERT INTO Product (id, modificationCounter, dType, description) VALUES (6, 1, 'Meal', 'Flammkuchen'); - -INSERT INTO Product (id, modificationCounter, dType, description) VALUES (7, 1, 'SideDish', 'Pommes'); -INSERT INTO Product (id, modificationCounter, dType, description) VALUES (8, 1, 'SideDish', 'Reis'); -INSERT INTO Product (id, modificationCounter, dType, description) VALUES (9, 1, 'SideDish', 'Brot'); -INSERT INTO Product (id, modificationCounter, dType, description) VALUES (10, 1, 'SideDish', 'Knödel'); - -INSERT INTO Product (id, modificationCounter, alcoholic, dType, description) VALUES (11, 1, false, 'Drink', 'Wasser'); -INSERT INTO Product (id, modificationCounter, alcoholic, dType, description) VALUES (12, 1, false, 'Drink', 'Cola'); -INSERT INTO Product (id, modificationCounter, alcoholic, dType, description) VALUES (13, 1, false, 'Drink', 'Bier'); -INSERT INTO Product (id, modificationCounter, alcoholic, dType, description) VALUES (14, 1, false, 'Drink', 'Wein / Apfelwein'); - -INSERT INTO Offer (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (1, 1, 0, 6.99, 1, 7, 12, 'Schnitzel-Menü', 'Description of Schnitzel-Menü'); -INSERT INTO Offer (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (2, 1, 0, 7.99, 2, 8, 13, 'Goulasch-Menü', 'Description of Goulasch-Menü'); -INSERT INTO Offer (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (3, 1, 0, 8.99, 3, 10, 14, 'Pfifferlinge-Menü', 'Description of Pfifferlinge-Menü'); -INSERT INTO Offer (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (4, 1, 0, 5.99, 4, 9, 11, 'Salat-Menü', 'Description of Salat-Menü'); -INSERT INTO Offer (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (5, 1, 0, 1.20, null, null, 12, 'Cola', 'Description of Salat-Menü'); -INSERT INTO Offer (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (6, 1, 0, 6.23, 5, null, 12, 'Pizza-Menü', 'Description of Pizza-Menü'); -INSERT INTO Offer (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (7, 1, 0, 5.99, 6, null, 12, 'Flammkuchen-Menü', 'Description of Flammkuchen-Menü'); - - -INSERT INTO RestaurantOrder (id, modificationCounter, tableId, state) VALUES (1, 1, 101, 1); - -INSERT INTO OrderPosition (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (1, 1, 1, 2, 2, 1, 6.99, 'Schnitzel-Menü', 'mit Ketschup'); -INSERT INTO OrderPosition (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (2, 1, 2, 2, 2, 1, 7.99, 'Goulasch-Menü', ''); -INSERT INTO OrderPosition (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (3, 1, 3, 2, 2, 1, 8.99, 'Pfifferlinge-Menü',''); -INSERT INTO OrderPosition (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (4, 1, 4, 2, 2, 1, 5.99, 'Salat-Menü', ''); -INSERT INTO OrderPosition (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (5, 1, 5, 2, 2, 1, 5.99, 'Cola', ''); - -INSERT INTO Bill (id, modificationCounter, payed, total, tip) VALUES (1, 1, true, 14.98, 1.3); -INSERT INTO BillOrderPosition (billId, orderPositionsId) VALUES (1,1); -INSERT INTO BillOrderPosition (billId, orderPositionsId) VALUES (1,2); - -INSERT INTO Bill (id, modificationCounter, payed, total,tip) VALUES (2, 1, true, 14.98, 1.4); -INSERT INTO BillOrderPosition (billId, orderPositionsId) VALUES (2,3); -INSERT INTO BillOrderPosition (billId, orderPositionsId) VALUES (2,4); - - -INSERT INTO StaffMember (id, modificationCounter, role, login, firstname, lastname) VALUES (0, 0, 3, 'chief', 'Charly', 'Chief'); -INSERT INTO StaffMember (id, modificationCounter, role, login, firstname, lastname) VALUES (1, 0, 0, 'cook', 'Carl', 'Cook'); -INSERT INTO StaffMember (id, modificationCounter, role, login, firstname, lastname) VALUES (2, 0, 1, 'waiter', 'Willy', 'Waiter'); -INSERT INTO StaffMember (id, modificationCounter, role, login, firstname, lastname) VALUES (3, 0, 2, 'barkeeper', 'Bianca', 'Barkeeper'); diff --git a/samples/core/src/test/resources/db/tablemanagement/V0002__R001_Master_data_MSSQL.sql.mssql b/samples/core/src/test/resources/db/tablemanagement/V0002__R001_Master_data_MSSQL.sql.mssql deleted file mode 100644 index 1b2a54000..000000000 --- a/samples/core/src/test/resources/db/tablemanagement/V0002__R001_Master_data_MSSQL.sql.mssql +++ /dev/null @@ -1,73 +0,0 @@ ---Rename this file to V0002__R001_Master_data_MSSQL.sql.mssql if the database used is not MS SQL Server 2008 -SET IDENTITY_INSERT RESTAURANTTABLE ON -INSERT INTO RESTAURANTTABLE (id, modificationCounter, number, state) VALUES (101, 1, 1, 2); -INSERT INTO RESTAURANTTABLE (id, modificationCounter, number, state) VALUES (102, 1, 2, 0); -INSERT INTO RESTAURANTTABLE (id, modificationCounter, number, state) VALUES (103, 1, 3, 0); -INSERT INTO RESTAURANTTABLE (id, modificationCounter, number, state) VALUES (104, 1, 4, 0); -INSERT INTO RESTAURANTTABLE (id, modificationCounter, number, state) VALUES (105, 1, 5, 0); -SET IDENTITY_INSERT RESTAURANTTABLE OFF - -SET IDENTITY_INSERT PRODUCT ON -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (1, 1, 'Meal', 'Schnitzel'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (2, 1, 'Meal', 'Goulasch'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (3, 1, 'Meal', 'Pfifferlinge'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (4, 1, 'Meal', 'Salat'); -INSERT INTO Product (id, modificationCounter, dType, description) VALUES (5, 1, 'Meal', 'Pizza'); -INSERT INTO Product (id, modificationCounter, dType, description) VALUES (6, 1, 'Meal', 'Flammkuchen'); - - - -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (7, 1, 'SideDish', 'Pommes'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (8, 1, 'SideDish', 'Reis'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (9, 1, 'SideDish', 'Brot'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (10, 1, 'SideDish', 'Knödel'); - -/* Changed FALSE to 0 for MS SQL Server 2008 in the below insert statements for the column 'alcoholic' */ -INSERT INTO PRODUCT (id, modificationCounter, alcoholic, dType, description) VALUES (11, 1, 0, 'Drink', 'Wasser'); -INSERT INTO PRODUCT (id, modificationCounter, alcoholic, dType, description) VALUES (12, 1, 0, 'Drink', 'Cola'); -INSERT INTO PRODUCT (id, modificationCounter, alcoholic, dType, description) VALUES (13, 1, 0, 'Drink', 'Bier'); -INSERT INTO PRODUCT (id, modificationCounter, alcoholic, dType, description) VALUES (14, 1, 0, 'Drink', 'Wein / Apfelwein'); -SET IDENTITY_INSERT PRODUCT OFF - -SET IDENTITY_INSERT OFFER ON -INSERT INTO OFFER (id, modificationCounter, number, state, price, mealId, sideDishId, drinkId, name, description) VALUES (1, 1, 1, 0, 6.99, 1, 7, 12, 'Schnitzel-Menü', 'Description of Schnitzel-Menü'); -INSERT INTO OFFER (id, modificationCounter, number, state, price, mealId, sideDishId, drinkId, name, description) VALUES (2, 1, 2, 0, 7.99, 2, 8, 13, 'Goulasch-Menü', 'Description of Goulasch-Menü'); -INSERT INTO OFFER (id, modificationCounter, number, state, price, mealId, sideDishId, drinkId, name, description) VALUES (3, 1, 3, 0, 8.99, 3, 10, 14, 'Pfifferlinge-Menü', 'Description of Pfifferlinge-Menü'); -INSERT INTO OFFER (id, modificationCounter, number, state, price, mealId, sideDishId, drinkId, name, description) VALUES (4, 1, 4, 0, 5.99, 4, 9, 11, 'Salat-Menü', 'Description of Salat-Menü'); -INSERT INTO OFFER (id, modificationCounter, number, state, price, mealId, sideDishId, drinkId, name, description) VALUES (5, 1, 5, 0, 1.20, null, null, 12, 'Cola', 'Description of Salat-Menü'); -INSERT INTO OFFER (id, modificationCounter, number, state, price, mealId, sideDishId, drinkId, name, description) VALUES (6, 1, 6, 0, 6.23, 5, null, 12, 'Pizza-Menü', 'Description of Pizza-Menü'); -INSERT INTO OFFER (id, modificationCounter, number, state, price, mealId, sideDishId, drinkId, name, description) VALUES (7, 1, 7, 0, 5.99, 6, null, 12, 'Flammkuchen-Menü', 'Description of Flammkuchen-Menü'); -SET IDENTITY_INSERT OFFER OFF - -SET IDENTITY_INSERT RESTAURANTORDER ON -INSERT INTO RESTAURANTORDER (id, modificationCounter, tableId, state) VALUES (1, 1, 101, 1); -SET IDENTITY_INSERT RESTAURANTORDER OFF - -SET IDENTITY_INSERT ORDERPOSITION ON -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (1, 1, 1, 2, 2, 1, 6.99, 'Schnitzel-Menü', 'mit Ketschup'); -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (2, 1, 2, 2, 2, 1, 7.99, 'Goulasch-Menü', ''); -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (3, 1, 3, 2, 2, 1, 8.99, 'Pfifferlinge-Menü',''); -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (4, 1, 4, 2, 2, 1, 5.99, 'Salat-Menü', ''); -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (5, 1, 5, 2, 2, 1, 5.99, 'Cola', ''); -SET IDENTITY_INSERT ORDERPOSITION OFF - -/*Changed the value of true to 1 in the below insert statement for the column 'payed' */ -SET IDENTITY_INSERT BILL ON -INSERT INTO BILL (id, modificationCounter, payed, total, tip) VALUES (1, 1, 1, 14.98, 1.3); -/*Changed the value of true to 1 in the below insert statement for the column 'payed' */ -INSERT INTO BILL (id, modificationCounter, payed, total,tip) VALUES (2, 1, 1, 14.98, 1.4); -SET IDENTITY_INSERT BILL OFF - -SET IDENTITY_INSERT BILLORDERPOSITION ON -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (1,1); -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (1,2); -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (2,3); -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (2,4); -SET IDENTITY_INSERT BILLORDERPOSITION OFF - -SET IDENTITY_INSERT STAFFMEMBER ON -INSERT INTO STAFFMEMBER (id, modificationCounter, role, login, firstname, lastname) VALUES (0, 0, 3, 'chief', 'Charly', 'Chief'); -INSERT INTO STAFFMEMBER (id, modificationCounter, role, login, firstname, lastname) VALUES (1, 0, 0, 'cook', 'Carl', 'Cook'); -INSERT INTO STAFFMEMBER (id, modificationCounter, role, login, firstname, lastname) VALUES (2, 0, 1, 'waiter', 'Willy', 'Waiter'); -INSERT INTO STAFFMEMBER (id, modificationCounter, role, login, firstname, lastname) VALUES (3, 0, 2, 'barkeeper', 'Bianca', 'Barkeeper'); -SET IDENTITY_INSERT STAFFMEMBER OFF \ No newline at end of file diff --git a/samples/core/src/test/resources/db/tablemanagement/V0002__R001_Master_data_MYSQL.sql.mysql b/samples/core/src/test/resources/db/tablemanagement/V0002__R001_Master_data_MYSQL.sql.mysql deleted file mode 100644 index f7ba9cb5a..000000000 --- a/samples/core/src/test/resources/db/tablemanagement/V0002__R001_Master_data_MYSQL.sql.mysql +++ /dev/null @@ -1,55 +0,0 @@ --- Rename this file to V0002__R001_Master_data_MYSQL.sql.mysql if the database used is not MariaDB 10.0.27 - -INSERT INTO RESTAURANTTABLE (id, modificationCounter, number, state) VALUES (101, 1, 1, 2); -INSERT INTO RESTAURANTTABLE (id, modificationCounter, number, state) VALUES (102, 1, 2, 0); -INSERT INTO RESTAURANTTABLE (id, modificationCounter, number, state) VALUES (103, 1, 3, 0); -INSERT INTO RESTAURANTTABLE (id, modificationCounter, number, state) VALUES (104, 1, 4, 0); -INSERT INTO RESTAURANTTABLE (id, modificationCounter, number, state) VALUES (105, 1, 5, 0); - -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (1, 1, 'Meal', 'Schnitzel'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (2, 1, 'Meal', 'Goulasch'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (3, 1, 'Meal', 'Pfifferlinge'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (4, 1, 'Meal', 'Salat'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (5, 1, 'Meal', 'Pizza'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (6, 1, 'Meal', 'Flammkuchen'); - -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (7, 1, 'SideDish', 'Pommes'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (8, 1, 'SideDish', 'Reis'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (9, 1, 'SideDish', 'Brot'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (10, 1, 'SideDish', 'Knödel'); - -INSERT INTO PRODUCT (id, modificationCounter, alcoholic, dType, description) VALUES (11, 1, false, 'Drink', 'Wasser'); -INSERT INTO PRODUCT (id, modificationCounter, alcoholic, dType, description) VALUES (12, 1, false, 'Drink', 'Cola'); -INSERT INTO PRODUCT (id, modificationCounter, alcoholic, dType, description) VALUES (13, 1, false, 'Drink', 'Bier'); -INSERT INTO PRODUCT (id, modificationCounter, alcoholic, dType, description) VALUES (14, 1, false, 'Drink', 'Wein / Apfelwein'); - -INSERT INTO OFFER (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (1, 1, 0, 6.99, 1, 7, 12, 'Schnitzel-Menü', 'Description of Schnitzel-Menü'); -INSERT INTO OFFER (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (2, 1, 0, 7.99, 2, 8, 13, 'Goulasch-Menü', 'Description of Goulasch-Menü'); -INSERT INTO OFFER (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (3, 1, 0, 8.99, 3, 10, 14, 'Pfifferlinge-Menü', 'Description of Pfifferlinge-Menü'); -INSERT INTO OFFER (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (4, 1, 0, 5.99, 4, 9, 11, 'Salat-Menü', 'Description of Salat-Menü'); -INSERT INTO OFFER (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (5, 1, 0, 1.20, null, null, 12, 'Cola', 'Description of Salat-Menü'); -INSERT INTO OFFER (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (6, 1, 0, 6.23, 5, null, 12, 'Pizza-Menü', 'Description of Pizza-Menü'); -INSERT INTO OFFER (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (7, 1, 0, 5.99, 6, null, 12, 'Flammkuchen-Menü', 'Description of Flammkuchen-Menü'); - - -INSERT INTO RESTAURANTORDER (id, modificationCounter, tableId, state) VALUES (1, 1, 101, 1); - -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (1, 1, 1, 2, 2, 1, 6.99, 'Schnitzel-Menü', 'mit Ketschup'); -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (2, 1, 2, 2, 2, 1, 7.99, 'Goulasch-Menü', ''); -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (3, 1, 3, 2, 2, 1, 8.99, 'Pfifferlinge-Menü',''); -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (4, 1, 4, 2, 2, 1, 5.99, 'Salat-Menü', ''); -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (5, 1, 5, 2, 2, 1, 5.99, 'Cola', ''); - -INSERT INTO BILL (id, modificationCounter, payed, total, tip) VALUES (1, 1, true, 14.98, 1.3); -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (1,1); -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (1,2); - -INSERT INTO BILL (id, modificationCounter, payed, total,tip) VALUES (2, 1, true, 14.98, 1.4); -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (2,3); -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (2,4); - - -INSERT INTO STAFFMEMBER (id, modificationCounter, role, login, firstname, lastname) VALUES (1, 0, 3, 'chief', 'Charly', 'Chief'); -INSERT INTO STAFFMEMBER (id, modificationCounter, role, login, firstname, lastname) VALUES (2, 0, 0, 'cook', 'Carl', 'Cook'); -INSERT INTO STAFFMEMBER (id, modificationCounter, role, login, firstname, lastname) VALUES (3, 0, 1, 'waiter', 'Willy', 'Waiter'); -INSERT INTO STAFFMEMBER (id, modificationCounter, role, login, firstname, lastname) VALUES (4, 0, 2, 'barkeeper', 'Bianca', 'Barkeeper'); diff --git a/samples/core/src/test/resources/db/tablemanagement/V0002__R001_Master_data_ORCL.sql.orcl b/samples/core/src/test/resources/db/tablemanagement/V0002__R001_Master_data_ORCL.sql.orcl deleted file mode 100644 index cb711b6a3..000000000 --- a/samples/core/src/test/resources/db/tablemanagement/V0002__R001_Master_data_ORCL.sql.orcl +++ /dev/null @@ -1,49 +0,0 @@ ---Rename this file to V0002__R001_Master_data_ORCL.sql.orcl if the database used is not Oracle 11g - -INSERT INTO RESTAURANTTABLE (id, modificationCounter, "number", state) VALUES (101, 1, 1, 2); -INSERT INTO RESTAURANTTABLE (id, modificationCounter, "number", state) VALUES (102, 1, 2, 0); -INSERT INTO RESTAURANTTABLE (id, modificationCounter, "number", state) VALUES (103, 1, 3, 0); -INSERT INTO RESTAURANTTABLE (id, modificationCounter, "number", state) VALUES (104, 1, 4, 0); -INSERT INTO RESTAURANTTABLE (id, modificationCounter, "number", state) VALUES (105, 1, 5, 0); - -INSERT INTO PRODUCT (id, modificationCounter, dtype, description) VALUES (1, 1, 'Meal', 'Schnitzel'); -INSERT INTO PRODUCT (id, modificationCounter, dtype, description) VALUES (2, 1, 'Meal', 'Goulasch'); -INSERT INTO PRODUCT (id, modificationCounter, dtype, description) VALUES (3, 1, 'Meal', 'Pfifferlinge'); -INSERT INTO PRODUCT (id, modificationCounter, dtype, description) VALUES (4, 1, 'Meal', 'Salat'); - -INSERT INTO PRODUCT (id, modificationCounter, dtype, description) VALUES (5, 1, 'SideDish', 'Pommes'); -INSERT INTO PRODUCT (id, modificationCounter, dtype, description) VALUES (6, 1, 'SideDish', 'Reis'); -INSERT INTO PRODUCT (id, modificationCounter, dtype, description) VALUES (7, 1, 'SideDish', 'Brot'); -INSERT INTO PRODUCT (id, modificationCounter, dtype, description) VALUES (8, 1, 'SideDish', 'Knödel'); - -INSERT INTO PRODUCT (id, modificationCounter, dtype, description, alcoholic) VALUES (9, 1, 'Drink', 'Wasser', 0); -INSERT INTO PRODUCT (id, modificationCounter, dtype, description, alcoholic) VALUES (10, 1, 'Drink', 'Cola', 0); -INSERT INTO PRODUCT (id, modificationCounter, dtype, description, alcoholic) VALUES (11, 1, 'Drink', 'Bier', 0); -INSERT INTO PRODUCT (id, modificationCounter, dtype, description, alcoholic) VALUES (12, 1, 'Drink', 'Wein / Apfelwein', 0); - -INSERT INTO OFFER (id, modificationCounter, name, description, state, mealId, sideDishId, drinkId, price) VALUES (1, 1, 'Schnitzel-Menü', 'Description of Schnitzel-Menü', 0, 1, 5, 10, 6.99); -INSERT INTO OFFER (id, modificationCounter, name, description, state, mealId, sideDishId, drinkId, price) VALUES (2, 1, 'Goulasch-Menü', 'Description of Goulasch-Menü', 0, 2, 6, 11, 7.99); -INSERT INTO OFFER (id, modificationCounter, name, description, state, mealId, sideDishId, drinkId, price) VALUES (3, 1, 'Pfifferlinge-Menü', 'Description of Pfifferlinge-Menü', 0, 3, 8, 12, 8.99); -INSERT INTO OFFER (id, modificationCounter, name, description, state, mealId, sideDishId, drinkId, price) VALUES (4, 1, 'Salat-Menü', 'Description of Salat-Menü', 0, 4, 7, 9, 5.99); -INSERT INTO OFFER (id, modificationCounter, name, description, state, mealId, sideDishId, drinkId, price) VALUES (5, 1, 'Cola', 'Description of Salat-Menü', 0, null, null, 10, 1.20); - -INSERT INTO RESTAURANTORDER (id, modificationCounter, tableId, state) VALUES (1, 1, 101, 1); - -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, offername, "comment", state, drinkState, orderId, price) VALUES (1, 1, 1, 'Schnitzel-Menü', 'mit Ketschup', 2, 2, 1, 6.99); -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, offername, "comment", state, drinkState, orderId, price) VALUES (2, 1, 2, 'Goulasch-Menü', '', 2, 2, 1, 7.99); -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, offername, "comment", state, drinkState, orderId, price) VALUES (3, 1, 3, 'Pfifferlinge-Menü','', 2, 2, 1, 8.99); -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, offername, "comment", state, drinkState, orderId, price) VALUES (4, 1, 4, 'Salat-Menü', '', 2, 2, 1, 5.99); -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, offername, "comment", state, drinkState, orderId, price) VALUES (5, 1, 5, 'Cola', '', 2, 2, 1, 5.99); - -INSERT INTO BILL (id, modificationCounter, payed, total, tip) VALUES (1, 1, 1, 14.98, 1.30); -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (1,1); -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (1,2); - -INSERT INTO BILL (id, modificationCounter, payed, total,tip) VALUES (2, 1, 1, 14.98, 1.40); -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (2,3); -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (2,4); - -INSERT INTO STAFFMEMBER (id, login, role, firstname, lastname, modificationCounter) VALUES (0, 'chief', 3, 'Charly', 'Chief', 0); -INSERT INTO STAFFMEMBER (id, login, role, firstname, lastname, modificationCounter) VALUES (1, 'cook', 0, 'Carl', 'Cook', 0); -INSERT INTO STAFFMEMBER (id, login, role, firstname, lastname, modificationCounter) VALUES (2, 'waiter', 1, 'Willy', 'Waiter', 0); -INSERT INTO STAFFMEMBER (id, login, role, firstname, lastname, modificationCounter) VALUES (3, 'barkeeper', 2, 'Bianca', 'Barkeeper', 0); diff --git a/samples/core/src/test/resources/db/tablemanagement/V0002__R001_Master_data_pg.sql.pg b/samples/core/src/test/resources/db/tablemanagement/V0002__R001_Master_data_pg.sql.pg deleted file mode 100644 index bc7a64dd7..000000000 --- a/samples/core/src/test/resources/db/tablemanagement/V0002__R001_Master_data_pg.sql.pg +++ /dev/null @@ -1,49 +0,0 @@ ---Rename this file to V0002__R001_Master_data_pg.sql.pg if the database used is not PostGres 9.5.4 -INSERT INTO RESTAURANTTABLE (id, modificationCounter, number, state) VALUES (101, 1, 1, 2); -INSERT INTO RESTAURANTTABLE (id, modificationCounter, number, state) VALUES (102, 1, 2, 0); -INSERT INTO RESTAURANTTABLE (id, modificationCounter, number, state) VALUES (103, 1, 3, 0); -INSERT INTO RESTAURANTTABLE (id, modificationCounter, number, state) VALUES (104, 1, 4, 0); -INSERT INTO RESTAURANTTABLE (id, modificationCounter, number, state) VALUES (105, 1, 5, 0); - -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (1, 1, 'Meal', 'Schnitzel'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (2, 1, 'Meal', 'Goulasch'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (3, 1, 'Meal', 'Pfifferlinge'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (4, 1, 'Meal', 'Salat'); - -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (5, 1, 'SideDish', 'Pommes'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (6, 1, 'SideDish', 'Reis'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (7, 1, 'SideDish', 'Brot'); -INSERT INTO PRODUCT (id, modificationCounter, dType, description) VALUES (8, 1, 'SideDish', 'Knödel'); - -INSERT INTO PRODUCT (id, modificationCounter, alcoholic, dType, description) VALUES (11, 1, false, 'Drink', 'Wasser'); -INSERT INTO PRODUCT (id, modificationCounter, alcoholic, dType, description) VALUES (12, 1, false, 'Drink', 'Cola'); -INSERT INTO PRODUCT (id, modificationCounter, alcoholic, dType, description) VALUES (13, 1, false, 'Drink', 'Bier'); -INSERT INTO PRODUCT (id, modificationCounter, alcoholic, dType, description) VALUES (14, 1, false, 'Drink', 'Wein / Apfelwein'); - -INSERT INTO OFFER (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (1, 1, 0, 6.99, 1, 7, 12, 'Schnitzel-Menü', 'Description of Schnitzel-Menü'); -INSERT INTO OFFER (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (2, 1, 0, 7.99, 2, 8, 13, 'Goulasch-Menü', 'Description of Goulasch-Menü'); -INSERT INTO OFFER (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (3, 1, 0, 8.99, 3, 5, 14, 'Pfifferlinge-Menü', 'Description of Pfifferlinge-Menü'); -INSERT INTO OFFER (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (4, 1, 0, 5.99, 4, 6, 11, 'Salat-Menü', 'Description of Salat-Menü'); -INSERT INTO OFFER (id, modificationCounter, state, price, mealId, sideDishId, drinkId, name, description) VALUES (5, 1, 0, 1.20, null, null, 12, 'Cola', 'Description of Salat-Menü'); - -INSERT INTO RESTAURANTORDER (id, modificationCounter, tableId, state) VALUES (1, 1, 101, 1); - -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (1, 1, 1, 2, 2, 1, 6.99, 'Schnitzel-Menü', 'mit Ketschup'); -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (2, 1, 2, 2, 2, 1, 7.99, 'Goulasch-Menü', ''); -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (3, 1, 3, 2, 2, 1, 8.99, 'Pfifferlinge-Menü',''); -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (4, 1, 4, 2, 2, 1, 5.99, 'Salat-Menü', ''); -INSERT INTO ORDERPOSITION (id, modificationCounter, offerId, state, drinkState, orderId, price, offerName, comment) VALUES (5, 1, 5, 2, 2, 1, 5.99, 'Cola', ''); - -INSERT INTO BILL (id, modificationCounter, payed, total, tip) VALUES (1, 1, true, 14.98, 1.30); - -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (1,1); -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (1,2); - -INSERT INTO BILL (id, modificationCounter, payed, total,tip) VALUES (2, 1, true, 14.98, 1.40); -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (2,3); -INSERT INTO BILLORDERPOSITION (billId, orderPositionsId) VALUES (2,4); - -INSERT INTO STAFFMEMBER (id, modificationCounter, role, login, firstname, lastname) VALUES (0, 0, 3, 'chief', 'Charly', 'Chief'); -INSERT INTO STAFFMEMBER (id, modificationCounter, role, login, firstname, lastname) VALUES (1, 0, 0, 'cook', 'Carl', 'Cook'); -INSERT INTO STAFFMEMBER (id, modificationCounter, role, login, firstname, lastname) VALUES (2, 0, 1, 'waiter', 'Willy', 'Waiter'); -INSERT INTO STAFFMEMBER (id, modificationCounter, role, login, firstname, lastname) VALUES (3, 0, 2, 'barkeeper', 'Bianca', 'Barkeeper'); \ No newline at end of file diff --git a/samples/core/src/test/resources/db/tablemanagement/V0003__R001_Add_blob_table_and_data.sql b/samples/core/src/test/resources/db/tablemanagement/V0003__R001_Add_blob_table_and_data.sql deleted file mode 100644 index 9e8abab15..000000000 --- a/samples/core/src/test/resources/db/tablemanagement/V0003__R001_Add_blob_table_and_data.sql +++ /dev/null @@ -1,2 +0,0 @@ -INSERT INTO BinaryObject(id, ModificationCounter, size, data, mimeType) VALUES (10, 0, 72861 ,'89504e470d0a1a0a0000000d49484452000000c8000000c81006000000fdc872dd0000800049444154789cec5d077c5545d69ffb92d04297d8404db020c15e028a9817052c5850888b65dd447445d85d753fb16b6eec8a5d41455c13171509764511352f7614ac80080a449a0816a4a4e77e73dffccfbc37e7bec90b5d77f7ee6f3d9c977bcf3d77e6cc9c32e7cca48aff5d9b731d618174f552c00114f9cda4db8bc16d754d6ee67d7314f0ca4c9cff3d00e76e2a63ffbbb6e945726a9343926b7e5fb2eb8ccde26ae32f2e7fc92ec8b3677b8eff5eb6a98cfda75cff5320cdbbc280ae024e1ef0df003b00ee88bf17b3e7803b4e92f7d0c0a48976de46f2b9b9d7b30a786e92fba6e0be29e6cf5e2efe41fcaf06fc1a10dfef95031fc9eeffdfb56d2f57012daf7451bf91bc925c5700477f3ad4afc39a7e8d83f78803369ec5cdba52009b29d7de7e0a3ac9e49afecec6b357847f2479cfffaeffd42b0c185180267c0d31d042c04310cc140ca054086cea4d0aa6a501deac608b1680b798b0654bc083016f05fc50c156adb60e24fafa7dc7317e5a327ecfc6f7bc0f38c0fc5efafe941b01430a866e50902620872bd4086058fcefda1a571830a280966718425aae8f5190fa8dfa3120d7e8779283160301494e3e5050cb11c9d5ef55ae312e699cd2b8b5c935c97340aea93d49ae5dc0b0f80fbdfedb3d9030a0ab80f62c4820e83e36e139c702920091e52205eec4d20b96b56923c49ec507cedae502299cff6a35a0ad540ca9d35aeedaee2d298453437f4e4f9737f7747af802e81ded558b1931961c57fecfe76b77d128241daf44acf7ffeefc2caec02d51e8fcec98f815c0afc07da728dc29717e32bef97871a46f29354ca83b61fd7542d416d7fcb6f63221aa2f5c377eddde427cfedadb137eb84b88f7d6bcd0a3bab77ac4c38012cf032708cbcc7b0f1003cef300df357141f7870129a451c1a063d2d70ae67f57f3aeb0020e6f573ed145f03b148743f046f3795fae8767de7a48468610ed4eeadca5f34572926ddde2fc761ba45ca7a535b693cf39f3424b5bc909dba9768ac4c742349ed47843546ed738a3a3445a8a1ba372bd9b926bb1935807b96f9e3c0bc8b31e07cee5d1fffea4f0c6eac6f7ebea84a8ffb276e9ba57a45c2fa89ebd6e9d10bfcdfbf9e835ff924ec8b47bc6af947cff72daca168d6f290a24d75a6e49de489e09f6078422d1f24d3064b62f89bb9e40e8776a6f1790f03fec952ca4f29f7665039242a009cc054e03260218e781b4bfa24b17e71d212e587ddbb85e6542b46dd3b9e4d46952213c99b2c721df4a6ba45de8f283baca7bf70a3dd8ed1ce10fca637c0523d54104ef54c336ac70e9d62b3c0ff85c312a8af7528101f96b187f575c8515ee54e86941e111e079b83fac70799f8bbb8a814780e7a9f703cf1379461b79725c1c2dc11d8d5d974c9403b35363ff05e3e5803cacbacb872f09b17cf477e35fbe5d8847ca479ffacd3772c05e52bbccbb5e3dda08179e42548dd79b38b9f88d6f037f1010fdc207a61e6080ff5328962bac80291971bf931cbb0c9713ffa90ffcada1cd1d52ec86f46dd7f74839cfaf6bd3ed4cd9dfa195a18b7bf490f08ed08bfb3c296fbed2f9a5c3bdd17714c7539352a4702e7f2ef062c24d794b302e5c3c077a5c7e03f21dc1572a7a118b3cd3f59e1853552565af5bc3830b779306d47d0d5fce7f5488758dbffee5f97f08f1e592770ade950ae3c5cc07effdf967f5889647926bc8ad96732ecf24e7d7b3e7c38024bfae79ff1f57a1fcb72890b0027a8061f1cf41ac375e6174fba5c7d490b49ccf9973dd5b474b0bbde5fa36a9674b8590727ecab24172a089279d3332e6c64dd0d910f0af930834298e0a61d87ff2bfa448e6021f053cb1e220dc351587c68bf1b5f9186853028ac4059fc5e0d3051d1e096ff2f2def5fef2a3b4e86a8baac3af1f21c4ea51cb9e9afc8c100f3ef08fbf7c78bc1035876c98d0d04fddab0718065603299ca1803fe0ef3400b985470ac535effbe30ebc2d746111376008f1d0ab84e7ae2aceedd041883dceec396cc810e9391cd562c8b07952417c18fab4ef1bf2a6a39c375adc6a18244a1e36da7031479be32491b78d378c22b82b0fb8499f29ae665fbee124e5b2e1a086215f49b9ac9eb86eda0bd2d39efbf6870ba64c11e2e9cadbce5abab7ba953c98c646402886c6a31524b9df648512de28ceb7e3f59fae40220ae8d014b227686085fe2ec45f6a6e0c771c2c3deb8f7a9c34525ac2a97f4d7bfcfce1f29e5d9cfebb2d147605908d097f0ad4d128780e6e12cfc1a600ca809fc13c94e2c080c157255554a3807f0d3c8caf570331b987b34957e3418d177d5f2ac4fa9fd69cf2c47942bc7ec0e315fffa8b101ff678e9a33558e3696800dc17cf9c0e9c069acdb223c807de7fcbe26518d055c01907488610290c2909a3cb4a2e3df06221da7cd5eefacb5e91b2fe51ca8cc1f7c83f5ee3bcde6a4693868c033c0cbc690fd8c5046ef3b08b418f8d8b0413bda2175030f04c2a347d07385a63ebcab39c4322bea2a89f5a7bd4fba942ac1ab674b7717244dd79eef997bd592f656f60e3cb0d4ca1d41f059c0ca5a34dc83d1aae58fe381e77687b33b085afb0027cd19bf4a4bfe670f6e1d7f56ebf548ea369cf7c75538a1099a7f55af7dd04e96134a6762ff645746771acaf38bcb0a7a81509356d45142e3b55e1655ed47e96ff2dc3dfa3dd2def8a44f172747f44e15e2ec3c3c0cb81e78b223ca7dee32a5c3e17c6730af78097030f6bbe8a0c3e87629a21be72357de253e1459aaf22834f21c81edaa82bf479e8a1dda5c268b7a4d309d74a4531f4c54bbb7e768a103764bc10bee66a21fafe6df01d3b22aba7e58b0aa66111360db1e894774d18a2c5784c0521f295220ae829e23f35add25540875809fe4941bf5d464f2e2dcdb95c88ebcf9cf2f68b2f08913ebb43c3cc41f29e502832cc4ff2a815aff98a2320c7246f618d73f950d35b4cfe144ef2e7327a11462fc2e811fd987c937f69c833d10ff01b93e748b3f8cdd5fc6e923cfb8ac897bfd43b5aa4f6930a629743baaf78ba8710b7674f7bf46de9698c4effd7d7a79e2adbf9aa50eb5658b40f2ccad3623cc937d65242b496fa0e2019ba11e0866afd3d5e29db9b812d74b90a38a50ccf5230243be8f2034abf3be61821323eef5659faaafc2d2b74f219afc93f9e25766b3922cea2c914a6055608fda32d1ae0b94ed4c2971e880a20643825782e338ae7295c3e95a99e032e804780e70177912c59a83c1a892beeb3c88557b87c2a8ce7b2705f18f765197c4e15e90a075f64c1656a3e155ea8f9cc637c9a1e0ed1dfc8cb0939bd5b494fa345bf56e123a402d9f7829cefcf7c5888bd871dd2ed2b69817d32e1f52f9677c5bde729187a023838d1592d05c023c02bd9cb5e05244552b2291cff8eae88024e21c3e5771714dcf846875a214e9a72d1f0b1b365fbd6b5aabfbfb3fcdbbad0ebfb3c1dbd2d4fca52bc45afa8c42c7a856792e50fb9ce0bc8877a2bc94725f04cbd96a1e86731fa25c00b40af447b382506bde41eb5c96f4c9e33151f49f8ad60fc4634bf345d6fd2159a93b27aa72ba4a1744ca7f5833b0a71ccddc3e6f6a91662e6fd6fe4bdb45688ea97d77f010e63f28c7ea47989feee3039760ad8cbe8ef2e60647338df92d71f5d814414e0032c24f11da675ede47b1c173ff2f0928b074b2be08456a32748d7d2e928fe6ff7cb842f8833a3cf6eac2b4c782926d47c087819043c4f2f062a3c4baf4144713900159e093c160250cf459c3151bc10d3656c00293c532f5e2abc50d32f009f0acf56d92ff22b2fc7f7d173cde3b3c49c789c32e0bd366fe039739dddda48cbb8d3693bfd69b0f4040fab1d78defa3942bc77d0f3fd67af97377c2c9ed116363c0fddbf61e018507aea590c380ab084c1c50cfedeaf8802da838e33844666dc5bbb4b8d103bdd97b5f76bf2efa191a15927f83ded4849f27b46cb99368894a14172ed3043a3848552638ac48de25a3eb421a30cac126d6099f42a809362aa04bd4c162a73f8b8b018709c5f32e0285416534c8c5f2ecfa6e1a5e955f2e97bd3ae94dcd4637797be50dff5831f3bbe95103b7f9ab9fc0be9617f59f5ce0d3f7f2af0c980590c87bc9342d10a02bf7b7fc17d6c9edbfe06d21f2d84155620517dc60e27ef7a89ef1a5ef1d8c49b2f9396e8888abbf3abe4d499724beadb779e246fbac2dba7e521712e385c5dc2c9d5952eb4f1bbf5be6c06c3faef70d1f573b98c4eae41c705de53d309b3f787d9fbc38ccf30a3aff0fc24df97cb20bdcf765fbeca95dadc10175dcefdcefc96b709d165c7aeab6e7c4f88bb9e29fff3a27385b83a34b174947c93b3a7f36afa27eade361f2bd8fa76055ba2ce200da18254d425a4a0f092425d8101ea6e0ec75bf17215e072ed7fc788fbef7978974764bbbc30e9dee9470ad1f9c25d5f583a51fe7181d3eb9056861c303913a69c858173b9e6fd6c9563848838bddc24e3c43ebe368d5f3bff4d8fbb00bf0cdfd41017bb52d3d21ecc96f27bf0b5c7be37ed2a21ee5835fd377fede4ac4bafbee4f057d43de92a36a0e5bad5f10a527d4a1ae45b87bc28bd9a0c0a2627342f6efbeb8fe2818415d01341448190b43d8e4a39addc8f399ed6f9921f1f9d2f3fa943eac4ffbb2cfae7f342c3e35cd60258f8e3d00d8360afc203901e45a67a9776b9159ec742539570c15d71a2a2a7435cf9e0d1e8d69845c72c38edf910ae426222839e33435c01d7ddc6a70bbc58d5b54b5c2df2f31017b71423c00b359f59069fd92a24e6ccdcb2212e7df51367a7ec2907d5c0f61d730b8438b2f4d495bb5c29c4274fbdfef67b7200d6fd5253438b8f3a04e0022a0e847707f0b180e094f2ef7588b3c07c6ebb5d78bfe6ab44015faeff71cfc3693d2609d16179467ab954acce0fcee107f96b46310f7843f4e67c27fab53a6444728610a8bc2f0ceaa62762f5b059c888cbb14d3e329907efe8f45d176f2f34e8337e93876c897e9210977ddc317e81f390dc9692675ca12f535674bc54885dd6779f709a84596fedf7ca37c3849875f3f44796eca5eed11e495e621a7c319df2ceb45c43b1e89e5ebc25386fcef57b5720a80f50c12661288ed39ebbf895f4b652d31fd3bfdbe4d6f2b70ea1be43fd18b86dad8026e8b0521c7a82aeb4645971973b8fc5564b31e0b2a13866824b5b6880b2aef400c18020d73d177caeb684b8f800d4316c169a2ad4aebc7aae1821311ee2c2341a17232f60f44dbc140561f92a241608716da1d8325d2d3f69dd61bf9385e833e1a4437b7e24c4d7bd679c551e1162dda45f9e6df8b3ba470f38c569ac9e84f6682a31a107c84362db3cb4e5323e4a14f0e5fad2d327bc947385b4521f68b7ea8db3e48f473b3bef72b508aea5e5a2ff660a55c6aa0d01c859a596b3e8dba49c15a8fbb4bc642a26f85a1d8d8766cbb1a25702fab15092a25fcce8050c17d02b64e322a6984c7ef39284e42a412fb399fc16b0905c1e70572bae4ab1052ea79d33d0af70ef727ad76306ad1262dff29c65cba5c73163c2ab777efb286e2295b5185071a04358f4bb561c61866f7345f27b5720aaeb759ebbefb2f51f77eeedad4608b1ffcbfd4e7db1a3ff5be8bd81fea2a17d714de13958a476510f5d29da466120b64a038759302e048b2cba7c65014a8f661470d0c180cc648be585164f42683cead1480f643ff01dc673598c4f12b330eecb32f80c93258745fe584cb8047f570ab0447b380a77816769854a7c293c171ecd4c78343cb6be9562cb69b35aeeb0e7b1421cb25fffcbf6972a7ad67dd3fff646ad1035376fa8e079f35e4fe087038f002f31e1761b706410d15e4ae0c3571c97ecf6e88043d709d1eaa3f475d3fbca1fab9db69d3a095feec860898057c255126f3e0ca29842cf54f7b1fe136cb1991b44b1fa8a02e08a5e72392683cba45fa80db002f57ae6f1307ee3e42fb3297e35bda007a5e871c32819bf31c55a01fa61f06fd2afd49e378dbf4dbbfa8973fcecab8e13339e1d203deb1ee71cbe6ed92d5291944f5dbe00c9247c2d84d27ff9da87a738b57b245bfdfabd2a90b0023a0b474e1cfb1edafbdad41be53c76ceb09d9e901de0fc14aa3ce96f22e83904f3da155e06415985e18bd08ef624b82b6fb7e894a04d45b7e5a28069a61660d322b765bf04b355c6814f2a2474f11d8a6f872d9697989e439ca7021c218e6215e210b49858c13c9cd8402b34db8185e22a40cf926da62dce2c66d1966c999040daf72d4ede437272e84e037aef2e3d9077339f7bcc27ecbdd158aff3ea115bf6bae0a102e02ef00860097e07becd1409d56d60b1df571ca3fefce02b7b2f971e47dbf69f4cf73d8dd9cec79d4e8ff3282bd9623059e6b92ca4c843300ef3ac2bf5c4e9aafb40dfd1868732902a028686a2c72bc8b35808a9c44cce207e831e8e85dfc266f2cb43ca4e52c388f31b01bf0a2f481c0a0ef0bba543b65231fba1ab8e6376bc3b4f52ec76fc3e977ebdb3109fcd7beb8325efe29eb002dee326d4f24b38c1c59ab671dfd65b6cffbd2990b0023a0b679582a1ef653fef78f3fa3183e4bfbd50bff3a422117031a547607a0e3aeb435be80a1f8461ebaab45ba778e3d26c039e43bef268e4b49f0b5c790e2c7416c767624f2253e36afacb09585ec4679ec1676c002abcd0f41c4891c8e7f603fd30be2fa1e7104b070e588a0a2f08649b450c3e93a74f46f0f6cd1a782d17b45edf437aa087b43bf6afad3e948ae4e5e71efd4405e9627b735d04e89abfeb104026231a062c002cd91c0e135ca0ef4c0594beef79336fbdc9df5baad3e89d2e8ff80af06ef17ad737a3f2a3dac7b69641064c2926eafcc45973564320e0b1b290514c91287ac90d0d538e89bec3c69f13480736e83797dfb82c3193dec61a46997cbe08648935c9ef160bd91e2d3d923da55df641d773fa4b8fa4edba0e377c749b105fd7ccb861f549ea16ed81907cbbc00b184e8a2413300258c2e016bb7e6f0aa444010a7e84e440bbe41f8fb61a72bd64759fb49bfd6caae8c4e78b5465920a59be15020dc4626ed1359dbe1ab7c80e41043e1591ec5c65bf4a2f4929289e665b6949b3e5ae760ed26e2348bbddc834dbc000c947086baa9e284ad47396e48042aba5081c21c01c786e1116e2d3138f9e8e1ddc17c67d0ebe07f8e685b8dad4b49f7ec8fdd2723b719f31f3a649cbedf5b71eada401471e090d382a557381534cb988118d009630b899974e3b960651b7a77bec9422278a9cc8a04e9356c81f478bb2c3e78a449eafe2b632b0369519c57361c0d8428a3c64c4d70688be635bfb4abc961833882c86464c3131fa01f9d8347e631e2fc68596bf84fc26358c821e8e8bfb0a9be4770b876c9dfd9d65fe1ac9ae1bf67ce3882b855878d897535e953eff2f7356de545d8d9b10b2f588a3087092ef45c04b80937c9702d2738b3787d3f8ebf7a2405c05e20b6d865f7d5bddce774bd7fe938e4fbdee87ac16887e7e419ad5c58c854c144e9e0362ab729a3f11ef52825c8a8167cbce2041a9b4780ed9ba9010d95316cf2116c3263ef3189f0a2fc3692083f404adde53c806888d4f3e00a712df1b991c602bec2a80c22b43b2c0c62eaab2ba15f9dc68d0d9b463861c650b7629df7555df3a217ed87571e3cbd2725bb9b872ce06b5ba151b5805c049a1ec81df6940d2df29df3e0f7fa7cd37576d128746e19f7ff99ef4f9d78c993c7aacfcf7e9a13347dc16e74904e5577141f25bca4230a5f8aa0cd433e9898dd1b37bd6444fd18f6d1552095cd1b31b44267dbe56e268f9a9041e06fd0ab48949df05fd2c6d6025e437e6f1327a317e2b8cf6284cc22f85fa2c1e9495df606859d1ab741cb1195768ef942eed2f16a2e7b23ec7ecd1284568ce336ba6d7abbfe92d7b4a80ff85c14cfc7d3120c97744c12dbf36b2bd154858019dc61851c0df3a205c3dec9f974b8d1aaa09650cf0b7baa0892e3621bba0014bc1e262566a4f42ad3114e318a3b0ca4ed2169760829167f11c08d769948a9e54001be29fb3c7b0399f68854158944f163a13cd5c83c8469af14c240bc442020ee887f19cc263969c83b784711f2c47840073b445a8ded3dc4555168a93efeb055c29cc4db4e09ccc502bff1c889dbfc93ca4aab710ef2f7ef1894fcfc41f6960e55a6026eee303d3054e27ed453692a93078c380f50da2bf5e7cf79cdda527ddfac1f405cf4bc3487cef94f869e601c5cd437e956cad81d6d0682784d57a622b51cf594330067dab67ad4359da63b51944d42a26bf2cbd564a8fcbe867a2554c7ef98e08b6f4dae09a5f26e337339e5fc7257963ed51a2e91780be1b4f3f29bfb68a7a9a1f36d32369d9adf569ddf714e283da97de2a95946a1757fdd688ec43ed41bbc01799bf6b1c7f0fc82fbe68f33d91ed5d488845456a087f517178e11d859997cb0eb83b943ab23a5a2814cdadf18abc0c752ff09e48d61c0bdc53b8bc4fe161e03d919b33dceb13c5fb20d973ac17567f47415111f0b0898bb1820afd143e12f840a22bfae07dc467b681f7d4ef233eb34d3e9502f22e1543f15cf43bbda198d6c602efa9f7fac9c073268ebdb4e4fb543b4d10c38def9f8cf7802f79b7c2f3894f4458476abea8104be1d9f88e22c6674f85c7f13994f1893dc3c0d758e07dc047ac7d894f1e586ad695f1efdd479fb58310877bc737ec8182c3560b0171c0508b73144cfb55413f29c3bf42df281838dfe53110cf6e2613741fc9356dde29e5baed9c8e7fbdee0ef99dc778f9a9efc7b707f65443bfc5c92fe480da09f2ec01773dd5bf28f0f3747b9bf4347dcfa42f9f37c707d1efc9e42e6cd297eadea43f99f15b64d2a382bdb8f1c6e538b17c107dd61eba00d065f4c65ac685cbe88d34e557ca5b2ef07093fc4e66ed61e33726cf54b0b849f24cd725d5e32aaf951e8833cc59d11a5bf5b47e59413a80ae05b2b7b85ca71cab6008597f0ef6a0d3f2b9d9d7f6f2405c05f46ea2ca691429ef48c36acc9f163d2b159bf3b2f3dbbefe80a6900c59fcb00bb5c59fa32dd90db88fecc60db84fe1678a5fa2f8550e85aea27469fb0b692d66e277013a0acf005e067c10a8ff13ffaa95ff13069fe98ccf74c667bac127e1d761bac9c722ff6850c991fff371daa6a358e1c4a7b4c072189f0aefa70eda9578187c636f2cbc370b7886e6330bf7115f59b84fe1282414fbd19bc05719f0189f198ccf0c7c4f0eee53f834b45f2f1520927406e1fd8bf15c41f4f766a64f86e6868e6bb59310ddafdfffcebd3e95defbc2499fbc7110fe488b8b74fe088ed2d5a12caa1ba1b4609c0def41f1e8b62e698a0311db5e1d9bc784ae10e2c26fee796d5f3905b65cda7aef470ef16939e3fc73389ca9d46f2804a47eabd4f54a9003edf9a9509f8bfe58a5e439ee585ab437e88da1f6d65978aa7f4ab52429fa65267d87f611cb31e54cca2bc95986c1ef203cc1e967805f0a076620c443f40b997c4cb5d02f34db234e0a329be2578f0bc1f9857c825f3d5ac3144283fc717e07b1f6b0f19ba343d2617ce7623ca7e86d645662eb5e6d2bfd7359ba8dd8a76ea91cd19f3df0d6238b60207998e93c54b87b3f02c213a1dd80057674f090deae0b6d0b0023cde124d1b59d14885eee2e51c08f0d8f68bcefec7ef283d3c6b6ec71bddf00d95428d574819e70292bc51ab3a41829290e35614530b02a2d69b622c9e25a2c0f5f85b0a6b2823d96661b17322860ef53782e14de4cf065cd26e17c5a43534ac1165a425cd64d1dcd7c7c6fbc77ac7fd25b6d7df5aa5f779122735ada9036a31384b874cc197cc4d68c1cbccde433072118969e2978b6d946a64fb6d8bb55763769b1b5c86ffdf9c7270831ffa5992b7fa42c2d3a10687740da5e1b8a446fabbd8709b5d110065ccc5e8adf75c80a7ff743b1fdcecfef30460e6ca7ceb9d8af2497d20c4388cb970e2166a9ef27f9e56b72907f92a7e2666e92e830fa9516fae84f6b882b58f1eee03e937e89a60ff9481ce2b28f374b7b8441cf16e27218fd60c5bbfabe2c8e379dbedc5c7e25be58e19610d726662576d8a3cbfb590572ae7fe999752fbe2465736de3127d901b9d4b028fbb118650e3b90a9afb1dcbdf6150e942d64dbeb6b5027115a0652682fe59cc7d1f3e7d8f47ae94c8df9ce3bb0f8fb3649215e8553673ad2007b6046ded51890aded8449765e0c9d2295d780ee3b48554c8f8cc637ce6313ef30c3e4991f042c264e9c0b64ae16226e0c9765565f9f8cb977c37f35d39018e9f76f9f83ba50bfcdae0c786bf2227c2da11d5dfcf961371e617bd2a0e90967ecadc947fb43a41d8d78c2c15efda831c048bb9b99b3a264f9f8cd62677b96bd7e37638540eb85f9e297d13e73378ff5290ce19a181a4cf6bd8ddbc4f57b6e7c67f89087a22c0f562b984e7e5dfbe47a684ad32d3873df2bafcdb27ce14ac7960cdc75291cd176fb5a2c677c310908a830a6351cfd4b45c2438f0c955efb5243bd8924738bf9516fab4d8ece8f180fec3df5141ee7dea0da9f70b275778cf44dbff48a7b79fd66a6d8f40d624537cc9f8658bef0179b3ad51062ade2df429bd3db6f6c2f865f2eceafe85f424be5217a6eddae9342176fc7eb7cf174945f0c5b28af98b17abbfe903da48aee95c1dac859082d16b7f8b18f102c048531c24bab6b10249e4790c5f3226fd40e99ab538a4f5c5b71f0f01f4bb86b6f6d8dc023d1a1865505fab90764b27fff102bd98001518efe3e994a5420599b2e1d190e760e33360d16945a504bf0016799916a812f099a9de9f24cd962d6a3b6c7b7841969b9e4098e78001f853edf27f7f76b7100fdc3f6a8f871e16a2aa68ed71d5c3d4030d3f08f1fda3732b7ff4cf6aefe2a52f385b883d8f3d78515e963160884fa59878b619f13988da178a5c0fec24167833d3275b6e685de1171cae3ff9b7b96fcb81f3fd075fafff15e78fd8065c23290e0a0150653b425ab6cd18290924def3387a7efe946bbbc9df760cbd78a4bf5545cca3863f1450ac99eabb9821c417c72b7532897abe9879e836f97518fd4a6bb24325e82b7ac1745d93df589698491f8befbffe75d59b73ba08b1d0fbbc6e9a94a70fc6bc745a991c3191479e29f6e1d457c6ffe519d9ce150b262ff18f969d77e327d3a73d22f5c9a3df1ef1ee5eb2af4e6d9cb7441a982d8e6b55eb9f0fd332adcd313b0d13f6ac2b7bc5bb6a0fb6f81e935b3d2e98bc252d1730da63a3b32737b2e2bdfdf22e37ed2447f6dbdf3e5df71ad27bc9d3d0903c11e6a19047ad3d6f78269b9e9db5ad1488ab802e1044d3443d8f6ea77d769914b0d017a1257d8e1031019c89b4dbf06616e85187c60a0915ac4c1a322901a6048c7b0ef9caa371c66182b61412dad381599e3bf19db38969b6bcf2b6580f1835c16469cbcb059f05a01fc5ebcea969f5ebc542947e77fd2f77fe24c4bad77fb9b5ea35f5223a71adee1a05eba70bb1b870ce052b6f97e4669f5179c233b2ff86a53ceb9fab62b7e4b8e5851060a13e39d1453b1434c56720dd9314ea547542a4549b3be2bdd137b77fa5f3e55539427cb8fce57b67dd8defc191a30dbb29a8435a8d26f44600a7ac977062a83d6aa9480ebea3fff8162be4eb67ecdf6ac2b5f2c74b4446dbb651c5617aaa95a6a72a5c9d9e4bf216c1f7e7c57fbf80a72615c738e06a0dab34a9fc2a7af61d1b5ce0eaabec068b29776c2fb9eac675bb2ebf40888fb35e2ffa979cd0260dbea572f22742cc7de1c3590ba442fde1c64537fed44ecad79c5fe76cf017851bc4f4fa057e238b37ebbacadf1ffbe57d7f7bffe56bbe1bff93f47c67bff8de937e9dcf8737bff48c5f70997e4687d3174ac5dfa5a1eb375972fe487d256d40fbf64204f6e0ca4a5a70abf8d705b7d6745d458f57d4575ada23a6a82a403f0cfa8a9e6dcfb0ace6856cd3f66c79d68e52d2d7ecba7afadbb21d967e3e7fed9a2fd4df1ab96144f2bc7b62a843b111c030fb3de9b5adb3b05c05fc0197fde491e3fc13bb4237a4f43e7398089ea8d7939da8c74e34132e3b412f76629ac26327f65156959ae85d64a5509655849dfc579eec6434d02f4336d550289088de369af83470bd6db4ed64b76c64af94e33d31bec3463b683e3d337b449ff406bc48f1a5b7b7e6ed1bcb568972feeef8673b3f2c2dc41f462f7af89703a37f11feda877fd51e09788a823535d2f618975a59eba70f3ce2ecec677b48be5cc6a7cbf874f13ee293b27458fb5af8a476099ed4188df87a433d9cb06e5e3bb6dcfda601ef4b393b3ca5550b9c7c48d02fdcf2afd45440ca5ea16c2c828e4953af7590e516062ea78c3ea9a7f41ff87e344cb072a79de2daa327b50ff8f5c03fc91765156979a6ef2779c6f32e9767d0a3f6487ab29f0e6418f4253d17bf96030f1bfc5ac687f741e3098d52217fbdef87d74cea21c43d2dffbae09aa38478ebfc7faffc049ba0d64d57b0f62a056b8e50b01ab0ea4ac02a05375c01b821085f39e1e1fc0ad92f631a0a8e1c31497a36f3bfac79ec3bc9c780c69b7d3ebc64edc1e42d0e57e3c463f21666f42cfdc7db3be9b88bc933e7b7dca0173c3621bacad3e79293fe791c9d8048c71ba499509fec896c2c92eb106d0f4f72ed32d8ec6b1b7920daf38828e8bbf8837b5fd2e318f941a98569e32fbc4d04d720289b293f693e7a099e53b8ad10ab582f66533d48f30a0979c8843c876c58105370767386c573e079f396453a67aea2db785fa3e74fcc553bac9bbde40969695cfee3a039d252fb6ddd4fcb16f41562fde85f572f9296c6bab5bf5ee9c3aa9cb5af2cd9533eb8d4bbd08f25a7b44bfbb6cd6449ef84d08ea917f8efc31a8325c4b764e9bc6b5e3d4c88672bee396cda1baa7feabb2958d71710bb85d67604bc5a88d36fbac4c9919662d7017b753f4e0ee4384bcec5fb14ce0baf62bb052b0fb3d8b2a9a50e11008f2daa3ab8cfc4f99a19da37e5c4d453da4a8b37343de5e799d2a25df0dba75faf6cad5ea03d10e4d737c0b56fa0b512a44b36926a5a0c1811c6458587fec03c62d4a91baef50f2e7bdc396bfffde3da23e651b755fcd93cea2415deb1c5f3d1b86f83d11ec92aa66d3b3654b2f6b6edc185f1d1b053dd90f5526e2aae2913f7490bf88d6e8f77fea0859cf84a1abfa8c39a13c951edae800b14240552b30b7e27c57235f04780cf57b0ee6cfc0e58ffad7cffabf5f7fa86cde7bfbd3d66f63a21dafcadc379f3a4c7bccbfdddff7984348442a9ce9d2d2e4cd01e6c735289a9ef250fadb97b8655b2f9c2d5f4d5df5ded4134e9513abca25eb0d07226e1a647d2eaa3f4fb3aaf918afafd2797bd78a97a904257b45b3585640936c03321b9d79b912e0674c5465e5b5b81b80a6805028bcd5ffbe8b3eee409e74bcb2f549752dcd79fa8f81a44aea013f594fdc13b3469819e5ebb50f7bb586328463a60330bf4f4a2652973614b112ac95779dfce6a4c84997c20269ef8ea47d435ac9382ffe382ca3bfdf32ede2d7eeeb5c7e54435e5e33b4794e408f1c1292f9cf5e63942ccfc7ada981972c2fbf4cbe90fcfdc4f8859def4b299ab25ac7a63d1277f937faf78fdc78fef90f72f7af196e913249d82673f7abe83106b1ffbf9838fbe14a2ddfb9dbeabdd5b88d617b7fd79a7a9b2cba7a78c6e257d9d0df7af1db0500adca30f5d7ecedda74a7eaa6ae7d76260d761a06bcbb13606bb7dd7e328df823ff1ace157ddb28fecbf6b52f66cbbbf0886f892145ec56d2d8173549a9e38addbe1d3c4165b338ba01f9462c6c04b393275e755720a9f31e3d5c8e734e0e0f2375c0788ba8f86ef000fc57de4f253a156045f580a28f1d4f92dc685ce132267c089d3eef7d75a5e74be687b725c482a1ffc4ea5ad4758ecdeb6e54d3069840ca332f0906fb4472c0463d2e715d3961d1bf45a9f650f2eefee86e36a5e17e2b5d6131eb8f578297fe74ccb9b0f43a3a141419af0497eaa7756d07f2e0aa7019222a901443d4e0d14482d2994b3400f864c3de4b31e8acaefbf050fcfba7fe900c9ef4da1533f9d25c41e5ff53ae2b8e512efe0f44ceddf647b44bf3781e19285f631be3f2e09c1a44786512c5406838d19463cb4ce16f503fde7249ed752f74bbba9c3a7d26e1c36ffd6d7657bae7a71c95deb90ce4b21672dc7906fad482628c80b10f55500181149aeadad40c20a680b0d21b3507739d0f63ca9ff0d7e139de164743d5b04d7202a903595c1b6f6d0961813709be545965d31703a8276aab6c82351bcc4f41c028b967c0d82ce639882dd7d359f81ec97e8fbd6afff75dfefa44536eba8e9fbf8f34ed9cb77ac795c76e0cc5ba6dd31738c102beefaae66f5d7b233a778136b07ab0faa234f804de87c80d6a190a8de178c57bd35fefd2b567fb77ef59fe4fb96be21663d2bc487552f1dfae21affececd6fdbf9696da67d7be75ee6b122efd7efe9b3ffd4d3d5f8b350e1ab014baa2815e7b8f1023eebe679fabef950aa9b1ed91071d248203442b00d37390ada0f02c8d2bc380efdebbf9dbe12b0b3f2607d1f7a6f44d9be01f711c99f8cc9269e3d5937a8001d69fc37edfcd847aa0458471f98ae4dcd537dcd173a5102debda7c35daaf03e115e4537545b6da01a1d25c246fc2a38ee03b4c4b36960e3e26617b704328593a69255b2be04923ae28f183329ff47eadfdc37d84f8e8d1972f9d834a0b9ac8eb497e208fe45954fd49410a5955f701c42230290c4ad6a885e751831d05b4070285a23d9c37158cefc7c52fccfe6a956c91aee97bdebefc292176c8ea76ed3195688fbc84ed51093c1cc59bbb6798ade2bd90d622217fb63db8d8fc60ed3fdd4f6c5ef3e9c97fa5d4a49dbd502a882f9e89ccff0e0a9cd6f8eaa128b4a70d83a91e5ba3e83de358faba9e514b44926b2baf81e858311558b9429cd6f6922f77f4832a45ce9b87fa165eb01257e103bd760ad795a25e3cae8f6ca50aeac9ece84a1c65491e8237d453627d29d62e6215b854c16b54bc7bb14a72aae8a54a72aa88cf4ec467c3e2fa89d5d2025ad17ae12be51709f1e686270ebe51b6f3037346ce2e8ac8b9e7e0a73b7e3c480e869bab076c58acdaa5eadf0a6e4001da0614feac8745b10e1dbb6e06208ec05cfb92097ffba709d7de03280756ddbf6b26af918ae5b571138ea890bed3177323efcdc75ac75a646fac830bbcfe44c08f63fc0c7ffeb6c3fbef223d9a5b3bed729c7ff426551c4750d14eed393269c5bbc287072a788b8cf62dd2b1e5e655bc0f14c7014f58499ffe7d871f7b491fb4ebf0bd0777fc5c7d57da7813a6a23d52fea16008213bff2c72ff925ea682730151d9ebec24156a8b76734ed83d8e5f5e41ce77406015e47a6d8e5790072bbc893edf512171c57491b5e29ded7ca02bbe15bda16645f6fcf6339f2b7385786bfcc4111f97a8efae5fae60dda90a560f57b00a9be76c808221795af77f89e15a58c6be471effbb1f228be22700ee61e26b6f033c9ed191cf3ff9eecdad5e92bfaf7c6df1fb6357c5b507af201fca7644f0d891b7d41e3d59857ab0e29df09ec069ed4bd11b69ce634d54bc9bf4279bf2ccf9edda6eefc5bd4f56df9dfabc825caed3fa2b980205ede0e867078a5dcb33cdd330f8935f5bcb034165af660c16aef3b0107d469e72ee215223b678a6658f027fc2ccd7a125551fbc0af86342e5ccacc256762e62f91482ca053e4587a4541a6d6cbb7685e7029f08fc38b5c587f3b25908284621bd97f8c857c758c9bbdc785c8c02de127cfe5344a7ebda43aa57fdf49010730ffee0d5674608f1d26b0f2e7ef93269e1dffecd8495be28948bf2fa6b553bd42d037c4ac1da0e0ad6c092aac1d9c8351898dac53f9fe1f7e2f9bd418f2c34ac65d43eac60fd5f81e37d759840f52239fe5e07fab57b01d64a011db6f79f53df15e2e891f9136eb8d75f5348e9d4c55f7329d66b0eaa1dc6b1131f113214c5c8b2ca659b4fd2a98213a9bd11e21b05e929a658327047870c95a7477510b85fa72d5fed5c055c992fc4e79ee22e7f8de2d78f7e6cf37e9a108be67ef5fa8fa8a9afef04482191a781a37d1aa058745d485841da64d1f7ac73da0cea70de9df2bd8f38671e74b6881d9d9c8b42d3b1e0e31c3a5a194fafc2f7f1b5b97cc8277d5f31a337d1514ba8a728f993edaae885891eda8fe8e582fe14e073751697a24ffcba3abb302aef359f6e707e5821c48b550ffcb9245d2a8715eb6ac8732005a23dd72715acc1dfaba050c820d21e478d096b272aa8c7057918b094ebd55a8668c0f869d817b033e00e0aeaac23aa8378501a53537f2a5e280dd5eccffb1c32509a90a1f9a1933a7410b1dd8c6321f362033f03f34abe3312ed31cac04709926fcac2541ef68e783e1ff4c6e95099c2298d38368f297a537436a2c2295b7494f6008b417f94c1efd7ce57fe32fbdbaf3ffdedd402b417daa9fe74b40fc9f32405699ed05986b4f3023c11ed6127dd4c746b29103a4190425758fd4f9113dae1b79db8f4646971877e4c39cdb764f5561f83ccad3d44bade72444de4a59a3a6da14158e22d1708a72d1d0e545b7bc8e1a6fe32574f402a0db2d8dceac3194d69b56cab8f4af0f94f75fffaba355f2d3c4488c7cfbdf685623991cccd7d7fc9824765a72c6e58418a81424d3ac6bb54c1aabb14acbe13385c77da4db6ea6b4028e06a0a052c017c02f43010abe1f2eb9013063029a2daf780c3c2aebd1838dd079c16316b2f10a2a0ed0dd34e91aabced2e9d479fd943f85b9990a2588c762a403b299cd26c8bf5d25c66f4f7587f291c29b5dab51f450760995bd3e8ad5432d8d634d87c92fa4bec8aad3dc2a0ab4fb653176d4553bba4eaeb6fe544f2f98af28af9ea89687d8b7fd5af003c44c13aaa7f414cd91b0262b4058f0a4644f71a3afc85412baff163eef78a11bba8d04dbac16f3fc261c8e8ad31a0584b316a32743d90c22bd9963763f4d63cd180859ca0143d1a07a400686b13c1e8d9b7fe498fff268171f6c56e919c27ce1362cef3efdff71d26ea7ad4d3d462c2a7b58d2a84a6aa10d9a87a48c1f5eb815f69deaf17cd2959833c1aac5135c0c368c0c447fda4712890465230a45848a1484fe5a78796bd54f5ac10fbfce3b0bdd6499fa3fdaa2e6306a4c5b547265a89b62aa20d50686b96a9d8fa24836ddd53c8fa6f2a19b2a037956d8544e9bac58cfe18b615901bd80a485d597a6562713cbfa9a569b9ed657bbe7fc88b9f3c2b3de5baa535abeab047563d0cd17a0a6da15d2944aeeb419024423b3548ef495d24191161b9b6551aaf1b83ce15a193fc92fc409a6d2cdd8d5c35a4c76e629a2d4f839c03fb912c5aa4d9c6a5039b69b66196661b36d3f2d64efaf932ff70fca965e3d3c6ca37adebf8f3573450ea6940d01a024df0a8abd83055c12a0a59214d713df0f5879b90ee5f3fd5bc7f436f86e7307812fbbb0556810ed57dd040f763d5e3aebbb4ffbfa582a9776b8e7f6fe766a5259afdc5d312cb81e7436ccb95787aae968308e823a4005ca703e3fe58fab6c28706d281cb0dbec067bb833a1fbe0b146d0869bbdac041a84aa73b3eaba0aef340faa3bec2b1df9d0bc4c0acc238fecb59faf9641d3252fc146939758def41ba6edcb830db03df2fca4c7ab1f476fa7e9dae6bd0a3f68ea55bd3f460a6897b7735cef5eb7d3e796d6a8b2fa8ce008bb1e4a9515d904eb2a0c5719277521464d0604d442b0c82f0f4c8e3d031fc6bcddf35ce3c94ba6b193fe4811f117bff8c8b5e7d64baff9e77bc54df93d1eda1d3994d794936efc4cd336e14f7d8bce331f9e3e9ba113e8f9969f881798cc61de7b79fa8f7e5b86763efdb7726b9869c521a2fc9b75e83a690ac6342addc9a7d6d250512a86c0ce377dfba395e74e830387e2059ea006880f0fa02aa2760f5058109c533078c541f141356f727cfef36263ec9a7c2531b07344a8bf4fd6ecf9ff5e43ed21c58347be44a6c62a605188aa31a03aa1a79ed7aa2a6099e4fe870f54901e809bd8a419ae05f37a1ceaf47a8a0fadfe6dfabc047f595ec3e067568410ec486417573fcc5cbaf3bcfb8d15f1cf676693ccf5f9b89b52fda27ccea5492d5ad509d4a38902f6fe2ac9e461431454f8abf0c6b0d49ea2852af6931371ded4c8a22850f3082b48b293c693de08a63789bbaf655fefdde55e2b7f6a78844f5408a8f7c9851b13aa688c9af6950c51946667b20d02047876bb6ab45b1daeaa2787b7ba601b7e6c59f5e9f374fc26f56f72279a42c2b3d81d3c44da150a648f4446e59fcd68be0fd18a4ac210a491d6de281fbb962e17cc9f1f8e5ea8aaad5bdfc7071f527b366c5b547a0ee83d53159e61dddbe5a51139e989e94dbb0412f502705455ec4e9b3f9d1c26fbbbf763ea62d3686d4f24b8ae418f3772dcfb4d6e10286857125af50dfda8be8aec9485481dc2c1e6fe71718252ba0eac90af43c4b819e6d42619e83f440a890d028d86b6e811ef1396fc38cf113270a31fbf877ee5bd84a7d17290ef238aa6169d1c4bd810aa492790228bca2095e4ff83c764c96de5589210ddcc0dfe9f923ccf76885516b426d19ca813ee5ddbbe67ffbad10cbe67cdb7f841f3bf5156c6efc00b158b6dc728e595aaec2614971cfa1b91e4e446f633fd4c02d1367eadea9e7b569a3be4b2b0458647a80918536c5bc2f6ee75bfdfba139c76d481f13e5372f74acb07a3e310fc422b731c38559baac3dc8b22d33e9698f9a8f83a485858c5ff4db8693d7ac5a413172aa1f6069cf5aee69a2ee6b420add9247ae1507267af26878e5b43ee39e6079629cef1ca0d3b1a158ead8fbfcb59afa4beb667d776e5c7b700f2d28c7d4be24c7890d195a7c8f24f6f8ac1e362b90f602111166205b3ccad6eddb4648aeb921a4e599e43c7e3e6e0226bfb676088b34981b070f14f5fed60eda7308685c5de9adfe1e1c90061ea8c48d584226d95481ae36ddf6ec21828402f3f3c72bbc99d2729d3ae49177de244bac8782b4285d43212b4a5f24cf837b100429664c9e045314a49074ba2e06aade52c4627969d8a379f769ba34d0eb4d486b008d938478f4b4d13fbe2d07ecfa49bf0d9ee26725d92b6f9b54fc71e73c84d5733c04600be930cb90f032411e48583d9778e24cc94acb6b8d2c1e3dd0a8e29c2c35b2d0b006a5150d0d2c175052eed465e73dfdad3482a13dc67fbe0e9d8641c394db60a88f4df42ce4423b20b09046131e35574c89f945bf554d5877f6af385f424fd4344193e7408a84e4c8a228eaaf33ef6f2479a22f8242a076d58ac2b340b2f9c3a0430ae668461f38c9b9fffec661f507afe811d71edcd0d8dc0af2dcc4864ba0e23de0a958765848ee5146e9b53c2c7d581bf240489e690d9a1407f7a4499ee90b8405b75e5b69115d33481f701ea0fcb0434e3a6ec2b97bc87f5738ab3233857dcf9d5c76a21e2fd0b355260b56c949db8dd3b907abe85c05cb26706c93396f61e35e7ed6c2ebb5139c7ba5a25853b96adadab5ea4575c83aa9c5a238ad7150e19486489bd3163fe5b943d1e858f07d0ad2e21759527a7334b2d468f16b1120069cce3ec9657036e05fcce7f9ae9d7a80d2807e1cb04401bf7ec7bffcad11d6d5fdb2c3a71d84d8e7b8c3efcabf4cfeedd250a7367efe4816ab7fe09b5a52e52df672726c9b5a9600cf0b6c0a5860d06fee76f8d883ab7a870d4fafbc4d88f7663eb73682cfab43be7ca0f21e8b8df5d82a425bcc686f5f727abe73e4822eb27ddbfdbbd3cea37a097b21a43e6f05fcd09e56a556b9cd427ba8e7790539eddc908176d015d3ba1d157d5e31ad0be92cbbf71638d166f9a17cd1cc19cf08b160d6cc65df9282a0fa0e181cba10f01186935c53012065b3513d0d2dd6421ef54990e4334544d317fd5d7d89f608a9c053ef8e0c34deb2ee33eee4ef7bc97e6ad1bef585c7a688c09e619b5d411edc234be185963dc93293f41f3fb29bd307bf2b5a7f37e8a35b8598fbce87d316832352e4d46f753008abd15f3c54e861bc9b41b9a6ae6da5406871724fe9f2b71e78cbd9f2839c9cd0b8a802b16d12480386d236835b3a44f1b84a5957dd67d99e9ab2765ca4411653168f9e880ac1353d17c5970c9ad7fe95ff13e2a3092f8dfa18e74250c1590ded0d457bfa509614ad29208b4757e2526c185b3be8024178149425d1882c13bd391adb3d534ff87b98bfebc29f08201d3073387b9ed1a14c144d2793d151538d767dfd45bb953316bfe65b767b5f7668ffd52709d17e8f1d861cefe7e387d90467a9bc75b01d7ee02853db76f8b64d2d9bb91dbe83c2aeeaeaf52d562c970ae487e7a645162b0a75df0292278681568bf45d4a57a5100e296c5f027becddbbb6f34b42b4ddb7d39051a384bd827c100c22da7d58ef50d0ec0af202751f7032b0ca40cf5a60cbe805779735f9c5a69fbf1dfbd305f3a4dcce9bf4d1c35f53c1206513a2be406f39429e33853e69cd83da1385806400e982b512e024771b7b2d06545f168bd933e87cafa0ef711e15397d5a584e90691b5a743fdaef477d9e0dda61732bc8c35a91b8784e29024adfcd0a9ce3a3e8c50ce22cbcd7a417dc44d5e07759ea82ca0fff2ac4d76f7df436350b9f5f743628221c3a6d9d0a0da97f9aad40b655165638f64f5adb48ba4920154a59b2a244735dcd58cc59c5c85de52807b22858164cdde29aa3d75c22c4b4871f7bcbafe7f02fbd884816197920b4c6408be6e469b0dfe93e1e3bd6a122a48936248b099367c15cfac0efd90ce7210097d12d372159da74704dc33380d7c5f8fef79fdd892f1f2aff7d7c5ddfa5be27966c53cb5c0a15e842c0701426cbb6b3255b503f0fd55fc343911edea7e8f5f0d692ead1138c6342bdd60148975e740cc7c1bb301d06f93743529303a1d36685fa026b3d14922a33e9c58d0b93be48ba6668f28b71d0ea9ef48cf6b3e229c4c903c90785b6204fdab3cd35ef377b260e92a7bbb957c444ada12ff9bed02b298f76f85c240855631eb085d4692d231892cac53b18aee8f135bfc0a23b5bcb08acbdd8d76815fd224d4f5fa46a78d2876d6b297d8539a524bf6f350542052894474c79f352e4bd3bbd9ce8df939dc5ede20c73cf52394b8ba6634d3c703634559e0e5795cad6b3b86395a2517c8937eff16972e25fbf68cda4aa4ac57f3d424cb554e0870af06a58b0d5773148d951b4484d8b8d503cf5a729a8d71860d97917019207d105902cb530a0cb60449817ffbb6b3eaf0716cebdd0037b2520425f742e4623141c15def90ab0667155e76ae989ad2a5de2de7f94d067c77b4549ce9a469a76ac421d490e5a0ee80c76aaec653b088c34cf9e97f2d215df8401ce2ab2a9027ba47719358fae4d1965e27a80bdc1ee73d97d7280363cd470b2d34b24ad20977267ec5890ac023969057970a706b46b62fab18a77b33d38bf342e3a2edc714c4f928b0820970fc1f0b889dac06d1e46c4f2fb265e640805e803fa4719a75e9e569053123f4f6067047d563cab201f9bb8825cca6d58dda777c2207c24f09ef1f4f5ce0df68a77cfa017ebbfb1c013d2f388df06efdfdaf3823ceb826e9267ccc35c2168c36994f9bb3eea99dd1fbb526d7fd8cc8b0a090952a8ec26e16f25b2abff7b741130e20f462ffad95e3e0a078b142eba392aa073bed2b4e402ca8ea3ca5c132717712e2626e0ce19848bf651fc1e78404345b44ede2973682253dcbe2efa357c29c45723de7978c6e312bf434e122898d28be6fb28588b02bf1a1432d5a06ea0166b05b5d892a10eae7d7da982e4c934c2a2270bdfc3de571e751cc1ad7d61c7006d29128e89b211bf372284a73d3128c014d91eef3dfdec35af458438fde74befbdbcc23fa33c25bf4b6eb41fa84c49f56bb6c29dbb3d65410f55ed2fe540e190030772e015432e862adc29d6fda5f022e08f79d1ad109df355c1a8fcab7a2fdeee105e1bd7aa249fae890b6ca9217663bf634d443488d87591f748f4ef3b6322c65e6be20c2d97eabb2e253916bfa9ef56fcc8bfce51cf9147a670c7a5ad3620c748531673411f49266229e8b94e91fa4e25c79abe8bb3f6e7821ebe558ec184fc0a143eb6ba307dd73d4e1062d74bf72aef200d9ce5f77cfb455577d61ea87bc22e6431886c426d406e2b39a6f7cd0dfee9c4832e78cdaf407746a71c70a05fd0eb7aeffabfcbf688a64ac87e32e5aa58b527e1e20c87fc2ff5f524c7b1f98bf029c013cb7136e84f017d57d19372ace89f81fe8bd19b6bd03b23f1b8107ff3909a234ed3fd93095802480a06862aef179aaf05222cba3d6d06c0363f0f44c469deb170c5b2a1798b74baacc269ef201796422ef091c0b3f55e400acf87459acbf6aacad678747a96ffa5e7e8efb9f1f47fedb672da6772c25f74c797237eb85ff14c15ca3aa68b186fcd5e8058f4d685529fe13ef2342886fea5828d0fa02d4824a96d86e31f6e8286db96d748405701f2841ae18951c5af6e976b8498f3eb075d7f3e56880d67ac5df6fa7971fd45fde07966bb77d338c901f6c0d22e3ff50b79a8745f6ec2fbfa883ec02107823c1af433f017bcc302df7b46f39ac5e995e8572fcba03fd622b7aec836f0b1b07c21c71ef60c8bb597498fe8d3f372ba37e9b93a7462d2d7e30296accbda83f38b3de6c4c5ce9329f385e83724ffbd41d8132d440a97422358f3d36b63fbe1f7fdd8fd488736427f22410865332f8719043aed2022c47efbf5abbfc0f728677a0fb77ac5680f53ceca30ffd0bc40ede19af3846c37a3ffa43c8e8c7f2e209f14d21dcbe8537fba5abe397df2145de33eceefad62a2ad3dc803e3f2abfb6593afeda040c46c585c2ccd36560fc2f2dc9b9966eb253b588a0e1c9a0c8f24162a08c73ff7cbbb2bdd05c85ad0f9efac325617449d66c23a5639ab3d0dbea641ae3d8f05bbe2f7714514d02181b002b4670e2fe88a4ffb5d3f60cdd84f55411d09ba1bfd238fdd4ed685848a7a2c8d32ac9e4b9a4649fdae9e2f6331e6403e3ef053bd82649fdffc3c7849af87b8d7a06f4b0f1f8aefb6542027af20a7e741af88d18ba5931af4e32ade4dfa9c5faa7f60e9a93b75c97cd6df72a8e3f93b465adfa15ec00bd5fcfa9728bcd1fcdd61e9a4d6f451829b7a45189db8b5ad434eef3fbba5e43f756c8b4e237a8860ba78b0504f8d467b9900eb3f536ead72ccd2ade32ade4dfa96ba1d2f58706bf23bd17b8a9a832be6c0e68861b185aeede181f4828665057b818ee58584b6bce9e62ec2e24cf4d8161a1880ae39d1fdd276c5dbcbc9632005427bc990e2a0ad1cb0c543fd97e6ef7a4de36d130616f5d804fdbbbb5c05744c3bdbc4797d80fffd3f9cbee8b8599f8ae0222057fc083d26ad4f089e10a770deef3ce9829ff818d68be9cf27fdee70d23be22eef21d0a78998f837e5b60c316b4b057260f1365905b9cbe859166f1354bc47e2e9f1c5775e601b9a97529f7e921027de7be1a167232d579f7487d0b43ef12e8541dc1782c2e05b68f045dd8d1e07f43c5350ba504efe7eeccde79e77d93af9ef13c45ed1ad3ef8e2b82d2943f7a7c2931944d47f71725c6ed0b757bc9bf4f9e23b37b439bf504ce2a9a00762bb9abfdb6eb26bbb7820818a5cd37388b96670d99bb64485ad32996bf05821a18bbfe732fa517cf9bc85cf2d43e8494f90b46502dfca810af5f862382b64f2980209584cbff7cb05249165f528f195c0533f1b7ffcfcf1f29e8cc6aefe76dc3605109714e102373d078ba5ac71a6f8a581c02df1723c1706a60660913778e31bc07e79592a8425023b2bb0013f142b4a16851ad8932d59057911a367d983ab193b35103daea822f1f4773c6af71f4f919e65dfc543f20ec0669cd1839a7cf81e60aa89936209912221cf85425e3491a937050b356d17dd5fcc70f270a4e733eac007661d7cb010690569a3afec23e22315bc3d4cb9e35951aec5a3b4f45f6cab1379473cfd8ddd934cd3e70616e317868637513c656baead776d170f44efe1138e429b02a09013dfacacb995c9969089c059dc7c0faec69bbd5b7c05f1fdd3734e58892c283d3162c2d4bb5a12fcd2c4f9d60a81fa8d306079a296f91d5f1105680156437c5723148b5fb752fb53f50dbea7d698dd78d81a7f5750ee39c4fadd05ee014f3cc0936c6aa92d7dcae2b2a73d2a3e0ac4819bd002492f3e1127d8db2ddbc0b9428dc9bf527c94aecbf7648b7920263dcb1e5ccdd8a9c1507cc2b6075758bced4fcc87bc31a0cdb5d70871d075c74eec8e02e1d49b14d46772bf6f42522ce499e8901729148b22e1e9d581bdc8f09cde2c503e575875eb65592542b47ba6f30f53fcaccf63c4f4285fb69051305dd754a4cdad202fd2b849cfee512696e3a0a7e202cf6d8a5f31d1c3fe0adbf2da3e1e08d22f93e6b9bbf87bb28e4de849789690492c5d4fbd47d33fda2bf72deb864bea3b9342f09885ad435254214e959c5fb1fbc85227c5e1e2db23806ee2a6f9dd5f2a9fc71a8ad347c4faed748ed7d3af8309780eb1d000ad45259ee02c13a8280ab8f20ab7af9945f07eb204bfd8f80fb75ff03fe2d7325cc507b314f96ec17ca20fac65f01046127a963db8ec215e1682c94d1a8289e22963530677b857887edf0e6db8335d88c38e3ffee21e384fa6052af65bdc02d84241522cdc43d16b26965d6203e305502b0e0a8d49055238fdb653bb0f979ed28bbb757bcd4f9f2f715ee8f65882f6e0f34dd06041fb24f128f95a46cc03e11e0e4649807e62390e1a5ce67cc63d4aa2f764f343585beeda3e6b2054afe1467fe09e83d08b8ee676eef68e350752929089ece832e0864617478a2ba396947ff00ba61ada6327b0691b5b14a73a09bd5680e779e8475f11f1c7bc26333ca24020ff5f2a5eef79ef86680125b7b88a580c3f18630e834ac209d4baddf5d0666ebe79803877633f3bc9751fe847a2305948b6b99e74b26dec9bb9fb305fe3b32a561a07c9f6e002fdd0b8d4dace4384e89b7afaa78f7c23c4e9fb5f5a7b1a0e386b3950c116043f30210f79e93513be2bf20d0cb24d2f7d7849f7478e3ffd7ea93886765b3de323f9630731b47bf720bf812404dd1ecc80b184f612242118f4899e97dc2032e927db43adb97b703de5fd7784b0c46cc46e5d8be7e069975f291addf0dc42b2c41a6d8b60aeae80a7b44ad3427064574b8ba6c5b256ed298b444f88982075488a2c6eaa70e0277a8581d3d0734d7a7ff8cb5520a03872e37e6f2316f81e5bc0e222055014908348146fee04ca43037ccd8c5b7224079f6b7f708b5c5e778fb2b0546b240bc942ed7af65838a48b293e6e79ea106f20a461d00f78eaf68a77e0dc830a846014bfe83731dcd9ada59cb8773f36bbf2ea3a21463c7ddf19e3e70b31e0f1821b7ae3fc9a561f29d812e9eea460d20628988a50570a4261742e4b886d43eee317ed7e5fd121bf0971d90d250f3df78b1caf43db9c35e942c9dfd3de24bfc2dcc66f6ca2e7910bd902f1380f19053ccaa6fbaf191ea5a2675df3e3f4d5f35e207984fa93e80b54696dcb6bfb78202a5f3f567199118f7bb133aefb00372a30636743377d16b7ceaba74ae7a19e12dbe1fcec691d3a8be219237617eddb8357d4435045b6560c54794b59497dd8fd432d1f1f69a261fe08d712cbef6140f9fd5d17ec7370caf3521fefe13c919515df7f7ac700d55fc351491d93032f1ea709d38b9d05ad26d0b1ac527832f081e8df91141aa333d959c5fbeebadc6dcb5c2f0bb277696237e5aaa7ae43523b2178da13a309c5f8ee0467a687d5f38cdeddd859a127ab700e9bf4b5c2e615d3818a778df39d1acc7626fac18af728def2f836030e5b2f44af2f8e7aa4f4092146653df8c1d37f15e282c231df5c8b1d0c5a2d0244a1664b759abd68f18282a937034a0fe592631e1d7c459510ff77cce383a7bd2e445bd1f1a419df49f95a1b7a75503a0cc23c11dc59a299fcea0aef9ee6fce2d17c633933ddd67f7afea13539a2ef592bde13f69f2832e905e49855bc6f9f6bfb1412aa7aeb5801190aa3b4c657781f35e0e20ab2f20d3c5b77101540914b4f03361ff7111eddf2305921e1de8d879eb72f16d129e64f15d9fa9acbfefe6192fbff53ae8f92fc5db6cb311f9ebd60af1ad99eb78bf7a37503e4f9c50adc14de2d20076a20c6e440e1b142420ff7990a07f77ba4905841a9c70b4aefa3ad25b7cce5fd038584b1d0922957f9baf06f7814c60a66738de79215d6c60ad1a8107338701a0fae41cfd516aa493f9fb5ab6bf21b37be5cf69ccbbed3e097eee3fd96766acb8cc373a4437a5fc70f0b7174733a7aa00d60abe3156c814d4a29d4e5af9d844e4be97d81bf13c4a54e873ce999786748fea6249c0f5ca33decfcf2f6a6423d935eaede5ac76cdf228b673256f727d133e42ec0afc7f865fd17777e0876d260723c562b14f5fc96358b9a796d8f10962d3d91af69c416456d2e3834344fc76378ac90109689b650c9d20dc7d3ef94beeb817b3ea11875c280b4a8075c7b1254e95966fe5ddfff9f76d9b6a40803ba42b4df6187b17bfb039ec79a7956dc1ccba26233172d3d1e6ba6b52d1e6a60a101f142f242c28dba10f7b7adc169cf21183a0d83cfe6b5838ee983fe1c331925c1e22dd133e87bb62484728d1bf43c5bfaab3d4b8cd3a7f18bd413215ab75690140779202d61886905223d11ef786f98e38af8f4e508e8e536c92f0ff959d6209286b878fbdab305c3c00d7a4d842813d3e7fd972cc455a45722b7830ad93e1e881bfd87250b443758ac9030acfede74fa5cb0e159c7d2eea5ec2c6e1e836fdbaae3cabdf602b32c2f9da71386b03500df84cf766de9ad1bb6db1566d055c0ffbe56dddaec99fbb631108d81ad073a7990c9d6b6bc246b5b34307921a1251dd87b5e3cb7e91f1ebcbc87bc1e06dfc16cb3281ea748c07792c55b7b3b28fad981f160d24b9a7cc2e88739ceb28c38bfc9ea5402fc0bd7512d215add06c8d64674d616d646a2d95b03bdf7fd7115e731c1c30964b599fc06179b13f2ebf15dbeedf38da297acff8259a389f90d26fbf0fe2b37e8d9d2dad11ee284ff922c2c315bf0ad44127b0e7393669944f1b8504018f7299c2fbec7f61c220f84776c146f7d7bdb3b7aac10a2dbf13d1677c1eeb3fa842f2a80a274c33f3168cb5b4fa258fe70575881f86da1b3ae3ee0deb4542152f35bcc39cd4f948d0d94849e43dc11af9128e495d83afb2760d1d144685a746582ced00fe3a98496a73875cb16128a7bbdfb0cbeb9e5e96a45926ff24d7c5a166f93b5c31cdb963c4d7b7e49b72bdff48a69d7a0a7e983de3b6af342ffd28be9dcf3600ac42f54f4da791da2060ad10b7a50890dcb66f29bd4830ad4d524e93f9b47c9f9e51e6539a3c7e538d7a4a7e917690f15e5cfdbf2da3e8be8aa5a80bbf8bcc17ab22c137b564544ddc77096bd2326eb89c7051ddeb10acf15f57e7efac1ff1a784efffe8ae71014813e9c9e200e8cb21d56af3d8e306b048eff512ebee9605801ff7b4fb8f0825f8ff1dbe53491bec3ecf889c98bdec5157fdc11afca82b285063c6671c506ba69d1f56c5e41a9b4d80ed8a46fb75df7a92096e6db9eb64c3b21440c3e83d966a621656b876cdb963c8c3e4fd74d56b0b98915d3090c41d007bd7e5e3f9297409a2f656561f13cbe2051d26deb8fa3380f246cb60fe797cb41805fa33db43c153143d5ea5126996f2ca1b200bfd6746e4e1ff492ecc1e59df85f12c212b3bd68e0c76ad9101e3be33ae1c014b68a595bc884151226e85885a363bb84ba5d3be016a93486a64ed7854fb0a1f45e40d8be3d85e5a9071409ad89b80cfec12e87efc61a075b17b7f5860d4b608186032ebd61917bf602af307b2eac9eb3841ae65ad6cc825b4e6ce140224a0923cc320ca62dbbc04d791501790d839ed90e82d19fccb6e4b1574c1bf4032118cfe4d70b564ce71af42c15d3090cc172e08a5e85d06748a691e2a050d5cd26d40587124a0fe43d78205c514536915fdede241711835f8bfc26283f30e9894df328adfdd75c8f72bb5cdb672b13da4a2412fd816b72c287b2421f36303d9bcb99bc90d005ce2d26435052af4bdb31234388a37ae6ffb92fb671d78ae358c0330161d3eaad1a6837525220150ce2f73f8c271206c422ba5e03920a73f8f9b7add8ffeff2df4353960dd941042d509b0270931494da423bb64a6fbe66669383bf78a76e5a2358affbc04f389ecf80651bdb4287cb6b79423eada138d0679b516e6cc5b4675b1b48bab6a1432606fda46b91d77ad7fb7b6039439defd26090a552a8ea2606e31488785e4cf67fd7f4b807b599fc7ac93ca864060cef3fbb47e919f4994769edbf66eec1e50ddac2e9e9cdbab68f07a24258c1c530d352a0dd4bf9c0d96897532f629207825874924577746cf76107655d7081101dffbe53e7b66dd52704368fc3feaebaa2f64605b52281cdeb44d0062ef0dffbda485801adf890beec2b9094c753d7fa0aa4c3fd3bfde94eff00a172f1564affe4ed99c022e7169dc23736db2e5921214da052856c424b582fef3e5a03b1868ca278cc80015f8158b82d04a3cb504dfa939379668943880185cdd706ac21183e719af4ad15ef9007c775a6fb85827be51c7af8ae38ab9bc64b2205b2c794fd3a75fa428ea10f4207ec382e48cfea416d24bf493d289bfcdafacfee51961bf439bf36cf3ad91e5cda10f8ef590351b94bb6c5256aa0a17ab3bda6356f304bc1f024122c62366bb1953a36a543daec2e63853876af734f2b54c10aad38d2b02d5fea01e6ef7c9b6bbec74f4071b8e2f779b9806105f44141526e46f4bab7d5e9fe00bfde79e2e8a3134c1cc916592d9b5a5a074a320b976fbe19b618145b7a2b45a4f1c6f19dcbf85696a6cbf6760bc4c293acedf1104cbe99c5d6ec8a69aeb0051b5fd6104cd3e9a4d6f45ad65fbdcf3ff9a2331f9672d323b4418f17185cbe61e6b4748ef3d73e8ebdef9c23fe7970947e91734c7c7b04264ec3b0b4f21b0c1945e2bf7b63f70cb3f65f528fd2c2afcdb34ee651825fe97ffc776c65e2dd2d7a4721af4c1ecb2a88e94cf4b0ae4c0e1b38cede8eab10557fb79d113d5c552a4baa668568cfc0da48763c2e5008d6e9cb9dc5e07b8438e1a00b773c1ddbb7b73819f0604054d2ea5d4829c445a12d0c140747e1d2d2885e6cef96b8cdb6d94567d993a7419e07f80d2d938ae3ddfbfaf5bf588856b9e9a73cf08c4854d14bfd659c711fa8e81d8afafd7c76c6fd4876a6bd3ecb5bf75786f13e8f9d40e9e9c56b920385931c3cea6d4e0b052e6f847819fc848defa509295f2bb8c467f1f38ae9226b653ed157f42e853cdb2aa67bea1d194cfac18a7793be67a9c84e5ef19e983e3bebbee3f53b7e70e435429c7ffd9dad1f1821c4d9ab8b6eb9f45121fe9c5efcd5e819425cf8e2bd839fec2044db833b9d3a647682f618da7485b7955fcf6c0fcd6fccb04c5c419e6c070cd67f62b296df9e06fdd8f8189b905f9b7c8c35e7c9d859ee6cfe7ac74355cdb6bc52b60e591efb8fdfcb66bfa5b9ddcf962eac13728ecd2c88d650288f24476c88c230f074f10b7045ab549ff0abf032e039f821ac70799f898f067ea6889ee2e15c2556e1ef61d051efadc47bc3f2cd8a8ec233804744beff5dedfb76e9d6e74a213ae7ee5a5f394988851f7dbe68d10cf58a86110ad2aeb41edeadcf032907a423631f071e018ee771d8e6b6bbf07e0795c2b4581e2a54d04f1638bfef98ab0f962dd7f6b78ec7bc395dfe385a8c4af763da6384f2cb72d05ea3142e9522b5e7e2283e1a7bf5e4002f134abdf652fd4167d3cbbbd4dbc33803ba549f5c3e0acf293c47e192bec2d31d17f8283cb7187801de1fc5ab0fdd307ac50a213efef8d59ff1d9faa8e2da5a138f6e06e9e37d156c64e7a0f857f7f483a674ea24db65c74eb346668ba0bc66002fc3f7f712fb01ef85efcd029f6183ef0cf05d06bc12f488fe2425cf12df318a4fd5f2aae88d52b8ec0793fe18d0cb51f4a55fb418f76502a7e7e800d47483df9c00bff0cbf57822fa99c077c4771ae32bf5bdd4b6edf712a275a4ddcabd4e95704d7af77dae95b256975ad9b95f13ed3117e335037c4614bdc0f81d13e0b757427e2b402f205f49e6034bffc9bf621e73480ecf30f8b5cd37acff02f3e228d02bd6e36314be338aaf98b770e70f3e1062c1ac590f2c562d163b829bc97775b582fae454da5d3c817c1b5784ffb03d3c90a1d87a90a5d906b22b82a10dee1a96e3b9309e4b1cda2057317022a1356b83870ccc90045cccdd4ee879cac5efca7efce4eca3fb623b6b7e1e8276d1fb2ba8b7af2605cbd748a8d23b0218165be772f13e87bd3fcfe4cf57fc5ddbef3dc6df9b28fdb58e6fded53bda5e22e53d114cff8c850c9565172cf4324353d93c446973e193ac6d45588832991c3c4f6b0a5be6f2b2843a562cd9f6dc96906c732ba603a18c9eec402916e24a5a316d5bbc4d16e22a67f42c8bd9942ce0250b716d6c7b3437e4d75c7e75882b69ba6ef3f82ddaec1025e79f3c26d7e097876ab7cbb53d16d1c77b9fd5bd99a083b9c0bb1b5d48e8e23e72595ddca7f06c1d7337cee26e6e0c9ec71c433d53f6e9226de78ce3bb0d3af21ef5695a81603150676ddd68427da00ecbca7278e8886082b459f5edcd83d60247dca60b24c963947c0e5a3cf2067fbbee218b2ffbfc057f73c4494edfa3de12cd99e89ad79e939b793265b2b5ad5c8db3b52dbe28acf0c6bf37b6a4f35e6cd7a60c49ab3c85d9227fa0308d2dae0acbe2ad6e4fd09bcb0e94d28bb901c3caa4dfdcb468c29b5b31cde421704055330d8ba4ed212c868b7db1b9697e2301c5b479fc52d2446ceda579fc0a937ee0802a7b01289eff2fd98db7f1096f8775eb445c077b346144f1e0a2289b5002f504cc73b0580a34619162b26655d82c66b61856fdcafa57e7ba427cfaeb1b67bf70b6fa369dc74ef03d40f240a85e843c0fc2c903f81a907b0604052e97dd9704ea1055317b1f16f77581a4541c7f1e72c327fb4d1162cfa507b67cdf5fd4ac087903fd4a61bd379965719c5b5e490abde20a09c3f8a6c472d05c4545167e845978ccd3ad3fa2eeb9eadec2bc2249f0262e0fc71a5b2d455abc1daa0bffc2e0c79828ac3b28d82abc7b363dd107dbd3b2381eb46c153ddb1e5ce58c5e7031dbc57711ae9edff40a72b33d62f2602896048bcd090dbf00bf76c5caf92d4fc82fefbf60ba6ef3f8b5f45fb33dca27bd89629b5f5b6b0d8426b04a05e3d7407a3dd9efe5e356c8bf8543571d70801fc3c4aa8583804d1831c0a93ac61d8dc43b154e4914cf54e548f2398557a23c29ac7087ca95328147800fc28e5548e795cfed07fa613c67c64623c0f3c0970bbe4a15bee0a14fa68d8b08f1e5fac805f3a020eadf04a4d8e277807f56509f6088a9454f31f466ca72c2d6283a7b8b26fcef01b13641ed9b4c8184ce33e984ba034a7a47be70daee6d4f12e2a4ab463e71d96142a44fecf0b709fe1ac7c14e64a779d176516fcb75c64569cc546b0cb27d5db4534114afd46b10515cf6978baf527804789e8ebd2316ec8c05aefab954cb41947bd98b613ce7e0be30ee73709fc2a7ead873897a3f62fa313988e26b3bfd7cdcbc2384f86cda9b8f7ddc463158f7a882b5470222565cfb06fe8e359006f49fb748e82bebf4031f89ae81d477ba076b20fcfb33812bf9cb51f2a7e5ab92be57f99b0ee199c023c01dd6be33f59a613edaa94979d5f4757bc2bfd5edc9fb4fdb2b6183df3c46af8202ad8cdf4a920f3d4e0b412d8cbbb3d03a267d27497b503b64425e74fb307948d61ec46fa5a4a0e8d1bce25af87512f2cbfbaf02f4c2a057c9f905ee30fa167e05f1e7825e29a35fa2e8adb8675155740d64d2ac8fb6dd1ac8d6522098d8e237d98bbe4e4e643d5fea3b39574e9c2977a6dc72b8bf9d334d2861085c05f06c35409c990e2d299b1d90870e70f15ca9a06955e111e079c0b1062256811b5a2c2c8580d3a27b09f03ce0b10110c5d79df8eb159f7d26c4b41e13264ff2f320de12f7345cabde5c3b5dc1fa6b00bf55d0efa0837f1b58d1b1a310bb2ceade316589103fcc5ef8514d0d38a6897e0af08780d3444f0aa01438790ca4602a4c5cc3bf03fea4a01f52ebfcf42ebfa55d20c4397f2a3ef01cc9ef6e55fb3e3579a5fcdbcba97d4ff987bce91c71458bbfc60df0d862a65aacccc7845c02c59ca7db4f097405c363eda9ee77f17c312916a8cdc040b44ca495f85a3db08167a39f676a3988e0bfc46714fff5c455b77fb583105f8c2f5ff3d93fd49db5e8afbaab814361d420345987ddb31a707e858ea24b8a59b30ffa47a7355281ccefe88cf44bb91cf6fd3401e4e27b573b33d577e9ef75f1bd99e0bb047c67826f931eb56f362912935edc045890903e53a8b23d39fd4ae061f05f9190bec3e897307e31e169032fa6a8ccfe2b019ed7ccf6d0133d53845c1e92b5472c29210b6f013dc8fdc6f30bfa307cb46205fd08a36fe7b702fc0287e2d2e383d1cf54f47e882cdc3faa40e67e3af18faf403021ea45594c807e0867df1ffa9cd2e329f9ea7d53db0e9013999e504a9927518a0ec947d64aa5d960b109857548a5c5b219048fc645964e31d3e415014b44e198f81a3eab7f66cd0b424c3ff95f9fdcbaaf101b0a7ecb589fa9beab1e618c3a84b2ea4881c88e69f9489b6ffc0967c053856f4fbc5188aea17de6de9c26c4411dfb2fec7982103d4ee9dd77c3ab422c3ce0f31b964a8bb7eed39a17424fc4dacbbf52f604de9de15024baee64490c4ffd6b8b23529f136258f1b517f4f95a7a1abd073f7589e4ffc05bf2863f34d73f052eedecb37c3ed39c15ed4f89b64b816a778b27912ba23965daf2cd648adab10ab883fb145e499e04fa23a6384af01c5ad53291ba946dc7147f29b27df2b545aede93670ec4e5950b2eae9053e4bccf663c3c1f1e07f5572d2910f2440e347fd7d975e441ee216787d107a5777e497a6ead3b7d3c72a4889727d56e427bd0ea7b33f44451827623b98f44d14aed4147c0b7c2631e4821be7f1cbe57194236455dcae897980a35c06f6c622b01ff9906bf79568fdfe4b752e305c0897ea6413f93d14fd61ea4b8207f09e43673a3daa342d3e386cac6f25b62d00b7a50aed11e8e95dfcc787eb5e27341cfe251ae7865d15dbe02f9f6c64fbfdc760a24d572e356bc6aa755fffddb3f0bd162c7562be37ff7105384580b6f2835b8171d289e70f0772fda615e9ec245ae4713be8a090a86e7295c60f15c52a5fc6b81f7e51a389d1406e527bb279a293f7b69c583e33f1162f5c0a5ed7e3b053c66016262a7a36e756260b110832b2ffde06f525186faa4387d7c8fa34244fd8ed09e29b7f80cb59bda39922fff71d6f9452f2e6b2f3b2fad7ecd47e7caceed5abb6ab69c98aafeb5e18c6fe64bda4b1a4eae7ad727ea7cdff896042f88a57ec7a79cd9e2cbd633846895d2e6c17d0e90fae0a116bbf798247fdf3ded8ade55f23d53433bf4f0155cd851f6f60962a03fe57858dc73cae94b1d8aa9266ecf32d51f5e2f6f14dacd453ba9e9b40803b258b5a4a73d00e0346121e6ec50619deb94e339d5af61e0aeeee772c66739e353e143892ffd1dc5ea6e2d07517cd590657badf04bae1e93ffbf0bfd76392079162e703a03fe13615e11c05c5f8978ca4fb9cfbb25f66b549ea254e4305738d6689c71e057cb25e4ba58f11727e70aa7f6cdc5f3114d4f18df4fed51eed0da05b5a7490f752a7457805f4eafc2c403fc127d97f14b6301df238a40af18f404eb3f6a8f5cc66fa03dcc792081dc6e647b00af30ff1ee097e8b949f80db3792af9bcd524bf02f22cf1c4f489df89dba390705b792071b1fc5d2ed8f352ffdf6d77e95c71913f95c72c9e523c0edc1a328944a13d26a8f03ce6499026cf77a28122672ad64292844c7e7df7c7a73e94137064d65357bef28a62b01e057fb51d15a41879ed55313cf7b6337bee2fdfb4d3d2ac95637e94f416398f473d31b2204bcc509cf38833a3bd7c3e7476ca91d9274a45b0a4e55561c941ebf5e9f70c1922e19eed27f99b15b679b7dd9567cafb5aa7b7ffe02ce9f1b4fe579b7f9d2127c0d4c6160f1c3b5c3e7f7aca80033b487a5f398bba74897edf587c5f217ac1c5f715e2fd61b49fe939104eae7d01428a654d87f8b4255669099938da9388eedd2365a22dde17c6fb95f4649a9e83954f41b8b6f00b0dbe9805fafee1cf1efb9454e86bd6af7e6feda1e837788e7aede311056bb06b56dd3205297b8b3c11bf42216bc881ed3a7f293d909a8e472a0f24b036e002577b15e5a8ef6dae076db53c4b21bff9e897580846b5970ec1f0b5bd4008c6e457b72ff3a06cfc06d6326c2118e641c5220a8e41df491a51803c680f44d12b65f49bdb1ee411f39027e7b7c2baf6c2db43d1b3785071f356b3f88df3d84bc07f5e227e7f58b06848d403f9eed367ffe3ea40b42527a7b20f1e78ee81cade92c98b1a2e5fe81f2c434741f6d495a10a1fe8758d3e333250d9a94ab3f22d95c954e1cecfe2a60387eeb69cc5ed253e8bbbf2d239e203ec1e4a0ddb8833d21b309134ec8bdfbf92f3c3f893bbec7b9d9c585e3ab0c758ff88db2fbd0bfdba095e912bf9322be0fba0f29e57d2db2b8733e2f98c3be33d17f4a892351b7fa7f6cb36db13672bb3b3a1637ca25296ce92d7edabb34050290b9b932a673d9da5427c16197c0ec711af492a86359f439354bc0f44ff4ee67c2abc2ab476dc1239757fffe3d7b7fe8423a51a719a3459f3d8a54d3492cdf70c203c138f56e38c424f6f77bcc794a79ec0e90cf2817a13cf6655203751e1ed815ed315d3aeb562daa43f3640dfb2434380df9189f8f558e5bf673f233c71457673e561632bc8f32ded413b2024ab20f72cedd133d01e43f15c86c97f604705ceafd11ebaff680f35be6303e7f76641e5c9dbf0daca1e08d96021dabae34f7270ded4509b22e13e27f72eecf6a1fcdb8fa9837b5f29fccad982e83dc54e148a7f8a0ba37095ae1ca7ca4e552d9121a87254e13982b2b6e6aafb6091e2140b0ac188bdc411784ee0b9cc785e79c57bcd37ebbf59f89d5424f3befa753ead6d7ca9602d2cd4fac142ec11ea35a59d9c120f7becc45f1f978a24f459e8881d2e13c10ad45845ee06bc4fe17d54e5bd3345bf3a33099f39f17ccafb72709fc2ef465e382a95e32a93d3f13b55e62a3cc6673ae35355ca8e4799232abfb5bf8837c6f19993904fc2c7003f5074c073613ca72c39375041adf0d1492adeff09be5721e9220cbe4a15befcba6febdf9828c4ece5ef957d75bfe2a516753bb4585e8bcaf31aac79d41cab60dd170a3674c6378ed6df2eb2661f98d7e945e981ccebf8eaa874115be328831c0f42bffd13df5fac2dfda62b90b9a5cf2bc8ff097c2ea3576aa9201f64a9c8d6fc6afa838027ab984e6f92dfa9849b15d3baff908517b76341f32ac87985f7665690cb7e1a0b3c2721fd58c57be2f688f19b6ed0cbb1d0b3f36bce07d47f15a09741e32c31bf2b672dba3eea814cfbec95641e48d56b0a363c06f87b5b440fd429c0e9d27510d2f3d9e3ed035aa7be2f44cbc5adbbff692711cc0629c59444698a3cc445e9bf3aed4de17169a04a40622118ea10c55d8e0e7544149389171bd3fb75ccdbed2d217ec95ef1d8c77708b1f6b39feefa0d1349dd3e42b45f95d1d5df96fad813fef2d66d2b84481bd36270d613069f3c64e02a3e3011c4421c6a5ad2218924d966b16c1285f345ed4148bb8d40b16e6c9a2de793f89aaa27e864a102b8f2ccb5a750046d499163cd0aca049f25782e137c2a9c87cc4a11220a2344c4425c9f5ff476b749d2535cf6c482c77ff841fd81b2af74e88a14c859c0b1cb320dc0c67f29a8f7f3952dd3ede6ec99edee12a2dd1e9d0ffdfbc922b8784bf254aadb75a6c91f5b5ccdb32edee6b1ef2f003e135f1906fda8bcc5a5eb2a7ab6e403c6afa45709dca4b7b1fc9201a443386c3cd8b3ee4cfa7cb19916edad212ed06f667b68c5c7435c443f9875d534bf791b1b924bc26f01e805e60393dfe58bbefdeadd638458f8f9171f5562a6ac4356282581105ebdb3820d6f01feee14485801ad402a002b01df11e2a7ef97edbde25669c1753ca824da22e7893fb5e9156d10377a139d3d3155ea784533338a2749b3b5d601500cba97eee07cd06972a24b7935e59bd62708b1fb7dfb5dd44f7a22dd9edaf74f6de590dd6bcca1693dae1562ffbfe4b62a9478cb35ad77df7fb89d4f6bb6190db05ca530e574908ff76781cf30be2f8bf19915dfda4eb06e057b046d629a2de773aa4e53dc0fef0fa37d2b4c3e2d69955ca1e604d2ad238ccf089ea3892d62f019cba251783e14e654f24415fdba236b7aac5e2dc40be7dc7be413d270f17ef56eaf437d07d5799002a9c1e697b5f38123cd9a62c58dbb8323173053fed6507fbb9f7db7dbf2ec97aff06dca2c35c429c9404a53259e214b14dfc9fa3fd34c7f4dbab657862c2ced295aeb5f14fd4a4bfbf2fa873cbd984efc6736c56f5c9658627e0ba0e86213a0a217933393be3d3d9ce8170057f4820650e6c6b4475c9618975b17ed53b091ed5100fe938d83e6f14b6bb781f9c0a4bfe0da99f3a65e2ec4d286f9e52b919e54cbb20cc910aa56db98c6d640909efefb5320d4642e704c797e3a6af51deb3ef7ffbdf7f8c3e775f33751bb2ab5dda17ec8270c4f424f046a00264bb30d4c287c51ac0013dd384cd08360b9694dce3a9ce7bf0f0c7dd5e238e991fcd0fe929e1749d8b7e3b707a609913a33756c863f84c9420f2cb6f1c2246dd917824fc2d57d194a6126b0f00a0cfae1c0c054f793a7528cb45b72bd791aa85600cc62aab428d46cb8de3375ef96e0b94cf05982f6cc447b96804e26f82c019f0a8f6db2478575ea3dda1223cb0b78d0b233f99c4aa13933bd7445d577f3df909ec55713df39f1f34e8a73aaf3a00156f30d202990f1c05127528f901729104ae3f525e4b76f574ff57baee74b474d1979bbfced5ab14bab9ed1f62835f82b259ccba9ceae528aa61272a0e5ded24f836893cfa63de88d586cfe7ff2be034e8a62f9bf672f9025a380ca9d020f0e13064cf86ecf848ae23360fee9617a2afa147366c02c6605b31ea2a21c2604c4802c0a2819942808778020395fbe9b7fcff6b76a776a76d8232afefb7d1e65efcdd4f4f47477e52a1c50011254d0beca49b2ae0a7d125404ef9918bfcf3ddc67ccce433f27117ebdfe0dbe60f765cf7c308325d7ad12125ff5e7230ffd0c8c9fc69bb1cdf908fa7eb94c5873c5f83de39ddef8bbc73e3d5433e6f3963fb601ebbcbc25a09044d888fe9681248110646f44d922f287dd4540d058f200e1905e596e29d8666d3267ad3b5c1fc80736f8e6aaabe2287016473e93ee3de18112a832c9433f870f428adc2537d448b41fa43291feef32e29d38f26c31cea481435244463f9775a36661e7f838521a678e679c7ed5066da47cf469fe32f17c332e252487208e890f408cb3bb6f434680c7f49373baa6df9539bb7e98a75c739f509df954040104354bc4a9b884798c52e3c6e7bffa8626186b162c7b6e3d050e529c07241092344a8fc7efa4d26a6d6005d2f53301810a8b332de8959655d079e3156e40696b6b73e326f1848e37fc5d98475a8761338fc954b13e158ce9e7132324f0258d9816eb404a904ca899e3eee1c15fe8c59f34e2bd95c9fa54797f45f196a3f461f65dc9bf574dd487d8f95b2f58a219c9ada91b9fff4d4b7c459b373dbd48cf6fe5191543369cabe77a6de58325aeae3ed77ac5fd8ea14ea189355c47e92a75a575b54a24a1da78cf1edb331f715e6211dc4784c9c67d3db6673ee2bcc4bcf882c69b13c0586648fcdb96287f9830e4990fd3f51a5e5834abe41ef3a07214ee6249041917988020d0b90281d0aca26d8591dacadb0a447fb711103c8854587c6481907060a1fefb9211b316afb959a97ffdfbb8369df546b7daa62c38f0611517482874c6d55599f007659b87b131c402d848975f88fb6cf4cd824966832095c900783f7487e4e0e71472cd7d01075f06a78e209b407fbc5f0fbc9f775c4c0004472a5571745005ab0a3230ce3ce0317dc93111a1ca86dbed14b8ddfa360c1f505675c669e5e33b74e5f9a571e68871e6c48f3390a092cd0c81849b4e5fb376c6e74a7d73ebbb978c4092ca72a8a658f280c44184830849590b4018d92b8719c804041b8cddd3dd00d91b4f7ca3db3efab7f7ac051919caaf82f1dbf4e43a357d3ee8f940c930d789ef84d43cac8ab5b62d41c7addf5c8cdaf6e0cb912a988088691530de1fd538373ea9f8aacda316ea03695561c1bd63aa94faeec2813d5e68a0d4cf277e3e65a8dec9bf2c1933e26b3dcfb33efbe1b988be73ce27e3d7fcfcb35273c74d786ea296e0667d3076dd58bd4266fefa7dff516eca99bc6f2bbf98a9ffde64c2eccf349e0697343b75c3adfae8da2f2d9a4d2aed98f470e30bf478d65b75a3d9af99a14c12416e13c1e1ef24f75726e623bc5df3919324c096e62ba39ab697dc6d4b50554d2aa7b881c8911b06bf936fdc8d54b949f41f5bc714208bf5cf2a2c100eb2853001a1144b11c00215d076b304e233a60f042c04a4941c9a13699ed2face559394aab5a25e2337ae411f58a43289e0eabce8bffe140fd17e9c686bfad238988f0dbc1a1bce463c08734e92334b628320954936ab76c039f838051a578e679c5244ee24527bf042dfee9c46e8b32aab07ee8be0fd7230ce88679cc93826da304d49e514a03a1be84b71910bfc369e67fae09c351e43c883547c52a511e49f4f8176530c219f78c0f0975ed51b65f9bb0b1f5b897a2de5a49a2255158ce52597a04fc64682cb0dac34456b5595e0ccb0ac5548efa3b6bd8ffb2c53cf586845ea9693ae8c9b570b57d33d03b76dd3ab6e04b95ecdb9d17e57c697eb998f64127450c47b8ed99d3e094a8cb7f2c18ac65bbed4f3fbc0c289c3ce576af49fefd57be90ea5a65c3bf28dafbf56eaf7b9d3facc9aa5e7f6e32d955b47623e4917ffade893c457e6edb30a66812bb994bee81e7c0b9f9cd677eeb14afdfa4ee4b9eff5f798bbfea7559fd557aade7e8d26ba755eeaae6aa85a3dec563c4c39a55e370fa396703ee2be5318f33316f313c6fc8cadce7cb06a96e7910995b99ff6af94fc839c5b32d8092113fd30eecbc4f8a3fd4d87aeebffeb16a5a6bdfccdd21f0e8acd57fc7c32240282f5ceaa2b8a6f5a64a08f8004b6dd4d40c20670c5bd5c401bbf9ba956217d1414fc3e73e4b2f17a237e78dcdc937bb81e5ba19f5bb81bbcbb9114f4673264278737a459e8037d3a63d3cf50b4114c9f921ddb6634fa5f8fb1d5e715954c65d21d2a890170336e2a24079fee5970224c007c1c79d8e0a9a6734090f712a5f6608e97cf3be01792838d71048d930209d724519d091b848fa0c624895cdc9738a9257362c992e211e137f3b765fefab4394d951afed880eb3ea9672e6095153616491cc489b10da4b981ecf688acca958d0de48d6546eeb1e91dd8aac3b7558b95aaf951edf2fffbbfb8f1865925553d9b1ecf2347b217e23ad3275b495756c59a7e500eae205d7b4040a9ee1798be175fd5db15076d3e52a965dffc36fcf3e95ab298f0ee9103b464372ffcd393335fd273397eeb7745501e9623a92879b9b16a909c1630dfecac405e6f046581af050212613951ff7f4ee9545772fc7dfcf4450b75ffd737c6fedfb097b5a4f2bf669b975fa7094a9786d35bb9b9f73e4e5d52bfbef2d93294cce955fd9c6489e7374718dd837270f99d26bcf8fd4e0863813f1c8fef8fe7e7bffdad5edff3664fec3717de55c40095d27c8371622fc3d70cac80a4c25e58309ec7e77adb76dbdd040403600984fa03012959e05840dd6f7c7dcbf4dff402a91b6a78d6655f4739ca4894d0c4447d7377a1d8a031ddfe403ccbf4c998c939b070e0efacca6424249a6c1cd06b701006700a499304766523a699a5ea1bed22629ca6df1d0b6f249c0562a2b10dfcb9789e8d71e6e279369e978b7152dfa8009bb2e440787a88fb7a609c36c69998a0f68117117b272551f1c5c69981e7e5457fa7fe0fce6dce051ad4f938eb39bdae572d5ff2d15a24916495155454c481913b23111096401099ce223e558a8c0016284f7373926de8f867c51a3dd3ad061dbef4262df158f7584535baa81867db9d9d43e83d0d21118c449c243910d7997e80adc46f746709c4cc73908a33c89d54d8b4365eb9a6f5142d6b7ffdef37cf78aa963ea88ef8e98e5ff4015d3ebae4fb121006962828abb17087269d3b3b2790ca10991b28f29fbde128a383cc5146df074e106404a6cc10e557e843f0d9cacfdcbfffbe7cfa9085bf2b353bedc71786eb757140a3f6dfb939e46a3fbf4fd6a13747e73dc3cd6abdd339c9644609697497e78cdcbf7e9ba1c147b69798d13dc3831fe39df4c257a3df5fa6d7fbe38591b553314ff41d48454b8419fba0e45ecc1b083d491eaca2a53437052a49db5391e814d90b33334572bb91db6ea3486e37abed84a3f2374efd4abfec1d251d877ee389e49491ad3272d61b994cf5422872f61a53f17b97d5e26e6922da93d6e2ae66c4bb1e574bdcd7d433ee6435918322f37b7104bae127fa8b08f7ea47bc9b3e229fe3e6b7bb1867f7f871aa21de1af71401cfe3c4fb6aac8923e91d8e78cff6cc4b40c4fbaa37969e30e609a5664d19f79f455035957d602067d9ad0f78adb75f3ec30b2b071b58b5c140e74640c70bb9145013a5d63db77c909bf2a4626ee9800fdac67f7facd3e7f07ddbfb22c8134720d33cdee4c8086c83ef1ae0eb9db8c6bf9eff1d8a202ffa6063c96f9a00cf787ff4214f6b82f1c569cf5ffcbc9ebf4d5dd634580f89acf41c038bc108163d6de0d62d066e419afccd389036773170d326c01a8020001b7f42ff0b40d89c36e2ef9b7ef2fece90aeef25f00f8b3da7ecf39233dd710f1df674c4adc13eb1df975bafd4e3da6cafff6c74e7f875b5ed08722728a25e6694101910f4f9b0ed08f2dee25c9119001c276cfadecc0f5b8fddf4e4efe97abd6ff8717421050652660c043af3b94a9932a89c04dc7cb9d436f5b30021693bb35592b6bb25106a1103b8e21ec111806b705d1ff46f763db4d2de99fd88524dd20e987e855e20d62bd6e7e97ac21445a6f60307c691c9e0f038b2d54402732dee4b0d3dd57caf4985c8b5b8d99bc58c8a543e14f1ae0222de6f374911d56aae5b427efe05e89be7cb08e230c63150f4fb21f2be3bc67517f07642c46a2c92dc533b9e8de532e2fd24d4148f457a2bdc9781fba865e03a85eb32709dc275a68f4340cf5f187f3792c85ddedacd7191be729c32e2dd685e11772b23e9154792f3381346bc571554dce3aa4e46f47975f9b3fa08dce26c98b7f94b7349e9c10612a75c02955631245fca75553addc032a46dafc0015709c9a48a529d08f746ae24b9af81218ddfa9e5349df6ac7ecda733deb866a9fe5baef559541239dc7c5f3dfed518ffb62390791e5912c13ca27f9cf922d65052a18a752a3309248920affcb9fcd24d1d95ca5ff7c45df7e87db7326ff147cb911eb21c84b80c11fba5eb309f3f623e3f0144a1ae22d4d62f869341515df451e7a6e439c06b808ff09224422a97530141c859a5456ed894fd9a545a22f2ba02b6abf217d03f52a93f272cfa6ecd214afdf2cc98c563c24a1df65cce92933421497d38edd7a6ae8c4d11e4f062d4fb8d723b542f829cfb5c86629b11e4b1887781bf9023f60b300e05fcd1fb7f9ef5c5d32f6a867b79b7853dff840a8a5557349fa980ef63beb09e4bb02f2a487545297b28b50fad7322201115d0f61401a166036618e035d3aa98bbafde226b1e5df244f1c94ab5a8dfa6cb2afd42358beb6e3ac3a5a40538901947a0ad804450eae746fb1d38421b8184425530b67aaa03b6a1d838f0abeb66eb4fff6cfa490309ab19a0276c05d5284813c17d34ce8818a71dedb2ea05de66dbeb662b03be726143228297345ec1a72a88bae9fe725ce4ce0177ebb53e6edcb5f321519412a40d035515a952d86d17aa167673a4c2515718489c1a07564500330ca037a3025fae2d6fedd43f46bb3680d6a5471fdff876bdc51aa71edfe91e97699205a5aa1d319d2be623037d8fd7996f9d4a95a9df6d3b8aaff2818ad3dd0aa1933e1ef6f9139a43dfb06ee5cfeb9ef3ce07ab0071c03341862e9de695e13c5c0f5514ab08bff1e223a706b66d60de59374f91d29502e23a4ec541bfcb026eef88df2960ae0a5073e0ab9e5e72f6587dce64b63eec8113f57852de4ec9744b39fbe2a1aa1b419ed49b935494c96c7dc027ca4e14e56fdce4ba3d7ff9d280538676f0ce1fbba5932a906c7bc2bb909c4868fe4875c581b211c002017d6d4f131034e62a3d5ac138481b72ad528ba7cdf86ac179fa034fedf8c57e7a81a67e9a3ee1d07a71c8329863b6a3f792d191fa647ccf85ce9ddc6e27c37ba5ba6eb6d256605bd124e09a90dc84fbbc8184c974d0d2a84d6ebc4d038c77d50cd08b2bd87416f0d4c5b8c3b8cfc2f3c2783f2bc938cdc2ce12de662ad0389e23c69923c64904561ca8c9e215bc04f5cf768b078ed207d8c8b75eb787233715a9a44a5090ab14075909d93ea84f5e57d00d13c74a070f7ba5089515415ebfe00a99f18164e3164eab5559afc782854a357cbbc5e357bb6f3c5ddd977a9d8a8f7bc930ef19e81c61e6d5efc51789f6b3b9a0543fcc8fe907474c7bf03ba32b2f2f1ea9d4d482afee7c7a88528b7e9cfefd6252fd1161a5c0331c3825703228c6fcf27c1e97b8cf368fb82cd56eab808e9e22a12bc88d14849a0fb6ef13c34a4a6a2a74f7fcdda0aa61f75452ed900ae7cad87d9bfbad9ded8e6fd3b2353d22faa438b0ef2103c28bf5d9d3227471832312326a76b4e78f5bcac055f84e89d76db5c30e0ad9abcbac2e10aa5f668f7de31dfdde4b96ce99bf6c901918db3cc82961be8022c302650daf10f3cc95362380052a49db4336106e1103c8482337267106b4107881698ee4fb4ff3163fac5fb47c76e9b3df8f4e88db8ee28ad58e367daac59d0fdd6577aa89ee84a370476b71dbb095f86a713b36f043b76cde3ab0283e6645e3e91d3f2efdef1831ce31629c63e2c7453597b9c67b6feffbc7d510878d2171edf8b871f6f68c13f3c778148fb3b71867e2f98c8dd3f4b3a846b8a8711f3ccee82a595f77e59d939e52ea93ab9ef962d0523312aa0059d6c640f23e2925ce998cb5a4022115078c88cce9d201436f28bd5108a2b1ae98d631d6b5bb8e674efdeea11583f5613b65d3f98f1a55c21c310f63f09e61e0f27c6f7d1d7d8f30aef3ce2b7f0fc627d7a917bfe3c5fffb05d3bb0ed4046f61fe9435bf8333a7fd26032c892014df23fac580d0c1930a8bbddc4679f1b1e441aaa607bdcf6548bf7716bf770ef8fb775e4878cbc5f727899309dea8d8f87f9f30fdb83ff4fa99f5d4d883ee18aee7ab8b33cd4d79c335c855e275ecfb7ec135f9e97b1a7c1151e33ce0fbd1be58f79f95ff9a3449a91f27e40f9b0a1521a9a0f8bd1ff0ce17f7854447e72c9fc3b4deb3bdbf276f7f9104c2818644db491229f0f64303f07b5f3d099f96bde94ef5aa39051b22b65207fc9255e738bd10429b5216366feec14d58c2d17b93051206b903077ac770df70e403c876b29d6eb632e27d2cdc6e3b89d41e390192830a901c689c9475b79ade66dbe0784d9f395eaadc4ef32b6b65cb88f7c40159d50e248437cc96633714cdd1339d5ff8d4f8e76fd59be3c9d247493545eea27c206084acb2a2fa1e929040f4272f1e4ee5f02ee0558074841400da06703cd340efef21f42dcda02dde7fc6cc5f6729d576ff63d79f3d59ffb63af46713f70b0749ce314ed46009f236cc467f8a74271539b8622a98e8fad87cf9bafda7efa3cfafbeefe70c5985f7874a880ef6629224b0af48a2639515b93fd3bc929b2e54246493a8b8dc8b9f5548240148ef1f48404c90a18262828eefc18ca8b85e465257d1f70367cde518c85d15df9957aaadd4b225f3bf5f7ba852ad738eeceb9e4fb546d57df75823b1627e93781f2697282378a657a2cc10f811f15ef95179cb8d1b95fae2df2f76795a334e4543370dde0aab0c49d0d20d9dbf8f9024997063fdb32a8f54b479cadb222a49fb8b09888fb3cb330089b0a31b300aa1ec71376cc9335b9ea85ca839d10bffbcf05b4d699b9fd4a676c719fa5566a5aed9bf7382a7d0464520a13eb648076d12a7076dd06411ef64cccca2003645c74904ffd2016dde2e990d82fcbdf3456a8fed0dd02b64ddb9b131b0d15d2c7419a0e7cb6924547163b9846a4f8cdbaed638830a4b753504936d510139b836ffb06ec22fe729f5e9c2e7c63eab0fbea29f374ddfbad50c8ce2059853ee6ba02420acb222b7533ae0c84d57a83ef860a2b4ed71e9dbe31b138e5cf433bdbf87f48a707eae7ac435801e909675836bb4af51b3f6a2330f8c435280d51fb3b999752675e103799ddae89be4a04d45812abf4d2f7a7fe53b9553b76ace7a5c8d8f073e3345cfd19b9b8ab7bc82f90848f7cd9cfa5cfc0e022d397a72df65151508728548d247f556e4c12f09b3efe0a27e9ee8033a825030be3ceff3e877ba8e739ae1b9cc796bbc8bbf9ef9ed2f33f5f63ee9c4abc2ba9f529cd2b9996bde962aa96405a5628c9a8d7734fb69602023e8c137e3f8efef76eb0acdbbeae73e0bc1e0708439158822b774b23d918d4fe476e3004d4a5db2c8ffde1e98b4fd5504845a9e01c4c971a0a1e8d3c68c37be6ffd76c3603797cbf2b1f3cffc5a4fd4fe9ddb4f6b7d8d52a91bd31a1e7c6d8267e52bb8e5527a73dab88263080a20923688eeb0310c807f44925adc496d1063d9ebca2cb01d0dd00b33a112a933b633402f281dfe94ed0c240c26a8b9e63e11a782036fdd0b2bce1f3f5e7fb6664f757da991de1c2f6fb9bd085e7b4c38289e000759710f4088f864ece500411190c61c31447be67ce9c001a1f26da802bc19181b3a0a9880647aff1e5aa2d48a090b3bfeae39bd8c9cc31f3a42738c29dfa674ce3cc883d360cdc0bdc99c43b24158d690d34560c474ae0b96a6ce993ef871a516749a346d16fc838880b29b33248a22230bc76c1d225e866d1aa492a29c4a24c9615e1d92348860900461a3df9bdfdddb643fa8d9de2e7b2a45c4f3d058699c873e7de730eecfc5effaefe545a5eb5c09a6ded0c68fcf3956a926630e1873c9ab985ff70bf873c7d9e8e79a3ef63d4b94017161858919d6b2fb4ad7ace9a0d46739cfddf736dc99652a1e628828ae83bf13314ce4cd86efcbaa404884acc222d5556feffc246f7bda0612d078e061f4a54d041b9c757b7480e88363cbaaf5376cb953a9af7f7b7d7aafdb35c77aceda7b5e772732a22274bfa7d9b00df44ea6834e6283c857d103dab910bafc885797bf1dbafd6ce0e92eee0b639c5e5dabe3b395085d39fa725cd9c2b621c6a96cdf389d78fc2adfeb971ed3edd2fc117ed18fe9f4b33de3b439aec43ce714e747f7205fd2744eedfc2ca586bcf5e4b12ee7557e4969334a0ee79338b07198632689438aee14e8465e56a40b26880d54253931aaa419d078dde27ab68190aa04ebcf3da88b9b6fea553a48a91f6f1fdcf08695fab719654dc68fdb06eed8f717b60c87be07e28fbc362227ecb541551e51b160cb1d4a4ddffccdb01fe0564b121707ea617ed87b4710661949ce8443d828a48ebd4ada88b2bd9079701b3022672149b3bd909f13a0d377e8bbd0381ff28e9fe6a13c2ed9e60ffb7e74d84c2d01977f5cf2c44f676cd39611463f823eed2fd3e7f5bf6d1b5fd9d8b2e3dca49f5faf7e7bc163e4464dde700fc4c6e5b6d280b204acaa123611b2f1c9f991f358fdf6574b20d4228921ab08f2d00787c91c838dbe9efaaa0595ebdcfb167d31eda9a9f594aafb75a3bb7f395f73108d1b3f78821bd1bec0ea5c3bcbf3cc0ce08a624bc0317824099fe49005afaba190689a52ea942491a8413608728bed847a1bac3a4b5a235a7036901c46727c0aa9a0308b4272c809901ca4089e2bb2c006e5e00af62e19eb1927249e67033dd20000800049444154caa3ca87ba1b66f26923af7976ad3e60af1c72f658f7ca91ce264ebb4e1b8674bc50a530c188338646fb58d7e44dc48483bc73c8ff9d4478e2446df4893050cc49508b18c01274d8db9792734813bc92f95b4a5cafa0351f2cbbed3bcdb1ef5fdaaef258cdf18756a76c6af140c267640077d8e0c6aea0dc5f6bc87622243de4e05af3e2d2b1a3f4fcfcfef2d46f669c6750920a8f732441a2209bc756a8b64a496585dfd96b8d5454940e9ceaa5d07c1600d2c12de6b7da12c68eb608609e80384f1cf1770e27a0f3260c988bbfebdf0fb832eb3e37f757bd48c3b6dddcacce4111e46cd3622fce0cf38c00491dfd8aec8affb9b68ed175deebf2689a3ec78e99f1d41f88df609514f601bba5cff3f6e93b9542526155ad34a2c3fbca2779d86a3bdbdf4402e11636806a4f578d07840e95bd2f28bf3d71a4ad0d242f91a20c7d20fdfbcb5bc7eeab0fa403078f3e671f2d994c58bbe01d3d7155232b07accc8c7b26710c4111ef170644bcdba8617ebada662deeea46bc3b594e17f42982381bf76db366368f5346bcb7445c697f6f847a825af10923de7db5e8af412df9b037925e2f3a1a97e3196740647ee59d95735c4e7c79f8b7b69f6a517b48a727b27a757175bddf1d3313077cf1b3800840db8a0379abd1faaba263007301efc6f51420380d1001826ee548b75520c2bc92ea7b50e01445e2eee046a29aea24b1502df5aa8f00c1f9961f65a04b10d79eb5aceb86054a7df7e2db9b2fefa5d4fa352b8e7a70a6be765ce5a7cbae49f010b94e6d451910bceb08dfabe2f48a6c37427bdac0af5f183e09cf072165c9830e28cc13a9a64ae877ec2bf26ea3e492151f1a58f92f406494a00c13d2bb67bb258b5dddc20670a09c5166b3719e22b8697dd0f94292ab1b883772c1ab678eeaa67f3bbaacdfa433a3fb26610479dc3e8d3e554690d33950d9a5a2b4d82d0075f382673fff4ca9a1673f7ddb9d13955a78c2d4cf0bb19e4b4cc873ccdb4d7abd615f9420854929e277caaec3f8b1ee99612209846c4f36607fff9455affd5d2410d9e88550471ad60ba584570ccd83036f12f2f776b061aa36eb491eb4e93d97822fda326dee143df16b2e583a6aa4a6f08df25a6eae5d5ba9f409355f3bf860cd096cb55a44d34147d8a869227fef0a8878efa9aec1184d2470402dee6dd43236c917a9667896157d5b2dd1a076322250f31149df097c5b4fd4aceec311efa62f22deadb7e9efe0847aa296791f964c2ec2fb7922dee3bca32ec2fdc668fe86ba0ff72170922d5634ce0ce051b82eda776654f67625855537169eeda6f11e7dfec0d00b6f6882317bf449938bdce8d8e2a94593cd2da5f06ba70d41b078898145308e93bb28110cf63a815b6f296c60954702526a121ce894a2c141ca0d07a938f88db6b751ce029258f03e9cc0330c084e922bc7e8755a5e5a3ada4de9535038337f9e269c4bface6efa8996c49aefdbfa81ba75f4fa1c5cf3b5435c770fcdc9227bf56a3c0b91ca58477db8f67cf47b6dbc66f5e73ff4556a5eebf133c693919b2295895060be8a6f01a448f25c5cf7878144402ae840fad9c02a404a5144df5eda1afe360de9cef97cb1013300c1a038b6ffbeaa82aa37dcefdca6d9d1fb86f4795173459dae5d5c964f4690d3faef09c983ec323817b6feb461c9af8d94faeaeb37521ed18469ca355f7d39493fb7b8ffe69fb69888320e842d39d4c0adc420cdf542fa7e25fbe0bec30d2c0781af4837d0976d370c4836a2016a079bb5a337eea1661b40eebe246a5af0b60941824a79c4c0d454c0470d4c433d87f4d30dac09d1ad065255d4d222e9be3533af6dd64ca943ea865b5ea245c17aa58d979fad3772e8b494468d1ac586e24b72689b842c7a81a060933517630dc78f3ace3bc6abf2e923543e03d0ef095584ed353afb8cd0d20d508948f21ccad66ac6b51d11ca89555159f0fe998bf0b970e271563c593e73fd7abde7862ca9fc5e733c13bffde2beafee556add172b6edd0486a092b2b5922449ba5be2f8c8dd561c783e9dbc4c578d03af02aa1ae6bc84ad43eacaf980dfd9063cec9e1e31209403089543da1106a6c206920e5d37adcb1ac8fd54e309a5da1d7542d7767f2a95f951c70e376a0258ebd8ba634f7d34faac309543c0b3c3e6d9e6e985f7fc7ac7f35ab298d26944d308c6c1b643d88e8a88a3c5a147d97437dd81eb288219f3cbba7472772677580ca1fa69c0ff5e8dbd3ce93be1fba588f3c44da514ae77e9afffd292579b4b8e29ffa98bf265809049294b4ed9faeb6fcd959a3f67e2ad6e4dfe9fed2ffe37f37c838f032729ee4dda38608ba11c63ec05777c62c8650828be895457e40587f54e8cf6ceaffbbfab04422d02980748bae602c00cc031dedb7c015e8bbdd7b9c9efa2504b365b2b364c2bba58a9c54533c64ed3a2e4c24953d33fd194bfc63575be993f5f2f9aaf6b2d4e75bdbbaad2fa367373f9740bbdef12262b56f02a7aa0ca5adc49dd6c65c47bb6a8a827d377e724cbbaeaf54f8fab999d386d7d6c9c1918675e140645bc537a78789b390f54ce710f9c4d9bd67ce88af4f39f9db4e103cd517ddbeeed7fbf5da5d46f23274d706d50c5f3b78c22b75b3606524a05e45422d19b75b9e455026f124ea141de2564cc953a7910204a26c77106bb9b70502bf0e225ee9374ee1671a739e2f964d4cc0324ce30434bcc2b962e700b282d7c79f2f831eef8dba84b7fd0eb719f679a5c72e0937a5dfe9036bba5cb2815eaa767c6b0cea933aeebeb5a32db327cdda68d4836c8f34e11cba433271d3ba57ea182437410891421aca2c230399ec29613b297b488b7cb2c19be1f7d4797d014b69f7dc9a61795ea58e7f4f3720bf48fedd40375bac6f65fc9595bef9bac25d0df474c1bdc5f9f2f5ffcf6e2b9eef42c1b38ffee15a4faa3c03fcae54569efc93984e26bc0301161a78c00e49e5b2ee23b2a64ca161161ee0b8c2d48381bdbd1feee12886c1103e23f6814e2779248429048524e319038bd347cb0741c3c35e07e980e512f1d1c60da63dedfd3c66b1cb7a53f525373846daee8d4b1dd4aa59a6f6d5d7292e66c6bf5ae5bd1467368e967d6ce3d584b2e2993537aed333d36aa6a4b0e739062b22724073b201ea08f90246cafe42025891d4d0f5f59a762999b5caf7c63c9d9cbaf576a73cd75bfcc7b4d6fa06eb38e9a3849138c777e3e72d122b75a5fc585c499929fbf2f771179d151d237923c90f48db2e6b22421385ff23e61ef128a3778d00b2b4d3a4acef2bcc70847508b18c0ebf566035390543024d667eaa906b2e44ceb1212740d482ae990506a6e56aad5c8c31ecc385ac38687f4f9b726dcb5ebd5df98b55aa95187bcdae83170d0243190ff3f49763eef35106e8eb301072c250ff66e0c1b1058437b2f6b7c9ea0cf1a0e30daa9a719983e41a92b3eed3bb34f58cfc5a4cacb5c82baa4e79cab7fd0d78f3b20ff8e25b061d1f723092605f888a160db2e24058ec711927711050eca887eec2319cfe4abef21bc0b77ddf7dadb0808b5880124724a5581057745df02000746aaaef4cf0de40dfb98b7cff0746f5f6ef45470c6295a826970e2bee3ea7753aad1c21637367e45e33ca3d6e3759ed6b071cdc1aecd25f5fbf4776b3ea52f1e6ff572c76b7550b746399d4354dba859f432abab7551ec552963b16e207fea32ef64982bace1dc37ff759f32cba8b3155d8ed665e63e67ae7393bb80ca37960e71dd5dcb528abbbbbaefd2014583dc0364cdf5cb2e5ff789521b5baecad82a74da94fe9923834564af8f7090682e52d33001211d3b1112e2a888609ce8859cb2a2b3173fe73a42dd0e075e447f19e1902d6200a9b6422028ccf08090f03ac5fa4c23c687080741acbb1ab0f1a4c3af3f158c133150d4e8fbc814179cda0384830f2c541094f3cd1c2d4920d20d746f6fb601fc9d08d2f7014c032171558c513801f04903ebd4c175743ee07b90ea9d244e522d717c0649e8c438a14fce419260f07d54d783548b58f755c22964d713fabd9580508b182009090770914e9308c9615e980aa3136f5810102610c419c21b2c6dbcb89e16c8a780500d50adec9493bdcf67db4d8e183771a8648cede07bd33ddb8840d8807410531d1778b3c46735755ba5486227e377e401560e6f114ea34e816de5debe8c33e09c5522c29973fc8401ff6ac2211b9531803157ae4f863f1ac89209ad37b10e99a010a7fb88170fad2b960c313fe542d7cec91331efacc292849a525e8481f71f2279700b1bc03657fcecfb2ec4809e2e20be43ad5ab88e248f142f5e22bc559280906a8b54b4987fb271c81c60fc5dc8c64784ddf1becfeeb34da5ee6a847bb8850d70002deadb06b20a031bd5c142a882c4e0c0cba10a1fb8121f9c3e7c05e627053ac854b88fb24a8c080844fe14480129901a52f03b4b4404a9c200f02ae0b5268b7e8edaa38d0f5c8ccbc1387cb98928fd33057ade893ede9b0f7ae26045c05605d5c87e0f7d72b3edec85952778f155e17747a8529c30a074c70d277ccdbfaed1b84c121d5515419fd627cd33b95b82e1a0f5c9f34db5ac6104a7832705de3accb0a02f8da7155059955344f9d180142f83038c395a1c74be38193bc13beecd2d6200c789d0814f8498246e3a1fb01e2d48060ae7818244920a15217f0fc22308884c1e4b92067de732b87f57e2fb5491c41110b0b9fb0907b5bd5d02912d6c803701b38a25b9830eda221db4e0fc885320af2e3af049224911a26c2a9449a4db4cbd15fd1f12e36742421208cdff58316e15f01ebbba450ce085269a2f8218aa21592783d36dcbfa0d32bbb2c87e5b3113f0bfdeeb181f491a528516c469ed2d075bd800e9ad25555c969464c9b607c2429c700a189a1470c8b46e99e31591d8940edd2721922e9e0e2a996c0fe3fec7491eb2850d604984f62bbe0b7d8f14712e30630915177d0fb68111a3400484f60b7d0f620cc43e621522ed071167238de37bce1b6e6f9740648b18c0eb1b134c924915fcf45955441f000739492895d8a02910f52b2142a6c08d2e04513f85206d6c10a0907033e603812412aac468893ec511900d049ca1daa2764f23fc22e7933c881d3c9fbc6d48b75a0509c58db78942704a7cf0904a8b36c828f13b119883c47d64fcc30672285755588c8fc6bbb7e9e2230638610359720624826991bb2511568af8a66478a8049882f52955a5167e575049b16e1c2a2b2e814a121d491cf83bcfab7003dd6be679475bc4009644b07fc98b939d08305f0adfc3c139e040b2e3ef019b8682ad89093a9c45f87b200ea70ae70a13187c47a74a3c5fdaf8a497d56e6fff3402225bd800aaf5ab1090a668e32020870eee2a3ad049e70ee36e08128b850867f2e70f81530b216297bc6bacb3c47d504d8540182c04c4b1044204060190aa55d237db3ded2a2f245520135ad88eaa28e00a91d75517a08f886cb6912010902280abe0865d05c25c85646f74305204b783bfb304d45d8c8772544112dadbe20eb8450ce0f5490736a93a6c40bca745019158375520ec15f062e3f586804cb6a521a2994a94b21304d9b41aa28fefc811fa34aede025fbeb76fd1efddd5ded9f03e5c039c20924a2a042ad33aacc2fb32e389b80e0bb63c5215f2bc50013cda0fcf7a9f47dfc181130947f45366030a80a5d2ca14584deb251cfc6abbb7fdd3090835923810c8c6120a1d40c268cc111644f1b1404254a43e823eb295b24a0cbae310227759f4c586b6f6f1f65975015b8005dd342db4bfac8150d2c1c32a2c44ca3acb00893382379583dad3cc61e1c0639d3e7170c4e92215066f20da50b6f7b9ccf1ae12e39c539d97d90b1abd876d00af4ffa0f312f746054e180b3d60082f072f4f379e2394845e280602892ec40c09930930414c1dfc1f8d07ae7030b0c183340bb5be5ba9b9a430cdd50f13b1110aa4bd453dc88f7ad0aa3ff27fab061f077682beea3752f55502471df0848eb9fbe3fe2d75456c2d7f80bda3fcd06b2b32d62007f781b7dd2855adebf87a81f4a7c1dd93aa48d435ec73a57e2ec68c1ee6123ba6cbe5c4680b2029f34daf1df49f5618bdf855717a5a2f1d95c8274bb76c038edc057f967b48801bc2e88e3c7c1266d68bcaee43a0a27c61bf8f7b0c06f0bbcd4efa312b748c038f65093ebd4f777a9b2a5835dda12e8ba1cef7581f31b09788e7cbe7c0e8d23c9b8fffaf6ff8b0492acd906c885604963b72d206d1821babb3aed86afeeb74fe854a58e79ec8cad75ce56aac9432d3bee73ae52b50bebdd55e75a4d5c5aa62c8e1ad95e77d2d4f59a6b79d3f9dc72259d03f4fd86e3eb15e55c56eb63d88ec30d4700759b35573c759ea77bba7a31faeb8b94e1c7fcdd5ac8d79bfbc9b1e0e618e668ffead0b7ee73ad5be80a15e59cac2f4365d1837d95bacf95204a5a16854ade556a43fecabe9bef506af2daaf9f7253962cf978eebc0a18731dd8867c2534c92b8e6c1e82c028499068e30a6f1696182defef7bad6a2ba8850d600905ebce92bf538b00ca830bd7cb1441ded05215637c88513a3576dff1cf743ba2865e59077538eccb7afb2a556765fdd13517b96aafaab91e4276b1732dd5d97055b34e4b6768743ddfa6c0675bd138796b8142bcbc65e4dc5e588737a1aff8efbfc5bf8a55687e2fdfafec4cd7bd7bc584df5fdbfca552e353beb8329a2961e1daf57c109fe69d176654e81c0474e065c5eb16467207c673ae8d4ff3d4c7fb3bafdf20afa8b04ad898c0fce5aaa9eab6ff5f2510da7824b286016dfc2e378e15fbfd3ceb9661753541c8fad709bf759dacd75c4afab747eb051bea9ff2d8e1b7ea6bda85de6ef387eebf199ad8c20d5cb454dfa85153e696c253e372e750295b332a99bb4a449cc7e1c3a8ab9d0bcb06be1ce08b005f0ef045043e1bbd20fed2db7e503fb85e3d55af55951716ba2e8f95df2db84ca9d29e45ddbed71bf9f73b674e1b79b75279231ece5f4a2a32d2bd1361116ea7acfaa2be9080b84fa27d77efdffffe1b71275b18d03680d76f90244d90eed7fd6b073e795c132d11b6fcad4df7cbf4ba0df54abdaffd0d1a8e0f75683b58c39b42b96d96b96a1c6b79e368a4bf35c60d70d4abc53c2556d1b20f9e6146c5b9d7c4bab2d1ef233224d8de0a7efa5f83bf8fafefc527332e387a5968c6c4395b9db3e5680d5fad4a29cc74d54b1583172c50aae2ea8aeb16bca9d4cae282db3fdfa8d41ba3ee9ee7964c2e1eb7e54d760f172a26b91e7deb8f246e257ecff6e2f349d461b597b6ffdf0808057291712b82be543de925fadf55cfddbaef6b4a35bd63ff79975ca209c592d48fcf9be94a25a1f1c70c77f977ab221a21dc412e6c2f7f973449219a950fdfb08b387715369e0f9f02be08f07937640ef7e7603c1d802f022c1e3e3330d58a4c918292b51a5ff5084950d31bdbe5b02a4696771fa30ffa0d9fad9efdde337a037f78d7a4e123945a73c31fe754483752f2d6a20d4c8183bd459f8cbfa4331692c83f4e32b10d88cbf86afac4f044445fc3bbde7cf78dc30ed392f0c6fa4f5caa097b4af394a74fd39cb9f57ba8c6a1435d75acd5075e5c8610f8bf7bd8e016a97682d6ab95842149ca580510a25dc5f0a039eb9c27d7eaf7aff8b1ecc2715a02d9dc6ebdfd4547a53ebff895ab467dadd4ac93c73d568cf828197f210b8871802b412240d2fddc06c41bec7debf39f4e40c206f0d224c98308c9c54ad56dd3e04bd76ffee606afdc75c64f4aa57d5ef38a1b87e88d7549e8a6d3ddc8f453acb1513f7b5ae8b69018628423d9c11fc67d3646b3472486c05c5882d3f3718e010470473768b2567955e569f335c15e75d992268fe979eff7758f15a3e00ee9cbf143fef244382820eb65031d383b54495d7618fdbd5d32891840465d5ecf7184e2922beefdb46e5da55abf78e491572f8d265d2cca6da599a3f3436f1cea26b16482c0c93e693d58e887d10f627c4cdf7fd01b7cb1c264169ee2c1c77d99955ae480f311b01dcd26bd83cdc972c66efa424bd02d8b370fbb5da9826b66a5bf71b9667826ddfdf81ca485e7754801b314f84a714b24d190242d55b6c2b6e7b3e94576e60d7667fba712908801be1427cd946a92d3b224454b14d77ef2d4c8f3ffa509c62b356add73affe5be75051c78edba12aa2e4871d5073dcc6c1df67070ffe7c98d02fe23a1c11735da0c460035fe2833f1f7fbf88379e8dbf6e2f2769eecb0781bc08efb98b3668502bbfacece1896728b5f8fa5f8f7f3455a9d786ddf1d464533d3d963c6eb4e8534022a9c468a312874884c3c6efb451c3bb7efcbbb4850d905e4e1679611da2d4559ff57dbc4103a50e98d86ed04d599a607c98fae9ad6ee5bcabad798d676d839190ebcbf2fa545583f1d9397cbc7eab8dbfba8484f027dc6f3bdc5cd5983ef8cb524be67eadcf8d82b1b39bbd709e5e9f9fde71e1346495e688fe208687080af5a5ad4f12149f71ebefd252feea01eca21636804b8912cc34d05549ddf29ffedf645eadd48925e71dffec417a832d4febf7886b2cfbb7b5a079f3b8859821544516a735370b310f7fa1c24d362c297d50f64a9686f5951a1584240fcfedaaea98ebf0774b6c1c2a8599419c19927767066ca0ae286d4b7d4b96c6c5719421383fcc597464f1e3eecaf8bbe33d88c02acfbc64c630ec4c4bf9352567ff2b946a5cd062f9a5f3943a36e5ac4eee86fab1eba7fb4cd31cb433c35948df990237991050c1201a4944f40bc4ef79e2f7825df106bba0d906706967eaebf768f8e4bea342b728d5ebcbb786e4dea954a3b1cd6b7d76ae9e8bd2948e679fad5c9373ddda37c57d97d8411cc5a2bf5e0f6033fd08fa19fcdd33cc7d62fd5329d70c71d05b027f21f0c54a387bf031639519b0bf72846a3693f1e761fc1918ffb6c71b542f6747d7a9e56ae5f4fa74529bb63e4dafcf035ad4bee24da5b29b77ef79f0294a8d9ef9e19bdf2070308400d910dcf42939236708a09185f1bb0d18f1fe9dbf3faefbdbaccfbd9e80840d084c09a1e11d33dfbdafb3e654eb5cdfe0eee1ada21b605ce793a20bc9f0b3969018620b3d8267781762064b20c6d9f622e6e423c0e73df8f37c12430f8cd13c9708d61cfcbd13fe4ea27b266d742131f410124321e333ef910fefabaee63d59b2caf4a9206ce0cbf08cbb5010c07cd411e96af5c3dd1909e7656737a86c6e253e8db9e69175da9cd852a9cef75e30a8ed754a2dfa78e6033f0c526ac386d55f539d0acae1c592751e600ee3327fcef3f6a5fbe45f5e492f62001f1c790684f44a68f7c1b193dc142657edd337edf5e7dc3203a9a7f72ed07f6c667d56c7b576c56ae0dbd19b32a85e4c1023216aec5b98bd0ca1eacc14eb97189f1c5ccf12297f77c2efc5470c490fb91f02c6dbc3871ffd80751a63d4c47859f58afd45e3e78af63bd6ac284e95ba5f7a797b2df9e5fcef92ff1e778f52f54e6e3479da614acd1b3671e566646ab010c82cbd3bb9767e2efa79e8033221e983df6dc0c84e8d7c17b4d05f3d801d6c949204594de9bc706d19b73df2c6191d224add97f9e1d0f73fd007cf05b53ff9de55750c745e77bda29c5ecad41e478deeb85ae261f33b6a18a3c6b4fe48a6e6346a8aab21a8817c3a6aa2f752de5ae8ed4d9f6b8ca346b5ea8d38d608d730bf49e0cbc275a8796daee71ae543ccf50ed76a1735d01df47be33dbaa3e42ee313b5cb8770adf230f0f5f68cdbc17b50adedee2a2b1ebf9e97dede7911f340b5d667735cef2e69b5dfadfbfad95395ea79cc8ba3bfd51cf74dfd5f38edac2bf137e41eaa81ca93e95f1898b6dec054144c0a217b72086e99e4c0cca49502fbf6df9523df46cbf23e979d3a9a29d5e681a36e4bd59cedddbf0ebaf1c2214a5d70e8ed874cd5479e7556e8f91e4be2d703d5e446dfc1fa89d5d837eb275663ff265c87f5c9b5ec69bd9aef68cb9adf8caf3fae33d747047ec2d75eaca3a0f112fe64e395fb4baed370d078057e1bfbaf373b39ef92759a3ebf66a9cbb076ce38effed18d94ead3e1d3d7fbeaef9873f1251f1c8075596ba28135871958a38b81692d0d4c81a332650de7dc667806c78bd13afdcb020bf73209842936118eba0686f446baabf3c0963d0af4c7685efbae2f57eabfadb5aa5c6f1375b6becd3d286e47edf02755cde84d61d82ea68063a2f4003670f7e1eac6d1bfe88f66fa5df1f96e578703df6ce03335c5fb015327d442b7717d0c5f07e0335503baa27f3bfa7d703dd556ef072f2aa8b814d56a1fc9e30e47fb11f4495ee9ae4c65e5662cf866e2b961e0234e54011fbd6d27e06b0a7c9d80af03f0d14c29efbc900a0ff78fc47bc4f0992765ee24c787163a2074627d2d8934fa7ebfaa73de53aac1a9cd668fd75f76f6e4f1456bb04e426464a6f5b22f6e46640c4b1a1429938b3ebd214936f9bb62c4095a18cf856d87eac0b892c6058d6fcfa8a3bfd0491f759f32448f2ff58dd49ef7df161d5b8b669ae0591fd17a404dee91b09da146b75ec7a8814f5e785091d27aea84fb6df45932c177cba4f5eaabf94df88a701df934d6c175a6df83d79b771d058cd742cd7e9564bc8c8ff717fa7d766cbc711611acd35d23415b2badba692ddc9a2db59a1c75a6526df38f742e7d4da903b6b6fdcf2f8d959aee7c3ff44f387db0aa8b522b916deb1903391b32358a8807c9f3852314ecccc8b7a7ed25048408076f383a2034a776d71b03e7dfad45c69473d256bfb0c188e42197f796222de9fc5192551f70fd8035c35c87855318647b80086c4304865fbaa6fe51c1d29ae253e598bff7205d3089f401b6873e166aabab6812ee043699305e7eac075f4c34cff08c7b2497ae9d82f708c7bf07eb8c7d3699009df94861dc97aa03a9ea504215219d120a770d2189aab8f4939a3cdb6245a69eb9d1151fce1b0e0e8f0f875cc0020302dd7bdf15b8a9985707effd3bddc20648d5ab9bb9e0aafe8f0c6c74817eadfa873c3a7cb3be666668f529efab7895615ef4e22c43f6f4d73d241e2b3312f4bda5b139f6fd73cd75acea01fe242a2e52a15a02bf5c5f36f0fb55509909c72b55b201ebdfa95fd5c4ad1d5ef665c95b6b3421dd7adba6d396680e7d53ceda110bde50aa746151e3959a23af9c59317bcb1dfafa6b9c196e6126eb736b7ff7bcb06aa70c4cff207a86e446d747d88c6fb7a9b8d0ace3ad9a35ced0f4f2f203569ca319df36fd8f7c60712ba5263f3beaad82025c43e75c8617fab265cb759a8bfb07a21f062cd8f9716fbb59bbfb013bd96c037c711a2ee1683af0bc871f76a58fd4c60f3d1ce5b448b318c1bfa69fc307bf39e8fbf8bc3f22789ab91eb6072b99df3b0e7e2b76f00fc558c39e5163215a7d026c0ffeb88d2077601bff9a71260ba4ea6e3849cd9d780f7ee115e6ccaabaccdd90eb87fe79c8cc864aadbdffcfe68bae526acda0a5c3ff68add4ea17ffe8b57a8de6a41eaaf9a4ab02aa734b83a1b58f566affd7db4e3ee86a7d70dfd8b2fdbf062bb54fc3c60ddbb5d3dfa379ca996ec9d5a4de31dde1b63c5446d4ef5c5b76c182579fd1b2e673adaefbf89dc5e637aeb8478593088a8a87be825522f7d04e7bc3000fbf71c4009770fcdfd17d521bbea454cb21ad7f1ddd595ff366e8f9c30e57c1713a63b15ec25c02d936d761ddc6d6b19721925e81e85b7d183fed8b6daed7eac61559b140432f0321f1c7dc7573dcacb745ef6f6a5ea80fc4e55f2e7a69b2e6c47f7de98733a6d6536aca41dfdc5290a7bfc5ad55abd84d5606f8496fa6480c663cd861647d2d9b1fd7bbdb7f0e5fa754bb538efefc0c2db9d679b941fdb6cbf5b778c03a3e5a386a17bb03fbda58d5d775fb5d7cc3ac7e776e51eae5336f3eea8b4de64fa5a2a433ad5b99769f0b49492fae3de65df87725206103a4ea216a146ff2ced737acd422fd41e9435efe4599051de524e48296073f1f5c66830c95077000a71cecf76e8e83ee4680d4ff7a321225c087bf061efc7410903b305ae28da982dc13e5b8c5bc946e28deb24673d4f3ea4c0c0dd784e0fbe683bff9596fa0d5d72f7d6333158612f53d387d3b6a8d5396504a6fedb6167d5bd7ab7b8e52e7bcf2df3f4f3f5da956cb3bac38ab9652e9e7d6287439eaa407e02edaa0ce994e5d371071d8b503be385faf8fb1e3f31f5908555409d2c9134129439c0913124adf4f8404f1249c057567736e897202ae31f5dc26b74c724b1db71b74ecac51c7baf310fae9c48a040c90747725c9776e124662bbddc1b7bdbeaa1b572423c683189f8ac165cf6dbc4da985d7ce58f055b152931e1ff1cdc4a795fa6df5d4f6ab90ec4406e8518132ae8f416eda14f7438444e654132d9e31dd2f2da37bdd7e4a759df7df534f0e6909e19e8ebf5ca8bf7bdaf1351a377a396e3e6cf1fe3bd99cb39c7a6e05ced923279c7ce3c74abd73fb031b23f81b5522a4daf55cd256961afecb08c9df558595678075b58121bdb16ebbf9cd87ceeba53fe8313526bcfd968abaf5b97f67cec812aaa23c293140273b4091c410d589c689dede833f99aa882410c6b773aa22bd308d57978c1cdf5e5591e58d1c77d63ac32af5425bb4f59716233447fd66e3bbafed7fb752d3fb8c3ee237bd708bbedc34b518151a99c381f1984bcca25f8eaaec1528454b2537ddeb378f5957563c52a9a95bbf7d7c96e6a826ffe7ebefbed2a4b0ed9d47ffeaa67ea997d6e08ab6e3310f99712a8e4ce1d5b593eec0d642abcc5561367ffee04f9b0cd704e48921bf4532ccdf9c568057011600ca248f74e05056541c48568f1d1991f2d999dcecb919a587eeefd68fc97eb1fb231fd5d0bffdc76a71da872ace6b891816cc03ab8cb08e07324364bebf543d92043250ee0be0cf11f8c672df327d1fe1b0d1033ee10e2cc7db83fbe6793d0cbeaaa72af34a4a94fafd8c19ab877da1d4bbff7d70547f2d234fbef8ab4db3f58e5c5bb4a2ffe697cc83b9c4eb5b80587f65afa30fa373199548461d8d72147a2ba3f5faa0171fc337013521da52b5614e895eafd35f1a3d7cde7e9a905df8d58523f4789a576436700309eb7769bae4e0befa2cda907242ad1be3e62373e70889b5c02a73d741d34ff77ff5d4a57a9fdcd430ebe71b949afbddcf43d7ac35d7500550525d39229e890904fd9e011801cc15fd5dd6fe6e1248c400aee075b35237747b3ebfcd377a6237363a61d299fac7bbadd16e52c26d04fc4989c136d7414240dc86255545317c36ee4ec68199fbbb5b9068a80c545289c106be3eb8cef31ebe1c41313ffd3e786ed833ee0055515593aacfcaba2935eadc7787f4bb47a909977d3e7c3e361e979a254e9b2ad1d1ef540f850a3f550a48e9d9856e96393a8c9c0b6dfda8d48513ee687d8216cd8f59dae53f7777d2bf2d4d9d58bb9f0a5425ee74c4fb18157109c1f7bd06e75ead8fb8e127bf9e311df51a88a32b46019f12a4d12f433d06aa155e81b4e795548f4170b6d59644220690249d728896a47f7a77c8bd5a024a599f7afc238f6c53d20d9b5f452068966138b4bc9a4cf235f8aa8d9fefc377f1ae2f9f4a96f0fb23c84dbf8feeeb795bfee7c21a63341c76efab5b3f5daffb072e6cbcfe7083992bf15124b7286d2cd723d50ce7f54b017bb2467eb28c0311037c9549e3d66d14ea03bec109cd9ad49ea8d4d5573e3ae1cac54ab5dcd26659f7598a3520bb4a82aea85f3ee68f3fb424b2f48153bacf566a9e3de9df2b5698bf95922a966aa6a3e473b9a8f4292b17d2fbeffa54297f17021236800f20fdff13979edf387d9852c7adec963e417314d69fd6931d37051f983e559114356163d0c73d490c73e39f99f4e0f7e3b381af0ff04580af7a07bf24803652a3f44132c5edddf842b73de3a631cdf2ee52ea93c6cfdd3b1aaa18b92159c280ae953938ba4e88ca95e00cf94015aa81f8f89b28c406e492c07a639ef5cd75271fae0f9070db8b173ea32593d0d050abf474153bb0923306dbd5b65ebfe9a969cf2af550dd6e5fdd081b4411fc758aef01446d71d2359752adf0190656a07ec3769776b50de075ad19a2ff1df97a8dec0b94aa19aab5e05b577576b26523550e1152dcc5eb2c12fd5dda32068070f4c43af6ad273ee83df892aab8c2162490c07d66630e128e57e29f7ac2b757bff186261ca7f55f376e9cb9900e7c5e8fb40e2149706df072efdfe977b20d708964590a99321088e49c7c70d29b813521776e82b2c22895aaa512c22ebca2cb83a373f4fd879f9c73c15dc7e87b4f0dadaf556bd71192ad6f6dec3646afaf87e69cbbe946d42d625b1e6c24bc4e69de683ea87225a9fe0252faec7cfb9ba8b0d8cfc136c03d80ce2feca52ef9440ff1fd94e76f724bae5ae200cef32de88ce8ef41816d8510e46c480c0385aa282f89c420039cc83bc5a72a403f2f89c4205566851489ee8bf40e1b7c811c690ef045c7bdbed39fb9bf36d21ccca2fb8ffad02deeff917ab13cddcc2b198bcbc169978283296d6e600912c2970212675e8af8891294462dbd1678a02220dd6c192a0c92caabe20a402ac1aa39a30583a62d5ef9b352878ee8bcb4566da5eaded1b0ede1876f635ee43c14729855a6aa464b9f5aa37373fd9e15b795678ed7846cf107bf46d6a1146c15545a6484ad5a642097ee251b086ac13b19401a01b4459f9a19b92710f09c277afe5a477fd97d7bb71a35da55c9acb316357851c5af337a2fb96e131ff4d99040a6601dcb08f2c21d8c201f8bb7f207d6e6e19dcdfd03b71d41be6ac592d1131e53eafd5bfb8efd0405ca985090ea098480243eb249955c6a2011f492fd005f33b018925ce9ebdeeb48b55586380a7696c0f398415ae01d47051dc02875c00c962050f112f82fbffff0de6237a5c980e2d77f7a422fc68f0f7dc7cdca9d7246ea0d510dc94e7a19a61f59f3d24c4dca67341d73d5fb7add6efd65e3c072a8dc58d5da4af4096600c2898409461e60c1ce8c2cbefdd504c436c08224c4a947b42879e2fee79dfb8a1bc179acbafe40d7b81b5be019d18b3244aa0d69632814077f3efce357b3ea2a027c7400dbc0670881d4394b5b493e0efad56a35aeeb0e7c99786ed8e0f3b93ddac0e77d8f58a4f714e033f7c7085806f0e5019fe760a9a85976ece62395fae0fc479feba739fb4d83d7debc152572cb5a0362a3968280d0c62cc5c62cc1062e25633371e42030c4f1947d0e482234085305e99c4972a11c5504e3921f6e18b47aeba29a9a839b179e79be6b343e3e5437bdad4ae40e6ae62933e080ada6ada466699d92f5d395faf9cbe1c3676ec43840302a1188286bb257de803e15bea20d2b39b93cf130f4793deb1575d629d72fb84413e6d0b89443aecc56c111d362ddb2243110fa8230f74d1c43f700062876d0db1815182069cba075c6712079e87b18131e6fe1b619acdf3bcd48fd5c33046f1f73ffddefbb9cfbbbaa8a0f6c405a37ec6d4484830806312eb42e014bc1c0903344d97c014108ca6003619b1d313242455bf196f89d246d6133a93c0050a8ca5cdb44e1cb733e5fffa9668cde9fb6efb7fabee346749d77c5026518da4cb5d336bdd677776ce1aa84c7f7fbfc9529887be375482a557272c13a261b1fdb4cc2e2f70cc0c88e8c28befd5591e8941597bc5222068634cf7ecb3bafaebee61cdd39441d7ae227d1c931db35e2845de0b447e4e810f4c3c647c6b91011d14191b8dd9d6b70dd71c087c8718af4c6f5b148effe5e7c88aced8dc86fc493687ca79bebccf5848fc6ed0445bc3b1cf11e06be2ef1f835368a1c0f035f6fe0a37930be4139ceab6e65bfc8531f7dfaca10a59655fd36721d365cd9930612612846a9dc22d468dfbad5c0cd58685bde411f46bb2dc3011168b7159ce1d677bdf713a1da32d97bfd162cf42d5bfdf8e776fdf9a56573f4c61b3cf5babeb7e81f5f71aadcc0285f44bdcd11efd17e60c4fb52fdbf6db4fdfe9571f0197a83d568576b582dc477d4a801888324fd7103d31e3530a591811c094c56ae382faa68a38262367e27abc4214a9ddae4caffd63c4ae3b825f58ffb3b2ace701018312dd6adb20322b29109212ee3c185b8cfec83ee02ff106f4436e3ef2ff1f3bef0e08bed0bef3eab6a52f953e5794acd6c1ab9e25dfd5ddfefdab7db276ea4ff494e791924d3122419245521af3fac9bcd38f868dd31440a90cd20f4bc4eefc2fd19c057e4c55bdc03f019ef7319c206567437200ee6a25c2fdead5827bc9eef0c1eef9203e70efb73b452f35e987865ef889ea78bab3e2b3d28b65f7734e27ddf9456196eaeb32bda3f38258cdf6ae3b9357f3790322ea483b14b23953145b2938d87322e5060ec4ed7b0ffab24102ad94a91e4fa052f19727faba65b94aadfbfe9db23dc83a797ba3bfd9aa8aed71b28950f01ac2b07ce450f6e6b2422519b627a6c4496f6c176ce52e746fb03ac6bcc7588d4a52cb85d832265a122202fae3ee03bb3a0721a600e7e7dd56a8ccf5c5f2802b2a67823c735be02e0cb00be289f630dc5676d2a22c70bf1dea4aa9b622270d71cf3c7d953f2941a3af4d99787c36ba87c8281a53f195832c8c06214f72fc6bc17a3c6753172f41443075cbacc40524995d507bcc340e6d848558583b61235b82b7f01444d743676fe6c60552dc0364a4d2b1cfde6224d584e9a77fe39c7acd28b7f6cfa99fbbb78fb307f5f807930f31414f17e9c8a92376b0d6f0f0fc797b23c35a59eded035fad61ee79efff35e9af8c3f20f310e4818aca280a4547996b7cf7121385898a32386080717b99f87862a754ef39e993df503439d530a2e7b38ba5e282ec7acb37e14318d754a190d060644785304f9ed58c773185f7fdc47fbc01b91ddd51b91cdf89bfaf09bbfe71b7c7add25de174d745f73c0d30b472f786ba652c3faf69f301611d5a412225512312ec590208a0ff1fe5e04425c82f92b012b504292c5fb80b42ec90b0b35ded9f9e348032bc138f13a942a28591e0011e19535c5fd483d52b9c97b3d49a695641b834dd075739fb6e9bb977ed7077cd32d07b499afc7bb5f8dccbbbbb859a2af52ff87837cbb22dead19d6b2d0251a5fc3fd5b1ca925e79fbf1f71f5679ad1297bbcf8d5ca2fcd35ce99804f611c2499d40624f7deb3bcd0ba7b5b4fae4edbd304c43680371a168e1bca9fd3e3f2c9f71c1755651c78ca23d183c190194add413add0c615c1ce8335a1bec8542053505a276368c7f6b025505f4414d9f5450854205350509304817bd06c748863062c6540819c097077c5eddf6148e1cef67ded7abe28a534944802fda9fdce2ab8f3fd01c73c1c8598bc95b83dc134bf17dc958cc711001360ef23b972a804a703a643cafc2c265ff7bf27e81ce9503bbe877481eec3e4b07af79b368ca86c337872fafa3dfbc5eed866961330f799887c4aa14a9fa198803b829ab6acc3cc90dda4ebdb55a4b6a135f1ab1744643f17e7440e0e0280701a434f1bef78384c549ee32d01fa8d4c92bfe2fada626e8cd171c74f4604dd0adc5eae87a87a96da83aa5bbae2fc27b2cae33fd42a4e6b0814faab8f2808fddd871ff40815fd812797d06a9b8b02ffef8e8b795df2ed082cd374fbf341c3c35db384855059569111815b661d07aa4f507e330a9b0c81b8e6d16a42225a3bb5425617d914a92fa52e5e88364337857dc87dfd918bfd8db27b75a5621d1df81d73dd77eadfcf197657a5f1e9a7ed2bdeedfebdedaf0944ecd12a8d6e97b2649f1136a98b2c1adefd2b269ebc6abb5a435a5ff372fcdc7bef515b27a578c5fb8fffa9c3f720123db1a41c2516def0d3bd9c280b601aeede3d497af3aa3f624371a37e5b29b5ca138623e2f275b8b18ef662dda9bbbc7c0dbd9367d279b974314ab1619b3715dc4dccff8cc53f3595560fa6370bd6dae8fe1431f2a288daf37f099e75e88b0b07c88fa0e9e3706d793ea25dba1b71e037cdef788e1ebeee93bf8fb185c6fe37ee0734ead3add354a4fedf1ed01bf81d3abc482218e8c3620e998894094d2c6a5dfb171c9b8eef3d612de32e4e5213939f93b491ed2ab860e84b236b1f1fcba6cdccddf552498976cef3cd0f7d5f360e33aeff795f3dcdbeb6c5cefcc065f1e88832295bcc4c8bb06de3629a700c2d84e2a00cea23a36004600f5baee70c8095d2f7725b886aaa2c5e5d1f119956304ebcae175dadbfb5ebcce8cea13aa4e5a574e2cd9a7c127d76d84d7ad07bfde2f89f187197f18f7d9e87bf1017fc594b2269b6f57ead3675ff8231f9204af0f923c28821a360e22144c384812811b7531181bf682fbda8b870908d924681d3ee4855501859c92c14a799face3216c22bcafc896739f78dfb880d5813d7b5ff4ae66982a9cf26e2baef79f3b4ed877ee6cb3658ce890eea68fb736841ea8010d433a9c64d2a07948850a96d633953be0e4a116908505dceeb6a70848d8005f1a63bdf1da743ceafa735c9bc7bdce870dce8beafa23d13fe6fb0e608f0d20688113e1f06dc87cb66d40c5e1fd8071f8e8b944383c07121f6844382ef4967d71c2b81e3afc0404d06bcba071e78300127e98be9cb0d7564207e6d6a337375db244a9cd75d6e6916e970f6e3ab0c9ed91bca428ce81bcb1be155046b88a8d042d79cc2d50787f70c4bae0882a094a82029597bb2147b77d7fd992abf53d7f547de21e5071071de6218031c8e6f502428e79a20d2a0ed89a7dea3ed3021216b969b2dbe629dedf69e35962e3791dab63d00ac5ae0bdd9c72e19557c6addf7cb34e785df9d6b3785fff3af0ae2b1bf87a07ae5bef3aeb2df03b9230739ff685171ff0ff366cdac5c38e526ae3b9ab3f2a426024ad17f6c6c3fa222f3f22204438a43b2a7b61915306b9ef0232c1a0f588a3d657bb5c014a092309a4efc7c668405eb7a2e2a06f9f4982124710d7fcf78f8e9bf47a5e7ad2dcfb5f7831363a870877f0f7c3f7f7b6f4949a8bf6d71272b78b6efcace306fc06c291960638de406688683d932d4f9ec339de79a87edbc30484250f827ae02975d39a5deeaa4ae860204e2996fedccb710651ee086f98ea490cd9019c1d6df8884f6290f8ba039f314afa2506410069dc011c1e73a8c0cf1c2aaeb7bd0766c9775b8e5d0d5d3b2f74e29870509743c72f37b8f4b7e7d41dc489112442404799024cb6216df4e9bede5ebccc391201f92e36aecaf5e567ba49e6f43cd8e67d933006c449b304b26dc6206540ca43758c1521162846101b8ce302c8f848128694402ceffbbafddc471efbf2a0f7f47f7f66159d70a28aaddff6db96a8e3181471d0f33a30d7cbfd21d759d0bab5057e264c5efc8e9048085fe996e25fd7e81d34f2aad7978e16de75c49933a322e269386e81240bf2e6a380385a8fa2d224c77708ef385faa124130e479930c26252c63c43868fd0a0985256bbc0f4b54fafd5fbffcae8bbee8a5ffbb53c9e639ee97a3f94ef6fd025ad665c73f76066c364438d24f479f080849d630aa33432419215bc06ab73d444038b2dcc60f7ae0ff19786b59e3c67a086f875e3e6d5c8283df262f10c17186bd077f1ce50ee3fec41b32dfd4dbf0a98ac2e2e0f7e1f31efc3e89e142ce94047ce2e0979c72108717e350b11d02541138302b0fab7881381f5ed82232970f68caa123fddbbff35eef13f189070ae30d2181547b434a4985f090919a601c47e76439cfb91baeda8c0171ea73aac71884ce4dbdb8168cf84c2088609c22fab0154909440608c6ab06ea0e69f8e1c5cdf4f3729c68481e7f771e1fcf02adab30c68bf715eb4cac03de0fbc3f707fb275db5be077121366494808df6f1d271ffde51d9a7119bcf5675285922d82545714195d2adc7439829a6c6c227095dd67b11e39923adb0b791d4a421151bbb6d9dee7480987f6054bd8224343b9c8ade612ca8ab7cb5bbb9258c1f1b346bdd8c8238184a330e8fb0548248ddaef777858afbf9aa3ea8cae09e7149640004995c51236ad6b4948f0be2c8954bbed6e0212167d22247ae0fbe6b652e1ded1859b937a9af21ffcbd213148ddad14e9934b0c36f099fe1ca12af26f181bf70571b211830f84638e38f8fd9c7244e04bc8e1313ebf4aaeb7675e306e6774551a1104aaf92d0fe440af932aeff5b2e83f46e613edb9804d759bb89f555df49cb8b8108697a8d9d1852d3794cfb6216c25edb1ed831903d3bf4cbd4ea2bd45ba61824410481221b7dd20c923ec85eecfd63ed69da7a62a1fc1675527ad03c7c75044f0be5ec2e9f86c19065f6fe0b3036c4272ddfa6d7c0909b364809cb4aa9aae0a73c215c3f22691571ad61b4bb6a4c221098402048354a622b29c0907312e42a2e0f54323dfd32d2c9e2ffa4ce884244f048425134d5887b67feea748445f7b61e58d9b7ab9124892ef1770aea58c4f5d52af9e52279f7ee9891d5619fc8922e6a3d712630442224bebfa92058513ce4282b6a708886d403cc796124e6f1276ff1e2c721b892189eed67fd004705e36faed85aa2899c42074961ca7413ae8f6e2e00f9018e238633c3740a72d74ce71f3e239306b0eafd3ac314548d34623ce883622b2e77a0e68e5cf19c4f7670b483c8fad76aed1fd11c08003c21d57a867ca93fbb9018ec96c48ac92c168e7409518cc1898fb7f549d6958216268089e2c7e879138d0681ec7109d74f88517d47a5a774684ba1d7bac9fe0fb54a7ca67c4f67ef76cf1be31c6cae00b92d08325302ffe00159a648036e5af7d7bee5ca5d6a42eddb889dc59c996859964c201c9830908491a4438a4c421555401eb62b7491adbdbf0fc404282f1cadc5e2c91e8f75fbf70e58b6e2a9de22bb73c3eda7dff64df4fdaf48426a4f5f48ec38e42bc4cda69064a02c292086c213e9b9e90acff3604c49294cdc6ef7ac0564f2b3fdb51db10b9abadbb355803383bd61153e0949418fc2a02efc1ef0889c11612c31c71f007480c719cb1c0276d3e42b20a30bad79a5d77c6fe70b365ed3f71f6b4a08788df09d2060d63066cef7dbc5109ee6c8b88e7d3f3bac7c673d8f3d94fb8de24d689d6fe51afa56436a4de4222a4c0ca648cc149ce0f3cae3802108524c20b49434a1c52127161db099d1a1cefaa6a1e721e720b07c5a98ccc78a4ead44fe8bcdfddcf4078f7436fe0b305839244028b93e812e277c22ce144fb7f7cffdbd39310a0c792ab3022b37712110ab26d947baf9312b12f0d7b10e1f8bbb58801bc5f6c6f9f35024448a4d15d1394b5f5ff78db4d5fef24fb7e496c7a8dbb36afd71199154855e5231c9040c8d6e7b3e9d1391d16fda46d4fd940e236da11b79ed2b1c613bae3580bdbb846de40919b8ccd4215954c55e49718c2069f5189f92406bf8a200c2cf401c3f837b1c4208da30112431c01b43de3669db6cf98461bdaf6cc0bc69df24ada61f5672875f0594774776d499e16069c1d3f23ca4f18007dc9e6226af7348937ce1faecbdcdc338f776d1f396a4cd436d17bdb8c81f4ae8aa926036c4834cf3fa893e8f13e49428af6542ad416bf87c5ef7a5da716d4d81a2da11ca4328a79d9c983c2cb5044844a23c8966133a3e55d678ecf2d97f079f1fbdc4979bf918413bd7ec66763eace6860de93549e32b961b928cc452a2ab6bd05481c3ed5540430acf68e1631404a2444109940d2bcc5b9c78fb8fecda3c6e8fb9d39cee212d7bd599e13f4fd82dcb8f13d6b85eb763808019ca94428c8e6417d481e6cfb206f2ccbfb1edb9f0672771110db0be3b35e1edef594d5ae88af272cfa628e4c11c2a93fb84f0bdef02732450871febd59e4a3dfc3660cb8bf3d19abc575b1e786f17b76003e07f8687c59c0d73e009fe31db7f73d742f5be033d7b1e4e3887951621e0cecb2aac7ffae44ae1e2b02489c051608ab64141aae93dfc7e795b19b1b17a6d2e3a9b1b4f6ff32725deecd09b94654e6cc28b5c91831affeef6ebe476f25e61990f0a92ade263c5fc22b25c8b828090c1bcff5fc8516855a1dff4dc2ef9e641d38def51c4be5e2fdeefef567fad9bef52cf6071b6b3df883d629f5cb6e2a7d71c3ad4a1566cd3e7035b218578a780f361207a9aec8bb0a84c497351707abcf38beb7b588012c81e03d581221c98b547f7a5e1675fb25cd75ef2d7fa56cc4ac2671eb43ac074ee9131646757ce7d0d1a96fd69ba6d43137745977e0bb063f1bd36113a1d43c2c919024229c4868bd57df2b6b4fb9f1da3198767ffa8ad6cb5452375535a79ade507edb83b95fda1ec80b260b7caf9f53a4e54b9c3f9eeb93244c9fbcbab2a04a902aae00e3afcf1b4672a83e7760c1910a91b6fee5cd4e3e567330077d7ef861248910c1a022fd1c0847c6e21fbcd705e940a568bbcb5b87d87f3efad5c53fbcad09e18a7b7e6f7eaee678abdeaedcb2fc031533e6063b2598fe6ccef514bddea7e2a2f5f65ddcf393799d5c24fa76e2cba22ad94bacc1adaf518924611a1fe5f00a47fb3e6f3261bc6609354012cb4fa2e2ca162a34a9d293fb4d792595d21fb6beb70ac659e6a885f3057bf38980be4a59a7830ed63180b4d36cf4817faf6f1140db00270c88f7f505306ac252f95e45ad684a9d00dbde36545ca68f73e2802bda95b6844a9b09c3235e9822e34072c4b8abadbaa2b6bb084838713f7a207da886377c21da8db8ff385295136189c11b0712e40d15e055e213eddb8370f046164671bfedc17bf0cb0f7821fab369c30b1597cf5819a0daa0f7087007f6cd8b50e558abadabdd08d43322d70cb81eb98178c1502435380e1fe7418485088ee0b477dc3f5cb4b0f739d4ac0ee2ba8852af8cbfe5b309a72b35acd5802da7a52b555cb065ca2837f99d3f80903690f9de8231f0a9b8687d9c1c6373f9201bb363ef132ffa3be3d49f6e4df3c008f22ccc62f519212208def725e33b656a0874d715ef2f55be315b5fb667bce8177fb965161390002f3f8ed416ba7e261ce48e4bce1ad9de799307ee3fa505c6a9e0f77842527970f92b7fb409667c7cde867e679c68bf76ee3e87d6ef66f0fadcd3699f13e328dd780318c5e4b690dd44406464230f24a2ffdfc87aa5eeb32ad83d514a0cc9bca102bc4a7cc6f739220e84f8032931f88c974924862c1cfcd59418a4118c251f8a0311fef9810788e0401ad46e36a8b3dec0675e705d8be3906d348544d77102e2772634b4a04842913601fa7ed575e30d0346bc787c7d3be07efdfba4efbfba7afd7aa51e5970d1c33dd728b574c86f115bbf715566d5668fce988c8d823108f46a1a1d934158071f348e8066253242663a6fb9b98a826c67091897c4eb205904b9f4eaf2d90e03bcaefc715684afb767bcd86f1567971d45190ef840146edf4c508860c80054922cc2b81f045b1ea8ffb81601b40de0f7264984243a4d982bc655348de6b08b313ef4fd480209c7f7f91c1212657ab79abd6a2379a2641019d23e972a59a9c2adb62d64777b618983c2ed5bcdd5a6ba261bac38a805a58df9cd4b8e2e0c9cde835fc98d27269cd2c0c754455e7c81c64b9fc4609e4369c467e3e0f7abd01273ca4111ef2c81046c787980080e84f01dee648fb9ef78a50efd39fbdffb23a92245a2728e9c53bd90080d1bdb607cf3796b501a732b09140b91346489dc5f3d7f171c4f3cc7f66ac3db9efef8267dfe37fae0b6cb5a2a55fa7bf1dc052d30032a8e3188cd4b62c6e014e764c61fe0c6cc0740b2c4dbb69ea3d343f3a2f3f3b5da58d78d700f3266fb559d89d781dc0ff2a08f88f7150c852f854e75256ac7eb7d18aa9d3a9e722c51524c9f719822c3a91f14318ef92552c52da2fe99cd4efcb3741a70e72734d46aeb468e3b01818581aa582151a65d57f3813af096234d4248a8ac7dfb4e3a85a8807e60db535e5871ba6667b8dac74d02262506dfc2ce177efd82a34ba02ab20dbe00551179e9c45445369e6b0e7a7fc47bc4834f72b273e0d545f882536d78c61de856198b440f9a9731021f1d5076fcb8adffa64cabf38c52279f7269b8572f97605b1f51ae9cf4c70c247f714e79400405120a1312d2a1caf80882c2586f89bfb32d46afb30e734e5ce91af7ee993be8fd136074256f11a94a936e9155713af6315d060f5eb850a917ac1b9ec81da8d42ab5b4d110378dbd6d948a8e7f9ee9bb19acdfc5bcb0d81be87beff3989090917f1b6ddf469923a34919f5735252e3d69b4cee392489aad36feb0be33a2f23e424b399057af379f0fb23dea96ff0a594a40ea0d418b8d39ff283084a6ff13bedd86cef752ce94504fca7371b30021836c09daf50b7d4171acc543146437c3f474a94010c66ca8b2947a4a19e8db471b0338d545d4986ef6f63030968d101df84823481c911e9a00fe0907654554412c30eaa8a7c9c1db903e7b304b243124360f6e1ed35b60ae372edd7ea571d7f9d52ff6bffea03cf68cef8a0470fcf6b028e9ab27846dda9555c364f4a8120090ad94e3e053c59c0bede3ebb11ea0335f79e470f6ab6af5217be7f47cfe177ea710da957f707bdeeeeebf161bd9b517889236689701141c102c74cb091d635de6e7c6bf51ab7a0d50bf7fff7b867f7516ae9a6f96fbef6a38a9b67b13e22fcbd79c55410611211f17c1052c11d3c5fb6e8c62b51996e12459f842ab3eda2c053e0fa0d625c826c39d54da1932cfbabe46cb1ce422f871e6302922de6c5d9f6ef3edb19416a1101ffa18d096902c923da22ee9e09fdbbd1ccb8ef279c26b61150eb6530573a875be64ebf8a55120a12f9717df5250ed9f63001719b73a953e9be685255114b20011cddf6aa8af285c4b09daa221f6737872b12423591444510b4c18372256dafb135c0ebacf63df51ffdb7beb27b9f3b8b3ffe48a9cbb21f6c71b616756b1e53a77e2d14a2e1b4d0e06098a0484905f50758159600b66f77dcc9356b2875eff20f5ebefa3da55aed97654daead176dba75f9a9711c7acd2db5ef7b7ab1be6ef0fb331faa54aae18cfdbea959d38b8f0809736c58091cb8462922ca947a7551af05795d959a3b64d2b8c7f473aa52aace8f56aa93eb23ce599403dc44723c964c3ef63e97ad7163e2c63551dd10edc7387a8c56304843b0fe8224deed8d200f60841c29010bdb6102db9097b3c5f7495f5cb369a35f94b74504b4bd50da92feb1368eeab648403f6c803bd3d67ba1371ab905d9e8fbd9de73414a24b1ef89fe183e1fdfe1e74855f1d8c4cfafb6c4110efac39e222011c0b07ecd9e8ea974964c55149c1bcaf4b7575574a19018765255a425101bf88424c5e3b13de35662dc3eaf336527999788c0e7796ea0d719f085ee4c9dbeef254a65947578b6df14a56e5df1dacfa38e55eafa179ebdedba6b953af3b46b1ecdbac9f58cb2eea6e46c3ec2d2d1c03452856989e5daf14fe71e32541382e68316dcb5454b1a23efdc34e33ffade4b6a5ef6eac5faa20daa5f8b0509086077f5b0f58952b57eabbbf80e7ddfcddfbefcea174728755adb2b27646418fc6ca379247e06e38cb838f029f2d9cdbd34a8a1fdf897472bf5c519fdcfeea1f194d85b87ccbd286e5e4e5227d0d1cab98a449c027b191101210e1bf771b3f56f673a515f3287e27afc9c22492059f1fd9d8e20af3e23d43b1e9fe3b70d79c78bfd5763609d06075ea554dd760d66d7385d256e610145dbfee47cff9f34db0097910e2d0aed9f9119f7fd64260c29a106e5505bed4ce5cc0ab6f739b46f7c0405cd2791c8160e7a913de4c6ebb1faf757d1c2ab811c17896c1439bebd5959835445f94262d85955d11caec54ec64cafc4106cfc4a7c80ec2eafb3800324f476ea0cf78068b2aae5570f684ebce331a7b51e3d5a13821b3e5835f559a5ee5e36e8fccf6ed5b0c17b470dba5aa97bf61f74e23b9ab0dcf7ebe0d3bfd39cff83ed3f2e9bff9a52cd4765f69bac39ffb4f76bcdecfba3722bdc8d3a68d0361803e27845e478ea88b4ab8ee9a4d489adce3bf5eb12a5aee9f2e481ddce3133215332d00620632d491214c0e6d69b987cf857372f6aa5d433b3af29baee0fa556b658f2e77b99ee1f9de3495545d961298b2ca71327027201be84e3851ecef27de7e1e8fa664982be8b773d680964db043fc03dd3a7ea7498714119017a5eb519212f3ec9d9a26fdd6fddefaa140fc9fbf78083969a2b2cbcb7cf3946e8d4abad1a49f6f7bdbcf95284c44906976ebc7fc97eafebff3e2b54b3bd5b2297be5f6c1fd3f7ab9e44a9544c0209b0552675970e57efbd626d4fc581c435bde04d8a3a108ad8c16cfabe485b8ea0c5f5d9c2c8e888eb6291ca38b8189f377790c3d7399e71385e4ec09191cf8c4f65019f39a81d7140cae7c4c647e3cef6cc837c8fd8f8685eb23df320df37763f5dd75ecc73e2f71011efd68a508d7df7d587f680b48b5c63775a56fa88b326ebfe55e9ff3bff7c7d88df90727027d7bdf302ebf3e697c573de81efebf97e32125b7e37f580fa639fe7953af084762fbd3c4bbff67f3fbb6a66032de99cf6e484eea8494eb61ab2b900334b1454b8c84d5a57d466d34d1b8729f562ee0d573fdb4da987ac6ef54f82cda308b5cd8ba8521edc56b9a4aa2028e46de4310e77b5bae27d6ceffb7823c8b504e29d7fff3acc16df29db834f46906751b2d1c075b06dfc0e7bf978f0cbef71f0811dcf391139add8cd1be706a707c7c1c801aa32608d088c99a15da07bdfbb9acf6d3da254eb9e1defbeb6b5fb9b13553925fb7ef29c60233b9d5b4d9cf4406f2a40291132c15789ff9ebcfd05361035ce69eb524827a6ca21ce9f16b2a1bc417eee7eddad97f30aca0d4491e3dd252716a022607c01920479c17417712001a266a031940eced94974e422302d59c47b9c7bb113302f633ce30ed4b5621cb37d1c347d37db332f7ea78488c067ee1be2fdbe41f36ccdb71ad4d647f4019ddbad7afc27a5eeba3d6fcad36729d5eaccac99f5a71bcc64c4a7c871527171ae262af0739fc6fbb17330153ae21adca40213751c2a6103e08038e20169e5b97d1021bf6a3540e519a0e2daee08f25841a96daedf40c95a79f153c4bb23545c8d6f6a7e44e76f95aaf57dbde135a0caf4c5179ce2ed4b2f3c3ea8a4ce3dacfe99cd060c7b61bc113bb54eda9453b5c4ee24dbc722c9a54fc5458ceb3dce8d5638603cf2f7a0ebb6bbfd1546f42aa18292221b2d6c7fa9583351a4e2aaee4654c2ab2be64ee93d30a58a20b9178ce1f08778e340020f4cbff192c66dde83031203545cbce1c5c11fe4069ae535ee27cb6aec4b99210b606579239f39995fb08d27e14267154d775f4a19c918780f4210c0baf51b2c3bbbae52570ee85336b4835267bf7263e611879b1b3820d2dcc111d09c0d952ae751b658cae1244aa99271be7230f0887a296c047567e05bab962b89c40efa00e3f81ca45a0950716d7704b92d9c2e02d6af13e4841140f0e5ba0ae5a60edfe75cfdca0b2e69dd190499250d221c7dbd9024134eda8769f37903fd536d24612f8c271c3ddbbf38a25d3bfddf2d42758ee8a5e2bcacbc1a0635461acb03545c247fbf1b53614942e2cb00b1cbe6fdaf9040945ae9fe938093357de985b59da562b72131187c31774a1bcfdde6c11f687b20afaeeee2e097de50e2e08f335e7a0fc8d9d0698b0513ac230fe0745962f0e65e4a5691cee7c61cf112eeb848ea88171fcf4bf5188318beacf87ed21af28231487d2fed8f03ae54ea983bba341d74b05257f47b78fca9a79a275160241d681caf40c6774a6a4715f5446956999a8303e412a4e4b086a82b3ce30c8bef4fdf4f38353852b21611c881363f9a87dec2e92228075790e41e90be3d88a1387068d6e0b310e94c39957c258101397e8824122228749062a47cd0daea1fd582926fba04a4f165fbdf75bf6b7b8b387dddf9915e57beefe767a4bceb8af6f1db9a8450135e58bbaffd151288e3ec1bfd8fd886b0a3bffb7243f90e603a686c73dd76aa8ac86ba5faaaa230f0790f7e123163f86ce00b039ff7e00f2e8065c78f5b73f8e80b955cb650150573ba112f3e6feea504f31211f80421f78e3b4112cade09e7253901b4812fd93cd3c6f1be87e4d08f57f7a78e57aa75f38ecdfa7552eaeaa18f7ffe1fa8b652e96003a74c1b99664012145f52c08f701dae270984655b9ac9eabc77b292bb3102ea9dd720e3b82df0f9253d2ffe18e392f83bd9dca77de961286a75a8bb7f3bcdfa753af8ac3fff8579a1b81de9ce4dbf73a0a89438e860b3f1fb6e3fe8f6500b03da0610a174dffb16eb95473aacd673f25dca63e7bf14cf0026f97e52a20c92fcef756aec799560caee41eb8b802491577322471c78ca2ab7187ce8e894eb8f3a2a3ac9615c6c9659d8f4ad81aa28da6f6a38737d5d66b45f88ebc3e67a8bfa19c644a7afcb00be3ce0cb31f880bf03e1b3fa015f06f0e5015f0ef045802f07f86ce0eb017c3d81af27f045802f07f86ce0eb61f0619cb6790ffd7e346ef31e882b519dcc7bc7e605ef4df39287f7c8e17930cf198bf7c8c07bcc51b9069f35c58b8fdf2303f8f2808fc61d013e9a071bf82e02be3c312f11e0cb013e1bf87a78c63d16ef8179d0f83281cfc6bcf4f0cc4b18f394877e8e581f63715f06de639c15496dae5403d5f4a253b424724c9b335a1e788052cbd6cf9f3371a2521b37acd958f646f40e9f5755d581808b0089b0a0067cd59706aa3c40f3c6d1755ef7a0861fb86ecd6d271cb3efbdf746dfdb4af8de5966bde8af81f520d657a1585fb1f7eb81ebcc3c58c06f03df409a67e0abeefa95dfc906fe42c69f07fc9e75d1ecb1569fb53d4da95f52239f7d3d4fcfd18f15fdcb903287eb7e1041fe7fec7d77605455d6f87d93425540042c28a189065054c4b5918958f613bb045d154d5c5c0bbbbaea5ad6c68bbaeaeaea2a2aabd8829505549a28b6bc8080080a0a845e8288945002a46732bffbe69e73dedcf3e6e64d4050bfdf77ffc8cd9d7973deb9f5f4735175a864348f005fab8f23d561a8d78adf66295055e80da84b54ed3230e76ecb7be1993e723c3787b6f61c183b2fd4d316db777cfe2cd8c7b80f6d687786f9136afdeff8dbe62317970bf1ed639f7df15d1bf505bf0992bc14ab544d715018ff84296bc059c4372f0eeff02f2181dc141d19fba790a98ab298aac8f37377d4733e4e595715906ac7a02a1a047ef84c5514ec4e6950150d82f6deaa8ad0c633489718a261c66927ebc6cc6d48c973a20c9ec186e48d3383a7ab128d1203aa4e32992a918bf2ceded9905a766c7dc405170a71ed930f6f1adf4b880b3bdd7ce771db558f30309238659eaa4561e41547242e71cf45fd2a23bddf5e6a9ec4ebcb6783e2b60c068f3851834a2350d5c9e6c946fc0d363380df24bfd9135dd70b7151cead17e7a8882ee31ddc741737aab2186349e31c861adbbfb5e2a88abbcdbafdbea3dfab3767c9110e3d9bb2f4d26745431a06d5e6b642de3648fee2b53815d67e2bbf800472dca6018b410299091248624e761e719c4a62f0382613a7acda7e8e2b36ad526250ed9ed036490c45206023a7ec001e16937c4683c4d0d30278d02e619c32b63d7836c0d3fb313a5062c806780ec053bfb7e9f738ead88f61008f8f8ba3c1f3c6355fc3bb484fb5469c743f92f4f2138e4bb0c4a0de5b0cdff72389908fb30df0b2019e8e77913e0e12de48803710e0c5be0fb508ddd9ea62210efba86b8f4b24679679e5296595770931f7fb8f972f9ca43a0882882791a08aeb55f87cb3fe3d969804d2abcdad693f4a0964665f9040988457049c66969a5f39bbbd00efb0d66f2e591741db2459dbe2bc587334c033ac37b93e70bd227c05af00d65b364980198047676887e1779da1bb1abe2d67b769d3ab54888af3777570e4139be7942cdbfe817a30b24ad5751da106db52fd35aa26d604254138fa7e73467547553c49618a9440869ef9cf9423d708d1b6eed0cfa62e96df75b386b839ea1248946a7c69fe98a4ee804408eb5fce961aa5ceba4459f68fcde58be57bbeddf4d982ffdd12c80b9003354862c01bff7cc9e07e5e89419892cb9923de7589617192eec63c4d370ff4da575e677b2b3170afb3e00b9e1a9618b80d29c8f81c0ef03a1334bf0da794b95754baf1236d9f397c4b6eaefa653acb05c6d3de87e03e15ce10696e9ac78add6e1d0dca863b8e05c61a8cd846af35be4f4c81b64101abdeb86af0d10695acdb79b463746c441e34cd3f3e60fe01dfa807f815aa3cb719dd3783840258145f565847fcba8ba32adf55c8727d9c71fba00b9b49d27ec888ce156336ca0fcf1135ed068b04de71060d03cfa1166612a59df87cabdf54ff61a4ee67ef6940f925bcb0268b0bdda51a3547c6dab1b6ef46427e00b383df6c5c56ef4137ca9f4b554491e83f93aa88671ff63676e2033359af336f01da6c5c1c1d5e925e6741aa4454a1e181e71da81c5e725e6704cfa0eaf16ee84b8e31c88eb64542d0e45c5563d2404cd942aa18c8fde54b6b1f7fe09d2e5e8ad5a6f9f218988619224f6554a8f79bef139a271d9e699ff855b4dafa8a32c2170dc8c1157daefe30d7fdf99b73a7f57f44128c39cba6ac5bf50a8c539ca641ab71fcd0cd9aabb2b0c6e71847ff8babb6c2503baaf2a54587feb884f28c8acbce7fb6b5fcecbfd6cebe7db5759c2c83c5d78703ed2cf85661c1ceb7daef6ab250c2082a688bdafbb2af088863fe2ada29dacffdde7777b32f3216efb8c68399080c5fd8c8c13178f01c6e8ca840375e741fd5e179ef55cf7bf8c1ef710275f81e3cc22f0ccf6569cf65b17e107ecc26e0f5177fc7decb36b8cdee4a47424691ca8c73e411c71e7e0a6f9bf00b03bc2c8007e34cf8f171d1da1e7ef49e2cedf7997ab2cc04f3c6c68f71d4a6c8ec2c46c8bd718e3d5fff7c7d6bdcf8787f42f339aa6efab8aa314b715a1f55935b300b94730fbc68b598c4f0e7f3a5f0cc6177e767b1798efad661d4303e0a3e839760ddf0f1373da7e065b175c0c6bffcf4b2a7961f2ac4eb4fdebbf2baae42ccbafc8377173eafc681526730c21062f12029a648769450f8ef385c4e581ca86df1f394b00e8f13b810c75ff6eb8cf0a0b79a4b89e3efe2ed889b2a2774704a6bf79a01fff9a38fafff1c309e177adb3f9f317835732ab7b8297c12159221b138f0f95e1392fd4440349de726a134cadc48c7384d311639e8004e36c9c03684279fc3802e5b3da54b2222d9c036c8ae6a74a7f4738e85002f6c80a71bf793cf6564c7e38dfda0649426151771f48ca331b98112bc00d586cf4fdd2051993868c1545026bf777f64b69d181e53d5f58f7e8e0702651d86fb527ce9ecaf50351d704ce5122320a1fa2bdd83cdb88e094f76a1145f0f5cf5668a8f42c921f8022dd5662acf2857ed390c5fb67e2b9bedea59922bc4fbdf3d5dfa640b2176ff6dfb6d9590fa852ee462358e041622089c60e0418c07f30cfd797e256b8813143e1fecc027c212509bd29d936451c46a89d71f86dd3bbe5d7b29801e7269e64715f2b35353875df19248a4a2c47da69f0f81b9cf683e615e988681a940eb1ea919822978b050f24f07da9c6084d9f38d2628298dfd4172c53701e8d6261742a761bd0fdae2a613ff7d8b2fb333e43363acbbdadc16fb3a1cfb0d1a150792fbae72e7252323b8777aeebbea7932fa817109dcdbc85d6e20180d6d6bbc7a0e36201a154b7437586193fbaf03f0b2019e0df00603bc20774a1be0e5c1736180d719fa1706789d35f816738365c6359f71941b5b4b2c2070308ea399511cdf93ac1b730918a96dd113e015b07171005e36c0b3015e5e3cde16b963f371a179cbd3c6a5841b190d4e0925caa82ce1f5d2c6058e058417e91a79a542cedc8c35ef954dc25425afe975e40855d7bd0335b8a7d6032b4189b373a514734deb12d766d27d52dfbbeebe1b301571eb18ddad6dd66f72d7c5f953c65263bf8b58bffd4e0d6a9cb9bb2eed13b6de4ceee1b96a1e6be657fcfda7a38498b4f5f9618fbe2bc4b697366c2f5b00e3016eba649cc51a23fc0ff7be1f5635f2fec90709d1fbd3334eaeea20c4f799cee38b5d9bc0eafad7d13c4fa94f500586e705aabcf2588d073dfc1e56b02f69a0ec3b0c4992751ec30309c6000faf5bda8ebc3f5bc26d37e5c8e87bf3e4678bad938f9b20bcf92b817d9141fb42b54b02dce44df35744e1081909e18313cd0f672ceb375de2bd7cd1bc37d78e56f852668515aaae394cd564446781b3e8c64e2cb3037598b5a9ec2f0282290de4902c1f33a7748be4642a0acad2c66d11a2c3f0ce151def93dcde92b4944cf728a6380188d3002f1ddf81c90e86b88da90696792b91d74f31c17b12e0213fe3c05f3c301d06cf0678f900cf0678f900cf61f06c80a7be37c7afa836d804242169afe01141e4077f118367033cede017e02f6ee52bafaeb803d8d6c6050f7eee15e6793fd9006f18c0e3e3e2307836c0cbd7decbe357301e269fe62d3fe1b878de68450c9e0df0149eb83ef28931e0e31c7b3ed2ad6e4d453b21befce2bd6d9320db2ee6baaa03af2bcaa1f523b47f82e73022fd7555bb5bba456aab9b52df12a25bffbeb35d0212371e19301e05b1b689c099bcd738431486f9c47ef7032f2c07bcb0282e08c6b5c8b04f02e269eaeeabb24b25eb31f5ea510f3f365b884dcfae99b5f529180ff0aa425d3b72bc985b8cee673955882127e7d75ee31ad9971cb87ad09d52dabbbad9a503cf17a26fd6ef6b4fbf4a88c3da769b307fbe104be7cca9d8f19dfa5dca0faa2655d13aa851758804c78aef591ca180ef434868b2d9f3863ad405ea7cf6de87253dbde2e137bac8f79f939277d78bff91fd58d23ced1f43e56f1f11e7b51921fcf3970b84c45b9f0a1b1bf629329ab49f818c9ae62f0cf08a0c8c6c9e82b764e857d33f3c4988752f16cfdc04d71010e1c0543d10af43046425d490890119a868277813be11cb5ad6dee704046b9cf8380abfad6e4365e4152116bd5bb4e63349013ba6f578f50749e99ba51ed8379673e74831dc5531c8815207a0ffc0cc88b533920c6cebc72486fc464a0c3cb0ad1fb93be600bc0a782e0cf0d4f7268941308961a092182cb33bb00df032005e01c03311c091d0ee09e352c0c6458d53b6cf8d392f1e6f2e311839253a000338e7464a0c46b7584e004b48c244c62003e015c48f4bfd1b75a754b477737abe3f61ca1dea094e382867166cb8da09aaa61b0b7183c937b658d2bacc35ba776f79e2532081581a5e660267436f159ede3a56ed12365fbcdfc9ba41fb25eb0c353e89d7c3b496aff61d7eade468c72e1dba2913fa8fe3006ea17820d52c871a08894b582e3ff09ef517b712a2ed791d6f18fe9a50eb23cf5b07d68ad031ee3502ad1e6e3ffe1a591f7fe759d38f900758c6885ec76d7f46f26375b3a66c512b43a4c0418ea95342d7a9da4730f0c007c98552a7e4b1ef99ea8c54644840fe28c4b5473f34abfb39429c75d1906bfeb64b8803d71c5cf3ea03ee6f42a5bdfe22d439d459c4cf5f2e8c2f8e37b499c4172c49279e3f848f8484ef336034e6fccf944e2e43be75e38617cbe0de1e4e38709eaa0e5135057c82c44d044433028806023bf7310181ae7b0404269e7499c069b89cc7f20d739f59293770fdfbf56d3e937587c99deec85a289fc90c2d6bd55d98233739a7ec570da889f44b0cb1b6912308f2cb2f8603b098543b7ba72af222c79f04781900af00e0f103533ff8b9aaa858b400780e608307910dcfe5417f55bf8222de6d5225c201c83825bfc460c3731900af00e0357ca0369631f038bca41883c89975b67b53e197cefb4fb9174fb985240eccc68b2a99eed0060212014283a2bedbd316a9addbbb2aac6ec3fafe8b492080178c27321886086f5fbc8ba742b5e16d305f3a4344fb229badafa224256b580f5b42eb4639c38598fdf5843ed3e15c40d51d1d4090bdb81a0ea6ea6aa85f12e2e26db7560de82ac4a11f743be65177dc72459ebbbf7d2a185c076bc4d5ae9b6f4a76da9bc7dd2a0feadd6dbb5c2d259c7ef5e7bd78d1d342f46edbffde1692f5397848c721650749823664e95bbb17c9b1ffb0ae06770411162410261bcbc350cff0ea36fd0fc948bb5e883ffdf95f136ee821c419a70c3ae4e9de421cd0e5a0198f7493bf3d2fe5a053e4816bd55b9fc5bcf24c8c1b8e37ce5fae3ae502254aae6237cd5f18e099f659811573079abaf5e5766fca7ed66dab995af312cc17645e20427fa5375f6e410984c781f80888b1a4063db067058d374847c8bc081349815a80701db84fd63d2ec4c29e855bd63e22ff4fab5e7de345429c78cbfffcfb3f374b54c369b7755a2b1fcab262a61ecb89c606381ab662d0adc2289025f4c6828d8346e46cd08c0e57ee9e388d51f0c64211118d8c56218a8cf07b7c8f0defcd061b03a4d5465d24fdbec842235736c0031315e15dc8e0d9d00f484a6e156abf2f62ed420b47355feb07e201fdf5c685f0c987fe67c17b553fc17887042a6e1cf03d2a30d1f18d8b03fd0803bce1000f091ec7bb90c11b1e302e850c9ede8f4281cbdd06787c9c71ded4383d21d4f1375c900a2474178c5039d4f0b9053733c256f574ecc089c7cc9c078a7b636f769465242ac4990a4fc40bc6d386f9403c102f87b57deb187e57c4da8bf93804f43b1bbdef00ab7cd5ded175cb3fe75f28c407539f3ea26084faae0e541cb5a8aa02425b0381974848dcefcfeb79c359a7dc26c46129475dfff86cd7901e1d1efa87d7ff288e9d791d68f88624577bd44f42b41407d9ae4dbee767a7e5bb75e6a053d7efde2d71eb5b7b6ca1fca0aeaca6f9e276f20c59587fc94e8997b5c8aaaa7d57d6432dabee3e09efa1e8837592e4a6ffa5c9991d24614ff973da693d6e90f5a6d49d3d24c108cd0a1dd0fd18e1badb96346b26dc837e934be2093fc457e86ddff8f2f9f3cf271272fd3cf0ef6713fc22369fb82f62edc89c9a6bddfe57aedcfde75a60d0a3e0e480eb36fa37d6fe2bb43f869a393d245ff691048245526955f008038ae25369a1ce136d2572884aeb7f78a75c1e31eb2a8abb7c2c3986c31fed71e3c152226932b6594a8fdf8b384e99eb10939318485564d6ad6700bc028097586228a648f4bd53153189218ef3b6015e1ef4370cf0748981ab8a8a81e3251b922107974962e0c6ba71ba7343032a98c4124309937cc6412eb1814c62301a17717e133b51c4d990745522cbc155ff565d9e2b81cc5cfdc15353c00d1575fb5c678c9c760dd84250e4c7c86997536b3eb9759dcba1766b75e2a7779f1c9b1fd54fcf76941bc38324109454b9c417b08eb96acfcb999603bfb31aeab7cf763643a4d5cbfe7c3cfa95822786c5bcabf2cae1a0a9bd978d470d1b0ff9f980b4210f1cbb5588ae6f1cffd4888972efe6583bd2ddf4f716c79faf5f2e39027e41e371b035d55569a74453eb7b9c2b44da9f9a5c79bae49c9bbcdaecd9014325a158d874f039f2fbf4922639bf97e743bad5ec23377b70cacd6977f5970764cae294ea580e2a61e576f89dac57593531afbbeca0fdd6487c730d1225d700706711d3fc99ce1fc0b7eaa7f287d7cbf539ab7462d927304f2441a3e481f386f3f8a2aa2977d910556304bacf886e2cfb8a80ac5515a9b26c6823e118ad7f4f4a9a7cfdfb90e4f1ab36956f7693b22d1935f3f5996f4bd1f395439b96c8e70eac3e78ecc99273b4aaad9bd36f10f1c6db8c58cd554559b0a047e241a35445356d2b4ffee91d49b0eef961b8237fb9fa9905674e96846ae9a1b3cf99f88c105f1ff261fa98a385587ef5dcb61f4a4e6c7d9f65d33e7b45e2e594b7582c0f12eb71eb8f3b66bab103cd0f73addfd62da1264d8f168d5715f5635e6726a35ab2aaa27e70702569434ad6eb2c89247036c053fd26db4623bdcef801d2581b9281318814d6f58f1190fc0f9e9e324541226f95aba08ebb80ca2d3590dd170908dd0f2209488b6b5b2d88119009273eea1210d9ffb580871a8f121adfdcd8e7dca9c15b27b96c3c54bfbc75acdac1c93213f65b62a39e07d56ded9b95176dfe5a8ec32def5d3fb9addebf6a50752001a9fe03b45f16e2b49b2edddcbd9b10c71c715ac10b27b97687d0e466634522860bda7870e2fae5b601a3513fe178908a9933145c65c4192b4184541b0f09cf82b60e2f797c8be039d5c6649444b8a11dc40099e6af08090bacf702d82780eff6d19bbe58f06f21be7974da9a3990fc13558eb47e519204d51519d1210094bc1021a928b9f3ae1501c50a7a60ef0a2720ae4ef2d049dd9e7275c63f5db8f20efc1ed36ea742923bf4c76f0a2a84a6bf57350678b911c35d671ebff348d9f17e951754e43bf2bbb79a171cebe6e2416fa87ca6032e56edead6950f9648d2f16dc7699151db25617a7556edea6bd59338704889c9eb060f0cf073a7f4de70c5aa582c712c6a999b76b810fd870fbe2cdb8e39059c71c92512d7754d4b0e7727cabcb01596c51243b778d97dd5f79c2385b134e68612646445783d019e03dfea07bf6de294e8a056ef1d076f1eccbcce689c698326c6db070fae041e6c2d318c0b872734bcb98e7f1ce4fef2e08944e3529b555dbe658b104f9c73cd7537dca0bea850245b94dfa9d73b77aada559db80575fe683371ef0769f7c591954d9a0871eeeaebe76dbbc51d4fc4970869be1a2772ab1e0c6d07f054e36d1be6c764cbc8268239527b9f693db0f9af1f5a5f512d39f182b4bfbf7b8364782227d42eae8683a51c547ad5703570e5c7429cb0f89c8f0f9784e5a453cfbbe5c543e45ebe32a557ab0566f871f8e743db56fd84b6373ed9da78240f8faf2b9b8d8f93e478e07a56f0f269dd2687af7ffef2017ed03e407c75f81c5ff44e34ec8b65cbe7defc9a3c07c76e7e62cb44309ed37a0695eceebe7a7b273c873772220345f7e08057229edb2491f8cabe0a243415478e53f59005af5d23c49513f2ffe348c4ce7deffa9bdca4636e419b08a681c68ee1c6ad3c19ea7e42ac3a6dfe81ab25c57cf7ac870ef9e30f427cfec6e897cf6f2107e5a25d59731e1714a9593ba0eae61fa588376dcaab6fe47e28c4dbd38657dd3243118e458a57f50df46e10e5778197ce4ed0fd9695410d46d532d025ee3847be376b774169a9109f38af5df05e6f215efbf4eed6d7ac16e2a32f5e5efa876512e7c9bbc4f76e364e87451a0fa7486f88a43646d44380178b78775804ab17990d014b0111f53c72d910f14e11f78608e74644bc033c91a3c17344e27ef823bcb57ec4e1a7f7c3d123ea699ccf326f07536930c0ea52a84d11de384e98dbcdf6451c67b1dfb179308cc720ca80108def676044337c1eba2a34a78964d0aedcf9e07b0fc9a32863fdb119ed8ba1bf92816af141eb9753ff21c415afdf7ffc1db74bc23162e08bef6e9407d721d63897703436a23ec1ddfce184e3c13354f0f1308f0fc2cf6ad4789823f693c397cf5fe0bef2e1dbe0fc61060513fedfcf99de767eabd8933e8697ae62fe82d5c800e34e08439bd94278db5ff6b50d04240c324a4ae1ab775df83237adb1b52254f1fb3942342f6eb5e41ad9d1eeaf9c74847bd02f7965e69aa510928f5e1314405402801d55e100442501da192ddd5e2e37c0e267bf3ce5d34f2567b8f188b93f49ce70e6f071bd5e949cd5c6c7563fbf0d44710c84aafb93aab97b62f52950a397097a9f804848ba6008acaa7d06da40506ad17be57e49649ede3c7ed77342140f9879c8a7a70971d4fc7ef77791fd485fdde4c14e19223ea02e7176559f3714798f65c0a814c4fe722f1b54998c06afaec6deffc16d0f39ca46634d35a8b84a1a0e7cf4b929e6800e7f2aa89cb88a2bc08dd9a74acb010e8fe0311517a892226fd43d5d2e198559df4da89ad24e3dc9afb2a5f8865ba18d596613a9b09ab6badf5561753de784ee3115164a66e4dd47b622e51cd1ce375f05d04f9df3cc609c32f7ba9b0af04c2a2eb32d4a839f7a69fa55ade4baedf2d5710f9df3b614588f3ee37727ee12a24ffd590f5fdf4d4ad607b43cb6f7fb225ea7aff035ab3c1d6861bb00dab91afe45c6f5dbf07894c029e0ad2b1bc627a3a1f1f0e1ebc1c7534587b7a7f88e067826155792f87a92148e23ec0b5071452aeb6eda7da21013fb3cfff8dbaed7dbf3d1f76bd1eb0acf27e63587b6adea43551d81f88f48dc7a8ed59cc57284a1ec2b09c4863aacb75d82122d89c63616716896283fe069219a8d689935ea65212edff6c0752f7610e2d017ba0d6a0692890570b063f578510d1ed4a05270377ef48afa47aaa4c8fde9f3af4d9eb043882dd53f0cdaa2941ba26234d428e24d85badc507f08f549ac0df5eed7f59abeff9b1f5eed84ead777c909ffe0f6a77b3ff0a094489e297fed9b961e2722fcd9559d589b272fb4d5f30992eec5da71f06c8017067885002f0cf0d4ef1d8207fc46d48e7f2fa53a19674cfa662b780cefa0acc6e328058c03ef054e0e9ef75f99abe18dfda07118c752ca18c6257247dd0d55a09a3116c0c8554d265172155ea6943ad0366547c6f9f22545649223bf67e6988653c644fda931d838eaf88a2a7152ca979260fcd4a2b97bf3a0d526747af327e3e08775f8c29ce43321fe22e8c6cb64c70339faa0ecd6415761f36cd9fe248689f135ed37c7908cd4846fc0cda5512f755196363e006fc7d39b6efbee12d93ebafeaa7ac6d804d5285113033e5c6f071bcfb1ec2b09c456154a2014e1290956af57b35a5f32517e3729f47aef03848f330a7d9472bc1b917e44e7ccf1bde5371b6a965f39ed13b9be57edfe368a0405e0214f8057a9d45f0b35da2ac0bb00757a753da086c8d75a3016d600e789c6c26ac8c24a9208506cf2af46ef068c13000eb60e03ae90b2c34d6c75433c7c6a2755ad7139dd8d7d563d34fd612979f5ef37e4fcb9b24fbfb31e6bde3381c4c0bca11a8878571c2f1ae76c901838c7c5bca17c5e25dcf6e0c1ab80e7f43810b3f112df9301f0543f1a29319838679ff13d07e240a612e7efc05fe41463cf573f5ef9c5c6638498b3794acde72c25874f125d0f6d304252e015d4ae91514a20bd5c09a4cbd9277ca8241070b3e511e4a375af38cb176f14e02cc125b279e86d66bda0c6c710001a646ca6f9c73649b8ba445910606c3644bcc771f4008f38fac4f8068d47d03af02460abc1f14089b724d0f6a2e34bfb03e0737cfd124e627c4bd87898e62f3bb144b9e2866fb74f3a4888e5efcffb76354f2dc334296444875433a84921891a090ab03cfce64d73d9470484dc77c3d0c6009f755244be3c6bfd25cfc8cf2eb32e74233b4d399042a194f69daf13a2eb9613be3efb47c919fdabc5b5df5e2009caf815d377802d02fdf2a31950a384c2ae26c52b35d1eba0162e5ca96103ee0bbc398c7d8f6e8d2c42b9ee5968636e197c1fdead0d1213710a474aa9e4d31d6fb984e9d0a15d8fdafa2f210e7ce4e0d7cfba5ec4e78672605c0c0b8f368a5a685c555442eebb78f087019e5ae849aa8a28702a9fbc78e669f032d8c19fac1bb35f05930df01c80871bc606786a5ce80064de6c53c9edd10678093764e5985dc3d7ff20c4dce73e7abe285f0d08b9abc2bc9317cb36f8bcb5aa2371f387a5c531adb6b84e215d17f5d97df7e5c21dcf5cadfffc42a952f0c2ca40c2ccbccb3c6f9b0cd54f168887f032d90555662706058f474cfb097506e001f3448c40513cbe0d44bc27864f81a348a882025603c6837b4599dcd983c6a38445782321c88036a98c1a89af0dbf1f9de4ba2d32306ed98c5065d339b92efa85101fad1cf5e62b5709b17beef67fed06679e1af41e44c2810c32a8b28890c07986aa2bbae80b0849f2570aef2b0262e9757ca468afda33465c2c452f6b86f5975eeed2f74da0eef5639d16fae3c172800e7ea7e3c84193a56432f6987776ed9214f898b97f2b768d7e9f895118f18efef9382014a888feceb7431b6feac203033950a0d048209080d0cd5e90248e72c8408ea40824e5237f6a885846c907ef808eb01bbf5c896a45c6dca295f2b93e9d063c30d09163f46eca336d8e12892486d871c775a10d2c6c95d2c39c1b4a3def71a0ea3d9c132b21c9a788c1b3019e76f007725e96211300da623c5dbb0df054bf4d9cb945fdc0f88af60d8dcb8e6ea55d162e1462c1a8cfc5dc52d5614afe87840475c567c1e760e3c21bf68880480c5b0c3cf0ab5429a97439fcf8f6b15426b61c319180131d0d190bda91575c41accd75e1e61b367578f3005e18bcf6826c443c62da1ff18eed5c68dbd04b1d9e39e2bd40c3d78bafc855fd4c52420d1a0fef8e70be0e6c809f9b683c8c11e445942f438797ac44cdf11d4d84a933400def09be3edb11c47155dc5dd66ce569427c3ee5ad411f82b71cad5b94a08111260d0aba65e3f9067504d631119046abb0f6b51756186a5b55ee104697467fe72e85e8708c1c661703a1ce2f076f9803c1ea44f117d76ba4cdaa430e7a401ec4397ffa7bfb918b85386475d75e6d2e86ee3ca4bf1e25109400e860b848d55520caa14e1cdb6834a71c3f6884fa94d56844afd56b5489d5a228f9771d8e6694bf4df472fdb2ab6fab983c6b56bc4e95bc316c6d5cc2ccc660ba000bd3cc07a46bf7ebb27db61284a7dd2f62d43507a453275d3ed90a0c69c54d1760719df070ea87cdc6c5d1e1a9e777b62f7d68438ff89ec6e980d1eb0445f941f13d10dec6c2dafdee2a826543bfb2b4fe23fe7863a27f7c13dba28cb60c80770cc04bd646e4e8f03cdb00c337783d986c6709e1474d17956519f0f5db067478a6eb068cb61e80671bc6c3c33ffab3e0ebed8f84fb2d597ce3c6db01fc63f0d6a62d7eb6507d425e56116048f19ce3353d870c2cb381708211ec7d85653fb9f152564c2726265d1de3016c66546513c8af8ae546d5f4639be566c95fa414a6a6377b4241483b5bd598fb069540a4ca8283a3f628a841e423d10e233991400021c06c95946c0f251a3e610fe8cfa34aab96a5bb265d24720892a0943f525638fb766d5c007bfdc0a4833f7861dbb1cfd13dd1605c361efc85fce0f719f1193cc3c1cf1803e1dd07720c3c67c37bf1a077e2e105deb36293317310eb874650715cb6166f68bee16dc03c6aa8c350c3914fe6704e7050e48fc7d74fb0551b8dfccc88ed1df4cc481e4448f98d9d821b69099e0e9f5f49ccf1e54661ef601bde20bed1c4f07df3c40fceb03e1e41f7d724bd7e931d0f8f9014360e5fbe1f38fe81fbad30197ca3c01846064406574909d7f96cccbbb3e09c8b80ad1755ab980414cf1f1f21c15c576cfd1221b1a1764492655fabb080705072b33f0a9179e9e9cb2e961243e8f194a1bd5a8a7811db89fd0645ec7e24f229674b6654adfbbcbafd5229397cf5ce84f1e3c72bf898251507060f74cc361981ab4beb20608602c230491e1a495105863ac223f59a6c2dc8a1420428ea0e6942a04d4be95a68db50e7aaca750a68ff7da7c56e60e2c11b3a76cfeb171b1701e352a08d8b29402a83b9fb9580111d5551c62494f07ca01137c9fb243c5d33aacc04c02b80be2b3cf349459003fd28827e08c0bb2021defeb4f5086f18c0cb4b3c2e566ccb3aa78e99f366aa10bbc66c5dbb1b22d16b408a20d11f25d1f7554dc914d1af1e55586b85687e6dab9b5d1b48977f1d7f674c856572cfcc82c0bf5250010645201790f13917e0d9aa5f002f53a9eaac7949ba419bdd4975f85c05e3d9063a37882fcb2e8b2a4a2f4b32da06d87a2b602a234fa55a04fdd2f1f5dc5cf3607c747864d44f723c7c467db2e1a8b6d10941cf864bf8fa03406d03be5632f8e2fedd7cfaba99d31f1262ceb153de980daa739f711c6bd4702c85ef8151e6ce3ea44a87739308c75a9164d9d76ebc50280ec4fdbc507ceebae5468d2276142510bc7a3621e5aeb4cb5f5b0321f878a73546b0f3ec9ba4da824339ba48d5a4e2eaafd7148063727f43112f47ef2fff1e27884447245c4ca27125a19297163df5c381c03917261a97645545b00cc62679039dff0e7907dea3493e283144fd2a3487c1d32506136767921844e3541a096e244cc8d955debb7b841b67f4e345cb9d1d10df518f841d6be4d0701e619d906492150f512fc6f51c656ec6d186dd338d9c2ee7948b991bb449b517ec4ecae13bd0ce6a14be519f0a15f177a09d95103e735715413781728924f9f59b783c7c123093d01a8b2f977092c557f8f085f18fc676d2b70f7d72e23450a993648192076388a9e64e3c78ae0d8f7f63dcfa86759f7cd9df91e8f92eb58b2e720fd4a829421323b133e9ea59f5398b742defbde3e09f40254577599f0b35de690da9515250d21aa7d7bed425583342c007d8a8fae03527282c429426da2520172ebaa5ec5cf7dd910bd60f4d342ebe71c8d2c74fbfe3dd1799edbf633c8bc1d3e7c31f819bc9e099f00b27c4cf1cf91b4e8c9fef3955fb2295c1629163e807e0b1be68f9c58ea3c69b083a4a9c98c281ab24f1c229e4d490c084a196906b2ea84c71bf378e0bb6bd3be5c31afee6fe373c3fc1f39595103e9f87ac86e1fbf0cd6a1cbe41f823bca4c7c3bc1ff66c3c4cf0ccf39914be4111e441e381eb7ee1cdd327bfb44c88efbf2e9ab61abc4b6b98ea9d246696fb0a55f474f32012129e34d16675d2657f131059a2cbea2f8805dc393aa729b871ce33b2ab360f3c3a2c7a76ea230a26e5d24a5575ca0055d3d59478c10c3a3c16072019065ce1e06ffcc0eabf23420470894021018b272c9dc45a37d797715cfc014dc3d53b98aefc18c691fb395a5bc1d34dc451936efc18e6f41066b60d8749263e9d2eebc73144c6b3583fc21ade6663a8de8f418600c22c455abfeb515831076c6534de983a871b19f17b4e4060c3c5df35bdb3bc343346801e12ff709d217cf36653ff6d684735fcb9edcfacd3d7e77131049e9a6c45c1c6db84fb2fca25493b495b94095ff3fad2e16519f0e53699e16cbdf9ef086fd478c449128e86af49b2e6e3e19f3f24a476427c93b5f501be9fbcfaba331dce319238507381b656544d611b6cb8c408e17d1f1ac6c22f493ba291655f1110c7fc55b42a5ab77b72fc428bb283868c51902b891d3ca0e24ae99352d9748e8210429515a685c78baa30fe040909deb4610332e1807ed801df275b108e03356c299cc8fa7842522a3a366d1a6b6a1bdceffdc48cac5c45402a0ef5bc77501b1676d4b751f48dcd5526fe833f0af08603bc30c04b7cf01753ee2ffd20e2c64b5f843033dee2861c87c65c1ddeee8edb9f5b364a885537ce9fb969930248aa4bdc58cc8b8502510d91bbb46e602462df1d503f77f71d22fe0009c3b8e8eb39300239ca0f7a369e001f72a7892423a68d077d6162959979dd717cd97c717c03545c81aa5aee1516a4e26a64047934ec234c3afcc68f8703edac84f89abc2619bebb7b6c3f78d915724d7e5977335d7486b60c76f119d52871a06603afaa652a793a7f6ca8392149baa4ece90f1b2e74e564b65ebbc6f4a33a9dbcb4c7e3525a589d3ac4cddf2f20ecd0e2c62ecfaf9f5d15ab9e8ffc3552b863be102b3ef87ae32c50651185c6fb1d1885ae05ef1b8cdbc0ab4cc938be063ae0ec61c74d65adaad0b980dc9a95592d2621f5fdf8bc875b7f22c4213bba0cb957e55eca73cd701633629b8c96be34e03960b4f522bd99511c9e4f36e23d13ee519907f79e987270251bf19e09c6c5798d355e1afcf3b32097582904d6c1b8ac1efc7dcf897f95ebe41ff32a56a0771daa00c0784e990720130119d3c11859f78eaa493201824359a6d7c9ee743d7df2607784fa586d3adcd3c07af6ae3e56fd2d51712371f3383a61ff0d7152749f0a18ad13dcb0a9569dd159c2179867011e0a7e70c4b4d520be682c6611e409e280549ba52bf7dd6343c66780b79711e45e3b30275972e361c16e0fbe262121bed18b230b2bef12e2c3ba178f72efa4dfb162d3bced10c85a839932c0385e7505b4d1688e1933307e0d8ce518404d57d776024c6ca197b5a291655f111038288970a064200fcace438eefd1fa2221d2bb37abf9c3dffd1b830e9a7c4ae9a17be9c042083d9532c935962fa99d593ab59ffa0239482420387058534a0a14ed56a99a544c9ab02d3c4e736dd25d6fb8005c22b050bb12d2299f5fdcefd85b846832b4c5c0bcf31b1897d1466f1d5c88b1b748c2910bed79f1ef4a7a6197b088e47970e1559037d4681a35fd60f2a7e2600431e00e79cf6b09068f6df879ba5757a46fe45c57d29d78e9b377bc243754f5c6ca6995b0e16a1981c08d878484bc5bb6c3f390f61ddd26f9fd36eefaeeb1fed4bb4f97eb29342c745a4f77a4bcf4df19b167319dbbb79e470334d5ffe4d37fc7e049c2d11eda70877ec30c460311deb9eabd041fdadccba8e1886923be2574db4f1ec00f27c437e8022c824f8c8f82976c04b9613ce292992a784111e441e3c103404b1a87efa2d367747b79b910df144cfbf762c8d987779863ba7dbccf03e3d7f08228b4819084020c129e733c43c75eabe8f71b0141159294400ed8d836afa25c8883761d7aea5fb6c69eb2dd5427164fade045c4ea17f0c084847aa40c3cf04229ea5db5fda019338428fb7cf3524caf5e8ba94430e508729c18d701a947ea4e5035456222655e0b75186aa771fd37155f8a171c9f3784387ee23983cf1a2025b3c969a75fd025f62d1e98ea692e3114b11b03b9bb6e0e480c53496270e02f2e6c07e0a9dff31b036961c3c6c88103612acb32cb73701922dee3e0a9f7e480c43015e6976fc41276d079d94a75bc9153a4d41e8af15877d992c5932e1562c16d9fbfffdd0ef502cab67ba55e1321c100529448c02db20e52dfa06a8b245528ee9dfe479dd9efd9ae727da76c4ebb23fbcc04e3eccf8eacdae608f20ce87faccdddb825398afd5e0c84f1f3180c5b835f409cb30ecf8bf0566d2f82bc04da61c05f27fcc9e2eb3120d9807f18e01725856fb62f823c4383e7112a7d7d992454c12ea82aa10baa609e70bd353227191f0f8b13429e832b31bea5e11f87bae7d8077ff9f7f4f160abc5f55ad941d5d570052d12106ab3c067241c18af863901298d3b128e0ca81db187653f1bd15d0e7ffec269f76fdd26a9e2c591655f7f1dfb340c7fb9eed38e7d1ea05befbaf1844bfa834a81c79d58d3f5766809d4ef410dcf939b31d44438c27bd2cb0485c121028bef7384481b94bee1cc0e0d1ae7c2f0acae733605788d6336246f9c193cb49d446df81c6d1b4e627849bb2726345a12dee358f661a1eb861b1df15e0c92c7a8baa9ee7d318591b71f9806e9f82909226c28f44ae13a65d41d932d84b97b93111d4614379e4b58ca3a6ceef4f129c26ccb209b1ec39fad676f1e13dbfe087e0ef08d30bec66cb3cc481e940d37c17c35b8ff8cf84669feb212c14f1a5fbfad445f5ffe7da2e36bda27c375a7019fd38879fd363c1ed1002339b31d96656d39f3fb4b84f86f97c7ae1f05aa27be3ec9dbea13bdcd039fc9db0a6d1fe814a28d54dcfab5c55e967d2d81600d3c6bbc2aabdb8d271edfb6af44e180f4c2ec6ce10f6cc36cb2fce62fa64b6dfa5ccb6333e494fcd06a49e9d46239a89f55ae40dd208a6e38b0357de073e6474d5e3638b0195017409d0bb593f410e805e090ca231f6a49d8ba0ce993e7ba21670ce9ddf7b977e533b345bb666e3a787f6e28f576ce819902bc7c3a66e08882ef90470e0990060e330738b8a94c22f4020805c02b0078c8e13a002f1be03900af1fc083d131a9d0b8caccc0d965aaf69a59dfcd1f3b4788ef1efce22d37e7955b304710e604229515ba3fb2eccb6803411d72046e2624093517fbaaaa90942c4b9e5ff8f87629011f7ddc690b2f973db3beb1cadbdc1e879f0db63e5f7664d8c619600bf15424163ca7da0520bfc2bc490944a9140772152271dc20491247afaf03bc2a958fa7ff8e70862f9754c9f696789de52699838b2495007cfd39b8747c4d7790737c4ba85d00ed8c84f0837292f1f1b04833a0e019727055cc2d5bbe42128c31998fce78f2cfb10be9dead5059dcbc24ae205954808abe1ace354ab904eb95182134a2a35b3ad451d4b020abb6166a47ec65d9c7048422ad5132c0a48af2e06cdbace3dcedad843860c94157fcc90d04f4eb3eed584dc9e9885eaa361c98d677a122f74ef4832e3c2cd78df45ef3c682d71740a01837aa9331e946a89c40844e00001c4c494441548f563511103ec0af431d2729c44a41d008e8cf63fa79b27960fd8610e7e5dd34e5afcfc8a9989f3a6ba01bc9cc23598dc66538e84daa01cf58cb23bdd5f7a6acaa5e1658077eaf36ca545fe4b80df032009e03f0f483df3b386cf87d1ec0d3dbc9a6e93644bcd75d573d73abdc80635e7bf4a0e72546f56323c5b4119173830d59c5084715e89089a383e474987433f2aeaa697d20a3a18e742d5968f793fa0d3d52129a50e79473faf513222ec2fb3ce8474b357e487e0c4e249e0a86cf9b1a9781e24ef89d9a67ae82290960300cb6810446774bc737c96cb8088fd2aa9b549e0c7e10befc8ef012dd0943f0bbf80322c805e2c79d46b88a36d9f1c880effd8c500c5ec5e96597af3c5c88f71f7dbaf8898142ec7ca1f48b5d23142052ad628e3e24202a6da6a8445b0710125ad7a8ba02491a8de5513cd710d302a81df133957da4c2f2b98539f0392a3fa46835fbe5f7aadc2b69eb2745be5fe2c66570916f38a6232711d08e871265ee726daf3cac26679110bd1fcfbebef72dea498c4477534dc4ea54a8e1e0c038120c34a4c875507d910405dd2042801fd8896bfa1d7b3e0484c855ad5dbae9ce4fdd9bdf52e7a7df606789b8c86cd93311a7da493e3256570d7891de8e0e8fa98a7c11ea0655d170701b0dcac1956c72442f729cc163eec64946bcffd86e45e9e7cfc943ffb29a7198b4323ed23f56b37b3f303b29cf0c40eebd90a286447f4d7927fc81a312a3dd39db8f8e397570f7cce110f7e2b079f4bb4367b17189c6f797543c6341c56b52c1f0e4a449469037a092dc337c93cdc165c697c38736c00b7267770c714b368f0351e3da08156dc2f1f0abcad4f75b0b7e3c7ae65942bcf5a2ddfb61596f5bfad3573bc0664b2a299028785257aaabf5e729fe23ee8efed83b794034f608199f9fadec2309048bcf688c072a06f649dadef44f2dfff985e4d8da2c3fe4d63c5b7e38445c997a968873df0511d0a6fb007201a6a380c0e79d24cdef2244bb778f18786e0f210e3feae84d4d25e7b86ae3b7abbebd50bd0f250fb1595538e05658c79328354a1e79f09cc5fa63196ae061425d549df206d4b25f7f98611f7987241ccd1e6bf9d23b6fc7f0bfc6bd09ce1a692982d98e386d8585973e3bd6ef38ce477d6e037d2ba1cf15073412daed54d8a4275930d54891d07b65c3b89690224f00bcf3005e4b801706780efc3a03e0091d3fa62210d00f0f3fa1e3c7eea7b0e17e8d0ce20033a09731bc4b5bacbf64865c4fe3a63e71fd9beb152c727384ab91dd24746ea9ac84fa23a8f17bf072418e8e6c2290d9a01eee5b201516f6240c354820d65a2901bfb7e02337434297bb8f1fed322e299bd2569d7a6aacbf5ba0bf27417fd702ac0ce8979a37baaa18dafe7156e3d142cc85b68297cbe0d9d02e61f06d9d538ee3c4117e18debe36beb77b8a6f9c4a2a0cbfcb80df69f01bc037231e5f092f17da1abc24f05d0bcf69f88acea442cdd84bf8561c54b1eb93ad35df3d23c4c42b9ffb6fbe3c0767df38615aa11c89bac2da372a4f56cfa031bcf272a8c1468b2a2bba39b55c7f9eaed406c983ae1960f11e941b1025e7b0f899cbbe22206b55c50f54aae1407603fd36ce5bf5df8a17e4869b7fc2ea56f32547fe4adaf893dc3cf799a02ac19bd73c115e9125aecaf1bc7e6cb76afa5c8bd37af796cd6f7b8fe8305872a8ad97dd33e75a79386cae7eb60e0e882824d32333b30df88d66fdb0597f4aa0ee9cb89f2120182e0169b1bb75852be90c3af39ec71e7958f6efb5d4290fb8aa3557b4ce8bc33b0b44e1525da71ae83668f2563224eff379bf08dffd0628723b002f1be029afae71e0d5956df09b174c0565ba002b0bf01d872a02a6d20a5069543d5df1c98f438578efdc27434f1f283793a89a500984826c19c8d1018120f747cc828c6ebb702f0ca9acd05f1e37e44dd0339bd5c81001d10ca1a429d77575a4fc964552223eb453f727af7209d349e2fa1603ddfe820d299bcd9bffceed0c18970218171c67d5f6bcceb40baa8c49128bc88b4d87ef8f7f2881b682674892484917b97b31c3d7536922c3e24b9298781d9bf035dc116ec2374e15aa8f8747a8d4fa32a8b812b8cd17c17309c763d103d35b3db750128ebf8fb8ebdd1be4e1ffef1dcb773daf3acc250db2c5c14da74450eed63f47c607555c787f0dd970212720b9e9a2a4910bf55a56ff6c655f4b203a6feb3b8051a5e346924746d7dcba4812920e83babe78b514c9acefad1db1886cd3c499379e5ab0a0534fbfa859e55172223b457a2de9fa8dfc608bf871999c98adbbd76f2d03ca4d8403f1c40e00a123c20747381188e9ac4649a3ab10170eb975ed09238438ee8133ad31f2fda1d294f3738a85d9f6309a38fc5ed08f30f4836f1085add948e7403b57c1838ba54c07465080176ef42230daf6f319156d784a1dfc4cf7eedb881ebcc457bc06300675ebaa1fdfb64d888faa47e53f9a2e259089eb5fd90ef7bbd4cc5775d58150a32482840475c84860f09e179438d046862a0030c247bf861a3839ea890d6dc650b846f5b2755b46b917f6742aea1d71df9b3eaae91167a7094f7a4932dbb037cef0b6305d58a534e33970419527b1e23c16a8e78c362907e021e140f8b6d6363318050de34bed5c6823fc0c866f4663f025781ec391db20bed90c5f6e7c2f315c5065769bd7e0572d2e9fb74eaefcef7a177ef0a29ce79967bd37eaabff516fc0839e6e38854040b46de07ae4711d14df012a2b6474284d3bbbb08e240e18005dd92f7efec0682afb9880709b001192d150838ac7dd78dbab373eeb0ef89107677eb6fb39b9e1ea9b7d73b69bf77e2d898ab15fc771140d6e3c1ed8967a54faca0cf99e0ed33a77bae023f99e493dffe3265dacaeaed8b25a1e183b976c5982ba47c28fa74219cdda923368726bf359a9c70a3170c4b067c352d239befaec7f3c2027b669a4e588a7fe251fbada6ad9f1558d3382b1600b3a0b16b05f62009c92f456f2e00d03787989c7854b0cb8710c0158283194ea91b7be48617ffc0a124001f0543f82af7885a29eafdf56d7ad5c4a8c859fbefdcc637f1262f5b8ef66fd78bd7a0275c1d540389063ab423f79241ce82f8f5e56e8fe88de2bb821d1f88812ea5ca81dbd26f76f201cb46e60bdbb12e8c6b12b2f5c7a8f94b05f3ea1c9204990ac2facb456178b78d5870db0800c41db81b6c7308d86e7543b0bbc14e7f99c0f54db8bc3d0e1d33e22950bc0c7f887c632180d1b9b050ff84c94665fc39718435cb70c3e6314397cbf338603fdd4e163c4bbe72596110fdfe42556dea6ecc3e27652d2387c7ac757e53a99d2fe8587dceb017ebc6bd93f7f04152a19b7c1890319962a8c244723394a1ca05245c281120a8783aaaa08dc881a05c9c3678b43e71f5bece362edeb17c06be03d3c4e03931ea681313b1db2e8ba92c785b7dc367f4c441efcebd3c79c716302a0e835918f1c056e3cb0b4302f1df937f6bdc854df5b4ba03ddd4a738d5091acda794bffe306dfd43ef68d94546a5b57d72e7545c86662612cf9e3fbd1735ddd64ea75e9d9ad1748c2715fb3b4e3a4089a529ef6f7134e907d3a36f4524f0bdea4b0092bfc8833d217348f1c1fa9ae26153d415564764b74183c1b5af9f09c7aef48c0a3a7cfcdd186e7f2015b354e4101592381e3ed0957a8261f399db81f23ad6206cf4e342e91136bcfd875bbe4ecc6bd3ffe09294b2dba67fa8c15e025558b374c822451b156d5e570e0574c55352728da8d9022ce888e81573ced35b27636d4d84324206ae42969273a6de0f5022ea332a0e2baa7064bd6a0d5d5ed36bf005e355a31a878e2ae12566d1ce791c0680cb362b7e1906dc3e78d67501999e68d477c0b7695b23f50af61f8843f5b7741f8227c5b87e7c13748508dc5d7a25974e06f0c5eeddc9aa1dbde938ced811b577dfd8410cba7cd9d3b5dceefe2dfcf18ba0a24803a8c2fc2b000583f64ec46a70dbc89146d17d3f43649c4681c47af2a804757d0a2b11c53eaa0713cce89c3ebd9fe28fb8980708e8d3878880b41ef28370bad5b9acc16e2a4d0f965279e28c4116d7a9e3b65977039aeacd08c04b0935dc818998d777af7b496a8e78c0bcd0678c87939f07bd5ce5407a0dcbe08af51073f7172f970f0636ea825a45977183c1be025de807c1cd086b4c41adfe0b8e081e1c1b313e29d0907fd126b493cbcb87ee804d10e509564423f96f8c625d6ae3bba7a52694f213e7fe2cd371fffa79438ae5f70c5fa6eea41221c58a3bba38af116e519d0863ba3c9f8788ffe3b525d419c10110ee6b54204841592aca107c418a1f7df59aa4e4f97df6d4fbdacc59d52527df0cf47bcbe5b12971f9b34397b5642b0e1186c0341250913d7df12603c928fc8ce0f800f8c888f21083ae8f708de1ee08bed86096192f856f7ad18b16eb41065af95e62d1c24c4da9edf977cf59510dfffcda95bbe5ccefdb0fa1f78ba7fbad707af65c0005538e0719dd1454e6cbda2ea94240cf41ac414242ce0b50e08d1af877060d95f04c486d7e5eb3512129f24d244d5cde4c171f6eb43bfbaf926210e98dcf6837b6b1b78879f6381cf6921ab8d96091c1bdb781e8e3e0edf8196612383e4b3c4d20e7e12817df0020e7edf01dcf00649000fbe050e3f0c07bf6ddc70221eef2424869e498d8b0f1e7bef4838107ad281107bbe7c6259ee7229ea7fb2e3b5839f1d21c4c693579f5a5aaa20d2d5c0b82181d3ab0209a37c34d4cde1f37bf4e790f3abe191bbe8b6cb7204910ed916890b7cce2511cc029d02eb192591a6d708d17e52e72eedfa0b714ad5a54fbd7fac7c664cea573dc618e0c7dec118172eb10e03c685136ce3fa0b98b7b0228b494b9241490d6d80e749503640cd07787663f0956d0bda084fdb17d173c4e31139af911935f76dbb45ae99ba9adc2d72c757e6eccafba1ab9428c4c6c3dc388c1f1e5d72ff324920567fb160e5065085f20be47c17ce2121e1f7f9b01a1916f2ea83f54636b74ff59a22cf791a76765f8def7e22241c36d48ed8cf657f11102c0ebc16365c0809c9c3aa46498436dc89aa6ede498801cfe755e69508d1ca6e97769f7b80f4b7ee4bf9d2fc2adf42ce018e2d7fcf2406d9b2e1398535a492900b3e1fe0393a3c347a82ca2ce8e0cf018961fcbe95188c9ce71e4a0cc62ca8744018086026a962b2dd0db161c1aac953ee1062eafd2f968cdd2237d55335a328391c120e4ce980c645201095a09aaa28811a545864f3c0da94b204bd590ae3474a78571507dc1f432a5a6c2363849208aceb26c818fd8f109dafeb73cae12b84e8bd38fb8a172f97cf1c9ebee1845d0dbcc42f61dab136635ccceb5967e37ceb399091311026801f7db07eb49b4266e7275b2f9e7f913ca85ffbe9ab457245576edcf5c3767990d71d53f38d6b634c7ba7c989ee78a4ce6b729b2b99a57d956e357954b64f4b3fc35561a7be9a36d3d540847e48f92e458e636453dd37eebc45fe5377b73bff7503aa8b5d9564ddbdb5396ebb6af0ee27dda499a57f5edf7fcb9f25c3f1fdea66db24618e4cab1b42778023c78e71122ca54784a5efaf67f7c3d0818e8403250396361d3f4755a9ef9e8ed3d8f3a7eb35bfbb9cd6a549e2b0a176c42f54f63701b1e1b5b8e48157456fac14d86828fa37295375b335aa766d23279f77f16dfde5001f36bffb09fffe56c23825b42866943415cfab44bd3570e3b1837fffa98a748981ebc23de3a281c3f71dfc98fd75b07a6fa0c460033cc3c1cf556806db4b902a11fa119952fbfd8e51422cc8f96ce9c85e427c73c9b4260b2f553fc4540cb54cc4279515c66fa0311209489eaa2b5bc2ef180748120712103c60d0680e88373a4b293c479208ae6bb489c4a9b2dc8237663695758b49ad171df0b41059b75df5dcc30fc9cf8e6bd9fad2850dbc0bc7196d5cc3603ddb64fb53d824cbb8980807ad8bc4b6c5e898e83dee3cfc74cbcaac09b709317bf3fbf77e2c39ef9a77ab5a2381a7ecd8a822c403d1a48a0992f84c05558dd0539a3f06bf9ea9244d0403e3c37c3754627f0c81a73c7715111aac9150601bc7e30b563fa8f7e397575599cafe2620581c783d974450878c9208184b9b422ea2780eeea892df3dd6ed2d218ee973ea8dcfb595bfc94e7bbc6bd706de693389616f5545392213e029c2316c2f554539f0fbf12431c0d3c9a98a3cce9071f8811243e283df67bc25788d3c90b00001ab4cdb55b2f26521a6f71b33f8b94142ac5b5b7cdf46b8cf05ef6f41af28ae2bae42c90309c7eff436facfe3e7fc821d9fc4f173e992e179eab1a32a7e23661a787fa5dfa66a97d38ed510b0e8aeeb339ddc19d77516a2f5651deebcc3f502cb12592989bc253361fdf9254cd3fad3b08c9b371b7e8d8c87056d058fade7dae6d54fbbf335ebbcf7224f0e940464d0ca8f36429c0c2718940980dfe5cd6e7e345d1d1dc859db7ad3a77a849a130eba629a110aba480c250f7ed531339a930481eeb568f4fe34f1f344a8b8c4838ccc170ccf30eb8f2d7e65e5972220581c55190989ba5849a44352bb74b8e33c9ddd7ddef42b210e38ba6daa1b887852eb0beaaeee2844abefdb3d79ed9112f6ef43a52d2ff0bfda7830db49aaa08ae1fb9e012a013341417836c0432fac868dfb6663a52e998c037883c17b2a799db80df06036e0bde3008fc181de2fb1bca9e5cfee9cb0e43f42ac7867ee9913270a316fc347b316b869f41df1003f68c8fb84491ca4b262de2adc8b8a9e0337dedaa374f868f44482810705cec0cfe62f0ff07c84049c455220a0311572b5e19dfd2499004171d773ac2dd779ef36d9d13edb85e8d4bff7c45b8f93cfa6349b7dd25d09df1d56ef6ea4d7958111e0eb7973b8e483896592d9bfe98d4563c7aa5fd2018ac6622018949b099358a24a0725402e8920216964c474b430f1f3bed433d846c28504050809d9c0b8ea88db401ed09fe384019faf636d7e11192794bcdfbe6cb98ef895965f9a808455e5db70701422e7950a3611748f4c3f1b6a20204d58ed66b76d1fca38b6dd22218ebd7ac0ca6b5e17a2e5e96dbebea052c2fe38e5cd56d76b38d80a074b3f3083365e26f3ea1a0c9ca07923db002ff1c18f5e35681c35d9364c07bf4f05e56b3b0c9e0df0d4f7a05a6bc0ed1302fe40e2428ef4b19a9ea512e3ad9ffc9839e32c218a2f9b79fd74f98bb5cdbfbf7f03dce4176157c6e2c153fba3aa310090a7a9f6a5b166c9e3f84155cb6e1c347a55617b5fa9046c55914a0bf6194a22b4aed1c88e5e88404888419aadd74de5e77dcf1ff8e619723c0f4b3d6ade2d9240a786d29b76a98e7bb78971e15e7f06e378dc7a89fdbeaa7877c6f24385f8f0af2fbcf7d0003987436b3f22f767640018c1e7354a8475ccbb881376ce69277dd5aac37e8f6d4e4870fe1921a9e777e1f7d7db51d6f6d559ec775c1565221836c3b7b1aad35fbcfcd204048bad2ada700ed4209c23c7461b0f75caff50751ab8ffa69fa36abef15cf7e096d7b4296bdd5d88eeb3fbbdd2e72a213a0ce8f2e4f9e7cb4df942cb97dcaca9a11742e9cd9b37a8ca11f1d8c5490ce3e1533cf88be27e9dc87dd70178d90c5e36c073e0536d63d3c1efb36518085631b47b1a545c49aaa0eaff50bfcee520abca77b75c2125c1d259eb87cf6d21c4bacb8bc38bda09b1b2fe9bc37f7073419d1c9d100952013077c71a20e4d518498e5e2aa60389130ae6868b1ca2cf5f9e7174fb4d97eca88aac6d7f56750ae43e42552d7921028344eb1925136cc7ad6bab87f559b3c992efb8b17fc7e3e43ee8d0a1736d7fd9df961fb69978861ce7d4caf45d47ac4e5e051ab7de62a742746474b4eb7cf0e584ff5e7aeb07426cbc7ed588cd2079d432af218a6b401b15c63540bb0a02e55045c9bd8be88a602d8d6123ca70f63bd6364a24cc1642073c12166e8b40c26070f32655145799fdaf2118bcfc5a08081647557cc385e046ae14f0d622ef16e4e0b0c68d0684c5c7d1dd0e6dc829e3ba0ba7b6489bdd649610873f7ff42387ad10a26ddee157674889a5e9a52d7b1efcbc7cd79d69fd9a3f21eb05a9bd5db76271ae382d66244d17b70b298358d789d6966ba65e635d163357cfc4ce58eabf6fa31fbbbc9e351d7d73a01c27ee73793df97b554055261ea68d1d3b4e306f98f8a3a545c14868f00d40c88354227f1400d1528a93e9640c8d7d6e5d690d72554c91eeb52fbbc6ceba3135356e246cedef6aeeadb85b888a93767e503641884da135976ce821c44fafaf1ce0065445cba2371087851bcaa0cb454242e9f499b7091110943ce0ae7a327aa34a04dba7eb9f73a324e215015b0aa620f1795519541efbbc38aab2c01d3934186a201cb89e7d9209aab8205e240dd63512942693a18608658ca3727f77c83fbb7ed05eaecf76e7747a24a3408803fe79d0968e574bd80fa51f71e005f25d57a655bb0c53a87d685e6c9fac1617c5d6e36a71ad0b6377687b97b5f2bfafaa26f4f902c697e21ed046850404558ba86a646ed3e8d6ca0908a98ad841baa72a459f0462806bb2b9f822ba79cd0810ad2b0e2fcaf037e0f3db2fbf360282c55115b78dc091e88b64a774ed2099e0c6a30d88f524f81c2384e1ea5b4af3ce3842dcd0a87a203ca08d040efc9de880301d509e1403c54efcdc2f566cbda9df151827f2b31bfac81889124090dba3e1c6359e769d7bbb90b19271aef5f83ecc5d05d996f906ffc5c61bf0b0b6400d0c11caa674632632486c5d23e1f0a970e1c2b42613a1fd28fb1d3cc709145d5b10d26be6f6e071dc502301a13bb7d1c681b6282424a8620406006d56e4ccc024443a786df6fea8d8b3e2c0efb3d8e700df47580ceeb151ae5ae370b9e483bfe34e00765258ff064bea2f8d80a184551505fffb7a68a36da41e099f03356c083ad06003920a05366064a0aae9c22048934c04086be00029d0110906236016a45ba65c48904c11d2047a0707271c581219437fc1421bc881f69dd0fe5055f519f0f965d0462323777fc47187f18d407a6a1e7055cbef35b8873d87aa29ee1f8fb60d788e0e80c5806f0eb47f2dde2b8eaae8a081839a0e1a94111f60cfc37a8b02475f0f1c7e3decdb08ac331cdfda93549d066d92d4611e8880601be0e3bab6eed4d18ef685f7fd0dde8304e478a8e1fd35f03e5235a2c4c19c1de8aa55945819e72eee177b548c84e633f61caeef0758db81f619faf74420f0f3fefae7bef7ffeadc6cf775f9b54a2058d41546640be1b612baa0894b26c8713149220db262a68277174a22292c9091736c248120e140a328e0451120889f8960fc468a89e38a425aea7abcc9112513ee478fa91e78ae206ca36482de52dfb1e7b0662a325299e1c6e64671201ce2661dff5f5d715485f122dc7984d617974cd8ba4e05556c1aac677e711aad6b6088683da35718638cf8b50bf52c4e069d2188016092087762e0dffb22aa11be2db4b2c792475071003e974cd8f77cddfcff235134b6fcda090896b0aa9879db8b0076544d073c2728b86160a3a5409a6fdc70c499618dfefbb0517d2a2cdc70600c251516120e5b47ffd74a507c1b83d5dcaf9e0e6c6efb084a01c1b2dce24152f72c7c0e048908467ff67ee61f6f348a23e108881cffd594b0aa685ddbd0b6f49ae2499071428282eb783bb471fd1a6c2bb4aeb9ea0a094936c30f19049c4f1637c1bdaa7ca93d3070ee741d8e31cea1b1c56175234bd0faffbf12547e2b04841747559c83f3d94c70232201818d4784856d241fc1e01b0d37f4437a5b200119ccf0b493e9ccafa038ac86c28dcef5ff85cf17e9df932d020ffe00b7c7084b3181924994fbc9f33aace3f98bdb367eae1256156790b05f5c32a15429b85e0d0c135fbf21b6fe79c4bcc5ce036e1ce671124448b8a4c9920e22e1f125a774f4cff7f8e076f6f2f7ff57f6b0fc56090816aee2823679baf7841a0f7eb8e8c5ba03da904f9f36144814a1f17a9b366e2fd606b74a52619da2a3479fffca4b14dc33c558f6c538fdfb285c901385c0309f3be42068ff57afebc71a3e8700d1e8013a1cb26160bb98e1395cfffc7f5de10c098c0724bbf1d61facf310ae532619a3b797f51eb4c71bbe5f92f8bd34efc83030b757f2765bc83e8775500fb632b84d9f728b91ca2a47fc5ff94d97ff170000fffff898dda83e6a16740000000049454e44ae426082', 'image/png'); -UPDATE Product SET PictureId=10; diff --git a/samples/core/src/test/resources/db/tablemanagement/V0003__R001_Add_blob_table_and_data_MSSQL.sql.mssql b/samples/core/src/test/resources/db/tablemanagement/V0003__R001_Add_blob_table_and_data_MSSQL.sql.mssql deleted file mode 100644 index 781c52141..000000000 --- a/samples/core/src/test/resources/db/tablemanagement/V0003__R001_Add_blob_table_and_data_MSSQL.sql.mssql +++ /dev/null @@ -1,5 +0,0 @@ ---Rename this file to V0003__R001_Add_blob_table_and_data_MSSQL.mssql if the database used is not MS SQL Server 2008 -SET IDENTITY_INSERT BINARYOBJECT ON -INSERT INTO BINARYOBJECT(ID, MODIFICATIONCOUNTER, SIZE, DATA, MIMETYPE) VALUES (10, 0, 72861 , CONVERT(varbinary(max),'89504e470d0a1a0a0000000d49484452000000c8000000c81006000000fdc872dd0000800049444154789cec5d077c5545d69ffb92d04297d8404db020c15e028a9817052c5850888b65dd447445d85d753fb16b6eec8a5d41455c13171509764511352f7614ac80080a449a0816a4a4e77e73dffccfbc37e7bec90b5d77f7ee6f3d9c977bcf3d77e6cc9c32e7cca48aff5d9b731d618174f552c00114f9cda4db8bc16d754d6ee67d7314f0ca4c9cff3d00e76e2a63ffbbb6e945726a9343926b7e5fb2eb8ccde26ae32f2e7fc92ec8b3677b8eff5eb6a98cfda75cff5320cdbbc280ae024e1ef0df003b00ee88bf17b3e7803b4e92f7d0c0a48976de46f2b9b9d7b30a786e92fba6e0be29e6cf5e2efe41fcaf06fc1a10dfef95031fc9eeffdfb56d2f57012daf7451bf91bc925c5700477f3ad4afc39a7e8d83f78803369ec5cdba52009b29d7de7e0a3ac9e49afecec6b357847f2479cfffaeffd42b0c185180267c0d31d042c04310cc140ca054086cea4d0aa6a501deac608b1680b798b0654bc083016f05fc50c156adb60e24fafa7dc7317e5a327ecfc6f7bc0f38c0fc5efafe941b01430a866e50902620872bd4086058fcefda1a571830a280966718425aae8f5190fa8dfa3120d7e8779283160301494e3e5050cb11c9d5ef55ae312e699cd2b8b5c935c97340aea93d49ae5dc0b0f80fbdfedb3d9030a0ab80f62c4820e83e36e139c702920091e52205eec4d20b96b56923c49ec507cedae502299cff6a35a0ad540ca9d35aeedaee2d298453437f4e4f9737f7747af802e81ded558b1931961c57fecfe76b77d128241daf44acf7ffeefc2caec02d51e8fcec98f815c0afc07da728dc29717e32bef97871a46f29354ca83b61fd7542d416d7fcb6f63221aa2f5c377eddde427cfedadb137eb84b88f7d6bcd0a3bab77ac4c38012cf032708cbcc7b0f1003cef300df357141f7870129a451c1a063d2d70ae67f57f3aeb0020e6f573ed145f03b148743f046f3795fae8767de7a48468610ed4eeadca5f34572926ddde2fc761ba45ca7a535b693cf39f3424b5bc909dba9768ac4c742349ed47843546ed738a3a3445a8a1ba372bd9b926bb1935807b96f9e3c0bc8b31e07cee5d1fffea4f0c6eac6f7ebea84a8ffb276e9ba57a45c2fa89ebd6e9d10bfcdfbf9e835ff924ec8b47bc6af947cff72daca168d6f290a24d75a6e49de489e09f6078422d1f24d3064b62f89bb9e40e8776a6f1790f03fec952ca4f29f7665039242a009cc054e03260218e781b4bfa24b17e71d212e587ddbb85e6542b46dd3b9e4d46952213c99b2c721df4a6ba45de8f283baca7bf70a3dd8ed1ce10fca637c0523d54104ef54c336ac70e9d62b3c0ff85c312a8af7528101f96b187f575c8515ee54e86941e111e079b83fac70799f8bbb8a814780e7a9f703cf1379461b79725c1c2dc11d8d5d974c9403b35363ff05e3e5803cacbacb872f09b17cf477e35fbe5d8847ca479ffacd3772c05e52bbccbb5e3dda08179e42548dd79b38b9f88d6f037f1010fdc207a61e6080ff5328962bac80291971bf931cbb0c9713ffa90ffcada1cd1d52ec86f46dd7f74839cfaf6bd3ed4cd9dfa195a18b7bf490f08ed08bfb3c296fbed2f9a5c3bdd17714c7539352a4702e7f2ef062c24d794b302e5c3c077a5c7e03f21dc1572a7a118b3cd3f59e1853552565af5bc3830b779306d47d0d5fce7f5488758dbffee5f97f08f1e592770ade950ae3c5cc07effdf967f5889647926bc8ad96732ecf24e7d7b3e7c38024bfae79ff1f57a1fcb72890b0027a8061f1cf41ac375e6174fba5c7d490b49ccf9973dd5b474b0bbde5fa36a9674b8590727ecab24172a089279d3332e6c64dd0d910f0af930834298e0a61d87ff2bfa448e6021f053cb1e220dc351587c68bf1b5f9186853028ac4059fc5e0d3051d1e096ff2f2def5fef2a3b4e86a8baac3af1f21c4ea51cb9e9afc8c100f3ef08fbf7c78bc1035876c98d0d04fddab0718065603299ca1803fe0ef3400b985470ac535effbe30ebc2d746111376008f1d0ab84e7ae2aceedd041883dceec396cc810e9391cd562c8b07952417c18fab4ef1bf2a6a39c375adc6a18244a1e36da7031479be32491b78d378c22b82b0fb8499f29ae665fbee124e5b2e1a086215f49b9ac9eb86eda0bd2d39efbf6870ba64c11e2e9cadbce5abab7ba953c98c646402886c6a31524b9df648512de28ceb7e3f59fae40220ae8d014b227686085fe2ec45f6a6e0c771c2c3deb8f7a9c34525ac2a97f4d7bfcfce1f29e5d9cfebb2d147605908d097f0ad4d128780e6e12cfc1a600ca809fc13c94e2c080c157255554a3807f0d3c8caf570331b987b34957e3418d177d5f2ac4fa9fd69cf2c47942bc7ec0e315fffa8b101ff678e9a33558e3696800dc17cf9c0e9c069acdb223c807de7fcbe26518d055c01907488610290c2909a3cb4a2e3df06221da7cd5eefacb5e91b2fe51ca8cc1f7c83f5ee3bcde6a4693868c033c0cbc690fd8c5046ef3b08b418f8d8b0413bda2175030f04c2a347d07385a63ebcab39c4322bea2a89f5a7bd4fba942ac1ab674b7717244dd79eef997bd592f656f60e3cb0d4ca1d41f059c0ca5a34dc83d1aae58fe381e77687b33b085afb0027cd19bf4a4bfe670f6e1d7f56ebf548ea369cf7c75538a1099a7f55af7dd04e96134a6762ff645746771acaf38bcb0a7a81509356d45142e3b55e1655ed47e96ff2dc3dfa3dd2def8a44f172747f44e15e2ec3c3c0cb81e78b223ca7dee32a5c3e17c6730af78097030f6bbe8a0c3e87629a21be72357de253e1459aaf22834f21c81edaa82bf479e8a1dda5c268b7a4d309d74a4531f4c54bbb7e768a103764bc10bee66a21fafe6df01d3b22aba7e58b0aa66111360db1e894774d18a2c5784c0521f295220ae829e23f35add25540875809fe4941bf5d464f2e2dcdb95c88ebcf9cf2f68b2f08913ebb43c3cc41f29e502832cc4ff2a815aff98a2320c7246f618d73f950d35b4cfe144ef2e7327a11462fc2e811fd987c937f69c833d10ff01b93e748b3f8cdd5fc6e923cfb8ac897bfd43b5aa4f6930a629743baaf78ba8710b7674f7bf46de9698c4effd7d7a79e2adbf9aa50eb5658b40f2ccad3623cc937d65242b496fa0e2019ba11e0866afd3d5e29db9b812d74b90a38a50ccf5230243be8f2034abf3be61821323eef5659faaafc2d2b74f219afc93f9e25766b3922cea2c914a6055608fda32d1ae0b94ed4c2971e880a20643825782e338ae7295c3e95a99e032e804780e70177912c59a83c1a892beeb3c88557b87c2a8ce7b2705f18f765197c4e15e90a075f64c1656a3e155ea8f9cc637c9a1e0ed1dfc8cb0939bd5b494fa345bf56e123a402d9f7829cefcf7c5888bd871dd2ed2b69817d32e1f52f9677c5bde729187a023838d1592d05c023c02bd9cb5e05244552b2291cff8eae88024e21c3e5771714dcf846875a214e9a72d1f0b1b365fbd6b5aabfbfb3fcdbbad0ebfb3c1dbd2d4fca52bc45afa8c42c7a856792e50fb9ce0bc8877a2bc94725f04cbd96a1e86731fa25c00b40af447b382506bde41eb5c96f4c9e33151f49f8ad60fc4634bf345d6fd2159a93b27aa72ba4a1744ca7f5833b0a71ccddc3e6f6a91662e6fd6fe4bdb45688ea97d77f010e63f28c7ea47989feee3039760ad8cbe8ef2e60647338df92d71f5d814414e0032c24f11da675ede47b1c173ff2f0928b074b2be08456a32748d7d2e928fe6ff7cb842f8833a3cf6eac2b4c782926d47c087819043c4f2f062a3c4baf4144713900159e093c160250cf459c3151bc10d3656c00293c532f5e2abc50d32f009f0acf56d92ff22b2fc7f7d173cde3b3c49c789c32e0bd366fe039739dddda48cbb8d3693bfd69b0f4040fab1d78defa3942bc77d0f3fd67af97377c2c9ed116363c0fddbf61e018507aea590c380ab084c1c50cfedeaf8802da838e33844666dc5bbb4b8d103bdd97b5f76bf2efa191a15927f83ded4849f27b46cb99368894a14172ed3043a3848552638ac48de25a3eb421a30cac126d6099f42a809362aa04bd4c162a73f8b8b018709c5f32e0285416534c8c5f2ecfa6e1a5e955f2e97bd3ae94dcd4637797be50dff5831f3bbe95103b7f9ab9fc0be9617f59f5ce0d3f7f2af0c980590c87bc9342d10a02bf7b7fc17d6c9edbfe06d21f2d84155620517dc60e27ef7a89ef1a5ef1d8c49b2f9396e8888abbf3abe4d499724beadb779e246fbac2dba7e521712e385c5dc2c9d5952eb4f1bbf5be6c06c3faef70d1f573b98c4eae41c705de53d309b3f787d9fbc38ccf30a3aff0fc24df97cb20bdcf765fbeca95dadc10175dcefdcefc96b709d165c7aeab6e7c4f88bb9e29fff3a27385b83a34b174947c93b3a7f36afa27eade361f2bd8fa76055ba2ce200da18254d425a4a0f092425d8101ea6e0ec75bf17215e072ed7fc788fbef7978974764bbbc30e9dee9470ad1f9c25d5f583a51fe7181d3eb9056861c303913a69c858173b9e6fd6c9563848838bddc24e3c43ebe368d5f3bff4d8fbb00bf0cdfd41017bb52d3d21ecc96f27bf0b5c7be37ed2a21ee5835fd377fede4ac4bafbee4f057d43de92a36a0e5bad5f10a527d4a1ae45b87bc28bd9a0c0a2627342f6efbeb8fe2818415d01341448190b43d8e4a39addc8f399ed6f9921f1f9d2f3fa943eac4ffbb2cfae7f342c3e35cd60258f8e3d00d8360afc203901e45a67a9776b9159ec742539570c15d71a2a2a7435cf9e0d1e8d69845c72c38edf910ae426222839e33435c01d7ddc6a70bbc58d5b54b5c2df2f31017b71423c00b359f59069fd92a24e6ccdcb2212e7df51367a7ec2907d5c0f61d730b8438b2f4d495bb5c29c4274fbdfef67b7200d6fd5253438b8f3a04e0022a0e847707f0b180e094f2ef7588b3c07c6ebb5d78bfe6ab44015faeff71cfc3693d2609d16179467ab954acce0fcee107f96b46310f7843f4e67c27fab53a6444728610a8bc2f0ceaa62762f5b059c888cbb14d3e329907efe8f45d176f2f34e8337e93876c897e9210977ddc317e81f390dc9692675ca12f535674bc54885dd6779f709a84596fedf7ca37c3849875f3f44796eca5eed11e495e621a7c319df2ceb45c43b1e89e5ebc25386fcef57b5720a80f50c12661288ed39ebbf895f4b652d31fd3bfdbe4d6f2b70ea1be43fd18b86dad8026e8b0521c7a82aeb4645971973b8fc5564b31e0b2a13866824b5b6880b2aef400c18020d73d177caeb684b8f800d4316c169a2ad4aebc7aae1821311ee2c2341a17232f60f44dbc140561f92a241608716da1d8325d2d3f69dd61bf9385e833e1a4437b7e24c4d7bd679c551e1162dda45f9e6df8b3ba470f38c569ac9e84f6682a31a107c84362db3cb4e5323e4a14f0e5fad2d327bc947385b4521f68b7ea8db3e48f473b3bef72b508aea5e5a2ff660a55c6aa0d01c859a596b3e8dba49c15a8fbb4bc642a26f85a1d8d8766cbb1a25702fab15092a25fcce8050c17d02b64e322a6984c7ef39284e42a412fb399fc16b0905c1e70572bae4ab1052ea79d33d0af70ef727ad76306ad1262dff29c65cba5c73163c2ab777efb286e2295b5185071a04358f4bb561c61866f7345f27b5720aaeb759ebbefb2f51f77eeedad4608b1ffcbfd4e7db1a3ff5be8bd81fea2a17d714de13958a476510f5d29da466120b64a038759302e048b2cba7c65014a8f661470d0c180cc648be585164f42683cead1480f643ff01dc673598c4f12b330eecb32f80c93258745fe584cb8047f570ab0447b380a77816769854a7c293c171ecd4c78343cb6be9562cb69b35aeeb0e7b1421cb25fffcbf6972a7ad67dd3fff646ad1035376fa8e079f35e4fe087038f002f31e1761b706410d15e4ae0c3571c97ecf6e88043d709d1eaa3f475d3fbca1fab9db69d3a095feec860898057c255126f3e0ca29842cf54f7b1fe136cb1991b44b1fa8a02e08a5e72392683cba45fa80db002f57ae6f1307ee3e42fb3297e35bda007a5e871c32819bf31c55a01fa61f06fd2afd49e378dbf4dbbfa8973fcecab8e13339e1d203deb1ee71cbe6ed92d5291944f5dbe00c9247c2d84d27ff9da87a738b57b245bfdfabd2a90b0023a0b474e1cfb1edafbdad41be53c76ceb09d9e901de0fc14aa3ce96f22e83904f3da155e06415985e18bd08ef624b82b6fb7e894a04d45b7e5a28069a61660d322b765bf04b355c6814f2a2474f11d8a6f872d9697989e439ca7021c218e6215e210b49858c13c9cd8402b34db8185e22a40cf926da62dce2c66d1966c999040daf72d4ede437272e84e037aef2e3d9077339f7bcc27ecbdd158aff3ea115bf6bae0a102e02ef00860097e07becd1409d56d60b1df571ca3fefce02b7b2f971e47dbf69f4cf73d8dd9cec79d4e8ff3282bd9623059e6b92ca4c843300ef3ac2bf5c4e9aafb40dfd1868732902a028686a2c72bc8b35808a9c44cce207e831e8e85dfc266f2cb43ca4e52c388f31b01bf0a2f481c0a0ef0bba543b65231fba1ab8e6376bc3b4f52ec76fc3e977ebdb3109fcd7beb8325efe29eb002dee326d4f24b38c1c59ab671dfd65b6cffbd2990b0023a0b679582a1ef653fef78f3fa3183e4bfbd50bff3a422117031a547607a0e3aeb435be80a1f8461ebaab45ba778e3d26c039e43bef268e4b49f0b5c790e2c7416c767624f2253e36afacb09585ec4679ec1676c002abcd0f41c4891c8e7f603fd30be2fa1e7104b070e588a0a2f08649b450c3e93a74f46f0f6cd1a782d17b45edf437aa087b43bf6afad3e948ae4e5e71efd4405e9627b735d04e89abfeb104026231a062c002cd91c0e135ca0ef4c0594beef79336fbdc9df5baad3e89d2e8ff80af06ef17ad737a3f2a3dac7b69641064c2926eafcc45973564320e0b1b290514c91287ac90d0d538e89bec3c69f13480736e83797dfb82c3193dec61a46997cbe08648935c9ef160bd91e2d3d923da55df641d773fa4b8fa4edba0e377c749b105fd7ccb861f549ea16ed81907cbbc00b184e8a2413300258c2e016bb7e6f0aa444010a7e84e440bbe41f8fb61a72bd64759fb49bfd6caae8c4e78b5465920a59be15020dc4626ed1359dbe1ab7c80e41043e1591ec5c65bf4a2f4929289e665b6949b3e5ae760ed26e2348bbddc834dbc000c947086baa9e284ad47396e48042aba5081c21c01c786e1116e2d3138f9e8e1ddc17c67d0ebe07f8e685b8dad4b49f7ec8fdd2723b719f31f3a649cbedf5b71eada401471e090d382a557381534cb988118d009630b899974e3b960651b7a77bec9422278a9cc8a04e9356c81f478bb2c3e78a449eafe2b632b0369519c57361c0d8428a3c64c4d70688be635bfb4abc961833882c86464c3131fa01f9d8347e631e2fc68596bf84fc26358c821e8e8bfb0a9be4770b876c9dfd9d65fe1ac9ae1bf67ce3882b855878d897535e953eff2f7356de545d8d9b10b2f588a3087092ef45c04b80937c9702d2738b3787d3f8ebf7a2405c05e20b6d865f7d5bddce774bd7fe938e4fbdee87ac16887e7e419ad5c58c854c144e9e0362ab729a3f11ef52825c8a8167cbce2041a9b4780ed9ba9010d95316cf2116c3263ef3189f0a2fc3692083f404adde53c806888d4f3e00a712df1b991c602bec2a80c22b43b2c0c62eaab2ba15f9dc68d0d9b463861c650b7629df7555df3a217ed87571e3cbd2725bb9b872ce06b5ba151b5805c049a1ec81df6940d2df29df3e0f7fa7cd37576d128746e19f7ff99ef4f9d78c993c7aacfcf7e9a13347dc16e74904e5577141f25bca4230a5f8aa0cd433e9898dd1b37bd6444fd18f6d1552095cd1b31b44267dbe56e268f9a9041e06fd0ab48949df05fd2c6d6025e437e6f1327a317e2b8cf6284cc22f85fa2c1e9495df606859d1ab741cb1195768ef942eed2f16a2e7b23ec7ecd1284568ce336ba6d7abbfe92d7b4a80ff85c14cfc7d3120c97744c12dbf36b2bd154858019dc61851c0df3a205c3dec9f974b8d1aaa09650cf0b7baa0892e3621bba0014bc1e262566a4f42ad3114e318a3b0ca4ed2169760829167f11c08d769948a9e54001be29fb3c7b0399f68854158944f163a13cd5c83c8469af14c240bc442020ee887f19cc263969c83b784711f2c47840073b445a8ded3dc4555168a93efeb055c29cc4db4e09ccc502bff1c889dbfc93ca4aab710ef2f7ef1894fcfc41f6960e55a6026eee303d3054e27ed453692a93078c380f50da2bf5e7cf79cdda527ddfac1f405cf4bc3487cef94f869e601c5cd437e956cad81d6d0682784d57a622b51cf594330067dab67ad4359da63b51944d42a26bf2cbd564a8fcbe867a2554c7ef98e08b6f4dae09a5f26e337339e5fc7257963ed51a2e91780be1b4f3f29bfb68a7a9a1f36d32369d9adf569ddf714e283da97de2a95946a1757fdd688ec43ed41bbc01799bf6b1c7f0fc82fbe68f33d91ed5d488845456a087f517178e11d859997cb0eb83b943ab23a5a2814cdadf18abc0c752ff09e48d61c0bdc53b8bc4fe161e03d919b33dceb13c5fb20d973ac17567f47415111f0b0898bb1820afd143e12f840a22bfae07dc467b681f7d4ef233eb34d3e9502f22e1543f15cf43bbda198d6c602efa9f7fac9c073268ebdb4e4fb543b4d10c38def9f8cf7802f79b7c2f3894f4458476abea8104be1d9f88e22c6674f85c7f13994f1893dc3c0d758e07dc047ac7d894f1e586ad695f1efdd479fb58310877bc737ec8182c3560b0171c0508b73144cfb55413f29c3bf42df281838dfe53110cf6e2613741fc9356dde29e5baed9c8e7fbdee0ef99dc778f9a9efc7b707f65443bfc5c92fe480da09f2ec01773dd5bf28f0f3747b9bf4347dcfa42f9f37c707d1efc9e42e6cd297eadea43f99f15b64d2a382bdb8f1c6e538b17c107dd61eba00d065f4c65ac685cbe88d34e557ca5b2ef07093fc4e66ed61e33726cf54b0b849f24cd725d5e32aaf951e8833cc59d11a5bf5b47e59413a80ae05b2b7b85ca71cab6008597f0ef6a0d3f2b9d9d7f6f2405c05f46ea2ca691429ef48c36acc9f163d2b159bf3b2f3dbbefe80a6900c59fcb00bb5c59fa32dd90db88fecc60db84fe1678a5fa2f8550e85aea27469fb0b692d66e277013a0acf005e067c10a8ff13ffaa95ff13069fe98ccf74c667bac127e1d761bac9c722ff6850c991fff371daa6a358e1c4a7b4c072189f0aefa70eda9578187c636f2cbc370b7886e6330bf7115f59b84fe1282414fbd19bc05719f0189f198ccf0c7c4f0eee53f834b45f2f1520927406e1fd8bf15c41f4f766a64f86e6868e6bb59310ddafdfffcebd3e95defbc2499fbc7110fe488b8b74fe088ed2d5a12caa1ba1b4609c0def41f1e8b62e698a0311db5e1d9bc784ae10e2c26fee796d5f3905b65cda7aef470ef16939e3fc73389ca9d46f2804a47eabd4f54a9003edf9a9509f8bfe58a5e439ee585ab437e88da1f6d65978aa7f4ab52429fa65267d87f611cb31e54cca2bc95986c1ef203cc1e967805f0a076620c443f40b997c4cb5d02f34db234e0a329be2578f0bc1f9857c825f3d5ac3144283fc717e07b1f6b0f19ba343d2617ce7623ca7e86d645662eb5e6d2bfd7359ba8dd8a76ea91cd19f3df0d6238b60207998e93c54b87b3f02c213a1dd80057674f090deae0b6d0b0023cde124d1b59d14885eee2e51c08f0d8f68bcefec7ef283d3c6b6ec71bddf00d95428d574819e70292bc51ab3a41829290e35614530b02a2d69b622c9e25a2c0f5f85b0a6b2823d96661b17322860ef53782e14de4cf065cd26e17c5a43534ac1165a425cd64d1dcd7c7c6fbc77ac7fd25b6d7df5aa5f779122735ada9036a31384b874cc197cc4d68c1cbccde433072118969e2978b6d946a64fb6d8bb55763769b1b5c86ffdf9c7270831ffa5992b7fa42c2d3a10687740da5e1b8a446fabbd8709b5d110065ccc5e8adf75c80a7ff743b1fdcecfef30460e6ca7ceb9d8af2497d20c4388cb970e2166a9ef27f9e56b72907f92a7e2666e92e830fa9516fae84f6b882b58f1eee03e937e89a60ff9481ce2b28f374b7b8441cf16e27218fd60c5bbfabe2c8e379dbedc5c7e25be58e19610d726662576d8a3cbfb590572ae7fe999752fbe2465736de3127d901b9d4b028fbb118650e3b90a9afb1dcbdf6150e942d64dbeb6b5027115a0652682fe59cc7d1f3e7d8f47ae94c8df9ce3bb0f8fb3649215e8553673ad2007b6046ded51890aded8449765e0c9d2295d780ee3b48554c8f8cc637ce6313ef30c3e4991f042c264e9c0b64ae16226e0c9765565f9f8cb977c37f35d39018e9f76f9f83ba50bfcdae0c786bf2227c2da11d5dfcf961371e617bd2a0e90967ecadc947fb43a41d8d78c2c15efda831c048bb9b99b3a264f9f8cd62677b96bd7e37638540eb85f9e297d13e73378ff5290ce19a181a4cf6bd8ddbc4f57b6e7c67f89087a22c0f562b984e7e5dfbe47a684ad32d3873df2bafcdb27ce14ac7960cdc75291cd176fb5a2c677c310908a830a6351cfd4b45c2438f0c955efb5243bd8924738bf9516fab4d8ece8f180fec3df5141ee7dea0da9f70b275778cf44dbff48a7b79fd66a6d8f40d624537cc9f8658bef0179b3ad51062ade2df429bd3db6f6c2f865f2eceafe85f424be5217a6eddae9342176fc7eb7cf174945f0c5b28af98b17abbfe903da48aee95c1dac859082d16b7f8b18f102c048531c24bab6b10249e4790c5f3226fd40e99ab538a4f5c5b71f0f01f4bb86b6f6d8dc023d1a1865505fab90764b27fff102bd98001518efe3e994a5420599b2e1d190e760e33360d16945a504bf0016799916a812f099a9de9f24cd962d6a3b6c7b7841969b9e4098e78001f853edf27f7f76b7100fdc3f6a8f871e16a2aa68ed71d5c3d4030d3f08f1fda3732b7ff4cf6aefe2a52f385b883d8f3d78515e963160884fa59878b619f13988da178a5c0fec24167833d3275b6e685de1171cae3ff9b7b96fcb81f3fd075fafff15e78fd8065c23290e0a0150653b425ab6cd18290924def3387a7efe946bbbc9df760cbd78a4bf5545cca3863f1450ac99eabb9821c417c72b7532897abe9879e836f97518fd4a6bb24325e82b7ac1745d93df589698491f8befbffe75d59b73ba08b1d0fbbc6e9a94a70fc6bc745a991c3191479e29f6e1d457c6ffe519d9ce150b262ff18f969d77e327d3a73d22f5c9a3df1ef1ee5eb2af4e6d9cb7441a982d8e6b55eb9f0fd332adcd313b0d13f6ac2b7bc5bb6a0fb6f81e935b3d2e98bc252d1730da63a3b32737b2e2bdfdf22e37ed2447f6dbdf3e5df71ad27bc9d3d0903c11e6a19047ad3d6f78269b9e9db5ad1488ab802e1044d3443d8f6ea77d769914b0d017a1257d8e1031019c89b4dbf06616e85187c60a0915ac4c1a322901a6048c7b0ef9caa371c66182b61412dad381599e3bf19db38969b6bcf2b6580f1835c16469cbcb059f05a01fc5ebcea969f5ebc542947e77fd2f77fe24c4bad77fb9b5ea35f5223a71adee1a05eba70bb1b870ce052b6f97e4669f5179c233b2ff86a53ceb9fab62b7e4b8e5851060a13e39d1453b1434c56720dd9314ea547542a4549b3be2bdd137b77fa5f3e55539427cb8fce57b67dd8defc191a30dbb29a8435a8d26f44600a7ac977062a83d6aa9480ebea3fff8162be4eb67ecdf6ac2b5f2c74b4446dbb651c5617aaa95a6a72a5c9d9e4bf216c1f7e7c57fbf80a72615c738e06a0dab34a9fc2a7af61d1b5ce0eaabec068b29776c2fb9eac675bb2ebf40888fb35e2ffa979cd0260dbea572f22742cc7de1c3590ba442fde1c64537fed44ecad79c5fe76cf017851bc4f4fa057e238b37ebbacadf1ffbe57d7f7bffe56bbe1bff93f47c67bff8de937e9dcf8737bff48c5f70997e4687d3174ac5dfa5a1eb375972fe487d256d40fbf64204f6e0ca4a5a70abf8d705b7d6745d458f57d4575ada23a6a82a403f0cfa8a9e6dcfb0ace6856cd3f66c79d68e52d2d7ecba7afadbb21d967e3e7fed9a2fd4df1ab96144f2bc7b62a843b111c030fb3de9b5adb3b05c05fc0197fde491e3fc13bb4237a4f43e7398089ea8d7939da8c74e34132e3b412f76629ac26327f65156959ae85d64a5509655849dfc579eec6434d02f4336d550289088de369af83470bd6db4ed64b76c64af94e33d31bec3463b683e3d337b449ff406bc48f1a5b7b7e6ed1bcb568972feeef8673b3f2c2dc41f462f7af89703a37f11feda877fd51e09788a823535d2f618975a59eba70f3ce2ecec677b48be5cc6a7cbf874f13ee293b27458fb5af8a476099ed4188df87a433d9cb06e5e3bb6dcfda601ef4b393b3ca5550b9c7c48d02fdcf2afd45440ca5ea16c2c828e4953af7590e516062ea78c3ea9a7f41ff87e344cb072a79de2daa327b50ff8f5c03fc91765156979a6ef2779c6f32e9767d0a3f6487ab29f0e6418f4253d17bf96030f1bfc5ac687f741e3098d52217fbdef87d74cea21c43d2dffbae09aa38478ebfc7faffc049ba0d64d57b0f62a056b8e50b01ab0ea4ac02a05375c01b821085f39e1e1fc0ad92f631a0a8e1c31497a36f3bfac79ec3bc9c780c69b7d3ebc64edc1e42d0e57e3c463f21666f42cfdc7db3be9b88bc933e7b7dca0173c3621bacad3e79293fe791c9d8048c71ba499509fec896c2c92eb106d0f4f72ed32d8ec6b1b7920daf38828e8bbf8837b5fd2e318f941a98569e32fbc4d04d720289b293f693e7a099e53b8ad10ab582f66533d48f30a0979c8843c876c58105370767386c573e079f396453a67aea2db785fa3e74fcc553bac9bbde40969695cfee3a039d252fb6ddd4fcb16f41562fde85f572f9296c6bab5bf5ee9c3aa9cb5af2cd9533eb8d4bbd08f25a7b44bfbb6cd6449ef84d08ea917f8efc31a8325c4b764e9bc6b5e3d4c88672bee396cda1baa7feabb2958d71710bb85d67604bc5a88d36fbac4c9919662d7017b753f4e0ee4384bcec5fb14ce0baf62bb052b0fb3d8b2a9a50e11008f2daa3ab8cfc4f99a19da37e5c4d453da4a8b37343de5e799d2a25df0dba75faf6cad5ea03d10e4d737c0b56fa0b512a44b36926a5a0c1811c6458587fec03c62d4a91baef50f2e7bdc396bfffde3da23e651b755fcd93cea2415deb1c5f3d1b86f83d11ec92aa66d3b3654b2f6b6edc185f1d1b053dd90f5526e2aae2913f7490bf88d6e8f77fea0859cf84a1abfa8c39a13c951edae800b14240552b30b7e27c57235f04780cf57b0ee6cfc0e58ffad7cffabf5f7fa86cde7bfbd3d66f63a21dafcadc379f3a4c7bccbfdddff7984348442a9ce9d2d2e4cd01e6c735289a9ef250fadb97b8655b2f9c2d5f4d5df5ded4134e9513abca25eb0d07226e1a647d2eaa3f4fb3aaf918afafd2797bd78a97a904257b45b3585640936c03321b9d79b912e0674c5465e5b5b81b80a6805028bcd5ffbe8b3eee409e74bcb2f549752dcd79fa8f81a44aea013f594fdc13b3469819e5ebb50f7bb586328463a60330bf4f4a2652973614b112ac95779dfce6a4c84997c20269ef8ea47d435ac9382ffe382ca3bfdf32ede2d7eeeb5c7e54435e5e33b4794e408f1c1292f9cf5e63942ccfc7ada981972c2fbf4cbe90fcfdc4f8859def4b299ab25ac7a63d1277f937faf78fdc78fef90f72f7af196e913249d82673f7abe83106b1ffbf9838fbe14a2ddfb9dbeabdd5b88d617b7fd79a7a9b2cba7a78c6e257d9d0df7af1db0500adca30f5d7ecedda74a7eaa6ae7d76260d761a06bcbb13606bb7dd7e328df823ff1ace157ddb28fecbf6b52f66cbbbf0886f892145ec56d2d8173549a9e38addbe1d3c4165b338ba01f9462c6c04b393275e755720a9f31e3d5c8e734e0e0f2375c0788ba8f86ef000fc57de4f253a156045f580a28f1d4f92dc685ce132267c089d3eef7d75a5e74be687b725c482a1ffc4ea5ad4758ecdeb6e54d3069840ca332f0906fb4472c0463d2e715d3961d1bf45a9f650f2eefee86e36a5e17e2b5d6131eb8f578297fe74ccb9b0f43a3a141419af0497eaa7756d07f2e0aa7019222a901443d4e0d14482d2994b3400f864c3de4b31e8acaefbf050fcfba7fe900c9ef4da1533f9d25c41e5ff53ae2b8e512efe0f44ceddf647b44bf3781e19285f631be3f2e09c1a44786512c5406838d19463cb4ce16f503fde7249ed752f74bbba9c3a7d26e1c36ffd6d7657bae7a71c95deb90ce4b21672dc7906fad482628c80b10f55500181149aeadad40c20a680b0d21b3507739d0f63ca9ff0d7e139de164743d5b04d7202a903595c1b6f6d0961813709be545965d31703a8276aab6c82351bcc4f41c028b967c0d82ce639882dd7d359f81ec97e8fbd6afff75dfefa44536eba8e9fbf8f34ed9cb77ac795c76e0cc5ba6dd31738c102beefaae66f5d7b233a778136b07ab0faa234f804de87c80d6a190a8de178c57bd35fefd2b567fb77ef59fe4fb96be21663d2bc487552f1dfae21affececd6fdbf9696da67d7be75ee6b122efd7efe9b3ffd4d3d5f8b350e1ab014baa2815e7b8f1023eebe679fabef950aa9b1ed91071d248203442b00d37390ada0f02c8d2bc380efdebbf9dbe12b0b3f2607d1f7a6f44d9be01f711c99f8cc9269e3d5937a8001d69fc37edfcd847aa0458471f98ae4dcd537dcd173a5102debda7c35daaf03e115e4537545b6da01a1d25c246fc2a38ee03b4c4b36960e3e26617b704328593a69255b2be04923ae28f183329ff47eadfdc37d84f8e8d1972f9d834a0b9ac8eb497e208fe45954fd49410a5955f701c42230290c4ad6a885e751831d05b4070285a23d9c37158cefc7c52fccfe6a956c91aee97bdebefc292176c8ea76ed3195688fbc84ed51093c1cc59bbb6798ade2bd90d622217fb63db8d8fc60ed3fdd4f6c5ef3e9c97fa5d4a49dbd502a882f9e89ccff0e0a9cd6f8eaa128b4a70d83a91e5ba3e83de358faba9e514b44926b2baf81e858311558b9429cd6f6922f77f4832a45ce9b87fa165eb01257e103bd760ad795a25e3cae8f6ca50aeac9ece84a1c65491e8237d453627d29d62e6215b854c16b54bc7bb14a72aae8a54a72aa88cf4ec467c3e2fa89d5d2025ad17ae12be51709f1e686270ebe51b6f3037346ce2e8ac8b9e7e0a73b7e3c480e869bab076c58acdaa5eadf0a6e4001da0614feac8745b10e1dbb6e06208ec05cfb92097ffba709d7de03280756ddbf6b26af918ae5b571138ea890bed3177323efcdc75ac75a646fac830bbcfe44c08f63fc0c7ffeb6c3fbef223d9a5b3bed729c7ff426551c4750d14eed393269c5bbc287072a788b8cf62dd2b1e5e655bc0f14c7014f58499ffe7d871f7b491fb4ebf0bd0777fc5c7d57da7813a6a23d52fea16008213bff2c72ff925ea682730151d9ebec24156a8b76734ed83d8e5f5e41ce77406015e47a6d8e5790072bbc893edf512171c57491b5e29ded7ca02bbe15bda16645f6fcf6339f2b7385786bfcc4111f97a8efae5fae60dda90a560f57b00a9be76c808221795af77f89e15a58c6be471effbb1f228be22700ee61e26b6f033c9ed191cf3ff9eecdad5e92bfaf7c6df1fb6357c5b507af201fca7644f0d891b7d41e3d59857ab0e29df09ec069ed4bd11b69ce634d54bc9bf4279bf2ccf9edda6eefc5bd4f56df9dfabc825caed3fa2b980205ede0e867078a5dcb33cdd330f8935f5bcb034165af660c16aef3b0107d469e72ee215223b678a6658f027fc2ccd7a125551fbc0af86342e5ccacc256762e62f91482ca053e4587a4541a6d6cbb7685e7029f08fc38b5c587f3b25908284621bd97f8c857c758c9bbdc785c8c02de127cfe5344a7ebda43aa57fdf49010730ffee0d5674608f1d26b0f2e7ef93269e1dffecd8495be28948bf2fa6b553bd42d037c4ac1da0e0ad6c092aac1d9c8351898dac53f9fe1f7e2f9bd418f2c34ac65d43eac60fd5f81e37d759840f52239fe5e07fab57b01d64a011db6f79f53df15e2e891f9136eb8d75f5348e9d4c55f7329d66b0eaa1dc6b1131f113214c5c8b2ca659b4fd2a98213a9bd11e21b05e929a658327047870c95a7477510b85fa72d5fed5c055c992fc4e79ee22e7f8de2d78f7e6cf37e9a108be67ef5fa8fa8a9afef04482191a781a37d1aa058745d485841da64d1f7ac73da0cea70de9df2bd8f38671e74b6881d9d9c8b42d3b1e0e31c3a5a194fafc2f7f1b5b97cc8277d5f31a337d1514ba8a728f993edaae885891eda8fe8e582fe14e073751697a24ffcba3abb302aef359f6e707e5821c48b550ffcb9245d2a8715eb6ac8732005a23dd72715acc1dfaba050c820d21e478d096b272aa8c7057918b094ebd55a8668c0f869d817b033e00e0aeaac23aa8378501a53537f2a5e280dd5eccffb1c32509a90a1f9a1933a7410b1dd8c6321f362033f03f34abe3312ed31cac04709926fcac2541ef68e783e1ff4c6e95099c2298d38368f297a537436a2c2295b7494f6008b417f94c1efd7ce57fe32fbdbaf3ffdedd402b417daa9fe74b40fc9f32405699ed05986b4f3023c11ed6127dd4c746b29103a4190425758fd4f9113dae1b79db8f4646971877e4c39cdb764f5561f83ccad3d44bade72444de4a59a3a6da14158e22d1708a72d1d0e545b7bc8e1a6fe32574f402a0db2d8dceac3194d69b56cab8f4af0f94f75fffaba355f2d3c4488c7cfbdf685623991cccd7d7fc9824765a72c6e58418a81424d3ac6bb54c1aabb14acbe13385c77da4db6ea6b4028e06a0a052c017c02f43010abe1f2eb9013063029a2daf780c3c2aebd1838dd079c16316b2f10a2a0ed0dd34e91aabced2e9d479fd943f85b9990a2588c762a403b299cd26c8bf5d25c66f4f7587f291c29b5dab51f450760995bd3e8ad5432d8d634d87c92fa4bec8aad3dc2a0ab4fb653176d4553bba4eaeb6fe544f2f98af28af9ea89687d8b7fd5af003c44c13aaa7f414cd91b0262b4058f0a4644f71a3afc85412baff163eef78a11bba8d04dbac16f3fc261c8e8ad31a0584b316a32743d90c22bd9963763f4d63cd180859ca0143d1a07a400686b13c1e8d9b7fe498fff268171f6c56e919c27ce1362cef3efdff71d26ea7ad4d3d462c2a7b58d2a84a6aa10d9a87a48c1f5eb815f69deaf17cd2959833c1aac5135c0c368c0c447fda4712890465230a45848a1484fe5a78796bd54f5ac10fbfce3b0bdd6499fa3fdaa2e6306a4c5b547265a89b62aa20d50686b96a9d8fa24836ddd53c8fa6f2a19b2a037956d8544e9bac58cfe18b615901bd80a485d597a6562713cbfa9a569b9ed657bbe7fc88b9f3c2b3de5baa535abeab047563d0cd17a0a6da15d2944aeeb419024423b3548ef495d24191161b9b6551aaf1b83ce15a193fc92fc409a6d2cdd8d5c35a4c76e629a2d4f839c03fb912c5aa4d9c6a5039b69b66196661b36d3f2d64efaf932ff70fca965e3d3c6ca37adebf8f3573450ea6940d01a024df0a8abd83055c12a0a59214d713df0f5879b90ee5f3fd5bc7f436f86e7307812fbbb0556810ed57dd040f763d5e3aebbb4ffbfa582a9776b8e7f6fe766a5259afdc5d312cb81e7436ccb95787aae968308e823a4005ca703e3fe58fab6c28706d281cb0dbec067bb833a1fbe0b146d0869bbdac041a84aa73b3eaba0aef340faa3bec2b1df9d0bc4c0acc238fecb59faf9641d3252fc146939758def41ba6edcb830db03df2fca4c7ab1f476fa7e9dae6bd0a3f68ea55bd3f460a6897b7735cef5eb7d3e796d6a8b2fa8ce008bb1e4a9515d904eb2a0c5719277521464d0604d442b0c82f0f4c8e3d031fc6bcddf35ce3c94ba6b193fe4811f117bff8c8b5e7d64baff9e77bc54df93d1eda1d3994d794936efc4cd336e14f7d8bce331f9e3e9ba113e8f9969f881798cc61de7b79fa8f7e5b86763efdb7726b9869c521a2fc9b75e83a690ac6342addc9a7d6d250512a86c0ce377dfba395e74e830387e2059ea006880f0fa02aa2760f5058109c533078c541f141356f727cfef36263ec9a7c2531b07344a8bf4fd6ecf9ff5e43ed21c58347be44a6c62a605188aa31a03aa1a79ed7aa2a6099e4fe870f54901e809bd8a419ae05f37a1ceaf47a8a0fadfe6dfabc047f595ec3e067568410ec486417573fcc5cbaf3bcfb8d15f1cf676693ccf5f9b89b52fda27ccea5492d5ad509d4a38902f6fe2ac9e461431454f8abf0c6b0d49ea2852af6931371ded4c8a22850f3082b48b293c693de08a63789bbaf655fefdde55e2b7f6a78844f5408a8f7c9851b13aa688c9af6950c51946667b20d02047876bb6ab45b1daeaa2787b7ba601b7e6c59f5e9f374fc26f56f72279a42c2b3d81d3c44da150a648f4446e59fcd68be0fd18a4ac210a491d6de281fbb962e17cc9f1f8e5ea8aaad5bdfc7071f527b366c5b547a0ee83d53159e61dddbe5a51139e989e94dbb0412f502705455ec4e9b3f9d1c26fbbbf763ea62d3686d4f24b8ae418f3772dcfb4d6e10286857125af50dfda8be8aec9485481dc2c1e6fe71718252ba0eac90af43c4b819e6d42619e83f440a890d028d86b6e811ef1396fc38cf113270a31fbf877ee5bd84a7d17290ef238aa6169d1c4bd810aa492790228bca2095e4ff83c764c96de5589210ddcc0dfe9f923ccf76885516b426d19ca813ee5ddbbe67ffbad10cbe67cdb7f841f3bf5156c6efc00b158b6dc728e595aaec2614971cfa1b91e4e446f633fd4c02d1367eadea9e7b569a3be4b2b0458647a80918536c5bc2f6ee75bfdfba139c76d481f13e5372f74acb07a3e310fc422b731c38559baac3dc8b22d33e9698f9a8f83a485858c5ff4db8693d7ac5a413172aa1f6069cf5aee69a2ee6b420add9247ae1507267af26878e5b43ee39e6079629cef1ca0d3b1a158ead8fbfcb59afa4beb667d776e5c7b700f2d28c7d4be24c7890d195a7c8f24f6f8ac1e362b90f602111166205b3ccad6eddb4648aeb921a4e599e43c7e3e6e0226bfb676088b34981b070f14f5fed60eda7308685c5de9adfe1e1c90061ea8c48d584226d95481ae36ddf6ec21828402f3f3c72bbc99d2729d3ae49177de244bac8782b4285d43212b4a5f24cf837b100429664c9e045314a49074ba2e06aade52c4627969d8a379f769ba34d0eb4d486b008d938478f4b4d13fbe2d07ecfa49bf0d9ee26725d92b6f9b54fc71e73c84d5733c04600be930cb90f032411e48583d9778e24cc94acb6b8d2c1e3dd0a8e29c2c35b2d0b006a5150d0d2c175052eed465e73dfdad3482a13dc67fbe0e9d8641c394db60a88f4df42ce4423b20b09046131e35574c89f945bf554d5877f6af385f424fd4344193e7408a84e4c8a228eaaf33ef6f2479a22f8242a076d58ac2b340b2f9c3a0430ae668461f38c9b9fffec661f507afe811d71edcd0d8dc0af2dcc4864ba0e23de0a958765848ee5146e9b53c2c7d581bf240489e690d9a1407f7a4499ee90b8405b75e5b69115d33481f701ea0fcb0434e3a6ec2b97bc87f5738ab3233857dcf9d5c76a21e2fd0b355260b56c949db8dd3b907abe85c05cb26706c93396f61e35e7ed6c2ebb5139c7ba5a25853b96adadab5ea4575c83aa9c5a238ad7150e19486489bd3163fe5b943d1e858f07d0ad2e21759527a7334b2d468f16b1120069cce3ec9657036e05fcce7f9ae9d7a80d2807e1cb04401bf7ec7bffcad11d6d5fdb2c3a71d84d8e7b8c3efcabf4cfeedd250a7367efe4816ab7fe09b5a52e52df672726c9b5a9600cf0b6c0a5860d06fee76f8d883ab7a870d4fafbc4d88f7663eb73682cfab43be7ca0f21e8b8df5d82a425bcc686f5f727abe73e4822eb27ddbfdbbd3cea37a097b21a43e6f05fcd09e56a556b9cd427ba8e7790539eddc908176d015d3ba1d157d5e31ad0be92cbbf71638d166f9a17cd1cc19cf08b160d6cc65df9282a0fa0e181cba10f01186935c53012065b3513d0d2dd6421ef54990e4334544d317fd5d7d89f608a9c053ef8e0c34deb2ee33eee4ef7bc97e6ad1bef585c7a688c09e619b5d411edc234be185963dc93293f41f3fb29bd307bf2b5a7f37e8a35b8598fbce87d316832352e4d46f753008abd15f3c54e861bc9b41b9a6ae6da5406871724fe9f2b71e78cbd9f2839c9cd0b8a802b16d12480386d236835b3a44f1b84a5957dd67d99e9ab2765ca4411653168f9e880ac1353d17c5970c9ad7fe95ff13e2a3092f8dfa18e74250c1590ded0d457bfa509614ad29208b4757e2526c185b3be8024178149425d1882c13bd391adb3d534ff87b98bfebc29f08201d3073387b9ed1a14c144d2793d151538d767dfd45bb953316bfe65b767b5f7668ffd52709d17e8f1d861cefe7e387d90467a9bc75b01d7ee02853db76f8b64d2d9bb91dbe83c2aeeaeaf52d562c970ae487e7a645162b0a75df0292278681568bf45d4a57a5100e296c5f027becddbbb6f34b42b4ddb7d39051a384bd827c100c22da7d58ef50d0ec0af202751f7032b0ca40cf5a60cbe805779735f9c5a69fbf1dfbd305f3a4dcce9bf4d1c35f53c1206513a2be406f39429e33853e69cd83da1385806400e982b512e024771b7b2d06545f168bd933e87cafa0ef711e15397d5a584e90691b5a743fdaef477d9e0dda61732bc8c35a91b8784e29024adfcd0a9ce3a3e8c50ce22cbcd7a417dc44d5e07759ea82ca0fff2ac4d76f7df436350b9f5f743628221c3a6d9d0a0da97f9aad40b655165638f64f5adb48ba4920154a59b2a244735dcd58cc59c5c85de52807b22858164cdde29aa3d75c22c4b4871f7bcbafe7f02fbd884816197920b4c6408be6e469b0dfe93e1e3bd6a122a48936248b099367c15cfac0efd90ce7210097d12d372159da74704dc33380d7c5f8fef79fdd892f1f2aff7d7c5ddfa5be27966c53cb5c0a15e842c0701426cbb6b3255b503f0fd55fc343911edea7e8f5f0d692ead1138c6342bdd60148975e740cc7c1bb301d06f93743529303a1d36685fa026b3d14922a33e9c58d0b93be48ba6668f28b71d0ea9ef48cf6b3e229c4c903c90785b6204fdab3cd35ef377b260e92a7bbb957c444ada12ff9bed02b298f76f85c240855631eb085d4692d231892cac53b18aee8f135bfc0a23b5bcb08acbdd8d76815fd224d4f5fa46a78d2876d6b297d8539a524bf6f350542052894474c79f352e4bd3bbd9ce8df939dc5ede20c73cf52394b8ba6634d3c703634559e0e5795cad6b3b86395a2517c8937eff16972e25fbf68cda4aa4ac57f3d424cb554e0870af06a58b0d5773148d951b4484d8b8d503cf5a729a8d71860d97917019207d105902cb530a0cb60449817ffbb6b3eaf0716cebdd0037b2520425f742e4623141c15def90ab0667155e76ae989ad2a5de2de7f94d067c77b4549ce9a469a76ac421d490e5a0ee80c76aaec653b088c34cf9e97f2d215df8401ce2ab2a9027ba47719358fae4d1965e27a80bdc1ee73d97d7280363cd470b2d34b24ad20977267ec5890ac023969057970a706b46b62fab18a77b33d38bf342e3a2edc714c4f928b0820970fc1f0b889dac06d1e46c4f2fb265e640805e803fa4719a75e9e569053123f4f6067047d563cab201f9bb8825cca6d58dda777c2207c24f09ef1f4f5ce0df68a77cfa017ebbfb1c013d2f388df06efdfdaf3823ceb826e9267ccc35c2168c36994f9bb3eea99dd1fbb526d7fd8cc8b0a090952a8ec26e16f25b2abff7b741130e20f462ffad95e3e0a078b142eba392aa073bed2b4e402ca8ea3ca5c132717712e2626e0ce19848bf651fc1e78404345b44ede2973682253dcbe2efa357c29c45723de7978c6e312bf434e122898d28be6fb28588b02bf1a1432d5a06ea0166b05b5d892a10eae7d7da982e4c934c2a2270bdfc3de571e751cc1ad7d61c7006d29128e89b211bf372284a73d3128c014d91eef3dfdec35af458438fde74befbdbcc23fa33c25bf4b6eb41fa84c49f56bb6c29dbb3d65410f55ed2fe540e190030772e015432e862adc29d6fda5f022e08f79d1ad109df355c1a8fcab7a2fdeee105e1bd7aa249fae890b6ca9217663bf634d443488d87591f748f4ef3b6322c65e6be20c2d97eabb2e253916bfa9ef56fcc8bfce51cf9147a670c7a5ad3620c748531673411f49266229e8b94e91fa4e25c79abe8bb3f6e7821ebe558ec184fc0a143eb6ba307dd73d4e1062d74bf72aef200d9ce5f77cfb455577d61ea87bc22e6431886c426d406e2b39a6f7cd0dfee9c4832e78cdaf407746a71c70a05fd0eb7aeffabfcbf688a64ac87e32e5aa58b527e1e20c87fc2ff5f524c7b1f98bf029c013cb7136e84f017d57d19372ace89f81fe8bd19b6bd03b23f1b8107ff3909a234ed3fd93095802480a06862aef179aaf05222cba3d6d06c0363f0f44c469deb170c5b2a1798b74baacc269ef201796422ef091c0b3f55e400acf87459acbf6aacad678747a96ffa5e7e8efb9f1f47fedb672da6772c25f74c797237eb85ff14c15ca3aa68b186fcd5e8058f4d685529fe13ef2342886fea5828d0fa02d4824a96d86e31f6e8286db96d748405701f2841ae18951c5af6e976b8498f3eb075d7f3e56880d67ac5df6fa7971fd45fde07966bb77d338c901f6c0d22e3ff50b79a8745f6ec2fbfa883ec02107823c1af433f017bcc302df7b46f39ac5e995e8572fcba03fd622b7aec836f0b1b07c21c71ef60c8bb597498fe8d3f372ba37e9b93a7462d2d7e30296accbda83f38b3de6c4c5ce9329f385e83724ffbd41d8132d440a97422358f3d36b63fbe1f7fdd8fd488736427f22410865332f8719043aed2022c47efbf5abbfc0f728677a0fb77ac5680f53ceca30ffd0bc40ede19af3846c37a3ffa43c8e8c7f2e209f14d21dcbe8537fba5abe397df2145de33eceefad62a2ad3dc803e3f2abfb6593afeda040c46c585c2ccd36560fc2f2dc9b9966eb253b588a0e1c9a0c8f24162a08c73ff7cbbb2bdd05c85ad0f9efac325617449d66c23a5639ab3d0dbea641ae3d8f05bbe2f7714514d02181b002b4670e2fe88a4ffb5d3f60cdd84f55411d09ba1bfd238fdd4ed685848a7a2c8d32ac9e4b9a4649fdae9e2f6331e6403e3ef053bd82649fdffc3c7849af87b8d7a06f4b0f1f8aefb6542027af20a7e741af88d18ba5931af4e32ade4dfa9c5faa7f60e9a93b75c97cd6df72a8e3f93b465adfa15ec00bd5fcfa9728bcd1fcdd61e9a4d6f451829b7a45189db8b5ad434eef3fbba5e43f756c8b4e237a8860ba78b0504f8d467b9900eb3f536ead72ccd2ade32ade4dfa96ba1d2f58706bf23bd17b8a9a832be6c0e68861b185aeede181f4828665057b818ee58584b6bce9e62ec2e24cf4d8161a1880ae39d1fdd276c5dbcbc9632005427bc990e2a0ad1cb0c543fd97e6ef7a4de36d130616f5d804fdbbbb5c05744c3bdbc4797d80fffd3f9cbee8b8599f8ae0222057fc083d26ad4f089e10a770deef3ce9829ff818d68be9cf27fdee70d23be22eef21d0a78998f837e5b60c316b4b057260f1365905b9cbe859166f1354bc47e2e9f1c5775e601b9a97529f7e921027de7be1a167232d579f7487d0b43ef12e8541dc1782c2e05b68f045dd8d1e07f43c5350ba504efe7eeccde79e77d93af9ef13c45ed1ad3ef8e2b82d2943f7a7c2931944d47f71725c6ed0b757bc9bf4f9e23b37b439bf504ce2a9a00762bb9abfdb6eb26bbb7820818a5cd37388b96670d99bb64485ad32996bf05821a18bbfe732fa517cf9bc85cf2d43e8494f90b46502dfca810af5f862382b64f2980209584cbff7cb05249165f528f195c0533f1b7ffcfcf1f29e8cc6aefe76dc3605109714e102373d078ba5ac71a6f8a581c02df1723c1706a60660913778e31bc07e79592a8425023b2bb0013f142b4a16851ad8932d59057911a367d983ab193b35103daea822f1f4773c6af71f4f919e65dfc543f20ec0669cd1839a7cf81e60aa89936209912221cf85425e3491a937050b356d17dd5fcc70f270a4e733eac007661d7cb010690569a3afec23e22315bc3d4cb9e35951aec5a3b4f45f6cab1379473cfd8ddd934cd3e70616e317868637513c656baead776d170f44efe1138e429b02a09013dfacacb995c9969089c059dc7c0faec69bbd5b7c05f1fdd3734e58892c283d3162c2d4bb5a12fcd2c4f9d60a81fa8d306079a296f91d5f1105680156437c5723148b5fb752fb53f50dbea7d698dd78d81a7f5750ee39c4fadd05ee014f3cc0936c6aa92d7dcae2b2a73d2a3e0ac4819bd002492f3e1127d8db2ddbc0b9428dc9bf527c94aecbf7648b7920263dcb1e5ccdd8a9c1507cc2b6075758bced4fcc87bc31a0cdb5d70871d075c74eec8e02e1d49b14d46772bf6f42522ce499e8901729148b22e1e9d581bdc8f09cde2c503e575875eb65592542b47ba6f30f53fcaccf63c4f4285fb69051305dd754a4cdad202fd2b849cfee512696e3a0a7e202cf6d8a5f31d1c3fe0adbf2da3e1e08d22f93e6b9bbf87bb28e4de849789690492c5d4fbd47d33fda2bf72deb864bea3b9342f09885ad435254214e959c5fb1fbc85227c5e1e2db23806ee2a6f9dd5f2a9fc71a8ad347c4faed748ed7d3af8309780eb1d000ad45259ee02c13a8280ab8f20ab7af9945f07eb204bfd8f80fb75ff03fe2d7325cc507b314f96ec17ca20fac65f01046127a963db8ec215e1682c94d1a8289e22963530677b857887edf0e6db8335d88c38e3ffee21e384fa6052af65bdc02d84241522cdc43d16b26965d6203e305502b0e0a8d49055238fdb653bb0f979ed28bbb757bcd4f9f2f715ee8f65882f6e0f34dd06041fb24f128f95a46cc03e11e0e4649807e62390e1a5ce67cc63d4aa2f764f343585beeda3e6b2054afe1467fe09e83d08b8ee676eef68e350752929089ece832e0864617478a2ba396947ff00ba61ada6327b0691b5b14a73a09bd5680e779e8475f11f1c7bc26333ca24020ff5f2a5eef79ef86680125b7b88a580c3f18630e834ac209d4baddf5d0666ebe79803877633f3bc9751fe847a2305948b6b99e74b26dec9bb9fb305fe3b32a561a07c9f6e002fdd0b8d4dace4384e89b7afaa78f7c23c4e9fb5f5a7b1a0e386b3950c116043f30210f79e93513be2bf20d0cb24d2f7d7849f7478e3ffd7ea93886765b3de323f9630731b47bf720bf812404dd1ecc80b184f612242118f4899e97dc2032e927db43adb97b703de5fd7784b0c46cc46e5d8be7e069975f291addf0dc42b2c41a6d8b60aeae80a7b44ad3427064574b8ba6c5b256ed298b444f88982075488a2c6eaa70e0277a8581d3d0734d7a7ff8cb5520a03872e37e6f2316f81e5bc0e222055014908348146fee04ca43037ccd8c5b7224079f6b7f708b5c5e778fb2b0546b240bc942ed7af65838a48b293e6e79ea106f20a461d00f78eaf68a77e0dc830a846014bfe83731dcd9ada59cb8773f36bbf2ea3a21463c7ddf19e3e70b31e0f1821b7ae3fc9a561f29d812e9eea460d20628988a50570a4261742e4b886d43eee317ed7e5fd121bf0971d90d250f3df78b1caf43db9c35e942c9dfd3de24bfc2dcc66f6ca2e7910bd902f1380f19053ccaa6fbaf191ea5a2675df3e3f4d5f35e207984fa93e80b54696dcb6bfb78202a5f3f567199118f7bb133aefb00372a30636743377d16b7ceaba74ae7a19e12dbe1fcec691d3a8be219237617eddb8357d4435045b6560c54794b59497dd8fd432d1f1f69a261fe08d712cbef6140f9fd5d17ec7370caf3521fefe13c919515df7f7ac700d55fc351491d93032f1ea709d38b9d05ad26d0b1ac527832f081e8df91141aa333d959c5fbeebadc6dcb5c2f0bb277696237e5aaa7ae43523b2178da13a309c5f8ee0467a687d5f38cdeddd859a127ab700e9bf4b5c2e615d3818a778df39d1acc7626fac18af728def2f836030e5b2f44af2f8e7aa4f4092146653df8c1d37f15e282c231df5c8b1d0c5a2d0244a1664b759abd68f18282a937034a0fe592631e1d7c459510ff77cce383a7bd2e445bd1f1a419df49f95a1b7a75503a0cc23c11dc59a299fcea0aef9ee6fce2d17c633933ddd67f7afea13539a2ef592bde13f69f2832e905e49855bc6f9f6bfb1412aa7aeb5801190aa3b4c657781f35e0e20ab2f20d3c5b77101540914b4f03361ff7111eddf2305921e1de8d879eb72f16d129e64f15d9fa9acbfefe6192fbff53ae8f92fc5db6cb311f9ebd60af1ad99eb78bf7a37503e4f9c50adc14de2d20076a20c6e440e1b142420ff7990a07f77ba4905841a9c70b4aefa3ad25b7cce5fd038584b1d0922957f9baf06f7814c60a66738de79215d6c60ad1a8107338701a0fae41cfd516aa493f9fb5ab6bf21b37be5cf69ccbbed3e097eee3fd96766acb8cc373a4437a5fc70f0b7174733a7aa00d60abe3156c814d4a29d4e5af9d844e4be97d81bf13c4a54e873ce999786748fea6249c0f5ca33decfcf2f6a6423d935eaede5ac76cdf228b673256f727d133e42ec0afc7f865fd17777e0876d260723c562b14f5fc96358b9a796d8f10962d3d91af69c416456d2e3834344fc76378ac90109689b650c9d20dc7d3ef94beeb817b3ea11875c280b4a8075c7b1254e95966fe5ddfff9f76d9b6a40803ba42b4df6187b17bfb039ec79a7956dc1ccba26233172d3d1e6ba6b52d1e6a60a101f142f242c28dba10f7b7adc169cf21183a0d83cfe6b5838ee983fe1c331925c1e22dd133e87bb62484728d1bf43c5bfaab3d4b8cd3a7f18bd413215ab75690140779202d61886905223d11ef786f98e38af8f4e508e8e536c92f0ff959d6209286b878fbdab305c3c00d7a4d842813d3e7fd972cc455a45722b7830ad93e1e881bfd87250b443758ac9030acfede74fa5cb0e159c7d2eea5ec2c6e1e836fdbaae3cabdf602b32c2f9da71386b03500df84cf766de9ad1bb6db1566d055c0ffbe56dddaec99fbb631108d81ad073a7990c9d6b6bc246b5b34307921a1251dd87b5e3cb7e91f1ebcbc87bc1e06dfc16cb3281ea748c07792c55b7b3b28fad981f160d24b9a7cc2e88739ceb28c38bfc9ea5402fc0bd7512d215add06c8d64674d616d646a2d95b03bdf7fd7115e731c1c30964b599fc06179b13f2ebf15dbeedf38da297acff8259a389f90d26fbf0fe2b37e8d9d2dad11ee284ff922c2c315bf0ad44127b0e7393669944f1b8504018f7299c2fbec7f61c220f84776c146f7d7bdb3b7aac10a2dbf13d1677c1eeb3fa842f2a80a274c33f3168cb5b4fa258fe70575881f86da1b3ae3ee0deb4542152f35bcc39cd4f948d0d94849e43dc11af9128e495d83afb2760d1d144685a746582ced00fe3a98496a73875cb16128a7bbdfb0cbeb9e5e96a45926ff24d7c5a166f93b5c31cdb963c4d7b7e49b72bdff48a69d7a0a7e983de3b6af342ffd28be9dcf3600ac42f54f4da791da2060ad10b7a50890dcb66f29bd4830ad4d524e93f9b47c9f9e51e6539a3c7e538d7a4a7e917690f15e5cfdbf2da3e8be8aa5a80bbf8bcc17ab22c137b564544ddc77096bd2326eb89c7051ddeb10acf15f57e7efac1ff1a784efffe8ae71014813e9c9e200e8cb21d56af3d8e306b048eff512ebee9605801ff7b4fb8f0825f8ff1dbe53491bec3ecf889c98bdec5157fdc11afca82b285063c6671c506ba69d1f56c5e41a9b4d80ed8a46fb75df7a92096e6db9eb64c3b21440c3e83d966a621656b876cdb963c8c3e4fd74d56b0b98915d3090c41d007bd7e5e3f9297409a2f656561f13cbe2051d26deb8fa3380f246cb60fe797cb41805fa33db43c153143d5ea5126996f2ca1b200bfd6746e4e1ff492ecc1e59df85f12c212b3bd68e0c76ad9101e3be33ae1c014b68a595bc884151226e85885a363bb84ba5d3be016a93486a64ed7854fb0a1f45e40d8be3d85e5a9071409ad89b80cfec12e87efc61a075b17b7f5860d4b608186032ebd61917bf602af307b2eac9eb3841ae65ad6cc825b4e6ce140224a0923cc320ca62dbbc04d791501790d839ed90e82d19fccb6e4b1574c1bf4032118cfe4d70b564ce71af42c15d3090cc172e08a5e85d06748a691e2a050d5cd26d40587124a0fe43d78205c514536915fdede241711835f8bfc26283f30e9894df328adfdd75c8f72bb5cdb672b13da4a2412fd816b72c287b2421f36303d9bcb99bc90d005ce2d26435052af4bdb31234388a37ae6ffb92fb671d78ae358c0330161d3eaad1a6837525220150ce2f73f8c271206c422ba5e03920a73f8f9b7add8ffeff2df4353960dd941042d509b0270931494da423bb64a6fbe66669383bf78a76e5a2358affbc04f389ecf80651bdb4287cb6b79423eada138d0679b516e6cc5b4675b1b48bab6a1432606fda46b91d77ad7fb7b6039439defd26090a552a8ea2606e31488785e4cf67fd7f4b807b599fc7ac93ca864060cef3fbb47e919f4994769edbf66eec1e50ddac2e9e9cdbab68f07a24258c1c530d352a0dd4bf9c0d96897532f629207825874924577746cf76107655d7081101dffbe53e7b66dd52704368fc3feaebaa2f64605b52281cdeb44d0062ef0dffbda485801adf890beec2b9094c753d7fa0aa4c3fd3bfde94eff00a172f1564affe4ed99c022e7169dc23736db2e5921214da052856c424b582fef3e5a03b1868ca278cc80015f8158b82d04a3cb504dfa939379668943880185cdd706ac21183e719af4ad15ef9007c775a6fb85827be51c7af8ae38ab9bc64b2205b2c794fd3a75fa428ea10f4207ec382e48cfea416d24bf493d289bfcdafacfee51961bf439bf36cf3ad91e5cda10f8ef590351b94bb6c5256aa0a17ab3bda6356f304bc1f024122c62366bb1953a36a543daec2e63853876af734f2b54c10aad38d2b02d5fea01e6ef7c9b6bbec74f4071b8e2f779b9806105f44141526e46f4bab7d5e9fe00bfde79e2e8a3134c1cc916592d9b5a5a074a320b976fbe19b618145b7a2b45a4f1c6f19dcbf85696a6cbf6760bc4c293acedf1104cbe99c5d6ec8a69aeb0051b5fd6104cd3e9a4d6f45ad65fbdcf3ff9a2331f9672d323b4418f17185cbe61e6b4748ef3d73e8ebdef9c23fe7970947e91734c7c7b04264ec3b0b4f21b0c1945e2bf7b63f70cb3f65f528fd2c2afcdb34ee651825fe97ffc776c65e2dd2d7a4721af4c1ecb2a88e94cf4b0ae4c0e1b38cede8eab10557fb79d113d5c552a4baa668568cfc0da48763c2e5008d6e9cb9dc5e07b8438e1a00b773c1ddbb7b73819f0604054d2ea5d4829c445a12d0c140747e1d2d2885e6cef96b8cdb6d94567d993a7419e07f80d2d938ae3ddfbfaf5bf588856b9e9a73cf08c4854d14bfd659c711fa8e81d8afafd7c76c6fd4876a6bd3ecb5bf75786f13e8f9d40e9e9c56b920385931c3cea6d4e0b052e6f847819fc848defa509295f2bb8c467f1f38ae9226b653ed157f42e853cdb2aa67bea1d194cfac18a7793be67a9c84e5ef19e983e3bebbee3f53b7e70e435429c7ffd9dad1f1821c4d9ab8b6eb9f45121fe9c5efcd5e819425cf8e2bd839fec2044db833b9d3a647682f618da7485b7955fcf6c0fcd6fccb04c5c419e6c070cd67f62b296df9e06fdd8f8189b905f9b7c8c35e7c9d859ee6cfe7ac74355cdb6bc52b60e591efb8fdfcb66bfa5b9ddcf962eac13728ecd2c88d650288f24476c88c230f074f10b7045ab549ff0abf032e039f821ac70799f898f067ea6889ee2e15c2556e1ef61d051efadc47bc3f2cd8a8ec233804744beff5dedfb76e9d6e74a213ae7ee5a5f394988851f7dbe68d10cf58a86110ad2aeb41edeadcf032907a423631f071e018ee771d8e6b6bbf07e0795c2b4581e2a54d04f1638bfef98ab0f962dd7f6b78ec7bc395dfe385a8c4af763da6384f2cb72d05ea3142e9522b5e7e2283e1a7bf5e4002f134abdf652fd4167d3cbbbd4dbc33803ba549f5c3e0acf293c47e192bec2d31d17f8283cb7187801de1fc5ab0fdd307ac50a213efef8d59ff1d9faa8e2da5a138f6e06e9e37d156c64e7a0f857f7f483a674ea24db65c74eb346668ba0bc66002fc3f7f712fb01ef85efcd029f6183ef0cf05d06bc12f488fe2425cf12df318a4fd5f2aae88d52b8ec0793fe18d0cb51f4a55fb418f76502a7e7e800d47483df9c00bff0cbf57822fa99c077c4771ae32bf5bdd4b6edf712a275a4ddcabd4e95704d7af77dae95b256975ad9b95f13ed3117e335037c4614bdc0f81d13e0b757427e2b402f205f49e6034bffc9bf621e73480ecf30f8b5cd37acff02f3e228d02bd6e36314be338aaf98b770e70f3e1062c1ac590f2c562d163b829bc97775b582fae454da5d3c817c1b5784ffb03d3c90a1d87a90a5d906b22b82a10dee1a96e3b9309e4b1cda2057317022a1356b83870ccc90045cccdd4ee879cac5efca7efce4eca3fb623b6b7e1e8276d1fb2ba8b7af2605cbd748a8d23b0218165be772f13e87bd3fcfe4cf57fc5ddbef3dc6df9b28fdb58e6fded53bda5e22e53d114cff8c850c9565172cf4324353d93c446973e193ac6d45588832991c3c4f6b0a5be6f2b2843a562cd9f6dc96906c732ba603a18c9eec402916e24a5a316d5bbc4d16e22a67f42c8bd9942ce0250b716d6c7b3437e4d75c7e75882b69ba6ef3f82ddaec1025e79f3c26d7e097876ab7cbb53d16d1c77b9fd5bd99a083b9c0bb1b5d48e8e23e72595ddca7f06c1d7337cee26e6e0c9ec71c433d53f6e9226de78ce3bb0d3af21ef5695a81603150676ddd68427da00ecbca7278e8886082b459f5edcd83d60247dca60b24c963947c0e5a3cf2067fbbee218b2ffbfc057f73c4494edfa3de12cd99e89ad79e939b793265b2b5ad5c8db3b52dbe28acf0c6bf37b6a4f35e6cd7a60c49ab3c85d9227fa0308d2dae0acbe2ad6e4fd09bcb0e94d28bb901c3caa4dfdcb468c29b5b31cde421704055330d8ba4ed212c868b7db1b9697e2301c5b479fc52d2446ceda579fc0a937ee0802a7b01289eff2fd98db7f1096f8775eb445c077b346144f1e0a2289b5002f504cc73b0580a34619162b26655d82c66b61856fdcafa57e7ba427cfaeb1b67bf70b6fa369dc74ef03d40f240a85e843c0fc2c903f81a907b0604052e97dd9704ea1055317b1f16f77581a4541c7f1e72c327fb4d1162cfa507b67cdf5fd4ac087903fd4a61bd379965719c5b5e490abde20a09c3f8a6c472d05c4545167e845978ccd3ad3fa2eeb9eadec2bc2249f0262e0fc71a5b2d455abc1daa0bffc2e0c79828ac3b28d82abc7b363dd107dbd3b2381eb46c153ddb1e5ce58c5e7031dbc57711ae9edff40a72b33d62f2602896048bcd090dbf00bf76c5caf92d4fc82fefbf60ba6ef3f8b5f45fb33dca27bd89629b5f5b6b0d8426b04a05e3d7407a3dd9efe5e356c8bf8543571d70801fc3c4aa8583804d1831c0a93ac61d8dc43b154e4914cf54e548f2398557a23c29ac7087ca95328147800fc28e5548e795cfed07fa613c67c64623c0f3c0970bbe4a15bee0a14fa68d8b08f1e5fac805f3a020eadf04a4d8e277807f56509f6088a9454f31f466ca72c2d6283a7b8b26fcef01b13641ed9b4c8184ce33e984ba034a7a47be70daee6d4f12e2a4ab463e71d96142a44fecf0b709fe1ac7c14e64a779d176516fcb75c64569cc546b0cb27d5db4534114afd46b10515cf6978baf527804789e8ebd2316ec8c05aefab954cb41947bd98b613ce7e0be30ee73709fc2a7ead873897a3f62fa313988e26b3bfd7cdcbc2384f86cda9b8f7ddc463158f7a882b5470222565cfb06fe8e359006f49fb748e82bebf4031f89ae81d477ba076b20fcfb33812bf9cb51f2a7e5ab92be57f99b0ee199c023c01dd6be33f59a613edaa94979d5f4757bc2bfd5edc9fb4fdb2b6183df3c46af8202ad8cdf4a920f3d4e0b412d8cbbb3d03a267d27497b503b64425e74fb307948d61ec46fa5a4a0e8d1bce25af87512f2cbfbaf02f4c2a057c9f905ee30fa167e05f1e7825e29a35fa2e8adb8675155740d64d2ac8fb6dd1ac8d6522098d8e237d98bbe4e4e643d5fea3b39574e9c2977a6dc72b8bf9d334d2861085c05f06c35409c990e2d299b1d90870e70f15ca9a06955e111e079c0b1062256811b5a2c2c8580d3a27b09f03ce0b10110c5d79df8eb159f7d26c4b41e13264ff2f320de12f7345cabde5c3b5dc1fa6b00bf55d0efa0837f1b58d1b1a310bb2ceade316589103fcc5ef8514d0d38a6897e0af08780d3444f0aa01438790ca4602a4c5cc3bf03fea4a01f52ebfcf42ebfa55d20c4397f2a3ef01cc9ef6e55fb3e3579a5fcdbcba97d4ff987bce91c71458bbfc60df0d862a65aacccc7845c02c59ca7db4f097405c363eda9ee77f17c312916a8cdc040b44ca495f85a3db08167a39f676a3988e0bfc46714fff5c455b77fb583105f8c2f5ff3d93fd49db5e8afbaab814361d420345987ddb31a707e858ea24b8a59b30ffa47a7355281ccefe88cf44bb91cf6fd3401e4e27b573b33d577e9ef75f1bd99e0bb047c67826f931eb56f362912935edc045890903e53a8b23d39fd4ae061f05f9190bec3e897307e31e169032fa6a8ccfe2b019ed7ccf6d0133d53845c1e92b5472c29210b6f013dc8fdc6f30bfa307cb46205fd08a36fe7b702fc0287e2d2e383d1cf54f47e882cdc3faa40e67e3af18faf403021ea45594c807e0867df1ffa9cd2e329f9ea7d53db0e9013999e504a9927518a0ec947d64aa5d960b109857548a5c5b219048fc645964e31d3e415014b44e198f81a3eab7f66cd0b424c3ff95f9fdcbaaf101b0a7ecb589fa9beab1e618c3a84b2ea4881c88e69f9489b6ffc0967c053856f4fbc5188aea17de6de9c26c4411dfb2fec7982103d4ee9dd77c3ab422c3ce0f31b964a8bb7eed39a17424fc4dacbbf52f604de9de15024baee64490c4ffd6b8b23529f136258f1b517f4f95a7a1abd073f7589e4ffc05bf2863f34d73f052eedecb37c3ed39c15ed4f89b64b816a778b27912ba23965daf2cd648adab10ab883fb145e499e04fa23a6384af01c5ad53291ba946dc7147f29b27df2b545aede93670ec4e5950b2eae9053e4bccf663c3c1f1e07f5572d2910f2440e347fd7d975e441ee216787d107a5777e497a6ead3b7d3c72a4889727d56e427bd0ea7b33f44451827623b98f44d14aed4147c0b7c2631e4821be7f1cbe57194236455dcae897980a35c06f6c622b01ff9906bf79568fdfe4b752e305c0897ea6413f93d14fd61ea4b8207f09e43673a3daa342d3e386cac6f25b62d00b7a50aed11e8e95dfcc787eb5e27341cfe251ae7865d15dbe02f9f6c64fbfdc760a24d572e356bc6aa755fffddb3f0bd162c7562be37ff7105384580b6f2835b8171d289e70f0772fda615e9ec245ae4713be8a090a86e7295c60f15c52a5fc6b81f7e51a389d1406e527bb279a293f7b69c583e33f1162f5c0a5ed7e3b053c66016262a7a36e756260b110832b2ffde06f525186faa4387d7c8fa34244fd8ed09e29b7f80cb59bda39922fff71d6f9452f2e6b2f3b2fad7ecd47e7caceed5abb6ab69c98aafeb5e18c6fe64bda4b1a4eae7ad727ea7cdff896042f88a57ec7a79cd9e2cbd633846895d2e6c17d0e90fae0a116bbf798247fdf3ded8ade55f23d53433bf4f0155cd851f6f60962a03fe57858dc73cae94b1d8aa9266ecf32d51f5e2f6f14dacd453ba9e9b40803b258b5a4a73d00e0346121e6ec50619deb94e339d5af61e0aeeee772c66739e353e143892ffd1dc5ea6e2d07517cd590657badf04bae1e93ffbf0bfd76392079162e703a03fe13615e11c05c5f8978ca4fb9cfbb25f66b549ea254e4305738d6689c71e057cb25e4ba58f11727e70aa7f6cdc5f3114d4f18df4fed51eed0da05b5a7490f752a7457805f4eafc2c403fc127d97f14b6301df238a40af18f404eb3f6a8f5cc66fa03dcc792081dc6e647b00af30ff1ee097e8b949f80db3792af9bcd524bf02f22cf1c4f489df89dba390705b792071b1fc5d2ed8f352ffdf6d77e95c71913f95c72c9e523c0edc1a328944a13d26a8f03ce6499026cf77a28122672ad64292844c7e7df7c7a73e94137064d65357bef28a62b01e057fb51d15a41879ed55313cf7b6337bee2fdfb4d3d2ac95637e94f416398f473d31b2204bcc509cf38833a3bd7c3e7476ca91d9274a45b0a4e55561c941ebf5e9f70c1922e19eed27f99b15b679b7dd9567cafb5aa7b7ffe02ce9f1b4fe579b7f9d2127c0d4c6160f1c3b5c3e7f7aca80033b487a5f398bba74897edf587c5f217ac1c5f715e2fd61b49fe939104eae7d01428a654d87f8b4255669099938da9388eedd2365a22dde17c6fb95f4649a9e83954f41b8b6f00b0dbe9805fafee1cf1efb9454e86bd6af7e6feda1e837788e7aede311056bb06b56dd3205297b8b3c11bf42216bc881ed3a7f293d909a8e472a0f24b036e002577b15e5a8ef6dae076db53c4b21bff9e897580846b5970ec1f0b5bd4008c6e457b72ff3a06cfc06d6326c2118e641c5220a8e41df491a51803c680f44d12b65f49bdb1ee411f39027e7b7c2baf6c2db43d1b3785071f356b3f88df3d84bc07f5e227e7f58b06848d403f9eed367ffe3ea40b42527a7b20f1e78ee81cade92c98b1a2e5fe81f2c434741f6d495a10a1fe8758d3e333250d9a94ab3f22d95c954e1cecfe2a60387eeb69cc5ed253e8bbbf2d239e203ec1e4a0ddb8833d21b309134ec8bdfbf92f3c3f893bbec7b9d9c585e3ab0c758ff88db2fbd0bfdba095e912bf9322be0fba0f29e57d2db2b8733e2f98c3be33d17f4a892351b7fa7f6cb36db13672bb3b3a1637ca25296ce92d7edabb34050290b9b932a673d9da5427c16197c0ec711af492a86359f439354bc0f44ff4ee67c2abc2ab476dc1239757fffe3d7b7fe8423a51a719a3459f3d8a54d3492cdf70c203c138f56e38c424f6f77bcc794a79ec0e90cf2817a13cf6655203751e1ed815ed315d3aeb562daa43f3640dfb2434380df9189f8f558e5bf673f233c71457673e561632bc8f32ded413b2024ab20f72cedd133d01e43f15c86c97f604705ceafd11ebaff680f35be6303e7f76641e5c9dbf0daca1e08d96021dabae34f7270ded4509b22e13e27f72eecf6a1fcdb8fa9837b5f29fccad982e83dc54e148a7f8a0ba37095ae1ca7ca4e552d9121a87254e13982b2b6e6aafb6091e2140b0ac188bdc411784ee0b9cc785e79c57bcd37ebbf59f89d5424f3befa753ead6d7ca9602d2cd4fac142ec11ea35a59d9c120f7becc45f1f978a24f459e8881d2e13c10ad45845ee06bc4fe17d54e5bd3345bf3a33099f39f17ccafb72709fc2ef465e382a95e32a93d3f13b55e62a3cc6673ae35355ca8e4799232abfb5bf8837c6f19993904fc2c7003f5074c073613ca72c39375041adf0d1492adeff09be5721e9220cbe4a15befcba6febdf9828c4ece5ef957d75bfe2a516753bb4585e8bcaf31aac79d41cab60dd170a3674c6378ed6df2eb2661f98d7e945e981ccebf8eaa874115be328831c0f42bffd13df5fac2dfda62b90b9a5cf2bc8ff097c2ea3576aa9201f64a9c8d6fc6afa838027ab984e6f92dfa9849b15d3baff908517b76341f32ac87985f7665690cb7e1a0b3c2721fd58c57be2f688f19b6ed0cbb1d0b3f36bce07d47f15a09741e32c31bf2b672dba3eea814cfbec95641e48d56b0a363c06f87b5b440fd429c0e9d27510d2f3d9e3ed035aa7be2f44cbc5adbbff692711cc0629c59444698a3cc445e9bf3aed4de17169a04a40622118ea10c55d8e0e7544149389171bd3fb75ccdbed2d217ec95ef1d8c77708b1f6b39feefa0d1349dd3e42b45f95d1d5df96fad813fef2d66d2b84481bd36270d613069f3c64e02a3e3011c4421c6a5ad2218924d966b16c1285f345ed4148bb8d40b16e6c9a2de793f89aaa27e864a102b8f2ccb5a750046d499163cd0aca049f25782e137c2a9c87cc4a11220a2344c4425c9f5ff476b749d2535cf6c482c77ff841fd81b2af74e88a14c859c0b1cb320dc0c67f29a8f7f3952dd3ede6ec99edee12a2dd1e9d0ffdfbc922b8784bf254aadb75a6c91f5b5ccdb32edee6b1ef2f003e135f1906fda8bcc5a5eb2a7ab6e403c6afa45709dca4b7b1fc9201a443386c3cd8b3ee4cfa7cb19916edad212ed06f667b68c5c7435c443f9875d534bf791b1b924bc26f01e805e60393dfe58bbefdeadd638458f8f9171f5562a6ac4356282581105ebdb3820d6f01feee14485801ad402a002b01df11e2a7ef97edbde25669c1753ca824da22e7893fb5e9156d10377a139d3d3155ea784533338a2749b3b5d601500cba97eee07cd06972a24b7935e59bd62708b1fb7dfb5dd44f7a22dd9edaf74f6de590dd6bcca1693dae1562ffbfe4b62a9478cb35ad77df7fb89d4f6bb6190db05ca530e574908ff76781cf30be2f8bf19915dfda4eb06e057b046d629a2de773aa4e53dc0fef0fa37d2b4c3e2d69955ca1e604d2ad238ccf089ea3892d62f019cba251783e14e654f24415fdba236b7aac5e2dc40be7dc7be413d270f17ef56eaf437d07d5799002a9c1e697b5f38123cd9a62c58dbb8323173053fed6507fbb9f7db7dbf2ec97aff06dca2c35c429c9404a53259e214b14dfc9fa3fd34c7f4dbab657862c2ced295aeb5f14fd4a4bfbf2fa873cbd984efc6736c56f5c9658627e0ba0e86213a0a217933393be3d3d9ce8170057f4820650e6c6b4475c9618975b17ed53b091ed5100fe938d83e6f14b6bb781f9c0a4bfe0da99f3a65e2ec4d286f9e52b919e54cbb20cc910aa56db98c6d640909efefb5320d4642e704c797e3a6af51deb3ef7ffbdf7f8c3e775f33751bb2ab5dda17ec8270c4f424f046a00264bb30d4c287c51ac0013dd384cd08360b9694dce3a9ce7bf0f0c7dd5e238e991fcd0fe929e1749d8b7e3b707a609913a33756c863f84c9420f2cb6f1c2246dd917824fc2d57d194a6126b0f00a0cfae1c0c054f793a7528cb45b72bd791aa85600cc62aab428d46cb8de3375ef96e0b94cf05982f6cc447b96804e26f82c019f0a8f6db2478575ea3dda1223cb0b78d0b233f99c4aa13933bd7445d577f3df909ec55713df39f1f34e8a73aaf3a00156f30d202990f1c05127528f901729104ae3f525e4b76f574ff57baee74b474d1979bbfced5ab14bab9ed1f62835f82b259ccba9ceae528aa61272a0e5ded24f836893cfa63de88d586cfe7ff2be034e8a62f9bf672f9025a380ca9d020f0e13064cf86ecf848ae23360fee9617a2afa147366c02c6605b31ea2a21c2604c4802c0a2819942808778020395fbe9b7fcff6b76a776a76d8232afefb7d1e65efcdd4f4f47477e52a1c50011254d0beca49b2ae0a7d125404ef9918bfcf3ddc67ccce433f27117ebdfe0dbe60f765cf7c308325d7ad12125ff5e7230ffd0c8c9fc69bb1cdf908fa7eb94c5873c5f83de39ddef8bbc73e3d5433e6f3963fb601ebbcbc25a09044d888fe9681248110646f44d922f287dd4540d058f200e1905e596e29d8666d3267ad3b5c1fc80736f8e6aaabe2287016473e93ee3de18112a832c9433f870f428adc2537d448b41fa43291feef32e29d38f26c31cea481435244463f9775a36661e7f838521a678e679c7ed5066da47cf469fe32f17c332e252487208e890f408cb3bb6f434680c7f49373baa6df9539bb7e98a75c739f509df954040104354bc4a9b884798c52e3c6e7bffa8626186b162c7b6e3d050e529c07241092344a8fc7efa4d26a6d6005d2f53301810a8b332de8959655d079e3156e40696b6b73e326f1848e37fc5d98475a8761338fc954b13e158ce9e7132324f0258d9816eb404a904ca899e3eee1c15fe8c59f34e2bd95c9fa54797f45f196a3f461f65dc9bf574dd487d8f95b2f58a219c9ada91b9fff4d4b7c459b373dbd48cf6fe5191543369cabe77a6de58325aeae3ed77ac5fd8ea14ea189355c47e92a75a575b54a24a1da78cf1edb331f715e6211dc4784c9c67d3db6673ee2bcc4bcf882c69b13c0586648fcdb96287f9830e4990fd3f51a5e5834abe41ef3a07214ee6249041917988020d0b90281d0aca26d8591dacadb0a447fb711103c8854587c6481907060a1fefb9211b316afb959a97ffdfbb8369df546b7daa62c38f0611517482874c6d55599f007659b87b131c402d848975f88fb6cf4cd824966832095c900783f7487e4e0e71472cd7d01075f06a78e209b407fbc5f0fbc9f775c4c0004472a5571745005ab0a3230ce3ce0317dc93111a1ca86dbed14b8ddfa360c1f505675c669e5e33b74e5f9a571e68871e6c48f3390a092cd0c81849b4e5fb376c6e74a7d73ebbb978c4092ca72a8a658f280c44184830849590b4018d92b8719c804041b8cddd3dd00d91b4f7ca3db3efab7f7ac051919caaf82f1dbf4e43a357d3ee8f940c930d789ef84d43cac8ab5b62d41c7addf5c8cdaf6e0cb912a988088691530de1fd538373ea9f8aacda316ea03695561c1bd63aa94faeec2813d5e68a0d4cf277e3e65a8dec9bf2c1933e26b3dcfb33efbe1b988be73ce27e3d7fcfcb35273c74d786ea296e0667d3076dd58bd4266fefa7dff516eca99bc6f2bbf98a9ffde64c2eccf349e0697343b75c3adfae8da2f2d9a4d2aed98f470e30bf478d65b75a3d9af99a14c12416e13c1e1ef24f75726e623bc5df3919324c096e62ba39ab697dc6d4b50554d2aa7b881c8911b06bf936fdc8d54b949f41f5bc714208bf5cf2a2c100eb2853001a1144b11c00215d076b304e233a60f042c04a4941c9a13699ed2face559394aab5a25e2337ae411f58a43289e0eabce8bffe140fd17e9c686bfad238988f0dbc1a1bce463c08734e92334b628320954936ab76c039f838051a578e679c5244ee24527bf042dfee9c46e8b32aab07ee8be0fd7230ce88679cc93826da304d49e514a03a1be84b71910bfc369e67fae09c351e43c883547c52a511e49f4f8176530c219f78c0f0975ed51b65f9bb0b1f5b897a2de5a49a2255158ce52597a04fc64682cb0dac34456b5595e0ccb0ac5548efa3b6bd8ffb2c53cf586845ea9693ae8c9b570b57d33d03b76dd3ab6e04b95ecdb9d17e57c697eb998f64127450c47b8ed99d3e094a8cb7f2c18ac65bbed4f3fbc0c289c3ce576af49fefd57be90ea5a65c3bf28dafbf56eaf7b9d3facc9aa5e7f6e32d955b47623e4917ffade893c457e6edb30a66812bb994bee81e7c0b9f9cd677eeb14afdfa4ee4b9eff5f798bbfea7559fd557aade7e8d26ba755eeaae6aa85a3dec563c4c39a55e370fa396703ee2be5318f33316f313c6fc8cadce7cb06a96e7910995b99ff6af94fc839c5b32d8092113fd30eecbc4f8a3fd4d87aeebffeb16a5a6bdfccdd21f0e8acd57fc7c32240282f5ceaa2b8a6f5a64a08f8004b6dd4d40c20670c5bd5c401bbf9ba956217d1414fc3e73e4b2f17a237e78dcdc937bb81e5ba19f5bb81bbcbb9114f4673264278737a459e8037d3a63d3cf50b4114c9f921ddb6634fa5f8fb1d5e715954c65d21d2a890170336e2a24079fee5970224c007c1c79d8e0a9a6734090f712a5f6608e97cf3be01792838d71048d930209d724519d091b848fa0c624895cdc9738a9257362c992e211e137f3b765fefab4394d951afed880eb3ea9672e6095153616491cc489b10da4b981ecf688acca958d0de48d6546eeb1e91dd8aac3b7558b95aaf951edf2fffbbfb8f1865925553d9b1ecf2347b217e23ad3275b495756c59a7e500eae205d7b4040a9ee1798be175fd5db15076d3e52a965dffc36fcf3e95ab298f0ee9103b464372ffcd393335fd273397eeb7745501e9623a92879b9b16a909c1630dfecac405e6f046581af050212613951ff7f4ee9545772fc7dfcf4450b75ffd737c6fedfb097b5a4f2bf669b975fa7094a9786d35bb9b9f73e4e5d52bfbef2d93294cce955fd9c6489e7374718dd837270f99d26bcf8fd4e0863813f1c8fef8fe7e7bffdad5edff3664fec3717de55c40095d27c8371622fc3d70cac80a4c25e58309ec7e77adb76dbdd040403600984fa03012959e05840dd6f7c7dcbf4dff402a91b6a78d6655f4739ca4894d0c4447d7377a1d8a031ddfe403ccbf4c998c939b070e0efacca6424249a6c1cd06b701006700a499304766523a699a5ea1bed22629ca6df1d0b6f249c0562a2b10dfcb9789e8d71e6e279369e978b7152dfa8009bb2e440787a88fb7a609c36c69998a0f68117117b272551f1c5c69981e7e5457fa7fe0fce6dce051ad4f938eb39bdae572d5ff2d15a24916495155454c481913b23111096401099ce223e558a8c0016284f7373926de8f867c51a3dd3ad061dbef4262df158f7584535baa81867db9d9d43e83d0d21118c449c243910d7997e80adc46f746709c4cc73908a33c89d54d8b4365eb9a6f5142d6b7ffdef37cf78aa963ea88ef8e98e5ff4015d3ebae4fb121006962828abb17087269d3b3b2790ca10991b28f29fbde128a383cc5146df074e106404a6cc10e557e843f0d9cacfdcbfffbe7cfa9085bf2b353bedc71786eb757140a3f6dfb939e46a3fbf4fd6a13747e73dc3cd6abdd339c9644609697497e78cdcbf7e9ba1c147b69798d13dc3831fe39df4c257a3df5fa6d7fbe38591b553314ff41d48454b8419fba0e45ecc1b083d491eaca2a53437052a49db5391e814d90b33334572bb91db6ea3486e37abed84a3f2374efd4abfec1d251d877ee389e49491ad3272d61b994cf5422872f61a53f17b97d5e26e6922da93d6e2ae66c4bb1e574bdcd7d433ee6435918322f37b7104bae127fa8b08f7ea47bc9b3e229fe3e6b7bb1867f7f871aa21de1af71401cfe3c4fb6aac8923e91d8e78cff6cc4b40c4fbaa37969e30e609a5664d19f79f455035957d602067d9ad0f78adb75f3ec30b2b071b58b5c140e74640c70bb9145013a5d63db77c909bf2a4626ee9800fdac67f7facd3e7f07ddbfb22c8134720d33cdee4c8086c83ef1ae0eb9db8c6bf9eff1d8a202ffa6063c96f9a00cf787ff4214f6b82f1c569cf5ffcbc9ebf4d5dd634580f89acf41c038bc108163d6de0d62d066e419afccd389036773170d326c01a8020001b7f42ff0b40d89c36e2ef9b7ef2fece90aeef25f00f8b3da7ecf39233dd710f1df674c4adc13eb1df975bafd4e3da6cafff6c74e7f875b5ed08722728a25e6694101910f4f9b0ed08f2dee25c9119001c276cfadecc0f5b8fddf4e4efe97abd6ff8717421050652660c043af3b94a9932a89c04dc7cb9d436f5b30021693bb35592b6bb25106a1103b8e21ec111806b705d1ff46f763db4d2de99fd88524dd20e987e855e20d62bd6e7e97ac21445a6f60307c691c9e0f038b2d54402732dee4b0d3dd57caf4985c8b5b8d99bc58c8a543e14f1ae0222de6f374911d56aae5b427efe05e89be7cb08e230c63150f4fb21f2be3bc67517f07642c46a2c92dc533b9e8de532e2fd24d4148f457a2bdc9781fba865e03a85eb32709dc275a68f4340cf5f187f3792c85ddedacd7191be729c32e2dd685e11772b23e9154792f3381346bc571554dce3aa4e46f47975f9b3fa08dce26c98b7f94b7349e9c10612a75c02955631245fca75553addc032a46dafc0015709c9a48a529d08f746ae24b9af81218ddfa9e5349df6ac7ecda733deb866a9fe5baef559541239dc7c5f3dfed518ffb62390791e5912c13ca27f9cf922d65052a18a752a3309248920affcb9fcd24d1d95ca5ff7c45df7e87db7326ff147cb911eb21c84b80c11fba5eb309f3f623e3f0144a1ae22d4d62f869341515df451e7a6e439c06b808ff09224422a97530141c859a5456ed894fd9a545a22f2ba02b6abf217d03f52a93f272cfa6ecd214afdf2cc98c563c24a1df65cce92933421497d38edd7a6ae8c4d11e4f062d4fb8d723b542f829cfb5c86629b11e4b1887781bf9023f60b300e05fcd1fb7f9ef5c5d32f6a867b79b7853dff840a8a5557349fa980ef63beb09e4bb02f2a487545297b28b50fad7322201115d0f61401a166036618e035d3aa98bbafde226b1e5df244f1c94ab5a8dfa6cb2afd42358beb6e3ac3a5a40538901947a0ad804450eae746fb1d38421b8184425530b67aaa03b6a1d838f0abeb66eb4fff6cfa490309ab19a0276c05d5284813c17d34ce8818a71dedb2ea05de66dbeb662b03be726143228297345ec1a72a88bae9fe725ce4ce0177ebb53e6edcb5f321519412a40d035515a952d86d17aa167673a4c2515718489c1a07564500330ca037a3025fae2d6fedd43f46bb3680d6a5471fdff876bdc51aa71edfe91e97699205a5aa1d319d2be623037d8fd7996f9d4a95a9df6d3b8aaff2818ad3dd0aa1933e1ef6f9139a43dfb06ee5cfeb9ef3ce07ab0071c03341862e9de695e13c5c0f5514ab08bff1e223a706b66d60de59374f91d29502e23a4ec541bfcb026eef88df2960ae0a5073e0ab9e5e72f6587dce64b63eec8113f57852de4ec9744b39fbe2a1aa1b419ed49b935494c96c7dc027ca4e14e56fdce4ba3d7ff9d280538676f0ce1fbba5932a906c7bc2bb909c4868fe4875c581b211c002017d6d4f131034e62a3d5ac138481b72ad528ba7cdf86ac179fa034fedf8c57e7a81a67e9a3ee1d07a71c8329863b6a3f792d191fa647ccf85ce9ddc6e27c37ba5ba6eb6d256605bd124e09a90dc84fbbc8184c974d0d2a84d6ebc4d038c77d50cd08b2bd87416f0d4c5b8c3b8cfc2f3c2783f2bc938cdc2ce12de662ad0389e23c69923c64904561ca8c9e215bc04f5cf768b078ed207d8c8b75eb787233715a9a44a5090ab14075909d93ea84f5e57d00d13c74a070f7ba5089515415ebfe00a99f18164e3164eab5559afc782854a357cbbc5e357bb6f3c5ddd977a9d8a8f7bc930ef19e81c61e6d5efc51789f6b3b9a0543fcc8fe907474c7bf03ba32b2f2f1ea9d4d482afee7c7a88528b7e9cfefd6252fd1161a5c0331c3825703228c6fcf27c1e97b8cf368fb82cd56eab808e9e22a12bc88d14849a0fb6ef13c34a4a6a2a74f7fcdda0aa61f75452ed900ae7cad87d9bfbad9ded8e6fd3b2353d22faa438b0ef2103c28bf5d9d3227471832312326a76b4e78f5bcac055f84e89d76db5c30e0ad9abcbac2e10aa5f668f7de31dfdde4b96ce99bf6c901918db3cc82961be8022c302650daf10f3cc95362380052a49db4336106e1103c8482337267106b4107881698ee4fb4ff3163fac5fb47c76e9b3df8f4e88db8ee28ad58e367daac59d0fdd6577aa89ee84a370476b71dbb095f86a713b36f043b76cde3ab0283e6645e3e91d3f2efdef1831ce31629c63e2c7453597b9c67b6feffbc7d510878d2171edf8b871f6f68c13f3c778148fb3b71867e2f98c8dd3f4b3a846b8a8711f3ccee82a595f77e59d939e52ea93ab9ef962d0523312aa0059d6c640f23e2925ce998cb5a4022115078c88cce9d201436f28bd5108a2b1ae98d631d6b5bb8e674efdeea11583f5613b65d3f98f1a55c21c310f63f09e61e0f27c6f7d1d7d8f30aef3ce2b7f0fc627d7a917bfe3c5fffb05d3bb0ed4046f61fe9435bf8333a7fd26032c892014df23fac580d0c1930a8bbddc4679f1b1e441aaa607bdcf6548bf7716bf770ef8fb775e4878cbc5f727899309dea8d8f87f9f30fdb83ff4fa99f5d4d883ee18aee7ab8b33cd4d79c335c855e275ecfb7ec135f9e97b1a7c1151e33ce0fbd1be58f79f95ff9a3449a91f27e40f9b0a1521a9a0f8bd1ff0ce17f7854447e72c9fc3b4deb3bdbf276f7f9104c2818644db491229f0f64303f07b5f3d099f96bde94ef5aa39051b22b65207fc9255e738bd10429b5216366feec14d58c2d17b93051206b903077ac770df70e403c876b29d6eb632e27d2cdc6e3b89d41e390192830a901c689c9475b79ade66dbe0784d9f395eaadc4ef32b6b65cb88f7c40159d50e248437cc96633714cdd1339d5ff8d4f8e76fd59be3c9d247493545eea27c206084acb2a2fa1e929040f4272f1e4ee5f02ee0558074841400da06703cd340efef21f42dcda02dde7fc6cc5f6729d576ff63d79f3d59ffb63af46713f70b0749ce314ed46009f236cc467f8a74271539b8622a98e8fad87cf9bafda7efa3cfafbeefe70c5985f7874a880ef6629224b0af48a2639515b93fd3bc929b2e54246493a8b8dc8b9f5548240148ef1f48404c90a18262828eefc18ca8b85e465257d1f70367cde518c85d15df9957aaadd4b225f3bf5f7ba852ad738eeceb9e4fb546d57df75823b1627e93781f2697282378a657a2cc10f811f15ef95179cb8d1b95fae2df2f76795a334e4543370dde0aab0c49d0d20d9dbf8f9024997063fdb32a8f54b479cadb222a49fb8b09888fb3cb330089b0a31b300aa1ec71376cc9335b9ea85ca839d10bffbcf05b4d699b9fd4a676c719fa5566a5aed9bf7382a7d0464520a13eb648076d12a7076dd06411ef64cccca2003645c74904ffd2016dde2e990d82fcbdf3456a8fed0dd02b64ddb9b131b0d15d2c7419a0e7cb6924547163b9846a4f8cdbaed638830a4b753504936d510139b836ffb06ec22fe729f5e9c2e7c63eab0fbea29f374ddfbad50c8ce2059853ee6ba02420acb222b7533ae0c84d57a83ef860a2b4ed71e9dbe31b138e5cf433bdbf87f48a707eae7ac435801e909675836bb4af51b3f6a2330f8c435280d51fb3b999752675e103799ddae89be4a04d45812abf4d2f7a7fe53b9553b76ace7a5c8d8f073e3345cfd19b9b8ab7bc82f90848f7cd9cfa5cfc0e022d397a72df65151508728548d247f556e4c12f09b3efe0a27e9ee8033a825030be3ceff3e877ba8e739ae1b9cc796bbc8bbf9ef9ed2f33f5f63ee9c4abc2ba9f529cd2b9996bde962aa96405a5628c9a8d7734fb69602023e8c137e3f8efef76eb0acdbbeae73e0bc1e0708439158822b774b23d918d4fe476e3004d4a5db2c8ffde1e98b4fd5504845a9e01c4c971a0a1e8d3c68c37be6ffd76c3603797cbf2b1f3cffc5a4fd4fe9ddb4f6b7d8d52a91bd31a1e7c6d8267e52bb8e5527a73dab88263080a20923688eeb0310c807f44925adc496d1063d9ebca2cb01d0dd00b33a112a933b633402f281dfe94ed0c240c26a8b9e63e11a782036fdd0b2bce1f3f5e7fb6664f757da991de1c2f6fb9bd085e7b4c38289e000759710f4088f864ece500411190c61c31447be67ce9c001a1f26da802bc19181b3a0a9880647aff1e5aa2d48a090b3bfeae39bd8c9cc31f3a42738c29dfa674ce3cc883d360cdc0bdc99c43b24158d690d34560c474ae0b96a6ce993ef871a516749a346d16fc838880b29b33248a22230bc76c1d225e866d1aa492a29c4a24c9615e1d92348860900461a3df9bdfdddb643fa8d9de2e7b2a45c4f3d058699c873e7de730eecfc5effaefe545a5eb5c09a6ded0c68fcf3956a926630e1873c9ab985ff70bf873c7d9e8e79a3ef63d4b94017161858919d6b2fb4ad7ace9a0d46739cfddf736dc99652a1e628828ae83bf13314ce4cd86efcbaa404884acc222d5556feffc246f7bda0612d078e061f4a54d041b9c757b7480e88363cbaaf5376cb953a9af7f7b7d7aafdb35c77aceda7b5e772732a22274bfa7d9b00df44ea6834e6283c857d103dab910bafc885797bf1dbafd6ce0e92eee0b639c5e5dabe3b395085d39fa725cd9c2b621c6a96cdf389d78fc2adfeb971ed3edd2fc117ed18fe9f4b33de3b439aec43ce714e747f7205fd2744eedfc2ca586bcf5e4b12ee7557e4969334a0ee79338b07198632689438aee14e8465e56a40b26880d54253931aaa419d078dde27ab68190aa04ebcf3da88b9b6fea553a48a91f6f1fdcf08695fab719654dc68fdb06eed8f717b60c87be07e28fbc362227ecb541551e51b160cb1d4a4ddffccdb01fe0564b121707ea617ed87b4710661949ce8443d828a48ebd4ada88b2bd9079701b3022672149b3bd909f13a0d377e8bbd0381ff28e9fe6a13c2ed9e60ffb7e74d84c2d01977f5cf2c44f676cd39611463f823eed2fd3e7f5bf6d1b5fd9d8b2e3dca49f5faf7e7bc163e4464dde700fc4c6e5b6d280b204acaa123611b2f1c9f991f358fdf6574b20d4228921ab08f2d00787c91c838dbe9efaaa0595ebdcfb167d31eda9a9f594aafb75a3bb7f395f73108d1b3f78821bd1bec0ea5c3bcbf3cc0ce08a624bc0317824099fe49005afaba190689a52ea942491a8413608728bed847a1bac3a4b5a235a7036901c46727c0aa9a0308b4272c809901ca4089e2bb2c006e5e00af62e19eb1927249e67033dd20000800049444154caa3ca87ba1b66f26923af7976ad3e60af1c72f658f7ca91ce264ebb4e1b8674bc50a530c188338646fb58d7e44dc48483bc73c8ff9d4478e2446df4893050cc49508b18c01274d8db9792734813bc92f95b4a5cafa0351f2cbbed3bcdb1ef5fdaaef258cdf18756a76c6af140c267640077d8e0c6aea0dc5f6bc87622243de4e05af3e2d2b1a3f4fcfcfef2d46f669c6750920a8f732441a2209bc756a8b64a496585dfd96b8d5454940e9ceaa5d07c1600d2c12de6b7da12c68eb608609e80384f1cf1770e27a0f3260c988bbfebdf0fb832eb3e37f757bd48c3b6dddcacce4111e46cd3622fce0cf38c00491dfd8aec8affb9b68ed175deebf2689a3ec78e99f1d41f88df609514f601bba5cff3f6e93b9542526155ad34a2c3fbca2779d86a3bdbdf4402e11636806a4f578d07840e95bd2f28bf3d71a4ad0d242f91a20c7d20fdfbcb5bc7eeab0fa403078f3e671f2d994c58bbe01d3d7155232b07accc8c7b26710c4111ef170644bcdba8617ebada662deeea46bc3b594e17f42982381bf76db366368f5346bcb7445c697f6f847a825af10923de7db5e8af412df9b037925e2f3a1a97e3196740647ee59d95735c4e7c79f8b7b69f6a517b48a727b27a757175bddf1d3313077cf1b3800840db8a0379abd1faaba263007301efc6f51420380d1001826ee548b75520c2bc92ea7b50e01445e2eee046a29aea24b1502df5aa8f00c1f9961f65a04b10d79eb5aceb86054a7df7e2db9b2fefa5d4fa352b8e7a70a6be765ce5a7cbae49f010b94e6d451910bceb08dfabe2f48a6c37427bdac0af5f183e09cf072165c9830e28cc13a9a64ae877ec2bf26ea3e492151f1a58f92f406494a00c13d2bb67bb258b5dddc20670a09c5166b3719e22b8697dd0f94292ab1b883772c1ab678eeaa67f3bbaacdfa433a3fb26610479dc3e8d3e554690d33950d9a5a2b4d82d0075f382673fff4ca9a1673f7ddb9d13955a78c2d4cf0bb19e4b4cc873ccdb4d7abd615f9420854929e277caaec3f8b1ee99612209846c4f36607fff9455affd5d2410d9e88550471ad60ba584570ccd83036f12f2f776b061aa36eb491eb4e93d97822fda326dee143df16b2e583a6aa4a6f08df25a6eae5d5ba9f409355f3bf860cd096cb55a44d34147d8a869227fef0a8878efa9aec1184d2470402dee6dd43236c917a9667896157d5b2dd1a076322250f31149df097c5b4fd4aceec311efa62f22deadb7e9efe0847aa296791f964c2ec2fb7922dee3bca32ec2fdc668fe86ba0ff72170922d5634ce0ce051b82eda776654f67625855537169eeda6f11e7dfec0d00b6f6882317bf449938bdce8d8e2a94593cd2da5f06ba70d41b078898145308e93bb28110cf63a815b6f296c60954702526a121ce894a2c141ca0d07a938f88db6b751ce029258f03e9cc0330c084e922bc7e8755a5e5a3ada4de9535038337f9e269c4bface6efa8996c49aefdbfa81ba75f4fa1c5cf3b5435c770fcdc9227bf56a3c0b91ca58477db8f67cf47b6dbc66f5e73ff4556a5eebf133c693919b2295895060be8a6f01a448f25c5cf7878144402ae840fad9c02a404a5144df5eda1afe360de9cef97cb1013300c1a038b6ffbeaa82aa37dcefdca6d9d1fb86f4795173459dae5d5c964f4690d3faef09c983ec323817b6feb461c9af8d94faeaeb37521ed18469ca355f7d39493fb7b8ffe69fb69888320e842d39d4c0adc420cdf542fa7e25fbe0bec30d2c0781af4837d0976d370c4836a2016a079bb5a337eea1661b40eebe246a5af0b60941824a79c4c0d454c0470d4c433d87f4d30dac09d1ad065255d4d222e9be3533af6dd64ca943ea865b5ea245c17aa58d979fad3772e8b494468d1ac586e24b72689b842c7a81a060933517630dc78f3ace3bc6abf2e923543e03d0ef095584ed353afb8cd0d20d508948f21ccad66ac6b51d11ca89555159f0fe998bf0b970e271563c593e73fd7abde7862ca9fc5e733c13bffde2beafee556add172b6edd0486a092b2b5922449ba5be2f8c8dd561c783e9dbc4c578d03af02aa1ae6bc84ad43eacaf980dfd9063cec9e1e31209403089543da1106a6c206920e5d37adcb1ac8fd54e309a5da1d7542d7767f2a95f951c70e376a0258ebd8ba634f7d34faac309543c0b3c3e6d9e6e985f7fc7ac7f35ab298d26944d308c6c1b643d88e8a88a3c5a147d97437dd81eb288219f3cbba7472772677580ca1fa69c0ff5e8dbd3ce93be1fba588f3c44da514ae77e9afffd292579b4b8e29ffa98bf265809049294b4ed9faeb6fcd959a3f67e2ad6e4dfe9fed2ffe37f37c838f032729ee4dda38608ba11c63ec05777c62c8650828be895457e40587f54e8cf6ceaffbbfab04422d02980748bae602c00cc031dedb7c015e8bbdd7b9c9efa2504b365b2b364c2bba58a9c54533c64ed3a2e4c24953d33fd194bfc63575be993f5f2f9aaf6b2d4e75bdbbaad2fa367373f9740bbdef12262b56f02a7aa0ca5adc49dd6c65c47bb6a8a827d377e724cbbaeaf54f8fab999d386d7d6c9c1918675e140645bc537a78789b390f54ce710f9c4d9bd67ce88af4f39f9db4e103cd517ddbeeed7fbf5da5d46f23274d706d50c5f3b78c22b75b3606524a05e45422d19b75b9e455026f124ea141de2564cc953a7910204a26c77106bb9b70502bf0e225ee9374ee1671a739e2f964d4cc0324ce30434bcc2b962e700b282d7c79f2f831eef8dba84b7fd0eb719f679a5c72e0937a5dfe9036bba5cb2815eaa767c6b0cea933aeebeb5a32db327cdda68d4836c8f34e11cba433271d3ba57ea182437410891421aca2c230399ec29613b297b488b7cb2c19be1f7d4797d014b69f7dc9a61795ea58e7f4f3720bf48fedd40375bac6f65fc9595bef9bac25d0df474c1bdc5f9f2f5ffcf6e2b9eef42c1b38ffee15a4faa3c03fcae54569efc93984e26bc0301161a78c00e49e5b2ee23b2a64ca161161ee0b8c2d48381bdbd1feee12886c1103e23f6814e2779248429048524e319038bd347cb0741c3c35e07e980e512f1d1c60da63dedfd3c66b1cb7a53f525373846daee8d4b1dd4aa59a6f6d5d7292e66c6bf5ae5bd1467368e967d6ce3d584b2e2993537aed333d36aa6a4b0e739062b22724073b201ea08f90246cafe42025891d4d0f5f59a762999b5caf7c63c9d9cbaf576a73cd75bfcc7b4d6fa06eb38e9a3849138c777e3e72d122b75a5fc585c499929fbf2f771179d151d237923c90f48db2e6b22421385ff23e61ef128a3778d00b2b4d3a4acef2bcc70847508b18c0ebf566035390543024d667eaa906b2e44ceb1212740d482ae990506a6e56aad5c8c31ecc385ac38687f4f9b726dcb5ebd5df98b55aa95187bcdae83170d0243190ff3f49763eef35106e8eb301072c250ff66e0c1b1058437b2f6b7c9ea0cf1a0e30daa9a719983e41a92b3eed3bb34f58cfc5a4cacb5c82baa4e79cab7fd0d78f3b20ff8e25b061d1f723092605f888a160db2e24058ec711927711050eca887eec2319cfe4abef21bc0b77ddf7dadb0808b5880124724a5581057745df02000746aaaef4cf0de40dfb98b7cff0746f5f6ef45470c6295a826970e2bee3ea7753aad1c21637367e45e33ca3d6e3759ed6b071cdc1aecd25f5fbf4776b3ea52f1e6ff572c76b7550b746399d4354dba859f432abab7551ec552963b16e207fea32ef64982bace1dc37ff759f32cba8b3155d8ed665e63e67ae7393bb80ca37960e71dd5dcb528abbbbbaefd2014583dc0364cdf5cb2e5ff789521b5baecad82a74da94fe9923834564af8f7090682e52d33001211d3b1112e2a888609ce8859cb2a2b3173fe73a42dd0e075e447f19e1902d6200a9b6422028ccf08090f03ac5fa4c23c687080741acbb1ab0f1a4c3af3f158c133150d4e8fbc814179cda0384830f2c541094f3cd1c2d4920d20d746f6fb601fc9d08d2f7014c032171558c513801f04903ebd4c175743ee07b90ea9d244e522d717c0649e8c438a14fce419260f07d54d783548b58f755c22964d713fabd9580508b182009090770914e9308c9615e980aa3136f5810102610c419c21b2c6dbcb89e16c8a780500d50adec9493bdcf67db4d8e183771a8648cede07bd33ddb8840d8807410531d1778b3c46735755ba5486227e377e401560e6f114ea34e816de5debe8c33e09c5522c29973fc8401ff6ac2211b9531803157ae4f863f1ac89209ad37b10e99a010a7fb88170fad2b960c313fe542d7cec91331efacc292849a525e8481f71f2279700b1bc03657fcecfb2ec4809e2e20be43ad5ab88e248f142f5e22bc559280906a8b54b4987fb271c81c60fc5dc8c64784ddf1becfeeb34da5ee6a847bb8850d70002deadb06b20a031bd5c142a882c4e0c0cba10a1fb8121f9c3e7c05e627053ac854b88fb24a8c080844fe14480129901a52f03b4b4404a9c200f02ae0b5268b7e8edaa38d0f5c8ccbc1387cb98928fd33057ade893ede9b0f7ae26045c05605d5c87e0f7d72b3edec85952778f155e17747a8529c30a074c70d277ccdbfaed1b84c121d5515419fd627cd33b95b82e1a0f5c9f34db5ac6104a7832705de3accb0a02f8da7155059955344f9d180142f83038c395a1c74be38193bc13beecd2d6200c789d0814f8498246e3a1fb01e2d48060ae7818244920a15217f0fc22308884c1e4b92067de732b87f57e2fb5491c41110b0b9fb0907b5bd5d02912d6c803701b38a25b9830eda221db4e0fc885320af2e3af049224911a26c2a9449a4db4cbd15fd1f12e36742421208cdff58316e15f01ebbba450ce085269a2f8218aa21592783d36dcbfa0d32bbb2c87e5b3113f0bfdeeb181f491a528516c469ed2d075bd800e9ad25555c969464c9b607c2429c700a189a1470c8b46e99e31591d8940edd2721922e9e0e2a996c0fe3fec7491eb2850d604984f62bbe0b7d8f14712e30630915177d0fb68111a3400484f60b7d0f620cc43e621522ed071167238de37bce1b6e6f9740648b18c0eb1b134c924915fcf45955441f000739492895d8a02910f52b2142a6c08d2e04513f85206d6c10a0907033e603812412aac468893ec511900d049ca1daa2764f23fc22e7933c881d3c9fbc6d48b75a0509c58db78942704a7cf0904a8b36c828f13b119883c47d64fcc30672285755588c8fc6bbb7e9e2230638610359720624826991bb2511568af8a66478a8049882f52955a5167e575049b16e1c2a2b2e814a121d491cf83bcfab7003dd6be679475bc4009644b07fc98b939d08305f0adfc3c139e040b2e3ef019b8682ad89093a9c45f87b200ea70ae70a13187c47a74a3c5fdaf8a497d56e6fff3402225bd800aaf5ab1090a668e32020870eee2a3ad049e70ee36e08128b850867f2e70f81530b216297bc6bacb3c47d504d8540182c04c4b1044204060190aa55d237db3ded2a2f245520135ad88eaa28e00a91d75517a08f886cb6912010902280abe0865d05c25c85646f74305204b783bfb304d45d8c8772544112dadbe20eb8450ce0f5490736a93a6c40bca745019158375520ec15f062e3f586804cb6a521a2994a94b21304d9b41aa28fefc811fa34aede025fbeb76fd1efddd5ded9f03e5c039c20924a2a042ad33aacc2fb32e389b80e0bb63c5215f2bc50013cda0fcf7a9f47dfc181130947f45366030a80a5d2ca14584deb251cfc6abbb7fdd3090835923810c8c6120a1d40c268cc111644f1b1404254a43e823eb295b24a0cbae310227759f4c586b6f6f1f65975015b8005dd342db4bfac8150d2c1c32a2c44ca3acb00893382379583dad3cc61e1c0639d3e7170c4e92215066f20da50b6f7b9ccf1ae12e39c539d97d90b1abd876d00af4ffa0f312f746054e180b3d60082f072f4f379e2394845e280602892ec40c09930930414c1dfc1f8d07ae7030b0c183340bb5be5ba9b9a430cdd50f13b1110aa4bd453dc88f7ad0aa3ff27fab061f077682beea3752f55502471df0848eb9fbe3fe2d75456c2d7f80bda3fcd06b2b32d62007f781b7dd2855adebf87a81f4a7c1dd93aa48d435ec73a57e2ec68c1ee6123ba6cbe5c4680b2029f34daf1df49f5618bdf855717a5a2f1d95c8274bb76c038edc057f967b48801bc2e88e3c7c1266d68bcaee43a0a27c61bf8f7b0c06f0bbcd4efa312b748c038f65093ebd4f777a9b2a5835dda12e8ba1cef7581f31b09788e7cbe7c0e8d23c9b8fffaf6ff8b0492acd906c885604963b72d206d1821babb3aed86afeeb74fe854a58e79ec8cad75ce56aac9432d3bee73ae52b50bebdd55e75a4d5c5aa62c8e1ad95e77d2d4f59a6b79d3f9dc72259d03f4fd86e3eb15e55c56eb63d88ec30d4700759b35573c759ea77bba7a31faeb8b94e1c7fcdd5ac8d79bfbc9b1e0e618e668ffead0b7ee73ad5be80a15e59cac2f4365d1837d95bacf95204a5a16854ade556a43fecabe9bef506af2daaf9f7253962cf978eebc0a18731dd8867c2534c92b8e6c1e82c028499068e30a6f1696182defef7bad6a2ba8850d600905ebce92bf538b00ca830bd7cb1441ded05215637c88513a3576dff1cf743ba2865e59077538eccb7afb2a556765fdd13517b96aafaab91e4276b1732dd5d97055b34e4b6768743ddfa6c0675bd138796b8142bcbc65e4dc5e588737a1aff8efbfc5bf8a55687e2fdfafec4cd7bd7bc584df5fdbfca552e353beb8329a2961e1daf57c109fe69d176654e81c0474e065c5eb16467207c673ae8d4ff3d4c7fb3bafdf20afa8b04ad898c0fce5aaa9eab6ff5f2510da7824b286016dfc2e378e15fbfd3ceb9661753541c8fad709bf759dacd75c4afab747eb051bea9ff2d8e1b7ea6bda85de6ef387eebf199ad8c20d5cb454dfa85153e696c253e372e750295b332a99bb4a449cc7e1c3a8ab9d0bcb06be1ce08b005f0ef045043e1bbd20fed2db7e503fb85e3d55af55951716ba2e8f95df2db84ca9d29e45ddbed71bf9f73b674e1b79b75279231ece5f4a2a32d2bd1361116ea7acfaa2be9080b84fa27d77efdffffe1b71275b18d03680d76f90244d90eed7fd6b073e795c132d11b6fcad4df7cbf4ba0df54abdaffd0d1a8e0f75683b58c39b42b96d96b96a1c6b79e368a4bf35c60d70d4abc53c2556d1b20f9e6146c5b9d7c4bab2d1ef233224d8de0a7efa5f83bf8fafefc527332e387a5968c6c4395b9db3e5680d5fad4a29cc74d54b1583172c50aae2ea8aeb16bca9d4cae282db3fdfa8d41ba3ee9ee7964c2e1eb7e54d760f172a26b91e7deb8f246e257ecff6e2f349d461b597b6ffdf0808057291712b82be543de925fadf55cfddbaef6b4a35bd63ff79975ca209c592d48fcf9be94a25a1f1c70c77f977ab221a21dc412e6c2f7f973449219a950fdfb08b387715369e0f9f02be08f07937640ef7e7603c1d802f022c1e3e3330d58a4c918292b51a5ff5084950d31bdbe5b02a4696771fa30ffa0d9fad9efdde337a037f78d7a4e123945a73c31fe754483752f2d6a20d4c8183bd459f8cbfa4331692c83f4e32b10d88cbf86afac4f044445fc3bbde7cf78dc30ed392f0c6fa4f5caa097b4af394a74fd39cb9f57ba8c6a1435d75acd5075e5c8610f8bf7bd8e016a97682d6ab95842149ca580510a25dc5f0a039eb9c27d7eaf7aff8b1ecc2715a02d9dc6ebdfd4547a53ebff895ab467dadd4ac93c73d568cf828197f210b8871802b412240d2fddc06c41bec7debf39f4e40c206f0d224c98308c9c54ad56dd3e04bd76ffee606afdc75c64f4aa57d5ef38a1b87e88d7549e8a6d3ddc8f453acb1513f7b5ae8b69018628423d9c11fc67d3646b3472486c05c5882d3f3718e010470473768b2567955e569f335c15e75d992268fe979eff7758f15a3e00ee9cbf143fef244382820eb65031d383b54495d7618fdbd5d32891840465d5ecf7184e2922beefdb46e5da55abf78e491572f8d265d2cca6da599a3f3436f1cea26b16482c0c93e693d58e887d10f627c4cdf7fd01b7cb1c264169ee2c1c77d99955ae480f311b01dcd26bd83cdc972c66efa424bd02d8b370fbb5da9826b66a5bf71b9667826ddfdf81ca485e7754801b314f84a714b24d190242d55b6c2b6e7b3e94576e60d7667fba712908801be1427cd946a92d3b224454b14d77ef2d4c8f3ffa509c62b356add73affe5be75051c78edba12aa2e4871d5073dcc6c1df67070ffe7c98d02fe23a1c11735da0c460035fe2833f1f7fbf88379e8dbf6e2f2769eecb0781bc08efb98b3668502bbfacece1896728b5f8fa5f8f7f3455a9d786ddf1d464533d3d963c6eb4e8534022a9c468a312874884c3c6efb451c3bb7efcbbb4850d905e4e1679611da2d4559ff57dbc4103a50e98d86ed04d599a607c98fae9ad6ee5bcabad798d676d839190ebcbf2fa545583f1d9397cbc7eab8dbfba8484f027dc6f3bdc5cd5983ef8cb524be67eadcf8d82b1b39bbd709e5e9f9fde71e1346495e688fe208687080af5a5ad4f12149f71ebefd252feea01eca21636804b8912cc34d05549ddf29ffedf645eadd48925e71dffec417a832d4febf7886b2cfbb7b5a079f3b8859821544516a735370b310f7fa1c24d362c297d50f64a9686f5951a1584240fcfedaaea98ebf0774b6c1c2a8599419c19927767066ca0ae286d4b7d4b96c6c5719421383fcc597464f1e3eecaf8bbe33d88c02acfbc64c630ec4c4bf9352567ff2b946a5cd062f9a5f3943a36e5ac4eee86fab1eba7fb4cd31cb433c35948df990237991050c1201a4944f40bc4ef79e2f7825df106bba0d906706967eaebf768f8e4bea342b728d5ebcbb786e4dea954a3b1cd6b7d76ae9e8bd2948e679fad5c9373ddda37c57d97d8411cc5a2bf5e0f6033fd08fa19fcdd33cc7d62fd5329d70c71d05b027f21f0c54a387bf031639519b0bf72846a3693f1e761fc1918ffb6c71b542f6747d7a9e56ae5f4fa74529bb63e4dafcf035ad4bee24da5b29b77ef79f0294a8d9ef9e19bdf2070308400d910dcf42939236708a09185f1bb0d18f1fe9dbf3faefbdbaccfbd9e80840d084c09a1e11d33dfbdafb3e654eb5cdfe0eee1ada21b605ce793a20bc9f0b3969018620b3d8267781762064b20c6d9f622e6e423c0e73df8f37c12430f8cd13c9708d61cfcbd13fe4ea27b266d742131f410124321e333ef910fefabaee63d59b2caf4a9206ce0cbf08cbb5010c07cd411e96af5c3dd1909e7656737a86c6e253e8db9e69175da9cd852a9cef75e30a8ed754a2dfa78e6033f0c526ac386d55f539d0acae1c592751e600ee3327fcef3f6a5fbe45f5e492f62001f1c790684f44a68f7c1b193dc142657edd337edf5e7dc3203a9a7f72ed07f6c667d56c7b576c56ae0dbd19b32a85e4c1023216aec5b98bd0ca1eacc14eb97189f1c5ccf12297f77c2efc5470c490fb91f02c6dbc3871ffd80751a63d4c47859f58afd45e3e78af63bd6ac284e95ba5f7a797b2df9e5fcef92ff1e778f52f54e6e3479da614acd1b3671e566646ab010c82cbd3bb9767e2efa79e8033221e983df6dc0c84e8d7c17b4d05f3d801d6c949204594de9bc706d19b73df2c6191d224add97f9e1d0f73fd007cf05b53ff9de55750c745e77bda29c5ecad41e478deeb85ae261f33b6a18a3c6b4fe48a6e6346a8aab21a8817c3a6aa2f752de5ae8ed4d9f6b8ca346b5ea8d38d608d730bf49e0cbc275a8796daee71ae543ccf50ed76a1735d01df47be33dbaa3e42ee313b5cb8770adf230f0f5f68cdbc17b50adedee2a2b1ebf9e97dede7911f340b5d667735cef2e69b5dfadfbfad95395ea79cc8ba3bfd51cf74dfd5f38edac2bf137e41eaa81ca93e95f1898b6dec054144c0a217b72086e99e4c0cca49502fbf6df9523df46cbf23e979d3a9a29d5e681a36e4bd59cedddbf0ebaf1c2214a5d70e8ed874cd5479e7556e8f91e4be2d703d5e446dfc1fa89d5d837eb275663ff265c87f5c9b5ec69bd9aef68cb9adf8caf3fae33d747047ec2d75eaca3a0f112fe64e395fb4baed370d078057e1bfbaf373b39ef92759a3ebf66a9cbb076ce38effed18d94ead3e1d3d7fbeaef9873f1251f1c8075596ba28135871958a38b81692d0d4c81a332650de7dc667806c78bd13afdcb020bf73209842936118eba0686f446baabf3c0963d0af4c7685efbae2f57eabfadb5aa5c6f1375b6becd3d286e47edf02755cde84d61d82ea68063a2f4003670f7e1eac6d1bfe88f66fa5df1f96e578703df6ce03335c5fb015327d442b7717d0c5f07e0335503baa27f3bfa7d703dd556ef072f2aa8b814d56a1fc9e30e47fb11f4495ee9ae4c65e5662cf866e2b961e0234e54011fbd6d27e06b0a7c9d80af03f0d14c29efbc900a0ff78fc47bc4f0992765ee24c787163a2074627d2d8934fa7ebfaa73de53aac1a9cd668fd75f76f6e4f1456bb04e426464a6f5b22f6e46640c4b1a1429938b3ebd214936f9bb62c4095a18cf856d87eac0b892c6058d6fcfa8a3bfd0491f759f32448f2ff58dd49ef7df161d5b8b669ae0591fd17a404dee91b09da146b75ec7a8814f5e785091d27aea84fb6df45932c177cba4f5eaabf94df88a701df934d6c175a6df83d79b771d058cd742cd7e9564bc8c8ff717fa7d766cbc711611acd35d23415b2badba692ddc9a2db59a1c75a6526df38f742e7d4da903b6b6fdcf2f8d959aee7c3ff44f387db0aa8b522b916deb1903391b32358a8807c9f3852314ecccc8b7a7ed25048408076f383a2034a776d71b03e7dfad45c69473d256bfb0c188e42197f796222de9fc5192551f70fd8035c35c87855318647b80086c4304865fbaa6fe51c1d29ae253e598bff7205d3089f401b6873e166aabab6812ee043699305e7eac075f4c34cff08c7b2497ae9d82f708c7bf07eb8c7d3699009df94861dc97aa03a9ea504215219d120a770d2189aab8f4939a3cdb6245a69eb9d1151fce1b0e0e8f0f875cc0020302dd7bdf15b8a9985707effd3bddc20648d5ab9bb9e0aafe8f0c6c74817eadfa873c3a7cb3be666668f529efab7895615ef4e22c43f6f4d73d241e2b3312f4bda5b139f6fd73cd75acea01fe242a2e52a15a02bf5c5f36f0fb55509909c72b55b201ebdfa95fd5c4ad1d5ef665c95b6b3421dd7adba6d396680e7d53ceda110bde50aa746151e3959a23af9c59317bcb1dfafa6b9c196e6126eb736b7ff7bcb06aa70c4cff207a86e446d747d88c6fb7a9b8d0ace3ad9a35ced0f4f2f203569ca319df36fd8f7c60712ba5263f3beaad82025c43e75c8617fab265cb759a8bfb07a21f062cd8f9716fbb59bbfb013bd96c037c711a2ee1683af0bc871f76a58fd4c60f3d1ce5b448b318c1bfa69fc307bf39e8fbf8bc3f22789ab91eb6072b99df3b0e7e2b76f00fc558c39e5163215a7d026c0ffeb88d2077601bff9a71260ba4ea6e3849cd9d780f7ee115e6ccaabaccdd90eb87fe79c8cc864aadbdffcfe68bae526acda0a5c3ff68add4ea17ffe8b57a8de6a41eaaf9a4ab02aa734b83a1b58f566affd7db4e3ee86a7d70dfd8b2fdbf062bb54fc3c60ddbb5d3dfa379ca996ec9d5a4de31dde1b63c5446d4ef5c5b76c182579fd1b2e673adaefbf89dc5e637aeb8478593088a8a87be825522f7d04e7bc3000fbf71c4009770fcdfd17d521bbea454cb21ad7f1ddd595ff366e8f9c30e57c1713a63b15ec25c02d936d761ddc6d6b19721925e81e85b7d183fed8b6daed7eac61559b140432f0321f1c7dc7573dcacb745ef6f6a5ea80fc4e55f2e7a69b2e6c47f7de98733a6d6536aca41dfdc5290a7bfc5ad55abd84d5606f8496fa6480c663cd861647d2d9b1fd7bbdb7f0e5fa754bb538efefc0c2db9d679b941fdb6cbf5b778c03a3e5a386a17bb03fbda58d5d775fb5d7cc3ac7e776e51eae5336f3eea8b4de64fa5a2a433ad5b99769f0b49492fae3de65df87725206103a4ea216a146ff2ced737acd422fd41e9435efe4599051de524e48296073f1f5c66830c95077000a71cecf76e8e83ee4680d4ff7a321225c087bf061efc7410903b305ae28da982dc13e5b8c5bc946e28deb24673d4f3ea4c0c0dd784e0fbe683bff9596fa0d5d72f7d6333158612f53d387d3b6a8d5396504a6fedb6167d5bd7ab7b8e52e7bcf2df3f4f3f5da956cb3bac38ab9652e9e7d6287439eaa407e02edaa0ce994e5d371071d8b503be385faf8fb1e3f31f5908555409d2c9134129439c0913124adf4f8404f1249c057567736e897202ae31f5dc26b74c724b1db71b74ecac51c7baf310fae9c48a040c90747725c9776e124662bbddc1b7bdbeaa1b572423c683189f8ac165cf6dbc4da985d7ce58f055b152931e1ff1cdc4a795fa6df5d4f6ab90ec4406e8518132ae8f416eda14f7438444e654132d9e31dd2f2da37bdd7e4a759df7df534f0e6909e19e8ebf5ca8bf7bdaf1351a377a396e3e6cf1fe3bd99cb39c7a6e05ced923279c7ce3c74abd73fb031b23f81b5522a4daf55cd256961afecb08c9df558595678075b58121bdb16ebbf9cd87ceeba53fe8313526bcfd968abaf5b97f67cec812aaa23c293140273b4091c410d589c689dede833f99aa882410c6b773aa22bd308d57978c1cdf5e5591e58d1c77d63ac32af5425bb4f59716233447fd66e3bbafed7fb752d3fb8c3ee237bd708bbedc34b518151a99c381f1984bcca25f8eaaec1528454b2537ddeb378f5957563c52a9a95bbf7d7c96e6a826ffe7ebefbed2a4b0ed9d47ffeaa67ea997d6e08ab6e3310f99712a8e4ce1d5b593eec0d642abcc5561367ffee04f9b0cd704e48921bf4532ccdf9c568057011600ca248f74e05056541c48568f1d1991f2d999dcecb919a587eeefd68fc97eb1fb231fd5d0bffdc76a71da872ace6b891816cc03ab8cb08e07324364bebf543d92043250ee0be0cf11f8c672df327d1fe1b0d1033ee10e2cc7db83fbe6793d0cbeaaa72af34a4a94fafd8c19ab877da1d4bbff7d70547f2d234fbef8ab4db3f58e5c5bb4a2ffe697cc83b9c4eb5b80587f65afa30fa373199548461d8d72147a2ba3f5faa0171fc337013521da52b5614e895eafd35f1a3d7cde7e9a905df8d58523f4789a576436700309eb7769bae4e0befa2cda907242ad1be3e62373e70889b5c02a73d741d34ff77ff5d4a57a9fdcd430ebe71b949afbddcf43d7ac35d7500550525d39229e890904fd9e011801cc15fd5dd6fe6e1248c400aee075b35237747b3ebfcd377a6237363a61d299fac7bbadd16e52c26d04fc4989c136d7414240dc86255545317c36ee4ec68199fbbb5b9068a80c545289c106be3eb8cef31ebe1c41313ffd3e786ed833ee0055515593aacfcaba2935eadc7787f4bb47a909977d3e7c3e361e979a254e9b2ad1d1ef540f850a3f550a48e9d9856e96393a8c9c0b6dfda8d48513ee687d8216cd8f59dae53f7777d2bf2d4d9d58bb9f0a5425ee74c4fb18157109c1f7bd06e75ead8fb8e127bf9e311df51a88a32b46019f12a4d12f433d06aa155e81b4e795548f4170b6d59644220690249d728896a47f7a77c8bd5a024a599f7afc238f6c53d20d9b5f452068966138b4bc9a4cf235f8aa8d9fefc377f1ae2f9f4a96f0fb23c84dbf8feeeb795bfee7c21a63341c76efab5b3f5daffb072e6cbcfe7083992bf15124b7286d2cd723d50ce7f54b017bb2467eb28c0311037c9549e3d66d14ea03bec109cd9ad49ea8d4d5573e3ae1cac54ab5dcd26659f7598a3520bb4a82aea85f3ee68f3fb424b2f48153bacf566a9e3de9df2b5698bf95922a966aa6a3e473b9a8f4292b17d2fbeffa54297f17021236800f20fdff13979edf387d9852c7adec963e417314d69fd6931d37051f983e559114356163d0c73d490c73e39f99f4e0f7e3b381af0ff04580af7a07bf24803652a3f44132c5edddf842b73de3a631cdf2ee52ea93c6cfdd3b1aaa18b92159c280ae953938ba4e88ca95e00cf94015aa81f8f89b28c406e492c07a639ef5cd75271fae0f9070db8b173ea32593d0d050abf474153bb0923306dbd5b65ebfe9a969cf2af550dd6e5fdd081b4411fc758aef01446d71d2359752adf0190656a07ec3769776b50de075ad19a2ff1df97a8dec0b94aa19aab5e05b577576b26523550e1152dcc5eb2c12fd5dda32068070f4c43af6ad273ee83df892aab8c2162490c07d66630e128e57e29f7ac2b757bff186261ca7f55f376e9cb9900e7c5e8fb40e2149706df072efdfe977b20d708964590a99321088e49c7c70d29b813521776e82b2c22895aaa512c22ebca2cb83a373f4fd879f9c73c15dc7e87b4f0dadaf556bd71192ad6f6dec3646afaf87e69cbbe946d42d625b1e6c24bc4e69de683ea87225a9fe0252faec7cfb9ba8b0d8cfc136c03d80ce2feca52ef9440ff1fd94e76f724bae5ae200cef32de88ce8ef41816d8510e46c480c0385aa282f89c420039cc83bc5a72a403f2f89c4205566851489ee8bf40e1b7c811c690ef045c7bdbed39fb9bf36d21ccca2fb8ffad02deeff917ab13cddcc2b198bcbc169978283296d6e600912c2970212675e8af8891294462dbd1678a02220dd6c192a0c92caabe20a402ac1aa39a30583a62d5ef9b352878ee8bcb4566da5eaded1b0ede1876f635ee43c14729855a6aa464b9f5aa37373fd9e15b795678ed7846cf107bf46d6a1146c15545a6484ad5a642097ee251b086ac13b19401a01b4459f9a19b92710f09c277afe5a477fd97d7bb71a35da55c9acb316357851c5af337a2fb96e131ff4d99040a6601dcb08f2c21d8c201f8bb7f207d6e6e19dcdfd03b71d41be6ac592d1131e53eafd5bfb8efd0405ca985090ea098480243eb249955c6a2011f492fd005f33b018925ce9ebdeeb48b55586380a7696c0f398415ae01d47051dc02875c00c962050f112f82fbffff0de6237a5c980e2d77f7a422fc68f0f7dc7cdca9d7246ea0d510dc94e7a19a61f59f3d24c4dca67341d73d5fb7add6efd65e3c072a8dc58d5da4af4096600c2898409461e60c1ce8c2cbefdd504c436c08224c4a947b42879e2fee79dfb8a1bc179acbafe40d7b81b5be019d18b3244aa0d69632814077f3efce357b3ea2a027c7400dbc0670881d4394b5b493e0efad56a35aeeb0e7c99786ed8e0f3b93ddac0e77d8f58a4f714e033f7c7085806f0e5019fe760a9a85976ece62395fae0fc479feba739fb4d83d7debc152572cb5a0362a3968280d0c62cc5c62cc1062e25633371e42030c4f1947d0e482234085305e99c4972a11c5504e3921f6e18b47aeba29a9a839b179e79be6b343e3e5437bdad4ae40e6ae62933e080ada6ada466699d92f5d395faf9cbe1c3676ec43840302a1188286bb257de803e15bea20d2b39b93cf130f4793deb1575d629d72fb84413e6d0b89443aecc56c111d362ddb2243110fa8230f74d1c43f700062876d0db1815182069cba075c6712079e87b18131e6fe1b619acdf3bcd48fd5c33046f1f73ffddefbb9cfbbbaa8a0f6c405a37ec6d4484830806312eb42e014bc1c0903344d97c014108ca6003619b1d313242455bf196f89d246d6133a93c0050a8ca5cdb44e1cb733e5fffa9668cde9fb6efb7fabee346749d77c5026518da4cb5d336bdd677776ce1aa84c7f7fbfc9529887be375482a557272c13a261b1fdb4cc2e2f70cc0c88e8c28befd5591e8941597bc5222068634cf7ecb3bafaebee61cdd39441d7ae227d1c931db35e2845de0b447e4e810f4c3c647c6b91011d14191b8dd9d6b70dd71c087c8718af4c6f5b148effe5e7c88aced8dc86fc493687ca79bebccf5848fc6ed0445bc3b1cf11e06be2ef1f835368a1c0f035f6fe0a37930be4139ceab6e65bfc8531f7dfaca10a59655fd36721d365cd9930612612846a9dc22d468dfbad5c0cd58685bde411f46bb2dc3011168b7159ce1d677bdf713a1da32d97bfd162cf42d5bfdf8e776fdf9a56573f4c61b3cf5babeb7e81f5f71aadcc0285f44bdcd11efd17e60c4fb52fdbf6db4fdfe9571f0197a83d568576b582dc477d4a801888324fd7103d31e3530a591811c094c56ae382faa68a38262367e27abc4214a9ddae4caffd63c4ae3b825f58ffb3b2ace701018312dd6adb20322b29109212ee3c185b8cfec83ee02ff106f4436e3ef2ff1f3bef0e08bed0bef3eab6a52f953e5794acd6c1ab9e25dfd5ddfefdab7db276ea4ff494e791924d3122419245521af3fac9bcd38f868dd31440a90cd20f4bc4eefc2fd19c057e4c55bdc03f019ef7319c206567437200ee6a25c2fdead5827bc9eef0c1eef9203e70efb73b452f35e987865ef889ea78bab3e2b3d28b65f7734e27ddf9456196eaeb32bda3f38258cdf6ae3b9357f3790322ea483b14b23953145b2938d87322e5060ec4ed7b0ffab24102ad94a91e4fa052f19727faba65b94aadfbfe9db23dc83a797ba3bfd9aa8aed71b28950f01ac2b07ce450f6e6b2422519b627a6c4496f6c176ce52e746fb03ac6bcc7588d4a52cb85d832265a122202fae3ee03bb3a0721a600e7e7dd56a8ccf5c5f2802b2a67823c735be02e0cb00be289f630dc5676d2a22c70bf1dea4aa9b622270d71cf3c7d953f2941a3af4d99787c36ba87c8281a53f195832c8c06214f72fc6bc17a3c6753172f41443075cbacc40524995d507bcc340e6d848558583b61235b82b7f01444d743676fe6c60552dc0364a4d2b1cfde6224d584e9a77fe39c7acd28b7f6cfa99fbbb78fb307f5f807930f31414f17e9c8a92376b0d6f0f0fc797b23c35a59eded035fad61ee79efff35e9af8c3f20f310e4818aca280a4547996b7cf7121385898a32386080717b99f87862a754ef39e993df503439d530a2e7b38ba5e282ec7acb37e14318d754a190d060644785304f9ed58c773185f7fdc47fbc01b91ddd51b91cdf89bfaf09bbfe71b7c7add25de174d745f73c0d30b472f786ba652c3faf69f301611d5a412225512312ec590208a0ff1fe5e04425c82f92b012b504292c5fb80b42ec90b0b35ded9f9e348032bc138f13a942a28591e0011e19535c5fd483d52b9c97b3d49a695641b834dd075739fb6e9bb977ed7077cd32d07b499afc7bb5f8dccbbbbb859a2af52ff87837cbb22dead19d6b2d0251a5fc3fd5b1ca925e79fbf1f71f5679ad1297bbcf8d5ca2fcd35ce99804f611c2499d40624f7deb3bcd0ba7b5b4fae4edbd304c43680371a168e1bca9fd3e3f2c9f71c1755651c78ca23d183c190194add413add0c615c1ce8335a1bec8542053505a276368c7f6b025505f4414d9f5450854205350509304817bd06c748863062c6540819c097077c5eddf6148e1cef67ded7abe28a534944802fda9fdce2ab8f3fd01c73c1c8598bc95b83dc134bf17dc958cc711001360ef23b972a804a703a643cafc2c265ff7bf27e81ce9503bbe877481eec3e4b07af79b368ca86c337872fafa3dfbc5eed866961330f799887c4aa14a9fa198803b829ab6acc3cc90dda4ebdb55a4b6a135f1ab1744643f17e7440e0e0280701a434f1bef78384c549ee32d01fa8d4c92bfe2fada626e8cd171c74f4604dd0adc5eae87a87a96da83aa5bbae2fc27b2cae33fd42a4e6b0814faab8f2808fddd871ff40815fd812797d06a9b8b02ffef8e8b795df2ed082cd374fbf341c3c35db384855059569111815b661d07aa4f507e330a9b0c81b8e6d16a42225a3bb5425617d914a92fa52e5e88364337857dc87dfd918bfd8db27b75a5621d1df81d73dd77eadfcf197657a5f1e9a7ed2bdeedfebdedaf0944ecd12a8d6e97b2649f1136a98b2c1adefd2b269ebc6abb5a435a5ff372fcdc7bef515b27a578c5fb8fffa9c3f720123db1a41c2516def0d3bd9c280b601aeede3d497af3aa3f624371a37e5b29b5ca138623e2f275b8b18ef662dda9bbbc7c0dbd9367d279b974314ab1619b3715dc4dccff8cc53f3595560fa6370bd6dae8fe1431f2a288daf37f099e75e88b0b07c88fa0e9e3706d793ea25dba1b71e037cdef788e1ebeee93bf8fb185c6fe37ee0734ead3add354a4fedf1ed01bf81d3abc482218e8c3620e998894094d2c6a5dfb171c9b8eef3d612de32e4e5213939f93b491ed2ab860e84b236b1f1fcba6cdccddf552498976cef3cd0f7d5f360e33aeff795f3dcdbeb6c5cefcc065f1e88832295bcc4c8bb06de3629a700c2d84e2a00cea23a36004600f5baee70c8095d2f7725b886aaa2c5e5d1f119956304ebcae175dadbfb5ebcce8cea13aa4e5a574e2cd9a7c127d76d84d7ad07bfde2f89f187197f18f7d9e87bf1017fc594b2269b6f57ead3675ff8231f9204af0f923c28821a360e22144c384812811b7531181bf682fbda8b870908d924681d3ee4855501859c92c14a799face3216c22bcafc896739f78dfb880d5813d7b5ff4ae66982a9cf26e2baef79f3b4ed877ee6cb3658ce890eea68fb736841ea8010d433a9c64d2a07948850a96d633953be0e4a116908505dceeb6a70848d8005f1a63bdf1da743ceafa735c9bc7bdce870dce8beafa23d13fe6fb0e608f0d20688113e1f06dc87cb66d40c5e1fd8071f8e8b944383c07121f6844382ef4967d71c2b81e3afc0404d06bcba071e78300127e98be9cb0d7564207e6d6a337375db244a9cd75d6e6916e970f6e3ab0c9ed91bca428ce81bcb1be155046b88a8d042d79cc2d50787f70c4bae0882a094a82029597bb2147b77d7fd992abf53d7f547de21e5071071de6218031c8e6f502428e79a20d2a0ed89a7dea3ed3021216b969b2dbe629dedf69e35962e3791dab63d00ac5ae0bdd9c72e19557c6addf7cb34e785df9d6b3785fff3af0ae2b1bf87a07ae5bef3aeb2df03b9230739ff685171ff0ff366cdac5c38e526ae3b9ab3f2a426024ad17f6c6c3fa222f3f22204438a43b2a7b61915306b9ef0232c1a0f588a3d657bb5c014a092309a4efc7c668405eb7a2e2a06f9f4982124710d7fcf78f8e9bf47a5e7ad2dcfb5f7831363a870877f0f7c3f7f7b6f4949a8bf6d71272b78b6efcace306fc06c291960638de406688683d932d4f9ec339de79a87edbc30484250f827ae02975d39a5deeaa4ae860204e2996fedccb710651ee086f98ea490cd9019c1d6df8884f6290f8ba039f314afa2506410069dc011c1e73a8c0cf1c2aaeb7bd0766c9775b8e5d0d5d3b2f74e29870509743c72f37b8f4b7e7d41dc489112442404799024cb6216df4e9bede5ebccc391201f92e36aecaf5e567ba49e6f43cd8e67d933006c449b304b26dc6206540ca43758c1521162846101b8ce302c8f848128694402ceffbbafddc471efbf2a0f7f47f7f66159d70a28aaddff6db96a8e3181471d0f33a30d7cbfd21d759d0bab5057e264c5efc8e9048085fe996e25fd7e81d34f2aad7978e16de75c49933a322e269386e81240bf2e6a380385a8fa2d224c77708ef385faa124130e479930c26252c63c43868fd0a0985256bbc0f4b54fafd5fbffcae8bbee8a5ffbb53c9e639ee97a3f94ef6fd025ad665c73f76066c364438d24f479f080849d630aa33432419215bc06ab73d444038b2dcc60f7ae0ff19786b59e3c67a086f875e3e6d5c8283df262f10c17186bd077f1ce50ee3fec41b32dfd4dbf0a98ac2e2e0f7e1f31efc3e89e142ce94047ce2e0979c72108717e350b11d02541138302b0fab7881381f5ed82232970f68caa123fddbbff35eef13f189070ae30d2181547b434a4985f090919a601c47e76439cfb91baeda8c0171ea73aac71884ce4dbdb8168cf84c2088609c22fab0154909440608c6ab06ea0e69f8e1c5cdf4f3729c68481e7f771e1fcf02adab30c68bf715eb4cac03de0fbc3f707fb275db5be077121366494808df6f1d271ffde51d9a7119bcf5675285922d82545714195d2adc7439829a6c6c227095dd67b11e39923adb0b791d4a421151bbb6d9dee7480987f6054bd8224343b9c8ade612ca8ab7cb5bbb9258c1f1b346bdd8c8238184a330e8fb0548248ddaef777858afbf9aa3ea8cae09e7149640004995c51236ad6b4948f0be2c8954bbed6e0212167d22247ae0fbe6b652e1ded1859b937a9af21ffcbd213148ddad14e9934b0c36f099fe1ca12af26f181bf70571b211830f84638e38f8fd9c7244e04bc8e1313ebf4aaeb7675e306e6774551a1104aaf92d0fe440af932aeff5b2e83f46e613edb9804d759bb89f555df49cb8b8108697a8d9d1852d3794cfb6216c25edb1ed831903d3bf4cbd4ea2bd45ba61824410481221b7dd20c923ec85eecfd63ed69da7a62a1fc1675527ad03c7c75044f0be5ec2e9f86c19065f6fe0b3036c4272ddfa6d7c0909b364809cb4aa9aae0a73c215c3f22691571ad61b4bb6a4c221098402048354a622b29c0907312e42a2e0f54323dfd32d2c9e2ffa4ce884244f048425134d5887b67feea748445f7b61e58d9b7ab9124892ef1770aea58c4f5d52af9e52279f7ee9891d5619fc8922e6a3d712630442224bebfa92058513ce4282b6a708886d403cc796124e6f1276ff1e2c721b892189eed67fd004705e36faed85aa2899c42074961ca7413ae8f6e2e00f9018e238633c3740a72d74ce71f3e239306b0eafd3ac314548d34623ce883622b2e77a0e68e5cf19c4f7670b483c8fad76aed1fd11c08003c21d57a867ca93fbb9018ec96c48ac92c168e7409518cc1898fb7f549d6958216268089e2c7e879138d0681ec7109d74f88517d47a5a774684ba1d7bac9fe0fb54a7ca67c4f67ef76cf1be31c6cae00b92d08325302ffe00159a648036e5af7d7bee5ca5d6a42eddb889dc59c996859964c201c9830908491a4438a4c421555401eb62b7491adbdbf0fc404282f1cadc5e2c91e8f75fbf70e58b6e2a9de22bb73c3eda7dff64df4fdaf48426a4f5f48ec38e42bc4cda69064a02c292086c213e9b9e90acff3604c49294cdc6ef7ac0564f2b3fdb51db10b9abadbb355803383bd61153e0949418fc2a02efc1ef0889c11612c31c71f007480c719cb1c0276d3e42b20a30bad79a5d77c6fe70b365ed3f71f6b4a08788df09d2060d63066cef7dbc5109ee6c8b88e7d3f3bac7c673d8f3d94fb8de24d689d6fe51afa56436a4de4222a4c0ca648cc149ce0f3cae3802108524c20b49434a1c52127161db099d1a1cefaa6a1e721e720b07c5a98ccc78a4ead44fe8bcdfddcf4078f7436fe0b305839244028b93e812e277c22ce144fb7f7cffdbd39310a0c792ab3022b37712110ab26d947baf9312b12f0d7b10e1f8bbb58801bc5f6c6f9f35024448a4d15d1394b5f5ff78db4d5fef24fb7e496c7a8dbb36afd71199154855e5231c9040c8d6e7b3e9d1391d16fda46d4fd940e236da11b79ed2b1c613bae3580bdbb846de40919b8ccd4215954c55e49718c2069f5189f92406bf8a200c2cf401c3f837b1c4208da30112431c01b43de3669db6cf98461bdaf6cc0bc69df24ada61f5672875f0594774776d499e16069c1d3f23ca4f18007dc9e6226af7348937ce1faecbdcdc338f776d1f396a4cd436d17bdb8c81f4ae8aa926036c4834cf3fa893e8f13e49428af6542ad416bf87c5ef7a5da716d4d81a2da11ca4328a79d9c983c2cb5044844a23c8966133a3e55d678ecf2d97f079f1fbdc4979bf918413bd7ec66763eace6860de93549e32b961b928cc452a2ab6bd05481c3ed5540430acf68e1631404a2444109940d2bcc5b9c78fb8fecda3c6e8fb9d39cee212d7bd599e13f4fd82dcb8f13d6b85eb763808019ca94428c8e6417d481e6cfb206f2ccbfb1edb9f0672771110db0be3b35e1edef594d5ae88af272cfa628e4c11c2a93fb84f0bdef02732450871febd59e4a3dfc3660cb8bf3d19abc575b1e786f17b76003e07f8687c59c0d73e009fe31db7f73d742f5be033d7b1e4e3887951621e0cecb2aac7ffae44ae1e2b02489c051608ab64141aae93dfc7e795b19b1b17a6d2e3a9b1b4f6ff32725deecd09b94654e6cc28b5c91831affeef6ebe476f25e61990f0a92ade263c5fc22b25c8b828090c1bcff5fc8516855a1dff4dc2ef9e641d38def51c4be5e2fdeefef567fad9bef52cf6071b6b3df883d629f5cb6e2a7d71c3ad4a1566cd3e7035b218578a780f361207a9aec8bb0a84c497351707abcf38beb7b588012c81e03d581221c98b547f7a5e1675fb25cd75ef2d7fa56cc4ac2671eb43ac074ee9131646757ce7d0d1a96fd69ba6d43137745977e0bb063f1bd36113a1d43c2c919024229c4868bd57df2b6b4fb9f1da3198767ffa8ad6cb5452375535a79ade507edb83b95fda1ec80b260b7caf9f53a4e54b9c3f9eeb93244c9fbcbab2a04a902aae00e3afcf1b4672a83e7760c1910a91b6fee5cd4e3e567330077d7ef861248910c1a022fd1c0847c6e21fbcd705e940a568bbcb5b87d87f3efad5c53fbcad09e18a7b7e6f7eaee678abdeaedcb2fc031533e6063b2598fe6ccef514bddea7e2a2f5f65ddcf393799d5c24fa76e2cba22ad94bacc1adaf518924611a1fe5f00a47fb3e6f3261bc6609354012cb4fa2e2ca162a34a9d293fb4d792595d21fb6beb70ac659e6a885f3057bf38980be4a59a7830ed63180b4d36cf4817faf6f1140db00270c88f7f505306ac252f95e45ad684a9d00dbde36545ca68f73e2802bda95b6844a9b09c3235e9822e34072c4b8abadbaa2b6bb084838713f7a207da886377c21da8db8ff385295136189c11b0712e40d15e055e213eddb8370f046164671bfedc17bf0cb0f7821fab369c30b1597cf5819a0daa0f7087007f6cd8b50e558abadabdd08d43322d70cb81eb98178c1502435380e1fe7418485088ee0b477dc3f5cb4b0f739d4ac0ee2ba8852af8cbfe5b309a72b35acd5802da7a52b555cb065ca2837f99d3f80903690f9de8231f0a9b8687d9c1c6373f9201bb363ef132ffa3be3d49f6e4df3c008f22ccc62f519212208def725e33b656a0874d715ef2f55be315b5fb667bce8177fb965161390002f3f8ed416ba7e261ce48e4bce1ad9de799307ee3fa505c6a9e0f77842527970f92b7fb409667c7cde867e679c68bf76ee3e87d6ef66f0fadcd3699f13e328dd780318c5e4b690dd44406464230f24a2ffdfc87aa5eeb32ad83d514a0cc9bca102bc4a7cc6f739220e84f8032931f88c974924862c1cfcd59418a4118c251f8a0311fef9810788e0401ad46e36a8b3dec0675e705d8be3906d348544d77102e2772634b4a04842913601fa7ed575e30d0346bc787c7d3be07efdfba4efbfba7afd7aa51e5970d1c33dd728b574c86f115bbf715566d5668fce988c8d823108f46a1a1d934158071f348e8066253242663a6fb9b98a826c67091897c4eb205904b9f4eaf2d90e03bcaefc715684afb767bcd86f1567971d45190ef840146edf4c508860c80054922cc2b81f045b1ea8ffb81601b40de0f7264984243a4d982bc655348de6b08b313ef4fd480209c7f7f91c1212657ab79abd6a2379a2641019d23e972a59a9c2adb62d64777b618983c2ed5bcdd5a6ba261bac38a805a58df9cd4b8e2e0c9cde835fc98d27269cd2c0c754455e7c81c64b9fc4609e4369c467e3e0f7abd01273ca4111ef2c81046c787980080e84f01dee648fb9ef78a50efd39fbdffb23a92245a2728e9c53bd90080d1bdb607cf3796b501a732b09140b91346489dc5f3d7f171c4f3cc7f66ac3db9efef8267dfe37fae0b6cb5a2a55fa7bf1dc052d30032a8e3188cd4b62c6e014e764c61fe0c6cc0740b2c4dbb69ea3d343f3a2f3f3b5da58d78d700f3266fb559d89d781dc0ff2a08f88f7150c852f854e75256ac7eb7d18aa9d3a9e722c51524c9f719822c3a91f14318ef92552c52da2fe99cd4efcb3741a70e72734d46aeb468e3b01818581aa582151a65d57f3813af096234d4248a8ac7dfb4e3a85a8807e60db535e5871ba6667b8dac74d02262506dfc2ce177efd82a34ba02ab20dbe00551179e9c45445369e6b0e7a7fc47bc4834f72b273e0d545f882536d78c61de856198b440f9a9731021f1d5076fcb8adffa64cabf38c52279f7269b8572f97605b1f51ae9cf4c70c247f714e79400405120a1312d2a1caf80882c2586f89bfb32d46afb30e734e5ce91af7ee993be8fd136074256f11a94a936e9155713af6315d060f5eb850a917ac1b9ec81da8d42ab5b4d110378dbd6d948a8e7f9ee9bb19acdfc5bcb0d81be87beff3989090917f1b6ddf469923a34919f5735252e3d69b4cee392489aad36feb0be33a2f23e424b399057af379f0fb23dea96ff0a594a40ea0d418b8d39ff283084a6ff13bedd86cef752ce94504fca7371b30021836c09daf50b7d4171acc543146437c3f474a94010c66ca8b2947a4a19e8db471b0338d545d4986ef6f63030968d101df84823481c911e9a00fe0907654554412c30eaa8a7c9c1db903e7b304b243124360f6e1ed35b60ae372edd7ea571d7f9d52ff6bffea03cf68cef8a0470fcf6b028e9ab27846dda9555c364f4a8120090ad94e3e053c59c0bede3ebb11ea0335f79e470f6ab6af5217be7f47cfe177ea710da957f707bdeeeeebf161bd9b517889236689701141c102c74cb091d635de6e7c6bf51ab7a0d50bf7fff7b867f7516ae9a6f96fbef6a38a9b67b13e22fcbd79c55410611211f17c1052c11d3c5fb6e8c62b51996e12459f842ab3eda2c053e0fa0d625c826c39d54da1932cfbabe46cb1ce422f871e6302922de6c5d9f6ef3edb19416a1101ffa18d096902c923da22ee9e09fdbbd1ccb8ef279c26b61150eb6530573a875be64ebf8a55120a12f9717df5250ed9f63001719b73a953e9be685255114b20011cddf6aa8af285c4b09daa221f6737872b12423591444510b4c18372256dafb135c0ebacf63df51ffdb7beb27b9f3b8b3ffe48a9cbb21f6c71b616756b1e53a77e2d14a2e1b4d0e06098a0484905f50758159600b66f77dcc9356b2875eff20f5ebefa3da55aed97654daead176dba75f9a9711c7acd2db5ef7b7ab1be6ef0fb331faa54aae18cfdbea959d38b8f0809736c58091cb8462922ca947a7551af05795d959a3b64d2b8c7f473aa52aace8f56aa93eb23ce599403dc44723c964c3ef63e97ad7163e2c63551dd10edc7387a8c56304843b0fe8224deed8d200f60841c29010bdb6102db9097b3c5f7495f5cb369a35f94b74504b4bd50da92feb1368eeab648403f6c803bd3d67ba1371ab905d9e8fbd9de73414a24b1ef89fe183e1fdfe1e74855f1d8c4cfafb6c4110efac39e222011c0b07ecd9e8ea974964c55149c1bcaf4b7575574a19018765255a425101bf88424c5e3b13de35662dc3eaf336527999788c0e7796ea0d719f085ee4c9dbeef254a65947578b6df14a56e5df1dacfa38e55eafa179ebdedba6b953af3b46b1ecdbac9f58cb2eea6e46c3ec2d2d1c03452856989e5daf14fe71e32541382e68316dcb5454b1a23efdc34e33ffade4b6a5ef6eac5faa20daa5f8b0509086077f5b0f58952b57eabbbf80e7ddfcddfbefcea174728755adb2b27646418fc6ca379247e06e38cb838f029f2d9cdbd34a8a1fdf897472bf5c519fdcfeea1f194d85b87ccbd286e5e4e5227d0d1cab98a449c027b191101210e1bf771b3f56f673a515f3287e27afc9c22492059f1fd9d8e20af3e23d43b1e9fe3b70d79c78bfd5763609d06075ea554dd760d66d7385d256e610145dbfee47cff9f34db0097910e2d0aed9f9119f7fd64260c29a106e5505bed4ce5cc0ab6f739b46f7c0405cd2791c8160e7a913de4c6ebb1faf757d1c2ab811c17896c1439bebd5959835445f94262d85955d11caec54ec64cafc4106cfc4a7c80ec2eafb3800324f476ea0cf78068b2aae5570f684ebce331a7b51e3d5a13821b3e5835f559a5ee5e36e8fccf6ed5b0c17b470dba5aa97bf61f74e23b9ab0dcf7ebe0d3bfd39cff83ed3f2e9bff9a52cd4765f69bac39ffb4f76bcdecfba3722bdc8d3a68d0361803e27845e478ea88b4ab8ee9a4d489adce3bf5eb12a5aee9f2e481ddce3133215332d00620632d491214c0e6d69b987cf857372f6aa5d433b3af29baee0fa556b658f2e77b99ee1f9de3495545d961298b2ca71327027201be84e3851ecef27de7e1e8fa664982be8b773d680964db043fc03dd3a7ea7498714119017a5eb519212f3ec9d9a26fdd6fddefaa140fc9fbf78083969a2b2cbcb7cf3946e8d4abad1a49f6f7bdbcf95284c44906976ebc7fc97eafebff3e2b54b3bd5b2297be5f6c1fd3f7ab9e44a9544c0209b0552675970e57efbd626d4fc581c435bde04d8a3a108ad8c16cfabe485b8ea0c5f5d9c2c8e888eb6291ca38b8189f377790c3d7399e71385e4ec09191cf8c4f65019f39a81d7140cae7c4c647e3cef6cc837c8fd8f8685eb23df320df37763f5dd75ecc73e2f71011efd68a508d7df7d587f680b48b5c63775a56fa88b326ebfe55e9ff3bff7c7d88df90727027d7bdf302ebf3e697c573de81efebf97e32125b7e37f580fa639fe7953af084762fbd3c4bbff67f3fbb6a66032de99cf6e484eea8494eb61ab2b900334b1454b8c84d5a57d466d34d1b8729f562ee0d573fdb4da987ac6ef54f82cda308b5cd8ba8521edc56b9a4aa2028e46de4310e77b5bae27d6ceffb7823c8b504e29d7fff3acc16df29db834f46906751b2d1c075b06dfc0e7bf978f0cbef71f0811dcf391139add8cd1be706a707c7c1c801aa32608d088c99a15da07bdfbb9acf6d3da254eb9e1defbeb6b5fb9b13553925fb7ef29c60233b9d5b4d9cf4406f2a40291132c15789ff9ebcfd05361035ce69eb524827a6ca21ce9f16b2a1bc417eee7eddad97f30aca0d4491e3dd252716a022607c01920479c17417712001a266a031940eced94974e422302d59c47b9c7bb113302f633ce30ed4b5621cb37d1c347d37db332f7ea78488c067ee1be2fdbe41f36ccdb71ad4d647f4019ddbad7afc27a5eeba3d6fcad36729d5eaccac99f5a71bcc64c4a7c871527171ae262af0739fc6fbb17330153ae21adca40213751c2a6103e08038e20169e5b97d1021bf6a3540e519a0e2daee08f25841a96daedf40c95a79f153c4bb23545c8d6f6a7e44e76f95aaf57dbde135a0caf4c5179ce2ed4b2f3c3ea8a4ce3dacfe99cd060c7b61bc113bb54eda9453b5c4ee24dbc722c9a54fc5458ceb3dce8d5638603cf2f7a0ebb6bbfd1546f42aa18292221b2d6c7fa9583351a4e2aaee4654c2ab2be64ee93d30a58a20b9178ce1f08778e340020f4cbff192c66dde83031203545cbce1c5c11fe4069ae535ee27cb6aec4b99210b606579239f39995fb08d27e14267154d775f4a19c918780f4210c0baf51b2c3bbbae52570ee85336b4835267bf7263e611879b1b3820d2dcc111d09c0d952ae751b658cae1244aa99271be7230f0887a296c047567e05bab962b89c40efa00e3f81ca45a0950716d7704b92d9c2e02d6af13e4841140f0e5ba0ae5a60edfe75cfdca0b2e69dd190499250d221c7dbd9024134eda8769f37903fd536d24612f8c271c3ddbbf38a25d3bfddf2d42758ee8a5e2bcacbc1a0635461acb03545c247fbf1b53614942e2cb00b1cbe6fdaf9040945ae9fe938093357de985b59da562b72131187c31774a1bcfdde6c11f687b20afaeeee2e097de50e2e08f335e7a0fc8d9d0698b0513ac230fe0745962f0e65e4a5691cee7c61cf112eeb848ea88171fcf4bf5188318beacf87ed21af28231487d2fed8f03ae54ea983bba341d74b05257f47b78fca9a79a275160241d681caf40c6774a6a4715f5446956999a8303e412a4e4b086a82b3ce30c8bef4fdf4f38353852b21611c881363f9a87dec2e92228075790e41e90be3d88a1387068d6e0b310e94c39957c258101397e8824122228749062a47cd0daea1fd582926fba04a4f165fbdf75bf6b7b8b387dddf9915e57beefe767a4bceb8af6f1db9a8450135e58bbaffd151288e3ec1bfd8fd886b0a3bffb7243f90e603a686c73dd76aa8ac86ba5faaaa230f0790f7e123163f86ce00b039ff7e00f2e8065c78f5b73f8e80b955cb650150573ba112f3e6feea504f31211f80421f78e3b4112cade09e7253901b4812fd93cd3c6f1be87e4d08f57f7a78e57aa75f38ecdfa7552eaeaa18f7ffe1fa8b652e96003a74c1b99664012145f52c08f701dae270984655b9ac9eabc77b292bb3102ea9dd720e3b82df0f9253d2ffe18e392f83bd9dca77de961286a75a8bb7f3bcdfa753af8ac3fff8579a1b81de9ce4dbf73a0a89438e860b3f1fb6e3fe8f6500b03da0610a174dffb16eb95473aacd673f25dca63e7bf14cf0026f97e52a20c92fcef756aec799560caee41eb8b802491577322471c78ca2ab7187ce8e894eb8f3a2a3ac9615c6c9659d8f4ad81aa28da6f6a38737d5d66b45f88ebc3e67a8bfa19c644a7afcb00be3ce0cb31f880bf03e1b3fa015f06f0e5015f0ef045802f07f86ce0eb017c3d81af27f045802f07f86ce0eb61f0619cb6790ffd7e346ef31e882b519dcc7bc7e605ef4df39287f7c8e17930cf198bf7c8c07bcc51b9069f35c58b8fdf2303f8f2808fc61d013e9a071bf82e02be3c312f11e0cb013e1bf87a78c63d16ef8179d0f83281cfc6bcf4f0cc4b18f394877e8e581f63715f06de639c15496dae5403d5f4a253b424724c9b335a1e788052cbd6cf9f3371a2521b37acd958f646f40e9f5755d581808b0089b0a0067cd59706aa3c40f3c6d1755ef7a0861fb86ecd6d271cb3efbdf746dfdb4af8de5966bde8af81f520d657a1585fb1f7eb81ebcc3c58c06f03df409a67e0abeefa95dfc906fe42c69f07fc9e75d1ecb1569fb53d4da95f52239f7d3d4fcfd18f15fdcb903287eb7e1041fe7fec7d77605455d6f87d93425540042c28a189065054c4b5918958f613bb045d154d5c5c0bbbbaea5ad6c68bbaeaeaea2a2aabd8829505549a28b6bc8080080a0a845e8288945002a46732bffbe69e73dedcf3e6e64d4050bfdf77ffc8cd9d7973deb9f5f4735175a864348f005fab8f23d561a8d78adf66295055e80da84b54ed3230e76ecb7be1993e723c3787b6f61c183b2fd4d316db777cfe2cd8c7b80f6d687786f9136afdeff8dbe62317970bf1ed639f7df15d1bf505bf0992bc14ab544d715018ff84296bc059c4372f0eeff02f2181dc141d19fba790a98ab298aac8f37377d4733e4e595715906ac7a02a1a047ef84c5514ec4e6950150d82f6deaa8ad0c633489718a261c66927ebc6cc6d48c973a20c9ec186e48d3383a7ab128d1203aa4e32992a918bf2ceded9905a766c7dc405170a71ed930f6f1adf4b880b3bdd7ce771db558f30309238659eaa4561e41547242e71cf45fd2a23bddf5e6a9ec4ebcb6783e2b60c068f3851834a2350d5c9e6c946fc0d363380df24bfd9135dd70b7151cead17e7a8882ee31ddc741737aab2186349e31c861adbbfb5e2a88abbcdbafdbea3dfab3767c9110e3d9bb2f4d26745431a06d5e6b642de3648fee2b53815d67e2bbf800472dca6018b410299091248624e761e719c4a62f0382613a7acda7e8e2b36ad526250ed9ed036490c45206023a7ec001e16937c4683c4d0d30278d02e619c32b63d7836c0d3fb313a5062c806780ec053bfb7e9f738ead88f61008f8f8ba3c1f3c6355fc3bb484fb5469c743f92f4f2138e4bb0c4a0de5b0cdff72389908fb30df0b2019e8e77913e0e12de48803710e0c5be0fb508ddd9ea62210efba86b8f4b24679679e5296595770931f7fb8f972f9ca43a0882882791a08aeb55f87cb3fe3d969804d2abcdad693f4a0964665f9040988457049c66969a5f39bbbd00efb0d66f2e591741db2459dbe2bc587334c033ac37b93e70bd227c05af00d65b364980198047676887e1779da1bb1abe2d67b769d3ab54888af3777570e4139be7942cdbfe817a30b24ad5751da106db52fd35aa26d604254138fa7e73467547553c49618a9440869ef9cf9423d708d1b6eed0cfa62e96df75b386b839ea1248946a7c69fe98a4ee804408eb5fce961aa5ceba4459f68fcde58be57bbeddf4d982ffdd12c80b9003354862c01bff7cc9e07e5e89419892cb9923de7589617192eec63c4d370ff4da575e677b2b3170afb3e00b9e1a9618b80d29c8f81c0ef03a1334bf0da794b95754baf1236d9f397c4b6eaefa653acb05c6d3de87e03e15ce10696e9ac78add6e1d0dca863b8e05c61a8cd846af35be4f4c81b64101abdeb86af0d10695acdb79b463746c441e34cd3f3e60fe01dfa807f815aa3cb719dd3783840258145f565847fcba8ba32adf55c8727d9c71fba00b9b49d27ec888ce156336ca0fcf1135ed068b04de71060d03cfa1166612a59df87cabdf54ff61a4ee67ef6940f925bcb0268b0bdda51a3547c6dab1b6ef46427e00b383df6c5c56ef4137ca9f4b554491e83f93aa88671ff63676e2033359af336f01da6c5c1c1d5e925e6741aa4454a1e181e71da81c5e725e6704cfa0eaf16ee84b8e31c88eb64542d0e45c5563d2404cd942aa18c8fde54b6b1f7fe09d2e5e8ad5a6f9f218988619224f6554a8f79bef139a271d9e699ff855b4dafa8a32c2170dc8c1157daefe30d7fdf99b73a7f57f44128c39cba6ac5bf50a8c539ca641ab71fcd0cd9aabb2b0c6e71847ff8babb6c2503baaf2a54587feb884f28c8acbce7fb6b5fcecbfd6cebe7db5759c2c83c5d78703ed2cf85661c1ceb7daef6ab250c2082a688bdafbb2af088863fe2ada29dacffdde7777b32f3216efb8c68399080c5fd8c8c13178f01c6e8ca840375e741fd5e179ef55cf7bf8c1ef710275f81e3cc22f0ccf6569cf65b17e107ecc26e0f5177fc7decb36b8cdee4a47424691ca8c73e411c71e7e0a6f9bf00b03bc2c8007e34cf8f171d1da1e7ef49e2cedf7997ab2cc04f3c6c68f71d4a6c8ec2c46c8bd718e3d5fff7c7d6bdcf8787f42f339aa6efab8aa314b715a1f55935b300b94730fbc68b598c4f0e7f3a5f0cc6177e767b1798efad661d4303e0a3e839760ddf0f1373da7e065b175c0c6bffcf4b2a7961f2ac4eb4fdebbf2baae42ccbafc8377173eafc681526730c21062f12029a648769450f8ef385c4e581ca86df1f394b00e8f13b810c75ff6eb8cf0a0b79a4b89e3efe2ed889b2a2774704a6bf79a01fff9a38fafff1c309e177adb3f9f317835732ab7b8297c12159221b138f0f95e1392fd4440349de726a134cadc48c7384d311639e8004e36c9c03684279fc3802e5b3da54b2222d9c036c8ae6a74a7f4738e85002f6c80a71bf793cf6564c7e38dfda0649426151771f48ca331b98112bc00d586cf4fdd2051993868c1545026bf777f64b69d181e53d5f58f7e8e0702651d86fb527ce9ecaf50351d704ce5122320a1fa2bdd83cdb88e094f76a1145f0f5cf5668a8f42c921f8022dd5662acf2857ed390c5fb67e2b9bedea59922bc4fbdf3d5dfa640b2176ff6dfb6d9590fa852ee462358e041622089c60e0418c07f30cfd797e256b8813143e1fecc027c212509bd29d936451c46a89d71f86dd3bbe5d7b29801e7269e64715f2b35353875df19248a4a2c47da69f0f81b9cf683e615e988681a940eb1ea919822978b050f24f07da9c6084d9f38d2628298dfd4172c53701e8d6261742a761bd0fdae2a613ff7d8b2fb333e43363acbbdadc16fb3a1cfb0d1a150792fbae72e7252323b8777aeebbea7932fa817109dcdbc85d6e20180d6d6bbc7a0e36201a154b7437586193fbaf03f0b2019e0df00603bc20774a1be0e5c1736180d719fa1706789d35f816738365c6359f71941b5b4b2c2070308ea399511cdf93ac1b730918a96dd113e015b07171005e36c0b3015e5e3cde16b963f371a179cbd3c6a5841b190d4e0925caa82ce1f5d2c6058e058417e91a79a542cedc8c35ef954dc25425afe975e40855d7bd0335b8a7d6032b4189b373a514734deb12d766d27d52dfbbeebe1b301571eb18ddad6dd66f72d7c5f953c65263bf8b58bffd4e0d6a9cb9bb2eed13b6de4ceee1b96a1e6be657fcfda7a38498b4f5f9618fbe2bc4b697366c2f5b00e3016eba649cc51a23fc0ff7be1f5635f2fec90709d1fbd3334eaeea20c4f799cee38b5d9bc0eafad7d13c4fa94f500586e705aabcf2588d073dfc1e56b02f69a0ec3b0c4992751ec30309c6000faf5bda8ebc3f5bc26d37e5c8e87bf3e4678bad938f9b20bcf92b817d9141fb42b54b02dce44df35744e1081909e18313cd0f672ceb375de2bd7cd1bc37d78e56f852668515aaae394cd564446781b3e8c64e2cb3037598b5a9ec2f0282290de4902c1f33a7748be4642a0acad2c66d11a2c3f0ce151def93dcde92b4944cf728a6380188d3002f1ddf81c90e86b88da90696792b91d74f31c17b12e0213fe3c05f3c301d06cf0678f900cf0678f900cf61f06c80a7be37c7afa836d804242169afe01141e4077f118367033cede017e02f6ee52bafaeb803d8d6c6050f7eee15e6793fd9006f18c0e3e3e2307836c0cbd7decbe357301e269fe62d3fe1b878de68450c9e0df0149eb83ef28931e0e31c7b3ed2ad6e4d453b21befce2bd6d9320db2ee6baaa03af2bcaa1f523b47f82e73022fd7555bb5bba456aab9b52df12a25bffbeb35d0212371e19301e05b1b689c099bcd738431486f9c47ef7032f2c07bcb0282e08c6b5c8b04f02e269eaeeabb24b25eb31f5ea510f3f365b884dcfae99b5f529180ff0aa425d3b72bc985b8cee673955882127e7d75ee31ad9971cb87ad09d52dabbbad9a503cf17a26fd6ef6b4fbf4a88c3da769b307fbe104be7cca9d8f19dfa5dca0faa2655d13aa851758804c78aef591ca180ef434868b2d9f3863ad405ea7cf6de87253dbde2e137bac8f79f939277d78bff91fd58d23ced1f43e56f1f11e7b51921fcf3970b84c45b9f0a1b1bf629329ab49f818c9ae62f0cf08a0c8c6c9e82b764e857d33f3c4988752f16cfdc04d71010e1c0543d10af43046425d490890119a868277813be11cb5ad6dee704046b9cf8380abfad6e4365e4152116bd5bb4e63349013ba6f578f50749e99ba51ed8379673e74831dc5531c8815207a0ffc0cc88b533920c6cebc72486fc464a0c3cb0ad1fb93be600bc0a782e0cf0d4f7268941308961a092182cb33bb00df032005e01c03311c091d0ee09e352c0c6458d53b6cf8d392f1e6f2e311839253a000338e7464a0c46b7584e004b48c244c62003e015c48f4bfd1b75a754b477737abe3f61ca1dea094e382867166cb8da09aaa61b0b7183c937b658d2bacc35ba776f79e2532081581a5e660267436f159ede3a56ed12365fbcdfc9ba41fb25eb0c353e89d7c3b496aff61d7eade468c72e1dba2913fa8fe3006ea17820d52c871a08894b582e3ff09ef517b712a2ed791d6f18fe9a50eb23cf5b07d68ad031ee3502ad1e6e3ffe1a591f7fe759d38f900758c6885ec76d7f46f26375b3a66c512b43a4c0418ea95342d7a9da4730f0c007c98552a7e4b1ef99ea8c54644840fe28c4b5473f34abfb39429c75d1906bfeb64b8803d71c5cf3ea03ee6f42a5bdfe22d439d459c4cf5f2e8c2f8e37b499c4172c49279e3f848f8484ef336034e6fccf944e2e43be75e38617cbe0de1e4e38709eaa0e5135057c82c44d044433028806023bf7310181ae7b0404269e7499c069b89cc7f20d739f59293770fdfbf56d3e937587c99deec85a289fc90c2d6bd55d98233739a7ec570da889f44b0cb1b6912308f2cb2f8603b098543b7ba72af222c79f04781900af00e0f103533ff8b9aaa858b400780e608307910dcfe5417f55bf8222de6d5225c201c83825bfc460c3731900af00e0357ca0369631f038bca41883c89975b67b53e197cefb4fb9174fb985240eccc68b2a99eed0060212014283a2bedbd316a9addbbb2aac6ec3fafe8b492080178c27321886086f5fbc8ba742b5e16d305f3a4344fb229badafa224256b580f5b42eb4639c38598fdf5843ed3e15c40d51d1d4090bdb81a0ea6ea6aa85f12e2e26db7560de82ac4a11f743be65177dc72459ebbbf7d2a185c076bc4d5ae9b6f4a76da9bc7dd2a0feadd6dbb5c2d259c7ef5e7bd78d1d342f46edbffde1692f5397848c721650749823664e95bbb17c9b1ffb0ae06770411162410261bcbc350cff0ea36fd0fc948bb5e883ffdf95f136ee821c419a70c3ae4e9de421cd0e5a0198f7493bf3d2fe5a053e4816bd55b9fc5bcf24c8c1b8e37ce5fae3ae502254aae6237cd5f18e099f659811573079abaf5e5766fca7ed66dab995af312cc17645e20427fa5375f6e410984c781f80888b1a4063db067058d374847c8bc081349815a80701db84fd63d2ec4c29e855bd63e22ff4fab5e7de345429c78cbfffcfb3f374b54c369b7755a2b1fcab262a61ecb89c606381ab662d0adc2289025f4c6828d8346e46cd08c0e57ee9e388d51f0c64211118d8c56218a8cf07b7c8f0defcd061b03a4d5465d24fdbec842235736c0031315e15dc8e0d9d00f484a6e156abf2f62ed420b47355feb07e201fdf5c685f0c987fe67c17b553fc17887042a6e1cf03d2a30d1f18d8b03fd0803bce1000f091ec7bb90c11b1e302e850c9ede8f4281cbdd06787c9c71ded4383d21d4f1375c900a2474178c5039d4f0b9053733c256f574ecc089c7cc9c078a7b636f769465242ac4990a4fc40bc6d386f9403c102f87b57deb187e57c4da8bf93804f43b1bbdef00ab7cd5ded175cb3fe75f28c407539f3ea26084faae0e541cb5a8aa02425b0381974848dcefcfeb79c359a7dc26c46129475dfff86cd7901e1d1efa87d7ff288e9d791d68f88624577bd44f42b41407d9ae4dbee767a7e5bb75e6a053d7efde2d71eb5b7b6ca1fca0aeaca6f9e276f20c59587fc94e8997b5c8aaaa7d57d6432dabee3e09efa1e8837592e4a6ffa5c9991d24614ff973da693d6e90f5a6d49d3d24c108cd0a1dd0fd18e1badb96346b26dc837e934be2093fc457e86ddff8f2f9f3cf271272fd3cf0ef6713fc22369fb82f62edc89c9a6bddfe57aedcfde75a60d0a3e0e480eb36fa37d6fe2bb43f869a393d245ff691048245526955f008038ae25369a1ce136d2572884aeb7f78a75c1e31eb2a8abb7c2c3986c31fed71e3c152226932b6594a8fdf8b384e99eb10939318485564d6ad6700bc028097586228a648f4bd53153189218ef3b6015e1ef4370cf0748981ab8a8a81e3251b922107974962e0c6ba71ba7343032a98c4124309937cc6412eb1814c62301a17717e133b51c4d990745522cbc155ff565d9e2b81cc5cfdc15353c00d1575fb5c678c9c760dd84250e4c7c86997536b3eb9759dcba1766b75e2a7779f1c9b1fd54fcf76941bc38324109454b9c417b08eb96acfcb999603bfb31aeab7cf763643a4d5cbfe7c3cfa95822786c5bcabf2cae1a0a9bd978d470d1b0ff9f980b4210f1cbb5588ae6f1cffd4888972efe6583bd2ddf4f716c79faf5f2e39027e41e371b035d55569a74453eb7b9c2b44da9f9a5c79bae49c9bbcdaecd9014325a158d874f039f2fbf4922639bf97e743bad5ec23377b70cacd6977f5970764cae294ea580e2a61e576f89dac57593531afbbeca0fdd6487c730d1225d700706711d3fc99ce1fc0b7eaa7f287d7cbf539ab7462d927304f2441a3e481f386f3f8a2aa2977d910556304bacf886e2cfb8a80ac5515a9b26c6823e118ad7f4f4a9a7cfdfb90e4f1ab36956f7693b22d1935f3f5996f4bd1f395439b96c8e70eac3e78ecc99273b4aaad9bd36f10f1c6db8c58cd554559b0a047e241a35445356d2b4ffee91d49b0eef961b8237fb9fa9905674e96846ae9a1b3cf99f88c105f1ff261fa98a385587ef5dcb61f4a4e6c7d9f65d33e7b45e2e594b7582c0f12eb71eb8f3b66bab103cd0f73addfd62da1264d8f168d5715f5635e6726a35ab2aaa27e70702569434ad6eb2c89247036c053fd26db4623bdcef801d2581b9281318814d6f58f1190fc0f9e9e324541226f95aba08ebb80ca2d3590dd170908dd0f2209488b6b5b2d88119009273eea1210d9ffb580871a8f121adfdcd8e7dca9c15b27b96c3c54bfbc75acdac1c93213f65b62a39e07d56ded9b95176dfe5a8ec32def5d3fb9addebf6a50752001a9fe03b45f16e2b49b2edddcbd9b10c71c715ac10b27b97687d0e466634522860bda7870e2fae5b601a3513fe178908a9933145c65c4192b4184541b0f09cf82b60e2f797c8be039d5c6649444b8a11dc40099e6af08090bacf702d82780eff6d19bbe58f06f21be7974da9a3990fc13558eb47e519204d51519d1210094bc1021a928b9f3ae1501c50a7a60ef0a2720ae4ef2d049dd9e7275c63f5db8f20efc1ed36ea742923bf4c76f0a2a84a6bf57350678b911c35d671ebff348d9f17e951754e43bf2bbb79a171cebe6e2416fa87ca6032e56edead6950f9648d2f16dc7699151db25617a7556edea6bd59338704889c9eb060f0cf073a7f4de70c5aa582c712c6a999b76b810fd870fbe2cdb8e39059c71c92512d7754d4b0e7727cabcb01596c51243b778d97dd5f79c2385b134e68612646445783d019e03dfea07bf6de294e8a056ef1d076f1eccbcce689c698326c6db070fae041e6c2d318c0b872734bcb98e7f1ce4fef2e08944e3529b555dbe658b104f9c73cd7537dca0bea850245b94dfa9d73b77aada559db80575fe683371ef0769f7c591954d9a0871eeeaebe76dbbc51d4fc4970869be1a2772ab1e0c6d07f054e36d1be6c764cbc8268239527b9f693db0f9af1f5a5f512d39f182b4bfbf7b8364782227d42eae8683a51c547ad5703570e5c7429cb0f89c8f0f9784e5a453cfbbe5c543e45ebe32a557ab0566f871f8e743db56fd84b6373ed9da78240f8faf2b9b8d8f93e478e07a56f0f269dd2687af7ffef2017ed03e407c75f81c5ff44e34ec8b65cbe7defc9a3c07c76e7e62cb44309ed37a0695eceebe7a7b273c873772220345f7e08057229edb2491f8cabe0a243415478e53f59005af5d23c49513f2ffe348c4ce7deffa9bdca4636e419b08a681c68ee1c6ad3c19ea7e42ac3a6dfe81ab25c57cf7ac870ef9e30f427cfec6e897cf6f2107e5a25d59731e1714a9593ba0eae61fa588376dcaab6fe47e28c4dbd38657dd3243118e458a57f50df46e10e5778197ce4ed0fd9695410d46d532d025ee3847be376b774169a9109f38af5df05e6f215efbf4eed6d7ac16e2a32f5e5efa876512e7c9bbc4f76e364e87451a0fa7486f88a43646d44380178b78775804ab17990d014b0111f53c72d910f14e11f78608e74644bc033c91a3c17344e27ef823bcb57ec4e1a7f7c3d123ea699ccf326f07536930c0ea52a84d11de384e98dbcdf6451c67b1dfb179308cc720ca80108def676044337c1eba2a34a78964d0aedcf9e07b0fc9a32863fdb119ed8ba1bf92816af141eb9753ff21c415afdf7ffc1db74bc23162e08bef6e9407d721d63897703436a23ec1ddfce184e3c13354f0f1308f0fc2cf6ad4789823f693c397cf5fe0bef2e1dbe0fc61060513fedfcf99de767eabd8933e8697ae62fe82d5c800e34e08439bd94278db5ff6b50d04240c324a4ae1ab775df83237adb1b52254f1fb3942342f6eb5e41ad9d1eeaf9c74847bd02f7965e69aa510928f5e1314405402801d55e100442501da192ddd5e2e37c0e267bf3ce5d34f2567b8f188b93f49ce70e6f071bd5e949cd5c6c7563fbf0d44710c84aafb93aab97b62f52950a397097a9f804848ba6008acaa7d06da40506ad17be57e49649ede3c7ed77342140f9879c8a7a70971d4fc7ef77791fd485fdde4c14e19223ea02e7176559f3714798f65c0a814c4fe722f1b54998c06afaec6deffc16d0f39ca46634d35a8b84a1a0e7cf4b929e6800e7f2aa89cb88a2bc08dd9a74acb010e8fe0311517a892226fd43d5d2e198559df4da89ad24e3dc9afb2a5f8865ba18d596613a9b09ab6badf5561753de784ee3115164a66e4dd47b622e51cd1ce375f05d04f9df3cc609c32f7ba9b0af04c2a2eb32d4a839f7a69fa55ade4baedf2d5710f9df3b614588f3ee37727ee12a24ffd590f5fdf4d4ad607b43cb6f7fb225ea7aff035ab3c1d6861bb00dab91afe45c6f5dbf07894c029e0ad2b1bc627a3a1f1f0e1ebc1c7534587b7a7f88e067826155792f87a92148e23ec0b5071452aeb6eda7da21013fb3cfff8dbaed7dbf3d1f76bd1eb0acf27e63587b6adea43551d81f88f48dc7a8ed59cc57284a1ec2b09c4863aacb75d82122d89c63616716896283fe069219a8d689935ea65212edff6c0752f7610e2d017ba0d6a0692890570b063f578510d1ed4a05270377ef48afa47aaa4c8fde9f3af4d9eb043882dd53f0cdaa2941ba26234d428e24d85badc507f08f549ac0df5eed7f59abeff9b1f5eed84ead777c909ffe0f6a77b3ff0a094489e297fed9b961e2722fcd9559d589b272fb4d5f30992eec5da71f06c8017067885002f0cf0d4ef1d8207fc46d48e7f2fa53a19674cfa662b780cefa0acc6e328058c03ef054e0e9ef75f99abe18dfda07118c752ca18c6257247dd0d55a09a3116c0c8554d265172155ea6943ad0366547c6f9f22545649223bf67e6988653c644fda931d838eaf88a2a7152ca979260fcd4a2b97bf3a0d526747af327e3e08775f8c29ce43321fe22e8c6cb64c70339faa0ecd6415761f36cd9fe248689f135ed37c7908cd4846fc0cda5512f755196363e006fc7d39b6efbee12d93ebafeaa7ac6d804d5285113033e5c6f071bcfb1ec2b09c456154a2014e1290956af57b35a5f32517e3729f47aef03848f330a7d9472bc1b917e44e7ccf1bde5371b6a965f39ed13b9be57edfe368a0405e0214f8057a9d45f0b35da2ac0bb00757a753da086c8d75a3016d600e789c6c26ac8c24a9208506cf2af46ef068c13000eb60e03ae90b2c34d6c75433c7c6a2755ad7139dd8d7d563d34fd612979f5ef37e4fcb9b24fbfb31e6bde3381c4c0bca11a8878571c2f1ae76c901838c7c5bca17c5e25dcf6e0c1ab80e7f43810b3f112df9301f0543f1a29319838679ff13d07e240a612e7efc05fe41463cf573f5ef9c5c6638498b3794acde72c25874f125d0f6d304252e015d4ae91514a20bd5c09a4cbd9277ca8241070b3e511e4a375af38cb176f14e02cc125b279e86d66bda0c6c710001a646ca6f9c73649b8ba445910606c3644bcc771f4008f38fac4f8068d47d03af02460abc1f14089b724d0f6a2e34bfb03e0737cfd124e627c4bd87898e62f3bb144b9e2866fb74f3a4888e5efcffb76354f2dc334296444875433a84921891a090ab03cfce64d73d9470484dc77c3d0c6009f755244be3c6bfd25cfc8cf2eb32e74233b4d399042a194f69daf13a2eb9613be3efb47c919fdabc5b5df5e2009caf815d377802d02fdf2a31950a384c2ae26c52b35d1eba0162e5ca96103ee0bbc398c7d8f6e8d2c42b9ee5968636e197c1fdead0d1213710a474aa9e4d31d6fb984e9d0a15d8fdafa2f210e7ce4e0d7cfba5ec4e78672605c0c0b8f368a5a685c555442eebb78f087019e5ae849aa8a28702a9fbc78e669f032d8c19fac1bb35f05930df01c80871bc606786a5ce80064de6c53c9edd10678093764e5985dc3d7ff20c4dce73e7abe285f0d08b9abc2bc9317cb36f8bcb5aa2371f387a5c531adb6b84e215d17f5d97df7e5c21dcf5cadfffc42a952f0c2ca40c2ccbccb3c6f9b0cd54f168887f032d90555662706058f474cfb097506e001f3448c40513cbe0d44bc27864f81a348a882025603c6837b4599dcd983c6a38445782321c88036a98c1a89af0dbf1f9de4ba2d32306ed98c5065d339b92efa85101fad1cf5e62b5709b17beef67fed06679e1af41e44c2810c32a8b28890c07986aa2bbae80b0849f2570aef2b0262e9757ca468afda33465c2c452f6b86f5975eeed2f74da0eef5639d16fae3c172800e7ea7e3c84193a56432f6987776ed9214f898b97f2b768d7e9f895118f18efef9382014a888feceb7431b6feac203033950a0d048209080d0cd5e90248e72c8408ea40824e5237f6a885846c907ef808eb01bbf5c896a45c6dca295f2b93e9d063c30d09163f46eca336d8e12892486d871c775a10d2c6c95d2c39c1b4a3def71a0ea3d9c132b21c9a788c1b3019e76f007725e96211300da623c5dbb0df054bf4d9cb945fdc0f88af60d8dcb8e6ea55d162e1462c1a8cfc5dc52d5614afe87840475c567c1e760e3c21bf68880480c5b0c3cf0ab5429a97439fcf8f6b15426b61c319180131d0d190bda91575c41accd75e1e61b367578f3005e18bcf6826c443c62da1ff18eed5c68dbd04b1d9e39e2bd40c3d78bafc855fd4c52420d1a0fef8e70be0e6c809f9b683c8c11e445942f438797ac44cdf11d4d84a933400def09be3edb11c47155dc5dd66ce569427c3ee5ad411f82b71cad5b94a08111260d0aba65e3f9067504d631119046abb0f6b51756186a5b55ee104697467fe72e85e8708c1c661703a1ce2f076f9803c1ea44f117d76ba4cdaa430e7a401ec4397ffa7bfb918b85386475d75e6d2e86ee3ca4bf1e25109400e860b848d55520caa14e1cdb6834a71c3f6884fa94d56844afd56b5489d5a228f9771d8e6694bf4df472fdb2ab6fab983c6b56bc4e95bc316c6d5cc2ccc660ba000bd3cc07a46bf7ebb27db61284a7dd2f62d43507a453275d3ed90a0c69c54d1760719df070ea87cdc6c5d1e1a9e777b62f7d68438ff89ec6e980d1eb0445f941f13d10dec6c2dafdee2a826543bfb2b4fe23fe7863a27f7c13dba28cb60c80770cc04bd646e4e8f03cdb00c337783d986c6709e1474d17956519f0f5db067478a6eb068cb61e80671bc6c3c33ffab3e0ebed8f84fb2d597ce3c6db01fc63f0d6a62d7eb6507d425e56116048f19ce3353d870c2cb381708211ec7d85653fb9f152564c2726265d1de3016c66546513c8af8ae546d5f4639be566c95fa414a6a6377b4241483b5bd598fb069540a4ca8283a3f628a841e423d10e233991400021c06c95946c0f251a3e610fe8cfa34aab96a5bb265d24720892a0943f525638fb766d5c007bfdc0a4833f7861dbb1cfd13dd1605c361efc85fce0f719f1193cc3c1cf1803e1dd07720c3c67c37bf1a077e2e105deb36293317310eb874650715cb6166f68bee16dc03c6aa8c350c3914fe6704e7050e48fc7d74fb0551b8dfccc88ed1df4cc481e4448f98d9d821b69099e0e9f5f49ccf1e54661ef601bde20bed1c4f07df3c40fceb03e1e41f7d724bd7e931d0f8f9014360e5fbe1f38fe81fbad30197ca3c01846064406574909d7f96cccbbb3e09c8b80ad1755ab980414cf1f1f21c15c576cfd1221b1a1764492655fabb080705072b33f0a9179e9e9cb2e961243e8f194a1bd5a8a7811db89fd0645ec7e24f229674b6654adfbbcbafd5229397cf5ce84f1e3c72bf898251507060f74cc361981ab4beb20608602c230491e1a495105863ac223f59a6c2dc8a1420428ea0e6942a04d4be95a68db50e7aaca750a68ff7da7c56e60e2c11b3a76cfeb171b1701e352a08d8b29402a83b9fb9580111d5551c62494f07ca01137c9fb243c5d33aacc04c02b80be2b3cf349459003fd28827e08c0bb2021defeb4f5086f18c0cb4b3c2e566ccb3aa78e99f366aa10bbc66c5dbb1b22d16b408a20d11f25d1f7554dc914d1af1e55586b85687e6dab9b5d1b48977f1d7f674c856572cfcc82c0bf5250010645201790f13917e0d9aa5f002f53a9eaac7949ba419bdd4975f85c05e3d9063a37882fcb2e8b2a4a2f4b32da06d87a2b602a234fa55a04fdd2f1f5dc5cf3607c747864d44f723c7c467db2e1a8b6d10941cf864bf8fa03406d03be5632f8e2fedd7cfaba99d31f1262ceb153de980daa739f711c6bd4702c85ef8151e6ce3ea44a87739308c75a9164d9d76ebc50280ec4fdbc507ceebae5468d2276142510bc7a3621e5aeb4cb5f5b0321f878a73546b0f3ec9ba4da824339ba48d5a4e2eaafd7148063727f43112f47ef2fff1e27884447245c4ca27125a19297163df5c381c03917261a97645545b00cc62679039dff0e7907dea3493e283144fd2a3487c1d32506136767921844e3541a096e244cc8d955debb7b841b67f4e345cb9d1d10df518f841d6be4d0701e619d906492150f512fc6f51c656ec6d186dd338d9c2ee7948b991bb449b517ec4ecae13bd0ce6a14be519f0a15f177a09d95103e735715413781728924f9f59b783c7c123093d01a8b2f977092c557f8f085f18fc676d2b70f7d72e23450a993648192076388a9e64e3c78ae0d8f7f63dcfa86759f7cd9df91e8f92eb58b2e720fd4a829421323b133e9ea59f5398b742defbde3e09f40254577599f0b35de690da9515250d21aa7d7bed425583342c007d8a8fae03527282c429426da2520172ebaa5ec5cf7dd910bd60f4d342ebe71c8d2c74fbfe3dd1799edbf633c8bc1d3e7c31f819bc9e099f00b27c4cf1cf91b4e8c9fef3955fb2295c1629163e807e0b1be68f9c58ea3c69b083a4a9c98c281ab24f1c229e4d490c084a196906b2ea84c71bf378e0bb6bd3be5c31afee6fe373c3fc1f39595103e9f87ac86e1fbf0cd6a1cbe41f823bca4c7c3bc1ff66c3c4cf0ccf39914be4111e441e381eb7ee1cdd327bfb44c88efbf2e9ab61abc4b6b98ea9d246696fb0a55f474f32012129e34d16675d2657f131059a2cbea2f8805dc393aa729b871ce33b2ab360f3c3a2c7a76ea230a26e5d24a5575ca0055d3d59478c10c3a3c16072019065ce1e06ffcc0eabf23420470894021018b272c9dc45a37d797715cfc014dc3d53b98aefc18c691fb395a5bc1d34dc451936efc18e6f41066b60d8749263e9d2eebc73144c6b3583fc21ade6663a8de8f418600c22c455abfeb515831076c6534de983a871b19f17b4e4060c3c5df35bdb3bc343346801e12ff709d217cf36653ff6d684735fcb9edcfacd3d7e77131049e9a6c45c1c6db84fb2fca25493b495b94095ff3fad2e16519f0e53699e16cbdf9ef086fd478c449128e86af49b2e6e3e19f3f24a476427c93b5f501be9fbcfaba331dce319238507381b656544d611b6cb8c408e17d1f1ac6c22f493ba291655f1110c7fc55b42a5ab77b72fc428bb283868c51902b891d3ca0e24ae99352d9748e8210429515a685c78baa30fe040909deb4610332e1807ed801df275b108e03356c299cc8fa7842522a3a366d1a6b6a1bdceffdc48cac5c45402a0ef5bc77501b1676d4b751f48dcd5526fe833f0af08603bc30c04b7cf01753ee2ffd20e2c64b5f843033dee2861c87c65c1ddeee8edb9f5b364a885537ce9fb969930248aa4bdc58cc8b8502510d91bbb46e602462df1d503f77f71d22fe0009c3b8e8eb39300239ca0f7a369e001f72a7892423a68d077d6162959979dd717cd97c717c03545c81aa5aee1516a4e26a64047934ec234c3afcc68f8703edac84f89abc2619bebb7b6c3f78d915724d7e5977335d7486b60c76f119d52871a06603afaa652a793a7f6ca8392149baa4ece90f1b2e74e564b65ebbc6f4a33a9dbcb4c7e3525a589d3ac4cddf2f20ecd0e2c62ecfaf9f5d15ab9e8ffc3552b863be102b3ef87ae32c50651185c6fb1d1885ae05ef1b8cdbc0ab4cc938be063ae0ec61c74d65adaad0b980dc9a95592d2621f5fdf8bc875b7f22c4213bba0cb957e55eca73cd701633629b8c96be34e03960b4f522bd99511c9e4f36e23d13ee519907f79e987270251bf19e09c6c5798d355e1afcf3b32097582904d6c1b8ac1efc7dcf897f95ebe41ff32a56a0771daa00c0784e990720130119d3c11859f78eaa493201824359a6d7c9ee743d7df2607784fa586d3adcd3c07af6ae3e56fd2d51712371f3383a61ff0d7152749f0a18ad13dcb0a9569dd159c2179867011e0a7e70c4b4d520be682c6611e409e280549ba52bf7dd6343c66780b79711e45e3b30275972e361c16e0fbe262121bed18b230b2bef12e2c3ba178f72efa4dfb162d3bced10c85a839932c0385e7505b4d1688e1933307e0d8ce518404d57d776024c6ca197b5a291655f111038288970a064200fcace438eefd1fa2221d2bb37abf9c3dffd1b830e9a7c4ae9a17be9c042083d9532c935962fa99d593ab59ffa0239482420387058534a0a14ed56a99a544c9ab02d3c4e736dd25d6fb8005c22b050bb12d2299f5fdcefd85b846832b4c5c0bcf31b1897d1466f1d5c88b1b748c2910bed79f1ef4a7a6197b088e47970e1559037d4681a35fd60f2a7e2600431e00e79cf6b09068f6df879ba5757a46fe45c57d29d78e9b377bc243754f5c6ca6995b0e16a1981c08d878484bc5bb6c3f390f61ddd26f9fd36eefaeeb1fed4bb4f97eb29342c745a4f77a4bcf4df19b167319dbbb79e470334d5ffe4d37fc7e049c2d11eda70877ec30c460311deb9eabd041fdadccba8e1886923be2574db4f1ec00f27c437e8022c824f8c8f82976c04b9613ce292992a784111e441e3c103404b1a87efa2d367747b79b910df144cfbf762c8d987779863ba7dbccf03e3d7f08228b4819084020c129e733c43c75eabe8f71b0141159294400ed8d836afa25c8883761d7aea5fb6c69eb2dd5427164fade045c4ea17f0c084847aa40c3cf04229ea5db5fda019338428fb7cf3524caf5e8ba94430e508729c18d701a947ea4e5035456222655e0b75186aa771fd37155f8a171c9f3784387ee23983cf1a2025b3c969a75fd025f62d1e98ea692e3114b11b03b9bb6e0e480c53496270e02f2e6c07e0a9dff31b036961c3c6c88103612acb32cb73701922dee3e0a9f7e480c43015e6976fc41276d079d94a75bc9153a4d41e8af15877d992c5932e1562c16d9fbfffdd0ef502cab67ba55e1321c100529448c02db20e52dfa06a8b245528ee9dfe479dd9efd9ae727da76c4ebb23fbcc04e3eccf8eacdae608f20ce87faccdddb825398afd5e0c84f1f3180c5b835f409cb30ecf8bf0566d2f82bc04da61c05f27fcc9e2eb3120d9807f18e01725856fb62f823c4383e7112a7d7d992454c12ea82aa10baa609e70bd353227191f0f8b13429e832b31bea5e11f87bae7d8077ff9f7f4f160abc5f55ad941d5d570052d12106ab3c067241c18af863901298d3b128e0ca81db187653f1bd15d0e7ffec269f76fdd26a9e2c591655f7f1dfb340c7fb9eed38e7d1ea05befbaf1844bfa834a81c79d58d3f5766809d4ef410dcf939b31d44438c27bd2cb0485c121028bef7384481b94bee1cc0e0d1ae7c2f0acae733605788d6336246f9c193cb49d446df81c6d1b4e627849bb2726345a12dee358f661a1eb861b1df15e0c92c7a8baa9ee7d318591b71f9806e9f82909226c28f44ae13a65d41d932d84b97b93111d4614379e4b58ca3a6ceef4f129c26ccb209b1ec39fad676f1e13dbfe087e0ef08d30bec66cb3cc481e940d37c17c35b8ff8cf84669feb212c14f1a5fbfad445f5ffe7da2e36bda27c375a7019fd38879fd363c1ed1002339b31d96656d39f3fb4b84f86f97c7ae1f05aa27be3ec9dbea13bdcd039fc9db0a6d1fe814a28d54dcfab5c55e967d2d81600d3c6bbc2aabdb8d271edfb6af44e180f4c2ec6ce10f6cc36cb2fce62fa64b6dfa5ccb6333e494fcd06a49e9d46239a89f55ae40dd208a6e38b0357de073e6474d5e3638b0195017409d0bb593f410e805e090ca231f6a49d8ba0ce993e7ba21670ce9ddf7b977e533b345bb666e3a787f6e28f576ce819902bc7c3a66e08882ef90470e0990060e330738b8a94c22f4020805c02b0078c8e13a002f1be03900af1fc083d131a9d0b8caccc0d965aaf69a59dfcd1f3b4788ef1efce22d37e7955b304710e604229515ba3fb2eccb6803411d72046e2624093517fbaaaa90942c4b9e5ff8f87629011f7ddc690b2f973db3beb1cadbdc1e879f0db63e5f7664d8c619600bf15424163ca7da0520bfc2bc490944a9140772152271dc20491247afaf03bc2a958fa7ff8e70862f9754c9f696789de52699838b2495007cfd39b8747c4d7790737c4ba85d00ed8c84f0837292f1f1b04833a0e019727055cc2d5bbe42128c31998fce78f2cfb10be9dead5059dcbc24ae205954808abe1ace354ab904eb95182134a2a35b3ad451d4b020abb6166a47ec65d9c7048422ad5132c0a48af2e06cdbace3dcedad843860c94157fcc90d04f4eb3eed584dc9e9885eaa361c98d677a122f74ef4832e3c2cd78df45ef3c682d71740a01837aa9331e946a89c40844e00001c4c494441548f563511103ec0af431d2729c44a41d008e8cf63fa79b27960fd8610e7e5dd34e5afcfc8a9989f3a6ba01bc9cc23598dc66538e84daa01cf58cb23bdd5f7a6acaa5e1658077eaf36ca545fe4b80df032009e03f0f483df3b386cf87d1ec0d3dbc9a6e93644bcd75d573d73abdc80635e7bf4a0e72546f56323c5b4119173830d59c5084715e89089a383e474987433f2aeaa697d20a3a18e742d5968f793fa0d3d52129a50e79473faf513222ec2fb3ce8474b357e487e0c4e249e0a86cf9b1a9781e24ef89d9a67ae82290960300cb6810446774bc737c96cb8088fd2aa9b549e0c7e10befc8ef012dd0943f0bbf80322c805e2c79d46b88a36d9f1c880effd8c500c5ec5e96597af3c5c88f71f7dbaf8898142ec7ca1f48b5d23142052ad628e3e24202a6da6a8445b0710125ad7a8ba02491a8de5513cd710d302a81df133957da4c2f2b98539f0392a3fa46835fbe5f7aadc2b69eb2745be5fe2c66570916f38a6232711d08e871265ee726daf3cac26679110bd1fcfbebef72dea498c4477534dc4ea54a8e1e0c038120c34a4c875507d910405dd2042801fd8896bfa1d7b3e0484c855ad5dbae9ce4fdd9bdf52e7a7df606789b8c86cd93311a7da493e3256570d7891de8e0e8fa98a7c11ea0655d170701b0dcac1956c72442f729cc163eec64946bcffd86e45e9e7cfc943ffb29a7198b4323ed23f56b37b3f303b29cf0c40eebd90a286447f4d7927fc81a312a3dd39db8f8e397570f7cce110f7e2b079f4bb4367b17189c6f797543c6341c56b52c1f0e4a449469037a092dc337c93cdc165c697c38736c00b7267770c714b368f0351e3da08156dc2f1f0abcad4f75b0b7e3c7ae65942bcf5a2ddfb61596f5bfad3573bc0664b2a299028785257aaabf5e729fe23ee8efed83b794034f608199f9fadec2309048bcf688c072a06f649dadef44f2dfff985e4d8da2c3fe4d63c5b7e38445c997a968873df0511d0a6fb007201a6a380c0e79d24cdef2244bb778f18786e0f210e3feae84d4d25e7b86ae3b7abbebd50bd0f250fb1595538e05658c79328354a1e79f09cc5fa63196ae061425d549df206d4b25f7f98611f7987241ccd1e6bf9d23b6fc7f0bfc6bd09ce1a692982d98e386d8585973e3bd6ef38ce477d6e037d2ba1cf15073412daed54d8a4275930d54891d07b65c3b89690224f00bcf3005e4b801706780efc3a03e0091d3fa62210d00f0f3fa1e3c7eea7b0e17e8d0ce20033a09731bc4b5bacbf64865c4fe3a63e71fd9beb152c727384ab91dd24746ea9ac84fa23a8f17bf072418e8e6c2290d9a01eee5b201516f6240c354820d65a2901bfb7e02337434297bb8f1fed322e299bd2569d7a6aacbf5ba0bf27417fd702ac0ce8979a37baaa18dafe7156e3d142cc85b68297cbe0d9d02e61f06d9d538ee3c4117e18debe36beb77b8a6f9c4a2a0cbfcb80df69f01bc037231e5f092f17da1abc24f05d0bcf69f88acea442cdd84bf8561c54b1eb93ad35df3d23c4c42b9ffb6fbe3c0767df38615aa11c89bac2da372a4f56cfa031bcf272a8c1468b2a2bba39b55c7f9eaed406c983ae1960f11e941b1025e7b0f899cbbe22206b55c50f54aae1407603fd36ce5bf5df8a17e4869b7fc2ea56f32547fe4adaf893dc3cf799a02ac19bd73c115e9125aecaf1bc7e6cb76afa5c8bd37af796cd6f7b8fe8305872a8ad97dd33e75a79386cae7eb60e0e882824d32333b30df88d66fdb0597f4aa0ee9cb89f2120182e0169b1bb75852be90c3af39ec71e7958f6efb5d4290fb8aa3557b4ce8bc33b0b44e1525da71ae83668f2563224eff379bf08dffd0628723b002f1be029afae71e0d5956df09b174c0565ba002b0bf01d872a02a6d20a5069543d5df1c98f438578efdc27434f1f283793a89a500984826c19c8d1018120f747cc828c6ebb702f0ca9acd05f1e37e44dd0339bd5c81001d10ca1a429d77575a4fc964552223eb453f727af7209d349e2fa1603ddfe820d299bcd9bffceed0c18970218171c67d5f6bcceb40baa8c49128bc88b4d87ef8f7f2881b682674892484917b97b31c3d7536922c3e24b9298781d9bf035dc116ec2374e15aa8f8747a8d4fa32a8b812b8cd17c17309c763d103d35b3db750128ebf8fb8ebdd1be4e1ffef1dcb773daf3acc250db2c5c14da74450eed63f47c607555c787f0dd970212720b9e9a2a4910bf55a56ff6c655f4b203a6feb3b8051a5e346924746d7dcba4812920e83babe78b514c9acefad1db1886cd3c499379e5ab0a0534fbfa859e55172223b457a2de9fa8dfc608bf871999c98adbbd76f2d03ca4d8403f1c40e00a123c20747381188e9ac4649a3ab10170eb975ed09238438ee8133ad31f2fda1d294f3738a85d9f6309a38fc5ed08f30f4836f1085add948e7403b57c1838ba54c07465080176ef42230daf6f319156d784a1dfc4cf7eedb881ebcc457bc06300675ebaa1fdfb64d888faa47e53f9a2e259089eb5fd90ef7bbd4cc5775d58150a32482840475c84860f09e179438d046862a0030c247bf861a3839ea890d6dc650b846f5b2755b46b917f6742aea1d71df9b3eaae91167a7094f7a4932dbb037cef0b6305d58a534e33970419527b1e23c16a8e78c362907e021e140f8b6d6363318050de34bed5c6823fc0c866f4663f025781ec391db20bed90c5f6e7c2f315c5065769bd7e0572d2e9fb74eaefcef7a177ef0a29ce79967bd37eaabff516fc0839e6e38854040b46de07ae4711d14df012a2b6474284d3bbbb08e240e18005dd92f7efec0682afb9880709b001192d150838ac7dd78dbab373eeb0ef89107677eb6fb39b9e1ea9b7d73b69bf77e2d898ab15fc771140d6e3c1ed8967a54faca0cf99e0ed33a77bae023f99e493dffe3265dacaeaed8b25a1e183b976c5982ba47c28fa74219cdda923368726bf359a9c70a3170c4b067c352d239befaec7f3c2027b669a4e588a7fe251fbada6ad9f1558d3382b1600b3a0b16b05f62009c92f456f2e00d03787989c7854b0cb8710c0158283194ea91b7be48617ffc0a124001f0543f82af7885a29eafdf56d7ad5c4a8c859fbefdcc637f1262f5b8ef66fd78bd7a0275c1d540389063ab423f79241ce82f8f5e56e8fe88de2bb821d1f88812ea5ca81dbd26f76f201cb46e60bdbb12e8c6b12b2f5c7a8f94b05f3ea1c9204990ac2facb456178b78d5870db0800c41db81b6c7308d86e7543b0bbc14e7f99c0f54db8bc3d0e1d33e22950bc0c7f887c632180d1b9b050ff84c94665fc39718435cb70c3e6314397cbf338603fdd4e163c4bbe72596110fdfe42556dea6ecc3e27652d2387c7ac757e53a99d2fe8587dceb017ebc6bd93f7f04152a19b7c1890319962a8c244723394a1ca05245c281120a8783aaaa08dc881a05c9c3678b43e71f5bece362edeb17c06be03d3c4e03931ea681313b1db2e8ba92c785b7dc367f4c441efcebd3c79c716302a0e835918f1c056e3cb0b4302f1df937f6bdc854df5b4ba03ddd4a738d5091acda794bffe306dfd43ef68d94546a5b57d72e7545c86662612cf9e3fbd1735ddd64ea75e9d9ad1748c2715fb3b4e3a4089a529ef6f7134e907d3a36f4524f0bdea4b0092bfc8833d217348f1c1fa9ae26153d415564764b74183c1b5af9f09c7aef48c0a3a7cfcdd186e7f2015b354e4101592381e3ed0957a8261f399db81f23ad6206cf4e342e91136bcfd875bbe4ecc6bd3ffe09294b2dba67fa8c15e025558b374c822451b156d5e570e0574c55352728da8d9022ce888e81573ced35b27636d4d84324206ae42969273a6de0f5022ea332a0e2baa7064bd6a0d5d5ed36bf005e355a31a878e2ae12566d1ce791c0680cb362b7e1906dc3e78d67501999e68d477c0b7695b23f50af61f8843f5b7741f8227c5b87e7c13748508dc5d7a25974e06f0c5eeddc9aa1dbde938ced811b577dfd8410cba7cd9d3b5dceefe2dfcf18ba0a24803a8c2fc2b000583f64ec46a70dbc89146d17d3f43649c4681c47af2a804757d0a2b11c53eaa0713cce89c3ebd9fe28fb8980708e8d3878880b41ef28370bad5b9acc16e2a4d0f965279e28c4116d7a9e3b65977039aeacd08c04b0935dc818998d777af7b496a8e78c0bcd0678c87939f07bd5ce5407a0dcbe08af51073f7172f970f0636ea825a45977183c1be025de807c1cd086b4c41adfe0b8e081e1c1b313e29d0907fd126b493cbcb87ee804d10e509564423f96f8c625d6ae3bba7a52694f213e7fe2cd371fffa79438ae5f70c5fa6eea41221c58a3bba38af116e519d0863ba3c9f8788ffe3b525d419c10110ee6b54204841592aca107c418a1f7df59aa4e4f97df6d4fbdacc59d52527df0cf47bcbe5b12971f9b34397b5642b0e1186c0341250913d7df12603c928fc8ce0f800f8c888f21083ae8f708de1ee08bed86096192f856f7ad18b16eb41065af95e62d1c24c4da9edf977cf59510dfffcda95bbe5ccefdb0fa1f78ba7fbad707af65c0005538e0719dd1454e6cbda2ea94240cf41ac414242ce0b50e08d1af877060d95f04c486d7e5eb3512129f24d244d5cde4c171f6eb43bfbaf926210e98dcf6837b6b1b78879f6381cf6921ab8d96091c1bdb781e8e3e0edf8196612383e4b3c4d20e7e12817df0020e7edf01dcf00649000fbe050e3f0c07bf6ddc70221eef2424869e498d8b0f1e7bef4838107ad281107bbe7c6259ee7229ea7fb2e3b5839f1d21c4c693579f5a5aaa20d2d5c0b82181d3ab0209a37c34d4cde1f37bf4e790f3abe191bbe8b6cb7204910ed916890b7cce2511cc029d02eb192591a6d708d17e52e72eedfa0b714ad5a54fbd7fac7c664cea573dc618e0c7dec118172eb10e03c685136ce3fa0b98b7b0228b494b9241490d6d80e749503640cd07787663f0956d0bda084fdb17d173c4e31139af911935f76dbb45ae99ba9adc2d72c757e6eccafba1ab9428c4c6c3dc388c1f1e5d72ff324920567fb160e5065085f20be47c17ce2121e1f7f9b01a1916f2ea83f54636b74ff59a22cf791a76765f8def7e22241c36d48ed8cf657f11102c0ebc16365c0809c9c3aa46498436dc89aa6ede498801cfe755e69508d1ca6e97769f7b80f4b7ee4bf9d2fc2adf42ce018e2d7fcf2406d9b2e1398535a492900b3e1fe0393a3c347a82ca2ce8e0cf018961fcbe95188c9ce71e4a0cc62ca8744018086026a962b2dd0db161c1aac953ee1062eafd2f968cdd2237d55335a328391c120e4ce980c645201095a09aaa28811a545864f3c0da94b204bd590ae3474a78571507dc1f432a5a6c2363849208aceb26c818fd8f109dafeb73cae12b84e8bd38fb8a172f97cf1c9ebee1845d0dbcc42f61dab136635ccceb5967e37ceb399091311026801f7db07eb49b4266e7275b2f9e7f913ca85ffbe9ab457245576edcf5c3767990d71d53f38d6b634c7ba7c989ee78a4ce6b729b2b99a57d956e357954b64f4b3fc35561a7be9a36d3d540847e48f92e458e636453dd37eebc45fe5377b73bff7503aa8b5d9564ddbdb5396ebb6af0ee27dda499a57f5edf7fcb9f25c3f1fdea66db24618e4cab1b42778023c78e71122ca54784a5efaf67f7c3d0818e8403250396361d3f4755a9ef9e8ed3d8f3a7eb35bfbb9cd6a549e2b0a176c42f54f63701b1e1b5b8e48157456fac14d86828fa37295375b335aa766d23279f77f16dfde5001f36bffb09fffe56c23825b42866943415cfab44bd3570e3b1837fffa98a748981ebc23de3a281c3f71dfc98fd75b07a6fa0c460033cc3c1cf556806db4b902a11fa119952fbfd8e51422cc8f96ce9c85e427c73c9b4260b2f553fc4540cb54cc4279515c66fa0311209489eaa2b5bc2ef180748120712103c60d0680e88373a4b293c479208ae6bb489c4a9b2dc8237663695758b49ad171df0b41059b75df5dcc30fc9cf8e6bd9fad2850dbc0bc7196d5cc3603ddb64fb53d824cbb8980807ad8bc4b6c5e898e83dee3cfc74cbcaac09b709317bf3fbf77e2c39ef9a77ab5a2381a7ecd8a822c403d1a48a0992f84c05558dd0539a3f06bf9ea9244d0403e3c37c3754627f0c81a73c7715111aac9150601bc7e30b563fa8f7e397575599cafe2620581c783d974450878c9208184b9b422ea2780eeea892df3dd6ed2d218ee973ea8dcfb595bfc94e7bbc6bd706de693389616f5545392213e029c2316c2f554539f0fbf12431c0d3c9a98a3cce9071f8811243e283df67bc25788d3c90b00001ab4cdb55b2f26521a6f71b33f8b94142ac5b5b7cdf46b8cf05ef6f41af28ae2bae42c90309c7eff436facfe3e7fc821d9fc4f173e992e179eab1a32a7e23661a787fa5dfa66a97d38ed510b0e8aeeb339ddc19d77516a2f5651deebcc3f502cb12592989bc253361fdf9254cd3fad3b08c9b371b7e8d8c87056d058fade7dae6d54fbbf335ebbcf7224f0e940464d0ca8f36429c0c2718940980dfe5cd6e7e345d1d1dc859db7ad3a77a849a130eba629a110aba480c250f7ed531339a930481eeb568f4fe34f1f344a8b8c4838ccc170ccf30eb8f2d7e65e5972220581c55190989ba5849a44352bb74b8e33c9ddd7ddef42b210e38ba6daa1b887852eb0beaaeee2844abefdb3d79ed9112f6ef43a52d2ff0bfda7830db49aaa08ae1fb9e012a013341417836c0432fac868dfb6663a52e998c037883c17b2a799db80df06036e0bde3008fc181de2fb1bca9e5cfee9cb0e43f42ac7867ee9913270a316fc347b316b869f41df1003f68c8fb84491ca4b262de2adc8b8a9e0337dedaa374f868f44482810705cec0cfe62f0ff07c84049c455220a0311572b5e19dfd2499004171d773ac2dd779ef36d9d13edb85e8d4bff7c45b8f93cfa6349b7dd25d09df1d56ef6ea4d7958111e0eb7973b8e483896592d9bfe98d4563c7aa5fd2018ac6622018949b099358a24a0725402e8920216964c474b430f1f3bed433d846c28504050809d9c0b8ea88db401ed09fe384019faf636d7e11192794bcdfbe6cb98ef895965f9a808455e5db70701422e7950a3611748f4c3f1b6a20204d58ed66b76d1fca38b6dd22218ebd7ac0ca6b5e17a2e5e96dbebea052c2fe38e5cd56d76b38d80a074b3f3083365e26f3ea1a0c9ca07923db002ff1c18f5e35681c35d9364c07bf4f05e56b3b0c9e0df0d4f7a05a6bc0ed1302fe40e2428ef4b19a9ea512e3ad9ffc9839e32c218a2f9b79fd74f98bb5cdbfbf7f03dce4176157c6e2c153fba3aa310090a7a9f6a5b166c9e3f84155cb6e1c347a55617b5fa9046c55914a0bf6194a22b4aed1c88e5e88404888419aadd74de5e77dcf1ff8e619723c0f4b3d6ade2d9240a786d29b76a98e7bb78971e15e7f06e378dc7a89fdbeaa7877c6f24385f8f0af2fbcf7d0003987436b3f22f767640018c1e7354a8475ccbb881376ce69277dd5aac37e8f6d4e4870fe1921a9e777e1f7d7db51d6f6d559ec775c1565221836c3b7b1aad35fbcfcd204048bad2ada700ed4209c23c7461b0f75caff50751ab8ffa69fa36abef15cf7e096d7b4296bdd5d88eeb3fbbdd2e72a213a0ce8f2e4f9e7cb4df942cb97dcaca9a11742e9cd9b37a8ca11f1d8c5490ce3e1533cf88be27e9dc87dd70178d90c5e36c073e0536d63d3c1efb36518085631b47b1a545c49aaa0eaff50bfcee520abca77b75c2125c1d259eb87cf6d21c4bacb8bc38bda09b1b2fe9bc37f7073419d1c9d100952013077c71a20e4d518498e5e2aa60389130ae6868b1ca2cf5f9e7174fb4d97eca88aac6d7f56750ae43e42552d7921028344eb1925136cc7ad6bab87f559b3c992efb8b17fc7e3e43ee8d0a1736d7fd9df961fb69978861ce7d4caf45d47ac4e5e051ab7de62a742746474b4eb7cf0e584ff5e7aeb07426cbc7ed588cd2079d432af218a6b401b15c63540bb0a02e55045c9bd8be88a602d8d6123ca70f63bd6364a24cc1642073c12166e8b40c26070f32655145799fdaf2118bcfc5a08081647557cc385e046ae14f0d622ef16e4e0b0c68d0684c5c7d1dd0e6dc829e3ba0ba7b6489bdd649610873f7ff42387ad10a26ddee157674889a5e9a52d7b1efcbc7cd79d69fd9a3f21eb05a9bd5db76271ae382d66244d17b70b298358d789d6966ba65e635d163357cfc4ce58eabf6fa31fbbbc9e351d7d73a01c27ee73793df97b554055261ea68d1d3b4e306f98f8a3a545c14868f00d40c88354227f1400d1528a93e9640c8d7d6e5d690d72554c91eeb52fbbc6ceba3135356e246cedef6aeeadb85b888a93767e503641884da135976ce821c44fafaf1ce0065445cba2371087851bcaa0cb454242e9f499b7091110943ce0ae7a327aa34a04dba7eb9f73a324e215015b0aa620f1795519541efbbc38aab2c01d3934186a201cb89e7d9209aab8205e240dd63512942693a18608658ca3727f77c83fbb7ed05eaecf76e7747a24a3408803fe79d0968e574bd80fa51f71e005f25d57a655bb0c53a87d685e6c9fac1617c5d6e36a71ad0b6377687b97b5f2bfafaa26f4f902c697e21ed046850404558ba86a646ed3e8d6ca0908a98ad841baa72a459f0462806bb2b9f822ba79cd0810ad2b0e2fcaf037e0f3db2fbf360282c55115b78dc091e88b64a774ed2099e0c6a30d88f524f81c2384e1ea5b4af3ce3842dcd0a87a203ca08d040efc9de880301d509e1403c54efcdc2f566cbda9df151827f2b31bfac81889124090dba3e1c6359e769d7bbb90b19271aef5f83ecc5d05d996f906ffc5c61bf0b0b6400d0c11caa674632632486c5d23e1f0a970e1c2b42613a1fd28fb1d3cc709145d5b10d26be6f6e071dc502301a13bb7d1c681b6282424a8620406006d56e4ccc024443a786df6fea8d8b3e2c0efb3d8e700df47580ceeb151ae5ae370b9e483bfe34e00765258ff064bea2f8d80a184551505fffb7a68a36da41e099f03356c083ad06003920a05366064a0aae9c22048934c04086be00029d0110906236016a45ba65c48904c11d2047a0707271c581219437fc1421bc881f69dd0fe5055f519f0f965d0462323777fc47187f18d407a6a1e7055cbef35b8873d87aa29ee1f8fb60d788e0e80c5806f0eb47f2dde2b8eaae8a081839a0e1a94111f60cfc37a8b02475f0f1c7e3decdb08ac331cdfda93549d066d92d4611e8880601be0e3bab6eed4d18ef685f7fd0dde8304e478a8e1fd35f03e5235a2c4c19c1de8aa55945819e72eee177b548c84e633f61caeef0758db81f619faf74420f0f3fefae7bef7ffeadc6cf775f9b54a2058d41546640be1b612baa0894b26c8713149220db262a68277174a22292c9091736c248120e140a328e0451120889f8960fc468a89e38a425aea7abcc9112513ee478fa91e78ae206ca36482de52dfb1e7b0662a325299e1c6e64671201ce2661dff5f5d715485f122dc7984d617974cd8ba4e05556c1aac677e711aad6b6088683da35718638cf8b50bf52c4e069d2188016092087762e0dffb22aa11be2db4b2c792475071003e974cd8f77cddfcff235134b6fcda090896b0aa9879db8b0076544d073c2728b86160a3a5409a6fdc70c499618dfefbb0517d2a2cdc70600c251516120e5b47ffd74a507c1b83d5dcaf9e0e6c6efb084a01c1b2dce24152f72c7c0e048908467ff67ee61f6f348a23e108881cffd594b0aa685ddbd0b6f49ae2499071428282eb783bb471fd1a6c2bb4aeb9ea0a094936c30f19049c4f1637c1bdaa7ca93d3070ee741d8e31cea1b1c56175234bd0faffbf12547e2b04841747559c83f3d94c70232201818d4784856d241fc1e01b0d37f4437a5b200119ccf0b493e9ccafa038ac86c28dcef5ff85cf17e9df932d020ffe00b7c7084b3181924994fbc9f33aace3f98bdb367eae1256156790b05f5c32a15429b85e0d0c135fbf21b6fe79c4bcc5ce036e1ce671124448b8a4c9920e22e1f125a774f4cff7f8e076f6f2f7ff57f6b0fc56090816aee2823679baf7841a0f7eb8e8c5ba03da904f9f36144814a1f17a9b366e2fd606b74a52619da2a3479fffca4b14dc33c558f6c538fdfb285c901385c0309f3be42068ff57afebc71a3e8700d1e8013a1cb26160bb98e1395cfffc7f5de10c098c0724bbf1d61facf310ae532619a3b797f51eb4c71bbe5f92f8bd34efc83030b757f2765bc83e8775500fb632b84d9f728b91ca2a47fc5ff94d97ff170000fffff898dda83e6a16740000000049454e44ae426082'),'image/png'); -SET IDENTITY_INSERT BINARYOBJECT OFF -UPDATE PRODUCT set PICTUREID=10; diff --git a/samples/core/src/test/resources/db/tablemanagement/V0003__R001_Add_blob_table_and_data_MYSQL.sql.mysql b/samples/core/src/test/resources/db/tablemanagement/V0003__R001_Add_blob_table_and_data_MYSQL.sql.mysql deleted file mode 100644 index c8bc9fa4a..000000000 --- a/samples/core/src/test/resources/db/tablemanagement/V0003__R001_Add_blob_table_and_data_MYSQL.sql.mysql +++ /dev/null @@ -1,4 +0,0 @@ --- Rename this file to V0003__R001_Add_blob_table_and_data_MYSQL.sql.mysql if the database used is not MariaDB 10.0.27 - -INSERT INTO BINARYOBJECT(ID, MODIFICATIONCOUNTER, SIZE, DATA, MIMETYPE) VALUES (10, 0, 72861 ,'89504e470d0a1a0a0000000d49484452000000c8000000c81006000000fdc872dd0000800049444154789cec5d077c5545d69ffb92d04297d8404db020c15e028a9817052c5850888b65dd447445d85d753fb16b6eec8a5d41455c13171509764511352f7614ac80080a449a0816a4a4e77e73dffccfbc37e7bec90b5d77f7ee6f3d9c977bcf3d77e6cc9c32e7cca48aff5d9b731d618174f552c00114f9cda4db8bc16d754d6ee67d7314f0ca4c9cff3d00e76e2a63ffbbb6e945726a9343926b7e5fb2eb8ccde26ae32f2e7fc92ec8b3677b8eff5eb6a98cfda75cff5320cdbbc280ae024e1ef0df003b00ee88bf17b3e7803b4e92f7d0c0a48976de46f2b9b9d7b30a786e92fba6e0be29e6cf5e2efe41fcaf06fc1a10dfef95031fc9eeffdfb56d2f57012daf7451bf91bc925c5700477f3ad4afc39a7e8d83f78803369ec5cdba52009b29d7de7e0a3ac9e49afecec6b357847f2479cfffaeffd42b0c185180267c0d31d042c04310cc140ca054086cea4d0aa6a501deac608b1680b798b0654bc083016f05fc50c156adb60e24fafa7dc7317e5a327ecfc6f7bc0f38c0fc5efafe941b01430a866e50902620872bd4086058fcefda1a571830a280966718425aae8f5190fa8dfa3120d7e8779283160301494e3e5050cb11c9d5ef55ae312e699cd2b8b5c935c97340aea93d49ae5dc0b0f80fbdfedb3d9030a0ab80f62c4820e83e36e139c702920091e52205eec4d20b96b56923c49ec507cedae502299cff6a35a0ad540ca9d35aeedaee2d298453437f4e4f9737f7747af802e81ded558b1931961c57fecfe76b77d128241daf44acf7ffeefc2caec02d51e8fcec98f815c0afc07da728dc29717e32bef97871a46f29354ca83b61fd7542d416d7fcb6f63221aa2f5c377eddde427cfedadb137eb84b88f7d6bcd0a3bab77ac4c38012cf032708cbcc7b0f1003cef300df357141f7870129a451c1a063d2d70ae67f57f3aeb0020e6f573ed145f03b148743f046f3795fae8767de7a48468610ed4eeadca5f34572926ddde2fc761ba45ca7a535b693cf39f3424b5bc909dba9768ac4c742349ed47843546ed738a3a3445a8a1ba372bd9b926bb1935807b96f9e3c0bc8b31e07cee5d1fffea4f0c6eac6f7ebea84a8ffb276e9ba57a45c2fa89ebd6e9d10bfcdfbf9e835ff924ec8b47bc6af947cff72daca168d6f290a24d75a6e49de489e09f6078422d1f24d3064b62f89bb9e40e8776a6f1790f03fec952ca4f29f7665039242a009cc054e03260218e781b4bfa24b17e71d212e587ddbb85e6542b46dd3b9e4d46952213c99b2c721df4a6ba45de8f283baca7bf70a3dd8ed1ce10fca637c0523d54104ef54c336ac70e9d62b3c0ff85c312a8af7528101f96b187f575c8515ee54e86941e111e079b83fac70799f8bbb8a814780e7a9f703cf1379461b79725c1c2dc11d8d5d974c9403b35363ff05e3e5803cacbacb872f09b17cf477e35fbe5d8847ca479ffacd3772c05e52bbccbb5e3dda08179e42548dd79b38b9f88d6f037f1010fdc207a61e6080ff5328962bac80291971bf931cbb0c9713ffa90ffcada1cd1d52ec86f46dd7f74839cfaf6bd3ed4cd9dfa195a18b7bf490f08ed08bfb3c296fbed2f9a5c3bdd17714c7539352a4702e7f2ef062c24d794b302e5c3c077a5c7e03f21dc1572a7a118b3cd3f59e1853552565af5bc3830b779306d47d0d5fce7f5488758dbffee5f97f08f1e592770ade950ae3c5cc07effdf967f5889647926bc8ad96732ecf24e7d7b3e7c38024bfae79ff1f57a1fcb72890b0027a8061f1cf41ac375e6174fba5c7d490b49ccf9973dd5b474b0bbde5fa36a9674b8590727ecab24172a089279d3332e6c64dd0d910f0af930834298e0a61d87ff2bfa448e6021f053cb1e220dc351587c68bf1b5f9186853028ac4059fc5e0d3051d1e096ff2f2def5fef2a3b4e86a8baac3af1f21c4ea51cb9e9afc8c100f3ef08fbf7c78bc1035876c98d0d04fddab0718065603299ca1803fe0ef3400b985470ac535effbe30ebc2d746111376008f1d0ab84e7ae2aceedd041883dceec396cc810e9391cd562c8b07952417c18fab4ef1bf2a6a39c375adc6a18244a1e36da7031479be32491b78d378c22b82b0fb8499f29ae665fbee124e5b2e1a086215f49b9ac9eb86eda0bd2d39efbf6870ba64c11e2e9cadbce5abab7ba953c98c646402886c6a31524b9df648512de28ceb7e3f59fae40220ae8d014b227686085fe2ec45f6a6e0c771c2c3deb8f7a9c34525ac2a97f4d7bfcfce1f29e5d9cfebb2d147605908d097f0ad4d128780e6e12cfc1a600ca809fc13c94e2c080c157255554a3807f0d3c8caf570331b987b34957e3418d177d5f2ac4fa9fd69cf2c47942bc7ec0e315fffa8b101ff678e9a33558e3696800dc17cf9c0e9c069acdb223c807de7fcbe26518d055c01907488610290c2909a3cb4a2e3df06221da7cd5eefacb5e91b2fe51ca8cc1f7c83f5ee3bcde6a4693868c033c0cbc690fd8c5046ef3b08b418f8d8b0413bda2175030f04c2a347d07385a63ebcab39c4322bea2a89f5a7bd4fba942ac1ab674b7717244dd79eef997bd592f656f60e3cb0d4ca1d41f059c0ca5a34dc83d1aae58fe381e77687b33b085afb0027cd19bf4a4bfe670f6e1d7f56ebf548ea369cf7c75538a1099a7f55af7dd04e96134a6762ff645746771acaf38bcb0a7a81509356d45142e3b55e1655ed47e96ff2dc3dfa3dd2def8a44f172747f44e15e2ec3c3c0cb81e78b223ca7dee32a5c3e17c6730af78097030f6bbe8a0c3e87629a21be72357de253e1459aaf22834f21c81edaa82bf479e8a1dda5c268b7a4d309d74a4531f4c54bbb7e768a103764bc10bee66a21fafe6df01d3b22aba7e58b0aa66111360db1e894774d18a2c5784c0521f295220ae829e23f35add25540875809fe4941bf5d464f2e2dcdb95c88ebcf9cf2f68b2f08913ebb43c3cc41f29e502832cc4ff2a815aff98a2320c7246f618d73f950d35b4cfe144ef2e7327a11462fc2e811fd987c937f69c833d10ff01b93e748b3f8cdd5fc6e923cfb8ac897bfd43b5aa4f6930a629743baaf78ba8710b7674f7bf46de9698c4effd7d7a79e2adbf9aa50eb5658b40f2ccad3623cc937d65242b496fa0e2019ba11e0866afd3d5e29db9b812d74b90a38a50ccf5230243be8f2034abf3be61821323eef5659faaafc2d2b74f219afc93f9e25766b3922cea2c914a6055608fda32d1ae0b94ed4c2971e880a20643825782e338ae7295c3e95a99e032e804780e70177912c59a83c1a892beeb3c88557b87c2a8ce7b2705f18f765197c4e15e90a075f64c1656a3e155ea8f9cc637c9a1e0ed1dfc8cb0939bd5b494fa345bf56e123a402d9f7829cefcf7c5888bd871dd2ed2b69817d32e1f52f9677c5bde729187a023838d1592d05c023c02bd9cb5e05244552b2291cff8eae88024e21c3e5771714dcf846875a214e9a72d1f0b1b365fbd6b5aabfbfb3fcdbbad0ebfb3c1dbd2d4fca52bc45afa8c42c7a856792e50fb9ce0bc8877a2bc94725f04cbd96a1e86731fa25c00b40af447b382506bde41eb5c96f4c9e33151f49f8ad60fc4634bf345d6fd2159a93b27aa72ba4a1744ca7f5833b0a71ccddc3e6f6a91662e6fd6fe4bdb45688ea97d77f010e63f28c7ea47989feee3039760ad8cbe8ef2e60647338df92d71f5d814414e0032c24f11da675ede47b1c173ff2f0928b074b2be08456a32748d7d2e928fe6ff7cb842f8833a3cf6eac2b4c782926d47c087819043c4f2f062a3c4baf4144713900159e093c160250cf459c3151bc10d3656c00293c532f5e2abc50d32f009f0acf56d92ff22b2fc7f7d173cde3b3c49c789c32e0bd366fe039739dddda48cbb8d3693bfd69b0f4040fab1d78defa3942bc77d0f3fd67af97377c2c9ed116363c0fddbf61e018507aea590c380ab084c1c50cfedeaf8802da838e33844666dc5bbb4b8d103bdd97b5f76bf2efa191a15927f83ded4849f27b46cb99368894a14172ed3043a3848552638ac48de25a3eb421a30cac126d6099f42a809362aa04bd4c162a73f8b8b018709c5f32e0285416534c8c5f2ecfa6e1a5e955f2e97bd3ae94dcd4637797be50dff5831f3bbe95103b7f9ab9fc0be9617f59f5ce0d3f7f2af0c980590c87bc9342d10a02bf7b7fc17d6c9edbfe06d21f2d84155620517dc60e27ef7a89ef1a5ef1d8c49b2f9396e8888abbf3abe4d499724beadb779e246fbac2dba7e521712e385c5dc2c9d5952eb4f1bbf5be6c06c3faef70d1f573b98c4eae41c705de53d309b3f787d9fbc38ccf30a3aff0fc24df97cb20bdcf765fbeca95dadc10175dcefdcefc96b709d165c7aeab6e7c4f88bb9e29fff3a27385b83a34b174947c93b3a7f36afa27eade361f2bd8fa76055ba2ce200da18254d425a4a0f092425d8101ea6e0ec75bf17215e072ed7fc788fbef7978974764bbbc30e9dee9470ad1f9c25d5f583a51fe7181d3eb9056861c303913a69c858173b9e6fd6c9563848838bddc24e3c43ebe368d5f3bff4d8fbb00bf0cdfd41017bb52d3d21ecc96f27bf0b5c7be37ed2a21ee5835fd377fede4ac4bafbee4f057d43de92a36a0e5bad5f10a527d4a1ae45b87bc28bd9a0c0a2627342f6efbeb8fe2818415d01341448190b43d8e4a39addc8f399ed6f9921f1f9d2f3fa943eac4ffbb2cfae7f342c3e35cd60258f8e3d00d8360afc203901e45a67a9776b9159ec742539570c15d71a2a2a7435cf9e0d1e8d69845c72c38edf910ae426222839e33435c01d7ddc6a70bbc58d5b54b5c2df2f31017b71423c00b359f59069fd92a24e6ccdcb2212e7df51367a7ec2907d5c0f61d730b8438b2f4d495bb5c29c4274fbdfef67b7200d6fd5253438b8f3a04e0022a0e847707f0b180e094f2ef7588b3c07c6ebb5d78bfe6ab44015faeff71cfc3693d2609d16179467ab954acce0fcee107f96b46310f7843f4e67c27fab53a6444728610a8bc2f0ceaa62762f5b059c888cbb14d3e329907efe8f45d176f2f34e8337e93876c897e9210977ddc317e81f390dc9692675ca12f535674bc54885dd6779f709a84596fedf7ca37c3849875f3f44796eca5eed11e495e621a7c319df2ceb45c43b1e89e5ebc25386fcef57b5720a80f50c12661288ed39ebbf895f4b652d31fd3bfdbe4d6f2b70ea1be43fd18b86dad8026e8b0521c7a82aeb4645971973b8fc5564b31e0b2a13866824b5b6880b2aef400c18020d73d177caeb684b8f800d4316c169a2ad4aebc7aae1821311ee2c2341a17232f60f44dbc140561f92a241608716da1d8325d2d3f69dd61bf9385e833e1a4437b7e24c4d7bd679c551e1162dda45f9e6df8b3ba470f38c569ac9e84f6682a31a107c84362db3cb4e5323e4a14f0e5fad2d327bc947385b4521f68b7ea8db3e48f473b3bef72b508aea5e5a2ff660a55c6aa0d01c859a596b3e8dba49c15a8fbb4bc642a26f85a1d8d8766cbb1a25702fab15092a25fcce8050c17d02b64e322a6984c7ef39284e42a412fb399fc16b0905c1e70572bae4ab1052ea79d33d0af70ef727ad76306ad1262dff29c65cba5c73163c2ab777efb286e2295b5185071a04358f4bb561c61866f7345f27b5720aaeb759ebbefb2f51f77eeedad4608b1ffcbfd4e7db1a3ff5be8bd81fea2a17d714de13958a476510f5d29da466120b64a038759302e048b2cba7c65014a8f661470d0c180cc648be585164f42683cead1480f643ff01dc673598c4f12b330eecb32f80c93258745fe584cb8047f570ab0447b380a77816769854a7c293c171ecd4c78343cb6be9562cb69b35aeeb0e7b1421cb25fffcbf6972a7ad67dd3fff646ad1035376fa8e079f35e4fe087038f002f31e1761b706410d15e4ae0c3571c97ecf6e88043d709d1eaa3f475d3fbca1fab9db69d3a095feec860898057c255126f3e0ca29842cf54f7b1fe136cb1991b44b1fa8a02e08a5e72392683cba45fa80db002f57ae6f1307ee3e42fb3297e35bda007a5e871c32819bf31c55a01fa61f06fd2afd49e378dbf4dbbfa8973fcecab8e13339e1d203deb1ee71cbe6ed92d5291944f5dbe00c9247c2d84d27ff9da87a738b57b245bfdfabd2a90b0023a0b474e1cfb1edafbdad41be53c76ceb09d9e901de0fc14aa3ce96f22e83904f3da155e06415985e18bd08ef624b82b6fb7e894a04d45b7e5a28069a61660d322b765bf04b355c6814f2a2474f11d8a6f872d9697989e439ca7021c218e6215e210b49858c13c9cd8402b34db8185e22a40cf926da62dce2c66d1966c999040daf72d4ede437272e84e037aef2e3d9077339f7bcc27ecbdd158aff3ea115bf6bae0a102e02ef00860097e07becd1409d56d60b1df571ca3fefce02b7b2f971e47dbf69f4cf73d8dd9cec79d4e8ff3282bd9623059e6b92ca4c843300ef3ac2bf5c4e9aafb40dfd1868732902a028686a2c72bc8b35808a9c44cce207e831e8e85dfc266f2cb43ca4e52c388f31b01bf0a2f481c0a0ef0bba543b65231fba1ab8e6376bc3b4f52ec76fc3e977ebdb3109fcd7beb8325efe29eb002dee326d4f24b38c1c59ab671dfd65b6cffbd2990b0023a0b679582a1ef653fef78f3fa3183e4bfbd50bff3a422117031a547607a0e3aeb435be80a1f8461ebaab45ba778e3d26c039e43bef268e4b49f0b5c790e2c7416c767624f2253e36afacb09585ec4679ec1676c002abcd0f41c4891c8e7f603fd30be2fa1e7104b070e588a0a2f08649b450c3e93a74f46f0f6cd1a782d17b45edf437aa087b43bf6afad3e948ae4e5e71efd4405e9627b735d04e89abfeb104026231a062c002cd91c0e135ca0ef4c0594beef79336fbdc9df5baad3e89d2e8ff80af06ef17ad737a3f2a3dac7b69641064c2926eafcc45973564320e0b1b290514c91287ac90d0d538e89bec3c69f13480736e83797dfb82c3193dec61a46997cbe08648935c9ef160bd91e2d3d923da55df641d773fa4b8fa4edba0e377c749b105fd7ccb861f549ea16ed81907cbbc00b184e8a2413300258c2e016bb7e6f0aa444010a7e84e440bbe41f8fb61a72bd64759fb49bfd6caae8c4e78b5465920a59be15020dc4626ed1359dbe1ab7c80e41043e1591ec5c65bf4a2f4929289e665b6949b3e5ae760ed26e2348bbddc834dbc000c947086baa9e284ad47396e48042aba5081c21c01c786e1116e2d3138f9e8e1ddc17c67d0ebe07f8e685b8dad4b49f7ec8fdd2723b719f31f3a649cbedf5b71eada401471e090d382a557381534cb988118d009630b899974e3b960651b7a77bec9422278a9cc8a04e9356c81f478bb2c3e78a449eafe2b632b0369519c57361c0d8428a3c64c4d70688be635bfb4abc961833882c86464c3131fa01f9d8347e631e2fc68596bf84fc26358c821e8e8bfb0a9be4770b876c9dfd9d65fe1ac9ae1bf67ce3882b855878d897535e953eff2f7356de545d8d9b10b2f588a3087092ef45c04b80937c9702d2738b3787d3f8ebf7a2405c05e20b6d865f7d5bddce774bd7fe938e4fbdee87ac16887e7e419ad5c58c854c144e9e0362ab729a3f11ef52825c8a8167cbce2041a9b4780ed9ba9010d95316cf2116c3263ef3189f0a2fc3692083f404adde53c806888d4f3e00a712df1b991c602bec2a80c22b43b2c0c62eaab2ba15f9dc68d0d9b463861c650b7629df7555df3a217ed87571e3cbd2725bb9b872ce06b5ba151b5805c049a1ec81df6940d2df29df3e0f7fa7cd37576d128746e19f7ff99ef4f9d78c993c7aacfcf7e9a13347dc16e74904e5577141f25bca4230a5f8aa0cd433e9898dd1b37bd6444fd18f6d1552095cd1b31b44267dbe56e268f9a9041e06fd0ab48949df05fd2c6d6025e437e6f1327a317e2b8cf6284cc22f85fa2c1e9495df606859d1ab741cb1195768ef942eed2f16a2e7b23ec7ecd1284568ce336ba6d7abbfe92d7b4a80ff85c14cfc7d3120c97744c12dbf36b2bd154858019dc61851c0df3a205c3dec9f974b8d1aaa09650cf0b7baa0892e3621bba0014bc1e262566a4f42ad3114e318a3b0ca4ed2169760829167f11c08d769948a9e54001be29fb3c7b0399f68854158944f163a13cd5c83c8469af14c240bc442020ee887f19cc263969c83b784711f2c47840073b445a8ded3dc4555168a93efeb055c29cc4db4e09ccc502bff1c889dbfc93ca4aab710ef2f7ef1894fcfc41f6960e55a6026eee303d3054e27ed453692a93078c380f50da2bf5e7cf79cdda527ddfac1f405cf4bc3487cef94f869e601c5cd437e956cad81d6d0682784d57a622b51cf594330067dab67ad4359da63b51944d42a26bf2cbd564a8fcbe867a2554c7ef98e08b6f4dae09a5f26e337339e5fc7257963ed51a2e91780be1b4f3f29bfb68a7a9a1f36d32369d9adf569ddf714e283da97de2a95946a1757fdd688ec43ed41bbc01799bf6b1c7f0fc82fbe68f33d91ed5d488845456a087f517178e11d859997cb0eb83b943ab23a5a2814cdadf18abc0c752ff09e48d61c0bdc53b8bc4fe161e03d919b33dceb13c5fb20d973ac17567f47415111f0b0898bb1820afd143e12f840a22bfae07dc467b681f7d4ef233eb34d3e9502f22e1543f15cf43bbda198d6c602efa9f7fac9c073268ebdb4e4fb543b4d10c38def9f8cf7802f79b7c2f3894f4458476abea8104be1d9f88e22c6674f85c7f13994f1893dc3c0d758e07dc047ac7d894f1e586ad695f1efdd479fb58310877bc737ec8182c3560b0171c0508b73144cfb55413f29c3bf42df281838dfe53110cf6e2613741fc9356dde29e5baed9c8e7fbdee0ef99dc778f9a9efc7b707f65443bfc5c92fe480da09f2ec01773dd5bf28f0f3747b9bf4347dcfa42f9f37c707d1efc9e42e6cd297eadea43f99f15b64d2a382bdb8f1c6e538b17c107dd61eba00d065f4c65ac685cbe88d34e557ca5b2ef07093fc4e66ed61e33726cf54b0b849f24cd725d5e32aaf951e8833cc59d11a5bf5b47e59413a80ae05b2b7b85ca71cab6008597f0ef6a0d3f2b9d9d7f6f2405c05f46ea2ca691429ef48c36acc9f163d2b159bf3b2f3dbbefe80a6900c59fcb00bb5c59fa32dd90db88fecc60db84fe1678a5fa2f8550e85aea27469fb0b692d66e277013a0acf005e067c10a8ff13ffaa95ff13069fe98ccf74c667bac127e1d761bac9c722ff6850c991fff371daa6a358e1c4a7b4c072189f0aefa70eda9578187c636f2cbc370b7886e6330bf7115f59b84fe1282414fbd19bc05719f0189f198ccf0c7c4f0eee53f834b45f2f1520927406e1fd8bf15c41f4f766a64f86e6868e6bb59310ddafdfffcebd3e95defbc2499fbc7110fe488b8b74fe088ed2d5a12caa1ba1b4609c0def41f1e8b62e698a0311db5e1d9bc784ae10e2c26fee796d5f3905b65cda7aef470ef16939e3fc73389ca9d46f2804a47eabd4f54a9003edf9a9509f8bfe58a5e439ee585ab437e88da1f6d65978aa7f4ab52429fa65267d87f611cb31e54cca2bc95986c1ef203cc1e967805f0a076620c443f40b997c4cb5d02f34db234e0a329be2578f0bc1f9857c825f3d5ac3144283fc717e07b1f6b0f19ba343d2617ce7623ca7e86d645662eb5e6d2bfd7359ba8dd8a76ea91cd19f3df0d6238b60207998e93c54b87b3f02c213a1dd80057674f090deae0b6d0b0023cde124d1b59d14885eee2e51c08f0d8f68bcefec7ef283d3c6b6ec71bddf00d95428d574819e70292bc51ab3a41829290e35614530b02a2d69b622c9e25a2c0f5f85b0a6b2823d96661b17322860ef53782e14de4cf065cd26e17c5a43534ac1165a425cd64d1dcd7c7c6fbc77ac7fd25b6d7df5aa5f779122735ada9036a31384b874cc197cc4d68c1cbccde433072118969e2978b6d946a64fb6d8bb55763769b1b5c86ffdf9c7270831ffa5992b7fa42c2d3a10687740da5e1b8a446fabbd8709b5d110065ccc5e8adf75c80a7ff743b1fdcecfef30460e6ca7ceb9d8af2497d20c4388cb970e2166a9ef27f9e56b72907f92a7e2666e92e830fa9516fae84f6b882b58f1eee03e937e89a60ff9481ce2b28f374b7b8441cf16e27218fd60c5bbfabe2c8e379dbedc5c7e25be58e19610d726662576d8a3cbfb590572ae7fe999752fbe2465736de3127d901b9d4b028fbb118650e3b90a9afb1dcbdf6150e942d64dbeb6b5027115a0652682fe59cc7d1f3e7d8f47ae94c8df9ce3bb0f8fb3649215e8553673ad2007b6046ded51890aded8449765e0c9d2295d780ee3b48554c8f8cc637ce6313ef30c3e4991f042c264e9c0b64ae16226e0c9765565f9f8cb977c37f35d39018e9f76f9f83ba50bfcdae0c786bf2227c2da11d5dfcf961371e617bd2a0e90967ecadc947fb43a41d8d78c2c15efda831c048bb9b99b3a264f9f8cd62677b96bd7e37638540eb85f9e297d13e73378ff5290ce19a181a4cf6bd8ddbc4f57b6e7c67f89087a22c0f562b984e7e5dfbe47a684ad32d3873df2bafcdb27ce14ac7960cdc75291cd176fb5a2c677c310908a830a6351cfd4b45c2438f0c955efb5243bd8924738bf9516fab4d8ece8f180fec3df5141ee7dea0da9f70b275778cf44dbff48a7b79fd66a6d8f40d624537cc9f8658bef0179b3ad51062ade2df429bd3db6f6c2f865f2eceafe85f424be5217a6eddae9342176fc7eb7cf174945f0c5b28af98b17abbfe903da48aee95c1dac859082d16b7f8b18f102c048531c24bab6b10249e4790c5f3226fd40e99ab538a4f5c5b71f0f01f4bb86b6f6d8dc023d1a1865505fab90764b27fff102bd98001518efe3e994a5420599b2e1d190e760e33360d16945a504bf0016799916a812f099a9de9f24cd962d6a3b6c7b7841969b9e4098e78001f853edf27f7f76b7100fdc3f6a8f871e16a2aa68ed71d5c3d4030d3f08f1fda3732b7ff4cf6aefe2a52f385b883d8f3d78515e963160884fa59878b619f13988da178a5c0fec24167833d3275b6e685de1171cae3ff9b7b96fcb81f3fd075fafff15e78fd8065c23290e0a0150653b425ab6cd18290924def3387a7efe946bbbc9df760cbd78a4bf5545cca3863f1450ac99eabb9821c417c72b7532897abe9879e836f97518fd4a6bb24325e82b7ac1745d93df589698491f8befbffe75d59b73ba08b1d0fbbc6e9a94a70fc6bc745a991c3191479e29f6e1d457c6ffe519d9ce150b262ff18f969d77e327d3a73d22f5c9a3df1ef1ee5eb2af4e6d9cb7441a982d8e6b55eb9f0fd332adcd313b0d13f6ac2b7bc5bb6a0fb6f81e935b3d2e98bc252d1730da63a3b32737b2e2bdfdf22e37ed2447f6dbdf3e5df71ad27bc9d3d0903c11e6a19047ad3d6f78269b9e9db5ad1488ab802e1044d3443d8f6ea77d769914b0d017a1257d8e1031019c89b4dbf06616e85187c60a0915ac4c1a322901a6048c7b0ef9caa371c66182b61412dad381599e3bf19db38969b6bcf2b6580f1835c16469cbcb059f05a01fc5ebcea969f5ebc542947e77fd2f77fe24c4bad77fb9b5ea35f5223a71adee1a05eba70bb1b870ce052b6f97e4669f5179c233b2ff86a53ceb9fab62b7e4b8e5851060a13e39d1453b1434c56720dd9314ea547542a4549b3be2bdd137b77fa5f3e55539427cb8fce57b67dd8defc191a30dbb29a8435a8d26f44600a7ac977062a83d6aa9480ebea3fff8162be4eb67ecdf6ac2b5f2c74b4446dbb651c5617aaa95a6a72a5c9d9e4bf216c1f7e7c57fbf80a72615c738e06a0dab34a9fc2a7af61d1b5ce0eaabec068b29776c2fb9eac675bb2ebf40888fb35e2ffa979cd0260dbea572f22742cc7de1c3590ba442fde1c64537fed44ecad79c5fe76cf017851bc4f4fa057e238b37ebbacadf1ffbe57d7f7bffe56bbe1bff93f47c67bff8de937e9dcf8737bff48c5f70997e4687d3174ac5dfa5a1eb375972fe487d256d40fbf64204f6e0ca4a5a70abf8d705b7d6745d458f57d4575ada23a6a82a403f0cfa8a9e6dcfb0ace6856cd3f66c79d68e52d2d7ecba7afadbb21d967e3e7fed9a2fd4df1ab96144f2bc7b62a843b111c030fb3de9b5adb3b05c05fc0197fde491e3fc13bb4237a4f43e7398089ea8d7939da8c74e34132e3b412f76629ac26327f65156959ae85d64a5509655849dfc579eec6434d02f4336d550289088de369af83470bd6db4ed64b76c64af94e33d31bec3463b683e3d337b449ff406bc48f1a5b7b7e6ed1bcb568972feeef8673b3f2c2dc41f462f7af89703a37f11feda877fd51e09788a823535d2f618975a59eba70f3ce2ecec677b48be5cc6a7cbf874f13ee293b27458fb5af8a476099ed4188df87a433d9cb06e5e3bb6dcfda601ef4b393b3ca5550b9c7c48d02fdcf2afd45440ca5ea16c2c828e4953af7590e516062ea78c3ea9a7f41ff87e344cb072a79de2daa327b50ff8f5c03fc91765156979a6ef2779c6f32e9767d0a3f6487ab29f0e6418f4253d17bf96030f1bfc5ac687f741e3098d52217fbdef87d74cea21c43d2dffbae09aa38478ebfc7faffc049ba0d64d57b0f62a056b8e50b01ab0ea4ac02a05375c01b821085f39e1e1fc0ad92f631a0a8e1c31497a36f3bfac79ec3bc9c780c69b7d3ebc64edc1e42d0e57e3c463f21666f42cfdc7db3be9b88bc933e7b7dca0173c3621bacad3e79293fe791c9d8048c71ba499509fec896c2c92eb106d0f4f72ed32d8ec6b1b7920daf38828e8bbf8837b5fd2e318f941a98569e32fbc4d04d720289b293f693e7a099e53b8ad10ab582f66533d48f30a0979c8843c876c58105370767386c573e079f396453a67aea2db785fa3e74fcc553bac9bbde40969695cfee3a039d252fb6ddd4fcb16f41562fde85f572f9296c6bab5bf5ee9c3aa9cb5af2cd9533eb8d4bbd08f25a7b44bfbb6cd6449ef84d08ea917f8efc31a8325c4b764e9bc6b5e3d4c88672bee396cda1baa7feabb2958d71710bb85d67604bc5a88d36fbac4c9919662d7017b753f4e0ee4384bcec5fb14ce0baf62bb052b0fb3d8b2a9a50e11008f2daa3ab8cfc4f99a19da37e5c4d453da4a8b37343de5e799d2a25df0dba75faf6cad5ea03d10e4d737c0b56fa0b512a44b36926a5a0c1811c6458587fec03c62d4a91baef50f2e7bdc396bfffde3da23e651b755fcd93cea2415deb1c5f3d1b86f83d11ec92aa66d3b3654b2f6b6edc185f1d1b053dd90f5526e2aae2913f7490bf88d6e8f77fea0859cf84a1abfa8c39a13c951edae800b14240552b30b7e27c57235f04780cf57b0ee6cfc0e58ffad7cffabf5f7fa86cde7bfbd3d66f63a21dafcadc379f3a4c7bccbfdddff7984348442a9ce9d2d2e4cd01e6c735289a9ef250fadb97b8655b2f9c2d5f4d5df5ded4134e9513abca25eb0d07226e1a647d2eaa3f4fb3aaf918afafd2797bd78a97a904257b45b3585640936c03321b9d79b912e0674c5465e5b5b81b80a6805028bcd5ffbe8b3eee409e74bcb2f549752dcd79fa8f81a44aea013f594fdc13b3469819e5ebb50f7bb586328463a60330bf4f4a2652973614b112ac95779dfce6a4c84997c20269ef8ea47d435ac9382ffe382ca3bfdf32ede2d7eeeb5c7e54435e5e33b4794e408f1c1292f9cf5e63942ccfc7ada981972c2fbf4cbe90fcfdc4f8859def4b299ab25ac7a63d1277f937faf78fdc78fef90f72f7af196e913249d82673f7abe83106b1ffbf9838fbe14a2ddfb9dbeabdd5b88d617b7fd79a7a9b2cba7a78c6e257d9d0df7af1db0500adca30f5d7ecedda74a7eaa6ae7d76260d761a06bcbb13606bb7dd7e328df823ff1ace157ddb28fecbf6b52f66cbbbf0886f892145ec56d2d8173549a9e38addbe1d3c4165b338ba01f9462c6c04b393275e755720a9f31e3d5c8e734e0e0f2375c0788ba8f86ef000fc57de4f253a156045f580a28f1d4f92dc685ce132267c089d3eef7d75a5e74be687b725c482a1ffc4ea5ad4758ecdeb6e54d3069840ca332f0906fb4472c0463d2e715d3961d1bf45a9f650f2eefee86e36a5e17e2b5d6131eb8f578297fe74ccb9b0f43a3a141419af0497eaa7756d07f2e0aa7019222a901443d4e0d14482d2994b3400f864c3de4b31e8acaefbf050fcfba7fe900c9ef4da1533f9d25c41e5ff53ae2b8e512efe0f44ceddf647b44bf3781e19285f631be3f2e09c1a44786512c5406838d19463cb4ce16f503fde7249ed752f74bbba9c3a7d26e1c36ffd6d7657bae7a71c95deb90ce4b21672dc7906fad482628c80b10f55500181149aeadad40c20a680b0d21b3507739d0f63ca9ff0d7e139de164743d5b04d7202a903595c1b6f6d0961813709be545965d31703a8276aab6c82351bcc4f41c028b967c0d82ce639882dd7d359f81ec97e8fbd6afff75dfefa44536eba8e9fbf8f34ed9cb77ac795c76e0cc5ba6dd31738c102beefaae66f5d7b233a778136b07ab0faa234f804de87c80d6a190a8de178c57bd35fefd2b567fb77ef59fe4fb96be21663d2bc487552f1dfae21affececd6fdbf9696da67d7be75ee6b122efd7efe9b3ffd4d3d5f8b350e1ab014baa2815e7b8f1023eebe679fabef950aa9b1ed91071d248203442b00d37390ada0f02c8d2bc380efdebbf9dbe12b0b3f2607d1f7a6f44d9be01f711c99f8cc9269e3d5937a8001d69fc37edfcd847aa0458471f98ae4dcd537dcd173a5102debda7c35daaf03e115e4537545b6da01a1d25c246fc2a38ee03b4c4b36960e3e26617b704328593a69255b2be04923ae28f183329ff47eadfdc37d84f8e8d1972f9d834a0b9ac8eb497e208fe45954fd49410a5955f701c42230290c4ad6a885e751831d05b4070285a23d9c37158cefc7c52fccfe6a956c91aee97bdebefc292176c8ea76ed3195688fbc84ed51093c1cc59bbb6798ade2bd90d622217fb63db8d8fc60ed3fdd4f6c5ef3e9c97fa5d4a49dbd502a882f9e89ccff0e0a9cd6f8eaa128b4a70d83a91e5ba3e83de358faba9e514b44926b2baf81e858311558b9429cd6f6922f77f4832a45ce9b87fa165eb01257e103bd760ad795a25e3cae8f6ca50aeac9ece84a1c65491e8237d453627d29d62e6215b854c16b54bc7bb14a72aae8a54a72aa88cf4ec467c3e2fa89d5d2025ad17ae12be51709f1e686270ebe51b6f3037346ce2e8ac8b9e7e0a73b7e3c480e869bab076c58acdaa5eadf0a6e4001da0614feac8745b10e1dbb6e06208ec05cfb92097ffba709d7de03280756ddbf6b26af918ae5b571138ea890bed3177323efcdc75ac75a646fac830bbcfe44c08f63fc0c7ffeb6c3fbef223d9a5b3bed729c7ff426551c4750d14eed393269c5bbc287072a788b8cf62dd2b1e5e655bc0f14c7014f58499ffe7d871f7b491fb4ebf0bd0777fc5c7d57da7813a6a23d52fea16008213bff2c72ff925ea682730151d9ebec24156a8b76734ed83d8e5f5e41ce77406015e47a6d8e5790072bbc893edf512171c57491b5e29ded7ca02bbe15bda16645f6fcf6339f2b7385786bfcc4111f97a8efae5fae60dda90a560f57b00a9be76c808221795af77f89e15a58c6be471effbb1f228be22700ee61e26b6f033c9ed191cf3ff9eecdad5e92bfaf7c6df1fb6357c5b507af201fca7644f0d891b7d41e3d59857ab0e29df09ec069ed4bd11b69ce634d54bc9bf4279bf2ccf9edda6eefc5bd4f56df9dfabc825caed3fa2b980205ede0e867078a5dcb33cdd330f8935f5bcb034165af660c16aef3b0107d469e72ee215223b678a6658f027fc2ccd7a125551fbc0af86342e5ccacc256762e62f91482ca053e4587a4541a6d6cbb7685e7029f08fc38b5c587f3b25908284621bd97f8c857c758c9bbdc785c8c02de127cfe5344a7ebda43aa57fdf49010730ffee0d5674608f1d26b0f2e7ef93269e1dffecd8495be28948bf2fa6b553bd42d037c4ac1da0e0ad6c092aac1d9c8351898dac53f9fe1f7e2f9bd418f2c34ac65d43eac60fd5f81e37d759840f52239fe5e07fab57b01d64a011db6f79f53df15e2e891f9136eb8d75f5348e9d4c55f7329d66b0eaa1dc6b1131f113214c5c8b2ca659b4fd2a98213a9bd11e21b05e929a658327047870c95a7477510b85fa72d5fed5c055c992fc4e79ee22e7f8de2d78f7e6cf37e9a108be67ef5fa8fa8a9afef04482191a781a37d1aa058745d485841da64d1f7ac73da0cea70de9df2bd8f38671e74b6881d9d9c8b42d3b1e0e31c3a5a194fafc2f7f1b5b97cc8277d5f31a337d1514ba8a728f993edaae885891eda8fe8e582fe14e073751697a24ffcba3abb302aef359f6e707e5821c48b550ffcb9245d2a8715eb6ac8732005a23dd72715acc1dfaba050c820d21e478d096b272aa8c7057918b094ebd55a8668c0f869d817b033e00e0aeaac23aa8378501a53537f2a5e280dd5eccffb1c32509a90a1f9a1933a7410b1dd8c6321f362033f03f34abe3312ed31cac04709926fcac2541ef68e783e1ff4c6e95099c2298d38368f297a537436a2c2295b7494f6008b417f94c1efd7ce57fe32fbdbaf3ffdedd402b417daa9fe74b40fc9f32405699ed05986b4f3023c11ed6127dd4c746b29103a4190425758fd4f9113dae1b79db8f4646971877e4c39cdb764f5561f83ccad3d44bade72444de4a59a3a6da14158e22d1708a72d1d0e545b7bc8e1a6fe32574f402a0db2d8dceac3194d69b56cab8f4af0f94f75fffaba355f2d3c4488c7cfbdf685623991cccd7d7fc9824765a72c6e58418a81424d3ac6bb54c1aabb14acbe13385c77da4db6ea6b4028e06a0a052c017c02f43010abe1f2eb9013063029a2daf780c3c2aebd1838dd079c16316b2f10a2a0ed0dd34e91aabced2e9d479fd943f85b9990a2588c762a403b299cd26c8bf5d25c66f4f7587f291c29b5dab51f450760995bd3e8ad5432d8d634d87c92fa4bec8aad3dc2a0ab4fb653176d4553bba4eaeb6fe544f2f98af28af9ea89687d8b7fd5af003c44c13aaa7f414cd91b0262b4058f0a4644f71a3afc85412baff163eef78a11bba8d04dbac16f3fc261c8e8ad31a0584b316a32743d90c22bd9963763f4d63cd180859ca0143d1a07a400686b13c1e8d9b7fe498fff268171f6c56e919c27ce1362cef3efdff71d26ea7ad4d3d462c2a7b58d2a84a6aa10d9a87a48c1f5eb815f69deaf17cd2959833c1aac5135c0c368c0c447fda4712890465230a45848a1484fe5a78796bd54f5ac10fbfce3b0bdd6499fa3fdaa2e6306a4c5b547265a89b62aa20d50686b96a9d8fa24836ddd53c8fa6f2a19b2a037956d8544e9bac58cfe18b615901bd80a485d597a6562713cbfa9a569b9ed657bbe7fc88b9f3c2b3de5baa535abeab047563d0cd17a0a6da15d2944aeeb419024423b3548ef495d24191161b9b6551aaf1b83ce15a193fc92fc409a6d2cdd8d5c35a4c76e629a2d4f839c03fb912c5aa4d9c6a5039b69b66196661b36d3f2d64efaf932ff70fca965e3d3c6ca37adebf8f3573450ea6940d01a024df0a8abd83055c12a0a59214d713df0f5879b90ee5f3fd5bc7f436f86e7307812fbbb0556810ed57dd040f763d5e3aebbb4ffbfa582a9776b8e7f6fe766a5259afdc5d312cb81e7436ccb95787aae968308e823a4005ca703e3fe58fab6c28706d281cb0dbec067bb833a1fbe0b146d0869bbdac041a84aa73b3eaba0aef340faa3bec2b1df9d0bc4c0acc238fecb59faf9641d3252fc146939758def41ba6edcb830db03df2fca4c7ab1f476fa7e9dae6bd0a3f68ea55bd3f460a6897b7735cef5eb7d3e796d6a8b2fa8ce008bb1e4a9515d904eb2a0c5719277521464d0604d442b0c82f0f4c8e3d031fc6bcddf35ce3c94ba6b193fe4811f117bff8c8b5e7d64baff9e77bc54df93d1eda1d3994d794936efc4cd336e14f7d8bce331f9e3e9ba113e8f9969f881798cc61de7b79fa8f7e5b86763efdb7726b9869c521a2fc9b75e83a690ac6342addc9a7d6d250512a86c0ce377dfba395e74e830387e2059ea006880f0fa02aa2760f5058109c533078c541f141356f727cfef36263ec9a7c2531b07344a8bf4fd6ecf9ff5e43ed21c58347be44a6c62a605188aa31a03aa1a79ed7aa2a6099e4fe870f54901e809bd8a419ae05f37a1ceaf47a8a0fadfe6dfabc047f595ec3e067568410ec486417573fcc5cbaf3bcfb8d15f1cf676693ccf5f9b89b52fda27ccea5492d5ad509d4a38902f6fe2ac9e461431454f8abf0c6b0d49ea2852af6931371ded4c8a22850f3082b48b293c693de08a63789bbaf655fefdde55e2b7f6a78844f5408a8f7c9851b13aa688c9af6950c51946667b20d02047876bb6ab45b1daeaa2787b7ba601b7e6c59f5e9f374fc26f56f72279a42c2b3d81d3c44da150a648f4446e59fcd68be0fd18a4ac210a491d6de281fbb962e17cc9f1f8e5ea8aaad5bdfc7071f527b366c5b547a0ee83d53159e61dddbe5a51139e989e94dbb0412f502705455ec4e9b3f9d1c26fbbbf763ea62d3686d4f24b8ae418f3772dcfb4d6e10286857125af50dfda8be8aec9485481dc2c1e6fe71718252ba0eac90af43c4b819e6d42619e83f440a890d028d86b6e811ef1396fc38cf113270a31fbf877ee5bd84a7d17290ef238aa6169d1c4bd810aa492790228bca2095e4ff83c764c96de5589210ddcc0dfe9f923ccf76885516b426d19ca813ee5ddbbe67ffbad10cbe67cdb7f841f3bf5156c6efc00b158b6dc728e595aaec2614971cfa1b91e4e446f633fd4c02d1367eadea9e7b569a3be4b2b0458647a80918536c5bc2f6ee75bfdfba139c76d481f13e5372f74acb07a3e310fc422b731c38559baac3dc8b22d33e9698f9a8f83a485858c5ff4db8693d7ac5a413172aa1f6069cf5aee69a2ee6b420add9247ae1507267af26878e5b43ee39e6079629cef1ca0d3b1a158ead8fbfcb59afa4beb667d776e5c7b700f2d28c7d4be24c7890d195a7c8f24f6f8ac1e362b90f602111166205b3ccad6eddb4648aeb921a4e599e43c7e3e6e0226bfb676088b34981b070f14f5fed60eda7308685c5de9adfe1e1c90061ea8c48d584226d95481ae36ddf6ec21828402f3f3c72bbc99d2729d3ae49177de244bac8782b4285d43212b4a5f24cf837b100429664c9e045314a49074ba2e06aade52c4627969d8a379f769ba34d0eb4d486b008d938478f4b4d13fbe2d07ecfa49bf0d9ee26725d92b6f9b54fc71e73c84d5733c04600be930cb90f032411e48583d9778e24cc94acb6b8d2c1e3dd0a8e29c2c35b2d0b006a5150d0d2c175052eed465e73dfdad3482a13dc67fbe0e9d8641c394db60a88f4df42ce4423b20b09046131e35574c89f945bf554d5877f6af385f424fd4344193e7408a84e4c8a228eaaf33ef6f2479a22f8242a076d58ac2b340b2f9c3a0430ae668461f38c9b9fffec661f507afe811d71edcd0d8dc0af2dcc4864ba0e23de0a958765848ee5146e9b53c2c7d581bf240489e690d9a1407f7a4499ee90b8405b75e5b69115d33481f701ea0fcb0434e3a6ec2b97bc87f5738ab3233857dcf9d5c76a21e2fd0b355260b56c949db8dd3b907abe85c05cb26706c93396f61e35e7ed6c2ebb5139c7ba5a25853b96adadab5ea4575c83aa9c5a238ad7150e19486489bd3163fe5b943d1e858f07d0ad2e21759527a7334b2d468f16b1120069cce3ec9657036e05fcce7f9ae9d7a80d2807e1cb04401bf7ec7bffcad11d6d5fdb2c3a71d84d8e7b8c3efcabf4cfeedd250a7367efe4816ab7fe09b5a52e52df672726c9b5a9600cf0b6c0a5860d06fee76f8d883ab7a870d4fafbc4d88f7663eb73682cfab43be7ca0f21e8b8df5d82a425bcc686f5f727abe73e4822eb27ddbfdbbd3cea37a097b21a43e6f05fcd09e56a556b9cd427ba8e7790539eddc908176d015d3ba1d157d5e31ad0be92cbbf71638d166f9a17cd1cc19cf08b160d6cc65df9282a0fa0e181cba10f01186935c53012065b3513d0d2dd6421ef54990e4334544d317fd5d7d89f608a9c053ef8e0c34deb2ee33eee4ef7bc97e6ad1bef585c7a688c09e619b5d411edc234be185963dc93293f41f3fb29bd307bf2b5a7f37e8a35b8598fbce87d316832352e4d46f753008abd15f3c54e861bc9b41b9a6ae6da5406871724fe9f2b71e78cbd9f2839c9cd0b8a802b16d12480386d236835b3a44f1b84a5957dd67d99e9ab2765ca4411653168f9e880ac1353d17c5970c9ad7fe95ff13e2a3092f8dfa18e74250c1590ded0d457bfa509614ad29208b4757e2526c185b3be8024178149425d1882c13bd391adb3d534ff87b98bfebc29f08201d3073387b9ed1a14c144d2793d151538d767dfd45bb953316bfe65b767b5f7668ffd52709d17e8f1d861cefe7e387d90467a9bc75b01d7ee02853db76f8b64d2d9bb91dbe83c2aeeaeaf52d562c970ae487e7a645162b0a75df0292278681568bf45d4a57a5100e296c5f027becddbbb6f34b42b4ddb7d39051a384bd827c100c22da7d58ef50d0ec0af202751f7032b0ca40cf5a60cbe805779735f9c5a69fbf1dfbd305f3a4dcce9bf4d1c35f53c1206513a2be406f39429e33853e69cd83da1385806400e982b512e024771b7b2d06545f168bd933e87cafa0ef711e15397d5a584e90691b5a743fdaef477d9e0dda61732bc8c35a91b8784e29024adfcd0a9ce3a3e8c50ce22cbcd7a417dc44d5e07759ea82ca0fff2ac4d76f7df436350b9f5f743628221c3a6d9d0a0da97f9aad40b655165638f64f5adb48ba4920154a59b2a244735dcd58cc59c5c85de52807b22858164cdde29aa3d75c22c4b4871f7bcbafe7f02fbd884816197920b4c6408be6e469b0dfe93e1e3bd6a122a48936248b099367c15cfac0efd90ce7210097d12d372159da74704dc33380d7c5f8fef79fdd892f1f2aff7d7c5ddfa5be27966c53cb5c0a15e842c0701426cbb6b3255b503f0fd55fc343911edea7e8f5f0d692ead1138c6342bdd60148975e740cc7c1bb301d06f93743529303a1d36685fa026b3d14922a33e9c58d0b93be48ba6668f28b71d0ea9ef48cf6b3e229c4c903c90785b6204fdab3cd35ef377b260e92a7bbb957c444ada12ff9bed02b298f76f85c240855631eb085d4692d231892cac53b18aee8f135bfc0a23b5bcb08acbdd8d76815fd224d4f5fa46a78d2876d6b297d8539a524bf6f350542052894474c79f352e4bd3bbd9ce8df939dc5ede20c73cf52394b8ba6634d3c703634559e0e5795cad6b3b86395a2517c8937eff16972e25fbf68cda4aa4ac57f3d424cb554e0870af06a58b0d5773148d951b4484d8b8d503cf5a729a8d71860d97917019207d105902cb530a0cb60449817ffbb6b3eaf0716cebdd0037b2520425f742e4623141c15def90ab0667155e76ae989ad2a5de2de7f94d067c77b4549ce9a469a76ac421d490e5a0ee80c76aaec653b088c34cf9e97f2d215df8401ce2ab2a9027ba47719358fae4d1965e27a80bdc1ee73d97d7280363cd470b2d34b24ad20977267ec5890ac023969057970a706b46b62fab18a77b33d38bf342e3a2edc714c4f928b0820970fc1f0b889dac06d1e46c4f2fb265e640805e803fa4719a75e9e569053123f4f6067047d563cab201f9bb8825cca6d58dda777c2207c24f09ef1f4f5ce0df68a77cfa017ebbfb1c013d2f388df06efdfdaf3823ceb826e9267ccc35c2168c36994f9bb3eea99dd1fbb526d7fd8cc8b0a090952a8ec26e16f25b2abff7b741130e20f462ffad95e3e0a078b142eba392aa073bed2b4e402ca8ea3ca5c132717712e2626e0ce19848bf651fc1e78404345b44ede2973682253dcbe2efa357c29c45723de7978c6e312bf434e122898d28be6fb28588b02bf1a1432d5a06ea0166b05b5d892a10eae7d7da982e4c934c2a2270bdfc3de571e751cc1ad7d61c7006d29128e89b211bf372284a73d3128c014d91eef3dfdec35af458438fde74befbdbcc23fa33c25bf4b6eb41fa84c49f56bb6c29dbb3d65410f55ed2fe540e190030772e015432e862adc29d6fda5f022e08f79d1ad109df355c1a8fcab7a2fdeee105e1bd7aa249fae890b6ca9217663bf634d443488d87591f748f4ef3b6322c65e6be20c2d97eabb2e253916bfa9ef56fcc8bfce51cf9147a670c7a5ad3620c748531673411f49266229e8b94e91fa4e25c79abe8bb3f6e7821ebe558ec184fc0a143eb6ba307dd73d4e1062d74bf72aef200d9ce5f77cfb455577d61ea87bc22e6431886c426d406e2b39a6f7cd0dfee9c4832e78cdaf407746a71c70a05fd0eb7aeffabfcbf688a64ac87e32e5aa58b527e1e20c87fc2ff5f524c7b1f98bf029c013cb7136e84f017d57d19372ace89f81fe8bd19b6bd03b23f1b8107ff3909a234ed3fd93095802480a06862aef179aaf05222cba3d6d06c0363f0f44c469deb170c5b2a1798b74baacc269ef201796422ef091c0b3f55e400acf87459acbf6aacad678747a96ffa5e7e8efb9f1f47fedb672da6772c25f74c797237eb85ff14c15ca3aa68b186fcd5e8058f4d685529fe13ef2342886fea5828d0fa02d4824a96d86e31f6e8286db96d748405701f2841ae18951c5af6e976b8498f3eb075d7f3e56880d67ac5df6fa7971fd45fde07966bb77d338c901f6c0d22e3ff50b79a8745f6ec2fbfa883ec02107823c1af433f017bcc302df7b46f39ac5e995e8572fcba03fd622b7aec836f0b1b07c21c71ef60c8bb597498fe8d3f372ba37e9b93a7462d2d7e30296accbda83f38b3de6c4c5ce9329f385e83724ffbd41d8132d440a97422358f3d36b63fbe1f7fdd8fd488736427f22410865332f8719043aed2022c47efbf5abbfc0f728677a0fb77ac5680f53ceca30ffd0bc40ede19af3846c37a3ffa43c8e8c7f2e209f14d21dcbe8537fba5abe397df2145de33eceefad62a2ad3dc803e3f2abfb6593afeda040c46c585c2ccd36560fc2f2dc9b9966eb253b588a0e1c9a0c8f24162a08c73ff7cbbb2bdd05c85ad0f9efac325617449d66c23a5639ab3d0dbea641ae3d8f05bbe2f7714514d02181b002b4670e2fe88a4ffb5d3f60cdd84f55411d09ba1bfd238fdd4ed685848a7a2c8d32ac9e4b9a4649fdae9e2f6331e6403e3ef053bd82649fdffc3c7849af87b8d7a06f4b0f1f8aefb6542027af20a7e741af88d18ba5931af4e32ade4dfa9c5faa7f60e9a93b75c97cd6df72a8e3f93b465adfa15ec00bd5fcfa9728bcd1fcdd61e9a4d6f451829b7a45189db8b5ad434eef3fbba5e43f756c8b4e237a8860ba78b0504f8d467b9900eb3f536ead72ccd2ade32ade4dfa96ba1d2f58706bf23bd17b8a9a832be6c0e68861b185aeede181f4828665057b818ee58584b6bce9e62ec2e24cf4d8161a1880ae39d1fdd276c5dbcbc9632005427bc990e2a0ad1cb0c543fd97e6ef7a4de36d130616f5d804fdbbbb5c05744c3bdbc4797d80fffd3f9cbee8b8599f8ae0222057fc083d26ad4f089e10a770deef3ce9829ff818d68be9cf27fdee70d23be22eef21d0a78998f837e5b60c316b4b057260f1365905b9cbe859166f1354bc47e2e9f1c5775e601b9a97529f7e921027de7be1a167232d579f7487d0b43ef12e8541dc1782c2e05b68f045dd8d1e07f43c5350ba504efe7eeccde79e77d93af9ef13c45ed1ad3ef8e2b82d2943f7a7c2931944d47f71725c6ed0b757bc9bf4f9e23b37b439bf504ce2a9a00762bb9abfdb6eb26bbb7820818a5cd37388b96670d99bb64485ad32996bf05821a18bbfe732fa517cf9bc85cf2d43e8494f90b46502dfca810af5f862382b64f2980209584cbff7cb05249165f528f195c0533f1b7ffcfcf1f29e8cc6aefe76dc3605109714e102373d078ba5ac71a6f8a581c02df1723c1706a60660913778e31bc07e79592a8425023b2bb0013f142b4a16851ad8932d59057911a367d983ab193b35103daea822f1f4773c6af71f4f919e65dfc543f20ec0669cd1839a7cf81e60aa89936209912221cf85425e3491a937050b356d17dd5fcc70f270a4e733eac007661d7cb010690569a3afec23e22315bc3d4cb9e35951aec5a3b4f45f6cab1379473cfd8ddd934cd3e70616e317868637513c656baead776d170f44efe1138e429b02a09013dfacacb995c9969089c059dc7c0faec69bbd5b7c05f1fdd3734e58892c283d3162c2d4bb5a12fcd2c4f9d60a81fa8d306079a296f91d5f1105680156437c5723148b5fb752fb53f50dbea7d698dd78d81a7f5750ee39c4fadd05ee014f3cc0936c6aa92d7dcae2b2a73d2a3e0ac4819bd002492f3e1127d8db2ddbc0b9428dc9bf527c94aecbf7648b7920263dcb1e5ccdd8a9c1507cc2b6075758bced4fcc87bc31a0cdb5d70871d075c74eec8e02e1d49b14d46772bf6f42522ce499e8901729148b22e1e9d581bdc8f09cde2c503e575875eb65592542b47ba6f30f53fcaccf63c4f4285fb69051305dd754a4cdad202fd2b849cfee512696e3a0a7e202cf6d8a5f31d1c3fe0adbf2da3e1e08d22f93e6b9bbf87bb28e4de849789690492c5d4fbd47d33fda2bf72deb864bea3b9342f09885ad435254214e959c5fb1fbc85227c5e1e2db23806ee2a6f9dd5f2a9fc71a8ad347c4faed748ed7d3af8309780eb1d000ad45259ee02c13a8280ab8f20ab7af9945f07eb204bfd8f80fb75ff03fe2d7325cc507b314f96ec17ca20fac65f01046127a963db8ec215e1682c94d1a8289e22963530677b857887edf0e6db8335d88c38e3ffee21e384fa6052af65bdc02d84241522cdc43d16b26965d6203e305502b0e0a8d49055238fdb653bb0f979ed28bbb757bcd4f9f2f715ee8f65882f6e0f34dd06041fb24f128f95a46cc03e11e0e4649807e62390e1a5ce67cc63d4aa2f764f343585beeda3e6b2054afe1467fe09e83d08b8ee676eef68e350752929089ece832e0864617478a2ba396947ff00ba61ada6327b0691b5b14a73a09bd5680e779e8475f11f1c7bc26333ca24020ff5f2a5eef79ef86680125b7b88a580c3f18630e834ac209d4baddf5d0666ebe79803877633f3bc9751fe847a2305948b6b99e74b26dec9bb9fb305fe3b32a561a07c9f6e002fdd0b8d4dace4384e89b7afaa78f7c23c4e9fb5f5a7b1a0e386b3950c116043f30210f79e93513be2bf20d0cb24d2f7d7849f7478e3ffd7ea93886765b3de323f9630731b47bf720bf812404dd1ecc80b184f612242118f4899e97dc2032e927db43adb97b703de5fd7784b0c46cc46e5d8be7e069975f291addf0dc42b2c41a6d8b60aeae80a7b44ad3427064574b8ba6c5b256ed298b444f88982075488a2c6eaa70e0277a8581d3d0734d7a7ff8cb5520a03872e37e6f2316f81e5bc0e222055014908348146fee04ca43037ccd8c5b7224079f6b7f708b5c5e778fb2b0546b240bc942ed7af65838a48b293e6e79ea106f20a461d00f78eaf68a77e0dc830a846014bfe83731dcd9ada59cb8773f36bbf2ea3a21463c7ddf19e3e70b31e0f1821b7ae3fc9a561f29d812e9eea460d20628988a50570a4261742e4b886d43eee317ed7e5fd121bf0971d90d250f3df78b1caf43db9c35e942c9dfd3de24bfc2dcc66f6ca2e7910bd902f1380f19053ccaa6fbaf191ea5a2675df3e3f4d5f35e207984fa93e80b54696dcb6bfb78202a5f3f567199118f7bb133aefb00372a30636743377d16b7ceaba74ae7a19e12dbe1fcec691d3a8be219237617eddb8357d4435045b6560c54794b59497dd8fd432d1f1f69a261fe08d712cbef6140f9fd5d17ec7370caf3521fefe13c919515df7f7ac700d55fc351491d93032f1ea709d38b9d05ad26d0b1ac527832f081e8df91141aa333d959c5fbeebadc6dcb5c2f0bb277696237e5aaa7ae43523b2178da13a309c5f8ee0467a687d5f38cdeddd859a127ab700e9bf4b5c2e615d3818a778df39d1acc7626fac18af728def2f836030e5b2f44af2f8e7aa4f4092146653df8c1d37f15e282c231df5c8b1d0c5a2d0244a1664b759abd68f18282a937034a0fe592631e1d7c459510ff77cce383a7bd2e445bd1f1a419df49f95a1b7a75503a0cc23c11dc59a299fcea0aef9ee6fce2d17c633933ddd67f7afea13539a2ef592bde13f69f2832e905e49855bc6f9f6bfb1412aa7aeb5801190aa3b4c657781f35e0e20ab2f20d3c5b77101540914b4f03361ff7111eddf2305921e1de8d879eb72f16d129e64f15d9fa9acbfefe6192fbff53ae8f92fc5db6cb311f9ebd60af1ad99eb78bf7a37503e4f9c50adc14de2d20076a20c6e440e1b142420ff7990a07f77ba4905841a9c70b4aefa3ad25b7cce5fd038584b1d0922957f9baf06f7814c60a66738de79215d6c60ad1a8107338701a0fae41cfd516aa493f9fb5ab6bf21b37be5cf69ccbbed3e097eee3fd96766acb8cc373a4437a5fc70f0b7174733a7aa00d60abe3156c814d4a29d4e5af9d844e4be97d81bf13c4a54e873ce999786748fea6249c0f5ca33decfcf2f6a6423d935eaede5ac76cdf228b673256f727d133e42ec0afc7f865fd17777e0876d260723c562b14f5fc96358b9a796d8f10962d3d91af69c416456d2e3834344fc76378ac90109689b650c9d20dc7d3ef94beeb817b3ea11875c280b4a8075c7b1254e95966fe5ddfff9f76d9b6a40803ba42b4df6187b17bfb039ec79a7956dc1ccba26233172d3d1e6ba6b52d1e6a60a101f142f242c28dba10f7b7adc169cf21183a0d83cfe6b5838ee983fe1c331925c1e22dd133e87bb62484728d1bf43c5bfaab3d4b8cd3a7f18bd413215ab75690140779202d61886905223d11ef786f98e38af8f4e508e8e536c92f0ff959d6209286b878fbdab305c3c00d7a4d842813d3e7fd972cc455a45722b7830ad93e1e881bfd87250b443758ac9030acfede74fa5cb0e159c7d2eea5ec2c6e1e836fdbaae3cabdf602b32c2f9da71386b03500df84cf766de9ad1bb6db1566d055c0ffbe56dddaec99fbb631108d81ad073a7990c9d6b6bc246b5b34307921a1251dd87b5e3cb7e91f1ebcbc87bc1e06dfc16cb3281ea748c07792c55b7b3b28fad981f160d24b9a7cc2e88739ceb28c38bfc9ea5402fc0bd7512d215add06c8d64674d616d646a2d95b03bdf7fd7115e731c1c30964b599fc06179b13f2ebf15dbeedf38da297acff8259a389f90d26fbf0fe2b37e8d9d2dad11ee284ff922c2c315bf0ad44127b0e7393669944f1b8504018f7299c2fbec7f61c220f84776c146f7d7bdb3b7aac10a2dbf13d1677c1eeb3fa842f2a80a274c33f3168cb5b4fa258fe70575881f86da1b3ae3ee0deb4542152f35bcc39cd4f948d0d94849e43dc11af9128e495d83afb2760d1d144685a746582ced00fe3a98496a73875cb16128a7bbdfb0cbeb9e5e96a45926ff24d7c5a166f93b5c31cdb963c4d7b7e49b72bdff48a69d7a0a7e983de3b6af342ffd28be9dcf3600ac42f54f4da791da2060ad10b7a50890dcb66f29bd4830ad4d524e93f9b47c9f9e51e6539a3c7e538d7a4a7e917690f15e5cfdbf2da3e8be8aa5a80bbf8bcc17ab22c137b564544ddc77096bd2326eb89c7051ddeb10acf15f57e7efac1ff1a784efffe8ae71014813e9c9e200e8cb21d56af3d8e306b048eff512ebee9605801ff7b4fb8f0825f8ff1dbe53491bec3ecf889c98bdec5157fdc11afca82b285063c6671c506ba69d1f56c5e41a9b4d80ed8a46fb75df7a92096e6db9eb64c3b21440c3e83d966a621656b876cdb963c8c3e4fd74d56b0b98915d3090c41d007bd7e5e3f9297409a2f656561f13cbe2051d26deb8fa3380f246cb60fe797cb41805fa33db43c153143d5ea5126996f2ca1b200bfd6746e4e1ff492ecc1e59df85f12c212b3bd68e0c76ad9101e3be33ae1c014b68a595bc884151226e85885a363bb84ba5d3be016a93486a64ed7854fb0a1f45e40d8be3d85e5a9071409ad89b80cfec12e87efc61a075b17b7f5860d4b608186032ebd61917bf602af307b2eac9eb3841ae65ad6cc825b4e6ce140224a0923cc320ca62dbbc04d791501790d839ed90e82d19fccb6e4b1574c1bf4032118cfe4d70b564ce71af42c15d3090cc172e08a5e85d06748a691e2a050d5cd26d40587124a0fe43d78205c514536915fdede241711835f8bfc26283f30e9894df328adfdd75c8f72bb5cdb672b13da4a2412fd816b72c287b2421f36303d9bcb99bc90d005ce2d26435052af4bdb31234388a37ae6ffb92fb671d78ae358c0330161d3eaad1a6837525220150ce2f73f8c271206c422ba5e03920a73f8f9b7add8ffeff2df4353960dd941042d509b0270931494da423bb64a6fbe66669383bf78a76e5a2358affbc04f389ecf80651bdb4287cb6b79423eada138d0679b516e6cc5b4675b1b48bab6a1432606fda46b91d77ad7fb7b6039439defd26090a552a8ea2606e31488785e4cf67fd7f4b807b599fc7ac93ca864060cef3fbb47e919f4994769edbf66eec1e50ddac2e9e9cdbab68f07a24258c1c530d352a0dd4bf9c0d96897532f629207825874924577746cf76107655d7081101dffbe53e7b66dd52704368fc3feaebaa2f64605b52281cdeb44d0062ef0dffbda485801adf890beec2b9094c753d7fa0aa4c3fd3bfde94eff00a172f1564affe4ed99c022e7169dc23736db2e5921214da052856c424b582fef3e5a03b1868ca278cc80015f8158b82d04a3cb504dfa939379668943880185cdd706ac21183e719af4ad15ef9007c775a6fb85827be51c7af8ae38ab9bc64b2205b2c794fd3a75fa428ea10f4207ec382e48cfea416d24bf493d289bfcdafacfee51961bf439bf36cf3ad91e5cda10f8ef590351b94bb6c5256aa0a17ab3bda6356f304bc1f024122c62366bb1953a36a543daec2e63853876af734f2b54c10aad38d2b02d5fea01e6ef7c9b6bbec74f4071b8e2f779b9806105f44141526e46f4bab7d5e9fe00bfde79e2e8a3134c1cc916592d9b5a5a074a320b976fbe19b618145b7a2b45a4f1c6f19dcbf85696a6cbf6760bc4c293acedf1104cbe99c5d6ec8a69aeb0051b5fd6104cd3e9a4d6f45ad65fbdcf3ff9a2331f9672d323b4418f17185cbe61e6b4748ef3d73e8ebdef9c23fe7970947e91734c7c7b04264ec3b0b4f21b0c1945e2bf7b63f70cb3f65f528fd2c2afcdb34ee651825fe97ffc776c65e2dd2d7a4721af4c1ecb2a88e94cf4b0ae4c0e1b38cede8eab10557fb79d113d5c552a4baa668568cfc0da48763c2e5008d6e9cb9dc5e07b8438e1a00b773c1ddbb7b73819f0604054d2ea5d4829c445a12d0c140747e1d2d2885e6cef96b8cdb6d94567d993a7419e07f80d2d938ae3ddfbfaf5bf588856b9e9a73cf08c4854d14bfd659c711fa8e81d8afafd7c76c6fd4876a6bd3ecb5bf75786f13e8f9d40e9e9c56b920385931c3cea6d4e0b052e6f847819fc848defa509295f2bb8c467f1f38ae9226b653ed157f42e853cdb2aa67bea1d194cfac18a7793be67a9c84e5ef19e983e3bebbee3f53b7e70e435429c7ffd9dad1f1821c4d9ab8b6eb9f45121fe9c5efcd5e819425cf8e2bd839fec2044db833b9d3a647682f618da7485b7955fcf6c0fcd6fccb04c5c419e6c070cd67f62b296df9e06fdd8f8189b905f9b7c8c35e7c9d859ee6cfe7ac74355cdb6bc52b60e591efb8fdfcb66bfa5b9ddcf962eac13728ecd2c88d650288f24476c88c230f074f10b7045ab549ff0abf032e039f821ac70799f898f067ea6889ee2e15c2556e1ef61d051efadc47bc3f2cd8a8ec233804744beff5dedfb76e9d6e74a213ae7ee5a5f394988851f7dbe68d10cf58a86110ad2aeb41edeadcf032907a423631f071e018ee771d8e6b6bbf07e0795c2b4581e2a54d04f1638bfef98ab0f962dd7f6b78ec7bc395dfe385a8c4af763da6384f2cb72d05ea3142e9522b5e7e2283e1a7bf5e4002f134abdf652fd4167d3cbbbd4dbc33803ba549f5c3e0acf293c47e192bec2d31d17f8283cb7187801de1fc5ab0fdd307ac50a213efef8d59ff1d9faa8e2da5a138f6e06e9e37d156c64e7a0f857f7f483a674ea24db65c74eb346668ba0bc66002fc3f7f712fb01ef85efcd029f6183ef0cf05d06bc12f488fe2425cf12df318a4fd5f2aae88d52b8ec0793fe18d0cb51f4a55fb418f76502a7e7e800d47483df9c00bff0cbf57822fa99c077c4771ae32bf5bdd4b6edf712a275a4ddcabd4e95704d7af77dae95b256975ad9b95f13ed3117e335037c4614bdc0f81d13e0b757427e2b402f205f49e6034bffc9bf621e73480ecf30f8b5cd37acff02f3e228d02bd6e36314be338aaf98b770e70f3e1062c1ac590f2c562d163b829bc97775b582fae454da5d3c817c1b5784ffb03d3c90a1d87a90a5d906b22b82a10dee1a96e3b9309e4b1cda2057317022a1356b83870ccc90045cccdd4ee879cac5efca7efce4eca3fb623b6b7e1e8276d1fb2ba8b7af2605cbd748a8d23b0218165be772f13e87bd3fcfe4cf57fc5ddbef3dc6df9b28fdb58e6fded53bda5e22e53d114cff8c850c9565172cf4324353d93c446973e193ac6d45588832991c3c4f6b0a5be6f2b2843a562cd9f6dc96906c732ba603a18c9eec402916e24a5a316d5bbc4d16e22a67f42c8bd9942ce0250b716d6c7b3437e4d75c7e75882b69ba6ef3f82ddaec1025e79f3c26d7e097876ab7cbb53d16d1c77b9fd5bd99a083b9c0bb1b5d48e8e23e72595ddca7f06c1d7337cee26e6e0c9ec71c433d53f6e9226de78ce3bb0d3af21ef5695a81603150676ddd68427da00ecbca7278e8886082b459f5edcd83d60247dca60b24c963947c0e5a3cf2067fbbee218b2ffbfc057f73c4494edfa3de12cd99e89ad79e939b793265b2b5ad5c8db3b52dbe28acf0c6bf37b6a4f35e6cd7a60c49ab3c85d9227fa0308d2dae0acbe2ad6e4fd09bcb0e94d28bb901c3caa4dfdcb468c29b5b31cde421704055330d8ba4ed212c868b7db1b9697e2301c5b479fc52d2446ceda579fc0a937ee0802a7b01289eff2fd98db7f1096f8775eb445c077b346144f1e0a2289b5002f504cc73b0580a34619162b26655d82c66b61856fdcafa57e7ba427cfaeb1b67bf70b6fa369dc74ef03d40f240a85e843c0fc2c903f81a907b0604052e97dd9704ea1055317b1f16f77581a4541c7f1e72c327fb4d1162cfa507b67cdf5fd4ac087903fd4a61bd379965719c5b5e490abde20a09c3f8a6c472d05c4545167e845978ccd3ad3fa2eeb9eadec2bc2249f0262e0fc71a5b2d455abc1daa0bffc2e0c79828ac3b28d82abc7b363dd107dbd3b2381eb46c153ddb1e5ce58c5e7031dbc57711ae9edff40a72b33d62f2602896048bcd090dbf00bf76c5caf92d4fc82fefbf60ba6ef3f8b5f45fb33dca27bd89629b5f5b6b0d8426b04a05e3d7407a3dd9efe5e356c8bf8543571d70801fc3c4aa8583804d1831c0a93ac61d8dc43b154e4914cf54e548f2398557a23c29ac7087ca95328147800fc28e5548e795cfed07fa613c67c64623c0f3c0970bbe4a15bee0a14fa68d8b08f1e5fac805f3a020eadf04a4d8e277807f56509f6088a9454f31f466ca72c2d6283a7b8b26fcef01b13641ed9b4c8184ce33e984ba034a7a47be70daee6d4f12e2a4ab463e71d96142a44fecf0b709fe1ac7c14e64a779d176516fcb75c64569cc546b0cb27d5db4534114afd46b10515cf6978baf527804789e8ebd2316ec8c05aefab954cb41947bd98b613ce7e0be30ee73709fc2a7ead873897a3f62fa313988e26b3bfd7cdcbc2384f86cda9b8f7ddc463158f7a882b5470222565cfb06fe8e359006f49fb748e82bebf4031f89ae81d477ba076b20fcfb33812bf9cb51f2a7e5ab92be57f99b0ee199c023c01dd6be33f59a613edaa94979d5f4757bc2bfd5edc9fb4fdb2b6183df3c46af8202ad8cdf4a920f3d4e0b412d8cbbb3d03a267d27497b503b64425e74fb307948d61ec46fa5a4a0e8d1bce25af87512f2cbfbaf02f4c2a057c9f905ee30fa167e05f1e7825e29a35fa2e8adb8675155740d64d2ac8fb6dd1ac8d6522098d8e237d98bbe4e4e643d5fea3b39574e9c2977a6dc72b8bf9d334d2861085c05f06c35409c990e2d299b1d90870e70f15ca9a06955e111e079c0b1062256811b5a2c2c8580d3a27b09f03ce0b10110c5d79df8eb159f7d26c4b41e13264ff2f320de12f7345cabde5c3b5dc1fa6b00bf55d0efa0837f1b58d1b1a310bb2ceade316589103fcc5ef8514d0d38a6897e0af08780d3444f0aa01438790ca4602a4c5cc3bf03fea4a01f52ebfcf42ebfa55d20c4397f2a3ef01cc9ef6e55fb3e3579a5fcdbcba97d4ff987bce91c71458bbfc60df0d862a65aacccc7845c02c59ca7db4f097405c363eda9ee77f17c312916a8cdc040b44ca495f85a3db08167a39f676a3988e0bfc46714fff5c455b77fb583105f8c2f5ff3d93fd49db5e8afbaab814361d420345987ddb31a707e858ea24b8a59b30ffa47a7355281ccefe88cf44bb91cf6fd3401e4e27b573b33d577e9ef75f1bd99e0bb047c67826f931eb56f362912935edc045890903e53a8b23d39fd4ae061f05f9190bec3e897307e31e169032fa6a8ccfe2b019ed7ccf6d0133d53845c1e92b5472c29210b6f013dc8fdc6f30bfa307cb46205fd08a36fe7b702fc0287e2d2e383d1cf54f47e882cdc3faa40e67e3af18faf403021ea45594c807e0867df1ffa9cd2e329f9ea7d53db0e9013999e504a9927518a0ec947d64aa5d960b109857548a5c5b219048fc645964e31d3e415014b44e198f81a3eab7f66cd0b424c3ff95f9fdcbaaf101b0a7ecb589fa9beab1e618c3a84b2ea4881c88e69f9489b6ffc0967c053856f4fbc5188aea17de6de9c26c4411dfb2fec7982103d4ee9dd77c3ab422c3ce0f31b964a8bb7eed39a17424fc4dacbbf52f604de9de15024baee64490c4ffd6b8b23529f136258f1b517f4f95a7a1abd073f7589e4ffc05bf2863f34d73f052eedecb37c3ed39c15ed4f89b64b816a778b27912ba23965daf2cd648adab10ab883fb145e499e04fa23a6384af01c5ad53291ba946dc7147f29b27df2b545aede93670ec4e5950b2eae9053e4bccf663c3c1f1e07f5572d2910f2440e347fd7d975e441ee216787d107a5777e497a6ead3b7d3c72a4889727d56e427bd0ea7b33f44451827623b98f44d14aed4147c0b7c2631e4821be7f1cbe57194236455dcae897980a35c06f6c622b01ff9906bf79568fdfe4b752e305c0897ea6413f93d14fd61ea4b8207f09e43673a3daa342d3e386cac6f25b62d00b7a50aed11e8e95dfcc787eb5e27341cfe251ae7865d15dbe02f9f6c64fbfdc760a24d572e356bc6aa755fffddb3f0bd162c7562be37ff7105384580b6f2835b8171d289e70f0772fda615e9ec245ae4713be8a090a86e7295c60f15c52a5fc6b81f7e51a389d1406e527bb279a293f7b69c583e33f1162f5c0a5ed7e3b053c66016262a7a36e756260b110832b2ffde06f525186faa4387d7c8fa34244fd8ed09e29b7f80cb59bda39922fff71d6f9452f2e6b2f3b2fad7ecd47e7caceed5abb6ab69c98aafeb5e18c6fe64bda4b1a4eae7ad727ea7cdff896042f88a57ec7a79cd9e2cbd633846895d2e6c17d0e90fae0a116bbf798247fdf3ded8ade55f23d53433bf4f0155cd851f6f60962a03fe57858dc73cae94b1d8aa9266ecf32d51f5e2f6f14dacd453ba9e9b40803b258b5a4a73d00e0346121e6ec50619deb94e339d5af61e0aeeee772c66739e353e143892ffd1dc5ea6e2d07517cd590657badf04bae1e93ffbf0bfd76392079162e703a03fe13615e11c05c5f8978ca4fb9cfbb25f66b549ea254e4305738d6689c71e057cb25e4ba58f11727e70aa7f6cdc5f3114d4f18df4fed51eed0da05b5a7490f752a7457805f4eafc2c403fc127d97f14b6301df238a40af18f404eb3f6a8f5cc66fa03dcc792081dc6e647b00af30ff1ee097e8b949f80db3792af9bcd524bf02f22cf1c4f489df89dba390705b792071b1fc5d2ed8f352ffdf6d77e95c71913f95c72c9e523c0edc1a328944a13d26a8f03ce6499026cf77a28122672ad64292844c7e7df7c7a73e94137064d65357bef28a62b01e057fb51d15a41879ed55313cf7b6337bee2fdfb4d3d2ac95637e94f416398f473d31b2204bcc509cf38833a3bd7c3e7476ca91d9274a45b0a4e55561c941ebf5e9f70c1922e19eed27f99b15b679b7dd9567cafb5aa7b7ffe02ce9f1b4fe579b7f9d2127c0d4c6160f1c3b5c3e7f7aca80033b487a5f398bba74897edf587c5f217ac1c5f715e2fd61b49fe939104eae7d01428a654d87f8b4255669099938da9388eedd2365a22dde17c6fb95f4649a9e83954f41b8b6f00b0dbe9805fafee1cf1efb9454e86bd6af7e6feda1e837788e7aede311056bb06b56dd3205297b8b3c11bf42216bc881ed3a7f293d909a8e472a0f24b036e002577b15e5a8ef6dae076db53c4b21bff9e897580846b5970ec1f0b5bd4008c6e457b72ff3a06cfc06d6326c2118e641c5220a8e41df491a51803c680f44d12b65f49bdb1ee411f39027e7b7c2baf6c2db43d1b3785071f356b3f88df3d84bc07f5e227e7f58b06848d403f9eed367ffe3ea40b42527a7b20f1e78ee81cade92c98b1a2e5fe81f2c434741f6d495a10a1fe8758d3e333250d9a94ab3f22d95c954e1cecfe2a60387eeb69cc5ed253e8bbbf2d239e203ec1e4a0ddb8833d21b309134ec8bdfbf92f3c3f893bbec7b9d9c585e3ab0c758ff88db2fbd0bfdba095e912bf9322be0fba0f29e57d2db2b8733e2f98c3be33d17f4a892351b7fa7f6cb36db13672bb3b3a1637ca25296ce92d7edabb34050290b9b932a673d9da5427c16197c0ec711af492a86359f439354bc0f44ff4ee67c2abc2ab476dc1239757fffe3d7b7fe8423a51a719a3459f3d8a54d3492cdf70c203c138f56e38c424f6f77bcc794a79ec0e90cf2817a13cf6655203751e1ed815ed315d3aeb562daa43f3640dfb2434380df9189f8f558e5bf673f233c71457673e561632bc8f32ded413b2024ab20f72cedd133d01e43f15c86c97f604705ceafd11ebaff680f35be6303e7f76641e5c9dbf0daca1e08d96021dabae34f7270ded4509b22e13e27f72eecf6a1fcdb8fa9837b5f29fccad982e83dc54e148a7f8a0ba37095ae1ca7ca4e552d9121a87254e13982b2b6e6aafb6091e2140b0ac188bdc411784ee0b9cc785e79c57bcd37ebbf59f89d5424f3befa753ead6d7ca9602d2cd4fac142ec11ea35a59d9c120f7becc45f1f978a24f459e8881d2e13c10ad45845ee06bc4fe17d54e5bd3345bf3a33099f39f17ccafb72709fc2ef465e382a95e32a93d3f13b55e62a3cc6673ae35355ca8e4799232abfb5bf8837c6f19993904fc2c7003f5074c073613ca72c39375041adf0d1492adeff09be5721e9220cbe4a15befcba6febdf9828c4ece5ef957d75bfe2a516753bb4585e8bcaf31aac79d41cab60dd170a3674c6378ed6df2eb2661f98d7e945e981ccebf8eaa874115be328831c0f42bffd13df5fac2dfda62b90b9a5cf2bc8ff097c2ea3576aa9201f64a9c8d6fc6afa838027ab984e6f92dfa9849b15d3baff908517b76341f32ac87985f7665690cb7e1a0b3c2721fd58c57be2f688f19b6ed0cbb1d0b3f36bce07d47f15a09741e32c31bf2b672dba3eea814cfbec95641e48d56b0a363c06f87b5b440fd429c0e9d27510d2f3d9e3ed035aa7be2f44cbc5adbbff692711cc0629c59444698a3cc445e9bf3aed4de17169a04a40622118ea10c55d8e0e7544149389171bd3fb75ccdbed2d217ec95ef1d8c77708b1f6b39feefa0d1349dd3e42b45f95d1d5df96fad813fef2d66d2b84481bd36270d613069f3c64e02a3e3011c4421c6a5ad2218924d966b16c1285f345ed4148bb8d40b16e6c9a2de793f89aaa27e864a102b8f2ccb5a750046d499163cd0aca049f25782e137c2a9c87cc4a11220a2344c4425c9f5ff476b749d2535cf6c482c77ff841fd81b2af74e88a14c859c0b1cb320dc0c67f29a8f7f3952dd3ede6ec99edee12a2dd1e9d0ffdfbc922b8784bf254aadb75a6c91f5b5ccdb32edee6b1ef2f003e135f1906fda8bcc5a5eb2a7ab6e403c6afa45709dca4b7b1fc9201a443386c3cd8b3ee4cfa7cb19916edad212ed06f667b68c5c7435c443f9875d534bf791b1b924bc26f01e805e60393dfe58bbefdeadd638458f8f9171f5562a6ac4356282581105ebdb3820d6f01feee14485801ad402a002b01df11e2a7ef97edbde25669c1753ca824da22e7893fb5e9156d10377a139d3d3155ea784533338a2749b3b5d601500cba97eee07cd06972a24b7935e59bd62708b1fb7dfb5dd44f7a22dd9edaf74f6de590dd6bcca1693dae1562ffbfe4b62a9478cb35ad77df7fb89d4f6bb6190db05ca530e574908ff76781cf30be2f8bf19915dfda4eb06e057b046d629a2de773aa4e53dc0fef0fa37d2b4c3e2d69955ca1e604d2ad238ccf089ea3892d62f019cba251783e14e654f24415fdba236b7aac5e2dc40be7dc7be413d270f17ef56eaf437d07d5799002a9c1e697b5f38123cd9a62c58dbb8323173053fed6507fbb9f7db7dbf2ec97aff06dca2c35c429c9404a53259e214b14dfc9fa3fd34c7f4dbab657862c2ced295aeb5f14fd4a4bfbf2fa873cbd984efc6736c56f5c9658627e0ba0e86213a0a217933393be3d3d9ce8170057f4820650e6c6b4475c9618975b17ed53b091ed5100fe938d83e6f14b6bb781f9c0a4bfe0da99f3a65e2ec4d286f9e52b919e54cbb20cc910aa56db98c6d640909efefb5320d4642e704c797e3a6af51deb3ef7ffbdf7f8c3e775f33751bb2ab5dda17ec8270c4f424f046a00264bb30d4c287c51ac0013dd384cd08360b9694dce3a9ce7bf0f0c7dd5e238e991fcd0fe929e1749d8b7e3b707a609913a33756c863f84c9420f2cb6f1c2246dd917824fc2d57d194a6126b0f00a0cfae1c0c054f793a7528cb45b72bd791aa85600cc62aab428d46cb8de3375ef96e0b94cf05982f6cc447b96804e26f82c019f0a8f6db2478575ea3dda1223cb0b78d0b233f99c4aa13933bd7445d577f3df909ec55713df39f1f34e8a73aaf3a00156f30d202990f1c05127528f901729104ae3f525e4b76f574ff57baee74b474d1979bbfced5ab14bab9ed1f62835f82b259ccba9ceae528aa61272a0e5ded24f836893cfa63de88d586cfe7ff2be034e8a62f9bf672f9025a380ca9d020f0e13064cf86ecf848ae23360fee9617a2afa147366c02c6605b31ea2a21c2604c4802c0a2819942808778020395fbe9b7fcff6b76a776a76d8232afefb7d1e65efcdd4f4f47477e52a1c50011254d0beca49b2ae0a7d125404ef9918bfcf3ddc67ccce433f27117ebdfe0dbe60f765cf7c308325d7ad12125ff5e7230ffd0c8c9fc69bb1cdf908fa7eb94c5873c5f83de39ddef8bbc73e3d5433e6f3963fb601ebbcbc25a09044d888fe9681248110646f44d922f287dd4540d058f200e1905e596e29d8666d3267ad3b5c1fc80736f8e6aaabe2287016473e93ee3de18112a832c9433f870f428adc2537d448b41fa43291feef32e29d38f26c31cea481435244463f9775a36661e7f838521a678e679c7ed5066da47cf469fe32f17c332e252487208e890f408cb3bb6f434680c7f49373baa6df9539bb7e98a75c739f509df954040104354bc4a9b884798c52e3c6e7bffa8626186b162c7b6e3d050e529c07241092344a8fc7efa4d26a6d6005d2f53301810a8b332de8959655d079e3156e40696b6b73e326f1848e37fc5d98475a8761338fc954b13e158ce9e7132324f0258d9816eb404a904ca899e3eee1c15fe8c59f34e2bd95c9fa54797f45f196a3f461f65dc9bf574dd487d8f95b2f58a219c9ada91b9fff4d4b7c459b373dbd48cf6fe5191543369cabe77a6de58325aeae3ed77ac5fd8ea14ea189355c47e92a75a575b54a24a1da78cf1edb331f715e6211dc4784c9c67d3db6673ee2bcc4bcf882c69b13c0586648fcdb96287f9830e4990fd3f51a5e5834abe41ef3a07214ee6249041917988020d0b90281d0aca26d8591dacadb0a447fb711103c8854587c6481907060a1fefb9211b316afb959a97ffdfbb8369df546b7daa62c38f0611517482874c6d55599f007659b87b131c402d848975f88fb6cf4cd824966832095c900783f7487e4e0e71472cd7d01075f06a78e209b407fbc5f0fbc9f775c4c0004472a5571745005ab0a3230ce3ce0317dc93111a1ca86dbed14b8ddfa360c1f505675c669e5e33b74e5f9a571e68871e6c48f3390a092cd0c81849b4e5fb376c6e74a7d73ebbb978c4092ca72a8a658f280c44184830849590b4018d92b8719c804041b8cddd3dd00d91b4f7ca3db3efab7f7ac051919caaf82f1dbf4e43a357d3ee8f940c930d789ef84d43cac8ab5b62d41c7addf5c8cdaf6e0cb912a988088691530de1fd538373ea9f8aacda316ea03695561c1bd63aa94faeec2813d5e68a0d4cf277e3e65a8dec9bf2c1933e26b3dcfb33efbe1b988be73ce27e3d7fcfcb35273c74d786ea296e0667d3076dd58bd4266fefa7dff516eca99bc6f2bbf98a9ffde64c2eccf349e0697343b75c3adfae8da2f2d9a4d2aed98f470e30bf478d65b75a3d9af99a14c12416e13c1e1ef24f75726e623bc5df3919324c096e62ba39ab697dc6d4b50554d2aa7b881c8911b06bf936fdc8d54b949f41f5bc714208bf5cf2a2c100eb2853001a1144b11c00215d076b304e233a60f042c04a4941c9a13699ed2face559394aab5a25e2337ae411f58a43289e0eabce8bffe140fd17e9c686bfad238988f0dbc1a1bce463c08734e92334b628320954936ab76c039f838051a578e679c5244ee24527bf042dfee9c46e8b32aab07ee8be0fd7230ce88679cc93826da304d49e514a03a1be84b71910bfc369e67fae09c351e43c883547c52a511e49f4f8176530c219f78c0f0975ed51b65f9bb0b1f5b897a2de5a49a2255158ce52597a04fc64682cb0dac34456b5595e0ccb0ac5548efa3b6bd8ffb2c53cf586845ea9693ae8c9b570b57d33d03b76dd3ab6e04b95ecdb9d17e57c697eb998f64127450c47b8ed99d3e094a8cb7f2c18ac65bbed4f3fbc0c289c3ce576af49fefd57be90ea5a65c3bf28dafbf56eaf7b9d3facc9aa5e7f6e32d955b47623e4917ffade893c457e6edb30a66812bb994bee81e7c0b9f9cd677eeb14afdfa4ee4b9eff5f798bbfea7559fd557aade7e8d26ba755eeaae6aa85a3dec563c4c39a55e370fa396703ee2be5318f33316f313c6fc8cadce7cb06a96e7910995b99ff6af94fc839c5b32d8092113fd30eecbc4f8a3fd4d87aeebffeb16a5a6bdfccdd21f0e8acd57fc7c32240282f5ceaa2b8a6f5a64a08f8004b6dd4d40c20670c5bd5c401bbf9ba956217d1414fc3e73e4b2f17a237e78dcdc937bb81e5ba19f5bb81bbcbb9114f4673264278737a459e8037d3a63d3cf50b4114c9f921ddb6634fa5f8fb1d5e715954c65d21d2a890170336e2a24079fee5970224c007c1c79d8e0a9a6734090f712a5f6608e97cf3be01792838d71048d930209d724519d091b848fa0c624895cdc9738a9257362c992e211e137f3b765fefab4394d951afed880eb3ea9672e6095153616491cc489b10da4b981ecf688acca958d0de48d6546eeb1e91dd8aac3b7558b95aaf951edf2fffbbfb8f1865925553d9b1ecf2347b217e23ad3275b495756c59a7e500eae205d7b4040a9ee1798be175fd5db15076d3e52a965dffc36fcf3e95ab298f0ee9103b464372ffcd393335fd273397eeb7745501e9623a92879b9b16a909c1630dfecac405e6f046581af050212613951ff7f4ee9545772fc7dfcf4450b75ffd737c6fedfb097b5a4f2bf669b975fa7094a9786d35bb9b9f73e4e5d52bfbef2d93294cce955fd9c6489e7374718dd837270f99d26bcf8fd4e0863813f1c8fef8fe7e7bffdad5edff3664fec3717de55c40095d27c8371622fc3d70cac80a4c25e58309ec7e77adb76dbdd040403600984fa03012959e05840dd6f7c7dcbf4dff402a91b6a78d6655f4739ca4894d0c4447d7377a1d8a031ddfe403ccbf4c998c939b070e0efacca6424249a6c1cd06b701006700a499304766523a699a5ea1bed22629ca6df1d0b6f249c0562a2b10dfcb9789e8d71e6e279369e978b7152dfa8009bb2e440787a88fb7a609c36c69998a0f68117117b272551f1c5c69981e7e5457fa7fe0fce6dce051ad4f938eb39bdae572d5ff2d15a24916495155454c481913b23111096401099ce223e558a8c0016284f7373926de8f867c51a3dd3ad061dbef4262df158f7584535baa81867db9d9d43e83d0d21118c449c243910d7997e80adc46f746709c4cc73908a33c89d54d8b4365eb9a6f5142d6b7ffdef37cf78aa963ea88ef8e98e5ff4015d3ebae4fb121006962828abb17087269d3b3b2790ca10991b28f29fbde128a383cc5146df074e106404a6cc10e557e843f0d9cacfdcbfffbe7cfa9085bf2b353bedc71786eb757140a3f6dfb939e46a3fbf4fd6a13747e73dc3cd6abdd339c9644609697497e78cdcbf7e9ba1c147b69798d13dc3831fe39df4c257a3df5fa6d7fbe38591b553314ff41d48454b8419fba0e45ecc1b083d491eaca2a53437052a49db5391e814d90b33334572bb91db6ea3486e37abed84a3f2374efd4abfec1d251d877ee389e49491ad3272d61b994cf5422872f61a53f17b97d5e26e6922da93d6e2ae66c4bb1e574bdcd7d433ee6435918322f37b7104bae127fa8b08f7ea47bc9b3e229fe3e6b7bb1867f7f871aa21de1af71401cfe3c4fb6aac8923e91d8e78cff6cc4b40c4fbaa37969e30e609a5664d19f79f455035957d602067d9ad0f78adb75f3ec30b2b071b58b5c140e74640c70bb9145013a5d63db77c909bf2a4626ee9800fdac67f7facd3e7f07ddbfb22c8134720d33cdee4c8086c83ef1ae0eb9db8c6bf9eff1d8a202ffa6063c96f9a00cf787ff4214f6b82f1c569cf5ffcbc9ebf4d5dd634580f89acf41c038bc108163d6de0d62d066e419afccd389036773170d326c01a8020001b7f42ff0b40d89c36e2ef9b7ef2fece90aeef25f00f8b3da7ecf39233dd710f1df674c4adc13eb1df975bafd4e3da6cafff6c74e7f875b5ed08722728a25e6694101910f4f9b0ed08f2dee25c9119001c276cfadecc0f5b8fddf4e4efe97abd6ff8717421050652660c043af3b94a9932a89c04dc7cb9d436f5b30021693bb35592b6bb25106a1103b8e21ec111806b705d1ff46f763db4d2de99fd88524dd20e987e855e20d62bd6e7e97ac21445a6f60307c691c9e0f038b2d54402732dee4b0d3dd57caf4985c8b5b8d99bc58c8a543e14f1ae0222de6f374911d56aae5b427efe05e89be7cb08e230c63150f4fb21f2be3bc67517f07642c46a2c92dc533b9e8de532e2fd24d4148f457a2bdc9781fba865e03a85eb32709dc275a68f4340cf5f187f3792c85ddedacd7191be729c32e2dd685e11772b23e9154792f3381346bc571554dce3aa4e46f47975f9b3fa08dce26c98b7f94b7349e9c10612a75c02955631245fca75553addc032a46dafc0015709c9a48a529d08f746ae24b9af81218ddfa9e5349df6ac7ecda733deb866a9fe5baef559541239dc7c5f3dfed518ffb62390791e5912c13ca27f9cf922d65052a18a752a3309248920affcb9fcd24d1d95ca5ff7c45df7e87db7326ff147cb911eb21c84b80c11fba5eb309f3f623e3f0144a1ae22d4d62f869341515df451e7a6e439c06b808ff09224422a97530141c859a5456ed894fd9a545a22f2ba02b6abf217d03f52a93f272cfa6ecd214afdf2cc98c563c24a1df65cce92933421497d38edd7a6ae8c4d11e4f062d4fb8d723b542f829cfb5c86629b11e4b1887781bf9023f60b300e05fcd1fb7f9ef5c5d32f6a867b79b7853dff840a8a5557349fa980ef63beb09e4bb02f2a487545297b28b50fad7322201115d0f61401a166036618e035d3aa98bbafde226b1e5df244f1c94ab5a8dfa6cb2afd42358beb6e3ac3a5a40538901947a0ad804450eae746fb1d38421b8184425530b67aaa03b6a1d838f0abeb66eb4fff6cfa490309ab19a0276c05d5284813c17d34ce8818a71dedb2ea05de66dbeb662b03be726143228297345ec1a72a88bae9fe725ce4ce0177ebb53e6edcb5f321519412a40d035515a952d86d17aa167673a4c2515718489c1a07564500330ca037a3025fae2d6fedd43f46bb3680d6a5471fdff876bdc51aa71edfe91e97699205a5aa1d319d2be623037d8fd7996f9d4a95a9df6d3b8aaff2818ad3dd0aa1933e1ef6f9139a43dfb06ee5cfeb9ef3ce07ab0071c03341862e9de695e13c5c0f5514ab08bff1e223a706b66d60de59374f91d29502e23a4ec541bfcb026eef88df2960ae0a5073e0ab9e5e72f6587dce64b63eec8113f57852de4ec9744b39fbe2a1aa1b419ed49b935494c96c7dc027ca4e14e56fdce4ba3d7ff9d280538676f0ce1fbba5932a906c7bc2bb909c4868fe4875c581b211c002017d6d4f131034e62a3d5ac138481b72ad528ba7cdf86ac179fa034fedf8c57e7a81a67e9a3ee1d07a71c8329863b6a3f792d191fa647ccf85ce9ddc6e27c37ba5ba6eb6d256605bd124e09a90dc84fbbc8184c974d0d2a84d6ebc4d038c77d50cd08b2bd87416f0d4c5b8c3b8cfc2f3c2783f2bc938cdc2ce12de662ad0389e23c69923c64904561ca8c9e215bc04f5cf768b078ed207d8c8b75eb787233715a9a44a5090ab14075909d93ea84f5e57d00d13c74a070f7ba5089515415ebfe00a99f18164e3164eab5559afc782854a357cbbc5e357bb6f3c5ddd977a9d8a8f7bc930ef19e81c61e6d5efc51789f6b3b9a0543fcc8fe907474c7bf03ba32b2f2f1ea9d4d482afee7c7a88528b7e9cfefd6252fd1161a5c0331c3825703228c6fcf27c1e97b8cf368fb82cd56eab808e9e22a12bc88d14849a0fb6ef13c34a4a6a2a74f7fcdda0aa61f75452ed900ae7cad87d9bfbad9ded8e6fd3b2353d22faa438b0ef2103c28bf5d9d3227471832312326a76b4e78f5bcac055f84e89d76db5c30e0ad9abcbac2e10aa5f668f7de31dfdde4b96ce99bf6c901918db3cc82961be8022c302650daf10f3cc95362380052a49db4336106e1103c8482337267106b4107881698ee4fb4ff3163fac5fb47c76e9b3df8f4e88db8ee28ad58e367daac59d0fdd6577aa89ee84a370476b71dbb095f86a713b36f043b76cde3ab0283e6645e3e91d3f2efdef1831ce31629c63e2c7453597b9c67b6feffbc7d510878d2171edf8b871f6f68c13f3c778148fb3b71867e2f98c8dd3f4b3a846b8a8711f3ccee82a595f77e59d939e52ea93ab9ef962d0523312aa0059d6c640f23e2925ce998cb5a4022115078c88cce9d201436f28bd5108a2b1ae98d631d6b5bb8e674efdeea11583f5613b65d3f98f1a55c21c310f63f09e61e0f27c6f7d1d7d8f30aef3ce2b7f0fc627d7a917bfe3c5fffb05d3bb0ed4046f61fe9435bf8333a7fd26032c892014df23fac580d0c1930a8bbddc4679f1b1e441aaa607bdcf6548bf7716bf770ef8fb775e4878cbc5f727899309dea8d8f87f9f30fdb83ff4fa99f5d4d883ee18aee7ab8b33cd4d79c335c855e275ecfb7ec135f9e97b1a7c1151e33ce0fbd1be58f79f95ff9a3449a91f27e40f9b0a1521a9a0f8bd1ff0ce17f7854447e72c9fc3b4deb3bdbf276f7f9104c2818644db491229f0f64303f07b5f3d099f96bde94ef5aa39051b22b65207fc9255e738bd10429b5216366feec14d58c2d17b93051206b903077ac770df70e403c876b29d6eb632e27d2cdc6e3b89d41e390192830a901c689c9475b79ade66dbe0784d9f395eaadc4ef32b6b65cb88f7c40159d50e248437cc96633714cdd1339d5ff8d4f8e76fd59be3c9d247493545eea27c206084acb2a2fa1e929040f4272f1e4ee5f02ee0558074841400da06703cd340efef21f42dcda02dde7fc6cc5f6729d576ff63d79f3d59ffb63af46713f70b0749ce314ed46009f236cc467f8a74271539b8622a98e8fad87cf9bafda7efa3cfafbeefe70c5985f7874a880ef6629224b0af48a2639515b93fd3bc929b2e54246493a8b8dc8b9f5548240148ef1f48404c90a18262828eefc18ca8b85e465257d1f70367cde518c85d15df9957aaadd4b225f3bf5f7ba852ad738eeceb9e4fb546d57df75823b1627e93781f2697282378a657a2cc10f811f15ef95179cb8d1b95fae2df2f76795a334e4543370dde0aab0c49d0d20d9dbf8f9024997063fdb32a8f54b479cadb222a49fb8b09888fb3cb330089b0a31b300aa1ec71376cc9335b9ea85ca839d10bffbcf05b4d699b9fd4a676c719fa5566a5aed9bf7382a7d0464520a13eb648076d12a7076dd06411ef64cccca2003645c74904ffd2016dde2e990d82fcbdf3456a8fed0dd02b64ddb9b131b0d15d2c7419a0e7cb6924547163b9846a4f8cdbaed638830a4b753504936d510139b836ffb06ec22fe729f5e9c2e7c63eab0fbea29f374ddfbad50c8ce2059853ee6ba02420acb222b7533ae0c84d57a83ef860a2b4ed71e9dbe31b138e5cf433bdbf87f48a707eae7ac435801e909675836bb4af51b3f6a2330f8c435280d51fb3b999752675e103799ddae89be4a04d45812abf4d2f7a7fe53b9553b76ace7a5c8d8f073e3345cfd19b9b8ab7bc82f90848f7cd9cfa5cfc0e022d397a72df65151508728548d247f556e4c12f09b3efe0a27e9ee8033a825030be3ceff3e877ba8e739ae1b9cc796bbc8bbf9ef9ed2f33f5f63ee9c4abc2ba9f529cd2b9996bde962aa96405a5628c9a8d7734fb69602023e8c137e3f8efef76eb0acdbbeae73e0bc1e0708439158822b774b23d918d4fe476e3004d4a5db2c8ffde1e98b4fd5504845a9e01c4c971a0a1e8d3c68c37be6ffd76c3603797cbf2b1f3cffc5a4fd4fe9ddb4f6b7d8d52a91bd31a1e7c6d8267e52bb8e5527a73dab88263080a20923688eeb0310c807f44925adc496d1063d9ebca2cb01d0dd00b33a112a933b633402f281dfe94ed0c240c26a8b9e63e11a782036fdd0b2bce1f3f5e7fb6664f757da991de1c2f6fb9bd085e7b4c38289e000759710f4088f864ece500411190c61c31447be67ce9c001a1f26da802bc19181b3a0a9880647aff1e5aa2d48a090b3bfeae39bd8c9cc31f3a42738c29dfa674ce3cc883d360cdc0bdc99c43b24158d690d34560c474ae0b96a6ce993ef871a516749a346d16fc838880b29b33248a22230bc76c1d225e866d1aa492a29c4a24c9615e1d92348860900461a3df9bdfdddb643fa8d9de2e7b2a45c4f3d058699c873e7de730eecfc5effaefe545a5eb5c09a6ded0c68fcf3956a926630e1873c9ab985ff70bf873c7d9e8e79a3ef63d4b94017161858919d6b2fb4ad7ace9a0d46739cfddf736dc99652a1e628828ae83bf13314ce4cd86efcbaa404884acc222d5556feffc246f7bda0612d078e061f4a54d041b9c757b7480e88363cbaaf5376cb953a9af7f7b7d7aafdb35c77aceda7b5e772732a22274bfa7d9b00df44ea6834e6283c857d103dab910bafc885797bf1dbafd6ce0e92eee0b639c5e5dabe3b395085d39fa725cd9c2b621c6a96cdf389d78fc2adfeb971ed3edd2fc117ed18fe9f4b33de3b439aec43ce714e747f7205fd2744eedfc2ca586bcf5e4b12ee7557e4969334a0ee79338b07198632689438aee14e8465e56a40b26880d54253931aaa419d078dde27ab68190aa04ebcf3da88b9b6fea553a48a91f6f1fdcf08695fab719654dc68fdb06eed8f717b60c87be07e28fbc362227ecb541551e51b160cb1d4a4ddffccdb01fe0564b121707ea617ed87b4710661949ce8443d828a48ebd4ada88b2bd9079701b3022672149b3bd909f13a0d377e8bbd0381ff28e9fe6a13c2ed9e60ffb7e74d84c2d01977f5cf2c44f676cd39611463f823eed2fd3e7f5bf6d1b5fd9d8b2e3dca49f5faf7e7bc163e4464dde700fc4c6e5b6d280b204acaa123611b2f1c9f991f358fdf6574b20d4228921ab08f2d00787c91c838dbe9efaaa0595ebdcfb167d31eda9a9f594aafb75a3bb7f395f73108d1b3f78821bd1bec0ea5c3bcbf3cc0ce08a624bc0317824099fe49005afaba190689a52ea942491a8413608728bed847a1bac3a4b5a235a7036901c46727c0aa9a0308b4272c809901ca4089e2bb2c006e5e00af62e19eb1927249e67033dd20000800049444154caa3ca87ba1b66f26923af7976ad3e60af1c72f658f7ca91ce264ebb4e1b8674bc50a530c188338646fb58d7e44dc48483bc73c8ff9d4478e2446df4893050cc49508b18c01274d8db9792734813bc92f95b4a5cafa0351f2cbbed3bcdb1ef5fdaaef258cdf18756a76c6af140c267640077d8e0c6aea0dc5f6bc87622243de4e05af3e2d2b1a3f4fcfcfef2d46f669c6750920a8f732441a2209bc756a8b64a496585dfd96b8d5454940e9ceaa5d07c1600d2c12de6b7da12c68eb608609e80384f1cf1770e27a0f3260c988bbfebdf0fb832eb3e37f757bd48c3b6dddcacce4111e46cd3622fce0cf38c00491dfd8aec8affb9b68ed175deebf2689a3ec78e99f1d41f88df609514f601bba5cff3f6e93b9542526155ad34a2c3fbca2779d86a3bdbdf4402e11636806a4f578d07840e95bd2f28bf3d71a4ad0d242f91a20c7d20fdfbcb5bc7eeab0fa403078f3e671f2d994c58bbe01d3d7155232b07accc8c7b26710c4111ef170644bcdba8617ebada662deeea46bc3b594e17f42982381bf76db366368f5346bcb7445c697f6f847a825af10923de7db5e8af412df9b037925e2f3a1a97e3196740647ee59d95735c4e7c79f8b7b69f6a517b48a727b27a757175bddf1d3313077cf1b3800840db8a0379abd1faaba263007301efc6f51420380d1001826ee548b75520c2bc92ea7b50e01445e2eee046a29aea24b1502df5aa8f00c1f9961f65a04b10d79eb5aceb86054a7df7e2db9b2fefa5d4fa352b8e7a70a6be765ce5a7cbae49f010b94e6d451910bceb08dfabe2f48a6c37427bdac0af5f183e09cf072165c9830e28cc13a9a64ae877ec2bf26ea3e492151f1a58f92f406494a00c13d2bb67bb258b5dddc20670a09c5166b3719e22b8697dd0f94292ab1b883772c1ab678eeaa67f3bbaacdfa433a3fb26610479dc3e8d3e554690d33950d9a5a2b4d82d0075f382673fff4ca9a1673f7ddb9d13955a78c2d4cf0bb19e4b4cc873ccdb4d7abd615f9420854929e277caaec3f8b1ee99612209846c4f36607fff9455affd5d2410d9e88550471ad60ba584570ccd83036f12f2f776b061aa36eb491eb4e93d97822fda326dee143df16b2e583a6aa4a6f08df25a6eae5d5ba9f409355f3bf860cd096cb55a44d34147d8a869227fef0a8878efa9aec1184d2470402dee6dd43236c917a9667896157d5b2dd1a076322250f31149df097c5b4fd4aceec311efa62f22deadb7e9efe0847aa296791f964c2ec2fb7922dee3bca32ec2fdc668fe86ba0ff72170922d5634ce0ce051b82eda776654f67625855537169eeda6f11e7dfec0d00b6f6882317bf449938bdce8d8e2a94593cd2da5f06ba70d41b078898145308e93bb28110cf63a815b6f296c60954702526a121ce894a2c141ca0d07a938f88db6b751ce029258f03e9cc0330c084e922bc7e8755a5e5a3ada4de9535038337f9e269c4bface6efa8996c49aefdbfa81ba75f4fa1c5cf3b5435c770fcdc9227bf56a3c0b91ca58477db8f67cf47b6dbc66f5e73ff4556a5eebf133c693919b2295895060be8a6f01a448f25c5cf7878144402ae840fad9c02a404a5144df5eda1afe360de9cef97cb1013300c1a038b6ffbeaa82aa37dcefdca6d9d1fb86f4795173459dae5d5c964f4690d3faef09c983ec323817b6feb461c9af8d94faeaeb37521ed18469ca355f7d39493fb7b8ffe69fb69888320e842d39d4c0adc420cdf542fa7e25fbe0bec30d2c0781af4837d0976d370c4836a2016a079bb5a337eea1661b40eebe246a5af0b60941824a79c4c0d454c0470d4c433d87f4d30dac09d1ad065255d4d222e9be3533af6dd64ca943ea865b5ea245c17aa58d979fad3772e8b494468d1ac586e24b72689b842c7a81a060933517630dc78f3ace3bc6abf2e923543e03d0ef095584ed353afb8cd0d20d508948f21ccad66ac6b51d11ca89555159f0fe998bf0b970e271563c593e73fd7abde7862ca9fc5e733c13bffde2beafee556add172b6edd0486a092b2b5922449ba5be2f8c8dd561c783e9dbc4c578d03af02aa1ae6bc84ad43eacaf980dfd9063cec9e1e31209403089543da1106a6c206920e5d37adcb1ac8fd54e309a5da1d7542d7767f2a95f951c70e376a0258ebd8ba634f7d34faac309543c0b3c3e6d9e6e985f7fc7ac7f35ab298d26944d308c6c1b643d88e8a88a3c5a147d97437dd81eb288219f3cbba7472772677580ca1fa69c0ff5e8dbd3ce93be1fba588f3c44da514ae77e9afffd292579b4b8e29ffa98bf265809049294b4ed9faeb6fcd959a3f67e2ad6e4dfe9fed2ffe37f37c838f032729ee4dda38608ba11c63ec05777c62c8650828be895457e40587f54e8cf6ceaffbbfab04422d02980748bae602c00cc031dedb7c015e8bbdd7b9c9efa2504b365b2b364c2bba58a9c54533c64ed3a2e4c24953d33fd194bfc63575be993f5f2f9aaf6b2d4e75bdbbaad2fa367373f9740bbdef12262b56f02a7aa0ca5adc49dd6c65c47bb6a8a827d377e724cbbaeaf54f8fab999d386d7d6c9c1918675e140645bc537a78789b390f54ce710f9c4d9bd67ce88af4f39f9db4e103cd517ddbeeed7fbf5da5d46f23274d706d50c5f3b78c22b75b3606524a05e45422d19b75b9e455026f124ea141de2564cc953a7910204a26c77106bb9b70502bf0e225ee9374ee1671a739e2f964d4cc0324ce30434bcc2b962e700b282d7c79f2f831eef8dba84b7fd0eb719f679a5c72e0937a5dfe9036bba5cb2815eaa767c6b0cea933aeebeb5a32db327cdda68d4836c8f34e11cba433271d3ba57ea182437410891421aca2c230399ec29613b297b488b7cb2c19be1f7d4797d014b69f7dc9a61795ea58e7f4f3720bf48fedd40375bac6f65fc9595bef9bac25d0df474c1bdc5f9f2f5ffcf6e2b9eef42c1b38ffee15a4faa3c03fcae54569efc93984e26bc0301161a78c00e49e5b2ee23b2a64ca161161ee0b8c2d48381bdbd1feee12886c1103e23f6814e2779248429048524e319038bd347cb0741c3c35e07e980e512f1d1c60da63dedfd3c66b1cb7a53f525373846daee8d4b1dd4aa59a6f6d5d7292e66c6bf5ae5bd1467368e967d6ce3d584b2e2993537aed333d36aa6a4b0e739062b22724073b201ea08f90246cafe42025891d4d0f5f59a762999b5caf7c63c9d9cbaf576a73cd75bfcc7b4d6fa06eb38e9a3849138c777e3e72d122b75a5fc585c499929fbf2f771179d151d237923c90f48db2e6b22421385ff23e61ef128a3778d00b2b4d3a4acef2bcc70847508b18c0ebf566035390543024d667eaa906b2e44ceb1212740d482ae990506a6e56aad5c8c31ecc385ac38687f4f9b726dcb5ebd5df98b55aa95187bcdae83170d0243190ff3f49763eef35106e8eb301072c250ff66e0c1b1058437b2f6b7c9ea0cf1a0e30daa9a719983e41a92b3eed3bb34f58cfc5a4cacb5c82baa4e79cab7fd0d78f3b20ff8e25b061d1f723092605f888a160db2e24058ec711927711050eca887eec2319cfe4abef21bc0b77ddf7dadb0808b5880124724a5581057745df02000746aaaef4cf0de40dfb98b7cff0746f5f6ef45470c6295a826970e2bee3ea7753aad1c21637367e45e33ca3d6e3759ed6b071cdc1aecd25f5fbf4776b3ea52f1e6ff572c76b7550b746399d4354dba859f432abab7551ec552963b16e207fea32ef64982bace1dc37ff759f32cba8b3155d8ed665e63e67ae7393bb80ca37960e71dd5dcb528abbbbbaefd2014583dc0364cdf5cb2e5ff789521b5baecad82a74da94fe9923834564af8f7090682e52d33001211d3b1112e2a888609ce8859cb2a2b3173fe73a42dd0e075e447f19e1902d6200a9b6422028ccf08090f03ac5fa4c23c687080741acbb1ab0f1a4c3af3f158c133150d4e8fbc814179cda0384830f2c541094f3cd1c2d4920d20d746f6fb601fc9d08d2f7014c032171558c513801f04903ebd4c175743ee07b90ea9d244e522d717c0649e8c438a14fce419260f07d54d783548b58f755c22964d713fabd9580508b182009090770914e9308c9615e980aa3136f5810102610c419c21b2c6dbcb89e16c8a780500d50adec9493bdcf67db4d8e183771a8648cede07bd33ddb8840d8807410531d1778b3c46735755ba5486227e377e401560e6f114ea34e816de5debe8c33e09c5522c29973fc8401ff6ac2211b9531803157ae4f863f1ac89209ad37b10e99a010a7fb88170fad2b960c313fe542d7cec91331efacc292849a525e8481f71f2279700b1bc03657fcecfb2ec4809e2e20be43ad5ab88e248f142f5e22bc559280906a8b54b4987fb271c81c60fc5dc8c64784ddf1becfeeb34da5ee6a847bb8850d70002deadb06b20a031bd5c142a882c4e0c0cba10a1fb8121f9c3e7c05e627053ac854b88fb24a8c080844fe14480129901a52f03b4b4404a9c200f02ae0b5268b7e8edaa38d0f5c8ccbc1387cb98928fd33057ade893ede9b0f7ae26045c05605d5c87e0f7d72b3edec85952778f155e17747a8529c30a074c70d277ccdbfaed1b84c121d5515419fd627cd33b95b82e1a0f5c9f34db5ac6104a7832705de3accb0a02f8da7155059955344f9d180142f83038c395a1c74be38193bc13beecd2d6200c789d0814f8498246e3a1fb01e2d48060ae7818244920a15217f0fc22308884c1e4b92067de732b87f57e2fb5491c41110b0b9fb0907b5bd5d02912d6c803701b38a25b9830eda221db4e0fc885320af2e3af049224911a26c2a9449a4db4cbd15fd1f12e36742421208cdff58316e15f01ebbba450ce085269a2f8218aa21592783d36dcbfa0d32bbb2c87e5b3113f0bfdeeb181f491a528516c469ed2d075bd800e9ad25555c969464c9b607c2429c700a189a1470c8b46e99e31591d8940edd2721922e9e0e2a996c0fe3fec7491eb2850d604984f62bbe0b7d8f14712e30630915177d0fb68111a3400484f60b7d0f620cc43e621522ed071167238de37bce1b6e6f9740648b18c0eb1b134c924915fcf45955441f000739492895d8a02910f52b2142a6c08d2e04513f85206d6c10a0907033e603812412aac468893ec511900d049ca1daa2764f23fc22e7933c881d3c9fbc6d48b75a0509c58db78942704a7cf0904a8b36c828f13b119883c47d64fcc30672285755588c8fc6bbb7e9e2230638610359720624826991bb2511568af8a66478a8049882f52955a5167e575049b16e1c2a2b2e814a121d491cf83bcfab7003dd6be679475bc4009644b07fc98b939d08305f0adfc3c139e040b2e3ef019b8682ad89093a9c45f87b200ea70ae70a13187c47a74a3c5fdaf8a497d56e6fff3402225bd800aaf5ab1090a668e32020870eee2a3ad049e70ee36e08128b850867f2e70f81530b216297bc6bacb3c47d504d8540182c04c4b1044204060190aa55d237db3ded2a2f245520135ad88eaa28e00a91d75517a08f886cb6912010902280abe0865d05c25c85646f74305204b783bfb304d45d8c8772544112dadbe20eb8450ce0f5490736a93a6c40bca745019158375520ec15f062e3f586804cb6a521a2994a94b21304d9b41aa28fefc811fa34aede025fbeb76fd1efddd5ded9f03e5c039c20924a2a042ad33aacc2fb32e389b80e0bb63c5215f2bc50013cda0fcf7a9f47dfc181130947f45366030a80a5d2ca14584deb251cfc6abbb7fdd3090835923810c8c6120a1d40c268cc111644f1b1404254a43e823eb295b24a0cbae310227759f4c586b6f6f1f65975015b8005dd342db4bfac8150d2c1c32a2c44ca3acb00893382379583dad3cc61e1c0639d3e7170c4e92215066f20da50b6f7b9ccf1ae12e39c539d97d90b1abd876d00af4ffa0f312f746054e180b3d60082f072f4f379e2394845e280602892ec40c09930930414c1dfc1f8d07ae7030b0c183340bb5be5ba9b9a430cdd50f13b1110aa4bd453dc88f7ad0aa3ff27fab061f077682beea3752f55502471df0848eb9fbe3fe2d75456c2d7f80bda3fcd06b2b32d62007f781b7dd2855adebf87a81f4a7c1dd93aa48d435ec73a57e2ec68c1ee6123ba6cbe5c4680b2029f34daf1df49f5618bdf855717a5a2f1d95c8274bb76c038edc057f967b48801bc2e88e3c7c1266d68bcaee43a0a27c61bf8f7b0c06f0bbcd4efa312b748c038f65093ebd4f777a9b2a5835dda12e8ba1cef7581f31b09788e7cbe7c0e8d23c9b8fffaf6ff8b0492acd906c885604963b72d206d1821babb3aed86afeeb74fe854a58e79ec8cad75ce56aac9432d3bee73ae52b50bebdd55e75a4d5c5aa62c8e1ad95e77d2d4f59a6b79d3f9dc72259d03f4fd86e3eb15e55c56eb63d88ec30d4700759b35573c759ea77bba7a31faeb8b94e1c7fcdd5ac8d79bfbc9b1e0e618e668ffead0b7ee73ad5be80a15e59cac2f4365d1837d95bacf95204a5a16854ade556a43fecabe9bef506af2daaf9f7253962cf978eebc0a18731dd8867c2534c92b8e6c1e82c028499068e30a6f1696182defef7bad6a2ba8850d600905ebce92bf538b00ca830bd7cb1441ded05215637c88513a3576dff1cf743ba2865e59077538eccb7afb2a556765fdd13517b96aafaab91e4276b1732dd5d97055b34e4b6768743ddfa6c0675bd138796b8142bcbc65e4dc5e588737a1aff8efbfc5bf8a55687e2fdfafec4cd7bd7bc584df5fdbfca552e353beb8329a2961e1daf57c109fe69d176654e81c0474e065c5eb16467207c673ae8d4ff3d4c7fb3bafdf20afa8b04ad898c0fce5aaa9eab6ff5f2510da7824b286016dfc2e378e15fbfd3ceb9661753541c8fad709bf759dacd75c4afab747eb051bea9ff2d8e1b7ea6bda85de6ef387eebf199ad8c20d5cb454dfa85153e696c253e372e750295b332a99bb4a449cc7e1c3a8ab9d0bcb06be1ce08b005f0ef045043e1bbd20fed2db7e503fb85e3d55af55951716ba2e8f95df2db84ca9d29e45ddbed71bf9f73b674e1b79b75279231ece5f4a2a32d2bd1361116ea7acfaa2be9080b84fa27d77efdffffe1b71275b18d03680d76f90244d90eed7fd6b073e795c132d11b6fcad4df7cbf4ba0df54abdaffd0d1a8e0f75683b58c39b42b96d96b96a1c6b79e368a4bf35c60d70d4abc53c2556d1b20f9e6146c5b9d7c4bab2d1ef233224d8de0a7efa5f83bf8fafefc527332e387a5968c6c4395b9db3e5680d5fad4a29cc74d54b1583172c50aae2ea8aeb16bca9d4cae282db3fdfa8d41ba3ee9ee7964c2e1eb7e54d760f172a26b91e7deb8f246e257ecff6e2f349d461b597b6ffdf0808057291712b82be543de925fadf55cfddbaef6b4a35bd63ff79975ca209c592d48fcf9be94a25a1f1c70c77f977ab221a21dc412e6c2f7f973449219a950fdfb08b387715369e0f9f02be08f07937640ef7e7603c1d802f022c1e3e3330d58a4c918292b51a5ff5084950d31bdbe5b02a4696771fa30ffa0d9fad9efdde337a037f78d7a4e123945a73c31fe754483752f2d6a20d4c8183bd459f8cbfa4331692c83f4e32b10d88cbf86afac4f044445fc3bbde7cf78dc30ed392f0c6fa4f5caa097b4af394a74fd39cb9f57ba8c6a1435d75acd5075e5c8610f8bf7bd8e016a97682d6ab95842149ca580510a25dc5f0a039eb9c27d7eaf7aff8b1ecc2715a02d9dc6ebdfd4547a53ebff895ab467dadd4ac93c73d568cf828197f210b8871802b412240d2fddc06c41bec7debf39f4e40c206f0d224c98308c9c54ad56dd3e04bd76ffee606afdc75c64f4aa57d5ef38a1b87e88d7549e8a6d3ddc8f453acb1513f7b5ae8b69018628423d9c11fc67d3646b3472486c05c5882d3f3718e010470473768b2567955e569f335c15e75d992268fe979eff7758f15a3e00ee9cbf143fef244382820eb65031d383b54495d7618fdbd5d32891840465d5ecf7184e2922beefdb46e5da55abf78e491572f8d265d2cca6da599a3f3436f1cea26b16482c0c93e693d58e887d10f627c4cdf7fd01b7cb1c264169ee2c1c77d99955ae480f311b01dcd26bd83cdc972c66efa424bd02d8b370fbb5da9826b66a5bf71b9667826ddfdf81ca485e7754801b314f84a714b24d190242d55b6c2b6e7b3e94576e60d7667fba712908801be1427cd946a92d3b224454b14d77ef2d4c8f3ffa509c62b356add73affe5be75051c78edba12aa2e4871d5073dcc6c1df67070ffe7c98d02fe23a1c11735da0c460035fe2833f1f7fbf88379e8dbf6e2f2769eecb0781bc08efb98b3668502bbfacece1896728b5f8fa5f8f7f3455a9d786ddf1d464533d3d963c6eb4e8534022a9c468a312874884c3c6efb451c3bb7efcbbb4850d905e4e1679611da2d4559ff57dbc4103a50e98d86ed04d599a607c98fae9ad6ee5bcabad798d676d839190ebcbf2fa545583f1d9397cbc7eab8dbfba8484f027dc6f3bdc5cd5983ef8cb524be67eadcf8d82b1b39bbd709e5e9f9fde71e1346495e688fe208687080af5a5ad4f12149f71ebefd252feea01eca21636804b8912cc34d05549ddf29ffedf645eadd48925e71dffec417a832d4febf7886b2cfbb7b5a079f3b8859821544516a735370b310f7fa1c24d362c297d50f64a9686f5951a1584240fcfedaaea98ebf0774b6c1c2a8599419c19927767066ca0ae286d4b7d4b96c6c5719421383fcc597464f1e3eecaf8bbe33d88c02acfbc64c630ec4c4bf9352567ff2b946a5cd062f9a5f3943a36e5ac4eee86fab1eba7fb4cd31cb433c35948df990237991050c1201a4944f40bc4ef79e2f7825df106bba0d906706967eaebf768f8e4bea342b728d5ebcbb786e4dea954a3b1cd6b7d76ae9e8bd2948e679fad5c9373ddda37c57d97d8411cc5a2bf5e0f6033fd08fa19fcdd33cc7d62fd5329d70c71d05b027f21f0c54a387bf031639519b0bf72846a3693f1e761fc1918ffb6c71b542f6747d7a9e56ae5f4fa74529bb63e4dafcf035ad4bee24da5b29b77ef79f0294a8d9ef9e19bdf2070308400d910dcf42939236708a09185f1bb0d18f1fe9dbf3faefbdbaccfbd9e80840d084c09a1e11d33dfbdafb3e654eb5cdfe0eee1ada21b605ce793a20bc9f0b3969018620b3d8267781762064b20c6d9f622e6e423c0e73df8f37c12430f8cd13c9708d61cfcbd13fe4ea27b266d742131f410124321e333ef910fefabaee63d59b2caf4a9206ce0cbf08cbb5010c07cd411e96af5c3dd1909e7656737a86c6e253e8db9e69175da9cd852a9cef75e30a8ed754a2dfa78e6033f0c526ac386d55f539d0acae1c592751e600ee3327fcef3f6a5fbe45f5e492f62001f1c790684f44a68f7c1b193dc142657edd337edf5e7dc3203a9a7f72ed07f6c667d56c7b576c56ae0dbd19b32a85e4c1023216aec5b98bd0ca1eacc14eb97189f1c5ccf12297f77c2efc5470c490fb91f02c6dbc3871ffd80751a63d4c47859f58afd45e3e78af63bd6ac284e95ba5f7a797b2df9e5fcef92ff1e778f52f54e6e3479da614acd1b3671e566646ab010c82cbd3bb9767e2efa79e8033221e983df6dc0c84e8d7c17b4d05f3d801d6c949204594de9bc706d19b73df2c6191d224add97f9e1d0f73fd007cf05b53ff9de55750c745e77bda29c5ecad41e478deeb85ae261f33b6a18a3c6b4fe48a6e6346a8aab21a8817c3a6aa2f752de5ae8ed4d9f6b8ca346b5ea8d38d608d730bf49e0cbc275a8796daee71ae543ccf50ed76a1735d01df47be33dbaa3e42ee313b5cb8770adf230f0f5f68cdbc17b50adedee2a2b1ebf9e97dede7911f340b5d667735cef2e69b5dfadfbfad95395ea79cc8ba3bfd51cf74dfd5f38edac2bf137e41eaa81ca93e95f1898b6dec054144c0a217b72086e99e4c0cca49502fbf6df9523df46cbf23e979d3a9a29d5e681a36e4bd59cedddbf0ebaf1c2214a5d70e8ed874cd5479e7556e8f91e4be2d703d5e446dfc1fa89d5d837eb275663ff265c87f5c9b5ec69bd9aef68cb9adf8caf3fae33d747047ec2d75eaca3a0f112fe64e395fb4baed370d078057e1bfbaf373b39ef92759a3ebf66a9cbb076ce38effed18d94ead3e1d3d7fbeaef9873f1251f1c8075596ba28135871958a38b81692d0d4c81a332650de7dc667806c78bd13afdcb020bf73209842936118eba0686f446baabf3c0963d0af4c7685efbae2f57eabfadb5aa5c6f1375b6becd3d286e47edf02755cde84d61d82ea68063a2f4003670f7e1eac6d1bfe88f66fa5df1f96e578703df6ce03335c5fb015327d442b7717d0c5f07e0335503baa27f3bfa7d703dd556ef072f2aa8b814d56a1fc9e30e47fb11f4495ee9ae4c65e5662cf866e2b961e0234e54011fbd6d27e06b0a7c9d80af03f0d14c29efbc900a0ff78fc47bc4f0992765ee24c787163a2074627d2d8934fa7ebfaa73de53aac1a9cd668fd75f76f6e4f1456bb04e426464a6f5b22f6e46640c4b1a1429938b3ebd214936f9bb62c4095a18cf856d87eac0b892c6058d6fcfa8a3bfd0491f759f32448f2ff58dd49ef7df161d5b8b669ae0591fd17a404dee91b09da146b75ec7a8814f5e785091d27aea84fb6df45932c177cba4f5eaabf94df88a701df934d6c175a6df83d79b771d058cd742cd7e9564bc8c8ff717fa7d766cbc711611acd35d23415b2badba692ddc9a2db59a1c75a6526df38f742e7d4da903b6b6fdcf2f8d959aee7c3ff44f387db0aa8b522b916deb1903391b32358a8807c9f3852314ecccc8b7a7ed25048408076f383a2034a776d71b03e7dfad45c69473d256bfb0c188e42197f796222de9fc5192551f70fd8035c35c87855318647b80086c4304865fbaa6fe51c1d29ae253e598bff7205d3089f401b6873e166aabab6812ee043699305e7eac075f4c34cff08c7b2497ae9d82f708c7bf07eb8c7d3699009df94861dc97aa03a9ea504215219d120a770d2189aab8f4939a3cdb6245a69eb9d1151fce1b0e0e8f0f875cc0020302dd7bdf15b8a9985707effd3bddc20648d5ab9bb9e0aafe8f0c6c74817eadfa873c3a7cb3be666668f529efab7895615ef4e22c43f6f4d73d241e2b3312f4bda5b139f6fd73cd75acea01fe242a2e52a15a02bf5c5f36f0fb55509909c72b55b201ebdfa95fd5c4ad1d5ef665c95b6b3421dd7adba6d396680e7d53ceda110bde50aa746151e3959a23af9c59317bcb1dfafa6b9c196e6126eb736b7ff7bcb06aa70c4cff207a86e446d747d88c6fb7a9b8d0ace3ad9a35ced0f4f2f203569ca319df36fd8f7c60712ba5263f3beaad82025c43e75c8617fab265cb759a8bfb07a21f062cd8f9716fbb59bbfb013bd96c037c711a2ee1683af0bc871f76a58fd4c60f3d1ce5b448b318c1bfa69fc307bf39e8fbf8bc3f22789ab91eb6072b99df3b0e7e2b76f00fc558c39e5163215a7d026c0ffeb88d2077601bff9a71260ba4ea6e3849cd9d780f7ee115e6ccaabaccdd90eb87fe79c8cc864aadbdffcfe68bae526acda0a5c3ff68add4ea17ffe8b57a8de6a41eaaf9a4ab02aa734b83a1b58f566affd7db4e3ee86a7d70dfd8b2fdbf062bb54fc3c60ddbb5d3dfa379ca996ec9d5a4de31dde1b63c5446d4ef5c5b76c182579fd1b2e673adaefbf89dc5e637aeb8478593088a8a87be825522f7d04e7bc3000fbf71c4009770fcdfd17d521bbea454cb21ad7f1ddd595ff366e8f9c30e57c1713a63b15ec25c02d936d761ddc6d6b19721925e81e85b7d183fed8b6daed7eac61559b140432f0321f1c7dc7573dcacb745ef6f6a5ea80fc4e55f2e7a69b2e6c47f7de98733a6d6536aca41dfdc5290a7bfc5ad55abd84d5606f8496fa6480c663cd861647d2d9b1fd7bbdb7f0e5fa754bb538efefc0c2db9d679b941fdb6cbf5b778c03a3e5a386a17bb03fbda58d5d775fb5d7cc3ac7e776e51eae5336f3eea8b4de64fa5a2a433ad5b99769f0b49492fae3de65df87725206103a4ea216a146ff2ced737acd422fd41e9435efe4599051de524e48296073f1f5c66830c95077000a71cecf76e8e83ee4680d4ff7a321225c087bf061efc7410903b305ae28da982dc13e5b8c5bc946e28deb24673d4f3ea4c0c0dd784e0fbe683bff9596fa0d5d72f7d6333158612f53d387d3b6a8d5396504a6fedb6167d5bd7ab7b8e52e7bcf2df3f4f3f5da956cb3bac38ab9652e9e7d6287439eaa407e02edaa0ce994e5d371071d8b503be385faf8fb1e3f31f5908555409d2c9134129439c0913124adf4f8404f1249c057567736e897202ae31f5dc26b74c724b1db71b74ecac51c7baf310fae9c48a040c90747725c9776e124662bbddc1b7bdbeaa1b572423c683189f8ac165cf6dbc4da985d7ce58f055b152931e1ff1cdc4a795fa6df5d4f6ab90ec4406e8518132ae8f416eda14f7438444e654132d9e31dd2f2da37bdd7e4a759df7df534f0e6909e19e8ebf5ca8bf7bdaf1351a377a396e3e6cf1fe3bd99cb39c7a6e05ced923279c7ce3c74abd73fb031b23f81b5522a4daf55cd256961afecb08c9df558595678075b58121bdb16ebbf9cd87ceeba53fe8313526bcfd968abaf5b97f67cec812aaa23c293140273b4091c410d589c689dede833f99aa882410c6b773aa22bd308d57978c1cdf5e5591e58d1c77d63ac32af5425bb4f59716233447fd66e3bbafed7fb752d3fb8c3ee237bd708bbedc34b518151a99c381f1984bcca25f8eaaec1528454b2537ddeb378f5957563c52a9a95bbf7d7c96e6a826ffe7ebefbed2a4b0ed9d47ffeaa67ea997d6e08ab6e3310f99712a8e4ce1d5b593eec0d642abcc5561367ffee04f9b0cd704e48921bf4532ccdf9c568057011600ca248f74e05056541c48568f1d1991f2d999dcecb919a587eeefd68fc97eb1fb231fd5d0bffdc76a71da872ace6b891816cc03ab8cb08e07324364bebf543d92043250ee0be0cf11f8c672df327d1fe1b0d1033ee10e2cc7db83fbe6793d0cbeaaa72af34a4a94fafd8c19ab877da1d4bbff7d70547f2d234fbef8ab4db3f58e5c5bb4a2ffe697cc83b9c4eb5b80587f65afa30fa373199548461d8d72147a2ba3f5faa0171fc337013521da52b5614e895eafd35f1a3d7cde7e9a905df8d58523f4789a576436700309eb7769bae4e0befa2cda907242ad1be3e62373e70889b5c02a73d741d34ff77ff5d4a57a9fdcd430ebe71b949afbddcf43d7ac35d7500550525d39229e890904fd9e011801cc15fd5dd6fe6e1248c400aee075b35237747b3ebfcd377a6237363a61d299fac7bbadd16e52c26d04fc4989c136d7414240dc86255545317c36ee4ec68199fbbb5b9068a80c545289c106be3eb8cef31ebe1c41313ffd3e786ed833ee0055515593aacfcaba2935eadc7787f4bb47a909977d3e7c3e361e979a254e9b2ad1d1ef540f850a3f550a48e9d9856e96393a8c9c0b6dfda8d48513ee687d8216cd8f59dae53f7777d2bf2d4d9d58bb9f0a5425ee74c4fb18157109c1f7bd06e75ead8fb8e127bf9e311df51a88a32b46019f12a4d12f433d06aa155e81b4e795548f4170b6d59644220690249d728896a47f7a77c8bd5a024a599f7afc238f6c53d20d9b5f452068966138b4bc9a4cf235f8aa8d9fefc377f1ae2f9f4a96f0fb23c84dbf8feeeb795bfee7c21a63341c76efab5b3f5daffb072e6cbcfe7083992bf15124b7286d2cd723d50ce7f54b017bb2467eb28c0311037c9549e3d66d14ea03bec109cd9ad49ea8d4d5573e3ae1cac54ab5dcd26659f7598a3520bb4a82aea85f3ee68f3fb424b2f48153bacf566a9e3de9df2b5698bf95922a966aa6a3e473b9a8f4292b17d2fbeffa54297f17021236800f20fdff13979edf387d9852c7adec963e417314d69fd6931d37051f983e559114356163d0c73d490c73e39f99f4e0f7e3b381af0ff04580af7a07bf24803652a3f44132c5edddf842b73de3a631cdf2ee52ea93c6cfdd3b1aaa18b92159c280ae953938ba4e88ca95e00cf94015aa81f8f89b28c406e492c07a639ef5cd75271fae0f9070db8b173ea32593d0d050abf474153bb0923306dbd5b65ebfe9a969cf2af550dd6e5fdd081b4411fc758aef01446d71d2359752adf0190656a07ec3769776b50de075ad19a2ff1df97a8dec0b94aa19aab5e05b577576b26523550e1152dcc5eb2c12fd5dda32068070f4c43af6ad273ee83df892aab8c2162490c07d66630e128e57e29f7ac2b757bff186261ca7f55f376e9cb9900e7c5e8fb40e2149706df072efdfe977b20d708964590a99321088e49c7c70d29b813521776e82b2c22895aaa512c22ebca2cb83a373f4fd879f9c73c15dc7e87b4f0dadaf556bd71192ad6f6dec3646afaf87e69cbbe946d42d625b1e6c24bc4e69de683ea87225a9fe0252faec7cfb9ba8b0d8cfc136c03d80ce2feca52ef9440ff1fd94e76f724bae5ae200cef32de88ce8ef41816d8510e46c480c0385aa282f89c420039cc83bc5a72a403f2f89c4205566851489ee8bf40e1b7c811c690ef045c7bdbed39fb9bf36d21ccca2fb8ffad02deeff917ab13cddcc2b198bcbc169978283296d6e600912c2970212675e8af8891294462dbd1678a02220dd6c192a0c92caabe20a402ac1aa39a30583a62d5ef9b352878ee8bcb4566da5eaded1b0ede1876f635ee43c14729855a6aa464b9f5aa37373fd9e15b795678ed7846cf107bf46d6a1146c15545a6484ad5a642097ee251b086ac13b19401a01b4459f9a19b92710f09c277afe5a477fd97d7bb71a35da55c9acb316357851c5af337a2fb96e131ff4d99040a6601dcb08f2c21d8c201f8bb7f207d6e6e19dcdfd03b71d41be6ac592d1131e53eafd5bfb8efd0405ca985090ea098480243eb249955c6a2011f492fd005f33b018925ce9ebdeeb48b55586380a7696c0f398415ae01d47051dc02875c00c962050f112f82fbffff0de6237a5c980e2d77f7a422fc68f0f7dc7cdca9d7246ea0d510dc94e7a19a61f59f3d24c4dca67341d73d5fb7add6efd65e3c072a8dc58d5da4af4096600c2898409461e60c1ce8c2cbefdd504c436c08224c4a947b42879e2fee79dfb8a1bc179acbafe40d7b81b5be019d18b3244aa0d69632814077f3efce357b3ea2a027c7400dbc0670881d4394b5b493e0efad56a35aeeb0e7c99786ed8e0f3b93ddac0e77d8f58a4f714e033f7c7085806f0e5019fe760a9a85976ece62395fae0fc479feba739fb4d83d7debc152572cb5a0362a3968280d0c62cc5c62cc1062e25633371e42030c4f1947d0e482234085305e99c4972a11c5504e3921f6e18b47aeba29a9a839b179e79be6b343e3e5437bdad4ae40e6ae62933e080ada6ada466699d92f5d395faf9cbe1c3676ec43840302a1188286bb257de803e15bea20d2b39b93cf130f4793deb1575d629d72fb84413e6d0b89443aecc56c111d362ddb2243110fa8230f74d1c43f700062876d0db1815182069cba075c6712079e87b18131e6fe1b619acdf3bcd48fd5c33046f1f73ffddefbb9cfbbbaa8a0f6c405a37ec6d4484830806312eb42e014bc1c0903344d97c014108ca6003619b1d313242455bf196f89d246d6133a93c0050a8ca5cdb44e1cb733e5fffa9668cde9fb6efb7fabee346749d77c5026518da4cb5d336bdd677776ce1aa84c7f7fbfc9529887be375482a557272c13a261b1fdb4cc2e2f70cc0c88e8c28befd5591e8941597bc5222068634cf7ecb3bafaebee61cdd39441d7ae227d1c931db35e2845de0b447e4e810f4c3c647c6b91011d14191b8dd9d6b70dd71c087c8718af4c6f5b148effe5e7c88aced8dc86fc493687ca79bebccf5848fc6ed0445bc3b1cf11e06be2ef1f835368a1c0f035f6fe0a37930be4139ceab6e65bfc8531f7dfaca10a59655fd36721d365cd9930612612846a9dc22d468dfbad5c0cd58685bde411f46bb2dc3011168b7159ce1d677bdf713a1da32d97bfd162cf42d5bfdf8e776fdf9a56573f4c61b3cf5babeb7e81f5f71aadcc0285f44bdcd11efd17e60c4fb52fdbf6db4fdfe9571f0197a83d568576b582dc477d4a801888324fd7103d31e3530a591811c094c56ae382faa68a38262367e27abc4214a9ddae4caffd63c4ae3b825f58ffb3b2ace701018312dd6adb20322b29109212ee3c185b8cfec83ee02ff106f4436e3ef2ff1f3bef0e08bed0bef3eab6a52f953e5794acd6c1ab9e25dfd5ddfefdab7db276ea4ff494e791924d3122419245521af3fac9bcd38f868dd31440a90cd20f4bc4eefc2fd19c057e4c55bdc03f019ef7319c206567437200ee6a25c2fdead5827bc9eef0c1eef9203e70efb73b452f35e987865ef889ea78bab3e2b3d28b65f7734e27ddf9456196eaeb32bda3f38258cdf6ae3b9357f3790322ea483b14b23953145b2938d87322e5060ec4ed7b0ffab24102ad94a91e4fa052f19727faba65b94aadfbfe9db23dc83a797ba3bfd9aa8aed71b28950f01ac2b07ce450f6e6b2422519b627a6c4496f6c176ce52e746fb03ac6bcc7588d4a52cb85d832265a122202fae3ee03bb3a0721a600e7e7dd56a8ccf5c5f2802b2a67823c735be02e0cb00be289f630dc5676d2a22c70bf1dea4aa9b622270d71cf3c7d953f2941a3af4d99787c36ba87c8281a53f195832c8c06214f72fc6bc17a3c6753172f41443075cbacc40524995d507bcc340e6d848558583b61235b82b7f01444d743676fe6c60552dc0364a4d2b1cfde6224d584e9a77fe39c7acd28b7f6cfa99fbbb78fb307f5f807930f31414f17e9c8a92376b0d6f0f0fc797b23c35a59eded035fad61ee79efff35e9af8c3f20f310e4818aca280a4547996b7cf7121385898a32386080717b99f87862a754ef39e993df503439d530a2e7b38ba5e282ec7acb37e14318d754a190d060644785304f9ed58c773185f7fdc47fbc01b91ddd51b91cdf89bfaf09bbfe71b7c7add25de174d745f73c0d30b472f786ba652c3faf69f301611d5a412225512312ec590208a0ff1fe5e04425c82f92b012b504292c5fb80b42ec90b0b35ded9f9e348032bc138f13a942a28591e0011e19535c5fd483d52b9c97b3d49a695641b834dd075739fb6e9bb977ed7077cd32d07b499afc7bb5f8dccbbbbb859a2af52ff87837cbb22dead19d6b2d0251a5fc3fd5b1ca925e79fbf1f71f5679ad1297bbcf8d5ca2fcd35ce99804f611c2499d40624f7deb3bcd0ba7b5b4fae4edbd304c43680371a168e1bca9fd3e3f2c9f71c1755651c78ca23d183c190194add413add0c615c1ce8335a1bec8542053505a276368c7f6b025505f4414d9f5450854205350509304817bd06c748863062c6540819c097077c5eddf6148e1cef67ded7abe28a534944802fda9fdce2ab8f3fd01c73c1c8598bc95b83dc134bf17dc958cc711001360ef23b972a804a703a643cafc2c265ff7bf27e81ce9503bbe877481eec3e4b07af79b368ca86c337872fafa3dfbc5eed866961330f799887c4aa14a9fa198803b829ab6acc3cc90dda4ebdb55a4b6a135f1ab1744643f17e7440e0e0280701a434f1bef78384c549ee32d01fa8d4c92bfe2fada626e8cd171c74f4604dd0adc5eae87a87a96da83aa5bbae2fc27b2cae33fd42a4e6b0814faab8f2808fddd871ff40815fd812797d06a9b8b02ffef8e8b795df2ed082cd374fbf341c3c35db384855059569111815b661d07aa4f507e330a9b0c81b8e6d16a42225a3bb5425617d914a92fa52e5e88364337857dc87dfd918bfd8db27b75a5621d1df81d73dd77eadfcf197657a5f1e9a7ed2bdeedfebdedaf0944ecd12a8d6e97b2649f1136a98b2c1adefd2b269ebc6abb5a435a5ff372fcdc7bef515b27a578c5fb8fffa9c3f720123db1a41c2516def0d3bd9c280b601aeede3d497af3aa3f624371a37e5b29b5ca138623e2f275b8b18ef662dda9bbbc7c0dbd9367d279b974314ab1619b3715dc4dccff8cc53f3595560fa6370bd6dae8fe1431f2a288daf37f099e75e88b0b07c88fa0e9e3706d793ea25dba1b71e037cdef788e1ebeee93bf8fb185c6fe37ee0734ead3add354a4fedf1ed01bf81d3abc482218e8c3620e998894094d2c6a5dfb171c9b8eef3d612de32e4e5213939f93b491ed2ab860e84b236b1f1fcba6cdccddf552498976cef3cd0f7d5f360e33aeff795f3dcdbeb6c5cefcc065f1e88832295bcc4c8bb06de3629a700c2d84e2a00cea23a36004600f5baee70c8095d2f7725b886aaa2c5e5d1f119956304ebcae175dadbfb5ebcce8cea13aa4e5a574e2cd9a7c127d76d84d7ad07bfde2f89f187197f18f7d9e87bf1017fc594b2269b6f57ead3675ff8231f9204af0f923c28821a360e22144c384812811b7531181bf682fbda8b870908d924681d3ee4855501859c92c14a799face3216c22bcafc896739f78dfb880d5813d7b5ff4ae66982a9cf26e2baef79f3b4ed877ee6cb3658ce890eea68fb736841ea8010d433a9c64d2a07948850a96d633953be0e4a116908505dceeb6a70848d8005f1a63bdf1da743ceafa735c9bc7bdce870dce8beafa23d13fe6fb0e608f0d20688113e1f06dc87cb66d40c5e1fd8071f8e8b944383c07121f6844382ef4967d71c2b81e3afc0404d06bcba071e78300127e98be9cb0d7564207e6d6a337375db244a9cd75d6e6916e970f6e3ab0c9ed91bca428ce81bcb1be155046b88a8d042d79cc2d50787f70c4bae0882a094a82029597bb2147b77d7fd992abf53d7f547de21e5071071de6218031c8e6f502428e79a20d2a0ed89a7dea3ed3021216b969b2dbe629dedf69e35962e3791dab63d00ac5ae0bdd9c72e19557c6addf7cb34e785df9d6b3785fff3af0ae2b1bf87a07ae5bef3aeb2df03b9230739ff685171ff0ff366cdac5c38e526ae3b9ab3f2a426024ad17f6c6c3fa222f3f22204438a43b2a7b61915306b9ef0232c1a0f588a3d657bb5c014a092309a4efc7c668405eb7a2e2a06f9f4982124710d7fcf78f8e9bf47a5e7ad2dcfb5f7831363a870877f0f7c3f7f7b6f4949a8bf6d71272b78b6efcace306fc06c291960638de406688683d932d4f9ec339de79a87edbc30484250f827ae02975d39a5deeaa4ae860204e2996fedccb710651ee086f98ea490cd9019c1d6df8884f6290f8ba039f314afa2506410069dc011c1e73a8c0cf1c2aaeb7bd0766c9775b8e5d0d5d3b2f74e29870509743c72f37b8f4b7e7d41dc489112442404799024cb6216df4e9bede5ebccc391201f92e36aecaf5e567ba49e6f43cd8e67d933006c449b304b26dc6206540ca43758c1521162846101b8ce302c8f848128694402ceffbbafddc471efbf2a0f7f47f7f66159d70a28aaddff6db96a8e3181471d0f33a30d7cbfd21d759d0bab5057e264c5efc8e9048085fe996e25fd7e81d34f2aad7978e16de75c49933a322e269386e81240bf2e6a380385a8fa2d224c77708ef385faa124130e479930c26252c63c43868fd0a0985256bbc0f4b54fafd5fbffcae8bbee8a5ffbb53c9e639ee97a3f94ef6fd025ad665c73f76066c364438d24f479f080849d630aa33432419215bc06ab73d444038b2dcc60f7ae0ff19786b59e3c67a086f875e3e6d5c8283df262f10c17186bd077f1ce50ee3fec41b32dfd4dbf0a98ac2e2e0f7e1f31efc3e89e142ce94047ce2e0979c72108717e350b11d02541138302b0fab7881381f5ed82232970f68caa123fddbbff35eef13f189070ae30d2181547b434a4985f090919a601c47e76439cfb91baeda8c0171ea73aac71884ce4dbdb8168cf84c2088609c22fab0154909440608c6ab06ea0e69f8e1c5cdf4f3729c68481e7f771e1fcf02adab30c68bf715eb4cac03de0fbc3f707fb275db5be077121366494808df6f1d271ffde51d9a7119bcf5675285922d82545714195d2adc7439829a6c6c227095dd67b11e39923adb0b791d4a421151bbb6d9dee7480987f6054bd8224343b9c8ade612ca8ab7cb5bbb9258c1f1b346bdd8c8238184a330e8fb0548248ddaef777858afbf9aa3ea8cae09e7149640004995c51236ad6b4948f0be2c8954bbed6e0212167d22247ae0fbe6b652e1ded1859b937a9af21ffcbd213148ddad14e9934b0c36f099fe1ca12af26f181bf70571b211830f84638e38f8fd9c7244e04bc8e1313ebf4aaeb7675e306e6774551a1104aaf92d0fe440af932aeff5b2e83f46e613edb9804d759bb89f555df49cb8b8108697a8d9d1852d3794cfb6216c25edb1ed831903d3bf4cbd4ea2bd45ba61824410481221b7dd20c923ec85eecfd63ed69da7a62a1fc1675527ad03c7c75044f0be5ec2e9f86c19065f6fe0b3036c4272ddfa6d7c0909b364809cb4aa9aae0a73c215c3f22691571ad61b4bb6a4c221098402048354a622b29c0907312e42a2e0f54323dfd32d2c9e2ffa4ce884244f048425134d5887b67feea748445f7b61e58d9b7ab9124892ef1770aea58c4f5d52af9e52279f7ee9891d5619fc8922e6a3d712630442224bebfa92058513ce4282b6a708886d403cc796124e6f1276ff1e2c721b892189eed67fd004705e36faed85aa2899c42074961ca7413ae8f6e2e00f9018e238633c3740a72d74ce71f3e239306b0eafd3ac314548d34623ce883622b2e77a0e68e5cf19c4f7670b483c8fad76aed1fd11c08003c21d57a867ca93fbb9018ec96c48ac92c168e7409518cc1898fb7f549d6958216268089e2c7e879138d0681ec7109d74f88517d47a5a774684ba1d7bac9fe0fb54a7ca67c4f67ef76cf1be31c6cae00b92d08325302ffe00159a648036e5af7d7bee5ca5d6a42eddb889dc59c996859964c201c9830908491a4438a4c421555401eb62b7491adbdbf0fc404282f1cadc5e2c91e8f75fbf70e58b6e2a9de22bb73c3eda7dff64df4fdaf48426a4f5f48ec38e42bc4cda69064a02c292086c213e9b9e90acff3604c49294cdc6ef7ac0564f2b3fdb51db10b9abadbb355803383bd61153e0949418fc2a02efc1ef0889c11612c31c71f007480c719cb1c0276d3e42b20a30bad79a5d77c6fe70b365ed3f71f6b4a08788df09d2060d63066cef7dbc5109ee6c8b88e7d3f3bac7c673d8f3d94fb8de24d689d6fe51afa56436a4de4222a4c0ca648cc149ce0f3cae3802108524c20b49434a1c52127161db099d1a1cefaa6a1e721e720b07c5a98ccc78a4ead44fe8bcdfddcf4078f7436fe0b305839244028b93e812e277c22ce144fb7f7cffdbd39310a0c792ab3022b37712110ab26d947baf9312b12f0d7b10e1f8bbb58801bc5f6c6f9f35024448a4d15d1394b5f5ff78db4d5fef24fb7e496c7a8dbb36afd71199154855e5231c9040c8d6e7b3e9d1391d16fda46d4fd940e236da11b79ed2b1c613bae3580bdbb846de40919b8ccd4215954c55e49718c2069f5189f92406bf8a200c2cf401c3f837b1c4208da30112431c01b43de3669db6cf98461bdaf6cc0bc69df24ada61f5672875f0594774776d499e16069c1d3f23ca4f18007dc9e6226af7348937ce1faecbdcdc338f776d1f396a4cd436d17bdb8c81f4ae8aa926036c4834cf3fa893e8f13e49428af6542ad416bf87c5ef7a5da716d4d81a2da11ca4328a79d9c983c2cb5044844a23c8966133a3e55d678ecf2d97f079f1fbdc4979bf918413bd7ec66763eace6860de93549e32b961b928cc452a2ab6bd05481c3ed5540430acf68e1631404a2444109940d2bcc5b9c78fb8fecda3c6e8fb9d39cee212d7bd599e13f4fd82dcb8f13d6b85eb763808019ca94428c8e6417d481e6cfb206f2ccbfb1edb9f0672771110db0be3b35e1edef594d5ae88af272cfa628e4c11c2a93fb84f0bdef02732450871febd59e4a3dfc3660cb8bf3d19abc575b1e786f17b76003e07f8687c59c0d73e009fe31db7f73d742f5be033d7b1e4e3887951621e0cecb2aac7ffae44ae1e2b02489c051608ab64141aae93dfc7e795b19b1b17a6d2e3a9b1b4f6ff32725deecd09b94654e6cc28b5c91831affeef6ebe476f25e61990f0a92ade263c5fc22b25c8b828090c1bcff5fc8516855a1dff4dc2ef9e641d38def51c4be5e2fdeefef567fad9bef52cf6071b6b3df883d629f5cb6e2a7d71c3ad4a1566cd3e7035b218578a780f361207a9aec8bb0a84c497351707abcf38beb7b588012c81e03d581221c98b547f7a5e1675fb25cd75ef2d7fa56cc4ac2671eb43ac074ee9131646757ce7d0d1a96fd69ba6d43137745977e0bb063f1bd36113a1d43c2c919024229c4868bd57df2b6b4fb9f1da3198767ffa8ad6cb5452375535a79ade507edb83b95fda1ec80b260b7caf9f53a4e54b9c3f9eeb93244c9fbcbab2a04a902aae00e3afcf1b4672a83e7760c1910a91b6fee5cd4e3e567330077d7ef861248910c1a022fd1c0847c6e21fbcd705e940a568bbcb5b87d87f3efad5c53fbcad09e18a7b7e6f7eaee678abdeaedcb2fc031533e6063b2598fe6ccef514bddea7e2a2f5f65ddcf393799d5c24fa76e2cba22ad94bacc1adaf518924611a1fe5f00a47fb3e6f3261bc6609354012cb4fa2e2ca162a34a9d293fb4d792595d21fb6beb70ac659e6a885f3057bf38980be4a59a7830ed63180b4d36cf4817faf6f1140db00270c88f7f505306ac252f95e45ad684a9d00dbde36545ca68f73e2802bda95b6844a9b09c3235e9822e34072c4b8abadbaa2b6bb084838713f7a207da886377c21da8db8ff385295136189c11b0712e40d15e055e213eddb8370f046164671bfedc17bf0cb0f7821fab369c30b1597cf5819a0daa0f7087007f6cd8b50e558abadabdd08d43322d70cb81eb98178c1502435380e1fe7418485088ee0b477dc3f5cb4b0f739d4ac0ee2ba8852af8cbfe5b309a72b35acd5802da7a52b555cb065ca2837f99d3f80903690f9de8231f0a9b8687d9c1c6373f9201bb363ef132ffa3be3d49f6e4df3c008f22ccc62f519212208def725e33b656a0874d715ef2f55be315b5fb667bce8177fb965161390002f3f8ed416ba7e261ce48e4bce1ad9de799307ee3fa505c6a9e0f77842527970f92b7fb409667c7cde867e679c68bf76ee3e87d6ef66f0fadcd3699f13e328dd780318c5e4b690dd44406464230f24a2ffdfc87aa5eeb32ad83d514a0cc9bca102bc4a7cc6f739220e84f8032931f88c974924862c1cfcd59418a4118c251f8a0311fef9810788e0401ad46e36a8b3dec0675e705d8be3906d348544d77102e2772634b4a04842913601fa7ed575e30d0346bc787c7d3be07efdfba4efbfba7afd7aa51e5970d1c33dd728b574c86f115bbf715566d5668fce988c8d823108f46a1a1d934158071f348e8066253242663a6fb9b98a826c67091897c4eb205904b9f4eaf2d90e03bcaefc715684afb767bcd86f1567971d45190ef840146edf4c508860c80054922cc2b81f045b1ea8ffb81601b40de0f7264984243a4d982bc655348de6b08b313ef4fd480209c7f7f91c1212657ab79abd6a2379a2641019d23e972a59a9c2adb62d64777b618983c2ed5bcdd5a6ba261bac38a805a58df9cd4b8e2e0c9cde835fc98d27269cd2c0c754455e7c81c64b9fc4609e4369c467e3e0f7abd01273ca4111ef2c81046c787980080e84f01dee648fb9ef78a50efd39fbdffb23a92245a2728e9c53bd90080d1bdb607cf3796b501a732b09140b91346489dc5f3d7f171c4f3cc7f66ac3db9efef8267dfe37fae0b6cb5a2a55fa7bf1dc052d30032a8e3188cd4b62c6e014e764c61fe0c6cc0740b2c4dbb69ea3d343f3a2f3f3b5da58d78d700f3266fb559d89d781dc0ff2a08f88f7150c852f854e75256ac7eb7d18aa9d3a9e722c51524c9f719822c3a91f14318ef92552c52da2fe99cd4efcb3741a70e72734d46aeb468e3b01818581aa582151a65d57f3813af096234d4248a8ac7dfb4e3a85a8807e60db535e5871ba6667b8dac74d02262506dfc2ce177efd82a34ba02ab20dbe00551179e9c45445369e6b0e7a7fc47bc4834f72b273e0d545f882536d78c61de856198b440f9a9731021f1d5076fcb8adffa64cabf38c52279f7269b8572f97605b1f51ae9cf4c70c247f714e79400405120a1312d2a1caf80882c2586f89bfb32d46afb30e734e5ce91af7ee993be8fd136074256f11a94a936e9155713af6315d060f5eb850a917ac1b9ec81da8d42ab5b4d110378dbd6d948a8e7f9ee9bb19acdfc5bcb0d81be87beff3989090917f1b6ddf469923a34919f5735252e3d69b4cee392489aad36feb0be33a2f23e424b399057af379f0fb23dea96ff0a594a40ea0d418b8d39ff283084a6ff13bedd86cef752ce94504fca7371b30021836c09daf50b7d4171acc543146437c3f474a94010c66ca8b2947a4a19e8db471b0338d545d4986ef6f63030968d101df84823481c911e9a00fe0907654554412c30eaa8a7c9c1db903e7b304b243124360f6e1ed35b60ae372edd7ea571d7f9d52ff6bffea03cf68cef8a0470fcf6b028e9ab27846dda9555c364f4a8120090ad94e3e053c59c0bede3ebb11ea0335f79e470f6ab6af5217be7f47cfe177ea710da957f707bdeeeeebf161bd9b517889236689701141c102c74cb091d635de6e7c6bf51ab7a0d50bf7fff7b867f7516ae9a6f96fbef6a38a9b67b13e22fcbd79c55410611211f17c1052c11d3c5fb6e8c62b51996e12459f842ab3eda2c053e0fa0d625c826c39d54da1932cfbabe46cb1ce422f871e6302922de6c5d9f6ef3edb19416a1101ffa18d096902c923da22ee9e09fdbbd1ccb8ef279c26b61150eb6530573a875be64ebf8a55120a12f9717df5250ed9f63001719b73a953e9be685255114b20011cddf6aa8af285c4b09daa221f6737872b12423591444510b4c18372256dafb135c0ebacf63df51ffdb7beb27b9f3b8b3ffe48a9cbb21f6c71b616756b1e53a77e2d14a2e1b4d0e06098a0484905f50758159600b66f77dcc9356b2875eff20f5ebefa3da55aed97654daead176dba75f9a9711c7acd2db5ef7b7ab1be6ef0fb331faa54aae18cfdbea959d38b8f0809736c58091cb8462922ca947a7551af05795d959a3b64d2b8c7f473aa52aace8f56aa93eb23ce599403dc44723c964c3ef63e97ad7163e2c63551dd10edc7387a8c56304843b0fe8224deed8d200f60841c29010bdb6102db9097b3c5f7495f5cb369a35f94b74504b4bd50da92feb1368eeab648403f6c803bd3d67ba1371ab905d9e8fbd9de73414a24b1ef89fe183e1fdfe1e74855f1d8c4cfafb6c4110efac39e222011c0b07ecd9e8ea974964c55149c1bcaf4b7575574a19018765255a425101bf88424c5e3b13de35662dc3eaf336527999788c0e7796ea0d719f085ee4c9dbeef254a65947578b6df14a56e5df1dacfa38e55eafa179ebdedba6b953af3b46b1ecdbac9f58cb2eea6e46c3ec2d2d1c03452856989e5daf14fe71e32541382e68316dcb5454b1a23efdc34e33ffade4b6a5ef6eac5faa20daa5f8b0509086077f5b0f58952b57eabbbf80e7ddfcddfbefcea174728755adb2b27646418fc6ca379247e06e38cb838f029f2d9cdbd34a8a1fdf897472bf5c519fdcfeea1f194d85b87ccbd286e5e4e5227d0d1cab98a449c027b191101210e1bf771b3f56f673a515f3287e27afc9c22492059f1fd9d8e20af3e23d43b1e9fe3b70d79c78bfd5763609d06075ea554dd760d66d7385d256e610145dbfee47cff9f34db0097910e2d0aed9f9119f7fd64260c29a106e5505bed4ce5cc0ab6f739b46f7c0405cd2791c8160e7a913de4c6ebb1faf757d1c2ab811c17896c1439bebd5959835445f94262d85955d11caec54ec64cafc4106cfc4a7c80ec2eafb3800324f476ea0cf78068b2aae5570f684ebce331a7b51e3d5a13821b3e5835f559a5ee5e36e8fccf6ed5b0c17b470dba5aa97bf61f74e23b9ab0dcf7ebe0d3bfd39cff83ed3f2e9bff9a52cd4765f69bac39ffb4f76bcdecfba3722bdc8d3a68d0361803e27845e478ea88b4ab8ee9a4d489adce3bf5eb12a5aee9f2e481ddce3133215332d00620632d491214c0e6d69b987cf857372f6aa5d433b3af29baee0fa556b658f2e77b99ee1f9de3495545d961298b2ca71327027201be84e3851ecef27de7e1e8fa664982be8b773d680964db043fc03dd3a7ea7498714119017a5eb519212f3ec9d9a26fdd6fddefaa140fc9fbf78083969a2b2cbcb7cf3946e8d4abad1a49f6f7bdbcf95284c44906976ebc7fc97eafebff3e2b54b3bd5b2297be5f6c1fd3f7ab9e44a9544c0209b0552675970e57efbd626d4fc581c435bde04d8a3a108ad8c16cfabe485b8ea0c5f5d9c2c8e888eb6291ca38b8189f377790c3d7399e71385e4ec09191cf8c4f65019f39a81d7140cae7c4c647e3cef6cc837c8fd8f8685eb23df320df37763f5dd75ecc73e2f71011efd68a508d7df7d587f680b48b5c63775a56fa88b326ebfe55e9ff3bff7c7d88df90727027d7bdf302ebf3e697c573de81efebf97e32125b7e37f580fa639fe7953af084762fbd3c4bbff67f3fbb6a66032de99cf6e484eea8494eb61ab2b900334b1454b8c84d5a57d466d34d1b8729f562ee0d573fdb4da987ac6ef54f82cda308b5cd8ba8521edc56b9a4aa2028e46de4310e77b5bae27d6ceffb7823c8b504e29d7fff3acc16df29db834f46906751b2d1c075b06dfc0e7bf978f0cbef71f0811dcf391139add8cd1be706a707c7c1c801aa32608d088c99a15da07bdfbb9acf6d3da254eb9e1defbeb6b5fb9b13553925fb7ef29c60233b9d5b4d9cf4406f2a40291132c15789ff9ebcfd05361035ce69eb524827a6ca21ce9f16b2a1bc417eee7eddad97f30aca0d4491e3dd252716a022607c01920479c17417712001a266a031940eced94974e422302d59c47b9c7bb113302f633ce30ed4b5621cb37d1c347d37db332f7ea78488c067ee1be2fdbe41f36ccdb71ad4d647f4019ddbad7afc27a5eeba3d6fcad36729d5eaccac99f5a71bcc64c4a7c871527171ae262af0739fc6fbb17330153ae21adca40213751c2a6103e08038e20169e5b97d1021bf6a3540e519a0e2daee08f25841a96daedf40c95a79f153c4bb23545c8d6f6a7e44e76f95aaf57dbde135a0caf4c5179ce2ed4b2f3c3ea8a4ce3dacfe99cd060c7b61bc113bb54eda9453b5c4ee24dbc722c9a54fc5458ceb3dce8d5638603cf2f7a0ebb6bbfd1546f42aa18292221b2d6c7fa9583351a4e2aaee4654c2ab2be64ee93d30a58a20b9178ce1f08778e340020f4cbff192c66dde83031203545cbce1c5c11fe4069ae535ee27cb6aec4b99210b606579239f39995fb08d27e14267154d775f4a19c918780f4210c0baf51b2c3bbbae52570ee85336b4835267bf7263e611879b1b3820d2dcc111d09c0d952ae751b658cae1244aa99271be7230f0887a296c047567e05bab962b89c40efa00e3f81ca45a0950716d7704b92d9c2e02d6af13e4841140f0e5ba0ae5a60edfe75cfdca0b2e69dd190499250d221c7dbd9024134eda8769f37903fd536d24612f8c271c3ddbbf38a25d3bfddf2d42758ee8a5e2bcacbc1a0635461acb03545c247fbf1b53614942e2cb00b1cbe6fdaf9040945ae9fe938093357de985b59da562b72131187c31774a1bcfdde6c11f687b20afaeeee2e097de50e2e08f335e7a0fc8d9d0698b0513ac230fe0745962f0e65e4a5691cee7c61cf112eeb848ea88171fcf4bf5188318beacf87ed21af28231487d2fed8f03ae54ea983bba341d74b05257f47b78fca9a79a275160241d681caf40c6774a6a4715f5446956999a8303e412a4e4b086a82b3ce30c8bef4fdf4f38353852b21611c881363f9a87dec2e92228075790e41e90be3d88a1387068d6e0b310e94c39957c258101397e8824122228749062a47cd0daea1fd582926fba04a4f165fbdf75bf6b7b8b387dddf9915e57beefe767a4bceb8af6f1db9a8450135e58bbaffd151288e3ec1bfd8fd886b0a3bffb7243f90e603a686c73dd76aa8ac86ba5faaaa230f0790f7e123163f86ce00b039ff7e00f2e8065c78f5b73f8e80b955cb650150573ba112f3e6feea504f31211f80421f78e3b4112cade09e7253901b4812fd93cd3c6f1be87e4d08f57f7a78e57aa75f38ecdfa7552eaeaa18f7ffe1fa8b652e96003a74c1b99664012145f52c08f701dae270984655b9ac9eabc77b292bb3102ea9dd720e3b82df0f9253d2ffe18e392f83bd9dca77de961286a75a8bb7f3bcdfa753af8ac3fff8579a1b81de9ce4dbf73a0a89438e860b3f1fb6e3fe8f6500b03da0610a174dffb16eb95473aacd673f25dca63e7bf14cf0026f97e52a20c92fcef756aec799560caee41eb8b802491577322471c78ca2ab7187ce8e894eb8f3a2a3ac9615c6c9659d8f4ad81aa28da6f6a38737d5d66b45f88ebc3e67a8bfa19c644a7afcb00be3ce0cb31f880bf03e1b3fa015f06f0e5015f0ef045802f07f86ce0eb017c3d81af27f045802f07f86ce0eb61f0619cb6790ffd7e346ef31e882b519dcc7bc7e605ef4df39287f7c8e17930cf198bf7c8c07bcc51b9069f35c58b8fdf2303f8f2808fc61d013e9a071bf82e02be3c312f11e0cb013e1bf87a78c63d16ef8179d0f83281cfc6bcf4f0cc4b18f394877e8e581f63715f06de639c15496dae5403d5f4a253b424724c9b335a1e788052cbd6cf9f3371a2521b37acd958f646f40e9f5755d581808b0089b0a0067cd59706aa3c40f3c6d1755ef7a0861fb86ecd6d271cb3efbdf746dfdb4af8de5966bde8af81f520d657a1585fb1f7eb81ebcc3c58c06f03df409a67e0abeefa95dfc906fe42c69f07fc9e75d1ecb1569fb53d4da95f52239f7d3d4fcfd18f15fdcb903287eb7e1041fe7fec7d77605455d6f87d93425540042c28a189065054c4b5918958f613bb045d154d5c5c0bbbbaea5ad6c68bbaeaeaea2a2aabd8829505549a28b6bc8080080a0a845e8288945002a46732bffbe69e73dedcf3e6e64d4050bfdf77ffc8cd9d7973deb9f5f4735175a864348f005fab8f23d561a8d78adf66295055e80da84b54ed3230e76ecb7be1993e723c3787b6f61c183b2fd4d316db777cfe2cd8c7b80f6d687786f9136afdeff8dbe62317970bf1ed639f7df15d1bf505bf0992bc14ab544d715018ff84296bc059c4372f0eeff02f2181dc141d19fba790a98ab298aac8f37377d4733e4e595715906ac7a02a1a047ef84c5514ec4e6950150d82f6deaa8ad0c633489718a261c66927ebc6cc6d48c973a20c9ec186e48d3383a7ab128d1203aa4e32992a918bf2ceded9905a766c7dc405170a71ed930f6f1adf4b880b3bdd7ce771db558f30309238659eaa4561e41547242e71cf45fd2a23bddf5e6a9ec4ebcb6783e2b60c068f3851834a2350d5c9e6c946fc0d363380df24bfd9135dd70b7151cead17e7a8882ee31ddc741737aab2186349e31c861adbbfb5e2a88abbcdbafdbea3dfab3767c9110e3d9bb2f4d26745431a06d5e6b642de3648fee2b53815d67e2bbf800472dca6018b410299091248624e761e719c4a62f0382613a7acda7e8e2b36ad526250ed9ed036490c45206023a7ec001e16937c4683c4d0d30278d02e619c32b63d7836c0d3fb313a5062c806780ec053bfb7e9f738ead88f61008f8f8ba3c1f3c6355fc3bb484fb5469c743f92f4f2138e4bb0c4a0de5b0cdff72389908fb30df0b2019e8e77913e0e12de48803710e0c5be0fb508ddd9ea62210efba86b8f4b24679679e5296595770931f7fb8f972f9ca43a0882882791a08aeb55f87cb3fe3d969804d2abcdad693f4a0964665f9040988457049c66969a5f39bbbd00efb0d66f2e591741db2459dbe2bc587334c033ac37b93e70bd227c05af00d65b364980198047676887e1779da1bb1abe2d67b769d3ab54888af3777570e4139be7942cdbfe817a30b24ad5751da106db52fd35aa26d604254138fa7e73467547553c49618a9440869ef9cf9423d708d1b6eed0cfa62e96df75b386b839ea1248946a7c69fe98a4ee804408eb5fce961aa5ceba4459f68fcde58be57bbeddf4d982ffdd12c80b9003354862c01bff7cc9e07e5e89419892cb9923de7589617192eec63c4d370ff4da575e677b2b3170afb3e00b9e1a9618b80d29c8f81c0ef03a1334bf0da794b95754baf1236d9f397c4b6eaefa653acb05c6d3de87e03e15ce10696e9ac78add6e1d0dca863b8e05c61a8cd846af35be4f4c81b64101abdeb86af0d10695acdb79b463746c441e34cd3f3e60fe01dfa807f815aa3cb719dd3783840258145f565847fcba8ba32adf55c8727d9c71fba00b9b49d27ec888ce156336ca0fcf1135ed068b04de71060d03cfa1166612a59df87cabdf54ff61a4ee67ef6940f925bcb0268b0bdda51a3547c6dab1b6ef46427e00b383df6c5c56ef4137ca9f4b554491e83f93aa88671ff63676e2033359af336f01da6c5c1c1d5e925e6741aa4454a1e181e71da81c5e725e6704cfa0eaf16ee84b8e31c88eb64542d0e45c5563d2404cd942aa18c8fde54b6b1f7fe09d2e5e8ad5a6f9f218988619224f6554a8f79bef139a271d9e699ff855b4dafa8a32c2170dc8c1157daefe30d7fdf99b73a7f57f44128c39cba6ac5bf50a8c539ca641ab71fcd0cd9aabb2b0c6e71847ff8babb6c2503baaf2a54587feb884f28c8acbce7fb6b5fcecbfd6cebe7db5759c2c83c5d78703ed2cf85661c1ceb7daef6ab250c2082a688bdafbb2af088863fe2ada29dacffdde7777b32f3216efb8c68399080c5fd8c8c13178f01c6e8ca840375e741fd5e179ef55cf7bf8c1ef710275f81e3cc22f0ccf6569cf65b17e107ecc26e0f5177fc7decb36b8cdee4a47424691ca8c73e411c71e7e0a6f9bf00b03bc2c8007e34cf8f171d1da1e7ef49e2cedf7997ab2cc04f3c6c68f71d4a6c8ec2c46c8bd718e3d5fff7c7d6bdcf8787f42f339aa6efab8aa314b715a1f55935b300b94730fbc68b598c4f0e7f3a5f0cc6177e767b1798efad661d4303e0a3e839760ddf0f1373da7e065b175c0c6bffcf4b2a7961f2ac4eb4fdebbf2baae42ccbafc8377173eafc681526730c21062f12029a648769450f8ef385c4e581ca86df1f394b00e8f13b810c75ff6eb8cf0a0b79a4b89e3efe2ed889b2a2774704a6bf79a01fff9a38fafff1c309e177adb3f9f317835732ab7b8297c12159221b138f0f95e1392fd4440349de726a134cadc48c7384d311639e8004e36c9c03684279fc3802e5b3da54b2222d9c036c8ae6a74a7f4738e85002f6c80a71bf793cf6564c7e38dfda0649426151771f48ca331b98112bc00d586cf4fdd2051993868c1545026bf777f64b69d181e53d5f58f7e8e0702651d86fb527ce9ecaf50351d704ce5122320a1fa2bdd83cdb88e094f76a1145f0f5cf5668a8f42c921f8022dd5662acf2857ed390c5fb67e2b9bedea59922bc4fbdf3d5dfa640b2176ff6dfb6d9590fa852ee462358e041622089c60e0418c07f30cfd797e256b8813143e1fecc027c212509bd29d936451c46a89d71f86dd3bbe5d7b29801e7269e64715f2b35353875df19248a4a2c47da69f0f81b9cf683e615e988681a940eb1ea919822978b050f24f07da9c6084d9f38d2628298dfd4172c53701e8d6261742a761bd0fdae2a613ff7d8b2fb333e43363acbbdadc16fb3a1cfb0d1a150792fbae72e7252323b8777aeebbea7932fa817109dcdbc85d6e20180d6d6bbc7a0e36201a154b7437586193fbaf03f0b2019e0df00603bc20774a1be0e5c1736180d719fa1706789d35f816738365c6359f71941b5b4b2c2070308ea399511cdf93ac1b730918a96dd113e015b07171005e36c0b3015e5e3cde16b963f371a179cbd3c6a5841b190d4e0925caa82ce1f5d2c6058e058417e91a79a542cedc8c35ef954dc25425afe975e40855d7bd0335b8a7d6032b4189b373a514734deb12d766d27d52dfbbeebe1b301571eb18ddad6dd66f72d7c5f953c65263bf8b58bffd4e0d6a9cb9bb2eed13b6de4ceee1b96a1e6be657fcfda7a38498b4f5f9618fbe2bc4b697366c2f5b00e3016eba649cc51a23fc0ff7be1f5635f2fec90709d1fbd3334eaeea20c4f799cee38b5d9bc0eafad7d13c4fa94f500586e705aabcf2588d073dfc1e56b02f69a0ec3b0c4992751ec30309c6000faf5bda8ebc3f5bc26d37e5c8e87bf3e4678bad938f9b20bcf92b817d9141fb42b54b02dce44df35744e1081909e18313cd0f672ceb375de2bd7cd1bc37d78e56f852668515aaae394cd564446781b3e8c64e2cb3037598b5a9ec2f0282290de4902c1f33a7748be4642a0acad2c66d11a2c3f0ce151def93dcde92b4944cf728a6380188d3002f1ddf81c90e86b88da90696792b91d74f31c17b12e0213fe3c05f3c301d06cf0678f900cf0678f900cf61f06c80a7be37c7afa836d804242169afe01141e4077f118367033cede017e02f6ee52bafaeb803d8d6c6050f7eee15e6793fd9006f18c0e3e3e2307836c0cbd7decbe357301e269fe62d3fe1b878de68450c9e0df0149eb83ef28931e0e31c7b3ed2ad6e4d453b21befce2bd6d9320db2ee6baaa03af2bcaa1f523b47f82e73022fd7555bb5bba456aab9b52df12a25bffbeb35d0212371e19301e05b1b689c099bcd738431486f9c47ef7032f2c07bcb0282e08c6b5c8b04f02e269eaeeabb24b25eb31f5ea510f3f365b884dcfae99b5f529180ff0aa425d3b72bc985b8cee673955882127e7d75ee31ad9971cb87ad09d52dabbbad9a503cf17a26fd6ef6b4fbf4a88c3da769b307fbe104be7cca9d8f19dfa5dca0faa2655d13aa851758804c78aef591ca180ef434868b2d9f3863ad405ea7cf6de87253dbde2e137bac8f79f939277d78bff91fd58d23ced1f43e56f1f11e7b51921fcf3970b84c45b9f0a1b1bf629329ab49f818c9ae62f0cf08a0c8c6c9e82b764e857d33f3c4988752f16cfdc04d71010e1c0543d10af43046425d490890119a868277813be11cb5ad6dee704046b9cf8380abfad6e4365e4152116bd5bb4e63349013ba6f578f50749e99ba51ed8379673e74831dc5531c8815207a0ffc0cc88b533920c6cebc72486fc464a0c3cb0ad1fb93be600bc0a782e0cf0d4f7268941308961a092182cb33bb00df032005e01c03311c091d0ee09e352c0c6458d53b6cf8d392f1e6f2e311839253a000338e7464a0c46b7584e004b48c244c62003e015c48f4bfd1b75a754b477737abe3f61ca1dea094e382867166cb8da09aaa61b0b7183c937b658d2bacc35ba776f79e2532081581a5e660267436f159ede3a56ed12365fbcdfc9ba41fb25eb0c353e89d7c3b496aff61d7eade468c72e1dba2913fa8fe3006ea17820d52c871a08894b582e3ff09ef517b712a2ed791d6f18fe9a50eb23cf5b07d68ad031ee3502ad1e6e3ffe1a591f7fe759d38f900758c6885ec76d7f46f26375b3a66c512b43a4c0418ea95342d7a9da4730f0c007c98552a7e4b1ef99ea8c54644840fe28c4b5473f34abfb39429c75d1906bfeb64b8803d71c5cf3ea03ee6f42a5bdfe22d439d459c4cf5f2e8c2f8e37b499c4172c49279e3f848f8484ef336034e6fccf944e2e43be75e38617cbe0de1e4e38709eaa0e5135057c82c44d044433028806023bf7310181ae7b0404269e7499c069b89cc7f20d739f59293770fdfbf56d3e937587c99deec85a289fc90c2d6bd55d98233739a7ec570da889f44b0cb1b6912308f2cb2f8603b098543b7ba72af222c79f04781900af00e0f103533ff8b9aaa858b400780e608307910dcfe5417f55bf8222de6d5225c201c83825bfc460c3731900af00e0357ca0369631f038bca41883c89975b67b53e197cefb4fb9174fb985240eccc68b2a99eed0060212014283a2bedbd316a9addbbb2aac6ec3fafe8b492080178c27321886086f5fbc8ba742b5e16d305f3a4344fb229badafa224256b580f5b42eb4639c38598fdf5843ed3e15c40d51d1d4090bdb81a0ea6ea6aa85f12e2e26db7560de82ac4a11f743be65177dc72459ebbbf7d2a185c076bc4d5ae9b6f4a76da9bc7dd2a0feadd6dbb5c2d259c7ef5e7bd78d1d342f46edbffde1692f5397848c721650749823664e95bbb17c9b1ffb0ae06770411162410261bcbc350cff0ea36fd0fc948bb5e883ffdf95f136ee821c419a70c3ae4e9de421cd0e5a0198f7493bf3d2fe5a053e4816bd55b9fc5bcf24c8c1b8e37ce5fae3ae502254aae6237cd5f18e099f659811573079abaf5e5766fca7ed66dab995af312cc17645e20427fa5375f6e410984c781f80888b1a4063db067058d374847c8bc081349815a80701db84fd63d2ec4c29e855bd63e22ff4fab5e7de345429c78cbfffcfb3f374b54c369b7755a2b1fcab262a61ecb89c606381ab662d0adc2289025f4c6828d8346e46cd08c0e57ee9e388d51f0c64211118d8c56218a8cf07b7c8f0defcd061b03a4d5465d24fdbec842235736c0031315e15dc8e0d9d00f484a6e156abf2f62ed420b47355feb07e201fdf5c685f0c987fe67c17b553fc17887042a6e1cf03d2a30d1f18d8b03fd0803bce1000f091ec7bb90c11b1e302e850c9ede8f4281cbdd06787c9c71ded4383d21d4f1375c900a2474178c5039d4f0b9053733c256f574ecc089c7cc9c078a7b636f769465242ac4990a4fc40bc6d386f9403c102f87b57deb187e57c4da8bf93804f43b1bbdef00ab7cd5ded175cb3fe75f28c407539f3ea26084faae0e541cb5a8aa02425b0381974848dcefcfeb79c359a7dc26c46129475dfff86cd7901e1d1efa87d7ff288e9d791d68f88624577bd44f42b41407d9ae4dbee767a7e5bb75e6a053d7efde2d71eb5b7b6ca1fca0aeaca6f9e276f20c59587fc94e8997b5c8aaaa7d57d6432dabee3e09efa1e8837592e4a6ffa5c9991d24614ff973da693d6e90f5a6d49d3d24c108cd0a1dd0fd18e1badb96346b26dc837e934be2093fc457e86ddff8f2f9f3cf271272fd3cf0ef6713fc22369fb82f62edc89c9a6bddfe57aedcfde75a60d0a3e0e480eb36fa37d6fe2bb43f869a393d245ff691048245526955f008038ae25369a1ce136d2572884aeb7f78a75c1e31eb2a8abb7c2c3986c31fed71e3c152226932b6594a8fdf8b384e99eb10939318485564d6ad6700bc028097586228a648f4bd53153189218ef3b6015e1ef4370cf0748981ab8a8a81e3251b922107974962e0c6ba71ba7343032a98c4124309937cc6412eb1814c62301a17717e133b51c4d990745522cbc155ff565d9e2b81cc5cfdc15353c00d1575fb5c678c9c760dd84250e4c7c86997536b3eb9759dcba1766b75e2a7779f1c9b1fd54fcf76941bc38324109454b9c417b08eb96acfcb999603bfb31aeab7cf763643a4d5cbfe7c3cfa95822786c5bcabf2cae1a0a9bd978d470d1b0ff9f980b4210f1cbb5588ae6f1cffd4888972efe6583bd2ddf4f716c79faf5f2e39027e41e371b035d55569a74453eb7b9c2b44da9f9a5c79bae49c9bbcdaecd9014325a158d874f039f2fbf4922639bf97e743bad5ec23377b70cacd6977f5970764cae294ea580e2a61e576f89dac57593531afbbeca0fdd6487c730d1225d700706711d3fc99ce1fc0b7eaa7f287d7cbf539ab7462d927304f2441a3e481f386f3f8a2aa2977d910556304bacf886e2cfb8a80ac5515a9b26c6823e118ad7f4f4a9a7cfdfb90e4f1ab36956f7693b22d1935f3f5996f4bd1f395439b96c8e70eac3e78ecc99273b4aaad9bd36f10f1c6db8c58cd554559b0a047e241a35445356d2b4ffee91d49b0eef961b8237fb9fa9905674e96846ae9a1b3cf99f88c105f1ff261fa98a385587ef5dcb61f4a4e6c7d9f65d33e7b45e2e594b7582c0f12eb71eb8f3b66bab103cd0f73addfd62da1264d8f168d5715f5635e6726a35ab2aaa27e70702569434ad6eb2c89247036c053fd26db4623bdcef801d2581b9281318814d6f58f1190fc0f9e9e324541226f95aba08ebb80ca2d3590dd170908dd0f2209488b6b5b2d88119009273eea1210d9ffb580871a8f121adfdcd8e7dca9c15b27b96c3c54bfbc75acdac1c93213f65b62a39e07d56ded9b95176dfe5a8ec32def5d3fb9addebf6a50752001a9fe03b45f16e2b49b2edddcbd9b10c71c715ac10b27b97687d0e466634522860bda7870e2fae5b601a3513fe178908a9933145c65c4192b4184541b0f09cf82b60e2f797c8be039d5c6649444b8a11dc40099e6af08090bacf702d82780eff6d19bbe58f06f21be7974da9a3990fc13558eb47e519204d51519d1210094bc1021a928b9f3ae1501c50a7a60ef0a2720ae4ef2d049dd9e7275c63f5db8f20efc1ed36ea742923bf4c76f0a2a84a6bf57350678b911c35d671ebff348d9f17e951754e43bf2bbb79a171cebe6e2416fa87ca6032e56edead6950f9648d2f16dc7699151db25617a7556edea6bd59338704889c9eb060f0cf073a7f4de70c5aa582c712c6a999b76b810fd870fbe2cdb8e39059c71c92512d7754d4b0e7727cabcb01596c51243b778d97dd5f79c2385b134e68612646445783d019e03dfea07bf6de294e8a056ef1d076f1eccbcce689c698326c6db070fae041e6c2d318c0b872734bcb98e7f1ce4fef2e08944e3529b555dbe658b104f9c73cd7537dca0bea850245b94dfa9d73b77aada559db80575fe683371ef0769f7c591954d9a0871eeeaebe76dbbc51d4fc4970869be1a2772ab1e0c6d07f054e36d1be6c764cbc8268239527b9f693db0f9af1f5a5f512d39f182b4bfbf7b8364782227d42eae8683a51c547ad5703570e5c7429cb0f89c8f0f9784e5a453cfbbe5c543e45ebe32a557ab0566f871f8e743db56fd84b6373ed9da78240f8faf2b9b8d8f93e478e07a56f0f269dd2687af7ffef2017ed03e407c75f81c5ff44e34ec8b65cbe7defc9a3c07c76e7e62cb44309ed37a0695eceebe7a7b273c873772220345f7e08057229edb2491f8cabe0a243415478e53f59005af5d23c49513f2ffe348c4ce7deffa9bdca4636e419b08a681c68ee1c6ad3c19ea7e42ac3a6dfe81ab25c57cf7ac870ef9e30f427cfec6e897cf6f2107e5a25d59731e1714a9593ba0eae61fa588376dcaab6fe47e28c4dbd38657dd3243118e458a57f50df46e10e5778197ce4ed0fd9695410d46d532d025ee3847be376b774169a9109f38af5df05e6f215efbf4eed6d7ac16e2a32f5e5efa876512e7c9bbc4f76e364e87451a0fa7486f88a43646d44380178b78775804ab17990d014b0111f53c72d910f14e11f78608e74644bc033c91a3c17344e27ef823bcb57ec4e1a7f7c3d123ea699ccf326f07536930c0ea52a84d11de384e98dbcdf6451c67b1dfb179308cc720ca80108def676044337c1eba2a34a78964d0aedcf9e07b0fc9a32863fdb119ed8ba1bf92816af141eb9753ff21c415afdf7ffc1db74bc23162e08bef6e9407d721d63897703436a23ec1ddfce184e3c13354f0f1308f0fc2cf6ad4789823f693c397cf5fe0bef2e1dbe0fc61060513fedfcf99de767eabd8933e8697ae62fe82d5c800e34e08439bd94278db5ff6b50d04240c324a4ae1ab775df83237adb1b52254f1fb3942342f6eb5e41ad9d1eeaf9c74847bd02f7965e69aa510928f5e1314405402801d55e100442501da192ddd5e2e37c0e267bf3ce5d34f2567b8f188b93f49ce70e6f071bd5e949cd5c6c7563fbf0d44710c84aafb93aab97b62f52950a397097a9f804848ba6008acaa7d06da40506ad17be57e49649ede3c7ed77342140f9879c8a7a70971d4fc7ef77791fd485fdde4c14e19223ea02e7176559f3714798f65c0a814c4fe722f1b54998c06afaec6deffc16d0f39ca46634d35a8b84a1a0e7cf4b929e6800e7f2aa89cb88a2bc08dd9a74acb010e8fe0311517a892226fd43d5d2e198559df4da89ad24e3dc9afb2a5f8865ba18d596613a9b09ab6badf5561753de784ee3115164a66e4dd47b622e51cd1ce375f05d04f9df3cc609c32f7ba9b0af04c2a2eb32d4a839f7a69fa55ade4baedf2d5710f9df3b614588f3ee37727ee12a24ffd590f5fdf4d4ad607b43cb6f7fb225ea7aff035ab3c1d6861bb00dab91afe45c6f5dbf07894c029e0ad2b1bc627a3a1f1f0e1ebc1c7534587b7a7f88e067826155792f87a92148e23ec0b5071452aeb6eda7da21013fb3cfff8dbaed7dbf3d1f76bd1eb0acf27e63587b6adea43551d81f88f48dc7a8ed59cc57284a1ec2b09c4863aacb75d82122d89c63616716896283fe069219a8d689935ea65212edff6c0752f7610e2d017ba0d6a0692890570b063f578510d1ed4a05270377ef48afa47aaa4c8fde9f3af4d9eb043882dd53f0cdaa2941ba26234d428e24d85badc507f08f549ac0df5eed7f59abeff9b1f5eed84ead777c909ffe0f6a77b3ff0a094489e297fed9b961e2722fcd9559d589b272fb4d5f30992eec5da71f06c8017067885002f0cf0d4ef1d8207fc46d48e7f2fa53a19674cfa662b780cefa0acc6e328058c03ef054e0e9ef75f99abe18dfda07118c752ca18c6257247dd0d55a09a3116c0c8554d265172155ea6943ad0366547c6f9f22545649223bf67e6988653c644fda931d838eaf88a2a7152ca979260fcd4a2b97bf3a0d526747af327e3e08775f8c29ce43321fe22e8c6cb64c70339faa0ecd6415761f36cd9fe248689f135ed37c7908cd4846fc0cda5512f755196363e006fc7d39b6efbee12d93ebafeaa7ac6d804d5285113033e5c6f071bcfb1ec2b09c456154a2014e1290956af57b35a5f32517e3729f47aef03848f330a7d9472bc1b917e44e7ccf1bde5371b6a965f39ed13b9be57edfe368a0405e0214f8057a9d45f0b35da2ac0bb00757a753da086c8d75a3016d600e789c6c26ac8c24a9208506cf2af46ef068c13000eb60e03ae90b2c34d6c75433c7c6a2755ad7139dd8d7d563d34fd612979f5ef37e4fcb9b24fbfb31e6bde3381c4c0bca11a8878571c2f1ae76c901838c7c5bca17c5e25dcf6e0c1ab80e7f43810b3f112df9301f0543f1a29319838679ff13d07e240a612e7efc05fe41463cf573f5ef9c5c6638498b3794acde72c25874f125d0f6d304252e015d4ae91514a20bd5c09a4cbd9277ca8241070b3e511e4a375af38cb176f14e02cc125b279e86d66bda0c6c710001a646ca6f9c73649b8ba445910606c3644bcc771f4008f38fac4f8068d47d03af02460abc1f14089b724d0f6a2e34bfb03e0737cfd124e627c4bd87898e62f3bb144b9e2866fb74f3a4888e5efcffb76354f2dc334296444875433a84921891a090ab03cfce64d73d9470484dc77c3d0c6009f755244be3c6bfd25cfc8cf2eb32e74233b4d399042a194f69daf13a2eb9613be3efb47c919fdabc5b5df5e2009caf815d377802d02fdf2a31950a384c2ae26c52b35d1eba0162e5ca96103ee0bbc398c7d8f6e8d2c42b9ee5968636e197c1fdead0d1213710a474aa9e4d31d6fb984e9d0a15d8fdafa2f210e7ce4e0d7cfba5ec4e78672605c0c0b8f368a5a685c555442eebb78f087019e5ae849aa8a28702a9fbc78e669f032d8c19fac1bb35f05930df01c80871bc606786a5ce80064de6c53c9edd10678093764e5985dc3d7ff20c4dce73e7abe285f0d08b9abc2bc9317cb36f8bcb5aa2371f387a5c531adb6b84e215d17f5d97df7e5c21dcf5cadfffc42a952f0c2ca40c2ccbccb3c6f9b0cd54f168887f032d90555662706058f474cfb097506e001f3448c40513cbe0d44bc27864f81a348a882025603c6837b4599dcd983c6a38445782321c88036a98c1a89af0dbf1f9de4ba2d32306ed98c5065d339b92efa85101fad1cf5e62b5709b17beef67fed06679e1af41e44c2810c32a8b28890c07986aa2bbae80b0849f2570aef2b0262e9757ca468afda33465c2c452f6b86f5975eeed2f74da0eef5639d16fae3c172800e7ea7e3c84193a56432f6987776ed9214f898b97f2b768d7e9f895118f18efef9382014a888feceb7431b6feac203033950a0d048209080d0cd5e90248e72c8408ea40824e5237f6a885846c907ef808eb01bbf5c896a45c6dca295f2b93e9d063c30d09163f46eca336d8e12892486d871c775a10d2c6c95d2c39c1b4a3def71a0ea3d9c132b21c9a788c1b3019e76f007725e96211300da623c5dbb0df054bf4d9cb945fdc0f88af60d8dcb8e6ea55d162e1462c1a8cfc5dc52d5614afe87840475c567c1e760e3c21bf68880480c5b0c3cf0ab5429a97439fcf8f6b15426b61c319180131d0d190bda91575c41accd75e1e61b367578f3005e18bcf6826c443c62da1ff18eed5c68dbd04b1d9e39e2bd40c3d78bafc855fd4c52420d1a0fef8e70be0e6c809f9b683c8c11e445942f438797ac44cdf11d4d84a933400def09be3edb11c47155dc5dd66ce569427c3ee5ad411f82b71cad5b94a08111260d0aba65e3f9067504d631119046abb0f6b51756186a5b55ee104697467fe72e85e8708c1c661703a1ce2f076f9803c1ea44f117d76ba4cdaa430e7a401ec4397ffa7bfb918b85386475d75e6d2e86ee3ca4bf1e25109400e860b848d55520caa14e1cdb6834a71c3f6884fa94d56844afd56b5489d5a228f9771d8e6694bf4df472fdb2ab6fab983c6b56bc4e95bc316c6d5cc2ccc660ba000bd3cc07a46bf7ebb27db61284a7dd2f62d43507a453275d3ed90a0c69c54d1760719df070ea87cdc6c5d1e1a9e777b62f7d68438ff89ec6e980d1eb0445f941f13d10dec6c2dafdee2a826543bfb2b4fe23fe7863a27f7c13dba28cb60c80770cc04bd646e4e8f03cdb00c337783d986c6709e1474d17956519f0f5db067478a6eb068cb61e80671bc6c3c33ffab3e0ebed8f84fb2d597ce3c6db01fc63f0d6a62d7eb6507d425e56116048f19ce3353d870c2cb381708211ec7d85653fb9f152564c2726265d1de3016c66546513c8af8ae546d5f4639be566c95fa414a6a6377b4241483b5bd598fb069540a4ca8283a3f628a841e423d10e233991400021c06c95946c0f251a3e610fe8cfa34aab96a5bb265d24720892a0943f525638fb766d5c007bfdc0a4833f7861dbb1cfd13dd1605c361efc85fce0f719f1193cc3c1cf1803e1dd07720c3c67c37bf1a077e2e105deb36293317310eb874650715cb6166f68bee16dc03c6aa8c350c3914fe6704e7050e48fc7d74fb0551b8dfccc88ed1df4cc481e4448f98d9d821b69099e0e9f5f49ccf1e54661ef601bde20bed1c4f07df3c40fceb03e1e41f7d724bd7e931d0f8f9014360e5fbe1f38fe81fbad30197ca3c01846064406574909d7f96cccbbb3e09c8b80ad1755ab980414cf1f1f21c15c576cfd1221b1a1764492655fabb080705072b33f0a9179e9e9cb2e961243e8f194a1bd5a8a7811db89fd0645ec7e24f229674b6654adfbbcbafd5229397cf5ce84f1e3c72bf898251507060f74cc361981ab4beb20608602c230491e1a495105863ac223f59a6c2dc8a1420428ea0e6942a04d4be95a68db50e7aaca750a68ff7da7c56e60e2c11b3a76cfeb171b1701e352a08d8b29402a83b9fb9580111d5551c62494f07ca01137c9fb243c5d33aacc04c02b80be2b3cf349459003fd28827e08c0bb2021defeb4f5086f18c0cb4b3c2e566ccb3aa78e99f366aa10bbc66c5dbb1b22d16b408a20d11f25d1f7554dc914d1af1e55586b85687e6dab9b5d1b48977f1d7f674c856572cfcc82c0bf5250010645201790f13917e0d9aa5f002f53a9eaac7949ba419bdd4975f85c05e3d9063a37882fcb2e8b2a4a2f4b32da06d87a2b602a234fa55a04fdd2f1f5dc5cf3607c747864d44f723c7c467db2e1a8b6d10941cf864bf8fa03406d03be5632f8e2fedd7cfaba99d31f1262ceb153de980daa739f711c6bd4702c85ef8151e6ce3ea44a87739308c75a9164d9d76ebc50280ec4fdbc507ceebae5468d2276142510bc7a3621e5aeb4cb5f5b0321f878a73546b0f3ec9ba4da824339ba48d5a4e2eaafd7148063727f43112f47ef2fff1e27884447245c4ca27125a19297163df5c381c03917261a97645545b00cc62679039dff0e7907dea3493e283144fd2a3487c1d32506136767921844e3541a096e244cc8d955debb7b841b67f4e345cb9d1d10df518f841d6be4d0701e619d906492150f512fc6f51c656ec6d186dd338d9c2ee7948b991bb449b517ec4ecae13bd0ce6a14be519f0a15f177a09d95103e735715413781728924f9f59b783c7c123093d01a8b2f977092c557f8f085f18fc676d2b70f7d72e23450a993648192076388a9e64e3c78ae0d8f7f63dcfa86759f7cd9df91e8f92eb58b2e720fd4a829421323b133e9ea59f5398b742defbde3e09f40254577599f0b35de690da9515250d21aa7d7bed425583342c007d8a8fae03527282c429426da2520172ebaa5ec5cf7dd910bd60f4d342ebe71c8d2c74fbfe3dd1799edbf633c8bc1d3e7c31f819bc9e099f00b27c4cf1cf91b4e8c9fef3955fb2295c1629163e807e0b1be68f9c58ea3c69b083a4a9c98c281ab24f1c229e4d490c084a196906b2ea84c71bf378e0bb6bd3be5c31afee6fe373c3fc1f39595103e9f87ac86e1fbf0cd6a1cbe41f823bca4c7c3bc1ff66c3c4cf0ccf39914be4111e441e381eb7ee1cdd327bfb44c88efbf2e9ab61abc4b6b98ea9d246696fb0a55f474f32012129e34d16675d2657f131059a2cbea2f8805dc393aa729b871ce33b2ab360f3c3a2c7a76ea230a26e5d24a5575ca0055d3d59478c10c3a3c16072019065ce1e06ffcc0eabf23420470894021018b272c9dc45a37d797715cfc014dc3d53b98aefc18c691fb395a5bc1d34dc451936efc18e6f41066b60d8749263e9d2eebc73144c6b3583fc21ade6663a8de8f418600c22c455abfeb515831076c6534de983a871b19f17b4e4060c3c5df35bdb3bc343346801e12ff709d217cf36653ff6d684735fcb9edcfacd3d7e77131049e9a6c45c1c6db84fb2fca25493b495b94095ff3fad2e16519f0e53699e16cbdf9ef086fd478c449128e86af49b2e6e3e19f3f24a476427c93b5f501be9fbcfaba331dce319238507381b656544d611b6cb8c408e17d1f1ac6c22f493ba291655f1110c7fc55b42a5ab77b72fc428bb283868c51902b891d3ca0e24ae99352d9748e8210429515a685c78baa30fe040909deb4610332e1807ed801df275b108e03356c299cc8fa7842522a3a366d1a6b6a1bdceffdc48cac5c45402a0ef5bc77501b1676d4b751f48dcd5526fe833f0af08603bc30c04b7cf01753ee2ffd20e2c64b5f843033dee2861c87c65c1ddeee8edb9f5b364a885537ce9fb969930248aa4bdc58cc8b8502510d91bbb46e602462df1d503f77f71d22fe0009c3b8e8eb39300239ca0f7a369e001f72a7892423a68d077d6162959979dd717cd97c717c03545c81aa5aee1516a4e26a64047934ec234c3afcc68f8703edac84f89abc2619bebb7b6c3f78d915724d7e5977335d7486b60c76f119d52871a06603afaa652a793a7f6ca8392149baa4ece90f1b2e74e564b65ebbc6f4a33a9dbcb4c7e3525a589d3ac4cddf2f20ecd0e2c62ecfaf9f5d15ab9e8ffc3552b863be102b3ef87ae32c50651185c6fb1d1885ae05ef1b8cdbc0ab4cc938be063ae0ec61c74d65adaad0b980dc9a95592d2621f5fdf8bc875b7f22c4213bba0cb957e55eca73cd701633629b8c96be34e03960b4f522bd99511c9e4f36e23d13ee519907f79e987270251bf19e09c6c5798d355e1afcf3b32097582904d6c1b8ac1efc7dcf897f95ebe41ff32a56a0771daa00c0784e990720130119d3c11859f78eaa493201824359a6d7c9ee743d7df2607784fa586d3adcd3c07af6ae3e56fd2d51712371f3383a61ff0d7152749f0a18ad13dcb0a9569dd159c2179867011e0a7e70c4b4d520be682c6611e409e280549ba52bf7dd6343c66780b79711e45e3b30275972e361c16e0fbe262121bed18b230b2bef12e2c3ba178f72efa4dfb162d3bced10c85a839932c0385e7505b4d1688e1933307e0d8ce518404d57d776024c6ca197b5a291655f111038288970a064200fcace438eefd1fa2221d2bb37abf9c3dffd1b830e9a7c4ae9a17be9c042083d9532c935962fa99d593ab59ffa0239482420387058534a0a14ed56a99a544c9ab02d3c4e736dd25d6fb8005c22b050bb12d2299f5fdcefd85b846832b4c5c0bcf31b1897d1466f1d5c88b1b748c2910bed79f1ef4a7a6197b088e47970e1559037d4681a35fd60f2a7e2600431e00e79cf6b09068f6df879ba5757a46fe45c57d29d78e9b377bc243754f5c6ca6995b0e16a1981c08d878484bc5bb6c3f390f61ddd26f9fd36eefaeeb1fed4bb4f97eb29342c745a4f77a4bcf4df19b167319dbbb79e470334d5ffe4d37fc7e049c2d11eda70877ec30c460311deb9eabd041fdadccba8e1886923be2574db4f1ec00f27c437e8022c824f8c8f82976c04b9613ce292992a784111e441e3c103404b1a87efa2d367747b79b910df144cfbf762c8d987779863ba7dbccf03e3d7f08228b4819084020c129e733c43c75eabe8f71b0141159294400ed8d836afa25c8883761d7aea5fb6c69eb2dd5427164fade045c4ea17f0c084847aa40c3cf04229ea5db5fda019338428fb7cf3524caf5e8ba94430e508729c18d701a947ea4e5035456222655e0b75186aa771fd37155f8a171c9f3784387ee23983cf1a2025b3c969a75fd025f62d1e98ea692e3114b11b03b9bb6e0e480c53496270e02f2e6c07e0a9dff31b036961c3c6c88103612acb32cb73701922dee3e0a9f7e480c43015e6976fc41276d079d94a75bc9153a4d41e8af15877d992c5932e1562c16d9fbfffdd0ef502cab67ba55e1321c100529448c02db20e52dfa06a8b245528ee9dfe479dd9efd9ae727da76c4ebb23fbcc04e3eccf8eacdae608f20ce87faccdddb825398afd5e0c84f1f3180c5b835f409cb30ecf8bf0566d2f82bc04da61c05f27fcc9e2eb3120d9807f18e01725856fb62f823c4383e7112a7d7d992454c12ea82aa10baa609e70bd353227191f0f8b13429e832b31bea5e11f87bae7d8077ff9f7f4f160abc5f55ad941d5d570052d12106ab3c067241c18af863901298d3b128e0ca81db187653f1bd15d0e7ffec269f76fdd26a9e2c591655f7f1dfb340c7fb9eed38e7d1ea05befbaf1844bfa834a81c79d58d3f5766809d4ef410dcf939b31d44438c27bd2cb0485c121028bef7384481b94bee1cc0e0d1ae7c2f0acae733605788d6336246f9c193cb49d446df81c6d1b4e627849bb2726345a12dee358f661a1eb861b1df15e0c92c7a8baa9ee7d318591b71f9806e9f82909226c28f44ae13a65d41d932d84b97b93111d4614379e4b58ca3a6ceef4f129c26ccb209b1ec39fad676f1e13dbfe087e0ef08d30bec66cb3cc481e940d37c17c35b8ff8cf84669feb212c14f1a5fbfad445f5ffe7da2e36bda27c375a7019fd38879fd363c1ed1002339b31d96656d39f3fb4b84f86f97c7ae1f05aa27be3ec9dbea13bdcd039fc9db0a6d1fe814a28d54dcfab5c55e967d2d81600d3c6bbc2aabdb8d271edfb6af44e180f4c2ec6ce10f6cc36cb2fce62fa64b6dfa5ccb6333e494fcd06a49e9d46239a89f55ae40dd208a6e38b0357de073e6474d5e3638b0195017409d0bb593f410e805e090ca231f6a49d8ba0ce993e7ba21670ce9ddf7b977e533b345bb666e3a787f6e28f576ce819902bc7c3a66e08882ef90470e0990060e330738b8a94c22f4020805c02b0078c8e13a002f1be03900af1fc083d131a9d0b8caccc0d965aaf69a59dfcd1f3b4788ef1efce22d37e7955b304710e604229515ba3fb2eccb6803411d72046e2624093517fbaaaa90942c4b9e5ff8f87629011f7ddc690b2f973db3beb1cadbdc1e879f0db63e5f7664d8c619600bf15424163ca7da0520bfc2bc490944a9140772152271dc20491247afaf03bc2a958fa7ff8e70862f9754c9f696789de52699838b2495007cfd39b8747c4d7790737c4ba85d00ed8c84f0837292f1f1b04833a0e019727055cc2d5bbe42128c31998fce78f2cfb10be9dead5059dcbc24ae205954808abe1ace354ab904eb95182134a2a35b3ad451d4b020abb6166a47ec65d9c7048422ad5132c0a48af2e06cdbace3dcedad843860c94157fcc90d04f4eb3eed584dc9e9885eaa361c98d677a122f74ef4832e3c2cd78df45ef3c682d71740a01837aa9331e946a89c40844e00001c4c494441548f563511103ec0af431d2729c44a41d008e8cf63fa79b27960fd8610e7e5dd34e5afcfc8a9989f3a6ba01bc9cc23598dc66538e84daa01cf58cb23bdd5f7a6acaa5e1658077eaf36ca545fe4b80df032009e03f0f483df3b386cf87d1ec0d3dbc9a6e93644bcd75d573d73abdc80635e7bf4a0e72546f56323c5b4119173830d59c5084715e89089a383e474987433f2aeaa697d20a3a18e742d5968f793fa0d3d52129a50e79473faf513222ec2fb3ce8474b357e487e0c4e249e0a86cf9b1a9781e24ef89d9a67ae82290960300cb6810446774bc737c96cb8088fd2aa9b549e0c7e10befc8ef012dd0943f0bbf80322c805e2c79d46b88a36d9f1c880effd8c500c5ec5e96597af3c5c88f71f7dbaf8898142ec7ca1f48b5d23142052ad628e3e24202a6da6a8445b0710125ad7a8ba02491a8de5513cd710d302a81df133957da4c2f2b98539f0392a3fa46835fbe5f7aadc2b69eb2745be5fe2c66570916f38a6232711d08e871265ee726daf3cac26679110bd1fcfbebef72dea498c4477534dc4ea54a8e1e0c038120c34a4c875507d910405dd2042801fd8896bfa1d7b3e0484c855ad5dbae9ce4fdd9bdf52e7a7df606789b8c86cd93311a7da493e3256570d7891de8e0e8fa98a7c11ea0655d170701b0dcac1956c72442f729cc163eec64946bcffd86e45e9e7cfc943ffb29a7198b4323ed23f56b37b3f303b29cf0c40eebd90a286447f4d7927fc81a312a3dd39db8f8e397570f7cce110f7e2b079f4bb4367b17189c6f797543c6341c56b52c1f0e4a449469037a092dc337c93cdc165c697c38736c00b7267770c714b368f0351e3da08156dc2f1f0abcad4f75b0b7e3c7ae65942bcf5a2ddfb61596f5bfad3573bc0664b2a299028785257aaabf5e729fe23ee8efed83b794034f608199f9fadec2309048bcf688c072a06f649dadef44f2dfff985e4d8da2c3fe4d63c5b7e38445c997a968873df0511d0a6fb007201a6a380c0e79d24cdef2244bb778f18786e0f210e3feae84d4d25e7b86ae3b7abbebd50bd0f250fb1595538e05658c79328354a1e79f09cc5fa63196ae061425d549df206d4b25f7f98611f7987241ccd1e6bf9d23b6fc7f0bfc6bd09ce1a692982d98e386d8585973e3bd6ef38ce477d6e037d2ba1cf15073412daed54d8a4275930d54891d07b65c3b89690224f00bcf3005e4b801706780efc3a03e0091d3fa62210d00f0f3fa1e3c7eea7b0e17e8d0ce20033a09731bc4b5bacbf64865c4fe3a63e71fd9beb152c727384ab91dd24746ea9ac84fa23a8f17bf072418e8e6c2290d9a01eee5b201516f6240c354820d65a2901bfb7e02337434297bb8f1fed322e299bd2569d7a6aacbf5ba0bf27417fd702ac0ce8979a37baaa18dafe7156e3d142cc85b68297cbe0d9d02e61f06d9d538ee3c4117e18debe36beb77b8a6f9c4a2a0cbfcb80df69f01bc037231e5f092f17da1abc24f05d0bcf69f88acea442cdd84bf8561c54b1eb93ad35df3d23c4c42b9ffb6fbe3c0767df38615aa11c89bac2da372a4f56cfa031bcf272a8c1468b2a2bba39b55c7f9eaed406c983ae1960f11e941b1025e7b0f899cbbe22206b55c50f54aae1407603fd36ce5bf5df8a17e4869b7fc2ea56f32547fe4adaf893dc3cf799a02ac19bd73c115e9125aecaf1bc7e6cb76afa5c8bd37af796cd6f7b8fe8305872a8ad97dd33e75a79386cae7eb60e0e882824d32333b30df88d66fdb0597f4aa0ee9cb89f2120182e0169b1bb75852be90c3af39ec71e7958f6efb5d4290fb8aa3557b4ce8bc33b0b44e1525da71ae83668f2563224eff379bf08dffd0628723b002f1be029afae71e0d5956df09b174c0565ba002b0bf01d872a02a6d20a5069543d5df1c98f438578efdc27434f1f283793a89a500984826c19c8d1018120f747cc828c6ebb702f0ca9acd05f1e37e44dd0339bd5c81001d10ca1a429d77575a4fc964552223eb453f727af7209d349e2fa1603ddfe820d299bcd9bffceed0c18970218171c67d5f6bcceb40baa8c49128bc88b4d87ef8f7f2881b682674892484917b97b31c3d7536922c3e24b9298781d9bf035dc116ec2374e15aa8f8747a8d4fa32a8b812b8cd17c17309c763d103d35b3db750128ebf8fb8ebdd1be4e1ffef1dcb773daf3acc250db2c5c14da74450eed63f47c607555c787f0dd970212720b9e9a2a4910bf55a56ff6c655f4b203a6feb3b8051a5e346924746d7dcba4812920e83babe78b514c9acefad1db1886cd3c499379e5ab0a0534fbfa859e55172223b457a2de9fa8dfc608bf871999c98adbbd76f2d03ca4d8403f1c40e00a123c20747381188e9ac4649a3ab10170eb975ed09238438ee8133ad31f2fda1d294f3738a85d9f6309a38fc5ed08f30f4836f1085add948e7403b57c1838ba54c07465080176ef42230daf6f319156d784a1dfc4cf7eedb881ebcc457bc06300675ebaa1fdfb64d888faa47e53f9a2e259089eb5fd90ef7bbd4cc5775d58150a32482840475c84860f09e179438d046862a0030c247bf861a3839ea890d6dc650b846f5b2755b46b917f6742aea1d71df9b3eaae91167a7094f7a4932dbb037cef0b6305d58a534e33970419527b1e23c16a8e78c362907e021e140f8b6d6363318050de34bed5c6823fc0c866f4663f025781ec391db20bed90c5f6e7c2f315c5065769bd7e0572d2e9fb74eaefcef7a177ef0a29ce79967bd37eaabff516fc0839e6e38854040b46de07ae4711d14df012a2b6474284d3bbbb08e240e18005dd92f7efec0682afb9880709b001192d150838ac7dd78dbab373eeb0ef89107677eb6fb39b9e1ea9b7d73b69bf77e2d898ab15fc771140d6e3c1ed8967a54faca0cf99e0ed33a77bae023f99e493dffe3265dacaeaed8b25a1e183b976c5982ba47c28fa74219cdda923368726bf359a9c70a3170c4b067c352d239befaec7f3c2027b669a4e588a7fe251fbada6ad9f1558d3382b1600b3a0b16b05f62009c92f456f2e00d03787989c7854b0cb8710c0158283194ea91b7be48617ffc0a124001f0543f82af7885a29eafdf56d7ad5c4a8c859fbefdcc637f1262f5b8ef66fd78bd7a0275c1d540389063ab423f79241ce82f8f5e56e8fe88de2bb821d1f88812ea5ca81dbd26f76f201cb46e60bdbb12e8c6b12b2f5c7a8f94b05f3ea1c9204990ac2facb456178b78d5870db0800c41db81b6c7308d86e7543b0bbc14e7f99c0f54db8bc3d0e1d33e22950bc0c7f887c632180d1b9b050ff84c94665fc39718435cb70c3e6314397cbf338603fdd4e163c4bbe72596110fdfe42556dea6ecc3e27652d2387c7ac757e53a99d2fe8587dceb017ebc6bd93f7f04152a19b7c1890319962a8c244723394a1ca05245c281120a8783aaaa08dc881a05c9c3678b43e71f5bece362edeb17c06be03d3c4e03931ea681313b1db2e8ba92c785b7dc367f4c441efcebd3c79c716302a0e835918f1c056e3cb0b4302f1df937f6bdc854df5b4ba03ddd4a738d5091acda794bffe306dfd43ef68d94546a5b57d72e7545c86662612cf9e3fbd1735ddd64ea75e9d9ad1748c2715fb3b4e3a4089a529ef6f7134e907d3a36f4524f0bdea4b0092bfc8833d217348f1c1fa9ae26153d415564764b74183c1b5af9f09c7aef48c0a3a7cfcdd186e7f2015b354e4101592381e3ed0957a8261f399db81f23ad6206cf4e342e91136bcfd875bbe4ecc6bd3ffe09294b2dba67fa8c15e025558b374c822451b156d5e570e0574c55352728da8d9022ce888e81573ced35b27636d4d84324206ae42969273a6de0f5022ea332a0e2baa7064bd6a0d5d5ed36bf005e355a31a878e2ae12566d1ce791c0680cb362b7e1906dc3e78d67501999e68d477c0b7695b23f50af61f8843f5b7741f8227c5b87e7c13748508dc5d7a25974e06f0c5eeddc9aa1dbde938ced811b577dfd8410cba7cd9d3b5dceefe2dfcf18ba0a24803a8c2fc2b000583f64ec46a70dbc89146d17d3f43649c4681c47af2a804757d0a2b11c53eaa0713cce89c3ebd9fe28fb8980708e8d3878880b41ef28370bad5b9acc16e2a4d0f965279e28c4116d7a9e3b65977039aeacd08c04b0935dc818998d777af7b496a8e78c0bcd0678c87939f07bd5ce5407a0dcbe08af51073f7172f970f0636ea825a45977183c1be025de807c1cd086b4c41adfe0b8e081e1c1b313e29d0907fd126b493cbcb87ee804d10e509564423f96f8c625d6ae3bba7a52694f213e7fe2cd371fffa79438ae5f70c5fa6eea41221c58a3bba38af116e519d0863ba3c9f8788ffe3b525d419c10110ee6b54204841592aca107c418a1f7df59aa4e4f97df6d4fbdacc59d52527df0cf47bcbe5b12971f9b34397b5642b0e1186c0341250913d7df12603c928fc8ce0f800f8c888f21083ae8f708de1ee08bed86096192f856f7ad18b16eb41065af95e62d1c24c4da9edf977cf59510dfffcda95bbe5ccefdb0fa1f78ba7fbad707af65c0005538e0719dd1454e6cbda2ea94240cf41ac414242ce0b50e08d1af877060d95f04c486d7e5eb3512129f24d244d5cde4c171f6eb43bfbaf926210e98dcf6837b6b1b78879f6381cf6921ab8d96091c1bdb781e8e3e0edf8196612383e4b3c4d20e7e12817df0020e7edf01dcf00649000fbe050e3f0c07bf6ddc70221eef2424869e498d8b0f1e7bef4838107ad281107bbe7c6259ee7229ea7fb2e3b5839f1d21c4c693579f5a5aaa20d2d5c0b82181d3ab0209a37c34d4cde1f37bf4e790f3abe191bbe8b6cb7204910ed916890b7cce2511cc029d02eb192591a6d708d17e52e72eedfa0b714ad5a54fbd7fac7c664cea573dc618e0c7dec118172eb10e03c685136ce3fa0b98b7b0228b494b9241490d6d80e749503640cd07787663f0956d0bda084fdb17d173c4e31139af911935f76dbb45ae99ba9adc2d72c757e6eccafba1ab9428c4c6c3dc388c1f1e5d72ff324920567fb160e5065085f20be47c17ce2121e1f7f9b01a1916f2ea83f54636b74ff59a22cf791a76765f8def7e22241c36d48ed8cf657f11102c0ebc16365c0809c9c3aa46498436dc89aa6ede498801cfe755e69508d1ca6e97769f7b80f4b7ee4bf9d2fc2adf42ce018e2d7fcf2406d9b2e1398535a492900b3e1fe0393a3c347a82ca2ce8e0cf018961fcbe95188c9ce71e4a0cc62ca8744018086026a962b2dd0db161c1aac953ee1062eafd2f968cdd2237d55335a328391c120e4ce980c645201095a09aaa28811a545864f3c0da94b204bd590ae3474a78571507dc1f432a5a6c2363849208aceb26c818fd8f109dafeb73cae12b84e8bd38fb8a172f97cf1c9ebee1845d0dbcc42f61dab136635ccceb5967e37ceb399091311026801f7db07eb49b4266e7275b2f9e7f913ca85ffbe9ab457245576edcf5c3767990d71d53f38d6b634c7ba7c989ee78a4ce6b729b2b99a57d956e357954b64f4b3fc35561a7be9a36d3d540847e48f92e458e636453dd37eebc45fe5377b73bff7503aa8b5d9564ddbdb5396ebb6af0ee27dda499a57f5edf7fcb9f25c3f1fdea66db24618e4cab1b42778023c78e71122ca54784a5efaf67f7c3d0818e8403250396361d3f4755a9ef9e8ed3d8f3a7eb35bfbb9cd6a549e2b0a176c42f54f63701b1e1b5b8e48157456fac14d86828fa37295375b335aa766d23279f77f16dfde5001f36bffb09fffe56c23825b42866943415cfab44bd3570e3b1837fffa98a748981ebc23de3a281c3f71dfc98fd75b07a6fa0c460033cc3c1cf556806db4b902a11fa119952fbfd8e51422cc8f96ce9c85e427c73c9b4260b2f553fc4540cb54cc4279515c66fa0311209489eaa2b5bc2ef180748120712103c60d0680e88373a4b293c479208ae6bb489c4a9b2dc8237663695758b49ad171df0b41059b75df5dcc30fc9cf8e6bd9fad2850dbc0bc7196d5cc3603ddb64fb53d824cbb8980807ad8bc4b6c5e898e83dee3cfc74cbcaac09b709317bf3fbf77e2c39ef9a77ab5a2381a7ecd8a822c403d1a48a0992f84c05558dd0539a3f06bf9ea9244d0403e3c37c3754627f0c81a73c7715111aac9150601bc7e30b563fa8f7e397575599cafe2620581c783d974450878c9208184b9b422ea2780eeea892df3dd6ed2d218ee973ea8dcfb595bfc94e7bbc6bd706de693389616f5545392213e029c2316c2f554539f0fbf12431c0d3c9a98a3cce9071f8811243e283df67bc25788d3c90b00001ab4cdb55b2f26521a6f71b33f8b94142ac5b5b7cdf46b8cf05ef6f41af28ae2bae42c90309c7eff436facfe3e7fc821d9fc4f173e992e179eab1a32a7e23661a787fa5dfa66a97d38ed510b0e8aeeb339ddc19d77516a2f5651deebcc3f502cb12592989bc253361fdf9254cd3fad3b08c9b371b7e8d8c87056d058fade7dae6d54fbbf335ebbcf7224f0e940464d0ca8f36429c0c2718940980dfe5cd6e7e345d1d1dc859db7ad3a77a849a130eba629a110aba480c250f7ed531339a930481eeb568f4fe34f1f344a8b8c4838ccc170ccf30eb8f2d7e65e5972220581c55190989ba5849a44352bb74b8e33c9ddd7ddef42b210e38ba6daa1b887852eb0beaaeee2844abefdb3d79ed9112f6ef43a52d2ff0bfda7830db49aaa08ae1fb9e012a013341417836c0432fac868dfb6663a52e998c037883c17b2a799db80df06036e0bde3008fc181de2fb1bca9e5cfee9cb0e43f42ac7867ee9913270a316fc347b316b869f41df1003f68c8fb84491ca4b262de2adc8b8a9e0337dedaa374f868f44482810705cec0cfe62f0ff07c84049c455220a0311572b5e19dfd2499004171d773ac2dd779ef36d9d13edb85e8d4bff7c45b8f93cfa6349b7dd25d09df1d56ef6ea4d7958111e0eb7973b8e483896592d9bfe98d4563c7aa5fd2018ac6622018949b099358a24a0725402e8920216964c474b430f1f3bed433d846c28504050809d9c0b8ea88db401ed09fe384019faf636d7e11192794bcdfbe6cb98ef895965f9a808455e5db70701422e7950a3611748f4c3f1b6a20204d58ed66b76d1fca38b6dd22218ebd7ac0ca6b5e17a2e5e96dbebea052c2fe38e5cd56d76b38d80a074b3f3083365e26f3ea1a0c9ca07923db002ff1c18f5e35681c35d9364c07bf4f05e56b3b0c9e0df0d4f7a05a6bc0ed1302fe40e2428ef4b19a9ea512e3ad9ffc9839e32c218a2f9b79fd74f98bb5cdbfbf7f03dce4176157c6e2c153fba3aa310090a7a9f6a5b166c9e3f84155cb6e1c347a55617b5fa9046c55914a0bf6194a22b4aed1c88e5e88404888419aadd74de5e77dcf1ff8e619723c0f4b3d6ade2d9240a786d29b76a98e7bb78971e15e7f06e378dc7a89fdbeaa7877c6f24385f8f0af2fbcf7d0003987436b3f22f767640018c1e7354a8475ccbb881376ce69277dd5aac37e8f6d4e4870fe1921a9e777e1f7d7db51d6f6d559ec775c1565221836c3b7b1aad35fbcfcd204048bad2ada700ed4209c23c7461b0f75caff50751ab8ffa69fa36abef15cf7e096d7b4296bdd5d88eeb3fbbdd2e72a213a0ce8f2e4f9e7cb4df942cb97dcaca9a11742e9cd9b37a8ca11f1d8c5490ce3e1533cf88be27e9dc87dd70178d90c5e36c073e0536d63d3c1efb36518085631b47b1a545c49aaa0eaff50bfcee520abca77b75c2125c1d259eb87cf6d21c4bacb8bc38bda09b1b2fe9bc37f7073419d1c9d100952013077c71a20e4d518498e5e2aa60389130ae6868b1ca2cf5f9e7174fb4d97eca88aac6d7f56750ae43e42552d7921028344eb1925136cc7ad6bab87f559b3c992efb8b17fc7e3e43ee8d0a1736d7fd9df961fb69978861ce7d4caf45d47ac4e5e051ab7de62a742746474b4eb7cf0e584ff5e7aeb07426cbc7ed588cd2079d432af218a6b401b15c63540bb0a02e55045c9bd8be88a602d8d6123ca70f63bd6364a24cc1642073c12166e8b40c26070f32655145799fdaf2118bcfc5a08081647557cc385e046ae14f0d622ef16e4e0b0c68d0684c5c7d1dd0e6dc829e3ba0ba7b6489bdd649610873f7ff42387ad10a26ddee157674889a5e9a52d7b1efcbc7cd79d69fd9a3f21eb05a9bd5db76271ae382d66244d17b70b298358d789d6966ba65e635d163357cfc4ce58eabf6fa31fbbbc9e351d7d73a01c27ee73793df97b554055261ea68d1d3b4e306f98f8a3a545c14868f00d40c88354227f1400d1528a93e9640c8d7d6e5d690d72554c91eeb52fbbc6ceba3135356e246cedef6aeeadb85b888a93767e503641884da135976ce821c44fafaf1ce0065445cba2371087851bcaa0cb454242e9f499b7091110943ce0ae7a327aa34a04dba7eb9f73a324e215015b0aa620f1795519541efbbc38aab2c01d3934186a201cb89e7d9209aab8205e240dd63512942693a18608658ca3727f77c83fbb7ed05eaecf76e7747a24a3408803fe79d0968e574bd80fa51f71e005f25d57a655bb0c53a87d685e6c9fac1617c5d6e36a71ad0b6377687b97b5f2bfafaa26f4f902c697e21ed046850404558ba86a646ed3e8d6ca0908a98ad841baa72a459f0462806bb2b9f822ba79cd0810ad2b0e2fcaf037e0f3db2fbf360282c55115b78dc091e88b64a774ed2099e0c6a30d88f524f81c2384e1ea5b4af3ce3842dcd0a87a203ca08d040efc9de880301d509e1403c54efcdc2f566cbda9df151827f2b31bfac81889124090dba3e1c6359e769d7bbb90b19271aef5f83ecc5d05d996f906ffc5c61bf0b0b6400d0c11caa674632632486c5d23e1f0a970e1c2b42613a1fd28fb1d3cc709145d5b10d26be6f6e071dc502301a13bb7d1c681b6282424a8620406006d56e4ccc024443a786df6fea8d8b3e2c0efb3d8e700df47580ceeb151ae5ae370b9e483bfe34e00765258ff064bea2f8d80a184551505fffb7a68a36da41e099f03356c083ad06003920a05366064a0aae9c22048934c04086be00029d0110906236016a45ba65c48904c11d2047a0707271c581219437fc1421bc881f69dd0fe5055f519f0f965d0462323777fc47187f18d407a6a1e7055cbef35b8873d87aa29ee1f8fb60d788e0e80c5806f0eb47f2dde2b8eaae8a081839a0e1a94111f60cfc37a8b02475f0f1c7e3decdb08ac331cdfda93549d066d92d4611e8880601be0e3bab6eed4d18ef685f7fd0dde8304e478a8e1fd35f03e5235a2c4c19c1de8aa55945819e72eee177b548c84e633f61caeef0758db81f619faf74420f0f3fefae7bef7ffeadc6cf775f9b54a2058d41546640be1b612baa0894b26c8713149220db262a68277174a22292c9091736c248120e140a328e0451120889f8960fc468a89e38a425aea7abcc9112513ee478fa91e78ae206ca36482de52dfb1e7b0662a325299e1c6e64671201ce2661dff5f5d715485f122dc7984d617974cd8ba4e05556c1aac677e711aad6b6088683da35718638cf8b50bf52c4e069d2188016092087762e0dffb22aa11be2db4b2c792475071003e974cd8f77cddfcff235134b6fcda090896b0aa9879db8b0076544d073c2728b86160a3a5409a6fdc70c499618dfefbb0517d2a2cdc70600c251516120e5b47ffd74a507c1b83d5dcaf9e0e6c6efb084a01c1b2dce24152f72c7c0e048908467ff67ee61f6f348a23e108881cffd594b0aa685ddbd0b6f49ae2499071428282eb783bb471fd1a6c2bb4aeb9ea0a094936c30f19049c4f1637c1bdaa7ca93d3070ee741d8e31cea1b1c56175234bd0faffbf12547e2b04841747559c83f3d94c70232201818d4784856d241fc1e01b0d37f4437a5b200119ccf0b493e9ccafa038ac86c28dcef5ff85cf17e9df932d020ffe00b7c7084b3181924994fbc9f33aace3f98bdb367eae1256156790b05f5c32a15429b85e0d0c135fbf21b6fe79c4bcc5ce036e1ce671124448b8a4c9920e22e1f125a774f4cff7f8e076f6f2f7ff57f6b0fc56090816aee2823679baf7841a0f7eb8e8c5ba03da904f9f36144814a1f17a9b366e2fd606b74a52619da2a3479fffca4b14dc33c558f6c538fdfb285c901385c0309f3be42068ff57afebc71a3e8700d1e8013a1cb26160bb98e1395cfffc7f5de10c098c0724bbf1d61facf310ae532619a3b797f51eb4c71bbe5f92f8bd34efc83030b757f2765bc83e8775500fb632b84d9f728b91ca2a47fc5ff94d97ff170000fffff898dda83e6a16740000000049454e44ae426082', 'image/png'); -UPDATE PRODUCT set PICTUREID=10; diff --git a/samples/core/src/test/resources/db/tablemanagement/V0003__R001_Add_blob_table_and_data_ORCL.sql.orcl b/samples/core/src/test/resources/db/tablemanagement/V0003__R001_Add_blob_table_and_data_ORCL.sql.orcl deleted file mode 100644 index 495ec101e..000000000 --- a/samples/core/src/test/resources/db/tablemanagement/V0003__R001_Add_blob_table_and_data_ORCL.sql.orcl +++ /dev/null @@ -1,762 +0,0 @@ ---Rename this file to V0003__R001_Add_blob_table_and_data_ORCL.sql.orcl if the database used is not Oracle 11g - -DECLARE - buf BLOB; -BEGIN - INSERT INTO BINARYOBJECT VALUES (11, 0, empty_blob(),72861,'image/png'); - - dbms_lob.createtemporary(buf, FALSE); - - dbms_lob.append(buf, HEXTORAW('89504e470d0a1a0a0000000d49484452000000c8000000c81006000000fdc872dd0000800049444154789cec5d077c5545d69ffb92d04297d8404db020c15e028a9817052c5850888b65dd447445d85d753fb16b6eec8a5d41455c13')); - dbms_lob.append(buf, HEXTORAW('171509764511352f7614ac80080a449a0816a4a4e77e73dffccfbc37e7bec90b5d77f7ee6f3d9c977bcf3d77e6cc9c32e7cca48aff5d9b731d618174f552c00114f9cda4db8bc16d754d6ee67d7314f0ca4c9cff3d00e76e2a63ffbb')); - dbms_lob.append(buf, HEXTORAW('b6e945726a9343926b7e5fb2eb8ccde26ae32f2e7fc92ec8b3677b8eff5eb6a98cfda75cff5320cdbbc280ae024e1ef0df003b00ee88bf17b3e7803b4e92f7d0c0a48976de46f2b9b9d7b30a786e92fba6e0be29e6cf5e2efe41fcaf')); - dbms_lob.append(buf, HEXTORAW('06fc1a10dfef95031fc9eeffdfb56d2f57012daf7451bf91bc925c5700477f3ad4afc39a7e8d83f78803369ec5cdba52009b29d7de7e0a3ac9e49afecec6b357847f2479cfffaeffd42b0c185180267c0d31d042c04310cc140ca054')); - dbms_lob.append(buf, HEXTORAW('086cea4d0aa6a501deac608b1680b798b0654bc083016f05fc50c156adb60e24fafa7dc7317e5a327ecfc6f7bc0f38c0fc5efafe941b01430a866e50902620872bd4086058fcefda1a571830a280966718425aae8f5190fa8dfa3120')); - dbms_lob.append(buf, HEXTORAW('d7e8779283160301494e3e5050cb11c9d5ef55ae312e699cd2b8b5c935c97340aea93d49ae5dc0b0f80fbdfedb3d9030a0ab80f62c4820e83e36e139c702920091e52205eec4d20b96b56923c49ec507cedae502299cff6a35a0ad54')); - dbms_lob.append(buf, HEXTORAW('0ca9d35aeedaee2d298453437f4e4f9737f7747af802e81ded558b1931961c57fecfe76b77d128241daf44acf7ffeefc2caec02d51e8fcec98f815c0afc07da728dc29717e32bef97871a46f29354ca83b61fd7542d416d7fcb6f632')); - dbms_lob.append(buf, HEXTORAW('21aa2f5c377eddde427cfedadb137eb84b88f7d6bcd0a3bab77ac4c38012cf032708cbcc7b0f1003cef300df357141f7870129a451c1a063d2d70ae67f57f3aeb0020e6f573ed145f03b148743f046f3795fae8767de7a48468610ed')); - dbms_lob.append(buf, HEXTORAW('4eeadca5f34572926ddde2fc761ba45ca7a535b693cf39f3424b5bc909dba9768ac4c742349ed47843546ed738a3a3445a8a1ba372bd9b926bb1935807b96f9e3c0bc8b31e07cee5d1fffea4f0c6eac6f7ebea84a8ffb276e9ba57a4')); - dbms_lob.append(buf, HEXTORAW('5c2fa89ebd6e9d10bfcdfbf9e835ff924ec8b47bc6af947cff72daca168d6f290a24d75a6e49de489e09f6078422d1f24d3064b62f89bb9e40e8776a6f1790f03fec952ca4f29f7665039242a009cc054e03260218e781b4bfa24b17')); - dbms_lob.append(buf, HEXTORAW('e71d212e587ddbb85e6542b46dd3b9e4d46952213c99b2c721df4a6ba45de8f283baca7bf70a3dd8ed1ce10fca637c0523d54104ef54c336ac70e9d62b3c0ff85c312a8af7528101f96b187f575c8515ee54e86941e111e079b83fac')); - dbms_lob.append(buf, HEXTORAW('70799f8bbb8a814780e7a9f703cf1379461b79725c1c2dc11d8d5d974c9403b35363ff05e3e5803cacbacb872f09b17cf477e35fbe5d8847ca479ffacd3772c05e52bbccbb5e3dda08179e42548dd79b38b9f88d6f037f1010fdc207')); - dbms_lob.append(buf, HEXTORAW('a61e6080ff5328962bac80291971bf931cbb0c9713ffa90ffcada1cd1d52ec86f46dd7f74839cfaf6bd3ed4cd9dfa195a18b7bf490f08ed08bfb3c296fbed2f9a5c3bdd17714c7539352a4702e7f2ef062c24d794b302e5c3c077a5c')); - dbms_lob.append(buf, HEXTORAW('7e03f21dc1572a7a118b3cd3f59e1853552565af5bc3830b779306d47d0d5fce7f5488758dbffee5f97f08f1e592770ade950ae3c5cc07effdf967f5889647926bc8ad96732ecf24e7d7b3e7c38024bfae79ff1f57a1fcb72890b002')); - dbms_lob.append(buf, HEXTORAW('7a8061f1cf41ac375e6174fba5c7d490b49ccf9973dd5b474b0bbde5fa36a9674b8590727ecab24172a089279d3332e6c64dd0d910f0af930834298e0a61d87ff2bfa448e6021f053cb1e220dc351587c68bf1b5f9186853028ac405')); - dbms_lob.append(buf, HEXTORAW('9fc5e0d3051d1e096ff2f2def5fef2a3b4e86a8baac3af1f21c4ea51cb9e9afc8c100f3ef08fbf7c78bc1035876c98d0d04fddab0718065603299ca1803fe0ef3400b985470ac535effbe30ebc2d746111376008f1d0ab84e7ae2ace')); - dbms_lob.append(buf, HEXTORAW('edd041883dceec396cc810e9391cd562c8b07952417c18fab4ef1bf2a6a39c375adc6a18244a1e36da7031479be32491b78d378c22b82b0fb8499f29ae665fbee124e5b2e1a086215f49b9ac9eb86eda0bd2d39efbf6870ba64c11e2')); - dbms_lob.append(buf, HEXTORAW('e9cadbce5abab7ba953c98c646402886c6a31524b9df648512de28ceb7e3f59fae40220ae8d014b227686085fe2ec45f6a6e0c771c2c3deb8f7a9c34525ac2a97f4d7bfcfce1f29e5d9cfebb2d147605908d097f0ad4d128780e6e12')); - dbms_lob.append(buf, HEXTORAW('cfc1a600ca809fc13c94e2c080c157255554a3807f0d3c8caf570331b987b34957e3418d177d5f2ac4fa9fd69cf2c47942bc7ec0e315fffa8b101ff678e9a33558e3696800dc17cf9c0e9c069acdb223c807de7fcbe26518d055c019')); - dbms_lob.append(buf, HEXTORAW('07488610290c2909a3cb4a2e3df06221da7cd5eefacb5e91b2fe51ca8cc1f7c83f5ee3bcde6a4693868c033c0cbc690fd8c5046ef3b08b418f8d8b0413bda2175030f04c2a347d07385a63ebcab39c4322bea2a89f5a7bd4fba942ac')); - dbms_lob.append(buf, HEXTORAW('1ab674b7717244dd79eef997bd592f656f60e3cb0d4ca1d41f059c0ca5a34dc83d1aae58fe381e77687b33b085afb0027cd19bf4a4bfe670f6e1d7f56ebf548ea369cf7c75538a1099a7f55af7dd04e96134a6762ff645746771acaf')); - dbms_lob.append(buf, HEXTORAW('38bcb0a7a81509356d45142e3b55e1655ed47e96ff2dc3dfa3dd2def8a44f172747f44e15e2ec3c3c0cb81e78b223ca7dee32a5c3e17c6730af78097030f6bbe8a0c3e87629a21be72357de253e1459aaf22834f21c81edaa82bf479')); - dbms_lob.append(buf, HEXTORAW('e8a1dda5c268b7a4d309d74a4531f4c54bbb7e768a103764bc10bee66a21fafe6df01d3b22aba7e58b0aa66111360db1e894774d18a2c5784c0521f295220ae829e23f35add25540875809fe4941bf5d464f2e2dcdb95c88ebcf9cf2')); - dbms_lob.append(buf, HEXTORAW('f68b2f08913ebb43c3cc41f29e502832cc4ff2a815aff98a2320c7246f618d73f950d35b4cfe144ef2e7327a11462fc2e811fd987c937f69c833d10ff01b93e748b3f8cdd5fc6e923cfb8ac897bfd43b5aa4f6930a629743baaf78ba')); - dbms_lob.append(buf, HEXTORAW('8710b7674f7bf46de9698c4effd7d7a79e2adbf9aa50eb5658b40f2ccad3623cc937d65242b496fa0e2019ba11e0866afd3d5e29db9b812d74b90a38a50ccf5230243be8f2034abf3be61821323eef5659faaafc2d2b74f219afc93f')); - dbms_lob.append(buf, HEXTORAW('9e25766b3922cea2c914a6055608fda32d1ae0b94ed4c2971e880a20643825782e338ae7295c3e95a99e032e804780e70177912c59a83c1a892beeb3c88557b87c2a8ce7b2705f18f765197c4e15e90a075f64c1656a3e155ea8f9cc')); - dbms_lob.append(buf, HEXTORAW('637c9a1e0ed1dfc8cb0939bd5b494fa345bf56e123a402d9f7829cefcf7c5888bd871dd2ed2b69817d32e1f52f9677c5bde729187a023838d1592d05c023c02bd9cb5e05244552b2291cff8eae88024e21c3e5771714dcf846875a21')); - dbms_lob.append(buf, HEXTORAW('4e9a72d1f0b1b365fbd6b5aabfbfb3fcdbbad0ebfb3c1dbd2d4fca52bc45afa8c42c7a856792e50fb9ce0bc8877a2bc94725f04cbd96a1e86731fa25c00b40af447b382506bde41eb5c96f4c9e33151f49f8ad60fc4634bf345d6fd2')); - dbms_lob.append(buf, HEXTORAW('159a93b27aa72ba4a1744ca7f5833b0a71ccddc3e6f6a91662e6fd6fe4bdb45688ea97d77f010e63f28c7ea47989feee3039760ad8cbe8ef2e60647338df92d71f5d814414e0032c24f11da675ede47b1c173ff2f0928b074b2be084')); - dbms_lob.append(buf, HEXTORAW('56a32748d7d2e928fe6ff7cb842f8833a3cf6eac2b4c782926d47c087819043c4f2f062a3c4baf4144713900159e093c160250cf459c3151bc10d3656c00293c532f5e2abc50d32f009f0acf56d92ff22b2fc7f7d173cde3b3c49c78')); - dbms_lob.append(buf, HEXTORAW('9c32e0bd366fe039739dddda48cbb8d3693bfd69b0f4040fab1d78defa3942bc77d0f3fd67af97377c2c9ed116363c0fddbf61e018507aea590c380ab084c1c50cfedeaf8802da838e33844666dc5bbb4b8d103bdd97b5f76bf2efa1')); - dbms_lob.append(buf, HEXTORAW('91a15927f83ded4849f27b46cb99368894a14172ed3043a3848552638ac48de25a3eb421a30cac126d6099f42a809362aa04bd4c162a73f8b8b018709c5f32e0285416534c8c5f2ecfa6e1a5e955f2e97bd3ae94dcd4637797be50df')); - dbms_lob.append(buf, HEXTORAW('f5831f3bbe95103b7f9ab9fc0be9617f59f5ce0d3f7f2af0c980590c87bc9342d10a02bf7b7fc17d6c9edbfe06d21f2d84155620517dc60e27ef7a89ef1a5ef1d8c49b2f9396e8888abbf3abe4d499724beadb779e246fbac2dba7e5')); - dbms_lob.append(buf, HEXTORAW('21712e385c5dc2c9d5952eb4f1bbf5be6c06c3faef70d1f573b98c4eae41c705de53d309b3f787d9fbc38ccf30a3aff0fc24df97cb20bdcf765fbeca95dadc10175dcefdcefc96b709d165c7aeab6e7c4f88bb9e29fff3a27385b83a')); - dbms_lob.append(buf, HEXTORAW('34b174947c93b3a7f36afa27eade361f2bd8fa76055ba2ce200da18254d425a4a0f092425d8101ea6e0ec75bf17215e072ed7fc788fbef7978974764bbbc30e9dee9470ad1f9c25d5f583a51fe7181d3eb9056861c303913a69c8581')); - dbms_lob.append(buf, HEXTORAW('73b9e6fd6c9563848838bddc24e3c43ebe368d5f3bff4d8fbb00bf0cdfd41017bb52d3d21ecc96f27bf0b5c7be37ed2a21ee5835fd377fede4ac4bafbee4f057d43de92a36a0e5bad5f10a527d4a1ae45b87bc28bd9a0c0a2627342f')); - dbms_lob.append(buf, HEXTORAW('6efbeb8fe2818415d01341448190b43d8e4a39addc8f399ed6f9921f1f9d2f3fa943eac4ffbb2cfae7f342c3e35cd60258f8e3d00d8360afc203901e45a67a9776b9159ec742539570c15d71a2a2a7435cf9e0d1e8d69845c72c38')); - dbms_lob.append(buf, HEXTORAW('edf910ae426222839e33435c01d7ddc6a70bbc58d5b54b5c2df2f31017b71423c00b359f59069fd92a24e6ccdcb2212e7df51367a7ec2907d5c0f61d730b8438b2f4d495bb5c29c4274fbdfef67b7200d6fd5253438b8f3a04e0022')); - dbms_lob.append(buf, HEXTORAW('a0e847707f0b180e094f2ef7588b3c07c6ebb5d78bfe6ab44015faeff71cfc3693d2609d16179467ab954acce0fcee107f96b46310f7843f4e67c27fab53a6444728610a8bc2f0ceaa62762f5b059c888cbb14d3e329907efe8f45')); - dbms_lob.append(buf, HEXTORAW('d176f2f34e8337e93876c897e9210977ddc317e81f390dc9692675ca12f535674bc54885dd6779f709a84596fedf7ca37c3849875f3f44796eca5eed11e495e621a7c319df2ceb45c43b1e89e5ebc25386fcef57b5720a80f50c12')); - dbms_lob.append(buf, HEXTORAW('661288ed39ebbf895f4b652d31fd3bfdbe4d6f2b70ea1be43fd18b86dad8026e8b0521c7a82aeb4645971973b8fc5564b31e0b2a13866824b5b6880b2aef400c18020d73d177caeb684b8f800d4316c169a2ad4aebc7aae1821311')); - dbms_lob.append(buf, HEXTORAW('ee2c2341a17232f60f44dbc140561f92a241608716da1d8325d2d3f69dd61bf9385e833e1a4437b7e24c4d7bd679c551e1162dda45f9e6df8b3ba470f38c569ac9e84f6682a31a107c84362db3cb4e5323e4a14f0e5fad2d327bc9')); - dbms_lob.append(buf, HEXTORAW('47385b4521f68b7ea8db3e48f473b3bef72b508aea5e5a2ff660a55c6aa0d01c859a596b3e8dba49c15a8fbb4bc642a26f85a1d8d8766cbb1a25702fab15092a25fcce8050c17d02b64e322a6984c7ef39284e42a412fb399fc16b')); - dbms_lob.append(buf, HEXTORAW('0905c1e70572bae4ab1052ea79d33d0af70ef727ad76306ad1262dff29c65cba5c73163c2ab777efb286e2295b5185071a04358f4bb561c61866f7345f27b5720aaeb759ebbefb2f51f77eeedad4608b1ffcbfd4e7db1a3ff5be8b')); - dbms_lob.append(buf, HEXTORAW('d81fea2a17d714de13958a476510f5d29da466120b64a038759302e048b2cba7c65014a8f661470d0c180cc648be585164f42683cead1480f643ff01dc673598c4f12b330eecb32f80c93258745fe584cb8047f570ab0447b380a7')); - dbms_lob.append(buf, HEXTORAW('7816769854a7c293c171ecd4c78343cb6be9562cb69b35aeeb0e7b1421cb25fffcbf6972a7ad67dd3fff646ad1035376fa8e079f35e4fe087038f002f31e1761b706410d15e4ae0c3571c97ecf6e88043d709d1eaa3f475d3fbca1')); - dbms_lob.append(buf, HEXTORAW('fab9db69d3a095feec860898057c255126f3e0ca29842cf54f7b1fe136cb1991b44b1fa8a02e08a5e72392683cba45fa80db002f57ae6f1307ee3e42fb3297e35bda007a5e871c32819bf31c55a01fa61f06fd2afd49e378dbf4db')); - dbms_lob.append(buf, HEXTORAW('bfa8973fcecab8e13339e1d203deb1ee71cbe6ed92d5291944f5dbe00c9247c2d84d27ff9da87a738b57b245bfdfabd2a90b0023a0b474e1cfb1edafbdad41be53c76ceb09d9e901de0fc14aa3ce96f22e83904f3da155e0641598')); - dbms_lob.append(buf, HEXTORAW('5e18bd08ef624b82b6fb7e894a04d45b7e5a28069a61660d322b765bf04b355c6814f2a2474f11d8a6f872d9697989e439ca7021c218e6215e210b49858c13c9cd8402b34db8185e22a40cf926da62dce2c66d1966c999040daf72')); - dbms_lob.append(buf, HEXTORAW('d4ede437272e84e037aef2e3d9077339f7bcc27ecbdd158aff3ea115bf6bae0a102e02ef00860097e07becd1409d56d60b1df571ca3fefce02b7b2f971e47dbf69f4cf73d8dd9cec79d4e8ff3282bd9623059e6b92ca4c843300ef')); - dbms_lob.append(buf, HEXTORAW('3ac2bf5c4e9aafb40dfd1868732902a028686a2c72bc8b35808a9c44cce207e831e8e85dfc266f2cb43ca4e52c388f31b01bf0a2f481c0a0ef0bba543b65231fba1ab8e6376bc3b4f52ec76fc3e977ebdb3109fcd7beb8325efe29')); - dbms_lob.append(buf, HEXTORAW('eb002dee326d4f24b38c1c59ab671dfd65b6cffbd2990b0023a0b679582a1ef653fef78f3fa3183e4bfbd50bff3a422117031a547607a0e3aeb435be80a1f8461ebaab45ba778e3d26c039e43bef268e4b49f0b5c790e2c7416c76')); - dbms_lob.append(buf, HEXTORAW('7624f2253e36afacb09585ec4679ec1676c002abcd0f41c4891c8e7f603fd30be2fa1e7104b070e588a0a2f08649b450c3e93a74f46f0f6cd1a782d17b45edf437aa087b43bf6afad3e948ae4e5e71efd4405e9627b735d04e89ab')); - dbms_lob.append(buf, HEXTORAW('feb104026231a062c002cd91c0e135ca0ef4c0594beef79336fbdc9df5baad3e89d2e8ff80af06ef17ad737a3f2a3dac7b69641064c2926eafcc45973564320e0b1b290514c91287ac90d0d538e89bec3c69f13480736e83797dfb')); - dbms_lob.append(buf, HEXTORAW('82c3193dec61a46997cbe08648935c9ef160bd91e2d3d923da55df641d773fa4b8fa4edba0e377c749b105fd7ccb861f549ea16ed81907cbbc00b184e8a2413300258c2e016bb7e6f0aa444010a7e84e440bbe41f8fb61a72bd647')); - dbms_lob.append(buf, HEXTORAW('59fb49bfd6caae8c4e78b5465920a59be15020dc4626ed1359dbe1ab7c80e41043e1591ec5c65bf4a2f4929289e665b6949b3e5ae760ed26e2348bbddc834dbc000c947086baa9e284ad47396e48042aba5081c21c01c786e1116e')); - dbms_lob.append(buf, HEXTORAW('2d3138f9e8e1ddc17c67d0ebe07f8e685b8dad4b49f7ec8fdd2723b719f31f3a649cbedf5b71eada401471e090d382a557381534cb988118d009630b899974e3b960651b7a77bec9422278a9cc8a04e9356c81f478bb2c3e78a449')); - dbms_lob.append(buf, HEXTORAW('eafe2b632b0369519c57361c0d8428a3c64c4d70688be635bfb4abc961833882c86464c3131fa01f9d8347e631e2fc68596bf84fc26358c821e8e8bfb0a9be4770b876c9dfd9d65fe1ac9ae1bf67ce3882b855878d897535e953ef')); - dbms_lob.append(buf, HEXTORAW('f2f7356de545d8d9b10b2f588a3087092ef45c04b80937c9702d2738b3787d3f8ebf7a2405c05e20b6d865f7d5bddce774bd7fe938e4fbdee87ac16887e7e419ad5c58c854c144e9e0362ab729a3f11ef52825c8a8167cbce2041a')); - dbms_lob.append(buf, HEXTORAW('9b4780ed9ba9010d95316cf2116c3263ef3189f0a2fc3692083f404adde53c806888d4f3e00a712df1b991c602bec2a80c22b43b2c0c62eaab2ba15f9dc68d0d9b463861c650b7629df7555df3a217ed87571e3cbd2725bb9b872c')); - dbms_lob.append(buf, HEXTORAW('e06b5ba151b5805c049a1ec81df6940d2df29df3e0f7fa7cd37576d128746e19f7ff99ef4f9d78c993c7aacfcf7e9a13347dc16e74904e5577141f25bca4230a5f8aa0cd433e9898dd1b37bd6444fd18f6d1552095cd1b31b44267')); - dbms_lob.append(buf, HEXTORAW('dbe56e268f9a9041e06fd0ab48949df05fd2c6d6025e437e6f1327a317e2b8cf6284cc22f85fa2c1e9495df606859d1ab741cb1195768ef942eed2f16a2e7b23ec7ecd1284568ce336ba6d7abbfe92d7b4a80ff85c14cfc7d3120c')); - dbms_lob.append(buf, HEXTORAW('97744c12dbf36b2bd154858019dc61851c0df3a205c3dec9f974b8d1aaa09650cf0b7baa0892e3621bba0014bc1e262566a4f42ad3114e318a3b0ca4ed2169760829167f11c08d769948a9e54001be29fb3c7b0399f68854158944')); - dbms_lob.append(buf, HEXTORAW('f163a13cd5c83c8469af14c240bc442020ee887f19cc263969c83b784711f2c47840073b445a8ded3dc4555168a93efeb055c29cc4db4e09ccc502bff1c889dbfc93ca4aab710ef2f7ef1894fcfc41f6960e55a6026eee303d3054')); - dbms_lob.append(buf, HEXTORAW('e27ed453692a93078c380f50da2bf5e7cf79cdda527ddfac1f405cf4bc3487cef94f869e601c5cd437e956cad81d6d0682784d57a622b51cf594330067dab67ad4359da63b51944d42a26bf2cbd564a8fcbe867a2554c7ef98e08b')); - dbms_lob.append(buf, HEXTORAW('6f4dae09a5f26e337339e5fc7257963ed51a2e91780be1b4f3f29bfb68a7a9a1f36d32369d9adf569ddf714e283da97de2a95946a1757fdd688ec43ed41bbc01799bf6b1c7f0fc82fbe68f33d91ed5d488845456a087f517178e11')); - dbms_lob.append(buf, HEXTORAW('d859997cb0eb83b943ab23a5a2814cdadf18abc0c752ff09e48d61c0bdc53b8bc4fe161e03d919b33dceb13c5fb20d973ac17567f47415111f0b0898bb1820afd143e12f840a22bfae07dc467b681f7d4ef233eb34d3e9502f22e1')); - dbms_lob.append(buf, HEXTORAW('543f15cf43bbda198d6c602efa9f7fac9c073268ebdb4e4fb543b4d10c38def9f8cf7802f79b7c2f3894f4458476abea8104be1d9f88e22c6674f85c7f13994f1893dc3c0d758e07dc047ac7d894f1e586ad695f1efdd479fb5831')); - dbms_lob.append(buf, HEXTORAW('0877bc737ec8182c3560b0171c0508b73144cfb55413f29c3bf42df281838dfe53110cf6e2613741fc9356dde29e5baed9c8e7fbdee0ef99dc778f9a9efc7b707f65443bfc5c92fe480da09f2ec01773dd5bf28f0f3747b9bf4347')); - dbms_lob.append(buf, HEXTORAW('dcfa42f9f37c707d1efc9e42e6cd297eadea43f99f15b64d2a382bdb8f1c6e538b17c107dd61eba00d065f4c65ac685cbe88d34e557ca5b2ef07093fc4e66ed61e33726cf54b0b849f24cd725d5e32aaf951e8833cc59d11a5bf5b')); - dbms_lob.append(buf, HEXTORAW('47e59413a80ae05b2b7b85ca71cab6008597f0ef6a0d3f2b9d9d7f6f2405c05f46ea2ca691429ef48c36acc9f163d2b159bf3b2f3dbbefe80a6900c59fcb00bb5c59fa32dd90db88fecc60db84fe1678a5fa2f8550e85aea27469f')); - dbms_lob.append(buf, HEXTORAW('b0b692d66e277013a0acf005e067c10a8ff13ffaa95ff13069fe98ccf74c667bac127e1d761bac9c722ff6850c991fff371daa6a358e1c4a7b4c072189f0aefa70eda9578187c636f2cbc370b7886e6330bf7115f59b84fe128241')); - dbms_lob.append(buf, HEXTORAW('4fbd19bc05719f0189f198ccf0c7c4f0eee53f834b45f2f1520927406e1fd8bf15c41f4f766a64f86e6868e6bb59310ddafdfffcebd3e95defbc2499fbc7110fe488b8b74fe088ed2d5a12caa1ba1b4609c0def41f1e8b62e698a0')); - dbms_lob.append(buf, HEXTORAW('311db5e1d9bc784ae10e2c26fee796d5f3905b65cda7aef470ef16939e3fc73389ca9d46f2804a47eabd4f54a9003edf9a9509f8bfe58a5e439ee585ab437e88da1f6d65978aa7f4ab52429fa65267d87f611cb31e54cca2bc9598')); - dbms_lob.append(buf, HEXTORAW('6c1ef203cc1e967805f0a076620c443f40b997c4cb5d02f34db234e0a329be2578f0bc1f9857c825f3d5ac3144283fc717e07b1f6b0f19ba343d2617ce7623ca7e86d645662eb5e6d2bfd7359ba8dd8a76ea91cd19f3df0d6238b6')); - dbms_lob.append(buf, HEXTORAW('0207998e93c54b87b3f02c213a1dd80057674f090deae0b6d0b0023cde124d1b59d14885eee2e51c08f0d8f68bcefec7ef283d3c6b6ec71bddf00d95428d574819e70292bc51ab3a41829290e35614530b02a2d69b622c9e25a2c0')); - dbms_lob.append(buf, HEXTORAW('f5f85b0a6b2823d96661b17322860ef53782e14de4cf065cd26e17c5a43534ac1165a425cd64d1dcd7c7c6fbc77ac7fd25b6d7df5aa5f779122735ada9036a31384b874cc197cc4d68c1cbccde433072118969e2978b6d946a64fb')); - dbms_lob.append(buf, HEXTORAW('6d8bb55763769b1b5c86ffdf9c7270831ffa5992b7fa42c2d3a10687740da5e1b8a446fabbd8709b5d110065ccc5e8adf75c80a7ff743b1fdcecfef30460e6ca7ceb9d8af2497d20c4388cb970e2166a9ef27f9e56b72907f92a7e')); - dbms_lob.append(buf, HEXTORAW('2666e92e830fa9516fae84f6b882b58f1eee03e937e89a60ff9481ce2b28f374b7b8441cf16e27218fd60c5bbfabe2c8e379dbedc5c7e25be58e19610d726662576d8a3cbfb590572ae7fe999752fbe2465736de3127d901b9d4b0')); - dbms_lob.append(buf, HEXTORAW('28fbb118650e3b90a9afb1dcbdf6150e942d64dbeb6b5027115a0652682fe59cc7d1f3e7d8f47ae94c8df9ce3bb0f8fb3649215e8553673ad2007b6046ded51890aded8449765e0c9d2295d780ee3b48554c8f8cc637ce6313ef30')); - dbms_lob.append(buf, HEXTORAW('c3e4991f042c264e9c0b64ae16226e0c9765565f9f8cb977c37f35d39018e9f76f9f83ba50bfcdae0c786bf2227c2da11d5dfcf961371e617bd2a0e90967ecadc947fb43a41d8d78c2c15efda831c048bb9b99b3a264f9f8cd6267')); - dbms_lob.append(buf, HEXTORAW('7b96bd7e37638540eb85f9e297d13e73378ff5290ce19a181a4cf6bd8ddbc4f57b6e7c67f89087a22c0f562b984e7e5dfbe47a684ad32d3873df2bafcdb27ce14ac7960cdc75291cd176fb5a2c677c310908a830a6351cfd4b45c2')); - dbms_lob.append(buf, HEXTORAW('438f0c955efb5243bd8924738bf9516fab4d8ece8f180fec3df5141ee7dea0da9f70b275778cf44dbff48a7b79fd66a6d8f40d624537cc9f8658bef0179b3ad51062ade2df429bd3db6f6c2f865f2eceafe85f424be5217a6eddae')); - dbms_lob.append(buf, HEXTORAW('9342176fc7eb7cf174945f0c5b28af98b17abbfe903da48aee95c1dac859082d16b7f8b18f102c048531c24bab6b10249e4790c5f3226fd40e99ab538a4f5c5b71f0f01f4bb86b6f6d8dc023d1a1865505fab90764b27fff102bd9')); - dbms_lob.append(buf, HEXTORAW('8001518efe3e994a5420599b2e1d190e760e33360d16945a504bf0016799916a812f099a9de9f24cd962d6a3b6c7b7841969b9e4098e78001f853edf27f7f76b7100fdc3f6a8f871e16a2aa68ed71d5c3d4030d3f08f1fda3732b7')); - dbms_lob.append(buf, HEXTORAW('ff4cf6aefe2a52f385b883d8f3d78515e963160884fa59878b619f13988da178a5c0fec24167833d3275b6e685de1171cae3ff9b7b96fcb81f3fd075fafff15e78fd8065c23290e0a0150653b425ab6cd18290924def3387a7efe94')); - dbms_lob.append(buf, HEXTORAW('6bbbc9df760cbd78a4bf5545cca3863f1450ac99eabb9821c417c72b7532897abe9879e836f97518fd4a6bb24325e82b7ac1745d93df589698491f8befbffe75d59b73ba08b1d0fbbc6e9a94a70fc6bc745a991c3191479e29f6e1')); - dbms_lob.append(buf, HEXTORAW('d457c6ffe519d9ce150b262ff18f969d77e327d3a73d22f5c9a3df1ef1ee5eb2af4e6d9cb7441a982d8e6b55eb9f0fd332adcd313b0d13f6ac2b7bc5bb6a0fb6f81e935b3d2e98bc252d1730da63a3b32737b2e2bdfdf22e37ed24')); - dbms_lob.append(buf, HEXTORAW('47f6dbdf3e5df71ad27bc9d3d0903c11e6a19047ad3d6f78269b9e9db5ad1488ab802e1044d3443d8f6ea77d769914b0d017a1257d8e1031019c89b4dbf06616e85187c60a0915ac4c1a322901a6048c7b0ef9caa371c66182b614')); - dbms_lob.append(buf, HEXTORAW('12dad381599e3bf19db38969b6bcf2b6580f1835c16469cbcb059f05a01fc5ebcea969f5ebc542947e77fd2f77fe24c4bad77fb9b5ea35f5223a71adee1a05eba70bb1b870ce052b6f97e4669f5179c233b2ff86a53ceb9fab62b7')); - dbms_lob.append(buf, HEXTORAW('e4b8e5851060a13e39d1453b1434c56720dd9314ea547542a4549b3be2bdd137b77fa5f3e55539427cb8fce57b67dd8defc191a30dbb29a8435a8d26f44600a7ac977062a83d6aa9480ebea3fff8162be4eb67ecdf6ac2b5f2c74b')); - dbms_lob.append(buf, HEXTORAW('4446dbb651c5617aaa95a6a72a5c9d9e4bf216c1f7e7c57fbf80a72615c738e06a0dab34a9fc2a7af61d1b5ce0eaabec068b29776c2fb9eac675bb2ebf40888fb35e2ffa979cd0260dbea572f22742cc7de1c3590ba442fde1c645')); - dbms_lob.append(buf, HEXTORAW('37fed44ecad79c5fe76cf017851bc4f4fa057e238b37ebbacadf1ffbe57d7f7bffe56bbe1bff93f47c67bff8de937e9dcf8737bff48c5f70997e4687d3174ac5dfa5a1eb375972fe487d256d40fbf64204f6e0ca4a5a70abf8d705')); - dbms_lob.append(buf, HEXTORAW('b7d6745d458f57d4575ada23a6a82a403f0cfa8a9e6dcfb0ace6856cd3f66c79d68e52d2d7ecba7afadbb21d967e3e7fed9a2fd4df1ab96144f2bc7b62a843b111c030fb3de9b5adb3b05c05fc0197fde491e3fc13bb4237a4f43e')); - dbms_lob.append(buf, HEXTORAW('7398089ea8d7939da8c74e34132e3b412f76629ac26327f65156959ae85d64a5509655849dfc579eec6434d02f4336d550289088de369af83470bd6db4ed64b76c64af94e33d31bec3463b683e3d337b449ff406bc48f1a5b7b7e')); - dbms_lob.append(buf, HEXTORAW('6ed1bcb568972feeef8673b3f2c2dc41f462f7af89703a37f11feda877fd51e09788a823535d2f618975a59eba70f3ce2ecec677b48be5cc6a7cbf874f13ee293b27458fb5af8a476099ed4188df87a433d9cb06e5e3bb6dcfda60')); - dbms_lob.append(buf, HEXTORAW('1ef4b393b3ca5550b9c7c48d02fdcf2afd45440ca5ea16c2c828e4953af7590e516062ea78c3ea9a7f41ff87e344cb072a79de2daa327b50ff8f5c03fc91765156979a6ef2779c6f32e9767d0a3f6487ab29f0e6418f4253d17bf9')); - dbms_lob.append(buf, HEXTORAW('6030f1bfc5ac687f741e3098d52217fbdef87d74cea21c43d2dffbae09aa38478ebfc7faffc049ba0d64d57b0f62a056b8e50b01ab0ea4ac02a05375c01b821085f39e1e1fc0ad92f631a0a8e1c31497a36f3bfac79ec3bc9c780c')); - dbms_lob.append(buf, HEXTORAW('69b7d3ebc64edc1e42d0e57e3c463f21666f42cfdc7db3be9b88bc933e7b7dca0173c3621bacad3e79293fe791c9d8048c71ba499509fec896c2c92eb106d0f4f72ed32d8ec6b1b7920daf38828e8bbf8837b5fd2e318f941a9856')); - dbms_lob.append(buf, HEXTORAW('9e32fbc4d04d720289b293f693e7a099e53b8ad10ab582f66533d48f30a0979c8843c876c58105370767386c573e079f396453a67aea2db785fa3e74fcc553bac9bbde40969695cfee3a039d252fb6ddd4fcb16f41562fde85f572')); - dbms_lob.append(buf, HEXTORAW('f9296c6bab5bf5ee9c3aa9cb5af2cd9533eb8d4bbd08f25a7b44bfbb6cd6449ef84d08ea917f8efc31a8325c4b764e9bc6b5e3d4c88672bee396cda1baa7feabb2958d71710bb85d67604bc5a88d36fbac4c9919662d7017b753f4')); - dbms_lob.append(buf, HEXTORAW('e0ee4384bcec5fb14ce0baf62bb052b0fb3d8b2a9a50e11008f2daa3ab8cfc4f99a19da37e5c4d453da4a8b37343de5e799d2a25df0dba75faf6cad5ea03d10e4d737c0b56fa0b512a44b36926a5a0c1811c6458587fec03c62d4a')); - dbms_lob.append(buf, HEXTORAW('91baef50f2e7bdc396bfffde3da23e651b755fcd93cea2415deb1c5f3d1b86f83d11ec92aa66d3b3654b2f6b6edc185f1d1b053dd90f5526e2aae2913f7490bf88d6e8f77fea0859cf84a1abfa8c39a13c951edae800b14240552b')); - dbms_lob.append(buf, HEXTORAW('30b7e27c57235f04780cf57b0ee6cfc0e58ffad7cffabf5f7fa86cde7bfbd3d66f63a21dafcadc379f3a4c7bccbfdddff7984348442a9ce9d2d2e4cd01e6c735289a9ef250fadb97b8655b2f9c2d5f4d5df5ded4134e9513abca25')); - dbms_lob.append(buf, HEXTORAW('eb0d07226e1a647d2eaa3f4fb3aaf918afafd2797bd78a97a904257b45b3585640936c03321b9d79b912e0674c5465e5b5b81b80a6805028bcd5ffbe8b3eee409e74bcb2f549752dcd79fa8f81a44aea013f594fdc13b3469819e5')); - dbms_lob.append(buf, HEXTORAW('ebb50f7bb586328463a60330bf4f4a2652973614b112ac95779dfce6a4c84997c20269ef8ea47d435ac9382ffe382ca3bfdf32ede2d7eeeb5c7e54435e5e33b4794e408f1c1292f9cf5e63942ccfc7ada981972c2fbf4cbe90fcfd')); - dbms_lob.append(buf, HEXTORAW('c4f8859def4b299ab25ac7a63d1277f937faf78fdc78fef90f72f7af196e913249d82673f7abe83106b1ffbf9838fbe14a2ddfb9dbeabdd5b88d617b7fd79a7a9b2cba7a78c6e257d9d0df7af1db0500adca30f5d7ecedda74a7ea')); - dbms_lob.append(buf, HEXTORAW('a6ae7d76260d761a06bcbb13606bb7dd7e328df823ff1ace157ddb28fecbf6b52f66cbbbf0886f892145ec56d2d8173549a9e38addbe1d3c4165b338ba01f9462c6c04b393275e755720a9f31e3d5c8e734e0e0f2375c0788ba8f8')); - dbms_lob.append(buf, HEXTORAW('6ef000fc57de4f253a156045f580a28f1d4f92dc685ce132267c089d3eef7d75a5e74be687b725c482a1ffc4ea5ad4758ecdeb6e54d3069840ca332f0906fb4472c0463d2e715d3961d1bf45a9f650f2eefee86e36a5e17e2b5d613')); - dbms_lob.append(buf, HEXTORAW('1eb8f578297fe74ccb9b0f43a3a141419af0497eaa7756d07f2e0aa7019222a901443d4e0d14482d2994b3400f864c3de4b31e8acaefbf050fcfba7fe900c9ef4da1533f9d25c41e5ff53ae2b8e512efe0f44ceddf647b44bf3781')); - dbms_lob.append(buf, HEXTORAW('e19285f631be3f2e09c1a44786512c5406838d19463cb4ce16f503fde7249ed752f74bbba9c3a7d26e1c36ffd6d7657bae7a71c95deb90ce4b21672dc7906fad482628c80b10f55500181149aeadad40c20a680b0d21b3507739d0')); - dbms_lob.append(buf, HEXTORAW('f63ca9ff0d7e139de164743d5b04d7202a903595c1b6f6d0961813709be545965d31703a8276aab6c82351bcc4f41c028b967c0d82ce639882dd7d359f81ec97e8fbd6afff75dfefa44536eba8e9fbf8f34ed9cb77ac795c76e0cc')); - dbms_lob.append(buf, HEXTORAW('5ba6dd31738c102beefaae66f5d7b233a778136b07ab0faa234f804de87c80d6a190a8de178c57bd35fefd2b567fb77ef59fe4fb96be21663d2bc487552f1dfae21affececd6fdbf9696da67d7be75ee6b122efd7efe9b3ffd4d3d')); - dbms_lob.append(buf, HEXTORAW('5f8b350e1ab014baa2815e7b8f1023eebe679fabef950aa9b1ed91071d248203442b00d37390ada0f02c8d2bc380efdebbf9dbe12b0b3f2607d1f7a6f44d9be01f711c99f8cc9269e3d5937a8001d69fc37edfcd847aa0458471f9')); - dbms_lob.append(buf, HEXTORAW('8ae4dcd537dcd173a5102debda7c35daaf03e115e4537545b6da01a1d25c246fc2a38ee03b4c4b36960e3e26617b704328593a69255b2be04923ae28f183329ff47eadfdc37d84f8e8d1972f9d834a0b9ac8eb497e208fe45954fd')); - dbms_lob.append(buf, HEXTORAW('49410a5955f701c42230290c4ad6a885e751831d05b4070285a23d9c37158cefc7c52fccfe6a956c91aee97bdebefc292176c8ea76ed3195688fbc84ed51093c1cc59bbb6798ade2bd90d622217fb63db8d8fc60ed3fdd4f6c5ef3')); - dbms_lob.append(buf, HEXTORAW('e9c97fa5d4a49dbd502a882f9e89ccff0e0a9cd6f8eaa128b4a70d83a91e5ba3e83de358faba9e514b44926b2baf81e858311558b9429cd6f6922f77f4832a45ce9b87fa165eb01257e103bd760ad795a25e3cae8f6ca50aeac9ec')); - dbms_lob.append(buf, HEXTORAW('e84a1c65491e8237d453627d29d62e6215b854c16b54bc7bb14a72aae8a54a72aa88cf4ec467c3e2fa89d5d2025ad17ae12be51709f1e686270ebe51b6f3037346ce2e8ac8b9e7e0a73b7e3c480e869bab076c58acdaa5eadf0a6e')); - dbms_lob.append(buf, HEXTORAW('4001da0614feac8745b10e1dbb6e06208ec05cfb92097ffba709d7de03280756ddbf6b26af918ae5b571138ea890bed3177323efcdc75ac75a646fac830bbcfe44c08f63fc0c7ffeb6c3fbef223d9a5b3bed729c7ff426551c4750')); - dbms_lob.append(buf, HEXTORAW('d14eed393269c5bbc287072a788b8cf62dd2b1e5e655bc0f14c7014f58499ffe7d871f7b491fb4ebf0bd0777fc5c7d57da7813a6a23d52fea16008213bff2c72ff925ea682730151d9ebec24156a8b76734ed83d8e5f5e41ce7740')); - dbms_lob.append(buf, HEXTORAW('6015e47a6d8e5790072bbc893edf512171c57491b5e29ded7ca02bbe15bda16645f6fcf6339f2b7385786bfcc4111f97a8efae5fae60dda90a560f57b00a9be76c808221795af77f89e15a58c6be471effbb1f228be22700ee61e2')); - dbms_lob.append(buf, HEXTORAW('6b6f033c9ed191cf3ff9eecdad5e92bfaf7c6df1fb6357c5b507af201fca7644f0d891b7d41e3d59857ab0e29df09ec069ed4bd11b69ce634d54bc9bf4279bf2ccf9edda6eefc5bd4f56df9dfabc825caed3fa2b980205ede0e867')); - dbms_lob.append(buf, HEXTORAW('078a5dcb33cdd330f8935f5bcb034165af660c16aef3b0107d469e72ee215223b678a6658f027fc2ccd7a125551fbc0af86342e5ccacc256762e62f91482ca053e4587a4541a6d6cbb7685e7029f08fc38b5c587f3b25908284621')); - dbms_lob.append(buf, HEXTORAW('bd97f8c857c758c9bbdc785c8c02de127cfe5344a7ebda43aa57fdf49010730ffee0d5674608f1d26b0f2e7ef93269e1dffecd8495be28948bf2fa6b553bd42d037c4ac1da0e0ad6c092aac1d9c8351898dac53f9fe1f7e2f9bd41')); - dbms_lob.append(buf, HEXTORAW('8f2c34ac65d43eac60fd5f81e37d759840f52239fe5e07fab57b01d64a011db6f79f53df15e2e891f9136eb8d75f5348e9d4c55f7329d66b0eaa1dc6b1131f113214c5c8b2ca659b4fd2a98213a9bd11e21b05e929a65832704787')); - dbms_lob.append(buf, HEXTORAW('0c95a7477510b85fa72d5fed5c055c992fc4e79ee22e7f8de2d78f7e6cf37e9a108be67ef5fa8fa8a9afef04482191a781a37d1aa058745d485841da64d1f7ac73da0cea70de9df2bd8f38671e74b6881d9d9c8b42d3b1e0e31c3a')); - dbms_lob.append(buf, HEXTORAW('5a194fafc2f7f1b5b97cc8277d5f31a337d1514ba8a728f993edaae885891eda8fe8e582fe14e073751697a24ffcba3abb302aef359f6e707e5821c48b550ffcb9245d2a8715eb6ac8732005a23dd72715acc1dfaba050c820d21e')); - dbms_lob.append(buf, HEXTORAW('478d096b272aa8c7057918b094ebd55a8668c0f869d817b033e00e0aeaac23aa8378501a53537f2a5e280dd5eccffb1c32509a90a1f9a1933a7410b1dd8c6321f362033f03f34abe3312ed31cac04709926fcac2541ef68e783e1f')); - dbms_lob.append(buf, HEXTORAW('f4c6e95099c2298d38368f297a537436a2c2295b7494f6008b417f94c1efd7ce57fe32fbdbaf3ffdedd402b417daa9fe74b40fc9f32405699ed05986b4f3023c11ed6127dd4c746b29103a4190425758fd4f9113dae1b79db8f464')); - dbms_lob.append(buf, HEXTORAW('6971877e4c39cdb764f5561f83ccad3d44bade72444de4a59a3a6da14158e22d1708a72d1d0e545b7bc8e1a6fe32574f402a0db2d8dceac3194d69b56cab8f4af0f94f75fffaba355f2d3c4488c7cfbdf685623991cccd7d7fc982')); - dbms_lob.append(buf, HEXTORAW('4765a72c6e58418a81424d3ac6bb54c1aabb14acbe13385c77da4db6ea6b4028e06a0a052c017c02f43010abe1f2eb9013063029a2daf780c3c2aebd1838dd079c16316b2f10a2a0ed0dd34e91aabced2e9d479fd943f85b9990a2')); - dbms_lob.append(buf, HEXTORAW('588c762a403b299cd26c8bf5d25c66f4f7587f291c29b5dab51f450760995bd3e8ad5432d8d634d87c92fa4bec8aad3dc2a0ab4fb653176d4553bba4eaeb6fe544f2f98af28af9ea89687d8b7fd5af003c44c13aaa7f414cd91b02')); - dbms_lob.append(buf, HEXTORAW('62b4058f0a4644f71a3afc85412baff163eef78a11bba8d04dbac16f3fc261c8e8ad31a0584b316a32743d90c22bd9963763f4d63cd180859ca0143d1a07a400686b13c1e8d9b7fe498fff268171f6c56e919c27ce1362cef3efdf')); - dbms_lob.append(buf, HEXTORAW('f71d26ea7ad4d3d462c2a7b58d2a84a6aa10d9a87a48c1f5eb815f69deaf17cd2959833c1aac5135c0c368c0c447fda4712890465230a45848a1484fe5a78796bd54f5ac10fbfce3b0bdd6499fa3fdaa2e6306a4c5b547265a89b6')); - dbms_lob.append(buf, HEXTORAW('2aa20d50686b96a9d8fa24836ddd53c8fa6f2a19b2a037956d8544e9bac58cfe18b615901bd80a485d597a6562713cbfa9a569b9ed657bbe7fc88b9f3c2b3de5baa535abeab047563d0cd17a0a6da15d2944aeeb419024423b3548')); - dbms_lob.append(buf, HEXTORAW('ef495d24191161b9b6551aaf1b83ce15a193fc92fc409a6d2cdd8d5c35a4c76e629a2d4f839c03fb912c5aa4d9c6a5039b69b66196661b36d3f2d64efaf932ff70fca965e3d3c6ca37adebf8f3573450ea6940d01a024df0a8abd8')); - dbms_lob.append(buf, HEXTORAW('3055c12a0a59214d713df0f5879b90ee5f3fd5bc7f436f86e7307812fbbb0556810ed57dd040f763d5e3aebbb4ffbfa582a9776b8e7f6fe766a5259afdc5d312cb81e7436ccb95787aae968308e823a4005ca703e3fe58fab6c287')); - dbms_lob.append(buf, HEXTORAW('06d281cb0dbec067bb833a1fbe0b146d0869bbdac041a84aa73b3eaba0aef340faa3bec2b1df9d0bc4c0acc238fecb59faf9641d3252fc146939758def41ba6edcb830db03df2fca4c7ab1f476fa7e9dae6bd0a3f68ea55bd3f460')); - dbms_lob.append(buf, HEXTORAW('a6897b7735cef5eb7d3e796d6a8b2fa8ce008bb1e4a9515d904eb2a0c5719277521464d0604d442b0c82f0f4c8e3d031fc6bcddf35ce3c94ba6b193fe4811f117bff8c8b5e7d64baff9e77bc54df93d1eda1d3994d794936efc4cd')); - dbms_lob.append(buf, HEXTORAW('336e14f7d8bce331f9e3e9ba113e8f9969f881798cc61de7b79fa8f7e5b86763efdb7726b9869c521a2fc9b75e83a690ac6342addc9a7d6d250512a86c0ce377dfba395e74e830387e2059ea006880f0fa02aa2760f5058109c533')); - dbms_lob.append(buf, HEXTORAW('078c541f141356f727cfef36263ec9a7c2531b07344a8bf4fd6ecf9ff5e43ed21c58347be44a6c62a605188aa31a03aa1a79ed7aa2a6099e4fe870f54901e809bd8a419ae05f37a1ceaf47a8a0fadfe6dfabc047f595ec3e067568')); - dbms_lob.append(buf, HEXTORAW('410ec486417573fcc5cbaf3bcfb8d15f1cf676693ccf5f9b89b52fda27ccea5492d5ad509d4a38902f6fe2ac9e461431454f8abf0c6b0d49ea2852af6931371ded4c8a22850f3082b48b293c693de08a63789bbaf655fefdde55e2')); - dbms_lob.append(buf, HEXTORAW('b7f6a78844f5408a8f7c9851b13aa688c9af6950c51946667b20d02047876bb6ab45b1daeaa2787b7ba601b7e6c59f5e9f374fc26f56f72279a42c2b3d81d3c44da150a648f4446e59fcd68be0fd18a4ac210a491d6de281fbb962')); - dbms_lob.append(buf, HEXTORAW('e17cc9f1f8e5ea8aaad5bdfc7071f527b366c5b547a0ee83d53159e61dddbe5a51139e989e94dbb0412f502705455ec4e9b3f9d1c26fbbbf763ea62d3686d4f24b8ae418f3772dcfb4d6e10286857125af50dfda8be8aec9485481')); - dbms_lob.append(buf, HEXTORAW('dc2c1e6fe71718252ba0eac90af43c4b819e6d42619e83f440a890d028d86b6e811ef1396fc38cf113270a31fbf877ee5bd84a7d17290ef238aa6169d1c4bd810aa492790228bca2095e4ff83c764c96de5589210ddcc0dfe9f923')); - dbms_lob.append(buf, HEXTORAW('ccf76885516b426d19ca813ee5ddbbe67ffbad10cbe67cdb7f841f3bf5156c6efc00b158b6dc728e595aaec2614971cfa1b91e4e446f633fd4c02d1367eadea9e7b569a3be4b2b0458647a80918536c5bc2f6ee75bfdfba139c76d')); - dbms_lob.append(buf, HEXTORAW('481f13e5372f74acb07a3e310fc422b731c38559baac3dc8b22d33e9698f9a8f83a485858c5ff4db8693d7ac5a413172aa1f6069cf5aee69a2ee6b420add9247ae1507267af26878e5b43ee39e6079629cef1ca0d3b1a158ead8fb')); - dbms_lob.append(buf, HEXTORAW('fcb59afa4beb667d776e5c7b700f2d28c7d4be24c7890d195a7c8f24f6f8ac1e362b90f602111166205b3ccad6eddb4648aeb921a4e599e43c7e3e6e0226bfb676088b34981b070f14f5fed60eda7308685c5de9adfe1e1c90061e')); - dbms_lob.append(buf, HEXTORAW('a8c48d584226d95481ae36ddf6ec21828402f3f3c72bbc99d2729d3ae49177de244bac8782b4285d43212b4a5f24cf837b100429664c9e045314a49074ba2e06aade52c4627969d8a379f769ba34d0eb4d486b008d938478f4b4d1')); - dbms_lob.append(buf, HEXTORAW('3fbe2d07ecfa49bf0d9ee26725d92b6f9b54fc71e73c84d5733c04600be930cb90f032411e48583d9778e24cc94acb6b8d2c1e3dd0a8e29c2c35b2d0b006a5150d0d2c175052eed465e73dfdad3482a13dc67fbe0e9d8641c394db')); - dbms_lob.append(buf, HEXTORAW('60a88f4df42ce4423b20b09046131e35574c89f945bf554d5877f6af385f424fd4344193e7408a84e4c8a228eaaf33ef6f2479a22f8242a076d58ac2b340b2f9c3a0430ae668461f38c9b9fffec661f507afe811d71edcd0d8dc0a')); - dbms_lob.append(buf, HEXTORAW('f2dcc4864ba0e23de0a958765848ee5146e9b53c2c7d581bf240489e690d9a1407f7a4499ee90b8405b75e5b69115d33481f701ea0fcb0434e3a6ec2b97bc87f5738ab3233857dcf9d5c76a21e2fd0b355260b56c949db8dd3b907')); - dbms_lob.append(buf, HEXTORAW('abe85c05cb26706c93396f61e35e7ed6c2ebb5139c7ba5a25853b96adadab5ea4575c83aa9c5a238ad7150e19486489bd3163fe5b943d1e858f07d0ad2e21759527a7334b2d468f16b1120069cce3ec9657036e05fcce7f9ae9d7a')); - dbms_lob.append(buf, HEXTORAW('80d2807e1cb04401bf7ec7bffcad11d6d5fdb2c3a71d84d8e7b8c3efcabf4cfeedd250a7367efe4816ab7fe09b5a52e52df672726c9b5a9600cf0b6c0a5860d06fee76f8d883ab7a870d4fafbc4d88f7663eb73682cfab43be7ca0')); - dbms_lob.append(buf, HEXTORAW('f21e8b8df5d82a425bcc686f5f727abe73e4822eb27ddbfdbbd3cea37a097b21a43e6f05fcd09e56a556b9cd427ba8e7790539eddc908176d015d3ba1d157d5e31ad0be92cbbf71638d166f9a17cd1cc19cf08b160d6cc65df9282')); - dbms_lob.append(buf, HEXTORAW('a0fa0e181cba10f01186935c53012065b3513d0d2dd6421ef54990e4334544d317fd5d7d89f608a9c053ef8e0c34deb2ee33eee4ef7bc97e6ad1bef585c7a688c09e619b5d411edc234be185963dc93293f41f3fb29bd307bf2b5a')); - dbms_lob.append(buf, HEXTORAW('7f37e8a35b8598fbce87d316832352e4d46f753008abd15f3c54e861bc9b41b9a6ae6da5406871724fe9f2b71e78cbd9f2839c9cd0b8a802b16d12480386d236835b3a44f1b84a5957dd67d99e9ab2765ca4411653168f9e880ac1')); - dbms_lob.append(buf, HEXTORAW('353d17c5970c9ad7fe95ff13e2a3092f8dfa18e74250c1590ded0d457bfa509614ad29208b4757e2526c185b3be8024178149425d1882c13bd391adb3d534ff87b98bfebc29f08201d3073387b9ed1a14c144d2793d151538d767d')); - dbms_lob.append(buf, HEXTORAW('fd45bb953316bfe65b767b5f7668ffd52709d17e8f1d861cefe7e387d90467a9bc75b01d7ee02853db76f8b64d2d9bb91dbe83c2aeeaeaf52d562c970ae487e7a645162b0a75df0292278681568bf45d4a57a5100e296c5f027bec')); - dbms_lob.append(buf, HEXTORAW('ddbbb6f34b42b4ddb7d39051a384bd827c100c22da7d58ef50d0ec0af202751f7032b0ca40cf5a60cbe805779735f9c5a69fbf1dfbd305f3a4dcce9bf4d1c35f53c1206513a2be406f39429e33853e69cd83da1385806400e982b')); - dbms_lob.append(buf, HEXTORAW('512e024771b7b2d06545f168bd933e87cafa0ef711e15397d5a584e90691b5a743fdaef477d9e0dda61732bc8c35a91b8784e29024adfcd0a9ce3a3e8c50ce22cbcd7a417dc44d5e07759ea82ca0fff2ac4d76f7df436350b9f5f7')); - dbms_lob.append(buf, HEXTORAW('43628221c3a6d9d0a0da97f9aad40b655165638f64f5adb48ba4920154a59b2a244735dcd58cc59c5c85de52807b22858164cdde29aa3d75c22c4b4871f7bcbafe7f02fbd884816197920b4c6408be6e469b0dfe93e1e3bd6a122a')); - dbms_lob.append(buf, HEXTORAW('48936248b099367c15cfac0efd90ce7210097d12d372159da74704dc33380d7c5f8fef79fdd892f1f2aff7d7c5ddfa5be27966c53cb5c0a15e842c0701426cbb6b3255b503f0fd55fc343911edea7e8f5f0d692ead1138c6342bdd')); - dbms_lob.append(buf, HEXTORAW('60148975e740cc7c1bb301d06f93743529303a1d36685fa026b3d14922a33e9c58d0b93be48ba6668f28b71d0ea9ef48cf6b3e229c4c903c90785b6204fdab3cd35ef377b260e92a7bbb957c444ada12ff9bed02b298f76f85c240')); - dbms_lob.append(buf, HEXTORAW('855631eb085d4692d231892cac53b18aee8f135bfc0a23b5bcb08acbdd8d76815fd224d4f5fa46a78d2876d6b297d8539a524bf6f350542052894474c79f352e4bd3bbd9ce8df939dc5ede20c73cf52394b8ba6634d3c703634559')); - dbms_lob.append(buf, HEXTORAW('e0e5795cad6b3b86395a2517c8937eff16972e25fbf68cda4aa4ac57f3d424cb554e0870af06a58b0d5773148d951b4484d8b8d503cf5a729a8d71860d97917019207d105902cb530a0cb60449817ffbb6b3eaf0716cebdd0037b2')); - dbms_lob.append(buf, HEXTORAW('520425f742e4623141c15def90ab0667155e76ae989ad2a5de2de7f94d067c77b4549ce9a469a76ac421d490e5a0ee80c76aaec653b088c34cf9e97f2d215df8401ce2ab2a9027ba47719358fae4d1965e27a80bdc1ee73d97d728')); - dbms_lob.append(buf, HEXTORAW('0363cd470b2d34b24ad20977267ec5890ac023969057970a706b46b62fab18a77b33d38bf342e3a2edc714c4f928b0820970fc1f0b889dac06d1e46c4f2fb265e640805e803fa4719a75e9e569053123f4f6067047d563cab201f9')); - dbms_lob.append(buf, HEXTORAW('bb8825cca6d58dda777c2207c24f09ef1f4f5ce0df68a77cfa017ebbfb1c013d2f388df06efdfdaf3823ceb826e9267ccc35c2168c36994f9bb3eea99dd1fbb526d7fd8cc8b0a090952a8ec26e16f25b2abff7b741130e20f462ff')); - dbms_lob.append(buf, HEXTORAW('ad95e3e0a078b142eba392aa073bed2b4e402ca8ea3ca5c132717712e2626e0ce19848bf651fc1e78404345b44ede2973682253dcbe2efa357c29c45723de7978c6e312bf434e122898d28be6fb28588b02bf1a1432d5a06ea0166')); - dbms_lob.append(buf, HEXTORAW('b05b5d892a10eae7d7da982e4c934c2a2270bdfc3de571e751cc1ad7d61c7006d29128e89b211bf372284a73d3128c014d91eef3dfdec35af458438fde74befbdbcc23fa33c25bf4b6eb41fa84c49f56bb6c29dbb3d65410f55ed2')); - dbms_lob.append(buf, HEXTORAW('fe540e190030772e015432e862adc29d6fda5f022e08f79d1ad109df355c1a8fcab7a2fdeee105e1bd7aa249fae890b6ca9217663bf634d443488d87591f748f4ef3b6322c65e6be20c2d97eabb2e253916bfa9ef56fcc8bfce51c')); - dbms_lob.append(buf, HEXTORAW('f9147a670c7a5ad3620c748531673411f49266229e8b94e91fa4e25c79abe8bb3f6e7821ebe558ec184fc0a143eb6ba307dd73d4e1062d74bf72aef200d9ce5f77cfb455577d61ea87bc22e6431886c426d406e2b39a6f7cd0dfee')); - dbms_lob.append(buf, HEXTORAW('9c4832e78cdaf407746a71c70a05fd0eb7aeffabfcbf688a64ac87e32e5aa58b527e1e20c87fc2ff5f524c7b1f98bf029c013cb7136e84f017d57d19372ace89f81fe8bd19b6bd03b23f1b8107ff3909a234ed3fd93095802480a0')); - dbms_lob.append(buf, HEXTORAW('6862aef179aaf05222cba3d6d06c0363f0f44c469deb170c5b2a1798b74baacc269ef201796422ef091c0b3f55e400acf87459acbf6aacad678747a96ffa5e7e8efb9f1f47fedb672da6772c25f74c797237eb85ff14c15ca3aa68')); - dbms_lob.append(buf, HEXTORAW('b186fcd5e8058f4d685529fe13ef2342886fea5828d0fa02d4824a96d86e31f6e8286db96d748405701f2841ae18951c5af6e976b8498f3eb075d7f3e56880d67ac5df6fa7971fd45fde07966bb77d338c901f6c0d22e3ff50b79a8')); - dbms_lob.append(buf, HEXTORAW('745f6ec2fbfa883ec02107823c1af433f017bcc302df7b46f39ac5e995e8572fcba03fd622b7aec836f0b1b07c21c71ef60c8bb597498fe8d3f372ba37e9b93a7462d2d7e30296accbda83f38b3de6c4c5ce9329f385e83724ffbd')); - dbms_lob.append(buf, HEXTORAW('41d8132d440a97422358f3d36b63fbe1f7fdd8fd488736427f22410865332f8719043aed2022c47efbf5abbfc0f728677a0fb77ac5680f53ceca30ffd0bc40ede19af3846c37a3ffa43c8e8c7f2e209f14d21dcbe8537fba5abe39')); - dbms_lob.append(buf, HEXTORAW('7df2145de33eceefad62a2ad3dc803e3f2abfb6593afeda040c46c585c2ccd36560fc2f2dc9b9966eb253b588a0e1c9a0c8f24162a08c73ff7cbbb2bdd05c85ad0f9efac325617449d66c23a5639ab3d0dbea641ae3d8f05bbe2f7')); - dbms_lob.append(buf, HEXTORAW('714514d02181b002b4670e2fe88a4ffb5d3f60cdd84f55411d09ba1bfd238fdd4ed685848a7a2c8d32ac9e4b9a4649fdae9e2f6331e6403e3ef053bd82649fdffc3c7849af87b8d7a06f4b0f1f8aefb6542027af20a7e741af88d1')); - dbms_lob.append(buf, HEXTORAW('8ba5931af4e32ade4dfa9c5faa7f60e9a93b75c97cd6df72a8e3f93b465adfa15ec00bd5fcfa9728bcd1fcdd61e9a4d6f451829b7a45189db8b5ad434eef3fbba5e43f756c8b4e237a8860ba78b0504f8d467b9900eb3f536ead72')); - dbms_lob.append(buf, HEXTORAW('ccd2ade32ade4dfa96ba1d2f58706bf23bd17b8a9a832be6c0e68861b185aeede181f4828665057b818ee58584b6bce9e62ec2e24cf4d8161a1880ae39d1fdd276c5dbcbc9632005427bc990e2a0ad1cb0c543fd97e6ef7a4de36d')); - dbms_lob.append(buf, HEXTORAW('130616f5d804fdbbbb5c05744c3bdbc4797d80fffd3f9cbee8b8599f8ae0222057fc083d26ad4f089e10a770deef3ce9829ff818d68be9cf27fdee70d23be22eef21d0a78998f837e5b60c316b4b057260f1365905b9cbe859166f')); - dbms_lob.append(buf, HEXTORAW('1354bc47e2e9f1c5775e601b9a97529f7e921027de7be1a167232d579f7487d0b43ef12e8541dc1782c2e05b68f045dd8d1e07f43c5350ba504efe7eeccde79e77d93af9ef13c45ed1ad3ef8e2b82d2943f7a7c2931944d47f7172')); - dbms_lob.append(buf, HEXTORAW('5c6ed0b757bc9bf4f9e23b37b439bf504ce2a9a00762bb9abfdb6eb26bbb7820818a5cd37388b96670d99bb64485ad32996bf05821a18bbfe732fa517cf9bc85cf2d43e8494f90b46502dfca810af5f862382b64f2980209584cbf')); - dbms_lob.append(buf, HEXTORAW('f7cb05249165f528f195c0533f1b7ffcfcf1f29e8cc6aefe76dc3605109714e102373d078ba5ac71a6f8a581c02df1723c1706a60660913778e31bc07e79592a8425023b2bb0013f142b4a16851ad8932d59057911a367d983ab19')); - dbms_lob.append(buf, HEXTORAW('3b35103daea822f1f4773c6af71f4f919e65dfc543f20ec0669cd1839a7cf81e60aa89936209912221cf85425e3491a937050b356d17dd5fcc70f270a4e733eac007661d7cb010690569a3afec23e22315bc3d4cb9e35951aec5a3')); - dbms_lob.append(buf, HEXTORAW('b4f45f6cab1379473cfd8ddd934cd3e70616e317868637513c656baead776d170f44efe1138e429b02a09013dfacacb995c9969089c059dc7c0faec69bbd5b7c05f1fdd3734e58892c283d3162c2d4bb5a12fcd2c4f9d60a81fa8d')); - dbms_lob.append(buf, HEXTORAW('306079a296f91d5f1105680156437c5723148b5fb752fb53f50dbea7d698dd78d81a7f5750ee39c4fadd05ee014f3cc0936c6aa92d7dcae2b2a73d2a3e0ac4819bd002492f3e1127d8db2ddbc0b9428dc9bf527c94aecbf7648b79')); - dbms_lob.append(buf, HEXTORAW('20263dcb1e5ccdd8a9c1507cc2b6075758bced4fcc87bc31a0cdb5d70871d075c74eec8e02e1d49b14d46772bf6f42522ce499e8901729148b22e1e9d581bdc8f09cde2c503e575875eb65592542b47ba6f30f53fcaccf63c4f428')); - dbms_lob.append(buf, HEXTORAW('5fb69051305dd754a4cdad202fd2b849cfee512696e3a0a7e202cf6d8a5f31d1c3fe0adbf2da3e1e08d22f93e6b9bbf87bb28e4de849789690492c5d4fbd47d33fda2bf72deb864bea3b9342f09885ad435254214e959c5fb1fbc8')); - dbms_lob.append(buf, HEXTORAW('5227c5e1e2db23806ee2a6f9dd5f2a9fc71a8ad347c4faed748ed7d3af8309780eb1d000ad45259ee02c13a8280ab8f20ab7af9945f07eb204bfd8f80fb75ff03fe2d7325cc507b314f96ec17ca20fac65f01046127a963db8ec21')); - dbms_lob.append(buf, HEXTORAW('5e1682c94d1a8289e22963530677b857887edf0e6db8335d88c38e3ffee21e384fa6052af65bdc02d84241522cdc43d16b26965d6203e305502b0e0a8d49055238fdb653bb0f979ed28bbb757bcd4f9f2f715ee8f65882f6e0f34d')); - dbms_lob.append(buf, HEXTORAW('d06041fb24f128f95a46cc03e11e0e4649807e62390e1a5ce67cc63d4aa2f764f343585beeda3e6b2054afe1467fe09e83d08b8ee676eef68e350752929089ece832e0864617478a2ba396947ff00ba61ada6327b0691b5b14a73')); - dbms_lob.append(buf, HEXTORAW('a09bd5680e779e8475f11f1c7bc26333ca24020ff5f2a5eef79ef86680125b7b88a580c3f18630e834ac209d4baddf5d0666ebe79803877633f3bc9751fe847a2305948b6b99e74b26dec9bb9fb305fe3b32a561a07c9f6e002fdd')); - dbms_lob.append(buf, HEXTORAW('0b8d4dace4384e89b7afaa78f7c23c4e9fb5f5a7b1a0e386b3950c116043f30210f79e93513be2bf20d0cb24d2f7d7849f7478e3ffd7ea93886765b3de323f9630731b47bf720bf812404dd1ecc80b184f612242118f4899e97dc')); - dbms_lob.append(buf, HEXTORAW('2032e927db43adb97b703de5fd7784b0c46cc46e5d8be7e069975f291addf0dc42b2c41a6d8b60aeae80a7b44ad3427064574b8ba6c5b256ed298b444f88982075488a2c6eaa70e0277a8581d3d0734d7a7ff8cb5520a03872e37')); - dbms_lob.append(buf, HEXTORAW('e6f2316f81e5bc0e222055014908348146fee04ca43037ccd8c5b7224079f6b7f708b5c5e778fb2b0546b240bc942ed7af65838a48b293e6e79ea106f20a461d00f78eaf68a77e0dc830a846014bfe83731dcd9ada59cb8773f36bb')); - dbms_lob.append(buf, HEXTORAW('f2ea3a21463c7ddf19e3e70b31e0f1821b7ae3fc9a561f29d812e9eea460d20628988a50570a4261742e4b886d43eee317ed7e5fd121bf0971d90d250f3df78b1caf43db9c35e942c9dfd3de24bfc2dcc66f6ca2e7910bd902f1380')); - dbms_lob.append(buf, HEXTORAW('f19053ccaa6fbaf191ea5a2675df3e3f4d5f35e207984fa93e80b54696dcb6bfb78202a5f3f567199118f7bb133aefb00372a30636743377d16b7ceaba74ae7a19e12dbe1fcec691d3a8be219237617eddb8357d4435045b6560c54')); - dbms_lob.append(buf, HEXTORAW('794b59497dd8fd432d1f1f69a261fe08d712cbef6140f9fd5d17ec7370caf3521fefe13c919515df7f7ac700d55fc351491d93032f1ea709d38b9d05ad26d0b1ac527832f081e8df91141aa333d959c5fbeebadc6dcb5c2f0bb2776')); - dbms_lob.append(buf, HEXTORAW('96237e5aaa7ae43523b2178da13a309c5f8ee0467a687d5f38cdeddd859a127ab700e9bf4b5c2e615d3818a778df39d1acc7626fac18af728def2f836030e5b2f44af2f8e7aa4f4092146653df8c1d37f15e282c231df5c8b1d0c5a')); - dbms_lob.append(buf, HEXTORAW('2d0244a1664b759abd68f18282a937034a0fe592631e1d7c459510ff77cce383a7bd2e445bd1f1a419df49f95a1b7a75503a0cc23c11dc59a299fcea0aef9ee6fce2d17c633933ddd67f7afea13539a2ef592bde13f69f2832e905e')); - dbms_lob.append(buf, HEXTORAW('49855bc6f9f6bfb1412aa7aeb5801190aa3b4c657781f35e0e20ab2f20d3c5b77101540914b4f03361ff7111eddf2305921e1de8d879eb72f16d129e64f15d9fa9acbfefe6192fbff53ae8f92fc5db6cb311f9ebd60af1ad99eb78b')); - dbms_lob.append(buf, HEXTORAW('f7a37503e4f9c50adc14de2d20076a20c6e440e1b142420ff7990a07f77ba4905841a9c70b4aefa3ad25b7cce5fd038584b1d0922957f9baf06f7814c60a66738de79215d6c60ad1a8107338701a0fae41cfd516aa493f9fb5ab6b')); - dbms_lob.append(buf, HEXTORAW('f21b37be5cf69ccbbed3e097eee3fd96766acb8cc373a4437a5fc70f0b7174733a7aa00d60abe3156c814d4a29d4e5af9d844e4be97d81bf13c4a54e873ce999786748fea6249c0f5ca33decfcf2f6a6423d935eaede5ac76cdf22')); - dbms_lob.append(buf, HEXTORAW('8b673256f727d133e42ec0afc7f865fd17777e0876d260723c562b14f5fc96358b9a796d8f10962d3d91af69c416456d2e3834344fc76378ac90109689b650c9d20dc7d3ef94beeb817b3ea11875c280b4a8075c7b1254e95966fe')); - dbms_lob.append(buf, HEXTORAW('5ddfff9f76d9b6a40803ba42b4df6187b17bfb039ec79a7956dc1ccba26233172d3d1e6ba6b52d1e6a60a101f142f242c28dba10f7b7adc169cf21183a0d83cfe6b5838ee983fe1c331925c1e22dd133e87bb62484728d1bf43c5b')); - dbms_lob.append(buf, HEXTORAW('faab3d4b8cd3a7f18bd413215ab75690140779202d61886905223d11ef786f98e38af8f4e508e8e536c92f0ff959d6209286b878fbdab305c3c00d7a4d842813d3e7fd972cc455a45722b7830ad93e1e881bfd87250b443758ac90')); - dbms_lob.append(buf, HEXTORAW('30acfede74fa5cb0e159c7d2eea5ec2c6e1e836fdbaae3cabdf602b32c2f9da71386b03500df84cf766de9ad1bb6db1566d055c0ffbe56dddaec99fbb631108d81ad073a7990c9d6b6bc246b5b34307921a1251dd87b5e3cb7e91f')); - dbms_lob.append(buf, HEXTORAW('1ebcbc87bc1e06dfc16cb3281ea748c07792c55b7b3b28fad981f160d24b9a7cc2e88739ceb28c38bfc9ea5402fc0bd7512d215add06c8d64674d616d646a2d95b03bdf7fd7115e731c1c30964b599fc06179b13f2ebf15dbeedf3')); - dbms_lob.append(buf, HEXTORAW('8da297acff8259a389f90d26fbf0fe2b37e8d9d2dad11ee284ff922c2c315bf0ad44127b0e7393669944f1b8504018f7299c2fbec7f61c220f84776c146f7d7bdb3b7aac10a2dbf13d1677c1eeb3fa842f2a80a274c33f3168cb5b')); - dbms_lob.append(buf, HEXTORAW('4fa258fe70575881f86da1b3ae3ee0deb4542152f35bcc39cd4f948d0d94849e43dc11af9128e495d83afb2760d1d144685a746582ced00fe3a98496a73875cb16128a7bbdfb0cbeb9e5e96a45926ff24d7c5a166f93b5c31cdb96')); - dbms_lob.append(buf, HEXTORAW('3c4d7b7e49b72bdff48a69d7a0a7e983de3b6af342ffd28be9dcf3600ac42f54f4da791da2060ad10b7a50890dcb66f29bd4830ad4d524e93f9b47c9f9e51e6539a3c7e538d7a4a7e917690f15e5cfdbf2da3e8be8aa5a80bbf8bc')); - dbms_lob.append(buf, HEXTORAW('c17ab22c137b564544ddc77096bd2326eb89c7051ddeb10acf15f57e7efac1ff1a784efffe8ae71014813e9c9e200e8cb21d56af3d8e306b048eff512ebee9605801ff7b4fb8f0825f8ff1dbe53491bec3ecf889c98bdec5157fdc')); - dbms_lob.append(buf, HEXTORAW('11afca82b285063c6671c506ba69d1f56c5e41a9b4d80ed8a46fb75df7a92096e6db9eb64c3b21440c3e83d966a621656b876cdb963c8c3e4fd74d56b0b98915d3090c41d007bd7e5e3f9297409a2f656561f13cbe2051d26deb8f')); - dbms_lob.append(buf, HEXTORAW('a3380f246cb60fe797cb41805fa33db43c153143d5ea5126996f2ca1b200bfd6746e4e1ff492ecc1e59df85f12c212b3bd68e0c76ad9101e3be33ae1c014b68a595bc884151226e85885a363bb84ba5d3be016a93486a64ed7854f')); - dbms_lob.append(buf, HEXTORAW('b0a1f45e40d8be3d85e5a9071409ad89b80cfec12e87efc61a075b17b7f5860d4b608186032ebd61917bf602af307b2eac9eb3841ae65ad6cc825b4e6ce140224a0923cc320ca62dbbc04d791501790d839ed90e82d19fccb6e4b1')); - dbms_lob.append(buf, HEXTORAW('574c1bf4032118cfe4d70b564ce71af42c15d3090cc172e08a5e85d06748a691e2a050d5cd26d40587124a0fe43d78205c514536915fdede241711835f8bfc26283f30e9894df328adfdd75c8f72bb5cdb672b13da4a2412fd816b7')); - dbms_lob.append(buf, HEXTORAW('2c287b2421f36303d9bcb99bc90d005ce2d26435052af4bdb31234388a37ae6ffb92fb671d78ae358c0330161d3eaad1a6837525220150ce2f73f8c271206c422ba5e03920a73f8f9b7add8ffeff2df4353960dd941042d509b027')); - dbms_lob.append(buf, HEXTORAW('0931494da423bb64a6fbe66669383bf78a76e5a2358affbc04f389ecf80651bdb4287cb6b79423eada138d0679b516e6cc5b4675b1b48bab6a1432606fda46b91d77ad7fb7b6039439defd26090a552a8ea2606e31488785e4cf67')); - dbms_lob.append(buf, HEXTORAW('fd7f4b807b599fc7ac93ca864060cef3fbb47e919f4994769edbf66eec1e50ddac2e9e9cdbab68f07a24258c1c530d352a0dd4bf9c0d96897532f629207825874924577746cf76107655d7081101dffbe53e7b66dd52704368fc3f')); - dbms_lob.append(buf, HEXTORAW('eaebaa2f64605b52281cdeb44d0062ef0dffbda485801adf890beec2b9094c753d7fa0aa4c3fd3bfde94eff00a172f1564affe4ed99c022e7169dc23736db2e5921214da052856c424b582fef3e5a03b1868ca278cc80015f8158b')); - dbms_lob.append(buf, HEXTORAW('82d04a3cb504dfa939379668943880185cdd706ac21183e719af4ad15ef9007c775a6fb85827be51c7af8ae38ab9bc64b2205b2c794fd3a75fa428ea10f4207ec382e48cfea416d24bf493d289bfcdafacfee51961bf439bf36cf3')); - dbms_lob.append(buf, HEXTORAW('ad91e5cda10f8ef590351b94bb6c5256aa0a17ab3bda6356f304bc1f024122c62366bb1953a36a543daec2e63853876af734f2b54c10aad38d2b02d5fea01e6ef7c9b6bbec74f4071b8e2f779b9806105f44141526e46f4bab7d5e')); - dbms_lob.append(buf, HEXTORAW('9fe00bfde79e2e8a3134c1cc916592d9b5a5a074a320b976fbe19b618145b7a2b45a4f1c6f19dcbf85696a6cbf6760bc4c293acedf1104cbe99c5d6ec8a69aeb0051b5fd6104cd3e9a4d6f45ad65fbdcf3ff9a2331f9672d323b44')); - dbms_lob.append(buf, HEXTORAW('18f17185cbe61e6b4748ef3d73e8ebdef9c23fe7970947e91734c7c7b04264ec3b0b4f21b0c1945e2bf7b63f70cb3f65f528fd2c2afcdb34ee651825fe97ffc776c65e2dd2d7a4721af4c1ecb2a88e94cf4b0ae4c0e1b38cede8e')); - dbms_lob.append(buf, HEXTORAW('ab10557fb79d113d5c552a4baa668568cfc0da48763c2e5008d6e9cb9dc5e07b8438e1a00b773c1ddbb7b73819f0604054d2ea5d4829c445a12d0c140747e1d2d2885e6cef96b8cdb6d94567d993a7419e07f80d2d938ae3ddfbf')); - dbms_lob.append(buf, HEXTORAW('af5bf588856b9e9a73cf08c4854d14bfd659c711fa8e81d8afafd7c76c6fd4876a6bd3ecb5bf75786f13e8f9d40e9e9c56b920385931c3cea6d4e0b052e6f847819fc848defa509295f2bb8c467f1f38ae9226b653ed157f42e85')); - dbms_lob.append(buf, HEXTORAW('3cdb2aa67bea1d194cfac18a7793be67a9c84e5ef19e983e3bebbee3f53b7e70e435429c7ffd9dad1f1821c4d9ab8b6eb9f45121fe9c5efcd5e819425cf8e2bd839fec2044db833b9d3a647682f618da7485b7955fcf6c0fcd6fc')); - dbms_lob.append(buf, HEXTORAW('cb04c5c419e6c070cd67f62b296df9e06fdd8f8189b905f9b7c8c35e7c9d859ee6cfe7ac74355cdb6bc52b60e591efb8fdfcb66bfa5b9ddcf962eac13728ecd2c88d650288f24476c88c230f074f10b7045ab549ff0abf032e039')); - dbms_lob.append(buf, HEXTORAW('f821ac70799f898f067ea6889ee2e15c2556e1ef61d051efadc47bc3f2cd8a8ec233804744beff5dedfb76e9d6e74a213ae7ee5a5f394988851f7dbe68d10cf58a86110ad2aeb41edeadcf032907a423631f071e018ee771d8e6b6')); - dbms_lob.append(buf, HEXTORAW('bbf07e0795c2b4581e2a54d04f1638bfef98ab0f962dd7f6b78ec7bc395dfe385a8c4af763da6384f2cb72d05ea3142e9522b5e7e2283e1a7bf5e4002f134abdf652fd4167d3cbbbd4dbc33803ba549f5c3e0acf293c47e192bec')); - dbms_lob.append(buf, HEXTORAW('2d31d17f8283cb7187801de1fc5ab0fdd307ac50a213efef8d59ff1d9faa8e2da5a138f6e06e9e37d156c64e7a0f857f7f483a674ea24db65c74eb346668ba0bc66002fc3f7f712fb01ef85efcd029f6183ef0cf05d06bc12f488f')); - dbms_lob.append(buf, HEXTORAW('e2425cf12df318a4fd5f2aae88d52b8ec0793fe18d0cb51f4a55fb418f76502a7e7e800d47483df9c00bff0cbf57822fa99c077c4771ae32bf5bdd4b6edf712a275a4ddcabd4e95704d7af77dae95b256975ad9b95f13ed3117e33')); - dbms_lob.append(buf, HEXTORAW('5037c4614bdc0f81d13e0b757427e2b402f205f49e6034bffc9bf621e73480ecf30f8b5cd37acff02f3e228d02bd6e36314be338aaf98b770e70f3e1062c1ac590f2c562d163b829bc97775b582fae454da5d3c817c1b5784ffb03')); - dbms_lob.append(buf, HEXTORAW('d3c90a1d87a90a5d906b22b82a10dee1a96e3b9309e4b1cda2057317022a1356b83870ccc90045cccdd4ee879cac5efca7efce4eca3fb623b6b7e1e8276d1fb2ba8b7af2605cbd748a8d23b0218165be772f13e87bd3fcfe4cf57fc')); - dbms_lob.append(buf, HEXTORAW('5ddbef3dc6df9b28fdb58e6fded53bda5e22e53d114cff8c850c9565172cf4324353d93c446973e193ac6d45588832991c3c4f6b0a5be6f2b2843a562cd9f6dc96906c732ba603a18c9eec402916e24a5a316d5bbc4d16e22a67f42')); - dbms_lob.append(buf, HEXTORAW('c8bd9942ce0250b716d6c7b3437e4d75c7e75882b69ba6ef3f82ddaec1025e79f3c26d7e097876ab7cbb53d16d1c77b9fd5bd99a083b9c0bb1b5d48e8e23e72595ddca7f06c1d7337cee26e6e0c9ec71c433d53f6e9226de78ce3bb')); - dbms_lob.append(buf, HEXTORAW('0d3af21ef5695a81603150676ddd68427da00ecbca7278e8886082b459f5edcd83d60247dca60b24c963947c0e5a3cf2067fbbee218b2ffbfc057f73c4494edfa3de12cd99e89ad79e939b793265b2b5ad5c8db3b52dbe28acf0c6b')); - dbms_lob.append(buf, HEXTORAW('f37b6a4f35e6cd7a60c49ab3c85d9227fa0308d2dae0acbe2ad6e4fd09bcb0e94d28bb901c3caa4dfdcb468c29b5b31cde421704055330d8ba4ed212c868b7db1b9697e2301c5b479fc52d2446ceda579fc0a937ee0802a7b01289')); - dbms_lob.append(buf, HEXTORAW('eff2fd98db7f1096f8775eb445c077b346144f1e0a2289b5002f504cc73b0580a34619162b26655d82c66b61856fdcafa57e7ba427cfaeb1b67bf70b6fa369dc74ef03d40f240a85e843c0fc2c903f81a907b0604052e97dd9704e')); - dbms_lob.append(buf, HEXTORAW('a1055317b1f16f77581a4541c7f1e72c327fb4d1162cfa507b67cdf5fd4ac087903fd4a61bd379965719c5b5e490abde20a09c3f8a6c472d05c4545167e845978ccd3ad3fa2eeb9eadec2bc2249f0262e0fc71a5b2d455abc1daa0')); - dbms_lob.append(buf, HEXTORAW('bffc2e0c79828ac3b28d82abc7b363dd107dbd3b2381eb46c153ddb1e5ce58c5e7031dbc57711ae9edff40a72b33d62f2602896048bcd090dbf00bf76c5caf92d4fc82fefbf60ba6ef3f8b5f45fb33dca27bd89629b5f5b6b0d8426')); - dbms_lob.append(buf, HEXTORAW('b04a05e3d7407a3dd9efe5e356c8bf8543571d70801fc3c4aa8583804d1831c0a93ac61d8dc43b154e4914cf54e548f2398557a23c29ac7087ca95328147800fc28e5548e795cfed07fa613c67c64623c0f3c0970bbe4a15bee0a1')); - dbms_lob.append(buf, HEXTORAW('4fa68d8b08f1e5fac805f3a020eadf04a4d8e277807f56509f6088a9454f31f466ca72c2d6283a7b8b26fcef01b13641ed9b4c8184ce33e984ba034a7a47be70daee6d4f12e2a4ab463e71d96142a44fecf0b709fe1ac7c14e64a7')); - dbms_lob.append(buf, HEXTORAW('79d176516fcb75c64569cc546b0cb27d5db4534114afd46b10515cf6978baf527804789e8ebd2316ec8c05aefab954cb41947bd98b613ce7e0be30ee73709fc2a7ead873897a3f62fa313988e26b3bfd7cdcbc2384f86cda9b8f7d')); - dbms_lob.append(buf, HEXTORAW('dc463158f7a882b5470222565cfb06fe8e359006f49fb748e82bebf4031f89ae81d477ba076b20fcfb33812bf9cb51f2a7e5ab92be57f99b0ee199c023c01dd6be33f59a613edaa94979d5f4757bc2bfd5edc9fb4fdb2b6183df3c')); - dbms_lob.append(buf, HEXTORAW('46af8202ad8cdf4a920f3d4e0b412d8cbbb3d03a267d27497b503b64425e74fb307948d61ec46fa5a4a0e8d1bce25af87512f2cbfbaf02f4c2a057c9f905ee30fa167e05f1e7825e29a35fa2e8adb8675155740d64d2ac8fb6dd')); - dbms_lob.append(buf, HEXTORAW('1ac8d6522098d8e237d98bbe4e4e643d5fea3b39574e9c2977a6dc72b8bf9d334d2861085c05f06c35409c990e2d299b1d90870e70f15ca9a06955e111e079c0b1062256811b5a2c2c8580d3a27b09f03ce0b10110c5d79df8eb1')); - dbms_lob.append(buf, HEXTORAW('59f7d26c4b41e13264ff2f320de12f7345cabde5c3b5dc1fa6b00bf55d0efa0837f1b58d1b1a310bb2ceade316589103fcc5ef8514d0d38a6897e0af08780d3444f0aa01438790ca4602a4c5cc3bf03fea4a01f52ebfcf42ebfa55')); - dbms_lob.append(buf, HEXTORAW('d20c4397f2a3ef01cc9ef6e55fb3e3579a5fcdbcba97d4ff987bce91c71458bbfc60df0d862a65aacccc7845c02c59ca7db4f097405c363eda9ee77f17c312916a8cdc040b44ca495f85a3db08167a39f676a3988e0bfc46714fff')); - dbms_lob.append(buf, HEXTORAW('5c455b77fb583105f8c2f5ff3d93fd49db5e8afbaab814361d420345987ddb31a707e858ea24b8a59b30ffa47a7355281ccefe88cf44bb91cf6fd3401e4e27b573b33d577e9ef75f1bd99e0bb047c67826f931eb56f362912935ed')); - dbms_lob.append(buf, HEXTORAW('c045890903e53a8b23d39fd4ae061f05f9190bec3e897307e31e169032fa6a8ccfe2b019ed7ccf6d0133d53845c1e92b5472c29210b6f013dc8fdc6f30bfa307cb46205fd08a36fe7b702fc0287e2d2e383d1cf54f47e882cdc3f')); - dbms_lob.append(buf, HEXTORAW('aa40e67e3af18faf403021ea45594c807e0867df1ffa9cd2e329f9ea7d53db0e9013999e504a9927518a0ec947d64aa5d960b109857548a5c5b219048fc645964e31d3e415014b44e198f81a3eab7f66cd0b424c3ff95f9fdcbaaf')); - dbms_lob.append(buf, HEXTORAW('101b0a7ecb589fa9beab1e618c3a84b2ea4881c88e69f9489b6ffc0967c053856f4fbc5188aea17de6de9c26c4411dfb2fec7982103d4ee9dd77c3ab422c3ce0f31b964a8bb7eed39a17424fc4dacbbf52f604de9de15024baee64')); - dbms_lob.append(buf, HEXTORAW('490c4ffd6b8b23529f136258f1b517f4f95a7a1abd073f7589e4ffc05bf2863f34d73f052eedecb37c3ed39c15ed4f89b64b816a778b27912ba23965daf2cd648adab10ab883fb145e499e04fa23a6384af01c5ad53291ba946dc')); - dbms_lob.append(buf, HEXTORAW('7147f29b27df2b545aede93670ec4e5950b2eae9053e4bccf663c3c1f1e07f5572d2910f2440e347fd7d975e441ee216787d107a5777e497a6ead3b7d3c72a4889727d56e427bd0ea7b33f44451827623b98f44d14aed4147c0b7c')); - dbms_lob.append(buf, HEXTORAW('2631e4821be7f1cbe57194236455dcae897980a35c06f6c622b01ff9906bf79568fdfe4b752e305c0897ea6413f93d14fd61ea4b8207f09e43673a3daa342d3e386cac6f25b62d00b7a50aed11e8e95dfcc787eb5e27341cfe251ae')); - dbms_lob.append(buf, HEXTORAW('7865d15dbe02f9f6c64fbfdc760a24d572e356bc6aa755fffddb3f0bd162c7562be37ff7105384580b6f2835b8171d289e70f0772fda615e9ec245ae4713be8a090a86e7295c60f15c52a5fc6b81f7e51a389d1406e527bb279a29')); - dbms_lob.append(buf, HEXTORAW('3f7b69c583e33f1162f5c0a5ed7e3b053c66016262a7a36e756260b110832b2ffde06f525186faa4387d7c8fa34244fd8ed09e29b7f80cb59bda39922fff71d6f9452f2e6b2f3b2fad7ecd47e7caceed5abb6ab69c98aafeb5e18c')); - dbms_lob.append(buf, HEXTORAW('6fe64bda4b1a4eae7ad727ea7cdff896042f88a57ec7a79cd9e2cbd633846895d2e6c17d0e90fae0a116bbf798247fdf3ded8ade55f23d53433bf4f0155cd851f6f60962a03fe57858dc73cae94b1d8aa9266ecf32d51f5e2f6f14d')); - dbms_lob.append(buf, HEXTORAW('acd453ba9e9b40803b258b5a4a73d00e0346121e6ec50619deb94e339d5af61e0aeeee772c66739e353e143892ffd1dc5ea6e2d07517cd590657badf04bae1e93ffbf0bfd76392079162e703a03fe13615e11c05c5f8978ca4fb9c')); - dbms_lob.append(buf, HEXTORAW('fbb25f66b549ea254e4305738d6689c71e057cb25e4ba58f11727e70aa7f6cdc5f3114d4f18df4fed51eed0da05b5a7490f752a7457805f4eafc2c403fc127d97f14b6301df238a40af18f404eb3f6a8f5cc66fa03dcc792081dc6')); - dbms_lob.append(buf, HEXTORAW('e647b00af30ff1ee097e8b949f80db3792af9bcd524bf02f22cf1c4f489df89dba390705b792071b1fc5d2ed8f352ffdf6d77e95c71913f95c72c9e523c0edc1a328944a13d26a8f03ce6499026cf77a28122672ad64292844c7e7')); - dbms_lob.append(buf, HEXTORAW('df7c7a73e94137064d65357bef28a62b01e057fb51d15a41879ed55313cf7b6337bee2fdfb4d3d2ac95637e94f416398f473d31b2204bcc509cf38833a3bd7c3e7476ca91d9274a45b0a4e55561c941ebf5e9f70c1922e19eed27f')); - dbms_lob.append(buf, HEXTORAW('99b15b679b7dd9567cafb5aa7b7ffe02ce9f1b4fe579b7f9d2127c0d4c6160f1c3b5c3e7f7aca80033b487a5f398bba74897edf587c5f217ac1c5f715e2fd61b49fe939104eae7d01428a654d87f8b4255669099938da9388eedd2')); - dbms_lob.append(buf, HEXTORAW('365a22dde17c6fb95f4649a9e83954f41b8b6f00b0dbe9805fafee1cf1efb9454e86bd6af7e6feda1e837788e7aede311056bb06b56dd3205297b8b3c11bf42216bc881ed3a7f293d909a8e472a0f24b036e002577b15e5a8ef6d')); - dbms_lob.append(buf, HEXTORAW('ae076db53c4b21bff9e897580846b5970ec1f0b5bd4008c6e457b72ff3a06cfc06d6326c2118e641c5220a8e41df491a51803c680f44d12b65f49bdb1ee411f39027e7b7c2baf6c2db43d1b3785071f356b3f88df3d84bc07f5e22')); - dbms_lob.append(buf, HEXTORAW('7e7f58b06848d403f9eed367ffe3ea40b42527a7b20f1e78ee81cade92c98b1a2e5fe81f2c434741f6d495a10a1fe8758d3e333250d9a94ab3f22d95c954e1cecfe2a60387eeb69cc5ed253e8bbbf2d239e203ec1e4a0ddb8833d2')); - dbms_lob.append(buf, HEXTORAW('1b309134ec8bdfbf92f3c3f893bbec7b9d9c585e3ab0c758ff88db2fbd0bfdba095e912bf9322be0fba0f29e57d2db2b8733e2f98c3be33d17f4a892351b7fa7f6cb36db13672bb3b3a1637ca25296ce92d7edabb34050290b9b93')); - dbms_lob.append(buf, HEXTORAW('2a673d9da5427c16197c0ec711af492a86359f439354bc0f44ff4ee67c2abc2ab476dc1239757fffe3d7b7fe8423a51a719a3459f3d8a54d3492cdf70c203c138f56e38c424f6f77bcc794a79ec0e90cf2817a13cf6655203751e1')); - dbms_lob.append(buf, HEXTORAW('ed815ed315d3aeb562daa43f3640dfb2434380df9189f8f558e5bf673f233c71457673e561632bc8f32ded413b2024ab20f72cedd133d01e43f15c86c97f604705ceafd11ebaff680f35be6303e7f76641e5c9dbf0daca1e08d9602')); - dbms_lob.append(buf, HEXTORAW('1dabae34f7270ded4509b22e13e27f72eecf6a1fcdb8fa9837b5f29fccad982e83dc54e148a7f8a0ba37095ae1ca7ca4e552d9121a87254e13982b2b6e6aafb6091e2140b0ac188bdc411784ee0b9cc785e79c57bcd37ebbf59f89d')); - dbms_lob.append(buf, HEXTORAW('5424f3befa753ead6d7ca9602d2cd4fac142ec11ea35a59d9c120f7becc45f1f978a24f459e8881d2e13c10ad45845ee06bc4fe17d54e5bd3345bf3a33099f39f17ccafb72709fc2ef465e382a95e32a93d3f13b55e62a3cc6673a')); - dbms_lob.append(buf, HEXTORAW('e35355ca8e4799232abfb5bf8837c6f19993904fc2c7003f5074c073613ca72c39375041adf0d1492adeff09be5721e9220cbe4a15befcba6febdf9828c4ece5ef957d75bfe2a516753bb4585e8bcaf31aac79d41cab60dd170a36')); - dbms_lob.append(buf, HEXTORAW('74c6378ed6df2eb2661f98d7e945e981ccebf8eaa874115be328831c0f42bffd13df5fac2dfda62b90b9a5cf2bc8ff097c2ea3576aa9201f64a9c8d6fc6afa838027ab984e6f92dfa9849b15d3baff908517b76341f32ac87985f7')); - dbms_lob.append(buf, HEXTORAW('665690cb7e1a0b3c2721fd58c57be2f688f19b6ed0cbb1d0b3f36bce07d47f15a09741e32c31bf2b672dba3eea814cfbec95641e48d56b0a363c06f87b5b440fd429c0e9d27510d2f3d9e3ed035aa7be2f44cbc5adbbff692711cc')); - dbms_lob.append(buf, HEXTORAW('0629c59444698a3cc445e9bf3aed4de17169a04a40622118ea10c55d8e0e7544149389171bd3fb75ccdbed2d217ec95ef1d8c77708b1f6b39feefa0d1349dd3e42b45f95d1d5df96fad813fef2d66d2b84481bd36270d613069f3c')); - dbms_lob.append(buf, HEXTORAW('64e02a3e3011c4421c6a5ad2218924d966b16c1285f345ed4148bb8d40b16e6c9a2de793f89aaa27e864a102b8f2ccb5a750046d499163cd0aca049f25782e137c2a9c87cc4a11220a2344c4425c9f5ff476b749d2535cf6c482c7')); - dbms_lob.append(buf, HEXTORAW('7ff841fd81b2af74e88a14c859c0b1cb320dc0c67f29a8f7f3952dd3ede6ec99edee12a2dd1e9d0ffdfbc922b8784bf254aadb75a6c91f5b5ccdb32edee6b1ef2f003e135f1906fda8bcc5a5eb2a7ab6e403c6afa45709dca4b7b1')); - dbms_lob.append(buf, HEXTORAW('fc9201a443386c3cd8b3ee4cfa7cb19916edad212ed06f667b68c5c7435c443f9875d534bf791b1b924bc26f01e805e60393dfe58bbefdeadd638458f8f9171f5562a6ac4356282581105ebdb3820d6f01feee14485801ad402a00')); - dbms_lob.append(buf, HEXTORAW('2b01df11e2a7ef97edbde25669c1753ca824da22e7893fb5e9156d10377a139d3d3155ea784533338a2749b3b5d601500cba97eee07cd06972a24b7935e59bd62708b1fb7dfb5dd44f7a22dd9edaf74f6de590dd6bcca1693dae1')); - dbms_lob.append(buf, HEXTORAW('562ffbfe4b62a9478cb35ad77df7fb89d4f6bb6190db05ca530e574908ff76781cf30be2f8bf19915dfda4eb06e057b046d629a2de773aa4e53dc0fef0fa37d2b4c3e2d69955ca1e604d2ad238ccf089ea3892d62f019cba25178')); - dbms_lob.append(buf, HEXTORAW('3e14e654f24415fdba236b7aac5e2dc40be7dc7be413d270f17ef56eaf437d07d5799002a9c1e697b5f38123cd9a62c58dbb8323173053fed6507fbb9f7db7dbf2ec97aff06dca2c35c429c9404a53259e214b14dfc9fa3fd34c7')); - dbms_lob.append(buf, HEXTORAW('f4dbab657862c2ced295aeb5f14fd4a4bfbf2fa873cbd984efc6736c56f5c9658627e0ba0e86213a0a217933393be3d3d9ce8170057f4820650e6c6b4475c9618975b17ed53b091ed5100fe938d83e6f14b6bb781f9c0a4bfe0da')); - dbms_lob.append(buf, HEXTORAW('99f3a65e2ec4d286f9e52b919e54cbb20cc910aa56db98c6d640909efefb5320d4642e704c797e3a6af51deb3ef7ffbdf7f8c3e775f33751bb2ab5dda17ec8270c4f424f046a00264bb30d4c287c51ac0013dd384cd08360b9694')); - dbms_lob.append(buf, HEXTORAW('dce3a9ce7bf0f0c7dd5e238e991fcd0fe929e1749d8b7e3b707a609913a33756c863f84c9420f2cb6f1c2246dd917824fc2d57d194a6126b0f00a0cfae1c0c054f793a7528cb45b72bd791aa85600cc62aab428d46cb8de3375e')); - dbms_lob.append(buf, HEXTORAW('f96e0b94cf05982f6cc447b96804e26f82c019f0a8f6db2478575ea3dda1223cb0b78d0b233f99c4aa13933bd7445d577f3df909ec55713df39f1f34e8a73aaf3a00156f30d202990f1c05127528f901729104ae3f525e4b76f5')); - dbms_lob.append(buf, HEXTORAW('74ff57baee74b474d1979bbfced5ab14bab9ed1f62835f82b259ccba9ceae528aa61272a0e5ded24f836893cfa63de88d586cfe7ff2be034e8a62f9bf672f9025a380ca9d020f0e13064cf86ecf848ae23360fee9617a2afa147')); - dbms_lob.append(buf, HEXTORAW('366c02c6605b31ea2a21c2604c4802c0a2819942808778020395fbe9b7fcff6b76a776a76d8232afefb7d1e65efcdd4f4f47477e52a1c50011254d0beca49b2ae0a7d125404ef9918bfcf3ddc67ccce433f27117ebdfe0dbe60f')); - dbms_lob.append(buf, HEXTORAW('765cf7c308325d7ad12125ff5e7230ffd0c8c9fc69bb1cdf908fa7eb94c5873c5f83de39ddef8bbc73e3d5433e6f3963fb601ebbcbc25a09044d888fe9681248110646f44d922f287dd4540d058f200e1905e596e29d8666d326')); - dbms_lob.append(buf, HEXTORAW('7ad3b5c1fc80736f8e6aaabe2287016473e93ee3de18112a832c9433f870f428adc2537d448b41fa43291feef32e29d38f26c31cea481435244463f9775a36661e7f838521a678e679c7ed5066da47cf469fe32f17c332e25248')); - dbms_lob.append(buf, HEXTORAW('7208e890f408cb3bb6f434680c7f49373baa6df9539bb7e98a75c739f509df954040104354bc4a9b884798c52e3c6e7bffa8626186b162c7b6e3d050e529c07241092344a8fc7efa4d26a6d6005d2f53301810a8b332de895965')); - dbms_lob.append(buf, HEXTORAW('5d079e3156e40696b6b73e326f1848e37fc5d98475a8761338fc954b13e158ce9e7132324f0258d9816eb404a904ca899e3eee1c15fe8c59f34e2bd95c9fa54797f45f196a3f461f65dc9bf574dd487d8f95b2f58a219c9ada91')); - dbms_lob.append(buf, HEXTORAW('b9fff4d4b7c459b373dbd48cf6fe5191543369cabe77a6de58325aeae3ed77ac5fd8ea14ea189355c47e92a75a575b54a24a1da78cf1edb331f715e6211dc4784c9c67d3db6673ee2bcc4bcf882c69b13c0586648fcdb96287f9')); - dbms_lob.append(buf, HEXTORAW('830e4990fd3f51a5e5834abe41ef3a07214ee6249041917988020d0b90281d0aca26d8591dacadb0a447fb711103c8854587c6481907060a1fefb9211b316afb959a97ffdfbb8369df546b7daa62c38f0611517482874c6d5559')); - dbms_lob.append(buf, HEXTORAW('9f007659b87b131c402d848975f88fb6cf4cd824966832095c900783f7487e4e0e71472cd7d01075f06a78e209b407fbc5f0fbc9f775c4c0004472a5571745005ab0a3230ce3ce0317dc93111a1ca86dbed14b8ddfa360c1f5056')); - dbms_lob.append(buf, HEXTORAW('75c669e5e33b74e5f9a571e68871e6c48f3390a092cd0c81849b4e5fb376c6e74a7d73ebbb978c4092ca72a8a658f280c44184830849590b4018d92b8719c804041b8cddd3dd00d91b4f7ca3db3efab7f7ac051919caaf82f1dbf')); - dbms_lob.append(buf, HEXTORAW('4e43a357d3ee8f940c930d789ef84d43cac8ab5b62d41c7addf5c8cdaf6e0cb912a988088691530de1fd538373ea9f8aacda316ea03695561c1bd63aa94faeec2813d5e68a0d4cf277e3e65a8dec9bf2c1933e26b3dcfb33efbe1')); - dbms_lob.append(buf, HEXTORAW('b988be73ce27e3d7fcfcb35273c74d786ea296e0667d3076dd58bd4266fefa7dff516eca99bc6f2bbf98a9ffde64c2eccf349e0697343b75c3adfae8da2f2d9a4d2aed98f470e30bf478d65b75a3d9af99a14c12416e13c1e1ef24')); - dbms_lob.append(buf, HEXTORAW('f75726e623bc5df3919324c096e62ba39ab697dc6d4b50554d2aa7b881c8911b06bf936fdc8d54b949f41f5bc714208bf5cf2a2c100eb2853001a1144b11c00215d076b304e233a60f042c04a4941c9a13699ed2face559394aab5')); - dbms_lob.append(buf, HEXTORAW('a25e2337ae411f58a43289e0eabce8bffe140fd17e9c686bfad238988f0dbc1a1bce463c08734e92334b628320954936ab76c039f838051a578e679c5244ee24527bf042dfee9c46e8b32aab07ee8be0fd7230ce88679cc93826da')); - dbms_lob.append(buf, HEXTORAW('304d49e514a03a1be84b71910bfc369e67fae09c351e43c883547c52a511e49f4f8176530c219f78c0f0975ed51b65f9bb0b1f5b897a2de5a49a2255158ce52597a04fc64682cb0dac34456b5595e0ccb0ac5548efa3b6bd8ffb2c')); - dbms_lob.append(buf, HEXTORAW('53cf586845ea9693ae8c9b570b57d33d03b76dd3ab6e04b95ecdb9d17e57c697eb998f64127450c47b8ed99d3e094a8cb7f2c18ac65bbed4f3fbc0c289c3ce576af49fefd57be90ea5a65c3bf28dafbf56eaf7b9d3facc9aa5e7f6')); - dbms_lob.append(buf, HEXTORAW('e32d955b47623e4917ffade893c457e6edb30a66812bb994bee81e7c0b9f9cd677eeb14afdfa4ee4b9eff5f798bbfea7559fd557aade7e8d26ba755eeaae6aa85a3dec563c4c39a55e370fa396703ee2be5318f33316f313c6fc8c')); - dbms_lob.append(buf, HEXTORAW('adce7cb06a96e7910995b99ff6af94fc839c5b32d8092113fd30eecbc4f8a3fd4d87aeebffeb16a5a6bdfccdd21f0e8acd57fc7c32240282f5ceaa2b8a6f5a64a08f8004b6dd4d40c20670c5bd5c401bbf9ba956217d1414fc3e73')); - dbms_lob.append(buf, HEXTORAW('e4b2f17a237e78dcdc937bb81e5ba19f5bb81bbcbb9114f4673264278737a459e8037d3a63d3cf50b4114c9f921ddb6634fa5f8fb1d5e715954c65d21d2a890170336e2a24079fee5970224c007c1c79d8e0a9a6734090f712a5f6')); - dbms_lob.append(buf, HEXTORAW('608e97cf3be01792838d71048d930209d724519d091b848fa0c624895cdc9738a9257362c992e211e137f3b765fefab4394d951afed880eb3ea9672e6095153616491cc489b10da4b981ecf688acca958d0de48d6546eeb1e91dd8')); - dbms_lob.append(buf, HEXTORAW('aac3b7558b95aaf951edf2fffbbfb8f1865925553d9b1ecf2347b217e23ad3275b495756c59a7e500eae205d7b4040a9ee1798be175fd5db15076d3e52a965dffc36fcf3e95ab298f0ee9103b464372ffcd393335fd273397eeb77')); - dbms_lob.append(buf, HEXTORAW('45501e9623a92879b9b16a909c1630dfecac405e6f046581af050212613951ff7f4ee9545772fc7dfcf4450b75ffd737c6fedfb097b5a4f2bf669b975fa7094a9786d35bb9b9f73e4e5d52bfbef2d93294cce955fd9c6489e73747')); - dbms_lob.append(buf, HEXTORAW('18dd837270f99d26bcf8fd4e0863813f1c8fef8fe7e7bffdad5edff3664fec3717de55c40095d27c8371622fc3d70cac80a4c25e58309ec7e77adb76dbdd040403600984fa03012959e05840dd6f7c7dcbf4dff402a91b6a78d665')); - dbms_lob.append(buf, HEXTORAW('5f4739ca4894d0c4447d7377a1d8a031ddfe403ccbf4c998c939b070e0efacca6424249a6c1cd06b701006700a499304766523a699a5ea1bed22629ca6df1d0b6f249c0562a2b10dfcb9789e8d71e6e279369e978b7152dfa8009b')); - dbms_lob.append(buf, HEXTORAW('b2e440787a88fb7a609c36c69998a0f68117117b272551f1c5c69981e7e5457fa7fe0fce6dce051ad4f938eb39bdae572d5ff2d15a24916495155454c481913b23111096401099ce223e558a8c0016284f7373926de8f867c51a3d')); - dbms_lob.append(buf, HEXTORAW('d3ad061dbef4262df158f7584535baa81867db9d9d43e83d0d21118c449c243910d7997e80adc46f746709c4cc73908a33c89d54d8b4365eb9a6f5142d6b7ffdef37cf78aa963ea88ef8e98e5ff4015d3ebae4fb121006962828ab')); - dbms_lob.append(buf, HEXTORAW('b17087269d3b3b2790ca10991b28f29fbde128a383cc5146df074e106404a6cc10e557e843f0d9cacfdcbfffbe7cfa9085bf2b353bedc71786eb757140a3f6dfb939e46a3fbf4fd6a13747e73dc3cd6abdd339c9644609697497e7')); - dbms_lob.append(buf, HEXTORAW('8cdcbf7e9ba1c147b69798d13dc3831fe39df4c257a3df5fa6d7fbe38591b553314ff41d48454b8419fba0e45ecc1b083d491eaca2a53437052a49db5391e814d90b33334572bb91db6ea3486e37abed84a3f2374efd4abfec1d25')); - dbms_lob.append(buf, HEXTORAW('1d877ee389e49491ad3272d61b994cf5422872f61a53f17b97d5e26e6922da93d6e2ae66c4bb1e574bdcd7d433ee6435918322f37b7104bae127fa8b08f7ea47bc9b3e229fe3e6b7bb1867f7f871aa21de1af71401cfe3c4fb6aac')); - dbms_lob.append(buf, HEXTORAW('8923e91d8e78cff6cc4b40c4fbaa37969e30e609a5664d19f79f455035957d602067d9ad0f78adb75f3ec30b2b071b58b5c140e74640c70bb9145013a5d63db77c909bf2a4626ee9800fdac67f7facd3e7f07ddbfb22c8134720d3')); - dbms_lob.append(buf, HEXTORAW('3cdee4c8086c83ef1ae0eb9db8c6bf9eff1d8a202ffa6063c96f9a00cf787ff4214f6b82f1c569cf5ffcbc9ebf4d5dd634580f89acf41c038bc108163d6de0d62d066e419afccd389036773170d326c01a8020001b7f42ff0b40d8')); - dbms_lob.append(buf, HEXTORAW('9c36e2ef9b7ef2fece90aeef25f00f8b3da7ecf39233dd710f1df674c4adc13eb1df975bafd4e3da6cafff6c74e7f875b5ed08722728a25e6694101910f4f9b0ed08f2dee25c9119001c276cfadecc0f5b8fddf4e4efe97abd6ff8')); - dbms_lob.append(buf, HEXTORAW('717421050652660c043af3b94a9932a89c04dc7cb9d436f5b30021693bb35592b6bb25106a1103b8e21ec111806b705d1ff46f763db4d2de99fd88524dd20e987e855e20d62bd6e7e97ac21445a6f60307c691c9e0f038b2d54402')); - dbms_lob.append(buf, HEXTORAW('732dee4b0d3dd57caf4985c8b5b8d99bc58c8a543e14f1ae0222de6f374911d56aae5b427efe05e89be7cb08e230c63150f4fb21f2be3bc67517f07642c46a2c92dc533b9e8de532e2fd24d4148f457a2bdc9781fba865e03a85eb')); - dbms_lob.append(buf, HEXTORAW('32709dc275a68f4340cf5f187f3792c85ddedacd7191be729c32e2dd685e11772b23e9154792f3381346bc571554dce3aa4e46f47975f9b3fa08dce26c98b7f94b7349e9c10612a75c02955631245fca75553addc032a46dafc001')); - dbms_lob.append(buf, HEXTORAW('5709c9a48a529d08f746ae24b9af81218ddfa9e5349df6ac7ecda733deb866a9fe5baef559541239dc7c5f3dfed518ffb62390791e5912c13ca27f9cf922d65052a18a752a3309248920affcb9fcd24d1d95ca5ff7c45df7e87db7')); - dbms_lob.append(buf, HEXTORAW('326ff147cb911eb21c84b80c11fba5eb309f3f623e3f0144a1ae22d4d62f869341515df451e7a6e439c06b808ff09224422a97530141c859a5456ed894fd9a545a22f2ba02b6abf217d03f52a93f272cfa6ecd214afdf2cc98c563')); - dbms_lob.append(buf, HEXTORAW('c24a1df65cce92933421497d38edd7a6ae8c4d11e4f062d4fb8d723b542f829cfb5c86629b11e4b1887781bf9023f60b300e05fcd1fb7f9ef5c5d32f6a867b79b7853dff840a8a5557349fa980ef63beb09e4bb02f2a487545297b')); - dbms_lob.append(buf, HEXTORAW('28b50fad7322201115d0f61401a166036618e035d3aa98bbafde226b1e5df244f1c94ab5a8dfa6cb2afd42358beb6e3ac3a5a40538901947a0ad804450eae746fb1d38421b8184425530b67aaa03b6a1d838f0abeb66eb4fff6cfa')); - dbms_lob.append(buf, HEXTORAW('490309ab19a0276c05d5284813c17d34ce8818a71dedb2ea05de66dbeb662b03be726143228297345ec1a72a88bae9fe725ce4ce0177ebb53e6edcb5f321519412a40d035515a952d86d17aa167673a4c2515718489c1a07564500')); - dbms_lob.append(buf, HEXTORAW('330ca037a3025fae2d6fedd43f46bb3680d6a5471fdff876bdc51aa71edfe91e97699205a5aa1d319d2be623037d8fd7996f9d4a95a9df6d3b8aaff2818ad3dd0aa1933e1ef6f9139a43dfb06ee5cfeb9ef3ce07ab0071c0334186')); - dbms_lob.append(buf, HEXTORAW('2e9de695e13c5c0f5514ab08bff1e223a706b66d60de59374f91d29502e23a4ec541bfcb026eef88df2960ae0a5073e0ab9e5e72f6587dce64b63eec8113f57852de4ec9744b39fbe2a1aa1b419ed49b935494c96c7dc027ca4e14e')); - dbms_lob.append(buf, HEXTORAW('56fdce4ba3d7ff9d280538676f0ce1fbba5932a906c7bc2bb909c4868fe4875c581b211c002017d6d4f131034e62a3d5ac138481b72ad528ba7cdf86ac179fa034fedf8c57e7a81a67e9a3ee1d07a71c8329863b6a3f792d191fa64')); - dbms_lob.append(buf, HEXTORAW('7ccf85ce9ddc6e27c37ba5ba6eb6d256605bd124e09a90dc84fbbc8184c974d0d2a84d6ebc4d038c77d50cd08b2bd87416f0d4c5b8c3b8cfc2f3c2783f2bc938cdc2ce12de662ad0389e23c69923c64904561ca8c9e215bc04f5cf7')); - dbms_lob.append(buf, HEXTORAW('68b078ed207d8c8b75eb787233715a9a44a5090ab14075909d93ea84f5e57d00d13c74a070f7ba5089515415ebfe00a99f18164e3164eab5559afc782854a357cbbc5e357bb6f3c5ddd977a9d8a8f7bc930ef19e81c61e6d5efc517')); - dbms_lob.append(buf, HEXTORAW('89f6b3b9a0543fcc8fe907474c7bf03ba32b2f2f1ea9d4d482afee7c7a88528b7e9cfefd6252fd1161a5c0331c3825703228c6fcf27c1e97b8cf368fb82cd56eab808e9e22a12bc88d14849a0fb6ef13c34a4a6a2a74f7fcdda0aa')); - dbms_lob.append(buf, HEXTORAW('61f75452ed900ae7cad87d9bfbad9ded8e6fd3b2353d22faa438b0ef2103c28bf5d9d3227471832312326a76b4e78f5bcac055f84e89d76db5c30e0ad9abcbac2e10aa5f668f7de31dfdde4b96ce99bf6c901918db3cc82961be80')); - dbms_lob.append(buf, HEXTORAW('22c302650daf10f3cc95362380052a49db4336106e1103c8482337267106b4107881698ee4fb4ff3163fac5fb47c76e9b3df8f4e88db8ee28ad58e367daac59d0fdd6577aa89ee84a370476b71dbb095f86a713b36f043b76cde3a')); - dbms_lob.append(buf, HEXTORAW('b0283e6645e3e91d3f2efdef1831ce31629c63e2c7453597b9c67b6feffbc7d510878d2171edf8b871f6f68c13f3c778148fb3b71867e2f98c8dd3f4b3a846b8a8711f3ccee82a595f77e59d939e52ea93ab9ef962d0523312aa00')); - dbms_lob.append(buf, HEXTORAW('59d6c640f23e2925ce998cb5a4022115078c88cce9d201436f28bd5108a2b1ae98d631d6b5bb8e674efdeea11583f5613b65d3f98f1a55c21c310f63f09e61e0f27c6f7d1d7d8f30aef3ce2b7f0fc627d7a917bfe3c5fffb05d3bb')); - dbms_lob.append(buf, HEXTORAW('0ed4046f61fe9435bf8333a7fd26032c892014df23fac580d0c1930a8bbddc4679f1b1e441aaa607bdcf6548bf7716bf770ef8fb775e4878cbc5f727899309dea8d8f87f9f30fdb83ff4fa99f5d4d883ee18aee7ab8b33cd4d79c3')); - dbms_lob.append(buf, HEXTORAW('35c855e275ecfb7ec135f9e97b1a7c1151e33ce0fbd1be58f79f95ff9a3449a91f27e40f9b0a1521a9a0f8bd1ff0ce17f7854447e72c9fc3b4deb3bdbf276f7f9104c2818644db491229f0f64303f07b5f3d099f96bde94ef5aa39')); - dbms_lob.append(buf, HEXTORAW('051b22b65207fc9255e738bd10429b5216366feec14d58c2d17b93051206b903077ac770df70e403c876b29d6eb632e27d2cdc6e3b89d41e390192830a901c689c9475b79ade66dbe0784d9f395eaadc4ef32b6b65cb88f7c40159')); - dbms_lob.append(buf, HEXTORAW('d50e248437cc96633714cdd1339d5ff8d4f8e76fd59be3c9d247493545eea27c206084acb2a2fa1e929040f4272f1e4ee5f02ee0558074841400da06703cd340efef21f42dcda02dde7fc6cc5f6729d576ff63d79f3d59ffb63af4')); - dbms_lob.append(buf, HEXTORAW('6713f70b0749ce314ed46009f236cc467f8a74271539b8622a98e8fad87cf9bafda7efa3cfafbeefe70c5985f7874a880ef6629224b0af48a2639515b93fd3bc929b2e54246493a8b8dc8b9f5548240148ef1f48404c90a1826282')); - dbms_lob.append(buf, HEXTORAW('8eefc18ca8b85e465257d1f70367cde518c85d15df9957aaadd4b225f3bf5f7ba852ad738eeceb9e4fb546d57df75823b1627e93781f2697282378a657a2cc10f811f15ef95179cb8d1b95fae2df2f76795a334e4543370dde0aab')); - dbms_lob.append(buf, HEXTORAW('0c49d0d20d9dbf8f9024997063fdb32a8f54b479cadb222a49fb8b09888fb3cb330089b0a31b300aa1ec71376cc9335b9ea85ca839d10bffbcf05b4d699b9fd4a676c719fa5566a5aed9bf7382a7d0464520a13eb648076d12a707')); - dbms_lob.append(buf, HEXTORAW('6dd06411ef64cccca2003645c74904ffd2016dde2e990d82fcbdf3456a8fed0dd02b64ddb9b131b0d15d2c7419a0e7cb6924547163b9846a4f8cdbaed638830a4b753504936d510139b836ffb06ec22fe729f5e9c2e7c63eab0fbe')); - dbms_lob.append(buf, HEXTORAW('a29f374ddfbad50c8ce2059853ee6ba02420acb222b7533ae0c84d57a83ef860a2b4ed71e9dbe31b138e5cf433bdbf87f48a707eae7ac435801e909675836bb4af51b3f6a2330f8c435280d51fb3b999752675e103799ddae89be4')); - dbms_lob.append(buf, HEXTORAW('a04d45812abf4d2f7a7fe53b9553b76ace7a5c8d8f073e3345cfd19b9b8ab7bc82f90848f7cd9cfa5cfc0e022d397a72df65151508728548d247f556e4c12f09b3efe0a27e9ee8033a825030be3ceff3e877ba8e739ae1b9cc796b')); - dbms_lob.append(buf, HEXTORAW('bc8bbf9ef9ed2f33f5f63ee9c4abc2ba9f529cd2b9996bde962aa96405a5628c9a8d7734fb69602023e8c137e3f8efef76eb0acdbbeae73e0bc1e0708439158822b774b23d918d4fe476e3004d4a5db2c8ffde1e98b4fd5504845a')); - dbms_lob.append(buf, HEXTORAW('9e01c4c971a0a1e8d3c68c37be6ffd76c3603797cbf2b1f3cffc5a4fd4fe9ddb4f6b7d8d52a91bd31a1e7c6d8267e52bb8e5527a73dab88263080a20923688eeb0310c807f44925adc496d1063d9ebca2cb01d0dd00b33a112a933')); - dbms_lob.append(buf, HEXTORAW('b633402f281dfe94ed0c240c26a8b9e63e11a782036fdd0b2bce1f3f5e7fb6664f757da991de1c2f6fb9bd085e7b4c38289e000759710f4088f864ece500411190c61c31447be67ce9c001a1f26da802bc19181b3a0a9880647aff')); - dbms_lob.append(buf, HEXTORAW('1e5aa2d48a090b3bfeae39bd8c9cc31f3a42738c29dfa674ce3cc883d360cdc0bdc99c43b24158d690d34560c474ae0b96a6ce993ef871a516749a346d16fc838880b29b33248a22230bc76c1d225e866d1aa492a29c4a24c9615e')); - dbms_lob.append(buf, HEXTORAW('1d92348860900461a3df9bdfdddb643fa8d9de2e7b2a45c4f3d058699c873e7de730eecfc5effaefe545a5eb5c09a6ded0c68fcf3956a926630e1873c9ab985ff70bf873c7d9e8e79a3ef63d4b94017161858919d6b2fb4ad7ace9')); - dbms_lob.append(buf, HEXTORAW('a0d46739cfddf736dc99652a1e628828ae83bf13314ce4cd86efcbaa404884acc222d5556feffc246f7bda0612d078e061f4a54d041b9c757b7480e88363cbaaf5376cb953a9af7f7b7d7aafdb35c77aceda7b5e772732a22274bf')); - dbms_lob.append(buf, HEXTORAW('a7d9b00df44ea6834e6283c857d103dab910bafc885797bf1dbafd6ce0e92eee0b639c5e5dabe3b395085d39fa725cd9c2b621c6a96cdf389d78fc2adfeb971ed3edd2fc117ed18fe9f4b33de3b439aec43ce714e747f7205fd274')); - dbms_lob.append(buf, HEXTORAW('4eedfc2ca586bcf5e4b12ee7557e4969334a0ee79338b07198632689438aee14e8465e56a40b26880d54253931aaa419d078dde27ab68190aa04ebcf3da88b9b6fea553a48a91f6f1fdcf08695fab719654dc68fdb06eed8f717b6')); - dbms_lob.append(buf, HEXTORAW('0c87be07e28fbc362227ecb541551e51b160cb1d4a4ddffccdb01fe0564b121707ea617ed87b4710661949ce8443d828a48ebd4ada88b2bd9079701b3022672149b3bd909f13a0d377e8bbd0381ff28e9fe6a13c2ed9e60ffb7e74')); - dbms_lob.append(buf, HEXTORAW('d84c2d01977f5cf2c44f676cd39611463f823eed2fd3e7f5bf6d1b5fd9d8b2e3dca49f5faf7e7bc163e4464dde700fc4c6e5b6d280b204acaa123611b2f1c9f991f358fdf6574b20d4228921ab08f2d00787c91c838dbe9efaaa05')); - dbms_lob.append(buf, HEXTORAW('95ebdcfb167d31eda9a9f594aafb75a3bb7f395f73108d1b3f78821bd1bec0ea5c3bcbf3cc0ce08a624bc0317824099fe49005afaba190689a52ea942491a8413608728bed847a1bac3a4b5a235a7036901c46727c0aa9a0308b42')); - dbms_lob.append(buf, HEXTORAW('72c809901ca4089e2bb2c006e5e00af62e19eb1927249e67033dd20000800049444154caa3ca87ba1b66f26923af7976ad3e60af1c72f658f7ca91ce264ebb4e1b8674bc50a530c188338646fb58d7e44dc48483bc73c8ff9d4478')); - dbms_lob.append(buf, HEXTORAW('e2446df4893050cc49508b18c01274d8db9792734813bc92f95b4a5cafa0351f2cbbed3bcdb1ef5fdaaef258cdf18756a76c6af140c267640077d8e0c6aea0dc5f6bc87622243de4e05af3e2d2b1a3f4fcfcfef2d46f669c675092')); - dbms_lob.append(buf, HEXTORAW('0a8f732441a2209bc756a8b64a496585dfd96b8d5454940e9ceaa5d07c1600d2c12de6b7da12c68eb608609e80384f1cf1770e27a0f3260c988bbfebdf0fb832eb3e37f757bd48c3b6dddcacce4111e46cd3622fce0cf38c00491d')); - dbms_lob.append(buf, HEXTORAW('fd8aec8affb9b68ed175deebf2689a3ec78e99f1d41f88df609514f601bba5cff3f6e93b9542526155ad34a2c3fbca2779d86a3bdbdf4402e11636806a4f578d07840e95bd2f28bf3d71a4ad0d242f91a20c7d20fdfbcb5bc7eeab')); - dbms_lob.append(buf, HEXTORAW('0fa403078f3e671f2d994c58bbe01d3d7155232b07accc8c7b26710c4111ef170644bcdba8617ebada662deeea46bc3b594e17f42982381bf76db366368f5346bcb7445c697f6f847a825af10923de7db5e8af412df9b037925e2f')); - dbms_lob.append(buf, HEXTORAW('3a1a97e3196740647ee59d95735c4e7c79f8b7b69f6a517b48a727b27a757175bddf1d3313077cf1b3800840db8a0379abd1faaba263007301efc6f51420380d1001826ee548b75520c2bc92ea7b50e01445e2eee046a29aea24b1')); - dbms_lob.append(buf, HEXTORAW('502df5aa8f00c1f9961f65a04b10d79eb5aceb86054a7df7e2db9b2fefa5d4fa352b8e7a70a6be765ce5a7cbae49f010b94e6d451910bceb08dfabe2f48a6c37427bdac0af5f183e09cf072165c9830e28cc13a9a64ae877ec2bf2')); - dbms_lob.append(buf, HEXTORAW('6ea3e492151f1a58f92f406494a00c13d2bb67bb258b5dddc20670a09c5166b3719e22b8697dd0f94292ab1b883772c1ab678eeaa67f3bbaacdfa433a3fb26610479dc3e8d3e554690d33950d9a5a2b4d82d0075f382673fff4ca9')); - dbms_lob.append(buf, HEXTORAW('a1673f7ddb9d13955a78c2d4cf0bb19e4b4cc873ccdb4d7abd615f9420854929e277caaec3f8b1ee99612209846c4f36607fff9455affd5d2410d9e88550471ad60ba584570ccd83036f12f2f776b061aa36eb491eb4e93d97822f')); - dbms_lob.append(buf, HEXTORAW('da326dee143df16b2e583a6aa4a6f08df25a6eae5d5ba9f409355f3bf860cd096cb55a44d34147d8a869227fef0a8878efa9aec1184d2470402dee6dd43236c917a9667896157d5b2dd1a076322250f31149df097c5b4fd4aceec3')); - dbms_lob.append(buf, HEXTORAW('11efa62f22deadb7e9efe0847aa296791f964c2ec2fb7922dee3bca32ec2fdc668fe86ba0ff72170922d5634ce0ce051b82eda776654f67625855537169eeda6f11e7dfec0d00b6f6882317bf449938bdce8d8e2a94593cd2da5f0')); - dbms_lob.append(buf, HEXTORAW('6ba70d41b078898145308e93bb28110cf63a815b6f296c60954702526a121ce894a2c141ca0d07a938f88db6b751ce029258f03e9cc0330c084e922bc7e8755a5e5a3ada4de9535038337f9e269c4bface6efa8996c49aefdbfa81')); - dbms_lob.append(buf, HEXTORAW('ba75f4fa1c5cf3b5435c770fcdc9227bf56a3c0b91ca58477db8f67cf47b6dbc66f5e73ff4556a5eebf133c693919b2295895060be8a6f01a448f25c5cf7878144402ae840fad9c02a404a5144df5eda1afe360de9cef97cb10133')); - dbms_lob.append(buf, HEXTORAW('00c1a038b6ffbeaa82aa37dcefdca6d9d1fb86f4795173459dae5d5c964f4690d3faef09c983ec323817b6feb461c9af8d94faeaeb37521ed18469ca355f7d39493fb7b8ffe69fb69888320e842d39d4c0adc420cdf542fa7e25fb')); - dbms_lob.append(buf, HEXTORAW('e0bec30d2c0781af4837d0976d370c4836a2016a079bb5a337eea1661b40eebe246a5af0b60941824a79c4c0d454c0470d4c433d87f4d30dac09d1ad065255d4d222e9be3533af6dd64ca943ea865b5ea245c17aa58d979fad3772')); - dbms_lob.append(buf, HEXTORAW('e8b494468d1ac586e24b72689b842c7a81a060933517630dc78f3ace3bc6abf2e923543e03d0ef095584ed353afb8cd0d20d508948f21ccad66ac6b51d11ca89555159f0fe998bf0b970e271563c593e73fd7abde7862ca9fc5e73')); - dbms_lob.append(buf, HEXTORAW('3c13bffde2beafee556add172b6edd0486a092b2b5922449ba5be2f8c8dd561c783e9dbc4c578d03af02aa1ae6bc84ad43eacaf980dfd9063cec9e1e31209403089543da1106a6c206920e5d37adcb1ac8fd54e309a5da1d7542d7')); - dbms_lob.append(buf, HEXTORAW('767f2a95f951c70e376a0258ebd8ba634f7d34faac309543c0b3c3e6d9e6e985f7fc7ac7f35ab298d26944d308c6c1b643d88e8a88a3c5a147d97437dd81eb288219f3cbba7472772677580ca1fa69c0ff5e8dbd3ce93be1fba588')); - dbms_lob.append(buf, HEXTORAW('f3c44da514ae77e9afffd292579b4b8e29ffa98bf265809049294b4ed9faeb6fcd959a3f67e2ad6e4dfe9fed2ffe37f37c838f032729ee4dda38608ba11c63ec05777c62c8650828be895457e40587f54e8cf6ceaffbbfab04422d')); - dbms_lob.append(buf, HEXTORAW('02980748bae602c00cc031dedb7c015e8bbdd7b9c9efa2504b365b2b364c2bba58a9c54533c64ed3a2e4c24953d33fd194bfc63575be993f5f2f9aaf6b2d4e75bdbbaad2fa367373f9740bbdef12262b56f02a7aa0ca5adc49dd6c')); - dbms_lob.append(buf, HEXTORAW('65c47bb6a8a827d377e724cbbaeaf54f8fab999d386d7d6c9c1918675e140645bc537a78789b390f54ce710f9c4d9bd67ce88af4f39f9db4e103cd517ddbeeed7fbf5da5d46f23274d706d50c5f3b78c22b75b3606524a05e45422')); - dbms_lob.append(buf, HEXTORAW('d19b75b9e455026f124ea141de2564cc953a7910204a26c77106bb9b70502bf0e225ee9374ee1671a739e2f964d4cc0324ce30434bcc2b962e700b282d7c79f2f831eef8dba84b7fd0eb719f679a5c72e0937a5dfe9036bba5cb28')); - dbms_lob.append(buf, HEXTORAW('15eaa767c6b0cea933aeebeb5a32db327cdda68d4836c8f34e11cba433271d3ba57ea182437410891421aca2c230399ec29613b297b488b7cb2c19be1f7d4797d014b69f7dc9a61795ea58e7f4f3720bf48fedd40375bac6f65fc9')); - dbms_lob.append(buf, HEXTORAW('595bef9bac25d0df474c1bdc5f9f2f5ffcf6e2b9eef42c1b38ffee15a4faa3c03fcae54569efc93984e26bc0301161a78c00e49e5b2ee23b2a64ca161161ee0b8c2d48381bdbd1feee12886c1103e23f6814e2779248429048524e')); - dbms_lob.append(buf, HEXTORAW('319038bd347cb0741c3c35e07e980e512f1d1c60da63dedfd3c66b1cb7a53f525373846daee8d4b1dd4aa59a6f6d5d7292e66c6bf5ae5bd1467368e967d6ce3d584b2e2993537aed333d36aa6a4b0e739062b22724073b201ea08f')); - dbms_lob.append(buf, HEXTORAW('90246cafe42025891d4d0f5f59a762999b5caf7c63c9d9cbaf576a73cd75bfcc7b4d6fa06eb38e9a3849138c777e3e72d122b75a5fc585c499929fbf2f771179d151d237923c90f48db2e6b22421385ff23e61ef128a3778d00b2b')); - dbms_lob.append(buf, HEXTORAW('4d3a4acef2bcc70847508b18c0ebf566035390543024d667eaa906b2e44ceb1212740d482ae990506a6e56aad5c8c31ecc385ac38687f4f9b726dcb5ebd5df98b55aa95187bcdae83170d0243190ff3f49763eef35106e8eb30107')); - dbms_lob.append(buf, HEXTORAW('2c250ff66e0c1b1058437b2f6b7c9ea0cf1a0e30daa9a719983e41a92b3eed3bb34f58cfc5a4cacb5c82baa4e79cab7fd0d78f3b20ff8e25b061d1f723092605f888a160db2e24058ec711927711050eca887eec2319cfe4abef21')); - dbms_lob.append(buf, HEXTORAW('bc0b77ddf7dadb0808b5880124724a5581057745df02000746aaaef4cf0de40dfb98b7cff0746f5f6ef45470c6295a826970e2bee3ea7753aad1c21637367e45e33ca3d6e3759ed6b071cdc1aecd25f5fbf4776b3ea52f1e6ff572')); - dbms_lob.append(buf, HEXTORAW('c76b7550b746399d4354dba859f432abab7551ec552963b16e207fea32ef64982bace1dc37ff759f32cba8b3155d8ed665e63e67ae7393bb80ca37960e71dd5dcb528abbbbbaefd2014583dc0364cdf5cb2e5ff789521b5baecad8')); - dbms_lob.append(buf, HEXTORAW('2a74da94fe9923834564af8f7090682e52d33001211d3b1112e2a888609ce8859cb2a2b3173fe73a42dd0e075e447f19e1902d6200a9b6422028ccf08090f03ac5fa4c23c687080741acbb1ab0f1a4c3af3f158c133150d4e8fbc8')); - dbms_lob.append(buf, HEXTORAW('14179cda0384830f2c541094f3cd1c2d4920d20d746f6fb601fc9d08d2f7014c032171558c513801f04903ebd4c175743ee07b90ea9d244e522d717c0649e8c438a14fce419260f07d54d783548b58f755c22964d713fabd958050')); - dbms_lob.append(buf, HEXTORAW('8b182009090770914e9308c9615e980aa3136f5810102610c419c21b2c6dbcb89e16c8a780500d50adec9493bdcf67db4d8e183771a8648cede07bd33ddb8840d8807410531d1778b3c46735755ba5486227e377e401560e6f114e')); - dbms_lob.append(buf, HEXTORAW('a34e816de5debe8c33e09c5522c29973fc8401ff6ac2211b9531803157ae4f863f1ac89209ad37b10e99a010a7fb88170fad2b960c313fe542d7cec91331efacc292849a525e8481f71f2279700b1bc03657fcecfb2ec4809e2e2')); - dbms_lob.append(buf, HEXTORAW('0be43ad5ab88e248f142f5e22bc559280906a8b54b4987fb271c81c60fc5dc8c64784ddf1becfeeb34da5ee6a847bb8850d70002deadb06b20a031bd5c142a882c4e0c0cba10a1fb8121f9c3e7c05e627053ac854b88fb24a8c08')); - dbms_lob.append(buf, HEXTORAW('0844fe14480129901a52f03b4b4404a9c200f02ae0b5268b7e8edaa38d0f5c8ccbc1387cb98928fd33057ade893ede9b0f7ae26045c05605d5c87e0f7d72b3edec85952778f155e17747a8529c30a074c70d277ccdbfaed1b84c1')); - dbms_lob.append(buf, HEXTORAW('21d5515419fd627cd33b95b82e1a0f5c9f34db5ac6104a7832705de3accb0a02f8da7155059955344f9d180142f83038c395a1c74be38193bc13beecd2d6200c789d0814f8498246e3a1fb01e2d48060ae7818244920a15217f0f')); - dbms_lob.append(buf, HEXTORAW('c22308884c1e4b92067de732b87f57e2fb5491c41110b0b9fb0907b5bd5d02912d6c803701b38a25b9830eda221db4e0fc885320af2e3af049224911a26c2a9449a4db4cbd15fd1f12e36742421208cdff58316e15f01ebbba450')); - dbms_lob.append(buf, HEXTORAW('ce085269a2f8218aa21592783d36dcbfa0d32bbb2c87e5b3113f0bfdeeb181f491a528516c469ed2d075bd800e9ad25555c969464c9b607c2429c700a189a1470c8b46e99e31591d8940edd2721922e9e0e2a996c0fe3fec7491e')); - dbms_lob.append(buf, HEXTORAW('b2850d604984f62bbe0b7d8f14712e30630915177d0fb68111a3400484f60b7d0f620cc43e621522ed071167238de37bce1b6e6f9740648b18c0eb1b134c924915fcf45955441f000739492895d8a02910f52b2142a6c08d2e045')); - dbms_lob.append(buf, HEXTORAW('13f85206d6c10a0907033e603812412aac468893ec511900d049ca1daa2764f23fc22e7933c881d3c9fbc6d48b75a0509c58db78942704a7cf0904a8b36c828f13b119883c47d64fcc30672285755588c8fc6bbb7e9e223063861')); - dbms_lob.append(buf, HEXTORAW('0359720624826991bb2511568af8a66478a8049882f52955a5167e575049b16e1c2a2b2e814a121d491cf83bcfab7003dd6be679475bc4009644b07fc98b939d08305f0adfc3c139e040b2e3ef019b8682ad89093a9c45f87b200')); - dbms_lob.append(buf, HEXTORAW('ea70ae70a13187c47a74a3c5fdaf8a497d56e6fff3402225bd800aaf5ab1090a668e32020870eee2a3ad049e70ee36e08128b850867f2e70f81530b216297bc6bacb3c47d504d8540182c04c4b1044204060190aa55d237db3ded')); - dbms_lob.append(buf, HEXTORAW('2a2f245520135ad88eaa28e00a91d75517a08f886cb6912010902280abe0865d05c25c85646f74305204b783bfb304d45d8c8772544112dadbe20eb8450ce0f5490736a93a6c40bca745019158375520ec15f062e3f586804cb6a')); - dbms_lob.append(buf, HEXTORAW('521a2994a94b21304d9b41aa28fefc811fa34aede025fbeb76fd1efddd5ded9f03e5c039c20924a2a042ad33aacc2fb32e389b80e0bb63c5215f2bc50013cda0fcf7a9f47dfc181130947f45366030a80a5d2ca14584deb251cfc')); - dbms_lob.append(buf, HEXTORAW('6abbb7fdd3090835923810c8c6120a1d40c268cc111644f1b1404254a43e823eb295b24a0cbae310227759f4c586b6f6f1f65975015b8005dd342db4bfac8150d2c1c32a2c44ca3acb00893382379583dad3cc61e1c0639d3e717')); - dbms_lob.append(buf, HEXTORAW('0c4e92215066f20da50b6f7b9ccf1ae12e39c539d97d90b1abd876d00af4ffa0f312f746054e180b3d60082f072f4f379e2394845e280602892ec40c09930930414c1dfc1f8d07ae7030b0c183340bb5be5ba9b9a430cdd50f13b')); - dbms_lob.append(buf, HEXTORAW('1110aa4bd453dc88f7ad0aa3ff27fab061f077682beea3752f55502471df0848eb9fbe3fe2d75456c2d7f80bda3fcd06b2b32d62007f781b7dd2855adebf87a81f4a7c1dd93aa48d435ec73a57e2ec68c1ee6123ba6cbe5c4680b')); - dbms_lob.append(buf, HEXTORAW('2029f34daf1df49f5618bdf855717a5a2f1d95c8274bb76c038edc057f967b48801bc2e88e3c7c1266d68bcaee43a0a27c61bf8f7b0c06f0bbcd4efa312b748c038f65093ebd4f777a9b2a5835dda12e8ba1cef7581f31b09788e')); - dbms_lob.append(buf, HEXTORAW('7cbe7c0e8d23c9b8fffaf6ff8b0492acd906c885604963b72d206d1821babb3aed86afeeb74fe854a58e79ec8cad75ce56aac9432d3bee73ae52b50bebdd55e75a4d5c5aa62c8e1ad95e77d2d4f59a6b79d3f9dc72259d03f4fd8')); - dbms_lob.append(buf, HEXTORAW('6e3eb15e55c56eb63d88ec30d4700759b35573c759ea77bba7a31faeb8b94e1c7fcdd5ac8d79bfbc9b1e0e618e668ffead0b7ee73ad5be80a15e59cac2f4365d1837d95bacf95204a5a16854ade556a43fecabe9bef506af2daaf9')); - dbms_lob.append(buf, HEXTORAW('f7253962cf978eebc0a18731dd8867c2534c92b8e6c1e82c028499068e30a6f1696182defef7bad6a2ba8850d600905ebce92bf538b00ca830bd7cb1441ded05215637c88513a3576dff1cf743ba2865e59077538eccb7afb2a556')); - dbms_lob.append(buf, HEXTORAW('765fdd13517b96aafaab91e4276b1732dd5d97055b34e4b6768743ddfa6c0675bd138796b8142bcbc65e4dc5e588737a1aff8efbfc5bf8a55687e2fdfafec4cd7bd7bc584df5fdbfca552e353beb8329a2961e1daf57c109fe69d17')); - dbms_lob.append(buf, HEXTORAW('6654e81c0474e065c5eb16467207c673ae8d4ff3d4c7fb3bafdf20afa8b04ad898c0fce5aaa9eab6ff5f2510da7824b286016dfc2e378e15fbfd3ceb9661753541c8fad709bf759dacd75c4afab747eb051bea9ff2d8e1b7ea6bda8')); - dbms_lob.append(buf, HEXTORAW('5de6ef387eebf199ad8c20d5cb454dfa85153e696c253e372e750295b332a99bb4a449cc7e1c3a8ab9d0bcb06be1ce08b005f0ef045043e1bbd20fed2db7e503fb85e3d55af55951716ba2e8f95df2db84ca9d29e45ddbed71bf9f7')); - dbms_lob.append(buf, HEXTORAW('3b674e1b79b75279231ece5f4a2a32d2bd1361116ea7acfaa2be9080b84fa27d77efdffffe1b71275b18d03680d76f90244d90eed7fd6b073e795c132d11b6fcad4df7cbf4ba0df54abdaffd0d1a8e0f75683b58c39b42b96d96b96')); - dbms_lob.append(buf, HEXTORAW('a1c6b79e368a4bf35c60d70d4abc53c2556d1b20f9e6146c5b9d7c4bab2d1ef233224d8de0a7efa5f83bf8fafefc527332e387a5968c6c4395b9db3e5680d5fad4a29cc74d54b1583172c50aae2ea8aeb16bca9d4cae282db3fdfa')); - dbms_lob.append(buf, HEXTORAW('8d41ba3ee9ee7964c2e1eb7e54d760f172a26b91e7deb8f246e257ecff6e2f349d461b597b6ffdf0808057291712b82be543de925fadf55cfddbaef6b4a35bd63ff79975ca209c592d48fcf9be94a25a1f1c70c77f977ab221a21d')); - dbms_lob.append(buf, HEXTORAW('c412e6c2f7f973449219a950fdfb08b387715369e0f9f02be08f07937640ef7e7603c1d802f022c1e3e3330d58a4c918292b51a5ff5084950d31bdbe5b02a4696771fa30ffa0d9fad9efdde337a037f78d7a4e123945a73c31fe75')); - dbms_lob.append(buf, HEXTORAW('4483752f2d6a20d4c8183bd459f8cbfa4331692c83f4e32b10d88cbf86afac4f044445fc3bbde7cf78dc30ed392f0c6fa4f5caa097b4af394a74fd39cb9f57ba8c6a1435d75acd5075e5c8610f8bf7bd8e016a97682d6ab9584214')); - dbms_lob.append(buf, HEXTORAW('9ca580510a25dc5f0a039eb9c27d7eaf7aff8b1ecc2715a02d9dc6ebdfd4547a53ebff895ab467dadd4ac93c73d568cf828197f210b8871802b412240d2fddc06c41bec7debf39f4e40c206f0d224c98308c9c54ad56dd3e04bd76')); - dbms_lob.append(buf, HEXTORAW('ffee606afdc75c64f4aa57d5ef38a1b87e88d7549e8a6d3ddc8f453acb1513f7b5ae8b69018628423d9c11fc67d3646b3472486c05c5882d3f3718e010470473768b2567955e569f335c15e75d992268fe979eff7758f15a3e00e')); - dbms_lob.append(buf, HEXTORAW('e9cbf143fef244382820eb65031d383b54495d7618fdbd5d32891840465d5ecf7184e2922beefdb46e5da55abf78e491572f8d265d2cca6da599a3f3436f1cea26b16482c0c93e693d58e887d10f627c4cdf7fd01b7cb1c264169')); - dbms_lob.append(buf, HEXTORAW('ee2c1c77d99955ae480f311b01dcd26bd83cdc972c66efa424bd02d8b370fbb5da9826b66a5bf71b9667826ddfdf81ca485e7754801b314f84a714b24d190242d55b6c2b6e7b3e94576e60d7667fba712908801be1427cd946a92')); - dbms_lob.append(buf, HEXTORAW('d3b224454b14d77ef2d4c8f3ffa509c62b356add73affe5be75051c78edba12aa2e4871d5073dcc6c1df67070ffe7c98d02fe23a1c11735da0c460035fe2833f1f7fbf88379e8dbf6e2f2769eecb0781bc08efb98b3668502bbfa')); - dbms_lob.append(buf, HEXTORAW('cece1896728b5f8fa5f8f7f3455a9d786ddf1d464533d3d963c6eb4e8534022a9c468a312874884c3c6efb451c3bb7efcbbb4850d905e4e1679611da2d4559ff57dbc4103a50e98d86ed04d599a607c98fae9ad6ee5bcabad798d')); - dbms_lob.append(buf, HEXTORAW('676d839190ebcbf2fa545583f1d9397cbc7eab8dbfba8484f027dc6f3bdc5cd5983ef8cb524be67eadcf8d82b1b39bbd709e5e9f9fde71e1346495e688fe208687080af5a5ad4f12149f71ebefd252feea01eca21636804b8912c')); - dbms_lob.append(buf, HEXTORAW('c34d05549ddf29ffedf645eadd48925e71dffec417a832d4febf7886b2cfbb7b5a079f3b8859821544516a735370b310f7fa1c24d362c297d50f64a9686f5951a1584240fcfedaaea98ebf0774b6c1c2a8599419c19927767066c')); - dbms_lob.append(buf, HEXTORAW('a0ae286d4b7d4b96c6c5719421383fcc597464f1e3eecaf8bbe33d88c02acfbc64c630ec4c4bf9352567ff2b946a5cd062f9a5f3943a36e5ac4eee86fab1eba7fb4cd31cb433c35948df990237991050c1201a4944f40bc4ef79e')); - dbms_lob.append(buf, HEXTORAW('2f7825df106bba0d906706967eaebf768f8e4bea342b728d5ebcbb786e4dea954a3b1cd6b7d76ae9e8bd2948e679fad5c9373ddda37c57d97d8411cc5a2bf5e0f6033fd08fa19fcdd33cc7d62fd5329d70c71d05b027f21f0c54a')); - dbms_lob.append(buf, HEXTORAW('387bf031639519b0bf72846a3693f1e761fc1918ffb6c71b542f6747d7a9e56ae5f4fa74529bb63e4dafcf035ad4bee24da5b29b77ef79f0294a8d9ef9e19bdf2070308400d910dcf42939236708a09185f1bb0d18f1fe9dbf3fa')); - dbms_lob.append(buf, HEXTORAW('efbdbaccfbd9e80840d084c09a1e11d33dfbdafb3e654eb5cdfe0eee1ada21b605ce793a20bc9f0b3969018620b3d8267781762064b20c6d9f622e6e423c0e73df8f37c12430f8cd13c9708d61cfcbd13fe4ea27b266d742131f4')); - dbms_lob.append(buf, HEXTORAW('10124321e333ef910fefabaee63d59b2caf4a9206ce0cbf08cbb5010c07cd411e96af5c3dd1909e7656737a86c6e253e8db9e69175da9cd852a9cef75e30a8ed754a2dfa78e6033f0c526ac386d55f539d0acae1c592751e600ee')); - dbms_lob.append(buf, HEXTORAW('3327fcef3f6a5fbe45f5e492f62001f1c790684f44a68f7c1b193dc142657edd337edf5e7dc3203a9a7f72ed07f6c667d56c7b576c56ae0dbd19b32a85e4c1023216aec5b98bd0ca1eacc14eb97189f1c5ccf12297f77c2efc547')); - dbms_lob.append(buf, HEXTORAW('0c490fb91f02c6dbc3871ffd80751a63d4c47859f58afd45e3e78af63bd6ac284e95ba5f7a797b2df9e5fcef92ff1e778f52f54e6e3479da614acd1b3671e566646ab010c82cbd3bb9767e2efa79e8033221e983df6dc0c84e8d7')); - dbms_lob.append(buf, HEXTORAW('c17b4d05f3d801d6c949204594de9bc706d19b73df2c6191d224add97f9e1d0f73fd007cf05b53ff9de55750c745e77bda29c5ecad41e478deeb85ae261f33b6a18a3c6b4fe48a6e6346a8aab21a8817c3a6aa2f752de5ae8ed4d')); - dbms_lob.append(buf, HEXTORAW('9f6b8ca346b5ea8d38d608d730bf49e0cbc275a8796daee71ae543ccf50ed76a1735d01df47be33dbaa3e42ee313b5cb8770adf230f0f5f68cdbc17b50adedee2a2b1ebf9e97dede7911f340b5d667735cef2e69b5dfadfbfad95')); - dbms_lob.append(buf, HEXTORAW('395ea79cc8ba3bfd51cf74dfd5f38edac2bf137e41eaa81ca93e95f1898b6dec054144c0a217b72086e99e4c0cca49502fbf6df9523df46cbf23e979d3a9a29d5e681a36e4bd59cedddbf0ebaf1c2214a5d70e8ed874cd5479e75')); - dbms_lob.append(buf, HEXTORAW('56e8f91e4be2d703d5e446dfc1fa89d5d837eb275663ff265c87f5c9b5ec69bd9aef68cb9adf8caf3fae33d747047ec2d75eaca3a0f112fe64e395fb4baed370d078057e1bfbaf373b39ef92759a3ebf66a9cbb076ce38effed18')); - dbms_lob.append(buf, HEXTORAW('d94ead3e1d3d7fbeaef9873f1251f1c8075596ba28135871958a38b81692d0d4c81a332650de7dc667806c78bd13afdcb020bf73209842936118eba0686f446baabf3c0963d0af4c7685efbae2f57eabfadb5aa5c6f1375b6becd')); - dbms_lob.append(buf, HEXTORAW('3d286e47edf02755cde84d61d82ea68063a2f4003670f7e1eac6d1bfe88f66fa5df1f96e578703df6ce03335c5fb015327d442b7717d0c5f07e0335503baa27f3bfa7d703dd556ef072f2aa8b814d56a1fc9e30e47fb11f4495ee')); - dbms_lob.append(buf, HEXTORAW('9ae4c65e5662cf866e2b961e0234e54011fbd6d27e06b0a7c9d80af03f0d14c29efbc900a0ff78fc47bc4f0992765ee24c787163a2074627d2d8934fa7ebfaa73de53aac1a9cd668fd75f76f6e4f1456bb04e426464a6f5b22f6e')); - dbms_lob.append(buf, HEXTORAW('46640c4b1a1429938b3ebd214936f9bb62c4095a18cf856d87eac0b892c6058d6fcfa8a3bfd0491f759f32448f2ff58dd49ef7df161d5b8b669ae0591fd17a404dee91b09da146b75ec7a8814f5e785091d27aea84fb6df45932c')); - dbms_lob.append(buf, HEXTORAW('177cba4f5eaabf94df88a701df934d6c175a6df83d79b771d058cd742cd7e9564bc8c8ff717fa7d766cbc711611acd35d23415b2badba692ddc9a2db59a1c75a6526df38f742e7d4da903b6b6fdcf2f8d959aee7c3ff44f387db0')); - dbms_lob.append(buf, HEXTORAW('aa8b522b916deb1903391b32358a8807c9f3852314ecccc8b7a7ed25048408076f383a2034a776d71b03e7dfad45c69473d256bfb0c188e42197f796222de9fc5192551f70fd8035c35c87855318647b80086c4304865fbaa6fe51')); - dbms_lob.append(buf, HEXTORAW('c1d29ae253e598bff7205d3089f401b6873e166aabab6812ee043699305e7eac075f4c34cff08c7b2497ae9d82f708c7bf07eb8c7d3699009df94861dc97aa03a9ea504215219d120a770d2189aab8f4939a3cdb6245a69eb9d11')); - dbms_lob.append(buf, HEXTORAW('51fce1b0e0e8f0f875cc0020302dd7bdf15b8a9985707effd3bddc20648d5ab9bb9e0aafe8f0c6c74817eadfa873c3a7cb3be666668f529efab7895615ef4e22c43f6f4d73d241e2b3312f4bda5b139f6fd73cd75acea01fe242a2')); - dbms_lob.append(buf, HEXTORAW('e52a15a02bf5c5f36f0fb55509909c72b55b201ebdfa95fd5c4ad1d5ef665c95b6b3421dd7adba6d396680e7d53ceda110bde50aa746151e3959a23af9c59317bcb1dfafa6b9c196e6126eb736b7ff7bcb06aa70c4cff207a86e44')); - dbms_lob.append(buf, HEXTORAW('6d747d88c6fb7a9b8d0ace3ad9a35ced0f4f2f203569ca319df36fd8f7c60712ba5263f3beaad82025c43e75c8617fab265cb759a8bfb07a21f062cd8f9716fbb59bbfb013bd96c037c711a2ee1683af0bc871f76a58fd4c60f3d1')); - dbms_lob.append(buf, HEXTORAW('ce5b448b318c1bfa69fc307bf39e8fbf8bc3f22789ab91eb6072b99df3b0e7e2b76f00fc558c39e5163215a7d026c0ffeb88d2077601bff9a71260ba4ea6e3849cd9d780f7ee115e6ccaabaccdd90eb87fe79c8cc864aadbdffcfe')); - dbms_lob.append(buf, HEXTORAW('68bae526acda0a5c3ff68add4ea17ffe8b57a8de6a41eaaf9a4ab02aa734b83a1b58f566affd7db4e3ee86a7d70dfd8b2fdbf062bb54fc3c60ddbb5d3dfa379ca996ec9d5a4de31dde1b63c5446d4ef5c5b76c182579fd1b2e673a')); - dbms_lob.append(buf, HEXTORAW('daefbf89dc5e637aeb8478593088a8a87be825522f7d04e7bc3000fbf71c4009770fcdfd17d521bbea454cb21ad7f1ddd595ff366e8f9c30e57c1713a63b15ec25c02d936d761ddc6d6b19721925e81e85b7d183fed8b6daed7eac')); - dbms_lob.append(buf, HEXTORAW('61559b140432f0321f1c7dc7573dcacb745ef6f6a5ea80fc4e55f2e7a69b2e6c47f7de98733a6d6536aca41dfdc5290a7bfc5ad55abd84d5606f8496fa6480c663cd861647d2d9b1fd7bbdb7f0e5fa754bb538efefc0c2db9d679b9')); - dbms_lob.append(buf, HEXTORAW('41fdb6cbf5b778c03a3e5a386a17bb03fbda58d5d775fb5d7cc3ac7e776e51eae5336f3eea8b4de64fa5a2a433ad5b99769f0b49492fae3de65df87725206103a4ea216a146ff2ced737acd422fd41e9435efe4599051de524e4829')); - dbms_lob.append(buf, HEXTORAW('6073f1f5c66830c95077000a71cecf76e8e83ee4680d4ff7a321225c087bf061efc7410903b305ae28da982dc13e5b8c5bc946e28deb24673d4f3ea4c0c0dd784e0fbe683bff9596fa0d5d72f7d6333158612f53d387d3b6a8d539')); - dbms_lob.append(buf, HEXTORAW('6504a6fedb6167d5bd7ab7b8e52e7bcf2df3f4f3f5da956cb3bac38ab9652e9e7d6287439eaa407e02edaa0ce994e5d371071d8b503be385faf8fb1e3f31f5908555409d2c9134129439c0913124adf4f8404f1249c057567736e8')); - dbms_lob.append(buf, HEXTORAW('97202ae31f5dc26b74c724b1db71b74ecac51c7baf310fae9c48a040c90747725c9776e124662bbddc1b7bdbeaa1b572423c683189f8ac165cf6dbc4da985d7ce58f055b152931e1ff1cdc4a795fa6df5d4f6ab90ec4406e851813')); - dbms_lob.append(buf, HEXTORAW('2ae8f416eda14f7438444e654132d9e31dd2f2da37bdd7e4a759df7df534f0e6909e19e8ebf5ca8bf7bdaf1351a377a396e3e6cf1fe3bd99cb39c7a6e05ced923279c7ce3c74abd73fb031b23f81b5522a4daf55cd256961afecb0')); - dbms_lob.append(buf, HEXTORAW('8c9df558595678075b58121bdb16ebbf9cd87ceeba53fe8313526bcfd968abaf5b97f67cec812aaa23c293140273b4091c410d589c689dede833f99aa882410c6b773aa22bd308d57978c1cdf5e5591e58d1c77d63ac32af5425bb')); - dbms_lob.append(buf, HEXTORAW('4f59716233447fd66e3bbafed7fb752d3fb8c3ee237bd708bbedc34b518151a99c381f1984bcca25f8eaaec1528454b2537ddeb378f5957563c52a9a95bbf7d7c96e6a826ffe7ebefbed2a4b0ed9d47ffeaa67ea997d6e08ab6e331')); - dbms_lob.append(buf, HEXTORAW('0f99712a8e4ce1d5b593eec0d642abcc5561367ffee04f9b0cd704e48921bf4532ccdf9c568057011600ca248f74e05056541c48568f1d1991f2d999dcecb919a587eeefd68fc97eb1fb231fd5d0bffdc76a71da872ace6b891816')); - dbms_lob.append(buf, HEXTORAW('cc03ab8cb08e07324364bebf543d92043250ee0be0cf11f8c672df327d1fe1b0d1033ee10e2cc7db83fbe6793d0cbeaaa72af34a4a94fafd8c19ab877da1d4bbff7d70547f2d234fbef8ab4db3f58e5c5bb4a2ffe697cc83b9c4eb')); - dbms_lob.append(buf, HEXTORAW('5b80587f65afa30fa373199548461d8d72147a2ba3f5faa0171fc337013521da52b5614e895eafd35f1a3d7cde7e9a905df8d58523f4789a576436700309eb7769bae4e0befa2cda907242ad1be3e62373e70889b5c02a73d741d3')); - dbms_lob.append(buf, HEXTORAW('4ff77ff5d4a57a9fdcd430ebe71b949afbddcf43d7ac35d7500550525d39229e890904fd9e011801cc15fd5dd6fe6e1248c400aee075b35237747b3ebfcd377a6237363a61d299fac7bbadd16e52c26d04fc4989c136d7414240dc')); - dbms_lob.append(buf, HEXTORAW('86255545317c36ee4ec68199fbbb5b9068a80c545289c106be3eb8cef31ebe1c41313ffd3e786ed833ee0055515593aacfcaba2935eadc7787f4bb47a909977d3e7c3e361e979a254e9b2ad1d1ef540f850a3f550a48e9d9856e96')); - dbms_lob.append(buf, HEXTORAW('393a8c9c0b6dfda8d48513ee687d8216cd8f59dae53f7777d2bf2d4d9d58bb9f0a5425ee74c4fb18157109c1f7bd06e75ead8fb8e127bf9e311df51a88a32b46019f12a4d12f433d06aa155e81b4e795548f4170b6d59644220690')); - dbms_lob.append(buf, HEXTORAW('249d728896a47f7a77c8bd5a024a599f7afc238f6c53d20d9b5f452068966138b4bc9a4cf235f8aa8d9fefc377f1ae2f9f4a96f0fb23c84dbf8feeeb795bfee7c21a63341c76efab5b3f5daffb072e6cbcfe7083992bf15124b728')); - dbms_lob.append(buf, HEXTORAW('6d2cd723d50ce7f54b017bb2467eb28c0311037c9549e3d66d14ea03bec109cd9ad49ea8d4d5573e3ae1cac54ab5dcd26659f7598a3520bb4a82aea85f3ee68f3fb424b2f48153bacf566a9e3de9df2b5698bf95922a966aa6a3e4')); - dbms_lob.append(buf, HEXTORAW('73b9a8f4292b17d2fbeffa54297f17021236800f20fdff13979edf387d9852c7adec963e417314d69fd6931d37051f983e559114356163d0c73d490c73e39f99f4e0f7e3b381af0ff04580af7a07bf24803652a3f44132c5edddf8')); - dbms_lob.append(buf, HEXTORAW('42b73de3a631cdf2ee52ea93c6cfdd3b1aaa18b92159c280ae953938ba4e88ca95e00cf94015aa81f8f89b28c406e492c07a639ef5cd75271fae0f9070db8b173ea32593d0d050abf474153bb0923306dbd5b65ebfe9a969cf2af5')); - dbms_lob.append(buf, HEXTORAW('50dd6e5fdd081b4411fc758aef01446d71d2359752adf0190656a07ec3769776b50de075ad19a2ff1df97a8dec0b94aa19aab5e05b577576b26523550e1152dcc5eb2c12fd5dda32068070f4c43af6ad273ee83df892aab8c216249')); - dbms_lob.append(buf, HEXTORAW('0c07d66630e128e57e29f7ac2b757bff186261ca7f55f376e9cb9900e7c5e8fb40e2149706df072efdfe977b20d708964590a99321088e49c7c70d29b813521776e82b2c22895aaa512c22ebca2cb83a373f4fd879f9c73c15dc7e8')); - dbms_lob.append(buf, HEXTORAW('7b4f0dadaf556bd71192ad6f6dec3646afaf87e69cbbe946d42d625b1e6c24bc4e69de683ea87225a9fe0252faec7cfb9ba8b0d8cfc136c03d80ce2feca52ef9440ff1fd94e76f724bae5ae200cef32de88ce8ef41816d8510e46c4')); - dbms_lob.append(buf, HEXTORAW('80c0385aa282f89c420039cc83bc5a72a403f2f89c4205566851489ee8bf40e1b7c811c690ef045c7bdbed39fb9bf36d21ccca2fb8ffad02deeff917ab13cddcc2b198bcbc169978283296d6e600912c2970212675e8af889129446')); - dbms_lob.append(buf, HEXTORAW('2dbd1678a02220dd6c192a0c92caabe20a402ac1aa39a30583a62d5ef9b352878ee8bcb4566da5eaded1b0ede1876f635ee43c14729855a6aa464b9f5aa37373fd9e15b795678ed7846cf107bf46d6a1146c15545a6484ad5a64209')); - dbms_lob.append(buf, HEXTORAW('7ee251b086ac13b19401a01b4459f9a19b92710f09c277afe5a477fd97d7bb71a35da55c9acb316357851c5af337a2fb96e131ff4d99040a6601dcb08f2c21d8c201f8bb7f207d6e6e19dcdfd03b71d41be6ac592d1131e53eafd5b')); - dbms_lob.append(buf, HEXTORAW('fb8efd0405ca985090ea098480243eb249955c6a2011f492fd005f33b018925ce9ebdeeb48b55586380a7696c0f398415ae01d47051dc02875c00c962050f112f82fbffff0de6237a5c980e2d77f7a422fc68f0f7dc7cdca9d7246e')); - dbms_lob.append(buf, HEXTORAW('a0d510dc94e7a19a61f59f3d24c4dca67341d73d5fb7add6efd65e3c072a8dc58d5da4af4096600c2898409461e60c1ce8c2cbefdd504c436c08224c4a947b42879e2fee79dfb8a1bc179acbafe40d7b81b5be019d18b3244aa0d69')); - dbms_lob.append(buf, HEXTORAW('632814077f3efce357b3ea2a027c7400dbc0670881d4394b5b493e0efad56a35aeeb0e7c99786ed8e0f3b93ddac0e77d8f58a4f714e033f7c7085806f0e5019fe760a9a85976ece62395fae0fc479feba739fb4d83d7debc152572c')); - dbms_lob.append(buf, HEXTORAW('b5a0362a3968280d0c62cc5c62cc1062e25633371e42030c4f1947d0e482234085305e99c4972a11c5504e3921f6e18b47aeba29a9a839b179e79be6b343e3e5437bdad4ae40e6ae62933e080ada6ada466699d92f5d395faf9cbe1')); - dbms_lob.append(buf, HEXTORAW('c3676ec43840302a1188286bb257de803e15bea20d2b39b93cf130f4793deb1575d629d72fb84413e6d0b89443aecc56c111d362ddb2243110fa8230f74d1c43f700062876d0db1815182069cba075c6712079e87b18131e6fe1b61')); - dbms_lob.append(buf, HEXTORAW('9acdf3bcd48fd5c33046f1f73ffddefbb9cfbbbaa8a0f6c405a37ec6d4484830806312eb42e014bc1c0903344d97c014108ca6003619b1d313242455bf196f89d246d6133a93c0050a8ca5cdb44e1cb733e5fffa9668cde9fb6efb7')); - dbms_lob.append(buf, HEXTORAW('fabee346749d77c5026518da4cb5d336bdd677776ce1aa84c7f7fbfc9529887be375482a557272c13a261b1fdb4cc2e2f70cc0c88e8c28befd5591e8941597bc5222068634cf7ecb3bafaebee61cdd39441d7ae227d1c931db35e28')); - dbms_lob.append(buf, HEXTORAW('45de0b447e4e810f4c3c647c6b91011d14191b8dd9d6b70dd71c087c8718af4c6f5b148effe5e7c88aced8dc86fc493687ca79bebccf5848fc6ed0445bc3b1cf11e06be2ef1f835368a1c0f035f6fe0a37930be4139ceab6e65bfc8')); - dbms_lob.append(buf, HEXTORAW('531f7dfaca10a59655fd36721d365cd9930612612846a9dc22d468dfbad5c0cd58685bde411f46bb2dc3011168b7159ce1d677bdf713a1da32d97bfd162cf42d5bfdf8e776fdf9a56573f4c61b3cf5babeb7e81f5f71aadcc0285f4')); - dbms_lob.append(buf, HEXTORAW('4bdcd11efd17e60c4fb52fdbf6db4fdfe9571f0197a83d568576b582dc477d4a801888324fd7103d31e3530a591811c094c56ae382faa68a38262367e27abc4214a9ddae4caffd63c4ae3b825f58ffb3b2ace701018312dd6adb203')); - dbms_lob.append(buf, HEXTORAW('22b29109212ee3c185b8cfec83ee02ff106f4436e3ef2ff1f3bef0e08bed0bef3eab6a52f953e5794acd6c1ab9e25dfd5ddfefdab7db276ea4ff494e791924d3122419245521af3fac9bcd38f868dd31440a90cd20f4bc4eefc2fd1')); - dbms_lob.append(buf, HEXTORAW('9c057e4c55bdc03f019ef7319c206567437200ee6a25c2fdead5827bc9eef0c1eef9203e70efb73b452f35e987865ef889ea78bab3e2b3d28b65f7734e27ddf9456196eaeb32bda3f38258cdf6ae3b9357f3790322ea483b14b2395')); - dbms_lob.append(buf, HEXTORAW('3145b2938d87322e5060ec4ed7b0ffab24102ad94a91e4fa052f19727faba65b94aadfbfe9db23dc83a797ba3bfd9aa8aed71b28950f01ac2b07ce450f6e6b2422519b627a6c4496f6c176ce52e746fb03ac6bcc7588d4a52cb85d8')); - dbms_lob.append(buf, HEXTORAW('32265a122202fae3ee03bb3a0721a600e7e7dd56a8ccf5c5f2802b2a67823c735be02e0cb00be289f630dc5676d2a22c70bf1dea4aa9b622270d71cf3c7d953f2941a3af4d99787c36ba87c8281a53f195832c8c06214f72fc6bc17')); - dbms_lob.append(buf, HEXTORAW('a3c6753172f41443075cbacc40524995d507bcc340e6d848558583b61235b82b7f01444d743676fe6c60552dc0364a4d2b1cfde6224d584e9a77fe39c7acd28b7f6cfa99fbbb78fb307f5f807930f31414f17e9c8a92376b0d6f0f0')); - dbms_lob.append(buf, HEXTORAW('fc797b23c35a59eded035fad61ee79efff35e9af8c3f20f310e4818aca280a4547996b7cf7121385898a32386080717b99f87862a754ef39e993df503439d530a2e7b38ba5e282ec7acb37e14318d754a190d060644785304f9ed58')); - dbms_lob.append(buf, HEXTORAW('c773185f7fdc47fbc01b91ddd51b91cdf89bfaf09bbfe71b7c7add25de174d745f73c0d30b472f786ba652c3faf69f301611d5a412225512312ec590208a0ff1fe5e04425c82f92b012b504292c5fb80b42ec90b0b35ded9f9e3480')); - dbms_lob.append(buf, HEXTORAW('32bc138f13a942a28591e0011e19535c5fd483d52b9c97b3d49a695641b834dd075739fb6e9bb977ed7077cd32d07b499afc7bb5f8dccbbbbb859a2af52ff87837cbb22dead19d6b2d0251a5fc3fd5b1ca925e79fbf1f71f5679ad1')); - dbms_lob.append(buf, HEXTORAW('297bbcf8d5ca2fcd35ce99804f611c2499d40624f7deb3bcd0ba7b5b4fae4edbd304c43680371a168e1bca9fd3e3f2c9f71c1755651c78ca23d183c190194add413add0c615c1ce8335a1bec8542053505a276368c7f6b025505f44')); - dbms_lob.append(buf, HEXTORAW('14d9f5450854205350509304817bd06c748863062c6540819c097077c5eddf6148e1cef67ded7abe28a534944802fda9fdce2ab8f3fd01c73c1c8598bc95b83dc134bf17dc958cc711001360ef23b972a804a703a643cafc2c265ff')); - dbms_lob.append(buf, HEXTORAW('7bf27e81ce9503bbe877481eec3e4b07af79b368ca86c337872fafa3dfbc5eed866961330f799887c4aa14a9fa198803b829ab6acc3cc90dda4ebdb55a4b6a135f1ab1744643f17e7440e0e0280701a434f1bef78384c549ee32d01')); - dbms_lob.append(buf, HEXTORAW('fa8d4c92bfe2fada626e8cd171c74f4604dd0adc5eae87a87a96da83aa5bbae2fc27b2cae33fd42a4e6b0814faab8f2808fddd871ff40815fd812797d06a9b8b02ffef8e8b795df2ed082cd374fbf341c3c35db3848550595691118')); - dbms_lob.append(buf, HEXTORAW('15b661d07aa4f507e330a9b0c81b8e6d16a42225a3bb5425617d914a92fa52e5e88364337857dc87dfd918bfd8db27b75a5621d1df81d73dd77eadfcf197657a5f1e9a7ed2bdeedfebdedaf0944ecd12a8d6e97b2649f1136a98b2c')); - dbms_lob.append(buf, HEXTORAW('1adefd2b269ebc6abb5a435a5ff372fcdc7bef515b27a578c5fb8fffa9c3f720123db1a41c2516def0d3bd9c280b601aeede3d497af3aa3f624371a37e5b29b5ca138623e2f275b8b18ef662dda9bbbc7c0dbd9367d279b974314ab')); - dbms_lob.append(buf, HEXTORAW('1619b3715dc4dccff8cc53f3595560fa6370bd6dae8fe1431f2a288daf37f099e75e88b0b07c88fa0e9e3706d793ea25dba1b71e037cdef788e1ebeee93bf8fb185c6fe37ee0734ead3add354a4fedf1ed01bf81d3abc482218e8c')); - dbms_lob.append(buf, HEXTORAW('3620e998894094d2c6a5dfb171c9b8eef3d612de32e4e5213939f93b491ed2ab860e84b236b1f1fcba6cdccddf552498976cef3cd0f7d5f360e33aeff795f3dcdbeb6c5cefcc065f1e88832295bcc4c8bb06de3629a700c2d84e2a')); - dbms_lob.append(buf, HEXTORAW('00cea23a36004600f5baee70c8095d2f7725b886aaa2c5e5d1f119956304ebcae175dadbfb5ebcce8cea13aa4e5a574e2cd9a7c127d76d84d7ad07bfde2f89f187197f18f7d9e87bf1017fc594b2269b6f57ead3675ff8231f9204')); - dbms_lob.append(buf, HEXTORAW('af0f923c28821a360e22144c384812811b7531181bf682fbda8b870908d924681d3ee4855501859c92c14a799face3216c22bcafc896739f78dfb880d5813d7b5ff4ae66982a9cf26e2baef79f3b4ed877ee6cb3658ce890eea68f')); - dbms_lob.append(buf, HEXTORAW('b736841ea8010d433a9c64d2a07948850a96d633953be0e4a116908505dceeb6a70848d8005f1a63bdf1da743ceafa735c9bc7bdce870dce8beafa23d13fe6fb0e608f0d20688113e1f06dc87cb66d40c5e1fd8071f8e8b944383')); - dbms_lob.append(buf, HEXTORAW('c07121f6844382ef4967d71c2b81e3afc0404d06bcba071e78300127e98be9cb0d7564207e6d6a337375db244a9cd75d6e6916e970f6e3ab0c9ed91bca428ce81bcb1be155046b88a8d042d79cc2d50787f70c4bae0882a094a82')); - dbms_lob.append(buf, HEXTORAW('029597bb2147b77d7fd992abf53d7f547de21e5071071de6218031c8e6f502428e79a20d2a0ed89a7dea3ed3021216b969b2dbe629dedf69e35962e3791dab63d00ac5ae0bdd9c72e19557c6addf7cb34e785df9d6b3785fff3af')); - dbms_lob.append(buf, HEXTORAW('0ae2b1bf87a07ae5bef3aeb2df03b9230739ff685171ff0ff366cdac5c38e526ae3b9ab3f2a426024ad17f6c6c3fa222f3f22204438a43b2a7b61915306b9ef0232c1a0f588a3d657bb5c014a092309a4efc7c668405eb7a2e2a0')); - dbms_lob.append(buf, HEXTORAW('6f9f4982124710d7fcf78f8e9bf47a5e7ad2dcfb5f7831363a870877f0f7c3f7f7b6f4949a8bf6d71272b78b6efcace306fc06c291960638de406688683d932d4f9ec339de79a87edbc30484250f827ae02975d39a5deeaa4ae86')); - dbms_lob.append(buf, HEXTORAW('0204e2996fedccb710651ee086f98ea490cd9019c1d6df8884f6290f8ba039f314afa2506410069dc011c1e73a8c0cf1c2aaeb7bd0766c9775b8e5d0d5d3b2f74e29870509743c72f37b8f4b7e7d41dc489112442404799024cb6')); - dbms_lob.append(buf, HEXTORAW('216df4e9bede5ebccc391201f92e36aecaf5e567ba49e6f43cd8e67d933006c449b304b26dc6206540ca43758c1521162846101b8ce302c8f848128694402ceffbbafddc471efbf2a0f7f47f7f66159d70a28aaddff6db96a8e31')); - dbms_lob.append(buf, HEXTORAW('81471d0f33a30d7cbfd21d759d0bab5057e264c5efc8e9048085fe996e25fd7e81d34f2aad7978e16de75c49933a322e269386e81240bf2e6a380385a8fa2d224c77708ef385faa124130e479930c26252c63c43868fd0a098525')); - dbms_lob.append(buf, HEXTORAW('6bbc0f4b54fafd5fbffcae8bbee8a5ffbb53c9e639ee97a3f94ef6fd025ad665c73f76066c364438d24f479f080849d630aa33432419215bc06ab73d444038b2dcc60f7ae0ff19786b59e3c67a086f875e3e6d5c8283df262f10c')); - dbms_lob.append(buf, HEXTORAW('17186bd077f1ce50ee3fec41b32dfd4dbf0a98ac2e2e0f7e1f31efc3e89e142ce94047ce2e0979c72108717e350b11d02541138302b0fab7881381f5ed82232970f68caa123fddbbff35eef13f189070ae30d2181547b434a4985')); - dbms_lob.append(buf, HEXTORAW('f090919a601c47e76439cfb91baeda8c0171ea73aac71884ce4dbdb8168cf84c2088609c22fab0154909440608c6ab06ea0e69f8e1c5cdf4f3729c68481e7f771e1fcf02adab30c68bf715eb4cac03de0fbc3f707fb275db5be07')); - dbms_lob.append(buf, HEXTORAW('7121366494808df6f1d271ffde51d9a7119bcf5675285922d82545714195d2adc7439829a6c6c227095dd67b11e39923adb0b791d4a421151bbb6d9dee7480987f6054bd8224343b9c8ade612ca8ab7cb5bbb9258c1f1b346bdd8')); - dbms_lob.append(buf, HEXTORAW('c8238184a330e8fb0548248ddaef777858afbf9aa3ea8cae09e7149640004995c51236ad6b4948f0be2c8954bbed6e0212167d22247ae0fbe6b652e1ded1859b937a9af21ffcbd213148ddad14e9934b0c36f099fe1ca12af26f1')); - dbms_lob.append(buf, HEXTORAW('81bf70571b211830f84638e38f8fd9c7244e04bc8e1313ebf4aaeb7675e306e6774551a1104aaf92d0fe440af932aeff5b2e83f46e613edb9804d759bb89f555df49cb8b8108697a8d9d1852d3794cfb6216c25edb1ed831903d3')); - dbms_lob.append(buf, HEXTORAW('bf4cbd4ea2bd45ba61824410481221b7dd20c923ec85eecfd63ed69da7a62a1fc1675527ad03c7c75044f0be5ec2e9f86c19065f6fe0b3036c4272ddfa6d7c0909b364809cb4aa9aae0a73c215c3f22691571ad61b4bb6a4c2210')); - dbms_lob.append(buf, HEXTORAW('98402048354a622b29c0907312e42a2e0f54323dfd32d2c9e2ffa4ce884244f048425134d5887b67feea748445f7b61e58d9b7ab9124892ef1770aea58c4f5d52af9e52279f7ee9891d5619fc8922e6a3d712630442224bebfa92')); - dbms_lob.append(buf, HEXTORAW('058513ce4282b6a708886d403cc796124e6f1276ff1e2c721b892189eed67fd004705e36faed85aa2899c42074961ca7413ae8f6e2e00f9018e238633c3740a72d74ce71f3e239306b0eafd3ac314548d34623ce883622b2e77a0')); - dbms_lob.append(buf, HEXTORAW('e68e5cf19c4f7670b483c8fad76aed1fd11c08003c21d57a867ca93fbb9018ec96c48ac92c168e7409518cc1898fb7f549d6958216268089e2c7e879138d0681ec7109d74f88517d47a5a774684ba1d7bac9fe0fb54a7ca67c4f6')); - dbms_lob.append(buf, HEXTORAW('7ef76cf1be31c6cae00b92d08325302ffe00159a648036e5af7d7bee5ca5d6a42eddb889dc59c996859964c201c9830908491a4438a4c421555401eb62b7491adbdbf0fc404282f1cadc5e2c91e8f75fbf70e58b6e2a9de22bb73')); - dbms_lob.append(buf, HEXTORAW('c3eda7dff64df4fdaf48426a4f5f48ec38e42bc4cda69064a02c292086c213e9b9e90acff3604c49294cdc6ef7ac0564f2b3fdb51db10b9abadbb355803383bd61153e0949418fc2a02efc1ef0889c11612c31c71f007480c719c')); - dbms_lob.append(buf, HEXTORAW('b1c0276d3e42b20a30bad79a5d77c6fe70b365ed3f71f6b4a08788df09d2060d63066cef7dbc5109ee6c8b88e7d3f3bac7c673d8f3d94fb8de24d689d6fe51afa56436a4de4222a4c0ca648cc149ce0f3cae3802108524c20b494')); - dbms_lob.append(buf, HEXTORAW('34a1c52127161db099d1a1cefaa6a1e721e720b07c5a98ccc78a4ead44fe8bcdfddcf4078f7436fe0b305839244028b93e812e277c22ce144fb7f7cffdbd39310a0c792ab3022b37712110ab26d947baf9312b12f0d7b10e1f8bb')); - dbms_lob.append(buf, HEXTORAW('b58801bc5f6c6f9f35024448a4d15d1394b5f5ff78db4d5fef24fb7e496c7a8dbb36afd71199154855e5231c9040c8d6e7b3e9d1391d16fda46d4fd940e236da11b79ed2b1c613bae3580bdbb846de40919b8ccd4215954c55e49')); - dbms_lob.append(buf, HEXTORAW('718c2069f5189f92406bf8a200c2cf401c3f837b1c4208da30112431c01b43de3669db6cf98461bdaf6cc0bc69df24ada61f5672875f0594774776d499e16069c1d3f23ca4f18007dc9e6226af7348937ce1faecbdcdc338f776d')); - dbms_lob.append(buf, HEXTORAW('1f396a4cd436d17bdb8c81f4ae8aa926036c4834cf3fa893e8f13e49428af6542ad416bf87c5ef7a5da716d4d81a2da11ca4328a79d9c983c2cb5044844a23c8966133a3e55d678ecf2d97f079f1fbdc4979bf918413bd7ec6676')); - dbms_lob.append(buf, HEXTORAW('3eace6860de93549e32b961b928cc452a2ab6bd05481c3ed5540430acf68e1631404a2444109940d2bcc5b9c78fb8fecda3c6e8fb9d39cee212d7bd599e13f4fd82dcb8f13d6b85eb763808019ca94428c8e6417d481e6cfb206f2')); - dbms_lob.append(buf, HEXTORAW('ccbfb1edb9f0672771110db0be3b35e1edef594d5ae88af272cfa628e4c11c2a93fb84f0bdef02732450871febd59e4a3dfc3660cb8bf3d19abc575b1e786f17b76003e07f8687c59c0d73e009fe31db7f73d742f5be033d7b1e4e')); - dbms_lob.append(buf, HEXTORAW('3887951621e0cecb2aac7ffae44ae1e2b02489c051608ab64141aae93dfc7e795b19b1b17a6d2e3a9b1b4f6ff32725deecd09b94654e6cc28b5c91831affeef6ebe476f25e61990f0a92ade263c5fc22b25c8b828090c1bcff5fc8')); - dbms_lob.append(buf, HEXTORAW('516855a1dff4dc2ef9e641d38def51c4be5e2fdeefef567fad9bef52cf6071b6b3df883d629f5cb6e2a7d71c3ad4a1566cd3e7035b218578a780f361207a9aec8bb0a84c497351707abcf38beb7b588012c81e03d581221c98b547')); - dbms_lob.append(buf, HEXTORAW('f7a5e1675fb25cd75ef2d7fa56cc4ac2671eb43ac074ee9131646757ce7d0d1a96fd69ba6d43137745977e0bb063f1bd36113a1d43c2c919024229c4868bd57df2b6b4fb9f1da3198767ffa8ad6cb5452375535a79ade507edb83b')); - dbms_lob.append(buf, HEXTORAW('95fda1ec80b260b7caf9f53a4e54b9c3f9eeb93244c9fbcbab2a04a902aae00e3afcf1b4672a83e7760c1910a91b6fee5cd4e3e567330077d7ef861248910c1a022fd1c0847c6e21fbcd705e940a568bbcb5b87d87f3efad5c53fb')); - dbms_lob.append(buf, HEXTORAW('cad09e18a7b7e6f7eaee678abdeaedcb2fc031533e6063b2598fe6ccef514bddea7e2a2f5f65ddcf393799d5c24fa76e2cba22ad94bacc1adaf518924611a1fe5f00a47fb3e6f3261bc6609354012cb4fa2e2ca162a34a9d293fb4')); - dbms_lob.append(buf, HEXTORAW('d792595d21fb6beb70ac659e6a885f3057bf38980be4a59a7830ed63180b4d36cf4817faf6f1140db00270c88f7f505306ac252f95e45ad684a9d00dbde36545ca68f73e2802bda95b6844a9b09c3235e9822e34072c4b8abadbaa')); - dbms_lob.append(buf, HEXTORAW('2b6bb084838713f7a207da886377c21da8db8ff385295136189c11b0712e40d15e055e213eddb8370f046164671bfedc17bf0cb0f7821fab369c30b1597cf5819a0daa0f7087007f6cd8b50e558abadabdd08d43322d70cb81eb98')); - dbms_lob.append(buf, HEXTORAW('178c1502435380e1fe7418485088ee0b477dc3f5cb4b0f739d4ac0ee2ba8852af8cbfe5b309a72b35acd5802da7a52b555cb065ca2837f99d3f80903690f9de8231f0a9b8687d9c1c6373f9201bb363ef132ffa3be3d49f6e4df3c')); - dbms_lob.append(buf, HEXTORAW('008f22ccc62f519212208def725e33b656a0874d715ef2f55be315b5fb667bce8177fb965161390002f3f8ed416ba7e261ce48e4bce1ad9de799307ee3fa505c6a9e0f77842527970f92b7fb409667c7cde867e679c68bf76ee3e8')); - dbms_lob.append(buf, HEXTORAW('7d6ef66f0fadcd3699f13e328dd780318c5e4b690dd44406464230f24a2ffdfc87aa5eeb32ad83d514a0cc9bca102bc4a7cc6f739220e84f8032931f88c974924862c1cfcd59418a4118c251f8a0311fef9810788e0401ad46e36a')); - dbms_lob.append(buf, HEXTORAW('8b3dec0675e705d8be3906d348544d77102e2772634b4a04842913601fa7ed575e30d0346bc787c7d3be07efdfba4efbfba7afd7aa51e5970d1c33dd728b574c86f115bbf715566d5668fce988c8d823108f46a1a1d934158071f3')); - dbms_lob.append(buf, HEXTORAW('48e8066253242663a6fb9b98a826c67091897c4eb205904b9f4eaf2d90e03bcaefc715684afb767bcd86f1567971d45190ef840146edf4c508860c80054922cc2b81f045b1ea8ffb81601b40de0f7264984243a4d982bc655348de')); - dbms_lob.append(buf, HEXTORAW('6b08b313ef4fd480209c7f7f91c1212657ab79abd6a2379a2641019d23e972a59a9c2adb62d64777b618983c2ed5bcdd5a6ba261bac38a805a58df9cd4b8e2e0c9cde835fc98d27269cd2c0c754455e7c81c64b9fc4609e4369c46')); - dbms_lob.append(buf, HEXTORAW('7e3e0f7abd01273ca4111ef2c81046c787980080e84f01dee648fb9ef78a50efd39fbdffb23a92245a2728e9c53bd90080d1bdb607cf3796b501a732b09140b91346489dc5f3d7f171c4f3cc7f66ac3db9efef8267dfe37fae0b6c')); - dbms_lob.append(buf, HEXTORAW('b5a2a55fa7bf1dc052d30032a8e3188cd4b62c6e014e764c61fe0c6cc0740b2c4dbb69ea3d343f3a2f3f3b5da58d78d700f3266fb559d89d781dc0ff2a08f88f7150c852f854e75256ac7eb7d18aa9d3a9e722c51524c9f719822c')); - dbms_lob.append(buf, HEXTORAW('3a91f14318ef92552c52da2fe99cd4efcb3741a70e72734d46aeb468e3b01818581aa582151a65d57f3813af096234d4248a8ac7dfb4e3a85a8807e60db535e5871ba6667b8dac74d02262506dfc2ce177efd82a34ba02ab20dbe0')); - dbms_lob.append(buf, HEXTORAW('0551179e9c45445369e6b0e7a7fc47bc4834f72b273e0d545f882536d78c61de856198b440f9a9731021f1d5076fcb8adffa64cabf38c52279f7269b8572f97605b1f51ae9cf4c70c247f714e79400405120a1312d2a1caf80882c')); - dbms_lob.append(buf, HEXTORAW('2586f89bfb32d46afb30e734e5ce91af7ee993be8fd136074256f11a94a936e9155713af6315d060f5eb850a917ac1b9ec81da8d42ab5b4d110378dbd6d948a8e7f9ee9bb19acdfc5bcb0d81be87beff3989090917f1b6ddf46992')); - dbms_lob.append(buf, HEXTORAW('3a34919f5735252e3d69b4cee392489aad36feb0be33a2f23e424b399057af379f0fb23dea96ff0a594a40ea0d418b8d39ff283084a6ff13bedd86cef752ce94504fca7371b30021836c09daf50b7d4171acc543146437c3f474a')); - dbms_lob.append(buf, HEXTORAW('94010c66ca8b2947a4a19e8db471b0338d545d4986ef6f63030968d101df84823481c911e9a00fe0907654554412c30eaa8a7c9c1db903e7b304b243124360f6e1ed35b60ae372edd7ea571d7f9d52ff6bffea03cf68cef8a0470f')); - dbms_lob.append(buf, HEXTORAW('cf6b028e9ab27846dda9555c364f4a8120090ad94e3e053c59c0bede3ebb11ea0335f79e470f6ab6af5217be7f47cfe177ea710da957f707bdeeeeebf161bd9b517889236689701141c102c74cb091d635de6e7c6bf51ab7a0d50b')); - dbms_lob.append(buf, HEXTORAW('f7fff7b867f7516ae9a6f96fbef6a38a9b67b13e22fcbd79c55410611211f17c1052c11d3c5fb6e8c62b51996e12459f842ab3eda2c053e0fa0d625c826c39d54da1932cfbabe46cb1ce422f871e6302922de6c5d9f6ef3edb1941')); - dbms_lob.append(buf, HEXTORAW('6a1101ffa18d096902c923da22ee9e09fdbbd1ccb8ef279c26b61150eb6530573a875be64ebf8a55120a12f9717df5250ed9f63001719b73a953e9be685255114b20011cddf6aa8af285c4b09daa221f6737872b12423591444510')); - dbms_lob.append(buf, HEXTORAW('b4c18372256dafb135c0ebacf63df51ffdb7beb27b9f3b8b3ffe48a9cbb21f6c71b616756b1e53a77e2d14a2e1b4d0e06098a0484905f50758159600b66f77dcc9356b2875eff20f5ebefa3da55aed97654daead176dba75f9a97')); - dbms_lob.append(buf, HEXTORAW('11c7acd2db5ef7b7ab1be6ef0fb331faa54aae18cfdbea959d38b8f0809736c58091cb8462922ca947a7551af05795d959a3b64d2b8c7f473aa52aace8f56aa93eb23ce599403dc44723c964c3ef63e97ad7163e2c63551dd10ed')); - dbms_lob.append(buf, HEXTORAW('c7387a8c56304843b0fe8224deed8d200f60841c29010bdb6102db9097b3c5f7495f5cb369a35f94b74504b4bd50da92feb1368eeab648403f6c803bd3d67ba1371ab905d9e8fbd9de73414a24b1ef89fe183e1fdfe1e74855f1d8')); - dbms_lob.append(buf, HEXTORAW('c4cfafb6c4110efac39e222011c0b07ecd9e8ea974964c55149c1bcaf4b7575574a19018765255a425101bf88424c5e3b13de35662dc3eaf336527999788c0e7796ea0d719f085ee4c9dbeef254a65947578b6df14a56e5df1dacf')); - dbms_lob.append(buf, HEXTORAW('a38e55eafa179ebdedba6b953af3b46b1ecdbac9f58cb2eea6e46c3ec2d2d1c03452856989e5daf14fe71e32541382e68316dcb5454b1a23efdc34e33ffade4b6a5ef6eac5faa20daa5f8b0509086077f5b0f58952b57eabbbf80e')); - dbms_lob.append(buf, HEXTORAW('7ddfcddfbefcea174728755adb2b27646418fc6ca379247e06e38cb838f029f2d9cdbd34a8a1fdf897472bf5c519fdcfeea1f194d85b87ccbd286e5e4e5227d0d1cab98a449c027b191101210e1bf771b3f56f673a515f3287e27af')); - dbms_lob.append(buf, HEXTORAW('c9c22492059f1fd9d8e20af3e23d43b1e9fe3b70d79c78bfd5763609d06075ea554dd760d66d7385d256e610145dbfee47cff9f34db0097910e2d0aed9f9119f7fd64260c29a106e5505bed4ce5cc0ab6f739b46f7c0405cd2791c8')); - dbms_lob.append(buf, HEXTORAW('160e7a913de4c6ebb1faf757d1c2ab811c17896c1439bebd5959835445f94262d85955d11caec54ec64cafc4106cfc4a7c80ec2eafb3800324f476ea0cf78068b2aae5570f684ebce331a7b51e3d5a13821b3e5835f559a5ee5e3')); - dbms_lob.append(buf, HEXTORAW('6e8fccf6ed5b0c17b470dba5aa97bf61f74e23b9ab0dcf7ebe0d3bfd39cff83ed3f2e9bff9a52cd4765f69bac39ffb4f76bcdecfba3722bdc8d3a68d0361803e27845e478ea88b4ab8ee9a4d489adce3bf5eb12a5aee9f2e481dd')); - dbms_lob.append(buf, HEXTORAW('ce3133215332d00620632d491214c0e6d69b987cf857372f6aa5d433b3af29baee0fa556b658f2e77b99ee1f9de3495545d961298b2ca71327027201be84e3851ecef27de7e1e8fa664982be8b773d680964db043fc03dd3a7ea7')); - dbms_lob.append(buf, HEXTORAW('498714119017a5eb519212f3ec9d9a26fdd6fddefaa140fc9fbf78083969a2b2cbcb7cf3946e8d4abad1a49f6f7bdbcf95284c44906976ebc7fc97eafebff3e2b54b3bd5b2297be5f6c1fd3f7ab9e44a9544c0209b0552675970e')); - dbms_lob.append(buf, HEXTORAW('57efbd626d4fc581c435bde04d8a3a108ad8c16cfabe485b8ea0c5f5d9c2c8e888eb6291ca38b8189f377790c3d7399e71385e4ec09191cf8c4f65019f39a81d7140cae7c4c647e3cef6cc837c8fd8f8685eb23df320df37763f5d')); - dbms_lob.append(buf, HEXTORAW('d75ecc73e2f71011efd68a508d7df7d587f680b48b5c63775a56fa88b326ebfe55e9ff3bff7c7d88df90727027d7bdf302ebf3e697c573de81efebf97e32125b7e37f580fa639fe7953af084762fbd3c4bbff67f3fbb6a66032de9')); - dbms_lob.append(buf, HEXTORAW('9cf6e484eea8494eb61ab2b900334b1454b8c84d5a57d466d34d1b8729f562ee0d573fdb4da987ac6ef54f82cda308b5cd8ba8521edc56b9a4aa2028e46de4310e77b5bae27d6ceffb7823c8b504e29d7fff3acc16df29db834f46')); - dbms_lob.append(buf, HEXTORAW('906751b2d1c075b06dfc0e7bf978f0cbef71f0811dcf391139add8cd1be706a707c7c1c801aa32608d088c99a15da07bdfbb9acf6d3da254eb9e1defbeb6b5fb9b13553925fb7ef29c60233b9d5b4d9cf4406f2a40291132c15789')); - dbms_lob.append(buf, HEXTORAW('ff9ebcfd05361035ce69eb524827a6ca21ce9f16b2a1bc417eee7eddad97f30aca0d4491e3dd252716a022607c01920479c17417712001a266a031940eced94974e422302d59c47b9c7bb113302f633ce30ed4b5621cb37d1c347d')); - dbms_lob.append(buf, HEXTORAW('37db332f7ea78488c067ee1be2fdbe41f36ccdb71ad4d647f4019ddbad7afc27a5eeba3d6fcad36729d5eaccac99f5a71bcc64c4a7c871527171ae262af0739fc6fbb17330153ae21adca40213751c2a6103e08038e20169e5b97d1')); - dbms_lob.append(buf, HEXTORAW('021bf6a3540e519a0e2daee08f25841a96daedf40c95a79f153c4bb23545c8d6f6a7e44e76f95aaf57dbde135a0caf4c5179ce2ed4b2f3c3ea8a4ce3dacfe99cd060c7b61bc113bb54eda9453b5c4ee24dbc722c9a54fc5458ceb3')); - dbms_lob.append(buf, HEXTORAW('dce8d5638603cf2f7a0ebb6bbfd1546f42aa18292221b2d6c7fa9583351a4e2aaee4654c2ab2be64ee93d30a58a20b9178ce1f08778e340020f4cbff192c66dde83031203545cbce1c5c11fe4069ae535ee27cb6aec4b99210b60')); - dbms_lob.append(buf, HEXTORAW('6579239f39995fb08d27e14267154d775f4a19c918780f4210c0baf51b2c3bbbae52570ee85336b4835267bf7263e611879b1b3820d2dcc111d09c0d952ae751b658cae1244aa99271be7230f0887a296c047567e05bab962b89c4')); - dbms_lob.append(buf, HEXTORAW('0efa00e3f81ca45a0950716d7704b92d9c2e02d6af13e4841140f0e5ba0ae5a60edfe75cfdca0b2e69dd190499250d221c7dbd9024134eda8769f37903fd536d24612f8c271c3ddbbf38a25d3bfddf2d42758ee8a5e2bcacbc1a06')); - dbms_lob.append(buf, HEXTORAW('35461acb03545c247fbf1b53614942e2cb00b1cbe6fdaf9040945ae9fe938093357de985b59da562b72131187c31774a1bcfdde6c11f687b20afaeeee2e097de50e2e08f335e7a0fc8d9d0698b0513ac230fe0745962f0e65e4a56')); - dbms_lob.append(buf, HEXTORAW('91cee7c61cf112eeb848ea88171fcf4bf5188318beacf87ed21af28231487d2fed8f03ae54ea983bba341d74b05257f47b78fca9a79a275160241d681caf40c6774a6a4715f5446956999a8303e412a4e4b086a82b3ce30c8bef4f')); - dbms_lob.append(buf, HEXTORAW('df4f38353852b21611c881363f9a87dec2e92228075790e41e90be3d88a1387068d6e0b310e94c39957c258101397e8824122228749062a47cd0daea1fd582926fba04a4f165fbdf75bf6b7b8b387dddf9915e57beefe767a4bceb')); - dbms_lob.append(buf, HEXTORAW('8af6f1db9a8450135e58bbaffd151288e3ec1bfd8fd886b0a3bffb7243f90e603a686c73dd76aa8ac86ba5faaaa230f0790f7e123163f86ce00b039ff7e00f2e8065c78f5b73f8e80b955cb650150573ba112f3e6feea504f31211')); - dbms_lob.append(buf, HEXTORAW('f80421f78e3b4112cade09e7253901b4812fd93cd3c6f1be87e4d08f57f7a78e57aa75f38ecdfa7552eaeaa18f7ffe1fa8b652e96003a74c1b99664012145f52c08f701dae270984655b9ac9eabc77b292bb3102ea9dd720e3b82')); - dbms_lob.append(buf, HEXTORAW('df0f9253d2ffe18e392f83bd9dca77de961286a75a8bb7f3bcdfa753af8ac3fff8579a1b81de9ce4dbf73a0a89438e860b3f1fb6e3fe8f6500b03da0610a174dffb16eb95473aacd673f25dca63e7bf14cf0026f97e52a20c92fce')); - dbms_lob.append(buf, HEXTORAW('f756aec799560caee41eb8b802491577322471c78ca2ab7187ce8e894eb8f3a2a3ac9615c6c9659d8f4ad81aa28da6f6a38737d5d66b45f88ebc3e67a8bfa19c644a7afcb00be3ce0cb31f880bf03e1b3fa015f06f0e5015f0ef04')); - dbms_lob.append(buf, HEXTORAW('5802f07f86ce0eb017c3d81af27f045802f07f86ce0eb61f0619cb6790ffd7e346ef31e882b519dcc7bc7e605ef4df39287f7c8e17930cf198bf7c8c07bcc51b9069f35c58b8fdf2303f8f2808fc61d013e9a071bf82e02be3c31')); - dbms_lob.append(buf, HEXTORAW('2f11e0cb013e1bf87a78c63d16ef8179d0f83281cfc6bcf4f0cc4b18f394877e8e581f63715f06de639c15496dae5403d5f4a253b424724c9b335a1e788052cbd6cf9f3371a2521b37acd958f646f40e9f5755d581808b0089b0a0')); - dbms_lob.append(buf, HEXTORAW('067cd59706aa3c40f3c6d1755ef7a0861fb86ecd6d271cb3efbdf746dfdb4af8de5966bde8af81f520d657a1585fb1f7eb81ebcc3c58c06f03df409a67e0abeefa95dfc906fe42c69f07fc9e75d1ecb1569fb53d4da95f52239f7')); - dbms_lob.append(buf, HEXTORAW('d3d4fcfd18f15fdcb903287eb7e1041fe7fec7d77605455d6f87d93425540042c28a189065054c4b5918958f613bb045d154d5c5c0bbbbaea5ad6c68bbaeaeaea2a2aabd8829505549a28b6bc8080080a0a845e8288945002a467')); - dbms_lob.append(buf, HEXTORAW('32bffbe69e73dedcf3e6e64d4050bfdf77ffc8cd9d7973deb9f5f4735175a864348f005fab8f23d561a8d78adf66295055e80da84b54ed3230e76ecb7be1993e723c3787b6f61c183b2fd4d316db777cfe2cd8c7b80f6d687786f')); - dbms_lob.append(buf, HEXTORAW('9136afdeff8dbe62317970bf1ed639f7df15d1bf505bf0992bc14ab544d715018ff84296bc059c4372f0eeff02f2181dc141d19fba790a98ab298aac8f37377d4733e4e595715906ac7a02a1a047ef84c5514ec4e6950150d82f6de')); - dbms_lob.append(buf, HEXTORAW('aa8ad0c633489718a261c66927ebc6cc6d48c973a20c9ec186e48d3383a7ab128d1203aa4e32992a918bf2ceded9905a766c7dc405170a71ed930f6f1adf4b880b3bdd7ce771db558f30309238659eaa4561e41547242e71cf45fd')); - dbms_lob.append(buf, HEXTORAW('2a23bddf5e6a9ec4ebcb6783e2b60c068f3851834a2350d5c9e6c946fc0d363380df24bfd9135dd70b7151cead17e7a8882ee31ddc741737aab2186349e31c861adbbfb5e2a88abbcdbafdbea3dfab3767c9110e3d9bb2f4d26745')); - dbms_lob.append(buf, HEXTORAW('431a06d5e6b642de3648fee2b53815d67e2bbf800472dca6018b410299091248624e761e719c4a62f0382613a7acda7e8e2b36ad526250ed9ed036490c45206023a7ec001e16937c4683c4d0d30278d02e619c32b63d7836c0d3fb')); - dbms_lob.append(buf, HEXTORAW('313a5062c806780ec053bfb7e9f738ead88f61008f8f8ba3c1f3c6355fc3bb484fb5469c743f92f4f2138e4bb0c4a0de5b0cdff72389908fb30df0b2019e8e77913e0e12de48803710e0c5be0fb508ddd9ea62210efba86b8f4b24')); - dbms_lob.append(buf, HEXTORAW('679679e5296595770931f7fb8f972f9ca43a0882882791a08aeb55f87cb3fe3d969804d2abcdad693f4a0964665f9040988457049c66969a5f39bbbd00efb0d66f2e591741db2459dbe2bc587334c033ac37b93e70bd227c05af00')); - dbms_lob.append(buf, HEXTORAW('d65b364980198047676887e1779da1bb1abe2d67b769d3ab54888af3777570e4139be7942cdbfe817a30b24ad5751da106db52fd35aa26d604254138fa7e73467547553c49618a9440869ef9cf9423d708d1b6eed0cfa62e96df75b')); - dbms_lob.append(buf, HEXTORAW('386b839ea1248946a7c69fe98a4ee804408eb5fce961aa5ceba4459f68fcde58be57bbeddf4d982ffdd12c80b9003354862c01bff7cc9e07e5e89419892cb9923de7589617192eec63c4d370ff4da575e677b2b3170afb3e00b9e1')); - dbms_lob.append(buf, HEXTORAW('a9618b80d29c8f81c0ef03a1334bf0da794b95754baf1236d9f397c4b6eaefa653acb05c6d3de87e03e15ce10696e9ac78add6e1d0dca863b8e05c61a8cd846af35be4f4c81b64101abdeb86af0d10695acdb79b463746c441e34c')); - dbms_lob.append(buf, HEXTORAW('d3f3e60fe01dfa807f815aa3cb719dd3783840258145f565847fcba8ba32adf55c8727d9c71fba00b9b49d27ec888ce156336ca0fcf1135ed068b04de71060d03cfa1166612a59df87cabdf54ff61a4ee67ef6940f925bcb0268b0')); - dbms_lob.append(buf, HEXTORAW('bdda51a3547c6dab1b6ef46427e00b383df6c5c56ef4137ca9f4b554491e83f93aa88671ff63676e2033359af336f01da6c5c1c1d5e925e6741aa4454a1e181e71da81c5e725e6704cfa0eaf16ee84b8e31c88eb64542d0e45c556')); - dbms_lob.append(buf, HEXTORAW('3d2404cd942aa18c8fde54b6b1f7fe09d2e5e8ad5a6f9f218988619224f6554a8f79bef139a271d9e699ff855b4dafa8a32c2170dc8c1157daefe30d7fdf99b73a7f57f44128c39cba6ac5bf50a8c539ca641ab71fcd0cd9aabb2b')); - dbms_lob.append(buf, HEXTORAW('0c6e71847ff8babb6c2503baaf2a54587feb884f28c8acbce7fb6b5fcecbfd6cebe7db5759c2c83c5d78703ed2cf85661c1ceb7daef6ab250c2082a688bdafbb2af088863fe2ada29dacffdde7777b32f3216efb8c68399080c5fd')); - dbms_lob.append(buf, HEXTORAW('8c8c13178f01c6e8ca840375e741fd5e179ef55cf7bf8c1ef710275f81e3cc22f0ccf6569cf65b17e107ecc26e0f5177fc7decb36b8cdee4a47424691ca8c73e411c71e7e0a6f9bf00b03bc2c8007e34cf8f171d1da1e7ef49e2ce')); - dbms_lob.append(buf, HEXTORAW('df7997ab2cc04f3c6c68f71d4a6c8ec2c46c8bd718e3d5fff7c7d6bdcf8787f42f339aa6efab8aa314b715a1f55935b300b94730fbc68b598c4f0e7f3a5f0cc6177e767b1798efad661d4303e0a3e839760ddf0f1373da7e065b17')); - dbms_lob.append(buf, HEXTORAW('5c0c6bffcf4b2a7961f2ac4eb4fdebbf2baae42ccbafc8377173eafc681526730c21062f12029a648769450f8ef385c4e581ca86df1f394b00e8f13b810c75ff6eb8cf0a0b79a4b89e3efe2ed889b2a2774704a6bf79a01fff9a38')); - dbms_lob.append(buf, HEXTORAW('fafff1c309e177adb3f9f317835732ab7b8297c12159221b138f0f95e1392fd4440349de726a134cadc48c7384d311639e8004e36c9c03684279fc3802e5b3da54b2222d9c036c8ae6a74a7f4738e85002f6c80a71bf793cf6564c')); - dbms_lob.append(buf, HEXTORAW('7e38dfda0649426151771f48ca331b98112bc00d586cf4fdd2051993868c1545026bf777f64b69d181e53d5f58f7e8e0702651d86fb527ce9ecaf50351d704ce5122320a1fa2bdd83cdb88e094f76a1145f0f5cf5668a8f42c921f8')); - dbms_lob.append(buf, HEXTORAW('022dd5662acf2857ed390c5fb67e2b9bedea59922bc4fbdf3d5dfa640b2176ff6dfb6d9590fa852ee462358e041622089c60e0418c07f30cfd797e256b8813143e1fecc027c212509bd29d936451c46a89d71f86dd3bbe5d7b29801')); - dbms_lob.append(buf, HEXTORAW('e7269e64715f2b35353875df19248a4a2c47da69f0f81b9cf683e615e988681a940eb1ea919822978b050f24f07da9c6084d9f38d2628298dfd4172c53701e8d6261742a761bd0fdae2a613ff7d8b2fb333e43363acbbdadc16fb3a')); - dbms_lob.append(buf, HEXTORAW('1cfb0d1a150792fbae72e7252323b8777aeebbea7932fa817109dcdbc85d6e20180d6d6bbc7a0e36201a154b7437586193fbaf03f0b2019e0df00603bc20774a1be0e5c1736180d719fa1706789d35f816738365c6359f71941b5b')); - dbms_lob.append(buf, HEXTORAW('4b2c2070308ea399511cdf93ac1b730918a96dd113e015b07171005e36c0b3015e5e3cde16b963f371a179cbd3c6a5841b190d4e0925caa82ce1f5d2c6058e058417e91a79a542cedc8c35ef954dc25425afe975e40855d7bd0335')); - dbms_lob.append(buf, HEXTORAW('b8a7d6032b4189b373a514734deb12d766d27d52dfbbeebe1b301571eb18ddad6dd66f72d7c5f953c65263bf8b58bffd4e0d6a9cb9bb2eed13b6de4ceee1b96a1e6be657fcfda7a38498b4f5f9618fbe2bc4b697366c2f5b00e301')); - dbms_lob.append(buf, HEXTORAW('6eba649cc51a23fc0ff7be1f5635f2fec90709d1fbd3334eaeea20c4f799cee38b5d9bc0eafad7d13c4fa94f500586e705aabcf2588d073dfc1e56b02f69a0ec3b0c4992751ec30309c6000faf5bda8ebc3f5bc26d37e5c8e87bf')); - dbms_lob.append(buf, HEXTORAW('3e4678bad938f9b20bcf92b817d9141fb42b54b02dce44df35744e1081909e18313cd0f672ceb375de2bd7cd1bc37d78e56f852668515aaae394cd564446781b3e8c64e2cb3037598b5a9ec2f0282290de4902c1f33a7748be4642')); - dbms_lob.append(buf, HEXTORAW('a0acad2c66d11a2c3f0ce151def93dcde92b4944cf728a6380188d3002f1ddf81c90e86b88da90696792b91d74f31c17b12e0213fe3c05f3c301d06cf0678f900cf0678f900cf61f06c80a7be37c7afa836d804242169afe01141e')); - dbms_lob.append(buf, HEXTORAW('4077f118367033cede017e02f6ee52bafaeb803d8d6c6050f7eee15e6793fd9006f18c0e3e3e2307836c0cbd7decbe357301e269fe62d3fe1b878de68450c9e0df0149eb83ef28931e0e31c7b3ed2ad6e4d453b21befce2bd6d932')); - dbms_lob.append(buf, HEXTORAW('0db2ee6baaa03af2bcaa1f523b47f82e73022fd7555bb5bba456aab9b52df12a25bffbeb35d0212371e19301e05b1b689c099bcd738431486f9c47ef7032f2c07bcb0282e08c6b5c8b04f02e269eaeeabb24b25eb31f5ea510f3f3')); - dbms_lob.append(buf, HEXTORAW('65b884dcfae99b5f529180ff0aa425d3b72bc985b8cee673955882127e7d75ee31ad9971cb87ad09d52dabbbad9a503cf17a26fd6ef6b4fbf4a88c3da769b307fbe104be7cca9d8f19dfa5dca0faa2655d13aa851758804c78aef5')); - dbms_lob.append(buf, HEXTORAW('91ca180ef434868b2d9f3863ad405ea7cf6de87253dbde2e137bac8f79f939277d78bff91fd58d23ced1f43e56f1f11e7b51921fcf3970b84c45b9f0a1b1bf629329ab49f818c9ae62f0cf08a0c8c6c9e82b764e857d33f3c498875')); - dbms_lob.append(buf, HEXTORAW('2f16cfdc04d71010e1c0543d10af43046425d490890119a868277813be11cb5ad6dee704046b9cf8380abfad6e4365e4152116bd5bb4e63349013ba6f578f50749e99ba51ed8379673e74831dc5531c8815207a0ffc0cc88b533920')); - dbms_lob.append(buf, HEXTORAW('c6cebc72486fc464a0c3cb0ad1fb93be600bc0a782e0cf0d4f7268941308961a092182cb33bb00df032005e01c03311c091d0ee09e352c0c6458d53b6cf8d392f1e6f2e311839253a000338e7464a0c46b7584e004b48c244c62003')); - dbms_lob.append(buf, HEXTORAW('e015c48f4bfd1b75a754b477737abe3f61ca1dea094e382867166cb8da09aaa61b0b7183c937b658d2bacc35ba776f79e2532081581a5e660267436f159ede3a56ed12365fbcdfc9ba41fb25eb0c353e89d7c3b496aff61d7eade46')); - dbms_lob.append(buf, HEXTORAW('8c72e1dba2913fa8fe3006ea17820d52c871a08894b582e3ff09ef517b712a2ed791d6f18fe9a50eb23cf5b07d68ad031ee3502ad1e6e3ffe1a591f7fe759d38f900758c6885ec76d7f46f26375b3a66c512b43a4c0418ea95342d7')); - dbms_lob.append(buf, HEXTORAW('a9da4730f0c007c98552a7e4b1ef99ea8c54644840fe28c4b5473f34abfb39429c75d1906bfeb64b8803d71c5cf3ea03ee6f42a5bdfe22d439d459c4cf5f2e8c2f8e37b499c4172c49279e3f848f8484ef336034e6fccf944e2e43b')); - dbms_lob.append(buf, HEXTORAW('e75e38617cbe0de1e4e38709eaa0e5135057c82c44d044433028806023bf7310181ae7b0404269e7499c069b89cc7f20d739f59293770fdfbf56d3e937587c99deec85a289fc90c2d6bd55d98233739a7ec570da889f44b0cb1b691')); - dbms_lob.append(buf, HEXTORAW('2308f2cb2f8603b098543b7ba72af222c79f04781900af00e0f103533ff8b9aaa858b400780e608307910dcfe5417f55bf8222de6d5225c201c83825bfc460c3731900af00e0357ca0369631f038bca41883c89975b67b53e197cef')); - dbms_lob.append(buf, HEXTORAW('b4fb9174fb985240eccc68b2a99eed0060212014283a2bedbd316a9addbbb2aac6ec3fafe8b492080178c27321886086f5fbc8ba742b5e16d305f3a4344fb229badafa224256b580f5b42eb4639c38598fdf5843ed3e15c40d51d1d')); - dbms_lob.append(buf, HEXTORAW('4090bdb81a0ea6ea6aa85f12e2e26db7560de82ac4a11f743be65177dc72459ebbbf7d2a185c076bc4d5ae9b6f4a76da9bc7dd2a0feadd6dbb5c2d259c7ef5e7bd78d1d342f46edbffde1692f5397848c721650749823664e95bbb1')); - dbms_lob.append(buf, HEXTORAW('7c9b1ffb0ae06770411162410261bcbc350cff0ea36fd0fc948bb5e883ffdf95f136ee821c419a70c3ae4e9de421cd0e5a0198f7493bf3d2fe5a053e4816bd55b9fc5bcf24c8c1b8e37ce5fae3ae502254aae6237cd5f18e099f659')); - dbms_lob.append(buf, HEXTORAW('811573079abaf5e5766fca7ed66dab995af312cc17645e20427fa5375f6e410984c781f80888b1a4063db067058d374847c8bc081349815a80701db84fd63d2ec4c29e855bd63e22ff4fab5e7de345429c78cbfffcfb3f374b54c36')); - dbms_lob.append(buf, HEXTORAW('9b7755a2b1fcab262a61ecb89c606381ab662d0adc2289025f4c6828d8346e46cd08c0e57ee9e388d51f0c64211118d8c56218a8cf07b7c8f0defcd061b03a4d5465d24fdbec842235736c0031315e15dc8e0d9d00f484a6e156abf')); - dbms_lob.append(buf, HEXTORAW('2f62ed420b47355feb07e201fdf5c685f0c987fe67c17b553fc17887042a6e1cf03d2a30d1f18d8b03fd0803bce1000f091ec7bb90c11b1e302e850c9ede8f4281cbdd06787c9c71ded4383d21d4f1375c900a2474178c5039d4f0b')); - dbms_lob.append(buf, HEXTORAW('9053733c256f574ecc089c7cc9c078a7b636f769465242ac4990a4fc40bc6d386f9403c102f87b57deb187e57c4da8bf93804f43b1bbdef00ab7cd5ded175cb3fe75f28c407539f3ea26084faae0e541cb5a8aa02425b0381974848')); - dbms_lob.append(buf, HEXTORAW('dcefcfeb79c359a7dc26c46129475dfff86cd7901e1d1efa87d7ff288e9d791d68f88624577bd44f42b41407d9ae4dbee767a7e5bb75e6a053d7efde2d71eb5b7b6ca1fca0aeaca6f9e276f20c59587fc94e8997b5c8aaaa7d57d64')); - dbms_lob.append(buf, HEXTORAW('32dabee3e09efa1e8837592e4a6ffa5c9991d24614ff973da693d6e90f5a6d49d3d24c108cd0a1dd0fd18e1badb96346b26dc837e934be2093fc457e86ddff8f2f9f3cf271272fd3cf0ef6713fc22369fb82f62edc89c9a6bddfe57')); - dbms_lob.append(buf, HEXTORAW('aedcfde75a60d0a3e0e480eb36fa37d6fe2bb43f869a393d245ff691048245526955f008038ae25369a1ce136d2572884aeb7f78a75c1e31eb2a8abb7c2c3986c31fed71e3c152226932b6594a8fdf8b384e99eb10939318485564d')); - dbms_lob.append(buf, HEXTORAW('6ad6700bc028097586228a648f4bd53153189218ef3b6015e1ef4370cf0748981ab8a8a81e3251b922107974962e0c6ba71ba7343032a98c4124309937cc6412eb1814c62301a17717e133b51c4d990745522cbc155ff565d9e2b81')); - dbms_lob.append(buf, HEXTORAW('cc5cfdc15353c00d1575fb5c678c9c760dd84250e4c7c86997536b3eb9759dcba1766b75e2a7779f1c9b1fd54fcf76941bc38324109454b9c417b08eb96acfcb999603bfb31aeab7cf763643a4d5cbfe7c3cfa95822786c5bcabf2c')); - dbms_lob.append(buf, HEXTORAW('ae1a0a9bd978d470d1b0ff9f980b4210f1cbb5588ae6f1cffd4888972efe6583bd2ddf4f716c79faf5f2e39027e41e371b035d55569a74453eb7b9c2b44da9f9a5c79bae49c9bbcdaecd9014325a158d874f039f2fbf4922639bf9')); - dbms_lob.append(buf, HEXTORAW('7e743bad5ec23377b70cacd6977f5970764cae294ea580e2a61e576f89dac57593531afbbeca0fdd6487c730d1225d700706711d3fc99ce1fc0b7eaa7f287d7cbf539ab7462d927304f2441a3e481f386f3f8a2aa2977d91055630')); - dbms_lob.append(buf, HEXTORAW('4bacf886e2cfb8a80ac5515a9b26c6823e118ad7f4f4a9a7cfdfb90e4f1ab36956f7693b22d1935f3f5996f4bd1f395439b96c8e70eac3e78ecc99273b4aaad9bd36f10f1c6db8c58cd554559b0a047e241a35445356d2b4ffee91')); - dbms_lob.append(buf, HEXTORAW('d49b0eef961b8237fb9fa9905674e96846ae9a1b3cf99f88c105f1ff261fa98a385587ef5dcb61f4a4e6c7d9f65d33e7b45e2e594b7582c0f12eb71eb8f3b66bab103cd0f73addfd62da1264d8f168d5715f5635e6726a35ab2aaa')); - dbms_lob.append(buf, HEXTORAW('27e70702569434ad6eb2c89247036c053fd26db4623bdcef801d2581b9281318814d6f58f1190fc0f9e9e324541226f95aba08ebb80ca2d3590dd170908dd0f2209488b6b5b2d88119009273eea1210d9ffb580871a8f121adfdcd')); - dbms_lob.append(buf, HEXTORAW('8e7dca9c15b27b96c3c54bfbc75acdac1c93213f65b62a39e07d56ded9b95176dfe5a8ec32def5d3fb9addebf6a50752001a9fe03b45f16e2b49b2edddcbd9b10c71c715ac10b27b97687d0e466634522860bda7870e2fae5b601a')); - dbms_lob.append(buf, HEXTORAW('3513fe178908a9933145c65c4192b4184541b0f09cf82b60e2f797c8be039d5c6649444b8a11dc40099e6af08090bacf702d82780eff6d19bbe58f06f21be7974da9a3990fc13558eb47e519204d51519d1210094bc1021a928b9f')); - dbms_lob.append(buf, HEXTORAW('3ae1501c50a7a60ef0a2720ae4ef2d049dd9e7275c63f5db8f20efc1ed36ea742923bf4c76f0a2a84a6bf57350678b911c35d671ebff348d9f17e951754e43bf2bbb79a171cebe6e2416fa87ca6032e56edead6950f9648d2f16dc')); - dbms_lob.append(buf, HEXTORAW('7699151db25617a7556edea6bd59338704889c9eb060f0cf073a7f4de70c5aa582c712c6a999b76b810fd870fbe2cdb8e39059c71c92512d7754d4b0e7727cabcb01596c51243b778d97dd5f79c2385b134e68612646445783d019')); - dbms_lob.append(buf, HEXTORAW('e03dfea07bf6de294e8a056ef1d076f1eccbcce689c698326c6db070fae041e6c2d318c0b872734bcb98e7f1ce4fef2e08944e3529b555dbe658b104f9c73cd7537dca0bea850245b94dfa9d73b77aada559db80575fe683371ef0')); - dbms_lob.append(buf, HEXTORAW('769f7c591954d9a0871eeeaebe76dbbc51d4fc4970869be1a2772ab1e0c6d07f054e36d1be6c764cbc8268239527b9f693db0f9af1f5a5f512d39f182b4bfbf7b8364782227d42eae8683a51c547ad5703570e5c7429cb0f89c8f0f')); - dbms_lob.append(buf, HEXTORAW('9784e5a453cfbbe5c543e45ebe32a557ab0566f871f8e743db56fd84b6373ed9da78240f8faf2b9b8d8f93e478e07a56f0f269dd2687af7ffef2017ed03e407c75f81c5ff44e34ec8b65cbe7defc9a3c07c76e7e62cb44309ed37a')); - dbms_lob.append(buf, HEXTORAW('0695eceebe7a7b273c873772220345f7e08057229edb2491f8cabe0a243415478e53f59005af5d23c49513f2ffe348c4ce7deffa9bdca4636e419b08a681c68ee1c6ad3c19ea7e42ac3a6dfe81ab25c57cf7ac870ef9e30f427cfe')); - dbms_lob.append(buf, HEXTORAW('c6e897cf6f2107e5a25d59731e1714a9593ba0eae61fa588376dcaab6fe47e28c4dbd38657dd3243118e458a57f50df46e10e5778197ce4ed0fd9695410d46d532d025ee3847be376b774169a9109f38af5df05e6f215efbf4eed6d')); - dbms_lob.append(buf, HEXTORAW('7ac16e2a32f5e5efa876512e7c9bbc4f76e364e87451a0fa7486f88a43646d44380178b78775804ab17990d014b0111f53c72d910f14e11f78608e74644bc033c91a3c17344e27ef823bcb57ec4e1a7f7c3d123ea699ccf326f0753')); - dbms_lob.append(buf, HEXTORAW('6930c0ea52a84d11de384e98dbcdf6451c67b1dfb179308cc720ca80108def676044337c1eba2a34a78964d0aedcf9e07b0fc9a32863fdb119ed8ba1bf92816af141eb9753ff21c415afdf7ffc1db74bc23162e08bef6e9407d721d')); - dbms_lob.append(buf, HEXTORAW('63897703436a23ec1ddfce184e3c13354f0f1308f0fc2cf6ad4789823f693c397cf5fe0bef2e1dbe0fc61060513fedfcf99de767eabd8933e8697ae62fe82d5c800e34e08439bd94278db5ff6b50d04240c324a4ae1ab775df83237')); - dbms_lob.append(buf, HEXTORAW('adb1b52254f1fb3942342f6eb5e41ad9d1eeaf9c74847bd02f7965e69aa510928f5e1314405402801d55e100442501da192ddd5e2e37c0e267bf3ce5d34f2567b8f188b93f49ce70e6f071bd5e949cd5c6c7563fbf0d44710c84aaf')); - dbms_lob.append(buf, HEXTORAW('b93aab97b62f52950a397097a9f804848ba6008acaa7d06da40506ad17be57e49649ede3c7ed77342140f9879c8a7a70971d4fc7ef77791fd485fdde4c14e19223ea02e7176559f3714798f65c0a814c4fe722f1b54998c06afaec6')); - dbms_lob.append(buf, HEXTORAW('deffc16d0f39ca46634d35a8b84a1a0e7cf4b929e6800e7f2aa89cb88a2bc08dd9a74acb010e8fe0311517a892226fd43d5d2e198559df4da89ad24e3dc9afb2a5f8865ba18d596613a9b09ab6badf5561753de784ee3115164a66e')); - dbms_lob.append(buf, HEXTORAW('4dd47b622e51cd1ce375f05d04f9df3cc609c32f7ba9b0af04c2a2eb32d4a839f7a69fa55ade4baedf2d5710f9df3b614588f3ee37727ee12a24ffd590f5fdf4d4ad607b43cb6f7fb225ea7aff035ab3c1d6861bb00dab91afe45c6')); - dbms_lob.append(buf, HEXTORAW('f5dbf07894c029e0ad2b1bc627a3a1f1f0e1ebc1c7534587b7a7f88e067826155792f87a92148e23ec0b5071452aeb6eda7da21013fb3cfff8dbaed7dbf3d1f76bd1eb0acf27e63587b6adea43551d81f88f48dc7a8ed59cc57284a')); - dbms_lob.append(buf, HEXTORAW('1ec2b09c4863aacb75d82122d89c63616716896283fe069219a8d689935ea65212edff6c0752f7610e2d017ba0d6a0692890570b063f578510d1ed4a05270377ef48afa47aaa4c8fde9f3af4d9eb043882dd53f0cdaa2941ba26234')); - dbms_lob.append(buf, HEXTORAW('d428e24d85badc507f08f549ac0df5eed7f59abeff9b1f5eed84ead777c909ffe0f6a77b3ff0a094489e297fed9b961e2722fcd9559d589b272fb4d5f30992eec5da71f06c8017067885002f0cf0d4ef1d8207fc46d48e7f2fa53a1')); - dbms_lob.append(buf, HEXTORAW('9674cfa662b780cefa0acc6e328058c03ef054e0e9ef75f99abe18dfda07118c752ca18c6257247dd0d55a09a3116c0c8554d265172155ea6943ad0366547c6f9f22545649223bf67e6988653c644fda931d838eaf88a2a7152ca97')); - dbms_lob.append(buf, HEXTORAW('9260fcd4a2b97bf3a0d526747af327e3e08775f8c29ce43321fe22e8c6cb64c70339faa0ecd6415761f36cd9fe248689f135ed37c7908cd4846fc0cda5512f755196363e006fc7d39b6efbee12d93ebafeaa7ac6d804d5285113033')); - dbms_lob.append(buf, HEXTORAW('e5c6f071bcfb1ec2b09c456154a2014e1290956af57b35a5f32517e3729f47aef03848f330a7d9472bc1b917e44e7ccf1bde5371b6a965f39ed13b9be57edfe368a0405e0214f8057a9d45f0b35da2ac0bb00757a753da086c8d75a')); - dbms_lob.append(buf, HEXTORAW('3016d600e789c6c26ac8c24a9208506cf2af46ef068c13000eb60e03ae90b2c34d6c75433c7c6a2755ad7139dd8d7d563d34fd612979f5ef37e4fcb9b24fbfb31e6bde3381c4c0bca11a8878571c2f1ae76c901838c7c5bca17c5e2')); - dbms_lob.append(buf, HEXTORAW('5dcf6e0c1ab80e7f43810b3f112df9301f0543f1a29319838679ff13d07e240a612e7efc05fe41463cf573f5ef9c5c6638498b3794acde72c25874f125d0f6d304252e015d4ae91514a20bd5c09a4cbd9277ca8241070b3e511e4a3')); - dbms_lob.append(buf, HEXTORAW('75af38cb176f14e02cc125b279e86d66bda0c6c710001a646ca6f9c73649b8ba445910606c3644bcc771f4008f38fac4f8068d47d03af02460abc1f14089b724d0f6a2e34bfb03e0737cfd124e627c4bd87898e62f3bb144b9e2866')); - dbms_lob.append(buf, HEXTORAW('fb74f3a4888e5efcffb76354f2dc334296444875433a84921891a090ab03cfce64d73d9470484dc77c3d0c6009f755244be3c6bfd25cfc8cf2eb32e74233b4d399042a194f69daf13a2eb9613be3efb47c919fdabc5b5df5e2009ca')); - dbms_lob.append(buf, HEXTORAW('f815d377802d02fdf2a31950a384c2ae26c52b35d1eba0162e5ca96103ee0bbc398c7d8f6e8d2c42b9ee5968636e197c1fdead0d1213710a474aa9e4d31d6fb984e9d0a15d8fdafa2f210e7ce4e0d7cfba5ec4e78672605c0c0b8f3')); - dbms_lob.append(buf, HEXTORAW('68a5a685c555442eebb78f087019e5ae849aa8a28702a9fbc78e669f032d8c19fac1bb35f05930df01c80871bc606786a5ce80064de6c53c9edd10678093764e5985dc3d7ff20c4dce73e7abe285f0d08b9abc2bc9317cb36f8bcb5')); - dbms_lob.append(buf, HEXTORAW('aa2371f387a5c531adb6b84e215d17f5d97df7e5c21dcf5cadfffc42a952f0c2ca40c2ccbccb3c6f9b0cd54f168887f032d90555662706058f474cfb097506e001f3448c40513cbe0d44bc27864f81a348a882025603c6837b4599d')); - dbms_lob.append(buf, HEXTORAW('cd983c6a38445782321c88036a98c1a89af0dbf1f9de4ba2d32306ed98c5065d339b92efa85101fad1cf5e62b5709b17beef67fed06679e1af41e44c2810c32a8b28890c07986aa2bbae80b0849f2570aef2b0262e9757ca468afda')); - dbms_lob.append(buf, HEXTORAW('33465c2c452f6b86f5975eeed2f74da0eef5639d16fae3c172800e7ea7e3c84193a56432f6987776ed9214f898b97f2b768d7e9f895118f18efef9382014a888feceb7431b6feac203033950a0d048209080d0cd5e90248e72c8408')); - dbms_lob.append(buf, HEXTORAW('ea40824e5237f6a885846c907ef808eb01bbf5c896a45c6dca295f2b93e9d063c30d09163f46eca336d8e12892486d871c775a10d2c6c95d2c39c1b4a3def71a0ea3d9c132b21c9a788c1b3019e76f007725e96211300da623c5dbb')); - dbms_lob.append(buf, HEXTORAW('0df054bf4d9cb945fdc0f88af60d8dcb8e6ea55d162e1462c1a8cfc5dc52d5614afe87840475c567c1e760e3c21bf68880480c5b0c3cf0ab5429a97439fcf8f6b15426b61c319180131d0d190bda91575c41accd75e1e61b367578f')); - dbms_lob.append(buf, HEXTORAW('3005e18bcf6826c443c62da1ff18eed5c68dbd04b1d9e39e2bd40c3d78bafc855fd4c52420d1a0fef8e70be0e6c809f9b683c8c11e445942f438797ac44cdf11d4d84a933400def09be3edb11c47155dc5dd66ce569427c3ee5ad4')); - dbms_lob.append(buf, HEXTORAW('11f82b71cad5b94a08111260d0aba65e3f9067504d631119046abb0f6b51756186a5b55ee104697467fe72e85e8708c1c661703a1ce2f076f9803c1ea44f117d76ba4cdaa430e7a401ec4397ffa7bfb918b85386475d75e6d2e86ee')); - dbms_lob.append(buf, HEXTORAW('3ca4bf1e25109400e860b848d55520caa14e1cdb6834a71c3f6884fa94d56844afd56b5489d5a228f9771d8e6694bf4df472fdb2ab6fab983c6b56bc4e95bc316c6d5cc2ccc660ba000bd3cc07a46bf7ebb27db61284a7dd2f62d4')); - dbms_lob.append(buf, HEXTORAW('3507a453275d3ed90a0c69c54d1760719df070ea87cdc6c5d1e1a9e777b62f7d68438ff89ec6e980d1eb0445f941f13d10dec6c2dafdee2a826543bfb2b4fe23fe7863a27f7c13dba28cb60c80770cc04bd646e4e8f03cdb00c337')); - dbms_lob.append(buf, HEXTORAW('783d986c6709e1474d17956519f0f5db067478a6eb068cb61e80671bc6c3c33ffab3e0ebed8f84fb2d597ce3c6db01fc63f0d6a62d7eb6507d425e56116048f19ce3353d870c2cb381708211ec7d85653fb9f152564c2726265d1de')); - dbms_lob.append(buf, HEXTORAW('3016c66546513c8af8ae546d5f4639be566c95fa414a6a6377b4241483b5bd598fb069540a4ca8283a3f628a841e423d10e233991400021c06c95946c0f251a3e610fe8cfa34aab96a5bb265d24720892a0943f525638fb766d5c00')); - dbms_lob.append(buf, HEXTORAW('7bfdc0a4833f7861dbb1cfd13dd1605c361efc85fce0f719f1193cc3c1cf1803e1dd07720c3c67c37bf1a077e2e105deb36293317310eb874650715cb6166f68bee16dc03c6aa8c350c3914fe6704e7050e48fc7d74fb0551b8dfcc')); - dbms_lob.append(buf, HEXTORAW('c88ed1df4cc481e4448f98d9d821b69099e0e9f5f49ccf1e54661ef601bde20bed1c4f07df3c40fceb03e1e41f7d724bd7e931d0f8f9014360e5fbe1f38fe81fbad30197ca3c01846064406574909d7f96cccbbb3e09c8b80ad1755')); - dbms_lob.append(buf, HEXTORAW('ab980414cf1f1f21c15c576cfd1221b1a1764492655fabb080705072b33f0a9179e9e9cb2e961243e8f194a1bd5a8a7811db89fd0645ec7e24f229674b6654adfbbcbafd5229397cf5ce84f1e3c72bf898251507060f74cc361981a')); - dbms_lob.append(buf, HEXTORAW('b4beb20608602c230491e1a495105863ac223f59a6c2dc8a1420428ea0e6942a04d4be95a68db50e7aaca750a68ff7da7c56e60e2c11b3a76cfeb171b1701e352a08d8b29402a83b9fb9580111d5551c62494f07ca01137c9fb243c')); - dbms_lob.append(buf, HEXTORAW('5d33aacc04c02b80be2b3cf349459003fd28827e08c0bb2021defeb4f5086f18c0cb4b3c2e566ccb3aa78e99f366aa10bbc66c5dbb1b22d16b408a20d11f25d1f7554dc914d1af1e55586b85687e6dab9b5d1b48977f1d7f674c85')); - dbms_lob.append(buf, HEXTORAW('6572cfcc82c0bf5250010645201790f13917e0d9aa5f002f53a9eaac7949ba419bdd4975f85c05e3d9063a37882fcb2e8b2a4a2f4b32da06d87a2b602a234fa55a04fdd2f1f5dc5cf3607c747864d44f723c7c467db2e1a8b6d109')); - dbms_lob.append(buf, HEXTORAW('41cf864bf8fa03406d03be5632f8e2fedd7cfaba99d31f1262ceb153de980daa739f711c6bd4702c85ef8151e6ce3ea44a87739308c75a9164d9d76ebc50280ec4fdbc507ceebae5468d2276142510bc7a3621e5aeb4cb5f5b0321f')); - dbms_lob.append(buf, HEXTORAW('878a73546b0f3ec9ba4da824339ba48d5a4e2eaafd7148063727f43112f47ef2fff1e27884447245c4ca27125a19297163df5c381c03917261a97645545b00cc62679039dff0e7907dea3493e283144fd2a3487c1d325061367679')); - dbms_lob.append(buf, HEXTORAW('21844e3541a096e244cc8d955debb7b841b67f4e345cb9d1d10df518f841d6be4d0701e619d906492150f512fc6f51c656ec6d186dd338d9c2ee7948b991bb449b517ec4ecae13bd0ce6a14be519f0a15f177a09d95103e73571541')); - dbms_lob.append(buf, HEXTORAW('3781728924f9f59b783c7c123093d01a8b2f977092c557f8f085f18fc676d2b70f7d72e23450a993648192076388a9e64e3c78ae0d8f7f63dcfa86759f7cd9df91e8f92eb58b2e720fd4a829421323b133e9ea59f5398b742defbd')); - dbms_lob.append(buf, HEXTORAW('e3e09f40254577599f0b35de690da9515250d21aa7d7bed425583342c007d8a8fae03527282c429426da2520172ebaa5ec5cf7dd910bd60f4d342ebe71c8d2c74fbfe3dd1799edbf633c8bc1d3e7c31f819bc9e099f00b27c4cf1c')); - dbms_lob.append(buf, HEXTORAW('f91b4e8c9fef3955fb2295c1629163e807e0b1be68f9c58ea3c69b083a4a9c98c281ab24f1c229e4d490c084a196906b2ea84c71bf378e0bb6bd3be5c31afee6fe373c3fc1f39595103e9f87ac86e1fbf0cd6a1cbe41f823bca4c7')); - dbms_lob.append(buf, HEXTORAW('c3bc1ff66c3c4cf0ccf39914be4111e441e381eb7ee1cdd327bfb44c88efbf2e9ab61abc4b6b98ea9d246696fb0a55f474f32012129e34d16675d2657f131059a2cbea2f8805dc393aa729b871ce33b2ab360f3c3a2c7a76ea230a')); - dbms_lob.append(buf, HEXTORAW('26e5d24a5575ca0055d3d59478c10c3a3c16072019065ce1e06ffcc0eabf23420470894021018b272c9dc45a37d797715cfc014dc3d53b98aefc18c691fb395a5bc1d34dc451936efc18e6f41066b60d8749263e9d2eebc73144c6')); - dbms_lob.append(buf, HEXTORAW('b3583fc21ade6663a8de8f418600c22c455abfeb515831076c6534de983a871b19f17b4e4060c3c5df35bdb3bc343346801e12ff709d217cf36653ff6d684735fcb9edcfacd3d7e77131049e9a6c45c1c6db84fb2fca25493b495b')); - dbms_lob.append(buf, HEXTORAW('94095ff3fad2e16519f0e53699e16cbdf9ef086fd478c449128e86af49b2e6e3e19f3f24a476427c93b5f501be9fbcfaba331dce319238507381b656544d611b6cb8c408e17d1f1ac6c22f493ba291655f1110c7fc55b42a5ab77b')); - dbms_lob.append(buf, HEXTORAW('72fc428bb283868c51902b891d3ca0e24ae99352d9748e8210429515a685c78baa30fe040909deb4610332e1807ed801df275b108e03356c299cc8fa7842522a3a366d1a6b6a1bdceffdc48cac5c45402a0ef5bc77501b1676d4b7')); - dbms_lob.append(buf, HEXTORAW('51f48dcd5526fe833f0af08603bc30c04b7cf01753ee2ffd20e2c64b5f843033dee2861c87c65c1ddeee8edb9f5b364a885537ce9fb969930248aa4bdc58cc8b8502510d91bbb46e602462df1d503f77f71d22fe0009c3b8e8eb39')); - dbms_lob.append(buf, HEXTORAW('300239ca0f7a369e001f72a7892423a68d077d6162959979dd717cd97c717c03545c81aa5aee1516a4e26a64047934ec234c3afcc68f8703edac84f89abc2619bebb7b6c3f78d915724d7e5977335d7486b60c76f119d52871a066')); - dbms_lob.append(buf, HEXTORAW('03afaa652a793a7f6ca8392149baa4ece90f1b2e74e564b65ebbc6f4a33a9dbcb4c7e3525a589d3ac4cddf2f20ecd0e2c62ecfaf9f5d15ab9e8ffc3552b863be102b3ef87ae32c50651185c6fb1d1885ae05ef1b8cdbc0ab4cc938')); - dbms_lob.append(buf, HEXTORAW('be063ae0ec61c74d65adaad0b980dc9a95592d2621f5fdf8bc875b7f22c4213bba0cb957e55eca73cd701633629b8c96be34e03960b4f522bd99511c9e4f36e23d13ee519907f79e987270251bf19e09c6c5798d355e1afcf3b320')); - dbms_lob.append(buf, HEXTORAW('97582904d6c1b8ac1efc7dcf897f95ebe41ff32a56a0771daa00c0784e990720130119d3c11859f78eaa493201824359a6d7c9ee743d7df2607784fa586d3adcd3c07af6ae3e56fd2d51712371f3383a61ff0d7152749f0a18ad13')); - dbms_lob.append(buf, HEXTORAW('dcb0a9569dd159c2179867011e0a7e70c4b4d520be682c6611e409e280549ba52bf7dd6343c66780b79711e45e3b30275972e361c16e0fbe262121bed18b230b2bef12e2c3ba178f72efa4dfb162d3bced10c85a839932c0385e75')); - dbms_lob.append(buf, HEXTORAW('05b4d1688e1933307e0d8ce518404d57d776024c6ca197b5a291655f111038288970a064200fcace438eefd1fa2221d2bb37abf9c3dffd1b830e9a7c4ae9a17be9c042083d9532c935962fa99d593ab59ffa023948242038705853')); - dbms_lob.append(buf, HEXTORAW('4a0a14ed56a99a544c9ab02d3c4e736dd25d6fb8005c22b050bb12d2299f5fdcefd85b846832b4c5c0bcf31b1897d1466f1d5c88b1b748c2910bed79f1ef4a7a6197b088e47970e1559037d4681a35fd60f2a7e2600431e00e79cf')); - dbms_lob.append(buf, HEXTORAW('6b09068f6df879ba5757a46fe45c57d29d78e9b377bc243754f5c6ca6995b0e16a1981c08d878484bc5bb6c3f390f61ddd26f9fd36eefaeeb1fed4bb4f97eb29342c745a4f77a4bcf4df19b167319dbbb79e470334d5ffe4d37fc7')); - dbms_lob.append(buf, HEXTORAW('e049c2d11eda70877ec30c460311deb9eabd041fdadccba8e1886923be2574db4f1ec00f27c437e8022c824f8c8f82976c04b9613ce292992a784111e441e3c103404b1a87efa2d367747b79b910df144cfbf762c8d987779863ba')); - dbms_lob.append(buf, HEXTORAW('7dbccf03e3d7f08228b4819084020c129e733c43c75eabe8f71b0141159294400ed8d836afa25c8883761d7aea5fb6c69eb2dd5427164fade045c4ea17f0c084847aa40c3cf04229ea5db5fda019338428fb7cf3524caf5e8ba944')); - dbms_lob.append(buf, HEXTORAW('30e508729c18d701a947ea4e5035456222655e0b75186aa771fd37155f8a171c9f3784387ee23983cf1a2025b3c969a75fd025f62d1e98ea692e3114b11b03b9bb6e0e480c53496270e02f2e6c07e0a9dff31b036961c3c6c88103')); - dbms_lob.append(buf, HEXTORAW('612acb32cb73701922dee3e0a9f7e480c43015e6976fc41276d079d94a75bc9153a4d41e8af15877d992c5932e1562c16d9fbfffdd0ef502cab67ba55e1321c100529448c02db20e52dfa06a8b245528ee9dfe479dd9efd9ae727d')); - dbms_lob.append(buf, HEXTORAW('a76c4ebb23fbcc04e3eccf8eacdae608f20ce87faccdddb825398afd5e0c84f1f3180c5b835f409cb30ecf8bf0566d2f82bc04da61c05f27fcc9e2eb3120d9807f18e01725856fb62f823c4383e7112a7d7d992454c12ea82aa10b')); - dbms_lob.append(buf, HEXTORAW('aa609e70bd353227191f0f8b13429e832b31bea5e11f87bae7d8077ff9f7f4f160abc5f55ad941d5d570052d12106ab3c067241c18af863901298d3b128e0ca81db187653f1bd15d0e7ffec269f76fdd26a9e2c591655f7f1dfb340')); - dbms_lob.append(buf, HEXTORAW('c7fb9eed38e7d1ea05befbaf1844bfa834a81c79d58d3f5766809d4ef410dcf939b31d44438c27bd2cb0485c121028bef7384481b94bee1cc0e0d1ae7c2f0acae733605788d6336246f9c193cb49d446df81c6d1b4e627849bb2726')); - dbms_lob.append(buf, HEXTORAW('345a12dee358f661a1eb861b1df15e0c92c7a8baa9ee7d318591b71f9806e9f82909226c28f44ae13a65d41d932d84b97b93111d4614379e4b58ca3a6ceef4f129c26ccb209b1ec39fad676f1e13dbfe087e0ef08d30bec66cb3cc4')); - dbms_lob.append(buf, HEXTORAW('81e940d37c17c35b8ff8cf84669feb212c14f1a5fbfad445f5ffe7da2e36bda27c375a7019fd38879fd363c1ed1002339b31d96656d39f3fb4b84f86f97c7ae1f05aa27be3ec9dbea13bdcd039fc9db0a6d1fe814a28d54dcfab5c')); - dbms_lob.append(buf, HEXTORAW('55e967d2d81600d3c6bbc2aabdb8d271edfb6af44e180f4c2ec6ce10f6cc36cb2fce62fa64b6dfa5ccb6333e494fcd06a49e9d46239a89f55ae40dd208a6e38b0357de073e6474d5e3638b0195017409d0bb593f410e805e090ca2')); - dbms_lob.append(buf, HEXTORAW('31f6a49d8ba0ce993e7ba21670ce9ddf7b977e533b345bb666e3a787f6e28f576ce819902bc7c3a66e08882ef90470e0990060e330738b8a94c22f4020805c02b0078c8e13a002f1be03900af1fc083d131a9d0b8caccc0d965aaf')); - dbms_lob.append(buf, HEXTORAW('69a59dfcd1f3b4788ef1efce22d37e7955b304710e604229515ba3fb2eccb6803411d72046e2624093517fbaaaa90942c4b9e5ff8f87629011f7ddc690b2f973db3beb1cadbdc1e879f0db63e5f7664d8c619600bf15424163ca7da')); - dbms_lob.append(buf, HEXTORAW('0520bfc2bc490944a9140772152271dc20491247afaf03bc2a958fa7ff8e70862f9754c9f696789de52699838b2495007cfd39b8747c4d7790737c4ba85d00ed8c84f0837292f1f1b04833a0e019727055cc2d5bbe42128c31998fc')); - dbms_lob.append(buf, HEXTORAW('e78f2cfb10be9dead5059dcbc24ae205954808abe1ace354ab904eb95182134a2a35b3ad451d4b020abb6166a47ec65d9c7048422ad5132c0a48af2e06cdbace3dcedad843860c94157fcc90d04f4eb3eed584dc9e9885eaa361c98')); - dbms_lob.append(buf, HEXTORAW('d677a122f74ef4832e3c2cd78df45ef3c682d71740a01837aa9331e946a89c40844e00001c4c494441548f563511103ec0af431d2729c44a41d008e8cf63fa79b27960fd8610e7e5dd34e5afcfc8a9989f3a6ba01bc9cc23598dc66')); - dbms_lob.append(buf, HEXTORAW('538e84daa01cf58cb23bdd5f7a6acaa5e1658077eaf36ca545fe4b80df032009e03f0f483df3b386cf87d1ec0d3dbc9a6e93644bcd75d573d73abdc80635e7bf4a0e72546f56323c5b4119173830d59c5084715e89089a383e47498')); - dbms_lob.append(buf, HEXTORAW('7433f2aeaa697d20a3a18e742d5968f793fa0d3d52129a50e79473faf513222ec2fb3ce8474b357e487e0c4e249e0a86cf9b1a9781e24ef89d9a67ae82290960300cb6810446774bc737c96cb8088fd2aa9b549e0c7e10befc8ef01')); - dbms_lob.append(buf, HEXTORAW('2dd0943f0bbf80322c805e2c79d46b88a36d9f1c880effd8c500c5ec5e96597af3c5c88f71f7dbaf8898142ec7ca1f48b5d23142052ad628e3e24202a6da6a8445b0710125ad7a8ba02491a8de5513cd710d302a81df133957da4c2')); - dbms_lob.append(buf, HEXTORAW('f2b98539f0392a3fa46835fbe5f7aadc2b69eb2745be5fe2c66570916f38a6232711d08e871265ee726daf3cac26679110bd1fcfbebef72dea498c4477534dc4ea54a8e1e0c038120c34a4c875507d910405dd2042801fd8896bfa1')); - dbms_lob.append(buf, HEXTORAW('d7b3e0484c855ad5dbae9ce4fdd9bdf52e7a7df606789b8c86cd93311a7da493e3256570d7891de8e0e8fa98a7c11ea0655d170701b0dcac1956c72442f729cc163eec64946bcffd86e45e9e7cfc943ffb29a7198b4323ed23f56b3')); - dbms_lob.append(buf, HEXTORAW('7b3f303b29cf0c40eebd90a286447f4d7927fc81a312a3dd39db8f8e397570f7cce110f7e2b079f4bb4367b17189c6f797543c6341c56b52c1f0e4a449469037a092dc337c93cdc165c697c38736c00b7267770c714b368f0351e3d')); - dbms_lob.append(buf, HEXTORAW('a08156dc2f1f0abcad4f75b0b7e3c7ae65942bcf5a2ddfb61596f5bfad3573bc0664b2a299028785257aaabf5e729fe23ee8efed83b794034f608199f9fadec2309048bcf688c072a06f649dadef44f2dfff985e4d8da2c3fe4d63c')); - dbms_lob.append(buf, HEXTORAW('5b7e38445c997a968873df0511d0a6fb007201a6a380c0e79d24cdef2244bb778f18786e0f210e3feae84d4d25e7b86ae3b7abbebd50bd0f250fb1595538e05658c79328354a1e79f09cc5fa63196ae061425d549df206d4b25f7f9')); - dbms_lob.append(buf, HEXTORAW('8611f7987241ccd1e6bf9d23b6fc7f0bfc6bd09ce1a692982d98e386d8585973e3bd6ef38ce477d6e037d2ba1cf15073412daed54d8a4275930d54891d07b65c3b89690224f00bcf3005e4b801706780efc3a03e0091d3fa62210d0')); - dbms_lob.append(buf, HEXTORAW('0f0f3fa1e3c7eea7b0e17e8d0ce20033a09731bc4b5bacbf64865c4fe3a63e71fd9beb152c727384ab91dd24746ea9ac84fa23a8f17bf072418e8e6c2290d9a01eee5b201516f6240c354820d65a2901bfb7e02337434297bb8f1f')); - dbms_lob.append(buf, HEXTORAW('ed322e299bd2569d7a6aacbf5ba0bf27417fd702ac0ce8979a37baaa18dafe7156e3d142cc85b68297cbe0d9d02e61f06d9d538ee3c4117e18debe36beb77b8a6f9c4a2a0cbfcb80df69f01bc037231e5f092f17da1abc24f05d0b')); - dbms_lob.append(buf, HEXTORAW('cf69f88acea442cdd84bf8561c54b1eb93ad35df3d23c4c42b9ffb6fbe3c0767df38615aa11c89bac2da372a4f56cfa031bcf272a8c1468b2a2bba39b55c7f9eaed406c983ae1960f11e941b1025e7b0f899cbbe22206b55c50f54a')); - dbms_lob.append(buf, HEXTORAW('ae1407603fd36ce5bf5df8a17e4869b7fc2ea56f32547fe4adaf893dc3cf799a02ac19bd73c115e9125aecaf1bc7e6cb76afa5c8bd37af796cd6f7b8fe8305872a8ad97dd33e75a79386cae7eb60e0e882824d32333b30df88d66f')); - dbms_lob.append(buf, HEXTORAW('db0597f4aa0ee9cb89f2120182e0169b1bb75852be90c3af39ec71e7958f6efb5d4290fb8aa3557b4ce8bc33b0b44e1525da71ae83668f2563224eff379bf08dffd0628723b002f1be029afae71e0d5956df09b174c0565ba002b0')); - dbms_lob.append(buf, HEXTORAW('bf01d872a02a6d20a5069543d5df1c98f438578efdc27434f1f283793a89a500984826c19c8d1018120f747cc828c6ebb702f0ca9acd05f1e37e44dd0339bd5c81001d10ca1a429d77575a4fc964552223eb453f727af7209d349e')); - dbms_lob.append(buf, HEXTORAW('2fa1603ddfe820d299bcd9bffceed0c18970218171c67d5f6bcceb40baa8c49128bc88b4d87ef8f7f2881b682674892484917b97b31c3d7536922c3e24b9298781d9bf035dc116ec2374e15aa8f8747a8d4fa32a8b812b8cd17c17')); - dbms_lob.append(buf, HEXTORAW('309c763d103d35b3db750128ebf8fb8ebdd1be4e1ffef1dcb773daf3acc250db2c5c14da74450eed63f47c607555c787f0dd970212720b9e9a2a4910bf55a56ff6c655f4b203a6feb3b8051a5e346924746d7dcba4812920e83babe')); - dbms_lob.append(buf, HEXTORAW('78b514c9acefad1db1886cd3c499379e5ab0a0534fbfa859e55172223b457a2de9fa8dfc608bf871999c98adbbd76f2d03ca4d8403f1c40e00a123c20747381188e9ac4649a3ab10170eb975ed09238438ee8133ad31f2fda1d294f')); - dbms_lob.append(buf, HEXTORAW('3738a85d9f6309a38fc5ed08f30f4836f1085add948e7403b57c1838ba54c07465080176ef42230daf6f319156d784a1dfc4cf7eedb881ebcc457bc06300675ebaa1fdfb64d888faa47e53f9a2e259089eb5fd90ef7bbd4cc5775d5')); - dbms_lob.append(buf, HEXTORAW('8150a32482840475c84860f09e179438d046862a0030c247bf861a3839ea890d6dc650b846f5b2755b46b917f6742aea1d71df9b3eaae91167a7094f7a4932dbb037cef0b6305d58a534e33970419527b1e23c16a8e78c362907e02')); - dbms_lob.append(buf, HEXTORAW('1e140f8b6d6363318050de34bed5c6823fc0c866f4663f025781ec391db20bed90c5f6e7c2f315c5065769bd7e0572d2e9fb74eaefcef7a177ef0a29ce79967bd37eaabff516fc0839e6e38854040b46de07ae4711d14df012a2b64')); - dbms_lob.append(buf, HEXTORAW('74284d3bbbb08e240e18005dd92f7efec0682afb9880709b001192d150838ac7dd78dbab373eeb0ef89107677eb6fb39b9e1ea9b7d73b69bf77e2d898ab15fc771140d6e3c1ed8967a54faca0cf99e0ed33a77bae023f99e493dffe')); - - UPDATE BINARYOBJECT - SET data = buf - WHERE ID = 10; - - UPDATE PRODUCT set PICTUREID=10; - - COMMIT; -END; -/ \ No newline at end of file diff --git a/samples/core/src/test/resources/db/tablemanagement/V0003__R001_Add_blob_table_and_data_pg.sql.pg b/samples/core/src/test/resources/db/tablemanagement/V0003__R001_Add_blob_table_and_data_pg.sql.pg deleted file mode 100644 index a070e18a1..000000000 --- a/samples/core/src/test/resources/db/tablemanagement/V0003__R001_Add_blob_table_and_data_pg.sql.pg +++ /dev/null @@ -1,2 +0,0 @@ -INSERT INTO BINARYOBJECT(ID, MODIFICATIONCOUNTER, SIZE, DATA, MIMETYPE) VALUES (10, 0, 72861 ,'89504e470d0a1a0a0000000d49484452000000c8000000c81006000000fdc872dd0000800049444154789cec5d077c5545d69ffb92d04297d8404db020c15e028a9817052c5850888b65dd447445d85d753fb16b6eec8a5d41455c13171509764511352f7614ac80080a449a0816a4a4e77e73dffccfbc37e7bec90b5d77f7ee6f3d9c977bcf3d77e6cc9c32e7cca48aff5d9b731d618174f552c00114f9cda4db8bc16d754d6ee67d7314f0ca4c9cff3d00e76e2a63ffbbb6e945726a9343926b7e5fb2eb8ccde26ae32f2e7fc92ec8b3677b8eff5eb6a98cfda75cff5320cdbbc280ae024e1ef0df003b00ee88bf17b3e7803b4e92f7d0c0a48976de46f2b9b9d7b30a786e92fba6e0be29e6cf5e2efe41fcaf06fc1a10dfef95031fc9eeffdfb56d2f57012daf7451bf91bc925c5700477f3ad4afc39a7e8d83f78803369ec5cdba52009b29d7de7e0a3ac9e49afecec6b357847f2479cfffaeffd42b0c185180267c0d31d042c04310cc140ca054086cea4d0aa6a501deac608b1680b798b0654bc083016f05fc50c156adb60e24fafa7dc7317e5a327ecfc6f7bc0f38c0fc5efafe941b01430a866e50902620872bd4086058fcefda1a571830a280966718425aae8f5190fa8dfa3120d7e8779283160301494e3e5050cb11c9d5ef55ae312e699cd2b8b5c935c97340aea93d49ae5dc0b0f80fbdfedb3d9030a0ab80f62c4820e83e36e139c702920091e52205eec4d20b96b56923c49ec507cedae502299cff6a35a0ad540ca9d35aeedaee2d298453437f4e4f9737f7747af802e81ded558b1931961c57fecfe76b77d128241daf44acf7ffeefc2caec02d51e8fcec98f815c0afc07da728dc29717e32bef97871a46f29354ca83b61fd7542d416d7fcb6f63221aa2f5c377eddde427cfedadb137eb84b88f7d6bcd0a3bab77ac4c38012cf032708cbcc7b0f1003cef300df357141f7870129a451c1a063d2d70ae67f57f3aeb0020e6f573ed145f03b148743f046f3795fae8767de7a48468610ed4eeadca5f34572926ddde2fc761ba45ca7a535b693cf39f3424b5bc909dba9768ac4c742349ed47843546ed738a3a3445a8a1ba372bd9b926bb1935807b96f9e3c0bc8b31e07cee5d1fffea4f0c6eac6f7ebea84a8ffb276e9ba57a45c2fa89ebd6e9d10bfcdfbf9e835ff924ec8b47bc6af947cff72daca168d6f290a24d75a6e49de489e09f6078422d1f24d3064b62f89bb9e40e8776a6f1790f03fec952ca4f29f7665039242a009cc054e03260218e781b4bfa24b17e71d212e587ddbb85e6542b46dd3b9e4d46952213c99b2c721df4a6ba45de8f283baca7bf70a3dd8ed1ce10fca637c0523d54104ef54c336ac70e9d62b3c0ff85c312a8af7528101f96b187f575c8515ee54e86941e111e079b83fac70799f8bbb8a814780e7a9f703cf1379461b79725c1c2dc11d8d5d974c9403b35363ff05e3e5803cacbacb872f09b17cf477e35fbe5d8847ca479ffacd3772c05e52bbccbb5e3dda08179e42548dd79b38b9f88d6f037f1010fdc207a61e6080ff5328962bac80291971bf931cbb0c9713ffa90ffcada1cd1d52ec86f46dd7f74839cfaf6bd3ed4cd9dfa195a18b7bf490f08ed08bfb3c296fbed2f9a5c3bdd17714c7539352a4702e7f2ef062c24d794b302e5c3c077a5c7e03f21dc1572a7a118b3cd3f59e1853552565af5bc3830b779306d47d0d5fce7f5488758dbffee5f97f08f1e592770ade950ae3c5cc07effdf967f5889647926bc8ad96732ecf24e7d7b3e7c38024bfae79ff1f57a1fcb72890b0027a8061f1cf41ac375e6174fba5c7d490b49ccf9973dd5b474b0bbde5fa36a9674b8590727ecab24172a089279d3332e6c64dd0d910f0af930834298e0a61d87ff2bfa448e6021f053cb1e220dc351587c68bf1b5f9186853028ac4059fc5e0d3051d1e096ff2f2def5fef2a3b4e86a8baac3af1f21c4ea51cb9e9afc8c100f3ef08fbf7c78bc1035876c98d0d04fddab0718065603299ca1803fe0ef3400b985470ac535effbe30ebc2d746111376008f1d0ab84e7ae2aceedd041883dceec396cc810e9391cd562c8b07952417c18fab4ef1bf2a6a39c375adc6a18244a1e36da7031479be32491b78d378c22b82b0fb8499f29ae665fbee124e5b2e1a086215f49b9ac9eb86eda0bd2d39efbf6870ba64c11e2e9cadbce5abab7ba953c98c646402886c6a31524b9df648512de28ceb7e3f59fae40220ae8d014b227686085fe2ec45f6a6e0c771c2c3deb8f7a9c34525ac2a97f4d7bfcfce1f29e5d9cfebb2d147605908d097f0ad4d128780e6e12cfc1a600ca809fc13c94e2c080c157255554a3807f0d3c8caf570331b987b34957e3418d177d5f2ac4fa9fd69cf2c47942bc7ec0e315fffa8b101ff678e9a33558e3696800dc17cf9c0e9c069acdb223c807de7fcbe26518d055c01907488610290c2909a3cb4a2e3df06221da7cd5eefacb5e91b2fe51ca8cc1f7c83f5ee3bcde6a4693868c033c0cbc690fd8c5046ef3b08b418f8d8b0413bda2175030f04c2a347d07385a63ebcab39c4322bea2a89f5a7bd4fba942ac1ab674b7717244dd79eef997bd592f656f60e3cb0d4ca1d41f059c0ca5a34dc83d1aae58fe381e77687b33b085afb0027cd19bf4a4bfe670f6e1d7f56ebf548ea369cf7c75538a1099a7f55af7dd04e96134a6762ff645746771acaf38bcb0a7a81509356d45142e3b55e1655ed47e96ff2dc3dfa3dd2def8a44f172747f44e15e2ec3c3c0cb81e78b223ca7dee32a5c3e17c6730af78097030f6bbe8a0c3e87629a21be72357de253e1459aaf22834f21c81edaa82bf479e8a1dda5c268b7a4d309d74a4531f4c54bbb7e768a103764bc10bee66a21fafe6df01d3b22aba7e58b0aa66111360db1e894774d18a2c5784c0521f295220ae829e23f35add25540875809fe4941bf5d464f2e2dcdb95c88ebcf9cf2f68b2f08913ebb43c3cc41f29e502832cc4ff2a815aff98a2320c7246f618d73f950d35b4cfe144ef2e7327a11462fc2e811fd987c937f69c833d10ff01b93e748b3f8cdd5fc6e923cfb8ac897bfd43b5aa4f6930a629743baaf78ba8710b7674f7bf46de9698c4effd7d7a79e2adbf9aa50eb5658b40f2ccad3623cc937d65242b496fa0e2019ba11e0866afd3d5e29db9b812d74b90a38a50ccf5230243be8f2034abf3be61821323eef5659faaafc2d2b74f219afc93f9e25766b3922cea2c914a6055608fda32d1ae0b94ed4c2971e880a20643825782e338ae7295c3e95a99e032e804780e70177912c59a83c1a892beeb3c88557b87c2a8ce7b2705f18f765197c4e15e90a075f64c1656a3e155ea8f9cc637c9a1e0ed1dfc8cb0939bd5b494fa345bf56e123a402d9f7829cefcf7c5888bd871dd2ed2b69817d32e1f52f9677c5bde729187a023838d1592d05c023c02bd9cb5e05244552b2291cff8eae88024e21c3e5771714dcf846875a214e9a72d1f0b1b365fbd6b5aabfbfb3fcdbbad0ebfb3c1dbd2d4fca52bc45afa8c42c7a856792e50fb9ce0bc8877a2bc94725f04cbd96a1e86731fa25c00b40af447b382506bde41eb5c96f4c9e33151f49f8ad60fc4634bf345d6fd2159a93b27aa72ba4a1744ca7f5833b0a71ccddc3e6f6a91662e6fd6fe4bdb45688ea97d77f010e63f28c7ea47989feee3039760ad8cbe8ef2e60647338df92d71f5d814414e0032c24f11da675ede47b1c173ff2f0928b074b2be08456a32748d7d2e928fe6ff7cb842f8833a3cf6eac2b4c782926d47c087819043c4f2f062a3c4baf4144713900159e093c160250cf459c3151bc10d3656c00293c532f5e2abc50d32f009f0acf56d92ff22b2fc7f7d173cde3b3c49c789c32e0bd366fe039739dddda48cbb8d3693bfd69b0f4040fab1d78defa3942bc77d0f3fd67af97377c2c9ed116363c0fddbf61e018507aea590c380ab084c1c50cfedeaf8802da838e33844666dc5bbb4b8d103bdd97b5f76bf2efa191a15927f83ded4849f27b46cb99368894a14172ed3043a3848552638ac48de25a3eb421a30cac126d6099f42a809362aa04bd4c162a73f8b8b018709c5f32e0285416534c8c5f2ecfa6e1a5e955f2e97bd3ae94dcd4637797be50dff5831f3bbe95103b7f9ab9fc0be9617f59f5ce0d3f7f2af0c980590c87bc9342d10a02bf7b7fc17d6c9edbfe06d21f2d84155620517dc60e27ef7a89ef1a5ef1d8c49b2f9396e8888abbf3abe4d499724beadb779e246fbac2dba7e521712e385c5dc2c9d5952eb4f1bbf5be6c06c3faef70d1f573b98c4eae41c705de53d309b3f787d9fbc38ccf30a3aff0fc24df97cb20bdcf765fbeca95dadc10175dcefdcefc96b709d165c7aeab6e7c4f88bb9e29fff3a27385b83a34b174947c93b3a7f36afa27eade361f2bd8fa76055ba2ce200da18254d425a4a0f092425d8101ea6e0ec75bf17215e072ed7fc788fbef7978974764bbbc30e9dee9470ad1f9c25d5f583a51fe7181d3eb9056861c303913a69c858173b9e6fd6c9563848838bddc24e3c43ebe368d5f3bff4d8fbb00bf0cdfd41017bb52d3d21ecc96f27bf0b5c7be37ed2a21ee5835fd377fede4ac4bafbee4f057d43de92a36a0e5bad5f10a527d4a1ae45b87bc28bd9a0c0a2627342f6efbeb8fe2818415d01341448190b43d8e4a39addc8f399ed6f9921f1f9d2f3fa943eac4ffbb2cfae7f342c3e35cd60258f8e3d00d8360afc203901e45a67a9776b9159ec742539570c15d71a2a2a7435cf9e0d1e8d69845c72c38edf910ae426222839e33435c01d7ddc6a70bbc58d5b54b5c2df2f31017b71423c00b359f59069fd92a24e6ccdcb2212e7df51367a7ec2907d5c0f61d730b8438b2f4d495bb5c29c4274fbdfef67b7200d6fd5253438b8f3a04e0022a0e847707f0b180e094f2ef7588b3c07c6ebb5d78bfe6ab44015faeff71cfc3693d2609d16179467ab954acce0fcee107f96b46310f7843f4e67c27fab53a6444728610a8bc2f0ceaa62762f5b059c888cbb14d3e329907efe8f45d176f2f34e8337e93876c897e9210977ddc317e81f390dc9692675ca12f535674bc54885dd6779f709a84596fedf7ca37c3849875f3f44796eca5eed11e495e621a7c319df2ceb45c43b1e89e5ebc25386fcef57b5720a80f50c12661288ed39ebbf895f4b652d31fd3bfdbe4d6f2b70ea1be43fd18b86dad8026e8b0521c7a82aeb4645971973b8fc5564b31e0b2a13866824b5b6880b2aef400c18020d73d177caeb684b8f800d4316c169a2ad4aebc7aae1821311ee2c2341a17232f60f44dbc140561f92a241608716da1d8325d2d3f69dd61bf9385e833e1a4437b7e24c4d7bd679c551e1162dda45f9e6df8b3ba470f38c569ac9e84f6682a31a107c84362db3cb4e5323e4a14f0e5fad2d327bc947385b4521f68b7ea8db3e48f473b3bef72b508aea5e5a2ff660a55c6aa0d01c859a596b3e8dba49c15a8fbb4bc642a26f85a1d8d8766cbb1a25702fab15092a25fcce8050c17d02b64e322a6984c7ef39284e42a412fb399fc16b0905c1e70572bae4ab1052ea79d33d0af70ef727ad76306ad1262dff29c65cba5c73163c2ab777efb286e2295b5185071a04358f4bb561c61866f7345f27b5720aaeb759ebbefb2f51f77eeedad4608b1ffcbfd4e7db1a3ff5be8bd81fea2a17d714de13958a476510f5d29da466120b64a038759302e048b2cba7c65014a8f661470d0c180cc648be585164f42683cead1480f643ff01dc673598c4f12b330eecb32f80c93258745fe584cb8047f570ab0447b380a77816769854a7c293c171ecd4c78343cb6be9562cb69b35aeeb0e7b1421cb25fffcbf6972a7ad67dd3fff646ad1035376fa8e079f35e4fe087038f002f31e1761b706410d15e4ae0c3571c97ecf6e88043d709d1eaa3f475d3fbca1fab9db69d3a095feec860898057c255126f3e0ca29842cf54f7b1fe136cb1991b44b1fa8a02e08a5e72392683cba45fa80db002f57ae6f1307ee3e42fb3297e35bda007a5e871c32819bf31c55a01fa61f06fd2afd49e378dbf4dbbfa8973fcecab8e13339e1d203deb1ee71cbe6ed92d5291944f5dbe00c9247c2d84d27ff9da87a738b57b245bfdfabd2a90b0023a0b474e1cfb1edafbdad41be53c76ceb09d9e901de0fc14aa3ce96f22e83904f3da155e06415985e18bd08ef624b82b6fb7e894a04d45b7e5a28069a61660d322b765bf04b355c6814f2a2474f11d8a6f872d9697989e439ca7021c218e6215e210b49858c13c9cd8402b34db8185e22a40cf926da62dce2c66d1966c999040daf72d4ede437272e84e037aef2e3d9077339f7bcc27ecbdd158aff3ea115bf6bae0a102e02ef00860097e07becd1409d56d60b1df571ca3fefce02b7b2f971e47dbf69f4cf73d8dd9cec79d4e8ff3282bd9623059e6b92ca4c843300ef3ac2bf5c4e9aafb40dfd1868732902a028686a2c72bc8b35808a9c44cce207e831e8e85dfc266f2cb43ca4e52c388f31b01bf0a2f481c0a0ef0bba543b65231fba1ab8e6376bc3b4f52ec76fc3e977ebdb3109fcd7beb8325efe29eb002dee326d4f24b38c1c59ab671dfd65b6cffbd2990b0023a0b679582a1ef653fef78f3fa3183e4bfbd50bff3a422117031a547607a0e3aeb435be80a1f8461ebaab45ba778e3d26c039e43bef268e4b49f0b5c790e2c7416c767624f2253e36afacb09585ec4679ec1676c002abcd0f41c4891c8e7f603fd30be2fa1e7104b070e588a0a2f08649b450c3e93a74f46f0f6cd1a782d17b45edf437aa087b43bf6afad3e948ae4e5e71efd4405e9627b735d04e89abfeb104026231a062c002cd91c0e135ca0ef4c0594beef79336fbdc9df5baad3e89d2e8ff80af06ef17ad737a3f2a3dac7b69641064c2926eafcc45973564320e0b1b290514c91287ac90d0d538e89bec3c69f13480736e83797dfb82c3193dec61a46997cbe08648935c9ef160bd91e2d3d923da55df641d773fa4b8fa4edba0e377c749b105fd7ccb861f549ea16ed81907cbbc00b184e8a2413300258c2e016bb7e6f0aa444010a7e84e440bbe41f8fb61a72bd64759fb49bfd6caae8c4e78b5465920a59be15020dc4626ed1359dbe1ab7c80e41043e1591ec5c65bf4a2f4929289e665b6949b3e5ae760ed26e2348bbddc834dbc000c947086baa9e284ad47396e48042aba5081c21c01c786e1116e2d3138f9e8e1ddc17c67d0ebe07f8e685b8dad4b49f7ec8fdd2723b719f31f3a649cbedf5b71eada401471e090d382a557381534cb988118d009630b899974e3b960651b7a77bec9422278a9cc8a04e9356c81f478bb2c3e78a449eafe2b632b0369519c57361c0d8428a3c64c4d70688be635bfb4abc961833882c86464c3131fa01f9d8347e631e2fc68596bf84fc26358c821e8e8bfb0a9be4770b876c9dfd9d65fe1ac9ae1bf67ce3882b855878d897535e953eff2f7356de545d8d9b10b2f588a3087092ef45c04b80937c9702d2738b3787d3f8ebf7a2405c05e20b6d865f7d5bddce774bd7fe938e4fbdee87ac16887e7e419ad5c58c854c144e9e0362ab729a3f11ef52825c8a8167cbce2041a9b4780ed9ba9010d95316cf2116c3263ef3189f0a2fc3692083f404adde53c806888d4f3e00a712df1b991c602bec2a80c22b43b2c0c62eaab2ba15f9dc68d0d9b463861c650b7629df7555df3a217ed87571e3cbd2725bb9b872ce06b5ba151b5805c049a1ec81df6940d2df29df3e0f7fa7cd37576d128746e19f7ff99ef4f9d78c993c7aacfcf7e9a13347dc16e74904e5577141f25bca4230a5f8aa0cd433e9898dd1b37bd6444fd18f6d1552095cd1b31b44267dbe56e268f9a9041e06fd0ab48949df05fd2c6d6025e437e6f1327a317e2b8cf6284cc22f85fa2c1e9495df606859d1ab741cb1195768ef942eed2f16a2e7b23ec7ecd1284568ce336ba6d7abbfe92d7b4a80ff85c14cfc7d3120c97744c12dbf36b2bd154858019dc61851c0df3a205c3dec9f974b8d1aaa09650cf0b7baa0892e3621bba0014bc1e262566a4f42ad3114e318a3b0ca4ed2169760829167f11c08d769948a9e54001be29fb3c7b0399f68854158944f163a13cd5c83c8469af14c240bc442020ee887f19cc263969c83b784711f2c47840073b445a8ded3dc4555168a93efeb055c29cc4db4e09ccc502bff1c889dbfc93ca4aab710ef2f7ef1894fcfc41f6960e55a6026eee303d3054e27ed453692a93078c380f50da2bf5e7cf79cdda527ddfac1f405cf4bc3487cef94f869e601c5cd437e956cad81d6d0682784d57a622b51cf594330067dab67ad4359da63b51944d42a26bf2cbd564a8fcbe867a2554c7ef98e08b6f4dae09a5f26e337339e5fc7257963ed51a2e91780be1b4f3f29bfb68a7a9a1f36d32369d9adf569ddf714e283da97de2a95946a1757fdd688ec43ed41bbc01799bf6b1c7f0fc82fbe68f33d91ed5d488845456a087f517178e11d859997cb0eb83b943ab23a5a2814cdadf18abc0c752ff09e48d61c0bdc53b8bc4fe161e03d919b33dceb13c5fb20d973ac17567f47415111f0b0898bb1820afd143e12f840a22bfae07dc467b681f7d4ef233eb34d3e9502f22e1543f15cf43bbda198d6c602efa9f7fac9c073268ebdb4e4fb543b4d10c38def9f8cf7802f79b7c2f3894f4458476abea8104be1d9f88e22c6674f85c7f13994f1893dc3c0d758e07dc047ac7d894f1e586ad695f1efdd479fb58310877bc737ec8182c3560b0171c0508b73144cfb55413f29c3bf42df281838dfe53110cf6e2613741fc9356dde29e5baed9c8e7fbdee0ef99dc778f9a9efc7b707f65443bfc5c92fe480da09f2ec01773dd5bf28f0f3747b9bf4347dcfa42f9f37c707d1efc9e42e6cd297eadea43f99f15b64d2a382bdb8f1c6e538b17c107dd61eba00d065f4c65ac685cbe88d34e557ca5b2ef07093fc4e66ed61e33726cf54b0b849f24cd725d5e32aaf951e8833cc59d11a5bf5b47e59413a80ae05b2b7b85ca71cab6008597f0ef6a0d3f2b9d9d7f6f2405c05f46ea2ca691429ef48c36acc9f163d2b159bf3b2f3dbbefe80a6900c59fcb00bb5c59fa32dd90db88fecc60db84fe1678a5fa2f8550e85aea27469fb0b692d66e277013a0acf005e067c10a8ff13ffaa95ff13069fe98ccf74c667bac127e1d761bac9c722ff6850c991fff371daa6a358e1c4a7b4c072189f0aefa70eda9578187c636f2cbc370b7886e6330bf7115f59b84fe1282414fbd19bc05719f0189f198ccf0c7c4f0eee53f834b45f2f1520927406e1fd8bf15c41f4f766a64f86e6868e6bb59310ddafdfffcebd3e95defbc2499fbc7110fe488b8b74fe088ed2d5a12caa1ba1b4609c0def41f1e8b62e698a0311db5e1d9bc784ae10e2c26fee796d5f3905b65cda7aef470ef16939e3fc73389ca9d46f2804a47eabd4f54a9003edf9a9509f8bfe58a5e439ee585ab437e88da1f6d65978aa7f4ab52429fa65267d87f611cb31e54cca2bc95986c1ef203cc1e967805f0a076620c443f40b997c4cb5d02f34db234e0a329be2578f0bc1f9857c825f3d5ac3144283fc717e07b1f6b0f19ba343d2617ce7623ca7e86d645662eb5e6d2bfd7359ba8dd8a76ea91cd19f3df0d6238b60207998e93c54b87b3f02c213a1dd80057674f090deae0b6d0b0023cde124d1b59d14885eee2e51c08f0d8f68bcefec7ef283d3c6b6ec71bddf00d95428d574819e70292bc51ab3a41829290e35614530b02a2d69b622c9e25a2c0f5f85b0a6b2823d96661b17322860ef53782e14de4cf065cd26e17c5a43534ac1165a425cd64d1dcd7c7c6fbc77ac7fd25b6d7df5aa5f779122735ada9036a31384b874cc197cc4d68c1cbccde433072118969e2978b6d946a64fb6d8bb55763769b1b5c86ffdf9c7270831ffa5992b7fa42c2d3a10687740da5e1b8a446fabbd8709b5d110065ccc5e8adf75c80a7ff743b1fdcecfef30460e6ca7ceb9d8af2497d20c4388cb970e2166a9ef27f9e56b72907f92a7e2666e92e830fa9516fae84f6b882b58f1eee03e937e89a60ff9481ce2b28f374b7b8441cf16e27218fd60c5bbfabe2c8e379dbedc5c7e25be58e19610d726662576d8a3cbfb590572ae7fe999752fbe2465736de3127d901b9d4b028fbb118650e3b90a9afb1dcbdf6150e942d64dbeb6b5027115a0652682fe59cc7d1f3e7d8f47ae94c8df9ce3bb0f8fb3649215e8553673ad2007b6046ded51890aded8449765e0c9d2295d780ee3b48554c8f8cc637ce6313ef30c3e4991f042c264e9c0b64ae16226e0c9765565f9f8cb977c37f35d39018e9f76f9f83ba50bfcdae0c786bf2227c2da11d5dfcf961371e617bd2a0e90967ecadc947fb43a41d8d78c2c15efda831c048bb9b99b3a264f9f8cd62677b96bd7e37638540eb85f9e297d13e73378ff5290ce19a181a4cf6bd8ddbc4f57b6e7c67f89087a22c0f562b984e7e5dfbe47a684ad32d3873df2bafcdb27ce14ac7960cdc75291cd176fb5a2c677c310908a830a6351cfd4b45c2438f0c955efb5243bd8924738bf9516fab4d8ece8f180fec3df5141ee7dea0da9f70b275778cf44dbff48a7b79fd66a6d8f40d624537cc9f8658bef0179b3ad51062ade2df429bd3db6f6c2f865f2eceafe85f424be5217a6eddae9342176fc7eb7cf174945f0c5b28af98b17abbfe903da48aee95c1dac859082d16b7f8b18f102c048531c24bab6b10249e4790c5f3226fd40e99ab538a4f5c5b71f0f01f4bb86b6f6d8dc023d1a1865505fab90764b27fff102bd98001518efe3e994a5420599b2e1d190e760e33360d16945a504bf0016799916a812f099a9de9f24cd962d6a3b6c7b7841969b9e4098e78001f853edf27f7f76b7100fdc3f6a8f871e16a2aa68ed71d5c3d4030d3f08f1fda3732b7ff4cf6aefe2a52f385b883d8f3d78515e963160884fa59878b619f13988da178a5c0fec24167833d3275b6e685de1171cae3ff9b7b96fcb81f3fd075fafff15e78fd8065c23290e0a0150653b425ab6cd18290924def3387a7efe946bbbc9df760cbd78a4bf5545cca3863f1450ac99eabb9821c417c72b7532897abe9879e836f97518fd4a6bb24325e82b7ac1745d93df589698491f8befbffe75d59b73ba08b1d0fbbc6e9a94a70fc6bc745a991c3191479e29f6e1d457c6ffe519d9ce150b262ff18f969d77e327d3a73d22f5c9a3df1ef1ee5eb2af4e6d9cb7441a982d8e6b55eb9f0fd332adcd313b0d13f6ac2b7bc5bb6a0fb6f81e935b3d2e98bc252d1730da63a3b32737b2e2bdfdf22e37ed2447f6dbdf3e5df71ad27bc9d3d0903c11e6a19047ad3d6f78269b9e9db5ad1488ab802e1044d3443d8f6ea77d769914b0d017a1257d8e1031019c89b4dbf06616e85187c60a0915ac4c1a322901a6048c7b0ef9caa371c66182b61412dad381599e3bf19db38969b6bcf2b6580f1835c16469cbcb059f05a01fc5ebcea969f5ebc542947e77fd2f77fe24c4bad77fb9b5ea35f5223a71adee1a05eba70bb1b870ce052b6f97e4669f5179c233b2ff86a53ceb9fab62b7e4b8e5851060a13e39d1453b1434c56720dd9314ea547542a4549b3be2bdd137b77fa5f3e55539427cb8fce57b67dd8defc191a30dbb29a8435a8d26f44600a7ac977062a83d6aa9480ebea3fff8162be4eb67ecdf6ac2b5f2c74b4446dbb651c5617aaa95a6a72a5c9d9e4bf216c1f7e7c57fbf80a72615c738e06a0dab34a9fc2a7af61d1b5ce0eaabec068b29776c2fb9eac675bb2ebf40888fb35e2ffa979cd0260dbea572f22742cc7de1c3590ba442fde1c64537fed44ecad79c5fe76cf017851bc4f4fa057e238b37ebbacadf1ffbe57d7f7bffe56bbe1bff93f47c67bff8de937e9dcf8737bff48c5f70997e4687d3174ac5dfa5a1eb375972fe487d256d40fbf64204f6e0ca4a5a70abf8d705b7d6745d458f57d4575ada23a6a82a403f0cfa8a9e6dcfb0ace6856cd3f66c79d68e52d2d7ecba7afadbb21d967e3e7fed9a2fd4df1ab96144f2bc7b62a843b111c030fb3de9b5adb3b05c05fc0197fde491e3fc13bb4237a4f43e7398089ea8d7939da8c74e34132e3b412f76629ac26327f65156959ae85d64a5509655849dfc579eec6434d02f4336d550289088de369af83470bd6db4ed64b76c64af94e33d31bec3463b683e3d337b449ff406bc48f1a5b7b7e6ed1bcb568972feeef8673b3f2c2dc41f462f7af89703a37f11feda877fd51e09788a823535d2f618975a59eba70f3ce2ecec677b48be5cc6a7cbf874f13ee293b27458fb5af8a476099ed4188df87a433d9cb06e5e3bb6dcfda601ef4b393b3ca5550b9c7c48d02fdcf2afd45440ca5ea16c2c828e4953af7590e516062ea78c3ea9a7f41ff87e344cb072a79de2daa327b50ff8f5c03fc91765156979a6ef2779c6f32e9767d0a3f6487ab29f0e6418f4253d17bf96030f1bfc5ac687f741e3098d52217fbdef87d74cea21c43d2dffbae09aa38478ebfc7faffc049ba0d64d57b0f62a056b8e50b01ab0ea4ac02a05375c01b821085f39e1e1fc0ad92f631a0a8e1c31497a36f3bfac79ec3bc9c780c69b7d3ebc64edc1e42d0e57e3c463f21666f42cfdc7db3be9b88bc933e7b7dca0173c3621bacad3e79293fe791c9d8048c71ba499509fec896c2c92eb106d0f4f72ed32d8ec6b1b7920daf38828e8bbf8837b5fd2e318f941a98569e32fbc4d04d720289b293f693e7a099e53b8ad10ab582f66533d48f30a0979c8843c876c58105370767386c573e079f396453a67aea2db785fa3e74fcc553bac9bbde40969695cfee3a039d252fb6ddd4fcb16f41562fde85f572f9296c6bab5bf5ee9c3aa9cb5af2cd9533eb8d4bbd08f25a7b44bfbb6cd6449ef84d08ea917f8efc31a8325c4b764e9bc6b5e3d4c88672bee396cda1baa7feabb2958d71710bb85d67604bc5a88d36fbac4c9919662d7017b753f4e0ee4384bcec5fb14ce0baf62bb052b0fb3d8b2a9a50e11008f2daa3ab8cfc4f99a19da37e5c4d453da4a8b37343de5e799d2a25df0dba75faf6cad5ea03d10e4d737c0b56fa0b512a44b36926a5a0c1811c6458587fec03c62d4a91baef50f2e7bdc396bfffde3da23e651b755fcd93cea2415deb1c5f3d1b86f83d11ec92aa66d3b3654b2f6b6edc185f1d1b053dd90f5526e2aae2913f7490bf88d6e8f77fea0859cf84a1abfa8c39a13c951edae800b14240552b30b7e27c57235f04780cf57b0ee6cfc0e58ffad7cffabf5f7fa86cde7bfbd3d66f63a21dafcadc379f3a4c7bccbfdddff7984348442a9ce9d2d2e4cd01e6c735289a9ef250fadb97b8655b2f9c2d5f4d5df5ded4134e9513abca25eb0d07226e1a647d2eaa3f4fb3aaf918afafd2797bd78a97a904257b45b3585640936c03321b9d79b912e0674c5465e5b5b81b80a6805028bcd5ffbe8b3eee409e74bcb2f549752dcd79fa8f81a44aea013f594fdc13b3469819e5ebb50f7bb586328463a60330bf4f4a2652973614b112ac95779dfce6a4c84997c20269ef8ea47d435ac9382ffe382ca3bfdf32ede2d7eeeb5c7e54435e5e33b4794e408f1c1292f9cf5e63942ccfc7ada981972c2fbf4cbe90fcfdc4f8859def4b299ab25ac7a63d1277f937faf78fdc78fef90f72f7af196e913249d82673f7abe83106b1ffbf9838fbe14a2ddfb9dbeabdd5b88d617b7fd79a7a9b2cba7a78c6e257d9d0df7af1db0500adca30f5d7ecedda74a7eaa6ae7d76260d761a06bcbb13606bb7dd7e328df823ff1ace157ddb28fecbf6b52f66cbbbf0886f892145ec56d2d8173549a9e38addbe1d3c4165b338ba01f9462c6c04b393275e755720a9f31e3d5c8e734e0e0f2375c0788ba8f86ef000fc57de4f253a156045f580a28f1d4f92dc685ce132267c089d3eef7d75a5e74be687b725c482a1ffc4ea5ad4758ecdeb6e54d3069840ca332f0906fb4472c0463d2e715d3961d1bf45a9f650f2eefee86e36a5e17e2b5d6131eb8f578297fe74ccb9b0f43a3a141419af0497eaa7756d07f2e0aa7019222a901443d4e0d14482d2994b3400f864c3de4b31e8acaefbf050fcfba7fe900c9ef4da1533f9d25c41e5ff53ae2b8e512efe0f44ceddf647b44bf3781e19285f631be3f2e09c1a44786512c5406838d19463cb4ce16f503fde7249ed752f74bbba9c3a7d26e1c36ffd6d7657bae7a71c95deb90ce4b21672dc7906fad482628c80b10f55500181149aeadad40c20a680b0d21b3507739d0f63ca9ff0d7e139de164743d5b04d7202a903595c1b6f6d0961813709be545965d31703a8276aab6c82351bcc4f41c028b967c0d82ce639882dd7d359f81ec97e8fbd6afff75dfefa44536eba8e9fbf8f34ed9cb77ac795c76e0cc5ba6dd31738c102beefaae66f5d7b233a778136b07ab0faa234f804de87c80d6a190a8de178c57bd35fefd2b567fb77ef59fe4fb96be21663d2bc487552f1dfae21affececd6fdbf9696da67d7be75ee6b122efd7efe9b3ffd4d3d5f8b350e1ab014baa2815e7b8f1023eebe679fabef950aa9b1ed91071d248203442b00d37390ada0f02c8d2bc380efdebbf9dbe12b0b3f2607d1f7a6f44d9be01f711c99f8cc9269e3d5937a8001d69fc37edfcd847aa0458471f98ae4dcd537dcd173a5102debda7c35daaf03e115e4537545b6da01a1d25c246fc2a38ee03b4c4b36960e3e26617b704328593a69255b2be04923ae28f183329ff47eadfdc37d84f8e8d1972f9d834a0b9ac8eb497e208fe45954fd49410a5955f701c42230290c4ad6a885e751831d05b4070285a23d9c37158cefc7c52fccfe6a956c91aee97bdebefc292176c8ea76ed3195688fbc84ed51093c1cc59bbb6798ade2bd90d622217fb63db8d8fc60ed3fdd4f6c5ef3e9c97fa5d4a49dbd502a882f9e89ccff0e0a9cd6f8eaa128b4a70d83a91e5ba3e83de358faba9e514b44926b2baf81e858311558b9429cd6f6922f77f4832a45ce9b87fa165eb01257e103bd760ad795a25e3cae8f6ca50aeac9ece84a1c65491e8237d453627d29d62e6215b854c16b54bc7bb14a72aae8a54a72aa88cf4ec467c3e2fa89d5d2025ad17ae12be51709f1e686270ebe51b6f3037346ce2e8ac8b9e7e0a73b7e3c480e869bab076c58acdaa5eadf0a6e4001da0614feac8745b10e1dbb6e06208ec05cfb92097ffba709d7de03280756ddbf6b26af918ae5b571138ea890bed3177323efcdc75ac75a646fac830bbcfe44c08f63fc0c7ffeb6c3fbef223d9a5b3bed729c7ff426551c4750d14eed393269c5bbc287072a788b8cf62dd2b1e5e655bc0f14c7014f58499ffe7d871f7b491fb4ebf0bd0777fc5c7d57da7813a6a23d52fea16008213bff2c72ff925ea682730151d9ebec24156a8b76734ed83d8e5f5e41ce77406015e47a6d8e5790072bbc893edf512171c57491b5e29ded7ca02bbe15bda16645f6fcf6339f2b7385786bfcc4111f97a8efae5fae60dda90a560f57b00a9be76c808221795af77f89e15a58c6be471effbb1f228be22700ee61e26b6f033c9ed191cf3ff9eecdad5e92bfaf7c6df1fb6357c5b507af201fca7644f0d891b7d41e3d59857ab0e29df09ec069ed4bd11b69ce634d54bc9bf4279bf2ccf9edda6eefc5bd4f56df9dfabc825caed3fa2b980205ede0e867078a5dcb33cdd330f8935f5bcb034165af660c16aef3b0107d469e72ee215223b678a6658f027fc2ccd7a125551fbc0af86342e5ccacc256762e62f91482ca053e4587a4541a6d6cbb7685e7029f08fc38b5c587f3b25908284621bd97f8c857c758c9bbdc785c8c02de127cfe5344a7ebda43aa57fdf49010730ffee0d5674608f1d26b0f2e7ef93269e1dffecd8495be28948bf2fa6b553bd42d037c4ac1da0e0ad6c092aac1d9c8351898dac53f9fe1f7e2f9bd418f2c34ac65d43eac60fd5f81e37d759840f52239fe5e07fab57b01d64a011db6f79f53df15e2e891f9136eb8d75f5348e9d4c55f7329d66b0eaa1dc6b1131f113214c5c8b2ca659b4fd2a98213a9bd11e21b05e929a658327047870c95a7477510b85fa72d5fed5c055c992fc4e79ee22e7f8de2d78f7e6cf37e9a108be67ef5fa8fa8a9afef04482191a781a37d1aa058745d485841da64d1f7ac73da0cea70de9df2bd8f38671e74b6881d9d9c8b42d3b1e0e31c3a5a194fafc2f7f1b5b97cc8277d5f31a337d1514ba8a728f993edaae885891eda8fe8e582fe14e073751697a24ffcba3abb302aef359f6e707e5821c48b550ffcb9245d2a8715eb6ac8732005a23dd72715acc1dfaba050c820d21e478d096b272aa8c7057918b094ebd55a8668c0f869d817b033e00e0aeaac23aa8378501a53537f2a5e280dd5eccffb1c32509a90a1f9a1933a7410b1dd8c6321f362033f03f34abe3312ed31cac04709926fcac2541ef68e783e1ff4c6e95099c2298d38368f297a537436a2c2295b7494f6008b417f94c1efd7ce57fe32fbdbaf3ffdedd402b417daa9fe74b40fc9f32405699ed05986b4f3023c11ed6127dd4c746b29103a4190425758fd4f9113dae1b79db8f4646971877e4c39cdb764f5561f83ccad3d44bade72444de4a59a3a6da14158e22d1708a72d1d0e545b7bc8e1a6fe32574f402a0db2d8dceac3194d69b56cab8f4af0f94f75fffaba355f2d3c4488c7cfbdf685623991cccd7d7fc9824765a72c6e58418a81424d3ac6bb54c1aabb14acbe13385c77da4db6ea6b4028e06a0a052c017c02f43010abe1f2eb9013063029a2daf780c3c2aebd1838dd079c16316b2f10a2a0ed0dd34e91aabced2e9d479fd943f85b9990a2588c762a403b299cd26c8bf5d25c66f4f7587f291c29b5dab51f450760995bd3e8ad5432d8d634d87c92fa4bec8aad3dc2a0ab4fb653176d4553bba4eaeb6fe544f2f98af28af9ea89687d8b7fd5af003c44c13aaa7f414cd91b0262b4058f0a4644f71a3afc85412baff163eef78a11bba8d04dbac16f3fc261c8e8ad31a0584b316a32743d90c22bd9963763f4d63cd180859ca0143d1a07a400686b13c1e8d9b7fe498fff268171f6c56e919c27ce1362cef3efdff71d26ea7ad4d3d462c2a7b58d2a84a6aa10d9a87a48c1f5eb815f69deaf17cd2959833c1aac5135c0c368c0c447fda4712890465230a45848a1484fe5a78796bd54f5ac10fbfce3b0bdd6499fa3fdaa2e6306a4c5b547265a89b62aa20d50686b96a9d8fa24836ddd53c8fa6f2a19b2a037956d8544e9bac58cfe18b615901bd80a485d597a6562713cbfa9a569b9ed657bbe7fc88b9f3c2b3de5baa535abeab047563d0cd17a0a6da15d2944aeeb419024423b3548ef495d24191161b9b6551aaf1b83ce15a193fc92fc409a6d2cdd8d5c35a4c76e629a2d4f839c03fb912c5aa4d9c6a5039b69b66196661b36d3f2d64efaf932ff70fca965e3d3c6ca37adebf8f3573450ea6940d01a024df0a8abd83055c12a0a59214d713df0f5879b90ee5f3fd5bc7f436f86e7307812fbbb0556810ed57dd040f763d5e3aebbb4ffbfa582a9776b8e7f6fe766a5259afdc5d312cb81e7436ccb95787aae968308e823a4005ca703e3fe58fab6c28706d281cb0dbec067bb833a1fbe0b146d0869bbdac041a84aa73b3eaba0aef340faa3bec2b1df9d0bc4c0acc238fecb59faf9641d3252fc146939758def41ba6edcb830db03df2fca4c7ab1f476fa7e9dae6bd0a3f68ea55bd3f460a6897b7735cef5eb7d3e796d6a8b2fa8ce008bb1e4a9515d904eb2a0c5719277521464d0604d442b0c82f0f4c8e3d031fc6bcddf35ce3c94ba6b193fe4811f117bff8c8b5e7d64baff9e77bc54df93d1eda1d3994d794936efc4cd336e14f7d8bce331f9e3e9ba113e8f9969f881798cc61de7b79fa8f7e5b86763efdb7726b9869c521a2fc9b75e83a690ac6342addc9a7d6d250512a86c0ce377dfba395e74e830387e2059ea006880f0fa02aa2760f5058109c533078c541f141356f727cfef36263ec9a7c2531b07344a8bf4fd6ecf9ff5e43ed21c58347be44a6c62a605188aa31a03aa1a79ed7aa2a6099e4fe870f54901e809bd8a419ae05f37a1ceaf47a8a0fadfe6dfabc047f595ec3e067568410ec486417573fcc5cbaf3bcfb8d15f1cf676693ccf5f9b89b52fda27ccea5492d5ad509d4a38902f6fe2ac9e461431454f8abf0c6b0d49ea2852af6931371ded4c8a22850f3082b48b293c693de08a63789bbaf655fefdde55e2b7f6a78844f5408a8f7c9851b13aa688c9af6950c51946667b20d02047876bb6ab45b1daeaa2787b7ba601b7e6c59f5e9f374fc26f56f72279a42c2b3d81d3c44da150a648f4446e59fcd68be0fd18a4ac210a491d6de281fbb962e17cc9f1f8e5ea8aaad5bdfc7071f527b366c5b547a0ee83d53159e61dddbe5a51139e989e94dbb0412f502705455ec4e9b3f9d1c26fbbbf763ea62d3686d4f24b8ae418f3772dcfb4d6e10286857125af50dfda8be8aec9485481dc2c1e6fe71718252ba0eac90af43c4b819e6d42619e83f440a890d028d86b6e811ef1396fc38cf113270a31fbf877ee5bd84a7d17290ef238aa6169d1c4bd810aa492790228bca2095e4ff83c764c96de5589210ddcc0dfe9f923ccf76885516b426d19ca813ee5ddbbe67ffbad10cbe67cdb7f841f3bf5156c6efc00b158b6dc728e595aaec2614971cfa1b91e4e446f633fd4c02d1367eadea9e7b569a3be4b2b0458647a80918536c5bc2f6ee75bfdfba139c76d481f13e5372f74acb07a3e310fc422b731c38559baac3dc8b22d33e9698f9a8f83a485858c5ff4db8693d7ac5a413172aa1f6069cf5aee69a2ee6b420add9247ae1507267af26878e5b43ee39e6079629cef1ca0d3b1a158ead8fbfcb59afa4beb667d776e5c7b700f2d28c7d4be24c7890d195a7c8f24f6f8ac1e362b90f602111166205b3ccad6eddb4648aeb921a4e599e43c7e3e6e0226bfb676088b34981b070f14f5fed60eda7308685c5de9adfe1e1c90061ea8c48d584226d95481ae36ddf6ec21828402f3f3c72bbc99d2729d3ae49177de244bac8782b4285d43212b4a5f24cf837b100429664c9e045314a49074ba2e06aade52c4627969d8a379f769ba34d0eb4d486b008d938478f4b4d13fbe2d07ecfa49bf0d9ee26725d92b6f9b54fc71e73c84d5733c04600be930cb90f032411e48583d9778e24cc94acb6b8d2c1e3dd0a8e29c2c35b2d0b006a5150d0d2c175052eed465e73dfdad3482a13dc67fbe0e9d8641c394db60a88f4df42ce4423b20b09046131e35574c89f945bf554d5877f6af385f424fd4344193e7408a84e4c8a228eaaf33ef6f2479a22f8242a076d58ac2b340b2f9c3a0430ae668461f38c9b9fffec661f507afe811d71edcd0d8dc0af2dcc4864ba0e23de0a958765848ee5146e9b53c2c7d581bf240489e690d9a1407f7a4499ee90b8405b75e5b69115d33481f701ea0fcb0434e3a6ec2b97bc87f5738ab3233857dcf9d5c76a21e2fd0b355260b56c949db8dd3b907abe85c05cb26706c93396f61e35e7ed6c2ebb5139c7ba5a25853b96adadab5ea4575c83aa9c5a238ad7150e19486489bd3163fe5b943d1e858f07d0ad2e21759527a7334b2d468f16b1120069cce3ec9657036e05fcce7f9ae9d7a80d2807e1cb04401bf7ec7bffcad11d6d5fdb2c3a71d84d8e7b8c3efcabf4cfeedd250a7367efe4816ab7fe09b5a52e52df672726c9b5a9600cf0b6c0a5860d06fee76f8d883ab7a870d4fafbc4d88f7663eb73682cfab43be7ca0f21e8b8df5d82a425bcc686f5f727abe73e4822eb27ddbfdbbd3cea37a097b21a43e6f05fcd09e56a556b9cd427ba8e7790539eddc908176d015d3ba1d157d5e31ad0be92cbbf71638d166f9a17cd1cc19cf08b160d6cc65df9282a0fa0e181cba10f01186935c53012065b3513d0d2dd6421ef54990e4334544d317fd5d7d89f608a9c053ef8e0c34deb2ee33eee4ef7bc97e6ad1bef585c7a688c09e619b5d411edc234be185963dc93293f41f3fb29bd307bf2b5a7f37e8a35b8598fbce87d316832352e4d46f753008abd15f3c54e861bc9b41b9a6ae6da5406871724fe9f2b71e78cbd9f2839c9cd0b8a802b16d12480386d236835b3a44f1b84a5957dd67d99e9ab2765ca4411653168f9e880ac1353d17c5970c9ad7fe95ff13e2a3092f8dfa18e74250c1590ded0d457bfa509614ad29208b4757e2526c185b3be8024178149425d1882c13bd391adb3d534ff87b98bfebc29f08201d3073387b9ed1a14c144d2793d151538d767dfd45bb953316bfe65b767b5f7668ffd52709d17e8f1d861cefe7e387d90467a9bc75b01d7ee02853db76f8b64d2d9bb91dbe83c2aeeaeaf52d562c970ae487e7a645162b0a75df0292278681568bf45d4a57a5100e296c5f027becddbbb6f34b42b4ddb7d39051a384bd827c100c22da7d58ef50d0ec0af202751f7032b0ca40cf5a60cbe805779735f9c5a69fbf1dfbd305f3a4dcce9bf4d1c35f53c1206513a2be406f39429e33853e69cd83da1385806400e982b512e024771b7b2d06545f168bd933e87cafa0ef711e15397d5a584e90691b5a743fdaef477d9e0dda61732bc8c35a91b8784e29024adfcd0a9ce3a3e8c50ce22cbcd7a417dc44d5e07759ea82ca0fff2ac4d76f7df436350b9f5f743628221c3a6d9d0a0da97f9aad40b655165638f64f5adb48ba4920154a59b2a244735dcd58cc59c5c85de52807b22858164cdde29aa3d75c22c4b4871f7bcbafe7f02fbd884816197920b4c6408be6e469b0dfe93e1e3bd6a122a48936248b099367c15cfac0efd90ce7210097d12d372159da74704dc33380d7c5f8fef79fdd892f1f2aff7d7c5ddfa5be27966c53cb5c0a15e842c0701426cbb6b3255b503f0fd55fc343911edea7e8f5f0d692ead1138c6342bdd60148975e740cc7c1bb301d06f93743529303a1d36685fa026b3d14922a33e9c58d0b93be48ba6668f28b71d0ea9ef48cf6b3e229c4c903c90785b6204fdab3cd35ef377b260e92a7bbb957c444ada12ff9bed02b298f76f85c240855631eb085d4692d231892cac53b18aee8f135bfc0a23b5bcb08acbdd8d76815fd224d4f5fa46a78d2876d6b297d8539a524bf6f350542052894474c79f352e4bd3bbd9ce8df939dc5ede20c73cf52394b8ba6634d3c703634559e0e5795cad6b3b86395a2517c8937eff16972e25fbf68cda4aa4ac57f3d424cb554e0870af06a58b0d5773148d951b4484d8b8d503cf5a729a8d71860d97917019207d105902cb530a0cb60449817ffbb6b3eaf0716cebdd0037b2520425f742e4623141c15def90ab0667155e76ae989ad2a5de2de7f94d067c77b4549ce9a469a76ac421d490e5a0ee80c76aaec653b088c34cf9e97f2d215df8401ce2ab2a9027ba47719358fae4d1965e27a80bdc1ee73d97d7280363cd470b2d34b24ad20977267ec5890ac023969057970a706b46b62fab18a77b33d38bf342e3a2edc714c4f928b0820970fc1f0b889dac06d1e46c4f2fb265e640805e803fa4719a75e9e569053123f4f6067047d563cab201f9bb8825cca6d58dda777c2207c24f09ef1f4f5ce0df68a77cfa017ebbfb1c013d2f388df06efdfdaf3823ceb826e9267ccc35c2168c36994f9bb3eea99dd1fbb526d7fd8cc8b0a090952a8ec26e16f25b2abff7b741130e20f462ffad95e3e0a078b142eba392aa073bed2b4e402ca8ea3ca5c132717712e2626e0ce19848bf651fc1e78404345b44ede2973682253dcbe2efa357c29c45723de7978c6e312bf434e122898d28be6fb28588b02bf1a1432d5a06ea0166b05b5d892a10eae7d7da982e4c934c2a2270bdfc3de571e751cc1ad7d61c7006d29128e89b211bf372284a73d3128c014d91eef3dfdec35af458438fde74befbdbcc23fa33c25bf4b6eb41fa84c49f56bb6c29dbb3d65410f55ed2fe540e190030772e015432e862adc29d6fda5f022e08f79d1ad109df355c1a8fcab7a2fdeee105e1bd7aa249fae890b6ca9217663bf634d443488d87591f748f4ef3b6322c65e6be20c2d97eabb2e253916bfa9ef56fcc8bfce51cf9147a670c7a5ad3620c748531673411f49266229e8b94e91fa4e25c79abe8bb3f6e7821ebe558ec184fc0a143eb6ba307dd73d4e1062d74bf72aef200d9ce5f77cfb455577d61ea87bc22e6431886c426d406e2b39a6f7cd0dfee9c4832e78cdaf407746a71c70a05fd0eb7aeffabfcbf688a64ac87e32e5aa58b527e1e20c87fc2ff5f524c7b1f98bf029c013cb7136e84f017d57d19372ace89f81fe8bd19b6bd03b23f1b8107ff3909a234ed3fd93095802480a06862aef179aaf05222cba3d6d06c0363f0f44c469deb170c5b2a1798b74baacc269ef201796422ef091c0b3f55e400acf87459acbf6aacad678747a96ffa5e7e8efb9f1f47fedb672da6772c25f74c797237eb85ff14c15ca3aa68b186fcd5e8058f4d685529fe13ef2342886fea5828d0fa02d4824a96d86e31f6e8286db96d748405701f2841ae18951c5af6e976b8498f3eb075d7f3e56880d67ac5df6fa7971fd45fde07966bb77d338c901f6c0d22e3ff50b79a8745f6ec2fbfa883ec02107823c1af433f017bcc302df7b46f39ac5e995e8572fcba03fd622b7aec836f0b1b07c21c71ef60c8bb597498fe8d3f372ba37e9b93a7462d2d7e30296accbda83f38b3de6c4c5ce9329f385e83724ffbd41d8132d440a97422358f3d36b63fbe1f7fdd8fd488736427f22410865332f8719043aed2022c47efbf5abbfc0f728677a0fb77ac5680f53ceca30ffd0bc40ede19af3846c37a3ffa43c8e8c7f2e209f14d21dcbe8537fba5abe397df2145de33eceefad62a2ad3dc803e3f2abfb6593afeda040c46c585c2ccd36560fc2f2dc9b9966eb253b588a0e1c9a0c8f24162a08c73ff7cbbb2bdd05c85ad0f9efac325617449d66c23a5639ab3d0dbea641ae3d8f05bbe2f7714514d02181b002b4670e2fe88a4ffb5d3f60cdd84f55411d09ba1bfd238fdd4ed685848a7a2c8d32ac9e4b9a4649fdae9e2f6331e6403e3ef053bd82649fdffc3c7849af87b8d7a06f4b0f1f8aefb6542027af20a7e741af88d18ba5931af4e32ade4dfa9c5faa7f60e9a93b75c97cd6df72a8e3f93b465adfa15ec00bd5fcfa9728bcd1fcdd61e9a4d6f451829b7a45189db8b5ad434eef3fbba5e43f756c8b4e237a8860ba78b0504f8d467b9900eb3f536ead72ccd2ade32ade4dfa96ba1d2f58706bf23bd17b8a9a832be6c0e68861b185aeede181f4828665057b818ee58584b6bce9e62ec2e24cf4d8161a1880ae39d1fdd276c5dbcbc9632005427bc990e2a0ad1cb0c543fd97e6ef7a4de36d130616f5d804fdbbbb5c05744c3bdbc4797d80fffd3f9cbee8b8599f8ae0222057fc083d26ad4f089e10a770deef3ce9829ff818d68be9cf27fdee70d23be22eef21d0a78998f837e5b60c316b4b057260f1365905b9cbe859166f1354bc47e2e9f1c5775e601b9a97529f7e921027de7be1a167232d579f7487d0b43ef12e8541dc1782c2e05b68f045dd8d1e07f43c5350ba504efe7eeccde79e77d93af9ef13c45ed1ad3ef8e2b82d2943f7a7c2931944d47f71725c6ed0b757bc9bf4f9e23b37b439bf504ce2a9a00762bb9abfdb6eb26bbb7820818a5cd37388b96670d99bb64485ad32996bf05821a18bbfe732fa517cf9bc85cf2d43e8494f90b46502dfca810af5f862382b64f2980209584cbff7cb05249165f528f195c0533f1b7ffcfcf1f29e8cc6aefe76dc3605109714e102373d078ba5ac71a6f8a581c02df1723c1706a60660913778e31bc07e79592a8425023b2bb0013f142b4a16851ad8932d59057911a367d983ab193b35103daea822f1f4773c6af71f4f919e65dfc543f20ec0669cd1839a7cf81e60aa89936209912221cf85425e3491a937050b356d17dd5fcc70f270a4e733eac007661d7cb010690569a3afec23e22315bc3d4cb9e35951aec5a3b4f45f6cab1379473cfd8ddd934cd3e70616e317868637513c656baead776d170f44efe1138e429b02a09013dfacacb995c9969089c059dc7c0faec69bbd5b7c05f1fdd3734e58892c283d3162c2d4bb5a12fcd2c4f9d60a81fa8d306079a296f91d5f1105680156437c5723148b5fb752fb53f50dbea7d698dd78d81a7f5750ee39c4fadd05ee014f3cc0936c6aa92d7dcae2b2a73d2a3e0ac4819bd002492f3e1127d8db2ddbc0b9428dc9bf527c94aecbf7648b7920263dcb1e5ccdd8a9c1507cc2b6075758bced4fcc87bc31a0cdb5d70871d075c74eec8e02e1d49b14d46772bf6f42522ce499e8901729148b22e1e9d581bdc8f09cde2c503e575875eb65592542b47ba6f30f53fcaccf63c4f4285fb69051305dd754a4cdad202fd2b849cfee512696e3a0a7e202cf6d8a5f31d1c3fe0adbf2da3e1e08d22f93e6b9bbf87bb28e4de849789690492c5d4fbd47d33fda2bf72deb864bea3b9342f09885ad435254214e959c5fb1fbc85227c5e1e2db23806ee2a6f9dd5f2a9fc71a8ad347c4faed748ed7d3af8309780eb1d000ad45259ee02c13a8280ab8f20ab7af9945f07eb204bfd8f80fb75ff03fe2d7325cc507b314f96ec17ca20fac65f01046127a963db8ec215e1682c94d1a8289e22963530677b857887edf0e6db8335d88c38e3ffee21e384fa6052af65bdc02d84241522cdc43d16b26965d6203e305502b0e0a8d49055238fdb653bb0f979ed28bbb757bcd4f9f2f715ee8f65882f6e0f34dd06041fb24f128f95a46cc03e11e0e4649807e62390e1a5ce67cc63d4aa2f764f343585beeda3e6b2054afe1467fe09e83d08b8ee676eef68e350752929089ece832e0864617478a2ba396947ff00ba61ada6327b0691b5b14a73a09bd5680e779e8475f11f1c7bc26333ca24020ff5f2a5eef79ef86680125b7b88a580c3f18630e834ac209d4baddf5d0666ebe79803877633f3bc9751fe847a2305948b6b99e74b26dec9bb9fb305fe3b32a561a07c9f6e002fdd0b8d4dace4384e89b7afaa78f7c23c4e9fb5f5a7b1a0e386b3950c116043f30210f79e93513be2bf20d0cb24d2f7d7849f7478e3ffd7ea93886765b3de323f9630731b47bf720bf812404dd1ecc80b184f612242118f4899e97dc2032e927db43adb97b703de5fd7784b0c46cc46e5d8be7e069975f291addf0dc42b2c41a6d8b60aeae80a7b44ad3427064574b8ba6c5b256ed298b444f88982075488a2c6eaa70e0277a8581d3d0734d7a7ff8cb5520a03872e37e6f2316f81e5bc0e222055014908348146fee04ca43037ccd8c5b7224079f6b7f708b5c5e778fb2b0546b240bc942ed7af65838a48b293e6e79ea106f20a461d00f78eaf68a77e0dc830a846014bfe83731dcd9ada59cb8773f36bbf2ea3a21463c7ddf19e3e70b31e0f1821b7ae3fc9a561f29d812e9eea460d20628988a50570a4261742e4b886d43eee317ed7e5fd121bf0971d90d250f3df78b1caf43db9c35e942c9dfd3de24bfc2dcc66f6ca2e7910bd902f1380f19053ccaa6fbaf191ea5a2675df3e3f4d5f35e207984fa93e80b54696dcb6bfb78202a5f3f567199118f7bb133aefb00372a30636743377d16b7ceaba74ae7a19e12dbe1fcec691d3a8be219237617eddb8357d4435045b6560c54794b59497dd8fd432d1f1f69a261fe08d712cbef6140f9fd5d17ec7370caf3521fefe13c919515df7f7ac700d55fc351491d93032f1ea709d38b9d05ad26d0b1ac527832f081e8df91141aa333d959c5fbeebadc6dcb5c2f0bb277696237e5aaa7ae43523b2178da13a309c5f8ee0467a687d5f38cdeddd859a127ab700e9bf4b5c2e615d3818a778df39d1acc7626fac18af728def2f836030e5b2f44af2f8e7aa4f4092146653df8c1d37f15e282c231df5c8b1d0c5a2d0244a1664b759abd68f18282a937034a0fe592631e1d7c459510ff77cce383a7bd2e445bd1f1a419df49f95a1b7a75503a0cc23c11dc59a299fcea0aef9ee6fce2d17c633933ddd67f7afea13539a2ef592bde13f69f2832e905e49855bc6f9f6bfb1412aa7aeb5801190aa3b4c657781f35e0e20ab2f20d3c5b77101540914b4f03361ff7111eddf2305921e1de8d879eb72f16d129e64f15d9fa9acbfefe6192fbff53ae8f92fc5db6cb311f9ebd60af1ad99eb78bf7a37503e4f9c50adc14de2d20076a20c6e440e1b142420ff7990a07f77ba4905841a9c70b4aefa3ad25b7cce5fd038584b1d0922957f9baf06f7814c60a66738de79215d6c60ad1a8107338701a0fae41cfd516aa493f9fb5ab6bf21b37be5cf69ccbbed3e097eee3fd96766acb8cc373a4437a5fc70f0b7174733a7aa00d60abe3156c814d4a29d4e5af9d844e4be97d81bf13c4a54e873ce999786748fea6249c0f5ca33decfcf2f6a6423d935eaede5ac76cdf228b673256f727d133e42ec0afc7f865fd17777e0876d260723c562b14f5fc96358b9a796d8f10962d3d91af69c416456d2e3834344fc76378ac90109689b650c9d20dc7d3ef94beeb817b3ea11875c280b4a8075c7b1254e95966fe5ddfff9f76d9b6a40803ba42b4df6187b17bfb039ec79a7956dc1ccba26233172d3d1e6ba6b52d1e6a60a101f142f242c28dba10f7b7adc169cf21183a0d83cfe6b5838ee983fe1c331925c1e22dd133e87bb62484728d1bf43c5bfaab3d4b8cd3a7f18bd413215ab75690140779202d61886905223d11ef786f98e38af8f4e508e8e536c92f0ff959d6209286b878fbdab305c3c00d7a4d842813d3e7fd972cc455a45722b7830ad93e1e881bfd87250b443758ac9030acfede74fa5cb0e159c7d2eea5ec2c6e1e836fdbaae3cabdf602b32c2f9da71386b03500df84cf766de9ad1bb6db1566d055c0ffbe56dddaec99fbb631108d81ad073a7990c9d6b6bc246b5b34307921a1251dd87b5e3cb7e91f1ebcbc87bc1e06dfc16cb3281ea748c07792c55b7b3b28fad981f160d24b9a7cc2e88739ceb28c38bfc9ea5402fc0bd7512d215add06c8d64674d616d646a2d95b03bdf7fd7115e731c1c30964b599fc06179b13f2ebf15dbeedf38da297acff8259a389f90d26fbf0fe2b37e8d9d2dad11ee284ff922c2c315bf0ad44127b0e7393669944f1b8504018f7299c2fbec7f61c220f84776c146f7d7bdb3b7aac10a2dbf13d1677c1eeb3fa842f2a80a274c33f3168cb5b4fa258fe70575881f86da1b3ae3ee0deb4542152f35bcc39cd4f948d0d94849e43dc11af9128e495d83afb2760d1d144685a746582ced00fe3a98496a73875cb16128a7bbdfb0cbeb9e5e96a45926ff24d7c5a166f93b5c31cdb963c4d7b7e49b72bdff48a69d7a0a7e983de3b6af342ffd28be9dcf3600ac42f54f4da791da2060ad10b7a50890dcb66f29bd4830ad4d524e93f9b47c9f9e51e6539a3c7e538d7a4a7e917690f15e5cfdbf2da3e8be8aa5a80bbf8bcc17ab22c137b564544ddc77096bd2326eb89c7051ddeb10acf15f57e7efac1ff1a784efffe8ae71014813e9c9e200e8cb21d56af3d8e306b048eff512ebee9605801ff7b4fb8f0825f8ff1dbe53491bec3ecf889c98bdec5157fdc11afca82b285063c6671c506ba69d1f56c5e41a9b4d80ed8a46fb75df7a92096e6db9eb64c3b21440c3e83d966a621656b876cdb963c8c3e4fd74d56b0b98915d3090c41d007bd7e5e3f9297409a2f656561f13cbe2051d26deb8fa3380f246cb60fe797cb41805fa33db43c153143d5ea5126996f2ca1b200bfd6746e4e1ff492ecc1e59df85f12c212b3bd68e0c76ad9101e3be33ae1c014b68a595bc884151226e85885a363bb84ba5d3be016a93486a64ed7854fb0a1f45e40d8be3d85e5a9071409ad89b80cfec12e87efc61a075b17b7f5860d4b608186032ebd61917bf602af307b2eac9eb3841ae65ad6cc825b4e6ce140224a0923cc320ca62dbbc04d791501790d839ed90e82d19fccb6e4b1574c1bf4032118cfe4d70b564ce71af42c15d3090cc172e08a5e85d06748a691e2a050d5cd26d40587124a0fe43d78205c514536915fdede241711835f8bfc26283f30e9894df328adfdd75c8f72bb5cdb672b13da4a2412fd816b72c287b2421f36303d9bcb99bc90d005ce2d26435052af4bdb31234388a37ae6ffb92fb671d78ae358c0330161d3eaad1a6837525220150ce2f73f8c271206c422ba5e03920a73f8f9b7add8ffeff2df4353960dd941042d509b0270931494da423bb64a6fbe66669383bf78a76e5a2358affbc04f389ecf80651bdb4287cb6b79423eada138d0679b516e6cc5b4675b1b48bab6a1432606fda46b91d77ad7fb7b6039439defd26090a552a8ea2606e31488785e4cf67fd7f4b807b599fc7ac93ca864060cef3fbb47e919f4994769edbf66eec1e50ddac2e9e9cdbab68f07a24258c1c530d352a0dd4bf9c0d96897532f629207825874924577746cf76107655d7081101dffbe53e7b66dd52704368fc3feaebaa2f64605b52281cdeb44d0062ef0dffbda485801adf890beec2b9094c753d7fa0aa4c3fd3bfde94eff00a172f1564affe4ed99c022e7169dc23736db2e5921214da052856c424b582fef3e5a03b1868ca278cc80015f8158b82d04a3cb504dfa939379668943880185cdd706ac21183e719af4ad15ef9007c775a6fb85827be51c7af8ae38ab9bc64b2205b2c794fd3a75fa428ea10f4207ec382e48cfea416d24bf493d289bfcdafacfee51961bf439bf36cf3ad91e5cda10f8ef590351b94bb6c5256aa0a17ab3bda6356f304bc1f024122c62366bb1953a36a543daec2e63853876af734f2b54c10aad38d2b02d5fea01e6ef7c9b6bbec74f4071b8e2f779b9806105f44141526e46f4bab7d5e9fe00bfde79e2e8a3134c1cc916592d9b5a5a074a320b976fbe19b618145b7a2b45a4f1c6f19dcbf85696a6cbf6760bc4c293acedf1104cbe99c5d6ec8a69aeb0051b5fd6104cd3e9a4d6f45ad65fbdcf3ff9a2331f9672d323b4418f17185cbe61e6b4748ef3d73e8ebdef9c23fe7970947e91734c7c7b04264ec3b0b4f21b0c1945e2bf7b63f70cb3f65f528fd2c2afcdb34ee651825fe97ffc776c65e2dd2d7a4721af4c1ecb2a88e94cf4b0ae4c0e1b38cede8eab10557fb79d113d5c552a4baa668568cfc0da48763c2e5008d6e9cb9dc5e07b8438e1a00b773c1ddbb7b73819f0604054d2ea5d4829c445a12d0c140747e1d2d2885e6cef96b8cdb6d94567d993a7419e07f80d2d938ae3ddfbfaf5bf588856b9e9a73cf08c4854d14bfd659c711fa8e81d8afafd7c76c6fd4876a6bd3ecb5bf75786f13e8f9d40e9e9c56b920385931c3cea6d4e0b052e6f847819fc848defa509295f2bb8c467f1f38ae9226b653ed157f42e853cdb2aa67bea1d194cfac18a7793be67a9c84e5ef19e983e3bebbee3f53b7e70e435429c7ffd9dad1f1821c4d9ab8b6eb9f45121fe9c5efcd5e819425cf8e2bd839fec2044db833b9d3a647682f618da7485b7955fcf6c0fcd6fccb04c5c419e6c070cd67f62b296df9e06fdd8f8189b905f9b7c8c35e7c9d859ee6cfe7ac74355cdb6bc52b60e591efb8fdfcb66bfa5b9ddcf962eac13728ecd2c88d650288f24476c88c230f074f10b7045ab549ff0abf032e039f821ac70799f898f067ea6889ee2e15c2556e1ef61d051efadc47bc3f2cd8a8ec233804744beff5dedfb76e9d6e74a213ae7ee5a5f394988851f7dbe68d10cf58a86110ad2aeb41edeadcf032907a423631f071e018ee771d8e6b6bbf07e0795c2b4581e2a54d04f1638bfef98ab0f962dd7f6b78ec7bc395dfe385a8c4af763da6384f2cb72d05ea3142e9522b5e7e2283e1a7bf5e4002f134abdf652fd4167d3cbbbd4dbc33803ba549f5c3e0acf293c47e192bec2d31d17f8283cb7187801de1fc5ab0fdd307ac50a213efef8d59ff1d9faa8e2da5a138f6e06e9e37d156c64e7a0f857f7f483a674ea24db65c74eb346668ba0bc66002fc3f7f712fb01ef85efcd029f6183ef0cf05d06bc12f488fe2425cf12df318a4fd5f2aae88d52b8ec0793fe18d0cb51f4a55fb418f76502a7e7e800d47483df9c00bff0cbf57822fa99c077c4771ae32bf5bdd4b6edf712a275a4ddcabd4e95704d7af77dae95b256975ad9b95f13ed3117e335037c4614bdc0f81d13e0b757427e2b402f205f49e6034bffc9bf621e73480ecf30f8b5cd37acff02f3e228d02bd6e36314be338aaf98b770e70f3e1062c1ac590f2c562d163b829bc97775b582fae454da5d3c817c1b5784ffb03d3c90a1d87a90a5d906b22b82a10dee1a96e3b9309e4b1cda2057317022a1356b83870ccc90045cccdd4ee879cac5efca7efce4eca3fb623b6b7e1e8276d1fb2ba8b7af2605cbd748a8d23b0218165be772f13e87bd3fcfe4cf57fc5ddbef3dc6df9b28fdb58e6fded53bda5e22e53d114cff8c850c9565172cf4324353d93c446973e193ac6d45588832991c3c4f6b0a5be6f2b2843a562cd9f6dc96906c732ba603a18c9eec402916e24a5a316d5bbc4d16e22a67f42c8bd9942ce0250b716d6c7b3437e4d75c7e75882b69ba6ef3f82ddaec1025e79f3c26d7e097876ab7cbb53d16d1c77b9fd5bd99a083b9c0bb1b5d48e8e23e72595ddca7f06c1d7337cee26e6e0c9ec71c433d53f6e9226de78ce3bb0d3af21ef5695a81603150676ddd68427da00ecbca7278e8886082b459f5edcd83d60247dca60b24c963947c0e5a3cf2067fbbee218b2ffbfc057f73c4494edfa3de12cd99e89ad79e939b793265b2b5ad5c8db3b52dbe28acf0c6bf37b6a4f35e6cd7a60c49ab3c85d9227fa0308d2dae0acbe2ad6e4fd09bcb0e94d28bb901c3caa4dfdcb468c29b5b31cde421704055330d8ba4ed212c868b7db1b9697e2301c5b479fc52d2446ceda579fc0a937ee0802a7b01289eff2fd98db7f1096f8775eb445c077b346144f1e0a2289b5002f504cc73b0580a34619162b26655d82c66b61856fdcafa57e7ba427cfaeb1b67bf70b6fa369dc74ef03d40f240a85e843c0fc2c903f81a907b0604052e97dd9704ea1055317b1f16f77581a4541c7f1e72c327fb4d1162cfa507b67cdf5fd4ac087903fd4a61bd379965719c5b5e490abde20a09c3f8a6c472d05c4545167e845978ccd3ad3fa2eeb9eadec2bc2249f0262e0fc71a5b2d455abc1daa0bffc2e0c79828ac3b28d82abc7b363dd107dbd3b2381eb46c153ddb1e5ce58c5e7031dbc57711ae9edff40a72b33d62f2602896048bcd090dbf00bf76c5caf92d4fc82fefbf60ba6ef3f8b5f45fb33dca27bd89629b5f5b6b0d8426b04a05e3d7407a3dd9efe5e356c8bf8543571d70801fc3c4aa8583804d1831c0a93ac61d8dc43b154e4914cf54e548f2398557a23c29ac7087ca95328147800fc28e5548e795cfed07fa613c67c64623c0f3c0970bbe4a15bee0a14fa68d8b08f1e5fac805f3a020eadf04a4d8e277807f56509f6088a9454f31f466ca72c2d6283a7b8b26fcef01b13641ed9b4c8184ce33e984ba034a7a47be70daee6d4f12e2a4ab463e71d96142a44fecf0b709fe1ac7c14e64a779d176516fcb75c64569cc546b0cb27d5db4534114afd46b10515cf6978baf527804789e8ebd2316ec8c05aefab954cb41947bd98b613ce7e0be30ee73709fc2a7ead873897a3f62fa313988e26b3bfd7cdcbc2384f86cda9b8f7ddc463158f7a882b5470222565cfb06fe8e359006f49fb748e82bebf4031f89ae81d477ba076b20fcfb33812bf9cb51f2a7e5ab92be57f99b0ee199c023c01dd6be33f59a613edaa94979d5f4757bc2bfd5edc9fb4fdb2b6183df3c46af8202ad8cdf4a920f3d4e0b412d8cbbb3d03a267d27497b503b64425e74fb307948d61ec46fa5a4a0e8d1bce25af87512f2cbfbaf02f4c2a057c9f905ee30fa167e05f1e7825e29a35fa2e8adb8675155740d64d2ac8fb6dd1ac8d6522098d8e237d98bbe4e4e643d5fea3b39574e9c2977a6dc72b8bf9d334d2861085c05f06c35409c990e2d299b1d90870e70f15ca9a06955e111e079c0b1062256811b5a2c2c8580d3a27b09f03ce0b10110c5d79df8eb159f7d26c4b41e13264ff2f320de12f7345cabde5c3b5dc1fa6b00bf55d0efa0837f1b58d1b1a310bb2ceade316589103fcc5ef8514d0d38a6897e0af08780d3444f0aa01438790ca4602a4c5cc3bf03fea4a01f52ebfcf42ebfa55d20c4397f2a3ef01cc9ef6e55fb3e3579a5fcdbcba97d4ff987bce91c71458bbfc60df0d862a65aacccc7845c02c59ca7db4f097405c363eda9ee77f17c312916a8cdc040b44ca495f85a3db08167a39f676a3988e0bfc46714fff5c455b77fb583105f8c2f5ff3d93fd49db5e8afbaab814361d420345987ddb31a707e858ea24b8a59b30ffa47a7355281ccefe88cf44bb91cf6fd3401e4e27b573b33d577e9ef75f1bd99e0bb047c67826f931eb56f362912935edc045890903e53a8b23d39fd4ae061f05f9190bec3e897307e31e169032fa6a8ccfe2b019ed7ccf6d0133d53845c1e92b5472c29210b6f013dc8fdc6f30bfa307cb46205fd08a36fe7b702fc0287e2d2e383d1cf54f47e882cdc3faa40e67e3af18faf403021ea45594c807e0867df1ffa9cd2e329f9ea7d53db0e9013999e504a9927518a0ec947d64aa5d960b109857548a5c5b219048fc645964e31d3e415014b44e198f81a3eab7f66cd0b424c3ff95f9fdcbaaf101b0a7ecb589fa9beab1e618c3a84b2ea4881c88e69f9489b6ffc0967c053856f4fbc5188aea17de6de9c26c4411dfb2fec7982103d4ee9dd77c3ab422c3ce0f31b964a8bb7eed39a17424fc4dacbbf52f604de9de15024baee64490c4ffd6b8b23529f136258f1b517f4f95a7a1abd073f7589e4ffc05bf2863f34d73f052eedecb37c3ed39c15ed4f89b64b816a778b27912ba23965daf2cd648adab10ab883fb145e499e04fa23a6384af01c5ad53291ba946dc7147f29b27df2b545aede93670ec4e5950b2eae9053e4bccf663c3c1f1e07f5572d2910f2440e347fd7d975e441ee216787d107a5777e497a6ead3b7d3c72a4889727d56e427bd0ea7b33f44451827623b98f44d14aed4147c0b7c2631e4821be7f1cbe57194236455dcae897980a35c06f6c622b01ff9906bf79568fdfe4b752e305c0897ea6413f93d14fd61ea4b8207f09e43673a3daa342d3e386cac6f25b62d00b7a50aed11e8e95dfcc787eb5e27341cfe251ae7865d15dbe02f9f6c64fbfdc760a24d572e356bc6aa755fffddb3f0bd162c7562be37ff7105384580b6f2835b8171d289e70f0772fda615e9ec245ae4713be8a090a86e7295c60f15c52a5fc6b81f7e51a389d1406e527bb279a293f7b69c583e33f1162f5c0a5ed7e3b053c66016262a7a36e756260b110832b2ffde06f525186faa4387d7c8fa34244fd8ed09e29b7f80cb59bda39922fff71d6f9452f2e6b2f3b2fad7ecd47e7caceed5abb6ab69c98aafeb5e18c6fe64bda4b1a4eae7ad727ea7cdff896042f88a57ec7a79cd9e2cbd633846895d2e6c17d0e90fae0a116bbf798247fdf3ded8ade55f23d53433bf4f0155cd851f6f60962a03fe57858dc73cae94b1d8aa9266ecf32d51f5e2f6f14dacd453ba9e9b40803b258b5a4a73d00e0346121e6ec50619deb94e339d5af61e0aeeee772c66739e353e143892ffd1dc5ea6e2d07517cd590657badf04bae1e93ffbf0bfd76392079162e703a03fe13615e11c05c5f8978ca4fb9cfbb25f66b549ea254e4305738d6689c71e057cb25e4ba58f11727e70aa7f6cdc5f3114d4f18df4fed51eed0da05b5a7490f752a7457805f4eafc2c403fc127d97f14b6301df238a40af18f404eb3f6a8f5cc66fa03dcc792081dc6e647b00af30ff1ee097e8b949f80db3792af9bcd524bf02f22cf1c4f489df89dba390705b792071b1fc5d2ed8f352ffdf6d77e95c71913f95c72c9e523c0edc1a328944a13d26a8f03ce6499026cf77a28122672ad64292844c7e7df7c7a73e94137064d65357bef28a62b01e057fb51d15a41879ed55313cf7b6337bee2fdfb4d3d2ac95637e94f416398f473d31b2204bcc509cf38833a3bd7c3e7476ca91d9274a45b0a4e55561c941ebf5e9f70c1922e19eed27f99b15b679b7dd9567cafb5aa7b7ffe02ce9f1b4fe579b7f9d2127c0d4c6160f1c3b5c3e7f7aca80033b487a5f398bba74897edf587c5f217ac1c5f715e2fd61b49fe939104eae7d01428a654d87f8b4255669099938da9388eedd2365a22dde17c6fb95f4649a9e83954f41b8b6f00b0dbe9805fafee1cf1efb9454e86bd6af7e6feda1e837788e7aede311056bb06b56dd3205297b8b3c11bf42216bc881ed3a7f293d909a8e472a0f24b036e002577b15e5a8ef6dae076db53c4b21bff9e897580846b5970ec1f0b5bd4008c6e457b72ff3a06cfc06d6326c2118e641c5220a8e41df491a51803c680f44d12b65f49bdb1ee411f39027e7b7c2baf6c2db43d1b3785071f356b3f88df3d84bc07f5e227e7f58b06848d403f9eed367ffe3ea40b42527a7b20f1e78ee81cade92c98b1a2e5fe81f2c434741f6d495a10a1fe8758d3e333250d9a94ab3f22d95c954e1cecfe2a60387eeb69cc5ed253e8bbbf2d239e203ec1e4a0ddb8833d21b309134ec8bdfbf92f3c3f893bbec7b9d9c585e3ab0c758ff88db2fbd0bfdba095e912bf9322be0fba0f29e57d2db2b8733e2f98c3be33d17f4a892351b7fa7f6cb36db13672bb3b3a1637ca25296ce92d7edabb34050290b9b932a673d9da5427c16197c0ec711af492a86359f439354bc0f44ff4ee67c2abc2ab476dc1239757fffe3d7b7fe8423a51a719a3459f3d8a54d3492cdf70c203c138f56e38c424f6f77bcc794a79ec0e90cf2817a13cf6655203751e1ed815ed315d3aeb562daa43f3640dfb2434380df9189f8f558e5bf673f233c71457673e561632bc8f32ded413b2024ab20f72cedd133d01e43f15c86c97f604705ceafd11ebaff680f35be6303e7f76641e5c9dbf0daca1e08d96021dabae34f7270ded4509b22e13e27f72eecf6a1fcdb8fa9837b5f29fccad982e83dc54e148a7f8a0ba37095ae1ca7ca4e552d9121a87254e13982b2b6e6aafb6091e2140b0ac188bdc411784ee0b9cc785e79c57bcd37ebbf59f89d5424f3befa753ead6d7ca9602d2cd4fac142ec11ea35a59d9c120f7becc45f1f978a24f459e8881d2e13c10ad45845ee06bc4fe17d54e5bd3345bf3a33099f39f17ccafb72709fc2ef465e382a95e32a93d3f13b55e62a3cc6673ae35355ca8e4799232abfb5bf8837c6f19993904fc2c7003f5074c073613ca72c39375041adf0d1492adeff09be5721e9220cbe4a15befcba6febdf9828c4ece5ef957d75bfe2a516753bb4585e8bcaf31aac79d41cab60dd170a3674c6378ed6df2eb2661f98d7e945e981ccebf8eaa874115be328831c0f42bffd13df5fac2dfda62b90b9a5cf2bc8ff097c2ea3576aa9201f64a9c8d6fc6afa838027ab984e6f92dfa9849b15d3baff908517b76341f32ac87985f7665690cb7e1a0b3c2721fd58c57be2f688f19b6ed0cbb1d0b3f36bce07d47f15a09741e32c31bf2b672dba3eea814cfbec95641e48d56b0a363c06f87b5b440fd429c0e9d27510d2f3d9e3ed035aa7be2f44cbc5adbbff692711cc0629c59444698a3cc445e9bf3aed4de17169a04a40622118ea10c55d8e0e7544149389171bd3fb75ccdbed2d217ec95ef1d8c77708b1f6b39feefa0d1349dd3e42b45f95d1d5df96fad813fef2d66d2b84481bd36270d613069f3c64e02a3e3011c4421c6a5ad2218924d966b16c1285f345ed4148bb8d40b16e6c9a2de793f89aaa27e864a102b8f2ccb5a750046d499163cd0aca049f25782e137c2a9c87cc4a11220a2344c4425c9f5ff476b749d2535cf6c482c77ff841fd81b2af74e88a14c859c0b1cb320dc0c67f29a8f7f3952dd3ede6ec99edee12a2dd1e9d0ffdfbc922b8784bf254aadb75a6c91f5b5ccdb32edee6b1ef2f003e135f1906fda8bcc5a5eb2a7ab6e403c6afa45709dca4b7b1fc9201a443386c3cd8b3ee4cfa7cb19916edad212ed06f667b68c5c7435c443f9875d534bf791b1b924bc26f01e805e60393dfe58bbefdeadd638458f8f9171f5562a6ac4356282581105ebdb3820d6f01feee14485801ad402a002b01df11e2a7ef97edbde25669c1753ca824da22e7893fb5e9156d10377a139d3d3155ea784533338a2749b3b5d601500cba97eee07cd06972a24b7935e59bd62708b1fb7dfb5dd44f7a22dd9edaf74f6de590dd6bcca1693dae1562ffbfe4b62a9478cb35ad77df7fb89d4f6bb6190db05ca530e574908ff76781cf30be2f8bf19915dfda4eb06e057b046d629a2de773aa4e53dc0fef0fa37d2b4c3e2d69955ca1e604d2ad238ccf089ea3892d62f019cba251783e14e654f24415fdba236b7aac5e2dc40be7dc7be413d270f17ef56eaf437d07d5799002a9c1e697b5f38123cd9a62c58dbb8323173053fed6507fbb9f7db7dbf2ec97aff06dca2c35c429c9404a53259e214b14dfc9fa3fd34c7f4dbab657862c2ced295aeb5f14fd4a4bfbf2fa873cbd984efc6736c56f5c9658627e0ba0e86213a0a217933393be3d3d9ce8170057f4820650e6c6b4475c9618975b17ed53b091ed5100fe938d83e6f14b6bb781f9c0a4bfe0da99f3a65e2ec4d286f9e52b919e54cbb20cc910aa56db98c6d640909efefb5320d4642e704c797e3a6af51deb3ef7ffbdf7f8c3e775f33751bb2ab5dda17ec8270c4f424f046a00264bb30d4c287c51ac0013dd384cd08360b9694dce3a9ce7bf0f0c7dd5e238e991fcd0fe929e1749d8b7e3b707a609913a33756c863f84c9420f2cb6f1c2246dd917824fc2d57d194a6126b0f00a0cfae1c0c054f793a7528cb45b72bd791aa85600cc62aab428d46cb8de3375ef96e0b94cf05982f6cc447b96804e26f82c019f0a8f6db2478575ea3dda1223cb0b78d0b233f99c4aa13933bd7445d577f3df909ec55713df39f1f34e8a73aaf3a00156f30d202990f1c05127528f901729104ae3f525e4b76f574ff57baee74b474d1979bbfced5ab14bab9ed1f62835f82b259ccba9ceae528aa61272a0e5ded24f836893cfa63de88d586cfe7ff2be034e8a62f9bf672f9025a380ca9d020f0e13064cf86ecf848ae23360fee9617a2afa147366c02c6605b31ea2a21c2604c4802c0a2819942808778020395fbe9b7fcff6b76a776a76d8232afefb7d1e65efcdd4f4f47477e52a1c50011254d0beca49b2ae0a7d125404ef9918bfcf3ddc67ccce433f27117ebdfe0dbe60f765cf7c308325d7ad12125ff5e7230ffd0c8c9fc69bb1cdf908fa7eb94c5873c5f83de39ddef8bbc73e3d5433e6f3963fb601ebbcbc25a09044d888fe9681248110646f44d922f287dd4540d058f200e1905e596e29d8666d3267ad3b5c1fc80736f8e6aaabe2287016473e93ee3de18112a832c9433f870f428adc2537d448b41fa43291feef32e29d38f26c31cea481435244463f9775a36661e7f838521a678e679c7ed5066da47cf469fe32f17c332e252487208e890f408cb3bb6f434680c7f49373baa6df9539bb7e98a75c739f509df954040104354bc4a9b884798c52e3c6e7bffa8626186b162c7b6e3d050e529c07241092344a8fc7efa4d26a6d6005d2f53301810a8b332de8959655d079e3156e40696b6b73e326f1848e37fc5d98475a8761338fc954b13e158ce9e7132324f0258d9816eb404a904ca899e3eee1c15fe8c59f34e2bd95c9fa54797f45f196a3f461f65dc9bf574dd487d8f95b2f58a219c9ada91b9fff4d4b7c459b373dbd48cf6fe5191543369cabe77a6de58325aeae3ed77ac5fd8ea14ea189355c47e92a75a575b54a24a1da78cf1edb331f715e6211dc4784c9c67d3db6673ee2bcc4bcf882c69b13c0586648fcdb96287f9830e4990fd3f51a5e5834abe41ef3a07214ee6249041917988020d0b90281d0aca26d8591dacadb0a447fb711103c8854587c6481907060a1fefb9211b316afb959a97ffdfbb8369df546b7daa62c38f0611517482874c6d55599f007659b87b131c402d848975f88fb6cf4cd824966832095c900783f7487e4e0e71472cd7d01075f06a78e209b407fbc5f0fbc9f775c4c0004472a5571745005ab0a3230ce3ce0317dc93111a1ca86dbed14b8ddfa360c1f505675c669e5e33b74e5f9a571e68871e6c48f3390a092cd0c81849b4e5fb376c6e74a7d73ebbb978c4092ca72a8a658f280c44184830849590b4018d92b8719c804041b8cddd3dd00d91b4f7ca3db3efab7f7ac051919caaf82f1dbf4e43a357d3ee8f940c930d789ef84d43cac8ab5b62d41c7addf5c8cdaf6e0cb912a988088691530de1fd538373ea9f8aacda316ea03695561c1bd63aa94faeec2813d5e68a0d4cf277e3e65a8dec9bf2c1933e26b3dcfb33efbe1b988be73ce27e3d7fcfcb35273c74d786ea296e0667d3076dd58bd4266fefa7dff516eca99bc6f2bbf98a9ffde64c2eccf349e0697343b75c3adfae8da2f2d9a4d2aed98f470e30bf478d65b75a3d9af99a14c12416e13c1e1ef24f75726e623bc5df3919324c096e62ba39ab697dc6d4b50554d2aa7b881c8911b06bf936fdc8d54b949f41f5bc714208bf5cf2a2c100eb2853001a1144b11c00215d076b304e233a60f042c04a4941c9a13699ed2face559394aab5a25e2337ae411f58a43289e0eabce8bffe140fd17e9c686bfad238988f0dbc1a1bce463c08734e92334b628320954936ab76c039f838051a578e679c5244ee24527bf042dfee9c46e8b32aab07ee8be0fd7230ce88679cc93826da304d49e514a03a1be84b71910bfc369e67fae09c351e43c883547c52a511e49f4f8176530c219f78c0f0975ed51b65f9bb0b1f5b897a2de5a49a2255158ce52597a04fc64682cb0dac34456b5595e0ccb0ac5548efa3b6bd8ffb2c53cf586845ea9693ae8c9b570b57d33d03b76dd3ab6e04b95ecdb9d17e57c697eb998f64127450c47b8ed99d3e094a8cb7f2c18ac65bbed4f3fbc0c289c3ce576af49fefd57be90ea5a65c3bf28dafbf56eaf7b9d3facc9aa5e7f6e32d955b47623e4917ffade893c457e6edb30a66812bb994bee81e7c0b9f9cd677eeb14afdfa4ee4b9eff5f798bbfea7559fd557aade7e8d26ba755eeaae6aa85a3dec563c4c39a55e370fa396703ee2be5318f33316f313c6fc8cadce7cb06a96e7910995b99ff6af94fc839c5b32d8092113fd30eecbc4f8a3fd4d87aeebffeb16a5a6bdfccdd21f0e8acd57fc7c32240282f5ceaa2b8a6f5a64a08f8004b6dd4d40c20670c5bd5c401bbf9ba956217d1414fc3e73e4b2f17a237e78dcdc937bb81e5ba19f5bb81bbcbb9114f4673264278737a459e8037d3a63d3cf50b4114c9f921ddb6634fa5f8fb1d5e715954c65d21d2a890170336e2a24079fee5970224c007c1c79d8e0a9a6734090f712a5f6608e97cf3be01792838d71048d930209d724519d091b848fa0c624895cdc9738a9257362c992e211e137f3b765fefab4394d951afed880eb3ea9672e6095153616491cc489b10da4b981ecf688acca958d0de48d6546eeb1e91dd8aac3b7558b95aaf951edf2fffbbfb8f1865925553d9b1ecf2347b217e23ad3275b495756c59a7e500eae205d7b4040a9ee1798be175fd5db15076d3e52a965dffc36fcf3e95ab298f0ee9103b464372ffcd393335fd273397eeb7745501e9623a92879b9b16a909c1630dfecac405e6f046581af050212613951ff7f4ee9545772fc7dfcf4450b75ffd737c6fedfb097b5a4f2bf669b975fa7094a9786d35bb9b9f73e4e5d52bfbef2d93294cce955fd9c6489e7374718dd837270f99d26bcf8fd4e0863813f1c8fef8fe7e7bffdad5edff3664fec3717de55c40095d27c8371622fc3d70cac80a4c25e58309ec7e77adb76dbdd040403600984fa03012959e05840dd6f7c7dcbf4dff402a91b6a78d6655f4739ca4894d0c4447d7377a1d8a031ddfe403ccbf4c998c939b070e0efacca6424249a6c1cd06b701006700a499304766523a699a5ea1bed22629ca6df1d0b6f249c0562a2b10dfcb9789e8d71e6e279369e978b7152dfa8009bb2e440787a88fb7a609c36c69998a0f68117117b272551f1c5c69981e7e5457fa7fe0fce6dce051ad4f938eb39bdae572d5ff2d15a24916495155454c481913b23111096401099ce223e558a8c0016284f7373926de8f867c51a3dd3ad061dbef4262df158f7584535baa81867db9d9d43e83d0d21118c449c243910d7997e80adc46f746709c4cc73908a33c89d54d8b4365eb9a6f5142d6b7ffdef37cf78aa963ea88ef8e98e5ff4015d3ebae4fb121006962828abb17087269d3b3b2790ca10991b28f29fbde128a383cc5146df074e106404a6cc10e557e843f0d9cacfdcbfffbe7cfa9085bf2b353bedc71786eb757140a3f6dfb939e46a3fbf4fd6a13747e73dc3cd6abdd339c9644609697497e78cdcbf7e9ba1c147b69798d13dc3831fe39df4c257a3df5fa6d7fbe38591b553314ff41d48454b8419fba0e45ecc1b083d491eaca2a53437052a49db5391e814d90b33334572bb91db6ea3486e37abed84a3f2374efd4abfec1d251d877ee389e49491ad3272d61b994cf5422872f61a53f17b97d5e26e6922da93d6e2ae66c4bb1e574bdcd7d433ee6435918322f37b7104bae127fa8b08f7ea47bc9b3e229fe3e6b7bb1867f7f871aa21de1af71401cfe3c4fb6aac8923e91d8e78cff6cc4b40c4fbaa37969e30e609a5664d19f79f455035957d602067d9ad0f78adb75f3ec30b2b071b58b5c140e74640c70bb9145013a5d63db77c909bf2a4626ee9800fdac67f7facd3e7f07ddbfb22c8134720d33cdee4c8086c83ef1ae0eb9db8c6bf9eff1d8a202ffa6063c96f9a00cf787ff4214f6b82f1c569cf5ffcbc9ebf4d5dd634580f89acf41c038bc108163d6de0d62d066e419afccd389036773170d326c01a8020001b7f42ff0b40d89c36e2ef9b7ef2fece90aeef25f00f8b3da7ecf39233dd710f1df674c4adc13eb1df975bafd4e3da6cafff6c74e7f875b5ed08722728a25e6694101910f4f9b0ed08f2dee25c9119001c276cfadecc0f5b8fddf4e4efe97abd6ff8717421050652660c043af3b94a9932a89c04dc7cb9d436f5b30021693bb35592b6bb25106a1103b8e21ec111806b705d1ff46f763db4d2de99fd88524dd20e987e855e20d62bd6e7e97ac21445a6f60307c691c9e0f038b2d54402732dee4b0d3dd57caf4985c8b5b8d99bc58c8a543e14f1ae0222de6f374911d56aae5b427efe05e89be7cb08e230c63150f4fb21f2be3bc67517f07642c46a2c92dc533b9e8de532e2fd24d4148f457a2bdc9781fba865e03a85eb32709dc275a68f4340cf5f187f3792c85ddedacd7191be729c32e2dd685e11772b23e9154792f3381346bc571554dce3aa4e46f47975f9b3fa08dce26c98b7f94b7349e9c10612a75c02955631245fca75553addc032a46dafc0015709c9a48a529d08f746ae24b9af81218ddfa9e5349df6ac7ecda733deb866a9fe5baef559541239dc7c5f3dfed518ffb62390791e5912c13ca27f9cf922d65052a18a752a3309248920affcb9fcd24d1d95ca5ff7c45df7e87db7326ff147cb911eb21c84b80c11fba5eb309f3f623e3f0144a1ae22d4d62f869341515df451e7a6e439c06b808ff09224422a97530141c859a5456ed894fd9a545a22f2ba02b6abf217d03f52a93f272cfa6ecd214afdf2cc98c563c24a1df65cce92933421497d38edd7a6ae8c4d11e4f062d4fb8d723b542f829cfb5c86629b11e4b1887781bf9023f60b300e05fcd1fb7f9ef5c5d32f6a867b79b7853dff840a8a5557349fa980ef63beb09e4bb02f2a487545297b28b50fad7322201115d0f61401a166036618e035d3aa98bbafde226b1e5df244f1c94ab5a8dfa6cb2afd42358beb6e3ac3a5a40538901947a0ad804450eae746fb1d38421b8184425530b67aaa03b6a1d838f0abeb66eb4fff6cfa490309ab19a0276c05d5284813c17d34ce8818a71dedb2ea05de66dbeb662b03be726143228297345ec1a72a88bae9fe725ce4ce0177ebb53e6edcb5f321519412a40d035515a952d86d17aa167673a4c2515718489c1a07564500330ca037a3025fae2d6fedd43f46bb3680d6a5471fdff876bdc51aa71edfe91e97699205a5aa1d319d2be623037d8fd7996f9d4a95a9df6d3b8aaff2818ad3dd0aa1933e1ef6f9139a43dfb06ee5cfeb9ef3ce07ab0071c03341862e9de695e13c5c0f5514ab08bff1e223a706b66d60de59374f91d29502e23a4ec541bfcb026eef88df2960ae0a5073e0ab9e5e72f6587dce64b63eec8113f57852de4ec9744b39fbe2a1aa1b419ed49b935494c96c7dc027ca4e14e56fdce4ba3d7ff9d280538676f0ce1fbba5932a906c7bc2bb909c4868fe4875c581b211c002017d6d4f131034e62a3d5ac138481b72ad528ba7cdf86ac179fa034fedf8c57e7a81a67e9a3ee1d07a71c8329863b6a3f792d191fa647ccf85ce9ddc6e27c37ba5ba6eb6d256605bd124e09a90dc84fbbc8184c974d0d2a84d6ebc4d038c77d50cd08b2bd87416f0d4c5b8c3b8cfc2f3c2783f2bc938cdc2ce12de662ad0389e23c69923c64904561ca8c9e215bc04f5cf768b078ed207d8c8b75eb787233715a9a44a5090ab14075909d93ea84f5e57d00d13c74a070f7ba5089515415ebfe00a99f18164e3164eab5559afc782854a357cbbc5e357bb6f3c5ddd977a9d8a8f7bc930ef19e81c61e6d5efc51789f6b3b9a0543fcc8fe907474c7bf03ba32b2f2f1ea9d4d482afee7c7a88528b7e9cfefd6252fd1161a5c0331c3825703228c6fcf27c1e97b8cf368fb82cd56eab808e9e22a12bc88d14849a0fb6ef13c34a4a6a2a74f7fcdda0aa61f75452ed900ae7cad87d9bfbad9ded8e6fd3b2353d22faa438b0ef2103c28bf5d9d3227471832312326a76b4e78f5bcac055f84e89d76db5c30e0ad9abcbac2e10aa5f668f7de31dfdde4b96ce99bf6c901918db3cc82961be8022c302650daf10f3cc95362380052a49db4336106e1103c8482337267106b4107881698ee4fb4ff3163fac5fb47c76e9b3df8f4e88db8ee28ad58e367daac59d0fdd6577aa89ee84a370476b71dbb095f86a713b36f043b76cde3ab0283e6645e3e91d3f2efdef1831ce31629c63e2c7453597b9c67b6feffbc7d510878d2171edf8b871f6f68c13f3c778148fb3b71867e2f98c8dd3f4b3a846b8a8711f3ccee82a595f77e59d939e52ea93ab9ef962d0523312aa0059d6c640f23e2925ce998cb5a4022115078c88cce9d201436f28bd5108a2b1ae98d631d6b5bb8e674efdeea11583f5613b65d3f98f1a55c21c310f63f09e61e0f27c6f7d1d7d8f30aef3ce2b7f0fc627d7a917bfe3c5fffb05d3bb0ed4046f61fe9435bf8333a7fd26032c892014df23fac580d0c1930a8bbddc4679f1b1e441aaa607bdcf6548bf7716bf770ef8fb775e4878cbc5f727899309dea8d8f87f9f30fdb83ff4fa99f5d4d883ee18aee7ab8b33cd4d79c335c855e275ecfb7ec135f9e97b1a7c1151e33ce0fbd1be58f79f95ff9a3449a91f27e40f9b0a1521a9a0f8bd1ff0ce17f7854447e72c9fc3b4deb3bdbf276f7f9104c2818644db491229f0f64303f07b5f3d099f96bde94ef5aa39051b22b65207fc9255e738bd10429b5216366feec14d58c2d17b93051206b903077ac770df70e403c876b29d6eb632e27d2cdc6e3b89d41e390192830a901c689c9475b79ade66dbe0784d9f395eaadc4ef32b6b65cb88f7c40159d50e248437cc96633714cdd1339d5ff8d4f8e76fd59be3c9d247493545eea27c206084acb2a2fa1e929040f4272f1e4ee5f02ee0558074841400da06703cd340efef21f42dcda02dde7fc6cc5f6729d576ff63d79f3d59ffb63af46713f70b0749ce314ed46009f236cc467f8a74271539b8622a98e8fad87cf9bafda7efa3cfafbeefe70c5985f7874a880ef6629224b0af48a2639515b93fd3bc929b2e54246493a8b8dc8b9f5548240148ef1f48404c90a18262828eefc18ca8b85e465257d1f70367cde518c85d15df9957aaadd4b225f3bf5f7ba852ad738eeceb9e4fb546d57df75823b1627e93781f2697282378a657a2cc10f811f15ef95179cb8d1b95fae2df2f76795a334e4543370dde0aab0c49d0d20d9dbf8f9024997063fdb32a8f54b479cadb222a49fb8b09888fb3cb330089b0a31b300aa1ec71376cc9335b9ea85ca839d10bffbcf05b4d699b9fd4a676c719fa5566a5aed9bf7382a7d0464520a13eb648076d12a7076dd06411ef64cccca2003645c74904ffd2016dde2e990d82fcbdf3456a8fed0dd02b64ddb9b131b0d15d2c7419a0e7cb6924547163b9846a4f8cdbaed638830a4b753504936d510139b836ffb06ec22fe729f5e9c2e7c63eab0fbea29f374ddfbad50c8ce2059853ee6ba02420acb222b7533ae0c84d57a83ef860a2b4ed71e9dbe31b138e5cf433bdbf87f48a707eae7ac435801e909675836bb4af51b3f6a2330f8c435280d51fb3b999752675e103799ddae89be4a04d45812abf4d2f7a7fe53b9553b76ace7a5c8d8f073e3345cfd19b9b8ab7bc82f90848f7cd9cfa5cfc0e022d397a72df65151508728548d247f556e4c12f09b3efe0a27e9ee8033a825030be3ceff3e877ba8e739ae1b9cc796bbc8bbf9ef9ed2f33f5f63ee9c4abc2ba9f529cd2b9996bde962aa96405a5628c9a8d7734fb69602023e8c137e3f8efef76eb0acdbbeae73e0bc1e0708439158822b774b23d918d4fe476e3004d4a5db2c8ffde1e98b4fd5504845a9e01c4c971a0a1e8d3c68c37be6ffd76c3603797cbf2b1f3cffc5a4fd4fe9ddb4f6b7d8d52a91bd31a1e7c6d8267e52bb8e5527a73dab88263080a20923688eeb0310c807f44925adc496d1063d9ebca2cb01d0dd00b33a112a933b633402f281dfe94ed0c240c26a8b9e63e11a782036fdd0b2bce1f3f5e7fb6664f757da991de1c2f6fb9bd085e7b4c38289e000759710f4088f864ece500411190c61c31447be67ce9c001a1f26da802bc19181b3a0a9880647aff1e5aa2d48a090b3bfeae39bd8c9cc31f3a42738c29dfa674ce3cc883d360cdc0bdc99c43b24158d690d34560c474ae0b96a6ce993ef871a516749a346d16fc838880b29b33248a22230bc76c1d225e866d1aa492a29c4a24c9615e1d92348860900461a3df9bdfdddb643fa8d9de2e7b2a45c4f3d058699c873e7de730eecfc5effaefe545a5eb5c09a6ded0c68fcf3956a926630e1873c9ab985ff70bf873c7d9e8e79a3ef63d4b94017161858919d6b2fb4ad7ace9a0d46739cfddf736dc99652a1e628828ae83bf13314ce4cd86efcbaa404884acc222d5556feffc246f7bda0612d078e061f4a54d041b9c757b7480e88363cbaaf5376cb953a9af7f7b7d7aafdb35c77aceda7b5e772732a22274bfa7d9b00df44ea6834e6283c857d103dab910bafc885797bf1dbafd6ce0e92eee0b639c5e5dabe3b395085d39fa725cd9c2b621c6a96cdf389d78fc2adfeb971ed3edd2fc117ed18fe9f4b33de3b439aec43ce714e747f7205fd2744eedfc2ca586bcf5e4b12ee7557e4969334a0ee79338b07198632689438aee14e8465e56a40b26880d54253931aaa419d078dde27ab68190aa04ebcf3da88b9b6fea553a48a91f6f1fdcf08695fab719654dc68fdb06eed8f717b60c87be07e28fbc362227ecb541551e51b160cb1d4a4ddffccdb01fe0564b121707ea617ed87b4710661949ce8443d828a48ebd4ada88b2bd9079701b3022672149b3bd909f13a0d377e8bbd0381ff28e9fe6a13c2ed9e60ffb7e74d84c2d01977f5cf2c44f676cd39611463f823eed2fd3e7f5bf6d1b5fd9d8b2e3dca49f5faf7e7bc163e4464dde700fc4c6e5b6d280b204acaa123611b2f1c9f991f358fdf6574b20d4228921ab08f2d00787c91c838dbe9efaaa0595ebdcfb167d31eda9a9f594aafb75a3bb7f395f73108d1b3f78821bd1bec0ea5c3bcbf3cc0ce08a624bc0317824099fe49005afaba190689a52ea942491a8413608728bed847a1bac3a4b5a235a7036901c46727c0aa9a0308b4272c809901ca4089e2bb2c006e5e00af62e19eb1927249e67033dd20000800049444154caa3ca87ba1b66f26923af7976ad3e60af1c72f658f7ca91ce264ebb4e1b8674bc50a530c188338646fb58d7e44dc48483bc73c8ff9d4478e2446df4893050cc49508b18c01274d8db9792734813bc92f95b4a5cafa0351f2cbbed3bcdb1ef5fdaaef258cdf18756a76c6af140c267640077d8e0c6aea0dc5f6bc87622243de4e05af3e2d2b1a3f4fcfcfef2d46f669c6750920a8f732441a2209bc756a8b64a496585dfd96b8d5454940e9ceaa5d07c1600d2c12de6b7da12c68eb608609e80384f1cf1770e27a0f3260c988bbfebdf0fb832eb3e37f757bd48c3b6dddcacce4111e46cd3622fce0cf38c00491dfd8aec8affb9b68ed175deebf2689a3ec78e99f1d41f88df609514f601bba5cff3f6e93b9542526155ad34a2c3fbca2779d86a3bdbdf4402e11636806a4f578d07840e95bd2f28bf3d71a4ad0d242f91a20c7d20fdfbcb5bc7eeab0fa403078f3e671f2d994c58bbe01d3d7155232b07accc8c7b26710c4111ef170644bcdba8617ebada662deeea46bc3b594e17f42982381bf76db366368f5346bcb7445c697f6f847a825af10923de7db5e8af412df9b037925e2f3a1a97e3196740647ee59d95735c4e7c79f8b7b69f6a517b48a727b27a757175bddf1d3313077cf1b3800840db8a0379abd1faaba263007301efc6f51420380d1001826ee548b75520c2bc92ea7b50e01445e2eee046a29aea24b1502df5aa8f00c1f9961f65a04b10d79eb5aceb86054a7df7e2db9b2fefa5d4fa352b8e7a70a6be765ce5a7cbae49f010b94e6d451910bceb08dfabe2f48a6c37427bdac0af5f183e09cf072165c9830e28cc13a9a64ae877ec2bf26ea3e492151f1a58f92f406494a00c13d2bb67bb258b5dddc20670a09c5166b3719e22b8697dd0f94292ab1b883772c1ab678eeaa67f3bbaacdfa433a3fb26610479dc3e8d3e554690d33950d9a5a2b4d82d0075f382673fff4ca9a1673f7ddb9d13955a78c2d4cf0bb19e4b4cc873ccdb4d7abd615f9420854929e277caaec3f8b1ee99612209846c4f36607fff9455affd5d2410d9e88550471ad60ba584570ccd83036f12f2f776b061aa36eb491eb4e93d97822fda326dee143df16b2e583a6aa4a6f08df25a6eae5d5ba9f409355f3bf860cd096cb55a44d34147d8a869227fef0a8878efa9aec1184d2470402dee6dd43236c917a9667896157d5b2dd1a076322250f31149df097c5b4fd4aceec311efa62f22deadb7e9efe0847aa296791f964c2ec2fb7922dee3bca32ec2fdc668fe86ba0ff72170922d5634ce0ce051b82eda776654f67625855537169eeda6f11e7dfec0d00b6f6882317bf449938bdce8d8e2a94593cd2da5f06ba70d41b078898145308e93bb28110cf63a815b6f296c60954702526a121ce894a2c141ca0d07a938f88db6b751ce029258f03e9cc0330c084e922bc7e8755a5e5a3ada4de9535038337f9e269c4bface6efa8996c49aefdbfa81ba75f4fa1c5cf3b5435c770fcdc9227bf56a3c0b91ca58477db8f67cf47b6dbc66f5e73ff4556a5eebf133c693919b2295895060be8a6f01a448f25c5cf7878144402ae840fad9c02a404a5144df5eda1afe360de9cef97cb1013300c1a038b6ffbeaa82aa37dcefdca6d9d1fb86f4795173459dae5d5c964f4690d3faef09c983ec323817b6feb461c9af8d94faeaeb37521ed18469ca355f7d39493fb7b8ffe69fb69888320e842d39d4c0adc420cdf542fa7e25fbe0bec30d2c0781af4837d0976d370c4836a2016a079bb5a337eea1661b40eebe246a5af0b60941824a79c4c0d454c0470d4c433d87f4d30dac09d1ad065255d4d222e9be3533af6dd64ca943ea865b5ea245c17aa58d979fad3772e8b494468d1ac586e24b72689b842c7a81a060933517630dc78f3ace3bc6abf2e923543e03d0ef095584ed353afb8cd0d20d508948f21ccad66ac6b51d11ca89555159f0fe998bf0b970e271563c593e73fd7abde7862ca9fc5e733c13bffde2beafee556add172b6edd0486a092b2b5922449ba5be2f8c8dd561c783e9dbc4c578d03af02aa1ae6bc84ad43eacaf980dfd9063cec9e1e31209403089543da1106a6c206920e5d37adcb1ac8fd54e309a5da1d7542d7767f2a95f951c70e376a0258ebd8ba634f7d34faac309543c0b3c3e6d9e6e985f7fc7ac7f35ab298d26944d308c6c1b643d88e8a88a3c5a147d97437dd81eb288219f3cbba7472772677580ca1fa69c0ff5e8dbd3ce93be1fba588f3c44da514ae77e9afffd292579b4b8e29ffa98bf265809049294b4ed9faeb6fcd959a3f67e2ad6e4dfe9fed2ffe37f37c838f032729ee4dda38608ba11c63ec05777c62c8650828be895457e40587f54e8cf6ceaffbbfab04422d02980748bae602c00cc031dedb7c015e8bbdd7b9c9efa2504b365b2b364c2bba58a9c54533c64ed3a2e4c24953d33fd194bfc63575be993f5f2f9aaf6b2d4e75bdbbaad2fa367373f9740bbdef12262b56f02a7aa0ca5adc49dd6c65c47bb6a8a827d377e724cbbaeaf54f8fab999d386d7d6c9c1918675e140645bc537a78789b390f54ce710f9c4d9bd67ce88af4f39f9db4e103cd517ddbeeed7fbf5da5d46f23274d706d50c5f3b78c22b75b3606524a05e45422d19b75b9e455026f124ea141de2564cc953a7910204a26c77106bb9b70502bf0e225ee9374ee1671a739e2f964d4cc0324ce30434bcc2b962e700b282d7c79f2f831eef8dba84b7fd0eb719f679a5c72e0937a5dfe9036bba5cb2815eaa767c6b0cea933aeebeb5a32db327cdda68d4836c8f34e11cba433271d3ba57ea182437410891421aca2c230399ec29613b297b488b7cb2c19be1f7d4797d014b69f7dc9a61795ea58e7f4f3720bf48fedd40375bac6f65fc9595bef9bac25d0df474c1bdc5f9f2f5ffcf6e2b9eef42c1b38ffee15a4faa3c03fcae54569efc93984e26bc0301161a78c00e49e5b2ee23b2a64ca161161ee0b8c2d48381bdbd1feee12886c1103e23f6814e2779248429048524e319038bd347cb0741c3c35e07e980e512f1d1c60da63dedfd3c66b1cb7a53f525373846daee8d4b1dd4aa59a6f6d5d7292e66c6bf5ae5bd1467368e967d6ce3d584b2e2993537aed333d36aa6a4b0e739062b22724073b201ea08f90246cafe42025891d4d0f5f59a762999b5caf7c63c9d9cbaf576a73cd75bfcc7b4d6fa06eb38e9a3849138c777e3e72d122b75a5fc585c499929fbf2f771179d151d237923c90f48db2e6b22421385ff23e61ef128a3778d00b2b4d3a4acef2bcc70847508b18c0ebf566035390543024d667eaa906b2e44ceb1212740d482ae990506a6e56aad5c8c31ecc385ac38687f4f9b726dcb5ebd5df98b55aa95187bcdae83170d0243190ff3f49763eef35106e8eb301072c250ff66e0c1b1058437b2f6b7c9ea0cf1a0e30daa9a719983e41a92b3eed3bb34f58cfc5a4cacb5c82baa4e79cab7fd0d78f3b20ff8e25b061d1f723092605f888a160db2e24058ec711927711050eca887eec2319cfe4abef21bc0b77ddf7dadb0808b5880124724a5581057745df02000746aaaef4cf0de40dfb98b7cff0746f5f6ef45470c6295a826970e2bee3ea7753aad1c21637367e45e33ca3d6e3759ed6b071cdc1aecd25f5fbf4776b3ea52f1e6ff572c76b7550b746399d4354dba859f432abab7551ec552963b16e207fea32ef64982bace1dc37ff759f32cba8b3155d8ed665e63e67ae7393bb80ca37960e71dd5dcb528abbbbbaefd2014583dc0364cdf5cb2e5ff789521b5baecad82a74da94fe9923834564af8f7090682e52d33001211d3b1112e2a888609ce8859cb2a2b3173fe73a42dd0e075e447f19e1902d6200a9b6422028ccf08090f03ac5fa4c23c687080741acbb1ab0f1a4c3af3f158c133150d4e8fbc814179cda0384830f2c541094f3cd1c2d4920d20d746f6fb601fc9d08d2f7014c032171558c513801f04903ebd4c175743ee07b90ea9d244e522d717c0649e8c438a14fce419260f07d54d783548b58f755c22964d713fabd9580508b182009090770914e9308c9615e980aa3136f5810102610c419c21b2c6dbcb89e16c8a780500d50adec9493bdcf67db4d8e183771a8648cede07bd33ddb8840d8807410531d1778b3c46735755ba5486227e377e401560e6f114ea34e816de5debe8c33e09c5522c29973fc8401ff6ac2211b9531803157ae4f863f1ac89209ad37b10e99a010a7fb88170fad2b960c313fe542d7cec91331efacc292849a525e8481f71f2279700b1bc03657fcecfb2ec4809e2e20be43ad5ab88e248f142f5e22bc559280906a8b54b4987fb271c81c60fc5dc8c64784ddf1becfeeb34da5ee6a847bb8850d70002deadb06b20a031bd5c142a882c4e0c0cba10a1fb8121f9c3e7c05e627053ac854b88fb24a8c080844fe14480129901a52f03b4b4404a9c200f02ae0b5268b7e8edaa38d0f5c8ccbc1387cb98928fd33057ade893ede9b0f7ae26045c05605d5c87e0f7d72b3edec85952778f155e17747a8529c30a074c70d277ccdbfaed1b84c121d5515419fd627cd33b95b82e1a0f5c9f34db5ac6104a7832705de3accb0a02f8da7155059955344f9d180142f83038c395a1c74be38193bc13beecd2d6200c789d0814f8498246e3a1fb01e2d48060ae7818244920a15217f0fc22308884c1e4b92067de732b87f57e2fb5491c41110b0b9fb0907b5bd5d02912d6c803701b38a25b9830eda221db4e0fc885320af2e3af049224911a26c2a9449a4db4cbd15fd1f12e36742421208cdff58316e15f01ebbba450ce085269a2f8218aa21592783d36dcbfa0d32bbb2c87e5b3113f0bfdeeb181f491a528516c469ed2d075bd800e9ad25555c969464c9b607c2429c700a189a1470c8b46e99e31591d8940edd2721922e9e0e2a996c0fe3fec7491eb2850d604984f62bbe0b7d8f14712e30630915177d0fb68111a3400484f60b7d0f620cc43e621522ed071167238de37bce1b6e6f9740648b18c0eb1b134c924915fcf45955441f000739492895d8a02910f52b2142a6c08d2e04513f85206d6c10a0907033e603812412aac468893ec511900d049ca1daa2764f23fc22e7933c881d3c9fbc6d48b75a0509c58db78942704a7cf0904a8b36c828f13b119883c47d64fcc30672285755588c8fc6bbb7e9e2230638610359720624826991bb2511568af8a66478a8049882f52955a5167e575049b16e1c2a2b2e814a121d491cf83bcfab7003dd6be679475bc4009644b07fc98b939d08305f0adfc3c139e040b2e3ef019b8682ad89093a9c45f87b200ea70ae70a13187c47a74a3c5fdaf8a497d56e6fff3402225bd800aaf5ab1090a668e32020870eee2a3ad049e70ee36e08128b850867f2e70f81530b216297bc6bacb3c47d504d8540182c04c4b1044204060190aa55d237db3ded2a2f245520135ad88eaa28e00a91d75517a08f886cb6912010902280abe0865d05c25c85646f74305204b783bfb304d45d8c8772544112dadbe20eb8450ce0f5490736a93a6c40bca745019158375520ec15f062e3f586804cb6a521a2994a94b21304d9b41aa28fefc811fa34aede025fbeb76fd1efddd5ded9f03e5c039c20924a2a042ad33aacc2fb32e389b80e0bb63c5215f2bc50013cda0fcf7a9f47dfc181130947f45366030a80a5d2ca14584deb251cfc6abbb7fdd3090835923810c8c6120a1d40c268cc111644f1b1404254a43e823eb295b24a0cbae310227759f4c586b6f6f1f65975015b8005dd342db4bfac8150d2c1c32a2c44ca3acb00893382379583dad3cc61e1c0639d3e7170c4e92215066f20da50b6f7b9ccf1ae12e39c539d97d90b1abd876d00af4ffa0f312f746054e180b3d60082f072f4f379e2394845e280602892ec40c09930930414c1dfc1f8d07ae7030b0c183340bb5be5ba9b9a430cdd50f13b1110aa4bd453dc88f7ad0aa3ff27fab061f077682beea3752f55502471df0848eb9fbe3fe2d75456c2d7f80bda3fcd06b2b32d62007f781b7dd2855adebf87a81f4a7c1dd93aa48d435ec73a57e2ec68c1ee6123ba6cbe5c4680b2029f34daf1df49f5618bdf855717a5a2f1d95c8274bb76c038edc057f967b48801bc2e88e3c7c1266d68bcaee43a0a27c61bf8f7b0c06f0bbcd4efa312b748c038f65093ebd4f777a9b2a5835dda12e8ba1cef7581f31b09788e7cbe7c0e8d23c9b8fffaf6ff8b0492acd906c885604963b72d206d1821babb3aed86afeeb74fe854a58e79ec8cad75ce56aac9432d3bee73ae52b50bebdd55e75a4d5c5aa62c8e1ad95e77d2d4f59a6b79d3f9dc72259d03f4fd86e3eb15e55c56eb63d88ec30d4700759b35573c759ea77bba7a31faeb8b94e1c7fcdd5ac8d79bfbc9b1e0e618e668ffead0b7ee73ad5be80a15e59cac2f4365d1837d95bacf95204a5a16854ade556a43fecabe9bef506af2daaf9f7253962cf978eebc0a18731dd8867c2534c92b8e6c1e82c028499068e30a6f1696182defef7bad6a2ba8850d600905ebce92bf538b00ca830bd7cb1441ded05215637c88513a3576dff1cf743ba2865e59077538eccb7afb2a556765fdd13517b96aafaab91e4276b1732dd5d97055b34e4b6768743ddfa6c0675bd138796b8142bcbc65e4dc5e588737a1aff8efbfc5bf8a55687e2fdfafec4cd7bd7bc584df5fdbfca552e353beb8329a2961e1daf57c109fe69d176654e81c0474e065c5eb16467207c673ae8d4ff3d4c7fb3bafdf20afa8b04ad898c0fce5aaa9eab6ff5f2510da7824b286016dfc2e378e15fbfd3ceb9661753541c8fad709bf759dacd75c4afab747eb051bea9ff2d8e1b7ea6bda85de6ef387eebf199ad8c20d5cb454dfa85153e696c253e372e750295b332a99bb4a449cc7e1c3a8ab9d0bcb06be1ce08b005f0ef045043e1bbd20fed2db7e503fb85e3d55af55951716ba2e8f95df2db84ca9d29e45ddbed71bf9f73b674e1b79b75279231ece5f4a2a32d2bd1361116ea7acfaa2be9080b84fa27d77efdffffe1b71275b18d03680d76f90244d90eed7fd6b073e795c132d11b6fcad4df7cbf4ba0df54abdaffd0d1a8e0f75683b58c39b42b96d96b96a1c6b79e368a4bf35c60d70d4abc53c2556d1b20f9e6146c5b9d7c4bab2d1ef233224d8de0a7efa5f83bf8fafefc527332e387a5968c6c4395b9db3e5680d5fad4a29cc74d54b1583172c50aae2ea8aeb16bca9d4cae282db3fdfa8d41ba3ee9ee7964c2e1eb7e54d760f172a26b91e7deb8f246e257ecff6e2f349d461b597b6ffdf0808057291712b82be543de925fadf55cfddbaef6b4a35bd63ff79975ca209c592d48fcf9be94a25a1f1c70c77f977ab221a21dc412e6c2f7f973449219a950fdfb08b387715369e0f9f02be08f07937640ef7e7603c1d802f022c1e3e3330d58a4c918292b51a5ff5084950d31bdbe5b02a4696771fa30ffa0d9fad9efdde337a037f78d7a4e123945a73c31fe754483752f2d6a20d4c8183bd459f8cbfa4331692c83f4e32b10d88cbf86afac4f044445fc3bbde7cf78dc30ed392f0c6fa4f5caa097b4af394a74fd39cb9f57ba8c6a1435d75acd5075e5c8610f8bf7bd8e016a97682d6ab95842149ca580510a25dc5f0a039eb9c27d7eaf7aff8b1ecc2715a02d9dc6ebdfd4547a53ebff895ab467dadd4ac93c73d568cf828197f210b8871802b412240d2fddc06c41bec7debf39f4e40c206f0d224c98308c9c54ad56dd3e04bd76ffee606afdc75c64f4aa57d5ef38a1b87e88d7549e8a6d3ddc8f453acb1513f7b5ae8b69018628423d9c11fc67d3646b3472486c05c5882d3f3718e010470473768b2567955e569f335c15e75d992268fe979eff7758f15a3e00ee9cbf143fef244382820eb65031d383b54495d7618fdbd5d32891840465d5ecf7184e2922beefdb46e5da55abf78e491572f8d265d2cca6da599a3f3436f1cea26b16482c0c93e693d58e887d10f627c4cdf7fd01b7cb1c264169ee2c1c77d99955ae480f311b01dcd26bd83cdc972c66efa424bd02d8b370fbb5da9826b66a5bf71b9667826ddfdf81ca485e7754801b314f84a714b24d190242d55b6c2b6e7b3e94576e60d7667fba712908801be1427cd946a92d3b224454b14d77ef2d4c8f3ffa509c62b356add73affe5be75051c78edba12aa2e4871d5073dcc6c1df67070ffe7c98d02fe23a1c11735da0c460035fe2833f1f7fbf88379e8dbf6e2f2769eecb0781bc08efb98b3668502bbfacece1896728b5f8fa5f8f7f3455a9d786ddf1d464533d3d963c6eb4e8534022a9c468a312874884c3c6efb451c3bb7efcbbb4850d905e4e1679611da2d4559ff57dbc4103a50e98d86ed04d599a607c98fae9ad6ee5bcabad798d676d839190ebcbf2fa545583f1d9397cbc7eab8dbfba8484f027dc6f3bdc5cd5983ef8cb524be67eadcf8d82b1b39bbd709e5e9f9fde71e1346495e688fe208687080af5a5ad4f12149f71ebefd252feea01eca21636804b8912cc34d05549ddf29ffedf645eadd48925e71dffec417a832d4febf7886b2cfbb7b5a079f3b8859821544516a735370b310f7fa1c24d362c297d50f64a9686f5951a1584240fcfedaaea98ebf0774b6c1c2a8599419c19927767066ca0ae286d4b7d4b96c6c5719421383fcc597464f1e3eecaf8bbe33d88c02acfbc64c630ec4c4bf9352567ff2b946a5cd062f9a5f3943a36e5ac4eee86fab1eba7fb4cd31cb433c35948df990237991050c1201a4944f40bc4ef79e2f7825df106bba0d906706967eaebf768f8e4bea342b728d5ebcbb786e4dea954a3b1cd6b7d76ae9e8bd2948e679fad5c9373ddda37c57d97d8411cc5a2bf5e0f6033fd08fa19fcdd33cc7d62fd5329d70c71d05b027f21f0c54a387bf031639519b0bf72846a3693f1e761fc1918ffb6c71b542f6747d7a9e56ae5f4fa74529bb63e4dafcf035ad4bee24da5b29b77ef79f0294a8d9ef9e19bdf2070308400d910dcf42939236708a09185f1bb0d18f1fe9dbf3faefbdbaccfbd9e80840d084c09a1e11d33dfbdafb3e654eb5cdfe0eee1ada21b605ce793a20bc9f0b3969018620b3d8267781762064b20c6d9f622e6e423c0e73df8f37c12430f8cd13c9708d61cfcbd13fe4ea27b266d742131f410124321e333ef910fefabaee63d59b2caf4a9206ce0cbf08cbb5010c07cd411e96af5c3dd1909e7656737a86c6e253e8db9e69175da9cd852a9cef75e30a8ed754a2dfa78e6033f0c526ac386d55f539d0acae1c592751e600ee3327fcef3f6a5fbe45f5e492f62001f1c790684f44a68f7c1b193dc142657edd337edf5e7dc3203a9a7f72ed07f6c667d56c7b576c56ae0dbd19b32a85e4c1023216aec5b98bd0ca1eacc14eb97189f1c5ccf12297f77c2efc5470c490fb91f02c6dbc3871ffd80751a63d4c47859f58afd45e3e78af63bd6ac284e95ba5f7a797b2df9e5fcef92ff1e778f52f54e6e3479da614acd1b3671e566646ab010c82cbd3bb9767e2efa79e8033221e983df6dc0c84e8d7c17b4d05f3d801d6c949204594de9bc706d19b73df2c6191d224add97f9e1d0f73fd007cf05b53ff9de55750c745e77bda29c5ecad41e478deeb85ae261f33b6a18a3c6b4fe48a6e6346a8aab21a8817c3a6aa2f752de5ae8ed4d9f6b8ca346b5ea8d38d608d730bf49e0cbc275a8796daee71ae543ccf50ed76a1735d01df47be33dbaa3e42ee313b5cb8770adf230f0f5f68cdbc17b50adedee2a2b1ebf9e97dede7911f340b5d667735cef2e69b5dfadfbfad95395ea79cc8ba3bfd51cf74dfd5f38edac2bf137e41eaa81ca93e95f1898b6dec054144c0a217b72086e99e4c0cca49502fbf6df9523df46cbf23e979d3a9a29d5e681a36e4bd59cedddbf0ebaf1c2214a5d70e8ed874cd5479e7556e8f91e4be2d703d5e446dfc1fa89d5d837eb275663ff265c87f5c9b5ec69bd9aef68cb9adf8caf3fae33d747047ec2d75eaca3a0f112fe64e395fb4baed370d078057e1bfbaf373b39ef92759a3ebf66a9cbb076ce38effed18d94ead3e1d3d7fbeaef9873f1251f1c8075596ba28135871958a38b81692d0d4c81a332650de7dc667806c78bd13afdcb020bf73209842936118eba0686f446baabf3c0963d0af4c7685efbae2f57eabfadb5aa5c6f1375b6becd3d286e47edf02755cde84d61d82ea68063a2f4003670f7e1eac6d1bfe88f66fa5df1f96e578703df6ce03335c5fb015327d442b7717d0c5f07e0335503baa27f3bfa7d703dd556ef072f2aa8b814d56a1fc9e30e47fb11f4495ee9ae4c65e5662cf866e2b961e0234e54011fbd6d27e06b0a7c9d80af03f0d14c29efbc900a0ff78fc47bc4f0992765ee24c787163a2074627d2d8934fa7ebfaa73de53aac1a9cd668fd75f76f6e4f1456bb04e426464a6f5b22f6e46640c4b1a1429938b3ebd214936f9bb62c4095a18cf856d87eac0b892c6058d6fcfa8a3bfd0491f759f32448f2ff58dd49ef7df161d5b8b669ae0591fd17a404dee91b09da146b75ec7a8814f5e785091d27aea84fb6df45932c177cba4f5eaabf94df88a701df934d6c175a6df83d79b771d058cd742cd7e9564bc8c8ff717fa7d766cbc711611acd35d23415b2badba692ddc9a2db59a1c75a6526df38f742e7d4da903b6b6fdcf2f8d959aee7c3ff44f387db0aa8b522b916deb1903391b32358a8807c9f3852314ecccc8b7a7ed25048408076f383a2034a776d71b03e7dfad45c69473d256bfb0c188e42197f796222de9fc5192551f70fd8035c35c87855318647b80086c4304865fbaa6fe51c1d29ae253e598bff7205d3089f401b6873e166aabab6812ee043699305e7eac075f4c34cff08c7b2497ae9d82f708c7bf07eb8c7d3699009df94861dc97aa03a9ea504215219d120a770d2189aab8f4939a3cdb6245a69eb9d1151fce1b0e0e8f0f875cc0020302dd7bdf15b8a9985707effd3bddc20648d5ab9bb9e0aafe8f0c6c74817eadfa873c3a7cb3be666668f529efab7895615ef4e22c43f6f4d73d241e2b3312f4bda5b139f6fd73cd75acea01fe242a2e52a15a02bf5c5f36f0fb55509909c72b55b201ebdfa95fd5c4ad1d5ef665c95b6b3421dd7adba6d396680e7d53ceda110bde50aa746151e3959a23af9c59317bcb1dfafa6b9c196e6126eb736b7ff7bcb06aa70c4cff207a86e446d747d88c6fb7a9b8d0ace3ad9a35ced0f4f2f203569ca319df36fd8f7c60712ba5263f3beaad82025c43e75c8617fab265cb759a8bfb07a21f062cd8f9716fbb59bbfb013bd96c037c711a2ee1683af0bc871f76a58fd4c60f3d1ce5b448b318c1bfa69fc307bf39e8fbf8bc3f22789ab91eb6072b99df3b0e7e2b76f00fc558c39e5163215a7d026c0ffeb88d2077601bff9a71260ba4ea6e3849cd9d780f7ee115e6ccaabaccdd90eb87fe79c8cc864aadbdffcfe68bae526acda0a5c3ff68add4ea17ffe8b57a8de6a41eaaf9a4ab02aa734b83a1b58f566affd7db4e3ee86a7d70dfd8b2fdbf062bb54fc3c60ddbb5d3dfa379ca996ec9d5a4de31dde1b63c5446d4ef5c5b76c182579fd1b2e673adaefbf89dc5e637aeb8478593088a8a87be825522f7d04e7bc3000fbf71c4009770fcdfd17d521bbea454cb21ad7f1ddd595ff366e8f9c30e57c1713a63b15ec25c02d936d761ddc6d6b19721925e81e85b7d183fed8b6daed7eac61559b140432f0321f1c7dc7573dcacb745ef6f6a5ea80fc4e55f2e7a69b2e6c47f7de98733a6d6536aca41dfdc5290a7bfc5ad55abd84d5606f8496fa6480c663cd861647d2d9b1fd7bbdb7f0e5fa754bb538efefc0c2db9d679b941fdb6cbf5b778c03a3e5a386a17bb03fbda58d5d775fb5d7cc3ac7e776e51eae5336f3eea8b4de64fa5a2a433ad5b99769f0b49492fae3de65df87725206103a4ea216a146ff2ced737acd422fd41e9435efe4599051de524e48296073f1f5c66830c95077000a71cecf76e8e83ee4680d4ff7a321225c087bf061efc7410903b305ae28da982dc13e5b8c5bc946e28deb24673d4f3ea4c0c0dd784e0fbe683bff9596fa0d5d72f7d6333158612f53d387d3b6a8d5396504a6fedb6167d5bd7ab7b8e52e7bcf2df3f4f3f5da956cb3bac38ab9652e9e7d6287439eaa407e02edaa0ce994e5d371071d8b503be385faf8fb1e3f31f5908555409d2c9134129439c0913124adf4f8404f1249c057567736e897202ae31f5dc26b74c724b1db71b74ecac51c7baf310fae9c48a040c90747725c9776e124662bbddc1b7bdbeaa1b572423c683189f8ac165cf6dbc4da985d7ce58f055b152931e1ff1cdc4a795fa6df5d4f6ab90ec4406e8518132ae8f416eda14f7438444e654132d9e31dd2f2da37bdd7e4a759df7df534f0e6909e19e8ebf5ca8bf7bdaf1351a377a396e3e6cf1fe3bd99cb39c7a6e05ced923279c7ce3c74abd73fb031b23f81b5522a4daf55cd256961afecb08c9df558595678075b58121bdb16ebbf9cd87ceeba53fe8313526bcfd968abaf5b97f67cec812aaa23c293140273b4091c410d589c689dede833f99aa882410c6b773aa22bd308d57978c1cdf5e5591e58d1c77d63ac32af5425bb4f59716233447fd66e3bbafed7fb752d3fb8c3ee237bd708bbedc34b518151a99c381f1984bcca25f8eaaec1528454b2537ddeb378f5957563c52a9a95bbf7d7c96e6a826ffe7ebefbed2a4b0ed9d47ffeaa67ea997d6e08ab6e3310f99712a8e4ce1d5b593eec0d642abcc5561367ffee04f9b0cd704e48921bf4532ccdf9c568057011600ca248f74e05056541c48568f1d1991f2d999dcecb919a587eeefd68fc97eb1fb231fd5d0bffdc76a71da872ace6b891816cc03ab8cb08e07324364bebf543d92043250ee0be0cf11f8c672df327d1fe1b0d1033ee10e2cc7db83fbe6793d0cbeaaa72af34a4a94fafd8c19ab877da1d4bbff7d70547f2d234fbef8ab4db3f58e5c5bb4a2ffe697cc83b9c4eb5b80587f65afa30fa373199548461d8d72147a2ba3f5faa0171fc337013521da52b5614e895eafd35f1a3d7cde7e9a905df8d58523f4789a576436700309eb7769bae4e0befa2cda907242ad1be3e62373e70889b5c02a73d741d34ff77ff5d4a57a9fdcd430ebe71b949afbddcf43d7ac35d7500550525d39229e890904fd9e011801cc15fd5dd6fe6e1248c400aee075b35237747b3ebfcd377a6237363a61d299fac7bbadd16e52c26d04fc4989c136d7414240dc86255545317c36ee4ec68199fbbb5b9068a80c545289c106be3eb8cef31ebe1c41313ffd3e786ed833ee0055515593aacfcaba2935eadc7787f4bb47a909977d3e7c3e361e979a254e9b2ad1d1ef540f850a3f550a48e9d9856e96393a8c9c0b6dfda8d48513ee687d8216cd8f59dae53f7777d2bf2d4d9d58bb9f0a5425ee74c4fb18157109c1f7bd06e75ead8fb8e127bf9e311df51a88a32b46019f12a4d12f433d06aa155e81b4e795548f4170b6d59644220690249d728896a47f7a77c8bd5a024a599f7afc238f6c53d20d9b5f452068966138b4bc9a4cf235f8aa8d9fefc377f1ae2f9f4a96f0fb23c84dbf8feeeb795bfee7c21a63341c76efab5b3f5daffb072e6cbcfe7083992bf15124b7286d2cd723d50ce7f54b017bb2467eb28c0311037c9549e3d66d14ea03bec109cd9ad49ea8d4d5573e3ae1cac54ab5dcd26659f7598a3520bb4a82aea85f3ee68f3fb424b2f48153bacf566a9e3de9df2b5698bf95922a966aa6a3e473b9a8f4292b17d2fbeffa54297f17021236800f20fdff13979edf387d9852c7adec963e417314d69fd6931d37051f983e559114356163d0c73d490c73e39f99f4e0f7e3b381af0ff04580af7a07bf24803652a3f44132c5edddf842b73de3a631cdf2ee52ea93c6cfdd3b1aaa18b92159c280ae953938ba4e88ca95e00cf94015aa81f8f89b28c406e492c07a639ef5cd75271fae0f9070db8b173ea32593d0d050abf474153bb0923306dbd5b65ebfe9a969cf2af550dd6e5fdd081b4411fc758aef01446d71d2359752adf0190656a07ec3769776b50de075ad19a2ff1df97a8dec0b94aa19aab5e05b577576b26523550e1152dcc5eb2c12fd5dda32068070f4c43af6ad273ee83df892aab8c2162490c07d66630e128e57e29f7ac2b757bff186261ca7f55f376e9cb9900e7c5e8fb40e2149706df072efdfe977b20d708964590a99321088e49c7c70d29b813521776e82b2c22895aaa512c22ebca2cb83a373f4fd879f9c73c15dc7e87b4f0dadaf556bd71192ad6f6dec3646afaf87e69cbbe946d42d625b1e6c24bc4e69de683ea87225a9fe0252faec7cfb9ba8b0d8cfc136c03d80ce2feca52ef9440ff1fd94e76f724bae5ae200cef32de88ce8ef41816d8510e46c480c0385aa282f89c420039cc83bc5a72a403f2f89c4205566851489ee8bf40e1b7c811c690ef045c7bdbed39fb9bf36d21ccca2fb8ffad02deeff917ab13cddcc2b198bcbc169978283296d6e600912c2970212675e8af8891294462dbd1678a02220dd6c192a0c92caabe20a402ac1aa39a30583a62d5ef9b352878ee8bcb4566da5eaded1b0ede1876f635ee43c14729855a6aa464b9f5aa37373fd9e15b795678ed7846cf107bf46d6a1146c15545a6484ad5a642097ee251b086ac13b19401a01b4459f9a19b92710f09c277afe5a477fd97d7bb71a35da55c9acb316357851c5af337a2fb96e131ff4d99040a6601dcb08f2c21d8c201f8bb7f207d6e6e19dcdfd03b71d41be6ac592d1131e53eafd5bfb8efd0405ca985090ea098480243eb249955c6a2011f492fd005f33b018925ce9ebdeeb48b55586380a7696c0f398415ae01d47051dc02875c00c962050f112f82fbffff0de6237a5c980e2d77f7a422fc68f0f7dc7cdca9d7246ea0d510dc94e7a19a61f59f3d24c4dca67341d73d5fb7add6efd65e3c072a8dc58d5da4af4096600c2898409461e60c1ce8c2cbefdd504c436c08224c4a947b42879e2fee79dfb8a1bc179acbafe40d7b81b5be019d18b3244aa0d69632814077f3efce357b3ea2a027c7400dbc0670881d4394b5b493e0efad56a35aeeb0e7c99786ed8e0f3b93ddac0e77d8f58a4f714e033f7c7085806f0e5019fe760a9a85976ece62395fae0fc479feba739fb4d83d7debc152572cb5a0362a3968280d0c62cc5c62cc1062e25633371e42030c4f1947d0e482234085305e99c4972a11c5504e3921f6e18b47aeba29a9a839b179e79be6b343e3e5437bdad4ae40e6ae62933e080ada6ada466699d92f5d395faf9cbe1c3676ec43840302a1188286bb257de803e15bea20d2b39b93cf130f4793deb1575d629d72fb84413e6d0b89443aecc56c111d362ddb2243110fa8230f74d1c43f700062876d0db1815182069cba075c6712079e87b18131e6fe1b619acdf3bcd48fd5c33046f1f73ffddefbb9cfbbbaa8a0f6c405a37ec6d4484830806312eb42e014bc1c0903344d97c014108ca6003619b1d313242455bf196f89d246d6133a93c0050a8ca5cdb44e1cb733e5fffa9668cde9fb6efb7fabee346749d77c5026518da4cb5d336bdd677776ce1aa84c7f7fbfc9529887be375482a557272c13a261b1fdb4cc2e2f70cc0c88e8c28befd5591e8941597bc5222068634cf7ecb3bafaebee61cdd39441d7ae227d1c931db35e2845de0b447e4e810f4c3c647c6b91011d14191b8dd9d6b70dd71c087c8718af4c6f5b148effe5e7c88aced8dc86fc493687ca79bebccf5848fc6ed0445bc3b1cf11e06be2ef1f835368a1c0f035f6fe0a37930be4139ceab6e65bfc8531f7dfaca10a59655fd36721d365cd9930612612846a9dc22d468dfbad5c0cd58685bde411f46bb2dc3011168b7159ce1d677bdf713a1da32d97bfd162cf42d5bfdf8e776fdf9a56573f4c61b3cf5babeb7e81f5f71aadcc0285f44bdcd11efd17e60c4fb52fdbf6db4fdfe9571f0197a83d568576b582dc477d4a801888324fd7103d31e3530a591811c094c56ae382faa68a38262367e27abc4214a9ddae4caffd63c4ae3b825f58ffb3b2ace701018312dd6adb20322b29109212ee3c185b8cfec83ee02ff106f4436e3ef2ff1f3bef0e08bed0bef3eab6a52f953e5794acd6c1ab9e25dfd5ddfefdab7db276ea4ff494e791924d3122419245521af3fac9bcd38f868dd31440a90cd20f4bc4eefc2fd19c057e4c55bdc03f019ef7319c206567437200ee6a25c2fdead5827bc9eef0c1eef9203e70efb73b452f35e987865ef889ea78bab3e2b3d28b65f7734e27ddf9456196eaeb32bda3f38258cdf6ae3b9357f3790322ea483b14b23953145b2938d87322e5060ec4ed7b0ffab24102ad94a91e4fa052f19727faba65b94aadfbfe9db23dc83a797ba3bfd9aa8aed71b28950f01ac2b07ce450f6e6b2422519b627a6c4496f6c176ce52e746fb03ac6bcc7588d4a52cb85d832265a122202fae3ee03bb3a0721a600e7e7dd56a8ccf5c5f2802b2a67823c735be02e0cb00be289f630dc5676d2a22c70bf1dea4aa9b622270d71cf3c7d953f2941a3af4d99787c36ba87c8281a53f195832c8c06214f72fc6bc17a3c6753172f41443075cbacc40524995d507bcc340e6d848558583b61235b82b7f01444d743676fe6c60552dc0364a4d2b1cfde6224d584e9a77fe39c7acd28b7f6cfa99fbbb78fb307f5f807930f31414f17e9c8a92376b0d6f0f0fc797b23c35a59eded035fad61ee79efff35e9af8c3f20f310e4818aca280a4547996b7cf7121385898a32386080717b99f87862a754ef39e993df503439d530a2e7b38ba5e282ec7acb37e14318d754a190d060644785304f9ed58c773185f7fdc47fbc01b91ddd51b91cdf89bfaf09bbfe71b7c7add25de174d745f73c0d30b472f786ba652c3faf69f301611d5a412225512312ec590208a0ff1fe5e04425c82f92b012b504292c5fb80b42ec90b0b35ded9f9e348032bc138f13a942a28591e0011e19535c5fd483d52b9c97b3d49a695641b834dd075739fb6e9bb977ed7077cd32d07b499afc7bb5f8dccbbbbb859a2af52ff87837cbb22dead19d6b2d0251a5fc3fd5b1ca925e79fbf1f71f5679ad1297bbcf8d5ca2fcd35ce99804f611c2499d40624f7deb3bcd0ba7b5b4fae4edbd304c43680371a168e1bca9fd3e3f2c9f71c1755651c78ca23d183c190194add413add0c615c1ce8335a1bec8542053505a276368c7f6b025505f4414d9f5450854205350509304817bd06c748863062c6540819c097077c5eddf6148e1cef67ded7abe28a534944802fda9fdce2ab8f3fd01c73c1c8598bc95b83dc134bf17dc958cc711001360ef23b972a804a703a643cafc2c265ff7bf27e81ce9503bbe877481eec3e4b07af79b368ca86c337872fafa3dfbc5eed866961330f799887c4aa14a9fa198803b829ab6acc3cc90dda4ebdb55a4b6a135f1ab1744643f17e7440e0e0280701a434f1bef78384c549ee32d01fa8d4c92bfe2fada626e8cd171c74f4604dd0adc5eae87a87a96da83aa5bbae2fc27b2cae33fd42a4e6b0814faab8f2808fddd871ff40815fd812797d06a9b8b02ffef8e8b795df2ed082cd374fbf341c3c35db384855059569111815b661d07aa4f507e330a9b0c81b8e6d16a42225a3bb5425617d914a92fa52e5e88364337857dc87dfd918bfd8db27b75a5621d1df81d73dd77eadfcf197657a5f1e9a7ed2bdeedfebdedaf0944ecd12a8d6e97b2649f1136a98b2c1adefd2b269ebc6abb5a435a5ff372fcdc7bef515b27a578c5fb8fffa9c3f720123db1a41c2516def0d3bd9c280b601aeede3d497af3aa3f624371a37e5b29b5ca138623e2f275b8b18ef662dda9bbbc7c0dbd9367d279b974314ab1619b3715dc4dccff8cc53f3595560fa6370bd6dae8fe1431f2a288daf37f099e75e88b0b07c88fa0e9e3706d793ea25dba1b71e037cdef788e1ebeee93bf8fb185c6fe37ee0734ead3add354a4fedf1ed01bf81d3abc482218e8c3620e998894094d2c6a5dfb171c9b8eef3d612de32e4e5213939f93b491ed2ab860e84b236b1f1fcba6cdccddf552498976cef3cd0f7d5f360e33aeff795f3dcdbeb6c5cefcc065f1e88832295bcc4c8bb06de3629a700c2d84e2a00cea23a36004600f5baee70c8095d2f7725b886aaa2c5e5d1f119956304ebcae175dadbfb5ebcce8cea13aa4e5a574e2cd9a7c127d76d84d7ad07bfde2f89f187197f18f7d9e87bf1017fc594b2269b6f57ead3675ff8231f9204af0f923c28821a360e22144c384812811b7531181bf682fbda8b870908d924681d3ee4855501859c92c14a799face3216c22bcafc896739f78dfb880d5813d7b5ff4ae66982a9cf26e2baef79f3b4ed877ee6cb3658ce890eea68fb736841ea8010d433a9c64d2a07948850a96d633953be0e4a116908505dceeb6a70848d8005f1a63bdf1da743ceafa735c9bc7bdce870dce8beafa23d13fe6fb0e608f0d20688113e1f06dc87cb66d40c5e1fd8071f8e8b944383c07121f6844382ef4967d71c2b81e3afc0404d06bcba071e78300127e98be9cb0d7564207e6d6a337375db244a9cd75d6e6916e970f6e3ab0c9ed91bca428ce81bcb1be155046b88a8d042d79cc2d50787f70c4bae0882a094a82029597bb2147b77d7fd992abf53d7f547de21e5071071de6218031c8e6f502428e79a20d2a0ed89a7dea3ed3021216b969b2dbe629dedf69e35962e3791dab63d00ac5ae0bdd9c72e19557c6addf7cb34e785df9d6b3785fff3af0ae2b1bf87a07ae5bef3aeb2df03b9230739ff685171ff0ff366cdac5c38e526ae3b9ab3f2a426024ad17f6c6c3fa222f3f22204438a43b2a7b61915306b9ef0232c1a0f588a3d657bb5c014a092309a4efc7c668405eb7a2e2a06f9f4982124710d7fcf78f8e9bf47a5e7ad2dcfb5f7831363a870877f0f7c3f7f7b6f4949a8bf6d71272b78b6efcace306fc06c291960638de406688683d932d4f9ec339de79a87edbc30484250f827ae02975d39a5deeaa4ae860204e2996fedccb710651ee086f98ea490cd9019c1d6df8884f6290f8ba039f314afa2506410069dc011c1e73a8c0cf1c2aaeb7bd0766c9775b8e5d0d5d3b2f74e29870509743c72f37b8f4b7e7d41dc489112442404799024cb6216df4e9bede5ebccc391201f92e36aecaf5e567ba49e6f43cd8e67d933006c449b304b26dc6206540ca43758c1521162846101b8ce302c8f848128694402ceffbbafddc471efbf2a0f7f47f7f66159d70a28aaddff6db96a8e3181471d0f33a30d7cbfd21d759d0bab5057e264c5efc8e9048085fe996e25fd7e81d34f2aad7978e16de75c49933a322e269386e81240bf2e6a380385a8fa2d224c77708ef385faa124130e479930c26252c63c43868fd0a0985256bbc0f4b54fafd5fbffcae8bbee8a5ffbb53c9e639ee97a3f94ef6fd025ad665c73f76066c364438d24f479f080849d630aa33432419215bc06ab73d444038b2dcc60f7ae0ff19786b59e3c67a086f875e3e6d5c8283df262f10c17186bd077f1ce50ee3fec41b32dfd4dbf0a98ac2e2e0f7e1f31efc3e89e142ce94047ce2e0979c72108717e350b11d02541138302b0fab7881381f5ed82232970f68caa123fddbbff35eef13f189070ae30d2181547b434a4985f090919a601c47e76439cfb91baeda8c0171ea73aac71884ce4dbdb8168cf84c2088609c22fab0154909440608c6ab06ea0e69f8e1c5cdf4f3729c68481e7f771e1fcf02adab30c68bf715eb4cac03de0fbc3f707fb275db5be077121366494808df6f1d271ffde51d9a7119bcf5675285922d82545714195d2adc7439829a6c6c227095dd67b11e39923adb0b791d4a421151bbb6d9dee7480987f6054bd8224343b9c8ade612ca8ab7cb5bbb9258c1f1b346bdd8c8238184a330e8fb0548248ddaef777858afbf9aa3ea8cae09e7149640004995c51236ad6b4948f0be2c8954bbed6e0212167d22247ae0fbe6b652e1ded1859b937a9af21ffcbd213148ddad14e9934b0c36f099fe1ca12af26f181bf70571b211830f84638e38f8fd9c7244e04bc8e1313ebf4aaeb7675e306e6774551a1104aaf92d0fe440af932aeff5b2e83f46e613edb9804d759bb89f555df49cb8b8108697a8d9d1852d3794cfb6216c25edb1ed831903d3bf4cbd4ea2bd45ba61824410481221b7dd20c923ec85eecfd63ed69da7a62a1fc1675527ad03c7c75044f0be5ec2e9f86c19065f6fe0b3036c4272ddfa6d7c0909b364809cb4aa9aae0a73c215c3f22691571ad61b4bb6a4c221098402048354a622b29c0907312e42a2e0f54323dfd32d2c9e2ffa4ce884244f048425134d5887b67feea748445f7b61e58d9b7ab9124892ef1770aea58c4f5d52af9e52279f7ee9891d5619fc8922e6a3d712630442224bebfa92058513ce4282b6a708886d403cc796124e6f1276ff1e2c721b892189eed67fd004705e36faed85aa2899c42074961ca7413ae8f6e2e00f9018e238633c3740a72d74ce71f3e239306b0eafd3ac314548d34623ce883622b2e77a0e68e5cf19c4f7670b483c8fad76aed1fd11c08003c21d57a867ca93fbb9018ec96c48ac92c168e7409518cc1898fb7f549d6958216268089e2c7e879138d0681ec7109d74f88517d47a5a774684ba1d7bac9fe0fb54a7ca67c4f67ef76cf1be31c6cae00b92d08325302ffe00159a648036e5af7d7bee5ca5d6a42eddb889dc59c996859964c201c9830908491a4438a4c421555401eb62b7491adbdbf0fc404282f1cadc5e2c91e8f75fbf70e58b6e2a9de22bb73c3eda7dff64df4fdaf48426a4f5f48ec38e42bc4cda69064a02c292086c213e9b9e90acff3604c49294cdc6ef7ac0564f2b3fdb51db10b9abadbb355803383bd61153e0949418fc2a02efc1ef0889c11612c31c71f007480c719cb1c0276d3e42b20a30bad79a5d77c6fe70b365ed3f71f6b4a08788df09d2060d63066cef7dbc5109ee6c8b88e7d3f3bac7c673d8f3d94fb8de24d689d6fe51afa56436a4de4222a4c0ca648cc149ce0f3cae3802108524c20b49434a1c52127161db099d1a1cefaa6a1e721e720b07c5a98ccc78a4ead44fe8bcdfddcf4078f7436fe0b305839244028b93e812e277c22ce144fb7f7cffdbd39310a0c792ab3022b37712110ab26d947baf9312b12f0d7b10e1f8bbb58801bc5f6c6f9f35024448a4d15d1394b5f5ff78db4d5fef24fb7e496c7a8dbb36afd71199154855e5231c9040c8d6e7b3e9d1391d16fda46d4fd940e236da11b79ed2b1c613bae3580bdbb846de40919b8ccd4215954c55e49718c2069f5189f92406bf8a200c2cf401c3f837b1c4208da30112431c01b43de3669db6cf98461bdaf6cc0bc69df24ada61f5672875f0594774776d499e16069c1d3f23ca4f18007dc9e6226af7348937ce1faecbdcdc338f776d1f396a4cd436d17bdb8c81f4ae8aa926036c4834cf3fa893e8f13e49428af6542ad416bf87c5ef7a5da716d4d81a2da11ca4328a79d9c983c2cb5044844a23c8966133a3e55d678ecf2d97f079f1fbdc4979bf918413bd7ec66763eace6860de93549e32b961b928cc452a2ab6bd05481c3ed5540430acf68e1631404a2444109940d2bcc5b9c78fb8fecda3c6e8fb9d39cee212d7bd599e13f4fd82dcb8f13d6b85eb763808019ca94428c8e6417d481e6cfb206f2ccbfb1edb9f0672771110db0be3b35e1edef594d5ae88af272cfa628e4c11c2a93fb84f0bdef02732450871febd59e4a3dfc3660cb8bf3d19abc575b1e786f17b76003e07f8687c59c0d73e009fe31db7f73d742f5be033d7b1e4e3887951621e0cecb2aac7ffae44ae1e2b02489c051608ab64141aae93dfc7e795b19b1b17a6d2e3a9b1b4f6ff32725deecd09b94654e6cc28b5c91831affeef6ebe476f25e61990f0a92ade263c5fc22b25c8b828090c1bcff5fc8516855a1dff4dc2ef9e641d38def51c4be5e2fdeefef567fad9bef52cf6071b6b3df883d629f5cb6e2a7d71c3ad4a1566cd3e7035b218578a780f361207a9aec8bb0a84c497351707abcf38beb7b588012c81e03d581221c98b547f7a5e1675fb25cd75ef2d7fa56cc4ac2671eb43ac074ee9131646757ce7d0d1a96fd69ba6d43137745977e0bb063f1bd36113a1d43c2c919024229c4868bd57df2b6b4fb9f1da3198767ffa8ad6cb5452375535a79ade507edb83b95fda1ec80b260b7caf9f53a4e54b9c3f9eeb93244c9fbcbab2a04a902aae00e3afcf1b4672a83e7760c1910a91b6fee5cd4e3e567330077d7ef861248910c1a022fd1c0847c6e21fbcd705e940a568bbcb5b87d87f3efad5c53fbcad09e18a7b7e6f7eaee678abdeaedcb2fc031533e6063b2598fe6ccef514bddea7e2a2f5f65ddcf393799d5c24fa76e2cba22ad94bacc1adaf518924611a1fe5f00a47fb3e6f3261bc6609354012cb4fa2e2ca162a34a9d293fb4d792595d21fb6beb70ac659e6a885f3057bf38980be4a59a7830ed63180b4d36cf4817faf6f1140db00270c88f7f505306ac252f95e45ad684a9d00dbde36545ca68f73e2802bda95b6844a9b09c3235e9822e34072c4b8abadbaa2b6bb084838713f7a207da886377c21da8db8ff385295136189c11b0712e40d15e055e213eddb8370f046164671bfedc17bf0cb0f7821fab369c30b1597cf5819a0daa0f7087007f6cd8b50e558abadabdd08d43322d70cb81eb98178c1502435380e1fe7418485088ee0b477dc3f5cb4b0f739d4ac0ee2ba8852af8cbfe5b309a72b35acd5802da7a52b555cb065ca2837f99d3f80903690f9de8231f0a9b8687d9c1c6373f9201bb363ef132ffa3be3d49f6e4df3c008f22ccc62f519212208def725e33b656a0874d715ef2f55be315b5fb667bce8177fb965161390002f3f8ed416ba7e261ce48e4bce1ad9de799307ee3fa505c6a9e0f77842527970f92b7fb409667c7cde867e679c68bf76ee3e87d6ef66f0fadcd3699f13e328dd780318c5e4b690dd44406464230f24a2ffdfc87aa5eeb32ad83d514a0cc9bca102bc4a7cc6f739220e84f8032931f88c974924862c1cfcd59418a4118c251f8a0311fef9810788e0401ad46e36a8b3dec0675e705d8be3906d348544d77102e2772634b4a04842913601fa7ed575e30d0346bc787c7d3be07efdfba4efbfba7afd7aa51e5970d1c33dd728b574c86f115bbf715566d5668fce988c8d823108f46a1a1d934158071f348e8066253242663a6fb9b98a826c67091897c4eb205904b9f4eaf2d90e03bcaefc715684afb767bcd86f1567971d45190ef840146edf4c508860c80054922cc2b81f045b1ea8ffb81601b40de0f7264984243a4d982bc655348de6b08b313ef4fd480209c7f7f91c1212657ab79abd6a2379a2641019d23e972a59a9c2adb62d64777b618983c2ed5bcdd5a6ba261bac38a805a58df9cd4b8e2e0c9cde835fc98d27269cd2c0c754455e7c81c64b9fc4609e4369c467e3e0f7abd01273ca4111ef2c81046c787980080e84f01dee648fb9ef78a50efd39fbdffb23a92245a2728e9c53bd90080d1bdb607cf3796b501a732b09140b91346489dc5f3d7f171c4f3cc7f66ac3db9efef8267dfe37fae0b6cb5a2a55fa7bf1dc052d30032a8e3188cd4b62c6e014e764c61fe0c6cc0740b2c4dbb69ea3d343f3a2f3f3b5da58d78d700f3266fb559d89d781dc0ff2a08f88f7150c852f854e75256ac7eb7d18aa9d3a9e722c51524c9f719822c3a91f14318ef92552c52da2fe99cd4efcb3741a70e72734d46aeb468e3b01818581aa582151a65d57f3813af096234d4248a8ac7dfb4e3a85a8807e60db535e5871ba6667b8dac74d02262506dfc2ce177efd82a34ba02ab20dbe00551179e9c45445369e6b0e7a7fc47bc4834f72b273e0d545f882536d78c61de856198b440f9a9731021f1d5076fcb8adffa64cabf38c52279f7269b8572f97605b1f51ae9cf4c70c247f714e79400405120a1312d2a1caf80882c2586f89bfb32d46afb30e734e5ce91af7ee993be8fd136074256f11a94a936e9155713af6315d060f5eb850a917ac1b9ec81da8d42ab5b4d110378dbd6d948a8e7f9ee9bb19acdfc5bcb0d81be87beff3989090917f1b6ddf469923a34919f5735252e3d69b4cee392489aad36feb0be33a2f23e424b399057af379f0fb23dea96ff0a594a40ea0d418b8d39ff283084a6ff13bedd86cef752ce94504fca7371b30021836c09daf50b7d4171acc543146437c3f474a94010c66ca8b2947a4a19e8db471b0338d545d4986ef6f63030968d101df84823481c911e9a00fe0907654554412c30eaa8a7c9c1db903e7b304b243124360f6e1ed35b60ae372edd7ea571d7f9d52ff6bffea03cf68cef8a0470fcf6b028e9ab27846dda9555c364f4a8120090ad94e3e053c59c0bede3ebb11ea0335f79e470f6ab6af5217be7f47cfe177ea710da957f707bdeeeeebf161bd9b517889236689701141c102c74cb091d635de6e7c6bf51ab7a0d50bf7fff7b867f7516ae9a6f96fbef6a38a9b67b13e22fcbd79c55410611211f17c1052c11d3c5fb6e8c62b51996e12459f842ab3eda2c053e0fa0d625c826c39d54da1932cfbabe46cb1ce422f871e6302922de6c5d9f6ef3edb19416a1101ffa18d096902c923da22ee9e09fdbbd1ccb8ef279c26b61150eb6530573a875be64ebf8a55120a12f9717df5250ed9f63001719b73a953e9be685255114b20011cddf6aa8af285c4b09daa221f6737872b12423591444510b4c18372256dafb135c0ebacf63df51ffdb7beb27b9f3b8b3ffe48a9cbb21f6c71b616756b1e53a77e2d14a2e1b4d0e06098a0484905f50758159600b66f77dcc9356b2875eff20f5ebefa3da55aed97654daead176dba75f9a9711c7acd2db5ef7b7ab1be6ef0fb331faa54aae18cfdbea959d38b8f0809736c58091cb8462922ca947a7551af05795d959a3b64d2b8c7f473aa52aace8f56aa93eb23ce599403dc44723c964c3ef63e97ad7163e2c63551dd10edc7387a8c56304843b0fe8224deed8d200f60841c29010bdb6102db9097b3c5f7495f5cb369a35f94b74504b4bd50da92feb1368eeab648403f6c803bd3d67ba1371ab905d9e8fbd9de73414a24b1ef89fe183e1fdfe1e74855f1d8c4cfafb6c4110efac39e222011c0b07ecd9e8ea974964c55149c1bcaf4b7575574a19018765255a425101bf88424c5e3b13de35662dc3eaf336527999788c0e7796ea0d719f085ee4c9dbeef254a65947578b6df14a56e5df1dacfa38e55eafa179ebdedba6b953af3b46b1ecdbac9f58cb2eea6e46c3ec2d2d1c03452856989e5daf14fe71e32541382e68316dcb5454b1a23efdc34e33ffade4b6a5ef6eac5faa20daa5f8b0509086077f5b0f58952b57eabbbf80e7ddfcddfbefcea174728755adb2b27646418fc6ca379247e06e38cb838f029f2d9cdbd34a8a1fdf897472bf5c519fdcfeea1f194d85b87ccbd286e5e4e5227d0d1cab98a449c027b191101210e1bf771b3f56f673a515f3287e27afc9c22492059f1fd9d8e20af3e23d43b1e9fe3b70d79c78bfd5763609d06075ea554dd760d66d7385d256e610145dbfee47cff9f34db0097910e2d0aed9f9119f7fd64260c29a106e5505bed4ce5cc0ab6f739b46f7c0405cd2791c8160e7a913de4c6ebb1faf757d1c2ab811c17896c1439bebd5959835445f94262d85955d11caec54ec64cafc4106cfc4a7c80ec2eafb3800324f476ea0cf78068b2aae5570f684ebce331a7b51e3d5a13821b3e5835f559a5ee5e36e8fccf6ed5b0c17b470dba5aa97bf61f74e23b9ab0dcf7ebe0d3bfd39cff83ed3f2e9bff9a52cd4765f69bac39ffb4f76bcdecfba3722bdc8d3a68d0361803e27845e478ea88b4ab8ee9a4d489adce3bf5eb12a5aee9f2e481ddce3133215332d00620632d491214c0e6d69b987cf857372f6aa5d433b3af29baee0fa556b658f2e77b99ee1f9de3495545d961298b2ca71327027201be84e3851ecef27de7e1e8fa664982be8b773d680964db043fc03dd3a7ea7498714119017a5eb519212f3ec9d9a26fdd6fddefaa140fc9fbf78083969a2b2cbcb7cf3946e8d4abad1a49f6f7bdbcf95284c44906976ebc7fc97eafebff3e2b54b3bd5b2297be5f6c1fd3f7ab9e44a9544c0209b0552675970e57efbd626d4fc581c435bde04d8a3a108ad8c16cfabe485b8ea0c5f5d9c2c8e888eb6291ca38b8189f377790c3d7399e71385e4ec09191cf8c4f65019f39a81d7140cae7c4c647e3cef6cc837c8fd8f8685eb23df320df37763f5dd75ecc73e2f71011efd68a508d7df7d587f680b48b5c63775a56fa88b326ebfe55e9ff3bff7c7d88df90727027d7bdf302ebf3e697c573de81efebf97e32125b7e37f580fa639fe7953af084762fbd3c4bbff67f3fbb6a66032de99cf6e484eea8494eb61ab2b900334b1454b8c84d5a57d466d34d1b8729f562ee0d573fdb4da987ac6ef54f82cda308b5cd8ba8521edc56b9a4aa2028e46de4310e77b5bae27d6ceffb7823c8b504e29d7fff3acc16df29db834f46906751b2d1c075b06dfc0e7bf978f0cbef71f0811dcf391139add8cd1be706a707c7c1c801aa32608d088c99a15da07bdfbb9acf6d3da254eb9e1defbeb6b5fb9b13553925fb7ef29c60233b9d5b4d9cf4406f2a40291132c15789ff9ebcfd05361035ce69eb524827a6ca21ce9f16b2a1bc417eee7eddad97f30aca0d4491e3dd252716a022607c01920479c17417712001a266a031940eced94974e422302d59c47b9c7bb113302f633ce30ed4b5621cb37d1c347d37db332f7ea78488c067ee1be2fdbe41f36ccdb71ad4d647f4019ddbad7afc27a5eeba3d6fcad36729d5eaccac99f5a71bcc64c4a7c871527171ae262af0739fc6fbb17330153ae21adca40213751c2a6103e08038e20169e5b97d1021bf6a3540e519a0e2daee08f25841a96daedf40c95a79f153c4bb23545c8d6f6a7e44e76f95aaf57dbde135a0caf4c5179ce2ed4b2f3c3ea8a4ce3dacfe99cd060c7b61bc113bb54eda9453b5c4ee24dbc722c9a54fc5458ceb3dce8d5638603cf2f7a0ebb6bbfd1546f42aa18292221b2d6c7fa9583351a4e2aaee4654c2ab2be64ee93d30a58a20b9178ce1f08778e340020f4cbff192c66dde83031203545cbce1c5c11fe4069ae535ee27cb6aec4b99210b606579239f39995fb08d27e14267154d775f4a19c918780f4210c0baf51b2c3bbbae52570ee85336b4835267bf7263e611879b1b3820d2dcc111d09c0d952ae751b658cae1244aa99271be7230f0887a296c047567e05bab962b89c40efa00e3f81ca45a0950716d7704b92d9c2e02d6af13e4841140f0e5ba0ae5a60edfe75cfdca0b2e69dd190499250d221c7dbd9024134eda8769f37903fd536d24612f8c271c3ddbbf38a25d3bfddf2d42758ee8a5e2bcacbc1a0635461acb03545c247fbf1b53614942e2cb00b1cbe6fdaf9040945ae9fe938093357de985b59da562b72131187c31774a1bcfdde6c11f687b20afaeeee2e097de50e2e08f335e7a0fc8d9d0698b0513ac230fe0745962f0e65e4a5691cee7c61cf112eeb848ea88171fcf4bf5188318beacf87ed21af28231487d2fed8f03ae54ea983bba341d74b05257f47b78fca9a79a275160241d681caf40c6774a6a4715f5446956999a8303e412a4e4b086a82b3ce30c8bef4fdf4f38353852b21611c881363f9a87dec2e92228075790e41e90be3d88a1387068d6e0b310e94c39957c258101397e8824122228749062a47cd0daea1fd582926fba04a4f165fbdf75bf6b7b8b387dddf9915e57beefe767a4bceb8af6f1db9a8450135e58bbaffd151288e3ec1bfd8fd886b0a3bffb7243f90e603a686c73dd76aa8ac86ba5faaaa230f0790f7e123163f86ce00b039ff7e00f2e8065c78f5b73f8e80b955cb650150573ba112f3e6feea504f31211f80421f78e3b4112cade09e7253901b4812fd93cd3c6f1be87e4d08f57f7a78e57aa75f38ecdfa7552eaeaa18f7ffe1fa8b652e96003a74c1b99664012145f52c08f701dae270984655b9ac9eabc77b292bb3102ea9dd720e3b82df0f9253d2ffe18e392f83bd9dca77de961286a75a8bb7f3bcdfa753af8ac3fff8579a1b81de9ce4dbf73a0a89438e860b3f1fb6e3fe8f6500b03da0610a174dffb16eb95473aacd673f25dca63e7bf14cf0026f97e52a20c92fcef756aec799560caee41eb8b802491577322471c78ca2ab7187ce8e894eb8f3a2a3ac9615c6c9659d8f4ad81aa28da6f6a38737d5d66b45f88ebc3e67a8bfa19c644a7afcb00be3ce0cb31f880bf03e1b3fa015f06f0e5015f0ef045802f07f86ce0eb017c3d81af27f045802f07f86ce0eb61f0619cb6790ffd7e346ef31e882b519dcc7bc7e605ef4df39287f7c8e17930cf198bf7c8c07bcc51b9069f35c58b8fdf2303f8f2808fc61d013e9a071bf82e02be3c312f11e0cb013e1bf87a78c63d16ef8179d0f83281cfc6bcf4f0cc4b18f394877e8e581f63715f06de639c15496dae5403d5f4a253b424724c9b335a1e788052cbd6cf9f3371a2521b37acd958f646f40e9f5755d581808b0089b0a0067cd59706aa3c40f3c6d1755ef7a0861fb86ecd6d271cb3efbdf746dfdb4af8de5966bde8af81f520d657a1585fb1f7eb81ebcc3c58c06f03df409a67e0abeefa95dfc906fe42c69f07fc9e75d1ecb1569fb53d4da95f52239f7d3d4fcfd18f15fdcb903287eb7e1041fe7fec7d77605455d6f87d93425540042c28a189065054c4b5918958f613bb045d154d5c5c0bbbbaea5ad6c68bbaeaeaea2a2aabd8829505549a28b6bc8080080a0a845e8288945002a46732bffbe69e73dedcf3e6e64d4050bfdf77ffc8cd9d7973deb9f5f4735175a864348f005fab8f23d561a8d78adf66295055e80da84b54ed3230e76ecb7be1993e723c3787b6f61c183b2fd4d316db777cfe2cd8c7b80f6d687786f9136afdeff8dbe62317970bf1ed639f7df15d1bf505bf0992bc14ab544d715018ff84296bc059c4372f0eeff02f2181dc141d19fba790a98ab298aac8f37377d4733e4e595715906ac7a02a1a047ef84c5514ec4e6950150d82f6deaa8ad0c633489718a261c66927ebc6cc6d48c973a20c9ec186e48d3383a7ab128d1203aa4e32992a918bf2ceded9905a766c7dc405170a71ed930f6f1adf4b880b3bdd7ce771db558f30309238659eaa4561e41547242e71cf45fd2a23bddf5e6a9ec4ebcb6783e2b60c068f3851834a2350d5c9e6c946fc0d363380df24bfd9135dd70b7151cead17e7a8882ee31ddc741737aab2186349e31c861adbbfb5e2a88abbcdbafdbea3dfab3767c9110e3d9bb2f4d26745431a06d5e6b642de3648fee2b53815d67e2bbf800472dca6018b410299091248624e761e719c4a62f0382613a7acda7e8e2b36ad526250ed9ed036490c45206023a7ec001e16937c4683c4d0d30278d02e619c32b63d7836c0d3fb313a5062c806780ec053bfb7e9f738ead88f61008f8f8ba3c1f3c6355fc3bb484fb5469c743f92f4f2138e4bb0c4a0de5b0cdff72389908fb30df0b2019e8e77913e0e12de48803710e0c5be0fb508ddd9ea62210efba86b8f4b24679679e5296595770931f7fb8f972f9ca43a0882882791a08aeb55f87cb3fe3d969804d2abcdad693f4a0964665f9040988457049c66969a5f39bbbd00efb0d66f2e591741db2459dbe2bc587334c033ac37b93e70bd227c05af00d65b364980198047676887e1779da1bb1abe2d67b769d3ab54888af3777570e4139be7942cdbfe817a30b24ad5751da106db52fd35aa26d604254138fa7e73467547553c49618a9440869ef9cf9423d708d1b6eed0cfa62e96df75b386b839ea1248946a7c69fe98a4ee804408eb5fce961aa5ceba4459f68fcde58be57bbeddf4d982ffdd12c80b9003354862c01bff7cc9e07e5e89419892cb9923de7589617192eec63c4d370ff4da575e677b2b3170afb3e00b9e1a9618b80d29c8f81c0ef03a1334bf0da794b95754baf1236d9f397c4b6eaefa653acb05c6d3de87e03e15ce10696e9ac78add6e1d0dca863b8e05c61a8cd846af35be4f4c81b64101abdeb86af0d10695acdb79b463746c441e34cd3f3e60fe01dfa807f815aa3cb719dd3783840258145f565847fcba8ba32adf55c8727d9c71fba00b9b49d27ec888ce156336ca0fcf1135ed068b04de71060d03cfa1166612a59df87cabdf54ff61a4ee67ef6940f925bcb0268b0bdda51a3547c6dab1b6ef46427e00b383df6c5c56ef4137ca9f4b554491e83f93aa88671ff63676e2033359af336f01da6c5c1c1d5e925e6741aa4454a1e181e71da81c5e725e6704cfa0eaf16ee84b8e31c88eb64542d0e45c5563d2404cd942aa18c8fde54b6b1f7fe09d2e5e8ad5a6f9f218988619224f6554a8f79bef139a271d9e699ff855b4dafa8a32c2170dc8c1157daefe30d7fdf99b73a7f57f44128c39cba6ac5bf50a8c539ca641ab71fcd0cd9aabb2b0c6e71847ff8babb6c2503baaf2a54587feb884f28c8acbce7fb6b5fcecbfd6cebe7db5759c2c83c5d78703ed2cf85661c1ceb7daef6ab250c2082a688bdafbb2af088863fe2ada29dacffdde7777b32f3216efb8c68399080c5fd8c8c13178f01c6e8ca840375e741fd5e179ef55cf7bf8c1ef710275f81e3cc22f0ccf6569cf65b17e107ecc26e0f5177fc7decb36b8cdee4a47424691ca8c73e411c71e7e0a6f9bf00b03bc2c8007e34cf8f171d1da1e7ef49e2cedf7997ab2cc04f3c6c68f71d4a6c8ec2c46c8bd718e3d5fff7c7d6bdcf8787f42f339aa6efab8aa314b715a1f55935b300b94730fbc68b598c4f0e7f3a5f0cc6177e767b1798efad661d4303e0a3e839760ddf0f1373da7e065b175c0c6bffcf4b2a7961f2ac4eb4fdebbf2baae42ccbafc8377173eafc681526730c21062f12029a648769450f8ef385c4e581ca86df1f394b00e8f13b810c75ff6eb8cf0a0b79a4b89e3efe2ed889b2a2774704a6bf79a01fff9a38fafff1c309e177adb3f9f317835732ab7b8297c12159221b138f0f95e1392fd4440349de726a134cadc48c7384d311639e8004e36c9c03684279fc3802e5b3da54b2222d9c036c8ae6a74a7f4738e85002f6c80a71bf793cf6564c7e38dfda0649426151771f48ca331b98112bc00d586cf4fdd2051993868c1545026bf777f64b69d181e53d5f58f7e8e0702651d86fb527ce9ecaf50351d704ce5122320a1fa2bdd83cdb88e094f76a1145f0f5cf5668a8f42c921f8022dd5662acf2857ed390c5fb67e2b9bedea59922bc4fbdf3d5dfa640b2176ff6dfb6d9590fa852ee462358e041622089c60e0418c07f30cfd797e256b8813143e1fecc027c212509bd29d936451c46a89d71f86dd3bbe5d7b29801e7269e64715f2b35353875df19248a4a2c47da69f0f81b9cf683e615e988681a940eb1ea919822978b050f24f07da9c6084d9f38d2628298dfd4172c53701e8d6261742a761bd0fdae2a613ff7d8b2fb333e43363acbbdadc16fb3a1cfb0d1a150792fbae72e7252323b8777aeebbea7932fa817109dcdbc85d6e20180d6d6bbc7a0e36201a154b7437586193fbaf03f0b2019e0df00603bc20774a1be0e5c1736180d719fa1706789d35f816738365c6359f71941b5b4b2c2070308ea399511cdf93ac1b730918a96dd113e015b07171005e36c0b3015e5e3cde16b963f371a179cbd3c6a5841b190d4e0925caa82ce1f5d2c6058e058417e91a79a542cedc8c35ef954dc25425afe975e40855d7bd0335b8a7d6032b4189b373a514734deb12d766d27d52dfbbeebe1b301571eb18ddad6dd66f72d7c5f953c65263bf8b58bffd4e0d6a9cb9bb2eed13b6de4ceee1b96a1e6be657fcfda7a38498b4f5f9618fbe2bc4b697366c2f5b00e3016eba649cc51a23fc0ff7be1f5635f2fec90709d1fbd3334eaeea20c4f799cee38b5d9bc0eafad7d13c4fa94f500586e705aabcf2588d073dfc1e56b02f69a0ec3b0c4992751ec30309c6000faf5bda8ebc3f5bc26d37e5c8e87bf3e4678bad938f9b20bcf92b817d9141fb42b54b02dce44df35744e1081909e18313cd0f672ceb375de2bd7cd1bc37d78e56f852668515aaae394cd564446781b3e8c64e2cb3037598b5a9ec2f0282290de4902c1f33a7748be4642a0acad2c66d11a2c3f0ce151def93dcde92b4944cf728a6380188d3002f1ddf81c90e86b88da90696792b91d74f31c17b12e0213fe3c05f3c301d06cf0678f900cf0678f900cf61f06c80a7be37c7afa836d804242169afe01141e4077f118367033cede017e02f6ee52bafaeb803d8d6c6050f7eee15e6793fd9006f18c0e3e3e2307836c0cbd7decbe357301e269fe62d3fe1b878de68450c9e0df0149eb83ef28931e0e31c7b3ed2ad6e4d453b21befce2bd6d9320db2ee6baaa03af2bcaa1f523b47f82e73022fd7555bb5bba456aab9b52df12a25bffbeb35d0212371e19301e05b1b689c099bcd738431486f9c47ef7032f2c07bcb0282e08c6b5c8b04f02e269eaeeabb24b25eb31f5ea510f3f365b884dcfae99b5f529180ff0aa425d3b72bc985b8cee673955882127e7d75ee31ad9971cb87ad09d52dabbbad9a503cf17a26fd6ef6b4fbf4a88c3da769b307fbe104be7cca9d8f19dfa5dca0faa2655d13aa851758804c78aef591ca180ef434868b2d9f3863ad405ea7cf6de87253dbde2e137bac8f79f939277d78bff91fd58d23ced1f43e56f1f11e7b51921fcf3970b84c45b9f0a1b1bf629329ab49f818c9ae62f0cf08a0c8c6c9e82b764e857d33f3c4988752f16cfdc04d71010e1c0543d10af43046425d490890119a868277813be11cb5ad6dee704046b9cf8380abfad6e4365e4152116bd5bb4e63349013ba6f578f50749e99ba51ed8379673e74831dc5531c8815207a0ffc0cc88b533920c6cebc72486fc464a0c3cb0ad1fb93be600bc0a782e0cf0d4f7268941308961a092182cb33bb00df032005e01c03311c091d0ee09e352c0c6458d53b6cf8d392f1e6f2e311839253a000338e7464a0c46b7584e004b48c244c62003e015c48f4bfd1b75a754b477737abe3f61ca1dea094e382867166cb8da09aaa61b0b7183c937b658d2bacc35ba776f79e2532081581a5e660267436f159ede3a56ed12365fbcdfc9ba41fb25eb0c353e89d7c3b496aff61d7eade468c72e1dba2913fa8fe3006ea17820d52c871a08894b582e3ff09ef517b712a2ed791d6f18fe9a50eb23cf5b07d68ad031ee3502ad1e6e3ffe1a591f7fe759d38f900758c6885ec76d7f46f26375b3a66c512b43a4c0418ea95342d7a9da4730f0c007c98552a7e4b1ef99ea8c54644840fe28c4b5473f34abfb39429c75d1906bfeb64b8803d71c5cf3ea03ee6f42a5bdfe22d439d459c4cf5f2e8c2f8e37b499c4172c49279e3f848f8484ef336034e6fccf944e2e43be75e38617cbe0de1e4e38709eaa0e5135057c82c44d044433028806023bf7310181ae7b0404269e7499c069b89cc7f20d739f59293770fdfbf56d3e937587c99deec85a289fc90c2d6bd55d98233739a7ec570da889f44b0cb1b6912308f2cb2f8603b098543b7ba72af222c79f04781900af00e0f103533ff8b9aaa858b400780e608307910dcfe5417f55bf8222de6d5225c201c83825bfc460c3731900af00e0357ca0369631f038bca41883c89975b67b53e197cefb4fb9174fb985240eccc68b2a99eed0060212014283a2bedbd316a9addbbb2aac6ec3fafe8b492080178c27321886086f5fbc8ba742b5e16d305f3a4344fb229badafa224256b580f5b42eb4639c38598fdf5843ed3e15c40d51d1d4090bdb81a0ea6ea6aa85f12e2e26db7560de82ac4a11f743be65177dc72459ebbbf7d2a185c076bc4d5ae9b6f4a76da9bc7dd2a0feadd6dbb5c2d259c7ef5e7bd78d1d342f46edbffde1692f5397848c721650749823664e95bbb17c9b1ffb0ae06770411162410261bcbc350cff0ea36fd0fc948bb5e883ffdf95f136ee821c419a70c3ae4e9de421cd0e5a0198f7493bf3d2fe5a053e4816bd55b9fc5bcf24c8c1b8e37ce5fae3ae502254aae6237cd5f18e099f659811573079abaf5e5766fca7ed66dab995af312cc17645e20427fa5375f6e410984c781f80888b1a4063db067058d374847c8bc081349815a80701db84fd63d2ec4c29e855bd63e22ff4fab5e7de345429c78cbfffcfb3f374b54c369b7755a2b1fcab262a61ecb89c606381ab662d0adc2289025f4c6828d8346e46cd08c0e57ee9e388d51f0c64211118d8c56218a8cf07b7c8f0defcd061b03a4d5465d24fdbec842235736c0031315e15dc8e0d9d00f484a6e156abf2f62ed420b47355feb07e201fdf5c685f0c987fe67c17b553fc17887042a6e1cf03d2a30d1f18d8b03fd0803bce1000f091ec7bb90c11b1e302e850c9ede8f4281cbdd06787c9c71ded4383d21d4f1375c900a2474178c5039d4f0b9053733c256f574ecc089c7cc9c078a7b636f769465242ac4990a4fc40bc6d386f9403c102f87b57deb187e57c4da8bf93804f43b1bbdef00ab7cd5ded175cb3fe75f28c407539f3ea26084faae0e541cb5a8aa02425b0381974848dcefcfeb79c359a7dc26c46129475dfff86cd7901e1d1efa87d7ff288e9d791d68f88624577bd44f42b41407d9ae4dbee767a7e5bb75e6a053d7efde2d71eb5b7b6ca1fca0aeaca6f9e276f20c59587fc94e8997b5c8aaaa7d57d6432dabee3e09efa1e8837592e4a6ffa5c9991d24614ff973da693d6e90f5a6d49d3d24c108cd0a1dd0fd18e1badb96346b26dc837e934be2093fc457e86ddff8f2f9f3cf271272fd3cf0ef6713fc22369fb82f62edc89c9a6bddfe57aedcfde75a60d0a3e0e480eb36fa37d6fe2bb43f869a393d245ff691048245526955f008038ae25369a1ce136d2572884aeb7f78a75c1e31eb2a8abb7c2c3986c31fed71e3c152226932b6594a8fdf8b384e99eb10939318485564d6ad6700bc028097586228a648f4bd53153189218ef3b6015e1ef4370cf0748981ab8a8a81e3251b922107974962e0c6ba71ba7343032a98c4124309937cc6412eb1814c62301a17717e133b51c4d990745522cbc155ff565d9e2b81cc5cfdc15353c00d1575fb5c678c9c760dd84250e4c7c86997536b3eb9759dcba1766b75e2a7779f1c9b1fd54fcf76941bc38324109454b9c417b08eb96acfcb999603bfb31aeab7cf763643a4d5cbfe7c3cfa95822786c5bcabf2cae1a0a9bd978d470d1b0ff9f980b4210f1cbb5588ae6f1cffd4888972efe6583bd2ddf4f716c79faf5f2e39027e41e371b035d55569a74453eb7b9c2b44da9f9a5c79bae49c9bbcdaecd9014325a158d874f039f2fbf4922639bf97e743bad5ec23377b70cacd6977f5970764cae294ea580e2a61e576f89dac57593531afbbeca0fdd6487c730d1225d700706711d3fc99ce1fc0b7eaa7f287d7cbf539ab7462d927304f2441a3e481f386f3f8a2aa2977d910556304bacf886e2cfb8a80ac5515a9b26c6823e118ad7f4f4a9a7cfdfb90e4f1ab36956f7693b22d1935f3f5996f4bd1f395439b96c8e70eac3e78ecc99273b4aaad9bd36f10f1c6db8c58cd554559b0a047e241a35445356d2b4ffee91d49b0eef961b8237fb9fa9905674e96846ae9a1b3cf99f88c105f1ff261fa98a385587ef5dcb61f4a4e6c7d9f65d33e7b45e2e594b7582c0f12eb71eb8f3b66bab103cd0f73addfd62da1264d8f168d5715f5635e6726a35ab2aaa27e70702569434ad6eb2c89247036c053fd26db4623bdcef801d2581b9281318814d6f58f1190fc0f9e9e324541226f95aba08ebb80ca2d3590dd170908dd0f2209488b6b5b2d88119009273eea1210d9ffb580871a8f121adfdcd8e7dca9c15b27b96c3c54bfbc75acdac1c93213f65b62a39e07d56ded9b95176dfe5a8ec32def5d3fb9addebf6a50752001a9fe03b45f16e2b49b2edddcbd9b10c71c715ac10b27b97687d0e466634522860bda7870e2fae5b601a3513fe178908a9933145c65c4192b4184541b0f09cf82b60e2f797c8be039d5c6649444b8a11dc40099e6af08090bacf702d82780eff6d19bbe58f06f21be7974da9a3990fc13558eb47e519204d51519d1210094bc1021a928b9f3ae1501c50a7a60ef0a2720ae4ef2d049dd9e7275c63f5db8f20efc1ed36ea742923bf4c76f0a2a84a6bf57350678b911c35d671ebff348d9f17e951754e43bf2bbb79a171cebe6e2416fa87ca6032e56edead6950f9648d2f16dc7699151db25617a7556edea6bd59338704889c9eb060f0cf073a7f4de70c5aa582c712c6a999b76b810fd870fbe2cdb8e39059c71c92512d7754d4b0e7727cabcb01596c51243b778d97dd5f79c2385b134e68612646445783d019e03dfea07bf6de294e8a056ef1d076f1eccbcce689c698326c6db070fae041e6c2d318c0b872734bcb98e7f1ce4fef2e08944e3529b555dbe658b104f9c73cd7537dca0bea850245b94dfa9d73b77aada559db80575fe683371ef0769f7c591954d9a0871eeeaebe76dbbc51d4fc4970869be1a2772ab1e0c6d07f054e36d1be6c764cbc8268239527b9f693db0f9af1f5a5f512d39f182b4bfbf7b8364782227d42eae8683a51c547ad5703570e5c7429cb0f89c8f0f9784e5a453cfbbe5c543e45ebe32a557ab0566f871f8e743db56fd84b6373ed9da78240f8faf2b9b8d8f93e478e07a56f0f269dd2687af7ffef2017ed03e407c75f81c5ff44e34ec8b65cbe7defc9a3c07c76e7e62cb44309ed37a0695eceebe7a7b273c873772220345f7e08057229edb2491f8cabe0a243415478e53f59005af5d23c49513f2ffe348c4ce7deffa9bdca4636e419b08a681c68ee1c6ad3c19ea7e42ac3a6dfe81ab25c57cf7ac870ef9e30f427cfec6e897cf6f2107e5a25d59731e1714a9593ba0eae61fa588376dcaab6fe47e28c4dbd38657dd3243118e458a57f50df46e10e5778197ce4ed0fd9695410d46d532d025ee3847be376b774169a9109f38af5df05e6f215efbf4eed6d7ac16e2a32f5e5efa876512e7c9bbc4f76e364e87451a0fa7486f88a43646d44380178b78775804ab17990d014b0111f53c72d910f14e11f78608e74644bc033c91a3c17344e27ef823bcb57ec4e1a7f7c3d123ea699ccf326f07536930c0ea52a84d11de384e98dbcdf6451c67b1dfb179308cc720ca80108def676044337c1eba2a34a78964d0aedcf9e07b0fc9a32863fdb119ed8ba1bf92816af141eb9753ff21c415afdf7ffc1db74bc23162e08bef6e9407d721d63897703436a23ec1ddfce184e3c13354f0f1308f0fc2cf6ad4789823f693c397cf5fe0bef2e1dbe0fc61060513fedfcf99de767eabd8933e8697ae62fe82d5c800e34e08439bd94278db5ff6b50d04240c324a4ae1ab775df83237adb1b52254f1fb3942342f6eb5e41ad9d1eeaf9c74847bd02f7965e69aa510928f5e1314405402801d55e100442501da192ddd5e2e37c0e267bf3ce5d34f2567b8f188b93f49ce70e6f071bd5e949cd5c6c7563fbf0d44710c84aafb93aab97b62f52950a397097a9f804848ba6008acaa7d06da40506ad17be57e49649ede3c7ed77342140f9879c8a7a70971d4fc7ef77791fd485fdde4c14e19223ea02e7176559f3714798f65c0a814c4fe722f1b54998c06afaec6deffc16d0f39ca46634d35a8b84a1a0e7cf4b929e6800e7f2aa89cb88a2bc08dd9a74acb010e8fe0311517a892226fd43d5d2e198559df4da89ad24e3dc9afb2a5f8865ba18d596613a9b09ab6badf5561753de784ee3115164a66e4dd47b622e51cd1ce375f05d04f9df3cc609c32f7ba9b0af04c2a2eb32d4a839f7a69fa55ade4baedf2d5710f9df3b614588f3ee37727ee12a24ffd590f5fdf4d4ad607b43cb6f7fb225ea7aff035ab3c1d6861bb00dab91afe45c6f5dbf07894c029e0ad2b1bc627a3a1f1f0e1ebc1c7534587b7a7f88e067826155792f87a92148e23ec0b5071452aeb6eda7da21013fb3cfff8dbaed7dbf3d1f76bd1eb0acf27e63587b6adea43551d81f88f48dc7a8ed59cc57284a1ec2b09c4863aacb75d82122d89c63616716896283fe069219a8d689935ea65212edff6c0752f7610e2d017ba0d6a0692890570b063f578510d1ed4a05270377ef48afa47aaa4c8fde9f3af4d9eb043882dd53f0cdaa2941ba26234d428e24d85badc507f08f549ac0df5eed7f59abeff9b1f5eed84ead777c909ffe0f6a77b3ff0a094489e297fed9b961e2722fcd9559d589b272fb4d5f30992eec5da71f06c8017067885002f0cf0d4ef1d8207fc46d48e7f2fa53a19674cfa662b780cefa0acc6e328058c03ef054e0e9ef75f99abe18dfda07118c752ca18c6257247dd0d55a09a3116c0c8554d265172155ea6943ad0366547c6f9f22545649223bf67e6988653c644fda931d838eaf88a2a7152ca979260fcd4a2b97bf3a0d526747af327e3e08775f8c29ce43321fe22e8c6cb64c70339faa0ecd6415761f36cd9fe248689f135ed37c7908cd4846fc0cda5512f755196363e006fc7d39b6efbee12d93ebafeaa7ac6d804d5285113033e5c6f071bcfb1ec2b09c456154a2014e1290956af57b35a5f32517e3729f47aef03848f330a7d9472bc1b917e44e7ccf1bde5371b6a965f39ed13b9be57edfe368a0405e0214f8057a9d45f0b35da2ac0bb00757a753da086c8d75a3016d600e789c6c26ac8c24a9208506cf2af46ef068c13000eb60e03ae90b2c34d6c75433c7c6a2755ad7139dd8d7d563d34fd612979f5ef37e4fcb9b24fbfb31e6bde3381c4c0bca11a8878571c2f1ae76c901838c7c5bca17c5e25dcf6e0c1ab80e7f43810b3f112df9301f0543f1a29319838679ff13d07e240a612e7efc05fe41463cf573f5ef9c5c6638498b3794acde72c25874f125d0f6d304252e015d4ae91514a20bd5c09a4cbd9277ca8241070b3e511e4a375af38cb176f14e02cc125b279e86d66bda0c6c710001a646ca6f9c73649b8ba445910606c3644bcc771f4008f38fac4f8068d47d03af02460abc1f14089b724d0f6a2e34bfb03e0737cfd124e627c4bd87898e62f3bb144b9e2866fb74f3a4888e5efcffb76354f2dc334296444875433a84921891a090ab03cfce64d73d9470484dc77c3d0c6009f755244be3c6bfd25cfc8cf2eb32e74233b4d399042a194f69daf13a2eb9613be3efb47c919fdabc5b5df5e2009caf815d377802d02fdf2a31950a384c2ae26c52b35d1eba0162e5ca96103ee0bbc398c7d8f6e8d2c42b9ee5968636e197c1fdead0d1213710a474aa9e4d31d6fb984e9d0a15d8fdafa2f210e7ce4e0d7cfba5ec4e78672605c0c0b8f368a5a685c555442eebb78f087019e5ae849aa8a28702a9fbc78e669f032d8c19fac1bb35f05930df01c80871bc606786a5ce80064de6c53c9edd10678093764e5985dc3d7ff20c4dce73e7abe285f0d08b9abc2bc9317cb36f8bcb5aa2371f387a5c531adb6b84e215d17f5d97df7e5c21dcf5cadfffc42a952f0c2ca40c2ccbccb3c6f9b0cd54f168887f032d90555662706058f474cfb097506e001f3448c40513cbe0d44bc27864f81a348a882025603c6837b4599dcd983c6a38445782321c88036a98c1a89af0dbf1f9de4ba2d32306ed98c5065d339b92efa85101fad1cf5e62b5709b17beef67fed06679e1af41e44c2810c32a8b28890c07986aa2bbae80b0849f2570aef2b0262e9757ca468afda33465c2c452f6b86f5975eeed2f74da0eef5639d16fae3c172800e7ea7e3c84193a56432f6987776ed9214f898b97f2b768d7e9f895118f18efef9382014a888feceb7431b6feac203033950a0d048209080d0cd5e90248e72c8408ea40824e5237f6a885846c907ef808eb01bbf5c896a45c6dca295f2b93e9d063c30d09163f46eca336d8e12892486d871c775a10d2c6c95d2c39c1b4a3def71a0ea3d9c132b21c9a788c1b3019e76f007725e96211300da623c5dbb0df054bf4d9cb945fdc0f88af60d8dcb8e6ea55d162e1462c1a8cfc5dc52d5614afe87840475c567c1e760e3c21bf68880480c5b0c3cf0ab5429a97439fcf8f6b15426b61c319180131d0d190bda91575c41accd75e1e61b367578f3005e18bcf6826c443c62da1ff18eed5c68dbd04b1d9e39e2bd40c3d78bafc855fd4c52420d1a0fef8e70be0e6c809f9b683c8c11e445942f438797ac44cdf11d4d84a933400def09be3edb11c47155dc5dd66ce569427c3ee5ad411f82b71cad5b94a08111260d0aba65e3f9067504d631119046abb0f6b51756186a5b55ee104697467fe72e85e8708c1c661703a1ce2f076f9803c1ea44f117d76ba4cdaa430e7a401ec4397ffa7bfb918b85386475d75e6d2e86ee3ca4bf1e25109400e860b848d55520caa14e1cdb6834a71c3f6884fa94d56844afd56b5489d5a228f9771d8e6694bf4df472fdb2ab6fab983c6b56bc4e95bc316c6d5cc2ccc660ba000bd3cc07a46bf7ebb27db61284a7dd2f62d43507a453275d3ed90a0c69c54d1760719df070ea87cdc6c5d1e1a9e777b62f7d68438ff89ec6e980d1eb0445f941f13d10dec6c2dafdee2a826543bfb2b4fe23fe7863a27f7c13dba28cb60c80770cc04bd646e4e8f03cdb00c337783d986c6709e1474d17956519f0f5db067478a6eb068cb61e80671bc6c3c33ffab3e0ebed8f84fb2d597ce3c6db01fc63f0d6a62d7eb6507d425e56116048f19ce3353d870c2cb381708211ec7d85653fb9f152564c2726265d1de3016c66546513c8af8ae546d5f4639be566c95fa414a6a6377b4241483b5bd598fb069540a4ca8283a3f628a841e423d10e233991400021c06c95946c0f251a3e610fe8cfa34aab96a5bb265d24720892a0943f525638fb766d5c007bfdc0a4833f7861dbb1cfd13dd1605c361efc85fce0f719f1193cc3c1cf1803e1dd07720c3c67c37bf1a077e2e105deb36293317310eb874650715cb6166f68bee16dc03c6aa8c350c3914fe6704e7050e48fc7d74fb0551b8dfccc88ed1df4cc481e4448f98d9d821b69099e0e9f5f49ccf1e54661ef601bde20bed1c4f07df3c40fceb03e1e41f7d724bd7e931d0f8f9014360e5fbe1f38fe81fbad30197ca3c01846064406574909d7f96cccbbb3e09c8b80ad1755ab980414cf1f1f21c15c576cfd1221b1a1764492655fabb080705072b33f0a9179e9e9cb2e961243e8f194a1bd5a8a7811db89fd0645ec7e24f229674b6654adfbbcbafd5229397cf5ce84f1e3c72bf898251507060f74cc361981ab4beb20608602c230491e1a495105863ac223f59a6c2dc8a1420428ea0e6942a04d4be95a68db50e7aaca750a68ff7da7c56e60e2c11b3a76cfeb171b1701e352a08d8b29402a83b9fb9580111d5551c62494f07ca01137c9fb243c5d33aacc04c02b80be2b3cf349459003fd28827e08c0bb2021defeb4f5086f18c0cb4b3c2e566ccb3aa78e99f366aa10bbc66c5dbb1b22d16b408a20d11f25d1f7554dc914d1af1e55586b85687e6dab9b5d1b48977f1d7f674c856572cfcc82c0bf5250010645201790f13917e0d9aa5f002f53a9eaac7949ba419bdd4975f85c05e3d9063a37882fcb2e8b2a4a2f4b32da06d87a2b602a234fa55a04fdd2f1f5dc5cf3607c747864d44f723c7c467db2e1a8b6d10941cf864bf8fa03406d03be5632f8e2fedd7cfaba99d31f1262ceb153de980daa739f711c6bd4702c85ef8151e6ce3ea44a87739308c75a9164d9d76ebc50280ec4fdbc507ceebae5468d2276142510bc7a3621e5aeb4cb5f5b0321f878a73546b0f3ec9ba4da824339ba48d5a4e2eaafd7148063727f43112f47ef2fff1e27884447245c4ca27125a19297163df5c381c03917261a97645545b00cc62679039dff0e7907dea3493e283144fd2a3487c1d32506136767921844e3541a096e244cc8d955debb7b841b67f4e345cb9d1d10df518f841d6be4d0701e619d906492150f512fc6f51c656ec6d186dd338d9c2ee7948b991bb449b517ec4ecae13bd0ce6a14be519f0a15f177a09d95103e735715413781728924f9f59b783c7c123093d01a8b2f977092c557f8f085f18fc676d2b70f7d72e23450a993648192076388a9e64e3c78ae0d8f7f63dcfa86759f7cd9df91e8f92eb58b2e720fd4a829421323b133e9ea59f5398b742defbde3e09f40254577599f0b35de690da9515250d21aa7d7bed425583342c007d8a8fae03527282c429426da2520172ebaa5ec5cf7dd910bd60f4d342ebe71c8d2c74fbfe3dd1799edbf633c8bc1d3e7c31f819bc9e099f00b27c4cf1cf91b4e8c9fef3955fb2295c1629163e807e0b1be68f9c58ea3c69b083a4a9c98c281ab24f1c229e4d490c084a196906b2ea84c71bf378e0bb6bd3be5c31afee6fe373c3fc1f39595103e9f87ac86e1fbf0cd6a1cbe41f823bca4c7c3bc1ff66c3c4cf0ccf39914be4111e441e381eb7ee1cdd327bfb44c88efbf2e9ab61abc4b6b98ea9d246696fb0a55f474f32012129e34d16675d2657f131059a2cbea2f8805dc393aa729b871ce33b2ab360f3c3a2c7a76ea230a26e5d24a5575ca0055d3d59478c10c3a3c16072019065ce1e06ffcc0eabf23420470894021018b272c9dc45a37d797715cfc014dc3d53b98aefc18c691fb395a5bc1d34dc451936efc18e6f41066b60d8749263e9d2eebc73144c6b3583fc21ade6663a8de8f418600c22c455abfeb515831076c6534de983a871b19f17b4e4060c3c5df35bdb3bc343346801e12ff709d217cf36653ff6d684735fcb9edcfacd3d7e77131049e9a6c45c1c6db84fb2fca25493b495b94095ff3fad2e16519f0e53699e16cbdf9ef086fd478c449128e86af49b2e6e3e19f3f24a476427c93b5f501be9fbcfaba331dce319238507381b656544d611b6cb8c408e17d1f1ac6c22f493ba291655f1110c7fc55b42a5ab77b72fc428bb283868c51902b891d3ca0e24ae99352d9748e8210429515a685c78baa30fe040909deb4610332e1807ed801df275b108e03356c299cc8fa7842522a3a366d1a6b6a1bdceffdc48cac5c45402a0ef5bc77501b1676d4b751f48dcd5526fe833f0af08603bc30c04b7cf01753ee2ffd20e2c64b5f843033dee2861c87c65c1ddeee8edb9f5b364a885537ce9fb969930248aa4bdc58cc8b8502510d91bbb46e602462df1d503f77f71d22fe0009c3b8e8eb39300239ca0f7a369e001f72a7892423a68d077d6162959979dd717cd97c717c03545c81aa5aee1516a4e26a64047934ec234c3afcc68f8703edac84f89abc2619bebb7b6c3f78d915724d7e5977335d7486b60c76f119d52871a06603afaa652a793a7f6ca8392149baa4ece90f1b2e74e564b65ebbc6f4a33a9dbcb4c7e3525a589d3ac4cddf2f20ecd0e2c62ecfaf9f5d15ab9e8ffc3552b863be102b3ef87ae32c50651185c6fb1d1885ae05ef1b8cdbc0ab4cc938be063ae0ec61c74d65adaad0b980dc9a95592d2621f5fdf8bc875b7f22c4213bba0cb957e55eca73cd701633629b8c96be34e03960b4f522bd99511c9e4f36e23d13ee519907f79e987270251bf19e09c6c5798d355e1afcf3b32097582904d6c1b8ac1efc7dcf897f95ebe41ff32a56a0771daa00c0784e990720130119d3c11859f78eaa493201824359a6d7c9ee743d7df2607784fa586d3adcd3c07af6ae3e56fd2d51712371f3383a61ff0d7152749f0a18ad13dcb0a9569dd159c2179867011e0a7e70c4b4d520be682c6611e409e280549ba52bf7dd6343c66780b79711e45e3b30275972e361c16e0fbe262121bed18b230b2bef12e2c3ba178f72efa4dfb162d3bced10c85a839932c0385e7505b4d1688e1933307e0d8ce518404d57d776024c6ca197b5a291655f111038288970a064200fcace438eefd1fa2221d2bb37abf9c3dffd1b830e9a7c4ae9a17be9c042083d9532c935962fa99d593ab59ffa0239482420387058534a0a14ed56a99a544c9ab02d3c4e736dd25d6fb8005c22b050bb12d2299f5fdcefd85b846832b4c5c0bcf31b1897d1466f1d5c88b1b748c2910bed79f1ef4a7a6197b088e47970e1559037d4681a35fd60f2a7e2600431e00e79cf6b09068f6df879ba5757a46fe45c57d29d78e9b377bc243754f5c6ca6995b0e16a1981c08d878484bc5bb6c3f390f61ddd26f9fd36eefaeeb1fed4bb4f97eb29342c745a4f77a4bcf4df19b167319dbbb79e470334d5ffe4d37fc7e049c2d11eda70877ec30c460311deb9eabd041fdadccba8e1886923be2574db4f1ec00f27c437e8022c824f8c8f82976c04b9613ce292992a784111e441e3c103404b1a87efa2d367747b79b910df144cfbf762c8d987779863ba7dbccf03e3d7f08228b4819084020c129e733c43c75eabe8f71b0141159294400ed8d836afa25c8883761d7aea5fb6c69eb2dd5427164fade045c4ea17f0c084847aa40c3cf04229ea5db5fda019338428fb7cf3524caf5e8ba94430e508729c18d701a947ea4e5035456222655e0b75186aa771fd37155f8a171c9f3784387ee23983cf1a2025b3c969a75fd025f62d1e98ea692e3114b11b03b9bb6e0e480c53496270e02f2e6c07e0a9dff31b036961c3c6c88103612acb32cb73701922dee3e0a9f7e480c43015e6976fc41276d079d94a75bc9153a4d41e8af15877d992c5932e1562c16d9fbfffdd0ef502cab67ba55e1321c100529448c02db20e52dfa06a8b245528ee9dfe479dd9efd9ae727da76c4ebb23fbcc04e3eccf8eacdae608f20ce87faccdddb825398afd5e0c84f1f3180c5b835f409cb30ecf8bf0566d2f82bc04da61c05f27fcc9e2eb3120d9807f18e01725856fb62f823c4383e7112a7d7d992454c12ea82aa10baa609e70bd353227191f0f8b13429e832b31bea5e11f87bae7d8077ff9f7f4f160abc5f55ad941d5d570052d12106ab3c067241c18af863901298d3b128e0ca81db187653f1bd15d0e7ffec269f76fdd26a9e2c591655f7f1dfb340c7fb9eed38e7d1ea05befbaf1844bfa834a81c79d58d3f5766809d4ef410dcf939b31d44438c27bd2cb0485c121028bef7384481b94bee1cc0e0d1ae7c2f0acae733605788d6336246f9c193cb49d446df81c6d1b4e627849bb2726345a12dee358f661a1eb861b1df15e0c92c7a8baa9ee7d318591b71f9806e9f82909226c28f44ae13a65d41d932d84b97b93111d4614379e4b58ca3a6ceef4f129c26ccb209b1ec39fad676f1e13dbfe087e0ef08d30bec66cb3cc481e940d37c17c35b8ff8cf84669feb212c14f1a5fbfad445f5ffe7da2e36bda27c375a7019fd38879fd363c1ed1002339b31d96656d39f3fb4b84f86f97c7ae1f05aa27be3ec9dbea13bdcd039fc9db0a6d1fe814a28d54dcfab5c55e967d2d81600d3c6bbc2aabdb8d271edfb6af44e180f4c2ec6ce10f6cc36cb2fce62fa64b6dfa5ccb6333e494fcd06a49e9d46239a89f55ae40dd208a6e38b0357de073e6474d5e3638b0195017409d0bb593f410e805e090ca231f6a49d8ba0ce993e7ba21670ce9ddf7b977e533b345bb666e3a787f6e28f576ce819902bc7c3a66e08882ef90470e0990060e330738b8a94c22f4020805c02b0078c8e13a002f1be03900af1fc083d131a9d0b8caccc0d965aaf69a59dfcd1f3b4788ef1efce22d37e7955b304710e604229515ba3fb2eccb6803411d72046e2624093517fbaaaa90942c4b9e5ff8f87629011f7ddc690b2f973db3beb1cadbdc1e879f0db63e5f7664d8c619600bf15424163ca7da0520bfc2bc490944a9140772152271dc20491247afaf03bc2a958fa7ff8e70862f9754c9f696789de52699838b2495007cfd39b8747c4d7790737c4ba85d00ed8c84f0837292f1f1b04833a0e019727055cc2d5bbe42128c31998fce78f2cfb10be9dead5059dcbc24ae205954808abe1ace354ab904eb95182134a2a35b3ad451d4b020abb6166a47ec65d9c7048422ad5132c0a48af2e06cdbace3dcedad843860c94157fcc90d04f4eb3eed584dc9e9885eaa361c98d677a122f74ef4832e3c2cd78df45ef3c682d71740a01837aa9331e946a89c40844e00001c4c494441548f563511103ec0af431d2729c44a41d008e8cf63fa79b27960fd8610e7e5dd34e5afcfc8a9989f3a6ba01bc9cc23598dc66538e84daa01cf58cb23bdd5f7a6acaa5e1658077eaf36ca545fe4b80df032009e03f0f483df3b386cf87d1ec0d3dbc9a6e93644bcd75d573d73abdc80635e7bf4a0e72546f56323c5b4119173830d59c5084715e89089a383e474987433f2aeaa697d20a3a18e742d5968f793fa0d3d52129a50e79473faf513222ec2fb3ce8474b357e487e0c4e249e0a86cf9b1a9781e24ef89d9a67ae82290960300cb6810446774bc737c96cb8088fd2aa9b549e0c7e10befc8ef012dd0943f0bbf80322c805e2c79d46b88a36d9f1c880effd8c500c5ec5e96597af3c5c88f71f7dbaf8898142ec7ca1f48b5d23142052ad628e3e24202a6da6a8445b0710125ad7a8ba02491a8de5513cd710d302a81df133957da4c2f2b98539f0392a3fa46835fbe5f7aadc2b69eb2745be5fe2c66570916f38a6232711d08e871265ee726daf3cac26679110bd1fcfbebef72dea498c4477534dc4ea54a8e1e0c038120c34a4c875507d910405dd2042801fd8896bfa1d7b3e0484c855ad5dbae9ce4fdd9bdf52e7a7df606789b8c86cd93311a7da493e3256570d7891de8e0e8fa98a7c11ea0655d170701b0dcac1956c72442f729cc163eec64946bcffd86e45e9e7cfc943ffb29a7198b4323ed23f56b37b3f303b29cf0c40eebd90a286447f4d7927fc81a312a3dd39db8f8e397570f7cce110f7e2b079f4bb4367b17189c6f797543c6341c56b52c1f0e4a449469037a092dc337c93cdc165c697c38736c00b7267770c714b368f0351e3da08156dc2f1f0abcad4f75b0b7e3c7ae65942bcf5a2ddfb61596f5bfad3573bc0664b2a299028785257aaabf5e729fe23ee8efed83b794034f608199f9fadec2309048bcf688c072a06f649dadef44f2dfff985e4d8da2c3fe4d63c5b7e38445c997a968873df0511d0a6fb007201a6a380c0e79d24cdef2244bb778f18786e0f210e3feae84d4d25e7b86ae3b7abbebd50bd0f250fb1595538e05658c79328354a1e79f09cc5fa63196ae061425d549df206d4b25f7f98611f7987241ccd1e6bf9d23b6fc7f0bfc6bd09ce1a692982d98e386d8585973e3bd6ef38ce477d6e037d2ba1cf15073412daed54d8a4275930d54891d07b65c3b89690224f00bcf3005e4b801706780efc3a03e0091d3fa62210d00f0f3fa1e3c7eea7b0e17e8d0ce20033a09731bc4b5bacbf64865c4fe3a63e71fd9beb152c727384ab91dd24746ea9ac84fa23a8f17bf072418e8e6c2290d9a01eee5b201516f6240c354820d65a2901bfb7e02337434297bb8f1fed322e299bd2569d7a6aacbf5ba0bf27417fd702ac0ce8979a37baaa18dafe7156e3d142cc85b68297cbe0d9d02e61f06d9d538ee3c4117e18debe36beb77b8a6f9c4a2a0cbfcb80df69f01bc037231e5f092f17da1abc24f05d0bcf69f88acea442cdd84bf8561c54b1eb93ad35df3d23c4c42b9ffb6fbe3c0767df38615aa11c89bac2da372a4f56cfa031bcf272a8c1468b2a2bba39b55c7f9eaed406c983ae1960f11e941b1025e7b0f899cbbe22206b55c50f54aae1407603fd36ce5bf5df8a17e4869b7fc2ea56f32547fe4adaf893dc3cf799a02ac19bd73c115e9125aecaf1bc7e6cb76afa5c8bd37af796cd6f7b8fe8305872a8ad97dd33e75a79386cae7eb60e0e882824d32333b30df88d66fdb0597f4aa0ee9cb89f2120182e0169b1bb75852be90c3af39ec71e7958f6efb5d4290fb8aa3557b4ce8bc33b0b44e1525da71ae83668f2563224eff379bf08dffd0628723b002f1be029afae71e0d5956df09b174c0565ba002b0bf01d872a02a6d20a5069543d5df1c98f438578efdc27434f1f283793a89a500984826c19c8d1018120f747cc828c6ebb702f0ca9acd05f1e37e44dd0339bd5c81001d10ca1a429d77575a4fc964552223eb453f727af7209d349e2fa1603ddfe820d299bcd9bffceed0c18970218171c67d5f6bcceb40baa8c49128bc88b4d87ef8f7f2881b682674892484917b97b31c3d7536922c3e24b9298781d9bf035dc116ec2374e15aa8f8747a8d4fa32a8b812b8cd17c17309c763d103d35b3db750128ebf8fb8ebdd1be4e1ffef1dcb773daf3acc250db2c5c14da74450eed63f47c607555c787f0dd970212720b9e9a2a4910bf55a56ff6c655f4b203a6feb3b8051a5e346924746d7dcba4812920e83babe78b514c9acefad1db1886cd3c499379e5ab0a0534fbfa859e55172223b457a2de9fa8dfc608bf871999c98adbbd76f2d03ca4d8403f1c40e00a123c20747381188e9ac4649a3ab10170eb975ed09238438ee8133ad31f2fda1d294f3738a85d9f6309a38fc5ed08f30f4836f1085add948e7403b57c1838ba54c07465080176ef42230daf6f319156d784a1dfc4cf7eedb881ebcc457bc06300675ebaa1fdfb64d888faa47e53f9a2e259089eb5fd90ef7bbd4cc5775d58150a32482840475c84860f09e179438d046862a0030c247bf861a3839ea890d6dc650b846f5b2755b46b917f6742aea1d71df9b3eaae91167a7094f7a4932dbb037cef0b6305d58a534e33970419527b1e23c16a8e78c362907e021e140f8b6d6363318050de34bed5c6823fc0c866f4663f025781ec391db20bed90c5f6e7c2f315c5065769bd7e0572d2e9fb74eaefcef7a177ef0a29ce79967bd37eaabff516fc0839e6e38854040b46de07ae4711d14df012a2b6474284d3bbbb08e240e18005dd92f7efec0682afb9880709b001192d150838ac7dd78dbab373eeb0ef89107677eb6fb39b9e1ea9b7d73b69bf77e2d898ab15fc771140d6e3c1ed8967a54faca0cf99e0ed33a77bae023f99e493dffe3265dacaeaed8b25a1e183b976c5982ba47c28fa74219cdda923368726bf359a9c70a3170c4b067c352d239befaec7f3c2027b669a4e588a7fe251fbada6ad9f1558d3382b1600b3a0b16b05f62009c92f456f2e00d03787989c7854b0cb8710c0158283194ea91b7be48617ffc0a124001f0543f82af7885a29eafdf56d7ad5c4a8c859fbefdcc637f1262f5b8ef66fd78bd7a0275c1d540389063ab423f79241ce82f8f5e56e8fe88de2bb821d1f88812ea5ca81dbd26f76f201cb46e60bdbb12e8c6b12b2f5c7a8f94b05f3ea1c9204990ac2facb456178b78d5870db0800c41db81b6c7308d86e7543b0bbc14e7f99c0f54db8bc3d0e1d33e22950bc0c7f887c632180d1b9b050ff84c94665fc39718435cb70c3e6314397cbf338603fdd4e163c4bbe72596110fdfe42556dea6ecc3e27652d2387c7ac757e53a99d2fe8587dceb017ebc6bd93f7f04152a19b7c1890319962a8c244723394a1ca05245c281120a8783aaaa08dc881a05c9c3678b43e71f5bece362edeb17c06be03d3c4e03931ea681313b1db2e8ba92c785b7dc367f4c441efcebd3c79c716302a0e835918f1c056e3cb0b4302f1df937f6bdc854df5b4ba03ddd4a738d5091acda794bffe306dfd43ef68d94546a5b57d72e7545c86662612cf9e3fbd1735ddd64ea75e9d9ad1748c2715fb3b4e3a4089a529ef6f7134e907d3a36f4524f0bdea4b0092bfc8833d217348f1c1fa9ae26153d415564764b74183c1b5af9f09c7aef48c0a3a7cfcdd186e7f2015b354e4101592381e3ed0957a8261f399db81f23ad6206cf4e342e91136bcfd875bbe4ecc6bd3ffe09294b2dba67fa8c15e025558b374c822451b156d5e570e0574c55352728da8d9022ce888e81573ced35b27636d4d84324206ae42969273a6de0f5022ea332a0e2baa7064bd6a0d5d5ed36bf005e355a31a878e2ae12566d1ce791c0680cb362b7e1906dc3e78d67501999e68d477c0b7695b23f50af61f8843f5b7741f8227c5b87e7c13748508dc5d7a25974e06f0c5eeddc9aa1dbde938ced811b577dfd8410cba7cd9d3b5dceefe2dfcf18ba0a24803a8c2fc2b000583f64ec46a70dbc89146d17d3f43649c4681c47af2a804757d0a2b11c53eaa0713cce89c3ebd9fe28fb8980708e8d3878880b41ef28370bad5b9acc16e2a4d0f965279e28c4116d7a9e3b65977039aeacd08c04b0935dc818998d777af7b496a8e78c0bcd0678c87939f07bd5ce5407a0dcbe08af51073f7172f970f0636ea825a45977183c1be025de807c1cd086b4c41adfe0b8e081e1c1b313e29d0907fd126b493cbcb87ee804d10e509564423f96f8c625d6ae3bba7a52694f213e7fe2cd371fffa79438ae5f70c5fa6eea41221c58a3bba38af116e519d0863ba3c9f8788ffe3b525d419c10110ee6b54204841592aca107c418a1f7df59aa4e4f97df6d4fbdacc59d52527df0cf47bcbe5b12971f9b34397b5642b0e1186c0341250913d7df12603c928fc8ce0f800f8c888f21083ae8f708de1ee08bed86096192f856f7ad18b16eb41065af95e62d1c24c4da9edf977cf59510dfffcda95bbe5ccefdb0fa1f78ba7fbad707af65c0005538e0719dd1454e6cbda2ea94240cf41ac414242ce0b50e08d1af877060d95f04c486d7e5eb3512129f24d244d5cde4c171f6eb43bfbaf926210e98dcf6837b6b1b78879f6381cf6921ab8d96091c1bdb781e8e3e0edf8196612383e4b3c4d20e7e12817df0020e7edf01dcf00649000fbe050e3f0c07bf6ddc70221eef2424869e498d8b0f1e7bef4838107ad281107bbe7c6259ee7229ea7fb2e3b5839f1d21c4c693579f5a5aaa20d2d5c0b82181d3ab0209a37c34d4cde1f37bf4e790f3abe191bbe8b6cb7204910ed916890b7cce2511cc029d02eb192591a6d708d17e52e72eedfa0b714ad5a54fbd7fac7c664cea573dc618e0c7dec118172eb10e03c685136ce3fa0b98b7b0228b494b9241490d6d80e749503640cd07787663f0956d0bda084fdb17d173c4e31139af911935f76dbb45ae99ba9adc2d72c757e6eccafba1ab9428c4c6c3dc388c1f1e5d72ff324920567fb160e5065085f20be47c17ce2121e1f7f9b01a1916f2ea83f54636b74ff59a22cf791a76765f8def7e22241c36d48ed8cf657f11102c0ebc16365c0809c9c3aa46498436dc89aa6ede498801cfe755e69508d1ca6e97769f7b80f4b7ee4bf9d2fc2adf42ce018e2d7fcf2406d9b2e1398535a492900b3e1fe0393a3c347a82ca2ce8e0cf018961fcbe95188c9ce71e4a0cc62ca8744018086026a962b2dd0db161c1aac953ee1062eafd2f968cdd2237d55335a328391c120e4ce980c645201095a09aaa28811a545864f3c0da94b204bd590ae3474a78571507dc1f432a5a6c2363849208aceb26c818fd8f109dafeb73cae12b84e8bd38fb8a172f97cf1c9ebee1845d0dbcc42f61dab136635ccceb5967e37ceb399091311026801f7db07eb49b4266e7275b2f9e7f913ca85ffbe9ab457245576edcf5c3767990d71d53f38d6b634c7ba7c989ee78a4ce6b729b2b99a57d956e357954b64f4b3fc35561a7be9a36d3d540847e48f92e458e636453dd37eebc45fe5377b73bff7503aa8b5d9564ddbdb5396ebb6af0ee27dda499a57f5edf7fcb9f25c3f1fdea66db24618e4cab1b42778023c78e71122ca54784a5efaf67f7c3d0818e8403250396361d3f4755a9ef9e8ed3d8f3a7eb35bfbb9cd6a549e2b0a176c42f54f63701b1e1b5b8e48157456fac14d86828fa37295375b335aa766d23279f77f16dfde5001f36bffb09fffe56c23825b42866943415cfab44bd3570e3b1837fffa98a748981ebc23de3a281c3f71dfc98fd75b07a6fa0c460033cc3c1cf556806db4b902a11fa119952fbfd8e51422cc8f96ce9c85e427c73c9b4260b2f553fc4540cb54cc4279515c66fa0311209489eaa2b5bc2ef180748120712103c60d0680e88373a4b293c479208ae6bb489c4a9b2dc8237663695758b49ad171df0b41059b75df5dcc30fc9cf8e6bd9fad2850dbc0bc7196d5cc3603ddb64fb53d824cbb8980807ad8bc4b6c5e898e83dee3cfc74cbcaac09b709317bf3fbf77e2c39ef9a77ab5a2381a7ecd8a822c403d1a48a0992f84c05558dd0539a3f06bf9ea9244d0403e3c37c3754627f0c81a73c7715111aac9150601bc7e30b563fa8f7e397575599cafe2620581c783d974450878c9208184b9b422ea2780eeea892df3dd6ed2d218ee973ea8dcfb595bfc94e7bbc6bd706de693389616f5545392213e029c2316c2f554539f0fbf12431c0d3c9a98a3cce9071f8811243e283df67bc25788d3c90b00001ab4cdb55b2f26521a6f71b33f8b94142ac5b5b7cdf46b8cf05ef6f41af28ae2bae42c90309c7eff436facfe3e7fc821d9fc4f173e992e179eab1a32a7e23661a787fa5dfa66a97d38ed510b0e8aeeb339ddc19d77516a2f5651deebcc3f502cb12592989bc253361fdf9254cd3fad3b08c9b371b7e8d8c87056d058fade7dae6d54fbbf335ebbcf7224f0e940464d0ca8f36429c0c2718940980dfe5cd6e7e345d1d1dc859db7ad3a77a849a130eba629a110aba480c250f7ed531339a930481eeb568f4fe34f1f344a8b8c4838ccc170ccf30eb8f2d7e65e5972220581c55190989ba5849a44352bb74b8e33c9ddd7ddef42b210e38ba6daa1b887852eb0beaaeee2844abefdb3d79ed9112f6ef43a52d2ff0bfda7830db49aaa08ae1fb9e012a013341417836c0432fac868dfb6663a52e998c037883c17b2a799db80df06036e0bde3008fc181de2fb1bca9e5cfee9cb0e43f42ac7867ee9913270a316fc347b316b869f41df1003f68c8fb84491ca4b262de2adc8b8a9e0337dedaa374f868f44482810705cec0cfe62f0ff07c84049c455220a0311572b5e19dfd2499004171d773ac2dd779ef36d9d13edb85e8d4bff7c45b8f93cfa6349b7dd25d09df1d56ef6ea4d7958111e0eb7973b8e483896592d9bfe98d4563c7aa5fd2018ac6622018949b099358a24a0725402e8920216964c474b430f1f3bed433d846c28504050809d9c0b8ea88db401ed09fe384019faf636d7e11192794bcdfbe6cb98ef895965f9a808455e5db70701422e7950a3611748f4c3f1b6a20204d58ed66b76d1fca38b6dd22218ebd7ac0ca6b5e17a2e5e96dbebea052c2fe38e5cd56d76b38d80a074b3f3083365e26f3ea1a0c9ca07923db002ff1c18f5e35681c35d9364c07bf4f05e56b3b0c9e0df0d4f7a05a6bc0ed1302fe40e2428ef4b19a9ea512e3ad9ffc9839e32c218a2f9b79fd74f98bb5cdbfbf7f03dce4176157c6e2c153fba3aa310090a7a9f6a5b166c9e3f84155cb6e1c347a55617b5fa9046c55914a0bf6194a22b4aed1c88e5e88404888419aadd74de5e77dcf1ff8e619723c0f4b3d6ade2d9240a786d29b76a98e7bb78971e15e7f06e378dc7a89fdbeaa7877c6f24385f8f0af2fbcf7d0003987436b3f22f767640018c1e7354a8475ccbb881376ce69277dd5aac37e8f6d4e4870fe1921a9e777e1f7d7db51d6f6d559ec775c1565221836c3b7b1aad35fbcfcd204048bad2ada700ed4209c23c7461b0f75caff50751ab8ffa69fa36abef15cf7e096d7b4296bdd5d88eeb3fbbdd2e72a213a0ce8f2e4f9e7cb4df942cb97dcaca9a11742e9cd9b37a8ca11f1d8c5490ce3e1533cf88be27e9dc87dd70178d90c5e36c073e0536d63d3c1efb36518085631b47b1a545c49aaa0eaff50bfcee520abca77b75c2125c1d259eb87cf6d21c4bacb8bc38bda09b1b2fe9bc37f7073419d1c9d100952013077c71a20e4d518498e5e2aa60389130ae6868b1ca2cf5f9e7174fb4d97eca88aac6d7f56750ae43e42552d7921028344eb1925136cc7ad6bab87f559b3c992efb8b17fc7e3e43ee8d0a1736d7fd9df961fb69978861ce7d4caf45d47ac4e5e051ab7de62a742746474b4eb7cf0e584ff5e7aeb07426cbc7ed588cd2079d432af218a6b401b15c63540bb0a02e55045c9bd8be88a602d8d6123ca70f63bd6364a24cc1642073c12166e8b40c26070f32655145799fdaf2118bcfc5a08081647557cc385e046ae14f0d622ef16e4e0b0c68d0684c5c7d1dd0e6dc829e3ba0ba7b6489bdd649610873f7ff42387ad10a26ddee157674889a5e9a52d7b1efcbc7cd79d69fd9a3f21eb05a9bd5db76271ae382d66244d17b70b298358d789d6966ba65e635d163357cfc4ce58eabf6fa31fbbbc9e351d7d73a01c27ee73793df97b554055261ea68d1d3b4e306f98f8a3a545c14868f00d40c88354227f1400d1528a93e9640c8d7d6e5d690d72554c91eeb52fbbc6ceba3135356e246cedef6aeeadb85b888a93767e503641884da135976ce821c44fafaf1ce0065445cba2371087851bcaa0cb454242e9f499b7091110943ce0ae7a327aa34a04dba7eb9f73a324e215015b0aa620f1795519541efbbc38aab2c01d3934186a201cb89e7d9209aab8205e240dd63512942693a18608658ca3727f77c83fbb7ed05eaecf76e7747a24a3408803fe79d0968e574bd80fa51f71e005f25d57a655bb0c53a87d685e6c9fac1617c5d6e36a71ad0b6377687b97b5f2bfafaa26f4f902c697e21ed046850404558ba86a646ed3e8d6ca0908a98ad841baa72a459f0462806bb2b9f822ba79cd0810ad2b0e2fcaf037e0f3db2fbf360282c55115b78dc091e88b64a774ed2099e0c6a30d88f524f81c2384e1ea5b4af3ce3842dcd0a87a203ca08d040efc9de880301d509e1403c54efcdc2f566cbda9df151827f2b31bfac81889124090dba3e1c6359e769d7bbb90b19271aef5f83ecc5d05d996f906ffc5c61bf0b0b6400d0c11caa674632632486c5d23e1f0a970e1c2b42613a1fd28fb1d3cc709145d5b10d26be6f6e071dc502301a13bb7d1c681b6282424a8620406006d56e4ccc024443a786df6fea8d8b3e2c0efb3d8e700df47580ceeb151ae5ae370b9e483bfe34e00765258ff064bea2f8d80a184551505fffb7a68a36da41e099f03356c083ad06003920a05366064a0aae9c22048934c04086be00029d0110906236016a45ba65c48904c11d2047a0707271c581219437fc1421bc881f69dd0fe5055f519f0f965d0462323777fc47187f18d407a6a1e7055cbef35b8873d87aa29ee1f8fb60d788e0e80c5806f0eb47f2dde2b8eaae8a081839a0e1a94111f60cfc37a8b02475f0f1c7e3decdb08ac331cdfda93549d066d92d4611e8880601be0e3bab6eed4d18ef685f7fd0dde8304e478a8e1fd35f03e5235a2c4c19c1de8aa55945819e72eee177b548c84e633f61caeef0758db81f619faf74420f0f3fefae7bef7ffeadc6cf775f9b54a2058d41546640be1b612baa0894b26c8713149220db262a68277174a22292c9091736c248120e140a328e0451120889f8960fc468a89e38a425aea7abcc9112513ee478fa91e78ae206ca36482de52dfb1e7b0662a325299e1c6e64671201ce2661dff5f5d715485f122dc7984d617974cd8ba4e05556c1aac677e711aad6b6088683da35718638cf8b50bf52c4e069d2188016092087762e0dffb22aa11be2db4b2c792475071003e974cd8f77cddfcff235134b6fcda090896b0aa9879db8b0076544d073c2728b86160a3a5409a6fdc70c499618dfefbb0517d2a2cdc70600c251516120e5b47ffd74a507c1b83d5dcaf9e0e6c6efb084a01c1b2dce24152f72c7c0e048908467ff67ee61f6f348a23e108881cffd594b0aa685ddbd0b6f49ae2499071428282eb783bb471fd1a6c2bb4aeb9ea0a094936c30f19049c4f1637c1bdaa7ca93d3070ee741d8e31cea1b1c56175234bd0faffbf12547e2b04841747559c83f3d94c70232201818d4784856d241fc1e01b0d37f4437a5b200119ccf0b493e9ccafa038ac86c28dcef5ff85cf17e9df932d020ffe00b7c7084b3181924994fbc9f33aace3f98bdb367eae1256156790b05f5c32a15429b85e0d0c135fbf21b6fe79c4bcc5ce036e1ce671124448b8a4c9920e22e1f125a774f4cff7f8e076f6f2f7ff57f6b0fc56090816aee2823679baf7841a0f7eb8e8c5ba03da904f9f36144814a1f17a9b366e2fd606b74a52619da2a3479fffca4b14dc33c558f6c538fdfb285c901385c0309f3be42068ff57afebc71a3e8700d1e8013a1cb26160bb98e1395cfffc7f5de10c098c0724bbf1d61facf310ae532619a3b797f51eb4c71bbe5f92f8bd34efc83030b757f2765bc83e8775500fb632b84d9f728b91ca2a47fc5ff94d97ff170000fffff898dda83e6a16740000000049454e44ae426082', 'image/png'); -UPDATE PRODUCT set PICTUREID=10; diff --git a/samples/core/src/test/resources/db/tablemanagement/V0004__R001_Add_batch_tables.sql b/samples/core/src/test/resources/db/tablemanagement/V0004__R001_Add_batch_tables.sql deleted file mode 100644 index 980d37d43..000000000 --- a/samples/core/src/test/resources/db/tablemanagement/V0004__R001_Add_batch_tables.sql +++ /dev/null @@ -1,81 +0,0 @@ --- Autogenerated: do not edit this file - -CREATE TABLE BATCH_JOB_INSTANCE ( - JOB_INSTANCE_ID BIGINT IDENTITY NOT NULL PRIMARY KEY , - VERSION BIGINT , - JOB_NAME VARCHAR(100) NOT NULL, - JOB_KEY VARCHAR(32) NOT NULL, - constraint JOB_INST_UN unique (JOB_NAME, JOB_KEY) -) ; - -CREATE TABLE BATCH_JOB_EXECUTION ( - JOB_EXECUTION_ID BIGINT IDENTITY NOT NULL PRIMARY KEY , - VERSION BIGINT , - JOB_INSTANCE_ID BIGINT NOT NULL, - CREATE_TIME TIMESTAMP NOT NULL, - START_TIME TIMESTAMP DEFAULT NULL , - END_TIME TIMESTAMP DEFAULT NULL , - STATUS VARCHAR(10) , - EXIT_CODE VARCHAR(2500) , - EXIT_MESSAGE VARCHAR(2500) , - LAST_UPDATED TIMESTAMP, - JOB_CONFIGURATION_LOCATION VARCHAR(2500) NULL, - constraint JOB_INST_EXEC_FK foreign key (JOB_INSTANCE_ID) - references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID) -) ; - -CREATE TABLE BATCH_JOB_EXECUTION_PARAMS ( - JOB_EXECUTION_ID BIGINT NOT NULL , - TYPE_CD VARCHAR(6) NOT NULL , - KEY_NAME VARCHAR(100) NOT NULL , - STRING_VAL VARCHAR(250) , - DATE_VAL TIMESTAMP DEFAULT NULL , - LONG_VAL BIGINT , - DOUBLE_VAL DOUBLE PRECISION , - IDENTIFYING CHAR(1) NOT NULL , - constraint JOB_EXEC_PARAMS_FK foreign key (JOB_EXECUTION_ID) - references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) -) ; - -CREATE TABLE BATCH_STEP_EXECUTION ( - STEP_EXECUTION_ID BIGINT IDENTITY NOT NULL PRIMARY KEY , - VERSION BIGINT NOT NULL, - STEP_NAME VARCHAR(100) NOT NULL, - JOB_EXECUTION_ID BIGINT NOT NULL, - START_TIME TIMESTAMP NOT NULL , - END_TIME TIMESTAMP DEFAULT NULL , - STATUS VARCHAR(10) , - COMMIT_COUNT BIGINT , - READ_COUNT BIGINT , - FILTER_COUNT BIGINT , - WRITE_COUNT BIGINT , - READ_SKIP_COUNT BIGINT , - WRITE_SKIP_COUNT BIGINT , - PROCESS_SKIP_COUNT BIGINT , - ROLLBACK_COUNT BIGINT , - EXIT_CODE VARCHAR(2500) , - EXIT_MESSAGE VARCHAR(2500) , - LAST_UPDATED TIMESTAMP, - constraint JOB_EXEC_STEP_FK foreign key (JOB_EXECUTION_ID) - references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) -) ; - -CREATE TABLE BATCH_STEP_EXECUTION_CONTEXT ( - STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, - SHORT_CONTEXT VARCHAR(2500) NOT NULL, - SERIALIZED_CONTEXT LONGVARCHAR , - constraint STEP_EXEC_CTX_FK foreign key (STEP_EXECUTION_ID) - references BATCH_STEP_EXECUTION(STEP_EXECUTION_ID) -) ; - -CREATE TABLE BATCH_JOB_EXECUTION_CONTEXT ( - JOB_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, - SHORT_CONTEXT VARCHAR(2500) NOT NULL, - SERIALIZED_CONTEXT LONGVARCHAR , - constraint JOB_EXEC_CTX_FK foreign key (JOB_EXECUTION_ID) - references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) -) ; - -CREATE SEQUENCE BATCH_STEP_EXECUTION_SEQ; -CREATE SEQUENCE BATCH_JOB_EXECUTION_SEQ; -CREATE SEQUENCE BATCH_JOB_SEQ; diff --git a/samples/core/src/test/resources/db/tablemanagement/V0004__R001_Add_batch_tables_MSSQL.sql.mssql b/samples/core/src/test/resources/db/tablemanagement/V0004__R001_Add_batch_tables_MSSQL.sql.mssql deleted file mode 100644 index d0b891572..000000000 --- a/samples/core/src/test/resources/db/tablemanagement/V0004__R001_Add_batch_tables_MSSQL.sql.mssql +++ /dev/null @@ -1,78 +0,0 @@ ---Rename this file to V0004__R001_Add_batch_tables_MSSQL.sql.mssql if the database used is not MS SQL Server 2008 --- Autogenerated: do not edit this file - -CREATE TABLE BATCH_JOB_INSTANCE ( - JOB_INSTANCE_ID BIGINT NOT NULL PRIMARY KEY , - VERSION BIGINT , - JOB_NAME VARCHAR(100) NOT NULL, - JOB_KEY VARCHAR(32) NOT NULL, - constraint JOB_INST_UN unique (JOB_NAME, JOB_KEY) -) ; - -CREATE TABLE BATCH_JOB_EXECUTION ( - JOB_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY , - VERSION BIGINT , - JOB_INSTANCE_ID BIGINT NOT NULL, - CREATE_TIME DATETIME NOT NULL, - START_TIME DATETIME DEFAULT NULL , - END_TIME DATETIME DEFAULT NULL , - STATUS VARCHAR(10) , - EXIT_CODE VARCHAR(2500) , - EXIT_MESSAGE VARCHAR(2500) , - LAST_UPDATED DATETIME, - JOB_CONFIGURATION_LOCATION VARCHAR(2500) NULL, - constraint JOB_INST_EXEC_FK foreign key (JOB_INSTANCE_ID) - references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID) -) ; - -CREATE TABLE BATCH_JOB_EXECUTION_PARAMS ( - JOB_EXECUTION_ID BIGINT NOT NULL , - TYPE_CD VARCHAR(6) NOT NULL , - KEY_NAME VARCHAR(100) NOT NULL , - STRING_VAL VARCHAR(250) , - DATE_VAL DATETIME DEFAULT NULL , - LONG_VAL BIGINT , - DOUBLE_VAL DOUBLE PRECISION , - IDENTIFYING CHAR(1) NOT NULL , - constraint JOB_EXEC_PARAMS_FK foreign key (JOB_EXECUTION_ID) - references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) -) ; - -CREATE TABLE BATCH_STEP_EXECUTION ( - STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY , - VERSION BIGINT NOT NULL, - STEP_NAME VARCHAR(100) NOT NULL, - JOB_EXECUTION_ID BIGINT NOT NULL, - START_TIME DATETIME NOT NULL , - END_TIME DATETIME DEFAULT NULL , - STATUS VARCHAR(10) , - COMMIT_COUNT BIGINT , - READ_COUNT BIGINT , - FILTER_COUNT BIGINT , - WRITE_COUNT BIGINT , - READ_SKIP_COUNT BIGINT , - WRITE_SKIP_COUNT BIGINT , - PROCESS_SKIP_COUNT BIGINT , - ROLLBACK_COUNT BIGINT , - EXIT_CODE VARCHAR(2500) , - EXIT_MESSAGE VARCHAR(2500) , - LAST_UPDATED DATETIME, - constraint JOB_EXEC_STEP_FK foreign key (JOB_EXECUTION_ID) - references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) -) ; - -CREATE TABLE BATCH_STEP_EXECUTION_CONTEXT ( - STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, - SHORT_CONTEXT VARCHAR(2500) NOT NULL, - SERIALIZED_CONTEXT NVARCHAR , - constraint STEP_EXEC_CTX_FK foreign key (STEP_EXECUTION_ID) - references BATCH_STEP_EXECUTION(STEP_EXECUTION_ID) -) ; - -CREATE TABLE BATCH_JOB_EXECUTION_CONTEXT ( - JOB_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, - SHORT_CONTEXT VARCHAR(2500) NOT NULL, - SERIALIZED_CONTEXT NVARCHAR , - constraint JOB_EXEC_CTX_FK foreign key (JOB_EXECUTION_ID) - references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) -) ; \ No newline at end of file diff --git a/samples/core/src/test/resources/db/tablemanagement/V0004__R001_Add_batch_tables_MYSQL.sql.mysql b/samples/core/src/test/resources/db/tablemanagement/V0004__R001_Add_batch_tables_MYSQL.sql.mysql deleted file mode 100644 index b32e03c2c..000000000 --- a/samples/core/src/test/resources/db/tablemanagement/V0004__R001_Add_batch_tables_MYSQL.sql.mysql +++ /dev/null @@ -1,103 +0,0 @@ --- Rename this file to V0004__R001_Add_batch_tables_MYSQL.sql.mysql if the database used is not MariaDB 10.0.27 - --- Autogenerated: do not edit this file - -CREATE TABLE BATCH_JOB_INSTANCE ( - JOB_INSTANCE_ID BIGINT NOT NULL PRIMARY KEY , - VERSION BIGINT , - JOB_NAME VARCHAR(100) NOT NULL, - JOB_KEY VARCHAR(32) NOT NULL, - constraint JOB_INST_UN unique (JOB_NAME, JOB_KEY) -) ENGINE=InnoDB; - -CREATE TABLE BATCH_JOB_EXECUTION ( - JOB_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY , - VERSION BIGINT , - JOB_INSTANCE_ID BIGINT NOT NULL, - CREATE_TIME DATETIME NOT NULL, - START_TIME DATETIME DEFAULT NULL , - END_TIME DATETIME DEFAULT NULL , - STATUS VARCHAR(10) , - EXIT_CODE VARCHAR(2500) , - EXIT_MESSAGE VARCHAR(2500) , - LAST_UPDATED DATETIME, - JOB_CONFIGURATION_LOCATION VARCHAR(2500) NULL, - constraint JOB_INST_EXEC_FK foreign key (JOB_INSTANCE_ID) - references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID) -) ENGINE=InnoDB; - -CREATE TABLE BATCH_JOB_EXECUTION_PARAMS ( - JOB_EXECUTION_ID BIGINT NOT NULL , - TYPE_CD VARCHAR(6) NOT NULL , - KEY_NAME VARCHAR(100) NOT NULL , - STRING_VAL VARCHAR(250) , - DATE_VAL DATETIME DEFAULT NULL , - LONG_VAL BIGINT , - DOUBLE_VAL DOUBLE PRECISION , - IDENTIFYING CHAR(1) NOT NULL , - constraint JOB_EXEC_PARAMS_FK foreign key (JOB_EXECUTION_ID) - references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) -) ENGINE=InnoDB; - -CREATE TABLE BATCH_STEP_EXECUTION ( - STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY , - VERSION BIGINT NOT NULL, - STEP_NAME VARCHAR(100) NOT NULL, - JOB_EXECUTION_ID BIGINT NOT NULL, - START_TIME DATETIME NOT NULL , - END_TIME DATETIME DEFAULT NULL , - STATUS VARCHAR(10) , - COMMIT_COUNT BIGINT , - READ_COUNT BIGINT , - FILTER_COUNT BIGINT , - WRITE_COUNT BIGINT , - READ_SKIP_COUNT BIGINT , - WRITE_SKIP_COUNT BIGINT , - PROCESS_SKIP_COUNT BIGINT , - ROLLBACK_COUNT BIGINT , - EXIT_CODE VARCHAR(2500) , - EXIT_MESSAGE VARCHAR(2500) , - LAST_UPDATED DATETIME, - constraint JOB_EXEC_STEP_FK foreign key (JOB_EXECUTION_ID) - references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) -) ENGINE=InnoDB; - -CREATE TABLE BATCH_STEP_EXECUTION_CONTEXT ( - STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, - SHORT_CONTEXT VARCHAR(2500) NOT NULL, - SERIALIZED_CONTEXT TEXT , - constraint STEP_EXEC_CTX_FK foreign key (STEP_EXECUTION_ID) - references BATCH_STEP_EXECUTION(STEP_EXECUTION_ID) -) ENGINE=InnoDB; - -CREATE TABLE BATCH_JOB_EXECUTION_CONTEXT ( - JOB_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, - SHORT_CONTEXT VARCHAR(2500) NOT NULL, - SERIALIZED_CONTEXT TEXT , - constraint JOB_EXEC_CTX_FK foreign key (JOB_EXECUTION_ID) - references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) -) ENGINE=InnoDB; - -CREATE TABLE BATCH_STEP_EXECUTION_SEQ ( - ID BIGINT NOT NULL, - UNIQUE_KEY CHAR(1) NOT NULL, - constraint UNIQUE_KEY_UN unique (UNIQUE_KEY) -) ENGINE=InnoDB; - -INSERT INTO BATCH_STEP_EXECUTION_SEQ (ID, UNIQUE_KEY) select * from (select 0 as ID, '0' as UNIQUE_KEY) as tmp where not exists(select * from BATCH_STEP_EXECUTION_SEQ); - -CREATE TABLE BATCH_JOB_EXECUTION_SEQ ( - ID BIGINT NOT NULL, - UNIQUE_KEY CHAR(1) NOT NULL, - constraint UNIQUE_KEY_UN unique (UNIQUE_KEY) -) ENGINE=InnoDB; - -INSERT INTO BATCH_JOB_EXECUTION_SEQ (ID, UNIQUE_KEY) select * from (select 0 as ID, '0' as UNIQUE_KEY) as tmp where not exists(select * from BATCH_JOB_EXECUTION_SEQ); - -CREATE TABLE BATCH_JOB_SEQ ( - ID BIGINT NOT NULL, - UNIQUE_KEY CHAR(1) NOT NULL, - constraint UNIQUE_KEY_UN unique (UNIQUE_KEY) -) ENGINE=InnoDB; - -INSERT INTO BATCH_JOB_SEQ (ID, UNIQUE_KEY) select * from (select 0 as ID, '0' as UNIQUE_KEY) as tmp where not exists(select * from BATCH_JOB_SEQ); \ No newline at end of file diff --git a/samples/core/src/test/resources/db/tablemanagement/V0004__R001_Add_batch_tables_ORCL.sql.orcl b/samples/core/src/test/resources/db/tablemanagement/V0004__R001_Add_batch_tables_ORCL.sql.orcl deleted file mode 100644 index f7d10023b..000000000 --- a/samples/core/src/test/resources/db/tablemanagement/V0004__R001_Add_batch_tables_ORCL.sql.orcl +++ /dev/null @@ -1,80 +0,0 @@ ---Rename this file to V0004__R001_Add_batch_tables_ORCL.sql.orcl if the database used is not Oracle 11g -CREATE TABLE BATCH_JOB_INSTANCE ( - JOB_INSTANCE_ID NUMBER(19,0) NOT NULL PRIMARY KEY , - VERSION NUMBER(19,0) , - JOB_NAME VARCHAR2(100) NOT NULL, - JOB_KEY VARCHAR2(32) NOT NULL, - constraint JOB_INST_UN unique (JOB_NAME, JOB_KEY) -) ; - -CREATE TABLE BATCH_JOB_EXECUTION ( - JOB_EXECUTION_ID NUMBER(19,0) NOT NULL PRIMARY KEY , - VERSION NUMBER(19,0) , - JOB_INSTANCE_ID NUMBER(19,0) NOT NULL, - CREATE_TIME TIMESTAMP NOT NULL, - START_TIME TIMESTAMP DEFAULT NULL , - END_TIME TIMESTAMP DEFAULT NULL , - STATUS VARCHAR2(10) , - EXIT_CODE VARCHAR2(2500) , - EXIT_MESSAGE VARCHAR2(2500) , - LAST_UPDATED TIMESTAMP, - JOB_CONFIGURATION_LOCATION VARCHAR(2500) NULL, - constraint JOB_INST_EXEC_FK foreign key (JOB_INSTANCE_ID) - references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID) -) ; - -CREATE TABLE BATCH_JOB_EXECUTION_PARAMS ( - JOB_EXECUTION_ID NUMBER(19,0) NOT NULL , - TYPE_CD VARCHAR2(6) NOT NULL , - KEY_NAME VARCHAR2(100) NOT NULL , - STRING_VAL VARCHAR2(250) , - DATE_VAL TIMESTAMP DEFAULT NULL , - LONG_VAL NUMBER(19,0) , - DOUBLE_VAL NUMBER , - IDENTIFYING CHAR(1) NOT NULL , - constraint JOB_EXEC_PARAMS_FK foreign key (JOB_EXECUTION_ID) - references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) -) ; - -CREATE TABLE BATCH_STEP_EXECUTION ( - STEP_EXECUTION_ID NUMBER(19,0) NOT NULL PRIMARY KEY , - VERSION NUMBER(19,0) NOT NULL, - STEP_NAME VARCHAR2(100) NOT NULL, - JOB_EXECUTION_ID NUMBER(19,0) NOT NULL, - START_TIME TIMESTAMP NOT NULL , - END_TIME TIMESTAMP DEFAULT NULL , - STATUS VARCHAR2(10) , - COMMIT_COUNT NUMBER(19,0) , - READ_COUNT NUMBER(19,0) , - FILTER_COUNT NUMBER(19,0) , - WRITE_COUNT NUMBER(19,0) , - READ_SKIP_COUNT NUMBER(19,0) , - WRITE_SKIP_COUNT NUMBER(19,0) , - PROCESS_SKIP_COUNT NUMBER(19,0) , - ROLLBACK_COUNT NUMBER(19,0) , - EXIT_CODE VARCHAR2(2500) , - EXIT_MESSAGE VARCHAR2(2500) , - LAST_UPDATED TIMESTAMP, - constraint JOB_EXEC_STEP_FK foreign key (JOB_EXECUTION_ID) - references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) -) ; - -CREATE TABLE BATCH_STEP_EXECUTION_CONTEXT ( - STEP_EXECUTION_ID NUMBER(19,0) NOT NULL PRIMARY KEY, - SHORT_CONTEXT VARCHAR2(2500) NOT NULL, - SERIALIZED_CONTEXT CLOB , - constraint STEP_EXEC_CTX_FK foreign key (STEP_EXECUTION_ID) - references BATCH_STEP_EXECUTION(STEP_EXECUTION_ID) -) ; - -CREATE TABLE BATCH_JOB_EXECUTION_CONTEXT ( - JOB_EXECUTION_ID NUMBER(19,0) NOT NULL PRIMARY KEY, - SHORT_CONTEXT VARCHAR2(2500) NOT NULL, - SERIALIZED_CONTEXT CLOB , - constraint JOB_EXEC_CTX_FK foreign key (JOB_EXECUTION_ID) - references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) -) ; - -CREATE SEQUENCE BATCH_STEP_EXECUTION_SEQ START WITH 0 MINVALUE 0 MAXVALUE 9223372036854775807 NOCYCLE; -CREATE SEQUENCE BATCH_JOB_EXECUTION_SEQ START WITH 0 MINVALUE 0 MAXVALUE 9223372036854775807 NOCYCLE; -CREATE SEQUENCE BATCH_JOB_SEQ START WITH 0 MINVALUE 0 MAXVALUE 9223372036854775807 NOCYCLE; \ No newline at end of file diff --git a/samples/core/src/test/resources/db/tablemanagement/V0004__R001_Add_batch_tables_pg.sql.pg b/samples/core/src/test/resources/db/tablemanagement/V0004__R001_Add_batch_tables_pg.sql.pg deleted file mode 100644 index b83928e04..000000000 --- a/samples/core/src/test/resources/db/tablemanagement/V0004__R001_Add_batch_tables_pg.sql.pg +++ /dev/null @@ -1,82 +0,0 @@ --- Autogenerated: do not edit this file - -CREATE TABLE BATCH_JOB_INSTANCE ( - JOB_INSTANCE_ID BIGINT NOT NULL PRIMARY KEY , - VERSION BIGINT , - JOB_NAME VARCHAR(100) NOT NULL, - JOB_KEY VARCHAR(32) NOT NULL, - constraint JOB_INST_UN unique (JOB_NAME, JOB_KEY) -) ; - -CREATE TABLE BATCH_JOB_EXECUTION ( - JOB_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY , - VERSION BIGINT , - JOB_INSTANCE_ID BIGINT NOT NULL, - CREATE_TIME TIMESTAMP NOT NULL, - START_TIME TIMESTAMP DEFAULT NULL , - END_TIME TIMESTAMP DEFAULT NULL , - STATUS VARCHAR(10) , - EXIT_CODE VARCHAR(2500) , - EXIT_MESSAGE VARCHAR(2500) , - LAST_UPDATED TIMESTAMP, - JOB_CONFIGURATION_LOCATION VARCHAR(2500) NULL, - constraint JOB_INST_EXEC_FK foreign key (JOB_INSTANCE_ID) - references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID) -) ; - -CREATE TABLE BATCH_JOB_EXECUTION_PARAMS ( - JOB_EXECUTION_ID BIGINT NOT NULL , - TYPE_CD VARCHAR(6) NOT NULL , - KEY_NAME VARCHAR(100) NOT NULL , - STRING_VAL VARCHAR(250) , - DATE_VAL TIMESTAMP DEFAULT NULL , - LONG_VAL BIGINT , - DOUBLE_VAL DOUBLE PRECISION , - IDENTIFYING CHAR(1) NOT NULL , - constraint JOB_EXEC_PARAMS_FK foreign key (JOB_EXECUTION_ID) - references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) -) ; - -CREATE TABLE BATCH_STEP_EXECUTION ( - STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY , - VERSION BIGINT NOT NULL, - STEP_NAME VARCHAR(100) NOT NULL, - JOB_EXECUTION_ID BIGINT NOT NULL, - START_TIME TIMESTAMP NOT NULL , - END_TIME TIMESTAMP DEFAULT NULL , - STATUS VARCHAR(10) , - COMMIT_COUNT BIGINT , - READ_COUNT BIGINT , - FILTER_COUNT BIGINT , - WRITE_COUNT BIGINT , - READ_SKIP_COUNT BIGINT , - WRITE_SKIP_COUNT BIGINT , - PROCESS_SKIP_COUNT BIGINT , - ROLLBACK_COUNT BIGINT , - EXIT_CODE VARCHAR(2500) , - EXIT_MESSAGE VARCHAR(2500) , - LAST_UPDATED TIMESTAMP, - constraint JOB_EXEC_STEP_FK foreign key (JOB_EXECUTION_ID) - references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) -) ; - -CREATE TABLE BATCH_STEP_EXECUTION_CONTEXT ( - STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, - SHORT_CONTEXT VARCHAR(2500) NOT NULL, - --data type of the following field 'SERIALIZED_CONTEXT' is mentioned as TEXT as of now . Have to double check on this - SERIALIZED_CONTEXT TEXT , - constraint STEP_EXEC_CTX_FK foreign key (STEP_EXECUTION_ID) - references BATCH_STEP_EXECUTION(STEP_EXECUTION_ID) -) ; - -CREATE TABLE BATCH_JOB_EXECUTION_CONTEXT ( - JOB_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, - SHORT_CONTEXT VARCHAR(2500) NOT NULL, - SERIALIZED_CONTEXT TEXT , - constraint JOB_EXEC_CTX_FK foreign key (JOB_EXECUTION_ID) - references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) -) ; - -CREATE SEQUENCE BATCH_STEP_EXECUTION_SEQ; -CREATE SEQUENCE BATCH_JOB_EXECUTION_SEQ; -CREATE SEQUENCE BATCH_JOB_SEQ; diff --git a/samples/core/src/test/setup/disablemariadb.bat b/samples/core/src/test/setup/disablemariadb.bat deleted file mode 100644 index a702a987c..000000000 --- a/samples/core/src/test/setup/disablemariadb.bat +++ /dev/null @@ -1,23 +0,0 @@ -move ..\..\main\resources\db\migration\mysql\V0001__R001_Create_schema_MYSQL.sql ..\..\main\resources\db\migration\mysql\V0001__R001_Create_schema_MYSQL.sql.mysql -move ..\..\main\resources\db\migration\h2\V0001__R001_Create_schema.sql.h2 ..\..\main\resources\db\migration\h2\V0001__R001_Create_schema.sql -move ..\..\main\resources\db\migration\mysql\V0002__R001_Master_data_MYSQL.sql ..\..\main\resources\db\migration\mysql\V0002__R001_Master_data_MYSQL.sql.mysql -move ..\..\main\resources\db\migration\V0002__R001_Master_data.sql.h2 ..\..\main\resources\db\migration\V0002__R001_Master_data.sql -move ..\..\main\resources\db\migration\mysql\V0003__R001_Add_blob_table_and_data_MYSQL.sql ..\..\main\resources\db\migration\mysql\V0003__R001_Add_blob_table_and_data_MYSQL.sql.mysql -move ..\..\main\resources\db\migration\V0003__R001_Add_blob_table_and_data.sql.h2 ..\..\main\resources\db\migration\V0003__R001_Add_blob_table_and_data.sql -move ..\..\main\resources\db\migration\mysql\V0004__R001_Add_batch_tables_MYSQL.sql ..\..\main\resources\db\migration\mysql\V0004__R001_Add_batch_tables_MYSQL.sql.mysql -move ..\..\main\resources\db\migration\V0004__R001_Add_batch_tables.sql.h2 ..\..\main\resources\db\migration\V0004__R001_Add_batch_tables.sql -move ..\..\test\resources\AllTests\setup\db\V9001_1__Delete_data.sql.h2 ..\..\test\resources\AllTests\setup\db\V9001_1__Delete_data.sql -move ..\..\test\resources\AllTests\setup\db\V9001_1__Delete_data_MYSQL.sql ..\..\test\resources\AllTests\setup\db\V9001_1__Delete_data_MYSQL.sql.mysql -move ..\..\test\resources\BillExportJobTest\setup\db\V9901_1__Import_data.sql.h2 ..\..\test\resources\BillExportJobTest\setup\db\V9901_1__Import_data.sql -move ..\..\test\resources\BillExportJobTest\setup\db\V9901_1__Import_data_MYSQL.sql ..\..\test\resources\BillExportJobTest\setup\db\V9901_1__Import_data_MYSQL.sql.mysql -move ..\..\test\resources\db\tablemanagement\V0001__R001_Create_schema.sql.h2 ..\..\test\resources\db\tablemanagement\V0001__R001_Create_schema.sql -move ..\..\test\resources\db\tablemanagement\V0001__R001_Create_schema_MYSQL.sql ..\..\test\resources\db\tablemanagement\V0001__R001_Create_schema_MYSQL.sql.mysql -move ..\..\test\resources\db\tablemanagement\V0002__R001_Master_data.sql.h2 ..\..\test\resources\db\tablemanagement\V0002__R001_Master_data.sql -move ..\..\test\resources\db\tablemanagement\V0002__R001_Master_data_MYSQL.sql ..\..\test\resources\db\tablemanagement\V0002__R001_Master_data_MYSQL.sql.mysql -move ..\..\test\resources\db\tablemanagement\V0003__R001_Add_blob_table_and_data.sql.h2 ..\..\test\resources\db\tablemanagement\V0003__R001_Add_blob_table_and_data.sql -move ..\..\test\resources\db\tablemanagement\V0003__R001_Add_blob_table_and_data_MYSQL.sql ..\..\test\resources\db\tablemanagement\V0003__R001_Add_blob_table_and_data_MYSQL.sql.mysql -move ..\..\test\resources\db\tablemanagement\V0004__R001_Add_batch_tables.sql.h2 ..\..\test\resources\db\tablemanagement\V0004__R001_Add_batch_tables.sql -move ..\..\test\resources\db\tablemanagement\V0004__R001_Add_batch_tables_MYSQL.sql ..\..\test\resources\db\tablemanagement\V0004__R001_Add_batch_tables_MYSQL.sql.mysql - - - diff --git a/samples/core/src/test/setup/disablemariadb.sh b/samples/core/src/test/setup/disablemariadb.sh deleted file mode 100644 index 95d607693..000000000 --- a/samples/core/src/test/setup/disablemariadb.sh +++ /dev/null @@ -1,21 +0,0 @@ -mv ../../main/resources/db/migration/mysql/V0001__R001_Create_schema_MYSQL.sql ../../main/resources/db/migration/mysql/V0001__R001_Create_schema_MYSQL.sql.mysql -mv ../../main/resources/db/migration/h2/V0001__R001_Create_schema.sql.h2 ../../main/resources/db/migration/h2/V0001__R001_Create_schema.sql -mv ../../main/resources/db/migration/mysql/V0002__R001_Master_data_MYSQL.sql ../../main/resources/db/migration/mysql/V0002__R001_Master_data_MYSQL.sql.mysql -mv ../../main/resources/db/migration/V0002__R001_Master_data.sql.h2 ../../main/resources/db/migration/V0002__R001_Master_data.sql -mv ../../main/resources/db/migration/mysql/V0003__R001_Add_blob_table_and_data_MYSQL.sql ../../main/resources/db/migration/mysql/V0003__R001_Add_blob_table_and_data_MYSQL.sql.mysql -mv ../../main/resources/db/migration/V0003__R001_Add_blob_table_and_data.sql.h2 ../../main/resources/db/migration/V0003__R001_Add_blob_table_and_data.sql -mv ../../main/resources/db/migration/mysql/V0004__R001_Add_batch_tables_MYSQL.sql ../../main/resources/db/migration/mysql/V0004__R001_Add_batch_tables_MYSQL.sql.mysql -mv ../../main/resources/db/migration/V0004__R001_Add_batch_tables.sql.h2 ../../main/resources/db/migration/V0004__R001_Add_batch_tables.sql -mv ../../test/resources/AllTests/setup/db/V9001_1__Delete_data.sql.h2 ../../test/resources/AllTests/setup/db/V9001_1__Delete_data.sql -mv ../../test/resources/AllTests/setup/db/V9001_1__Delete_data_MYSQL.sql ../../test/resources/AllTests/setup/db/V9001_1__Delete_data_MYSQL.sql.mysql -mv ../../test/resources/BillExportJobTest/setup/db/V9901_1__Import_data.sql.h2 ../../test/resources/BillExportJobTest/setup/db/V9901_1__Import_data.sql -mv ../../test/resources/BillExportJobTest/setup/db/V9901_1__Import_data_MYSQL.sql ../../test/resources/BillExportJobTest/setup/db/V9901_1__Import_data_MYSQL.sql.mysql -mv ../../test/resources/db/tablemanagement/V0001__R001_Create_schema.sql.h2 ../../test/resources/db/tablemanagement/V0001__R001_Create_schema.sql -mv ../../test/resources/db/tablemanagement/V0001__R001_Create_schema_MYSQL.sql ../../test/resources/db/tablemanagement/V0001__R001_Create_schema_MYSQL.sql.mysql -mv ../../test/resources/db/tablemanagement/V0002__R001_Master_data.sql.h2 ../../test/resources/db/tablemanagement/V0002__R001_Master_data.sql -mv ../../test/resources/db/tablemanagement/V0002__R001_Master_data_MYSQL.sql ../../test/resources/db/tablemanagement/V0002__R001_Master_data_MYSQL.sql.mysql -mv ../../test/resources/db/tablemanagement/V0003__R001_Add_blob_table_and_data.sql.h2 ../../test/resources/db/tablemanagement/V0003__R001_Add_blob_table_and_data.sql -mv ../../test/resources/db/tablemanagement/V0003__R001_Add_blob_table_and_data_MYSQL.sql ../../test/resources/db/tablemanagement/V0003__R001_Add_blob_table_and_data_MYSQL.sql.mysql -mv ../../test/resources/db/tablemanagement/V0004__R001_Add_batch_tables.sql.h2 ../../test/resources/db/tablemanagement/V0004__R001_Add_batch_tables.sql -mv ../../test/resources/db/tablemanagement/V0004__R001_Add_batch_tables_MYSQL.sql ../../test/resources/db/tablemanagement/V0004__R001_Add_batch_tables_MYSQL.sql.mysql - diff --git a/samples/core/src/test/setup/disablemssqldb.bat b/samples/core/src/test/setup/disablemssqldb.bat deleted file mode 100644 index 576e0d715..000000000 --- a/samples/core/src/test/setup/disablemssqldb.bat +++ /dev/null @@ -1,21 +0,0 @@ -move ..\..\main\resources\db\migration\mssql\V0001__R001_Create_schema_MSSQL.sql ..\..\main\resources\db\migration\mssql\V0001__R001_Create_schema_MSSQL.sql.mssql -move ..\..\main\resources\db\migration\h2\V0001__R001_Create_schema.sql.h2 ..\..\main\resources\db\migration\h2\V0001__R001_Create_schema.sql -move ..\..\main\resources\db\migration\mssql\V0002__R001_Master_data_MSSQL.sql ..\..\main\resources\db\migration\mssql\V0002__R001_Master_data_MSSQL.sql.mssql -move ..\..\main\resources\db\migration\V0002__R001_Master_data.sql.h2 ..\..\main\resources\db\migration\V0002__R001_Master_data.sql -move ..\..\main\resources\db\migration\mssql\V0003__R001_Add_blob_table_and_data_MSSQL.sql ..\..\main\resources\db\migration\mssql\V0003__R001_Add_blob_table_and_data_MSSQL.sql.mssql -move ..\..\main\resources\db\migration\V0003__R001_Add_blob_table_and_data.sql.h2 ..\..\main\resources\db\migration\V0003__R001_Add_blob_table_and_data.sql -move ..\..\main\resources\db\migration\mssql\V0004__R001_Add_batch_tables_MSSQL.sql ..\..\main\resources\db\migration\mssql\V0004__R001_Add_batch_tables_MSSQL.sql.mssql -move ..\..\main\resources\db\migration\V0004__R001_Add_batch_tables.sql.h2 ..\..\main\resources\db\migration\V0004__R001_Add_batch_tables.sql -move ..\..\test\resources\AllTests\setup\db\V9001_1__Delete_data.sql.h2 ..\..\test\resources\AllTests\setup\db\V9001_1__Delete_data.sql -move ..\..\test\resources\AllTests\setup\db\V9001_1__Delete_data_MSSQL.sql ..\..\test\resources\AllTests\setup\db\V9001_1__Delete_data_MSSQL.sql.mssql -move ..\..\test\resources\BillExportJobTest\setup\db\V9901_1__Import_data.sql.h2 ..\..\test\resources\BillExportJobTest\setup\db\V9901_1__Import_data.sql -move ..\..\test\resources\BillExportJobTest\setup\db\V9901_1__Import_data_MSSQL.sql ..\..\test\resources\BillExportJobTest\setup\db\V9901_1__Import_data_MSSQL.sql.mssql -move ..\..\test\resources\db\tablemanagement\V0001__R001_Create_schema.sql.h2 ..\..\test\resources\db\tablemanagement\V0001__R001_Create_schema.sql -move ..\..\test\resources\db\tablemanagement\V0001__R001_Create_schema_MSSQL.sql ..\..\test\resources\db\tablemanagement\V0001__R001_Create_schema_MSSQL.sql.mssql -move ..\..\test\resources\db\tablemanagement\V0002__R001_Master_data.sql.h2 ..\..\test\resources\db\tablemanagement\V0002__R001_Master_data.sql -move ..\..\test\resources\db\tablemanagement\V0002__R001_Master_data_MSSQL.sql ..\..\test\resources\db\tablemanagement\V0002__R001_Master_data_MSSQL.sql.mssql -move ..\..\test\resources\db\tablemanagement\V0003__R001_Add_blob_table_and_data.sql.h2 ..\..\test\resources\db\tablemanagement\V0003__R001_Add_blob_table_and_data.sql -move ..\..\test\resources\db\tablemanagement\V0003__R001_Add_blob_table_and_data_MSSQL.sql ..\..\test\resources\db\tablemanagement\V0003__R001_Add_blob_table_and_data_MSSQL.sql.mssql -move ..\..\test\resources\db\tablemanagement\V0004__R001_Add_batch_tables.sql.h2 ..\..\test\resources\db\tablemanagement\V0004__R001_Add_batch_tables.sql -move ..\..\test\resources\db\tablemanagement\V0004__R001_Add_batch_tables_MSSQL.sql ..\..\test\resources\db\tablemanagement\V0004__R001_Add_batch_tables_MSSQL.sql.mssql - diff --git a/samples/core/src/test/setup/disablemssqldb.sh b/samples/core/src/test/setup/disablemssqldb.sh deleted file mode 100644 index 8b1774684..000000000 --- a/samples/core/src/test/setup/disablemssqldb.sh +++ /dev/null @@ -1,21 +0,0 @@ -mv ../../main/resources/db/migration/mssql/V0001__R001_Create_schema_MSSQL.sql ../../main/resources/db/migration/mssql/V0001__R001_Create_schema_MSSQL.sql.mssql -mv ../../main/resources/db/migration/h2/V0001__R001_Create_schema.sql.h2 ../../main/resources/db/migration/h2/V0001__R001_Create_schema.sql -mv ../../main/resources/db/migration/mssql/V0002__R001_Master_data_MSSQL.sql ../../main/resources/db/migration/mssql/V0002__R001_Master_data_MSSQL.sql.mssql -mv ../../main/resources/db/migration/V0002__R001_Master_data.sql.h2 ../../main/resources/db/migration/V0002__R001_Master_data.sql -mv ../../main/resources/db/migration/mssql/V0003__R001_Add_blob_table_and_data_MSSQL.sql ../../main/resources/db/migration/mssql/V0003__R001_Add_blob_table_and_data_MSSQL.sql.mssql -mv ../../main/resources/db/migration/V0003__R001_Add_blob_table_and_data.sql.h2 ../../main/resources/db/migration/V0003__R001_Add_blob_table_and_data.sql -mv ../../main/resources/db/migration/mssql/V0004__R001_Add_batch_tables_MSSQL.sql ../../main/resources/db/migration/mssql/V0004__R001_Add_batch_tables_MSSQL.sql.mssql -mv ../../main/resources/db/migration/V0004__R001_Add_batch_tables.sql.h2 ../../main/resources/db/migration/V0004__R001_Add_batch_tables.sql -mv ../../test/resources/AllTests/setup/db/V9001_1__Delete_data.sql.h2 ../../test/resources/AllTests/setup/db/V9001_1__Delete_data.sql -mv ../../test/resources/AllTests/setup/db/V9001_1__Delete_data_MSSQL.sql ../../test/resources/AllTests/setup/db/V9001_1__Delete_data_MSSQL.sql.mssql -mv ../../test/resources/BillExportJobTest/setup/db/V9901_1__Import_data.sql.h2 ../../test/resources/BillExportJobTest/setup/db/V9901_1__Import_data.sql -mv ../../test/resources/BillExportJobTest/setup/db/V9901_1__Import_data_MSSQL.sql ../../test/resources/BillExportJobTest/setup/db/V9901_1__Import_data_MSSQL.sql.mssql -mv ../../test/resources/db/tablemanagement/V0001__R001_Create_schema.sql.h2 ../../test/resources/db/tablemanagement/V0001__R001_Create_schema.sql -mv ../../test/resources/db/tablemanagement/V0001__R001_Create_schema_MSSQL.sql ../../test/resources/db/tablemanagement/V0001__R001_Create_schema_MSSQL.sql.mssql -mv ../../test/resources/db/tablemanagement/V0002__R001_Master_data.sql.h2 ../../test/resources/db/tablemanagement/V0002__R001_Master_data.sql -mv ../../test/resources/db/tablemanagement/V0002__R001_Master_data_MSSQL.sql ../../test/resources/db/tablemanagement/V0002__R001_Master_data_MSSQL.sql.mssql -mv ../../test/resources/db/tablemanagement/V0003__R001_Add_blob_table_and_data.sql.h2 ../../test/resources/db/tablemanagement/V0003__R001_Add_blob_table_and_data.sql -mv ../../test/resources/db/tablemanagement/V0003__R001_Add_blob_table_and_data_MSSQL.sql ../../test/resources/db/tablemanagement/V0003__R001_Add_blob_table_and_data_MSSQL.sql.mssql -mv ../../test/resources/db/tablemanagement/V0004__R001_Add_batch_tables.sql.h2 ../../test/resources/db/tablemanagement/V0004__R001_Add_batch_tables.sql -mv ../../test/resources/db/tablemanagement/V0004__R001_Add_batch_tables_MSSQL.sql ../../test/resources/db/tablemanagement/V0004__R001_Add_batch_tables_MSSQL.sql.mssql - diff --git a/samples/core/src/test/setup/disableoracledb.bat b/samples/core/src/test/setup/disableoracledb.bat deleted file mode 100644 index ef9d3e29a..000000000 --- a/samples/core/src/test/setup/disableoracledb.bat +++ /dev/null @@ -1,23 +0,0 @@ -move ..\..\main\resources\db\migration\orcl\V0001__R001_Create_schema_ORCL.sql ..\..\main\resources\db\migration\orcl\V0001__R001_Create_schema_ORCL.sql.orcl -move ..\..\main\resources\db\migration\h2\V0001__R001_Create_schema.sql.h2 ..\..\main\resources\db\migration\h2\V0001__R001_Create_schema.sql -move ..\..\main\resources\db\migration\orcl\V0002__R001_Master_data_ORCL.sql ..\..\main\resources\db\migration\orcl\V0002__R001_Master_data_ORCL.sql.orcl -move ..\..\main\resources\db\migration\V0002__R001_Master_data.sql.h2 ..\..\main\resources\db\migration\V0002__R001_Master_data.sql -move ..\..\main\resources\db\migration\orcl\V0003__R001_Add_blob_table_and_data_ORCL.sql ..\..\main\resources\db\migration\orcl\V0003__R001_Add_blob_table_and_data_ORCL.sql.orcl -move ..\..\main\resources\db\migration\V0003__R001_Add_blob_table_and_data.sql.h2 ..\..\main\resources\db\migration\V0003__R001_Add_blob_table_and_data.sql -move ..\..\main\resources\db\migration\orcl\V0004__R001_Add_batch_tables_ORCL.sql ..\..\main\resources\db\migration\orcl\V0004__R001_Add_batch_tables_ORCL.sql.orcl -move ..\..\main\resources\db\migration\V0004__R001_Add_batch_tables.sql.h2 ..\..\main\resources\db\migration\V0004__R001_Add_batch_tables.sql -move ..\..\test\resources\AllTests\setup\db\V9001_1__Delete_data.sql.h2 ..\..\test\resources\AllTests\setup\db\V9001_1__Delete_data.sql -move ..\..\test\resources\AllTests\setup\db\V9001_1__Delete_data_ORCL.sql ..\..\test\resources\AllTests\setup\db\V9001_1__Delete_data_ORCL.sql.orcl -move ..\..\test\resources\BillExportJobTest\setup\db\V9901_1__Import_data.sql.h2 ..\..\test\resources\BillExportJobTest\setup\db\V9901_1__Import_data.sql -move ..\..\test\resources\BillExportJobTest\setup\db\V9901_1__Import_data_ORCL.sql ..\..\test\resources\BillExportJobTest\setup\db\V9901_1__Import_data_ORCL.sql.orcl -move ..\..\test\resources\db\tablemanagement\V0001__R001_Create_schema.sql.h2 ..\..\test\resources\db\tablemanagement\V0001__R001_Create_schema.sql -move ..\..\test\resources\db\tablemanagement\V0001__R001_Create_schema_ORCL.sql ..\..\test\resources\db\tablemanagement\V0001__R001_Create_schema_ORCL.sql.orcl -move ..\..\test\resources\db\tablemanagement\V0002__R001_Master_data.sql.h2 ..\..\test\resources\db\tablemanagement\V0002__R001_Master_data.sql -move ..\..\test\resources\db\tablemanagement\V0002__R001_Master_data_ORCL.sql ..\..\test\resources\db\tablemanagement\V0002__R001_Master_data_ORCL.sql.orcl -move ..\..\test\resources\db\tablemanagement\V0003__R001_Add_blob_table_and_data.sql.h2 ..\..\test\resources\db\tablemanagement\V0003__R001_Add_blob_table_and_data.sql -move ..\..\test\resources\db\tablemanagement\V0003__R001_Add_blob_table_and_data_ORCL.sql ..\..\test\resources\db\tablemanagement\V0003__R001_Add_blob_table_and_data_ORCL.sql.orcl -move ..\..\test\resources\db\tablemanagement\V0004__R001_Add_batch_tables.sql.h2 ..\..\test\resources\db\tablemanagement\V0004__R001_Add_batch_tables.sql -move ..\..\test\resources\db\tablemanagement\V0004__R001_Add_batch_tables_ORCL.sql ..\..\test\resources\db\tablemanagement\V0004__R001_Add_batch_tables_ORCL.sql.orcl - - - diff --git a/samples/core/src/test/setup/disableoracledb.sh b/samples/core/src/test/setup/disableoracledb.sh deleted file mode 100644 index a123e7760..000000000 --- a/samples/core/src/test/setup/disableoracledb.sh +++ /dev/null @@ -1,21 +0,0 @@ -mv ../../main/resources/db/migration/orcl/V0001__R001_Create_schema_ORCL.sql ../../main/resources/db/migration/orcl/V0001__R001_Create_schema_ORCL.sql.orcl -mv ../../main/resources/db/migration/h2/V0001__R001_Create_schema.sql.h2 ../../main/resources/db/migration/h2/V0001__R001_Create_schema.sql -mv ../../main/resources/db/migration/orcl/V0002__R001_Master_data_ORCL.sql ../../main/resources/db/migration/orcl/V0002__R001_Master_data_ORCL.sql.orcl -mv ../../main/resources/db/migration/V0002__R001_Master_data.sql.h2 ../../main/resources/db/migration/V0002__R001_Master_data.sql -mv ../../main/resources/db/migration/orcl/V0003__R001_Add_blob_table_and_data_ORCL.sql ../../main/resources/db/migration/orcl/V0003__R001_Add_blob_table_and_data_ORCL.sql.orcl -mv ../../main/resources/db/migration/V0003__R001_Add_blob_table_and_data.sql.h2 ../../main/resources/db/migration/V0003__R001_Add_blob_table_and_data.sql -mv ../../main/resources/db/migration/orcl/V0004__R001_Add_batch_tables_ORCL.sql ../../main/resources/db/migration/orcl/V0004__R001_Add_batch_tables_ORCL.sql.orcl -mv ../../main/resources/db/migration/V0004__R001_Add_batch_tables.sql.h2 ../../main/resources/db/migration/V0004__R001_Add_batch_tables.sql -mv ../../test/resources/AllTests/setup/db/V9001_1__Delete_data.sql.h2 ../../test/resources/AllTests/setup/db/V9001_1__Delete_data.sql -mv ../../test/resources/AllTests/setup/db/V9001_1__Delete_data_ORCL.sql ../../test/resources/AllTests/setup/db/V9001_1__Delete_data_ORCL.sql.orcl -mv ../../test/resources/BillExportJobTest/setup/db/V9901_1__Import_data.sql.h2 ../../test/resources/BillExportJobTest/setup/db/V9901_1__Import_data.sql -mv ../../test/resources/BillExportJobTest/setup/db/V9901_1__Import_data_ORCL.sql ../../test/resources/BillExportJobTest/setup/db/V9901_1__Import_data_ORCL.sql.orcl -mv ../../test/resources/db/tablemanagement/V0001__R001_Create_schema.sql.h2 ../../test/resources/db/tablemanagement/V0001__R001_Create_schema.sql -mv ../../test/resources/db/tablemanagement/V0001__R001_Create_schema_ORCL.sql ../../test/resources/db/tablemanagement/V0001__R001_Create_schema_ORCL.sql.orcl -mv ../../test/resources/db/tablemanagement/V0002__R001_Master_data.sql.h2 ../../test/resources/db/tablemanagement/V0002__R001_Master_data.sql -mv ../../test/resources/db/tablemanagement/V0002__R001_Master_data_ORCL.sql ../../test/resources/db/tablemanagement/V0002__R001_Master_data_ORCL.sql.orcl -mv ../../test/resources/db/tablemanagement/V0003__R001_Add_blob_table_and_data.sql.h2 ../../test/resources/db/tablemanagement/V0003__R001_Add_blob_table_and_data.sql -mv ../../test/resources/db/tablemanagement/V0003__R001_Add_blob_table_and_data_ORCL.sql ../../test/resources/db/tablemanagement/V0003__R001_Add_blob_table_and_data_ORCL.sql.orcl -mv ../../test/resources/db/tablemanagement/V0004__R001_Add_batch_tables.sql.h2 ../../test/resources/db/tablemanagement/V0004__R001_Add_batch_tables.sql -mv ../../test/resources/db/tablemanagement/V0004__R001_Add_batch_tables_ORCL.sql ../../test/resources/db/tablemanagement/V0004__R001_Add_batch_tables_ORCL.sql.orcl - diff --git a/samples/core/src/test/setup/disablepostgresdb.bat b/samples/core/src/test/setup/disablepostgresdb.bat deleted file mode 100644 index 6f9ec87da..000000000 --- a/samples/core/src/test/setup/disablepostgresdb.bat +++ /dev/null @@ -1,23 +0,0 @@ -move ..\..\main\resources\db\migration\postgres\V0001__R001_Create_schema_pg.sql ..\..\main\resources\db\migration\postgres\V0001__R001_Create_schema_pg.sql.pg -move ..\..\main\resources\db\migration\h2\V0001__R001_Create_schema.sql.h2 ..\..\main\resources\db\migration\h2\V0001__R001_Create_schema.sql -move ..\..\main\resources\db\migration\postgres\V0002__R001_Master_data_pg.sql ..\..\main\resources\db\migration\postgres\V0002__R001_Master_data_pg.sql.pg -move ..\..\main\resources\db\migration\V0002__R001_Master_data.sql.h2 ..\..\main\resources\db\migration\V0002__R001_Master_data.sql -move ..\..\main\resources\db\migration\postgres\V0003__R001_Add_blob_table_and_data_pg.sql ..\..\main\resources\db\migration\postgres\V0003__R001_Add_blob_table_and_data_pg.sql.pg -move ..\..\main\resources\db\migration\V0003__R001_Add_blob_table_and_data.sql.h2 ..\..\main\resources\db\migration\V0003__R001_Add_blob_table_and_data.sql -move ..\..\main\resources\db\migration\postgres\V0004__R001_Add_batch_tables_pg.sql ..\..\main\resources\db\migration\postgres\V0004__R001_Add_batch_tables_pg.sql.pg -move ..\..\main\resources\db\migration\V0004__R001_Add_batch_tables.sql.h2 ..\..\main\resources\db\migration\V0004__R001_Add_batch_tables.sql -move ..\..\test\resources\AllTests\setup\db\V9001_1__Delete_data.sql.h2 ..\..\test\resources\AllTests\setup\db\V9001_1__Delete_data.sql -move ..\..\test\resources\AllTests\setup\db\V9001_1__Delete_data_pg.sql ..\..\test\resources\AllTests\setup\db\V9001_1__Delete_data_pg.sql.pg -move ..\..\test\resources\BillExportJobTest\setup\db\V9901_1__Import_data.sql.h2 ..\..\test\resources\BillExportJobTest\setup\db\V9901_1__Import_data.sql -move ..\..\test\resources\BillExportJobTest\setup\db\V9901_1__Import_data_pg.sql ..\..\test\resources\BillExportJobTest\setup\db\V9901_1__Import_data_pg.sql.pg -move ..\..\test\resources\db\tablemanagement\V0001__R001_Create_schema.sql.h2 ..\..\test\resources\db\tablemanagement\V0001__R001_Create_schema.sql -move ..\..\test\resources\db\tablemanagement\V0001__R001_Create_schema_pg.sql ..\..\test\resources\db\tablemanagement\V0001__R001_Create_schema_pg.sql.pg -move ..\..\test\resources\db\tablemanagement\V0002__R001_Master_data.sql.h2 ..\..\test\resources\db\tablemanagement\V0002__R001_Master_data.sql -move ..\..\test\resources\db\tablemanagement\V0002__R001_Master_data_pg.sql ..\..\test\resources\db\tablemanagement\V0002__R001_Master_data_pg.sql.pg -move ..\..\test\resources\db\tablemanagement\V0003__R001_Add_blob_table_and_data.sql.h2 ..\..\test\resources\db\tablemanagement\V0003__R001_Add_blob_table_and_data.sql -move ..\..\test\resources\db\tablemanagement\V0003__R001_Add_blob_table_and_data_pg.sql ..\..\test\resources\db\tablemanagement\V0003__R001_Add_blob_table_and_data_pg.sql.pg -move ..\..\test\resources\db\tablemanagement\V0004__R001_Add_batch_tables.sql.h2 ..\..\test\resources\db\tablemanagement\V0004__R001_Add_batch_tables.sql -move ..\..\test\resources\db\tablemanagement\V0004__R001_Add_batch_tables_pg.sql ..\..\test\resources\db\tablemanagement\V0004__R001_Add_batch_tables_pg.sql.pg - - - diff --git a/samples/core/src/test/setup/disablepostgresdb.sh b/samples/core/src/test/setup/disablepostgresdb.sh deleted file mode 100644 index dc86b6939..000000000 --- a/samples/core/src/test/setup/disablepostgresdb.sh +++ /dev/null @@ -1,21 +0,0 @@ -mv ../../main/resources/db/migration/postgres/V0001__R001_Create_schema_pg.sql ../../main/resources/db/migration/postgres/V0001__R001_Create_schema_pg.sql.pg -mv ../../main/resources/db/migration/h2/V0001__R001_Create_schema.sql.h2 ../../main/resources/db/migration/h2/V0001__R001_Create_schema.sql -mv ../../main/resources/db/migration/postgres/V0002__R001_Master_data_pg.sql ../../main/resources/db/migration/postgres/V0002__R001_Master_data_pg.sql.pg -mv ../../main/resources/db/migration/V0002__R001_Master_data.sql.h2 ../../main/resources/db/migration/V0002__R001_Master_data.sql -mv ../../main/resources/db/migration/postgres/V0003__R001_Add_blob_table_and_data_pg.sql ../../main/resources/db/migration/postgres/V0003__R001_Add_blob_table_and_data_pg.sql.pg -mv ../../main/resources/db/migration/V0003__R001_Add_blob_table_and_data.sql.h2 ../../main/resources/db/migration/V0003__R001_Add_blob_table_and_data.sql -mv ../../main/resources/db/migration/postgres/V0004__R001_Add_batch_tables_pg.sql ../../main/resources/db/migration/postgres/V0004__R001_Add_batch_tables_pg.sql.pg -mv ../../main/resources/db/migration/V0004__R001_Add_batch_tables.sql.h2 ../../main/resources/db/migration/V0004__R001_Add_batch_tables.sql -mv ../../test/resources/AllTests/setup/db/V9001_1__Delete_data.sql.h2 ../../test/resources/AllTests/setup/db/V9001_1__Delete_data.sql -mv ../../test/resources/AllTests/setup/db/V9001_1__Delete_data_pg.sql ../../test/resources/AllTests/setup/db/V9001_1__Delete_data_pg.sql.pg -mv ../../test/resources/BillExportJobTest/setup/db/V9901_1__Import_data.sql.h2 ../../test/resources/BillExportJobTest/setup/db/V9901_1__Import_data.sql -mv ../../test/resources/BillExportJobTest/setup/db/V9901_1__Import_data_pg.sql ../../test/resources/BillExportJobTest/setup/db/V9901_1__Import_data_pg.sql.pg -mv ../../test/resources/db/tablemanagement/V0001__R001_Create_schema.sql.h2 ../../test/resources/db/tablemanagement/V0001__R001_Create_schema.sql -mv ../../test/resources/db/tablemanagement/V0001__R001_Create_schema_pg.sql ../../test/resources/db/tablemanagement/V0001__R001_Create_schema_pg.sql.pg -mv ../../test/resources/db/tablemanagement/V0002__R001_Master_data.sql.h2 ../../test/resources/db/tablemanagement/V0002__R001_Master_data.sql -mv ../../test/resources/db/tablemanagement/V0002__R001_Master_data_pg.sql ../../test/resources/db/tablemanagement/V0002__R001_Master_data_pg.sql.pg -mv ../../test/resources/db/tablemanagement/V0003__R001_Add_blob_table_and_data.sql.h2 ../../test/resources/db/tablemanagement/V0003__R001_Add_blob_table_and_data.sql -mv ../../test/resources/db/tablemanagement/V0003__R001_Add_blob_table_and_data_pg.sql ../../test/resources/db/tablemanagement/V0003__R001_Add_blob_table_and_data_pg.sql.pg -mv ../../test/resources/db/tablemanagement/V0004__R001_Add_batch_tables.sql.h2 ../../test/resources/db/tablemanagement/V0004__R001_Add_batch_tables.sql -mv ../../test/resources/db/tablemanagement/V0004__R001_Add_batch_tables_pg.sql ../../test/resources/db/tablemanagement/V0004__R001_Add_batch_tables_pg.sql.pg - diff --git a/samples/core/src/test/setup/mariadb.bat b/samples/core/src/test/setup/mariadb.bat deleted file mode 100644 index 3111d3993..000000000 --- a/samples/core/src/test/setup/mariadb.bat +++ /dev/null @@ -1,23 +0,0 @@ -move ..\..\main\resources\db\migration\mysql\V0001__R001_Create_schema_MYSQL.sql.mysql ..\..\main\resources\db\migration\mysql\V0001__R001_Create_schema_MYSQL.sql -move ..\..\main\resources\db\migration\h2\V0001__R001_Create_schema.sql ..\..\main\resources\db\migration\h2\V0001__R001_Create_schema.sql.h2 -move ..\..\main\resources\db\migration\mysql\V0002__R001_Master_data_MYSQL.sql.mysql ..\..\main\resources\db\migration\mysql\V0002__R001_Master_data_MYSQL.sql -move ..\..\main\resources\db\migration\V0002__R001_Master_data.sql ..\..\main\resources\db\migration\V0002__R001_Master_data.sql.h2 -move ..\..\main\resources\db\migration\mysql\V0003__R001_Add_blob_table_and_data_MYSQL.sql.mysql ..\..\main\resources\db\migration\mysql\V0003__R001_Add_blob_table_and_data_MYSQL.sql -move ..\..\main\resources\db\migration\V0003__R001_Add_blob_table_and_data.sql ..\..\main\resources\db\migration\V0003__R001_Add_blob_table_and_data.sql.h2 -move ..\..\main\resources\db\migration\mysql\V0004__R001_Add_batch_tables_MYSQL.sql.mysql ..\..\main\resources\db\migration\mysql\V0004__R001_Add_batch_tables_MYSQL.sql -move ..\..\main\resources\db\migration\V0004__R001_Add_batch_tables.sql ..\..\main\resources\db\migration\V0004__R001_Add_batch_tables.sql.h2 -move ..\..\test\resources\AllTests\setup\db\V9001_1__Delete_data.sql ..\..\test\resources\AllTests\setup\db\V9001_1__Delete_data.sql.h2 -move ..\..\test\resources\AllTests\setup\db\V9001_1__Delete_data_MYSQL.sql.mysql ..\..\test\resources\AllTests\setup\db\V9001_1__Delete_data_MYSQL.sql -move ..\..\test\resources\BillExportJobTest\setup\db\V9901_1__Import_data.sql ..\..\test\resources\BillExportJobTest\setup\db\V9901_1__Import_data.sql.h2 -move ..\..\test\resources\BillExportJobTest\setup\db\V9901_1__Import_data_MYSQL.sql.mysql ..\..\test\resources\BillExportJobTest\setup\db\V9901_1__Import_data_MYSQL.sql -move ..\..\test\resources\db\tablemanagement\V0001__R001_Create_schema.sql ..\..\test\resources\db\tablemanagement\V0001__R001_Create_schema.sql.h2 -move ..\..\test\resources\db\tablemanagement\V0001__R001_Create_schema_MYSQL.sql.mysql ..\..\test\resources\db\tablemanagement\V0001__R001_Create_schema_MYSQL.sql -move ..\..\test\resources\db\tablemanagement\V0002__R001_Master_data.sql ..\..\test\resources\db\tablemanagement\V0002__R001_Master_data.sql.h2 -move ..\..\test\resources\db\tablemanagement\V0002__R001_Master_data_MYSQL.sql.mysql ..\..\test\resources\db\tablemanagement\V0002__R001_Master_data_MYSQL.sql -move ..\..\test\resources\db\tablemanagement\V0003__R001_Add_blob_table_and_data.sql ..\..\test\resources\db\tablemanagement\V0003__R001_Add_blob_table_and_data.sql.h2 -move ..\..\test\resources\db\tablemanagement\V0003__R001_Add_blob_table_and_data_MYSQL.sql.mysql ..\..\test\resources\db\tablemanagement\V0003__R001_Add_blob_table_and_data_MYSQL.sql -move ..\..\test\resources\db\tablemanagement\V0004__R001_Add_batch_tables.sql ..\..\test\resources\db\tablemanagement\V0004__R001_Add_batch_tables.sql.h2 -move ..\..\test\resources\db\tablemanagement\V0004__R001_Add_batch_tables_MYSQL.sql.mysql ..\..\test\resources\db\tablemanagement\V0004__R001_Add_batch_tables_MYSQL.sql - - - diff --git a/samples/core/src/test/setup/mariadb.sh b/samples/core/src/test/setup/mariadb.sh deleted file mode 100644 index b73d056c3..000000000 --- a/samples/core/src/test/setup/mariadb.sh +++ /dev/null @@ -1,21 +0,0 @@ -mv ../../main/resources/db/migration/mysql/V0001__R001_Create_schema_MYSQL.sql.mysql ../../main/resources/db/migration/mysql/V0001__R001_Create_schema_MYSQL.sql -mv ../../main/resources/db/migration/h2/V0001__R001_Create_schema.sql ../../main/resources/db/migration/h2/V0001__R001_Create_schema.sql.h2 -mv ../../main/resources/db/migration/mysql/V0002__R001_Master_data_MYSQL.sql.mysql ../../main/resources/db/migration/mysql/V0002__R001_Master_data_MYSQL.sql -mv ../../main/resources/db/migration/V0002__R001_Master_data.sql ../../main/resources/db/migration/V0002__R001_Master_data.sql.h2 -mv ../../main/resources/db/migration/mysql/V0003__R001_Add_blob_table_and_data_MYSQL.sql.mysql ../../main/resources/db/migration/mysql/V0003__R001_Add_blob_table_and_data_MYSQL.sql -mv ../../main/resources/db/migration/V0003__R001_Add_blob_table_and_data.sql ../../main/resources/db/migration/V0003__R001_Add_blob_table_and_data.sql.h2 -mv ../../main/resources/db/migration/mysql/V0004__R001_Add_batch_tables_MYSQL.sql.mysql ../../main/resources/db/migration/mysql/V0004__R001_Add_batch_tables_MYSQL.sql -mv ../../main/resources/db/migration/V0004__R001_Add_batch_tables.sql ../../main/resources/db/migration/V0004__R001_Add_batch_tables.sql.h2 -mv ../../test/resources/AllTests/setup/db/V9001_1__Delete_data.sql ../../test/resources/AllTests/setup/db/V9001_1__Delete_data.sql.h2 -mv ../../test/resources/AllTests/setup/db/V9001_1__Delete_data_MYSQL.sql.mysql ../../test/resources/AllTests/setup/db/V9001_1__Delete_data_MYSQL.sql -mv ../../test/resources/BillExportJobTest/setup/db/V9901_1__Import_data.sql ../../test/resources/BillExportJobTest/setup/db/V9901_1__Import_data.sql.h2 -mv ../../test/resources/BillExportJobTest/setup/db/V9901_1__Import_data_MYSQL.sql.mysql ../../test/resources/BillExportJobTest/setup/db/V9901_1__Import_data_MYSQL.sql -mv ../../test/resources/db/tablemanagement/V0001__R001_Create_schema.sql ../../test/resources/db/tablemanagement/V0001__R001_Create_schema.sql.h2 -mv ../../test/resources/db/tablemanagement/V0001__R001_Create_schema_MYSQL.sql.mysql ../../test/resources/db/tablemanagement/V0001__R001_Create_schema_MYSQL.sql -mv ../../test/resources/db/tablemanagement/V0002__R001_Master_data.sql ../../test/resources/db/tablemanagement/V0002__R001_Master_data.sql.h2 -mv ../../test/resources/db/tablemanagement/V0002__R001_Master_data_MYSQL.sql.mysql ../../test/resources/db/tablemanagement/V0002__R001_Master_data_MYSQL.sql -mv ../../test/resources/db/tablemanagement/V0003__R001_Add_blob_table_and_data.sql ../../test/resources/db/tablemanagement/V0003__R001_Add_blob_table_and_data.sql.h2 -mv ../../test/resources/db/tablemanagement/V0003__R001_Add_blob_table_and_data_MYSQL.sql.mysql ../../test/resources/db/tablemanagement/V0003__R001_Add_blob_table_and_data_MYSQL.sql -mv ../../test/resources/db/tablemanagement/V0004__R001_Add_batch_tables.sql ../../test/resources/db/tablemanagement/V0004__R001_Add_batch_tables.sql.h2 -mv ../../test/resources/db/tablemanagement/V0004__R001_Add_batch_tables_MYSQL.sql.mysql ../../test/resources/db/tablemanagement/V0004__R001_Add_batch_tables_MYSQL.sql - diff --git a/samples/core/src/test/setup/mssqldb.bat b/samples/core/src/test/setup/mssqldb.bat deleted file mode 100644 index 179d3b2d8..000000000 --- a/samples/core/src/test/setup/mssqldb.bat +++ /dev/null @@ -1,21 +0,0 @@ -move ..\..\main\resources\db\migration\mssql\V0001__R001_Create_schema_MSSQL.sql.mssql ..\..\main\resources\db\migration\mssql\V0001__R001_Create_schema_MSSQL.sql -move ..\..\main\resources\db\migration\h2\V0001__R001_Create_schema.sql ..\..\main\resources\db\migration\h2\V0001__R001_Create_schema.sql.h2 -move ..\..\main\resources\db\migration\mssql\V0002__R001_Master_data_MSSQL.sql.mssql ..\..\main\resources\db\migration\mssql\V0002__R001_Master_data_MSSQL.sql -move ..\..\main\resources\db\migration\V0002__R001_Master_data.sql ..\..\main\resources\db\migration\V0002__R001_Master_data.sql.h2 -move ..\..\main\resources\db\migration\mssql\V0003__R001_Add_blob_table_and_data_MSSQL.sql.mssql ..\..\main\resources\db\migration\mssql\V0003__R001_Add_blob_table_and_data_MSSQL.sql -move ..\..\main\resources\db\migration\V0003__R001_Add_blob_table_and_data.sql ..\..\main\resources\db\migration\V0003__R001_Add_blob_table_and_data.sql.h2 -move ..\..\main\resources\db\migration\mssql\V0004__R001_Add_batch_tables_MSSQL.sql.mssql ..\..\main\resources\db\migration\mssql\V0004__R001_Add_batch_tables_MSSQL.sql -move ..\..\main\resources\db\migration\V0004__R001_Add_batch_tables.sql ..\..\main\resources\db\migration\V0004__R001_Add_batch_tables.sql.h2 -move ..\..\test\resources\AllTests\setup\db\V9001_1__Delete_data.sql ..\..\test\resources\AllTests\setup\db\V9001_1__Delete_data.sql.h2 -move ..\..\test\resources\AllTests\setup\db\V9001_1__Delete_data_MSSQL.sql.mssql ..\..\test\resources\AllTests\setup\db\V9001_1__Delete_data_MSSQL.sql -move ..\..\test\resources\BillExportJobTest\setup\db\V9901_1__Import_data.sql ..\..\test\resources\BillExportJobTest\setup\db\V9901_1__Import_data.sql.h2 -move ..\..\test\resources\BillExportJobTest\setup\db\V9901_1__Import_data_MSSQL.sql.mssql ..\..\test\resources\BillExportJobTest\setup\db\V9901_1__Import_data_MSSQL.sql -move ..\..\test\resources\db\tablemanagement\V0001__R001_Create_schema.sql ..\..\test\resources\db\tablemanagement\V0001__R001_Create_schema.sql.h2 -move ..\..\test\resources\db\tablemanagement\V0001__R001_Create_schema_MSSQL.sql.mssql ..\..\test\resources\db\tablemanagement\V0001__R001_Create_schema_MSSQL.sql -move ..\..\test\resources\db\tablemanagement\V0002__R001_Master_data.sql ..\..\test\resources\db\tablemanagement\V0002__R001_Master_data.sql.h2 -move ..\..\test\resources\db\tablemanagement\V0002__R001_Master_data_MSSQL.sql.mssql ..\..\test\resources\db\tablemanagement\V0002__R001_Master_data_MSSQL.sql -move ..\..\test\resources\db\tablemanagement\V0003__R001_Add_blob_table_and_data.sql ..\..\test\resources\db\tablemanagement\V0003__R001_Add_blob_table_and_data.sql.h2 -move ..\..\test\resources\db\tablemanagement\V0003__R001_Add_blob_table_and_data_MSSQL.sql.mssql ..\..\test\resources\db\tablemanagement\V0003__R001_Add_blob_table_and_data_MSSQL.sql -move ..\..\test\resources\db\tablemanagement\V0004__R001_Add_batch_tables.sql ..\..\test\resources\db\tablemanagement\V0004__R001_Add_batch_tables.sql.h2 -move ..\..\test\resources\db\tablemanagement\V0004__R001_Add_batch_tables_MSSQL.sql.mssql ..\..\test\resources\db\tablemanagement\V0004__R001_Add_batch_tables_MSSQL.sql - diff --git a/samples/core/src/test/setup/mssqldb.sh b/samples/core/src/test/setup/mssqldb.sh deleted file mode 100644 index 2a0adfb55..000000000 --- a/samples/core/src/test/setup/mssqldb.sh +++ /dev/null @@ -1,21 +0,0 @@ -mv ../../main/resources/db/migration/mssql/V0001__R001_Create_schema_MSSQL.sql.mssql ../../main/resources/db/migration/mssql/V0001__R001_Create_schema_MSSQL.sql -mv ../../main/resources/db/migration/h2/V0001__R001_Create_schema.sql ../../main/resources/db/migration/h2/V0001__R001_Create_schema.sql.h2 -mv ../../main/resources/db/migration/mssql/V0002__R001_Master_data_MSSQL.sql.mssql ../../main/resources/db/migration/mssql/V0002__R001_Master_data_MSSQL.sql -mv ../../main/resources/db/migration/V0002__R001_Master_data.sql ../../main/resources/db/migration/V0002__R001_Master_data.sql.h2 -mv ../../main/resources/db/migration/mssql/V0003__R001_Add_blob_table_and_data_MSSQL.sql.mssql ../../main/resources/db/migration/mssql/V0003__R001_Add_blob_table_and_data_MSSQL.sql -mv ../../main/resources/db/migration/V0003__R001_Add_blob_table_and_data.sql ../../main/resources/db/migration/V0003__R001_Add_blob_table_and_data.sql.h2 -mv ../../main/resources/db/migration/mssql/V0004__R001_Add_batch_tables_MSSQL.sql.mssql ../../main/resources/db/migration/mssql/V0004__R001_Add_batch_tables_MSSQL.sql -mv ../../main/resources/db/migration/V0004__R001_Add_batch_tables.sql ../../main/resources/db/migration/V0004__R001_Add_batch_tables.sql.h2 -mv ../../test/resources/AllTests/setup/db/V9001_1__Delete_data.sql ../../test/resources/AllTests/setup/db/V9001_1__Delete_data.sql.h2 -mv ../../test/resources/AllTests/setup/db/V9001_1__Delete_data_MSSQL.sql.mssql ../../test/resources/AllTests/setup/db/V9001_1__Delete_data_MSSQL.sql -mv ../../test/resources/BillExportJobTest/setup/db/V9901_1__Import_data.sql ../../test/resources/BillExportJobTest/setup/db/V9901_1__Import_data.sql.h2 -mv ../../test/resources/BillExportJobTest/setup/db/V9901_1__Import_data_MSSQL.sql.mssql ../../test/resources/BillExportJobTest/setup/db/V9901_1__Import_data_MSSQL.sql -mv ../../test/resources/db/tablemanagement/V0001__R001_Create_schema.sql ../../test/resources/db/tablemanagement/V0001__R001_Create_schema.sql.h2 -mv ../../test/resources/db/tablemanagement/V0001__R001_Create_schema_MSSQL.sql.mssql ../../test/resources/db/tablemanagement/V0001__R001_Create_schema_MSSQL.sql -mv ../../test/resources/db/tablemanagement/V0002__R001_Master_data.sql ../../test/resources/db/tablemanagement/V0002__R001_Master_data.sql.h2 -mv ../../test/resources/db/tablemanagement/V0002__R001_Master_data_MSSQL.sql.mssql ../../test/resources/db/tablemanagement/V0002__R001_Master_data_MSSQL.sql -mv ../../test/resources/db/tablemanagement/V0003__R001_Add_blob_table_and_data.sql ../../test/resources/db/tablemanagement/V0003__R001_Add_blob_table_and_data.sql.h2 -mv ../../test/resources/db/tablemanagement/V0003__R001_Add_blob_table_and_data_MSSQL.sql.mssql ../../test/resources/db/tablemanagement/V0003__R001_Add_blob_table_and_data_MSSQL.sql -mv ../../test/resources/db/tablemanagement/V0004__R001_Add_batch_tables.sql ../../test/resources/db/tablemanagement/V0004__R001_Add_batch_tables.sql.h2 -mv ../../test/resources/db/tablemanagement/V0004__R001_Add_batch_tables_MSSQL.sql.mssql ../../test/resources/db/tablemanagement/V0004__R001_Add_batch_tables_MSSQL.sql - diff --git a/samples/core/src/test/setup/oracledb.bat b/samples/core/src/test/setup/oracledb.bat deleted file mode 100644 index 678f69cf5..000000000 --- a/samples/core/src/test/setup/oracledb.bat +++ /dev/null @@ -1,23 +0,0 @@ -move ..\..\main\resources\db\migration\orcl\V0001__R001_Create_schema_ORCL.sql.orcl ..\..\main\resources\db\migration\orcl\V0001__R001_Create_schema_ORCL.sql -move ..\..\main\resources\db\migration\h2\V0001__R001_Create_schema.sql ..\..\main\resources\db\migration\h2\V0001__R001_Create_schema.sql.h2 -move ..\..\main\resources\db\migration\orcl\V0002__R001_Master_data_ORCL.sql.orcl ..\..\main\resources\db\migration\orcl\V0002__R001_Master_data_ORCL.sql -move ..\..\main\resources\db\migration\V0002__R001_Master_data.sql ..\..\main\resources\db\migration\V0002__R001_Master_data.sql.h2 -move ..\..\main\resources\db\migration\orcl\V0003__R001_Add_blob_table_and_data_ORCL.sql.orcl ..\..\main\resources\db\migration\orcl\V0003__R001_Add_blob_table_and_data_ORCL.sql -move ..\..\main\resources\db\migration\V0003__R001_Add_blob_table_and_data.sql ..\..\main\resources\db\migration\V0003__R001_Add_blob_table_and_data.sql.h2 -move ..\..\main\resources\db\migration\orcl\V0004__R001_Add_batch_tables_ORCL.sql.orcl ..\..\main\resources\db\migration\orcl\V0004__R001_Add_batch_tables_ORCL.sql -move ..\..\main\resources\db\migration\V0004__R001_Add_batch_tables.sql ..\..\main\resources\db\migration\V0004__R001_Add_batch_tables.sql.h2 -move ..\..\test\resources\AllTests\setup\db\V9001_1__Delete_data.sql ..\..\test\resources\AllTests\setup\db\V9001_1__Delete_data.sql.h2 -move ..\..\test\resources\AllTests\setup\db\V9001_1__Delete_data_ORCL.sql.orcl ..\..\test\resources\AllTests\setup\db\V9001_1__Delete_data_ORCL.sql -move ..\..\test\resources\BillExportJobTest\setup\db\V9901_1__Import_data.sql ..\..\test\resources\BillExportJobTest\setup\db\V9901_1__Import_data.sql.h2 -move ..\..\test\resources\BillExportJobTest\setup\db\V9901_1__Import_data_ORCL.sql.orcl ..\..\test\resources\BillExportJobTest\setup\db\V9901_1__Import_data_ORCL.sql -move ..\..\test\resources\db\tablemanagement\V0001__R001_Create_schema.sql ..\..\test\resources\db\tablemanagement\V0001__R001_Create_schema.sql.h2 -move ..\..\test\resources\db\tablemanagement\V0001__R001_Create_schema_ORCL.sql.orcl ..\..\test\resources\db\tablemanagement\V0001__R001_Create_schema_ORCL.sql -move ..\..\test\resources\db\tablemanagement\V0002__R001_Master_data.sql ..\..\test\resources\db\tablemanagement\V0002__R001_Master_data.sql.h2 -move ..\..\test\resources\db\tablemanagement\V0002__R001_Master_data_ORCL.sql.orcl ..\..\test\resources\db\tablemanagement\V0002__R001_Master_data_ORCL.sql -move ..\..\test\resources\db\tablemanagement\V0003__R001_Add_blob_table_and_data.sql ..\..\test\resources\db\tablemanagement\V0003__R001_Add_blob_table_and_data.sql.h2 -move ..\..\test\resources\db\tablemanagement\V0003__R001_Add_blob_table_and_data_ORCL.sql.orcl ..\..\test\resources\db\tablemanagement\V0003__R001_Add_blob_table_and_data_ORCL.sql -move ..\..\test\resources\db\tablemanagement\V0004__R001_Add_batch_tables.sql ..\..\test\resources\db\tablemanagement\V0004__R001_Add_batch_tables.sql.h2 -move ..\..\test\resources\db\tablemanagement\V0004__R001_Add_batch_tables_ORCL.sql.orcl ..\..\test\resources\db\tablemanagement\V0004__R001_Add_batch_tables_ORCL.sql - - - diff --git a/samples/core/src/test/setup/oracledb.sh b/samples/core/src/test/setup/oracledb.sh deleted file mode 100644 index 5e2190bf2..000000000 --- a/samples/core/src/test/setup/oracledb.sh +++ /dev/null @@ -1,21 +0,0 @@ -mv ../../main/resources/db/migration/orcl/V0001__R001_Create_schema_ORCL.sql.orcl ../../main/resources/db/migration/orcl/V0001__R001_Create_schema_ORCL.sql -mv ../../main/resources/db/migration/h2/V0001__R001_Create_schema.sql ../../main/resources/db/migration/h2/V0001__R001_Create_schema.sql.h2 -mv ../../main/resources/db/migration/orcl/V0002__R001_Master_data_ORCL.sql.orcl ../../main/resources/db/migration/orcl/V0002__R001_Master_data_ORCL.sql -mv ../../main/resources/db/migration/V0002__R001_Master_data.sql ../../main/resources/db/migration/V0002__R001_Master_data.sql.h2 -mv ../../main/resources/db/migration/orcl/V0003__R001_Add_blob_table_and_data_ORCL.sql.orcl ../../main/resources/db/migration/orcl/V0003__R001_Add_blob_table_and_data_ORCL.sql -mv ../../main/resources/db/migration/V0003__R001_Add_blob_table_and_data.sql ../../main/resources/db/migration/V0003__R001_Add_blob_table_and_data.sql.h2 -mv ../../main/resources/db/migration/orcl/V0004__R001_Add_batch_tables_ORCL.sql.orcl ../../main/resources/db/migration/orcl/V0004__R001_Add_batch_tables_ORCL.sql -mv ../../main/resources/db/migration/V0004__R001_Add_batch_tables.sql ../../main/resources/db/migration/V0004__R001_Add_batch_tables.sql.h2 -mv ../../test/resources/AllTests/setup/db/V9001_1__Delete_data.sql ../../test/resources/AllTests/setup/db/V9001_1__Delete_data.sql.h2 -mv ../../test/resources/AllTests/setup/db/V9001_1__Delete_data_ORCL.sql.orcl ../../test/resources/AllTests/setup/db/V9001_1__Delete_data_ORCL.sql -mv ../../test/resources/BillExportJobTest/setup/db/V9901_1__Import_data.sql ../../test/resources/BillExportJobTest/setup/db/V9901_1__Import_data.sql.h2 -mv ../../test/resources/BillExportJobTest/setup/db/V9901_1__Import_data_ORCL.sql.orcl ../../test/resources/BillExportJobTest/setup/db/V9901_1__Import_data_ORCL.sql -mv ../../test/resources/db/tablemanagement/V0001__R001_Create_schema.sql ../../test/resources/db/tablemanagement/V0001__R001_Create_schema.sql.h2 -mv ../../test/resources/db/tablemanagement/V0001__R001_Create_schema_ORCL.sql.orcl ../../test/resources/db/tablemanagement/V0001__R001_Create_schema_ORCL.sql -mv ../../test/resources/db/tablemanagement/V0002__R001_Master_data.sql ../../test/resources/db/tablemanagement/V0002__R001_Master_data.sql.h2 -mv ../../test/resources/db/tablemanagement/V0002__R001_Master_data_ORCL.sql.orcl ../../test/resources/db/tablemanagement/V0002__R001_Master_data_ORCL.sql -mv ../../test/resources/db/tablemanagement/V0003__R001_Add_blob_table_and_data.sql ../../test/resources/db/tablemanagement/V0003__R001_Add_blob_table_and_data.sql.h2 -mv ../../test/resources/db/tablemanagement/V0003__R001_Add_blob_table_and_data_ORCL.sql.orcl ../../test/resources/db/tablemanagement/V0003__R001_Add_blob_table_and_data_ORCL.sql -mv ../../test/resources/db/tablemanagement/V0004__R001_Add_batch_tables.sql ../../test/resources/db/tablemanagement/V0004__R001_Add_batch_tables.sql.h2 -mv ../../test/resources/db/tablemanagement/V0004__R001_Add_batch_tables_ORCL.sql.orcl ../../test/resources/db/tablemanagement/V0004__R001_Add_batch_tables_ORCL.sql - diff --git a/samples/core/src/test/setup/postgresdb.bat b/samples/core/src/test/setup/postgresdb.bat deleted file mode 100644 index c6fb088dd..000000000 --- a/samples/core/src/test/setup/postgresdb.bat +++ /dev/null @@ -1,23 +0,0 @@ -move ..\..\main\resources\db\migration\postgres\V0001__R001_Create_schema_pg.sql.pg ..\..\main\resources\db\migration\postgres\V0001__R001_Create_schema_pg.sql -move ..\..\main\resources\db\migration\h2\V0001__R001_Create_schema.sql ..\..\main\resources\db\migration\h2\V0001__R001_Create_schema.sql.h2 -move ..\..\main\resources\db\migration\postgres\V0002__R001_Master_data_pg.sql.pg ..\..\main\resources\db\migration\postgres\V0002__R001_Master_data_pg.sql -move ..\..\main\resources\db\migration\V0002__R001_Master_data.sql ..\..\main\resources\db\migration\V0002__R001_Master_data.sql.h2 -move ..\..\main\resources\db\migration\postgres\V0003__R001_Add_blob_table_and_data_pg.sql.pg ..\..\main\resources\db\migration\postgres\V0003__R001_Add_blob_table_and_data_pg.sql -move ..\..\main\resources\db\migration\V0003__R001_Add_blob_table_and_data.sql ..\..\main\resources\db\migration\V0003__R001_Add_blob_table_and_data.sql.h2 -move ..\..\main\resources\db\migration\postgres\V0004__R001_Add_batch_tables_pg.sql.pg ..\..\main\resources\db\migration\postgres\V0004__R001_Add_batch_tables_pg.sql -move ..\..\main\resources\db\migration\V0004__R001_Add_batch_tables.sql ..\..\main\resources\db\migration\V0004__R001_Add_batch_tables.sql.h2 -move ..\..\test\resources\AllTests\setup\db\V9001_1__Delete_data.sql ..\..\test\resources\AllTests\setup\db\V9001_1__Delete_data.sql.h2 -move ..\..\test\resources\AllTests\setup\db\V9001_1__Delete_data_pg.sql.pg ..\..\test\resources\AllTests\setup\db\V9001_1__Delete_data_pg.sql -move ..\..\test\resources\BillExportJobTest\setup\db\V9901_1__Import_data.sql ..\..\test\resources\BillExportJobTest\setup\db\V9901_1__Import_data.sql.h2 -move ..\..\test\resources\BillExportJobTest\setup\db\V9901_1__Import_data_pg.sql.pg ..\..\test\resources\BillExportJobTest\setup\db\V9901_1__Import_data_pg.sql -move ..\..\test\resources\db\tablemanagement\V0001__R001_Create_schema.sql ..\..\test\resources\db\tablemanagement\V0001__R001_Create_schema.sql.h2 -move ..\..\test\resources\db\tablemanagement\V0001__R001_Create_schema_pg.sql.pg ..\..\test\resources\db\tablemanagement\V0001__R001_Create_schema_pg.sql -move ..\..\test\resources\db\tablemanagement\V0002__R001_Master_data.sql ..\..\test\resources\db\tablemanagement\V0002__R001_Master_data.sql.h2 -move ..\..\test\resources\db\tablemanagement\V0002__R001_Master_data_pg.sql.pg ..\..\test\resources\db\tablemanagement\V0002__R001_Master_data_pg.sql -move ..\..\test\resources\db\tablemanagement\V0003__R001_Add_blob_table_and_data.sql ..\..\test\resources\db\tablemanagement\V0003__R001_Add_blob_table_and_data.sql.h2 -move ..\..\test\resources\db\tablemanagement\V0003__R001_Add_blob_table_and_data_pg.sql.pg ..\..\test\resources\db\tablemanagement\V0003__R001_Add_blob_table_and_data_pg.sql -move ..\..\test\resources\db\tablemanagement\V0004__R001_Add_batch_tables.sql ..\..\test\resources\db\tablemanagement\V0004__R001_Add_batch_tables.sql.h2 -move ..\..\test\resources\db\tablemanagement\V0004__R001_Add_batch_tables_pg.sql.pg ..\..\test\resources\db\tablemanagement\V0004__R001_Add_batch_tables_pg.sql - - - diff --git a/samples/core/src/test/setup/postgresdb.sh b/samples/core/src/test/setup/postgresdb.sh deleted file mode 100644 index e7cb18c92..000000000 --- a/samples/core/src/test/setup/postgresdb.sh +++ /dev/null @@ -1,21 +0,0 @@ -mv ../../main/resources/db/migration/postgres/V0001__R001_Create_schema_pg.sql.pg ../../main/resources/db/migration/postgres/V0001__R001_Create_schema_pg.sql -mv ../../main/resources/db/migration/h2/V0001__R001_Create_schema.sql ../../main/resources/db/migration/h2/V0001__R001_Create_schema.sql.h2 -mv ../../main/resources/db/migration/postgres/V0002__R001_Master_data_pg.sql.pg ../../main/resources/db/migration/postgres/V0002__R001_Master_data_pg.sql -mv ../../main/resources/db/migration/V0002__R001_Master_data.sql ../../main/resources/db/migration/V0002__R001_Master_data.sql.h2 -mv ../../main/resources/db/migration/postgres/V0003__R001_Add_blob_table_and_data_pg.sql.pg ../../main/resources/db/migration/postgres/V0003__R001_Add_blob_table_and_data_pg.sql -mv ../../main/resources/db/migration/V0003__R001_Add_blob_table_and_data.sql ../../main/resources/db/migration/V0003__R001_Add_blob_table_and_data.sql.h2 -mv ../../main/resources/db/migration/postgres/V0004__R001_Add_batch_tables_pg.sql.pg ../../main/resources/db/migration/postgres/V0004__R001_Add_batch_tables_pg.sql -mv ../../main/resources/db/migration/V0004__R001_Add_batch_tables.sql ../../main/resources/db/migration/V0004__R001_Add_batch_tables.sql.h2 -mv ../../test/resources/AllTests/setup/db/V9001_1__Delete_data.sql ../../test/resources/AllTests/setup/db/V9001_1__Delete_data.sql.h2 -mv ../../test/resources/AllTests/setup/db/V9001_1__Delete_data_pg.sql.pg ../../test/resources/AllTests/setup/db/V9001_1__Delete_data_pg.sql -mv ../../test/resources/BillExportJobTest/setup/db/V9901_1__Import_data.sql ../../test/resources/BillExportJobTest/setup/db/V9901_1__Import_data.sql.h2 -mv ../../test/resources/BillExportJobTest/setup/db/V9901_1__Import_data_pg.sql.pg ../../test/resources/BillExportJobTest/setup/db/V9901_1__Import_data_pg.sql -mv ../../test/resources/db/tablemanagement/V0001__R001_Create_schema.sql ../../test/resources/db/tablemanagement/V0001__R001_Create_schema.sql.h2 -mv ../../test/resources/db/tablemanagement/V0001__R001_Create_schema_pg.sql.pg ../../test/resources/db/tablemanagement/V0001__R001_Create_schema_pg.sql -mv ../../test/resources/db/tablemanagement/V0002__R001_Master_data.sql ../../test/resources/db/tablemanagement/V0002__R001_Master_data.sql.h2 -mv ../../test/resources/db/tablemanagement/V0002__R001_Master_data_pg.sql.pg ../../test/resources/db/tablemanagement/V0002__R001_Master_data_pg.sql -mv ../../test/resources/db/tablemanagement/V0003__R001_Add_blob_table_and_data.sql ../../test/resources/db/tablemanagement/V0003__R001_Add_blob_table_and_data.sql.h2 -mv ../../test/resources/db/tablemanagement/V0003__R001_Add_blob_table_and_data_pg.sql.pg ../../test/resources/db/tablemanagement/V0003__R001_Add_blob_table_and_data_pg.sql -mv ../../test/resources/db/tablemanagement/V0004__R001_Add_batch_tables.sql ../../test/resources/db/tablemanagement/V0004__R001_Add_batch_tables.sql.h2 -mv ../../test/resources/db/tablemanagement/V0004__R001_Add_batch_tables_pg.sql.pg ../../test/resources/db/tablemanagement/V0004__R001_Add_batch_tables_pg.sql - diff --git a/samples/pom.xml b/samples/pom.xml deleted file mode 100644 index 1807897c2..000000000 --- a/samples/pom.xml +++ /dev/null @@ -1,94 +0,0 @@ - - - 4.0.0 - - io.oasp.java.dev - oasp4j - dev-SNAPSHOT - - oasp4j-samples - pom - ${project.artifactId} - Sample application of the Open Application Standard Platform for Java (OASP4J). - - - 81 - ${oasp.port.range}81 - ${oasp.port.range}43 - 4.2.0 - io.oasp.module.test.common.api.category.CategorySystemTest - - - - core - server - batch - - - - - - org.flywaydb - flyway-core - ${flyway.version} - - - - org.springframework.boot - spring-boot-dependencies - ${spring.boot.version} - pom - import - - - - io.oasp.java - oasp4j-bom - ${oasp4j.version} - pom - import - - - - - - - junit - junit - test - - - org.slf4j - slf4j-api - - - - - - - maven-surefire-plugin - - ${oasp.test.excluded.groups} - -Xmx1024m -XX:MaxPermSize=256m - - - - - - - - subsystemtest - - io.oasp.module.test.common.api.category.CategorySystemTest - - - - systemtest - - - - - - - \ No newline at end of file diff --git a/samples/server/pom.xml b/samples/server/pom.xml deleted file mode 100644 index 0b8109225..000000000 --- a/samples/server/pom.xml +++ /dev/null @@ -1,146 +0,0 @@ - - - 4.0.0 - - io.oasp.java.dev - oasp4j-samples - dev-SNAPSHOT - - io.oasp.java.samples - oasp4j-sample-server - war - ${project.artifactId} - Server for the restaurant application - a simple example using the Open Application Standard Platform for Java (OASP4J). - - - 1.7 - - - - - ${project.groupId} - oasp4j-sample-core - ${project.version} - - - org.flywaydb - flyway-core - - - - - - jsclient - - - false - - - - - org.codehaus.mojo - exec-maven-plugin - - - npm-install - generate-sources - - exec - - - npm - - install - - ${js.client.dir} - - - - gulp-clean - generate-sources - - exec - - - gulp - - clean - - ${js.client.dir} - - - - gulp-build - generate-sources - - exec - - - gulp - - build:dist - - ${js.client.dir} - - - - gulp-test - test - - exec - - - gulp - - test - - ${js.client.dir} - - - - - - org.apache.maven.plugins - maven-war-plugin - - WEB-INF/classes/config/application.properties - ${project.artifactId} - - - - - - - - - - - ${project.basedir}/src/main/resources - - - ${js.client.dir}/dist - static - - - - - org.springframework.boot - spring-boot-maven-plugin - - io.oasp.gastronomy.restaurant.SpringBootApp - bootified - ${project.artifactId} - - - - - repackage - - - - - - - - diff --git a/samples/server/src/main/client b/samples/server/src/main/client deleted file mode 160000 index 87db7387d..000000000 --- a/samples/server/src/main/client +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 87db7387d99a604a70f9262e12ccc9f5c48efaa1 diff --git a/samples/server/src/main/resources/logback.xml b/samples/server/src/main/resources/logback.xml deleted file mode 100644 index 31c73687f..000000000 --- a/samples/server/src/main/resources/logback.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/samples/server/src/main/webapp/META-INF/context.xml b/samples/server/src/main/webapp/META-INF/context.xml deleted file mode 100644 index aa1313ddb..000000000 --- a/samples/server/src/main/webapp/META-INF/context.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/samples/server/src/main/webapp/WEB-INF/gui/login.jsp b/samples/server/src/main/webapp/WEB-INF/gui/login.jsp deleted file mode 100644 index 97c31125e..000000000 --- a/samples/server/src/main/webapp/WEB-INF/gui/login.jsp +++ /dev/null @@ -1,37 +0,0 @@ -<%@ page import="org.springframework.security.web.csrf.CsrfToken" %> -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> - - -Login Page - - - - - -
${error}
-
- -
${msg}
-
- - -
- - - - - - - - - - - - - -
User:
Password:
-
- - \ No newline at end of file diff --git a/samples/server/src/main/webapp/WEB-INF/web.xml b/samples/server/src/main/webapp/WEB-INF/web.xml deleted file mode 100644 index ff13aa773..000000000 --- a/samples/server/src/main/webapp/WEB-INF/web.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/samples/server/src/main/webapp/index.jsp b/samples/server/src/main/webapp/index.jsp deleted file mode 100644 index 5f4cd3446..000000000 --- a/samples/server/src/main/webapp/index.jsp +++ /dev/null @@ -1,3 +0,0 @@ -<% - response.sendRedirect(request.getContextPath() + "/jsclient/"); -%> \ No newline at end of file