From 058b3a531bb71f5ee352f59fce92be878e9867e2 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Mon, 26 Feb 2018 17:36:08 +0100 Subject: [PATCH] Version 1.1.1 with analytics plugin, theme optimization and plugin-docu --- .gitignore | 1 + cache/lastCache.txt | 2 +- composer.json | 4 +- composer.lock | 23 ++- content/5_info/01-release-notes.md | 11 + index.php | 4 +- media/decouple.jpg | Bin 80293 -> 0 bytes system/Controllers/PageController.php | 2 +- system/settings.php | 2 +- system/system.php | 6 +- system/vendor/composer/installed.json | 189 +++++++++--------- system/vendor/nikic/fast-route/.travis.yml | 14 +- system/vendor/nikic/fast-route/FastRoute.hhi | 20 +- system/vendor/nikic/fast-route/composer.json | 9 +- system/vendor/nikic/fast-route/psalm.xml | 28 +++ .../fast-route/src/BadRouteException.php | 3 +- .../nikic/fast-route/src/DataGenerator.php | 3 +- .../src/DataGenerator/CharCountBased.php | 9 +- .../src/DataGenerator/GroupCountBased.php | 10 +- .../src/DataGenerator/GroupPosBased.php | 10 +- .../src/DataGenerator/MarkBased.php | 10 +- .../src/DataGenerator/RegexBasedAbstract.php | 74 +++++-- .../nikic/fast-route/src/Dispatcher.php | 3 +- .../src/Dispatcher/CharCountBased.php | 9 +- .../src/Dispatcher/GroupCountBased.php | 9 +- .../src/Dispatcher/GroupPosBased.php | 9 +- .../fast-route/src/Dispatcher/MarkBased.php | 9 +- .../src/Dispatcher/RegexBasedAbstract.php | 22 +- system/vendor/nikic/fast-route/src/Route.php | 17 +- .../nikic/fast-route/src/RouteCollector.php | 48 +++-- .../nikic/fast-route/src/RouteParser.php | 5 +- .../nikic/fast-route/src/RouteParser/Std.php | 18 +- .../vendor/nikic/fast-route/src/bootstrap.php | 2 +- .../vendor/nikic/fast-route/src/functions.php | 6 +- .../test/Dispatcher/CharCountBasedTest.php | 9 +- .../test/Dispatcher/DispatcherTest.php | 142 +++++++------ .../test/Dispatcher/GroupCountBasedTest.php | 9 +- .../test/Dispatcher/GroupPosBasedTest.php | 9 +- .../test/Dispatcher/MarkBasedTest.php | 12 +- .../HackTypechecker/HackTypecheckerTest.php | 17 +- .../fast-route/test/RouteCollectorTest.php | 25 ++- .../fast-route/test/RouteParser/StdTest.php | 25 ++- .../nikic/fast-route/test/bootstrap.php | 2 +- 43 files changed, 530 insertions(+), 311 deletions(-) delete mode 100644 media/decouple.jpg create mode 100644 system/vendor/nikic/fast-route/psalm.xml diff --git a/.gitignore b/.gitignore index 353a9e2..b8e1e3c 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ cache/stats.txt settings/settings.yaml plugins/admin plugins/demo +plugins/disqus plugins/version tests zips diff --git a/cache/lastCache.txt b/cache/lastCache.txt index 444d237..f3e6806 100644 --- a/cache/lastCache.txt +++ b/cache/lastCache.txt @@ -1 +1 @@ -1519575954 \ No newline at end of file +1519593451 \ No newline at end of file diff --git a/composer.json b/composer.json index 008b968..0b833cd 100644 --- a/composer.json +++ b/composer.json @@ -23,8 +23,8 @@ }, "autoload": { "psr-4": { - "Typemill\\": "system", - "Plugins\\": "plugins" + "Typemill\\": "system/", + "Plugins\\": "plugins/" } } } \ No newline at end of file diff --git a/composer.lock b/composer.lock index b9ec5ec..c60051a 100644 --- a/composer.lock +++ b/composer.lock @@ -182,21 +182,24 @@ }, { "name": "nikic/fast-route", - "version": "v1.2.0", + "version": "v1.3.0", "source": { "type": "git", "url": "https://github.com/nikic/FastRoute.git", - "reference": "b5f95749071c82a8e0f58586987627054400cdf6" + "reference": "181d480e08d9476e61381e04a71b34dc0432e812" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/FastRoute/zipball/b5f95749071c82a8e0f58586987627054400cdf6", - "reference": "b5f95749071c82a8e0f58586987627054400cdf6", + "url": "https://api.github.com/repos/nikic/FastRoute/zipball/181d480e08d9476e61381e04a71b34dc0432e812", + "reference": "181d480e08d9476e61381e04a71b34dc0432e812", "shasum": "" }, "require": { "php": ">=5.4.0" }, + "require-dev": { + "phpunit/phpunit": "^4.8.35|~5.7" + }, "type": "library", "autoload": { "psr-4": { @@ -221,7 +224,7 @@ "router", "routing" ], - "time": "2017-01-19T11:35:12+00:00" + "time": "2018-02-13T20:26:39+00:00" }, { "name": "paragonie/random_compat", @@ -822,12 +825,12 @@ "source": { "type": "git", "url": "https://github.com/vlucas/valitron.git", - "reference": "1712b04f16db5f243ddfa5ce26a9b51eb1948a36" + "reference": "4b32e6067a7f611113161b2c6f8258d85c16d0e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vlucas/valitron/zipball/1712b04f16db5f243ddfa5ce26a9b51eb1948a36", - "reference": "1712b04f16db5f243ddfa5ce26a9b51eb1948a36", + "url": "https://api.github.com/repos/vlucas/valitron/zipball/4b32e6067a7f611113161b2c6f8258d85c16d0e2", + "reference": "4b32e6067a7f611113161b2c6f8258d85c16d0e2", "shasum": "" }, "require": { @@ -844,7 +847,7 @@ }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD" + "BSD-3-Clause" ], "authors": [ { @@ -860,7 +863,7 @@ "validation", "validator" ], - "time": "2017-12-20T08:03:40+00:00" + "time": "2018-02-10T22:02:11+00:00" } ], "packages-dev": [], diff --git a/content/5_info/01-release-notes.md b/content/5_info/01-release-notes.md index b50acf1..ea445e9 100644 --- a/content/5_info/01-release-notes.md +++ b/content/5_info/01-release-notes.md @@ -2,6 +2,17 @@ This is the version history with some release notes. +## Version 1.1.1 (25.02.2018) + +* Added new plugin "analytics" for integration of Matomo/Piwik and Google Analytics. +* Theme "TYPEMILL": Design refresh. +* Theme "TYPEMILL": Added cannonical url. +* Theme "TYPEMILL": Added meta tags for social sharing including image reference. +* Increased length of meta-description for google. +* Fixed error with field builder (getAttributeValues). +* Fixed error with static functions in settings (added declaration as static). +* Added documentation for plugin developers. + ## Version 1.1.0 (05.02.2018) Version 1.1.0 introduces plugins to typemill. And because of the GDPR, the first plugin is an implementation of the famous cookieconsent. So heads up, you can publish GDPR-compliant websites with typemill now! diff --git a/index.php b/index.php index 3137695..b35a424 100644 --- a/index.php +++ b/index.php @@ -4,6 +4,4 @@ require __DIR__ . '/system/vendor/autoload.php'; require __DIR__ . '/system/system.php'; -$app->run(); - -?> \ No newline at end of file +$app->run(); \ No newline at end of file diff --git a/media/decouple.jpg b/media/decouple.jpg deleted file mode 100644 index 1aea4cd511a6238fa6669165381dbbbbd30e2e00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80293 zcmeFZ1yEeiw=O!s0FwzaXb2VtcXtc!?w;U2xI>WO!GpWIyC)C=0fIY&yF<_bkvsXF zbN=VNTc=*VQ?Ke(y}D^?&+gsbyVtkAUb}ns+PnC@_48%1p;sB5y zA$~xAa(~lb2L3Yemw~?w{AJ)T1OG=dfSP~;Kt^be4*)=d5`h28CnqKTlSg4^2LO_i z{xkod-UP_~4`YA5iT@+*=C9I!8TiYXy`4?X?JeCY%q*>KVIp+rT_5NuY%N6Sba|B7m7OImZEWRyT`e_zRkX}~?ac)& z=w6Cqf`z>Wy&at$E!|Biyd522Zi3z-l>hWDh{*pbW}_4pcD1k))R2<-_ZEmN5z2qZ z;^pPV>cz$C4$U~?kDCufx>TW58I7I)j%)-ve!p^7lAIuB0{cmlA+5Uj~FChO-?f+8n z{|dFTt+}g{o0FBhnvIjY(|=XK@jq(*8Bgaw)&GnrLXH3HO@e=P5jS`7uywVx_?J!` zTv{9mQxXv5;uL24zq{eTQScv?5d$lVVBBn{zr}f zTGwB?{znY_j~f5AuK%CW^`EY!B@E#|dLbOe-*A8=01XHPq5{!SQPG~DA&#dYG&Imt z3^4d97>ohI_$NUyu&^Q6SQvPC`1p8uq$DIHq%Z!J{&a$bj*gCrfk^~`5D^pL5D@>X z^8ab(cRv6JgbYTZKtaL*AmbpR;2`}T0FWTw=Aj}XUg-TRApww4fT(Ebh)Ny^00{*d zh=M>4K>4T9pGq7cgaQ|pT@1>>iN}S{ttL*%gZ7$=nt)J3iiTGjaocmGe@p-B5+UPH zpNJ}X97Glw2u1}X82LvoqDLGQ2$Tbtf?ZtQ)P<504=5JgFvXQv&?lkc8j{pVwQ1(Y zt#(l;*+2ajANBP&b80C~cSKkCxc?RPA6Xv}rA&B;4v|n$P=E-){|*@k3gHl^P&Z|F z3BE`yXb|h0+We;W`u8#b0|n6-f&xL{+peqp+PN^Hb6Ffo`J#HbTpGlU)2Ayb6F!8N z5d7Rf09`Ou-!j80^)=Hl&h}(bOxfWT%N1w7UJw-Yyi~nA2qXcR0;|gb@S(`b$j$Rk zEMek+5G7T)a4KScQ$PP}K`Z{x+jEtnP>_q~L$$JvK&+3=N@pL_iAQ)0WC{|26&{-( z2MHp0D_AttUB%ou%H0^Ri;G)G8mo~acp2Y@4ABEZ!I})us}Z7z0bp%02&w`Bg%s|d z+rh9}2m~M%)+t3n6*<B|2>BE7TTUgA|5y&m{5u+8{N-1vv1uz4U zsF4}Z1gQgWoU$G+}QDgdD%8u(!* zOzuPP^ScS25zO#}O)OCUG$;|kEeY0^$5h{+FJo;|R%L$2-H089mFC^yX34Qvr?2bX z5E>*9dg=Zfd8CwyYN7%)1dguS%kfs%idxR&F>8JLFiCD)JqcdjBO(u= z1OX9M34XO$Os?qr998D&G3My+K5+NlVe`_`CQBZe_rv<(=u`dm@%FRyg)!>O4SSJN zK7E0od(oclhtU4({em33(E>KAZjZ%vhU#0Q1(X>~WSVHBxBwDH(B^izc%iV50VN0x zSHEK+AwPq(^HUBW5*ZS8>%UrkglYM(?|VsEOwYIjE$u6#N}+_5_mMH?M@^A(JT}s6g6(JPb-IonPLvIPKi$x8$WdiQYgjff(b~Vu)bZ?okaO-D z4DD<@P#kt5YZJNhjZspT36kLxP1u)nmenjYNCp7D6c5*0D!^*_|gn08v0f zRof4z{pZ|ACf5_cQ~FHM?VNMX=i`YE8(Xl%xBY3udEh8vDhCWH7tcaxN`)O^DPfVofO5 zZ`0Sbu#$h?OC*dc0=p~;H=YTU;G+Sh0^57+i#7r+U5{T0B10lTXnQwKB2>{V+Kp>J zW=yOiWr37niZHcA5R|lB2MTyA_;vFj)y~H%GnKsU%(up^xZ_HLcC9I~`l_cLws)*- zdd$B(p&Gk9w&zgQ?UAu!MKht9Gc8LRch$s7mV@O{#U^6K6a6LaMVgF)EH-4zHyI@& zB@$Xlg_)Tnus91s(r&0;Ge!;udCQQgbgJgOXSI7r$P?x36N`fdQvV2&*_ZibN*L9i6Nmyk`0GbeXTu2Hfl-O8cZB2t4z}eyPmWL4#5rnSVGaA>ByjQ-ancC^| zxxe(&VIRU~7sVMGz(Lb;zM#nxo9KC6T$M4PWM-kR?A{2z_iQ4<9A1 z8Ip7py<|p<>1gGbbU;o4NMjrek!U1tA8rpv$s`vVc!L{=K9;VVxGpkV6jHTOrHLa1 z6Gno@#?H=sm%e_TZ>*)Wx=C0UfNaD!sFQ*$zyXosx?(AIJft{iF=|74KAx$D&u8D6 z8S=`-*T*L7XH;|f=XCQXSi)dde8dy>H{)kbDmu#g@;t%i$TVu7UgXJ)$i|mp(>!@C zsQ~Hw1nM{LXe)PcOxzZ$(`sm@0QqnLuw{=~t>>)K*q}2xx+0EdZ{JUb8M_`s9!VMW zarRXj;KStn0IKoW(NtwwqYl&Y#_rrDuC9#LlQUb`lA!4D2?|D6cD!y}IP4AYPEU6W ztDTtj)xpy{Znt)tsWq0B+-|s;7B8odM_tZy6IBgtI%=9ysTL4rlnmg#s*k6AwNzGr zJ<&=Rrxp?@p-cZFUg?x>qLA4xx%nnL;Qsn1imzV`o4TP~b_z5brK4%b4~3*i6yP2) zs$sm~tIW%rv$B6h#yX~8)ZxMsCzD)VbabhHJoI#8UAB(taqsKVkCwZbx$L*Zb<8(K z)ruCrqf#`3gBRYOxT6|)N%3?Q@=w4eHnr>(IArK=hz*7bA{`?%Q6|>8(xmbc3kQ@; z*WX-ONaSRzx6NU?+pY7yprL5^#O51C86`N<*+wry!IBpVt2j(OC-!RXrALgDtO(Cl z)l*J+iwc^MFEpcv!@U!j{)PeU^xNuJvjILI)Tdju_$f;D0Geq@SH4uK3h9Y-`u+SJ zaxu0BT+tUZ_8-XNva`!2P?Ozi?Z*xrXb`Ij6m)H}wEe|x{^Z(V@YZXzB=?P1TW)Xt zw@pbE;)EF*UnK^Em+E@5V?=~dpq43;j}u!hmdN?O@Atz(1x3qu>7Y)xH2>pcjCqTB zMvonI1!(hzq)nt)xE>=_!qr_>j-amAZit2&-ds=&!)MM4e4Cry$-6B{5IESH?^Car zNF*46K?3J6M?}wIqcrr+XxHj^)apCE`_)jbCyhrWN+qvNm0Lx1gX^X6k)vd}tb%DP z(sbuX0!q&N>yMXyEc>N#f)1m0gUL79uoa;(%V|ZLkEBjjV_1z8BR42w5D)}T?Dpfq z)b+?RshBwpeUcnk{UaA;6wv4}uIvLaIuZq7=}P`e3AaKFvEoYL96a8+o@rmXa~ySz z771QWoo>FX3o{yJfGob*dB*Smz?Ei9o_+4I%YLXfN-ClR1|2E`86`1IG)Iqx{g$() z$FJWD>F-s~&YreS_>A=Ehqwj!nBVS1jD&I{6Gz%$bf2efE-KpPD)7_PV?3deQ;YsA z*U;@D8i$)-3`HhwDcSz97T&K01yMpmefI)aa^Xv>_DovhX=MeyZ{B&&RSIS< z)t5mJub|VF03g_of<bl=!j!}~ynm5ZY{N(mt2|yi%bC@0 z&FOPc#>iLS^u~)si#14;V3tWP#9iH$= zR^<{~#_&@;sXl&ifkI{@9rYS!U+e9<7lX8)0D>4PLrMWm30DuU0@v>a{a2z72nsuW z_gC$6E!szO(?moKNk&2`Fr`XO0(0-zjK!kt?kQy7YxUzmVh)PPu-^!Y2o!**BzOn} zjaHn5(u|C33n5XFp%4&ViARV0m{KqjF^_M~<>b7Y`0FxM0wQtpa!?8gvDtv8fB{T& zBnYcX8&l-HuX?XznnrB#Ugzj?F(%$RTqRo$2z{%N(d~q_LzUXcE&<(JRbsC-`wUz@ z9`&o^#`z-@{61@Y$y(2Q8WK_F3|HV7St$UWb_&cJFyeBkeRA?%Tj0jglT|~;(JVLu zL^38|LMqU-o=fm%I`_WP;y?5fI{3DrV%u1pJL(0sZZzb4ysz*Tt|gAr0I<;v)nK@@ zhstYW=4UYI;PZ1d)N9O@Odt^_9-yv$ReJatsFkRWi-WBRa)d+zAaMM0N;Qa@- z+C4${^kZ)q2AcOP!NqoCn|A`Db@&Efq+EY=?p+-KDW|(7Nad8Z3hOWF7mh~@PlvIH zxW&o2B_K-OPE_%htV&SeykOY05z#iQkwOmK-&(~E6J+z0I8`yDOT=6BlQJewA4C=n z!T=Nl1R)iL=7W@0oUkVj)6yJIJSS6b<&=_)#@sM@hm`wRYQBBC^)~Mq9ltjrOOSte zdos_f1$`?8!2&oOcV2dMvq*3QKpS8JDCutiYs1y5eD#4i&g6nT%jaFHj1HPljrMWt zJW|O?;AD+HV>%N)7-BK?9Xzzq*TWN9QS_2MQ zD(*pPe#$(%mkGaU9rm+NJ^qLDdd3R%CY4iKW%ysr6sXl=$FpxJ&rR%oP{g9-q@W;K zs{QlQc^#NPMdXovajM5=@j!iMgw}#UH&RmPb9D-xVe0jBIs`;jF{VoW4S=Z>LV}<{6qqGQ zc2_fP89X4UzJWc;*ipmKlyGOp>RgK(1Iw^lu!T%zec~w1#Iu<=SObG+l$g)!*PFW< z??upId=9=D_Im2`yva0#h^IZyJi@nqzVQkY0v%pob&!_68mJCBj7#xmO{bCo1ijv} z7sARm;vrLx?tZYmJnn$U{A9Q3FU=6XdpA+~#setaQc=+jbN?J_8667!#FT#N$9#Ft z+$FG5a!mcgB3Pc;g(gvCmfx!S{UEZ#j%PlVs(ljc^s05N6qWg%TAj(4WGPE^Vyvl-!Tp_n-(le z85SAUF@&Ho(T2_n?ho8tjhT;FIY{sa3)cSd@W}q^l(aqHT#oR_s3i4|x-J^ZL-D9` zzqQ{kR^Pj90;S(h&zp1j-=}}{ur}(oodG(ds>oD3KdCOZL0hK9BZfuRiJGTx}f7e3oq&RSlt!w2KUP&m6Zl>cGlo zeLqVpDmQgFQFA)_EKfx-9! z*YmXB{mDMn_rg3P*{?k1OEu2GMx<$6fU3_^#x z92X-Yq(69|AgNo=+&tl1l)S44&MRMgAEN?Ls3TngA5yx{Bfae+S<=19#SynuOiBUZ z%krAXo{Nvifsjj{k9$i)b*{08(6>$g+d2kS%~|2QFZu~u6`EoP_O4BmVsJQYfIus@IB*wMVunEXR_-rINH$W6dYVU8eT_;ThJN`V2inXB#K-tWR}`?jtlR zk8^vpFVdFs;@&Ho!DeSK*A0P1n2xR;)lW=qcU(X701pHG1!8=8Sy}CKeEh4*QaUFT z;i-e)q9)2{hAKtkOP>!FH2Mzzar!Z{14VOvy7Aht@4tQP%zn^&!HNO>h_ps~_#BrX`#9Upi zC#(PC8`}VK*jxXp&(7x=IaEuXR_iQ+*=h)g#H}v=5BG!jMTN&BrCzTDR~kdxCnEr| zg~X?pgSLZ41!V!6&-d^`iyakoH|6?v$edl)RJFpZL zs{rQqWc$sxwG0WqPPfA@mn5Szgm1bwyjN}nZp*p;eoUpo(&Lu7XW^=liwZWOrteDuJqXsOdWV{;*4?aye-7M}}b`}rVHO6t3}m{-oQ z2@XggHZ$+lt8EHhyeQC%vzT@R*rm9gfq+;H&z}N{;678*=5KYvyGtMhg{s@|p_X*S z+#!f*Z6_FKEbLXP7VEfOd){X*wb$;uv%A(Z#$q0rS5`C6IwUkPQ&npqw6ha!7w6k( zH`w9k=Ib$e{*|`AVd>bd?fr{|O(~cCH%8$QlAhDSZ;d~C3>6Z#K0 z`O1D(p@u>cM;4x)u3>q4Ac_Pxa$KJO4XYf(K}c`lr=I8P2ykydwW2Exh!ZgEPVEp6 zSr664U60@_+-}#*WL*_jcMR_@JexQ+lLO676qRIk`CL6eQ%U{SQmr{5?-3^{G&$aq zQR7iit#RW`ak?*t>`E%My=`*~%h>+zx#czXXEyZBy;6;L;$P=BY83EbKHB?npBgDf z?yELjKKf)Ym0Px^r1VFY|GJns00=FN&9N?A;AGSh)N;#yaP5AeQuY5y72!mEn5>YR zj34)2FVo~hnkvma~-1fJ|I=IE$R?Jf%{Ac~~FU0r#ek6*#trN zixZWT8+~F&k$snhOtgC)K}X(w05K9m`?~e#C<>8gR1@7lH?(|d8@l4M3(Zp)wR+uo zK4k4q?;KH;9ghaqQHbg?Nl}N`XI%QZbHFu)TB@ff6a+uZ_>OciS)G|UcI4@ zcwdK@@#1NUkqQCf1Ep(-!NAdbi|Wc%%NGBda@jq+!Pbm^5WJ}ew6zzhD+-ciN{$3o zD306*Smzm&dW4K(&dxJ5O}U*mCaxOKQ(K46GmRGT)E!^cb^~wiGRc$(w-YtNEOPXM#T-oRnwUOolSZ zsKtd^a_ugK zFGmyb<|FsIhsyY{AhsVN$VkN%b51#31fj^udQ2~gcfQ}2F(P1K@jbX5KDs&sa3)hg z5(Gh8h}ap&^z00CywS;aNz4&b&5!H%`sBX>3Cv=U@JK2(%yLA~C*COA0b#%qSwcgS z>#@woFCzkYb}dc`ZEI;V=T(HOsp^fN*T`txE02)+c3>=IyYD?=NZ6beLrSm-7W{eD zR~xbOCDujW`Z=UneYyWUS-z^@@k#TtF`P^Wl|9SCMF5U1OLDy$Jk9viXI;T?E@zx6F@K} zN=f8jAVR76rAry3wb)q;B018U;s}w#(WICRk1r#B zCc=CF4wD|4Sd>JCyZ}^=oDHB%{$wke91OC}m#W|P^hl$~cY714=~hFwt@;Sz6nf4R$OTQB$&$gh`Rn*xVnDfgqavwe%8+GC(b~PDqy2}91Q~DT~?027T z=^Lt$5ws+OCCC^+32KlafFym8#uzct+MA2rDB9H8CMQ8ltwteYReEyvrYyqJaF4Lq zsr~6pMK(=KhF;n&96TJrf=RSV=g7NVE_SVmvgEz*qS#buNrMv6QXLyMdoT#>c7 zoNBa04z@fw3U5m3KG@d2VczSJ!xh42oolEr{90SW^TkMvzflLNwuidMIOW+Wt-V%6 zX|mP#xa_r9Qg#XeVi&kU_Q6E(d1aN+;dYS*6J2U=@#Vs7F1Q&Kotda#5G$y~ouubM zD#+EAOwEYH2$41eO%WK&Cke&aH_F$Zku6PLXBbf=cpv?zV(h87JMhF3h7*aDb@-H6l<{R3vvg$)~*JK9(v7}{6 zj8sU>=@xO>-nD+3aB|Fo2@4VKp&aU`$@%*nw(MeF{%hps1!y-h0JP{41bAYuf8^)l zkMs#r$-K9mSytViL~B4Y7{^N~9X%i=C+yqjh8d@goEfjhEsoEK0vSoBk_p0xl*f`D z^(1H|%{I>4+i|Wr8q%hc&>6IGGBA(gTArz0d2t@5qf1$lUi1-{>OGY$u6fUCKammM z?=@;-qF71-5HCUg%p_?ZOP+n#>FQrd${7}yf}BL)oDi?ur-@lV!t9!W3QoY3WfWJ? zpui*!C$W)c5_<~SwLuGl%t^{%Q9+O+spg832zI+yuQMx?M~erfame&Xg6e%kx<}GN z~+@T$U zFjlbA*Y~G$GP-@2jkLaU#wPbJu!dg0^S|Q+H|AE((n@tp zh`$!n#{IVZsXPc7gw}_tSTT9C?Yk>pVD?sA!+5+jRbHIABct^Y{y9TFt=q=j^?43E zS|LcgTnZ6!)ZkV_Q&^@?#)L3)zSkw;F!|cE|0;K@v?%2p%n#|9#*=F7NjUP;*=9~t4b3|Z)aqrSqjV`!91%W6+e=_Lj|xL zurdax`MYG3a@^F#h#kLcV)`*woiQ{hgvS6<5Q`Nd$TifiSqxZHkF15HhX^tZ zHnn@T&-*dB%oNx7)Z%0yVguV4_>-!tb{!FHFD%{B%}PyVy`3X8O=oc$8v(Y%B{O8$ zDk>@9K5EWTcz~Qa%U=;2IPwMPL&~kKBODAST9v31XZCp@<>nCxhs1 z!U?#Dt3FL}*RPc9&r~9WfvpThXlnI#lP-PVYJYw1!(H=Q@X(~Y^a3dS`Vlg09s-#A zXeWD+U0n`(4blGU%somyFfmU0K7)C(B3Q z0;U-wq+DC3+$xP(h?`EaQFIMqUuudFAWt_l z5@>6=khOn((~F{}q9Q_dviqgn&ApvMO&kNc@lnjst7o-mcNX?$_E@O%Btez*Dq!f6 zl!fn^A^h}(^V-i#FGS?@`)@#w-#OvW(^jX}nh)!5#LszOwZZ*z9-fqV6?PjsXbiPj zByQ&4j1X`FCEQ%fq{e@7-hD^GzQ?;B@ZBw=6JneU0YPKamiplVd#C5LnR1>(u!X)r zmp7SrqWhN^p7HJHZ|;SD19JbRARk<3{XCH3E{hF*8Zdqp;O20Cc87nu^>b{P>PCnK zqGf=5F*2=2-x?jXp+b0C^)2ng$NL&FT7coAEEkn~J8gDQP2HX69mkmG%+qy`F2AAX z6-Sk)X2El*G7mLpe2T~o?>;WyE&;vZCv49ExG?yJLl;JHn_)7pv=0WSGVL!0w82$F z{{~UIQ#E;-vqvi9fW}8qUZL?XI(g!jcQYr86SQ`wQaFz4v(KX6W@=0L$O0G(tx~ty z9~xr}9dS6|{dh(1RB}M&v4&q2#+1d8gC(CDR!}56vGW_jl7x+op6@pIq%QsjIN52R zom1E72vxU^{W=lLhJQE~=?>bE`}3giH6Vw;bmQJK80h5VS%Hg4 z0tUB0-dw}k(6>dPkm)675l$p+67D8sZLOZKMQ!_Z0lc%?^)lFR$!Oa0U0bin>021X z)G7%}%2~v<7{e;;3{p!f?7#(fPxTD?=UZ45^$bGFHIa1kGecm29fozqmKsz0KXq=O z$$jU%E1DQ*}|5H3qSf59aNk^e2i8O_}m^~?({x(v2`F$Kxi#l41cY$|g zhn=?OOD;dLs(3rcVkBQh53-yF?B-UM56u=D2Api_!Y*tobBF0YT+d4F2)~+Syqn?h zwPI8Hd}wZx$#b}ElJjo5!B>Y(;qxI;56QD4vug*F#7Kh%UtTs@;_Ji;=Jakt2A6s;5< z9X<$*F*O0H>xcB<=@!{tJDS8+P4oE5R1l9G*j+4#DofC^p+-s)Lu5j6>XdOzP>^xN zG>c-`z_=yRjHxX)b~qu@>G{o1r$SjIc*i7`qAms}_gXuNn|W;PCg%z&5*zCqS$v6_ zc{q~AcxrA^$GmRAijgp&(u@a}FSmOszJWFboUU#Q8id#(ssBl~25Ll8IMci31kcq; zNz^jSLk`qc32Xrsh2_^b?w-jKG@Cb;3{(>ATCITMU|%h`HtB0dN&-YWnU&f=!vsf1 zzMd6h7%QxFE6=u>39G5Mcdvn}+dh@k0-rgmY?=(aE*!r>`m98M;INp}TF>iglZLh_ ztu(uBG&ECRUv83h0|)_bs5z^u=2L5dI;VgJ6;f(;h12B~nOmlKO4FWXR$|J5Gr(c@g3SD*TnizN>R2qZ^t9zU($9f5l_mHK zad!Tve9GZ`;)g^^o-Uj+gTSO4P1()ipv|*q1RohG`qKx9n;BUnDYVs{HG~G-R<*Tl zkx~^jd2mjWfBK8iDPQ=s$F0c{E;SY;ARla*wi52i23KP!5Xmo5C$prMa)yw4@z$h- zRfO>sMoZB-vU-6+{ML3oAehV6vwe#{Sp#2_X+PS3?(VqgqX#|@Vyx1CQj3bCJ?9~g zTjHbYj7eh%&oCO~iJcH?9z0tkFRl8L`F+4ugp&|3FJ8KJn0b3RN+)u{l%zRrIu|t0 zJVg4B+@Og=b)4%aYvi4jXeDp zFFitPn84XaQ%KIO8C(u^uZ^P}TtnMr!&jt^zT`S=A$VS%Y4CatZYwNzQ7T&puBe9+ zV@f6@rfB|xf33~e9_%;9UHx2oZr6T8NTID(S4{U-aq)Vr&u@8fW###+cX-Z+!FERw zS2Mp)#QVw0S}vWkpPrh*T*6lUVKjoqT0`1Z3WZRW zSuz$se~HcFi**i{GoHavO=_p<;PNjLm|DADMAu{Q_o~m7Gz|5B9oOJC6G0th98w+ix%JQz}d)POvOl(TYyYxpj zKh>zLoX?_+s8VOqFp~MWpCr%9o9d4jJJYfx63*j1;Es>g3p7 z?Bttdz&gACEK5<)1=}J}>rPZf&VTSH2RvGmPOc$jkgxx&j6sY^7yCu_O3hIbfPP}( zNqHd#4M4)?0GY)=FhE>I!Mo`48KBl_v{79hwVd+WD06}TlO1t!yGn+-zED(txeo^xhA)lN8+IpjY7p9pGsvKK7%p|(!;(G$HCmBx!gOVSAIgZ)i%gmP`3tK zw08h#W%3jbv3`n1b!XgMg!L(;61A8!+$v8E=i6AMwbeDjrOoZ1N_kzp_^N1s^7Z`4 zGSp75E~~n0d$UIv(#GW_T1@3*Lb4E|8#>D!R!t{VqNrWeA{i!-m8h#o+twIt*iNYx zAn)&}nvrjx&`8@I-baFRaiZ#(+R271V7&RH#67+*aZZ*g+<>;$;!LZscr?M`b9LsGoOsf_ zhmOSWy*gYyR%a5EBtox3$NEpBSvDnIFqXhX1T_9up0ew+^h2ey(Sjib$nsEi3{WKs zR>g@$OnYlUceSl@3H3>Why6liRfXtQ?EGE2=YEGQ36*{Jd{moUX7LIvH~UVAP>~7W zFZon$y^q!}!Zv#2*Xlc4vdv;2=#>NVZ$R>1)5N?#Z=RFcORGqAf+lt@`515KzzWe@DN!_;%`)DgVg z<_dUz$h!y6DiTu?g1KwwC$%&gD^LBFOw}ex$A;hBc)(#V?e3Qxe;liquI3ca>)y9J z_KvS;z)M9SvM6D1-r+s!(^n+@1~^|NQs)xXz&G4od1Wlx@4(!XnGjd=$rFk#wZri0 zHy(y9QN9)xb;^uZb80ax6yGd#7uIm8-}guB4m{eYj(@d!IAg`Md^g(7lSY$XeLVv? znD=_Q8y3-6LV47gUmik-5^U&~$TUC{roDy1b}kHhbZJ?xJ4=2UHKG|vP%rtdr$*>o zPJPr%yjIHXZ|}a(){o*{GLwnk>{_^W$!^8eoMNf>y7TUYJW$~vw^_`bJ=~=dWeq_$$@$DEEM=dPWnoviz z@nNVtk!0J!FRN0^_u+irUI8_?c&4pJTCdNdts~?h%IYH8?)?ln;_B+eA!J%xlIhx` zfmZ0zJOcT#%R>sbNBhqpM%p=bp$m}t6{W)xL)e1IkJuk7^Le|>Y4?gWzchvelN(?C z*9(nbbXZwc`ZZRD{tq;|jke)brB7v!a=mQhS^Gyue%-9Q?w5QR#VpoN@~o|F*TzWJ zffcujC1Su9AP>&TTCxOWUCJ_>EzLqMKMLgy&2#(Z&AWeO1jDUxYKWxFn&5@R8^j}3(cglNh}H_1DV-|>Z8F1=OU-8Y{_>*kKP6u>IS z_pa@RRzpr^AE+L6gd8$!=8$x8K&6Ez%8BTuqHzwv=u~q&<7UxYl@-G!{$DhBq;A|` zOWSd}Jdq&nq=Bdw|OS=!ziTSN6Ou_Qre`$4;saZO1>h9%; z$)2R`z4VS5+i>ebo%Z)1$Ew?vd2wMs2S;If_k58sKBmX4yf44z;%3iR`X5A;>{IZ5 zCDE!q`*OfSv`Nh=p{HhdAz@RB`d~z+T~(X}sM(o48+>KpT_}JLn{Ol0Q6|bK5?RiR z*!~T${gHZfL^5&Wh59pY<3q#Bvs9STtyXC6rA_yksRsW%yi;oZP$XXsh6RV45;aC>k?>XJOo!7GryZ3Y) zPR09d&wAYPM)tPabLK}%g=fV!`n$ePGa0_B8u)^%2dwe**XMmD zjyt*+eX^Jp%?nzp zlSeto+`7g&V%St<&Tm5px4jtpHFN)}cjFDyNg&JF#@fP94udwW`J;n*|6s>o<0sQt zgGOLS`pwr2X1z9^{tw%igNtvm^bKp7J>xshZ*fu-$NJD;7GTjw&BSiyWPJgY|9A6eg1k4>?@ zi2qr3`61xr58cIIhO7M?x+-s~kZziaaqlyb;Xg|bHQX&PN~dDe8YRiQF?;6T@|?UO z8z+%n`3<1#%$>_yKIQxLpxkTm8!*U6@nHgX_#qDV8G8^$9QI+mH9Fu{Kj;3%as!-d z#xd!Ev6)~o^dkdps=5lHSf>i`)wXM8;Jr2KTw@wLzVwmwJfVykrm(Sh z)u^$1o zCpA18BOYfjy8G3Vz?@~>|L&w+lG0Ngn5xi!jjEhqJ$;{LQ_*?W)$@M0_0i;Jv~#rk z5yRnU(PQYgQbZGxk-_&h@~@2zjhr?)`00)>5_zgSmOSB`FSpuaRTkTHidtb%KAV-5 z!XIuPKCM60gXP^?9MxflF$*)BEpRpKjGBx7$nrIujE~+CT0_M^`!>(8@?om@v$jU> zfd=ncuc$3S%2{emCzw6l2~FEF(9N1DkR>zk*yO`}PhgGjZ-Bwgua@JV_6rXSbvJby zzjR#&rnA$T@y??!`G#B&o79Z7Lf!@TZ%P-vmFF^oq| z9?G=LF-764JS$P8Mjn$jkQnBFmT&R?sh*m>VP8j!#cArZfir@Zsy+8=3unchj|}#7 zfwnK|{b1cU_WNHM==(pf-`C&!1qQm_rXw_W5=!@W*L%Z&OmkJB@X$62qn7u+fd+AZ?CHq9`p)Ct^cyOV#Cm z&vjRv=5~<&O7d!_YZ2W1Nqs{;Z)A!KoX&M_E__GBP+d{iQ+2NZ&QbmLDf(}~^EKn3 zl9mZQ6(qe!q467tu{NhR`2ggTV^aNP2^Q+3d~`H_u}^F3#ka1&C?PFNNnO`XQo8fe zl?E@xsmBCA>s!UW4VU_tS~;UGinhLkXR|`QzX8@>dkb_E{EUOjd;-f0{F}vxI|n`7 z^xWL$JlP@Q)*R~k>WKfU%QIl(nH^`J>5W86`$B7Vle*4t`^HyX=$@Nx_tUi3 zQL9VB146v#mTvpBJKV+$$9hQEbViw*+LeJ-PRqsNZzuPc(W_Kpvmqfp-emrX#Q#sO*#IUHh{=EF_7XaAjWc2 zl%V&>d4mdjUp$$ zcf9L7Bu?CC9~wKt$$H0+WMQ6Zkaw7^dqPa9f;?>L5e}dvwFn|%3G*bIL)92i}L+^s&f7lLX*lsWN1y-(q_wh`z?L- zZN~OzXfmf0G>3)xagK6i5f8IjI?1IfV=z@`=fUfduW446sRU!?$&IeDW9^!LdzN3w z{ZpAuyLBuH?Y>_WdEf6MiaJl>Z{y=#=Eu+57uSAvBz)&BmF2T_nrk_gMSPGB8}=U% zg86^tJ^LX7Gl}lFdy1IAo(rD{=~}&{c12y@^D@0;?*8sSB`MO=-Jpnl);Rx!GKuzk zYrVwxtlt3XsZJY{F~V5W%r(NKK|?~eCu_JKy{!`!t-nZ0LkN$9CPkeH?WxaYf ztjq9a?x}}zY8j35bH;Afr45f=`&j2*4_F)lcWmcQSF*fdWhFXu{4ePxx+n27Hn!X& zuQ;&ay|*NR8EqczzVEwS_Dx$KvF{U;I;tYf;02p~Bqm>lX&)S@<9HQ*68{2!$#iT$ z#zyJ)3X3{P_;u6QH&_!oEw7N)8{xPPBP53{th=Ulyv&S-_pS*o`p*&ARK}qbQF4Bn z4{u}XGGly+yfN@4fFGjrB@53qY)X(u&eS5D%bG42oXKmOjpDK?V+{LvPeh3`&0vlh zoX{R}X8bD`m07(4vzgOqaFE1%iLyDWQR%x}`vuESDVh1r+XoVRqSg+bsR4>#%u|s| z2R{s*q*0)$dO5a2E7J?)=NBybJ<)6SOyQ^V3J*`+?7e_s?hxGF2Z!M91lJ(J zEw~5C;O_437F@Et?|1LreRiL%zfPYzQ>VN7)O7WcU-Q$B!4c`2bLu+@g~oe6lNz$< zvpo@VG{|wT9~R$BJ+T=~!18qPOx3m28QPB;`h@$~PPlpONqh|FntA}nRoDB^AWU&I z{Z6vG=eZt3H%?tZr*!xSxUo}!*Ai)^7N&i!v2Xl|l~Zq*HIc=(=yB1mNBJ_~UX#<$ zlk2`HVm`e4w)$q(J8)Ln+YgsKIPuwE0rMJO5?Lf#=#hX^(e!ie7 z;q?7-wZ!9BOUwgU*Q?#Ls8&mV=w&PP#|lw9`=b-HZ%@KycyF{GX+{-fxa?=nfXBJ+ zvzC@pi%Un_x4FLfua3k8zI1Wzn%G`VL8*QEcY0ob&i10e<=UFL3&D)SRecQLQeaDU%%~ChP>hW_tWrJV!PRDu+vIs z|LL-x(Y%&jFBT6)0={dt?^Wn~nZ=l;B|1GxePHu*r^ABd$4D=@_&DK=)7_%EvNt;e zb0`kK>G@CRD@UQRgVqBwYh(NQ`K|H4(Y=sUct7&&^=U~h#TIjYuvi1ryOl&F~17?OvznYlTsDi?Ba1D z)HkZ=)7sBIVMXiK**MXp5W7I&(1g7*c1mesMwppp>tW9VU2vAczRG&_TcZ_Z=}7V- zOqcVojdw^E-jE5kxa0A$|9;i%6K!h0y&QgiURC*}^Dz9>uvuZa;hyr!rRBz<<0?eN z(bCOzGlrSGx2(4W)l@Cwpu8d>n^77DYU#zVy*$KGKkLxUGws$8U;dy;N0=_yxzyEG zDKw?1=CxqpKO}QXycDpd-G1*!YM}DE=ySt__z&>WjZ$YBNiMF+v+yj`QfO_dOT3P& z?bEO!|HVX4?oemOZyA>OA0rgn*EQ!o>lyaz?k8bWt0_wR%Rb@m4u0Z|_mm$$37$+i z2Y*XH{|ESQkRJ9wLHdW!4=}q(JxXN0@|S`8N<=P}*~D0f5`P3Epf7mW>O+!1C{0;p zf5rr(A3dambgwh7QB6|LTiIl*Nkim|FQBg}H#_E|M`)_A=UK|`~Z=z=cw)LP-q9Q^(188I4152F$ z4NR%1CH;?F3Es{5HdkRNJ9y@O%Z3%e2MyoML^h(m zoThA*YzGn~(|NWcO?B=viaH_100YvVMTFanpvBZ$+xsyB(-I;9>zTJJxHzGQvICd0 zx+H>uyvavmWH+aI_v=4UcoG zmPS9{!oPV?Q`zJuiyihHV8GuLc>m!hT*%zb`1(v@tA1v-raAaOgKfg`^_5-{#UnRU zjXLw`CU1NCi-f5Ox$s6BP>uUB%Mf7#NB;xncjW>OaONriE7;8R(ncWl4sIb{Cqtdf zdf?zLhZ)TZrpx->MOQJUF@*?Hq@<*Ztkospo)8vQU?Tgf_H&+4Gd}BR#@TNmlvm?- z?^fgYw#;d0q3#%%v}ge;zPD(hZmC}cWh)}VB^PFIs_eyy1`+wji3NzkzjI3{b7gn* z`n1x^k?{zJOR3XM{N>OKgZ$t{#3&=-g%SNIz({a`-6nij0TR^EJrRszS!1d9sN{ZW z*`Jc0m8S%!lTfE}x_5o$d44E*ObO*%hN0P*AAu1Pxq>hegMRQ}IxW;q=W1%KAPsoz z?!rhBSjxQk?(jp}OX?@&>y7`eG`Rn)G<8W|vKN30Qq;MT^V-#PJUcj_LLL%Mwe=$i z@7-=5MEh0;H&f&hZFZ~SaDu97NnY?w{NSA!jGVzC&P2%|1|vT_uf$#k6Q}=utfAor z8HAVN;><=RR+NZ<=0{4vrMv6|fshMF;}Gyc#oQYGt&9}`8X7|y22M`W5@T`HG7)?; z1E^8yWLQ1%{V*EPyqqyiiyxQ;F6Gs-<^QW~Y5Y&qV=ONZlptYbG?tQ=r9)5A(3tpd zhk@ezq?ccbJ-~tEkd5^kHN-Tuz`K#-NZ4kyaATO%GMi=xWJV1s`D#cI(?E5-Mq?>O zQI`*wNH`I@jFGF0f~Ngsk%F}fsOc?*-9!{$O869q&lz^V?CS>q+`?4$WyrHi^H++~sv&mn_Lz6^Mm;bt*}Ba@}=c^?5ZLgCzc`0nSAZvE~VoGN(OpG}Af z*hP5-tbZCsqEb4<4#y6W7UhHMr^G{c{w!(4cQs1kM4j3)!x`Q!!=$Ig{~q2%j}v`? zEpMIRUl)z@gltiK?T92hJQ#qD%3x?HcOo4E_EvMLk4Pzn1@;!Z-&g{`>gvOM^}TSB z@?*P$<4$l<(qdz|$YdrQ^@+%v(oVu8%DX3tiy>3pg204b!N_h%A-Hdq&>j6x5)yUy zCWt5wX#_UBXRY6zMUc?~InRj}i8cc2^rkJag=xrqaXNUabm; z(jJs-a_}6jZI6${1s%~S4u%h%L`Cs*lyD^YdK=Tq%;nM2!$KmlCFWDYz71o>2fp4% zCqKRP?Ofaz){~SaF{n9Xh7L#T>?XqX=1VK6Pw*pKs)xH7pN?}m9T$y;hLa0Y;713s z2t!t^kt8y;Y?ECu)>gO)up1rrQ%g*!NHf)rZ!2hYL5PC_&}}R)PRru#?tBUC=j+*_ zzy@pKgdw0eD!KW=a>i*>nCc*)qY~%tRhD0hZEG=XqVJ^Dpmr1~cW2V})xc*XiggnY zaBAqKXzVo8<^+8F5FW2l_8*(lqS_rGyE*GEZ70}1P|I|r7pBz9tNPrPZh!Bq z!dTuql)ad1|5GSCV@6phd%=4TbwsxjM+j#OEZJ1|HU}9d0;ar+1jD8piDe0wI9LS_ zLMB5mB9>he#0MG>DUuQPLl%Yw4+O9ip<{K&A&>j3BCv`w|FiJ_A2bZiJ6|U$>ol343r{3|y&r64a4AtZz|jBa0W-x= z6gGW312c&%oS3BsXx-pOvt)8&#CVwW0~9!JXXIV$tO6dM({_UDim^r(-Ii2aJ+Z9(OuF_g3mRno^?#=Tg}uJq zWRi%il?(^PM0q)IDQIi-_h~psHy*@Bj5vFzXf#<+^QEz>P;xQy z&~BjoC>D_Yk51Y9mF1t8d##s`u-+=o03s}n%!{w-xsWSpYu2BgU=S{ z-vMjA_vtS)c=l1RM$7jGl{5MJ<`bkvfJJBdF>ET>-QE?cy2Q&)C1Khnb~XqbtFkx+ zhvpS`V5BndDOBL;{}}fIr|}TX7IDqGe7hy&9Y3-^omG^{cQE=yXS(IHYDY(X=X%1MKk%ZQ z2AV?2SWv%OEg5%g=Lt!N<+wj-fhu1=#ov7vmSXhbNneD<@{rJHY!lXi;eLu5=@UKu z;@YW<;j9{zVRS0g`ZCRa@oOR3jOqN#@-gFSey>He7Ip-YXjSH-y-D=Xh1nL>l|N}| ze1&0K(6j_|R2s3kyy|ngJD!;I?Tv?#h3*69vLZ~2jqRg z5!tPzliWR4xf71@r);VG@h5S(j3nQ9J&9WVy&}DrfmTA2p@y>WEgm&{F&q-yWV~@7 zDl>W`_QuW>lm&1?V<@uCWjiEcXJW7mekw~U>td$V{G52dEpgFBT7kvsJNL;n4QR^4 zm74yzu4QI=ZWfidCe<-!7`z?n08>~lO?8b$yH<@PI?$0yAJ*oiGJzUdi*lbq=w}U; zX>~N;J*2Qh?i7M%qvD|DSXn~jy?4Y6hpM@@X3gWZ|Bw~<(f@O-5!Ls(_OP1C6y;HUj4%i0}BF3X1{9;X-ek^C{1cWsvaZ?>^D zVW_u?gM6}zVNCh%)mqjIB|Jy?c!vq{@GqJw{U#C9N! z6gIM+p8vU7DpTF6<7`!u)0B}^{~b8xsKX9ot3)xWrt2m76*Kj7Pb?v^gWI+=F@j|) zk5P@FIypK1Yz-G+@hf_1I~Z=T-R&bMcV_J>&+Seguk@8NX~8hl8fqm+90$2o#8+ia zmXZp0Lls>lE2hb^M__0UE2@ybDeN4gJvl0UuXl2;nZtP}vE}1m^NQkR*STQyP$KoEZQ2cFxGpxcCp_yigTbe# z>+R^+KpA>@x0^Iq6;}pyl{miZ9nZwYdIp|VwA%HfYRIpGntEtj1Anqevq&RwzDmpB zWI2hLCGq{CE}Nz?gJaXD=dd||=%t~Fh6nr7zpBE}Dnaa=HCDNx+SE}igD5;^BgFp0 zrh`ZYOJxbS>Abc&rjCh`9+p@`#l3=%Vo&9^PKMFvPybkALwNIfX>N~i{=2Tsg81xH5^3H1 zQ&UaLVayV~7(sS=&}l24LJ4V+v*9JT3}Y8(sVQJI4jC1C*pwH;?f^tGOQS3!1Vi`! zKsZRA%rHXvT1zpwrQGpz@xCfLOGz0{BmrUCR^9H;chPDMzqKNAkN4UW)|a$P1L)@n zNv^Xc_#N?VxZtF;18Bd}kN}B5JWO@vj*ZbBw=h!oO9`yqHNRJbNwy;p0layvFB$pa;vb4?novM zr^^8t4RBcH$BtWD%|z6~%Da7PUULoW3#UOU2JgaP(83bohpMBqe5ES?nw6m^Bzx2p z9qhHJJXio?CssBZio;Op^-0Rf3~T0Q#?!83?9&Yz))YI?c$^iiJy)?IXE!7EP8iG0 zOilUv^#-AiY7a@sF3M;{wtPdj##dV{`nWARPLBaUr@WG!>q_a*BqES+%H0>3&tz&!RjbyQ>B>Ns zI;Are2wO0x4;;zRu;+C#S0+GrW~u_jp}7`^D8j{sOg4*`V$n33gC#AG0xXNUz6O(_ z5qdZJw^$Br1QI+F79uk8$yP^KDvu=ZYzECn_Iw|cMLtq2HkRD)gPWmsz(|ipt4n7Z zrLd(>>0u7WZ^3L-iDOP78{7=p7-le4yPaV#i|gacb51Gc zJtrsd(i|l|IMW#ONYUKc(~x&MVe;cYF?7qZKR2|Wno7eyTnW_BnfJCWCX$K=BF?$a z3#kPtrKWqywyoeHm`hs+jOI-N3U*+!OXUd1ePGwyIJxa{+-B;wxml`ecQvx&Mtv@a zNz@^wM$I}trC~-tsx!i6KMG+(rO@?wi+zMn?B)^+MkS@B5GR%?)-}9}sTQ4bB(1}L zkb1C{yB5r-g-RMpYFh==MGt(N6}6YY^O-epLr+h4ip}&f`fEg4Rag2Jv5fTT!^sXl7WoH;-kuI&5s#zz5PFK*)n+|E zn)2Uk)N3baNa!Ck|J3{6f`D(~1|N!r?{X$wJV4rsSIyl429) zn&o!2%h^tg_dM^FhM+8Qy1=&P0*L)Z$`QYo`)qcbV1oT0AlmjgDjdX8kLZ4yyXR7J zU|J6G&p`!t(!G&(BIcsiX^x*F$4G+M=Hv_RkHNCwN`1EWFy&qB+M_JHF;R>}`+Uc(64J^=zcW zEy0_OV|(5l;W>?;JX z+D1oS|C!AC7-qo_baM(&HJB&PcJ?ZCui;M{UvoD5<9^sAGH8G|!Rvil?A5*y$~m^) z@hR8gc1!-oqXyM7tCQcZDK#vsT`twXs)2U5sAeQh2SdSzRn%DMaSVev$gdL7Dh^bl zNMl+j4OgD4yMa8E4VU>3pk8pUvMT+IS+>^q?MTt0HW0?9T*dTTS(ZrDj=Tqs)9sjo zLlLL0j}z-NB3`#c7D!_T)r4VmtL?OpK)9r-AYTS|E}eFs5dY4*AkD&I;$}fUKKhtJ zK6kK11KU{Dl)kRajRRkl{<=Di7`>`0l03Tmt>nH2?&-&R2iCE__oYbL>&gFNMf17q zS%YXkEG*!U`1(Z|OhkCA<8e}Dg;q|Up)3OX0b#gnr$N5yWX-<`S@&@kkY=Te+iTIJ|Uu%G5DlaiEOf1^Ab;y%{nQ{sXZ6#dnLhnqukfMLnP!5w;r>8jG^^3MUA- zx@#7#;q}g_>TJPsaHjnDdi0yc(wti*-BP!ov2*pIrTRl#aq~DQ3(YdI&z!3|LUNiV zs92`&7N4cAL|A*PAH$hg(fqlrOQ3z>y!hq(!mustroGee*m3;)_Wy?snz7(FZAplZ z%Nwn2q?~!E$lNfwbFC zQ7KP;Ns$>(xdE+?@l*0@*+EvLIiW1z!@_iTI8Y$(|5E01k-ELmxQ|Jakn#^eJJRIy zt+w;!*w8Y=gLUWlchBC1%HHFWntu+$2sCBS<56?u#ln)$KpF!wnZmY0)M=&A=wmUmPPw%K?cqH%v_@#b3?9 zpZY?4`N7vvMYT(5+L=>CZIY1X>WLjN9t26cEIQUX%!F*p&c!-Zeym@H_j2NM^rh~t zHmmpK6ydK~g6# zP=%DW*l32tZ4xntbcsUXQ{vS(DcM(%FVN9fB~iWRfy1BHQuy#rMaQBR$naYguv+c0 z5T_Ne*^);=2A2DwXOwLbTEAKiuplR#;F#U8CF`bDOW61!stSCQ5W>TT98v1R@=O@` z0hvpDy4pPb5=q0gF=&Bm%Ba*>+F%A^UO+!gDxG{t6Ch8bl3#OIUihUnVvhBl`37y=)s1&@F0-D3NozBX(ml($;mM!1*nMSAOP9Y)1-^55^8 z8@N;>bN&P1+Bz>hRMQ??mBoyH+G%Hzzkq^M`(e{53aT`r2PNR~0<}RA!NcAqY zMjJD9uH|@TO$J9I|BP$Vt*To8=b@{>!ddv(1KSE#)}>(+CGTdJov>q%-=gnE(Ce?q zE`(>}8$YzWKl?9)E8pkIcGu6P%@z!Ns_28+k8L1Hr3_n~s$SEX#YVFCYPGS7-(5(4 zZEpaZtfvCKWQG?GFrX{g5(QH$%MJ^4{UPdg_oaYZcY8t7l?jt=O)zP=-pP83V zYhb(39Vx{F>VfduE?*Vqb3E~tk1ec0@7sGUmFZ|otNwvmhpYTPyzMCWHmX<_ejr2k zutOz^!7-Qw#FEX-lLy(lqI<}Yc7t z&PP{p13R?pd-m;HXfefJk8E&3_qrw&d_XhSU=cg^bf#Mt=19Ml%n2DQP50XU370aJ9oE&!RNew zt4+ACc^VWu<+=E2SxZ{PzLxL0D*P7Th(F$YmC0G_J;23Juu@}HD;5Ns5R1T#XN8=p zH!&vN$f@~mUc6+wr++UYB!|JU(G}lVM;Y-BkIbs&V1oC3#Uq8KI_z(({TYK=2YnnH1fW>N+$ z72>h$mG3hl8@n9(OG}$ZU5_!a%J9|{`AGV34alGN^kYlKs)8Sbrdc}!(SE_Z&j};n zrb9~SQ^%C1E0J!4o$7hLP5T{F6_D`?-x68h&ZNa@WwZvUsqLyCNTgG;LD2Mb@j+#2 zzJ^O9dp7S1Hg1$!!{!8v>aS(8b{r7}$yeiTpqjESrJ1p6l!`4iueFbm?ycc&=Nps7 z!j`eXo>1M=Um3*vP1bgPHqWA*y4XAS?QH2T)Ve4pT91bOdm%hIsGWX52WU3rl;d6A zf6U^hh`fc@Q=E2EtohUVk2tC?C&H{6x@|{m0VDTaF{=r_CQ=SL3)8FNW!Xlt)>GG( z0yakKXcGbww$W3*ffSQ&@+3M+s5`CKSeqDPoB8EnG&~x1@)cTRL>WoEO$Pc;_^X6p zP-^s=n!ytBLJb>Mh(j;p@2D|WkY4u?0^2&HA#z0HFOC^=dF)m*dqv`WESkNcCd?XD zR@e_fnAw`vG20!IRhl2n=VOFQ+G_Ly&r~n-sC>>zR*zHPB_&NT%}1I)q7;+Nn0_}y zN|a#7zGl_$U(2Ux9C=Guv?U{vU#sZH7lWAC_3OKqh~;;mndxPj)*bw&RnfcT4qK(N zj`Bb84+~b(pySBMJW44OKm_NN9Fv#Y2t{W0?$h-nTw%){QKH?->XW6iQCdtHcA#F+W1V9dT4uIi;1)?s+u^aq*>^@(FOfeW^{~JpCAqk@(2MWlY=pd>{+=#&ITP`I zNGEZL5YzjnNDR!QE>EMDyPaWE<-ZyuM+$$e@rU!WE-&w|L~LS*pI3`mBW0NdiF0wI zVzA78nT^aVIVm>yX*CnGO;M@W`%N0E2EDBjPmNbCP-$&Xdf-~htw#Dc4bWboK^-E$t`)_TJPSca+d4WV!8yA6Hc0aku;P8{%EviHJt zhN(r>;u~oW8wzQ>j*KDW#5mBc`|@=Vn@C z4u;SRH;vpv`T%s?P4l>2YLmrpSxNqClO@l|Uta0+pK?RtSgK1k)p+2(>MwrsM`a!I z?v!;r;MFakrI|eIXiGYmv#PL)8J6i=nO4kSY&G<}E6ZG9JE!jgy}R76`A>va)cF1w zr4jm^l|e9R?nXcJPj0!KZksiCLO@M7rhA4cir*%WSb6m@5|ubI%@vF~-9hm17qjHi zua1{x`@oQT6@{(q)2`#?9PdJ0?5Gs(Ystr%?X%J~TQ>x*CN*<$TS=l;|M%i?oy4bs zTBQfSfL2Pk*V5@V^$@F1%SR4e2dL5nMcT@pq&gH_#;t12#&)Y6wechWV0tm!F*40S z(=&$CbTl2uru$VRC}B0$`|0zJT*sEircnmsnpx+3i7<9&q8xT;4=P>5KY*PWF)>Pv z3VX*i)qZxqK_dO>XdFGeBBuSLBI8arm7cuKWDd*OwyaxKUB?z*9i1Lq**HBt z@=$1Xrx(BO5;XaE#IA~P#Ei&>W6X_d+H5T&A&H39cpT_HXw7dDMb^bj8#82i1}3cr z4#u-Eeomo=5-i{Xv-hI*mPTD(ls~XH_Vg8x;L^#Z_3rIC$lHDVpYmx}?UUy@hV43YwWT>g@`P)`%%=kk#>F*FZbR*;9VJHWWOkM*m= zO0y1=U4jIa|DjsA81Fw-MtmLF9ebbra=^6jwOd6z^h1Q6R`STCS1?mE?d)4=% zKc5tdYv^rJ#yeJQmi0QFT@ki9OZd6_=c-X&xq}5pwKzCLiCFb(OM|uaae_ZP%tRL$ zl{8*h$DjdRU8)UrXA9}NQ#p=Oi13DRbuq~kn;Jg*z)8Z1IboN%#C4E!=s9-x*E}=$ z+kG2+(^bzH!yj9sy@6k{U;921TuR?2pjD+ew;Ve_ki$(c&q)Lj&^77%2Vgjo#y?F= z@5sm491uMUN)w1@EP>sD0-G9z_m5m{X5{ogli-GBl2)OT{E+W(nu;{dvGfk%5o(!( zm#|4Sne>M?iBH8V z#2$H`tVk}~R1gP}u*MWmWoXvTJfxc1vmJPEoZ~Fgj)|nv8M*Zju=HGYs=||S4jnUw zpwp8{6Tm_e@GP57Q|Iq-6a5GER+rk#uVMBNA#$db)ct8FRA<68*lO@ym;zkKdGyDM z`I(b>AJy2%_TQ6`%cE*Vr7IUP^V=pxr`QbO%F_M;zVyL~F%)D}!IMjNdSVu9z0zBA z@o^f!ce*AYo2&dc<_ZG`BSH<=fZS2B^}{50bj4?QrlBH?L>>8io@-o!R6V&C(2Ceq zM>E(HWB7vkK+N3yh~0GdRyaeoNWNEAW%6?;5wJ(i%h$>tTQxVBQ&_HfS;O#WK>ddJ z2NIGT7)JigGI$H2e*olyU;>&DJ!%O124}Cf^pIM-Y>_wq^ljEg9i44;u`A%j0zMi< zUhlDy7Z2~fRwTIQm27gstkyTH$zHeYfKF z6D(;QmsDQkVx(`@o6a(v9l@}X9&mmk0PRVt472aG;VIrC2++7lYlXRAGas+<2B)0z zDI=9Ge_XL25lB5sFm(SBmvKXrubr)QO7!^`BCHI6`w_$;A@TFC0;77B=kH}yGn@q; z*+~)hfav)i@wrQ!VwR9HKa4!84J`1G->TyFmtUD=Q?4p-U1W@V82#iccJWN#$z5v_ zOzc_ToCZB{d2G+Dzvz^tc{t5W+l2(LOh8xnrG*U~8w&0<{0T9!%Ukf9vMte{K6?G7 zcsLvvGx8|j=%*nA$NH4M?WIs$`*`RVt{WVUFRWPKQVf28U4UUS>wUD&zNF**j^Nx# z6gO=5h$t<@)yj9s)n5?fL!&H-_KBP)*Z7yM$<@5IUZSd`!Hr5Ql7;22M1C5Q?y+(H zG_n8)ctuc)kH=-oTy41LZ~a;GGXmoS?l7gn)T(Smn&RbphCAws<}+Imxl>M8A@Kv- z>Jyf)H}cA%(BFag({MaukCi+8!EB@B+N-=6-r zYWCW0NsoBj2=fNYmCamwGj$A$&VIW4X_+r_VTk@5yDQg8Pcrj9)Sv3Qn1bzDrlWrM zb5-7|?pFAx@H4$+&Qc@8hZeJkejf$?Hd%sNoy!W%U<*Id6nb5ZJ>fa}m0RpHDN5#S zyRRiv#It70R#aAU+PyFugmg*YmKlW2tWxbWpP*uM+eg+eQJHU`ig3edk)Eshy=HsNj6^0F?dYa4(2~hzWYM_xcZrEMN2YGBCe zFk=o|UH1Nxqm!#T~!y9ww<@Y?~t7CL6UnTwl zAXu;HPiVs5CtjsRo{9WV-~YwmGpjA<4evyrh~oYMk|@~5g5Uk0!a;xjD?ITm{9Y|x zf5hy6Tl)_%{mztlFLP6R7OwjT`1M~eZv8RaGmh!CdCQv}rT+-ws!!LcK14Wne=pwW zA3z!IT4eg0;otD*e}E&#w6vMgx;K%(DQe+U9jC|dHGDrg+n1XBm+Oxzk=_=0pX!GF zPCG=hL{7Eogrk04|~(3$v0s+LiOeQj$YZXf9~#D|*ut}h;ekI(DNpZvD7D6YF$pGyfPjdppRlSd1vu!HKZ}cK7%_%Z3Lc6B zv$;N->{S-p48tRdB>P@$>pI=j@kLNfde}Hf+1GFI1=Ou@LX?|Izq^AbPfH zvUf(DE)QBsLw34s*Bu?uLw_oMr0K%W%%DUIpsbe-OvwugtP+)-eaG=F(_2ijHbtz=%|i6rC|X4o4wj z)e6nG17)f(;MdevXFK>NpW3zy+^khWoW(w~;lLu>SgNYO3xl|>^#j%!zG?A~tP9I{ z4;1rko^v&r)4LcKBj$49UHf#9Q;`S~1XmQ5WVu6hoiNqEbmIKvRPm@8X`K;?u?4JH z107tR(H_2_Yzwba+xl(x*sm6>2={Ag=0BY696$K5t+vrIXYoDDsHIEE$R4_>kUY!8 zA`>}y4(BhcL72G)^m?-blwi-(Y;&kE!}kFUi_7X|s*S(4j$t<)eXi=>t}wFH-2-R| zMvC>Cjur%DY-1>HSlaW^odYLlxzyzoKx4J6j=>}(ZR8)|3GOZT$qHKu(p9a{leekc zG7TiQEz2)qFYH6uSQl7G!Jse!5?`!7JcWjQs$1ppb zuR5ozKnuNSXJpz{^wO!qHC^ziB8cqyd!>~Tw*o;YMH$*of7FyV`xF=dXN5K50gPhg z7Yk-uvYBNZf=>?{o<%jd?cYr#V0n-%w;@_=L-B{>?s}wGpTJdyPU|Sjk0Q5`#QWr! zXwMseZEQ}QT`dgW3TP@)*3vl1yQ}HwCzHI;W9wAoGa`sC^~4HcTw?e~x6ucP3v7-|n)0>mwO0WBdxnzz+U` zK^nNx2_0_$U;Vj>JeL<~;Z7u7^fatz)$U>2j|j5|TwYwwA6Br=(EkJ2&W42!o2z_E zrEqPfpXNntKPBxkM1BYgS}?KjT6YBoapYqdpg20Tq;=*N$&g8RU%zb!wwi0vt}Dl$ z2@>b-2x#6wM*SiK*UI0F0ZYu2F`p|ZFz}f~kE>V16(128X({m4|4z8$a8#M79Do*dHVS=&^B#LB#hMPx`F5-^|;e<_mg*a6=k+ z(QvA1bVmWP0uPMj3z5ruRnqZ|RB z<#hpf;sMX%wb6|Fdy4C~QIBk_57&1803;;g%5Ru>F1{uFhzrf^k%)$rOyC^@?{NbV&R+Gk5x?ddU!-2}3(RZnsPSS^T zasZ!ExHqE$_ zhu_gU$!U}@H}Sss9@?RMAk^^>pbv8=shMwIeBAT?nMNe9ac3q>2#}7vWIc>}T;^a# z2&ww71>&uLH2TA+?EZAvovA{~6?WSd9#5IYXiudHAs=;vuXv^2=eb{ko!g*wJy&B! z~h|_%r=lKN5fr^ZxX(1dD^Ig60)x` zoA37HOawDd=rScZy=B7RIu&!H?1CW<&|zj=ZqdfO)1~k?!Zk-pBawyFVHhkHV~o?) z>fo!mw=E#XEIyNHG-`;EZ%MJe54Yw^x(Y_W8h<@_95qGc=<`|EVHzE!CDVck{E^xD z)95=IUq>$>;%duYDg%Ok%}@q~w~O-|6dNi$uA4(}XG|A!;yFf-gl@U7v44cKcLw57-IqP6>%1$^~W+meq>zsi9>J&3P62OKR$%h=y>~nfE z!ZD@H#QIujh2*79hCI>H&h5rk{WJew%2G|<5Wd+RAD%73k@#Y6K>dRBytCwxG4&4m zj>*B(d-h^1^X)F1_S!M_mn^So-CJa|g8-tBl;!t6FG}2H&*_FaYj2X=q@usTA&-lT zzZR?cfe?J+>};>Vt~Cs%`b$}*;-b99o({PYmn%;AE_4c`Z8VJx z0Kq)^E&rcoDs@K463*dkS&!)L#TGG1K~Z0$_oBL*Di_~@IF;jal+>n7+;dNVRFsU- zdx-sUpSrg`t?Su^E?RNm|5?W`m-?2nUt|t*(fF`~GaR|5Omwr%7^0sgU{As;=UH=V zf)Q@X*3Rr9v=g{))?N`7u0ENDEUm|%-svZ4Ahd}_#NS$pkWjY_Aa6CqV1?zU4T8`4Spkh39 zcJ86u_b09HWhh=wuB2@fGIrx+I!sOPjU3$t=?m>F ze>$!5oDQD2%N>{69)esdWPV-#eEIdgX3O$58Y z9&0G?FFY_TTx{|$4tp(z1D)`5wCy-*AhgF_&b%w~d+DcMgnuQXB33Ir7Ce>br&px)NHRI zDZ_&C{L#XsiRe_SXA(bpsPzWH(Ul@>pWNUDCEEPyiw=3oo;I%Ox7dDmQ>MJ=FJ~ge zN~qBj-xLtiT$AHy@~&1L1R}GQ5^*MIidOgS=tsrR{S-=?R5Kdr60AFvxUt1qOT4Z4 z0gQQTCb2&h{sAI`=r)^A{bK70*6pK{y4yxL7_VkC! zp!c*!%oNLi3&&^fBGD2B1-IJJm;USIgA z`+yX{hE*0Xp;Zl+$0WQuiC%7htl;Oxn3dPG+QTWsBaUs$r1tvNLmHz!a(6STHriN> z=j+D%o;IH}L+i{(X-! z4#omDM+)IVi4Us2Rkg#9t{y>oLWw}p_(HGb18j%6tbRlM{+XzQrl?#!SvCviywDWZ zTP|92vDS2dg}+dZPqry;;5r`>=b{%qB7?p67qo3GpSv#J-L6ev7q`+ z$XyiJ5tQz1jyVrKxl%E)(|XHLf;%;`oD9+nBuaplmcp>=BnBRpGlX%~ac1A$@Ul`WQ%6VqJi?H*$lRJL?`It26w&;!n;1q+TcrbAlFS zGgt``^GYKp@_arl=FV(eNyJ(B_*EiJ<{KSP2xyy5Xe+{g+s=a~C>Q)A9;e8Pqv_9s zoY$9RcCNO|?+NS)FcZ zavG^UyADQPopB+%sD4R+*yl0bNMRZTf&K<(0Tl8%GE3@vMG26>8}+0|hi5bfNiIt0 z^8=Vfi!uUjlh0Q)_f_m$(%oN&wv+0%lke@a1(b1PWFKh@S1oHCM84$6ZkAfQs6flfl&Ib)a&egUKOdvvKKQg{WxPA&g)O@IPWh&bby_hRvc_^Ri{`&X z>0`1I|7zw$1T~lxGC`PZM+xFgv_mbjyL`gm?3rPyiT{}TO?nmAMCc;Ji9}3Mnm7GWQ}oRs*BkZg@?%&Uj2O zEzXVn{;I5$Nmu33yLSEB^lRht!pxQ3Js=-+0xx1^`yr>89WPQ^TJGcnSnPm7SHC|l zjcle1vJEo4Z9tzk9Ho8tgfW%YQ-I7K^poOH_NYD7`}BiP#2|lV-RCTVNhv8cQVB@R zi&ble53ZFt<2|KHgrQ#HC_X{%O&`h~@n@{Xn?exc5hdxHlDOQi7n(aah~;{&R?0cj zzP|R0R|D&Xkl*vg@8=zcNyckErLnoe|BI)$j%xFH+J}Qnk>Kv`THIZWySo&3C=jeb za47Clv{2lNyE~=0OK>d?{pIt1&-?t7oU~3~v=AOCcnvDu^ig|4x?m5h{GID2w z;WSJSlAOc_kzg9Krv9s0Vb?vSskb8r2e|<*fr|1M4kms&iP!kurVHu9f~Tt5a#ih< zO7g)FXgKMfvbJgDsm-k88fn$++9KojE^y|}^&Xt<%Lm0M)MKnh{#eUhe4^Wmpbl~U zH40s>Y*5YvGqNmjKWJ?NoVm`HBdkJbOLwt@ddr3CY6R+@pRxbsh|;9uiscF=Ac3*{ z`t_Q1suZE6l`@?!as9n`#V>$d!7I^-FBhx>fD%#5(HJ#6xfU_dN%3_oCd%7R3U)>CrJHNb#@O{yIy+1{u7X&Mos2UZ-)Ffjfs_Zg+SxXSf>5)J@AO35}1pK#q zGp2GSxZnf_#k^+3-vC+$KiMz8Yua+a;z1mSRZ#Wad>Y(BbxYCC`gLfRTZe;{vUBl! zPSmb%IRXZ}ll;BmQ*ZEyl3D1T>&(Qhcd)>_QbAmQPKRiE%NHDC;#2 z!-O3;lkEi@1i4sx=Jq}1K`X8&?1Od6;{fc^{kO)2a)ECSl#125a3l+|Pcj>DRu2nI zp<7mpoZh!<;%)j(6e`s=WBF!N5|7~q;ln;gpoRZVo@~ZNPwl1hdehJcy*K$d$>=Ih ztANu%B-?3bH2GzUCp2$-cpfHH?W)wLoC_4OIlo|GEtpGT>{cDf zu2zB-;&O$(felYn#L325W8Yo@mZjh3x&2k4H+ zzVKfd>!u_buP|FOnI+K8MPIX)YH@?*{aWj|wxJPCN~3fB?_792{$U4GM45p@rnfWh zkMu<0%(};!{;76NXCL*BnuJ7H3NWSqZ|6%o%qm^&)hvN3!p<0-rMvZ)t);aOn41aD z7H37QJibl6c!|L@=|tX*)|IQCWc4V6j=JX<$(bJA1IaIt`HcI1H`0`F`0BUTkyTnj zM)aO76{@u>-e{4|@tIMO1Ke+;^*_rXo{L(B%|SgRjo(Nd8u?%zuXe&vJJuguyFDy;eDBq=+%jDRc{n(q1g z`Lo0o!Q7_hCn$n;U9;KM2b2HzpEdrjkCQ7aY6#3+vYF|gV6mf9lgaUafF2xt`Y(u7 z=;}_#2mgz!C8|J$#1SwqOSw5&n$zzhW%q{>cs`46pfX)x!{uq zmc;{Z#nH*c!S(*(ey>w!UpvUDMXTvRqw%eLboE^a6J;koK3dj$L5Ml@x;YoZ4+6p7 z_QS%}ZXVBO{t5miO64PZ2F01Hos@DsisYV74)m&)QIB%YLKk}z_ z_onH?Sv6f@K9S=jp>+?~($$+$W;CKFzK}`TT5)OryzuTK@>Q!0CbpK?qkKVz*AAX z%48-b6Xbu@7tgZ_T7r*=T?!&&cVt8E6FbhKy~ITP!fmfL{AbS=nak&}i%UkeoyVth zGT1RP6aQ|h$jD-ULq6S%GsbLhyhVo>d@V{G6yJoV5Z-pAeXk21Q0)RKieRi?-ow~% zyT82^puwz3S0cB#4ea@tOw(0Fz6?HDYUCitBqwkjaMfp?`uDVB z#kv8^ORn0k+M}fXvx&JfYB>bY-ORDfa>h=&Z9x0vmTdY0DEkIaLRXApTG6)cg!Ubr zTe3kV1)Kvr-!H!1A$CKB69Dq<0F=Ou30-7S|U)snxVGotN3Lz$r9M* zcg(jz7-{5ZKaM5)i(cmLj=&Rp`4WU_ay47s%d=q{9^Kl%*xxTp>NArqx{aj~nh`J2 zuXYLi1a;RNZuls#VcK3Yy$KqN(&qGDH7?iV9YsXM)YMvfUNJc{wf;Ks+K8tFtJHSp z%<6RrBpwZ3&F7SeEse#IJl=|bA#2(aC&FjHR-df8_YJ%BMp}>ECB@v-F}v{N&lnWP zN{FJCY3}mcY@sIuzX+xkq!Y{(LOlqQnRp}LjzN0#`j%$6S@l%z`n2)ME#rX**$l3( ziv-L266)Q13jbjI^hJ!y^*X|PL9P=S=ZR(=XeiR|klQ-Z z2Uz4bMh5LBV|o3tC4mU&;m-w_sSbz5k`2?Z{M~xYYB41Vc7KY$^2ZLE$bo$zdQ^9q zR0ExC+VoUHtz=3POTJnjhc0IApEhzNa4i`4XPQoG+t@!MiPy&=zo#6GUJ|gxIJ|5rs;qt z&68DDU*#P-2KCNi&(2x%wszu#$Or>C%DBvV95`6}{Lhhur~1x+G=4ji%M9nwA@}kQ zlK;M_G8HDutWJe)NN_l!I=iOQ{W^kY2AsPnEc0IoV9C?>p}e0CrpiS-motAWQ$vZ> zf`7IgT8_KCL@#r))X&R)+7$IEYM0?XAoAk~I1M25BIYi|&P~J-9a3KykzVlzABqla z^7K?(0${_fCw{2B{xbT?{}tE)uW&w!9@J#s=DaAgHpmA$$DUYzY^mc3A(8yz{cP>FF87WcE*T_i1G3VR z$hmqhtaIW=wm_K;W9yOK8#3LkrE}#UJk6hM$r)Sr^7n(?b}nv3GwqF5kDw~(g{QN$ znn>96S{5_XdFmfv+Qj)UXx12LWF~Coylv$wpKdh-as9R`Ru8rpJNq%bY#pq)P2@)L zIn*^bH?cwG3wIikU)KSYFtEXt17lt8JiO_4BbviQA8rFmGBY1S@zEPtwT$3oRG+1s zR;Vm&;2Az;)Yw*bU2=o|zyW@Gc9JxMbuSv*4NB%j0(YIGBNbdqX`>#+#E%ijn!ON+ zSsfj^7$0K3rhx~23Q}LB^z-_es(iav(_jWH&W!QWhPp2-SBqqJw{eA+U$kFzgpGg_ z0(D-feM6ALMZ^wB%juwrLn}SP)Y$qY!^9w;U{&|mOCw?LhIC^1?drdR9 z`)Q?8iew}ax*qfKias7FM8wxg`p67 zcNbgCFlN%09}|YFbe{c^tLBu!??{)x+6O{v=62(12|r76e_1vd&qs1ApCo_7twALZ z19F6qSe~H?Yb72tEre>7zBVqrA;o`PGvhk%B063DV5LNlkS^FFJ3Rcw7S0(1F19*( zMUxk;cHLO}AXn$J6<5r+vUvRi&6wqdD%9T~(?Qq)8L}SxjZjSpv=m@s+os>tU zY*{XTpATOTRrO%E@F-0<9dnylFY>rT4P$k<*nDPZ4e89iI2dT?^I2%TWo#M)cq|{% z0gBjP!+@lK(sBgJhdL=Bor|6~S?R@vUdYdENO!tt2|M=zprS^polfpDD{LY$2+1Q_ z+jGKaGLdd`b9_9`B%)b`{~=D2RGzn^HYRUJR#=khM`o;V`TZ5a-e7JNi&_z9_li&I1z#Es1=6D+^$1HqYC4xj zS#y6fyOt%d$*~k#*X-7&@S=U_TkrnZlZUh>uQnXDj5U<|+MO%Q-Cni+PH7SJGHDlW zSZlv=$pHp^Y~pX1H;UdA6l_^`HcXCnsc!$=;Yq`KnTPGP*rk23zH-A+N3ofn^RWc^ zM~B<|()nMk6DvW86{|Cz$FY@dabJt>9?2Jbnoz%Ubah~6NxC0+qeUqL-f2;DEuE@S zbFYYSC`&SEr?b7&q4k?l>!mmu8L509mMuqp71!Hf$3vEMCjGUGBa_CxYKosvhWrVC z53#1%swpJv{ta+y{}6V`p+b6o{@Zv>K496E_Yy+WhZ~heL)}~X)R#lwowC1&D>#j)o!H*gD`-MS6IS*Gzd8a+>dcp+5s^_)B#vB%0 zZpU!fJDlAZfsL)U_4r$9QY*=6RTsU`dKaOOG3^IW36)I~rVezvsY|r>D6wcVurkB4xMWpSr5SkHYEX0p#qME{Z>P3Kx1n-V)T*?Ya|lXB0T zrC_wlHm7-YRcv1IX`$pMksSW#ki)T@*(~#=?yo;!0x!v4vYk{{$Gd^A(YJUG_mCme z7s(7fCrg+6%=Yt6=bihgO9CzncS>8~*ScyiUv^`m6GF@Jxck_8)!*j_1<_ycHp=&T zy=N*O5@&DX=RF8oJKLmRt8Z?_VO_i89yq5*L9XKVQ;soE^dh^RVB)vhMBO{@fZ*1Z zAHI)mZ$EonKtNKrV7cxcWXs=&%dg{@etkC~VjtvPMUxruB5obp|L!92^Ze#;zKCKNsZBNO!g4NT-wSX6hWG=ClZq3n^a0n_!D& zJ2Y8hKk)a7KCbd1F<=*Hp6-$rnbJ)yS5-(MH@t>9qZD2MyCytIzbs6(BbxIE!k(KU zCi6#Y>{q+UA;1DJnEnA!WbNBGm0G#bbSBcfMmKD!{bICHqS$ZKXeuu~o+87iBX8?+ zOsmQzkCfMrl(q=F2l(aRi#w)XJC!F{vi#QeWGD3OjFRtn9HhdfYfEE%H2-KZ6%vs{JrIjWmIzGl)xYq0%9#0^72+Yw{`Hf{kr zlADKf2yY>1mrWLGuf^qSg&8gE%t{3Js4jdKTav+NWoP!T>>URz#KAJWA`brK-XE$_ zm8&c|e|690LTxsYyN+mi{(#Y7fW*dKC)&mh0n_JiF6F5xzpD>2xJ*YG^H$^N^eJo+ zjFF?7`)SWM9`g4Jk=+Tmlew?r+os=UasAN?Qi9`MjJw#4yT2~&)l6itn`Usx;lPPN z29*S9Z@RYQB27;s;aF$&VaxSz9AJ8g*k-}=@Kgz15r&}@NodkyhbKb z^;m2TyKlgne*k=nM4YgU&d)crID+ISYY$&rdLLHD-Bcr)h|Gx0lfNdqlgG@0V4_yO zQnQjIC`7>jp1ZIe`zDpN?*S4rrZ+)P^uKtz%AVb7iHsV~2n)7eBeOK_{3Nb*q?AV1 zOci4OZH2=yZFX8iBMAI9KVmHHI@Pmg;ysXP*TG zBagdedB0oCp9863*7Wb9_D6X~Q-)wkIapJ^#*6vrQN9~*q@#?aK})g4pr zpgEPsikonzk{HCZVmfQ!r-IqXbg7Ck)+k+nE-prfdd;Qo%6eo!QI{5dhheL@9?>Hi zS|}xohi>9x+FF7r${Jw$b!h%zXfCnH-9Fvsvatk!`>K>^t1d!We9d;2#~#e%q+tUU zMIvW)uENmLb42Wp5u54EC;BU1a51+Z>rTF~U#Mq*>n{GOefE0M*>2xqO>Dtat#`z( zX{CbH;qlq*e>7$P!Q>NV9YH9f-p5dWhTX)9f$#5x@2c<2L+^xlZ1Ix?LpB4FCs^|! z6cDEuhtzU4=|2EoT2(-V1yb=pKv<6?2;Q-aLHdbd4#i^+S+!|PF`oIZhQ2uuMcv!= z`-tX0!1=dXzS)FQfu(P@KfSVB?N5c+h3~em5~6;Krv$+{BSSd7?j4U5fA}OcBI)xd110`W z$8Sbe1(ZJ)&2=o8?Gwz~aiuX+j43=@Yd-%(>tfgY-V^!RWA9Zt+4@M z!nvqhjKpGl6!j%SIap*6M@(9&(mNnoau&om%ynn1s}u=lS!9!amxKIW7W_*v7hHeG zjHRzp_>N$9<9h;)Uz{dt%gcXv2tu7P_y<6|l>M7ryu-p1?Uh{#8r3NhfU=-b^fk_z z>CU29dx2+E|1wkbbIo@l@=|Cxa$K?AW&E)B%Kr*tVJN(-4)6g1*bxGZdcYl3{{V?S zzg^!=YPR|*6c+n`v7^G(#L++s2CN9l zaECX+47!&)Xgw0TsY5+-(MA=JX9noun?ro|1)&9u)WkKG1bTr|+q@!m=1hER$b|m^ zBJ4jR6;f*dSR&+qy~&vMqCRQns0rOOMb{O+!_*#;C1y`Mjz89oC8ih`ip2WdarvA> z9(mmMyr)TQRG@IDFT^U8?p<(wc)xm&`dOl{Uyp1RdW=>s39QM(}pA6#e=C#d6+l?UVTiidXu*h%Xjv zEqGD|9sV~DL?O9m*y4T`P5N4e5yk0_cg#ipAhIZlS?K36I?7H@`SR9r+$%AD4*x8j ziz)=}eLu|)RJwC545+KE%> zgpI`PqPKQQwXvGEC|uF+ci=w&Rs%wSVt_ z{s9Jkb7%x&-3RqZxm;xz1T$2=j5L_$t8bcc#d_vp+FkqDOxvYyaN1LUbNNw*Ugtpb`yY4bZC1WYbhq%yU05glCF7p< z(z0%A6jm*BeG)Y9U*@vR06WW#Uh>6_38tFcz zJ_8#4O6ybS)a;h>-9l#p`~lpBE;eeicnl&IvZ)?5(56Ai=#f_?{oq&~IUHhZ#CRBd1347Ga@ zQEb!L*B^Ie&lr~8B+c%nzZ<31W2-UuFlFX<=0Pd7wZ5{`i4v>Cc}?8EXevm&Fn4OJ zxJy4%>{p$t(!#5v5Zbdx7zcdF5rUbWHBsAPHQQz-mBog3WBUh)Bo-wR<$RYARgg#a zd`%8NuJeviG~D`5G2mUPe%D~%CKOJF2hpp3lYttVG`J#ObQG2+)=Cqk?+%8zbSmv0 zZIR$uWf_21^Mw964_eem8cCuOqBWS z!k)u>uAErh_KTv|ZT^|?{1q7bic0;=@Q0WbF+wbqD_*iYCcc3XQKKpI^a7~hS@8_ANMpCx%^ZRCwceg8&vCMHdfYnC1IK0VZL+z%&C26 zvIicURZ<*Ah)U0avWw7N%kC`7p?e!u9l&urPztG-IG`A$fD($RRLeh=BYTx)FoiOk zG0uVzXioAQ_2$a72g|IU`k<kFTT@K{!O*u zdWGjDmIWd1LhHi+3qJj$!DsJ9`>}Rc8UM}m_*e2>e%(9VylPUE^y06r8aCPPn7^21 zCm^&unI(-TQ-r8jYQU%Lh=t-}t3Oo7zw%4wm1F0uQSbBvS|EwI^ri8_9Fjtm+& z%E-x)r9}{Ws^-bs5tEtoib*l>t5KrtfJqO-g=yM?N5?>ZXr9Z`GmBC}3Vjuk3{Nre zkj=-7okW`pLh?3qsevhTDjwXPxZhM zHI_Vd1)4-KP2}9V00nemR*5I9-30HjRPwlM7R|_QFl)EU!S}Orfys=CTc+ONPlP^g z`99zIM?&jfUQUBFPP)Ijj=dD9O+r0y`GQ7_06vI)Bk~;yu{L%QtdMZno~kb$;o`Ay z(AMeP;eQjWNYr>Og#7m#Yc)JvdeNScpR=*bZBpoX$j922G7+`-&lusY8}D7@7Cr0l z&k2pScGvVB!D{QZ<&!ODswyTv7BkW_#{F1}s#LMEvvX<1$0A;2-IsqMx9IOj4<~tF z#G?b^RANqjuen)LBWFstW_j6I=NyEmg=93m^1TH!MoM4ADoYj`e_Jg|n{<_#ShLs8 zkpV{3ai#4Ch|%$EIW)Ui7EII>=8jiRF;#y4fan~D7w;7H%{2(o@&>Zk*BW^7iqb4J zE~)K)&WZTmAj}&zwY=INpGGwfCgkVicbeU_{L!8?_BsHg)Xo+<#QERQ4IUdCvmre3HLPw-qNGO5oMum41#y)j?G_u0IvBaqK?9N* z01rx_fBbaowWmfbkTYU`&L{cvI&M#%80p$CasjMI^h;QEzFa7;6gp(`OP4&9%xo9E z?D3Pi6l$aboxE*8mBCR~aC(W8tdlz`|&c0tcSTUJRcIWb2SE-n8#Nn5)Qg4Gz@rHBCMt!@N>nlFB5^v}oe(6PT6vSLfZd?D-Z( zYY#@IQ<`LoT<}x*M3;sVrL`zTv7KRnZ%6D05s1YXo|s&9XBVaz+Yq2Xhj$l&5Dka9 z3gp_i^;7hMLQF#@>2}d2Ap}wrar#^~{{Zy6L$SpZgG6pNeHrX%?QW~UcQ|O5v4MG^ zt%HpDo6;ui(o$uKcQ@=pd+d@X30C}lGq=9jR&qfD3StPzS)%9$^JVK)n|{qmJ6{93luQ)f zRaH?SGHo28KVPuOb&L3E%BD+>)YuKySR$*SL%=_Pwa>BzAW5|>?>A+NGEP<~K=P%> zL*^1bqG+Ae(oq;T@e7o;fF1ea|PN${w8iL>Tj&n*Vz5J z>m)TCro{k;Iu^>tz(*N^PG!}Lc>d1U3yl9psIAY9LqvgwoaAA|qWRf@mRJHelOp|5 z5ztVajg0xwP{d$7+fBGT*-*gnk}zw);@hfI2c#+_lCKxhrX>w~MyN^gKscT@W`THM zGB@bRjA2Uc5ikyVC@8?LIj3B~Ui8cM?hnwu>Yl4Lw%fRiEz3kv%ew3xPIsS}?^h#^ zG6DN0OPpo)fj zbp}$@_&p=za^6?tPFQ$o0A0?A_t;rV{2$rZ%x8`g$wV;hHteMwv~=Yn;8J z<3I~QLodswoZqb!@E_3XtM;-Cdy}Uu%ih{?YFMMAj{YMn=CG6k0DO+Uzir14mWsRa zqNV6cYHx9KYE*9D^qO#vz>#5p=d1neKpTQ=6vvSNcOpydlZ3`SV#CnY)+kj=2B*>(5D7#1)%x+X6?K|F@wa~NS2mS({m^-& zO^8T}BH+k_?{SL65003S627#OHbpTS%s-fIGd1_aC+@Ri^^>rrB5jHUVj0FW#_S;6 zl}jkcKJ;iNUuFGNK-!)nZ}~aEJ@A<&i`J1`BuBH$j{%c5A-NJE1s3`(MatOXCLkxP z^O4**s>FbDOE4$Cg3+moT9C1-WGu}#06;2>43R}bJ%eGQ_R$o@5+8d_QH1-} ztd;c-5F^w(^u0$1TW1*nQw_-Zt||DgspfEmT~>0tpD9io!bJ61qdxC>cz;KwsGgom zkv2`i`bIV~Z=Va4+B}Q(4`8Vn1MQ5E0&Bub(aW+gVUG5C;|iUZ_SfLD5T^G5O&cS0 z)AEM>Yy;YFm9!ka=15ht1N}sYPxP9Kv{{M_*!GCB)>ypX97l5gEGb5%NW!L|DQ74W zIwCLAIN+q%Kt-h{lUV}!4MTO$h2oxMT=#RHXw#V}xrP#V7ayz(H=>}{>_1rwr}R|( zt`$VwdqP7V?4EsYES006$P)&hm!j1d={EiRtYp;AD3)wO;8-3k#K0|00=HBwn+2A$&OPbbf3jd(F0^4e=_lrXu%&Kfn;5zhQO!1~HFvrifz}8AJP~_7n zSBEZ$wjDU$1BsXH&o3gGR3UUp#*@;^#& z7o1Ql(gHPIR;feKw;NyIbxj#oVVu7q7`NP1>oVshsZD`!yCMV-f8} z4d!U4%Vp%$7r)KF1&<~_lC)!u>&uJ45qmhV-npqPRa$^1GOZhlR?OD9PkM0pqm|9K zS{oN4J1Bsy=iQi$5>RFJ^ZcrCeGCALNtbq9BL!2*pX~7L)yn%T*u+QFm(DO&Zx7i2}QW$PbcppIDU}@=oY_uz~pU4dJn4H=$m=#`21&ft9M>W!SgwU#U zfHT^rm()>eRcwd;c3kj1d-5{|9Q?RCZBlW%vn%ka`sYV$pQ20vwl>VtWKB34YOs(C zoY5!AdYH1af?K5CrXg({L~bKP^+`1mU6kZI3>W1b$JE2ueKzmk7L5RXL_<&=xxW4s zZAmXQcqMtju{0XCB;j?|`G4Fsz&?JT3iHG3R?G{5PNR(WsFaUNEo<@j=zq!Ofg%K028)abt2z^AtHez$(ye+Z)+g$15Q2*2{xl7K zSh+>SUCXqbjKZS(V)7^Y5_wo#At?=8ATGX-5Q0UyfL-eKQy9t|ZZqE@L+4lvj<941 zm*Ilg@wDW^|LQ?$~{x_n~P!qVz0pXutiK^dp9XK^~3g; z6QjYAOqe1{No;LiK553>spJfGqpAAL+SQ|EZl!tOZP=DH+lM%scF!*boOJg-X_{}_ zB@_;q9MN3T!iVP6m#$b_-s2bN1OAi95ekqbI;DClY}!ggt~i*qYQ{EeiX?KI<>q(ru#4>SPry=H!cyFzepd%x=ibX_Lw2Vo;CgLaQ( z74`|Rk9~JkYG4s*@IzsB!)13rfN?m%%!#YKYa)kCKR%C8ThS$04w^-GG&m#SlP`Q_ zJs01W3D;i$ieSSRlFLXZ_P@tg&ldfWynd!XXP| z5`B0*E=s?@bBTzdYC2|76Z;~)w06s8JKC2i+J=o43ibzAWFvow^d`(0B*UgJ`O5#b zE|jSAz(+MR&H?g8rJ=$3DRTraD`fBQ2h@QXTiikQ6^j{g^Orvk*GTX;XhD|7m`UIo zuAZx2&fCAy(u|0Ia;WYJQRLftD~Lu5+03x7giKD#C+T=obCNWeNb?aA8d^5SpvTfDqKSpIw#&a)+^B#nUb z4-070z?LA7Tj^F&+6q3|QXW3e-z8}|9^}fGxRZ^dQ&{9H`1nSmIQ^kJ>w_h}FSbT{TS(FT^?wwWWM~qXIIA$q&b{kTec#f^B)U5fzozrdAOnOPqy_aQ9g=PTjDY+ph zKAPaw4p=FU0y_gm7mZ+`)+p0QL_Ct5L5j4|aw`9Ki^XGjj@~#7vX1mTn<*+ukh3C|sLzn~#n9Y_;a^?W*4{6)Bcr;ijY>Y8Uv#*v~ z%h`kSNlf>z69m;uXMRQ&8<#=QsCBT_->820+0Run>=OfcA*Y|?v^hlQJBM}&yxls& z!1lpY`juAef|!hY-;`7p&G~f-DRtBP!{OsR2N2!iV_T5aP{k{iJ0+Im29Ds?i;5=_ zZgxDj2&7D5V93o0TlTx+u!1(qOv^taPcpXgpzn6miMzpY!f4D*o_`pImPUBu%Xgxk z$UF~nouin3vT=toKQ~GPx`u{n*I)zn!0v3Z(JbL^q1f<1$BL9D(laK}!-rT*_mxZ= ze9;ozFUjO`w=jBNlKIyX?Q^Q*rb2xyCjxs>UB}+0Z$5dEgN%R+_=2dj^^(9FrdXG( zm?0E|NZ$IUpxO0Zz9(M*GyL?QPTG{o?isPll?<{|ZqVRs`DraV!=m@QLPR=k!f%>- z7CMaq4x#MZ)2(#t4~zO6QOQ4KxzkMDNbsMP9KnOu-YYvCL&4+m?wFe*>Z-MFXBwk$3w9vZKr-oc^@QV>GIN>fc(~0 zjZ)LYJU(&v2=&|-MSCifMKGmp>NKB;CJY7PsYx;Y5OjAki1McAm#tEp)%@A_>gbl^ z@cKUE^RwGr%KwPRvjKj&Ci&3s8jSTaRPI>c|B+EI1%RINegmxyiEKp%^3u{Eb4GX} z50cU)?CX|O?X?cBd~xSP>J$zfz|-BT@cty+A7+;@DYgr{T_a-t7#E$y$j}MPQn=p2 z*Gzbhw9UVlB`I&sK&m*sU5?dEmBPkp&dMlC!&GJcfcYq5> zuOip?4*Y1O8k6>v?Z}Hzhrgrr37U-|twW6jp#30v)MzUfAnP57Xm?SSUw=#!_}IF> ze#Xg1hzNU=>%uyfk$EWr_CYnMK05qp17qajOHOWOp-0Zk;iWFMjN}8&DZ`ae8jc8u zzfqrYqT%!8HJ)#(zx00uOeCs9adiYr5$rSELSJP!ahj~?h5JXr73Y{2s$l!fU6cei z%y2s(nM*I_^jgm^PNvo6FspTq3_{2nH5cTgC1j*i<{R>FKd=Vk??PsQ7Q$k38I!t6 zK9ZKw9pl|cFgeDVfxAu6=$&wNk0BzX#Ia^gS~StDBPZ9aBzjY&Ar*RM`&;=WbplzH zCh^q-=V8evpJnP#vY89i?}6h*a+05nStte>BWfmA7^xOmxNOiuKJZ~?0@+kh9S9js zsY8gIWilJL+fzg?zg%;y;+#SnazosydIAQ`dr{k^+tn}X?=yEuiG%xlz@~h|l28sp zPGXB!b#}iG7Y2vhD1~4+v44PTG$Rsa495qiu+fvpx!{RiqfVb36hcO=bUx{Jm9LOKHE!u6hA5nN*#NHs29k5NyM;=G9Y~bKJ7> z_>Y4S(=h4fIGc3JhpINzr3*72U~i%y-a;oOv#Dh`l05U=pmL~6U!`9-@k9|mv9bRA zmp++lwP2fe=S^dyAp=&XEsOZ1zNl4eSIg6OmIJwc=Dtjy#=tP%gRfSd$~+MV(fU_t zR@UVw#u#(4mF~p&`CJJ4;fO-YZ5D(h{_eJf5k9FO^q~!*@we@*y1j7wc{o}-OKeqy zeshhx?nRj4fi-s>S>Qo~{RMJL>E!KOX z-Dpbe=r*KhOi-z zaOM;v`OMx+%Q{8hn9jdhqN^ry!EQ9{E@zm8!*yT@68Qf@5LShE0kj^{VVRTdl1x-w zHkozWoE$SBuVRFq+*=aXglP-yq~dOh49DQeHtO#>p;?B==hj!yjgN}>QfEZA6saw` zv!gLY`)=n>e~$P${-Mpc@U>SkZxVx$+=U@%Z!6qW7_8Ab)=9v0#PKcW186CT=56}m?kU4JNX#xM`tq=*=lGVN`n}uk z&h>fboPUK8+dG-zAzySTt9i{kWb2Yl-t>h`bK>k)N>Urins9j#YdFQ47 zEDZ#S-#UF$g#viqi$SMvYCLzoU&XaX|2H&@yC*FG0cz`p5kMZ4yc zog73-)i@E3tdL;KodpdGTw+GyhD>#>N5H!DX3LVl(|hq#t#K^=3X|or*?M4XHt=TR z``RHtr%peAIO|&}8ODQ$yXzXtp)bo^%2u?R=8mF^$TYZ3)uMEtmU_;oI#u*B?sK=v z``NHoK~)+FN&dSfi!&WVPQ|Y)f;A|s6X4GZ=Uh26V`|huEB8S|2!GH^5~pCDNQ9Cy zGQP9NWSd^`U%w>VXwn=UBwK1rnngD03u`f zR>@@%ERrM)>Q~vR3=+PW(ZY?e#Qw$GKdwRgCCGj^c&W0Rhm{ZJ4YSRed}H@tH32be zMMoNeMw|wb-IlocoJ^X2{J2GA!i=oAy#l#dTm&9V%LzFA4w7uC%3(6J&9F*|(M9lu zsUcm=2=>mLLq{|hA3vbY3Ybn$ZeUjw@Zh?c)R@d=#x#BGErVu_lIWT&CK;z(5Av^l zSZuFr@%q_E{G&^)KI1fcr1#cqnfXN(p|-%K?2U&u8(c+b@kV`}zAn}s{IH7SUZ)x^ zn8Lful%47%an4j|V_tE+`$;G6pr($VC38IE@|yJ1ZC2)5R;R_Rj*_D*hsmpqP=9&T zJbx$o!P`)d@vu9t=ub@~fcbK&OrkZK%p{%*tk6$AmJ&!QnJxjNo>NZhbzE`U7qbXi z%T9VR!XsBo!F2QX+OBS{a{wg9l#!s3AEVMsW4RF#liuGvligg(w73XG4)WDOd{w*P**B-J0(|Gl zKEzF2?xaYG0BIms80v-uc3q_^K0W26v3zl;P68jgTe9vh&`#?3i(IHeiSURGKVKwI>>)Y_ zS4*x>v}ea4Vlf$gI6o=A$BN@m?Y_=H$SI;aGNX4MW3#DbhxLO#67ARUB+z0E3LkK>*KJq z=VG*yqH)kX2>)UeSNAwIqArE@b%QYszG`7OH3CK5mSU-?-eqL-;-emdI5?U#L2YQb zNDt)uK9kSmICD3S{@X|}%A97x?gRzrDn(E1dVUxCH{wL{)C*Q)ST?o8Q1HP-`C3Ni zn>BUA#$pTSN`$$~hrO}UaDKfu=FW5A2br9(t+otz5-@D^Au`tdH5pzT_G5KR_nf6# zYQpxQ&L=w0%=nkS2M}j*^-sdhiyeT4xlPgp{H$6?36@E3Aa_k`2vKKCpi~7OOmU%V zmei-gd)O=qVa?);#A*)vS0?K2vo zV070w=I2A*J6A?qb-ntX^|*%m(TRgf1AH1RBjqL_>cxE)t&E=;e{BEcu9^qv6($ zNfL>wJNK(35Z6+Bdw^=%(6gTOKC}T7-#0GFT(;5tZBV0#G_KZ{C`~gR(}yq?&R*-B zQ-ueGM4PJK3dzn#sBjQXj=7E*NGupRJDZki$xfX@xXc31+qVe*o4%DZhJxq42|bvrCFzV#G_ibVmZ#Ihea3 zx5tTV3`>R+h^$@qgqD*g(MXVP-q2|4%Pi&?D{gt2%D6W60lmg$vHei<5cgnmdGLgz zK=&3Ah?1cb5H1Kg8H~r$xV4HPMC@T^`;fmdQ1)he2dIi%(@CRI)`KYIBdxt46&4buT58zopw+$>Q2{-Z#xai+l67{{Y-ZyMcSe6@$Qbs8!r+z-~A1#2On!m=MSeP_Wbh+fXo-DpnwA ztjkAuLB!pIrN*$_DTxM7g<7FfvF}2DA{?0Uq`8NQedZ(Nf{UF00O$xgQc~@@J|TV= z>|f~q?fLuN`m%2(TVeLV*Ld&4; z!088lj|8bv-V26}1DTu*!T^jEc}KDprLdkca%rM!8*Z%-xE#%>L`I*gF|}Dc->xUA#uftZ9W93m+%=h`VzD0cEB-aYOL?~m6WqsyWw=Kf9*7SITnM;VN zQKA_5G*Zh!0kkq8UzQeQctPj9`LlwS=(E~k#_>^U?HxNh=C(PU&pdxVW!8+Ws>L#J z?>UZ)rVTqZ0~0j1xvIV30_}6}QQze2ogEbvYlbaIypUn34-`U*)d0PQYNMntbmU`h zSKXbWS5#3}t81QFPiFx0iHd^;O#c9obk=qqxwvlE^WLMgbb`#67ll`8_?$(U#FnrJ z5}`3F7z9boU`8w$qDq7#R|v;xx#qWhhwSD!gu548%+Ggmx%ZT|Sr8d1yi4XcdKKdH z22%rY{aix8*c5o=5}@1F(g(H>TNiNf06y?Uhj1EPgx>qqG+Y+hCTf^?Dh6OD$g;B$ z%2>-O^DLKI1dcItETMDAQKVc)y9~}xX_sPLE%=NuN;u|!$_y>sot!}k?-?j9ZwPUh zd_Y>V{v18xJ+W-%?mH3LQ=VMMDYcgUut8jL12H8KG^#^H5Fn`SuPZDUYU$)kUzmUd zRlrL)1#E9GGD!F?8cl^h&ZWagx&SW9{{V4)_m2eC8?+mCs0!dd?t4KB;K5h7d60fP zaS#Kr(N(lcc5Z=y*~&w5hwU)t0RuWwp;0AGh!8?LFqIM{GoZ_ z$-;a_kYsivw@S`UN<%<$TkPJ^^R5aY<8KoLt(!=(D3{0*3eOu>C0LPxyvY%BLH_`; z%+5ShcC&u-xC6Oq<^bm>HEyna!9{l3J4bnQH7)~p0lO^o6wY}w4`NZHT(OAEyUhEi zaqhwtFj#WpAY#?Q6h7%G+k~*+n*HDTEpqPz_yQWF%W>s{?Hv~a9kU zcr>!H`I`ouM78l7zqfcm1zU(_?ilQQ&T7+&p|q^SK!mu?XAs^9Ml$XOqV#hsLM&9Q z=wcfHP0Id_vv1mR4kX5GIm^Xq*aOlM%*;v0BCJ>Y?gEP-o8e2Sbvp7QekCN@y@~Qc%(vNFyN1Jv-;C+V$y;%; zDNT+;W5igQBcWDcbGGr%;FRiVX13- zqDD~$EB&I|se3H5m<}%XgU#XD8D)TFkRI>?0;F@vfUt(~$pH{$Xc&u_m|{Y0Zuv=e zo275Dqc=`wU|>Ma)>1Oc`^pW#S&*Bf`^E5FdVA3O&LVechTL9d5+Y!>^RyfmE-A9S zu+as@f`>OoXqU~Bhk{vJaI-KDVG3(yen5N6H*avE@Zs@u20#aJRp8zO7r~)Kco1E7 z=HqElRkUp0&@si!46;6x4H7zDBE=Ul!d!0U#TeP7@_|8K@xL~=!Z}*O9st2ZSGi~J+Ue~>R#>826P%j==+NF*v?5w^_6m|$% zsMxEgzTcT@U%l*nRlou#N@&yU@Wlefi`;o-_7ewlF6G&U3LMb4;b4@Y-@WjB#&XjK zZUF?qhjvqz9i`18fNiwf0oid8tnVfu?}@Z#1ce-%ODm+o6%K$b*nxgl{hrZPwgxT> zfGi$fV>iXd6SPW;6deLxOO}LXfW4&<*^DmeMYB=1gR&~WX>D#Fh%4Ke+tveLdV)EY z&-_VN_@6P|xC&@rF}FRXutJ40U8r5{P-#8dT%%}4k7|PjYqyDHvXJ2g)d6-PbD4JL zAw*<9!d7DVFm}z6K(c1pWtPNlcDzPiTvNdKgE|2n`hi@eQH2c>Jpo|BjJbG$1iF^y zl?kGlmzH#IX=G5YN~46%eqmI>l{*P}=b6H)3I!_5CSYKJz`yYs3U63xcbEWo(fvvw zvYvIHX+gz5KJm*Wcp!KzIjlbWLIyZnYxI<=z0AC3ouET18f-oI#NGhodLdK4Z9s1K zg!0G~L4qTB(H8~*^gQDH@)yOlA_YmOF>*pfFL$~mG2J20$H!18Yl z)Qb4RIQv^5>`dKCb}&I+pRot~4RC;VAyvk!8cx~`;Y>pd&_TIai4CTyN8DfTo+u0U zfm6d?5!xsi8;&1pzc3c(e-Z9EAI@OOgdXu%%R6k9@f0BiA$H$)fe%K<0;YFzwRehU z@$FVSV~-PdV$>@)x4cJ1xw@w18t)6v^#z97+9JaoN4yF@XsTn54m9pE;0&{Dn;>Rk zE;hu@tM4yG#&=5Qkh3>495IHiu;duQhw%hV!(J+`TQ~*zxLn2IT&;r*O$I>L+~kQ1 zt&0?UR1HN!^KJZG!G&=4#q%FYPkb%Rlw077(EKQ!U>UW3Sz=|MW0CAjl8*JUTy~5V z0N~tw9KxpVsX!d>goPCX;GkLAU?P+&YPLA9{-)H=H!x!#+$Z*wizGHc-RxkK+&_SE zCMh8@%v4TcRkvgBM$75s7N3J8cl`0e!*uj74q# z05_srMlp2nY!r6m-r%YnyW6}70SX^AmDqu}Q-5h;FLI(Z%vSc5Ktkgh?-jt&VZ=44 z06AA^pp%Lg?62s{oTpAF%K--@e(xeCERBjAJ=w=c)DY2I+GV~E+B)K$?Y>x{j9u04 zJpAntt)W~&qJ~*g;Nker(0g$P*aFA}Y%O1iJneN(AG`(FrfKgJ0O3Tp+9M$o0d)hT zK~(GWQr0%yLw<7zD)WY~-ZQf}@^`q@3u;yxKk{Z0j0eB8M~i;u85*sCdu9&XRS$K( zAbtqguX&yX?73KG0b`EOVsSC0aOl6E4oOhA+6XawIE}@K0@YR@O`sU%Ck4eCIenwY zm}wkv{k~WXD%GWqa+TJ--XH_6122`E8T1R?XoCP*br-p3;3EJPU@PqIS6=r+_fDwa zjS=G@(+V7V2f`=hWligpE#nWmrxs-55rsv}T*1GkD4oD9^DQ$a6A{w4Ge&{Ow z?(h>k-gdk5Gs@q-Z%gt4IQAr;Lff20UBF!$@ z9$=i6qk#}yP~Cr1u?O9Ivf;hJeuhrzu?Xl4W_+yM+kf1=GHhUejPK~M6r8fr&nM~P z5xzSG?fr%$qoEe^7D^Y20uC*fXWhMa6Ny~yf3&y?Qod!+fjJ})_7xYHf6F&cBz#q` z)Zxa*<`4{q66k>n*H|n2g%X36vy5Mk&~$BH!!&k@X%};`e88%9IQ+-1DYCn~z&UZ8 zV%RjD<@XE0GqQ^c-QMrUj(}`{z^DXwhSKK*;zi=Q@!~yZt6Hxwr((%x=gGj8Z`QdU zLxIdls4>5Hw)1Pqs{O<=yU8dyF57-!+>M$n#3bEr#w)}`X^a~-qh;Q4?61qK3R0K4IK#>@Of zM%!|#@~@_&{>+ z2=GS=cvW}pZkG=dz285@Mn21c z4(Z1*az<*rL3xw4)HtzGe0`?EqPt>H4o+8khdTSOm|q@2Z`voSfaQa#eaG4HF7=byc2~C^eqvB+wW{S+^=jDLh&J_b#y-z>;rBx~LPG*F z-_B5CRL}ZAY{k#PGWFW64r7*XmFlqD_lU9BDy5vjhvo}AQ$ojaVK*U-l~>_{yI_|W zj6Pqq-Y%7gA87Y)TT)f;h6_jq@>yF|#Rge0ay!FG-kr;tweYV9rK+^<_=ypRX?w?+ zaCu9VcApR(C^r`sOv$4#-lkyPiM1k)&^9lX!5v+}dkX{LV?Y3@KxI}KM&nRY`+%6? zwXJ9cBT|d3-f@_Syi}9~?kjIoiBI!CBi4LvB+U!!GM6(-(>*J)2P}jhD9s+Ai zPZxx>RF45`_M71~b%nA0`O#pZro3QpnJjroQOKBkAV>bB{{ZzT{{X2!{Yn1->QDaw zQh)lB{{YmTV8Y5bIC7WYKGPGz*xP#tVfJ&Oj3_VKXXNh{FfE?jL5BFP333peA$-r$x? zt8W1w&@mPY8^*Q0$^$rOdcHuv2Dj?cY~o+ZF6bcSwH`y;&?AApwbR@!Fl{Ss#hrX= z*`||(H(mx9-&)6U2jPs$R~!k((>Kc-hTWybJR=)lziDJH(DLfo?NA!B0@aTGV~yH3 zA@>ePXoZv&Ea#breb^_E(A3%%uy_e^-A}}5x#9{GM9JKOnwr)ISYLIN%0Flbxi(+w zA=Ef`91Nf_el1o#*Ees-bkNRU`=yl53B$>)${Kfw3@& zE!F*TcT0@+FC?dMn`KBc5ka>ccfMNvL(E?(N|8r&3a4!>J_jdp+=Ek}+a1cT4}v155(fx>rXD-C z+>Tx}u`Bcs4|(|L8lQ&-V5xktSIoCblvEa%0frlZ2h2lO_2qqc-+lMre9g>gD{X_B z^sd^2o;)L(Ow5#iWpl6yBdn#NLh!u};^HyH@>7?r>@5$(bQ}x&>P@C@Y|HmqoA-bz zT13kw@hGO+$-7nYD{+#t&0S5XYM9`eg6dOM_PECf1y&z2l4jl>c9)>Nv*H&}wMsIG zT%(iwlo6~NX0zf^_kqqI%ovPVFizy1^8Wx%kEnTxEk0U@GD*2GOXwauuH2!Co=CpD~)s$(y-|ye8k=1gh2W_LwZ9Qnsf& z%9ivcb3B6;Rqy8z5^R_5O_9*VQ--hT-u)j?^AgSn29}+y-QKSeto0~fbGY!BdWA0< z05Y0bnH2Y#%{HNgV}meqrg{l|c?Jw66-Bi`KQ)k!<-R%%|F_GoW5}I0Ez6hs5 z0viYZO2vT0rv$b3Hv2HZ>=YkpU=DxeLS7?tSHk#?j%~k~#YLtAAA^=VFyK4a5DG65 zrzHt{23Ud44{XL&!g$GursuZu1+ z+j!dw0IZSoqQY=g!;8`-D{x3~q~91upfa)^e1XzS>zia85I~LPwL}kNZ^9C7 zzYqs-2ebDGb-Iy4>}q8y6?Jz55G~AG{AHBe?Se1`4>sI?GIuzXx!J|S1vK#t^A>`@ z6t3spoX&g7B>c)9<1YEXP_mbNSA>sLB^W61OvZ8+m+>y3$=MuJ3Yr$zzi+nC3Zrq1 z90W}*~J$0Mff^#CiVBnBE{zlErCFn^b+GE1Q44Hj)}Fcfpodr|&QU;vbVk ze;7^LR6DdV7ZKgP7JOm>6A5hK`M4T8fpOwwy@9#-m9a02u47l`tHnhTwTHeY6clik z%(sh&$7r_J^ioS~)=Z?rI}~>D6kP%mrrhtB`*eLn%mBdGcUIkvo$8~mQR)g&kshkJ z#HoUw09EDUQHF%X!ZB_GIk%pYNyACj(u=ea2&+;%*-*1+3+I#V0k1KJH^m@e4`!ID zRa@Xhmf|X-z4N)4#A^sp`x29b$l|5}cq*=s%w14!5!o{uN#g1VmkfNty0gRa94lk< zDcl+NTK&hXI2ID%uF%w_lztgO9zp%Uq~CkesP@#$tjr@t!0&xwY!kdeD%EP%mqrcjw3d&!xgxriE&7+00245kux!x2Q zpwthnP|bQ!mZ9PS3vae(51bDQ9Z-M0C2R7W)Df^N>aM zqxp>hlZ8**FaR5NpncSETDM=ghoCeKc`pfb-Y>M+M=&s0JkWe9bdph}ZE*hp+9$kO znMB0qTLS@aZhlZVBKT)=03wbzn=`0jd|uTq2W7*1L4sAWOYy`V2cQ;t?*X-@=Oi9d z{BT9OREw6SSoR1<17;j`nSIFPt{RD3Ko5b0C8v{!P2VH&?Hy}JN8Pw!h|u=)<|3R0 ze2vP|$jX+4cvKhIUp}_0@BJ&bu3+HT7X*FS2u~E3+}%QBn19SxJO1gqEXQfY#XaSb zdt-24v6%yZyf6he55f`Mr9xoi_KfVwmSDp`)?d7+Q5Fw-r@ypGxb9xo-Am^N78u2N zly7gkyD-?NCkL5f`@BmjTT{-&2nD5Y?YtT0>u&Hdm0Y~CKwsc{kb>0aT|u}@OFJI* z`vOmsTjW97087Dl6^e_tA{)3q*Q$2C)qT<0A582KB&%3MyYnqr`=zhT5qB?2R1na@ zD}2NPG9og9!cvQNhd6-kF5bmH`t8?Cz&o!4ECZ;=VF%!gI$feM>41r{IAcp&qwLoS zVFWh>e=tmao!~&KV}J>114!SnfCCcK9OvdR|IP))V4f=p3zt2zVr+z%{qTc_+Xe>>05&v_e_AD8t$ zt=?~r@zY>S7h^o3r^M%5586~u{3vY*Y?vKYWB8sLf2iu7!l}WI(UJ^ihln-cym^LG zV78C9;!>e*KzQ!)mKg%jxHcA%05-*7=eKylsrAqDqwj2Wey~-c+k>M@sQ_IXRn58hfv3!klp({i6oCb`OX| zMP;{Fm^5aPcke5ZuXt_6jG$C%`=|Yf*pRP;PT(Ik7yuRj03sGD*lBwWd58r{mAA{} z!2&y_-`+7BI&L0MFU4rU0RX6MvR!b9oG^-{T1K-;8T3O&jT$s) z(W4S5_YeWT*K*amt5@Ry7y|*ej$IIshacAYnI6gvR-NDOSv}V_-cq64_f4#447G9I z6A*ZZ;7YpeADMn+EE*k?>?67pW`BeBj=yK#P%4Ur?C}w0q3*Bd8YNd)XE*mkmEEzv z{L2DXM(N|`rXUpIzh}%tZDYHbvE&)s$C+l@qLqn~&CI@G(G2qM1|e5CBGOCN${nvH zzJY={f)`1`j#XWI{{Yl}%0Q${B0AduM;La`Pk_Ld+{>MTKYU6K9oy^(!4TRY`?RQ0 z%q%a)e@;^Qb{pU@duwzAJ7Q;rh>=C6Re5zHporr66TgPUHH9$13IZ^~1W8h%17?SW zrXk|XjB}5PW@uYr*0jEDfk9)7HRATUn90wWd?gwP#eN>S_+4gSl z#644I005vpiGng&`AM;MhL>?CiGO4xB1Q+q^2mLdEJXugq4t;V5uZ#q1#S0zof2(N z@V?T4+&?kfJ{3e&NG^7lxLb={R}m9+3NkD6?+Gi018kvOUbf>_9|>}?DpcL6(gt24j&G0NI%cC% zCl9AY%w#ZlIVA>l9oLlQa~PE~l)<8zP{g6I@F#G|1#7k^?ry&k5AH}Z?AF-c6bBCs zqKKfGLeA`Eue_p9D_`z97j;ZWAUqoU2!MW165>CwdF(|*)n;34ugqk_aKF_``#dxE z(&A{f!dzfXRi||DIXiu#a6aWd&QDD9lxH3{?#Bw;ZmYU-vBBO{_EG#pMddu!W48B! zLzL)XJD<3Sxm3R}S)1X7y^uBeE_m(A8nD`ii@&ABue3iA-kWVUM+Vp{ZqqnTl+bXO zD^MV!sKWM!mA3Pe<*Abj73Q{tgRcr=hnUH&nkHkVY2<8vDnv32>^7`9SfIo<>neLR1RSr`h zVpvoGP$-RTb2c&zc?W#+9TrzA!P9gYv4BP{V#NcB$?iJC9hl z-JHI}*kp*?`+u*x2l560904$%S#diA6F8^hQ~afaoc{69yfWnu(FXqj)hko}sm(V{ z$B|RsQN=vg%_~rs;1&HvB1Qp?zb$?=Cflln@sA;rJP7J-VU{l}k;qQfb?sDe9>K^X59`c!`B^(#kmUN##fOaXWT)qSdG z(q2ILa>mAdAS3X>V+sT41YCybva=n#w-W*@vzvfGIi~*rGi*22af}$TMZ|PwYm5v0 z0{q7*WxG-4L_$sk{GZ})YP^4QHj(srB6~A@?~Ff~e{JB+=9KtJ->DA%?(fXGaf(IY z!cvEVZk^Jl^vv^-e-Tr7VzcF=$D{UOliB*47CX;AKH^ak-DLgHHyi!wy1Qw-j?xx( zV#_F$F7KCZpiHv1QmNqE5Z1A3S;qVksMs4S&5vl*n{jzGc#W#U6QA+~2asA-S-^}9 z9f98-+s3I_+jn_})XwuIpJv&V4f6V96*3m3_Tt~XL71a1UV1?W4wWhlHqp#AIeI!& zS_jJ52Le^V>8I^G6!URCf!Pv8xi|(cUaK zjAF%$7e^K_({$T5%Vd4DquG{uOr*K1jthtCI=izS`@IJ8_qo40iQA%{(wcal*x$tP z1N<|<$oo2r5!*hdZIlH>cirYXAP#S5{eyvJv&+AkVuiQERlYWk>%zxu_ugO)8QgL8 z%uEi&WuEVNl=l9hRTLQ?9LpOV@bU9AX`#UP@h;zBf4GCP?Atp+Wp1X}VW7h@Uj>2PJ{ z4rU0h6&84!A&IYsu8 z@a#lVsvgL5Hx zr)g&$o?Ye9jApyRyKyf>aGStf_kLo4$+eEg5+3B>feoV54~^oR8`OP-vpg(Ww0!=^ z<=(emciI}@-JEwsu#!}?C5_CNT4|mQvM>=GO&``^6V(M zrBG6(KvlUt^ZW+Aq?DDLS>bJlsSFV;^;zgh@sj(4_dWadaCm$e*+lI}n?0 zEgW`_THQnnG}>wRl;oCxenV3l1Px_emujZ*yp>c42wB-wIfe`JMIu-+M2_<1<}Czc zDpa_m7ZEdvMFs@aEmPefLRxfGpstZI8V$l1T3*A;m@uPg5qpKp9%CgT+$>{Y$f4>| zSbU5}tCaSgkuaXp$qJ|j>ck+CP{Nzu$HYhqfW0;$YQSIPqSAaSz;n%?V&^wr$LUS}yl%1xR1 zD8XUm{mb*o_?$GivV`-PzGtw6sy)~0c)Dg7$o+E9Wl{K;6l`A9dqn`Dls_zcR<>0f z*Z1BTHJ4!dg)AE)^a$WmEtoxA^LjjT- zu+=Bwx`#-A_}4*lBK)N@HT8PAi;|Xzz){j zniz33$nh-OF3`>(lqH49_(r0yWGEGXd3?2Ds}`rl!Dfw#MOM~g4=L2?fJ^TQnNb)S zhJ!CwUSp|)F38rQja`VCuvPm^>ZrJhMUU$^AxvAl?5I9oBUfoe>_x`RR9;IXV6Z+@ z9dg=bLLV0eV<@Kr%YCMQju%_P?5-!-701Qihu#@M#&)s$%Z}Q$8>^L%{TtwM+q;={ zLQ^vi4=!QIp;K-p-K0mH%Pm3T<=rn0f)#wR*>{FqQScbhprD9V;n90qhQjw|&^ZLe zD#6B$$KJ0QvZpN)dkb5XkBjbEly{$%8Tc>U8XTwMY&75Y6Tx?UMYFLLdrTA`UFcxI zb6qU_veEUZfS{|*aR4*`aPIwmpq15SzvQ8%wu=>j`@=^KyIp)h@U;e+E4vM#ZmY4O zfKzpU(|Gr97``KLRxP@KJLU*pV`jENU{wY^<(a{LH2KOtkJ}qi$!QCT^9426myiN& zZZUDI4DhWOGqhs;5DN=%8j0-6i#K95!J?J`Tos}RLtqxILX$@vcn1nzT;tTdff~#L zIg~R28tqpw4rGhwZWNJjD{7b(*?}#n6E*l2&lL$}!VaRrccn~QW&tV|3aIi>@NWol zWEpmxP|zo~fP@$#0TdUO@d}cp5}xCCdSgJioft4u<;%oe$BCFWk1&OZWfG(o0P-c% z8?#C>+9{$wso0g*__cP6j}e8J#5iC}yR8USj7VrjY?ZRx zxT*}kzmy@5+WMl83rFWN5q>~bm;TG^8q;^nk+D2+3(Qc6^bFePgSeBP>{L)PlV*N& zXW~C{r0=X%4ZntFMpV8S#e1jcM`=Ff{mb8V7nD-h{D0Y43}jsoIN$9kCaG2ArY6J& z6tl(%aUjWD7?~Ml9n3ktGZ#Zb#bZvb(*T2!c#^ejRL5zMNJDqw+B zoS2GOtGeb~2CZ%BNb0L=y1^}ru&8%k7sP7*V`$y7 z?li;*rt6k3Y@N}s)Uv9o?y+M{mn>`}Vl<4)7OfawR*L z?_V&WZ$;JSlexFFMw(6)Z@;`Oo&#q-(=a{W@Itd}TI_P|#8vo8hm)}ZTXQb{@MXpk zmlrx0aAIj`YKnKnAafd%m6yxeTiF{~mk6faSf#BUwuBNL#pQxj2w`_B;7(z*SmqZB zl?d8K3|P85M~QiZh_MmEWQ4hK$pmIvqcj*oj994U2FOYd5*6Ec<9ohl#^o>IyFm*O za}_UQHO4M`O>%Gr8JX@M#CN3p7w$WM80krOQ^xd1l)ZUHZ{;>LR^7j2GhNsB5L9l( z3Bio#x+p@OW=d+ozz?(`7Z7Y4E+dw#mSrr(Rhen&s-vowY$hSa}+!Uf%M3Qhj z7VlbAa86)oq?ayUBb^=PM?;LdjO5NH=#C@Xhrt2fDL_e(X55bu^p{7T4x#0;`Z0zIg1df5DHM`o12Q- ztk(bz^ML|(w@>OYNJ&uHARD^8NU$6eZK%7 zYB&IvnQd8g8QF5nAVn;=`DyuNSMB2&^NgPRui|7&M~V4~v!?6x+c#NoIV%Il`Ssce zJ%e>+RG?FMQMVN{VQtt3F$|4xJin<>aHBQL@Ig(b86Mtfuhd}O6k$2|g4q+_vobEh z8Kwf1|FNb8IC^hqRj8(e{=oIFv|SgfgoD$ zv)B^nDP^U2RM`*L_M9{qg&)Ai?@;IU3J60Wuc4!5h_hNK6y_g8fN4NCl4BNJGc+`S{DwNcFN#GnfM1|Er zY^faV%6*7fv5jMcpH;+l zM>$|}s_wkbEJJee=8C%QJhMj&Zmx@ky#%**<@seI)5ujsW!v5*d51zNNxes)k+xNV${aHP07bKi z35D+jI2vF8a;jff?1R1GmotCfAnec0!6l?f7!Flfj3r}P2P;}#%yiULMImK4i!joI zWK*+a9>-{0N{3z5H@rXPGMMR-pR_3AflxQu0CkHO*s~4yhUZH*7I14yi%h5q1s1St z5gP?k4|Pg&4%Xt+XWnCM>HIWhgWgzsmOQiPgcLqnx<0!x(wA9jvXxF8W?ye=pIDZ! zBP|;<%dznQD?j(%U#5UhyWI?Z_D}GB~inM7zJ%t z@88~XUD1n}D6wAu0J!!A13lnMx=h1yita_WgBwEKj>#!EuJ4F@P!#tZN(>p!jqo7M zphUpXOI2t9lwo@a-?@Gv3SfcWtT(u|0izSxmM>JPEKqU2;DIeFA9AR;<_wBbf~eg5 z68i~U|iEEc_lN;Lb&h3&3QwVK^ycnDFWbf{V6mri4i*+9P& zWQ9n*tU>V4rFO!h8k@s>rOS?UDt81Z_Jad9k@pO1%q`YYL<=cQ2MhoKQ$XJ0UqB)? zU^0_tTFzDpVMdwmMbV#zH}Wfu%?QH2@WP<>GC6$M+Q`s^wPECy3-S!-%xER(xg&T<^p- zmfXB7!VzV#PzWxb;-6%WL^j^CUEBg;S;4IoGUb7Rnj2DC^LdDiYXTxu<%m^a-NCVi z7Lqst2uxT(*%KLA)e0CCxT0dFakwLC%vfLxHYODKm==?Jv={h-R7M)B#N91g23)z8 zUCWMz5o$2ONZ}I*#@NJ`o*1!Z-l7Jjn+4!^!3-fep;9k;xS(&aGT_;PGn6-GWf*Ec zh1&s?xZLaq%fayb&{XYJdWBBw zG2ZC=KsEK*ux(#AnBhr82f4e2V^})UrycWTp-F}XguWz(VDFTS8tuOFl~-Jb`?4rH8bzM%Z*VUB~VP&8V+(VG5`pF_a$v0J3;E{-bVNMchq95-7kYhv%69P|VpvFIN1uYfZEm%b6zGn+zq#9Zmwdz|$5G4PY8mKxG;vxKpnbrNYB#DR#sJyrqu)yvOuh zWpLsL2_%`?qXxJHB?`G(tnmj3n9!C8BJaXUAn%|q>T{beZ~OC71hlt1y&reZ4z%66 zlKtn_yJ6EUDmi0_#ay*Xwmp`i6UEH-wb3nChhTl8L%DLTa5t7} z^QW|>`Q2aJPcawfb|#17Qi6v_&o6%H6gv;pYdK;8f^G2TU<2;VuZYd+>Ii02v>Ll)Bzc5Xsfe=l z5Z`{9`#_dj-e$hgEt{&$K^&wYJA#@ma?<9_1%obLBb2tF@u2B9h$(4$hY4ds$9SfM z7)HS;*&1c}me#h#(7I6B8e;aBb+SwDpj?WceVuOcd~w?Y{f1N8F2_k$x;Ix zMqk3Ca8-#Sp3=gbG`qK#ZfJi|DNfj)di{{qar&hmVy8e8*&P$H9wke(eRqu}Djwq= zcQ9p={6KDsXmY#XX?xg7Ar0Uvf;GN(yGRg#1LTOb2mT{Wyc2P)`u82+~OHUxU;2A2*)zIE-bh)Q5>b& z1~X(`4jLDjqKhtE8iNUPlQIi$X_+w=$yrWnI%?U?spOaUJcIkCLBRb=pw4GcWDmSn zJ*FmK;{+A$KT~HyK=PxeKF^)Dowxbga{D{ScWs}8`G(K;9lt)`6L;UAX}R_zymp+X z(R0yeJr5MAFfX(= zhKxGzO3>*V14{~tS~2UXx^Ie@THL0qEbCZ0Z#Ac(Z=rJi3JqvI7Hx*+fzcp(73ead zuP%;{Pd1X%d=y+GGWQ z^eo5FV-1LJD^f9K!Iz-IK8dPasjVMC-8aOI||5zp{<^l$WCIMH;}san)MBcjsd81;`cd|D;U1|}yii*CJ>VW#$MX|S4uEWn%APvFx`Rx%p3IBzM{0HjAPJrxUtf)%nD-Y*z_1_ zbNnNV>bZ}g&iF7Jf|<>plPVsq#1$Cm=ya^=2Ua+agp1IJGUfG?f*Bx4?n>jCQ^v`Joq2^n(b%Z(!c00{Svvg%gah3}vS)4=DLI+tG5Y?RV(CTPv z>Qu{!XHuvY7K)ZZHOfGN33}0pzrn1xc)>LYAeJ| zkvm4_1-u&sD=caTi7FbpR;G(m*YIr1wzboH>M4Z1DY3&E#5b66sV)wLSfn&aokBfK zyn--7RH!YKAj?aah)m|MqG`rQTJ+aTncJz==haw9w_%MKGDcv;8;!E`xVni{Qp?JY zx6no%EJ;>l8Bow;Z3A}g7+7mkn!c3}F@07pm%Km%k3yp3>I=ICg_LYY*dnow;0lir z+g1n~5W_fYN2Sn@p?Hu)(^`yquKF9rrE?Zij2nzS5Em?OL!!05hB_jE1syCSrw^(& z>@kQ$C0>E6BC|aJgeAn4E(~-vbz#<$sHpT3{{Rtl-a3-ncJ!PQ$EvdQbwmM2p#J~@ zAvcvO5hXb3xIpPrp&p|~9)i0@JtHzJP>4tAENI))O$oeUT&d`~C7pLv6WjOpK?y|& z9SmS10pTLON5c&gLX)O6si8$6bWw^%5j3GgKomm}C5ge%Tj)&zAVb7rkG^Xz^0^D&Dtr>BYEORq0F?&{aqoeR%9>or_m$u%tzxh-tK zX5lNi5z*kYqx}_;w%xWfoyk^7OgPxTD;FX9*BiKoJtri$BfHq~ZklKgE}*iDMPivG z*)`4VuXzjva>23n*b&f>yI-$}k10tw!4bX_$sUpJS>V&0=C^6`n_XvGb)#KRmLl0XY8-pb>R{^j0PgzhU+^-iH<7ZI3BMB^*4_v&G zJ;gI&)8J(XdY-n_Ga`1F`*_*dlc5Gc+keiDKq&9nPD9Px_;W1@VD zv}%CkM{R6O|0TuJ(g4EukR;3+|3KKf=i~Qz5@11+-mgK&2<kN&Pqk+yMYE>r4K)uwY=gxM%0xCl)ngMKh~#nTyAa?j%&}o^PSYg3q(#&J_uB&;p70t98KRmYER{ z_EN7rj5rRmpH8y1N?%0CG1<-O@}!zNd;fT`^EurtFP(BNxfeuoPdr?F#VRCnXn{5W zKLe$K5LTA~rGB6-_%aw25srgP)8SGky;Hdm3b3&KX+~TZ!V<28^2Bl<;1rs5i>fy@ zT>7p585*_;>8${_cCG`5(y1Ue*8HKY%5Ak$-N%M$_K@VOO3<9yXz%Xx`4_36$VCKf zYP>KrOg`t7;cM$rC8iuj{%!Qy-r?g!-t3XINu+TiXNPTR34Vb?1Qpwe zbw$7kB$#!5gKN-^J&~luB*=H8(MZ;+g=~Z*_}p(#Ptf zL*T=Vl$eyYv5wF2zgm6+Jz#Pq+Lm~32#So|e1M1DFFz*ICa`M8x!)?Ak@2yA2`IjF z^dFz&*yrxO0D6Sk=igh;A>UR$zBMq-I}VO9-Z1ZCL!ZE(uYkM0CM#IP0bpatnKC0m zM6|KD-B4$w;&Xc8r_mAORHi`Ja3Y!LC&u$1AmeMx{vr;`rf&aZ2af2L-eBIyEh7e*OD{X zRzbhuwsUF^u`rPrmRn8SpwsWT$e;Z;4kFzQF@3~CX95nAP3RS`RBXYpI=LYRf}ajc zd8P~CuIBEV-IOmYux^Pz@7(>hJ8ktwq-k9}o!}6}--ZY3SrQh+7G4;~eW)L%V%P(B z+o`_;IuGIcx>8#hY8x^CIeVKbo;UHoAyOKu3R>JpuN~f1g9p3%%{MgEPyM)&u~U7I zXY#7gtU-|+m>q9`0O^uPpz#vSe7GBi#T)4bU)Ev6@=-ZR4rW`&TT>)F5{#mPm{IKI z1H(t+OXiCI@hPu5S2T?VEZ_MhIJvjeAKS{kd;`Su1zuz+m)x_q$`WMw1xb7RsA!Du zVfm;PZuP?~!eOlK58m@f*p^H9fzn22fG z-`_d@{&auCUS-}8PDfWCgFSD!O}Sxem35h2SUE0i_#O;zjY~`rU4^ze;oGpv3w15NHqJ$5KM>B{{Dt1DajuVsjJ6pFdr`oK2WRe8Bk*nxVsC; zdU|Z1kQ+*t^%7hxRkBnBi7e=ZJ2lGz}QmS?6L3n>i+g%(`TgEQ0cQ{P{H%} zui3ZlytStQ&FglbgbzV0*^$jkmQidBd#;werMAFZ0MZoSdgTuF3~Ovcp9~_KQg?-d zIA;`-jZ=A@EezuoR*Pj658kF#v1zg@m2HN_+9oGrqfH}h5MfCA5rW zJea*pTun?p zVNwUeeF>_`jAp`%*@Kow&%DD>Rgu2qDN^~te9^47Xrc9_f@8$yv)Wx8r6p#(F;3AS zy}`S!{zcW2mC~!G=Xh;JzR(lFuA3T{w)j?0_yJln3;I+_XS_nvUiuanv>h8N8=2h| zOz1uBl+Y`%dZOsWPYVOUqM^Xh0`tYH4zfe3;!En_@n-08&!LI7Smtbc{o!qs1cWv7 z<9%_LzlAhDB2Ul7B0lezK)#RNc3R7%`&HeWiCNPZZH{#+Vf-xm^}5h2kPSMxG4 z)!3g%P>yOV$~q~7!$%VQ8tu}^%gtST{2|_HE=@MO%Jh-L2HZB&UHEQ`z|F^)q+L%{ zMpO~-TczrmGE0rIq8-5d6BYA=Pj>S(NMj48sSkF*^Gm4x3g5erc9^kMHEe%kyRgot zu}Nq0pQT-IDcm&_NAf+BexFFK{{ta@XrtK3>8qIzA7?8zK22EPt$MU46a$?fRD2#QT;CIweWiX`Xb!~gYHw~ua~`q>Ao06R;G(ihhv_xB>0e48(my= zXOuaTS@pd2*!*idWtT1U2b~Ers+}6>nXtR6vLm^u>%mDOqTM8GoA2FOUFs-P>ubAa zPgVGCDC&L%a{3UbxCp^qlSBgIn7%5bp>|#zQ${_Qfb1QN5BL0WAu+}KRuBJ;lK#D8 zTiQ=m{Et+u+U_!NTE9H#sEC;4Pp_>pLmyTIFJ@@DEL4d4jaq)U-G4R*?%g<5yP(kh ze2vUDWu@1z(j1CF`@Zsq6XAJ!QGIjx?e}H$7*+mooQ_mi*eKa%5!~OjLAnbxk}gp zMKjctv3G6=8#~CP5B_?kRk5#E7wH+^P5+E8KlQ)!32R8o^L*qKM_UYv;7a=N?j?)0ZByuod&Tez0t*~ z^(HyNUk1Y&D`^G_XBLHD+|287hQRVdZe*%nt@UTRDeBJ<8&FhWB2Kq5CzBoS+Ugb2 z-0Hcv66xt#!C4SyCo$P!a4A-L4_xA6C|r^g@0WnEFXH(1l^&VS+oH&1Di{qRLULx| zlI#TIl!D|x-0HXr&5BZ+m>Tx~*Wt(ir^5wMx=xD$bOe9pr`MaPX)^czAG=8@$8(&R zTsv*{GWwD=PcqSTEG084B2;i^QnI4>{{_UfL((kshE}$EEtsQD!Z@*;*?+}xB&=kn zPl~1RyKM4V_`MRxRM=7uRtx>mnlW1G8NL-ux+)RUi-k`cvnt>Eq&)Q7N}|*YVhGDw zwAWm{*$)J0RZTH;MHUm@X2{ZY1Pu@iM3sGA9EC4>JiN2aVLY}`LcS_8!c>YEh+fDy zi$8@^D+F4vR{oPy1Jt5rP&Q3;btMUKQ;ez818aHrH|IDPeU$ch%F0bk%l__)4rO2Q z5$m#UJQ82c>&uzQqcq-_<~gRuai3-{5}@LF9j~&Q0k6^?R8H-k<0`d&{lDw7`l3SF z1cs+mzoYIvPc-yiC zn>5^Js%5d0AM>cx={>c3=3Qy+{~E&PU=A>S-Nt7y{l; z*qgGKu>BM1;PFy0)NZ@zAacJZq#%gQgR$9D;uUjDG=+z%{Bu(Pq0W_=lNB5*fB$#g zgT*a+j4D@#dmWFWI1uhyVO6A6`9c;7j8Si`9f(h50cF_^BAV`X$ArE$GhbWeLJG(D z)k2_hS)MWq5MuBY?_lDV92`bRUvU^c?rjgnEG;Zkr<{vaRLm@131?UOxWXL>zQ+Ks zPGP(Fu?*P@uY3sV$JF&l8!F()72Edf-gv$6Zciqt*8~^?zw$&sm}hgWs~_o*bxW%( z{yUTHBEuFX?sd8nZkmc$I2vSK z!_0v*(AAQ5q!8*}#V~p9$K@2E)Xk7D63!I{dG3kdXZhTK?_SIdyH!)kHFL(J>)ASJ z$ylMx`uQ@v(vFrcT&&Z-z>oH?Vxw(6e&&mT@FHAHKx0X5a}R)saIXU&lZN|+#G9vy zCCSDy8)wE(ndtg={pxy*WhfxzdFO1!`W=hC7|Mi15xs zX6X}?@K2}JxXS@GQ4;Umb8rZoc}P?AM)Yzcf~?7F{`jcVv%2M@-O)7cxEW8!9-P#& zIR}pk6*viC{g^9bY11FgAhZ;a|ME$ld`={M+Q**Am+4Z)Txgymm7s{}@M`7*D0LR? zp?NlhAvst3*qm3Vxshz#z6wdT=)Cyv3D!v_)D%}!jE^9W?04$fNPXwn6*3SfQLO4x zJbjeh^K+t#yrr*Z&nvF+M|jO{DyQdr7>-$W)QsVz)evGG2hVYKoN!)G)V6^FhUlY&o_aQ=*{?3!CYR7&8b^hhYCD%;IYKVHdAH2A|GcT{@cnX08Z9$icp zubh{o;o9|HvAdq2XoL+Hjty^Pt8X~kX3}wgMI`82u#Tk~b~JZ(Bun}W@nFqb?O;pi z)utqdJ|M|nn8j(IOE#M8U^@$kZi`&ZT-OGl3p)F_@I%%4)946aJgXjG4(w_pe3*^m z*8IA?{-!z$D5oV|FZEd1)&OlVSIesy1ysG>62;8Kg2AmpbB#{4=r!yA_zdD+MAUxw&$FI?Q8~B*4?p0ms(M7}oPB=T_>!wjQo@DjsAd z(e>Op7$-8lVP>CywQor6PK$)$a`5>gA&(TLJBfa} zx0E}*90Z3(+&gWui%v=@e;SM1n!<1K972S-UkGsZ1Fc10#&>IPAGrPp2eyP=J;lFK zQP}E{HE3GVaNUrs`T0UEf5~-4zXW>uEvhiL4C{38mACXi$phOV)IV7|U72uZR^- z2$HjmA=Z4sx3FN?a5mU9sDdE>8ZYF_R>%YuRb@FLB6Z?D7x~*M*Os~lYp08M8qUS{ z{yA9gg|&gBNi$H%@F|*QRD^MzpjeRbfYfDtocg;}wFLL@y8)M_OE47}R22c*lki!b zRC5P-mJB?r9ZSrPGh$^~S3g22>JI!32xr~C?yEgB8V?2(_?c=pVP?lRR)U3+ZbtVt~-ZG@iuMU2P9hguamdZTso%G(!GkBxpB$$_I z{zN(VO?i_Xv&(Q&qQm@_|saub445VUI;zdnvVM>ng^LNVckLK56fLUs2HzG? z^}pE16=itaS1!9N>kVCfToRJ?$e_g10~UVbo`>xRd2NC|UC$trVNvkTdC zFCGz`)VswMU(HONk-u{UuRAHfvStc3`dMaUNtp9GF+pkDBhKYnd@z;)Kg&1w-9z+uRyieQr(t= z4U=n?xkHB8D6#if1bJbOpl+8e70}jmkI+E$#klKqRAN-VORse>=rJ-&)pA+-ladKe z4=H`LMYae z3>{ixuGCDei02jTUy0?OUH~kyRI%-KD5hx9z2{6V6vOh$t!dD`o7p*&^bO`Sn>!KYHPt9V>9}7D+qvhM58SAm5U093`IcZ}g*eW?eNhB%eSW7xsxd?3QCCH`-GU&)| zE5Q#5>mu1OLcwZGxDQ~6Ue9t`H?a9;*IgeRoYkxi%hn_$&AyFaAoHZp)=W~q*yTM_ zOa#a!H09RlV#-agUBI1MfHT!KINtNJ9@=z1FC>4*NZO_R*=yc!7Yy9gcaZ^JKj+A| zEoWbkU={69?spLPZl*djJENDvPk_Czmcb)%oQ$U*ST_%C&OHqwXE2)PmECwuQ~ z4U1WZVRGSLi3c)C-#nyZpA%NfPS6$f`6sA*E3Bn&#Z?sld#70{f@ z^3VX}fAen-t{0RE^{Vc$VdfRSIqy#EmVWJFzxdwE9pGySQC7HBo}n+ge!|0w?o_Ty z%s{i&EMtyN{H%S{Ah}X-_*pOfaASDM*?gL34@!kDM%}R?W!V7lyyH;re!P%+Uw^4rztiYVg|3FpseCEYGb{{=hT@1K?&5`5n z%;VHDIs^(uN*=!F-k4Cui%Ig(*soN4)-qZFKJ(eH$O}+V4^uZzGnmx@a%c`nL zV~}ANSf=Tgf%Ry1pC6-@bVYIC=Vn$FWfHp)=z8%IG_mcJ=Os9b9+IN?SLfhsGBHRWQkRbN=@;rFo)ZfpGG;II7mxd ztTmytpvZn>$X-syeaNetkqG&g_#;Q(kO()6zfo0&p#qa4Tjq=pH1S4O28;aJvyhOW zi22d0d{7uxWjY$n1E%+Cy%iJurrj4hcduzEBJ5U^Qm84uC*dk|2RxCOTf1AXGqtB8 zjsY{`VZ=o^49ksq8&(^nX}}TYTr-aEg=Fx4w`W%BS4pg;DK^TsB7Ya?+>ZKn`~3@qDj3XI048m< JU;1z1{{f5UHf;a^ diff --git a/system/Controllers/PageController.php b/system/Controllers/PageController.php index 316e01b..5898a1d 100644 --- a/system/Controllers/PageController.php +++ b/system/Controllers/PageController.php @@ -11,7 +11,7 @@ use Typemill\Models\VersionCheck; use Typemill\Models\Helpers; use Typemill\Events\OnPagetreeLoaded; use Typemill\Events\OnBreadcrumbLoaded; -use Typemill\Events\OnItemloaded; +use Typemill\Events\OnItemLoaded; use Typemill\Events\OnMarkdownLoaded; use Typemill\Events\OnContentArrayLoaded; use Typemill\Events\OnHtmlLoaded; diff --git a/system/settings.php b/system/settings.php index 8f33472..cfebb92 100644 --- a/system/settings.php +++ b/system/settings.php @@ -39,7 +39,7 @@ class Settings 'settingsPath' => $rootPath . 'settings', 'authorPath' => __DIR__ . DIRECTORY_SEPARATOR . 'author' . DIRECTORY_SEPARATOR, 'contentFolder' => 'content', - 'version' => '1.1.0', + 'version' => '1.1.1', 'setup' => true ]; } diff --git a/system/system.php b/system/system.php index ac30c10..13c3cd0 100644 --- a/system/system.php +++ b/system/system.php @@ -19,7 +19,7 @@ $dispatcher = new \Symfony\Component\EventDispatcher\EventDispatcher(); * LOAD SETTINGS * ************************/ -$settings = Typemill\settings::loadSettings(); +$settings = Typemill\Settings::loadSettings(); /************************ * INITIATE SLIM * @@ -188,5 +188,5 @@ $app->add($container->get('csrf')); * ADD ROUTES * ************************/ -require __DIR__ . '/Routes/api.php'; -require __DIR__ . '/Routes/web.php'; \ No newline at end of file +require __DIR__ . '/Routes/Api.php'; +require __DIR__ . '/Routes/Web.php'; \ No newline at end of file diff --git a/system/vendor/composer/installed.json b/system/vendor/composer/installed.json index 3247bee..1b05691 100644 --- a/system/vendor/composer/installed.json +++ b/system/vendor/composer/installed.json @@ -369,54 +369,6 @@ "urlify" ] }, - { - "name": "vlucas/valitron", - "version": "dev-master", - "version_normalized": "9999999-dev", - "source": { - "type": "git", - "url": "https://github.com/vlucas/valitron.git", - "reference": "1712b04f16db5f243ddfa5ce26a9b51eb1948a36" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/vlucas/valitron/zipball/1712b04f16db5f243ddfa5ce26a9b51eb1948a36", - "reference": "1712b04f16db5f243ddfa5ce26a9b51eb1948a36", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "require-dev": { - "phpunit/phpunit": "~4.8.35" - }, - "time": "2017-12-20T08:03:40+00:00", - "type": "library", - "installation-source": "source", - "autoload": { - "psr-0": { - "Valitron": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD" - ], - "authors": [ - { - "name": "Vance Lucas", - "email": "vance@vancelucas.com", - "homepage": "http://www.vancelucas.com" - } - ], - "description": "Simple, elegant, stand-alone validation library with NO dependencies", - "homepage": "http://github.com/vlucas/valitron", - "keywords": [ - "valid", - "validation", - "validator" - ] - }, { "name": "psr/container", "version": "1.0.0", @@ -501,51 +453,6 @@ "description": "Promoting the interoperability of container objects (DIC, SL, etc.)", "homepage": "https://github.com/container-interop/container-interop" }, - { - "name": "nikic/fast-route", - "version": "v1.2.0", - "version_normalized": "1.2.0.0", - "source": { - "type": "git", - "url": "https://github.com/nikic/FastRoute.git", - "reference": "b5f95749071c82a8e0f58586987627054400cdf6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nikic/FastRoute/zipball/b5f95749071c82a8e0f58586987627054400cdf6", - "reference": "b5f95749071c82a8e0f58586987627054400cdf6", - "shasum": "" - }, - "require": { - "php": ">=5.4.0" - }, - "time": "2017-01-19T11:35:12+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "FastRoute\\": "src/" - }, - "files": [ - "src/functions.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Nikita Popov", - "email": "nikic@php.net" - } - ], - "description": "Fast request router for PHP", - "keywords": [ - "router", - "routing" - ] - }, { "name": "pimple/pimple", "version": "v3.2.3", @@ -888,5 +795,101 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com" + }, + { + "name": "nikic/fast-route", + "version": "v1.3.0", + "version_normalized": "1.3.0.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/FastRoute.git", + "reference": "181d480e08d9476e61381e04a71b34dc0432e812" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/FastRoute/zipball/181d480e08d9476e61381e04a71b34dc0432e812", + "reference": "181d480e08d9476e61381e04a71b34dc0432e812", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35|~5.7" + }, + "time": "2018-02-13T20:26:39+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "FastRoute\\": "src/" + }, + "files": [ + "src/functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov", + "email": "nikic@php.net" + } + ], + "description": "Fast request router for PHP", + "keywords": [ + "router", + "routing" + ] + }, + { + "name": "vlucas/valitron", + "version": "dev-master", + "version_normalized": "9999999-dev", + "source": { + "type": "git", + "url": "https://github.com/vlucas/valitron.git", + "reference": "4b32e6067a7f611113161b2c6f8258d85c16d0e2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/valitron/zipball/4b32e6067a7f611113161b2c6f8258d85c16d0e2", + "reference": "4b32e6067a7f611113161b2c6f8258d85c16d0e2", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.8.35" + }, + "time": "2018-02-10T22:02:11+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-0": { + "Valitron": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "http://www.vancelucas.com" + } + ], + "description": "Simple, elegant, stand-alone validation library with NO dependencies", + "homepage": "http://github.com/vlucas/valitron", + "keywords": [ + "valid", + "validation", + "validator" + ] } ] diff --git a/system/vendor/nikic/fast-route/.travis.yml b/system/vendor/nikic/fast-route/.travis.yml index e16ed63..10f8381 100644 --- a/system/vendor/nikic/fast-route/.travis.yml +++ b/system/vendor/nikic/fast-route/.travis.yml @@ -1,3 +1,4 @@ +sudo: false language: php php: @@ -5,8 +6,15 @@ php: - 5.5 - 5.6 - 7.0 + - 7.1 + - 7.2 - hhvm -matrix: - allow_failures: - - php: 7.0 +script: + - ./vendor/bin/phpunit + +before_install: + - travis_retry composer self-update + +install: + - composer install diff --git a/system/vendor/nikic/fast-route/FastRoute.hhi b/system/vendor/nikic/fast-route/FastRoute.hhi index c34bb8e..8d50738 100644 --- a/system/vendor/nikic/fast-route/FastRoute.hhi +++ b/system/vendor/nikic/fast-route/FastRoute.hhi @@ -34,21 +34,21 @@ namespace FastRoute { function simpleDispatcher( (function(RouteCollector): void) $routeDefinitionCallback, shape( - 'routeParser' => ?classname, - 'dataGenerator' => ?classname, - 'dispatcher' => ?classname, - 'routeCollector' => ?classname, + ?'routeParser' => classname, + ?'dataGenerator' => classname, + ?'dispatcher' => classname, + ?'routeCollector' => classname, ) $options = shape()): Dispatcher; function cachedDispatcher( (function(RouteCollector): void) $routeDefinitionCallback, shape( - 'routeParser' => ?classname, - 'dataGenerator' => ?classname, - 'dispatcher' => ?classname, - 'routeCollector' => ?classname, - 'cacheDisabled' => ?bool, - 'cacheFile' => ?string, + ?'routeParser' => classname, + ?'dataGenerator' => classname, + ?'dispatcher' => classname, + ?'routeCollector' => classname, + ?'cacheDisabled' => bool, + ?'cacheFile' => string, ) $options = shape()): Dispatcher; } diff --git a/system/vendor/nikic/fast-route/composer.json b/system/vendor/nikic/fast-route/composer.json index 62aad22..fb446a2 100644 --- a/system/vendor/nikic/fast-route/composer.json +++ b/system/vendor/nikic/fast-route/composer.json @@ -9,13 +9,16 @@ "email": "nikic@php.net" } ], - "require": { - "php": ">=5.4.0" - }, "autoload": { "psr-4": { "FastRoute\\": "src/" }, "files": ["src/functions.php"] + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35|~5.7" } } diff --git a/system/vendor/nikic/fast-route/psalm.xml b/system/vendor/nikic/fast-route/psalm.xml new file mode 100644 index 0000000..0dca5d7 --- /dev/null +++ b/system/vendor/nikic/fast-route/psalm.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/system/vendor/nikic/fast-route/src/BadRouteException.php b/system/vendor/nikic/fast-route/src/BadRouteException.php index 7e38479..62262ec 100644 --- a/system/vendor/nikic/fast-route/src/BadRouteException.php +++ b/system/vendor/nikic/fast-route/src/BadRouteException.php @@ -2,5 +2,6 @@ namespace FastRoute; -class BadRouteException extends \LogicException { +class BadRouteException extends \LogicException +{ } diff --git a/system/vendor/nikic/fast-route/src/DataGenerator.php b/system/vendor/nikic/fast-route/src/DataGenerator.php index 16053db..af577cd 100644 --- a/system/vendor/nikic/fast-route/src/DataGenerator.php +++ b/system/vendor/nikic/fast-route/src/DataGenerator.php @@ -2,7 +2,8 @@ namespace FastRoute; -interface DataGenerator { +interface DataGenerator +{ /** * Adds a route to the data generator. The route data uses the * same format that is returned by RouterParser::parser(). diff --git a/system/vendor/nikic/fast-route/src/DataGenerator/CharCountBased.php b/system/vendor/nikic/fast-route/src/DataGenerator/CharCountBased.php index 5c38b89..3cfeed6 100644 --- a/system/vendor/nikic/fast-route/src/DataGenerator/CharCountBased.php +++ b/system/vendor/nikic/fast-route/src/DataGenerator/CharCountBased.php @@ -2,12 +2,15 @@ namespace FastRoute\DataGenerator; -class CharCountBased extends RegexBasedAbstract { - protected function getApproxChunkSize() { +class CharCountBased extends RegexBasedAbstract +{ + protected function getApproxChunkSize() + { return 30; } - protected function processChunk($regexToRoutesMap) { + protected function processChunk($regexToRoutesMap) + { $routeMap = []; $regexes = []; diff --git a/system/vendor/nikic/fast-route/src/DataGenerator/GroupCountBased.php b/system/vendor/nikic/fast-route/src/DataGenerator/GroupCountBased.php index d51807f..54d9a05 100644 --- a/system/vendor/nikic/fast-route/src/DataGenerator/GroupCountBased.php +++ b/system/vendor/nikic/fast-route/src/DataGenerator/GroupCountBased.php @@ -2,12 +2,15 @@ namespace FastRoute\DataGenerator; -class GroupCountBased extends RegexBasedAbstract { - protected function getApproxChunkSize() { +class GroupCountBased extends RegexBasedAbstract +{ + protected function getApproxChunkSize() + { return 10; } - protected function processChunk($regexToRoutesMap) { + protected function processChunk($regexToRoutesMap) + { $routeMap = []; $regexes = []; $numGroups = 0; @@ -25,4 +28,3 @@ class GroupCountBased extends RegexBasedAbstract { return ['regex' => $regex, 'routeMap' => $routeMap]; } } - diff --git a/system/vendor/nikic/fast-route/src/DataGenerator/GroupPosBased.php b/system/vendor/nikic/fast-route/src/DataGenerator/GroupPosBased.php index 4152f7a..fc4dc0a 100644 --- a/system/vendor/nikic/fast-route/src/DataGenerator/GroupPosBased.php +++ b/system/vendor/nikic/fast-route/src/DataGenerator/GroupPosBased.php @@ -2,12 +2,15 @@ namespace FastRoute\DataGenerator; -class GroupPosBased extends RegexBasedAbstract { - protected function getApproxChunkSize() { +class GroupPosBased extends RegexBasedAbstract +{ + protected function getApproxChunkSize() + { return 10; } - protected function processChunk($regexToRoutesMap) { + protected function processChunk($regexToRoutesMap) + { $routeMap = []; $regexes = []; $offset = 1; @@ -22,4 +25,3 @@ class GroupPosBased extends RegexBasedAbstract { return ['regex' => $regex, 'routeMap' => $routeMap]; } } - diff --git a/system/vendor/nikic/fast-route/src/DataGenerator/MarkBased.php b/system/vendor/nikic/fast-route/src/DataGenerator/MarkBased.php index 61359f5..0aebed9 100644 --- a/system/vendor/nikic/fast-route/src/DataGenerator/MarkBased.php +++ b/system/vendor/nikic/fast-route/src/DataGenerator/MarkBased.php @@ -2,12 +2,15 @@ namespace FastRoute\DataGenerator; -class MarkBased extends RegexBasedAbstract { - protected function getApproxChunkSize() { +class MarkBased extends RegexBasedAbstract +{ + protected function getApproxChunkSize() + { return 30; } - protected function processChunk($regexToRoutesMap) { + protected function processChunk($regexToRoutesMap) + { $routeMap = []; $regexes = []; $markName = 'a'; @@ -22,4 +25,3 @@ class MarkBased extends RegexBasedAbstract { return ['regex' => $regex, 'routeMap' => $routeMap]; } } - diff --git a/system/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php b/system/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php index 713d897..6457290 100644 --- a/system/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php +++ b/system/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php @@ -2,18 +2,30 @@ namespace FastRoute\DataGenerator; -use FastRoute\DataGenerator; use FastRoute\BadRouteException; +use FastRoute\DataGenerator; use FastRoute\Route; -abstract class RegexBasedAbstract implements DataGenerator { +abstract class RegexBasedAbstract implements DataGenerator +{ + /** @var mixed[][] */ protected $staticRoutes = []; + + /** @var Route[][] */ protected $methodToRegexToRoutesMap = []; - protected abstract function getApproxChunkSize(); - protected abstract function processChunk($regexToRoutesMap); + /** + * @return int + */ + abstract protected function getApproxChunkSize(); - public function addRoute($httpMethod, $routeData, $handler) { + /** + * @return mixed[] + */ + abstract protected function processChunk($regexToRoutesMap); + + public function addRoute($httpMethod, $routeData, $handler) + { if ($this->isStaticRoute($routeData)) { $this->addStaticRoute($httpMethod, $routeData, $handler); } else { @@ -21,7 +33,11 @@ abstract class RegexBasedAbstract implements DataGenerator { } } - public function getData() { + /** + * @return mixed[] + */ + public function getData() + { if (empty($this->methodToRegexToRoutesMap)) { return [$this->staticRoutes, []]; } @@ -29,26 +45,41 @@ abstract class RegexBasedAbstract implements DataGenerator { return [$this->staticRoutes, $this->generateVariableRouteData()]; } - private function generateVariableRouteData() { + /** + * @return mixed[] + */ + private function generateVariableRouteData() + { $data = []; foreach ($this->methodToRegexToRoutesMap as $method => $regexToRoutesMap) { $chunkSize = $this->computeChunkSize(count($regexToRoutesMap)); $chunks = array_chunk($regexToRoutesMap, $chunkSize, true); - $data[$method] = array_map([$this, 'processChunk'], $chunks); + $data[$method] = array_map([$this, 'processChunk'], $chunks); } return $data; } - private function computeChunkSize($count) { + /** + * @param int + * @return int + */ + private function computeChunkSize($count) + { $numParts = max(1, round($count / $this->getApproxChunkSize())); - return ceil($count / $numParts); + return (int) ceil($count / $numParts); } - private function isStaticRoute($routeData) { + /** + * @param mixed[] + * @return bool + */ + private function isStaticRoute($routeData) + { return count($routeData) === 1 && is_string($routeData[0]); } - private function addStaticRoute($httpMethod, $routeData, $handler) { + private function addStaticRoute($httpMethod, $routeData, $handler) + { $routeStr = $routeData[0]; if (isset($this->staticRoutes[$httpMethod][$routeStr])) { @@ -72,7 +103,8 @@ abstract class RegexBasedAbstract implements DataGenerator { $this->staticRoutes[$httpMethod][$routeStr] = $handler; } - private function addVariableRoute($httpMethod, $routeData, $handler) { + private function addVariableRoute($httpMethod, $routeData, $handler) + { list($regex, $variables) = $this->buildRegexForRoute($routeData); if (isset($this->methodToRegexToRoutesMap[$httpMethod][$regex])) { @@ -87,7 +119,12 @@ abstract class RegexBasedAbstract implements DataGenerator { ); } - private function buildRegexForRoute($routeData) { + /** + * @param mixed[] + * @return mixed[] + */ + private function buildRegexForRoute($routeData) + { $regex = ''; $variables = []; foreach ($routeData as $part) { @@ -118,14 +155,19 @@ abstract class RegexBasedAbstract implements DataGenerator { return [$regex, $variables]; } - private function regexHasCapturingGroups($regex) { + /** + * @param string + * @return bool + */ + private function regexHasCapturingGroups($regex) + { if (false === strpos($regex, '(')) { // Needs to have at least a ( to contain a capturing group return false; } // Semi-accurate detection for capturing groups - return preg_match( + return (bool) preg_match( '~ (?: \(\?\( diff --git a/system/vendor/nikic/fast-route/src/Dispatcher.php b/system/vendor/nikic/fast-route/src/Dispatcher.php index ea98009..4ae72a3 100644 --- a/system/vendor/nikic/fast-route/src/Dispatcher.php +++ b/system/vendor/nikic/fast-route/src/Dispatcher.php @@ -2,7 +2,8 @@ namespace FastRoute; -interface Dispatcher { +interface Dispatcher +{ const NOT_FOUND = 0; const FOUND = 1; const METHOD_NOT_ALLOWED = 2; diff --git a/system/vendor/nikic/fast-route/src/Dispatcher/CharCountBased.php b/system/vendor/nikic/fast-route/src/Dispatcher/CharCountBased.php index 22ba240..ef1eec1 100644 --- a/system/vendor/nikic/fast-route/src/Dispatcher/CharCountBased.php +++ b/system/vendor/nikic/fast-route/src/Dispatcher/CharCountBased.php @@ -2,12 +2,15 @@ namespace FastRoute\Dispatcher; -class CharCountBased extends RegexBasedAbstract { - public function __construct($data) { +class CharCountBased extends RegexBasedAbstract +{ + public function __construct($data) + { list($this->staticRouteMap, $this->variableRouteData) = $data; } - protected function dispatchVariableRoute($routeData, $uri) { + protected function dispatchVariableRoute($routeData, $uri) + { foreach ($routeData as $data) { if (!preg_match($data['regex'], $uri . $data['suffix'], $matches)) { continue; diff --git a/system/vendor/nikic/fast-route/src/Dispatcher/GroupCountBased.php b/system/vendor/nikic/fast-route/src/Dispatcher/GroupCountBased.php index 0abd322..493e7a9 100644 --- a/system/vendor/nikic/fast-route/src/Dispatcher/GroupCountBased.php +++ b/system/vendor/nikic/fast-route/src/Dispatcher/GroupCountBased.php @@ -2,12 +2,15 @@ namespace FastRoute\Dispatcher; -class GroupCountBased extends RegexBasedAbstract { - public function __construct($data) { +class GroupCountBased extends RegexBasedAbstract +{ + public function __construct($data) + { list($this->staticRouteMap, $this->variableRouteData) = $data; } - protected function dispatchVariableRoute($routeData, $uri) { + protected function dispatchVariableRoute($routeData, $uri) + { foreach ($routeData as $data) { if (!preg_match($data['regex'], $uri, $matches)) { continue; diff --git a/system/vendor/nikic/fast-route/src/Dispatcher/GroupPosBased.php b/system/vendor/nikic/fast-route/src/Dispatcher/GroupPosBased.php index 32227d4..498220e 100644 --- a/system/vendor/nikic/fast-route/src/Dispatcher/GroupPosBased.php +++ b/system/vendor/nikic/fast-route/src/Dispatcher/GroupPosBased.php @@ -2,12 +2,15 @@ namespace FastRoute\Dispatcher; -class GroupPosBased extends RegexBasedAbstract { - public function __construct($data) { +class GroupPosBased extends RegexBasedAbstract +{ + public function __construct($data) + { list($this->staticRouteMap, $this->variableRouteData) = $data; } - protected function dispatchVariableRoute($routeData, $uri) { + protected function dispatchVariableRoute($routeData, $uri) + { foreach ($routeData as $data) { if (!preg_match($data['regex'], $uri, $matches)) { continue; diff --git a/system/vendor/nikic/fast-route/src/Dispatcher/MarkBased.php b/system/vendor/nikic/fast-route/src/Dispatcher/MarkBased.php index fefa711..22eb09b 100644 --- a/system/vendor/nikic/fast-route/src/Dispatcher/MarkBased.php +++ b/system/vendor/nikic/fast-route/src/Dispatcher/MarkBased.php @@ -2,12 +2,15 @@ namespace FastRoute\Dispatcher; -class MarkBased extends RegexBasedAbstract { - public function __construct($data) { +class MarkBased extends RegexBasedAbstract +{ + public function __construct($data) + { list($this->staticRouteMap, $this->variableRouteData) = $data; } - protected function dispatchVariableRoute($routeData, $uri) { + protected function dispatchVariableRoute($routeData, $uri) + { foreach ($routeData as $data) { if (!preg_match($data['regex'], $uri, $matches)) { continue; diff --git a/system/vendor/nikic/fast-route/src/Dispatcher/RegexBasedAbstract.php b/system/vendor/nikic/fast-route/src/Dispatcher/RegexBasedAbstract.php index 8823b9b..206e879 100644 --- a/system/vendor/nikic/fast-route/src/Dispatcher/RegexBasedAbstract.php +++ b/system/vendor/nikic/fast-route/src/Dispatcher/RegexBasedAbstract.php @@ -4,13 +4,21 @@ namespace FastRoute\Dispatcher; use FastRoute\Dispatcher; -abstract class RegexBasedAbstract implements Dispatcher { - protected $staticRouteMap; - protected $variableRouteData; +abstract class RegexBasedAbstract implements Dispatcher +{ + /** @var mixed[][] */ + protected $staticRouteMap = []; - protected abstract function dispatchVariableRoute($routeData, $uri); + /** @var mixed[] */ + protected $variableRouteData = []; - public function dispatch($httpMethod, $uri) { + /** + * @return mixed[] + */ + abstract protected function dispatchVariableRoute($routeData, $uri); + + public function dispatch($httpMethod, $uri) + { if (isset($this->staticRouteMap[$httpMethod][$uri])) { $handler = $this->staticRouteMap[$httpMethod][$uri]; return [self::FOUND, $handler, []]; @@ -73,8 +81,8 @@ abstract class RegexBasedAbstract implements Dispatcher { // If there are no allowed methods the route simply does not exist if ($allowedMethods) { return [self::METHOD_NOT_ALLOWED, $allowedMethods]; - } else { - return [self::NOT_FOUND]; } + + return [self::NOT_FOUND]; } } diff --git a/system/vendor/nikic/fast-route/src/Route.php b/system/vendor/nikic/fast-route/src/Route.php index d71ded1..e1bf7dd 100644 --- a/system/vendor/nikic/fast-route/src/Route.php +++ b/system/vendor/nikic/fast-route/src/Route.php @@ -2,10 +2,18 @@ namespace FastRoute; -class Route { +class Route +{ + /** @var string */ public $httpMethod; + + /** @var string */ public $regex; + + /** @var array */ public $variables; + + /** @var mixed */ public $handler; /** @@ -16,7 +24,8 @@ class Route { * @param string $regex * @param array $variables */ - public function __construct($httpMethod, $handler, $regex, $variables) { + public function __construct($httpMethod, $handler, $regex, $variables) + { $this->httpMethod = $httpMethod; $this->handler = $handler; $this->regex = $regex; @@ -30,9 +39,9 @@ class Route { * * @return bool */ - public function matches($str) { + public function matches($str) + { $regex = '~^' . $this->regex . '$~'; return (bool) preg_match($regex, $str); } } - diff --git a/system/vendor/nikic/fast-route/src/RouteCollector.php b/system/vendor/nikic/fast-route/src/RouteCollector.php index 7d7667b..c1c1762 100644 --- a/system/vendor/nikic/fast-route/src/RouteCollector.php +++ b/system/vendor/nikic/fast-route/src/RouteCollector.php @@ -2,9 +2,15 @@ namespace FastRoute; -class RouteCollector { +class RouteCollector +{ + /** @var RouteParser */ protected $routeParser; + + /** @var DataGenerator */ protected $dataGenerator; + + /** @var string */ protected $currentGroupPrefix; /** @@ -13,7 +19,8 @@ class RouteCollector { * @param RouteParser $routeParser * @param DataGenerator $dataGenerator */ - public function __construct(RouteParser $routeParser, DataGenerator $dataGenerator) { + public function __construct(RouteParser $routeParser, DataGenerator $dataGenerator) + { $this->routeParser = $routeParser; $this->dataGenerator = $dataGenerator; $this->currentGroupPrefix = ''; @@ -28,7 +35,8 @@ class RouteCollector { * @param string $route * @param mixed $handler */ - public function addRoute($httpMethod, $route, $handler) { + public function addRoute($httpMethod, $route, $handler) + { $route = $this->currentGroupPrefix . $route; $routeDatas = $this->routeParser->parse($route); foreach ((array) $httpMethod as $method) { @@ -46,13 +54,14 @@ class RouteCollector { * @param string $prefix * @param callable $callback */ - public function addGroup($prefix, callable $callback) { + public function addGroup($prefix, callable $callback) + { $previousGroupPrefix = $this->currentGroupPrefix; $this->currentGroupPrefix = $previousGroupPrefix . $prefix; $callback($this); $this->currentGroupPrefix = $previousGroupPrefix; } - + /** * Adds a GET route to the collection * @@ -61,10 +70,11 @@ class RouteCollector { * @param string $route * @param mixed $handler */ - public function get($route, $handler) { + public function get($route, $handler) + { $this->addRoute('GET', $route, $handler); } - + /** * Adds a POST route to the collection * @@ -73,10 +83,11 @@ class RouteCollector { * @param string $route * @param mixed $handler */ - public function post($route, $handler) { + public function post($route, $handler) + { $this->addRoute('POST', $route, $handler); } - + /** * Adds a PUT route to the collection * @@ -85,10 +96,11 @@ class RouteCollector { * @param string $route * @param mixed $handler */ - public function put($route, $handler) { + public function put($route, $handler) + { $this->addRoute('PUT', $route, $handler); } - + /** * Adds a DELETE route to the collection * @@ -97,10 +109,11 @@ class RouteCollector { * @param string $route * @param mixed $handler */ - public function delete($route, $handler) { + public function delete($route, $handler) + { $this->addRoute('DELETE', $route, $handler); } - + /** * Adds a PATCH route to the collection * @@ -109,7 +122,8 @@ class RouteCollector { * @param string $route * @param mixed $handler */ - public function patch($route, $handler) { + public function patch($route, $handler) + { $this->addRoute('PATCH', $route, $handler); } @@ -121,7 +135,8 @@ class RouteCollector { * @param string $route * @param mixed $handler */ - public function head($route, $handler) { + public function head($route, $handler) + { $this->addRoute('HEAD', $route, $handler); } @@ -130,7 +145,8 @@ class RouteCollector { * * @return array */ - public function getData() { + public function getData() + { return $this->dataGenerator->getData(); } } diff --git a/system/vendor/nikic/fast-route/src/RouteParser.php b/system/vendor/nikic/fast-route/src/RouteParser.php index c089c31..6a7685c 100644 --- a/system/vendor/nikic/fast-route/src/RouteParser.php +++ b/system/vendor/nikic/fast-route/src/RouteParser.php @@ -2,7 +2,8 @@ namespace FastRoute; -interface RouteParser { +interface RouteParser +{ /** * Parses a route string into multiple route data arrays. * @@ -29,7 +30,7 @@ interface RouteParser { * Here one route string was converted into two route data arrays. * * @param string $route Route string to parse - * + * * @return mixed[][] Array of route data arrays */ public function parse($route); diff --git a/system/vendor/nikic/fast-route/src/RouteParser/Std.php b/system/vendor/nikic/fast-route/src/RouteParser/Std.php index a6c21bd..4fbdee1 100644 --- a/system/vendor/nikic/fast-route/src/RouteParser/Std.php +++ b/system/vendor/nikic/fast-route/src/RouteParser/Std.php @@ -10,7 +10,8 @@ use FastRoute\RouteParser; * * "/user/{name}[/{id:[0-9]+}]" */ -class Std implements RouteParser { +class Std implements RouteParser +{ const VARIABLE_REGEX = <<<'REGEX' \{ \s* ([a-zA-Z_][a-zA-Z0-9_-]*) \s* @@ -21,7 +22,8 @@ class Std implements RouteParser { REGEX; const DEFAULT_DISPATCH_REGEX = '[^/]+'; - public function parse($route) { + public function parse($route) + { $routeWithoutClosingOptionals = rtrim($route, ']'); $numOptionals = strlen($route) - strlen($routeWithoutClosingOptionals); @@ -30,7 +32,7 @@ REGEX; if ($numOptionals !== count($segments) - 1) { // If there are any ] in the middle of the route, throw a more specific error message if (preg_match('~' . self::VARIABLE_REGEX . '(*SKIP)(*F) | \]~x', $routeWithoutClosingOptionals)) { - throw new BadRouteException("Optional segments can only occur at the end of a route"); + throw new BadRouteException('Optional segments can only occur at the end of a route'); } throw new BadRouteException("Number of opening '[' and closing ']' does not match"); } @@ -39,7 +41,7 @@ REGEX; $routeDatas = []; foreach ($segments as $n => $segment) { if ($segment === '' && $n !== 0) { - throw new BadRouteException("Empty optional part"); + throw new BadRouteException('Empty optional part'); } $currentRoute .= $segment; @@ -50,8 +52,12 @@ REGEX; /** * Parses a route string that does not contain optional segments. + * + * @param string + * @return mixed[] */ - private function parsePlaceholders($route) { + private function parsePlaceholders($route) + { if (!preg_match_all( '~' . self::VARIABLE_REGEX . '~x', $route, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER @@ -72,7 +78,7 @@ REGEX; $offset = $set[0][1] + strlen($set[0][0]); } - if ($offset != strlen($route)) { + if ($offset !== strlen($route)) { $routeData[] = substr($route, $offset); } diff --git a/system/vendor/nikic/fast-route/src/bootstrap.php b/system/vendor/nikic/fast-route/src/bootstrap.php index add216c..0bce3a4 100644 --- a/system/vendor/nikic/fast-route/src/bootstrap.php +++ b/system/vendor/nikic/fast-route/src/bootstrap.php @@ -4,7 +4,7 @@ namespace FastRoute; require __DIR__ . '/functions.php'; -spl_autoload_register(function($class) { +spl_autoload_register(function ($class) { if (strpos($class, 'FastRoute\\') === 0) { $name = substr($class, strlen('FastRoute')); require __DIR__ . strtr($name, '\\', DIRECTORY_SEPARATOR) . '.php'; diff --git a/system/vendor/nikic/fast-route/src/functions.php b/system/vendor/nikic/fast-route/src/functions.php index 46bc805..876a5d9 100644 --- a/system/vendor/nikic/fast-route/src/functions.php +++ b/system/vendor/nikic/fast-route/src/functions.php @@ -9,7 +9,8 @@ if (!function_exists('FastRoute\simpleDispatcher')) { * * @return Dispatcher */ - function simpleDispatcher(callable $routeDefinitionCallback, array $options = []) { + function simpleDispatcher(callable $routeDefinitionCallback, array $options = []) + { $options += [ 'routeParser' => 'FastRoute\\RouteParser\\Std', 'dataGenerator' => 'FastRoute\\DataGenerator\\GroupCountBased', @@ -32,7 +33,8 @@ if (!function_exists('FastRoute\simpleDispatcher')) { * * @return Dispatcher */ - function cachedDispatcher(callable $routeDefinitionCallback, array $options = []) { + function cachedDispatcher(callable $routeDefinitionCallback, array $options = []) + { $options += [ 'routeParser' => 'FastRoute\\RouteParser\\Std', 'dataGenerator' => 'FastRoute\\DataGenerator\\GroupCountBased', diff --git a/system/vendor/nikic/fast-route/test/Dispatcher/CharCountBasedTest.php b/system/vendor/nikic/fast-route/test/Dispatcher/CharCountBasedTest.php index 8168498..e15ff8b 100644 --- a/system/vendor/nikic/fast-route/test/Dispatcher/CharCountBasedTest.php +++ b/system/vendor/nikic/fast-route/test/Dispatcher/CharCountBasedTest.php @@ -2,12 +2,15 @@ namespace FastRoute\Dispatcher; -class CharCountBasedTest extends DispatcherTest { - protected function getDispatcherClass() { +class CharCountBasedTest extends DispatcherTest +{ + protected function getDispatcherClass() + { return 'FastRoute\\Dispatcher\\CharCountBased'; } - protected function getDataGeneratorClass() { + protected function getDataGeneratorClass() + { return 'FastRoute\\DataGenerator\\CharCountBased'; } } diff --git a/system/vendor/nikic/fast-route/test/Dispatcher/DispatcherTest.php b/system/vendor/nikic/fast-route/test/Dispatcher/DispatcherTest.php index a6d6205..c2edf8c 100644 --- a/system/vendor/nikic/fast-route/test/Dispatcher/DispatcherTest.php +++ b/system/vendor/nikic/fast-route/test/Dispatcher/DispatcherTest.php @@ -3,9 +3,10 @@ namespace FastRoute\Dispatcher; use FastRoute\RouteCollector; +use PHPUnit\Framework\TestCase; -abstract class DispatcherTest extends \PHPUnit_Framework_TestCase { - +abstract class DispatcherTest extends TestCase +{ /** * Delegate dispatcher selection to child test classes */ @@ -19,7 +20,8 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase { /** * Set appropriate options for the specific Dispatcher class we're testing */ - private function generateDispatcherOptions() { + private function generateDispatcherOptions() + { return [ 'dataGenerator' => $this->getDataGeneratorClass(), 'dispatcher' => $this->getDispatcherClass() @@ -29,7 +31,8 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase { /** * @dataProvider provideFoundDispatchCases */ - public function testFoundDispatches($method, $uri, $callback, $handler, $argDict) { + public function testFoundDispatches($method, $uri, $callback, $handler, $argDict) + { $dispatcher = \FastRoute\simpleDispatcher($callback, $this->generateDispatcherOptions()); $info = $dispatcher->dispatch($method, $uri); $this->assertSame($dispatcher::FOUND, $info[0]); @@ -40,11 +43,12 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase { /** * @dataProvider provideNotFoundDispatchCases */ - public function testNotFoundDispatches($method, $uri, $callback) { + public function testNotFoundDispatches($method, $uri, $callback) + { $dispatcher = \FastRoute\simpleDispatcher($callback, $this->generateDispatcherOptions()); $routeInfo = $dispatcher->dispatch($method, $uri); - $this->assertFalse(isset($routeInfo[1]), - "NOT_FOUND result must only contain a single element in the returned info array" + $this->assertArrayNotHasKey(1, $routeInfo, + 'NOT_FOUND result must only contain a single element in the returned info array' ); $this->assertSame($dispatcher::NOT_FOUND, $routeInfo[0]); } @@ -52,11 +56,12 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase { /** * @dataProvider provideMethodNotAllowedDispatchCases */ - public function testMethodNotAllowedDispatches($method, $uri, $callback, $availableMethods) { + public function testMethodNotAllowedDispatches($method, $uri, $callback, $availableMethods) + { $dispatcher = \FastRoute\simpleDispatcher($callback, $this->generateDispatcherOptions()); $routeInfo = $dispatcher->dispatch($method, $uri); - $this->assertTrue(isset($routeInfo[1]), - "METHOD_NOT_ALLOWED result must return an array of allowed methods at index 1" + $this->assertArrayHasKey(1, $routeInfo, + 'METHOD_NOT_ALLOWED result must return an array of allowed methods at index 1' ); list($routedStatus, $methodArray) = $dispatcher->dispatch($method, $uri); @@ -68,8 +73,9 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase { * @expectedException \FastRoute\BadRouteException * @expectedExceptionMessage Cannot use the same placeholder "test" twice */ - public function testDuplicateVariableNameError() { - \FastRoute\simpleDispatcher(function(RouteCollector $r) { + public function testDuplicateVariableNameError() + { + \FastRoute\simpleDispatcher(function (RouteCollector $r) { $r->addRoute('GET', '/foo/{test}/{test:\d+}', 'handler0'); }, $this->generateDispatcherOptions()); } @@ -78,8 +84,9 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase { * @expectedException \FastRoute\BadRouteException * @expectedExceptionMessage Cannot register two routes matching "/user/([^/]+)" for method "GET" */ - public function testDuplicateVariableRoute() { - \FastRoute\simpleDispatcher(function(RouteCollector $r) { + public function testDuplicateVariableRoute() + { + \FastRoute\simpleDispatcher(function (RouteCollector $r) { $r->addRoute('GET', '/user/{id}', 'handler0'); // oops, forgot \d+ restriction ;) $r->addRoute('GET', '/user/{name}', 'handler1'); }, $this->generateDispatcherOptions()); @@ -89,8 +96,9 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase { * @expectedException \FastRoute\BadRouteException * @expectedExceptionMessage Cannot register two routes matching "/user" for method "GET" */ - public function testDuplicateStaticRoute() { - \FastRoute\simpleDispatcher(function(RouteCollector $r) { + public function testDuplicateStaticRoute() + { + \FastRoute\simpleDispatcher(function (RouteCollector $r) { $r->addRoute('GET', '/user', 'handler0'); $r->addRoute('GET', '/user', 'handler1'); }, $this->generateDispatcherOptions()); @@ -100,8 +108,9 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase { * @expectedException \FastRoute\BadRouteException * @expectedExceptionMessage Static route "/user/nikic" is shadowed by previously defined variable route "/user/([^/]+)" for method "GET" */ - public function testShadowedStaticRoute() { - \FastRoute\simpleDispatcher(function(RouteCollector $r) { + public function testShadowedStaticRoute() + { + \FastRoute\simpleDispatcher(function (RouteCollector $r) { $r->addRoute('GET', '/user/{name}', 'handler0'); $r->addRoute('GET', '/user/nikic', 'handler1'); }, $this->generateDispatcherOptions()); @@ -111,18 +120,20 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase { * @expectedException \FastRoute\BadRouteException * @expectedExceptionMessage Regex "(en|de)" for parameter "lang" contains a capturing group */ - public function testCapturing() { - \FastRoute\simpleDispatcher(function(RouteCollector $r) { + public function testCapturing() + { + \FastRoute\simpleDispatcher(function (RouteCollector $r) { $r->addRoute('GET', '/{lang:(en|de)}', 'handler0'); }, $this->generateDispatcherOptions()); } - public function provideFoundDispatchCases() { + public function provideFoundDispatchCases() + { $cases = []; // 0 --------------------------------------------------------------------------------------> - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('GET', '/resource/123/456', 'handler0'); }; @@ -135,7 +146,7 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase { // 1 --------------------------------------------------------------------------------------> - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('GET', '/handler0', 'handler0'); $r->addRoute('GET', '/handler1', 'handler1'); $r->addRoute('GET', '/handler2', 'handler2'); @@ -150,7 +161,7 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase { // 2 --------------------------------------------------------------------------------------> - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('GET', '/user/{name}/{id:[0-9]+}', 'handler0'); $r->addRoute('GET', '/user/{id:[0-9]+}', 'handler1'); $r->addRoute('GET', '/user/{name}', 'handler2'); @@ -198,11 +209,10 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase { // 6 --------------------------------------------------------------------------------------> - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('GET', '/user/{id:[0-9]+}', 'handler0'); $r->addRoute('GET', '/user/12345/extension', 'handler1'); $r->addRoute('GET', '/user/{id:[0-9]+}.{extension}', 'handler2'); - }; $method = 'GET'; @@ -214,7 +224,7 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase { // 7 ----- Test GET method fallback on HEAD route miss ------------------------------------> - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('GET', '/user/{name}', 'handler0'); $r->addRoute('GET', '/user/{name}/{id:[0-9]+}', 'handler1'); $r->addRoute('GET', '/static0', 'handler2'); @@ -264,7 +274,7 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase { // 11 ---- More specified routes are not shadowed by less specific of another method ------> - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('GET', '/user/{name}', 'handler0'); $r->addRoute('POST', '/user/{name:[a-z]+}', 'handler1'); }; @@ -278,7 +288,7 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase { // 12 ---- Handler of more specific routes is used, if it occurs first --------------------> - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('GET', '/user/{name}', 'handler0'); $r->addRoute('POST', '/user/{name:[a-z]+}', 'handler1'); $r->addRoute('POST', '/user/{name}', 'handler2'); @@ -293,7 +303,7 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase { // 13 ---- Route with constant suffix -----------------------------------------------------> - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('GET', '/user/{name}', 'handler0'); $r->addRoute('GET', '/user/{name}/edit', 'handler1'); }; @@ -307,7 +317,7 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase { // 14 ---- Handle multiple methods with the same handler ----------------------------------> - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute(['GET', 'POST'], '/user', 'handlerGetPost'); $r->addRoute(['DELETE'], '/user', 'handlerDelete'); $r->addRoute([], '/user', 'handlerNone'); @@ -318,53 +328,53 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase { $cases[] = ['POST', '/user', $callback, 'handlerGetPost', $argDict]; $cases[] = ['DELETE', '/user', $callback, 'handlerDelete', $argDict]; - // 15 ---- + // 17 ---- - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('POST', '/user.json', 'handler0'); $r->addRoute('GET', '/{entity}.json', 'handler1'); }; $cases[] = ['GET', '/user.json', $callback, 'handler1', ['entity' => 'user']]; - // 16 ---- + // 18 ---- - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('GET', '', 'handler0'); }; $cases[] = ['GET', '', $callback, 'handler0', []]; - // 17 ---- + // 19 ---- - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('HEAD', '/a/{foo}', 'handler0'); $r->addRoute('GET', '/b/{foo}', 'handler1'); }; $cases[] = ['HEAD', '/b/bar', $callback, 'handler1', ['foo' => 'bar']]; - // 18 ---- + // 20 ---- - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('HEAD', '/a', 'handler0'); $r->addRoute('GET', '/b', 'handler1'); }; $cases[] = ['HEAD', '/b', $callback, 'handler1', []]; - // 19 ---- + // 21 ---- - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('GET', '/foo', 'handler0'); $r->addRoute('HEAD', '/{bar}', 'handler1'); }; $cases[] = ['HEAD', '/foo', $callback, 'handler1', ['bar' => 'foo']]; - // 20 ---- + // 22 ---- - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('*', '/user', 'handler0'); $r->addRoute('*', '/{user}', 'handler1'); $r->addRoute('GET', '/user', 'handler2'); @@ -372,39 +382,49 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase { $cases[] = ['GET', '/user', $callback, 'handler2', []]; - // 21 ---- + // 23 ---- - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('*', '/user', 'handler0'); $r->addRoute('GET', '/user', 'handler1'); }; $cases[] = ['POST', '/user', $callback, 'handler0', []]; - // 22 ---- + // 24 ---- $cases[] = ['HEAD', '/user', $callback, 'handler1', []]; - // 23 ---- + // 25 ---- - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('GET', '/{bar}', 'handler0'); $r->addRoute('*', '/foo', 'handler1'); }; $cases[] = ['GET', '/foo', $callback, 'handler0', ['bar' => 'foo']]; + // 26 ---- + + $callback = function(RouteCollector $r) { + $r->addRoute('GET', '/user', 'handler0'); + $r->addRoute('*', '/{foo:.*}', 'handler1'); + }; + + $cases[] = ['POST', '/bar', $callback, 'handler1', ['foo' => 'bar']]; + // x --------------------------------------------------------------------------------------> return $cases; } - public function provideNotFoundDispatchCases() { + public function provideNotFoundDispatchCases() + { $cases = []; // 0 --------------------------------------------------------------------------------------> - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('GET', '/resource/123/456', 'handler0'); }; @@ -431,7 +451,7 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase { // 3 --------------------------------------------------------------------------------------> - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('GET', '/handler0', 'handler0'); $r->addRoute('GET', '/handler1', 'handler1'); $r->addRoute('GET', '/handler2', 'handler2'); @@ -444,7 +464,7 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase { // 4 --------------------------------------------------------------------------------------> - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('GET', '/user/{name}/{id:[0-9]+}', 'handler0'); $r->addRoute('GET', '/user/{id:[0-9]+}', 'handler1'); $r->addRoute('GET', '/user/{name}', 'handler2'); @@ -468,19 +488,20 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase { // reuse callback from #5 $method = 'HEAD'; - $cases[] = array($method, $uri, $callback); + $cases[] = [$method, $uri, $callback]; // x --------------------------------------------------------------------------------------> return $cases; } - public function provideMethodNotAllowedDispatchCases() { + public function provideMethodNotAllowedDispatchCases() + { $cases = []; // 0 --------------------------------------------------------------------------------------> - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('GET', '/resource/123/456', 'handler0'); }; @@ -492,7 +513,7 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase { // 1 --------------------------------------------------------------------------------------> - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('GET', '/resource/123/456', 'handler0'); $r->addRoute('POST', '/resource/123/456', 'handler1'); $r->addRoute('PUT', '/resource/123/456', 'handler2'); @@ -507,7 +528,7 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase { // 2 --------------------------------------------------------------------------------------> - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('GET', '/user/{name}/{id:[0-9]+}', 'handler0'); $r->addRoute('POST', '/user/{name}/{id:[0-9]+}', 'handler1'); $r->addRoute('PUT', '/user/{name}/{id:[0-9]+}', 'handler2'); @@ -522,7 +543,7 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase { // 3 --------------------------------------------------------------------------------------> - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('POST', '/user/{name}', 'handler1'); $r->addRoute('PUT', '/user/{name:[a-z]+}', 'handler2'); $r->addRoute('PATCH', '/user/{name:[a-z]+}', 'handler3'); @@ -536,7 +557,7 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase { // 4 --------------------------------------------------------------------------------------> - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute(['GET', 'POST'], '/user', 'handlerGetPost'); $r->addRoute(['DELETE'], '/user', 'handlerDelete'); $r->addRoute([], '/user', 'handlerNone'); @@ -546,7 +567,7 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase { // 5 - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('POST', '/user.json', 'handler0'); $r->addRoute('GET', '/{entity}.json', 'handler1'); }; @@ -557,5 +578,4 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase { return $cases; } - } diff --git a/system/vendor/nikic/fast-route/test/Dispatcher/GroupCountBasedTest.php b/system/vendor/nikic/fast-route/test/Dispatcher/GroupCountBasedTest.php index 74820fc..f821ef5 100644 --- a/system/vendor/nikic/fast-route/test/Dispatcher/GroupCountBasedTest.php +++ b/system/vendor/nikic/fast-route/test/Dispatcher/GroupCountBasedTest.php @@ -2,12 +2,15 @@ namespace FastRoute\Dispatcher; -class GroupCountBasedTest extends DispatcherTest { - protected function getDispatcherClass() { +class GroupCountBasedTest extends DispatcherTest +{ + protected function getDispatcherClass() + { return 'FastRoute\\Dispatcher\\GroupCountBased'; } - protected function getDataGeneratorClass() { + protected function getDataGeneratorClass() + { return 'FastRoute\\DataGenerator\\GroupCountBased'; } } diff --git a/system/vendor/nikic/fast-route/test/Dispatcher/GroupPosBasedTest.php b/system/vendor/nikic/fast-route/test/Dispatcher/GroupPosBasedTest.php index c3d4f8d..b5c9567 100644 --- a/system/vendor/nikic/fast-route/test/Dispatcher/GroupPosBasedTest.php +++ b/system/vendor/nikic/fast-route/test/Dispatcher/GroupPosBasedTest.php @@ -2,12 +2,15 @@ namespace FastRoute\Dispatcher; -class GroupPosBasedTest extends DispatcherTest { - protected function getDispatcherClass() { +class GroupPosBasedTest extends DispatcherTest +{ + protected function getDispatcherClass() + { return 'FastRoute\\Dispatcher\\GroupPosBased'; } - protected function getDataGeneratorClass() { + protected function getDataGeneratorClass() + { return 'FastRoute\\DataGenerator\\GroupPosBased'; } } diff --git a/system/vendor/nikic/fast-route/test/Dispatcher/MarkBasedTest.php b/system/vendor/nikic/fast-route/test/Dispatcher/MarkBasedTest.php index 04b0af9..b3b27dd 100644 --- a/system/vendor/nikic/fast-route/test/Dispatcher/MarkBasedTest.php +++ b/system/vendor/nikic/fast-route/test/Dispatcher/MarkBasedTest.php @@ -2,19 +2,23 @@ namespace FastRoute\Dispatcher; -class MarkBasedTest extends DispatcherTest { - public function setUp() { +class MarkBasedTest extends DispatcherTest +{ + public function setUp() + { preg_match('/(*MARK:A)a/', 'a', $matches); if (!isset($matches['MARK'])) { $this->markTestSkipped('PHP 5.6 required for MARK support'); } } - protected function getDispatcherClass() { + protected function getDispatcherClass() + { return 'FastRoute\\Dispatcher\\MarkBased'; } - protected function getDataGeneratorClass() { + protected function getDataGeneratorClass() + { return 'FastRoute\\DataGenerator\\MarkBased'; } } diff --git a/system/vendor/nikic/fast-route/test/HackTypechecker/HackTypecheckerTest.php b/system/vendor/nikic/fast-route/test/HackTypechecker/HackTypecheckerTest.php index 7bc6ebb..b6fc53f 100644 --- a/system/vendor/nikic/fast-route/test/HackTypechecker/HackTypecheckerTest.php +++ b/system/vendor/nikic/fast-route/test/HackTypechecker/HackTypecheckerTest.php @@ -2,11 +2,16 @@ namespace FastRoute; -class HackTypecheckerTest extends \PhpUnit_Framework_TestCase { +use PHPUnit\Framework\TestCase; + +class HackTypecheckerTest extends TestCase +{ const SERVER_ALREADY_RUNNING_CODE = 77; - public function testTypechecks($recurse = true) { + + public function testTypechecks($recurse = true) + { if (!defined('HHVM_VERSION')) { - $this->markTestSkipped("HHVM only"); + $this->markTestSkipped('HHVM only'); } if (!version_compare(HHVM_VERSION, '3.9.0', '>=')) { $this->markTestSkipped('classname requires HHVM 3.9+'); @@ -15,17 +20,17 @@ class HackTypecheckerTest extends \PhpUnit_Framework_TestCase { // The typechecker recurses the whole tree, so it makes sure // that everything in fixtures/ is valid when this runs. - $output = array(); + $output = []; $exit_code = null; exec( - 'hh_server --check '.escapeshellarg(__DIR__.'/../../').' 2>&1', + 'hh_server --check ' . escapeshellarg(__DIR__ . '/../../') . ' 2>&1', $output, $exit_code ); if ($exit_code === self::SERVER_ALREADY_RUNNING_CODE) { $this->assertTrue( $recurse, - "Typechecker still running after running hh_client stop" + 'Typechecker still running after running hh_client stop' ); // Server already running - 3.10 => 3.11 regression: // https://github.com/facebook/hhvm/issues/6646 diff --git a/system/vendor/nikic/fast-route/test/RouteCollectorTest.php b/system/vendor/nikic/fast-route/test/RouteCollectorTest.php index 11bcf1c..cc54407 100644 --- a/system/vendor/nikic/fast-route/test/RouteCollectorTest.php +++ b/system/vendor/nikic/fast-route/test/RouteCollectorTest.php @@ -2,8 +2,12 @@ namespace FastRoute; -class RouteCollectorTest extends \PHPUnit_Framework_TestCase { - public function testShortcuts() { +use PHPUnit\Framework\TestCase; + +class RouteCollectorTest extends TestCase +{ + public function testShortcuts() + { $r = new DummyRouteCollector(); $r->delete('/delete', 'delete'); @@ -25,7 +29,8 @@ class RouteCollectorTest extends \PHPUnit_Framework_TestCase { $this->assertSame($expected, $r->routes); } - public function testGroups() { + public function testGroups() + { $r = new DummyRouteCollector(); $r->delete('/delete', 'delete'); @@ -87,11 +92,17 @@ class RouteCollectorTest extends \PHPUnit_Framework_TestCase { } } -class DummyRouteCollector extends RouteCollector { +class DummyRouteCollector extends RouteCollector +{ public $routes = []; - public function __construct() {} - public function addRoute($method, $route, $handler) { + + public function __construct() + { + } + + public function addRoute($method, $route, $handler) + { $route = $this->currentGroupPrefix . $route; $this->routes[] = [$method, $route, $handler]; } -} \ No newline at end of file +} diff --git a/system/vendor/nikic/fast-route/test/RouteParser/StdTest.php b/system/vendor/nikic/fast-route/test/RouteParser/StdTest.php index 41f194b..e13e4de 100644 --- a/system/vendor/nikic/fast-route/test/RouteParser/StdTest.php +++ b/system/vendor/nikic/fast-route/test/RouteParser/StdTest.php @@ -2,22 +2,28 @@ namespace FastRoute\RouteParser; -class StdTest extends \PhpUnit_Framework_TestCase { +use PHPUnit\Framework\TestCase; + +class StdTest extends TestCase +{ /** @dataProvider provideTestParse */ - public function testParse($routeString, $expectedRouteDatas) { + public function testParse($routeString, $expectedRouteDatas) + { $parser = new Std(); $routeDatas = $parser->parse($routeString); $this->assertSame($expectedRouteDatas, $routeDatas); } /** @dataProvider provideTestParseError */ - public function testParseError($routeString, $expectedExceptionMessage) { + public function testParseError($routeString, $expectedExceptionMessage) + { $parser = new Std(); $this->setExpectedException('FastRoute\\BadRouteException', $expectedExceptionMessage); $parser->parse($routeString); } - public function provideTestParse() { + public function provideTestParse() + { return [ [ '/test', @@ -112,7 +118,8 @@ class StdTest extends \PhpUnit_Framework_TestCase { ]; } - public function provideTestParseError() { + public function provideTestParseError() + { return [ [ '/test[opt', @@ -128,19 +135,19 @@ class StdTest extends \PhpUnit_Framework_TestCase { ], [ '/test[]', - "Empty optional part" + 'Empty optional part' ], [ '/test[[opt]]', - "Empty optional part" + 'Empty optional part' ], [ '[[test]]', - "Empty optional part" + 'Empty optional part' ], [ '/test[/opt]/required', - "Optional segments can only occur at the end of a route" + 'Optional segments can only occur at the end of a route' ], ]; } diff --git a/system/vendor/nikic/fast-route/test/bootstrap.php b/system/vendor/nikic/fast-route/test/bootstrap.php index 27e6d4c..3023f41 100644 --- a/system/vendor/nikic/fast-route/test/bootstrap.php +++ b/system/vendor/nikic/fast-route/test/bootstrap.php @@ -2,7 +2,7 @@ require_once __DIR__ . '/../src/functions.php'; -spl_autoload_register(function($class) { +spl_autoload_register(function ($class) { if (strpos($class, 'FastRoute\\') === 0) { $dir = strcasecmp(substr($class, -4), 'Test') ? 'src/' : 'test/'; $name = substr($class, strlen('FastRoute'));