From a9a6c1928c2b705eb318b236fc84a866814ec001 Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Thu, 28 Apr 2022 21:00:50 +0200 Subject: [PATCH] Fixes and tests for hosting in subfolder. (#875) * Fixes and tests for hosting in subfolder. * Fix image names. * Fix Mongo Version. * Fix CI * Frontend tests * Try custom build image. * Fix folder. --- .github/workflows/dev.yml | 25 +++++-- .github/workflows/release.yml | 25 +++++-- ...quidex.Domain.Apps.Entities.MongoDb.csproj | 2 +- .../Squidex.Domain.Apps.Entities.csproj | 2 +- .../Squidex.Domain.Users.MongoDb.csproj | 2 +- .../Squidex.Infrastructure.MongoDb.csproj | 4 +- .../Squidex.Infrastructure.csproj | 2 +- .../Squidex.Web/Pipeline/SetupMiddleware.cs | 6 ++ .../Views/Account/AccessDenied.cshtml | 4 +- .../Views/Account/LockedOut.cshtml | 2 +- .../Views/Account/LogoutCompleted.cshtml | 2 +- .../IdentityServer/Views/Error/Error.cshtml | 2 +- .../Views/Profile/Profile.cshtml | 2 +- .../IdentityServer/Views/Setup/Setup.cshtml | 2 +- .../Areas/IdentityServer/Views/_Layout.cshtml | 8 +-- backend/src/Squidex/Squidex.csproj | 20 +++--- backend/tests/docker-compose.yml | 67 ++++++++++++++++-- .../TestSuite.ApiTests/AssetFixture.cs | 2 +- .../Assets/Frontend_Home.jpg | Bin 0 -> 40599 bytes .../Assets/Frontend_Login.jpg | Bin 0 -> 41984 bytes .../TestSuite.ApiTests/FrontendTests.cs | 62 ++++++++++++++++ .../TestSuite.ApiTests/GraphQLTests.cs | 8 +++ .../TestSuite.ApiTests.csproj | 8 +++ .../TestSuite.Shared/TestSuite.Shared.csproj | 2 +- 24 files changed, 215 insertions(+), 44 deletions(-) create mode 100644 backend/tools/TestSuite/TestSuite.ApiTests/Assets/Frontend_Home.jpg create mode 100644 backend/tools/TestSuite/TestSuite.ApiTests/Assets/Frontend_Login.jpg create mode 100644 backend/tools/TestSuite/TestSuite.ApiTests/FrontendTests.cs diff --git a/.github/workflows/dev.yml b/.github/workflows/dev.yml index bbce0fcd6..bbeb800c1 100644 --- a/.github/workflows/dev.yml +++ b/.github/workflows/dev.yml @@ -90,10 +90,15 @@ jobs: - name: Load Image run: docker load < squidex-tmp.tar.gz - - name: Replace Image Name + - name: Replace Image Name1 uses: mikefarah/yq@v4.9.1 with: - cmd: yq e '.services.squidex.image = "squidex-tmp"' -i backend/tests/docker-compose.yml + cmd: yq e '.services.squidex1.image = "squidex-tmp"' -i backend/tests/docker-compose.yml + + - name: Replace Image Name2 + uses: mikefarah/yq@v4.9.1 + with: + cmd: yq e '.services.squidex2.image = "squidex-tmp"' -i backend/tests/docker-compose.yml - name: Start Test run: docker-compose up -d @@ -102,12 +107,24 @@ jobs: - name: RUN TEST uses: kohlerdominik/docker-run-action@v1.0.0 with: - image: mcr.microsoft.com/dotnet/sdk:6.0 + image: squidex/build environment: | CONFIG__WAIT=60 CONFIG__SERVER__URL=http://localhost:8080 default_network: host - options: --name test + options: --name test1 + volumes: ${{ github.workspace }}:/src + run: dotnet test /src/backend/tools/TestSuite/TestSuite.ApiTests/TestSuite.ApiTests.csproj --filter Category!=NotAutomated + + - name: RUN TEST on path + uses: kohlerdominik/docker-run-action@v1.0.0 + with: + image: squidex/build + environment: | + CONFIG__WAIT=60 + CONFIG__SERVER__URL=http://localhost:8081/squidex + default_network: host + options: --name test2 volumes: ${{ github.workspace }}:/src run: dotnet test /src/backend/tools/TestSuite/TestSuite.ApiTests/TestSuite.ApiTests.csproj --filter Category!=NotAutomated diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5072f5b41..5642a6ef4 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -73,10 +73,15 @@ jobs: - name: Load Image run: docker load < squidex-tmp.tar.gz - - name: Replace Image Name + - name: Replace Image Name1 uses: mikefarah/yq@v4.9.1 with: - cmd: yq e '.services.squidex.image = "squidex-tmp"' -i backend/tests/docker-compose.yml + cmd: yq e '.services.squidex1.image = "squidex-tmp"' -i backend/tests/docker-compose.yml + + - name: Replace Image Name2 + uses: mikefarah/yq@v4.9.1 + with: + cmd: yq e '.services.squidex2.image = "squidex-tmp"' -i backend/tests/docker-compose.yml - name: Start Test run: docker-compose up -d @@ -85,12 +90,24 @@ jobs: - name: RUN TEST uses: kohlerdominik/docker-run-action@v1.0.0 with: - image: mcr.microsoft.com/dotnet/sdk:6.0 + image: squidex/build environment: | CONFIG__WAIT=60 CONFIG__SERVER__URL=http://localhost:8080 default_network: host - options: --name test + options: --name test1 + volumes: ${{ github.workspace }}:/src + run: dotnet test /src/backend/tools/TestSuite/TestSuite.ApiTests/TestSuite.ApiTests.csproj --filter Category!=NotAutomated + + - name: RUN TEST on path + uses: kohlerdominik/docker-run-action@v1.0.0 + with: + image: squidex/build + environment: | + CONFIG__WAIT=60 + CONFIG__SERVER__URL=http://localhost:8081/squidex + default_network: host + options: --name test2 volumes: ${{ github.workspace }}:/src run: dotnet test /src/backend/tools/TestSuite/TestSuite.ApiTests/TestSuite.ApiTests.csproj --filter Category!=NotAutomated diff --git a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Squidex.Domain.Apps.Entities.MongoDb.csproj b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Squidex.Domain.Apps.Entities.MongoDb.csproj index eb77d918a..a20ab3725 100644 --- a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Squidex.Domain.Apps.Entities.MongoDb.csproj +++ b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Squidex.Domain.Apps.Entities.MongoDb.csproj @@ -23,7 +23,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/backend/src/Squidex.Domain.Apps.Entities/Squidex.Domain.Apps.Entities.csproj b/backend/src/Squidex.Domain.Apps.Entities/Squidex.Domain.Apps.Entities.csproj index 1a8830906..6fa338409 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Squidex.Domain.Apps.Entities.csproj +++ b/backend/src/Squidex.Domain.Apps.Entities/Squidex.Domain.Apps.Entities.csproj @@ -34,7 +34,7 @@ - + diff --git a/backend/src/Squidex.Domain.Users.MongoDb/Squidex.Domain.Users.MongoDb.csproj b/backend/src/Squidex.Domain.Users.MongoDb/Squidex.Domain.Users.MongoDb.csproj index 2ba42f114..27c55ccf7 100644 --- a/backend/src/Squidex.Domain.Users.MongoDb/Squidex.Domain.Users.MongoDb.csproj +++ b/backend/src/Squidex.Domain.Users.MongoDb/Squidex.Domain.Users.MongoDb.csproj @@ -24,7 +24,7 @@ runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/backend/src/Squidex.Infrastructure.MongoDb/Squidex.Infrastructure.MongoDb.csproj b/backend/src/Squidex.Infrastructure.MongoDb/Squidex.Infrastructure.MongoDb.csproj index 760ec1614..0b55c8a73 100644 --- a/backend/src/Squidex.Infrastructure.MongoDb/Squidex.Infrastructure.MongoDb.csproj +++ b/backend/src/Squidex.Infrastructure.MongoDb/Squidex.Infrastructure.MongoDb.csproj @@ -18,8 +18,8 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - - + + diff --git a/backend/src/Squidex.Infrastructure/Squidex.Infrastructure.csproj b/backend/src/Squidex.Infrastructure/Squidex.Infrastructure.csproj index 35f849641..1f56c70a3 100644 --- a/backend/src/Squidex.Infrastructure/Squidex.Infrastructure.csproj +++ b/backend/src/Squidex.Infrastructure/Squidex.Infrastructure.csproj @@ -31,7 +31,7 @@ - + diff --git a/backend/src/Squidex.Web/Pipeline/SetupMiddleware.cs b/backend/src/Squidex.Web/Pipeline/SetupMiddleware.cs index 99a364ff3..8f7fa3e83 100644 --- a/backend/src/Squidex.Web/Pipeline/SetupMiddleware.cs +++ b/backend/src/Squidex.Web/Pipeline/SetupMiddleware.cs @@ -22,6 +22,12 @@ namespace Squidex.Web.Pipeline public async Task InvokeAsync(HttpContext context, IUserService userService) { + if (context.Request.Query.ContainsKey("skip-setup")) + { + await next(context); + return; + } + if (!isUserFound && await userService.IsEmptyAsync(context.RequestAborted)) { var url = context.Request.PathBase.Add("/identity-server/setup"); diff --git a/backend/src/Squidex/Areas/IdentityServer/Views/Account/AccessDenied.cshtml b/backend/src/Squidex/Areas/IdentityServer/Views/Account/AccessDenied.cshtml index 519cc0630..567bf786d 100644 --- a/backend/src/Squidex/Areas/IdentityServer/Views/Account/AccessDenied.cshtml +++ b/backend/src/Squidex/Areas/IdentityServer/Views/Account/AccessDenied.cshtml @@ -2,7 +2,7 @@ ViewBag.Title = T.Get("users.accessDenied.title"); } - +

@T.Get("users.accessDenied.title")

@@ -11,5 +11,5 @@

- @T.Get("common.logout") + @T.Get("common.logout")

\ No newline at end of file diff --git a/backend/src/Squidex/Areas/IdentityServer/Views/Account/LockedOut.cshtml b/backend/src/Squidex/Areas/IdentityServer/Views/Account/LockedOut.cshtml index d11e8d3c0..04d9f25e7 100644 --- a/backend/src/Squidex/Areas/IdentityServer/Views/Account/LockedOut.cshtml +++ b/backend/src/Squidex/Areas/IdentityServer/Views/Account/LockedOut.cshtml @@ -2,7 +2,7 @@ ViewBag.Title = T.Get("users.lockedOutTitle"); } - +

@T.Get("users.lockedOutTitle")

diff --git a/backend/src/Squidex/Areas/IdentityServer/Views/Account/LogoutCompleted.cshtml b/backend/src/Squidex/Areas/IdentityServer/Views/Account/LogoutCompleted.cshtml index f7f882186..a7ef6f664 100644 --- a/backend/src/Squidex/Areas/IdentityServer/Views/Account/LogoutCompleted.cshtml +++ b/backend/src/Squidex/Areas/IdentityServer/Views/Account/LogoutCompleted.cshtml @@ -2,7 +2,7 @@ ViewBag.Title = T.Get("users.logout.title"); } - +

@T.Get("users.logout.headline")

diff --git a/backend/src/Squidex/Areas/IdentityServer/Views/Error/Error.cshtml b/backend/src/Squidex/Areas/IdentityServer/Views/Error/Error.cshtml index 1804080db..60b248f2c 100644 --- a/backend/src/Squidex/Areas/IdentityServer/Views/Error/Error.cshtml +++ b/backend/src/Squidex/Areas/IdentityServer/Views/Error/Error.cshtml @@ -4,7 +4,7 @@ ViewBag.Title = T.Get("users.error.title"); } - +

@T.Get("users.error.headline")

diff --git a/backend/src/Squidex/Areas/IdentityServer/Views/Profile/Profile.cshtml b/backend/src/Squidex/Areas/IdentityServer/Views/Profile/Profile.cshtml index 5a4c3a478..dae4db68e 100644 --- a/backend/src/Squidex/Areas/IdentityServer/Views/Profile/Profile.cshtml +++ b/backend/src/Squidex/Areas/IdentityServer/Views/Profile/Profile.cshtml @@ -34,7 +34,7 @@
- +
diff --git a/backend/src/Squidex/Areas/IdentityServer/Views/Setup/Setup.cshtml b/backend/src/Squidex/Areas/IdentityServer/Views/Setup/Setup.cshtml index cde4a5774..76725468f 100644 --- a/backend/src/Squidex/Areas/IdentityServer/Views/Setup/Setup.cshtml +++ b/backend/src/Squidex/Areas/IdentityServer/Views/Setup/Setup.cshtml @@ -67,7 +67,7 @@

@T.Get("setup.headline")

- +
@T.Get("setup.hint") diff --git a/backend/src/Squidex/Areas/IdentityServer/Views/_Layout.cshtml b/backend/src/Squidex/Areas/IdentityServer/Views/_Layout.cshtml index 724596e5d..132fd9814 100644 --- a/backend/src/Squidex/Areas/IdentityServer/Views/_Layout.cshtml +++ b/backend/src/Squidex/Areas/IdentityServer/Views/_Layout.cshtml @@ -8,7 +8,7 @@ @ViewBag.Title - @T.Get("common.product") - + @if (IsSectionDefined("header")) { @@ -16,13 +16,13 @@ } - - + +
- +
diff --git a/backend/src/Squidex/Squidex.csproj b/backend/src/Squidex/Squidex.csproj index 127746983..0103363e5 100644 --- a/backend/src/Squidex/Squidex.csproj +++ b/backend/src/Squidex/Squidex.csproj @@ -60,7 +60,7 @@ - + @@ -74,16 +74,16 @@ - - - - - - - - + + + + + + + + - + diff --git a/backend/tests/docker-compose.yml b/backend/tests/docker-compose.yml index 2ddce960c..17e652353 100644 --- a/backend/tests/docker-compose.yml +++ b/backend/tests/docker-compose.yml @@ -3,18 +3,17 @@ services: mongo: image: mongo:latest ports: - - "27018:27017" + - "27019:27017" networks: - internal - squidex: + squidex1: image: squidex - ports: - - "8080:80" environment: - URLS__BASEURL=http://localhost:8080 - ASSETS__RESIZERURL=http://resizer - EVENTSTORE__MONGODB__CONFIGURATION=mongodb://mongo + - EVENTSTORE__MONGODB__DATABASE=squidex1 - GRAPHQL__CACHEDURATION=0 - IDENTITY__ADMINCLIENTID=root - IDENTITY__ADMINCLIENTSECRET=xeLd6jFxqbXJrfmNLlO2j1apagGGGSyZJhFnIuHp4I0= @@ -22,8 +21,36 @@ services: - SCRIPTING__TIMEOUTEXECUTION=00:00:10 - SCRIPTING__TIMEOUTSCRIPT=00:00:10 - STORE__MONGODB__CONFIGURATION=mongodb://mongo + - STORE__MONGODB__DATABASE=squidex1 + - STORE__MONGODB__CONTENTDATABASE=squidex1_content - STORE__TYPE=MongoDB - - TEMPLATES__LOCALURL=http://localhost:80 + - TEMPLATES__LOCALURL=http://localhost:5000 + - ASPNETCORE_URLS=http://+:5000 + networks: + - internal + depends_on: + - mongo + + squidex2: + image: squidex + environment: + - URLS__BASEURL=http://localhost:8081/squidex/ + - URLS__BASEPATH=squidex/ + - ASSETS__RESIZERURL=http://resizer + - EVENTSTORE__MONGODB__CONFIGURATION=mongodb://mongo + - EVENTSTORE__MONGODB__DATABASE=squidex2 + - GRAPHQL__CACHEDURATION=0 + - IDENTITY__ADMINCLIENTID=root + - IDENTITY__ADMINCLIENTSECRET=xeLd6jFxqbXJrfmNLlO2j1apagGGGSyZJhFnIuHp4I0= + - IDENTITY__MULTIPLEDOMAINS=true + - SCRIPTING__TIMEOUTEXECUTION=00:00:10 + - SCRIPTING__TIMEOUTSCRIPT=00:00:10 + - STORE__MONGODB__CONFIGURATION=mongodb://mongo + - STORE__MONGODB__DATABASE=squidex2 + - STORE__MONGODB__CONTENTDATABASE=squidex2_content + - STORE__TYPE=MongoDB + - TEMPLATES__LOCALURL=http://localhost:5000 + - ASPNETCORE_URLS=http://+:5000 networks: - internal depends_on: @@ -31,12 +58,38 @@ services: resizer: image: squidex/resizer:dev-40 - ports: - - "8081:80" networks: - internal depends_on: - mongo + + squidex_proxy1: + image: squidex/caddy-proxy + ports: + - "8080:8080" + environment: + - SITE_ADDRESS=http://localhost:8080 + - SITE_PATH=* + - SITE_SERVER="squidex1:5000" + depends_on: + - squidex1 + networks: + - internal + restart: unless-stopped + + squidex_proxy2: + image: squidex/caddy-proxy-path + ports: + - "8081:8081" + environment: + - SITE_ADDRESS=http://localhost:8081 + - SITE_PATH=/squidex/* + - SITE_SERVER="squidex2:5000" + depends_on: + - squidex2 + networks: + - internal + restart: unless-stopped networks: internal: diff --git a/backend/tools/TestSuite/TestSuite.ApiTests/AssetFixture.cs b/backend/tools/TestSuite/TestSuite.ApiTests/AssetFixture.cs index f709a6d15..ffc6fecfe 100644 --- a/backend/tools/TestSuite/TestSuite.ApiTests/AssetFixture.cs +++ b/backend/tools/TestSuite/TestSuite.ApiTests/AssetFixture.cs @@ -20,7 +20,7 @@ namespace TestSuite.ApiTests { client.BaseAddress = new Uri(ServerUrl); - var url = asset._links["content"].Href; + var url = asset._links["content"].Href[1..]; if (version > 0) { diff --git a/backend/tools/TestSuite/TestSuite.ApiTests/Assets/Frontend_Home.jpg b/backend/tools/TestSuite/TestSuite.ApiTests/Assets/Frontend_Home.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2676c4fb6a0d16f75738916d63b62e0b0ebaf569 GIT binary patch literal 40599 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 literal 0 HcmV?d00001 diff --git a/backend/tools/TestSuite/TestSuite.ApiTests/Assets/Frontend_Login.jpg b/backend/tools/TestSuite/TestSuite.ApiTests/Assets/Frontend_Login.jpg new file mode 100644 index 0000000000000000000000000000000000000000..380a3bb16dd21a22fbe195bf77ddc49a2b1c1da3 GIT binary patch literal 41984 zcmeFZ2UwHKwlEyUUQncn6xkaPlqy0%1Z1m(B5el}LJ6RB5^6%P+XB)xAT2Zr5=cUV zlmGz%3mqu|LI|32SyCuP<<@0zvNtTi+5lr`@`@4*+q z`TOcx>VQLs0Dwcx58z<*@KvpQ_bh)k&{x;e0sV2~FgJi1j$8)-oLxLn1{!yNGBz>& z>G!nn;h{C!?K}Lh#7w#y-M>=@06HcAmHYoz(n%Xzv^5jyEA!`pVlrn6Yr}*&?EeD$ z{0>|F1&;b1MnMejF>zio;j8vPz*axN-X3lqOq_<_@vYrZzr%w}SlQXh^LJjqhuFaT%(?lR&3((pHZy5azUo9h4o%ZtCIStSDir6B+ScmLnggkJ#w z=bi!pC2ejGQ4jwR<_Pouu$>(Mu#y7+oHYRe*xLbsQ)b@<{afC@+2S9R^(ST?K4v*x znIC(A6TlYm6F>{#01F`*lP>i`*m{J{X=9)RWW;orZ^aD@3idgAEOBS(&&I)41v zi8H6poH>2!^y#y#7tWt$Wn(>k`aIWpHg*n9PR=vuE^>2ma9`lyN5(7*^CTiDrk z^3ol!VLbif4Jhm(CZT4OOUV6ch_JlpqkZ&T995q66deP(%?# zICjs$=7W_rB;}VMn(B8Z|7|g<&0`~V?m@Z!lX*_P>==%wG3e<+|3N}}BWX=g@S6#W zvd||LsN+k|#!kVDQzFFpHJdJy>+H&piI|96kfD})%?XHVQ^J}w-Q*14q+gy6!j;?I zXUKn+QQyBJKq&G_b|T9?)Wy?^w_nm*WAjaKRMopv^%k(iD|LH�-WwHYx-FT{R_@AsX;Gzv z^)fy560wFmeda8lp&xt87Y#)xV#o+VTB~Iy83a`fnpjD57{wN960YwHlS4?c`UQ{W zf)~_G(9OFj%U-KsF{tFC_HCAQ5uJG@K89{Cn$63Z0C{eozXK(Rq7*_l zHRE`@}G$cGC+vK^SUA1=n2IXZjkq4-Xe`ey;bm)+_7}!sPc1NkJq>m^DT0l z^f3{|J`ocdYz``}2RrrFr1+B|n{QQzyI6$ZP~6iX19NUG@j`Usl<}{sy3FlpS14lBnK_=k!xV-Fbw<9hjy4$) z-6s9&DQ!26M~L_V>6DdCYacR@G_v@H9#6JRn7R!#kHrV%M!C$dKqmCq+S4!Py*KYp zGCT+8B$+$b%KX}z2k+012n0baN%D((q4%$&dg+jn&k#WbB}J{0^+VbKw*a?eVEIiP z)#^lk3?+Ryp1t$k%K=T#^+Xd97=qG*`idS-c`?kLu%{pLW}7 z4O3t-ju69%jYlRRGDdyfUsWFfEZ-ae)`6Y-@yD}oSswtJB-{@GER+Ml@-Sl3&EW$j z!f__d21g)@*ygR>8OnHE++z}mf735>=0e{>8?80I_zk{8o+wBSYfLB34<-waXB7AL z%XL&%--j?b<(r|y5wQ|fgbPPY%(X-yNL`VFQUn|N1s=y%*7`h3f?~}p8r7PkJbdKw zunsMuETv2SX`8#(M9ueC&j{~ zG-Hg2I8@sG6`HA=jAMkIyR=@^nwrOF^Q8(%vBxTVv|3GF2!6RUC=#*1Z~(x!F6i=4 ztFK>)twJaV7Py=d@i>!z`jr84&n77#dWp)BfS-#bJ6k){RxRz@Vz+y?=Tm zyx-5Pg1d%b!Fm8Vra)~)R2%>h;UJ37@ z^+&-dzDRK!bXp}0COk~b0d4AeAAewWIa1m<<*)&ycd_Iatmk$bBUb;cjtst-w!qn{ zkp*rAA#irdw$*YB(s9WU_(P~{b|sY)260rcE8dc>UiIcY0KDrt05pWn?*TUr91Z}# zw8o@dfM;VDgyakQo#_iiXvV#GPH-M*8#p+)AGHE6vm9Tk!94h6@;d5{lKczPH`$l^c7R}Te6p>^Y z&qJEjf2HR1UtPui*0KoQx~B&gMb_7ers? z){|Ba029dQ{A`PvR7qSan|&QSct}QsyIj>k9Dmscc)pIbRX#go600OCC}v+tjEo(R z%wI0`tVX+F+}5FSY@??BVEYBoa3oFF{;i5U%W#NT^ho>LQnp`RgqR@HQ za5!3jI950h<*Ff;raSm-aIKu}T?fn}?y0r^N;b3~uYs%r!UucVKI>5s6!<0$iiW69 zM7%w9oq(N9so5W{sHV!M{$y-Gj2<^^kvlm@vSLd|hE`qHR@by5MY$#K(%t zYml<+Hi50pek+1|qGfxs$@$01vn2Ho0F=G8Po3;s#rvO!>g*xP)skNf!*yk&Z;LE+ zvO#J-=i8r%CMyNB&r5_Z0LyWmj73HD|<~9LgE%?1YAe+TfPMpwdIqk@6j!PT6 zmuwOqk35@k+XY4uab87ZDds#IO|*%;byT%vQwI2%IdTX`+Jh&C+f%Eio)V@Vh@*JZ z&}u0ETvTuR%O;bhyj6mPZeP_wT<9NtWlGhxO=n}b@=VQ?eOQY2rzzf1r03}l-V z%33Og3h|A4sb^h}cg|Fp!CI{rSwz*$rxnTE%9~oTFi7R=syi16+sz`1IP=58V`3sd zYI;B1)P_yVQ-&P!>3gh_A9|WJkhuX>0QASB` zDpf`{p>*=119<%<$9n$rhw@r^-6ck}7?*%Z9udcNDTlP7=N^I2iZeoq65Q!MM~4}= zveM2poX+!3Gkro_wSyDx#mtI_a+sYFpJ zWJRLyh?|U?BTmrHF>SeH1K0^^{pRlVY&7nyx4}cK&T*gIiq6_FD|}X2EqkUXRIDl5 zKecu^+QYBEp;|rQX}5I3@*rUd4f71-%{DV1y}#`BMvY<>9M z_;Vl+p~2*=g~N>Uk%zckN@Y1P+@(j$z@(osp)M$7`f0y}%4vuqW&-h)sVL5zX1H7# zet4aT2i-@;^LB{kviXAZ8^NYk+8D!`W|hgBsW(&XaElaEZvwZWO9`nw0Ehkg^@kW5 zy?YS3Na8Az2)`$cMo!Qu7(<)z46&@V9X4N9*7kH!V%<=8nc?{!A%nt&h%8F-rLEj8 zF(89|L$Jbqz(;?)o1XS~{j6uxn19WAwQJ3%98dT1_hUmhl3Df(Uk_UjR z!g9s!h3VKcPQ9a{B3Z_D!dpUMc9fu?pp8xQ=81^0V>`FN7HMNzhi;1{-cjlER$3oU zu(i!$XXt`Cu10LW7k=LINy8>G6@?V>wa2>ZL1q`HEtXXHhSu(dIhEb5BCh&Z{;K^; zotxqVTUlE~!IFP^^l&#R9_U#*yLV}#Om1oL(Qj)z?lBAAwzl}~I$;-D|2R@WmK{?F zY(bmHx_}z_8Lk^3dBXSo?12mM4V;EP`$q1t3;N;zP5KM!_ zf(m||EH;_(reW>mVA@mvG|Hw~3~$*m$-eAezpt4``X!!jYJUT{D?B1Hqnl`XQSq6K zMNA*HG68hcko}_X0btN~==3?X9!6TO3>!g6Fv~L2a<_3ZrwY>*`=1;4_|1}DBU75N zeRxE&w1&5yx6c>x)`+DfB#RNml2Tf((O#A5cqJzkdyR*Tfg!qStqiD|I^KkWs3@2#~w02CDXNBu;nR=Q%ZcX+XV{MEX`wn_b?X19C2f3 zpon`);VQsQ@#zDAzO=K^&n1nzzQ_ym<_m?wz^h&3$at{nntql!DUptW!x`N1jEiZP zN-8@~=CE1``HgWnM0|^3)mli zBS)%G`tbo^uTN^h=H4r3Bcc)~C3e6S9~1L9mg|nb{%KDW4reu_Y1cLz8{1hE)S~qV zhM!Y*NBr5q;g8|g>aUjvM8aP(k_D*)cDEG7sRME5adFBRZ>0}{d4BFzjuc6LeseXj z+$SA>GarD%jo*HJcK^4-M|1qH`e>Z^0@(?44x}`e_wD&kq}%oi1Abr7{QnfreN3Ie zVCq_Y1=6+BwPI03!rB+l&$jxVN^h?2A}?mf^*@v{vTJ;*!9v*)3rZe(^lq-IDFg5Q zAn}NWq0Rr9dU(Zz?K_Iwt);@8nY7+3@7^Y;eZSyit(Yfl+k2gKlfHuaesTP-)E~o7 zH~uftf2ryJ)#*R4O5FvvX$kN}bzx|BVKlsULvGGI**@BKO=d^`s>ON0;s1DJI%`T>jOzR~Md`2#>ld%&-|WUWc(13>nxZ<#H9Y4jz-e(y=v ztr3;zf57sYf}OWUrM~0mB&DgR8}a}k^KtQA_H#{L>2{yDP0vN}4J8jb}E}TnA~|Jhu)_Y*@t!s-C9kwaxqdl&Zh z)7SL6`lI=05|g_8=o|Haja#jKJx*I(l9tI`&svE2Yy9YcNRl339>l~E9}+=BRzSh3 z^;Zn$|Gu6904E~ac$%lJH`0Iovu@i&M>GJg{7b}t`}!39TetK*(c%yAus`eh{Sq<& zK>X#0%!eZzAh?x7nQOk)fQQ-JMtwTOYSTR3PYpW$8X1enE*$_u4GsYPjxW+zW%sK@ zDM9&?kM`p)=WYX7Op=)Us#20~+a4BWn=4rdM1qef-j5)}O&~8~41@IGk#pq!*haPO z^1j#;Jh{n4F;cv@kZD&7e8Rkexx)T7%r;7FQqW4;x7crVh}Z&Vmr-F0&bRu?#=%|K z;~r6{4k>3nhGm?|3twvsr`g4zh1F?1xsh>&jVSY-m*32mThgc8@R^~$eK3Qb+uX!! zA|W;i5ya$Nfvk(A{?9I(bv>hcn*(OJfsvb_=Z{wn7F9ZxC0uE-MQP}bjiqpZ%S4{<`WvuU{2bR7*1jY zGlab!ePH#_0)cn-x9D_9TjtHl%ejEX({F8h1>5_dH49^h1{CPPyU0OhV$##J*a;XOdO38u>#gWt9LAJ7s%`bah|%>s;cru zUyvsLS=WzT6!TM*<^*R$1H8&jdrXlRA}EAaVad=_po;lmNB6TGUOrmrG z%N=6x!FmLT|5$WuRc^5c!bAiTVNVEKixj&%aerPv;fMI#dc~zmRjuWT4eY!302^6n{ zYWC*+cKAQBrAZcuwpzR4uXCj#LY1d>+GZn3`y~m{4mkDtN2XWbhTNC_iAUh?n`Y9+ zbJf8!avAr{u3-#kA>p*-lS{IybEAG!vn#yX0-vHbj%B76KH*+`~-qZXZ z;@YI9@g%iXU8la{3JPZ*2aEr;;BEPge`rJ@FDF!aqp1#35?f--{IXyi^t!{`u_b~soo}KHh(INgoa0S~jARoDfIr~@}&KL~|$vHKU$B1Qg)+@)O z)G?AEa|rc@5F47Ip*baPhMkJFiJ%3lGcGlGh=@nKv$L`BO6$c8N$2Sogy!)S;~dj^ zHuOm|uE>iYd`u^t2_Mf9vo$*+uqBF#=A_)2D~KYD_hi`Hj8)OE(G+6OX9_1*^Hca_ zZsZ40cXU5ZYGSB?x&HHl#qy$p1#k@q-1xL-i%k`C?As!K{srJD3jiEbd9Aw1!XErl zta{-lvs={+UOXnk>{g+{{q9Ba%>9RRJpx92!E2;-eR>u93xe9Xn2!SCcdH|vud6pN z2)$V!00H~8J~F_<&+nT^w%VX@v>Rx#*`JMQ>{pO|SR8Q)fwK=EiM})@=2yvcYg1@; zf@(1QFfT9As;g0pUp@aw^omNu)^Gzo&m(0$wH9i=MOi;8l7zKOp3$AUFE+Hb#cY-O zH8YW4ha=>iA4w(2tg#l3>L|JOvaL1h(BsYKB@1lsauhml`Lf6m6cB!y1ZWKuDE z=1ryPJO*rwK+K7W$Fou94vPecBMG$-E(lav-FvrN|EkDV1d~oTd!5TT4P-%Gt+|aig?2R7_cQqL5 zW|TTL-{Yy}kg1!Jfkp}z9;@7rn9Ld;*HC2R^tyUfnkeL<<}WBIaCB5Mh?YF205~EH zIE3_EHn-0VF3hGgA=^Ko_8+^5-(fb+bYNn8{ep6)>G$D8BQNI*!2N%T_-|kTd&kJY z3B6|zoz*BMR=i|v@)G*nl^b`2ouKd@7?Pbqz*5HH)el#8pEI@=0;aE4@$~^_G_Fos zNoEJb)!Hsa7UzgQsu+{m>;Jr>3Y(&?zQTQT-x46L_HVU=0~8AnDUT(8zPzCF%=gP; zx@>><0RXdIt&*R1^y0_o4SSa9J*|%;M_OJSzd7k$U!nhS*heWRYJ*xm9+cmPoVo-0 zI`$`3w9TPb#kA$c&R*|y)|oLCvg@C0ZvH48I>tW0zj%Xx>Pfjz8`5lFV|I6=%7ep_ zRaIy`$lvnTDd}hOzwrGNq*DBv-yXU6637AdsoPY!qUI9nkRT>MSI`(2C-;a`76fVG z1#5mcPbF z+YkSbNb3BJ#JFIZjJNZhRf4hw*9+hMKZeEtL2+fIbmsGZ-@DZB)jL*R{3pQ6f4dg{ zOAPTp=X-+B>k9lXso*b6i1il(4*${b{!8rt=(U>BUq=HW$iGT_PuR)mmqY)F?JA@1 z;*Ep84-lH5R0qIOgCB*ON}ms!_1?TO5-E|eV{=hyVb;XteiPN}gNRy`$>nhbj)snv zQ^%F6*upy{5}#LjEL_X#0yRd%t3n`95kY$^5i9xf$REUf{)339{TFM}F&_HDy0yKgQ&u*_=or7; zi`GJgZO}rz6KXs)jFuS^A0FOYTvOMB2$<>D-a8v|dyeppzMA7Gy(Z7GL&+J_6F-vK zpK;48_5g72p?>*nklYW5oe}T&2|plfw5GkTZtpc*EYFC(nRn=a^Ziwc|3WYG`R?_e z%4wa(R%<&Ug{N&dnk96I&Vm&W#jj}Oxgr#yrnGuNapo8$mqzgwy?5DXH&(eE%A6?e zyRF^)vDW|pFk5B{^Fwo4Qpu@KFSM1Y&`7W6akMf6@`lOw+Blwp0Lq0UacIU!2 zL!^)i`2Zm4)b`6x)=sXJN}X|GZB`&pUmn3av#@5f15OY|-GHfVX%*Y#p$8{R73|k2 zzC_~0RQkCZhOszTpZn2MK%^w}P0!uuWsDbKV)T78|p(buG8a{N*v~uZw^S=AQl&eg&p2wmMZW zK`or;znF`BnV?T%+;4N6BxJqa6pP?U_O-w?OlBo+5CyLdr8Oi}a(Ul!;7Qc;d0dj2 z6fvc3sKpNiY4a6|i=vIhj4@;=dc(N|PGRV5;_Te?6l>#+H+d}GuOLmEDk?n~9R(yT zutUXytlyhFaR3l3E3Ums*KrO@BK7#!e_XZdMazaj7@fB&jf!_oG|C+>z(IH_Kb@frVxf38KwKhz}dM*#Zh`3560& zHj1JctAf52uFUQRA}adbb&2Kg4b2|DE|b{6cL9Nj)TRgr19hrt*knP|1TrmFTCie{sZ=*W6RLP;B;e_I*0NyAMfN^jL+s>`w@1$Eq(VELu?t z_fF`V`(r(x*%w+M!UWo_cM$johG94*HjM;Kv~ zA>mhLc}n3p>8zk+{7r_8vY=pK36c-|>XTNKOh_OX7k%z}xygJNv`6fcbbD(424nE~LeC4Wj)^2U5CbWI{!~-_05xASE-qhQrcvwnj1V=Z*>NpFIUobDYfL=w0x5m+v94~saKosb0J<#Xt;)EQm^ z7jr^X=ncQgt`_jGeb}3eNrlWE#=G*S<&N;7tHySo*pP5`#ue&qidenkiY+NtG4^hB zo17LWsv)fg>qV~>c}bkP&S11Z5aavV?^UUa1K!%)(jxBuh7iyb1Dvq&B?=kZrK~in zU%`o78-nHAd~%OeCorH33QtGs;vpcvw+J6cHE1VYAr)o8g(3n;*g7szB(<+{smMyY>9ZRtf=h~ zc(^KdLf>dxK@nb13+6*rX$laBwZJ5-O~od!{;3)5BlTfQ88Sc%(Z?aZcdt5^M#76d z^>Rb<2w2?;ctaX*FWJvUV-D~5g|hpm-&}ZPW4cGLgywR;R6^I|6@gm!rh#P8Fn1+Z z1BnOY!vM_fLsyRQcG&>sClzZSk>> z7y1Y8+|dOeiRdYU0_o(ColcWQ7|u47F^Q$@y!|X=Cz0Uxq*nzTG8WBXG1#Mj7SyT2Bl!a zo+#(SALbwF;0Vm#3r7yYCa=Bt2E%uxBx7a=k8r_@VuaB?(~*J|9HGC2)J=|@wYc$ zq{atC0QBxyDP)ACPfYe43=vw`CkZ;${3{t_9xEt>p)1)_h{rokvJ4zcP%!D=vU&cG=Bgn$=^}0EMPnSdUy=+R`qGI;xXP=mHN*MUbB;(6P6_8X3o&n z8u{vg3(?k%oLjGBpo8Jf&ACH^d(W@sB@s7Oo*8w9i0=&eWrY6nmdnH6IFF$P%&2V9 z>5b9d%`sdqd+(CB=vXo2e#LWRCdABOP+Q^!L<`I^nPX$7aa$eVa|H@DQf!WcN%RO? zc4OA)nN4TU&JY_ziyuh|Ra$EgxO#lO-3+~7hwM_@yc^?x18QwN0aJo0)7j3x$i>S8iMI9gy{doL4TM&<9)K zqY4b)QnR*?x54!1wjB+tSW(mI8Z8AHParX-qZ#@JF^QS0 zG-rAm+J&dXL-QO#V1Aw{Mn1%I7`X2AFjALiV|HUU@@ty8Kll}k*sDJVIOpyKXb`YpeWaWbtbJeIQ85cwhC&f4nanG8R${};t?{46yB z`nMl6Zf0Ms;`^U|Lk^m-Z1OChL%}SdS=aKOvL|F!2;9sUg;I=Z1cOl!P@|#H^;)cZ z-OY~ohBjp|x?w+&7+XS&?R3m4y+QP76K#2qdyXJriO8wgr3rcI^MT4+Peg}bT6}Xq z-r1IPBX9<^6qXc$>)h&G5BuVjvLA#@RAqVP^JHe~)1}*MxXq7Yx6=dO$1UBL4$z$X z;&JX@BkU}9GsA`_xO^5`O{xt zW6N7zA5)<5J6K|}pzCmM8vO5@%@NS|Ep4Nsy25Sly_}af)N5@37k>MDynn~lQHSqd zB5L68JAv6|M!x}|Km9v$|63^k^o>d$q4HAQ(!le*^KXnx+~F>5DPja6EqR^jOJpKr zD32uMO%$_H(lR^*5h%gBEK#mKY(P6jst$s&;#M z+bkBvy&D%29sNWX3eEOS3QvRTc&y(;FPC=&rxvc?QgypIyzYpzl1Yo737yHFr(#y~hKVKDDKiqEee1)1x&i^sWB^ zIsQMW#U=a7(sMT*=UsyS6#F}?d~23lIg56E2qjBfjr(YrCv z*9QPa+gXpGFP+D_=!s}Og^uh>Df#}JS0!EA?9EXas~D*M&ukQQ+(s5^uwqsAp|!nx zjs`0cABgJuG_J@l`fLczebb|}$`P+xsQ<4OM&R}EB-|BOVMs|7LzwQE-Oxfx7D+^f zKvB9LXwz|>o!0;cIUuJXCz7<+$ z2LEU33E=$)Q$5@9HubEboC4anKMl<1Qk*d*QK|QQkmmvG?x(G$vc^wulc&3wi@*x1 ze_Dj)Pc1#sIrKR>LlJgKF)>bs=ebvU-P8{jasRUlIsT@!Dmx`MCVFGVJ`2oTcOKmR zlN0NoHa~m)c#vJd1l;C-VCDMHDNW`0BDm9eOuJjV>*7#qDX;cOEAeKB3h9c*L|#`T z5M%ANrlu3G5a>TRelBh`@pABs{ReZagDYNFjA^Fg6xUn(h2PH2!b`Xe;|t!nU8CbA z9ip)_;TciCvEWvJ?7;r%9TDH7AG#G!=7FK(&A%N0+719xs6(s!%!R7?{Jynk(@Pzy z^JM}pd!7K6m+N2t=uS@#p0s&(Va!R@As1DWUNxexEr=V>?P=(yXz!oO(er-jczfqb zz89P=bT<3rMpCX&TJtaKA#EUZQk`Jw6?NdHhRAA_-7u7ARk^=;AkbMN@~p00H1-;A zQx6qvTD=0f_lD#y6}dxnt0niQZ*sBKuF1>~ZrRx=5?8W}^pB~F;T;CoQ!?o3`@;tQ zc+)%{5r(7M0(H!DSUiESs5oDR7GOob$BTs*J327rsfGfl*Zk(cnJdK?=Y)M7mp4nt zTwCPAYn3_!Aw|rSH-);hOt0TNKrg(jd#{Y5ajLFKwaJBJ8zL5Lq2}g&<6-VYO=Bv< zV^DL*9vKSBPlx62=g^?=>PpDRCXO$iaAm z5HGgAMMYO9<>s|aE4wXQzkMW63d1+(DF~`&Vt&q=hhJbuusKW$+@%Xr+blOSpi(ek zI*mY#L4&<%iqMm(q7m0akC!uUr5CRIl?+W!Q3r9@Ax^#m!=~`m7c{Xe8k#*oVl+xn z>V7ib7hl4E(-W*0U(yCsGo$p38Ia)!GNXA$dUov^jI-!Mw}F+}QF^au z#9TB`n98f!V`(Td_o2IS#C}8uT0!$JRZNwB-E48}8EgNWkhAsYyJ`a?7L*fDd382| zg^Z`Oaw4vdCrWf^_?R{kC-jedX=5IKyIz^E!DCit;=jtzudD14rA-z3$ys*j*N7%N zT46(BwGGYEZHY|?wAA7aexi7W0jOtasc32{%Fx6)dp(aya)$n5O?x|%Le`Fe*!oAt(vcJqa8@v;pcm%U_g)nD@1?QrYiOX=P~wh>5@@TryQeh)<$YXvUBzEHzg-meg5oc z(0!I=R6;i_uf#uKV+&v2e_@?t$6grxj!0(s&DuTh(bd6l0^=1X-d4QhKDG`*y8ILo zcW%&ej;wG$Y{pe0pdVu>C|n54O%_fj&PoN4;VauNUpG<*p2?ZG78!Ij4eGn*sdo&r zu?g974aJM|Q2d%ElEW(`sIZp_HGZCNn5!(aRgZ@(H6A9i8ktNxdJ6T}FivbLE+Ukm zxrLhZ3{Iv8U9(DKf@4#SMRJeAhJ}drvxW33SyFg-Q&K$inUO%GZ%>t=b71w#TOF4O zd%w*y(}}Djd&1LXa(Vmbk;+2Ts`@o{|g_4B9E%}#H{%N_-HPpLFXhf+g5RKMtBD`(L!8 zek9~eOeiIm$LBN0n}QWup@v{XWc~y^S+{Ex*{i+`IjV`w~=4bVeDsId8zy8!p6m(_FuP2HP z6((1Xk&vS8>fw1lxR2rPcxg}5k*HfW{xetOFWhfr|6sh@CZ|&fYKFobk`-y!*6WQe zV)mY0yY!&F_5g5na4J71=G06MF*heSMhy*)m|>ncCJk{B@xDvL89H81<=XCK&7NN5 zt0^H!-&EhZoNdF=%1Bp05RtNef|DuC#gM^>h-4euUVS-|_2DktJ=>3}{iHppN`Lxj zJa@T|jd34)(n1O!!~4lzzo3W~DUSkbVLO|8d!2MjkchihYzd3@|JFY#UD#bhCQG#4 z0;dy+*C(raEx&VL_xnLoq_kHBRHszwXnOg=>6}-^@VRcW{sbYBt?@_JKG(%M?``4N0p1rsyp)?IBNWYYC;XPIVScX7(kwTM(>jc~ zmd&5a+!iXb?7TQq4!gr))bqByOlINmY;{rKa!!*l!RA!HKNxId zg{b6=tW>pIT@6_tTN}ulV`QBFlBb1w#XJ~Fcuo3{7o!_RL1`7HwKWQ{73aJXX#+h&H+Lid^Q{nwJB%{qmi@1^B6N{U8+sMt$Z4xxs zDI-&gcOc;g*401T>#HiIPv{I^@fG*!^rhqbaoF7ATChToZ{-5*)te>MzC?{rP#?|&5;40M?~LXdavHTG;wF=&HbqQu6~e;^tuL_&zCU9XKyofdw-xYuNDKQu7d*HE!ibTBYCEID6lo@O=U zp8FO)J2yMt&w%P|O~gTY^EMUX6OC+avQYDeWFE!-8(q383koqAA=S;@D|)KetYMLt zwgr>Im!0P_Y--7!s=T0Fz?2I2A43|J{C)jaxbObGtta`dzig>0x=(GLn`EuN{ixA$ z*TX-kaCdCGVsB1hD;W0z;A!#8ADRC0cZkho%p~wkP-he8cQ?8-m;w{Pkyk$;{rkW} zrr&+$FdRX^$o9sC>xtKl7_R`Fnm-U=d2##K+wkN2!CUAT=hXePJ=nqcW`45ddI5OI zIaYI;EAyhQkd68rwJD`@m4`O|HZ^4v9n2Q^)9TJ~)0CmhvM*64Q93P9y6&j+T3BHH zTD=s?3l{se@Y^@KE@Z|+ltRdOP3z@nud&or-hbbX-@F%A^}=`W30ZeB##LeR?O>(; z(}1`cj(>pj?01xOwiW%?22&3_^#5ecD!6@TYJ-)kP|o)myNdGBXuOTlPJ2XG2CY45 zo99QkdfbehIiAsbt7~`~9fWLY91#%S21$7xS6jZ=aZdG(C!w-^RQmPh;0JSt{+TUX z`3j={Wn!ey5bbb;2wXbsJ(#^ib0WN{r=WqBg)#IKliF=hs2+>bh!~0B9sa4@LNL64 zx!#Q&>s8QaixnEAU8^YjQ*8I|g3?vSQc7Z;_Qm)HV~9lYR6kc<(VXdjpbnvwRSOpr zWufs5&Ft29)9HWH)1R7AtOibwe|;VsD43|kg7f)58MaUE_N2spxUIDo0iS0L|C^rv zX2jpQ=%3gU?YM@1b4&D3lRo>Kfm~aBX@3#p_596M_J^h>*Ye6D7VPnu9gUB7%q7mC z3)Q+I))-Edn$7{h>ijxT)(D~v28&On!}4Oah2mTN?^7Z3^!#u{+lFz2nO4IMGq39 zlisCt$`@}F!nWT5Zk?0=p^XFn=`OiHGXD?2|NP!By2?OO$*Pj=VU&R5htg~F9iOvF zfx6B@-HP-V!iqBay7M5DA}9j)?L_i8DI)`JCzrGRzBaf9xW7ApF1{iWWI0>inC>fJ zFs@v6*5s5p^Wb(+4DDGf%~F6%HolWn7x!7yX;_xWaPPrr^(fB)An4{NNB#9D5zJRA zAosTN9t|xy2?*Z2IrRBrQ@UhIo%Q|TJU-a&JYpAD`CzTjVYGOoc= zF}h_~TjcWtg>Pdr*{a>F;`=}6Z%!7nRK5ua`{Es7Ddtn+`a^!cAH?of3yEYMa@T!d z%w=Y4J4|b!I7=Q?nu-T2LV3EN?1{`%By_$L^>t}rNYOtQ9Q|O?uwz3w|8Yd3Mrpra z@_M%joRAQ5Ia&>7Q#32GV6&~$!8}jPo}K#hZ?49r=iB?|i@C5cMw`CM``Fe=pezKT z_8gJ_jdoUS*;n-()Dz6d>+x{PUDXMyY<%$_iT=x9v;|bEl8#q4Q;4d2c>plJng1=c z`g6>WI!6AaG;q8j=D2t5N=~HRa#Bae+;PqW!1&0N^lxB@d0(Pkx1uIA7E1Q;!U_d`eZPhUU#$39dV z-L%tt6{iRG47M^Pf;X-FZ@&PruKxZ`L;yc%1qGj#RG~Yn0EvamqQ0{!?{m}GZJKZH zN=#s)8&&I7cArV5*wdctE5p~YgYXjlg~M)&4&BjW-{hxAFf&W=F7|D*Yun4t)`yJ9 zgqn{yX<2r*%XI;jV0C$ZPhFf?_{jD359`q`l)5tK=11sIf zRSA_{#)2i3c*d{tpq%6)!z^37LMalRZ(KvY{l{JhTJI6OJV$8EoFjo}GJ! zl=w#Ei8}2~g<6c)0AC`H6w4KpNXBu7LZA2MT^e)iR2tUNoP1$Ka^xFF^znytw}1X9 z^QD3sbf&8INIVCy_pyReXZPKyd7|U&CCzSGk%mc5nl$ajIn?Pny;g+BFU1dtq!f_TLMO)ABRA0yRV>C|FT zSKYPhL=9JM*HbqNbme*|c0JUkoh-YCl9)X|SP4n!>taaWjQxA=xg*y7{o!H-@mvDd zF7n3=_3s$WPdK%@o=8w+E6-z|Ny%MsiZ_eR^o}l;b;-?Ux&U6DIYy4_7&9GIx-sx| zM>Mw#QuNVe;PUX*F%2IVBNB!uoCYU`*>QhZb#2E#xz5RvbYtSF>-n*y0y!VQ1Ax00 z#nWSLnZz&G^a50X%y{Vp3YS$^9KI+vGxU?=z>eqRuaMYmbXwKd*j<(rftVW-o;^3{?47Adu3Mtd2?_LS>y9NTLmEu>v}dZHtBcyR)1|3Hj1BOj?4UHFo-j5eF@J=unc&F;?{)?<*Dbc6b zh~Z(G{?~0}^wp*e#En*Z-p!^a4F!xra;&PQ&jrnI!IAv(j`vn-U!O|V9d2E7COA5l zNuL;)D0qZHA`zvDhRTIQ>1JEH8QMe7Q4!``dEb2F*}i;x9Z?0OpuA`J^a#xe%PIo?!;uUSNq3Yezru-u^TcBe%k4EjxZ1D6Kk zncmJ8t)Y{b_R3?&N_&gQnKdu0uIBS8K!I8Qd>9F{+n}ySm?g&d%+{wfb=HzM z~ zuJd;cJ^$L0z8NJ|WG;%2S#XZYY&U3c=(kr)QD>eVg3Z}wq&|1;LYyv%l&Oo`i7!6+ zbRqFH&|GD5Nl9`o+{II(xH(>XJQfjMgxvrVgc6OoXej+wZ^<;*rfVja_~e4FvTH_> zJBpHzPm7uFa+?dc#IN(}hOV14o#&wng06!Py3-d<*IlG{6)g6UafusOKc zD=XlNm0bi)>>O|j_LBz`fz*p~ zQ0B{uj20bMqB_~xWn?t;Ld%yF`smIc^F7W|3769KBFHj6*etsQVqm4xUdeQcUF(Rb zl{V!$;=08Pa&OA9(d}eM>l*f7na75G1)cISZ!ayv6g_{AgUW(nKyZI}T)fGk41Z9P zGgkGZ&#YO9{n7LhU&7mwa+1D3K?s9cuy!K8y>gl22Q}F z!32RifJ^}y5@rx(o@JiB={fB=?f0GYJ?Fd6J-zq2U-L)y%3AM!_sYB9z1G@mt@rn{ zyEVHYry19s>!qnXL3<)n{f3s5zsM*NJ-j1v1mZ!kpQ36Aqu6iSbXfM`NzJ7%5zzo< zhpC~JfhUEWN*4t@gZR-3UD&uv2M%%~hmuP~Ksy0ip|xo?Tx)8vb{g>M0n-^zqQ7WaChk4dOj4`<0JrtNJ5A0q3lJN4 zl3(*OKwR}46`^%FiF`>qfk;9Rr6|0jpo1u#NRC_z4GX5kMCQ1?_z?FEnhl4e?()KuVPGmW0Fua zLaz@v!AmR*FAgtq`=ocz?bEzZT0~p*w`U$~l)&J1{agFd5jzwumIN8=B9wV?t$az7 znjg8Ru|$;2L_=D(M<_qJW<7aBcD%UlO;EMPRK8{QNUc`$6pq3vn}2~$ zr<|;n9@$cP-+1p?%lgXcZ!4O{?z9>l`zUp1U-#mVQrEG63B>;SM9Jq5-;}fOOa*cf zQv&B}nfJq+XxYKpqhsy-k5W6AFJ6n$cuL>7=$YT$B5E-&&VDeS3Ec)tmfySSV$0bP#}^7ot8a(>zxEIC{pVuu|04CL(Az&v@PEYwR~?n(w9p7l zhRTeMd;7kN5d0(d$c9?ae6$*8z*bE}%OD`^P^vAVcXC|fMkL5`v3v>6lrFZDPM^#j z*~rh#HOMMFw$G(|K>Aqc6z51NhmSjr?>@BBP$OlK^!;BNfWLlys`%@cJoR5!E{-TU zain&B_Zy*qE%|B5ugesQf5URJVKKh@4M6q3rsy9^{o(D^Kdi;SkokwtJ^ZFlH{89Z zMIE&Ykq#}uz({`04IZ)Q-9tthZ+nL(=$GWL$NxGDQ>2i9Gk{`Aizc5xL^@GiPiO-xhTvTudFg58S*B)C zYh}RFCZIQvQo2#BtpHyVA)WZ1nB-gPrZ4gv9Cvud4Ve~-2MMP{W*zZxmH%@{LAqw_SV0Yb^HBi?moP(OM`1XUxwf2H0(cz_x^Hk{vUAOPwiktKaaAZ2gnl^b{GrcUbT&~Zkvk+Vs%$`Ay@sr82~0`~wf zUNiT6mvY?ita6w%QQ>}EKMgig3_tL2@mlb-n;+s01&&T_h?73+NQ0;LH`wTMzi@xDdeH= z@e@hPqUz=N@IdvgrWV-C%j3a|G&?ri3_nBC2h6Fdsk&78oQaNp?^_D?;`fYeKH=c* zw3>a5PV(UZ)U(?Vy{okHh#z3Xy!hVIgT2#t^~7s+p(~G^KsiOT6Bb8N@svJEh`4j(fRIQ%K-sxJl=|p*-dcemq#ohs=CC zp&H7M2&`b2-exfv4_irdhRI)GHGQwHeuK7%i#JxM0hCfv+R0|xi74%wDr{XN*re&) zBW{t$m{%HShu!H-FX=XBQO`*7CQS)7;lk{k33X$c;S1jIeQF6fg7n1NQbd3@c!6LP z`5LcO{BE=`13eBv?-IEln4x6TrV@*QQ)@CW#h7J3U`Wv5`FGDQj4R;H2-H`Oo$CR2 z_dRfFd_bPdi-{q(6xG%+_-Av1c6HD-e4a695;s8aHC@7hh}tC6!FaOjX8qzvsaW@* zVr*7|XCYF8D(&pLd+ewz!g2s3HVNdYJ4ZxjeUzGmA>PmDawRxlBi7eII?>%IbFW*w zqmR>5lcPbQ$QOeojX5z2uPp(jcT&{y%xH_yBws4+#d_ZeAbz;gquc>&hsfB=lPt2i8!iJ!;;P%aJmV6x^g4d{Wux}1#fQ9T)FY`Sni(6ao3)mid7 zjvHE5jh@}-f~;g;V&pTGT8e7l&}y!Em&AOiDX_eZHu`UU5-E=PTo z`u@<{Co{drGSn_eC?|sc)c3z(zg1XU6x+_>lsfd(1x%pQhJY zGg;~5wE-{dEUmTfLH}(4@yY66GC<*LG(bJL<<3vB9w!QX=w}V+_e40lTWmQrs6cgUuw#s4?bfey?)qO;p6}JJ zA~)U0DG`ZZ?t$1VEHQ?h(XXsHVqp!9_3(CCgoWesR(t>DrRBP`iZe|ga;MB98XBi=_x>su%*3v3$mD`FZTv;%=26C%Xp=rsaRumk`*Q>`gov!_Y$LEtw|z|BULE4lS-QC$~kRR7^tYD+a@v?u(D- z?|g+G*KB+W_RCAX$w;GT8X=W2bG6uP4EC(oOttoK4sslR3}?@3;$|>Ui(hZN2z)Vlxxl}IcLA{MuikkG2;fgyAS9=Sw@3h6Fe7c#~eTlf1ljLTKlnEsv^5=%e(9V z3>OdyvWtDI?s8Y=ou^xV_?h%Wv4i+QC$5VdMC9jQ*N4eSyUTmliD%21<&t-iy94%c zYhEK-UcFZ3i5OIdl0xrTrABd&+oSx&S6g13^|f`Mc9c;-ho6AlX?8RmNITKDC4cea zO90*7U*ss?H*Cx@^YLS(NTbF~F6{3HqugGCEMjQvfR0;a@e|Na%~Uw7Q52SOO%cd1 z^2ZT`e8mEQkG_Gt_}MT(pYM+E$~lvtcyd@HUj^*$mj5&7|DZKyDHL0* zQr~7C$CW7wXOu8MhX3??FZkmp{S}&ei{gBcVW1=2W|6tI`SoziaXa~RP?lb-T)S&s z|BM1(YjSQa>B0bE&S^Aj<(TOpp;n=V|QfQA(Q@}B%E;j01Jg_)Ba~pCu`4#7b4CNp?)d* zRdjZ)&|>xM`LJ0kv0rkU6$9%q!aG{uVkxsO`bX z6@j*Xk{Z(g?Zf$pgWMXJl@(`fi_G4_3@I_f$_%cXt_^fB(CtWT#QK9N&&bDvNTJL^_Pf59Os{*lk{W9s}a^0k7mh?F7NH0W$}hw%AqahP-Ad;n((?E`Tp@S-4vI2_biU7 zfq=}XJx_v>uR957&l=tZbZMG21T1u&EvAD4-mA%qq-8vsbKDECzL%T4G5Yl;`vVT1 zJ?1Lt2^+Ww`3dAWnJ$BCg0ZI@r|mNCFzTkpQVF1{wOd)AT+7m1aT5AebVYy*3YI>I z${W8QZ9rM#_|6Yb4CFnrqfP}ffMC~S+e)hryb_a35rIy978bPW%D7*5*@ksged69yD@YQ2CilC$A+?t^Ei+X8QED*qp5fD> zuLsUz2wP^Ww;9R8NXAF0z7HRzGS*IpGZtpn9S+S$!oUCQ^)DfBe^v8`_X|5tEC>3% zO`h+szn>RmP1K4xB?skn(lsD1i{jGyt-9r05HsaSwnbSnIPn?Zk3FBcQZ%M73^D9I z_w4LPsWn(S=kS@7sN0Fj5Fji+m`;sthc{VGXVe-*rp*UGdmI~kCkg=LZe&W(4v@?H{2`t@LIT^_Du?h<(#LUd9jz=tH99J*@% zs0LRHjB486Up_N@eVEpdmE*qJbOQB><8>~h?uOmHTD{%ZdJ{J>^?+2q*!%st{n$Yk ziy1EFiikx5Ir<&Au?y9iBlb#a(g*rkHT#2Wzi9RN@HZFx_HS;he{v|oqF`zG`uo+f zDSVUK$awc{36q{CHW9NYw<_7Z0$(d0+kE@?3RW8Xx#wS7Usz%Y`7_#%Wyb$Z(7#1B z?+=fk?S*W;kD{L(j7{KTZ3F@72-$|W^RLtVz`{<+d`g-!Rsw@MK2hnvIc-0!lGGmb zDDP$Z0qu%usXOG}Ic#LJ1_+=zLF((q2freVvTW0=>m@dpr2 z^d3n3N$-R7cBq+8L8%=+pOtvHU0`OhninmL@Z(D#DXxvF!n)(>`rBD=wsgzKka3Fv ztXpBOvR$~E3HumEGuC27E$Lf%FH;o_LNczc8*kjyhSIXwNOfCI#LBd`GaMP%@+@ae zfYt0kcy>8P&FyK^$$;+L3?+e8efq@{Q_aj4l+c?Vm+F?=oY~qq+G6-{54!CVW)a~p zp;58gBFg!_2;jw8{*Y7-#El=b+*5vfs>FaGxYB&1L^a$}k{8XfW8#omuH)XC0M={cjAt(!sm!Vnq zrc3o{^b^jzU1(gHH#p9+{DKWjuP|yVCHi`o)&sku-uSPsUtaE!N4%hhy+6n#SiLn8&W zzz24yEa>7@dBF1*1YNec*E;BS+k+ z>2|B0o@QAa?|`VQ79qm}jsDjJAfb}IHK3g96K0z-u0-TJh{W|M1aV$8n-KZg)vV$D z)yp`VJ%L(`VJ$!cCTXE?Fl?Lo{vyRroIqb+-y0M|E#n@VPw*oN!3iauA>KSecJaRM zd+9+3^3snLl^d$Hj2po8%s^Qx0XJBZz^yaNLjBkheD_qzhN9DlLu2>4Ii6Mxt@%jS z!^55J?Dp~4#aFCl!Kt10*QZtZS1JYqvV|9c{wFhWOeYivC_=TKbD}}_8`~z4kLDgu z#^0xkz=+Ek(=As9?1iPfRgg!Y)mmO&M#3eiRxZWnRGRF8yEPn;UZa`8O#C{}cr-4y za@$YF!gfp9=!)0=1+hmD9-}?!o~cdHYCq~$Q~jFNH-5LHRf$|}V6TuYLgu3R1jxfX zr-iHBV4aE?LNN@9p5p2OX_ieICQRvfhWaRkEe_ieu;cIOp+W`v-mH)80TpU5d6`8~8@5F_dWA1{XpV zCVOHM5jOh=5@wL(b+BejbaWfn62(h3cxWeYcR=2>Jf0z+5#hl?=1fa?3eKWU`Q{#F zU0R?eM15e67x@XO(++Aa!T4=U)vveyGE3iG9uuFIE=$Wo9MU~d@y_r*LWM`?-4euw z1|q9RPfiBeq1#9goZYO^ri=_bf5+{7#lg%W@|ptWvi9jw_VpPVSqEa@5?!1~>SVVT z7Ce58bc*vW!M)-=7170_u*LPj0MM6m-<6p1>g*T~?d=g??pGhBss(s*Yn8&9shhVQ z_~Us=)&-%1bo;kn;d@mdKZ;{DSXNzB&3ps9u;{Gh(v&E{IyZG^l-a@Tpq=iiL$?O* zo7?{Ya7s#z;|Ss?0FX!!CMz~L*?Yh$8bVf4N`?E|#kuF7Xm1eVAHy_J@um#FB`ZahsDwCubiyP9d4#EDzw?t(J1L)*87qUEHcdlcMTS#Uo|HZd6poyP+3$<1aeC$@9q1w^x6%ryk)*A z%jp}8TIgB{97zKnkBu+f5|)L@!ZfyS8Ag>HxW~iAPNBNiou>%`GsEW*QE$o{yA(C$ zV9Zm77CvNoAdQhG6$-uNe|?R6ES1u@0PP~F$bI1@f70BXuDt&E0+bx zvIzF!bsl{|rqgpscKc5p-6P1KrbbxMQ-Dh1baY}MFGq{b;Bsm$yR-Ek=RPOek}@0y zz_Pk@+YY6$`x|NV2&%{*Wh_~H+H1*-O(n-szU_{h4L=jmPLGdDQoE?3-A#ahnf~=F zd^-25)+sqE3nw9oqIgiV(sk&&7s**t)>q@Y!+C-na&S*|CtH-5WKI+{cGX@^j{IQ} zBa#lfTRqqV(8ImV;eTKmR=yAEmDayk(kE{Beo`BCzopPrFc!nx$_6btY#OPg6kCu$ zXm3%vI(A$7-Fnn>J0BX!HW$(u*3rSe_X=CHtOyK&B6d!Y6idvgTWeKp0k(4*lh>=4{I>qmRW$&un--gUwDG=9vRi-dNI@X|nAiRM}i9KP=ZzT@uP>)eO~v z51mY`^@Rjf9YA6CTd(>2 zgvWY6(0^=VRJ94z;#g zu~S++JfdR?lt9{b4rKu52*6y;wEi(MdOff0R1U{le&ST%TF14h9<3ue_+e_aUOMwq z*K32iWIshd%-GeUy`Qd~j~y>}$)!{9nkCG%eIUxjU z>Eb~R<;dob(u<7+4Y=1za)V&pa1y*WqIkr=MeA5`;}f{JCN1BdYIB(8mOlMJ(Hsfl zCLsLA4PP7#0@6Vp|x{@Se?bq!L_ptny9?xmH}vu*sBby=o4f`*e0yZ7;3m z9$m@Qt(6{7Lcj}+Kvk36kY0Hh1gaZcUh2TET>CIk#>}YG025rjD_qGB8vW0x8tQX} z2s2=VWO-;14oC8(VPh9IUY1;CXp#kVB;=^KYXBEvl^U0mo{-Y%B3AxTG>rqwk=Lk6 za73+vjP{u&_r0fm=`Sfuv11#_dDxa0g#xH7VPiwG_aFaXkV*f~ep^s_FGlhehK}1g@`7%Md!)%djcoecTw&1k>b#zCDU@0ah52VW12u2dvsw!V1I?WryiAj=A7}DKoXC+}!<(uEbx;JZb~p94C(RC;OP;DZiE-(IRit`b9nP zm$F=y*8g;AJr{w;SAs>%5&?O(=GST^WI#SW^lLSKDQiysvxY94`mgSsX(eMg0J53?$!L*Yu z6nOB6AK?c++kC-|DkB{jy2sZ#&wg>wwuGl0*NCpl0e9#5fEFN$7xlOMP0yzgy1_w6G7j2-X^pZ;3?Fg-4fAY{Rj>>)5%6YkL$ zq^P>&`bZ>NyYdXnybq|yMW4vc&!IACq(Zfy#ul+O`GY`npoBpKfs6>86zQm(I{`dc z-J?jSSkM;7gLf>)G=8-tV(y9ZBiv4{*e32{uo)S*E8H?;OU;`jQB~Qu_fx>+NjkqPi7oyO8j8R|rO1)2c_8rSX2aXEmu z)2O{tE6?o3CK?UeNlSMY74c;dC_DQBSsr7{yR>cG{d-Zy9zZX9B`~y1Ha|uA!09$o z6YNS+t<|b544NWP=~5>mP>wJ^$|VL_x$#(w%e^}XoAA-~NRqhT*htH0*8^;x1uIa% z+_@i!X;)Nt^((xc1w}yBObG`}i}-SfKye2{qhvW)a||vSz1x!9 zz7s1sUuwtFBy$!c2C~xisYV*HJ*N^fWZ3Lv^dXovxmLT>A!&64hn-@ z(}IHSNtrPZg&AwAM61`s-8xr4`45}({(auPoh2TDxblz~b>&VQn+vPMX&Q^RV#a;G z+9de+m^MpSgVRe0;0&Nu)uAfo@K$ZMnQQ8V4vMQQfl#T7fB5E7&CO)jmD^J>&8IM^(JcQF4NGTHTn; znU2^62In9s|9Om&#flsHbqf?rWfK*4E`H#o@*dc@0kLH5#uS-z+v~}6MMZ$b(qf{_Y@P3h`l1)j$<#s)nQv{SxHG#O&P=9Rq8??z2rKxXkwMQleb!)*hRL?8E z)TOC;(d1jx*&;+OY#ckRA;6Zj+GU13wQ1|}N~`}8o&gx6Wy(4sN9jV0wdE}f5GVjtN-IKgzvgrzeN3c1r*_PRikcb?up(KsKHomqGoGZ&) z({HyvZ*6qc=0~oetJ~OX4i2wHDfeY9KcriEy74s)?I*^j%{6VB4Lm3=v@dD$*{lf5 zw{)dLL0Stvnre>2%UuIe-a!^&_hsQ_w$p%iIHkFUjm%NP#KmVJfcB}SDqs_M|FihO zgzNJ(rJJ7g3>){$+@rJ9f&Iop(=ty`tEZwml!fHi#U??QyfZMqA|B!JVw4?Fnz01j885HMhVy@I~+xc}#iy?;Rn+rwh)A=$QbHWh6KFE0Y zYRJ~8$WTI}T{ky&$9p-WX1p%EI4_?RThAUI`I0P{>Y>%sdpBsLp$p=f+nV~X5cFFv zY1mW{E|hjPJ;@m(W;n`|huMrC30kZfK+B_`>ZzC%EneHW_}P;mb^=U9Qx?zv5FSnDB&Fhe1ptB2Vb5pd@4eC{B7AZY{(&JBJHKIYf&1`6?>?>A zC(nwWACe+}doAimi0V3I;E9GC;+7*#Qo{r(yQHA$~??J*A-$6zSyf= zq{DNe`1h_hb>Jsc>dHhlJt73^jL1^nA#Ii`?lty5#T)f}L{CkbgV@PHmGPoyg3e$& zxBh$y=SUxNk5b1<*a-%Gpafo1^WaOO=ya(U$6yNYj4X#vZ%qXOQS(^~!?6VU`NC2g zpjYo^*)h9-NY~V5mG`&nU-s+3>1XNgFo7Fat`qxtg%A@X9-P9oB6Q$z@Y#DtyFN;} zj;RM0gAtC72o+b%?D?X^IfKZBBFqp@QPBsbwb3rAX??abw{vPvEXJICL`ihP)hajO z@Y)K6J~(P-j&^53Go3$o@~CB=mo5xff;k#q3WN2c^ky)i4QBY4_u(A`?Vy zko2L>V-HCysuDmR&5u&dAHT}@l5od+e_ItclG|)))plc&%1qKX5%~dSYuFGt0uGT- z73S=}ucZc^rS_IaId^g2tb|V0>mi5g$$qYNsGJeV!|P5OE%L}Cohs22d&CBryERX} zoqz($*z8qNmg!J8A0Vz{&+{lj$F&?zICO z{1Mb41a>qohE6KU5Cz(NVRRPYy)=fhHuqr?_Zao>?>)+~@Klk^ZdXgFpAd)ablXHi z_H1&aVpZ%NwL5rxAuZ3Zn1H?9AqKekr%(&Up$6UU5xE#@mPkggQL~uYm;Jf=!5=;I z`SqrxvQ(hGVGDe+qp00brOp(bChDqrMjmbRQ)D2Zx@UoMR=JOgFj_!f7FYSMj2FNo z*vO5n@6}?0u)V+1EJy;2QR9>lK+d$ZjM3*;rM~(1^(}wZd_z4Ikwd+7JTAvIvFpdi zMHfP#gb-W_E8*Z{(}xyM9j8&6UDw>sYn*Pj_Z$N(EiCPlA9B(Akn?KE*qN3DI;$WW zrO7)Z6@fv)INH-sv}u|!M6P=24p!-vH+Ey*rIy~niV#;8*>kk3DxyNz7;iAwjz#!q zmg_oT;*g{LUtxT=hkIAu&G0xX3)kl0MHq8k<@BUjYIQY}(#Zo+N<2mk&`F4<5bkqB z*y2hK5cuM40~A5HK@`CeTw)-d5pFWqrd47wV(?~=6-5Im0)UMor|BjYM9q^|Yx=M5 zNzfIqQ^OIuW7&02-;ylTP0bZb3S(1d;cm5LwjZEew$ab6jK7Duea$%X2w#r!L3HLT z9%Dz?sq}PT&KF}tIr;g{idN|dRkF^sYH;dIb0Tle`JBFU)#{=~#*wj6jU{Bgrm>Cv zNiCQq1O`27<*$*1xJlccet4K(l!Ri;2jbeAJZ|P2qOm7pVhYS2(^Q&)b?B^h*SKAG znFFmh$oep5-4Vdy1rZvIdzluP@(?zO&Dx<$H#SKfHt;BZ2e zLYtp5ltKp#k#mN#ybiWL(9}xzK3K{a_$ZYa?*BZ9jIlFb5^ZO5T~h;REyf=1hNix> zs!Fpfs(fh% zY5`Gft4Rav5|PFxICZSfOgq-aYD2cCDDAC+#k&6^3%oK1)v3f0Uyq|Xbh#Bd#40;V zD9J*Tyy6&glgnHgyATL+7G+Gf=m-N<=xnO zNq)a2yTe5sstCXt(A$A^@nj!NQZFp*;a)_k>n?|@&TntwO8gaR>8x56$to9KVPjb} zV(-Gxg&Wf0$PE!gLjI#EEq$y{^^$v{=4K1~wvJA;%SyZLsONy^A8>&?) z)+@qvU8wC8Ixq=`%Z0Kop!;t#Xe{K30_rUb0sel5VX3~JlK`CApk8#IWcbI3GC`bucT+1Wt%fOisM|U zT;^k?(3dOO_W3-J%GbwBnu}6h{hw+obJ}u6fgBwf#{ zHSAi~$ht}#Ezq}F(5euaM<*6dlfeOVmSkOAyj-3~HNTecBF1E>=D3swbX=Z-eLq9O zkqzbKqXPU&ed>Qm$3vC6Q|r}xx8dTm%~OF;2?~a^v|MI~Gzk3tC-Cq8-Hq}8QT^vW GcK$D@ax~2V literal 0 HcmV?d00001 diff --git a/backend/tools/TestSuite/TestSuite.ApiTests/FrontendTests.cs b/backend/tools/TestSuite/TestSuite.ApiTests/FrontendTests.cs new file mode 100644 index 000000000..4acaa138c --- /dev/null +++ b/backend/tools/TestSuite/TestSuite.ApiTests/FrontendTests.cs @@ -0,0 +1,62 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using Codeuctivity.ImageSharpCompare; +using PuppeteerSharp; +using TestSuite.Fixtures; +using Xunit; + +#pragma warning disable SA1300 // Element should begin with upper-case letter + +namespace TestSuite.ApiTests +{ + public sealed class FrontendTests : IClassFixture + { + public ClientFixture _ { get; } + + public FrontendTests(ClientFixture fixture) + { + _ = fixture; + } + + [Theory] + [InlineData("Frontend_Home", "")] + [InlineData("Frontend_Login", "identity-server/account/login")] + public async Task Should_render_properly(string name, string url) + { + using (var browserFetcher = new BrowserFetcher()) + { + await browserFetcher.DownloadAsync(); + } + + await using var browser = await Puppeteer.LaunchAsync(new LaunchOptions + { + Headless = true, + DefaultViewport = new ViewPortOptions + { + Height = 800, + IsLandscape = true, + IsMobile = false, + Width = 1000 + }, + Args = new string[] + { + "--no-sandbox" + } + }); + + await using var page = await browser.NewPageAsync(); + + await page.GoToAsync(_.ClientManager.Options.Url + url + "?skip-setup"); + await page.ScreenshotAsync($"__{name}.jpg"); + + var diff = ImageSharpCompare.CalcDiff($"__{name}.jpg", $"Assets/{name}.jpg"); + + Assert.InRange(diff.MeanError, 0, 10); + } + } +} diff --git a/backend/tools/TestSuite/TestSuite.ApiTests/GraphQLTests.cs b/backend/tools/TestSuite/TestSuite.ApiTests/GraphQLTests.cs index 5358d23a3..615efa372 100644 --- a/backend/tools/TestSuite/TestSuite.ApiTests/GraphQLTests.cs +++ b/backend/tools/TestSuite/TestSuite.ApiTests/GraphQLTests.cs @@ -105,6 +105,14 @@ namespace TestSuite.ApiTests try { await CreateSchemasAsync(); + } + catch + { + // Do nothing + } + + try + { await CreateContentsAsync(); } catch diff --git a/backend/tools/TestSuite/TestSuite.ApiTests/TestSuite.ApiTests.csproj b/backend/tools/TestSuite/TestSuite.ApiTests/TestSuite.ApiTests.csproj index 0a7612c2a..92d0429ed 100644 --- a/backend/tools/TestSuite/TestSuite.ApiTests/TestSuite.ApiTests.csproj +++ b/backend/tools/TestSuite/TestSuite.ApiTests/TestSuite.ApiTests.csproj @@ -14,12 +14,14 @@ + all runtime; build; native; contentfiles; analyzers; buildtransitive + @@ -35,6 +37,12 @@ + + PreserveNewest + + + PreserveNewest + PreserveNewest diff --git a/backend/tools/TestSuite/TestSuite.Shared/TestSuite.Shared.csproj b/backend/tools/TestSuite/TestSuite.Shared/TestSuite.Shared.csproj index 7d3009b94..9be865dad 100644 --- a/backend/tools/TestSuite/TestSuite.Shared/TestSuite.Shared.csproj +++ b/backend/tools/TestSuite/TestSuite.Shared/TestSuite.Shared.csproj @@ -16,7 +16,7 @@ - +