From cbd98fe6f011a2a90b3dc7c52a01457f659b4320 Mon Sep 17 00:00:00 2001 From: Martin Weise <martin.weise@tuwien.ac.at> Date: Thu, 7 Nov 2024 07:35:53 +0000 Subject: [PATCH] Fixed mapping problem where UK and FK share columns they are inserted --- .docker/.env | 13 ++ .docs/api/data-db.md | 22 +-- .docs/images/coverage.svg | 2 +- .docs/images/maintainability.svg | 24 +++ .docs/images/pipeline.svg | 2 +- .docs/images/security.svg | 24 +++ .docs/index.md | 2 + .gitignore | 2 +- .gitlab-ci.yml | 7 +- .gitlab/gen-badge.sh | 7 +- README.md | 16 +- dbrepo-analyse-service/api/dto.py | 1 - dbrepo-analyse-service/determine_dt.py | 2 + .../test/test_determine_dt.py | 8 + dbrepo-ui/bun.lockb | Bin 404227 -> 381532 bytes dbrepo-ui/components/table/TableSchema.vue | 28 +-- dbrepo-ui/locales/en-US.json | 2 +- dbrepo-ui/nuxt.config.ts | 8 +- dbrepo-ui/package.json | 2 +- dbrepo-ui/pages/login.vue | 6 - dbrepo-ui/plugins/vuetify.ts | 3 - dbrepo-ui/utils/index.ts | 12 +- helm/dbrepo/README.md | 162 +++++++++--------- helm/dbrepo/values.schema.json | 114 ++++++------ helm/dbrepo/values.yaml | 6 +- make/build.mk | 2 - make/dev.mk | 1 + make/gen.mk | 2 +- make/rel.mk | 2 - 29 files changed, 274 insertions(+), 208 deletions(-) create mode 100644 .docker/.env create mode 100644 .docs/images/maintainability.svg create mode 100644 .docs/images/security.svg diff --git a/.docker/.env b/.docker/.env new file mode 100644 index 0000000000..bf2e6ba5ba --- /dev/null +++ b/.docker/.env @@ -0,0 +1,13 @@ +# Example values to override for non-test deployments + +#BASE_URL=https://example.com +#ADMIN_EMAIL=noreply@example.com +#LOG_LEVEL=info +#IDENTITY_SERVICE_ADMIN_PASSWORD=admin +#AUTH_SERVICE_ADMIN_PASSWORD=admin +#METADATA_DB_PASSWORD=dbrepo +#DATA_DB_PASSWORD=dbrepo +#AUTH_DB_PASSWORD=dbrepo +#S3_ACCESS_KEY_ID=seaweedfsadmin +#S3_SECRET_ACCESS_KEY=seaweedfsadmin +#SYSTEM_PASSWORD=admin diff --git a/.docs/api/data-db.md b/.docs/api/data-db.md index aecabb9736..f721b2b164 100644 --- a/.docs/api/data-db.md +++ b/.docs/api/data-db.md @@ -19,29 +19,15 @@ author: Martin Weise The Data Database contains the research data. In the default configuration, only one database of this type is deployed. Any number of MariaDB ata databases can be integrated into DBRepo, even non-empty databases. The database needs to be -registered in the Metadata Database to be visible in the [User Interface](../ui) and usable from e.g. the Python +registered in the Metadata Database to be visible in the [User Interface](../ui) and usable from e.g. the Python Library. ## Data -The procedures require the user-generated databases to have the same collation (because of comparison operations). -Ensure that the Data Database has the character set `utf8mb4` and collation `utf8mb4_general_ci` in your `my.cfg`: - -```ini -[mysqld] -character_set_server=utf8mb4 -collation_server=utf8mb4_general_ci -``` - -We observed this unexpected behavior for +The procedures requires the in parameter of the `hash_table` stored procedure to have the same collation as the +`information_schema.columns` table. We observed this unexpected behavior for the [MariaDB Galera chart](https://artifacthub.io/packages/helm/bitnami/mariadb-galera) powered by Bitnami and had to -set extra flags. We could not observe this behavior with -the [MariaDB Galera container image](https://hub.docker.com/r/bitnami/mariadb-galera) itself. - -```yaml -mariadb-galera: - extraFlags: "--character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci" -``` +set extra flags. ### Backup diff --git a/.docs/images/coverage.svg b/.docs/images/coverage.svg index 8d22334eb1..74b0307350 100644 --- a/.docs/images/coverage.svg +++ b/.docs/images/coverage.svg @@ -9,7 +9,7 @@ </mask> <g mask="url(#anybadge_1)"> <path fill="#555" d="M0 0h65v20H0z"/> - <path fill="#A9A9A9" d="M65 0h59v20H65z"/> + <path fill="#C0C0C0" d="M65 0h59v20H65z"/> <path fill="url(#b)" d="M0 0h124v20H0z"/> </g> <g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11"> diff --git a/.docs/images/maintainability.svg b/.docs/images/maintainability.svg new file mode 100644 index 0000000000..4d684e6d3d --- /dev/null +++ b/.docs/images/maintainability.svg @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg xmlns="http://www.w3.org/2000/svg" width="158" height="20"> + <linearGradient id="b" x2="0" y2="100%"> + <stop offset="0" stop-color="#bbb" stop-opacity=".1"/> + <stop offset="1" stop-opacity=".1"/> + </linearGradient> + <mask id="anybadge_1"> + <rect width="158" height="20" rx="3" fill="#fff"/> + </mask> + <g mask="url(#anybadge_1)"> + <path fill="#555" d="M0 0h99v20H0z"/> + <path fill="#C0C0C0" d="M99 0h59v20H99z"/> + <path fill="url(#b)" d="M0 0h158v20H0z"/> + </g> + <g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11"> + <text x="50.5" y="15" fill="#010101" fill-opacity=".3">maintainability</text> + <text x="49.5" y="14">maintainability</text> + </g> + <g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11"> + <text x="129.5" y="15" fill="#010101" fill-opacity=".3">unknown</text> + <text x="128.5" y="14">unknown</text> + </g> +</svg> + diff --git a/.docs/images/pipeline.svg b/.docs/images/pipeline.svg index 17f9499891..d458c77061 100644 --- a/.docs/images/pipeline.svg +++ b/.docs/images/pipeline.svg @@ -9,7 +9,7 @@ </mask> <g mask="url(#anybadge_1)"> <path fill="#555" d="M0 0h57v20H0z"/> - <path fill="#A9A9A9" d="M57 0h59v20H57z"/> + <path fill="#C0C0C0" d="M57 0h59v20H57z"/> <path fill="url(#b)" d="M0 0h116v20H0z"/> </g> <g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11"> diff --git a/.docs/images/security.svg b/.docs/images/security.svg new file mode 100644 index 0000000000..2772393142 --- /dev/null +++ b/.docs/images/security.svg @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg xmlns="http://www.w3.org/2000/svg" width="119" height="20"> + <linearGradient id="b" x2="0" y2="100%"> + <stop offset="0" stop-color="#bbb" stop-opacity=".1"/> + <stop offset="1" stop-opacity=".1"/> + </linearGradient> + <mask id="anybadge_1"> + <rect width="119" height="20" rx="3" fill="#fff"/> + </mask> + <g mask="url(#anybadge_1)"> + <path fill="#555" d="M0 0h60v20H0z"/> + <path fill="#C0C0C0" d="M60 0h59v20H60z"/> + <path fill="url(#b)" d="M0 0h119v20H0z"/> + </g> + <g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11"> + <text x="31.0" y="15" fill="#010101" fill-opacity=".3">security</text> + <text x="30.0" y="14">security</text> + </g> + <g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11"> + <text x="90.5" y="15" fill="#010101" fill-opacity=".3">unknown</text> + <text x="89.5" y="14">unknown</text> + </g> +</svg> + diff --git a/.docs/index.md b/.docs/index.md index 351edbf441..f4cfbcb329 100644 --- a/.docs/index.md +++ b/.docs/index.md @@ -11,6 +11,8 @@ author: Martin Weise [](https://hub.docker.com/u/dbrepo){ tabindex=-1 } [](https://artifacthub.io/packages/helm/dbrepo/dbrepo){ tabindex=-1 } [](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services){ tabindex=-1 } + + Documentation for version: [v1.5.0](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/releases). diff --git a/.gitignore b/.gitignore index ed77b2683e..ed455a707a 100644 --- a/.gitignore +++ b/.gitignore @@ -61,7 +61,7 @@ ready *.p12 # Environment -.env +.docker/.env # X509 root.crt diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0a9c58518d..ba28ae50d6 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -360,9 +360,10 @@ docs-registry: refs: - /^release-.*/ before_script: + - "pip install pipenv" + - "pipenv install --dev --system --deploy" - "apt-get update && apt-get install -y sed" script: - - pip install -r ./requirements.txt - python3 .docs/docker/release.py release-images: @@ -414,9 +415,9 @@ release-docs: refs: - /^release-.*/ before_script: - - "apk add --update alpine-sdk bash sed wget openssh jq curl" + - "apk add --no-cache alpine-sdk bash sed wget openssh jq curl" - "pip install pipenv" - - "pip install -r ./requirements.txt" + - "pipenv install --dev --system --deploy" - "mkdir -p ./final/${DOC_VERSION}/rest" script: - "make gen-lib-doc gen-docs-doc package-config" diff --git a/.gitlab/gen-badge.sh b/.gitlab/gen-badge.sh index 5ef15a3b6c..154b22d62d 100644 --- a/.gitlab/gen-badge.sh +++ b/.gitlab/gen-badge.sh @@ -1,11 +1,14 @@ #!/bin/bash GITLAB_URL="https://gitlab.phaidra.org" # if we reached this script, all the tests have passed -anybadge --label pipeline --value "passed" failed=red passed=green canceled=darkgray > "./final/${APP_VERSION}/images/pipeline.svg" +anybadge --label pipeline --value "passed" failed=red passed=green canceled=darkgray > "./final/${DOC_VERSION}/images/pipeline.svg" PIPELINE_COVERAGE=$(curl -fsSL -H "PRIVATE-TOKEN: ${CI_TOKEN}" "${GITLAB_URL}/api/v4/projects/450/pipelines/latest?ref=${CI_COMMIT_BRANCH}" | jq --raw-output .coverage) echo "[INFO] pipeline coverage: ${PIPELINE_COVERAGE}" if [ "${PIPELINE_COVERAGE}" != "null" ]; then - anybadge --label coverage --value "${PIPELINE_COVERAGE}" coverage > "./final/${APP_VERSION}/images/coverage.svg" + anybadge --label coverage --value "${PIPELINE_COVERAGE}" coverage > "./final/${DOC_VERSION}/images/coverage.svg" else echo "[WARNING] Skipping badge generation, displaying default badge text: unknown" fi +curl "${SONARQUBE_URL}/api/project_badges/measure?project=fair-data-austria-db-repository_fda-services_a57fa043-ab99-4cdd-a721-162d9a916d77&metric=sqale_rating&token=${CI_SONAR_TOKEN}" > "./final/${DOC_VERSION}/images/maintainability.svg" +curl "${SONARQUBE_URL}/api/project_badges/measure?project=fair-data-austria-db-repository_fda-services_a57fa043-ab99-4cdd-a721-162d9a916d77&metric=security_rating&token=${CI_SONAR_TOKEN}" > "./final/${DOC_VERSION}/images/security.svg" +echo "[INFO] retrieved SonarQube badges" \ No newline at end of file diff --git a/README.md b/README.md index afe792821c..9531fc8867 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,10 @@ - - - - - - - - - +[](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services) +[](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services) +[](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services) +[](https://pypi.org/project/dbrepo/) +[](https://hub.docker.com/u/dbrepo) +[](https://artifacthub.io/packages/helm/dbrepo/dbrepo) +[](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services) <img src="./dbrepo-ui/public/logo.png" width="200" alt="DBRepo — Repository for Data in Databases" /> diff --git a/dbrepo-analyse-service/api/dto.py b/dbrepo-analyse-service/api/dto.py index 319b06efa2..59a387f5be 100644 --- a/dbrepo-analyse-service/api/dto.py +++ b/dbrepo-analyse-service/api/dto.py @@ -44,7 +44,6 @@ class ColumnAnalysisDto(BaseModel): null_allowed: bool size: Optional[int] = None d: Optional[int] = None - dfid: Optional[int] = None enums: Optional[list] = None sets: Optional[list] = None diff --git a/dbrepo-analyse-service/determine_dt.py b/dbrepo-analyse-service/determine_dt.py index 0358929165..dfc5fe17dd 100644 --- a/dbrepo-analyse-service/determine_dt.py +++ b/dbrepo-analyse-service/determine_dt.py @@ -74,6 +74,8 @@ def determine_datatypes(filename, enum=False, enum_tol=0.0001, separator=',') -> if pandas.to_numeric(df[name], errors='coerce').notnull().all(): logging.debug(f"mapped column {name} from float64 to decimal") col.type = DataTypeDto.DECIMAL + col.size = 40 + col.d = 20 else: logging.debug(f"mapped column {name} from float64 to text") col.type = DataTypeDto.TEXT diff --git a/dbrepo-analyse-service/test/test_determine_dt.py b/dbrepo-analyse-service/test/test_determine_dt.py index 4be9e331d6..a6e032384b 100644 --- a/dbrepo-analyse-service/test/test_determine_dt.py +++ b/dbrepo-analyse-service/test/test_determine_dt.py @@ -36,6 +36,8 @@ class DetermineDatatypesTest(unittest.TestCase): }, "Wert": { "type": "decimal", + "size": 40, + "d": 20, "null_allowed": False, }, "Status": { @@ -81,6 +83,8 @@ class DetermineDatatypesTest(unittest.TestCase): }, "Wert": { "type": "decimal", + "size": 40, + "d": 20, "null_allowed": False, }, "Status": { @@ -125,6 +129,8 @@ class DetermineDatatypesTest(unittest.TestCase): }, "Wert": { "type": "decimal", + "size": 40, + "d": 20, "null_allowed": False, }, "Status": { @@ -149,6 +155,8 @@ class DetermineDatatypesTest(unittest.TestCase): }, "float": { "type": "decimal", + "size": 40, + "d": 20, "null_allowed": False, }, "string": { diff --git a/dbrepo-ui/bun.lockb b/dbrepo-ui/bun.lockb index 20aecae3f32b90faac1b0e97a01889f10f5c9aa7..b82e45d505fdc0e1f41e246f7d1caefe3e23007c 100755 GIT binary patch delta 55004 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 delta 67495 zcmcb!M7;T$!~{Lfb$e#6So=Bbf9`g_btgm5p39sk=jhgI&oMzXM`ubvqj#|u8v_Wu zm>4e4bmGp$3Wa(eCI$up28M=0CI$w628M<^j0_Ci3=9nkObiTy3=9p)#l<C+1*r@_ z7#SEu7#JFkFhj&oGeYP@76t|(28M>KEDQ|13=9n?pmb_pNoGlAYVmF;|2b5BL4I*b za&a+31sekc7Xw3mLtbKDer5^-gDD#W0}lg3gA+RggERv}gE=F_L01^S3LCz%GcZUn zFf=GKGBAiSFf^2vrt0RVmL%$NGB9v5Ff@ok9iE(#SX82yRs53^;vil|h<sv2W_~dP z1H)x5h=-4IF);8k)H5{f;esgG$qlh6H#0X?HzkQ-6*t5IwLBn&3=N6Jm3hh8nI#O2 z5Q8W2Li9c1h48QOLew?$LiC;BgM?&JYDrNg0|UceD8B?MpAFI<!@$sx1Y$5SG=xA6 zm?i)*@TUO8rAdO2kO>ro1o=||NK|+TLFhG5x>10EL6m`^!IKwa@#o2fO!A8Cq6`ee z3=9niL?F6z^YcMTfML4`#QA?GZ)6hBd?^O8BSakH33qXb8!{4$^UL!X7+ym8|HUC@ ze-nr3wu929P`XYMV%uj)NNnXuLXt;%enASz+WV6YnZ+3sCwnr>2ZhQ(%vvc2v0FzD z;vY#lh#9465SOw+`Khvy2&zoX%>kKJnpcohnx2^_p~%1>&cM*XsW^ETvs~aTC5Y2x zlptQoEY?lW$xmVkSB7ZkgNi>?h6D(+62uuvMTyC&#S9GVR3PfUs6h0)P1a=5xAc;Q zn3|lQmzI=Y!4Rzg;b#@+=b17vFa$yQ7u6xUb5o1bQ;irH4o;rPB3|F60r8TzCd8}L zH6dwaqdFvtofIH+VsVKsD2W*;K!WYH7DQZD0iwSsKPRWOfPvw%E(3!s14F}hT?Pgj z28M=NP=2E>1A`<e*XlAb$T2W9*y}PdsDN^rye<QS0s}(>BUIv^4g-TS14F|e9R>y^ z28M>YIt&c*3=9o*P&z>eVt^x*uc`yFh)V~OJ7;M_(ube|#6x)|5Oab}Ao7kT5D$Ej z1<~9L4f@dVn=pAJt9qoFIV9}0%^_j`*MfmTk%6IMr6t7L>6RdE3=Q3u5aXX&K{9=6 zadKi#VoK^wD~R<+tsqHerxiq9(_}+7@%nof5YJq*WnfTaU})HC3o(7BEyNS;7Ld?y zwugjbhCRg56;SbI77*9naDarqmLnvtlQR-?vKbf{RyjgaMn+<>Zdy)aIxOMNcLe*! zsNs+k#Cd|wki;;}0%FhxXGru&xIj|uOlJsvc=As+b;mkeh%-)FK=Sc+3rHYjSwO5y zPt5}rK@6pNnYjh|MI|d`A-2GrcVcoPd%EODFNkPyPGWHe0|UbgFNovMPJYNP&v<z< zBZoTU*2$V2?uM`YA&Kg)KSakxe@Gw}B$j08W~Wvjh4Ntq*{;b8Im8tY20{XFN)SXB zO!WqTh+mT?-{g?5FY|>2VNtRrD62B0nL+F-%PdI+36!K36{i+4Fc^nH{5UBLqFXi$ z64Awp#h}8PAwC@9`qbj2(#)I`hNY2^5bKYGsH=q1$xzxCLf1D~L_z{lB@&WC1fcYv z2nhcLl)eI`4?yWPP<jTGZjFFAya-CiLunr<Z509WfCiKn1Jm^k4J=>=L&K+Vh=TM` zh!0&uAvwh$6ym_-L`ahVk_d_YXNi#5mWIl+Btt^LJsA@2tCJz-%uR-<;|+z-%uw^U zrZ6yY<uEWbz@js)SU0tzq$m*-@SqA7RAQxN=A^<Z09>gWnwl{Z^Y;))GP#ouaaio+ zhg|aYu4a$|zcR5X9TamHG9jue4K4CO5q<>9pOFQLz}_ryUTN5z2}vkRG9lhe&dDsz zWME)m&4HK>OBneDsbF(5i*?J3a~K$oK;^gOfU{P8LxwTP8U}`<#FWemV+Mu|xsY&4 zF3K-1E-z-VfEGYzW)O?C%^(i2$OjwHP?A`Xn3R*s0844Gh=nBpSVDqDG%P{=%Lk>z zdWHsA3W1~mh6Y$lgC$j1ii0I#Ski^1C|F8_B^+3age7fQii4$WSV{#a`4k3*23V4X zrMTqcVo>9XLAV^`LWTyWDo7L+RY9WQeibx?ii=Z=lNlJkRYIbyxGWu9@v_%Ia`@kB zNQ#>@`5}+EVn+>x7hDU`?Fyxni;H#3GZIU-PnP7>uU}sc$!2#eAtm1NN{AblH$X!D zAC&&k05N4FRDOOr#LlUekfOSw5|T^Oq2{<&LUNC8CB!fMmC)Q%0m(gAD!}zzeZ%ew zh{cO5APV~`AO@8|`N{b?`9&!V3^5f93{s#*Qw1cS8&^Oay0RVOO-ZOc3snEBa)|m% z<q&iCKm&J8IV2fPE(Zl-Jwrn+RD!D<l8}>gQWJ|97#QTuKnfTdBDx{z(6<{BBAjLr ziz9m=4pr=h_-uC%#6no*^}h!a0>x$Nx+RI}#ou}$=D&r~S9=&3B<dL$8qA>z!zVB> zXfZG}q)udDFk)b6u$;)ipu@n>AUqLLJ4#J}SoD1YB*-l$Kx)tLrjUZ`p((^+k7Xe_ z^@uFQ;bl`HKF-Vo<yQuVb5kMW`Dv*o^~o6w44}jZYT3iGYUWf(+@@!i=z<zC<<lW9 z-!&Z))C@Bq{LEtAVo=o;Jr$BRk~4KP^V0Gew#h>He`i8MsGul6x1gk$Ve>4A{_LF8 zQcwuz&SIE+m|s*9R<FTorj*RIG*B7wdh$npal=b9AqgZKln^qDOJ2_fr<{hPb0NX9 zWG<x9FnvBGIQCDr6p*jqw*X=ndU3RIAtd=gi=&1`3n77Ve-R`QuPlPZa`j?}cskS% z`ZFP^Ve3qYxoej|Ts3nEB>$|K2??_WOTqf<8zw_FS}%hHMkiEbT25j~Noop14OBzi zOh{lRWfm1AGcYjt&V<CC&<cpbMQJG@VFvaUV1pa}Er+O=S_!cbRL*83mN4XImXv@3 z&3Y!tBlQdo;;SG&m;-Hnw8}yZD9y`AO-x~65MB*&7%P;nf(SF@L)BG5=@@8voS9#g znvz+}ptKI+FtK%z5aEK-Kh}aQW@vc1mVtpE)YeT&%_}TTWnj3u7Lxu>tcCcjY4S%w z`Fe(pkbwNW0pgFB8zB75Vl$JZ%o2w5O^}GXx&dOHz-EZQ6XYP?db9-+?T5BNlEdOH zkmzrL(rH^Dxy5q}r0uA?1(Iuowtx$u`iAeD!HkBxn<4r3FqB@k84|N|HbcT^;$}#= z1w+HZ5lWZll_wVGGBAYghJ?d|-4J!xcS9UnkXTflT3VD-oSFyjQ9arNQFnb0NS!i6 zLu#sST4qsk$r-Q!L&Jx?5Cz30i6y1Qsl|^b8w&f^yY7aBnkCd4_1%zQhP7=y4uXth zXeiA~$xO~<VBk6g2_I1J7?d6|N=gbUK!q>VSt+FjIjI$?MX>4<R?ER^KUi%Ct<CBi zz||H5!vHnZlo=Xe^)#%$g;kp=`6apqMfnAHCNC6Gm#jGrNk8GIA^z7m1Bt$>$qz-; z>yytyB1Pg1BrU3(gM{j#(-8jgbC9r4E=txlHez6~Jq^*Flb-@^ozFOr!}K$d&`-Mn zNu`;^iA6<;l?+iAAm)KPv<wXO3`UnA3Uf2_G7A!mi)AiB3TyOMqwpn&LtkEoIPA`4 zNcMm=vrt-(pkW?pbM4Yqh=XCxHCUsN`4Y&SdWMD~X!sPD6s0ESRxnguhd3zjI>e<( zCW)Zr!jN(u;!~CD5Qn6lhRDMl>J8<CM_Cvc7=)q8p63>%vGU_4BqUzkf`qX1Z3YG| zP;mguNB3?)EMUF^p*<%r6jSG{y9;tBLqqZ8i(=}Y4EG_1eYgh^g+=Pt`w&Mxxd(An zdSYohsGIWW0VI^JLg`ZvAf7ug*->1+9@Z&;brTXs_ijRTU%3f!K~iR3N@iYqvFa0u zZA{QC_jVVg{wmJRPXdJv&r^ukwmpTIerXq^1Sv`_&d(`JWqAJ#QUpDH1~K>gGq8R2 z4W-W@&Q5s-36shfkTe<wQP8k|7o@CP1+{SUE{ONPyo5Lunu-`+zl4}mzYF3JSl2Ok z7o<$6dkrZQMczOh&iDpoE;B<z;N(OJ`T7?O5O?2$j?|?jmZa*Y<rSZVitl28ILqlh z#F@nznc1Kw!^QWI(A9enu~zOqB%ILYpMHRtpZF2tY?k*>`V%-j>KmSYglO#j1hL@u zCy2Wrzk|3p_6x*-(!6}o&?7_PH;9AEQ<Dl3ld~Cqe24gd+IMikHaz|g(Rckj#3KEl z5IQld3>04sXMaM9_MJaL4rgX)ST(s(QoLUFC&b!IKOok@iqdmX;}3p^_;<;7NY&8= zHQw|u*dGl#e<99*@vFZ>oSFF@Vy^#ph_!bALBY?^p!px-%&Y&w`s*8n|3fl=Gy@}e zEcU}c$RN+fe~<*E3N>gJBO`e9h?|L#K?BrM{0?c$1~W5)hhA-%8NmZ;s!;kl6C-$( ziJ6%ZJXj?39pV62R){@^KZC-jo}pp?H%I`M=7EOEGSfA_K@yJ4H;@8`hJRlnm1ihB zBY4pGH5<f$TWpNr!DcyVWpec^1A`_5L&J3rM(~)gBPYb6GG8DexaBLv+=*Wy9<2My zz#t52^KyQHxQyv5c-*TY?JLA*AzvXuX#EvZ39EgD1l`xqpcn)Vy)rWJF)%c2;Dylh zcp(l<%gjpwwN>l+7{R0BB~ZFRHzz+iu_U!XHzzYUvxK39pOK*+G;E$)kqYY2GoX*H z<maW9Wag$a<Ywk(ChMl<-Tn-T%g<jRar^?BM2`tFf=9D&Lwy?j1st~xo>00ZF)0bu zO||_32~mAvM)2_ck9Q39;NkO=!i?Z?`rX11pJ;x8`0zY9ju;x&Lw!8|GbGRSe1?Qr z1yo$%JtPX(FhJ;q&`g|JPytT+6_9Zmh9q%_Lt%ro#ToU9MFk8D46+gs7YRx*f*n+n zSfra)%)kJvD2gN@;;E95xK9F)<uWiNm8PYEMuZAVb3w*1OqYOoAUPwyJg<m>fn9<T zG-1#XE)CJ=BFzXM*Zv|6QCCzCZqG6>)XG34KviOHW^qZ83?%OI@>5cE6O%HFQ*+Be z7A=K3v_%4<zEpw{JOcu2purq2Di85#Qesi6ZhkQXm`*EZI3f=*7gqDtgS(Ur3=Cxo z5FZ{=fVfOV5u#91oDtmB%+CPV{S5FSQCUb_!p8Mr<JyVI`9+{H57^LiZcYwp9)SUr zw?ISCuo)9*JtWwWnVy$ll*+)6Y-j|ItH~KM3iUHpA-0#KWTvMUmoOw{=9LtsrWUuU zLcIM_4U)O9szDOYVKqq7pQ#23@5O46VA-Sw$)nz&${8~MQj(cg$xsR!0Ayfb_^!bS zo|kcAfRtj24B$Lk-{7PLDOE%nAl~%QhLk>f+K}J?P2^-6TI4O%fmqC=4YBaM4kLIh z+f;`UJgvd12a!+KgE;(?E`&}kE+|S(WnggAhs4uMT?h>l&&;h)WJoP8Ey>I&W{}o~ zXeh}q&Mz%WPW`6^iJ#9}kPupC2uWF)#k!!@ZE<mFa#3P&D#H{bNXQgqf(Frw8FH(@ zq05kF4AEDTk(vhziD)Rl*$5I+-~qPHymGIl>*vIM+`5KyeO~tAJ5Tx6ZRdN{v?3^O z@BG^$8sC#P%65n`J$>{oa(nf^YxkF*>H9zX=blCTwWm#fY9pik`P>r2u#9&n+%lyX zWSsDx+IHtG<JF^G3F;x=ubJ?vGcIwf+G_XdsFv^9^EWlyk9xZFXjC2SciVK3wQ1JY z#C=?Wu}a$d^?&V;UN3ZD)?LJNZCc4?gS+?7JeDyJVfGf}E$nladffA4_n*~*_9jcx z-ygWsyiE4>1pl=c%ims?G@W^O%C^9^X9iwr#o|%XiSNQJjGj1auj3N+d>Y0(N#$|E zBflJb{+Onlt#%vMt7rAgd~dxJ!}+I5;>ABb@BY$b5Qo=ioS4)n<><0;-ugdlnkJsv z>Jk6v<-OcJU96WUEm;wC^k@9H-7%9Q8}4&3&bh159=M5h%`Vo3OIS`W-^eZ!FH-%| zY5ljnX-y(r%akLSX5LiGl=Jb*_foC8&D5H-CMGdi{+4^4%E>*}3}FxUX-+@8g7=bJ zws>Wj=%EdIH^29%?6O|)<YS7+8t!dAF8{>#tKAaf)>V)?6#r<7hGEULZQhGH%#VCO zeBI?u<MV2jS3$>4-bh`Rb@lJ;yGPVp{3idftdLOnbzv&M6K{e``@5rFrJ=z)o$Pt5 z676g@Pq2z$WOSSS(%PPJ&SXs+dsZ1H1_qbOx;ECV4NMFSPGHs{CI$v8FzXK!1A`lg z#ppCS)7GA~f|-HA2gGN+$_$lZm1cplidh&KJV3IHk0!6Qvu9M9{L;>zF>SJ@y*=aR z$(i={tnXQ&Y8f3TzqGe!Y?`d;V9$7Fa;Ael69fC?RStHXvFr>CL7<tR$%gjkjO!<B zI@&YxPR?|+XY`u9($SuA(d3to_Ke>qYdYC8norJjvga)1WMHskU}#{ST<B!ZcyRJd zCwnF~uE|=?c8m^_Go9@@ySN}DNsN;}TAMRIp8V3;o>6DAri(pi0XGAK6$3*9%jCjf zbH>AySGw3UG4M=&<zmNZK3UV%p0k^Wfx!jrn!;dn&htDB3>FLw4GfbFoy<Aec^Md- zz?uzR%o%4-)^xMy{0J3e1R2O_%m>lUH2LF73l2U81~;(skB;VymnUnw+cOGI&UCkD zbeX);-JY>|@=JGn#*>pZJ?uG|1t9KXnr!G`&S*P%rH4K1VgYdc*jqDk3QpGYwByVZ zWMFV$U}#_lDdJow$iUzQHh!arIpdGXFFoxUV<u~Q*>fHcVqgda%M`ksa|#MW!k20C zM|X41WMN3yF;4#IXwJDyn1R8WfuVtavZ1p%W5eW3Z+pgzlUI7%GfGW<>21&HDayd$ z2M>+uq7WM)etjs)z@P^Xn?h%EM*hh!ee5~C#30__0Eb447$o!{p4u~crLR5X*U2w^ z?HQ9MYx>!9E*FP{C*x#8M{`y#2?hp}$#3nfIqf9i;)^XfBw!BS=wZ&ePXb~A<79}Z zSNhv?8cD*$4BgEcCr;K3u;=8KVqk~>JN%=aIcKsI1A`BkR~T&0x?YNb!C<nkgEiy* z$(n)ojQW!^1ML}aPhJ^l&uBRLWuQH0nGD3?%#%O9w&0LqU@!xRrr}R8#}FI^8-2|g z^C!OyvIk981%nc3X0Sb{n>-}Im?ndg$dt)1gY6j)P1X#t=S)#xV6cH0<7CdbVDick zd&UcsUxt9}*9^61Y@M7LYR`FE5oWWYr#Yk6<d>oLoJmSZVw{VWAiiY+C4SDkN{|G{ z3=VKbWtdY7?^|#vLo9^E`&?y+La@U)KPf|El4<fre{)V76-W@Xg3<(Ql?o^x)_PcT z?off4zz$A1OsWtQSiz~!UlrmEcCf{rsxT*Rykfzj%D`aEz|g=kxzOF5^{*-egVE%* z{??rOYVcg?XwH~8Su@I>bD|o=7{<wkw&t9t)gbO?m|PfW&dI0_kz)WA44kg&5Zz3Z z3q#F0%b{}2poGhLTOHz1mdT(LAU^qJv^}HuWX%|R#<`O-V?g1&GRB^XO>^?A7(3Q* zO$G*s$!qPbIhScdGAJX+NX9plSH{{iYEOO{YtL9bSu@U_an<C^ID1weZEztMYRws< z4N=buj@+x0HRJ7BKj<<rL{HX@w`TR$V_=A!oSR_7q6ZWDugAa;43-SiXJCj0v)1b~ zFl2&R5(W$miC|Wx0ZjIq0RuxiSj^Utfgu&lT4cz;5D#WC8o^izMlc<F;bJnzAP0b) zQfkb=5DwD8dB&K5!5W<MH^!Q?vYUX)`CNNz)(IvI3~7@=tZya^3=tp}r=KY#moR~& zbe1UtgF7sxb5@!$Fqp!5>&zggGEWBOg0GV^Q|(#Z%^4W<K*7q`F!^PwJ?BPq1_lEL zh6c9DhJog+56wZf4#+-L3kC)YkbSIjmJAFjVAgR<28K8=OVtWgU*y_bGiFa-nQqVe z$BKa=WU{V{HEX0bNZ(sWYsQI_Gc)WNuS{N<Vb7>G`DKPZXRZw-rLck%>T(-MDq;rn zUfD1(n1J0;=w!|+XUo8l0JiCmEdxUyn3ZM60CmSXI|hcR$+|f<EcT!@0&?yGdj^IW zu(Ch)(12nMae&EAae#U2g#)Ot&b7DZG<JkI23*Ck<~o9sf9?w#4o7(Qu{Y=Z;|R+z zplZg%iGd*i7E6pRlUL^2GoGLPGS{9{+8L6v!TEzV+!<;K<H^Y@^XysmT^Ja=CWFGH za<XQ=J?9M<NCIV?yfN3DQ{5GwW1P)7BV8dja)WXu=R~L+%VfiRbI!xAkQo=I$sea! zu((3~$?5I}F%D8n^tvG>57wJ*3=DRlaA6dmyt2@qHN+hpJ=WHoJ?@aw8&cAobBBZm zCn!;|a(I9|04iI&JRr_t0B8Ir4|tS$nse@e%CS!V7;Mh^0VFp$H`E#w*~RvpF`jU5 zIhk|zc|xL>eX?PwIqM-$kSlautT}(dRekg|=hX3nr~<bbI1{`ec0&^S3@=F1=9>(v zD*kyvT+aZ?<D3rO5WB!Rp0&suoPC0=IoEhYA`B8Tf1s+Ez?G8TWX*DW#@NZ3<@TIY zeHa)#z!3|I=DR)+n*=6r3^C^v@`acUj#^F^1n-aqhcBdRWdq0K0bfY*%rx2Xr^RH= zN_$Q-KS*$alNe`?AIv)+9nD#nfOwO0gRNPg`GE`a7;8=`e~9<N9%l5Lyt2xkv(6u4 zJqNfr|LYH_x4`uXt9Jk>nsS4!IeP;jO%7IYMR7I&ViUw()<B3H*i=r}K!__@zya3` z<*|c;g!NS*C=-CHc9|fEtq?taL9he{3Z8{Qke~;<f%9<?#4boKmJWvG1Bh$GgCU6u zqH<y|BsADSNsRM&Fhn2Njg0>%Yu1Bm^~`#E&gu|Is4{`7InI?K5Fay4HjFao><@*M zR;-ghhMF_Jn4H;Q&*(aNWrIEIoG=Cko5^outvPRmK_Zi3vSFn;qr&9OMtjb(aEMD- zz+$^6zihN;-4n^c;5Yegqctm66sYwKVuit3i{PwxaF$gxI3G7!v$jNoDjSfFGjNtj z3`{Hr&RPOzy@9h#VqxlP;H)FDpz;)C9#<TU6#!>VgR}0$feJE^I)!)`D+SJ40cX8| zu{aG9ATh!`+0fOTF=w)7hdrlYBBZGaZWJ&!PF~qz&&r<!s<YO1SaaqjK}tYKJZ(xs zQp?Gk3<*c($sZ#vCco^o=iHhMF`ogPK0hWy^fH1osc8zF7i!K~nF3MC23ENr%7Zjh zey2dvC<|E5I+cOJl7XRtd-6s*bIyiTh#a_i%6T9al5W_*>Gww}#629~bZ?XfNwqBC zl#`MMv7H@k%8E3IK5%;De2@mq1)zqNTskC0gKc0<NC%}P-9T&3Iq49aSwO89#;21r z`|LS&GaxoHP6oC7(kH*{vuB((S+n1s^F#(DZ9-BzdnN-zB&74>Zq8Yl32AEyf_gff zcQP3m92poIM8P$mY!*ZxD=3CIeY0S8g4$2(vltk{!1XyO=dor(Tn%ZqJ7>chhacU| zS$nfV>1J)LHRt7QNGNcC!;&ut;$BExdrZ!pWY5`>1F?}~a$%}D=h+-ssRIga#$1Sc zCUBW%oeRlJkaD0omw`bSQcSv=bMDK9=!0}oKIK9}8&ap4<w5c~1Gvjjl?N)2L9K%= zc_3H5b+qREl?U+)IHfRpOwOEY&p9z4q6=&{<MGKar`ofM6oAwDRBP6V0<hkx)~xdi zz&U8DHS06DtX3gRtf&y2o2Oc{?kj}pU@3x`;!y-sH=zio?haf`r5Ic$Otoe$Du&7K zD~6j=0@LeL0yA#{T<k^(OovJ-Oh;BJxWt%h&AO!&ruR=NOr1v=Ol(3K)I82BWsopn zpS&@~oKv%$fgyx}p#j2^s)F>E*g-MN+F8ZG5H?x2$A+T{7WAN+(YhKEEs$iGUkyo4 zU@e?yt055&X^xB3K(Yh_ID`1qK(Z&e4&|I(14{;=-sn}RN=T2Aw-%z08Jq<ZYhn68 z9lyD?5Vt^T+=p-;DEX?^LG(egZfqUI21xdt4wVCUmq3lG1@@dA^$^#xPTm-6&S_B( z(G5u)1(R1UwC7w|52@c-z&`j{&%h7`4lIyu!40sWGjuTL+|&R`Zs1U1<!l7CigfL* zIo%r}?u8T?-Hk|kSnoH&s#nD(28IN<$&F3OMdIZqn5`gtbekC%K#S(U*^P5%Gc3YD zF8bKazyMlb1(6GFVPJ@Zo4L7#fguCVlWv8X3DQ^E3Nr;1zh_%vwu9`GZ-dE!RF=0v z;+|>p$6RyH)olz6pmpI8``Ftd6)8KoXbx?M`4nX4=5|ONLge1JBkS|-fY}GKVQvSq z+|Le}?I5=Vb|Ra(v=dTvKvLe@PDqi*1+M({x?n0d+L^O9b%BZpP@%A=3sQ73fSXV& zSJ`u>cSD*U4B#StZ8szqStb`cm~+1FhO~6SMLKI<4+DemWZeL3R{LI1RR&_s>jh;I zP&ehv<jghptp0uAZd-sg=e9mbYJ#NbcYTnw$PDhRYxF~SY@kYoHL0J0AqdohX5G>c z>x?x{U|=W%i%p-%z|b~%ZI%toBnE~mh|nZhkA-zItiO~z8PsC|byW6F2K8*#X4!B| zfuuZ0>Q0;j@e3=cYs|TJ3Z!TUw{97wC$HRK&)GH=5}x1`%y@UQ=0<x??rD(FffUby z(;%_WIJvOgoO2SC2Ql&3G>D(Tx;Yu9L&lT%z_H;x9ik7CP8y~|RB}u=lw-8um<~%B zpxEb}0g(e&l$_2pAo>`=qi*FhApT(lS8BUwK#DPN+;D!J0f{%p$s4Q8ITdF?{0iaK z&Vs090#`<RXF=>^1m$_wpR+&>Qcyocdp5-P;06L~@oZ2h_N}`$=fc^L6ay|rSTD~8 z=U69ePSH6Kb0Ce4z&Y@e#Lk?vaSkNZ!1gm9pPaefo>O8j#2m<&o!4AQ{sWJ+aB9zk zr4>UjbI#;>3=Bz-oEm4&dUPHvvW@4%x~JRbgQ6Ie>cl2z?zHD@SOBq|30$O~SO75% zViUtcNEm`+kkMpv<}Q2A!i5YBpusCHNDM$#KuX&m3n94}l5X7=K|%!*t9^?g{$d4H z-K-xMfvOo$=fHL`B=jLo{;tIkRgl=euo#lN89?2CMy1Iw_kc$y_u6wFTLKxKgv6)# zQphj^gcr9I-eB@FXIwp5bDuru%cT&LATIM<21yN&`0rf?i46vj%Q#OigTy!_xBXuR zF^gfc;Z=*tEBD(owoQJy-=1^las~!ha5#SqHRn`Y!NA}R<{9RjvlgxZ4Gq4Hw&q;8 zf`P%FfuVs9R3&mgSOH6);Ewf5h{?>Lw8WS>dF4TS&IKzWaRCYa3o9YMVh436IMr4` zLWTh}&cr%t6{s2b*3O#o+~k*s>{)eJGccG=etXE8HEA^igDsdfAI`e78kACX9j%%8 z)=YkN$d1VsOfl9>UU|fxbJALfk69;wj5g;qTL-DNAU*H4b&whw9EYsOKs?a!3@6)q zNG@TXY`DOJV?D%akcw``dRU?{bTQ{VvmTNN!0j+rkqrzCj$i{qH$X;zxF&yeGUuGX z0pbMkSUV@zMo1qET&%LXZUj00ZIKPfMo2s{g33YG%^N|vNjJcn^D9&w5}SsbAVz`H zEN9gwNQz{bY<Sm#V-v(JOdyZ4N^S-f?4WLb@McI71dDSrZ-rzb2rqRjq;iGuj&6li zix8gjHe_DoHb~_Ik-NJMl1U*v^X-tT2*T^%4rw<-cu!Gy);l1T4@9mXh4**|BoRa8 zOm{*OF*~@S)4LPm2k@9S>*<{!zr78%W)z?N@~k~;(r$1szRH?$+T_f0_MESGBdO-p z+yhCN;MOi@@*YSLzz9xuv-d!<JHzC{?dF{C_CS&Yq#dod7h(#;Jvn>f`rOSqm%!yf zqve10f(E;E9jrNR_CZuJO)h+3!Lkq3ump{w?tlw}8kQgSLGl4O4p|lUGccHe6HVBD zNIA$b88lnaF*);+J?F0duwf@q9q?>FL?^fd#42_GloNILS#!D_fUB}KXDvDaZur_+ zbM83+@emuRUSRw)S@ViLXYfHtz;c3Xj_C&>o@4=yF)?19{PK!Dr{p0923rP(2FR#* z*dd6WEZ`Ef?GPmSGfe&%W6rtj5F}_J<=K}*5YK}XHlxnu%xm_n$%jFW`rK>QtQ!x5 z%fxHetbgGw&m%Cgsc_cABOup<bZ8$1HPJz=VmNCzoW*<$ChHAnO@^~>!&%D5Vd}Dv zgSrMF^ESd+-{CCV6ENB46QFnlsXGp5ai4^V`NLV0VJyz;Cm}xP0JZNJ`6sWuW6$Yz z3YN_c1I;<-pMr!N2RJ!jJ_U(s$dD21X^3t}Ypv}xq#S_Mo|jI;3ZFt}b5^r6AXk7U z3R=%V;tgEiFdm-#@}52C?=uiPm_cnPPW`hG9vf(Qi8JRcq}%`}ZPrC+K^bVRqc!K9 zvyegqTmo{Mo`bY~AOi#S=OA)yAYXA_J_k!npd_zw9+c%k<x|LcNP1!gsbX9-dF4ZU z&Ku_;eqfwjxXgm%0>leUlMOeTb5>n|C<j$$U@6EfC1|GY&jondTxY>?5$0e}!f(0= zu^gQLIWJv=<XSG!AR(*mB?boj$-3p%oYOAB0up50xl53;22v?1U4|r8PEdu!8FLx# zCI@rQMNm0raB2PXGNkHanEWxsoYVRWL?1Y6IUm4zpweIJD#V-YlMUxva6mbbc$;(; z;$TQC=D}5nry;#Pm1~f=<D6_5V9uEY<$(t>Sr=RbrPj5%)|@Y{K@4XGPxR<sXJ9Y~ z=SfgO)p{Lb0;Jt`_&UTc#_1nf7%doYOn&vkj>+)GWGx3f&fFUi=QDzaQ8<_1fT{%L zcFyNeIo8RB_2!(4H{o)@psA<KSN5E9Z$fNkm~0qq&Zs>3<tuyEskayyJSXdRSabfo zg`8S^Z$sP*NiChX;Vyh^!2y+Gn*7nzoR#+usB#B2j-v0ts@cLt794jV<qQKjy<Wcq ziAv_lAD>!q+=V1%W>6C2biNBw$PR8Q^xXvo7^v*Mb{AqLIKEj$?tzB6-}+i}`rL!) zhLrye_aM3<4d)F|IdFn!6~7PavViK$-20HE4=$oP_uYr27G}@@Iw#8mSdfBJrriTb zut8MTJ%D6vuuECrKLAzYpr*3nLr9te4`j0zKLmAwbA4?%9zw#55nP%wJ%TtCY!s{G zBT(rM3Z_D+I4H}Qb1r=ZaSRK%J*WE^lCoGP8}2h_Eqn~Bh(LNaK8BbK85(~37!sO{ z;AukBClJqp1B$VBvgQ}i1Z?IPdrq^b@W8P*=S+JF$&Zj2J@^z7ypWdD|ECNL;ow>E z!cg#3?N@tFzUK@KX^<hRU~|rr=MWb#f_hbq8zyIdv*-N!94Y8n^<RKWdQe*LcmeSf zq~tpH0%8;6<icy_tUND4<+APq8;+N-<OUj&nDdf>!JmPlK@vQ2C;kc&3*h37GyE0A z8{op0wfz;Su+w$0;dlk{H)NEB^ED)@K<z3Ej@OV*851ZN8Rt)a`O}_L^9=)oCwTH6 zl-G;iK$=?Ma)9-~8_=9vZn-t9$XihL4GQwGw~$ha88myu*giS)w>{^cw-B!|fkrGj zf4zkS3CK!wPP2EANMQ!c<-LPtwT+JEoJ-$9^s$1nEo1QHmw)Uz=e>uFV=_)Q3^C`t z_Z}9Mh9Tyx5+4{C0w=%yW6hfR0hB%8{;_7<G+FbXJ?n=LVBi0<=G6KKv4I&}k>`Gd zjPrt1D(A9~knm##6-kVIlQaL@a|V5av|+)?j&<HAP{TX7-kS66CrGm&Jif@O^BIzd z!5uozj4u#(gXI{PO?}B|&)V>ffx&+2TSjZf+tV`{8SOb4e?XiLX;@kRfTUmsP_vb> ze!3<Tqdn){9}xF|69lXEPjIq!wq~rJ{t_hp{3on23W^%%UyyVPHi32WFHm~PwYBEF z`3sVtSU@Io^8SVdH)NE{b$TWXqdjN$Z-`%{Cxb%$)NhDWI6%!MPQE`dXBvi@b9(%N z<X{$X<=XWJ)`~84GUt5r2jW`D+^YRwSS*9ax2yj`Oo8az3YBA>ys^xJ<1ZxDGfv*P z!JO6nAE+&~HpZH<d3q*0qdjBb^p)(4_N){CGcdSJU(3#D&3XSnq)uc3#S*J110#bQ zSb{Z!fsw%m)P`hT!obLo01;$iWMqhdFk=`Q8SJL#vNKw<Zf9g<2!V(iGcht`L6~!y z7#X}E3i6m483G{8eawsu9uOuQ3!Lf4!pIN=5naH-$Pfo%{$pWeaG$K}Va*sc{UtY} zJ!?NJBZDO<+F4JqGBVhLSWK*J(^v5@+OgWPF)}1iU(3sA!@>qr^@EL(Ar_>HHJzQ2 z!4=F}!_LTH4Q4%OXJl{&u{gCj7{SYvz*8iwDIAOp#UOFk_Z*DSv7$^)MusBraL{c| zn0_%XMuudtx=JoahIBCN0T&~KJD8=;&B)+BeJwwu4GT9TLnc`4IyWOjAeg1W19ML< z4<kb`SnL1~BZK$!T#yc4Mh4I6x`K>0(=~+{?K$`HGJ=;AfJ<@CpS+CVo-_j}NwM1T zF*2BeCLTGv_!z<Kvmiym2`CTZCpLaY(DZ+>HK!dvBY0g6^JK$47A*XX40e-sPug(s zGlDk(LXz8ien#;6BZz&r0*v7GS4<!s90CySkVeQ>0Y>mbEvCtaJr*nij0~Y*pEwCJ zLb4}ozaS%nIY^B0{PavQMtfE+A!zV%x(YFZSLQH-E2>5)j~$e7Irj=d%w+=)1b-ER zL=P9Z^<*y$aSnvnD2yz3SC|pJIE!I=p%|k%r@9CvL?B92MIe%39_t$sXewb;ot`Pl zXwR5AeI<xmGW{ipdOBTGiqW1`LyQr$Y|q)6Ge->OTu@teg%~J2LH(rHVvOMRSdco* zSe%hTA5>pWFJxgf=gAg_L>y>g=wyQsoyiZZIXIVzLv(=iDDM?<M)0y7kP?N-hMwA! z6BcrENHBsYu-U=Gq+2Bz!3)qBz@_?E2}bbB3P@K<Qxf7VCU8jANkUYDt6|Q4l8}&M zoLu<DoRdL{5xl>X1>9ZGk%E}Q3Z92ekYWU{8iADD6Qmfyi}4u13jwZxR89uXpK(Y- z>;ezkai&PaP5)>Ck^-$*1E)4lCK-qU;4v;%HyK6-oyoc})|?Y$VCl-x!JPG;3^)v9 ztU1MGA@KzEAa95)BY3)ynSp`9eeyzUZE&dd%0e8>KKWyyIp;xHNC1HwV62>Sj0}F$ zA8unZ1}hDhV+5}N1TPHWoGS-$3}l+(p&Y~*=E<N13Ucz0)WZaByhg}F(l!$~y!zlg z&{~c2@(?G2i+W~W1;)wQ-nN`B3Xp8W0%|w%HYq?uAGFkYvZ0Ii<OMf5ITRq)Gk^<N zc|~xBbGBxURb&J$QgX3o-Jr<GU<3}}M~aNl<vxaf=A7b6ki^40+0f6NHAsn(!E*B2 zJJ!72AQmW%ftKQft$AS0!Fxmrl8!hS7#Mirq4r$~;z39w#!wj&&EP>J=0s)2$*+rT zd8aEwA`+AW<t7)pL&E!}G9(Zo8C_ll5^Uhc18=YjG?jxk0ZiU#2iC#Vq%!@L6r&yI z4i!f55+>Hk8yA{${#SuyWpMsrHCJV1@Sm*fWX-uml@U792b!jQtO^Nwa6g|@QVpU9 z9J`!>YLK{QnEdgIIVY<+BX|l8lHeoN8No|<7{Hb7N_9vCFn}x6m+Fw@$_VO$v8rk? zGPr^2GtO)cSX6GDV!@#SOOhKs%$ayKr)$YG+HtyQLgE!NFkYs~2p+72q^E<Lkf30j z{PB=E=T}We247HQfSS&%v097_ag#yK&)r%OFK~c|-cq$086v=zKhkDo2nNppZ`^9Z zp#w?joRc@+G3VT@14$_mo`5dIl@OkvE+crgE`+y0ml52IWC#0NT#pg9%rexRvrG@- zA#lf&^$3Uu4sRiSh_g8-e~dNf^w)=^3vhgLo`dq3CVwoo;4pwh1tgbeLwOLtFEoH8 z3h?wA(^rG(t5g{6SWOK<O@&-{YtBMLNCJke9o%dPu>|7iw}y}q0as5<K1S1DsWRFz ztuUIdrN(H-`O^qyD=1&;8$-$}aPN+@&=?XF;2|o`-Nq1=;NfQ0k03e7I!6;o@eW?r z%2a7G{gpbSRlO1ecw0OJ3j=ujHUsFOD;)*~FyDZI0d!~+XmB2s_Q5n01Gq&D=7Ua- z02M-J3=9k)aSJGI1v-a<0o=+1tFs4_So!s!T|1znoB?DIXpaO)Ei%o>0B-Dpgh8<g zR_71qfjc8$7Kjg07XWo|AXpSUo)30dFjPDQDh{GS4h{ot+X7h}36(&mnWy_|GK$xO z%#DLeBh%~*3=FAI52r)rk!g^zSx|9OXpp-=TYErs9%!p7hymW&!@$6ROoJR&2=y3f z`##7nY&6IrrO+4!?SlcCR}E6kz`#J5hHef*RtU1V25Mjf)F2Se%D}+T3UyE$R2&}- zQs2$Mz`!<ruNI@YCCJz*3=H51o(@exbD#k{4{98U2C175wPpbW1B1<US#3sfPmqec zP+`!HN)R7J^D!_myn!0?4kXCHzyP8_3H}q5k4$q+uhnLhpFTyKQGt<R`dV#9d2kY7 z1X&9*o)MDPnW21aG{|UnMu<<ipz1(0DCBvdd=L!^070mE!ccJ#4N@n{2+4b5j12W) zSAx!I14&3gB_yF5kZF*-G}J&@Mg|5@8dZU+S7n4`YE4G)mOch+sD8pU#C{SqfZa=y zdQcj*gE|O<28BPUm`Z>grN>ah2;LCI&;a#eJ5(b+nxBDzVHzU?11QL6L)9bGpeUOU zjj}~hc^F*}V<6KYHH$$60|Nsx4JtoZLW6u2lwJ*ulC_NBO^FQKq2fEB;=7<0?}hUB zL!;_2#Qb^&5CarM$DkUILnIiGX^_wfsQgI~hk=0sM1y>G7HaT$s5poQnRf}w$3}ys zE`tbAdmY38C9bPbgRX-m7#Kh_Nc<+052AUe|J8$*n=hck#LysjzJaPIh6V-nC#ZTX zG$hd?OYkx<F#LyxG!w|tph5u)4Qe2AF)@H^LIEa7E);~)LQwS}8pIR<5ey6rm^3%U z04XL02F~fa28`mMe8->yRgaAZMTk1cp6R6qjPjhIOr!}?KE2fdS_Wx@xC{&oAR5Hf zWdiR@XK-NxZ=7cEXM$w$U?xZz6$(<sz`y{aLCkO_NSPD`;xI5UfM{_B1_sa>mLTi! z(2(H7qX49z7=y@E2Rc5EIG2K3EJe@|D1rJEnFfV(IVhYN7#J#`>Z+jX!1Q!pBWQh6 z4OLbH4Y+!!G7t@7Hi8HS1_lrfVm3q7w}3bd3=ANeaeA&1G&{6Ig+Vl^AnJkgK{SXz z5y}VAApSHaND)34DvnHpe6av3j*kYZTg=2@1g=(>K{bGAki<%;dsjilk!h~!w#HC* zZ-q)D)1d6S6B>HEq4FSF0(4X;lz*9W8j|j)U=TRnkzx)ge6BIogHHfp_zLyucPRZ6 z>N8{-qye-~5mf0igE*kJ3^Sz4;b4Z8Bb-oi5DjATK*f1M98kxU8InT<pnQRP7=sy- zrG=n;5DhB)grVZ1P;q1$<VJC*fl|znqCpO-4w(iCDMB5h1T{|uO4qAF4bX%NXhUgT zD6J2r4WYC#)F2b6K69wW)==6WWE-e&09Ee@4IwwEdQT|r12Lzb!56|{@PpF+P>q35 zg&|M_BBA^ksJd9FMaVQLYEq!$$TTRkWimrr6{XCOlDitLuAYGb!~g|#4OoDI0Ur$t z@;a!4nwcTBeJ|9({ZM)$)Pa+r^kitrOoz(PgwnG?9*SUKV3-HB7(@#)Ffgo#D%c1W zN2WnSTR;Q@0|PP*^1xQ8zU?53r^}i{bN4Q&a%5VKfq~%x)cvoZ+TK9bA=4mZ-$KPf zG^p142IXU;L8ZnosCj>w8S24>^<St(>>ybN1_lrf3P?^CNSfznfuvo2C|{5T60o2R zzaYEhp!%@UASoplNaj<9(kdW91_lNdmU@T<YES_X4f2sXl#h)DS*Qh-2hkw)+E9n- zLd8Ke$OHONK2EwGivmy@HG{g;94e1YgDkXw%3DI^k!eu7$Q~;10F?*Ppfv6Z4M|U^ ze7zUc<vvh_AR6RyKd5*B3#5gS&H_H1fS~}Y4n%_-QV8XfLkodAx6M!kKr|?5+n{`8 z8YJEcb#WI|9z=u0d!c*~Ex^FQFc-=vj;<$F1Ag_+pj^WODL$S-gZdTJLD*<s1<?5q zPzB$iKKudYgJ{<2f2|nRr}J1dYG{HguzyfFWEvC=|Doa_nr*tTHKX|S9BW1aaOKGc zig-{jn-!7^*r9w74Ql+!LHRVG!S*xIz+g~VfXxMYULNWJ5DiKaN>IKME5v>VkN_xG zX|h5pR~=SJrECZd5hJJuY&0k{m_X%`X^_RHP;n3qVp_36iW3_U2Q)BI&kAY3IYR|N zG)SWhRNNct03WD4J{pv*gP<0KK-DADAag^Z=7mAk)ki=Tf@qKdanKM*gepve%7bW7 z(4|88*l18lq(k**u|i7ZJg9mQ4RSy}ln<rr8K4X>4N_15wYU(f5Siv-U|^_)%Ga?% z%A0nmPdcIET~K`>8swlJsC*w(9GM0Wob*FAPGE&(%V|)B$TY~H8BlQ$4RYvAs1N5t z#X&Sk-F#>WEP{$7)1b<4HB=l-Pk(9$?YXUm3WI2nG3%jxY&6LF4N!Ry4dQQvI%g|X z97Kb}w?VzP9h#!{L7jIHs_q~w!}Ml*MoG{R3d3QjATkYd%u%S}C!vO1fEs!cnoq7l z^?_)R`WsL_hz2?0CNvUmL&cG4ko+B1hUwA{P)FQ@Dnh0~hCW~gpQps|8EV*9s3X2X z)q`kI68^&qX{K?oK{6W`8>Cp{hSEGBMW7RN*dR$%04grX#xQ-g10!c5$VI|XMIah< zyp9G`ktQ4XATS1d$R!I5o^0S_uox1dmL)^=foKpjlMPa$<UsZ3f-Ie`>&PfR-NuoT z103o_AcYJJ49GMnua!deltJaO(V&0<UHAYh??5!j?UhjV*l3VcJ&0gnV5nzfn7-SQ zQ4s8iMyMb*8e~Z`)FW+Bbs!ov4$=qp_ymy07#J9)utAE>nNW2g8dUepg{qqmr58fw z7qT(bgGb;OLoHYa_4RT#$dJV*sQ6Z>#_dpzAR1)wZm9Y_PzM}fgXH65Q2r^XdJqi? zozqbDXQ1YuXN!hJ(Iu$FWvE40p$6Q9@^3@s??5%)XM>d8&!857Xi!MKfU1855}z*X z3~fZe1#uY|7(g_r9QX$1Bhw)FeTRyJXb}Gg)SCZn44|Xu7<fPx6)5?#Lz6F*FTf5- z=7LZ@hz1!Y&JH@Gn1O*o9I8PYssKcTERbObAC$(R&CbBUH~p?NqdGW2*s(*hj{`d- z9=zGX$C@!jL&ZU--+)pbG7U-)sqB#KR|s`a5!Bi;c1XgghFTAzLDtu>LxR5^YHlMt zG(j{&6(ZB1Y|#c42hkt{+M#?94N4H*P(C&qq`n6#kDG?J3P1`#22OzbWFk}}hz2=i z3RHY5)Q2;nK9~)q=R)P@LG@vyMHm<uHbFydA3G$5PlJL2WWhP8Mi33+UxZq86)Fy* zK|Z<$6~6@)2hpIh%;!)(HX4*P-a;Mt4obg=s;>tzKng%N!+_!#nFb~C?@)!<Xpp|Y z(70v-B?!<UDhDKvS)qIo4GLLK4oI5i;((N@3J`Vm49XmkG-<>EN#tf6ki=*KH2_3| z9Ad=*>FBvYG%~nD<v}#a0&l3eAJig$sCmIqb;vYGeK=UWo`C_vfY2a|BB2h51}k7- z0MVd8NP_Z_X;4(9LM=>#(&<oj=rkyFK{FR13~~UdTg?Vae{`H-#h73P*$<ko2RRN* zgA$n!m<O3@1^Ey(qY4s2ra|gRpJ9ch4Wx-xE|9sPz2Xd`GpwK)*wGo*(HT~7mLO@y z6r_Xj)GbIA1K3<prpB0A1?6Z41_nD&lK@mkjn1%+&ags~3}^-xRM#U<pn_zO_~3ek z0Z9PdfE}G-1?4o*%ql3jKs0EOjfja;NN^IN5M(Y5W?DyQSV6<bpw=Li2E`-3nN?6c zfaF2yMrT-|0XI6siafIlN+KXWD2a^Du#V2Kg3<v40|RKL71R|RonalFVI7@eC2pz~ zGV?k*!^*$_p7;dUEUeI_!J{**pqW)rkbr1Vr*?FP6?tYA6fz+G=nN|Z18Bw-ltMr= ztDtZJ(IEcl4D09&D|8AF+srB`ser^mV<Mw7te^}tI>QQ`R~wyS1!WEf2GE2mh}FXm z8Oj0+fM&f$XIMwr3~LHxW)+keKr^kNp&{zeu(n$zGj6v^W)e1bSaIXGg>ue<biFOf zE3V4+C(YA!{<n^Q-!0FTMtrRfGqy}rkz6QhdHMDWj+Fs_pG;PpsQ4gBa#DN;+p)3< z+P_PSr}s`{lBj2lJTF;Pqu-m~d$%;bZHYqcrt&ze`-_$yds)6kX3~)YE1TtqESW#D zSTc#MD=y3^Isa46eRW2A_<~Ps?y`m|fOe%ZGW_HJ$H>3{TeS}g0T$8l)X;!kZ<9Oh zzMnfJ#Up51ee+*iZr&}+We2%SH=6$vDQo26SNbgZ;DzA+`45VGXI9*5ae6;F-&1u_ z_jSu(5n<D9r!z^^i?DU`u1ei>OK^ipO-vg5^O)xWcSVwSo+(~d`}g;e53a`!eRBCG zy*oPl_+i<)+<OZ+JD<+Kc{<<5)o(lB*B0h<@YXPh^BSS!5Mbv89aXuzr}@nCk_SF3 z(zjahyexEF@b$q|E~mKt_Is4#8-4e>Kf7D>P4e-|ztI!aR<rJORrI{Q*<r_7CB5Se zmaR&X)8B%er>%53nnT9@^1O%l-4E#S8fRAjm@6B|qyAt0x3{CZ-?cB5Av@fKw^X{U zKk~cSzp>o2zv;oc`73Y#=Xtw(!~FOE!8=hP&I2u+2RRLdS%QjFs*42jS1V*~msBt{ zZ`>^BH~+7vswoeXN>|+Zbqlxdo$0u>FHLe|yNt(@cD`lXTW(m~UnH*mq*o~=ZU=9H z;PkmOm?Y{APoC|JP5me)mwei>!7Fd!g{EssS4y|^{!nAo-^saQvd5gqe}W7S3$v%Z zIAe9`ySLu1pC&~!TMqDfZ7DOIJ>fS}=(Qq;Ubxq{<l8bcH(b<FjywK;VY2nh|28xF zK1R!YP6#!c@ANf0e}!I$|9#0L|EK2#oOSmt-E~Vd&wb;qVvCaE&=(1B=1upV$s|#~ z%Y0St@dh>?o^(OZdA{wuz0K1~C4b*yDctLI)-*n$V#P&AtCGC0^ViCLu<dxXIDhKX z)oZKL`es+}o!)w7=b2O_=d~j{@ATq^LoFTk8;g1l>3{Fump|)n>ob>rld3x@pHgP- zTqVcY{dPt((;>-%{`)pzDf*KybqlY3IoWIW8#~!w^{gj0ES~-s<h);ROuLHML%wKa zMz^1pnO>foRB(RIyn9S%?6RXDJ6-2E7pQV>^OJjTg4e&{@O}4X@9|$8r-aTw`BEzX zD$#-Q-BTpzbs{_OYOZy``2_C;cl4&OPW>3v|LmIHwSGzE_9)>;(x%V$21UDUcl(^p zF8OEWAEB#T!<J5Ep2wj1ci}TX$Gjrx1F;WZPhUHWNupk$+(_X=zyp!CX+I8LUumhu zz<GN^$A&Wd8xztvMdB9s8-3eiZn)Gqvi4M1K-5FOGbd}!WUnS)Sa;}dTH`(I-H@%e zkhIs0?7Xec*SA}`86R}H^H)-T!PU)w&p$tDJI~*~clrdbSC`c_1DH>>CL11=tP}8@ z^lFo^V^Ym)flH63Re8*O#&57~@1El6v9p;Z>Khi_adB4M_AKzAfc%QT7e(_YYd2*v zO?BMzNPcUC@(zYfrdx$AA7}9%f1f9u&+kyvVVe=O|LxJ*pJwJ#$%}LTAcY=iF9|4H zfG|tXT<O(jo2Dh@h7~8AHJ@a4p4oQw%iIo@_20fE?6<#>y#2^TMWw<t$(F?;bDRQt zXD`#<G+iPh<n(#}b%(;Hu4D|G&O3)mqCRi;@8we$$a_3<nDsTq;J$|Oq{`F<Kb{sX z$**Ppm!FXQN_|yf=fcycPk!7IagcczPquGd4u3+OY@UH)metdbdyt$5+TsFo8VIu# zD&{i$4s45f|N0WwC6TMC{Cze4=@mcrue+3Xc&f7O)1t6lEGwp-m%Mhcc*|0wYfJ5p z{rSH8w|v5+Ti^R`zboLqIejn4d6~ICPfoUC-T!03%*eTi*>7xEk#;HESH{IV?!9nD zhMSf_aHg2-A}=wQM!tfJKTqyee;?3VIZ;?ie!o|8_w~h`NX`T8ya724gjvq}OjCZx z%D3x7rM~2>do2AE@2X`QU7z25^WC(j+J7DE;-k%e`IkSGG>O{w<M?FPy;cv;O<Uhw zf9NmsS(eA<hG!+G=gwu4s6SnHtZC8Wy9}{Mww<2Txpa}F{sw-95{@ZOA&qJUiFNgj z_7WDk=eCs}xx<=Ud2sdNI`)lR>@r0jF=>A`oMht%P2t084bVm)kkdez<q<>8+_l!V z&qc$WJ6=j#RB!oZ^5jYPL^b^_SIVBedAWPL;LS@XPrj85nWtTSQXz$Z!|_Xc6}>aA zhuzQP(LMLjM02|AJSK_y+d2*Iry3{Ry|GKYGpkfHLNDa*wx5d*d^&KU#@*oR6dPvQ zT`~-_@2y(#b@%y6A$E@^ru;bdo1JUws+Cy{NB0_YAcfvk<gB6d@T0=B{=|z<Ri&LA zKb#1i9e?=ueB<-0!|Zl^6=FYoa{rzj0oTG@$rq1bDTJ<>oqEJ*vxm^tiLbjQu59Gu z&pu!={Vd3Np7TuhN^JW7M$q@~)^<r1A>)&269msXix$ih*!Z?Z{M3@bwA<D>zxUqD zVE*_kH}IF|6iZLTIlG-E^6K60xDpTA{|pPg>B!Do7{0_loNG&elaKZB$i|R@(>dCI zO%5fn)N6IsTz7EG*SpRf+NvQX8Nb1%yj4#rl;i1piw+;YwsSXaThh+@hrF0xJD*9S z-s0xOphdgS*&U9oW&Xl&?{bawfd`RCF35}L@=r-W6v@tf|NWUPmxT&dXI9Hc9Qbno zh`H-^qkH;K+|pEPCnR&1A%z}jR~IN^L72r`@zY(~{2N!r=jZ!vOfQ_VZsLK0fBQVX z??1l$19M|~45RZ8Cq}+#Nk*2#movp4=H~{@|L!E$`Dwq)zUrhCntj&Obr)W^2J z(>VS3!P}qpzx-l0&z^fpaKDP(|91^74<7z_G_C*2-pBVfWh(zGoHmw!p?mRzlWQ_> zoo}Sqyuv#i^Jf*A?L%@NXtNo}X&}t<^VtTgAcfQGO~gGJ&wS+-6PA>^RGO64^D54c zYx@r+C$-+LbN{mXB@YTK-k-bRc6CQ4Q>)T-f!9se8pk@1R4{~0zYB6+S0^Jci%PKi z^fu-jnRC*L4g1?F!qXj=ty^Sg@a%s?;G{36I}eq=*5ghNn2>*duD)~Ce0Qd*o2(fe z(R*fm&3lgIyt&AcJ5BzcqWP6iQjfn%?_Bj%^Fo*DgsB~q!!Gw*S*z6gKfSulIg$I3 zV2I?@Pc~wm2U;}~6n~_@uBv&UaO1yxf7c0_nCZO>nI!7ZmntdeEV`DoWn=lo(sO)Q zR@!7d+h6_AH*&gg$A|jTFV{}&S-Hc%R!{AL>k^gjyA^8d|DRypH1&Y)uS|8#8yj7b zoHrlYd0v6Gl{QH=A5N~do6-1k!qvpqsn6G+XS0i8{u;MJ_4&fLMLX7TC$vj)&Rx5D zx#QA<-~5UT4?2oS$;d5!neB8<uY0=fA|{FYuzVH9$8+ip&->KttoC+iE7eNcDPFcq ziZ!%o+QQ(62P+R1%WF6p9@ky0kiG59Qs3#9{}?d;jS<}tGvD|2i~FE+Bw$%%A+qy! znr)fsH!VPKXQ%gPjXLpfg0g#6cdy<2(e93Xl+qb5+gH9<q?uHuB^OTlnDuD>lIS*t zw5{9;5nX20huA}68ai91zXdt(+SYqJU6mxVK24Husu0h6(!Sebj?x?rfn>KkZxSXR z*DDOE**B|g)uc)P`<7^3I2~a5OlI9e<A=-cJpIeH)$iH^q|jT8?7U4<SF>4I7g^ri zzsBdW+w$WLOBNXatDSA|clv69(_;VTY~Cn#WZG<Q$v+06(Yv+_%M|Q7?i<tlG;a1n z!I{RJPgM#{pSzezqF#mn|3nVSt-EJ@uH1Ljer?Q5HMMd!L&M-7`U`H!PW<*JC86uc zZJoWFIOpgIEI&N&f26`cA=#7PH~I@0rsq~34nlI?Qe@{<hGcPlO-<ds;ZD|>*H!wa z$_^F0Ue{MjxqrHt{J-q5&qwF^Uz2U5C8xUndY-W(?tI_@#>LUsYfmrz^XWcc22*_G zbl)YQf~E21+Pxh!=UtaR=N|L8SNBkuRJZ=SL;A)U^BKN~w()!K-!*r}0pHMNiypGv zJ@sr=&SJ}ocWZQ2_!9a)2(mYU&hmgo?s8=3i3PkqIYFvrW{Y@f;C)`NMJz3)so$dn zEG51z5trlq9Ld6@_(|tftfbCHRqvC3N<T-HoM4#y{>*81{aGEx8;|Bbn*JB$JgqMU zw_~pS|08=o&!fWE<yrnMQJsfsQH(Auy8EB6F9@Hx@6`)sDG#ToTCIED9k#p`%#{?m zbHmirn$I3jo293J04elVB0G;mEn!)H&!p9U28IgaSEe;2AB+nzxh7iw`t9lpLrt|; ztu{GVKa_Dv+K6+A{rvskE~@Q@-j<@zJ^#L%u3wmVYSQxQYnL)f)X%wf_3UZe`&u_0 zp6-6P@{?uY+x+$1Roo8~Vhlx&zuTEIXEux4$$+*$7xK(cM{HcUxsg>g>F*EWZ}Wes z+wSgCKu&wBk)1b1(mnS}tF0At()`Tc$`FCj!h~(>s;~d`4?Og{xqVv3Ke=M&a{CO) z)c$#E%U^K5{~7-8fu_rhTUOz=`-9&8mH$6Ib{UgI{b!R!hv)Gf+g>z#F7MR&IYF<D ztiwuEPb9c(otUw1&gZ2kMKp`J7`>{lXB?2Q%vn>k{P#W%15fE@&E=lkWwxb$M+&{Q z$j;lyrImebsek41p6tnej}}-}KVICf+UGsL?9!PzZ@XFke{kn+p4OWyIdP$^vB1Q3 z#fi4d_5WL^rZJqKo%UOVvt|Eu-sMaZ^;_=V-5Yo#+>W_b_0ilSm3QxRPJEM6`?2DB zyxyWrjXm69to9R2H~-T8QU7H3i|6qXMmda`e^lFZIc!Z&c-@v+g5*5VPGnGx0m3XU zr_&C5v`&0dkr+Qe;K{n89SsiG{x+XE>OQw8LOb>6fteN|zWQtKNwU{h?)h`H#pCh( z_A^JT=gx3?KK)bc->g%wr|$(hPjEfQy(2uKRe#ikE6zXsUw-Dp;@1&;j7Pq|b9<Qi z`jE6q<D$K_C8v(Ne0W-;Q~vFct;tPO0omm`?-xFvSbgcnawO-$Hb#S;_a{i!yZBRj zeRS{4f)$b1Rwz%MoA=`T+S6MW8#p}pVkV+>ICp{9-Wm1DVe@wv7P@Iwq^S9BuuERO zK<fMw(L45M`;iRZgd8nx2ZBw#CivK>L|vCn=v{Pqnf+V`mkk%0RaRUp)8O9w!swI3 zI~A5aJ0&wGxeF{;6xVmFUuN*>NkN*CiIaMU)-NP;H#387zXCZIbiC36X`Afs^&ZB1 z%krh)JZO#HKey>>_Msg0wV^l8?A&qh+U}~ki@EB*7)gnUYj8x}Nj$B$@6W;Ae^=-) z?G?GwzN{L_;4RY~r!j>yZk;|8L~Wb?5kzgD?m3+)oN>qWg&=C@^q(MV*Yv;{OyP{X zr>_K2d!{qaWC~~8J3SIa?VG+4MD3r>Ig2Tr@xb&%5Or|+P7rlydf^<VaK^*aB|+4Y z>6x>c!WoZFKM10ZO+N_|JU(4<E>k$;iRqOf>g4o`AnMd~&3R1WjHjnJf~YgoZ-S_^ z(+%e{g)^R;-U*`4Pk#uaE=;#vz!c7Sar#6Mb!qxb5OsOF<3grz#w*ijf~c$0KZ2-h z(>)h4g)?5Cz7Ry+nEn$)-JBk{m?@m`*7TJi>h^TTB~0Orccw>zsJqiQf~b4bIhQhp zGv1$`2%;WL-wC1~P8VFp6wdf)dM1c^JpCYudNN&dIa4^})9HmE>e=*@AnN&c#T88T zjEwW9FI>qK&bp6{fq`%P!HZ1MOw+bAeVF{fnnmz40|RK4WWz#X2Jjv2ERzjg^|veB zWjew*JzzbP2jjZ!GuJceGqE021)Ur7a2r!KNZ)jyO-vlD*6IulT-zURW71~?3-)Yg z;$S_d&A`A9vgI*Euwg3`2kT2S1_qw#hWDAIIkPfLGC>Kdbo$1vOwE$rmf-z64aqr~ zdRfJgZ5Pk17#PH+Up&mz3^vwa7ZV5L-R*a`G2Lfml-s^{2U9g8gl`P7qF^`N3b+IR z>}KL%y5l!p?>>_}M`b}S$jX<~b@wo>=DZLH-o?>yYx~1JOw5duEujny+@NFC85kH! zQj3aHix?R0g)%U3fexs&2Rp%GACm#&hV6y>nEo^J-b`R%kYZqH_?*DNAcycNXRH}` zk7$F!^xQ*C?wqb>;JtbcKeq2Z#Kh0Ycx3w7!%UAEH*DW{gejbf)vy|BgE$*#_Tq5$ z_I($b;+VE=XPN=_6|X!f%orFN-gPlB2!KNQG9%abDGUsJpiAwhPUkzzl*HRQ4HA7! z3=9lMrq`ZjI?gCG-Sr&PdtR6)dFC=O@N7SLh>4q#apQL13ry*ZoN+TD4t3nV_af6| zCPs_xfmfK;GxAQ{3<-$JoeT^jAkT|~(g4eLjcZI_7<tuqgU{(|a9j>@xZqi)@aYQ< zF>$a$_z$-+L4xYS4JHnVC%r+QVF7z)y3QRY4kqFA)9-C#+64+x&h(u8Bv70j+Wz+r zlRgvU<mtNindEsZZ$Xkn>n#Qbf$4^On3ivQz@)>-cy+q&L#A+6vquaJ+#r`}gIzX# z$3vzkj8nJIeZ;hynf2^9c=}$haF>Y*OiaFDFEV}48zv6cMnOgfK2SK;gPo+DSx^CT z0K)?@MtJmB6c>ZVk}~u3D~gLJFSND=xt3K{f)V7LhfMC%wlm!U32_xcw@K*fPY>9} z6b2HTj!3D~!FEhPu#t%al664o1f1{gZ2$0qscIY8aoC7y+nK_+1nxo#beX5qOO`V` z)H5*r`wsyi=YdWT0i_wxzCIWqlmb8)w0jgJ7S9aX>jW}K2D%$40V)QX1NjBoPQ<{# zkO&oHWnf@<4HZj*ih<@9LHqF-LGvfc&|^qIYP>)M0|NtS0UgL8AoE{<OkiMO$bxDH zIc_1yB@7G<*-$aiPMZ}_u^gxvHz?^s#d4V;n{z<x0xm(t3YZxfK-&R8#T3Ies9+&f zGw3Y65~x@aR19>oniEv47%B!jiNOUbRst0Rom>LjkOewp1>_MS1_lN_kZ%|m7|NjP zgh9tbfKIdm1zR~Y<opTHMmj%Gcr!3C^g$JZf_@b{WIHHm;0Yux209)EDh3+u0R<9h z{dE{L1gAmuf=($4hl+s)4nU5P1f7Tl7OQ7qm;qHN#lXPu0~DzY3=E(yJV>E5=wKf< z1_qGBXF=7;FfcHD14%M4Fo62fAf_w>1A`b7xbS0`13lzLjsbKQDkNwYK=sNqFfhyq z`Ido!0n}9k$3N(3hy_r=MbHyd6hR80VoRW!LEAP~K*c~k6_8t%85kJ0v49H~h855d zRAFFX*aMPeU|`q})vL<Dz;F{Pb^s~{T9;TK19CnC1H(aR0#OH@!3hdWP~w3q)L>v> zumuGH0|UcRs2J#wiXc!tFfcG2gNkV}Ffg2FXJ7zD*Kw$rHUk3#Xg?$<x=ujFKwIJp zAs(q`I0^N!E~t)x2r`_8D%4|OU`PSS69dB;sF*$j0|V&nB~ZYgg^GbrFZ}@Z-8rb3 zAp--$XQ<eDsF)GxG-9ZuFM!4BAxE4}g@(dKsAEhR7#Pm5GBALm<}z3z_}*j&(9#-E zG+cp-fsR8}gND{ssF*ne1H(k9CD)+lfsRWB9TNg_^bKf8TQV>(=)#VLxee6}I!{%M zg@FMSUw5El)(i{`Owf=4m0lpX+JLeX)RKEpb+!x)4Ejuvvt92)#q1au7|fySKx<Gz zdO>Hjg3gTqIi~(0)P)WV3=E)?SU}P67@C3|K?Mvn_@6@!1m*vHcJSRh3@@O1K}+?7 zm>EE)2Qq+;5CT~ODihX$iaAi}2i5D!z`y|7Yz?v)bhHp?`V4eBH3J{ig`jhVK$_hd z7#R4WV(*}uJwOQwB+0<Q@E&S0=p@kTjF2e&2vz6Bz`!t>6%t*apkkmyW*ec=1WFSi zV?f&=n_=gMe1R(T1szufRrnPu<_9`Y66zSxK}R6XpuLjsSim<PFnouq1MQdOg+>#o z9092VolXlXDM3E|2~`)wz`#(-1ir|D;TLH75Tp=vY%S>M4p7|uhAIpJl~Sw>prfG~ z{y@b-85kI1pbi8brUXjhVIUtvqlp1}v`je25_SgAVf74*P%+Q}Qz6hO0i`F9z4f5o znxGBuptxa%9%K^*DmWOyw|Rh1XaZRh4Jz%R7IQ%jjA3A40G+x43SQ93O&|kf85kHq zOY=Y>$-@F^b%M^)jb~+G06CrysyCj2fgu63su3gzI_?RiIRR8TKz$+r)tm?_1E8)J zf@%h}Z$R7cL5>%Oih&vppu;mkju(N7rGN@7M(|x~45Co6R8VNKf-ksW5Mxn+)a7Xm z4B!(sL57G!6?!}c`I~`Z#n<Vx_A;wY_gTl>P!B4XL7SYpIT#ptI2agsIT#rDKzp1y z7#IXN7#IXO7#M^&7#M^(7#Ku27#KuB8=^TF7{oak7$i6t7$i9u7^FBD7^FEE7(k5& zSq=sUISvK}c@72!b`Ayx(7BBfObiT>ObiU5P1!%$85lqfis$SM3@<?k0DxK&Z`c_a zT-X^HT-g~I+}IfyJlGi+Kn(}b!5R-)85kb3GB7-up17V_*zy%C1H&6u28Oq+3=HpB z85rKPGBA8#WnlQo3cf`Sbjb_@C|!UK#4%=N0G-DTy0?*G>GZYhnZ*OwGcYi0U|?X_ z2-@8as%jV*7<Mo)FzjStVA##Tz_1sTQWzK*4lpn<90t`GpxOWwmY@?!85kH&F)%Qk z29>1@3=C&MwZnAT4b1AYw?IdoF))Dc>SUM!J)0PGo-wG2STa3v1G98JDC$5J6sVp7 z)hnRf1<JCQ7#YBOwqrOL7-BgX7~(h>7~(k?7!o)b7!o-c7(OsCFnnZSU@+leU;xdP zf>tGf(kEz$8I-v|<rk=I0;P9Q8zq#3fgy~8fkB0XfkA_VfkBf4+)kPPdjqp<{Z9r4 z22fiBw2l4)I|IW<b_Rw|><kQ_*%=tVurn~MW@2Di$Hc$@+J6r^R>6mzfgymMfgzZk zfdSMG0ku1#*dfgd&;cYOYzz#dpo2$1hmEi?Fi5g7Fi5d6Fi5j8FvzemFvzkoFvznp zFetDwFetGxBr_<pF)*mGF)*ltG_W%;NU}39NP$in0G%NLI!}U;fdO=U3g~<^85RZx zSr+is+@QOH89+G}v}NxbBLl-vMg|7ZYK1-~1_sc6zxRv`3?CR77(Oyif3}f1PV5pB zq^;7($iUFV$iUFb$iQ%qaeCAyW~KV2EDQ|GSr`~VO^=l<3=A7s7#KFOFfeRoVPM$F z!oaYbg@Iuo3j@P`76yjXEDQ|iSr`~Du`n=PWno~r#=^jGkA;CDl!bu-bl{jT3j>2Q z3j@P5M#$C(P%~vOGXujuW(EdOv*Zvnq=f-$QGi+yr$7hCfm#EgiWJm-xy8)D0IDlN zbt9<W0}aQ68d9M4&@yHQ2GAHJXrRxYk%7U1k%7UHk%7U9k%7U5k%7Szlyn#w7(h*) z2Mi1h4;dI3UNJB*++ko~03C8&%fP@;2Rcp#R0=ULFqDH%4P}UDU;v%z4capYI`caN z)HsKp2M#JVKy4XNGX>Nv0iCsbfsug$bhwi*D+7ZcD+7Z+D+5CSD+5CyD+2@QY=LAB z28I+41_sbU2%w5xefrbQ%=YzGpo5MX85npO85sB(85jf@Ax$oO4h9Bi4hDvQpjHn9 z1H*3y2JqRhpr#k-v<FZ#s)&Vwp@fBjp^Alpp_YY#p^=4wp^1foA(owiA)cLqA%UHN zA(5SdA&H%VA(<W0q5`#`{xUHz`~y{Npg?9~W?+b6XJ7zT!Jz6D)SLoUpP=dzR6Bxd zLmPGm1|4<=27Pu0219lR1|xO`24i*x1`~D$1~YaB26J`>2GF4@7uXmWF0wH&fKD<2 zowK9G#=xM%#=v04#=v0C#=v07#=v03#=v01#=sy5YF)GOGcbTE4p4={$;80WHT~fh zW@S%Ms|+-2Y6A)kMg|7ZDMY7O85qv8GBE65WnkFF%D}Ljm4RUoD+2>)QST;J28Lo* z28I$=28ME028K#j28L=@28NpHzFV24B{f(f3+ii`7#Qk6r~a}sFn~_G%b4D{m07$# zpM`+|bgCK?=wKz#IZ3RLcHCqp28Jn23=E+5+jABMh8HXh3@=$27`#~+7(l1-*|0D$ z*s(A$7_l%g7_%@ifQ|&zV_{&>VPRkZZF<pQVPN>j%)sy;RGon87Er|os%cpmz|}ga z1@;^i1)xJ5LBp&Ym>C#A9nm;u1_n@P6V$l`bsRw(?yfK~Fo4cx1)VFa$Hc&3%EZ86 z#sq2OSuim$STZp%STQj$C@?ZGC^0fHfDUEvU|?YAVqjosVqjos1|3z)z`y`H9lnYI ze4#f3XawghqX`28s8JZs%D@0RYz%bn1!!VPgpq*(bl64!2LnSO2Lpo#2LppA2LppE z2Lr=@hUwR~GwapQVPRnCW?^7xXJKIIU}0bYou4v`9kNWYkDY;`pPhjLbofgPI|D;2 zI|BpgM42>p28MKY28IlF28K*_28Jwl28L{Q28LYF=`^4gGU#YcP{){=fq|WwfdO<r zGUzB}RVD_8g=`EA9&8K@p!Vf@(6K|HMkO;l1H)c61_sbroDk^9A<)52pwp6>7#Mh% z7{F~zP@8fcBLl-`Mh1p0j0_B085tP1F+vW{22GKIPWJ{4de3BJV3@_ozyLb#>J}>l z!zES*hRduB3|Cnh7!I*AFo4e9+Rw_saDbJ8VJoN&Ih7T%+#GZaTmvfu1E{gt%*w#f z!pgwV25Q2wGBAM7qSIq#V9;k}U@!nBJyr&W3|0n)OjZU4EztQ}tPBjG(|SQi0Z(UQ zV3@(gz%Y}EfngRC1H)`428P!x3=HpC7#KdVFfe>%VPN>e!ocvAg@NH4=#Wd$F_NI8 zBS8maDuDWfEDQ{w<`<|z3Tk6EOfTHQEG!3Vi-KC{ubCMbKxc$*V`gBO!^premyv;C z9^>>yJD7{=KQl2f>|%nPbPPHqxr~W{0d#hMKLZ291n9*Cc?=8;`3wvUk*o|1(V)f@ zD+5C;sD;PMz#z`ZzyMlj;{)n3GBPlL&U0*KVqloV&cM*f&cHB<oq=I8I|Bn~ttjZ| zAJ92$pd){}K=m3ZAAnBG)nH-(AIas-#=zji#=zjq#=sEB#=sEF#=rn-!-lajFhsC1 zFhsI3FhsL4FvPGiFvPJjFvPPlFg#~tU^v3Yz_5mufdO>5+bmWFhS{tP40Bi+7(l1V zb+9rpfDZV}W@TW=0reDE85qo185rg<F)++$s%K#M1<IK$3=E)i8bRl8f&y5Tg@FOI z9IS(xfuW0;fdRC7XeToR!**r{2GDu5q09^nVayB+?#v7fCd>>Bp!1<YM^hIwF))Cx zZb)HeU;v%x4?0T-bb?X^I|BpgC@s)2T}^BZ4DD<T44rHY3|*il=iO`!483d&3{`9l z3^i;F47F?w40UV_44{L<KnIa!u`w`YvoSEFurV-zPN{my#=ua?#J~VLqHYN*1H)2Q z28I=^3=DHw85lt4=Jm2NFo5>SxUn)YxU(`ac(F1tfKEV_VP;^E1v!?DfuWU+fuVto zfuSCBvRNJ*14BL=1498D0|V&zt3oyghSzKi3~$&N7(nAzp6m<^YZ$=SvVo5zU(dwA z06G<E2|EJ=XrN{dI|IXdb_Rxx><kPMpmU+v7#O}YLdHly!xcwa7#L20+6v4J4E~G^ z44_LZKpi|A&`Dfsj0_BR9Mh9_Ge^}IFflL$GBGfKPEG<1Er5m+_OmlE9ARf*ILgkz zaEhIQA&#Aa0ko(Pbf6Wex5x=<7%?$0NHZ}o$S^T5$T2Z6C^9iHbTTq9Tw`TmIL!*_ z+#h3Q0C(ssSQ!|qKnLQnGB9v}P9tPxVBlh9VBltDn9je4*|lDlm4U&Ug@FOoF$Z<9 z4Vf4iOqduL(pVW7f;bo$LYNpBKu0=V2bFa!3=9)k7{GmLP(K;eFIHn>U{GdaVBlqf z+)M!KvR+|@bW=gcCN5`UU|7M#zyLZp^eqbm1E^;S>L1IqfCmEW8QPc_7@C+M-9}I^ zF^Uz_cirp^44@;rO4%70Ku1M`j#UG7>_F$&gU+@G-82B2tp(j|06G&L)N$)$g>=>y zF)=XwWno|dEyn~6&Vl5USs55WheyVN$~RE&ErFGRVG26~Llrv%LpdAd{Ikz&3=Ch` z7#O~?F@SF_IKs%la1>OQKz--I%D~{s%D@0K40J|V9XkU<2^#|g=)5%0svgie93Trp zHyYdkH8Vg1L7+|;0|Nt>O{uZb^rd^5r4>QrM4%=isA&i)Vn9trQ04;_VW6UH%l5l_ zneWTggGRwXt-DpA4koBY#RO?lfhNyEwI1lA5YVbv(AmwP79$@c0|QL`TLuP(I3@-L z(BUYc$O1+74Ms?9*~AP<K_I=LiU?Gyf;tfm%nS^mQ9IDs;v7)%1sb$G$i%?V!VDQ7 z1O+OH4;nuNjVn%JW?<-HhKxIc1}Q-$3Fv@mkUmfe1JVaNCLXi^5Tp(y-v+XrnSlXR z`hZq_g1U(pnHU((f*MQAkZvQ0KM_=XO<;m31W8U{hA0A!nu112K`XniF)}cK906K{ z268pXf{mcEkC}l1wE6~g_%w*#%*4O|8n|2tD(09N7`8DnFl=FBU;v4GFfuTJ7IT2w z)S&T6Q2To`GXuke>5hk)h3i4HrYjj37@jgPFg#&kU;s5WK!FdM<Oa<RfUE@t<Rb<K zhE>cA49giHO?Oa}92Ob(q0JPS9$3VIZhnF30Zsd^0X37L&3MpodM#*F8PtYa#|()% zm;s<(C#Y`#(g13@gNFS<?Jbx(kT}edAjg4*G3P^O@fbkOe~@}myBw6VK%N763N*_H zOIe_9C#WBh0otnxvJ})81!>yN%)qb|bYL*Zx6ov{gPDN=RDXarh=T@cLA@W)7%ZqK z1nLoidPX2IkQ`{t6*OpngqeXs2zo8YVNi<_WcdI8|3O&+#00hFL28&lgYqB+AWK26 zJuyA>HnXxVXiyN;X#&LvXcz=EqzY038ub8ms6a#Spw1Aeg9RE!1sMbCbb&fxr>1Yc z&8%M!6YgbTU;vGvf{XxJ4Z<Kf(1;9ZR2JkE(5Nd&3^eBeqG5bczY5f!1D$LK8e9cg z3kpk+I?w>@B~a#IVqgFb0f5wk_@DvT$DoJ>34lggL4qK*4l@G-XhiioGo;l4au}%R z3+gELF)%QI225f80Xgg(0|NtSEE9B`$1`RIhDXc{44@V`XmAuX;B%FUfdMrB`GlE) z0mNScEs5klfrj>`Kf1#_pPezzNY6meaC*mG<~&2t{N|jvk6YJpuFr$rH3F#|LDPvB z3zaT8#;*@#VvIA^Gte_&VAwUC_a3vP^hwZtaSRL%Yq(ZDXt~*ZgNZTDK+jaqkb&XK zbjN$ljnbgx&c(pc@KP=znvY+>mWeUW1Y*LA>4~K*BGW(KV{VrLr9WQKjOnWnp&x=o z9y2k<8Jg-Dfh=O2KIJ~Mku<1B$;rUbaDV3NmVNtr%fK!%)iVN31V6mbY%Hw^s+SoU z8st<A?&f6eeFj!w2vT4^UH<{IF=Ng2WDwOheL9FbJ^l0pW=Y07(;FW$OENy6{{I29 zr0EaHeLW2`KZJ&^|M+AX6Qi-7iJq|`r0Ffdz|g?4PUr9>!D+h?GBwkEA2J)m3`&?j z`ysQWH0V$qeg=kyrE2#x7`-+`Ae2KbgiwUl9hv^|F|*|KfJe+yFe^}8E}h5%nRI2` z^|vbSNL@0*rrp!ebFfHGe*@BbV*0~HERu{@rz<{2cp9RB5h`ao{op@l$>}+hSR|M& z7$7R~m=19mBZ_0D+dW~HVyu|1$i*VYV#okBgwbhw?-OQ8Y0#D;2?mA+#WQMq-yY$X z0mU&asT_R5?8~S(o&PDbE9ZJnh>w0wj|Fk7xWMOpHtd<c`YE%d^ieLz1b5#q-siIx zFAxNqVhBnom#5!<%4{sXikpD}6!iY(TJudWuKx#CV4!Egz_4?=?lWd%#@gwL&zL0{ zJ*QVcW0sT-;f0u|_9dfn#;=Y-aI!JbGiG2&n!f%Sv!rP@FJvx!r>BsE)UQMiumW>X zx+>v?*mVB0`H>paG8b^tHUy>p=IMVyW>11@ooANpzwt<V3D_y7dgcra*QOgjXO?7q zGTj?Q?VYZe$|5$s`Z=?#=?OmYELg+7pv=Qe|1M7eTW0{Wu2BFyCDpLy*AnY{Tr>VK zF&gQCZDW`={p@pQN$IBo3=AR+3=I(*KKBU3-OXoWtTWLw2L;W~>5MO!B^d*!OTS>2 zlui<aOrguOO**eXb;nsI#yV)G_L%MuQnzM$<_l(H#=q0&f~f7&FM_B8(^+3K8#A$s zPPcl=Y{d9-dhSbRNoiAYNa)zdeJcCqJbw+?iv}Ps+D%{hl39|`efn;Yx)5<lFuPVd z&Dwp?l^3ke&{)rq0jloh^ukxnlG5Lx=E=(Zt)IB+`AM)k15lX$pKkk#*_aWcjxlF? z_bX;eMik93yXqvt2QxQ(*xoT=CdX3?uo*@mGwx64eT_v|^lN5g#?RCHL2^)oA<kxW zpMDof&~Ccm8)jq1#ObbYn2n{2q#?omJ)L#cOsO-sL>S`?^-Ms)T{C_18)j{rHfaV1 zK?a5fOobvckVq~o1=U{+425RD-!wn_yiI^nUIvo*rxz?>k=icumbs6aQGaSRizK7P z^t~ULC8Zr@Apssxa?^(Aw$FVgP$_N+3UIIKA3rclG6qlQ{>UuJ7&ARFnnjW^b^675 zEFxB5XXVR6Y+dUrruy4vgB&<qEcFac7^<K$le<1Ato{-F0wL2nz4s%tr1Tv|h}M5! z4_L};iyZ@}N^r?IVfsOkb&%3SdX6k)xyj_m=M_5=)SbYt1E<~-)A>I!OERvUzWP72 zr1UmfNOJHzx%#_mXtzDsLSv9Gj!cgQsk=OVp#X~{<KyWQLA)>1SASxblxCBIM6C4W z+1EuU_TK?lHin?;NOEc-izK7YbX{H+N$F5Ih+`+}NA;?0wY3ysbdZB&orLMSpTUlB z|IBR6C^+5Gl0}kHcKXL67Ln=vznEDW4W_RLDR7#85~Lt#dLl22<aDtw%u<Ze(+$5c z&t^=We)bEqBxB<A=U<r9nK%`v2Yh9gV3e4i`IXsMnpp{A@w~R(&MW@%En{M=Gt~oE zL44CMeq}ahl$p-@joDXvmJ%cmLlfTo|1}};8#t7}2{e3q?l)#h#)s3}zcCv#uA9F5 z8?&VJ7Zpfgu|yb!oMl^el!-CU6jX6DFt|;B4^l2OeSQjyB;%~<%HNrN8NH?#erKM| z2u=<n3I?E}Y@<4)4DC*tvT@I?laNFMj+TSd9e*%OGBGPnkNLrD#CUP~#Vi)F=}Uhw z%VKvWD918%O~3nt*_UzSbnTzalG5Iqkm97BU2~rA;!VrJacQV$$-ppudi+mjNk(uz zBR+k?Pi8YHo7s#(aQZ`#9CF}4pDy}~*%%Vil8mpXC;wvB=KQS%$wZI@#yD&G#$U{m zusUnj^rs*-%eBFG9yQFGF8Q0;n2Aegy5DbR329Xw1_l`hhK8;G-+bbdI;G0OXrgCm z0V)R^r#Jp)mSjwrKKnPbq;#DQMEhn{mRN%qt-=U(bElvG%`9oQM+bc4XhV1Z-#Ocr z1z#Z)+|yxTP-b9g_z^d=&ScK1{|FgI-RW|Fm?fm;b-~l`4d&`=EsTC&a6_oDpC0&! zS&}h%diEb?N$Eyi$oe{a_Q15Fj*}?}b+e|=|HCY4x?LCI8~#TZ4R!vU{)13(S(kx9 zmVu$6qiDAJ-40J)gpA|#w;;2FO&CDehBl}kT^6h^oyEe$7-z0$WTI!zkT+fNFF3tf z|7Dhx`ECj+e69;0Q};W&cRn<snKCeNnoTeG%PhetKfUuW^K58FV}#^sX>Bt|vKL+U zd*jcLYpLJ_08U+I)8zwM^rtWS$1KMPj=*$AXvPMoPRZ#p|Cyy2U8k4-XEufu4ULSk zQ*~J+rPItHS-qT}=~naeQz_uA4z9}}SzUi?HA^-lB#}!_V`7=Z2q}oBZ)0L<LI_Jw z&t+z5WYnI%(1k@@)||o29Fm%(>#K}sys9>ZgoLr41tdL+PPbrTIl~!i0V&0x1q3+# zN-}0mcVuOeWUQEepNB<~v3)wD8H?!j0!tPa#%a_0K{CsxUo>M8l?R3Eb_+;IzJ4)l zR<QnIA8-x_6;uo-r{4vsy*J&ymqn8C?{q;n7GvoqOGtt6;Ye-4oa<*Ug99F1w|7rZ zG+`0VHPSO;m~II%^O%hAzqv2@B_M7G*|yS>fkBReq2cxF)TQ$-&EJNQ*=YsIo5qup zs}9axP|L))#tP!MqgIgG>$P=a;z=VvPH?1|=vf#U+?@W9jYX32+4SFREXL5*oR}d4 z18gB?{*3edbsav_1sDUSN3*jiGS*G6WoMC;o@on7pm8@p==m*>>O{C=>-3H6ERu}i z#3nU8o0CNn6eH#=psT*1VT?*41@80)4i*zwQ4Ng=l<;N+g+Ru1Sxy#7>1KOKPO#e9 z9r9Z=WfO)Iu0d=^wGA4hP(i32kjMlZ4sOs>xYO&BbEOs5L#G3!DrTK@`|el8p1G z@8x2Vl-7}h1Zv;HO`(5l&xe8o)j-dbfnnA3k6bLq(ubTNp`TQ!V(Y-o4{4fMg4zs% z)9txg;C0f>=@UVTY{PVZ9u{$CQwE9Y2f0}!AuVZfSrdlCE|3cC;lH!%G)#DBfGq;o zAYd&pmD3$~SY%*<hZLxc$mUDJ6hOlPsYsqK#LFUun%fy6l_IQ^2Ip#n=|_24WFZxg z<n%uvJ>Ys?YI^fL77;c>Q2R}5x;G!Vjslh6)9d(Hq@cwIq+k%Aeu|GpM*6H5q@*fS zJX_oIRQ@eE-+){9LDL!eS&SK9Og9BlAGc@nv&e$-f8lp#Nl2k$469sBAemX5*#O!D znXV+r;>TFFy-<*anUQhp^im;~mk`$)PoE^rBE^_AeXTHyr1S=V@Y1&ijgR-<7mI(` z&cqmJ0jX$rO@AoN0;+a?gQ%m^=eDp&GG3gnFTx@zeb*lnr%R{Jd&8=b;0VsV;Jp57 z`bB3J$>}vBEGCQxr*9Nt@nxJc{l5rHBjd8^jiM})jNhlv7G?33-Yx>k{@3^{^Mpjb zJ)!m*Fff1vTV%Sp7>hjP#p!b=vPeoZgBBh$Ff_<2JybrxskD=cG0qIqq2`^QEyf}# zEgcF;8;37>PB8g&Ap)EU!0s`aJ|CpOH55{vP1S0+ke2fGE;#Xk;)o%A`eiW|U&g}e zisCGijMdYvK@_-yD>*$+oaKTrX47i_^gsy~MaE0hizQeZ8D*z`m0&Su1a}!k6pTQ& z8izrOt!V-cj>fU;T$vc_KqCZ31`M9lV<lN6r6+|!LjB2`T~Y@W{$2zZ^=6<vft*Uk zryr7J5#bCBhqQ&_r{9-kku(EM&V$Acw688Mx|qEwhKVr)s^C*N#M*oJ_Rn2ywAYe_ z(Lm405R?^JBBtv}u}DaZML<+MpH}i|q5Zer2o)OB6Qx)r8Lg&QOR-2w`$RyhA_J#c z@!Q$>nGovYr+-vo5wQZBS_D<q!LlYJUeKxnp{f-s!y#y=y@PSe8HCJ?>3=~Mtcie> z8WO*L83vs)OGPL+Fx^m^MUwH#bZ==EN$D3*by`9i#*E#M7b4XCnJ$<JbBI7B#I(uQ zZ<MooXLTS{sX%2;d~1-eSrR%KA!9N9EXW?;>53|#{0a)C<mrquERu|s)1_rtB&GW! z!51Pl<RmQme{JGUM}*d;(;p@x^t=WsewGM{qub8XfBEe68<`lP36$Z>^tm!D#?maw zkn}Fk^e8Uy-Ma#CZ^A&&gn=P>I@kpFWJu3Ca{oKlIrrXbfK#X;sCzJX`owe=N$J(e zkTi3$w}wxg>1qWNqX8tNGHjh5EX!id2<}o#PG2C)BE?uTeYY%&B#hcS{k<%Ur1X48 zNTbD1|Ii}IQ-?*Mop%FJQLQY8y{HBcmoYF1PA`;W0Sz5>%ds><DoDxcYVx2WW_qC@ zi`evTc@}d#&F4we@5-~dGA2w{R$#GaTrxdgfkje!b0(x^^5kyd@yxffanO>_5VUMx zUy(&@`bq^BS;h;~ZR1%anV3VT*X6TFF!oOW4bnR!3%usIVNJf_mYjFV^Pu5r0M!du zFU^_*3HZ><Z&a%C1tJke!~E&BiY$_*M=~Mpg}*tB8w!+MZXrSicd@f&`e{WLNya17 zpDMB#OCNz+QSoB&6#0Ljjluo^l>-cr4(xOvB^E!%4bx{UvCNjv$%CYn+*AHyzK<LJ zi!g%LNP$)vT1*dAW=V%cquBKG$}F;spQgW6W|5Sh0nG&`*aN1!y~sTTPKw5$;sTs} zB^lRDw^m`1l(vY36od1m4R&3AnH+^s=QBNDg$2~`W|UzOVFPOgXEYIZFq<V}`aTsF z3F#|Pi*7fkxfxEobr4|yINyWv2Dd7UBqKBjfc3tZZm)_fyMPryaw^19vFW`a#aK%Y zu;PEy4}vTZn0^~XflDQ*dsU|MtFcI$VJ%v~TCJdko0-p<Z3`!DsX{oOt9*K#8jA#@ z@bq#u7Gp+m15;eqkfF95lEw22J$4B+D4BuN26zN^^7Q*^ETA@yq9Kc<^qO)=U-I1h z$2YDXlc)i!1J@pVrt7M+NJ?KShiq$6y|ceXbnp4~2nDaEC#thZGO<)luTf`_kd~}~ zY?E=)w|K|CHvJ=1p#cMf@$~iTERv?46_AoQP|kGm*5657Pz6Q|3^7oxHqU-_`NU*8 zKxGUV7|N#q1v#Rx0uuX7^Qr{%?3OKrDllYVSUlZOg9X$n_10jKl)h2{>7M;NdBW@R zb!kxF#T-(bewkjc!6IqOUkPbj-(46J6SF$-D%2nY1_s?qh(C4aczP{$Xa@~_LAAP0 zKMOKDy%N%;GwfNj@l&OP0aU9Y14F}fMokt;#;Mb#HCZI3H&#MI{=k(5A6xxSJ0sK` zpYE^8B58IPYEa3>Bfd(L)AvCY7%(t=tAylNou0%Vvz>P@L1hdX7?`T2&(mZvVl0|| zQIo}&@&0sqEfz_}_0t7)StO?iX|Xh6Yjv1IhTQ*7e-Ba&Y4<X**GyN@X7OR{m|m#O zV$3*c`ciEcV`<k~NY-sX8SzJ1+2%7Mp9fEO)M1f?C>LWfW?+B{Kq;^>lG96cSWF<} z(IV6L>abWs*=*pH1a>AYZ894&ET2Bnm_>4Wg)WN}B*BWXfs2%#)7OGJiys;wZaF%E zyWc+S1s}B3GGbu(H~pb5+}n)vrz;w=7*9W7#3BU=31b)q$py@Y3{aa1Q(#l3n;Ec3 zL4p{`wP4NA{9-))4M+)!5Qe1???KFg>4PW&4VbAK!Luo|Ap<x*!G16SI{~5#-F75C z*l@T<!P-HgXJ`iTtKoDP6BZdrs7jh*_7@$xA+1~AZb*IUejsjowWxLxIE=v~b`jIp zn;<$wV4v!-f!plhZnr3_iJlpQ`E)~57D>j)>E5O+zKk=czcyo$l-}I~DFABs1UFb8 zY`+Umy+%fQrl59v4~r<Pv7RvlxK{#VS~7rpFre<r!=KEe(+$j6Sft<fKx(vh)=3(- zt#983w}!zb;J4}iW-P|i|9c>f-4Bmzwlj(!RbpZ^)C2XV85k6&&jmR`+Z^JtEkEUM zO=y_6Lj*K9VxVWBYXI&7N)mSL?&<R8ERxcorMaNt-n9!|%o1xKfcj*h*&{<!2JPt! z%~@dXW;N0?G~GR&*A3PS29-r%p49Yi3-Cbidywkz>5d2`(`_tRq!=N+T*mLy3qk6j z%AuWW;pzK9g3u1G<#a(S@aQiuXoM4NKT>BK9FEYj3uvzwix5->)qJSIa1&8HGQGlz z#RM{*Dhcb>-Lqm5;e-v)=}-S{#p25tJ>AoqC7m&I`bKMT!=cuLMRNKRYnBYgvgy7y zEa{Brrf;=j@ntLnHK!z}%h<B`F_urywq=o&*)<)~@N2O1-}k*CFbJGvz-0l$jOhz( zStOVsv?yr)Nq_prPS8x00fYYZx3(;j($+H}P5w!T(nF`O=Iv!-G}i;AF$M<T>56tN zzKn6x^X*uS8PlgP22tSNmn37&^p7AOcrZ(9y1hM%q-p0&h%;7hkFSfKp!5mcXMt3f zGa(hvEz60McpsYo05@I14qP$4*PcZZ(s7oWe$bu;V=&Bt#gB38^wkb5zS8?=LaM%R zYnZ35ul-*Ow!i|^M7}g#*pbDT@%8jXNALhrwIfR-WA5}uPtZuU6N?FS@N0UC6H5l; z=ILjhSbXvHZ$T|{L(pt4sDCSc0{i5XIRgX1F0Y9mIM+eCyo`|WW}Gmc)rG}Z`pX<h zXk`?y`~Qo7b*2bp4%iS>KIgiy7=uQGTv#L-mrUR7!XhbsbS`-FPeT@mZRX-vtXbeV z1{Vvjr@sfO0~aQu@}P_q*#imgyJ7x^cE0Ha4T>4+fjeZUr`x)+7&DqqFLY(mR_2}u zspqj4IfkIV2RKQ?^CAjQdis3G2=UsR3YQK|s#*YX5oq8EC6_Xy<OW7?@<W+ln108N zMT#+f`gb=LU&x>ZXgm=#kTku*okd4FWdUReZQlY&fYnSq7{z`-VJ;KnhUxp=S*#fs zP5<rAA}PHk2hs+s+As1zL{Ri6qQSp$y1oaCF(a4)waGzQOZv(pND*f+A*}H7^MVF& z*$pnC?@!<80q*Ia_5h9GErE0$gY3G}=PtXU4o<t^VaT=9|9i0bLi;+>3zkC6<I)qU z_wWn`H31FvEI<S6kaWmsJ$<$(OS;Uz<&eTTW@k_FWeIj6a2o+UO2xinx||n_1S|}M zrU!bl7&A&uZ}nnnlonqF>HRHR)xTlgj2WQ8Qv*FC&^(6kbVY9#Nk*`8$>|~9EJ7SP zt00MGy21x$DJIs{)9?6z8@C62SR|+K@n+HCP+SdZBY{;g=1=GLVUa{r2;)vK@?kN7 zaTtZCgA76APUrJwX<}@eKGB!O7*arqO~38SVlKUX4Wv29rCt;8QexRB@N}Rls9$n^ zx~?CKr1YINkitji;M5IXQ$!Af6c~f+qIc61{UCW6q)uclB<o*pnHRa@wao{RIwL(p zb3Fs~>FfPiBu#zSLYh0%<GS;e1I|nlVYFQfNe|I$A-SO;KBk|2@dZ_oRy{+|SW3b4 zzaX>g)<P0idU=BjrzKB1SOK`n)iK@BpT$`E#9Bx<^rob-As1)AJ0c0(oL=wG;>-AQ z`dNP#Nz)%|p`N++=eBwHR**VlJ#doZS_cVkZa$^HD92z>V+>T|8h{pRNC&V;$|$Xa zq_PuvihLI@Z`%q^6;Q3y0|Hniq!Z*I2_XMNxr<m=2s2oP2`GJCo!%V40-6Ng9>9{$ z2riL9Gq=HkEWS((8@DeCWHDo8OrL%;h{c#uU^;Iwc$5x2rDYq;A`6|~k~3vsfbC?@ z_*v7yVh?t|p&odyY|ixlU=~T!RhuD=cZDM#m~R-m2C^_3>4BZVaCkGM)uQeD@=@J} zD<=^$cc<SCW|5Tsz8Nxz>8it^w&3Q?1cU;i>4G6Fl8n03wL@4Wr9HPmMynq?_jMjU z=Q|alE^T^z2#cg?%N9tnQ@v=eS4H?uM}&gKP?`Hyer6#bo%0bgho-Lunf+)B1A`(1 zLxX<EUCWENoshH!PJak;L+<q7Aa(V-Adzu4KGMvjVGby^KvR|m3=ET}>xY8EVHYGx zeVzWkW8*is+0fBVQwE0pyCCVbTQzTX$cB{H;HDQi9xqL=4P^n%VuEIs7~f9c2;#{i zrdg$#c0*Fxo0iKzx%nJG6BdS`6mDoDJpF$t%U0-Q_w;jNEZd;N&(r6Hv-mN}O@ABC z@)FXvkedE60@g?nn;sg;V$P^Oy*HA@7*?u)Cqg9|EvJ8tWbtKmo$ee3rY1(QNHT^^ zUmeA=6*5bn4lz%B`h#c|Gf4F*GF>}{C7AL0^!gYUNyZ1$=f<)~PTv&6asgFH`ph0k zN$5LspZR01o^_x#8Q{vE;rjH8u`H5|kEXwlWl3jzG(9+u#hCHK^!7NGM(7Z_w8ue+ z=ItxhUi4l(bOu^18#6FKhIwRGIYKhJ>*3_&v+AEgZEj1*3Inb~(~II+jAXEma)PJc zSR$q$h{rX`3046ePXM#6rt>D?8tMcqh@bA5z#_?5G(8%m4(qrBSlx{2{U8Nchcv+o zAR{eoVD^>icR`A=j%$JyfJaLt83m?mC$dONV;#Q)tFxFM51Ri64*-EWH%6e5MDXYi zSh{lhT9AIMgP33i;2|8)h~96Ix{6bfU{?wd|MGVqQ=AB7O`8z|L)&!yBo;~ODW@P2 z*RQs)rgL84F0cY4OFa_?+v&+kEXLB_ry*tFo|9KnAEp~XmN$UYMfmiMNi33#Y12=G z3@SPeDUQ9Tw%s|)coj6W4_%2<GyQ)Oi=?UTX^2yHYgyUJ+IhofWDOV?4xNS+`F%Gv zPwM9H22C}A+Hyt=3{Wd1rl%*fq%&$vKcCDZDP462;$+3!`f=)UiqFAI6Tl7D<mt>Q zEXIr~)6GHD@#)#1r3B!$PvA9N(6t2+L#JO#VUc2lve{Buq#y%yl8gxTGp2{8vVc}P zfR`jdlrn}--<!%J$rv^LdMb;rblL?-nRD9O&3bzEQhz4KI?%|f0RuzTbo(?GNmGq8 zP+wnqmb9XHOFI)|9jH-f$iQ&F3L>+}_?qARr9aKVGT{0PtW`|TfPsPe5+r0Kg@kfK zl=-iK8%N-BNqG9fG|>1{^7K1tEJlnn)A`d`BpHpSYo@bkbJkpf6zkxs9kg!AKZ`|@ z5i;J)cxU=*(6IB%%MhbiRQ}61ULftr0!kT%AhVB5zn{(`DbsTWqTt7`>Wo7XQ<gF@ zmR^C3%`%5h-;lu~;lJ?;#0M#nhY!u;U%<-5IOhtagvByAYXPZJFJFQ5!40`SzSeRR zVPRt2e+3eR^QTv5ut>^a8McM45P@1Nvo!^h(xMpW+;;muA2j3+N-l;B3{Vw}z0?0@ zfJX1GLfjX5%q-}Y*UvZLjt4lQ?3!+v37!M<&IG5I`b-vMX_f1cCSLQkFtx{}E|BGT z#-QbDDbvqpvPeqjU58`^!O-w!%M`^yOHV*?365;WEbNm3&>F~nx_=f+y7ZNs5T{RE zv0$akgqfhe7O1IV$iM(zts)6YgJN=)3=H>fLM(gpBk69uFoy}WvNB*`I5Ay5n?=&} z)lG=+l&^IiT)3pB99-mrhXZ64Ahp@y>n?8^pI57ZWx!eX$MoE67D+~)>FwDp=cVu6 zg1BbFx1|eq$uc*A+a_k9sfmfx3v*Z`8DC8A&S5cTbe_IHhsBtQ`Ofq&IV?Vmp3@z3 zS!Oe_Bu~GW%Ob&8JbhvbizH*+biq89M(HQ_AkOBAo1^edCrln}CfM!|)7R#)NJ=x@ zha{r@<@F{lM%9q@S)gRcuyy*wJQhjD@aezvSd1Aprt9akNJ0kt#HPpRvxstScmPR} z&?y7y0}mkX=Z*cQQIc{o3EIFjVqiEmeIrQoiRq_7)RF0+SqISY-PP&;^I0U_A3cC1 z!l2G;>*ON5K!dR+(DjGdTnBbOX1aVkJ-&cNk@3Xz#sctc@azH>Nomz55H~iIy}lCe zW%dU&Mg!K*5IX%lNFC2~?`9Us=}d(zZk!5FA)}?+rUw?XNHSJU&jwN8)&;0qpAX{c zfmV`AN~b)7G&6!<i<yO0W_|^i1mONh>GZdSEUuh&&miG?eY$lKi=_0^XOOUI-jI4; z%hDe-wF+t!nlmuGpPpaDVk}+x0@5%&eAC}hkgw=G*g$Z<7i>Rd5!v)>MJz(_ArG(w zXyzEa02e%6E<PP)Pz0hv`t?glP6};H<jdN&xfvWW;Gzw(KzI7GViqaJFVhbevq-`k zEMRj$n}5X_7#e0x=PzMN$2PeJEepVj&K2&my6N{zSR|zx-#`++K*Z%LQBk2KOpKs8 zZ_p7VBGZLSS$rA6>$D{q^`}>tvKTYIp1!^myfANJ1&bJqIRkWPh4IJqzojg`Of2uG zf2d%QkQR6k$!Kkp3x(fG{$&CeBj9pDZhCzgizK7o^qFNW(8X$!)5=*g7@ekPmb0XT z+UVshAnSamvq(x$kcDK8I+c@qtQo={fJ596)ENY?AQGEyTESw@=rldIf(5i>Y<($< z7>gwX!{g}-K?3^IL59fSHU#2aBS@o9Y`SG7OCY1(^zKUVS_`n5Pp9t(@h(okSk3|- z&4vmjPUo#+ku-hw5t4Kh18>iHbgRxDTp@wG%q*WEiRtB=Fl{CW=4nif-#$XZM1Oj8 z6^pNF?<Yv=T<I@+an7VmyTK6-&eXR*K{{7A*?XUdxA(392c8jV@TX$>-6|GI>7LJ! zINMk4=DF>np8!;=i7~_c>4KoeqU)z?gD8mq84pj7uV#@nJ^vXJme+6Z;WzYRg7mA+ zKsMg~45|AZSTv&^>qmgr9~tO@Wxh^dTg@UV&G`jl;l&dLoad#lff6TFfz0%WAe+F^ zFDb401yV1m9-HYO@%LIE$YBP0pc>M4x_%9dv9#wGNT^8en77h?p$25m#}wqX;OVtB zEXItn(>K<DqY^Z{g|SXlfYDIT7__vIA#wWu8Wu^@+g~81Qrp4O_Vun^4xou(Gegi= z!HX}D7SF8X!d(X}T{j|R4o`3FVv&^o`~{MkC+(0jasPDdK0?9m>5a84l8j%cpP$Ym zDZ})YfkB0Vq2bX_?vw`0WoHoTIKNE4P|G4=s`eF9gR8UZWd!>D|Bp~%{T0%SbPTOJ zDk#~t0U;AIUA7Li&h0B?)L@$JJ;jeHy2S_ub<+duSR@%IPR|CZ+wv9CpIf^qeA3?j z1<eR`GSeNWut-W@{mQ_g$-vOSaPgyu-|;su5DNZHKi|b7$tW}ZEyz5L>Fo6^+MJ%> z7#K7d7#a$vTi3HlN}sfV_<$j8-;uWy3PCGtjUWSh;L-_Nuyxe4NI^R<kP=98`n7r% zDflwj{nNP{SR@%C;XB=~fkjGM=sP6g%(67&`nT#9Xf?jEo;fIfz$-b$SWFohRHyeg zut-Xqe}@Fcyw7u-#O-S4fYOehA*i_apMJ1`#aNo>7NoSkW}RWeUii%)tiTeqSOGkJ zBPwsGXK0Z59g=sJ{n>o{a$z56;1pDb8!<3|r<6rm&Gifzs;9>`vPd#^O)qa`F=m`L zeKm*&UNRuYVra;)WcvL^7D>~C-yvzMNz8Ab<^2OMz)b>hQ)nkQBo*s3PM#ijI`Ip* z!Zy@1GG{n9UAKuvlJWX<!)6wd>CsIr@{EtCS2wXp%KZ2aDc}EeET44aT%jmf4|qfY zwu%_p9U^Stb;BFL3&3Oz7%u&Qq~^ZZ+)Ngm$95py=6WW2rVL=KK+O~HW)@#Y+37Qz zS&SL=r=JD!R!x^~VUd*H`4f^WZ+58tvy1Kkt@Sg23}&32?%%><%m}S!p@Y1urf&xc z>P&wP(ro${;@523DIJBE?;Hn*0=R@Toi5+XBFU&ay}zABQu^XQ$Y90k;@-u%ft>$9 zmAIjyo*4tfhv|YHERxc~{~;Ck7p>hp(>Ql1A{1y&UkEbDZhCwNc#}$D8+e@jeJhKk z^eje3@Z#1T5tdh{>|ywg&;>D;k$bvr8(!<LP6wL@b>?#>M)0EG{_HvNYQGL&2Ac;; zWKd_CGBYzWC^0ZJ%-+s@z2ETDJ%j>PW<~~3MH^>pR`F3LbUi}GW;$;>izK7}^t&J` zc)BBqf>_9iV!bJD>v5Y7H5O_f#M?xNCPbGsZhN8T;kMp&`a@8(fSVVfMdtjVmaFV^ z{Z1BRSXQs;WHEsacSCYN*(C}iN+H5{Yx-<ZS^b)gkpZ;M>reBp*FqB<GSNymZAQ=O zzq?ozq3&S}oxX4q3$&F4Dv#o;S;U!*8RVw7cEcSFRW$ugH;WWx0s=HsX%3ls1m$4s z9(Y*>nw$plAmjVexYyf)XC^=kjU71|!R2e<&BO!dXG}qh;-O2fQDzpPYiAknO$RRr zhRQ*L5at;Oj|p1YK%EVfg!oh%cO3=MJw2w6MGB?|A_OxCQqRDRhe)Dv8AGPK_rpU@ zdLAz$gAfBl!>WvIamn@Us^InsxJZCZc}zdi&td|Z=+a{|(=%jX*f8C20*fzW$@KaO zERu}%(`Q0>&nK`LL&grUF1`fyP{CUb@l8${BTY_$7f51Rj|ti+Wx&AjYWl^Aa9>Q9 zn}kuD<$#2s2@n#p&@dx1Ide>AF=0G5-F7mIF<L#jWHO5sY+Mo&#IS@8X$U~=VT9D? z(8_xHi!K%cW)Viu>FrZktRa(X;>?B&;Jql4j6bG7oC<C!3r=P6W!ybI9?p|wJUM+b zND!(7A~#)R8cPP_`suaPK!eX{4KdKPH)!D%14GC3jnh~p8ShO$4N|v5gpmQXf73e9 z=FK<Fl8>Mn1Bkjq)BjInku*Ik!pH#HZ|7GZZMnvFVhw0=52E0X2qOb%&tyQmdH0OC zSyM$A<3I-uf{ynCx65H601XdFt4kVplL^uulg8cJf(9idMN6mQY+6ABxo~>+40yw6 z`n(w|Qj8m>zXb_lqoym&WRYUjpKd*q#aL1wx(h35O-y34{4MD8hq0c~bVE@V)9HF| znWdz0%n=)c)+m9O3Fb$#NHLmBzu?6pGyO^+i@qti9h?b0bvFC(ou_>3w)3%oHh6&= z=?s$MjNoI1Bba91RLhhDwcic(45!NpvPe%44q}m=?jX-1KD}0nMT*gA`kZhU8IU`~ z%s@S99BwgSV93cVF3CvEW3YI1@<URXIB4CWp`NLp*>nRN7D+~9u<Im?GZKpm7#J9? z-CusD@BeJje4~M$v5}tH^gt~ZF-D{52mUilvVpsI;C*MH^<)*$lX71*tq6+SJ0G+% z1Jn>RG+}_O4mLLeO}8Y8Gcs^8Ff@p0d{5da+aU%j*bVdy4Hy`b^K<e+hpElEtI!^} zi50ZG$^<kEI9(x!McfJ;R3(W;x@pA>4DU|3WlAr|I05b)g647=*d-vTmgm~ElFJ5n zL8DHfUB`wD4B$~3u^=M`20;l%1|9~61{vkg=av|TWq?aD&|DeAoXwDqn#7BLdfxq| zpxtg}kdZi9&@sOZ3=Ml0?bn_*`Kb+fA{boqfz6eyFO`7g2AS`zmtr{oRDs%Qka?vR z2}TBC28M>4t#%vMt7r8?d<r`9GdD9YGdHuiWaix|+XCC3f!2wEX3UHk7^X`wf=_ea z#}yc>q^<uK>_k&g>v<{EAqkKCa_sqIK*La=(5*LQV93i)N!3kE$_%qGdg83T4m40> z3~9?3l;(nBk-=@#LDr^OTN9z-Wx&7yJFEEpfjiC1WM6}Jor0WT&VVZ<4Hy`(guW4I z=)eG9&|;25L-w*w{~*XBT5kv$P{QGDBL)UMKENDG2bKCJ3=By*kmBg5mhai~H#OVA z4OmdxV@Q>Rv?|mYm$+4Jwfm$1?ooi-<VBK@#L<<Y9`gN~320u-P|skxKt79{SNLg2 z$MN)A)(A(n{h*bS&;iN(ykzi(&J!D)X3nTc1O+{GOK4JQS{mrs@S~nCJsMR9`@tiV zrXcgA<xChDuo?;8v<V)b*ON8WGc?9<FW9*tXZ7T=NJ<+rFt|uV(im@HpR?5C9?;?w za2+}wqyUsQ!lfZTKJ!?{JcQXBGF%HPAQ-+#Lz3F=KdS}pO_rpC(+0TMDUyL4f9;i4 zEFKk|_zs*1!TBUJ4}4HN!^yfy1)Dh@mVpO9z{6qKlC&ITabc|t#Et%IFP6W(E@=uK z{Wk>VYnghIA{Z3vrVI>8iAAZPa^TO)d%1hMST93MOhX0+QF%z|GO16>(PiVj^-viD zsGj^{hCgeXCZ5^q5f9F%hI;h|n3}*+;4rGX4(WuYmdvZaz2d()Lgt7(B#b64SrK&f zXFOy_Cs<E$Nl|KIZUw{cm`RZh_c<8BdcYeaunnEF>wybV;>OM;>km0WdZ<X-i9j<c zpejZIl74rwE?mNLa`{GZQh{tVa)$KhE=H`n;Q3|#Q?Lx!sfQFGNq}7>UZnb^6KLTs zXx)Vo1A~Yn#CzZJrZtIhEmH<30b{-C`e7{6jNm%Yf4UeWi#Mau^mT8UWv16LvSdKU z)I_GYvam=^U;mDob@~Jc7I7wHhUtlKnI#xarVB)~$W6~;Vi9IBG}1Ge-pIrv%?RGa zC&FkvJ?%ZS)pS2m7K!OB%&;|0$Y$j*vlud(OjBl&n_lpN8QBQPfCaOmp3!sxUKR<^ zaytgd#$ecnBj~cOXwZ&cXeU8}(Qx_&eio_eXBb(eFkBAVnh4p=#A0ZoXE<Gumqpwh z)N7Pbgp5f<F>cx8d3cgFIAqK~^B<gwkWylK>f4DfH-ANnFvb~!3!>?P0xS}Y7SlH{ zf+wHA)xQugix{(!p5gS1UM$j3`ytgTxOi}4hpZ_0DVUo5&*bb(aGZhHmVif5;KR$1 z{jeOc<#y8>Y*?hG&*5iz1vQclJbD4%f@#duraHY~CW{0kcu}6z^u;q-e3@pdPX9EM z#fNF8+H{9mED}tM)u!K>#UdfINsSS_mA#JpW?ZSnQ4eq`1}B=sYSa5>u}GL*RbvDn zKCn`9%H66k3s-PJfDZzBsRrqBD|veA=byhg3#=FH5SZyR)gZO?HcggjrCZ&gl?2dY z^Sj1$f!QpxrvI4DB87T@$8@LJEYj1D&IS*5fEM>nH<-&J#pI+l-DfU~1mnr=sdHHZ z8Kto|)Ig;_cxSvM(`T*eZ|1Q`K-P(Y0ur=M-SnRpBrCi)x+3YfOCJx|H=tz7z@rVR z;BV&~=}}#@1teps2hLc}r{~URku;OmhLmsbU;a4u?e#?|aCHM7%+b?^wBH(~ZfGX| zkqZMCvEUJY5AErD=CepZmQF$k+uqG*(P7%FJzZu2O9!MgA;M;)XK2I#S(Xjzl0Iez z?e8{X!0sq;_3?Z<??M)oHE2wxI@6sNvKYyD=|Fs9A=kpRZq5k@5%}hdNS)~u7P3e% z@n}y^Si~YBlL$S?faNv2apCjJb>NjA;N-VZXZk&mS>JUS!MB4XTe8o$X>}@OVzkr) zpYFf_H3RBgcJOpNR7?g_R~&SG1CRFfDT`Q)q+jYn3h*88R8LI)$dL(7JK$OgGAY9J zNq736Md0W=_>Wn9y3S%28K_l?;E-k2gLG95r`^xrKl99KaLxfw_$BL2uUpKL#sr}y zrvF>a;>YBsKizK$iv&n8V+o5EXQw_S${<5s)3+>PF_A{!ug1byXP^h}<${YI$>}mn zS#(sM8$eP}QGQNNX#oR6K+bIs{-ur+MHpeZbD81voTV%hGWgOOIQ*F)p)3K}wJFA8 z#K5q9`rD-}#!Ssd)0LL7_%KZ|nqIJsMZzrF7*b9z{Z^3@%y$fO$_6-_Vx7GMhftdF z^nJ@%v~<=RLuw4%W@LcR4q{;F_&Qx=Ig3MmUTR`dPHJWHjcGe_?tc_aW)p#wc(>+# z`LA}d-da=yGT-ptQ919z_vTZIB9O7*Z<Sked_0v~OrYw6pIj`O_$Xe^Sp+gbxM^)v z>+;|Ut0F}pb1TnZE;ka}5uTMP0x4_v+8o<>F~`>E>U3#{1=U|&Botq5U$s~oVnN{4 z>3J7qqs_NTLmc$z-Ot@xTRxQ?ozA&}MV|4~bWI5538E%U&xBB&D_G<WS$9E(k7HEj zS~k@L{y;x&16}^r^qU}UuOC62w&?m+fsL1C>X;rwS_%_y@0=wwr&EOYF~ntWS91sz z=05$cFkN#ci#(&(bWaGC386YyvdBAmy@mK{+O2-2%sJmx7VASw$I7$o|1?!RH(jd_ zDT}Lfuem%(H{wRmBm4BHzgo#6r^I0Z>3*N++VtmeK;SY71Bf|~OPVqTQao=f8BEt& z#UkgfY6M9%w?nI!gs)bRG%$iBghugDzW*X7_iT(H<{Y(*54JC}y1oN+S|{j8eb9Nh zki+dP>=X>Af4IXeF@5<emgQ{vnYoGSsqLPtS+;wwW|a_A$}6oXfe7mBLTFv^f>FJa z^eWIzDwze-*Qc;5Xk`{ufD{x|=z`kr1|VsNw8Y|)%(P1V#N_1Ef)d@l)b#w4%*5#r zR<p=SR}>fP>w@lK(KQ5Z|1$+?NG>i;%gia6ezA;IRualdEz;N3hqHAJ^bDp?EN4}k z?sJNTZ~CU6EDE;Z9<IKwKA6^pbZ$YW6=&ua<fQ7Rr<RnI=H;d4=q9G8=9Lr_r6!eT z=A`Im<`tJD=1iY>kVPgPO)y7aS07zS*Bo>l2*}*jih{(v6y1{4+=86MlGOCfl8n+M z-L#_oT-}1i<m|-s)ZFZp%%TF_<ebFf;>_f{#DYv+u$|NYZDduHM|O?Au0AqX*Feu~ zy5R#B#pw$gSy{N#KtTlQt4%jJ$D#@nl~6PSHO9dX$xG4APt%1oQ`3rdlk-7d$}5>3 zc#=g%3P}KD3=(&GgC(n)Vk)w3eO-MNzOJF3$@GmsSrj>wK!K5zqiZrfF^W}r`tx#D z0cKM@^XU)WSrvIfO@2^VmF5=c8c*N&hedh%yq_#=vM{gf>*}M1g|2~~>GX#OSQPn_ zGxE#xz;O#^OxG7;Rdql_87MyC@uv$O004P8B{exex1cDsxLCI+wYVTZuQ(N|CpkYa zIdSSkR#_Q{HZZ>gVGM*nt(jHT5sM-Ey82i|b-_I_kiEH?xtYmuE2lgDWRaCe76Ew_ zMTxF4IK1?VlJ#}<i;{IgU2+SMNhztR1-hvfC8>ES#U(|V1-e<q`FXm@`MJ5N(3sQ2 z6bD5h7SZV!cCn~VpWn>NDx6si@+++G2DWaxqZX@zERua-Pr_|Sq&58*R#u_Jq)dHX zeb@kmuCbo^^ow<@O4HrGu!u~5bbv)c6_Jj0OG`3yKyE@8(lrDp0&OgLLSI)Oi>R)_ zbjNQj%8F=t3X~jCbJ_HR-&j<qgIqfOQ!=ac^p6^>DxmDZB7u}ibU`cd%s`=>lvp(V z;29Q0ac~E-Ah9GvUsoT_)-{@*aFIn>6fBSr@(7frYXnX9@?Zh5(NLByXi^niN`VBX zD{f~|k_54!*$-wsBr{G|{KBF({aGWcFr(4*iTtce)AbEmS*1ZG8E9xs7d#pUawmAC z3}nRggTbr{hB^5~AWmjpI$S9z+Vj$N4fQPb3_&`e$-THdv#Kg5bvmOUtBesO#Y2S< zNggVo3+@Sm^kx?8CKeSXR%RAYzu3nrBZ=UHf(MB={r>@0HC^n*cS$}d*P<5bCHY0u zx>!}GpZd-sG~GmqRbjf}Ll$91<LQo9S(K)yKV*?$G@kx&6N}<>o=+@dOoqnb;$wQp zX%_M64==GO2_`1z7v<^e>Vs)r3s5(01*_6@&x<S)(~qRHDovNX$RaRZ<r9m-^yZ5! zV$;8TW>J{FV<U^wbiwy5iqrdVv#?L!KY^8PdUh|X2&3urKvP!b=}$mOm*pU<!t`g~ wSoo(a>#!<pPdLaL%ED+oecMr1)9L?KvxrQuImW6y{q<4S+U;+TvF39F0F${|Jpcdz diff --git a/dbrepo-ui/components/table/TableSchema.vue b/dbrepo-ui/components/table/TableSchema.vue index 57169a95fa..7fbce1b6ec 100644 --- a/dbrepo-ui/components/table/TableSchema.vue +++ b/dbrepo-ui/components/table/TableSchema.vue @@ -4,6 +4,16 @@ ref="form" v-model="valid" :disabled="disabled"> + <v-row + v-if="showPrimaryKeyWarning"> + <v-col md="8"> + <v-alert + border="start" + color="warning"> + {{ $t('pages.table.subpages.import.schema.primary.warn') }} + </v-alert> + </v-col> + </v-row> <v-row v-for="(c, idx) in columns" :key="`r-${idx}`" @@ -79,7 +89,6 @@ :min="columnType(c).size_min" :max="columnType(c).size_max" :step="columnType(c).size_step" - :value="columnType(c).size_required === true ? columnType(c).size_default : null" :hint="sizeHint(c)" :clearable="!columnType(c).size_required" persistent-hint @@ -163,16 +172,6 @@ @click="addColumn()" /> </v-col> </v-row> - <v-row - v-if="showPrimaryKeyWarning"> - <v-col md="8"> - <v-alert - border="start" - color="warning"> - {{ $t('pages.table.subpages.import.schema.primary.warn') }} - </v-alert> - </v-col> - </v-row> <v-row> <v-col> <v-btn @@ -300,7 +299,7 @@ export default { this.columns.splice(idx, 1) }, addColumn (name = '', type = null, null_allowed = true, primary_key = false, unique = false) { - this.columns.push({ + const column = { name, type, null_allowed, @@ -309,9 +308,10 @@ export default { sets_values: null, enums: [], enums_values: null, - size: 0, d: 0 - }) + } + column.size = this.columnType(column).size_required === true ? this.columnType(column).size_default : null + this.columns.push() this.$refs.form.validate() }, formatValues (column) { diff --git a/dbrepo-ui/locales/en-US.json b/dbrepo-ui/locales/en-US.json index 46ab9b93a4..67d8d749e3 100644 --- a/dbrepo-ui/locales/en-US.json +++ b/dbrepo-ui/locales/en-US.json @@ -370,7 +370,7 @@ "hint": "Required. First line contains only data" }, "storage": { - "text": "Dataset from Storage Service" + "text": "Uploaded Dataset" }, "quote": { "label": "Quote Encoding", diff --git a/dbrepo-ui/nuxt.config.ts b/dbrepo-ui/nuxt.config.ts index be6fb2940f..8b2d381fd7 100644 --- a/dbrepo-ui/nuxt.config.ts +++ b/dbrepo-ui/nuxt.config.ts @@ -1,4 +1,5 @@ import {transformAssetUrls} from 'vite-plugin-vuetify' +import vuetify from 'vite-plugin-vuetify' const proxy: any = {} @@ -117,7 +118,12 @@ export default defineNuxtConfig({ '@artmizu/nuxt-prometheus', '@nuxtjs/i18n', '@pinia/nuxt', - '@pinia-plugin-persistedstate/nuxt' + '@pinia-plugin-persistedstate/nuxt', + async (options, nuxt) => { + nuxt.hooks.hook('vite:extendConfig', config => config.plugins.push( + vuetify() + )) + }, ], pinia: { diff --git a/dbrepo-ui/package.json b/dbrepo-ui/package.json index 5af18adf4d..856f56f4f0 100644 --- a/dbrepo-ui/package.json +++ b/dbrepo-ui/package.json @@ -45,7 +45,7 @@ "@pinia-plugin-persistedstate/nuxt": "^1.2.0", "@types/qs": "^6.9.12", "sass": "^1.71.0", - "vite-plugin-vuetify": "^2.0.1" + "vite-plugin-vuetify": "^2.0.4" }, "browserslist": [ "defaults and fully supports es6-module", diff --git a/dbrepo-ui/pages/login.vue b/dbrepo-ui/pages/login.vue index 9a412a0b47..8a35efe59d 100644 --- a/dbrepo-ui/pages/login.vue +++ b/dbrepo-ui/pages/login.vue @@ -137,18 +137,12 @@ export default { }) .catch(({code}) => { const toast = useToastInstance() - if (typeof code !== 'string') { - return - } toast.error(this.$t(code)) }) }) .catch(({code}) => { this.loading = false const toast = useToastInstance() - if (typeof code !== 'string') { - return - } toast.error(this.$t(code)) }) .finally(() => { diff --git a/dbrepo-ui/plugins/vuetify.ts b/dbrepo-ui/plugins/vuetify.ts index e942e529f5..39a5f8c75a 100644 --- a/dbrepo-ui/plugins/vuetify.ts +++ b/dbrepo-ui/plugins/vuetify.ts @@ -1,10 +1,8 @@ // plugins/vuetify.js import { createVuetify, type ThemeDefinition } from 'vuetify' import colors from 'vuetify/util/colors' -import * as components from 'vuetify/components' import * as directives from 'vuetify/directives' import '@mdi/font/css/materialdesignicons.css' -import {rgbParse} from "@kurkle/color"; const tuwThemeLight: ThemeDefinition = { dark: false, @@ -77,7 +75,6 @@ const tuwThemeDarkContrast: ThemeDefinition = { export default defineNuxtPlugin(app => { const vuetify : any = createVuetify({ ssr: true, - components, directives, defaults: { VSelect: { diff --git a/dbrepo-ui/utils/index.ts b/dbrepo-ui/utils/index.ts index 95380474e1..4f30d89534 100644 --- a/dbrepo-ui/utils/index.ts +++ b/dbrepo-ui/utils/index.ts @@ -1056,17 +1056,9 @@ export function axiosErrorToApiError(error: AxiosError): ApiErrorDto { message: error.message } return errorObj - } else if (error.code === 'ERR_BAD_REQUEST') { - /* timeout */ - const errorObj: ApiErrorDto = { - status: error.code, - code: 'error.axios.malformed', - message: error.message - } - return errorObj } - if (error.response?.data) { - const errorObj: ApiErrorDto = (error.response?.data as ApiErrorDto) + if ('data' in error.response) { + const errorObj: ApiErrorDto = (error.response.data as ApiErrorDto) return errorObj } const errorObj: ApiErrorDto = { diff --git a/helm/dbrepo/README.md b/helm/dbrepo/README.md index cc57a2a221..ac4868af83 100644 --- a/helm/dbrepo/README.md +++ b/helm/dbrepo/README.md @@ -49,14 +49,14 @@ The command removes all the Kubernetes components associated with the chart and ### Global parameters | Name | Description | Value | -|-------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------| +| ----------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------ | | `global.compatibility.openshift.adaptSecurityContext` | Adapt the securityContext sections of the deployment to make them compatible with Openshift restricted-v2 SCC: remove runAsUser, runAsGroup and fsGroup and let the platform use their allowed default IDs. Possible values: auto (apply if the detected running cluster is Openshift), force (perform the adaptation always), disabled (do not perform adaptation) | `auto` | | `global.storageClass` | Global StorageClass for Persistent Volume(s) | `""` | ### Common parameters | Name | Description | Value | -|-----------------|-----------------------|-----------------------| +| --------------- | --------------------- | --------------------- | | `hostname` | The hostname. | `example.com` | | `gateway` | The gateway endpoint. | `https://example.com` | | `strategyType` | The image pull | `RollingUpdate` | @@ -64,24 +64,25 @@ The command removes all the Kubernetes components associated with the chart and ### Metadata Database -| Name | Description | Value | -|------------------------------------------|------------------------------------------------------------------|---------------| -| `metadatadb.enabled` | Enable the Metadata Database. | `true` | -| `metadatadb.host` | The hostname for the microservices. | `metadata-db` | -| `metadatadb.rootUser.user` | The root username. | `root` | -| `metadatadb.rootUser.password` | The root user password. | `dbrepo` | -| `metadatadb.db.name` | The database name. | `dbrepo` | -| `metadatadb.galera.mariabackup.user` | The database backup username. | `backup` | -| `metadatadb.galera.mariabackup.password` | The database backup user password | `backup` | -| `metadatadb.jdbcExtraArgs` | The extra arguments for JDBC connections in the microservices. | `""` | -| `metadatadb.extraInitDbScripts` | Additional init.db scripts that are executed on the first start. | `{}` | -| `metadatadb.replicaCount` | The number of cluster nodes, should be uneven i.e. 2n+1 | `3` | -| `metadatadb.persistence.enabled` | Enable persistent storage. | `true` | +| Name | Description | Value | +| ---------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------- | +| `metadatadb.enabled` | Enable the Metadata datadb. | `true` | +| `metadatadb.host` | The hostname for the microservices. | `metadata-db` | +| `metadatadb.extraFlags` | Extra flags to ensure the query store works as intended, ref https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.5/api/data-db/#data | `--character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci` | +| `metadatadb.rootUser.user` | The root username. | `root` | +| `metadatadb.rootUser.password` | The root user password. | `dbrepo` | +| `metadatadb.db.name` | The database name. | `dbrepo` | +| `metadatadb.galera.mariabackup.user` | The database backup username. | `backup` | +| `metadatadb.galera.mariabackup.password` | The database backup user password | `backup` | +| `metadatadb.jdbcExtraArgs` | The extra arguments for JDBC connections in the microservices. | `""` | +| `metadatadb.extraInitDbScripts` | Additional init.db scripts that are executed on the first start. | `{}` | +| `metadatadb.replicaCount` | The number of cluster nodes, should be uneven i.e. 2n+1 | `3` | +| `metadatadb.persistence.enabled` | Enable persistent storage. | `true` | ### Auth Service | Name | Description | Value | -|----------------------------------|--------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| -------------------------------- | ------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `authservice.enabled` | Enable the Auth Service. | `true` | | `authservice.image.debug` | Set the logging level to `trace`. Otherwise, set to `info`. | `false` | | `authservice.endpoint` | The hostname for the microservices. | `http://auth-service` | @@ -93,19 +94,24 @@ The command removes all the Kubernetes components associated with the chart and ### Data Database -| Name | Description | Value | -|-----------------------------------|-------------------------------------------------------------|---------------| -| `datadb.enabled` | Enable the Data Database. | `true` | -| `datadb.database.image.debug` | Set the logging level to `trace`. Otherwise, set to `info`. | `false` | -| `datadb.auth.rootPassword` | The root user password. | `dbrepo` | -| `datadb.auth.replicationUser` | The database replication user password | `replication` | -| `datadb.auth.replicationPassword` | The database replication user password | `replication` | +| Name | Description | Value | +| ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------- | +| `datadb.host` | The hostname for the microservices. | `data-db` | +| `datadb.extraFlags` | Extra flags to ensure the query store works as intended, ref https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.5/api/data-db/#data | `--character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci` | +| `datadb.rootUser.user` | The root username. | `root` | +| `datadb.rootUser.password` | The root user password. | `dbrepo` | +| `datadb.db.name` | The database name. | `dbrepo` | +| `datadb.galera.mariabackup.user` | The database backup username. | `backup` | +| `datadb.galera.mariabackup.password` | The database backup user password | `backup` | +| `datadb.jdbcExtraArgs` | The extra arguments for JDBC connections in the microservices. | `""` | +| `datadb.replicaCount` | The number of cluster nodes, should be uneven i.e. 2n+1 | `3` | +| `datadb.persistence.enabled` | Enable persistent storage. | `true` | ### Search Database | Name | Description | Value | -|------------------------|-------------------------------------|-------------| -| `searchdb.enabled` | Enable the Data Database. | `true` | +| ---------------------- | ----------------------------------- | ----------- | +| `searchdb.enabled` | Enable the Data datadb. | `true` | | `searchdb.host` | The hostname for the microservices. | `search-db` | | `searchdb.port` | The port for the microservices. | `9200` | | `searchdb.clusterName` | The cluster name. | `search-db` | @@ -113,61 +119,62 @@ The command removes all the Kubernetes components associated with the chart and ### Upload Service | Name | Description | Value | -|------------------------------|----------------------------|--------| +| ---------------------------- | -------------------------- | ------ | | `uploadservice.enabled` | Enable the Upload Service. | `true` | | `uploadservice.replicaCount` | The number of replicas. | `2` | ### Broker Service -| Name | Description | Value | -|-------------------------------------|----------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------| -| `brokerservice.enabled` | Enable the Broker Service. | `true` | -| `brokerservice.image.debug` | Set the logging level to `trace`. Otherwise, set to `info`. | `true` | -| `brokerservice.endpoint` | The management api endpoint for the microservices. | `http://broker-service:15672` | -| `brokerservice.host` | The hostname for the microservices. | `broker-service` | -| `brokerservice.port` | The port for the microservices. | `5672` | -| `brokerservice.virtualHost` | The default virtual host name. | `dbrepo` | -| `brokerservice.queueName` | The default queue name. | `dbrepo` | -| `brokerservice.exchangeName` | The default exchange name. | `dbrepo` | -| `brokerservice.routingKey` | The default routing key binding from the default queue to the default exchange. | `dbrepo.#` | -| `brokerservice.connectionTimeout` | The connection timeout in ms. | `60000` | -| `brokerservice.ldap.binddn` | The domain name the broker service should bind to. In many cases this is the admin user from `identityservice.global.adminUser`. | `cn=admin,dc=dbrepo,dc=at` | -| `brokerservice.ldap.bindpw` | The password to bind on the identity service. In many cases this value is equal to `identityservice.global.adminPassword`. | `admin` | -| `brokerservice.ldap.uidField` | The field containing the user id. | `uid` | -| `brokerservice.ldap.basedn` | The base domain name containing the users. | `dc=dbrepo,dc=at` | -| `brokerservice.ldap.userDnPattern` | The pattern to determine the user. | `${username}` | -| `brokerservice.extraPlugins` | The list of plugins to be activated. | `rabbitmq_prometheus rabbitmq_auth_backend_ldap rabbitmq_auth_mechanism_ssl` | -| `brokerservice.persistence.enabled` | If set to true, a PVC will be created. | `false` | -| `brokerservice.replicaCount` | The number of replicas. | `1` | +| Name | Description | Value | +| ----------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------ | +| `brokerservice.enabled` | Enable the Broker Service. | `true` | +| `brokerservice.image.debug` | Set the logging level to `trace`. Otherwise, set to `info`. | `true` | +| `brokerservice.endpoint` | The management api endpoint for the microservices. | `http://broker-service:15672` | +| `brokerservice.host` | The hostname for the microservices. | `broker-service` | +| `brokerservice.port` | The port for the microservices. | `5672` | +| `brokerservice.virtualHost` | The default virtual host name. | `dbrepo` | +| `brokerservice.queueName` | The default queue name. | `dbrepo` | +| `brokerservice.exchangeName` | The default exchange name. | `dbrepo` | +| `brokerservice.routingKey` | The default routing key binding from the default queue to the default exchange. | `dbrepo.#` | +| `brokerservice.connectionTimeout` | The connection timeout in ms. | `60000` | +| `brokerservice.ldap.binddn` | The domain name the broker service should bind to. In many cases this is the admin user from `identityservice.global.adminUser`. | `cn=admin,dc=dbrepo,dc=at` | +| `brokerservice.ldap.bindpw` | The password to bind on the identity service. In many cases this value is equal to `identityservice.global.adminPassword`. | `admin` | +| `brokerservice.ldap.uidField` | The field containing the user id. | `uid` | +| `brokerservice.ldap.basedn` | The base domain name containing the users. | `dc=dbrepo,dc=at` | +| `brokerservice.ldap.userDnPattern` | The pattern to determine the user. | `${username}` | +| `brokerservice.extraPlugins` | The list of plugins to be activated. | `rabbitmq_prometheus rabbitmq_auth_backend_ldap rabbitmq_auth_mechanism_ssl rabbitmq_mqtt` | +| `brokerservice.persistence.enabled` | If set to true, a PVC will be created. | `false` | +| `brokerservice.replicaCount` | The number of replicas. | `1` | ### Analyse Service -| Name | Description | Value | -|--------------------------------------------------------------------|-------------------------------------------------------------|----------------------------------| -| `analyseservice.enabled` | Enable the Broker Service. | `true` | -| `analyseservice.image.debug` | Set the logging level to `trace`. Otherwise, set to `info`. | `false` | -| `analyseservice.podSecurityContext.enabled` | Enable pods' Security Context | `true` | -| `analyseservice.podSecurityContext.fsGroupChangePolicy` | Set filesystem group change policy | `Always` | -| `analyseservice.podSecurityContext.sysctls` | Set kernel settings using the sysctl interface | `[]` | -| `analyseservice.podSecurityContext.supplementalGroups` | Set filesystem extra groups | `[]` | -| `analyseservice.podSecurityContext.fsGroup` | Set RabbitMQ pod's Security Context fsGroup | `1001` | -| `analyseservice.containerSecurityContext.enabled` | Enabled containers' Security Context | `true` | -| `analyseservice.containerSecurityContext.seLinuxOptions` | Set SELinux options in container | `{}` | -| `analyseservice.containerSecurityContext.runAsUser` | Set RabbitMQ containers' Security Context runAsUser | `1001` | -| `analyseservice.containerSecurityContext.runAsGroup` | Set RabbitMQ containers' Security Context runAsGroup | `1001` | -| `analyseservice.containerSecurityContext.runAsNonRoot` | Set RabbitMQ container's Security Context runAsNonRoot | `true` | -| `analyseservice.containerSecurityContext.allowPrivilegeEscalation` | Set container's privilege escalation | `false` | -| `analyseservice.containerSecurityContext.readOnlyRootFilesystem` | Set container's Security Context readOnlyRootFilesystem | `false` | -| `analyseservice.containerSecurityContext.capabilities.drop` | Set container's Security Context runAsNonRoot | `["ALL"]` | -| `analyseservice.containerSecurityContext.seccompProfile.type` | Set container's Security Context seccomp profile | `RuntimeDefault` | -| `analyseservice.endpoint` | The url of the endpoint. | `http://analyse-service` | -| `analyseservice.s3.endpoint` | The S3-capable endpoint the microservice connects to. | `http://storage-service-s3:8333` | -| `analyseservice.replicaCount` | The number of replicas. | `2` | +| Name | Description | Value | +| ------------------------------------------------------------------ | ----------------------------------------------------------- | ------------------------- | +| `analyseservice.enabled` | Enable the Broker Service. | `true` | +| `analyseservice.image.debug` | Set the logging level to `trace`. Otherwise, set to `info`. | `false` | +| `analyseservice.podSecurityContext.enabled` | Enable pods' Security Context | `true` | +| `analyseservice.podSecurityContext.fsGroupChangePolicy` | Set filesystem group change policy | `Always` | +| `analyseservice.podSecurityContext.sysctls` | Set kernel settings using the sysctl interface | `[]` | +| `analyseservice.podSecurityContext.supplementalGroups` | Set filesystem extra groups | `[]` | +| `analyseservice.podSecurityContext.fsGroup` | Set RabbitMQ pod's Security Context fsGroup | `1001` | +| `analyseservice.containerSecurityContext.enabled` | Enabled containers' Security Context | `true` | +| `analyseservice.containerSecurityContext.seLinuxOptions` | Set SELinux options in container | `{}` | +| `analyseservice.containerSecurityContext.runAsUser` | Set RabbitMQ containers' Security Context runAsUser | `1001` | +| `analyseservice.containerSecurityContext.runAsGroup` | Set RabbitMQ containers' Security Context runAsGroup | `1001` | +| `analyseservice.containerSecurityContext.runAsNonRoot` | Set RabbitMQ container's Security Context runAsNonRoot | `true` | +| `analyseservice.containerSecurityContext.allowPrivilegeEscalation` | Set container's privilege escalation | `false` | +| `analyseservice.containerSecurityContext.readOnlyRootFilesystem` | Set container's Security Context readOnlyRootFilesystem | `false` | +| `analyseservice.containerSecurityContext.capabilities.drop` | Set container's Security Context runAsNonRoot | `["ALL"]` | +| `analyseservice.containerSecurityContext.seccompProfile.type` | Set container's Security Context seccomp profile | `RuntimeDefault` | +| `analyseservice.endpoint` | The url of the endpoint. | `http://analyse-service` | +| `analyseservice.s3.proto` | The protocol of the storage service endpoint. | `http` | +| `analyseservice.s3.endpoint` | The hostname and port of the storage service endpoint. | `storage-service-s3:8333` | +| `analyseservice.replicaCount` | The number of replicas. | `2` | ### Metadata Service | Name | Description | Value | -|---------------------------------------------------------------------|------------------------------------------------------------------------------------|----------------------------------| +| ------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | -------------------------------- | | `metadataservice.enabled` | Enable the Broker Service. | `true` | | `metadataservice.image.debug` | Set the logging level to `trace`. Otherwise, set to `info`. | `false` | | `metadataservice.podSecurityContext.enabled` | Enable pods' Security Context | `true` | @@ -205,7 +212,7 @@ The command removes all the Kubernetes components associated with the chart and ### Data Service | Name | Description | Value | -|-----------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------| +| --------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------- | | `dataservice.enabled` | Enable the Broker Service. | `true` | | `dataservice.endpoint` | Absolute URL to the data service in the form of http://host:port | `http://data-service` | | `dataservice.image.debug` | Set the logging level to `trace`. Otherwise, set to `info`. | `false` | @@ -225,9 +232,6 @@ The command removes all the Kubernetes components associated with the chart and | `dataservice.containerSecurityContext.seccompProfile.type` | Set container's Security Context seccomp profile | `RuntimeDefault` | | `dataservice.grant.read` | The default database permissions for users with read access. | `SELECT` | | `dataservice.grant.write` | The default database permissions for users with write access. | `SELECT, CREATE, CREATE VIEW, CREATE ROUTINE, CREATE TEMPORARY TABLES, LOCK TABLES, INDEX, TRIGGER, INSERT, UPDATE, DELETE` | -| `dataservice.default.date` | The default date format id for dates. Default: YYYY-MM-dd (e.g. 2024-06-15). | `3` | -| `dataservice.default.time` | The default date format id for times. Default: HH:mm:ss (e.g. 14:23:42). | `4` | -| `dataservice.default.timestamp` | The default date format id for timestamps. Default: YYYY-MM-dd HH:mm:ss (e.g. 2024-06-15 14:23:42). | `1` | | `dataservice.rabbitmq.consumerConcurrentMin` | The minimal number of RabbitMQ consumers. | `2` | | `dataservice.rabbitmq.consumerConcurrentMax` | The maximal number of RabbitMQ consumers. | `6` | | `dataservice.rabbitmq.requeueRejected` | If set to true, rejected tuples will be re-queued. | `false` | @@ -243,7 +247,7 @@ The command removes all the Kubernetes components associated with the chart and ### Search Service | Name | Description | Value | -|-------------------------------------------------------------------|--------------------------------------------------------------------|-------------------------| +| ----------------------------------------------------------------- | ------------------------------------------------------------------ | ----------------------- | | `searchservice.enabled` | Enable the Broker Service. | `true` | | `searchservice.endpoint` | Absolute URL to the search service in the form of http://host:port | `http://search-service` | | `searchservice.image.debug` | Set the logging level to `trace`. Otherwise, set to `info`. | `false` | @@ -266,7 +270,7 @@ The command removes all the Kubernetes components associated with the chart and ### Storage Service | Name | Description | Value | -|-----------------------------------------------|----------------------------------------------------------------------------------------|------------------| +| --------------------------------------------- | -------------------------------------------------------------------------------------- | ---------------- | | `storageservice.enabled` | Enable the Storage Service. | `true` | | `storageservice.mariadb.auth.rootPassword` | The user password for the root user. | `seaweedfsdb` | | `storageservice.filer.enabled` | Enable the storage service filer which is required for S3. | `true` | @@ -279,7 +283,7 @@ The command removes all the Kubernetes components associated with the chart and ### Identity Service | Name | Description | Value | -|----------------------------------------|---------------------------------------------------------------------------------------------------------------|-------------------| +| -------------------------------------- | ------------------------------------------------------------------------------------------------------------- | ----------------- | | `identityservice.enabled` | Enable the Identity Service. | `true` | | `identityservice.global.ldapDomain` | The LDAP domain name in domain "dbrepo.at" form or explicit in "dc=dbrepo,dc=at" form. | `dc=dbrepo,dc=at` | | `identityservice.global.adminUser` | The admin username that is used to bind. | `admin` | @@ -294,7 +298,7 @@ The command removes all the Kubernetes components associated with the chart and ### User Interface | Name | Description | Value | -|--------------------------------------------------------|------------------------------------------------------------------------------------------------------|-------------------------| +| ------------------------------------------------------ | ---------------------------------------------------------------------------------------------------- | ----------------------- | | `ui.enabled` | Enable the Broker Service. | `true` | | `ui.image.debug` | Set the logging level to `trace`. Otherwise, set to `info`. | `false` | | `ui.podSecurityContext.enabled` | Enable pods' Security Context | `true` | @@ -331,20 +335,20 @@ The command removes all the Kubernetes components associated with the chart and ### Dashboard Service | Name | Description | Value | -|-----------------------------------------------|------------------------------------------------------------------------------------------------------------------------|--------| +| --------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | ------ | | `dashboardservice.enabled` | Enable the Dashboard Service. | `true` | | `dashboardservice.dashboardsProvider.enabled` | Enable the default dashboard provisioning provider to routinely import dashboards from /opt/bitnami/grafana/dashboards | `true` | ### Metric Service | Name | Description | Value | -|--------------------|----------------------------|--------| +| ------------------ | -------------------------- | ------ | | `metricdb.enabled` | Enable the Metric Service. | `true` | ### Ingress | Name | Description | Value | -|--------------------------|-----------------------------------------------------------------------------------------------------------------|----------------| +| ------------------------ | --------------------------------------------------------------------------------------------------------------- | -------------- | | `ingress.enabled` | Enable the ingress. | `false` | | `ingress.className` | The ingress class name. | `nginx` | | `ingress.tls.enabled` | Enable the ingress. | `true` | diff --git a/helm/dbrepo/values.schema.json b/helm/dbrepo/values.schema.json index 6f83a1d170..2248778af0 100644 --- a/helm/dbrepo/values.schema.json +++ b/helm/dbrepo/values.schema.json @@ -123,6 +123,9 @@ "properties": { "endpoint": { "type": "string" + }, + "proto": { + "type": "string" } }, "type": "object" @@ -514,41 +517,23 @@ }, "datadb": { "properties": { - "database": { + "db": { "properties": { - "galera": { - "properties": { - "mariabackup": { - "properties": { - "password": { - "type": "string" - }, - "user": { - "type": "string" - } - }, - "type": "object" - } - }, - "type": "object" - }, - "image": { - "properties": { - "debug": { - "type": "boolean" - } - }, - "type": "object" - }, - "metrics": { - "properties": { - "enabled": { - "type": "boolean" - } - }, - "type": "object" - }, - "rootUser": { + "name": { + "type": "string" + } + }, + "type": "object" + }, + "extraFlags": { + "type": "string" + }, + "fullnameOverride": { + "type": "string" + }, + "galera": { + "properties": { + "mariabackup": { "properties": { "password": { "type": "string" @@ -562,11 +547,41 @@ }, "type": "object" }, - "enabled": { - "type": "boolean" + "host": { + "type": "string" }, - "fullnameOverride": { + "jdbcExtraArgs": { "type": "string" + }, + "metrics": { + "properties": { + "enabled": { + "type": "boolean" + } + }, + "type": "object" + }, + "persistence": { + "properties": { + "enabled": { + "type": "boolean" + } + }, + "type": "object" + }, + "replicaCount": { + "type": "integer" + }, + "rootUser": { + "properties": { + "password": { + "type": "string" + }, + "user": { + "type": "string" + } + }, + "type": "object" } }, "type": "object" @@ -619,20 +634,6 @@ }, "type": "object" }, - "default": { - "properties": { - "date": { - "type": "integer" - }, - "time": { - "type": "integer" - }, - "timestamp": { - "type": "integer" - } - }, - "type": "object" - }, "enabled": { "type": "boolean" }, @@ -769,6 +770,14 @@ }, "identityservice": { "properties": { + "containerSecurityContext": { + "properties": { + "enabled": { + "type": "boolean" + } + }, + "type": "object" + }, "customSchemaFiles": { "properties": { "00-memberof.ldif": { @@ -946,6 +955,9 @@ "enabled": { "type": "boolean" }, + "extraFlags": { + "type": "string" + }, "extraInitDbScripts": { "properties": {}, "type": "object" diff --git a/helm/dbrepo/values.yaml b/helm/dbrepo/values.yaml index 5c76e6f8e6..15ee11102b 100644 --- a/helm/dbrepo/values.yaml +++ b/helm/dbrepo/values.yaml @@ -33,6 +33,8 @@ metadatadb: fullnameOverride: metadata-db ## @param metadatadb.host The hostname for the microservices. host: metadata-db + ## @param metadatadb.extraFlags Extra flags to ensure the query store works as intended, ref https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.5/api/data-db/#data + extraFlags: "--character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci" rootUser: ## @param metadatadb.rootUser.user The root username. user: root @@ -126,6 +128,8 @@ datadb: fullnameOverride: data-db ## @param datadb.host The hostname for the microservices. host: data-db + ## @param datadb.extraFlags Extra flags to ensure the query store works as intended, ref https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.5/api/data-db/#data + extraFlags: "--character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci" rootUser: ## @param datadb.rootUser.user The root username. user: root @@ -772,7 +776,7 @@ ui: ## @param ui.public.broker.extra Extra metadata displayed. extra: "" database: - ## @param ui.public.datadb.extra Extra metadata displayed. + ## @param ui.public.database.extra Extra metadata displayed. extra: "" ## @skip ui.public.links links: diff --git a/make/build.mk b/make/build.mk index 06e49be888..b71a9140cb 100644 --- a/make/build.mk +++ b/make/build.mk @@ -32,8 +32,6 @@ build-lib: ## Build the Python Library. .PHONY: build-helm build-helm: ## Build the DBRepo and DBRepo MariaDB Galera Helm Charts. ./.scripts/check-helm.sh - helm package ./helm/dbrepo-mariadb-galera --destination ./build - helm schema -input ./helm/dbrepo-mariadb-galera/values.yaml -output ./helm/dbrepo-mariadb-galera/values.schema.json helm dependency update ./helm/dbrepo helm package ./helm/dbrepo --destination ./build helm schema -input ./helm/dbrepo/values.yaml -output ./helm/dbrepo/values.schema.json diff --git a/make/dev.mk b/make/dev.mk index e95dee62fe..ce7b88e7de 100644 --- a/make/dev.mk +++ b/make/dev.mk @@ -13,6 +13,7 @@ stop-dev: ## Stop the development deployment and remove all data. .PHONY: package-config package-config: ## Package the config files + mkdir -p ./.docker/config/{dashboards,provisioning} cp ./dbrepo-auth-service/dbrepo-realm.json ./.docker/config cp ./dbrepo-auth-service/import-realms.sh ./.docker/config cp ./dbrepo-auth-service/master-realm.json ./.docker/config diff --git a/make/gen.mk b/make/gen.mk index 322bc66259..5875f1a737 100644 --- a/make/gen.mk +++ b/make/gen.mk @@ -9,7 +9,7 @@ gen-swagger-doc: build-images ## Generate Swagger documentation and fetch. .PHONY: gen-helm-doc gen-helm-doc: build-helm ## Generate Helm documentation and schema - readme-generator-for-helm --readme ./helm/dbrepo/README.md --values ./helm/dbrepo/values.yaml + readme-generator --readme ./helm/dbrepo/README.md --values ./helm/dbrepo/values.yaml .PHONY: gen-dbrepo-doc gen-docs-doc: ## Generate DBRepo documentation. diff --git a/make/rel.mk b/make/rel.mk index f32f34dc22..6a24d75a90 100644 --- a/make/rel.mk +++ b/make/rel.mk @@ -8,7 +8,6 @@ tag-images: build-images ## Tag the docker images. docker tag dbrepo-data-service:latest "${REPOSITORY_URL}/data-service:${APP_VERSION}" docker tag dbrepo-metadata-service:latest "${REPOSITORY_URL}/metadata-service:${APP_VERSION}" docker tag dbrepo-search-db:latest "${REPOSITORY_URL}/search-db:${APP_VERSION}" - docker tag dbrepo-data-db-sidecar:latest "${REPOSITORY_URL}/data-db-sidecar:${APP_VERSION}" docker tag dbrepo-search-service:latest "${REPOSITORY_URL}/search-service:${APP_VERSION}" docker tag dbrepo-search-service-init:latest "${REPOSITORY_URL}/search-service-init:${APP_VERSION}" docker tag dbrepo-storage-service-init:latest "${REPOSITORY_URL}/storage-service-init:${APP_VERSION}" @@ -20,7 +19,6 @@ release-images: tag-images ## Release the docker images. docker push "${REPOSITORY_URL}/ui:${APP_VERSION}" docker push "${REPOSITORY_URL}/data-service:${APP_VERSION}" docker push "${REPOSITORY_URL}/search-db:${APP_VERSION}" - docker push "${REPOSITORY_URL}/data-db-sidecar:${APP_VERSION}" docker push "${REPOSITORY_URL}/metadata-service:${APP_VERSION}" docker push "${REPOSITORY_URL}/search-service:${APP_VERSION}" docker push "${REPOSITORY_URL}/search-service-init:${APP_VERSION}" -- GitLab