Merge "Updated value qualifier to match DG Builder chart"
authorMandeep Khinda <Mandeep.Khinda@amdocs.com>
Mon, 2 Apr 2018 19:16:22 +0000 (19:16 +0000)
committerGerrit Code Review <gerrit@onap.org>
Mon, 2 Apr 2018 19:16:22 +0000 (19:16 +0000)
295 files changed:
docs/oom_cloud_setup_guide.rst
docs/oom_quickstart_guide.rst
kubernetes/README.md
kubernetes/appc/charts/appc-cdt/.helmignore [new file with mode: 0644]
kubernetes/appc/charts/appc-cdt/Chart.yaml [new file with mode: 0644]
kubernetes/appc/charts/appc-cdt/requirements.yaml [new file with mode: 0644]
kubernetes/appc/charts/appc-cdt/templates/NOTES.txt [new file with mode: 0644]
kubernetes/appc/charts/appc-cdt/templates/deployment.yaml [new file with mode: 0644]
kubernetes/appc/charts/appc-cdt/templates/service.yaml [new file with mode: 0644]
kubernetes/appc/charts/appc-cdt/values.yaml [new file with mode: 0644]
kubernetes/cli/.helmignore [new file with mode: 0644]
kubernetes/cli/Chart.yaml
kubernetes/cli/requirements.yaml [new file with mode: 0644]
kubernetes/cli/templates/NOTES.txt [new file with mode: 0644]
kubernetes/cli/templates/cli-deployment.yaml [deleted file]
kubernetes/cli/templates/deployment.yaml [new file with mode: 0644]
kubernetes/cli/templates/service.yaml [new file with mode: 0644]
kubernetes/cli/values.yaml
kubernetes/config/docker/init/src/config/dcae/common-event/config/console.properties [deleted file]
kubernetes/config/docker/init/src/config/dcae/common-event/config/gui.properties [deleted file]
kubernetes/config/docker/init/src/config/dcae/common-event/config/log4j.properties [deleted file]
kubernetes/config/docker/init/src/config/dcae/common-event/config/manager.properties [deleted file]
kubernetes/config/docker/init/src/config/dcae/dmaapbc/config/conf [deleted file]
kubernetes/config/docker/init/src/config/dcae/dmaapbc/config/console.properties [deleted file]
kubernetes/config/docker/init/src/config/dcae/dmaapbc/config/gui.properties [deleted file]
kubernetes/config/docker/init/src/config/dcae/dmaapbc/config/log4j.properties [deleted file]
kubernetes/config/docker/init/src/config/dcae/dmaapbc/config/manager.properties [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/APPC-CL-0/00000000000000000000.index [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/APPC-CL-0/00000000000000000000.log [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/APPC-CL-1/00000000000000000000.index [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/APPC-CL-1/00000000000000000000.log [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/APPC-TEST1-0/00000000000000000000.index [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/APPC-TEST1-0/00000000000000000000.log [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/APPC-TEST2-0/00000000000000000000.index [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/APPC-TEST2-0/00000000000000000000.log [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/APPC-TEST2-1/00000000000000000000.index [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/APPC-TEST2-1/00000000000000000000.log [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/DCAE-CL-EVENT-0/00000000000000000000.index [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/DCAE-CL-EVENT-0/00000000000000000000.log [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/DCAE-CL-EVENT-1/00000000000000000000.index [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/DCAE-CL-EVENT-1/00000000000000000000.log [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/ECOMP-PORTAL-INBOX-0/00000000000000000000.index [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/ECOMP-PORTAL-INBOX-0/00000000000000000000.log [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/ECOMP-PORTAL-OUTBOX-APP1-0/00000000000000000000.index [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/ECOMP-PORTAL-OUTBOX-APP1-0/00000000000000000000.log [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/ECOMP-PORTAL-OUTBOX-DBC1-0/00000000000000000000.index [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/ECOMP-PORTAL-OUTBOX-DBC1-0/00000000000000000000.log [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/ECOMP-PORTAL-OUTBOX-POL1-0/00000000000000000000.index [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/ECOMP-PORTAL-OUTBOX-POL1-0/00000000000000000000.log [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/ECOMP-PORTAL-OUTBOX-SDC1-0/00000000000000000000.index [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/ECOMP-PORTAL-OUTBOX-SDC1-0/00000000000000000000.log [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/ECOMP-PORTAL-OUTBOX-VID1-0/00000000000000000000.index [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/ECOMP-PORTAL-OUTBOX-VID1-0/00000000000000000000.log [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/PDPD-CONFIGURATION-0/00000000000000000000.index [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/PDPD-CONFIGURATION-0/00000000000000000000.log [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/PDPD-CONFIGURATION-1/00000000000000000000.index [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/PDPD-CONFIGURATION-1/00000000000000000000.log [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/POLICY-CL-MGT-0/00000000000000000000.index [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/POLICY-CL-MGT-0/00000000000000000000.log [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/POLICY-CL-MGT-1/00000000000000000000.index [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/POLICY-CL-MGT-1/00000000000000000000.log [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/SDC-DISTR-NOTIF-TOPIC-SDC-OPENSOURCE-ENV1-0/00000000000000000000.index [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/SDC-DISTR-NOTIF-TOPIC-SDC-OPENSOURCE-ENV1-0/00000000000000000000.log [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/SDC-DISTR-STATUS-TOPIC-SDC-OPENSOURCE-ENV1-0/00000000000000000000.index [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/SDC-DISTR-STATUS-TOPIC-SDC-OPENSOURCE-ENV1-0/00000000000000000000.log [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/msgrtr.apinode.metrics.dmaap-0/00000000000000000000.index [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/msgrtr.apinode.metrics.dmaap-0/00000000000000000000.log [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/msgrtr.apinode.metrics.dmaap-1/00000000000000000000.index [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/msgrtr.apinode.metrics.dmaap-1/00000000000000000000.log [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/recovery-point-offset-checkpoint [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/replication-offset-checkpoint [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/unauthenticated.SEC_MEASUREMENT_OUTPUT-0/00000000000000000000.index [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/unauthenticated.SEC_MEASUREMENT_OUTPUT-0/00000000000000000000.log [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/unauthenticated.SEC_MEASUREMENT_OUTPUT-1/00000000000000000000.index [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/unauthenticated.SEC_MEASUREMENT_OUTPUT-1/00000000000000000000.log [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/unauthenticated.TCA_EVENT_OUTPUT-0/00000000000000000000.index [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/unauthenticated.TCA_EVENT_OUTPUT-0/00000000000000000000.log [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/unauthenticated.TCA_EVENT_OUTPUT-1/00000000000000000000.index [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/unauthenticated.TCA_EVENT_OUTPUT-1/00000000000000000000.log [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-zookeeper/version-2/log.1 [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-zookeeper/version-2/log.103 [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-zookeeper/version-2/log.125 [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/start-kafka.sh [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dmaap/MsgRtrApi.properties [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dmaap/cadi.properties [deleted file]
kubernetes/config/docker/init/src/config/dcae/message-router/dmaap/mykey [deleted file]
kubernetes/config/docker/init/src/config/dcae/ves/console.properties [deleted file]
kubernetes/config/docker/init/src/config/dcae/ves/gui.properties [deleted file]
kubernetes/config/docker/init/src/config/dcae/ves/log4j.properties [deleted file]
kubernetes/config/docker/init/src/config/dcae/ves/makefile [deleted file]
kubernetes/config/docker/init/src/config/dcae/ves/manager.properties [deleted file]
kubernetes/config/docker/init/src/config/dcae/ves/pw.sh.sh [deleted file]
kubernetes/config/docker/init/src/config/dcae/ves/server.properties [deleted file]
kubernetes/consul/Chart.yaml
kubernetes/consul/charts/consul-server/Chart.yaml [new file with mode: 0644]
kubernetes/consul/charts/consul-server/requirements.yaml [new file with mode: 0644]
kubernetes/consul/charts/consul-server/templates/NOTES.txt [new file with mode: 0644]
kubernetes/consul/charts/consul-server/templates/deployment.yaml [moved from kubernetes/consul/templates/consul-server-deployment.yaml with 54% similarity]
kubernetes/consul/charts/consul-server/templates/service.yaml [new file with mode: 0644]
kubernetes/consul/charts/consul-server/values.yaml [new file with mode: 0644]
kubernetes/consul/requirements.yaml [new file with mode: 0644]
kubernetes/consul/templates/configmap.yaml [moved from kubernetes/consul/templates/consul-agent-configmap.yaml with 67% similarity]
kubernetes/consul/templates/consul-server-service.yaml [deleted file]
kubernetes/consul/templates/deployment.yaml [moved from kubernetes/consul/templates/consul-agent-deployment.yaml with 59% similarity]
kubernetes/consul/templates/secrets.yaml [new file with mode: 0644]
kubernetes/consul/values.yaml
kubernetes/msb/charts/kube2msb/templates/deployment.yaml
kubernetes/onap/requirements.yaml
kubernetes/onap/resources/environments/dev.yaml
kubernetes/onap/values.yaml
kubernetes/policy/Chart.yaml
kubernetes/policy/charts/brmsgw/Chart.yaml
kubernetes/policy/charts/brmsgw/resources/config/pe/brmsgw.conf
kubernetes/policy/charts/brmsgw/templates/NOTES.txt
kubernetes/policy/charts/brmsgw/values.yaml
kubernetes/policy/charts/drools/Chart.yaml
kubernetes/policy/charts/drools/charts/nexus/Chart.yaml
kubernetes/policy/charts/drools/charts/nexus/values.yaml
kubernetes/policy/charts/drools/resources/config/drools/settings.xml
kubernetes/policy/charts/drools/resources/config/opt/policy/config/drools/base.conf
kubernetes/policy/charts/drools/templates/NOTES.txt
kubernetes/policy/charts/drools/templates/statefulset.yaml [moved from kubernetes/policy/charts/drools/templates/deployment.yaml with 96% similarity]
kubernetes/policy/charts/drools/values.yaml
kubernetes/policy/charts/mariadb/Chart.yaml
kubernetes/policy/charts/mariadb/templates/pv.yaml
kubernetes/policy/charts/pdp/Chart.yaml
kubernetes/policy/charts/pdp/resources/config/pe/pdp.conf
kubernetes/policy/charts/pdp/resources/config/pe/pdplp.conf
kubernetes/policy/charts/pdp/templates/NOTES.txt
kubernetes/policy/charts/pdp/templates/service.yaml
kubernetes/policy/charts/pdp/values.yaml
kubernetes/policy/charts/policy-common/Chart.yaml
kubernetes/policy/charts/policy-common/resources/config/pe/base.conf
kubernetes/policy/charts/policy-common/templates/NOTES.txt
kubernetes/policy/charts/policy-common/values.yaml
kubernetes/policy/requirements.yaml
kubernetes/policy/resources/config/pe/console.conf
kubernetes/policy/resources/config/pe/pap.conf
kubernetes/policy/resources/config/pe/paplp.conf
kubernetes/policy/resources/config/pe/push-policies.sh
kubernetes/policy/templates/NOTES.txt
kubernetes/policy/values.yaml
kubernetes/portal/.helmignore
kubernetes/portal/Chart.yaml
kubernetes/portal/charts/portal-app/.helmignore [new file with mode: 0644]
kubernetes/portal/charts/portal-app/Chart.yaml [new file with mode: 0644]
kubernetes/portal/charts/portal-app/resources/config/deliveries/properties/ONAPPORTAL/fusion.properties [moved from kubernetes/portal/resources/config/portal-fe/webapps/etc/ONAPPORTAL/fusion.properties with 100% similarity]
kubernetes/portal/charts/portal-app/resources/config/deliveries/properties/ONAPPORTAL/logback.xml [moved from kubernetes/portal/resources/config/log/portal/onapportal/logback.xml with 99% similarity]
kubernetes/portal/charts/portal-app/resources/config/deliveries/properties/ONAPPORTAL/music.properties [new file with mode: 0644]
kubernetes/portal/charts/portal-app/resources/config/deliveries/properties/ONAPPORTAL/openid-connect.properties [moved from kubernetes/portal/resources/config/portal-fe/webapps/etc/ONAPPORTAL/openid-connect.properties with 100% similarity]
kubernetes/portal/charts/portal-app/resources/config/deliveries/properties/ONAPPORTAL/portal.properties [moved from kubernetes/portal/resources/config/portal-fe/webapps/etc/ONAPPORTAL/portal.properties with 94% similarity]
kubernetes/portal/charts/portal-app/resources/config/deliveries/properties/ONAPPORTAL/system.properties [moved from kubernetes/portal/resources/config/portal-fe/webapps/etc/ONAPPORTAL/system.properties with 80% similarity]
kubernetes/portal/charts/portal-app/templates/NOTES.txt [new file with mode: 0644]
kubernetes/portal/charts/portal-app/templates/configmap.yaml [moved from kubernetes/sdnc/templates/sdnc-data-storageclass.yaml with 69% similarity]
kubernetes/portal/charts/portal-app/templates/deployment.yaml [new file with mode: 0644]
kubernetes/portal/charts/portal-app/templates/service.yaml [new file with mode: 0644]
kubernetes/portal/charts/portal-app/values.yaml [new file with mode: 0644]
kubernetes/portal/charts/portal-cassandra/.helmignore [new file with mode: 0644]
kubernetes/portal/charts/portal-cassandra/Chart.yaml [new file with mode: 0644]
kubernetes/portal/charts/portal-cassandra/resources/config/cassandra/docker-entrypoint-initdb.d/portal.cql [new file with mode: 0644]
kubernetes/portal/charts/portal-cassandra/resources/config/cassandra/docker-entrypoint-initdb.d/portalsdk.cql [new file with mode: 0644]
kubernetes/portal/charts/portal-cassandra/templates/NOTES.txt [new file with mode: 0644]
kubernetes/portal/charts/portal-cassandra/templates/configmap.yaml [new file with mode: 0644]
kubernetes/portal/charts/portal-cassandra/templates/deployment.yaml [new file with mode: 0644]
kubernetes/portal/charts/portal-cassandra/templates/secrets.yaml [new file with mode: 0644]
kubernetes/portal/charts/portal-cassandra/templates/service.yaml [new file with mode: 0644]
kubernetes/portal/charts/portal-cassandra/values.yaml [new file with mode: 0644]
kubernetes/portal/charts/portal-mariadb/.helmignore [new file with mode: 0644]
kubernetes/portal/charts/portal-mariadb/Chart.yaml [new file with mode: 0644]
kubernetes/portal/charts/portal-mariadb/resources/config/mariadb/docker-entrypoint-initdb.d/Apps_Users_OnBoarding_Script.sql [new file with mode: 0644]
kubernetes/portal/charts/portal-mariadb/templates/NOTES.txt [new file with mode: 0644]
kubernetes/portal/charts/portal-mariadb/templates/configmap.yaml [new file with mode: 0644]
kubernetes/portal/charts/portal-mariadb/templates/deployment.yaml [new file with mode: 0644]
kubernetes/portal/charts/portal-mariadb/templates/pv.yaml [new file with mode: 0644]
kubernetes/portal/charts/portal-mariadb/templates/pvc.yaml [new file with mode: 0644]
kubernetes/portal/charts/portal-mariadb/templates/secrets.yaml [new file with mode: 0644]
kubernetes/portal/charts/portal-mariadb/templates/service.yaml [new file with mode: 0644]
kubernetes/portal/charts/portal-mariadb/values.yaml [new file with mode: 0644]
kubernetes/portal/charts/portal-sdk/.helmignore [new file with mode: 0644]
kubernetes/portal/charts/portal-sdk/Chart.yaml [new file with mode: 0644]
kubernetes/portal/charts/portal-sdk/resources/config/deliveries/properties/ONAPPORTALSDK/fusion.properties [moved from kubernetes/portal/resources/config/portal-fe/webapps/etc/ONAPPORTALSDK/fusion.properties with 98% similarity]
kubernetes/portal/charts/portal-sdk/resources/config/deliveries/properties/ONAPPORTALSDK/logback.xml [moved from kubernetes/portal/resources/config/log/portal/onapportalsdk/logback.xml with 52% similarity]
kubernetes/portal/charts/portal-sdk/resources/config/deliveries/properties/ONAPPORTALSDK/music.properties [new file with mode: 0644]
kubernetes/portal/charts/portal-sdk/resources/config/deliveries/properties/ONAPPORTALSDK/portal.properties [moved from kubernetes/portal/resources/config/portal-fe/webapps/etc/ONAPPORTALSDK/portal.properties with 97% similarity]
kubernetes/portal/charts/portal-sdk/resources/config/deliveries/properties/ONAPPORTALSDK/system.properties [moved from kubernetes/portal/resources/config/portal-fe/webapps/etc/ONAPPORTALSDK/system.properties with 87% similarity]
kubernetes/portal/charts/portal-sdk/templates/NOTES.txt [new file with mode: 0644]
kubernetes/portal/charts/portal-sdk/templates/configmap.yaml [new file with mode: 0644]
kubernetes/portal/charts/portal-sdk/templates/deployment.yaml [new file with mode: 0644]
kubernetes/portal/charts/portal-sdk/templates/service.yaml [new file with mode: 0644]
kubernetes/portal/charts/portal-sdk/values.yaml [new file with mode: 0644]
kubernetes/portal/charts/portal-widget/.helmignore [new file with mode: 0644]
kubernetes/portal/charts/portal-widget/Chart.yaml [new file with mode: 0644]
kubernetes/portal/charts/portal-widget/resources/config/deliveries/properties/ONAPWIDGETMS/application.properties [moved from kubernetes/portal/resources/config/portal-fe/webapps/etc/ONAPWIDGETMS/application.properties with 88% similarity]
kubernetes/portal/charts/portal-widget/resources/config/deliveries/properties/ONAPWIDGETMS/application.yml [new file with mode: 0644]
kubernetes/portal/charts/portal-widget/templates/NOTES.txt [new file with mode: 0644]
kubernetes/portal/charts/portal-widget/templates/configmap.yaml [new file with mode: 0644]
kubernetes/portal/charts/portal-widget/templates/deployment.yaml [new file with mode: 0644]
kubernetes/portal/charts/portal-widget/templates/service.yaml [new file with mode: 0644]
kubernetes/portal/charts/portal-widget/values.yaml [new file with mode: 0644]
kubernetes/portal/charts/portal-zookeeper/.helmignore [new file with mode: 0644]
kubernetes/portal/charts/portal-zookeeper/Chart.yaml [new file with mode: 0644]
kubernetes/portal/charts/portal-zookeeper/templates/NOTES.txt [new file with mode: 0644]
kubernetes/portal/charts/portal-zookeeper/templates/deployment.yaml [new file with mode: 0644]
kubernetes/portal/charts/portal-zookeeper/templates/service.yaml [new file with mode: 0644]
kubernetes/portal/charts/portal-zookeeper/values.yaml [new file with mode: 0644]
kubernetes/portal/requirements.yaml [new file with mode: 0644]
kubernetes/portal/resources/config/mariadb/oom_updates.sql [deleted file]
kubernetes/portal/resources/scripts/update_hosts.sh [deleted file]
kubernetes/portal/resources/vnc/init_profile/profiles.ini [deleted file]
kubernetes/portal/templates/all-services.yaml [deleted file]
kubernetes/portal/templates/configmap.yaml [moved from kubernetes/sdnc/templates/sdnc-conf-configmap.yaml with 77% similarity]
kubernetes/portal/templates/portal-apps-configmap.yaml [deleted file]
kubernetes/portal/templates/portal-apps-deployment.yaml [deleted file]
kubernetes/portal/templates/portal-logs-configmap.yaml [deleted file]
kubernetes/portal/templates/portal-mariadb-deployment.yaml [deleted file]
kubernetes/portal/templates/portal-pv-pvc.yaml [deleted file]
kubernetes/portal/templates/portal-vnc-dep.yaml [deleted file]
kubernetes/portal/templates/portal-widgets-deployment.yaml [deleted file]
kubernetes/portal/values.yaml
kubernetes/sdc/Chart.yaml
kubernetes/sdc/charts/sdc-be/Chart.yaml
kubernetes/sdc/charts/sdc-be/templates/deployment.yaml
kubernetes/sdc/charts/sdc-be/templates/job.yaml
kubernetes/sdc/charts/sdc-be/templates/service.yaml
kubernetes/sdc/charts/sdc-be/values.yaml
kubernetes/sdc/charts/sdc-cs/Chart.yaml
kubernetes/sdc/charts/sdc-cs/templates/deployment.yaml
kubernetes/sdc/charts/sdc-cs/templates/job.yaml
kubernetes/sdc/charts/sdc-cs/templates/pv.yaml
kubernetes/sdc/charts/sdc-cs/templates/pvc.yaml
kubernetes/sdc/charts/sdc-cs/templates/secrets.yaml
kubernetes/sdc/charts/sdc-cs/templates/service.yaml
kubernetes/sdc/charts/sdc-cs/values.yaml
kubernetes/sdc/charts/sdc-es/Chart.yaml
kubernetes/sdc/charts/sdc-es/templates/deployment.yaml
kubernetes/sdc/charts/sdc-es/templates/job.yaml
kubernetes/sdc/charts/sdc-es/templates/pv.yaml
kubernetes/sdc/charts/sdc-es/templates/pvc.yaml
kubernetes/sdc/charts/sdc-es/templates/service.yaml
kubernetes/sdc/charts/sdc-es/values.yaml
kubernetes/sdc/charts/sdc-fe/Chart.yaml
kubernetes/sdc/charts/sdc-fe/templates/deployment.yaml
kubernetes/sdc/charts/sdc-fe/templates/service.yaml
kubernetes/sdc/charts/sdc-fe/values.yaml
kubernetes/sdc/charts/sdc-kb/Chart.yaml
kubernetes/sdc/charts/sdc-kb/templates/deployment.yaml
kubernetes/sdc/charts/sdc-kb/templates/service.yaml
kubernetes/sdc/charts/sdc-kb/values.yaml
kubernetes/sdc/requirements.yaml
kubernetes/sdc/templates/configmap.yaml
kubernetes/sdc/values.yaml
kubernetes/sdnc/.helmignore [new file with mode: 0644]
kubernetes/sdnc/Chart.yaml
kubernetes/sdnc/charts/dmaap-listener/Chart.yaml [new file with mode: 0644]
kubernetes/sdnc/charts/dmaap-listener/requirements.yaml [new file with mode: 0644]
kubernetes/sdnc/charts/dmaap-listener/resources/config/dhcpalert.properties [moved from kubernetes/sdnc/resources/config/dmaap/dhcpalert.properties with 88% similarity]
kubernetes/sdnc/charts/dmaap-listener/templates/configmap.yaml [moved from kubernetes/sdnc/templates/dmaap-deployment-configmap.yaml with 80% similarity]
kubernetes/sdnc/charts/dmaap-listener/templates/deployment.yaml [moved from kubernetes/sdnc/templates/dmaap-deployment.yaml with 51% similarity]
kubernetes/sdnc/charts/dmaap-listener/templates/service.yaml [moved from kubernetes/sdnc/templates/mysql-configmap.yaml with 64% similarity]
kubernetes/sdnc/charts/dmaap-listener/values.yaml [new file with mode: 0644]
kubernetes/sdnc/charts/sdnc-portal/.helmignore [new file with mode: 0644]
kubernetes/sdnc/charts/sdnc-portal/Chart.yaml [new file with mode: 0644]
kubernetes/sdnc/charts/sdnc-portal/requirements.yaml [new file with mode: 0644]
kubernetes/sdnc/charts/sdnc-portal/resources/config/admportal.json [moved from kubernetes/sdnc/resources/config/conf/admportal.json with 94% similarity, mode: 0644]
kubernetes/sdnc/charts/sdnc-portal/templates/configmap.yaml [new file with mode: 0644]
kubernetes/sdnc/charts/sdnc-portal/templates/deployment.yaml [new file with mode: 0644]
kubernetes/sdnc/charts/sdnc-portal/templates/secrets.yaml [new file with mode: 0644]
kubernetes/sdnc/charts/sdnc-portal/templates/service.yaml [new file with mode: 0644]
kubernetes/sdnc/charts/sdnc-portal/values.yaml [new file with mode: 0644]
kubernetes/sdnc/charts/ueb-listener/Chart.yaml [new file with mode: 0644]
kubernetes/sdnc/charts/ueb-listener/requirements.yaml [new file with mode: 0644]
kubernetes/sdnc/charts/ueb-listener/resources/config/ueb-listener.properties [moved from kubernetes/sdnc/resources/config/ueb/ueb-listener.properties with 91% similarity]
kubernetes/sdnc/charts/ueb-listener/templates/configmap.yaml [moved from kubernetes/sdnc/templates/ueb-deployment-configmap.yaml with 81% similarity]
kubernetes/sdnc/charts/ueb-listener/templates/deployment.yaml [moved from kubernetes/sdnc/templates/ueb-deployment.yaml with 53% similarity]
kubernetes/sdnc/charts/ueb-listener/templates/service.yaml [moved from kubernetes/cli/templates/all-service.yaml with 64% similarity]
kubernetes/sdnc/charts/ueb-listener/values.yaml [new file with mode: 0644]
kubernetes/sdnc/requirements.yaml [new file with mode: 0644]
kubernetes/sdnc/resources/config/bin/installSdncDb.sh [new file with mode: 0644]
kubernetes/sdnc/resources/config/bin/startODL.sh [new file with mode: 0755]
kubernetes/sdnc/resources/config/conf/aaiclient.properties
kubernetes/sdnc/resources/config/conf/dblib.properties [new file with mode: 0644]
kubernetes/sdnc/resources/config/conf/svclogic.properties [new file with mode: 0644]
kubernetes/sdnc/resources/config/log/org.ops4j.pax.logging.cfg
kubernetes/sdnc/templates/all-services.yaml [deleted file]
kubernetes/sdnc/templates/configmap.yaml [new file with mode: 0644]
kubernetes/sdnc/templates/db-statefulset.yaml [deleted file]
kubernetes/sdnc/templates/dgbuilder-deployment.yaml [deleted file]
kubernetes/sdnc/templates/nfs-provisoner-deployment.yaml [deleted file]
kubernetes/sdnc/templates/sdnc-log-configmap.yaml [deleted file]
kubernetes/sdnc/templates/sdnc-statefulset.yaml [deleted file]
kubernetes/sdnc/templates/secrets.yaml [new file with mode: 0644]
kubernetes/sdnc/templates/service.yaml [new file with mode: 0644]
kubernetes/sdnc/templates/statefulset.yaml [new file with mode: 0644]
kubernetes/sdnc/templates/web-deployment.yaml [deleted file]
kubernetes/sdnc/values.yaml

index 9cccc91..3de125b 100644 (file)
@@ -2,6 +2,16 @@
 .. http://creativecommons.org/licenses/by/4.0
 .. Copyright 2018 Amdocs, Bell Canada
 
+.. Links
+.. _Microsoft Azure: https://wiki.onap.org/display/DW/ONAP+on+Kubernetes+on+Microsoft+Azure
+.. _Amazon AWS: https://wiki.onap.org/display/DW/ONAP+on+Kubernetes+on+Amazon+EC2
+.. _Google GCE: https://wiki.onap.org/display/DW/ONAP+on+Kubernetes+on+Google+Compute+Engine
+.. _VMware VIO: https://wiki.onap.org/display/DW/ONAP+on+VMware+Integrated+OpenStack+-+Container+Orchestration
+.. _OpenStack: https://wiki.onap.org/display/DW/ONAP+on+Kubernetes+on+OpenStack?src=contextnavpagetreemode
+.. _Setting Up Kubernetes with Rancher: https://wiki.onap.org/display/DW/ONAP+on+Kubernetes+on+Rancher
+.. _Setting Up Kubernetes with Kubeadm: https://wiki.onap.org/display/DW/Deploying+Kubernetes+Cluster+with+kubeadm
+.. _Setting Up Kubernetes with Cloudify: https://wiki.onap.org/display/DW/ONAP+on+Kubernetes+on+Cloudify
+
 .. figure:: oomLogoV2-medium.png
    :align: right
 
@@ -21,11 +31,14 @@ environment, the Kubernetes environment may be used for an extended period of
 time, possibly spanning multiple ONAP releases.
 
 .. note::
-  Inclusion of a cloud technology or provider in this guide does not imply any
-  endorsement of this technology.
+  Inclusion of a cloud technology or provider in this guide does not imply an
+  endorsement.
 
 .. _Kubernetes: https://kubernetes.io/
 
+Software Requirements
+=====================
+
 The versions of Kubernetes that are supported by OOM are as follows:
 
 .. table:: OOM Software Requirements
@@ -37,9 +50,20 @@ The versions of Kubernetes that are supported by OOM are as follows:
   beijing/master  1.8.5       2.7.x  1.8.5    1.12.x
   ==============  ==========  =====  =======  ========
 
-Minimum Hardware Requirements
-=============================
+Minimum Hardware Configuration
+==============================
+
+The minimum hardware requirements are provided below.  Note that although ONAP
+may operate on a single node as described production deployments will need at
+least three if not six nodes to ensure there is no single point of failure.
 
+.. table:: OOM Hardware Requirements
+
+  =====  =====  ======  ====================
+  RAM    HD     vCores  Ports
+  =====  =====  ======  ====================
+  128GB  160GB  16      0.0.0.0/0 (all open)
+  =====  =====  ======  ====================
 
 Cloud Installation
 ==================
@@ -47,18 +71,17 @@ Cloud Installation
 #. OOM supports deployment on major public clouds. The following guides
    provide instructions on how to deploy ONAP on these clouds:
 
-   - Microsoft Azure,
-   - Amazon AWS,
-   - Google GCD,
-   - VMware VIO,
+   - `Microsoft Azure`_,
+   - `Amazon AWS`_,
+   - `Google GCE`_,
+   - `VMware VIO`_,
    - IBM, and
-   - Openstack
+   - `Openstack`_.
 
 #. Alternatively, OOM can be deployed on a private set of physical hosts or VMs
    (or even a combination of the two). The following guides describe how to
    create a Kubernetes cluster with popular tools:
 
-   - Setting up Kubernetes with Rancher (recommended)
-   - Setting up Kubernetes with Kubeadm
-   - Setting up Kubernetes with Cloudify
-
+   - `Setting up Kubernetes with Rancher`_ (recommended)
+   - `Setting up Kubernetes with Kubeadm`_
+   - `Setting up Kubernetes with Cloudify`_
index 879bbb9..eb5d373 100644 (file)
@@ -166,7 +166,7 @@ follows::
 **Step 7.** Once the repo is setup, installation of ONAP can be done with a
 single command::
 
-  > helm install local/onap -name dev --namespace onap
+  > helm install local/onap -n dev --namespace onap
 
 .. note::
   The requirement for the use of the `onap` namespace will be lifted once the OOM team completes their Beijing deveivers.
index 9c315cb..9d8d4cc 100644 (file)
@@ -18,7 +18,7 @@ Step 1. Clone the OOM repository from ONAP gerrit:
 > cd oom/kubernetes
 ```
 
-Step 2. Customize the oom/kubernetes/onap parent chart, like the values.yaml file, to suit your deployment. You may want to selectively enable or disable ONAP components by changing the subchart **enabled** flags to *true* or *false*.
+Step 2. Customize the oom/kubernetes/onap parent chart, like the values.yaml file, to suit your deployment. You may want to selectively enable or disable ONAP components by changing the subchart **enabled** flags to *true* or *false*.  The .yaml file for OpenStackEncryptedPassword should be the MSO ecnrypted value of the openstack tenant password
 ```
 Example:
 ...
@@ -32,8 +32,8 @@ so: # Service Orchestrator
   enabled: true
 ...
 ```
-
 Step 3. To setup a local Helm repository to serve up the local ONAP charts:
+        [Note: ensure helm init has been executed on the node, or run helm init --client-only]
 ```
 > helm serve &
 ```
@@ -64,7 +64,7 @@ Setup of this Helm repository is a one time activity. If you make changes to you
 
 Step 6. Once the repo is setup, installation of ONAP can be done with a single command:
 ```
-> helm install local/onap -name dev --namespace onap
+> helm install local/onap --name dev --namespace onap
 ```
 **Note:** the **--namespace onap** is currently required while all onap helm charts are migrated to version 2.0. After this activity is complete, namespaces will be optional.
 
diff --git a/kubernetes/appc/charts/appc-cdt/.helmignore b/kubernetes/appc/charts/appc-cdt/.helmignore
new file mode 100644 (file)
index 0000000..f0c1319
--- /dev/null
@@ -0,0 +1,21 @@
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
diff --git a/kubernetes/appc/charts/appc-cdt/Chart.yaml b/kubernetes/appc/charts/appc-cdt/Chart.yaml
new file mode 100644 (file)
index 0000000..b7720f7
--- /dev/null
@@ -0,0 +1,4 @@
+apiVersion: v1
+description: ONAP APPC Self Service Controller Design Tool
+name: appc-cdt
+version: 2.0.0
diff --git a/kubernetes/appc/charts/appc-cdt/requirements.yaml b/kubernetes/appc/charts/appc-cdt/requirements.yaml
new file mode 100644 (file)
index 0000000..8cddd30
--- /dev/null
@@ -0,0 +1,4 @@
+dependencies:
+  - name: common
+    version: ~2.0.0
+    repository: '@local'
diff --git a/kubernetes/appc/charts/appc-cdt/templates/NOTES.txt b/kubernetes/appc/charts/appc-cdt/templates/NOTES.txt
new file mode 100644 (file)
index 0000000..c4b9989
--- /dev/null
@@ -0,0 +1,19 @@
+1. Get the application URL by running these commands:
+{{- if .Values.ingress.enabled }}
+{{- range .Values.ingress.hosts }}
+  http://{{ . }}
+{{- end }}
+{{- else if contains "NodePort" .Values.service.type }}
+  export NODE_PORT=$(kubectl get --namespace {{ include "common.namespace" . }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "common.fullname" . }})
+  export NODE_IP=$(kubectl get nodes --namespace {{ include "common.namespace" . }} -o jsonpath="{.items[0].status.addresses[0].address}")
+  echo http://$NODE_IP:$NODE_PORT
+{{- else if contains "LoadBalancer" .Values.service.type }}
+     NOTE: It may take a few minutes for the LoadBalancer IP to be available.
+           You can watch the status of by running 'kubectl get svc -w {{ include "common.fullname" . }}'
+  export SERVICE_IP=$(kubectl get svc --namespace {{ include "common.namespace" . }} {{ include "common.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
+  echo http://$SERVICE_IP:{{ .Values.service.externalPort }}
+{{- else if contains "ClusterIP" .Values.service.type }}
+  export POD_NAME=$(kubectl get pods --namespace {{ include "common.namespace" . }} -l "app={{ include "common.fullname" . }},release={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
+  echo "Visit http://127.0.0.1:8080 to use your application"
+  kubectl port-forward $POD_NAME 8080:{{ .Values.service.internalPort }}
+{{- end }}
diff --git a/kubernetes/appc/charts/appc-cdt/templates/deployment.yaml b/kubernetes/appc/charts/appc-cdt/templates/deployment.yaml
new file mode 100644 (file)
index 0000000..a250699
--- /dev/null
@@ -0,0 +1,61 @@
+apiVersion: extensions/v1beta1
+kind: Deployment
+metadata:
+  name: {{ include "common.fullname" . }}
+  namespace: {{ include "common.namespace" . }}
+  labels:
+    app: {{ include "common.name" . }}
+    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
+    release: {{ .Release.Name }}
+    heritage: {{ .Release.Service }}
+spec:
+  replicas: {{ .Values.replicaCount }}
+  template:
+    metadata:
+      labels:
+        app: {{ include "common.name" . }}
+        release: {{ .Release.Name }}
+    spec:
+      initContainers:
+      containers:
+        - name: {{ include "common.name" . }}
+          image: "{{ .Values.global.repository | default .Values.repository }}/{{ .Values.image }}"
+          imagePullPolicy: {{ .Values.global.pullPolicy | default .Values.pullPolicy }}
+          ports:
+          - containerPort: {{ .Values.service.internalPort }}
+            name: {{ .Values.service.name }}
+          # disable liveness probe when breakpoints set in debugger
+          # so K8s doesn't restart unresponsive container
+          {{- if eq .Values.liveness.enabled true }}
+          livenessProbe:
+            tcpSocket:
+              port: {{ .Values.service.internalPort }}
+            initialDelaySeconds: {{ .Values.liveness.initialDelaySeconds }}
+            periodSeconds: {{ .Values.liveness.periodSeconds }}
+          {{ end -}}
+          readinessProbe:
+            tcpSocket:
+              port: {{ .Values.service.internalPort }}
+            initialDelaySeconds: {{ .Values.readiness.initialDelaySeconds }}
+            periodSeconds: {{ .Values.readiness.periodSeconds }}
+          env:
+          volumeMounts:
+          - mountPath: /etc/localtime
+            name: localtime
+            readOnly: true
+          resources:
+{{ toYaml .Values.resources | indent 12 }}
+        {{- if .Values.nodeSelector }}
+        nodeSelector:
+{{ toYaml .Values.nodeSelector | indent 10 }}
+        {{- end -}}
+        {{- if .Values.affinity }}
+        affinity:
+{{ toYaml .Values.affinity | indent 10 }}
+        {{- end }}
+      volumes:
+        - name: localtime
+          hostPath:
+            path: /etc/localtime
+      imagePullSecrets:
+      - name: "{{ include "common.namespace" . }}-docker-registry-key"
diff --git a/kubernetes/appc/charts/appc-cdt/templates/service.yaml b/kubernetes/appc/charts/appc-cdt/templates/service.yaml
new file mode 100644 (file)
index 0000000..86442a2
--- /dev/null
@@ -0,0 +1,26 @@
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ .Values.service.name }}
+  namespace: {{ include "common.namespace" . }}
+  labels:
+    app: {{ include "common.name" . }}
+    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
+    release: {{ .Release.Name }}
+    heritage: {{ .Release.Service }}
+  annotations:
+spec:
+  type: {{ .Values.service.type }}
+  ports:
+    {{if eq .Values.service.type "NodePort" -}}
+    - port: {{ .Values.service.externalPort }}
+      nodePort: {{ .Values.global.nodePortPrefix | default .Values.nodePortPrefix }}{{ .Values.service.nodePort }}
+      name: {{ .Values.service.name }}
+    {{- else -}}
+    - port: {{ .Values.service.externalPort }}
+      targetPort: {{ .Values.service.internalPort }}
+      name: {{ .Values.service.name }}
+    {{- end}}
+  selector:
+    app: {{ include "common.name" . }}
+    release: {{ .Release.Name }}
diff --git a/kubernetes/appc/charts/appc-cdt/values.yaml b/kubernetes/appc/charts/appc-cdt/values.yaml
new file mode 100644 (file)
index 0000000..f09c736
--- /dev/null
@@ -0,0 +1,65 @@
+#################################################################
+# Global configuration defaults.
+#################################################################
+global:
+  nodePortPrefix: 302
+  repositorySecret: eyJuZXh1czMub25hcC5vcmc6MTAwMDEiOnsidXNlcm5hbWUiOiJkb2NrZXIiLCJwYXNzd29yZCI6ImRvY2tlciIsImVtYWlsIjoiQCIsImF1dGgiOiJaRzlqYTJWeU9tUnZZMnRsY2c9PSJ9fQ==
+
+#################################################################
+# Application configuration defaults.
+#################################################################
+# application image
+repository: nexus3.onap.org:10001
+image: onap/appc-cdt-image:1.3.0-SNAPSHOT-latest
+pullPolicy: Always
+
+# application configuration
+config: {}
+
+# default number of instances
+replicaCount: 1
+
+nodeSelector: {}
+
+affinity: {}
+
+# probe configuration parameters
+liveness:
+  initialDelaySeconds: 10
+  periodSeconds: 10
+  # necessary to disable liveness probe when setting breakpoints
+  # in debugger so K8s doesn't restart unresponsive container
+  enabled: true
+
+readiness:
+  initialDelaySeconds: 10
+  periodSeconds: 10
+
+service:
+  type: NodePort
+  name: appc-cdt
+  externalPort: 80
+  internalPort: 80
+  nodePort: 89
+
+ingress:
+  enabled: false
+
+resources: {}
+  # We usually recommend not to specify default resources and to leave this as a conscious
+  # choice for the user. This also increases chances charts run on environments with little
+  # resources, such as Minikube. If you do want to specify resources, uncomment the following
+  # lines, adjust them as necessary, and remove the curly braces after 'resources:'.
+  #
+  # Example:
+  # Configure resource requests and limits
+  # ref: http://kubernetes.io/docs/user-guide/compute-resources/
+  # Minimum memory for development is 2 CPU cores and 4GB memory
+  # Minimum memory for production is 4 CPU cores and 8GB memory
+#resources:
+#  limits:
+#    cpu: 2
+#    memory: 4Gi
+#  requests:
+#    cpu: 2
+#    memory: 4Gi
diff --git a/kubernetes/cli/.helmignore b/kubernetes/cli/.helmignore
new file mode 100644 (file)
index 0000000..f0c1319
--- /dev/null
@@ -0,0 +1,21 @@
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
index 6befea7..0eb4ce6 100644 (file)
@@ -13,6 +13,6 @@
 # limitations under the License.
 
 apiVersion: v1
-description: A Helm chart for Kubernetes
+description: ONAP Command Line Interface
 name: cli
-version: 0.1.0
+version: 2.0.0
diff --git a/kubernetes/cli/requirements.yaml b/kubernetes/cli/requirements.yaml
new file mode 100644 (file)
index 0000000..f639633
--- /dev/null
@@ -0,0 +1,21 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+dependencies:
+  - name: common
+    version: ~2.0.0
+    # local reference to common chart, as it is
+    # a part of this chart's package and will not
+    # be published independently to a repo (at this point)
+    repository: '@local'
diff --git a/kubernetes/cli/templates/NOTES.txt b/kubernetes/cli/templates/NOTES.txt
new file mode 100644 (file)
index 0000000..91d8ed4
--- /dev/null
@@ -0,0 +1,19 @@
+1. Get the application URL by running these commands:
+{{- if .Values.ingress.enabled }}
+{{- range .Values.ingress.hosts }}
+  http://{{ . }}
+{{- end }}
+{{- else if contains "NodePort" .Values.service.type }}
+  export NODE_PORT=$(kubectl get --namespace {{ include "common.namespace" . }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "common.name" . }})
+  export NODE_IP=$(kubectl get nodes --namespace {{ include "common.namespace" . }} -o jsonpath="{.items[0].status.addresses[0].address}")
+  echo http://$NODE_IP:$NODE_PORT
+{{- else if contains "LoadBalancer" .Values.service.type }}
+     NOTE: It may take a few minutes for the LoadBalancer IP to be available.
+           You can watch the status of by running 'kubectl get svc -w {{ include "common.name" . }}'
+  export SERVICE_IP=$(kubectl get svc --namespace {{ include "common.namespace" . }} {{ include "common.name" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
+  echo http://$SERVICE_IP:{{ .Values.service.externalPort }}
+{{- else if contains "ClusterIP" .Values.service.type }}
+  export POD_NAME=$(kubectl get pods --namespace {{ include "common.namespace" . }} -l "app={{ template "so.name" . }},release={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
+  echo "Visit http://127.0.0.1:8080 to use your application"
+  kubectl port-forward $POD_NAME 8080:{{ .Values.service.internalPort }}
+{{- end }}
diff --git a/kubernetes/cli/templates/cli-deployment.yaml b/kubernetes/cli/templates/cli-deployment.yaml
deleted file mode 100644 (file)
index 5afc6f8..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-# Copyright © 2017 Amdocs, Bell Canada
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-#{{ if not .Values.disableCliCli }}
-apiVersion: extensions/v1beta1
-kind: Deployment
-metadata:
-  labels:
-    app: cli
-  name: cli
-  namespace: "{{ .Values.nsPrefix }}"
-spec:
-  selector:
-    matchLabels:
-      app: cli
-  template:
-    metadata:
-      labels:
-        app: cli
-      name: cli
-    spec:
-      containers:
-      - image:  {{ .Values.image.cliImage}}
-        imagePullPolicy: {{ .Values.pullPolicy }}
-        name: "cli"
-        env:
-        - name: CLI_MODE
-          value: daemon
-        ports:
-        - containerPort: 80
-        - containerPort: 8080
-          name: cli
-        readinessProbe:
-          tcpSocket:
-            port: 80
-          initialDelaySeconds: 5
-          periodSeconds: 10
-      imagePullSecrets:
-      - name: "{{ .Values.nsPrefix }}-docker-registry-key"
-#{{ end }}
diff --git a/kubernetes/cli/templates/deployment.yaml b/kubernetes/cli/templates/deployment.yaml
new file mode 100644 (file)
index 0000000..f4e2f36
--- /dev/null
@@ -0,0 +1,68 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: extensions/v1beta1
+kind: Deployment
+metadata:
+  name: {{ include "common.fullname" . }}
+  namespace: {{ include "common.namespace" . }}
+  labels:
+    app: {{ include "common.name" . }}
+    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
+    release: {{ .Release.Name }}
+    heritage: {{ .Release.Service }}
+spec:
+  replicas: {{ .Values.replicaCount }}
+  template:
+    metadata:
+      labels:
+        app: {{ include "common.name" . }}
+        release: {{ .Release.Name }}
+    spec:
+      containers:
+        - name: {{ include "common.name" . }}
+          image: "{{ .Values.global.repository | default .Values.repository }}/{{ .Values.image }}"
+          imagePullPolicy: {{ .Values.global.pullPolicy | default .Values.pullPolicy }}
+          ports:
+          - containerPort: {{ .Values.service.internalPort }}
+          - containerPort: {{ .Values.service.internalPort1 }}
+          # disable liveness probe when breakpoints set in debugger
+          # so K8s doesn't restart unresponsive container
+          {{- if eq .Values.liveness.enabled true }}
+          livenessProbe:
+            tcpSocket:
+              port: {{ .Values.service.internalPort }}
+            initialDelaySeconds: {{ .Values.liveness.initialDelaySeconds }}
+            periodSeconds: {{ .Values.liveness.periodSeconds }}
+          {{ end -}}
+          readinessProbe:
+            tcpSocket:
+              port: {{ .Values.service.internalPort }}
+            initialDelaySeconds: {{ .Values.readiness.initialDelaySeconds }}
+            periodSeconds: {{ .Values.readiness.periodSeconds }}
+          env:
+            - name: CLI_MODE
+              value: "{{ .Values.config.climode }}"
+          resources:
+{{ toYaml .Values.resources | indent 12 }}
+        {{- if .Values.nodeSelector }}
+        nodeSelector:
+{{ toYaml .Values.nodeSelector | indent 10 }}
+        {{- end -}}
+        {{- if .Values.affinity }}
+        affinity:
+{{ toYaml .Values.affinity | indent 10 }}
+        {{- end }}
+      imagePullSecrets:
+      - name: "{{ include "common.namespace" . }}-docker-registry-key"
diff --git a/kubernetes/cli/templates/service.yaml b/kubernetes/cli/templates/service.yaml
new file mode 100644 (file)
index 0000000..e7e8277
--- /dev/null
@@ -0,0 +1,47 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ .Values.service.name }}
+  namespace: {{ include "common.namespace" . }}
+  labels:
+    app: {{ include "common.name" . }}
+    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
+    release: {{ .Release.Name }}
+    heritage: {{ .Release.Service }}
+spec:
+  type: {{ .Values.service.type }}
+  ports:
+    {{if eq .Values.service.type "NodePort" -}}
+    - port: {{ .Values.service.externalPort }}
+      targetPort: {{ .Values.service.internalPort }}
+      nodePort: {{ .Values.global.nodePortPrefix | default .Values.nodePortPrefix }}{{ .Values.service.nodePort }}
+      name: {{ .Values.service.name }}{{ .Values.service.externalPort }}
+    - port: {{ .Values.service.externalPort1 }}
+      targetPort: {{ .Values.service.internalPort1 }}
+      nodePort: {{ .Values.global.nodePortPrefix | default .Values.nodePortPrefix }}{{ .Values.service.nodePort1 }}
+      name: {{ .Values.service.name }}{{ .Values.service.externalPort1 }}
+    {{- else -}}
+    - port: {{ .Values.service.externalPort }}
+      targetPort: {{ .Values.service.internalPort }}
+      name: {{ .Values.service.name }}{{ .Values.service.externalPort }}
+    - port: {{ .Values.service.externalPort1 }}
+      targetPort: {{ .Values.service.internalPort1 }}
+      name: {{ .Values.service.name }}{{ .Values.service.externalPort1 }}
+    {{- end}}
+  selector:
+    app: {{ include "common.name" . }}
+    release: {{ .Release.Name }}
index f10711f..75a70b8 100644 (file)
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-nsPrefix: onap
+#################################################################
+# Global configuration defaults.
+#################################################################
+global:
+  nodePortPrefix: 302
+  repositorySecret: eyJuZXh1czMub25hcC5vcmc6MTAwMDEiOnsidXNlcm5hbWUiOiJkb2NrZXIiLCJwYXNzd29yZCI6ImRvY2tlciIsImVtYWlsIjoiQCIsImF1dGgiOiJaRzlqYTJWeU9tUnZZMnRsY2c9PSJ9fQ==
+  readinessRepository: oomk8s
+  readinessImage: readiness-check:1.0.0
+
+#################################################################
+# Application configuration defaults.
+#################################################################
+# application image
+repository: nexus3.onap.org:10001
+image: onap/cli:v1.1.0
 pullPolicy: Always
-nodePortPrefix: 302
-image:
-  cliImage: nexus3.onap.org:10001/onap/cli:v1.1.0
+
+# application configuration
+config:
+  climode: daemon
+
+# default number of instances
+replicaCount: 1
+
+nodeSelector: {}
+
+affinity: {}
+
+# probe configuration parameters
+liveness:
+  initialDelaySeconds: 10
+  periodSeconds: 10
+  # necessary to disable liveness probe when setting breakpoints
+  # in debugger so K8s doesn't restart unresponsive container
+  enabled: true
+
+readiness:
+  initialDelaySeconds: 10
+  periodSeconds: 10
+
+service:
+  type: NodePort
+  name: cli
+  externalPort: 8080
+  externalPort1: 9090
+  internalPort: "80"
+  internalPort1: 8080
+  nodePort: "60"
+  nodePort1: "61"
+
+ingress:
+  enabled: false
+
+resources: {}
+  # We usually recommend not to specify default resources and to leave this as a conscious
+  # choice for the user. This also increases chances charts run on environments with little
+  # resources, such as Minikube. If you do want to specify resources, uncomment the following
+  # lines, adjust them as necessary, and remove the curly braces after 'resources:'.
+  #
+  # Example:
+  # Configure resource requests and limits
+  # ref: http://kubernetes.io/docs/user-guide/compute-resources/
+  # Minimum memory for development is 2 CPU cores and 4GB memory
+  # Minimum memory for production is 4 CPU cores and 8GB memory
+#resources:
+#  limits:
+#    cpu: 2
+#    memory: 4Gi
+#  requests:
+#    cpu: 2
+#    memory: 4Gi
diff --git a/kubernetes/config/docker/init/src/config/dcae/common-event/config/console.properties b/kubernetes/config/docker/init/src/config/dcae/common-event/config/console.properties
deleted file mode 100755 (executable)
index 4cf2ef0..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-localhost.endpoint=http://localhost:9999
-localhost.user=console
-localhost.password=MDBmMzE0NTgyMDU1NmVj
-localhost.timeout=3600000
-#localhost.debug=true
-
diff --git a/kubernetes/config/docker/init/src/config/dcae/common-event/config/gui.properties b/kubernetes/config/docker/init/src/config/dcae/common-event/config/gui.properties
deleted file mode 100755 (executable)
index 8b13789..0000000
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/kubernetes/config/docker/init/src/config/dcae/common-event/config/log4j.properties b/kubernetes/config/docker/init/src/config/dcae/common-event/config/log4j.properties
deleted file mode 100755 (executable)
index 1bbbf79..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-#log4j.debug=0
-log4j.rootLogger=warn, file
-log4j.logger.org.openecomp.ncomp=info, file
-log4j.additivity.org.openecomp.ncomp=false
-
-
-#log4j.logger.org.apache.http.headers=debug, file
-#log4j.logger.org.apache.http.wire=debug, file
-
-log4j.appender.file=org.apache.log4j.RollingFileAppender
-log4j.appender.file.File=logs/manager.log
-log4j.appender.file.layout=org.apache.log4j.PatternLayout
-log4j.appender.file.layout.ConversionPattern=%d %5p [%t] %m %C:%L%n
-log4j.appender.file.MaxFileSize=50MB
-log4j.appender.file.MaxBackupIndex=5
-
-log4j.appender.uploaded=org.apache.log4j.RollingFileAppender
-log4j.appender.uploaded.File=logs/manager-uploaded.log
-log4j.appender.uploaded.layout=org.apache.log4j.PatternLayout
-log4j.appender.uploaded.layout.ConversionPattern=%d %5p [%t] %m %C:%L%n
-log4j.appender.uploaded.MaxFileSize=50MB
-log4j.appender.uploaded.MaxBackupIndex=5
-
-### ECOMP Logging
-log4j.logger.org.openecomp.audit=info, audit
-log4j.additivity.org.openecomp.audit=false
-log4j.logger.org.openecomp.metrics=info, metrics
-log4j.additivity.org.openecomp.metrics=false
-log4j.logger.org.openecomp.error=info, error
-log4j.additivity.org.openecomp.error=false
-log4j.logger.com.att.eelf.debug=info, debug
-log4j.additivity.org.openecomp.debug=false
-log4j.appender.audit=org.apache.log4j.RollingFileAppender
-log4j.appender.audit.File=logs/audit.log
-log4j.appender.audit.layout=org.apache.log4j.PatternLayout
-log4j.appender.audit.layout.ConversionPattern=%d{MM/dd-HH:mm:ss.SSS}|%X{RequestId}|%X{ServiceInstanceId}|%t|%X{ServiceName}|%X{InstanceUUID}|%5p|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ServerFQDN}|%X{RemoteHost}|%X{Timer}|%m%n
-log4j.appender.audit.MaxFileSize=50MB
-log4j.appender.audit.MaxBackupIndex=5
-log4j.appender.metrics=org.apache.log4j.RollingFileAppender
-log4j.appender.metrics.File=logs/metrics.log
-log4j.appender.metrics.layout=org.apache.log4j.PatternLayout
-log4j.appender.metrics.layout.ConversionPattern=%d{MM/dd-HH:mm:ss.SSS}|%X{RequestId}|%X{ServiceInstanceId}|%t|%X{ServiceName}|%X{InstanceUUID}|%p|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ServerFQDN}|%X{RemoteHost}|%X{Timer}|%m%n
-log4j.appender.metrics.MaxFileSize=50MB
-log4j.appender.metrics.MaxBackupIndex=5
-log4j.appender.error=org.apache.log4j.RollingFileAppender
-log4j.appender.error.File=logs/error.log
-log4j.appender.error.layout=org.apache.log4j.PatternLayout
-log4j.appender.error.layout.ConversionPattern=%d{MM/dd-HH:mm:ss.SSS}|%X{RequestId}|%X{ServiceInstanceId}|%t|%X{ServiceName}|%X{InstanceUUID}|%p|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ServerFQDN}|%X{RemoteHost}|%X{Timer}|%m%n
-log4j.appender.error.MaxFileSize=50MB
-log4j.appender.error.MaxBackupIndex=5
-log4j.appender.debug=org.apache.log4j.RollingFileAppender
-log4j.appender.debug.File=logs/debug.log
-log4j.appender.debug.layout=org.apache.log4j.PatternLayout
-log4j.appender.debug.layout.ConversionPattern=%d{MM/dd-HH:mm:ss.SSS}|%X{RequestId}|%X{ServiceInstanceId}|%t|%X{ServiceName}|%X{InstanceUUID}|%p|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ServerFQDN}|%X{RemoteHost}|%X{Timer}|%m%n
-log4j.appender.debug.MaxFileSize=50MB
-log4j.appender.debug.MaxBackupIndex=5
-
-
diff --git a/kubernetes/config/docker/init/src/config/dcae/common-event/config/manager.properties b/kubernetes/config/docker/init/src/config/dcae/common-event/config/manager.properties
deleted file mode 100755 (executable)
index 98998db..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-JVMARGS=-Djavax.net.ssl.trustStore=config/docker-mra-certs.jks
-server.dir = data/resources
-metrics.dir = data/metrics
-properties.dir = data/properties
-server.port = 9999
-server.user.console = MDBmMzE0NTgyMDU1NmVj
-server.user.gui = ZDAxYzIzMGQ5NWRhZjVi
-server.user.client = OTY4NTk3ODI4ZWI2MjM0
diff --git a/kubernetes/config/docker/init/src/config/dcae/dmaapbc/config/conf b/kubernetes/config/docker/init/src/config/dcae/dmaapbc/config/conf
deleted file mode 100755 (executable)
index 5a9432c..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-# DMaaP Bus Controller OpenSource environment vars
-CONT_DOMAIN=dcae.simpledemo.openecomp.org
-DMAAPBC_INSTANCE_NAME=privatecloud
-
-#   The https port
-#   set to 0 if certificate is not ready
-DMAAPBC_INT_HTTPS_PORT=0
-
-DMAAPBC_KSTOREFILE=/opt/app/dcae-certificates
-DMAAPBC_KSTOREPASS=foofoofoo
-DMAAPBC_PVTKEYPASS=barbarbar
-
-DMAAPBC_PG_ENABLED=true
-#DMAAPBC_PGHOST=zldciad1vipstg00.dcae.simpledemo.openecomp.org
-DMAAPBC_PGHOST=10.0.4.101
-DMAAPBC_PGCRED=test234-ftl
-
-DMAAPBC_DRPROV_FQDN=zldciad1vidrps00.simpledemo.openecomp.org
-
-DMAAPBC_AAF_URL=https://aafapi.:8095/proxy/
-
-DMAAPBC_TOPICMGR_USER=m99751@dmaapBC.openecomp.org
-DMAAPBC_TOPICMGR_PWD=enc:zyRL9zbI0py3rJAjMS0dFOnYfEw_mJhO
-DMAAPBC_ADMIN_USER=m99501@dcae.openecomp.org
-DMAAPBC_ADMIN_PWD=enc:YEaHwOJrwhDY8a6usetlhbB9mEjUq9m
-
-DMAAPBC_PE_ENABLED=false
-DMAAPBC_PE_AAF_ENV=TBD
diff --git a/kubernetes/config/docker/init/src/config/dcae/dmaapbc/config/console.properties b/kubernetes/config/docker/init/src/config/dcae/dmaapbc/config/console.properties
deleted file mode 100755 (executable)
index 4cf2ef0..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-localhost.endpoint=http://localhost:9999
-localhost.user=console
-localhost.password=MDBmMzE0NTgyMDU1NmVj
-localhost.timeout=3600000
-#localhost.debug=true
-
diff --git a/kubernetes/config/docker/init/src/config/dcae/dmaapbc/config/gui.properties b/kubernetes/config/docker/init/src/config/dcae/dmaapbc/config/gui.properties
deleted file mode 100755 (executable)
index 8b13789..0000000
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/kubernetes/config/docker/init/src/config/dcae/dmaapbc/config/log4j.properties b/kubernetes/config/docker/init/src/config/dcae/dmaapbc/config/log4j.properties
deleted file mode 100755 (executable)
index 1bbbf79..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-#log4j.debug=0
-log4j.rootLogger=warn, file
-log4j.logger.org.openecomp.ncomp=info, file
-log4j.additivity.org.openecomp.ncomp=false
-
-
-#log4j.logger.org.apache.http.headers=debug, file
-#log4j.logger.org.apache.http.wire=debug, file
-
-log4j.appender.file=org.apache.log4j.RollingFileAppender
-log4j.appender.file.File=logs/manager.log
-log4j.appender.file.layout=org.apache.log4j.PatternLayout
-log4j.appender.file.layout.ConversionPattern=%d %5p [%t] %m %C:%L%n
-log4j.appender.file.MaxFileSize=50MB
-log4j.appender.file.MaxBackupIndex=5
-
-log4j.appender.uploaded=org.apache.log4j.RollingFileAppender
-log4j.appender.uploaded.File=logs/manager-uploaded.log
-log4j.appender.uploaded.layout=org.apache.log4j.PatternLayout
-log4j.appender.uploaded.layout.ConversionPattern=%d %5p [%t] %m %C:%L%n
-log4j.appender.uploaded.MaxFileSize=50MB
-log4j.appender.uploaded.MaxBackupIndex=5
-
-### ECOMP Logging
-log4j.logger.org.openecomp.audit=info, audit
-log4j.additivity.org.openecomp.audit=false
-log4j.logger.org.openecomp.metrics=info, metrics
-log4j.additivity.org.openecomp.metrics=false
-log4j.logger.org.openecomp.error=info, error
-log4j.additivity.org.openecomp.error=false
-log4j.logger.com.att.eelf.debug=info, debug
-log4j.additivity.org.openecomp.debug=false
-log4j.appender.audit=org.apache.log4j.RollingFileAppender
-log4j.appender.audit.File=logs/audit.log
-log4j.appender.audit.layout=org.apache.log4j.PatternLayout
-log4j.appender.audit.layout.ConversionPattern=%d{MM/dd-HH:mm:ss.SSS}|%X{RequestId}|%X{ServiceInstanceId}|%t|%X{ServiceName}|%X{InstanceUUID}|%5p|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ServerFQDN}|%X{RemoteHost}|%X{Timer}|%m%n
-log4j.appender.audit.MaxFileSize=50MB
-log4j.appender.audit.MaxBackupIndex=5
-log4j.appender.metrics=org.apache.log4j.RollingFileAppender
-log4j.appender.metrics.File=logs/metrics.log
-log4j.appender.metrics.layout=org.apache.log4j.PatternLayout
-log4j.appender.metrics.layout.ConversionPattern=%d{MM/dd-HH:mm:ss.SSS}|%X{RequestId}|%X{ServiceInstanceId}|%t|%X{ServiceName}|%X{InstanceUUID}|%p|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ServerFQDN}|%X{RemoteHost}|%X{Timer}|%m%n
-log4j.appender.metrics.MaxFileSize=50MB
-log4j.appender.metrics.MaxBackupIndex=5
-log4j.appender.error=org.apache.log4j.RollingFileAppender
-log4j.appender.error.File=logs/error.log
-log4j.appender.error.layout=org.apache.log4j.PatternLayout
-log4j.appender.error.layout.ConversionPattern=%d{MM/dd-HH:mm:ss.SSS}|%X{RequestId}|%X{ServiceInstanceId}|%t|%X{ServiceName}|%X{InstanceUUID}|%p|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ServerFQDN}|%X{RemoteHost}|%X{Timer}|%m%n
-log4j.appender.error.MaxFileSize=50MB
-log4j.appender.error.MaxBackupIndex=5
-log4j.appender.debug=org.apache.log4j.RollingFileAppender
-log4j.appender.debug.File=logs/debug.log
-log4j.appender.debug.layout=org.apache.log4j.PatternLayout
-log4j.appender.debug.layout.ConversionPattern=%d{MM/dd-HH:mm:ss.SSS}|%X{RequestId}|%X{ServiceInstanceId}|%t|%X{ServiceName}|%X{InstanceUUID}|%p|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ServerFQDN}|%X{RemoteHost}|%X{Timer}|%m%n
-log4j.appender.debug.MaxFileSize=50MB
-log4j.appender.debug.MaxBackupIndex=5
-
-
diff --git a/kubernetes/config/docker/init/src/config/dcae/dmaapbc/config/manager.properties b/kubernetes/config/docker/init/src/config/dcae/dmaapbc/config/manager.properties
deleted file mode 100755 (executable)
index 98998db..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-JVMARGS=-Djavax.net.ssl.trustStore=config/docker-mra-certs.jks
-server.dir = data/resources
-metrics.dir = data/metrics
-properties.dir = data/properties
-server.port = 9999
-server.user.console = MDBmMzE0NTgyMDU1NmVj
-server.user.gui = ZDAxYzIzMGQ5NWRhZjVi
-server.user.client = OTY4NTk3ODI4ZWI2MjM0
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/APPC-CL-0/00000000000000000000.index b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/APPC-CL-0/00000000000000000000.index
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/APPC-CL-0/00000000000000000000.log b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/APPC-CL-0/00000000000000000000.log
deleted file mode 100644 (file)
index 85ee8bf..0000000
Binary files a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/APPC-CL-0/00000000000000000000.log and /dev/null differ
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/APPC-CL-1/00000000000000000000.index b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/APPC-CL-1/00000000000000000000.index
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/APPC-CL-1/00000000000000000000.log b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/APPC-CL-1/00000000000000000000.log
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/APPC-TEST1-0/00000000000000000000.index b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/APPC-TEST1-0/00000000000000000000.index
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/APPC-TEST1-0/00000000000000000000.log b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/APPC-TEST1-0/00000000000000000000.log
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/APPC-TEST2-0/00000000000000000000.index b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/APPC-TEST2-0/00000000000000000000.index
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/APPC-TEST2-0/00000000000000000000.log b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/APPC-TEST2-0/00000000000000000000.log
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/APPC-TEST2-1/00000000000000000000.index b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/APPC-TEST2-1/00000000000000000000.index
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/APPC-TEST2-1/00000000000000000000.log b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/APPC-TEST2-1/00000000000000000000.log
deleted file mode 100644 (file)
index 66dcea9..0000000
Binary files a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/APPC-TEST2-1/00000000000000000000.log and /dev/null differ
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/DCAE-CL-EVENT-0/00000000000000000000.index b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/DCAE-CL-EVENT-0/00000000000000000000.index
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/DCAE-CL-EVENT-0/00000000000000000000.log b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/DCAE-CL-EVENT-0/00000000000000000000.log
deleted file mode 100644 (file)
index bb73f23..0000000
Binary files a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/DCAE-CL-EVENT-0/00000000000000000000.log and /dev/null differ
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/DCAE-CL-EVENT-1/00000000000000000000.index b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/DCAE-CL-EVENT-1/00000000000000000000.index
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/DCAE-CL-EVENT-1/00000000000000000000.log b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/DCAE-CL-EVENT-1/00000000000000000000.log
deleted file mode 100644 (file)
index 53364c5..0000000
Binary files a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/DCAE-CL-EVENT-1/00000000000000000000.log and /dev/null differ
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/ECOMP-PORTAL-INBOX-0/00000000000000000000.index b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/ECOMP-PORTAL-INBOX-0/00000000000000000000.index
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/ECOMP-PORTAL-INBOX-0/00000000000000000000.log b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/ECOMP-PORTAL-INBOX-0/00000000000000000000.log
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/ECOMP-PORTAL-OUTBOX-APP1-0/00000000000000000000.index b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/ECOMP-PORTAL-OUTBOX-APP1-0/00000000000000000000.index
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/ECOMP-PORTAL-OUTBOX-APP1-0/00000000000000000000.log b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/ECOMP-PORTAL-OUTBOX-APP1-0/00000000000000000000.log
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/ECOMP-PORTAL-OUTBOX-DBC1-0/00000000000000000000.index b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/ECOMP-PORTAL-OUTBOX-DBC1-0/00000000000000000000.index
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/ECOMP-PORTAL-OUTBOX-DBC1-0/00000000000000000000.log b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/ECOMP-PORTAL-OUTBOX-DBC1-0/00000000000000000000.log
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/ECOMP-PORTAL-OUTBOX-POL1-0/00000000000000000000.index b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/ECOMP-PORTAL-OUTBOX-POL1-0/00000000000000000000.index
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/ECOMP-PORTAL-OUTBOX-POL1-0/00000000000000000000.log b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/ECOMP-PORTAL-OUTBOX-POL1-0/00000000000000000000.log
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/ECOMP-PORTAL-OUTBOX-SDC1-0/00000000000000000000.index b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/ECOMP-PORTAL-OUTBOX-SDC1-0/00000000000000000000.index
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/ECOMP-PORTAL-OUTBOX-SDC1-0/00000000000000000000.log b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/ECOMP-PORTAL-OUTBOX-SDC1-0/00000000000000000000.log
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/ECOMP-PORTAL-OUTBOX-VID1-0/00000000000000000000.index b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/ECOMP-PORTAL-OUTBOX-VID1-0/00000000000000000000.index
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/ECOMP-PORTAL-OUTBOX-VID1-0/00000000000000000000.log b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/ECOMP-PORTAL-OUTBOX-VID1-0/00000000000000000000.log
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/PDPD-CONFIGURATION-0/00000000000000000000.index b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/PDPD-CONFIGURATION-0/00000000000000000000.index
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/PDPD-CONFIGURATION-0/00000000000000000000.log b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/PDPD-CONFIGURATION-0/00000000000000000000.log
deleted file mode 100644 (file)
index b466eda..0000000
Binary files a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/PDPD-CONFIGURATION-0/00000000000000000000.log and /dev/null differ
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/PDPD-CONFIGURATION-1/00000000000000000000.index b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/PDPD-CONFIGURATION-1/00000000000000000000.index
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/PDPD-CONFIGURATION-1/00000000000000000000.log b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/PDPD-CONFIGURATION-1/00000000000000000000.log
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/POLICY-CL-MGT-0/00000000000000000000.index b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/POLICY-CL-MGT-0/00000000000000000000.index
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/POLICY-CL-MGT-0/00000000000000000000.log b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/POLICY-CL-MGT-0/00000000000000000000.log
deleted file mode 100644 (file)
index bc5db56..0000000
Binary files a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/POLICY-CL-MGT-0/00000000000000000000.log and /dev/null differ
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/POLICY-CL-MGT-1/00000000000000000000.index b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/POLICY-CL-MGT-1/00000000000000000000.index
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/POLICY-CL-MGT-1/00000000000000000000.log b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/POLICY-CL-MGT-1/00000000000000000000.log
deleted file mode 100644 (file)
index 978eeb6..0000000
Binary files a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/POLICY-CL-MGT-1/00000000000000000000.log and /dev/null differ
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/SDC-DISTR-NOTIF-TOPIC-SDC-OPENSOURCE-ENV1-0/00000000000000000000.index b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/SDC-DISTR-NOTIF-TOPIC-SDC-OPENSOURCE-ENV1-0/00000000000000000000.index
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/SDC-DISTR-NOTIF-TOPIC-SDC-OPENSOURCE-ENV1-0/00000000000000000000.log b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/SDC-DISTR-NOTIF-TOPIC-SDC-OPENSOURCE-ENV1-0/00000000000000000000.log
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/SDC-DISTR-STATUS-TOPIC-SDC-OPENSOURCE-ENV1-0/00000000000000000000.index b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/SDC-DISTR-STATUS-TOPIC-SDC-OPENSOURCE-ENV1-0/00000000000000000000.index
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/SDC-DISTR-STATUS-TOPIC-SDC-OPENSOURCE-ENV1-0/00000000000000000000.log b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/SDC-DISTR-STATUS-TOPIC-SDC-OPENSOURCE-ENV1-0/00000000000000000000.log
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/msgrtr.apinode.metrics.dmaap-0/00000000000000000000.index b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/msgrtr.apinode.metrics.dmaap-0/00000000000000000000.index
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/msgrtr.apinode.metrics.dmaap-0/00000000000000000000.log b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/msgrtr.apinode.metrics.dmaap-0/00000000000000000000.log
deleted file mode 100644 (file)
index 7c1c0f6..0000000
Binary files a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/msgrtr.apinode.metrics.dmaap-0/00000000000000000000.log and /dev/null differ
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/msgrtr.apinode.metrics.dmaap-1/00000000000000000000.index b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/msgrtr.apinode.metrics.dmaap-1/00000000000000000000.index
deleted file mode 100644 (file)
index a0afe1d..0000000
Binary files a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/msgrtr.apinode.metrics.dmaap-1/00000000000000000000.index and /dev/null differ
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/msgrtr.apinode.metrics.dmaap-1/00000000000000000000.log b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/msgrtr.apinode.metrics.dmaap-1/00000000000000000000.log
deleted file mode 100644 (file)
index e3e471a..0000000
Binary files a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/msgrtr.apinode.metrics.dmaap-1/00000000000000000000.log and /dev/null differ
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/recovery-point-offset-checkpoint b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/recovery-point-offset-checkpoint
deleted file mode 100644 (file)
index a003b5d..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-0
-25
-ECOMP-PORTAL-OUTBOX-VID1 0 0
-PDPD-CONFIGURATION 0 2
-msgrtr.apinode.metrics.dmaap 1 26
-unauthenticated.SEC_MEASUREMENT_OUTPUT 1 1
-APPC-TEST2 0 0
-unauthenticated.TCA_EVENT_OUTPUT 1 1
-APPC-TEST1 0 0
-APPC-CL 0 2
-ECOMP-PORTAL-INBOX 0 0
-APPC-CL 1 0
-APPC-TEST2 1 1
-unauthenticated.TCA_EVENT_OUTPUT 0 1
-unauthenticated.SEC_MEASUREMENT_OUTPUT 0 1
-SDC-DISTR-NOTIF-TOPIC-SDC-OPENSOURCE-ENV1 0 0
-POLICY-CL-MGT 1 1
-PDPD-CONFIGURATION 1 0
-DCAE-CL-EVENT 1 1
-msgrtr.apinode.metrics.dmaap 0 4
-ECOMP-PORTAL-OUTBOX-APP1 0 0
-ECOMP-PORTAL-OUTBOX-SDC1 0 0
-POLICY-CL-MGT 0 1
-SDC-DISTR-STATUS-TOPIC-SDC-OPENSOURCE-ENV1 0 0
-DCAE-CL-EVENT 0 1
-ECOMP-PORTAL-OUTBOX-DBC1 0 0
-ECOMP-PORTAL-OUTBOX-POL1 0 0
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/replication-offset-checkpoint b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/replication-offset-checkpoint
deleted file mode 100644 (file)
index a003b5d..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-0
-25
-ECOMP-PORTAL-OUTBOX-VID1 0 0
-PDPD-CONFIGURATION 0 2
-msgrtr.apinode.metrics.dmaap 1 26
-unauthenticated.SEC_MEASUREMENT_OUTPUT 1 1
-APPC-TEST2 0 0
-unauthenticated.TCA_EVENT_OUTPUT 1 1
-APPC-TEST1 0 0
-APPC-CL 0 2
-ECOMP-PORTAL-INBOX 0 0
-APPC-CL 1 0
-APPC-TEST2 1 1
-unauthenticated.TCA_EVENT_OUTPUT 0 1
-unauthenticated.SEC_MEASUREMENT_OUTPUT 0 1
-SDC-DISTR-NOTIF-TOPIC-SDC-OPENSOURCE-ENV1 0 0
-POLICY-CL-MGT 1 1
-PDPD-CONFIGURATION 1 0
-DCAE-CL-EVENT 1 1
-msgrtr.apinode.metrics.dmaap 0 4
-ECOMP-PORTAL-OUTBOX-APP1 0 0
-ECOMP-PORTAL-OUTBOX-SDC1 0 0
-POLICY-CL-MGT 0 1
-SDC-DISTR-STATUS-TOPIC-SDC-OPENSOURCE-ENV1 0 0
-DCAE-CL-EVENT 0 1
-ECOMP-PORTAL-OUTBOX-DBC1 0 0
-ECOMP-PORTAL-OUTBOX-POL1 0 0
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/unauthenticated.SEC_MEASUREMENT_OUTPUT-0/00000000000000000000.index b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/unauthenticated.SEC_MEASUREMENT_OUTPUT-0/00000000000000000000.index
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/unauthenticated.SEC_MEASUREMENT_OUTPUT-0/00000000000000000000.log b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/unauthenticated.SEC_MEASUREMENT_OUTPUT-0/00000000000000000000.log
deleted file mode 100644 (file)
index 33bee2d..0000000
Binary files a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/unauthenticated.SEC_MEASUREMENT_OUTPUT-0/00000000000000000000.log and /dev/null differ
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/unauthenticated.SEC_MEASUREMENT_OUTPUT-1/00000000000000000000.index b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/unauthenticated.SEC_MEASUREMENT_OUTPUT-1/00000000000000000000.index
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/unauthenticated.SEC_MEASUREMENT_OUTPUT-1/00000000000000000000.log b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/unauthenticated.SEC_MEASUREMENT_OUTPUT-1/00000000000000000000.log
deleted file mode 100644 (file)
index 69b1e68..0000000
Binary files a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/unauthenticated.SEC_MEASUREMENT_OUTPUT-1/00000000000000000000.log and /dev/null differ
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/unauthenticated.TCA_EVENT_OUTPUT-0/00000000000000000000.index b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/unauthenticated.TCA_EVENT_OUTPUT-0/00000000000000000000.index
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/unauthenticated.TCA_EVENT_OUTPUT-0/00000000000000000000.log b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/unauthenticated.TCA_EVENT_OUTPUT-0/00000000000000000000.log
deleted file mode 100644 (file)
index 68a76bc..0000000
Binary files a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/unauthenticated.TCA_EVENT_OUTPUT-0/00000000000000000000.log and /dev/null differ
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/unauthenticated.TCA_EVENT_OUTPUT-1/00000000000000000000.index b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/unauthenticated.TCA_EVENT_OUTPUT-1/00000000000000000000.index
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/unauthenticated.TCA_EVENT_OUTPUT-1/00000000000000000000.log b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/unauthenticated.TCA_EVENT_OUTPUT-1/00000000000000000000.log
deleted file mode 100644 (file)
index 89ec482..0000000
Binary files a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-kafka/kafka-logs/unauthenticated.TCA_EVENT_OUTPUT-1/00000000000000000000.log and /dev/null differ
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-zookeeper/version-2/log.1 b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-zookeeper/version-2/log.1
deleted file mode 100644 (file)
index f3cb136..0000000
Binary files a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-zookeeper/version-2/log.1 and /dev/null differ
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-zookeeper/version-2/log.103 b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-zookeeper/version-2/log.103
deleted file mode 100644 (file)
index 9b648e2..0000000
Binary files a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-zookeeper/version-2/log.103 and /dev/null differ
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-zookeeper/version-2/log.125 b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-zookeeper/version-2/log.125
deleted file mode 100644 (file)
index 0613642..0000000
Binary files a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/data-zookeeper/version-2/log.125 and /dev/null differ
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/start-kafka.sh b/kubernetes/config/docker/init/src/config/dcae/message-router/dcae-startup-vm-message-router/docker_files/start-kafka.sh
deleted file mode 100644 (file)
index 4d955da..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-#!/bin/bash
-
-if [[ -z "$KAFKA_PORT" ]]; then
-    export KAFKA_PORT=9092
-fi
-if [[ -z "$KAFKA_ADVERTISED_PORT" ]]; then
-    export KAFKA_ADVERTISED_PORT=$(docker port `hostname` $KAFKA_PORT | sed -r "s/.*:(.*)/\1/g")
-fi
-if [[ -z "$KAFKA_BROKER_ID" ]]; then
-    # By default auto allocate broker ID
-    #export KAFKA_BROKER_ID=-1
-    export KAFKA_BROKER_ID=1
-fi
-#if [[ -z "$KAFKA_LOG_DIRS" ]]; then
-    #export KAFKA_LOG_DIRS="/kafka/kafka-logs-$HOSTNAME"
-    export KAFKA_LOG_DIRS="/kafka/kafka-logs"
-#fi
-if [[ -z "$KAFKA_ZOOKEEPER_CONNECT" ]]; then
-    export KAFKA_ZOOKEEPER_CONNECT=$(env | grep ZK.*PORT_2181_TCP= | sed -e 's|.*tcp://||' | paste -sd ,)
-fi
-
-if [[ -n "$KAFKA_HEAP_OPTS" ]]; then
-    sed -r -i "s/(export KAFKA_HEAP_OPTS)=\"(.*)\"/\1=\"$KAFKA_HEAP_OPTS\"/g" $KAFKA_HOME/bin/kafka-server-start.sh
-    unset KAFKA_HEAP_OPTS
-fi
-
-if [[ -z "$KAFKA_ADVERTISED_HOST_NAME" && -n "$HOSTNAME_COMMAND" ]]; then
-    export KAFKA_ADVERTISED_HOST_NAME=$(eval $HOSTNAME_COMMAND)
-fi
-
-for VAR in `env`
-do
-  if [[ $VAR =~ ^KAFKA_ && ! $VAR =~ ^KAFKA_HOME ]]; then
-    kafka_name=`echo "$VAR" | sed -r "s/KAFKA_(.*)=.*/\1/g" | tr '[:upper:]' '[:lower:]' | tr _ .`
-    env_var=`echo "$VAR" | sed -r "s/(.*)=.*/\1/g"`
-    if egrep -q "(^|^#)$kafka_name=" $KAFKA_HOME/config/server.properties; then
-        sed -r -i "s@(^|^#)($kafka_name)=(.*)@\2=${!env_var}@g" $KAFKA_HOME/config/server.properties #note that no config values may contain an '@' char
-    else
-        echo "$kafka_name=${!env_var}" >> $KAFKA_HOME/config/server.properties
-    fi
-  fi
-done
-
-if [[ -n "$CUSTOM_INIT_SCRIPT" ]] ; then
-  eval $CUSTOM_INIT_SCRIPT
-fi
-
-
-KAFKA_PID=0
-
-# see https://medium.com/@gchudnov/trapping-signals-in-docker-containers-7a57fdda7d86#.bh35ir4u5
-term_handler() {
-  echo 'Stopping Kafka....'
-  if [ $KAFKA_PID -ne 0 ]; then
-    kill -s TERM "$KAFKA_PID"
-    wait "$KAFKA_PID"
-  fi
-  echo 'Kafka stopped.'
-  exit
-}
-
-
-# Capture kill requests to stop properly
-trap "term_handler" SIGHUP SIGINT SIGTERM
-create-topics.sh &
-$KAFKA_HOME/bin/kafka-server-start.sh $KAFKA_HOME/config/server.properties &
-KAFKA_PID=$!
-
-wait "$KAFKA_PID"
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dmaap/MsgRtrApi.properties b/kubernetes/config/docker/init/src/config/dcae/message-router/dmaap/MsgRtrApi.properties
deleted file mode 100644 (file)
index 2f37755..0000000
+++ /dev/null
@@ -1,140 +0,0 @@
-###############################################################################
-##
-## Cambria API Server config
-##
-##     - Default values are shown as commented settings.
-##
-
-###############################################################################
-##
-## HTTP service
-##
-##             - 3904 is standard as of 7/29/14.
-#
-## Zookeeper Connection
-##
-##     Both Cambria and Kafka make use of Zookeeper.
-##
-config.zk.servers=zookeeper.namespace-placeholder:2181
-#config.zk.servers=172.17.0.1:2181
-#dmaap.namespace-placeholder:2181
-#10.208.128.229:2181
-#config.zk.root=/fe3c/cambria/config
-
-
-###############################################################################
-##
-## Kafka Connection
-##
-##     Items below are passed through to Kafka's producer and consumer
-##     configurations (after removing "kafka.")
-##     if you want to change request.required.acks it can take this one value
-#kafka.metadata.broker.list=localhost:9092,localhost:9093
-kafka.metadata.broker.list=kafka.namespace-placeholder:9092
-#kafka.metadata.broker.list=172.17.0.1:9092
-#dmaap.namespace-placeholder:9092
-#10.208.128.229:9092
-##kafka.request.required.acks=-1
-#kafka.client.zookeeper=${config.zk.servers}
-consumer.timeout.ms=100
-zookeeper.connection.timeout.ms=6000
-zookeeper.session.timeout.ms=6000
-zookeeper.sync.time.ms=2000
-auto.commit.interval.ms=1000
-fetch.message.max.bytes =1000000
-auto.commit.enable=false
-
-
-###############################################################################
-##
-##     Secured Config
-##
-##     Some data stored in the config system is sensitive -- API keys and secrets,
-##     for example. to protect it, we use an encryption layer for this section
-##     of the config.
-##
-## The key is a base64 encode AES key. This must be created/configured for
-## each installation.
-#cambria.secureConfig.key=
-##
-## The initialization vector is a 16 byte value specific to the secured store.
-## This must be created/configured for each installation.
-#cambria.secureConfig.iv=
-
-## Southfield Sandbox
-cambria.secureConfig.key=b/7ouTn9FfEw2PQwL0ov/Q==
-cambria.secureConfig.iv=wR9xP5k5vbz/xD0LmtqQLw==
-authentication.adminSecret=fe3cCompound
-#cambria.secureConfig.key[pc569h]=YT3XPyxEmKCTLI2NK+Sjbw==
-#cambria.secureConfig.iv[pc569h]=rMm2jhR3yVnU+u2V9Ugu3Q==
-
-
-###############################################################################
-##
-## Consumer Caching
-##
-##     Kafka expects live connections from the consumer to the broker, which
-##     obviously doesn't work over connectionless HTTP requests. The Cambria
-##     server proxies HTTP requests into Kafka consumer sessions that are kept
-##     around for later re-use. Not doing so is costly for setup per request,
-##     which would substantially impact a high volume consumer's performance.
-##
-##     This complicates Cambria server failover, because we often need server
-##     A to close its connection before server B brings up the replacement.
-##
-
-## The consumer cache is normally enabled.
-#cambria.consumer.cache.enabled=true
-
-## Cached consumers are cleaned up after a period of disuse. The server inspects
-## consumers every sweepFreqSeconds and will clean up any connections that are
-## dormant for touchFreqMs.
-#cambria.consumer.cache.sweepFreqSeconds=15
-#cambria.consumer.cache.touchFreqMs=120000
-
-## The cache is managed through ZK. The default value for the ZK connection
-## string is the same as config.zk.servers.
-#cambria.consumer.cache.zkConnect=${config.zk.servers}
-
-##
-## Shared cache information is associated with this node's name. The default
-## name is the hostname plus the HTTP service port this host runs on. (The
-## hostname is determined via InetAddress.getLocalHost ().getCanonicalHostName(),
-## which is not always adequate.) You can set this value explicitly here.
-##
-#cambria.api.node.identifier=<use-something-unique-to-this-instance>
-
-###############################################################################
-##
-## Metrics Reporting
-##
-##     This server can report its metrics periodically on a topic.
-##
-#metrics.send.cambria.enabled=true
-#metrics.send.cambria.topic=cambria.apinode.metrics                                  #msgrtr.apinode.metrics.dmaap
-#metrics.send.cambria.sendEverySeconds=60
-
-cambria.consumer.cache.zkBasePath=/fe3c/cambria/consumerCache
-
-##############################################################################
-#100mb
-maxcontentlength=10000
-
-
-##############################################################################
-#AAF Properties
-msgRtr.namespace.aaf=org.openecomp.dcae.dmaap.mtnje2.mr.topic
-msgRtr.topicfactory.aaf=org.openecomp.dcae.dmaap.topicFactory|:org.openecomp.dcae.dmaap.mtnje2.mr.topic:
-enforced.topic.name.AAF=org.openecomp
-forceAAF=false
-transidUEBtopicreqd=false
-defaultNSforUEB=org.openecomp.dmaap.mr.ueb
-##############################################################################
-#Mirror Maker Agent
-msgRtr.mirrormakeradmin.aaf=org.openecomp.dmaap.mr.dev.mirrormaker|*|admin
-msgRtr.mirrormakeruser.aaf=org.openecomp.dmaap.mr.dev.mirrormaker|*|user
-msgRtr.mirrormakeruser.aaf.create=org.openecomp.dmaap.mr.dev.topicFactory|:org.openecomp.dmaap.mr.dev.topic:
-msgRtr.mirrormaker.timeout=15000
-msgRtr.mirrormaker.topic=org.openecomp.dmaap.mr.prod.mm.agent
-msgRtr.mirrormaker.consumergroup=mmagentserver
-msgRtr.mirrormaker.consumerid=1
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dmaap/cadi.properties b/kubernetes/config/docker/init/src/config/dcae/message-router/dmaap/cadi.properties
deleted file mode 100644 (file)
index 1cb00a5..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-basic_realm=openecomp.org
-basic_warn=TRUE
-
-cadi_loglevel=DEBUG
-#cadi_keyfile=target/swm/package/nix/dist_files/appl/${artifactId}/etc/keyfile2
-cadi_keyfile=/appl/dmaapMR1/etc/keyfile
-# Configure AAF
-aaf_url=https://DME2RESOLVE/service=org.openecomp.authz.AuthorizationService/version=2.0/envContext=DEV/routeOffer=BAU_SE
-
-aaf_id=dgl@openecomp.org
-aaf_password=enc:f2u5br1mh29M02-
-aaf_timeout=5000
-aaf_clean_interval=1200000
-aaf_user_expires=60000
-aaf_high_count=1000000
-
-
-# The following properties are being set by the AJSC Container and should NOT need to be set here.
-AFT_LATITUDE=33.823589
-AFT_LONGITUDE=-84.366982
-AFT_ENVIRONMENT=AFTUAT
diff --git a/kubernetes/config/docker/init/src/config/dcae/message-router/dmaap/mykey b/kubernetes/config/docker/init/src/config/dcae/message-router/dmaap/mykey
deleted file mode 100644 (file)
index c2b8b87..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-_sNOLphPzrU7L0L3oWv0pYwgV_ddGF1XoBsQEIAp34jfP-fGJFPfFYaMpDEZ3gwH59rNw6qyMZHk
-k-4irklvVcWk36lC3twNvc0DueRCVrws1bkuhOLCXdxHJx-YG-1xM8EJfRmzh79WPlPkbAdyPmFF
-Ah44V0GjAnInPOFZA6MHP9rNx9B9qECHRfmvzU13vJCcgTsrmOr-CEiWfRsnzPjsICxpq9OaVT_D
-zn6rNaroGm1OiZNCrCgvRkCUHPOOCw3j9G1GeaImoZNYtozbz9u4sj13PU-MxIIAa64b1bMMMjpz
-Upc8lVPI4FnJKg6axMmEGn5zJ6JUq9mtOVyPj__2GEuDgpx5H4AwodXXVjFsVgR8UJwI_BvS2JVp
-JoQk0J1RqXmAXVamlsMAfzmmbARXgmrBfnuhveZnh9ymFVU-YZeujdANniXAwBGI7c6hG_BXkH7i
-Eyf4Fn41_SV78PskP6qgqJahr9r3bqdjNbKBztIKCOEVrE_w3IM5r02l-iStk_NBRkj6cq_7VCpG
-afxZ2CtZMwuZMiypO_wOgbdpCSKNzsL-NH2b4b08OlKiWb263gz634KJmV5WEfCl-6eH-JUFbWOS
-JwQfActLNT2ZQPl2MyZQNBzJEWoJRgS6k7tPRO-zqeUtYYHGHVMCxMuMHGQcoilNNHEFeBCG_fBh
-yAKb9g9F86Cbx9voMLiyTX2T3rwVHiSJFOzfNxGmfN5JWOthIun_c5hEY1tLQ15BomzkDwk7BAj7
-VbRCrVD45B6xrmSTMBSWYmLyr6mnQxQqeh9cMbD-0ZAncE3roxRnRvPKjFFa208ykYUp2V83r_PJ
-fV5I9ZPKSjk9DwFyrjkcQQEYDhdK6IFqcd6nEthjYVkmunu2fsX0bIOm9GGdIbKGqBnpdgBO5hyT
-rBr9HSlZrHcGdti1R823ckDF0Ekcl6kioDr5NLIpLtg9zUEDRm3QrbX2mv5Zs8W0pYnOqglxy3lz
-bJZTN7oR7VasHUtjmp0RT9nLZkUs5TZ6MHhlIq3ZsQ6w_Q9Rv1-ofxfwfCC4EBrWKbWAGCf6By4K
-Ew8321-2YnodhmsK5BrT4zQ1DZlmUvK8BmYjZe7wTljKjgYcsLTBfX4eMhJ7MIW1kpnl8AbiBfXh
-QzN56Mki51Q8PSQWHm0W9tnQ0z6wKdck6zBJ8JyNzewZahFKueDTn-9DOqIDfr3YHvQLLzeXyJ8e
-h4AgjW-hvlLzRGtkCknjLIgXVa3rMTycseAwbW-mgdCqqkw3SdEG8feAcyntmvE8j2jbtSDStQMB
-9JdvyNLuQdNG4pxpusgvVso0-8NQF0YVa9VFwg9U6IPSx5p8FcW68OAHt_fEgT4ZtiH7o9aur4o9
-oYqUh2lALCY-__9QLq1KkNjMKs33Jz9E8LbRerG9PLclkTrxCjYAeUWBjCwSI7OB7xkuaYDSjkjj
-a46NLpdBN1GNcsFFcZ79GFAK0_DsyxGLX8Tq6q0Bvhs8whD8wlSxpTGxYkyqNX-vcb7SDN_0WkCE
-XSdZWkqTHXcYbOvoCOb_e6SFAztuMenuHWY0utX0gBfx_X5lPDFyoYXErxFQHiA7t27keshXNa6R
-ukQRRS8kMjre1U74sc-fRNXkXpl57rG4rgxaEX0eBeowa53KAsVvUAoSac2aC_nfzXrDvoyf9Xi3
-JpEZNhUDLpFCEycV4I7jGQ9wo9qNaosvlsr6kbLDNdb_1xrGVgjT3xEvRNJNPqslSAu-yD-UFhC3
-AmCdYUnugw_eEFqXCHTARcRkdPPvl2XsmEKY2IqEeO5tz4DyXQFaL-5hEVh6lYEU1EOWHk3UGIXe
-Vc5_Ttp82qNLmlJPbZvgmNTJzYTHDQ_27KBcp7IVVZgPDjVKdWqQvZ18KhxvfF3Idgy82LBZniFV
-IbtxllXiPRxoPQriSXMnXjh3XkvSDI2pFxXfEvLRn1tvcFOwPNCz3QfPIzYg8uYXN5bRt3ZOrR_g
-ZhIlrc7HO0VbNbeqEVPKMZ-cjkqGj4VAuDKoQc0eQ6X_wCoAGO78nPpLeIvZPx1X3z5YoqNA
\ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/dcae/ves/console.properties b/kubernetes/config/docker/init/src/config/dcae/ves/console.properties
deleted file mode 100755 (executable)
index 4b63607..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-localhost.endpoint=http://localhost:PORT
-localhost.user=console
-localhost.password=CONSOLE_PW
diff --git a/kubernetes/config/docker/init/src/config/dcae/ves/gui.properties b/kubernetes/config/docker/init/src/config/dcae/ves/gui.properties
deleted file mode 100755 (executable)
index e69de29..0000000
diff --git a/kubernetes/config/docker/init/src/config/dcae/ves/log4j.properties b/kubernetes/config/docker/init/src/config/dcae/ves/log4j.properties
deleted file mode 100755 (executable)
index 8b3b8f9..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-#log4j.debug=0
-log4j.rootLogger=warn, file
-log4j.logger.org.openecomp.ncomp=info, file
-log4j.additivity.org.openecomp.ncomp=false
-log4j.logger.org.openecomp.ncomp.datarouter=warn, file
-log4j.additivity.org.openecomp.ncomp.datarouter=false
-log4j.logger.org.apache.http.headers=debug, file
-log4j.logger.org.apache.http.wire=debug, file
-
-## uploaded logger
-log4j.logger.org.openecomp.ncomp.sirius.manager.uploaded=info, uploaded
-log4j.additivity.org.openecomp.ncomp.sirius.manager.uploaded=false
-## request logging
-log4j.logger.org.openecomp.ncomp.sirius.manager.ManagementServer.requests=info, requests
-log4j.additivity.org.openecomp.ncomp.sirius.manager.ManagementServer.requests=false
-
-
-log4j.appender.file=org.apache.log4j.RollingFileAppender
-log4j.appender.file.File=logs/BBBB.log
-log4j.appender.file.layout=org.apache.log4j.PatternLayout
-log4j.appender.file.layout.ConversionPattern=%d %5p [%t] %m %C:%L%n
-log4j.appender.file.MaxFileSize=50MB
-log4j.appender.file.MaxBackupIndex=5 
-
diff --git a/kubernetes/config/docker/init/src/config/dcae/ves/makefile b/kubernetes/config/docker/init/src/config/dcae/ves/makefile
deleted file mode 100755 (executable)
index e272181..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-
-restart: stop start
-
-start:
-       M2_HOME=$(HOME)/.m2 bin/BBBB-controller start
-stop:
-       bin/BBBB-controller stop
-console:
-       bin/BBBB-controller console
diff --git a/kubernetes/config/docker/init/src/config/dcae/ves/manager.properties b/kubernetes/config/docker/init/src/config/dcae/ves/manager.properties
deleted file mode 100755 (executable)
index e24b5d3..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-server.dir = data/resources
-metrics.dir = data/metrics
-properties.dir = data/properties
-server.port = 9999
-server.user.console = CONSOLE_PW
-server.user.gui = GUI_PW
-server.user.client = CLIENT_PW
-server.user.CLIENT_PW = CLIENT_PW
diff --git a/kubernetes/config/docker/init/src/config/dcae/ves/pw.sh.sh b/kubernetes/config/docker/init/src/config/dcae/ves/pw.sh.sh
deleted file mode 100755 (executable)
index 8e179de..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/bin/bash
-
-### used to generate random passwords
-
-
-echo '#!/bin/bash'
-echo ""
-
-echo 'cat \'
-
-for i in CONSOLE GUI CLIENT
-do 
-  echo  '  |' sed s/${i}_PW/$(echo $i:$(date +%s) | sha256sum | base64 | head -c 20 ; echo)/ \\
-done
-  
diff --git a/kubernetes/config/docker/init/src/config/dcae/ves/server.properties b/kubernetes/config/docker/init/src/config/dcae/ves/server.properties
deleted file mode 100755 (executable)
index f33d814..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-server.dir = data/resources
-metrics.dir = data/metrics
-properties.dir = data/properties
-server.port = 8080
-server.user.console = CONSOLE_PW
-server.user.gui = GUI_PW
-server.user.client = CLIENT_PW
index b82c39b..8cb1f1b 100644 (file)
@@ -13,6 +13,6 @@
 # limitations under the License.
 
 apiVersion: v1
-description: ONAP Consul Heath Monitor
+description: ONAP Consul Agent
 name: consul
-version: 1.1.0
+version: 2.0.0
diff --git a/kubernetes/consul/charts/consul-server/Chart.yaml b/kubernetes/consul/charts/consul-server/Chart.yaml
new file mode 100644 (file)
index 0000000..13be087
--- /dev/null
@@ -0,0 +1,18 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: v1
+description: ONAP Consul Server
+name: consul-server
+version: 2.0.0
diff --git a/kubernetes/consul/charts/consul-server/requirements.yaml b/kubernetes/consul/charts/consul-server/requirements.yaml
new file mode 100644 (file)
index 0000000..f639633
--- /dev/null
@@ -0,0 +1,21 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+dependencies:
+  - name: common
+    version: ~2.0.0
+    # local reference to common chart, as it is
+    # a part of this chart's package and will not
+    # be published independently to a repo (at this point)
+    repository: '@local'
diff --git a/kubernetes/consul/charts/consul-server/templates/NOTES.txt b/kubernetes/consul/charts/consul-server/templates/NOTES.txt
new file mode 100644 (file)
index 0000000..2465e03
--- /dev/null
@@ -0,0 +1,19 @@
+1. Get the application URL by running these commands:
+{{- if .Values.ingress.enabled }}
+{{- range .Values.ingress.hosts }}
+  http://{{ . }}
+{{- end }}
+{{- else if contains "NodePort" .Values.service.type }}
+  export NODE_PORT=$(kubectl get --namespace {{ include "common.namespace" . }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "common.fullname" . }})
+  export NODE_IP=$(kubectl get nodes --namespace {{ include "common.namespace" . }} -o jsonpath="{.items[0].status.addresses[0].address}")
+  echo http://$NODE_IP:$NODE_PORT
+{{- else if contains "LoadBalancer" .Values.service.type }}
+     NOTE: It may take a few minutes for the LoadBalancer IP to be available.
+           You can watch the status of by running 'kubectl get svc -w {{ include "common.fullname" . }}'
+  export SERVICE_IP=$(kubectl get svc --namespace {{ include "common.namespace" . }} {{ include "common.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
+  echo http://$SERVICE_IP:{{ .Values.service.externalPort }}
+{{- else if contains "ClusterIP" .Values.service.type }}
+  export POD_NAME=$(kubectl get pods --namespace {{ include "common.namespace" . }} -l "app={{ template "so.name" . }},release={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
+  echo "Visit http://127.0.0.1:8080 to use your application"
+  kubectl port-forward $POD_NAME 8080:{{ .Values.service.internalPort }}
+{{- end }}
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-#{{ if not .Values.disableConsulConsulServer }}
 apiVersion: extensions/v1beta1
 kind: Deployment
 metadata:
+  name: {{ include "common.fullname" . }}
+  namespace: {{ include "common.namespace" . }}
   labels:
-    app: consul-server
-  name: consul-server
-  namespace: "{{ .Values.nsPrefix }}"
+    app: {{ include "common.name" . }}
+    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
+    release: {{ .Release.Name }}
+    heritage: {{ .Release.Service }}
 spec:
-  replicas: {{ .Values.consulServerReplicas }}
+  replicas: {{ .Values.replicaCount }}
   selector:
     matchLabels:
-      app: consul-server
+      app: {{ include "common.name" . }}
   template:
     metadata:
       labels:
-        app: consul-server
-      name: consul-server
+        app: {{ include "common.name" . }}
+        release: {{ .Release.Name }}
+      name: {{ include "common.name" . }}
     spec:
       containers:
-      - image: "{{ .Values.consulserverRegistry }}"
+      - image: "{{ .Values.repository | default .Values.global.repository }}/{{ .Values.image }}"
         command: ["/usr/local/bin/docker-entrypoint.sh"]
-        args: ["agent","-server","-client","0.0.0.0","-enable-script-checks","-bootstrap-expect=3","-ui","-join","consul-server.{{ .Values.nsPrefix }}"]
-        name: consul-server
-#{{ end }}
+        args: ["agent","-server","-client","0.0.0.0","-enable-script-checks","-bootstrap-expect=3","-ui","-join","{{ include "common.fullname" . }}.{{ include "common.namespace" . }}"]
+        name: {{ include "common.name" . }}
diff --git a/kubernetes/consul/charts/consul-server/templates/service.yaml b/kubernetes/consul/charts/consul-server/templates/service.yaml
new file mode 100644 (file)
index 0000000..3b17164
--- /dev/null
@@ -0,0 +1,38 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ include "common.fullname" . }}
+  namespace: {{ include "common.namespace" . }}
+  labels:
+    app: {{ include "common.name" . }}
+    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
+    release: {{ .Release.Name }}
+    heritage: {{ .Release.Service }}
+spec:
+  type: {{ .Values.service.type }}
+  ports:
+    - port: {{ .Values.service.internalPort }}
+      targetPort: {{ .Values.service.internalPort }}
+      nodePort: {{ .Values.global.nodePortPrefix | default .Values.nodePortPrefix }}{{ .Values.service.nodePort }}
+      name: {{ .Values.service.name }}
+    - port: {{ .Values.service.internalPort2 }}
+      targetPort: {{ .Values.service.internalPort2 }}
+      nodePort: {{ .Values.global.nodePortPrefix | default .Values.nodePortPrefix }}{{ .Values.service.nodePort2 }}
+      name: {{ .Values.service.name2 }}
+  selector:
+    app: {{ template "common.name" . }}
+    release: {{ .Release.Name }}
diff --git a/kubernetes/consul/charts/consul-server/values.yaml b/kubernetes/consul/charts/consul-server/values.yaml
new file mode 100644 (file)
index 0000000..2a57e3a
--- /dev/null
@@ -0,0 +1,67 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#################################################################
+# Global configuration defaults.
+#################################################################
+global:
+  nodePortPrefix: 302
+  repository: nexus3.onap.org:10001
+  repositorySecret: eyJuZXh1czMub25hcC5vcmc6MTAwMDEiOnsidXNlcm5hbWUiOiJkb2NrZXIiLCJwYXNzd29yZCI6ImRvY2tlciIsImVtYWlsIjoiQCIsImF1dGgiOiJaRzlqYTJWeU9tUnZZMnRsY2c9PSJ9fQ==
+  readinessRepository: oomk8s
+  readinessImage: readiness-check:1.0.0
+  loggingRepository: docker.elastic.co
+  loggingImage: beats/filebeat:5.5.0
+
+#################################################################
+# Application configuration defaults.
+#################################################################
+# application image
+repository: docker.io
+image: consul:1.0.6
+pullPolicy: Always
+
+# flag to enable debugging - application support required
+debugEnabled: false
+
+replicaCount: 3
+
+nodeSelector: {}
+
+affinity: {}
+
+# probe configuration parameters
+liveness:
+  initialDelaySeconds: 10
+  periodSeconds: 10
+  # necessary to disable liveness probe when setting breakpoints
+  # in debugger so K8s doesn't restart unresponsive container
+  enabled: true
+
+readiness:
+  initialDelaySeconds: 10
+  periodSeconds: 10
+
+service:
+  type: NodePort
+  name: consul-ui
+  nodePort: 70
+  internalPort: 8500
+  name2: consul-join
+  nodePort2: 71
+  internalPort2: 8301
+
+ingress:
+  enabled: false
+
+resources: {}
diff --git a/kubernetes/consul/requirements.yaml b/kubernetes/consul/requirements.yaml
new file mode 100644 (file)
index 0000000..f639633
--- /dev/null
@@ -0,0 +1,21 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+dependencies:
+  - name: common
+    version: ~2.0.0
+    # local reference to common chart, as it is
+    # a part of this chart's package and will not
+    # be published independently to a repo (at this point)
+    repository: '@local'
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-#{{ if not .Values.disableConsulConsulAgent }}
 apiVersion: v1
 kind: ConfigMap
 metadata:
-  name: consul-agent-configmap
-  namespace: {{ .Values.nsPrefix }}
+  name: {{ include "common.fullname" . }}-configmap
+  namespace: {{ include "common.namespace" . }}
 data:
 {{ tpl (.Files.Glob "resources/config/consul-agent-config/*").AsConfig . | indent 2 }}
 ---
 apiVersion: v1
 kind: ConfigMap
 metadata:
-  name: consul-agent-scripts-configmap
-  namespace: {{ .Values.nsPrefix }}
+  name: {{ include "common.fullname" . }}-scripts-configmap
+  namespace: {{ include "common.namespace" . }}
 data:
 {{ tpl (.Files.Glob "resources/config/consul-agent-config/scripts/*").AsConfig . | indent 2 }}
----
-apiVersion: v1
-kind: Secret
-metadata:
-  name: consul-agent-certs-secret
-  namespace: {{ .Values.nsPrefix }}
-data:
-{{ tpl (.Files.Glob "resources/config/consul-agent-config/certs/*").AsSecrets . | indent 2 }}
-#{{ end }}
diff --git a/kubernetes/consul/templates/consul-server-service.yaml b/kubernetes/consul/templates/consul-server-service.yaml
deleted file mode 100644 (file)
index 1a646b4..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-# Copyright © 2017 Amdocs, Bell Canada
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-#{{ if not .Values.disableConsulConsulServer }}
-apiVersion: v1
-kind: Service
-metadata:
-  labels:
-    app: consul-server
-  name: consul-server
-  namespace: "{{ .Values.nsPrefix }}"
-spec:
-  ports:
-  - name: consul-ui
-    nodePort: {{ .Values.nodePortPrefix }}70
-    port: 8500
-    protocol: TCP
-    targetPort: 8500
-  - name: consul-join
-    nodePort: {{ .Values.nodePortPrefix }}71
-    port: 8301
-    protocol: TCP
-    targetPort: 8301
-  selector:
-    app: consul-server
-  type: {{ .Values.service.type | quote }}
-#{{ end }}
\ No newline at end of file
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-#{{ if not .Values.disableConsulConsulAgent }}
 apiVersion: extensions/v1beta1
 kind: Deployment
 metadata:
+  name: {{ include "common.fullname" . }}
+  namespace: {{ include "common.namespace" . }}
   labels:
-    app: consul-agent
-  name: consul-agent
-  namespace: "{{ .Values.nsPrefix }}"
+    app: {{ include "common.name" . }}
+    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
+    release: {{ .Release.Name }}
+    heritage: {{ .Release.Service }}
 spec:
-  replicas: {{ .Values.consulAgentReplicas }}
+  replicas: {{ .Values.replicaCount }}
   selector:
     matchLabels:
-      app: consul-agent
+      app: {{ include "common.name" . }}
   template:
     metadata:
       labels:
-        app: consul-agent
-      name: consul-agent
+        app: {{ include "common.name" . }}
+        release: {{ .Release.Name }}
+      name: {{ include "common.name" . }}
     spec:
       containers:
-      - image: "{{ .Values.consulagentRegistry }}"
+      - image: "{{ .Values.repository | default .Values.global.repository }}/{{ .Values.image }}"
         command: ["/usr/local/bin/docker-entrypoint.sh"]
-        args: ["agent","-client","0.0.0.0","-enable-script-checks","-join","consul-server.{{ .Values.nsPrefix }}"]
-        name: consul-server
+        args: ["agent","-client","0.0.0.0","-enable-script-checks","-join","{{ .Release.Name }}-{{ index .Values "consul-server" "nameOverride" }}.{{ include "common.namespace" .}}"]
+        name: {{ include "common.name" . }}
         volumeMounts:
         - mountPath: /consul/config
           name: consul-agent-config
@@ -45,13 +48,13 @@ spec:
           name: consul-agent-certs-config
       volumes:
       - configMap:
-          name: consul-agent-configmap
+          name: {{ include "common.fullname" . }}-configmap
         name: consul-agent-config
       - configMap:
-          name: consul-agent-scripts-configmap
+          name: {{ include "common.fullname" . }}-scripts-configmap
           defaultMode: 0755
         name: consul-agent-scripts-config
       - secret:
-          secretName: consul-agent-certs-secret
+          secretName: {{ include "common.fullname" . }}-certs-secret
         name: consul-agent-certs-config
-#{{ end }}
+
diff --git a/kubernetes/consul/templates/secrets.yaml b/kubernetes/consul/templates/secrets.yaml
new file mode 100644 (file)
index 0000000..2535437
--- /dev/null
@@ -0,0 +1,7 @@
+apiVersion: v1
+kind: Secret
+metadata:
+  name: {{ include "common.fullname" . }}-certs-secret
+  namespace: {{ include "common.namespace" . }}
+data:
+{{ tpl (.Files.Glob "resources/config/consul-agent-config/certs/*").AsSecrets . | indent 2 }}
index e86937a..74d0ccd 100644 (file)
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
+#################################################################
+# Global configuration defaults.
+#################################################################
+global:
+  nodePortPrefix: 302
+  repository: nexus3.onap.org:10001
+  repositorySecret: eyJuZXh1czMub25hcC5vcmc6MTAwMDEiOnsidXNlcm5hbWUiOiJkb2NrZXIiLCJwYXNzd29yZCI6ImRvY2tlciIsImVtYWlsIjoiQCIsImF1dGgiOiJaRzlqYTJWeU9tUnZZMnRsY2c9PSJ9fQ==
+  readinessRepository: oomk8s
+  readinessImage: readiness-check:1.0.0
+  loggingRepository: docker.elastic.co
+  loggingImage: beats/filebeat:5.5.0
 
-nsPrefix: "onap"
-nodePortPrefix: 302
-consulserverRegistry: "docker.io/consul:1.0.6"
-consulagentRegistry: "oomk8s/consul:1.0.0"
-consulAgentReplicas: 1
-consulServerReplicas: 3
-service:
-      type: NodePort
+#################################################################
+# Application configuration defaults.
+#################################################################
+# application image
+repository: oomk8s
+image: consul:1.0.0
+pullPolicy: Always
+
+#subchart name
+consul-server:
+  nameOverride: consul-server
+
+# flag to enable debugging - application support required
+debugEnabled: false
+
+# default number of instances
+replicaCount: 1
+
+nodeSelector: {}
+
+affinity: {}
+
+# probe configuration parameters
+liveness:
+  initialDelaySeconds: 10
+  periodSeconds: 10
+  # necessary to disable liveness probe when setting breakpoints
+  # in debugger so K8s doesn't restart unresponsive container
+  enabled: true
+
+readiness:
+  initialDelaySeconds: 10
+  periodSeconds: 10
+
+service: {}
+
+ingress:
+  enabled: false
+
+resources: {}
index 94b25a1..ad38750 100644 (file)
@@ -33,11 +33,6 @@ spec:
         name: {{ include "common.name" . }}-readiness
       containers:
         - name: {{ include "common.name" . }}
-          # TODO: Temporary command:
-          command:
-          - /bin/sh
-          - -c
-          - export AUTH_TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token); /bin/kube2msb --kube_master_url=${KUBE_MASTER_URL} --msb_url=${MSB_URL}
           image: "{{ .Values.global.repository | default .Values.repository }}/{{ .Values.image }}"
           imagePullPolicy: {{ .Values.global.pullPolicy | default .Values.pullPolicy }}
           env:
index 08b6437..0049265 100644 (file)
@@ -34,14 +34,14 @@ dependencies:
     repository: '@local'
     condition: clamp.enabled
   - name: cli
-    version: ~0.1.0
+    version: ~2.0.0
     repository: '@local'
     condition: cli.enabled
   - name: common
     version: ~2.0.0
     repository: '@local'
   - name: consul
-    version: ~1.1.0
+    version: ~2.0.0
     repository: '@local'
     condition: consul.enabled
   - name: dcaegen2
@@ -77,7 +77,7 @@ dependencies:
     repository: '@local'
     condition: policy.enabled
   - name: portal
-    version: ~0.1.0
+    version: ~2.0.0
     repository: '@local'
     condition: portal.enabled
   - name: robot
@@ -89,7 +89,7 @@ dependencies:
     repository: '@local'
     condition: sdc.enabled
   - name: sdnc
-    version: ~0.1.0
+    version: ~2.0.0
     repository: '@local'
     condition: sdnc.enabled
   - name: so
index 8bbaa27..308c7ca 100644 (file)
@@ -82,6 +82,11 @@ sdc:
   enabled: false
 sdnc:
   enabled: false
+  
+  dmaap-listener:
+    config:
+      dmaapPort: 3904  
+
 so: # Service Orchestrator
   enabled: true
 
index ee7d00b..c4a73c8 100644 (file)
@@ -83,6 +83,11 @@ sdc:
   enabled: true
 sdnc:
   enabled: true
+
+  dmaap-listener:
+    config:
+      dmaapPort: 3904  
+
 so: # Service Orchestrator
   enabled: true
 
index d033bf1..5922cf8 100644 (file)
@@ -13,6 +13,6 @@
 # limitations under the License.
 
 apiVersion: v1
-description: Policy access point
+description: ONAP Policy Administration Point
 name: policy
 version: 2.0.0
index d6aafe4..2a16757 100644 (file)
@@ -13,6 +13,6 @@
 # limitations under the License.
 
 apiVersion: v1
-description: Policy BRMS GW
+description: ONAP Policy BRMS GW
 name: brmsgw
 version: 2.0.0
index 6a0012d..ab8ce5e 100644 (file)
@@ -18,8 +18,8 @@ BRMSGW_JMX_PORT=9989
 COMPONENT_X_MX_MB=1024
 COMPONENT_X_MS_MB=1024
 
-REST_PAP_URL=http://{{ .Release.Name }}-{{ .Values.global.pap.nameOverride }}:9091/pap/
-REST_PDP_ID=http://{{ .Release.Name }}-{{ .Values.global.pdp.nameOverride }}:8081/pdp/
+REST_PAP_URL=http://{{ .Release.Name }}-{{ .Values.global.pap.nameOverride }}:{{.Values.config.papPort}}/pap/
+REST_PDP_ID=http://{{ .Release.Name }}-{{ .Values.global.pdp.nameOverride }}:{{.Values.config.pdpPort}}/pdp/
 
 PDP_HTTP_USER_ID=testpdp
 PDP_HTTP_PASSWORD=alpha123
@@ -29,10 +29,10 @@ PDP_PAP_PDP_HTTP_PASSWORD=alpha123
 M2_HOME=/usr/share/maven
 snapshotRepositoryID=policy-nexus-snapshots
 snapshotRepositoryName=Snapshots
-snapshotRepositoryURL=http://{{ .Release.Name }}-{{ .Values.global.nexus.nameOverride }}:8081/nexus/content/repositories/snapshots
+snapshotRepositoryURL=http://{{ .Release.Name }}-{{ .Values.global.nexus.nameOverride }}:{{.Values.config.nexusPort}}/nexus/content/repositories/snapshots
 releaseRepositoryID=policy-nexus-releases
 releaseRepositoryName=Releases
-releaseRepositoryURL=http://{{ .Release.Name }}-{{ .Values.global.nexus.nameOverride }}:8081/nexus/content/repositories/releases
+releaseRepositoryURL=http://{{ .Release.Name }}-{{ .Values.global.nexus.nameOverride }}:{{.Values.config.nexusPort}}/nexus/content/repositories/releases
 repositoryUsername=admin
 repositoryPassword=admin123
 UEB_URL=dmaap
index 91d8ed4..c60c745 100644 (file)
@@ -13,7 +13,7 @@
   export SERVICE_IP=$(kubectl get svc --namespace {{ include "common.namespace" . }} {{ include "common.name" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
   echo http://$SERVICE_IP:{{ .Values.service.externalPort }}
 {{- else if contains "ClusterIP" .Values.service.type }}
-  export POD_NAME=$(kubectl get pods --namespace {{ include "common.namespace" . }} -l "app={{ template "so.name" . }},release={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
+  export POD_NAME=$(kubectl get pods --namespace {{ include "common.namespace" . }} -l "app={{ include "common.name" . }},release={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
   echo "Visit http://127.0.0.1:8080 to use your application"
   kubectl port-forward $POD_NAME 8080:{{ .Values.service.internalPort }}
 {{- end }}
index 3890e9e..708e570 100644 (file)
@@ -33,10 +33,10 @@ pullPolicy: Always
 debugEnabled: false
 
 # application configuration
-# Example:
-config: {}
-#  username: myusername
-#  password: mypassword
+config:
+  papPort: 9091
+  pdpPort: 8081
+  nexusPort: 8081
 
 # default number of instances
 replicaCount: 1
index 4f753c0..15ad44b 100644 (file)
@@ -13,6 +13,6 @@
 # limitations under the License.
 
 apiVersion: v1
-description: Drools Policy Engine 
+description: ONAP Drools Policy Engine 
 name: drools
 version: 2.0.0
index 65916b6..c16f645 100644 (file)
@@ -13,6 +13,6 @@
 # limitations under the License.
 
 apiVersion: v1
-description: Policy Nexus
+description: ONAP Policy Nexus
 name: nexus
 version: 2.0.0
index f8d80b0..2ed55ef 100644 (file)
@@ -33,10 +33,7 @@ pullPolicy: Always
 debugEnabled: false
 
 # application configuration
-# Example:
 config: {}
-#  username: myusername
-#  password: mypassword
 
 # default number of instances
 replicaCount: 1
index e899a00..8b110bd 100755 (executable)
@@ -47,7 +47,7 @@
       <repositories>
         <repository>
           <id>policy-nexus-snapshots</id>
-          <url>http://{{.Release.Name}}-{{.Values.global.nexus.nameOverride}}:8081/nexus/content/repositories/snapshots/</url>
+          <url>http://{{.Release.Name}}-{{.Values.global.nexus.nameOverride}}:{{.Values.config.nexusPort}}/nexus/content/repositories/snapshots/</url>
           <releases>
             <enabled>false</enabled>
             <updatePolicy>always</updatePolicy>
@@ -60,7 +60,7 @@
 
         <repository>
           <id>policy-nexus-releases</id>
-          <url>http://{{.Release.Name}}-{{.Values.global.nexus.nameOverride}}:8081/nexus/content/repositories/releases/</url>
+          <url>http://{{.Release.Name}}-{{.Values.global.nexus.nameOverride}}:{{.Values.config.nexusPort}}/nexus/content/repositories/releases/</url>
           <releases>
             <enabled>true</enabled>
             <updatePolicy>always</updatePolicy>
index aec7bf2..127a483 100644 (file)
@@ -29,9 +29,9 @@ ENGINE_MANAGEMENT_PASSWORD=31nst31n
 # nexus repository
 
 snapshotRepositoryID=policy-nexus-snapshots
-snapshotRepositoryUrl=http://{{.Release.Name}}-{{.Values.global.nexus.nameOverride}}:8081/nexus/content/repositories/snapshots/
+snapshotRepositoryUrl=http://{{.Release.Name}}-{{.Values.global.nexus.nameOverride}}:{{.Values.config.nexusPort}}/nexus/content/repositories/snapshots/
 releaseRepositoryID=policy-nexus-releases
-releaseRepositoryUrl=http://{{.Release.Name}}-{{.Values.global.nexus.nameOverride}}:8081/nexus/content/repositories/releases/
+releaseRepositoryUrl=http://{{.Release.Name}}-{{.Values.global.nexus.nameOverride}}:{{.Values.config.nexusPort}}/nexus/content/repositories/releases/
 repositoryUsername=admin
 repositoryPassword=admin123
 
index 91d8ed4..c60c745 100644 (file)
@@ -13,7 +13,7 @@
   export SERVICE_IP=$(kubectl get svc --namespace {{ include "common.namespace" . }} {{ include "common.name" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
   echo http://$SERVICE_IP:{{ .Values.service.externalPort }}
 {{- else if contains "ClusterIP" .Values.service.type }}
-  export POD_NAME=$(kubectl get pods --namespace {{ include "common.namespace" . }} -l "app={{ template "so.name" . }},release={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
+  export POD_NAME=$(kubectl get pods --namespace {{ include "common.namespace" . }} -l "app={{ include "common.name" . }},release={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
   echo "Visit http://127.0.0.1:8080 to use your application"
   kubectl port-forward $POD_NAME 8080:{{ .Values.service.internalPort }}
 {{- end }}
@@ -12,8 +12,8 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-apiVersion: extensions/v1beta1
-kind: Deployment
+apiVersion: apps/v1beta1
+kind: StatefulSet
 metadata:
   name: {{ include "common.fullname" . }}
   namespace: {{ include "common.namespace" . }}
@@ -23,7 +23,11 @@ metadata:
     release: {{ .Release.Name }}
     heritage: {{ .Release.Service }}
 spec:
+  serviceName: {{ include "common.fullname" . }}
   replicas: {{ .Values.replicaCount }}
+  selector:
+    matchLabels:
+      app: {{ include "common.name" . }}
   template:
     metadata:
       labels:
@@ -48,7 +52,7 @@ spec:
         imagePullPolicy: {{ .Values.global.pullPolicy | default .Values.pullPolicy }}
         name: {{ include "common.name" . }}-readiness
       hostAliases:
-      - ip: "{{ .Values.aaiServiceClusterIp }}"
+      - ip: "{{ .Values.config.aaiServiceClusterIp }}"
         hostnames:
         - "aai.api.simpledemo.openecomp.org"
       containers:
index 14ebe31..07499cd 100644 (file)
@@ -34,15 +34,13 @@ pullPolicy: Always
 # flag to enable debugging - application support required
 debugEnabled: false
 
-aaiServiceClusterIp: 10.43.255.254
 # application configuration
-# Example:
-config: {}
-#  username: myusername
-#  password: mypassword
+config:
+  nexusPort: 8081
+  aaiServiceClusterIp: 10.43.255.254
 
 # default number of instances
-replicaCount: 1
+replicaCount: 4
 
 nodeSelector: {}
 
index c420e67..c7c9a7d 100644 (file)
@@ -13,6 +13,6 @@
 # limitations under the License.
 
 apiVersion: v1
-description: Policy MariaDB Service
+description: ONAP Policy MariaDB Service
 name: mariadb
 version: 2.0.0
index da117f4..8be3d4c 100644 (file)
@@ -33,5 +33,5 @@ spec:
     - {{ .Values.persistence.accessMode }}
   persistentVolumeReclaimPolicy: {{ .Values.persistence.volumeReclaimPolicy }}
   hostPath:
-    path: {{ .Values.global.persistence.mountPath | default .Values.persistence.mountPath }}/{{ .Release.Name }}/{{ .Values.persistence.mountSubPath }}
+    path: {{ .Values.global.persistence.mountPath | default .Values.persistence.mountPath }}/{{ .Release.Namespace }}/{{ .Values.persistence.mountSubPath }}
 {{- end -}}
index 09a65ea..b849e18 100644 (file)
@@ -13,6 +13,6 @@
 # limitations under the License.
 
 apiVersion: v1
-description: Policy PDP
+description: ONAP Policy PDP
 name: pdp
 version: 2.0.0
index 9dae9f2..8325d42 100644 (file)
@@ -29,8 +29,8 @@ TOMCAT_X_MX_MB=1024
 
 UEB_CLUSTER=dmaap
 
-REST_PAP_URL=http://{{ .Release.Name }}-{{ .Values.global.pap.nameOverride }}:9091/pap/
-REST_PDP_ID=http://{{ include "common.fullname" . }}:8081/pdp/
+REST_PAP_URL=http://{{ .Release.Name }}-{{ .Values.global.pap.nameOverride }}:{{.Values.config.papPort}}/pap/
+REST_PDP_ID=http://{{ include "common.fullname" . }}:{{.Values.service.externalPort}}/pdp/
 REST_PDP_CONFIG=/opt/app/policy/servers/pdp/bin/config
 REST_PDP_WEBAPPS=/opt/app/policy/servers/pdp/webapps
 REST_PDP_REGISTER=true
index 141eb28..2021c09 100644 (file)
@@ -17,7 +17,7 @@ LOGPARSER_JMX_PORT=9997
 LOGPARSER_X_MS_MB=1024
 LOGPARSER_X_MX_MB=1024
 
-SERVER=http://{{ include "common.fullname" . }}:8081/pdp/
+SERVER=http://{{ include "common.fullname" . }}:{{.Values.service.externalPort}}/pdp/
 LOGPATH=/opt/app/policy/servers/pdp/logs/pdp-rest.log
 PARSERLOGPATH=IntegrityMonitor.log
 
index 91d8ed4..c60c745 100644 (file)
@@ -13,7 +13,7 @@
   export SERVICE_IP=$(kubectl get svc --namespace {{ include "common.namespace" . }} {{ include "common.name" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
   echo http://$SERVICE_IP:{{ .Values.service.externalPort }}
 {{- else if contains "ClusterIP" .Values.service.type }}
-  export POD_NAME=$(kubectl get pods --namespace {{ include "common.namespace" . }} -l "app={{ template "so.name" . }},release={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
+  export POD_NAME=$(kubectl get pods --namespace {{ include "common.namespace" . }} -l "app={{ include "common.name" . }},release={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
   echo "Visit http://127.0.0.1:8080 to use your application"
   kubectl port-forward $POD_NAME 8080:{{ .Values.service.internalPort }}
 {{- end }}
index aed3fd1..df63d38 100644 (file)
@@ -29,7 +29,7 @@ metadata:
           "version": "v1",
           "url": "/pdp",
           "protocol": "REST",
-          "port": "8081",
+          "port": "{{ .Values.service.externalPort }}",
           "visualRange":"1"
       },
       ]'
@@ -49,4 +49,3 @@ spec:
     app: {{ include "common.name" . }}
     release: {{ .Release.Name }}
   sessionAffinity: None
-  
index c2b7580..1fdc56e 100644 (file)
@@ -35,13 +35,11 @@ pullPolicy: Always
 debugEnabled: false
 
 # application configuration
-# Example:
-config: {}
-#  username: myusername
-#  password: mypassword
+config:
+  papPort: 9091
 
 # default number of instances
-replicaCount: 1
+replicaCount: 2
 
 nodeSelector: {}
 
index f853be0..be87249 100644 (file)
@@ -13,6 +13,6 @@
 # limitations under the License.
 
 apiVersion: v1
-description: Policy Common
+description: ONAP Policy Common
 name: policy-common
 version: 2.0.0
index 885a114..c335d4a 100644 (file)
@@ -17,8 +17,8 @@ POLICY_HOME=/opt/app/policy
 KEYSTORE_PASSWD=PolicyR0ck$
 
 JDBC_DRIVER=org.mariadb.jdbc.Driver
-JDBC_URL=jdbc:mariadb://{{ .Release.Name }}-{{ .Values.global.mariadb.nameOverride }}:3306/onap_sdk?failOverReadOnly=false&autoReconnect=true
-JDBC_LOG_URL=jdbc:mariadb://{{ .Release.Name }}-{{ .Values.global.mariadb.nameOverride }}:3306/log?failOverReadOnly=false&autoReconnect=true
+JDBC_URL=jdbc:mariadb://{{ .Release.Name }}-{{ .Values.global.mariadb.nameOverride }}:{{.Values.config.mariadbPort}}/onap_sdk?failOverReadOnly=false&autoReconnect=true
+JDBC_LOG_URL=jdbc:mariadb://{{ .Release.Name }}-{{ .Values.global.mariadb.nameOverride }}:{{.Values.config.mariadbPort}}/log?failOverReadOnly=false&autoReconnect=true
 JDBC_USER=policy_user
 JDBC_PASSWORD=policy_user
 
index 91d8ed4..c60c745 100644 (file)
@@ -13,7 +13,7 @@
   export SERVICE_IP=$(kubectl get svc --namespace {{ include "common.namespace" . }} {{ include "common.name" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
   echo http://$SERVICE_IP:{{ .Values.service.externalPort }}
 {{- else if contains "ClusterIP" .Values.service.type }}
-  export POD_NAME=$(kubectl get pods --namespace {{ include "common.namespace" . }} -l "app={{ template "so.name" . }},release={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
+  export POD_NAME=$(kubectl get pods --namespace {{ include "common.namespace" . }} -l "app={{ include "common.name" . }},release={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
   echo "Visit http://127.0.0.1:8080 to use your application"
   kubectl port-forward $POD_NAME 8080:{{ .Values.service.internalPort }}
 {{- end }}
index 8ac609d..3cee7cc 100644 (file)
@@ -27,10 +27,10 @@ global:
 debugEnabled: false
 
 # application configuration
-# Example:
 config:
   logstashServiceName: log-ls
   logstashPort: 5044
+  mariadbPort: 3306
 
 # default number of instances
 replicaCount: 1
index 2bf0d7b..f639633 100644 (file)
@@ -18,4 +18,4 @@ dependencies:
     # local reference to common chart, as it is
     # a part of this chart's package and will not
     # be published independently to a repo (at this point)
-    repository: '@local' 
+    repository: '@local'
index 3ed6ed4..a47956b 100644 (file)
@@ -91,7 +91,7 @@ REFRESH_RATE=40000
 #
 
 
-REST_PAP_URL=http://{{.Release.Name}}-{{.Values.global.pap.nameOverride}}:9091/pap/
+REST_PAP_URL=http://{{.Release.Name}}-{{.Values.global.pap.nameOverride}}:{{.Values.service.externalPort2}}/pap/
 
 #
 # Config/Action Properties location.
@@ -99,7 +99,7 @@ REST_PAP_URL=http://{{.Release.Name}}-{{.Values.global.pap.nameOverride}}:9091/p
 
 REST_CONFIG_HOME=/opt/app/policy/servers/pap/webapps/Config/
 REST_ACTION_HOME=/opt/app/policy/servers/pap/webapps/Action/
-REST_CONFIG_URL=http://{{.Release.Name}}-{{.Values.global.pap.nameOverride}}:9091/
+REST_CONFIG_URL=http://{{.Release.Name}}-{{.Values.global.pap.nameOverride}}:{{.Values.service.externalPort2}}/
 REST_CONFIG_WEBAPPS=/opt/app/policy/servers/pap/webapps/
 
 # PAP account information
index 28c2da1..768ebc9 100644 (file)
@@ -28,7 +28,7 @@ TOMCAT_X_MX_MB=1024
 # pap properties
 
 PAP_PDPS=/opt/app/policy/servers/pap/bin/pdps
-PAP_URL=http://{{ include "common.fullname" . }}:9091/pap/
+PAP_URL=http://{{ include "common.fullname" . }}:{{.Values.service.externalPort2}}/pap/
 
 PAP_INITIATE_PDP=true
 PAP_HEARTBEAT_INTERVAL=10000
@@ -39,8 +39,7 @@ REST_ADMIN_REPOSITORY=repository
 REST_ADMIN_WORKSPACE=workspace
 
 # PDP related properties
-
-PAP_PDP_URL=http://{{ .Release.Name }}-{{ .Values.global.pdp.nameOverride }}:8081/pdp/
+PAP_PDP_URL=http://{{ .Release.Name }}-{{ .Values.global.pdp.nameOverride }}-0.{{ .Release.Name }}-{{ .Values.global.pdp.nameOverride }}:{{ .Values.config.pdpPort }}/pdp/,http://{{ .Release.Name }}-{{ .Values.global.pdp.nameOverride }}-1.{{ .Release.Name }}-{{ .Values.global.pdp.nameOverride }}:{{ .Values.config.pdpPort }}/pdp/
 PAP_PDP_HTTP_USER_ID=testpdp
 PAP_PDP_HTTP_PASSWORD=alpha123
 
index 7124fde..430feb4 100644 (file)
@@ -17,7 +17,7 @@ LOGPARSER_JMX_PORT=9996
 LOGPARSER_X_MS_MB=1024
 LOGPARSER_X_MX_MB=1024
 
-SERVER=http://{{ include "common.fullname" . }}:9091/pap/
+SERVER=http://{{ include "common.fullname" . }}:{{.Values.service.externalPort2}}/pap/
 LOGPATH=/opt/app/policy/servers/pap/logs/pap-rest.log
 PARSERLOGPATH=IntegrityMonitor.log
 
index 5e0172b..3392fc7 100644 (file)
@@ -26,7 +26,7 @@ wget -O cl-amsterdam-template.drl https://git.onap.org/policy/drools-application
 
 sleep 2
 
-curl -v --silent -X POST --header 'Content-Type: multipart/form-data' --header 'Accept: text/plain' --header 'ClientAuth: cHl0aG9uOnRlc3Q=' --header 'Authorization: Basic dGVzdHBkcDphbHBoYTEyMw==' --header 'Environment: TEST' -F "file=@cl-amsterdam-template.drl" -F "importParametersJson={\"serviceName\":\"ClosedLoopControlName\",\"serviceType\":\"BRMSPARAM\"}" 'http://{{.Release.Name}}-{{.Values.global.pdp.nameOverride}}:8081/pdp/api/policyEngineImport' 
+curl -v --silent -X POST --header 'Content-Type: multipart/form-data' --header 'Accept: text/plain' --header 'ClientAuth: cHl0aG9uOnRlc3Q=' --header 'Authorization: Basic dGVzdHBkcDphbHBoYTEyMw==' --header 'Environment: TEST' -F "file=@cl-amsterdam-template.drl" -F "importParametersJson={\"serviceName\":\"ClosedLoopControlName\",\"serviceType\":\"BRMSPARAM\"}" 'http://{{.Release.Name}}-{{.Values.global.pdp.nameOverride}}:{{.Values.config.pdpPort}}/pdp/api/policyEngineImport' 
 
 echo "PRELOAD_POLICIES is $PRELOAD_POLICIES"
 
@@ -56,7 +56,7 @@ curl -v --silent -X PUT --header 'Content-Type: application/json' --header 'Acce
                        "controlLoopYaml": "controlLoop%3A%0D%0A++version%3A+2.0.0%0D%0A++controlLoopName%3A+ControlLoop-vFirewall-d0a1dfc6-94f5-4fd4-a5b5-4630b438850a%0D%0A++trigger_policy%3A+unique-policy-id-1-modifyConfig%0D%0A++timeout%3A+1200%0D%0A++abatement%3A+false%0D%0A+%0D%0Apolicies%3A%0D%0A++-+id%3A+unique-policy-id-1-modifyConfig%0D%0A++++name%3A+modify+packet+gen+config%0D%0A++++description%3A%0D%0A++++actor%3A+APPC%0D%0A++++recipe%3A+ModifyConfig%0D%0A++++target%3A%0D%0A++++++%23+TBD+-+Cannot+be+known+until+instantiation+is+done%0D%0A++++++resourceID%3A+Eace933104d443b496b8.nodes.heat.vpg%0D%0A++++++type%3A+VNF%0D%0A++++retry%3A+0%0D%0A++++timeout%3A+300%0D%0A++++success%3A+final_success%0D%0A++++failure%3A+final_failure%0D%0A++++failure_timeout%3A+final_failure_timeout%0D%0A++++failure_retries%3A+final_failure_retries%0D%0A++++failure_exception%3A+final_failure_exception%0D%0A++++failure_guard%3A+final_failure_guard"
                }
        }
-}' 'http://{{.Release.Name}}-{{.Values.global.pdp.nameOverride}}:8081/pdp/api/createPolicy'
+}' 'http://{{.Release.Name}}-{{.Values.global.pdp.nameOverride}}:{{.Values.config.pdpPort}}/pdp/api/createPolicy'
 
 sleep 2
 
@@ -76,7 +76,7 @@ curl -v --silent -X PUT --header 'Content-Type: application/json' --header 'Acce
                        "controlLoopYaml": "controlLoop%3A%0D%0A++version%3A+2.0.0%0D%0A++controlLoopName%3A+ControlLoop-vDNS-6f37f56d-a87d-4b85-b6a9-cc953cf779b3%0D%0A++trigger_policy%3A+unique-policy-id-1-scale-up%0D%0A++timeout%3A+1200%0D%0A++abatement%3A+false%0D%0Apolicies%3A%0D%0A++-+id%3A+unique-policy-id-1-scale-up%0D%0A++++name%3A+Create+a+new+VF+Module%0D%0A++++description%3A%0D%0A++++actor%3A+SO%0D%0A++++recipe%3A+VF+Module+Create%0D%0A++++target%3A%0D%0A++++++type%3A+VNF%0D%0A++++retry%3A+0%0D%0A++++timeout%3A+1200%0D%0A++++success%3A+final_success%0D%0A++++failure%3A+final_failure%0D%0A++++failure_timeout%3A+final_failure_timeout%0D%0A++++failure_retries%3A+final_failure_retries%0D%0A++++failure_exception%3A+final_failure_exception%0D%0A++++failure_guard%3A+final_failure_guard"
                }
        }
-}' 'http://{{.Release.Name}}-{{.Values.global.pdp.nameOverride}}:8081/pdp/api/createPolicy'
+}' 'http://{{.Release.Name}}-{{.Values.global.pdp.nameOverride}}:{{.Values.config.pdpPort}}/pdp/api/createPolicy'
 
 sleep 2
 
@@ -96,7 +96,7 @@ curl -v --silent -X PUT --header 'Content-Type: application/json' --header 'Acce
                        "controlLoopYaml": "controlLoop%3A%0D%0A++version%3A+2.0.0%0D%0A++controlLoopName%3A+ControlLoop-VOLTE-2179b738-fd36-4843-a71a-a8c24c70c55b%0D%0A++trigger_policy%3A+unique-policy-id-1-restart%0D%0A++timeout%3A+3600%0D%0A++abatement%3A+false%0D%0A+%0D%0Apolicies%3A%0D%0A++-+id%3A+unique-policy-id-1-restart%0D%0A++++name%3A+Restart+the+VM%0D%0A++++description%3A%0D%0A++++actor%3A+VFC%0D%0A++++recipe%3A+Restart%0D%0A++++target%3A%0D%0A++++++type%3A+VM%0D%0A++++retry%3A+3%0D%0A++++timeout%3A+1200%0D%0A++++success%3A+final_success%0D%0A++++failure%3A+final_failure%0D%0A++++failure_timeout%3A+final_failure_timeout%0D%0A++++failure_retries%3A+final_failure_retries%0D%0A++++failure_exception%3A+final_failure_exception%0D%0A++++failure_guard%3A+final_failure_guard"
                }
        }
-}' 'http://{{.Release.Name}}-{{.Values.global.pdp.nameOverride}}:8081/pdp/api/createPolicy'
+}' 'http://{{.Release.Name}}-{{.Values.global.pdp.nameOverride}}:{{.Values.config.pdpPort}}/pdp/api/createPolicy'
 
 sleep 2
 
@@ -116,7 +116,7 @@ curl -v --silent -X PUT --header 'Content-Type: application/json' --header 'Acce
                        "controlLoopYaml": "controlLoop%3A%0D%0A++version%3A+2.0.0%0D%0A++controlLoopName%3A+ControlLoop-vCPE-48f0c2c3-a172-4192-9ae3-052274181b6e%0D%0A++trigger_policy%3A+unique-policy-id-1-restart%0D%0A++timeout%3A+3600%0D%0A++abatement%3A+true%0D%0A+%0D%0Apolicies%3A%0D%0A++-+id%3A+unique-policy-id-1-restart%0D%0A++++name%3A+Restart+the+VM%0D%0A++++description%3A%0D%0A++++actor%3A+APPC%0D%0A++++recipe%3A+Restart%0D%0A++++target%3A%0D%0A++++++type%3A+VM%0D%0A++++retry%3A+3%0D%0A++++timeout%3A+1200%0D%0A++++success%3A+final_success%0D%0A++++failure%3A+final_failure%0D%0A++++failure_timeout%3A+final_failure_timeout%0D%0A++++failure_retries%3A+final_failure_retries%0D%0A++++failure_exception%3A+final_failure_exception%0D%0A++++failure_guard%3A+final_failure_guard"
                }
        }
-}' 'http://{{.Release.Name}}-{{.Values.global.pdp.nameOverride}}:8081/pdp/api/createPolicy'
+}' 'http://{{.Release.Name}}-{{.Values.global.pdp.nameOverride}}:{{.Values.config.pdpPort}}/pdp/api/createPolicy'
 
 #########################################Create Micro Service Config policies##########################################
 
@@ -130,7 +130,7 @@ curl -v --silent -X PUT --header 'Content-Type: application/json' --header 'Acce
        "policyConfigType": "MicroService",
        "policyName": "com.MicroServicevFirewall",
        "onapName": "DCAE"
-}' 'http://{{.Release.Name}}-{{.Values.global.pdp.nameOverride}}:8081/pdp/api/createPolicy'
+}' 'http://{{.Release.Name}}-{{.Values.global.pdp.nameOverride}}:{{.Values.config.pdpPort}}/pdp/api/createPolicy'
 
 
 sleep 2
@@ -141,7 +141,7 @@ curl -v --silent -X PUT --header 'Content-Type: application/json' --header 'Acce
        "policyConfigType": "MicroService",
        "policyName": "com.MicroServicevDNS",
        "onapName": "DCAE"
-}' 'http://{{.Release.Name}}-{{.Values.global.pdp.nameOverride}}:8081/pdp/api/createPolicy'
+}' 'http://{{.Release.Name}}-{{.Values.global.pdp.nameOverride}}:{{.Values.config.pdpPort}}/pdp/api/createPolicy'
 
 
 sleep 2
@@ -152,7 +152,7 @@ curl -v --silent -X PUT --header 'Content-Type: application/json' --header 'Acce
        "policyConfigType": "MicroService",
        "policyName": "com.MicroServicevCPE",
        "onapName": "DCAE"
-}' 'http://{{.Release.Name}}-{{.Values.global.pdp.nameOverride}}:8081/pdp/api/createPolicy'
+}' 'http://{{.Release.Name}}-{{.Values.global.pdp.nameOverride}}:{{.Values.config.pdpPort}}/pdp/api/createPolicy'
 
 
 #########################################Creating Decision Guard policy######################################### 
@@ -179,7 +179,7 @@ curl -v --silent -X PUT --header 'Content-Type: application/json' --header 'Acce
                        "guardActiveEnd": "00:00:00-05:00" 
                } 
        } 
-}' 'http://{{.Release.Name}}-{{.Values.global.pdp.nameOverride}}:8081/pdp/api/createPolicy'
+}' 'http://{{.Release.Name}}-{{.Values.global.pdp.nameOverride}}:{{.Values.config.pdpPort}}/pdp/api/createPolicy'
 
 #########################################Push Decision policy#########################################
 
@@ -190,7 +190,7 @@ curl -v --silent -X PUT --header 'Content-Type: application/json' --header 'Acce
   "pdpGroup": "default", 
   "policyName": "com.AllPermitGuard", 
   "policyType": "DECISION" 
-}' 'http://{{.Release.Name}}-{{.Values.global.pdp.nameOverride}}:8081/pdp/api/pushPolicy'
+}' 'http://{{.Release.Name}}-{{.Values.global.pdp.nameOverride}}:{{.Values.config.pdpPort}}/pdp/api/pushPolicy'
 
 #########################################Pushing BRMS Param policies##########################################
 
@@ -203,7 +203,7 @@ curl -v --silent -X PUT --header 'Content-Type: application/json' --header 'Acce
   "pdpGroup": "default",
   "policyName": "com.BRMSParamvFirewall",
   "policyType": "BRMS_Param"
-}' 'http://{{.Release.Name}}-{{.Values.global.pdp.nameOverride}}:8081/pdp/api/pushPolicy'
+}' 'http://{{.Release.Name}}-{{.Values.global.pdp.nameOverride}}:{{.Values.config.pdpPort}}/pdp/api/pushPolicy'
 
 sleep 2
 
@@ -212,7 +212,7 @@ curl -v --silent -X PUT --header 'Content-Type: application/json' --header 'Acce
   "pdpGroup": "default",
   "policyName": "com.BRMSParamvDNS",
   "policyType": "BRMS_Param"
-}' 'http://{{.Release.Name}}-{{.Values.global.pdp.nameOverride}}:8081/pdp/api/pushPolicy'
+}' 'http://{{.Release.Name}}-{{.Values.global.pdp.nameOverride}}:{{.Values.config.pdpPort}}/pdp/api/pushPolicy'
 
 sleep 2
 
@@ -221,7 +221,7 @@ curl -v --silent -X PUT --header 'Content-Type: application/json' --header 'Acce
   "pdpGroup": "default",
   "policyName": "com.BRMSParamVOLTE",
   "policyType": "BRMS_Param"
-}' 'http://{{.Release.Name}}-{{.Values.global.pdp.nameOverride}}:8081/pdp/api/pushPolicy'
+}' 'http://{{.Release.Name}}-{{.Values.global.pdp.nameOverride}}:{{.Values.config.pdpPort}}/pdp/api/pushPolicy'
 
 sleep 2
 
@@ -230,7 +230,7 @@ curl -v --silent -X PUT --header 'Content-Type: application/json' --header 'Acce
   "pdpGroup": "default",
   "policyName": "com.BRMSParamvCPE",
   "policyType": "BRMS_Param"
-}' 'http://{{.Release.Name}}-{{.Values.global.pdp.nameOverride}}:8081/pdp/api/pushPolicy'
+}' 'http://{{.Release.Name}}-{{.Values.global.pdp.nameOverride}}:{{.Values.config.pdpPort}}/pdp/api/pushPolicy'
 
 #########################################Pushing MicroService Config policies##########################################
 
@@ -243,7 +243,7 @@ curl -v --silent -X PUT --header 'Content-Type: application/json' --header 'Acce
   "pdpGroup": "default",
   "policyName": "com.MicroServicevFirewall",
   "policyType": "MicroService"
-}' 'http://{{.Release.Name}}-{{.Values.global.pdp.nameOverride}}:8081/pdp/api/pushPolicy'
+}' 'http://{{.Release.Name}}-{{.Values.global.pdp.nameOverride}}:{{.Values.config.pdpPort}}/pdp/api/pushPolicy'
 
 sleep 10
 
@@ -252,7 +252,7 @@ curl -v --silent -X PUT --header 'Content-Type: application/json' --header 'Acce
   "pdpGroup": "default",
   "policyName": "com.MicroServicevDNS",
   "policyType": "MicroService"
-}' 'http://{{.Release.Name}}-{{.Values.global.pdp.nameOverride}}:8081/pdp/api/pushPolicy' 
+}' 'http://{{.Release.Name}}-{{.Values.global.pdp.nameOverride}}:{{.Values.config.pdpPort}}/pdp/api/pushPolicy' 
 
 sleep 10
 
@@ -261,4 +261,4 @@ curl -v --silent -X PUT --header 'Content-Type: application/json' --header 'Acce
   "pdpGroup": "default",
   "policyName": "com.MicroServicevCPE",
   "policyType": "MicroService"
-}' 'http://{{.Release.Name}}-{{.Values.global.pdp.nameOverride}}:8081/pdp/api/pushPolicy' 
+}' 'http://{{.Release.Name}}-{{.Values.global.pdp.nameOverride}}:{{.Values.config.pdpPort}}/pdp/api/pushPolicy' 
index 91d8ed4..c60c745 100644 (file)
@@ -13,7 +13,7 @@
   export SERVICE_IP=$(kubectl get svc --namespace {{ include "common.namespace" . }} {{ include "common.name" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
   echo http://$SERVICE_IP:{{ .Values.service.externalPort }}
 {{- else if contains "ClusterIP" .Values.service.type }}
-  export POD_NAME=$(kubectl get pods --namespace {{ include "common.namespace" . }} -l "app={{ template "so.name" . }},release={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
+  export POD_NAME=$(kubectl get pods --namespace {{ include "common.namespace" . }} -l "app={{ include "common.name" . }},release={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
   echo "Visit http://127.0.0.1:8080 to use your application"
   kubectl port-forward $POD_NAME 8080:{{ .Values.service.internalPort }}
 {{- end }}
index 171ea10..10480a0 100644 (file)
@@ -64,9 +64,9 @@ nexus:
 debugEnabled: false
 
 # application configuration
-# Example:
 config:
   preloadPolicies: true
+  pdpPort: 8081
 
 # default number of instances
 replicaCount: 1
index dd5be16..82c652d 100644 (file)
@@ -1,6 +1,24 @@
 # Patterns to ignore when building packages.
 # This supports shell glob matching, relative path matching, and
 # negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
 
 # docker folder
 docker/
index b7c9e7b..b59346a 100644 (file)
@@ -13,6 +13,6 @@
 # limitations under the License.
 
 apiVersion: v1
-description: A Helm chart for Kubernetes
+description: ONAP Web Portal
 name: portal
-version: 0.1.0
+version: 2.0.0
diff --git a/kubernetes/portal/charts/portal-app/.helmignore b/kubernetes/portal/charts/portal-app/.helmignore
new file mode 100644 (file)
index 0000000..f0c1319
--- /dev/null
@@ -0,0 +1,21 @@
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
diff --git a/kubernetes/portal/charts/portal-app/Chart.yaml b/kubernetes/portal/charts/portal-app/Chart.yaml
new file mode 100644 (file)
index 0000000..0ccf705
--- /dev/null
@@ -0,0 +1,18 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: v1
+description: ONAP Portal application
+name: portal-app
+version: 2.0.0
\ No newline at end of file
@@ -39,7 +39,7 @@
 
 <!DOCTYPE xml>
 <configuration scan="true" scanPeriod="3 seconds" debug="true">
-       <!-- Log-back files for the ECOMP Portal are created in directory 
+       <!-- Log-back files for the ECOMP Portal are created in directory
                ${catalina.base}/logs/${componentName}; e.g., apache-tomcat-8.0.35/logs/onapportal/application.log -->
        <!--<jmxConfigurator /> -->
 
diff --git a/kubernetes/portal/charts/portal-app/resources/config/deliveries/properties/ONAPPORTAL/music.properties b/kubernetes/portal/charts/portal-app/resources/config/deliveries/properties/ONAPPORTAL/music.properties
new file mode 100644 (file)
index 0000000..95ece9e
--- /dev/null
@@ -0,0 +1,19 @@
+music.version = v2
+music.keyspace = keyspaces
+music.session.keyspace = portal
+music.tables = tables
+music.session.attr.tables = spring_session_attributes
+music.session.meta.tables = spring_session
+music.consistency.info = type
+music.consistency.info.value = eventual
+music.cache = false
+music.session.max.inactive.interval.seconds = 1800
+music.serialize.compress = true
+
+#By default it's eventual
+music.atomic.get = false
+music.atomic.put = true
+cassandra.host={{.Values.cassandra.service.name}}.{{.Release.Namespace}}
+zookeeper.host={{.Values.zookeeper.service.name}}.{{.Release.Namespace}}
+cassandra.user={{.Values.cassandra.config.cassandraUsername}}
+cassandra.password={{.Values.cassandra.config.cassandraPassword}}
\ No newline at end of file
@@ -16,7 +16,7 @@ ueb_app_key = 7GkVcrO6sIDb3ngW
 ueb_app_secret = uCYgKjWKK5IxPGNNZzYSSWo9
 ueb_app_mailbox_name = ECOMP-PORTAL-INBOX
 
-ueb_url_list = dmaap.{{.Values.nsPrefix}}
+ueb_url_list = dmaap.{{.Release.Namespace}}
 ecomp_portal_inbox_name = ECOMP-PORTAL-INBOX
 
 # Consumer group name for UEB topic.
@@ -1,6 +1,6 @@
 #mysql
 db.driver = org.mariadb.jdbc.Driver
-db.connectionURL = jdbc:mariadb:failover://portaldb.{{.Values.nsPrefix}}:3306/portal
+db.connectionURL = jdbc:mariadb:failover://{{.Values.mariadb.service.name}}.{{.Release.Namespace}}:3306/portal
 db.userName =root
 db.password =Aa123456
 db.hib.dialect = org.hibernate.dialect.MySQLDialect
@@ -13,7 +13,7 @@ hb.idle_connection_test_period = 3600
 
 app_display_name = Portal
 files_path = /tmp
-context_root = ECOMPPORTAL
+context_root = ONAPPORTAL
 # menu settings
 menu_query_name                      = menuData
 menu_properties_file_location        = /WEB-INF/fusion/menu/
@@ -46,8 +46,6 @@ sessiontimeout_feed_cron        = 0 0/5 * * * ? *
 #Front end URL
 frontend_url                  = http://portal.api.simpledemo.onap.org:8989/ONAPPORTAL/applicationsHome 
 
-#cookie domain
-cookie_domain = onap.org
 
 # An Unqiue 128-bit value defined to indentify a specific version of
 # ECOMP Portal deployed on a specific virtual machine.
@@ -84,9 +82,9 @@ notification_update_duration = 900
 
 #Microservices Related Properties for Portal
 microservices.widget.protocol = http
-microservices.widget.hostname = portalwidgets.{{.Values.nsPrefix}}
+microservices.widget.hostname = {{.Values.widget.service.name}}.{{.Release.Namespace}}
 microservices.widget.username = widget_user
-microservices.widget.password = KpuqIB08YHg+btG+pjX+sA==
+microservices.widget.password = M+KcrCMVrR1rAxtiFE49n1uXC3FCkNBqFgeYsubEC/U=
 #This property won't be needed after consul is functional on VMs -
 microservices.widget.local.port = 8082
 microservices.m-learn.local.port = 8083
@@ -98,3 +96,15 @@ auditlog_del_day_from = 365
 
 #External system notification URL
 external_system_notification_url= https://jira.onap.org/browse/
+
+# External Access System Basic Auth Credentials & Rest endpoint(These credentials doesn't work as these are place holders for now)
+ext_central_access_user_name = m00468@portal.onap.org
+ext_central_access_password = ByC0BEX2v5+4HBv2GA4S+Mi2iML+GrGNJ5Gxo/V/iWM=
+ext_central_access_url = https://aaftest.test.onap.org:8095/proxy/authz/
+ext_central_access_user_domain = @csp.onap.org
+
+# External Central Auth system access
+remote_centralized_system_access = false
+
+#cookie domain
+cookie_domain = onap.org
diff --git a/kubernetes/portal/charts/portal-app/templates/NOTES.txt b/kubernetes/portal/charts/portal-app/templates/NOTES.txt
new file mode 100644 (file)
index 0000000..2465e03
--- /dev/null
@@ -0,0 +1,19 @@
+1. Get the application URL by running these commands:
+{{- if .Values.ingress.enabled }}
+{{- range .Values.ingress.hosts }}
+  http://{{ . }}
+{{- end }}
+{{- else if contains "NodePort" .Values.service.type }}
+  export NODE_PORT=$(kubectl get --namespace {{ include "common.namespace" . }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "common.fullname" . }})
+  export NODE_IP=$(kubectl get nodes --namespace {{ include "common.namespace" . }} -o jsonpath="{.items[0].status.addresses[0].address}")
+  echo http://$NODE_IP:$NODE_PORT
+{{- else if contains "LoadBalancer" .Values.service.type }}
+     NOTE: It may take a few minutes for the LoadBalancer IP to be available.
+           You can watch the status of by running 'kubectl get svc -w {{ include "common.fullname" . }}'
+  export SERVICE_IP=$(kubectl get svc --namespace {{ include "common.namespace" . }} {{ include "common.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
+  echo http://$SERVICE_IP:{{ .Values.service.externalPort }}
+{{- else if contains "ClusterIP" .Values.service.type }}
+  export POD_NAME=$(kubectl get pods --namespace {{ include "common.namespace" . }} -l "app={{ template "so.name" . }},release={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
+  echo "Visit http://127.0.0.1:8080 to use your application"
+  kubectl port-forward $POD_NAME 8080:{{ .Values.service.internalPort }}
+{{- end }}
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-#{{ if not .Values.disableSdncSdncDbhost }}
-#{{ if not .Values.disableNfsProvisioner }}
-kind: StorageClass
-apiVersion: storage.k8s.io/v1
+apiVersion: v1
+kind: ConfigMap
 metadata:
-  name: "{{ .Values.nsPrefix }}-sdnc-data"
-  namespace: "{{ .Values.nsPrefix }}"
-provisioner: sdnc/nfs
-#{{ end }}
-#{{ end }}
+  name: {{ include "common.fullname" . }}-onapportal
+  namespace: {{ include "common.namespace" . }}
+data:
+{{ tpl (.Files.Glob "resources/config/deliveries/properties/ONAPPORTAL/*").AsConfig . | indent 2 }}
\ No newline at end of file
diff --git a/kubernetes/portal/charts/portal-app/templates/deployment.yaml b/kubernetes/portal/charts/portal-app/templates/deployment.yaml
new file mode 100644 (file)
index 0000000..bfe1033
--- /dev/null
@@ -0,0 +1,139 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: extensions/v1beta1
+kind: Deployment
+metadata:
+  name: {{ include "common.fullname" . }}
+  namespace: {{ include "common.namespace" . }}
+  labels:
+    app: {{ include "common.name" . }}
+    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
+    release: {{ .Release.Name }}
+    heritage: {{ .Release.Service }}
+spec:
+  replicas: {{ .Values.replicaCount }}
+  template:
+    metadata:
+      labels:
+        app: {{ include "common.name" . }}
+        release: {{ .Release.Name }}
+    spec:
+      initContainers:
+      - name: {{ include "common.name" . }}-readiness
+        image: "{{ .Values.global.readinessRepository }}/{{ .Values.global.readinessImage }}"
+        imagePullPolicy: {{ .Values.global.pullPolicy | default .Values.pullPolicy }}
+        command:
+        - /root/ready.py
+        args:
+        - --container-name
+        - {{ .Values.mariadb.nameOverride }}
+        env:
+        - name: NAMESPACE
+          valueFrom:
+            fieldRef:
+              apiVersion: v1
+              fieldPath: metadata.namespace
+      containers:
+      - name: {{ include "common.name" . }}
+        image: "{{ .Values.global.repository | default .Values.repository }}/{{ .Values.image }}"
+        imagePullPolicy: {{ .Values.global.pullPolicy | default .Values.pullPolicy }}
+        command:
+          - /start-apache-tomcat.sh
+          - -i
+          - ""
+          - -n
+          - ""
+        ports:
+        - containerPort: {{ .Values.service.internalPort }}
+        - containerPort: {{ .Values.service.internalPort2 }}
+        - containerPort: {{ .Values.service.internalPort3 }}
+        {{- if eq .Values.liveness.enabled true }}
+        livenessProbe:
+          tcpSocket:
+            port: {{ .Values.service.internalPort }}
+          initialDelaySeconds: {{ .Values.liveness.initialDelaySeconds }}
+          periodSeconds: {{ .Values.liveness.periodSeconds }}
+        {{ end -}}
+        readinessProbe:
+          tcpSocket:
+            port: {{ .Values.service.internalPort }}
+          initialDelaySeconds: {{ .Values.readiness.initialDelaySeconds }}
+          periodSeconds: {{ .Values.readiness.periodSeconds }}
+        volumeMounts:
+        - mountPath: /etc/localtime
+          name: localtime
+          readOnly: true
+        - name: properties-onapportal
+          mountPath: "{{ .Values.global.env.tomcatDir }}/webapps/ONAPPORTAL/WEB-INF/fusion/conf/fusion.properties"
+          subPath: fusion.properties
+        - name: properties-onapportal
+          mountPath: "{{ .Values.global.env.tomcatDir }}/webapps/ONAPPORTAL/WEB-INF/classes/openid-connect.properties"
+          subPath: openid-connect.properties
+        - name: properties-onapportal
+          mountPath: "{{ .Values.global.env.tomcatDir }}/webapps/ONAPPORTAL/WEB-INF/conf/system.properties"
+          subPath: system.properties
+        - name: properties-onapportal
+          mountPath: "{{ .Values.global.env.tomcatDir }}/webapps/ONAPPORTAL/WEB-INF/classes/portal.properties"
+          subPath: portal.properties
+        - name: properties-onapportal
+          mountPath: "{{ .Values.global.env.tomcatDir }}/webapps/ONAPPORTAL/WEB-INF/classes/music.properties"
+          subPath: music.properties
+        - name: properties-onapportal
+          mountPath: "{{ .Values.global.env.tomcatDir }}/webapps/ONAPPORTAL/WEB-INF/classes/logback.xml"
+          subPath: logback.xml
+        - name: portal-tomcat-logs
+          mountPath: "{{ .Values.global.env.tomcatDir }}/logs"
+        - name: var-log-onap
+          mountPath: /var/log/onap
+        resources:
+{{ toYaml .Values.resources | indent 12 }}
+      {{- if .Values.nodeSelector }}
+      nodeSelector:
+{{ toYaml .Values.nodeSelector | indent 10 }}
+      {{- end -}}
+      {{- if .Values.affinity }}
+      affinity:
+{{ toYaml .Values.affinity | indent 10 }}
+      {{- end }}
+      - name: filebeat-onap
+        image: "{{ .Values.global.loggingRepository }}/{{ .Values.global.loggingImage }}"
+        imagePullPolicy: {{ .Values.global.pullPolicy | default .Values.pullPolicy }}
+        volumeMounts:
+        - mountPath: /usr/share/filebeat/filebeat.yml
+          name: filebeat-conf
+          subPath: filebeat.yml
+        - name: portal-data-filebeat
+          mountPath: /usr/share/filebeat/data
+        - name: var-log-onap
+          mountPath: /var/log/onap
+      volumes:
+        - name: localtime
+          hostPath:
+            path: /etc/localtime
+        - name: properties-onapportal
+          configMap:
+            name: {{ include "common.fullname" . }}-onapportal
+            defaultMode: 0755
+        - name: filebeat-conf
+          configMap:
+            name: portal-filebeat
+        - name: var-log-onap
+          emptyDir: {}
+        - name: portal-data-filebeat
+          emptyDir: {}
+        - name: portal-tomcat-logs
+          emptyDir: {}
+      imagePullSecrets:
+      - name: "{{ include "common.namespace" . }}-docker-registry-key"
\ No newline at end of file
diff --git a/kubernetes/portal/charts/portal-app/templates/service.yaml b/kubernetes/portal/charts/portal-app/templates/service.yaml
new file mode 100644 (file)
index 0000000..3d139d5
--- /dev/null
@@ -0,0 +1,65 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ include "common.fullname" . }}
+  namespace: {{ include "common.namespace" . }}
+  labels:
+    app: {{ include "common.name" . }}
+    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
+    release: {{ .Release.Name }}
+    heritage: {{ .Release.Service }}
+  annotations:
+    msb.onap.org/service-info: '[
+      {
+          "serviceName": "portal",
+          "version": "v2",
+          "url": "/",
+          "protocol": "REST"
+          "port": "8989",
+          "visualRange":"1"
+      }
+      ]'
+spec:
+  type: {{ .Values.service.type }}
+  ports:
+    {{if eq .Values.service.type "NodePort" -}}
+    - port: {{ .Values.service.externalPort }}
+      targetPort: {{ .Values.service.internalPort }}
+      nodePort: {{ .Values.global.nodePortPrefix | default .Values.nodePortPrefix }}{{ .Values.service.nodePort }}
+      name: {{ .Values.service.name }}
+    - port: {{ .Values.service.externalPort2 }}
+      targetPort: {{ .Values.service.internalPort2 }}
+      nodePort: {{ .Values.global.nodePortPrefix | default .Values.nodePortPrefix }}{{ .Values.service.nodePort2 }}
+      name: {{ .Values.service.name }}2
+    - port: {{ .Values.service.externalPort3 }}
+      targetPort: {{ .Values.service.internalPort3 }}
+      nodePort: {{ .Values.global.nodePortPrefix | default .Values.nodePortPrefix }}{{ .Values.service.nodePort3 }}
+      name: {{ .Values.service.name }}3
+    {{- else -}}
+    - port: {{ .Values.service.externalPort }}
+      targetPort: {{ .Values.service.internalPort }}
+      name: {{ .Values.service.name }}
+    - port: {{ .Values.service.externalPort2 }}
+      targetPort: {{ .Values.service.internalPort2 }}
+      name: {{ .Values.service.name }}2
+    - port: {{ .Values.service.externalPort3 }}
+      targetPort: {{ .Values.service.internalPort3 }}
+      name: {{ .Values.service.name }}3
+    {{- end}}
+  selector:
+    app: {{ include "common.name" . }}
+    release: {{ .Release.Name }}
\ No newline at end of file
diff --git a/kubernetes/portal/charts/portal-app/values.yaml b/kubernetes/portal/charts/portal-app/values.yaml
new file mode 100644 (file)
index 0000000..4415635
--- /dev/null
@@ -0,0 +1,108 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+#################################################################
+# Global configuration defaults.
+#################################################################
+global:
+  nodePortPrefix: 302
+  repositorySecret: eyJuZXh1czMub25hcC5vcmc6MTAwMDEiOnsidXNlcm5hbWUiOiJkb2NrZXIiLCJwYXNzd29yZCI6ImRvY2tlciIsImVtYWlsIjoiQCIsImF1dGgiOiJaRzlqYTJWeU9tUnZZMnRsY2c9PSJ9fQ==
+  readinessRepository: oomk8s
+  readinessImage: readiness-check:1.1.0
+  loggingRepository: docker.elastic.co
+  loggingImage: beats/filebeat:5.5.0
+
+#################################################################
+# Application configuration defaults.
+#################################################################
+# application image
+repository: nexus3.onap.org:10001
+image: onap/portal-app:latest
+pullPolicy: Always
+
+# flag to enable debugging - application support required
+debugEnabled: false
+
+# default number of instances
+replicaCount: 1
+
+nodeSelector: {}
+
+affinity: {}
+
+# probe configuration parameters
+liveness:
+  initialDelaySeconds: 10
+  periodSeconds: 10
+  # necessary to disable liveness probe when setting breakpoints
+  # in debugger so K8s doesn't restart unresponsive container
+  enabled: true
+
+readiness:
+  initialDelaySeconds: 10
+  periodSeconds: 10
+
+service:
+  type: NodePort
+  name: portal-app
+  externalPort: 8989
+  internalPort: 8080
+  nodePort: 15
+  externalPort2: 8006
+  internalPort2: 8005
+  nodePort2: 13
+  externalPort3: 8010
+  internalPort3: 8009
+  nodePort3: 14
+
+mariadb:
+  nameOverride: portal-db
+  service:
+    name: portal-db
+widget:
+  service:
+    name: portal-widget
+
+cassandra:
+  service:
+    name: portal-cassandra
+  config:
+    cassandraUsername: root
+    cassandraPassword: Aa123456
+
+zookeeper:
+  service:
+    name: portal-zk
+
+ingress:
+  enabled: false
+
+resources: {}
+  # We usually recommend not to specify default resources and to leave this as a conscious
+  # choice for the user. This also increases chances charts run on environments with little
+  # resources, such as Minikube. If you do want to specify resources, uncomment the following
+  # lines, adjust them as necessary, and remove the curly braces after 'resources:'.
+  #
+  # Example:
+  # Configure resource requests and limits
+  # ref: http://kubernetes.io/docs/user-guide/compute-resources/
+  # Minimum memory for development is 2 CPU cores and 4GB memory
+  # Minimum memory for production is 4 CPU cores and 8GB memory
+#resources:
+#  limits:
+#    cpu: 2
+#    memory: 4Gi
+#  requests:
+#    cpu: 2
+#    memory: 4Gi
diff --git a/kubernetes/portal/charts/portal-cassandra/.helmignore b/kubernetes/portal/charts/portal-cassandra/.helmignore
new file mode 100644 (file)
index 0000000..f0c1319
--- /dev/null
@@ -0,0 +1,21 @@
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
diff --git a/kubernetes/portal/charts/portal-cassandra/Chart.yaml b/kubernetes/portal/charts/portal-cassandra/Chart.yaml
new file mode 100644 (file)
index 0000000..3e53ed6
--- /dev/null
@@ -0,0 +1,18 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: v1
+description: Portal cassandra
+name: portal-cassandra
+version: 2.0.0
\ No newline at end of file
diff --git a/kubernetes/portal/charts/portal-cassandra/resources/config/cassandra/docker-entrypoint-initdb.d/portal.cql b/kubernetes/portal/charts/portal-cassandra/resources/config/cassandra/docker-entrypoint-initdb.d/portal.cql
new file mode 100644 (file)
index 0000000..2451d6c
--- /dev/null
@@ -0,0 +1,54 @@
+CREATE KEYSPACE IF NOT EXISTS portal
+    WITH REPLICATION = {
+        'class' : 'SimpleStrategy',
+        'replication_factor': 1
+    }
+    AND DURABLE_WRITES = true;
+
+
+CREATE TABLE portal.spring_session (
+    primary_id text PRIMARY KEY,
+    creation_time text,
+    expiry_time text,
+    last_access_time text,
+    max_inactive_interval text,
+    principal_name text,
+    session_id text,
+    vector_ts text
+) WITH bloom_filter_fp_chance = 0.01
+    AND caching = {'keys': 'ALL', 'rows_per_partition': '10'}
+    AND comment = ''
+    AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4'}
+    AND compression = {'chunk_length_in_kb': '64', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'}
+    AND crc_check_chance = 1.0
+    AND dclocal_read_repair_chance = 0.1
+    AND default_time_to_live = 0
+    AND gc_grace_seconds = 864000
+    AND max_index_interval = 2048
+    AND memtable_flush_period_in_ms = 0
+    AND min_index_interval = 128
+    AND read_repair_chance = 0.0
+    AND speculative_retry = '99PERCENTILE';
+
+
+CREATE TABLE portal.spring_session_attributes (
+    primary_id text,
+    attribute_name text,
+    attribute_bytes blob,
+    vector_ts text,
+    PRIMARY KEY (primary_id, attribute_name)
+) WITH CLUSTERING ORDER BY (attribute_name ASC)
+    AND bloom_filter_fp_chance = 0.01
+    AND caching = {'keys': 'ALL', 'rows_per_partition': '1'}
+    AND comment = ''
+    AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4'}
+    AND compression = {'chunk_length_in_kb': '64', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'}
+    AND crc_check_chance = 1.0
+    AND dclocal_read_repair_chance = 0.1
+    AND default_time_to_live = 0
+    AND gc_grace_seconds = 864000
+    AND max_index_interval = 2048
+    AND memtable_flush_period_in_ms = 0
+    AND min_index_interval = 128
+    AND read_repair_chance = 0.0
+    AND speculative_retry = '99PERCENTILE';
diff --git a/kubernetes/portal/charts/portal-cassandra/resources/config/cassandra/docker-entrypoint-initdb.d/portalsdk.cql b/kubernetes/portal/charts/portal-cassandra/resources/config/cassandra/docker-entrypoint-initdb.d/portalsdk.cql
new file mode 100644 (file)
index 0000000..47ae6cc
--- /dev/null
@@ -0,0 +1,54 @@
+CREATE KEYSPACE IF NOT EXISTS portalsdk
+    WITH REPLICATION = {
+        'class' : 'SimpleStrategy',
+        'replication_factor': 1
+    }
+    AND DURABLE_WRITES = true;
+
+
+CREATE TABLE portalsdk.spring_session (
+    primary_id text PRIMARY KEY,
+    creation_time text,
+    expiry_time text,
+    last_access_time text,
+    max_inactive_interval text,
+    principal_name text,
+    session_id text,
+    vector_ts text
+) WITH bloom_filter_fp_chance = 0.01
+    AND caching = {'keys': 'ALL', 'rows_per_partition': '10'}
+    AND comment = ''
+    AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4'}
+    AND compression = {'chunk_length_in_kb': '64', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'}
+    AND crc_check_chance = 1.0
+    AND dclocal_read_repair_chance = 0.1
+    AND default_time_to_live = 0
+    AND gc_grace_seconds = 864000
+    AND max_index_interval = 2048
+    AND memtable_flush_period_in_ms = 0
+    AND min_index_interval = 128
+    AND read_repair_chance = 0.0
+    AND speculative_retry = '99PERCENTILE';
+
+
+CREATE TABLE portalsdk.spring_session_attributes (
+    primary_id text,
+    attribute_name text,
+    attribute_bytes blob,
+    vector_ts text,
+    PRIMARY KEY (primary_id, attribute_name)
+) WITH CLUSTERING ORDER BY (attribute_name ASC)
+    AND bloom_filter_fp_chance = 0.01
+    AND caching = {'keys': 'ALL', 'rows_per_partition': '1'}
+    AND comment = ''
+    AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4'}
+    AND compression = {'chunk_length_in_kb': '64', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'}
+    AND crc_check_chance = 1.0
+    AND dclocal_read_repair_chance = 0.1
+    AND default_time_to_live = 0
+    AND gc_grace_seconds = 864000
+    AND max_index_interval = 2048
+    AND memtable_flush_period_in_ms = 0
+    AND min_index_interval = 128
+    AND read_repair_chance = 0.0
+    AND speculative_retry = '99PERCENTILE';
diff --git a/kubernetes/portal/charts/portal-cassandra/templates/NOTES.txt b/kubernetes/portal/charts/portal-cassandra/templates/NOTES.txt
new file mode 100644 (file)
index 0000000..c60c745
--- /dev/null
@@ -0,0 +1,19 @@
+1. Get the application URL by running these commands:
+{{- if .Values.ingress.enabled }}
+{{- range .Values.ingress.hosts }}
+  http://{{ . }}
+{{- end }}
+{{- else if contains "NodePort" .Values.service.type }}
+  export NODE_PORT=$(kubectl get --namespace {{ include "common.namespace" . }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "common.name" . }})
+  export NODE_IP=$(kubectl get nodes --namespace {{ include "common.namespace" . }} -o jsonpath="{.items[0].status.addresses[0].address}")
+  echo http://$NODE_IP:$NODE_PORT
+{{- else if contains "LoadBalancer" .Values.service.type }}
+     NOTE: It may take a few minutes for the LoadBalancer IP to be available.
+           You can watch the status of by running 'kubectl get svc -w {{ include "common.name" . }}'
+  export SERVICE_IP=$(kubectl get svc --namespace {{ include "common.namespace" . }} {{ include "common.name" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
+  echo http://$SERVICE_IP:{{ .Values.service.externalPort }}
+{{- else if contains "ClusterIP" .Values.service.type }}
+  export POD_NAME=$(kubectl get pods --namespace {{ include "common.namespace" . }} -l "app={{ include "common.name" . }},release={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
+  echo "Visit http://127.0.0.1:8080 to use your application"
+  kubectl port-forward $POD_NAME 8080:{{ .Values.service.internalPort }}
+{{- end }}
diff --git a/kubernetes/portal/charts/portal-cassandra/templates/configmap.yaml b/kubernetes/portal/charts/portal-cassandra/templates/configmap.yaml
new file mode 100644 (file)
index 0000000..fd42fd4
--- /dev/null
@@ -0,0 +1,22 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: {{ include "common.fullname" . }}-docker-entry-initd
+  namespace: {{ include "common.namespace" . }}
+data:
+{{ tpl (.Files.Glob "resources/config/mariadb/docker-entrypoint-initdb.d/*").AsConfig . | indent 2 }}
+
diff --git a/kubernetes/portal/charts/portal-cassandra/templates/deployment.yaml b/kubernetes/portal/charts/portal-cassandra/templates/deployment.yaml
new file mode 100644 (file)
index 0000000..91c4fa4
--- /dev/null
@@ -0,0 +1,91 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: extensions/v1beta1
+kind: Deployment
+metadata:
+  name: {{ include "common.fullname" . }}
+  namespace: {{ include "common.namespace" . }}
+  labels:
+    app: {{ include "common.name" . }}
+    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
+    release: {{ .Release.Name }}
+    heritage: {{ .Release.Service }}
+spec:
+  replicas: {{ .Values.replicaCount }}
+  template:
+    metadata:
+      labels:
+        app: {{ include "common.name" . }}
+        release: {{ .Release.Name }}
+    spec:
+      containers:
+      - name: {{ include "common.name" . }}
+        image: {{ .Values.global.repository | default .Values.repository }}/{{ .Values.image }}
+        imagePullPolicy: {{ .Values.global.pullPolicy | default .Values.pullPolicy }}
+        ports:
+        - containerPort: {{ .Values.service.internalPort }}
+        - containerPort: {{ .Values.service.internalPort2 }}
+        - containerPort: {{ .Values.service.internalPort3 }}
+        - containerPort: {{ .Values.service.internalPort4 }}
+        - containerPort: {{ .Values.service.internalPort5 }}
+        {{- if eq .Values.liveness.enabled true }}
+        livenessProbe:
+          tcpSocket:
+            port: {{ .Values.service.internalPort }}
+          initialDelaySeconds: {{ .Values.liveness.initialDelaySeconds }}
+          periodSeconds: {{ .Values.liveness.periodSeconds }}
+        {{end -}}
+        readinessProbe:
+          tcpSocket:
+            port: {{ .Values.service.internalPort }}
+          initialDelaySeconds: {{ .Values.readiness.initialDelaySeconds }}
+          periodSeconds: {{ .Values.readiness.periodSeconds }}
+        env:
+          - name: CASSUSER
+            value: "{{ .Values.config.cassandraUsername }}"
+          - name: CASSPASS
+            valueFrom:
+              secretKeyRef:
+                name: {{ template "common.fullname" . }}
+                key: db-root-password
+        volumeMounts:
+        - mountPath: /etc/localtime
+          name: localtime
+          readOnly: true
+        - name: cassandra-docker-entrypoint-initdb
+          mountPath: /docker-entrypoint-initdb.d/zzz_portal.cql
+          subPath: portal.cql
+        - name: cassandra-docker-entrypoint-initdb
+          mountPath: /docker-entrypoint-initdb.d/zzz_portalsdk.cql
+          subPath: portalsdk.cql
+        resources:
+{{ toYaml .Values.resources | indent 12 }}
+      {{- if .Values.nodeSelector }}
+      nodeSelector:
+{{ toYaml .Values.nodeSelector | indent 10 }}
+      {{- end -}}
+      {{- if .Values.affinity }}
+      affinity:
+{{ toYaml .Values.affinity | indent 10 }}
+      {{- end }}
+      volumes:
+        - name: cassandra-docker-entrypoint-initdb
+          configMap:
+            name: {{ include "common.fullname" . }}-docker-entry-initd
+        - name: localtime
+          hostPath:
+            path: /etc/localtime
+      imagePullSecrets:
+      - name: "{{ include "common.namespace" . }}-docker-registry-key"
diff --git a/kubernetes/portal/charts/portal-cassandra/templates/secrets.yaml b/kubernetes/portal/charts/portal-cassandra/templates/secrets.yaml
new file mode 100644 (file)
index 0000000..6e4c210
--- /dev/null
@@ -0,0 +1,27 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: v1
+kind: Secret
+metadata:
+  name: {{ include "common.fullname" . }}
+  namespace: {{ include "common.namespace" . }}
+  labels:
+    app: {{ include "common.name" . }}
+    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
+    release: {{ .Release.Name }}
+    heritage: {{ .Release.Service }}
+type: Opaque
+data:
+  db-root-password: {{ .Values.config.cassandraPassword | b64enc | quote }}
diff --git a/kubernetes/portal/charts/portal-cassandra/templates/service.yaml b/kubernetes/portal/charts/portal-cassandra/templates/service.yaml
new file mode 100644 (file)
index 0000000..e78a42e
--- /dev/null
@@ -0,0 +1,69 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ include "common.fullname" . }}
+  namespace: {{ include "common.namespace" . }}
+  labels:
+    app: {{ include "common.name" . }}
+    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
+    release: {{ .Release.Name }}
+    heritage: {{ .Release.Service }}
+spec:
+  type: {{ .Values.service.type }}
+  ports:
+    {{if eq .Values.service.type "NodePort" -}}
+    - port: {{ .Values.service.externalPort }}
+      targetPort: {{ .Values.service.internalPort }}
+      nodePort: {{ .Values.global.nodePortPrefix | default .Values.nodePortPrefix }}{{ .Values.service.nodePort }}
+      name: {{ .Values.service.name }}
+    - port: {{ .Values.service.externalPort2 }}
+      targetPort: {{ .Values.service.internalPort2 }}
+      nodePort: {{ .Values.global.nodePortPrefix | default .Values.nodePortPrefix }}{{ .Values.service.nodePort2 }}
+      name: {{ .Values.service.name }}2
+    - port: {{ .Values.service.externalPort3 }}
+      targetPort: {{ .Values.service.internalPort3 }}
+      nodePort: {{ .Values.global.nodePortPrefix | default .Values.nodePortPrefix }}{{ .Values.service.nodePort3 }}
+      name: {{ .Values.service.name }}3
+    - port: {{ .Values.service.externalPort4 }}
+      targetPort: {{ .Values.service.internalPort4 }}
+      nodePort: {{ .Values.global.nodePortPrefix | default .Values.nodePortPrefix }}{{ .Values.service.nodePort4 }}
+      name: {{ .Values.service.name }}4
+    - port: {{ .Values.service.externalPort5 }}
+      targetPort: {{ .Values.service.internalPort5 }}
+      nodePort: {{ .Values.global.nodePortPrefix | default .Values.nodePortPrefix }}{{ .Values.service.nodePort5 }}
+      name: {{ .Values.service.name }}5
+
+    {{- else -}}
+    - port: {{ .Values.service.externalPort }}
+      targetPort: {{ .Values.service.internalPort }}
+      name: {{ .Values.service.name }}
+    - port: {{ .Values.service.externalPort2 }}
+      targetPort: {{ .Values.service.internalPort2 }}
+      name: {{ .Values.service.name }}2
+    - port: {{ .Values.service.externalPort3 }}
+      targetPort: {{ .Values.service.internalPort3 }}
+      name: {{ .Values.service.name }}3
+    - port: {{ .Values.service.externalPort4 }}
+      targetPort: {{ .Values.service.internalPort4 }}
+      name: {{ .Values.service.name }}4
+    - port: {{ .Values.service.externalPort5 }}
+      targetPort: {{ .Values.service.internalPort5 }}
+      name: {{ .Values.service.name }}5
+    {{- end}}
+  selector:
+    app: {{ include "common.name" . }}
+    release: {{ .Release.Name }}
\ No newline at end of file
diff --git a/kubernetes/portal/charts/portal-cassandra/values.yaml b/kubernetes/portal/charts/portal-cassandra/values.yaml
new file mode 100644 (file)
index 0000000..530fdfa
--- /dev/null
@@ -0,0 +1,87 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Default values for mariadb.
+# This is a YAML-formatted file.
+# Declare variables to be passed into your templates.
+global: # global defaults
+  nodePortPrefix: 302
+  repositorySecret: eyJuZXh1czMub25hcC5vcmc6MTAwMDEiOnsidXNlcm5hbWUiOiJkb2NrZXIiLCJwYXNzd29yZCI6ImRvY2tlciIsImVtYWlsIjoiQCIsImF1dGgiOiJaRzlqYTJWeU9tUnZZMnRsY2c9PSJ9fQ==
+  persistence: {}
+
+
+# application image
+repository: nexus3.onap.org:10001
+image: onap/music/cassandra_music:latest
+pullPolicy: Always
+
+# application configuration
+config:
+  cassandraUsername: root
+  cassandraPassword: Aa123456
+
+# default number of instances
+replicaCount: 1
+
+nodeSelector: {}
+
+affinity: {}
+
+# probe configuration parameters
+liveness:
+  initialDelaySeconds: 10
+  periodSeconds: 10
+  # necessary to disable liveness probe when setting breakpoints
+  # in debugger so K8s doesn't restart unresponsive container
+  enabled: true
+
+readiness:
+  initialDelaySeconds: 10
+  periodSeconds: 10
+
+service:
+  type: ClusterIP
+  name: portal-cassandra
+  externalPort: 9160
+  internalPort: 9160
+  externalPort2: 7000
+  internalPort2: 7000
+  externalPort3: 7001
+  internalPort3: 7001
+  externalPort4: 7199
+  internalPort4: 7199
+  externalPort5: 9042
+  internalPort5: 9042
+
+ingress:
+  enabled: false
+
+resources: {}
+  # We usually recommend not to specify default resources and to leave this as a conscious
+  # choice for the user. This also increases chances charts run on environments with little
+  # resources, such as Minikube. If you do want to specify resources, uncomment the following
+  # lines, adjust them as necessary, and remove the curly braces after 'resources:'.
+  #
+  # Example:
+  # Configure resource requests and limits
+  # ref: http://kubernetes.io/docs/user-guide/compute-resources/
+  # Minimum memory for development is 2 CPU cores and 4GB memory
+  # Minimum memory for production is 4 CPU cores and 8GB memory
+#resources:
+#  limits:
+#    cpu: 2
+#    memory: 4Gi
+#  requests:
+#    cpu: 2
+#    memory: 4Gi
diff --git a/kubernetes/portal/charts/portal-mariadb/.helmignore b/kubernetes/portal/charts/portal-mariadb/.helmignore
new file mode 100644 (file)
index 0000000..f0c1319
--- /dev/null
@@ -0,0 +1,21 @@
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
diff --git a/kubernetes/portal/charts/portal-mariadb/Chart.yaml b/kubernetes/portal/charts/portal-mariadb/Chart.yaml
new file mode 100644 (file)
index 0000000..dd9ee92
--- /dev/null
@@ -0,0 +1,18 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: v1
+description: MariaDB Service
+name: portal-mariadb
+version: 2.0.0
diff --git a/kubernetes/portal/charts/portal-mariadb/resources/config/mariadb/docker-entrypoint-initdb.d/Apps_Users_OnBoarding_Script.sql b/kubernetes/portal/charts/portal-mariadb/resources/config/mariadb/docker-entrypoint-initdb.d/Apps_Users_OnBoarding_Script.sql
new file mode 100644 (file)
index 0000000..ff7093a
--- /dev/null
@@ -0,0 +1,380 @@
+-- Loads database tables with details about applications accessible from Portal in ONAP
+USE portal;
+
+SET FOREIGN_KEY_CHECKS=1;
+
+-- Apps; note that the IDs are used below.
+
+INSERT INTO `fn_app` (`app_id`, `app_name`, `app_image_url`, `app_description`, `app_notes`, `app_url`, `app_alternate_url`, `app_rest_endpoint`, `ml_app_name`, `ml_app_admin_id`, `mots_id`, `app_password`, `open`, `enabled`, `thumbnail`, `app_username`, `ueb_key`, `ueb_secret`, `ueb_topic_name`, `app_type`,`auth_central`,`auth_namespace`) VALUES
+(2, 'xDemo App', 'images/cache/portal-222865671_37476.png', NULL, NULL, 'http://portal.api.simpledemo.onap.org:8990/ONAPPORTALSDK/welcome.htm', NULL, 'http://portal.api.simpledemo.onap.org:8989/ONAPPORTALSDK/api/v2', '', '', NULL, '2VxipM8Z3SETg32m3Gp0FvKS6zZ2uCbCw46WDyK6T5E=', 'N', 'Y', NULL, 'Default', 'ueb_key', 'ueb_secret', 'ECOMP-PORTAL-OUTBOX', 1,'N',NULL),
+(3, 'DMaaP Bus Ctrl', 'images/cache/portal944583064_80711.png', NULL, NULL, 'http://portal.api.simpledemo.onap.org:8989/ECOMPDBCAPP/dbc#/dmaap', NULL, 'http://portal.api.simpledemo.onap.org:8989/ECOMPDBCAPP/api/v2', '', '', NULL, 'okYTaDrhzibcbGVq5mjkVQ==', 'N', 'N', NULL, 'Default', 'ueb_key', 'ueb_secret', 'ECOMP-PORTAL-OUTBOX', 1,'N',NULL),
+(4, 'SDC', 'images/cache/portal956868231_53879.png', NULL, NULL, 'http://sdc.api.simpledemo.onap.org:8181/sdc1/portal', NULL, 'http://sdc.api.be.simpledemo.onap.org:8080/api/v2', '', '', NULL, '78ot0W94rpB0o4FYzVoIOg==', 'N', 'Y', NULL, 'Default', 'ueb_key', 'ueb_secret', 'ECOMP-PORTAL-OUTBOX', 1,'N',NULL),
+(5, 'Policy', 'images/cache/portal1470452815_67021.png', NULL, NULL, 'http://policy.api.simpledemo.onap.org:8443/onap/policy', NULL, 'http://policy.api.simpledemo.onap.org:8443/onap/api/v2', '', '', NULL, 'okYTaDrhzibcbGVq5mjkVQ==', 'N', 'Y', NULL, 'Default', 'ueb_key', 'ueb_secret', 'ECOMP-PORTAL-OUTBOX', 1,'N',NULL),
+(6, 'Virtual Infrastructure Deployment', 'images/cache/portal-345993588_92550.png', NULL, NULL, 'http://vid.api.simpledemo.onap.org:8080/vid/welcome.htm', NULL, 'http://vid.api.simpledemo.onap.org:8080/vid/api/v2', '', '', NULL, 'okYTaDrhzibcbGVq5mjkVQ==', 'N', 'Y', NULL, 'Default', '2Re7Pvdkgw5aeAUD', 'S31PrbOzGgL4hg4owgtx47Da', 'ECOMP-PORTAL-OUTBOX-90', 1,'N',NULL),
+(7, 'A&AI UI', 'images/cache/portal-345993588_92550.png', NULL, NULL, 'http://aai.api.simpledemo.onap.org:9517/services/aai/webapp/index.html#/viewInspect', NULL, 'http://aai.api.simpledemo.onap.org:9517/api/v2', '', '', NULL, 't1oqm6wCXrGUXUSL8mS7pQ==', 'N', 'Y', NULL, 'aaiui', 'ueb_key', 'ueb_secret', 'ECOMP-PORTAL-OUTBOX', 1,'N',NULL),
+(8, 'CLI', 'images/cache/portal-345993588_92550.png', NULL, NULL, 'http://cli.api.simpledemo.onap.org:8080/', NULL, NULL, '', '', NULL, '', 'Y', 'Y', NULL, '', '', '', '', 2,'N',NULL);
+
+-- insert ASDC users user id2-8
+
+Insert into fn_user (USER_ID, ORG_ID, MANAGER_ID,FIRST_NAME,MIDDLE_NAME,LAST_NAME,PHONE,FAX,CELLULAR,EMAIL,ADDRESS_ID,ALERT_METHOD_CD,HRID,ORG_USER_ID,ORG_CODE,LOGIN_ID,LOGIN_PWD,LAST_LOGIN_DATE,ACTIVE_YN,CREATED_ID,CREATED_DATE,MODIFIED_ID,MODIFIED_DATE,IS_INTERNAL_YN,ADDRESS_LINE_1,ADDRESS_LINE_2,CITY,STATE_CD,ZIP_CODE,COUNTRY_CD,LOCATION_CLLI,ORG_MANAGER_USERID,COMPANY,DEPARTMENT_NAME,JOB_TITLE,TIMEZONE,DEPARTMENT,BUSINESS_UNIT,BUSINESS_UNIT_NAME,COST_CENTER,FIN_LOC_CODE,SILO_STATUS) values (2,NULL,NULL,'Jimmy',NULL,'Hendrix',NULL,NULL,NULL,'admin@onap.org',NULL,NULL,NULL,'jh0003',NULL,'jh0003','95LidzVz7nSpsTsRUrDNVA==','2016-10-20 15:11:16','Y',NULL,'2016-10-14 21:00:00',1,'2016-10-20 15:11:16','N',NULL,NULL,NULL,'NJ',NULL,'US',NULL,NULL,NULL,NULL,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL);
+Insert into fn_user (USER_ID, ORG_ID, MANAGER_ID,FIRST_NAME,MIDDLE_NAME,LAST_NAME,PHONE,FAX,CELLULAR,EMAIL,ADDRESS_ID,ALERT_METHOD_CD,HRID,ORG_USER_ID,ORG_CODE,LOGIN_ID,LOGIN_PWD,LAST_LOGIN_DATE,ACTIVE_YN,CREATED_ID,CREATED_DATE,MODIFIED_ID,MODIFIED_DATE,IS_INTERNAL_YN,ADDRESS_LINE_1,ADDRESS_LINE_2,CITY,STATE_CD,ZIP_CODE,COUNTRY_CD,LOCATION_CLLI,ORG_MANAGER_USERID,COMPANY,DEPARTMENT_NAME,JOB_TITLE,TIMEZONE,DEPARTMENT,BUSINESS_UNIT,BUSINESS_UNIT_NAME,COST_CENTER,FIN_LOC_CODE,SILO_STATUS) values (3,NULL,NULL,'Carlos',NULL,'Santana',NULL,NULL,NULL,'designer@onap.org',NULL,NULL,NULL,'cs0008',NULL,'cs0008','95LidzVz7nSpsTsRUrDNVA==','2016-10-20 15:11:16','Y',NULL,'2016-10-14 21:00:00',1,'2016-10-20 15:11:16','N',NULL,NULL,NULL,'NJ',NULL,'US',NULL,NULL,NULL,NULL,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL);
+Insert into fn_user (USER_ID, ORG_ID, MANAGER_ID,FIRST_NAME,MIDDLE_NAME,LAST_NAME,PHONE,FAX,CELLULAR,EMAIL,ADDRESS_ID,ALERT_METHOD_CD,HRID,ORG_USER_ID,ORG_CODE,LOGIN_ID,LOGIN_PWD,LAST_LOGIN_DATE,ACTIVE_YN,CREATED_ID,CREATED_DATE,MODIFIED_ID,MODIFIED_DATE,IS_INTERNAL_YN,ADDRESS_LINE_1,ADDRESS_LINE_2,CITY,STATE_CD,ZIP_CODE,COUNTRY_CD,LOCATION_CLLI,ORG_MANAGER_USERID,COMPANY,DEPARTMENT_NAME,JOB_TITLE,TIMEZONE,DEPARTMENT,BUSINESS_UNIT,BUSINESS_UNIT_NAME,COST_CENTER,FIN_LOC_CODE,SILO_STATUS) values (4,NULL,NULL,'Joni',NULL,'Mitchell',NULL,NULL,NULL,'tester@onap.org',NULL,NULL,NULL,'jm0007',NULL,'jm0007','95LidzVz7nSpsTsRUrDNVA==','2016-10-20 15:11:16','Y',NULL,'2016-10-14 21:00:00',1,'2016-10-20 15:11:16','N',NULL,NULL,NULL,'NJ',NULL,'US',NULL,NULL,NULL,NULL,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL);
+Insert into fn_user (USER_ID, ORG_ID, MANAGER_ID,FIRST_NAME,MIDDLE_NAME,LAST_NAME,PHONE,FAX,CELLULAR,EMAIL,ADDRESS_ID,ALERT_METHOD_CD,HRID,ORG_USER_ID,ORG_CODE,LOGIN_ID,LOGIN_PWD,LAST_LOGIN_DATE,ACTIVE_YN,CREATED_ID,CREATED_DATE,MODIFIED_ID,MODIFIED_DATE,IS_INTERNAL_YN,ADDRESS_LINE_1,ADDRESS_LINE_2,CITY,STATE_CD,ZIP_CODE,COUNTRY_CD,LOCATION_CLLI,ORG_MANAGER_USERID,COMPANY,DEPARTMENT_NAME,JOB_TITLE,TIMEZONE,DEPARTMENT,BUSINESS_UNIT,BUSINESS_UNIT_NAME,COST_CENTER,FIN_LOC_CODE,SILO_STATUS) values (5,NULL,NULL,'Steve',NULL,'Regev',NULL,NULL,NULL,'ops@onap.org',NULL,NULL,NULL,'op0001',NULL,'op0001','95LidzVz7nSpsTsRUrDNVA==','2016-10-20 15:11:16','Y',NULL,'2016-10-14 21:00:00',1,'2016-10-20 15:11:16','N',NULL,NULL,NULL,'NJ',NULL,'US',NULL,NULL,NULL,NULL,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL);
+Insert into fn_user (USER_ID, ORG_ID, MANAGER_ID,FIRST_NAME,MIDDLE_NAME,LAST_NAME,PHONE,FAX,CELLULAR,EMAIL,ADDRESS_ID,ALERT_METHOD_CD,HRID,ORG_USER_ID,ORG_CODE,LOGIN_ID,LOGIN_PWD,LAST_LOGIN_DATE,ACTIVE_YN,CREATED_ID,CREATED_DATE,MODIFIED_ID,MODIFIED_DATE,IS_INTERNAL_YN,ADDRESS_LINE_1,ADDRESS_LINE_2,CITY,STATE_CD,ZIP_CODE,COUNTRY_CD,LOCATION_CLLI,ORG_MANAGER_USERID,COMPANY,DEPARTMENT_NAME,JOB_TITLE,TIMEZONE,DEPARTMENT,BUSINESS_UNIT,BUSINESS_UNIT_NAME,COST_CENTER,FIN_LOC_CODE,SILO_STATUS) values (6,NULL,NULL,'David',NULL,'Shadmi',NULL,NULL,NULL,'governor@onap.org',NULL,NULL,NULL,'gv0001',NULL,'gv0001','95LidzVz7nSpsTsRUrDNVA==','2016-10-20 15:11:16','Y',NULL,'2016-10-14 21:00:00',1,'2016-10-20 15:11:16','N',NULL,NULL,NULL,'NJ',NULL,'US',NULL,NULL,NULL,NULL,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL);
+Insert into fn_user (USER_ID, ORG_ID, MANAGER_ID,FIRST_NAME,MIDDLE_NAME,LAST_NAME,PHONE,FAX,CELLULAR,EMAIL,ADDRESS_ID,ALERT_METHOD_CD,HRID,ORG_USER_ID,ORG_CODE,LOGIN_ID,LOGIN_PWD,LAST_LOGIN_DATE,ACTIVE_YN,CREATED_ID,CREATED_DATE,MODIFIED_ID,MODIFIED_DATE,IS_INTERNAL_YN,ADDRESS_LINE_1,ADDRESS_LINE_2,CITY,STATE_CD,ZIP_CODE,COUNTRY_CD,LOCATION_CLLI,ORG_MANAGER_USERID,COMPANY,DEPARTMENT_NAME,JOB_TITLE,TIMEZONE,DEPARTMENT,BUSINESS_UNIT,BUSINESS_UNIT_NAME,COST_CENTER,FIN_LOC_CODE,SILO_STATUS) values (7,NULL,NULL,'Teddy',NULL,'Isashar',NULL,NULL,NULL,'pm1@onap.org',NULL,NULL,NULL,'pm0001',NULL,'pm0001','95LidzVz7nSpsTsRUrDNVA==','2016-10-20 15:11:16','Y',NULL,'2016-10-14 21:00:00',1,'2016-10-20 15:11:16','N',NULL,NULL,NULL,'NJ',NULL,'US',NULL,NULL,NULL,NULL,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL);
+Insert into fn_user (USER_ID, ORG_ID, MANAGER_ID,FIRST_NAME,MIDDLE_NAME,LAST_NAME,PHONE,FAX,CELLULAR,EMAIL,ADDRESS_ID,ALERT_METHOD_CD,HRID,ORG_USER_ID,ORG_CODE,LOGIN_ID,LOGIN_PWD,LAST_LOGIN_DATE,ACTIVE_YN,CREATED_ID,CREATED_DATE,MODIFIED_ID,MODIFIED_DATE,IS_INTERNAL_YN,ADDRESS_LINE_1,ADDRESS_LINE_2,CITY,STATE_CD,ZIP_CODE,COUNTRY_CD,LOCATION_CLLI,ORG_MANAGER_USERID,COMPANY,DEPARTMENT_NAME,JOB_TITLE,TIMEZONE,DEPARTMENT,BUSINESS_UNIT,BUSINESS_UNIT_NAME,COST_CENTER,FIN_LOC_CODE,SILO_STATUS) values (8,NULL,NULL,'Eden',NULL,'Rozin',NULL,NULL,NULL,'ps1@onap.org',NULL,NULL,NULL,'ps0001',NULL,'ps0001','95LidzVz7nSpsTsRUrDNVA==','2016-10-20 15:11:16','Y',NULL,'2016-10-14 21:00:00',1,'2016-10-20 15:11:16','N',NULL,NULL,NULL,'NJ',NULL,'US',NULL,NULL,NULL,NULL,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL);
+
+-- insert demo user to account admin role for all apps id2-7
+
+Insert into fn_user_role (USER_ID,ROLE_ID,PRIORITY,APP_ID) values (1,999,null,2);
+Insert into fn_user_role (USER_ID,ROLE_ID,PRIORITY,APP_ID) values (1,999,null,3);
+Insert into fn_user_role (USER_ID,ROLE_ID,PRIORITY,APP_ID) values (1,999,null,4);
+Insert into fn_user_role (USER_ID,ROLE_ID,PRIORITY,APP_ID) values (1,999,null,5);
+Insert into fn_user_role (USER_ID,ROLE_ID,PRIORITY,APP_ID) values (1,999,null,6);
+Insert into fn_user_role (USER_ID,ROLE_ID,PRIORITY,APP_ID) values (1,999,null,7);
+
+-- insert users id2-8 roles to SDC app
+
+Insert into fn_user_role (USER_ID,ROLE_ID,PRIORITY,APP_ID) values (2,999,null,4);
+Insert into fn_user_role (USER_ID,ROLE_ID,PRIORITY,APP_ID) values (3,16,null,4);
+Insert into fn_user_role (USER_ID,ROLE_ID,PRIORITY,APP_ID) values (4,16,null,4);
+Insert into fn_user_role (USER_ID,ROLE_ID,PRIORITY,APP_ID) values (5,16,null,4);
+Insert into fn_user_role (USER_ID,ROLE_ID,PRIORITY,APP_ID) values (6,16,null,4);
+Insert into fn_user_role (USER_ID,ROLE_ID,PRIORITY,APP_ID) values (7,16,null,4);
+Insert into fn_user_role (USER_ID,ROLE_ID,PRIORITY,APP_ID) values (8,16,null,4);
+
+-- insert VID users id9-11
+
+Insert into fn_user (USER_ID, ORG_ID, MANAGER_ID,FIRST_NAME,MIDDLE_NAME,LAST_NAME,PHONE,FAX,CELLULAR,EMAIL,ADDRESS_ID,ALERT_METHOD_CD,HRID,ORG_USER_ID,ORG_CODE,LOGIN_ID,LOGIN_PWD,LAST_LOGIN_DATE,ACTIVE_YN,CREATED_ID,CREATED_DATE,MODIFIED_ID,MODIFIED_DATE,IS_INTERNAL_YN,ADDRESS_LINE_1,ADDRESS_LINE_2,CITY,STATE_CD,ZIP_CODE,COUNTRY_CD,LOCATION_CLLI,ORG_MANAGER_USERID,COMPANY,DEPARTMENT_NAME,JOB_TITLE,TIMEZONE,DEPARTMENT,BUSINESS_UNIT,BUSINESS_UNIT_NAME,COST_CENTER,FIN_LOC_CODE,SILO_STATUS) values (9,NULL,NULL,'vid1',NULL,'user',NULL,NULL,NULL,'vid1@onap.org',NULL,NULL,NULL,'vid1',NULL,'vid1','95LidzVz7nSpsTsRUrDNVA==','2016-10-20 15:11:16','Y',NULL,'2016-10-14 21:00:00',1,'2016-10-20 15:11:16','N',NULL,NULL,NULL,'NJ',NULL,'US',NULL,NULL,NULL,NULL,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL);
+Insert into fn_user (USER_ID, ORG_ID, MANAGER_ID,FIRST_NAME,MIDDLE_NAME,LAST_NAME,PHONE,FAX,CELLULAR,EMAIL,ADDRESS_ID,ALERT_METHOD_CD,HRID,ORG_USER_ID,ORG_CODE,LOGIN_ID,LOGIN_PWD,LAST_LOGIN_DATE,ACTIVE_YN,CREATED_ID,CREATED_DATE,MODIFIED_ID,MODIFIED_DATE,IS_INTERNAL_YN,ADDRESS_LINE_1,ADDRESS_LINE_2,CITY,STATE_CD,ZIP_CODE,COUNTRY_CD,LOCATION_CLLI,ORG_MANAGER_USERID,COMPANY,DEPARTMENT_NAME,JOB_TITLE,TIMEZONE,DEPARTMENT,BUSINESS_UNIT,BUSINESS_UNIT_NAME,COST_CENTER,FIN_LOC_CODE,SILO_STATUS) values (10,NULL,NULL,'vid2',NULL,'user',NULL,NULL,NULL,'vid2@onap.org',NULL,NULL,NULL,'vid2',NULL,'vid2','95LidzVz7nSpsTsRUrDNVA==','2016-10-20 15:11:16','Y',NULL,'2016-10-14 21:00:00',1,'2016-10-20 15:11:16','N',NULL,NULL,NULL,'NJ',NULL,'US',NULL,NULL,NULL,NULL,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL);
+Insert into fn_user (USER_ID, ORG_ID, MANAGER_ID,FIRST_NAME,MIDDLE_NAME,LAST_NAME,PHONE,FAX,CELLULAR,EMAIL,ADDRESS_ID,ALERT_METHOD_CD,HRID,ORG_USER_ID,ORG_CODE,LOGIN_ID,LOGIN_PWD,LAST_LOGIN_DATE,ACTIVE_YN,CREATED_ID,CREATED_DATE,MODIFIED_ID,MODIFIED_DATE,IS_INTERNAL_YN,ADDRESS_LINE_1,ADDRESS_LINE_2,CITY,STATE_CD,ZIP_CODE,COUNTRY_CD,LOCATION_CLLI,ORG_MANAGER_USERID,COMPANY,DEPARTMENT_NAME,JOB_TITLE,TIMEZONE,DEPARTMENT,BUSINESS_UNIT,BUSINESS_UNIT_NAME,COST_CENTER,FIN_LOC_CODE,SILO_STATUS) values (11,NULL,NULL,'vid3',NULL,'user',NULL,NULL,NULL,'vid3@onap.org',NULL,NULL,NULL,'vid3',NULL,'vid3','95LidzVz7nSpsTsRUrDNVA==','2016-10-20 15:11:16','Y',NULL,'2016-10-14 21:00:00',1,'2016-10-20 15:11:16','N',NULL,NULL,NULL,'NJ',NULL,'US',NULL,NULL,NULL,NULL,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL);
+
+-- insert users id9-11 roles to VID app
+
+Insert into fn_user_role (USER_ID,ROLE_ID,PRIORITY,APP_ID) values (9,16,null,6);
+Insert into fn_user_role (USER_ID,ROLE_ID,PRIORITY,APP_ID) values (10,16,null,6);
+Insert into fn_user_role (USER_ID,ROLE_ID,PRIORITY,APP_ID) values (11,16,null,6);
+
+-- insert AAI UI users id12
+
+Insert into fn_user (USER_ID, ORG_ID, MANAGER_ID,FIRST_NAME,MIDDLE_NAME,LAST_NAME,PHONE,FAX,CELLULAR,EMAIL,ADDRESS_ID,ALERT_METHOD_CD,HRID,ORG_USER_ID,ORG_CODE,LOGIN_ID,LOGIN_PWD,LAST_LOGIN_DATE,ACTIVE_YN,CREATED_ID,CREATED_DATE,MODIFIED_ID,MODIFIED_DATE,IS_INTERNAL_YN,ADDRESS_LINE_1,ADDRESS_LINE_2,CITY,STATE_CD,ZIP_CODE,COUNTRY_CD,LOCATION_CLLI,ORG_MANAGER_USERID,COMPANY,DEPARTMENT_NAME,JOB_TITLE,TIMEZONE,DEPARTMENT,BUSINESS_UNIT,BUSINESS_UNIT_NAME,COST_CENTER,FIN_LOC_CODE,SILO_STATUS) values (12,NULL,NULL,'steve',NULL,'user',NULL,NULL,NULL,'steve@onap.org',NULL,NULL,NULL,'steve',NULL,'steve','95LidzVz7nSpsTsRUrDNVA==','2017-05-19 15:11:16','Y',NULL,'2017-05-19 21:00:00',1,'2017-05-19 15:11:16','N',NULL,NULL,NULL,'NJ',NULL,'US',NULL,NULL,NULL,NULL,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL);
+
+-- insert users id9-11 roles to AAI UI app
+
+Insert into fn_user_role (USER_ID,ROLE_ID,PRIORITY,APP_ID) values (12,16,null,7);
+
+-- insert fn_roles for the on boarded apps
+insert into fn_role values(1000,'System Administrator','Y',1,2,1); -- SDK from 999 to 1
+insert into fn_role values(1001,'Standard User','Y',1,2,16); -- SDK
+insert into fn_role values(1002,'System Administrator','Y',1,3,1); -- DMaap from 999 to 1
+insert into fn_role values(1003,'Standard User','Y',1,3,16); -- DMaap
+insert into fn_role values(1004,'ADMIN','Y',1,4,0); -- SDC from 999 to 1
+insert into fn_role values(1005,'TESTOR','Y',1,4,1); -- SDC
+insert into fn_role values(1006,'System Administrator','Y',1,5,1); -- Policy from 999 to 1
+insert into fn_role values(1007,'Standard User','Y',1,5,16); -- Policy
+insert into fn_role values(1008,'System Administrator','Y',1,6,1); -- VID from 999 to 1
+insert into fn_role values(1009,'Standard User','Y',1,6,16); -- VID
+
+insert into fn_role values(1011,'View','Y',1,7,1); -- AAI UI from 999 to 1
+insert into fn_role values(1012,'Standard User','Y',1,7,16); -- AAI UI
+
+
+INSERT INTO `fn_user_role` (`user_id`,`role_id`,`priority`,`app_id`) VALUES (1,1000,NULL,2);
+INSERT INTO `fn_user_role` (`user_id`,`role_id`,`priority`,`app_id`) VALUES (1,1001,NULL,2);
+INSERT INTO `fn_user_role` (`user_id`,`role_id`,`priority`,`app_id`) VALUES (1,1002,NULL,3);
+INSERT INTO `fn_user_role` (`user_id`,`role_id`,`priority`,`app_id`) VALUES (1,1004,NULL,4);
+INSERT INTO `fn_user_role` (`user_id`,`role_id`,`priority`,`app_id`) VALUES (1,1006,NULL,5);
+INSERT INTO `fn_user_role` (`user_id`,`role_id`,`priority`,`app_id`) VALUES (1,1008,NULL,6);
+
+INSERT INTO `fn_user_role` (`user_id`,`role_id`,`priority`,`app_id`) VALUES (2,1004,NULL,4);
+INSERT INTO `fn_user_role` (`user_id`,`role_id`,`priority`,`app_id`) VALUES (3,1005,NULL,4);
+INSERT INTO `fn_user_role` (`user_id`,`role_id`,`priority`,`app_id`) VALUES (4,1005,NULL,4);
+INSERT INTO `fn_user_role` (`user_id`,`role_id`,`priority`,`app_id`) VALUES (5,1005,NULL,4);
+INSERT INTO `fn_user_role` (`user_id`,`role_id`,`priority`,`app_id`) VALUES (6,1005,NULL,4);
+INSERT INTO `fn_user_role` (`user_id`,`role_id`,`priority`,`app_id`) VALUES (7,1005,NULL,4);
+INSERT INTO `fn_user_role` (`user_id`,`role_id`,`priority`,`app_id`) VALUES (8,1005,NULL,4);
+
+INSERT INTO `fn_user_role` (`user_id`,`role_id`,`priority`,`app_id`) VALUES (9,999,NULL,1);
+INSERT INTO `fn_user_role` (`user_id`,`role_id`,`priority`,`app_id`) VALUES (9,1008,NULL,6);
+
+INSERT INTO `fn_user_role` (`user_id`,`role_id`,`priority`,`app_id`) VALUES (10,1008,NULL,6);
+INSERT INTO `fn_user_role` (`user_id`,`role_id`,`priority`,`app_id`) VALUES (10,1009,NULL,6);
+
+INSERT INTO `fn_user_role` (`user_id`,`role_id`,`priority`,`app_id`) VALUES (12,1011,NULL,7);
+INSERT INTO `fn_user_role` (`user_id`,`role_id`,`priority`,`app_id`) VALUES (12,1012,NULL,7);
+
+-- new 1610.2
+-- Ignore errors if the application is not onboarded in this environment
+
+INSERT IGNORE INTO `fn_app_contact_us` (app_id, contact_name, contact_email, url, active_yn, description) VALUES (
+       (select min(app_id) from fn_app where app_name like "%SDC%" and enabled = "Y"),
+       "SDC Team","sdc@lists.onap.org","https://wiki.onap.org/display/DW/Approved+Projects",NULL,
+       "Service Design and Creation (SDC).");
+INSERT IGNORE INTO `fn_app_contact_us` (app_id, contact_name, contact_email, url, active_yn, description) VALUES (
+       (select min(app_id) from fn_app where app_name like "%Policy%"),
+       "Policy Team","policy@lists.onap.org","https://wiki.onap.org/display/DW/Approved+Projects",NULL,
+       "Policy.");
+INSERT IGNORE INTO `fn_app_contact_us` (app_id, contact_name, contact_email, url, active_yn, description) VALUES (
+       (select min(app_id) from fn_app where app_name like "%DMaaP Bus%"),
+       "DBC Team","portal@lists.onap.org","https://wiki.onap.org/display/DW/Approved+Projects",NULL,
+       "DBC.");
+INSERT IGNORE INTO `fn_app_contact_us` (app_id, contact_name, contact_email, url, active_yn, description) VALUES (
+       (select min(app_id) from fn_app where app_name like "%Virtual Infrastructure%"),
+       "VID Team","vid@lists.onap.org","https://wiki.onap.org/display/DW/Approved+Projects",NULL,
+       "Virtual Infrastructure Design.");
+INSERT IGNORE INTO `fn_app_contact_us` (app_id, contact_name, contact_email, url, active_yn, description) VALUES (
+       (select min(app_id) from fn_app where app_name like "%Demo%"),
+       "Portal SDK Team","portal@lists.onap.org","https://wiki.onap.org/display/DW/Approved+Projects",NULL,
+       "xDemo Application");
+INSERT IGNORE INTO `fn_app_contact_us` (app_id, contact_name, contact_email, url, active_yn, description) VALUES (
+       (select min(app_id) from fn_app where app_name like "%AI UI%"),
+       "AAI UI Team","aaiui@lists.onap.org","https://wiki.onap.org/display/DW/Approved+Projects",NULL,
+       "AAI UI Application");
+INSERT IGNORE INTO `fn_app_contact_us` (app_id, contact_name, contact_email, url, active_yn, description) VALUES (
+       (select min(app_id) from fn_app where app_name like "%CLI%"),
+       "CLI Team","onap-discuss@lists.onap.org","https://wiki.onap.org/display/DW/Approved+Projects",NULL,
+       "CLI Application");
+-- end new 1610.2
+
+--
+-- Data for table fn_menu_functional
+--
+INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (175,1,'Manage',NULL,'','Y',NULL);
+INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (1,2,'Design',175,'','Y',NULL);
+INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (316,11,'Administration',1,'','Y',NULL);
+INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (2,8,'ECOMP Platform Management',175,'','N',NULL);
+INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (3,5,'Technology Insertion',175,'','Y',NULL);
+INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (5,7,'Performance Management',175,'','N',NULL);
+INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (6,6,'Technology Management',175,'','Y',NULL);
+INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (7,4,'Capacity Planning',175,'','N',NULL);
+INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (8,3,'Operations Planning',175,'','Y',NULL);
+INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (11,1,'Product Design',1,'','Y',NULL);
+INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (12,2,'Resource/Service Design & Onboarding',1,'','Y',NULL);
+INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (13,3,'Orchestration (recipe/Process) Design',1,'','N',NULL);
+INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (14,4,'Service Graph visualizer',1,'','N',NULL);
+INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (15,5,'Distribution',1,'','Y',NULL);
+INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (16,6,'Testing',1,'','Y',NULL);
+INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (17,7,'Simulation',1,'','N',NULL);
+INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (18,8,'Certification',1,'','N',NULL);
+INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (19,9,'Policy Creation/Management',1,'http://policy.api.simpledemo.onap.org:8443/onap/policy','Y',NULL);
+INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (20,10,'Catalog Browser',1,'','Y',NULL);
+INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (24,5,'Create/Manage Policy',12,'http://policy.api.simpledemo.onap.org:8443/onap/policy','Y',NULL);
+INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (56,1,'Policy Engineering',8,'http://policy.api.simpledemo.onap.org:8443/onap/policy','Y',NULL);
+INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (115,1,'Test/Approve a Resource or Service',16,'http://sdc.api.simpledemo.onap.org:8181/sdc1/portal#/dashboard','Y',NULL);
+INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (130,1,'Favorites',175,'','y',NULL);
+INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (139,2,'Approve a Service for distribution',12,'http://sdc.api.simpledemo.onap.org:8181/sdc1/portal#/dashboard','Y',NULL);
+INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (142,3,'Create a License model',12,'http://sdc.api.simpledemo.onap.org:8181/sdc1/portal#/onboardVendor','Y',NULL);
+INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (145,1,'Distribute a Service',15,'http://sdc.api.simpledemo.onap.org:8181/sdc1/portal#/dashboard','Y',NULL);
+INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (148,1,'User Management / Category Management',316,'http://sdc.api.simpledemo.onap.org:8181/sdc1/portal#/adminDashboard','Y',NULL);
+INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (178,2,'Support',NULL,'','Y',NULL);
+INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (181,1,'Contact Us',178,'','Y',NULL);
+INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (184,2,'Get Access',178,'','Y',NULL);
+INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (301,1,'Create a Product',11,'http://sdc.api.simpledemo.onap.org:8181/sdc1/portal#/dashboard','Y',NULL);
+INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (304,2,'Create a Vendor Software Product',11,'http://sdc.api.simpledemo.onap.org:8181/sdc1/portal#/onboardVendor','Y',NULL);
+INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (307,1,'Manage a Resource/Service',20,'http://sdc.api.simpledemo.onap.org:8181/sdc1/portal#/catalog','Y',NULL);
+INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (310,2,'Manage a Product',20,'http://sdc.api.simpledemo.onap.org:8181/sdc1/portal#/catalog','Y',NULL);
+INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (313,3,'View a Resource/Service/Product',20,'http://sdc.api.simpledemo.onap.org:8181/sdc1/portal#/catalog','Y',NULL);
+INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (317,1,'Message Bus Management',6,'http://portal.api.simpledemo.onap.org:8989/ECOMPDBCAPP/dbc#/dmaap','Y',NULL);
+INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (318,1,'Infrastructure Provisioning',3,'','Y',NULL);
+INSERT INTO `fn_menu_functional` (`menu_id`,`column_num`,`text`,`parent_menu_id`,`url`,`active_yn`,`image_src`) VALUES (319,1,'Infrastructure VNF Provisioning',318,'http://vid.api.simpledemo.onap.org:8080/vid/welcome.htm','Y',NULL);
+--
+-- Data for table fn_menu_functional_ancestors
+--
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (1,175,175,0);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (2,178,178,0);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (3,11,11,0);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (4,12,12,0);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (5,13,13,0);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (6,14,14,0);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (7,15,15,0);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (8,16,16,0);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (9,17,17,0);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (10,18,18,0);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (11,19,19,0);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (12,20,20,0);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (13,316,316,0);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (14,318,318,0);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (15,317,317,0);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (16,56,56,0);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (17,301,301,0);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (18,304,304,0);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (19,24,24,0);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (20,139,139,0);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (21,142,142,0);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (22,145,145,0);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (23,115,115,0);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (24,307,307,0);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (25,310,310,0);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (26,313,313,0);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (27,1,1,0);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (28,2,2,0);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (29,3,3,0);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (30,5,5,0);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (31,6,6,0);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (32,7,7,0);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (33,8,8,0);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (34,130,130,0);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (35,181,181,0);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (36,184,184,0);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (37,148,148,0);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (38,319,319,0);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (64,11,1,1);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (65,12,1,1);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (66,13,1,1);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (67,14,1,1);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (68,15,1,1);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (69,16,1,1);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (70,17,1,1);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (71,18,1,1);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (72,19,1,1);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (73,20,1,1);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (74,316,1,1);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (75,318,3,1);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (76,317,6,1);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (77,56,8,1);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (78,301,11,1);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (79,304,11,1);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (80,24,12,1);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (81,139,12,1);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (82,142,12,1);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (83,145,15,1);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (84,115,16,1);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (85,307,20,1);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (86,310,20,1);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (87,313,20,1);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (88,1,175,1);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (89,2,175,1);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (90,3,175,1);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (91,5,175,1);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (92,6,175,1);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (93,7,175,1);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (94,8,175,1);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (95,130,175,1);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (96,181,178,1);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (97,184,178,1);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (98,148,316,1);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (99,319,318,1);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (127,301,1,2);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (128,304,1,2);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (129,24,1,2);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (130,139,1,2);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (131,142,1,2);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (132,145,1,2);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (133,115,1,2);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (134,307,1,2);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (135,310,1,2);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (136,313,1,2);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (137,148,1,2);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (138,319,3,2);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (139,11,175,2);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (140,12,175,2);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (141,13,175,2);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (142,14,175,2);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (143,15,175,2);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (144,16,175,2);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (145,17,175,2);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (146,18,175,2);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (147,19,175,2);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (148,20,175,2);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (149,316,175,2);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (150,318,175,2);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (151,317,175,2);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (152,56,175,2);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (158,301,175,3);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (159,304,175,3);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (160,24,175,3);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (161,139,175,3);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (162,142,175,3);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (163,145,175,3);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (164,115,175,3);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (165,307,175,3);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (166,310,175,3);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (167,313,175,3);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (168,148,175,3);
+INSERT INTO `fn_menu_functional_ancestors` (`id`,`menu_id`,`ancestor_menu_id`,`depth`) VALUES (169,319,175,3);
+
+-- new 1610.2 which one? add-on 3rd script
+insert IGNORE into fn_menu_functional_roles (menu_id, app_id, role_id)
+(
+select a.menu_id, b.app_id, b.role_id from
+(
+select a.menu_id from fn_menu_functional a where upper(text) like  '%POLICY%'
+) a,
+(
+select * from fn_role where app_id = (select app_id from fn_app where app_name = 'Policy')
+) b
+);
+
+
+insert IGNORE into fn_menu_functional_roles (menu_id, app_id, role_id)
+(
+select a.menu_id, b.app_id, b.role_id from
+(
+select a.menu_id from fn_menu_functional a where url like  '%sdc1%'
+) a,
+(
+select * from fn_role where app_id = (select app_id from fn_app where app_name = 'SDC')
+) b
+);
+
+insert IGNORE into fn_menu_functional_roles (menu_id, app_id, role_id)
+(
+select a.menu_id, b.app_id, b.role_id from
+(
+select a.menu_id from fn_menu_functional a where url like  '%vid%'
+) a,
+(
+select * from fn_role where app_id = (select app_id from fn_app where app_name like 'Virtual%')
+) b
+);
+
+insert IGNORE into fn_menu_functional_roles (menu_id, app_id, role_id)
+(
+select a.menu_id, b.app_id, b.role_id from
+(
+select a.menu_id from fn_menu_functional a where url like  '%DBC%'
+) a,
+(
+select * from fn_role where app_id = (select app_id from fn_app where app_name = 'DMaaP Bus Ctrl')
+) b
+);
+
+insert IGNORE into fn_menu_functional_roles (menu_id, app_id, role_id)
+(
+select a.menu_id, b.app_id, b.role_id from
+(
+select a.menu_id from fn_menu_functional a where url like  '%SDK%'
+) a,
+(
+select * from fn_role where app_id = (select app_id from fn_app where app_name = 'xDemo App')
+) b
+);
+-- end new
+INSERT INTO `fn_common_widget_data` (`id`,`CATEGORY`,`HREF`,`TITLE`,`content`,`event_date`,`SORT_ORDER`) VALUES (6,'NEWS','http://about.att.com/innovationblog/next_att_labs','What\'s Next at AT&T Labs? AI Set to Revolutionize the Network',NULL,NULL,10);
+INSERT INTO `fn_common_widget_data` (`id`,`CATEGORY`,`HREF`,`TITLE`,`content`,`event_date`,`SORT_ORDER`) VALUES (7,'NEWS','http://about.att.com/innovationblog/ecomp_code','Code, Community and Commitment - the 3 Cs of Open Source',NULL,NULL,20);
+INSERT INTO `fn_common_widget_data` (`id`,`CATEGORY`,`HREF`,`TITLE`,`content`,`event_date`,`SORT_ORDER`) VALUES (8,'NEWS','http://about.att.com/story/orange_testing_att_open_source_ecomp_platform.html','Orange Testing AT&Ts Open Source ECOMP Platform for Building Software-Defined Network Capabilities',NULL,NULL,30);
+INSERT INTO `fn_common_widget_data` (`id`,`CATEGORY`,`HREF`,`TITLE`,`content`,`event_date`,`SORT_ORDER`) VALUES (9,'NEWS', 'http://about.att.com/innovationblog/linux_foundation','Opening up ECOMP: Our Network Operating System for SDN',NULL,NULL,40);
+INSERT INTO `fn_common_widget_data` (`id`,`CATEGORY`,`HREF`,`TITLE`,`content`,`event_date`,`SORT_ORDER`) VALUES (10,'EVENTS',NULL,'OpenECOMP Launches into Open Source',NULL,'2017-02-14',1);
+INSERT INTO `fn_common_widget_data` (`id`,`CATEGORY`,`HREF`,`TITLE`,`content`,`event_date`,`SORT_ORDER`) VALUES (11,'IMPORTANTRESOURCES','http://about.att.com/content/dam/snrdocs/ecomp.pdf','ECOMP White Paper',NULL,NULL,1);
+INSERT INTO `fn_common_widget_data` (`id`,`CATEGORY`,`HREF`,`TITLE`,`content`,`event_date`,`SORT_ORDER`) VALUES (12,'IMPORTANTRESOURCES','https://wiki.onap.org/','ONAP Wiki',NULL,NULL,2);
+INSERT INTO `fn_common_widget_data` (`id`,`CATEGORY`,`HREF`,`TITLE`,`content`,`event_date`,`SORT_ORDER`) VALUES (13,'IMPORTANTRESOURCES','https://wiki.onap.org/display/DW/Portal','ONAP Wiki for Portal',NULL,NULL,3);
+INSERT INTO `fn_common_widget_data` (`id`,`CATEGORY`,`HREF`,`TITLE`,`content`,`event_date`,`SORT_ORDER`) VALUES (14,'IMPORTANTRESOURCES','https://wiki.onap.org/display/DW/Development+Guides','ONAP User Guide',NULL,NULL,4);
+
+-- app thumbnails
+
+UPDATE  `fn_app` SET  `thumbnail` = 0x89504E470D0A1A0A0000000D49484452000001680000012C0806000000EE2C29AF0000200049444154785EEC9D099C5D6579FFBF67B9EBEC5B6626B364DFC91E12080142D87710595C0A5A37B455FBD75AB56A6D6BD55A6D6D6D6B6BAB15045111C50504917D95B0869090909DEC997DEE7AF6FFE77DCFBD333721C0850C3093BCE7C3903B73DF7BEE39BF73CEEF3CE7F7FE9EE7D1508B424021A01050088C4A04B451B9556AA314020A018580420045D0EA24500828041402A3140145D0A3F4C0A8CD5208280414028AA0D539A010500828044629028AA047E981519BA510500828041441AB734021A01050088C520414418FD203A3364B21A0105008288256E780424021A01018A50828821EA507466D96424021A0105004ADCE018580424021304A1150043D4A0F8CDA2C8580424021A0085A9D030A01858042609422A0087A941E18B5590A018580424011B43A0714020A0185C028454011F4283D306AB314020A0185802268750E280414020A81518A8022E8517A60D466290414020A0145D0EA1C500828041402A3140145D0A3F4C0A8CD5208280414028AA0D539A010500828044629028AA047E981519BA510500828041441AB734021A01050088C520414418FD203A3364B21A0105008288256E780424021A01018A50828821EA507466D96424021A0105004ADCE018580424021304A1150043D4A0F8CDA2C8580424021A0F5A6EC40C1A010500828041402A30F0145D0A3EF98A82D520828041402120145D0EA44500828041402A3140145D0A3F4C0A8CD5208280414028AA0D539A010500828044629028AA047E981519BA510500828041441AB734021A01050088C520414418FD203A3364B21A0105008288256E780424021A01018A50828821EA507466D96424021A0105004ADCE018580424021304A1150043D4A0F8CDA2C8580424021A0085A9D030A01858042609422A0087A941E18B5590A018580424011B43A0714020A0185C028454011F4283D306AB314020A0185802268750E280414020A81518A8022E8517A60D466290414020A0145D0EA1C500828041402A3140145D0A3F4C0A8CD5208280414028AA0D539A010500828044629028AA047E981519BA510500828041441AB734021A01050088C520414418FD203A3364B21A0105008288256E780424021A01018A5088C28416B1A68E27F6A510828041402C718024110100423BBD3234AD0B1884E32668CEC16AAB5290414020A81318080E5F8642D6F44B75411F488C2A956A61050081CAB0828823E568FBCDA6F85804260D423A0087AD41F22B5810A81A31701A1B18A45CD331DFE182B823E7ACF7DB5670A81518DC08E1D83DC7BEF4EB98DAB5675306142F5A8DEDEB763E31441BF1DA8ABEF54081CE308B8AECBAF7EF5221FFAF0831289EBAF3B830B2E988CAEEBC7383207EFBE2268753A280414026F3902B66D73D34D6B79FF9F3E2CBFFB673F3D8BCB2E9B8E6128C756E9C15004FD969F9AEA0B15020A817C3ECF0D373ECB873FFCB804E327379D21093A128928704A105004AD4E07858042E02D472097CBF1A31B9EE1DA6B9F90DF7DD34DA7F3CECB6628823EE44828827ECB4F4DF5850A01858024E81F3DC3B51F5504FD6A6783226875AD280414026F39028AA0CB835C11747938A9510A0185C00822A008BA3C3015419787931AA51050088C20028AA0CB035311747938A9510A0185C00822A008BA3C3015419787931AA51050088C20028AA0CB035311747938A9510A0185C00822A008BA3C3015419787931AA51050088C20028AA0CB035311747938A9510A0185C00822A008BA3C3015419787931AA51050088C20028AA0CB035311747938A9510A0185C00822A008BA3C3015419787931AA51050088C20028AA0CB035311747938A9510A0185C00822A008BA3C3015419787931AA51050088C20028AA0CB035311747938A9510A0185C00822A008BA3C3015419787931AA51050088C20028AA0CB035311747938A9510A0185C00822A008BA3C3015419787931AA51050088C20028AA0CB0353117479388DECA8C027E8DB4490EB26705290EB016B407E879FD9034E06341D2D568B166F18FEEEAA7630A2F26F5A450B5A55C7C86E975A9B42E02D4240117479402B822E0FA7231BE5D9787B1F23E8D900D97DF87D9B09522F110822F62D70B2E0E6E57704760A7C1BD0C04CA09989E1EF8ED5806EA0991510AD444B8C43AB6845AB9B8ADEB400BDE93888541DD9B6AA4F2B04DE020414419707B222E8F2702A6B54E064F1773D10FEEC790CDC4C48BA411046C86E163C9BC0CD41E095B5CE571DA4E961442D483C528516A900CD90DC8E66A25577A2371F8F31E522B4FA1947FE7D6A0D0A81114240117479402A822E0FA7571D153869FCDD0FE33CF8391919E33BE0BB829A4760ED47B00A41E0BA8956D18631F14C8C1957A2B79E1092B85A14026F23028AA0CB035F11747938958C0A0A32842789D87BF116DCD55F23103AF2DB4DC8AFB92F1A5A653BD1737F84563F538ED68CA8945284E67D444BE01FF93A8E6803D487C712028AA0CB3B5A8AA0CBC349926F90EF87D40EECDF7F00BF677DE1936F73945CF6F6970E141A48B8E813CE20B2E43352C7D6E28D523279DD8BEFE1F73C8F5E33456AE36A5108BC16028AA05F0BA1F07D45D065E024A2E3A0E779BCADB7E36DFC0941B6AB8C4F8D9D21C22DA2B79F823EE97CCC199783997C5D1BEFEF7F1AE7912F1039E9ABE8CD0BC3094EB528045E050145D0E59D1E8AA05F15A780207B006FFD0DB8CFFF1FC1E08E9199DC2BEFD8BCF5A38C3891657F8DDEB112BD711E98F1D7DE063787F3E89771D7FC37D10B6FC6987096923A5E1BB5637E8422E8F24E0145D087C3C9B371D77E9F6060AB24687FCF2304E9DDE5213AD6471931F4A6F9D2B6A7554FC098740E5AFDAC9793AE67E1EF79146FCB6FF05EBA97A06F23D1F36EC2987AF13137095914B90E7A6E38EC1FC7FAC93172DBAF08BA3C2C15411F062777C34F711FF834415E4CFC1DAB8B06D12AF471F331A65F8131ED32B4787D0846E0E16DBF0BF7B12FE377AF1B7AAA889EF13D8C59EF91CE91A37E11D6C921460E5F084E1E7E558A80927C0E3D1F144197778528822EC129187C09F7C97FC2DB7A1B41665F79081EEDA3444663BC1EF3946F624EBB2C9C44B453E46F5A4630B84D98BC8710889EFE5F18B3FFE4D8216841C99A349D176E5CE2F7024D07E26FC5F78FF693E4F5EF9F22E8F23053045DC0C9DBF63B9C873E2F650DE96356CBC108442A3067BE1BF384BF913730E79E8FBDCC561859F135CC851F073D72D4A327EE4B828A050F0B2A9626456935D408D0C2FB56E13D153FBFFC7450045DDE25726C13B4A88931B00DE7F1AFE26DFA257861BAB55A5E0D8122DDBCDC5E689EF02569D97B4356BD510CBACC042D2C322E16241C804B40CE87BC1BE0BA015EE0636A1A31D3A0361206D732BE9651B65A4A1150045DDEF970EC12B4A88FB1EB01DCC7BF8EBFF7D1F2D052A35E150173E127899CF4F760C4DE52A402E151470BC970580816A5A70AF2C3213715C9B705F61CDA521112879244715D22440ED71D126DA005E41CC8783EBD399FFD298BFDFD167927C0F1021CDF470B7C6246C0B82A9386AA38CDD5719A92260953470FD732AC5617C3EFB714ADD1F1658AA0CB3B0EC72C41FBDD6BB17F7DC9B1E3CE28EF7C38A251C6DC0F113DE59BE5D9F38EE89B0EF970416E10EC2CA25D3D64D39249BB428EA7E064190D0B223E38DD5D727620A859BC1B927DB804782252767C7AF32E2F7459F4E61CB2B64822D0B0020DBFA0377B22B9544CA0FA2E9A9BC7C4A73AA633BBA592992D55D4554431C4BAB5A1DB49E12B8E3DAD5A11747917C03147D041BE177FF3ADD27DE0AEF96E7928A951652160CC7C37D1D3FF334C1D7FCB96909D8BD41A68BE50802110AAB02E63683B08C87922E2CD3360B9641D485B3EAE0F9E1F485295E42C43E580A20745C7A33611A33259417FCEE140DAA1D7127F15045E903964E0ED83EFE37B3E7E10E0061EBEE71278E25F8FA4EED25A1B637C759C8698C6FC094DE1DCA2F84EF1427EEFB1258328822EEF0239A6085A249AB8CFFC3BEEDAFF05CF2A0F2135AA6C048CC917C83A1FAF3713B1EC2F78D9C030622ECD5C143C27485944B53DB6C78BBD3976A65C76A61D3674E5E8CA7BA41D8D8CE5E00BDD5844BB9E85E179E88120581F538811814F7D4594396DCDB4D7D71574643FBC19F822AAF62531FB5E611B84262D09DAC317A9EFAE8D2F483BF0B17D5FBE879527A9D9BC7FC54C3AC755A10782EAF5B0F6F71B07614C7E5211747987ED982268FBDE3FC37BE12610E53ED532E2081813CF217AFE4D6F3A418773768589BB21D942BCD0480501BB52369BBBD33CD365F14C9747BF15907675D29E81E30798BE4BA59F2111D844F048682E31CDC790D28329A58CEACA1A6674B631AE224E4484D6224A0E021128E307A1941112B420EA50BF766420ED11F81EAEEB84442DA3690FCFF37005613B2E932BE0B485139935BE16B320CF8848FA58226945D0E55D7EC70C418B7A11F61DEF0D6D746A795310D05B9711BBF47720EA528FC47270703CB4462929C8B8599072381198436767D6E5B60D0758D765B32FEDD2E3C5496B7149A49AEF92D0032A758F3AC365BC99A7427388E113D73C0C215CE8069617A1DFAC605C731B159118BA274AC70A32464A1BC2A9218857B2B4F89B27DE13441C482216E42C48DBF15C193D8BD79EE7E2FA01AEA7A189D7F92C13EB34CE5B3A9599CDF568F8324297D1F431B228822EEF401FF5041DA477491B9DBFF9370456FFDB5B4BC38862B42E43EB380D73F6D5A0BF81CA71C5E3EAA4F15EBA077FDF9304FB1EC7EFDFF2B6FBB7F5A6B9C42EBF0F22475ED16EC83921E977386F5A44AB9A9888D34DB27EC0833B06F9ED867EF63B06B66630E847707C0DDFB1A88AF8CCA88FD35913A53E1145CFF4E1A57AF173299C5C56BA2E021101FB1E8316F47911DAA6CEA2A65AB4190B35E6A0206548995946D0A15EED89509A90A0FDC09551B47C2DA2651129FB829885DC11FE1BFEF8F8AE8BE3DA684E8E981E70F6FC0ECE5B1436530865E863238E5604AD085A12B2FBE43FE33EF39DB74773D60D6939D31BE6622EFA24C6A4730B0E8791BE0803BC6D77E2BF7833EE8E3F803D0822F27B8BEB536B15E3895DFD2C5AB4BABCB3EF554785141D52B398F813C4A8E36B06BE1FB07130CBDD9B7B79648FC77EBF02CF088DC7819DA54273195F6932735C2553EBE218BE8D97CB92EEDA4F3E3D8863E5C9E52D5CD796137929CB67902A5A672DA4A1A989C0B6C3893FA95C08520E658CE26BB945051216842D74EC21822E21E4E218296F8888DA15DAB48B23E63F1C3171E971D2F446DE7FCA5C12868E9CE01CAACB3DD2E7C8081C92115C8522E8F2C03C7A2368CF92C927F6FDFF0F44E4FC562C661C2DD1282348D17E4A9F7016C6940BD11B8E7B8B92370A74B66F35CE837F45201BD10690EF0FEB8AC82E2F6FDEA225C711BBE6F91121681929173655389185D52D6B7B64ED803BB70FF0D8CE4176E60D5C2389661818BA89A1F94CACF0985897A4A53A4652F3D06C1BD7B2B133830C76EF259F4D63DB16996C56EAC4AEEF918D34D230653EE3C6B586BAB2EFA1090943C4CF7E48CC45722E9275F15F215F841383C311B378EDBAEE10897BAE3B1C5D7B1EB663E10A95C473195F1DE1B2A5535838B995A8A117DC1D85F4F1A398A3154197771D1E9D042D1E81B7FC264CDD1EDC5E1E1247384A448DA2A09031F783E8CD8B0A6B7B3BAFB0822C200867FB9DB8CF5F87DFBD8620B52B9CF07A9396F8B5FB6437F2235D849C204D7281262D725BFA73DCBFB597A7F6E5D81B6B0E73AC038D58E0D2561130B93E416B65942ACD1EF2310BF9C2C967C9A57AC9F60F30D0DF8D95CB60E7F3643359529E4EC6A862CAFC65348FEF905639690191138021297B624250FCBDF8BBD09905714BF942481D05D78688A40F913464042DA26741D04592F67D6C4744D10E81EBE0E472B4D5E87CF0BC1399DDD91A4E488682C7512D7728822EEF0A392A09DA3FF02CF69DD7C812986FF6A245ABD01AE76174ACC498FFD130821E858B683AE0EFBA4F4A21A2E98098F87A33969122683909878FA7C1133BFBB9FDC51E36E5A2E48C04B611C3F05CA2F84CAE3139AE394175C44017A41E88A70431D916E0B90EB9C13E327D7DE407FB1918ECC1CEE4B0F27906B2797AA964DCD4794C993E8398190953B8A52B4310B2F837F4498BDF872368A1390BDD3AD4995D394958785D42C245B22E12B4EB384304EED80EAE277E5C1CDBC2B0D35CBAFC382E5BB180642C8226273EC53EBC9D37F837E3EC185EA722E8F2F03D2A09DAFACDA5F8DBEE280F812319251EAB279D87B9F4F3E80DB3DFF214E737B4E9F620CE93DFC2DF7E17229B7244BA8B976C48FCFD1B651DE9D7B71C5CA85364FB0951C30D74B6F5E6F8C5865E9E1ED071A2893043D0F5A8323CDA6B624CA98FD310054338354A547749AE769E74CF7ED27DBDE4D2830C0EF460A72DAC7C96DDB98044DB2CE62C3A9E8A8A4A49CCC2972CA366797318D6990F92388250AE2812F6101117648DD2285A4E18BAA1E54E46D18508DB16B28BE7E2899E968E8D9549735C5B1D9FB8FC4C263454A369E2E629321D1541BFBEF3E8E81B7DD411B4A8B466DF76E588134FE9A1D79B9760CCBC0AADA205AD6E067AE3DC317566B8EB7E88BBFA1B6107F211963B62EF79E2F5E321095952A2A4249164B2664F3F4FEF49B1C38EB0336F92F185633920E6DBCC1F5F43B5E15117D3881B05122BA64F0F293B3EF9CC207D7B77911DE8259B4E3338D0473E9D23E3B8C4A79F48E794695455540D4D060AC786FCEF9049C1E1DF45C4EC1C44CEAF48D04E48C87282D00DA3E7A22E6DD9B69C2CF43D1BC7B1C85BC2F2E771ED25A772CEE25918BA70AA88041645D063EAC27A1336F6A822E820B513EBB7EF20E85AFB264035BCCAF8D56BD0AA278E8D88F93048E47F309920BDE74DC12876E9EDE89DA7BFBE754B3B9B706978B24646D685AFDFF322FBFC24D9682522B74F44B871CD62725D8C79E31232EB2F8CB443395A96D728D4D090E288EB4A79A36BD776B283BD58990C03FD29329914079C08275F752DF18889CCF716E9DEC5B24842572E44C862278A041C46D182A08563637842B07432B0F85A4C1C7A43045DF041BB6E18450B0DDAB2A4FE2C2418DBB1C9BB0E5A3ECDFBCE5ACA9F9C750211532790553B8EDE45491CE51DDBA387A07D07E7EE8FE26EFCE99BE656D02295444EFBB7B06BC8185DDC47BF8CF3C437DEB4AD8F5DF44BF449E7BDAEF58799819E4CD6C8A273DF867DDCB2C3213013385A4C929A48919ED118A7B3364195970BED76D2922688BA506DAEF0AD527E701D327DDD74EFDC4636DD4F2E9B61A027C5817496C15813175E750DBEE30C45CF82A48B245CF4380F5BE9428D59BC1F46D0E1EF87BA358674E6E2C4E050041D927351E6102E8EC0B1E5F7DBAE70A638C434978F5F761A172F9D8121DC1C52E278854C9DD785EEE81CAC08BABCE3727410B4886CD65D8FFBE8970872DDE5EDF9EB19A519E8F5332439EBE34F1A7B4D51858CE1E5711EFC2C42DE1879BBDD70E9CED885BF40177EEFD27A70C5A240AF8079B1DEB2706EDFFDC25EEED8D045AABE1D373024D655584C6F8CD35E1D23E2B918854A756175A3E145FCE6E9A07B019E6D91EAE9A27BD736B2A901B2B90CFDBD29B6A55C262E5AC9FCB9B343392308B30385AD4ED4D8184A4639C8EB3C4CC842372E7A9E8B12C610593BCE505AB7533A29E83838452747E0625B7902DB9263C5053868392493493E7BCD799C3FBD49EC32BA22E8D773851EB5638F0A829605901EFF1A81D537F2074A74BA3EF59B98733F3846276D02DCA7BE8DFBC43F859994872EA27F60690714DD402BCD70946C2192404AD29045DB2B59AE332448BD6A025AB245BED666BF07BDE37499622252988533A248D6438FEC850247A2BEB2AC4317183CB3B397DFACEF62AFD98863C6F00257AE43A466CF6E4AD092142E8D32EC81528AF064324AAAFB00DDBBB64B592397C9B2617F9696E356B060F102022B47E08B6CC1128F7321392524DC421D8D82BFB9384E44C132922EF89CC3ECC1A29D2ED49A053917DF77E524A1156ACE52F670C8590E9A97C77534F6EFCCB2DFAB22DFDA8EE70DF0FCD72E624A4DAC509D4F24AE1C5C1675E44FF0B7678D2A822E0FF7A380A0039C073E83FBEC7F94B7C7AF6754A40263F285984B3F875E3FF3F57C72F48C75F3B84FFF2BDE965F0F6F53AC6EE8B5B005EA95E387DF8BD74265C7F0FBD14AB48A5634235E1410A076329815720EAB58B728CC5216948CF40ECB1F517FA2F023A95546D282EB75C4DC5E54D788E8A1FDF8862776F374DAC48D26080283C07749EA1E136AA2B45747881D142D9746CEA54A6DB10F958F9DCF91EADA4FF7EEED64B329B2D93CBBEC2A169E722E15C9B8D4808BA45B9A2D38246B14ABD215A48CE29821CD596607869380421F179F731C7B6832B0286738628C63E18BF7A4CCE160E75D02CBA6F7A51EF6AEDF47CEAC21367F01D9C66AFEF2CC4EFEF2AC9924A2A0FB1ABA2C6E7DF42D8AA0CB3BA6639EA0835C9724684F68CF23B908729E7E854CD11EB3E42CF070F304B903F2DFE2A2D54D7B0DA45E9D14427A0CFF2F26E67C7C59252EEB06A41D9F7D595766FC651C9F8CE591737DDCC2849EA60798862EB3E66A22260D0903CBB1B977A7CD3EDB9451B24714337098506DD2561B23AEB98542FBC3B98507EF4089C12E0CCAB1F35952DDFBE9DDBD834C2E454A54D86F5DC09459C785E42CEF188592A142DA2868CCA5045DEA6F2E92B9888E4B53B8858D2E4C5A0909BA48E0C24A17A67887041D5AED7C3C274FC4F278E9B92DECDFB8172DA3E3E9519C8E0ECC8573A8AC36F8CA550BB962712771B123C2CC71144E172A822E8FACC6344107D90378EBAEC35DFBFDD03236528B192772D25731269F1FBA35D4328C80205AADD0F6296BD39B73E9B321E56A64DC80941DD093B125613B5E6892F0440D8D02A9CB24104DD46DD33074D1BF4F7424F118744D9C20228958C365526D84D64484B819BA3B6481FC728F83F86E2B47BAFB00BD7B7791CE66D9D59F63E2E255D4D7D687645CC80E0C35E7E1449450BE10863EF1B790788BA45B2A6DC8D4EE82C75992B41827A40DE1E010E9DCD2EB2CA40F1BCFB6B11D07CD7798D652CBC9D327B167D376BCACCFB34FEDE00F773D8F1B4DE2B58DC35FBA9089ED493E7CEA24DEB9A08371C9E106BC47536F4345D0E59DCC6397A0453AF7F6BB70EEF93382CCC85AC6F496E3895DF95079081E6DA3645FBE304216C9D6C51E7FA5D5E5065C8FD53B07D995121D4620E31B7242CF2F481C82600D024C4DC7D075F442417A41B122CF2F10937C22CAF57DF2521E10A590345C4D481B3ED59ACDA2B64A0C1F7491B42199B91825CB02D00583434995BBE1E70349AE5E3E4BBAA797BEFD7BE94B6779B1DB62E189A7529D88E3A1CB0A766252505AF264BAB6D88ED04A17DAECFC421AF7C13536A47D4E96112D789CA5AE2C3CCD3E8E889285B75910B72DD629A2680BCF72F13219668EAFE53DE7AF64765B3DA669629A70FD0FEEE6CB7FFD1320229BD006679F46B6BD9D96448EBF3B6F16EF3E7E62D815B168F72E3CB78CF5D34E1174794770CC12B494361EF922DEFA1F85CD3E4768D192CDB2E8BC746B1C934BB14DAAC0542F31196BB283F54B83393675A559DF07592D2A2701A503423C8D8B76513AD4C4848461C81FD1E5DA1C9A272C8823225B0F64946DB9E2C7A7CFF2C8D86194D95E5B495B8588B143CD5A9775374A3BC28A770A5AC641253A430D5C4817BE20E8BE3EFABBF6B3BB37C39E7C8C79F317509988CA9B81E88452ACAFE1FBC58247226F6798984B4B850EC91A8290658D8D83AD73E27D1125FB2285DBF5B12C4F5650F4FC1CBAE5B368C2781A2339CE5E71022DCD09224682542AC3BF7CF397FCE8BA87087413D3D7E8EB68A1F2E453B0123E57CDA9E2BB572F2FECAB48E229765E19FBBAB422E8F2C865CC12B4DFF52CD62D6785A535476A31A244CFBD514A1B8736151DA9AF18BDEB292ACBC566AB855ED9F2CF3A5D399B67F7A7D8D827122B4CD2A688443574DF23AA7924220615D11815A6415264F50D3546152E8D029916495570A3E45CAD10750B7FB14ED676A503A2B62A4E2408CBA58AD653A2C6864CF12E74DC96938845538988CE75D188B564C63270F16D8B7C7F2FFDDD5DBCB0378D956C64D6B4A952FB16DB5DACB921562DEA39CB4E2805B943481A6219AEE35C8CB043194390BB4C462990743199C595B246585AD4B184734344E52EDD2F6CE5FCC57338616127B95496D3CF9A876926D8B1753F5FFADC8D3CF2E84B843DBF0306741B6DFE71C416CF63D9D41AAEFF9345D4C6C4934C98C473B4E8D18AA0CB63823149D0819DC2FAD10282CCEEF2F6B28C51A22468F4829FA1D54E2963F4D1386428264597C5E803990CD263793CBB67807503016922328A132363814D753442752C414C4E64899E7E61A0EB16026FBDE08A93997E251284142C869414591B0E3F083DC4B82EBAEF080B88ACC521A5132326234C0C83401335A1CD90D865C966596EAEB0F6403658D1752F8CDAAD0C07F6EE63F5F61E264E9D496763B57487084D1C5F4CF6850F5FC311F470F2496979D183B205EDD04A5724E7A25B43DAEB44753A173C51903F9726D3956560FB368C9E1C99BE34FFF0CD0FD37D600FEF7A9748E4091D1A8F3CBC817FFCEA4FD9F8C25E342D82E7EB58BA8F3F7D0A0D272EE2FCA575FCD5B9F3185F119337BDA3A53E8722E8F238646C12B4D54FFEBF43DFED482DD133FE0B63D67B0FF6048FD4CAC7D47AC20ED50E3A2F0D5A3C2BEA616475F2BA298BC9EB1E183A3455992422427E084B82CAC7EF21A9342C052A5D120769A701811ECA2132AA16516BB16EB2F005CB4ED8521426E71BE8461C5DD8EECC381866988E2D3E26B2088BB2967487143569999018B6B8127BE0FBF41CE865DDCEBD4C9E3C85A6AA78E8B8D07402D1D43510242F9253C2087A285BB0B04DC58494616B5D18410F47D607CB1C395754A60BF7899C4D76C77E1A4C93DE3D7DF4F7F5F1F75FFD30BB766EE4F2779E8B666852833ED095E56B7FF7536EFBCD13327BD04378A05DAC649CE8B2C54C387E027F73E12CCE9AD1425411F498BA92466263C72641A7F720EA498CD862C6899EF793B0E3C9B1BA14345E99D517681CC839FC7E730F075C13DF48485434DF23AE05542522544544342DDC0EF29D30242E4E2DFAA1FE20125104414B322E261BCA529D61EB28D9F95A140EF25C701DA947677D0D2B8044552391681CCD8884845A1281CBE8B650BD2E944FC2C85DC6E28198001465472D8240978D65D2C2DA6646658358D9AE4A4A1CA2EBB6B81784DB22BAA2941274A9DC21FCCBC59E83A254E870C5BA509209A3690FD7B1713C1BCD72493DBF9B591DEDC47483679F59CBA92B8EE3A413A793C90EB2EACC2572F2547CFF9A67B6F1CDAFDFC2534FEC243084D061E2EB2EA2E7BC376306D5A72EE45DC78FE32F56CD05F8E9980000200049444154A035190DA59CB12F41A322E8F28866EC11B4C8127BFC1F711FFF4A797BF81AA3B4783DFAC4B3892CFD3C5ADDF41159E7985C492112CD3A3E7B07F36CCBF8ACED71F08CA8E45E91541237022A2286AC2057CC1B09FB9E849379B2EBF590F61CF276283F87EE084D4CAEC91467D1FE29D470450A74266FA1099B991E27EF413499A4B2AAA630F77B88BDAE90F957ECB83224CC14826841B8A1C02D32FEC4A45F78F310FD0085BC216F0E224897DEE502F10E15DD0F2D7787764329FDDD91FEE642012441CCD25A27925544F289456D328696CEB26BF5666A9249E90469AC4F72E925A7626879DA3B5A19DF568BEB6ADC73CFB3FCFC670FB2E6995D64D3BED4D50D7103110A8C48F4696B2376C6494C6C31F9F8E993B970763B8948A1EBCA18676945D0E5B1C49823E860701BF91F2D94B5258E78D13459CF3972F237D06AA71EF1EAC6E60A42660B894E63F5CE3E9EE9CACBC2F89A1E911367E2C1BB361125618849AA70E2AEAC4508C2821045042AAAB78908339F95C48CE7627BB03FEB9173A0B1AD938A9AFAC2649F30C2BDBCC3753159446E6D8971A758CB43BE2FC3E2F0CDC3950D3D2821454A1B0737782D7A9D8B29DC323A2E494E2926A014A366DB11892A3681936362758CE5D3A6A00FA6184CE564D1A38898344D98B4B737D1DED68C6906446326B93C7CEF7BB773E30D0F92C91452DE8550248F45B8EF7E5515C6F22598131A58DC11E5DFAE58425B9DA8892DACE4633B8C56045DD615246BB5648523680417AD57642B8CD0128BE82463C3F508DC67FF13E7814F8FC8DA450F3D73D917308FFB008849A86364199E6A2AB82B0AD1A7E5C3CF9FD94F774444B326119953E25111D1A88A849639C97D8714292AB1E90E491B61990DD1C5DAC6CDE724397B82E8EC9C7CB477759DAEAC478F15A1B9B595EA9A5AA9718B6E2261958F83097A989CC346AE434B21422F9276D875FBF0CD5E8B641C16E50F5B5589649430221E766A94164112BE67910558B4DC494943C8197E2133D0168E911CA66F71F1E2494C6B692016C0E0604E626598060DF595D4D6C6D1759D4824413C5E496068AC5EBD99AFFCED4F79716377F81C229374C2671291DAE3440CFC59D3491E3F8F9A44C0CF3FBC94E9CD95614B2F45D0C7C4D53AA6085AF4D3B36E3D8FA0EFC5233E385AAC0663C19F61CEFFD8A86D5375C43BF90A2B18266831ED1652C2BE812CCFEDE9678B5D8DA78B093F5F3A2112D2D32CD22884AE1B6AC16191A38397E1782E407444153286487116197D5E3E272500291F68263BBB53EC1DB4E998328DFABA3AE2B1F8505D8FA2C9EFD06A78A551B2F8E6E2EF52832E1072694D8DD22248A58E8C62042D09B91041BFAC2A5D21F124CC142C46D0218187198285FD131DBAD3194C2B4F1D0133C7D572C292195455E8C4A249A2B118A6283AA2F998119DAE9E1CB7FCE27EB66EEDA6BEBE86CD5BBAD8B6653FAE250A2709D8C4646B44EE8F30037A41805D5B4DCD49228A6EE53FAE9ECF19936B0BE246F118BC3C921E0BE4AD22E8F2AEEE3145D0EEFA1B71EEFBF383EA4A94B79B2F1FA5D5CF2076E9EFD02ADBDEE82AC6ECE742822E265F6BA42D8F3F6ED9C7D69C8615AB938FD9A2FD5345CC2026324F8417B9CCB929E1D7F5F2966C3725C9D9B664F42C4A9C0AC259BFCF626B5796798B16D0D9DE84212ACA8571B7DC2A59FD4EBA42866F0282188BCB417246B1F3F7219DB75FAD0892889C65328ACC16149383C3D1F310514B1B5DF8775943A35846D4F711DD508487DAF65C74C72261E789BB79E6774C62EFAEAD9C71F2121AABE338A64977574E584E68195F41736B1D4F3CB19D4F7FFA7BA4D28284435D7EF98953B9E4A21359BB660BB7DEFA0039CB0C495A3CBDF82E9609C90573A858BA808F9DD5C9B527761211369AF02E75F0E469E15146A6B31464ABD14AD68AA0CBA38F3145D0F61D57E36DFAC588B4B3D29BE6117BF7EAF2503A2A4785F634E16858B76B802777A7C957544A8FB1889E45C45C1B8FBD42058C62E28900264C139471B8AC71E162A70764B94F41CE72324E94E8F46D2C3DCA6F9EDDC3CA534FA6655C3D81E34B57B5F8FF2B2D879336A414209256640DE7E18EDB8746D087D6D810A42B2606C537CAB2A1E277D925254CDB2E56A62BED1F28AC7FC29D1188F7456ABA206B57E8E73ECD519DD3674C20EE7BF41CE867DAD4F154C4C57A3D1E7D7A3FFFF3BDDFC8CE2A9FFC8BCB58B56A11BFBFF349BEFDED5F93F54C343F82E66579EFBB8EE7739FB99275EB77F2B9CFFF2FDB76E540BCEF69F86E8A5CE0109D3A9571AB4E65C5C25AFEF2C27934579A4481D05B134A49D20EAE891F0DA320FBC80AB1D24613DEEE0AC9FBA3E26C56045DDE611833041D0CEEC0FAD58523226FC82481D665C4AEB8BF3C948ED25182D0BAD2791ED9D2CB012F8A174F8471ACE8986DE854C5A2AF52A26838C295AAA92067619B732CD96A4AE8CDD239E1D9B88E4B2A30D9D29367E2ACB98C1F57876B87198622320F55D7972FA5E45C94354AF56741CEF2F7C2A460D1B75C2A6FBCAC4A5DC15227C958A6758791F210418B424BC2FA57F8BBCC0A141AB46C572592516C3C51CFD9B1995C5341936FF0F8236BC8D80133A78CE3E20B961389EA7CFE0BB7B271F36E342360C1DC164E5CDC29E645B9F781E7D979004CDD2011B178F7554B79EFBB4F2195F2F9D6B77EC1A3AB77E3D92EB1288C1F5F41B2A282A7B67553BFE2541293C6D1520BB515D05C9564666B3D6D0D5574D625A88FE8529212924A65DC90FF1613C38B754CC4113BDCE4EBDB717A2B822E0FF53143D061D1F96F1CBEE87C79FB3A3C4AF89E57FE1BC69C6B5EEF27C7F4F862E4296B55482B9AC6B3BBFB796C9F875E511146589E4D4483642C8A71D8C48850B32EC664923885DE6C0BBD398B9BCBE0E6B272124D44CF8EA7B1A13BC70B072C8E5F348F299DE3110FF122CA139B5070C1BD0CD7C3C91AA5242DFB1116A48D22098BF75F4EC8C54A75C35EE7522943F89BE5EF25353686BBA18814F490A045FF40E1950E2C9FD481019A8D80E3A775F2C4939BC858018F3CBA86CB2F5949A66F0F7FF197D7F0B14F7C8F0D9BBAD0CD084BE78DE7C37F72226D2D06916805DFBFEE3E3A3ADA9935BD93CEF62AAA2A7574DD249509B8E79E27E9EDEBE18A2B2F62F2E426366DDECB97BE72231B064C2A16CD837852B6D615C9E862A2559471B5BD3C7AE0501D37185F6370F58A49CC6F6F607C659CEA9849B450C44AC847A58E72F9FCF3364D362A822E8F4AC60C418BAA75EE0B37806797B767AF324AABEA2476E583B22BF7B1B98436B5BC1BF0D4BE1CEBFA020253D49F0B307D979829B46761A913DAEFCBA3DBE149C6F0F1DAB32C1C41CC96F81996360449BFD4EFF2E4DE2C53A64D67C9AC293241239C637C659B5829391749B9F45F91065EAA3317A50D31A6D8F0B57432301C2B087A385296A45C283B2A12518A2543A537BB245B50C81F610DE8D0BD91EBCAF3E2531B684BC225672F65CDBAED38BEC9D66D07386E7A070D35011FFDD8152C3FEDB3387E42660C365519BCEFAAE59C7C621B11C3438FD5108B4464612943F3D145828A261C1E11A2F14AE992314D8D6CDEE697BF7E9A7FFBF7DB493911F4A67A3022B2E1811635312A931889387A55257E65054E24826DFA541B1653C655B268623D67CE6EE5F8CE3A92C23F5DB0F14979E835DA90BDD9D78522E8F2101E33046DDF7639DE96DF96B757AF31CA987D0DD133BF3722EB1AB32B09020EA42D1EDD99A1CB8FE1EB614C1C0D7CD9ED5AD46A2E54B57FD92E16095A5AC37C17279BC14EA7F0EC9C94396C613D135A74E0B3F6804B2A5EC7890B6753138D86135B929B43DDF9658EBD42C1A262647790A451485211045D1A4D17ED73C508BAF87B314B3024F0E1087AA87E46C1032DE50B37246F31AE94A045228D903564228AABF1FCC3EBE9DEDACDE23993B8E8ECE3D0FC1C1B37EDC5334C2A2301975EBC9C5CCEE6437FFE63FAD38EB4D9E164B8F0AC595CFDAEE554C504C746314C9388114117F545D089464D62A2B398A1631886ACD3B16B6F3FFFF8AD5F71F71FD66106313C212A17F465D1D6C0D17DCC680C3D99C4A8AAC4A84A12D4D762B677E0450D0C3360767B928B17B470D2C446A6B55493940D69DF7E0FB522E8F298E3D823683D22B567BD797179081D45A364E05A48BB1607FEE91D3DACEB75D12AAAF17571F107C4651B2AE1B31DF6481F0A812C312AB3F4449FBD3C766A1027932AF8853D1C3B2F33025FECB6C946AA5930FF38EAAA2A0BC5F88B6B3B4C645E24E0121BDDC1B24668AF9313838531A5DEE6A2065D8CA4C3BE826171FE506B0EAD7EA13BA390A4228A3249096398A045D76D51DF597640112E0E3B4B65D4A47B571FABEFDB4A6005B434C4387BE5143A9A1368668CDEC114B9748E8A8A2A5E7CF180D4944D532797B769AC8B73F2099D1C376B3C095323E3983CFDF47A6CCBA3B373A26C58904A0D62E811AAAA222C5F3E9FCAA4CE60DAE2B1D59BB9EBCEA7E93990A6B232414F6F8A679EDAC8A489AD2C5C3C8DFBEF7F8E7DFBFA993C651CA7AC9A8FA399DC72CF0BE8C90A2C714C1BAA699F3591899D2D34D646397F7A152B66B7D19810425368510CDB29840A7538A1F8E653B822E8F288E5982368BD712EB1773F3EF63A7397773C5F635468ED12015457C6E5EEE776D16F561215FA73A11E7ED21417AE68562A29F07039290482C0A53BC3C1CDA5B15329F9AFA843E1F83ABE9D664B46E3B16D3916CD9DC9F2E3A6C9758A08503BB8B4DDD0F61E6E42B0F8A620D9904386C9B9288314258DA2CC51FA7B585F232C235A4ACAA58E0D59856EA8C9AB983874B16D0BD713FA738067E54906164B674EA4677737B7FE622DA9816E2EBB7019EFBC7839BD5DBD3CB7712777DEF3047D030EFBBA2DE29128FFF0E9F3A9A9D0C8BB3E158908F535E2A9C424168BF19F3FB853661876B435B164D15CE2C988F464F7F4E4B9F9E63B983C793CD75E7B05D555BA749A7477E7C8641CAAAA4DBA7B72BCEFEA2F326BFA243EF8E1F3F8F94F1EE2A9273672C1852772C699F348A72CAE79FFBF138D26A9AA8A921CDFC89E4812AD7D025A730BE36A3C4E9BD9C0BB4F9ACCE28E46E9D609B3436505ABC275F1CAAE9A11390D41D5E22813C8B141D0A68B7DFBBBF0B6FDAECCDD7AE561E6E24F1159F1B5235ECFD85B41C16825224A74B67465B877DD3EB4867168221345689281465C3C92CB72FA32982A743339786FC5C49E2E745A3131984961675292C8022F8FED050C3A3A77BDD88F9BACE792954B6916A5320541CB28FDB51D1B61465DB8C83C944281A56281FDC3D9E90ED59C65642DB304C32EDC45821EAADD2CAD7FA2F0FE702FC1A20DCFB6457D0D11417B44BD3C0BDBEA583167221586CEB6032EE9812E96CE9D44476B1DBE11E5869F3FCA3F7FF7F70CA41D3CD3208ACEF7BFFA4EEA2B5D3CD15D46B82B44701A89E193E4735FFC1F2E7FC7E92C5934858A8A2855D555242A4C296D7CF39B37F3F4535BB9F2DD6773F1C50B8919A20094417757370D753544E3557CE04FFF9AC6DA06AE7AD7E974ED4BD1D337404B6B0D9515115C4BE3FFFDC5FFA09926E79CB78464BC821FFFE271F658106BEF20B26C31B6E130B71E3E79C66C2E3B7E52A1BAA008A0C5F4A3005DD68F7D531715419707EF9820E8447E07F65D1FC2DFF348797BF52AA3A2EFBC1BA36DC511AF67ACAD406AB9D2D226A2508DD59B0EF0D4AE0CC9D6567CD15B4A14330A3462824D8AA923C345EA0EDA5DC9B1560E5768CF9934563E856BBB18760ED77378B227C6635B539C7FE652164C6D2370C42D4168CFA113F7D0E5708E0D912C534CC428D598C5670FF53797CA1CD2DF5C48020927050FAEB75194368A3EE8A1641459BC49A470FB389683232622DD3CD31A139C377F0AAD0993B809664D35C9A8B8E178442231D24EC037BFF32B6EFCD573785E8440D4A2D63596CEA8E6FCB317336D5223B1427DEA4832C97D8FADA7B5B193B6E6188978841736ECE5D9E7B6327FFE4CCE387D0935B5716EBFE3596EF8D14FF8D2973EC07173DAA5D4B267F71E9CBCCB9E7DBDF4F5F5D13EBE9588E9239AF08A42FEA29B8BB0F10985B9FB80472E97A7ADAD8AC71E7B81EBAF7B845456C3094CFC855349CC9D493652C1C2D608FFF927F399D35415362B9085AE7499A8A4087A745CE16382A063FBEF97F53782DE0D47849A5E3F5BBA3788561ED17A46FB87C389B5D0A72C0D71B28646802BFB004257CEE18117F69237AA885726866A4008028DCA1653C58E27AF10F0FA0176AA17279DC6CD67F0F27949108E98300CA27CE7D16EDE73F14AE6743622BE54FA718B0D4F4AC03B5C128A0CE0048DCBFC1321C90CFF1489FCD02248A5B24691A0852C52EC7A52D49DA5CE5CA8FB2C9D1905DDB9B4F8BEEBBBB8791BDFCDD15615E19CB993993EAE964854F4103449C46398A22E891123123788C76264F23E37DEF2000F3DB199CEB6361E79683DCFBFD44760E75836A7853F7DD7623ADBEAC86434FEFDFBB7F3E71F3C035D8B70E73DEBB8F1D6A7B182288E35C0F4CE6AEEBDFD6FE94F7BFCD5A7FF83258BA671ED47CE95B54BBABB7A181C48234A57899E878303199E58BD81A79EDCC6C4894D9C71E602B66DDFCBAE97063969C53462B1F02964CBA6FDFCE29627E8ED4F3363662BEBD674F1D29E41EC4651EA602EB4B7B0A833C95F5E3497D327354AFFBB903ADE6C155A45D0E5B1C8D820E81DBFC479E40B048347D6B95BB4B28A9E7B0398C9F2D019D5A38AE9CF61265FA807842F7D21D816EA1E3B3EF4E75DD97D7BC0F2C9381EBDB68F25EB6A0839A3F8F9508B14057D0E2A1577E8A3AE206FCFC5EADB2FE50DCFB2B12D0B57A47613B0291D636BB682CBCF399EB858A31F66FD1D6E795582F6C4A3FDC1045D9A8052943986A3E7302BB0E8C41822E5621124A9290FD77216759D0357746D11138661328D90385CDFC3CD0E521F373963CE44668F1F8768B12584A1A86952D790A0321923669844449317DD9451772A67914E79C41311FEF0D07A3EFEF99F4A1FF909F3C7F3BECB17D3D1524126A7F19DFFBE8D0F7DF07412D12477DDBB9E1B6F7D8AAC6DE0BA29E64CA9E70FBFFE222FED1CE0BAEBEFE08C558B983EAD01C7F1C80929C989B06B6F9EBBFFF0088DF515444D839FDF7C3FA79FB9844B2E3D953FDCF5383FFCDFDB39E7DCC55C74C90A2A2B62128FBEDE2C8EE7D1D454CB7F7DE71E1E7A68037A3C8AD5D244F4C4A5588918735A63FCDFFB9731635C95EC4A1318A1E4351C498F6C58AD08BA3C721913041D7DF187B87FFC7B82EC81F2F6EA154689C2489193BF0E46EC88D6337A3E5CC8E62B5E3B525F0E3B64F7E63DFAAC9098BBB32E693BC00944BB284D7A730BE59B0F22681971BF56E28248DC736D72DD7B70B2697CCB91936A2222CDF83A776D4D71FA69AB98DA5E876F0B4DF3B5C939149A87E56E593B5AB6A23ABCDFB954831EB2D405616D8DB09091F85CD1AD51A85257ACE15C88A25D3B4CA41111B3746A48EFB3D0AA1D92DE202B66CF60FAB866366EDACD93EB7630904EC9AC9AB9D33B58B67812F36775D0545B81EF59E4450125272097CD61D93932B918E7BEF79F9938BE91954B27B262C9046AAB23B87A941B6FBE8F534F5EC2F8E64A76EF1DE0C7B73CC9F3CF1FA0AE46E73D57ADE0931F3B87DBEE788ADFDFF118975F7E0A2D8D49C19632FD7ECDDA3DFCDF0FEF62DDBACDBCF39D2BB8F28A93D9B9B397EAEA18F58D49F6EEEBE3A1079E67F2C47666CE9EC4E64DDBA9AC8CD1D9592FC1CD657D3EF5E91F31D02BFA48826546C877B661CE9E85555BC5972F9DCCFB4E984CBDB8F3489D235C868FE0C809D38AA0CB6391B141D0CFFE23CE93DF023757DE5EBDC2A8C819FF8D29DB5A1D2DA5458B151634D2B6477FDE21E3F8E4029D03695746CBB2B934A2C9AA8802C30AFAA2A4671825178B5B0E5F8C52147995EB505AD6AC3C9903BB64D6A02726D46C9B8CA3F15CB7CD93FBB2FCF507AE20A20B7B5B28B11CBA1C94882227270F2E21FA4A9981F221A130E137AC4317124E4469D342224A91B40FB6D37961995069AF2B383764D53A91BE1D7A9DC58D47773D8E1FDF447F6F0EC7D648A732385E9EF1CDB574F76519D790E0B9B55B696A1CC79927CFE2DC5366E13A1676DE2697CF33386873EF231BD8D735C8CCC94DB4B7D6938C0AAD188C68820D9B77F3C4532F71FCE269B20C695F7F9EFDFBFA98D0398E19B326B0F1C52DDC76FB6AC635D672C53B575095D0A5FD2E5911E3C9275FE4A187D7CA4495450BA632635A13BA1E953715F17420BEC471024CC3249DB1F9ED6F1E116D1C39FBDCC524A251D2A93C7FF7F7B7E0BA1102DBA3A73743CE30099A9AF0DAC7D3B16432E72C69E7ACA9F59C34B355F69A0C6D78B200F5880AD38AA0CBA3B2D14FD0864BE48F9FC37DEEC8134B84FEACB71C3FA2275A79308FFCA89052C30833E3066CECB6D89D71C97922D013979470B7CA82CE0521599AE786FB01BEC14D1276302F9B26B57F275E2E2B1BA48AA2F5FB3206B7BD3848754B339FB8E81459D02A54410F26E843ED74A17BE4E57A73E9B8C3799D87248E12A786187750379482DF59DE5464324AD8C1457CB658783F7003F29ED8870C86956566CB380677E7F8D91D4F307B4A3B1FB86225F1B8869DB7C8E71D49763FF8C1EDAC7E6E278D4D4D7CFAFDABE86C34A56DCCCAE71948EB7CE9DB3FE7E295C75355A5CBF65DF555111A6AA2B2FE46241AE1073FFB2303FD196A2A13AC5CB984BA9A38AE67D3DD6D71EFFD8FC908F8AA2B4F236E0A6923C340CA4133A2C4A26282D70E1D3162424188D3F2F00A374A207F04A3CA7ADBBECE9EDDA271408ACE090DB2029E382BD6AEDD851718A407036EFBF5A3BCB4B34F4A3879132267ACC26B6E605A93C797DFB180B3A70B794778DE45275E71AB5511F41BBC6CDEF0C7463F417BBD987FFC1CDE869FBCE19D2C7E50F89FF5A6F947BC9EB77D0562C61D106D11BA320EBBFAF3ECCB055832522E542FF30359DE532ACBB2EEC6F0B4E1CBB7BF34821E7EB760851EFA83ECF957D06807F7BE842F9C1C8E8DE5FAACEB0AF8C3F634A79FB294F38E9B24279A0AA6ADE1CF9724A214A3E1E277149D1743C45C42DA877A9D0FD69F8733040F47D0A57537647BAA42828A2C7A24BBA104D86E1E2FD7CFC49A4ACE3D7E111FFF9BFFA3BABA8153164CA0637C0BBFBEF75976F6F449FFC9E5672FE4BD979E483693E5A777ACA5B936C15567CF0527473A9B12FDCEF9E12F9FE48107D613AD88E004010BA6B773C959C7D1586D08C3057937CE9AE7B7B16EC30E4090BB88BCFB686A68E1B24B4F66DAC47A6286905C3406D236BFBEED61FEF8C4063EFD89CB18D7501936CC95A4A94B0B5E36EBC8CCCF6884B03142A1AFA460EFAEDE14CFAFDD4C67BB68B555174A165A848D2F7471C30FEF65DBF61E594D509C0156472B15272E215B19E1EC6915DCF8C193C2F415697B0CCFAB915A54045D1E92A39FA0AD7D988F7F166FD32FCBDBA3571935B6093AAC9F519C5FB77D9F8D3D595E1A74487B4658A54CD7A4C62C62D762E727D9B95A62F2C666E64B2F49499E9E879DED27B56787943A44169ED0B71FDA65B379C0E79A4BCE607A43A5D4B24B09FA952604C34D1B2E7C344CD007BB3786258D42C3D9429660A9AC213E5B1A41CB946ED13CA0904558DA915BE8E69E982414371C2B4D53D4E7ACB9D398D2D2C6D91FFD365FF8C47B3975F1447EFCABA7F8DF5B1E473345395593A8DFCBDF7CE2024E3E7E269FFED2F7A96968E6AF3EB08AE66A91F99792938DDBF7E4B9E5F6B53CBD790FFBFA2C1AE206579C398BF3CF9C4522A6614685B32646366FB0BF6B90FE8134C97884F1AD0D744EA844D610742D1C342C2BCA962D7BD8B5B78F850B3AA888990579CAA367D0E7DEFB9E938D676B6AE29CB6721EF3E77662BBE942D6A6C6FD0FBCC075D7DDC505179ECCD967CF97D98B77DEF1240F3EB89E7DFB2C904D02C4790379313F31A593CA139630AEA5921B3FB89069F549793E89E256C508FA35E729CAB8521541970192B8698EFA9657D65ECC3F7E166FF3ADE5EDD15148D03272150E559150A7C1F6812C9B7AB2A47D51DB423831741CDD43383644728520E54016030E67E18B9DAF87A0293B102A991E2AB499129D52ACC13E52BBB7E13A79A93FEFCBC05DDBF3548D6BE5FD179D4432081FA7C36D18962F8AAF4B0F914C4A2929B87FA853A35473169F2BBA338AC5F60FD59D8B042DC95A44CC857E82B2334AE1C70B7CACBC2027F1378B79CDD59C3EBD9DBAAA18BD76824BFFDF75BCFBF4395C71DE095CFFBB35FCF2FE0D61179920C0C9F6B3727633FFFAB50FF1FB479EE1C7373FC8673E743673DAAB480FA6B1DC3C96E5921DB0B9E9EE17B9FB8F3B69694EF2912B4F64E98C4634C3A53AD904A6B80159619AB51960EA3A51334AA2BA194D384ADC0C795BE7F7F73EC9AF7EF7282B4F5DCA79A7CE2126928A74979D7BD2FCC5E76E606FB72D356A31A7675B69CE397D0E9FF9D42A7C574C2C06F4F4A67966CD36D94477F1E2690441826F7DFDA7AC7EE245B448122396C0F0C2BA2B82846D4D67A03641ED8AA5CC98DDC45F5F308F55339B10A5B3C2E8BBEC93E755AF5745D0E5D19922E8F2707A5B47C94C3A4D931EE66D5D2936F7E5C8184939D96914E48B8C8804458DE382EE5B24C7305DFBF012C66BEFD4B0052FECF9272268177BA09781DD5B65D71441803B07E1AE1D361D53A7F2DEB317127545BA83D046C3AA69A12F3B5C4A5FCBDFFD973B36C4DF0FAD4A375C00A93019284A7F160A2B15B3030F9A142CE8D1B20FA2C44614DE0F35E83019C5C2772D702DCE9BD9CEB249CDD2EB6C6BB59CFBE7FFC1BF7CE9232C9D5DC7F76EFE23FFF5F3A7C08C482D56CFF4F1D90F9FCE490BA7F1D9AFFE90CAEA717CEA9A93E968D4490F0E62D9196C4F279D8971C3AF9FE681A776B2EAA4697CE01DF369A88960C422FCE496C7E9983891D933DA185F671217968A888EEB193CF8C85A2AE31AA7AD5C246A0BB2FAB95DFCFD577E4867CB383EFF990B68AAAD92730FDB77F573CDC7FE879C1B0B537F021D3B6BB3604E2DDFFDF6D532B925D06C742D86615648FDDCCE67652A7B4F7796679FDDC2BD0F6CE0F98D3D44021D5364558A3040B83D0870A6745073C672CE9A5DC35F9D771C53EB92AFD256E1B5CFA4434728822E0F3345D0E5E1F4B68E129AA3E5796CECCDB3ADCFC6D1A204BA29BDB9A2B09BD05145C3D7B001529831286D03AFB01CA6A5E06BEE5F512316F537EC811E06766DC5B1454B2B871DA980BB77794C9D3993F79C311FD31D8EB25E89A04B13504A23E822391F9A8C529A3D2826D44A53BB8B045DD4A08B5E6841C8C5085A24A8086B9D48F2081353B244038789D5559C3AA38DCE862411334AACB292D33FF67F242B2A3973C9049A1B6AF8ED7D6BB089CA4CBE93E67770D1394B18CC64B9F1670F31ADA396779E3E07138B6C368365D9ACDDD2CF8EFD197918F6F5E6A9ACAC64D9DC76AA2A626CDDD5C70D37DF4375A28271E3925C76F65C56F6ECE2F600002000494441542E9F4ECA8AF0A31FDF475B5B0D0BE74D66F2C466621193ADBB7BF8F92DF7D3D6D8C439E7CC26198FA3FB1E7BBAFAF99BAFFF86ED3BB3E4F3AED4A0135138E7F4195CFBBE95B8B29598C58E97FAB8E79E3554D72458B572A14873A1BB2F232596471F7D89EBAFBF8F88AEA3FB01AE485011A78F68ED555745E28255D4D447F8D35327F3BEA513A98F475EF33C29778022E8F29052045D1E4E6FF1A8E1A40041CE83AECF969E0C3BD326AE8C633C9C00B26E801BB6D90E7BF9BD89CB90D3C2B5C90F76D3B7630B8E9D95A4B72BE373DF2E9F0953A6F3BEB3162314F1701EEBF0BD04C3505A3442092BCD95BA380EADA9513A2128E50E69A5B30B76BBE16E28C5085B960A15FAB4A8F72C1BBEBA327A96A46D7B8584141BCDCDB2A8A38565D33A694C68C462069188705918DCF3743FDFBEE17744137196CCEDE0C25366316B6A27F73FB691B696763EF5B73F6057F720A72C9CC4973E703251D325675958B91CDBF6E6F88F1F3FCA9F5C7916EF3A773EF94C967FF8EFBBF8F99DCF485C4CCDE7FFBEF54192A6C73D8FAC2716D3B8E6AA553CF8E456BEF2ED5B98377322E3C735B0706EBBB4F1897D58B771A7B4ED2D5F34998AA429A360218D740F183CFCD80BAC5DBF95DA9A4A4E3EF138664F6BC6F35204BE284C65F0F8D39BB9FE477772C6AAE339EB8C053CB5662BDFF8E62DE4AD28AE2B52950ADD1F45FD0DE9D81025397C5C53C39B3189CAA58BA8A886EF5E398F93A736C94317CA1C4796B8A208BABC8B5511747938BD65A3E4692F66E80B9A5FCAF1D9DC9767F7A08555E842276A26E47C911518BA34E4E55248A51EB24295CA1A877077F91174F1422CCA1342CAB4A5C4D1B363236E3E2735E8BD599F07766BD4B775F0C10B9713D38C50CA286CC3A1124758C9544CF689ECBF509429B5D21DD6565778049772856841E5879F1F766984D24758CB397C1D367C2DD6D870E5CD44764E716DB2FD39A6348DA3311963E9F446664FAA236A6898310333D6C8ED0F6FE0C6DB1F63E38EBD2C9A3F8D96867AEEBEEF71264F9AC4FA2DBB686FACE18A55B3B8F8A44EAA6BAA71FC80AD9BB6B265771FB7FC7E03D7FEE9859C38A7153F6F71C36D4FF1AB073690496798DA56CB173E76169695E1F70F6F67C3D67DAC38711E0FADDEC4DD8F6DC4CD8425528F9B51C9B7BE740D6DCD757CFFC6DBB9E99607F8D7AF7D94C5F3DAF19D5C88997892F20DB2962BEB474784AE2D4AA54A8BA3B0DD451848B96CDBBA9B86FA18CD4DD5FCFA8E67F8F677EEC430AAA5475ADAE870E571105DDBA563C31713CD60D75753B57C095A5B1DFF72C51C2E3AAE45E69E86245D284FFA06AF0C45D0E50137FA09DAED09270937FEACBC3D7A955163C3C5115AE88A997E3B072C9EEFCA91173193268A43EAE43D8F9C78542F55055F4D673E34B82EC9DA7BBDA006AE8333D847D7B60D78D92C8E93A73717F0E83E03B7BA9E0FBF6315B551531244B1B46891A043D2966C7C5021A4A2AC513A41585A204946BF41584CFF95AC74227B50269D48CD5964040A19C339A8F8BE2D9351845FD963CDBA3E3C4B448B1AD79C3B87F79D3D839A6840C48C10ABACC0D3A2ACDF76805BEF5EC3C34F6D61206B61B92E139A2A993FB59365F32631797C82E6DA186DEDED18A6CE0BCFBFC0819E3E06337166CE6EA5BED294FD05F7F5E4D9DB93931A7543459CFA069F6CDEE4A6DFAEE3B67BD7108B2749673C328E256B74882784E5F31AF8F2272F65F6B476563FBB9DAF7CE326FEF29397B17CD94490859184BD50C81182A8455ABC2DDCD1E019F8BE8E70F9AC59B38B3D7B7A58B6741AD55526E203BBF6A7B9E5D6A7B9EF81E748A79C822FDE970D033C471488124D741D74238A1B89139B3D83CAC5B3F9C87993F8C8091D54897E68E209A95058E9F59E3FC5F18AA0CB436EF413B4E111F9E367472651E5AA47467DA1FE7042509744B4B32FCBE63E87415FA4DEEAD2F79C753C6CDF905ED7D219F5D735117898C24505D5E155CF1A39D5278A09A507D8BFF9799C94A8C591236D3BACEB8FB1211FE7A23357B07C5253C16257F05F9746D28526AFA51A7451C628FE6D485316581C525FA318359746CF42069004ED7B8852A143B63A9198229C1CB25D958393CF5315093869C102563FFE025535AD3CF6FC0E164F6BE02FDEB984C60A88181AB1448268348A6E98ECDE3FC0D69DFBC966F39214639180AACA040931A997CFCB47FD8E09AD3436D492CFFBE4F396246BADD8FD44A4DE8B92A6AE2B13595CCB2197CF48FBD4B63D19EE7E7823DB77F7326D721BAD0D491E7D720B0D0D157CF0BDA733AEA19AEACA28220774E3E6977869670F0FAF7E01C7F53967D5024E5E36155364120A4B9E63C93EDF791B0C23206F6B5C77FDED18BACF1597AF24168DF1E4531BD87760102BAFF3C0C34F93CFDB9C77F672060607686CACE1C0BE2E3C4F67D6EC697CF73B374B32F7AB6BA85CBA8459CB3AF8FC457358D159272D9DBE5E9C8E7E63D29A22E8A385A0233A9167BE86FBD43F832B2E8837BE442FB81963F205A3BA58BF8C32358DFD83799ED9D54F464F821112F440CE262BB2C5C4A36DA1C07AE9E5F17A2E95C3F93A5ED5EB515CB9B0AFE50638B0E939F2FD7DB2925DCECAB22717E3F1BE04D367CEE4FDABE613C8BA1FE11A4B270A05798A4941C9F525B5360E4D46092368F1E82DBAA184F5358A51F541D982059D5910B9F8BB23258D82AC213307056187EE0D3B635111C007DE790EE3E319D66E4BF1AF3F79800B4F9EC79F5DB8105377D1A326D5958942F53D61C71384EA228A2B897E8BE96C1ECB1637823C563E47E0384CEC6CA3797C2B6622269F0C743C06F3067B0F0C4AFFF2C0608E6432C6B8BA4AEA2B22D8763F962DDA6841FFA0452AEB9248681858FCFC77DB59FDEC06162D984ECECA71D292E95C728EA8EB0CF73CF002DFFCCEEDAC796133575F79325FF8D455AC7F612735B5513A3AEBD9BE2DC58D3FBE8F8ECE24175DB092FD7BF7C93AD46DADF5BCB8F100FFF29D5FB16173376D4DB55C76C54AEAEA74162F9C295D2D56D6A1B2CAA4BEA91E5D8BF3FDFFB999813E83DFDDF128FD4D6D542E9FC307CE99CEA74E9B4E5C78DC656661B16EF7EB39F3C2EB571174793C36FA23E8884EF4F9EFE0AEFE47027BA0BCBD7A8551A250BFB9F0E3A08FDC6CF4116DD0613E2CC82CE7073CFAE27EFAFC18463C5EC808343890B3B134A1136A8812CE2398795BF66E08C274ED0C3D9B9E23D7DB8393CB62E5B2F45BF074BA023BD9C417AFB940DAF1867A7F9756A513E45C983C3C1C411F5C6363B84555697D8D525B9DACAF51F03A4B0DBAD0BEAAD8EC5554AA13B52A703CF6EC4DC9CCB9692D0D5CF73797F3ECF39BF99F5F3EC8DC9953F9B32B57D13A2E89AF9BECEB4D317D7C1542CEC9A4B2B2C7A088C48543C3CAD932C1C5B2F2E49C3CB5B535B4B7B4128D478956082F739CADFB737CE55F7EC9DA8D3BD9DF93C672908E8CE6BA1873A73773ED7BCFA4BA52C74D0F4A4D5CD4CF10371622113EF4C55FB0A3CB420B5C34CF65C1F47AFEFEB357B064EE4499F1B77D678AEB7F7C2BADE36AA9AA6AE09BFFFE332E3E7F059FFCC43BF8ED6F1FE4AFBF701DE79D731C1FFFC8A574B4D7C93ADD426E7AF299ED7CEDEBBF664FF720313DCF673F730573664DE69E7BD7B07AF533B434D7306DCA783239970B2E398FA953EAF9C5CD0FF2D5AF5C47AAA299DA734E65E9DC66FEF9EA654C4C98050DAED8D5A1ECD36768A022E8F2301B13041DDB743DCE637F4790DD5FDE5EBDC22863DE47889EF20D30E247B49E37E3C34305E9029F6777F7B3EE409E644D9D4C991673F639C7A74F5CC8087216133AA12821FF79BD014CC18957BA1FAFD0E864A8E5959453A4842C269FF2F46C594FA66B3F7666102B93216BD96C722AD998ADE41B9F788F944286DB1A163305C3EE289444D0826CC5F2B2D6557E2855944A19C5A495E1FE8161D42CE48BE264A19C189456BA30ADDB96F2874D904FD3D6D0CA434F6C6560C0E56FDF7B22C7CFEAE4406F3FBF7A681D8E11E7FCB397B1FAF10DDCF5E85A2E3E753EEF38750E6D8D7172D99424E79CA5E15869A2318D8816913246BC2A492216150F38E4F538773EB49E1FDCFC304F6DD8433C9E90B53722C2DC261C24A257A3888A67B471D945CB387E4E0B869F93DB8F6FB2E5A5149FFCD6EF481391BEE4381E679F3285BFFAB3F319DF5089EDD9329DDB301274ED1FE0D6DB1FE4C1D59B9933B583ABDF751A9B366E67D3A67E2EBDF80462A683655B589E887303EC40E7BBFF75071D1DE389472D664E6E63FD0B5BF9F7FFFC151133C6C7AEBD185D37F9C63F5DCFC4C9CD7CECA39713040E37FDF40FECEC75094E5841DDF83ABE78D93C2E98DA50A8F1A208FACDE082D2758E09828EEFFD03F6839F21E8DB74447868F533885FF9304485D97FF42C438625F1388FC60D7FDC4675739B2439F1C09C760306F236AE26AAF0C9A4EE90280BC4FC7AF939A4F68397575AC7CBFE2EA3618FCCDE9DF4EFDB49A6673FB9C15E9C5C9A8CA7F1A2D3C0F2732F65E994163CA18BCA4941C1C98592A28568BAD4D75C9A2D18EAD122B12424E82152164938C5D655B2546858FF39EC27188E15846C89DFC5EC9967E1DB2EA201AC20D7A6CA4A3E7FE5198C4BEAF4A7323CFEDC1E3C372F1FFFFFF7CE75DCB57E3F3927862977D89451E607CF9DC9C72E582823D93B9FD8CE3FDEF07B164CEAE423979D4847438CA4E9138BEA44A2097A2D8DCB3F7BE3FF67EF3CC0ACAACEF5FFDBED9439D30BD319981960E8D23B82A0A8891A6BAC29A6F7DEFEC9BD3726F7A627D7146F62A229C6A8B125512CA8A8802220BD0E7D18A6F776EA3E7BEFFFB3D63E0706053D5272AF66B60F0F32B3CF2EEBECFDAE6F7DDFFBBD2F075A7A98775E2535792A9FFFE8E51CDE77446A6578FD1E8A470EE7DB3FFC235DC10C36EF3E484196C167AE9DC7B2B915C4AD08A613E0C6CFDD49BF290208958C3495658B2732764C392B57AEA7E148339FFDC8E55C7DC554E962138B0A77700B4DA6776C3979C762B654A18BC735EE7B6815BFB8F369028174465595D1D6D6C5F471D9DC74E3321E78E859FCFE346EBCEE02145DA33F14A6BCA4587E57ED5D1D1414E4A16A169B371FE43FFFF33EC2E7CD451B59C2D22A1F3FBB6EE671D12DA1FD721ADB50049DDAA0BD3D00BA7303B1173E87D3B13DB5BB3AC55E8AEEC7FB813D2881A2333ACE59FD70C2BD44469B8AC3919E101B9AE3E81EE1741227E63874456CC2A2334CD564FE5CD0F04E24C09DD52B7A938309AEAC45A4A79DDE96467A5B1A0876B7486D68A110D71E0FD0513E979B2F9A438EC099B840679195750B7E227A7E2D38BBC09BB0A63AD61DF8FA08FA58349D10D73F46A54BD85589283A2AA874C228362EBA1C6DA93DD1D91FA3B9B5939F7CF40A1657E7D0D0DEC3577EF30263CB73B8EA82496C3EDCC1BD2F1EE0506B5C52CC4C3B4C866671D9EC0AA68ECE273F3B83E7371DE2A1557BB04371668C29E6C3974F656A550E5E03E24A1AF73FB795DF3EB18B505F275FFAC0855C30B98CC9132AF0790DA9156D9B361DFD7D6CDD7D8467371CE5DE475F116E855CB168145FBA71219A3D80E9683CB67217BD4131F1D81C69EC64DD96161C5D98CF86890D04F9B74F5DCE37BE70312DAD1D3CFFC2368A4AF21835B2180783D5EBF6B273E7513E72CB6232B2D2F8D3FD6BF8D91D4F62DA5ECC6888F2920CBEFB95CBA5D0FFF77EF62899593EBEF7ADF7B27D571D7F7B6213975F3C9BEBAE9E8FEE31D8BAFD00C1C800C545053CFCF04BBC14CCA63337979AAC280F7C7C51C21C3E2943FAD69FBF21804E6DCCDE1600ED379B89ADB815BB61756A77F5067B79DEF3185AC545677C9CB3738044549930AE306D8515DBF613CFAE9020261A5204D7B92322AC47C54E2E0BF53863E3F4A297D3BF7637D6173248B1503F031D2D74371DA1BFA59EE8401F91984938E6B0D1338E65E7CF654E4D398665CA6298E87A14138EC4E8C1C541DB923A1012A093DC68E16C92307B3DB13BD04D79B862FB6EF1F07554BA9809428FC48A10150EDD2187C3CD411ADB83DCFEC94BB86A5A213B0F7771F96D8FF29E59D5BCEFA209ACDDDDCAFD6BEA68E80E93E9D1C84C73C822C2A76F5C4ADF401F79197E0E3675F3DB47D79199974F535D1D5FBD611E972F18236979BB8FF6F1A33FBF80E1CB60E69861541705F8C8F5737114836028CAC04018BF57473344FDC0E07FFEF2140D6D0EAFEC6A223D4DE56BB72CA0A2409379E8984863490A9DC6C69D2D7CEFCE55988A8EA3DB38E1305FFEF8C5DC7AFD0CC20321F6EF3B443466535D554A7BB7CDB7BEF317F61DEAE4131F5CCC65974C61FBB646FEE7EE2739D21EC289EB32EDF1DDAF5F4A46208D1FFEEC11468EC8E72B9FBE8C47FEF112F73CB09E6BAE98C67FDEF6613A3A43FCFBB7EFE4AAF7CC63E182892C7F6A330FD546E8C81B468ED6C7B35F5CE2A6A9A4C7A4D00F7FEBCFE11040A7F616BE2D005A745DC59EB8FEACB87A6BA3AFC373C93DA98DCE39DE2B11344B2924C1DCD8D5D8CDAABD8D948CA892790101D1BD11E88C5852E3D9CD030F7A194ED6717226B21B27BBDFD71DCFFD81742119E8A1AFB581CE43B5F4773449801674AFDA78319EE2D1CC993289492386E1157AC5223123DC4B060923C9885802F471AFC06403CAEB54E912D655526FC37485F68F19BECAE614578B2466464044D8669CEC4C3F0BC68EC4B61522518B25532A1916D038D4D8CDD7EE7C8E8B678D62F1C4E13CFAD23ED6D6F5E0317432358BAB178EA5B3BD930963CA098623E466FA39DAD84ECF401453F5B273F77EAE3E7F32E5055E06A20AF7BDB897879EDFCB8D974EE7BAA53514A4EBD2626AF781A3540E2F2533238DE6F62E0ED71D61E1F4C992E7DCDC61F18F557B7879D35E96CDAEE48A4535188A70A7B1D8B9BF995DFB5BD871A09DB5DBDA7144CD44D0DAE271468D18C6D47139BCFFEAB94C195B4267CF00CFADDEC5F2957B58BDFE30B198C69C89597CF5F357931BD079716D2DBF7F701DF547FBF0E90E1FBC7E0AB3678CE6851737A1281AB3A68D95935E5D7D1B1326543275EA6899427BECF1754C9F3E8ADC9C4CFE78EF4A9E3E1441193716D5E967CD5716CBD670292025D3D0A7961538D52B3404D0A981CBDB03A0BD1AB1E5D7621D7C3CB5BB7A83BD14231DEF47EB51FE0FF812BAF460297E40D85278E4E57DF4797C9414E449301639C58EB04D8F10DA10E02C0D5106472BA78BC6A73F8C32E52852BC227232C3447A3B68AEDD4957FD7E9987B6A3033446FCB4798A482F19CDC5F3CEA3AA301B4B74A909FA9B743E71BB0C93002D9A5092CC8C6379E6846EF3F122A12B1DEA02F4F1085A449D82B9216450456130160BCA966E33AE909399CE2D8BA730B7A698CC808F17B71DE268632FC387E5B163DF3EC6578DA0A727C4F20D07C1EFE7D259A3C9F32B1CA96FE6C08123CC9C310E9FC79014BD7DFBEA78F79259F83C3AD1A84D9AEED0DDD3C191CE28BFFCC7665ED9D3CD7F7C703197CC2A21CBAFB362DD5EFAFA07B862D96C29C224AEF977F72D67EAC4092C9B5D4D4BA7C5F31B0EF1E7E5EBA92CC9E43337CE23C70FDD6195EFDEFE08DBF737513EBC90BE7E4BF2A5354DF0A155E2518BD2BC087FB8FD134CAACC055DE3BF7EF138773FF03271DB8F1989F29B1FDCC485E78F47B1426CDBD5CC776E7F926DBB5AF0185E46975B7CE93357CA7CFE5F1F5A437757841BAF5BC89C59A37865C34176EE3EC89C59E3A81E59826A183CBD621D1B361F615FC44FE6AC29C408F3E297CFC727177F2E956828823EFDF7E9CD3EF92F07D06240BC573F8B5AB6E0CDC6E69CFFDEED78B625F61EED0CF3E09A3D148CAE22CB2B3AF15444EB417BD8A63F96606B9CF32B4AFD042222564503486480B603BB69DEB78B486FA7644B74866D7A1D3FDDE92398357B0E4BA78D910EDA22D5612554E88E6B6CB85D82C7DCB813EDDBAF7546B107E59945AE3B09DC029C054759A64DE282B9102266C531C30EDDBD712E9A51C317AF9985473778EFF71EA4F65013D3CB73F87F1F58847053F9FD935B79EA957D8C2ACBE72BB72C233F5D65F3CE7A543BC2D489C3A5EB89B0988A5A3699693E2C33447666366D4D6D7474F6D2D4A772C73F36B2F15037D7CF29E1B3372C24C36BF0D7E736515E5EC8ACC923A96B6CE3BCB115DCFBF73598C0A7AE99C7A18630B7DFFD142BD61F66DE79357CE9FD7329C854680D3B7CF5DFEF62F6CC69DC78ED5C0E1D69E3377F5EC9FA1D6285A2A29961164C2BE0E7DFFF38A5394234CB61E79E56F61C68A72FE4D0D1D1C6273F7011861A053BC6BA4DF57CE7F615EC3FD283A2EA5CB67034D75D3607AF07D66FACE50F7F5ACE55572DE0C61B2FE6D39FFE09FB0F1D62F1A2697CE93337A0F974FEED5B7FE4D5CD0DA48F1D43C545F3315593155F5C40BA8C2D5C95C5D3715A198AA0537BD7FE25015A9FF54D8CD9FF96DA089DE3BD441422F278EBF735B272672BD5E78DC327B514544236B484E284E3A75A42FEF323689975948C3BD7C854B1A2F4341EA679DF767A9B1B880CF4110E0E108EC669338AA898BA984BCE9F454017AEDA0A8EC84927981C96A4D125CC5E0745CCAFCD3B4BFD8C41CD2749F076F59DDD766E91F270E216B1480433D6C7F8B2524CD28944427CEE86F33954DFC257EF5E4986C7E0FAF913B9727E353DFD31566C6B94ADD8B3ABF3193D3C93E52F6E60EE941A8A057D4E350864FAF1780D34434CA436E118787418E8EBA2B72FCEC18630BF5EBE8D757B5BB8FD2BEF61D6A84C0CC561F596FDB4B5F5F0BEEB2E213B53A72F14E547BFFC0B4B16CDE192E9D5F45A3A1B0EB6F18BBB9EA52C3DC0E7DE378FDC348BCEA0CD4F7FF157AEBFF6122E5D3A51AE18B6ED6FE6C7BF7D9C504861F1EC712C9C554D557996E44A4BDE8FE391D2A46271250D73A33184359910107F76D54EBEFD932769EB73D0741FA34BD3F1C7A30C2F0D70CD758BA9AB6B276A06292BCD65CD9A7D8C1E3F82C58B66E3516D56AFDBC58BAB6A797EE556BCD515542E5B886DD82CFFDC5C32E56ACE5DD90D01F4B90389B70D409B6B842FE16F211E3AF3D1300278AF7A0AB568E6991FEB8C8EE04AF1F7C5151E787127FD5A265555A5A8F108263ADD5187D6011353E49F4F83EE7C4697F6261F96D1BF34034076D585DA9BE8ADDB4DC791FD7435374B3B2CC1A8684B1B41E6F8455C38F73CCA3234ECB85BE893A90CE16F28803541911BACEF7C2C829646AF2EA73999061111B4C837CB7F4B9A5D18D190220A8B66D0E45DF3E7306A7809F150174BA78C42157E7C1E4853559ABBFB68EB8C70F30F1E624F4B04CD085093E3F0C5F74C9682F5AB37EEE243974E27A6F87968CD6E1E786E27936B4AF8E6871633B9A2905FDFFF38E98100572E9E4B6BC3513A43264F6F6DE6AF2F1CA6AA3893FFF7FE0554157AC8503D1C0D3A3CBF612BCD2DADD4540FE7CA8BE65098E9939D7BAFD4B6F0F51F3F4A575794AF7DF8022E9A3712D58CC97674512C35BC3AF9B9D93285613B2A5ED5C0B4A2C44527A960C2881491F87FB12C114F919CF4145984154EE58A1D97A92891BFEE0AC153CF6EE2A18756B178F1242EBE702A15C539B4363773E4681B5959856CDEB297E933C771FBED7F22AFA084EA9A49FCF72F1F4133A4510F81CAE1542D5B84EDB1F8FB276792257E282DD54E4FC47F28824EEDED7CDB00B4B5F7414CC1853EC36615392C9A0763EA17D0E7DE96DA289DABBDC403AEB8207CCFCA9D78871533A22417C516A0ACD311B4690D99B251E5ADD7C9CFCD452714A71334BF84D4A9484B840718686BA4E3E01EEA776EC0944A7751FA940CBAB36BA89E349325D36BC8540598B8A2476EEED915DE7F9DD9AB28048A7D04E80EF212143F8B460550B9EDDFD2834FE8520BA797B84347D022BF60381D5D3D0CCFF1F1EDF72D66DBF61D8C1951C48C51C3D974B49DDF3DFC22EB9B606F7318AFA671D3EC726E983D9C83F5CDAC5CBF9DCF5C339FA0E3E7AEA737F3E48606C65464F2EFB72E64EE980A1AFAFB8974072909A4D1DDDB43674F2F073AA2DCFDE44E3C812C469764529619E3D64BA7A27935344F3AAA9646C0AFE26816BAEEE5177F788CA63E87F5B51D14A4F9F9CE272FA2B4C88B1535B14362A511C774A2E46467911908C8894CB42B498F492909EA4ED7429B251E170A83A21148E482C57322BE1321CC1FC5892B6E4F90A611770CEAEB3B292F2D4053A2C4A3415A3BC23CF7F201D66FAA63C3E69D5CB8E47C9E79661DA6ADE3F77931851D9623689D161963CAA8BA6801966EF1B74FCE9011B44C710CE5A0CFCD8B9638EADB06A09DBE7A624FDF82DDB2E1988CE5E98F8C825A3A0FEF35CF9DFE21CECA274504E2B0BFAD9F3FBEB09BD2CA6ACA0B32112D0716BA04EED6601C4BD2EB5E2341774C1B63D0859CF0B3C16C8FE43E2791B17BED71DEA40699AC511EFB58C252CBB16C62E11003AD0D1C7AE5597A3BDD2EC3483446B796472C7F0C93CF9BC2FC89A3F16A8256771CA093290D195927981DA245F9C4EEC0C4BF851B8AF41374591B02A0ED585416E10C8F8F57EB43744684CAB1C6F8F23C968CCB9574C0EB2F9ACAAC51651CEAB779FFB7FFC49EDE742C5BC5438C4B261672C3CC52BCBAC5FEA39D4CAFC845F3186C6BEC66DDAE26C6561470F9BC1A32020196AF59477E7A16D34795D3D3DB416747AFB4897AB9B69D07D63470B4AD8B65F34673DDBCD18C28CE241E8E2452242A597905EC3DDCCADD8FBFCCCA17F7505452CC47AF9EC527AE9E8162C788C42CFEF0C87A0CC3275BC2C754E6332C2B204156342505C3260D2D5D7409479D8843437B90EEBE20FDFD11A96F921EF09395994E699E261DC005FB64586E3AC2C65040A9AA8B62652CA1FAE7F0FCDA43FCECD7CFD2D51B930541316A49BB34F15D688AC8928867CF266F4225232F9C434C35F9C7C7A71348E6A08700FAAC20C1A90EF2B601687103F10DDFC7DCF07DB062673C286AC124BC37ACFB5F174E1200FDEA9136FEB07A1F93274CA434C7475C11D1A34ECB80497348E41913F29D83F8A62E01E4D439E89355D68FB146CE70F4125DDFC7F59E931D8D62E96DC668DBBB85D603B5F4341C20D8D5268571426A80504E2517BCFBBD4CA82844111A19423B43E44C85425EA21B5000BD00665344C6096ADDE0085AB6710B2FC4A4BFA0480BC462A8668459E346F1CCEE767AC21AC53939146579A8CAF370C1B4914C1C9E855F57E973FC7CFABF1FE1F13D2255A649AAD9CC8A4CAE9C94C3D8021FAD9D3D74456164413A238BB3F1FBBD780D15DD9FC18EBA3646E406D044039119A7ABBB9B48FF008663A17B7C3CBCA985A73637D3128C32BA20939A51651CAD3B4AC0508859363593C6B2F2A56D34B60D50539AC907AE98C6754B27929BEE9500DC3710E7435FFF2D55230AF9FC872E939D8642DF595CA7C8313FF0CC761E59B18D1DB50DF405E3320DE65155A9C02744F6ADB84644E8B4587DE464FA98589DC775EF9ACA82E91520A26C494237E5337FB825CC8F7EF5349B76F724D267B6D4821691B8C85DD98AE0E9086D68B8B6DBAC0000200049444154F7392B9B359EE18BA711B50678FCA3B3E513298D225EA3AA98EAA33594E2486DA4DE56006D376F20FAB74BC00CA676776FB097925D85F7DD0FA1E48D3BE3639DC901C463BEF640237F58B39F69E74DA12CC78B684BB16D8DE6605CFE912DDEB22960F0262A42A73EF371807ECDE7DE4A5D5102EFEB3F70B2E0FD9820883064ED6AA2BBA19EF643B5B41EDA43B0A39998E510D4B3F04DBE841953A75053988962C52485CD357E75B9CD326D3108A0933E8372BF24F7391A763D06A520BF89190E529D97C1758BE6D0118912B11546E4E79217F09091263CFF84E59FD07AF660695E9EDF7E845F3F53CBDE862EDAFB2CAA0B7C5C581360C9E812B23C2AF73CB785E125C31857293A4E856B8D82E928043C2A23F23339D2D2CD81CE8894171D9EA1519A019A1D27A807D872A49B977635B3F560BBBC0EC712024A82871DC7AB397815583CA78AAB2F98C8E2E923C8F40B8714D77641AC0A0E36761248F752989D8EF05314631DC760EBBE16BEFCA3BFB3A74E00AA978047A3A0C0436B530F936BCAF1EA0EEBB71C46248D8533555F5850A7A3CC9D52C6C76F399FB165B9684E08413B178E914290E927BF7B86755B9B133C66D7BC57344149912BD9879268A4B26D2A174DA36CEE646CAB9B473F3C47A637444A6508A0CFE4ED7FF3CFBEAD009A7898C8BDD3717A0FBEF99DBDC91E8A27137DDA17D1677EFD8C8F75260710F0F7D2BEA3FC6ED55E664E9BC6F05C3F36222FABD13C10A741444A8A50DF3B19509EFBCCF4C9087E273BABCC8BCAC8CB41318344FB7A659761FDCE5769DDB75DE6A84D5BA5BB700A199553993D711423F203A882B72C73D089A25F92EB3C485F4344D002A05DAEB385191502436EA150880F05548B2B674E666ECD08D23C0E8AE641D76C54D54155353445435555148F1745D3246DEE4047880DFB5B7962DD5E46E4A771DDF935F86361FADADB69ED8DCA2EC0CEBE10D1B8499AA4D7C1A4AA723C19693CB9763FF7AFDE8382CECCE1395C34A588E20C01C4AA2CEA7504159EDBD3CE11918EE81542FF0E695E83E23C0F13471673FD4593292D10A907054D17D7A6618B13D831E29A5F521185283F8E8EED68ACDB51CF2FEF7F81F53B3A89251C638A7333F9E42D0B58B76E3353C755929B13E0CF0FAF60446905078F76B3657FA7745911E3317B5219B75EB3800995E9B2482B24B762B6CE3F9EDBCFF7EF582E5DC1454A488E95D0B2967E648A2BC895B0191B7BF17C8AA78DC16B7771EF07E7BA1C68E9C69268837D8B2FC150049DDA80BDBD005A4413DB7F87F9C26752BBBB37DA4BC876E68C469FFB1DB4AACBCFFC7867708457EA5AB9FDC92D4C993C99B1E5B9600B912183B688C3A1DE1831C74D71BC267E4EB97098FCEC5BA5439D2AD87E2D408B55F1894D8D82F32C5AB223F4341DA271F716BAEBF6D1DFD986198B13F11760948EA7B2663C534795499DEFA43595E04BBBC2FB2ED739A9F12C53209610DE8F6346232E50C74D86A57BB9786215E755E4E3F778F16AC2EC5C14E73C58AA87A86899D73C78BC3EB27C6EBF8F4851689A2EB9CD5DFD11D27C06F959E9C4A3513AC32677FF63A3C4C7FD878E503A2C939EBE209565E518BE007F5DBF9FCE9E28ED7DA23A675193AF73F3F92319374CC710D1A7EE45511D59609346BE8E23CF251A5EFC690659997E0A72B264E1B02B6CF2B717B7B0EB40334BE74EE082699564FB5D5F402148D5DE17E3AF2B76F2C0333B38DA1EC60C45583CB59A6B2E9D8C19EC615CF570F61E6AA6BDBB4F6A880845BD9AD1C54482260D6D7D1869593CF8E44676EE6DA0345BE5EA8B26F39E25D518C2100295AE8108F54D21D7CFD23669E930B9EB9EA768EFB1510C0FAA68F2741C4CDB64FAB54BC91D534645468C1FBF678A0C2204A8CB89F934E28421804E0D30DE76004DAC8FC81FC7E1843B52BBC33701696DECCD180B7E80E2CB3DF3E3BDD5232410706B7317DF7F781DD5636B985153816345A4F75B8FA9B3BF3BCA80C08264D76182DE264EF5DAF76230A09EEA776FF6F354332027D412072937B9B42B7191C2845488FBF7D3DF7A94AEBABD341DDC4BFFE1EDA8964D9FAF0C5FF54C66CD9E4E41C070991882929028FEC512396801C43149B38BC94614272614EB6212B823668C9955C5DC346702E90298555532297AE236B58DDDEC6BEAA6A3A783886033E0E7BC9179CC9E54C1F8D21C1C3386A65A32BA56745D82BA652BFCE6C9EDFCF2B12D44C226A1984561A687F6EE7EF20259A4F93DEC12D29B9683660BD5B838178C49E7BA9925641BD0D21BA1B12344F5C86114A48928DEC1301CD23C017C5E3FBAD7405563A8DE00583E7EFFF87A7EFBD4767A223AB99E105FFDE022A90DA2AB22E7ACF26A6D3D9FFFF19352C449F8079A7D9DD23FF1875FBF16271EE7AE0737B06977036D7D21D90894E6D3A828CDE657FFF62172D2355EDEBC9FEFFEEA310EB79B92765791E3E1CF3FBD018FE2B22FA4988023FC5A84588A494CCBE2A7BF7E8615CFD7A2FAD3A4EEB86C22B2E3CCB9E922B2471631AB348D2F2E1AE9D6AC132DDEA781CF4382FD2962C5DB0FA001F3C52F10DFF6EB146FF18D7753F3C7632CFC316AF90567E5786FE9200952C5FEAE20B7DDF7121945C52C9B3D1EB19ED69D3803B68703BD269DE1B8949F74D31CC76546DFD2B9CEE9CE276769BB4C2C0B27D24FA4AB95D6FA031C78E93962A2E3D08181AC4A72269DCFA4AA0A728CA8044DDB52888BDC74425F437A0B8A42A088A00548C74C82824B2DF635C32C9B38822B678D93FC5FC39BC10BFBDAD9B6FF103B9B06B0550F5FB8763EB5879BF9FD632FB1647A15A1602F15A5657CE3C6C5F824B7212ED30C86A653D7D9CBF5DFF8131BFAF3DD82992AF2B842D75A41B15CAEB1A27951054D109B2C9FCA7BA79470C9B85C2CC7E2278F6E667B5D37238A037CEBCA69B23350D521EA78E8891B0C44A394E76530A2D027F59FEFF8DB36EE5EB193385ED2F520DFFDE4C55C37AF1255D41B1483675FADE77DDFFE078E6690E3B7B87EC978A6560F931A214FADDDC3777FBB12430F8010531257246889F10897CF2CE20B1FBD52A62A9E59BD8B67D71F60DB8166AC5090E7FFF0297C7A58E69B053B44B6DE3B269A62D03CA073F7FDEB79EE859D685E9F6B6D25D22D3ACCBAF142F287E773C58422AE99982781FDB58C9EB7F2880D45D0A98DD6DB12A0ED968D44FF3A3FB53B7CB3BD140D6DFC076467E1FF8A0CA9E3D012B6F8CEC3AFD01054B969D90C7CAA2DBBF484C1D7A13E9BC67ED159E882A0CB7375E3DC5389ECBFD92D9FFDDF2762A8D75D902B4729A237271624DCD7CDA1575FA153E876743711B675FAF3C65154319AF1E5B9D22F302E4D4F5D668654B4139C60F1FF42465476134609C5903A2023B20C2E9B3E8EAAE2610C381E1A431A773FB3815B2E9A21ADA57A3ABA593C71047D11879D8DADCC9E54CAD3AF1CE5570F3DCF17AF9FCFF431E514667BC80E783034C18080BB976FE44B7FDD03A23BCFCD35B86C05416770DCBCAC224D6F05B726CEF080CAF4AA42429110F5ADDDD2C75080FA4DB34B19579E83A378786CD3519ED9DE48576F3F534695F1A30FCD970982BFACDCCBFD2FEE46513C8C29F473DBA72E61628968A2B6B0149D47571FE1D33F7E12C3A392E977B8F38BEF964A79ABB61FE5BF1F7889C65EA18EA74A0307D934925CFE845BB962C9443E75CB52A90BFDCB7B5FE4D9B57BA460D4BDFF752DD5E57EC984110174D4B4E80AC568EF8E73CFC36BD9BCA71DF0C8274DA438E28E495A410653AF58486545161F983792F38609929DE05DBB63733ADB1040A7366A6F4B8076A2BD44EE2C962FC9D9DAA45FE13F3D17ED86D05114EE5ABD87DF3EBB9B1BDEBD88B18569AE9A9DEA70B4CF626F97852DB4A045482791396989727A2FC7D91AB3138F934487E3D1B46001C8FC66A2A941FC6D0F7433D0DE44DB9143741CD84647533D617F11C5131750555E449A139251B274E016AC0E91738E455D4F4091EEB063D803212AF3025CBB702A0579B96C6CECE7D57D8DCC1B3F8A8A4C1FC3F3540CD544D7BCA0EB688A28C6093A9A23B58E1D7C6C6D0B72DB9D4F307B42259FBD7C1A25D93E34D1E8A1298CBCF54E8EF4795144D14F4E8D3AB6E8469486B78A3403C8F55AE4A57B38DA19251277F0C50778F9E737317EC43039A1FCF1C1A7C9C9C8A4ADCBE468284E5B5F9CF5BBDB69EC1EE0BD8B27E25322747675525C94CBF4F1C3A92A2DA0625806861391DF73C8F6F0AB8737F18B07379395A6307FCA483EF1EE1AFA43369FFAC183B4C7BCF8155D3ABBCB967B4744FBEEFBA0C8E6C230D72D1DCDA50B26F2F8EA6DACDFDA40635B9C8F5D359E9B2F9B4C38D48BAA68D4350FF0AB7B56B17177379AD020571CD951292D212C074B8D3366CE04C6CF1ACD85938771F5E4323C89EFF474F3CFE2E843009DDA5BF8B6046862FD44EE9B81D35B97DA5DA6B097B1E40EF4B1B7C882D23F6D4B584889F33D53DBCCD7EE5DCD94A953B8625AB9FBD2290A4D0371767599B2502838BB6E249D781165DAE3FFC2969C284F4C75B8854301D222F8749D0944CA231E0B11E96EA3BD762B0D5B5EA63718225E3E93E155359467AB1822C72C0A81827E970468C1E410D1B465931EEDE58A3993995E3D9CFA5E93BBD6D63160C6F8D2BBA6333EDB83AAC4B00D1F2D41D8DB1AC2B21C72D374A657E592ED17AC62A86D37F9F9DF5F26689A7CF6B2192C9E301255B1D134856FFD65356B76B5CA0E4E51446CEE8DD36F09F70111559A8C2FF470D5DC115497E6F0F8EA5DB4F645195592C737DE3B8382AC34D9C5B7BD56687CF453DFD4C9E40923A9AA2C63CDCE467EF78FADACDFDDCCC4520F5FFFC845CC1A5342A6A1BB5443332A530AA27B7BC0D6F9E9FDAFF2BB27F690996673D1F44A3E73C56436EEAEE79BBF7A9A982F0F4D86CC82BFECE6FC45E94FA4617461D86B47397F723E5FBAF5121A3A82FCF1E1977875472B372CA9E05337CC23141E90CF577D5B88FFB96F1D1B7777A088204040BEFC3A8571818D2FCBC7AC4BE631615C3E57CD28676A71967419175CEAE3CCA2B71E280C01746AEFEDDB13A0AD28E6DAFF20BEF9F6D4EE3285BDD4E14BF12CB90325B32285BDCFD22E12C0C4C38E2C067EE6AE67E9B4FD7CEB86F9C2A44FE63E7B62B0BB3B4657C4CD4BBA4ED9C251E5E479DFB374656FF13083A3E7133FEABEBA6EC7A4B851D1FE2022512516A1B7E930F51B9E9352A5DD6923304AC75153964B8E1AC30E07654AC315438AC9885A44D0F198C3ACB2742E9F35994CAFCEC6A3BD3CB1AB93F29C00EF99594145BA435C0FB0BD23CAE35B8EB2E17037C2012B60C0F5F34673F5F44A8AD34D6268B40C44D975A495E2DC74E68F2997C0AD8A49B12F486B77580254534F88BFAED9C7939B3A08590A694E90DB6E59C0F5E757E1B1E334B5F7C9083A3F379D7C617FA5D832EAB41C3FE1688C50344AA6DF4B7ABA977E74BEF9EB95FCE1E97DCC199DC3AFBE7115A372546241A1BFE1E6828576B548A1F4391A3F7B600BBF7FAA1645A419EC5EFEF29D9B254FFA6B3F5F8EE9CD4195939F28584A5DA4E3E228B62639E68BA61570D9F96379F8B1F56C3B3C40C8D4B879E9703E76DD1CC2E101F9BD347646B9FBAFEB78695B23A801195523849644711087B2D165CCBA643ED3AA035C755E3185012F9A08D11DE1EE73EAEFFDCD1EA021807EB311727FFFF604682114D3B11D73D557B01BCFDC65458E84E6432B3F1F7DFEF750F3C6A7367A67B897CC5424F29CA2A9E19EF507B9EDA175DCFED9EBF1119536514243A1330207BA06E8347509CD2EA8FF5F02E8D40742AAE149FEACD0BDEAA3E7F00E5AF76CE1486337E1BCD1949416539D69E304071202492E408B3FC26F50B7A27CEDDDE7939F25E86C1E5E38D44B7D5F94778D2F6378A64654F1F2974D0DBC58D7475D579490A8AFCA79D0A130C3C3D4615E3EB264148B46E7E0185E9ED97A98C6EE20372E18C7B0805746FBBAE0AB25F8BDCDC118773CBD933B97EFA6330CDE583F5FB9FC3C3E71C514BC4E0455C0BAC03431F5D8AA6485C8158323920F02F1D5844E8650C8D0B873F9666EFBE32B1465194C1B53C2F0FC0025F9695417E530B3A6149F21F2DB1651C7E09E670EF0DDBFACC7A32A8C2EF6F1D5F7CEA2AC28979FFEE9399ED9D48C62A4498016AB2D194C8B71552C9C984D49B6C2973EB098EA11053CFAD4569E58B38F8E7E93EFDC3A8B0BA695108985E598C42216758D5D34754758B7AD83CDB58DF447DDA274667E3A3396CEA1645421EF9998CBBC113918AA822681F9CC566F43009DDA3BF3F60468716F560C6BEF03C45EFC3C986741E12E315EDA8865782E7B08297FF64FD8645CE922358783261FB86305172D5CC0D4522F51E1462DF29F8E4E437F84ED3D36A6941E15F969F1B9337B49FE09B7F7BA530872972CBA89175CB035BA9A69DFBF83BD9B36D1172823B3743863B31CD4900BD0A250285C524491301A0E316944011F9B7F1EB6E610D7023CBAB38DEEF000EF9F3D8A228FC38E1E2F5FFBDB469AE2DEC47798588ACB85878D1AECE6FD73CAF9C98DD3244DACB93FCEEA3D752C1C57C6D8C23C2C2D8E070F0396CD81B65E1E59BB9F075F3C446F30268969237254FEEDE625CC2C139E91A62BBBAA3A38BA9781709448D096CC88CC7C0F9982F121DCC565C940C1D1143A623A5FFDC5638CAA28E3506317ABB7D64BFD8B9A0283FFF8D8C54C2C4B9391B4781E9EDAD0C6277EB512C3F0936E585C3E65189FBB7EB1EC64FCCFBB5F606753D08D78E5F420645BC1107F625D7CE4DAF97CE8AAF93CB5660777FD6D3D2D9D31FAC2511EF88F2B28CBB23085238AE81CB44518E04E48ED418DBFAFAEE56F2B76A0FBD21933A38AE94B67E3D743BC6F5A09E38A3265FDC3ED527DEB698DC10FC31040A7F6F6BD7D015A3C96DDFB30577F15ABEEE9D4EE3695BD541D63CEB7D1A77F3995BDCF6C9F64114D3EF482F0A5F0F3E7F7F3E4C17E3E7ED144BC8897DBAD96472C83550D03F4C5F50407F5389BE3CC2EE2DC7C5ABEC26F44AA1691A688FC82DD52B3A3F6A517E85272F0978E605C868D1AEE77BDF912006D86C3A42B36EF5D348D490519E8C2895AF353DB0BF95E8551D9C291DB6175639C6F3DB593A0919158F24BF16A771345B4F0004B47F879E0B38B5D4686D7CF139BF731A62C9F29A5C3A400BEC8F3FFF685DDDCB97C2B755D71FC9ACE4D4B2671DEC85CB2BC3129A664C44258A2F8A829C46C833D473BD85FDF2AA14EFC1154C16105394C1C554E6E9AC7A51B8A31D1344251C8F07BD87CB49B6FFFE16536D7F6123006F8DA07E672C3B49128AA255923ABB7B7F3F1DB9FC624434E665FBF7936372D1A2BF3192B371DE16BB7FF9D889D8662884E53E12A13271EB1F9CA0D53F9F0B58BC8CBF0F2F3FBD7F0837BD6A0AB7EF4581F8FFCE47AD2957EF9ACB9591137FA562D15C7EBE381A777F1C747F7905590CFB21B17935F964D893FC2B5934B2913097CB90D01F4B9796B5E7FD4B735404BB3D19D77115BF38DB3A2CF911C1EC59B85EF63CDE75E482909D072D9EF46D107FB4C267DF3413EFFDE8B9855918F1D176DC72273EBE195A63EEA07043FD7EBE2CD6B10F0CC629A933F72A936AE9CECD3A7BA1E9183161E8B12396321826D0DD4AE5A415BD487BF78046302266AB84FFAFA49808E8650A261168DAB66E9A44ABC6234349BA0E6A3C14A6798DF4FA1164151636C6857F9FA937BE857B3130A80421759A4844491D24089F4F3AE9A4CEEF9D02C2C4DE795031D3CBFF520372F9DC884924C6C1191DAF0C9DF3FCF1F9FAB43F5A6737E75806F5D33839AC234D7762B16C7D04494ABD3692ABCBCF9203D7D034C9F3A0DD51790E90DBF1966C7BEFD7476754999D5CAA20C297A250B8D8A85D7B6E85302FC74F96EFEE71F9BC18C70EDEC32FEEB9645788C18B61263E7A13EBE79F77A763545E524FD891BE662F77630A2C0C3FCE9A379FAE5033CFB4A2D750D3DB2F53D274B61C6D891FCE7976FA0BEA59DBD871AD976B09BDF3DF2AA5C818C2B31F8E9672FC2AB4425033C6A6B0CC47421F62108D1F49A0A77DEBF922DFB06C82DCBE77D9F7D2FBAD5C3BCCA4CE6570D23CD487EA367BE721B8AA05383F8B737404B94B230577DF9AC35AEC8615375F471EFC758F84330A4B9CF39DA121CDB63045611BBA92CFBEFA7597FB8971B2F9AC19289A57884909088EC84087C5F9CCD4DBD0C38BE44EE53148A34B7927F963779C893A0EC1B46C6295C83CBE54E04B642FBBABF87FD2F3F4B634F8C404E29237C119C50A72CD2093124AF1D63E98431CCAD2AC650A2A86A3A8A1143D1FD2CAFED655B731F1F5F308A919982C29BC513B5ADFC62CD11BAE33E6CD18227625A278E27DAC7DC0A0F3FB8793195E996A4E1B53B5E8E76F533AE20409E5F45B7350EC72CAEFBE1636CAE07DD037346A4F3A1D963983ADC4FBA1694EEEA82DF7CA4B5875D473B28ABA8E6A117B7B2727B1D39E97E0C4F1AF54DED8C294EE3D6F72C24CF17A73CDB4B71769A8C5B35C5A47140E7377FDFCA63EBF69393E1E5E60BCFE3AAF963C8D2FBA51B8A62E95214E95057905F3DBA96155B9BB1AC00A61964E1A4726EB9741607F7ECE4F26553F1797C7875039FCFCB532BB7523DA18AA757EEE0378FBC420C956CC564D9CC6A6EBC6402697AD89DF01D8D577775F1DDDFAF268AA0D72968899E7D6F96C265D72C65D4A842E6566633AB220BBFD01E7DAD77CAE9D3A087687629BC276297B73F408BC59D705BD9F28BB3CA8B56BCD9E8D3BF843EF9936048F5DB73BA09CD037773787047335FFCE32AD233F3F8E0B249D4148BE5BA483A2385FCEB7A4DF6B485E8B184D3B72AA351B9B41E243F7A0EF0FAD8FD0FEAEC7ECB6372A2E7ADEB08120F0539B4FE799A3BFAF0650EA354741586BB880B3D0FD362644136174EAAA128DDC0706CB20C0B47881EE91E36368768337D2CAACC23D788E2D321AC66F08FBDDD3CB6BD9EFA3E9794A863727E652E9F583286C9C5E2FBB4A522DD4BFB1AA4FCE9F935C578B0112CE95575DDDCFC3311D10710A2C8AA196252B6C2B7AE9ACE84121DCD51A52A5E7BC8A6A12FC60B3B1A7878F52EAE5A3A93922C91065058B7E728AF6CDBCBF88A3CCE1F9DC794CA02A65697A2A971A9B35CD7EDF0ADBB9EA77DC0E413574E67D9B4110444641B15AB0BE15C28F44C5C9EF3DEC620BF7F62232B77F710313572FD0A8134132516E373EF5F2A0D6DD3FC5EE6CE3A8F7FFFDE9F30B27289C4140E37764BB1A425138BB866F1388AB314B7655EB1885906CB5F69E2F7CB6B31142D61E61BC7D162CC59369B050B27C962ED053585E407C4F3255B57DEF2F77DAA0F0C45D0A90DE53B02A0E33B7F4FFC95DBCE8EDBCAA07153B22A31E6DEE636B088A68773BDC93E0893EE98CA771FDBC8BDAB0FB06CE604AE59300AD556E58B2596E0160607BB0758DF2C981E82CD90C80ACA94897B91C9C0F75C01F5095A1C27199753A5375E0FD03656344CFDA697686CE9262D9045A13A801DEEC58E9B882EF7B4DC128A0B8B49D354B2149B1B2666CA8611A17571B027CA9A86089606534B73995F16C0ABEB4455832D2D415E3ADC230B6239693AD74C1FCEA83CD1AA0DA6EEE5F7ABF672DFF39BF8EA3573B9694E952B9FA9EAEC6AECE4DFEFDBC8CB7561FA2DB79839C21FE17B37CC65D230034D50E2148596A8CEFE8E28772CDF40477F9C4B678D61E7FE2384A336572F9AC6531B76B3B7AE91F74C2D614665010B278E24CD7079CB5DA6CE1D8F6F24666B7CF9FA79E47B5CFD6BD9491917290D211AE5DA5B39AA8F836D11BE73CF8B6CAFEFC134C554E29095A631AA3483E68E7EE98358599ECFD6DDF5D2E24AE83AA71BB0786201375D3C8EA24C1D251E952DE962C68AC40D1E79E930F7AE3C8221532F82561761FC946A165FBE80BC0C8D778FCA6074BED0E410359204B3E52CBD0343009DDA40BE2300DA1968C2AABD9FF8969FE384DA52BBF354F65214D482C918F3BF8F5ABEE88C2BD7A99C529AC83A50DB19E44F6BF6B2B539C284AA32A6541692A9DBB23025E0376239ECEB8AD21C84B6B045548ACF27D1F9383CBABD226717A64F06BEAF3D432AF9F04482072716A163F7461A1ADBF1682A39561F56A44F1609459EB6C75F424CCF92CC429F15E3474BCAA84C17195D13212BB5B3C3646D5D177E436771753E05191E46E606500D0F4121066483DF6790E773D00C95DA96309B8EB4D113B649F368BC6BCA084617F82523428826C5559DDD0D5DACAE6D6563FD00B190C9F85C87C5E38A18E613EC606121A5D218843DED26773CB15136B59C5796C3DA5D4770743F5FBB6E012B36EC62FDDEA35C33633853CBB35838A182748F8056240FFB6073377B1B7A8888D94541E689FB4C15331AA73C5767CED8620A33F4447D42E795DD0DD43674D3153668EE8971B0BE959E601F31D3E5410BE794CC4C3F63CA0BC84933C8F6D94CAAC8A6B2240BC7162C14C1F470B08496091ABBEAFBF9C3937B39DC1AC67234662CAC61EACCB10CCBF731BED0C792EA3CBC32684EEA20A6F2ADA6F2940F7512A6364AEF901487C4207380F8DA7F23BEFD2ED735E22C6E5AE5BB30E67F0F2567F4B90769D970E76A01B7854DBEBB7C078F6C6EE0F27913B9A0A648AAA3894D134A632874871D6A7B22ECEF8D1376C402DD7D890699AF9CC591383B873A06E62EC7102D16C269D8CBE1C30DC4234102F17EE2E120038E418FAF90605A29961648A4794CDE5D6071F3E41C0A3C31544DC1D0BC7446743635F7B07CDB61AA8665F3E98BA793A65B44E351F27C06217442A6437E513E7F7E7E27B58D1DDC306F1CB347E690EE111AA442AED32379CBE91E4D1AA58A16FC97F6B4D2D33640558E8D6345319C38A6307045A533AA53D71DE70FCF6F6757733F372F988A6599042351B2337D3CFDEA5EC2C120EF9A50C0B491F9CC195D86CF10B436712BAE13CAAA1D6DFCF0B19DB48685C1208445F389A331CC30B971C1486EBD681C9A1996E02A3C62510C229642E780C9C1967EDAFB061818084B100FF87CE465FB18939F85DF2B0AA371B90A911DE08A228D07C26614BFC783138F108ED9BCB8BD9FBFAEDC415A410157DE742139E90A63867958505940AE57979DED6E7AE30C12CE27796C8622E8D4DEA57744049DBC55A7EF08D1BFBD0BA7E7406A779FEA5E7A1A5AE5253292563286A7FAA9D3DB4FA639C432D835FCBCEFD5437CE58157C113E09B379DCF884C11BDB90C32B154B6559581B8C2FAC630077A84FB8AC877B8CB51D169265E4C378A3E45DAE3B5B98A37CB5DBCE95D25E0571EC7CD560FEE377B5DA4EDD878CC20FECE23D4D6EE271AECC71B0F4AFFBD1E239B604629713DC395B694DAC336B9D16E3E7A5E018BAB33F0383174CD902245225ABE6B631B475BDBB960D22899571D0845B87CD638F6B7B4F2FC8E064616A5130C4679EF828954E679F02B96549CD3FD016A5B43FC7DCD2E164FA96478718EF4F07BFED53AD22C8B09855E29D4A4C6632852AE53A725285AF11D7637F7F397976AC9C9CA627C45812C806DDEDF42381C65414D21D3CAFCCA875F6A0000200049444154D4146532B62C0F552810A1CB083A62DA3CB1B589FF79760F41D1FD27F929315735CF8C73614D163FF9E07CC9F397D90E6187620B7D0C370A8F0B072BD1D7628A5597A06288261221702464EAA2529343C4FB62D2198819BCB2A389FDF50D4C1F3B9AD1A5D982C7C18A4D4D6CACEF66CA82998C189EC398021FF347E54870D6456BBE6884392169F6A60F404A3B0C01744AC3F4CE28121EBF550767A099C8DD95A9DDFD5BD94BF3A0F80BD0465D25E549CFE9964031F19E09AD88DD1D41EE786E272FECEB65CEB8E15C3E6F1C99822B6B09BA9410CB51080B011A47A73B62B3BFBD8FDA6E8BB8E6435544AF9BCB99960D0909E0948BD6415A20C7EE47EC7AAC16741C4E8F81AC8BF927D94EFCE1A9922AF2F0426744008CA390AEC49990A7D077643FAB366C23DAD7836E866857B308665660EA4238CAA5A7C989C7B1B961B8CDD563D2C9D54CC92BD6849091F85B35888A3CAEAA60A4A511B5BCF4471D3C5E0D5553C9F4E86479E368B649567AA6E4302B9AC3917E87BB5EDCCF337B3AE9300DD20CB7655B48720A10152DDD3E254A45BACD6D978E47D38504A949D4D4D8D1D84F6B4F98E2D20AB6377473A4AD13D37298515DCEC8C2743A5B1A29CA30185F9EED1E5351082B69DCF55C2D2B76B611C64758E42824BFC3BD3F81BA996A844F2CA9E2BDF3CA5D0EB5E2A7BD3F427A204D4E2A829E18B54C99BD127C7291AF76A406B7C0F0B8D431C112A93085159B0EF3D8C626BAA37EE296894F084759114A0AB3587AF1F9A4E767621831DE35AE8011593E3C862205934EE66B79B69EFB21804E6D24DF511174F296C37764415C986D9E9BCDFFE9DE7356341CBC9014FA0CB26D4251A90B9A5CFAFDA7D8DB1163FEC4726E3C7F02E542F75D2C7E85672171745100D20CA923BDAEB18FFAEE103D118798EA939AC2C20249B6054B6C160B5797EA762CCE1D146527E3DF63B07B2C8F9DA05BC976E6C4F84ADEDDA920F9B5C0ADCADCB1BC3347654C86C38C620F3BB7EEE4E9B55B88F77649879596CCD144FD0538F2DE124D2662668846B9E7DD65142903EE1D081B2BAF079F306E151D78BAA01F0A4710074315943701B6A02B068E6A6328BA04660C1D5DD389695E7EFCEC3E7EBBA681A8A6BB4A4A22272CD6F6B2A53E21391A47D2F41EFCF044F2552104EB8AFD47F1B0E7681F754D1D8C18399CF4DC6C29AFDAD3D24A5D7B3799012F3347E6C922A5AB8C67D318D4F9C6BD6BD9DBEF47F3A4C973298EF826458DC1062BCEE4020FFFEF9A198CCAB5D17583C35D2A3F796015F9F9994CAB1AC6F8E24C86650A8EB7489988DCB9473E070290AD81303ED5D5CF8E2906CBB7B670DFAA8344A30AC2E550083269AAC9D20B6670C1D29968911E46E76BCCAF2A244D17CE07EE126D08A0CF0D7EBC95A3BE23013ABEED37986BBE7A56DCBF4F36985AF9628CA5BF41C9283FEBCD2C2766FA5C80164B5E1109FF78C50EFE7B85D054B09834A6882F5C3D9780EA6A31A8426847A2AAE0442B44342FDDD138477B821CEA8AD2167288383A9668C490FA0D83531183EE72702A24991E49C2EF2007E7E3B44037BF795CBC6910501FB3FF4E08F9C8E388285E38975AE4191A17946A940614D6ACDFC1332FBD2AC5FC4504DA523417E704654121D0A3A0C5C3FCED8A5274332A2DAD36B705D9D212625A4511938BBC147A44BC2D96F526AA21C0589334324DF5A0796C74250D29DA6608FB409D305EBEF5C45EEEDBD28EA28B494380931B891E97DE76530B7A2CC27D375452E2890B0F1239430989D2B8E1A52B14A7F650832C3C8AF1280C2894161753989381CF11EC89648C6C115132F8FB9666EE5F7B884E4B70B53D9229A1D9624524581C312695A6F3B9774F664C81876D47BAF8CBCA5DBC7A6440AAFC79549B456372B9EDFAA99236D71F5359B7A785BD4DFDB4076DB29508375E38950C8F28FEA9BC54DBC3EF9FDD4D5F5095FA2E79393E162D9ECC94A955F8D52863727D4C2DCF255DF88539A2BE212E36B9DA7A2B7092FABE4311746A63F58E0468612E2B5C57ACA32F20F2D2677D13BCE3A219E8D3BF22859594AC9167FD1489B0D1D581932FB72515CE1EDF58C7832FEFA739AC525494CF799545E405340A33D3F07B451E5380AF800F055B1380ACD21D3269E9138A78367D518B7E11652584E8E57906119B4F88AA05409F84AF775CA73D11469F346F9DA0FC258491E4491272CAEE2464519CA631BF340D3D1E65C5CB5B7876CD3ACC8101C29E2C7A8AA6268A820298937DE3AAA03AF0E9C9B9E4F80DEA7BC2BCD2D0CBBE9E18C3FC1E2616A5B16C7436E3730C8A7D22B72CF2B57EBA438E144DB2359B989A260B80938B3DA4193AAAE6E53F56ECE7771B9A712495528094183F916A107F89EB762DA14A7D0EBF7E572901CD211A17CD1E96648EC8A2AE2AF8E85E4C61AF251CC0FD0A9A484158368EAA21F487064261390C1E7F169B5B4DEE5973504E9E8E88DC45FED889E3885CB4580D1065CAF04CC60F2F62F5F6831C6A17FB098A1F98164C2A54F8DDAD33885926AF1EEEE1CE277772B0DDC4527D646A11DE3DAB9205E3F2C9F2C0C6035DFC6D733326E9548ECC64D6CC7154550C23DB30A9CED1A9CA4F27DD10ADF762B5F6BA769473F26C0F01746AC3FACE046871EF5614C18F16407DCE3691DFADB9C12D1EA6159C3D86C7A0303A19C8897CA8284E25E3B0B547BAF9DC9FD7B1B7A51F5F9A972BE78E65D6E852B2035E3CAA852D8A44B2582872D4C95672C1A5D6B045AAE384944432E9EDE61D9331B004E76301F16BA87BAF1BD4443130E1EC21AF3BA1017DBCC894B0EB1201AE9B00478D3BF25A1F79660D2B5F5E4FD849235A301AD3275AB593A98D44449B3CA7084745514C74094AB1204935702B66A14EBEB47024378ECD96D6547511953FBF7A941DAD3199EEE9366D0CC7E2F6EBA67181D087F6387CEFF97DFC6A6D2B66427848E6BCDD3CD0B19C304E0CC30AF3AD459514A42B1C68EA40B51DE65764135005DF435C86681CB2E404105704DF5A90EF2CDA6206AF369AACDFD784C7D018969FCBB3DBEAE9890B0EBB2601DD4D1CB94C0D4D5A6AB98029FE3BD68494982CC43EA3B21C7EFD91D972E2F8C3CAFD3CB4B10D5BF54A9689E81ED4E241AA720DC60ECF278443766139E3C6955298E3274B8B5396E3A7BA2040814CBDB88EEC82F5214B828E98E8CFDEE37CB2F76F08A05343A5772E408BF7B57E25B1A7DF7F760C664F319E4A7A09DAE86BD0C77FD0A5E1C997FCEC6EC7F2C489B484789D43A6C5AA836DFC7D733D2FEC6E2564AB8CA8C863D2F062C616E75051E095CD0AB2FC2F8B72E2D51B649825C133F912BA12A0C9A8DDFD3B193D275CA6A573B72B24F446EFAE5BB4728125A91572D29AA23CBD0B82966D72EFDF9EE5C557B713CDAA20965526B5AF4FD85E97E23E36750DAA6A0A7B9A7E3E35B3840F4CCAC2346D9E3C12E4AEF54DB4C404854E3ACBCA22E5C46C9B5BE7D7505D94C15D6B0FF0D8AEDE04C73C419191E74B8C91046B1182C7A9CED2C9F4281CEDE8265DD3B86E5C0E73CBBDA489DCBE6AB85DE58A22036FDD8EC963ACAA1BE0DE2DFD34F40BB08DA31BC2515C914D311298ED845C68623674D34F8A9B6E11558664DA494CB4D24B50919CEE5B6697E231749EDBD9C6B6237D325217CB2D2B1E45D72C0A32BD9C377638D3A68EA17098900A35199EA95095EBA338C38F5F7F2DBFF95851E1EC3EC02739DA1040A736C4EF688076822DC437FC80F8EE3F21D21EE76C33D2D14AE7635CF04B372FFD4FD844E55ED0ED9AFAA3BC72A89D5F3EB7978DF59D6478BC9415E673D99C6ACAF3B2C8F31B3267E936C02473ACAFAFD00F8A9BDDC0F5358A652E5E253C0693E09EC88D1C67D489A324402D21D2EF8275721B4CBB3B9EB7B66C9BDFDEF70F5EAE6DC4CCAF266E641D97C23BF6E1C1087D62A63ED147E99E2432C08D130BF8C49C323AFA42FC6A7D13AB1A22C445FA22999B7104788629CF36C8494BA3AE2B4297C0D2E48A4102B2E0AF25E7AC44342DA9273109D46267BFE2704985C10D13F3C822445B44677D53AF34899D9067303ADF900C9A27F60EF0A76DFD745BE2DF9614E777437E573A5644FA72D844ADE1585F51621CA59F43625A4C5C9334E1722C32B430AA6A108C2239CD8E6D636830B22C8BCA91C58CAE2CA6B424879C804A40B1284833985C964196474BF262FED708F343009D1A48BCA3015A1A69069BB00EFC9DF8965FE2F49D3D8BACD70DAF28CE154E43CD1D833EF5F328E75CF43F69122AA854710EB60DD0D617A1351467435D072B763648C3509FE1252DDDCBB0EC348A7202146405282BC8425745AE34017449C3D1632965F7D8B2A162502419883631A3F1E7F8E35D3C31EA77123864C4EC724D8E83B350AB4BFC549CE38446C6041089F1932C0C79009BE756ADA525A262F9B2254809B6810BED8949258995493A59E2E7C9CE4B37E214A4064B6A550CCFD088991607FB1DFAE309EC4D9C4B90142CC1F1156A88526E5314C404748AF4C2F1CECBE48426D4E9A45D97B85E995E71ADA544AE789861511550284C536818B0D8D32BEA9FC262CB6464965772940FF798D4851462028005BF5D887927274BD16E243D055D435A29C1EA0EEAB1BFE5E429CF271644E25BB1F0192AB99959E4650618599E4F69491E693E8F6C7F0F786DF2B2FC146779A54468815FC3A722E975018FB04E73574567E288921ABC9C7AAF21804E6D04DFD9009D1C837898F8E69F13DFFCDF08C3D973BAA9064A7A29FAE48FA14F3D87F9EF647E22F1A225B156D83BF5454C56EE6FE7E57D4DBC7AB0833D4D4182111BC3D0D07D3A395969927D20013A918E108713AD2D2E68BB9B649008A8B51D2EF0EFE08B590F5365EF256CE92CEDBA936E2B4D5E45F233C9683919272763E7C1491141B2139B889F05DB4D80A3E5C4B96C5A19934797A32B22FF291201EE5E492A4572A290E792AA6BC92B4C80996B9AE2325964938F9B6291FA2512DC0400BB91B1C8F10A3D1301B871D13822D3406E94ECA6710605CFC9F191054357E3C2E594BB1387885A85B9AA6EBBCC0E29572A24525553E0289663B8632C9833096D8D586212702738C16116809FE430278E993C76C22DE518688B2F58B1C8C90E503AAC8874BF419A17B94AD245D38F62519CA35390E1931D94E9BA60B124925B623C4E103C7AB384D5B97B5386003AB5B1FDD70068F9D2DA44EF9F8DDDBE3DB59139C3BD04481BE7FF04ADF232295F7AB6373766158821F29DE2E5B66405DEC56B0122AA9070A7251C67D59E4656ED6E626FF3004D5DFD0C44E238B228E482B0CC838A3A9BEA46A14923EE2408E66B7DFC34EF4EE67977CA1F0985B5C7C3F3F88F9E0F21F806F2B3C97487B48B7217EF026865DC294E25FF08817B910756E4D25FF8FF698235615B7CE0C209D494E5488A9CD09493544089D1C7F3A4121A251E27D20F12705C6790E426582BF26A1202F92E8F595C872D8B80627F01D0925F2D8B716E87A2EB66ED46ED525AFF58E2DC1D4B39A5481D6B710DEED8B9B9E204584BE016002D605A3407895A847B9D72A2905720181F6EB47CFC04AA7B4F897B914D408955CBF1C9CFDD475CA725CF6B4BA716C7114A243601CD20434CBC3E4DF2AD856FA084643131C9F11F5C5F48145C4FD08C3D6995E06C3FB2271C6F08A0531BDE7F1D8016E9436134BBE72F38C1E604952AB5413AEDBD743F5AD565E8533E235BC4153DE04A979E35A10C1798DC629B28048AB84E808D6B3C2A5F4CA1D0868268DBE989DA74F447E80D9928826A702CA79C04D004208ACF5911887693D6B38BC2DD3F23D0B951024372B38D4CBAC67E9C9E9A8FA37A335165C12B015C09F84970014EB8DD2458BBD8EB829EAA3804445E54152C08F77E04582663E82458CADF25532E890B3996914844FEC7FCC513FF76FF72514F46D072C044A12DB9424870B49379F564149E484027825E773293BF4BD8DF0E5A7D24AF4174F3090075F984EEA4E0AE5092D1BDDBAA2E521C6E047EEC72DC887FD00FA4A8913CDF71F094BF561DA9E1E15515C95B1634BF0C8F815F97EE88C70EE84273227F7D02FEBEBE187CDACFF7197C7008A0531BBC7F298096AF8E1924F6C40DD80D2F9EB34696930DBD225C98ABDF835E733D4A76154A7A596ADFD05BD86B70F34812CC8EBD9BC9B6EE24C56E70C13E991F112F756C00A7FF28D6E127A4F8D49B6D6AC95C8C853F411D2678CB2772AA8F058A83EB7BAF39E071B878839D5E7B11830027195F9F78EF83412D71DC934C8A278B1B8F657812BF749B24075DDBF165CA2016CCB1B03771A583417070C224F9EBD74A779EB84F72184FBCEDE43113CC9CC4BCE3AE33DCEB9314C91312FEC78BC1C99F9FCBEEC0377B5606FF7E08A0531BAD7F39809620DD7F14F385CF611D7E32B5513A8B7B295278E95234D1E4925DFD4F310348468D6E92F5D8EBFCBABB72C21DC477FD1167DF23D8ED5B53BB6B45C558F07DF4C99F76696C12CF12803128FA3BE5C14EB9BA3E19609FC9523CC5E3BDD16E8327A093D8CAA43EC5B8D3CAB1FD4F2264754286E558642C47F778F35062F5343861F2465F9ADB8872266398DA2391CA5E43009DCA28BD83E44653BBDDC45EA230D3B08AE8DF2F3FEBD2A4295D87607C94CC412D5B885A3453B23F8410D3B9DA8E4764C948EDC497546868DBCDEBB18FBE407CE7DD6F7965A18DBA127DEE7FA266559EF5F4CDC9A3C8D31DA9D742E85906AB5321742A1E6129CE1F8366D8B33B34A73BA4A7F9B921804E6DE0FE252368198744BAB0F63D2C41C9AA7B4A0AF4FCD337CD8B923902357F028A2FD73DBDC85B8FBD113577EC391364B2F63D84D3B91327DCE946BCE14EECF66D38FDF5098EEF5B1C094F065AE902B45157A38DBE4EB62E27530F291D2965704AE968A9EF94F2798FEF783C33742A707F83387A505A69F05E838F3438F374F21B1994BE4970CEFFAF44C5A90FFC90607FAA63F52F0BD02E3259523BDADCF853ACFD8F9C5567F054BF80D7EDA7EAAEBE477A99747351726BE41F35BBF2F40C6CC53DF61DC16EDF21EFD56ED980DDB60527DC7ED69B770473C5B3E47F50472C3BEDDB1FFAE0BFC6080C45D0A97DCFFFDA002D41DA96AC8ED88A0FB985C3FF2B9BD075105AC8423E53F7CBBFD5FC4912B41105C761534E79A52212B69BD7E2F4D563F71C74279E7848AE1284F38C6BB1716E3625B302DF07F79E9B830F1DF51D330243009DDA573904D089718ABFFA23E21B7F8213EB4B6DE4FE37F63AE696224AF66FA0F9215B82651FE03905E3530D81EFD6032819679FA5F2BF31E443E73C37233004D0A98DEB1040BF669CE23BEE26FEF23771A23DA98DE0D05EAF1F01D5409F702BC6C21F82E61B1AA1A11178DD080C01746A0FC510409F649CEC96F5C41E7D979B0E18DA4E6B04145F0EFA8CAFA24FFC1818C2B6EA9FBF59B643DC168D1DAA94003D934D3492C4E289261551CBD514A96732B49DDE080C01746AE33604D0271B27A125BDE107D81D3BB17BF6E3F4EC97EDC843DB5B1B0125AB1263C10FD0AA2E3FF6C14387EBC98AB69ED095F86647D5F38713C82B427B0340EC0BC739DA1922337494EC78171E3B422866138C5964FB7514C34B9BA78C3E238FD2FFDFDE79874759657FFC3BBD646632994C7A01124A48082194109080D2150404042C14CBEAAA587077ADBBBABA826B57102B82B00A48D31510842010405A2091165A422009E965D22799F27BEE1D3229A4CC40767F3BCEB9CFC31F64EEFBBEF77ECEE4FBDE9C7BCEB9DE4AE855D2361FCBC2B8AF96D5A0C4500DAFFA0278D7E5C164AA4769553D98E8B32066AD4202B15C8962893F2A255A786A5408D0CADB15EDBCB25A949596C2B7F68AFDD9F54229AA852A54893D11E4EB05AD87C491E871FEE2C92BAD41655909BC4C8590F0D2A6B65629D2A0D623005DFD34908AED074CF2CFCE67E6C2B3361712763C582BAD9E9D1A2E54A256A28140AE81BF56CED3C83B3B7C9A04BAA36FBDED7312E8F638996A60CEDA03D3E185B0E4273B46947A351290282119F81788E35EE43FAB335B7170E90BF0339CB295D874B05D89B80FEA4193D12F4405590BC13199ADC828A8C4F9F42C18D20EA07BE15E04D4654165A96876F71AA102E9CABEC854F482266A38A68CECDFE6D37F39958FA28C53C0A523E85A9386D09AF3FCF4F096AD4AA842A6220279F2AE30870CC49851B7C0DBD3A3CDFBAE4ABA0C8F946F106DD867EF532354C220D1A350160CF49D8C4923A2F98ABFA3565A69C4D65D87E075612B826B2F4261A9B65F522809C0C9C049881E320203BA6979E53BD6D8BB65C7D2D711547A1C326BEB61A546811CE5622D0CF24094EAA2A1098F41CFB01084F9A9788A7967351268C748924077C4C96AE6F53B4C47DEB41D9FF51F8C80E86828AEF4B940E10D51C47D1047CD83C03B920F3DCF6084E4E33110189D731D6DF2BA1FE74326E391E18108F751345BCD5DB86AC06F4989D067EF4158D549A8CCED6FF2D60AE4C8D4F483E8AE45181C76EDD4962660734B6B70F8EB7FA24BED3904D56640CC0AF577D0D8AA334F1A8A8C417FC290C1B1F0F7644767356F6C85FFF9F65398716201D4E6EB2B2AB2B322777A4EC1A8079E819F57DB22DF70D7E2A2221CFEFA6D0C2EDFD5E2741C7698B70807D4637038F47E4C1E188CF8300DBFACB0A20E82256321ACED78239C15912A11FBE0AA220CF921A33164D46884FAA83B42E1F0E724D08EA12281768093B5B694AFA0CDA757C29CFEC38D257338F09CDF4B17A1361CA2B89720EA320602A5AF7D5A978A6AA0F97C9CD302BDD1EB7EFCAABD1DB3E2FC30BAB797DDD551536F41C6A144089396426FBCCA8BE13BD2D89FF04B23BFC0D8984024F4D4DAFDD317F3CA71E8781AC61C7E1A925656CC1DDD3B4D198B63114F60FAAD7D10A86DEE42C929356243E231CC38FD17C82CAD1F1E512AF2C6D6B88F317B4418BC942D4E9469F27096CC62C8BA00C3F2475A157B765CD651D52DD8E03517A3FA06E2DEC17EFCEA1BE1CF84BA48E2879CB8673068F8ADD028DA1E57477C9A7E4E02ED182D1268C738D9925A6A8AF83FD389CF613EBD0230B7EEC773F496BFB77E028907C403FFCCB30979981D3F84B5B1B5148862B10F1235139121EBD92E0A83480B9354831903FD3026D226D0C51546ECDAB50FFD2E7E05EFF2F3CD56917BD4E391EC3194FB724D1041CC4E3C178830B16C3D226A4FA15628C7AB418BE1A5D5E0EE81BE18D855836DC7B3E199BC0CFE4547A133E6DAC7735AD10FEC7E9542352FEBDA508E55663522ACF63CA694ADB6F735438412890F4E77BB0FA3A7CD8246D1180A995D5A8B4D89C7703717689B7B81CD3B47DA0509153BF9FF59E1A3D7821743E71F88BF4DECDAA6CF9DFDD2AEFD2111779E64AE232B7E55DDC67DCA31D547B82BA641A0D77BCDC56DD101981DEFDFAA40B7E42FB318799D0FEFFA224C2B5D05B5A571A57D41D51FFB42E6213CA217EE8ABDF9B20424D08EFDF693403BC6A9792F530D2C3907507FE0A5FF5A7DE91B19E67FF31A61403C24C31642E837B0CD14F596029D2F0904735F9C91F7ED70A8CC8FFADCF850F4F453C26CB62231E512EAF6AFC42D255B9A89F3173ECFE2A22C02CCB7CB1ADB57948A84A8B758A1AC37A0A7F10C2697ADC622FFB721947BE0AE583D8234429CDDBB0D83339743632AB18FA54E20E52F90ED9E77D9CF6254B033A57855552B826AD331B5601982EB9A9F1C5F2CF5C78E5BBEC41F4704DA45B635813EA388C125594F4C285B6F7FE62B811FC1ACF6C5A3C383B8CFBDB57631BF0A9BBFDF8CB957DFE61F3386CCE73EA2FC67EE5B7654A09BF2679B89CCBDCF8ECE62FB03D1352978A8E843FBE3D94A7AA9DF8BB8AAE983CF67F7EAD05E1D752081EE8890ED731268C738B5DA8B1519321D5E04135F4DDB0E0875AF2600441288639FE22B6781EC7A9F6E531E6D09F4798F180C0BF744400BB740D36BBBFB2810EEABE41B55ECC081CFD6ECC4942B1F40672EB2773309C4F86BE0125489D43C9A22CC478101A16AF86924A8309A7128C380ABA5B5A8AFAD42B54506854C8229B17AD4D75643B3E72D44571EB66F5E32713EE431025BB577A346A4844A2A420F3F056EEFE3CD43EC58D8DD85DC4A9C3B9284D1856B115A77C93E0EF67278ABC797B86B803F6E8BF0E23F6F4BA0D3E47D31D1B0DEBEAADEE639153BB49331384C87C76E0B6A35A263E5AE73084E5E82D8AA5FED02ED61A9C0AD3721D07D823C302AC20B4595F53C9C30EBEC09DC9BF697662FBF75BA0770C0E356AC7A38FAA6A33A48A01D530A1268C738B5D9CB5A990373DAB7305FDEC153C6D941B53CB5FAF7DC58BD105D044F4117068F80B8EF23FC40828E5A7B02FDCCA860C4863AB609F5536A1EAAF72EC7C8E20D4D56BB32EC578FC216ED0C683C9898DBC4B4A79FA2D9B0982F78EB89627E502C2B783F2E4A07D1A58350EE5F0C7DDD55DE97B91AD8EA7699FE2928140A84EAE4981AAB474F7F8F66F1D4CCDD71E862092EEF5A8DA1F91BEC1B94B54205FE11F43EC24303F05042203FE5A42D81FE453D01B71B3622CC6873D3303FF412FF9720D387E0A9512108D2367713B150BDE5EB133137E79F3C72833DEBDFDA7BA033156278C5CE1B5E410F09D360F6107F782A6CA7FFD4E45F42D6E78F416F2AB0F3DBAF1A8DEFBDEEC59B3322E1EFD976986247DF037EFF9A1AAC5A95823F3E7694775FBD7A14A64FEB0589A4737CDC8E8CC115FA904077A2952CC5A7613EBB9657C863F530D80AFB77D54452B05A1BAC0E8864E45208A48E096A0383CE12E867971DC0F3597F6AB69197A28CC78F5E335129F7C313B705A37F68EBEE8186B1B07866A3C9761C57F5B67721485E6B375595508D0FFDFF863C712017F0FBE3FDDB4C74A93359F06372367CF6BD8DA88A43EC5447D40964F8D26701323CA23131468FA9B13EC829BBDE07CD5E02ABF44F20BE722FC618FE0D0F8B2DBAE5B06A3836783F88F89E7AFC2121D03E2E16FBFCD1D6B318F9DB2BE85297CE7F7E5C19CF5F4A432B7F41424562A7097459411E5296BF8A986A9B80B296AA8CC35ADD83981C1F8E097DBD6FEAAB4D02ED183E1268C73839D58B9D7BC80A2F99CEFC0B5656AC88152A72F126F0898128E4560883D9BF040824ED0B606BD36D4FA01F1A16803E81CDC3CB989B4229634761358FBFFDE0D335989BFB8EFD116CC5FB8DF7A348560E45989F075E696783ADE5B8AE9619B940EBD236DA3FCA90F5C227BE7F419D508E3BFA78DBA320DA32E1EED3F928DFB302830A37436EA9814920C166ED0CECD38C45422F3DEE89F3454955FD759B844CA057FA3C8900731EA6172D47B031833FC220F2C23BFE6FA0778F103C39B2B1A6C9A5A26AACDBB20F0F5DFA2B77C5B0D573A27A029234E331CEF0038675A24057E667E1DCB23FA39BF1827DDA49EAB1F8413B0B63FB0674C8A4A3AF3B097447846C9F93403BC6C9F95EA66A58F28EF2D29E96AB0760C9DE0FABB1D4F9FBFC3F5F2150FA4018780B449173210ABDEDA66A6BB414E832910E3F7B4EC119652C220294D0B5082D1388C4080BF641BFAE5ECD328D535614000018B149444154E27E78F7650C2FDF6627C3922B56EA1FC329457FCC1FC9E27E3D1DA6969653C105BADB95CDF66B0EA846F28D37AB58863BFB7A63DA80C650C1D66E7CEC5219D2776F40FC956FA0B294DBE29055A3B0D96B167A87EA704F9C1F3F65A66514071768DFA721170B3035FF0B44571E811066B0B8EAF55EF36089BA1D4F8DE96A7FE47707B3E0F9EB12C41912F9CF7224A1D8A09B831C59379B4097778E8B83B96E8A2F9F43EDD70F43696974D7ADD13D8C43AA044C1BE08F293719C94102EDD8579404DA314E37DECB6C84B5221B564306ACA61AA09E09F76198D3BE81B5AE79B6DB8D3FA4F3AE64BE65E657E6E54CE53AB0D03996B2CD6A3D4374737EC79602CD36F58AC5BE2817B15864C1751B4F15224F9CF31D8DA8F8040CEEEEC5A331583BB8682E7AD59EB44F3A57128CF5BAB9B828EB85A5F745D8FDA88E50399651C2053A2A7FBBBDFB6A2E44C3E1AD9261D6205F0C096F5FF02F1454E3D09EBDB8E5EC07D09A8AF849E1A714B158A97F027EDE6ADC3FD81F5AA5A855815EE5FB34A2BAE8A02E3A8D11E73FE469DBEC2F824BB21ED81FFE38C60E1F80C86B7F59FCB8760D62CE7DC1639FD9EA394935063B3577422E93624CE9460C2EDD71C32E0E1631323652875A9305E72FE5A14FD60674496FF4F15F968563ADEE21E44842F0F74961E8EEDBDCB7EF08EBA67D48A01D234602ED18A7CEEBC5E2A98D06580D9760C93F064BD62E5872F6DB4F37E9BC07397727A1771F08BB8E85387236A0F4B3F997859DBB61E36CA2044FDCD04E87A8CF38CC880B828FDA369E33AF4F84BFC9B6A1C7DA39791FB0641626D45FCEE905A5B49D52AC2DB01CB958CC05BA6FE1CFF64F3EF57D1E698A6874F5566076BC1F7AF9B75FEC29D760C44F49BF21E1B7D7A0AFCBE5029B268FC6329F67E0A154F2CDB7602F699B023D2E360825A5E5884A7E13BDAA52F969E02C1264B7D714486F9983E9037CF90A3CFBCBC7A1CA39C237130BC57EDCCF9D270902D34AB6613AA0D8B9303BF617CC2ECD44B048120F99107E0A337415E98828DE037FE365EEAE6968EB74F370C86338EA0552AC7CB0F74D178A228176ECF79304DA314EFF815E565B46A2B90E96A2933067ED8535FF082C45A7612DCFFC0F3CAFC52DD90100BEFD210A1D0551F72910A8436C2BE4FF6079506705BA214E57DA7D08EE8BF747E0B588868BAF8D6D165EC7123E98406749BBE18B3911372DD05FEBE723C5231E11FE4ACC19128010DDF5A9DB4D695E2EAEC59EA443B8E5D45BD0D5E7F31574B2C72D60A22653D8043A54276B53A06FEF1F0C9D4288EC7D9B303A7BD9B5CD4F014E7A0CC2B1FE2FE39E41BEA8349AA15AF3006425369FF0554908DEF37F0D66910C7E0A2B4614AE775AA0D98B84F9CB994B8635E6E967BE6D96D8C35E020D8D25F92CD7CFC709C54048C5222C9F1771D3DF4F1268C71092403BC6E9BFDACB929D0473DE11A0240D968254582AB23AE5F942EF4808BC7A40DCE76108030677CA3D9DB9494B812E11EBF1A3E74C1CF318C2DD1B2D4BF188AC661E151115AAC37D83FDECA15D4717DD8BF0DAB3F647174802C0B2E6CECB23F1F99CDE4E097472BA6D05DDA7A07105CDA222767A4E4254A00AF386FA77185296965B8594DD3F63C8C54FE0692AE1598B873D12B0D16B36E44A0FDC1FEFD7A1402774F7C4F25FCEE3FE944721BF56F8E8A4A23FD687FE19B3E2FC915F548ABE7B16C0BBC656092F4BDA15EFF8FF036291087E4A0B12F29D17E8B66CC75E306C0ECC05C53228F7AAC6E1B07A38CC120FF8AA25786B5AB833666FB52F09B4630849A01DE344BD3A81409B511CCA18EED36C88C16DF9A861DD3D798C7443C9CBED6F3D83B8AAA4C6151E8458A17F12BF29073ABD823E9D5DCE053A3C6B8BFD7E29CAC158E3FD07E8759EB82FDE0FD141ED47AC24A515A264CF2A0CCAFF9EC7263337C05AEF87705439147E1A195F41EB55E27657D07744EB702ABB02A1DFDC09519D2DDCEEA2AC37BED1FF1152AD2F220DBF6254EE2AEE7FB66D428EC446DD3C0CECA286B7CC0C6DCAD74EAFA0596A3AF3F3570B9B47CFE48B0371411E89C3AA04B0841DC63D4023C59CA1FEFCA5D51965B049A01DFB852281768C13F5EA04029D1507FDF5E20F31A96855B311FDDBEB1EEC538DC6C773FB3AB58266892B55DBDE85FE6C63981D8B8EF8C0FF555EE3994560C475B355836BADD59BADD872F40A3CF7BD87E8CA8360AB7EA350CE57B7F9E2009EE4C256D09E8AB63709998B8309342B075AFCDE4428ABF3F8A3988FF827ED349C500EC2F4929588AD3EC4EFCFE2AC3FF17D0E59CA081E8FAC1699519FF485D302CD7CFC3F6A67F2BA254D1BAB3362821816A188676E0678CA3073A02F58B6617B35B99DF98A90403B468B04DA314ED4AB1308749640BFFDAF5D9891B1101A73E3B164D9D2AED8EC390393A6DC81E890B605B5E534AAEBCC28D9BE14D263DF72DF2B6B4C0057E8E7E38A672C26F5F7E31989AD3596EE7D2EB71267F6ED40F485E57C839035B6C1F762D0A75CE00677D370F70C7B4E6B61762C8AA341A059ADEB759F2DC6C8ABABB86B87B919CEC9A2902E8F405CD53EF8D6DBEE9FAA1CC4135C82F52A5E08E972BE01757B9D17E8A6B538FC3552BE19DAB4DE365B392BA54244F87BA0A7BF1252AA07DD09BF05CEDD8204DA395ED4FB26087496406F3C9809E9C12F704B5963681C1BD679791476F57E112F4CEEDDE64AAFCA68464A463182F54A74F5B1B92E4EEFDE02D9FE8FA1ABB7657EB2CD33B6E1B8CEFB21C4F48FC1CCC18DD97C4DA75F60A8C5FE7D071172F22B84D5A4D937D65826E28BC19FF00DB53B63BC79F5B7B652BD5B0AF4A24DA770D7E917E057DF18A5D2F4994CB417F9BF89324530CF729C31D0173B4FE4DEB440B74CF5BE09333B7429ADA01DC244892A8E61A25E9D41A0B3043AB7AC16ABD76DC1AC9C0FA1B0366669B24DADCFFC5F44BFB8384C1A1074DD908FA697E0646631B417B6C210311953E242789D8CCD072F40BF67217AD69CB48B2CF323335FB479E8C3B863D8F5C58158AAF885F3E9C8FFE96344180E354B3B672E8355FAC7D14527E7197751811E0E0BF496947C54EEFD0A634B1A63909B4E8455EAFBD4F72F50AB5578747820BFF78EDFDC53A0338FE663D93BC770BE85A5C57231A6BE3416D33B0A363118B0F5BB935899D85856F5AD1563D0CDA3A3F0520B3233B3F0F1375578F0A9484436F983EDC4D73BF0C64FED1FF220556AF1E8BB4391A0EFF8B78A56D01D33A21E9D44A02D813EA78CC1A8DE5E3CD2A1B5D6C3578960AFC6CFEACD16FC78E02C5447BEC2A0F2DDCD2E2994F8E357DD9DC80A198750AD185DFCD4FC6CC122430DB4977F41CFC2DDD0D417E3C3AEEFA247908EFB70F34BAB91BBF73BC45D5D0B0F73E3692F2C4331D96F32F2226620CC4F8D10BD12ACF6467E791D2E6415C133F7286EBDB4D45E898E0DA45CA8C552BF1790270DC6A0AE1A5E729495F2747405CDAAC9BDBF26090BB25FE0FEE6966DA5F71338E63118C13A055E9FD48DDFDBDD04BAB622137F1F73085B4B8DC8BC508696E7F3088402F41BD70B1FAD1CD7AA08D657D7E3B34736E29B320D6E9DD20BD3FAAA80736731FBA533903C380EA75E0B6BF71BBFEBF5B57866A710C1B70FC2BAE7BA41CDEB4B55E3E7D7F7E0B92F2EE2C4D5B6AB5AF67E7C0C563DE08F6ED13A783B90F74502DD49E243B7E998404B8166E15C6C43CD2C10F3129E2C9BB0B596E47337EAFB4EC1A47EBE50CB6D31BBC67A334E5FCAC7956DCB30BCF8876697311F729D5006E632158984B058ACBC3CA8D86CE42B5D9685F7B7A025B04A143C957B528C378A0C5558BB331513CFBDC12BC33534B6923689E4FC3E7C83CC6A85D90A98CC16882CF5CD4E47F9513B0BC714F13048BD111BCAC439080AA92DFBD1518166BFDABB4EE5A3F097551857B4A6D9BCD88A9E654C560A35E8E1ABC0AB93BAF1CFDD45A073362562F8B399C0E0FED8BC24026D2D40CB3727A2D76397A18E0EC193AF24E01F931BF6102AB072E646BC711C48393C03D55621942A295432216032A1C4500293C40BBE9AD657D0A3466D42E433133162D3A778F9B81E9B0FDD839E0A9B7D4F9CB022506F84556C81E16432E21EBE82E7BF9C8A075A943A97A8E4F052767CE66483E149A03BD615EAD149049C4D546978ECBFB5B3B0DF6B02660F0D44420FADDDBFCCDC0CE947F7C2B8F34304D465F38DB58E1AF32FB3C35E5F095A0CAB588A89D1DEFC54159B881AF1C996542CB8381F42ABE5BAB3FEDABA377BD1B01AD41FFB3C8FABD250BEB1F6CEF4EED02A6DA53B9D1168D6979D5FF8EEAA1D987FF535FBC625FBF932FD029C50C64220102236448567C7DA4ABCFEFE05DA8AEC1FF662FC82B3F826F501845D48C6B0B864844FEE8EEFBF9F709D592CC63AFCF4EA5ADCB94E8A67FE391A1FCCD0C354978337E276E0ADB42ACCDF361FEF8CECE89BD2F8B9C564C191CF7E42D9E4788C0E16E2ADC1FFC206930F528EDF7BFD4D2C16AC7EE4337C103E09475F6C2C74E5F8D39AF72481BE5172749DD304CA6BCC28FB6832A435C54E5DBB597B37F669C66174A4370F7B6B7ABAF4E18BC5D8FEEB694415EC44644D2ABC4D05FCF8A7968DC5FC321165A16F7BD5E378CC345B8D4FE9E783F17D74F6EE39A57558F7CDB74830FC0CBDB980C735B7753E215BA99789BD705A1E8B7DEA512812FB412814A2979F122F4FE8D26C082C9C6F7DE2714C3DF322AF1BCD5E14279503F0ADCFE3B8E35A985D43040573A3ACDD710C61BF7DCAE7C41ACBF8FBC8EF65644AC3E12113E381A10118126E737E269ECC43D5DE151850B40D4A4B252FB67444351CDF6BEF6D76E415CB78947E3E11B25ADBA9312C4D7C83D71C9C9347E17F7A93D05C84AF9F388CF484A17879A60A079EFF166397D461FAFD43F1DDF23EAD88A419A95B93307041019E7D7B34DE9EEA8577EFDA8A85BFE461E43B7761E3230E387FF95D2DA82A29C3D6A5C9F83C558EA5EF0F4278F96F18187304C27E3D91727C7C8B675B50FADD76043F7A05DFA5FD111303AE7D6CB6C02410F08585B3E7A293403B2515D4F96609ECDEF26F54A6A7C068B2F0F3FD1C692715B1C890F7C29D7DF598D6DF87BB431A1A5B451F4C372035B304A82A45B7F4F5F0AACBBBEEDE9542159255C3F87D2C4229BAFA78204C2FE7279E34F56FB3FB7E989805182BE0517C0E3E85C7E063CCBE6E98EC7C42162F7D54958052B11E569104DD7C943CD36E5A7F5F7BDD90860B0D3526FC7CFC0A7A64AC4775561AEA8552B04CC1E3EA04DCD5DF0FE3A3BDED616C2C1EFA6C8E01670F24C23F63339F0BCBBADCAE998272890E51412A3C3D2A180A89ED4FE5333906649F3A0ED5A5DD4059362A042AFE0262E7298EE9E3C7E3B0596363C8FC6131AA2F9FE46E1F1666B75B339E8F7F780F2D2F0CA5B956B0DF11BBDC4C1FA7A2380C065CAC9221D0478E334947F0D7F18791332E120BFE36140F0EBEBE6893D564C2DE553BF0F02639DEFDC740C48A4BF1D81B69A88C08C7B697D80BCE011783C984D2A222ECDD968D9F4F8A30677E6F0C0913E3C86B6B11FF4619864D4A40D2C6986B08EA9092528CFC82526C7D7937569C1360C3868695BD18BD033CA0EEA9825A2E4647DB8F2D999240DFCCB78CAEBD2102EB930B70B1A006D5751DBB241A1EE02113F1F303D999846DB8AAB9006D3856809CB23AF004943A33F76BB3F70013248D5CCC8FD50AD6CA30A99F1E7A55DBBF2E6C157BEA6A150E6794E37C7E0DAFE7CC0AE637D4A66E78B7B07BB0534FFC3D259810AD6FE6D6680D0EDB045CB8F5326AEA6D1B80BE6A29A6F6F741DF60765A4BF3F55546610D561FC9479EA1CEFE6C768C1713D286BA244D9F919C59819D674A70B9C476282D2B1AC542F1D8BF86C69EBFEA601E77E7B0D86C9140C0398C89D421AE9BBA5959D71B32AE83173925D04DEE19ABFB0CE7BC7DF1F5F6A998D146C679EDD56CBCFEC42F502E988CA7038AF1C6B349C8888BC3070B2210AC6A5F9C57AC3803639D19A8ADC585D3B9C8D20461648F86DDBC1AEC5B7C04EB2F8BF0E8EA795832C9F672284DCFC2276FFD8AF7D6E4A3B44A8D898F7641A3734389BBEFEE8191236FEC8003126807BF50D4ADF30830F1CB35D4A1B6DE71816685FB59324553F7466B232AAF35A1A0BC9E0B50598D893F83EDEDB14367BD144CA09998B28D21C72ADE95569B905E5083C2CA3AB0ACC1B26A5B0815BB1FBB878F5A8A102F19BC55920EC7D630DEA399155C1C1B049AA5B9B7362FC689CD23AFDCF66CF67208F751B4591B84ADBCAF14D772816652CF04BA9B5ECEC7D6B4B128942CF602339AF93D994077F196F339FDB7DA0D09B4211F5E5DB761ECA2F1F8F2317FB49E8E54839DAF6EC1A2CD22AC39743B2EAC3C84057F3D813F7C31110F4C0E477B8113977F4945DFC9FB515E757DF44C532E72B516EFFE3A174F44D97E5A9C568C038B93307F7536AC4313B06F5B3F3456F1BE39A224D037C78FAEFE1F26C0048B7DC18542F095A1B3FEBFD6A656516BE22B72994808D97F51D0FE8731DFD0D09C17E85A1C782F11E376E890B271287AB45A1EA51A89FFDC83173ECE44FFE7A660C9340196FC3511AFAC2CC1EAEF2762CAE4F68A3C95E1C0A622641973F1E97DA938DBB52B9E59D4B399D0161F48C5735FE643A80CC7A6EC0918DBA40AED63776DC18AD47A7CB4711C1EEDDF7E795A678091403B438BFA120122D029049C13E85A1CF8F4573CF7561A5EFBE17E8CEED7CA010AC55998F77436C63D158A6E56118223FD21CFBC84BF3FB9054B932C58F6FD44CC991CDEC2075C8375EBCE23C5A0C5FCFB03A03119316DFA16F49C702B1E1CA142AF18359A9691DAF2CC7798F9691E4483E2717CFF6074BF462273572AE6BE9F8B898F0FC01FC7FB40DD8929F124D09DF275A39B100122E00C016704BAE4502A1E7AEA30361FD7A3A86812B4DAA62E9B726CFEFB212CFC3C03FF5C3309838707E25A68322A2F6661D19FB7E3CD1FABE1A9EB820FF68EC6EC28158475F5D8F5F6F798F79901C366F5C2CBAF0E45A44A8C948F3662E4F1EEC8FE32069EADE44CAD9EB71A0FAF2E8464E4309CDA3E00216CC2E585F8ECF9BD7875BF0ACB360DC7841E4A34388AAA2F5FC5C7EBD3A18B8FC1C3C31CAF0FD3942309B433DF2AEA4B048840A7107058A0AD65F8EED9BD78FEA34C5CEE1B8D82DD09D0AAD8FE81199BB79CC6CC59FB20888FC486C5F19814D3BC6C2A5087D4F5C9F8D39F92B13BC7DA2CB2472291A2CFA8287CB86A3886EB01EBB163E83FF32866AE7F002FC4B69ED1BAE681D578E8DB424015802F5367E0BE50C0907A16CF3E9B84157B6A9A1C710088C44208BBFAE1C94523F1DE7447C3FAAE474B02DD295F37BA09112002CE107058A07372B070E111ACDCD5582FA3E1393D8786E295F76F439C57FB4F4EFFE9285E7AF70C52726CFDD46A298E25DFD3ECA2D3AB77E3A98FAE60F1CE7B10A5697D2B3177F31E4C78F90A4CFDC2B0F0E918DC3940CD725A7174E551BCB6341DE70DB65BCA3CA458B8F51E4C6A888376064C8BBE24D037018F2E250244E0C60830815EBD3A150B9E3DC66FF0D557233165720F4824CE460ADFD8F35DE52A126857B1148D9308FC8E08D4D6D6E2C08173F8FE87743EAB39B363111B1B4C024D2BE8DFD1B79CA642045C9480D168446E6E2ECACA6C872E04070743ABD5422C6EAC5FE2A253EBD461D30ABA5371D2CD880011708480D96C465555159850B3A652A92097CB21682B4DD4919BFE0EFB9040FF0E8D4A532202AE40C062B180FD634D24129138B76234126857F826D318890011704B0224D06E69769A34112002AE408004DA15AC4463240244C02D099040BBA5D969D2448008B80201126857B0128D91081001B7244002ED9666A749130122E00A0448A05DC14A3446224004DC920009B45B9A9D264D0488802B10208176052BD118890011704B0224D06E69769A34112002AE40E07F5EA05D01228D9108100122E02A04042515750DA7D2BBCA98699C4480081001B7204002ED1666A649120122E08A0448A05DD16A3466224004DC820009B45B989926490488802B1220817645ABD198890011700B0224D06E61669A24112002AE488004DA15AD4663260244C02D089040BB85996992448008B82201126857B41A8D99081001B7204002ED1666A649120122E08A0448A05DD16A3466224004DC820009B45B989926490488802B1220817645ABD198890011700B0224D06E61669A24112002AE488004DA15AD4663260244C02D089040BB85996992448008B82201126857B41A8D99081001B7204002ED1666A649120122E08A0448A05DD16A3466224004DC820009B45B989926490488802B1220817645ABD198890011700B0224D06E61669A24112002AE488004DA15AD4663260244C02D0808DC6296344922400488800B1220817641A3D190890011700F0224D0EE61679A251120022E488004DA058D4643260244C03D089040BB879D6996448008B82001126817341A0D99081001F7204002ED1E76A659120122E0820448A05DD0683464224004DC830009B47BD89966490488800B1220817641A3D190890011700F0224D0EE61679A251120022E488004DA058D4643260244C03D089040BB879D6996448008B82001126817341A0D99081001F7204002ED1E76A659120122E0820448A05DD0683464224004DC830009B47BD89966490488800B1220817641A3D190890011700F0224D0EE61679A251120022E488004DA058D4643260244C03D089040BB879D6996448008B82001126817341A0D99081001F7204002ED1E76A659120122E0820448A05DD0683464224004DC830009B47BD89966490488800B1220817641A3D190890011700F0224D0EE61679A251120022E488004DA058D4643260244C03D08FC1F8024C458BED69FBE0000000049454E44AE426082 WHERE `app_id` = '2';
+UPDATE  `fn_app` SET  `thumbnail` = 0x89504E470D0A1A0A0000000D49484452000001680000012C0806000000EE2C29AF0000200049444154785EECBD09985D577525BCEEF8A69A354BA5C91A6DCB039EC0536C636C631308B6434248483A2140C3FF058281907446487F49FA4F87A4D3FDFD9D4E826D861092302401023433D880C1C8181B5BB6065BF358D39BEFFC7F6B9F73DF7B552E59922D4B25F994292455BDF7EEBDFB9EBBCE3E6BAFBD8E05F3652260226022602230272360CDC9B3322765226022602260220003D06610980898089808CCD10818809EA337C69C96898089808980016833064C044C044C04E668040C40CFD11B634ECB44C044C044C000B4190326022602260273340206A0E7E88D31A76522602260226000DA8C01130113011381391A0103D073F4C698D332113011301130006DC6808980898089C01C8D8001E8397A63CC6999089808980818803663C044C044C044608E46C000F41CBD31E6B44C044C044C040C409B3160226022602230472360007A8EDE18735A26022602260206A0CD1830113011301198A31130003D476F8C392D13011301130103D0660C980898089808CCD10818809EA337C69C96898089808980016833064C044C044C04E668040C40CFD11B634ECB44C044C044C000B4190326022602260273340206A0E7E88D31A76522602260226000DA8C01130113011381391A0103D073F4C698D332113011301130006DC6808980898089C01C8D8001E8397A63CC6999089808980858E3D53033613011301130113011987B1130003DF7EE8939231301130113018980016833104C044C044C04E668040C40CFD11B634ECB44C044C044C000B4190326022602260273340206A0E7E88D31A76522602260226000DA8C01130113011381391A0103D073F4C698D332113011301130006DC6808980898089C01C8D8001E8397A63CC6999089808980818803663C044C044C044608E46C000F41CBD31E6B44C044C044C040C409B31602260226022304723F08203F46C7679C69D698E8E06735A26022602732A022F304067C8019A7F2A60B6D0FDE99C8A853919130113011381E71981939B7E9E5280E695139C0D403FCF3160DE6E22602230472370460134F3E5677E9DDC4B98A3F7C99C968980898089C0F38CC00B9C413FCFB3336F371130113011781147E03400B4C99F5FC4E3CD5CBA89C0191281B9B11BE0A90768B96E03D267C82835A76922F0E28C40F6620268CB40F28B73949BAB361138F322309772C8E79541675906DBB6C13FF32FFEDDB28E35FB1CEBF767DE4D35676C226022F0E28980C23E0B699A8A74F89890F71C43F39C019A20CC9323400B6991A60A98F9DD03D8DDF3228813980D383FC77B65DE662260223047229027A7291352A21AF15070EFE4D2B7CF19A009CC6AF650279703B482DFD94E32FF9901E93932C6CC69980898083CC708CC640ABA007D7221FA3903742FA5E108CDA1C05A65CF33698E6E0F61061B982304FC73BC37E66D260226026773048E73919F53B94C543BB42E935536E3CDCA229C78D09E3340E733084FCE751C3921C7B68497C9B2A487C8D099B32C054C17E189DF22F30E13011381531D81E3C9217B315051BE19923483653B278DCA7DCE009D531B499208403373F63C1BBEEFC02615DD7B8A5D238E531D67733C130113011381138A400ECEC76293C9F0B204C76499A5B7284C104429D2EC2865B8133A0BF5E2E705D0E4A109D0CC9C799604E742C151E07CACAB7B0E276BDE62226022707A22D05B413A3D67700A8F7A9CB260B2BA560F4087618C56104368DC932486785E006D59E49E359D91A528F80E8A454F21BF01E85338A2CCA14C049E430472AE75B667558B81B324933431D5A065F39FCFE15067EC5B9E858FCE33E73C7C4118A31D241AA04FCE153F0F80EEDE5DC52CA7F03D1BC5A2AFE60E03D027E70E994F3111782122D0C9123358B311AEF210A7C8122AB42CC4AE7AA4DD0C7072CAB217BC7215ED0B71AEA7FB336705697DC11AE738810561827610E3644E612711A013F89E8352D157E134007DBA879539BE89C0B34740837467B56BA54A61C56F0BA2EBB5997A25C0F65D357CEB5B4FC1B3AAB8FEBA8D58B162FE741C32008D3639E8203969F4C6F3E4A06766D006A00D1E98089CB91160A52B013292AAB60268E682291005C0273FB305EFBEEB6E78CE5EFCEFBF79076E7DD54B857F7D517C1D67066D00FA45311ACC459A089C8E08B0E225902C009DB31EC4A6A0017CFC1F9EC45BFFF3DD70DD27F00F1F7F0F7EE6B557C116AEE345F06500FA457093CD259A08CCE90810A0BB3C05AB4A5112C3B71DD4AB363EF6D16D78E73B3F02CFDF820FDDFD9BB8F3CE2BE1BA5A4F3BA7AFEB249C9C01E8931044F31126022602271681692A0E0DCE92455389C0D2BF238A8D46CDC2DDF73C89BBDEFD2178DE93B8F79EF7E08EDB09D08A0A39EBBF0C409FF5B7D85CA089C0DC8A80566948355F78678D42CCA22DA5E54D325B8A84CD3A70CFBD5B71D7BB49713C897BEE7E37EEBCE365F00C4077C4105471180E7A6E0D7173362602676E04048FA938A072C3EBAAAEA4CB2C45AA6D1958371480FEF056BCEBDDF7C275B7E1DE7B7E1377DEF15203D05C3EF4C8EC0C409FB98F8339731381B915810E40338376956423F767B032C11D31D2D4007DF7BDDB70D7BB3F0AD7DB8A7BEF7907EEBCE30A03D006A0E7D6983667632270D644A0C3AB66E8B409F618E864560AC2B4953A68D40101E8BB3EA601FA370C40CB146632E8B3E6793017622230E722908334B3E719FB6964C24393E870D0A839B8FB1E02F4873540BFD3501C06A0E7DC7036276422707645E059009A4D2B29E8B363A3517771CF3D5BF1AEBBEE81EB6E371CB48C0293419F5D0F83B91A1381B91481993E1ABDD60C9AEA105A3A059A0D521C4FE25D77B148F814EEBD8719B4E1A00DC5713206F4CC81C8CF9CA96B9CE91B724C97AF9E133BAA13D8719CBCF12B398E209997BC6011E81DE733FD44739F8E146808406FC55DEFFA305C77871409EFB8D300B401E8933132F38196AF4A3440B3049263B5B879E91DBB84F7A70181640F3D6603F9609EE1153B9B739FF8CD74DCA2D41B7BEA2FDDAB3AD6C43033ABE98DC7D1DE7B3262663EE3C517817C5C53069D5F3DFF9202F50E407F04BE501C0AA04DA38A29123EFF07A5374BC84158EBF215885AA0C7ADD615A949D1A63E942223EE14334B1BD16CA0DF7BA63337363F5A47EC510198D2270DEBCFF29AEEAFB89998F93211781E1110699D1AD8D3C65206D49BC0DDF7308336003D3DBB3200FD3C469C7EEB6C00ADD35995E9EAECB607082931525F2A83561FF12CFBD870BF9B4ED94067E34703D65990F49973403E63A813158B84DE25A89CB75A03B0CECE6E2F395343993CFFF1F262FD0403D047BFF3B3663FA64878521E15B66012CA98633253EEF183E95048741DE8CD94050FF3CED769389F03772F62E6103E03F56705E83C3D79E61D9F9E30339BD1340B7AB6109BF1990AA0D5346232E893325C5EBC1F6200DA00F4E918FD046865FD2284C5F4ADB87AC5FAB24DBACA983B389883F43332D3DE1FE899545EAB53F2D932D9A321287F3E2D7BCFF96B82347FA101BAF7DC6739BC41E8D331BACEA2631A8036007D5A86F36C95EAFC447A0A7F5D0AA3BBA384805E0E8633FF9CF6DE9954B5B079BDE4883A62CEA7F40442B2F74E43BF2E4AF65414E5B03DEFE3D662E06E95C2CF9023D78779B198A79F9641F42238A8016803D0A76D981F8D9BEDCDA0E5E47AA41C9D9454BFA817A07BB3E1FCD7D35E96B766CD4E3E3CF3EDFAB8548D08E06AD09617EAACBE538F8865FF47290BA60EC0F7188EE3B40DADB3E6C006A00D409FB6C19C92FBD5FBAC698585CD7F0A0E927F4E15C889F3226D1601DBD2EA8EFCA4A7D3D45DD257A7B82A135629B7F0D739A0F7EECBAEEB8C9220CFCCECE5DF7C41A277B6D04A0E8B4636163247ED72A14A83096C4DDB58B48A7C71EDB37CDA86D1597D6003D006A04FDB004F12C07604E01201CF0C96453B72FE40FF2E2FCAF6EC766C67D4476876A2979EE8D54277EA7E1A7DE5DF1652991432D836996F9D2113956542C80B8AFAC3B5939824D016B363FD9DC480ED2900B608D04270E8A980AFE1B148A7E814FA682B85D3167873E033260206A00D409FB6C19A723B1F05652A0B4D75064A84B3655B79514348164DE08B90890F81D6174B01517FCBDFF979EA2782C33D19B1A21E7AF80E7E28DF231FAE05D8B2DB66AEB156993D3F8B1BB6F3AD6A2F8B0C8EECB24CB73166F80AA87B0B98EAEF8AEF96E31A803E6D43EC8C3FB0016803D0A76D1093C22010E774040763162393ACD4159015BD4496C1C92220AB73A31F006D206901D571A05D45D69E421AD491864D200D110401DAED362CC743A1D807CF2F20B31CA4B60DBF50865BA8005E1F5019012AF300AB04A000D845C02A00962B3B5708F4E7A9BAC66462B84C2942C5CCE8B0C90329C8DC63E46B00FAB40DB133FEC006A00D409F96412CAC020159F1CA206D8010B05AB2A7BC300E710A381EAC34861555911DDA8660F26934AA7B91B42790548FC00927E1C555B8710D56D4808308691C218E520179DB2DC3760B486D17B16D21737D646E1989D38FC81B028A0B51E85B8CF2F05294E62D833DB40828F6037085BA500D29CCAA3D642801B6FAB9602EA912D21E92FECF507A18803E2DC3EAAC3BA8016803D0A76550EBC21A59026E428CA80D641340BC1BD8FB30A243DB3171700F82564B40B0E0A448DB63B0E226AC24441A07401AC1CE22B8762C7F220BE5B52C3492A5CE32F5ADB6ABB7913233E72B2C0789E522818BD422781761792540BE8BB0DC22D2CC82653928F50DA330FF1C14575F0A6B681D8061C01D4442B0D7E4862D74C77480569488AE599A0CFAB40CB1B3E2A006A00D404B047AD50B470B49AF0EAD177404A97A7F7014DE550A815CFA335B8E81B4AD8E9486405A45F6F40FB07FF3BFC39A7C02C5E820BCAC0D57680FD5C1975A91D00B76EA0AF7613B547628B2599A4744FEA18F912A0ED8B655CBB5AA07AAA29D6A35D1AA8E8E1C4FFD4581BA3E4DF2197611756F2192FE7330B0EC62F4ADBD12F6A2F3152DE27852E414DE3AF5D516451A959F15A07BDB263BAA92D3DC127E3CF7FFD910AF776C280AFED85F33DF33F31DC7F319C73ACAD1C6ECB1DE37577E6F00DA00B43C4F3D98DAC5DA1E7320E913E9A28992C2A52A73E4DFDD148945E02520BA82BF165359FDC5CFB7F8C3AC2D3446D21E03A27158D1389ABB1FC5F8E6AFC26AEC411913F0E23A7C514DF0184AC6C663733709E17F7B1A41667F86BB3FED9CC14C638D4EBD70C6C4D239E3FC9D36E2CC43621511642504CE30D0BF1CA337BC06D9BC95C8EC7ED8CE206C6701807EA14084A04E2380123CBD3373F73C1292EABADCA8741E59AA447A9DA222FF762CF03AD9007234803E1E90D43D44F94B652DD1DB7DDF594A746BBA795DF6597381E339F6B1E2A0E766398593F179C73ADEC9FEBD016803D0128199B686F2C02692512ACD84CE30F583ACC05375CE4952CC8164A748B30C2E414AB473F9DBF88200C014D0DA87B8BE133BBFF6AF482777C34BA650B46AF0D30914D0829B05025A2981596926D40D22A7CB0940B77E9F4AFCE219C85C647948DD0A6AB18BC41B42CBAAA0810A06566EC2D20B6F80DBBF0A767939E0F621B3A8EEA03A45D32C147C508942CB5499011D0DDEBCB80056368EE6F8380A7DCBE01406A4787AEABE7ACD50665BFDE4DAEFEE34D299AAF58F72675899AB7B015A8FAD69D7D2A99F763D5066C34E35C63A53BCFECB31EEBC9C4F3791983DF13875917DDE4732006D00BA9BE6F6C4C2165241F3ACB62E84692097A439A713723959DE6D4730CB6039394F9088E2226B1D4430FE1360FB37D1D8FE6DD8E118B2AC0D87BC711AC263C69C92C2B084FF4DA98F2688698DB214E3F4A6F3A736BDE475A6FA9A4A22F293B927CEE0383E52F808AD12027F3E4ACB2E817DCE75185C7B155267212C3D51259603CBB2E0662C7E5243CD78325E9C84B8C7DC38D243DFC4130F3E881557FC22FA176E00B2C2F37EB68FFF0308949C4D7334CD5B206599D4930EF35F4EE72EF0D5AECE94D52A47BD5ADEDDEBE3DD638522BFCB3F56E8A91EC0EDC9B4F3A9409D53AE32E79812E796EEA9CEC4EF6983B92B959C0EF6C71F99D3FE4A03D006A02502BD990A9FA069CD17CA5A33A74E856ED04A5FE184C9118BC698853536DD25B01C66CC75209D02EABBD1DCFA3D4C3EF60DF88DDD280587E1644D647608C7EEB1EDE4136EB380A7926FF5C0B37390C748456E278FEB29CE2E65621000721126096CD791461A97D79B9282F111DA65D49D2154DD455870C92D18597E2930B802700690BA83C8AC226C293CF21A7875D47993AE9904C2A750FFFE87B07BEB4E8CDEFCDBE85F713960558E8FC73D6908A234E4BDC8A7A29D0F0CE54B9CCB0F7328E73C2C8D961AA0F39FF7D209BDD9758EC11DAFEFDEF3EF4D8EA725CA1D4497496DE66A4E8E792CFA829F77ACD79CB4589EC40F32006D007ADA73481A81A35D6465DD6425CF8C54B4940F9DD64AA8AE10AD9AB0A8A6B00264F1218C6DF9362216FC5A3B91EEFF09503F80421AC04F294D8B6039A15022E49485ABA5D2821F6F5BC2672BCE9B1A68B202161C7D9C4474D227F12138C6470935C1B2A69E38E0BA40C2A61AC04E980D3BC81C179165A3C53FDD2194E7AD4336BC014EDF6AF4ADBA0CF6BC35B0EC41C9402D66AB19635447BCFF87686DFF1A9C5DDFC4A1BA8385B77D0095555703565F4FE5F6D45DEBB484B427C6BDD8D69B8D76EAB29A91E990203D137E9E5977890735729E1530A7A7D0CF1E8019E779C666CBB35DA5016803D0D3005AEF5A022A253440B3CD593D2F04234DC84A2AA4A466D23EAD335D2BAB02D97EA4DBBE825DDFF957F8ADFD28A635B8590B8E15089D2180E75888D214B6EDC1E6B2995617B2DC6531901A66161CD5234D70667BB7C36C95D383CDD79CAA744875205A7A52484953C8FA9DEDE236B244FF8E3F77D8E7482EBE8438251D5241EA0DC35DB41EFDEBAF4761D54DC84A4B915A2E9CE829C43BBF8EB107FE0DCED8E3E84BC631E62D47E5A63FC0E0FA1B61D903B3EF1A732AB0BA17496745D119E0DA933DAB21931797A79FEC342FEF5E7278DACBF4C10565BB14459E434B5A30DBADD7207DCC533F15F13B99C730006D00BA3702043E79C03A0E6ECA87429E957C1D9BBBD1DBB949502ADA642BAB01B52771E447FF8664E737E0D576A39434859A1052449CF96358568C38CB90D81EB2D451D9B15EF28BF04300506D6FD599185295A9AA8EEDDCB8E8643E0947FB2C9E90CAF08592B032B84E8A3089E0BA1E126DF84468D6848C00BACD4E48A1631C847605F5E26A8CFCD4DBD1B7FA2A64CE20D0D88CC94FFE1E507D0A45AB05378A70D85F87CA2BFE00031B6E84650D9EDA0C3ACF4273243C4A36376D5995BF663680E6EF7A4178B615CF4CA09DF99A1EEE3A3F2D59B53CDBDCDC33779CB239FC851C8606A00D40E799F2B44C7A46583259E653B5A1A46F2C7425B9A366CA16EBDDC0D3DFC4BE07FE05D6C43694AD06ECB801C7621309690C458928DF8D0CA9954A262C3BAA10D0C8CF8A62449E6C9D49EBBFC943A7B7B992C2BF9E445EC80763E6676BBEA7D7275A65845D973C16FEAC8CCC34AF547269C49685B6E520F686D1761663D1DA97C1BFEC95C8767C13F56FDF2DADEBB69DC28D1C8C391B51B8FA7D18B9E856580EBB194F1D8F935909B83AB059D0E4FDCD9516D379095D33A41245194CB101A8F3D503F2B2189219AAA31FEC288504B7757D5084403A59EEBD5C594BE97B2D1277491C74443829F2F8DACB453E41CE83594477049D155487016803D0B302744FF6220542795182340A61BBF4ACA05A2384954C20AB6EC391CD9F446BC7D7B1C03E82A4761805CF13884AF453AA1263D5D4A1BC3698056B5D730ED03D4F7A9E31A9A49DB482CAD6659F3F520EA7109CF326184B8A949C48B407AA0083523F1098A55125531CB38550F1F4B687C0B6116516BCCC453B2D23282C821B1EC2A03D86C48AE4FD4EE22A80BEFCBD9877C9AB607903A710A0D584C92FC6378D09D4AA26907F4D93ABE5E8C97B4BCB554BBB0BF6D20C1DDB5835DFD29C50B4CFACAFEAE49A574EAC8DD30C419C2152A1006BB0451FF02C0BBE65490D829A1E5BCE510371AA29303D5108DD26DE5B8E80F7340AFB54B1612FC49834006D007A3A40ABD19C6A7E59B241A15C1545A1141419ECB8892C3D8C78CF37D1DAFCCF681FFC090A691D4E5045C9F3C0E7872C89EC3D486F0D293C4ABE2C5405C18E822DA56BEE7601AAA3AB5C290746D90750405AA563562AFA8917E27178C6671264A5455C1A6762C9F2D9C9A8247F9C6494BB1ED28200B4A28358280D65A591662E225239B051E015A740683BF06C764486D25199F7361E71D7C17BC93BB0F0F23B60B9F34E194033E6715E90950950CB3272BF6E0D78B91BABAC1BD258AD690888BD227A4D4CD1BF9B0D38BCBF9295734CD9409C01ED38463505C6C30C631301C626AB68870912BA17A629D22842D1B1B160A084C54315CCEFF33054F250F294B1161BA0946115A938AD8D1705109B84BA1B29E423E98C546FE423D100B401E8E9115060A948841E791D8B60DA4DDF628B767A08D1E11FE2F017FF174AD54750008D8A52F172A6B73D1DE104D709CECC7DA701B4A233486BA8AAA3025FC5542B70EE921D399DC1F352C5CA53BD558998A04ABD8A60CCD310A78FEE794B46E97535BAA2846131944D2A8E34B810C8AC28814D4F113746222A105FF854123F29228C796B605FF0562CBEF21760B98B4E99E1BF02689DBDCAED577CBA46437102E44F98B35202D9CB7E4C2BCAE981A422A3575D3DB6AFCD30432388B073DF118CB73354231B610A440927727AA3D848924C56694E1AC34DDB70E326868A36562F9D8F954BE661B0E2C361566D012EA933A92E13A8F9A7034BEC5F7B6893E391E09D92A9FE391EC400B401E867464067B4BD5A36495DF8D03681E62E4C3EF52DE0F003881FFB3A2AD938ACB8A5B857DBA5020D19B31979ACA5B543EFDCAD3868796167C711A5C8C8015A9D8B02E8BC2899738F926BCB80EDF1DD788EE3FE44DED6E532D5EA81D9B3809018307155A1EA61C2A1938316CE34113B52667919A90FD2383CA81323B002B8CC4A59204D5D59C20311C6DD554837FE3216FFD4AFC0F6969F528016193B270B1642396B6489A87312DB968CBF9559A847C04423C064B38D208CD10E4284698234A16C92D799AF8854799740CA9F0FF4F5A1BFD28F7A2BC364BD8D6ABB8924F590D945191D71D6FDE6AE3919C1360D91854DD8491B6E1AA060A79837D887A5831EE6155DAC5DB54C3A1609D2769AA86C5A3C6095FA28E7B5CF781EDA00B4016819D0B9FD4387FCCD531F6D564FB049ABC0D413987AF4B398FAC9575068EF43D969C2CA9AD225472546FE70B038269CA33499A8ADA0246396F2995A16E740A700BAD39BA8B2546647B274EE948614EDA197E2DAF0F34470F639BFB6AB06D00528C9E4D5B5E4C54BA53C513C6EA74BD04A64E2B133576822CA0B332745ECA4328959F014BF2AEE4C09C6DDD588D6BE1ECB5EFE26D8FEE829036875CFF2766E6E8B004496B86EE3709861E744887DB536F64F85D87B680A93B5967452369A2DA4490024216CAE08E82942CA8193561AC3B76D0C94CA58BB622516CDA75789A2CE12C792F7334E046432219CCA733E3A8E7906AC77B0059E5C59842C8984FA70DA531846885B6FBC124BE7F7C317BF704E109C0CBBBCF9340EFA39DFF939F04603D0672340AB7428DFA2C9F76C945875E9A416B3E4CCBD00DDDDBF496D30220F6F0356B21B47BE7D2FE2273E8B5278187ECAA57980D48EE1C2861D936F54C971C44671D9AD84459E443F447C6CB85CF61599215AE7196A2CBD66CE01580172FE2FD5C9964AEEA47642C9F7E9EE74973D2B73DB951928D3A5BC7D9C795CCE29F76A7873AA255FC8EB4944D335BC16163E5587A02201329BA55172A59ED26BD3FE34B5243EA480A894605C62ED33E2F06F59022BB530E1AE467BF59D18BDE9CDB00BCF17A0BB3E17B3DEF79E829E2A31B0E9DC1260E6B6083B6B199E3ADCC09387A7B0F5400D1341866662210862C47102DF76602531CA4E083763ABBE0D8F3FD3296B1886A8F83E36AC5E8DE14A1F5C5D4864744299EC596064076A8684BCB34C52ECFFE1E4A5C64510D082369398250933F50485A889426B0A0B060BB8FAF2F370CE9211194DA214E2BD3FA55DA6A700C00D409F4D009D679BB30074417173C7FD959073565E11B6D50092034269ECF9F2DFA134F5044A6953BC8B2C8F52B24896EA36B959ADBA5045279527BB6C48D10F1099576A83D51234910C0A0EB943E5E1616B92931C6326046D2696A25C6E13EFA3AC88A6330F89554606178968A35D291009DBAD8B8E4A12A85048C805FA7BF020722E293C8BD344282DE78EF0E74DB8EC80A42F88EB08172ABA6BC9F6734A859F19C31121AE8730027CB720120525AB535C3A8FD3ED76E4125CCB083B7C28BD46B43F751AC1E3694619AADE0AD4466FC5CADB7E037661B52A78CDA640385A7DB4F35A619575BBBECAF43B9D7B323494B6869C2DB96766CA4DFDBDA7057CF7F1713C79A889B15A1B8D30469AD2342B112AA1E83AA03EA7E23898D75F44190468FA8BB8C81C6E86E0238829D9B3B164E12294FC827480B2FD5F326864886442223833E32620D3A384F73895EF24890594E398C756935A9C2448E2146E1CC36B47B0E2492C1C7271E3951760D5E261B00CCB38AAF96146DC7ACC938E7BFCCF95171A803EBB00BA5B64EB66D005CF46F15800ADD78404383E10AE54E12358DCE1A4FA040EFFF0D3686CFF3AFA92FD285B7564ED260A968B88B69A8A5C150E56D1155DB749D5A6AD321C45517099AB335136AB10D11D1B51C425B10B97D926FD38D294FBAB20B63D447601895D826517D1B6FA515C721EE68F6E0046CF010AFD5ADE464AC556D4B6EA37D492380550CA984873C862BF17C26A4E00879E427C703BEA479E4250DB0F2B9A829DB4507448D91078D5E7C97F5C09C844C2B8B8B02C1F49C49F11FE94EE595D5F978051748D9EAAF466B779029EB2A59DC5309BAB8F145567192617DF80735E7317ECE2063D39F48CCFE359B78BA42D8623BB20705E52AB0E9963F4B9A45984C4F10494A752E0915DE3F8D6A34FE14800349C7E4C063642A70CC4212A9E8D65237D5836AF8CE1A28BB85187D56E226DD711D426618581806F68B9A84529A6DA3156AF3F17FD43F3D546E8A2BA21C02B8E5AC056AB3B7A417926400B48E7809D52E191228E62B9AD5990C28AAB72AF8A59153F75C946BCFCA5170BDDC1A9685A838C0ABD1E13479BD9E60A1ACF721E06A0CF4680EE367330933C1E80561A524AA10834AA31C44DEB40633B6A9B3F81E6639F45393E82349A82E593B2C8E046365CCB17F73966C32A7B541924E14D3D9E0AA0723F0BF51A252DA32DA92C67655DCCADAD288D56196C041B4D7B0075771E9AFE62F8F33662F1BA6B503CE722B5F38945837C1E830A097EEB4D60B52A443E2CAF14754823A34A00002000494441540C76045DB57529FFE4D3CE825404246D60F7E3683DFD100EEFF83ECAC95EB8D17EB8D9146C4765D4F9C4213ECF510436A977B6C6B2B9A1AD526A2B65C6F40E0CCDA8AB8C9EBCABDE252B11D0E72AC3C6A4B30463235763FD9DBF05A74080D6EDF69D21AA41771689A192EA89E3B6520A2BD18B845634197A2F45D5956FE14806EC6CA4F8F613753CFCF42134781BFCA2B4DFAB55428A918285754B4670CEC221787184A455C7E491436855A710050DB45B0D356946C0543B443306D69C7B0106E72D948C3A0C22386A69A4B2654EC8D4C6F70034A98B2E38278ACA2020CB9F9ADAD07F32A34E32F51D350305C8ED715CBE7E295E77C3A5A870A2A4ECAFB76C9163F3F14C6E7311A70D409F4D00DD49173407CD657AA600BA786C8A83851DF12BCE698170175ADB3E8FE6773E0ABFB10D1EDAB09D0C4116C0B11C78340A4AF5AED6C277D0E08820C5DC93DB4929EF0C5520E4B9A8A61372D6F29564F044CD4063530FA9D38FD0EE47569E8F963708ABB200834B37A0B2FC2260643DE02E533B9908F2901C2740EB4D67F543D9159E742996CE1DCE5DD7743E2590A63BD059C8445C079209C01E477AE0511C78F04B40382600EE8475B8CD03F0E21A3C87A01E8B4A416D6CCBFF245DEC00346D3855469D173FBBCA6D9EAA283FA4614F193139998D296B090EF45F8AF35FFFFB708AE709859343B2BA86670768A5D456F176D8CCC3AC35C99079B6AC46486554C304E35182CD3B436C7EFA30F63412A45E057EC67B91C2B5228CF417B06CE11046478AF0E3103EB3E4760B41A38EEAC4189AF52AC23840AD514323F4106605645E01A3E7ACC5BC45CB443647EA4AC4889AC650197417A0E59E3FE39BC0AC326702740ED2FC37C159BEB30861DA869D7A089B21BCA481D10117AFB97C032E5CBB021E8DACF2ACA043C36BAA6B36BA682E8272EF3919803600ADD15267974CB90291D3B59FFA1282FBFE37ECEA76B8686AEF62554194CC883CADF836E71A61F2BB0A48C8C14AC55EA456DD6786FF909FB17828E91D0B74ECB02B2028AF80B3F61518D9F40A60E1B9CA6A543220368114D59F9221E9274DD2C219BB8F74B2A71E43E2691967AEF1EED2BB9DB768EA0369A00A98B2CF21B3EB16DABB7F84E0C9FF80BDFF21F8B53D645211725A21FF2E9ECED2EBA63364D5F2AD56156A45D26956EFA17A72450A97E40AA017637FF1029CFFC60FC0295D304B067D0C349109422942B4D845365C08E1A09602DBAA6DDCBF7D1C8F1C6AA299FA88A8C3F61CD85180E515072B160C6264A0889297210DDB2830D4DC80B7D94250AFA3363181A98931C99C5B610B8D76805AE423B68BD8B8E922CC5FBC14F4BE166E5BA4774A8D436A430099F48BCEA067036882F36C00ADC05A017442450752B49A811868A59477B626704EC5C2CFDDF6726C58BD54267DAE02A857975DE33911CA84914F71731D957BCECF00F4D906D039B1A039E82C83EF39C7C8A03567AB3A4C806C12E9C1EFE3F057FF0EE5F187E1A753C8AC1009795B52C65A4541FD2A3341A5A72050254A4A27692C018BBFD7EE15F26395B14A6EA5413B421991BF10F6C24D70462F4765D3ADB02B2B905A7D52F093CF147C533C724F2239FB8D13B4ED95A1A8E3C997B2CCD3AA909CA3CD815A0149D7F321DFCD9B801701E924D0DA0AECDD8CFACE1F626AEBF750B227514CAAA2D3251DA18A83AA4583D23AD51A9E332DF9FD501398E2E155D62DAF4F5DD4ED8538E06FC4B96FFC6338A58B157573025F39F74F7A85B234B66B532DD2B06C6CDE5DC5D7B68C61673343D5ED83EBBB8883162A568CD1A10AD62F1E41BFC78922824B6960C2E27086248AD0AA4DA13E3181E6D4041AF51AEAF5061A61846A33402D2D6074CDB958BB7E232CD783E5F88822EECE4E0E878D248ABB57C53EAD8CD759B5CAA009BEDDE2A00269FDFABC6098243A838E90B291254911052D51E1844980A455433998C26DD75C865BAFBD14FD255FC68D32FC6241560D49F1EA3A8178CE89971A803E1B013A17A6292999E73B4A6677D4259ECABA74AF1890EDC2C47F7C00D1530FA01237E05A6DA47680CC2650A5F0AD02A2C446E47AA206201FED2080C36ABE5AB08376A5F9034130A2E42C11FA84CD19E4AD59FCF3D17016C15B7515E65F72079C91F3017708197CB123555CB820AB6A191657B9E969D0331EB89C83EEBC5715C9146EE77B70E99CB9E3C2A6E470041225B753D7A03C3734B79D514247C73E1AECEFC6E1CDFF84D2D35F8535FE14DC24E07A4056068970F8F4B026E8F233D849A84861DE0B7545AA755C7546F23FF2D60E1AF6021C70CEC1B96F783F9CC19702C2B2F65CEF3196E83C4E7E07782DCC1E9B29B0752AC2971F3D80C7C752A4853E0429150F6D94AC00A38365AC9C3F8CBE4251541AECE7938E50097E82286C636AEC201A136308EA554C4D55516F05A80529269A31FA17ADC0F997BC14954A9FD2348B5C8E8A8C043629A03896C613293E8B2CD312EF0D9541F7F2CD8AD2C8E574426B90EED03F4B34C52100CD5A61D814FD753B69234B0264B5299CBB74086FFBF95761F18221E934940C9AA7D303D07302744FE4240C409FAD00AD818D70E711A0D98ADCBD56B1CEEC6CEA9AF3A401AC7412E18EFF8B235FFE13F487FB4452A5409080422693E53FF28E0E6287452C668B7CA099E912E454E62CFF135055F447CA6FC716BE32B246E02DBA00FEC6EB101796C19DB70EA5E1756AD3554AF0C85713CC25FB16C19C9C3A416F6606DD29D0E7B9EA333C26150FDEC539DDC23C13F934F0CBB17596DD2D32EA394218951A90EC44F6C4A7D1FAFE8781E67E20A3319227C4322565A2E6934A200F42AA470134818F71A775A9D20BB3034E4D06DC68B769CDC7416B146B7FEEF7E12CB84E01742F85D30BD07A37734D7C0B00B2155F3AF16C20CC80C7F7D7F0E3BD63D8DDF6B0AF69A145AF9038440131CE5D310FFD568281B20FDFE504C68953A9CCA95156F4448276B38EC3FB77A139358E767D0A13D5266A4186F11630BA6E134657AF41B16F405903C8B5D168C9124A423A0285DE5059324F59D2006935CD74A63C2363268DA10B854269F480B4E2A129CBCB10B75AB0921461DC449AB491341B986735F09F6FBF11975F7E894837D93823345ADE88752A77793811107EB6D71A803E3B015A0192CA41A55145CBEC3AC0DC0348F25A51A05581C947B0EB0B7F8D81F1FB51880E4AE3093BDEF8D45B16F93FF2AA4AA5C15C4BD91FE5D92153521A067109CFA2A15249F8D2EE0C04968FC05B8823F152ACFB85DF86337011526F3E6015245B55196B3E19680E99B481A6283A4BD45ECFDFFCF60978E539F7CC32FE33BDEF95A97C1E040DDFD391BCBB1E569540E5078D23009EC4DE8FFD1E066B0FC1B2EAB26088536E28E0A0142B37B5406F3860D19655B26416E054F79C4C626902CFA1F704419A2B0E076D7B1E26EC6558F1EAF7C05E799BC445CD74EACA3A9351079C55D553E2ADFB6BF8BAB60D4C45093EF4E52DD81B17D02EF423755C64611B834E826503059CB77C21DCB0AD54376AFA53F7B2A75DDB4A63D4AB9338B467A70074D06AE2E0440D536D602C7471EB1DBF00BF5810DA41BD8D9FC3BFA8EC98F79ED749D0168066C76096211280D67AE71EA506B3E5344E10A7CC9C35E72C0D2ABA489824889248BCB8B33045166588C226D234441206F06BFBF1AB375F8E57DE76335CDF97E628A51E5269829A0CCFB02F03D0672F40AB6EC2E900AD1A3EF4409D66CA1B00D11E1CF9CA0781BDDF84DDDA858A9DC04B15F8D030472C428537D5AE7262AFA90C8F5834132C490BEAA85CEA13D0C50F9A805D42CD1A46A3B801A32F7B130A1BAF079C61002C002A7DB4CABA89B3DA6AA7F781CA112A3FF59EDB364DE970942C69263B30ED519D09CCD3F09AD7263D768A22899F061EF85B8C3FFC39149383706C0208F95A163D3D20A1743041E6725359075194C0725D55BC4BB802B1613905A17FD2842DCD196CC7459ADA6865FDA83A4BB0E2D677C15EFB3380555419B89E6A45712236AF54DBE8758D00B3DE2A8C506441A6906F6C6DE15B4F1C40AB3482982E84610BFD768473E60F63F95005054AD2282FA4424582AE2D54B5ADAB902F5184FAC4380EEDDE8976BD86B0D5C6DEC3E3186FC608BD0A7EFAE77F491CE8724C577B2CE67A6766D02CB4767966590DA519A2589931E57C732FE7CC5892CE20C04751D4A13CD8BDC89F87A902E8B81D216A3309005A418856146324ABE15DAFBB1ED75C7E210A2E4BCF6A25C0FA809853D105EF4C036903D0671F40E7579467D0B90E7A3A28E96C538A392D203A88F4F1CFA3FED04781EAE3706CEA7C2D58F44C703C36BA69B241596CAAC256BEC37286943A6059D61354F82044B028A7731CB49232EAD62264F33661F1D56F80B7F85AC01D51CB77DDF5451A40AC142481D6C637D3B2639D42CE02D06A22EA92186A4D3BFDBE3E2B40F7BEB42748EA3DCC042781740288C651BFEF13489FF82CBCF83090D1208AA0E8206386488EDC2EA95DBF858FB7C53C8A5ED0A43CC47D4DFEED0950B9E4D92DBAB931C60569C2A93B0BB0E1A6B7C239E716A138B85251CD268A1957B9A0267D64A71A4E9E5212130F8D5696E1EB5B6AF8CAE37B600D2E423DB150705354AC10ABE6F561E9701F8A968D30A4D6D9869B50E3A1E8240165A16D554349D26EA13E3E8EC37BF7A255ABA35E6FE150B58E23F5006B2EBC04EB2E7C896A001290566DDB3204845BA6B24565CF1D5D332762D213D4E1599970CC39EF9C73D2F4E150009D220A591454BC742EB38B62A5E208DA2DD9173208695F6A63A29D60A410E1BDBFFC4A5C7FFE529411CB8A456D08E0698BD2332C7B9621AD544779A351E70A32A0DE04EEBE672BEE7AD747E0BBDB71EF3DEFC01D775E01D7CD1FA433F07A4FE494675D10F5AE8A959C9556B64190D79F4EE400CF32378C57C9223E972F9D8DE686A1A2E2A01707B7975219980230BD8B33FF4CA7D078E823081FFA07A0B603252F84E3F0018AC4D48700449652A96C991977951AB9B7736A87B2C34A9A9554130A68A204046919557F23FAAFFE4F18DC740B602D901DABB943B670B31A5AA7D317DD94B6DBA5AB97CF72F24ADAD71BA0A32D5E3B973B23941D5E5D06FF51DE2DCF45002BD98FB11F7D16ADCD9F44A1F1344A560B192D57A56B92948E0FDB294BE193AA09CBF35457A3F83FDB886D1796E74BEC13FA43A30CB8BEB42F73024B6D0FC5BE6158A5F9683BF365D795CAE8C5BA094665D0FA7F9AE650574F8584A86444AD013CBCBB8A2F3E3E8629141038BE38CD153C0BC5B885754B87B1B0BFA4A805E9EC14676ED1E3080D91D346BAC3254B42A4ED266A478E60FFEE3D68B72354EB219EDA7F04CBCFBD009B2EBD024DAEC6C4C14FEF4B49AA23CFA0A53098B76A2B9095FA21576491AA49E4ADDC3920138C05A035703F13A069984413A5047148FB810851E063F7C11AC6620783C30578D1417CEA83EFC4C6E1B2325A620584CE7934A5D2AACCE7F2549DB6F718803EBB32E88E9DA74E23BB8D2ADA0653C059EB8D844A20408F63EABE3F87F5E38FC2CBEAAA934C6B56B98335B39BDE729DC233B53D8692D531834E54771C8AAA38680588AC0A027F05DC95B761E0E2D7C159B001995396E53DBBC92C3E3179EE9B9F526FD54F3FFC0A43094A79C192D48A56041EE3C9E9426FCE91CC32EF4DB355ED514DF0CD94D805FB70E4E12F21DE751FFC644A356194FB90CA6E220EDC621F0AA5419198F10C3DCF47A15082459F0EC6A958068A25CD22B84061082811A4A919D64B0712D9761F326B0089DD0796F23845C7B95FB2EEC453264FC47F5B3270A2BE48D2017CF6811D7868B20014FB55A1350950B062C99C17F6F9F277593049BFBADA39C5938944C544F973B016C04E931069AB8EDAF8111CD8BB1FF5066D42338CB7135C7ACDCB511A1892F34B82B66ED8514D31FCA88E7C8EF23A91D8256A32D23C3EDBE3C97C8BBF86786C900E51CD29711C76336666D09D269548017A18C38A13448D3A9C38C1FEA727F1F48E4368142A98BF61350A032E7EFD960BF0F6575D8C924B550A0FEAABF547778398D386B7277C6003D0671740AB544BEF46222B24D5EA5D2AEAB661DD3C20B898D0E42602EA4FA37AFF5F207DE253F0ADB6E253E57962A349BE696CC7825D1E6555D4533B65C8A258B249B5DB09F3E7C876D128AC4069DD4D18DC7407EC914D922932B354BA664D3A6B9FD31C23158CEA057DAF9C596F162BEF620761A76AA6EFDFD152E52EF44CE7489E71DB67C9C7E5471910D581F61120AE2929225D9BFA48D1F8AA65CE21B5A1D522A2B7D57BFA0928A8AB513A5C9A2951A5A2DB91F96F899D9A33D938D2880B988A528C35DB6827199AED14CD204518293F0A16DE1861CF7385E3F64B3E0A250F61023CB4E3300E444524992D8A0CDA492D1C2861C97009252786CD061CDE3B1AF0F3BC09C6726CF2B3CAFA9359BF147DE3A803D0FBF7ED43B51560B29DA27FC128D69E77115AA12A6E7255A574CE3C355578558E74A44978CE0AA409BE02DE492AFE250468FE4EB86566D73A6B16E586FE591C11AC75076144808E8030048236EC20C1CEC77660FF9683085A365A8502BC65CBD07FEE7AACECABE2BD6FBC1637BE74BDA23A124A4C2DB5F9CB99F66500FAEC0168055EEA7A483708E865094AAE8332551C1A08C4A35952A90859631BC2C7FF1DEDC73F0DA7FA186C02760278D4EF8A617BDEE7415736C57F6636F945BE5FD9D3A8ED87B89C6499DE45EC528DB0080357BD1E036B6E00FAD72143BF02F05C0FACBDA13B528999D94D2F8791F3CEFAE2D406B427F2355B1570B6F7CFF23A390FAD48910C534F2E5257EB7A65E43C7167D73CFD511DEA40B1C5F2FF8A2822770A8C37534CB4DAA80711EA498A7AECA01924A8D69AA2178E98558A8195FA40B567201B8654E7A250277E41DA84EA5122523AB6D5FB59826543152CA89450B46378F20A55B49329D0223FAE762AE767F3F372476B72B7884269EF669170EFFE83E2B5B177AA81F35E72052A43F3C5B950E879D09150359AF0B3A416AACD8D848B26A5A2BD35E458046F66C259AC3868CAE6E87E473A4DC09BCDA58AEA88A216D294B406F9E850FCA1FDA889F54BE6E3A273D761F7D66DB01BC0C39B77E2735F7B04F5D2009CA5CBB0E2822558B6C4C2AFBE62136EB9781DE6F7F5AB0ED7CEB0510D4BBD1B11E73943FE32196A9DD55C8F6CE84486DDC978AD01E8B30BA0C5FC5DB630620795E26D4B8E8DB24F4D6DEE3247EE90D4460DD1539F47E35B7F0DA7B61DAED594FD03F990D167433268D987508D555738C7440A82C27D6645B55B88B8DF05E24F915965D4DD95682FB80EA3B7BF13F09621B32A5A8CA7B4D14ADE966BFB4EC6287EA13FA3DB60D23D522F27AECA770AA4BBEA3D29ECE41BC8682F0ADA8C52CB514D323CF2F4240ED4528CB56334094E044C87BBAA2670A5CF4439F41148D53E7C6A75C1B98CB50126ACAC7DB0F184F01BB148C7AC3809D1E700EB4617A090C6287277172A3F3A3BC1E4E2C8AED39E9058228FA4D733999D00563B446D620A7B0F1EC658B385A78E8CE3922BAF45B1320027B6B8390C6266C262D0AFC05781B0A235C4FB7A165F0DA5DA20208788F919CCA8D350289738A2993F2991086154571B13536C1204889B556C5C328C5F7CD50D58B962094A051B4E087CE4EECFE30FFEE8E3A8FB03A8FB452CBCFA62388BCA38DF3D8C77FCCC95B8E9CA8B95ED94A5AD037807C427862B31ED91A2315826D8DC5D56F8784EA5EA75A7E5CB00F4D904D0F9FE7D1C6DAA838D1D6B64372483CECD8264B95D43D6D82ACD16AD9F7C1AA56452DA63D9EDC77149DB4F617D05A0D520A601101F729A1DE5A6F41CE4E4406D69D6A096771093C5F3B1EC557F087FC145805311FF67793E7A77D2EADD20E0B48CFC1339683EA1CC94784CEF4C9CF60C73CDDFB3A22138D07BB99E59D8351963C7441D4F8DB5D0B298DB3A0266D2C96767F0D21443A59228401CD783EDBAB073933689A12ABEF1ACA8106947295A51865610A015B444EF3CBA60040B07FB80A80DBF67E76BDE4B7A72F7A4936A514035867422C6F0C96DC7944784A88E4FE1E0D838F64D4CE150AB8D8B2EBD0285F200EC28831BF3F88980B49C8F06E49C83EEFA3B4F373ECABB05993DC7B1A53B065B48289F8BB4835D96A0D99C9242A01BA670A3109B562FC39017E3966B2FC1A285F3C4A6B53995E27FFCC52771EF3D5F40E411A00B8816CFC7E22B2EC062F7206EBA703E7EF7D7EE00B545BC6C493BA4A354196D75A832ED3D20E45A673EA67494FF507D00A7E5CB00F4D903D04A55A0F8617A3BC8AED27602DFCF502EB89D5D991287C3731FC2035FC381CFFE15FADA4FA19C717B215A812AC99A98AC8BB1514E95E84D5EC9996AC92CB9569A2289153BABF3EE1026BD1518BDF537E08FDE8C2CEB974D3CE97B2C8C80168E086D92BB1DCF52B33B2D0FC2F11C7466834CCFB9CB5F357ECB6E21BAD53A4B954639722C1C69015B0E4C62C7911AAA998D96E3CB7E7C7C1B770529BB0EFA0B1ECA9EA3409500429588C08A52DEB02B93DA6B2A2F24AA424D10E01D84D4092701A27613F306FA256BA49786437F6DBD3BB9F885E48D1B72CD6A4563DB4A8A96C8E7F38D21AC304173AA8E436313D8B1EF00B272192BD7AE83EB152575F778FF09CE9241E7ADDBBD7FCE9E410BCF1C31DB66B66C29E546DA44CC7397AC5AF1D5ED7A9D2A7978ED187B1E7F042FBFF202BCEC92F310348EE086EBAF41A958C0D62D07F047BFF7213C70FF562476054D9A4E153D94369C8335E78DE092F386F1276F7A3516FAB21ED42DEC1DDEAE07A0BB9DAB6AF732D61694CE5A6C5F4D067D3C4FC8A97DCDAC8B9AE9EA81B925B3930D4C1540BB897AB069DEE31752940B6C7D55084380B4DA8F60F7BFBC0B95C61614E31A9C980231D5A22CCB682968758B7FB214948612E55227593697ED2C38D1541F7DC8862F40FFCDEF8333781EE0960047AB18F24C45A79409682EC4E66255BC3963BE34404FE329F5C9772E837E1E2CBE12F71C1F6DCBC2444860AE61EBA129342D0F895744100528780EFA7D0F7DBE8F025B93A9AC106C4A618BE1BEE2A4724648CAB6DC468B9CB880B592DAF15894428ADE388B90913760C75E4880E104C17140A95F0199E3E94941CD2EB2ED9760345F47B0D5F04DDA8A001A44D87FE808B6ECD881A56BD660C1926570D8E21FC4B099ED5A2962ADD450D4461794C55EF428BECEA26F26F71CDAC249C76913611AA09D06427544CD0885D04663DF182677ED445C3B82B0B917FFF503BF8D438776E20DBFF073A29176EC0ABE73DF63F8EF7FFA8FD8B2652F2CA784AA6361C2C9E06F588275172DC7CF5EB8106FBBFD3A2CE8E32EEA927EF42E203A456E65FC6AC1CDD92B69D9572F7D8683C0A91AB426833EFB326866CE8EA829C829A6F07D0DD04C87F9EDC5485BDFC7BE0FBF09FDC12ED9928AF6A19218CB8054995ABE43887E947526A7DABC99D3796CC98585C02EA26A2DC4F0756F4665DD1B80E212D5F0407F0EF16DEE493D4999080B4B3E904BC73309A0BB56A5D31E5A591E2860556B053664D8A85BC0D35311B6EC9DC4FE5A1B6DAF84586FF755B433CC2BFBE877394D29891A657B290B8F2E77AA2167ACC121D7B4EB1D5B04A8C55590801E2365F306DBA0E31841A45CECC23082ED789219F3339D4219499E49EBC2AE80BCAE0970F295C4512668D62752B854EAA4C0814347B06DE74E8CAE5D834A7FBFF0DC0EF57F94C1C986005DD3A3DC7CBFD7885F796A68F0CE9B4E12A5D0C8424B541D511A20CA144053BFE78636FC6A8AEACE83985FF4307E6007C626B7E38FDEFF5BD8BB77077EF6CE3BA4D186D778F8401B7FFA817FC4E73FFB2D64998FD04D11F816AAC37D187EC93ADCB061006FBBFD6A5C7BEE72F8E269A01DEE7245BD241AA24D924853622ADA6EBD7ACC37403855983CED3806A0CF2E80E6C3AB96C3EC40E358EC72D0926D092151473A793F0EFEC3DB30924D88B97BEEABA6D67CF9EB7495ABA34850FCA5926231C38A85BE68B90338E2ADC3C21BDF8E8155B721B5D9C2AD80578A6439A797D3007AE0778AE4A765E43F8783EAD27ECE6C4CCFAA74042563A50733B0BB95E0FEAD53A8C754C3B848D9FA1D72835560A4EC639054865883B22248DEC94328F74217080588D564294E783A951630156F8B54AC3D09CC54531033B9BB0925796459FAFA06E07A05F9DC8CEDE47A0305353E142F259A67B9E5DACF8319BAB603154A8A389C246885119C62516E2BE56FA22CA61C0EA94C26BDBB9FCC34E27F0640472A6366B7652A00CDA6A850BEA3B80DA79DC269A4187F722FCE5DB20A453BC18F7F7C3FAEBAEE025C75F525A8D5C7F08A1B6F52E148811FFF6817FEFC4FFF050F6DDE2619341020B2DB38581EC0E09A95D878D152BCE6AAB578D3CD17637EBF7208D48B4978F970CF27D6DCD13607E89E1D6A9EC38879FE6F31007DF600749E7109BCE6FECBD0323BDF577EC75903480FA0FAE047116DFE102AE1B898FC509A9B48C55A2B2D34179DB7EBF1B30567452AA7CC7E644B59AB84767905A255AFC4D065AF47716803D954690C2048C8C6DE3DBD31DDA2CCF31FBBA7FE13A6B7A0773C8BE4A274D1CE72508F80DD9375EC0B2D6C39D842C64E42E9647350F25C913D166CBAF3B11D996A189D7B931FA679BFC8DF72D11B3F5739054AB6CB0C34646307E903FA2167D231586BB560FB25D152731E2E17CBA8F4F549B62B3ECC1A70F29849238BEA1CD1FE272AF7CFF964C9D23B26482C67D802D422AC4B2278CC3AA348B6C8123BD91E0FE767283774D62CC04D2FE730449205A2D41015479C22A3C6396AC30A1A5850E883556D61FBC34F60A850E626849837AF84D7DCF10AA4590B2B572EC1A245A3C2617FE5CB9BF1CF9FF8261E7D7837EA0DD5D9E9D01E172D8C9587E02F5D8C9597ADC3DA251EDE7CF3265C7DE16A547CBA74A87949B2658E539D3C8867B988C3F3E6283606E54FD6A91F71A6D5FB59627EA671D0525692CD518198050EFD50975C172502B46C1D380E547F80EDFFFCC7188E9F403969C04DC85126489409B0FC4FED79D2E5DEA4D2AFB373D7510529383EEAD902F8AB6EC0E0356F81357CA1DE2B50F37C8CAD4D80514B47393339846671CF14E39A7C20081D905702733A48659CD2426D39086C1B0F3F3D89270F37D0727D8474914BE8A16DA3BF584291BA65015F351976563CB9C5A9CED8D46B547B2527D6380AA4B1288D22B41B0DC9B8C338453B05261B019A7182F94B4651191C51923C9DE6F78E6115FAFC2E760EDF5D34C954A03864D597AD9A4F04B805E479AD6A876F8BF73FE516546AD7F58EA786DE9D5BBAFEC8331394C931476C6851AF0B09D07C6F1A4BB6CFDFD95108B75DC78A81322EDDB01E56A381FA54039EE3C0F132944A36962F5F84654B17C0E3CAA3D0875A23C187FEF64BF8D847BF8036C199F64872ED216C2B46CD2B201C1AC4824B3662D1C2025EBABC84BB7EE9155835D227D729B24869B8623D455BC3C88A25A7E4993237530000200049444154F43D1215D269A2E24C067D3665D06A171079A0682E4F4222030AAE2BBB7A0B2CA60791FDF8EFB1F7BEBF47C51943210905A0A99996DD40A462A40056ED23D83522526A2DC5D4D10F3AF007D1286EC2D025BF84FEF36E039CF95DB30F1614735FE4DC92340725D94B30E73B4E435672A28754167B9A4B9F0ED0EAE7CAEB985AE4C9D4C2577FB41B55B71F1157190E8BA1BC071ECA85A2F0C61431F3E7CA545FF30D799626332137A8D59D792CFC4521C2B0AD8A69712C6E706D1A0EB9054C3502545B21E62F5E8281E111508F27B452BECD586792D52E73F90EE5BAEF991BFE324354BBBF884D9280AA5A6D298F0D6538946B9D55E720270BBAD591569909D0D38CF773ABD028EA0168AA35F29DBA23017BA7D544296AE2A6CB3761EDD285F0B21853B586BCCE2F7998373288C1BEB238067A6E09855241C6DAF77FB01B1F78FF87B163EB0E1965E4F169F12A99BDEBA15DF0E06F18C5399B9663915FC7FFFB8ED7E2BC85C37AFF4C4E484C5C6C29784B0221064B5C2572F0E693E46934F130007DF600B44AB7F46C6F47C22F4A5799A7005A9EB4DA6338F2B9F7C0197F00AED382CD4AB8B41E8BC259795E085870594EC659779E71E92DAA020AB612B4DD3E348AA3E8BBE0F5289FF77AD8A565805D5400CDD360E6E52A7B259E91EA53D39BC58A7AE34451F234BE3E4F473557DB995B74A225006559D83FD9C6637B277020705073CAF02C0B05FA617B1E5CC78643B066D6461F12D591DF91B9F5520F32C1D2C2949F1BB4918601DAAD960027FD2F22CBC5C109EA9327B17AED460C0C8EA0582CCAD29C7B10E60B933CE79349562611658A24E6FE6A2B5FB523BB1C504DBC5D8056F23BA15FC40489C387D9B502662A3604A0A573B09B41F7AA38E8EDAC0C9062B10E55DB5EA532D9D0B45FDABFC30871AD8E42AB85013BC4C6D1415C7EF179E8EF2B8AC789E79764771D4AB399681C39D4C0673EF9653CBD7B37FA0687B1EDA903D8BEFD1032162CC30C49CC64A38858767DCF10DA29EA233ECEB96C1D962EF2F0FE5F7F2DAE5939049B9B4FD0C7DBF211CB76092C94EB6484CD579D2C7A86B3E2A91E8606A0CF32801638E4F052404AB99CEB3B2852071D57113EFE398C7FFB4F3098EE404A4B5056F4296CD67A22D98A490627CD46F919BA29050E1CA145954EB6E18DA03A7C21467FFA7761F55D0680C5196558CC0796598CF279E86D99A5324179789C515F1D8AA38716D03F63D868F33919028FEC3884DDD51051A11F2DDB452175D0EF7AF03D82A6DA528CADEE92718BC659EF48AE0BB3EA35AA68479E396E37908501E25653B4C194C8B5321BDBF71FC6D3FB0EE1252FBD124B162FA1A9A9F87350BDC10EC3EEEA44F1CA1D1B39CDBC2A9A4381B36A3852002DDECD427190C6D0E02CB446F75BA4746CCBEE48EBE8BD311DA0737B500174EDAB415A436480E2F31C22A1295214A0185B705B212A698A73572FC6FE5D8FE2FAEBAFC2C0403F2CF4617CBC219AF2458BE661C9D2F9F8C1F7B6E1777EEB8398986A28B329BB8D2BAE78097EE6B6DBF0E8C34FE2739FF91A9A918B90E3374B105A31EA15078BCF1FC5EA8B96E1976FBA1C6FBC6ABDD400B80B3D25A24AB9A10BA632867DB180E52A47FE79FA080E6337FA6C4071A671D0BD0FA65AE272091DC165618A2BC2780F0E7DE97FA2BCF7F3709A3BC44A423228D0BF41EDBD47599E6A2DE386A504E8509A51D84AE1A66C8049458B7B241D4175F13558FFBAF703CE6AB5C12997BE3633F1E99D8382F73A5B147E2F0791D344EB9DF0E43093C8ED49FF39E5B42DE0B1DDE37874CF14B2CA10023670D80EBCC4C248B9025B803712458602BF148EEB2B30D5E9AE2A02129C15B7DBAAB1981B89EF7126BB8C00CD2845EC95F09D871EC1E557FD14162E5D8C3826F34AACD1DA688BBB892B4811C15CBE52D19207D1EBE85953005A126595D52BE0569239D9895B7B80288F0D4B4B0109B2F4D2C8773E514D2A1DEB50D901A5EB52C7A2207F1F6AE3237E36C1DA8ADBB0A23646DC0A2EDB70212AB0519DD88B55AB87D0D75F116EF8FBDFD982BFFF3F1F439606F88D77BC09D75EFF527CE54B3FC4FFFCAB4F22CC58B40CE1D887F1BA3B5F8EF7BDE71DD8F293FDF8DDF77D107B0F4C21CE485DB4D08A5B98CA6C0CAE5F81B5D76EC2D5E7ADC0DB7FE64ACC1FCC131935DC45B1AF37449082381F03E93CEC6DFD3EE191F3FCDF6032E8B32983561C9A549DB9AB34B5CC7620CE67253F8235F15D1CF8FC075118FB11FC780CE5A28738619187D56C1218EC12A4B65901B4EC226287A2DD4D321F5ECADD08A5CD0C07B22548D6BF162B6F791B5267991C4F71D41CE5B2FB1E9C8EAB5B47D0AB82DDD1A93DFFF17BAA3E21673754E154CD30FC23B26DECAFC77870C7114C240E22BF282E73542570AFBFB2CF2E345568A34115C3435E575EA395144A67CBB459F1CD59D446AB3A21F7A5194692E5B5E20C416A61CFFEC358B3FE5C2C5DB118F5462AE6EC0A709950B24D59D311DAD65F58541D6F55A4E544A0C158868BDAE544680F39CFEE24221BBDF267DA46947FE6EE742CF0C5047202B0B60CA57DA8F2E3605193C6FBF9765789066805FE04681604FDB08D25434BD0E754F083FB1E40D09CC0B9E72FC1CD37BF129E5BC67FFDA3FF0F5BB7EC816DB770C185AB70E9E5EB91A4057CE52B9B3136D91693A6C1F2145E7FE7CBF173AFBB1DAD9683BFFCE0C7F0DDFB370B85E2F50558B0743EFCBED5F8EEB6BD587AEDE558B27804CB06CA28F57B1818AE60F5B2A558BEB00F4BFB520C7840C1027CDBC6BC725128AADC0EEB19B9C4A94A2E0C409F3D00AD17B4FA82F8D84B93313C9F00DD44F4E0DFA2F9D04761B7F7A0C81D50586892244EB7BE8A89BF6A6FA5E05F38632B446A2B8B4C522102BADC56A9782EFAAFF94D0C9C4F13FE41CD7D2B72451E745BEDBF67E5AD58EA57672438E72344605937F248469901A165E1D15D47F0C8FE36B2BE61DAFB8BA11437DB2D95184365E529A1A549BEB62555323A95408BA715B5CC6188A8DD4212B61036AB08C8DD5A2EAAA9879D8726B06BDF215C76D9653867E50A05BAB6E69045BEA3A41632CD6AB14C2E25EB7853698056748656690885C1B72A9960BE038A6A38C98D8F14C5A16472DAA18E4E74A4393A56A1CA8D2E4A08F85466D0FC48293958B053CA8D14569421E57655E30731E858D8B4FE023CF4FD8711B6623CF0BD6FE2F6D7DE88A9A909FCE63BEFC23BDFF9E7D8FAE441B85E804B5EB20A6FFCC59BB178F122F87E1FEEF9F03F61D5EA35D8B86610AB4787D0DF57466615315507BEF98D6F637C6C0C3FFBFA576374D5423CB9AD8EFFF267FF84C71B0DACDEB851F682CCDC1811DA4A66C76BA08D294294CB16968E94F0CA9FBA021B968F60F1401183250F059BF755797173159877D9AA86ABAE6A661A9A74E8BDE34C236652693240CC8E2A478DDE994671A8EC4E379D385A819166F07C0725BF8AFAD7FE18F6D67F461A1E91FDD95C72C1521C226E2A334C470A79FC0C820B75A5AA6D5830809EC1D2EDE6617CE82A2CBFE32F81BE35DA4CA6275ACFA0048E7380CEB997E9D4534BEBD4EEDC6A09A0A467161A4986C7F6D4B17D2C42E49741CB28169C2A2EE0B834AC52C150853AD501987FE5DB5831A36531306E3510B7EB88C3400A69641628A3DB399560CBEEC358B5762D2E3E7F03D885C813A00995BA6F79FFA29E03258B56FEDCF98A45CE387712CCB3658DDCC215F7FC4C191FE5FE1AB911128B85AA3828AE736977F76DD97B3066E18F593EF7FFA3BE39076882768688CD29627C64A175B086ED3FFE21E6557CDC76F32D78FCD12D48121BBB9EDE868D1B566068B082B7BDF5E770ED8DEF44940EC0B203CC1B4AF1ABAFBF1E575E71BEEC37687B152920169C108EC5EDBB94D7387C07E54A49CE9F5D94AD26F0997FFB01FEEA6F3E8389D44269703E2CB788C469A150CCE0152BF08A7D702A7DB0FB4A887DAE744214AD08EB978E60D3AAF9B876D3326C5AB50815CF8193A424049171C721A1006D691F971DE7734096C953E7479D31738CC1DDEBF3D25B4037007D3665D0325CE4614BC5715FB5EB12A00BCE3826BFF85FE06DFF17E92424D8DAA44174F59E52A3AE5B31470B1B90992910C095FF1935B08953441303289EFFF3E8BBFE7D80B3A0EB0A36E70076FA094D1BF72772AEF91BD96527C0CCDD63B8751570A016E1919D554C242E22C797860E5A085508228CA9AE942AB9620EA53D5527D11AC7885A0D84F52AD280A641B1C8CB1AE49CDD129EDC378EC42DE3E24B2E46A55492FDD469C8AF0A8EAAD0C72EC11C8C73F5456722D0E0DB59C468F095A9262F06CE00E5FCE7AA65BBEBAF212A0E7A38E73CB3502009B258991C45CCC6B91515FF4DAA83323B6E36C06C9A7ECE69113FFCC68F31B6E7495C7ADE6AFCF4CDD7224B5AD8BA6D1F6CC746A1E0E1A76FBB1A412BC6DBDFF9D7A836D9E0C30D7BC770DB8D9BF02B6F7835FA0A162CB72220ED58DC1D9DEB0647F4D15E516D6EECB9B469F5B1775F15FFEDBFFF23BEFCB50791794544A98728A52F490C2B6D21CD5C387E1976B10267A80C542CF1BB9EB770093C2B40C16D63ED8A215C73F979B870ED4AAC5954C210179132017025A2B2E78E765A5BCE3E27897F8EF106A08FEFE93CF332680234E98854009AD90E3963DF735070C730F185DF86B7E333B0E972AE377D557B016A8F0971C3A3B2C3829D70776E3EF8BADD5878CB1889378C09ACC0E86B7E0B18BD19B007CF0C809E6674946BBBF538E8484D9E8D58E453A32821E1581D1FD538C523BB26B063AC059407C5369444BC27895C77E9AB3AF67416AD7D3444734CD0D63AE776BD8AA05113D5068F520B63B4ED3276EC1B033C0F175E74310606063B1D70D4EDB21351DD3B4E09CCA6959E3907D7DE512E3C759E316B80CE5F9767CBBD59F3F40C5AA93A4485412A464BE4C4609F3A68F2D01133EA48B2644E3874A86BB3159DB2CC3046D26AA2E25B38BCB786EF7DEB7138D1112C1D7670CBF59763C1481F2C7F1013B526EACD00FD25073B9EAC8A0EDA2F141036A7306FD8C55557ADC7A6F5AB51F65CD45B317EF4E3C7D06C37B17AF56A61E36AB52A6C2BC3F0F020AEB8FC52942A05D45B2DDCFFDD27F07FBFFC200E1F1A43FFC07C1C1AAB61F3E61F60CD9A9578C9A697E0BE6FDD8FFDFB8F60C5BA65B8FAA697A191F6E33FBEB2196E2905DC08C5E17EAC5CB70A2B4717627420C1D5E7AEC2CB2E588791324DC514AF9F6FF849F330B54C5203AE6711330D74F442ECD8406432E8B32D83E676466C6250CD06E4D88A2C7E784730F185DF85FFD4BF035643C0C161612F6F649036431609C9C5014E07A0D50B9481528AA6BD10ED91EBB1E48EF7018555805DE9D18C1E7BBC9DB6577456FBB9D6B5E74C3ADCB8D670CF729202B25CCAEB6A61E4B838D00AF08D1FEF41C32EC2EB2378B26097A050F00528A97966A62B6DD37965544F8802ACA40BA21071BB8576A386B0D910E3A3D072504D6CECAB26F8F1933B71F1A68DB8EC928B44E74C028ADA637A48B802D08ACB8E95D0EEE8009DAB346664CC7C6F4E69CC343AEABAD1758B7DCF04E84C9424343C123F0DBAD131BB8E62B45302768842BB8D5212E0D20BD6E2C0AE297CF6D3F7A159DD893B5E7D2D6E7FCDAB70E8480D9B9FD8832F7EF57E54EB6D4C1E38843ECFC7EFBCF7ADA81413D8718072C945FF6009B65340C1EDC787EEFD5BB86E86D115CB70E9A597C2F7CB8291D5892AFEE99F3E85952BCEC15BDFFE4654FAB859B28BC9B12A5AF506CAE522C62742FCA75FFB7FB07EFD3ABCE9D7DE844FFEF3A7F1D0833FC26DAFBE192FBFF91A8C4D16F06B6FF95D387D09FC7E1F838B57A19A661858B400F3168CA0BFAF80AB372DC66BAE3D0F17AD1A81CF498878CC159668E659AF513EE98A0E9B5E1DCA5732F9307B56A73C03D0671740B330C74A3B2B4FE499C96F96BC18BEB50F135FFC43F84FFF0760B594CA42E475AACC2FCA0F36B911A02DC04D289B53A6FFD4C692DEE3501BCF9662E4D277A074C5EB017748B5766BEF82D306BEC77DE0A3901CD378E1EE8775146A9A43965D68E487B6D8886E1B6FE1DB8FEE823BB40076412CE19125114AC5A24C92F4D4500F5F8FD1914C67D2F32666F4D43847AD26DACD3A4216089304F5CCC36456C4777EB44538D35BAEBB1A03655F6829B14EB2556BB24B599EC8E6C8477372E81299B9B2A397C6C80B93BD19F36C7FCF9B4D728016D739F2E4B9844E8A7F7A9357D9C28A5B55916B8E1066B40B65D12D4198B590464D0C044D5CB062092EDDB40625670087F605A8D776E3C24DABB074C9285207B8F75FBF8BBFFA9B4FA1560F51B633F8691B7FF167EFC15039442123CFAC1C491C7F1849D687F7FFD17B71E7EB6EC305175E8C62A90F43C3231277C74AF1977FF17778F8478FE3177EF15578E5ADD7A2E81230538C1D1EC3C8F002140A05BCF92DEFC0C8FCF9B8F3677F1E070E1CC6E4F804962D5D8482EF20890771D75D7F0CAB18E0A657BD1296BF089FF8B72FE17010C25FB41CA3E76E42C59FC08A91046F7AF59578C5651B848376C45D8AFDA4D4602BCA90D24AB5078E1A64BD233007EAE9D9F48CCAA201E8B30BA089A8F462E09E6F6C16A1A2A0E4B5E135B660F2AB7F066FDFD7003B906C4C6DFCAAF462E2E121197424838876A5D2AB2DCF3C7751E102DFC184BB0EA3AFFE1FB0175E06F8DAEFF98C02E8A3D018DD7A9ACE7754E6ABE055819F453132FFF42CD4B20C0F6C9BC496FD47D0B760A972A393892E96CE4D2A1C64DFC7AE51B47C962E194A0391F0CD04E6561D41AB2916A16CFA9842098F1F6A60CBB6A771FD0DD7E1A20DAB652544F185D24E6B7DAE4C9DAA0354FCBB854951F2BD1CA095F14FB7E09703F6CCAC79F6C260CE352BB7BADC0489BA6C6946917D04B5EE59360BE09E8804E708161B5362EEBC5DC3F9F38671F585E762DE601145A78091CA42D9FBB254A087B58766ECE24FFFE65FF0897FFD3252AB84248C5070800BCF5B8957DF7A0DD68F5650E0A6B73637C91DC1B7BFFB30162D1AC4828583F08A4BF0C4137BF0F0C33FC14B2E5A875B6EBC0403FD1EBEF81F0FE2231FFF3FF8833F7C2F2E38772D82A0853D7BF7498173DF9EBD989C9CC4E2C54B61BB74FC2BC1B253B49A0D38DCA51D1E0E1E3884206A60E1E265B8EFFEADF8D8C73F87894688566110C3EBCFC3F0390BE0F4C558BBC8C76FBFE5766C9CE7C18FB8F78A923E52F7ED5362A93B71F37697DE49BF9341E7ABD80E84F716DC8D8AE3A8087D2672D0F411705D471E1E95414728B975D887BE8FDA7D7F0DFFC8F790A1ADA47522834B757776EE66A6DA8155E38A78D24982CC3D0E43A782E6E06558FCDAFF05BBBC56F91F77ECEA8E3B8D9D9B2F9C76B37370560F47A8377AE56A43ED0398E1502BC1834FEC43031E8AFDC37A13DD141E63CEC614664E123F3644E49BDC6988A6543C4D10D42610376B924107418080BEC8F4F3C84AF8D4D77F809FBDF3769CB362B102E798F7C112ADB3341BE61DDA5A7B4E3E5A80587BB1F466D03940CFC639CF546B4CB70A2510F75A892A937D72D0CA894EA93A12EE88426A2649D166E8025A86B6E044352CEAF771C385E763CDB225D2E054F45CF4154BF01DFA8D58F0FD0ABC9203D2F89FF8CC7DF8EEF71FC3F2E5E7E03BDFFD219E7C622BECB48DCBCE1BC12FBFE1A7313ABA04D57A84BFFDD0C7F1E637FF8A24145FFECA63F8D467BE8E306211F230D6AC28E00B9FFF30AA93167EE7F7FF00175DBC016FF9F55F9626AA8347C630395E836D15A49E323131811FFEE027F8E1E687B062C502DC74D32BF1F4B6BDD8B3E7295C7DCDE5628F90A60EB66F1BC3BF7EFA8B989C6860E9C6CBF0BD27F761EFD80138831EE6AD5F8645F32BB870C542BCE5F6EBF0B2FF9FBDF780AFA33CB3FFBF33739BAE7AB72C59B65CE4DE6D6C535CB031361803A68412B221A411926C7A42FAEE26D964D32B210909A186DE4B68066C0CD806F76ED9729364F5ABDBEFCC9DF97F9E77E64A328124B0BFFFEEC2C7978FB02D5DDD3277E6BCCF7B9EF39C3366881B19A6CE27CFDB46AD8A83E61107F543721783C786FCEDB571B2827E6F55D0020A4A3DA05A4DAE6C2ECFE8217BE405E22FDF405EEF66B50D7337522E673920D2CA51AC2E30B9C92AEEC8B8A9FB881B15F81BCEA664F1BF43A0CE6D4FBD5517E4FF1A0CE72E0AAF57A6F4C71EF72C1A5F15D0EAD5CCB92A47E863E17CE352D59A36D1B8453C9D555F914C468D5DDB7A40ED2CD46E24E739A2C9EE4550541A77F2335771E13EAEDBF59750D6646F3776328A954A90362D62199B8C1EE0704F9AD684C385E72E52C6F832D4E24D62AB06A480BB4C775A6AA7E4BE6A5D0CFE956DA90704839A858381F9AD541B83330573D6A1725F1547A5941CDE38B78403A8946E771845403AE74B9DB1B2646C878095468BF6521E343875EA44C6D4D5AAF25F34DD81A04E594998A27C1F41DD26A0FB317459041D62098768DCC40804787EED41BEF2A5EF11F4079831A9842B2E5B4AF59012922987DFFCE6563EFCE10F10080479EAB95DDCF7C073A4D3191CAB93098D853C70EF6F397634CBAD77DCC4C245F318D350AF1A98D178924C26485B6B92679F7B92D2D20282869F07EFBB8B258BE7B2EAFC4B79E289B5DC7CEB1F386BF94256AC3C8F505E182C9D4877AFCC11515831969FDEF8006BD7AEC55F9047B6A294EA6953D04306932BE0471F5F4E437599C26615FA2E3B0A599F255432A7DA54FF7E438EC59BF11FEA74395941BF672A6877D9168016E258B82F31801180EE20BDFF0952EB6F221CDBED0EA378ABFA09D22FEFF7DD241637C32D07D0192D48C43794922997923FEFD3D8BE1A575ED4DF60FBBF86C86F783D3963234926573B0B17A973DEBFAADED1D4707C7F232E91CA124999F4A44C2212A09AB0D48831FE20595D53CD3AD9BA2A6F110FA075352A2F4D2359047D6AC047F1CDB929CB9C094F2645B2B78B4CB497ACFCDDB289593A3127C0EBBB0F306FD1D934D697E1A425295D940142570D849ECA74A700B4BAF815B5220B426E61F53CA6BD6198B7E299074BE906288E81F41317A007F4CEAEB44E541C2EC52106486E85EDA8D0808CA835AC2C412B4D2893E4D429931839A49AA67DFBD9BA6D275D31E97DA49930B19ED9D3A730BE711835E54564D3E2CB6192C9D8C4122689743EB1A4CD55577E92DA9A2ACE983792B9B3C753585C884D903BEF7A9C05F3E7525D5DCDE1A371EEBDEF0976EEDE4D69899FCBDF77161FFBF02A9E796A3B4F3E751F975CBC8221E52E608A57F4B66D87F8C39FEE67E79ED7B970D5395C76D145B41D69A6A4D0A7F8E9B6B63E5E58FB22C346D6316EC214F6EDDB4F714188FA6143C96635E2C9023EFF959F12E9EAC5F1F9898843E190A194358EA62C2FCE272E9ECB05F32751EAD391D43277711E2472CE6DA2E483934ADB2B0A0649EC4F3C714F02F47BA78276DF89EE01B41B59251AD2B0D642DFB6FBB036DD4661BA59E944DD5B4EC339B875E1CAB5FA015AC6BDC55E540BD36D0CA77AD1C7088EBD84AC31C475DC7863D7E3FF324E0FD299E61CE5BC1E298EAE1193CA389521216069425FCA1DB5CE481529B6514610DB082046AE2AB45513258C2C860336AF2A01457D99FD61AE2E4D94E385DD8BD24E2589B6B76125226AE22E6E414F46E360579C7DCD47F8C4B51F23A0D9CA6D500CFF6525541ED1DEC2A2C6EFE57B9ECCCB6B25788A91016586FA88BCEA7770259DAB8A4F546A7852BA41E6FB2E40E738689910940ADAE5A605A0A531E8F2D10E662A839E35095836636A6B317BBA70524922D114692B4D554D09DD3D51CA2B3476ED6CA6A2B48CC5F327B064C15CF47446699F6349F1B7F6F3FC9AD7E9EDEC644CC310EA6AC2E405E5BCF6A3FB0BD9B5FF189B5EDFC0CC19D32929AB26D297A0B5AD8DE1C3AB183776347B776FE2E9A75EA5ACDCC72517AD203F10C66F040887F3D8B071376B5EDA842F643171EA181A478D96E03515922B41023E9F1F19B0B56C8D7446E3E1871FC1AF67587AF61282A1222211F8CE776FC0B2C4D2D4A0B53B42C208A2575652585340E3D41A96CC18CEFCB135CC18D74858CE91DCA29C43612F624B766D3932ED2440BF03E078B771D039D0950A3AA787D5B414F94E33DDAFDF81B3ED5E8AB22DAAC273290CB78134F834C9D9502AF05695B6ABB5CD6885741A23197AFE1709D62E21AB950F9C78EFE0D8FEAFFD8AD764539E4DAAAA7230354866358E754469E98992D6FCA4D5208AF0097E0F04E57E06964A3277E91F35C727833E831237542287D7BD5761AD6A1058656ABBDE1B4A6DE1904DC4E96D3B869D8CA92A359AD5694B38ACDB75888AF20AAEBAF83CE5AB91D3A8CBE7E45232C233BBA247B757E082B68A7A5557FB8013DDE066E160401E0CD8B934EE0110F6D41A9E2C4F280E45634868808075CE885F65200AEF2CCE7432A66E8198206552D40F6DA0BDA59BD58FDDC7F891C35975C507F1899E3915C54AA739FBACA9DC7CF37DECD8B687211541AEFDE0FB18515644221E276AD974C5037CF7C737B36CF1428AF20368568CF2E220A5857E0C9F1F7FB0903BEEBA8FCEAE3E0A8B4B983F7F11C54525D87692EEEE4E9E7FF6691A473770D1C5CB08040CE251D14827F005E4130D28A0178F1A491117B9A93B01EF5E33D96C4A9987398E4FA5BDB4B6B6128BF6306CF870340162DBC7CE6DBBB0ED4222318D871F5CCDC1D66E923E8364186A678FA3B22CC888F2009F7ADF124E1D5FAB125BA498E94F6DC95A68E2C4A70A8613A740FF56E67192E2780F511CEE352A90E0B6A6E4BF0405E63EBA36DE02BB1FA1D83EEE4AB3FA1506B9A053EFFA567A3A71AD135587546FD27CD230B5223A8C51D45E743DA1AAF9D85AE94042CA3B1A9BFA5F82684FC524F4844808D30E74C52C5A7B62F424320A98B3BE806A7689078932B437452521010402B81E8DA48EB31BAEAA16728F6376E5E45E95AC067DE43AF4F4CA62542496A022518BC7881C6F259B88AA749A287EF6752458BBEB08CBCE5CC41993C7E0F36998390B6DA9A6857356C646EE02E1D234AEF4CF75EE76FDBAD527FF8669C1C1003D584637902538A0D4C839D30D501CB946A10BD0EA6B10408B31942F954290B0A6B48853E69DCDD7BEFD73CAF3D2CC9B3585C29AB13CB3FA15BADA3AF139112E5A319755179E453CDAC7638FBEC2D0B2022E5D320F279BA03B1927619472DB432FF0E273EB28C82B5234DB84D1435879F6744A450B8D8EA985D9B879177BF6EE53116CE984495FA49BAAAA122EBC601923870F514A112938FAFA823CFCE8E3BCB271355FF8EC27282F2E508D56E5E6E713D7141F8984A86E6C8201D1A6BBB6B8CAD50FE8EAEA63DB8E5DD40DAB6368553921F15371CAD9BEA39D5BFFFC38CD873BC91859FA020E0CAD64E4B4C9CA64EC9CC961BEFD890B944DAF7C29CAA3BF79983B67DC51FDFE26E11B54762739E8BF8313EFC60A5A0184679AA38A2A3B41616627DD1BFE0CFB9EA030DBE12A0CFE06A0DD080EA90E05A0FD591F8E9EC552006D90A15855D075B750A75B000020004944415402D0D50B71907467CF95E7DD02D0A2A515C37BC15543239985A35D195ABA63A41CD117FBDC705751AD880C4EB9D6B9CE80AE75A75B050B4088C6593A746E2A8A0C28B8EA17A579559C74CE074DA05350D6D52CCBA52823D19600745B0B762A8634D77A2C1FAF35777030A671F9F92B682C0D2ABF63D719C5FD5276DCAA60769406DA909173CF785F0D09AA2661CEA9CE95D6BD19C5D12F97F340DC6D0A0E8C74E778E7C14DC21CFF9CABA07326FC69510B59690A627D94FB1C4E9D3985D2BA195C7ACDD7F9EA672E65DEAC466E7D6413B7DDF3143E3D48301BC56FB6F2A5CF7D843973C672FD377EC390F2123E7BD5395496848825E2F4983A4DED511E7D740DBBF71CA5B3334A5158E3A2E5D35876E6A94A9E97D583F8F30A48C423B41F3F4E229AC11F08505553C18886A1F8A4076099D8599D74BA88BD4D0769397E8059D3475310101E3D1F4D2BA1B527C9B36BD6B365EB2E8A0BFC2C593883E9931A4927234A0D65DA1ACFBFB885DB6EBF8DF3562C62D992A5D8199D071F5EC78B2FEDA4B35D926E7C64C51A36A8110D81BF6E1863664EA631BF85EF7CE6328696172B973C15AB25BB2875EA886CD0FD64D580518E06C9518639F039C941BFC7386875250B372A9202018B3885C96DF46CBC19A7E969F205A04FB8E5C2E6DDE879693C8922C16FF914E86475011E83B4534CB76F24B5177C8950CD99A0150EF858FE6F0174EE243E61FE64506EA0D790515B5805BA6EF28980DEB11E93239D11A5C1CDFA826A4C5BAA63194D968EBF4BAF7B23CEB225963D89B2729572D5258844979BAB886CCD52BCBD3405D58656A6343D4F6ED57A546A18572A67CAE45D2C42F7D143AEB5A899E55842E3D5BDC7C81B3A924B57CCA752137090D2CBF5E996B7E8D5EADEE7EB01B4E656F9396E5AC5550DAAA007AB36DE4CEB9C73A87384BA70C44BC36D0CBAEE759286221E1B6E1A8AF2DA90C5459CEC94B42E8399B5F0A512CCA828E4B40963282B0CD2962CE5EA2FFC9CF3168FE7FCF31671FB635B7962F516C5EB868961C48F316DE230FEEB7B5FE3AF6BD773CF5D0FF0F58F5DC0A8BA72A2B198CBC7A71DA2C93C1E7E6C1D2FAFDF4A4D4501575FB280699346299FECA2F26AD25616BF9EC2A76531B4009AE1C7080609E7FBD0B48C6A3E66D21ACF3CB385C71E7F8A050B6671E6C2E9E407D2384E05878FA6F9E2377F446B67125DF3E193F9804C3B0B4E9FC897BFF011C5B1A38538DE65B375EB16B0BB3965E61CEC6C881FFCD74D6CDC7800B40282FEB0AA8E934E86B8CF265150882FA031715625531A4BF9E0AA73983D6E0441595815FDE8711EDE94A1A2139513577F6B68D0DF4F521CEF298A438D978A524140C49061930405E92D74AFFF3DD9FDCF52E0443C7317F792578A8341E3A86A4BEEE8F8C45046AA48DD5292AEA45E4CAFD140ED855F26547906F8CA55C2B41BDBFD16C31FFF7FB118DE36B03FBFB51FA09577A4A2100C5DCC9EDCB053358526FA654D23E5381CE94A73A4BD57191159BA441E4913CEA794086A7BAF820E5C7EDA7D0E19FE70E52A03EF74F07B76C924CF16D0631B733245A96A5DA6514808791C2BAB61F676D0D7D2A45245E296CEFE989F4D4D47A86F18C105CBE613F6526772D89B03E99CC78300BEF84EE42A6AB5A078AE74AA09E90D960C00B45B25BB16A2EED049FF7D241350864F1C87A424B54B97CCD63C573A990C4CABA82B5131C43226697987D924A4E3643332CA9DE0EC710DCC6A6CC0F0D944B41A2EBFEEFB7CF75B1F65F2C4A1FCE1CECDDC7AEF33383E87A016C3891EE5F31FF920A7CE98C4F5DFFF394545797CFEAA73A8A908D319E92693D549993E7A5345DCFDE06AD66FDCC899A74EE783AB16515098879E17E2AEBB1FA3A1610C93C655535116242C61BC869821F97869DDB3883A6ED1C28558593FAF6D6EE5FBDFFB21F535613EFFB98F5055954FD22CA2F958828F5CF73DD299A02A688286493A7E9C49934AF8F9CFBF8C93CE609BE25C57823F14249DEA22954AA8C5BAABD562DBE6A3AC7E711B7B7637BB610CBA4E1A83B46613372C02A3CB193F671C4B1BEBF8F00567505F1E941943C549AB0D8FD73650C64B3980F63CAF06C0FA2440BF8700DAD3F3CAF08902319178A528486DA27BE31FB0F63F47BEDDABF854B7352140E472966EE4B7465655893A862DBFEB1AB88BA42CA117D0633450B7EA2B842A1680AF6CA082FE9F0668D9B97B3AD25C91EC1A01E5161D97475741209EE7B254CDD1ACCDA1CE34ADDD7DCAECC83482646C5D5576725FC9DE535B7DA16EBC14B07EBDF83B788FAE84D1F361106F0E6586EF20FD34ABF73891634D4A6217B77DEC8DFAD97AB085C6B1A358B9F454FC59D14F7B01089E1263708925E0AAD828AF999703E537AB98079A8239D3A381041475FFACA4749B6A872169302A815B1D0B71A54B2B109695409A6669C7212E9C7326862F1DC3679B8C282F627E633D434AF209847C50349A8BAEF91605451A73E7CEA0AC6C044F3DBB06534B2927BC99931B59B1641E99581777DCF35746D557B26AE11CFC8649D44CD017873DFB8FD376BC878CA5D3D51BA7303FCCECC9E329280871A4E50877DFFD80CA61ACAECEE7DC658B386DEE294A237DEB1D0F535B57C1B4A9A3691856455E30C881C3311EB8EF118655E7B364F13CF28B7C64EC3C8EB425F9CE7FDECC91A311AC7452D12221BFC5D2A593B8FA83E7A09B593427C0C1C37D3CBB7A3545A53E16CC5F882DA3F89D322350C04B2FEFE4B6DBEFC5670495ADAA889F85EEC80675E29561EAE7CF645481CEFB168EE782534751120E2959A6E0B1E7AEE0D21E39DF7435DA3BB89A3E09D0EF21807605F06256E357DECDD29848939FDC4CEF6B7FC46A7A96FC6CB70BDEEAE6F2A7AA32F4CA51F17950196D22B4F79678F14A48E87974FA46517FE1D708952F04A3C8739AF720F27F526E37F81CEE97CEB92F402925D47B1FD09F8A4A236E6539D411A7332E2E6B22999346A04E322395A39BE23C78FACE3564F7005E2D68FF8D5D82A71557002D7234CBC1EA6BA7F7E87E65331ACFEA34C57D6C3D789C118D8D9C7FF669E42BAFEE81F7947B6FB94F4E01B4F77E73AF3B5711E7C0FAC4C6608E677E938057A98EEDB43A5F2CA17C646B6F5B988EA58CF71D53C26BC5A81F526686949321944C114A25183FAA9669E3865311CA5218D2F0F975B2C15A9E5B7F90DFDD76177A28C89CC9E358BC600A631AEB58F3521343860CE19BDFFE291D5D6DCC9F3E9C7FBDE67D14EA3E92C918D17482E6E349FE78C723FCCB454BB970C559F4260C7E76C36D3CF8E8B3EE708B93E0473FFA2E81B0CE8B6B5E5640FDBE4B2E61FD6BBBF8C14FFEC084898D545584993B71288B4F9B816987D8B37B3F9DED6DCC9A358170817B686DCD4F774F80752F6F65DB8ECDCA877AFE69B31937A606B27DD8A65C0979ACDFD0CC2DB7DFCAC2B366B164F1B9BCB67E3F3FFDC52D2492BAA279344906A7C0EB4F487A3958864677180A46D6316AFC28EAF3227CFB03673075ACA841026A91367CD2CCF70A8B7E25D04980FEA737DEEFC626A1CA04F4005A2E58BF66124E6EA17BE39FC8363D4DA1DD8978BAA80B5E350B5D10C881B60BD05E3E9BF2EA70D51C02D0EDBE46EA577D9DBCB2F9E02B72A757073CECFFE9E3FAFFFC8EB966E520BDA97811AB800107650B7AB83BCEF1484A4DB3D9BA4F558AA2D4C8588EE25D5D08CEB5D9739CAF7BB1B87EBF6FFF96ABE995EF894773A8CA54B8DC68175D87F62A1F8EA40547537E36371FA7B47624975DB8884245310D786A0C501C5E55ED5987E67865B5DC7A137FB9BF0FF6DB707FE64652B97CB248E75CB056F155880B9D848A18AA8296DCC1AC935615B4701AB62C2A599BB499568648464A23D39DA2B6BA8C8A7C8D398D654C1859AD3C928D50094EB08027D76DE1DEC75FE460D37EA64D9E4255D5505E7CEE451A868D645FD37EE5A571E992A99C75EA644A8A8BD502B1FBC0019A5B7A79F4AF2FF2F10FAC64E69471F4A5FDDCFBC8733CF5FCABA4A3BD8CA9ADE0DA4F7C944426C5732F6D61DF81A3CC9B339F75AF6EE3C5759B948706768C1923C3FCE05B9FA1B2AA8E5B6FBB877BEF7984FFFCFEF54C9A56A71254C4CDD1CEE62BA04E585155DCF80C836C26A180D3B103D8593F7D9134070F3751581EA4A262044F3CF22ABFB8E14E6C2D9F3C7F005B16FCAC7C5E5975BD291ACBD18905FD644B0BA9993189116569BE7DC56C4E9BD6882153859E4582D2B17B834C2E7DF5068EE36493F0AD2FBC772740EB6ACB2AE3B3E23816D44CF2323BE97CEDCF387B1FA328DBAE74BD392F871C8FEB02B4A39CD272491FC28B29A37EB224F502DA7D6319B6EA6BE4959D06FE925C10B80B5EFF531574FF93BD490485F7A6541F4F5E90A19171E0585F8AFDC7E364F0A97C4551C3A66D9B9497C7E8CEDD7A9619B9AAB4DF78DD8B337A07EFCFADC0DD1415F7657B8E471E40B71DD84D369D2065DA74640CB61DE9C62C18C295979E4B95CFED0178DB82FEDD41AE9276290E91DDB9809BAB9ADFBA29E84EFF0D36DFCF8D744BD3CF724C6534A2653405D0AA594A0ACB4A6167249DDB51064096A23D52A4620607761F279534C9B3135CBD6C32172F3F955010457304C301D24601DB0FB6F2F033EB7975C31EE27D69F44C9AE195A58C1D3B9219D3C631764890EA623F43EA6B55CF64E79E265ADBBB49A52DC637D653901F226507E9E88ED2D6D14932DA47797E88E2E20AE2498B7B9E58CBE3CFBC4A3858A6A472F14C1A5BE9FC939C3EA992AF7EE6838C1933868DAFEDE2873FBC914F7EFA439C72EA68D72F2463A365A53360933112AAD7629AAE4247A818CB0AB16DEB4E8EB71E64E6EC69840AF294F2E3C8E1240F3CF23CAB5FDC40BC2FEED1588E4A7A4116345BC3CC68A4FD61E2A13005931A193BA6908F9DD3C8050BA652289FADAA05723B33E905E514436F48BC3F09D0EF258096C905C9BF130324A9006430D624CF3948D7A6DBB1B7DF4B9175CC1DBC908B5B55D1EEFBCF01B42811543A87787A788D2D0196B4E8A07D63A93DEF0B846A17E218A5EE98713FF8BCFD0AF31DFDC69B01747F19EF5A36BB0A424735B38E44121C6C8F92248CA5FBB11C8DA4659112D31FF1B850F239B7F9D7DFEE54032CDE77BC71DD77F25A07784677AC5C8E970CB618421FC47A39D6B41B539CECD2197AD2364DD2BCCCE4B37CC942668C1CAA8650946AA49F8376FF2E3CF689B446EEFB03432A39F0CD796C28537D4F4A974B43C9C9ED54EA8980BC652BDE55D40B12086B3919321E072D715722B1CBA41284823EE64D9BCBEBAF6CA6A074183B36BFCE9C5121AEBE7439A5D2C4336CC2613F7E5FBE5A240F77C53878B88B743C839D49139608B6821021493FE9EB20A45BD40EABA7ACB28264C6229932559357334471234BAD9FB4254E7E594509998918564ABCA635F6B5F62A995CDBB14E1A468CA1ACA29AF55B36132A0A73DD07CE62484935056103C3D0D9B7FF20CD873A7975E326B46C2F4B17CE63FEECD3D1758B94D64342C43B7A899A2854FE33699D3B6EBB1DBF9E60D5AA55048225ACDF7880632D29CC6C8635EBD69048F672F6D96711EB8B52595E467B6B1B8EA531715C233FBDE13E9A3A12A4CB8A193D652873675572EDAA3399595BA58E9134166528462DE32AB9E86405FDB6AEB3775F052DD3656ECDAB3C21C4B8C631091BAD746DB98BECE6DB28CA34BB6A82DCFCA097FE90334D52CA05250893555E09CF14179DA1881E7D14D54B3F4970F472B27A19AA8D98F31A785B47F6BF71E7C1003DA872EF77F5746D2F046B684964D87EF438195DC0390FC717A4570C73A429E6F793364D34C350A3F1025E224B55CA54C5BDEB8A977627CDC4B5EFED6F13C4DB43805E4DFB791A10C3B1F13B2666BC8F634DFB49F6752BABD144264B5BCA60737B96F18D63B864F9FCFE2941B7BA1FA8A67300AD36C7FD46FC83951B83AC41BD2414E53A37C8F428378CE2DA853A642DB777A1A2ABCC8C3B88E2D8A42D99144C61CBC460C6C44C2409683AD75C7201A5411F3B0E7670CB6D7770EEC2C95C7EFED9E40947ECF711CA0B103634C5E3264D8B442A8D9996E93D937822463223F48989158DA2654D468C184E79551581FC30D9AC3B651749D81CEF4AD2D212A1B7B78F82223FE5250594E487C8AAA9C4940A37E88E88656B127FA090AC96C7C34FBDC8AB5B76316BE2689C74925933C770EE390B08E70558BD7A0BBFF8D55FD8B36B1D975DBA9C2F7DFA73ECDDBD9FC2CA2C43EB46B16F7F947BEEB983DADA522E5871016D2DC7308C143555C3D8B7A7835FFEEA7676ED6B65C890022EBEF46CF24B83CC983E55B299C9A43314E4E7535926BED4016EF8FD93B4C735EE7F760DD9323F23A657F3C1A5A7F0D125B394939F8ACC92068FAA877274DA1B50E76405FDDEAAA095E85D49672D358AEDCB6694595274CFC3645EBB89C2C43E3580AC00DA1B353DD193437869A1085C1DB43B05274A8742E25A2DE5A77E00FF8CABB08C6A2476A95F26F1DFC0DCB7F5AB83005A55F039ED8607AEEA9C5761AB36EBF6B6D0858F80C451593A19CD473C6592CA98AEBE58B9C1B94E73B99101979217EE3D5753CB5B1C641BF9365EACEB692280EFCE1F8A9E5C005AB79238E914479BF69110595922462299A0C70AB0B34757314F9FBCE64A9783CEBA76B0B9B82AA96495E84645669D08D0AEB1FEC014616E8C3B07CEB9AA7A7005ADAA68F1D73025BE4A4CF64D358E2DCF9D16B99B74B3EC145933A552E0DB5BBB38DC748C2975F9FCF89B9F62D3CEBDDC7ECF838C1D3F990F5D711E0DE5F94A977DBC3BCEE8BA7C65DC9F882548A633C4249B309B211AE9C0AF4994551A3393A6B4B488EA9A72FCE1207A5E18C70870A035C34F7E7E077BF61D56EE73A6E9E0F365185A5DC4D8861AAEF9E08594E443261A57FED3924C93CE06491BA57CFEEB3FE570BB896EC7F1D1CB84F1057CFDFA8F3165C218FC4690FDFB62DC7DDFBD949695515A388C5FFCE2279CBB723AD75D7B2D4F3CB28D6F7FFBAB2C5E329B4F7DFC63D40EAD226926719C3CB66C3CC48F7F7223475B3BC90BA6F8DCE73E4EE384C9BCB07A0D1B5FDE4055553923470F23954A72C1CAF3A96F28E72FF76FE0DF7E70230989CD5A3889331B2BF9CE07CEA7BC584CFD7376D1E2C3EE35E7DF48A59D04E8F716402B3582022D4B511412C713327A49343F4DEAD51BC8EFDBEA02B4023AB775956B81293DA6CBDEBA89D16A0B269D23A102C2649C320AC7AFC07FE697B07C43DD440FA5157AA378F36DA0D8DBBD6BAEC0F0140E8AAAC9A92D943E57027335B635F7B0AF3B865D54A6A44F028EB1B4AD8642644BAF5EB37283736586398076E5CCEEB04E6E864F384A2F1AE56DBD5AF5A80AA05D499C50474271C8A28999A6E55033D1AE76E50B9D4E448966FD34457DF425D37CF173D76299F2129596CEA3AD64D433EB9A1529DED99D6E5421C1F2E555C8B931EF9C87864B65B8E3D9FDB6A1DEF4A0026BE5A5E1FA6A88ED67D67413B92D4B5395B565C655E0AB480F6A4AABD8B6711B99EE66AEFBD02AC64F9A406B5794475ED88EDFF073EEA2796CDABC8DE7D7BECC9253C773FE59731956554A5F3C4D9715C04C25D1D351F20C8D800C45D9168585F9F8F2FC98BE10514DE7D935FBF8CB7D4FB363EB66828120A140B9A23CB2768A78AC17C7CE30765C1D179D7F1673C78F25288B4726419A20FBDBD35CFF6F376269D5E8768C803FCAC24563F8C4B597525F5D8E95C82A8B517C3E3A7B12DCFFC0F36C78ED55268C2BE5B28B2FA1696737FBF6EFE0E24BCE513B47D3B2954F8BF86C63FAB8F1C65B18565F475EC0A161442D3B77EDE67737FE815020CC87AEF90079F93ADFFBDEF718366C18D75D772D5902DC7ACF736CEF49503A7B12638A2DBE7AC999CC9A3882406E53A668C5DCB9F28686F449807E6F01B46B7224A025D48444576509F91264DBD6115FF73342DDEBC5C9C07BD3FD75A3E70F2DDA4E77B2D0ADFE5C347401D0876387312BE6527AF1CF7142C3D16D89C792A686F068EF44E7F0B6F0CEBDF30900EDEE02721AFF9CDA42EC6E1E78612B05B523C904F2D5B45B329D266EBA2E652E6A7A69318A3A18308C722B680168B78276771AEF0CA0DDC003E1C4DDB228E73EE7B74DE552D7D57E9C9EB6A3C47B3A48F6762A3FE8CE6C1E5D098B25CB97336EEC28CC8CEBF721120B792C51802812CB9B2E14A0CE8DA0BFD1A16EB001923B1538A0DC109ED91D5C9166988C45BB433A32BA2D89DCE2D627064822934F24536066280BF9B9EEFD2B189A57426B6F8ACD3B772843FD8AEAE1DCF2F8165EDE7A809838C2193EE5A459CA11AE5831932B579E43C6F6F3C46BCDDC7CE31F9935BA81F75DB2989A21418A744729219C4021EDA69F7FF9D22F696B39CA9CA98DD45705F8E4C7AE60DF9E6692C90CA15098DAFA917CF747BFA32B9E66D79E7DD486E19A4B5670D6693349581611025CF7D9FF24952E269B89535692C7E98B6633766C232F3CBD86F623DBF9E435E7B372E512E2A92C896C0ADDF0E31720CC485ABA414A1A887E1D2B13E4AE7B9EE597BFBB93704119634637D0DEBA9FE9531BB8F4E22B79E0BEFB292A345975D14A74239F583CC2D0A165E83E1FC7DB3B185A55AD4C98D66F69E2DB3FBF1DBB710A2387F858DA58C4C72E5B4E5E3F40BBA7766E706540067BD20FFAEF22C4BB8D8356622E4FFD2E13802A27CDCA12F2A731225BE97DE10704DBD76290F200D9032B714793B342840F52452B3ACC8B53121ED65BC5C5C92B121847F595BF472F1AE702872E668DFF0B00DD2F1F75F5CAB96EA7D4C3C7226976B444C8F80B9501BE349AFA120992968323EE74B23BF01A83DEA5E111252E90E6DCE9E44FE190D59CE0DF4DF67CF3D328B760B82FCF759C930550F968E0108F44E83C769848FB3152BDEDC4E34962B69F1ECBC05F5AC3CAF357120A045D532A014C99F8935C429564E27A6E64A582F62608DF1CA05D10FE9BC6A0F2A9C82A5A4380D9925C41CB54CDE5BE78CC0D631025432A43527CAA23BD445A9AF9F6751FE1D45175ECED4AF183DFFD9931430B59BA6439EB9B4C1E78F6359A3B7A557C6D36D14B55A88D65F346317DF4280A4B87F2D496C33CFBF40BD8D12833265573C5856730B9A19670208F24A5DCFDF46BDCFCD82B983D87F9DCD52B993DA39EA99347BB3981B259B31D3A7A2C5EDF7E80B59B8F72CB5F1E259F24CBCF98CEC7AF5AA17CCED37A80C79E5A474F440293431C3ADCC62B5B7628DA2493B2D0D287F9CAA7CEE7739FBC8AEECE084FBDF012D535358C6C1881960DF0EABAADECDCBD892BAEBA84C2FC52FEF29797F9D98D7792C91A989938F5B541BEF8B9AB0887AAF9F10F7F4659718AAF7FED7AB66C3BCA5F9F7A94B397CF5580ED0BE86C7D6D3BA9648A8AA175FCEE914D6C89852836224C2849F09DCFBE9FB0DA050E4219AFD838A1DD71B2827EEF54D00AA0D5EE5D00571236848376084A68ACD944F733FF81FFE8D3F8901AD36B4A78DA6195482C35A39D33867727EAA4EA934942F999DFD6E8D1865379EEF730462C00A90174C9257C8334E81D14C66FE757FA4F6BB5A6E4E81AD7063469C30B9B0EE02FAF511573560F90B42D7A1349326AF1F20D18D3A8EAD6F5B1E81FD576EB677578BCFAD703E8B7F30ABD625F19E9BB5590323A5295B9ADC0598E583A9120DAD946F7B166E21DC74844234AC5205440BB5DC882458B983A69BC02521945D604A45DA4EA0768A1360464D59F9E8FF3008D3110F63A58D5E102B2EBAF2155B6F86BC856DE110E3B230A051B53D684545AC9CDC41BBBB5E518913601E80F73CE8C096C3E1AE523D7FF3B2B4E1FCF79CB97B3767B1F8F3FFF1A6DDD510A833A85019B9240371FB9E25CCC4894BCC222761F4F71E7BD8F515A5A414FF366AEBDE21CCE5E700A863FCCF64316BFBAF92E7C8545CC1B3384499506975CB94CEDF5A4C1188B27C8F3870804426A57F39B5B5673B82BC58EEDBB290A5AFCEB875650535EA0169B8448021D3F66A680D7B71CE267BFBF17530FC8765201F4673FBA820F5D7A36E9BE287BF7EF2365690C1F399C9E9E20DFFED66F693EBC996B3E7C01CB972C61D3E6766EB8F9018EB5F529280DFABAB8FE2B575114AEE5A73FFA258DA3CAB8EEDAEB78E8C197B9EB9E5B5879E13CBEFE8DCFD3D39BE43FBEFD6FAC5C7936734E9FCB1DABF7F3D8CE5E8A02716AFC1DFCE2FA6BC857BE292E3DE8328E6E21E09E7F1E709F04E8F71640ABEA4F970C414B8D74FB6C8DA05FA2855AE8FAEB37F1373FAA2A68D7AE32A75A106B4D57D9A1D9E27FACE17724C9C3C2D26D2CC56BEBF81C9D3E6A30265E49F9FC0F8151E301F4FF10BD91FBA84E4068D78F53D232329AC68E633D6CDC75989A8631CA6323AB19F4A6D3F42492388670D1AEE6598E536E3AB0BF2FA32E86C1DDF41C3FEF2928DE2646BB8A901C40BB1ECE4A61A3ACFCC1CE64B0E25122C78F70FCE06EA29DAD6AE4B8CBC9E760329FCAEA6AE6CC9AC9E89123F12B125B3C323C8016A016DA44F1D16F04E8816194011AE3443BD15C9495FC5CC9EAC494DF74A9974432AD067CC4DFB9A2B080A91347E37362649311CE98750AE5A152F6B444F8F16FFFC0A253C63363FA0C1E7A692FDBF71E24E4877C43E39C33E7D1D37E94C963EB49C59314951472A0B58BBE680CEC20CD3B3772CEA2390CA92E2792D6B97BF57E9E78E6392E3A6F3E2B17CCA4BE5027934D2A00AD1F3192FCA202DA3BBA39B4BF995367CD23A9FB38DC19E789E737F1DAC657593E6F02CBCE984D50CF12CD686CDBDFC2EE7DADEC3ED8CE4B9B0E621B214535F9ED18E3469431736C31EFBF782113C68DA3AB27C1D36B36F3E4737B58F7EA1ECCF4314E9956C3973FFD69F2F30A79F695FDDCFE97676939729C505E1F975FBE80D9D34E61EDF36B31748759D36788350A478E363379CA68A64D1FAFBC4B1E7FF219A6CF9846417131BFBA672DAB9B7B69A82FA2C06CE1F7DFFC3805EA20BBDCB314489EF0D51B56C94D819D1CF57ECBCBEEDD487128805695AF709632B2AD13F44B15DD4ED7935FC37FE0217C4ECA7366F36A446930E92EA521002DD4886CC31D4905D12D35DC2106E6866390D0CAE92898CCD8CBFF0D429394DBD789B741DBB69CC462F01DDEEC7B6F13F83C0C75AB0D1596EAAA4E62683CF4D276D27A98CAAA21D89A0F4B37E84AA48848669DD0031E8521CDD49C694D2EB72B4765B84D427951B9E6A7C7A7BCCDD7E94682B9F1532E55E23582727593806C3A41A6AF8BA37BB7D379F400D9780FDD561E87D3F9D892805D51C1E285F3195653832D2E7B8A8F769B86A26291F470C5430B972C15B0D248CB48B92BAB53E0AD425EBD6414F1A296AA5938683545282929194C69022A999D4D3A2546F6599C9449757E3E172D9DCECC89C3C8CF0FB1F1B5BD341F35195253C9BEBDDB691C358AF64882A736ECC21FD0593C6F029505851CDE7F80C307F6337BE61402C19032A2DAB36F174B172F24CF2FEA8E0441BF4E7B6F1FCDDD16BF7E7003BB766EE1F31F5ACE9279D328CDD359BBE66562B13ECE5ABA08573AA0E800002000494441545F20AC5259FE72EB7DCC9C3899B90BE6D1D213E7998DFB79E0C1C7185B5DC4C72EBF90B2904677D2E007BFBA956D7B7651337C141D7138DAD243400F61C8F14927185ED9CB6F7EFA59C68D1EABCE931FFCE27E6EBEEB79B71849B5F2B3EF7D9E65F367AAE3F1EACE5E7EF8937BD8B5A38960304E4343884F7DEC1A029AC65D773F42A4B793CB2E3D9BD9B3E7B2FED5ADECD9B39DD9B327523F6A0CBACFCF137FDDC073DB9BD96F6A4C9A584BD86CE3F7DFF8288503C1468A62544BB8D2BDCB797712A0FFE1E5F66E0468A97E95304CF913BB9CB45435617F275D8F7F9950D343184E4A350065E4598656048C5D80168A43C4795EE8AC12CFABE02CC533CB63A709D3EBAB60D8B95F82FA5540614EECE01D4F39EB3C899A3A809E119387DBDEFAF10F8FFD3FBC43FF63BBCF27A2C243BD69EE7B7E33C31B27A88B3F6B48328A41772C49426C321547EF6E28DDCFD63332EA7FB2BFD138793FC93511FFE1ABFA9B3BE4F2E87291B1EE73BA5A754577D8199C648CD6037B38BA6F27C9EEE398B69FAE984D440F6105F3396DCE6CE69E32CB4DD496AA59F4DB8AF2D0DC316D098CD5DC493FF115513ED58A53F6F204C5465452B8BD3C4191CB09285B02E08EED26A364A4312863E81699741C9C34C908647A632C9D378CABDE77364EA888EBBFF13376EEEA66CAD8323EFEA10B4839856A0CFB8535EB195957C927AE5E456551315B5FDF22BE6E4C993C96A28222C56D63A508E587157D52921FA6B3ED38C7BAD21C8DFAF9CD23AF7260CF362E9C5BCF47DE7F21050178FCE917193AAC8EE953C770ACB59B516387F3C8438FE3CB9ABCEF8ACBD97B28C2CF6F7998B5EBD6B3686A03D77DE0122A0B4274C61DAEFF8F9F3067D6582E7EDF0AF61EEEE5A65B9FE6F5CD7BC8A652F8CC04679C52C37F7DF7D354561663393EB6EDEE664F530BD1588458771B1FBEEA527C5A5251622F6C38CE0F7F7E1F4D078E1334A22C5F3C990BCF3D9B90E1E795F59BB9FD8E5BB8E0C233B9ECF22BF9F4BF7E8D834D7B983F7F2ED77EE63A7C01876F7EE316D6EE3840DEB871CC3F633205561BBFFCEA0728567D901C95E15E36AA5EEE17F59F6C12FEDD2BEEDD09D0CA6FD4F57256D3821A797E8D7C5F27DD4F7E8D60D303F8EC840268F14096F69E4F7C178483D6DC8A5BAE25D3F02C3295D6D90B45557ECA3ECC4021C5D3DF0FA77C16F4AAFE6D9A7B300701B4C7ABB9BABFDC14C87F732CDCFB50DC0119F7B1646149A2B1714F2B2FEF69A371E22464A0DBD4FCC46C8DEE5882B4C8EFD4E0C83B9104BE11B8FF79A0EEA739BC5F714D7A5C8096869F6E9B689924DD2D87683BB08FEE96C3247A234A23DC91358819794C9C3A83C54B96E0377C4A37ACDEB770C6968D6688565974BAAE9A43260265F044388AAC786A781E1C02C2E2AF211C764EB1A18CF995BB9E9822995E08AC501E09CC541FA36A2790272DBFF83EAEFE9795EC3BD2CDCF7E793BC1D010962F9DC5FCD3A7703C11E495F5DB30DB3B9832A68EC69195AC7EF209E6CE98496145A98A762A292C252CE7A09E22ABD9A4C487423208A3497A1206BB5A92DCF8F0CBECDEF61A3FFDCAD54C6B1C4A81DFE2999736D2118973F9A52B292AF2D31733B9E1D7BF62FEE9B33965DE4225097C65472737FDE9018617A6B8F6AA8B28090768EF4BF3B3DFDCC4072E5DCAE233E712B761DB9E2E7E73E3BD98C904F3E74EE7D4D98D8C1E518EE5887DA82C9A85AA303184D2936C45274B262BAF37C0D32FEEE3BB3FBC8D9EBE2CF9FE34238706F139167535B5ACBAF8729A9A9B30B30986D60EE7F9351B983C713CA79D36033DA4F1D2BA26D6BCB089475EDA807F54030B4E9B44195DFCEC6B9753A442997329EC5ECAB78A311B747E9DE4A0DFFA627BB702B47220D62D55A9398E501C1AE14037C9B53FC4DA76273E2BA2B206A57A1280164AC36D040A67ED72B496D8D9E546BDBD2168496A117031F520DD053318B6EC1B1835D3A47582A389AAD3AB4B073302B94A57191AE538DD7F1EE0DEF49E2A4FD01BE0D0746593D967693CBA66133DD93C468C6E44B3D30AA07BD259BA62094C2FB2CA73D87F072FE09DF1EC6A247B90D9D260F9A25034BA9D25A8D9641311621D6DB41F3944FBE183741E3BA4AC5023199D68A09CBAC6899C79C65CAA2BCAC824530444126DA5D5FB121F67D12E2B3F684F232DDF5334869545135A43650B4AD52C15B7A7DC302D457FC8EF5AA9A45AA0E322B54BA458BC603E13EBEB70A21DCC9B3512BF6EE33334749F467BB7C3A148922F7CE7F71C688991EFF331A930C555172F533F7F7DEDB35CB1F21C3A7DE53CBC760B4FFDF505268D1ACA973EBC92C63175DC74EBCD541797B364C1220E1E6D2762867872C361563FF70CA38704F8F4872E665879087FB890DE588A17D7AEA7B5F52813C7D6B36CE962CACB0A88A4B36CDEDDCBBFFFE076FA7ADAF9F247CFE1CCB91355959EB275D28E8F3CC76448651976D0A746B3240650826085C697516ECB14B37F3936421B895A4657B40FA44867FA300262472B81088544123A8F3FBD8E87EEBF93A50B6773E6A2D3A81F3E4C8D8EB7B476505454C4A64DBB993DF7747EF2D31B28ABA862FCC4E9FCFCE7BFC1D08324F3F2088EAAE7CCF95328A68BEF7FEE52CA0CB105F6288DC1A1172701FA9FBB3EDF8D00ED6E8F845396E699F0AC3EFC01080722687BEEA273ED8D049347309C841B082B9E1B1284EA255AFA84E210372E19C9533CB6DB3C14DDB0EB4CEA5207C71841E9DC8F5339F33CE55FE020DD75AF23AD9A7003C7581A204AC3D03FFCF1CF1DFFBF7B2F6F8C505E9BA5416BCCE6DEA7D711AEA853DB62194D9614EECE689AAEB854426E94D5E0DDE3DF7BFC133FFB375221FFFCEBCF1D87DCE3B9BA6A4FBFAD541E620DEB60C84875324A775B2BED87F67160C76B6493195269875E7F19764139E3264D61EEAC59141862A69F560D2AE17615E86771134094878654D22E080BCDA14B828B00B470CFE203225FA624A228830BEC94A97CA9C5A324A91944FBD254550C25D9D6C4F0723FD77DE4FDECDEBC9509C36B19337E383B0FF7F2EBFB5F62C3A104C75A2314692657CEAD519CEDBEC347D8B4E6393E72F985B453CA6D8FBEC8BA75AF337678355FFCE8794C9E349A8EEE2E52BD3D541517D1D5DD4747C4645F7B967B1E7D9A506198913585D496E85CB472053E43C71F2C50F98CF9799E03AB1F7EFBC71768EFCEB267F74ECA0A35BE72ED2AEA6B4A4967D26EA880E510B092549715A90945A5159753DAF093148E45F7ABDD879571DD056537A254A372CD18367E23432A99F6405B869FFC585A8023879A195E5B8526C9296993F64E9B175FDCC4EB1BB7F1DAA6EDCC5F74364F3DBD1AF4003E5FD87D4C4DA3CFB0291C375CA5B514395DFCE7E72EA354F7E60EBC895E654DF6372CDBC926E15B5E6DEF36807659D5018A438CC1257A29E087BC601CAD773D1DCFFE1AA3ED65F2EC1ECF50C95DC18583969B4F19C50B60BB34894093A20664FB2702B1AC68890D7A7CF5A4872D65E4F26B71FC7522C25351B56E6BF2C46D9A3B91E80601FC3FA33ABC825CE46512D3B5FB789C079F5BCFB0518D9457562AAAC5D402B4475374C6D26475BFA242DE78050C70C3EE69700227E87DC71DAD7E67B71301DA6B164A234AA9FBDC400425BB938494AC49261E23D6798CEDAFAE26DED1492696A4D7B449F80AB18BEA9931631673A74C40D7258FD0C227409CC990D5FC98A6C8F0DC0194018096C943A91605A05D6BD18CFA9DB40270CDCA62A765BC3BA55CFEAC503E7B9A24C95A236C479830A29C53268D21DD7E88CBCE3E9D5113C6D01471F8E8B77ECFC16890AC69506027396F52014B4F9B861E0A736CFF5E268E1C86162A645FF351766CDDC3A8865A162D9C4A614198D5CFAFA1A220C094310D2423095A3B22C48D42D6EE6EE5C1B53B683DD6C4D205335971C61C1AAACB48A513F8030686DFA0A0B28A9DCD2DDC7FDFCBBCB8FA1546D5FAB8EAE2455CB56A99FA8C62968FBBEF7F10DDAF33636C2DA386555156568563BB010EB1341C6EEDA6A3B79768CAA4A3234B5F5F82685F4AD1414545614A8BFD9416E894E585292F08535111C417907206023285683924B3267D699BB5AF1EE5D7BFBE9748B7BCC6A0EB16EAA5BFDB59CDD5DCDB199221879289F52C3C7D22F9563BDFFFEC15947853A69EAAD35516F5CBEBBCF3ED24C5F1DEA13806BF1355F3A9B3C520A8003A0DD611929BEEA2EFB53F5260B6E297D46AA9A244A7ABBB2D659FED479393596511BAF97612E523548968A40D6FC823A295931C722A23567D15C73F5A351105DC5CB819E81BBAF5BC0B6FEAE41BFCC3778A7A72A5E5AA50518369B0B1B98B879F7F9DF1932753565EAA9ED5C4A700BA239A51D1566F366C32D8A4DF0568258EFE9B9322D75C7C27303D586EE7EAADDDB46F7758DBE58364ABEB0E09D9908ED2B27F07ADFB7611693D4667573B7D698784BF023DAF9CB3969FC798C6E16856125DA80D69ECD98ED22F3B8A67769DEBC436D4E599B364BC0ABA7F30451A8AE2C121432FE98C38FD6066524C983A994DDB9A884475EA2B020C29D2195651C282999399505F017921BA1C83CFFDF07E9EDF791CCBC923ACA5995F0F0BA78DA27EE810BADA3B301319AA879451377408E1503E3EBF813FAC73A0E900D515352E676E9AC4DABB48C7E238C2A587CA7978C37E5ED9B495DEBE287595E54C18DDC091437B0906FD64B23076F23456AF7D999ED656C60E1BC2E52B4FE182A5A7505E5444C6D6E84CC217BFF255EA87D7F1A96B2EA3B2B080AC3453351F494DE3D1275EE7D127D6B37D77137D7171AD73ED45FD3ED402260D71196DF7E9594AC361C68F1CCA852B66336FCE04259DD32D0DDD32C8180687DAFBF8E12F1E66DB8E367427A0DE93245D5852C438723D48B1239FAF493C68523B671C73678D243FD5C67F7DE64A0A72E7BF9708AF1AFCFDDF3B09D0FFF05A7BD755D0B92EB0C0B29D4BC1736576E180786846A0F3558E3CF4158AD307084A03487C2184AF960A5A260905A065B25099F9BB00AD92BE354379E7FA64D3A7DB44ED7CACCA69549DF579A83C4DF1D0EE4DA88481944397F47893ADDB3F3CFA7FE70EB26FF446B505E864ECE6A5FD1D3CF4FCEB4C9D3E950A694E6990B6754571B4C72C35A8A02EA037A985DD6B62A04C56CA8B4137F5F377B098B894BB50483976DE5BAA14D5E272FEAED5A9DBCD57495B4A556311EF394EF791FDB41FDC4DEBC1BD44BA7B486703C48C62864C9AC7F46953185957852E032752418B4FB348E9BC082B44B592F1680D71A513158780B10CB348FE6046A2ACC4A4DF52F486168B32ACB284154BCF209EB449A6FDD456E551566850140A93E733081A1684F248E84156EF38C42D8F6D65CFB11EA2BD5D4C2D4B73C6C45AE64C18453054CC238FBF48DDD0121A470F537B3AF197CEC8591208535B554F536B372D9D7DE8F128430A82D414FBD5CFE38122B61EE8E0D5ED87D8D9745805C34AFE61C0AF93362DE50217D01D169D329A0B97CCE68C59E3290EFB94CDAC48E452E81C3E7294A28230D545C5325C48467348E8061BF61DE73BDFBB95434D51B5FB0886FC549555D271FC2813C6D5AA0A78E3EB3B104E50F7FBC92452AAA13E6FFA103EFC81F369185643C074F05B1A294DE74877929FFEF651366E3DAC1435AEC45E9AB492D22DE79BE784A86589FA328C5C388579331BC88B1DE5FB9FBA92704E5E9FB3EC7DB353FE6405FD1EAAA0BD982601841C400BB84A4C5C5872DF9D0C5807387CCFBF92DFBB95902511972E400B204BC56D645D80167A433868E50FAD4E3CE1B3655845E0D624E504B00A47E09F742505B3AE06BD143419FB1693254F2EE4910A2EB736484EF40EC0EE44C4F4CA706F34567C9F5FDCDBCEBDCF6D60F69C53282B2EC430644B6AD0DE97A42D6A91D1430AA04F80DE77D6F7737703DE0BFA7B6F2507D0EE40D01BEE290A1BCF4FC32556BC06AB2D1A741B27932419EFA4B3E50087B7BD466BD31ECC7882A44C6F960FA77AD818264F9B455D75397646647102C602D2E229214E6E12FEEA4AE984D21080CEC8308A8C8B4B911E8F819551B983562246A16DB2EC8C39CC1CDF407E300F9F8CC8FB2C35C5EF234F59CBFA7D59F56F2760882B3FFB8F46D8D8D4CEDA751B195DAAB172E12C7C7686B6CE345D7D720E9944221D2AA1243F3F9F8C9565C498A904F387F0E4BACD3CF6EC5AC24E92E92387B0646A03E545214170B2FE42BA6259366EDFCFA1960E62BDDDCA052F100E50515AC8F891F55CB46C0E7515850A4875511C19EE14AD6ABA59A24F92F06FD73637A169BCB4FD08BFB9F379B66FDB8F133331B42465A5797CF05F3EC8FA97D63075D228CACA4AB8F39EFBA819D1C8DE832D1CD87F54A5701784B2CC9C3C92CB2F5ACE9486A104327192AA9518E4916777F2D35FDD8A4F979DA386E1F36388BDAD251ED4AE8DAD2CC6315F86F1CBE63073C2108A12C7F8EE759713CA099E3C35526E80F00457819300FD5E02E81C308A9E59DE971B4E29148798A4BB55E27132DB6EA275CDCD546A11F46C5C81B16A05AAB05897AA90EFB9369B9256EC65FD49DAB78A8D4FBB61AB817292E5A75138EB6AF2879F0646B1AAB4DD7173975F956A5A00DAF5F7C81D6BEF1FEF14A80757D01EC5B1EE4037B73EBE9629D3A753573714BF26CD32E84E981CE9CD907464F118B0ED7451F69F481AF4169B9CDD67FFD93208DCDF0AE7070722BC796C564ED5E2FDE94D370AC888CC2B2B86F9E928D1A34DB4ECD942D7E17D7477F512370DD2814A0AAA47336EFC68268E1FA9405046B5E5D064D31934DB56923C45693836C98C98EF8B7EDA5176A264C401CEB511AD2ACA67E1B4094C19398CB0583167B314E4E5910AF9C9F8FD6006D4B911CA33C80B0BE82508D83A01DD4F141FDD927212D0292D2E24914ED399C872D7435B4998699A0E35515359462CD243C330E1A5AB78E2E59D1CED8AD2934811CA46692C0F70C5C2298C1852AA8689D430ACE123AD3CBDFC4A9F6D047C684183FCA041796188CAE230C1408096B88F275F58C3BE7DDB587CEA0C16CC184749385FA5649BF8E9E8B3B8FBC957B9EFA90D1CEE4C6125FA983F732CE79DB3904C3A4243C3040E371FA5A7E3B8CA65D47D3663C64D2212CFD0D5D64330E0E7A1275E61DF9EED0C29F373F1D2392C3B6DA272DF13DAAC3D1AE0F0B11E74DDC0CAEAB4B5F771EB6D0FD2D39B563604928F298542DC309973D1994CA8CF674C7E8A4FBE6F29C1BF0168D75746EAEF01AAE36493F02D11FA5D4771F4D776B9C10A57B62032BBBC90E79761F780B98383B77F93F2F876027694AC17C5E76EB1A5B1E8E615E6A41839AA4301B8C235D1D442863CFA7CF584C6ADA062CE353879A3D07429B1A47C7123A75C758837BAA27059FE973B33DDE77ADB37D51A175EDC2DCC656BBCB925C60D773FC9887193983CA991806693312DE2598D83DD492557736D51079EF0042AA3BF9A7DB357E3F2C46FF7D69FA892F3F51844759C706E79EA16B54B515ED4367E5D232D5392423325FAE86B3B4467F3768E1FD8474BD341B2FE52924629D5A3473363DE1C8AF30238665A49EAA4692836AA99B418EDBB66496931CBF7941D3816995814D249F44C8A698D0DAC387D06F986F0B1210ACB2B698FC6696A3BCEA13671DCEB52664A62B13561DC08664C1CC1A4115590723FC780213B2B07DBA791F169FCFEA12DFCE9916DC4120952991445C52544BA3A185A14460B97B3E77852D1647636413971E68DAD62E59C911484C33477A58844BA1839BC8621794182B2EBF105F0E7E793F507282A08216E80BE4010CB08F1FB0737F097479FC34C4528F3F7F2A56BCEE6DCB39611F4E7ABB4F40D3B9BF9E67FDDCBD1F6043EF9F893C799D850C8D7BEFE254C1B6EBF6B0D9BB61CA4AF3782EE6408871C6A6BF3F9EEBF7D91F2908FD7361CE27B37DC466B670F5A36495DB1C91F7FF1350CC352693326416CDDAF06C26C0AB028E65737DCCD5F9F5DAFCCFB2DDB51B2BF84CFE4CCCBCE664C95C6E9230A5875E66C022A62C73B135455639315E9A5E2AE4F4E12FEC3EBEDDD06D039731FB78E1ED8CE0B7F9717928C3BC1C604386D245FBD89C4EB372935877825AB0C4BB1B4F44E8C5C432D171AAB7E59A930DCB41619959609AC845688563195A2799FC43F6C31E8794206BA882C5560C06D1AAAE1558571AE7CCFFDCE3B04E813E8054701F4FE1E8B1FFFF9418AEB46336FEE54826A043A8B903807BA527426855377ED43DFD1ED1DB8D9B9A3E3DE02A50278DDF058A56871CB79AFAA973F72E3BD02D2728C25785476206AAF8E26DBEAEEA37437EF61F74B6B88F4A5C81022535CCEB071139934B691B0DF8FA6E47332C221FADE8C4A3191B25ABC375232C22DC72493C49F3531CC344E2CCAE9332673D6E93355EEA02F58CEFAAD5BD9D1B497E663AD6ACB7ED5A597D2D4DCCC9D0F3EC8BC39B349F77631A2AE828F5F7D294165C865A99415A9700F7445B9E22BBF637B5FA51AC397A829CBF12BBDBD9EEA5352353350A4CEC3A096A6CA97E6DCB9E35930A946E9F2FF78EFE3ECDBB38B1143CAF9D465E72B7E3A1B2CA0CF3688581A663C467D7931E5436B48EB7E7E7FFF46EE7DFC058C6C8A52A3836F7D6A258BCE3815B400712DC48BAFEFE0F35FBF5735EDCA43262B16CF64DA84A18C9A3085E75E7A9D1FFDFA3E8C4095B231D0AC34012D856DB6307FCE68BE7CEDC7D53179F8A55DACDDB0837DBB76E3375BB9F3F7DF26E417CD4B064B0D83192A0DDDD28A698FF8B8FD9EBFF2F4731BC90B0425BA9BA4AE93F25B2CBB783163CB1D964F19CAC25326286FF0012F758F5254678214392701FA1F5EA7EF4680CEC9745C55860B06019F4138E82538483828499CE3CFD2FDC067C933DB7074A1354C25DE3FC17F4255D332FA2D278F1A045795825CFCB2A5731C43C502247C15F8275C4EF1CCAB30C223400B7A55B88323DC602EEFAF1FA0DD6DDB9BEA3EFFE1A732700755906B8EA2325A531ABFBAEB290E441C56AE5C4CD8B6C4939D94A3D3DC9BA1A5CF549E0B27D83BBEE1B9DED81C3CE199DE2640E7EAED9CF9522EF1D07D985C6370B009931227BA5A721904143AC290741CD9B3B8C936562689D97D9CA6D75EA6FD5013C958941E3B88AFA48AE1C31A18397C38F94191BEA531B3E24467AABF8B524334CF12F125BCB43C4BAAB793906D32B4B8880573E730A46E28B61EA2B52BCDD34FDECFCA734EA728AF503527A74F9F423295A0F94833132636B271C31E6EB9F34E2EBDE232664C18457571908A50480DA924D0F8D5E33BF9C6EDAF1132B28AE736B57C742388664A3BD76D90CA3965D826412B454DA19F99A3ABC824BB38D67A80B021ACB7CEF279D319515B453258C1D31B76B266CB5E92DD1DCC1859C7B59FFC30966EF2E05F5FE7AF4FAF51DCF7F861857CF9DA8B686818AA766E71238F879FDDC637BF772F61BF4E6528C6B7BEF219EA6A6B78694B33BFB9F57E3A6229B28E9F6036A824874636834F8BE1985DAC5C3C8B0F5C710109C2FCE14F4FF1D2DA8DE8E9A3FCF6C79F65584DB1440FAB54F8B4E9A337A22BDEFD967B9F60F3AE26B27A10C336D410554CB7281992CF5967CD665A6D888B4E9F407D6D850AF571D37B646B95BB5EBD85FAA49BDD3F4682772340CBD0895BB9B92A0CF1E408F97C8403C223BAE0A0720763AF72FCE6F7536CB77A60995521962EB0A8B20DCD91955CC0DB0508F97E2E67CFED040A57ED90D60B38EE9F48CDE24F51D270266845AE91BEEDA851DF7E9999375CE21AECBB8AED77C01C789E056E0A94783C48B32DE2E8DCFDFC366E7D7A0BE75FB8925115210C5DB4D03A87FA2C0E7525955638374C73C2A7DFAFDA780B1AE31F15DD6FC97EE4267672D5B1BB58B9D22BD7E7E4445D55CEA743D82137B1DB4D6291F76AABE3E57332D8B11EE2EDC7387E682F070FB772A4A5033D98CFB87113A9AF1F4EC0D03053096C9530ED8E7167D49734892D458538F128F515C52C9B7F3A5555D5EC38D2CEB69D7B9935650AD5253E6A2B82F8FD0538A2CEF11B6A043AAC675533CCEF17C99A8FA696767E2506FC93C7F2910B965059948FF008AD3ACCB9E6CFF4F675ABCC47D329C091455B93D807652642C88A531474282E2AA1A3F5183E3342D08E70CBAFAF67ECC8612AFFF0C13B9FA4ACB898C33D295AE3695AA226BB77EE27D2DECBE2B3E6E2374C7ABB7BA9ADAA64FAC4718CAC29A7A13A5F71F7B6A1D36987B9E99E6DDC7CD7C314E7692C9C52C3FB2EBC9058DCE60BFFFE4B224E1ED9804E36EB10C8FA096886DA75189A341953F833C738EFEC799CB1F02C9E796E2B9B37351339BE937FB9642EABCE5B4232D6AD0CAD8EB624B8E94F7F65D3CEA3644305A41DE9A186B0D36E6F2711CA306DE6184E9B3E923327D7B26CF668957321CBB41A8C51AA516FB19686CFE0F3ED6493F0AD81FADD08D0EE36DAE590C5D14E2AE990CFA0C02F55ADDB7C1006C2486FA7EBEE8F11E8DB89E148FA8A979BA712543C0E5BC0D991F11459DD4D0FF8C564C915FDE79ECBD442F4EA75949F713505632F84E05055596B429DB82D0F57F4EBC5805BDEEE4DF1D96F97DAF53E144F0AADF85A01E8946EF0FCAE0EFEE3CF4F3065EA54CE396D124E3685AD1B1C8DD91CEC4C90710CF56F858F4AE636F8F9FFDE0B71536A06DFBCB0ED13C896379E49390076178501F0750F88D0496F04684F2DE381B85B7DCB2AE48915D53FA57968423A46A6B793D6DD3BD8B3752BDD890C2555B5D48F1A4D5559999A4CB4D20905D0D21C14BF0D01694D74D3C938A16C8673E69FC684310D1CEFE9E3DE175E5389D9D75EB884DAAA62159996F695D21E73686EEF54CA889AA0C6A431751485754C2DC8918E5E7E77EF63643209AE5B712AA74F19AF9A62BD3EF8C11D9B58B76D1B695F909E88437B4F8A84A750F165924CA90972EE6913A81A56CFB32FAC27DADBC9B8DA22FE3FF6DE3B4AAFF33AEFFD9DFAB5E91518F4DE0136809D1409768B2A9428CB56B3E4E52CDDEBB8A438891D47B937D7292E711C3B766CD96A962C52A6444AA24491144991040990041B00A2770CCA00D3CBD74FB96BEFF79C99010836E52FC9336B8104E6FBE69B53DEB3DFBD9FFDECE7F9FCC76EA5BDAD55F1F2FDBB8F303830C2A9BEB3AC5CBF8C9E254BD5B5E5AB0FBDC6BE3DAFB06C5E3BBFFDABF770F9CA7934663238418C253A225239383E7D4186FF7DFF6BFCC3F77E444B1EEED8B8888F7DE803ECDE7D96FFFABFBE41C96B52DCDCB66DACAA98065BC4B6D87C054AE5CBD47AB9F68AA56A6575E66C91FBBFB58543BB9EE543B7ACE2B39FBA874A7184D0CDD17BBACA57FE7E0BAFEF3F4DCDF1D50756C6EA7DE1484555AC0E8B5B365FCE954BBBB8FBAA55ACEC6924768DE8ACA42F4692765A7B2691E730B9D24C93F02D23F4CF5E80369969CA1830013A5065B7829F51AEA60469690A3AC1498A2FFC19A3BB1EA239EAC70EA5F495DDDB8405A1E7290CA12E2B46DF4EDA71C6F5DB4D106E095CD20F74A95A4D38F3AEA2F1BAFF0BBB6D03B1DDAC9082E12748363082531B00002000494441549E78675966AC5CFE29CE1BE66B5AD7FA6277E3821B311558051717BF148BAAE57270B8C67FF8BB1F50A987FCF34FDD43502F29063852B375A860B01252777DD5139187431A9DF2502AB09066F7933E8D46FED19CF7F9DE8DA64E9F3A74730653A08679C53C58E968B7F94ECADA98AE8E77FE07A570900C2D983CDBECABD24BF2A4C987C1DC4543421A7CE5E30739F0CA8B9C38D3479829D0DCB388853D3D34DB116175823814B823543E71B516AA30935F1D67DD82D9DC72D515F80D2DEC39768A675FDFC3DC8E263EB07115859676AA9946F6F75578E2E57DEC3C7A9C288868B71DDE7FFD3A7EE1BA55B4153C1DA73F59AC72F0F03196B7E6D8B466896E3A65CBA66F22E6ECF030E5D8A277A4C2F79FD9CB93AF9C24AA55688C2BFCBBCFDCCE476E58A61A30670726749271765B236D7E84EDC8FDB15463B95E0B2996CBE41BF2F8850CC3B6CD17FEFA251EFDC1F7B964E522FECBEF7E96F9AD1651197CD167118357EA548918A499BFFAE6AB7CEB912771E332CD411F7FF49F7F9F53A7ABFC3FFFE32B54FD3623102699AC70C46D8B9A65E3591E4EBD4EA17E9CEB372EE1FA9B36F3E0C34FB3FFF0286EE534F7DEBA824FFDD207A8944609629FBEC190AFFDE3333CFFDA616A4E413729D145716C8FAA5DA573652B776EBE94EB167472C765CB69CFB93292A87569CA919F5479BC605DCD04E8B74EA02FDE4E4A76BBE43AEA9C442DA45A4D89096FF379EFE1256B68ACF65E73CBC958A74155A6019300ED895852C637CA590A4B08A43C4138B095D1AD5F84DE9F908BCBFA7049096AC6A725DB342142ACAE84B6645B55039DC4125A9360AED7C360A715B79BEABC5B9875E527B03B2E25B60B096D2852DA97AAE24970D4006D444C27BFDE4E24635A80D62452036B4A9993211B6944390CC5F0ED177BF9D237EEE7DFFFCBDFC073C58D5C1C476C15D7393430C6B0249F4A3F74951D201AC8E2B42D1E7A12A325784FE9364B969B8AF65ED860BC30D85E1874D534CA98EFBE871B2F6F95CB2E7F541236310116A35F2FAAE9F7AACA46114A644876BC9FC1A3FB3872F000474E0F10B4CC61E99CD92C2CF804F531A34C270E29625F25A553699486608CCFDD7317B39A724C786DBCBAFF18834367B9F6B2752C6C1439D966BEF3C23E5E3D32C091C132E36A4A6BE3070E0B0B2197CC0AF9F82D9770DDBA0594DD1CDB5EDAC1C4403F77DC7C15AD4D0DA64F91DC33A9967A4BF0B51FEDE66B0FBFAA06B9F9DA10BFF1D1EBF9ECDD1BB5CA92B7CA008AD0E9F4FC059C95BD370CB1F54627D58EEB31107BFCED0FF6F0A5BFFD2A1D2D4DAC5DD5434F7B8E79EDDD2CE96A67E3EA85F899804A5466D49AC3038FBFC1FFFCCAC364DC9855B35C3EF7C97B98356B167FF1F78FF093970EE07A397D266C31A8705C4A91A8CAD8F8D5120B9B8B7CFEB31FA07BF132BEF7D81B3CF993D761EC10BFF3D99BB8E6CAB5D4AB45758B2FD51C0E9D1EE5F448CC8BBB8EB37BF7614A6531BBB0287417B8F2F6F5AC9CDBC0DDEB16B271E11C7C394DCFD63EA0D1B7313D41BD64172E96990CFAAD9F9E9FB50C3AB5CC919BEC86AE19E1B6EAF8BE4D2EE31B6D671967B5641E5046ACCE5239F820235BFF924CAD8F4C54575B2B51AD0B1C195031AB47981C3A866A49FE26EC4ED1DD9010215C693376ADAC69B78162D4893DFF66BAEFFC1D626F0E1192B9273E875AC7990864CC7EA6497FBE3DC2705ED26A72D17456DA302524E312F9A763E598FFF4DFBFCAF537DCC6BC4573A80B0E1E1B2DE893C58823FD139422997634830532BC239EE5260C18332A5501D44335E3EE69363C35C09EAE99748598833F1F5336B9F0DB31AD2F1C339FFEA9C62232A93F1472929C5F60266177C84627E53164AAC3D487FBE83B72889776ECA398EB66617B2B2B5AB2946BA39A4BCA1878AD52272ED7B1C6FAD9B4B48B0FDD72036E546724338B2DAFEC251E3FC71DEFBB8E06CF657F39CB17FEE1C70CD52C828C50C7E4381C1DF5CF95CFD1563BC947AF58C0EFFDCA07A9DA2E83136576ECDACDA56B97B0746E8F8931168C4470E85CC00FB6ECE7074F6D674C8C5FC3228BDB3CFEC527EEE09205CDBADB0A355346B16D2FAB23DE325C23F87B6B531385AC8F1D56553B44B8D165BB407F35E48FFFFB9759B0780507CF0DB275FB0E7C7C96B4FBFCDE3FFB202B167712C555C6EC1E1E7F693FFFE1CFBE8FE73974B9E208B3825FF9C43D9C1828F3C7FFFB7B1C393980086D485355138D081A182353E9E373F7DECEBDF7BE9FEF6E3DC07D0F6E65A86F944CF1307FFD07BF4653A3DC03B9322E4120CF8A47396C64A098E5B1A777F0F08F9FC7CA5BACBA6C19D7DDBC8E567B820F6F5ACE8A599DFA3CE8D2731278232D9B2EF60CCC04E89F9F002DF083881E192F4223C62FB655223493936915C12EB571E818BEB3E8088FBEC4D8CB5FA47C6C0B0DC13099D004D310334528016A3257D4C02A99A4341C258C099D4BA58735E80A64E05A5906DD25345EFB7FD3BAE1C3C474AAB3F1D4A08AA4F7D342D19B32868BDC8FA46A49A10353F827D389A9BBB5E85B5B50041E786A2FCFECECE5831FB9CD1CBBBA8FC368E4F3C6B121866A12EA1C6CD19F8CABB88900AF08EA981A22E54B27CDD604E6982C51260F716A0B4F83924981CCF7CDC0C95BDB65BD356B241D0C4AFB09E97D08353BB544994F86376C1BA73E415C1C66A4F728DB5E7A9D61AB9185AD4DAC6AC933511FA312D7949F1357EBB8E345DAAD2A1FB87E034BE7772BBC33E076736AA842971BD0D3D182EBD93C73B2C21F3DF22A457C42E1B50B8E25138AD8348463E4C77AB96B49137FF62F3E4D20C608BEC796175E61F1DC59AC5D344F7D042B56C4379E3CC0571EDECAD9C11A19C7E683B76C62C3E22E3AFDBAFEDFAD8D18BA261E35B7C091DE331C3A76428D095CCF53FBAFEEB6162E59319FD6425669A09A1C88BB8A8CA97B1E2F9D19E57F7CF91976EF3A4C873DCAEF7DE67DDC7AFDA5F856C870D4C233BB8EF23B7FF25D350BCED607F9F54F7F980FDD7E19D5D066DBAB27F8CF7FFA654A32209975557AD513A3E5CA097EED9737F3C97B3F4CAE39CB9FDFBF8DBFFEBB1F910F035AE3337CE94F7E0B2F63A90942183938966B0C12EC26427F36DFFAC1737CE3BB8FD1BDA08DBB3FBC99395D197A0A11775CB68CD67C065F866E129FCF34839EB6E4669A84EFB6E2FC59CBA04D8036D31B6E9866BDA1EA186433F2A019BA9C6489CAA1A8C920C43906773FC8F8B6BFA3BD7E984C5CD56C398E2493942942611208232456CEA744572F906C5C5EAB118BBA9750F1C23AAE586DC95044761E679C15ACF8F41F12FB2B8934A027043EC111DC0B1B74C91D793BB6441AF792809E5486EAEFA726AA9643DDB2149F3D300E1FFE9DBFE2B39FFC45D6CE6F5178458D742D9B9D470738557128E211382E8E60B962EFA48335924BCBB5496420F5980D269F54DFD360AFE9C1D994F4531C6BF39A64E06F17A0DF6A1DA69A3929D4211B92DC5783535AB8B64BB526C31A023D05D8B512E5BEE3BCB0F50586CA214B3ADA58D490A11855294AB35004B14A25F213135CB77629376C58822FE3D1BEA39ACDA335979E7C4ECD5E23ABCCF37D75FEECD1D719AA6508EC3C9665065F6C274FBE3A4661EC241F5DDBC91FFCDA3D947C97370E1DE2E5ED2FF3A13B6E64517727353FC36814F1FB5FDACE3F3EF90A0507AE5C3997DFFEF88D2CEE68C4AD8E29B7DBB12D2A91F0257C9E7D750F6706C7B9FCCA4DE4F30D542A81AEA71387F63276E628D76F5CCFBCEE36BD1FA6E96C13393E677359FEE63B2FF29D079EA4B136C047AE5AC0AF7FF61791E55EF61AD9716C94FFFAB78FB0BF7740250AFED9273E4CE5DC0916CCE9E1CA8D6B787ACB4E9E7FE1054E9C3AA1E252856C8E4D972FE577FED567E93D5B66EF913EDED87F8E87BEFD087E6D8465B32CFEC3BFFE846A9E587E8E52BD815ACD25AC0454438F1239FEF6FEEFB0EBC851DADA6D7EF3D73F4DA13ECAFA855D6C5C398F5C467A1F815603BA46A663CEE9A29EFE1CCC64D03F4F19B4B8589B3BEE89D4610204FA9E455627092598099EA8409F091EA1E8389C6664EBFF24DE791FD95886770533480AFF840B275A1D81F8A6C9C86FDD2CAEC0916110ADD5F0052B8CEA124AA83B8D949D5964567E90A6AB3E0BF9F926482705FF340EFED4C59F5C9417ADF3CEC7E6D220ADD5821179126C364CF0E301E0737FFA23F6EE3FC8BDEFBF85ABD62FC515A8C3B229E172BC08BB4FF653B58D4EB05C13E11B1B9D66D3B094C09F203CC948F8D453631A87E921258DC0A4AC9F6A049AE6A80A35BFC72FBD6DB6919E944A253513354E2CD3704ADB56C6817080193DC7ABDB5FE2EC4891B98D05BA9D887228F0469DB85A251F45DCB46135972F9D4F3E2E917165C382897C3B2FBE7188D3078E70F76D37D1D3956724D7C90FF69CE681275E67342A1089008B5C8F20225F3AC7B50B5BF8B79FFC004B9A1D2AF90CE3B51AC5B37D2C9CD54257739EC1D0E544A5CEE7FFE0515EEF1DA360D7D8B4A49D5FBE7629972D6CA3CDAD51AC476AE47A6A709CDDC7FA685BBC9EC79E7A8E97B76F57F17BF1313C75E60CF36677F1B97B6EA5C50D98D3D148474B83B28A222BC3C044C05F7F770B8F3FFF1A9D4D79EEBDF56A3E74ED1AF26E8863854A772B5B190E0DD97CF98167D9FADA1E1CD9ACCB252EDFB0948FDCBD99037B7673C7EDD792C9BA64B24221F479FCC7DB597FE90ABEFFF86B7CF31F1F56138B063B60F3A615DC73D755E4BCA2D2EB2A718117DF18E0AFBE783F9E02653695D8A29673711BB37CECC337B27E6917572EEA66FDA22E7C6567241B6D0A7E4DAF0E67208EF7F6A4FCEC65D012A0CD13EC8552621B184004FBCDA877A2D826C14C839234EF62AC7098A117FE9C70E7D7C885FDB83ACC226F17B68629710DAF5A1A6A316E60864CA4032F19B504119162745C719F88A88B929E9DA3585846F3A5F7925B7D27716E01911ACCAA6F851ED779F8EC7B0DD006BB309D3D6D4A197B2FF9F688058FEC19E4BFFCF5B7C8B774F18BB75FCBF2D9CD5862A0EA65295A1E47874A1CED2F325E8F885D4FA7290D9163EA29491918FAAB122384A9703CFD699A9A0FD400AFD76E6AAEF32D33E5F3B97A936FD34F9E2600289E919269A5B8B914FA6A46AB1BA985285D5B137DBCFAF22B9C1E2CD19DF3E8C9C6542B1306BBADD798DFD1C60D976FA0AB204E23559A5C5B47B427B20DBC71EC145135567DE676BF4ECDCF32916DE1C937FA78E2F5639C1C1ED381A07C7D826B9777F0993B2F6371CF1C85048E0D57D8B97B2F97CE6BE08A558B34084D7879B61DAAF0DB7FFC00A76A395C27265739CBA5AD657EF3DE5B58DB2DFCE3066A769EC162959363759EDC7592C79E78960FDE7E336DADCDCABED9BE733FAFBFF61A97CF6BE0CA55F358BD641E6B572C26EBC68CC53EA7C602FEE4AFBE4971BCCC67EFB989F76D5C430E19C611F92C51C1AB2ABE3D4603FBCE54F8FBEFBFC02B3B0F532C06B4B57A34E402DC609C5FFDF44738B4FF38995C0B1BAF5EC77FF96F5FC4CF75508F1C4EF51EA7D52973DDFA857C78F3E574B76794BD117A2D14E3161E7EFE180F3CFCAC8A884953BE1A5708B23157DFB4913BAF5DCD82269B1B572FA13D6F7A42625E21F75708A81732812EDA4D9EC9A07FBE3268330422BACE52A69BC93F9938950C5ADD51C2345B34AD2F6954397199F13D0F30F6D2976898D84B361A25B08426E413076E92594A061A68D62D8C0E0D65AAAF98343A1C331823537D2AB169D914A326A2D6D5345FF529328B6E2676BB34F3310DC6845A9766108980FD74EACCD40679311A5E320492DA68A56F96869805FD41C49F3FF822DF79E635AEBFEA52EEBAE94A7C61418856B2ED53751D8EF697D8D33B405594EE9C8C561512A5D34A53E122AD0CD2DF9FF8204A1626E1517E67126453E687B9FA69A69BA2F76F5E63E7C1EAD35E9ECCCDF5D71AD9564FAFB9FCDBB8C2483523908DE1E0393A91E79607D8B37307A7CF8DD3628774FB01954A59191CE22ED2DAD2CAECEE0E9A9C8856ABC62D1B5651082AD433197A87C7D873E494D21E57CCEB60D9D225D8BE4FC92A70F0CC083B0E4AF95FA7B31073EB55AB59DAE9538EB3847E86871E7B991F3FFE08BFF5F15BB8F3862B55F1B0ECFAEC3955E48FBEFE635E3E3A42B1125388C659961BE05F7EFA83ACEE6E52F9D79A95E15C090E0F56F9BBEF3DC3E878919BAFB99C03FBF6A9E8D20DB77F88ADCF6F65F4D0CB6CBE6205EB17F770D5252BC9BA01552FCF50CDE65BDF790A11C6FFD55FBE8BA682674C09EAE26E0EB96802272CAB2441D56D605F5F9DBFFEDA77D97BE49C56164154A5ADC163C19CB90CF48D287B64CEFC1EF6EE39C8C4B8407D210D7EC455EBE672EF2F5CC7EC069BB85ED25B1E50602428F0DDE78FF1D0E3DBB5698B1B520E4659BF690577DC751DF373356E5CBD8085AD8D78CA704D8C9C4536DA68934EF59D0D39FFCD0B652640FFFC04E82471D31372924112B9EDAE6F200E615D68AE27138209BFD62C8B0AD6F801C6F63F42F0DA37C9958E28BE2CA22D76E826496AAAA1A1F8C8B48C320942968C528B51AD3020D2C0ED11D044A9EB6A5AAEF92CF93957128B2CA98E8F4F7D2554FC0B2C0B2FE03F4CC3EA8C095782454E6A87A49425C3BAA85B317B07AADCFFECEBEC3E33CED2E54B58B7680ECD1957F17219649808638EF64F70AE64A98B76DD3265AAEE3F2215A923EEC634577B7D89A894685BA844B652FECCDF27AB133DADF48DE980CA7BABDCCCBD31EE2BBAD9A619B46A6D9BD752268B64F64E1490AD0D7174DF5ECE9CEAA721AAD0625518ABD629C62E135681BA9727F27C724189D6608CDFBC7B334B33A6B750C6E6C0C028BB0F1E229BF559BF7C29B35A9AE86E6FD4E65E35741516CB66A1493270C762DFE961761F3FC9F844404326E6962B96B0B0AB0B3B96C9439BD08B79EDF8302FEC39C6DEA3E3CA2059DD51E1EA754B6816757C616EE07272C2E2E0609D2F7FF729F1C165D5A239BCFEFA6BD8AECFC73FF339B66E7D89DE1DCF71E7D56BB864413B57AE5F46C18BA84953D8CE72A4B7C8E1DE012A71557B249550A628ABD48A159674F9EAAA32AB45A60BA162E77965CF09F69D1866B81431305EE1D8F1A38C8D4E10D524D18870DD98B6960616CD9D455BCEA6250BCB9776B1A0A715576605641D84D233752947395E3D1972DF8FB6D27B7688D0AEB3E9EA356CBA7239B33B1CD6763470F5F2F96495C72E7D12D3DC1698F03CEC59D7D8C586A7660655DEF6C9F9598338CCC9A4A5F594C19374E6552C6972F0624A9FD93CEC015654845A2FD5E7FF8689BD0F938B07B0027137F6948B2AE43A09C08AD326015E54ED4CE96FB8BEA9C8BF69AD196FC328F628DADD788B6EA475D367705AD682DD649801C231368204D316A864A6491331BD3BE7A309934E2466B349329129E245027D541563EE2D07FCF9F75FE0F1ED87D87CDD555CB97E290D9E452442F7CAFCF019AAC089FE0A27068A542C97D0158D11C1EA4315FB51FA5D5A9AE8608E18D69AD521015A925913A3A70E54DD651218E262D0E2DB2F3CAD6D0CF6AD1C5D732F534EB452D3B44A31025719E13614FB193FD7C7F16327606294C6B8CA6025608C2CA55C07B56C33A19B25139669A80E73CBBC66EEBD7419793756682AC8E419A804EC3B7D8E17B6BDC4829EB97CFC176EA6D1A9ABF07FB6A181B22DA4FF1A3DB3DAF8E1A3CF72FC442FB7DD7815EB56CCA7909114DFC171C59BD2125D7F6DD80A0EBC63CF5946FBCB2CEC8855EBC289CD24AA04E8FEBACFA1C180FB9F7C8513A7CE70E7CDD7A98940B15C5178EAF9E7B6922D9EE47DEB1771C9A22E2E59B5481DC2C58BD1CB3452B65BD8B2F3305FFADE939C9BA8AB59AC27D563B5445766847B6EDEC02FDE7E03765D6CCF5C6D4A064E8E722832A9558E9FE963746C82D2D884928B0A199FD6963CF3E77492B7C017736526D42A2CB6B232A54EBD1290CFC89C80CB996A81E7769DE0E127B6D0D456E0539F783F4D7E91E53D79362D5B448BEF29A427CF990C8809C0A71568BA28B4F92BBD1D13A0A5369B71F57E9709CDCF5A8036AE1CC9515BF574B25B39A042B333D042DA614B32BD44F3D9A466E330F61AA77FF0C7340FBF88178C63CBE8AADA204B804E14E1645045C71525406BBE6EC64E1477354D31C32556615F15A3A9DA5D788BEFA4E9CA5FC2C92F0227AFC69D3AC69C967769D9974A30A6813BBD5F6FBA21A953F8B4EA508F47FE53258AA53670B8FFC543FCD1379EC2CDE6F9B5CF7D88F6C66695ACCC8A568718887A59C6438B5DC78654F7A1EAB8843AFC627489C5E859BCE554E254B62A0DCA8EA14AC9004EC2819E8E61EB7EA10FDC4FF1953692922AC864D449E6AC015B082762142BE2FB35B2718D5C6594FAC4087BF7EDA53A3A4A368C18ACDB4C788D5473EDD4334D0AED384191D6689CB9C553DCBB61219BD62E570717C775293B3986DD069EDCF202A74F9FE3DA4B57E3872582E2289BAEBB9603E70678E5B51DCCEEEA242A4D70EBF557B2A4A70DDB0AA9B83E4ED6E3E89980A79E7996AB366D605677878AFCBFF8E22175E25934A719BB5AC40FEA46AD0F8BB3C598DE8998DD67AB3CFAE4B3B4371558B27821E54A95DDFB8F52298E73FDEAD9AC9BDBC28A396D2C9A3BDB0CAFD8592A81C750DCC013AF1DE2EB8F6E653CF23468BAF5807C58A3A176941BD775F16F7EF59754B94FE445E51ED642C1F00D42548DCC8A950D5B4C0E4463CC76C5115D14FF6C63C2EB8454ED3C23B51CBB761DA4F7D809562F9FC3FC05B3A9B88D6C797937FB0EF7B269D306962D6CD1516E312168CE66123551C99E6526416B52A33B963245270D954DD5954EEF4EAE9A1988E3AD1FA09FCD006D52C9D812EEAFC930354067BD0B76665921C6F9DBC87E5AC441152B2E11165F66E86BBF428B354CA06C8E40C572D24C2ED0409594F849C0571DE3484A37471B4AF2FB45DB567E83EB78D4A30C65A78B626E396D2BEEA46DE3DD6089C0BF6FB05F8510CCA4E179B4E3E9B7473185692C06D3BD4BE00503B5887A987C984CA689CD92644DC3D580BD0315FEFEF1D779E98D835C7EE9E5DC79E37A1A0871C3B26E402532942D8FB205E7C62C4E0F15393E384ADDCD26929012148CA6B44C271ACB2DC9040D8E9FE4D309EB621A9A78D145F44E41DBE0EBA6144E5DC01309D9490D14C310C951A5109659D2D1CCD953C7D8B6FD058A62925B7318B30B04F976EA6E9ED0C928F49409C6698FC7B86D410377AFEAA6392B10491DC771955F5CB67C05C204461246830C8C44E5127E36A33A13F97C56E978D938A42D674C52AB991C7B4B19EEFFF18B3CFFFA510DBCA26FA1AC059137AD0A793122E7862CF0CBFC9B8F6CC617EA5E546722CEB0B77780932375662D58CA91E327E8EB3BABFAD5EBD6AC62C1AC0E464F1E6056A3CB8AB99D789EA7D202434E07FFF0D88B3CBBF30413E419AF06C4225FE8C4B8B5906C50638EDDC7C76FDDC01DD75FA66606A1536078AC482E97A32913105746A8D54C55580B8D3FA15867C96625EE3422DD2A8DD9E1D0E3C9ED87786CEB61EAE24758AED0D868518B4699DDD3CDE69B6EA0ABB591A66CC4D5EBE7D299CFD3EA27309E168892D868DB32811EA707E8C450597B3217E959CC04E89FB7006DA2586C9BA93379C0458B4307552E0C7648B75B02A297465BF38EE018A7BFF24BE4CB077165A4431A8022C328A57D6CE908AB52BEA409A9C2FE221D29A59B9127D514C1AAEA48B7E082A2C4E63AAE4EC095AC0ECE05F359F76BFF15322BC06E98DC2404F15079CD8B98B64ECEC1BEC958D3089DEBEF95FC3D25518863B53C68327423E6020E1C2CC36FFCBF5FE6E84095F52B16F1B1BB6EA4332792EB35222F4F39F2A9850E6E4EB0CC98570F8F7062B4C2784DCA5C9369598EA70FAD6C2AC2FC90586D8A9694129710ED2633F9770AC66F7E7D6A22D198F50A5422015BC691CDDDB5353313ECB92118675E93CFDA05B3D8B5E3359E7CF659C62A3113359F6AA69DB8A153843D4D5F8088C66882FCF829BEF0CBB7B390614281717C0FC7F5955E297A7FAE86923A76A1013B9357B7491512727CE5268BA29EFCEEE67C8E9AED319C69E08F1FDBC5035B0E52B31AA9267D014714F2C57E4A0739EAC46199F9E5E3FCD5E76E21EB0408FD53608E2A1E077BCFE9A8FA9C25AB54E0DF756C864E1F63F0F4515AB3361B562DA529E711EAD45E9603A506FEE4BE27383C6251F79BD5E547EE501807F8514CA65E636D5B95DFFAE49DCCE96AC0C91638D65FE32BDFF816ED1D1DAC9F93E7F2255D3467E48C456CCB25F6F2C44E96308898181BA3C1A952AFD718753A78FAF5D33CF8D45E4A65B9362175C6B0BD0AB7DD7805776FBE06B73CC8DCB60C97AD984F932FBADC2A3693CC3C2526C7D3F289F4AEC762CE6C0CE512B82EAD809377CC04E89FA7006D68629A6B696669C673B39E3478D2B1EA69295D2A71A812A5690351B2D97384BBBECEA917BE4173FDB8283E1BB19E304EBC0E45CB2269A8D9C6F5C391C94509D2320E9EC2218243DBAE12F3951AE6D8D4C5FDD869259E7B0B4D37FC166ED33CB3926D51DB4B33E8B772D14C46645305B0245B36C1DB78210A63C1178532C5168C68875C0FC9E48BD87CE947AFF2BF1F799DD16A9DE58B7BF8FCC76FA7D989A9D5451A526435054208B14405CE6B60A00E47072B9C1A9E60AC54D132592C8C02C96C6D69DAA5A0512A529506E864047DCA8BF65D476A83E08B60956D9AAE92494B55209C660BD549F16D1B3BA832CBAE72F9A276DA0B595E7CF1659EDEF21C4315915FCDE234F7507304EF37B254715CA7291AA7B574962F7CE61E0A637D94F34DEC3BDD4FEFC9B3AC5A3887353DAD747A214DD4A83A11A21890B16C5CDBC3F67C5C378BA755451DD71361239F41A7C07FFCC12E1E7EE1389ED7425D849A62913A3574409D6A0D4543BC4EF7D02EFEF673EF23572850956948D90C1452F2192E87EC3A7C8A52A9A2EBADA3E0A88468775B23B17AFB09B466868646DC6E1E79F918FFB865AF9EAB24040239C9E8B51B85D895712EEDF1F8D58FDC4ACFEC76761E38C1B79F78950327FA182F1559E48E73CDC2167EF3331F250C03CE0539B6ED3EC681D383548B326E12F28BB75DAA92A8459AD8B677807F78EC75758971AC2A4DED19AEBE7603375EB68A462A2CEE6860D982761AB36087D2B5704D7B440AAFB4EA3BBF336EA0C024409B0D5EAAD064EDA7EF9D09D03F4F013AED3C48804E071DAC2440273CE8E9FA17E922D02C504258A2015D1B25E62C83CF7D15BBF7C7D8138771E312AE8E6C9B86992A7629F753325889D1325A2EC9AF28DE099BC30CB0C82A15BEB562D8AABBE011D42CC6338B097AAEA763FD4D381D4BC8342D044C309974C49ABEA0130C560661E417AACA85893A93AC8934B99E74EBD2C59D4C422A7DCE611887EFBE729AEF3FBD8DA16AC8ECEE59AC5C369FC6C606DA9A1A69F12D3271055784E69D3C25274BD5B31929470C0C8D3351AC50AA1A7538E17BEBF3A4E76A1A3DDAA24D0E4985E9D38C5E31568CF3EE00002000494441544F43E19B54124A655D936F690F41AE6D327529D5806934CA54A8D02165F333EED52A881506CC6BF05935AF5BDD399E7E6E1B8F3DBB8DA11A54BD46326D732847421F4CA6D6EC987C58225BECE743D76DA22BE3706CB4C8CEA327E9EF1FA6AD9061794F2B372D9FC5BA66686CC92AE127721A1829878CD5E5D664F4DECBC4E9B2B94D34B82EA58CCBFFF7F87E1E7CFE14512C729B725D04CC15B98A08B7162BBE2BBEDE6BFD21FED3FBD761E71B29D663727189BC634015D1EB26D3A0F8B37C35F9522588196EACD9ED68DD65AC22EBCBC66AEC6157EF080F3DB39313831342753178BFD8B249C516D56808475835BF93458B17F0D2CEBD1C1BA850C7C7757C5A8A2758DF0E5FF8E79FA25E0FD976749C6FFC700BC7FB27C8B8365E54E1FDD7AEE68A358BB1724DEC3C7486275FDC8D63C52C9ED7CEA64D6B59BA78168D5685851D4D2CE86A262FC72BAD51D5741676BA599A9A2C4CA7D49D57C91A5D1AF9D2C1B2C91ED24C06FD8E19CDCF1A069DAC07B333278D2B090B9904839E7C213DF314D3D500614C62B5D49234512240ED30E5DDF731F2E2D76888FBB4FB6E181CB1AABFC908B5490E0CD3C1C8CC4996274D11491F8CB79AA1F7C90620714C865F7C7D186B6418F5679159B199D91B3F8E9D5F0656C1947A9226491A95F6346DC928253C8B6EAF519936FE7D17DCC68BE2D4661C5CBA7D226A53B16D864378EDD4287FF4E54739D8374C365F60F3F557B071C53C3AF30E39026AB1AB7C5DA5BCC509075C610D5739B3220E67361DA3BB61360CC3DED06EBC69951A7537D12A111F3EE58D4B5355D82AC948B966C5E667EDBA1171371B51FABC4E6BEC26AA7B86AE25D99A70A40D0EFEE0A34FF2C8D65D94AC1C7E730756B699AA060AE90B18884339D3823987A2012EC764A01A09BACA9E8942DA47F6F3CFDFB79C6B2F5BAB6A73474A3E0FBFF0067BCF8C3251B5182FD5E808CFF1AF3F7517D7AC580805F86F4FECE75B5B8E2BE758400083D15BD861881BE877A8C5115DE5D3FCF6AD6BC9347772E4541FCDC120972DEEA6C191C01612B91933C821C7A3B8B0D0E30A0CD47D76F48EA9F29EE537D0DA39876DAFEE64BC66AB79AB6C86DA9ED6C4C474E12448CB28BC910240A5001CB258759BC6F02C4B9A03BEF0EB9F54A5BEAF3CBE93275FDA4F449ED8AA624725B24199D99D4DCC5B3C8720AAD1DDD9A5D0D8AC962C0D6E484F5B9E799D8DB43766B44D3E2910AB104F224FF74E149E8B64D5E7ADE8990CFAE7278336673295169B9EB068714893D0372FBFC58249B9B5B292350B14E2683C44B9F729867EF2A73454DE50794B1114F224168722C96F7E5FA22D97743E8C029CE1428B238BB047CC71489036C1CB0839099450715BA9342C24BBF466F2ABEEC46DBD04EC4673983A1092344E3403958D23E5475F4C272E3DB90BB756D33834BB96D11A9E88602C8A79E9C8902A9EBDB8FB28D508E6CF9BCBF285735932B7939ECE46354315FC544182C4D44082990A44E967992D4AB2363D4FAD46049A301E90C6CEC8541AA10093718C6F65D4C5C368114B5809A92B7345A000D3CC154DE3F46625717F6AF04C8291300E5477D838D74880FEFA433FE2C7AF1E262AB4E337B412D859025B02B409184697DB1CA72AE9697A3FB55E0CF3C665D6D8213EBF690ED76FBC4C45A51E3B3AC2B79EDBC9B99A8DE5E6F477B631CCE2E6888FDD7C1DB3E674F2E5E70FF193D77B55533946FA1D72EF257336D65672B7EAB1A3BA146B9A22F01B39D73FC8DCF82C775E329F0D8BBAF43D812BEE2B963ACA78A1406B316376232F1E1DE1C1978F7376BC62AA16DB343363F13894DE85E8A8A474E2747C5FCE35BD07DAA8934D56CC75659A7294AE5C8DF75F7B89E2EF4FEDEE63F7D173D8B60F7199281CA140487B5386F56B1673C5A5ABE8E96CC58FABCC6EC9B3A0334F47639E9C97E89A9F37157A9166DF3BA6836FF18699003D13A027AF802CF024C6E9631B96884AC7187FED6B54F63F84571B226B093E6B8C4875196AE637A578A74F6F22FAAF0FAA0C2EE883641A8792A9A7832E32E91845B68112B2DD443D57D179FDE7710B0B8855A7573AE1468CE94DA5DF85B72D4DA5A78916E9394C36EB4C4D21196CDA2C9710588AA06FACCAF6C3E7B8FFB1EDEC3A760E3F9BA7A7BB83DB6EB8849EB6661A73596D6819D90FC3B0086468417728393E034198BC59A2C5541335ED0AD89664ACE314A2320D4199A2D5C2B8DB9EF8CD887E891C9BA3558A5CDB644C50CF322D81D3409D9E960459391F09D46118F2A5FB1EE485FDA7701B3BB1FD82EA5EABCD973435B541959A101898283D621D7AB12385AEE2C8A36BE224BFB8AE9B5B37DFCCD989325FDDB687178E0F1048134D2A8028226B15F1C23116343793CF3772683462AC261582F4243CE2C031FC70AD3CEA1A3CEB764E35ADFDCAA8B277C4817C41748A1B96B4F2BE4B57E17859FA4B0E478E1E5771A605ED5916CCED5236CA4FF69EE53BAF9D6242B371D3DC9673976A463716A5443AA623AC8139363206B29169E8176A644818CA7BB32643A64CB35DD36C7D30F49990E30F420AB99839DD05D62C9AC3CA05DDCCEF6EA6B5E09371A0BD29C79239AD34666D9DD6F59CD4CC627A72308DC7FF4E19F43B05EE99003D13A02733EB0427D3C7571FAE1022A1DD1DA27EEC698AAF3D80377650FDDA5C897EA29226D8B590472331A595ACD194EED24A93D25A82B41121920C464A5679784C1B4C0347249C580942792A760774AF236A5F43C725B743EB52A5E2C59A85273E409AF525637DD345FE13C53DF33C4C5901985CC664B94A254C02B63CB822F42F5998CA948670FCEC107DA345062A31BB8F0CB3EDD51D5462072FD78CEBE7686F6BA1B3B395B6D606BABA5A71C51057F7A3445B3A755357B68B997794C024479B8BC6E9AC1DA3BBB89BF6A1EDEC772FE7F4FC7BA90A773716A94A73CCAE15100412E493694FF91CC5CFCD99A9F48864F2A95092EB69062D23EC4F3DFB0C63C5228E5FD0D175C95BEB8287EA670B9DC560BD72D0FA39938E2F729055858E8832F8C573CCCF0734B4B6321EC1D1B198F164A254AFA68C2A8B225B54C3B5A5FD1B5389655C46A089645235F24D634F297C81EA72D7E38C327AB4BD2C0135A8D2581BA2C30B98D5D248BEA185A162C899BE73BAFE648AAFB3BD49ADB2849F7EB26C539173903523ACA07A224790DE5E6D8A48159364CE1AA0536AA69CB7307B32D4A49742A09A1EDD8D59DA9AF2CC5E308F593DB3556DCEB76B3465E5B50C3D2D0566356769C9BB4ADD14E38BAC2B4DD3444E762A0B48AA91E91C9CB7AE58DF292E4FBE3E13A06702F4B427DF0C63A438AE49A38D9E72ED0CF5D7BECAF8AE6F13977BC958813A434829AED9B150F524486BBE6202B496F63A5167862C14E650B7106181C82362A9B1AB27C1B52A5DFE2C229F3F91ED61A2E5121A576CA673DD2DE0B44A88335D7CF90DB22924138C939B4BD22A4FA568CEC3A627B9D2698493A82A412B71EE48B05E850A1C8B3270AE1CB0EDC008AF1E3ACDEB074E73E4543F956A45F592C5BD5A047D148797E0A99975AA39A73E2A38EA1D6802ABD82DB5944F707DD3293677F5B3CEDDCF735CCBFF3AB28A73712B55274FA01C725546569E7524FCF0C99333C76DC027D3F8F43D8F58F0678159346B84EBAFB9820D2BE669C0D6C6A058389984DE084125E5BE0449D3E04DA49FF4DED4938C5374D96A1096A93B2288251C765122144959B9A706DEB142D38CABCA4094A01972FCBA89460475813684F1617A1BA1AA1C4AB62F2C0C87BAF42E821A9E1DE3C9845EBD9A003036A56AA44A76EA3E1E0B354F9A82D27F1039D9742394BDC65C77B58DA80549A35660EC848D24554852889873371095BC5AACD7705D8B96E6020B449F24EB50F0E59A9AE9568F3A3DED8DB4E73CDAF22E59C7C2B34D50D6F440EDAC8CE38B6C945350D1547036473613A0DFF546F4D3BCF167B149F8D362D0E9139C860123C41312BB3206EE405D64490F70F87B7F4061780B0DD12876553226DF3C0769AAA22EE066CC5BE9183A1E6EC2A666B35292EBC3AC73AFD4C340E951221E13C8649CEF52893D4A512361CB4AE65DFF4BD0731DB13F4FD5F0A4D9A5FE81170ACBA4A5E4C59A866F7A5ACC9DD5ECD73C712ADB6939428D92A69379B685432D23DF83C598ED7B4FB2ED8DFD1C3AD5CFD9E1716AD550F9B2521E1B1A8B49E38C5AA90458A3E7E151A1B17282D5CE613E36F72CABF3FD3447431CCB5DC18FC756F2E3BE067AEDD9D88E8727CC0CF94CCFD7EC579A767ACD92B16E6D8D5A31BE23EED301BE64CF6140C6CF1005011FB8FD26D62CE8D2CC553620A13826C9A599229D34034EE77D0CE4A3024CDAC495CC56208050EFBD402E3231E948A33110CA5C48206A85B20139191CC723B46A3AD421B43281A284AED890CF49424EA52ED4B7983819274FFAC4849A824BE5603259E9458848BFE871ABAAA06EC2E24958C355268C0C20C9FD3012B8A92BBC49060C7346362999304C7551746BD4359C346CA358AB3E1DD956790113FCA5C9EA47759A9C2A39DF239B6FA0B990A3B3D1D504448A4303E12BD86F168D40298A3D49533CBDFFA623935EEF9900FDD344DCF7F833FFA402749A6E240328EAA0218A4BF2544940D587BE9FBED7BFCDC48187C88F1EA2A93EAE9C535D94B650C00CE55E522AE3F82D11306D7619F6422A1493668232982299A6B233D40D39D4A19658865A68A1E4CFA5B0F8065AD6DE0C4DDD386E13F86D60E515EB34C3EBC99D4AB2440367244D308557A6206C99FC93075E9E2D794E0D2E9B02EF261098C0280FB80C59484090610A8B09602C84FE71284E481033F86FCA99918C5A6858E2DD68DB55DC6018AFD2476EEC00D5FD8F326B702B0DF5733A4C31E6CE6730B79ADAF2DBF156DE46352B565105FC64363C951891259BAEC3645E053182319B5D32299F906E9A7290133F04418EA67AA2931E8E467D6F6A0E286DAAE9069BEC79A9D1B8C4A0244E9B4C50664E9201CA40C59B8C80944C8B2A2345AE45B2A10435F56430D75D7C21928C5DC39AA8298AE7A5E518B9DA046F97630B4281C1E4DE987B94744027A103F19654D7EDA4F12ACA8C3AC5999C98E0F092DD1AD64D122CD57CD794104245D454C1C6F4140868C835A8CD57AB13ABB185343965D97AB236D2A5EBC81592F59F365D121BA15447665A237B7AD27C1EFAF11E63CF0CC4F12E2ED83FA900AD4E2B929F980C46C2AE665DB226356591055A026B04EAE738F5E817C91E7F8A6CD0A7C47D1DA6B05DEA711D9920D3874C1A34899F9E795A25A026C60149B34DB34E09D09AAA48A26282AE8E503B596A5146C5D1859247B693E6851B8997DF4CA675094EBE9B98BCBEAEBC6FFD7403A324CEB49A112766E6536B3EF9DBE4FD4D980D6926ACE1795A962EE766E01A237873A104BF5A8B292B3032BA16F57304C543948E6DA5EFC5EF938D47C946E3E4A371851264AA91A8401C3732E2B612CFD948C735BF8EDFB90E3B34A5F42423616AEF99EC77A64A7AD34FC864926FAA2BF42D93DFBFA0BA489B8E06FA480095291AF724762F9BAE500A4D3229938641D26FB0547F3CE90898F562482BC94E90A20C534D33C59E553AD5FCD1775EF0A05DA43EBA389DF222CFF054AD6602F4855A28E925480411CC8A8FD16C590E43E98EC9791A5E72B2134E7168DEE22A4F5B54FFA78DC1E9E7358341BF75A4FE2715A0D3E22C998C134ADB6409A9E988E08FF2880AFE1B108FEC62E2B9BFA47EF4697C19FFD06937295B6B584E92554D3207D2713A19AB15FC3999B6D3A7539E0C2D5C93469EA1840935CC96EC5A9C9D55DB43446EB254FD4EC6FCD9B42EDC48CBDA1B705A9711FB9D44564EBDFA4CDC4F44A364245D82A750BF042698D4CC4842C864966DD680C97892D453FF9D3CAD09862BA316BA89A9DB89E9A49ACD40AE4915E251281D63E2C0B3548E6F2738B393A6701051FD334A0C468EB526823E1288438BD0F519F0E690BBF65FD1B9F6C35871A3895CE9E0E785CBF34D69590AAFA46FBCE8AA4DAE6D9ADF4DE6E4D310B134853617C204CD8495926CDA6613943B234D613384945A43EAF59B8C88DA019CBAA8CA9D4F7E679AAECBBD4930DDC90A265D0FE79D731AEE1337FA0BC3E3F460981E80FE88D996A6D547E9B6910C1419FB37990A95AACE4D761913A0E5BCE51505D1DF1C902F7689CF0BCAE93FDEEA5EBC75CC79D32B33017A26404FAE5C59579381C13CB0CA39D55AB7960C3298715AC2D3D47A9FA0EFB1BF241F9D24135694272D429D9A6B4DEB9098093B33D0A28FB73EE826733142F7268B36A232267717F687F988C4BC36814E624B5A380E15A7955CCF3A987D29D959EBC8762E874CBBD2B7E250B279C35ED0869923831A4E5209240F6FFA10278A739318799A085DF8E0CB7109561A491B53CE31E58B4B40AF42F924D5FED7A99FDAC6C89E2D14C2513241093F168EB3345E43DCD46457862544C7594B7D8B31BF8BDA8A8FD27DC52F93292C13AFEE4486F582E030994D1B96828979E6CAA6308B424C69B03C6F699F77426F5AF486079F6C383A669E86B7A422D12A626AC39A1C209A16832603B464D5C97D3459F5B49F9BB60F4B562ED7C038EC5C7807D2CDC47CDF70CB4D9594A0BEE61CDE141813BCE7CDEFBC20194E02B4C22312A04D73DC68B9C8662A3C7F336CA5D7F46D62EDF97B667A40E73D4CEF21225FF0D699003D13A0A7AFF3A97568169A6174248A5B6A262B89A3809C25C2F231268E3E47786A1BF5135BC806E7C80435E5B7CA03256C07D1549652D1A8B219D9C5C036743C6101185BAEC40F5002B46813A88A9B642F622C6AA2BB301B4CD22A58674C35F2099C16AA4E2B5E730F99B6B9047E13816850645A695FBC015AE78260D6B6082488DD966FE86B9343053AF130B9114D7FD8D3FD450771D56C57E4282B108D43A59FF8D43E26068E1354C6F5FB4E6D88DAC061E2E249BCFA185911EF114D08F13EB7A5729081868A6E3D6688C552E1A14A6451F31A2966E6E0CCBD9AC6059B292CBB1ABC4EA529A65F536339E6BE4C86EE0BE2EE241E7F5EDEF71619DDB49F9D9A304EEEFBB4C7C2E86E4F01F9E95FD310745E804A24BA13D3343D4EB1839ADA5092B89AC87DEAD54FEF87FEEAE99170EA075583636A6C69EABABC094E78D30531EF4D2F58BA9725959BF1F014468AD944A618E2E9394BA1F056DA3069D575610C99C9A07FFA1DE93DFCE44537CD64A34F6E812498959A282AAAD4D97BF8F0B77FAB3534567BD3D27B779F9E1E44CA727D779384A90ADC248638094A4E8588C9A4CD881EC8F02ED40709477633BEEB9B84277E823F314046B8AE8E4FB55E51369B04617D0E2C99248C35A3D4B16351528B245889425CEA2C6578248E8C540BADCBA8F59AEEBC63F498E5A7C5AC56C6C6CDF49BE0CC1248457B2F4BDD6EC16E594ADCB490BCE87CB4CE26D3D6038DDDAAF5A0399892760D24A2C127319C4D08E04A79535847BAFD92314F0C513B7B8C68F83895B37B61603F71E9A46A94D891C8B4CA079A6B2E8D42849192C0458164F58AEE4BABD18C1D9B6C33229060ED7ACA512ED91D149B37D073C3AFE22DBA436640CD2699342ED33B3199415E6C855CB8069386DA4517E7853FAF90AB193A9ADC9D27C544A6B255BD64CA5034D200931AE4E6878C1142F238C8B14A8F6DF233271D61CC77DE34AAFF768BFC1DA1858BFCF0F45839BDD848DEAAAEF57A1CD33C02D3E53DFD825FECB8D2CF9BFEDAC5BEF7EE1EDC8BBF6B26837EEBABF74F29402B9759C2880083FA009ACCC27C3B5191132C572163993C138A5C0D4F9EBE6884686C27E77EF2B77827B7E2D707C8FAAEE1BB26D8AF794825904A062D942DC99E93A106C5288D6CA8C9C66494D9568D62853D62F1E650F29536FD15A215FA97D0C834A59709B6BA360463D1DAA80BBCD14C20C23E5E0396278D469FD86F26D3329B4CEB1CF22DDDD0D4656810CA2448E80DF2EFA0021383D4FA7B290D9FA1561AC6AE15718271E2EA38BEC8930665CDF085B1219395AACA9694CBA2F427722632D8203B8130524C88321C5DE39861A9BA9F9C6B1018BDEDC0C9528C9B18EDB88D651FFB0BB0F39338AA5E97B74B00DE32304C6EAB6FBDD0F578CC3D1618C164B5D3E08314F64A7DBF260F246DC125D9B5463A9383CA999AC0F7E6CF124D15554B4EBB84C9B94DFF95E9BE703E7C901E679ABB9F7F4A6F97D1984B37CDE0E1BCC03DEDFB9384D0F4F0E47EBDCBCCEBA7D940DE2978CF04E899006D521993A96AE746026112A0A794B88C76840C2908CB40034F9A6F0914110E32F2CAF719DDF96DF2F563F8E1B00E1A28EA2C19B54E78893C674CE808CBD72C7CC9C192D0ABA5AEE9AEEBA8876193A8ED941167B20323BD19BB66B4D98C384BD32ED6C66420729C5252BB19C29AF0622500CA3047127C646ACF6B568FBE4A940509DEC2341159CC04079572D651CD862A99A8841716F1E30A8E6E128196BB41281B8DABC24BB65CA038D009404345B4A9D6C1CB37A9ABB60C6BE830CB34B70CB16452A14DE119CBDF444829D1BA93ACBB375ECD92CFFC0D64E7832B94C28B68645F100CB408F8296B2EC34933C72E660CBA0226A180691317FA1EB9F7C986A3B17F1A2F505F9BCE9B989695A6C7A67B925C6F69324E7BF612C2443A31395D6965EA6353EA64BA7998CD47CF7D1ACB626AEE32FDFC641C3BC5B9CF9B409DFEFCA7D7C19DD4153795DE7436C7D467BE23307DD1FB91EC5893C7F00EC17F2640CF046813A093D574A1DCE1050FD19B739624AB1638201A85A88FF88D47E97BED3B78C5E3E4E3091D44D0115C1938880235B1D5C938A5121B4F36E5142B1462F4956583108EADFC5F6183487485A5E30EA1E0D4895A9E391E616A2470887E9616D693142983239B0D42E5E825B8A6365D099D3015354A1E79C3565071249977943FD3B34513A04C83D33050265F4FC7D8354794801610D902EDC8618A6636EAD22D23D5C459A2C46CD738C984F84ECC388D8C387329ACF9241D57FE0A96D7442C9AC991814DB41C4FB48665833189A1617E988DC6F40D626D908AE1EB54734D191A89E894305C648B3065914C844AFB53BF83A35585094C6609C8F54B2609718D95645A79C8CBA28A279B659A7A2BD15CB07733EEAECA7D6916ABBA2C327492C477BDE8295F5D3675D3809596B37EB4566D893183347ED5B74F7E48920AB9A7B2B612D2B2B04B54CC4A289E9AC327D899BC6772EA443F57644C65A250C7F1A561299F2CA6838E388E5BBA3E85CF3D997D27709B3911CFC8EE2695475A21998DCE53CD12BD7C09B17CCAC52D315FD693970A716A9D9ACB7301DE3D13A06702F43B55596FF7FA6475AC014882C38406E9E8EC768EFDF08B146ABDE4E371D5D7553538A5BE0923246D0EA6943C23589E96938229EB1FA3BCAFD387D269D75F23C12461E44EB218920AC094C4498036A13BB1BB371A2017D3C07BA7F337014D7731A36F9D6C62530F6EB2C9A4E5B1BE6E8E55BE420DD09ADBAB4E8484412B9400ED6B5334928C5D54E764AA32AE2B150FBFC08077396D977F8686D5771067DA35C018112045E1938A2709C8CA5A4932C01463D78B25415ABC1F6514DF3CFCB249DA8E4CDD25965A49262C415E8C0864B28EA86C02702A26A2A5800DA28FED38268796189C6C5C72CC93088754243226AE55438CABCD55F963B432F473E5CD320DE3366AB0D31E84543BB609B4B6B2AD93A9C264A8482610D361181D5594E3B473C412B475A3946AC8D4607A9E3A58E34C72B3353B5791AF44EE55D7A2D97C6CB1888B45F0BA0E6E3315CBD6A1A1B4B9691AA54905A1FF4FE475E56774A826BD27F25A5ECD1C84A522975F5DD975F948735DAE4D0AA9987562B64059E7A69A3C2FA79E09D03301FA9D02D4DBBE9EEA3CA458B57A399789A361FA773C4AD4FF0AB9C15DD84307F1243049D00DCB3ADA2CB952CAEB4B9D8CCD645F92596B704D9F121378150631A9B766C353656682236BD34A326DA35B6D449A8CA4E7A474E97B3CE1A922C264641736C58C7ADF8560AB313190AC5982735A2988E4A5BAA147AE916E15B8467490932CD2B88288F851CC84D54DBDF5725AAFF90D0A4B6E30AE37519D33878F60D7CBD8C29851CD93507B069A454BF0096C3C91349520665B549D020DEDB3696EEB566EF964045023D324C38DA15A1C6764B01F6BEC2C3E6358B29196C5EDBD46546821F05B08326D8CB9393A3BBB686D1488C8041FA94A9282C24C2EDA31FD83831487CFD1543F8D5B1FD5E38A2A751D1B77A48DD890A79E9B4BE83653C5A5A1A585B68E46ED2DA8C646A2FB212C10F96C11B5AA0C0D52EA3F81532FAA5E74E016085C63BDA552A95D732814723A0DA3AE3FB23F256B4AADC3922F75AC0902868606288D9E25138CE0085D9288AAD3C184D348DE2F30AB6716B667A46305A61338EBCCA17D589A7048EFA16AEE7DE2746F36E4266A4E8EAAEBE0657274B7B593CDC84632B502B5759226CF2A2026F7D168694FF60034A86B7D90EE39532B378689127CF92B07F997FFE2EFF1DDC37CF52BBFC93D1FD9849B8A86BCC775FE33F7F68BA243C962491EDA9F1B16C74F7B7394FEA462F58229A717C7704C6114EABD04BDDB187BED61ACB36F9089C720AC9A0C2B89144AC37BD3012420A806D7B4C84E9C41A63C2892009D02A6F221C938B904C734331171A5A479F5539DA7664753476882F179CFCAB44ED814786BD4FD4420C86C1066C3309BCF64E19CCAB62A3E61049C64C45C12E231AB8BB1EC2AF2977E9E39977F486DC3ECDA20CFFFCD1FE216C7F0C4D854AA09857C448C48CEDE250C2C7C27AB0A7575CBE64C660EFEFC4B58B4E11AE62F984BCE77CC88B47A4B4A221A307CF238E7F6BFC6E0E1D7B1C74ED12CD05458C591AC5D4C55F1283A7926FC7686DC0E66AFB88C6B6EFB85C4255E02BD0986F2C78B630EBCB295E1A3BB99E8DD4347D0473E2AA9307EA87D074703B8542665E907B8CD2ABFEACF5DC125777E8066F1244C60079DD04C1AC362E8BBF7C70F51DFF103FC7A15378A28391E55D9ECED2C634E17CDAB6EE4C69BAF53512B6340606A2DE3986D829D161558944787D9F9D83F50ECDD45BE3E4E46583676C498DD463F9D54BA37B0FCAA9B59B9B89BBCF8D14A03A63EC8737FF19F702D494284E72E558F28B618084BFED4EC0C153B4B29D384D53C9B96F96B98BB6C355D3DB3D46BD1309ACC1F53F1199D6E1592128BB0B4073013A0DFFE719D09D0EF1CCE4C692A4D3CC1EF64E5250D2D95F39472B20C611FE5034F31FEEA0358C3FBF1296BE661534B04E453A0C2ACDA94CB9B62BB290F5732667DC012F1A564759B87637AB32A09D2062E3183EB6608E69DCFE7CDEF98066B24165A9AAD4E6E1BC99336F98309BD51190F26B08B01ABE135C8B512FC5B200703BD44822BABF0BEB0495C6CCB579D8AAAED30915B46E38ABBC8AFFC08D9B61504768CD3B783935FFD026E6542F71F191B0F957E684069D512142B2ED1C4F72C4AB1CBB1FC4A8EDB7389DA9771DB6D37B2B0ABA01B80413622068F1FE2E0B33FC43EBB974DF0DC380000200049444154964A2F46AA49365D61A6887C86D1B796EB57B5F394FD168EF94B5879C7AFB062F9020DF62A1A95A017F1E0099EF8EAFF60767886E670C094ED225624E25B09461F2AE326261B96F41A4D58EDF4E616535F7F2B576CBC96CE9646830F28722044478B91C0E28DFBFE882527BE8FA7BC50979A48BE26CE3427334BD899DDC8473EFD695A5A0BFA3B8DFC6972B7E47FA9B85114533C7D8CBDDFF802EDB5D38ABC3B5105971255B78D7E67362F35DEC470FB6AEEDA389F0D4B7BF4F338F32AE7BEFA1FA986E388D3A60849999E89AC310F2BCA68735C36E48ADBC0B0D3C699CC22ECD9CBD878D366BABABB1529490B1913A0CDCEA6425D8A85274DDA99003D13A07F9A9035FD674CB014EC2FE974DBA2416CB03A91C21446AC0C72C4A5B3D407F652DCF32413C7B75108CF900B87148F4DA70965BC7C6AA2CD388B1802461A10251B5500608A039634A50C94717E232F1D904945204D809EDEF57C37672FE7659A93EAAB98FE9EC9D233C511CFC7A68DED523A25997055B4E126A8AD313FD5CCDA16317B2565635905C27A9E31BF9B62FB32E65EFE2172B3376165E782952594FED789ED8C7CFDDFE3D4C614221AF4DB18759BA95939633D26413071E0964CBC66799CCB2FE154D4C1B8DBCAFBAEB994EBD6CED55948C962B3A57ECE6C7B84BEED8FD31C0C910F47A9B8A211D24E2D16B53A39564184433261916C5CC10F4AEC6C7E1F473A6EE0EA4B1772E9EAF9BA31B8618DD2A9C31CDFF2109CD84E637D108F90B3DE1C8A76A3D9AED4045706936450A9C2ECCA710AE13855B791B35E0F87BD85342D58C3C6CD77D1D2D232D9629090D7371673ECA13F61E5896FE34ADFD9CA30E61474913405239CC92C6047C355E4662FE7B6BBDF4F2663B4C9255BD6DE712AAC245047B548E9E41E0EDFF707344772CEAD78518942388058C68EE416F0747E33C7BC85DCB9B68DDBAFBDC42C9D234F31FECD2F50AB97A9B939465C311468506956B9A95E04B9B044212A92894BDAAC1CF53A39E9CFC35B772B9B6EB8917C2E97341F93B5A8FB47D2543CAF569B8138DE095E7DF3EB3310C705D764BA8646E2BDA7E59AC924D52F36EDB18565A2924CDFEDC37AE37146F63C4B86716CCDA82B09934016AB8073BE323752B53933866B3AFD064A99F695083DE998F8B4206D94F34CE05464F73C72EFBB09CE9AC218EC5B25550D7463208B041B4CC681277F574288D16D24DDB3341B35C310AAD6A67086690CC5764D098B75BB914AD48295994FEB863B60D52D640A8BC16E494C480D06EB1E9700FD7B38B561F5563C9C5941AFB7506DA10466900D4FF8E7919B55D6076E8651AB95B25D003FC7E66B3670EDEAD97A1C13A3831C7FE4CB34F5BD4666FCA4B6E5EAB14B5F7601C7DD854C441902276306EFA31AB97082598CD0553BCDCB4DB7F04AEE2AE6168ADC76D552562D9EC781E71FA7F8C653348E1CA4A372D2588B39CDECC95D429F338B509BC046504AADD8A212CB6BFBE909FBF47797EC02436E17673273A974ADE1031FF9185E567EBF39F7D3C321271EFAEFAC38F1104E18125819FAFC1EDD407A6AC719F63AD893BF847E6F3E4ED7723EF6D11B54945F687266344A7A74B11A2D84C5B3ECB8EF2F6938FB2A4E5CE78CDD43362E32273E49297219C9CEE3E986DB38EA2CE017563573C7F59718D5BC233F66F49BBF0FF580A2D5C8C1DC6A4EBA3D4C38E20014918DAA14C20ACDE1080B6B07680FFB09EC0CA7724BD9DD7005B5A6392C5EB9961B36AED271F27440EAFCBEC6F4B53D8341BFE5933A0371BC8B20A6BBBF31784DE9A22AA8A445A93C16AE611D4C72AA64C0631C6A4304A7F733BCFD3EA2A1EDE4A3B3F862F26915A80532C421596BA00D41B57612C562499BE2980C2E513DC215FD60FD5C697449674A82A2046909A4866E270D43310830A3E6D3B1EA77716E936F31D4BF542BC40CD598E0AD0D490DD2A68169D88A6673922941E50C084E2CE6A94E4179E4A125A5B19936940C2BF41A198EE7E3CCDE44F7B5F7E2B52F03BFC36872086D2C618A49F9EB1D7F99C1AFFF2E6EE90C91EFF36AEE0676653630E0362934220C0CCDD0ED1C81588A89ACA764CB56A0C6ACBF7CF70D2C9BD54C1C84ECDCBA8D78FBD79955DCA70DB2A2D7C269A7874399951CF05728EE2CB5B868098A96BDB04C5AEA43CCB786389059C3416B11B3BC416EBFBC87B90D31A79F7D90EED35B68090668884B9CB3DA389D5BC28B85EB39E6CC27B47D726199A67814D7F570C2324B6AFB995F3EC09CEA09DCB8462DD3C2517B1EBDB915B42D5AC12D1F78BF5E6E3987BED188630F4A06FDA0E2EF91DBC0217FA95EE745E57DD4DC3C4772CBD963AFA1BFF5523EBA79296BE637282EAF0C95243B158C3738BE83ADDFFC9FCCAD9DC07232EC7557A87ECA8ADA3E02DB61D09BCD138DEFE7A8B794BB5617B8EBFAF5BA02AC634F3170FFEFE3944A94ED165E6EBA8E3DEE4A069D763CDF254F89B05A27571DE1DAF24F585EDFA71B48BFD7C389C2060ED1C3687E0EFFF69FDD8D9770CFCD986C9A7424BB7ABAF6669A846FFDA0CE04E87711C4A6AFAB49A94A094B52949A003D2D7227CD11E9FA04502F416917633BEF67F4C03364EB2338D5808C948B5195382AABE38AA30D4579484D06AB432F42BD12FC4F13F8A48927BE7E6A4C9B04692DF94D9056EEF0A49ACFBB38AF696F494F31854826C533D31D49F7A7442C5EA98666343D16635311A0D7F3106C5898153196E80EC73E6194A7EEE519A799960DF7D0BAFE2E282C2424AF6C0BB39F24034289DCA777E22506BEFE7B642AE7A8B91E5B7377F27AF60AC6F2CD2C5BBE84F9AD8D448164E6190219A1D7BB50C78B4B2CEA6A60E1AC1CE28F12178B3CFBD53FA767F0456645A714633E935DC8DEC215EC633E67728BB1E31A73BB5A58BEB087F6D606CA9588E37B76503D73883E770E67AD7666B9A3DC71490F6D630718DEF6004BAAFBC98465DDA2F6E7D7B337B3867DFE7246BC4EF2B90C0B3A1AB8E5F2C5C6453C0A281DD941DFB6EFB0B2B883D6704885FBCF145670B2712D67DC4E36DC700B97AD9EAFC6B092419FF9FE9FB2F2C403E4B0188FB2EC2C6C642272B822D8A523F703D91E5ECE5CCD0EEF32AE5EE2F04B775C31D99E10AD67A56703077FF8252ABB1EA5239A602CCEB33BB39A96709835955D3AAB35E875F193C60F70D85BCA9D6B0ADC71FD7A0DA1CEB1A7E9BFEFDFE3942628BA1D3CDF740BBB331B1876BB98D7D3C9D56B7B18192B290CD4FAC29F317F609B326DC6AC66CEF84BD8E7AFE07876095FF8FC5D64D3A6BAC25D069ED376F97983343319F44C06FDDEE2D505F042F2CFB40F731EB1DF2C392374930C1C24BACA9A93EAA0C318D1C411860F6F61ECE4CB64C68FE38F9F21531DC38DCA582230A4F88034D27C1DEDB6DCBA0AB36B375C0658AC8C52EE94059566D1DAB43142F229FCF0D307E8A4C1A8D9724AB53363172658CB38BA0015C2F3161AA049881479D6A112636A20624DC2ED954CAE6ACD216A59C784DF41F3C2F574ADBA11BB711E1139A55BE96F49B271F98B6C7942AAF37B5FA0FF6BFF0EBF3E46C9CEB1ADE94E76F91B54C2F49E3B2F67CDBC2E755DD7B6A8B2154C8057B849BF675AA6FD5B7EC8D073F7D1119E252F1438CBE1487E1D5B0AB7722AC8D3D0DECDF22E972BD7CC67DEDC363D9F5433E8DCB971B6EC39C9C17345DADC3AEF5B3B8B96238F537AE58734D50609A4D5E635F36CC32DECF0D7D19AB799D396E1C6CB5730BFA725696482E7C4DA803CF9C64B0C3DF145DAC78FD0169438E1CFE160762947332B695C7C091FBD69258DF90CA7462C4E7CE70F597DFC7ED53A1CB33B78AEE556C6C872F5F85374468394638F575B6F618BB78925ED161FBDED4ABA5A0AAA9C98E6A9A383A3ECFAF2EFB2A0B4970A0D0C676673C49F4F6BD0CF9AEA1B6A1E31E477F26CC35D1C751772FBEA266EBBF1326DF37A479F61F8BE7F47542933E275B1B5F136F679AB28D2C0FA25B3F9F0F58BC8173CA27A88D3FB2C27BFF69FC958456A6E0367BDF9ECCDAD63AFBB94DFFAC4EDCC6D14ED73F36514168CFFBA99424A5E98C9A06732E8FF93F89C50340D4FF362FDB7698C8794843F5999E84323E1A2020C433C00830719DBBF9D5AEF5EDCD249A89CC48DC60D873AF4347855308EDA52768B8BB3422893C249060757BC3811FE495D5CCE179878F7676D2611E5FC041B379086C10C93E03CDDDA2B9D5E53E682199E885DD966847ED542CD69C5699C83D37609DD577F1C722DE04AA34B0636324A4153064502A198A3344D5209D0DE891718FCFBDFC5AB8F336E6579A1E956F6662FD56CF9C3775DC6BA85DDFAB3411CABD492193F4F40171131123D6AE0E93FF91DD6955E271B95B4041F77DAD89B59C773B99BC8647D3EBAF912562F6C541B2E8558D47C21092658546D28CBFD0BA0B1D6CFC4A37F4169C7938A2F8F66667336338F9F64AEE750660577AECEF2A16B979311094FA19289FEB282FA21A1C054B512C79EFD1EE3DBBFCFFC89C38CE667712C339F573257D29759C02F6C68E5BA8DAB383DE672F23B7FC89A13DFC48E1C46DCD93CDAFA410669E0BAB1C758189C2017D7D8D178252F17AED280BA7CE97C3E78EB95538A7A419DC7BFFD8FB41FF921F383E39AD59E72E7D0471373A233ACABEED01539E077F15CC31D1C711770FBEA166EBFF17203571D799AB1FBFE2DF56A85616F16CF37DFCE016F15D528C3654BBBF9C0B54B686C1068AA4AF5E8739CFAFA1F53604C79D167BCB9ECCC5DCA4E6F05F75CB79A1BD72F3C2F104FF5B0A7D5EEFF7F7B5F025F5575ADFF9D73CF3D77CA9C90810021090984799019A4CE828A885A6BDFEB7B9D5E47B5752C4FFDB77DB5AD5A87DAC1AAAD1650A1D679061C502C606592790A53022401322737C99DFFBFB5F63E37272108416825ECFC4ACD70EEBD677F7B9F6FAFBD866F298256047DE254758C2B2DB7999DA4E326A095C72CF25F39EDAC3391F3514F28C7B1425EB801A8D98DB683ABE0DFFD01C2F53B6086EB61844977C38920059BC8D5411A19F4D0B3AC27E5F692BD28322488A0D9F2A6EA336B1739A92C0E7A8664468695632DA529454BAFF6CC0E91E34BA980641951F35511210DE8142C4B849935025AD62824E58E85B7D730C0CC92692A22658C83A32C7F2A937F6D72A384100709CB3F41E3337723D6528B56C38375C953B1591F84B02319179F7F0E8AFB66F03D91B60769E8999A06978BE4561DEC090A6B3A6F872B1EB809A3FD6BB9F0C5EF484699A7185B8C12F6670FCEF1E1862B86DB72C1DA952E44959FD83028684B1679ACAA14A1250F21B86F1D0702CBDD03B1D3330C9F3A4A50EDCAC1AC215E5C36A15868A2E822E990F29CB9138DEC68BB65FDA7A85DFE0206552F479BC38D4366B608D27906E1C242072E9C3404879B9DA878F5210C2E5B48C5E6A87164E3ADB4EB50E5C8C058FF8718182C4566A00A7B3D05D8E11B860A2D1BD9454370CDA5E708822653A0720F56BEF414721B372129588B9D89E350EEE88396700C85913D181958C325E6D5662E96254CC71E673E5BD0D3CF1DCDAE078DB238FE3607A14010756636962793053D106D1113E7146763E6A40148F4B981B01FC1FD2B50F5F46FE08B36A1C5E1C37E5701367A47639B7B30CE1B9C8E2BA70C8B4BA8F289D296CD117FD214412B82FE5C041D0FBC49DF99B4B8E2590AF1E2552A10B0DC0232B068CB88E1A28238C107596F9A5A6B856B4AD156BD1DC1CA2D68A92C45ACAD810B149C68851E6D80CBD1CA0515A2C250A6B0C5A57364F9AF5CFCA2D2AEFB5F82A0E9CBEAA948FE66FA9DF07553F091E5963493FDC7B19817D1981B219808E86E44137AC1DDBB04E983CE85993D18706673977222F1F6325F994FCD9848EB9CFB214A226382D66094AD42C3DC3B60845BD0E2F0A0D433107B1D7DD0E648404E4E1FA42578A0932E89164690F2F29C3E64E51521BF301FA641F74AD6B586950FFE10839BD7C38885D060A661937714B61BC538E82EC4972F1C89497909C2AD441B862C8996721F888643D0C9F2956E17FF9EF5082FBA1FFAA1EDDC7E6CAB67343EF54CC041672EDA9C09B86268322E1E37902D53EEF7C8BA28C2DFCA3A4D5480B2AB0C55EF2FC4F08AC5BC89549B1958927805767A8763424E08174F2C4620968803AF3C8C92032FC21109A2D1C8C0DBA95F45B92B1F03829B31A875338AFD5B51AF7970D8DB175BCDA1700F188BEB674C1204AD033BDF7B0ECDAB5E426AB4116198F867E234EC77F44562B801C5A14D18EEFF982B126BCC5CBC9B7825F6380B71D9602FA69F4B697644D0EFA365C19D680D8651EBCAC13F932EC07667119A35174615E762D6C401F0B94C38A92BFACE3750FDC2EF60C642A875656187672893F97E231733C7E6E3823185B2B3BA585DA282D03206E45A5504AD08BAFB94657B85D5CB90F574A52E253F7D22FD4E783EC925600F544B139AE269965F84B539ACCA2AE18F634F2A25FD879B106E398840FD2EC4427570045BA0556C47E3FE8D88062A61B20B848A5E447300CB2D204A5E0449F3FFE2EE87EE8DD84ED0A2EA51E47E5360877B146A06C2BA1BC1981761A4C29B940B5F4E112219FD11F164427367C293920747420E6B4788A601ED9B45FBC6219D409D02AFC2C921CE17CEB2D5689C77077422E818A58365A2D691C4644D8141129BA26D2A160DA2C5484393B3179A13FB61C4F8F118599401A7234C9D79F1F18337A2A86D279CB1206A9DE958933001BB9C05A87164E2966F5C82DE2E19789512B3B65B127A16D4EB31164340D37064EBC7D0963C046FDD6E440C0FD6FB266185670A1A351F12929270D5B83C8C2ACE16DA18D1288C78299DC88E21E2DE7FB8110716CFC7C05D2FF232AA35D3B024691636B98661505233A64F19089F3703FB5F7D0403F7BFCA297A4D7A1296A4FD27B61B4518DBDF85ECAA15C82B5B0297164293666253D26434F41A810B278D465EDF5C3EA56D7CF65EA4EC7D8733400E3BFB6099F74BA832B29117ADC4D0E07A9434FD83D76CAD998BC589B351EA1C8099833D98317558DC82F62FB81B2D547D696662936F224A8DFEA8D35D18D43F1BD34A72A1075B71A87413B2AA9621F1E06AAEA02CF30CC0DAC489A8D07BA339EAC60D5F3E0FF91974B211325BF48FCF97AC9A48DFC9660DA792A0A52899DD3AEF1890B43F177609D6639F9CEDC927F1ABBA7275D21FEDC92AD6C5F1C402B9C8651C495CDE39A3A58B328663D95CB60349201841DB992ED8DF3DCAB213B42D3A68AF7F8E3BA42582C79A349E894E8BC1B2C22D66E247987AFEF985887E380A046A11F61F44F4D056040F6E40CBE1522E8671469AE1D4029CDB2A8AC9492B9AB22A68BA3B89B29FE0A0ADCA46CAD4A0D2613EE03B2873D78980E6419B968036473A8CD402A4F51D056FC168387C3980D3C3162C15994073713BAE0E35E2B645DA6171C7D52DAD0A482A1311696266F93A543F3D07465B1D5BDA41DD4440331174989C52470698499585D1089AF474541939D8EC1E815E8346E2F2097948F7117E4DF8F4A15B9017D88B685443B599834F93A7A254EB832647126EFFF625C8A4D6E0923C44AC526CB57CD261DF3F55BEC5D0AAE9A8DAB402C6A20790D2548E90C383D58953B0D4338DADEF9C5E699835A50405D9E463172E27A10047298862EAE9BF871A43D8BB681EFA6D5900A7A1A14E4BC07BE9B3F1A973287ABB9A307D7231B2533370F0F547505CF61ACC68000D8E342C4ABB9E53022F1EDD1729152BE0D9F4327AE9CD08B7FAB13D7902CA3D03306CF8304C9C300A08D562D7C2FB915CBE1215EE7CECF50CC61A730C1AB42494180751E25F8B92867FB2555BE3CAC192C499D8E52CC415250998317584E8FCB2E703D43DF73304836D687524A2DC55C439DE0D70C1E77220C70DB8DB6A61345620335C85A4483DA7016EF18EC0074997A0494B803BD28ABBBE3F133EF98CB019214F4A1AEB8150ACE56409FA1C18DCF65D3C77E251125A30D4F498534E39622F356E58AB5CA6FBCBEBB90519CF954DE2C02257EB39962266965126129AA462617B018074DBC8060F2CB828275CD6B95B8D42E8ED2D69E3A823C26B9D9C84718506BBE26B076BC1B2EA3A32B5BD494F20180591F46751D0095241FBDEF6AFEEA8D2DD1BFCD75FDF0E2F6F0961D26CF6B3DE472C7818B1EA52A0621B5AAB7723D45889B6862A44432D2CDF2972A9651FBF2E543F8E37165E9B96ECA6C3443846812E13315732CCE43E48CE1B0E67FF91D092F2A0E969D0CC3461295B2BBFC37F8FF769C2B816161595CB85417D18593888166DF9A7A87A760EDC813A3E0EB7908E8523097EDDC3963C05F2A2D40040D3E1D793516366638B391829FD07E1EA8979C84A8A00913A7CFAE08F50103EC0A5E7871D39589330097B8C7E68369270DBB72E462F937CE9526785FDC4F2E192EE23FA15E5A6FB351D8737AF84F1D603486D2A435837B13A692A96FAA6211A73A05FEF2C5C39A5047D332831CE326B84BFC1EA8D4B963859D0FBDF5B80FCBDAF02E110FCCE54BCE5BB049B7DA3916134E1D2C9C5E89F9589832F3D80E2B25738D5B2D19589B792BF8C525731668CE98B22AD12B5CB1722B9A11449E1266CF38EC41E5701D20A4A3065F268A4D76F47F9A2A79070780B76FA86F2DFB7600022CE0494380FA2B8710D4AEAD7F07DD5B832F15ED2E52835C8C591841954A84280ECFD00D5CFFD0CD1363F220E13F58E742EC60939BCD0A35178A2ADF084FD70475B39504B4A7BE47EDA953C061FB827231C89205B6BC06DDF9D05CA3DE2FC7C918C249A1A939A1E8945C5FB3F9E689ADD2ECC9B4762496360907AA1244041D0A2CA56B481A6F446291E2E6B0598C83BA4C85A046D13236B3F98CA652D0D33D9F957F45E90BA2756DD834D4955744CA2AA4EAB56409CB62D2E678296E1AA882108DAB4085A66D2D2271E15BFEACAC8E9646853BBABB6206D4FA7EEEB5FDEF2EAD4DDFA697EA7782EB30537B941E89FD559BB1508D60147CA11AA2E83BFF6209A6A2BD0D2548728C95376F34B1822423C21A6BBE1F0A621BD7711D20B8601990522FB42A32A32EA77480F06599EF48051CEADA549DCDD0FB52C1FB933480B8BAD8AF275A85AF013B85A6B118A39B0837DC703508174C09BC26E1EF2119B86136D310757DB45740706E5E760E684626450C7AF4823563D7803F2837BE04614754606D6F8C67399759D91869BBE7505325D244F2A02AD421A56EE1A6C6D897C627A0E299BA37AEB2AC4DE7E1829F5BB79FBDB903401CB7DE7A2414B466E5E01AE9A988F3EA924092A3C5FFC68B26F23CACD17E8DBAACA2AEC593C0FFD0FBEC31B4CA3918E77D3AEC216CF08F47136E3D289F9C84A49C7A1371E41F1BE1779C7AC77656351F2B5D86D1661C698DE38B73011EB5F7C020995ABD03B76049B9DC3B1CB3318D5097998366924322B56A079F5CBC80A1CC0EE8411D8680C42996710829A0B25AE4328A85D8581F56B78CC756606DE49BA023B9D859831381997B20F1AD0F72E43EDC29F221668E6DE9C018787CBE9A9838EC981D930429A07CD7A021A5CBD38FF9B0A76A83AB24CCB42821E443F4F1BBEFBB5CB4964954D4BA2432A42E2C0294BB11250DDF541EFC2DCF937E1AAAB47C3246959210E2E1566AD188A2D0664A925C8A99546B40CD6B3EF51C648C4DA6D2770BB1B52FA662CB555AB0B7CD429E697D455DB6D7869615BB95C528ED7EE72E79D4AC4CAD940B1BB45A5F7B4DDDD28C76267DD78128075041718B605C3ECE2B014C9BBF9347679B922E863A1C8AA6DA4C12B349FE581593C3C32EF97BDB531AA586C01A2E416A132F27655BCEE4D90CC2563EA31A565EC03406E0B2F629A8B33192CC39C8D4D2221EB193B45DB3697BAD3F8F6AFC1910573E068A961A9CD3509E762BD3912B59EDE48CDCC448A4717ADB6A41A1C1DCB5D91668C1D948B923EBD58B088326556FEE67B286EDBC225DCA4D1B135710C4A1DFD506564E286FFB916E92ED242A1EC189B39C21E0AE1DEE12C3992B400D0B47B03428B1E81E7F0564EB3DBE61B85B5BE8938A0E5C09399872F4FEE8FA2DE3E44484E5A147CCAA7DEEA6D1843E9864F7178F9DF915FBD1241231147CCDEF8D07701072E07240470D9946224FB5251F1CA431872F04544A311D41A5958927E1DF6B806E0F211BD3065580EC27B3F45F96B7F4056D34EEC4F18869DAE126C750F418657C3D0BA65E8EDDFC99A23EB132662A37B140E3B3250589087017A259C9B5E4351C35AF67D927F7949F24CEC20821E9288E9534748825E8AC6857721D21660774EB53313757A0ADA742FE3AE474268D13C68D212516B66A246A3134E32029A81D4B4245C3E6D0C06F5F6B2042A0939116948656FE179EEBC5EBAE183FEEBFC1B71D5D563E0229D6DA9D42D96A6A42616BD12D0B3B56A59A672F90A8F8B4D045BF669B4424BED4B41B601B308D48A6F73A71C6ADC41042D26DB124468DF0FA45C2F1F4BE5A6CFE6B3F4AAC4770A2A46B3B92DF83358AD475AC2D265199756906BAA43319A70D19005DD4A047D9249025DF18522E86312B4AD29B71557B075426AF7BC49AB5A8660D8C541A4DEED49B2C258D224606AA2209FD8202C91758E6758FA48D66E2F89BA7B1B423B79F17736173EBB0ECB57E1D0B37360061BD01233B12EF93C6C3687A1C548C4AC19E330342F5376F110962E95C953CE316F5ED20CA2FF7C78DFF7303CB8018E68107E3D0107DC456C41EF71F6C5F7BF733D5298A02DB56EE13BE64D4E37441E333F1831902A5DA8B294F3A063FBD6B06F789FBB18DB3D23B1C3284238BD10578FCFC188C20CF6EDB29FD1F6E0910F32166DC3B68F16A37ED56B280A94729975997B10569BA3B0DFEC8BC129315C3C6900BCDE3454BCFA304ACAFFC6BECC1A3D1D6F675C8F3DCEFEB87A5406260DCB8523588D6D4FDC85BCC6EDECDEA134B9B59EF130C37E4CF62F4376F4089FB896A75C8155AEB17018514C1D9987BCD86134FD63210A1BD7F1FCD698BDB1287916769805B86C8807974D192E5C107B96C0BFF02E048361343833B1D97B0E4ACD621C3132451FCA681B57815241929F4E56861B6E3D8ADC240D974D2C417EEF7491BFCF588AD453BB1179D411BE3B043D8F2CE871300D11738977A4B18A9EA45B99ADD338638AD42926525AD3A2B58CF859CE93D503818501AD66C15C7B600BA9B0E6B928D6A240359BC1B666042CE0A5E972FE6D556B717FB2D426E757516AAC654A5BBB87A8B6945119B9E90892665BDC3A245856B474DFD0DB070331B4928B23AED373524F6487172982FE2C0CE564705A9E24436B7717012819D1B02E205FA0D40BE1205737E6271EEBB4CA7265AA494C7605E1F5606587F01BCB0E06D20778122E6F61D9580681ED27B24F48CDEEF0823970B6D521E8F0E293C4F3B0D1390421C38BABA68FC7F0BC2CD92FC44A14A1078FFCEF74A70ECEA4083B80958FFE027DAB572029D6C48B9D3490CB5C85D8E41E86E9332F47515EB66819151F376D7851847583DB41D121DAB02455FD55A859F2185A377FC8CA74247854E1CCC33ACF441C9019AD5300002000494441544A1A84CB466760CA88FEEDE757699259FA18F5E53B50F9C133302B36203D780407CD7CECF60C6317C411770E26F5F7E1C24903D11A7461FFCB0FA0A4EC796EB9556BF4C2A2D4EBB0CB9987D9E76463E2F0FE7038C258FFFBDB5058B30A2DBA178DCE5E2833FAC18806901FDCCD1A288DCE34ACF49D8FCDAEE128EC15C3E59307A3AD6C1B1A962FC080C6D588C2856AB31F1627CF44A9D91F570C1604CD5A2B7BDE857FE19D0805435CA8F271E285D8EC1A8A1A3D0D19A98928CA3185EB82C85737782349766A18D03B15F9998930B8E7A368BA2C8891BCB25645AAD445EF706C3F511FF41ECC9D4B16F4043849528F5AADF12CC926C032558478935AC919719F855433E34547CC2C5AA75995BF6C53DB2D6CCEDA22F296C145EB59621131B16E453F4B6956CBE0A1B88C8AB7E2CD633AC6CBADCD43122CA3C2811F19A894BF675FB6C48B3F410A9975786078A39095BC6441539030103F6B77E3E93FF6A58AA08F858D65D05AA71F3E1AC948AE95CB67113413B95C48F16BECF477227325F3BBED660E5B7D640189335EBC4F86B53079750B1FE0C910B4FDE427F285C57994AC32C7FEB538F4CC1D7005EBD10A139F245F848D54EA6D7870D5F473303C2FD36AE9CA2E11FA7C22523628B84B0910D480BDEFBD89FAD52FA377A81CC9A11ACE1A38E82AC07AEF38764B5C7DDDB5B2E3872833178F97C8F76E0B86B07DC72E64676723B7572AF45023CADE9F07FFDA45C8081FE67C703F92B02AE97CCEFB9D3CB22F2E9C3C52A8B751493E9112737F0CCD75D5D8F9E1CBF06D7F03E9C16AEE85B8DF3B04DBDD23B045CB458B2F1B33466661EA39C5A8AA8FA0FCC50730A4FC157E6DBD998545C95763AFAB10D3C7E460FCC802E8868E0D4FFE0AB9FBDFE5221DEE65489D4CB8ED54845D27FBDC45D86C0C41754201A60D4EC6F48925D8B6FA130E30165316073C3862E6E1DDE4194CFE579478398B83F5B6F77C80A6857722126843BD330B2B922FC51667099AE0C1E8E2DE9839310F493EEAEE220D4C56EF13A737CAEFA63D8D4F340CA9F0410B706D26E0496971ECC1DCBFDE88D9574F80C1BDBA48C65774A6B10C76663683FCDD744FBAC86F642A138D24C40C6BEC8A62A2155C6D5BC6B6EC0EBB535A3E46B4B6E447C45B8575F062481FB31C799C7B2DC54B2BABCE7A0D6F64BC6E05989657846575A45D7494FE9994F1A56D44740A7520108A2018A0C2B61379DE4FEC1A45D09F8593FD682517587BA275877397D435B0FBB2BA3B4B9D7231AD9522F768B139B4FB21444A5EFB3FDB279FD8CCCBAB44D71661C15ACD5A439A0346D95A542DB81D66C80F3FBC589B380D9B9D43D0EA4CC24CD2E2C8CB8867D15A046DB27B43183524D644FD08FD872BF1C182C730C0BF11D9C172F68492457AC03D1007F5DEC89B7419C64D1A6965A3F35DD156B77FCB36D4ED5A8F8DD56178FA0FC7A5138723CD15C2A6656FA061F5EBC86BD90A2F69828775EC4918C62E86DEA32662C279E7C9EE2B0211E6864808812DCBB0EF9DB9486F2987271A4034A26347D244ACF68C47B59182848C4C5C33310F05B9A928AB8BA2EAF5473064CF0BAC04D8E0CCC2A2D46BB0CB55C8591CE347E6738A5EC5476FA2FAA3E791836AF882B58280B817A08652CF50ACF58EC321470E90D00BD75F320C45D93E6C59F531EA563E8FC2865520BDC43A672E96265D823DCE3C4C1F9C808B278FE623BA63DF47685C783722A4C5E1C8C027291761AB73101AB5048C1E9089D9930AE0F350AF494BBB445882E2B4A0094D109E5A8BADAC34378BFCECAE34CBCA6E27A8F822EAA2E5D55FC9C5317B3C28BECB8173DA08659B2D3E3AD10230840F57A3A86408D8BCB10A8F3EF6111A02D4F1862C7B07825A0CA637821FDC3803E34664C3E0E6C2F2F5347D64C6524C3E063404A378E3F59578FFED771074F810D4753CFADB9B9099E212CB5716717135048BE5687C6BAD0E60D7FE0ABCF0C24BF8EE37BE8CDCB44C6801A108F6D25BFBF1F7D73E801E16C60F278A506F479D7A66B600861FDE8426DC75D7F7D0BF6F865857D4503A7E6AB5DC2DE2D41808C4441E74975A14DD7A2CE3172B823E166EF2C864051FC4BEDF95556C375FBBBEA27B532388BDDD41228FFF36061622A3EDEE89788BDAEEEE09FC30502054967EB3BE36D99F5449B81A8716DC0167A8152D7A22B69BC3B0D799CF043D78702172333C421A34148646476CC36441A2ACDC5CF8D253C542275DC070149F2C7D07DAFA97D137B0172EF811881A68317B71F795C34925484CF621353D15BDB2FBA0A1BE014DB50D8856ED42464B19D6E8037020E31C1467B8316D74211A0F97E1C0CAD7915BBF1E29816A2444FC68A0CE2466162A5386C2D5B704D959D9C8C9CA463414424D7D132ACBF620BB6229926A36B0B07F2BDC68766661933912EBDDA3D9D21B589089FFB870384C43C3BEDA180EBCF2008695BF045289AED7D3F156DA35D8690EC08CD1FD3079543EDC0665111EC6E2B97F4251CB4664B651EA9F9BF1230ADCE01D8B7F265F047F484356660ABE7DCD04243962D8B66A25AA97FF1D054D6BE1D05C5CB0F361D225D8C55A1C89B8642A69713860501EF4DF7FCA7AD0355A1A56279D876D6609EAB5448C2AEC856BA61422511234BB44A4651ACFA3605E8E77A2902E311924B08EF571BBB57B043D77DE4D9875D558B84C725548C7099BC2D24097A7403AC7B4D607F03FFFFD07EC296DC4AE323F9AA254804F454ED476CB40CC15C0E40BB3F187DFDF84217D3C3068B7E788A3A8FE0C3407F1B3BB1FC786B2FD987EC9798CFDAE4A076EFFF96F31E3C27CFCF1E13B58B48BA582B97E401809968BE3577F5A8197DF7C0DE74EEB839FCFF92E7C0E171C0160DEEF97E0A127D760DB7E52AFA18E4394764827204A1B0A028E565C75ED97F0A35BC6A0A4A43F123C54044729B754A4D59ED36D4FA00EB6491F340765BBFD307649138AA08F49D0B6731253B348D33AEEE6D8D910EE063B5BF4DEDE8AEBE88A26CBFD6CDF2AE25B44B7D784A54B42B9C8949E268EC1BCC8CB3FC6910577406F6D421026DA3C59A88FFA107138E17639A0479AE1A094C0A88E58248A88E1C37EA3376ABC7D9056320EE3C70E45BAC760E1FA582888EA2D2B50BEE41964B5ED83470B70697AB3918CDAA8073E230617A53C694EA114188EC0156B83116CC4EAD44BB1D21C87443D887347E561DA980244EAAAB1F495E7D0FBC82A0C0D6E833F14439BD38B7A23151167129C4E83CFC014440B8648E40AF0B41D40A2A3852DFB327711D679A7E090DE0B7E331543F39231F3FC1148320DAE4DAA6A88A1ECD50750B4EF79D652A646044B32FF0B3B5D0371C9A81C4C199107939207A8747CFD0604DEBE0F03DA7622A43B4597183D1D9B93A76029C620D11945612F135F9F3D0EDE68045B57AD40CD8AE751E4DF80584443B5230BEFA55C8152D7005C3AD887E95346889349D907A85B70B7D8641CBD98ECB73A07A259F3605C7116AE1A9F87440F159AD0A2940E8278968F5590258B7D6CEBD6F21858F673BB4FF5447DD0BB319F9AC6CE1ECFCDD23963815C159214A9693959BDCBFEB917DFBAF5E7189A3F187F7CF007209916B2B223E4AE8B6AA04253B26257AD6CC5AC1FDF89824169B8EB860BF0DFB32F16C95131E0A6392F63E58AA7B1F4FD67D116897087189FDB442006D43437C3E5882123991A0AB777899172EDB8E68A6FE1EA59DFC0DADDAD58BCF42DBCBBF83E64A6BBF9F92DDDB40F69C929EC9AD9B0A305DFB9690EEEBDF7664C1D9F2FB289C867AF031EAF0B098954F445731D1601453A038663D075433456B0A506920FBAADCDD67CBA1BCFFE31694815AA1C031ACB776777F0DA08B083F7A3F35B9CACBFA1331FCBCFEBEAED3AB80FBB32EC4F687170662C5BD0F6283F3995F58A35A85C407AC40D701A0622113ABA894D8ACABB4D3D82B6500486D3C7DD4B5A626EEC4B1D8D9D463E0E9A7D70DE97A6627C111D0BA991400C5A2880F235CB50F9E18B488DD5410BD6C2ED8CC2454F4C6B1313212D7AD2B56E23253C33098DF0624DD2C558E71A075FB419E78ECCC545E38BD8E3595317C2DAA77F85A206CAE8F0C3A5B5C149565084EC7FBA551DA170084EC30B4D73C1AF3BD14C9B823309BB1246E1236312B7004BD2FDB8F9BF6720C31D030D91B49CABEA22287BEDB71870F0656854C9E7CEC11B89D762AFBB18978FC9C28461F9F03875F6B1B7B6B562F3EF7E8C01AD5BB85B4B839ECCEE9B4F5DE76093771CBCAD9518579080EB2E1F0B570CD8B6FA63547FB410039BD72114D1D1E0ED8777932FC736477FCC189280CBA60C8383DC24651FA272DEFF428F86D1ECEE8D8F122EC03622E898817145D9B87A5221127D2E993346046545B185CB8AE2009DC21996B35AFA4CAD926FB950BA91C5F1F45F45576FDD9496AE159EA18F0E01ABDFDB8E1FDCFA4B2C7CFB71F89B745C7AD17770F1851978FA9987D90860D78BD42B0B8480BB9F3A88A7E73E8E5FFC642ABE7BDDC5083545F0D56F3D8AB797AFC65F9EF80EAEFFF26491F921F71DD1B838C49A38E15004A66E4A5F1615FF46F1DC734B317EE8681416A5E19AAFFD1907AB77E2E37F3C285C21923F69D326A9F89FFF7A099A429BF19BFB6E8583BC35B4B7B3433ACAADF4C4466F595D84A8506D14FF2774622C538EAA08E9DF31BBD69CD033D9F12265417717B47637B07445B4BB1AE26E906E5BB2E2262CEB26FE3E965BA5F3FB75211D7052272A196C69F75252DEA9DC25EA7763E35F7F0AB3B501CE4850746661B7A0E8BC428130EAA412811354F1DB0637F69A85D86BE6A3CC918B31238660D6A47C6E8A100983ADADD26DA558FDC10AF8FCFB911B29456AE4303CC11AB81C746CD4A08503DCA9BACE9DC60248075D79D8E518880A473FF47136E2E2D17D3069E400F62D92D1D45A538757E63D8E5CFD30D2DB0E20357404495A10313283A9DD143D8511222A37AA5CD9A874F7C35E671ECA1D7D71D89D8F94681D466569B8EECA29ACC8470F1BF146452DB0E7D5DFA1E0E0ABD0221A1A1CBDF08FF459D81BCBC6ECB13998306A0074A703C1A886482488AD2F3C01E7BEE5480D57A3C948C14EDF486CD20661AFB318FD5C8DB86A4A3106176531B65BD7AE42DDCA175058B7068198816A4F1F2CF39DCF42543386A6620607396340D93F70E0B95FC3156E456DCC874FD2A66387B3888B82461566E1CA890385DC282F1C2BB225C8998EFA96AB43E83A8AA0A9B82CEE04E9C404276E41CF230B9A2A09857109C4C8192DB234826D0EDCFFCB8528C8ED83EBBE3205F7FCA10CF73DF810BEFED5BE78E24F7338A06CF5004538C21BF2732B2A71FB8D8FE29EDBA7E1EB5FB908DFFDC18B7871F15BF8D11D3331E7E6AB58CE56BC468C93525923B4A13B4CDE54399D3004341E69C1D3CFBD838F56AFC66F7EFA43B85BB23066FA4DC82E4EC2C72BEE15FD19E936A595FFCE478DF8CA377E88154B7F8B9262526724FDF428DAB4283C3A694552F8CFE4C566F503A66EEC82B5A56B87674B182E816018810061DD29F3A4BB1C63BB5E117477C18B9BB3EDAC69B9243E3741DB99F9588919C732DD4F6653E04EE9C27F470F3647B3AD6D27D4844FDF5C8823070EA0AD95F449C2D0751D016AEDA5536F6A6A1A60A02D4C168586A8D38B5A2303B55A0AFC4632268C1C844BCFC983E910957DC499F459A5DB0FA072C70678FD7BD15A7B0091D64644756A446BC0156D434477A2C148C1A158321A5C595C629E96D30FC5191AC60DCA45769A57EA6A88BCDE37DE7A0FA6BF128EA60A688D35D04341C4A254D91803C8C263E52413471CA9A836D2516DF442C44C465A463AFA26C4307DDC20A4249AAC1AC84DAF751DF52DC0DE8F17C338B01AD5357ED4867D2C6BEAA71CF03139183BBC10BACBC9D660341245E3DE9DD8BA6209FCD507D1A4F970C0CCC3612D037E3D15A3FAB870ED0523E1F5187CDF15E57B51B17125C2E5DB501BD470584FE60A456A083B7D683AA64F1A299ACE365760CB6BF3505975184D8E642E8439ACA5B3C8D184C179B874FC400E12C6D3EDE5FC7366822D5D4DA8218A9C07C16FD68572B159EBB91B163413F4ECB1305CD2D32A7DB2D15818AD7E1D358780EC341DAB57EEC3753FFA33060CEB8BBB6E3A17174F1BCABA2AC240A572730AF2024FBCB5157F7FF61DDC7FDB2C242699B8F3BED791D3D7837B7FF15524BACDB884ABB5B91021D2B4F2DE2012495077288465EFAEC3AA4DDBF19FFF730186E5F5C182C7F6E2FBBFFC19BE74F970BCFCB7DBE0A4A51A0636AC2B4355951FBF79FC03ACDEB006CFCFBD816313F4C7DEF939C8EE9F0D9F69F0F221FDF70E82639C464B4B5E6C74E236042173A9B72A54E92EA39E86EB3B93B4DDDF701A3ECEE2CC0E567267BFC7C910B4B5C28939395DCFDEEF5188E77FF4C9A7D87B28885030C8D177F2B3C662A4B31C6672A0DF450D933B7F53A523E97A2499C005E34A909FE16312B70A1038B94ACA64F8FDAD58B67A1B0E348471A0B6192DC108DC24E0138D211C73C1E7F120332D0599A906268C29417A12BD373566A520937C70886E740DADA130F61DACC4A61D15D857E147736B048168186147944BD1A9EB08694A27A724212B3D09593E07A68CC8479A5758EE7C7A666952E114A0F2053AEDD635F9B1F0957FA0396C220013E9496E5C36B61F06F4EBC5562A9F28F8080C541CAAC392959B51D918E4D6C4A6AEA16F5A322E9F3A185909E4E327670F05F3A809AD8E2D7B2AB162F36194D53673897C82338A8B866461D2F001A28A929AEDFAFD78F5C38D286FD4D014612572E424C43069587F0CE99F0597B39332A3CCD464EA15BE28AB5DBD3C8E8BC579541C4500DA21CD2CBE8CE3591CBB70CBCD4FC3347663FE5F6FE42C0E879BCE51EDCA88EC0927E0A8C82F0C140CBC1FE1E4723CF3C2FF61D2900CB8B84E80CAFA35C44231684103F547DAF0BDFBFF8CE9575C80F3F30B70F7AF9E40E2C00CCCB96936B212BCE021D230AC5253D640D2D016069E7B6629C2410DC10050BAB309D0FC18382C83E32966C08305CF6EC1AAF2F771DFEF7E88EF5F3705CE2050B5AF010FFC6E39FEF2DC6A34C70EE12B5F1E83649366979A73B462D65517E0DC69E3E22507E299134756DEC0293B891E152EE1B5ED8A4CD031B406A80D9C754AF9FC64A02CE893C5D04E90274B8E27FBD9F6D7F12EFF39DEC83ABBC9D421AB4C95BD6DE41E8E0187EAA3089165CA8D6885B5C0DE37EE8012159624556F51C942348424534356326579D093257291F936C93294ADB1285BB8A605A86E89A2B2A61E8DAD6D8885C21C81771A0E24794CE4A425232BD584576AFA58B2AE8219ADBC5EEADE224AC1EB5BA23870D8CFBDFA88B45B4324871A83DB74C06502E9495E64A726A05782133ECE38104F3EC3C72956F2C1D248EC5FF4DFD9BEB7162D012A458FA257B217FD3312E03234715497B7C0BD7AC2C081FA20AA1B9A118984E14204FDB3D291996C726770D258B17281A9634D8BA6E1602D5071A4164E3D8A04238AC2CC24A49208BF4C0FA4937855730C076B5A106C6B854B8F2233D1859CB404789D0E21A5D185FB8BDF807F6F0B627033E3CF26688B8C2C4E12BC1D4373B38627E7EEC2ADB73C03B77317E63D75235BD0BA5B64FC58416A7643C8E05F4D335030E2FFE1865BA6E28E9B2F8657A7EA472A3C914740F651014F3DFE3116BCFD045E7C791EDE7F6D3B7EFAEBDFE3EE07AEC33533CFA556C6EDA9A51C9FA37C6E4A657460F53FF763F6E5BF4673B30B0167332206C92D046525AB17E15036A0FB60646DC7DF5EFA052E1D5B0433081CD8598BC75FD88D47E7BF8B81834DBCF1C26DF07944E607B94AE23157C9CB56A36A26E8CEA75A8B03E4DF384848047DDC4C82137F5E15419F385667DD95963BDACE01D6F7C7DA9F44BECBF1EB66ACF7B66C0D7A6EC354C34C1DC59D44F6ED4D608E17738DBF97ED09A2F7A30C8E48240AA7A1F37BC68924EEDBB7E596779ADDAEC66EBDBECBA0AD7424D8F139160E748DCC468E7F6A67DCACF7B15F67FFFCE361D29DC52A0885B25DC42750A054EE594CF22D7E0D4FCDDD851FFFF869988E5D983FEF265C3DFB1CE82E51312ADC63104136DA5542C0E3CFAFC4A3CF7F8037FE763B7AA73860905B8CAEA56BA496D85FFEFA211EF9DD4BB8E11B6371EDF55FC3BDF77D8C3F3FF3189EF9FBF770E5E593DBC95CBAD9A3BC03508051C3FB6F55A2E97025E6DCF53E6219D5B8E9275722C51D8119011C6127566DF0E00F4FBC0733670396AF781403331399A049EBECBAEF3F8EA5EB7660FE633762FAD402E195677D1D2BFE272A8259B2C122EAA300958B4D4E14EBC59CD57AD0DD5971EADA2F2E029DCD10FBCFD6F75D5D73CC07C53654EBC4C98510ED14261E365B74F754B2DB1717E913BE332668AE02156EAEB8D0111FE9A368F1EB786A5E296EBD653E9C8E3D2C377AF5D5E361182278460D7588E00C22E700F0F2C26DB8E74F8FE0E1F97760E2C842B8C8AD41E67B58541536B70037DFF90B5CFB1FFF8504570043FBE5E2509586DBE77C883797BF8127177E13D7CF1C071759E332784E27A417DF5C8CAADA5A7CED9A59D0DBDCF8E637EFC6E4A93370D125791832B82FA73E52931FB2CCEF7970377EF987375134F2003E78FF374873027A40C3C72BAAF1ABDF3D85EBBEF925CC9E311609E443A1A033ED1D524287B271D8EFD54D826EA32C8EB356B0FF84979BBAF08C42A093492EDC20EDAA7DC2F7D79170BB1A1F079DF8CCDFFE57F6E572CA5D178C7CD479F58C42ED94DE2C8BFB7025E9D1044D1FD4DA02FCF9C99DB8EDD679308D7DA020E195578E8349DD7064493F19B7461BB07D5D1437DFF622FEB9EDEFD8513E1F690909F14EE7C47B8FFDF145FC69EE7378F0F1FFC5C489A3E1A63841C8818A3D21FCF4A71F62DE1B6F2031BB0D2F2FF87F9836BA2F22A108FE327719EEFFC39F70E995E7E3B63BFE0B69C93EBCF4FC36BCFCDAD358F0CC3D48753BA538121DC3E88680DBEE5A8BDFCF5B8AE193EAB1F88D7B90AA47116836F0AB7BDEC3A277DFC313736FC4B051B9BC5C9C01A0AAA60ECFBCB408C386E5E1D2F3C6710A9F25E1655F53B6D515F74DD3EF685353047D4A97A57AB32F0C02761FCA89126CE79B3F1EE11EEFEF5F1830FE0D37222D684BB4426AE30B778416426BAB134F3E598ADB6E9D0BA7B113F39FBC05B3AF9904DD1543281A86C3E1844E6E8B26E0DEFBDFC7BD8FAD42AFBC303E5C7633D23C6E762BBCFAEE5A7CFBBBBF42C9C02C3CF2F0AD983076106B7050829EE5F0FF707129EEB8FB75ACDBDB88683400B7D18C58A4029E443FC64E29C6A38FFC0C03FA6660F39E18AEBAEE163CF2C00D987E7E21FB26D83943D6B374B1DCF58B7578F04F6FC2CCD984F7173F8C71FDFB62D7E630E6FC6431DE7E7F05A2AE20029A1F305BE172D6A377A68E39B77F0DDFFEFA6C0E1147C351E8DC90E038E95436178722E87FC3DA551F791A103811B2ECECEC3E91D7F079581E8BA55B83DA90517A6087AF137DAFD330F42FD45B5A185BC9EFFCB3C8A316E259F415417393034FCFDF891FFFF82998C62E3C33FF56B6A075972C86A1E29330D074288C071E7A1D2FBCB71111D4C0348EC049625F70A264CC14DCF97F3F40DFBE0069B65000906685B5C0E81BD96D6EF9F223F8E5438B70B0F21022E106A4A4B66119159938848F9B0A5CDE7C6F23EEFDFD3CBCF0EC2FD1BB97974BF5E98B34FD38E53B042C5BDE8C1FDDFD08728B02B8ED47D7E0BC5123D8FDF2DA6B7BF1C7C7DEC1C12387107147E1F685F1F853F7605889C6F7448162A1FECEAA1E8AA0BF500B56DDCCBF0681CF22C863FCAD831FB9ABBB3C86157ED4A59D89FF5F33E22FE6A7D8B1602B5A801F179CE7986D0C7EBF8685CF96E2CE3BE7C369ECC7A38FDD802BAE3C872B48A9EB7A5C2439AA73DAA15446108D072CCD72760388FE92AC1D1321B795F823FD5E0410455E3565F8D0ED50293D678970EE3455F6C9962AD4AF53A6B9F1BD5AA72E5B5621A7C44999609667A7EC0FDA7CA43824BF4427FD0ED21AA76B75BE5741CBA24558FCABCB98C5D1414265417F3197B9BAABCF8BC0B108BBBB646ABFBEABE063E7FB5496B43C7258015459266E719E4CC16C69013E5A5E8937DF580943AFC557FFF3028C1A9D0F27A50E32E6C47AF45FF17307E845AE9E203CD672A680A114DA67F17D2ADB96455224D6C5E99B36917E8D32EB45AD9E28B4D199DC39984954EEA0D27171FF16A7F2E75B27009953CE7E76A9A7CE06374B400BB150FA9EDA8A716E3B352DA6AA563B292B82FEBC4FB87ABD424021D02D049874AC2A4322C476521479EBD204D5496F248C83871A50DFD0C89D71FAE466223D2D998B90E84BC8A24BEB5B12A5CDA8E56BA40C97D01C8F0BF6536B29EA8C427D296D25EB5C3824DEC12A6CE28E38F27DE2A5E2FCA652EB5AEE0A567358EB333BD592C886C2A29E92E289F4E5A41FA4667F07DD676B108AA0BBB5B4D4C50A0185C0E745804947F6CFB408931951BA1CACD2392AAB8E46D0D8EA4720188423A22129C107978BB4A845B97D5C6CDFF2FF33CB0937050B0FC93657A20B91D52856882FB35383BA95C884782E55B784FC656D0AD3B0F53BA9A06AB1BE90CB8FB70A67E2B5FE716EB9BD9D962DDEC7B72AEFD72A529425AAB65385646645D09F77B5A9D72B041402DD4240BA1EF835B6AE25E25BA985C76E69917A174698D31D1D51D262112E002A9F1772FD92A42DD6E37A6FD9D6CAA2CB787B92388BC73F9ADDD6524489F8942A43E9F6B84F0B8BC5C8B62B16A95AAE2C59A26F31AD7474C8B275B16D08E21762FC72FF8937986D6F166B1390625788B4F25590B05B4B4A5DAC1050089C2A04EC56A1C54F52CB83F9D0F22DD3DF48F04AFA80454360E1CFA5E09AA062D249B12C524970A2B6306EA4C7CB38ADCF65239BD23222A0D277BAD6191365F72474257EA3B5AB2BB21BC5266BC07975E25F845337A85CDBF2894BBB9E7D3541D9FB50A4CCB12F9BC385B271ADDDDC66939BEFC0D6AC59A5D99DAA25A7DE4721A010E80E029D1DC547892DB59320D7FC50008D0369C2E4156DA6884885C6B3F8927E6DD638A1809E2455AB8EBA03C99216798885B6C85E3658154FB49122B785A4FD8E5A335D047FA3D23F22BA7CDB495C0A4FF338654E336F35CCC4EDDDEBEC98B1A54D16B4B8266E761F85ABBC11396E55A8D29D85A7AE550828048E8F4017041D77E712F1C89439E62049829C81C15FC227211AAD0A7FB395EE66D73517C26E22BD4E58E6F65D4058D144E4F1F7603F35B1BA4878B3979DF32D49D70CA7EA59422596E52FAD6C7AA5B8077A6FB2C385CE92BC81B85EB6A5DA4CA14ADA0EF8DE78AC3692B77E3E1309DAEEF3A1A41797D301B7DBD971C73BFE32515728041402FF4E042CEBD79EB570943B41FA82E3F9C1328FCDB2A83B11B4351C6159537A9DE4BECE046D25E5C52D70EB834519F96712B4B5894812B5B9D2E30148227FCEFAB0B9993B5CC78976425EE09804DD99B43BA58658EFC71D5502D4E5BC5361D4E798DBCFA76647471E4A188F521239603A75B85CE7815CC6000004E94944415422F5467D290414026738027677827D28C7FAFDA9186E9CA86DBEDFAE2C5AEBBACE9B4B7C679056BE752438D6755D59CC9F398E8E37284E17A2282614A69E8444D05DA67D9C143A274DD022995CEAFB46A370E85A4782EE0A68EB16ED7F3BA9DB562F520828041402A711013BC71E65DDCBE8A42DA84A69E0C19050B3FB421034A7B05851510E1E1CC782B6476F4F23AEEAAD15020A0185C0E745C0EE8EB6F2A53BFA6E452EA0D57FC022686A79757C35F413BFBB93B6A02D8226CB391AA1A86B0C4EF241BBA81D79A71B903F9FCE93D1890F595DA910500828048E8D40E7037E9CCE6C6E122E9C24EFBAD4FBA01FA941045BD0A7D04370D2044D2E0E2B48188B524B200DA6A933411FF5D5A90BB55A1C0A01858042E08B8C40572E6B994062EF21CB43B0C29A44D0E483FE4259D0D6ED517E24B51632AD5E6936F4ED22265FE44951F7A610500828043E0B017BBC526A2B0957475404098341EA0E7FEA4CE893B6A0594E85357785949F50FD13FFEDCA9571EA6E592D208580424021703A11E83242D8E103AD9E85C27A165CD8CE895F802C0EFBDD5A55971DCB788E05E0A9BBF9D33945EABD15020A81B317817683B2A369D935758B7EF3A7E3EB7358D0EDB763CF6F3F7E95CAE919C8E90047BDA742402170F621D031C5BA9DA03BD7F158FEE753E973EE8CF62925E8139B4A45D0278693BA4A21A010F8F721204AD33B7B0A3ADFCFE976DD9E1282FEF781A83E5921A0105008F45C041441F7DCB95523530828044E33025DF9034EA5557D1A085AB49339B623C3CA1A3CCDC8A9B7570828041402278DC089B9623BFAA56526C7497FE6D12F3CE5046D453315419FC259526FA5105008FC8B11E83E418B5E34C2403D555FA79CA04FD58DA9F75108280414025F7404CE4017C7171D52757F0A01858042E0CC404059D067C63CA9BB54082804CE420414419F8593AE86AC1050089C190828823E33E649DDA5424021701622A008FA2C9C743564858042E0CC404011F499314FEA2E15020A81B3100145D067E1A4AB212B0414026706028AA0CF8C795277A91050089C850828823E0B275D0D5921A01038331050047D66CC93BA4B858042E02C444011F45938E96AC80A0185C099818022E833639ED45D2A0414026721028AA0CFC249574356082804CE0C0414419F19F3A4EE5221A010380B1150047D164EBA1AB24240217066207062AAD467C658D45D2A0414020A811E858022E81E359D6A300A0185404F424011744F9A4D3516858042A04721A008BA474DA71A8C424021D093105004DD9366538D4521A010E851082882EE51D3A906A3105008F424041441F7A4D95463510828047A14028AA07BD474AAC1280414023D090145D03D6936D55814020A811E858022E81E359D6A300A0185404F424011744F9A4D3516858042A04721A008BA474DA71A8C424021D093105004DD9366538D4521A010E851082882EE51D3A906A3105008F424041441F7A4D95463510828047A14028AA07BD474AAC1280414023D090145D03D6936D55814020A811E858022E81E359D6A300A0185404F424011744F9A4D3516858042A04721A008BA474DA71A8C424021D093105004DD9366538D4521A010E851082882EE51D3A906A3105008F424041441F7A4D95463510828047A14028AA07BD474AAC1280414023D090145D03D6936D55814020A811E858022E81E359D6A300A0185404F424011744F9A4D3516858042A04721A008BA474DA71A8C424021D09310F8FF23866F9D43DF71C80000000049454E44AE426082 where `app_id` = '3';
+UPDATE  `fn_app` SET  `thumbnail` = 0x89504E470D0A1A0A0000000D49484452000001680000012C0806000000EE2C29AF0000200049444154785EEC9D079C5D55B5FFBFA7DD3A3D99F44602015208044209BD77E945050151442C806097A20802A222584014B120A2285800A54887480D2D011292903E997EFBE9FFCFDA6726441F0804E6CF7DCF7D78F326CE9C7BEE9EDFDEF777D659FBB77ECB88E338461F1A018D80464023507708189AA0EB6E4EF48034021A018D80424013B45E081A018D8046A04E11D0045DA713A387A511D00868043441EB35A011D0086804EA14014DD0753A317A581A018D80464013B45E031A018D8046A04E11D0045DA713A387A511D00868043441EB35A011D0086804EA14014DD0753A317A581A018D80464013B45E031A018D8046A04E11D0045DA713A387A511D00868043441EB35A011D0086804EA14014DD0753A317A581A018D80464013B45E031A018D8046A04E11D0045DA713A387A511D00868043441EB35A011D0086804EA14014DD0753A317A581A018D80464013B45E031A018D8046A04E11D0045DA713A387A511D00868043441EB35A011D0086804EA14014DD0753A317A581A018D80464013B45E031A018D8046A04E11D0045DA713A387A511D00868043441EB35A011D0086804EA14014DD0753A317A581A018D80464013B45E031A018D8046A04E11D0045DA713A387A511D00868043441EB35A011D0086804EA14014DD0753A317A581A018D80464013B45E031A018D8046A04E11D0045DA713A387A511D00868043441EB35A011D0086804EA14014DD0753A317A581A018D80464013B45E031A018D8046A04E11D0045DA713A387A511D00868043441EB35A011D0086804EA14014DD0753A317A581A018D80464013B45E031A018D8046A04E11D0045DA713A387A511D00868043441EB35A011D0086804EA14014DD0753A317A581A018D80464013B45E031A018D8046A04E11D0045DA713A387A511D00868043441EB35A011D0086804EA14014DD0753A317A581A018D80464013B45E031A018D8046A04E11D0045DA713A387A511D00868043441EB35A011D0086804EA14014DD0753A317A581A018D80464013B45E031A018D8046A04E11D0045DA713A387A511D00868043441EB35A011D0086804EA14014DD0753A317A581A018D80464013B45E031A018D8046A04E11D0045DA713A387A511D00868043441EB35A011D0086804EA14014DD0753A317A581A018D80464013B45E031A018D8046A04E11D0045DA713A387A511D00868043441EB35A011D0086804EA14014DD0753A317A581A018D80464013B45E031A018D8046A04E11D0045DA713A387A511D00868043441EB35A011D0086804EA14014DD0753A317A581A018D80464013B45E031A018D8046A04E11D0045DA713A387A511D00868043441EB35A011D0086804EA14014DD0753A317A581A018D80464013B45E031A018D8046A04E11D0045DA713A387A511D00868043441EB35A011D0086804EA14014DD0753A317A581A018D80464013B45E031A018D8046A04E11D0045DA713A387A511D00868043441EB35A011D0086804EA14014DD0753A317A581A018D80464013B45E031A018D8046A04E11D0045DA713A387A511D00868043441EB35A011D0086804EA14014DD0753A317A581A018D80464013B45E031A018D8046A04E11D0045DA713A387A511D00868043441EB35A011D0086804EA14014DD0753A317A581A018D80464013B45E031A018D8046A04E11D0045DA713A387A511D00868043441EB35A011D0086804EA14014DD0753A317A581A018D80464013B45E031A018D8046A04E11D0045DA713A387A511D00868043441EB35A011D0086804EA14014DD0753A317A581A018D80464013B45E031A018D8046A04E11D0045DA713A387A511D00868043441EB35A011D0086804EA14014DD0753A317A581A018D80464013B45E031A018D8046A04E11D0045DA713A387A511D00868043441EB35A011D0086804EA14014DD0753A317A581A018D80464013F4FBBE06A20D4660FECFD1C40118F2639358FD43FD0F75A87FC56FE30F30E43DE4F5C9B1E13BCA35E45DE3FFF1D37F7B9FB7F136FA148D8046E0BD454013F47B8BE7465CCDDF806E07E8327E9D1C893D3084A44D4245B296A2544BCE89C0D890A03778D9FA81987252A4C83DC420C654542C2F932F07B090DF878AA4E5F7C939F23EC9EFDFE0B6B1117FA77E89464023F04E11D004FD4E117BCFCF1F2468A1C1C108D950ECA948348650FD3826C6C526C014CA0C5210D844A998C04C5E997075C2D249BC9CD0B93148F87231F91AA467F9A7BC6D1242FFDB110FB0BFA6E8F77CCAF50535026F13014DD06F13A8A13B2D1C60C7C164C34018AC083326364A8A74E3389F30B5F0A69C62493C5CC0359AF0B114C70E5E61300696785945C2B1A17E67C93507C3E7E4F260F903046D4134C8D421982E18F29507D243F7E7EB2B6B0434026F8A8026E8F77D710C46B46F947F96DF952192EF199570888C84A755542D3F897DCC2850C90BE2086221FC60E07B04769AC84CA26023B655428338495FA87B80E4A785F1075326837858C2E4150C52A0BEF4A111D008FCFF464013F4FF6FC4DFE2FDC230C43024624EB6F26223C6340C8C38C68806C8D7A8425C82B08ADFF13251B99B5AB98857EAC7F0AAC45E8D38F0B05316A1E360A673D80D6D58B9E1E4868DC7CC8D80541361EC8093C63052C4511A0C87C1783E1888D4D386A449DE28B95D67C0E9E16804FE0F22A009FAFD9ED4C1DCEF00074651A4C8D954398B98CAC0D65E9600A3DC47D4F52ADE9A2788D63D49A9EB4508FAB08C88280C88A31033949C768429D700EC305039E89034AE91A718A60953C3C80F1B4BC3A8091863B7263F7C3266F348A23847480396D344484ABDB363A8985B1F1A018DC0FB808026E8F701F47F79CB7F536108410B39477140148658710D7A16515EF5288557EFC2292DC22C76908B2C9C284564F783E9134531711CAB2C87642C549E3A825400E6A038C4B2F14911192601167E240994765CBB914C5B3B4D5366929FB80D66CBE6608E05B30DCCD4C005DE6FA0F4FB6B04FEFB10D0043DD4733E40C02AD32CC49904C6AF6F0C0EFE3ED9FF4BD2C16105D308A8F6AE227EE667C48BEFA75A5E453E55250A4A18664C6CDAC4710AD337B125312DAC2EA9118C2465ADDECC10A107A130752C11B64FDA36318D10A20849A7D87E889D76F04C937ED294EC916447CDA169D29E348CDF1EA3653258D904A58154B51AE7C097FAB7DA5C1CC8670F9E2451BD21A391FFDE42A8F7065A6E197EF2E324476FC6E6FF549A6C280B4F06B2C16C2658C88B547E7E700CEBDF6B30F76F10ABBBD9EB874EE80CF587425FFFED22A009FAED22B5B1E70521B169E18B6CD9904D3DB08441D5669E45ECBAC48E8167191886956CFA155E2658F02B4AAFDC82535C8B2991B168998DC172924400AD78391095859DB0BEE4A985C836D074F8664C688A82DAC78C256911624542991646646318BEFA992444E47A5E6060A6F294AB21F98661A4A79E416AD37D30478E22B22C3C2B456040DA343055114D0AD3CD61C8DF942E13C7390CDF04A74CC5AA60D344EA3FAA40A24459226F3E28073421345198F9788212D9C8C2F0ECE4DC813F5171F6C0BD49FD42C613F9C9CDCBB408B1B1E2443D1ECBC6A810B1826E40CE2273605B4486BCC3EB47723B893620764DD91BBBFCF5EBDE1D029AA0DF1D7E6FFDEAA8426CA694144E6239474583E180CED9C2934D40F9792882E72EFC1577D333FF3784AB9FA4990AA6DA1814821E8825D7970F862A627442135322D881E8D11C609A44586728B54764083127A42E3C6E44F25B47A93984C015A70F1C9226B12C4BA54B8230A46435A8A8BA75CA7EB46C731C66EB568451161C53DD342202525E4A91999FEA23A0898C2FDB8A1E35CBC6B24C55ECF2464712C32651AF7AAA182468A55289098849FB6172EFB12D5C536E3349546CA9248D60E760ABD74518B19F44F918723B528AF1C1187E50286E1960C7A0EA77E4BD15C927CF04C9B9EB9118F8F78661FA5B4FB73E4323F05E22A009FABD44F30DAE1531A0634ECA4B92A819A90A148A31A889882DF4C9D556E1CDBF89D2333F2113AFC0C6C40B9A126DB3906F2C119D0A3531141927F4266A381521FECB7B0F3EBE273F3554914B42F2721591EBC5A2E0886D22D31BB85E720151900C2A494CD32488AA985983AE6A0E37338D615B1E42CB564761E436C30F53205C2DAA3EBB4A9FD107713B2D151B5345EE860843920DCF37386474892E6540B1B2BE983D926782E4161324791FD7B27007107088C8C9266818E2AB9B5F924491BF3308020C47FE3EA87A016B4A21BDE5805AAD86191BB4346618D19CA22D6F2BEC3286E029A3183C124579825C32701D3F0FF187445FFE4D11D0043DC48BA38A8F88D7A4025018323652B8A2671E785F3BF4716AAFD0FDC89504AFFC8936AF1B2B8808E5113D9D21886D4C15F186D8B150FA40443D10F18586857C25A492149A484428D1ADD0B114A74854AD32088AE0E40661131B52CE6D928EAAC8D6E1E0219B941241CB77216BC74C13D64A908AF1EC345D4116373F9D71DB1F4FC366BB833345E9A45DBB9B5EB9EDC42318563531C24EE228C66C1AAECAD4DF8CA0E5E7FE40917938A058B125BE97E29A50523F3276033B32A53627C964482125E08A4ADC046FA040D232C136A1BF1AB1724D3F5D5D3D148D0C5E6C2BE28E7C9FB0562663864C1AD5C68CA963189D91187C4047BEFE363758EA93DC5435410FF187445F5E13F4FBB506CAAA0E2FC68E3C1591858643F22F79D4F6B0FA1FA7F79EABA8753F4226584B4E541C4136F1CEB05C0243E82AC9F73A22A393348563E38742D5268619128631860A55D34ACD11A90D3A79860F317D1FDBB6310D4BA52C06B622550AC3B6240FFDAF65DEF27321E6A4D45C883E49A1382A4362E21B2615DBA1D78496899368D9E51CAC86B94456037D56338E67D1E02EA1E7D95F12B56E41FBB4C3C018D864FCF749184C052337A48850A2D95852400656682B828E14410B491A547CE8F43D9E5DEBF37C671F4B7A3B71BA3AB16A1E516C60DA0E2DAD6D4C9A3899D832F13D8FC84E13C406BEEF13043E665003AF825FEEA3ADC1E1C85D67322CE39092E8DBAB924E0F96B6DBEA7631589DF97EAD1FFDBEFFDD08E8087A88E7BF22358012C586C9EE96EC9F49CAD809CB98D545C4777D8EEAD2C7309C066A918F617B2AF1614716569023B064D3CBC58E23953B15EEAC4AAA3593C38B6C2CAF44CA9434888369E7F1FD8144886C2A9A81EC81110501B1283654EC1CE208C94BEE59D20BB14160BC7929B72B7B6B31A4A2885418A9A219F9538C6C867EDFA533DBC6C4D99F2233F563E08C240ED7E23D750EAF2CF8339BEDF753329B1CA16E1C6F1A42AB1B4472334912E426516CABF7905F952DE870031E78751D0F2D5ECAF26295AA6F92326C9AD30D8C965CB4EF83E560D859369BBA05B6ED100601EA2271401884F841A06E50815FC3AB14C85A21C5EEB58CCF5B1C7DC05C5A7319B26A3F2048248A0369284DD043FC01D197FF8F0868821EE205228FE1A928C6904D40C3A46A49CA4136BF5EA072DFD5444B6F24E5D788A26178418CE954C1ACA868D5089B084D5F292DAC38C08A45C9E110DA794A519AC06A50A9904CA6192BD58A69B7916F1A496C3989EAC30CE82FF711861E51B988DFB38E7454C2F27AC8DA3572764820AA87FF804110A7898D00CBA860A9AA46E15283D0CB63D24235D745251E8D39F24086EFF6417A1FFF13E6B2AB89323E8D737E4E7AC68960BF7992201AD8AC3394AA25268A4CB5B958366079C1E78E97D7F1F49A0E3ABD2A664396967C9E49D906C60606A9EE7EAA664477A58C936F61C4E8499896A433845E2395D2303C97300AF18210370C89E208BF5626F22A44418DA8D0C3D471ED1CB3FF76349A92AC499E5234410FF107435FFE6D21A009FA6DC1B4F127092F5BA22E101DB291A16A88AB4699EA73D750B9FF0A22CB25322372618546212B5F741E0E9E15E1DB2E719C563968118D492ED98F1C7CBB9954DB7872E337C398BA1F8C98464C33C42DC080EC4E4E3622BCB08869C5D8923E08CAE0F7102F9D4FD7922759BDF4794646AFD064F4AFFF0313099A1C09A9CA76A6DC2C42234520D5889E472E97C688AA385640548E882D9F6A9BC1921E8BB14C6444AE9352A544E680DFE06C7E9492B2BD590EDA55B78788B44800256A361D7A31B8F7D55EFEF6E4F314CCB1F4167CB6DE6C13A64F4C93F563CAAB17535EFB0AD54227DD7186D4B0B14CDC743A8693A3E28610C6C4810F61007E481446548318378A28552A388E855B2B53AB1494CB48B5671DC71DB43B3B6D3E5CF63CD50D31917724E3FE3799F4C62F06FD4A8DC03B444013F43B04EC1D9F2E398EB48BAB76B87238D51A66E71DACFDFBD768AD2CA6266A07CBC20E51795E4947D896ADF2AEC20C69D756F9D56A36458FD380356A3A23A71F8A3D722E38139562212140295C193041DA206095775DEF72A7A254B959C8974BECD7F04BCFD2FDC25D94163DC6B0D26B34FA3DD84A6F9DC6B7724471486CD4880C0FCBC9409855496171D933AD2A66E8E0C421554BF2E152729EC78C7D1CCBC6DBF532F25B9FFAA66E7842CDC518B246881DF4AA829897AA297E316F2DCB4A065E18323263307DD26886A54D1AE22AB5EE7574AC5C467F4F37C54A9995AEC30EBBEF8B9DCE12C6065128517844E07B891A2584208CA8F91EBE2F698E80AA5755F968CFAF91AD54E82D75AB315CFDD913C949597CCAC5352CB2A2134FEE52FAD008BC2F0868821E6AD86B31B11D50B3A508C5C02E2FA3FBAF5F22DDFD0F32411FAE292233494C67955CCEB1255FEA4AA11F969927E540C173885A67D1BCCDD1D89BEE83911E0D664EE568456026052E1B7BC4A10B511F466D25E12BF7D0F7C29DF83D0BC9DA45D27688E5054AEA66D98D2AAF1B9A3515F12B15482CF1664026F4F18D3CA9B88C6B99B8A64D5E32E9BB7F8BC6AD3EF11FED4A950E3AF6F1629305FD01373CF8321DC670A2D864CAC856B61C97A641D2426E09A3D24FC7F2A574AC598B17982C5AB6921DF63F8A86E1A3A856ABEB25824AC32D635539E798308CF03C57917210FA54DD2ABE10B45BC3ECEFA7DF2FE396FBF8C169273179440341AA42D548D1103803D6AE1B8BAE7E9D46E0DD21A009FADDE1F796AF8EE3226E90C7364C6C7A293FFB537AFFF913F2B5D534671C2A7E11C310299DA572CC86E9A9220DCC0C419467B5A825A6CCA57DD6C7309AF7062347E018848E743FE9C4A1118BDC5B8EE34D4F9024B9A4046CB923B8102E23E87898CE7FFE1277D5938C355CE5F911BBB2D127E61E153C3B4E0A41E2760CA346362AE19327139555C9B86FD8E462F076B984FCEC33FE835DA9E8FF8A046686793D26D73FB20C3FDB465C2BB3D5F836A60CCF10F852961ED2608554FBBA58B6F8253A3ABAE8EC2B91CA37337BF783084D07D775955A45D41A42CC8A9C6563D04FC8DA97083A10920E70DD1ABEEFE2BA1ED4427AAA45ECB8C429BB6CCB11BBCD2430AB44A4C878A9C4296AE3EF7F1B3F2FFA951A0155C025E1863E860C81026B71E21164AA0646F50956DC713A4D95974949E01A9818B6E8A363EC50F2CCBE08CE88D336453F03A9D118D38FA275FB23309CF110B5135AB6D2FF4AD189657A3858EABF8D3E0211FD5954A48C5BAE19C764C36E2C6F19FEE247E87BEC368CE232325681B459C3080342C32690221649D39A01E92089A0F36119DF92021C9B4C18E1EF7C31B9399F4455B3BCE12125D81516F6C4FC685E273D8DE3092A7DECBA493313F2914A9D7891A3A477A9D865DD9A15BCB66431ABD675B3BCA39B7D0F3E8C6CF36855D62D690DCF4BD21AEA2B0893CD41D757A90D3FF054DA43A477AE572390EF6E0DD7B5E8AF54C0ED65FF6D26F1E963F7C531A4443D85E53A09394BD58C3E3402EF03029AA08718F47588B67904F96A48E703E7C1CAABC9FB15EC3043208FD0D219258E71A4A8431CEC6CA8D8397A83E18C9CBE37E99D2EC0488D549D4F446E97E494C5BC3FADD4145203F26E36B1C2B89434012083D4EF49F09E51AAB70844375D5D4E75D91D2C7CE0C78CB6BB690C639C5072D03522A7A8226609BEC37880A0C5772436C90511A51DBF4ECBCE9F8178406627B1804AEA26E5DA52C8B2DC35F9F9032FB136339E322673C6659894AA62472155439E0E0CCCC8C50A5DD6AE5CC6AB4B97B1AEAF48AAA99DAD77DA45798728EDB7E49DA518258AD647D12A820E937CB490B7EFB94AD9512A16943DAB44D18532940B559CD8E3A07DB6E1848366D31887E4440FEEDB0939BF8BFBDF102F2F7DF9FFE30868821EE209EEA0C8B0D8C1EA5F46FF5FCFC1E8BF8B9454048ACD5C9C2332C5AF593C3512D7359198F53923C94DDA93D65D4E84DCDC01CB4F614D958F48084E0CF6A58A43746FEF6213ABA61AC5425AD22B322E55E29852558912210B91DA6107E1DA27E879E4E758EB1EA521EEC18A42E2D8A6E648955FA022E85C5826104B53C32255F528CFFD068D73CF5111B52A7E5187E8A8436CD3A4EAC7FC74DE7216971D4CC7617CABC316C30C1AC2329ED140C16A221549297905337459B17C294B972DE7B5B53D6CBDD3EE348F184B184544D1EB298DD7095A0838C00F035CC93FBB1EBE5BC3AB5655AEBF522AE2B92EA55209AB6AF1DC530BD86CBBA95CFCF59398D694A159CC9F020F33258D0C742DE1107F4CF4E5DF04014DD043BC34BAC388B6682DD1E23FD27DDF0FC806CBB00C571916394146953227A64786F2692E1839DCE1B318BBF799307C17B01A3054A9B4549C0C729C2A3101439C3C32AA13CAC61E7285A410458C9406FA104ACA404AA4B12805D0660698DE2AE275F752F8EBD7C8066B958F4518B6E1D91E4E5C2518CC414B8AC34E61D75CBA677F95BE9967D2EDA5A8945D82813444536303B94C8A75DD7D3CB046CAB9338CCA54983E26472A92DC8F94AFA7094562A8B4772E86EFB262E91256AC5CCBAAAE02FB1E7A0C454FAC557DC26883D44618AE4F75483E3A21E824A511BA3545D441AD4AB95854117558EAE4F13B1EC5AD343276EE0EECB8D7565CFEF1BD688F6322AB8469669421933E3402EF07029AA08718752F10F25BC4DABF9D85B9EC09B212999915ECB8423A100F0B2166E97C22CE730EFDF63086EF7A32CEF493A8991395D19068A00D894213433A75C44A49213F5749808DFE2BA47023B966E24E9774A54D5C3BD4FF8F1CACB086D1FB086BEEB88C5CDF7CB2D26E4BDCEBE4C660888AC3C31B54713892233749F901CF8C3C99A7C77D9A6E63C440377149C9C835937CB16CEA15EC56ECB0CCACD1166D398B7228CE1819B2A14FB3DF4FD5492B8587197AAC5EF61ACB57AC21951FC6265B6E4BC937949953147BEB551B927F1ECC450B41BB818FEB5609A5D4BB56C5AF56085D0FB752A1A921CFC78FD89160653F1FFAF01574B78C60D20E53B9FAACA3D877462B8155C02483AD9BE66EF4FAD22F7C770868827E77F8BDE5ABDD2826E53D48CF0D1FA1A1DC8B6B270E72E9302215F9D46C715513E3E31A51630BBD4DFB31F6039FC3CF8CC6609C4A0D0CAAE806C97920539018FCBF6B331FB11D5296F889DC6FE0500EC9A29BAE1588BB9EE2B5BB2F2157594873EC4A2B44224965381E8D7191C88DA9645AF1A59CDC949B06447623CBDAF664C1265FA0373F15DB7112F37E4374C989C2A252A9502C5598D0DECCE89694DAC00BADBC327FCA4401B92091ED05525549CCAA956B78E9A557D974F3193839A99E94C29432612C3E1BC1FA1CB4283A06893A705DBCD0A51454A8887AA3E8920B628C9E6E8ED86B670E993B8BAE5A3F071E740E1DCB9A69D9762BB6D9A5811F7DF9305A6D298D076B30C53190E99022F9243124B735D14A6FFC0DF22D17903EE1BF1A014DD0433CFD4AB0B5F80704B79D473A86422A20B242D27E06CB2852336C52A18D6D54286647D3B4EFB5589BEC8167964979ED28767EDF9EB06328AD61C93DD763F90B68307AB084DC8C2642CBC1B3C50BBA82D9329E970A79DC3843CE2F92C6A3600DC31B3193EAD83DA8DA6D894F7352D74D245DC82D33C91D7B9248917F27136198B2513978DB313085F0E5B5A6C5BACE1E9E7CEA59B6DB6127622996C1A216D692F26D65869490F486042D567725B74839AEA8681AD780B5BD2C7FF8212E39F774F6DF691BEE58F414279F7C3EED85D9AC34B36C7AEC78BEF6D97D3878D30949EC6C2637B1D7B3E8898B75520024392A4DD043FC31FAAFBDBC26E8219EFA302EB2E68EB3697FE9B7A48D1405BBAAEC40337E86D8AC20042E5239276550C86D43FB51371264C712DA651CBF09D3B4DF5715414D52DD619954AA8CE1F5822992B90C912939DA8020CEB1B0A3C693AF1509429356CB6544631A2FDD4A97D14ACA3054235BE9B128472E9DC2F5AA84515248E285265557ACF50DD219B9B6A9D41D83E2CF284A4CF8E5E7A5729567E63FC7EC393B10063141244D053CC268809C072A0507095ABE7BAE45AD5A268C2A78E5327625A467F16B742F7A818BBEF469F6DB7D0BE2E63C3FBAEE41BE75DE2F08D2CD6466B6B1CFA15B72D5A78F2563BEDE306B60272069E8B27E3FE05D3FC20CF10AD497FFDF8C8026E8219EBDD87B9595B79EC9A8D5F711D5C06D9037F4497B3942DB25B084010D6A51134D333E4666C7F3F033F2985F2225D5851241BF8F2202B14B95E856542669897EC57CD936A98A0FB315F3FCF21E5E5C5924C80D57C31C9D8B69B47C8A52F3926BC5502E7A5280237914D127BBC9E65CE4E3D66A74556332F95672D92CB69552865242CE83D23931D3576E1D618C1F84546B1ED95C23B59A545BC6F89E90AF689D139216D2176256C5299E47B12AFBA93E71B11BBB5265C1A34FD1101B4C1AD3CCD147EEC32E7B4CA16B89C78597FE91BB1F7F062B34E9B52CB63E72677EFAF50F33A525B53E461E68B49E78440FF644D086D143FC09FAEFBEBC26E8219EFFA8FC289DB77E9EB6EE67708B31518BA93A753B5E5E55E489BD686046F4C41318BBEF95A4C61D4C352D1B8635B2EAE15F246AEFDF23B41B56B10D034B3C520351929804B6C8014D5E59D3C173AB622A66BBEAABD8D66C62577DF266A848DDB3C4093BE983225D606AB5AAEA6C1204892EB9BFD04FC3E84DC8340E53F969E5452D0D051441CBBE62B2112AA991409A184411E9548652A9ACFEB7747CF1DD324198E49C85A4E5BA42D083FFAEB8013923A2B0FC15B69B3089C6D0815A8DB11386B1ED4ED3C8B5D95CF4F1ABF9D3DF5EA1D00C1937C6B3463172CF599C78DC367CFE90E9A454383FA8E14E3C5F550E5AF60706FE1BE265A42FFF5F8A8026E8219EF868D5AF597DDB5719E5AEC48F5B70D32EA9A84CCA6FA06C5BD8D4706D9FDEDC6C261DFA4BACE62DA9490F5823549D3E84A0DFBF1C87E45A25041525604A75EF96EE263513D6563D1E79612985D4487C334B3E6F93B2A5E046CA5D7C0CC9338BD9536411F921AEEF532C970922E82DF4D35F28326DC60C2AA2B9B612937C395F5A300A1FAEFF92CACA810EE4A2FE50D61DAA1825F1790E4321DE55BD080000200049444154E39A3241FA778216A2762B2582FE0E76983A815DB7D8927CE89016EFE85444BE2D85D3DAC2DFAE798C6F5EFC0BFA1A62CC8A4F1CB4616F3191D9074EE5C6730EA04D3485D2AA4534E8030D0D03A5479799492B858D3E340243818026E8A14075836B46CF7F83BEFBAFA4D9EBA3660CC34B55C945652C2F4F299D22E57954532E85117BB2C9076E2448B7ABEE2292937DBDA7C7FB57CAE60EC8ED44CC278794CA14E2987B5F5C41D56C57A4D8D2E09092CDBCD057A90CE9112EFED58E1161F91695924F7FA9422D86FE728D8EDE025B6F3B87AA747B71C46F3AD98293FF249511C762C4A45ABA246E7AB1A83EC49323528D072229E556041D10E02B0BD44172FEF7083A5DAB61D77AF1BA5772FC2187B0C98809105A34B6E6F9F39DB7F1C39FDC42D06B31AE7D1316AE598DE742C64FE135E798FAA1FDB9E673BB336D586EA0196DD21F328EDD449F6DC836A56C23BE6FBBB843BC7AF5E5DF6F0434410FF10CC40F9C4AED859B49552B54ACE178A9320D6105DBCBD39FCED1E48944AD4834FD585AE65E8DE734131B2EA938A52A0C131DDDFB47D0E267AD2AB495877D8C6B782C2AF632EFA502E437C5F60D866563A59596EEE19EE1109942E711A657866A91427F91AA1FD15BF559B064057B1D7C206EE410DB268ED2610F74391FC83DC7D2BB3116A296AAC34011B444CB12398BCF731C84049E38D305F87144D57B3DA521043DF8251174BB6BB2D9A856AAA5B5EC3C67362B5E5DC315DFFA3E975DFE4D7EF7BBDF73D743CF1278FD3CF5E0EFB8E0BC9BB8FDC127C9BB25CCB441C3078FE198C3B763BB4D1A19D390A3BD2145168346D1ADCBE6A5EA0A2E8F3BEFDFFC0CF1F2D5977F9F11D0043DC41310FD6137AA2BE661CB0696DD8C6FD5C84435CC304BD1C99097CEDA76157BE77371B6389B309527107F641CA5145012DCA12C35DEC02A2B89643738067F27DDA8445961C5D4CC80BB9E5F40D91E456F254F6B730627AE25852D86494D34CB8E18FA07F8A55EE2BE6E2AC532A19DE585A5CBD9FD80BDE92D394AEB9CCE1818D245469A19AC4F6B88478704CB89902D88C45F235051B318EF47814F24042D8A0D71AE8B436A9277F6036A92D27003DC9A47E805940B450E9BBD3DF7DD761B15AF9B5D76DD96BBEF7880452F74B2D30EDB73F229FB73CE17CF63D6F65B72D1E7CFE2E9792F71DEB7AFE46B679FC1CC19DB70F2B57F2437A91DAFDAADBCB3278F1DC65EDBCE60C7A923D87C7833B6480E6D0F4BFA460696F2F70F4D497E0438327F52262AD98FF76F0B618857B7BEFC5023A0097A88118E7F369CAAF83D88A7853426150F0B439217524E6DE39921D9D0247DF08F31A61CAFFC306A460AD330A591F6EBDE424335CE0DBD0C935EB1EA585FB128FF436E14428C8EC3B26AC47D2FAC21CC657132160DB1386D48DF154735B89511AB32F05A894A7F2F6EB11B29D659DE5DA079DC44468CDF3469E725267142FA7279152DBF3E102167F9928D3F4971885E7A50A1B1A16B9D1074E4B9CAEBB926796ECFC7972792BE0A513564C133CFF38DCF1CCF9F6EFA0B857289033F30975B6FB983054FF533766433D75C7F2AB1EF93B61B696EC850ADF531624C3B76B6911FFCF82EBE77F5ED58ADA3A8A52D72EDAD984D368DAD29724695E9E3DB39F9C8BD9939B99946D5934195E7E0A53C3C33201BA7B12B29B135D11990A15ABBFF05D7D5043DC4935CFB512BA1E7629BB1EAE9A7A2C158BC2684A0A5896C444611F4B598538E53ADB15C23A5941BFFDF09FADFB148D2C04AC120BDFD827486FB5F5CCD0AD722C8E6B09D889C9485ABBD3B91039AEAC61249245BECA1DCDF8BE74397E897172EE2C80F9F841B1BCA8744352710125679E68177D9E0FBA0339D48E8FE8785E880ADA8A43284A445572D92BAA0E6614411B5DE121DCB5E63DEFD0F72E01E5B70EEA7BFC4D225FD4CD93CC3C9277D894257C0F8B12D5CFD834FA972F3AE354516BDFC0A63C78D64CE0E5B139936D7DF702BDFBFEA665A83566CF125C9655953ABD23A7238C5BCCDC87123C935E5D869F6243E7BC26E8C4CC50CB3930EE8A24591C839305C641BD854372E7D6804DE39029AA0DF3966EFE81585AB5A245656DDA22DF5D83EF0E8AEF29626AE255E1616A983AFC19CF24188C5D722A388CE198C2A8730C5A1A871BD822CE90F9884D0C97755EC2C79E228A06238FCE9D105782D63F01D090D4332B6C8E212273E6983E898E0578A14BBBBA895FA2984799E7C6131071E7918919D52EDBBAC7843828E09C59F44DE6B20921E8C9E93CE2852889244D0834E75838528CA6B43CC90DC9A4A4184529052E8A7D93229AC5EC5734F3EC175D79DCFD2970BFCF9B657B8FFA17F72F229473263FA445A1A0C5A9A436EFFDBDFC86787B3E76E07D0B16625B7FEE1377CFF47DFC049A579F6D9153493E2FC2F7C8D934EFD149F3DE7AB5C7AF5B59C7FC57759532A936A6A62ECA6DBD0D21EF295730F65C7F16DB47806D2D230CEC414EC1ED2E4C459E41DAD197DB2466010014DD043BC160A570FC712B20BC5C14ED201C9111A426992E290C7610BFBE06BB0A61C9FB47F32322A82960D3495E4186A825E5F78A1C4C76A335015331B067E9CE83764B4EB2A2177CD5F8C317C3C9EDC60421FC7B155946DC621761CA9AAC15AB18F425727AE5B664DA5818E52C8DEFBCFA5588E483989E9937436970E3242CE83C4FC3A414B9BAAA4E824A9381C685FA53AA3245AE7A44B8A4F59957657A056C1AE9508FBBB39E9880F302C6D33BAB51133DFCBEAD53E07EFFB151A1B263179B3164E3E651F86B75AF475F7F2CC8BCFB3EBAE0770EFDFFFC9E1871C4426E3F2D4530FF1E1138EE495975FA2C7ACB064D93226B68CA53DD54AA9ABC2AAD55D94FD98C52B56F29D9F3DC4F0995B307C6623271DB907A7EEBE15CD527B640694CC126933AFF2D1FAD0086C0C029AA03706B577F09AE0FAC994CB05CCC0252D41B37430117296AA3C89A08D80BCA4340EF801C6E4E314998BAE5808DA56E5D1923A18BA52C2F539E7C1D26531E9B74DD5DB45DE5D5A5B497C2CFF5ED553E4F9D5FD54446962DAA4CD5099F39B86A1BA86DBD2F3AF56A1DCD7435F7727A665F1F7C797B0FB8187337C780B962D291EC5FF6AD3D11CCC418B3A43EC3D37F8BE3EE71C4B014A42C8F225E725C52E89E74625F0A889C7B35B26EAEB66C72D3767E7ADA733AEB5816A7F3FF9F610C76EE513A75DC1A8F6ADB9E3CE5BD8620B87AF7CF9533CFFD44BA41B1BF9E7932F72E75F1E61FC98F1FCE52F5770C9A55770E10567D2BD76152F8B4DAA6973DF1FFE42F7E2251CBEEF41D8864DD3F0761E7FEA69FEF8BBF90423A7F25CE8921F9BE6CC0FEFC1E907CC62982853220BC39466BA43377FEF6029EA53FF1722A0097A88272DFEE31CFA562C53C51B29A9A88BBC817E2289839CA822F262283AF71252DB9EAE36097D33A7521CA225561280219471254D5B8D0183A224CD508DC1B7A018C5ACEAF129F417F0BD12C520A6E234E25A0D4A98908983646350F55B0CB0A5CF5FA5CCAA55AB946ED9F502E62F5ECB11C71EA3521BB69D5404268E49E2B9A11C945409F8E0C6A0BCFF863D054562E70D74E81EEC37385829A80A51028F6AA91FDBF318DBD8C8DCAD66B2F099C7297675B2E71EBBB0DB2ED329572B546B16E5628A334EFB1A1327D99CF0E18358FAF26A52D91C2B56F7F0DB9B6E67CE9C6DF9F6773EC96DB7DDCE2E3B6E4DE4D5F8F54D0FB272450F871F7200B5723F861571EB5F6EE598134E20D7DA4A5BD5E1873FFB33373FB914B3BD992DE64EE0DC53F666FF2D273242B091FBAB4E410FF1A7ECFFEEE535410FF1DCC6F71F40CFFC674899014EEC6346BE4A1724F95DE980EDA992EE759B7F9E31FB7D4DA5380245D0D2EA49F46D434DD072133030C2C454429C2F0A112CEB2BF15A6F0FB5B85911B86DD6A8192655D2F846063B0EC906D2E15B3A8E8865AA8F11B84AB1B262E56A0C3BCDF30B17B3CD0E7319397224966DAAAABF58FA184A45626C27052952711825043D48CE83EDAB948A230A14410FA634E4BB44D02AFF2CB6A241153C0F2A35361F3B9E7FDC71277BEE3297FEEE6E5E7AE515F6DB792E471CB51D815160D99290A71E5BC5EEBB6F45ADBC825A31E437BFF91D677CEAB3445696C99B3573F58FAE67FBEDB660D309E369691CC66B0BD788768ED809C8B7E6E92DF662DA0E37FDFE0FEA61E894A38FE08B675FC0C2650195FC1882116DCCDC6132577DE33866B66769B2920A497D68043606014DD01B83DA3B784DFCE429743DF4371ACC72D273500C2A25571B47CAA8DF97926EC364C5B88F30E5F02B54FFBED01215479438A629B3A477F1011F308D1E4C65AC57650CDC24549188BA59386A7B704D6F8D97D67651304C3CC7A212E6712C87C02F82E3E0463691E1908A4352614D751F17FDB3349335028FFEEE2ECAE52A1D7D551E7DF2394E3BED23A452367D85122D2D0D542A35957B0FD713B42FDD739583DD86F2BA6453302408939CF3A0D786AFB4CE49614A4D9425A502D5DE6E0ED9772FAEBCECBB9CF5E9CFF3D0FD8F512CF671C209C770CBCF7FCBD7BE7C3C86B994575F2971E5F7FEC2F84DC6B3EDAC49ECB0F5D674AE5EC71F6FFB2B63264EA4B7D8CD9C1D66B1CB6EDB532954F8D5F53772E2878F401CF59C6C23C56A05D72B6385214D99567AD7F443D624A886F8FD39CE38F76A9607CDB46FB50973E636F3EDAF1EC1845C9AACAA0B95BCCE7B2B881EB40891F9535D1E076492A249970D5CC348BAAFDB91DC24D4CE873A49D443CA1F45B54C9317CB1A88555B08A98D9453A579B03CDD88DA48CE16D9A5DC5C4571230D24D475A42069A0964AF59834C44346AE23FE2B725E2649676D38C077B194DFC1C7EEFFCCA99AA087782AA38E5FD3FB876FD15A5B4864C714CC16522164C22A8101A9D8C24DC3E2CC66CCFCF0AFC19CA68C8762A32A52006506FF6EF87950D89CE4BC078F444DA2B2CB9272301C4AB1C1D29E2A4BBB0B54CC349E6D2AFDB2944527FECCF201947B454232C9E74C7E1F62588ECA2D4B045D5CB79AEEAE4ED6167C5E5CD9C7891F3C5A59DA27A9147515E54297E49CE51922911E6E98D6D83082F6A46D95E711490E5A0A5324A551A9A8CDC352B54CBACF65E2F01C3BEEB025975F792D3BEF79223FFCF1EF69CC44CC99318CD1E336A1DD89F8C8BE5B53299578F0A52EBEF9E31B69C9DAFCE0C2CF31BCA19954DAA416F4629A0123478F52E5E8E96C036BD6AEA3211392B64772EB1F9FE5A73FFF2D3BED3699CF9E792CA15BE5E17F3C855BE9639B6DE772D6B997522A88F470187D61992D769BC60127EDC7A70E9A46ABDCCCA4DFA33DD03CF73D5A7312C18B8795638AD4519E4EA41FA4A86EE4A6EF43E0D26F6769940638194B7590376B3115DB206D4658F2A8D49803B3A6DAA7B94606978CDAD24CF91E666C52B60CD281811D9AF85903695BDC105631BC102FDD84257BCA86EC8A4A814E96A270B7DDA9DABA398C262B9AF728501E2C9695E4E4F5F1F611D004FDF6B1DAA833E3EEBFD0F5878B18567C8AC88928182DA4C5BA33128236484526153BA2BB7D3A630EF81E4EC32E4AAB26E5DEC48326421BF5D6FFF2A20DEB5112AA566A5DA425576859BCBCA29B1505173F9DA71C0B61259B849661FDC74774B113352C5B79339B7E8DAE95CBE8EFE96675BFCFEA121C73E4C16A4350D1F9808C6E43399DCA3F8B5A63E06B707370705350BEAB085A1AC0FA89539DA43CA41B4B10F8581DCBF8D89147B3AEA39F071E7D9A89336772D9F7AFA3219561EF1DE6926E4A31A9CD64DF591388A390627A34279F7901DBCF9EC5974FFF20EB962F66930993C9E5B2E4F216CFBCF018DB6C339347E73DCDBC47E7F3C9D33F486BE36876D8E144EC741385EA127EF1CBCB18D6DC44B53FA26BDD6A868D18C7E5DFF915CF3EB38A6AD1C268C8100F7398B2EB747E7CD10799D29C262FC657E67BABE6902D8A820569A34A26EC5237749FE154312875C6F42F5988E95718D5388678935184AD262D22018C3D0AF214E440D417910F2DACB80AE24298CE40569E7044C79D6C116484D8A54182A16267AC4872F1D2BDBD819A111019EB543A2EE8CC11ACAC52EE5F43DB84E1348C9F94E4DFD58DDD2008636C5B87D0EFE4D3AC09FA9DA0B531E7961E63CDEFCF6758CF0398A98062DCA83A55A7A31ABE696187E0DA117D8D9318BED3E7C94C3916EC4662533E0A495EF8DD2CE97F2914FC5796567F4D1178656D81D5BD253C2B4B3934A945F2182CDD4C447632687C9CFCF11B56FCA91F44E2F56C2711B45FA5F3B5457476ACA5BB0ABD6196C30ED95FA52FDE8CA06331F35776A2AF47D183E90CF5B3815CB31F0454C567C34D0A572AD59AF2953E785A1BB3274CA129D3CE074FFA1C97FDE43CFE70F7A374ACECE7D8433EC4F537FC80D33F7220E31A22D6ADEDE4BA5BEE61B7438FE59E3BEF62A71913B9FDD65F336AE4142EBFF43BDC7CF3EF39E4B0AD99386524AB96AEA3BFCB66CAA64DA4528D9CFE89AFF3D83F9F66ECF83C37DEFC03DC7285790F3F4357C75AF6DEFF103A3A03CE39EBDB84B51CFD55172F6F307597AD39FA986D38FDC839640397BC74087F0F8F582259B5C79BC693DCBE1FF3F83FEEA56BF1F364FA97329A1EAC7C1F5DC50CE5DC6638338F658FBD6790B65FA537DC8CBB6FBA95CCCA05D88198F405A46217DBB1E891272A274DCB88E14C9BB60D13B6DA92C84C618719B51C02A9963422D25E86FE5AC4F3F39EA6F8FC0334F57591732AD83997FE4244DADA1263EB6DD966FF9DB02C1BCB929E94EF2100FF0597D2043DD493EC2D62D9EFCE63F8BABF92725CCA718E7414A90F836B8ADF863C2342879FA369C671B4ED750E5813558BA7A479AB52196FF42885E6E51AEA4BF1A48445EB1314BCD8EFB2704D0F66A691A21B53F5C573437ABCC8065E442C8FCF1B3443FC57825665808AA0C5ABD9F26BF4AC7C9555AF2DA314A5E80B331C74D001181B44CE09A7BF2EAB53DE1A1B94720F46D212354B9E9940BC365C65575A1583A420A6542C12F8210D992CC76F3F9ECD86359273F23CF0E87CAEBDF9779CF089537869C1329E78783E9B4E68E48B9F3E816ACF3AEEFDC7032CEF0DF8F417CEE6F00F9C88E397B9E27B1771CFBD4F73C4078EE54B5FB9844AED65BEF08593D86EE6F65C72DEB57CF582D3952F75B968B368D112468D69A6B9D5564F162B96AFA3D8DB4FB11A71DE85DF27F41AC1CB91CBB75124C0CD5BEC7CC80CAEBCF82426A42DF2EFE64EFB062BC02B7790B22CBC541BDD86C9E2BB1E24F7F8B54C0856109B06153214320D44568506B3CAC3A55D69DF692F0ED87B1AE57233F32E3F9E1D534F53A285A23146A5DE6CBF4A94CD129A1E4EB08E55CE4CFAC7EFC95EC77D1447FCC009A8A4C5AA0058DDC17DB7DCC288C22236A9BE4CDAEE635593C5BA544C5BE833A650E581CC91D4C6EDC071C71F481498A4DFDB7BD4467F2EFEB7BC5013F450CF94DF85FBCC0D541EB91C3BEE51CD5453518013B9D4A48388FCDBB4107BFEB07D366D879D4F9CDE8EC8CC100415D229A9D8DB789D5642D0492357214A21FB2836D5E36B6F31E29F6B7B293B692A5E8C1BC8D691E430939CB36C144562AFF91F884572C8A2C63064C3A856A47BE5ABAC5BB59CEE52C46B3D2E279E7C8222F14AA54A63630ECF4B8CF5D713759844C4EB9BBE4A7F412FF9999C170F9A20051E65D7558649B2795AECEAE599C79F20DDB7861F5D760E5B4D1F492693E7F1675FE3C63F3E496FDF5A76DB692A7B6DBB3993C78C52B73891D3C5E94632F961F4F616F0AB2E66D6E0873FFE0D8F3EB2889AF872640B7CF90B1FE3E843F6E5739FBA880BBEFE6952D92C5E39C27152144B3D9856CCFC679FE385175EE188838FC28D2C3EF9D92F512AC4185507C7CAB1A6BF8F389F62FA213BF1D1930EE288EDC730ECBD26E8C8559BC9FD4686754B9752BAE92B6C5B7A82523C8AC78CDD78AC6F04A9C060845D60F3D1060FF64C259E309CB33FB13D950E83BE5F7F8871C6632C6E9CCD7D9D9B60D348BEDC4B4326C5844697A9F1227A228FC5B93DE96BD999233E74004EDAA54A96B8EA73E7955F6686F90C2D6E0706395E0B46F38CB719DD8C6462762D33332FF0626E1F9E586D71E1859F259349E1BCC7180CF5C7F7FDBEBE26E8219E019F107BF59DF4DD7A168D6617653722A3AAEE3CCAB62820E45131C2B13374DB6D0C3FF6228CD6C3098D1C50C65666F642D21B77BC4ED0D180FEDAC08B6DA5695EB0A48B0E334D119BB21712881D9BE49C55501FAA6A3FE99FF856872ADF362D2CAF42EFAAC5AC5DB694AE72C0AB9D654E3AE524C240042022AB4B941A83042D242C298E0D095ACE19AC1454B9673791D3557D5775E5F62AD21BD165B76D77C02B14B9E16737F2A32BCF62F26893864C063B358C42458A1C037ABA1662F47562C729666D3F173F3229D6623C57A47A36352FA4BFAF97AE9E3E6EBBE36E76DDF300EEB8E36F1C7FCCBE8C1DDEC294496D5CF1DDAB69696EE0A31F3911229752D1E5F91716D2D1D9C3E8F1E3C91A4D5CFFABDF2A23A9CD266FC194311369CD37B3BAB39B2B7EF8030A63C771D4B107F28D5377A17DE31F84DE700ADC183C5102F970E795E7B3973F8F8C5BE01E675F7ED5B10533E7ECC22E5B1A585D259E796105F3BB5A38F4804D396A778717EF5F4AEEE95B48971F635EE3CEFCB6631AB3666ECBB04A178E14012D9BCFF63CC7A60D4FB32A9ECABCC234B63FEE48B6D876734428FFE0CF7FC2E8E2C38CF75FA1279CC67DA56D9857C8D03661025B8C9B0AE51A85FEB574BB2BA8FA7D5C70E199CA43BB29FDDEE6E1DF6A6DFE6FFFBD26E8219E41D940CFBBF3A9FCF634D2D557A9D43C55E061C63E65274B1007646A11B94C96BE3022B3D36964B6398FC068C6762A18AA4865E39F0B239153A9085A35699226D778A458B0B6C0DA8247D56EA4AFEA2BBF66496D84A6A12480A6A83CC406F42DBA564B418DDA20340DD2A14BAD6B054B5F7A918E7E97A55D658E3CE6785A5A5AD6E799A54D9510AF1C4AE71C78EB497BD06F6330BDA108DA8B948D682DA851734BD85180DBD5C5AA050BB9F4BC2F70D58DF771E807F6606A7B062A7D4C9FBE19BDFD0141B91FBFB0964AA183719B6C46C3C8B1ACEA2CF0AB5FFE99BBEEBC17C7C9D3D036828F1E7D0433678CA310F6B0A6DBE3E28B7F49D7AA125B4D6BE7A69B2E60CDEA353CF9C4732C7BF5795E7AF1058E3CFC38FEF0873BB9E0A28B31530EF3EE7F86CBBF7B159FBFF0CB2C5BBA98E71E9BC761FBED4FEBF026AC5C23277CF3A7CCDE7947AEF9EA616CDAB4F137DA375AA6BEA497AA866A6270FB8F2F619BDAA388F1EB2FDDED58316257BE79C63EC843DA30F12B31AA2C5CEB33A1A989B6BCC3FDD7FF9A293D0FD3DEFF127FF766F1407657CEFFE2518C523D326D2A3D259EBAEE3C66B8F7417A184F9B3B707FB8299FFCEAA984CB16B1F2E66F31D95B41D94EF160EF8EDC5DDE8E5987CDE6C83D724CCC882777131DBEC37D773D854389A38ED84DA94BF2E29FAD8FB78D8026E8B70DD5C69D289B708DFE624A7FFA2CAC7C10A9FA9506ACD26BAF665B2293205B4DAC484B86CFEAD6B94C3DE63784CE584C45D0AADFF51BBCF9DB7B561C30F41C284189F0B1E98F2C1E5CF01A56D3487A2A21C5AA4F64584AA69594AD0839872A8A4EDA6DBD79E8A7FA0286E2D46792C6C328F7B070FE93ACEEEC634DAFCBE469B3D879D79D09FC88C077B1E4FC40521CB2AB2F46FC5ED21965E04B22EC0D2B05FD5A42D055BF8CEF96A8F47672EEA9C7B372C16BA4A398DEA6F15C7AF97534F906516105BFFFDDA52AE2BDFE873FE1B8438FA1A13124C86458DE1773F6972E22F67C769E330727DD44476F95E7EFBD9B934ED89FDD0EDA9A15EBFA38E7ECEB30BDD17CFA8CC3193BB18FE1ADA398B3ED0C7A3A57AAF6590DD976F20DADACECE8E2D2CBAFE643C79CC0CF7FF95B76DE6F67082B6C3E7E0CC3F30DFCF4FA9F70FE2517F2916FFD89747333179CB62773278931E97B7784D29751CCB530B9F97BE7B347F13EDABC753C9CDA9505AD7BF199334EA42B65D25E09B1AD92B2B935C8D3938687AFFC2C3BAF7B86D8C8F0337727966DB2075F3F632F8645FD94CC462A58CCFFCB4DCC9AFF1372B5152C6ADC99DFF907F191738F61C1CFBEC9B6C507185DADF2687A2B6E7B6D34D3F63A81A38E9F4263241D83E46F8CF19C022123707D53750C13AB83D4DB5BB6EF1D48FFCBAFA4097A8827309260D1AA5179F12ADC7BBFCEB0A842C51841D94ED360AC22ED8B57670EDF76A9A642CAF658DA77FF2EA98987534B87A4C4C2532A04FEE590EAC2015BCBF59AE437FE4314E14612074BAE187CD3E0E9251D744459DC6C236BBA45533CF8DAC11AC76463F1F5E3CD3F5586E12AE327F1B696C6B2B15B61D5C21759B5F879FC420F0BAB8D7CE48CCFD09C32A15C566DBC64C34F142CAE48B7020FDFADADCF392B82964AC101AF0DAF641008095965AA95027DAFAD65EB899B71ECE187F0EDEF5EC631271FCF0DBF7C84D5AB237A7A9FE313A7EEC3A66337E3EBE77F97899B8DE6F2B34F20D732828F9C7BB1CA935FF9D58FB3E396A3A9FA16CFAF2C72C7BD8F71C3357771DD3517D0D4BA827FDC3D8FBE8E51FCF5F687E8E8EE65DF5D6670DD759FE69EFB7FCBAE3B1FC4DF6F7F96CEEE356CB7DD4E7CF8F8AFE2C515CEFDE269FCE1E61BF8DCA73EC5A3F7CD63D3299BB2FF413B70F7FD0F538C46F1C7975FE2B493F7E7B4ED27BCA7AB4DBA4566FC02AE95E3E69B7EC3E66B1E6246F1290A768E27AC690493F764E79D0FA075744C688BBFF6301A82802E1B9EBEEAA3EC565C4B2908F852F518C6ED77109FDA6B1223E4DE6942C5A9B178DE0B180F5F417B71111DF11CBEEFCEE60BE77E08EF679FA1A9DC45D658C96F8AC7B230DE820B2F3A94E10D364E281D7294D90AD81EB1915515B37224A65BFA78270868827E27686DC4B9A2550D8D10D37D94EAEF3E49B6EB452A760B552B4353B40E2754A69D0496476805F4BB799C714731E2D00BA96546E39829550CF02F7237A5554AB419830BFFCD861624E67409E1C652681073FBBC1709DAC6E0655AE9E82BAEFF006DC49F8761788ACA43C3C68C6C5502DEB772298B9E7E9472E72A96780DCCDDE750369F3491946912879EAA0E9492725F0A5444DF3CB029385831B861046DD464F3B24A6FB55395CAB7DB3976DC720BB69EB12D9F3DF74CCEFCE2197CE3A25FD1909FC4A1874F65A7399B3365741B7FFEF353DCFAD7DF73D159A7E21A0D9CF2854BB9F8E2AF73C0D6C358F0E03DACEEEE61EB3DF6A310C0F9E7FE9AA99B8CE0C453B7C2AD5A2C5B9AE7E22B7E42D1B31991A972C5B74E65F369A358B9D4E39C33AFE5D565CF71DD0DDFE1F179F3F9F90DB771F24947D3B96621471FB63F77DDF17766CD9A819331E8EEEFE4F1A78BBC9C35F8C021DBF1D5FD676D0CC46FFA9A622C7E2865D59D27AC05FCF97B67B38DB99031D51EC2D861B59562913D93691F388191B3B6A318A41961B8ACF60C965CF73166F72E655534816F15F6E288D38FE6C0CD52495B2450000020004944415438D50CA203ED4D873C72CB1D8C5F742363DD85BC1CEEC3CFC35D38F903FBD27AF7B1B40625AA511357F7EFCBB09DF6E693C76F45DEA8608AB56A6C612A05928BAD9EC074DE7963275E13F4C622F7365F270189E88053FE6BACBDE51C9ABBEE2132CAAA03494E74BE468A50A46C7180159B78D8F464C632F6D84B305B0E2634C51B3A79B30DA38FA49C578EFFBCF3346886AF4A7531E8F37CEE98B790CCD8C9F491A2AB2071D8BBE8A9674A8C2EE5BDB2B92816A92161B18757E63FCEF29717D02916A30DC3F9D827CFA0E69BAA3555E057802A515021F04DB569B7BE947B40F7ACFA0ABA2E41B9821F5429B9FDE4CC88ABBE763A9DAF75D2D3E9B168F96A2A7199052FAEE5B0030E62F1E26748D9DD8C6C19C1ECADA6D35F2810BB21B7DFFF14F73CBD884B2FFD22D5154B68775C868F18CE9FFEF14F8EFCE011DCF8B387F8D5F5D7F1FBDBAEE0C9A79770EDF577538A435E79AD9396B0C2772F3F8B3DF69EC5F5D73EC0F5D7FD85595B4FE6F2EF7C9217172CE7A3275CC2965337E7ECB38EE77BDFFB1A975DFA4D962D5BC6C8D179C64D9ACCF7BF7F37FFE85EC9A107CFE6D2A3777D9BABE6ED9DD623867931E4251555EE63E51A97BFFDFA77EC917E82A9C17CC2AA4547F30816FA3319B9DFC96CBAE3741A039FA79F5B8B79DF5798DAB79027E2A3B8B9773C5FBBF818C635B96AD7314EA5E8B072DCF3E3EFB35BEF1D0C0B5FE576F743DC6BECC5215B3430ADE333B4B95D2CAEECCD8FDD2D39E5F39F64DBF698146542A3119714E958785E34F2B270DFE3DDD1B707CFFF89B334410FF134D6C40D21B671BC1AC66BB7B3F6AEAFD2182FC28A629C20AB22E9C8ACAAEE22693F8BE104F46543CA63F661DCBE3F2776864BB5B53A06930E49563871817B2BB73BD1F00ED27B80C10B4BD7F05A7F48D43A82E57D152A012AFFBC718784E6835E1E49F33DC3F7C81A111DCB17F3F4A30F51EAE9A6BBBFCAAEFB1FC18C39BB52096302AF841915307D71C9133545D2DE6AD0EB59550B0E347F75AB255CDF5515686EE73A2EFBE2695CF8C58B193366138EFAF007B9FC473F62EAA4496C366632DB6E3591C6C68011C35AF12A350CAFC6CA557DFCFD91677968FECB7CE5ABE76214D6322C1D92766C1E7F6E21071D7B30D75FFF0077FFF5CF5C71F9E758BAA89B2D664CC46CCC70C659E73379C4443E7FD68934B6BAA41C8B6A25522649BEEBF3DCFC97F8DC676E60E2844DD8739FE90C1F9562D3299B71CD35D7F389D34FC10FE0631FBF84E17B6DCB41FBCFE2BB1FDA6BE3607E9357F55423D5D731A3AA38238A298B57D7C003BFB89669EE4B6C9AEE245B79896A763A7F286ECAD1E79EC5C4D646EEB8F116A62CBF91B1C525DC6A9DCD93C5980B2FF930CD8D06B6EBAB660CBD91C953979DCD1CEF3EB527F18BEA59AC6ADE9A3999679963FD9811E52E9EF28FE3267712DFFCC627185E91BD458F3863E35B92EA30A47A5CB7FC7A9733AE09FA5D02F8562FAF50C189B3AA5ACBE87F85E57FFB222D7D77908F7C023F8B6BE789CC32E950E476594CA348351FB29CD16CFA815F638D9A4B6CA654659F10ACFC9FD0A9FD76095A92E052A21B9B4AA1F1B7879FC5193599DED861455F593579DD783B53296291CC49926E91540A5148CA8C092B65163CFF0C2F3E74972A2E09D3C339E2C4D34835B4889684D8EDC531AAB85570BD5891B3786EB89EB7DEAD4E5CEB6A5E8DAAEFB3D72EBB317D4213E31BF2B43799146A31E75CF84B56F676F3A1C3F6C6E8ED60FFDD77E65B977F93CDB79ACC991F3F99BFFEFE4F6C337B575E5CB29A6F5F750DE77EE10BCC9E3E857F3E703785420F471C7928855C9A8F7DEC12666F3181CF7DE238C2A2C5A8F60CE9E6027194230A1D8A45172753C2B2FB09FD18B76491B6F3D46A657EF8833BE92DD638FD531FE195258B88A23C6D6DEDCC7F7A35DFBFEA87586686C65DFF5F7BEF01675759ADFF7F773B7D5A2633C9249364D2494FE8810408254020107A1514A509285C2B5C51B0FDB162E17AD12B551451505069222DB450426F0984F46432993EA7EFF6FFAC77CF00FEAE7A31578573EE7BFC8C199253F6FBAC7D9EBDF67AD77A9E891C76C83CAEFC0713F4D67C99918952A495527695864BD9AAA5DF8597EE7D04565EC7BCD21A0A56995F1907326C971339F1D0E9DCF495F339C05C438391E3BBBD6790AB37F9FCA5A7E359267581DC0D853C7BF7DD8C7AFC1A86DBAFB035369D6FBF711CBB1D3E9F86753730CDBD87B6528E67AD45FC26B71B975D762AF552D228E794AB7B28ED8E26986E16439C77A495443F7608014DD03B04DB7B7F513E289030E2846503D32AD2F5C40FE1E96FD21876295122DF88631AAEFA92C57C13DB2A51C62597188E3162090D4BBE04D608354012DAF177B26855571EDCD1F95B197028356269B4B395C6D86D7F7A8AFA8933E923C6C6EE3E8ABE7823EEF8D68D123D7B3B471F6CCA33450D2DA0A7733BAF3F760FAFBFFC3C3937C6E499BB73E4B127D2D3DBAD7420F232F411C62895223951C99A0B8582EAE2901F21683F2CD1DB9DA5D4EFB1D3E8E1A4FD6EBE7AD9795CF28D9F71DF531BA9696AE582D30E266C7F95B6A6D1FCE28E3F306E562B272F3B98D54FAEA679C418B26597AF5FF12D0C27C1A5977F9ABADA46D24983D0F5B9EEF70F72FD0DBFE6A6AB2F67FAB811AC7AF24D9A1A7CA6CE1449D5563AF3A6BAC0AC5BDBCDA68D5B88DB0E93DBC633A2394DCEDD403C59A75A148B9EC78DBFB8931F5FFD7B468E984DFBD67E628E49326E327CFF091CBC7836571CB3F77B3F71DEC3339F6F2F31AD394ED6F748DA01714FBA62E2F4C64D1A0C8FE5577C92D9FDEB20BE959F7A87D357BB3F9F3F6F0F565EF571660DACC5770CBED77B32D3164E64C9D18B9415594D18D2BE761DAB6EF80E0B78938D5E0F4F9BFBF0E0C0122EB8703EEBEEF92E6D5D2B98501E6095D3C8ADBD87F2E9FFEF0C1CA78BB4E1E3969B942052BF1B128B6F236DD6E0907E0FABD14FF94B086882FE279F17223A6385AE92690C2C07B3E739FA6EFC18F5E5172864E204A5003B94DB4203C32860BA3E7133856F66E8370C1A0EFF3ED6E84520BBE1926DCB769F61A82CDA08DF0B418BBC67E4BA9DC3E0DA5FDF4FDBAE7B51882558B3B59B82FFCE66E38E40111A8E924355F295D29E271D1D22A064A0C6BF7BDE7A8E271FBA8F2D9BB7619B090E597224D367CD637B4F3FA16DE1CBF049B1A8C8F96D19D162311A4E291428F76F62FAA4193CFFD88B4C1AD9C0474EDC9F29D3C772D52FEEE2E777BF82E18CE04387CF6444711D53C7CC61F8A4A9C4471BBCFCDCF3EC3C7A26EB3776D1DDDF4DFFC000D7FEE257F4147C16EC7F10239B1BE9D8BC96071E5CCE19A79FC8474EDA8F526F179FFCD897B8F207FF4E53AB855F1CC935B73EC435D7DD4BB61B6276248BEAE713EC397F1A177FF1304C7F1BF17892FE9CC151C7FF1BA1398E7231ADCC6893A9906C7707D34F5CC0818BA673E9A1737704E2BFFA9AE52FF76076BE40C9AF61E61EB349A665332EC492B69C4D1B78E4FA8B99E06EA62E3D8C6F761F44BC6D169F38752E9BAFBE90C9D9B56C89D95CD3B194E33E7A303B4D1F4D6A0036AE7C90179FFD23BBB8EBA0D0C7869ABDB866531323A72FE0B367EECCAB7F7C88F0A91B98126E2517CF73E7F6391C74EE6718BD531386E1922866E85EDBCD6D8F3CC8BC23163273E468A577AE1F3B868026E81DC3ED3DBF4ABA380CD910B33D8AA44996B6C3BD97C3AA1BE98CE5A81103553F4D4114ECEC0112B2E79D1F4EE08251D7CD86BAE319B7E40B5899914A44493269C978A56D2ED27296B2C7DFFA0214557B9D4F9C7E0CBE7FDD1DCCDAEF10BC548C551BBB29FEAF6AD091E940547491E11B29770C0A2389BB77E093087A59FFEA73AC78E041063ABBC8A4EA386CD909A41BC7900B2D827216AF9853043D24C45F2816D4EFE57C8159A36D4E3BE6381CD75166B00D992279BF8F52A6895FDEFF263FFBF9439CB0FF78164D4EB3EAB94D6C0FEAC8D794D875E729AC797C0D4F3DFB227B2DD883B6B6B16CEDCE71E7F2A758BD711BC54296712DC338E7D8C338ECA0D9384E9EC2408EB0D84898F2F0623E5FFDFAFDDC7ACF724A658B45FBEE43C3B02CCF3EFD04935BF7E1D1875752DFD8CBCFFFF3226A1236EDDDF0F14F7E879EFE7A5C2F86E5942996B7E0040E7B9F7924072EDA89F3F6687BCFE7CD7B79E2750F6CA2F9B1EFD26667595D4CC08C0389373431B2FF657A9FFC15A3EB33F8561785DEA9FC3877388B3FBC0BA3682779FB8F18EFBEC9FADA18F7761D43F33813AFEF4D66974A38DE469CBA80E1DDABD9D638953F6D5CC8B32367F3D9F3F763565D407E4BC8CB3FFD1463BC97899BEDF4245A78313B1EB7716F6A5219D8FC388DC902EDE6249ECE4EE5924B8F241DDFF13BB4F78243353F4713F43F39BAAA575526BE905AB008DF17B08B2FD1F1DBCFD0D0F358E4AA62D4E0ABDA7289A457C60A2D3C234ED10E088218995DFF0D6BFED984660DF8F148BAD194AE8F209A34FC5B042D32738107A6435F68F08DEB6F67DEE225E4039BCD5BB6D0EB5BCA20E0DD850A516697B6394983653333D2F0F82B8F77E94C0F493045521E83FFE58484F901D6AF7C8A571E594EB6733B4DE32670E0B127D1175A38857EF2A51C652FC0EA2DD137D04B4F42748B7364D66CE6D28B8EC149268967C6E3F9363535A841979A8C8CC77BD4C4928A408B5E89FB966FA0409A0D3DDD6CE91D60F98A57097B363363EC704E5EB698FA5840DCF049A513340D6F220C02D209838194C34F7FF70C9F3C6E4F9A0A050A81CDAD4FADE3135FFA05BBB68D66C6B4312C3B697F72E52E1A6B62643B4D1EBEFF756EFED51FD9696AC0B7BF7C1EA5EE1E36AEEF6563A7C5EAAD796EBEFD16B0B3F4D3C869679EC6D1FBB471F8ECE1FFD0B3ED0B573FCD813DBF64726925AEDCA9A59A28943DD27681B0DCA39C6FEE491CCE539B32D48F1CC7173EB1989577FC07B56B1F618CDD4E10F4902FEF8C6D94B0ECCDC48D3EA5CBB2C59AC8E6DC789EDEDE4C7761181FFDF449CC9E9A202D13A6A590577EF32B7A5E7B9011897EEA8B5962E28CA394EA4AF4960AF426DB7883793CD73D96CBBE7134095D82DEE1B86B82DE61E8DEDB0B65233B1E8AA07A3442EB192242B48D6DF77D8D86553761F839CA665CB95C883891882809F18AF07AC94C12370DB699C3695DF615CC96C354E3BFA8CB891B4628A2EC6AD2F06F8CCF2A6D7E5F357BE40C8B2B6EB88399FB1D4C4EF4387A7BD89475295991F345A4132DC42A433092A34B79E65DDCFD1796FCB78494E4E9B2A32F62F56937CBAB8F3DCCF32B1EA72F5F60CACEBB3363B7DD31F359FACA0525A294CEFAB8BECB56AB0FAFB793C39BC773F8DEF37063218FBDF43A2BDF5CCBB0E666280EB070D6540E9ABF3389708030339C8BBE71134FAD952DD90C1BB76C2799A9510E3066AE9B0B3E7C3CF16217AF3F711F7BEF3C8DF1E3DB48A4EBC9FBD03AA296AF5D731B773CFC34171CB127979C720879B38EC5677E93ADB91807CD6EE4B0430FE05B57DFC45B6BB78AEE3DFBEEB633E77FFC14BEF8951FF1E48A97B8EEAACB9830A2482256A4CFAD657D579AF3FFED0A42D13989599CF6D1659C73F8747619937C6F27CD7B7CD6795FBB875D272729BCFA47761BD64DA6EB791A53D01136B2D69CC2ABB961BC981B8E93A9E3C2338E60FA883477FCD735C407DA49967AC8181E39B31F6C714649902BC6E9C8D5B2AED0C07AB791D1B3F7E094C3C73069AC436005384680513254C7C8C3B7FC8CEDEB9F674C720BB5564EB9AEE45C9B2DA53AD63196D7CB6319367B5F3E77D2346A7502FD1E23FADF9FA6097A87A17B6F2F2C49A7912268F117B4281A32B89D85EC1374DCF4EFD4945EC1A68827BBDFEA347FB7EF8945214C924C6409D3B3C81CF913BC9AA96A08C0F293944C4326C59563C95F7DA8B78B2C8D8AA6CDD5BF7D90DAC93B9368A8253B90E5F56D39CA9608330DC99146EF34F48EFFF328CCBB9D5AFEFB510849958B39124609BBD4CF9AD75EE6A9C71FA354F299376F1726B48D27E7BBE473399C01A93BF7D3431E6FA087CB4F389D2096E247D75CCDF91F3D85FA38B48C6C0227E0E2AFFD80A9B376E1B3A72C521E81B73EB989B3BF7223E5C428EC641ACBCB92A44CB6B79B96BA04138739CC1C534F2666B2C7827D39FDBCCF901EDECAAFAEFD3A3FBEEED7DC74DDCFB8FDC75F66FF5D67F27287C511675D4EAE2FC76DD77E812F7DED3BACEBAEC3355B280FF451EE7A934B3F730AC386195CFED5DF71FCB20339F6D0D1A493033CB6F24DFEF38627E8E86E249B8D939918E3C4E3E7F3995376656CFA1FAB4371EE976EE64B179FC8630FBCC0630F3DCD404F11279654834081E92A3D9071139B38EE9803A94BC7B17C7073257EF89D9BE9EDECC22DBA94EA8B94A48FB33C023B1C413C55C78419ADCCDD670C6D13628C340D25EC550CB3602508C5C04BAECA9EC743F7DDC77D4F75D23B90C42804CA5ACB2B974836D84CDD6512071C3E97F1B5627CA51F3B8A8026E81D45EE3DBE4E752A4B2962D064AA2884592E9032B7905F791BA567AE221D6C51150119F6289B8EFADD0E7C3539578AC588178A4AC2B238F56852077C95C06EC5347CE5EB27943E34C8F2970E49DAA0A58783D0A36CC578F0E54DBCD09EA36DFA548A258F17D7F7910B93CA1F31AA67876FEB70486943EADDD185232A820C11F7D0EFD1EBFEFA2314CB2CC3C096C985304F501860C3EBAFB0F2A1E524029339BBCDC7CCA4F08B7982813EC27291EEFE0EE6ED348DE3F73D88FFBCFD768E397129E312B5A48B05FABB3B1935651C6EC6E2A6FB1EA1A9DCC9C9471E419F0FCBCEBD922DF9243D2583BA4C12AFD0C391FBEDCA4B2B96B360E638BEF2E95359B1E2259E5BB581867133B8E5EEE594BA3B98BFC72E9C70E85C5A4D97782CC9FD6B03CEB8F0EB5C70EA31ECB7FB144E3AF30B307C278593E1664997B731B1C9E1CA2B3EC3399FBA8A96A6145FBCF068BC621FE75CF815B2DE287AF349E28914B3F79BC281FB4CE5DC23E7D0F08FE5673A722E0D0947D95E6D2F85B4E75CBA7A5C921834C7025A6A6C52A998D2B3B66216253FC0159F411F7A0A45E28E8327E7A6C8C51A36B665A9F6B8540CE2D226477EF0DC8D34CB6588AA1C26294BC79174678621BDB912FD259FDE6E0FC748D0506F924AD8D4A694CC8CD2DE88CE1EFDD811043441EF086A7FC76B444D4ECD518591A69CE8308B2251CC18C0E85B47FBEF3F4566E079CC720FA6635090C942C32216B8247D71CD0E31BD0CA6EF914BD69198FF059C396752B01D92AED4FD061BA3FFCA3129A713F9E4D0C3B5626CC895F8CA8F7FCBE1279CA83C015FDA384077C9A2E485984E4C7D6195D4A81AB0F1552D5A4C6177F461F9B63212756D11FF2F63FA52672FB2F1F91758F9E00334B64E61E2942978F91E4A035D2428D3DFBE8D733FF23172D91CB9ED5B98B9EB2EACEE29F1B33BEF6763470733C68DE2CA4F1D4FC237B9E791873860DF3D495B8EAA636F77037EF8CBA7B9F791959C78CA899CB1FF68AC810146A69398E52C99749A4E69DF4BD6F0F0336FF16F9FFB3ABFBCF91B8CAD6D64443040A96C70DF3A38E77357D06214B8E2B2CFF3F18B7F40A97694723BCF582EF6C05646267D2EFFF7CF70C1C597327DCA08BEFAD933E9DFDECD672EFD019B7BE378AAE3A6C4E9671FC3E2853BB1706A1335A68BA8FFA19C6A06FDA48C40C9BFCA5E853C5222A615F8AA53C753E52BB198120D6C4F8959E54CA14D54569A91EE2075E1B4558B9CDA331EBA729ACA8C5C49091822A06DC899E847FF53FE81D1FC67D2AFC3140D153BC4370A04A194326218651B433646E40D24F5362C7526FBA1741B0DF6BCCB9D617970A3DA3209ECE8FC8E9410C5AED6C330A400AD47BD77F4FBA3097A47917B8FAF0BDFD6878B6ABA6A96C30BD430871196F1DEBC99F5F77E8F5176077EA143E90ABB564289CEA43D710217CFC238040E091FBA62AD0C5BFA4DCCB10763F865E50DF7B70601A411CF1265BAB0846FC6E8F64D4EFFDC959C7AF639D8B114DBF201AFBCD58E53D3486FD1C550060111415BA18CA2DB7F9641BF7BD96F9741FEC21EE2BBB36D2111D7128353A112595791A0A783877E770703258BD9D36761147BC817DA09077AD86FF24CF699BF90BB573EC5019386D3366516675D7D072BFAE28435F524BAD7F2D19D5BF8F64797F085EB6E63FEDEBB71E4CE13A5AF8F6C6873F97FFD89EB6FBB9323971DC1E5A7ED8BD1DF45C271A8AD4D2B82ECECE923595BCBABABD772EEE7BF4BCEAA67FEDC299CB1782E13DB5A5995ABE3944F7E9D45BBCEE1D8C3F6E6F26FFF88CD03B5648B319AEBD2B89D6FF0D94F9CCCD8B67A3E7FF1773878D1CE9C7AD4CE18418EA2D9C4AFEE7E955B6E7F889A9A7ACE3AF3608E5B324FDDEA4B2D5E8D1899E6A0999908B544FB084A163694F6C4245933F2FEAB51B2B4D282E34486DC76648F562647027155977D0871563708C218E550CA6496DA91907AB19A0317053BD5E71E5D64879CC0239543303DF1CA32089D10DF120A8FA460A58C21E79E64D6CA744D8859FD8BAC41DC6AE5962F1E8976C9AF96DC6DB91886A7F4370CD7899E2A29B4A4D2FAB143086882DE21D8FE9E1749CE1291B33C2C75D64A7786B89AC89776033DCB7F42E1F99F31C26CC70D3D4A661A2B30487992D124C8C765D8C4265D36F16D979E86F98CD8FFAB98CD6D6037802935E4BFFC90AF9B081899483FB44DBF11E7FA7B56D253B699357736B91056AFEB64EB4089205D475E6D3ECA71465F36E9E8F89B72A3FF839EBF6C644A99447585843671CBC4280D90A2C4338FDECF9AB7B6B3EBC4A990EFA0A7B0911ABFC8BF1D761CE9783D37AF7C82630F9A85196BE0DCEFFE812DB1C9CA79A691ADCC4A6EE4DACBCE60C34040EFF62EF69F35516DE29D7FD97F504A36F389B38F655A7303996000694A7CF98DF54ABA473A5386A5E2CC9B360ECBCDB17920CEF35D393EFB85EF72FA01D3F8DC1947B32117E3E4CF7C8FADDBB37CE38B67E23809AEFCD1AFD8BAB95F89D9EFB7E74C2EF9C2523E7DE94F58F5C25B7CFEBC539931DE22F0F364CD26B6151BB9E8922B3874E9520E5AD8C2B28593A811C1AC7209C349293C22CAF4445E90D096ADE442446AD4D0EF18B80634C85D8D30B35C24079DCF4243BA810A91C26190023117360C35C12739AB5C0C230571D98C96734D08544858DCB5856807F78207E3163A39027190376284240870D424A1A887CB5362D2D819DAEAB551154C2EF9E2386F83278EE0018168489B1E9ECAD1E55C8F2B971D7903E9B0D33EB17F0F5FFCF9733541EF3876EFF1959243475B7FF285B4C4E8536E37CD2405E594E292EA7B92DEDB2FA6A6EB090CC3276FA6947E47C22F9113271243BA9FA5DC21E3B3218E78CD0DDF9BFAC3BE8E553F77F036F22F1F8E6C52DA52830CF34A0F386BC4D9520CB8F0CBD770DA47CFC0B04D725EC8B36BB6D24F92BC1189F66378481E67292190BF9E01454A797FFDE159059539E3273083B852A18C592E6630C09A375EE2A567563377C438C2EC46FAFCCDEC356D2227EEB4076698E467AF3CCDAE13473271EACE5C72E3FD3CD3279B54719CE216CE5ED8C625272EE0D7B7FF9E1933673267C6246E7DF02DBEFCD3BB39F4B023F8D87E23195F78835E3FC913ABB6B3A6A7ACCA1E3535359C71EC1286079D4C1B912455DFC26D2F77F1EF57FE9C0F1F30850B97CE531BB3373FB999AFFDF0D78C4CC137BE7C31ADE3E36C6FEFA0396331AC7624A79FFB353A73358CCCF4F08D8BCF205E2A73DF1F9FE2AE87573390184E7BA99D8F7FEA14962E1CCF4E0D4952A2DA2C59B0158DED4704ED826B53B0434A46995A378629E251494FB96567DCB8AADFBA8E64CD83D41788DE899C08D26A1995B7A24E1BA9F10FD6382463167DEFC109D1774C71544BCFE09D9C3C57F276C9900325156B88A34E1865C4C2AFAAF5D3C86248894262A72E1272C12D1288ED5528F74362EAE063198E2AB3A86C5C0EC77445111A0B59C33FB8F8FE1EBF79D5F0344DD0FF82284675C2A836278A1AF26512B2140A14C9C85A7AB1DEBA95CE3F5C41A3D54DB198C788C5D5449E6BCB1747BE28A2BB2CF98D85E58514CC3861CB5ED42CFE06566D1B864C8F85B5CA6C56CA09F2E5B7E53B2B99CEA038A9FC291ACC05CBE08B3FBA8354EB4EEC31B70D4C938D399F475EDD8C9B6A2070E284BE87657AEA4B2B9B48437DD2D28027C7FFB65EF4DB3DD2EF2E6ABC03AA6B97D5EDB2E3891C694C8D443B691BCFCFD1DDB185D71F7A9C098D4DF40D7461A661E9A2054C8D25A9F13D7ACBFDCA5C77E4849D58E35A5C79CBEFE8CF0E30BBB5892F7DE80446793ED7DCF15BCE3A6D29E9548A2FDEFA003FFAD3CBA4BD5A6EFCF431CCAE29F2FA86F5BC9A4D71EDEDCB39FE88A574AC7B83975F7A91C316CCE5F47DA78059CBC7BFF69F4CDA634F8E387026CDF492B01274166BB8E287B7F0D8EA2E8635D4326E784C79EAEDB1FF7E7CEFBBD72BCA690807F8F2858793B03CE2C9363E71F18FD95CAC258BC729A7EDC71EF3EA386EC14CD2865C5425F6AAA2ACAA03F29BDABC0D2C655B25B5DB444044E2B68767F8D8414CBD46D40E3D951FCBC5D6896AC35288928DBA77BF979A8A8A646555D62DFDF183175095302B612BC98C878AD562DE1B7565FC3767B3E800413276F9E4C1F348069142847CA31545742FD5694B9D6FEFBC8F64FA92FDCB5D8126E81DA5194DD03B8ADC3FE875B9C11A71DC5B47E9A99F917DE6670CA303CF2B508A67D468F19FB5DEF99EAAA78A13897C397B5B9730E2804F632666133A22BC14E5EAB2C3AE4A142A07932F6A747B1B88C469CCE68DDE02CBCEFF3A9FFDDC45D435D42801FD35ED03BCB1B5879C19C3B593B8382AFB7E878C658368A8A631748FFC4E5BE05F82C495FE595F7446A4C40161DC26EBE689DB0603EDED6C7AEC1132C904DB7205D58298B161DEE8619CB27057EA4A7DFCE2BE3F70F0D1C731BCB6254AE9CC027575352AC52B153D1E7BFA112E3CEA60AC7C8E177D9F73AEBA95DC8612DF39E764C60CEBE7E9D7DEE0F617FAC88C9BC73D37FC9423172F64C573AF72C159A7B0685499443CCDC32FBE8597ACA375FC6836BEF10AB3DB5A48A8E11F9B1FFEFE39963FF512FDEDED943D9B52AC8E58C266C608B8E8B40319D760D0DB5BC08DB5F2CDEBEE62E55BDD4C983C860F1DBB27472F18CBE88C18A5EA1AEC3FE8EBF27FEE6D3441BFCF210FFD3C8111C733039CECEBE4EEFF06E12BB7529B09E8712D1CC752B5C4B769310895CE83E85C88C1AAA885F565F662C4215FC76D9AA3BA3A1C21D5C0509B5192C5444327463479888BE707F41A31EE796E0DD7DFFB1C1F39EB38FCFE3299B8C9AA751B58DB53A6835A72B1464CDF1DAC9B0FAA6DFC37B38041F78CBF82A3BA7308A20D2755028D9B845E8954A988D5DBCF86671F63203740AF91C44DA6E5C699FA5217E71DBA1733EA2CFA4293A79E7D95E19906E6ED328FE67175ACDDB68D37DF7A8BB56BD773E6C74FA4B954A43148D29F88F3D8FA2CD44F7ECE0000200049444154F98E3263E3BD24CC553CBB21E089F67A5EDAE2D232AC9E1199180F3CF420A72C3B80C5936D1CDB25AC9FC065DFBB8D97576D27C8F6B1F7CC662E3AEB086C7A544D785D87CB6B9B3AD8D6D989E3E79937750CADCD0D140A457C5274F7E4A91B3E92555B7AF8C14FAEE3828BCE61EF69C3993326493AEE4823E4FB7C96E98FAF54043441BFDF91F3FA09AD34BD86A5062B129D0F3070D7D749F4BF8C5BCE49F561D01B303A50D3B4F0C2882C0DCBC12EE7F19219B65A33693BE42B18A3F71ED48F967A7792D0940D27B92D954A6208A56CB4B1E3A4D5A8F5C7BFFF3B82581DC71DB680A4ECC2DB266F760CF0C2E62C1DBE6C1A451DDC6ABB4A751BC834A46CB6A9662A5533FF737BAC3F0754363B25E9561B856648D970C95801357D034C88A5787AF99DACEBDA4EB759879F69A226EE606D5BC3998B66B2706C0D8E5987418CCDEDEB79E8B9C798B8EB2C56BFF52687CE5FC0C269B358EFC86698CDD7BEF83DD22D33E80D93CC9AD8C69E637CC6356CA5BD3BCEFAFC08AEFBDD2374F6F4637825962E398046BB8F836635622513DC78F74BFC66F9263C7B3485AE4EA60C2FF1FDCB4E27166C259673C97B31DC749A62394BCA28E2F66EC334124A9CFEA6FBD7B27CC573CC9B37819AFA0433674FA3ADB59145B35AA93307C5ACB451EAFBFD2DABD8CFD704FD7E874EDAAC4C5BDDDE0BD1394137E1C6FBD972D7B71815AEC52BF7ABCD1E65E2AAA6112513B5F014519BD84E19513CB28D3A7A9D49341C741EF6A483088C264CD9DC911E64D1831E1CDB961E5B4217D7F309136936955CCEBAF82AC64F9EC221471CC240292096761828F8BCF1D62636F67BF4953D4C2B8E614B2B97D450A52736FA918199779760DED1F418BCA0C8E693B2C492563BA9A59649FA65C60606BB8F68E6869BAFE3ADFE7E8A99568AF14670CB4CAA35B870E97C86E5B740BA9604068DDE00231B6BD95E2C61D6D4D05C5B839D1B6063A6898BBEFD7356777914E22D947C1BA7D8C9FC8601BE7ADA7E247C9F57D76CA5D78BD3950FB1620E69B3C8C2B96329F76CA0DD1DC985DFFC397EF34E749644FCBEC4D17BCFE0ACA37765DD2B6FF0DCE34FB3FBDC698C19952257EAA55FEAFF6583C64C3D66A1C4C997DF8A97A8A1C6EEE4DC338F62F2A416769B319626C724E5BB18D6FF466FFBFD3E39F5E7BFDF0868827E9F23A04C2764502B28AA8D1D19C7B6C32CC6BADBE9FDC35771BC7602E92D0D5D6246E4B6AD085A48D78811D8596CDFC229A5D50E538F91A466CEC9A4E69F831F1B85299B89A1130D3D8432A138E84F3828B42FFBF11D399F4F7FEB1ACA756338F8D88389C76CAC72C0F054C8FAFE40B5E06DDDDA4D4F7F5699C32A825624ADB6B030DE766D91FDC37709440F66FC6A807D7023AC6C9449042EBBB6B4302595E14B575DC556DF24A86FA5686430DC80E9ADC33968562B6F3D793F9B8C124BE6EFCCC1231BA82F9721D9805F3B8C7C6180965A876DE524C77EE96AB6378DA5148892922C7080C52D369F59381B0A1DA4E33E857C91AD5988D734D0940A4939657201F823E671C1D7FFC0BA7C968229651E9F51318B2316ECC3CDD7DE4A602598501FF0B54F1E43D9CF71E1B7AF615B39C567CF3A83D9C32C4EFFDA2FA81FDDCAD9272F64C2489B39D35AA889992AA699A106455D827E9FBF6595FBF19AA0DFE7D8C926615C0A075E0EC218453BAEFA5053C156FC977E45C793D762BB1D51F9A13CA0485A287688A04D0AAA7420FDD209CF26EEE5C95926F9D10B197EC0A5987593C0C8E01B32D9160D31A87D3E51A153CD192E452FA4DD33B9EC27BFE3B5ADFD2C5DB698496D2D84A51201F16823DE3070E58E7D906C865A6AFFCCFC7B6810E25D98CA7EBFEC5B4AA78064D152B50D5C9726C722ECEAE5C2EFFE9852C368480EA318C470EC04E59E2E6A6352DD2DCBEAA877BBF9FC718B99307624BF59BE92753D2E5D6FADE7E2938F628FF92D2CFECC8DACB26AF18334B6E713789DCC1AE6F0897D16D0D9BE86DDA70C23ECDD4ADEA82388D590A2C0B69E6E9EDA52A6CFD989DB1F788A3E11A04AFA50EC251504585E02CF8B633A718619FD7CE353A7B272E5D3FCFC8F4F32409AF1C393EC33B9810E3FC9BEFBCD67625D99DDA73711B70C3C31B436C5D035B2F58D0645F44323F0F723A009FAEFC7EC1FFA8AB2AAE486D8BEB4DF496D5732636973F508CBDB293C7F25BDCFFF96B89FC529F59130A4AB5AC672258B96B17021000F533C0E7DD15208C8CAA45E7A18F9702C4D8B2E20D6BA0746BA9520CC60A84C5AA5D17852172E9688C5E3644354CBDFADF73FC34F7E7D1F6366CC63FE7E0B993532855114A70E5F3965A82E0ED5DA2599B249A88621A2662BA5D7A112E877A6570A66D4631B97A9379131754C3CCBC32DE509F379CEFFDE2DB80DE308A4275C7AB0A52462C8C6A8110D675831EA8B1D7C6AD9029A86D772C94F7F494F6A2461BEC08C8638D3C68EE2AE575FA73FDE843510A3CE8742AA4029BB85F1758D746F58C34547EFC1AC06D8D6E3E1DAB58C1DD9C01F963FC3F54FB663D5A4D5E7F9761D1282985704BFA014DE4A561CCBED87623FD3DB26B169ED5ADC528954CA64EAA4111CB0680F268E6A60464B9AC90D0E2919891664C4A24CEE2E641250C9C1EA4DC27FE897E6FFD09B69827E9F831D8D824B563BD80AA7BAD654E33342DE8EFF32D995B7907BEEF7D416D761FA7970624A8E3450BA083E31D720A6349F8B146C08620D7805485825D67A696A26EDCFE8DD4EC51CB60718C3D5C6A16785140D9FB410AC2B9B837102D3A60F93B57D1E3FFDDD721E7AE635C68C6864C694494C9E3291444AC82CEAE61592577DDD7E340AAE2E3383757451E3B1D598B2AF26DCE4989076BB42998429C332E25E5E22DBB1991FFF76397EA2498D69DBA6F4474BBDDBC153E576B1E94A5063949992F4189E4EF2F89A4DF4256AF192719166C3C8F763D70DA3EC2748F65924DC806C3A209F0C09B239D515B2DB489BDD5A33DCF7C70730E31976DD6D771E7E7E2DABDD4612563F948BB85E1ADB4AA93ABF119628067935FA1C0B4AAA9D37ED24681D51CFAE9347B3F3F43686350D23D390624E8B43BD09C9D0C310861F720F91DDDDC129C01DF77C7C9F4F4EFDF1EF3B029AA0DFF710FCF503900452C60462EE1678E9267A1EFD31F54E0FB95C3F8129B7DF0E3157C850326297D0F0D5D49EA82188C595D48B0D338BE92468EF1FC58859279199730C467D1B7E22495EC472064B1ED22B2D03E192999765F0CF3068EFC9F2AB879FE7D11737B161F3369C545A5D14E47364E046DAF62C4F067C2D4A6602576AE222F2EFBBD8AE488C7A245C9FDE648CBE9849831FD01008413B148D32138625F9E8874E26EEC41508327028D660A23F11CA549CA4D0A2952D35EC3020085D4231A495963D99620BA5D41365EBB68C45CBE44628B39972F109294BF62EBA278288F48D7B79F596EAA2419C12316CAF88E9CB7B86F8A25DA1EE0CA44DD153C33AA2F857934ED0DC9024637B4A36B5A5B18ED14DB56A8C59ED1F0CCD74BC5D0192F789DCCE23D7759D417F80BF661FE843D304FD810E0F944B3E8E288A051DF8AFFF8E6D0FFE8816731394FA2985B66AD113329571703521269A0FA168F34AFB99E846D7E30AE1D5186CF73DB2F166C6CC3C92F4A4C33113D329261B285A320726536A91EE981A1DF6C46216A5AE5794DAB11F5012229381C5C1CD2F21542B1644ED734856ACE62409428F8C08A189D156FFF3584623E5D444759CBE15952EE4734CD320ADA695A302493412138DC60D8DBF28B303A2717929C944741C196DC98F7CE6A09E9A7A9EAC41DE4F9559E4C2E599F8BE41393055FBA11C9F9ACC547571280CED69CA1D8192DE8C2456FD207ADFB438C2F81EE2BD98AA91C1E5485FC2F20AC40C191672647E3B1AE953BAAF722711AD4875CEFC4D25930FF8C9A70FEF7D474013F4FB1E82BF7100421E5E806FCB5660489A5E8C55B730F0E055C406D6108B998A607CD3C63725FB8DC6879DD0231E9471C4BCB55C47681994CC3EFC544890B4E9E84D520E7662C2B42538BB2DC3AC15BF43E5861869E108E104B6AAC306410111FF15C19D282B1F942F55F9B610734CC9A80A35D9A2181CE4B0826E286F67DB8B2BD8F0CA354C1AB133C3F6FA77C2CC04BAED90786892F02C51E2C142FA58A2894735062D3B97CABC20226A2B28A83585A6B40CCA31C8D88750B964D8F2931C6C3D144A97632A0F66C0836A6EAEBC775C19EE1684BA95C101AA246404458278245E24C6BE8472BF227723F259715C71B909F291116E98A02406BB1E241CB9B8E431C47841843F4379BE307FD41F2E23FC43E3FDEA42F4413EC7F4B17DA011D004FD410ECF601A26596BC996B2B46C046EC1DCBA9CEEE537126E7B895A3A4561034F7A94CD48B3574A0F4EE0295D615386522401570236A2A017533A206E20FDD4263D5E0375A3A653BFD36E58ADB331336DE0B480D9A04A25422E41200E1D426E919980CA73076BD09E68750C119E2793786FE2AF7E84BE67EE2451EAA49CEAC21DC8D138E778EC7D2FA5109FAC24A22C374B188BABF63F718889EADA923A4B7921EA1A512A97EAAE40B253D9649432CC604FB8126092BAAF088FC8C69C64F2D2FF22346F284B30B962291991A1D283BC8F682DCB55668835AD482C88A0AC6ACFEAB3B009CD84EA9429ABF64643B5321A229A216F618934A741D9944B96341146770543C6096AC2F39D02872278FDD008EC08029AA07704B57FD56B064BA2CAF455B248CB410A0F1605ECAEA7C9AEB889D8FA7B70BC2E8AAE48594AA923CA2FA5AD4D39A1885EB01054108350B23D5309E763E6D53DBEE9C94462827E2F49393682A06122B1A669D48F9B8BD93806DB6EC6101523CB21B424F78C8A0C91D04F99A0D44158ECA6B4EE55B6AF7D01A77F1D56DF3AEACD3E1CA3487F902193ECA1AFE853B3FFB770667E32B230F07A3113494A463C1AC4192AADC806A392C75476E894E562A208171C25E216F5880C9520926148B958C649C7C8B945758CB2C928651AE1F081681092B429629A6542257CEFA87AB928FD498D3A65464342434A9C42D20557962C251B116935900E3CB12D1372177C074C033F167D86943C54295CFACC552B8B107E4939942853DFA18DC37FD579A33FA76A10D004FD010FA51AD2F64BEAF63B3493E444F7D780DA3087595C83FBF40DF4BDF22762412FB6D7AD6EC9A3163A07CF8C0D2A9545824BD2BAA7C87550B55DB2605F32615BBA26C41123AE3EA3E01A943D534D0E0E146298B15A12993A9C741A4B74407C9F72214B21D747C6DB8C13F42B764A482924F4702C297EF86A53CF0EC711943690A9F7D8589E43EB513760374E278C95D8FED61A4C291128E257A29714DCB2FAEFD671E3545B9FD4BFD5A6617F0F3DEBDFA4BFB313DF4AD03A6D1E89E175EAB8E3F27257EE163CBA366DA4BD7D1B3DFD79E2E97A9AC78D66644B73E464227716226E1F7874746CC32D9748043E8D4D2309E2B5AA94942BA35CA8950788EB31B0693D461010CF6448363663CA6460083D9D3D1472FDC4247B17BD12C7A1AEA9194B0C0FDE4E98A36ABDAC433F34023B828026E81D41ED5FF61AA167B1278A6EA35509403A1D24A3B64CA5B111F3B6C0D6E7D9FCE8CF31DA57D0686C477A14442FA36CC43143E92916828EF47F238296FF975A2F918591CAF44202A590178948CA3D7B10183876B431174926C91046A89A121CC9BE955E748813ED8DE1FB22A31A792B7A5210B76DC2B2473A99C2CD0F60587136DA539878C2B7E92D3673FF8D3F65B421033A01252B49D64A3360A7959EC67E4B8F61EC9489389ECB0B0FDF49D78B8F901A68C7714B84E9E16C2C25689EB517BB2C3992783C81D7BE9195BFFF25FEF6F5386651757B88ECAA5F76B1EB46B3D3FEC7317CA779AADADDFEFA2BBC78D70D3494DAC91B09DCDA56F63DEA2324468D15856699DD216D14B9E717D7D0B0F649EC5882556613C3763F84DD16EE45D8D9C193377E8F96FC66CAA275E2A4289B31BC781D8D6DD3997BC0129C54ADDA17103391BFE519F92F3B95F4075524029AA03FD0618B085A9C40E4365F5ABA645250E8526AC9FD56526DD4D588C346711585153731F0F25D64BCAD588840FF60378354654307D31F525693F281F44DBB58661CD78DDCEAD44C8565E08B2BB4F8E0D9268E6CDA495B9B6CE50DFE69887555549CC633D41CA4BA084836698A09A2D292B6F0FD003396A5E8264904192CB39B42CC677DDD1246EF71212FFDE1E70CEBDB489F339A6E6B0439AB8E6D41123F5587317C24479F7418AFDF791BC5177FC7C8A449A1A748B2BE8E4DBD2512C3C6D121FEE82DB339F9C88378E07B5F64A2D54F284A7DA14191128EED91CEF7290795D5FE68C61E7B296D931AD9B4E2517A1EF809C3DD6D6C1157927413ED99691CF9D1F328C662D418215EE766EEBAF2B3CC49B804E52C5B1A26F1277B1E071F7B3C63837E3A7FF925C6F5ADE24D7B04F95823AE99A4CE1CA0E859F48FD987034E3881926953636947910FF457EC037E709AA03FE00192C31B9ACB8BEE9CDF99D293BC58BA3B842B6352AA2876521E58C5D67BAF22BEFD0986C7BAC9CAC48A19236D2530CB723B1E1988AA0D35C357A24BEF6C69BD7B0630525F7FB70CFF3B9FFC0E68AA22AB860B25C38F3A3122FFBAC8EB2E6E0D5014D926258F1A27E69528382DBCD97820D6B65708CD466EB63E44BE7177EA9D849242ADF53A18B7D358C64C1C46FB4F2E614EB88255F1793C5A9CCF969A5AC64D18CFB06D9BD996EB649B3D8C93269834AFF809713BC69FEC9D79223E9B516DE319EBB8A4B63CC9DEED3F57032FB70FFF08A79FBA8CE2AB8FD27DEFF7C9A75BE90E6DA6E65E6585B91F079E760EA97175D4E1F2CA138F91FEDD15BCD0B080D1FE1B8CF43BB8AEE15C962C3D9811B1809E9F9E46ADED714D7A19E9917355DD7C9F37AF60467E1DB7D49EC8D4457B3067DE6ED458A2C5A71F1A811D434013F48EE1F6817955A0C63242D5B5A0FCEB4A9D60B4E3AE7B82ADCFDE436DCF93C4CB5D329281694AAD39505649A23F2DFDCB0969C753031A83331A8A60A3EE5DA1FEC86D63C85EE3FFA568D9948C46BD85A5A311F2684063A80CEB9A35E4EC3A0CBF1BDFF4A8A544C9AD656BEDC18CE85EC7DA5203BFAE398EC5C79EC8B451524C8E8B123596EFF3EC430F925C712DB6E1F3FBD49114C72DE2E443272A31A25ACFE3E9F602AF6EEC61FACAEF32B1FF351E482EE6A1D82E1C75E49EEC3E26A188B1DCD7CBC6FF3C9BFAB08FBB33CB98B2F71246995DB8775E4E776234AF596D2CCA2F676B6C26EBA69DC4B147CC5663F7F75FF525DA06B6F0447277A6955632DADFCC350D1FE7F0231633C2F1E9FFE929D4583E37644E61AF638EA0796492FEABAF6052C75D3CDCB894626A24277FE424629625CD8B1F98F3451F486521A009BAB2E2F5DF8F368C6AB8D2252D6D73AE2F8EE1628FD44F50EEC47BE9410AAF3D40D7B62748C7B792B245D2543C3E0D4C3F4360960895B55534FA21AD6CD2B7A0F2F2506AA8B9C83B2F52DA78D79F839C1ED428B53CC9CA230797C8EA28FA5D265D12F8A9E1948C3E7A1D9B7C364F6BDB3E782D47D3FFC7DF50B25AB83BB18896B135C4824DE41B2670C0FE87D060D93C70FD2D4CDC7C2D7DC9366E708EE0C0630E6671ABA38CA20DFAE83732F478063DDF3A8A616E8E9FD59D4DA16D573E7BE4785281B865DB643D8FE77EF06F4C2EBCC4D3E9FDD8D4BC903D674F2075FBF974382DDC1FDF8FC30AF7526F7A5C5FF3613E7BD662DC815ED6FCC799646B66F1A439830585FB68F536726DC3791CB1F4405A9C32D99F9C44C6F1B9327E21C77DF800DAC4DDE63F2EA0D95FC91DC38E635B3089F3CE5F46C6922E0F4DD095FE357BBF8E5F13F4FB85FC3FEA7343A9494B3521A984FC076951C97E4AE669973C0C115DDAFE04DB9EBF05B6AFA4C1EDA1A69CC7F2030A660B45710537CA988AACA50B448C6D85E0243996AC36F294FBF3524BB400531AFFD4349E585A398461D4CE27A3D8466853EBB5E3990E5DBE455FF35C46ED711899B67D59BF7D049B6FFA3273F22FF35A7C3AA659C6747C5E4FCEC618BE134B0F5DCC833FFE0E93BDE56C3666736FC3617CF8C38B98E29862844DDCE8501E8C5BCA0EEBBFB58CDA00EE6A3889C97367B26CE1580AA429173CBC789CA7AFBA8C9DB30FF3AC3D8BE589851C72D02246FCE674B61ACD3C38FC04E6792F32AFEB3E7E9D3C8645A77E849E477F4DDBEB37724FDD09AC8D4F6249EF2D8CF637727DFDB91CB1F42046D945B2FF7522B58EC7D5F6879937A591968E6719BEF129B6D7B4F08BC4329A9B46F1F9A32690144715431739FE51A7FBFFB5F7D1045DF1118F4A0A91ADD53B0F95B3853E9E212D7A268E7802660B94BAD7E0AFBE8BAEB5B763FAAB70C22231DB26663A940A051C3101308DA89F37907CD82190AC5AB274D59E27024DEFFC88CFB61AFE905173CB60A054209192294483925B269F77709AE750376101B1992762D44CC53392BCD1E9B1ED868F511B6EE0F1D442422F895B34D890D9854E1C3EF9E1053CFEDB6B59D07E3BF9603A77D51ECAD91F5BCC58E93691C93FAB1DAF94A23D4CB1E55B4790F15DEE6C388D390B16B078973ADC308563DA6C770D9EB9EA52E6E51FE749732E4FD6EECFBE7BEECAE8DF9F414FA285FB524B993E7114739EB984CD35B35835F163CC5A7B13A3FB9FE3C6968BF0EAC772F0E6AB199E7B836B336772F4514B19E564C9FED7C9343825BCA044A6BF87C049D1DFD8CA23B123B8DBDC8B530E9DC8D231A5C834414D69EA8746E0EF474013F4DF8FD907EA156F67B56FB3B310B68C4047A3CFAAE42059AD742B88BE841B623945C27023F96D2FE2AFFD2DE1FAE718E8969E8800215C51A416CF6602E966162381A8B54EEED47D6F682331BA6DB7C298AA6D4B0B483994917293BC68323B49EAC78EC3987534F191FB62C647E0D1AA3A3EE4B1B5A393ECF5CBC8C652DC913E996953F7666C4D8A7E33454D2264EEE45A1EBCE55BCCDA742F595AB92DBD8C93CF3C9A29A68765B91074937346D11342E715CB1851ECE4B7CD1FC7DE6509A7EE5947527AB37D19854FB0E23BE7D3EAADE5D1DA25AC8E4F67E9C259C46F3D9B7C660CF7B22F4B4E3D92E2D527D09A36B99B8359907F1C3F99E0BACCD12CDC674F46DEF969C6065BF851F20C8E3966192D4E9EEC4F4FA6D67179303E9F2DC134B2B2FE844BDE6D61E7DD7763D91E1986491FB88C7FEB3EE80FD477A6920E4613742545EB2F1DEBDBC43C48C86A4E7AE8213E538396F7868B6F7BB84A7D2DAE6ACE4660621573185E0F617613C5CE5728B7AFC4EB7B8D7CFF5A707B890D1ABE4AF61C480F74A440AFFAA495A6925154433166AC0927338944E33CD2A37725D63403E24D789934BE1323E6E6F0AD8C52A293E9BBF6AD9D94AE3D0E23D6C0CF9D935874CC91EC322E261A4DD4980186EBB2F1F9C7E8BEFF47D4387D3C64EDCD6E277C9A29633338A18BE99579655B8EF4E826567FFB3CF6F456F364389B0DD38FE1F0A3F726E379A40C93979E7A06FFDEAF924CC4F865EA78EADB66B25F9B45F1B79750488EE00E771FCEFEE471ACBEFA7CA6145EA797F1341B259E88CD6065F39E9C7AC4EEF4FEC7C76833B6F393DA7359BA6C29239C22FDD79C4A8DE3737DED39041317D09CF09838DC644A5392498D8EF26F2C63CB188EAA99EB8746604710D004BD23A87D905EF3361FAB5964352822A3D432DCA246BE7D35D3826F0483D6AFD1649E68CB4B2B5C5E1C400C690553E3254A23C3144D0A91342D0E501A584BE8E5F0CB65E584128AAD8A6561C607E54E93233113F558C93A8C5403A19DC137934AD253EAE1490F1C29527B5D84B19822733F88B3656B91AE6BCEA736E8E5CEE4FE34EDBA3B236B3D357597F2F2CCDB6D3F06F2F0F80F2E6786F727F2A9B1ACB576A665CFDDC91909B2ABD6F26677078DF39730A5B485DA877E4083DBCD4B35B371F7388EDA8606C26DED6C7BF931F6E20536FA0DDC103B9E23162F64CCC08BE41EF821FD619A7B634BB9E0DC251456FC02EFE95F3132D747776C22B7C7F6229C3E8763F79FCE86EF7C9496601BBF6EF938FB1DB284D176899E6B3F42261670A3BF94434F3F9979231C9CD0C1B05D6C99E60C6A949892618BA0ABAE417F90BE3295742C9AA02B295A7F33838E9C4EE431A496F1EE1EE677BF34724389FE46EAB943CF1B12E27FFB5DD43F88D3CB5FEA801E7AC741A9CD48EE48E96A0CF5552BE1A2C10B48203DD5439A156E918EB56B78F4B69F31C35F4BDC2F5034630CD835743B2D7418F5CCD97B31B3E6CD65DDCB4FF3CADDFFC5B4642FF19EB5A4E216EBFD7AB6A5A7B1C11EC71A6334179D75142B6FBE9A9AF66768087B09DC1CB6692A2D8C1C356C4F8EE319731AF9D6DD3973D90CF22B1FA6E7E93BC9F576F1C7F852CEBB6019E38BABB9EFFB97D0981849677C279EC8A539E8EC53199F2AF1EC773FC730C3E0F186B9CC39F244E6BABDACBFE9328C649E3F260E679F639631BE31CDF058A40F6D48DBA2C021A518A5C3213FFAA111F8FB11D004FDF763A65FF1F72030C8ED32F9FDB66E73B98497EDE5AE5FFE82FC40BFCADCA5CE5D3293748635F8B5A33012093EF6A1C3F1C29075ABD7F3F01DB7D2147395E594976AA4C76966BB9761544392334FD81723D7CFF2DFFF9ADE8E4D4AC83F70321465E8DDAC654B318EDD34966587CC67E791265D6B5EE7E6DBEEA1583B910D7D26975CB084D6449E477F730BEB37E4E8721B08EAEB38E5A3872B9794BBAEBD8E5CD9E679AF9165271FCAEE768915BFBC9A4E3FE465770CC79C70243BB566488BBB8D8CE5479AAC83043D38BCF3F760A69FAB1118444013B43E15FEB908A8CD4A318C8DD4406450C612FF44C3A06F5B07B7AD5CA736D862E26A2EAE298E38B3D88C6EAE63BF5D26911814EFDFDAE5F2E4F36BD8DAD183EBBA241C8B19D3C6B3DBA466EA5322431A2ABDE695AFBCC99B9BFBD8DA935765969853C3A449A3D879DA30C6254352851E6519F6D49A3CF7BC51A629E8E5C483A7918C99E48A2EF73CFC1AC592C58431B5EC337734861FB2B9BFC0EF9F594B4F21C3D18BC6322963D0BE653377AF580B569A0316CE644C5302CB2F624BD78612F0575279837DE33A83FEE79E64D5FBEE9AA0AB37B61F8C95FD3F045D7403A57627CE27B259D82D2E2706CA7A4BB633956EB5E87A4825DD1BC076032C2B413E8C1338A66AE513BA93E947D1FD10F53CA9B78B30D340C9209150F6869126B698E94A352794DE695BBD2E16E4307D4F65D859ACC8F144244B3D17331653F60192F4CBF1A4C33C6631A4944830605A24F21E19E98B31B2E46D9B946C7AAA1ABFA8E4B984BEF492BF23E02F0340D110BC26E80FC6C9587947A109BAF2625661471C15A145687F50274FFDB712C01B2C7F2835105F261065543C7236174128823CA1299428C3D243E2D842A051AD5BDED912B356A437DA8E9CB4D5DFC96B65C2521CBA65373449E8D4AACC3CB2C512A17FA90F836B0915A35C689444AA725517F54013476AEF9E8167CB3B55FA749C000007AF49444154E7B14A6508121492298A86419D2BAEDDE2A420C75D882E2FA2B91D88E58A0C0F6982AEB093F50377B89AA03F7021A9AE038A3838EA2019DABC7CDBCE44BC018736D58454853E2D5B49782ABF43D1F21B1C938EC9E8B610AED85C89C8BF19A76498C4431743FD9DB4B649A923CAC2232511E17C19418FF450A50E3ED4F4A206DB4331973510DF435B44A510130349896384922B078ECAEE45933A213AD7DE00A15143BB6DAB0E9551A2031D0A41CBE74BEE2DED87493518A47E55FE6142F63A83AEAEB3FA5FB71A4DD0FF3AACFF4F7E524488831E826FCF3A8A2053E4851D65C1832E2486D84819CAE944FE557907863E86F20B5482A7831D25B20937F80CC96095B6B5D84E49AD3BDA8C145383A10AB088EFC71561470EE4DE9FB90486C494C6935C29CA8496B8A3CB9125305C87C00EC847CDDF2455A51B06067DBCEBE4E22047A904B6E5A8E57971A5E217592A2ACF96B747E5FF4F9E007AD1FF2B043441FFAFE0D32FFE9F1010B294DC7950EE7FF0E9925E469B69CAE8D6083155061DE21B31650C20D9B318CA462D6B31559E10BA9347A47927DE85457C23A9E85F6ADACA7966889695F16B64121B6D4F8A216C48682A47440CC9C8835234E517A6D4DF09A91795F989484F85982571ADDD0A463305351128997427862F658C14D839558291CF97924CD45E281A24D10526B21B5315F3FF0926FDEF1A81BF888026687D62FC531178A7833AA2B1B715F106254CD51FCA84367AE6501FF5DB156BF5D742E4EF54A123DD3D495CFDC8DF50B441947CB564D9EF9EA48C4A0DD11B4B9A3C3805A99C5F877CB785C1230D6B3F72B3520FA155757150DB8631553E512EE3E2FCAD0E5ADE5B7ABB8784A4A26E956853307A44F7074352ADFF5498F59B5729029AA0AB34B07A591A018D40E523A009BAF263A857A011D0085429029AA0AB34B07A591A018D40E523A009BAF263A857A011D0085429029AA0AB34B07A591A018D40E523A009BAF263A857A011D0085429029AA0AB34B07A591A018D40E523A009BAF263A857A011D0085429029AA0AB34B07A591A018D40E523A009BAF263A857A011D0085429029AA0AB34B07A591A018D40E523A009BAF263A857A011D0085429029AA0AB34B07A591A018D40E523A009BAF263A857A011D0085429029AA0AB34B07A591A018D40E523A009BAF263A857A011D0085429029AA0AB34B07A591A018D40E523A009BAF263A857A011D0085429029AA0AB34B07A591A018D40E523A009BAF263A857A011D0085429029AA0AB34B07A591A018D40E523A009BAF263A857A011D0085429029AA0AB34B07A591A018D40E523A009BAF263A857A011D0085429029AA0AB34B07A591A018D40E523A009BAF263A857A011D0085429029AA0AB34B07A591A018D40E523A009BAF263A857A011D0085429029AA0AB34B07A591A018D40E523A009BAF263A857A011D0085429029AA0AB34B07A591A018D40E523A009BAF263A857A011D0085429029AA0AB34B07A591A018D40E523A009BAF263A857A011D0085429029AA0AB34B07A591A018D40E523A009BAF263A857A011D0085429029AA0AB34B07A591A018D40E523A009BAF263A857A011D0085429029AA0AB34B07A591A018D40E523A009BAF263A857A011D0085429029AA0AB34B07A591A018D40E523A009BAF263A857A011D0085429029AA0AB34B07A591A018D40E523A009BAF263A857A011D0085429029AA0AB34B07A591A018D40E523A009BAF263A857A011D0085429029AA0AB34B07A591A018D40E523A009BAF263A857A011D0085429029AA0AB34B07A591A018D40E523A009BAF263A857A011D0085429029AA0AB34B07A591A018D40E523A009BAF263A857A011D0085429029AA0AB34B07A591A018D40E523A009BAF263A857A011D0085429029AA0AB34B07A591A018D40E523A009BAF263A857A011D0085429029AA0AB34B07A591A018D40E523A009BAF263A857A011D0085429029AA0AB34B07A591A018D40E523A009BAF263A857A011D0085429029AA0AB34B07A591A018D40E523A009BAF263A857A011D0085429029AA0AB34B07A591A018D40E523A009BAF263A857A011D0085429029AA0AB34B07A591A018D40E523A009BAF263A857A011D0085429029AA0AB34B07A591A018D40E523A009BAF263A857A011D0085429029AA0AB34B07A591A018D40E523A009BAF263A857A011D0085429029AA0AB34B07A591A018D40E523A009BAF263A857A011D0085429029AA0AB34B07A591A018D40E523A009BAF263A857A011D0085429029AA0AB34B07A591A018D40E523A009BAF263A857A011D0085429029AA0AB34B07A591A018D40E523A009BAF263A857A011D0085429029AA0AB34B07A591A018D40E523A009BAF263A857A011D0085429029AA0AB34B07A591A018D40E523A009BAF263A857A011D0085429029AA0AB34B07A591A018D40E523A009BAF263A857A011D0085429029AA0AB34B07A591A018D40E523A009BAF263A857A011D0085429029AA0AB34B07A591A018D40E523A009BAF263A857A011D0085429029AA0AB34B07A591A018D40E523A009BAF263A857A011D0085429029AA0AB34B07A591A018D40E523A009BAF263A857A011D0085429029AA0AB34B07A591A018D40E523A009BAF263A857A011D0085429029AA0AB34B07A591A018D40E523A009BAF263A857A011D0085429029AA0AB34B07A591A018D40E523A009BAF263A857A011D008542902FF3F264F063D9ED894270000000049454E44AE426082 where `app_id` = '4';
+UPDATE  `fn_app` SET  `thumbnail` = 0x89504E470D0A1A0A0000000D49484452000001680000012C0806000000EE2C29AF0000200049444154785EEC9D077814451BC7FF77B94BEF8D143A842EBD188A056CA8F40E52444405C52E62C5F2D995265644451114456C6001A4F7DE413A2421BDE7FADDF7BC7399CBE648729BDC5DB82433CF1325D9D9D9D9FFCCFEF6DD77DE99514024A1805040282014F04805141E592B5129A18050402820148000B4E8044201A18050C043151080F6D08611D5120A0805840202D0A20F0805840242010F554000DA431B46544B282014100A08408B3E2014100A08053C540101680F6D18512DA18050402820002DFA805040282014F0500504A03DB46144B584024201A18000B4E8034201A18050C043151080F6D08611D5120A0805840202D0A20F0805840242010F554000DA431B46544B282014100A08408B3E2014100A08053C540101680F6D18512DA18050402820002DFA805040282014F0500504A03DB46144B584024201A18000B4E8034201A18050C043151080F6D08611D5120A0805840202D0A20F0805840242010F554000DA431B46544B282014100A08408B3E2014100A08053C540101680F6D18512DA18050402820002DFA805040282014F0500504A03DB46144B584024201A18000B4E8034201A18050C043151080F6D08611D5120A0805840202D0A20F0805840242010F554000DA431B46544B282014100A08408B3E2014100A08053C540101680F6D18512DA18050402820002DFA805040282014F0500504A03DB46144B584024201A18000B4E8034201A18050C043151080F6D08611D5120A0805840202D0A20F0805840242010F554000DA431B46544B282014100A08408B3E2014100A08053C540101680F6D18512DA18050402820002DFA805040282014F0500504A03DB46144B584024201A18000B4E8034201A18050C043151080F6D08611D5120A0805840202D0A20F0805840242010F554000DA431B46544B282014100A08408B3E2014100A08053C540185C562B17868DD44B584024201A1409D56C00668C1E93ADD0FC4CD0B058402D7580185E26A8786C26C36330B3A3D3D1D7BF7EE8556ABBDC6D51497170A0805840275470102735C5C1CBA75EBC66E5A0A6A0668B3D98C356BD6E0EDB7DF46DBB66DEB8E32E24E85024201A1C03556C06030E0C2850B8CC12A95EA6A40EB743AFCF8E38FD8BC7933FEF7BFFF5DE3EA8ACB0B0584024281BAA3406E6E2E060F1E8CAD5BB7222020004AA5D2066985C964B2141515E1871F7EC0CE9D3B05A0EB4EBF10772A14100A78800204E881030762C3860D080D0D2D65453340171414E0FBEFBFC79E3D7BF0FAEBAF7B4095451584024201A140DD5080003D68D020AC5DBB1611111150ABD5A52DE8FCFC7C01E8BAD117C45D0A0584021EA68014D09191911503FAB5D75EF3B0EA8BEA080584024281DAAB00F7419305ED10D0AFBEFA6AED5542DC995040282014F03005F2F2F2D820A14340EFDEBD1B02D01ED67AA23A4201A140AD5680003D64C81001E85ADDCAE2E6840242811AA900B938860E1D2A0FD0AFBCF24A8DBC495169A18050402850131520400F1B364C00BA26369EA8B350402850BB15900DE85DBB764158D0B5BB3388BB130A08053C4B0102F4F0E1C31D5BD004E8975F7ED9B36A2F6A2314100A08056AB10234483862C408C780A6A9DEB367CFAEC552885B130A080584029EA50059D023478E940768B916F4C90B19389394E559777A8D6A131CE083B64DA31116E4E7B006B4BAEBD1B369B89496EB306F5DC81011E28F4E2D63E1ADF2AAF0760D46338E9E4B45727A7E5D9045D63DC6460431ED1CA582223D8E9D4F43464E91A3ACE2B80B15080FF6C375CDEA21C0CFBBC252C982960DE8975E7A4956159FFFE41F9C49CA9695B7B6670AF6F7C1FD83BBA25BEB7887B7AAD519F1C2676B71392DCF61DEBA902122C40FAF4DBD05D4992B4AD9F91ABCB67803923304A0B94E31118198FBD89D0EBBC9B173E958F8D34E64E60A403B14CB8519C8607B6A5C2F348B0F7708E851A34639B6A077ECD801B9801EF3D20A84852831F016C756A30BEFD9E38A3A7DDE88AD7B7578704837DCD8A9B1C3FA156AF598F2C62F68D64885DE5D7D1CE6AFCD19761DD4E3F86903E63F7127A242032ABCD5F49C42CCF860B5D0AD58A53F376A909A61C6B2574738EC227B8E27E1FD65DBD0AB8B0F9A375639CC2F3238AFC081637A1C3C6EC08BF7DE88364DA21D027AF4E8D1AE07745CB4171EBF2FD8F9BBA9C125EC3EA4C30F7F14C907B4468F296FFE82AED77963D4DD1543A906CB22ABEABFFC53842D7B7498FFF89D880A7300E8EC42CC98B35AE856ACECC74BF371F6A25116A0771F4FC207CBB661E45DFEE8D6BE6E1B05B23AA60B32FDBD59837FB6685D0FE8175F7C5156F5C6BEFC2304A0010EE80706779567416BF4B8FFAD5F0568007040CF7BACBF2C403F3A778DD0CD0ED0DFBD32DCE1F34A16F407CBB70B403B54CA751938A05F9844167494430B7ACC98318E2DE8EDDBB7E385175E9055CB7B5E5929000D09A00775419F8E8D1C6A57A43560EADBBF551A34B42D596A4A167C7DBD111651FAABA5A2631555283FAF083326BD872F57963DEEF0DFF18B58BCF037BCF9E1F40AEF6BFE9BCBD1A75F2774EADED2E1FD4B337040CF7DF40E4486FA57782E0D703D36EFCF4AEB4685EA7406688AB4080D0B2A758DB42BD9888E094351A11626931941C1D63AF4EF3103F562C3F1D5AAB2239AE8F89A9DF32B75AFAECECC2DE86F5F1EEAB0E8BD279231E7FB1D02D00E95725D060EE8E727DE80D68D232B2C98967B1E3B76AC3C403FFFFCF3B26A39FED59F05A025809E4A80EED0D0A17604E807DEF9BDD2A02198DE79FDA3E8DDB7E355C0ACE898BB014D909BFFD6720C1BDBB7CA809E33E37659807E7CFE5F95D68DEE7FFFAE9358B36A1B9E7BE3DE52728CB8E559AC58FB1656FFBC155792333179FA401BA02B02B02701FA9B978638EC737B4FA660AE00B4439D5C998103FAB9897DD0BA9163408F1B37CE31A0B76DDB26DB821680B636277771DC3FB0336E906141D320E183EFFC5169D0108447DD3E0B770DE98DDB06F44042EB9297C16F3F6EC6D67F0FB25D18B8B5BB73F31164665843F982430218D8291DDAFB1F2E5F4C63FF26AB975BD0E74F27E3D8E173B63E7AE7905EB0B7A0A565D2714A3F2C598BB57FECC4F36F4E46A3A68E43BEA40F01B7A03F98719BAC41C227E6FF5D69DD2A0BE82DEB0F302D67BE369155F5F285341CDAF71FFB77EF9B3B62E7962338B4EF349E7C691CFB1B69F4DF894BA574B37FD0A5BAD1B1FA0DA3D1BE4B82533CE016B42C409F48C6DC1F760A0BDA29C52B77B20DD0137AA37563C72E8E7BEEB9471EA0E55AD0135E5B252C683B40CBB5A01F7CB76A8026984E9E3E8001815B7BD46DC8A29BFFD5533677C43FBFEFC4C7EFFF883B87F6868F8F1ADF7FFD0F1E7C6218EA378CC27BAF2E45971EAD10DF301A17CF5DC1D18367F1C25B9331E7F56588AA178AD6D735613DF14A5206FA0FEE692B73D3DA7DB8782E15DE3E6A767CE4845B6C8096FE5E996E6C03F423B7C9B2A09F58E07E40FFFDDB0EDC747B17787BAB199CC9F20E090B64B775DBDD3D30A6FFF336F7C6B143E730EF8D65886B1065D32D3B330F0F3C5EE276A0B620D714E9A6D3EAB1F2BB7F31EB7F93D0BD57DBCA4875555E0EE8252F0E76580E59D0F304A01DEAE4CA0C1CD0B308D00E2C688A831E3F7EBC3C403FF7DC73B2EA39F1F55F04A025809E32A0936C17C743EF553E1A81FB8BDFFD74067EFD61133A7469812ED7B7C23B2F2F61D6715474A80DA66F3CF725E21B4661D4C45BA15279E1A7EFFEC581DDA7980B22F9523A264DBB9BF9630946CBBEFC9B41FFF79FB6E08917C6A25E5C046BFF3E6DEEC7E29F5EB49559969FF9D8A1B3D8BCEE00EE1ED69B01BFB28903FAFD876F9505E8273FFCC7ED16B4F41ECA728D48DD1BE41AD9B5E5281E7A72984D377BF707B505BDE8487B473EFFCAE8C701FDF50B831C9E46809EBF6297B0A01D2AE5BA0C1CD0CF8EEF250BD013264C700C68DAF65BAE052D006D6D4CEEE2900BE842AD01D39C00340DE82D5EF82B62E222406E06EE4795BA23A450A03AF2630489C0203F761E250E0C02F4DB2F2D4154BD305B0F3D7DE2522940A7A76663E13B2B70E1DC15DBA0E2E675FB997F77C6ACD155EAD91CD0EF3D7C2BA21C0C12A6E714E1A96A06340D1E92054D2FAFFB1E1EC85E84F680FE74CE4A844786D8EE9FBE3CA4FE6B01E82A758D1A7F92DB002DD7829EF4BF5F85052D05F4DD1DD15BE620E1B4F72B1F2E26B5BE08D0DF7DF117D46A2F141668B1E9E867A5FCC55501F4CE2D474B7D9AD31342B0914671F0688791B73ECB20E432404FBF459605FDD4C2B5D56A41930606BD115AAD1E1FBDBB02C3C7F7C3C3E3DFB101982C6872138D9BD2DF06148502080C2A8948A1B6D8F0F75E787929E11FE8876F7E7D05FE01BE4E03885BD05F3D6F1DD8AC28ED230BFAC7DDC2827624940B8FDB007D4F4FB492E1E2983871A23C0B7AD6AC59B2AA79EF1BBF09404B007D1F01BA7D0387DA15E98C98EE24A0E922F4E09375F7C33F6F22363EB214A0C9D25DF9DD7ACCF9E2090685FB47BECE3EB3DB76688A796F2CC733AF4E60FF7E78C2BB6C00913ED1673FF519C64FBD1337DDD6C5760F0579453640E7E514A2B050C38ECD98F81EE67FFD14E6BFF9BDC310BC8A04E116F4BB04E8908A67A466E46AF07415014D7EF6990F2D6083AB238A7DE79306BF82662DEBE3A36F675E15C5C1EB4CE17959C503AD4B3F5F83E1F7F4C343E3DEB2017AC35F7BF1F64B5F63C28377D974532A14C8CB2DC48A6FD6B1A8116A8BF65D9AA3792B6BDF50AB55888C0E65FFB67F913AEC3C920C1CD05F3E37C0E169FB4E5DC1020F07340F79B4BF9994A40CD6BFAB2365A4E5203C32184AA5D2E9CB7140CF244037B4BA0DCB4B1466270BD05BB66C815C404F7EF377B7039A0669E8D3BA4D87A66CB08B125992F4F9CD53CBB68D9845420FD3C5B329A5A21B9C56594601DCC571DFDD1DD0EB3A398036E0E10F2A1F2E46D6EB82B7BEB745177CFBF91A165130FBBDA988880AB10D68DDFFA875D0887CC63CBA80A2067854023F8FF2BCFDD123B63209363F7DB7BED41DCF7C75227B0950993F2D5DCF2C414A0BBE7E1A6B57EFC2BAD5BB5D02E877A6F59305E8673E5A57250B9AEA4C9114DF2E5A53EAFEE83EF8318A78E1AE1F9E895C43F3DFFA9EFD7ACF94FEE8D1A71D9E796801EE9972872D0A83AC68D288273F7F5FCC787614D3EA9EFBFBE3C2D9142C5DF42708349422224370EFF4012CE285DAA247EFB655EAB31CD08B67DDEDB097EE2740FFB4C7E516344135A938228857A2B2B1F0FC3CEEAAB3BF191A0BD97CEC7387F7E88A0CF70E7D950DB6F3787867CAB4017A5C225ACA00F4A449931C5BD004E8679F7D5656BDEE7BEB0FB7039A20439608B712A962E4F37CFFB5A568531C6D40801E36AE2F7B00C822E10F9DAC9B7041260EE8C97711A0EB3B2CB14867C02373AA168DE0B0F06ACC705BD78731F5B121CCAAAC6AE216F4DB0FF59505E8991FAFAF32A0AB5AC7B2CEAB4C1C7459EE266E5D3B53270EE82F9EBDCB613104E80F57EE7539A0798865E36671B63AF4BCB13D8B82A96CAAAD807E66ECF5B2007DEFBDF7D62C40D36729019A4299468CEF671B88224093EF930F4CD15B8F06CECA02F4AAEF37B24F54F209F2B0B0CA761C47F94B00DD5E9E05AD35E091B9351FD0F4703AAB6909A06F466488839984B94598F9F1BF350ED0D457A571D2D49F125A356031E8CEA4CA009A5C1C0BDD0468BA07693F900E60D331FAD2223F3D256968287DD11C3D74D6F6770234B9CDE86BA447EF76CC0547892CE8D53BE661C5376BD9EFD263F405A2D71BD8DFA59A96F5DC1337C87DB17FF729C604AA0B31837FFDF4E9DB116F3CFF95CB2DE8A7C75EEFD0C541617693274F760CE8CD9B37CBB6A0A7BCBDDAAD163401E0ECA9CBE8757307BCF3F237F86DCB07AC21E402FA9BCF56B306211FAB8FAFB7D371A7E53D4C1CD0F7DE49809661416B0D9831AF6AE162CE3CD09E782E07F45B0F12A01DFBA09FFDC43300BD6DE32190A52837D1E4A0DC9C02963D20D00F9D7BB4927B6AB9F938A017CD74BCDCE8FEFF52AB0DD0524389A25FB41A1D9B364F69FBA6C378E695096C22D0D9FF92D0B899756213BDAC6EE93C1D770CBC9EB991C828EBD3AF23DAB46FCA004DF1E76495EFDD71823DFF335F9BC0DC6B143EFADA9C075859BFAED8CCC652522E67D89EFBA2221D2E9EBDC25C74F4E2D8B1E908068DBA8131A16B621B3C39752E1B68A7AFC0437B4F83267CD1CC5257BA389E1ED34396052D1BD03367CE94D579EE7F678DDB01CDDFCED2CF1F29A0C9274B6FCB75FB3FBACA829EF5F04216DF2B9D7127EBC62A9989037A52FFEB6403FAD1F9558B46A864D53C3E3B07F49B0FDC240BD0B33EDDE01116B42708CB01FDF933251124E5D58B00FDD1CFFBDCE2E2E0CF28BFB614D0347EE4E7EF638B6AE1CF31195FF6E70DBEF1297CB8E419D46F14CDBE9CC9974DE0264053E44BE3E671A081EAB96F2CC3CDB7776183D78F3D3F061DBA24B0B5547EF8FA1F982D16DC31A827222283995126AD0B019A5E8E8347DDC88ED158D6E3F77D80FFCD7B88C5B0A72667E2F12973F0E9F2E75C0AE8A74677770868B2A0A74C99E2D882DEB46913E4027AEABB7FBA0DD06471905834238B3E9FA8610BF28BD8E83901FAC9FBE7C2C7570D8D468F795F3EC91AC9DEC5A129D2E189297370FE4CB25B17B69102BA673BC70BF6D35A1C8F2DA8FA609727C0C15575E0807E63EA8DB200FDDC671B05A08BC5E780FEECE93B1C360701FAE355FBAB1DD054B1579F5984ED1B0FB13A92AB912C54724B7C3AE767AC5EB9051F7EF30C9AB5A86F8BE7A77CF680960E12F2630468E9809E743D95E9F7BCCDAC6ADABDA8459B866C5C8A002D758310A09F7B6461A9312B770C123E398A00ED78C1FEFBEFBF5F1EA09F79E619870D4E191E78EF2FB7015A0A615E99827C0D1BCDB5777194F5E6B6BF81F2062064DDA8834C25806E87C4B68E01ADD1193D0AD0B48A9B5E6760964E75A71240DF8008073BAA64E669F0DC679BAA0DD0641048E3995DA90DC55693B5C72393AA523607F4A74FDDEEF0F403A7D3AA0DD004C64F3E5889773E7EA41468A992653D877C0C497ACC1ED07FEE9ACFAC5FD26DDE9BCB59E40B8FCFA7095B46A309BFADD884ECAC7CFC779C9641B07E39DB5BD0F6809E396D013EF8FC31F8FAF93057CC03A3DF642F0C57BA389E1CD50D2D1A540C680AB3930DE8A79FB6861E394A0FBEFFB75B004DE172BF7CBF914D9290CE50A34F9D4F96CD6230910E12960768EA28B9D956BF1F9537FBFDA98E6EA94AC739A027DE41802E19CD2EAF3002F4E31F961F8D409F6B278F5EB8EA749AE8E0EC023B65D549CE92A2144E458996E67465E280FEDFFD7D6401FAF9CF373B05687A60AF2465DA6E81D6C7E08351F6F745911A3FFCF3161B50A290380A97A39996AE986462BF7A5E5534E580FEE4C9DB1C9E7E9000FDCB01B758D01466278D9D973E6B149AE9A5F242A32631AC8E14D14216B4343C8FE7AF08D0348393BEA429AC94C2179FFBDFBD6C708F7E28D69F0661972E5AC3BEB8932EA6A349421C0B67A4D0492ABF2C0B9A9EB3E9E3DF61FE6A0AA124A690CFFCA7F5EFB814D04F8C244057FCDC10A0A74E9DEAD882DEB87123E402FAA10FFE710BA073B2F3F1D1BB3FA25BCF36B8F5EE1EB6CE478D1B121A88BB87F7C6A963174B1DA34C74DEEF3F6E61B1A7947EFC761DCB47C97E9949873DBA121938A027DCDE5636A09F5858FE6017F9C2BEF8F05756035A458DD6B8A0CE467E33BE825A25AAE730AB1C4097E5337458B08C0C1CD0AF4FE92D0BD02F2CDAE214A0E933F7E09E53A8176B9D3840FD69FA33656F19458026838056AE1B30BC0F830B4513B9624CC39580FEF8895B1D2A4D80FEE4D7832E07F4AEAD47B1F68F5DA5AE6FFFAC499F43AEB7F43C9A424F3E609AD0C3DB8216986AD834062DDB3462BA4F7B7A386302A55BEEEA6E1BF07FFFD5A56C012A4AD7756ECEDA89D2A205BF202DC5BAA175C326318C0904E0E8D87056264F3C469D7EA7F564766D3BC662DCC9A27636F138E8C747749505E8071E78401EA09F7AEA2959759B3667AD5B002DEBE21E94C906E8DBDAE07A9916F4931FC91BECB28FA1CD4CCFC52F3F6CB4DD3DCD0EA45956146E44FFA6639DBAB564032CF610A0CE48D623F9FF78D817851AD9039A9F4717A1E3741E9FAC41D6E688F1B7300B837C783CF489F2F2BAD0BF098494DAB66FCA46E5CB4B1CD0AFDDD74B16A05FFC62ABD3802E2FC48D5C67FB779F6455A5A9DB836F78128B57BEC4264591AB833468DBBE09C2A3426CE162A4DDE6F5076CB7C7A77C93654779E918856F11D4794818ADDB617FAC2ADD995BD01F3D6E5D55B0A274F04C3A3E7503A01D5DB72E1FE7807E6C4417B4A8EFD8827EF0C10705A0DDD16138A0C7DFD64696054D83844F7D2C6FB04B0A68F291CD7EEA73A45FC9C6B07BFAB25B2178D034E321373D8D81236E004DDAA185E709C434B59816463A7EF83CB3BCC982F874EECFB8636022FBAC238BE4E63BBA62E0883E367F1E8519D1E02A9D4729F97206060CEB8D4FE6AC64BFD3570D7DCED267FE0B8F7D8C944B1957D585CAEDD8AD05CB4F1318DAB4B72E5F5A56B2017A722FD0EEDE15A5CC5C0D5E5CEC1E40D3A0F49CFF2D6383CD34A87478DF69F629FDC682E9EC339A2C673ADEBD671B6685D18C437A71D1025364155248187DF5B4EFDC1C4FBC388EADDB4DED41D65BFBCE09AC2C5AB294DC547C6D6EFB78E1CAF6CD4A01FA741A3EFDED90CB2DE8CAD6B92EE5B7017A78175916B42C406FD8B001722DE8E973D7090B5AB216C7F8DB5AE3FA368E7DD03493F0E98FE50D76D9AF84F6C0E837F0DE678F21AEBE756D824726BECBDC371307CDC6A2152F3020D0834FEB418C9C782B03299FF54680FEF7AFBD78ECB931080E0D002DD04FEB4A48D79126F74A504880CDCFCA0770CA0B8BFA68E9B357D565E4ADB3644FCDE5807E75724F5916F44B8BB7396D41FFB96A1B028A1733E25B7DD157C3B18367F1E093C398B57CE6D465B628120734696CEFE2208B9BD6D97E7AF67836D59E26634C19F13AF361523BCD59F4B86D09526A272A4B3AF8E42A402F7CCCF14C4EB2A03F1380AED6F70307F4A3C33BCBB2A01F7AE821C7163401FAC9279F9475230FCF5B2F002D01F43DB712A01DEF2842807EE61379835DF680BEBBE763A506A9C8DA5DF6E7FF3079E8ABB65042FB075F0A68FBA541ED17FAA786A7B5260E17EF2012131FC966699605E81BDA4E454060C9AA6CBC2E6CD6E6ADCF22F1C6F678E99D2915F6250EE857EE4D9405E897BFDCEE34A0695D12AA1B250ECCB27CC2A48D2340DB6FA3C50716EDF779A401A9F1035F8682C646D6BDCDAEED2A407FF8A8F56BAAA24480FEFCF7C3C2827624940B8FDB003DAC131264B838A64D9BE618D0FFFEFB2F9E78E20959D59CB1608300B404D0E36E69851EADADA3D515258DDE88999FCA1BECB2073459753470651F12275D1BA22240D392A28FCE1A0DB5B70A85051A0CEF37B394056DEFF3AEC8821ED66F26BEFDEDD572C3F3E42C45CA013D7BD2F5080FAA7809CEAC7C2D667FB5C3694097E583E6CB864E796410546A158BB9A7A8024780FE75C5263CFBFA24162E47101E7AF3332C4AA1BC8D78ED978CE56B7A3BEA33651DE72E8EF98FDCE4F0F4C36733F0F91F4704A01D2AE5BA0C1CD033867644F378EBEA85E5A58282024C9F3E5D1EA01F7FFC7159B57CF4C38D02D0A500DD12DD5BC903F4B39FC9F3A54A814900A04F685AAAF29199236D6D447EDE817D9E90654193CFF4DE690398AFF4E907E723BE41149B8DC5634A69F49BA6DFDAC2A29EFFCA664167A466B3C819BA1E01FE9E012F213C22F8AABAD0C4204AA78E5F446E4E21C64E2E3F4E9703FAE5893D6401FA95AF773A0D6836D5BA78F7715AFA9366A8D13E84EFCEFE0663EFBB831DFBE0B5EFD804277B40D38067C3C6F5D8A0DF8923E7F1FCA31F23B14F3B0C1A75235E7EF233B69428C5D1DA039A5665A45DC5695DE91FBF5987573E78C06516F4BC876F74F8BC12A017AD3E2A00ED5029D765E0807E64480759807EF8E1871D037AFDFAF5900BE8C7166E128096007A6C3F02743D872D4C71D0B316C9F3A5528812ADDBD034C13A018606ED687ABB343DF3CA782C78FB079B3B8116A7090B0F66DB6151A2995CE46AE0162DED9F476B1A50A20D66A9CC75AB77B1B5A0297D3E6F159B8545897CDD8F3C3B8AAD9D4031A294E87A6111C1A0BDF7688D14FBBAF0BFD1E0202FB33C5138A05F9AD05D16A05F5DB2CB2940F32552797DC22282D8DA1094A4C7482F02368567EDDB7982ADD5406D21D58DCEA1DFE9EF3C7197CEA2F9AB986E3C714DE9CB87F290AFFF8F9FB7DAB62D73D869CAC8C02DE8B9D36F7078FAE17399F84200DAA14EAECCC001FDF0600274C98E3B655D832CE8471E79441EA01F7BEC3159F57CFCA3CD02D012408FE9DB4236A09FFBC2395FAAAC06B2CB24C7E55095729D398703FAC5F1DD6401FAB56F763B056867EAEACA735D19073D679A35F6B7A244805EBCE698B0A01D09E5C2E31CD0D307B59705E81933663806F4BA75EB2017D04F7CBC45005A02E8D13727C806F4F38B9DF3A556A51F7932A05FB8A7AB2C40BFFEED1E01E8E2C6E716F4070FF576D81D08D05FFE795C00DAA152AECBC0013D6DD075681E57B1054D330989BB6BD7AE45646424D46A3514B4771A0085C964B25086EFBFFF1E04E8471F7D54562D9FFC64AB00B41DA0BBB574BCB335B9385EF8D2395FAAAC06B2CB44332D0BF2346CB5304F49DC827E7E5C175980FEDFD2BDB502D034E188260C39B3951307F4FB0F5A3700AE281D2140FF754200DA91502E3CCE01FDD0C076B2004DAE658780A60C7201FDD4A7DBE0A50482839CDFBFCB85BA547B513ABD05451A0B46DDD41C7201FDE257BBE0AD0602FCEBB676451A33747AE0B9B19D6501FA8DEFF609DD8A7B787E81194613F0DE033D1DF67902F4577F9F84BF9F023EDE56CB4C24F72AA0D15AA0D559F0D080B66826C382A6E83959802667B59CF4F9EAE3B8946E5D8CA8AE275FB51706F76A82368D1C2F26A4379AB168F5715CC92EAAEBB2B1FB0FF055B34E1CEC6FDD73B2BC54A03130C8A4E55837AE150908F6F7C653233A3894E2426A017EDA721639053A87794506D729E0EFA3C23DFD5AA07E5440C57DBBA080CD3F7108E87FFEF907E4AC1649282014100A0805AA47017231D30C6E5980966B41574FD5C55584024201A140ED5680C2EC64039A02A645120A080584024281EA5180004DCB3C3BB4A0FFFEFB6F0840574FA388AB0805840242015280004D3B59C90234CD09AF6DC962014C6633BB2D15859E882414100A08053C44010234ED05EB10D07FFDF5175BB4A3B6A5BC223DD6ECBE8CD8707FF46A13CDD6E51549282014A85E05B47A13FE3D988C2317722ABC70937A81B8B9631C22829CDFD9A47AEFB06A5723403FFBECB3E5039A32FCF8E38FA03549F57AEB1632B52529BD5468D5EF3E04D76B06A3AE0817F7AD46FA4C14CCF10000200049444154993DB058AC16B5484201A140F528E0A5F645E36E0311D5AC6B8517CC493E89F3BB7F85362FBD7A2AE60157E9D2A50B7EFBED374444445C3D93B0A8A80857AE5CC1E5CB97919B9B0BA3D1E8015576AE0A168B0539857AACDE978E941C03D4DEFE0CCADE0A3D125B84A06D832078ABBD9CBB48359D7DF6EC59346DDAB49AAE563B2F939797C7FA757878C53B2C7BFADD67656541A552213838D8D3AB7A55FDB40613FE3D928993A96604453580B76F60A93C26830E7919971017A0C7CDED221011E45DE3EEB1B215A629DD7E7E7EA857AF1E1A346880D0D050D6BEB6A9DE66B3D9A2D3E9909393036A7C82B5C964AAEC753C2A3FC139293D0FBFEFB880139772E01B148EC0F03818F51A146426C3D7CB885B3BC723B16D7CB5429A560B94BEFC9A356B06FA71946EB9E516F6F9E3EA643018B067CF1E242626BABA688F2BEF8F3FFE404A4A0ABA76EDCA340F0A0AF2B83ACAA9D0A2458B101B1B8BBBEEBA4B4E768FCA43CB1CFCBCE50CF69DCBAF10D04D239418D2BB19EA85F97B54FDDD55191F1F1F84848430EB392020004AA5B234A009C8E4DA2050D3434B80ABA989EA7EE67206BE5F7B08074E5D81CA2F148111F150AAD4CC82D615E4A030FB0AFCD5660CEFDB1677F66A536D03872D5AB4C0F8F1E36DD2D29BF3EEBBEF46AB56D6A541CB4B74DEA953A7D8E173E7CE21232303DDBA7573BA89C8AA1C3264085B83A536A7A4A424B6D60C7D467EF9E5972CA4A96DDBB615DE323D0B6BD6ACC1E0C1833D4A9AF7DE7B8F595AA3468DC292254B30618275B9D48A12F519D2A0776FC70B2B392ACB99E3851A3D16FDBA1B9B0FA75408E8B6F50370DFC06EA81F5DF12243CED4C553CE254B9980ECEDED0D5F5F5F663DD3EF3C29C882A65F086C66B3B9C6C3F97C722616ADDA8EDD472E42E11BC22C6782334F0CD285B9CC920EF00126DDDD03836E6A0F7535B83BA2A2A2909E5EE2577BEDB5D7D0A85123870F99F43C727710A0BB77EFEE741FA3AF26B2CEC98AAECD69E3C68D0C665F7CF105860F1F8E175F7C111D3A543C459AB4A1BCEEF87271466B699F910BE85F7EF9059B366DC2FBEFBFEFCCA59D3E37BF488705CB3760ED9E0B1502BA6393503C32FA46348AADD9EEA8CA08C6AD660236776FD0F90A4BB1B95C93AD662EC4C5942C2CFC6113761E3E0F957F38FCC3EAC14B75B51F8B20ADD714203FED2282FDBD30F2B6CE18DBBF1BD42AF7FAA4C3C2C2909D9D6D6BB7575E79058D1B37C6C48913D9DF6EBEF966DBB1499326D9FE2E3D6FCB962D3873E68CED98F43CB290E801A644AB6351E84E4C4C0C4E9F3E8DAFBFFEDA768C5F842044D7DCBF7F7F997D495A1F8A8F1F366C98AD9ECB962DC3983163D8EFD263F6F7C10BE6F9695B359E162E5CC840C92DBBF2AE575E999F7FFE399A376F5E4A37FBBAD0D8CAAC59B3D82879CB962DD917C3CB2FBF8C8E1D3BB27197B7DF7E1B77DC7107DE7AEB2D562D5E669F3E7D70E4C811964FDA1603060C6071AB94E83CD298D2FDF7DF8F3973E6808E539D08EE543EFDFCF9E79F6C0088121D979EC7B528AFEDEDDB972C2CDE67487FD295A79F7EFA091F7EF8A1ED77D29ADA9EEE99DA9AEA4575A47BB2D7D45EB7323B84937F2C28D261EED2F5F87BF7B90A01DDA969181E1BD7B74E019AA49582994B6D03B493DA5FF3D3D3B3F3F1C6177F61EFB18B5007109C63A0F42A5957D5BE82F442A2A88E9C943308095063CC1D5D31EAF62EF056ABDC762F3400400F0A4FB367CF660F1B01A07DFBF6F8F5D75F6DC7BEFAEA2BB46BD78E3DE8D2F356AD5A8503070E80CEA54470FBF6DB6FD9BF09DE645DD3DAB237DD7413A80C2A9FE7A773A589EA42F9E8B87DA2F36813619EE8C1A7BA5C7FFDF5AC23F5E8D103CB972F6787A5C7ECCF7BF5D557D93993274F66A3D3524380D793DC08655DEFB6DB6E03FD945726E946EE1FFB7AF2F3A86EE7CF9F67FAF23C742DD28E2045C7C8BD44C709E094A64C9982952B57B26353A74E65F748FAD3CF9D77DE8977DE79078181D6C12D02AF56AB657A5379348643962A7DAED2A42FFA3B819F804CAE2C4ABFFFFE7BA9F3E86F15B5BD7DFB1248E7CE9DCBEA4CBA503D29D1F5EC279A51DB926B8CFAC18E1D3BF0D24B2FB117367D4A57D4BEEE7A00F20BB5950274E3B8087755A5C6945B2B00AD3718F1D8BB2BB0FFC4E552C2FB06472224BAD1558DA1C9CF4241C625984D25D12AC101BE983CB82786F5EB08959B2C697AC8294A8627B2E438682B82774580963EA4654196E05B1E842B02B47D59041B821B954580B6076D45C7E81C3A5ED679FC5859D793739EA332EDF5B107B414DE540702AD14E652F8F363D41E94087C04480E7CCA5BD631CA2B6D43E979F6C7E877E98BDBBEFE151DB3D7906B432F66AA1B819DA78ADAD05DF41280AEBCB2351ED006A3096F2EFE0BFB4F5CB2DDBD4E6F445EA19659D21501DACF5B89A08092DDA4C382FC316DD40DE8DCAA4129477DE5652DFB0C7B084B73791AA0093C04489EC83A240BDF11A02BB2842B826959D7231FAB23EB9ACA243FBE347DF6D967CCF2A6E46A40930ED2411C7A71710BDA194073B0F3FBA0C140FA62910B688ABEFAE8A38F4AB9382E5CB8C05EA4E501DA5E37FA5AA0AF1D772501E8CA2B5BE3015DD62D6F3F74167397FE8BB4426585801E7B47674C1FE57857E4CACB7A6D004D616464A1F3A810FA44A741C0EDDBB733DFA37DAAC88296C2947CDE04215AB3D611A009066421F274DF7DF731BF2BA5B2CAA4E3F6D635BF1E3F26B74CFBFBA3D03A1A202360F3E44A0B5A7ABD8AAC6BCA57190B5A5AAE14D0D4BE34B6402E137B17873D84C9DD71FBEDB75708E8EA1E771280AE3C4904A03D04D0349045C1EA3C113CC9E749D11A15B938C8C7CB272D9015D5B97367F600F35491D54ED7A070330A3B9326F21793BF92E04089C2F17EFEF967067947802690F3F3789904688A3D961EE365929B87A029F7584565DA1F2BEBDEE5029A62536910977CB66455D2CFBBEFBE0B2F2FAF5216343FE60CA0EDDB9EEE83BE00DAB46903FBF6A5AF98071F7CF02A401F3E7C182B56ACB04DC4A1496714B54110961E23ABBC7EFDFAA5F4E6BAF16395C788BC3304A0E5E924CD25005D8D80FEF8E38FD974FAF292D447C81F7CCA2B3D8FAC4B0AD5937E8AF2F30882DC5A9503688AF5A5B2ED13019AA0CFCBEDD4A913CB42E5D3C34D7F976E2E4C616CFC5859804E4B4B63EBDDD22C3EFB32A93C3E59A7BC63E59549EBC6C4C7C797F2AD523D49031AE82398D25642D244D114A41D852ED24B822C4D02134F4B972E65BF13A00972B404827D5B906E3CF163D2F3E8D8B163C758F9BC9DA46D687F8CF24BDB5E0A68E931D289EA4D6D43F05EBC78311B7CE589A271A82D28D1DFE9386F277E4C0A61FB6B0A40571EA0EE3E4300BA1A01EDEEC6B42F9F5C1C83060DAAD65967F67E66AA1359AD04037BCB5AAE1EE595C907E7CA2AC7DEA2957B2D91CF7D0A080BBAF2DA0A40D762405714E151F9AE22EF0CFBC13E3AEBF5D75FC7E8D1A3D92CA9AAA4F2CA1C3972240B692B2B25272733F7847440AF2AD716E7B84E0101E8CA6B29005D8B015DF9EE20CE100AB84F0101E8CA6B2B002D005DF95E23CE100A3850805690A09983455A1DF8D23E851A1DBEF8653BB61CBA5CE14CC236F583D89C84FAD1D678734A34812C34C8AFCEADE52E002D002D60231470B9021A9D01BF6D3C84EFD6EC416A665EA9F2553EFE15025A5F5832998B4EF4F351E3F6C4D6B87F586F848704B8BCAE9E5CA000B400B427F74F51B71AAC8046ABC7AF1B0F63C96F3B909557C4965EF0F60B8297B70F5B0258A52E992446B769361940B37C690906A34EC39607A62DEA06DE781DEE1BD2ABCEC1993411801680AEC1081055F77405B43A03D66C3D8A4F566C46A1DE8280B05806E7B2160662F762B140AF2D4061560A60D4606CFFAE187D47578404FA79FAADBAA57E02D002D0A53AD60B2FBCC05671E3891645A28914220905AAAA804E6FC0BFBB4FB1D9BD053A335B02D82730EC6A485B2C30E88A509099C4E03CE68E2EB8E7AE1E08F4AF1B7B1396A5AF00B40074A97E413305690BF8B8B838F6F77DFBF6213333F3AAD986557D58AFC579B4DE35CDC0A3597972122D35BA79F3665BD64F3EF984E93170E04039A78B3C6528406BE66CD8730AEF2F59C72C6982B477406809A46975498316F9E9976C701E795B973AE9D690CA27002D007D15A0F932A574A0AC85766A1A81681123BA27E91A2115DD83FD14715A5294EF7A51D3EEDD93EA4BAB4E12A4DFFB7A1D8A0C1604473580DA2F9841DA6CD423E7CA39580C1A8CBAAD33C6DDD59D456D94EB0AF1A41B73635D04A005A02B05689AFE2CDD3A89A607D3BA1D34FD98AF64C757C12BEF184D7FA6058CC8A2A5A9D43CD17AD634F59BA648DB1FA3C92A044A822C5F5C9FCE23F8F2EBD2BAD4F46F5E26ADBD4CB0A57D086991FDC8C848765D5AE7E2E2C58BB8E1861B6CD7A6C587E8CB81EA4CEB3C376CD8904DD3A615DEA44B7CD209E402E2EB3BD3EFB496344DADA64933A4034D33A775A5F9312A9BD66016092048FFB1F90816AFDA8EEC023D82A21BB2C1C29C2B67A18601FD7BB5C1D4E17DEAACCFD9BE8FD46A405FC9352120AC6401227EF3FAA23C14E5A6635CFF2ED5BA9A5D4D784009AEB4180FCDC2A374E2C409B6D12D2D144FC97E76225FCF81AF97215D6E54EE31AE0B2F5B7A9E54B3B22C613E0D9C8ED16C45BE79009DC72DE1B2CE23C012C079E2D3C6695A7A454BBF4ACBE5E71280F992A3345B927EA7CD5D29D1BFE947BA746B4DE807EEACA334042F334F0B28550CCE753594AE22AD6B35A0690BAC8AD23D77751780B6138840429626ED1AC2D73E96EEC44210E59B0CD0A9B4D810ADB8C701CD77F8A063F680B63FB66BD72EDBBACD949FCAA53C54261D236B9A438EFE4FA0A5414C6E9DD2DFEEBDF75EB6625B5910AE08D074AED4E541F748207516D0F67017802EFB09E42178DFADD98DACDCC23A1D4A57E7007D29351B3B0E9D436E81A64240B74F8847F776D6253545B22A20DD2A8BF6D3A30132FAD4E74B98F22DBAA47AD131CAE3C8BAB60734B912A4ABF211DCF8EA6B748CB669E289E04D10E63BBB48AFCF8FD9FB992B0234B949C865C293B46C672C680168F94F9246A7C71F9B8FE2F2956C4C1C783DC282FDE59F5C4772D64A0BBA8EB49D5B6E530A68BA80FD20A1A32DB66815396E713BB2A0A97CE9B2A5E5DD90D48D51DE605F652D682948D7AF5F8F69D3A631DFB6B0A0DDD2ADCA2D94763FA2088FBA1C4A57E72CE8EAED62B5EB6AF680A61D5A3EFDF453B6EEF2B871E3D83AC763C78E2D75D3B4E03F1D237873570165A0C1383A466B18DB839DD6B4A605F0C99DC11385B2AD5EBD1AB4B6321DE389A04CE0A7813EFA37F7EFF2E3B4EF624580969E479B0ED00EDAB488FDF8F1E3591134E8497E76FA122040F36334B848D7B21F24DCB66D1B033A4FE472A1DD5FFCFCFCAEF25F0B1747ED7A3EAAFB6E84055DDD8A7BF8F50866FEFEFEA596E9E40BD4D322F694A43B93D3EF04263AC621CC8FD3DFE818258ACCE03BBF7009341A0DA48BDF53281BE5A1BFD1319EA4FBF5E9F57AD0CE31D244C709B0748CEACE13BD5C424242D8AFFCBC808000B6BBB8F43E28FA82AE4D0BFC4B8FD1801FF9E2EDC3ECC8E72DDDFC97AEC9973D955E93AE4175A563555D6AD5C3BB8BA89E9B15B001BABAF72773F37D89E2AF81024D9A34C1B973E7AEC195C5258502355F81B262BE15665A171080B1A00085972EC16234D4FC3B1577704D141833660C962D5B764DAE2D2E2A14A8B90A28A00E09464043EBEEF4525033409BCD6664EEDD834BDF2D857F5454CDBD4F5173A18050402850C314B098CDD0E9F468F7F26CE60ABB0AD0E49FBBB26533F4070F2261E4A81A767BA2BA4201A18050A0E62A60282AC2DEB91FA0EDDBEFDAC67F38A4152693C9420319C99B364271E23812460840D7DCA61635170A08056A9A0204E8DD73DE478BD7DF6083DA522B9A019A46EE2F6FF817EAFF4E2161F8C89A767FA2BE4201A18050A0C62A60D01461D7DC0FD06CF66B080F0F679144A52CE8FCFC7C0668EFFFFE43C2F01135F64645C585024201A1404D53802CE85DF3E6A0C9CBAFB065162A00F429240C1D5ED3EE4FD457282014100AD458050C1A0D76CD9F2B03D0A708D0C36AEC8D8A8A0B05840242819AA60003F4827972007D12094304A06B5A038BFA0A05840235570106E80FE7CB00F4C91302D035B79D45CD850242811AA8001B245CF8A14C400F1E52036F515459282014100AD44C059805FDD14219803E71020902D035B39545AD850242811AA90003F4C7B2007D1C0983E459D05F6C3E89E5BBCED648416A4BA5BB3589C2CCFEED11E2E75DE55BCA2CD062E1FAE3D8FCDF952A97214E745E01959712A3BB37C5C49E09552EEC485236E6AF3D8A7319F9552E439CE8BC0271A101987A634BF46A7EF5767B6595CE00FDC947322CE8E3C791307090AC1A26BEF507140AC0C75B212BBFC8E45A050C060B4C6660E5437D111B625DD2B32AE9545A1E262EDE0C2F2F40AD126D59150D5D718E566741427430964CEE53E5E296EF3987796B8FC15B0D2895A22DAB2CA41327D2AAA03A3D705FEF044CE9DD42564906AD16BB3EFD580EA08F2161804C40BFBD1A71D15E78FCBE60599510995CABC0F7BF1762CF613D563E78B3F380FE720B7A77F5C1A05BC59643AE6D25F9A53DFD663612A283B0E45E2701BDEE381E1C1B88668DAC6B5E8B54BD0A24A51A3177713EEEEB458096F73564D06AB0EBB34F6500FAD85124DC3D50D61D25BEFBA700B42CA5DC93C906E8A9373A09E87C4CFC7AAB00B47B9A4976A936404FEC25FB1CFB8CCBF79EC7BCF52704A0ABACA0F327DA00DDB339A6F46A2EAB4066412FFA4C06A08F12A007C82A34F1BDBF04A06529E59E4C3640DF7F83F3805EB24D00DA3DCD24BB5406E8A8202C99D853F6395703FA02E6FD2B005D65015D706209A09B614A4FB980D660D7178BE400FA0812EE9209E8F7FF168076418356B5081BA0A7F4711ED0DF6C1780AE6A43B8E83C1BA0272456B9C4E57B2F60DE8693C282AEB282CE9F6803742201BA99AC02998B63F11772017DB7AC4213DFFF47005A9652EEC95402E8DE2E00F40E0168F73493EC52AD800EC412A7017D4A005AB6EAAECF5802E8A6F2014D511C5F2E9601E823879170974C407FB05600DAF5ED2BBB441BA0EFEBE53CA0BFDD29002D5B79F764B4017AFCF555BEC0F27D17316F830074950574C189A5009DD85456892CCCEEAB2F6500FAF02124DC7997AC4213E7AE178096A5947B32D9003D3911B1C14E84D9A5E763E2D2DD02D0EE6926D9A5DA003DAEBBEC73EC332EDF7F09F336FE272CE82A2BE8FC8936405FDF0453AE6F22AB4006E8255FCB04F41DFD65159A387F8300B42CA5DC93C906E849D72336D8B7CA173995518089DFED1180AEB282AE3991013A32104BC676AD7281CB0F5CC6BC4DA705A0ABACA0F327DA00DDA331A6F4682CAB4016C5F1CD1219803E7410097201BD60A300B42CF9DD93C906E8893D9C07F4B2BD02D0EE6926D9A55A011D8025639C04F4E63302D0B255777D461BA0BB37AA1CA0BFFD4626A06FBF4356AD133FDC24002D4B29F764B2017A4277E701BD7C5F8D0674618106BBB71EC34DB777718FD8D550AA0DD0A3AB7E0FCB0F26615E0D0674DA956C9C3F938CEEBDDA5683E2EEB9442940776F24EB22CC825EFAAD0C401F3C8004B9805EB8B9D280FEEAA3DF90975B68AB74C76E2D70C32D9D65DD84A765D269F5F8FDA72D1836AE2F766E3E82A09000B4696FF539498FB9ABDE2580EE86D820275D1CDFEF7739A0CF9CBA8C3F7EDA72D5ED07870460D23479A19C72B54B49CAC01BCF7D89055F3F5DEE29C70E9D437E6E217AF46967CB43FDD1D575915B67FB7C36408FAAFAF3C000BDE5ACCB2DE84D6BF7E1C0EE53B62ADBB7213D0737F4EB84E0D080AB6EBFA2633CF3FC379763C6ACD1D8BFEB24D6ACDA86E7DEB857B68CF66D48D7EBD1BB2DA2EA85C92EC395196D80EED610532A03E8EF96CA01F47E24DC7ABBACFA267EBCB5D2801E71CBB3A5C43F7AF02CEA378CAE91968FD168C2B9FF9290D0BA21162FFC15317111B87388751698F4982C31AB90C906E87BBA2236C8A70A25584F39955188892B0EB81CD039D9F938F75F32BBC6E7F35761E8D89B111119026F1F35DA769037BA2DF7A6E4007AF5CF5B7125391393A797CC94A5FEE7EABAC8AD7399808E08C092911DAB5A04961F4AC6BCADE75C0E6802684C7C24125A3560752BC82FC289231770FFA383D9EF67FF4B427CC368F8F85C3DBD7CD6C30B3163D628C4C647967B5F04E64EDD5B5609D0C494156BDFB2954D75A167D13FA0EA464B951B00800DD05D1B604AB786B28A6216F4F26532007D80007D9BAC42133FD95625404BC5A44FD3AF3EFA1DDD7AB5B17DD690E03C4D9A7637EE1ADA9BFDCAFF4E0FD4ECF7A7B2BFBDF3F212F6694B292A260C1F7D3B131BFEDA8BC2420DE8E1A363743DFA749A7ECFDBB8E9B62E98FE8C7553DCA71F98C7CA9934F815F6BBFDB1F36752D8DFCBBBDE57AB5EC6BB2F7FC3CE7BFBA5AFE1E5E5053F7F1FD0DF29D1315ECF85EFACC086BFF7B2BF0704FAE2AB55B3593DD352B3917E259B1DA3F30202E54763D8003DAEB39316742126FE78D0E580967622E9434A6DF1D1BB2B589B53DB3FFDCA78D6F6E5B5EFC8F1B7E0E907E7DBDA97972B6DFBF95F3F55CA82961EA3F6A7BE30F3A10530994C080CF2C7BB9FCC40E3E6719876CFDBACCF50FA61C95AAC58B2D6566D7E1EB513F52D3AC6CF93F580543213B3A023FCB164849380DE76DE2D80EED3AF138328253240D6ADD98D944BE9EC0B84F49EF4D00044C784D99E357EFBD959F9080EF167CF07D774F7D6A3ECF01F2BB7324DA97DE918B7A0E3EA47B26394F8F34B7D46FADC53BF98FDD467A0E794AC65FEFC525DE818B52F7FEE795D785F9B347836167E3B933DFBD2E7BE924D5666F65280EE6A7DA1394A0CD0DF2F9701E8FDFBE403FAD3ED4E039A2A4E6F676A78EA007DDADCCFDE7E1CE2FCD8FC37BF67D6CFE6639FB346DCBC6EBFB5F1BE5987C53FBDC8AC583A975C26FD07F7C49BCF7F8537164CBBAA4CB2A20AF2351839E116DC3BF4559C3E71C956E68C49EFE1DEE903F0DFF14BD8B2FE0056EF98C72C8591B7CE6265C6C447300B82EA49293FAF08CF3DB2907D56DB5BD0F6C7BE5CF85BA97A366FD50023C6F763F59CF5BF49CCF2EEDF6306D6EC9CEFA82D6DC76D801EDBC97940FF74A8DA004DD62E694AF74F9FB594A456106F5F3A4660A7B6A076975AC9D23E43E757748C975D96052D3D26ED33D41694DE58301DBC5F90E54D7D66FE574F2128D8F58B4AD9003DBC83EC3E609F71F9A114CCDBEE7E40D375E919A4B6E2EDC4AD647B8BD6DE8266E74C7A0F8F3C3B8A3D8794E8D9E5CFB6F4187F467FF8E7CD522F602A73F2F401ECB92FEB7AFC1867027F46F97348D7A044CF5B59FDA2CA0D20B5A0BBD4C794CA00FA87EF6502BA9F55344729F1F39D6E013435064F6461F5EEDB010468A9E56D0F76E9434A30E51096363EFDDB1ED0D2878D3714019A37309DC3DFEA04D590B040B4EFDC1CF562C35158A0950D68A9FB83E04D1D840025FDE4AE32A0C774446CA0132E8ECC224C5C79B85A015D96BF98204B89ACDD6307CFDA1E7CDE16520893DF31B641146B0BFA74B677716467E641ABD5B3F2664C7C8FF51D4780B6777F507B10A0A53ED16A01F4D0EB1C3D7AE51E5F7EE40AE66DBFE0760BBA22403F30FA0D66E90604F8319F74598026B8F397B33DA0ED7DD004D9AA02BA3C78D3F3C78D21B701BA733CA674A92FAB2D0D3A1D76ADF84106A0F7ED45825C402FDAE51640F7EE5BFA136FFCD4FE78F989CFAE39A069E0E29BCF5683069B6EBDBB3BBAF56CEB19801EDDC17940FF7CE49A027AD7D6A3F879D906D69973730AD0AA6DA30A014DF9785BDC39A427E8E5C9A14F8393BFADD88CD4942C561E7D25D5184087FB63C9D092414C594FB7241303F48E8BD714D0F4727CE7E56FD0B8592CEE1ED61B1FBEB3A2940F5AFA85C4AB2EB5A06B15A03BC7CB6A4206E81F57C80474DF7EB20A4DFC62B7D3803E75FC2236ADDD8F9B6FEF82662DEAB34F9D675F9F68F33BF38AD09B70C4845BD82711F995922FA5B1F38A0AB578F08961080D0FC2A205BFE0E09E53CC1D21D782EE7B47578C9F7A272BF3E3F77F4483C6F5988BA341A3684C7974300C7A233E9BFB333445BA52839B645DFDF0CF5BB2017DE97C2A1E9D359AD593C0B2FECF3DAEB3A047B6776E90902CE85547AF29A02B72719465414B3BA8BD8565EFFE90EBE2209FEA132F8C65835DAB966FC0A7735656BF054D801E52F510B3E54752316FA7FB014D63472BBFFB178D9AC6B028ACB20602C9A7CFBF40A583848E004DCFE153B3C7A345EB86F8FBB71D786DE617A52CE803BB4F62CEEBCBF0C25B931DBA38EE4C7C14CFCC9EC08210E8CBEC9D9796B0F3AAC582EE1487297201ADD561D7CA1F65007AEF1E24DC2C13D05FEEA912A0FBF42BB190FD03FD70C32D9D586350A246FD62C12FB86B68C99AB8770DEB8D1347CEE3AD17BE6650A32880EB8B43A5A8A19AB5AC8FD0B040FCF9EB76D6184545DA4A019ADEF8345897969285479F1B839CAC7CBCF7CAB7E875730706E8837B4FE18917C7C162B660E79623AC9EE4E2B87368EF52803EB2FF0CB31A1E787C28F47AA3ED18758C796F2C43FD46F5583D7FF9611366BE3A810DB4B8C4C531E23AE72CE8AC224CFCE5D83505F41F2BB7E0CCC9CB4C5B6A8BE87A61155AD0D2B02F8A2EA03EC52D687A80776E39CA421DAD9FE2076C16F42FDF6F6483BE6326DFCE069638BCCF9F4EC682777E804AE585F8065158B57C23B3FA1A358DAD5E1747B81F960C7202D04753316FD725B758D0BC5D48531AF0A3F11E7A462849014D2F484AFCD926BF2F85E5D1E0380FA5ABC8C54180EEDEBB1D8A0A34F8FBF79D98F0C05D8C07F485959591CBCAFAF7AFBD3640DFDEED1176BCF5754D70EBDD3D585DF84B9D8CB6D52BB7B081407A0E9B348F6306DD98FECFBBDFC5D1310E533AC5C932769905FDF34F32017D535F5985267EB5B7D280A64F59FEE0D045E21A4431CB599AF80020FF5BEBF64D1019156A1B180C090D44FB2ED69D0A8E1D3A8BCCF45CF66F1F5F6F160D909A9CC9E0479690F501DD6F1BD8931EE3FE447AA02945C786A3651B6B60F9BE9D27405602257EBD0B675370F19C75DFBEC41BAC7E427277505D2A3A46F94E1EBBC05E00AC73ABBCD0F3C6F6AC9EE427250850DAB6F110FBBBDC641B241CDECE7940FF7ADCAD80A6766A9A100F5F3F1F68353A9C3A76D1D686FC7EA5EDCEFB059DD7B0490C8BBC909E476E8CE44BE9EC541AB4B52FB3BC7E415F6C9468509ACAA4FEC8274548DB90974BA182E42A91F60BF27BABD42AB9CD243B1F1B2424400F6C23FB1CFB8CCB8F11A02FBB1CD052BDA5CF1ABFBEB47D793B4ADB903FA3D456A429FD2E7DEEF933CAF5A617A5B47DE93A74ECF0BED3AC1F911B8CF70B7E3DFEFCDAF799DDDBAC515E94384BA4CF9AFD735865F18B4F319C0DBB0000200049444154B44571748CC5948E7201ADC5AE553FCB00F49EDD48B8E96659754CFC7A7FA5012DABE06ACAE4CE019FEAB8051BA087B5456C60D5378D3D95A5C1C4DF4EB815D0D5A1474DBF0603741801BA55956F65F9B134CCDB9DE4724057B94275F0441BA03BC4604A47ABF1E528310BFA97557200BD0B0937CA04F4920302D08E9477E3711BA087B6711ED0BF9F148076635BC929DA06E801D658E3AAA4E5C7D2316F8F007455B473D539A500DD214656B1069D16BB7EFD5506A077EF44429F1B65159AB8F4708D06B4AC9BF4E04C36400F6E85D880AA6F107A2A5B8B89ABFF1380BEC66D6D05B42F96DC296FA3D1B2AABBFC4406E6ED4D1116F4356C4B1BA0AF8BC694F6F564D5C4A0D761D7EFBFCB00F42E02F40DB20A4DFCEE8800B42CA5DC93C906E8412D101BE0848B8300BDE6B400B47B9A4976A90CD0A1046879FBD8950DE84CCCDB27002D5B7437642C05E8EBACE3608E127371ACFE4306A077EE40426F79DBBE272E3F2600ED4879371EB7017A4082F316F45F6705A0DDD856728AB602DA074BEE90B78F5D99803E998979FB5385052D477037E5B101BA5D14A6B48B92751506E83FD7C800F48EED48E8655DFBC2514AFCE18400B42391DC78DC06E8BB9B21D6DF0917478E0E13FF3E2700EDC6B69253B40DD0B7C9DB85A34C409FCAC2BC036902D0720477531E1BA0DB46624ADBF21788925EDEA0D763D75F7FCA0474CF9218E48AEE2171C54901683735B29C626D80BEB3A97316748E1613FFB920002D477437E661800EF1C192DBE4EDC25136A0B331EFA000B41B9BC961D13640B789900F68B2A0FFF95B06A0B76F43825C40FF784A00DA6173B92F830DD0FD9B3809681D26AE1580765F4BC92BD906E85BE52DF25E26A0FF2340A70B0B5A9EE46EC9550AD06D22645D83B938D6FE2303D0DBB62221B1A7AC4213579E168096A5947B32D9007D7B23E701BDFE92B0A0DDD34CB24BB502DA1B4BFAC95B43B84C409FCEC1BC431902D0B255777D461BA05B87634AEB70591760805EBF4E26A07BC8DBF63D71D559016859F2BB27930DD0B73544AC7FD567B69DCAD563E2BF9705A0DDD34CB24BB501FA66792BA09509E833B998773853005AB6EAAECF680374AB304C69256F5717E683FE77BD0C406FDD8284EE3D64D53AF1D7F388085362447FD7AF8D2BAB02753CD3BF3BB43879D68895B7D4771ED01B93715D4B357A75A9FAB2A575BC399CBEFD4FBE2B4042B03796DC246F7A7099803E9B877947B230F0163F663C8954FD0A64649BF1E39A22DCD73214535A86CAAA0003F4C60D3200BD65B36C40F7FFEB1272F46659151099DCA3808F5281E57DE310E357750BFA4C9E1E0F6CBD8242A3C53D9514A5CA56A05D980F3EEF2D6FF6595985AEBA908F3947B2201E4BD992BB25A39702B8BF6528262684C82A9F017AD3461980DEBC0909DDBACB2A746D721132742659794526F728E0E7A5C0AD7101F05729AA7C817C83199B5335C83388976D954574C189D482B17E2ADC10237FDB33FBCB5E2C34625F86165AB378D9BAA049AA5C845A01D0CBB66588BC09640CD05B36CB01F4462474E956E58A891385024201A18050A0720A30406FDB2A03D09B08D05D2B57BAC82D14100A08058402555680017AFB361980DEB801099DBB54F942E244A140752960B158401FF2791919C84A4F8351AF8752A140786C2C82C2C2A152A90085025577FE54D79D88EBD4750518A077EE281FD0050505B8BC750B52BF5C0CB3D100D6F345120A5C73058A3BA2055058CCB098CD5058E81705A05440A150C26CB1300813AE554A6BE402FD9B76C0A1FC2090B3FC4AEB79F4634B02DFD7BC894505A05028E0DBA4099A3CF50C222222A056ABD9DF28294C2693A5A8A808A9A9A9B87CF93272737361341A856C42816BA7004158AF8745A301B45A78E5E6409D9509EFCC4CA87373A0309B411634C1997A2AC19828AD54ABA1B258A0A4F38B13C1D91814047D44240C1191308584C2E2E707859F2FE05BF501B96B278EB8726D528040ECE7E7877AF5EAA17EFDFA080D0D655F7F36409BCD668B4EA76360CECECE06C1DA6412D119B5A913D4847BB1984D306667C3989303537616909509A4A743919101456161097009C83E3E30F8FA41EBED0DEFCC0C98743A1428BDA08B8F4390AF1F7C755AA8345AA8B41A28B5DA52B74F70B6444402111140743D788585C12B2404AA901028BD451C784DE82BB5AD8E3E3E3E08090941585818020202A0542A4B03DA6C3643AFD783404DD6335927220905DCA500EF5FC68202685392A14949863E351586D45418333260CCCC80456FDDF49525A512E6E060988343D88F29240486C040688C4644FCBB0E3ABD1E3941C1D0F4EA8DC0C828F8984D50E7E7C3AB201FCAEC1C78E5E7C12B2F0F8AFC3C40FA75A8544215150D556424D4D1D1F08989856F5C1C7C6362A00EB6C6B0724BC65D5A8872850204646F6F6F10A8A5EE0DD6FFC882A67FB04F46F2D915FF5BC826147087024529C9283C7F1E0567CF409392027D7A3AF4599930E65A37FFB525B274C3C3618E8884392A1A0808802228088AA06078F9FA322BC370603F14EBFE8141A984AE556BF8F7BD0521A1A10CAA068381191D0672931414C0929F0FE4E742999909655626149999405151C9F5140AA80283A08E88807778387CEBD54360B3E60868D4187EB1B1F0F29617D3EA0ECD4499B55B01EAAFF4437DDADE2850588ACD196135D7EE4E70ADEECE505888FCD3FF21F7E851E41C390C436E0E4C4545301615C1623094AE5678382C71F130C5C533382B7DFDA0F4F385CA3F805918F4E3EBEBCBFE6F361991B6E833E84F9D623E65EF21C350AF5367F6A9C8014D5F845AAD967D19D20F8D961B8A8A60D66860D669A1C8CA84322505CAA42480DC2AC5060A7B48BCBCE0E51F0095BF1FBCC32310D8AC1942AF6B8F90D6ADA10E0CBA56728AEBD66205CAFA5AB301BA16DFB7B8B56A5280BFE43569A9C8DAB717D9FBF7A1E0CC19180B0B61319960B11F7CF6F1016262616EDC18A6F8FA4040A075A08F60ECE3C33EF9E887A04CFFE790A68E9C7BFA342E7DB21006F253C7C42062DA2388898B431059D90A05FB1AA4B114B2A4B9354DB02E056C72E9E9F5301A0CCCCFADBC7C09CACB17A138778E457F481301DBFAA34250CB1608EBD819611D3B22A041C3127F61A908916A125D5CA6562B20005DAB9BD73D37C7414CD0351B8D6C902EEFD449E41C3C809CC3875074F162E90B2B14B0D0E71BFD040642D1A4294CF51BC01C5D0F0A5F5F366A4DBE377B20739F1C81D98B2C5A0264B1FBE2C2CA1F91FEC7EFCC1A56F5ED87F80183101919097F7F7FF6A9C8E2A48B7F08D6F443E32B1CD6E4FE90029B8FC110D429AF3239095E17CE4371F9122C3939CCBAA6E8117B70FB444723B463478477EC8CD0B6EDD80B4649A3F05E5EB6903EE1C7764F3FAC0BA50A40D7855676F21E39902946DEA4D1C2585800437E01728F1F43CE9143C83F791246F2F14A93B7372CE4B7F5F165111396F87858E2EBC3121AC6804C3F7C60845BC8DC4A2658D3710232C1563AAA4D7529C8CEC2E90FE723FFC001C0CB0B010F3C8406ED3BB010252A530A44DBCBC40ED8046229B0B91B845BD8DCF236190C0CD0CAD4142BACC962D7E9A0A0414C72D1482C6DA58F0F825AB44448BB760869D90A3E915150F9FB434523F36AEBB66402D64E76C63A76BA00741D6B70B9B7CBAD4F02AF36231DFACC4C14255D46C1850B283C77169AA424E6B6B02502504020CC0101B0909B8106F6222381A8682809522A95CD4DC12DE5B280CCAD643E7022851AD589A09ABA67172E7DB304FA9414A07113D47BE021C4C4C4203030D0666597779FE5019BCAE5C026384BFDD7645DB30147830126AD06484B8322231DA081C6BC5C280A0AA0A01794C48543163459D734C818D8B429FCE3EBC327228241DB9BFCE464610B60CBED8E75369F00749D6DFAD237CEC165D2EBA04B4B83E6CA15145DBA88A2E414689293A0B9920203455A4806D228B2822C624B6808FBBF223C1CA0FF878543EDEDCDDC16DC4AE6BE64FA5D6A2173204BADE4F2C04575D469B5B8F0E30AA4FEF13B2C14EF3C78281ADCDC97CDC0A2807F3E122EA759A503E33C8A89FF5F0A6CEEFEE056361B70341860D4E960C9CB85252B0B168ADBCECD8532271B0AD2C9EE8B42151808DF9858F8C7C7C32F3E1EFE71F12C3AC42F2E1E5EE48B17B096D364752E8F00749D6BF2921B6680B25860282C40C1B97328387B1645172F409B9E067D5616741919304BE391C9EA8B8880393C0216FA090B83323818CAE01078050430284B812CB59009CA04633E4B4A0E90A54DC32DFABC94149CFBF20BE4EDDDC3FCD9C1D36720BE6953E6DEB08F21AD6CD396056CEEBF960E3812A0B90F9BC39BFE4FD129E6DC1C6B485F4EB635A42F3303C8CA2A6D5DD38B2B2C0C3EE164514722A0491304346CC4AC6D5FFAEA10B0AE6CD3D5DAFC02D0B5B669AFBE31E9E73D4D0EC9397A1479278E337785213F1FC6FC3C16FE56CA4AA678E47AF560AE17C306F594814150F8FBC3CBDF1F6A0A6F2B0E7DE36E0B1E69C1FDCCDC8F2C8DF3E435AB8C3F96EA4E904CDBBF0FE7177D06435A1AD0A60D6226DC6B736FD843DF99A6B587B574C091EAC181CDDD1F521F36738768B5301516C24CE184458550A6A6C22B3D0DB89202486646521DD9CB2D3010AAA060665507B76A8DE0962D11D0A00194EAD23E7567EE499C5BF3141080AE796D56A91ADB66ED151522F7C40964EFDF8FEC03FB98854C11182CF4CD7EE66854141BD033366A0C0BF99069504FAD869A42DD24A16F3C26D9DE6D611F785F1520DBDF249BEDAAD1E0D29A3F90BC74295B12C967F418D4EFD587B937E8055119F7466544B49F23207DD1F170BEF2FCD734E8C880ADD382061CD917495626BC2E5D82F2D24520230390FAF269D20245AB50644B501042DA5D87B04E9D11D6A103BC838285755D9986AB057905A06B41239602088594198D309B4CD0A6A723FBE00164EFDB8BFCFF4EB14FF0526E031EFAE6E303456C1CCC8D1AC3D4B021E01FC0DC11F63E64F2F1961769C1A12C1DDC73A5B464B1E6255DC6D9AFBF42C1BEBD40541442C64D408376ED58ECB3B3EE8DAAD6D51ED6F6C0E62E101E1D6203360D389A4C50141640917419CACB97818B17009DAE24A44F522902764093A608EFD205611D3BC13F2E8E59D74AB50A8AE255FC846BA4AAADE8B9E709407B6EDB5458331B94E9D35FA301CDD8A309218517CE23F7D851F64353A94BB92BBC54B0F878036A6F202418888D87393E9EC18E66ED1194A533F6ECDD16DC8F2C0D7DB3ADBAE5C6491A2C7AC36040FA91C338BB601E4C14F6D6AD3BEA0D1884D8C68D59EC33D5DD13922D24B138F6BAAC093357CD70A401478A27D7EBA1484F63E17C484981222F97019B85F4D94DF2A10891E096AD10DCA60D0BE9A3D996E476A2B03E451953863D411B5187CA2B20A67A575EB36B7E06455AE8737260C8C9812E3313F967CF300BB9E8C2056BA445894F814D83869F3F2C01FE405838101BCBDC168A9050781547599435B027755BD803B932BE63578845D0D31616E2D29AD5B8B26C29E0E303BFC14311DBB317A2A2A3AF8A7D76C5355D558674C20CF7A34BDD217CB091FBB0B94F9BAC6B364126ED0A14A9A9B0646640595404057D05D10A7D92681AA5B737029B37476093A6086A9E00DFA8683608A9A6A52BA9FD45AA110A9439D59B2F9674A5508BAD4959D018C552A31ED59AC5338EFDB50508CFCD42784116FC32D3A04DA655E052A0A54127C9C3AAF55221D3DB0FE9F4E31B087368280B81A3F037F8F9C14BA5663F349D9AA22E54DED615B4C8C76C3D669D1CE2A5F482822D8A4F0B87172F1E5E5DEBDB5B006F830E26A5174C5E2A982D66B65646E35FBE05CE9E4672783492FADC0ABFE6AD1010140C259B61E851AD765565AC6E7E9ADDC856232B5ECFDA0CB389A6A45B63B0E92B81A69E1BF4D675438C06EB34749A2064214B3A3B0BCAEC6CB63E76A8B610D1BA2244E98BE06B92ACDF4EF1D7E1E12C7C8F061C8D91F590191C8EECE070E4FB07C1AC28FED2F070BD3CBB355D5B3B6A8A06417EE8533F823D6F5250B3D5ECE86DBD33390BBF5FC842C7D870D75E5D94566905582C2EC5DAA6A6407FFE2C74E7CFC13B3B0321857908D2E4C35FA729B5959339300886C828E8C322A0090D439E8F1FF2BCFD51E0EBCFAC6495DA9B0DF0B1D8646F1F2B8CD5DEF02A9E92AC2C863114927568D9035CFD4F31DDBB3EE932749BD681D656F4EF3F90458EE84E1D47836F3E829A1649EAD403598937C32F3A063EF449AFB0AE0256B39275CB2EF61FDB2C4702B6894D003291CB83AD23A287516F5D3384AC6B82362DC5EAA7D3205857C47EFCF36843832CA833D3A1CCCFB3EE3A539C742A6FE4F907B11F6D781454F10DE0DDB829BC1B3606CD7C64ADECE96FB79AD5B095AEADDE64C6FEA434BCD5BB150B43950E76B31D55A8E1379E4FC5A1423346B76B52E90B88139C53C03649A4B000DA93C7A0FBEF14F417CEB2B591CD05F930D9AD636C51AB610C8B80AE5E0CF451F5D82E2134B00716FE56128F6C8DB8F02D8E4F2640ABA1F252318B53E9A58492C0267963973CA7D50F66AB82144A6746C1F62DC85EFA250B4F0B9BF6187CAEEB84CCEFBF81FEAF3F60F20F80B9FF4084F4EC83B0F00878FBFAD602C0145BD67CA9DFE2DD6208D6F4C35C224603B3AAF5E4DED2E9A1B7ADD0A7835943A17C45405121BC7273E19D7E05DEE9A950A7A5D29649259D931E7EF2550705B1979E4FB304F8346F019FE62DA18E8A622F646B1FB856EDEFDC735453CF2E3218F1FEE68378B76773361BB6D482FD04E8C2C2426C387705C70D2A01E86A6865DBC83FADB6967C19DA13475174601F0C17CEB14F598B5E675D8A536209997D7CA06BD018BAD838E8A26360F60F601690978F2F543EBEF0A14922B4146771289CD587EC0D959AD6B4A091FE92352D6C037BFC5E3DC482620B1A190CC8DDBE05053F7CCBC2D17C060C855FFF01C879F16920330386FA0DA11C320A11AD5A233028987D0DD42A0BB0B8CDB90D2C8DBFA63D16AD6B8810ACADD6359B3443A17CF47FB6A4AA0E26AD967D81C1A0876FF225F8255F86F79564280B0A4AF76E5AD889D62E2137575C3C7CAEEB08BF36EDE09BD04A58D6D5C0017E0902F47B1BF7E38D6E8DD8AE2AA5B6BC2240D3A6B1EBCF26E3A4C9072385055DD234C533ED6C0ECECA828C03963E614D14736C6271B0BA9347A1D9BF17DA83FB61CECAB05D8F3D94C52BBF59542A18C323A18B6F004DC3C6D0474431CB97ADFC563C63CF9BC05CBC14A7756A3501D93A638FBD858BA15CFCB4556397ABDAA5084034953BE7E07E687F5AC696FEB45CD7115EBD6E84F993796C453C43C72EF01E3402016929306EDD04FF9E3720B0F78D564857B67DAA56CD6B731607377787144789306017478130EB9AD6BF2E5E039B7E67BE6C8A773719A1CECC60B0F649BA0475F1D88575853E73699BD9CF0FBEED3AC0AF4B37F8B668C3B605A3303F5A6AB5CACF02FB40A299AB66902BADA6F4C9EA686C0D59D01BF7E3F5CEF5CBDE34363F3F1FFF12A0CDBE18D156B838986390A640275D8621F9125471F150C735280E5F72F4F967B57DC84F489F9E3493CC989106DDF163CC8FAA3F79AC54C81441875C1666B537CC3EBE30C4C4401B5B1FBA9838906FD91A8F6C1DD0F3F6F6818F6FB1DBC2A704C8CC6F45502E8654C94083A3BA5647F7937F0D8BC50AE8ACD3A7A0FB693954278FC1141E01D07A15470EC144BEE8DE37C18FEE75F3BF6C1D0C655434EABDFF91D59F5E237DD1F2F5299DB3B89F4997542D7687988CB49B0C59D9D68D0AB8754DFF27EBDB4481009A42F8A624C1273909EA8C3478513CB6410F2585FA49D75BA1094AF51BC2A74D3BF8B4B90EEA7A3150F8F9B3D98F647997BC142BEA6BD6BA1AD252A13F730AEA060DA18E8967D017EE148000FDC1C67D78AD737DB664EE55BB7A73409F30F962445DB7A0A9C39B4DD09E3C8EDCC51FC3989C04DFEE890899FC109B8A6B75D1493A23B76CC8A2217F714E16CC140277E922F4E7CF407FEE344CA9A940F1483B1B13527BC3E4EF0F939F3F4CC121304446431F6DF527B305EB556A2B907D3894ADAE0BA9852CB5924B8DFCD6602B922C68B2F8B25253A0FD6939BC766F8785E29B556A28755A1849AB464DE17BE6141445855637CF4DFD103E78147C8BD781AED55674792C97B8454843BEE093D57F6D80D140EB6097F65B5BDD21D615FAC898506567C23BED0AD4A92950D11E8E5A0DBC0A0BA1D0EB4A59D74A5A08AB49337893DFBA7E43A8C223A0A490CDB0705BFCB57D1B509DC87D95BDF8136837FC0375424B040D1D0DDFD66DD9649B3AD96692B62440CF910BE8E17519D034384333F00EEF47FEF225305EBCC0769056F5E98BE0C123E01B1A566A8495DC15C6B42B30A5A7C2987A0546B2B82F5F80293909661AD82B4E168582597FC6A06018E9FFA1E130444432178685F6D82B5EE18D222C4A7CC8C551172CFC4DC57E4AAD8D4C837B1EE643AEAA2D582294850123373B0B85BFAD8472D33A2825DB6259945EEC6B83606D080E81B66357F8F6BD0DE131B108A0DD588A17F477BA1E35BD003B7748C9824F46161D422E11F261EBF556DFB56D3BB06277084582786565B2A810554E1603B63A2F976DC22B8D1051F8FA41151307557C7DA81B3686574C2CBC22A3D946BC5E926DC1D8347D9D0E39BFAC8071F5AF5090BBA5452B040E1A09DFB6D7313F785D4E04E8B972007DDCE48BE175D6C5618573D1AE6D285CB502A6CB1761F6F282F6BACEF0EE773B429B25C0DF3F0096DC6C182F5D80E1FC59182F5F84293303A6AC0C9873B26DAE0B66257B7B431F1E69FD098B609116E6A0600664859F1F0B7763B3F6D8564E3ED6752E282E9962948B07F628D2823EDB4B5C173622D7D2FE6C5DEFB9202F0FB91BD741F9D76FF0A2D9749244DA6AEBC5A2B04317285BB743786C3C42C3C3E1439FDD5EE4DBAC596E1DF7376419112236FF7549FCB57D848841AF6510A7F5AF09D84A722715E4C12733033ED95950676740491BF24A1259D7F4E3151109755C7DA81A35818AC2F922A3A1D5E99075EE2CF46BD7C0F7C06E284D2678356A82C0E163E1DFA96B1D734F956E7502F4BC4D325C1C04E8617511D0DC723EB817052BBE8589A6DA9ACDC86DD711BA6E8908F5F5454056069417CEC194960A4B411ECCF9F9B0684AAF6D419FE0BAA87AD090BB22321A165F3F16FEA6A0D0265B7445692B9906F5D80F597F3CD28206F88A5D15B5CE4AAE8848346DDD6C4651413EB2F7EF8162D5F750A5A596FA12D1D48B456EF7DEEC333B242A0AA1E111F0A3CD5DC9075D3CC5D9FDD0ABA157B08F10217708A8AB9BADB1D7B65D6668B20CB9447874089F3CA38399DC1E9A22280B0BA0CEC9826FDA15F8A45D812A37A794750D6F1F288BC3F994E11150346A8A82D070E499CD50EFDD89C09347A1341AA18CAB8FA029D3E1DBA2B5DB16BBF2F4D62240CF9703E863265F0CAD6B80263853F4C0D1832858F635CC17CF5B07088382A08D89876F7616545A0D144603406B224806502C5E2AE8A3A2A1896B80C2D878188343016F6F2829F4CDB738FEB838D282BB2EAC16329FB157126D61756DD742B745659E8EE2B6D06A34C83CFB1F14CBBE82FAC2395602B9890AE2EA233BF146F8356C8CD0C828048784C22FA018CEB53D8AA3323ACACD2B05368DBD14C761B3BD268BF770249788BED87F6D28768710B8597488566B0B0B5515E4C32FE512FCAF24C33B2589C1D796A86D680B342F154CDEDE30F8F94395970B75A135EC4F41BBA64F7F12BE2DDBD4494813A03F940BE821750CD066B309FAD3A790FFF90258922E3BECDAA6804006E482468DA189AD0FB38F759121DBBA16148BCCA22D7C6D6E0B1ADCB3F9908BFDA4D5B1C890C39BF1C00CD65D5334C8A6493A5F7F0AD5B1C3CC6991DBA00932FBDE8EA0E87A088F8C42504828DBED9B74AF5571D01ED226D23544C8F5C736D3B5C560170F38DAE2AFAD96365BF0C968648B3BF9A52621E0E279F85F3A072FDA12CCC17D31483FFC147CEAA0254D805E2807D0478DBE182C13D045855A68B43A0FE94E55AB067542BFF42468BFFA1896CB763B5153589005285478411B1C0A4D7C431451F85B58048B2AA019792A6F8AB690FA90A5037BC5F1C8CC8F4C33B468D69E6BA7D5AAD52A0405FAFDBFBDF3008FA2DAE2F83F7D534880449A020A22F60E4840408AA4808A58F0292A3E8C140141A58874E9080822D828FA0011450445514A22A0204BB161C702811084501292EC6E92F79DBBDC65B26C92BBB39BD9C97BE77E5F3ED89DB97377FE77E63767CE3DE75E9F5EEDC952CACBA3398BEDFA44F4732DEA13B2CE4E934F7FDD2A847F63C591FA8D70AA5922626A26208E6EE4D8589121E94CC0A9E8D6F7F30F0460890847748CF92621A2688DDCBC7C918DE9CFA28535BD5DCA19FACE0D389E7587882CC773F388D01C2334D748C4F1A388CA3A8CC8CCBF6039FE0FA2838A11EEA1DB82292AE4FE47E1A8DF182567EF177F9E8751C70A090E465434196ACE85822B2A04E8F95B147CD0DF7B01E8F90B5663F7DE5F2B6ADBBCDB4B4A105662478FFC9FD0B8F8142CCE99114A95ACA2106CB35BB0BF3802A783C2702A380245C10485B0B3E9D261622E5EE79F73404F264C0867C5390772A5E8D0A07E2D0C7AF21EC4C645EB3EFEB17F4EE2B537D762FF1F87751FC3AF15455C6F311CB6025C6ACB46883D1FDF144522343C122111D10809A389F94344B243A0D292AFBBB6319EEC77B75F4FDB1F07FBF6DBDFB1EC9D0D3876FC5C04913F8E5BFA189423E09C42C439F993336780FA4C84F8151789BFE2624A8EB10BAB3BB8D88ED8E242C4C2817A4185681B968F8B424A4FCA46C7B321083F86D4C0A7E117232784E658A1368C7F00FBAA595C6C34BA776B83962DAF563A14017A812AA0EFBC522D5125ADEF74444706E186ABAA66880C5D5821B602D4CF3B826A79271173261FE1793658F21D08B39DCBAC729400C7118AC325E13858AD06F29BD4454854C4D9013D9A45CD99C156FA35BBF22FAA5FFEB023FB583126BF9086F8F838A50BC1D34E070E6663C2C425A8573B048DEA53E240E08B00344D689F9F87429B4DACE8425993A194DA7E16CE81FA955FED29142EAC97660E0CD44F28B3DD0D9BAC7877E5665CD3340C71D58C9A40EA9C61730ED6CE5C0211DE576043C48F99B830EF24EAA21009410E846A6E0F7B6810F2A3C2608B0E437E4C148E45554776543C0A23AAE6245879F925D8F3830D5D5313D1B54B2BA56B8400FDEA56450BFA0E45403FD1773AEAD50AC1E07F3B97E1A94AC519C85F8282FC429C3A91879339A75178E20C824F1620F474212CB93644E6D91193E780E58C1D4167AFC1E2F82814F5B809A1B5AA39012DE07CEECC8DF485AEF8280FD6EF6C98E42BA00F64E385494BD0FAE608DCD9292AE0DDE87C9DA68845070A0B9C596F1476181E118AD050E703D1489DDD051935F3048282C331DB8480DEB8D18A77DFDB8C86E9E67E00001894494441543EFF8A41E3866AAFD7FEECF052EB38163B23721C874F2274F92E716F099B3B0828B484222F260C6762C2504070AE168E92B84884D78C415C8D18C4C5452322325C844D06B2AFF5689379C481D90B4FA38B97807E4D05D0DF392CE8AA08E8BEFF0380B6DB1CC8CF2F407E5E210AF269E219FAA3D84F3B82CFD81156E84044810331A76C88CE73A0A44E2C42DA5C0A4B02A56007F6E291807EC147401F3C908D892602B4B889CF3E4045F85709101C1C24FE020D67FA6D12D0334D08E84D1BAD581940406B812616277014A3202717451B7F4648E649E4C685233736028591A1B05B425014158E104B1822C2C3106E0983253202515116444653D62C256605F661EC0BA0535313D145D1822EB03BF0BA0AA0BFF502D0FDAA38A0497CB2A2C50ACD8E22D8ED34E94C110A690E8342BBB0DE68E0ACC85E04388A10161484A8B868C4D58A4374B5489735A7A713FD5147027A828F803E70201B934D0868A911DDE8668A7891807ED1A4807ECF4480A6FB8906A04F669D405E4E2EECF4B619162CDE88222268D2AF3084478489C1B4F070E71B122D18E15C34422E1251F9EE427FDC8FF218D2822640A72A029A5C1C6F2A01DA6E4117450BBA7FBFAAEBE2D07608419ACCB44F567F89C399FFE0A1B414016CBAB808D0B6429AC7C019D369B1842326360A9648CAF80BEC1A7812D0E327F8E683260B7AF264F3B838CABA59A86F263DB70873973CEBCFFBC9EB634940CF78D17C3EE84D9BAC78DF4480A6689282021B724F9E41C1D9882FB110B18073A8B09245886AA8762A5C67975435D7863BA05308D0A9EA3EE885DB147CD0DFD82D485504F4804A06F4BB6F6DC0E2F96B111DED0C679AB3E419D4BD30017BBEFE19C3FBBF5C2A72416EA3FDD67DB00D2F4F7BF7BC7A15DD89542F2BF3181EEDD75500BB5864173AE7DFA50B8D404E6E0DBAB008CEDA550F2A3A76656C97801E37210D357D1824CC3C908D293A004DC0ECD9750C6AD4AC264E6FE088FBD1B2EDB5429B76D73C810B6AD7709D76EF4177A1437233B14D3C045347A16682736053BBAD3C9DCC06E869260474BAC9002DDD1CE44A74D00AE6414102C602CAAEF0D3B3095A5578922FED752B2DE8E4D444A428029A5C1C8B54019D72855A14C7C0FE956B4113A0A9DCF77047F1EFAD573E8E2DFB5E1780DEB2710F068EE8E1D265C023D3D16748775C755D2301E8DCD3F9E7D52BEFE63F7DEA8CB0A063AA4522A59BF3A9F7CDAE5FE0B0533C69096AC4C7A2C125755C3E50BA9608DADFEDFEADD4619B5ED550C43F1A5124A0C712A06BEA8FE2C83C988DA93A013D67F20A4C7EB9BF385DEA83E726F5120FD17B3B0EC7CA0D535C32BCFED26A5C7E7543DCDAE1060168AD253CE2C97902EE54AFBC427D4E7D2FFB7DFFAF993899E3CC44A3D764EA7BF7F2EDAE5F4BC504D7B930BEC2762AEA3B69414F9D613E0B3A7DB315AB4C6241938E72C057C651D377EEF3CA54554BB9ACEBC405E8944424AB02DAE1C0621540EFB55BA00AE8412602348925A1A007D074E313A00930543E5BBB1D5347BF853BEF6B233E47464508EB9020202FA8158B3FC391C3C7C5F61FBED92F1217464C7CB494E558D1CDEECB7609E831E37DB4A00F66635A25035ADB3F7A01AD85FEDE9D3F63D60BCBD1B8E945A85E23465864D437ED3ADFE49294FAF0E77D7F8BD8DCEC2339F8F3F7C31830F43EB4B8552D36B5ACBE91809E6246406FB2E283F70317C5519666DAE88EFF3520BB9FB30474923780B63BB0E44B0517C71EBB05C98A16F4600301BDF895B578F3E535655AD065017AD9C2F5983FE33D51AFBCE20EE85E778F47FBA49BD1332D455413EE8F43C7F058FF3B5C87496E31109FEC98233E2F9CB70675EAC5BBAC6F5FC0AB5A57027A941F003DC347407FB16137664F5C8E79FF19E6D1822E0BD0546FDEF4F7307BE1900A2D5B2DA0E74C7E0794C94A6F4DD56B563BCF2AA7F6A80FE72C7E06D562A384E5AD7D00AB6AEC693F023482C331D98480CED864C56A1302DA17BDAB5A5D09E8CE29894852B5A0ED0EBCAD0AE82445400F3100D01FBFBF15F5EA5F809D5FEEC398E9BDC52BB22717873BA0572CFE5CD4A37D474EEE25EA51D9B5FD2711FBDCEAB6EB4AF5BB27405F50ABBA184DA6927DF8385AB5BFCE94807EDE0F807E5127A0FB3E3005575C7B09C8DD90D22D11F73FD249844AB9BB38DC01FDF8BD1371CD8D978A7AF4207CA44FAAA847EE0E59BA746F5DAA9FDC01FDFDDEFD88BFC0E9DA292CA089E71DA506102B1BD0934C08E82F18D001E7B916D09DBD00F47F5400BDDB6E41D2E56A3EE8A79FAC7C1FF43F4772D0A94B0B217A932B1A887F5500FDE76F87CEABF7D3F77F62E4A0F90222D2AF2D7BD313A09F1AF900A2A29CCBD253A1412D0904FADCF6EA3434BAEC22B1EDD60ED7E39E073B20B6BAFE946B6FAF2C69418F1CE7BB8B63E614EFA338C8553179E4620C18769FF8E91736A8E5F2BF5704E8514F2DC0B0F10F8B7A752F4A404C356782CCAF3F3AE743F9FCA31D48A85DA3543FB903BA76BD78DCD8BCA94BB6C8280B2E6A58CBF599004D83BC34A776C34BEAA0EFD3DD41757C2DD2829E38DD7C3EE82F365BF1215BD0BE76B14FF525A06F4F4944E714B5280E1A245CFA95828B8300DD5911D0CF18006852CA134CDD0709E50022EDEFEE83D6AA5DD6364F80FEEDA703E7B946C8C27BAC7F57F1B0D0BA38DC7BB4BC6D3EF5BEA6B204F4737E00F42C9D80D60E126ACFCB1DD0DA814095680CF701623AB63BA057BEBD110BDF1FE57A70BBF7BDD68276D7BCBC6D15F58F04F40B2605F41A0674455D58A9DBB580BEDD0B402F5301F42EBB05B73755B3A0870EA85C0BFAE3555B8590A977B72E25280DC88D7DFAB552DF692306D2D7EF425E5EFE79F5CA83371DF3930FB6E18921DD85CF92CAA3778D455EAE333D5500E2E18EF8F3F743B8AF67475C7C693DF17A3EACEF5CD7F6071F4F466AB756220C8FEA2E5E3DB6522F0409E811E3D250C387288E4399D998AD03D0D95939220C72E838A725EC0E68EDE767C7F544F3565789AFA8DE2BD35762EC8B69E7D573388AF055C6B7F8FDE783CE70474D79A2C7244C9ADBDFF516336DCC5BD8B96D9F6B0F314878FB4DAEBEFF27FB0486F49E85FC33CE19175BB4BECAD5BFCF3EF192685FCF8C7412D0E3A799CF82DE9A6E4520009D73EC94087D3DFECF29D44C882DD54F957A1398F0E012D09D9213D14911D0850E07962B01DA664127450B7A582503DADFDA5328DDD2373E11376CAFFE5D51BD86337E57164F0381E5FD06772B9942C7EEEDD9A19445E7EF73D01E4F027AF8D834D4F0210EFAD0C16CBC34D57B1747659CDB86755F63E91B9F62E0F0FB85CBA4569D73B1D42A96B7F637B95BC9DEF66F59E727013DCE8C80DE6CC5DA55C646711CFC2B1BEF2C5A8F5EFDEF100FCF63474F8AFB8CC22169DBD123392E296F68DE14741FCAF048DA264353698A857DDFEC2F25BBDC46061485B9D25BADBC2EC865291FBE141E2B5DA0DAF04BD91ED5A37249937AE7DDF7FEBE8E25A03B7A0368BB03EF6C57707158BD00F4F02A06E8BFF61F16373F95EE0FB547D32B1BFA04E8A9A39688812E59FEFE230BDD7AB4F38B9F53E5A291801EE623A00F9B08D0F49093A5636A7397D54DDF790BE837E67E88DA756B9E5DA710C2BA6BD8A88E6BC05845634FFB48408F3529A03F3218D0145143209403F152331A079A33658548F4AA5D375E44D14C98D5474C86F4F66BEB70C5359708781384BB3FD81EAB5764B800BDEFBB3F109F108BE726F612F75397C4C178B84FAA00345D1714563969E4225C7BE3A5221B91004D6F4F140EFBD9DA1D3879C2191F4FE3481FBDBF55D42BEBBED77B1D94554F0BE88E8A1634F9A0DF55057447450B7A44150374451D411714CD1BE029E1C1535D4A035FFD4E866B53F3C42B85EBC3A822013DD40F809E63120BBA3CEDF272F3854B431BEB5C91D6ABDF4987CDE64CD3BFB871DD52C0AFA86E59DB25A0C79810D0DB365B611640D338C2DE9DBFA0FFB3F708AB973EAF7C6B83C835A090594A4EBAEC8A06221C72D1AAD1E78D3168A19FD27210868E7DD8D5F734A651BF612D91854AF378C831244A446A72797DD7C3C2DB87BADE6B425B4F02BA437222BC01F44A1540EFB459D051D107FDDCC0CAF541FB43ACFFE56348403F4B80F6C1074D16F4DC69E670715485FE92801E3DD57C3EE86DE9567C6C120BBAAC815E02B476905F05D09E069DE9812DC710C862BEA8412D3CD83B091F2C4F170964A3A7F51613FE7FBA663B766CF91E1D529AA1634AF34ABFC4B480EE90AC1EC5F1DE0E05170701BA8322A04732A02BBDB3CB6B4002FA9931BEF9A009D02F33A095FB52027A944901BDAE8A02FAB6EBFAE0E2C6CE37D04EA9CD71C77D6D5CE1979E004DAE8E0617D776F51BAD2A44EE904307FF41DEE93398396119E62F1B2E129A32FFCEC6964D7B71FDCD97E1C616972BF7B59E1D25A0DB2727C21B40BFAF02E8AFBD00F4F30C683DFDE7B73A12D04FFB01D0F318D0CAFD2201FDBC0901FD65BA1546039A9284268E58245C1904C823878EE1C509CB7073CB2BF0EAAC559830BB0F12DB5E2BC25229DEBD2C0BBA7B876158FCC118D10F1116E714A4B27802F4AEED3F62D5E6692E88BB77A0FB203E65FB6ADD1FCA1DEEE58E5A40B7F7C2825EA502E81D8516DCA668418F1914581707AD8442E174B2D0C08176D4DF4B5D3DEEEE29E142EE6844ACB38A053D78741AAAFB10C59175301BF3A7FBD7C541A174B22F643FD1EC76349B1D85D2D1E010CD52E89ED823B7D179934544AFB0142E4759829E2653D26EA32880FC3305E78DD297D7877AAE1109E81153CCE7E2D89E6EC5271F181BC52135ECF7D0541CCDCAC105756AE095FF0C135FD3140D1FAFDAE69299C261292263E7B61F5C619414F238FDD541E27B6DF82CF997DB77BE5984ADD2B1E531E5C1A81ECDAF220B0D1252DBE4E7166DAF1E23C264FB3F34557CA63059F79C0A3DFD5F511D09E8764989B84D11D0857607567FADE0E22040B75304F4D800039A468FAD5FFD284685A9D0D35926915424A2EAF6AA00E8A7FC00E8057E06F49D6D9EC6AC3787A051930B21FB893E5318160DDCDCD769840849D4CE48487D42BE49E9BB6CD1FA6A74B9A73506FF7B961885F7349F0AF92FE5B6B2E6DBA82C400F3729A03F0D10A055EFA9B2F6F36425FBFB7EF6F537AAD4D702BA9D1780FE5005D0DB0B2D68AB08E8F12600B476A4F744CE69BCB5E063116E73ED4D4DC4BC1BF44AB375F35EB18C0E8DFE535CE6B7BBCFAD44DE29B585784253ECE68EADDFBBF46F7DDBF5C2BAD35E349486FCEBD9701DAA3773C252D196AFB3A3A974BAA77DA48B63A01F00FD9A9F01FDFC53F3C572474F3CD54D845A757BA09D6B647DF9A2F57865FA7B689678A5887796912F14A7FCC7AF87D07FE8BDE27429DDBB41A33A98F2FC12D18FF49AAC8DE0A0FEA5C996562DDBEC9A44CBD3844833C6BE2DDAF6573F91055D121C8E612604F48E742BD6575140533F5DA9993296AE857B1E6A6F58D8AADEFBD0BD9E0474DBA444B4F502D06B5500FD9517809E60324093505A2B8A42712896B2E60571C2BAA6F932283599C2E32894EEC3151948BE2B110FF64EC6DC292B047C699F8DEB76E286669761C0881E6262797A2D2338D320832C54C75668C77303E6056C850F09E8017E00F4EB7E063459C9CFA4BD040A7BA242206ED8A8AEF83FB986E875935E69C94A769FEFDBFD82F734CA4FFBC8B4FBC7BA4F2817D0FE0EB592801E6A52407F5645014D092C2BDF76BA27A8D0020FF29AF1173C8D388E04741B2F01FD910AA0BF2CB4A08DA2053DB10A00FAFA669789C99124BC656A32C565EEDEF11386F59B8BB7D68C1329DB23A73C269257F67DEBF485BDF9FE683C76F77801684F596874419901D0FD7D04F49183D978C3CF80A61903972CF858A4C3CBAC407973C8B792B21664280BD0EBD76EC7DFFBB3F0F8A0BB44F201B59174674B24B7181410403F6342407F9D6EC5E75514D046C0D3883624A06F4D4A441B2F2CE875AA80BE5511D093AA00A0B53E2C4F3E4AB2E616AE1A7DDE5A77324D58029A06BADE5BBA115B36EEC5B817D344DAA95900DDCF0F807ED3CF80A6C13B5A458532F7126A55C7ED5D6F11F706E99A4B96D28629C2D7BC7CE17A8C9AFA6F11FAA49DF04A7B23490B5A6B096BB3D7B42BED787271549605FDB44901BD81016D0487CB6C430BE85BBD00F4272A80DE566841EBCBD4264B9AF25460A3383CA598BABB38FC0568EA0D8A1220B7C6D03E7330FDD581B46CA1292CE8BEA3D310E743A2CA91CC6C2CF233A0098AE44EA231026DA815C19456D4888EB1880C3FD273D2DC7EC247AC02E80792468A745E5A717DDCCCB452F5CA1A24AC2C400F9E6CBE288E9D19566C64409B02D0AD9312D13A492D5185A238D6EF5488E2D85A68412B45404F3301A02FBFFA62B11415150ADD5A307315A6CD1F203E6BA706A5CFB43EDD90C7678BC9E1EFEAD10E4FF69C26328E96AC1E839E778C1193C30F19F520260C7D037BADBF8818CB5EDD9C2E0E5AF4925627A6623640F7199D86581F009D9D998DC57E0434BD59C8370FD28B1EA4B29F526E71BA236491DB28E98016E17DF88E316255162A8BE77F849B6EB95C58E2940A2CDD54031F9D8101C3EFF7B856E59A955F883E9485E668A09570FCB91AB8F4410F3221A0AD19566C62409B02D0AD9212D14A11D036BB039FA9007A4BA105898A809E116040D3725634D22F4BC20571229E52161AF8BBF3FEB6C21D21CBD64D7BC53C00B2CC7B7BA898649E66C6A2350865916E0C19A3A9AD27B77DB7E737AC5BB50DC3263C12900B420E12A6F901D06FF911D0E492D0F6857B3F49D8926872DBF40503852B845C23CFF6712E23F640AFDB856B64CC9057316EE613E23BD94F721B7D275D20EE7D48DBA87F694C81067EFDD54F12D0034C08E85D19566C664007E47E948D4A174762522212BD00F4065540DFD244CDC5317370605D1C01ED85B3D108724DC240FC1609E8DEA37CB3A08F6666E3ED19FE4D5409841E65B5591971D02541E1E86F4240EFCEB0227D75601255CCD4E781FC2D12D02D3B27A2A52AA01D0E6C5201F4170516DCA26841CF6240BB168D0DC4052101FDD828DF7CD0E4E258CA8056EE4261410785A39F49019DC18056EECBCAD85102FA162F004D3EE874AB820F3AA3C082168A807E69F074445A827055937339F39571C2663DE6E71FEF0025AC04AAFC71D0816339C5E8E5070B7AD98C25A8151F8C06F54203753A95D66EFA67BB444291BFCA9E1F6C08098F405F13027A4F86155FACDE8CA68D42512D3AD85FA7CCC7F1428133F925D8F79B1D2D3A27E216550BDAEE40860AA0D30B2C68AEE8E2583A6D218E671DF3E2A7F3AEFE562022D2827F3DFB0862AAC7EA3E744EF631AC5EB012B9274EEB3EC6FF5BC5EA0935D0F3B9DEA63BED9FAC3F20E3838DB0E53B97F9E2121805424243D132B9356EB8AD99D20FB0391CD8A20AE8668A80B615DA50525CACF40378A7CA522008E1967011BAA6B7501FDA6D769450DC2017250582828285EE662B458E2238ECB44001F76560FB2608A161212050AB148AE2D8BA4BC1C5B1B9C0829B1401ADD230EFC30AB002AC002B50BE02345BE3972A80DE4480BE542D8A834567055801568015F05D0172716CAF08D0E9FB0F634D4E092EA95BCBF716F908AC002BC00AB0024A0A388A8A91F9D79F187FE345888F8F47585898CB6D1954545454929B9B8B1F0E1CC6C63FB270A6A000C5EC5B561296776205580156C0570508C80D6AC6A16BD3FAA859B3E6F980CECFCFC7D1A3479195958553A74E89A5D279D0C857D9B93E2BC00AB002E52B4003FC91919148484840DDBA75111B1B8BD0D0D073167471717189DD6E475E5E9E8073015BD07C4DB102AC002B6098026441C7C4C408385B2C1601671999154480266BD9E170883F726FB0F56C58DF7043AC002BF07FAC80043159CDF4476BAB6AC366F507D0FE1F8BCAA7CE0AB002AC80110A30A08D5099DB60055801564087020C681DA2711556801560058C5080016D84CADC062BC00AB0023A146040EB108DABB002AC002B6084020C682354E6365801568015D0A100035A87685C851560055801231460401BA132B7C10AB002AC800E0518D03A44E32AAC002BC00A18A10003DA0895B90D56801560057428C080D6211A576105580156C0080518D046A8CC6DB002AC002BA0430106B40ED1B80A2BC00AB0024628C0803642656E8315600558011D0A30A07588C655580156801530420106B4112A731BAC002BC00AE8508001AD4334AEC20AB002AC80110A30A08D5099DB60055801564087020C681DA2711556801560058C5080016D84CADC062BC00AB0023A146040EB108DABB002AC002B6084020C682354E6365801568015D0A100035A87685C851560055801231460401BA132B7C10AB002AC800E0518D03A44E32AAC002BC00A18A10003DA0895B90D56801560057428C080D6211A576105580156C0080518D046A8CC6DB002AC002BA0430106B40ED1B80A2BC00AB0024628C0803642656E8315600558011D0A30A07588C655580156801530420106B4112A731BAC002BC00AE8508001AD4334AEC20AB002AC80110A30A08D5099DB60055801564087020C681DA2711556801560058C5080016D84CADC062BC00AB0023A146040EB108DABB002AC002B6084020C682354E6365801568015D0A100035A87685C851560055801231460401BA132B7C10AB002AC800E0518D03A44E32AAC002BC00A18A10003DA0895B90D56801560057428C080D6211A576105580156C0080518D046A8CC6DB002AC002BA0430106B40ED1B80A2BC00AB0024628C0803642656E8315600558011D0AFC1776FEC638DDA41D8D0000000049454E44AE426082 where `app_id` = '5';
+UPDATE  `fn_app` SET  `thumbnail` = 0x89504E470D0A1A0A0000000D49484452000001680000012C0806000000EE2C29AF0000200049444154785EED9D079855C5F987BFA54957AA882E282088051535D244EC0876A3222A2AC1462C11A3F2370A0AA8281883062504BB066C815829828A801A4540015B0451A42ABDB848F93FBF91B3DE7B97652B7BCFCCBEF33CFBECEEBDE7CC7CF37E737E3367CECC77328C040108400002B12490114BAB300A02108000040C81A61140000210882901043AA68EC12C0840000208346D00021080404C0920D031750C664100021040A0690310800004624A00818EA963300B02108000024D1B8000042010530208744C1D8359108000041068DA0004200081981240A063EA18CC820004208040D30620000108C49400021D53C7601604200001049A360001084020A60410E8983A06B32000010820D0B4010840000231258040C7D43198050108400081A60D40000210882901043AA68EC12C0840000208346D00021080404C0920D031750C664100021040A0690310800004624A00818EA963300B02108000024D1B8000042010530208744C1D8359108000041068DA0004200081981240A063EA18CC820004208040D30620000108C49400021D53C7601604200001049A360001084020A60410E8983A06B32000010820D0B4010840000231258040C7D43198050108400081A60D40000210882901043AA68EC12C0840000208346D00021080404C0920D031750C664100021040A0690310800004624A00818EA963300B02108000024D1B8000042010530208744C1D8359108000041068DA0004200081981240A063EA18CC820004208040D30620000108C49400021D53C7601604200001049A360001084020A60410E8983A06B32000010820D0B4010840000231258040C7D43198050108400081A60D40000210882901043AA68EC12C0840000208346D00021080404C0920D031750C664100021040A0690310800004624A00818EA963300B02108000024D1B8000042010530208744C1D8359108000041068DA0004200081981240A063EA18CC820004208040D30620000108C49400021D53C7601604200001049A360001084020A60410E8983A06B32000010820D0B4010840000231258040C7D43198050108400081A60D40000210882901043AA68EC12C0840000208346D00021080404C0920D031750C6641000210C8D8B871E33630400002108040FC08646CDBB6ADD408F4EAD5ABAD4C9932F1F3021641000210D801815225D04B962CB12A55AAD010200001087841A05409F40F3FFC60D5AB57F7C23118090108400081A60D40000210882901043AA68EC12C084000024902FDD4B41FECE5E94B774AA5FF59FBDBA199D5BC24C71487976EC36808945A024902FDE0846FEDB559CB770AA3EF194DAC7DD31A5E0243A0BD741B4643A0D412608AA3D4BA9E8A43000271279024D0CFBCBFC89EFF68719E531C8737F073250423E8B83747EC83000412092409F490B716D82B3397ED94D05D6736B176FB33C5413382000420B0AB0930C5B1AB09933F0420008142124812E827A7FE602F7EBC64A759DD7966133B6ADFDD0B595C7A4F638A23BDFC291D021028188124817E78E2773666C6CE97D9F53BAB89B56DC21447C1307334042000818213608AA3E0CC3803021080408910C816E8A5ABB7D9C4CFCD14DA2EA420D1671E9E615576FB9525531C25D2A628040210282602D9023DFA13B38F977F61AD1BD6B41E2FCDB46F7B9F6815CBF91F9AF38BC56607EC854017537B211B0840A004092409F46D6FBF6DB37B75B0F7E6AF70E2DCAAC16F73CD0FCD5A6D0BD6FE6255CB97B116B52AD8B94DAA5AB709CBECE993EADAFC35BF58BDCAE5EC9C3796D898CEF56CF20F1BEDB87D2AD947CBB2AC56C5B2A688D3B52A95B1B92B3659FBFA954AB07A66087489E2A6300840A018092409F4F1076EB6BAFDC759A5F2656DD59D1D938A397FEC12CBAC5A2E49A02F1CBBD44676DC3349A05BD4AE60F7B5A965D316FF6C99D5CAD9F8051B6CE2C28DF6E3CF5BAC41B57236E2F8BAC5687EDE5921D07933E2080840209E049204FAEC96664F4DFFDE2E3D223387B50BD76DB6BA95CBDAC08F57DA21B52A58AF293FD9ECAE0DAC4AF90C27D07B552967E7BFB9C4469C50D75ABFB0D06675CDB455595B6DC2771BECED1F7EB6EE0756B36BDF596EB32F6A50A22410E812C54D611080403112C821D0C598772CB242A063E1068C8000040A41205BA0376C321BF34978AF273CEFA80C2B5FF65732ACE228440BE1140840206D0458079D36F4140C01084060E70410685A48A924F0B7BFFDCD264F9E6C071E78A0DD7CF3CDB6FBEEC51FBE60CB962D76DE79E7D9BFFFFDEF9D32D6CB8C7BF6EC99744C6EE75C73CD3576EFBDF7DA1E7BECB1C33C478F1E6D679F7DB6FBEEA1871EB2F6EDDBDB61871D56641F47BC0E3AE820EBDDBB77915FBE7CE9A597DA3FFFF94FAB50A142A16D7BE38D371C87366DDA14288F49932659870E1DAC4C99F82F2346A00BE45A0E0E81409F3E7DAC65CB9676D65967D9BA75EB6CFAF4E976ECB1C7167BD50A22D02FBFFCB2FDF18F7FCCD38665CB96599D3A752C2363C7DBC9CE39E79CEC0E61EDDAB556B162452B5FBE7C9EF9EEEC80FBEFBFDF0E3FFC703BE9A4934C79CE9831C3097F51D2A2458BAC7EFDFA45C9C20A2BD037DD74930D1C38B0C85C8A647C3E4F46A0F3098AC3C22170C71D77B851D7A9A79E9A542909EAC5175FEC8443CF2B9E7BEE392B5BB6AC1BDDEA77B972E56CF3E6CDF6F0C30FDBFAF5EBEDAEBBEE7202DFAA552BEBD6AD9BFDE52F7F7102B66DDB36AB51A386F5EDDBD78DA03552DBBA75AB13CB7FFDEB5F39406A04BD2381D6B923478E74E75F79E5953662C40827E283070F769FA9CC7DF6D9C724DACF3CF38C4978E6CF9F6FFBEDB79FDD77DF7DF6EAABAF5AD3A64D4DA3DECB2EBBCCD925FBAA54A9E28E57521DDF7BEF3D67DB01071C601D3B76B47DF7DD37C946E5D5BA75EB1CA22C5E5DBA74B1CCCC4CFBEEBBEFEC85175E70769D7BEEB956A95225AB5BB7AEF5E8D1C3A64D9BE67E2BA903515D2FB9E4127BEAA9A71CD7E1C387DBCC9933DD685A9DC9A04183ECDB6FBFB5FEFDFB5BF5EAD5DDDDCD9D77DE99835BA2402B5FD5F5ABAFBE72C7457720BD7AF572EC656BDBB66DEDC71F7FB42953A6381FAB8356C7F3873FFCC1715CBD7AB5FDE94F7FB2430E39C4EEB9E71EEBDCB9B3F3B1923AA9264D9AB8BF2FBAE8225737B50171555B12C70F3EF8C0B50F7D76F4D147DBFFFEF73FBBFBEEBB5D5B58BC78B1F3654113025D50621C1F0481010306D8279F7CE244FA8A2BAE7075BAFAEAAB9DF84A2474B10E1B36CC6EBDF5D6A4FA5E78E185EE62DCB871A31364DDFA2B49602444895315A9236809EA934F3E99E3D65A02AD119DC44249827AE491473AE1FDEB5FFF6AFA5E2226018B047ADCB8714E647EF7BBDF25D9973882D6744724D0BFFFFDEFEDC5175F74236FD557222FE1934D4F3FFDB4CBE3EF7FFFBB9D76DA6939045ADF492C35724EE475DD75D7D99021435C7D366DDA6462DAAF5F3F27D012612589A3044DE2A4CE4CE22BD1534728811647899FCE4B4C3A479CA34EA45DBB76D6B061C3A46352055A9D9F3A9A7FFCE31F6E0AA359B366AE43489D2EDAD9085A763DFBECB34EA035FD251157DD24DC8F3CF288ABA33A4EE51D2509F5D0A143ED965B6EC916707580127E7D5EB972E5425F330874A1D171620804341FA90B5BA3535DCCA973BB8F3FFEB89BA3D6A8F3DA6BAF35895224D0121A898B92845DA3494D3F442955A06FB8E1062750A9F3AEB98DA0958FA663F6DA6B2FD3DCB35224D01AA15E70C1056E54DCBD7B7737F255CA4DA0BB76ED9A3D7A57672091AE55AB961B753FF0C003EEDC51A346B9BB81D41174A29F5F7FFD75577F3153F9E2122509B538260AB4BE133795A10E43234B8DF023811E3F7EBCEB104F3CF1C4A4E6A40E45A367A568547AFCF1C7EF54A0D529A8037AE79D77DCB99AC67AEDB5D74C3EDC73CF3D9DC0EAFB4481163FD5435C0F3DF450676B24D09A27DF7BEFBD5D99E2A539F3D4BAE93BDD81A8038DA6927497F2C4134FB8CEE2FCF3CF7777130F3EF8A01B7517342509F48A152B0A7A7EEC8FAF59B366B68D2CB38BBDBB4AC4405D94D11CAEFED645A751D68E2E3E19A4D153345296D0E902D6C82F51A0256E8D1B37B6A38E3AAAD8047AE5CA95EE81E082050B5C99128044818E0A927D9AB691E01654A0AFBAEA2A37E25492A81C77DC7139043A91978E8B38258EBE131D97CA517717CB972F777724D1C83A12E82FBFFCD23EFCF043BBFCF2CB937CAF291189FDCE52EA087A47021D9DAFBB113DDC9458270AB446BAA79C724AB678268EA07724D0EA841F7BECB1A48E4953195F7FFD758E29B344DB773492CF4F6367049D1F4A1C1314014D4348A0759BFAE9A79F5A8B162DECFAEBAF3789C5983163DCADAAA62B340570F0C107BB51902EE4F7DF7FDF4D03E86FDDBA270AB4FED7ADAF4445F3AABAF5BFEDB6DB925671147404AD919D845923F11B6FBCD11E7DF4D16C81D6A84DA3448D4835BAD3E850237309811E786A24F8CA2BAF644F71E43682D67CA9EE10347DA0FAA803481D41EB7B7548E2356BD62C97A718CD9933C79521E19B3A75AABBFB10AF548196C06B6AA8418306D9771C91408B95F86A84A9C194F8AA3CB1D31CB0E67755374D3FE9D8C49497406BCA481DAB58687A46D342EAC8F46C60B7DD76B34E9D3AB9ECD4396B8E5BD31AB367CF767712FA7B4702BD66CD1AD3BCB63A1BCD93FFF4D34FCE07AA836C974F7497A472C4453C357216FFA8732AC8C58440178416C7064340A2118D0C135744E4F6B90458B7F089A3C9E8B34428FA4C295AC29578CC8E8E8FCE8DCE8BFE8F1E2CA6E69398C78E6C8D3E8B6C557EAA5FEA798975D677FAFFF9E79FCF758AA320BC72E3A232A272538F49E526BB732B3362A4EF73AB5FF4799447A24FF4775467D993CA2CFA2C9551E2B2BCC4F3537D987A5C6AD905B9887208B4EA9CCB0A9E82E41BCB6399E288A55B302A8D04BEFFFE7BB70A4349A358CD67EF8A35E169ACA2D74527BFD57BCA3CFB79F3561BF4EE37B6E8F693AC42D9F82FE42E087D04BA20B438B63410D0148FE6A0B50C4C73CA5AB5408A0F812481DEEFBEB76CDEAD27DADC656B6DF9BA4DD6A151AD6C4B35EFA6B58BBA1DF8F9E79FDD7C979EAEEAC185FED71A51CD95699E48437CFDAF792B3DDD3EF3CC33DDFCD5860D1BDC13CDE8964BE72B1F2D458916E9EB182D4BC9CACA72652B1FDD4E285F7DA627A32A4FF9143421D00525C6F11080403A092409F4B275599679EF5B6EE4BCB65FF222FEFFFEF7BF6ECDA5567AE81648B743BA356AD4A8917B70102D44D7F21BED12FAF39FFFEC045A02ABA7B4126309ADD66E6A82FEDD77DF75EB0CA3759C9AFF6ADEBCB95B485EAF5E3DB714470F1E162E5CE8167A6B725E1D8496BAA84CED642AE80E29043A9D4D8DB22100818212C831073D78F2377663BB4656B64CF256D28F3EFAC8B4665473547ADAAADD387AEABDFFFEFBDBAA55ABDCAD919E324BBCAB55AB66679C7186136889A8D6251E73CC316ED1BD9ED06A6792D639EA69B046D37A1A3B77EE5CF7A45A4F40F53B9A84D712966FBEF9C68DC0C78E1DEB9E866A81BBF2296842A00B4A8CE321008174126015473AE95336042000819D1040A0691E10800004624A00818EA963300B021080409240EB619E7611E9815ED5AA55DDAA0B45A8D2CE2B45ABD2C339C50DD04A0AFDE8819EE20468894EB49632CE4813E7A065BB7E14C12BAE49DB47B5C32BBF3173B5253835A04C71D74DCF066457F4FC20357FADB4D143E01DA52FBEF8C27D9C177305A7513E7A9641824069269043A015C54B1787045A1788566868CBA9B6BE2ACA96B636EA619DF6FD2B5A93A27D69F585B66E6AC5469C53A2402B8297D67D6A758A02A2E83BD5574B04B536F484134EB037DF7CD33DEC548018EDC157D272430544D777A79F7EBAE3A3285D8A68250E7A98AACF274C98E0E232A8E3D203506D1356795A8AA82DA75A7AA80032DA22AA73B42A45DCF5E0554161B49450F10B74BEECD183586DADD5F2426DCFD59662F1D7AA16D9A6F2E4336D6955D017C517506C051DA380318A52A687B68A68A6E3B5ED542124D5E1469D5594AF1E048B83DA42547785AE94CDEAC4552F7D2F16DAD6AB108FB25D11D8548602E8285E81F251EC03D910EDCA52E7AFB6A4B815F3E6CD73211915874151DEB41D58E2AE87C962A8F08DF2C3C71F7FEC98C8663DA056601D715084340D22947F648B56FE6820A1BCB5C5560F97359810BFDC82DCC7B9CD625BE926B04381D6084617A72E420984566A684FBB02AB68B99B0446610725D4DAAFAE2577DABB1EF7942AD08A9DA00B5D9F6B59A04687AAAF56986894A7D082123D8D18A3D0870A5EA33B0A45175327A52581BA8B9050EB78E5276E123EDD7D28908D045AE22D6E1268C54A50BE1220899AA25F291E80BED77A6F2D558CB69B6A1DB946C5B251DFC907EA10140B41211915E376E9D2A556BB766D17E74002267193684ABC155652F629C9A75A65235BF5B7444CC2AAF8B75AF2A8E03CB7DF7EBBF3E9C9279FECCE579C07896A62E72B51543D141FE188238E308582D49D978454E2AD7C159F409D85CA57A84A89A692F252A728A6EA84541FD9AFF8063A473131D41189AB96574AB83540500728C1958D8A4FA1A872126889BA56F928EA9B96668AAD6C136FD55BAB8DD4F12AB2596A2C87B8B757EC8340A99D837EFBEDB75DE42E2509A20276FFF2CB2FEE7F858CD4F240ADD5960068599F8443499D9136D548B0156C45AF4D9238456BC1B5D450EBB5D5C9693427B1D4765A8D5C25D61A792B088C924675FA91B84AACD5112A088EEE46D459A82C95AB7325E8DAC0A3602E2A5F1D66B4645122A7202D0AE7A8BC14B94B235B8DD015B92B8A0D106D02529017E529115647A20E401D93469A2A53C165F4B7C4508163947F9487EEA0C44382AA0D462A471D8C6C175309B6045165EB188D86B56C32124789A7363B296F754AB249DFAB23126BD92F5E1AEDAACE9A5A93C8EA0E409D8B3A27F9450CC54A62AF3A8ABBEE7634D2572C604DA768E9A78ED19D8882EE48F44910F08940A915E8743849C2A48D373ECCD7EF4A3E1A592BD29846DAD1C87A579647DE10F0950002EDABE7B01B0210089E00021DBC8BA9200420E02B812481D6DB8D434B9A138D125BBD43F32EF58140D804184187ED5F6A070108784C0081F6D879980E0108844D2087406FD9BA2D4724BB501030C5118A27A907044A07812481EE39E633BBEC884CEB39FA539B78651BDBBDE26F3B03B53C4C6B59A34D0F05C1A3B5BE5A179CDB6BC7B55141AF454F4DDAD4A06DE4DA2451987253F343A00BE2358E850004D24D2049A05B0E996C1F5E7B8C8D9EB3D89AD6AE6A87D5AF9E6D9F3621684BB43674BCF5D65B6E1DAB767069E75C93264DDCAE3AED0C536C676D858E5E63AF0CB4A9429B34B449415B87B5414431A2B57B4DDB8CB541449B0824A0DAC1A7EDCEDAFAACA4E3B56B51C768A79A369068D384DE1E2C9BF45D7E13029D5F521C070108C481409240676DDE6AD5FBBE69D52A94B31FFB9E92649FC4308AB52031D63666C544D0AE31EDECD2E60BC53DE8D7AF9F7B8DBD624F68C79BB6DF2A69E7DAFCF9F3DD2E37ED4CD3CE33E5A11D631264C5F950BC05ED3E53D20EB448A0B56B4C82AF2DC5DA55A6D1B4768C699BF2C08103F3FD6615043A0E4D0E1B200081FC12C831073DEEABE5764AD33A39CED7565C05B2D1765C05C351901B05F151DC0AFDFEECB3CFDCD65AC54E50AC0A1DAF2DC31AED8E1933C68DB425E8C3860D7379286684A63624D08AE9A1EDD2DA82AC91B93A03C583508A5EB5A511B7B6F00E1F3EDC89BB5E95A500398A0791DF8440E79714C74100027120E0C52A0E6D9196786B34AED80C0D1A3428143B04BA50D8380902104813012F04BAB8D820D0C545927C20008192208040970465CA80000420500802087421A0710A0420008192209024D05A8D115A5200F72831C5119A77A90F04C226C0083A6CFF523B0840C0630208B4C7CEC3740840206C023904FAF365EBDC16EFFAD52B065773A638827369A12BA477362686A22D74469C586402DA613C69D2246BD5AA5591F30A2D8324813EFFB9E976EFA9CD6DC0C4AFECDE8ECDAD5EB5DD5C7DB50E596F6B563C0DBD2F4E2F19CD2D45AF338A2328043A8E5E29799BF47670BDC19C142F027AB72529994092401FF3E8549B70456B7BE4FDF9767AF37AB67FED2AD9476B37A0E26668B38876F4DD7DF7DDEEA5A3EAF524E07ABF5CE3C68DDD4E42357E8D50264E9CE8DE7EADB73A77EBD6CDBD9C349D09814E27FDF894ADB795472105E263159620D039DB4092402BD468D53E6F58A39A556C4EAF0E49474B7815284923E9050B16B8DF3D7AF4703137B4055CAB2514752E12E8112346B8A0491A711F76D8616E6BB8822AA53321D0E9A41F9FB211E8F4FA42033D4D6B282546B144A0F310687DFDE5F275D6AC4ED51C476A7A4391E4A2ADD653A74E75C18BF47AFBAD5BB7BAC8744AD3A64D73236AFD2F2197384BC4EBD4A9136B815610A7281CAA22E7A90E152A54C8C1418D28B7F94B71C8C8C870771AAA2F299E0410E8F4FA4561841F78E00177579D18461881CE8740EF0AD729EA9C46D9E94E3B1B417FF2C9272E509342A67EF4D1473674E8501B356A9475E9D2C545E8D38FEE10F4604902AC8EEACA2BAF74C7D4AE5DDBFAF4E9636BD6ACB19B6FBED956AF5EED824029ACEA8409135C1C6DDD3D2C5AB4C83A75EAE442A516477CEB74F3F4B57C043AFD9E9348EB7A4A4C08749A043AFDCDE1570B7626D01A358F1B37CECDAF2BEEB446FE125AFDADBB028535BDE79E7B5C4C6C8DB6155255E2AC39F6D1A347DBE0C1839D40EB2EE3F2CB2FB7962D5BDADCB973DD485A3FB366CD722155DBB66DEBEE3C24DAA4F41040A0D3C33DAF52116804DAAA57FFED25048938D6AD5B6755AB5635FDD6685F3DBC42A4469FAF5FBFDE854ED58FA63F3495A1E334E2D6D446E5CA95DDE74AFA4CC72969AE4DC7EA1889B7460D3A0E81CEEB72DD75DF23D0BB8E6D517246A011E85C05BA280D8B73FD228040C7D35F08741E02FDF9E79FC7D37345B0AA79F3E6D967B38AA30820033A15818EA733116846D08CA0E3796D96A8557A5D5AD7AE5D4BB44C0ACB9B00028D4023D0795F27A5E288993367DAA1871E5A2AEA1AF74AEA398D5651E93576A464023962716CDDB6CDCA646404C989298E20DD4AA520102C812481DEB465AB55EBF3A6952B9361EBFB774AAAF4800103AC7EFDFAD6BD7BF7A4CFB5A350EB86F5C66FAD6448779AB772832D5F97654767D6B08E8F7F6063BBFF168005814EB777281F021028088124815E9BB5D9F61F34C9BAB5CCB4FB3BFDF6704D19EA4DDB999999F6D34F3F3941AE56AD9A7BBBB7DEE67DDE79E7B92D9B5AEF3B64C8103BEDB4D35C5C8E74A5E3864FB30FBF5F651B523A19043A5D1EA15C0840A030049204FADC673EB6D7BE58EAF259D0FBC4EC687691406B67DC871F7E68471F7DB4CD9933C7962C59628D1A35729B37B4A9A366CD9A367EFC78B79EF898638E298C3DBBF41C047A97E225730840A098092409F4D2B559D6E6D129B677F54AF6CE556DAC4CC254B476DA69A345F43BDA8CA10D17FAD1E60B4DF62B66876258A46EE32C66BB0B951D025D286C9C040108A489006F544913788A85000420901701043A2F427C0F010840204D0410E83481A75808400002791140A0F322C4F710800004D2442049A0B5842EB454AB56ADEC2AF1903034EF521F08844D801174D8FEA576108080C70410688F9D87E9108040D80410E8B0FD4BED2000018F092409F4DC656BADDDA3536DFDA62D967577E7A46AE98D20F3E6CDCB7EF16BF4A691E820C5924E8CBD9C2E265FFDB8DE662E5A6D671D54CF0E1BF2AECDED751C73D0E972468CCBCDEDC5BF313679A7A6E9FA9C346992DBE54B0A87409240EFF697D76DD59D1DEDFFC67E6EB316AFB1B7AF6C935DD3912347BAD7405D70C1056E3BB7760F2E5CB8D06DF1AE57AF9E6B18DA45F8EDB7DFDAF1C71FEF5E1795AE74F5E84F6DE4CC1F6CF55DA72699C043C27479245EE5BEFCF2CB76D96597C5CBA862B266D5AA55BC4EAD9858C6219B24819EB374AD1DF9F07BA690A3A923E80F3EF8C045B3D3BBF6147B63ECD8B1AE2128AEEED9679FEDEA2281D68B5157AC58E1E272C42D21D071F3487AEC09F98D2A08747ADAD4AE2A9539E85D45967C634B200481D69258DDD12A068EEE60A38440C7B6D915CA30047A3BB665CB9659DDBA757340D4DC5EF486EEC42F57AE5CE90247EDE89CC48B456F11E72DDE856A9BBBECA44481966F468D1A65CD9A35B3962D5BBA32A74D9B666DDAFC36BD976A885ECD3479F2646BDDBAF50EEF14259CB9050BD3F4E082050BAC478F1EEE6DEF854D0A4C3678F060EBD2A58B356CD810812E2CC8989F87406F77905EB973F8E187DB4D37DD6477DC71875D77DD75F6ECB3CF9A2EE68B2FBED8CD59F6EEDDDB1E7CF0417BFAE9A79DE8CE9A35CB5E7AE92517BD4FF3F11D3B76B42953A658BB76EDEC9C73CEB15EBD7A59DFBE7DDD05F9C4134FD825975C62F7DD779F2B51F9DE7AEBAD2EEFB66DDBC6BC9984655EEA085A7E79ECB1C7AC7FFFFEB6DF7EFBB90EB943870E56A3460D173AF79B6FBE7142AC51AB845CBE97303EFFFCF3EE554DEFBCF38EA983EFD3A78F55AC58D1962E5DEA62A32F5FBEDCBD624D0FD4D5564E3EF9640772F6ECD9A629C3134E38C11DDBA2450B77AC3A7DC55DBFF1C61BF3055C22AD69C6C4C4083A5FE8BC390881DEEE2A8D86C78D1BE72ECADAB56BBBF9F69E3D7BDAD0A143DDC525D11D346890B56FDFDE5AB5FAF52D2DFA5C6F94C9CACA7217982E565D987AD79D1E940E1C38D0162D5AE4E6E875BE8ED7C5AFEFDF7BEF3DF7D203AD7C89C39B68BC69B1C56068EA085A235EBD68425305F2D58B2FBEE844531DB646B9EBD7AF77A176F500BC69D3A6B661C306F7105C3E9460EB6F75C037DC70838D1831C2BA75EB961D9637BA03D36F897724D0071F7CB0EBA40F39E410F7807DC68C19EED98EF292A8173621D0852517CFF310E8ED7E89960DEA628C045331AFA38B4A17A5DE2023418E56A8E8C2D6C3D2CE9D3BDB6BAFBD66A79F7E7A763C6C65AB63A3F3D5014471B3A3DB5F95A9D1B77E482547202E73D01A317FF9E597D91D7E711040A08B83627CF240A0E3E30B2C2921027111E85D515D047A57504D5F9E0874FAD853729A0820D069024FB10526804017181927F84EE0D5575FB5AE5DBBFA5E8D1DDACF083A2CB72609F49AACCDF6F58FEB6DF3D66D7674E61E61D5D4CCD8A8129C4B0B5D216DB0D283C050921E424E9F3E9DADDEA138747B3D92047ACCDC2576EC7EB5ACDE80F1493B09B5AC68F1E2C5A6DE590F35F424FBEBAFBF764FB9B506533B07F5E4398E2F8A4DF417021D58EBA53A10089C40BE045A0C860F1FEE56253468D0C01A376EEC461FC3860DB3ABAFBE3A5BA0759C845B4BCEB4A44CAB21B49E54C22D01D78A06C54190A05F7FFDF5258E16812E71E4140801081481409240BFFAF952B7CCDFC7480000071A4944415408FFBCE7A6E788C53171E24427CE5A642F81D6FACD175E78C1054F8A46D0D10E2A6DF0D0C27EDD76299D71C6192E129ED608FFE73FFF71427FD5555715C1ECC29D8A40178E1B67410002E92190E321E1A62DBF8A6A85B2658A649176D669E386C4392E09818E8B27B0030210C80F015671E48712C740000210480301043A0DD02912021080407E0820D0F9A1C43110800004D24000814E03748A84000420901F0208747E28710C04200081341040A0D3009D2221000108E48700029D1F4A1C03010840200D0410E83440A74808400002F92180406FA7B4CFBD136DE32F5BF2C3AC588E295726C396DE7E52B1E44526108040980410E8ED7EADD56F7C897BF8F5CB8EB2560D6A9478B914080108F8410081CEA740972F9B61B7B46F6CF74F9E67BF6CDF0E5F5417BFD2ED486BBB6FCDA266C3F9108040A00410E87C0A7493DA556C5DD6665BB236CB9DD1B375436BD3A0862D58B5D1AAED56CE9AD4AA62F5AAEE66173D3FC3BA1F9969FBD6A8EC824EED2C21D0815E55540B02C5440081CEA74047BC1BD6A8640B566EB4DE1D1ADB8C456BAC53B3BA56AB72799BB36CAD8D9AB9D8F6D9A3A2CD5AB4C6F4F283BC12029D1721BE8740E9268040E753A035C571418BFA3672D622EBD2A2BE7DBA648DD5AE52C1366CDA6295CA97B5951B7FB1792B3658950A656DF9BA4DD6B1591D7BFD8B658CA04BF7F545ED2150240208743E05BA489473399911F4AEA04A9E10088700029D4681FEA0675BDBBF7695705A13358100048A950002BD1DE7D8AF96DBA52FCC742FCC2D8934E0E466764DAB86255114654000029E1240A03D751C66430002E11340A0C3F731358400043C2580407BEA38CC860004C227804087EF636A080108784A0081F6D471980D0108844F00810EDFC7D4100210F0940002EDA9E3301B0210089F00021DBE8FA9210420E0290104DA53C761360420103E01043A7C1F53430840C0530208B4A78EC36C0840207C020874F83EA686108080A70410684F1D87D9108040F80410E8F07D4C0D2100014F0920D09E3A0EB3210081F00920D0E1FB981A4200029E1240A03D751C66430002E11340A0C3F731358400043C2580407BEA38CC860004C227804087EF636A080108784A0081F6D471980D0108844F00810EDFC7D4100210F0940002EDA9E3301B0210089F00021DBE8FA9210420E0290104DA53C761360420103E01043A7C1F53430840C0530208B4A78EC36C0840207C020874F83EA686108080A70410684F1D87D9108040F80410E8F07D4C0D2100014F0920D09E3A0EB3210081F00920D0E1FB981A4200029E1240A03D751C66430002E11340A0C3F731358400043C2580407BEA38CC860004C227804087EF636A080108784A0081F6D471980D0108844F00810EDFC7D4100210F0940002EDA9E3301B0210089F00021DBE8FA9210420E0290104DA53C761360420103E01043A7C1F53430840C05302199EDA8DD9108000048227804007EF622A080108F84A0081F6D573D80D0108044F00810EDEC554100210F0950002EDABE7B01B0210089E00021DBC8BA9200420E02B0104DA57CF61370420103C01043A781753410840C0570208B4AF9EC36E08402078020874F02EA682108080AF0410685F3D87DD108040F00410E8E05D4C052100015F0920D0BE7A0EBB210081E00920D0C1BB980A420002BE1240A07DF51C76430002C11340A0837731158400047C258040FBEA39EC8600048227804007EF622A080108F84A0081F6D573D80D0108044F00810EDEC554100210F0950002EDABE7B01B0210089E00021DBC8BA9200420E02B0104DA57CF61370420103C01043A781753410840C0570208B4AF9EC36E08402078020874F02EA682108080AF0410685F3D87DD108040F00410E8E05D4C052100015F0920D0BE7A0EBB210081E00920D0C1BB980A420002BE1240A07DF51C76430002C11340A0837731158400047C258040FBEA39EC8600048227804007EF622A080108F84A0081F6D573D80D0108044F00810EDEC554100210F0950002EDABE7B01B0210089E00021DBC8BA9200420E02B0104DA57CF61370420103C01043A781753410840C0570208B4AF9EC36E08402078020874F02EA682108080AF0410685F3D87DD108040F00410E8E05D4C052100015F0920D0BE7A0EBB210081E00920D0C1BB980A420002BE1240A07DF51C76430002C11340A0837731158400047C258040FBEA39EC8600048227804007EF622A080108F84A0081F6D573D80D0108044F00810EDEC554100210F0950002EDABE7B01B0210089E00021DBC8BA9200420E02B0104DA57CF61370420103C01043A781753410840C0570208B4AF9EC36E08402078020874F02EA682108080AF0410685F3D87DD108040F00410E8E05D4C052100015F0920D0BE7A0EBB210081E00920D0C1BB980A420002BE1240A07DF51C76430002C11340A0837731158400047C258040FBEA39EC8600048227804007EF622A080108F84A0081F6D573D80D0108044F00810EDEC554100210F0950002EDABE7B01B0210089EC0FF036DA3CE30CB0602C40000000049454E44AE426082 WHERE `app_id` = '6';
+UPDATE  `fn_app` SET  `thumbnail` = 0x89504E470D0A1A0A0000000D49484452000001680000012C0806000000EE2C29AF0000200049444154785EECBD07985C57952DBC6EA8D039A8BBA556CE39675996836C30C1806D8CC3100C0C434E33FC93FE6F12330FFE37BC37A4218C8D033080C1D8B2B171002CE728DBB2AC9C73ABA33AA7AA9BFE6FED734FD555BB2575CB92BB35AA82B6BAAB6EDD7BEEB9E7ACB3CFDA6BEF6D60885EB13BB6073E4C78A601D83E0CCF80E9039E11C0924F4C38A605C08411F80810C0E04F60008105183E8C20800F1B811CE7C30ABAE103088C5878570E10F8308C52048103580E3F95FFCB8FC1D358300C1B3E7A6106162C1FF00D0F401C7E1043607A809196F3C5DD243C38F0631E0CDF542D32B21D18F7D2181D0FD0DCE3A0335688C0F0D91898B0E049CB72AF5C0FE47AE0BCEC814F4E8BCCF4B7EF0E86E4A2BC3DEB8E1D816F98080C8B180CD333041C5D9320EC0B180B780BC01134F93E60868818185E088E1602D84040E07541ACF67D82B70D83C7C04760E409221B410AA6C177D4790358847F04BE8FC0F678115881058FE00F0B084C48A39046E073E1C8938522301CB05582F37D007AC594B17863CF0174984918310B81C7EB5AF009D6B957AE07723D707EF6C00507D077ED0994B54B20B4607A81401E41CF277ED29C860F33A02D6DC0353CB19E2DDF80011FAEE9211073D704021BB012804760766897C33613083C176EE0C2B763E0B74CCF4310A441FBDA342C3866026EE0C13003048101C3A4B51E082E7391E0F9D4EF2E2C0B705C1B26AD737E66A8B6F605E825134661EBBE43E88C17CA31B2BCF8862C30B957AE07723D709EF6C08506D0B8636F209C062D509F904900239DC0F76833F3C785E959423D109079A8007400B8B68BC052562F7C521C363F15F0B682344A3C179E6DA1DB00D201298B18EC208698E7A0DC74916701C71C07BDB6095AF2088A60F2DA6E1B4ACC143C33819E20015FAC765740BF302F0F1DDD2E3C338EA02F400740C24B63F954654177DAF9F0030F961583EF04C2CAE45EB91EC8F5C079DA03171A401B77EE0DC44A3600D315A2412C66E16D058A099C81B2A005A05DB1A04DDF16ABD5176ED8156A83C7D0A8B52C1BBEE7213FDD897F7CD72CECAC69C1833B8EA1CD8EC3430249C7C3F25185583C65040A8A93D8B87B1F5ED8D78AF678114CBF105ED08B3CEF383E75D12404AE8D751B0EA0D1CC9376CC1D5F85E5E392B8FF89ED684B94C3336815472CE810A0974D1983CD7B0EA03B5E048F0B0E2DF31CC5719ECECA5CB3733D10F6C08506D0E65D7B03D9F6FB2E92A91412AE0BC37709D1300D039E69A33399079871F537795F3AF482187C43CC6E18A055EDC3F0153D625806E0A430A3D0C66D37CEC6EE3A17DF796403F69AC5E8461CC54E37FECF876662FD935B51D3DA814F5FB702FFF2DB6D386C16C30C12308C1E94FA4DF8F92DABD1D191C6771FD880D7508E1E04B87CD6447C6806F0EFBF7C0DC70A47C1A3639100CDE7C7E644007ACB9E83CA82A62F53AD26390E3A37D3733D703EF7C08506D0C69DFB02C3F061B91DB87EE1447C607A12493FA43C60A0C907BEF8EB6D48E5952A879E410B9A0EC198B01F34B44DF2C5A44108944100C3F451D8D3822F5D371F9D0D298CF4DAB1E18D8378AAA7046DF142E4F5B6E03F6E988D679FDF85E30EF0CE55D3F09FBFDF8966BB04DDBE8DB8D786F72D9D808B475968D95F83DADE387EBEAF13A9781CABA78CC34D734DFCEB2FDF406D4925FC8056FF89009D24C531798CA2386205F0CC502A22FC46CE49783ECFCF5CDB2FF01EB820011A2E926E07D6541978D7F42A24D38E58A49669615F0B70EBF63AB4E79522F0E96A235D403504019AD486098B5237D3814FE7A049D43630D36CC7D7AF998D6FDEF53CD6CCAAC6D4C9A3F1CF8FED423A9EC09462139F5A568D31234660774D1DEEDB741C134795A0B327C0B3C73A5062B4E11BD72FC06F1FDA85D18934DEB17629BE74CFAB688F2570F1ACA9F8B39906BEFEAB4DA82926C511CFF21B94EB690E3A07D017F84CCEDDFEFFC81EB8D0009A4E42133E4A8C1EACAE32B176E22824BB7B94751C98A8F312F8DE6B7BD156504ED20326A570E49A058809D0593DB472345222E7E183D3F270CBF2B1787C73272A8A63583831894FDFF512F2E301FEF2BD73F1E853DB5196CCC33B574DC2FF7E602B6EBC74165E7861135E748BB1A03A1F7FF38E69F8E3B66E94DA1E2E9E5E847FFAFD4E6C6F6AC392393370F3AC18FEBF5FBD82C3A5A3E0D2B1498947487110A069412FCB01F4FFC8F999BBA90BBC072E348026C54180B67BDBB1B02885198900452E19683A0A2DB4D97978E4B88FD6781160DB80A7647614AE09BF21AF501A2194878702A7079FBB680CBCC656EC74E2703D0FEF5E361ABBF7772375EC20AEBC7401BEF6D327E0C48A307F7415FEDFF74EC08EDA1EDCF6E8661C0EE2F8C8CA3128F55CBCDE6AA327D58B8B168C4071CCC0F7EF790533172CC64DB34DFCEB2F5E464DE928F8A0059D03E80B7CDAE66EFF42E9810B0EA07FB22730292EF6525834A104B3CA02C425C084BA3603DD00EEDBD482B49D0CB5C62AFC4F685D58E24C14AC0EE2C243C7D18D2956376E79E732DCF3E04B38E459481BC09C71D5F8E2CA52DCF7C0ABF8C88756E1972F1EC09EC3CD9834B202372C9F80E3AD1D787CCB51EC69E9C547AE5E82471F79053BD27948DB0646C55D7CF3BA79F8D6BDAFA37CEA1C5C37DBC437EE7E1D35855514F385DEC1302231624153C5D191E3A02F94A99BBBCF0BA1072E34808EDDBE27F04C133E290BAF17063D7D0C27F13D188CF6A36ECE64F0099D7F2A1E4549EA18319854E1D8B4A4FDB83807E35E2B568DB23179CC48FC7E43233A8D387A6D2096EEC0D7AF5F80C79FD88DCE542FAEBF72018A933D38DA968747D6BF84CAA23CBCFBB269F8D5639BB17CD542FCEEF1FDA8B31370AD00899E66FCD5958BB0E9600D9A8D625C3E2B0FB73DB015C7F347844A122E126AE1202D93F05CAC985CAD22094F00E8210BD8BC10A64EEE1E733D70CA1EC838F3DF4A3F5D68006DDFB93BA096382030D3720E3B2FC848E818C742EE42E91FC8430B102A37621873187E28A1D92E980B8324B66B508A6781E7A2742FCFEB45400588C148C4B45CCF372D04760CA6EF21F01C04B6054334D631A419BC627A30036AAA1DC633226D9960C60ECAEBA8A90E2CB6818B890B33F0256F47CC0BB0724A15B6ECDE8F365AFE565CC2C8E9C00CE30E33923CCD5D2B9D5E56AAF7B6FC2E1709E999B7326873DFCDF5C030E881306A22D3121D49A1A61583D0B29B5D9D868754EAA0E6DAC7A70F899535241765C7C4EED81DB80468432549A29E99FF95FC1BFC8D099328A313ADB10693FEC2A5255387EA6C5AD71AEF088AF2A7B26E331992784265ACCB7F1470F2453D3503C2B968D007A93E31E53D15B0A871548E91187057A21DD9F62088C3F2022C9F320ADBF6EC41A74D999D5296A85BCB2C412138EAA112695BB808A9B69EC3F7A3F1E9C36082E59A90EB81B7DC0382137A471BCE1D0689454E1C450FF5FEC0E760F0C90B0CA0AD9FEC09486FD026D6C9914817303B9DB29409D04C76C46394F0596F5574E72A1863C225E6D208D986307824F30004A54F0468D229D44DCB47C46B02A92070F8C0981F247CD14A968304D4A87D563942C43A97DFD946BE6CD85E80A533C663C7AE3DE8B26C3812B26E48DE0F394D36895EEEF7AC5113357072BF67C65D6843E4C64C76777D8A3123D3F364E6667497AA0DB830E422625C9F72EC059F9A3A24C6EC905C947D14BF9DE9466D655932C844108C16B30268041E83BD43EB59BFA71D837AB50C019ADF531F85917D2A039E4A51AAED5EF594C4FA0DFF27A02B80CE4522C858C9729CB678FB18ED593E2B4C7F4ADAC38C096D62071EE22EF9730F6ECC80CB044EC2ABD3F9990D6A1916BF2B376B9FDE191E0C4C9433CCFD9E7B46031A0394E09E04CD749EB2BED6B48E021EC87C743E357348B072482ECA21F79947360741600B0093C755004DDB9499E708148C1CE47B613AD113D6515ACBA1C9ACE90BD2256F829B28ED116E77C23BEEBBA82A4E4A511C4C0DAAC19DD18BEAA532D86552D88905CDBF0DB826179010A07D0B0101DAF4E1584C830AD8F2B5E1144918AE6619888EEC0373BFE67AE07CEC012D79157A347B030AB4B5A1161AD9326D355E0CEC666F7DEFDC21C1CA21B928BBE468437DC034A1CCC96C48427CE50A0C100F1D810467460F12FC420B3AD397CA7A95ED89847B872C44F421F101841CB402DE88234EACE390E2D0DF059D824C37CABC195E98EE34900C784C454AA7A1247292AD912116B6D26573E556ADE1596D9FE70D44A2CD2C7A261354BB014C72EBC326E5A81EC1391B3AB76738FFC7809A7959287B33EFAC8C394E3FF9119FD2E09CE463AB2A87042B87E4A2C4C48686BAC0800DCFF560C74DF801415A25161238A5152BD55068851204C9F512E8C284FC3C4A142012DA0293923D2AEF0498D5DF1E734CD3E127CB6810FAE9A29FFBB06D0B8EE3C0B419ADC816510512A8A4FD868118131D312FB4654ACA53A63B65EA3CD30AD4F98D9858C75C4E4CCB86492589D0DEB4FC5D499D1A786A30B04D02DE62D8AB36EABF4FB68E6BAA458A1084F7D6F75C9A92899E5BBFA7AFA5CF23394B42FA46F52F171BB6435BF87A4868764E1DEF33EFAADC83B0392133C5CFB80352560AFB599D5FAF8619062B7C966AD154F711EE58C2C55203A5FA2CF4ADF242B218EABF436B48BEA317591FA66987FDA8DA1C6D83FE9D0BA5EF7B52CC41164DF514C2E3553F64CFA9EE2B7A8CFE5DB74DF56BC4F71B5E57F529FB246B04E8FB55FD1CED9FF31F1C55BF0C8884D004E439385E194C7CB6966872A99CA28748D178BA9795474815E890CA1EE177D41C50E3E664AFAAAAAA21C1CA21B9A802E84631482DCB82EB39A1EA4B292ED828710F1274D9971CD85234CA874DA0745D58026EA1A0261C1FC2251B047B72BE66F87D5FAEC187177DE907C2F76DDB0EF33EAB24FDCC96E79B74EE5196C7B25510758964D163651583B23A5AC774519AF0180169B3AC156BBB28BED90F3D906AA2EA89A9BA3B7A6D9EA3BF575F00EF0FDC4F046D0D646AA04601592D568A42E2FBBA5FE5186EF7C2C542FA2DDC1D084FAFC13C8223AC2C230BA506B030519538D043054E94DCE6F1A6C574B0A1FF20036491F7C3052BFA7DDDA610FAD5E409C1BDEF738CDE6FE6B3C8C8566D668E9750EE18AE3DD1C54A0177E439F5E1C0F4E4CD4CE4485BE4ECE1DF99059563532F466187B0CFA2D739291AE43E18540F48C2487892C387F357CF778E2731EBC4C7CFB91C3EA78867508F01CE8F53194C55179A055D57DB18D8E2C9736158317802684AB32103DB8E21CD20955072C7D54E56455AB3BE0268095C09C1978068D931B1F494354D8DB29A70323168E7FA1E62B1385CC79187C889AB141DB4D643558658C7363CC9FD41300E0364EC185CCE3926E1A7A8841699CB14A8016C2B297486944A0C5C59A12DEAB025FB5EE8AC147F647691E0ED3A4E5ADA9351E0458625277A2AE5A0BBBB53FED51699B678792FDA2A947543163B02B19BB11015C829CB512896701B28D63017C2D06AD0D6875A2CF46EC310508F8296E7F988C763B240F2A5813F0BFA6AC1E4B5FA82A6BE86B23C9555DE7711918537B298CA330AD5363CA70649DD2E35548213BE93DD3D850BA858CB6AB1E9BBC3E0F9F9D2A0291658E4FA5100EFBB28E8FBD08B9EFE9B6D8BC5380E15E0F3EFA88576B2730E0A9172079FD003B296DA406B4B3352DDDD2AC56F38E7619B70B9401BD9621F314B8D4FDF77C5382B2D2DC5B871E332464C7FDD7BC159D08D4DC703234823F0D212364DF506C19225AB3888E92CF4600B18FA6E0ABEAF26683C1693BA827C59EC685ABC0104E8BA7B52B0E3545410344DA452291414E4A3BBA757A80C9E3F9D72E4779ECB66B51306AA10944DD21A161C97F23E17F9090544298545D28E98D0C906528E02A2980124F84110834340E7B8487AF0520EE0D0824FC0E5CA1E33614921DAC82B00BA7B7A909797CC58B6D18F1558D8282E2E423CC66394E5AA64276A9B2C4669C60912EE1CD4D9B29CBB06655AFCB26884AED43E4E92701D525BC590EEE00E820B1FFF55DF535C3BFF16608B7CA61743B5D81134E937085B1D5E53CE935926420A20D3DA2CF5230C5164F1E079B860D242CA5AF9EA3EB58E5D6FB2A34CA48C2379B66A57A65E590A47EE295411292A253C5F8606D2540C0F0B7541E177C2BD5064039DDD4AABBE0C9F56781FB268CB82F0E696E6F0F6ADF70077D8FBF7EC456F57376C93735DE56B7768B0C46292972766C54451253B2A06A2596A47D3D4D484B973E62863EA2434C7C8CA5143C2360CC945F9381A1A8E072652ACDD8D96B66EBCFCCA265C71E51580DF83279F7C0A8B96AEC2BA071FC33BAEBC0C7F7CF4618C193D56B8E2B56B2FC7EF1F7C08EF79CF5528292941437D1DC68E9F80DFFEF65E2C5AB404E3274C806D5978E8A1DFC98ABA68D142CC9E3D179E949FB270C7ED77E283D75F879FDCFA137CF92B5F41617E3EEEBAEB4E5C73CDFBB06DEF11ECDE77185E570B16CD9B8E9EDE5E6CDA711485C545282B8CE38A4B57E057F7DC8F92CAB1E29C9C376B0AE6CE98863BEEFA3592B1189A5A1AB0F8921588053E1A0FD7E1D9173661E9CA155879D11294971487A0A90096A0D1D5D585BC3C16B415EEE14419A7800B50565E86782CAE060E9F56264C2A941646385C050A04500231690E8E38E59C543B095AF43AA827B4ECC39D48067043D0D3F487DAC22819627F0C9D962D4639BC13E899108F32D63AF7116C5BE4BAEABE14588A851969C389ECE6891249C5D084C79F009C272E1EAAFD2136862B9B8E57D256B87A04E174088FD17A790DEC72ADCC795431062E52C46EE5300EF97A2F14D9469F69664555EDE8F3B4DF3A425DE0672095B167D76EA47A7A90306D668808A94A139E01D8B1189C545A7C4C2AE59A32CCB8DBA9AFABC7FC05F305C44F068855552387042B87E4A21C4BF504E8202D72BACECE1EDC7AFB4FF1852F7C113DDDEDF8E5CF7F8A4FFCC567F1D9AFFE3DBEF4854F61FBA64DB8E5968FA1B7B717C5C5C5B8EDBF6EC5ACD933644BF29DEF7C170F3EF4206EBCF146DC76DBED48C61372CC876EB80E9FFFFCE7F0D24B1BF0F77FFFF7686B6F432291C4473FFA51FCAF7FFB377CE31BFF4BD21DFDEC673FC7273FF971FCDDDFFD2DEE7FF419BCEFDA0FA0C00AE0F7B6E181DFFD0ED5539660CD252BF1A95B3E8A1FFEC7D7B1EEE1F5F8D047FF0231C34251D2C30FBFF71D54544DC2B5D7BC176DEDC7F1D2E6ADB86AED25B05C1F1FB8EEE3B8F7FE5F4BAE10521EC2AF1B4CCCA7ACA9CEAE4EE4E7E56B7C3EC1132DD66710A0ACAC14764CC9F5387A3A3A3A919F9F8FCECE4E141515A2A7A71789784214267B76EFC6C44993D0DB93427979195A5A5A51565A2ADF7B62FD13B8F4B24BD1D3D38DFCFC027475F7A0AEEE18E2311B63C68C81EBD2C36A21DD9B4651713EDADA5A515A568AEEEE5E241209A19476EFDC81AA5155300C0BAFBFFE0656AC5C81BC645C38F6C3478EE0A9279FC6B8F1E370E9259728478CF84A2D74B4B763FFFEFD98BF6001DA5A5B656165FB3B3A3A6417316DDA34384EAFEC82FEF8C73F62ECB809983163067ABB7B108B5978FA99A731A27C04E6CC9D2FF7C26D69575727F2924901BAC71F7F1C6BAFB842EE2D954A63DBB66D72AFB4947A7B7A905F5080CE8E0E24F3F26457C5EFF5A65378E38D37B062D972A41D07896402DD9D5D28282C14ABF8D9679FC6D2C54B104F26A4C27BDA75B071E346CC9C395316D5981D83E7BAF258928904DA3B3B505458848E8E769494940AE7F4FC0B2F60F9CA1572EFCDCDCD58B972A5A2D5F8284FE27BB8C071F6F4B79F49FDA0EC15EDC1E1FE74F7EE3D6241C7E8A0374D89F1756C1A4E2DD87FF010C64F988251E52588B929E52B0AE7584B730BE6CD9B2B7320B348F76949E5C88A21C1CA21B9A800747D6D4085867472E0E0073FFE216EBCE923D8BA631F5AEA0FE103EFBD0A1FFDCB7FC4973FF3E7D8F0F493B8E683D7CB13193F763C366F7C03DB77EDC04BAFBC8C19D36760F1B225F8F6F7BE83471E78101DCD2DE84DA7F1C52F7F113DA914FEF33F7F805FFCE297F8CBBFFA2BE1993FF1F18FE39FFFE91F71FFBA7B5151568291D5A3F0FB071FC4BFFEF3D7F18B750FA12B0D5C71D1522C5D380D77DC711BCAC7CDC38A95CBF0E5CFFD396EFFCFEFE2CE9FFF0657BEEF7A246D0B13C68FC0873F7C23EEBDE731781E69985E58B142785E370A0BF2F1AEAB6EC4430FAD43DAE9128F7F945E601F747777CB64EF6F5088E45A00BA4C0089AFFBEFBF5F76115CA82A2A2AB075EB56F93E0166EEFCD9387AF4286AEBEAB16AC56AECD9B317A346560B20BDFFFDEFC1ED3FB91D9ED3231CF29871E371ACA10D89A4896993C760E32BAF61ECF8A978F0A13FE1C337FF19366FD980850B66A2A6AE160112686BEFC5A73EF111BCF0DC134249D5D4352330E258B56A15B80BDAB97337BA531EF61EAC4141320E27D581B815C7F4E9D3316FFE7CB1989F7DF6591C3B760CF3E7CFC7E6CD9B6551A81E3D5ADA77F1EA55D8B7730736BCF232521E29A17CF89E09279D42220EE425E2282C2CC5A1A37502DEFB0EEDC3DCD933F1EA8697F1FEABDF87DFAD5B878B2FBE1875F5F5282C2D41322F894B2FBD14F7DD732F46565662D7CE9D9831672E9E7EE619AC5DBB5680998B426343038E373763F1E2C502BEF3E7CD934569D1C205F8E177FF032525C5385A5B8BD56B2E456373336AEBEBB174C972ECDBBB17B66162D3C6D7B07CC9521CAB3D8645CB5760D78E9D183F6E1C1A1B1B71D38D37E06777FD0CD5532660DFDE7D98396D3ADEF5AEAB32522F4196219B7DA7C7C1E17384DEF1291F4A8FEF637F5D235CD29D4680A963AA4584CB8DE19E3D7BD0DDD589189DFE1C99664CEA91BEBA710BAA274CC52B7B0E62ED82C9981C4FC3A0892D34A925CF8BE3523BD2FBBBF70B8E836E68AA0B028F8E3A03899887471F7B04A61DC7FAA737E06B9FFB042ACB0AF0675FFD477CF50B9FC11FEF5F874BAF5C8B82C212CC9D33171D4D0DF8E92FEE466D731BFEEA4B9FC2F77EF45F9830753ABEF2E7B74836BC4F7EF22FF0C5AF7E055BB76FC7FE03075131A20A9FFBFCE7C57170CB473F8A7FFAA77FC02FFEFBE7F8BBBFFE1ABEF7DD6F63E78E1DF8CEFFFD36F2478CC23616927DF24F282BB691EAEDC6FEFA1E4C9D360533268DC1CCA953F01FDFF901565D76050AE2092C5F3E0FB7DCF211FCE4D6BB5158948069B9686AE84249693E0A8BF270D53B3E88871F7E10DD3D6D198765742B7D2A8026A213D4694193CF25886FD9B205CF3FFF3C5CD7C1F8F1E3D1D6D686499326A1BDA3031B37BE8A2BDF71255E78F165AC5AB95AAC095A7274722E5EBC100F3DF8200A0A929836653265D9D8B4750F8A8B92183FB6022F3CFB1C4ACAAAD1D4D48DCF7CF616DC79C7ED58BD7A311CD7C581C30D48E69560CD45CBB073DB6BF0BD340223819E548059B3660B2575E4E8511856125B77EEC7BC3933B1E5F557B060DE7CB11A972F5F2E2CCBA64D9BB07DFB762C5DBA542C674EA677BEEB2A34343460D2C40928CE4B62DDBA7B317AFC38CC9EB314CF3DFF02E6CC9E8DEECE66343735A0B878041A9ADA5058568EBAC65A4C9F32095B36BD8E0FDF7433EEFFEDBD282D2F434D6D2D0A8A0A3172743566CF9E838663B5D8B97DBBB463DEC2453870F020AEBDF65AB1B8B90BE1E240FE916D7CE699673067CE1CB1EE274F9A80DFDEFDDF58BA7409B6EDDC85254B97E3A5575E41D98811282FAFC0CEED3BD0DED28A919515983861826CAD17AF5C29F754565C22BE8BE5CB96E1B1471EC588F1A365B7505D5185CBD65EAE92D41273CCFE29A3E1038C43DD124D6EA9B40F622B0726BA8200871B9BD1D1DB8BAAD222549716232EEC9F8FDDBBF6A28B16347D4CCC926327D0E0D9786DDF514C5AB612EB37EFC59A91492C8977C92E89AC1A8D1F8EC11C40F779DE750D750135C4B661C1F37AE0B8295C7BDD0D98BB6019BEFFEFFF86EECE16DCFCF9BFC657BEF859EC7CFD357CECE31F4347AF87BC781E62E9767CEE2FFF166BAFBE0ED7BC7305AEBFF123F8C6B77F80A533C6C2320CBCFF9A1BF00FFFF40F22ADF9E297BE8CABDFFB7EFCEDDFFE1D6C3B869B6EBA01FFFAF57FC1CF7EF653FC9F6FFD6F3CFBCCD3F8ECA73F8B471F791877FDE237F8C0F51F42FD9183D8B96DA33810A7CE5B81CB2FBB0C66D08BD6C646FCEC97BFC1473FF917B002A0B0C0C22BAFBE846FFFDF5BF1EDEF7C0BAFBCFA1C5E7E6933FEFDDFBF8182C23CACB9E82A3CBEFE8FE8E9ED384167A92DE6530134396A5ACB23468C9041C4EFB4B7B76754016234F85455C4433EBB03050585B26BA01E9C8A0E7E87D6444141015A8E1F17E967221E87E3F848516520F4743A942DE6C17503949695A0BBAB1D011CD9C2DB89022A9750565282544F1B9DE268EDE886652785FAA00A87DBF69E942399FE0AF2E2707A7B51985F20967E6161A100344159288F50D9C07B2B2A2E462A9D42716101D8E88E8E3698311BB178A1502BC9441C81EC4C3CECD8B10B400233E7CE426FAA572894643C26D7E1B9A9DA217F44C78F158F212F3F1F5D6DED2A9B2059C7507E49A72B81D971A8F2005C4A24439F00DB979FAFEEABA5A116C9FC7CA49D344C2B8694E3209E501489A4E7F294239AFDCBEFA743D59015EAF34B8A8BD1DAD20A2B3F2974515141210A8B0A613068893C57CE821EE00AA072DF5022C5F99CF2811E8FC5A54915062849C4608B23D81380EEE97104A0391E0233861E3B1FAFD534E2D59A26380523B0ACC8C09523131248465A84738B3BBB050B16BC4979146DE0056741D7D613A04D91A97102E6E527B0EEFEFB306BEE52CC9C3201DD1DCDF8C30B1BB16CC912DCFFEB5F22EDA690760C7CE0EA0F60DEF4B178E4F1E73077E92A54151B78E4F1A770D12557A224E6224699146CDC7EC74F505C528A1B6EB8110F3FF298586ED5D5D578F0C107B1E6E2D5D8BCF90D5C7ED92572ED071F7800EF79F7D5A86D388E7B1F78002585F9F8E8876FC0B66D5B51505225562A8182C073F73DF7A2A5BD0BBEE360D5454B71C9256B70E8E011DC73CF3D9830613C6EBCF166A452E44E13B8EFDEDFE1BAEBAE851F38F2F007437168995A79797946FAA565679A9F8E4AD5A2722EE56C53C34B17D4CD48DB94870AA49C2D2B749688DC904013AA2CC489C7F692665165C624AD95687B55C51B5A1FA28E08AF132AF7F8B14A6F1591C569899D76146AEDB796BE8904D067508F9247392EB96BA5BC30696E8A32841F33D5ABF227125C0528459A670BE72B4DA1F6551C770C1072C5A32F1AEC50A3CD7ED2F2BAA8CC4FEF6CB2F240B5B5566D578E521D64A39CAFA11A260C7C60665C19CF5A19C2558D3C68E8A02525E205D42B850ECBD07F3B4094BAE00E535239E6C7099F43266A97F923C38C0B546FD127211302D8B977073ABB3BC549089F11CA31B81C87DCB6C492E87192E8AC3F84716509799FCF954E425AD00B172E1443E5642A8E0B0EA0EB1A1A5C7546510000200049444154A4DFC4692225ADD288C52DA9F547599D0483089FEB2261873EEF80BA525FC0D2B69348CBB3EB8561D15165C1777A2437B365DAB062319166893EDA8A094FCBB923123B9F9394166A4A30810E1F5A95D43F8B1C8F2B752FAD44EAA855208D254807B1A294D6DA80EBA6A57D0408FED02BCC874CD0A723CD32132A7A2D5045080603D03A228E1A4DF2C61A70952A4CA90594B39152210D88BABA7956879CD53A0BCE654047A9F542DD7998AD208C055196B568AB55549CE4E8962016AD0A51EA09514744C08B8E4A3EA98C0C2F1230A31126AAF638F177AE06047F95BD906D5116BE8A209511C0A2C1E17555702875EA0602EAE523CE2339948109A2A157578E120A99C54A4BE0C2FE8C6A944505A3B5E33A4252161D755DE93B06E09CF860144067648E2A5042B740DEE7B5D8759467E65E27EF8150ADA4D2FE86CF5F829CD402CDE72F8F87633F949CEEDEB70BDD3D1DC897DC38E4A1998C8D81676925DB74F360D1F0400ABE38EC95ECF4F8F1E3426F9D0C9CD9C80B0EA0EB1949C8AD89610A27CA008F9809A47C0B3689D3809183DCDA73DE7AEA69486875D692E17B12812C1255EA1BA99650323665C7A98929A1C02125A0408120CE7FB536991A583BB4729585A5020DC42453E945C374A3E1DAAD2216C30010ED00D461D0EA7B0449E50552C11E94F56435C87CFF541487BA1E904C72CB1D17303E31B0236B256B052E4FCFB673E1B1B8CDD3C09389E653E7142062ED30C1441549990D4AE1E7EA5ADADA544D611E12DA7FEC578217393C02A40AD737F9CC189E2F61E00A7CB426BABFA0141DD999B1AAA58A0E0D682EAC5EC602E67352A0479DB71CA00296B8B0CB24A5A5AC646DD2BB2138F3583B8C94944C85741B4964AA52D0E8A098EC62E7A988520960F061323294D6B658E059099E3E5E162F2B1B85496380C02BD18AE1B392C5A4CF4E820609ADE9E1943A6B38AE1399BC641C67A2B808FF47B34E3867A571E738945C3886856DDBB6A0A9E1182C5124D9F0641CFAF02C5F9C8A89A04076B3A6EDC1F019DDAAE626E71839688E8993A9382E40806E0A322946A94E24584BC5923047744475AB763B5A00ACB688922E29CCC92CE93168432B447E93737C20F9E925AB9ED64786E0AEE04C4F2565D9C93161218113077678F137552AD19652348A30AB283ED980D0007DAA55FDC4EB4713FCABC45399D00909C0602765894FE9FBF07D65656A678C8AE79429206C88B26CD52BCC3E284443981E3693DC8AA0CE6AEB74D0BCF99E070602CA532F3668864608339169FD71F894327FF639715FAD76562831704854012B2AFA5427D751BB87F062A155A78A49A89F4CCFF6C94B2E5FD3F2EA131A97B3A04F352694DE9CE0AB94FB993E660A87481F33B199C7374C0BB66123C1BCEC0890A67F811A24563B224D85184C2F2E94896F3952D554EF8424A0299485E6288EF0A9D4372880565B4FCAC76981B03395E52B53555754914003992EF209815881B2215557F83B7F344087F455F6F90F40CEA4CEAD4B6A6990E2C4631B95E2528D99F0481941CAB3AC2AAB88AD1C8924E177F83E37DAFAFD81C1943A6A008D3EE9E922E01C1EA3EF417F45AAC084FD295793FB5220A668067DFD907B1650E2D6918B940668F6532C6C2D45FE9C12FC2EE5930307C4E883CA66F0D6DF0FBDF9D2F97A915625CFFAEBA1930374DF4FC25E8E24CC917BCFE425C9463D66AE132E649A37D100ADFA2FFBD4C48088148ED0967D966EC905AA0C6C26A84E95DDAFF6AB069CF3228211F0E6ECF4D51FB2BB33F9AF0E5221F58C5EF8266D700BB6A7AC6AF2CF965076E1F923D183390B3A7C323535B5B2F1D4B38C734FA66264604BADBF30CB98CA4DA5C85196C852095058922AFB7B66029C4166CF30E15DD81C02810ECB25C8B265FC3B4C8023EDE4EF0AB06038DAB43AF15FBE2F56ABCA171D7DF5A53BFA0ED8930D94810DECFE8FCA5AB66A4792DD59848B5308327DDF57E35F5255090073D1CAE6EF561A6DA9809301685221FD03E229DBAF2D7C098BD7246498794EC05903B4DE2DBC95DE50DF8D522D1AA0152828158CFCE8454E28A3EC7D457766274BFA7EB6C6E75BBFD3F3EB0C99F918199302D22138EB11A07C1280E19960D24865A8D1D863621C3EC31E0434A0E84CF40C511AB9060DC2887F6200003D7AF4E8B762319D71E70FC945D9DA9A2347250B27FB9F966FC6EA08B7B6B2C9A48240B25165EB0AAA49A1F32F2BEB3BBAD154CEAB3024F744488CEE5123166A68A185F6B3B26D08CA7C84FCC9FEAE2C4465C567365D3A07B58034918C5554486EE9BF35D00FEE190D9CDAD0E78D2E0061C7462FD9F74987A39D695589D46AC086DCB1F69E07CAD1A6905CEF6E140BAD00984BAC025045A2A8BE622D9CE806FEA4832C82E16A4286A966254DAB0668A673E533E5F21CAEC6991266FD6C34A2EBC20046B706E1687227062E300028AA9AC93A5BFB3FA98C5F5D9F3462415B67C98018DCE839BF8FE6580895CF6280C9EE555200AB872B249A446432777BC83CC9000AEB8DC20D77E2266CDF81E9AB5D2C0D08CFF4C2CA496AE7A75FA73398A64D9B3680D174F6FB7D482E2A968BE7078C91A7851CA3B34E78896CF56BC5F5867F0B8884535EB6DAAAD9EABF2AAB9D721265362D91CDBBB287B204A2FEE69B102BDC9EF3B167DB13263E5519B20480543BB34F560F8AD0EA0BF8E0D91EC5D166817E700F6F50B91A64E046288148E18213AE2AB71C1248217068199340636812AA09A2CE275B46BDAF08FB5E81B95A086937ABA710D22302A30AF0F56B20009D59A1335FD2B520B3A58C94D5AEB9F4F0C0BE273F39C7D1EF03E86F2164A878C5880A71B4669A73AA7CC13A4D8AC6880C05C7020EAAC90492CC9A73063BBCC18D9EF3FB688E3FC9AF2ED588D4B8F48D00AE04F784554AC5925600ADE80F851196E8A55D3874720BB6F8B0FC380C563AB21CD1F7730E683FCB407BEA82731206046849AA8D10A0C3CA24B47E09B59932DA5A66A3805539079557F7C422647C3F14E4840E860C1EBD890FD5567066F3DAC7426475952C0FADE451BC3E1F2EDBA9E127C2C788834C5321B2048520CD0584D2BD810E85F0B8C1300499EDBF5EB04EE2808A027458BD8B002D478779B865132083BECFFB62488B7E43BB10430B5A6D361543AF16C9BEFCF9C0003A5C84F5E6441638FEA1CFCCBFB2EF651D767DFAB5BF7E3B4DDF9FA0CC300C09A1AF0C015A9F4EAB7F4261885AA735B91C2E6072EFA195A74C02E52F1140103A4E5982041BE9A5CC42AA7C18629064EE5FE7B9CA9A1DEA43E5BC8DBE04FCD9538A810B8D15A5C936C2F26DDA07C10557B547AD1C6AB9D6171DE4183D47876B0B9AC06CFB6ABCD17A26D7CC71C92E568E4202B4026FD360EA5F0B96AFA4750468D7225FED2A800E2C78A6A3C408E1181F4CF32F3C80160D58C69E1B4C5F9DD36343FB326B699E3815B4FBB29F3664BF99FD30AB3C39A78D969367D52683B9D69B5A1DBE31E0F70773B1411DDB5F7F2AB07B6B0ED4D33782003DA25C25A9123DB6D4C92467AF803460DA5ACF459239C23D1601B2C53AA6049450E791EE126061CA4B214825902661262562368805303C2EFAAAFEA66FF60854D2FAF37C4B0517191E1C8325D768456A9A4F296484680B33E2F1775FA2197DE43954D204024E2C1DC71212A6DF1B169BE077E388F3BAA0F2C191B6F17C043505D867E2D83D7D7F9EC9117AA12298EAA79EB1C9FA28B5942840CD35BD0B14FB2E637FA95DA0F21B9DD9E8B9F0007AF024EB993CE7DC77723D30E81E10802E2B432CAE2AED5053CB4DB7728492C2F2E47F3673968B3F995BEB009E945FE3DFCCA346B0A0984B297824A882013596C0A330A2DC25CADBA6C06CB837B14427C39C32122024E9593DB11E2DC60804363C46808685217CCB861B3A3413928D8DCA06A50B367C0658057019394A791A532B505D498ED6244FCB95801257D202C30BA007FDD0CEF11772007D8E3B3877FA5C0F0CB4071440974BFA5372F12C7F462B98F440E0C69010DC2485159360169BD49AE72288113C59F32EA5822024F4DB02989FD86718B12311841262CC0458BE0F8F5579EC84142596326FB0608679525C568263C08CE1C363CA5AD742CCB7E45883741B2D738B414C74E64AD48CDC2203A5A4F005CFCFA01809EE8949D42E1712F1ABB00832819DF41BEF2B0CA91E681F5D68C7E500FA427BE2B9FB1DB63D408066D6BA984D8066D425A90D715B01669EE4FA26D0F5C243CC60A161153599320C38868F98E18A554A0A83E5D93CA601302DC445FEA52C5C265BA2A5CCC843CF2419A1E809FAA1854FB57C3848C064A10982AD41E0B6D422C1A34D0781E521CD7C14B4E5030B0E65A901291213A6D7058311B1661C1E2D75522EC217F08E68462B073679DBCCF67FD83E91A16F580EA087FE19E45A90EB01E90101E8B211B0E3AA928D68894C575401293F0F9B0F1DC3D809A351650135F58DC82FAB40257D538C5E630E10AF5734B70C83776D03BB1B8FA3644405CA8D5E98BE0DDFCA037C077104E84CB958BFEB200A8A8B60F6A6B070E64C141ACC57DC0327518098CB2A201E6AD3060AEC380A186D6B2B30A7F829E57A68696A911C312D6E0A13478F45CC49B3C4808442D35A4FD0CA6638BE70DBE4D229355332560DD002DC8375645F40E32507D017D0C3CEDDEAF0EE016541974BC22DBE62BE299C6DDA32D0E9E5E3AE675E835F58882FAD5D88F52F6D42C58C299859508896DA3AA13C465755206EC5D0D6D28ADAE606EC69EDC0C4793331362F86969A26C46345A8AC2840DCE9417D5B177EB56D1F2E5FBD18BDF55D786DC3067CE283EF83954A61D7A1439830B20289FC7CDCF1E48B985655894B664E468BD78BFA86364C193316AE67A0B7B31BF52DCD38D0711CAB972E44C3DE8328CC8F614C4539EC745AC57A32302914F7280B5CE988A92C516A921C409F6A54E6007A78CFD95CEB2EA01E20409795D382563C7122D48CF75A369A61E3F9BD0DD8535B878B668D46434727AAA64C40FDD114DC861A54240C1CA86FC4ACA52BB069E3765C3A732C1E7E69032E7AFF5AECDCD786B2740F7A8ED561FCCC09583E792C5AEB1BB06ED7015CBB76352A61E0B6479EC682C54BB1F1D9E7B16AC10CEC3978108B2E5D8A4737ECC692EA4ACC2E2BC5DDEBD7A372EA421CAD3D8E6B2E9F823D9B0F624469110EB776209DB450525E81EEDAA358503D12D3CA99D03E0597E6B6A5B2228A7055386856BAB66148442C017AF8A83886DB70CB01F4707B22B9F65CB03D20003DA20C71164A60C63EF2C6868DB41947BB6FE3C51D073165E174FCE14F4F21595C8485CB66E3E13F6CC6A7DF7D1146270CDCFAA7E7E0E45763E9DC6A2CCA4F62FD1B5B50346B227EB1EE65DCBC7609E2ED9D385C7310D7AFB9081D0D4D58B76D073E78D525280C4CFCF8F10D88578E859D7630BFCAC4A123473165F17CBCB1AB0E2BC68EC484823C3C79E81052455578EAE9D7F085EB97E0F0B643A828CAC7E1960E948EAE46636B37F26C0FCBC68D41351CC4DC4E04311329910CC6956430B4A24D3F9653710C60A4E7007A009D943B24D7036F470F288AA35492B9D3B94606809234D788A1BB278E5776ECC6EC15B3D0D0D689BB1FF8136EBEF92ABCF8E201AC9D351693AA4AF1DD077E87F1B317A3C4CAC315D32A70DFFA673075F5123CF4E81BB8EEAA5528365C341F398A259326E2787D231EDCB113D75C7D05F6EFDC276599E62C5F8CC3358DF8C09289A8AB6F42C9C89178F9D55D583E612C9CF6663C5B578F194B57E0DE754FE02BD7AFC081AD7B505E988763ADBD983079060A8A0CEC3DD48232B70BAB275723E675C3B17CA49983422C66EAA8C39067F2D0B4A07332BB530EAD1C40BF1D332F778D5C0F0CA00708D015AC05198F878A6552002CEEE0C2718AB1F7680D468EAB4641C2C6ABDB77A37AF26494C62D3CF3E246B4A5BAB07AE51254968FC0734FBF2015D6118B61E9B2C5303D032FBDF2AA1480B864E13C8C2E2E40472A8D9F3EF52C627905185354842B972D15A7E46BDBB7A2A641D5585CB97C198E377563E38BCF63ED6597E2D1D7B7C08B17A3BBA3131FBC7C1E9A0E1F415E2286960E075E5E01F61EAE912217572E9A87729F4EC694241272A804A1CA431C9F94E0A9906715AB97A337721C74A407825CA0CA00A02277C850F480D24157C08A33FA8E0127B4309D30DF754C74D192DB8FCE433B8EB4CF90EE00012B9A1B012CA707B604A5C4E1B01C172D56AA28021BBECD1C113E620E93F850E86C209D2850DFF303E4F7F60AEFEDB322107F3C5F2479CC771CB70CB8E93482780C8E94D83260A628C663CAAA001EA576B625CE4CB627964E23CEEA4160C27A06A730288541350C9566F2AB306D6F2E37C8698759CE823E6D17E50EC8F5C0DBD3035BB76E43597905E2319644A2A44D0135E5692A631F256BACB8C2506DFE8FD6A7AD6A0E3236DB7354A635D3822B55839881CD86EBC5C439C702A7F4D049FC0BABF2F02B4C1064FA92A58D117F5211C473E53A22F4E341AC7EC3D42E6E0AFC85D91224B045624F54D93387FC3283651825E805520351441C4AFD0CCB6068B7CAA92CD546CC407EA8E6C8BD4EDE033980CE8D8E5C0F0C931E501CF408C4241787AAFFA89214A9E2057C4FA5220DDF973C10444E09F98011A424308521D8C44786A1488E083FAE127A09404BB85F08D290325FB0C2F25E52D98BE5B774642097002E0EA654ABB62C55EACD60997616DBE575188CC2F34A522B43405782533CD688D4499A780E43F280B0982E53AC7251A0E48E7548242AD2B64F59FA69983CA2B7BD1939807EDBBB3C77C15C0FF4DF035A074D2761B490AC805F08D8BA66A3543697A443524613362303FD9444F149AD4D29344E25088192259798B343E71557D767CD4D55E95CCAA8ABC83EFE97F51833694E7DA13B6C9BB407230D6320A60B28FB2C861C87C3A2C98C966178B700B44A764BEB5D650FA1354F27A12AF7C4058596B94A36145ADA7DEA66E6C688EA811C40E74642AE0786490F9C0AA03560D2824E330844786226295296AAAAD012A6C8B5543E69DFF5108FC7F1C4FA273065CA148C1B3F4EA2FC68814BBE0E46F78596B9048DA85475F07D172FBFFC0A66CD9A8392922295E6D530E18456B3695AAAF8AF1FA0A9B109955595C24BBB8EC48BAB94A6643A4875300708091AD793A2CC3CB76DC64470175D84A295D687C9E31816CDC801F4B0780CB946E47A200CF52E67B2A4FE2DE8D6D656747676A2A8A808A5A5A5686A6A8293EE4549692962F1189A1A5B85022170575757CBBF6DEDED282C480885C06AEE1D1D1D30CD382A465489C57DFC783D6CCB4245E558016BDB36E07A297475A6505A3602B53547C5F27579CE716391EE4DA1B9E9387CD394CC7B3FFAFEF771C39FDD8CF2F2327476B4C349A75152528EBC8202D4D6D6C9398B8A0A2542B2ABAB0BC75B5A609B36CACB4A60DB266AEB1A6411E1E77C298B3EF7D23D9003E8DC58C8F5C030E9815359D03D3D3D78ECB1C7306FDE3C01DA442281BABA3A8C193D0A478E1EC182C58BF0DDEFFC101FF9F047F0D20BCFE3CA2BDF21E0DCDED581DE5427468EA8C0D62D5BB160D142D4D51EC7FC790BF1E28B4F63CCD82A343634A2B878242E5ABD1AAEDB032B16E00F8FADC7CA956B70EB0F7F884BD7ACC6A1C307317DCE7C34D5D761545525BA7D605CF528DCF3AB5FE0FDD77D10B66DE1E8C10352B2ABB1A9050B97ACC4F7BEFF3D5C7FFD3578FEB9A7F0B15B3E86679F7B0963C64E42477B3B2ACB8BB06DF3464C9E3A13F58D8D18376E1C66CC98213B819C359D1D9039801E269333D78C5C0F9C0AA05DD7C58B2FBE88CD9B37E3E28B2F467D7DBD58A4C9988DE6F666AC7DE73BF0D8234FE2339FFA349A8F37E29E7BEEC1D469D3B164F912BCFADA4B081C47B2E45D71C55AA41D0379C902FCE557BF8835972C472A954247872F00B965EB462C5EB600AD2D1D58B17C357E76E79DF8EC5FFC390E1D3E842D3BF762C9C20578ECE107912CABC4B5EFBF1AFF7DE7EDF8F4E7BF2096FDA30FFD4E9231054602575CF501FCF6BEFBF0D5AF7E06B7FFE407B8ECB2CBB073D741AC5EF30E14E4E7A3B9FE307E7AD77F61F6DC85686E6943414101AEBDF65AA16F72AF1C40E7C640AE07865D0F9C0AA01DC7114A63E4C891B8EDB6DBC492A6D5396EEC68B4B4B5C08CDB78E0FEC7F0A98F7F0231CBC20F7EF8038CACAEC67BDEF75E3CFDCC7A549597E1B55736E2E69B6FC2DEBD87515D3D16F7DF7F0F6EBAE93A710A767604183D7A34EC18B5CB293CF6E8E358B5720D7E7E1701FA933870E020B6ECDA8B8B562C474949215EDBB203F989185E7DF179DCF8E18FE08D37DE40655909AA4655E2C9F5CF61CD6557E1B7EBD60940DF71FB0FB176ED5ABCB17917162F5D0D27954663DD416CDFBA111FBAF1C348A55DA16348DB685E5DF3D37D9DA5A7B3AE6981EBA2BB7DBF3BEC1EF8001A94B3A007D049B943723DF076F4C0A9009AC0B565CB1671AC15171763C28409929E948EB7445E0263C74FC09EDD07B060FE02AAE6B07FFF7EA41C173366CEC0DE7D3B50555181B696361CABAD45CCCEC3ECD9F3D0D3D386030777239D4A63CA94B9A8A8AC90E4FECC087DE4F0318C1E3D11DB36BF8145F3E7A0BDBD0D75CD6D48D8163ADA5AD1131858306736EA8E1E46634B2B2AAB2AD0D2D8A07288C4F23071CA4CECD9B3074B96CCC7E6CD1BC549D9D2DA8963B58D22A79B3D630ADC5427F61D3822CA137E5E525222F446B4D279F4EFFE2A606B550B9F8F9225AA57F4F7B7E3D99DAB6BE400FA5CF56CEEBCB91E18640F9C4E6647071AC14B6B8669298AC68E0A0A8FE5AE62E2642390493E694AEF442297554C284063E27E06095205E2ABE4FD9EAD3420810B532ACED251497DB4AF825A6C1B69DF43CCB4E0A41D98F1047812566181AD026B24B528AF6BD82A809BD23BB64F17F60D98D82E8680118A3CD6776032D31D152711CB37CA4347EF876DD780CDD3EBCFA2601C2DC4FB3F01A873003DC849943B3CD703E7AA074E07D0046672B4FC57C9EA426B31D42E53FFC008424AE2A4D0298F11C064515825C3531AE7B09A49A06A090A208ACC4EE9E32885E33122A7A37E5A6A0E32F2C554E5AB2CD64464815A9E5B05BEA8C2ED61E56FD16CF37B0C3B67860F5E538135B5D7AA7D59B08D82B006DEBE20ADA90FFD39FFE5317A21E2DF3C46EBC3FB5AE2E7EA999DEBF3E600FA5CF770EEFCB91E18600F9C0AA0F52968351384C8490BB0B1ECAB1B88748D793B98E7C263F0475891450246CC245CDF95A84082A5C54840021C43BA4D43E991791C0BC1327787D42F540B00C19AEF13540316919524FBA658E5AE43B025887BCA2AA625CEFC1C6C97EB23C6A016C9C7A18E13C33CD461335085750F696A1358A3C02B581F06E6E8DD4054071EE5A9D91F1AA8294FD4FDC2F734F00FB0FB87E56139801E968FE56C364A9585CFD415CAD074D12C62E789F6542A5DAB0D73A6B27DE477DE110390F9220449804518BEA162EEFAEB87B3D9D76FED5CA7036802D34B2FBD24804425876CF9A91BF659391B787DE3CB98B76801D2AE8FFCBC7CB84E2FD2BD691CD87308B3E6CD830707B615C7B1DA1A74767562FA94A9028EFC71D2296C7E6333962E5D269C30ADF454AA17797909A41D0FBB76EFC2F8B163909757887822893FFDF1115C71C53BA4B415230993F124528E033B2F0627E52066C410B3633870703F468F1B0DD771908C25E132C9522209DFF2B179EB66CC9C3E4BEE835AE8DEDE5EB4B4B4C8DF1515E4C3036907258694EF516D42108E822F8F2710E7E7E763EFDEBD98366D9A7C475BD6E77B6EB41C40BFB53935CCBFCD782DC671313C4C594DCA54092B2C67DEE067E41B2368F736DF597F1E7765D9E994678C5C53DB70666593FC10612A0A02310DB82ED743636FAF843D57E62591E4B65C724778924A53B6F1BAFE92AE902D303E3C5EA702E8B6B6363CFFFCF3A281A693ADB2B25274D017AFB954246EF3E6CEC67FFFFCE798366DAA2C4994E111BCA74F9F81D7376EC2751FBC1E8D4D4DD8BE6D8B009DB63A7564229D8EC78E1D93CF088E04C5B2B2323436360A2852D23773E64C1C3A74480265D89EABAFBE1AAFBEFA6A065493C9243ABA3A85A3EEECE8C0AA55AB44DDC1F612388FD5D488239094C9254C5FFAE8A302C6EDEDED983469925C9FE7183162842856D8B683070F62C18205387CF8B01CD3D6D621C99CDADA5A71E38D3762CF9EDD3874E86028CF3370D965970BD8339F885029E7793AD31C400F8FB9798E5AA1427FC3D4376126317529499E231B5E41EC8C457A8E1A32A8D39E00D6D278D91BABB9161AC1746089734900DBC0E1A6E3A869EE86A40A62D1D4EE4E2C9B3B0B098B5F51FCABDC6540A80EE956FDDB30295A7A2A803E7EFC3876EEDC29C045CDF0A851A304DC36BDB105EF7ED7554824E278E28927306244392CD3106B3495763061C2445153AC5CB90A058545F8E31F1E159024D81D3D7A54AC4D5A9FEC73022581995188353535983871A25C73EEDCB902D4858585D8B76F9F5C97DF2300D382E5F9C98D73D1E075290524B86EDAB40953A74E95EB2C5CB810070E1C10F0E467047B2E386C8B80B6E7C982C3F372813872E488003B178C6BAEB9060F3EF8A09C23954AA3B6B6569EE7CA952B71F8F0211C3B5623CA163A44B903E0391438F3C19EDFF9A673003D28E838BF0E56C09C1DA2D92D7F08D2DA98E69F19C01E1A8BF2A49A557D13D26466630B2D696EED990C1EC0F1DE5E6C3E5C83B163C7E0E97BD661F498F198BD680E366FDB8977AD59853C8349E309D06A29E229B989C8DCE97900D0EC1F02167F08403A24BAA797A1D5C57257B472F92F79651E4790221D41AB3BBFA050002B9DEAC97C9F604AB024E0F25F8230C18F80CCEB1134F5E7DA01177D4E045B02A8E6816518313748A8242168F318CD236B6A82C769BE587F47F3CA5195862CCD4190A137146D41FA422DB8CA52F6E487DFE7D088C5E2619E1272D05497287EFB7C7DE500FA7C7D720368B7C6360D4802D6069D452AD398501AA181CAC29DBEE1B3DE7258E96200173847874479434E465FD256EA5C6B9280131E5C58B0E004168EB477A1A6A60E0FFEE66ED41CDA2715A73FFAE9CFA36CF27854E52730A9AC445A4A4056654AC36C6F4348E9F4D775A7E3A065890A4153EEC734E1FA5446D031A79C65920429FC8CA9444973089DC1674E399CA79D7FBE005CD4A9A6F95DADA088EA9109C27D1D7051A544147CF93BCFC54522FA8ACAE1A4EDB2882840D70B80FE5D7F4F5F5724857AB88699EFB4EC50B7837F6BCA462F1AE77B6E8F1C409F2390191EA7151220EB2094DCC204682654271F4B1DADE26903E6E7359849D81E3280EE2FC526A9182E1B02AA4120CA0397E1C4411AAE1320B00AB0ABCD41BAB515BFF9AFEFA3BBBB0D2927C0F2CBAEC41537BC0F6E4B1BE68F1AA913B5A96C6D1AA087C743CAB4E27400AD9D661AD8646D5509E854AAD0508D41299C8021E99F30B78576AE46C9ACFE762D513DB2B660A3D17B51ED71EE0DDB5D0000200049444154D4AAD660A9178E6850495F479D0E2ED1117FBA03F4FB5150D5CE3EDDAEE8A2A1AFCFEF472D6FBD109C2EEA70983DFE7E9B9303E8F3E1299D711B0945610E5E99C6946211B469D9F0FD98E2646586ABF78D8CFEE18C2FFA96BFC849C9ED312DB6DE544A1C806C63D2B011B32D183103A6C52D6C028E61E3707B278ED5D461DB2BAFE2F13F3C8AFCA2127CEDEFFF1A87DADA70F1ECD918499998CC6225EFE0A657AC4CBD83380F280E0D40517582BC474A833B8C30D08389F575FA516A9E65932079A3952F82001DD50B47F5D4EC229D0D4F07854441BA6F22237D6CDF6092BE0A0ABD1068C0D4FF46A574FD59CA995D824BA99FDA2168F0E577A36D8D82BC5E104E4A9BBDE511FAF69D2007D06F5F5F9FD32B45077B661087502C600420ED078899AA54A7CB01AEDD2852022974152A736CC0AF7EADDE308A8D27D10070226DA122DBA4B2869679398EFCAD23E5B8FDD63FD29850432BBF8B764E59D57412F6063E5EDD7B18F9A5C528B0F3E0F829347675C0EAE9C1AA99D39114CB324479FE26E433551D0AB20673BF03EE983338F07416B406CBA8BEF76420D4375063B88255B45DFDB5B12FB847170C6D39F7B5D0CFA0EB87ED5772003D6C1FCDE01A161DA47D013A05A0A69DD22A17D5A5052860C86D08CA625B3171BB447AA964EB3A34F7542D88F289FADA0457EDC8EADB9EBE5B5ECD3DEAC00BCD31462D2485C551991DDF50DA3AA997A702DF582C0FCDAE896D876B903412F090465E7E1CB3465649515356C5A6E59891D9F156E5DB2CC544567A78BC0692B05FB7B4AF951A7D3FDA87FDFD3E3CEE7660AD88521C510B5CD32151A7E4C0CE787E1D9503E8F3EB799DB2B57DAD68425947CAC193AFEF4241F5582462166AF6EFC4A58BE660647E3E4C3F04385AAE16950ECCE610B21D7DAEA427870661521012E0E05047A11C565417D0EA5532A76C29233D89A2DBE628A0F4059B28F8F3386EE355CD3D559E89E59B849AE12E40AEE3C2830D2E4474DAD39FC4DD414C8C661EAF9C5516397702BBD0EE1AE28746B5D2DF833C1D4047B5CB7D77249AB7ED4B03682BF37C19E6512B3A4A85F4A5534EC6639F2FF739D076E6007AA03D751E1CA707B7F6A8F7027862672D8AE3015A8E1C444F470FE65EB41C1B77EEC77B562E40B1E9C122A279615922E16569712AB580B68635F5A08196004C2F3DFF8D7AD7A35D14F5EA8B4D1E26F0893A70A2C7472DEC13AD41DAB98A8AB0323A6806AA78E8A07AE35803108BC34BA7D178AC0EA3C64F10AD6C7B7B27F28AF3918C9BE86A3B8EE5CB960924F39BAA167620F77ABE501C7A11D32A8E6C7FAA808C6CA15772B5BAE02CA924CDDB865AF2611498A3C7851E139AF252F239D5EE68D4A0EA03B5AFA2844E49F3B47854CE16D9FD0DCFFB1D2C8CE4007AB03D368C8FEF0BD06D8E87DFBFBA155D8DC7F0D4FDF7C1F603CC5DB10297BCF76AC99D30B5BA1CF9BE038B9A5715E2A13297994A17AB7FB475D6977E885A677D01F664807B3A8BEEC4EF29158A025553723928679FCABA565F730C5DDD291C6A6842AAAB03E585F908622652BD3E3CDF44A2A4141D4D8D284AC6B06ACD4561584AA883D63B8541F0EDE7FAD10F84837EB33281098354CD40F5990230F5CA02960455EA2AE0E7FA460671FEA8C5AC7767AC16137548469523A4E908CE5C84383E993B84B94214D82B7DF489F73E7C764883E896CCA139803E935E3BCD77B2F2DA48E85B386754F45E3696ED6C5E3E4A71F0BC8D1D9DD878A4166FBCFA1AB63EFB0C6CC347D5E86A7CFE2FBF8AADFB0EE3E28573502040A5D23E42B29C655FFDF1DA0369EF401C52FD01FA9B796D5A518A8C20406BE851444700782ED229071E130581A930F92E83596C18561C0E7967CF438CFF26949243941BC30894A3FD793A80960A2AC9642621BD72A8320F8789969656E1AB189E4DF012D0169E5E297914E3A4A4780266C2DDAB4C25D9F1A85BA3922D650E19C8433F0BC7B06DA4CC6841EB17C19951944CE6CF484746193A4E1A9D9D5D72AF8EA3005BEF284E8C1C0C73019C85B60DD52972007D967B3E541E87369FAFF247844A012A0E0820B2D10EF9D033018BFEBCD6191DAC5851AEE85F53A6855F3CF11C2A9379F8D36F1F428FD38D2BDEFF2E548C1D8DD9E327A1BA305F38676616532A87508825E750DBE4FE2CE1B3DC65A73C9D8A04A3A3D094643807F61F94CA1F4C9E934C24D0DDD58DAEEE5E24F312E8EC68C3CCD9B370E4C85114E417E0785B9B64552BC84F0A7875F774232F9184E3BA282E2E92C843665E1B2E2F05D0157D8AC62A2B9860BC61C3CBA8AE1E255B7B866413B866CF9A8BCEF63678BE8BDAC6268C1A558192C2221860063B033B76EEC0A20533D0DCD282FC82128CA9AE04635528A89494A2FC4DD28B6AC7AB1AAF56C0237C78F27E644DD3BB186DAB660C8FF0316903F60C3A5559D004682EA98A16A395BC6DDB360947EFECEC861D8BCBEF4D4D8D282B2B41616191245FAAA9A945555595848D937A63BE0E91827358EB95FD246DCA046CC971CAE371AE56F181B447ADA0AA059523AB86C49C18928BCA7DF7876E6730984EF695D03E11CB45863651595C562A4F0F013AEBF01ABCC4EBA45402A793EF23EDD079E78A2ED64F24B1B7A51D758DCDC81760726025E3B09C5EAC62D62F4AEB18B841B3321C107DB5AA511EF02C76D3804FA5B7BA6C07CB2E710DE1046C6E6EC6983163D0DADA0E6A7F351F5E545C80AEAE6EF4F4F6CA82A31D96EC375A66FC5E322F0F6565A5A8ACA8082DCB0137E79C1EF866800E672A20392E76EFDE8DCECE0E4C9D3A4540BAA1A10163C78E87934AE1E8E123309371545694A2A9A101458595088C18EA1AEAB074D10CECDBCFBEB3B070C11CF8812171987C11A04D82B10C551B9E61CB2E4301B42B7FBF1D00AD9D7EF47B6880D677DFDDD5850D1B3660D6AC39A8ADAB17F46291DA8E8E368C1A552DD5C3C78D9B2006C5B871E305E42D4BEDB334F89E0AA4A3004DA7B27A9D23881ACC0E2E00AA72007D36E75C6885CA2AAC86BF3C6F9D0C5D246DEA13A54818DC38E86BD546D71A0219B780B42CB5A2827286CE204073770F761DAB45CA4963F2983118575488227296E24C0ADBC0506AC169ED6052CD1B6A0B5AB7412F14D265929B38EA08535B7AE971096D5609E3D577B3E58FD4EFD9E7AD542567F3F9BFB573BD19A0B3E62833D6F119B7B6B6A2B8B850F26B7477F7A2A0B01805C924DADB5AC16255AC52523D72240E1DAC454151191C378D823C80393BF2F28A503DAA2203D04A1FEFC120184B84A52D202D794A585965C8005A511C519F0A1329959797E3C081432828C81780E63326D53172E42834361E17EB9999F094E5CD31C29D6AF69908A3D3CF6B20C7BCB5277BE6DFCE511C67DE77FD7C5303B4629A694367784F728199ED6008DC8300E82850EADF396125DA8ED6224CD9B66B6FBF067F12043E2D22BE41AF3713D998617E3756C490B06F1F8EA72A75506827A58EA4AD0A04FB2A324EE4F9CE2D4510BD767F9C7856D5103234C2B7AA68399D1758817A76769E29B77E56874A3F273B1D07AD658A3AB190E4AD9000A34095AD621A565637115F590CA6CD7C1864E27B85CEF0034BC0984E5779F24201E8407A3ED5908E9335DB8329795022696ACF61079C6841C74F906946952BB1181D884C8CC4E2B01C9BCA24E5FD657968064851E171A264F464007D0E6FEB2D9F3A07D06FB90BFB9E20BB45D2D5D8D4B00F3DEADA9A1EE44E2AE3DC09B39A9183E48B7C2B338A7141709D3452E9344A4BCB24593A7F9F3E7D0AB66FDD81CA111538B4EF000ACA8A112FCA47CA75E598D6C626941617A1BDA70BC9823C2460A1A7AB1B0B172E00BDE9DAEA540017F590EBFB3EB7001D9D747D6BD0658136DA36D5AEBE6A87BE8ECB289573D687C0199E70203AE8BE0B8D410769C0884C17763C26748FD41134E2E287901250CCF927FE045DED4048B6B095CA94D0651054CE3F95A25505889FDBE7ABC71477454ADAE9A90C78DA828E3C4BB5C652AD425B83CE41BD28EBF7958A458059FC9C598A43CC8D01EC96B2FDA292720DF52B07D067FB09F4D95269A193A835A3CF7B008325DA340D46740C7100D39BCFD7860DAFA0BEBE0179F9F902A87CB92E5345AA4C618B16CEC7ABAFBC06CF0FD0D1D585A2B212049681C07331BA6A24766DDF8144320FC99262D88938CC942396D345175D84A2A2828CDC290BD07D07EDB99DC0510E5A26591FE765B48FA232C0682083FE5EDF47DD3720E66C0F85C19EEF741674DF124EB2BB892A31987B83F44E8635269805AA36A186E02CA795016821B6B433F64D12BD73FB7C75EAAA2840C7E2340C948350C67D267B1D2D63B52B0DE8DC14B9A5A6BA4869E84995CDD921DB477DA7039873D105492D5C43FBCA01F459EC7F256D0A6782EF86BC0233C829317D36BD27493E355AA2965D74EB1D05223A4EC83912ACC8C3F5F7521687B21C18E5C7014FF995E7A56058069C709CB32A735C6449AAE0663A9D423296276D9482A2A79C8F7AB989B6E05C4FE0413EA0C11A3D0398B4836CC1191F7E2A802695C59D5234C56686979714A3DCE62BC052811C063CE68EB66C780272AAB28E1A8B2A67B4244D0ACD4DF53DE59350E755832953E43503DCCA69F1E6053B6A8A0CA60B941495E395A9535DD7473CA60255B4C2868B07DBC9C50786E88E008379A06945ABF1A7683955C59CD4075FD1C5BDBF85BD3F5D3FA5A6A4476C2B4C819A99D03CA32A761B3DAF4A57A52C77452F4A7281B04DF40978617E6A46B3EAE4552A2BB93A5EF5B1EE53D9CF48908E2AB63B79D2842119A14372D11010073B854F39DADEE444F3A9DF08073739416E33657B458DB1760CAA4C103295FAB44673C87C480465BD15A7C5CCC178B2FCB6E17C82EF05D8B56BB77CB7A4B818C7EBEA112B48A0786405DA8F37A3209184159830ED38D28E23C7CD99390BF1BCB82C1AE1BA71927B7EFB298E814FF5B06D03D9C7464F3A6423F1CD77763A0B9ADF88523799B1422B526A137262AB1458945A1A521A8C5676A86FE7A21C52557CCE921B5A00459F57298C644C33317E48CD69D0572D5640A801FDAD07869C08D01E019A1674184948702650133499AB9C8E4C716852BB2FE0AC0C0DE1D87DAA3BC8BBA7A5A5043F05A86A6CA8F328EB3A6A1845FD1C328FC2EF4AE08B04BFE88C80EA5CAA8FD50C36994A200C14123A4E7D3BFC4C596BD1BE328C98CA2CC842BA6AC9CCD03119795F48E5F0318CACAA1892113A24173D9B00DD97D3CC58BF46801E184885AB683E022464FB9875C044B596921E923C61386868D5688F3D6BBFF1A513A96B2751BF16B4F64F1A90A00596462A2D2E41E7F1767831136563AAD0DDDE0EDBF5D1DEDA81B2912351535787DE9E5E2C993F1F166B4399CAE83FFDC3198E0567CFD4821BF81270AE8F3C1540EB2D7F5FCB50D11C814828130C79770218D401FBACCD487A83CAA13CB1D298A3440A7F49156E876A6749BD2AD9C199EC5E1E3C2B77B32F2DB8E25C0ECB8599EA98749A1236EA8CB58725BA682B481FDCEBCD00CDAA28E2F4F41C09C4E11C49C4188C44808EAB44FFCC5F2ED55428CBA3EA43A977141B42EE9D65B94C29A04B0026FD97EAE9956355F51525C1E43D7177C239C69DA77E9FFFFA727D75AFEAFD985085199E9E8B1C35E482E0AA008129518DAA0801C15D392B1510B35A3A6B188873D6601E19FEED885124D67CB8D3763CA657652A60A0AA72C4E9A7E3E03A7C40470FC945CF04A0DF6421F7B93D5935431ECC370CD07577B03B85970EB7A3B228814595F91813B761691357EEDC9749405D2AE59AD104441C2404660E98BE8BC0A97A364A8F642C020E56D7811BB324E0807614B5CF6C02ABA77822ADF211E3273A93DD903D99018D9BFFD1079D4A66C771C17A809491C56296EC7C4879C8B384813163C7A2EEE831E4E717A3B9AD15C93C0B85F909B4B7B563D4E829282A2AC4EE5DDBB9838793EAC5C47163D0D0D08458220FB1781E6A8ED5A2E6C861CC9B3353E498070ED7E08A775C85E3F5C770F0C07E548D1C85BBEFBE1BFFFCCFFF82AEEE9E30078BE6BB95A578664E455D3EC180173050C5433C460B5A011FCFD9D3D5893F3CF628C84D1F6FEDC1656B2F47797931DA3BDA2470E7D08183D8B2651B56AE58898EF6768930ECECEAC073CF3F874B2FBF02D563C6E29BDFFC26BEF6D5AFE2F6DB6FC79CD9B3B068C142DC76DBADB063163EF6B18FE1473FFE31D6AC5983E2E2526CDBBA45EA1C7EF9CB5F96E2BB0C8C61EDC59A9A6398BF70219A9BDBD1DCD626CED835AB5749D1DA8E8E4EA5CB6F6B473299270652221E135F106B3CF27C9595ACB5588B8A2A150DE9A61D8C1F3F0EC9441C5BB66C5121EB868931E3C6E2D8B15A54565461DAD4C943322387E4A2670AD0279368F505EFB461E058DAC17FFCF10D3CB5AF054536F0C955D370D3A289A02D2C369EA1EC0015B867A0A7B72753FAE784FCC77DA0A87FB95BF620D9BA85DCA00AEFE5021EF28E2C2FA4F669928F4306BE845047DB144AFF86ECC9FC8FC6DE01DDDCA902551860B37EFD7AD4D7D7C99698C55819BCF1898FDF82E75F7C490AC23ADDBD282DABC0FA279FC6473E76039E7FF649E1730B4AAA71E9256B70EB8F7F806BAEFB005E7B75034A0AF2D1D4D8847113A760D3E6EDB8F683D7E1B777FF0A17AD5886FD870F61F4B889983E73369CEE0E3CFCF0EF71CD35D7E2FEFBEFC7DFFCEDDF8915AD39E8ACD2E16C02745C516D818F82641C3FFED18F505E5686445E1EEA8F77A0A0A808A954373A3BDBA5606E5B6B1B366E7C1D25C52512594A3D347D2BFBF6EDC7873FFE09B89E872D5B3623D5CDB9E648D18799D367E00F7F780C13268E97809F8E8E0EBCFBDDEFC288119578FEF9E7049459517CCAE4C9D8BD6B17962C5B26E05B545282CD9B77A027D58BA54B1663FC9851D8B8712366CF9E23FD3376EC3858764C8AEE5EBCFA22A93ACE4595DAEDDDBB77A2ABDBC1ECB9B3B17BD74E94141563FAB4A9983D7B16BEF5AD6F61D9B2E5122979ACAE1613274E92E8C8BFFAEA978764460EC945CF04A0A3338B80C6E49AFC69ED48A1B9A911ED6D6D121C52513512C9927C1C6EEFC6371FDF83CEAA69483ADD981B1CC7D72E9F893256970E030BCDC043AABB17DD3D29E433DC3A163BA1D8A6C2D2373B114F39CB4327858C6B061FC8162BAB43128555C897D192A6C51C928C92BE93C9EBB58C69406832EC0FD25BEFC10C354DDD64B7E959FBEEDCDFF0A942BDA9DEF9F18F7F84E5CB9789EE9D0B32ADBA9B6FBA11F7FCF63E4C9A3205FB76EDC2D8B19370A4E618AEFBE0FBF09B5FFF02B61543E5C809B8E6DA6B70EB7FFD0037DC780336BEB641B2F931E8A36AD418F4A41CA41D17BD5D9D282D299490F8F193A661D1D265686DACC313EB1F477149A954E5FEDAD7FE1F3956BDCE9E05AD551CDCDED35051015EA4266C3CB57E3D36BCBC01F3E6CF47A2A01485C52578F9E5E7B178F1622C5EB44040F9CE3BEFC4D429D3D0D2DC2221DF2C804BA08EE5E5E392CB2E43DCB6F1377FFDD7F8E217BF80E6E34D98336B367EFD9BBB0594376FDE2C69046849F3F5FAEBAFE3F2CB2FC7BA75EB24A43E66DBB878CD1A6CDEB255E8C386C66604A689D5AB5662EEEC195877DF7D225B1D37662C9A9A8E4BE839BF3767CE6C3CF9F49358B16C39B66DDB8AE953A7A1A1B919E3C68EC38B2FBD2014C7DAB59763F6AC9962D92F5CB808C9BC7CECDEBB07ED6D1D9838650AAE7BFFFB063380CFDA201D928B9E09408BCB4F1C0794EE0738DCE5E0A5BDF57865F336C40DA0282F89EE740A3D5E80E9336660F18C51F8F5AB47F1E8CE46142285AFAC998C0FCD9F089B593D597DD8F5D1DBDE8A7CE610C84FBEED916CCAC71F91340FD993386B63E9C413092E937755D59CC9AF4AD27F710304707D2A1B42F916F7FBA1FCC534F9A4B9F41A30590A8CCFDB60CE0A75866C8980C172AC03BFCF5371D09CF0DC6ECF983143DD572843237FAACB4129599A2CEFE22863B49DE2585DF8811F2A13C2283B2A15424E95C680CA10A7FA4C49149936807D452E57658BE3FB2A28EAECBD44CA26A42C836EB40E5AC9459533D0178024AD435D379DE05AA5A27377906F6600CB9B5F8A9F4F3B29518124E209E19BF56E5417B6E5DFBC47D248FA3E5522AA6CF5747E2FF3779835D0237D9876B077FF3E4C9E3E0D49EAB7BD303C8D1C366F8B857AA948A163D5A39356519ABC365FBC26FFD6DCB87A166A8CB13FCACBCA8764860EC945CF08A0C532F5903280A31D2EFEF4FC6B706063C2F4C9889595210D0B493380D7D6869AFD0751D7D286792B16CA56A62A2F86E9A5169CE6E3A82E2F97C913B71388C76DED0F18B202AD676F8A0DB333A9EAB2522546B9664D989C29C22A499289D077AE222C61AA3C14866F432A18841E792D8992D349FDD530E8E11CC6869F4EC5C1894B4754B43E5F345FB2D2492B8056BA6615FAAE25952A784349E4A2B2B393E9C1A33E90811C7F262341951D536DCE70D0043AEDD709E57F2247EBA37A52F7D157AB9C851611A3F07BE1353430F75571E876F777DCC976B219354DA8A07119D92855899463960B82A8B99493491909E1B127A846C26022BEA75FD16B8E1C397248B072482E7A26002D468519A02D08F0ABA737C1F40C2C9A3503F5410A0FBFB113875A7A501533F09E39D331A9A404BB1BDAD05C77001F5ABB1CB1AE56FCE0473F428FEB61C2E891F8C2673E27455915FBEB0A9084354CCE646CE7BED35F0F4432BC72C7C3A4FCC45D79F61C75921D4A852010B74D838139045F7ACD5525EC4C3E92FF9FBDF700B2F3BACE04BF9763E71CD00139E740309BA42952924965C9164507057B67EC2A8FD763EF6CD554D9B3B35B5B3B6B595ECD682C590E4A54A4324951CC0104488044CE6834321A9D5FBF7E396D7DE7DEFBDEDF0F0D7440B7BA01BC57D564A3DF1F6FF8EEB9E77CE73BE379496671E44EC4E230D6DD78C55ACD770A9C758CC1024C8AEEA568781381AD01AAE2C49889CE9BCE8014FD170DC60AA0958BC3FCCD802A9F5D59963A7468A5BFC9F9666F38B6838A1799423B8DCD4130F43BF3FD54DF55DA4A688BE49A6B7D853CF2ABC7B6BE93955CA07149B13DF4E2698EADABAB9BC51177ED1E9B939B4E07A039C663D91CCE0E0CE36B3F7D098F7DF04338373482BF7DF56D0CB82B8463EAB1DB51171BC517EE5983BBEA7D787BCF2E2C58D881E8B1BD3875F408B6DE7D1F7EF0BDA7F09FFFEAAFD1D9BE50E43DB3E441DAB9D22A5A4EE933432D60751ACB9C5574302641D8EC2E647276A9121E4D2511CF01D51EB7B8AA9472B2AAC9A8FCF13C8F2E10E5AB679F299FEBDCB838B815167A99CD96A78599EADCE3818B1568F4F2A41351C602B4B5D5AF150C9F2E684DA547955B25233F790693E6081700CCAE32278D58D6984C3F8B05AA85C80C255E2A9F93CA9A4F26313C6EFD849AFC2C9C719DDE4D80B44A0B5C93562B0BBEDE5DD105438076F05E426894EF58968DEE3203DC562EBBD5AAB75ACEA6CD3B3A3AE6041CE6E4A6D302E82C10B2013F78E13578DCE5A85DB206FFE3855D783D1544D415105D67769E379DC092CC10BEF4D85A5079AB279CC0067F06C7F6BD8335EBD7E1D7BFFE15BEF0879F454B638B68CE929297CE51645E09C9973E33D402669E6A473B7DD16AD2D991CCD990B0D971E0E809B8BC7ED89D1EC412692C6AAA46BDDF2581536E4D39E7ECDA1FCDE25802D0A25048FFE2EC15999DC8C5C1096C2C4CC3CD556E0BD6613425A0CC68528257856DBBF97DAC8BC30AEEA6078AB7F5C55B7FE36299A11E93CB1403B45A2A15075BB941E8B6E232AA1268D439C6255570E9A842035AC697D6A826FF89CF9E49391657825C44927A0B017903EAC5006D160903DAA64D142B8B710BD5BEE24DD35D20E941DADD2165DB34985BDBD94A8F1DAF3D4BA9DE138C322EAE9772C0979FFA213EB8651B8E2503F8E2CE93E876542265F3CAA42604D81C7654477AF07F6CAD414B6D3D5EDBB917FFE92377E2BD37DEC089EEE378DFC30F6251DB42D845A83F85ACA4E0DAE154BBEAD267A65AC0E29620A02A4FB40DF6AC1D11BB1D3F7F6B37B6AC5E819E0B3D180A8D60C1B2C5E8EB0F61F3C22654389C797A974C7ED9978A5F44A77C4E271163F22F3619B124038E85EDB24ACE28248F98ADB44AE75769DD2A118A606C804752A91D0C0C16742BF2A063718D58B7E5AAC49472419880DAE4DFEEDA47E6FDCDBA2ABC249ED02A95CD0ADD54EA59730C64C229414F95D751F0F7AA2083E97C93F861433A9383C3E9C8EF3A84E5A4330BB34C0BD7D9B9C6E540374BF14E82C141B37B313538D96E63762EE6BAA214A99250CCA22349376C67AD95623282AFBA8675A1D0167CC9C531C108A3F3FF52C6862F7FEBFBF8D8FDF7606FC88B2FBE7D065D2E376073C39D25412083ACDD8DCAE830FE6643251635D7E3C5D777E03F7FFC115478B5AF536A58181F9A7847650B5D02E79998E2966B685724FFC77E11F6052B8067EC38198EE0EC4818B9F3FDF8B7AFFC03324862CDB6CDD8FEDB0FA3BDB5190BC8AC111F876C8A55C05063729EFD32C38F6BBD1C01BA4A2AAA28853A2BD79893399E484A12049914645D24D349D93E7BBD1EA1862D59B24C808CB200890459070EF87C5E5CBA7449B4C2172C5820DF9391409EEF8E1D3BB075EBD67CE0917F0F0683C2093665A768A99346CAA418F27DEFB8E30E4958F9EC673F2BC932575BEED36F2093B065EEADC282AAB4D9C10307108F2791B1BBB176DD3A11F54FA6E2F0FB7C181E1AC6E5CB17851B9E4A26F32E12D2E756AF5907AFDF07960BE33BBFBD6B17162D5CA4B8D289047C5E1FF6ECDE0D97DB8D152B5688956BDAC8303B582861FDFAF5B2285DB87041DA9FFF663BB18FA40DC892B13B845EC744B3706844F8CC0BDADBC4374DB70DDB92CF104F247060FF7EAC5EBD5A59EF12CCB4E3FC85F39270C4C5C0E9724976E8C28ECE39818839B9A9DEA61496D9498C25A6760E03F8E62F9F4773731B72758BF00FBF7E07076C7E245D7E649359385C0ED833393446FAF08F1F5C8DD1D1611C397F097FF6BE3B5121FA2A5C4D0B928E6ACB4DB856018FD267665B80AD6B4ACD2A9F322D451BF65CBA0C7F4D159EFBDAF77174EF2ED85C19047C417CF44FFE3D9ADA9BB020E88757028639A46959E92AE77447C9967A967BEB7A001D0A85F09DEF7C172B57ADC2E9D3A7E1F678A5CC55435D3D1289980083DBED456363A38011931C98C1B66CD952C95AFBE94F7F2AE04AF71BAFF5BEF7BD4FB8B70F3DF41076EEDC89CECE4E016E728809BCFCFFB163C7845AC6F30281009E7DF6592937F6E69B6FE2EFFFFEEFE53E133123A6D2B3B43299794780A6D017697FCCB2FBFE534FC9BDEA1B1A70F2F4393434360A08F6F65EC67DF7DD8FC18101BCFBEE6ED4D6D4E0724F0F5A9B5BA5B2D0E9EE6E7CECE31F87DBE3C1ABAFBE8AD5AB56E3995FFE12F7DF7F3F8E1C3982B26050DE399D4ACBA2C636D8F3DEBB02F44C5E617A38DB818BDFFBDFFF7E3CFDF4D3D8BC79B3BCF3DAB56BF18B5FFCB772122B000020004944415442E414EC4E077AFA7AA55E228B6034D537E0E8D1A3089497A1B2A61AE565E5B872F9322E5FBC84473FF07EC951D8B777AFB4EF86F51B70A5A747EEE572BBB07ACD1ABCF0C20BF0070270BA9CF88B3FFF0F7302107372D32903B49AE988DB81B74E9EC273EF9DC0030FBD0FEF1CEDC2BFEC3F87414F0532368F583181C8103EB6B61D7FB0AC127B8F1C82AFA109BFB37A21828C3EE7A814C7BB2BE52B138C9ACF054CA732B1E6D3B185D557D502573B15069780D3E108BA7AFBE10DC5F03FBFF4DF44B272CB96BBB1F5C1DF42F3824634960711607F092B4F09DEF01A8AD9AA0388B3F8B21303F453A8AEA9D57C5C07826541AC5DB3063FFAD10F245BCDE954EC074EF664322D40B36AD52A9C3DDB2DE0F2B9CF7D0EDFFEF6B70574962E5D8A9FFDEC6762C5F1BE1D1D1D025004FACB972F0BD0335DB9BDBD5DAC45023501BDADAD0DAFBCF20AFEF99FFF5980DCEA9F2E0EA44DB5A9C6B038324A8F3A180CE09BFFF2AFB8C2F25E6D6D707B7D08965508E0324985C0C9249E6F7CE35FE57DF99CA4B292331E0A8F60FBF6ED58BD768D2C4A7FFD1FFF0A9FF8C42770D75D77C902F3E0830F62DFBE7D9260C205A0B5B555007AC99225387BF6ACB4C1A64D9BA49D04BCF7EC917F5351928BD6CB2FBF8CAE93A750595D85404539D2A99424A57CFDAB5FC3F66DDB303812029C0E4992C9A4D2A29572CFFDF709C0FFE2E73F977BAE5AB952323AB9436199B686C606A9C148706662CEEF7DEA77E7042BE7E4A65306689E905135FBFAD3697CE99937B0A6A3134B1B6AF1EBD317F1DCF18B08D9CAE04BC7F0405B351E59D581D17814870FECC1871FBC171DE565125252B42DE5D630D5A909CED20873D612539D3E37DBF12A5AA860DA46FA33C2C8E1991D6F61DDFA7518ED1BC0D05004D51D2D18EE1FC1B685CDF0B342B6A983934F78E12FC61535FB3EE86BB938087EB1585C32FA98F64D41218FCF2B02474C5F5682403E7165508B62707058C08A5B6A5A89B446E916301578E8CAE056DDF85E6941F2779E23D9737A4BCE6D3DAD67E36F354C0B9ECFADB815A06F748458015A980E5A9680AE835068485C2D3607D5EC28A4941E2322C6FA8454C1631A3ADFC568DA10BCD91E742110044D8208DBC1F8E6F9DCBB77EF96C587A06C449368C9D37D41F1322E7A6C17B605DF9BFF665BF37AFC3D3C3A8A80DF9FDF5150E695F39E520E4E1201EC2AC927501614B7464A44A754D09216BCB89DD8CEB9AC6A7F6653DA6D686D6E99138498939B4E0BA07574368E1CF6F50CE0F51D7BD1B97009EADADA104EDB30301A4759C0856A770EA19E1E1C387C0C77AC5A847B5676C2AF39A934C9146D4B65B6896FD3F8D7F202EA373ABC4BE7ABF6356B9E2A846B92910930E15814F0B870E4CC59D85C41D81D5EC4D3312C6FA84583D72305D89979C6A995A7D5E61D1BB3BFA25ECF82563E16A5D8A6827B225AA977098AA1402D65A3BE6667A5158B26B21AFBF46B9BE415CB5E43070A8DBB82C75A038BE6DFA6D49675A459AD662B7D6CF2A3F1EA441582936263A85D8B8A15AAF6A7B67571A289E1482BFE7781C5A29E4D3D89298166A88926586A7DA7628686F51D8C0EF7557FD33ADBE24766760303B39A66A7FE2661499179CDD3FE747052125644E94EB348549694BA855662A8AF2DF1A0AF3F9674D9766E96D9F8FB2E8FE0D9B70F211D0E6345472B1AAACA301409E1F0F94B4866ED7874DB16AC5A50854A5A63DCA6D1B7A1DD1B05F8503AB62AFF98AC8ED9E3D64E7EA2DCFC476A8F9465521752DA074743F0799CF0BABC48D91C08D1F798032ADD2E78753030A333BF1D020EE358CBB36C564C08D0CCB63300CD67165F8CD2C5E038535AC58632A6E7B9D6432E48DA2AE94C6B5284D58F6CC0D864B61583B63573511B3C5701E654469211BCB766123ADD2CBCA65827A2E1CCEA409A8A6778CA85F7548B8E750EA9F753017911FB976CCADC55B535ADEC112BE759B5A72E68A0CF357F2B5E8484724DA688A472676073399114ED6A05CE5CE809C2C40E03D0F4AFCB02648A10E8B4FD34CB786919024D2C4463FD6D964998CD982241577B178CF595B7C2446B97B0AA8A71B2A113B0239400BACE9EC7C9AED3E8B97259AA2CAF5CBE1C8B3BDA51ED77C9769A5B4F99E496555D69C35A54E33445C00C9499DC2E4E6592DC8CC7D2F2A1C00D2538E90FE4B69F91EF9EBE01343537C90438D77D4602475C0CBD013F3C6E376AAA6BB17BDF5ED435B6C0E7F3E0E4A12358BA78919ABC4E17FA07FAE1F77A313C3C88C6C66655C1847AC45EAF6C6FDF7EFB6D2C5CB808FDFD7DD8B279D335B454A6A7977D3D9A1D9FCF6CCB8D5B428185627B90DE4BAA9D4AEB36F757143BEA6A18CB5A29136B70175A9AA2DE495C841C707E9FA18EBFCE7815EB5A59D4A974A25086EAAAD25926843AF5325185F16F438AB532A95331260B52092771FED10DA2DE4901AF759130BF5B2D6123AE2F82FFDA0E52D633DB4A99AA229E2F9C7153F0609A33C2C2201AB396DF0005A8B5B57596CD82F1DF754E6E2A1D98CDE564001B3D023D30294C62E43AF3ABA46C33F41645066A0E895416703A45CD8A65A4FA07C2F0795CA82CF320160EA3A22CA8565303CE45EF2F2BBF68411BAEA6E2AD5AF9A9C6BA99E630B92D4E2358515D8D00BD72E54A09EA305B3091525B7F6A30545554E04C7737828100EAEAEB100A8D60DDFAF5F8F14F7E82A6E6660135AFD381458B16E1FCF9F302F2F473D2A748BF23A9580CE41030C81AE071AC01C9EFE96678F081FBB5F55AD4E4D2B966EB3EF9DDD144006DE5311B3052C8A2C02B473AA11EAF640D29E0E1A856415291FC92A41B6EB9191151A2F2622DEA19C9BFD96894D3DD2355B10D80A9925AE28BB6589563CD1C3557A6F3518B4C4EF4A08D8B4359ADFA6AAAA694EC3B8DBBC1A1CB5259136B8CF688FA9B7290109C792CC5FD0BEE9182B09411F857BB863983A6719BADB9B9794E1E684E6ECA16C8643239ABC68075CB62B673E6FB9E2B57F0E22BAFA0A2AC0CF1484454B132361BDA162DC5C58B3D58BD6205CE749D473C368A4C2E29B5FFDA5B9A8562D3D0D020560B79991DED1D58B3664DBE030C185B7BC49A245002E889A738DB8B20CD1F822AFFCFD99C92640C06CFED0887C21230221F58C0C9A6180E831455F7780468488BE2F70CFC281781B2A494356AB6C56AA27B3C4CD048C871FC290BFAE5FF525A694C670A7C1648D413BF8E1C3111405B2D46055EDCE129D68940A3B085B4529F521BD1DB7AE546936D3FC56574719F6C5AFB7905A095252D5559E22939864A7E2CF3407093CA1F3AE185D6AB49D898E4AB5DF330EB6E40F1A009D01EBDE0286A2A8FA18F9D3B1917E985192AF131614505FD4C45146355B3128B9CE320F758F5AF2AA2ACDC0AEA7CD63D54FD58289B3567B074CDF6B9ED1255B2D96CCEBAE25AC1B2D8D5101A19C1EEF7F68A255655518E68741476971BE11865096D68A869C0C8D0103C4E2742E121F8021EC4E329C4E3313435354B94971161D2775A5A9AC50250EA5AAA3F8CA80D9F47C8E9B4CC8BB776373A036EE1F3D9565266485B7467CF9FC3A9D367D0D9D121B426A96471F122CACBD97751E1D7D23A1B1E1E862F1090083B3259B4B43609558BEDCFE40346D1693D1B09483621695A0B172E44592098DFE617025233D3C813A57A938530369B2F0EAFC785443203A7CBA70AA6DAB3482513F2ECCCA2235F3A91544C021733013349E55D77B8E538BA32320445974778D507F6EFC5C60D6B1550BABCA259CE76318B20173063B9CECC5BABAB18E0A4B83EF9C0A29DAE65387B7B7B641E55945560F7BBEFA1BDBD03274F9E143A5C77F7696CD8B05ED1E516B44A75133231B8E33971E224962F57BCF1CECE7659782F5C382FB4C15DBB76A3B373A1D008D55C5465B2CCFC9BC977BB916BDD766A76F1783C47A1734E4033D8CD04E7CACA41410A11B7B81CC82C0914898C8A2E6EC0E717EA4F2A93119173AEDE24D247474611F47BC59289B3569BD674B52E046AD576211E8BC1E355DAB512C165643A430A945B683826DBC8D0816EA4736FF573AD0C02023045DA7BFB06A4F61BAB55545656A0A7E74A7ED2912BCC063FDDD585728AB94B2DBB8CF43739BF46EF977D50162C436824247F633FB23F9889E7F3283A9AF5DE06606EB4BDAF07D05C545E7FFD755990489D2358334BB0A1A10EFD0303F0CA73D9E0F705F1DEDE77B17DFB1DE227AFAF6FC0C18387D0D8D884D5AB566160B81F17E90E4AA4104DA74D223C5AEB1A11898EA0A7FF0ADA17758ABBCE96C961381C436B6B1B366CDC209548C4125514F119FF88054DFA9C4EF52660F267F7EE77247184F533CF9C3D8FBFF88BBFC457BEF2153CF1C4A7F1C61B6FA0AAAA52161082337F3EF4A10F491288DF1FC4BE7D0704D0B76FDF86EF7DEFBBB8E79EBB9148B0F6A04DE6F8430FFEB60897A92AE7CA05329F3EB79D16C79E3D7B721CDCFCE18020F791939B9DC5C9C86C2002F6F1E3C7C54D31141A853F18808B05331331D873369407CB1149A670A9B707EBD6AF45CF8573B09115104BC05B5989DE814149063039F7EC748287E1A4F21E4C19E5BFAB2ACBC56A33890104E975EBD60968943E536B016E750787423261159898EDAB11145255D155D61D79A6D448A028BD5332CF84BBAAC1D7E854D08560262DBF376C02657529949AA9497D3D80E66EECB5D75EC3B973E7F0D8638F4932098FA755B076F50A1C3F76146565953429D03F38846D776C44321E971D44782482B5EB37CA986271E0EF7DE3DF50E1F763F3DDF7E17CCF15545456A2A3B61E878F1EC6A1E38751D3DC88B52B96E39D377760D3D6BB10892670F7DD774B1156A5CB9CD562DA53EB9FF18E366D672C680609DD1EB7042B0998BC5F6F5F0F5E7FED35D4D536E0C5975EC1073FF8980072636383EC6C5E7DF5157CE4231FC1AE5D3BB178F1223174984CF3E94F7F065FFFFABFE20B9FFF027EF6F39F221209E3DE7BEF9573588FF1A31FF9A88C118F9795C0E9C251CC91F9F4B9ED2CE89E9E9E9CD93AD152E2F69716B5A998C081C24C21A347108DA5A4F8E3A9AE53E8EC68432A9194EF2F5FE945DA0ED4D4D5A0BFA7077E97138E9C1DE5B5B5088723963A832E21D013148C856E7C6504E8587454267A5D5D9D2C1A9C880477FA4A4B9FF15BA0D87A35A233745370511DF329B6F46ED8401A4F20FE862F2A8F7C3D80E6F8E4D8A021C15A797CCFFEFE5E6CDFBE056FEED8857BEF7D5052B083412FAA2B2B25F3EDB5D77760FD868D387EE228CA026558B16C19B2B9242E5CBC8C8EF68578FED7CF8B1B88EE38BA49687D9605BD58B4B85DB2E6962E5D069B8D3EDF9C365C6459523AE63368415BE96EC68256D2A08A4142CD8DC868044D8DCD387AEC047CBE80BC3F9353589771DBB66DF2EE8CF3D0F0613599E5CB9763EFDE7DD8BEFD6EECD9F3AED4FDF3FBBDD2C674551D3B7602AD2D0BC4CD41D125137B986F73EEB6B3A0E98336568F95EB79ADD59D0BAAE67168A60509E7460C514596878606A4A8A5EA65F5231C55AD7025BF0BE3CE90ECB5E2981149D3D698894E97828445183B8EA56AF51512BCB8008A85E86040ACE853C8859881F93737006DC66C315F379B4BC161770A88CA771C680C7E81FE68FE5DE92BA7526429F14317052D45E5B661728B8C70D9DAF31AD4C3E035150B229B637579ED234EA7E070AA0A2DB3EDE22013CA58D0EA1D9CE22BB73BD4F3A8D891A206F2C37737711C9EA7DA8BCF6AE6A3D2F93065C1184064069F0486B56A9EA12CCEC02099B14BDC76004D1687616E58077BB155966F6185C18A3B4A7FB15441D1B2ED9A231A1A1A42B0BA52A2DE6EA86DB021F45F8515DC424BD45D0D2C157D9FD9ADF28C8D8E797E21B61B771DA4C2319DF737B3B0CD1D409B05DC8C2DA1BC5122955CE62C990B36D81D1ECDDD4F29253F025D3A07267F300027D662868C17BB04116D043C06FEC41221ACD3BE5032B8B94C1A99ACAA6B58603B196B73064D68C348D13E68F2D909D005394FBE9F9647D525BB38344D1660F1FC29C47E0A006EB4A54DB2982AFD652459D5CEA0E4E2284CF899D9134E03408C056DF4704D47AB95B50094790B4D6BC7D25FA906AF02540A24D958E2C60684868711ACAE120EAA64A1E5015DBDA6F1635A7D95565A9DA14F19FAD235178B69BCEFCD7E4A715B58B7C38CEC337E409753E133D93ADC2A576BEA599C1327A158A16B2A037DA2925786074DFF79815AA68059123248BB13BFAD7A35A6AD1B2B40525004F4B406844E9EA0F52829E2F682E03F991D595AAB9205ABB2F08CBBC1CC9BD9603B58697605C693D6B0A6352CC944643C311B92E90863D3D90D4D562D26CA82569F9C58CFF4A19B1883EA774A857297A10AC9CE247D70A6E6DD6DE783CE652553456D7FF43ECD58B385D5D5E4F0EB80886C0185D36F499537D33087D070585801EA30B19F75869245FCDB22C66D3ACF90E9C75B18662AF034530365AEAF63056A4E6482B3D135B68ADE98B69F38E1609A006D1185BF5649F6D90068C5D31E2BB8AF76601C9474EB180343D7E7935470651C081849762BC579A85DAE133EB4268C30180400559A8B23ABDC78521984AE847C3D3DF56604FEC2F8B42E413796A8429AA04954D10EC2425ABAE06C0E991CDD14CEFC0E557B2CD53A3446D7465F41EB71281F7321CDDD003471803E6B1A683A876CAE87FA98FBDF7E99841433303D61014DE95C439FD256837431AB36A8DC581D1F29582534956960338041E16F46F955985F4D24E3BEA0F5ADC697552BA1906966A5E31506DABC1A2733F730F9B4D76BE4BF16FDD9B499D572A65B83006D7CCE63B7B8B36C414F027D2771C8B8ED39998A2A66B765C6936A17055E94795256A34A52C921A3CA3C49511905C0D4B848534AD161432E95868B56357248D1CD415706F358983D287F57413A9B58263AFB957E5FF14DAB4A35922AAD330E8DB53ADDC1422F8BF0A02DA9DE920128D6BC7E473EB79A903AC1A46029F3CF2C6460AC64717971E7CB854D176F30CFACE699D12FB10609D53BCD97CF6DE78316F379863E526BD2064422A46DB9E066258CD2E7DA2D906F79369C1548B53E045D46B277558BA1523319EB76A24BC3B06F6EB5A62E0668BB852A41B049A6B84D7731B7262FB9497EBED39E412C1A81C35B21B97F4E5B0EE94C0236875B454B98FD484684D3298143B18CED76C44746A52289A474D3882080937A483D0F131FA1FEA2839A4C698447A3089655AA406C26A9AC735668A1246F3A2569F3D1684C2870D27BCC40141D109780241756B29332E9B404F4443E34AF1B42CDA1020F5A02EADA5DE8B2DB100D87652790B2B9E115594F96BBA2BB46D1F194CC28EFABABB6EB5D96CBE7021C2E05B9E984B882E87BF7B8A82D429F3C634619793637150D450B4495D562B6217315C2236104CACA9578932EFB457AA694CBD2B2872C48CC1D9DCA368DE977663F29CB3C166556AB4716518753EDCC53499D85CA47D6B2A3BC9FC7AD323F73593B1A9A4A6A76539EE7569C61CFC7A231A97B26DCDA295FED363B41EB54707FA1045895DAB244E5B5DC17653F8D7CA3B896F4CE83343302152DE75BD105743D8026BDEEED777663C58A9538D5D52D1982034303A80878515F5B8563478FA275E15201C8A6867AF45CEE414D5D0356AE58894B674EE2E5575EC392E52BE172BA101A1DC1AAD5ABF0AD7FFD061E7FFC719C397F4E32EF860706859E76AAFBB4D03E63D1A858B49B376D403A95C4B7BEFD5D6CDA7287F8FD2B834A73D94E7AA9CB8763470E61F3C6F5D8F1E65BD8B0618308E6D73736E0E2C54BD8B8699324CA9012C73EA46E32136F1E79E491BC521DC7012BAAA4B33A514554E2B292FD78F8C001ECDDB34784AE4E9DBF2245989B9B1AD0DF77195BB66C121D96B7DFDE8D75EB3788F8BDD7ED4530A04A7AFDF6FB1F45E7A245D8B57327BC6EB54011CCB9A03011C9E3F5A1B9B909478F1D950499C6FA3A49E7A71B25102893E49EA79EFA2E2AABAAC5B2975259C90442A161D4D5D548D92C2E0C274F7563E99265088F8684CEC70F99334CBFBFE79E3BF1D24B2FA0B2A21CE1D138FC7E1F46A321B8DC4E78DC7EF4F78510F0073030D88340C00D87CD858AF26A74779FC5673FFF87730229737253BD2D9C310BDA000789F1FC50F7A1F499A005B469467026198A0381FB0EA98ACC4DAB5433D172117A8742EB82139B0B20AD2E6B80F7566AEFEB0134C7D8F77FF04301E0FA8626F111B36453477B23DE78E555545556E3ECE51E7CFEF39FC38F7FF4235457D74BE511AFD78DA0C786175E7A159F79F20FF1F39FFF1C651541A9D6F1C273CF0B50BFF6E61B2204D5DEBA005DA7BAB071EB66D1E4D8B56B175A16B4A1BAB25C00EFC5975FC5DA751BB06FDF7EF85C0E7CEEF39FC50F9F7E1A2323310C0CF4E2CFFEFDFF82FFF1DFBF22554C08E297AFF448F625DD3265E595924E4F90FEB33FFD7778EFBD7D52D18402464A1F5D5B910CE67954651827EB2BBA5DF8E2DFFD1D36AE5F8791915191F4F50503E83A711C765B56126812C9244E9EECD252AC4E49F53F71F4885461F9DC9FFC094E9C3C2119BF6FBEF196EC3456AF5C8581C1413435354AAA78341197946FB6FF5FFDE5FF8AA79E7A4A1628064FC92767F516BA5F962D5B86969616ECD8F186BCD3FBDFFF28BEF3ED6FC1E70F606868045FF8FC1FE3FFFBF297F0977FF91F447C6BC78E5D686A6CC182B6569C39D385CB972EE283BFF361BCF2EA2BA8A808E091471EC0CF7FF13C76EDDC8F8F7CF8C348A6423879EA30DA5A16C2EF2BC7EEDDEFE2FFFABFFFEB9C60E59CDC74A601DA808311ED61E249E9739D16307139318F559A31E19996B3783C68383BD22AC49A7588921A7D9FA391519556AFAB7EDC8AD633DFFD7A00CDECB7E77EF53C366FDE827DFB0F8A25D7D8548F851DEDD8F3F6DBF0FAFCA8AEAFC75B6FBD85BBEFBC13EFBDB71FCB96AFC2C68DEB70E5F259EC7CEB6DDC73DF03D8F1C69B486612D8B071235E7DF165A9F377B9B74780A8BEA64EACDB3777BD85B6050BF4CED0857BEEBE53DC772FBEF42A52D91C823A03F6F0A183B2F5B7DBB973CCC0E7A5BE471A65E5653877FEBC58D2741D50A69596F9C18307A52622B36A59624B0AD652BC4903348BAB2A2D0E8FACD85C8809D2278F1FC34BBF7E019B366F8637502E5209870E1EC0DA35AB6447313A1AC1F7BEFF432C5ABC18838303282F0B8AF55F5D538DA1E1307EE7773E801D6FBE89E150041EB2409271F8CBAB505F57CB8A547877DF21AC59BB1A5D278F23128BA3BAAA5A2C632E2ED4ED78EEB9E7A4F02B0BBA0E8786C5FAE73B313371786808E5E51548A632F8E0071EC30B2F3E8F586C145555D5C2AEA19EC9C30F3F844307F7898BE3D5D77662DDBA953877BE0BC323615455D6A1EBD4197CE0031FC0FEFDEF6161E702749D3E8986FA5644C329FCEE131F9F13AC9C939B4E07A0AF0E651519E014ECC9649088271028A5674FB83E290F079DA869641964A54F8E143085CAF24371733B5CAC3586F0282B4C3BAFDA9DDC8A207D7590506B8A6B8682B01774208CEE0071FF087D4C9587CAB18A8AE281EAC40D2DAB9B61A56BA7F85E1974133A1EAB50D33FAD772CC2AD56FE24E42866AE2B9A503D3D9B4E28C53EFA53A90297A6FF55C55F541C86FACDDC0F3119C6A114F674E28895BB6D744DF43C143FB4A288E87C000B400BCF44F267C4412BEA83F40B4B554FEA5353579DC1CD2445EEE9D7A56F5E73A599684329D23455F998E0A2FCC5B0BB60A7EE06B2C8D89CC268E1C292B3A9D811255AA98B2D7AD3129854D43B1A070468691EBAE4A4A28D0AC44A4101117612EB028CB28ACF5EFEC00A100EADA3AD5E958B1905ABC40FCDE335FF5A3299993C2322552C64CEF774A1BAA6724EB0724E6E3A5D8096CECB434FDE0C54161F2B1167B322E4122C2B9F10A06EE703C48521342ECEC84C5E839800AD1B53748A6959E7B20E8486E8AFF489B0BE9523AE26D39C0DA159EBC2F1591CAABA8BE2F82AD6906272C85F659B4FAA5D3A9392125E90121F8A6AA734CEE9E127079AE7520C48D14BA56AB616F6E20B19117C8228D3AD850D22CC103B1CC24ACA2AB0CBD92489045926BBA860633623C59EE4B8ACDC5FF58F95816380DAFA7F1E27E1482B40A7291CE651EB8C7CABAA95E40374129CB30980D2BAE663C9DA4E0AA1EE19A11EB2B6249F81C136CD0BE0EF0C3C72312128139C856228EB98A6C7E6E55A4DB92A9D74A60B1D9898884A72A3F56F28BB7C16260A91EDC25A8DEA9954C524F683AAA044D714415B71D7550B98ED2383824A2295EDCFF74FA3A1FE36D3839E2A8BA3D0E9665E2A80B60E3EA6D9D2475812389A18BB18A957255849ED52AE0D87D0BA34C79C4511721944C3A328F304E0F2B826BEE82D72C4447AD0C5A02740C8E168279011A85D52F35200C9460B50201C5966030A7C1198146019C672F1422756A855905F2C55A5392D241BB13655F963A2230B57703185A49CF33994E094953A5AC842BCBAA3242EACCB42898B4303B400B758F766BCE86031AD53EA511348B5C0BEE4F6DA68B9EBFBE6F8BD0256B1E865C1521635192532D6F40E249DCD69612D2E407A5111CBAB109C5656BC7A1E43DB53EFA4D2E7A59559A185D16D1B8B24287F1DD73F8783FE74FAD919304C0BB30539EE3858F99240AE74B6D547A5E0DB6DECC714B2B6249A1B16CC89253227379D510B5AAC0B954ACA41158DC524123E672F76938014278BF06C59A5DA6EC3F0680C57FA876173BBD052578D80C38EE8E808821E0FBC2EB7A6ADDE1EADAA6A12D688BFB73883923B086E83CDF63A2F5320B5EE4C96206963AA4C9BE1F533B3D0E9F220C7B46E52D34CCD151EE4A4F56B0164A100B34CB8768DE8926C52FC8A092EB452ED04E302408B059D75083813A455C95D65A15BF9C8D71A9E06A005E832D4CBC88A0F5AAC67E976DECB80ADA9EFA976AE5C2084362817574B908639A5EF2C9E1A72A11D12407439B8AB50EDE3B0A96C44717B20ADD2E38DC68EA61BE62D6F29CAA0761E62C98B6EBBBABF7227F1FA4A0082FB3F6967592CE80A5196B9DDCE3691D12FCF2469F902CCAAF28D4ADF573C7695BCAC2CEB052D6D7332F8E7E4A6330AD07A2810A409D031D26D7C7EB8945BAFF419A70538EE24AD96969E1D38131EC5BE23DD58BD7211A299348E9F3883D59D6D58565D0637072F01229FAE5BB8603178DD2A8D3D7ED158F5767C678233815A40486B898B8D99A355EB80C3468B2C2D6E089BCD2DBE7E9B3D23B6B57828740D435A9F1CA3D4952140B3AA8CF88CE99F753868900B508BB782C0237EDB0C720E1758F1CDE570219B4928707238914A2BF0918C18FAA98D3898F68517343526B6A0C94D26DD2D2B40A77CEBA4C54B824D26839C9D2E0055C28A2E0AB18C25F74C2D0CEA1C5564961C69FAD0794DFAEF6D5C40C4ED40B70D9F953C6D0E338A403991A6C56DD1FA1050D6D995A6E0ABE87FF0DE92569F91DAA3BC3FC1D56E638C80199F4A2655F9A0EDB0F32064944F5C78D1AABA0F5DF0AADA0B331909C9A142850000200049444154CEFC9DE9ECAAD28BDDEE425D4DF59CC0C99CDC7466019A2BA18AC928804E21E0F7EA62B1B70A64CCEC7B28FB2D83141C88A432F8F1ABBBB069D9323CFFA35FA2B6BE06EB1FDC8E0B4323F8E0F245E2A726A343C95215EAFADD8ABE67D3CAD70368AB7B83C92906A8A548AC9D16A7038E6C42F9332558C81F15B8E392C8B58E9C6202BD8032B1D7CED2600EA93E235B7AAE8976BBB89CE289049C1E5A9792442E1ED804CF73B2F24A162EFABE6D3649D22AAFA846361517FB312BD6A4760F188B96A0A915E6640E16CD7E31DC75156FEA41F3BEB253A0AE88C9194C517304C83A3D70BA18A84CC24546865EB0685073B120A01258F9CCC2D37633BBD726D573025E9FFC9FC7113F95FA9D4B15DA88C7E57D9C7A01E0EFD48916DB5C74C3154FDBC9DD8D58E1D4F748C1C3D5438C08E50F97EC4D2DA8984E33F147050519C8E502C68416B560296D6DB52B327E721DA03401E05C0E0D75F57382957372D399036895F0C68ECF4847E5904C67E0F1B8E0D2F5E16616DA6E9DAB7170C6EC76BC75F8141A6B6BF1FD7FFB16CE1D3D2C0070D7873E084775359EBCF72E3808062447EB74E25B1998C7076845025739961039556A34B37C1ADD98FC3735CB83C132A4B236D43534E0D2D9D3221C75EEC245D4D4D48189ADD1C8285A3B97A2B9B1016FBEFE2A5C2E37528914162F5E8CEEF367515E560EA7CD2EBCE0DEFE3E2C5CB408894854E87177DE7337CE9CEE428E40E476A16760502C585624A92E57D982C78E9D146EF4F0403F6AAA2A70FADC05B4B57708AF58B921540AB9AA34AEDE650C406BBF84D898AC5C9E5182FD648250908CD0D77BF932DE7CED55D4D535A2EBFC15ACDBB801AD2D8D181E1AC0C285EDB878F1220E1D3A8255AB56A3AFAF1FF5B5F542B33B74F810B66EDF8A8ECE4E7CF5AB5FC5EF7DFA09FCF8E91F62F9B26558B97A0DBEFB9DEF883BEDD34F3C891FFCE007B8FFBE7BE171FB70ECD8512988F0DB0F3F24943AA9633914423C114763531322D1B8F0D149E7DBB4612D0E1F3A2C5996E43C8F8479BC0B172F5E407535935E32686D6DC6E9D327D1D9B100070E1E445BDB4284C32AFB78E9D245280BFAF0EC73CF2118AC909D00E9825DDD27D1D2DA88F5AB37CC0956CEC94D6F04A0CD2452D15815614E833E373B86469338DD7511F575756869AE21414C62B7F98F25D278356D6FAAE03B892BE40FB9FEB156C2E06FA443B4746BC40EFCFA9D77B16EE962FCF72F7E19A1DEF3C8A6D2D8FA810FA0BCA9150FAD5803172D24B7D22CA60563CA51CD16508F6929FD0F15772FC82FA9CDB1716119368F625388DB61AA5D59747CC182A6E6B109B429EB953C682679B0165F64744400F6E48953F8E33FFE77F8C92F7E8605ED6DB0A75370B97D786BE7DBF8F4673E891D6FBC86782C0197AF12EBD7ADC6B3BFFC299E78E249BCB36BB70030E5716B6AAA7168DF013CF9FB9FC157FFE9EBD8BC79338E1D3E82254B97A0BAB6163EAF0BBBDE7A539EA7B9B51D274E9DC6A31F783F7A2F5D402CC63263FD180947B165E37A5C3877162DED1DC209BEF3CE3B752AB47253A87ED301F6620B5AFBCCC9893682FD4A3BC32625C6BEFCA57FC0DA552B118B25309A0228471A0A0D0A40DF7DF79D62099F3A754A8CA6707814D595353266CE9F3F8B27FEE0499C3DD32D9995914412995412B1C828DA3B1763EF7BEF62CDEAE5D8B7EF90F404332617762EC68B2FBE889ADA2A01E9B5EBD6E1DD3D7BF0DB0F3F824B972FA173E1423CFBECF3921CB361DD3AF8BD4EF4F6F661F3963BF04FFFF44F527B349188CA0E60C386CD38B0FF203A1776A2A9A91E2FBCF82B545757A1B36329FA7A87A43EE2F2154BB06471BB24FC6CDD42BEB91F6FEF7E07F7FFD63DD8FDDE4EFCF55FFCA71B1D56D31A957372D3E902B4A18789B39F032797452C1DC6CEA32F23928D23166BC6F2855B313438820B0397F1D09675A83369DFA43AC9DBDAF30A618C2B5B455B26DF828A3E247C4B0307726D2381690A06E8F03E7D929A663546605DF3392D67E5C1E5463B667C412815E4A17F2D9ECC20964AA23F16C389A108E27D97F0C64F7E2C09120F7DEA93B83C9AC027EFDA0CAF16CE61E5666EE7CD8FF2DFD924AB50B6B2F499E6A3E0C2FAD28241059A97720F149408557B6BB0D0C1258917692AB64875DA7318CDE5D04B6BD2668797556F023EF8A9BF20E099111FAFF87785D9A0740C95D16F7221F346A3BAE5351AD72C94B4F86AAA6A15EFD602D07C5666E17DF39BDF1460A6FF9255776835FEDEEF3D81975E7D09A94C1CE1FE105A5ADA71FACC197CEC138FE39BFFF60DB436B7C1E1F3E3D3BFF7297CE98BFF2F3EF9894F61F73BEF88CF9560DFD6DE8E81FE7EC99CEBEEEE968412BA06987475CF3DF7602414C28F9F7E1ACB962FC75028242E8D2D5BB648E5929ECB17E5B9982A3D3ACAA48B4AD4D5378ABB80C798BE9ACCF8E6B1EC63822DFB5635974D5C032FBDF4120E1F38288B86C75F2EC1F89D3B77481209B31199FCC2EC3FB60DC703B34D2F5DBA24D76B6D5B807BEFBE479AFE0F3EFF39FCF57FFC2B444646B074D9327CF77BDFC3A38FBC0FEFEC7A07E72F5CC0E7BFF07919A3070EECC7430F3D846F7CE31BE286606AF77DF7DD8763C78EE3FCF90BD23F43C321DC75E75DD8BA7913BEF3D453F0F97DC216A121416DF2AE93A7B0FD8EEDD8F9D65B92F2CED4F7A6A606C9886D6E69C56BAFBE818E8E765914D6AE5D85BFFBBBBF9724248FD72FBB1216FA65BB7EFC631FBBD1293999E6BFEA9839B9E974005A7C7312FD96B085F8B608D2D1D408761CDD016F59392E9D49E3C0BBC7D058D780471EFF1D2987B56AC90204297C8EB400BAE2699262A37C20B275D5422B93B7BDF45221D11BE34B31969C21C6EBA6956B6B27B946060928EB4FFED7221EE1441D339ED6D4B5685426C3D2048908921E8F4F7C87A4CEBE76E2AC90F15D4C55B1D9108A8E62C9A23674FA1DE207559CDD02B0E6A3EAE2562A80F6D820D4D8C58FD7E00F83317C4E092EE5036CAA7D54FFB23B245543ACE650268D43E72F211C51BE4B3A2133F128B6AD5B0997247964642C70AF94E679A2F266BCE5966798C436E56A80B6B238D4B7043D82222B5933EACFB6255F982E587A999D1E0790E0FB386495B239A83741A17B0740360CFD9FB934EC22526F2AFB28B6014185D727B03145DBEC5A441F453B59588897AE0D321608EECA07CEFB6565AB9E88C7E5FF0CCA997E2A2E88311E5258591C4A0F5A01B48C436D594BDC22A58A34F3FA8A134E1126F51CFC3F7704BC1F1717BA2454956E3B92BC9E8B6249DCFB6A3E398386F495EB925AD4C2E67D6D741EEB0732E7A758AB92E98612E0E6351DFA59DC32AEB8489FEEEE465D7D1DCA2BA9D39154E34CF3CC25C8E966020A45985C923929CFA20B543381C8B8B154B0910607F542B88374A3AEB61424BCFE0A93B78832C889F342D88A48E61278EFCC2954D6B7E07FFFD3BF40B9D3875434850F7EF46368DFB00AF50DB568F07BE1455A9F4562A69EC27AF4092F92B4254B106CC2E5EEAA096FEC7B0DD0722DAD722196760191B5FD2D7F90D09B39554569CCDA31EE231810B4F25BA52D8A1246389138D9CD80E464535ABB9A5624EB06694D69C46D6E5C8CC4D113CDC9E46EF4E6D0E0F5C08BA48E5869F9D6719EC854D328B6D218B85125910AFAC0FC9DCFC3C2A0FC51595E4AE7D8EBF20AB839E84A61143E0BC4EDC0B1A1280606FB70FCBD3D38BDF72836DFB10D6BB66D416FDF156C5BBD0C545D71EA523BE2E2C8C731954B22BF439A36405BB4C4F3AC0D054CB4A00D6048065D2E8D74360577CE09BB830C08D2769392A1C977226E93D160A3FA9BDD296D61AD686FC0CEE84D9BBE962216024A4A92543149C8DA6082078D0DD58E02E4B240B1D155969DB9BE59BCC72D4566495431597B7980163606F727A4C9A97BC8C2A2CB781194791FD5972ABB4F1B60790097B1690AC1EACC485E836352005902805C60359F9989405AF3DD94D39220AC56DCE3BB2B9E3615EB28F26F87D3CE40655AB34014C346F4C965EDD27C736DF548BB3AD8274AB255D5265542F3D28652B498224B5C7CD4F2DF505F3B91CD3421644CE78039B9A9EE40EB9499F8D9E568F61A1B9F047335F792D924DE3BD383405D3DFECB9FFF39CA1D5924E2293CFCF1DF45C78A25686EA8439D00740E4E992063132E1425C86CAC277E8C31478CB17A3940550D360DBB169707E78F9640D5CF4D03C1A8C8E541DAE0895A7DC6FD58AD57E3521046801691E78ACFC015BFA34E81F1195B270D7F5756989ACCD9AC1D71669F51F3970334954619AD1F46FC09E8126D570F6426A25910AC0B85D5AD329E8FDA4CEEF1B494C5CA4F53AE328D6C9A8B0890F538F1F2D12E5478ECF8FE57FE273289A404AFFEE6FFFC2FD87FEE321EBC6B0B7C39C88F22AD524CD904BF1443623A2E2C95A8421787E2D95ADF85EF60CDA63496AF80948D20CA841F8704A568E1C22EA6B58CBB442A2D954820C244DC45281095ACC13429612A53CF808B59784DBBF13B55BF90343E45F733206EAC64B560286A9CC94AB482E6B546B8B5EF941B4CEB41CBC0D149297C76F3119A9C1A0FA60DCCBDCD731B0B3B7F0ED3BEB3597874B6619202FD4EA714A74B723C7ADDAAA4962C0605FEB6E2265BCB7DA945DFD43E14B74C8AE04C09D30CECCE42BB1880E6F815F6B34513DE5C77BC36298C6B6564343696581CD74547B5F52DF2030887348D43178730104B61F87C17F6EDD98DDA86063CF0F8E352E57B755B2B1CD9149C3A5B4E883F1CDC6E8744C41570A974CFC907BE14514D9DCC812317B1383A8D7BC3E8C4695FB509A06B2BD9B83AC451622EA7A3EB0542DBD866B15AD057BB2E7232818DEFD04C946270E6AD76EDD983AA8A6AF45DBEA2DEDF4985780546B148026E5740FCD1A95C0A8D2DCDE8686ABC6EFF148358F1BDAD6053DCCEB2E8E483573464547FA46DC0CFF61C420009FCE01FFF116E9B0DD1440AFFDBDFFE0D4EF60DE1AE2DEB5166033C4AC75E7D7463AA8C3EF50755BD72F21F05D0351AA0AD554BD40EC080B4B11E0B57562E385B96AE169D512719DF6A0155855699B8A1161303BCD6B6B23EA5D505226F429A99708F0B00648E3760A3AC686B49A9B1E9DE13B5820155AB0F9A7440E5C648CAE9628D4BA287EA36734EF118300B8EF93BF7BEE47723A553D895FA7F5EA08B74435E93B3255F264CBFB775E132BF5BC794B83274A92503C4D226B225D53521F5626BDAD5EC2ACCF35B1748F337D5D6392C58D03A95213451334FFAFB39B9A9068C495BD0EA40957B25EE00F54F318E32B624225917F69EBA8C8B97BAB17EDD1AF40F0CE3CCE50B7864EB26D4B93CF954551165C9D173CD12F22924A26119101E8F1FC1A052C09B1C48AB945E659D51EDCDD2DED635C446809692A1F2B8F2EC96EF69454B184B6B20F0723C837FE3D2315EE77070519398BE3E8231FD951C58E6C758D8C593C5FA6F3EFD89336711F405D07FA9579E2F118F209B8DA3B1B119E1D118FAFB87457B2369CBA2AD7301DA1B9BC63262261862568B4CF7F75596A8B9843C9B3427B3151863A0980EA4BAC881FE618C0CF6E3C8AE5DD8F5DA0EDCFD5B0FE0FEF73F8A935D5DB86FCB3A7872004359C657AA5C1C6C64F6B26A7B132A9CEC609FA826A1F5D5C74E6E1588E618930413016165CD8A954780D08B85691FAB0FD75CD70AB0D69D8A017403C2D6F633006D2C5A734F034213218275DC582D68732F71970880AA019CCD2901FC6C56BB59F40DAC606D5C2CC6A8C85BB0922EA8DD79DAE5213107A6C4B3AD2CF3C9BC734118C92407A905CEDC832E2095BDC902BC8542B7BC9658CFFCDEFA778B4689757133ED647628CAFD61673078B2C367A2A69ED2F77372D3E900B414B0673690D9B46A0767D69105EB26F3673099C2A1A35D68AAA9C3D2D61A38981490073A5A87869A279B2899D422B294CE6064949522940F8D16A8298469180A56C09141A3AB8A4B8C5B99F73A214195A39707D5B141E690F1F9783F67460A22691116193D7AC151A3322D13BBF0DCC6BF476B99A0CC7F139429F959EC5EA0CFD950E1F89D494996EBA6D3720EFF260B1107337D76CC624B3BE5DF0E970AD2487A70862D1E874D02420EA493B4AA75545F6F9FCD04B182007F2F667498496D1DFC0640A45DE58D95BC6986D7CEA9C40CEE30065269BC73EC341A9AEA11F0783092C8E1D0E123F8E47D9BE1D1344AA9F7A2036ED2AB04429D4D9735014EDDD456ABF45A8BB1D0EC6AAA45545F89F0684B4F07B724FA910F9C713BAE5D2C747F3025CE4ED683F2CDAA8AD5327A6507480BDA543631F7BFDE56BBD8F5506C3D176FFF95556B529755BB98716DB53CAF87123CCED0EC0C58CAB36A5122A5E0E7CABFA3B8A3F22C29757F53A3D02C361218346BA7CE7034C69629006D9E95FF66C0D000BBF93BDD7779664971993CFA99A9E161E177CBB8946C1D950844F798D5C5915F382DBB92E245CF2C5025809E8445A6E3D522BBC21992CD30CBCD2129B25C1D47010C876328F7781074D0776A479AD592E329C423619497D327AB20BB907A200ECC7C80D0508C4482D16CE7F420A7C5CA1FB5C5332A58A66A94B2FE725995312582F7DA50C8B0DA8B5E2818D47233DB4AFF5B980B6AFEE74B34725008185BD28939B00CA5CD3C97B5C9FAFBFB71ECD831545656221289482205FF662C34B202962E5D2A54A8789C406F87CB6D47343A828A60AD00476D5D15060607446C8673309A0C8B1E83CBE1C568784806797979B93C1BFF4F5F379F95D7E68794305AF7AB56AD92124ECA482A640C9909271698F62B9A924AF237022D015E2C50E5E2206C8FA673E8BED087542A2719649DAD35A8743A44924892300810622913DCB3B0F3DA82060E51EA93BEB2145DB5FAC0C71B765703B44216B1F232199C3EDD2D4920172E5C445959397AFBAFC0E771A3B1A111C78E9EC0E2A58B71F9F2252C5AB41867CF9E476D6D1DAA6BABD0D77309E7841EE6C6C2850B85DF5B53538337DE78039B366D927625758D5430D2ECBABABAA49DD956FC8EF4352EB0A49F353151231291E01AC7249365088C0D0D8DC2D526685247591B4357698A4C16A0B52085005B3412163DE7DADA5A5CBE328055AB57A3A1BE1EE1704878DCBDBD578407BD62C50A8C8C84515FD7209AD35DA74F63D98A65685FD086A1C1415CEABD22B90A7D3DBD686B6BC3E933DDA8ADAB45B93F88935DA750D7D880C1BE7E19C34C7E615BF01D59B880B446B605DFEDCC9933C2B21083C5ED81DBE311595CEE541A1B1B85E2D750C7649918828100AA6B6B3034342422FEF5F575721D566161DB197721E708FB85EFF8FCF3CFE381071E10CDEF12404F64F81390C5A59116E5E293278EE3F88953181A8EC34F71935C0A613BA9463E642249DC7FE71DB834D08BFDC78EA0AEAA02158120EEDC7EA7D233166D095AE48E7C3695D45DD3CF60B508CD96D1802607047F274F92623A8A9EC333E99BA465C1EC2BF277B3C8E44248669C387AE212BAAE5C960174C786F5A8F1F9C4B297B0A1F69410A88475114F8A35E26339295AB596A8B8351064567F03761C6C045F0E264E5C4E7C665FF1590D358ABC501E170E47E0740590B56544D4BCA6AA0EF1E828AAAB83123C64465C5CF47D8154320B9FCB07E458205655AC619B18C54033B0B9787012111C9A9B9BE1A2A68109C868CB93C772D120E8F0BD3C5EAFBCB3CBED923E8D45E352F0D7E5A1F04E0E198AC58B0219E062BB122645F33B2E62F54A361288A71292FA4C660163EE0E2EA8196A10BB118E25E0F1B9A5ADA947CCE7B45AF4E359D15703B4B242D9CBE42AFFE29967D1DABA00030343180987D1D8D4808AA01F4383434824D28827E3D87EE7761C3B725492456814AC5EBB12996402CF3DF32C1EFFC847A53A08DB8BA5AEBEF6B5AFE1D1471FC50B2FBC80868606691FB615FFCF7EDCBF7FBFB4D7EAD5AB6501FEF5AF7F255545C8E5EDEDED173A1BFF4EEA646F6FAFE2070F0DE0631FFB98FCDD30794CF070C2A966B1A0E9DBE5F90C387FE3DFFE053555D5D237834361D15DE7BD2E5E3887471E791F464642387CF8B000269F239BCE61F9F215387CF4283EF9BB9F40243C2A25AFFC654179BFCA20AB95ECC6FA4D1B71EEFC39B43434211A8FE1FCC50BF8FDCF3C89679F7D560099BCF0C71E7B0CCF3CF38C3C0B1737822ADF870B1A01FCC0BEFD88C5E3E83ADD85279EFC0CBEFDED6FE3F77FFFF785077DA6FB0C46C3613CFEE10F4916E8C68D1BF1F4D33FC4D6ADDBB063C75B92F5C9FBB04ACBBE7DFBE4F909E42C9EB066CD1A590C6B6B4B2C8EEB8F1B6A42084067858D71F8E8111C3A7A0C9D1D2B511508209B8EA277B80F8D754D48C65270063CF007838845C2703A191A74A2B56581164A576C10D2F58C55AE521CC6FF580373E688783C29994AC9544CB896EC5497F8BB9D22FD087B18CFECF82212C900D62CFF085CB900721E2F761FD8277EF2B6AA6A38A91896C921311A0123DA6E6A2EFBFD79C5AE62F02876B3582D69AB0FD1F8ED8AF9AFE207D53E35D1CCD51921B2348905AF7C3372BED6F1CD08A3426FE3B50569B540AD819631943B7D4DE547525BFC2B577AF0EEBBEFA2ACBC42B2D068E1A4531904CA2B313834023F9CA80A96A1373E8AB28A0042FDFDB8FBAEBB70EA6437FA87C2E88F84515D5686BA323F366F5E8B575E7E51764983C321A4B276B47574E2D2C58B280B78111919C2E38F7F147BF61DC4E933E7D0D1D684D69626AC5CB9523B9B943F758C35AD7D9F4C5419EBE2280034770D2FBDF4327AFBFAB174E972356A6C36AC5CB1104FFFE0C758D0DA8EFE91416C58BF0E8798BDD6B9542CB79ADA4A0C5EB984175F7A051FFFD4A7F1B39FFD440080E3E6EDB7DF1690397EFCB8586EFC3B175B820F772504BB95AB578926371799BD7BF7CA77870E1E446D4D3DBC3E2FAAAAABE1F70771FCF809343537499592A54C28F178F2C1C5EBC557C443A75721291A6B59CCB873A211F2BDEF7E07951515F2CE5E7F998CD59D3B77A2BD6301DEF7F0C3E8BDD223EF42C0ABA9AE166A21771967CF9DC3C73FF5717191F55EB92225B076EE7C0B8F3FF638FAAEF48AE1C20A295C18EFBEE71E59BC3EFFB93FC22F7FF90CEEBEFB1E014B566C79FAE91F8BC5BC62C572F87C6A71DFBBF73D2979F5DDEF7C4F52B37BAEF4E00F3FFB47F8F297BF8C279F7C12470E1D9636ABADAEC5B295CB6541D8B66D1BBEFE4F5F95CA2C9224D4D6818E8E4E343635CB22B9B0B3432C6CDE77D9D2A5686A6C426D7DA968EC75019A5B59D9324BD9FA34068607114BA751555507B7C38EA1C15E193CA95812A3A3315437D68A3F90CA55D48265F060706000AD2DCD82190A8C7420A788015D0C76565F6FE1217915C95F93899E4C25957FD7E6123F6AD616C5C1EE97E1F5D5E0C09E4BD8F9FC1E04EB6AF0993FF9439CEDBD8C8DCB97A3D2EE802FC76C3C17ECF4598A5F5B2F14161F9B01E2F1160AB38535CF650DD258CFB382B916D915F686F802189C13DEA95188D65534722652AFE419CD27EFEFD5890A63AFAD8F2233C4989DDA671F898CCAF6926A83E2C7640B66B2188D2524BA5F1908223A1AC64034869ACA32C48699EDD58EFEC141246825FBBC28F3FA604BA7102CF7A3BBEB94B210535924D3592CE8E810B740756510A964427613B10417621BE2B188E860D4D4D6C8826A5DEC0A2FA67E23401364B888281F7401A0B90875779FC1C2458B71FAF419048204511FCA826E4446A2C2A0F3960770EEDC192C5EB808A74E9E45755D0DAA6B2A90898D62687804D5750DE8EFEF939D0EB7F8DCC6B3DF083EBC2FAD7C022BFF4E2016EA64222E35FE18E81E1C1C1417127723ACF84170E642452A1F5D1EBD7DBDE2FA696F572E0E3346A603D072AE96FD4C25E338DDD585868666D89D2EA99EC2CCC5CAAA72D94D321847C0E33CA4755F535D87506844DC2EE72E9CC592654B05F4FAAFF4A2B9A505172E5E90EF3C2EE5CF1E1E61A157BFCCDB8B17CFA3ADAD5D3206A927E2F3F931303028EFC28ADDDCADB27D98D24DD78ACFA3C61477630D4D8D721FBA8A16B4B44A1626E3094D2DCDD276DC99F45EB9AC38F9628557C8BB30E188EE3A8E53EA7BB0BDD8CE4CA6A96F6C989378DD9CDC540F9849B338D4F1A2522E2BF9D0C0208E771F47D2060CF60F63D1D24E0C0FF54B265C269995F2ECDBB66F45CF952BB874F13252199BF800D3E904B66DDE22D790CCACBC5B43F9498B276D7180C61AD8D279E3968873C12A4FB1D47C2E8BEECB7D0885C3F8977FFC2A9CA339445349DCF9FE0770F743BF0537D2E8ACAD1316820A6C6832984E0428F6935A178D6BAD64D6009815B08B2D6AF1A74A650F3BB25A08487CB49261A902A0E24717D172155C5554C402F7D51A6C190FEC54B04E77B15C8B0A629A9265347A7359848647C45DE2743990411A9178047E4F506891E1A111F8CA2B914CA4E0F7D964E18B86A3E2A6B2331640FF77282C559FC9CA618D3CBAC1B8E68C84861089C6C42A927542760557B304C68096C582BE1640F35D255142A8674CB450DACFB96C124E1B8B57399064D6AA28EBAB7249B448496174695951327D39700CADCB58F26637626515E403893AA187D620DD0A523E4A2A99E8FC3799C99AC72EC92BD4592E4CB1E285BB780C5DCB8256E86E58329AE2270419AAE5E9D2564CF4D2F100E12BEBD80DCB1C8A41A5294C52424D620C6ABEC9122DA2FD7A97C58D27B30265B7AC7C7F26D149BD8A62C398A4151588557B60B6BB50F3E4BA85C0A8B03BF43BE43318A5C6A24E3612EAA2CA1CCCEB776BDD6D19E39A6552B2A0AF853A160BC00CE4643C81FEA101D96271307362D22F49FF6A2695118B837E50AEB03CA7BA46E92AB01C515565D59438B1E33D96092BB2E33559433311C4F92CF4B0840DB8141E45FF95017CFF9BDF41FFC53E61177CE60F3E8DCAA67A34D757A3BEA25CF9A10D614F2984AB3961E1654F069C2768BE71BE363B88C2FDCD64BCBA8134276AEA3719F70CB313A06F9116973FE047341617BF2A8B9C8A9F9FC916B063EBB66DD8B3E75DF1875314885847AD8473172E883FD8EFF52A7D912C652D999DC80C3397F885D988DC0E2B4DE06BBBB08A1FF27A34BB899A40806E8CD9634688E9DB996DCB899E67B2DF9BB965FA867389567CE9A35AA014249CC44898AC85C84015B7B72695D658261345EF27F108F943C60A1C997F91B9618A1A01E14402874E9C86D3E7C57E5D01BAB3B31D8970046B972F819DDB2BAF47C939EAB242F97C0D2D905F4C619BCA33CED763CD82C3400F591FF4C326922954949723343282744A5989A9744A5C187DBD7D2282C3BFB352B5CBE94468242C404E77006BC7114C08D0B4AAA8DB40638A5BD9B2B28040B361334EA64DAE07D086A668B54E2773CD9BE51833C74C42CCCDF2DCB3FD9CADADA5449509DB384F78D7142DB18A34E1DCFA3B95BD186CB192F7AD01B3096F34C903F2B69016F6A6E59910ABDA0E27998059A02F11C7CBEFBD07B83C188D46B06CE142AC6F69848F81974C5622DB3EBB1D1EAA70B99588AA176B59C200002000494441544A8653A9ADB7EAC7BAD8E6930D0A1E9131AA77AAAA05B7A44A254F38B6F9B62958A422242F63C35020951B4BA5B44FFE3391057DAB82335BA838107D2B8FC1C98F08905D33952134954B5FF7D839B9A91E0853F4418F4DB92D9E24C6C7462026F792F424EBE0B2B20D66A2F5F2B020FE0E155423B2523D575E4C8BBDD0279A1627B372C9523320C0804A9E089D433211477434029BC705BF2FA8448DF2E2372A38373B6E8E996889A95DA3386B6BBC00ACE92BF3CEF964078B2603EF6A1829C57DCBF38AB3D8A6023493C9241C8F6133B596987F47E7FDDD1603E8565E8CA6D20325809EA0B5AC169775525B831F66A232BA4D0BDAD0CAAC053EA7D229D73DD6B2BCA8B46F9D6822E5E76D486633387BFE026C991C7C2E8FD45C639092BE564FC02DBCD2A686FA3C5798E7A71309118D51E9E7AEBC0FD0F80767ECD9E7F84257072DD50359D921C5C060F591F2586B9072BCD729F6A9CE24404FE55A73DCD493BEFD7881DE499F7C1B1C58F2414FA293AD206D1D50D609C3BFD3C5410BDA7C8A417C12B7BAFE21DA22968398A9A8015A027E0C2A53690BC07FFD7FFE1B962F5A8CC87018DEB24A9D28E14277CF596CBFE30EDCB9658BF8468DAA1D4332A49D31EA9F2458279302E456E1F85B051C8A990A13A53BB3698B8FB1B685354BF146FDF6D7B3A08BAD7BB530CFD946F4868772F11C318B9FB53D67EC2637F1854A003DCDCEB36EFD0D6833838EFC519385772DFEF0346FA94ED37E5049E990D46F9ACE4A805CD1926C52E0522A1A8B1C80A2D1712A87C223A8282B137D5DA67393C3CA238C8297AAFAACB408C827E57B918A56AC716105879BDE029A92C36B0A948C6974F2443EE8695CB274CA4DDE0225809E66078EE79B253B805C595A9EE3595ED3BCD598D394F84B41CC3C341292E29F81B23249736EA96FC48573E7E1F17944E798890375A25B10462414128A6082B5EB48F8B73B108BC551DB508F603020AC0EA584A6E43F09D4CC9A32EF4AD6835534C7EA02B1BA066E2AD74809A067625896AE314B2D5002E86936EC7800CD6C20021B818C9FD9B02E959743952262E0EFECB9B33874FC181A17B420154FA0B3B50DA78E1E930C41568A70D99DE858D88923478FA2AEAA1ABD7D7D7079BDA8AF6F407FEF0052A93436DFB11565015F9E1266A41CCDB65A54C6D269C94023AD8C59571305766E85EDF73487C6B44F2B59D0D36EBA5BF6C41240CF50D7128C0962D44C200F76B6005A158D655202F5A50BEE0B919E908A16AA3E1EDD164AB14D05B64425359391CC37A6A51240D571927655908B66C50DCD85B6BA68CC82C44588C904C69AB68AF49B77B6BA4066A8796F8BCB9400FAB6E8E629BD6409A0A7D45C571F6C0D20F25BE6E253BD6DD62C4802AA56CE20406B61CD7C0AB9911CA59B4280D65A0DC60644A2AA24BC646BE553CE553ABB4864E44B5816825086FD20A0AE858F247B52CB92F25AC6AD635A68D6DEFF06FB6B3E9F5E02E8F9DC3B73F36C2580BEC1762FA6E1916A57CC85BEC15B149DAEC0548B78A8EF44D45CFFA9F0ABF89FA5CC914EAAC9D91C484B00308CAACA0A5551C5304344B7208FFD63EE399E7FD9FCCD148965050FBA3EA839AC123C8A8A6799E7D3572EE61F144A45E5F3CD67B6D96E82AB9500FA26E8A4DFF02396007A861BDC50EDC6E34FCFF0AD267DB9313441B2394642280F96E54154828E26496E8ACC2D452AC921958C21121D85D3E182D71380D3E156863E038E22FE220E10A4346E6BC551956A4E811DA5954F6D1F75AC9D9AD953CBC49B7483CCD3034B003D4F3B660E1FAB04D033DCF804682A9229C3562BD7CD315FD500B4E1F3D2EAA51605F526ACFCDAE96886280F8A29EB45E1A034E2B1246C70C0E5768A6605019A40CE2A3323992C2EF40E4BE180B6A66A29BCEAA67FDC4E7FBA5200536A6374B694007A868767E97237590B94007A863B8C3E68037C6233E66BCBCDF08DA670B9F1AC7972B6456ED3A974EDC663A54CFE16AA0289127C547E12EADDC61371245953D01780D3EBC5403C8BE7DF7807EB37AE432E67C7A1437BF1D0D64D68F0B9A418822885DA00D670A6C0A8FC4DC07AF24F72331F59B2A06FE6DE9B9D672F01F40CB76B71B2CA0C5F7E5A97B32E12E67713E4334560A76DED8BAE74415C9EE66F867F73A8EA8B84EBBED028467276ECDCBB17F7AC5D85D75F7D1D2E8F1FEB36AFC3C5C110362C5B8C2A560897E2ADCA8266F92829212562CED37AED9BEEA41240DF745D36EB0F5C02E8196E6266E0314DDA6413CEF0E5A775B9F1AC6332304899E3B31AC6C5B4981746685F287DF435EB5AD976554ED59EB3210507F6749F43657D2D9EFEFAD77062EF5E291EBB66FB76DCF1F08368696C407B3028AE0E8A3C29A399D7D3003DADB7BEF94E2A01F4CDD767B3FDC425809EE116264093CD605C07337CF9295F6E3C178B016CFAA14DE6E3F45D1CA68E84922A356C92942DC73A332AA1060EEC3C7556CA81FDC3DFFE0D52434352F1C35F5B830FFFD193527B6D6159995479518145FEDF5AB571CAAF7D539E5002E89BB2DB66F5A14B003DC3CDCBD4685AA2E406CF07FFF3F55E8F6E0E060CE98BBE118036C40B870168913FA5059C819DA5916C0E1CE91B40286B43F4EC09FCE85BDF46CAE6C0273EF3243CE565686B6E424B30080F83A9363A4C9870C37257AA74932A7BA54CEBF9DEA637329C4A007D23AD776B9E5B02E819EE5702343FB44CE7339898E413FACCC93A993E4093C1ACA279768B059D11F74656AC6A7AA2230EE09DE3A7E1CCD8A550261CD40109A1A1A61A0D15E5F0650027D270FB58C8B650A74DD5189C3F8C98191E2E632E5702E8D96CDD9BF3DA25809EE17EA3554A3A9BD1E398E1CBCFE8E508CAF443935E478B7F3A343BB16A55F959458AD385392570486E9D9423714AA1DD880DE8198AA06F98453FB368A872A221E8878F7CE764024C7661F517BBC30D5F59B958CD4CA62157DA2C28B351A166461BF5062E5602E81B68BC5BF4D41240CF70C7524B999A1CF443CFE78F951BCD92F046C77A5A81428168165BE5870439C5FF2EA49203F17406C28ED66E6A661BBA1C0E24924978DC4E7825638595AAED48A6D2181989C11F08C0E37628A0B66426CEE79DC98DF47909A06FA4F56ECD734B003DC3FD4A70A69B837EDDF9FE3140C76021B53424A964AA493512D0E37F8CFCBF726908574EFEAE3CD4274E9C444F6F1F9C1E17B2A92C464722707ABC48A692D8B67533AA2ACB15C06773C8E9B2F3F1585C0AB3129CE93232CC98293FE37CEF08FD7C2580BE493AEA37F89825809EE1C6A606B300B485BE26B7986755EF0D38936E47970C5D3356CADDA49B45A7702BD6055F936CE6029B239D49C2E9B08B46F595DE5E641C7604BC7E5CB9D8076FB00C417F104D8D8DA8A9AF103C27B52E6DCB81C503E8DEE0731AA9535E9F4A8104EC5B11A44B003DE95177DB1C5802E8A974B555DCDD923C61FD73329311B00BFAFC4A5FD97C69C488A672BF593CD6EA2620405326957E68D203AD99877C84EB82613EDB4FB12E5426216491E275699567695D4BB517269DD8904EA5E55E69967EC9D13542DD0D31B945BB2393C9C1E3750B485B1368D8AED4A436D44029726B49A737CF5DCCF8B8BE4BC4D4332F6A6C595055CD47F529127F9A85BE2901F42C34EA4D7EC912404FA5032701D04C714EC4130888A8BDAEAAAD05DA04EC4CE6F23C4863B60217F9DB0C6C5AEB104EA66972192D86A45F8EA04C3FFCC1830705A409C495D54A7E95F770D89CF27D474787042859099D1F1EC7E359328C7FDBB871832E0CA09E82CF6A0284046AFE10A0B9009867B61674B51E7FFD45462F0C5A30CA9AB5486D10531E8121D0D986E912404F66C4DD5EC794007A26FB9BA4854C0A89780C5EBA3838A96DF4C92A43DAAAE85950C89FC90798DAB5AC004D3EF478C506260AC81980A6B4A9CDC1C20039E1565FB97225CF05F7FA7D02D02CBB655205E9AA20C0864221B1B41954E5F7F4DD13A819B474BB0B3A21069CADCF43D707419E7FE37956D7C778155FC66F1D0B40171DA0722255FD1AF399CDACF312404F6DFCDE0E4797007AA25E2EB274C7357CF3967516D96C1AC958141E5AD0B2A5D75A125A4FD3EAF1986D8B6CC257D362FE86036D849EA69AA67E3D0EB5F9AED88A35B439E3A230006C9EB9D85D617D97E2CADCF4A313E8CD0EC05A3791D7BD5EE56E063195753C8E725E7167E5B73F13B5ECF4BE2F01F4F4DAED563EAB04D013F5AE0591D5AF053F47DE9AB2B83ED2C8201A8BC1EFF5499AB35D978FD21B75E566D59C07A5FD3677A29AC5C04AD783958132195E74F1358AFDD7E67BABFBA1B8C98B7DDC56501FAF7BAC3E662BA01BBF37CFA7DB43AAC6E8CFB5FCE88AC32DCB47C1BB91EF4F4BC74A9184F10B1A4C348426FB7D09A027DB52B7CF7125809EA8AFC705E8F1405A995729E4309A88C3E7F6C061B70B2B586D904D42B43A379F1E6D580F133DC72C7C6F054203ACA6649760D124D2ABAD2E072B388F17A81B2F8837DE7DAE17A4B45ADEC6FAB6360DAD651EC360227FA7EBA3B81C97F5F8AB764479B68D4563644CDBCF5EB0B004D0B330C86FF24B96007A8A1D68B2E6789A04A2A4DC9465D2E67222864FBFAB436B2D4BC2861CA73DD1628CCDF27E798AEF650E3756287DC213F99FA7798B593FCD3C377DD4EC0B5AEF7C1FFEDF6AC9E7AD6A6BF0577CCE5971955B774CAAB7E88D2E2CB933FD2225809EE916BDF9AF5702E829F7A1AA966D009A55B47359BA9AB566443687682402B7CFA3009A3430D6E8337503CDFDE6273E0BE7D854ED9E8C8B63CACD37CB2714FBBC6945D3476D44AC4823B4BA3ED83FB25ECADAC98E540FC8725BAA9F0D52AB4C49F6F76C51EE4A003DCB83E326BC7C09A0A7DC69868FA10CE29C8DAAC7850FFF363A1A85973C5E97531C180EEA49181030C6B3A98D3AE5FBCFEE09C63DC0809B0916DECC96747E3D24FF5A2711193A9FDBEAA336002D9DCA4D9143E2BB795F14B368F81DB31C6789CA5102E8D91DDB37E3D54B003D41AF8DF151CA3F74296CAAB4D9548233FF4C904E01188E27D133144620E0811740655940643419AE72C8CCCF68494D05EB36A9CE377B7ECDE90C4A23A06414F9E439AF91026EF50E5C13B72675D0749E74E273C66370F06FA4F491B35E565E26B10229D42506B32AD9C5BE550571351EEB55587F3DF18DA7714409A0A7D168B7F82925809E0E406B6835004D90E64FCFC030BA2EF58A9CA6CDE1442A1E466D552516B734C26BB7C325842E65818B9F53409B5CDF5932C9A63978E9122080B1B6E244D6F3A4B07752074DF361AF715A71F0D27A98718310A8A3B1A8542527487B3D3ED8EC0EA419ECB501896C0E83A151E99DAA8A3278EC904577B696D31240CFEC18B815AE5602E849F4623EB06FBC1BC64F490D376E9DA10A9DBEF8EA9B58BB7C09FEF95FBE89BEFE213CF0E0FD685AD08CC59DED68282B1B135E329762C8693E7D8CC549853B02343FD7F3454F0A7B2775D0CCB5C2F51695620A1F2DE44C3A85442226198E4E8F1F769F1FFD8924DED97F0CAD0B5A64493D77E132B6AD5D8A16AF47F63CB3F12901F46CB4EACD7DCD12404FA2FF8C8F592CA7BCC3593996397913B0A1BB7F08499B1D075F7F01BFFAD92FE074FAE1F6FAF0E93FFD335435D661456550009A60EED417319C80493CC26FF410436523E58E62FEFCDC8AE2447C2F05E6EC45A51712198921E1F4E357474E63695B1DCE1E7A57AAE02E5AB319DD1707F1E8A64570CB79DCF764158BBDD8FD9367804C6D6F5402E8DFE830BF296E5602E889BA490281AA6A88C32032E733C199FE64FA9E6D0E9C190C61289E40CFA177F1A36F7F172E7719BCC1203EF1277F8CDAC63A2CAD2C136706CF7011A0C5AA9CBD80D344AF75ADEFAD892704686A631851A2E95E733E9F9767A5E748AD53443A56217FBBEB22BA8FEEC3AE177F2D0C9C3B1F7C1F16AD5E8FF56D8D68AC2A17C287685B67B54A8715A44B003D9FBBFCA67AB612404FD45D1AA055C5106D328B4999138026ED2A95B149B5909FBDF81A1EBE730B7EFCF42F70EAD4593CF1074F2096CBA2A5A906AD01BF00B4C2760274A1FAC83C73414B8207AD426A6A70DB7F33685B4FD48DD75C90C48C368B300BDC02A7CE5D44042E3CF3F40F71E6C841E9F98E356BF1D8473F8A402A8E651D6D63005A78EE9682027966DE14A30B250B7ABABD78EB9E5702E889FA561CD08AFB2C006DFD64538AE76C73220AC8CFD32FBE8375EB57A3CC039C3F3F840A6F166B172E40402E439EAD11E7516C81F9F6B1EA5C18195293E431DF9E75269EC7107378AD34C3833607A2391B7EFAC67E789221BCFEE39F206B4BE3C18F7E14596F2D1EDDB61A7E870A148A58613E09493FCD0D746909A067A2476FAD6B94007AD2FD5910D511039A90CD124D02DD0EF13F4BDDBD641A272FF48AAA5D536D2DAA7C4E547A9C70093F4B93F2728AB921D87F03137AD28F3E8503AD2E0EC3896662C7F5D2A5A770F97976A8E23C4B48C06E439A01432A12DA8077BB2E49828B239744DA9645C6EE83D7E1C4868E46786C86D7AE3344B5152E2F7703FD5902E879363CE6C1E394007AD29DA0B41914518EB6744E2CE2443402A7D383ACC30D386C18BC7C11D54D8DC2EEE077B97416E5C14021C59841252280F9CC16676BD2EF35F64063110A38391C79E1FDF95E63717AAF9B55456DB5EA2001DAEC6F12D92C2E8422E8EA1B40DA6147675D2DDA825EF8EC7671555DB5FF1943989FDED394007A7AED762B9F550268DDBBC5023D6214C9F65523A82498D0BAB24B028383209DCBE1E8A1FD0804CA70E0E8710C0C0E03E918BC5555188AC551E3F320319A462E63436363191219E0FE071F40D0E316BB9B0129A9BAA2EF657D86626ADB447CE4D918A4C6DDD1DFDF2F6C8E6269D09B9FD9C1588062A3A7533964722995B4428952BB5D76430E9703996C066E9B1D4E5958D542ED70D891CD64A4028D18CE33B0152A01F46C8CE29BFB9A2580B600B4E9CAB12A6F045143C5CA491203B3CD582FCF9ECB22343488442A85482481742687642282ACCB0587D78B0A9F13BD97FA61B3B91008DA90B5BBB0A07D217C76FAA21990A2F48ED282306048CBB558D06732AA72B3310CCDA2C0CC427E98FE6D05A3B9583466F63D09B6196433361C3C7814239161783D1E24936994955762A06F00EBD6ACC6C123FBE1F5FAE1B0BB108B45A57F183CADA9A9C2D2254B44DB6326744B4A003DB3BD7B2B5CAD04D0E3F42281872A68CCA66B6C6A96ED6C321EE35486D3EB13800EF50FA2B6A61A9954020EB70BB99C1D67CE9C457D4D35E07221924CA1B6C28FD1D1B854AF8E448690CED9110C94C14F710E5A5D0E97A4178B2A9E5D552329063D8233C19B9F9900818906ED78A0CBFB0F0F0F4BE20A9F6726ACC5899EE337F37D16E96C4ACA70ED7A6737B28E1C1C4E3772193B62D151786C2EAC59B91A5D67BB91CA6570BAFB0C92F128962D592AAE9FCE85EDA8AAACBABA40F0341FBE04D0D36CB85BF8B412405B2C68034E2CFD646AEA657376F83D2EB43636E0F4F93392FEEBF397C3E370A1A6AA02E7CE9E41341583D3E14664348A7BEFBD1B23A1118C44A2B878FE22CACBAB104BA6104DC450555189442C86546C14B5755588C66358B7661D76EFDE23E04B4B95BC633E074B3EAD5AB5529771D24AA5BFC1A0A2D5DD62CA55B1FEDF1825B85B60629894FB4C96E9DE36449369715BA42351785D5EA11A3A6C0E649D392499CB92CDC0EF758D0D9A1A2687B53DA6E1932E01F42D30A066F8154A005DE4E22030D162649286DD413E95134EE4E07739D1171A009C1E9ABEA04E9DD36EC795DECBA8ACAB123F66369313AB3AC98AD699AC54AF26B8C59369610890C9918AC7E1F6B8E91F91EB5704CBC452A7C4A7CBA500301E67856D2F2A2ACAB5756D53996B37C01098CAB829D6B1E03B50098E0B171790E2925353B9F67C3B568BD7A9B6CDA470E8D009D89C6E74779F40477B3B7A2EF5A2A23C80F2CA4AA4B34082C5187C5E2C5EBC080E27DD5F6AE72372B225809E6FDD7BD33F4F09A08BBA708C5603DD0B742D307143A76767ED0E49F0A50F9AEE896C2E839CC386483406AFC72BA0ABE4451904A4C75A4DDC0C7248C69270D9E89F760BE14E94D278ACD6F2379AFED6FF67A9256DA79B4351BA7E13205DB09E0B8B026B2D46225111BE77389CD75830741EBC296070D582925735993F13475BBA2C7ACBC4A3C84804FDFDC328AF2BC7C8E808827E1F92B151385C6EA45336B83C1E64D259D4D5D5283956FD8E2C5D5602E8F9D3ADB7CA9394007A829E2C408AA49B15F4DBB5EF98C4BB6C2E87583C86803FA04094D79413AD4AD14A00BAAFAF0F35B5B5CA8F6B8E9D57A389CC06C55C3165F814F92C8B4874146E97072E3BAB746BFAB0A4BC2BAD649B2DAD45B259A84083974E7B56893EE48D5391E437B415986ABB16893AA9BE37B256BCD8EC72224B2E8EA976D8AD7F7C09A06FA08F8DA5C9883E5D14DCFE5FEFC3E3E9D3A4ABA0BCBC5C0E9D6F013705A4053109EA9088FD9F03E8A70D87A3A8AEA840369785CD9E838D991DDC55D8B8ABE07159D88487E82E54275170AF417C7641EE06BA73CE4F2D01F49C77C1BC7B801240DF4097185F2C7DC8F41D338836990FFDDB1315339DCC7566E3987C6C6BCC2F6AF7C03250DCFED75697C366CF22934DC341956B9B036956D2D68C13BB3DA74B4631A14771879539AE2DE7796A40CF467B4EE59A25809E4A6BDD1EC796007A9AFD6CF555533BB9AAAAEABA1434636D13D445285E3336E69B05ADCB2D5ABC10668BCF6018039F718C8E2624804981A074D626AA6ECCAA64520FDD3D4A9F44E5E411A045313B67716D94007ADC515702E8694EC65BF8B412404FB3738DF54CA0E5EF8180F23F4FE4E2E0314C46E17953B1BAA7F998533F4D6B5118DF3B839DF46F30304A39215AD197C254B8F34B709330ECCB66E191231CF2BDF2DD98D2BA5ABD4FDC26CAEF5EFA8CDF0225802E8D8CE2162801F434C784B1A0E9AEA0F52C9834098036B7236D8D205D515131CD2798ADD314181B4D0A072D6206426D368CC67B319208E1DC6800478F9F83DBE1823FE0C5C39B57239849C12602C95AA5420AAF2A0057556398B5A7407CDE060967AB492779DD12404FB2A16EA3C34A003DCDCE36597F23232302B246A7E29AC555753283D5D5C1602113546849179F3711D84FF3B1FFFFF6AEAC398EEB3A7FD33D1B96198000487011297011C5454B28D9946C2596652B6549919D384EB9E24A2AE507975FF2903757C50FCEB32B3F2029BFA4EC2CAE9415DB522A2E57D90E1D45916849259292B883A448821B4080008101304B77A7BE7BFB0E9A43806800B3F4A04FAB280033B7FB9EFECE9DAFCF9C7B96079FA6FCCEBA7810CB4E68AFB1F61F97130E4E9C7F0397478F6143F717F0D0A603AA1605D269DCB8318AC38FED43C6D6354A74F08A1FF15235987524882ED92A1B858B294208BA21ABBAAD2F2A04BD06F5D102662CACD91C0C43AAC124109342CD880E15531B38C25C6B0DA22F79AA8EE208C4D825748954D2EBD9B10F7179E202B2B35BF0A31FFC18A55219CF3CF71C9E7EEE796CDDB6111BBBBB90F12A2AB1878DBD8CA5ACC3F5745D4F4DD0E2E610826EC4EA5D7FD714825E834E19BDC10242B482550534D75DB25E466D9D65E31261781EDD1D4C0059CE0A5F83A8A14E5D080366BC327DC624D38A8AE7F6BC044E5CBB854C5F0FFEE39FFE05E78E1D43D24A209BCDE0EBDFFE1B6CDAB90DDBBAB2E88483A44AD04901AE6F29FB8D6884961FAC06B1A0432DD3580D12825EA5BAB9D1471785215643B8612F67089B3F49F4DC640C43F461AFBFFA71B495FD2D4245D0BA0B8C0B1B97278BB83659C4F8A55378ED9F7F849495C0D0DE3D78F14FFE14835B366273AE0B698F232BB012C985D03A61E650EA10820E0553AC060941AF52DDA65F9F21E80759CF668AA0156D5E23D1D382E6F548D2E6688D8B43BB21E8E470FD08668B49277C95858400FCDF893340CA4269BA8099A949EC7EFC494C8FDFC6A30F6DC240BE473936D4366095947D67F62A718ED36942D071D276B87B15820E87D37DA30A05765249AAAA66A604E783EA232F46E086B04D71A6818181FBCA8DAE52BC559EA60BD8B3294145D5AA066CDDB81CAE0D94E161D671706A7C12274F5F82532C61DBB687F0CCEECDE84B02535333C877E7914EA5AA6E666E369A2DC10856E258254E8D394D08BA31B8B6F35585A097D15E2DE91A526597918D1B37D6A5B29B890861C20BCB8CB6D68AD6511B7EC2B70EEA60E127063DB3671F8B3EF9A9E0D38522F2DD19A4548719864BBB989ABAABFCF2A95452557A73136C4BA0CD6926B2E83C1656E7D3B5AF9B51E3BA5D3EA042D0EDA2A9E6C92904BD0AACB9B1C7FA1BA676F35A36F7826E0FFAA26991332A24485C8BB946562176F853FC56D79E5F418FAC5A761C5CBA7409A363A3E8DDD087D9B979CC146690EBEC84C3D2AA95320E1F3EAC8899D12D74DB64B359A4553303D35C9517B6EE0B297CD0378FF042B7FF4821E8F6D761BDEF40083A24A2411261720AC999A171C17654DA4A5CDD8E984901A7EB84D76EA56559BD57538AD3F354079123478EA822AAF3C5B2AA913AB87933CE9D3A8D6DDBB6A96251AFBCF20A9249EDD0A06F9D0F1C62A41F644C05E73B0B31D04D7FF084D475AB860941B70AF9E8CE2B041D4237412221F1303985D9838BB93F5643D00BF5973D657D1A2BBA5ED70F718BD5219A933DD57040974ED52DAED83895244CAB982DBFE8B5989D2F229B4C2952360D0554E2A1DF63918D5519E962AAF79987CEFA6A9BB512741F3C5608BA7E58AE972B094187D4A4214B5A923C4854F5F86A1E24E7A0E5C9ECC4DAE6B121455DD3304759BA09CC4C4F63F4D6A8DA0865A623AD60126DB15452644CD7F486BE0D9818BD8D64D2561D60D86D84E75A960DC7A9A807CDC040BFC2890F1EDE8FA959C26F0C613657D774336D76B210749B29AC09E20A41AF10645ACFDC04237105ADE5B59275B0AB371F022605DC34935D8B9F7B25B7A802ED5C17C3178671E9C245B56939323282679F7D16D7AE5FC3E8D818F2B95E942B15ECDAB513273FFA58954E257953C6DEDE0D989D2D28421E1A1AC2BE7D8FFA1D615C65819BFA23C46FAD98ADE4BEDA61AC10743B68A9B9320A4187C0DB100937BE4832267B30C4A9AB1EC2880E6345378B9CB57363E1A8F5A607DF33A3CE9F1B56FDF9745B2E761E27C1EB9F8B1DC645440C4D03DAA01FBF99F7BA6AE534E84421E80601DBC69715825E4679411704C985D66D98D2A26B5D132605DC3C0C9A656D3E88A06B099C7FDF1E63B8E1BDF1DBCB35B835F5B0F9D37C1B09E265489AAFADC6A7BF56EC5B75BE1074AB908FEEBC42D02175438234AE0786C1359A386A53C01B3D9F81613982AE1D37363AAAE2C16BADE0A5600D3E68983D4997870EC74B575D1E718D8F16820EF9618CD13021E810CA36A4C2E4149348D268C2E49CB4A24962C178EB10E23675C89D3BDA15C32494B0EE09DE5B30B392E1787C8D81BB162900001A4049444154BE6C1E41BF7BA3716E2A58CB4C26041D256D44431621E8902E0E12E5CCCC0C7A7B7B1B6E3D2B57821FAF363535A50A329994F2482C9B8099CD64954C86A1763AE5DDC8BE40ACF77AB24D0661ED06ABA96DC2CD4315CA1733F706EF57083A12AB3B524208418750074985C92941726EB4656708DAD48CEEEBEB8B0E690508BA582AC2F39C6AD8E1BDC41A68141BC03918571E246CFECE68106669126B7DC326E93C5C0250B5DE47B5E9ED92CE167F4B343ACD0384A0437C18633644083A84C26B49B2591B76C61A25617183921B6AB59665ABB3F118D912DC385D0B36C158735EB3B3AB03764AF56841C2D3ED6735267E2D269641F51C15776DBA863B7E7126DDD5C5EF0DC0D2D6E6CFEA2FAC2A42F28F4E871721E8101FC6980D11820EA17013E35B1B1616E2D4350D0986F791B0160BEF6BB425BFDC0DD48BA0CD83C63C94F850E43DB31A5E67A60349CB062B9F7A16EB53EB46B696B2AEB5CDECB239804532D76F576B5A93867DD7CBBD36B85FA62F421D5E84A0975B6DF17B5F087A199D932848D0246753507F2D5662D825169C83BFB34607FDD0C1F2A6E65ACD906729B949D0C4871B7C613709578241B154C1FCCC3C726C6890B6E0582E1C38AA821E6BEB59245FC743C54AC24BD848A9668A34B17557716D25F3BFE8B83296BA7F21E8B02B233EE384A043103443C1B851D78AD4EBA04539393909FAA2A354AED324EF045B76D5BA61C27C9C82BEE885FB634D265AC71EEE4C4EA033DB815436A34A9E6694554CFAF52D68DFCD61AB9EB7B49A3D382A21DDD38D6C49D0EC101374778411AC896384A09B08769B4C2504BD8CA21A69213E68EA60828C2169F595DF4FEEA86D32DBAAF5669277D6DA53B1F67E15492B9F06E0D97464B8281766E114CBE84877C29A9CC24CAE1B1FDD1E8753B1D0DDDD851D9B7BD063695BD94DF00C36A97591ACF657A475AD9D22EA21D22AD0969857083A620A89803842D0CB28C1902209886444626C864BA136D2C158A5B4A2E94E08D6B268863C4BC164B202CD378CD5CAB2E879BA3088F24393582DCF815BACE0CCAF8EA0F0FE47B832B811BBFEFCAB48A73398B85BC4D8CD51BCFCF45ED53C8087A5AC67DDC04B9739D5512542D011601E1121140242D03E4CB504114C4E09B6A2325FC55B55AF99F1C2B5F5405AB951687CF48C5D262675F743935B13AC7CC74DBD0AFB6E61E49D6378EB07FF86A12F7D0EBF99B88AD3A72FE095575FC5F6471E452A9DC6C19DDB91F4808C4FD2FEAEE1424847A0E64894AC68B1A0437156AC06094107D45D1BB2468B99C929CC9433C76A2DC47AAD2ACE4F994CC81D2DE9561FDCC0E4266AB081417D64F254E406095A15FCE77F151709D7C66FDF38824287837FFFD98F91B26C58C92CFEF6EFBE87A367CFE3A5E77F1F6CBF9BF1DB75293F89652C671DACA77DD7B4A7A343D142D0F55935EBE92A42D035041DCC8633A5455927224A046D6A58F0C1611E18ADB4A2F9C0A0056DFCE2F594457B925D381E89D456D11BE504F0AFBFFD0076E90E7EFDDA6B48C38395CEE23BDFFB2EDE3B731E2F3FFF1C3A01A41CBFBBB89F2F73AF6B43C778043BBCB4FA832D04DD6A0D446F7E21E8808BA3563D2CF969A226A2A23A43C84C01A7151D2C32D42A190D411B6BBE6EDF32940F5A7B265C8B492934842D14011CB97C133DD92CDEFFCFD771E3E2653CF3D21F22BFE361F4D8C081ED5BC1472ADD1C2AAB4539A46B7DCF42D0AD5A2F326F780484A06BB0326E0E5AA9FCC7D2A2513B8C1F9CE9E76CBDD52A7F387131E9D92646BBDE998D2E5D1ACAB74DA704D9DAA6271AA3E5124E5F1A41A2C2C24B36BC149D15653CB76F0FD2AA73B8870493597C4786DA1C24D157B70B75B28B6ADF1591432CE88828224262C490A01D95286C2A3C2CE8827E4EDD7D9A9FDB994201D94C56258698C35460AB9B85B88A85A0E6A6FC1E502A1751AE94D1D1D5093B9888E117A4A8D6A558C53C614FA13CDCB4646E08FDD024418561E0026BF1F2BABC515ACE34A399BFCD8C410FA8242B982C7B98982B29C24E5B16367565D1AD1257D831C090B4329F75F44640109277D5C5B11601C30215629C1074089062362486043DEFB99ECE3A5309673A820B0C0FD0A462A970BAB95211D94C17526C0DA238628172AA7EEA45164BA33FEB7E029D929B8D5DA79D0252D9343ABC8CDEEE523B601E5C2678D0DE24AF3570512B1F71C5C5EC0CBB91F7E8441076555173EAFF2B7AE48B46BE15C85345DD4FDF666CF4ECDCBCAAD151745C541C0756D2865B7190B26D589E07DBB254424B523D6CFD4C421F8460BCB5DA206C24382BB84F0E15825E216031181E3F82764A9E972041EBBD7C9D154CEBCAC31C803BA5044AAE834ECB435FCA46CAB706FD720EF72D89A0A5B80AFE59E11273E0B03810237C5D5B65D9158A05D5713BD799F71F24FE25FD74676579369085B48BD7C3E4C4846A22ABFE4C300259BFAEC43024A84CFA9531A28AE2F04FE35CACC97DFEFCB0B2DAF9CF7CAB617C38372A1DD7433A93C60B9F7F1EDD5D9D7ED956F59D434B44B787C52EE47E14C70AE559A1C256345C087A4570C562700C095A9954CA22AE241CD82E29CCC254A582B74F7C023BD78B59670E994A199F3D38847C92E6203FD40BC4122C36DFDC55C2788692AEDC9648AB9F9EE3E2CED42472FD7DCA5E65B43013356CD6AB509974FCAB717E568FB58B2C6074EC16FAD95945398F74D1A2FBFD1CC6031C1E35B3CFA7FDEE50DDC2C7C66EABCD517ED3E1CFF1F171B0E8FFF6EDDBAB354B060737AAA812EA8AE7A5923AC1887F47250BB3160521E8F0EB222E23E347D06ED9D33519ACEAA6D1BCE7E167EF7D8CBD9B3701E3D3B0520914B2294C958117F7EF40B65A70472F8B051FB4F16306974BE3C850CDEDB8EAE162D92CB1E9A09CB031512CE1BDE14F7073741CE9640AFBF6EFC2EEDE1C3624696B9B0CBAC62D69D22EBB7DB3F5959A8D66AFB14C83D6B311610546343339B9594BAB9751222457A6DF1B1D9070E9FBE6181E2A3BDCF3E0382E52295BFD549BA89EEE7F58CF4EECF5465408BADE88B6FFF56247D0AE57F1122A77D8521667C90246A6A770EA93EB18F9E863BCFD8B5F2291B4F1F9AF7D155D5BB6E0C583FBD1D7A1E3A095CFD22F466CD21DEE351339AAC1046DC2CEE0AA99EE3816FEF7E333D890EFC0F8C83564D25964FB7B91B5D27862E73674FAB5291AB354751C1C6DE6F1094694F4FBFE66E35509FA277C095640CE3CE3F8F1E3CAADC1547292F1D0D010AE5DBBA67A199A10C303070EE0F2E5CBEAFD99C29C7275D0E5C15661C5E2BCB2E653A9243EF399CFDCE3DED0AE93150AD41820D55585A01B086E9B5E3A7604ED798EB6A05D4DADF33670FCF20564D33DF8C90F7F885B978651725C3CF2F4A7F0C24B2FE1E1AE0E3CB471A06A102E94AF34DFE16BBDD08D25680ACD4240CA8AF62C1CBD740D76BE0BFFF3D39FE3D4BBBF83E759F883975FC29E834F62E7F64DD8D29DC5421C4ABD57A99FE1974860FA6E011D1DDDB06C0B3458B57BE3DE5863E59959A108CC5234444A2B59F9991D47FD23B9F21F236D6855F3A828CB39892B5746B075EB163F0E5A47E7B086496D8D1321E8152A4486371581F811B44317874D96536CE1D8C0E8DC1C8E9E1DC19DEB17F1D61BAFAB68802F7CEDCF90E8DE882F1DDA87EE944E90B827BCCE2440282B2C48D2F78E0BB31915BC6EEDEF55AF80BFA9692C56156DE2026F0E5F44DF96417CFF3BDF45D6E1A69987C16D5BF1EA37BE892DDB366247AE53D5A45074A9FCB87A93CCFC1DB61BF762ABD2E4913072A2529855E9D8E9EE2E78094BF9C22D86C7298B9F51257456536A53CAA8A9EBBC2D26130BBA2DD4D454216347D0954A850E5C05B2CD0D242B81622281374F5D40AAA313B3B76FA22399423ADF07B752C1338FEE408A9B4B9E0B5B75F530A163A6978776B71A2226411A023485831EF455BAD6A20BA66ED7BEA7B600FD5E4E092F05D74DE0DDEB37E0E57378EFF537F0FE7F1F612D21FCF15F7C039BB7EFC2EEED8318ECEC408AF6B61FE35DBBBA6AE75BA945A9D0703D788EA3DC0E9DB96E1D2143EB9658F077D74182CF4446A024583BA4C1DF329AFA11AADF6442D0F5C372BD5C2976045D743D8F2E02C619247DE2752C1B775D17C33727706D6C1C5EB18C3DDBB762E7602FBA98C5E617EA0916D8B9A76A9BB2A6FD98DB6032842A36CF4A6CFAABF8830EBDB1C5FE7ABA225CF058207A96DE2C29D746C24DC3F312B8E539F8AFA3EFE185279FC4F4AD51D8691BE57C0FEE8EDDC2A71FD98DB40B24594FD9B7F88316B491CDCCB5AA080707A824B42F7F62721A03BD39F50C49D38BE4D2B5A0BF61A8C817858358D04BAD0321E8F542ABF5BB8FD811B4532E79A53289308D644A87A9D16FCA2E1DC58AA3FADAD95602F3C522D2990C922467CF53197B3A1A2001DB4EAAAFF30CBD23499284186D40FF68B95442369B51244BBFE872D5E64C8D69E372A8256665A092DC2CCBFF99D08CE827CC955300BDB4BF7CFB0394ED349C7209DB37E4F0E9038FA033E122AD73F096B5A06B5D1EA1961823265C4DCEA373B3B83D5F462E6D63534727BA123A7E84563FBD49B4AA19CE28F4BC34B242D0A1565DAC06C58EA0DF79EB4DAFEC59982FBBD8D0DD85345B28792E1EEADB80B3C39750283BE8EAC860B23087439F7A1297872FAA780FC6DAB22EF4DCDC3C2C2B895CAE1BB3B373EAB57C3E8777DF7D1F5BB76E4661661ACF3FFFB9257DBD8BB9188C551BB46883196F869C9565ED5BEB8C70D639282E2A4880B10A455D551359A63E7313112E6C4FC7FFF261622C5A3FDD5089A25FD316BBB6F4C3AF7FBA37E65DE0D2AD314C4C4F31425B65EF95E74A38F4E81EE4D84351E703F9BB830B73859F253E2385A0E3A3EBB0771A3B823E76FC032FDD95C3F0C54FB03197836301C96C12071EDA815FFDFA0886F63D8EE93B13C8E63AB067EF2338FDE10994E68B2ACC8B110503031B71777A468578CDCFCD2397EFC19E3DBB70ECF80995A4D1D991C5534F1DBACF0FBD948B23E802A10FF7CC9933B87AF52ABEF8C52FE2ECD9B38A34E7E78BE8EFEF53997367CE9CC281271EC77CC9414F771ED9245D301EAE5C1D455F6F2F7A7ABAF1D63BEFE0D52FBF823367CEA2B7B717232323989E99C1407FBF8A6450E9D18904F2F9BCFA66307C7E18F99E3C7AF23D3870605FD8B5A3FCDD57666671E5CA75607E16AFFDF4A718DABD0B2FFFD1CB3871F23CBEF2C267D1415F3F5DE7DC3134E53D57F010082DCC3A182804BD0E9458E75B881D41BB9E3AE0F9BE61137FA1929395C354D7DE60FA343710932A7A630175638D9A6408DDE95B338EAB7A946A3FB2B1481F14D6A532DB54676A3D7EA630AB48F9DCB97378F699CFAA9F2CE5D9D7D78F2B97AFE0C9DF7B0263A3373172ED1A868676E2EEDD02FAFA362093C9E2C30F3F52963C93360A85691C3A7408BF7BF71DCCCE16B17DC70EDD5ED571914C25512C95D099CDA23B9753216AE7CF9D4757771776EFDA8D271E3FA8657F805B44B94318430EE0DC5411E3D7AFE3C7FFF07DCC95CA989DAFE0AFBEF5D7E87BF800B6E69318CAA702F54E74FCB91C8B2320042D2BA31681D811F4F9F3E715DDD267FCF0C30FAB9FB48C754AB0A732D5F81A7DC76AD38C111D696EC84195F6BC79F326CAE5922236BA0776ECD881EBD7AFA9F7151907089AE7F3DCAD5BB7AAEBD586B4A90705133DFCD03766C1954A25B559D891ED52F3738E4A85B66A02994C0A6EB9A21F1EA43A5BC56720954EE1D2A54FB065EB566432695520890366E70AB06D1D23CCAA70D94C465DB352D131C4B69D50F75729B350947E0A7564B2DACD714F18E1FD26AF8A21077072BC88C2CDEBF8C93FFE3DE6E6CB28961DBCFAF5BFC4C3879EC54036815D799DFDC7F99547463609976421216821E8D813F49B6FBEE99168E92E2041D34265F17B5A9EFC9D044942E9EFEFC7F0F030BA733DEA3DFEA3BBE0C2850BAA4634098EE43B3838A8B2DD98B5A6D28ED34945DE263D99AF1D3C78F0BEBAD224653E08CE5F3887E9BBD3CA821D18D88472A98C8A538153F1303D338DFDFBF6A154AA2837453269034E45B9288676EEC2E8E82892A9140A73F3B83B7D57F9C39939373D39A52C6B1AE6A964466F5E96CB608718DE1BFFBE78F1220E1F3E8C1B376E546B3A531E62532997D0D1915561737BF7EE55F7597B180BFAF2DD026E5D1BC5AD8BC3F8F9EBBFC0F6A11DF8D6B7BF89B73F3C872F7FFE307A1823CE8D54B5A1BAE25A49B1FAC40A41C74ADDA16E36761634FD1BB5E165C10D39A246174530E42D18A2466227599BD03933AE36CE98EF93144D14C762D63309F1F4E9D3EAA1C07FECDE423224F16ACBB78CDDBBF78085F9F91061E4085D138C2EE9E9EDC1E4E45DCCCDCFAB9E89F45B9378395FFFC0065CBA78117D1BFA50762A4A5EDE130997D634E7215993D0F910E2C3850F15BEDFB7A11F85991935376B5790A0E9ABAEF5A19B2495390F78E7CC0574F6E5D1D5D1A922368E1DFB085F79E619F464B851E920E9A54CE5D185E6DAA19667BC060941C74BDF61EE367604EDD267507304134A167B2FB891574BEE663CAFB1D47BC16B9A718B95BC34E76BB237D97E2ECAE58A224FFA9855E2875F1744A7CC040BE4EB8A6FCA276E0AD2FB19901C4792D70D704D63023D4FD54FAE2F56756F185C82B1D3E65E0C8844932DA83EBA7C1D33F3F39C1C7B87B661A38AE0609B2A172955299F5BA89EEA8EB2F284EF304BB9FDC70841B7BF0EEB7D07B125E820F9D426922C966E1DB48017CBBE3324574BD8C176548B5D3738BE4A7E815AC5C1EBEA303B5D3E53156B0A9440D5A52F34F1EAF86B86D731494687D95589DC1F137C9804936E4C213A52EA83926C4CE49CC79CEE40C53A971983AA0EB47E58249978A38BBBFA0DAB1A5BFEB4DE1F90665E4F08BA9968B7C75CB1236815C2D1D687B19B79134B45442C3F466D50FA641D7CF8D0825616B3FF73B187067DF5EF1CFD1D0E1FFE347EF59B5FA3B77740C5896F1BECE356264E9E3E879D3B3721DDD1053BD38DB9BBE378F1C51755676E5BD5BE5B386AE3BD837F2F977DD9D66A5C447821E8F5A6D1B5DF8F10F4DA316CF21582CF97A5028A971F1374A704DD2DAE9780C586ABBECB267873E69B067DE2C78E1DC7634F3C8EABD72FC36635B97205C5E919F40F6C819DEAC0F5AB17D0D9D589642A8B5271164F3DFD292498A5A92EB8E062D186FFBDC932B5AF3519E0964D2704DD32E8233BB110746455D33CC1744CB7A33B8DF83E6ED7FCCD6E8DE5B2DA44341BA224F772A5825426ADE2B8E9D4D0FD1D2DB82CE5CA96526557D500A14B867E6E8E2ABB096493DA2362AE1574F1D45ACFADEB5CD33CEC83330941B706F728CF2A041D65ED345036921F0F5AC58CE8387AF4A80A05B493696CD9B219B76EDE5011218C5A21413FF5D453AA50FED8D898CAAA64EFBF62B9023B69236927E194CB38F0D8019C3C79168FEDDF87131F1C47672A0D381ECA968B446727C6A7EEA2336561433EAFA256D8818507A35618D1425998E938373787FDFBF7A3A7271F74B337108D685C5A083A1A7A88921442D051D24608596A1DE8ABCD9A0EBA15E853663C3463A027EE4CA1B727AFE2A949A2268283EFD1B5A1B21FFD3E7F1B376DC2C8D5117477E7904EA754ECF4F51BB7B065EB364C4DDC56EDB79814532E17D199CB01B68DF1DB63C8E772EADAE63C923E235518BBCD209BD9D902B66F7F081D1D9D42D021D6840C59BF080841B7996E17DBE15C2D49076FDD10B6EEE9674A832E9429E5D860E53D1D8EC75AFC3AFBC475746951169E4AB01722895C0F4152054DEB71AC6A67B60955A968577944D4A1B331F5DF26A9A51EF7D62E2A160BBA5D34D53C3985A09B87F5FA9CA95AA96EA16ADD222F2DB46E8C13E3AE50E342D02B042C06C385A063A064B9C5F6404008BA3DF4D44C2985A09B89B6CC25083C00012168591EB5080841CB9A10042282801074441411213184A023A40C1125DE080841C75BFF8BDDBD10B4AC09412022080841474411111243083A42CA1051E28D801074BCF52F16B4AEFBD0E6C5926411AF570484A0D7AB66577F5F6241AF1E3B395310A82B0242D07585735D5C4C087A5DA8516E623D202004BD1EB458DF7B1082AE2F9E72354160D5080841AF1ABA757BA210F4BA55ADDC58BB212004DD6E1A6BBCBC42D08DC758661004422120041D0AA6580D12828E95BAE566A38C80107494B5D31AD984A05B83BBCC2A08DC878010B42C8A5A0484A0654D0802114140083A228A88901842D011528688126F0484A0E3ADFFC5EE5E085AD6842010110484A023A288088921041D21658828F14640083ADEFA170B5A6A71C82720C20808414758392D124D2CE816012FD30A02B5080841CB9A90280EA966279F82882220041D51C5B4502CB1A05B08BE4C2D080411108296F52016B458D0F22988280242D011554C0BC5120BBA85E0CBD4828058D0B2061E848010B4AC0F4120220888051D114544480C21E80829434489370242D0F1D6FF62772F042D6B421088080242D011514484C410828E90324494782320041D6FFD8B052D9984F20988300242D011564E8B44130BBA45C0CBB482402D0242D0B2266A1110829635210844040121E888282242620841474819224ABC1110828EB7FEC5072D3E68F90444180121E8082BA745A28905DD22E0655A41407CD0B206964340087A3984E47D41A049088805DD24A0DB681A21E836529688BABE1110825EDFFA5DCDDD0941AF063539471068000242D00D00B5CD2F2904DDE60A14F1D70F0242D0EB4797F5BA1321E87A2129D71104D6888010F41A015C87A70B41AF43A5CA2DB5270242D0EDA9B7464A2D04DD4874E5DA82C00A1010825E015831192A041D1345CB6D461F0121E8E8EBA8D9120A41371B71994F105802012168591AB5080841CB9A10042282801074441411213184A023A40C1125DE080841C75BFF8BDDBD10B4AC09412022080841474411111243083A42CA1051E28D801074BCF52F16B4941B954F40841110828EB0725A249A58D02D025EA615046A111082963521511C9EE7C9321004A28880107414B5D25A99C4826E2DFE32BB20504540085A168358D06241CBA720A20808414754312D144B2CE816822F530B02410484A0653D88052D16B47C0A22800097612291A84AC2BF4F9E3C89BEBE3E249349F57AF0FD08882C22B40001B1A05B00BA4C29081001632B18220E5AD0B508895D11CF35333838B8F0146F22042D99D4FF5048144713152D532D8E80EBBAB02C4BBD69ACE95A1747D08A16828EE74A8A1D41BBAE2B041DCFB51EB9BBA6E54CE235047DEAD4A9AA8BA3D6051239E145A0A620202E8EA6C02C930802F72250EBDEE0DFB4A0FBFBFB914AA5EE717F88F51CDFD5133B0BBA52A988051DDFF51EA93B3756327FD2DD71E5CA1574777757370983C20A49474A754D13A6AFAFAF25EEE0FF0766F1DC443B7D42440000000049454E44AE426082 WHERE `app_id` = '7';
+UPDATE  `fn_app` SET  `thumbnail` = 0x89504E470D0A1A0A0000000D49484452000000D4000000BA0806000000D62063320000200049444154785EECBD09B86557552EFAAF7EB7A76FAA49484B8510087C88A04F405194EBA75E9B400286670BA2A2288D82CDA70F7D8A4A7C220AEA67C305858708DE4B083DF810BC72318020810409E92A55956A4FB3FBD5BEEF1F63CEB5D739D59D537572A1A8BDA152A7CE5EED9CF39F638C7F74CE3DBDB4B8F3F3FF811FFFBEFF829513C7D06CB5E1FB3E5CCF85E33880E3821F47FE7B864FC1EF0A80E714E6EF930EE7410E8F2AAF9703D03B9CE6630E2ECF39CDBF375C542E55BD8B5EFBE4DF8CEF79DAEF367C212F89020E9CA240C177359FCDE32343C063CD17F67B7B39BD921D87420F2C2FB2F1DF85DEF1A43738DD33DB6B57E7AD9C92CDE377C6B1DA7487936EB8F12DCEB6444E9E818D173CCBB2292F7FFA79AC8EAE194CF3881B8677D38356AF371EEB332C49CE7D9E23CF7324698A41B78B99F979BCF1D6F7C379CB7B3E54DCFC3DDF8985F979F87E504EEA498F76C6C1E402E0EA1883A58A2F79B41C285CC0D9CA1C54D7D369578D056D15A4E313E5B79B5168174FA1CFC935BA1108A7B859E5794F1A6CB99D9EA3D7B1DB838E0701377E86CD13B4711A373C49B9E82D90CCF056DE67D337FA3E06C4FA30274176FCEB9376C7F1B1278FC0997E53592595157BFA055F7DAA535F979BB16CE4A7FD9CFC5E1B3635AE3347AF51E4BABF572779E3BA38F926F6EAD5CD683C9AD5B9DEB8BFA5498263C78FEBB6B7B8B4044F245175719A0739D5BCE705721770B93065519E8C12EE36B29A0A2EB6CAE23FC3C08F5FB67253F9F16439566CDA72456228A637EDF666D0CA8B5706D12EFA0DB2CB82720C8EF1E2D573C7CB48BF51A0E914E86DCC1114D6763E3701B33A6AAEA24F267EC3F166FCCADFCB75CD4B1A0969015BCEDC6691B8492E8FAFBF518BB08F2C97DF349D1B1661F95D058425902B1B891DE60DC276B3ACB5FFAEAE3BBD6EC175E39891CD0BC01DCBE8129695B554EE21552C9A35325E4DE39F721470ED82299FD1FEB05140D899D5CBD9F9AE6A5AFA9C945ACE54AB55345A2DB3A3E6708C18D12562102950AF28665590999D39876B1E9067D985369612279DC2A3721D345D5CE39DC96285DF54D580EA6EAF80E2F51DE406D4560D5395CC689FE3AB57944D1DB8F299E4550BE48E53AA9F7965A72CF12C182B64B239979C1059BFE6214F92BEF2023972D7198F8D2C14034B0B227BBEAEA4B1E82C17848E27D715C78BEF2CA7CA2662AF67E4A339DD2CCB8AB092132083C58FEC9F55505915224791BB70F872B9991757D7825D1376F3B06251B732572583D962EC8621671970D81D43E75A4153AE31C73CBF018FD91EE5AEB2F0AD3A61B402D9C8364B64B34116E06AE4F5AD4A643488CAB956652A6472ED809432A0326E7A13BB7D8CB5117DF431A60D5696772DD31890C1752A03E71482613D2137AFC75DC26C5755C0D98991AF8CC8557967752AB3C70BF0EDCF050ADECF8A685918768556179CDE9B67C9E35981630448090B8E2E179A6E3BE580D839D36BF355CDC66016A7DE4996AB192057E16D77FA522018358227E4BC391165B53C1D713B3632017208CF715118DD838FE81A1B53BEAE80C2829B6AA25C56E6515F722C747524E4C6E6FD0BCE0D016B9E99EF99E766ACB8C39700B68BA2B299C89818A94BF594FF20E064F2B889F26FDAD279B938794C2E1B962C0C039F0A302ADB2987896BAAAA3DE8F231D2986BCECCA7DE5667D3BCA10EAEA842150DA5041C377F6E2C7A6FAB74CBEB98B9D561B79B813149E4BB8D8243EEAA3B54E54A7A217942234FE4D6D62E3660CE650C5CC50F6FB1B4BC2CCFC489711D57777B591C66F79249D1ABE80E6454D2D25E2AC0DDDC4A0BB129CCA4C800510C0A70284908512B8D8C583733CAC7E20BC882E3A4C925CDD6E0EAC4E9566157AE284A669B303B988C99EEB09C04873BACD924F4A9F577166DE3E56A67D10CACAC33A3725892C548022E275964A57A3C5E14027DB3802D90EDCEE6968BDB4CB0A8C26630A9425BE928A854E9CD1D448129FBBF9D735D742221F59D38AAE5062EE3A67326E3CE0B98F7D1D560D562057C5E18007359984D54A7620C1601B6AC19AB762921534A649138F284061EFA1D37123E8302D0AA51E3852D6322F3C17750D9A66ADE78531C6B3155E0AB742D3721036E59315595ACA2C7EADEA163A82A76B9A31979A06B4D8580193F0B77B3F1C90E68E6436F99EB3870C4EDD25C5EDEA57BB1058E990C824B0F1A4B149937EE88164C66EB1C6B0E63C1A833A72B46079E2A8B8A7AAB2F5527888B40F6598256D7C058FEDA856044BA9500BAC8CCC0162E0A379745A6D363D8492BE68D8A615508B98F4834A794C0BA1F991D91DF1989C231B0EA4C55CCDBEFAD2A268F6C8063D5205543CDCE6671CBF1330B5D1680CCB6B56155AA7063C9ADEA52EEE3F2F4A5CD6A87D2EA1EBAC875B1C87398CD49259A8262BC0AAD0E61A598D98D453C5875DCA895E57554BD14E96DE652CD3ABBB48D5093B569AD4BFDCEC8D9B146CB71311A8A5C810BD42E4AAB1594FBA555E10D90658D5A8DC1805C34B75C80AD5B8C5D07565BB4768E8E8DCA435D29623EF01955D0985D4E351ACE8F0802FD6785B5DDC8565BCDC9D9B5BCAC9091DD49675E416476126337E8A4F00616DD3A210A26AB37A80E248BD4EAF7664B14C165C0A9AAED4683D40AB6522018C54D777DBDBED5CFEDE053B591E7B452C8EEBE46453588DEA0E7DAE9E522A626A16FCA677695FBD0FF18609B0564EC00233BC49C143B83EF2FE48C59640226AACEAA2A8DC7C71AFAFA80B2205D02DA4C90A82646571715D8A845F21C2ABB793DD9F98C9D2292DFEE4DB2619B09368B52664200C67733924926D7ECAAA50D930B7865B194F36EEC0FD175784B638B983953C4DADF71F8AD9AA99A05DF518928AABBFACEDCCD752757A95902CEBC84FCBA94F04611E45C884260E6592E6ED438B9A7B9973C175553BB4ECCDA9231196FEC6ACFE9A64EC96CC75CEC70BB29D84DDF6C0AD4ACF4381D4B8EA9BCBF51AB4BCD4A6CF91CCEF2D2922A09B2637397D79B964B586753553EB3B0ED80954C8CB137748171F00C7569178CD9A245BA99C5C687530DCEA87266E154E80C2395B95B9AC56BC7B9E203B2FAEFF88915783265B250C6D69E591D6A8314542FC73BD2D8C8AF4851AB459B034B49CC7192C566776A731F4192AA8432C566A797A56240628D58BBB1735794C915DD4EA9762B61D426B46018AB4CD61857B5D24802A3AA1B75C39877469E55E653006925BD2C302B5F746790454755D9A8F7327AE317DF4088283E75A7579553B5108E8BB503558B305B7F7933B3D08D5E6CD5456B7AD879B29A8D7D6681A4D100644AAC58B05A8811944A5818895B6A0D5661E2B3885161806F54C90A4123A0339810759A73A33B94D115F446E59AB18615CF5B16093516D076B04BEAB7A20EEA02B56A8D0A71D17F2B14A75571C64C94D9552D1B6740A90BC74A4263A3559EC3DA0486461BEFDAA52D628DEBCAAE55B25E9654D8E8D390612807BF62CBC9EFEDA66217D3980E57D5B4EAC8353ABEEA7C627FD256E0DFE562305243258A9584461DB34A921D4F0338B5BFCC6455774C737CA913995D5AD51E63DB6C58F77631997B8BC418AB66BA53577C86E5A6A9A030F6F9D84A740C68ECE2B2EF634995AA3D65CC04A3E0A80650B5B12B1ACBF83EF63D2AB47405F4E5B89412C7A8B6E5B88C4D0BCB25A956C7CDD8A8A166416D589F566CD8313412BFAACECAC855D69C153432A3E61975F88C30595A5EB2E6F178C84B95D8EE01D5E9B0ABC1C804CB22D92D7793536E6C5559E3DD8899CA8EA033375E48251961D5D9722D1891677525738E799F928EAE325B954DCC2CEC0A1BB7296AC31EAB3BD898391AB33F278F87591F5533A2BC8CFDA57DB35205355AFA788F35DB6DF93E7602369D5919336B43549F79FC8255F0D8BB561ECB4ADEF1545A4363E341E5F795E7A9CE6FB94E2AD2A27C37BBDA2B268951574B3BB4727EB97F6CE0D9C607A89933B6E76D948A594D1BD76E098C8DAE13BDAF214C2A4EFD524894CBB0B2D99807ABDE67C32059E96FEC579150278DE2E65F54C673CCE49CF5ACD31E501DC773BFCA4E9FB971119FD3D577E2C576E21A677BF8EDDCE3A463B773F2E91E6427AEB18D973CEBEDCE7CC0992337363EC74980DA7CE90D9B4851A05EAF8F6DA953EF6715CEE76C2FAD3B694516E809671D80CD72672BF7F9DF70CC969F7B5B2F799210DAF13739DB736FF87EB3BCDDCE7C6DE1C9AD12B28543CF78C8B63782530F02C134180C54B5B68CF5496271FC24EA87AAAC60AB559C6ABF6630E0FCFCBC04059EFAB3C15AD8E290587AB572B82152CE7E812D1F78F64BEDC411DB7A9C6D1D2C4FB7FD33B6F85267BBF086EF4F31C7673B7F8B8F615FB2E26FDECE999B444545E5DCD2E89DFA255CD7C5F163C725587CC33668F43AEB07B710729697972C5B59D2B8EAC9DE486BF3627996636E7EEE0C12EADCDF7F72E66404BE16478012EAC4F113703C1B1D626065E9DA0D0F6D58BE4D41D26574A4F58B0B45C8583723A14AFAFC6B710426CF3419811D1C0101D4891326826723356159CA5200528B585A322C9F848118B5C246F64A0C93096D290A644581C5B939F5354C3E9311B8084680803A7EE2383CC72B43A2CAC015719758379D465E1A40A9822E6E14F133D9205813FCA28159E267A10D35915017C14A9ABCA20A1EC7C5F1E347E1BA9EC693DA103D6372599965C39204501A1E621CB512CA485C8DA3AEC5C812275981F9B909A0266BEDE219013AEC8F1F3DA181C665348A89EDABB80F4D800B9CC5C5A5C2C6E7D9E0CA32245EA83E1BBEE320CB332C2E2E9E81E5BB78067AF2A617C708B8AE83A364F94CEA5219425632E38C6ED1004C09F05E5A5AB4D183265F681C96AFA1563630D0D850F30BC84DDCD9C531A493B7BC984780B4F9B163AAF295AE241BE95E09FD2A333DA8F29D75C08CB3ADC8722C2C2E4C24D459076C72C0D7CB0828A08E817F1BC25C4D229BD9605FD4A0486CA8ADBE3C69F3858509A0B63A5E93E32EFC11D80C284555054D26C6D0464C56006512CD84DAA80C4435FB7802A80B7F854CDE605B236001E5305FAE3CD3B0DE265BB72ABA9CC5059212E64893E4558DF6AED61BCA8A1C8B1309B5AD09991C7C618FC0661BAA2A6FAA95B76C828CB3B8B45868E5204D1F974F19D664CB84E9AFF33CC5C2C2D2B66DA824491004C1853DB293A7BF28476083CA2799E0CA9D9FAA5C9D687F8B4B0B5AA6C326E7D94C4782AAEABCA2E3F71C543E82E9CA2BAFC4273FF9494C4F4F4BB4BA35F02ECA199ABCF40535025CAB478F1D05DDBAE256DA206C58F4C7D5C24C9A030C67619180D2FFD90A3A9A056A72A3A560827A8CD33CC7D23655BE071F7C10BD5E0FFCFB75AF7B1DFEE66FFE4606B4D56A210CC3B35409BDA0C67EF2B05F872320803A4ADA9CF5318CAFC956A3328519B56E852924B3B0B0A8E91B95CA36656688294925158B88C0BCC0D2D2F61CBB1650D5B17EDFFBDE873FF9933FC1473FFA51CCCCCCA0D168C0F3BCAFC3E998BCD2853E0202A82347357DC3A6CADB3A8B5A59A2CCDF63ED0C91507AE4B8F64359624B93E5E5FFAC8C9366199696B667439D0A507690A90EBEF6B5AFC51BDEF006ACACAC606A6A0AB55A6D22B52EF455F875F4FC04D4912347C4B15B5606A9D643B1C54F6C00C4E22223258C2BEAA44225634E83C7E7F9CE02AA3AEE9FF9CC67F0C77FFCC7F8C77FFC479158CD667342647C1D2DCC0BF5552CA03C4930B4F550F4C7AA03579DBD059CC585C571E9D333E69E17C8B27C4725D4E906F94D6F7A9380EBCB5FFEF284C8B85057E2D7C9738F01753A93C4960430B56FC58632CC453509F15429F0D90EAB7C671B73AA8B0416890CA6944C888CB38DD8E4FB9D1E812AA054228D2BA09C5C7FA5A00D455262DCD9C8DA4CA626D786E763B4F9D2E2CED950DB79F9F7BEF7BDC2127EEC631F9B1019DB19B8C9B1E73502252921A17CA61AB08984508AC148285396CC595C5830B5082B4E5D5B00D0A46F48652216B42FB06D966F7D7D1DBFFAABBF8A9FF8899F10BBE87C3FC3E15018C23FFDD33F05AFDD6EB72744C6F90EEAE4FCD38E000175F8C85128093DAEA32E854DCB824F0A2A71DD2ECC2F14B663810DA36572A16B3B2254EA4667F4436D5342F131B8F0D7D6D6F084273C013FF5533F851FF9911FD99129BCFDF6DB0558EF78C73B441D9C10193B32AC938B5446A064F91C4F8BD8DBBE54A60984F4EB326485948A5E585828589ED6F62B522DD1D6E81EF7F7E1F7A4DFB7EB87AACE4E1CC7E8F7FBE8743AF8AEEFFA2E3CFFF9CFC7F77EEFF7EEC804BEF18D6F14C935213276643827173123A012EA08BC321FCA94D02BDD4FA6F103FB1AD0B93BBF302FB17C6575F7B2B6357FC7BAE55698012425969797B71DCBB77976482F8E4623011741F6AC673D4BC0F5CDDFFCCDE73D91F7DF7FBF008B009B1019E73D9C17FD05045087092855F1040DB6D6B9947C36F9B9D248A020A0E8D8B57033450C4B8A4FED2A5B7E99B17C3B01A8EA2C115CB48BBADDAEF89DA80EBEE0052FC0BE7DFBCE7B326FBBED3601D79D77DE39B1B3CE7B342FCE0B28A00EC3F518CD67EA1C579B9E5B6794A94B2F36D486FCA7338CDB4E49A8D3DD828065D95BAA84AC5D41605172B1D2D2F97C1EF7B8C709607DDF3F9FCB4CCEBD0847C002AA1A1A570DCDDB8C9D4D801AD7193F55A5E7871B50D5F94AD354C04542E3DA6BAF153283003B97CF631EF318B9D60450E7327A17F7391B25D438A2C8768B298BC49A61521BAA02339B50685A1397A3493196EF900DB5DD2962CC1FED2D82EB694F7B9A00EB861B6ED8F2652680DAF2504D0EDC3402C2F21D3E0CF2E6AE89D72BB5BC0DA692A9694996CF064F48C73CE9FCA757355FA829566819B19DB6A1B633835409092A062BF2F3810F7C40D8C2B37D26803ADB084DBE3FDD0810500F1D3E0CDFD3AA47FCA3E55A6C87FA8A2EC74AB2F373F385E39AAEEBA69525F976D7F4A294EE0206598CE55BDE75FE2CDF76A66F332378E38D378A847AD2939EB4E5CB4C00B5E5A19A1C780A09454091365735AF0A20DB71D20820D2E673F3F322C1CA1622A63BBAE648992EF2A6172A6B4AEC5ADE75DEB4F95666ADEAB37AE6339F29E4C4F77CCFF76CE5D4938E9900EA9C866D7212A51125D44364F9C691E6D2E4DB46974B9364D1E734C970CE48289333A5CDA96D6B4A9360A8DDE10B1459F1B0AA7C96886054C5E31FFF7821227EF4477FF4BC27F6FAEBAF97ACE1092971DE4379D15D406CA8870E4B2FE56A6D73DB8BB8B48B6C07FAF9F939D3A2BCDA70B5DA7C6A1C8A4E1B6AD7AE9D955055AA9CF6D90B5FF842011263F4CEF7C39024FAA1EEBDF75EA96531F94C4660BB23A012EA2193513E6EAFB8B1EFA6F93D35BD79A3F219A125F7DBD80567FC08CCD8DDBD0380AA3A735957E2C77EECC7C42EBAEAAAABB6FBBE271D7FD75D774954FA5BDEF216445124F17DBCC7E43319817319818D80B228297B6ED824F812330AA83232C2D49628E9BD71854C1EC40E86E72AA10822DA4554BD187644728176D1377DD3379DCB7B9E74CEEB5FFF7AC99DA2579BA9F49448DB6936BC230F31B9C8D7DD081050871E3A04DFF52B92C6C8A79313A2484ACC692D976A9D162BA6B440A6F08434C3E8D8DDB56BF7B64909DA44A4BB9FF18C678824FABEEFFBBE1D19F88F7CE4232090DEFFFEF74B662F53E72776D28E0CEDE422660454421D82EBF95A90E5A44EC79A0B5F96B4544019E05892DD1CC0C29765166F016479BA6D40114CB7DC720B9EF7BCE7EDC824B1A41325D15FFEE55F822406D336A8DA4DA4D18E0CEFE4229B4660ACF2B18C18893C962C27AC5C0D92E03F58D652288B02CEDCECAC78722D772E91E752C945E2D1E5F2744931158475F9B66B439DA9EAD17666EF6D6F7B9B5448BAE38E3B4A69342998B99D119C1C7B2E236001A575F98820070E336D4D866E353656F2A166E7660B418CF89F36B48A929399A6CB22976A4365D8BD7B7B2ADFF900EA739FFB9CA8746F7DEB5B459DA3349A94743E97653139E75C47406DA887A42E1F658CB604D50AB2A76A8DEBCCCDCE11492A892AB5912A752F8D3E4895AFC0EEDDDBA3CDB70B28DA6954E958AB8F7D79489F4F0886735D0E93F3CE77042C29E1B13BB5D846E33EBB6266548909CAA3B9B9398BA68D7CB91CB891C6E0627FB824D4073FF841A1BBFFE99FFE6942309CEF2A989CBF632320803A7448FD50A74AC1B04CBA21F2C68032476F3867D305E887DAB3832A1FA517553A120CFC4CCA84EDD83A985C688746A00AA853B0E4E3A443E3897266E794E5E327CF19BBB4F949CC650AA5CD77EFD9B32DDAFC542A1F0B593282E14B5FFAD2A490E50E4DFCE4320FCF081050070F1D8427B4B9FD54E324941257528F2ADFEC5C2111E504942125B4E19A2502359D838618FB43EDDEBD3D401D387040B2653FFDE94F8B4A3729B5FCF04CFCE4AA0FCF08A8843A084F240DFDB50E0AD3754368F2D22F655C4CB3A4CD0D4DAE94B9419C624ABE22D9C71FB334C79E3DDB63F928D5D80080C09AD4D07B78267D72D5876F0454421D82EF38C88532B7F52E1514E29732E6125972676666C6C0C85549845CB808FDD9564457DE82E91B7BB629A1E4BC2C9BB4AB79F8E67C72E5877104045007A9F2B1D2256512F1A17950B9C919944822892A2AE0CCCECC14D299CDFAA04C74842A85D681A53A22FD507BB669433D8CEFBAE54B3376907FBE5A1FC6164E3E17E608584049108169AAA6ED9E683A99E211520C568590232A9F8D4A1F47A76FC84CB4EC0625CD85062802E9A94F7DAAFCF96A808A607AE52B5F2901BB93CF8537021B2554191751E1C40D1B615ECD999961E8D146979388AE0D4E2B855496A5D8B367EFB658BEAFF6103228F755AF7A95E4587DB53E4C21B9E4924BBE5AB79FDCF73C4680803A70F0007C69B866E28D4EBADE985017092524A021CF55748D0F50FFAEB1A1B21C7BF66E8FE53B8F77D9915309A85FFBB55FC3CFFDDCCFEDC8F5CEE52213409DCBA87D6D9C2312EAC001B8BED2E6A525645AD6881955898170A6A767D81AB40C8AB0A5976D1A3CC16439F63CCDB067EF8527A12680FADA589C17E25388843A7010BEEF49071A52E64EE16A2A8769996B5AAD29B0A6676695AB28533794171400566841AA80AC7AB4F70223252612EA425CC65F3BCF5C02CAD3740D238FA0E1E2CAECF1183675276A84362F930889205B0CDD50E6E637289C5C3276F74E24D4B6677BA2F26D7BC8BE664E50401D904889A2C86D02869A534C7B6293003AA78C1AE7CC4C4F6B6D734B9797E987E39C0F8B4AB27C1722A07EEFF77E6F47AA279DEB2C4F0075AE23F7D53FCF028A7F0B80ACA667D2376C1491CDD870A68D6377DCD3FA34255A2463F7C20314A7846A1FFF7CB53E1386EFAB35F2E77FDFB184DAD4B4BAAC19C17B54583EAA7C72DB0D3EA8CA83544EBC1025D4F90FE9E40A17F3085401A5B019B77EDA80296A7D24F76666A64D5D3E1BC36728741B7564CB52504265192EB9E4C262F92EE6C53079F7F31F0101D4830FC2632BA452E88CB37645161935502228A667A6B58BAE204CBB5C0B0A73F218EA93925C7987C1B113409DFF144DAE70218D8002EA003CDF2B8BB268A85EAEA14736E6C8026B7A6AA69088D93229CABE2EABB9B06EB3117404569EE292BD975E50911217D2E44D9EF56B6F0408A8FD071E44C0BA2A9558BE32784FDAE9520019EA6E6A8A2C9FAA79A5316573E74D6B1B294AC1BA7C792E21342C9F3CF94C46E0621801028A49B26C093AD6ED3412D606C8B29BBBD63AA7CA373D25E249FE2123B4B1F08435BC6CB4F9045017C3329ABCA31D010B28CFD304C331A167ED284B55A85072A6E987DAF4D1F8BD6A91731B1C4B1B6A22A126CBEDE2190101D47E92129B68F38D6CB925CAE14C4D4F97DD6B360E93CD9B1F2390911213405D3C8B69F2A6DA1F6AFF830FC217096534384B406CAA0A2684DE14553E419BB603B53C9F6D0B6AC36BA9FAD176BAE4D289849A2CB48B67042CA0D8C150B3741D093F520A7D5C53427806DA526D91500CEDD3A358B399074A1D0A5BE74584548E3CA7CA7799FC3DF94C46E062180101D4FEFDF07C966266F89125F04844D89AE686AF2051313535A5B5586CEB6ADB898D5F96317FEAD1626DF3CB2EBD44D8BEC967320217C3089480623B1B438F4B628649DDB0B0D2822D2E9CA9765BA1240D032A8986B6E9AE9CA8259028991E71E96512D337F94C46E06218011667B9FFFEFB959430F45D19102B6E25D350C3B4CF1509750AC2E29465671929F188CB1E21214893CF64042E861120A01E78E0810D55BB6C5B1B2B686C6ABC08A6A9F694359FAA244619415BB2E7399016192E7BC4045017C3429ABCA38E800594CB9A124242D84C5C6B37598498CCC1D286A2C2577631B4C528F4209B8D98A5291E71D965130935596D17CD0808A0EEBFCFD494303D0C3762C86A824A51B445424932AF90E69A0EAF69F052FD889072F542EC1878F9045017CD629ABCA89150F73F202C9F8D2832A483E1C0551089978AD479BBDD92429792239F1B049A2686EC6028B1E6242C18402B36D4E51309B5C32B8D1B976DDEA559A12705AFECF01DCFED72F6D9D87C9CF5EA9324D9522BD6B22C1D2065B999C1CC9DFF6BF95DED08B1C1DFFDF7DD2FCFABA10EB64594712FC98144892B4CB9D36AB7355242C83C738A9D50D1FC6C436BED603801D4B92DC6D39DC5C5C6C96287467E86C3A114C5A436F0B5002C3AF3C33094C5BFB2B222CF75DD75D7E10FFEE00F70CD35D768A074A5325645FF91949F3C2FA49138892C5EE31DEF780758928080E4EFD91F5916AB59733C86D7E4DF5F8DBEC9BC27DF91CFC50DA3D7EB61FFFE07E0BABE3E53912337DD086DEA86D5E4241ABDDDA284B2D3AD51E565E73571EE8EBB6FB0D0E5E5974F24D44E42CAEEDE333333B2B038999400FC990B6EA723FBAB8BB47A6D2B2DECF3D0FFC267B18BFDF8F1E3D26CEFC52F7E319EFDAC6763B5B386C1688424CF1150C3C90B78ECD022A9400620523A2B07034BE9BB745D078B8B4B3872E488F4057BF7BBDF2D40E266C2C5CB7BF24F55624B0964B98CFA3EC7B51D540A5800EED49C5401CD6762B561D2E65246AC943B0630122B6BA3255452A984D29F37763034A2ACFA4BB1A12680DAA9B9D31136128A9D490683814803DAB0A297BBAED9D977F296952E47726F8DA2AEBA42AABB346B7110E03FF8833F8857BCE215D24185AD5A9BF506B224D1C5EF3AC898802A5D331D30158FE02AD82402018ACC41E1336FC8451C0FD06C3644EDFBC4273E8157BFFAD5B8EBAEBB303737578283F7B740AAAA8B16586558DC4E0E8B89CFE306C2B1900A47AE271A8302CA37771B03A50C2257AFAE02BCDD6E6FF4436D0696F937FFCAD314974D00B5A3D3A880F251AF3791930C32F694767BD08FECCE3BB18AC6F35EEEEEBC3FAFCF05A300A6AA494017387AF4A8A877BFF99BBF896FF8866FC0DADA5AD9492519250899C59AA7929C9AC145E67A628B8B2D51003EEBD5887546FE0000200049444154F1D1798091525A2092616C3916161644F57BDBDBDE863FFBB33FC3EAEAAA48412BA1B4E61DEFA1CF68ED2E01FF4E8CC7E69934E3234DDA8B5C24749AC69B00654FAA00C3EC51C292B75B04944996A700630F9C317F6EA2006980E5C89202975F31A1CD7712510228D747A3D9161BD561B92A23B9AC9AB353B6C4E6BD92EC2D17691227A292D16E20348E1E3D22ED595FF8C217E2E69B6F166942A9C4E790E393047E1848281A055C91A5F0E0C34F3DF86E80300A10E7297A598AD84DE1FA05DCA40092142EA58F1F0840F8EE34FA67676771EFBDF7E2965B6EC17BDFFB5E9182B423799F24C91004919C279BBAB1C5AAB4CD69EA749DD334598D81EF1AC70992B48FFBEF7F40361C35F3B843E81C59C58EBF23AD277B85B07C6516A1B5A04C7B0EDBB283417DB92B8EDD2B26B4F9394DD4E94EB212AAD16896C6B835CAC7A5DD76E6969C6602822164BE1FC80E3C1C0E40FB2D4D33914083411F4F7FFAB7E1977EE99770F5D5578B04A11D514A07A4C41C022742175DA01E6026F1E1AFA4F096E77024EDE0E3777D092710E1E9575E8E7D7E03EB4907B1DB43800632378047C3DE100F0414AF4F005342BEFFFDEFC76B5FFB5A01D8AE5DBB50ABD531180C45ED0C021203C69D53212DF45AE73F4656CDE69C104054C1B32CC1FD0F58964FC3F9847430F693565ED1D63664C59D56B329391B5201536A9C33445DB441AD9259261B1632E8575C71C584363FFFB92BAF50059465C2AA8CD70EDEAA541FB970ADA4A12420E1D0E97424D7EDC52FFE79DC78E3B3D1EFF74B6A5CED3AA5F63D96E4662C67E0234C0A78690ED78B306884F8D4FA117CEC812FE18B711FEB61886FE807F8F6E54BF0C44B2FC57C9263351F61E8E6F073577C9B7C0E4A2152E9042EEF333F3F2FCFF38637BC017FF5577F85999959349B2DB31128314100D9B1B264CA4E4871553115B00AA821B22C56DA5C120C6DBCAB6E758A0FD32BCA545C5640557C1F9A1B6F4E35B524E4DF126D9EE28ACB2780DAC9457E3A40EDC402399354E4A2241170E79D778A7478D6B39E859FFFF99FC7C2C23C56574F88BAC3DF5332546D39A1307C52CB393C87EA5D1307463D7CF4D003F8E49103E8851E7C2744DB6FE248BC0AC78DF1244CE1DBF75E8DC7ED5D86D3EBE1706F0DB5A826EA1E0145559352CA326C5431F9DD673FFB59BCE635B7E0A31FFD18F6ED7BA4808852D5D2F0F6B9766AAC4E07A8FBEEBB4F25B4E5EE343A5671622A2E1BA8C169B65AA2DF9D5A646E6434187A3491503B0927CBF2F9A0CAC7052385E78D3AB4D53B9DCA5F55DDB9377F6FA5D38913278474F88DDFF80D3CE6B18F9505435F53BD51431AC75A0E9FBBB610242E5CCF455CE408696F799E48A17F3FFA103E70F7177028F2E00653981A3A68041156F3186114224E47406F04AF15E1C9A18F9B97AF803B55C730CB301CC508FD40DEDB0F3CD18CD46E544951AFD7E17B01DEFCE6BF153590609A9F5F109595448590D615FF95A85EA7708A6F1570670294D850658D4A05CC86845DF3A5D322A04AF3AA52F968437F6B3D822F3401D45697F9D68EB34C56BDDE281D99DB019435A2AD4A66D539EAFFD63949954AA960AAEDA951AF023CFFF93F899FFCC99F94E38E1E3E8236EDB8644473190378C80A0FAE13C0C96334C318712F46CD6FC19B8D70F7EA51BCF7DEFDF8F75E1FB5B00EDF70C51225600B3F8A5AC458505DE889E320F21CDC74D975781AEA088218FBDD554441034E3F409417A815195216E6F77C24EE08499660F7AE3DB8FBEEBB8562FFF8C73F26E33437B780D1281642876024BD6D9951BB9958EADDAA87679B110B28CB28523A93E5A384B2B47995D8A9FAA0ECEF0550B6DBBB584C8535B34C1295413C8DAE89843ADB946CFFFB31A09AA596B05540F15CAB265987A7750A134454A3AAFE1CAA5704DA939FFC64FCFAAFFF9AA851B49568B3B4A7A7D0EDF71184E39D98E401B3545324F2620BFE2C563A237C60E52BF8E8EA01ACE73E1A611B7E7A7A1ADB3E239F934C623E1CA1480678FC6597E0197BAEC0158C94180CD0C913148D50D8C034F34002DE0769EB048EEB95214BEF7AD7BB445A91795B5A5A1689C6F72253483B90AAA2DD38AA4EE0AD48A92AA008208E5F1550B9896DD58E9FA766419C46AB59B8DAC3B09449AA03AA934EC4A82126D26C424A6C1F32673EE37C0065551C2E162E2AEED054936C2F616BF0532A91F6667FE497BEF4A5B8E1861B84DD3B72E4B050E262E41739BC40A9F0280851244324F1104EE061C96BC1CB237C68B4820F1DF80AEEEEAF23A9B7303F02D8D72F73B42EDDE64F7581F23B2EF0200871BC18A09776716D1AE1197BAEC6636666D0AEE7E0FA2AD85B3CA821E1E2CD4768841192349377A224A5EF8A5DD95FFFFA37E0EFFFFEED0220122BD6D6B380DA1C05B295793B1DA0EEBDEF3E040C8F121DCFD0E3F2A3954BBAF1F02380521B4ABF6497364B4D0A8BC1FA12269E2FCD525C79C59513966F2BB3B3C5632CA06843558DFF33EDA876D7B7C78B8A21BE53F511F15C52CC741833CC87BBEDF77FFFF7E3975FF1CB4234F4BA3D1309A040A4EF2B743DD140281B92FE482495DFAA2329323C38E8E2FF7BE8417CECE07D4866DA08FD69B44F0051E8A0EB0FE0E31425B6CCC3559F557C4F648FC300711AC3190D91141EAE9B69E199972CE2FAF6A5687652ACC47D24AD3AE0A718F57B127BC1E726A8089C999969341A2D7CFCE3FF823FFAA33FC2A73EF5292C2D2EC20F0251FD6CECA1B5A7ACC4B7CFB2D9EEAA8EA3B561AB12EAFEFBEE15D552A8712717465C8B1919CC983A1322841A8D86115ECA53A8B145A64F0B4AE8CEA3A7D218BC6202A82D42656B8759962F8A6AA57A7626956FE3A2D048822C539A97F39D2629A25A0D491C4B7191FFE3294FC1CFBDE845F8CEEF783A3AAB1D74BA3D38D28D2F35C6BF07BF70D077C8B6D5E0F663A1C683B089434181CFEF7F00FFFAD0FDF822522C3567D1E89210C891852E620935A224392DAB75D220C89A940D80AAA40BD43CF17FEDCE023C6579198F5DDC856BE7E6B1DA3B8C6192A2E135308833F89E83A0C6087517C37E2CB17553D3D3C892147FF796BFC3EFBFE60F508F22B49B6D0CC91C86A16CFC127D62C80B4B8957E305376F5C166C3C86365A9E27B8F75EDA501A9FB881A6B79A9DED154591D46C36AD95B4013CA2231AE795851555872BAF9C48A8AD41656B476D07505625B16C20279DF436A5117D841159B53841B7DB11F5EF177FF117F1DCE73E5776EC13EB6B4851A0E6F95A6B2467948283241EC0F155151B7487C2CCF98D1ABEB8DAC147EEFB4F7CA1DB41529B42CD8D508B33785E86C4D56E96C2008AF3726B5E55351DCC02872B51DB419C034180F53047DA5BC3522BC47FDD7B35BEB3B18461D1476668E9A13CB40337056A913AA563466C381E76EDDA8BFF7CE05EFCD2CB5F8E2F7DF14E91647409D8F8444B5658E2C6AACA9B8155050CCFA1B46368159DCC04946C1F65122E69730D26D7DF99A008026A2CF2CE3C3613406D0D24DB396A3B80B20B41A31D3474270CE9CB89E567AA4324199EFAD4A7E015AF78A5443AF418DC4A86CDD36976E204A11B4ADC5D910E10652952A7402B68A170EBD8EF25B8FD8183F897FD07B0520F506BB9888631BCD4C3C8CF9038199C82CC9F3A79951419172B39DBBBF33973F01AD29156D4C5DC033A7981C8CD510C133406191EBB7B0F9EB9F70AEC0D7D74B00E2F8DE1BA215CB78538D5F796205EB1F372C0F7B1343B8337BDE9CDF89BBFF92B91CE54A3E9141E0CE8E3D22891AA5DC9F54C9BABAA129E4AE5BBF7DE7BE0F9C1062B717318977D6F9150E52058F681898522CE4BA8093A27803ADB72D9FEF76703945541EC952D6B27E090C59C49784CBF3F10839DE91574D2727765F401B21C7E1461E06670E20C4DF12501A95B43580CE0A743E44B33C856733C786C0DB71EBA0BF78D0618B466C45E084603F84E0D8E5B1310B945A68D264C16378348B7C2A0C9F34B9724DA51804740E50E1237452492CA43BFE1A1EB0CE1C519D224C192EFE329CB8FC0B72F5F8A4BB20C27D656D069D724AA5D523D68E3C7B924F7D5C208C56084BDBB77E1BE071FC05FFCC55FE09DEF7CA7345A6FB7A725AADE4A24329D246F345E8F405542C16A00F66F4B9BDF73CFBDA205D877305D024C0084BE9842C781D36C305262CCE4D9A601C2FA996040AD27CB866B09AEBCF2AA0929B17DDC9CF68CCD80AADA4F7662ED645B105195B1B9535C309DCE3A6EB8E187F0F297BF4C7A2093882098C87E31D8B93F1C82D9135CC06DA786B448903B23245108379C42B793E2830F7E059F583F84AE1BA31ED651141ED2C2419D0918698151C1C0DD0CB9E3C215D78AF1376D51DDDBB037CB8B98A20B0C34CD1464431F883D475457FE6E341C201CA5784C6B06DFB27B2F9EB867378AEE10703AC84719FA8E87B8E1C01B9070A3CFCC479AC4989A6E616A6A1A1FFEF08725E0F68B5FFCA2843051AD4D930CB57A2492DCC6275627C76E605552C2AA7C3415E957AB24469953E96BD3B2114EB35997180A8D491A871D511CCB4E64727E5DA790C8DFABAE9AD8503B8827930FC5CC55252536335255305940514DE12ECB4571D55557E1577EE557F0F4A77F2B8E1F3F866EB7276A8C951A8C99E344FA9E2746F6281BCA829A2E9A180575BCED2B5FC01F7FEEE3585F98C6D376EFC3625CA01B7735D1D40FA5F4B05A0A5C21A6FCC8764174BA0113B3A81052C4C90A649E033770908E62B8998B46D0445E0BF0C9635FC1A19543B8F9D26BF1738F7B1A16933E9CE10899EF23F532385E803849911640548B301AF491982004121E6F7CE31B45153C78F0101EFDE847E3A1871E12D690E0B1898D9B41B51150F7C073033DC41DD75856E3C9A8D26693711A8D7A211CBA93C3B53DA25CE397A2DD29F52534BD23276D3E91503B89A7B302AA4AF11224FC43072681F7333FF333F8E99FFE69F9796D6D55D41A1EAFA9061A15C1E3EB2117D91079E82268D51022C2C113095E79FB87706BF72022B785C5A286304971D59E655C3E370367D4C1A037841B3565A1BAE26B3A9DE5706E432212D886F0504A4938BC4A806663162B8301EEDA7F0077A38F4ECDC1D2B1753CB63685177EDB53F18DBB2FC1147C14C78E232D52B8F502B913208E5304BEFAE3185A453F1B098A2F7FF96E890BBCEDB6DB448A2BA1C308F6B10D65DFC28EA175ECDE7BCF7D70F95C8684507242DD4B363357B589024EBDDE900E863692D616EF53C16472A34C942D550DEE88934297E7B6804E75D6E954BE6A43649BF0361C8EC421CB488757BDEAB7445BA0C3D64E741C8FD0A837D0ED754D8D0A07499EAAFF910EDBE906BA9D1EFEECEECFE2F7EFBA0353C1221A49883CAA8B73D6CF4628D22196DA353C7EEF029A6E88B55E868206396B43C8C6AA11DF9A9050ADEE7D9A313176B935D44D5EAB5E83E0F73C61263D46AF333A21A7A40AF0D0F1E3F8E2B14318782E663085A0A8E1B0BF8ECE7481FAFDFBF1BCCBAEC5739FFC747C835F83578CB016AF22CF1DD46A4D64692C2C24C302E99B2268EB0D2D0C73EBADB74AA4059BA8312E9069F9362ED052E27CB6AA84BAE79E7BCA4DEA743192B69AACF8A1CA11DA9C0B2F11B5E321E08E3701D4CE81C92E2A82677A7A5608064BED52DA24C948982AAA258C0EE0D85322DD78E38DA2F29178A062EE6434B8234028ED04451CC1731264CE10E1C847AD1D619807F8E091C3B8E58B77E08E2327B0D8A62D954AD75751B7986B4B9F969323C98698F17D5C3DBF803D8D2930DAD3C932F40BA0E73908F927C981AC90B8BF71178A4D63232404FB37B3C83EE06640EA0009835F1DB2842E7C0604C729BC20443ED3C083EB1DDC73EC080EF78688221F412E6FA83E33B8922ED26BD7717C7D158F1B1578C193BE05DF7DD9322E7333AC27213A7181D0AFA3E78F107A19A2511FB9EB20287C0CD202BBF6ECC6F1A387F1FBBFFFFB78D7BB6E9507A6AD691940DA59DCC028F52D6D6E01A5F3756626DCA9D3B16B24B99A55A5E0D31F6CCC9253884177D5D51309B5939022801818CBA806EE7E5445E8532201D46A3571F8F06101CF8FFFF88F4B202B7396A8F2D17EA25A1333F2DA256BE788DDD072324429971EFD3B0EBC700EAB073BF8E37B3F83D71EBD1B4E1262B9368D224FC4C14ADB884E562E8182110F349D98F437E8C04B46D83D33872B1616315F0B900D47023E3A7487818390C7162E24C6ED947615251AB3BD55FFE1FFA58405370E63A00F9D44B29587A9832F1F3C8CC36B2730E409614DFC634E46164E23316C809C3B2C10053E8E867DAC272BF89EC62EBCE2FAEFC453F7EC42D2DD8FFB82049704D3C8D7531C9D0A9127299AAEC7C00BA4E9085E1460667A061FFDE847F1BAD7BD0EB7DF7EBB30A41A4C4C87B753A6888C46039412AA5A76455FC7B8E0CAF6F08C94A84BC8DF38A557FF65C32A44B29B576168CA4442ED249C54EDA1CA41F5C3324FD4EBA9BE1D3B7614D75E7B2D7EFBB77F1BD75F7FBDA97190966092B0A11C08235F4B5B251401298A06D5A00C7EA3857FB8E36EFCEE3D9FC63DDD0E2E49E6E0441EF2C841960C2575823E2CC7D6AFC835128141ACF44D099B1C27A8B9C0DE85362E9B99C78C1322CD637409C8BC40E8F8927671FAF41F8D7D63E40DFF380C901DC508FC08792D441CFA38B4B68E071E5A456FA8C1BCB5460B69CE8CF9017C7F5C568C6B92C989791860BD48409AA091E4584FFB288A003F7AC5E578FEE3AFC1E39A8B583FF020BAED1ADAC3508AC30C1DA6E313CB099A8D86B0A08F78C423244AE3AFFFFAAF259991E33937372F9127ACAD412915C743DCF3957BE007BE49B6A59B40372075529B9F6DB261ADA63694E886B25999DA7CA5B83200132337C3D51309B5A388520338903F0412550FDA45EC98F7B297BD1437DE7493FC9E60B301B0B461EDB1C26EA54378A187D9D4476D14A1B3348BCF76F6E30FFFF5C3B875AD83D9621AF5681A2B5101AFDF418B99B6918714996C953EB3B5A57D9196CA1A8A2871A45A2AD5B5A448304ABBB8A43E8BCBE767B1ECF9982E7CF4F30C23EA71C60763151A6D8D64ED2C168084A892851F4B1C9C5FF868D45A383CEAE3FEC387F1D04A0F497D0A919FCB221D243922C783EBE5C872122B3656B040C228F4C2956C612788D01FA5A8D75C745DA033ECE0FA4684E73FFE89F8B1BD8F40D4EFE04831825F8BD06370AD5393C80E26CA8A53D83876979696F0F9CFDF815B5EF31A7CE0831FC4E2E2B27198A7489221BE72CF57E0B1888D51F9F485557B73F85ED2370ABAB19094187781D78432F9D652E81C0DC98377906609AEBEEAEA0929B18390127688558FA286A84E470E1FC653BFF5A9F8ADDFFD6D5CB2BC0BD96884FE60A4EC179DA904209D9834BA47311A4E88F53917ADE31DE44B7B315C4BF1FFDEF5EFF87FEEFC2C0E3B1E16FC161A51842186020ACF67B4812F213C2E37506A6095C821C2AC0821C48033A2CA95A070422067E19501BC7C884BA7E670C5F43466A6EA480743014C4C89E61462F3A45C2B2ED541476C9E242030130459803C0AD02F121C5CEF63FF8955744729822894A80B8918674D7E297BAC3A12E3296C50B7140BCF1DB1B77AA3219825D16A46186631D298F70FD1F374D378F6EE4BF1926F790A964217D9600D491221F42344CE087D8A3FCF8597C772FDA1242ECE8BBDF3EE5BDF8BDFF9BF7F17ABAB6B989D9D0155BEAF7CE52B1A2B593AA08C9A4B56CF342654AE218753ABD73427CC20CEF2EAD47D95B9309EF08262309FD8503B08264B4AD046E8F5FA26BDE225B8E1593F84D5CE3A9C3C4332A2133790EDAF6051C9C0937A7834F6F31A0338735C96373098A9E12307EFC5AFDFF1097CEED03A1AF37B85C16BE4293AC90AC2D087C7C8877E8AD009117B40E28BA505576A7D19E53E4F91F2B75E80C0F50510EA8B62F43AD5D318A364849976139734A7B034DD46C410A85121922D0FA440895C8E11419453438F614504A787235982FDC78FE3E85A17591089BAE99952668C96E762CC2470573FBC33DD39A614147206AD3A9A6A521018F100C41F9DBA22C972076B418EDEE804AE19FA78D113BE1DCFD97739E6B31E0E1719FAA32EE69AD3E832A2DE6F0119D5CF42E202A9024FCDCCA23F18889ACD2AB7CC2BBBF79E7BD52561A2535422AB0F4D7DB7FC5B4B333BF55A5D8BB8D8B0A30A09310EFA53D6823614E3C326B4F9CEA1CA26C8FDD00FFD207EF9977F190B0B8BE2786C346AE88FFAF06B7524A31CA14355C945820411255527467D6A0641CDC77DEB3DBCEACB5FC4C73E750F8ECE31D4C643DCCDD1A464E1020DB83366F0F24CA4079534C6D051D513465D7C4CE3B6967C3B06A58AEB85FFA03F524A0316707C0FC33C45EE66084719969B0D5C3E338B2B9AF318C523ACD2EEA905702899B214D3614398BDD56284BB3B6B38D4ED03830C198BB49051CB3330CC909B8A309C127350F605D42CBD32509B214BBA16C5C6CB785E51E663E9572E42AF86B8D787DBACE3F0B087A7EC6AE1A5573F1ADFB77C2DF25E07C79355D46A1192CC0713FDD362887A54130C0C87319A5353989E9EC2FBDFFF01FCC44FFCB8AAE0A6D065190A56D693304D0A6DA672BD5E3309CB1B17C9A95C78D4392780DA3930F14AB48D6EBAE9260991611D6DFEDB293231E049F7AE73078D220419D38318B59621CA3CB49AF338EA7878FB9DFF865BF67F1EEB875378D3754C3B1E3A4981264224C301DCC813F52DA36AC96AA8E23765862D17B0AAF2D55871F99D34662689E0881A2AC71835262B8080602060221FBD51078D1CB8726911FBE61650CB81118351B9A3471E7A858395411F470F1DC67AEC60D0A84B4A3DA1CC77A154497951C39891A091D8BA71846919545A1201B4F3E954CD33B1F1C84EAA80E5B90E52537F9C36FF54AD8D63AB07D0AE87B879DF63F1C22B1E85AB66E771F4C4FD486BA18457859E8F51AF8F7A10220C23747B3D78AE8B5DBBF6482630E78536D4E963EAC7C9F0CEA90065C1A47F5B26433DEF8FBC5AABCF4C3E3B3302A4C059038F4525A5A3459EC2774390E64AC3026994A39502F9EA3ABC761B49EEA1DE9CC27F1C3B8EDFF9F4BFE19F4E1C4114D4500B69B8D3AE4AC4E7C2B2575C04243234FBDAA87455EAF794AF6009854D39B8A6CEBDF496A50B4A8802474272D20058ED1CC19E7A1DFB2ED983E55A0BADD8C78174802F1D3F8C636B1DE485A7CF98A570C35A192DBFDDA234F274560494617563F48944B351F0598E01622C390DDC9F0C310C627C933F879F7AF475F881EB2E45315A47BA4A82A281B4C1FA803D4469269116A30CD8BB67AF4459743B5D713C6B945145D468F1A3CAF80A29C1980DFDA5E8842628563DE163868FE3C814E58984DA1920D9AB10443FFBB33F2BEA1E2B0EB9BE27C1A7A3DE104EDB07D218D3EB29EA5113A39905AC65C05F7DFE7FE196BBFE052B8D3A16BC45346232574C514899A380C2F5D11F0DE004BEA4A807CC5DDAA9F83BE30FF284C97091C50952FA8B1A3E9C78042F4DB1777A018D2CC0E1EE3ABAF493B1FB066D2871D0D03ED23023CB56EEE488AA1B8275C959FBCF4523F1B0BFEE622E0DB1D4CFF1B9FA7134E32E7E78CF3EBCE009DF8C6F9C99C7E8C80AFAEE0869C3833BA41EE9C00943CCCDCE9680226DAECFAD7E35214A045F269ECF4AFBC89012C6EFA60E3A76509097D71C0ED3250A799CE2EA7D131B6A2717002514EB3C302E8F1A40A7DB157DDECD1C0CDD5880B2EC4DE14811E25DFB0FE2EF3FF63F717F081C9E0FD1CA81564CF713550EEEB4F4B4FAC83C5FFC2764C3683E3969BA6380D224760D49E39FC00B9064B9D8228DA001C4190E3E701079EA6269790ECDA9085990A313779117196A415DD43466D26A3C9C8D8BDB5A92E299C6DE5E4FD7B991B4641EA9066623E4A983F92C84DB9EC51DC70F61D7D10E5EF2C427E1C5DFF1541C397237FC5DF3708E0D2515A49F8EB07B79591CBE52FC45BA6F9013349B935C5FA3EE4B0E8232A81691A351CF7A59C8455E92F24CBDE816856C5AFDC8474E54BE9D06D42FFCC22FE0452F7A914C1C7756BFA04DE022F553A1BB67EA0BF8A7070EE3396FF96F18D5E9539AC7E5F5368A568615B783C223C9104AEC5A421F0ED332B2021E5533A6F33117EA0C16C0191769D59831A9EB6257B954FB948D6B784D847980F543EBE89F584746E76F54479E7631DD8C509FADC36D3B027C465A9048289550362810C09781DB273FCE99A4ABADC3573946640297BE695A106609E20888A30061E2217E60847CD4C2F1F8201E39EDE243CF7F3E1AF161F4EB21DA2B21529FDD4280E5A57991509C17DFF34DCA892D6EA951E7928622766721D5709D28AA09994E6AB212F668FC56A65F94E1DAE93D9E006A27E104992C028A555B299D58DF6EE4E66826394EB06EF8C841237271EBE10E6E7CD3AD886AAC5294C0AFE5989D69A211052868C3304427607A3B0D75CBCAB1BCB6D52FB62F01B8FB4A5B1AA69E7B115DC0488A1879C8E0D318CD3C440D750C7A239C5859C770C0D8C01A3C2F1456910B9B6B865D38A6A79BA8CDFB48E8DC4D33095ED5463AA4C599B54B06539326D5DD4CFF5C019FE6FAE9BA8F50BDB3B1A65CD56409736833027216542B1914ECFA6893D1EB0EB1D64DD065DA7F1121CE0A5C33E7E0D3CFBE19C79A6B98EBB8E8D6009F499B8E83E5C55D46E5EB688F5DE31B3385632BC1C106547C9B5AADA6B962622F19C88D83D24DFF4335C6C89A4C00F53002AAD311BE2A16401558A9FB68C70E9AA18B773FB4869BDE7C2B82DA0C3C97793C03385E8E563DC4EC7C1B458DD248FD53A324D585CA9D3673243BF61C05942C4A86D215452AAA1DAB22F98E2FC52DF3A183DEDA0027565690258EC4E431DE538BEEEB9AC9F83FB296C908CD4684A9D936DA33D3888B01567B2BF002551B8BCC8353B0C95C80CC2BC0661D1E231A4E1B27684C18A6DFF347D9389869CE70A111023740DDAB692DF624457F2DC1DA7A1F715CC067DB1DA7815196E0BA25179F7CF67370BCBE8299AE8F7E441053AA8F0125124A543E5BB2C80CA72129E4F726B05C0155FD54F9F24DDC799CA6B866A2F2ED28A2AC8462EA3A2514B933461D34D31C2B351FED11D0085DDCF6D03A6EFCDB5BE1856D448C832B62242963DFA8B0E798996DA0351D21F75D0CD2589CA34EC0DD9F0ED592E6DBDEB38B04A011CE9A1589D432AFFB4DF85988F563039C38BEC6807309A665992D3AFEF947C26C1989E0B9703C474A86911D7459103377D19C69A0315B87572F903A2C1D93A318E5146A52D492EA96684B927A72FA6797D417531C854B95AE01FAD402C745336802A31CBDD52EBABD21BA436E3235F86E0487753150C320E997805A69AE61BAE361C0F02C01948BA585A5B1CA67FD501B58D2939D4B4E8D2A9FE521C71E5E13D0580D9B65B0628A7D13406D6F519EE5E853036A2CA1A662078DD0C37B0EAFE3C637BF0B7E34656A27B23793234553923845C4CA0A418199F96934A6EA52F8A437EA8AA4A0856CE778E3121887448F459856F151654C0B3C03720000200049444154B67EE4058B99B05C5803C920C7606D20214E8402EB9DDB1639921FE8D2D6A00DAE5D00790D4698275E0E2F256B090CF33EEAAD1033F36DF8350D5E2560338980D7C299DC03A413A2B2F4FA34EA882AEB37A8CB8CCFEBC0173E9F00F3A41E7ADCCDB07E621D716F8494E923612811221C983863944403C36C807DB3193E75D3F3B0D258C374D7C320A464A4E3F96440295167483BABCF9967B205269CB01649093E8D3CD287B206A26E0E34EEB42C739226D8F7C87D133FD40E426A23A03AF07257C2829A4982957A84A96181460D78F743EBB8E96F6F455867EA76061244B6161F721F1999B39C5C5B8299761D53ED3A6A5335AC67EBC8C4A8F2240E4E15310D58859B18E59FCBD61624D71412B27022E5FC420887FAB089D5B53E4EACF7900C6284F59AA4ED8F688F48E80F43D5B856120991628522AA9B5C3B04965961722CC3A746C391A893D3AD69B4E62224B53E02AA7BA956452298F85E2467A45E839309F942A48965EFA5F03375EA8EC01AE7195ACE34DC9187D5F575AC9E1820CFE98F8B24C856630395592CC07E570DA9FBF7E8C5009FBAF18771343A81B9BE8F4E48954F01B56C25D4FABA867F1932450A4668AC9ED9874C933C2A855118092951CA221968A5CC8D71A593C05D23CEB0EF9A09A076104F2529A12A5F474880D8A5CA0751F9A6E21CF5D0C16D8754E50BEB6DB1A12C452C4E76E9B7C4969EECED95211E8ED024BB365547BB5543E130602941EAC49A4D20B1794C7E5079A54578CCCF6E26A5B9D850ADEEB3726C817890A1776420DD32689C33D29D80B65D3308184638287054DD7324AD436BE96DF8486683AD6357405A8B862EDA73116666A6A4D3476FB88684298FD22551438F1855C1B111BBCC49913999E45A79458480C17C5981A4E362D81BA2D7674D0C46F0D74505D5B2CC04A5761A64B11955F96205D44D37E358ED38667B01BA61069FE91B1540AD77D6D5CE138A5C0374A5F8B404C76AD486565C062561C8305DADE669AB0698803F11FC15D77492E6B8C6F4E9D9C94575315FEB2495AFC811BB0E9AB18F954681A9381340BDFB501737FEED6DD28FC975E9731A774797043C2912C285C20F834C33A4C31833D30D34DB35D4DA2106791F4931D4BEB5DCEEEDAE2DB415AFC77CA84C53C6BD26B22EBB1A76D0EBB24794271284159334EE8F3431179272C3E30443DB624683ABCD6E6C24A3E9C621EA2081C760564DAB778A54524AA6A6DAA8CF44C8DC14BD64244E6AAE4D864D514051B51BE6B41173D4BC86D4C7C84629FA9D213A6BB42B53448CC667B9337119494AB186D69BF8754D02A96310C778F4928F4F3FE779381A194005197CA6E15700C59C296E22654F28AD972BA926D242D78E070115459128CD638E6F6323A9713A8752A0FBF64D24D44E6E000414A513A9F30E435C9021765D34E3C0008A65BD5CBCFB500F37BEE93684B5165C8F8DA56D96AC768CA725CF9D976B864281067AC30D301C7411344334DB4DD4DB7538618124635E120F4D242F9DC4038B57720DB0086690FBE8ADF7B176620DD9886590A9EEF8C2206AE6AD662094C1D39217341E95719AB84DAA1BF35EF61CD17AD8078BFE9D34475000FD4CF3BA1A533534671BD2A626A53D93327C8A7CB8AA962C164436B0968588FB39D6D67BE8AFF5E1FA218230149B924555F8AC1C078942A74453554B9CE0AE4B4025B86E9180BA194708A87E808E9F21104039585E581652625D543E5E434BEB59B4D89A2B1A2461C643553ED5ACF563F56C5B837A3C52F4E44F00B59370523F144B26972C1F552C01948795466A543E0FEF3ED8C58D6FFE47048D69D9CD4F8E3050556E1CB7670B37B2565D82843D9EA6EA68B69AA8B310BF9B629851354A6411724776933A524AA5D5550CBA6C8616C1635CA1AC09D609573AFE54147C1985BD415A9D7AACAAC7D24795C4F45945524C32CB069200C834F5B9B910F5868794F5F78A04944B85CF629D5388D6231C3D760CFDE1004EE24B24434E0052D219E2624CAC58ED8B4B9D722E01F250F2A01EB32BC4BF3DFBB938565BC1F4BA8361C31DB37CF38B25A04ED51FAA1AD6677F560975D26723B8ECD79C987DD75C3321257610539B01C5DCA4C423A0A8F265984A52D4031FEF3ED0C18D7FF72E04B5365C8950D88AA3968E4E176110212D628CE2583281A7DA2D3466232064B9FE0239ED8F3845D60356567B12FDCD022AF5B0A9E5C828D1C44F79324D7C3E4361A5ACEBB0B4B42BFD6CA5108BEF61900E119068684468B61A68B49BC2028EB214BD6E82C10AD53B967B2924395348B3CC8658693CDF465554858696CC63FA3E1313333C6639C4EDCF7E0E8ED55730B5EE625823CBA72ADF521550265262F3FB6E2EDA22801AAB0FE362135666198E42E68FFAE9351395EF7CD6D049E79E195029A61392122E6E3DD8C5B3DFFC2E44B5295D105B0094AA26A4A4B5D50D4D693AE759B4845ADCE2D2AC2C56A65B1C3BB4A219B38C08109F8B49DDA07A27FD006CF99E9D05151B60B3404D4EC68E511E74D032852370E0339E911DE8231F7B969704689DA327D0E9F631741C51C3248CC9F3A491B6CB5267ACFB6E1A6CDBC1DE68DF6D04D4F5BB427CF2D93F8C63B51398EEB8E84B171D75EC2ECDAB1F8A2A5F197A6413DA4B7DCE8C87F9CB09A3A0906C43138B6487CB26940951A16D716407B866C2F2FD6F00942712EA4423C54C92A11E79B8F50055BEFF81A83E8D02CC271A4BA853EB13AAC5D3D149435E766C3169189303A9D910D26EA2EF87B6511E20F11DF492AED0F18CB2908E83DCD533824AFBECEA7D2D0D7EF6A1B0C57E4E294FB97F4B163025A99602A20A48BF153B17323371CA6F2300D9BBAE14A069D51BC8EA2E56BC18A334314997B934860B49784A37459655A35D37266EAC3573B2CA17E1F61B7F18C76B27D0362A9F444A380E163748282571B442540555640E4DB908918851188AFB8DF5006C354C4DF23211BB26014D3CD1A2F25D2BE4C4E4B3332370920D6522251845BE5A079A31301546B8F5C1153CE7ADEF02A2FA86E052895D338F42DF9186E1104812EE2C910601593DF64A4A33D9E56B610D41EC223EDE4711B333600D7EA381AC51200E32F4066C23938BAAC848081AE20CBCA1C3551BF08D8BCD9D6914241E4F8ED51875D202EA0B32D7A494715C24296B02FA08DD0C71DC47EA6468D59A68A10D0C72A4A304FDF51EBCCC413BACC39BF63098CAA40F14BD0689A7AA1E43A224E282528B9B88C994F00D63A26A20C1469631C0304E71DD5280DB6FFA611C8B56303F54524259BEB184627D09FACEA4DA919039A609A17145491336E37C768230105A4F01A5E566B5C884C99317346A9A2F93DFAEDD778DE4454D3E3B3302279312907257634015988A42DCBA7F1537BDF55D70682F08056CC8A34ABEB5462698740829E842F28F3D68638459282D6B4227C2A83B44D21B49E029D53F2103B8CBD61DD4A6D840C0453F4DB01EF7259489C9750C18158ADC24EF9DAC4E9DCA123F1950260CC3F0605A2783FE26D6C32B9214EDA081C86FA83F6E3DC1A81F4BC1C9665447CD0F3158EFC1F101772644441F9B976350F4D02F86C8A581754D6A4D08F1C1C876D2EDF453196ADB2529E1922535805A0E70FB8DEA879AEB87E85668736B43ADAEAD49555B194F6A8C961537318B25C9C2B90883A0900889B2DA910E8C86A6DB6652FC9A3525123CEADA6B256F67F2D99911D87140196A9712495AB93262DB0BD0F65B70060E46AB23A403F525895DC09D3CC9A57119034B1387B52A9AF0A7EA1821412F1B4A8301EEC2BE51A1AA2CD6195B979E42424993363B7452778BEB3E9380D576D844943750747374D7FAC8E2185EE84B0116E94125A91FCCFAA50B6704444034E523687A18B9313A4CD330522F60E1D09C640BD3F1956E17C942FFDB360145D693D9CF4A9B5B6349F9860D0E270A9E200C4D8B002BBFF46D75D08CA66EE29568D03EEA518F9A006A67B02457D90C284DDF00DA31B0522F54E58B2223A1FE874A281AB486BE2E553E495F3312C4A854A492032F44504448BA43744F0C10A62E6A7E4D6868D94759A52825554C3E823E29A09FC640E8A135DF82173918E523F4F358FBCBAAD3A5922555252936B6B891126992A4AA655734E055D5520DD61157B2843AB112AC330A91AEC7187546888A084EC8FA104AD5935C618402B7720FF4410143A78391C71A852E1A33118A46845E9660341A6AE96776E7602F5FE92745A5F51480B22A5FED04E6076145E51BB37C945081103525C360B230C6C110FC4E9E532225B6F8A1649A006A8B83B5C5C3AA80623ABC0D2815E58D91E22E30ED3978CF832B78EEDBDE836118A2C65262A6B0090148562B71B4925120E594C9961568E611FC61886197B5FDFA928220B5BB59E8D201060C5A75330951F3720F5EC645E749346B9E7799EA8B7623423117E2583D45DED33633999BA02624BA8617597849A4B844E28DB7635A111E555116536184108164C294580885365DDB09E1AD65E8ACB19976208B5FCAAE30725D1A5D2B99C2EE216400194EC4280D91B0B4F7136DC7E44DA5081B390A2F40AFC8E48FE3451217E890C871189AC5F378591FA324C3BE650F5FB8E97938E01FC5CC2044225D6B781CB0B8A82C1F2325AC1FEA6CD33A01D4D946E861FE7E8384928C5DDA3E8C44D0AA44DC55A723FAA156F1BCB7BE1B71382546334B2DB3CE1E435F860C6465D2A1CB809A00114278998B7C3D1330D126D6405A0D99F14D681B8370191327363C9730032D187121F557280BE8E781D820F57688ACE120CE5894BF8B946E2C2F82CBA824B1DB68879BEA43A64974D51D437532F552893564B2530375B4DD863481EB11483D76E0A823A5046323016156D42694A05BE28B928EEF4E9ADDB444254D2ECFCDFA810E4B9879081911D2F4D17763F4286DF976A407E438DA841CD810FD618C6B77F9F8C2739E87838D154C2721464E6A1AC039521E7B02A88719003B7D790B28861E490B4F59C2E2FD93C5CF8550F7805B0FAEE2A637FD7738F559B028B057A4F09D5C2AB452D30BE149392C4AA9B49322E966F024044FDBBB6E8C64B0B7D0A058319FC5682F3549D36E94A1412E5C861FD1CF3317C16B8740E862055D69E0C6443E8242CD212609F27A9490A605A7A87A4C332498D864DA91DA13CDBC867C2541776D2012493A5EF029A41478A512BFEE2A650408259334CC96C60A5A4E9900A30A494948B597A0F09B3E82962F2AEDB048E40FC7C64304C74F910C49B201D7EE09F099EF7F160EB65631350C3074D9795E651AEB9C4F00B5D32BFE61BEDE66407131324E8D3D93A84235C308619EE0B6633D3CFB2FFF014EABA5AA8B31E8C986B5DC10F52C423A84946D4E0629FCC4831369066B851454B89A5033910262D610BAAC0368E8601321AE347186D00B85054C923E8A86877633423374B0E2A5E8D1AAC9C89AA9C52DA548942C569F4D46254FCB4DD75C0F51EEC34D7C49FC8BBB31A2A02E4988626F999840F17DB99A0A2F25C12C4926A18AB926151A128DE790E266E14BD2EAE2BE760A8C18311F79684FB10B628E4E30449AA442B33B918B22659C60817D7B6AF88FEF7F0E0E4F75303F88D0CD7A083CDD2058747402A88719003B7DF953014A776B0D93618D8805BF897F38F0106E7EFB6D70BC16E0A59205DBE44E8F10FEC885DFC9D01FA6E8B1835F106AB7084A8B8C45336D147A8926433C195BC746B69EE42156E9C5DA7BCC6FA284C16880A10BCC450D84ED002BCD91B071235693F5553DA31A96B1A22BA31CD81CC0F751774334FA018A6E21F1778C1D679933F1C050E0F8243C52238D4CBE56851E538E6CEC2A5091AA4CB4326FCC2C26F83C4D361407558A80CD07DA0E9A33813086C7DD0CFDFE71B8ACCD517878EC7C880FDDF82CA4E931CCD597D01BF5E581286109A609A0767AC53FCCD7B3E91B2F79C94B84F1932E0EB95676A57AC370A0DD8BCB78E7E7BE8417BCF5BF23AF2F8A0A852010D5295E1F22EBB28A0FD52C360260F4C3B826BD4833A102B612FBB7F96555D7B2691054B158968C4980A4A4E9E3CAEB2E5AD34DA4418E13F19A04B686515D7C4A4E92A119B6C4D62AFA09D235764874852667C30269F026F1779A4B252D35A5D9D956AB9E2990F4C39F59875DC3AD287DE5BF39338487C256D6DA35A0568313A6E86729D6FA2770FD9C8BDB7FFA67B1961D879F441244CCF79C00EA615EF80FD7E52DA0347D43490902CA65421B0354591F22C9F0F124C0F7FEE17F0366E6B050AFA19104888F74908E728C588ACBE382F4A4B0254385243542DA139E47D5239322A20DCF487C1428924CEC3516AF2467C7227479E8A168FB5228A6EF26186424480234D93E6694235F8BE1F675D72F8C7A97524D7429BD683F696854B535E7D6C67B13A06C7E124129CE5DEDD411B16D569261E831D0B8803F1DA01FD4D139F610FEEB375D8A7FF8AE6760CD1B48BB9B24D74ABBFCB023C7D924D4E6C8C69359BEB202D2E61D4DAB1E4D68F3AD4DF5568FB2852E99BEC1204CF167D0E0F63DA429BB563059101814116E7FA88B57BDF383B8E39E63A84711DCA081A297C20B6BE8FBB4385284C200BAB25069BC5362D88AC05B7D267B9C3A2DC93672E71FC175B43C57BD003A640B8B1C330930F41D8C58F1BF1EA139457593AD69805177200B394A3D840360E433B53CD7AEEF8C1564E62D8B74D2F631B182A76D2F7ADA87AF90380490483E880DC5E7CE6A1EA6E31A8AC445528B512F5CAC748F61B9E1E2579FF75D78C2A397F024771A27D235B80851B8A974E260E02D8B5CB2B6B904C79A222DA70DB82F8363C3A0D094E8CD190163EC59F795FAA1269112DB5D98673ADE2618BEF295AF94AEE5CC0CE53873C7D62ABE9AD4C6101AFA4F12BF89DF7AFB3FE34FFEF92EA4B53978CD0097ACF670AC95A011336A3B1329C51E485EB329C9786C0AB6B5748F939FD4B633623116AA62AE306CAEB08BF409D1FE61BABAEF1598868B88BFCB1841EE6010FA389127C80A1735D65B2F987745758F01F38C7BD26673394B7F4926B02F3617A9FCEDA9A86685CA3A66CDBF0C53F5966447B046B95774904F35B13A6CC239760CCFBC6E377EE7FF7C06AE5F2E3062AF6209BF3501C42CDCD968481BD60D3694E7DB3A2C1515D3081D0315E149C220B45DA33634A816DC8B7F42236BF933C5F4B59348899DC4535953E2E52F7F79D93645AB08692D040195990CCD522FB030B3884FDD7514BFF2F71FC1873FFD15E0CA79EC4D7C8C0AB6D06C603566BDBEBA76C1A094D12279DBFED86069DEDF65192551D98098AA9514FFC944BD64BED62CA311564E60B4FF10D2CE3AD06CA0BDF712607601EB1EB0CAB63AA9F6E4656483941B1B25EAC0A5F6E869DD70A6606C4FA21AB54F3A9624F0EA0CA7F2305C198A9FABEEF938DCF431DC7F0CD7CF39F8999BBF15CF7FCA63E0AFDE87F534C2D063347B6CD44D668278D201857DA14A40ADAE09C9A3A69A8D341F37742F6BB570DB0A8240702D0536A4A0BB9E27FEE932E557AB4DB030C7A3AE9D841E6D7B659EE1044AA897BDEC6592B5CB9F494248BAB50407182048B113F6667231F47C04A32EE6030F2B6E0BEFBCFD21FCC23BDF87FE09C09B9F971A7E593A44443B62D413EA9D355ACF859290D20834D0D97B370B04CCB1A3855AF2780476679E891AF09204BD430F6278E8101AC81136027446230CF200ADF925B4969710B71B588B5911A9C088C16E9E8B801112AC72E42460CD18296AC9E008D3A462EBE36CE9494A620FFDD481DF6C8B27777062151876F033CF7C1AFEAF1F780C961A47D0ED0638EE2F62CACDE0255D242C7D2DE1AC9A7121E92BAE2BDDE1C5865A59831F6A540607525D0FA6AAB21028A6E91A0145092521F9528A99F55AF46F024BBAB431AF44764A76279F04C76E7D92B77624558BEFFEEEEFC69FFFF99F8BAAC7DD51B26453D64DD0E80631B0A96FD1AEF232F4923E5AB5169CAC867AE4607828C18FBEEF7FE183FF7A27123742ADD58093F6D18A5CC4096733300BC66A7EC6592A8F585652D1632A8F2D35F25CAA9001EA59037DF491BAA914929C725DB48619F29575AC1D3B8CE1A08746C8E6D9DA302D20855EB8E8242CFAE263716609E1DE5DE80701D69221BA8EA37186A92FBEA5C41D0A5F47768EA9236A828C1B09948D056C585359885F6BA0484D8D3C60151724A4ECE321D295FDB8F67157E0F5DFFD6D78DA358B38E0E568F686E883C1BE4018D4246AC36E3736FA822A5FBD5EC7FEFDFBF1A4273D09478E1E41E0876529669BB829744FB555107F0ED80FD18C64D92F548B248903511CD5A6EC531A27B8F6D18F9E04C76E0D2B5B3A8A0B85A07AE2139F08DA514F7EF2934552B1AF13FF445124AAB6A85D9E27D9A46CD539720AF48B111A5E84C0CB1136A7F0B7FFF30EFCE507BE80CF7CE900A6765D82B5511F4DBF40C198372E6C86F97147E58ECCD2C25CFCE208920023E39CD5B633B695114904D96CE9D6F113A19F5B898BA9CE10C9894318AC1C45983988F210891F4AD93136B2E6F51B858780394B1861444ABC3587687A06C5C20C561B01BADD44C049658ACD0D0AA3EA92554C28A532AD022B795EC2565282A9A460036C6EF2092B34A5EC3795206D904209B07AE8202E9F6DE0A7FFCB75F8A9673E1E332C5D3D28D019C560F0C854AD211A99644DD0359126A5ED3A3D3D2DE9226F7FFBDBF1EA57BF5A7EFF9F5FFA92365C93D42EDB9ED4F4B4114FB6955C245B7C096C323B9856C5D4F6A0636FB4D61E23F598E2D113406D09285B3D8880E2A4B14B5EBBDDC60D37DC20EA1F7578EE980457C8222AECFC1E6A578D643090A4402EB0AEF488854453B4679670A493E10F6FFD04FEECC377A0E34D6176BA867CD445EAF8A0C5D260F1D4AC8B78C03CA150E2EF1864AA0558A8E2E52221723608802F691DB114E077B0081F8D610749670D2B478E221BAE238C982BE58BBF4792424C25D998D47FC282956CFDC9B4F414FD848D067C4CCFCEA335B70BBD4613ABD2910352F588EB8C81B7391943D3565DB26E1D4D71D70CE4042E8311B3004EC69E236D24E97124D319BAC77C34E202DFF9C45DF8F51F7C2A9E78F92CD6568E48AB9DA8602747093B97B83F5BE486D76DB5DB180E07989D9DC33FFFF33FE3965B5E83CF7DEE3FD06AB5641AEFBAF34E2937AD26D4380ECA360F280592A46FB0C66E696B593E4F7FA1B92E96C2D0CAB113406D152A5B3B4E0115A2D96C49C335AAD5975DF608BCE215AFC0777CC77708D88E1E3D2A004BE2041977499785577C2104423742BF3742587391E47DCC4540DA58C6FBEF5CC19FBEED7DF8D0E71F42303D85C5998600A09F25C8FC1A9A0464A6055A52A67CE789F49D1D0D07A236515A305D824988045CABE62238BC8AECC043E8774F20F53384615DCA74D9D4055BD7D12A8E928F25414D0CC865143855BB447C528DDA34DC5DBB50EC9E45ECD5D0E991DE4FA47458416692D289956473F57FD9BC2BC70BF599E9AC0D586F9D0C680DC78EF9D8379FE2A53FF48DB8E9DB1F8BB07F04ABFD5534DBBBE090321F0EC506A4439912900E65197B3F94CD89DAC06FFEE66FE23DEF798F24D0CECFCD89E6C0F48F3B09285F01659B02E8BB56DB0768148A026AB3776AD35AB05FF3A613406D0D285B3D4A62D85C1F515813237865F5B8A8DAC78F9FC00FFCC00F483336768DFCFFDBBBF618B9AAF3FE9B997BEFDC3B8F7D785FB6B18383E210C02E860895FE81690085586DA380A0C14011C510290F1A90AA483136A63634362F2798004E31D40AC2089C4484B61675086D4442092125046442E59A871FBBEBF57A76E73D73E74EF5FBCE3977EE2E361EC79B508919C95AEFCE9DC73DE77CE7FB9DEFFB7DBF6F646444E01F0BE7B8E058BD41A8E22463C249ABF9717439361AB509149B16E6647C04DE5CACDFF92E1EFBD1BFE07F470FC31B3A1981E509D268362AA0F8013D0F7BF84E4EE6914AA545938FA5E595441D69C7418AA0A55440736C1895C3E34095671F39B200019B53D39B28D6BBEA99CBF0BA3A89C9518164D786F27681C5B211EADE25A4C175CDB290EC7291ECEB4773D63CE41A75549858650F612A2191EF5EABCAE6C1200155B748CAF2FD1812C92CE05A189F1C43A6F80EAEBD601956FEF552F4DBEFA1DE7451AA5490B4183AE7B762D778E6E6687C7121F5D24053290F8EE362C7BF3D8B35B7DD8691E161C93B11113017C5B969342AD8B5EB4D257419A9880AA37DD3265A7BA88814F3075817CB944F3FBD93876AD758DAB98E93C61D928C69655C54F2518A3EB9DC2169A24CA3BAEEBAEB2402C8DA1C3E38C1FC47122D99150C60483083DC3B028B7A15A95805C96C16AF8E00DFFAD737F0E473AFC1E9EF86ED57E0A5320862BEEA2BCB739AAF0C9B8B9511ACACD344B656437CEC102AB9832897738853EDB5C9C4A90D9FDF932104C2434D6D1267158973E8C6E81A11A94008EBB5448F3356D510AF8284E7C2E99E8F5A7F1FAA290FD5661C956A80244BD783B26860940FD781641C48DAB0260BF0BB5D4CBC3782733E7906BE71F5F9F8CB4F95112B1451F33D043C17C56DA1E1B3CC8515CB52114FD1CC8642043D3D59ECDEBD47CE493B76EC1043220AA0A129067B429F638F625051E38A06726C3943B56C4F32D5C625693517454EA6E2A88FD34FEB0425DA319476AF31908F46C55D9846434321A6CF66D32895CA92F03DF3CC33B16EDD3A9C7DF6D91209E43F1A91E953CB4520BC38CB454388ACCA5B38CD3ABA9240DCEBC253BFD8856F3DFE02FE275703126564337D68C42C54FCAA947E34EB4D3816E1640CA97219F5F7F6C23F94438CA172EA35580E1A0C0430E7A36F50209D68861F3B302F50886733D1A550455964D79325DEA8C76165D2704F1A426DA01F638C6A561A4805714CC658EE5EC72CB86814028C5835CC6AD858F7D973F137CB4E41B62B8E4394166B3848F0FEFD8618AB63C761D3DC6B55398FD2F3781E0312C0962D5BB069D32639A39E7CF2C9F2930F6E2E26754107E2FBDAA02C52C1A676A33173AC209E62DBC7AC08E493141993760C244ACC5C3762230D9F16EEFB38ADE3A1DAB595B6AEA341D13B71A285EBC68DAB5E473A9D42A9540C3D0F83167CEEAAABAE9226D7030303E2AD8C019A902FAB79034227BA2A8BB53F0E927E15B1FA04DCFEF93854AEE1CEED2FE0BE5F8FC31F3D88A1FE6E94C81362A331B21D0873F68DA0B27F042E43CA2C43E7992AA070BFD2A9B0589128E15F2A21999CCCB16F573CB00E0CF0EA20F0A56B08BD41C2579D0D93B0617777A3B16008A56412E47E374A55F4D8BDD85F2E21703C7C7E41376E5FBE181F5B3088746E12659E91E21E925602956A01B64B564620A5F0413306279591B54B2FF4F39FFF02EBD6DD8ED75F7F1D838383A1682B8D8DE36EE6803FF9BB9CA1DE5467285DF5D292118B189294C0307E62592CA2D6C7C8687B458906EAE4951E2B65501D0F75ECA5D3FE152A91680BB4A3C7E1247272B91848DF917D4F17D311DE150A799C74D23CAC5AB50A175F7CB1847879780ED9156C6E26D88A392C5BB874E4C93C0261BF000013AA4944415431CAC6F2082799443699C62BBBF663F58F5FC48ED7F621397B2EE6DA556446F7617278946811763D40E0DAA2259188276111EAD5ABD25D90FC194742C5AA8F1335F5DA6A322F89E2685123E12D398BBC571FC9781255B6E969FA48916430300BCEBC8FE39D58976C1EA7BA05ACB9E45C7CE1FC45B02B75346C17FB0AA3C85A2E52F4B4014BDE2DD8CD3A027A6C5614DB49A45D475EBF69D37D78ECB1C7C573D3B8A26243619E2B24042BB4D068D4555082A154E9EBA4D30AC666E47A2D9546CF9B48584DD5E24435E3950A4E09B56B413F4D905714AD4ED8BC7D5369EF4AE3A1441B4F4445147EE743B4134C5364FD763C5F118A8C8C0CE3924B2EC5EDB7AF9570EFD8D8283CCF9C0118817350C8E7E17ADE946ADD26DB6E36EBC8A6D218775D7CFF3FDEC2A67F7E12EFED1AC79C4C067E750CF5862570B350E299A40E3795062893CC85231A0FAA90D074396FCB98427C14491DF33DC8E7735C54AA75C4EA55245349544A05A4AD2EC45C07C3B55164FB8670F95F7D165FFDE29FE39414458B7CE40A07D5192E66CB62A7CC34352A9467614D982DE3C1C7B3CF3E8B0D1BEEC49E3D6F63CE9CB902A7795E3209F49091A2C3E2E6776E6ECAA0DE6CB504550AB0EA9014B6D4527C4B89765A5642153FCA20298C289E499F28A3014026183B51BEF60CA5DDAB8E665006C2BDBF29000DAD81743A8DBD7BF7A2A7A7075FFFFADFE1FAEB57209F9FD02D3963A856AB9247E1CFE90FD64DB1D71365ED7B7BB2D8F3BBFDD8F0E873D8FCC31790EAEE455F770AC56201AE65C34B7B389C1B87E72A48A404FD35C7B0DD9BFC80EB9A01EBA16CA9EF6288DC65933437815CA582DC8103387FC9C95873F315F8CCB90BD02CD4902B5A68B26F54A302D7A5B6845AD8DCEC5590A626E456321DDE79E71D3977EEDCB953D2128C629A5211698E2D245EC59B34617915185294AF9641ED52895DC9C71A29B1703FD1CAB1E2AA95414563EA61AB8E56FE2AD41AE061AF635033B08A226F713483E2DFCD441B38A276C5A62C985C2E171ACCE1C3E358B26409D6AE5D8333CF5C8262B124AFA531196F673E926BA541E677C246AC348A188A48F77D02BEEDE0E9E75FC6868D4FE1D7AFBE8E051FFF24FC660CF94219B37A7B50AA1425B9C93305031433F110F2B550E913A8F981C8A3F5245DBCB56717FAE6CEC1DF5F7705AEBEF43398D71DC3C4F89BF09B1EE256AF84BE4579427A40A90827173F8D8841051AC7238F3C827BEEB947C68BDEC8753D490D9009C1800EC787D7D3008FEDA176491572E899F4CD1BDEABEE71A3B8AFEA0C1586F58E4EF3D76CF38E41CDC4526ABD47D4A0B8C37261D0083EC8A00CB3823FD5219A8C8A49298B58B16205BEF295AF09EB82E786E8EECB4F655F5C8BDC4D86AEBD0CF27E1109DF412A7918D974370E4E76E1E1AD4F61F3D6ED982C07E81F5A806A59B506E56BA740D030F16F18812DEE9D814472A7E1CA935F5A877B81B3A461C4E0DA716160E4C6F7E32F969D87D537DF844F9D9C46DDDF8FC93C43F5196432ECA638AACA407C46456DB8AE83F1F14352BB4498FBF2CB2F8B577AF1C51771CA29A7682F43186D4B7A82B54DF4EEA644A65D0FD5B68C98094AB4B34CF8253A06D5CE48B57F8D3128C211E3818C473A524B16F39C5908860A432846633C70E0004E3D75A164FD2FB8E002D98D19B4903C15D5629B148F0CD0489267172056A9C3733328935F140BE0A5E3487829FCE7ABEFE28EEF6CC34F7EF632064E9A27CD05E80D9AD29797A5F6BA549FC45BC945718356755724BB2AD3D14C6C56258612107CD6978432A3E171CB456035303E7C080B66A7B0F2A62B71F9C5E7C16D1624A95B2C0748B341402C40A55687E528A9B17A9DF42B5BA05E6F6F9F94BE6CDCB811DBB76F9771983B77AE304F18EC61F2967FABD5AAE2AD4C30623A9C36704FCD49423C7C1894300586C798DA30CAD7CE12E818543BA3747CD7440D6ABA3799FEFB91DE595481F479803F1DC7C6A14363723EB8E8A28BB061C386B0258B54DE3602816E9249E2FFC928674F593F80E33A28D754A942A6A70F13350B3F78F2DF71E7FDDBB0B76421D3D50BDBF1E1971A483931C41BACB76235115565C934B755C5AC08EA9374CBE2C6A6F404968603FC2C36D62633A3E2C34BBA28141B8857C670CDB273B1F21B37A27F16509A98845F9E44C2756133AFC47C90A827314246E81587E32855D8EEEE1E3CF5D493B8EBAEBB255F4783A1A732B4399EB178E633B266D3CF4B5129E928B43639C18E411DDF7AFED0AF8E1A94817906D37F9041F139739D49EE727170576548989ECAECC0AB57AFC6F2E5CB05FE31B725A5E1012B80D93A46C1C65ABD0C3BA108B735963E90CFD63F287AE6EF8C16B07AE356FC60C7CF90887BE81F9C877A390FC70EE0D7E342CDA0D7909072A03886094BEBE6B1A33A397ABAF134AB68DDD4002A9500E307F7E04F162FC4FA55D7E3C2B3985C2DA358CD239DB451AFD590EDEAC5D8D838BC94271E83D4233EC878E8EFEBC7EEDD6F63EDDA7FC04F7FFA3C66CDEA15C3E186C2FB16E8CCBA2D6ABC470A2CA34189E993DF31A80FDD1C4EFC0B4CF750D128533B1E4A413E558C2849E11A2371247C2605EE71210E0F0FE3BCA54BB1F29BDFC492B3164B2E8B7C3687410642C0066B9102B8B6877285CDD89AB092094C164B88D92E322EF5D57BB1FD27AFE18E6F6FC3AEDF1DC0C0FC01E41B6524621921D93214EF0AD3BC815A9D9ECB819D484A293EFB24C659914B1E9F03E447F370FD1856DFFC45ACB8F27CC4BD0A460F1591B6D348260234A4A52ECF7AACC76241A26A584DB253571719E0317CEF7B0FE3DB1BEF938D21935670598C85C11CCA0048A77A5FA49E0955CDE6C2713ADAB846215FC7439DF8DAFE50DEC11814A35066F73406D2AE414577609E95785660C294410BAAD19274BB6FDF5E61635C76D9E558B5EA16785E12FBF7EF97A817D3244C10DB8E2DB420A59BCE9DDD470315246D17F9F11C86667F0C13BE833577FE13B6FDE8BF900F12C8F6F752231931D655356BC29D632F25C74E2097AFC34A649048D45171EA28157CD40F1671D185A7E1DE357F8B85B367A17C7812093B40CD6AA0CA8EF77617EA351260552D18D9EF648DF0C160C22F7FF92BD0E3BEF5D65BF2DDCD46429029DDED752BD0E9895A33B9512F74A4093746C5B9E0983092A8D8E6ED45363B67A80FC58C5A1F3A5306154D529A04B1395F996007BD15237FB367CFC62DB7ACC4B2659F9324E7D8D84111C667A450450E09B9B8E33711B76AE2F5B2E921E4F2C3F0524D7465E6E2B95FBD8B75776DC12BBF7D159ED7876C6A3E9AF1328AFE419681A3526E22E5F48AD7ABE60F225F1EC149030358F9B51B70F9A59F46509B40AD9C4733484A8302862AEC98A5FA033078A2FB3131ACCEB2127ADBFBEFBF1FDFFDEE03E8E9518C70425D1326E73DF28C7FA4BC5DBB531C45077C0D43EAA447750CAADD11FC7F70DD4C18146FC384DACD798A6708C340E7F3DCB9798DDA759B92B8A541DD76DB1ACC9E3D4742CFFC3BE5C7B8A8EDB827F0A95A9D403ADD8D529930AA8A386B95E022D39745C96FE0FBDB9FC55D1B9FC4482E81AEA141C02E8BDA90C54A624A8C156B28E586B1E2868BF1D52F7F1E0B7B065099AC20F02B88C51DF82CEB677FAA664C180FB55A1971491EABE475D2B1F0CC33CF487065F7EEDD181C1C1248CBE7E99D7866E426600233C66345830DED4EB33128335653A8471D0FD5EE307EB8D79D88414D87355C4C26FB6F169C818DE64CD04A66C6303939214676CB2DAB71CD3557CB40B098514A4862B644EA58B2C1A6D0B5660D5E3C059FE1F5440571CB4750B5D03BD08FBDC387B172FD7D787AE7ABB0522721E6A6D18CD55039B80F672D1CC49DAB6EC29F9DF309148B1368F05CE77AA857AB086249C458A744F9E4262B8AEBA8342A48BB69A4D31EF6BCFD2EFEF18EDBF1CC8F9F9648250D8C8187B04C2472763C1AC43BDED93567521A298DB5556038C3904F5075270F75BCF373CCEB4FC4A00C943330C71CCCA72F2EB348A21090A2A58984625433D979C61967E09E7BEEC5E9A79F2A410B7A329EB98AA5A254CE9260CB08A0913723E4A231964B25385E1AD9B4872776BE86BBBEB305BBDE7C17438343B8E68ACFE1A62F7F01191B38B86F2F0606FA91CB17A4AF2E830695725905461A0C1E9085D1405F6F9FC0BF071E78100F3DF820F2F902E6CC9D239FCBEF64A09EB9D7E963F0FB78A6E824991C14FF16B2CD7FBF335494B5D72A858F56B974F250C7B48FE3BEE0440DEA783FD0189B8188DC89B9584965E28EFCA52FDD20DC40E673B880E9E98CC19A64A7596C84948469EC27952F953077702EDE1D29E1F16D3FC49F7EFA1C5C78DEA918CF1F9630FCACEE6E1C3E34896492C117B5581954A03193C4CAC008830FAFBCF2DF58BB76AD9457F03BD02B29E8A52846D1C0CD899C978E366EC7655046A32FF266ADA0C4119E144A92A81E29BA48C7A08E77F91EFBFA0FC3A008FFCC99838B9530D09CC3DE7E7B0F162D3A4322694B972E9585CCE23B2E66322EB8C88D77E07BD4D822A659C1ACDE34F2B922BC64065EA64B58E9138786117302342D1DA44866C40BF1A06F2A6269D024F88E8C8CE2A1873663EBD6ADAA5B87A7724F86246CCE4934C42891F5443DD2F4193AB641BDDFD944FF12B31294116BB506992AD91BBD54699B77A847C73692E3B9E2C806A592A212023673733C6FFA01D71AD8673C9539C4D3B0F8A0CE422E378E42A188CB2EBB4CCAEF59D14A0FC6454E8F6216B7A2F058F0D2349871A5519EF4E0D77C58415CBAB557EB25A4BC341A4D6A59D4D1A89791E9EA12952726A0693C4F3CF1041E7E780B7EF39BDF62CE9CD902EBF8FD4C148F9F436FC96B0DE4E3F306CACED0D0846F6308C553201F09C111DD5169831AEA971BC7438126619BAB872A7D67AB7B5DB16B1A23EBA2AB8E879AE9A953EC7106013299AC8657FC0CD512946A44528334457E7266BF83615C1862AE626FAB7A2C0628D881E2C61B6FC4B5D75E2B8B5A95DA2BF8C5FFB39933375AD562900B8B11375B04514A9502DC24CB3E14644B26C901A4E25043E01E85246FBDF5563CFFFCF352A43734345B6A99A49D8F7E44A15E34D012AED9E32AC66A6FECA21EB05A2D493D14ABAA45E7486A0555A986349433EA608CF54BC56E22DE24A493E03F5562B5061FDB3C8A40949E4F467B5802DDF150ED4D4ABB572983A2024F5A75B9601366A1CA283DF93FC623EAB5B8106828CCEFA81DDA176FB278F162DC7BEFBD58B870A1404043308D063C548F270BF51A4535C94C575EC4B6791E2B4F29AF78F4D14771F7DD77CBF364C6B36A99FA19C63B99FB8E265A4DC4D2246FFF5063633C14EFB15EAF4A1E8ADD50A4F2DFF0E5796F5A9759598A82126181A1126D5656A7944395DA9ABC8CBFC679866A60D1A2451DE5D8199C49B5C3C591CD2A4A8D08AD4838583A47877ADB33F891477CAB70A7353AF7524C4B9D09EEC20DA12A917CCAC670D4B4106E1DBB5B54ABE199467CAB88A128E9676E0EF438BCD6B01A5E7AE925AC5FBF5ECA2C4C289C1E8C1EF968858B518FF1871E07730FFCC93161D8FC8D37DE10D55EE5A1D85552C456948DA8AE0921FA8B251209A585A9145A448F5A156F692FAEE9F814E720ED7F70604035F45220710A1C319052BD563FA73F502ED76D735819FCBE122CF31AE940A7AA87758B07FD3A835995A14FD1459345192949D650D5287BAAE73424E1BBEBCA4B11F3D46A3D51E51AD38356F74BD081197DB7D17B93F7921B8B481EAAEF493901A520A5EFA57550D5C290FA3E8200A94C0ADD5D5D12E5AAD71BB271D1C8A4D58BA6D2FC3116520B4651E84555B3D2C0C9C6A3D8251736611A9597D8208E9A16ED3E4873DABC7933B66DDB26C18DF9F3E74BF4CE041978BFAC59521E2FEA9AB52C8376D7D1D07FD48BB5FB3D8E7D9D3ABFB26309C3FA070EEC158DC418FF264646F5592D4FCD79D69D82E47BD319598984B4F95156A68AD54472827850C437A49D71680C2289CB174AF8CF2C43418B262838456F40493B2B4F270B4D4B3C4B5302E966A02C4114639428B40C2721A6885329FD0B3DC41133D6066B5A1A4F99882965CA4A015FE087699DA00BE5B879880496169E0FAB958D41E8EA1EBD1768E3335DD3F53D4D81007A93D1DA1C72AF5A275E75B29076EC61819DD9D9A8CCF3873C271D7B1175AE38DA08700EA955C1490B5B95EA3994A3921899B22C85E4546353DD59C03408500B596080AC61E3315A06217FD57DA3A65671B6821BC62B857A666230DA03E94E7DB2D0229FAF3F4D9448A58FAB5E6BEABB2B63332EC32CE9D03B85CD97F5EB8C07112CDF52706A7D9E0ABE28B8D3F27C2D7D0DADFCA48D31F478467F2374FBBAF58F8609A173D65EDC18730B4AEBE96B4A9B2F65E8E1C61371EEDAF04DEAC2C863AB0C87BE27DD8645A9236964A1E7468DADF696A10FD57310DEAFDE4CCD39DA1CBCF5E6168A3486D2DC4A9DA4358B916A5DF95C1D190EF7CA087A08BB6928B4D2D2808CC81AEBF736F2CEF249E675F2B2C8CEAD5BCA180D94B075935E22613BA61029882A8C39EDE8038DD653D1ABAB25AEAC505474AB0BD779441DCC84C8C3EF48C8172EEA0874315ED7740D3109DE16D66EA1B62962B3D1FCF051CCFE4897B402F466973733A290A50101AD44730466E94BDFFF71FA5511B817B147ED65153C350A3611F711BE9D7A4E1BBE0178DA98A2D0751A1A9CF6FAF721641551550037DC2C14AC30703BF27FBD5AA6A70B5BBFB70CCC8050592A219E9FB234A64C994A37B6C2C0D1319EBAA3456721AA366C56B0DE94D416A11748EBC8FEBE0F8D6C906A14CC917FFA7868A39A324AD1D99E7AEFAD816F9D1A5A65F891EF13BD5003F1308364F63C3D6D475ACAD16F69E641CE501D87DF1981CE08CCCC08740C6A66C6B1F32E9D115000BFE3A13A2BA133023337021D839AB9B1ECBC53670454946FA609869D71ED8CC047750424A8315D5DF4A33A189DFBEE8CC0898E801894F4EB89482D9DE89B765EDF19818FE208901411BB72F9F2E6E3DBB6C9FD773CD547711974EE792646804C783EFE0F0A507581F460CF450000000049454E44AE426082 WHERE `app_id` = '8';
+
+-- for R1 Enhanced Notification ticket source from JIRA
+INSERT INTO `ep_basic_auth_account` VALUES (1,'JIRA','jira','6APqvG4AU2rfLgCvMdySwQ==','Y');
+
+-- for setting up CLI and AAI-UI to be visible on Home page for demo account
+INSERT INTO `fn_pers_user_app_sel` VALUES (1,1,7,'S');
+INSERT INTO `fn_pers_user_app_sel` VALUES (2,1,8,'S');
+
+commit;
diff --git a/kubernetes/portal/charts/portal-mariadb/templates/NOTES.txt b/kubernetes/portal/charts/portal-mariadb/templates/NOTES.txt
new file mode 100644 (file)
index 0000000..c60c745
--- /dev/null
@@ -0,0 +1,19 @@
+1. Get the application URL by running these commands:
+{{- if .Values.ingress.enabled }}
+{{- range .Values.ingress.hosts }}
+  http://{{ . }}
+{{- end }}
+{{- else if contains "NodePort" .Values.service.type }}
+  export NODE_PORT=$(kubectl get --namespace {{ include "common.namespace" . }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "common.name" . }})
+  export NODE_IP=$(kubectl get nodes --namespace {{ include "common.namespace" . }} -o jsonpath="{.items[0].status.addresses[0].address}")
+  echo http://$NODE_IP:$NODE_PORT
+{{- else if contains "LoadBalancer" .Values.service.type }}
+     NOTE: It may take a few minutes for the LoadBalancer IP to be available.
+           You can watch the status of by running 'kubectl get svc -w {{ include "common.name" . }}'
+  export SERVICE_IP=$(kubectl get svc --namespace {{ include "common.namespace" . }} {{ include "common.name" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
+  echo http://$SERVICE_IP:{{ .Values.service.externalPort }}
+{{- else if contains "ClusterIP" .Values.service.type }}
+  export POD_NAME=$(kubectl get pods --namespace {{ include "common.namespace" . }} -l "app={{ include "common.name" . }},release={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
+  echo "Visit http://127.0.0.1:8080 to use your application"
+  kubectl port-forward $POD_NAME 8080:{{ .Values.service.internalPort }}
+{{- end }}
diff --git a/kubernetes/portal/charts/portal-mariadb/templates/configmap.yaml b/kubernetes/portal/charts/portal-mariadb/templates/configmap.yaml
new file mode 100644 (file)
index 0000000..fd42fd4
--- /dev/null
@@ -0,0 +1,22 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: {{ include "common.fullname" . }}-docker-entry-initd
+  namespace: {{ include "common.namespace" . }}
+data:
+{{ tpl (.Files.Glob "resources/config/mariadb/docker-entrypoint-initdb.d/*").AsConfig . | indent 2 }}
+
diff --git a/kubernetes/portal/charts/portal-mariadb/templates/deployment.yaml b/kubernetes/portal/charts/portal-mariadb/templates/deployment.yaml
new file mode 100644 (file)
index 0000000..fd5e524
--- /dev/null
@@ -0,0 +1,95 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: extensions/v1beta1
+kind: Deployment
+metadata:
+  name: {{ include "common.fullname" . }}
+  namespace: {{ include "common.namespace" . }}
+  labels:
+    app: {{ include "common.name" . }}
+    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
+    release: {{ .Release.Name }}
+    heritage: {{ .Release.Service }}
+spec:
+  replicas: {{ .Values.replicaCount }}
+  template:
+    metadata:
+      labels:
+        app: {{ include "common.name" . }}
+        release: {{ .Release.Name }}
+    spec:
+      containers:
+        - name: {{ include "common.name" . }}
+          image: {{ .Values.global.repository | default .Values.repository }}/{{ .Values.image }}
+          imagePullPolicy: {{ .Values.global.pullPolicy | default .Values.pullPolicy }}
+          ports:
+          - containerPort: {{ .Values.service.internalPort }}
+          # disable liveness probe when breakpoints set in debugger
+          # so K8s doesn't restart unresponsive container
+          {{- if eq .Values.liveness.enabled true }}
+          livenessProbe:
+            tcpSocket:
+              port: {{ .Values.service.internalPort }}
+            initialDelaySeconds: {{ .Values.liveness.initialDelaySeconds }}
+            periodSeconds: {{ .Values.liveness.periodSeconds }}
+          {{end -}}
+          readinessProbe:
+            tcpSocket:
+              port: {{ .Values.service.internalPort }}
+            initialDelaySeconds: {{ .Values.readiness.initialDelaySeconds }}
+            periodSeconds: {{ .Values.readiness.periodSeconds }}
+          env:
+            - name: MYSQL_HOST
+              value: "{{ .Values.service.name }}"
+            - name: MYSQL_ROOT_PASSWORD
+              valueFrom:
+                secretKeyRef:
+                  name: {{ template "common.fullname" . }}
+                  key: db-root-password
+          volumeMounts:
+          - mountPath: /var/lib/mysql
+            name: mariadb-data
+          - mountPath: /etc/localtime
+            name: localtime
+            readOnly: true
+          - name: mariadb-docker-entrypoint-initdb
+            mountPath: /docker-entrypoint-initdb.d/zzz_apps_users_onboarding.sql
+            subPath: Apps_Users_OnBoarding_Script.sql
+          resources:
+{{ toYaml .Values.resources | indent 12 }}
+        {{- if .Values.nodeSelector }}
+        nodeSelector:
+{{ toYaml .Values.nodeSelector | indent 10 }}
+        {{- end -}}
+        {{- if .Values.affinity }}
+        affinity:
+{{ toYaml .Values.affinity | indent 10 }}
+        {{- end }}
+      volumes:
+      {{- if .Values.persistence.enabled }}
+        - name: mariadb-data
+          persistentVolumeClaim:
+            claimName: {{ include "common.fullname" . }}
+      {{- else }}
+          emptyDir: {}
+      {{- end }}
+        - name: mariadb-docker-entrypoint-initdb
+          configMap:
+            name: {{ include "common.fullname" . }}-docker-entry-initd
+        - name: localtime
+          hostPath:
+            path: /etc/localtime
+      imagePullSecrets:
+      - name: "{{ include "common.namespace" . }}-docker-registry-key"
diff --git a/kubernetes/portal/charts/portal-mariadb/templates/pv.yaml b/kubernetes/portal/charts/portal-mariadb/templates/pv.yaml
new file mode 100644 (file)
index 0000000..184728f
--- /dev/null
@@ -0,0 +1,37 @@
+{{/*
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+*/}}
+
+{{- if and .Values.persistence.enabled (not .Values.persistence.existingClaim) -}}
+kind: PersistentVolume
+apiVersion: v1
+metadata:
+  name: {{ include "common.fullname" . }}
+  namespace: {{ include "common.namespace" . }}
+  labels:
+    app: {{ include "common.name" . }}
+    chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}"
+    release: "{{ .Release.Name }}"
+    heritage: "{{ .Release.Service }}"
+    name: {{ include "common.fullname" . }}
+spec:
+  capacity:
+    storage: {{ .Values.persistence.size}}
+  accessModes:
+    - {{ .Values.persistence.accessMode }}
+  persistentVolumeReclaimPolicy: {{ .Values.persistence.volumeReclaimPolicy }}
+  hostPath:
+    path: {{ .Values.global.persistence.mountPath | default .Values.persistence.mountPath }}/{{ .Release.Name }}/{{ .Values.persistence.mountSubPath }}
+{{- end -}}
diff --git a/kubernetes/portal/charts/portal-mariadb/templates/pvc.yaml b/kubernetes/portal/charts/portal-mariadb/templates/pvc.yaml
new file mode 100644 (file)
index 0000000..e27c331
--- /dev/null
@@ -0,0 +1,48 @@
+{{/*
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+*/}}
+
+{{- if and .Values.persistence.enabled (not .Values.persistence.existingClaim) -}}
+kind: PersistentVolumeClaim
+apiVersion: v1
+metadata:
+  name: {{ include "common.fullname" . }}
+  namespace: {{ include "common.namespace" . }}
+  labels:
+    app: {{ include "common.name" . }}
+    chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
+    release: "{{ .Release.Name }}"
+    heritage: "{{ .Release.Service }}"
+{{- if .Values.persistence.annotations }}
+  annotations:
+{{ toYaml .Values.persistence.annotations | indent 4 }}
+{{- end }}
+spec:
+  selector:
+    matchLabels:
+      name: {{ include "common.fullname" . }}
+  accessModes:
+    - {{ .Values.persistence.accessMode }}
+  resources:
+    requests:
+      storage: {{ .Values.persistence.size }}
+{{- if .Values.persistence.storageClass }}
+{{- if (eq "-" .Values.persistence.storageClass) }}
+  storageClassName: ""
+{{- else }}
+  storageClassName: "{{ .Values.persistence.storageClass }}"
+{{- end }}
+{{- end }}
+{{- end -}}
diff --git a/kubernetes/portal/charts/portal-mariadb/templates/secrets.yaml b/kubernetes/portal/charts/portal-mariadb/templates/secrets.yaml
new file mode 100644 (file)
index 0000000..4d65c07
--- /dev/null
@@ -0,0 +1,27 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: v1
+kind: Secret
+metadata:
+  name: {{ include "common.fullname" . }}
+  namespace: {{ include "common.namespace" . }}
+  labels:
+    app: {{ include "common.name" . }}
+    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
+    release: {{ .Release.Name }}
+    heritage: {{ .Release.Service }}
+type: Opaque
+data:
+  db-root-password: {{ .Values.config.mariadbRootPassword | b64enc | quote }}
diff --git a/kubernetes/portal/charts/portal-mariadb/templates/service.yaml b/kubernetes/portal/charts/portal-mariadb/templates/service.yaml
new file mode 100644 (file)
index 0000000..11b3b48
--- /dev/null
@@ -0,0 +1,38 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ include "common.fullname" . }}
+  namespace: {{ include "common.namespace" . }}
+  labels:
+    app: {{ include "common.name" . }}
+    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
+    release: {{ .Release.Name }}
+    heritage: {{ .Release.Service }}
+spec:
+  type: {{ .Values.service.type }}
+  ports:
+    {{if eq .Values.service.type "NodePort" -}}
+    - port: {{ .Values.service.internalPort }}
+      nodePort: {{ .Values.global.nodePortPrefix | default "302" }}{{ .Values.service.externalPort }}
+    {{- else -}}
+    - port: {{ .Values.service.externalPort }}
+      targetPort: {{ .Values.service.internalPort }}
+    {{- end}}
+      name: {{ .Values.service.name }}
+  selector:
+    app: {{ include "common.name" . }}
+    release: {{ .Release.Name }}
\ No newline at end of file
diff --git a/kubernetes/portal/charts/portal-mariadb/values.yaml b/kubernetes/portal/charts/portal-mariadb/values.yaml
new file mode 100644 (file)
index 0000000..629ec86
--- /dev/null
@@ -0,0 +1,102 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Default values for mariadb.
+# This is a YAML-formatted file.
+# Declare variables to be passed into your templates.
+global: # global defaults
+  nodePortPrefix: 302
+  repositorySecret: eyJuZXh1czMub25hcC5vcmc6MTAwMDEiOnsidXNlcm5hbWUiOiJkb2NrZXIiLCJwYXNzd29yZCI6ImRvY2tlciIsImVtYWlsIjoiQCIsImF1dGgiOiJaRzlqYTJWeU9tUnZZMnRsY2c9PSJ9fQ==
+  persistence: {}
+
+
+# application image
+repository: nexus3.onap.org:10001
+image: onap/portal-db:latest
+pullPolicy: Always
+
+# application configuration
+config:
+  mariadbRootPassword: Aa123456
+
+
+# default number of instances
+replicaCount: 1
+
+nodeSelector: {}
+
+affinity: {}
+
+# probe configuration parameters
+liveness:
+  initialDelaySeconds: 10
+  periodSeconds: 10
+  # necessary to disable liveness probe when setting breakpoints
+  # in debugger so K8s doesn't restart unresponsive container
+  enabled: true
+
+readiness:
+  initialDelaySeconds: 10
+  periodSeconds: 10
+
+## Persist data to a persitent volume
+persistence:
+  enabled: true
+
+  ## A manually managed Persistent Volume and Claim
+  ## Requires persistence.enabled: true
+  ## If defined, PVC must be created manually before volume will be bound
+  # existingClaim:
+  volumeReclaimPolicy: Retain
+
+  ## database data Persistent Volume Storage Class
+  ## If defined, storageClassName: <storageClass>
+  ## If set to "-", storageClassName: "", which disables dynamic provisioning
+  ## If undefined (the default) or set to null, no storageClassName spec is
+  ##   set, choosing the default provisioner.  (gp2 on AWS, standard on
+  ##   GKE, AWS & OpenStack)
+  ##
+  # storageClass: "-"
+  accessMode: ReadWriteMany
+  size: 2Gi
+  mountPath: /dockerdata-nfs
+  mountSubPath: portal/mariadb/data
+
+service:
+  type: ClusterIP
+  name: mariadb
+  externalPort: 3306
+  internalPort: 3306
+
+ingress:
+  enabled: false
+
+resources: {}
+  # We usually recommend not to specify default resources and to leave this as a conscious
+  # choice for the user. This also increases chances charts run on environments with little
+  # resources, such as Minikube. If you do want to specify resources, uncomment the following
+  # lines, adjust them as necessary, and remove the curly braces after 'resources:'.
+  #
+  # Example:
+  # Configure resource requests and limits
+  # ref: http://kubernetes.io/docs/user-guide/compute-resources/
+  # Minimum memory for development is 2 CPU cores and 4GB memory
+  # Minimum memory for production is 4 CPU cores and 8GB memory
+#resources:
+#  limits:
+#    cpu: 2
+#    memory: 4Gi
+#  requests:
+#    cpu: 2
+#    memory: 4Gi
diff --git a/kubernetes/portal/charts/portal-sdk/.helmignore b/kubernetes/portal/charts/portal-sdk/.helmignore
new file mode 100644 (file)
index 0000000..f0c1319
--- /dev/null
@@ -0,0 +1,21 @@
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
diff --git a/kubernetes/portal/charts/portal-sdk/Chart.yaml b/kubernetes/portal/charts/portal-sdk/Chart.yaml
new file mode 100644 (file)
index 0000000..36125e6
--- /dev/null
@@ -0,0 +1,18 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: v1
+description: Portal software development kit
+name: portal-sdk
+version: 2.0.0
\ No newline at end of file
@@ -5,57 +5,52 @@
   ===================================================================
   Copyright © 2017 AT&T Intellectual Property. All rights reserved.
   ===================================================================
+
   Unless otherwise specified, all software contained herein is licensed
   under the Apache License, Version 2.0 (the “License”);
   you may not use this software except in compliance with the License.
   You may obtain a copy of the License at
+
               http://www.apache.org/licenses/LICENSE-2.0
+
   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
+
   Unless otherwise specified, all documentation contained herein is licensed
   under the Creative Commons License, Attribution 4.0 Intl. (the “License”);
   you may not use this documentation except in compliance with the License.
   You may obtain a copy of the License at
+
               https://creativecommons.org/licenses/by/4.0/
+
   Unless required by applicable law or agreed to in writing, documentation
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
+
   ============LICENSE_END============================================
+
   ECOMP is a trademark and service mark of AT&T Intellectual Property.
   -->
-
 <configuration scan="true" scanPeriod="3 seconds" debug="true">
-  <!-- 
-  Logback files for the ONAP Portal SDK Application 
+  <!--
+  Logback files for the ONAP Portal SDK Application
   are created in directory ${catalina.base}/logs/${componentName}
-  e.g., apache-tomcat-8.0.35/logs/epsdk_app/application.log  
+  e.g., apache-tomcat-8.0.35/logs/onapsdk/application.log
   -->
   <!--<jmxConfigurator /> -->
-
   <!--  specify the component name -->
-  <property name="componentName" value="epsdk_app"></property>
-  
+  <property name="componentName" value="onapsdk"></property>
   <!--  specify the base path of the log directory -->
   <property name="logDirPrefix" value="${catalina.base}/logs"></property>
-  
   <!-- The directories where logs are written -->
   <property name="logDirectory" value="${logDirPrefix}/${componentName}" />
   <!-- Can easily relocate debug logs by modifying this path. -->
   <property name="debugLogDirectory" value="${logDirPrefix}/${componentName}" />
-  
   <!--  log file names -->
   <property name="generalLogName" value="application" />
   <property name="errorLogName" value="error" />
   <property name="auditLogName" value="audit" />
   <property name="debugLogName" value="debug" />
   <!--
-  These loggers are not used in code (yet). 
-  <property name="securityLogName" value="security" />
-  <property name="policyLogName" value="policy" />
-  <property name="performanceLogName" value="performance" />
-  <property name="serverLogName" value="server" />
+  These loggers are not used in code (yet).
+  <property name="securityLogName" value="security" /><property name="policyLogName" value="policy" /><property name="performanceLogName" value="performance" /><property name="serverLogName" value="server" />
    -->
-  
-  <!-- 1610 Logging Fields Format Revisions --> 
-  <property name="auditLoggerPattern"
-       value="%X{AuditLogBeginTimestamp}|%X{AuditLogEndTimestamp}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{VirtualServerName}|%X{ServiceName}|%X{PartnerName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{Timer}|%X{ServerFQDN}|%X{ClientIPAddress}|%X{ClassName}|%X{Unused}|%X{ProcessKey}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}| %msg%n" />
-
-  <property name="metricsLoggerPattern"
-       value="%X{MetricsLogBeginTimestamp}|%X{MetricsLogEndTimestamp}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{VirtualServerName}|%X{ServiceName}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{Timer}|%X{ServerFQDN}|%X{ClientIPAddress}|%X{ClassName}|%X{Unused}|%X{ProcessKey}|%X{TargetVisualEntity}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}| %msg%n" />
-
-  <property name="errorLoggerPattern"
-       value="%date{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}|%X{RequestId}|%thread|%X{ServiceName}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%X{ClassName}|%X{AlertSeverity}|%X{ErrorCode}|%X{ErrorDescription}| %msg%n" />
-
-  <property name="defaultLoggerPattern"
-       value="%date{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}|%X{RequestId}|%thread|%X{ClassName}| %msg%n" />
-
+  <!-- 1610 Logging Fields Format Revisions -->
+  <property name="auditLoggerPattern" value="%X{AuditLogBeginTimestamp}|%X{AuditLogEndTimestamp}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{VirtualServerName}|%X{ServiceName}|%X{PartnerName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{Timer}|%X{ServerFQDN}|%X{ClientIPAddress}|%X{ClassName}|%X{Unused}|%X{ProcessKey}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}| %msg%n" />
+  <property name="metricsLoggerPattern" value="%X{MetricsLogBeginTimestamp}|%X{MetricsLogEndTimestamp}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{VirtualServerName}|%X{ServiceName}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{Timer}|%X{ServerFQDN}|%X{ClientIPAddress}|%X{ClassName}|%X{Unused}|%X{ProcessKey}|%X{TargetVisualEntity}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}| %msg%n" />
+  <property name="errorLoggerPattern" value="%date{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}|%X{RequestId}|%thread|%X{ServiceName}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%X{ClassName}|%X{AlertSeverity}|%X{ErrorCode}|%X{ErrorDescription}| %msg%n" />
+  <property name="defaultLoggerPattern" value="%date{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}|%X{RequestId}|%thread|%X{ClassName}| %msg%n" />
   <!-- use %class so library logging calls yield their class name -->
-  <property name="applicationLoggerPattern"
-       value="%date{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}|%X{RequestId}|%thread|%class{36}| %msg%n" />
-
+  <property name="applicationLoggerPattern" value="%date{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}|%X{RequestId}|%thread|%class{36}| %msg%n" />
   <!-- Example evaluator filter applied against console appender -->
   <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
     <encoder>
       <pattern>${defaultLoggerPattern}</pattern>
     </encoder>
   </appender>
-
   <!-- ============================================================================ -->
   <!-- EELF Appenders -->
   <!-- ============================================================================ -->
-
-  <!-- The EELFAppender is used to record events to the general application 
+  <!-- The EELFAppender is used to record events to the general application
     log -->
-    
-    
-  <appender name="EELF"
-    class="ch.qos.logback.core.rolling.RollingFileAppender">
+  <appender name="EELF" class="ch.qos.logback.core.rolling.RollingFileAppender">
     <file>${logDirectory}/${generalLogName}.log</file>
-    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 
-      <!-- daily rollover --> 
-      <fileNamePattern>${logDirectory}/${generalLogName}.%d{yyyy-MM-dd}.log.zip</fileNamePattern> 
-      <!-- keep 30 days' worth of history capped at 3GB total size --> 
-      <maxHistory>30</maxHistory> 
-      <totalSizeCap>3GB</totalSizeCap> 
+    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+      <!-- daily rollover -->
+      <fileNamePattern>${logDirectory}/${generalLogName}.%d{yyyy-MM-dd}.log.zip</fileNamePattern>
+      <!-- keep 30 days' worth of history capped at 3GB total size -->
+      <maxHistory>30</maxHistory>
+      <totalSizeCap>3GB</totalSizeCap>
     </rollingPolicy>
     <encoder>
       <pattern>${applicationLoggerPattern}</pattern>
     </encoder>
     <filter class="org.onap.portalapp.util.CustomLoggingFilter" />
   </appender>
-  
   <appender name="asyncEELF" class="ch.qos.logback.classic.AsyncAppender">
     <queueSize>256</queueSize>
     <!-- Class name is part of caller data -->
     <includeCallerData>true</includeCallerData>
     <appender-ref ref="EELF" />
   </appender>
-
-  <!-- EELF Security Appender. This appender is used to record security events 
-    to the security log file. Security events are separate from other loggers 
-    in EELF so that security log records can be captured and managed in a secure 
-    way separate from the other logs. This appender is set to never discard any 
+  <!-- EELF Security Appender. This appender is used to record security events
+    to the security log file. Security events are separate from other loggers
+    in EELF so that security log records can be captured and managed in a secure
+    way separate from the other logs. This appender is set to never discard any
     events. -->
-  <!--     
-  <appender name="EELFSecurity"
-    class="ch.qos.logback.core.rolling.RollingFileAppender">
-    <file>${logDirectory}/${securityLogName}.log</file>
-    <rollingPolicy
-      class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-      <fileNamePattern>${logDirectory}/${securityLogName}.%i.log.zip
-      </fileNamePattern>
-      <minIndex>1</minIndex>
-      <maxIndex>9</maxIndex>
-    </rollingPolicy>
-    <triggeringPolicy
-      class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-      <maxFileSize>5MB</maxFileSize>
-    </triggeringPolicy>
-    <encoder>
-      <pattern>${defaultPattern}</pattern>
-    </encoder>
-  </appender>
-  
-  <appender name="asyncEELFSecurity" class="ch.qos.logback.classic.AsyncAppender">
-    <queueSize>256</queueSize>
-    <discardingThreshold>0</discardingThreshold>
-    <appender-ref ref="EELFSecurity" />
-  </appender>
+  <!--
+  <appender name="EELFSecurity" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${logDirectory}/${securityLogName}.log</file><rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"><fileNamePattern>${logDirectory}/${securityLogName}.%i.log.zip
+      </fileNamePattern><minIndex>1</minIndex><maxIndex>9</maxIndex></rollingPolicy><triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"><maxFileSize>5MB</maxFileSize></triggeringPolicy><encoder><pattern>${defaultPattern}</pattern></encoder></appender><appender name="asyncEELFSecurity" class="ch.qos.logback.classic.AsyncAppender"><queueSize>256</queueSize><discardingThreshold>0</discardingThreshold><appender-ref ref="EELFSecurity" /></appender>
    -->
-   
-  <!-- EELF Performance Appender. This appender is used to record performance 
+  <!-- EELF Performance Appender. This appender is used to record performance
     records. -->
   <!--
-  <appender name="EELFPerformance"
-    class="ch.qos.logback.core.rolling.RollingFileAppender">
-    <file>${logDirectory}/${performanceLogName}.log</file>
-    <rollingPolicy
-      class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-      <fileNamePattern>${logDirectory}/${performanceLogName}.%i.log.zip
-      </fileNamePattern>
-      <minIndex>1</minIndex>
-      <maxIndex>9</maxIndex>
-    </rollingPolicy>
-    <triggeringPolicy
-      class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-      <maxFileSize>5MB</maxFileSize>
-    </triggeringPolicy>
-    <encoder>
-      <outputPatternAsHeader>true</outputPatternAsHeader>
-      <pattern>${defaultPattern}</pattern>
-    </encoder>
-  </appender>
-  <appender name="asyncEELFPerformance" class="ch.qos.logback.classic.AsyncAppender">
-    <queueSize>256</queueSize>
-    <appender-ref ref="EELFPerformance" />
-  </appender>
+  <appender name="EELFPerformance" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${logDirectory}/${performanceLogName}.log</file><rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"><fileNamePattern>${logDirectory}/${performanceLogName}.%i.log.zip
+      </fileNamePattern><minIndex>1</minIndex><maxIndex>9</maxIndex></rollingPolicy><triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"><maxFileSize>5MB</maxFileSize></triggeringPolicy><encoder><outputPatternAsHeader>true</outputPatternAsHeader><pattern>${defaultPattern}</pattern></encoder></appender><appender name="asyncEELFPerformance" class="ch.qos.logback.classic.AsyncAppender"><queueSize>256</queueSize><appender-ref ref="EELFPerformance" /></appender>
   -->
-
-  <!-- EELF Server Appender. This appender is used to record Server related 
-    logging events. The Server logger and appender are specializations of the 
-    EELF application root logger and appender. This can be used to segregate Server 
-    events from other components, or it can be eliminated to record these events 
+  <!-- EELF Server Appender. This appender is used to record Server related
+    logging events. The Server logger and appender are specializations of the
+    EELF application root logger and appender. This can be used to segregate Server
+    events from other components, or it can be eliminated to record these events
     as part of the application root log. -->
   <!--
-  <appender name="EELFServer"
-    class="ch.qos.logback.core.rolling.RollingFileAppender">
-    <file>${logDirectory}/${serverLogName}.log</file>
-    <rollingPolicy
-      class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-      <fileNamePattern>${logDirectory}/${serverLogName}.%i.log.zip
-      </fileNamePattern>
-      <minIndex>1</minIndex>
-      <maxIndex>9</maxIndex>
-    </rollingPolicy>
-    <triggeringPolicy
-      class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-      <maxFileSize>5MB</maxFileSize>
-    </triggeringPolicy>
-    <encoder>
-        <pattern>${defaultPattern}</pattern>
-    </encoder>
-  </appender>
-  <appender name="asyncEELFServer" class="ch.qos.logback.classic.AsyncAppender">
-    <queueSize>256</queueSize>
-    <appender-ref ref="EELFServer" />
-  </appender>
+  <appender name="EELFServer" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${logDirectory}/${serverLogName}.log</file><rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"><fileNamePattern>${logDirectory}/${serverLogName}.%i.log.zip
+      </fileNamePattern><minIndex>1</minIndex><maxIndex>9</maxIndex></rollingPolicy><triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"><maxFileSize>5MB</maxFileSize></triggeringPolicy><encoder><pattern>${defaultPattern}</pattern></encoder></appender><appender name="asyncEELFServer" class="ch.qos.logback.classic.AsyncAppender"><queueSize>256</queueSize><appender-ref ref="EELFServer" /></appender>
    -->
-  
-  <!-- EELF Policy Appender. This appender is used to record Policy engine 
-    related logging events. The Policy logger and appender are specializations 
-    of the EELF application root logger and appender. This can be used to segregate 
-    Policy engine events from other components, or it can be eliminated to record 
+  <!-- EELF Policy Appender. This appender is used to record Policy engine
+    related logging events. The Policy logger and appender are specializations
+    of the EELF application root logger and appender. This can be used to segregate
+    Policy engine events from other components, or it can be eliminated to record
     these events as part of the application root log. -->
   <!--
-  <appender name="EELFPolicy"
-    class="ch.qos.logback.core.rolling.RollingFileAppender">
-    <file>${logDirectory}/${policyLogName}.log</file>
-    <rollingPolicy
-      class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-      <fileNamePattern>${logDirectory}/${policyLogName}.%i.log.zip
-      </fileNamePattern>
-      <minIndex>1</minIndex>
-      <maxIndex>9</maxIndex>
-    </rollingPolicy>
-    <triggeringPolicy
-      class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-      <maxFileSize>5MB</maxFileSize>
-    </triggeringPolicy>
-    <encoder>
-        <pattern>${defaultPattern}</pattern>
-    </encoder>
-  </appender>
-  <appender name="asyncEELFPolicy" class="ch.qos.logback.classic.AsyncAppender">
-    <queueSize>256</queueSize>
-    <appender-ref ref="EELFPolicy" />
-  </appender>
+  <appender name="EELFPolicy" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${logDirectory}/${policyLogName}.log</file><rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"><fileNamePattern>${logDirectory}/${policyLogName}.%i.log.zip
+      </fileNamePattern><minIndex>1</minIndex><maxIndex>9</maxIndex></rollingPolicy><triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"><maxFileSize>5MB</maxFileSize></triggeringPolicy><encoder><pattern>${defaultPattern}</pattern></encoder></appender><appender name="asyncEELFPolicy" class="ch.qos.logback.classic.AsyncAppender"><queueSize>256</queueSize><appender-ref ref="EELFPolicy" /></appender>
   -->
-  
-  <!-- EELF Audit Appender. This appender is used to record audit engine 
-    related logging events. The audit logger and appender are specializations 
-    of the EELF application root logger and appender. This can be used to segregate 
-    Policy engine events from other components, or it can be eliminated to record 
+  <!-- EELF Audit Appender. This appender is used to record audit engine
+    related logging events. The audit logger and appender are specializations
+    of the EELF application root logger and appender. This can be used to segregate
+    Policy engine events from other components, or it can be eliminated to record
     these events as part of the application root log. -->
-    
-  <appender name="EELFAudit"
-    class="ch.qos.logback.core.rolling.RollingFileAppender">
+  <appender name="EELFAudit" class="ch.qos.logback.core.rolling.RollingFileAppender">
     <file>${logDirectory}/${auditLogName}.log</file>
-    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 
-      <!-- daily rollover --> 
-      <fileNamePattern>${logDirectory}/${auditLogName}.%d{yyyy-MM-dd}.log.zip</fileNamePattern> 
-      <!-- keep 30 days' worth of history capped at 3GB total size --> 
-      <maxHistory>30</maxHistory> 
-      <totalSizeCap>3GB</totalSizeCap> 
+    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+      <!-- daily rollover -->
+      <fileNamePattern>${logDirectory}/${auditLogName}.%d{yyyy-MM-dd}.log.zip</fileNamePattern>
+      <!-- keep 30 days' worth of history capped at 3GB total size -->
+      <maxHistory>30</maxHistory>
+      <totalSizeCap>3GB</totalSizeCap>
     </rollingPolicy>
     <encoder>
-         <pattern>${auditLoggerPattern}</pattern>
+      <pattern>${auditLoggerPattern}</pattern>
     </encoder>
   </appender>
   <appender name="asyncEELFAudit" class="ch.qos.logback.classic.AsyncAppender">
     <queueSize>256</queueSize>
     <appender-ref ref="EELFAudit" />
   </appender>
-
-  <appender name="EELFMetrics"
-    class="ch.qos.logback.core.rolling.RollingFileAppender">
+  <appender name="EELFMetrics" class="ch.qos.logback.core.rolling.RollingFileAppender">
     <file>${logDirectory}/${metricsLogName}.log</file>
-    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 
-      <!-- daily rollover --> 
-      <fileNamePattern>${logDirectory}/${metricsLogName}.%d{yyyy-MM-dd}.log.zip</fileNamePattern> 
-      <!-- keep 30 days' worth of history capped at 3GB total size --> 
-      <maxHistory>30</maxHistory> 
-      <totalSizeCap>3GB</totalSizeCap> 
+    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+      <!-- daily rollover -->
+      <fileNamePattern>${logDirectory}/${metricsLogName}.%d{yyyy-MM-dd}.log.zip</fileNamePattern>
+      <!-- keep 30 days' worth of history capped at 3GB total size -->
+      <maxHistory>30</maxHistory>
+      <totalSizeCap>3GB</totalSizeCap>
     </rollingPolicy>
     <encoder>
       <pattern>${metricsLoggerPattern}</pattern>
     </encoder>
   </appender>
-  
-  
   <appender name="asyncEELFMetrics" class="ch.qos.logback.classic.AsyncAppender">
     <queueSize>256</queueSize>
     <appender-ref ref="EELFMetrics"/>
   </appender>
-   
-  <appender name="EELFError"
-    class="ch.qos.logback.core.rolling.RollingFileAppender">
+  <appender name="EELFError" class="ch.qos.logback.core.rolling.RollingFileAppender">
     <file>${logDirectory}/${errorLogName}.log</file>
-    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 
-      <!-- daily rollover --> 
-      <fileNamePattern>${logDirectory}/${errorLogName}.%d{yyyy-MM-dd}.log.zip</fileNamePattern> 
-      <!-- keep 30 days' worth of history capped at 3GB total size --> 
-      <maxHistory>30</maxHistory> 
-      <totalSizeCap>3GB</totalSizeCap> 
+    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+      <!-- daily rollover -->
+      <fileNamePattern>${logDirectory}/${errorLogName}.%d{yyyy-MM-dd}.log.zip</fileNamePattern>
+      <!-- keep 30 days' worth of history capped at 3GB total size -->
+      <maxHistory>30</maxHistory>
+      <totalSizeCap>3GB</totalSizeCap>
     </rollingPolicy>
     <encoder>
       <pattern>${errorLoggerPattern}</pattern>
     </encoder>
   </appender>
-  
   <appender name="asyncEELFError" class="ch.qos.logback.classic.AsyncAppender">
     <queueSize>256</queueSize>
     <appender-ref ref="EELFError"/>
   </appender>
-  
-   <appender name="EELFDebug"
-    class="ch.qos.logback.core.rolling.RollingFileAppender">
+  <appender name="EELFDebug" class="ch.qos.logback.core.rolling.RollingFileAppender">
     <file>${debugLogDirectory}/${debugLogName}.log</file>
-    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 
-      <!-- daily rollover --> 
-      <fileNamePattern>${logDirectory}/${debugLogName}.%d{yyyy-MM-dd}.log.zip</fileNamePattern> 
-      <!-- keep 30 days' worth of history capped at 3GB total size --> 
-      <maxHistory>30</maxHistory> 
-      <totalSizeCap>3GB</totalSizeCap> 
+    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+      <!-- daily rollover -->
+      <fileNamePattern>${logDirectory}/${debugLogName}.%d{yyyy-MM-dd}.log.zip</fileNamePattern>
+      <!-- keep 30 days' worth of history capped at 3GB total size -->
+      <maxHistory>30</maxHistory>
+      <totalSizeCap>3GB</totalSizeCap>
     </rollingPolicy>
     <encoder>
       <pattern>${defaultLoggerPattern}</pattern>
     </encoder>
   </appender>
-  
   <appender name="asyncEELFDebug" class="ch.qos.logback.classic.AsyncAppender">
     <queueSize>256</queueSize>
     <appender-ref ref="EELFDebug" />
   </appender>
-  
-
   <logger name="org.onap.eelf" level="info" additivity="false">
     <appender-ref ref="asyncEELF" />
   </logger>
-
   <logger name="org.onap.eelf.audit" level="info" additivity="false">
     <appender-ref ref="asyncEELFAudit" />
   </logger>
-  
   <logger name="org.onap.eelf.debug" level="debug" additivity="false">
     <appender-ref ref="asyncEELFDebug" />
   </logger>
-       
   <logger name="org.onap.eelf.error" level="info" additivity="false">
     <appender-ref ref="asyncEELFError" />
   </logger>
-
   <logger name="org.onap.eelf.metrics" level="info" additivity="false">
     <appender-ref ref="asyncEELFMetrics" />
-  </logger>      
-    
+  </logger>
   <root level="DEBUG">
     <appender-ref ref="asyncEELF" />
   </root>
-
-</configuration>
+</configuration>
\ No newline at end of file
diff --git a/kubernetes/portal/charts/portal-sdk/resources/config/deliveries/properties/ONAPPORTALSDK/music.properties b/kubernetes/portal/charts/portal-sdk/resources/config/deliveries/properties/ONAPPORTALSDK/music.properties
new file mode 100644 (file)
index 0000000..742b5ea
--- /dev/null
@@ -0,0 +1,20 @@
+music.version = v2
+music.keyspace = keyspaces
+music.session.keyspace = portalsdk
+music.tables = tables
+music.session.attr.tables = spring_session_attributes
+music.session.meta.tables = spring_session
+music.consistency.info = type
+music.consistency.info.value = eventual
+music.cache = false
+music.session.max.inactive.interval.seconds = 1800
+music.serialize.compress = true
+
+#By default it's eventual
+music.atomic.get = false
+music.atomic.put = true
+
+cassandra.host={{.Values.cassandra.service.name}}.{{.Release.Namespace}}
+zookeeper.host={{.Values.zookeeper.service.name}}.{{.Release.Namespace}}
+cassandra.user={{.Values.cassandra.config.cassandraUsername}}
+cassandra.password={{.Values.cassandra.config.cassandraPassword}}
\ No newline at end of file
@@ -30,7 +30,7 @@ ecomp_rest_url = http://portal.api.simpledemo.onap.org:8989/ONAPPORTAL/auxapi
 ueb_listeners_enable = false
 
 # UEB Configuration
-ueb_url_list = dmaap.{{.Values.nsPrefix}}
+ueb_url_list = dmaap.{{.Release.Namespace}}
 # ECOMP Portal listens on this UEB topic
 ecomp_portal_inbox_name = ECOMP-PORTAL-INBOX
 # Replace these 3 default values with the ones for your specific App,
@@ -24,7 +24,7 @@ decryption_key                                  = AGLDdG4D04BKm2IxIWEr8o==
 ##########################################################################
 
 db.driver = org.mariadb.jdbc.Driver
-db.connectionURL = jdbc:mariadb://portaldb.{{.Values.nsPrefix}}:3306/ecomp_sdk
+db.connectionURL = jdbc:mariadb://{{.Values.mariadb.service.name}}.{{.Release.Namespace}}:3306/ecomp_sdk
 db.userName = root
 db.password = Aa123456
 db.min_pool_size = 5
@@ -61,4 +61,8 @@ instance_uuid=8da691c9-987d-43ed-a358-00ac2f35685d
 guard_notebook_url=
 
 #authenticate user server
-authenticate_user_server=http://portalapps.{{.Values.nsPrefix}}:8383/openid-connect-server-webapp/allUsers
+#TODO: what is this URL supposed to be pointing to?  Nothing in portal opens 8383
+authenticate_user_server=http://portal.onap.org:8383/openid-connect-server-webapp/allUsers
+
+#cookie domain
+cookie_domain = onap.org
diff --git a/kubernetes/portal/charts/portal-sdk/templates/NOTES.txt b/kubernetes/portal/charts/portal-sdk/templates/NOTES.txt
new file mode 100644 (file)
index 0000000..0878f5c
--- /dev/null
@@ -0,0 +1,19 @@
+1. Get the application URL by running these commands:
+{{- if .Values.ingress.enabled }}
+{{- range .Values.ingress.hosts }}
+  http://{{ . }}
+{{- end }}
+{{- else if contains "NodePort" .Values.service.type }}
+  export NODE_PORT=$(kubectl get --namespace {{ include "common.namespace" . }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "common.fullname" . }})
+  export NODE_IP=$(kubectl get nodes --namespace {{ include "common.namespace" . }} -o jsonpath="{.items[0].status.addresses[0].address}")
+  echo http://$NODE_IP:$NODE_PORT
+{{- else if contains "LoadBalancer" .Values.service.type }}
+     NOTE: It may take a few minutes for the LoadBalancer IP to be available.
+           You can watch the status of by running 'kubectl get svc -w {{ include "common.fullname" . }}'
+  export SERVICE_IP=$(kubectl get svc --namespace {{ include "common.namespace" . }} {{ include "common.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
+  echo http://$SERVICE_IP:{{ .Values.service.externalPort }}
+{{- else if contains "ClusterIP" .Values.service.type }}
+  export POD_NAME=$(kubectl get pods --namespace {{ include "common.namespace" . }} -l "app={{ include "common.name" . }},release={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
+  echo "Visit http://127.0.0.1:8080 to use your application"
+  kubectl port-forward $POD_NAME 8080:{{ .Values.service.internalPort }}
+{{- end }}
diff --git a/kubernetes/portal/charts/portal-sdk/templates/configmap.yaml b/kubernetes/portal/charts/portal-sdk/templates/configmap.yaml
new file mode 100644 (file)
index 0000000..d1978c5
--- /dev/null
@@ -0,0 +1,21 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: {{ include "common.fullname" . }}-onapportalsdk
+  namespace: {{ include "common.namespace" . }}
+data:
+{{ tpl (.Files.Glob "resources/config/deliveries/properties/ONAPPORTALSDK/*").AsConfig . | indent 2 }}
\ No newline at end of file
diff --git a/kubernetes/portal/charts/portal-sdk/templates/deployment.yaml b/kubernetes/portal/charts/portal-sdk/templates/deployment.yaml
new file mode 100644 (file)
index 0000000..09f2e45
--- /dev/null
@@ -0,0 +1,130 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: extensions/v1beta1
+kind: Deployment
+metadata:
+  name: {{ include "common.fullname" . }}
+  namespace: {{ include "common.namespace" . }}
+  labels:
+    app: {{ include "common.name" . }}
+    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
+    release: {{ .Release.Name }}
+    heritage: {{ .Release.Service }}
+spec:
+  replicas: {{ .Values.replicaCount }}
+  template:
+    metadata:
+      labels:
+        app: {{ include "common.name" . }}
+        release: {{ .Release.Name }}
+    spec:
+      initContainers:
+      - name: {{ include "common.name" . }}-readiness
+        image: "{{ .Values.global.readinessRepository }}/{{ .Values.global.readinessImage }}"
+        imagePullPolicy: {{ .Values.global.pullPolicy | default .Values.pullPolicy }}
+        command:
+        - /root/ready.py
+        args:
+        - --container-name
+        - {{ .Values.mariadb.nameOverride }}
+        env:
+        - name: NAMESPACE
+          valueFrom:
+            fieldRef:
+              apiVersion: v1
+              fieldPath: metadata.namespace
+      containers:
+      - name: {{ include "common.name" . }}
+        image: "{{ .Values.global.repository | default .Values.repository }}/{{ .Values.image }}"
+        imagePullPolicy: {{ .Values.global.pullPolicy | default .Values.pullPolicy }}
+        command:
+          - /start-apache-tomcat.sh
+        ports:
+        - containerPort: {{ .Values.service.internalPort }}
+        {{- if eq .Values.liveness.enabled true }}
+        livenessProbe:
+          tcpSocket:
+            port: {{ .Values.service.internalPort }}
+          initialDelaySeconds: {{ .Values.liveness.initialDelaySeconds }}
+          periodSeconds: {{ .Values.liveness.periodSeconds }}
+        {{ end -}}
+        readinessProbe:
+          tcpSocket:
+            port: {{ .Values.service.internalPort }}
+          initialDelaySeconds: {{ .Values.readiness.initialDelaySeconds }}
+          periodSeconds: {{ .Values.readiness.periodSeconds }}
+        volumeMounts:
+        - mountPath: /etc/localtime
+          name: localtime
+          readOnly: true
+        - name: properties-onapportalsdk
+          mountPath: "{{ .Values.global.env.tomcatDir }}/webapps/ONAPPORTALSDK/WEB-INF/fusion/conf/fusion.properties"
+          subPath: fusion.properties
+        - name: properties-onapportalsdk
+          mountPath: "{{ .Values.global.env.tomcatDir }}/webapps/ONAPPORTALSDK/WEB-INF/conf/system.properties"
+          subPath: system.properties
+        - name: properties-onapportalsdk
+          mountPath: "{{ .Values.global.env.tomcatDir }}/webapps/ONAPPORTALSDK/WEB-INF/classes/portal.properties"
+          subPath: portal.properties
+        - name: properties-onapportalsdk
+          mountPath: "{{ .Values.global.env.tomcatDir }}/webapps/ONAPPORTALSDK/WEB-INF/classes/music.properties"
+          subPath: music.properties
+        - name: properties-onapportalsdk
+          mountPath: "{{ .Values.global.env.tomcatDir }}/webapps/ONAPPORTALSDK/WEB-INF/classes/logback.xml"
+          subPath: logback.xml
+        - name: portal-tomcat-logs
+          mountPath: "{{ .Values.global.env.tomcatDir }}/logs"
+        - name: var-log-onap
+          mountPath: /var/log/onap
+        resources:
+{{ toYaml .Values.resources | indent 12 }}
+      {{- if .Values.nodeSelector }}
+      nodeSelector:
+{{ toYaml .Values.nodeSelector | indent 10 }}
+      {{- end -}}
+      {{- if .Values.affinity }}
+      affinity:
+{{ toYaml .Values.affinity | indent 10 }}
+      {{- end }}
+      - name: filebeat-onap
+        image: "{{ .Values.global.loggingRepository }}/{{ .Values.global.loggingImage }}"
+        imagePullPolicy: {{ .Values.global.pullPolicy | default .Values.pullPolicy }}
+        volumeMounts:
+        - mountPath: /usr/share/filebeat/filebeat.yml
+          name: filebeat-conf
+          subPath: filebeat.yml
+        - name: portal-data-filebeat
+          mountPath: /usr/share/filebeat/data
+        - name: var-log-onap
+          mountPath: /var/log/onap
+      volumes:
+        - name: localtime
+          hostPath:
+            path: /etc/localtime
+        - name: properties-onapportalsdk
+          configMap:
+            name: {{ include "common.fullname" . }}-onapportalsdk
+            defaultMode: 0755
+        - name: filebeat-conf
+          configMap:
+            name: portal-filebeat
+        - name: var-log-onap
+          emptyDir: {}
+        - name: portal-data-filebeat
+          emptyDir: {}
+        - name: portal-tomcat-logs
+          emptyDir: {}
+      imagePullSecrets:
+      - name: "{{ include "common.namespace" . }}-docker-registry-key"
\ No newline at end of file
diff --git a/kubernetes/portal/charts/portal-sdk/templates/service.yaml b/kubernetes/portal/charts/portal-sdk/templates/service.yaml
new file mode 100644 (file)
index 0000000..46bdf8d
--- /dev/null
@@ -0,0 +1,40 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ include "common.fullname" . }}
+  namespace: {{ include "common.namespace" . }}
+  labels:
+    app: {{ include "common.name" . }}
+    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
+    release: {{ .Release.Name }}
+    heritage: {{ .Release.Service }}
+spec:
+  type: {{ .Values.service.type }}
+  ports:
+    {{if eq .Values.service.type "NodePort" -}}
+    - port: {{ .Values.service.externalPort }}
+      targetPort: {{ .Values.service.internalPort }}
+      nodePort: {{ .Values.global.nodePortPrefix | default .Values.nodePortPrefix }}{{ .Values.service.nodePort }}
+      name: {{ .Values.service.name }}
+    {{- else -}}
+    - port: {{ .Values.service.externalPort }}
+      targetPort: {{ .Values.service.internalPort }}
+      name: {{ .Values.service.name }}
+    {{- end}}
+  selector:
+    app: {{ include "common.name" . }}
+    release: {{ .Release.Name }}
\ No newline at end of file
diff --git a/kubernetes/portal/charts/portal-sdk/values.yaml b/kubernetes/portal/charts/portal-sdk/values.yaml
new file mode 100644 (file)
index 0000000..778c855
--- /dev/null
@@ -0,0 +1,99 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+#################################################################
+# Global configuration defaults.
+#################################################################
+global:
+  nodePortPrefix: 302
+  repositorySecret: eyJuZXh1czMub25hcC5vcmc6MTAwMDEiOnsidXNlcm5hbWUiOiJkb2NrZXIiLCJwYXNzd29yZCI6ImRvY2tlciIsImVtYWlsIjoiQCIsImF1dGgiOiJaRzlqYTJWeU9tUnZZMnRsY2c9PSJ9fQ==
+  readinessRepository: oomk8s
+  readinessImage: readiness-check:1.1.0
+  loggingRepository: docker.elastic.co
+  loggingImage: beats/filebeat:5.5.0
+
+#################################################################
+# Application configuration defaults.
+#################################################################
+# application image
+repository: nexus3.onap.org:10001
+image: onap/portal-sdk:latest
+pullPolicy: Always
+
+# flag to enable debugging - application support required
+debugEnabled: false
+
+# default number of instances
+replicaCount: 1
+
+nodeSelector: {}
+
+affinity: {}
+
+# probe configuration parameters
+liveness:
+  initialDelaySeconds: 10
+  periodSeconds: 10
+  # necessary to disable liveness probe when setting breakpoints
+  # in debugger so K8s doesn't restart unresponsive container
+  enabled: true
+
+readiness:
+  initialDelaySeconds: 10
+  periodSeconds: 10
+
+service:
+  type: ClusterIP
+  name: portal-sdk
+  externalPort: 8990
+  internalPort: 8080
+
+mariadb:
+  nameOverride: portal-db
+  service:
+    name: portal-db
+
+cassandra:
+  service:
+    name: portal-cassandra
+  config:
+    cassandraUsername: root
+    cassandraPassword: Aa123456
+
+zookeeper:
+  service:
+    name: portal-zk
+
+
+ingress:
+  enabled: false
+
+resources: {}
+  # We usually recommend not to specify default resources and to leave this as a conscious
+  # choice for the user. This also increases chances charts run on environments with little
+  # resources, such as Minikube. If you do want to specify resources, uncomment the following
+  # lines, adjust them as necessary, and remove the curly braces after 'resources:'.
+  #
+  # Example:
+  # Configure resource requests and limits
+  # ref: http://kubernetes.io/docs/user-guide/compute-resources/
+  # Minimum memory for development is 2 CPU cores and 4GB memory
+  # Minimum memory for production is 4 CPU cores and 8GB memory
+#resources:
+#  limits:
+#    cpu: 2
+#    memory: 4Gi
+#  requests:
+#    cpu: 2
+#    memory: 4Gi
diff --git a/kubernetes/portal/charts/portal-widget/.helmignore b/kubernetes/portal/charts/portal-widget/.helmignore
new file mode 100644 (file)
index 0000000..f0c1319
--- /dev/null
@@ -0,0 +1,21 @@
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
diff --git a/kubernetes/portal/charts/portal-widget/Chart.yaml b/kubernetes/portal/charts/portal-widget/Chart.yaml
new file mode 100644 (file)
index 0000000..e2b4a3c
--- /dev/null
@@ -0,0 +1,18 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: v1
+description: Portal widgets micro service application
+name: portal-widget
+version: 2.0.0
\ No newline at end of file
@@ -6,7 +6,7 @@ spring.http.multipart.max-request-size=128MB
 microservice.widget.location=/tmp
 
 ## App DB Properties
-spring.datasource.url=jdbc:mysql://portaldb.{{.Values.nsPrefix}}:3306/portal
+spring.datasource.url=jdbc:mysql://{{.Values.mariadb.service.name}}.{{include "common.namespace" .}}:3306/portal
 spring.datasource.username=root
 spring.datasource.password=Aa123456
 spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
@@ -31,5 +31,3 @@ account.user.password=6APqvG4AU2rfLgCvMdySwQ==
 #server.ssl.keyStoreType=PKCS12
 #server.ssl.keyAlias=widget-microservice
 
-## Jasypt Properties
-jasypt.encryptor.password=EncryptionKey
diff --git a/kubernetes/portal/charts/portal-widget/resources/config/deliveries/properties/ONAPWIDGETMS/application.yml b/kubernetes/portal/charts/portal-widget/resources/config/deliveries/properties/ONAPWIDGETMS/application.yml
new file mode 100644 (file)
index 0000000..d655bc9
--- /dev/null
@@ -0,0 +1,3 @@
+jasypt:
+  encryptor:
+    password: EncryptionKey
diff --git a/kubernetes/portal/charts/portal-widget/templates/NOTES.txt b/kubernetes/portal/charts/portal-widget/templates/NOTES.txt
new file mode 100644 (file)
index 0000000..0878f5c
--- /dev/null
@@ -0,0 +1,19 @@
+1. Get the application URL by running these commands:
+{{- if .Values.ingress.enabled }}
+{{- range .Values.ingress.hosts }}
+  http://{{ . }}
+{{- end }}
+{{- else if contains "NodePort" .Values.service.type }}
+  export NODE_PORT=$(kubectl get --namespace {{ include "common.namespace" . }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "common.fullname" . }})
+  export NODE_IP=$(kubectl get nodes --namespace {{ include "common.namespace" . }} -o jsonpath="{.items[0].status.addresses[0].address}")
+  echo http://$NODE_IP:$NODE_PORT
+{{- else if contains "LoadBalancer" .Values.service.type }}
+     NOTE: It may take a few minutes for the LoadBalancer IP to be available.
+           You can watch the status of by running 'kubectl get svc -w {{ include "common.fullname" . }}'
+  export SERVICE_IP=$(kubectl get svc --namespace {{ include "common.namespace" . }} {{ include "common.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
+  echo http://$SERVICE_IP:{{ .Values.service.externalPort }}
+{{- else if contains "ClusterIP" .Values.service.type }}
+  export POD_NAME=$(kubectl get pods --namespace {{ include "common.namespace" . }} -l "app={{ include "common.name" . }},release={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
+  echo "Visit http://127.0.0.1:8080 to use your application"
+  kubectl port-forward $POD_NAME 8080:{{ .Values.service.internalPort }}
+{{- end }}
diff --git a/kubernetes/portal/charts/portal-widget/templates/configmap.yaml b/kubernetes/portal/charts/portal-widget/templates/configmap.yaml
new file mode 100644 (file)
index 0000000..23707f9
--- /dev/null
@@ -0,0 +1,21 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: {{ include "common.fullname" . }}-onapwidgetms
+  namespace: {{ include "common.namespace" . }}
+data:
+{{ tpl (.Files.Glob "resources/config/deliveries/properties/ONAPWIDGETMS/*").AsConfig . | indent 2 }}
\ No newline at end of file
diff --git a/kubernetes/portal/charts/portal-widget/templates/deployment.yaml b/kubernetes/portal/charts/portal-widget/templates/deployment.yaml
new file mode 100644 (file)
index 0000000..0fb3c10
--- /dev/null
@@ -0,0 +1,97 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: extensions/v1beta1
+kind: Deployment
+metadata:
+  name: {{ include "common.fullname" . }}
+  namespace: {{ include "common.namespace" . }}
+  labels:
+    app: {{ include "common.name" . }}
+    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
+    release: {{ .Release.Name }}
+    heritage: {{ .Release.Service }}
+spec:
+  replicas: {{ .Values.replicaCount }}
+  template:
+    metadata:
+      labels:
+        app: {{ include "common.name" . }}
+        release: {{ .Release.Name }}
+    spec:
+      initContainers:
+      - name: {{ include "common.name" . }}-readiness
+        image: "{{ .Values.global.readinessRepository }}/{{ .Values.global.readinessImage }}"
+        imagePullPolicy: {{ .Values.global.pullPolicy | default .Values.pullPolicy }}
+        command:
+        - /root/ready.py
+        args:
+        - --container-name
+        - {{ .Values.mariadb.nameOverride }}
+        env:
+        - name: NAMESPACE
+          valueFrom:
+            fieldRef:
+              apiVersion: v1
+              fieldPath: metadata.namespace
+      containers:
+      - name: {{ include "common.name" . }}
+        image: "{{ .Values.global.repository | default .Values.repository }}/{{ .Values.image }}"
+        imagePullPolicy: {{ .Values.global.pullPolicy | default .Values.pullPolicy }}
+        command:
+          - /start-wms.sh
+        ports:
+        - containerPort: {{ .Values.service.internalPort }}
+        {{- if eq .Values.liveness.enabled true }}
+        livenessProbe:
+          tcpSocket:
+            port: {{ .Values.service.internalPort }}
+          initialDelaySeconds: {{ .Values.liveness.initialDelaySeconds }}
+          periodSeconds: {{ .Values.liveness.periodSeconds }}
+        {{ end -}}
+        readinessProbe:
+          tcpSocket:
+            port: {{ .Values.service.internalPort }}
+          initialDelaySeconds: {{ .Values.readiness.initialDelaySeconds }}
+          periodSeconds: {{ .Values.readiness.periodSeconds }}
+        volumeMounts:
+        - mountPath: /etc/localtime
+          name: localtime
+          readOnly: true
+        - name: properties-onapwidgetms
+          mountPath: "/application.properties"
+          subPath: application.properties
+        - name: properties-onapwidgetms
+          mountPath: "/application.yml"
+          subPath: application.yml
+        resources:
+{{ toYaml .Values.resources | indent 12 }}
+      {{- if .Values.nodeSelector }}
+      nodeSelector:
+{{ toYaml .Values.nodeSelector | indent 10 }}
+      {{- end -}}
+      {{- if .Values.affinity }}
+      affinity:
+{{ toYaml .Values.affinity | indent 10 }}
+      {{- end }}
+      volumes:
+        - name: localtime
+          hostPath:
+            path: /etc/localtime
+        - name: properties-onapwidgetms
+          configMap:
+            name: {{ include "common.fullname" . }}-onapwidgetms
+            defaultMode: 0755
+      imagePullSecrets:
+      - name: "{{ include "common.namespace" . }}-docker-registry-key"
\ No newline at end of file
diff --git a/kubernetes/portal/charts/portal-widget/templates/service.yaml b/kubernetes/portal/charts/portal-widget/templates/service.yaml
new file mode 100644 (file)
index 0000000..46bdf8d
--- /dev/null
@@ -0,0 +1,40 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ include "common.fullname" . }}
+  namespace: {{ include "common.namespace" . }}
+  labels:
+    app: {{ include "common.name" . }}
+    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
+    release: {{ .Release.Name }}
+    heritage: {{ .Release.Service }}
+spec:
+  type: {{ .Values.service.type }}
+  ports:
+    {{if eq .Values.service.type "NodePort" -}}
+    - port: {{ .Values.service.externalPort }}
+      targetPort: {{ .Values.service.internalPort }}
+      nodePort: {{ .Values.global.nodePortPrefix | default .Values.nodePortPrefix }}{{ .Values.service.nodePort }}
+      name: {{ .Values.service.name }}
+    {{- else -}}
+    - port: {{ .Values.service.externalPort }}
+      targetPort: {{ .Values.service.internalPort }}
+      name: {{ .Values.service.name }}
+    {{- end}}
+  selector:
+    app: {{ include "common.name" . }}
+    release: {{ .Release.Name }}
\ No newline at end of file
diff --git a/kubernetes/portal/charts/portal-widget/values.yaml b/kubernetes/portal/charts/portal-widget/values.yaml
new file mode 100644 (file)
index 0000000..e2d1b91
--- /dev/null
@@ -0,0 +1,88 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+#################################################################
+# Global configuration defaults.
+#################################################################
+global:
+  nodePortPrefix: 302
+  repositorySecret: eyJuZXh1czMub25hcC5vcmc6MTAwMDEiOnsidXNlcm5hbWUiOiJkb2NrZXIiLCJwYXNzd29yZCI6ImRvY2tlciIsImVtYWlsIjoiQCIsImF1dGgiOiJaRzlqYTJWeU9tUnZZMnRsY2c9PSJ9fQ==
+  readinessRepository: oomk8s
+  readinessImage: readiness-check:1.1.0
+  loggingRepository: docker.elastic.co
+  loggingImage: beats/filebeat:5.5.0
+  ubuntuInit: ubuntu-init:1.0.0
+
+#################################################################
+# Application configuration defaults.
+#################################################################
+# application image
+repository: nexus3.onap.org:10001
+image: onap/portal-wms:latest
+pullPolicy: Always
+
+# flag to enable debugging - application support required
+debugEnabled: false
+
+# default number of instances
+replicaCount: 1
+
+nodeSelector: {}
+
+affinity: {}
+
+# probe configuration parameters
+liveness:
+  initialDelaySeconds: 10
+  periodSeconds: 10
+  # necessary to disable liveness probe when setting breakpoints
+  # in debugger so K8s doesn't restart unresponsive container
+  enabled: true
+
+readiness:
+  initialDelaySeconds: 10
+  periodSeconds: 10
+
+mariadb:
+  nameOverride: portal-db
+  service:
+    name: portal-db
+
+service:
+  type: ClusterIP
+  name: portal-widget
+  externalPort: 8082
+  internalPort: 8082
+
+ingress:
+  enabled: false
+
+resources: {}
+  # We usually recommend not to specify default resources and to leave this as a conscious
+  # choice for the user. This also increases chances charts run on environments with little
+  # resources, such as Minikube. If you do want to specify resources, uncomment the following
+  # lines, adjust them as necessary, and remove the curly braces after 'resources:'.
+  #
+  # Example:
+  # Configure resource requests and limits
+  # ref: http://kubernetes.io/docs/user-guide/compute-resources/
+  # Minimum memory for development is 2 CPU cores and 4GB memory
+  # Minimum memory for production is 4 CPU cores and 8GB memory
+#resources:
+#  limits:
+#    cpu: 2
+#    memory: 4Gi
+#  requests:
+#    cpu: 2
+#    memory: 4Gi
diff --git a/kubernetes/portal/charts/portal-zookeeper/.helmignore b/kubernetes/portal/charts/portal-zookeeper/.helmignore
new file mode 100644 (file)
index 0000000..f0c1319
--- /dev/null
@@ -0,0 +1,21 @@
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
diff --git a/kubernetes/portal/charts/portal-zookeeper/Chart.yaml b/kubernetes/portal/charts/portal-zookeeper/Chart.yaml
new file mode 100644 (file)
index 0000000..67bf176
--- /dev/null
@@ -0,0 +1,18 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: v1
+description: Zookeeper for ONAP Portal
+name: portal-zookeeper
+version: 2.0.0
\ No newline at end of file
diff --git a/kubernetes/portal/charts/portal-zookeeper/templates/NOTES.txt b/kubernetes/portal/charts/portal-zookeeper/templates/NOTES.txt
new file mode 100644 (file)
index 0000000..c60c745
--- /dev/null
@@ -0,0 +1,19 @@
+1. Get the application URL by running these commands:
+{{- if .Values.ingress.enabled }}
+{{- range .Values.ingress.hosts }}
+  http://{{ . }}
+{{- end }}
+{{- else if contains "NodePort" .Values.service.type }}
+  export NODE_PORT=$(kubectl get --namespace {{ include "common.namespace" . }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "common.name" . }})
+  export NODE_IP=$(kubectl get nodes --namespace {{ include "common.namespace" . }} -o jsonpath="{.items[0].status.addresses[0].address}")
+  echo http://$NODE_IP:$NODE_PORT
+{{- else if contains "LoadBalancer" .Values.service.type }}
+     NOTE: It may take a few minutes for the LoadBalancer IP to be available.
+           You can watch the status of by running 'kubectl get svc -w {{ include "common.name" . }}'
+  export SERVICE_IP=$(kubectl get svc --namespace {{ include "common.namespace" . }} {{ include "common.name" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
+  echo http://$SERVICE_IP:{{ .Values.service.externalPort }}
+{{- else if contains "ClusterIP" .Values.service.type }}
+  export POD_NAME=$(kubectl get pods --namespace {{ include "common.namespace" . }} -l "app={{ include "common.name" . }},release={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
+  echo "Visit http://127.0.0.1:8080 to use your application"
+  kubectl port-forward $POD_NAME 8080:{{ .Values.service.internalPort }}
+{{- end }}
diff --git a/kubernetes/portal/charts/portal-zookeeper/templates/deployment.yaml b/kubernetes/portal/charts/portal-zookeeper/templates/deployment.yaml
new file mode 100644 (file)
index 0000000..fa891f8
--- /dev/null
@@ -0,0 +1,70 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: extensions/v1beta1
+kind: Deployment
+metadata:
+  name: {{ include "common.fullname" . }}
+  namespace: {{ include "common.namespace" . }}
+  labels:
+    app: {{ include "common.name" . }}
+    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
+    release: {{ .Release.Name }}
+    heritage: {{ .Release.Service }}
+spec:
+  replicas: {{ .Values.replicaCount }}
+  template:
+    metadata:
+      labels:
+        app: {{ include "common.name" . }}
+        release: {{ .Release.Name }}
+    spec:
+      containers:
+        - name: {{ include "common.name" . }}
+          image: {{ .Values.global.repository | default .Values.repository }}/{{ .Values.image }}
+          imagePullPolicy: {{ .Values.global.pullPolicy | default .Values.pullPolicy }}
+          ports:
+          - containerPort: {{ .Values.service.internalPort }}
+          {{- if eq .Values.liveness.enabled true }}
+          livenessProbe:
+            tcpSocket:
+              port: {{ .Values.service.internalPort }}
+            initialDelaySeconds: {{ .Values.liveness.initialDelaySeconds }}
+            periodSeconds: {{ .Values.liveness.periodSeconds }}
+          {{end -}}
+          readinessProbe:
+            tcpSocket:
+              port: {{ .Values.service.internalPort }}
+            initialDelaySeconds: {{ .Values.readiness.initialDelaySeconds }}
+            periodSeconds: {{ .Values.readiness.periodSeconds }}
+          volumeMounts:
+          - mountPath: /etc/localtime
+            name: localtime
+            readOnly: true
+          resources:
+{{ toYaml .Values.resources | indent 12 }}
+        {{- if .Values.nodeSelector }}
+        nodeSelector:
+{{ toYaml .Values.nodeSelector | indent 10 }}
+        {{- end -}}
+        {{- if .Values.affinity }}
+        affinity:
+{{ toYaml .Values.affinity | indent 10 }}
+        {{- end }}
+      volumes:
+        - name: localtime
+          hostPath:
+            path: /etc/localtime
+      imagePullSecrets:
+      - name: "{{ include "common.namespace" . }}-docker-registry-key"
diff --git a/kubernetes/portal/charts/portal-zookeeper/templates/service.yaml b/kubernetes/portal/charts/portal-zookeeper/templates/service.yaml
new file mode 100644 (file)
index 0000000..11b3b48
--- /dev/null
@@ -0,0 +1,38 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ include "common.fullname" . }}
+  namespace: {{ include "common.namespace" . }}
+  labels:
+    app: {{ include "common.name" . }}
+    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
+    release: {{ .Release.Name }}
+    heritage: {{ .Release.Service }}
+spec:
+  type: {{ .Values.service.type }}
+  ports:
+    {{if eq .Values.service.type "NodePort" -}}
+    - port: {{ .Values.service.internalPort }}
+      nodePort: {{ .Values.global.nodePortPrefix | default "302" }}{{ .Values.service.externalPort }}
+    {{- else -}}
+    - port: {{ .Values.service.externalPort }}
+      targetPort: {{ .Values.service.internalPort }}
+    {{- end}}
+      name: {{ .Values.service.name }}
+  selector:
+    app: {{ include "common.name" . }}
+    release: {{ .Release.Name }}
\ No newline at end of file
diff --git a/kubernetes/portal/charts/portal-zookeeper/values.yaml b/kubernetes/portal/charts/portal-zookeeper/values.yaml
new file mode 100644 (file)
index 0000000..40c1c15
--- /dev/null
@@ -0,0 +1,75 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Default values for mariadb.
+# This is a YAML-formatted file.
+# Declare variables to be passed into your templates.
+global: # global defaults
+  nodePortPrefix: 302
+  repositorySecret: eyJuZXh1czMub25hcC5vcmc6MTAwMDEiOnsidXNlcm5hbWUiOiJkb2NrZXIiLCJwYXNzd29yZCI6ImRvY2tlciIsImVtYWlsIjoiQCIsImF1dGgiOiJaRzlqYTJWeU9tUnZZMnRsY2c9PSJ9fQ==
+  persistence: {}
+
+
+# application image
+repository: nexus3.onap.org:10001
+image: zookeeper:3.4
+pullPolicy: Always
+
+
+# default number of instances
+replicaCount: 1
+
+nodeSelector: {}
+
+affinity: {}
+
+# probe configuration parameters
+liveness:
+  initialDelaySeconds: 10
+  periodSeconds: 10
+  # necessary to disable liveness probe when setting breakpoints
+  # in debugger so K8s doesn't restart unresponsive container
+  enabled: true
+
+readiness:
+  initialDelaySeconds: 10
+  periodSeconds: 10
+
+service:
+  type: ClusterIP
+  name: portal-zk
+  externalPort: 2181
+  internalPort: 2181
+
+ingress:
+  enabled: false
+
+resources: {}
+  # We usually recommend not to specify default resources and to leave this as a conscious
+  # choice for the user. This also increases chances charts run on environments with little
+  # resources, such as Minikube. If you do want to specify resources, uncomment the following
+  # lines, adjust them as necessary, and remove the curly braces after 'resources:'.
+  #
+  # Example:
+  # Configure resource requests and limits
+  # ref: http://kubernetes.io/docs/user-guide/compute-resources/
+  # Minimum memory for development is 2 CPU cores and 4GB memory
+  # Minimum memory for production is 4 CPU cores and 8GB memory
+#resources:
+#  limits:
+#    cpu: 2
+#    memory: 4Gi
+#  requests:
+#    cpu: 2
+#    memory: 4Gi
diff --git a/kubernetes/portal/requirements.yaml b/kubernetes/portal/requirements.yaml
new file mode 100644 (file)
index 0000000..1e8f788
--- /dev/null
@@ -0,0 +1,18 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+dependencies:
+  - name: common
+    version: ~2.0.0
+    repository: '@local'
\ No newline at end of file
diff --git a/kubernetes/portal/resources/config/mariadb/oom_updates.sql b/kubernetes/portal/resources/config/mariadb/oom_updates.sql
deleted file mode 100644 (file)
index 1b6d43c..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Copyright © 2017 AT&T, Amdocs, Bell Canada
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-*       http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-USE portal;
-/*
-Any updates required by OOM to the portaldb are made here.
-1. split up SDC-FE and SDC-BE.  Originally both FE and BE point to the same IP
-while the OOM K8s version has these service split up.
-*/
-UPDATE fn_app SET app_rest_endpoint = 'http://sdc.api.be.simpledemo.onap.org:8080/api/v2' where app_name = 'SDC';
-UPDATE fn_app SET app_url = 'http://cli.api.simpledemo.onap.org:8080', app_type = 1 where app_name='CLI';
diff --git a/kubernetes/portal/resources/scripts/update_hosts.sh b/kubernetes/portal/resources/scripts/update_hosts.sh
deleted file mode 100644 (file)
index cd38faf..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/bin/sh
-
-_SRC_HOST=$1
-_DST_HOST=$2
-_IP=`getent hosts ${_SRC_HOST}|cut -d' ' -f1`
-if [ -z ${_IP} ]; then
-  echo "Cannot retreive IP for host mapping ${_SRC_HOST} -> ${_DST_HOST}"
-  exit 1
-fi
-_REGEX=".*[[:blank:]]${_DST_HOST}$"
-if grep -c -e "${_REGEX}" /etc/hosts > /dev/null 2>&1 ; then
-  cp /etc/hosts /tmp/hosts
-  sed -i "s/${_REGEX}/${_IP} ${_DST_HOST}/g" /tmp/hosts
-  cp /tmp/hosts /etc/hosts
-else
-  echo "${_IP} ${_DST_HOST}" >> /etc/hosts
-fi
diff --git a/kubernetes/portal/resources/vnc/init_profile/profiles.ini b/kubernetes/portal/resources/vnc/init_profile/profiles.ini
deleted file mode 100644 (file)
index 7a1330f..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-[General]
-StartWithLastProfile=1
-
-[Profile0]
-Name=default
-IsRelative=1
-Path=onap.default
-Default=1
-
diff --git a/kubernetes/portal/templates/all-services.yaml b/kubernetes/portal/templates/all-services.yaml
deleted file mode 100644 (file)
index d6958fc..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-# Copyright © 2017 Amdocs, Bell Canada
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-#{{ if not .Values.disablePortalPortaldb }}
-apiVersion: v1
-kind: Service
-metadata:
-  name: portaldb
-  namespace: "{{ .Values.nsPrefix }}"
-  labels:
-    app: portaldb
-spec:
-  ports:
-  - name: portaldb
-    port: 3306
-  selector:
-    app: portaldb
-  clusterIP: None
-#{{ end }}
-#{{ if not .Values.disablePortalPortalapps }}
----
-apiVersion: v1
-kind: Service
-metadata:
-  labels:
-    app: portalapps
-  name: portalapps
-  namespace: "{{ .Values.nsPrefix }}"
-  annotations:
-    msb.onap.org/service-info: '[
-      {
-          "serviceName": "portal",
-          "version": "v2",
-          "url": "/",
-          "protocol": "REST"
-          "port": "8989",
-          "visualRange":"1"
-      }
-      ]'
-spec:
-  ports:
-  - name: portal-1
-    nodePort: {{ .Values.nodePortPrefix }}13
-    port: 8006
-    targetPort: 8005
-  - name: portal-2
-    nodePort: {{ .Values.nodePortPrefix }}14
-    port: 8010
-    targetPort: 8009
-  - name: portal-3
-    nodePort: {{ .Values.nodePortPrefix }}15
-    port: 8989
-    targetPort: 8080
-  selector:
-    app: portalapps
-  type: NodePort
-#{{ end }}
-#{{ if not .Values.disablePortalVncPortal }}
----
-apiVersion: v1
-kind: Service
-metadata:
-  labels:
-    app: portal-vnc
-  name: portal-vnc
-  namespace: "{{ .Values.nsPrefix }}"
-spec:
-  ports:
-  - name: tcp-1
-    port: 6080
-    targetPort: 80
-    nodePort: {{ .Values.nodePortPrefix }}11
-  - name: tcp-2
-    port: 5900
-    targetPort: 5900
-    nodePort: {{ .Values.nodePortPrefix }}12
-  selector:
-    app: portal-vnc
-  type: NodePort
-#{{ end }}
-#{{ if not .Values.disablePortalPortalwidgets }}
----
-apiVersion: v1
-kind: Service
-metadata:
-  name: portalwidgets
-  namespace: "{{ .Values.nsPrefix }}"
-  labels:
-    app: portalwidgets
-spec:
-  ports:
-  - name: portalwidgets
-    port: 8082
-  selector:
-    app: portalwidgets
-  clusterIP: None
-#{{ end }}
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-#{{ if not .Values.disableSdncSdnc }}
 apiVersion: v1
 kind: ConfigMap
 metadata:
-  name: sdnc-conf-configmap
-  namespace: {{ .Values.nsPrefix }}
+  name: portal-filebeat
+  namespace: {{ include "common.namespace" . }}
 data:
-{{ tpl (.Files.Glob "resources/config/conf/*").AsConfig . | indent 2 }}
-#{{ end }}
+{{ tpl (.Files.Glob "resources/config/log/filebeat/filebeat.yml").AsConfig . | indent 2 }}
+
diff --git a/kubernetes/portal/templates/portal-apps-configmap.yaml b/kubernetes/portal/templates/portal-apps-configmap.yaml
deleted file mode 100644 (file)
index ee5e4b8..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-# Copyright © 2017 Amdocs, Bell Canada
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-#{{ if not .Values.disablePortalPortalapps }}
-apiVersion: v1
-kind: ConfigMap
-metadata:
-  name: portal-onap-portal-sdk-configmap
-  namespace: {{ .Values.nsPrefix }}
-data:
-{{ tpl (.Files.Glob "resources/config/portal-fe/webapps/etc/ONAPPORTALSDK/*").AsConfig . | indent 2 }}
----
-apiVersion: v1
-kind: ConfigMap
-metadata:
-  name: portal-onap-portal-configmap
-  namespace: {{ .Values.nsPrefix }}
-data:
-{{ tpl (.Files.Glob "resources/config/portal-fe/webapps/etc/ONAPPORTAL/*").AsConfig . | indent 2 }}
----
-apiVersion: v1
-kind: ConfigMap
-metadata:
-  name: portal-mariadb-configmap
-  namespace: {{ .Values.nsPrefix }}
-data:
-{{ tpl (.Files.Glob "resources/config/mariadb/oom_updates.sql").AsConfig . | indent 2 }}
-#{{ end }}
----
-#{{ if not .Values.disablePortalPortalwidgets }}
-apiVersion: v1
-kind: ConfigMap
-metadata:
-  name: portal-onapwidgetms-configmap
-  namespace: {{ .Values.nsPrefix }}
-data:
-{{ tpl (.Files.Glob "resources/config/portal-fe/webapps/etc/ONAPWIDGETMS/application.properties").AsConfig . | indent 2 }}
-#{{ end }}
diff --git a/kubernetes/portal/templates/portal-apps-deployment.yaml b/kubernetes/portal/templates/portal-apps-deployment.yaml
deleted file mode 100644 (file)
index ccd086c..0000000
+++ /dev/null
@@ -1,165 +0,0 @@
-# Copyright © 2017 Amdocs, Bell Canada
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-#{{ if not .Values.disablePortalPortalapps }}
-apiVersion: extensions/v1beta1
-kind: Deployment
-metadata:
-  name: portal-apps
-  namespace: "{{ .Values.nsPrefix }}"
-spec:
-  replicas: {{ .Values.portalAppsReplicas }}
-  selector:
-    matchLabels:
-      app: portalapps
-  template:
-    metadata:
-       labels:
-         app: portalapps
-       name: portal-apps
-    spec:
-      initContainers:
-      - command:
-        - /root/ready.py
-        args:
-        - --container-name
-        - portaldb
-        env:
-        - name: NAMESPACE
-          valueFrom:
-            fieldRef:
-              apiVersion: v1
-              fieldPath: metadata.namespace
-        image: {{ .Values.image.readiness }}
-        imagePullPolicy: {{ .Values.pullPolicy }}
-        name: portalapps-readiness
-      - command: ["/bin/bash", "-c", "if [ ! -e /portal_root/boot.txt ]; then mysql -u root -pAa123456 -h portaldb < /portal-mysql/oom_updates.sql; fi"]
-        volumeMounts:
-        - mountPath: /portal-mysql/oom_updates.sql
-          name: portal-mariadb-onboarding-sql
-          subPath: oom_updates.sql
-        - mountPath: /portal_root/
-          name: portal-root
-        image: {{ .Values.image.mariadbClient }}
-        imagePullPolicy: {{ .Values.pullPolicy }}
-        name: provision-portaldb-users
-      - command: ["/bin/bash", "-c", "mkdir -p /ubuntu-init/ && chmod -R 777 /ubuntu-init/"]
-        volumeMounts:
-        - name: portal-logs
-          mountPath: /ubuntu-init/
-        image: {{ .Values.image.ubuntuInit }}
-        imagePullPolicy: {{ .Values.pullPolicy }}
-        name: portal-app-logs-init
-      containers:
-      - image: {{ .Values.image.portalapps }}
-        imagePullPolicy: {{ .Values.pullPolicy }}
-        lifecycle:
-          postStart:
-            exec:
-              command: ["/bin/sh", "-c", "echo yes > /portal_root/boot.txt"]
-        name: portalapps
-        volumeMounts:
-        - mountPath: /etc/localtime
-          name: localtime
-          readOnly: true
-        - mountPath: "{{ .Values.onapPortal.webappsDir }}/ONAPPORTAL/WEB-INF/fusion/conf/fusion.properties"
-          name: onap-portal-properties
-          subPath: fusion.properties
-        - mountPath: "{{ .Values.onapPortal.webappsDir }}/ONAPPORTAL/WEB-INF/classes/openid-connect.properties"
-          name: onap-portal-properties
-          subPath: openid-connect.properties
-        - mountPath: "{{ .Values.onapPortal.webappsDir }}/ONAPPORTAL/WEB-INF/conf/system.properties"
-          name: onap-portal-properties
-          subPath: system.properties
-        - mountPath: "{{ .Values.onapPortal.webappsDir }}/ONAPPORTAL/WEB-INF/classes/portal.properties"
-          name: onap-portal-properties
-          subPath: portal.properties
-        - mountPath: "{{ .Values.onapPortal.webappsDir }}/ONAPPORTAL/WEB-INF/classes/logback.xml"
-          name: portal-logback
-          subPath: logback.xml
-        - mountPath: "{{ .Values.onapPortal.webappsDir }}/ONAPPORTALSDK/WEB-INF/conf/system.properties"
-          name: portal-sdkapp-properties
-          subPath: system.properties
-        - mountPath: "{{ .Values.onapPortal.webappsDir }}/ONAPPORTALSDK/WEB-INF/classes/portal.properties"
-          name: portal-sdkapp-properties
-          subPath: portal.properties
-        - mountPath: "{{ .Values.onapPortal.webappsDir }}/ONAPPORTALSDK/WEB-INF/fusion/conf/fusion.properties"
-          name: portal-sdkapp-properties
-          subPath: fusion.properties
-        - mountPath: "{{ .Values.onapPortal.webappsDir }}/ONAPPORTALSDK/WEB-INF/classes/logback.xml"
-          name: sdkapp-logback
-          subPath: logback.xml
-        - mountPath: /portal_root/
-          name: portal-root
-        - mountPath: "{{ .Values.onapPortal.webappsDir }}/logs"
-          name: portal-logs
-        - mountPath: /var/log/onap
-          name: portal-logs2
-        ports:
-        - containerPort: 8005
-        - containerPort: 8009
-        - containerPort: 8080
-        readinessProbe:
-          tcpSocket:
-            port: 8080
-          initialDelaySeconds: 5
-          periodSeconds: 10
-      - image: {{ .Values.image.filebeat }}
-        imagePullPolicy: {{ .Values.pullPolicy }}
-        name: filebeat-onap
-        volumeMounts:
-        - mountPath: /usr/share/filebeat/filebeat.yml
-          name: filebeat-conf
-          subPath: filebeat.yml
-        - mountPath: /var/log/onap
-          name: portal-logs2
-        - mountPath: /usr/share/filebeat/data
-          name: portal-data-filebeat
-      volumes:
-        - name: localtime
-          hostPath:
-            path: /etc/localtime
-        - name: filebeat-conf
-          configMap:
-            name: portal-filebeat-configmap
-        - name: portal-logs2
-          emptyDir: {}
-        - name: portal-data-filebeat
-          emptyDir: {}
-        - name: onap-portal-properties
-          configMap:
-            defaultMode: 0755
-            name: portal-onap-portal-configmap
-        - name: portal-sdkapp-properties
-          configMap:
-            defaultMode: 0755
-            name: portal-onap-portal-sdk-configmap
-        - name: portal-logback
-          configMap:
-            name: portal-onapportal-log-configmap
-        - name: sdkapp-logback
-          configMap:
-            name: portal-onapportalsdk-log-configmap
-        - name: portal-mariadb-onboarding-sql
-          configMap:
-            name: portal-mariadb-configmap
-        - name: portal-root
-          hostPath:
-            path: {{ .Values.dataRootDir }}/{{ .Values.nsPrefix }}/portal
-        - name: portal-logs
-          hostPath:
-            path: {{ .Values.dataRootDir }}/{{ .Values.nsPrefix }}/portal/logs
-      imagePullSecrets:
-      - name: "{{ .Values.nsPrefix }}-docker-registry-key"
-#{{ end }}
diff --git a/kubernetes/portal/templates/portal-logs-configmap.yaml b/kubernetes/portal/templates/portal-logs-configmap.yaml
deleted file mode 100644 (file)
index 068adad..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-# Copyright © 2017 Amdocs, Bell Canada
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-#{{ if not .Values.disablePortalPortalapps }}
-apiVersion: v1
-kind: ConfigMap
-metadata:
-  name: portal-filebeat-configmap
-  namespace: {{ .Values.nsPrefix }}
-data:
-{{ tpl (.Files.Glob "resources/config/log/filebeat/filebeat.yml").AsConfig . | indent 2 }}
----
-apiVersion: v1
-kind: ConfigMap
-metadata:
-  name: portal-onapportal-log-configmap
-  namespace: {{ .Values.nsPrefix }}
-data:
-{{ tpl (.Files.Glob "resources/config/log/portal/onapportal/logback.xml").AsConfig . | indent 2 }}
----
-apiVersion: v1
-kind: ConfigMap
-metadata:
-  name: portal-onapportalsdk-log-configmap
-  namespace: {{ .Values.nsPrefix }}
-data:
-{{ tpl (.Files.Glob "resources/config/log/portal/onapportalsdk/logback.xml").AsConfig . | indent 2 }}
-#{{ end }}
-
diff --git a/kubernetes/portal/templates/portal-mariadb-deployment.yaml b/kubernetes/portal/templates/portal-mariadb-deployment.yaml
deleted file mode 100644 (file)
index e1158a2..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-# Copyright © 2017 Amdocs, Bell Canada
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-#{{ if not .Values.disablePortalPortaldb }}
-apiVersion: extensions/v1beta1
-kind: Deployment
-metadata:
-  name: portal-db
-  namespace: "{{ .Values.nsPrefix }}"
-spec:
-  replicas: {{ .Values.portalDbReplicas }}
-  selector:
-    matchLabels:
-      app: portaldb
-  template:
-    metadata:
-      labels:
-        app: portaldb
-      name: portal-db
-    spec:
-      containers:
-      - image: {{ .Values.image.portaldb}}
-        imagePullPolicy: {{ .Values.pullPolicy }}
-        name: "portaldb"
-        env:
-        - name: MYSQL_HOST
-          value: "portaldb.{{ .Values.nsPrefix }}"
-        - name: MYSQL_ROOT_PASSWORD
-          value: Aa123456
-        volumeMounts:
-        - mountPath: /etc/localtime
-          name: localtime
-          readOnly: true
-        - mountPath: /var/lib/mysql
-          name: portal-mariadb-data
-        ports:
-        - containerPort: 3306
-          name: portaldb
-        readinessProbe:
-          tcpSocket:
-            port: 3306
-          initialDelaySeconds: 5
-          periodSeconds: 10
-      volumes:
-      - name: localtime
-        hostPath:
-          path: /etc/localtime
-      - name: portal-mariadb-data
-        persistentVolumeClaim:
-          claimName: portal-db
-      imagePullSecrets:
-      - name: "{{ .Values.nsPrefix }}-docker-registry-key"
-#{{ end }}
diff --git a/kubernetes/portal/templates/portal-pv-pvc.yaml b/kubernetes/portal/templates/portal-pv-pvc.yaml
deleted file mode 100644 (file)
index 1ba5fbb..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-{{/*
-# Copyright © 2017 Amdocs, Bell Canada
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-*/}}
-
-#{{ if not .Values.disablePortalPortaldb }}
-apiVersion: v1
-kind: PersistentVolume
-metadata:
-  name: "{{ .Values.nsPrefix }}-portal"
-  namespace: "{{ .Values.nsPrefix }}"
-  labels:
-    name: "{{ .Values.nsPrefix }}-portal"
-spec:
-  capacity:
-    storage: 2Gi
-  accessModes:
-    - ReadWriteMany
-  persistentVolumeReclaimPolicy: Retain
-  hostPath:
-    path: {{ .Values.dataRootDir }}/{{ .Values.nsPrefix }}/portal/mariadb/data
----
-kind: PersistentVolumeClaim
-apiVersion: v1
-metadata:
-  name: portal-db
-  namespace: "{{ .Values.nsPrefix }}"
-spec:
-  accessModes:
-    - ReadWriteMany
-  resources:
-    requests:
-      storage: 2Gi
-  selector:
-    matchLabels:
-      name: "{{ .Values.nsPrefix }}-portal"
-#{{ end }}
diff --git a/kubernetes/portal/templates/portal-vnc-dep.yaml b/kubernetes/portal/templates/portal-vnc-dep.yaml
deleted file mode 100644 (file)
index f3418e7..0000000
+++ /dev/null
@@ -1,137 +0,0 @@
-# Copyright © 2017 Amdocs, Bell Canada
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-#{{ if not .Values.disablePortalVncPortal }}
-kind: ConfigMap
-metadata:
-  name: portal-vnc-profiles-ini
-  namespace: "{{ .Values.nsPrefix }}"
-data:
-{{ (.Files.Glob "resources/vnc/init_profile/profiles.ini").AsConfig | indent 2 }}
----
-apiVersion: v1
-kind: ConfigMap
-metadata:
-  name: portal-vnc-update-hosts
-  namespace: "{{ .Values.nsPrefix }}"
-data:
-{{ (.Files.Glob "resources/scripts/update_hosts.sh").AsConfig | indent 2 }}
----
-apiVersion: extensions/v1beta1
-kind: Deployment
-metadata:
-  labels:
-    app: portal-vnc
-  name: portal-vnc
-  namespace: "{{ .Values.nsPrefix }}"
-spec:
-  replicas: {{ .Values.vncPortalReplicas }}
-  selector:
-    matchLabels:
-      app: portal-vnc
-  template:
-    metadata:
-      labels:
-        app: portal-vnc
-      name: portal-vnc
-    spec:
-      initContainers:
-      - command:
-        - /root/ready.py
-        args:
-        - --container-name
-        - portalapps
-        env:
-        - name: NAMESPACE
-          valueFrom:
-            fieldRef:
-              apiVersion: v1
-              fieldPath: metadata.namespace
-        image: {{ .Values.image.readiness }}
-        imagePullPolicy: {{ .Values.pullPolicy }}
-        name: portal-vnc-readiness
-{{- if empty .Values.disablePolicyPap  | not }}
-      - command:
-        - /root/ready.py
-        args:
-        - --container-name
-        - pap
-        env:
-        - name: NAMESPACE
-          value: {{ .Values.nsPrefix }}
-        image: {{ .Values.image.readiness }}
-        imagePullPolicy: {{ .Values.pullPolicy }}
-        name: vnc-pap-readiness
-{{- end }}
-      - command:
-        - /root/ready.py
-        args:
-        - --container-name
-        - sdc-fe
-        env:
-        - name: NAMESPACE
-          value: {{ .Values.nsPrefix }}
-        image: {{ .Values.image.readiness }}
-        imagePullPolicy: {{ .Values.pullPolicy }}
-        name: vnc-sdc-readiness
-      - command:
-        - /root/ready.py
-        args:
-        - --container-name
-        - vid-server
-        env:
-        - name: NAMESPACE
-          value: {{ .Values.nsPrefix }}
-        image: {{ .Values.image.readiness }}
-        imagePullPolicy: {{ .Values.pullPolicy }}
-        name: vnc-vid-readiness
-      containers:
-      - image: {{ .Values.image.ubuntuDesktop }}
-        imagePullPolicy: {{ .Values.pullPolicy }}
-        lifecycle:
-          postStart:
-            exec:
-              command: ["/bin/sh", "-c", "mkdir -p /root/.mozilla/firefox/onap.default; cp /root/.init_profile/profiles.ini /root/.mozilla/firefox/; echo 'user_pref(\"browser.tabs.remote.autostart.2\", false);' > /root/.mozilla/firefox/onap.default/prefs.js; (while true; do /tmp/update_hosts.sh sdc-be.{{ .Values.nsPrefix }} sdc.api.be.simpledemo.onap.org; /tmp/update_hosts.sh portalapps.{{ .Values.nsPrefix }} portal.api.simpledemo.onap.org; /tmp/update_hosts.sh pap.{{ .Values.nsPrefix }} policy.api.simpledemo.onap.org; /tmp/update_hosts.sh sdc-fe.{{ .Values.nsPrefix }} sdc.api.simpledemo.onap.org; /tmp/update_hosts.sh vid-server.{{ .Values.nsPrefix }} vid.api.simpledemo.onap.org; /tmp/update_hosts.sh sparky-be.{{ .Values.nsPrefix }} aai.api.simpledemo.onap.org; /tmp/update_hosts.sh cli.{{ .Values.nsPrefix }} cli.api.simpledemo.onap.org; sleep 10; done)  > update_hosts.log 2>&1 &"]
-        env:
-        - name: VNC_PASSWORD
-          value: password
-        name: portal-vnc
-        volumeMounts:
-        - mountPath: /etc/localtime
-          name: localtime
-          readOnly: true
-        - mountPath: /root/.init_profile/profiles.ini
-          name: vnc-profiles-ini
-          subPath: profiles.ini
-        - mountPath: /tmp/update_hosts.sh
-          name: vnc-update-hosts
-          subPath: update_hosts.sh
-        securityContext:
-          privileged: true
-      securityContext: {}
-      volumes:
-        - name: localtime
-          hostPath:
-            path: /etc/localtime
-        - name: vnc-profiles-ini
-          configMap:
-            name: portal-vnc-profiles-ini
-        - name: vnc-update-hosts
-          configMap:
-            name: portal-vnc-update-hosts
-            defaultMode: 0755
-      imagePullSecrets:
-      - name: "{{ .Values.nsPrefix }}-docker-registry-key"
-#{{ end }}
-
diff --git a/kubernetes/portal/templates/portal-widgets-deployment.yaml b/kubernetes/portal/templates/portal-widgets-deployment.yaml
deleted file mode 100644 (file)
index 1b6669e..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-# Copyright © 2017 Amdocs, Bell Canada
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-#{{ if not .Values.disablePortalPortalwidgets }}
-apiVersion: extensions/v1beta1
-kind: Deployment
-metadata:
-  name: portal-widgets
-  namespace: "{{ .Values.nsPrefix }}"
-spec:
-  replicas: {{ .Values.portalWidgetsReplicas }}
-  selector:
-    matchLabels:
-      app: portalwidgets
-  template:
-    metadata:
-       labels:
-         app: portalwidgets
-       name: portal-widgets
-    spec:
-      initContainers:
-      - command:
-        - /root/ready.py
-        args:
-        - --container-name
-        - portaldb
-        env:
-        - name: NAMESPACE
-          valueFrom:
-            fieldRef:
-              apiVersion: v1
-              fieldPath: metadata.namespace
-        image: {{ .Values.image.readiness }}
-        imagePullPolicy: {{ .Values.pullPolicy }}
-        name: portalapps-readiness
-      containers:
-      - image: {{ .Values.image.portalwms }}
-        imagePullPolicy: {{ .Values.pullPolicy }}
-        name: portalwidgets
-        volumeMounts:
-        - mountPath: /etc/localtime
-          name: localtime
-          readOnly: true
-        - mountPath: /application.properties
-          name: portalwidgets-application-properties
-          subPath: application.properties
-        ports:
-        - containerPort: 8082
-        readinessProbe:
-          tcpSocket:
-            port: 8082
-          initialDelaySeconds: 5
-          periodSeconds: 10
-      volumes:
-        - name: localtime
-          hostPath:
-            path: /etc/localtime
-        - name: portalwidgets-application-properties
-          configMap:
-            name: portal-onapwidgetms-configmap
-      imagePullSecrets:
-      - name: "{{ .Values.nsPrefix }}-docker-registry-key"
-#{{ end }}
index 89c2dbc..5ec23e1 100644 (file)
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-nsPrefix: onap
-pullPolicy: Always
-nodePortPrefix: 302
-portalAppsReplicas: 1
-portalDbReplicas: 1
-vncPortalReplicas: 1
-portalWidgetsReplicas: 1
-dataRootDir: /dockerdata-nfs
-image:
-  readiness: oomk8s/readiness-check:1.1.0
-  portalapps: nexus3.onap.org:10001/onap/portal-apps:v1.3.0
-  portaldb: nexus3.onap.org:10001/onap/portal-db:v1.3.0
-  mariadbClient: oomk8s/mariadb-client-init:1.0.0
-  portalwms: nexus3.onap.org:10001/onap/portal-wms:v1.3.0
-  ubuntuDesktop: dorowu/ubuntu-desktop-lxde-vnc
-  filebeat: docker.elastic.co/beats/filebeat:5.5.0
-  ubuntuInit: oomk8s/ubuntu-init:1.0.0
-onapPortal:
-  webappsDir: "/opt/apache-tomcat-8.0.37/webapps"
+global:
+  env:
+    tomcatDir: "/opt/apache-tomcat-8.0.37"
 config:
   logstashServiceName: log-ls
   logstashPort: 5044
+
+portal-mariadb:
+  nameOverride: portal-db
+  service:
+    name: portal-db
\ No newline at end of file
index ad56334..92e836f 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright © 2017 Amdocs, Bell Canada
+# Copyright © 2017 Amdocs, AT&T, Bell Canada
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
index 9c36487..de59fd5 100644 (file)
@@ -1,3 +1,17 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 apiVersion: v1
 description: Service Design and Creation Backend API
 name: sdc-be
index 4869966..4a08504 100644 (file)
@@ -1,3 +1,17 @@
+# Copyright © 2017 Amdocs, AT&T, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 apiVersion: extensions/v1beta1
 kind: Deployment
 metadata:
index 7338d2e..e4f3807 100644 (file)
@@ -1,3 +1,17 @@
+# Copyright © 2017 Amdocs, AT&T, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 apiVersion: batch/v1
 kind: Job
 metadata:
index 83e9bb4..ec9d300 100644 (file)
@@ -1,3 +1,17 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 apiVersion: v1
 kind: Service
 metadata:
index ebd5f8f..4f48143 100644 (file)
@@ -1,3 +1,17 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 #################################################################
 # Global configuration defaults.
 #################################################################
index 9632644..0e99a9a 100644 (file)
@@ -1,3 +1,17 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 apiVersion: v1
 description: Service Design and Creation Cassandra
 name: sdc-cs
index 10fabae..d7e8afd 100644 (file)
@@ -1,3 +1,17 @@
+# Copyright © 2017 Amdocs, AT&T, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 apiVersion: extensions/v1beta1
 kind: Deployment
 metadata:
index da2ec3d..c6e9c19 100644 (file)
@@ -1,3 +1,17 @@
+# Copyright © 2017 Amdocs, AT&T, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 apiVersion: batch/v1
 kind: Job
 metadata:
index 31230a9..184728f 100644 (file)
@@ -1,3 +1,19 @@
+{{/*
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+*/}}
+
 {{- if and .Values.persistence.enabled (not .Values.persistence.existingClaim) -}}
 kind: PersistentVolume
 apiVersion: v1
index b0cd3bf..e27c331 100644 (file)
@@ -1,3 +1,19 @@
+{{/*
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+*/}}
+
 {{- if and .Values.persistence.enabled (not .Values.persistence.existingClaim) -}}
 kind: PersistentVolumeClaim
 apiVersion: v1
index 72d9634..0b6c838 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright © 2017 Amdocs, Bell Canada
+# Copyright © 2017 Amdocs, AT&T, Bell Canada
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
index a41fc38..30297a3 100644 (file)
@@ -1,3 +1,17 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 apiVersion: v1
 kind: Service
 metadata:
index 5e2b77c..108a1b2 100644 (file)
@@ -1,3 +1,17 @@
+# Copyright © 2017 Amdocs, AT&T, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 #################################################################
 # Global configuration defaults.
 #################################################################
index f2097a5..2accff1 100644 (file)
@@ -1,3 +1,17 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 apiVersion: v1
 description: Service Design and Creation Elasticsearch
 name: sdc-es
index bb08a2a..75ea024 100644 (file)
@@ -1,3 +1,17 @@
+# Copyright © 2017 Amdocs, AT&T, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 apiVersion: extensions/v1beta1
 kind: Deployment
 metadata:
index 03a21c0..0d2512c 100644 (file)
@@ -1,3 +1,17 @@
+# Copyright © 2017 Amdocs, AT&T, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 apiVersion: batch/v1
 kind: Job
 metadata:
index 31230a9..184728f 100644 (file)
@@ -1,3 +1,19 @@
+{{/*
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+*/}}
+
 {{- if and .Values.persistence.enabled (not .Values.persistence.existingClaim) -}}
 kind: PersistentVolume
 apiVersion: v1
index b0cd3bf..e27c331 100644 (file)
@@ -1,3 +1,19 @@
+{{/*
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+*/}}
+
 {{- if and .Values.persistence.enabled (not .Values.persistence.existingClaim) -}}
 kind: PersistentVolumeClaim
 apiVersion: v1
index a41fc38..30297a3 100644 (file)
@@ -1,3 +1,17 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 apiVersion: v1
 kind: Service
 metadata:
index b32ed11..4c49abd 100644 (file)
@@ -1,3 +1,17 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 #################################################################
 # Global configuration defaults.
 #################################################################
index dc60986..9cbffba 100644 (file)
@@ -1,3 +1,17 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 apiVersion: v1
 description: Service Design and Creation Front End
 name: sdc-fe
index 818a279..1a6e01b 100644 (file)
@@ -1,3 +1,17 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 apiVersion: extensions/v1beta1
 kind: Deployment
 metadata:
index fc7a3c7..dccb751 100644 (file)
@@ -1,3 +1,17 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 apiVersion: v1
 kind: Service
 metadata:
index 828ec41..d0ca009 100644 (file)
@@ -1,3 +1,17 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 #################################################################
 # Global configuration defaults.
 #################################################################
index 2bb4e49..f9bc14a 100644 (file)
@@ -1,3 +1,17 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 apiVersion: v1
 description: Service Design and Creation Kibana
 name: sdc-kb
index 73c01f5..4501ded 100644 (file)
@@ -1,3 +1,17 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 apiVersion: extensions/v1beta1
 kind: Deployment
 metadata:
index 0fbaae9..14d0b82 100644 (file)
@@ -1,3 +1,17 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 apiVersion: v1
 kind: Service
 metadata:
index b1796f4..aa97467 100644 (file)
@@ -1,3 +1,17 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 #################################################################
 # Global configuration defaults.
 #################################################################
index acca8ef..1e8f788 100644 (file)
@@ -1,3 +1,17 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 dependencies:
   - name: common
     version: ~2.0.0
index f09c482..ec5e95f 100644 (file)
@@ -1,3 +1,17 @@
+# Copyright © 2017 Amdocs, AT&T, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 apiVersion: v1
 kind: ConfigMap
 metadata:
index 90a4d28..d5664a7 100644 (file)
@@ -26,8 +26,6 @@ config:
     vnfRepoPort: 8702
     vnfRepoHost: 192.168.50.5
 
-
-
 sdc-es:
   service:
     name: sdc-es
\ No newline at end of file
diff --git a/kubernetes/sdnc/.helmignore b/kubernetes/sdnc/.helmignore
new file mode 100644 (file)
index 0000000..f0c1319
--- /dev/null
@@ -0,0 +1,21 @@
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
index 6e0ec8d..fe27426 100644 (file)
@@ -13,6 +13,6 @@
 # limitations under the License.
 
 apiVersion: v1
-description: A Helm chart for Kubernetes
+description: SDN Controller
 name: sdnc
-version: 0.1.0
+version: 2.0.0
diff --git a/kubernetes/sdnc/charts/dmaap-listener/Chart.yaml b/kubernetes/sdnc/charts/dmaap-listener/Chart.yaml
new file mode 100644 (file)
index 0000000..ba2e574
--- /dev/null
@@ -0,0 +1,18 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: v1
+description: SDNC DMaaP Listener
+name: dmaap-listener
+version: 2.0.0
\ No newline at end of file
diff --git a/kubernetes/sdnc/charts/dmaap-listener/requirements.yaml b/kubernetes/sdnc/charts/dmaap-listener/requirements.yaml
new file mode 100644 (file)
index 0000000..ce82a2f
--- /dev/null
@@ -0,0 +1,18 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+dependencies:
+  - name: common
+    version: ~2.0.0
+    repository: '@local'
@@ -14,7 +14,7 @@ password =admin
 contenttype =application/json
 authKey=fxoW4jZrO7mdLWWa:f4KxkoBtToyoEG7suMoV8KhnkwM=
 authDate=2016-02-18T13:57:37-0800
-host=dmaap.{{.Values.nsPrefix}}:3904
+host=dmaap.{{.Release.Namespace}}:3904
 topic=VCPE-DHCP-EVENT
 group=jmsgrp
 id=sdnc1
@@ -32,4 +32,4 @@ sessionstickinessrequired=NO
 DME2preferredRouterFilePath=/opt/onap/sdnc/data/properties/dmaap-listener.preferredRoute.txt
 sdnc.odl.user=admin
 sdnc.odl.password=admin
-sdnc.odl.url-base=https://sdnhost.{{.Values.nsPrefix}}:8443/restconf/operations
+sdnc.odl.url-base=https://sdnhost.{{.Release.Namespace}}:8443/restconf/operations
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-#{{ if not .Values.disableSdncDmaap }}
 apiVersion: v1
 kind: ConfigMap
 metadata:
   name: sdnc-dmaap-configmap
-  namespace: {{ .Values.nsPrefix }}
+  namespace: {{ include "common.namespace" . }}
 data:
-{{ tpl (.Files.Glob "resources/config/dmaap/*").AsConfig . | indent 2 }}
-#{{ end }}
+{{ tpl (.Files.Glob "resources/config/*").AsConfig . | indent 2 }}
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-#{{ if not .Values.disableSdncDmaap }}
 apiVersion: extensions/v1beta1
 kind: Deployment
 metadata:
-  name: sdnc-dmaap-listener
-  namespace: "{{ .Values.nsPrefix }}"
+  name: {{ include "common.fullname" . }}
+  namespace: {{ include "common.namespace" . }}
+  labels:
+    app: {{ include "common.name" . }}
+    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
+    release: {{ .Release.Name }}
+    heritage: {{ .Release.Service }}
 spec:
-  replicas: {{ .Values.dmaapReplicas }}
-  selector:
-    matchLabels:
-      app: dmaap-listener
+  replicas: {{ .Values.replicaCount }}
   template:
     metadata:
       labels:
-        app: dmaap-listener
-      name: sdnc-dmaap-listener
+        app: {{ include "common.name" . }}
+        release: {{ .Release.Name }}
     spec:
       initContainers:
       - command:
         - /root/ready.py
         args:
         - --container-name
-        - sdnc-db-container
+        - {{ .Values.config.mysqlChartName }}
         - --container-name
-        - sdnc-controller-container
+        - {{ .Values.config.sdncChartName }}
         env:
         - name: NAMESPACE
           valueFrom:
             fieldRef:
               apiVersion: v1
               fieldPath: metadata.namespace
-        image: {{ .Values.image.readiness }}
-        imagePullPolicy: {{ .Values.pullPolicy }}
-        name: sdnc-dmaap-readiness
+        image: "{{ .Values.global.readinessRepository }}/{{ .Values.global.readinessImage }}"
+        imagePullPolicy: {{ .Values.global.pullPolicy | default .Values.pullPolicy }}
+        name: {{ include "common.name" . }}-readiness
       containers:
       - command:
         - /opt/onap/sdnc/dmaap-listener/bin/start-dmaap-listener.sh
+        name: {{ include "common.name" . }}
+        image: "{{ .Values.global.repository | default .Values.repository }}/{{ .Values.image }}"
+        imagePullPolicy: {{ .Values.global.pullPolicy | default .Values.pullPolicy }}
         env:
         - name: PROPERTY_DIR
-          value: /opt/onap/sdnc/data/properties
+          value: "{{ .Values.config.configDir }}"
         - name: SDNC_CONFIG_DIR
-          value: /opt/onap/sdnc/data/properties
-        image: {{ .Values.image.dmaaplistener }}
-        imagePullPolicy: {{ .Values.pullPolicy }}
-        name: dmaapp-listener-container
+          value: "{{ .Values.config.configDir }}"
         volumeMounts:
         - mountPath: /etc/localtime
           name: localtime
           readOnly: true
-        - mountPath: /opt/onap/sdnc/data/properties/dhcpalert.properties
+        - mountPath: {{ .Values.config.configDir }}/dhcpalert.properties
           subPath: dhcpalert.properties
           name: dmaap-dhcapalert-config
+        resources:
+{{ toYaml .Values.resources | indent 12 }}
+        {{- if .Values.nodeSelector }}
+        nodeSelector:
+{{ toYaml .Values.nodeSelector | indent 10 }}
+        {{- end -}}
+        {{- if .Values.affinity }}
+        affinity:
+{{ toYaml .Values.affinity | indent 10 }}
+        {{- end }}
+
       volumes:
         - name: localtime
           hostPath:
@@ -72,5 +84,4 @@ spec:
           configMap:
             name: sdnc-dmaap-configmap
       imagePullSecrets:
-      - name: "{{ .Values.nsPrefix }}-docker-registry-key"
-#{{ end }}
+      - name: "{{ include "common.namespace" . }}-docker-registry-key"
\ No newline at end of file
 # limitations under the License.
 
 apiVersion: v1
-kind: ConfigMap
+kind: Service
 metadata:
-  name: sdnc-mysql
-  namespace: "{{ .Values.nsPrefix }}"
+  name: {{ include "common.fullname" . }}
+  namespace: {{ include "common.namespace" . }}
   labels:
-    app: mysql
-data:
-  master.cnf: |
-    # Apply this config only on the master.
-    [mysqld]
-    log-bin
-    [localpathprefix]
-    master
-  slave.cnf: |
-    # Apply this config only on slaves.
-    [mysqld]
-    super-read-only
-    [localpathprefix]
-    slave
+    app: {{ include "common.name" . }}
+    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
+    release: {{ .Release.Name }}
+    heritage: {{ .Release.Service }}
+  annotations:
+spec:
+  type: ClusterIP
+  clusterIP: None
diff --git a/kubernetes/sdnc/charts/dmaap-listener/values.yaml b/kubernetes/sdnc/charts/dmaap-listener/values.yaml
new file mode 100644 (file)
index 0000000..601e9bb
--- /dev/null
@@ -0,0 +1,73 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+#################################################################
+# Global configuration defaults.
+#################################################################
+global:
+  nodePortPrefix: 302
+  repositorySecret: eyJuZXh1czMub25hcC5vcmc6MTAwMDEiOnsidXNlcm5hbWUiOiJkb2NrZXIiLCJwYXNzd29yZCI6ImRvY2tlciIsImVtYWlsIjoiQCIsImF1dGgiOiJaRzlqYTJWeU9tUnZZMnRsY2c9PSJ9fQ==
+  readinessRepository: oomk8s
+  readinessImage: readiness-check:1.0.0
+  loggingRepository: docker.elastic.co
+  loggingImage: beats/filebeat:5.5.0
+
+#################################################################
+# Application configuration defaults.
+#################################################################
+# application image
+repository: nexus3.onap.org:10001
+image: onap/sdnc-dmaap-listener-image:1.3-STAGING-latest
+pullPolicy: Always
+
+# flag to enable debugging - application support required
+debugEnabled: false
+
+# application configuration
+config:
+  dmaapPort: 3904
+  mysqlChartName: sdnc-dbhost
+  sdncChartName: sdnc
+  configDir: /opt/onap/sdnc/data/properties
+
+# default number of instances
+replicaCount: 1
+
+nodeSelector: {}
+
+affinity: {}
+
+# probe configuration parameters
+liveness:
+  initialDelaySeconds: 10
+  periodSeconds: 10
+  # necessary to disable liveness probe when setting breakpoints
+  # in debugger so K8s doesn't restart unresponsive container
+  enabled: true
+
+readiness:
+  initialDelaySeconds: 10
+  periodSeconds: 10
+
+ingress:
+  enabled: false
+
+resources: {}
+#resources:
+#  limits:
+#    cpu: 2
+#    memory: 4Gi
+#  requests:
+#    cpu: 2
+#    memory: 4Gi
diff --git a/kubernetes/sdnc/charts/sdnc-portal/.helmignore b/kubernetes/sdnc/charts/sdnc-portal/.helmignore
new file mode 100644 (file)
index 0000000..f0c1319
--- /dev/null
@@ -0,0 +1,21 @@
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
diff --git a/kubernetes/sdnc/charts/sdnc-portal/Chart.yaml b/kubernetes/sdnc/charts/sdnc-portal/Chart.yaml
new file mode 100644 (file)
index 0000000..193c38f
--- /dev/null
@@ -0,0 +1,18 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: v1
+description: SDN-C Admin Portal
+name: sdnc-portal
+version: 2.0.0
\ No newline at end of file
diff --git a/kubernetes/sdnc/charts/sdnc-portal/requirements.yaml b/kubernetes/sdnc/charts/sdnc-portal/requirements.yaml
new file mode 100644 (file)
index 0000000..1e8f788
--- /dev/null
@@ -0,0 +1,18 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+dependencies:
+  - name: common
+    version: ~2.0.0
+    repository: '@local'
\ No newline at end of file
old mode 100755 (executable)
new mode 100644 (file)
similarity index 94%
rename from kubernetes/sdnc/resources/config/conf/admportal.json
rename to kubernetes/sdnc/charts/sdnc-portal/resources/config/admportal.json
index ee575c2..4c0754b
@@ -39,8 +39,8 @@
   "dbPassword": "gamma",
   "dbName": "sdnctl",
   "odlProtocol": "http",
-  "odlHost": "sdnhost.{{.Values.nsPrefix}}",
-  "odlConexusHost": "sdnhost.{{.Values.nsPrefix}}",
+  "odlHost": "sdnhost.{{.Release.Namespace}}",
+  "odlConexusHost": "sdnhost.{{.Release.Namespace}}",
   "odlPort": "8181",
   "odlConexusPort": "8181",
   "odlUser": "admin",
diff --git a/kubernetes/sdnc/charts/sdnc-portal/templates/configmap.yaml b/kubernetes/sdnc/charts/sdnc-portal/templates/configmap.yaml
new file mode 100644 (file)
index 0000000..f2f2524
--- /dev/null
@@ -0,0 +1,21 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: sdnc-portal-configmap
+  namespace: {{ include "common.namespace" . }}
+data:
+{{ tpl (.Files.Glob "resources/config/*").AsConfig . | indent 2 }}
diff --git a/kubernetes/sdnc/charts/sdnc-portal/templates/deployment.yaml b/kubernetes/sdnc/charts/sdnc-portal/templates/deployment.yaml
new file mode 100644 (file)
index 0000000..5e1293c
--- /dev/null
@@ -0,0 +1,104 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: extensions/v1beta1
+kind: Deployment
+metadata:
+  name: {{ include "common.fullname" . }}
+  namespace: {{ include "common.namespace" . }}
+  labels:
+    app: {{ include "common.name" . }}
+    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
+    release: {{ .Release.Name }}
+    heritage: {{ .Release.Service }}
+spec:
+  replicas: {{ .Values.replicaCount }}
+  template:
+    metadata:
+      labels:
+        app: {{ include "common.name" . }}
+        release: {{ .Release.Name }}
+    spec:
+      initContainers:
+      - command:
+        - /root/ready.py
+        args:
+        - --container-name
+        - {{ .Values.config.mysqlChartName }}
+        - --container-name
+        - {{ .Values.config.sdncChartName }}
+        env:
+        - name: NAMESPACE
+          valueFrom:
+            fieldRef:
+              apiVersion: v1
+              fieldPath: metadata.namespace
+        image: "{{ .Values.global.readinessRepository }}/{{ .Values.global.readinessImage }}"
+        imagePullPolicy: {{ .Values.global.pullPolicy | default .Values.pullPolicy }}
+        name: {{ include "common.name" . }}-readiness
+      containers:
+        - name: {{ include "common.name" . }}
+          command: ["/bin/bash"]
+          args: ["-c", "cd /opt/onap/sdnc/admportal/shell && ./start_portal.sh"]
+          image: "{{ .Values.global.repository | default .Values.repository }}/{{ .Values.image }}"
+          imagePullPolicy: {{ .Values.global.pullPolicy | default .Values.pullPolicy }}
+          ports:
+          - containerPort: {{ .Values.service.internalPort }}
+          # disable liveness probe when breakpoints set in debugger
+          # so K8s doesn't restart unresponsive container
+          {{- if eq .Values.liveness.enabled true }}
+          livenessProbe:
+            tcpSocket:
+              port: {{ .Values.service.internalPort }}
+            initialDelaySeconds: {{ .Values.liveness.initialDelaySeconds }}
+            periodSeconds: {{ .Values.liveness.periodSeconds }}
+          {{ end -}}
+          readinessProbe:
+            tcpSocket:
+              port: {{ .Values.service.internalPort }}
+            initialDelaySeconds: {{ .Values.readiness.initialDelaySeconds }}
+            periodSeconds: {{ .Values.readiness.periodSeconds }}
+          env:
+            - name: MYSQL_ROOT_PASSWORD
+              valueFrom:
+                secretKeyRef:
+                  name: {{ template "common.fullname" . }}
+                  key: db-root-password
+            - name: SDNC_CONFIG_DIR
+              value: "{{ .Values.config.configDir }}"
+          volumeMounts:
+          - mountPath: /etc/localtime
+            name: localtime
+            readOnly: true
+          - mountPath: {{ .Values.config.configDir }}
+            name: sdnc-conf
+          resources:
+{{ toYaml .Values.resources | indent 12 }}
+        {{- if .Values.nodeSelector }}
+        nodeSelector:
+{{ toYaml .Values.nodeSelector | indent 10 }}
+        {{- end -}}
+        {{- if .Values.affinity }}
+        affinity:
+{{ toYaml .Values.affinity | indent 10 }}
+        {{- end }}
+      volumes:
+        - name: localtime
+          hostPath:
+            path: /etc/localtime
+        - name: sdnc-conf
+          configMap:
+            name: sdnc-portal-configmap
+      imagePullSecrets:
+      - name: "{{ include "common.namespace" . }}-docker-registry-key"
\ No newline at end of file
diff --git a/kubernetes/sdnc/charts/sdnc-portal/templates/secrets.yaml b/kubernetes/sdnc/charts/sdnc-portal/templates/secrets.yaml
new file mode 100644 (file)
index 0000000..345c194
--- /dev/null
@@ -0,0 +1,13 @@
+apiVersion: v1
+kind: Secret
+metadata:
+  name: {{ include "common.fullname" . }}
+  namespace: {{ include "common.namespace" . }}
+  labels:
+    app: {{ include "common.fullname" . }}
+    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
+    release: {{ .Release.Name }}
+    heritage: {{ .Release.Service }}
+type: Opaque
+data:
+  db-root-password: {{ .Values.config.dbRootPassword | b64enc | quote }}
diff --git a/kubernetes/sdnc/charts/sdnc-portal/templates/service.yaml b/kubernetes/sdnc/charts/sdnc-portal/templates/service.yaml
new file mode 100644 (file)
index 0000000..2d67c1f
--- /dev/null
@@ -0,0 +1,50 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ include "common.fullname" . }}
+  namespace: {{ include "common.namespace" . }}
+  labels:
+    app: {{ include "common.name" . }}
+    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
+    release: {{ .Release.Name }}
+    heritage: {{ .Release.Service }}
+  annotations:
+    msb.onap.org/service-info: '[
+      {
+          "serviceName": "sdnc-portal",
+          "version": "v1",
+          "url": "/",
+          "protocol": "UI",
+          "port": "{{ .Values.service.externalPort }}",
+          "visualRange":"0|1"
+      }
+      ]'
+spec:
+  type: {{ .Values.service.type }}
+  ports:
+    {{if eq .Values.service.type "NodePort" -}}
+    - port: {{ .Values.service.externalPort }}
+      nodePort: {{ .Values.global.nodePortPrefix | default .Values.nodePortPrefix }}{{ .Values.service.nodePort }}
+      name: {{ .Values.service.name }}
+    {{- else -}}
+    - port: {{ .Values.service.externalPort }}
+      targetPort: {{ .Values.service.internalPort }}
+      name: {{ .Values.service.name }}
+    {{- end}}
+  selector:
+    app: {{ include "common.name" . }}
+    release: {{ .Release.Name }}
\ No newline at end of file
diff --git a/kubernetes/sdnc/charts/sdnc-portal/values.yaml b/kubernetes/sdnc/charts/sdnc-portal/values.yaml
new file mode 100644 (file)
index 0000000..b5be3a6
--- /dev/null
@@ -0,0 +1,80 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+#################################################################
+# Global configuration defaults.
+#################################################################
+global:
+  nodePortPrefix: 302
+  repositorySecret: eyJuZXh1czMub25hcC5vcmc6MTAwMDEiOnsidXNlcm5hbWUiOiJkb2NrZXIiLCJwYXNzd29yZCI6ImRvY2tlciIsImVtYWlsIjoiQCIsImF1dGgiOiJaRzlqYTJWeU9tUnZZMnRsY2c9PSJ9fQ==
+  readinessRepository: oomk8s
+  readinessImage: readiness-check:1.0.0
+  loggingRepository: docker.elastic.co
+  loggingImage: beats/filebeat:5.5.0
+
+#################################################################
+# Application configuration defaults.
+#################################################################
+# application image
+repository: nexus3.onap.org:10001
+image: onap/admportal-sdnc-image:1.3-STAGING-latest
+pullPolicy: Always
+
+# flag to enable debugging - application support required
+debugEnabled: false
+
+# application configuration
+config:
+  mysqlChartName: sdnc-dbhost
+  dbRootPassword: openECOMP1.0
+  sdncChartName: sdnc
+  configDir: /opt/onap/sdnc/data/properties
+
+# default number of instances
+replicaCount: 1
+
+nodeSelector: {}
+
+affinity: {}
+
+# probe configuration parameters
+liveness:
+  initialDelaySeconds: 10
+  periodSeconds: 10
+  # necessary to disable liveness probe when setting breakpoints
+  # in debugger so K8s doesn't restart unresponsive container
+  enabled: true
+
+readiness:
+  initialDelaySeconds: 10
+  periodSeconds: 10
+
+service:
+  type: NodePort
+  name: sdnc-portal
+  internalPort: 8443
+  externalPort: 8443
+  nodePort: "01"
+
+ingress:
+  enabled: false
+
+resources: {}
+#resources:
+#  limits:
+#    cpu: 2
+#    memory: 4Gi
+#  requests:
+#    cpu: 2
+#    memory: 4Gi
diff --git a/kubernetes/sdnc/charts/ueb-listener/Chart.yaml b/kubernetes/sdnc/charts/ueb-listener/Chart.yaml
new file mode 100644 (file)
index 0000000..35b2a2e
--- /dev/null
@@ -0,0 +1,18 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: v1
+description: SDNC UEB Listener
+name: ueb-listener
+version: 2.0.0
\ No newline at end of file
diff --git a/kubernetes/sdnc/charts/ueb-listener/requirements.yaml b/kubernetes/sdnc/charts/ueb-listener/requirements.yaml
new file mode 100644 (file)
index 0000000..ce82a2f
--- /dev/null
@@ -0,0 +1,18 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+dependencies:
+  - name: common
+    version: ~2.0.0
+    repository: '@local'
@@ -1,4 +1,4 @@
-org.onap.ccsdk.sli.northbound.uebclient.asdc-address=sdc-be.{{.Values.nsPrefix}}:8443
+org.onap.ccsdk.sli.northbound.uebclient.asdc-address=sdc-be.{{.Release.Namespace}}:8443
 org.onap.ccsdk.sli.northbound.uebclient.consumer-group=sdc-OpenSource-Env1-sdnc-dockero
 org.onap.ccsdk.sli.northbound.uebclient.consumer-id=sdc-COpenSource-Env11-sdnc-dockero
 org.onap.ccsdk.sli.northbound.uebclient.environment-name=AUTO
@@ -6,7 +6,7 @@ org.onap.ccsdk.sli.northbound.uebclient.password=Kp8bJ4SXszM0WXlhak3eHlcse2gAw84
 org.onap.ccsdk.sli.northbound.uebclient.user=sdnc
 org.onap.ccsdk.sli.northbound.uebclient.sdnc-user=admin
 org.onap.ccsdk.sli.northbound.uebclient.sdnc-passwd=Kp8bJ4SXszM0WXlhak3eHlcse2gAw84vaoGGmJvUy2U
-org.onap.ccsdk.sli.northbound.uebclient.asdc-api-base-url=http://sdnhost.{{.Values.nsPrefix}}:8282/restconf/operations/
+org.onap.ccsdk.sli.northbound.uebclient.asdc-api-base-url=http://sdnhost.{{.Release.Namespace}}:8282/restconf/operations/
 org.onap.ccsdk.sli.northbound.uebclient.asdc-api-namespace=org:onap:ccsdk
 org.onap.ccsdk.sli.northbound.uebclient.spool.incoming=/opt/onap/sdnc/ueb-listener/spool/incoming
 org.onap.ccsdk.sli.northbound.uebclient.spool.archive=/opt/onap/sdnc/ueb-listener/spool/archive
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-#{{ if not .Values.disableSdncUeb }}
 apiVersion: v1
 kind: ConfigMap
 metadata:
   name: sdnc-ueb-configmap
-  namespace: {{ .Values.nsPrefix }}
+  namespace: {{ include "common.namespace" . }}
 data:
-{{ tpl (.Files.Glob "resources/config/ueb/*").AsConfig . | indent 2 }}
-#{{ end }}
+{{ tpl (.Files.Glob "resources/config/*").AsConfig . | indent 2 }}
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-#{{ if not .Values.disableSdncUeb }}
 apiVersion: extensions/v1beta1
 kind: Deployment
 metadata:
-  name: sdnc-ueb-listener
-  namespace: "{{ .Values.nsPrefix }}"
+  name: {{ include "common.fullname" . }}
+  namespace: {{ include "common.namespace" . }}
+  labels:
+    app: {{ include "common.name" . }}
+    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
+    release: {{ .Release.Name }}
+    heritage: {{ .Release.Service }}
 spec:
-  replicas: {{ .Values.uebReplicas }}
-  selector:
-    matchLabels:
-      app: ueb-listener
+  replicas: {{ .Values.replicaCount }}
   template:
     metadata:
       labels:
-        app: ueb-listener
-      name: sdnc-ueb-listener
+        app: {{ include "common.name" . }}
+        release: {{ .Release.Name }}
     spec:
       initContainers:
       - command:
         - /root/ready.py
         args:
         - --container-name
-        - sdnc-db-container
+        - {{ .Values.config.mysqlChartName }}
         - --container-name
-        - sdnc-controller-container
+        - {{ .Values.config.sdncChartName }}
         env:
         - name: NAMESPACE
           valueFrom:
             fieldRef:
               apiVersion: v1
               fieldPath: metadata.namespace
-        image: {{ .Values.image.readiness }}
-        imagePullPolicy: {{ .Values.pullPolicy }}
-        name: sdnc-ueb-readiness
+        image: "{{ .Values.global.readinessRepository }}/{{ .Values.global.readinessImage }}"
+        imagePullPolicy: {{ .Values.global.pullPolicy | default .Values.pullPolicy }}
+        name: {{ include "common.name" . }}-readiness
       containers:
       - command:
         - /opt/onap/sdnc/ueb-listener/bin/start-ueb-listener.sh
+        name: {{ include "common.name" . }}
+        image: "{{ .Values.global.repository | default .Values.repository }}/{{ .Values.image }}"
+        imagePullPolicy: {{ .Values.global.pullPolicy | default .Values.pullPolicy }}
         env:
         - name: PROPERTY_DIR
-          value: /opt/onap/sdnc/data/properties
+          value: "{{ .Values.config.configDir }}"
         - name: SDNC_CONFIG_DIR
-          value: /opt/onap/sdnc/data/properties
-        image: {{ .Values.image.ueblistener }}
-        imagePullPolicy: {{ .Values.pullPolicy }}
-        name: ueb-listener-container
+          value: "{{ .Values.config.configDir }}"
         volumeMounts:
         - mountPath: /etc/localtime
           name: localtime
@@ -64,6 +65,17 @@ spec:
         - mountPath: /opt/onap/sdnc/data/properties/ueb-listener.properties
           subPath: ueb-listener.properties
           name: ueb-config
+        resources:
+{{ toYaml .Values.resources | indent 12 }}
+        {{- if .Values.nodeSelector }}
+        nodeSelector:
+{{ toYaml .Values.nodeSelector | indent 10 }}
+        {{- end -}}
+        {{- if .Values.affinity }}
+        affinity:
+{{ toYaml .Values.affinity | indent 10 }}
+        {{- end }}
+
       volumes:
         - name: localtime
           hostPath:
@@ -72,5 +84,4 @@ spec:
           configMap:
             name: sdnc-ueb-configmap
       imagePullSecrets:
-      - name: "{{ .Values.nsPrefix }}-docker-registry-key"
-#{{ end }}
+      - name: "{{ include "common.namespace" . }}-docker-registry-key"
\ No newline at end of file
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-#{{ if not .Values.disableCliCli }}
 apiVersion: v1
 kind: Service
 metadata:
-  name: cli
-  namespace: "{{ .Values.nsPrefix }}"
+  name: {{ include "common.fullname" . }}
+  namespace: {{ include "common.namespace" . }}
   labels:
-    app: cli
+    app: {{ include "common.name" . }}
+    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
+    release: {{ .Release.Name }}
+    heritage: {{ .Release.Service }}
+  annotations:
 spec:
-  ports:
-  - name: 8080-port
-    port: 8080
-    targetPort: 80
-    nodePort: {{ .Values.nodePortPrefix }}60
-  - name: 9090-port
-    port: 9090
-    targetPort: 8080
-    nodePort: {{ .Values.nodePortPrefix }}61
-  type: NodePort
-  selector:
-    app: cli
-#{{ end }}
+  type: ClusterIP
+  clusterIP: None
diff --git a/kubernetes/sdnc/charts/ueb-listener/values.yaml b/kubernetes/sdnc/charts/ueb-listener/values.yaml
new file mode 100644 (file)
index 0000000..0f22647
--- /dev/null
@@ -0,0 +1,74 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+#################################################################
+# Global configuration defaults.
+#################################################################
+global:
+  nodePortPrefix: 302
+  repositorySecret: eyJuZXh1czMub25hcC5vcmc6MTAwMDEiOnsidXNlcm5hbWUiOiJkb2NrZXIiLCJwYXNzd29yZCI6ImRvY2tlciIsImVtYWlsIjoiQCIsImF1dGgiOiJaRzlqYTJWeU9tUnZZMnRsY2c9PSJ9fQ==
+  readinessRepository: oomk8s
+  readinessImage: readiness-check:1.0.0
+  loggingRepository: docker.elastic.co
+  loggingImage: beats/filebeat:5.5.0
+
+#################################################################
+# Application configuration defaults.
+#################################################################
+# application image
+repository: nexus3.onap.org:10001
+image: onap/sdnc-ueb-listener-image:1.3-STAGING-latest
+pullPolicy: Always
+
+# flag to enable debugging - application support required
+debugEnabled: false
+
+# application configuration
+config:
+  uebPort: 3904
+  mysqlChartName: sdnc-dbhost
+  sdncChartName: sdnc
+  configDir: /opt/onap/sdnc/data/properties
+
+
+# default number of instances
+replicaCount: 1
+
+nodeSelector: {}
+
+affinity: {}
+
+# probe configuration parameters
+liveness:
+  initialDelaySeconds: 10
+  periodSeconds: 10
+  # necessary to disable liveness probe when setting breakpoints
+  # in debugger so K8s doesn't restart unresponsive container
+  enabled: true
+
+readiness:
+  initialDelaySeconds: 10
+  periodSeconds: 10
+
+ingress:
+  enabled: false
+
+resources: {}
+#resources:
+#  limits:
+#    cpu: 2
+#    memory: 4Gi
+#  requests:
+#    cpu: 2
+#    memory: 4Gi
diff --git a/kubernetes/sdnc/requirements.yaml b/kubernetes/sdnc/requirements.yaml
new file mode 100644 (file)
index 0000000..c458755
--- /dev/null
@@ -0,0 +1,24 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+dependencies:
+  - name: common
+    version: ~2.0.0
+    repository: '@local'
+  - name: mysql
+    version: ~2.0.0
+    repository: '@local'
+  - name: dgbuilder
+    version: ~2.0.0
+    repository: '@local'
\ No newline at end of file
diff --git a/kubernetes/sdnc/resources/config/bin/installSdncDb.sh b/kubernetes/sdnc/resources/config/bin/installSdncDb.sh
new file mode 100644 (file)
index 0000000..f2c133c
--- /dev/null
@@ -0,0 +1,54 @@
+#!/bin/bash
+
+###
+# ============LICENSE_START=======================================================
+# ONAP : SDN-C
+# ================================================================================
+# Copyright (C) 2017 AT&T Intellectual Property. All rights
+#                                                      reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END=========================================================
+###
+
+SDNC_HOME=${SDNC_HOME:-/opt/onap/sdnc}
+MYSQL_PASSWD=${MYSQL_PASSWD:-openECOMP1.0}
+
+SDNC_DB_USER=${SDNC_DB_USER:-sdnctl}
+SDNC_DB_PASSWD=${SDNC_DB_PASSWD:-gamma}
+SDNC_DB_DATABASE=${SDN_DB_DATABASE:-sdnctl}
+
+
+# Create tablespace and user account
+mysql -h {{.Values.mysql.service.name}}.{{.Release.Namespace}} -u root -p${MYSQL_PASSWD} mysql <<-END
+CREATE DATABASE ${SDNC_DB_DATABASE};
+CREATE USER '${SDNC_DB_USER}'@'localhost' IDENTIFIED BY '${SDNC_DB_PASSWD}';
+CREATE USER '${SDNC_DB_USER}'@'%' IDENTIFIED BY '${SDNC_DB_PASSWD}';
+GRANT ALL PRIVILEGES ON ${SDNC_DB_DATABASE}.* TO '${SDNC_DB_USER}'@'localhost' WITH GRANT OPTION;
+GRANT ALL PRIVILEGES ON ${SDNC_DB_DATABASE}.* TO '${SDNC_DB_USER}'@'%' WITH GRANT OPTION;
+commit;
+END
+
+# load schema
+if [ -f ${SDNC_HOME}/data/sdnctl.dump ]
+then
+  mysql -h {{.Values.mysql.service.name}}.{{.Release.Namespace}} -u root -p${MYSQL_PASSWD} sdnctl < ${SDNC_HOME}/data/sdnctl.dump
+fi
+
+for datafile in ${SDNC_HOME}/data/*.data.dump
+do
+  mysql -h {{.Values.mysql.service.name}}.{{.Release.Namespace}} -u root -p${MYSQL_PASSWD} sdnctl < $datafile
+done
+
+# Create VNIs 100-199
+${SDNC_HOME}/bin/addVnis.sh 100 199
diff --git a/kubernetes/sdnc/resources/config/bin/startODL.sh b/kubernetes/sdnc/resources/config/bin/startODL.sh
new file mode 100755 (executable)
index 0000000..ee8106c
--- /dev/null
@@ -0,0 +1,93 @@
+#!/bin/bash
+
+###
+# ============LICENSE_START=======================================================
+# SDNC
+# ================================================================================
+# Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END=========================================================
+###
+
+function enable_odl_cluster(){
+  if [ -z $SDNC_REPLICAS ]; then
+     echo "SDNC_REPLICAS is not configured in Env field"
+     exit
+  fi
+
+  echo "Installing Opendaylight cluster features"
+  ${ODL_HOME}/bin/client -u karaf feature:install odl-mdsal-clustering
+  ${ODL_HOME}/bin/client -u karaf feature:install odl-jolokia
+
+  echo "Update cluster information statically"
+  hm=$(hostname)
+  echo "Get current Hostname ${hm}"
+
+  node=($(echo ${hm} | sed 's/-[0-9]*$//g'))
+  node_index=($(echo ${hm} | awk -F"-" '{print $NF}'))
+  node_list="${node}-0.{{ .Values.service.name }}-cluster.{{.Release.Namespace}}";
+
+  for ((i=1;i<${SDNC_REPLICAS};i++));
+  do
+    node_list="${node_list} ${node}-$i.{{ .Values.service.name }}-cluster.{{.Release.Namespace}}"
+  done
+
+  /opt/opendaylight/current/bin/configure_cluster.sh $((node_index+1)) ${node_list}
+}
+
+ODL_HOME=${ODL_HOME:-/opt/opendaylight/current}
+ODL_ADMIN_PASSWORD=${ODL_ADMIN_PASSWORD:-Kp8bJ4SXszM0WXlhak3eHlcse2gAw84vaoGGmJvUy2U}
+SDNC_HOME=${SDNC_HOME:-/opt/onap/sdnc}
+SLEEP_TIME=${SLEEP_TIME:-120}
+MYSQL_PASSWD=${MYSQL_PASSWD:-{{.Values.config.dbRootPassword}}}
+ENABLE_ODL_CLUSTER=${ENABLE_ODL_CLUSTER:-false}
+
+#
+# Wait for database to init properly
+#
+echo "Waiting for mysql"
+until mysql -h {{.Values.mysql.service.name}}.{{.Release.Namespace}} -u root -p{{.Values.config.dbRootPassword}} mysql &> /dev/null
+do
+  printf "."
+  sleep 1
+done
+echo -e "\nmysql ready"
+
+if [ ! -f ${SDNC_HOME}/.installed ]
+then
+        echo "Installing SDNC database"
+        ${SDNC_HOME}/bin/installSdncDb.sh
+        echo "Installing SDN-C keyStore"
+        ${SDNC_HOME}/bin/addSdncKeyStore.sh
+        echo "Starting OpenDaylight"
+        ${ODL_HOME}/bin/start
+        echo "Waiting ${SLEEP_TIME} seconds for OpenDaylight to initialize"
+        sleep ${SLEEP_TIME}
+        echo "Installing SDN-C platform features"
+        ${SDNC_HOME}/bin/installFeatures.sh
+        if [ -x ${SDNC_HOME}/svclogic/bin/install.sh ]
+        then
+                echo "Installing directed graphs"
+                ${SDNC_HOME}/svclogic/bin/install.sh
+        fi
+
+        if $ENABLE_ODL_CLUSTER ; then enable_odl_cluster ; fi
+
+        echo "Restarting OpenDaylight"
+        ${ODL_HOME}/bin/stop
+        echo "Installed at `date`" > ${SDNC_HOME}/.installed
+fi
+
+exec ${ODL_HOME}/bin/karaf
+
index 81f63ec..b5d1560 100755 (executable)
@@ -40,7 +40,7 @@ org.onap.ccsdk.sli.adaptors.aai.application=openECOMP
 #
 # Configuration file for A&AI Client
 #
-org.onap.ccsdk.sli.adaptors.aai.uri=https://aai-service.{{.Values.nsPrefix}}:8443
+org.onap.ccsdk.sli.adaptors.aai.uri=https://aai-service.{{.Release.Namespace}}:8443
 
 
 # query
@@ -134,8 +134,8 @@ org.onap.ccsdk.sli.adaptors.aai.path.vnf.image.query=/aai/v11/service-design-and
 
 # UBB Notify
 org.onap.ccsdk.sli.adaptors.aai.path.notify=/aai/v11/actions/notify
-org.onap.ccsdk.sli.adaptors.aai.notify.selflink.fqdn=https://aai-service.{{.Values.nsPrefix}}:8443/restconf/config/L3SDN-API:services/layer3-service-list/{service-instance-id}
-org.onap.ccsdk.sli.adaptors.aai.notify.selflink.avpn=https://aai-service.{{.Values.nsPrefix}}:8543/restconf/config/L3AVPN-EVC-API:services/service-list/{service-instance-id}/service-data/avpn-logicalchannel-information
+org.onap.ccsdk.sli.adaptors.aai.notify.selflink.fqdn=https://aai-service.{{.Release.Namespace}}:8443/restconf/config/L3SDN-API:services/layer3-service-list/{service-instance-id}
+org.onap.ccsdk.sli.adaptors.aai.notify.selflink.avpn=https://aai-service.{{.Release.Namespace}}:8543/restconf/config/L3AVPN-EVC-API:services/service-list/{service-instance-id}/service-data/avpn-logicalchannel-information
 
 # Service
 org.onap.ccsdk.sli.adaptors.aai.path.service=/aai/v11/service-design-and-creation/services/service/{service-id}
diff --git a/kubernetes/sdnc/resources/config/conf/dblib.properties b/kubernetes/sdnc/resources/config/conf/dblib.properties
new file mode 100644 (file)
index 0000000..4edae2b
--- /dev/null
@@ -0,0 +1,37 @@
+###
+# ============LICENSE_START=======================================================
+# openECOMP : SDN-C
+# ================================================================================
+# Copyright (C) 2017 AT&T Intellectual Property. All rights
+#                                              reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END=========================================================
+###
+
+# dblib.properrties
+org.onap.ccsdk.sli.dbtype=jdbc
+
+org.onap.ccsdk.sli.jdbc.hosts=sdnctldb01
+org.onap.ccsdk.sli.jdbc.url=jdbc:mysql://{{.Values.mysql.service.name}}.{{.Release.Namespace}}:3306/sdnctl
+org.onap.ccsdk.sli.jdbc.driver=org.mariadb.jdbc.Driver
+org.onap.ccsdk.sli.jdbc.database=sdnctl
+org.onap.ccsdk.sli.jdbc.user=sdnctl
+org.onap.ccsdk.sli.jdbc.password=gamma
+org.onap.ccsdk.sli.jdbc.connection.name=sdnctldb01
+org.onap.ccsdk.sli.jdbc.connection.timeout=50
+org.onap.ccsdk.sli.jdbc.request.timeout=100
+org.onap.ccsdk.sli.jdbc.limit.init=10
+org.onap.ccsdk.sli.jdbc.limit.min=10
+org.onap.ccsdk.sli.jdbc.limit.max=20
+org.onap.dblib.connection.recovery=false
diff --git a/kubernetes/sdnc/resources/config/conf/svclogic.properties b/kubernetes/sdnc/resources/config/conf/svclogic.properties
new file mode 100644 (file)
index 0000000..44ae32f
--- /dev/null
@@ -0,0 +1,27 @@
+###
+# ============LICENSE_START=======================================================
+# openECOMP : SDN-C
+# ================================================================================
+# Copyright (C) 2017 AT&T Intellectual Property. All rights
+#                                                       reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END=========================================================
+###
+
+org.onap.ccsdk.sli.dbtype = jdbc
+org.onap.ccsdk.sli.jdbc.url = jdbc:mysql://{{.Values.mysql.service.name}}.{{.Release.Namespace}}:3306/sdnctl
+org.onap.ccsdk.sli.jdbc.database = sdnctl
+org.onap.ccsdk.sli.jdbc.user = sdnctl
+org.onap.ccsdk.sli.jdbc.password = gamma
+
index 50818a3..7b65636 100644 (file)
-################################################################################\r
-#\r
-#    Licensed to the Apache Software Foundation (ASF) under one or more\r
-#    contributor license agreements.  See the NOTICE file distributed with\r
-#    this work for additional information regarding copyright ownership.\r
-#    The ASF licenses this file to You under the Apache License, Version 2.0\r
-#    (the "License"); you may not use this file except in compliance with\r
-#    the License.  You may obtain a copy of the License at\r
-#\r
-#       http://www.apache.org/licenses/LICENSE-2.0\r
-#\r
-#    Unless required by applicable law or agreed to in writing, software\r
-#    distributed under the License is distributed on an "AS IS" BASIS,\r
-#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-#    See the License for the specific language governing permissions and\r
-#    limitations under the License.\r
-#\r
-################################################################################\r
-\r
-# Root logger\r
-log4j.rootLogger=INFO, async, osgi:*\r
-log4j.throwableRenderer=org.apache.log4j.OsgiThrowableRenderer\r
-\r
-# Log Directory\r
-logDir=/var/log/onap\r
-componentName=sdnc\r
-logDirectory=${logDir}/${componentName}\r
-maxFileSize=100MB\r
-maxBackupIndex=20\r
-\r
-# CONSOLE appender not used by default\r
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender\r
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout\r
-log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd'T'HH:mm:ss.SSS}\t%-16.16t\t%-5.5p\t%c{36}\t%X{bundle.id} - %X{bundle.name} - %X{bundle.version}\t%m%n\r
-\r
-# Async appender forwarding to file appender \r
-log4j.appender.async=org.apache.log4j.AsyncAppender\r
-log4j.appender.async.appenders=out\r
-\r
-# File appender\r
-log4j.appender.out=org.apache.log4j.RollingFileAppender\r
-log4j.appender.out.layout=org.apache.log4j.xml.XMLLayout\r
-log4j.appender.out.layout.Properties=true\r
-log4j.appender.out.file=${logDirectory}/karaf.log\r
-log4j.appender.out.append=true\r
-log4j.appender.out.maxFileSize=${maxFileSize}\r
-log4j.appender.out.maxBackupIndex=${maxBackupIndex}\r
-\r
-# Sift appender\r
-log4j.appender.sift=org.apache.log4j.sift.MDCSiftingAppender\r
-log4j.appender.sift.key=bundle.name\r
-log4j.appender.sift.default=karaf\r
-log4j.appender.sift.appender=org.apache.log4j.RollingFileAppender\r
-log4j.appender.sift.appender.layout=org.apache.log4j.xml.XMLLayout\r
-log4j.appender.sift.appender.layout.Properties=true\r
-log4j.appender.sift.appender.file=${logDirectory}/$\\{bundle.name\\}.log\r
-log4j.appender.sift.appender.append=true\r
+################################################################################
+#
+#    Licensed to the Apache Software Foundation (ASF) under one or more
+#    contributor license agreements.  See the NOTICE file distributed with
+#    this work for additional information regarding copyright ownership.
+#    The ASF licenses this file to You under the Apache License, Version 2.0
+#    (the "License"); you may not use this file except in compliance with
+#    the License.  You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS,
+#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#    See the License for the specific language governing permissions and
+#    limitations under the License.
+#
+################################################################################
+
+# Root logger
+log4j.rootLogger=INFO, async, osgi:*
+log4j.throwableRenderer=org.apache.log4j.OsgiThrowableRenderer
+
+maxFileSize=100MB
+maxBackupIndex=20
+logDir=/var/log/onap
+componentName=sdnc
+logDirectory=${logDir}/${componentName}
+karafLogName=karaf
+errorLogName=error
+metricsLogName=metrics
+auditLogName=audit
+debugLogName=debug
+
+
+# CONSOLE appender not used by default
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd'T'HH:mm:ss.SSS}\t%-16.16t\t%-5.5p\t%c{36}\t%X{bundle.id} - %X{bundle.name} - %X{bundle.version}\t%m%n
+
+# Async appender forwarding to file appender
+log4j.appender.async=org.apache.log4j.AsyncAppender
+log4j.appender.async.appenders=out
+
+# File appender
+log4j.appender.out=org.apache.log4j.RollingFileAppender
+log4j.appender.out.layout=org.apache.log4j.xml.XMLLayout
+log4j.appender.out.layout.Properties=true
+log4j.appender.out.file=${logDirectory}/${karafLogName}.log
+log4j.appender.out.append=true
+log4j.appender.out.maxFileSize=${maxFileSize}
+log4j.appender.out.maxBackupIndex=${maxBackupIndex}
+
+# Sift appender
+log4j.appender.sift=org.apache.log4j.sift.MDCSiftingAppender
+log4j.appender.sift.key=bundle.name
+log4j.appender.sift.default=karaf
+log4j.appender.sift.appender=org.apache.log4j.RollingFileAppender
+log4j.appender.sift.appender.layout=org.apache.log4j.xml.XMLLayout
+log4j.appender.sift.appender.layout.Properties=true
+log4j.appender.sift.appender.file=${logDirectory}/$\\{bundle.name\\}.log
+log4j.appender.sift.appender.append=true
+
+
+
+log4j.category.org.opendaylight.controller.netconf.persist.impl.osgi.ConfigPusherImpl=DEBUG
+log4j.category.org.opendaylight.controller.netconf.persist.impl.osgi.ConfigPersisterActivator=DEBUG
+
+
+#ECOMP Debug appender
+log4j.appender.debug=org.apache.log4j.RollingFileAppender
+log4j.appender.debug.key=bundle.name
+log4j.appender.debug.default=karaf
+log4j.appender.debug.appName=EELFDebug
+log4j.appender.debug.layout=org.apache.log4j.xml.XMLLayout
+log4j.appender.debug.layout.Properties=true
+log4j.appender.debug.file=${logDirectory}/${debugLogName}.log
+log4j.appender.debug.append=true
+log4j.appender.debug.maxFileSize=${maxFileSize}
+log4j.appender.debug.maxBackupIndex=${maxBackupIndex}
+#log4j.appender.debug.filter.f1=org.apache.log4j.varia.LevelRangeFilter
+#log4j.appender.debug.filter.f1.LevelMax=WARN
+#log4j.appender.debug.filter.f1.LevelMin=TRACE
+
+
+#Error appender
+log4j.appender.error=org.apache.log4j.RollingFileAppender
+log4j.appender.error.appName=EELFError
+log4j.appender.error.File=${logDirectory}/${errorLogName}.log
+log4j.appender.error.Threshold=ERROR
+log4j.appender.error.maxFileSize=${maxFileSize}
+log4j.appender.error.maxBackupIndex=${maxBackupIndex}
+log4j.appender.error.layout=org.apache.log4j.xml.XMLLayout
+log4j.appender.error.layout.Properties=true
+
+#Metrics appender
+log4j.appender.metric=org.apache.log4j.RollingFileAppender
+log4j.appender.metric.appName=EELFMetrics
+log4j.appender.metric.File=${logDirectory}/${metricsLogName}.log
+log4j.appender.metric.maxFileSize=${maxFileSize}
+log4j.appender.metric.maxBackupIndex=${maxBackupIndex}
+log4j.appender.metric.layout=org.apache.log4j.xml.XMLLayout
+log4j.appender.metric.layout.Properties=true
+
+#Audit appender
+log4j.appender.audit=org.apache.log4j.RollingFileAppender
+log4j.appender.audit.appName=EELFAudit
+log4j.appender.audit.File=${logDirectory}/${auditLogName}.log
+log4j.appender.audit.maxFileSize=${maxFileSize}
+log4j.appender.audit.maxBackupIndex=${maxBackupIndex}
+log4j.appender.audit.layout=org.apache.log4j.xml.XMLLayout
+log4j.appender.audit.layout.Properties=true
+
+#Loggers
+#Routing of all messages from root logger
+log4j.logger.com.att=TRACE, debug, error
+#Store to the same log file messages from upper level appender or not
+log4j.additivity.com.att=false
+
+#EELFManager loggers
+#EELF parent logger
+log4j.logger.com.att.eelf=TRACE, debug
+log4j.additivity.com.att.eelf=false
+
+#Audit logger routing
+log4j.logger.com.att.eelf.audit=DEBUG, audit
+log4j.additivity.com.att.eelf.audit=false
+
+#Metric logger routing
+log4j.logger.com.att.eelf.metrics=DEBUG, metric
+log4j.additivity.com.att.eelf.metrics=false
+
+#Performance logger routing
+log4j.logger.com.att.eelf.perf=DEBUG, metric
+log4j.additivity.com.att.eelf.perf=false
+
+#Server logger routing
+log4j.logger.com.att.eelf.server=DEBUG, debug
+log4j.additivity.com.att.eelf.server=false
+
+#Policy logger routing
+log4j.logger.com.att.eelf.policy=DEBUG, debug
+log4j.additivity.com.att.eelf.policy=false
+
+#Error logger routing
+log4j.logger.com.att.eelf.error=DEBUG, error
+log4j.additivity.com.att.eelf.error=false
+
+#Debug logger routing
+log4j.logger.com.att.eelf.debug=DEBUG, debug
+log4j.additivity.com.att.eelf.debug=false
diff --git a/kubernetes/sdnc/templates/all-services.yaml b/kubernetes/sdnc/templates/all-services.yaml
deleted file mode 100644 (file)
index 14d7b01..0000000
+++ /dev/null
@@ -1,200 +0,0 @@
-# Copyright © 2017 Amdocs, Bell Canada
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-#{{ if not .Values.disableSdncSdncDbhost }}
-apiVersion: v1
-kind: Service
-metadata:
-  name: dbhost
-  namespace: "{{ .Values.nsPrefix }}"
-  labels:
-    app: sdnc-dbhost
-spec:
-  ports:
-    - port: 3306
-  selector:
-    app: sdnc-dbhost
-  clusterIP: None
----
-# Client service for connecting to any MySQL instance for reads.
-# Only master: sdnc-dbhost-0 accepts the write request.
-apiVersion: v1
-kind: Service
-metadata:
-  name: dbhost-read
-  namespace: "{{ .Values.nsPrefix }}"
-  labels:
-    app: sdnc-dbhost
-spec:
-  ports:
-  - name: sdnc-dbhost
-    port: 3306
-  selector:
-    app: sdnc-dbhost
----
-apiVersion: v1
-kind: Service
-metadata:
-  name: sdnctldb01
-  namespace: "{{ .Values.nsPrefix }}"
-  labels:
-    app: sdnc-dbhost
-spec:
-  ports:
-    - port: 3306
-  selector:
-    app: sdnc-dbhost
-  clusterIP: None
----
-apiVersion: v1
-kind: Service
-metadata:
-  name: sdnctldb02
-  namespace: "{{ .Values.nsPrefix }}"
-  labels:
-    app: sdnc-dbhost
-spec:
-  ports:
-    - port: 3306
-  selector:
-    app: sdnc-dbhost
-  clusterIP: None
-#{{ end }}
-#{{ if not .Values.disableSdncSdnc }}
----
-apiVersion: v1
-kind: Service
-metadata:
-  name: sdnc-dgbuilder
-  namespace: "{{ .Values.nsPrefix }}"
-  labels:
-    app: sdnc-dgbuilder
-spec:
-  ports:
-  - name: "sdnc-dgbuilder-port"
-    port: 3000
-    targetPort: 3100
-    nodePort: {{ .Values.nodePortPrefix }}03
-  type: NodePort
-  selector:
-    app: sdnc-dgbuilder
----
-apiVersion: v1
-kind: Service
-metadata:
-  name: sdnhost
-  namespace: "{{ .Values.nsPrefix }}"
-  labels:
-    app: sdnc
-  annotations:
-    msb.onap.org/service-info: '[
-      {
-          "serviceName": "sdnc",
-          "version": "v1",
-          "url": "/",
-          "protocol": "REST",
-          "port": "8282",
-          "visualRange":"1",
-          "path": "/"
-      }
-      ]'
-spec:
-  ports:
-  - name: "sdnc-port-8181"
-    port: 8282
-    targetPort: 8181
-    nodePort: {{ .Values.nodePortPrefix }}02
-  - name: "sdnc-port-8101"
-    port: 8201
-    targetPort: 8101
-    nodePort: {{ .Values.nodePortPrefix }}08
-  - name: "sdnc-jolokia-port-8080"
-    port: 8280
-    targetPort: 8080
-    nodePort: {{ .Values.nodePortPrefix }}46
-  type: NodePort
-  selector:
-    app: sdnc
----
-kind: Service
-apiVersion: v1
-metadata:
-  name: nfs-provisioner
-  namespace: "{{ .Values.nsPrefix }}"
-  labels:
-    app: nfs-provisioner
-spec:
-  ports:
-    - name: nfs
-      port: 2049
-    - name: mountd
-      port: 20048
-    - name: rpcbind
-      port: 111
-    - name: rpcbind-udp
-      port: 111
-      protocol: UDP
-  selector:
-    app: nfs-provisioner
-#{{ end }}
-#{{ if not .Values.disableSdncSdncPortal }}
----
-apiVersion: v1
-kind: Service
-metadata:
-  name: sdnc-portal
-  namespace: "{{ .Values.nsPrefix }}"
-  labels:
-    app: sdnc-portal
-  annotations:
-    msb.onap.org/service-info: '[
-      {
-          "serviceName": "sdnc-portal",
-          "version": "v1",
-          "url": "/",
-          "protocol": "UI",
-          "port": "8843",
-          "visualRange":"0|1"
-      }
-      ]'
-spec:
-  ports:
-  - name: "sdnc-portal-port"
-    port: 8843
-    nodePort: {{ .Values.nodePortPrefix }}01
-  type: NodePort
-  selector:
-    app: sdnc-portal
-#{{ end }}
-#{{ if .Values.enableODLCluster }}
----
-apiVersion: v1
-kind: Service
-metadata:
-  name: sdnhost-cluster
-  namespace: "{{ .Values.nsPrefix }}"
-  labels:
-    app: sdnc
-  annotations:
-    service.alpha.kubernetes.io/tolerate-unready-endpoints: "true"
-spec:
-  ports:
-   - name: "sdnc-cluster-port"
-     port: 2550
-  clusterIP: None
-  selector:
-    app: sdnc
-  sessionAffinity: None
-  type: ClusterIP
-#{{ end }}
diff --git a/kubernetes/sdnc/templates/configmap.yaml b/kubernetes/sdnc/templates/configmap.yaml
new file mode 100644 (file)
index 0000000..54de05c
--- /dev/null
@@ -0,0 +1,77 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: {{ include "common.fullname" . }}-filebeat-configmap
+  namespace: {{ include "common.namespace" . }}
+data:
+{{ tpl (.Files.Glob "resources/config/log/filebeat/log4j/*").AsConfig . | indent 2 }}
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: {{ include "common.fullname" . }}-log-configmap
+  namespace: {{ include "common.namespace" . }}
+data:
+{{ tpl (.Files.Glob "resources/config/log/*").AsConfig . | indent 2 }}
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: {{ include "common.fullname" . }}-startodl
+  namespace: {{ include "common.namespace" . }}
+data:
+{{ tpl (.Files.Glob "resources/config/bin/startODL.sh").AsConfig . | indent 2 }}
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: {{ include "common.fullname" . }}-installsdncdb
+  namespace: {{ include "common.namespace" . }}
+data:
+{{ tpl (.Files.Glob "resources/config/bin/installSdncDb.sh").AsConfig . | indent 2 }}
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: {{ include "common.fullname" . }}-aaiclient-properties
+  namespace: {{ include "common.namespace" . }}
+data:
+{{ tpl (.Files.Glob "resources/config/conf/aaiclient.properties").AsConfig . | indent 2 }}
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: {{ include "common.fullname" . }}-dblib-properties
+  namespace: {{ include "common.namespace" . }}
+data:
+{{ tpl (.Files.Glob "resources/config/conf/dblib.properties").AsConfig . | indent 2 }}
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: {{ include "common.fullname" . }}-svclogic-config
+  namespace: {{ include "common.namespace" . }}
+data:
+{{ tpl (.Files.Glob "resources/config/conf/svclogic.properties").AsConfig . | indent 2 }}
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: {{ include "common.fullname" . }}-onap-sdnc-svclogic-config
+  namespace: {{ include "common.namespace" . }}
+data:
+{{ tpl (.Files.Glob "resources/config/conf/svclogic.properties").AsConfig . | indent 2 }}
diff --git a/kubernetes/sdnc/templates/db-statefulset.yaml b/kubernetes/sdnc/templates/db-statefulset.yaml
deleted file mode 100644 (file)
index 29d592a..0000000
+++ /dev/null
@@ -1,220 +0,0 @@
-# Copyright © 2017 Amdocs, Bell Canada
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-#{{ if not .Values.disableSdncSdncDbhost }}
-apiVersion: apps/v1beta1
-kind: StatefulSet
-metadata:
-  name: sdnc-dbhost
-  namespace: "{{ .Values.nsPrefix }}"
-spec:
-  serviceName: "dbhost"
-  replicas: {{ .Values.numberOfDbReplicas }}
-  selector:
-    matchLabels:
-      app: sdnc-dbhost
-  template:
-    metadata:
-      labels:
-        app: sdnc-dbhost
-      name: sdnc-dbhost
-    spec:
-      initContainers:
-      - name: init-mysql
-        image: {{ .Values.image.mysql }}
-        imagePullPolicy: {{ .Values.pullPolicy }}
-        command:
-        - bash
-        - "-c"
-        - |
-          set -ex
-          # Generate mysql server-id from pod ordinal index.
-          [[ `hostname` =~ -([0-9]+)$ ]] || exit 1
-          ordinal=${BASH_REMATCH[1]}
-          echo BASH_REMATCH=${BASH_REMATCH}
-          echo [mysqld] > /mnt/conf.d/server-id.cnf
-          # Add an offset to avoid reserved server-id=0 value.
-          echo server-id=$((100 + $ordinal)) >> /mnt/conf.d/server-id.cnf
-          # Copy appropriate conf.d files from config-map to emptyDir.
-          if [[ $ordinal -eq 0 ]]; then
-            cp /mnt/config-map/master.cnf /mnt/conf.d/
-          else
-            cp /mnt/config-map/slave.cnf /mnt/conf.d/
-          fi
-        volumeMounts:
-        - name: conf
-          mountPath: /mnt/conf.d
-        - name: config-map
-          mountPath: /mnt/config-map
-      - name: clone-mysql
-        image: {{ .Values.image.xtrabackup }}
-        env:
-        - name: MYSQL_ROOT_PASSWORD
-          value: openECOMP1.0
-        command:
-        - bash
-        - "-c"
-        - |
-          set -ex
-          # Skip the clone if data already exists.
-          [[ -d /var/lib/mysql/mysql ]] && exit 0
-          # Skip the clone on master (ordinal index 0).
-          [[ `hostname` =~ -([0-9]+)$ ]] || exit 1
-          ordinal=${BASH_REMATCH[1]}
-          echo ${BASH_REMATCH}
-          [[ $ordinal -eq 0 ]] && exit 0
-          # Clone data from previous peer.
-          ncat --recv-only sdnc-dbhost-$(($ordinal-1)).dbhost.{{ .Values.nsPrefix }} 3307 | xbstream -x -C /var/lib/mysql
-          # Prepare the backup.
-          xtrabackup --user=root --password=$MYSQL_ROOT_PASSWORD --prepare --target-dir=/var/lib/mysql
-          ls -l /var/lib/mysql
-        volumeMounts:
-        - name: sdnc-data
-          mountPath: /var/lib/mysql
-#{{ if not .Values.disableNfsProvisioner }}
-          subPath: mysql
-#{{ end }}
-        - name: conf
-          mountPath: /etc/mysql/conf.d
-      containers:
-      - env:
-        - name: MYSQL_ROOT_PASSWORD
-          value: openECOMP1.0
-        - name: MYSQL_ROOT_HOST
-          value: '%'
-        - name: MYSQL_ALLOW_EMPTY_PASSWORD
-          value: "0"
-        image: {{ .Values.image.mysql }}
-        imagePullPolicy: {{ .Values.pullPolicy }}
-        name: sdnc-db-container
-        volumeMounts:
-        - mountPath: /var/lib/mysql
-          name: sdnc-data
-#{{ if not .Values.disableNfsProvisioner }}
-          subPath: mysql
-#{{ end }}
-        - name: conf
-          mountPath: /etc/mysql/conf.d
-        ports:
-        - containerPort: 3306
-        resources:
-          requests:
-            cpu: 500m
-            memory: 1Gi
-        livenessProbe:
-          exec:
-            command: ["mysqladmin", "ping"]
-          initialDelaySeconds: 30
-          periodSeconds: 10
-          timeoutSeconds: 5
-        readinessProbe:
-          tcpSocket:
-            port: 3306
-          initialDelaySeconds: 5
-          periodSeconds: 10
-      - name: xtrabackup
-        image: {{ .Values.image.xtrabackup }}
-        env:
-        - name: MYSQL_ROOT_PASSWORD
-          value: openECOMP1.0
-        ports:
-        - name: xtrabackup
-          containerPort: 3307
-        command:
-        - bash
-        - "-c"
-        - |
-          set -ex
-          cd /var/lib/mysql
-          ls -l
-          # Determine binlog position of cloned data, if any.
-          if [[ -f xtrabackup_slave_info ]]; then
-            echo "Inside xtrabackup_slave_info"
-            # XtraBackup already generated a partial "CHANGE MASTER TO" query
-            # because we're cloning from an existing slave.
-            mv xtrabackup_slave_info change_master_to.sql.in
-            # Ignore xtrabackup_binlog_info in this case (it's useless).
-            rm -f xtrabackup_binlog_info
-          elif [[ -f xtrabackup_binlog_info ]]; then
-            echo "Inside xtrabackup_binlog_info"
-            # We're cloning directly from master. Parse binlog position.
-            [[ `cat xtrabackup_binlog_info` =~ ^(.*?)[[:space:]]+(.*?)$ ]] || exit 1
-            rm xtrabackup_binlog_info
-            echo "CHANGE MASTER TO MASTER_LOG_FILE='${BASH_REMATCH[1]}',\
-                  MASTER_LOG_POS=${BASH_REMATCH[2]}" > change_master_to.sql.in
-          fi
-
-          # Check if we need to complete a clone by starting replication.
-          if [[ -f change_master_to.sql.in ]]; then
-            echo "Waiting for mysqld to be ready (accepting connections)"
-            [[ `hostname` =~ -([0-9]+)$ ]] || exit 1
-            ordinal=${BASH_REMATCH[1]}
-            echo $ordinal
-            until mysql --user=root --password=$MYSQL_ROOT_PASSWORD -h 127.0.0.1 -e "SELECT 1"; do sleep 1; done
-
-            echo "Initializing replication from clone position"
-            # In case of container restart, attempt this at-most-once.
-            mv change_master_to.sql.in change_master_to.sql.orig
-            mysql --user=root --password=$MYSQL_ROOT_PASSWORD -h 127.0.0.1 <<EOF
-          $(<change_master_to.sql.orig),
-            MASTER_HOST="sdnc-dbhost-0.dbhost.{{ .Values.nsPrefix }}",
-            MASTER_USER="root",
-            MASTER_PASSWORD="$MYSQL_ROOT_PASSWORD",
-            MASTER_CONNECT_RETRY=10;
-          START SLAVE;
-          EOF
-          fi
-
-          # Start a server to send backups when requested by peers.
-          exec ncat --listen --keep-open --send-only --max-conns=1 3307 -c \
-            "xtrabackup --user=root --password=$MYSQL_ROOT_PASSWORD --backup --slave-info --stream=xbstream --host=127.0.0.1"
-        volumeMounts:
-        - name: sdnc-data
-          mountPath: /var/lib/mysql
-#{{ if not .Values.disableNfsProvisioner }}
-          subPath: mysql
-#{{ end }}
-        - name: conf
-          mountPath: /etc/mysql/conf.d
-        resources:
-          requests:
-            cpu: 100m
-            memory: 100Mi
-      volumes:
-      - name: conf
-        emptyDir: {}
-      - name: config-map
-        configMap:
-          name: sdnc-mysql
-      - name: localtime
-        hostPath:
-          path: /etc/localtime
-#{{ if .Values.disableNfsProvisioner }}
-      - name: sdnc-data
-        hostPath:
-          path: {{ .Values.dataRootDir }}/{{ .Values.nsPrefix }}/sdnc/data/mysql
-#{{ else }}
-  volumeClaimTemplates:
-  - metadata:
-      name: sdnc-data
-      annotations:
-        volume.beta.kubernetes.io/storage-class: "{{ .Values.nsPrefix }}-sdnc-data"
-    spec:
-      accessModes: ["ReadWriteMany"]
-      resources:
-        requests:
-          storage: 1Gi
-#{{ end }}
-#{{ end }}
-
diff --git a/kubernetes/sdnc/templates/dgbuilder-deployment.yaml b/kubernetes/sdnc/templates/dgbuilder-deployment.yaml
deleted file mode 100644 (file)
index 62f1d00..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-# Copyright © 2017 Amdocs, Bell Canada
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-#{{ if not .Values.disableSdncSdncDgbuilder }}
-apiVersion: extensions/v1beta1
-kind: Deployment
-metadata:
-  name: sdnc-dgbuilder
-  namespace: "{{ .Values.nsPrefix }}"
-spec:
-  replicas: {{ .Values.dgbuilderReplicas }}
-  selector:
-    matchLabels:
-      app: sdnc-dgbuilder
-  template:
-    metadata:
-      labels:
-        app: sdnc-dgbuilder
-      name: sdnc-dgbuilder
-    spec:
-      initContainers:
-      - command:
-        - /root/ready.py
-        args:
-        - --container-name
-        - sdnc-db-container
-        - --container-name
-        - sdnc-controller-container
-        env:
-        - name: NAMESPACE
-          valueFrom:
-            fieldRef:
-              apiVersion: v1
-              fieldPath: metadata.namespace
-        image: {{ .Values.image.readiness }}
-        imagePullPolicy: {{ .Values.pullPolicy }}
-        name: sdnc-dgbuilder-readiness
-      containers:
-      - command:
-        - /bin/bash
-        - -c
-        - cd /opt/onap/sdnc/dgbuilder/ && ./start.sh sdnc1.0 && wait
-        env:
-        - name: MYSQL_ROOT_PASSWORD
-          value: openECOMP1.0
-        - name: SDNC_CONFIG_DIR
-          value: /opt/onap/sdnc/data/properties
-        image: {{ .Values.image.dgbuilderSdnc }}
-        imagePullPolicy: {{ .Values.pullPolicy }}
-        name: sdnc-dgbuilder-container
-        ports:
-        - containerPort: 3100
-        readinessProbe:
-          tcpSocket:
-            port: 3100
-          initialDelaySeconds: 5
-          periodSeconds: 10
-        volumeMounts:
-        - name: localtime
-          mountPath: /etc/localtime
-          readOnly: true
-      restartPolicy: Always
-      volumes:
-      - name: localtime
-        hostPath:
-          path: /etc/localtime
-      imagePullSecrets:
-      - name: "{{ .Values.nsPrefix }}-docker-registry-key"
-#{{ end }}
diff --git a/kubernetes/sdnc/templates/nfs-provisoner-deployment.yaml b/kubernetes/sdnc/templates/nfs-provisoner-deployment.yaml
deleted file mode 100644 (file)
index 12713a1..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-# Copyright © 2017 Amdocs, Bell Canada
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-#{{ if not .Values.disableSdncSdncDbhost }}
-#{{ if not .Values.disableNfsProvisioner }}
-kind: Deployment
-apiVersion: extensions/v1beta1
-metadata:
-  name: sdnc-nfs-provisioner
-  namespace: "{{ .Values.nsPrefix }}"
-spec:
-  replicas: {{ .Values.nfsReplicas }}
-  strategy:
-    type: Recreate
-  template:
-    metadata:
-      labels:
-        app: nfs-provisioner
-      name: sdnc-nfs-provisioner
-    spec:
-      containers:
-        - name: nfs-provisioner
-          image: quay.io/kubernetes_incubator/nfs-provisioner:v1.0.8
-          ports:
-            - name: nfs
-              containerPort: 2049
-            - name: mountd
-              containerPort: 20048
-            - name: rpcbind
-              containerPort: 111
-            - name: rpcbind-udp
-              containerPort: 111
-              protocol: UDP
-          securityContext:
-            capabilities:
-              add:
-                - DAC_READ_SEARCH
-                - SYS_RESOURCE
-          args:
-            - "-provisioner=sdnc/nfs"
-          env:
-            - name: POD_IP
-              valueFrom:
-                fieldRef:
-                  fieldPath: status.podIP
-            - name: SERVICE_NAME
-              value: nfs-provisioner
-            - name: POD_NAMESPACE
-              valueFrom:
-                fieldRef:
-                  fieldPath: metadata.namespace
-          imagePullPolicy: "IfNotPresent"
-          volumeMounts:
-            - name: export-volume
-              mountPath: /export
-      volumes:
-        - name: export-volume
-          hostPath:
-            path: {{ .Values.dataRootDir }}/{{ .Values.nsPrefix }}/sdnc/data
-#{{ end }}
-#{{ end }}
diff --git a/kubernetes/sdnc/templates/sdnc-log-configmap.yaml b/kubernetes/sdnc/templates/sdnc-log-configmap.yaml
deleted file mode 100644 (file)
index a0bf0e2..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-# Copyright © 2017 Amdocs, Bell Canada
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-#{{ if not .Values.disableSdncSdnc }}
-apiVersion: v1
-kind: ConfigMap
-metadata:
-  name: sdnc-log-configmap
-  namespace: {{ .Values.nsPrefix }}
-data:
-{{ tpl (.Files.Glob "resources/config/log/filebeat/log4j/*").AsConfig . | indent 2 }}
----
-apiVersion: v1
-kind: ConfigMap
-metadata:
-  name: sdnc-logging-cfg-configmap
-  namespace: {{ .Values.nsPrefix }}
-data:
-{{ tpl (.Files.Glob "resources/config/log/*").AsConfig . | indent 2 }}
-#{{ end }}
diff --git a/kubernetes/sdnc/templates/sdnc-statefulset.yaml b/kubernetes/sdnc/templates/sdnc-statefulset.yaml
deleted file mode 100644 (file)
index 3b07896..0000000
+++ /dev/null
@@ -1,131 +0,0 @@
-# Copyright © 2017 Amdocs, Bell Canada
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-#{{ if not .Values.disableSdncSdnc }}
-apiVersion: apps/v1beta1
-kind: StatefulSet
-metadata:
-  name: sdnc
-  namespace: "{{ .Values.nsPrefix }}"
-spec:
-  serviceName: "sdnhost-cluster"
-  replicas: {{ .Values.numberOfODLReplicas }}
-  podManagementPolicy: Parallel
-  selector:
-    matchLabels:
-      app: sdnc
-  template:
-    metadata:
-      labels:
-        app: sdnc
-      name: sdnc
-    spec:
-      initContainers:
-      - command:
-        - /root/ready.py
-        args:
-        - --container-name
-        - sdnc-db-container
-        env:
-        - name: NAMESPACE
-          valueFrom:
-            fieldRef:
-              apiVersion: v1
-              fieldPath: metadata.namespace
-        image: {{ .Values.image.readiness }}
-        imagePullPolicy: {{ .Values.pullPolicy }}
-        name: sdnc-readiness
-      containers:
-      - command:
-        - bash
-        - "-c"
-        - |
-          sed -i 's/dbhost/sdnc-dbhost-0.dbhost.{{ .Values.nsPrefix }}.svc.cluster.local/g' /opt/onap/sdnc/data/properties/svclogic.properties
-          sed -i 's/^\(org.onap.ccsdk.sli.jdbc.hosts=\).*/\1sdnc-dbhost-0.dbhost.{{ .Values.nsPrefix }}.svc.cluster.local/' /opt/onap/sdnc/data/properties/dblib.properties
-          /opt/onap/sdnc/bin/startODL.sh
-        env:
-        - name: MYSQL_ROOT_PASSWORD
-          value: openECOMP1.0
-        - name: SDNC_CONFIG_DIR
-          value: /opt/onap/sdnc/data/properties
-        - name: ENABLE_ODL_CLUSTER
-          value: "{{ .Values.enableODLCluster }}"
-        - name: SDNC_REPLICAS
-          value: "{{ .Values.numberOfODLReplicas }}"
-        image: {{ .Values.image.sdnc }}
-        imagePullPolicy: {{ .Values.pullPolicy }}
-        name: sdnc-controller-container
-        volumeMounts:
-        - mountPath: /etc/localtime
-          name: localtime
-          readOnly: true
-        - mountPath: /opt/onap/sdnc/data/properties/admportal.json
-          name: sdnc-conf
-          subPath: admportal.json
-        - mountPath: /opt/onap/sdnc/data/properties/aaiclient.properties
-          name: sdnc-conf
-          subPath: aaiclient.properties
-        - mountPath: /var/log/onap
-          name: sdnc-logs
-        - mountPath: /opt/opendaylight/current/etc/org.ops4j.pax.logging.cfg
-          name: sdnc-logging-cfg-config
-          subPath: org.ops4j.pax.logging.cfg
-        ports:
-        - containerPort: 8181
-        - containerPort: 8101
-        - containerPort: 2550
-        - containerPort: 8080
-        readinessProbe:
-          tcpSocket:
-            port: 8181
-          initialDelaySeconds: 5
-          periodSeconds: 10
-      - image: {{ .Values.image.filebeat }}
-        imagePullPolicy: {{ .Values.pullPolicy }}
-        name: filebeat-onap
-        volumeMounts:
-        - mountPath: /usr/share/filebeat/filebeat.yml
-          name: filebeat-conf
-          subPath: filebeat.yml
-        - mountPath: /var/log/onap
-          name: sdnc-logs
-        - mountPath: /usr/share/filebeat/data
-          name: sdnc-data-filebeat
-      volumes:
-        - name: localtime
-          hostPath:
-            path: /etc/localtime
-        - name: filebeat-conf
-          configMap:
-            name: sdnc-log-configmap
-        - name: sdnc-logging-cfg-config
-          configMap:
-            name: sdnc-logging-cfg-configmap
-        - name: sdnc-logs
-          emptyDir: {}
-        - name: sdnc-data-filebeat
-          emptyDir: {}
-        - name: sdnc-conf
-          configMap:
-            name: sdnc-conf-configmap
-            items:
-            - key: admportal.json
-              path: admportal.json
-              mode: 0755
-            - key: aaiclient.properties
-              path: aaiclient.properties
-              mode: 0755
-      imagePullSecrets:
-      - name: "{{ .Values.nsPrefix }}-docker-registry-key"
-#{{ end }}
diff --git a/kubernetes/sdnc/templates/secrets.yaml b/kubernetes/sdnc/templates/secrets.yaml
new file mode 100644 (file)
index 0000000..345c194
--- /dev/null
@@ -0,0 +1,13 @@
+apiVersion: v1
+kind: Secret
+metadata:
+  name: {{ include "common.fullname" . }}
+  namespace: {{ include "common.namespace" . }}
+  labels:
+    app: {{ include "common.fullname" . }}
+    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
+    release: {{ .Release.Name }}
+    heritage: {{ .Release.Service }}
+type: Opaque
+data:
+  db-root-password: {{ .Values.config.dbRootPassword | b64enc | quote }}
diff --git a/kubernetes/sdnc/templates/service.yaml b/kubernetes/sdnc/templates/service.yaml
new file mode 100644 (file)
index 0000000..7744499
--- /dev/null
@@ -0,0 +1,81 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ include "common.fullname" . }}
+  namespace: {{ include "common.namespace" . }}
+  labels:
+    app: {{ include "common.name" . }}
+    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
+    release: {{ .Release.Name }}
+    heritage: {{ .Release.Service }}
+  annotations:
+    msb.onap.org/service-info: '[
+      {
+          "serviceName": "sdnc",
+          "version": "v1",
+          "url": "/",
+          "protocol": "REST",
+          "port": "{{ .Values.service.externalPort }}",
+          "visualRange":"1",
+          "path": "/"
+      }
+      ]'
+spec:
+  type: {{ .Values.service.type }}
+  ports:
+    {{if eq .Values.service.type "NodePort" -}}
+    - port: {{ .Values.service.externalPort }}
+      targetPort: {{ .Values.service.internalPort }}
+      nodePort: {{ .Values.global.nodePortPrefix | default .Values.nodePortPrefix }}{{ .Values.service.nodePort }}
+      name: "{{ .Values.service.name }}-8282"
+    - port: {{ .Values.service.externalPort2 }}
+      targetPort: {{ .Values.service.internalPort2 }}
+      nodePort: {{ .Values.global.nodePortPrefix | default .Values.nodePortPrefix }}{{ .Values.service.nodePort2 }}
+      name: "{{ .Values.service.name }}-8202"
+    - port: {{ .Values.service.externalPort3 }}
+      targetPort: {{ .Values.service.internalPort3 }}
+      nodePort: {{ .Values.global.nodePortPrefix | default .Values.nodePortPrefix }}{{ .Values.service.nodePort3 }}
+      name: "{{ .Values.service.name }}-8280"
+    {{- else -}}
+    - port: {{ .Values.service.externalPort }}
+      targetPort: {{ .Values.service.internalPort }}
+      name: {{ .Values.service.name }}
+    {{- end}}
+  selector:
+    app: {{ include "common.name" . }}
+    release: {{ .Release.Name }}
+---
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ .Values.service.name }}-cluster
+  namespace: {{ include "common.namespace" . }}
+  labels:
+    app: {{ include "common.name" . }}
+    release: {{ .Release.Name }}
+  annotations:
+    service.alpha.kubernetes.io/tolerate-unready-endpoints: "true"
+spec:
+  ports:
+   - name: "{{ .Values.service.name }}-cluster-port"
+     port: {{ .Values.service.clusterPort }}
+  clusterIP: None
+  selector:
+    app: {{ include "common.name" . }}
+    release: {{ .Release.Name }}
+  sessionAffinity: None
+  type: ClusterIP
diff --git a/kubernetes/sdnc/templates/statefulset.yaml b/kubernetes/sdnc/templates/statefulset.yaml
new file mode 100644 (file)
index 0000000..8b4055e
--- /dev/null
@@ -0,0 +1,188 @@
+# Copyright © 2017 Amdocs, Bell Canada
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: apps/v1beta1
+kind: StatefulSet
+metadata:
+  name: {{ include "common.fullname" . }}
+  namespace: {{ include "common.namespace" . }}
+  labels:
+    app: {{ include "common.name" . }}
+    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
+    release: {{ .Release.Name }}
+    heritage: {{ .Release.Service }}
+spec:
+  serviceName: "{{ .Values.service.name }}-cluster"
+  replicas: {{ .Values.replicaCount }}
+  podManagementPolicy: Parallel
+  template:
+    metadata:
+      labels:
+        app: {{ include "common.name" . }}
+        release: {{ .Release.Name }}
+    spec:
+      initContainers:
+      - command:
+        - /root/ready.py
+        args:
+        - --container-name
+        - {{ .Values.mysql.nameOverride }}
+        env:
+        - name: NAMESPACE
+          valueFrom:
+            fieldRef:
+              apiVersion: v1
+              fieldPath: metadata.namespace
+        image: "{{ .Values.global.readinessRepository }}/{{ .Values.global.readinessImage }}"
+        imagePullPolicy: {{ .Values.global.pullPolicy | default .Values.pullPolicy }}
+        name: {{ include "common.name" . }}-readiness
+      containers:
+        - name: {{ include "common.name" . }}
+          image: "{{ .Values.global.repository | default .Values.repository }}/{{ .Values.image }}"
+          imagePullPolicy: {{ .Values.global.pullPolicy | default .Values.pullPolicy }}
+          command: ["/bin/bash"]
+          args: ["-c", "/opt/sdnc/bin/startODL.sh"]
+          ports:
+          - containerPort: {{ .Values.service.internalPort }}
+          - containerPort: {{ .Values.service.internalPort2 }}
+          - containerPort: {{ .Values.service.internalPort3 }}
+          - containerPort: {{ .Values.service.clusterPort }}
+          readinessProbe:
+            tcpSocket:
+              port: {{ .Values.service.internalPort }}
+            initialDelaySeconds: {{ .Values.readiness.initialDelaySeconds }}
+            periodSeconds: {{ .Values.readiness.periodSeconds }}
+          env:
+            - name: MYSQL_ROOT_PASSWORD
+              valueFrom:
+                secretKeyRef:
+                  name: {{ template "common.fullname" . }}
+                  key: db-root-password
+            - name: SDNC_CONFIG_DIR
+              value: "{{ .Values.config.configDir }}"
+            - name: ENABLE_ODL_CLUSTER
+              value: "{{ .Values.config.enableClustering }}"
+            - name: SDNC_REPLICAS
+              value: "{{ .Values.replicaCount }}"
+            - name: MYSQL_HOST
+              value: "{{.Values.mysql.service.name}}.{{.Release.Namespace}}"
+          volumeMounts:
+          - mountPath: /etc/localtime
+            name: localtime
+            readOnly: true
+          - mountPath: /opt/opendaylight/current/etc/org.ops4j.pax.logging.cfg
+            name: sdnc-logging-cfg-config
+            subPath: org.ops4j.pax.logging.cfg
+          - mountPath: /opt/onap/sdnc/bin/startODL.sh
+            name: startodl
+            subPath: startODL.sh
+          - mountPath: /opt/onap/sdnc/bin/installSdncDb.sh
+            name: installsdncdb
+            subPath: installSdncDb.sh
+          - mountPath: /opt/onap/sdnc/data/properties/aaiclient.properties
+            name: aaiclient-conf
+            subPath: aaiclient.properties
+          - mountPath: /opt/onap/sdnc/data/properties/dblib.properties
+            name: sdnc-dblib-properties
+            subPath: dblib.properties
+          - mountPath: /opt/onap/sdnc/data/properties/svclogic.properties
+            name: sdnc-svclogic-config
+            subPath: svclogic.properties
+          - mountPath: /opt/onap/sdnc/svclogic/config/svclogic.properties
+            name: onap-sdnc-svclogic-config
+            subPath: svclogic.properties
+          - mountPath: /var/log/onap
+            name: logs
+          resources:
+{{ toYaml .Values.resources | indent 12 }}
+        {{- if .Values.nodeSelector }}
+        nodeSelector:
+{{ toYaml .Values.nodeSelector | indent 10 }}
+        {{- end -}}
+        {{- if .Values.affinity }}
+        affinity:
+{{ toYaml .Values.affinity | indent 10 }}
+        {{- end }}
+
+        # side car containers
+        - name: filebeat-onap
+          image: "{{ .Values.global.loggingRepository }}/{{ .Values.global.loggingImage }}"
+          imagePullPolicy: {{ .Values.global.pullPolicy | default .Values.pullPolicy }}
+          volumeMounts:
+          - mountPath: /usr/share/filebeat/filebeat.yml
+            name: filebeat-conf
+            subPath: filebeat.yml
+          - mountPath: /var/log/onap
+            name: logs
+          - mountPath: /usr/share/filebeat/data
+            name: data-filebeat
+      volumes:
+        - name: localtime
+          hostPath:
+            path: /etc/localtime
+        - name: logs
+          emptyDir: {}
+        - name: data-filebeat
+          emptyDir: {}
+        - name: filebeat-conf
+          configMap:
+            name: {{ include "common.fullname" . }}-filebeat-configmap
+        - name: sdnc-logging-cfg-config
+          configMap:
+            name: {{ include "common.fullname" . }}-log-configmap
+        - name: startodl
+          configMap:
+            name: {{ include "common.fullname" . }}-startodl
+            items:
+            - key: startODL.sh
+              path: startODL.sh
+              mode: 0755
+        - name: installsdncdb
+          configMap:
+            name: {{ include "common.fullname" . }}-installsdncdb
+            items:
+            - key: installSdncDb.sh
+              path: installSdncDb.sh
+              mode: 0755
+        - name: aaiclient-conf
+          configMap:
+            name: {{ include "common.fullname" . }}-aaiclient-properties
+            items:
+            - key: aaiclient.properties
+              path: aaiclient.properties
+              mode: 0644
+        - name: sdnc-dblib-properties
+          configMap:
+            name: {{ include "common.fullname" . }}-dblib-properties
+            items:
+            - key: dblib.properties
+              path: dblib.properties
+              mode: 0644
+        - name: sdnc-svclogic-config
+          configMap:
+            name: {{ include "common.fullname" . }}-svclogic-config
+            items:
+            - key: svclogic.properties
+              path: svclogic.properties
+              mode: 0644
+        - name: onap-sdnc-svclogic-config
+          configMap:
+            name: {{ include "common.fullname" . }}-onap-sdnc-svclogic-config
+            items:
+            - key: svclogic.properties
+              path: svclogic.properties
+              mode: 0644
+
+      imagePullSecrets:
+      - name: "{{ include "common.namespace" . }}-docker-registry-key"
diff --git a/kubernetes/sdnc/templates/web-deployment.yaml b/kubernetes/sdnc/templates/web-deployment.yaml
deleted file mode 100644 (file)
index ef469ac..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-# Copyright © 2017 Amdocs, Bell Canada
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-#{{ if not .Values.disableSdncSdncPortal }}
-apiVersion: extensions/v1beta1
-kind: Deployment
-metadata:
-  name: sdnc-portal
-  namespace: "{{ .Values.nsPrefix }}"
-spec:
-  replicas: {{ .Values.portalReplicas }}
-  selector:
-    matchLabels:
-      app: sdnc-portal
-  template:
-    metadata:
-      labels:
-        app: sdnc-portal
-      name: sdnc-portal
-    spec:
-      initContainers:
-      - command:
-        - /root/ready.py
-        args:
-        - --container-name
-        - sdnc-db-container
-        - --container-name
-        - sdnc-controller-container
-        env:
-        - name: NAMESPACE
-          valueFrom:
-            fieldRef:
-              apiVersion: v1
-              fieldPath: metadata.namespace
-        image: {{ .Values.image.readiness }}
-        imagePullPolicy: {{ .Values.pullPolicy }}
-        name: sdnc-portal-readiness
-      containers:
-      - command:
-        - /bin/bash
-        - -c
-        - cd /opt/onap/sdnc/admportal/shell && ./start_portal.sh
-        env:
-        - name: MYSQL_ROOT_PASSWORD
-          value: openECOMP1.0
-        - name: SDNC_CONFIG_DIR
-          value: /opt/onap/sdnc/data/properties
-        image: {{ .Values.image.admportalSdnc }}
-        imagePullPolicy: {{ .Values.pullPolicy }}
-        name: sdnc-portal-container
-        ports:
-        - containerPort: 8843
-        volumeMounts:
-        - name: localtime
-          mountPath: /etc/localtime
-          readOnly: true
-        - mountPath: /opt/onap/sdnc/data/properties/
-          name: sdnc-conf
-        readinessProbe:
-          tcpSocket:
-            port: 8843
-          initialDelaySeconds: 5
-          periodSeconds: 10
-      restartPolicy: Always
-      volumes:
-      - name: localtime
-        hostPath:
-          path: /etc/localtime
-      - name: sdnc-conf
-        configMap:
-          name: sdnc-conf-configmap
-      imagePullSecrets:
-      - name: "{{ .Values.nsPrefix }}-docker-registry-key"
-#{{ end }}
index 9402917..6606e17 100644 (file)
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-nsPrefix: onap
-pullPolicy: IfNotPresent
-nodePortPrefix: 302
-dataRootDir: /dockerdata-nfs
-image:
-  readiness: oomk8s/readiness-check:1.1.0
-  mysql: mysql:5.7
-  xtrabackup: gcr.io/google-samples/xtrabackup:1.0
-  dgbuilderSdnc: nexus3.onap.org:10001/onap/ccsdk-dgbuilder-image:v0.1.0
-  sdnc: nexus3.onap.org:10001/onap/sdnc-image:v1.2.1
-  admportalSdnc: nexus3.onap.org:10001/onap/admportal-sdnc-image:v1.2.1
-  ueblistener: nexus3.onap.org:10001/onap/sdnc-ueb-listener-image:v1.2.1
-  dmaaplistener: nexus3.onap.org:10001/onap/sdnc-dmaap-listener-image:v1.2.1
-  filebeat: docker.elastic.co/beats/filebeat:5.5.0
-enableODLCluster: false
-numberOfODLReplicas: 1
-numberOfDbReplicas: 1
-dgbuilderReplicas: 1
-dmaapReplicas: 1
-nfsReplicas: 1
-uebReplicas: 1
-portalReplicas: 1
-disableSdncSdncDgbuilder: false
-disableSdncSdncPortal: false
-disableNfsProvisioner: false
+#################################################################
+# Global configuration defaults.
+#################################################################
+global:
+  nodePortPrefix: 302
+  repository: nexus3.onap.org:10001
+  repositorySecret: eyJuZXh1czMub25hcC5vcmc6MTAwMDEiOnsidXNlcm5hbWUiOiJkb2NrZXIiLCJwYXNzd29yZCI6ImRvY2tlciIsImVtYWlsIjoiQCIsImF1dGgiOiJaRzlqYTJWeU9tUnZZMnRsY2c9PSJ9fQ==
+  readinessRepository: oomk8s
+  readinessImage: readiness-check:1.1.0
+  loggingRepository: docker.elastic.co
+  loggingImage: beats/filebeat:5.5.0
+  persistence:
+    mountPath: /dockerdata-nfs
+
+#################################################################
+# Application configuration defaults.
+#################################################################
+# application images
+repository: nexus3.onap.org:10001
+pullPolicy: Always
+image: onap/sdnc-image:1.3-STAGING-latest
+
+# flag to enable debugging - application support required
+debugEnabled: false
+
+# application configuration
 config:
+  dbRootPassword: openECOMP1.0
+  enableClustering: true
+  configDir: /opt/onap/sdnc/data/properties
+  dmaapTopic: SUCCESS
   logstashServiceName: log-ls
   logstashPort: 5044
+
+# dependency / sub-chart configuration
+dmaap-listener:
+  nameOverride: sdnc-dmaap-listener
+  config:
+    sdncChartName: sdnc
+    mysqlChartName: sdnc-db
+    configDir: /opt/onap/sdnc/data/properties
+
+ueb-listener:
+  nameOverride: sdnc-ueb-listener
+  config:
+    sdncChartName: sdnc
+    mysqlChartName: sdnc-db
+    configDir: /opt/onap/sdnc/data/properties
+
+sdnc-portal:
+  config:
+    sdncChartName: sdnc
+    mysqlChartName: sdnc-db
+    configDir: /opt/onap/sdnc/data/properties
+    dbRootPassword: openECOMP1.0
+
+mysql:
+  nameOverride: sdnc-db
+  service:
+    name: sdnc-dbhost
+  nfsprovisionerPrefix: sdnc
+  sdnctlPrefix: sdnc
+  persistence:
+    mountSubPath: sdnc/data
+    enabled: true
+  disableNfsProvisioner: false
+  replicaCount: 1
+
+dgbuilder:
+  nameOverride: sdnc-dgbuilder
+  config:
+    dbPodName: sdnc-db
+    dbServiceName: sdnc-dbhost
+    dbRootPassword: openECOMP1.0
+  service:
+    nodePort: "03"
+
+# default number of instances
+replicaCount: 1
+
+nodeSelector: {}
+
+affinity: {}
+
+# probe configuration parameters
+liveness:
+  initialDelaySeconds: 10
+  periodSeconds: 10
+  # necessary to disable liveness probe when setting breakpoints
+  # in debugger so K8s doesn't restart unresponsive container
+  enabled: true
+
+readiness:
+  initialDelaySeconds: 10
+  periodSeconds: 10
+
+service:
+  type: NodePort
+  name: sdnc
+  #targetPort
+  internalPort: 8181
+  internalPort2: 8101
+  internalPort3: 8080
+  #port
+  externalPort: 8282
+  nodePort: "02"
+
+  externalPort2: 8202
+  nodePort2: "08"
+
+  externalPort3: 8280
+  nodePort3: 46
+
+  clusterPort: 2550
+
+ingress:
+  enabled: false
+
+resources: {}
+#resources:
+#  limits:
+#    cpu: 2
+#    memory: 4Gi
+#  requests:
+#    cpu: 2
+#    memory: 4Gi