From 13521f8fca0a90c158de25bf7daab935d1190e00 Mon Sep 17 00:00:00 2001 From: Maximilian Anzinger <44003963+MaximilianAnzinger@users.noreply.github.com> Date: Fri, 6 Dec 2024 21:58:15 +0100 Subject: [PATCH] Development: Add development process documentation (#13) --- docs/admin/admin.rst | 2 +- docs/dev/dev.rst | 4 +- .../development-process.rst | 218 ++++++++++++++++++ .../feature-proposal-flow.png | Bin 0 -> 220504 bytes .../dev/development-process/process-model.png | Bin 0 -> 119211 bytes .../dev/development-process/uiux_workflow.png | Bin 0 -> 111421 bytes docs/dev/setup/setup.rst | 7 + docs/dev/system-design/system-design.rst | 23 ++ docs/index.rst | 7 +- docs/user/user.rst | 2 +- 10 files changed, 257 insertions(+), 6 deletions(-) create mode 100644 docs/dev/development-process/development-process.rst create mode 100644 docs/dev/development-process/feature-proposal-flow.png create mode 100644 docs/dev/development-process/process-model.png create mode 100644 docs/dev/development-process/uiux_workflow.png create mode 100644 docs/dev/setup/setup.rst create mode 100644 docs/dev/system-design/system-design.rst diff --git a/docs/admin/admin.rst b/docs/admin/admin.rst index c7913a2..d09db37 100644 --- a/docs/admin/admin.rst +++ b/docs/admin/admin.rst @@ -1,6 +1,6 @@ .. _admin: Admin Guide -================ +=========== General admin guide todo diff --git a/docs/dev/dev.rst b/docs/dev/dev.rst index 8969283..d16ef45 100644 --- a/docs/dev/dev.rst +++ b/docs/dev/dev.rst @@ -1,6 +1,6 @@ .. _dev: Developer Guide -================ +=============== -General dev guide todo +General dev guide todo \ No newline at end of file diff --git a/docs/dev/development-process/development-process.rst b/docs/dev/development-process/development-process.rst new file mode 100644 index 0000000..f77aba2 --- /dev/null +++ b/docs/dev/development-process/development-process.rst @@ -0,0 +1,218 @@ +******************* +Development Process +******************* + + +.. figure:: ./process-model.png + :align: center + :alt: Process Model - Activity Diagram + :figclass: align-center + +1. Submit a Feature Request +=========================== +The initial step in our development process involves the creation of a feature request, which is accomplished through the submission of a GitHub Issue. +This action can be performed by any stakeholder, including developers, users, or maintainers. +The feature request should include a detailed description of the desired functionality, as well as any relevant information that may be useful to the development team. +This information should include the rationale for the feature, the expected benefits, and any potential risks or challenges that may be associated with the implementation of the feature. + +2. Evaluate Feature Request +=========================== +Once a feature request has been submitted, the maintainers will evaluate the request together with the development team to determine its feasibility and potential impact on the system. + +3. Create a Feature Proposal +=============================== +If the feature request is deemed feasible, the development team will create a feature proposal that extensively describes the proposed feature. This step will consist of the artifacts mentioned in the model "Create Feature Proposal" below: + +.. figure:: ./feature-proposal-flow.png + :align: center + :alt: Create a Feature Proposal - Activity Diagram + :figclass: align-center + + +Step 1: Append Feature Proposal Template to Feature Request on GitHub +--------------------------------------------------------------------- +The Feature Proposal Template outlines the structure of the feature proposal and provides a guideline for the development team to follow. + +We have developed a GitHub Action that automatically appends the feature proposal template to the issue description once the issue is tagged with 'needs-feature-proposal.' Additionally, when someone is assigned to such an issue, an instructional comment is automatically added. +This comment reminds the assignee to fill out the feature proposal and provides a link to the relevant documentation for further guidance. + +.. note:: + The GitHub Action will be skipped for issues that are labeled with "bug". + +.. literalinclude:: ../../../.github/ISSUE_TEMPLATE/feature-proposal-developer.md + :caption: Atlas/.github/ISSUE_TEMPLATE/feature-proposal-developer.md + :language: markdown + + +Step 2: Requirements Engineering +-------------------------------- +In this section, the foundation for the feature's development is laid by meticulously defining both functional and non-functional requirements. +Functional requirements detail what the feature will do, covering specific behaviors or functions. +Non-functional requirements, on the other hand, address the feature's operation, such as performance, usability, reliability, and security specifications. + +In the Feature Proposal Template, you can find examples for structuring such functional and non-functional requirements + +Step 3: Analysis +---------------- +Within the analysis section, the emphasis is on understanding and documenting the feature's intended behavior and interactions within the system. +This includes creating an Analysis Object Model, which represents the static structure of the system using class diagrams to identify key entities and their relationships. +Additionally, dynamic aspects of the feature are explored through Activity Diagrams (for workflow representation), State Chart Diagrams (to model the feature's states and transitions), and Communication Diagrams (illustrating how objects interact to achieve the feature's functionality). +These models serve as a blueprint for the development and ensure a shared understanding among all people working on Artemis. + +Step 4: System Architecture +--------------------------- +In this step, the high-level structure of the system supporting the feature is outlined, focusing on analyzing the system components relevant to the implementation of the feature, +subsystem decomposition, interfaces, persistent data management, and security aspects. +The subsystem decomposition process is used to identify the main components of the system and define their responsibilities, which facilitates modular development and maintenance. +It is important to define the interfaces between these subsystems to ensure seamless interaction and integration. +In addition, the development of a comprehensive data model is important for a clear understanding of how data is securely stored, retrieved, and managed within the system, taking into account both logical and physical data perspectives. +Security aspects, especially access control mechanisms, are considered to ensure data integrity and privacy. + +Step 5: UI/UX Design +-------------------- +If the proposed feature requires a change to the software's user interface, this section should include a detailed description of the proposed changes, as well as a mockup that illustrates the new user interface. +The mockup should be created using Figma in conjunction with the [Design System](https://www.figma.com/files/team/1238833580691926997/Artemis) and should be added to the feature proposal as a screenshot. +Furthermore it is important to include a description of the user flow that references the dynamic model created in the analysis section. + +.. figure:: ./uiux_workflow.png + :align: center + :alt: UI/UX Design Workflow - Activity Diagram + :figclass: align-center + +.. raw:: html + +
l@za#qqkouA|W`Y|UtV{f0&H~k%UsRT1dsn~FYEe}8Xepr^l;AW})#Q`M6 zk=rKXdpy{SN@>)(F~~h}^>_40CH3a_`0dV594qj=lIJeQiHfOpGjaX1BYZ2f1ayNx z^#=LG#}Kl9S1vjyss*_Qqd<8*=p}f$L#f9l!4_ojQd;qk1JyC)){VxGHngxce!qpy zPTFSkn^$_DZRg;;CZ>Z3xz=)&^E!efo$;Cg8-wn3j=LvBP2mj4T|0Dz&I&Xh6;Nc_ z5yi;x=6X!a#U0#_gLN;jCh{yeQS$vLQ%-r5;U+@z<=XK+h;!eJUnD=VVmWB{|9JMh zTosNhdgq9coJ(~9+ah=owe=ITZ@^%j0Y)IW&dV~_t1-C$0}sOSOkx)o2T)a%zXXYB zlQ`*i6L2WBG$5q8Ol1bq!%@CeJy5 9O}LxBm~${zr8FUz=57W~e(3N*VZJK~5A> z=Xon9;|?#?GfP#6R(W`oliqn@r@}9J+jAHFzY_ePM)R)h+3ce`uk_qqK1rl5NTZLn zFUN~yffW2@Z_#`_vx0o!mn)Yp?Mvp&)yN6V^~ni@X4O{yme*m-JAN&ZGd6Kwtc@Dc zFr gti3%Zv6yO0Mj#iwA=^UA|-4kDlcZZjW?vx$*(dUdKeNgA;%K zRXE=nHo^3Cel||WFicM@4Yqt?Q!sunSh@9W6wTr(iiXd5zUB9%`Sr+`_WcXB){x0l zTs z*SY=+flR@vmfPgMQtXNE=)*uINM+tH@PYlF6y~>DT^cyNwCf M8p`Rj`u0Z@LSKmp6 qSqZTca1_4{%D 63jK{Gz|(g8@MB zGOu{otWLLuEw9UDe@8bj9~0i)9!MKr>DH(`(LY6NcI-iw;DhRt|02f!v=gtR*Ah8m z6S-w(I6}r=){ijmxO?=wSRVngp1fyi@SA}%WAJAa?VGWk&hLxW_~Ol9YVNfsS)<9| zjRkq#JR4W>{?i(N0&AYwPyAwGQQS7$=hW~qvpta<0E(%h@sTQ9L7a7Ymf*hPg_OJt z5XWH=dg;q=yvK`<|1GZI^$#HFF(mBW!qiamCm7V}>&=et4P6+O8HtYH=t%!}h26i) z9QJb-;O_t~RUDKBL7}p9oI9QcJkfntmFs`Gpa1DCezM|!Njv!IpZcOVBqLq(vbB&` z=5P-7vs GFJ-j$vqmFI0aL;xT^q_B43^N7i7Q zwMnq+9&!@r>kj4PbcSm*U-WBz!pHi1?)+sesPbMw*i_7Cx{<`b>!BbB7@ppG^;-nr zsi+8pQ&ro#n~sE@Y*FBB_q$`SdH*r_x2!T)jG2xr{>~}EgUl2Us}I~g)d2(243EIO zFz&r@;rJb*DrvwVn0o_5g<1kY18n!_{*G^-?|!_hxObAPK1bs2GT$WpcN7Bj(~i)Q zX`r{r`9|B@mKL #;8M#Z`gduEAQD^SR@o~VXxY)I!xQGzKLr) z_ W0dPsL>j7CL3P`8)_VDk#)eVTJ4dB&0<7S55!=Oqg+5i^$|AbHf z(~Up$1FI<| uYCb?>XZ> z+cSIadG7Pv`87QVU)NWw>aDk`)~dz-=lA~$k^U*F)4Jj!DB~RW18vDo#gAw|FHJMM z!T7v$fH&j`%{|wCL6*M+pKmmvd$iRW8NL^I0Lw!x+uxamMjM0-a7~M5pp%Ga!vk9T ze>|-f2Qswqw tPqkqQ=_IMV6V{`=b!0@&? zfSCTj34_Kk7wav(F}T+NIf+lc;LqUWzhD23<8Wz?Tn9`^DuBtHMm9e+kpFi1-_S!d zJM4`kA<2C;7}_`a-+%AVq`f8wJ!CeSWgtb+gN<(edrlD)1_q-UJb6|kUIz>&>ha&e z4H%O5ufhCWZ~q$1&rJ7UgZVFA{{Q<1W5V(&=TliBTTSOL*GD86_nk&L7KG3pfw=S$ zqJk8 14J2%M{6f>ap6+{fLP`)gP0>+U)C&_+$9rV1kWp6#XQ9KB7wkpC5kN= zaYZgxz}T;oO#VOj%fDKsCPeRk5-1^Fg@lY-ww{ERQyQLZQ#eygOFE=9}5 z F`i{`@MrsJe-fA^5(r${GnM9w)c;eu z#0;^r{|t@^fOd5$x_VH*yw>q~9`mLBX9);ZAwa5SzFLG&Z19OUf)b~5i8OfNn ;Vd*UPfD!wu7T0Fvb3(+1^NZnH6^S%mJrp=={Zol}%ds^_oyx}w5 z$3DIW%~6!UX27>)01=Ij6jCA2_!#36zOU3Y;?XbKw-OU93X5tvTbKkh2$sqT2NpeL z;nUg=-jtFF&%;^hFJ^EltY4fh> _;AGhLN@< z$U`>f)n%nTmxuwY>DG{B!wsReX8dAs39XrQ`xh65Ocoa9V7G-YeUJ|b#_R`Ui{pa< z5w?FIf(Z*e&wN`n<`)GdU_P`S8$}JdS|Pk~x6dg>4~cI0bTg#%M|J28GdvJSlz-wC zKlu{Rm-}4W*$k9Ak1@f08rpb~X3q&s5W}81>L7-s5o9_w&5vHs@0t0 W+gF&w+yu8cJI3ioYn}9?vHHswqQnFpo@l Cb=i{{kF(!pIqtka_0})$uor;a7J3dmHWEr9qUL1Woc<0%mj} jQQQ+A8Nb+j`{YmiO?_F zImxw~z}jyrgdAgf0uMYpVD^H*1VPF_)&*eW7uTDB@SX-dta(_O($fqvp?r?Cb4qH6 z33V&@;!KDNems$5Ec>g`z!P$ @H!zJeS}GazCxtXV@{O3Q2dqIPOIx%#qceng8WYElS`aZAZb1 zH9-!OIzO20|3}FU`9_##;v*N@dG8m+qYcUf`I_RB=#=)r1MzwKj}vtvgQ0t<7hDhs zU@C)u|7`EE`im?4AAodE84Si(N14=92r9Pe`A;=*8xF=5;K%lCDxAOOAOr`YwxE_` zr^V{23M+i$4i9YQ424g#KQ`$oX@S@So6bVN_&7pU@Yj4v2qcK>YhD~9B1u8s*My7z zM^I6P1-UW7bLv;0_XgqRTq)CpWY7Z0+9O|d1-}r11lt25IP&4c4)U*1-`@Vk75P{M z3NOMY3gK(OHu2`WYF$_2+u(h_XC#E-I%K7w&1RiuvR~YL?0Fd(pq@5NAxBFNs!}~E z4;+FXDW&}jf&T@_|9PeUg}{Fy@Lvf0bJ+beyZQei1YV656S}&Ei5ov{HT3DE+mI3x za8n?4G pdfsZ{QenM{ws#~_bITzHu0n1_X6O)`7d7ydoKT_ z!~fFZf9dd_@#{Z1%fEE^UpoA6Mc{wOi~ps=|I*=q>F~dF_&<@$(0yerWSF+<9a4_! zC8wymjNAd)i}MxBFU7D69|A`c1I5_`vDJ=K{u`6nYK7v(N{rYuMM`lt|2X%mjizNg zr$>j0x7NoLM+4p6(kqJK27&^ubXQCzCNVcRccq2qi0EC 8fY$ -JYl2m+rEzW# z%rZud>N<>^kBVN%qTx;u$(q+pua^vQ`#k+%@N%=+@!d^K`CF{J^}tscuZ)UinMtjC z6M}Z-;TuFdzm;~k>Zczg?lcl?opTC)(C6Z7uH<&zC^qiNI>j7s{7~TdWW#(pUyrV7 zsL#Yv(b=w&m8PgBeRRdfR-Z|}Mtkg_skzwhJLw$(_KKCwj_j*6?h?@tXLn-Uw!X1g z`0cH7*Nhs|i?VZG*&OYNiDfa}>ouC!b8M9)MH0$GLS|{W4eAnEkSSPqv)BD^W zwF6 $6PdbVa3$F9dK>=5GYEiN13DM+b-N0Lf$)cR@ZUW zf63L|c`jCcW% H`|k8CTzIFE>f)d7(srk+=d~t& z1eD^MA3Brac3=KcWB)Jd-=71YAVrE4lSLyvh5zHV!O{%7Z U|lK zj6^uKM3<1|?$#8@;Txh*St9aoRc%|qj;6q|oHW+1r+w^62#49Cqjd7Ior%`!h7K0< zn^i`YRj#978`W$pzX?{@C|tHu6xnbY61pQ>`si44Ap35=jFnB_tJ5QJPEFD!kR931 zl)GtOh-8mJqOe4>t5>9cEtP~!R4$$(p~Spsh?8OK`w-vYCtW6sWNJQN$}F1hJ2P;& z>-_g6kJRdI9kYs6w+Sq wEhIi`u zhc$l{g=j}1UA8Pi7_*dBykRfvHEQy?^ I6YZ7>vECRRIMGVuVmE6YjpB~q-x3bHb&fUU)WHN$ZN!-^f5Y}lhnKG zQ^L9Tvs(wYX4huiPY+sDDo4dp^N(%`jLot%#|^vAc;!0ou1<}-7J3B--Ob~tRgCtj zV&N1>O0;?cg;xIVq$8*2GeCqRe-{yG6%$H0*vs!-cVBtBKKn>?P)C*GvX#HT|L0FZ zZVxA8F9g<34z`Q%vgNLSSRtaen8%D@X-_9!bYfqKIND%mSW^>o)c3i)s1nV i_mRQQ9a>*{Y@CjQjEBHep3$n5;ag3i~}OTCYRj2if{TO|%h>GyN9W8COy|WBSY6 z(_e9WvU-p54L+vW =H-146RTq0yJBP98+i2@Y7-T&2Ogkt;?i|6zUqR`7u82lTE~8X z*>2ErM%^V>N+^0J)kxP5b=~p28+JiualDhGwtT+w3`=H?_H4n2$=rq@&&58{PGNGN za`Vwjt9RdK#`>pp17PS-{>soj9n;Lk(7pvz)B1!1v!|Ea#r3>b3wXcGE@%7G1&Swc zeYUhHX9^Z8tU4+*>R0kDk5aaJ#IX5@9ODOS>#mm0x?oLRx9?&7Xqle!FE{cPg5)OU zCoN}W@$Gtb+@(dfzU42jhqQ-!pZ{8Z&;Ns4jvDLchSxv^hCk#?Kra8t%}v%*aeZQ# z_vuz!9}kV9Wr#!9-ia3LQSIf^DDF%sS(Xm;ed8|QI~kRw_T6 lBaLlx$( zX{HzS7q>kb72Etaw*EDc-RDf)vae4i>dv72*k~Nh899zZ_42V`i5_-mD$?wV&8y}5 z!5%|W;-c(Tq7G4Z4cgpxmuGW#W#-&=LSax8z=5x*cN 8l-`vb|2O z*xHixwr3oxnn~X)<1*}H{Hs-}=B33&n2 s~2}ZSW}UHj=;HxmgybefM+8w`hI1Kyk>d z=uYcnS7&!;Y@ZbtFZV+bou*&;OxPiPU%VN6X0q_Er9|cM@cH@jp0vdoE%s-16gnk! z(XemAviSN)(9Wr#2<@cTgk8GOyIB)e!VU8#(}Mr$+b(wc)ry@C?My<+_?w(^Mo}s) z^aG^`E+X6QHGZ{vk>! 6z(L&Ce8ie{qUf;t)>#FPeeYA$6IDNti4j@Z|uvC*F* zjAixNH~JSZu9Tx9&9_qGbjcf{A6g_&$?Pv8_ZhUEAG VN;m(LNHn1WVAz6bg x5C9ox_TTt(OCk#j!<{=n2N%^$v>UOlqf^EGu+`baCHF%c@n3 zx=CH8<`z3qC4F)LJ>!$g^`$e2SJs`C_BXjW=|9C-&!wmSdaK+hsglanEXUOMVsfCs z`66t6Jxq6dOSiEloyd*=^rySmXJC|wO3zg)ex9nz8NP|mzTm=`jn4GDwbO~s%h3X6 zD1nLEz3C$hk1;}gS=H0%CD$|C+X=7iM;x2P^*Eih9fw gI1dmUp+ptLt<^Xqe-Y!u{mlySIzG z>AT#Su4~5d64&u^#H03`)?L-xHDN8Dz44ZGGT8a3$ks~9`jTGg(<9;*_s?fFcK7w2 z1e?;0-pEgHQZdUJIel@l-bVk0mw0bdD(ryKVhiDi#&;f@PntBu2B+CHUgVsjL@dz2 zr7pI@U!{Q#_>M$%m8-q(wLYe3C9wq7Y1J7Ijiqw9-%!nH>ta>KCV#X1hb$nYSRr?Bi1rzmg*z)6mf=gO7OuUTyy&XA z_k4=?%5C3QB4E^nL02{Nj}A1utL~I$Drsvm_R{kgzzlGFD`^^cg=m|1wiALO62njQ zVki%}TD-Fp^%_kZF^Q qxr*)F@t+la1wdA^eP_0)~+ra1cKcl62c>3hXdJ8CX&rFawV zN!O{UqgH0LHcJaJ`@{tqjt;noFZK0QR{sY4#ahnCNv=P7B(JvIIjad1Nk`~K&1Ouf zeT1i9ZI2#k*m_epgfJ5eN_zztyLYkVZ2zp*;ks7A1k;&I-nEF+@-qv@m`1Vjv+inx z-epmib%!`wnfx=!p2&(R#ul!~YBfYzZddZS#fes(3fJT04zmByTK!ySO(bcnrMl8i z5yviuMbvbiwOlYYFDBacfSjm*m1}OJSaRMjC4wvL<%)#ct?1eUx!bDpRvf|l_a!zU z@WzaaA}CZ4o&K`ExoP?m-@#Zn(>yY+HY^%wJEUM|FoELNO^%5SjZ 3v6ro$kI7|koxQd5J;0#jJXKh9MbYi{eX`Z29Auc! z(q|fw kH5KdF^j{#?+FD}C zZdm9v9EsAFXME!?;`-2UeO|mVG#b4Y9&QxN&^uz=+DDYzu*3b>5#Bme(b6=MjtF&R zC{1trO3}R|a;!TWszv(8m*n2NWtxiHtvfD`*|;fhZr4+0Q6p&OJ4K&Rb$%#Z8vzTN z^7+V)xDaFvifQD0JI8SUxfV>TPT;dah7qmJt(tASfboZAvTD|OBd;s@ScprPCztip zTMgH$9htHU^=Aa5yhjI|Mr0b$XMonmt0Y~vin-ggMVnC4Qhd#G6*f((al{nhjwyXi zhdfeOIN9PC^-Cs6Ynf2;h9%L>=_Zv;N9n|VxMz37YV(<-ta$MWA5-e2^rG_Cz1ppN z?{v3?_*n`KvlErjUn(9qVUg%@LSIlh6S%Y2JIrnP)+^Jk7#00;9XF-iH%EH3= v(} z^$b32Uz*=p8I8$Zx#3%fgqNeV423$5i_a)9yt`WkUk@}`NxK!_ooh6<6Q$727MXl) z6W}{PSFSQWHJMOSJ62p>`g*uj2rlL1FB0p{s%(Vwi50_KwuwsGNdpP5{xk{zrU^2! z6YJc7d9lBgYx}SSH7IFYe;+K1LLXBUUA|jtr6{)0tZuU!I(VdR7*j)<+sMB*Z=HzE zD7!3zT`1|;hFkt_4{=YtU~jkWv^A=WpWAGJs?xJs@zSD^tr@EZ`Kg=H%L&qP&yVm8 zmh&W4lD6r(I9^2}hE?k;qQz|Y>Or(i9M-Je;R~AO?y4AzoiVk$!#2m~^!B0&=LT&n zO|zBN?D`XG)apCKi5Ok#8J9wP-wpAN@y_)v>+R;k?WHNWz-YTCz(B1(Nd%qtnX!RJ z(y%qe< jSbOSU4SYF|kORLCn#O# 1o?LPq)jl=ib+L?hh0a zRpfdwTvdrMoD--KOl=8zQ&<+0)myA6BC?U@vpmG*CVO~b?qkQRwaZrWq%K>Fj4z^_ z!dCc+7KVAJ6Z$6=Ox!n8qsH nI%&d*7@38ezf!KED8v*XZW8Ci z%cvjX9GTTfdbJ^ma+PgcfH9%O6*F{}eP? oSuI49roL1=?a_bAleK%0c5S>p=`|ms#;;;t?}RY0{j;y%# 4=i2hllzD(2fA!3p<_8RF2{bJI=mi$ zaQN*evG8V#z l95G%vTs>C#=asBgDtWxge?`fA~%Y0lZZ&jCRL`S>Mk-8)Oj_D=n zB^5c*&E_cgz|d-;lsaRV*0|5NU=V`NfMG uhyj zH=Y!aUnv2$lgT3{c-E}Ca)0QK%eK6I! TmDep>-%2)@BCA0g^XVe)V z$Eld)6&p24s}F&cr|EXEik-Io92NoF#4&~52&y4T$KVmZgLQ?2S=z3k>2$jbeC?1Z zI-+9-aQk&>fCPL`@a_3?CH8+c?>|i1bCVqO&pzE`PCD;ziFUdYbp&YM;CztE=u*02 z%;mMwc?+M=Tk2V@&J8F*-lD;Y0~77&vWfS7cWX9*+d54Uzva~JENrJi`89LAa$M4w zndwv%_Xo@srg3!9oKAG3%pgZ_Zn~YLN`$T|Z>_kg7$L?N(I<=w1l#u#i;`~_4JB`B zEGud2>+7>t%qC6550)CyP vCgSHzf^R!lP$*?Ya(Q6KEF6g({E1(3+sHn88pG%EFVjZS ogkik2opLuEc0C=8A5A z=~J(4_t61kGuw)B*lL{8975S=-W6;qNiZFGfIQ0LngTHu=Yj_XZ{=1OTkiYtFt+xHTW|^G0#cGZ|E2dKeR5yrLan^{ zeta*W5Uu|dg-{|+C=uV8&Q!OJiD_bd%xjx(%f!C19oW7hMJ2pdVf`VbW)Pw WZ=;IsfD0SLh=VQ?yn$39<%JWsM#}1jC@o9u%s#tse=8j7SgZ|cZ-Cy5(BJ^% zP;Rd6k8@Y!C7YJdf6X|5yBM ; zw`i-iP&NzU>Ar3K@x=qG(P 1WUF9Nt1X^OX!c1M9+cEyFKG n`|dnfyx=iNo@`j`70mNTpE1=Nn;b-uUMZ5~S-M$m0HJk!_z$TE|07&|!F5ZXI( zYtt60MN8$P-mzqAff1kXur+#|=fR9yHq?fP>m{j-4N`Uq`GxzH&$l(-P0V&L9Ia@) z;B<(!^p5Yv2I`Gr0rT~D P3D39O$*sX(E QV6 zU{XT+KD$l|xLa)IdT*ZiRVH?<=#4uuaJ;ZvhK>!l&)XW#xd_|L7opKnC; zBKfGvgf2f2z #TYUW3&T_d(Z`fK9($iye z`#)FZ-N+UI{*v2mNU1t>z onn^}sxhFGta}avP||`JF5n zRAy5MGZkBZ6h}oWOgtbGrfHSlk*&7gk+-;{Qe5zAek@S@xv%?9y1+_`GP&u9K?B<; zBnV-XuR2+Xp17h9MHRf7d|bW5HyJg*D-`Vnh3I;=vE-Kx!?w*{xpf|^!WHwL-myM9 z7_lNL!pv3q@U7YPlbgeqg@V0*REjjLnNgMY+5>2A(q<^qv$(o7!Nnd>;x@OL%_K$p zQ$M9r-eDzTYkS2f2GtI!6zHItnX~VQ+U9F{pNs=YOraRl^0#e~cDrx#7j#JZJ zRE_cD<7Lt`aTM8AYYh$)-Tboes^5f>S8vsQ%l{sZv}4dK+8WgBU%k)N*>F^xRuskF z72%$nK-x?hr2|dKqwa==hR>@qWtaCdko69a+Dth@x2d5!gTN3@DCA%GyWO<-j|l?K zk0tEEscn Dd6vaPOriHYW8m0xF??UgCbnCfy>kU5WGe93J)-44r#OSEUc0(I=P%2$ z dg923%Pzz zvAzUTJXur~GL(E 9LwYD)62eP>#1%l&(;nqnWA@e|uqpZ^`fT*{v{) zMOxe*Pr+j+7preadkjT0_3T!HlxaI}GlBq53rQF1;s^TMGZ~Xt=k=WREo_-6mz}C# z_=}}H+T%HJ$e~&pOEaGEs9?t})Vnb41^kI4`9k%b<$=<*8HL|eafGF*N`mdORp!mu z-?mE3>Zb-tkmDz2ms~u$zGG}Ya+XYO-@W>$Fi0=sY*VTpxYg!dCT^6Qgc!U=S+b&T znq8ocZd`Ch0qK)wQ%sk Q`NheWn#<*XWpiCg$CE!n?*yoRDjI@DQ;x?{r0FuyV@zP-lEtLZtpNiOe*5slsh zP{t$6J whTIlFGp5`@T0aA@3U>XrLnpV4OfCV!-+}9(Zg` z$Nic$!^^U1Ko&7mMFbsr@j+4kw|43Q7pi05>g0l4Ff?%w+>e5jtGL>5o_`h@>V8iJ zv}v|RpP5#Hx`xakD$@ga# d26=6V>A8QpTI&%W$%9;A?E`W?57yTtDqD)5~C^W`P)4ai$6k4z*?fBB#GP zd>h=PyqY?*4eKB9#05c$?+6&QrRz#NS1bQ0T`jT0T8;>-m%8D8`IZ_AR&aG#FCFW? z*0yga?ZWnMd$o4`+Z$I)x8ELWw0-vGvh1~M2``%!c@nIM^sQ$u``;Zh9J+Dtl(KcQ zD$_Bkv(~BOZZf3)<=WqO-PcNF`n$;WdZOac4w@CYUL;FDYn+w;1_VVzXf-`nQ2^kVfT*S?%PTo1o} z;)(Q;C-K-r;CJr9#zeU9j(jT_SN*Aps%w4|9qQ*#P7~mhcu0&Bl<-gpcBtB3bD_J5 ze%5_*lrneJkdsg%-iMF`m2%E#>J{_ik)AySw0k@s9;dB(p-_FrfPB$E 5# z6T91_A0b{R5v>pR@Z&yWyuF0*sYd1%Ax^qmq!MH&0-cG{>OTmYCqB5tYEJWxhESr0 z4_})qzcsP0)mu)#Zt*oA^7s -ay1l(7^v4Q4LZpp z KrlmWHr32?%a@XYMToYU zr9IZKPV^-u7>!aIFW~b@#6QFzvSo>(W;?6o5Axhh?2X_ixXS>VGyHP+z>hUtI7X{P z(jH8ka+-LG$A5Iy(fcU%y`BsWV=iJXkepCm>P!6Nqrv_8M&&k_Pa1_f+bBGh)9?Oj zWJrWZ_)6MCPJePE (L&99mze)R4jP-Bq;)TSFFgTTlOGt1b ` zGv%CNq$onk##kW`Zjqkb6NEbp!cpl-8C>|ynh@cLK)5iY0Vleu7kq)Yi3xn@YIKT6 z9h52YyA}2*YZqqknI!f+2`1)?$0dm@4t(_zoI@vRU;3duKQ3&km$g!Fr;ZAbWVE4A zBJP(Y42bS03AiRYB?Yl% 9@ zbpjT5dP$n92V{E8rH?#_DR$4I|7b)+*Q52PG9&MA5faqK&!FdatcUpzNf5wV(sF>} zSV_QrMv=9qy14guA&-M2wBw(}t+3yytM6vcoe%fEeM&IqJVc2svFbiN^1A7Xi){CN z^HCGpr}I$_EhP9PoQQNSD_ZL5&n=(O8@P#%QchxnPQg 5> zd;Agscu1^OFdYf%TCkYDWV{PvdvRw)CE_DNY3U4>+-ij9uYe{me>p{g(;n@D9zMar zQH_H*zgS@!IizpWTxL5H%=dipEFu><-bj+}O*93&|IP5~2sT*KqsWqurQcwsuTnn9 zyF5UG;%qlkKa5A%C*`sJRA+~khjNtCi*Qj8F`av0Z`YnWYbPE@J@e%mlZfX6N4<3_ zYvmxG7Jx>6cYezu{0jhR>{4wtWH>}ikwql3628>!AiyYk&{A1(V6PuByr0CA;#9SE z<}V%UtLu>wm-pZs9{bYqN@It)M{|_2?l^b8*y0iH?Wf%&9v(WNiN1+;m;AF;%A!?< zN$?{L_|dD0?7NvDHtWUjlC(MqWU#y6K0?re7}tR46IYTPk3Fvi4n=QJGD@BZ$F8d0@=H=f{@F3(cYqUZFS+3h`1fkcIapN4(IB z(nbM{b$F+{{}?LgH=FX_vv|bD z^1iPmPFpSTzOc^vR4X_bWV z&}E@*0bwL5S3#1r&oeEj@Gl~8&i&x&V;rCot|N$QBtwFPp5R14?>`B}{7mHzRh<~% zXnuQg3n4y9&SS*W7WA_;NKiS0)k4Cflxx^mr(hi?NkAh3*-g1G*RKk$+&_favNdAM z0p_Qj7^+_E=eWI>K$a1(priluas2LUuw1-OF@ln`h9KMB{cR6^02Ln0!rr&YO7tjg z@qvOh8I3lhOk6Hv#rH@TbWe9G_PFNn0Uh0*FZ`5xod_g)1QKOD&~KCZO` *n(Z*Xu7-kijv#+``j;ipTl!y5_!qgqc&=OVT= zyTq6eAUS)s=Iupims32Xqm*{oaAYA3>|kvp5L=!uzMH{NrF@v}JMy4sfq+fx>WmkU zFZ!QP;btIsjbP_D^$t>kG*6%iCJS6PPbA(0EYZ*IdFqX ob|>*G8n^zi L=nk@;}4}k8TBD%9O_;Lk2 zZB7p-U;icWNd%XYP(Hbl>sK!pq#$caD+Zby)sLyYR?8n8-}Z{+S->9q;n(^yiX =*NVRz@E1aGB5q-zMj#C^8vPO P-M8KD|a>%o9u(^(@f# zINdSSwMRnwmuZCnDSZRzMK8slMv!tp2e&lg`Rib3?~mSg_yJ3>3lM-3ALoNzOb2X5 zbqvLeKb>-eK;4lb>HX&V9c|n%u5$oD_E(dE`&9= 9|I$!5DZDhMHi13NO&IO!&$uv8M{BdRIC+Z_2Ud+Jy^8^U{1e39DcyPP0<6I zxFZvx5s2vJg9)h40#*p(Ut7TX(`_-sr~hGMKV )8iS(uLE}D^F+dh z-3WG{GrE0{;4tvwwmpn@&JkP(I@ }1bZ7lW+%94fHzs6A6G&D*|AZ59W(g+WQ` z__NjZW$Z7%*79Gz^ZGc!4LOf;i&WbqPcPAif?vJuU^}@FuN=%Lzd5dDKhBI>U|tg~ zP24dAB5xoNd11*9=Mv(0G@65zm;2o3);RJ3Ph03~c1*M8->WOQ&>g0?nR!sf)oZVQ z6oRU}$8zYzjue?u@namLV#Qn2)7LrC^k9@Sfm4|XKb0Q*ysK>g2ihQ6aHbp66n>8& z{*l!6PbeB9v;goG;g^B!IR2KZT*4DZ=2(wFT2R~`;> 2ZI+iQP^ zm9gsB)8JBD0lkPBVO9W(S%#X8ChOgEKKX<1a4Q%FE0~*g$UtDxU+Gl}foIooz(Nz9 z$9G7s(SvcOK0I{wQVl!E^Ba=EA}-?yxY2L^qkUS=M+66f9~C{kd+f4F*7VA^n`hw{ zZHRJqBmdxxLqgHnEvwXFICuHtVo>UStge6VHsaYQk)>1b_2Po1W4f;TNWuhhmcp!e zoP=+J!C6$x_9fEZJ^}LBZG`mya27|LvvB{_Sr}_1P0Q5?vDv?2Y$-vXd+Vys$!1_) z3HL0h+temEk2Zr}l@mRv${VVNSF__pmd+1Zx{R62r(o&G7?>~779z%}*?apW!3`Ne z5a!`W$|O0yKrG6)8qE+?m8cOxuw?PnU(jud^h-kFFw2weUW;8W#OAcY<|a4U{U&Pp z-z#wyADv>carK@6{~RU|(9=NcfvO)YP+C@;wV7%QHE0eK+||mv_k0U&UmZfhrg^P1 zN&YQFn~qE^e&fCzW|H@2zwZUOld-n5)Xc%9Uw_!Xr6*IXnL^9#So)E}`#nvN_bHzG zfuBa=;P(CV`i6v_Ou*NCgBe`GPCUW9ayfCYvIoEMI9M04`#+)4 DTwiljz56Ffv$Y1W}DDHrhUFZEN`R&RhxD0%#Y+5c(*vUCVgdxCNLy-g> z&bsXK;r7%WA%ZJU$}L#;0*yEcCg_tOr2`+&!$;ZoSLtwA jzpQ4fg{DvzgW_R3(rtIkeyaxRw^F_od2>aBO=&mN?|ptPmG^ME<1}AS zs*3bvdmIOwR#8UE_OsFVW3FGlPQ1}6x3hSRov+pl5MAqApjINq7XvG`;~@G$0{RsJ z7I8d^76GK!Z)EfUc4@&2Sr7lF`#i)6Kg7kGh(w2+_L9?=d0~W$of||8p9aw6@4^0l zPaoIxY+O&&TSLHNiqP_24lS+vV2uk{(b=pRj@Knus9d^~r5p7FMJEF);kZjPYInz8 zaQ(|;)4pZs-#0FN{V>tQlHIbIVceON=dgIU|9+xBGv9$LR$o7#^EuS+6ZsVu;_28u z6Sh&xB&Vb0XBW-@7tp5%xTqtMAXEFnujr4#$K!mb!T1ptat^_Du9uF&=l+5C!ftoK zeRDclfuZC&IB7z~Vm;;S-MDNK%#e+B4c>u!H$R(MWoi{?^-+=3c}e>+v5T;nJf*AI zp$rH~Ed(O?U2yhkjXU9kUVqpROh^V ~^%6<-WcuzSsVPDc{UAPnRGOT7_D?9j zk9rGsTFZvB>kL^*2hy-5$GJH%3A0zN-#x`^@>0uwwlB9MTd!KlTrTwqh|CKL*HGrB z0!MuieLYjk<%4Sb9e$`efU&?OV*l4XwGRCyJ*!NXz3kgL`yl`u<$(fY(xw2g|Hd;r z3kQnP9(a4lC!;LeOt9b6vzsD$O`}n~CSBJed5nXLEiGMJZ%?(}4VNRsY-3Q(@4XHg zj8r)0-F}Cks#jg5-%H~>dp1+EF!%`n5NDUmL$g*p47z;23AQj#t>n*SmCH7Vu^C{7 z?ZY#RN6M~>%Z0JN=uTHFukLjM47VCtblX~#R`CtE14mmT%Z H8t zC?((ZqoONHQ${h0l}@Yp=3A@1dItS@1_7=@JMH4Tvk&?V!gZ(?? KC`Kn={t(- |g#Scf%N2I`6o1KjwOg%xOd(o8*$IQDZaPZNNp0Ju9Pm*_4!bsI@G q=e^I31I(Si%Tu{W+*Rc|f%9;Ojd z=P|wg>b1s*VS6kav&Zs@Y$gQ_V+zsCsO;#69WnuyNGyHe&}t%JJ^u00Y6^)cAjh|e zq*Q4rtS;>@l8AQz4Y9 ZP?GQWP fOo=_1w$4?%TGG<1eK1Hp{k_nuq-y#J3h6 zvjjD(ZUO+kaogVX9ID!wq)b)Ij>Sd{WUlsVS&BY?AA5+sL}J8Y?8wGSr{V;_iFLzg zM_!Aez70oc0CW_YYhk!sza_oCWT|X*FN)869Pl|<&}OovAH`)`AU=_?=IpCRHg(`r zmX5IZj4wykD{e~dB>$f6#fCF6vsOD?_UIv2Y_n!O&rx}gZGIkRI+o)o&JOdFNASWS zdsjaUG5sRwom|ql3_i-h$IvJKSAP^@JU=2_|FFSGz(0|5_zu6D>B$UvOf1&dc=Uv- zDwXZG1n(x#12jw!6~h4H(wHd6Nb0s11KnSmW|dz3-jg{qPz0e~dZEaALKb5m`N9n7 z7rGtb)+(>oz{gF@ZOb9`X8NrjDm{m<`vhlmKIG*!W@_YLH(9sZZTsF(iIoLq z>v{Xp=ZyQU%XW9LZ;jex(MHU7RR#;M7zD1p EUwwo_QWR6y5= ;(9AhjRCbf&s)+70YV5{s&SpdtUJ<2+Z` z5r1j#6nASh|AQ|Q%2;j#06s30u9Vk3XG5DAYj(86KJZ{9T W&?pmmM{1u8xBCQ3 zC`DZi9BH#2w(Z>)xiI29F9TsKPpq@WvV5*6YPnn{grN~EYTixEazv!x9_6|hds@UH z$M59D_uJR=a|+G+J2o7V3QDfNG$x-eP~--U>&oXEH&v1;atGt0!dsb|QYL|R6j#ZT zA6;ubnY`RaMqXWLi4yx{msyN*! F0$j^@hi^kPRBwm6YOUZ;(L5)ZP z$gBFv-wgU5Qh@aq|0m+wb3uphw42s- 4qtb>ZCs4YM|p z!DJ#evZSrRKk+;q!U+1c0QD5n`>`HmjY#-;k z_99%@DK*7bc47$<^{{r%R#B+&=iBET!S{mvJCl>n1c|95j>C|C?sg|F9S#H}sA< zK;>+R;j9yAFYk)nhF=utokvLg;7wD#LB@ao6D^QYRb4~of~A9N?B%mu(zVG_Q+;pc z!ZX&w_1sEV<_3F@*^{dPZ5?IRVo-=?s&vM*eZS0IYn)Vay>zLGMQYGM_T}1>V|6+< zt-RKd{*;ZiM{rB8q1<;XI@gTqRF1{?Omo$7_yEB`y#aIebTy$6Z=DRkz|5WjnbPfH z9lL%hRgdI44hGhG#V)p(Jy^@>+3WXZTs{zR+@XVlra;QfG}5 bSqup?*1Rm0K##4h;p&}F8@|&dz<@r3vDNqwbQ6F9wmV%Y3aIc7(@u$ zXI+mI(}CUMA<=v$F-7KshOW9Y%0qp*`fv5B-5euQKbdT=_S(--xo<6617#2rcZdHE zSZ|HWWL3$P^gaq9j#2u2Pm(-k|AP-lmIKC4pls(ybZA@_-evG1Jpt_`R=q0iNIvuL zJ5+B)?_9Ck#$rwwyt-gNY^yes;jB5I-!9gC{GD-9 c{x@=PDXCm}o!Epo4)w8;O5MYwRM z0~{K8wT(GR8ueTFrB9DgHbHV ?doS#w3AGa32g^^}$m-FLnv2EMTxt4Fs-zOw*BV*i+d)F2*C-$)+O zb)KU?bb`Ib1oHX$kC4F|jMhHihrRI?1p#98Uf}Wx@`Jh#U%k-TjEb?dgwq8g3pIPK z0Rqb6{7-RT-C1uC-yd+o3o$O{zC%sHY9x=6-y0{#Fo2zxV<~}Ya*xSJ@?0>ohvLxL z7#E#2)VQmX%pvGF1+%+KLLU|QWb8#ci5dp*K(i$V8&3&Ya6!3LeNHeg@WQmG$gT@* z`G3L#Gmg3epBXP2w6JNY0K}pGtbTC yXi$QYwElgQ|NI$KPl%!?uhi-MTY zKq-P1VuZ+f_%n{At7Y49MHw?x0Jm&HQVML3pC$80mE4%(btz}W IQ=T5C63C&IbKlpx(32=ljOhi9T)lsNFVvW|Zw4pS^5ZII zZ;;pRD#4eey-fg&<7x>J-C5ZEaK*|HOFV q9OlENtq~=3>?%OkZ6Tx!qR_;exu66F8ufk>le>-Y1c=>fn`Fxd@g2-ZR z#hM8NPwTU=3nozmCzDb{VXJaM$b>mKsD}LhBd5pjH7$n&qqzpT$J~x)gWCQmi?UQ~ zxy5kV^E{3sGMsXJ`c+RxTws=6$z$#j%M4`7A~P{8xU @vc@^KETGj`(a=Y53d3OdIj1!*^(Csh Cm5ip(y^NAb1xhZ_c|V7aBZ-?T<>CtuxO9BYt6Rk;qM zOeaMQzO=?pwI_wA{s3-f5-LIKH>NXC1vzARQ1$B&oQ$6@f-;-@t$N`rR#L96erYW` zrZ3BV_@LGO`Q!aPo~lR&%WQx9Fu@H)0PF8MPdrID 2O(L1te$aY$$g{hR$UwCtl5i)M9E`$oBh3ev}L8 z{l$So)3;EBUxM7ZB<{rVI%9XCkuWWbh>-Wn($w^UqHC|P8>ZQn49>H;-rpPwO?&O! z&s-(>){0+@)Lmg%kGB30)PjWDA96|UdsJxB9sHb>vFtDqlS4?!GH>9jIpVW=HTG?S zQy-zqiK$?b-513Cq~&F)&6Mn5k@;}kvAWPjuj`H~Yp9pPDc6^uS-vC+nk2dQ3cU9T zb L1J%<~63!R!iL~-*D~{j7{--Neiw+^b<;mVX@5bHNzaHqn7a}if=UbIf z;EX{drI3$M0?@P;FXCMhyFJ(O*7tghP Dg*r?+5BZ54iB} zHI-RXNYrvccaha5#S%I>2;KhC?m~Kg&~)48Km7Lo%(|5R5lX&?qq9&vYZ4CfDXI6T zWCUVhKa+ZG4&Jqx4!@afZYoqw*UH^(xs~5wD#kwRGY0mM-dp(cPNSORyiaEn(prz; zHtHe4OdCZu&eiNCeu!NWmlPNel8i2jc+K%;&|%EqrmY+rB1@2|2*%AUM; SZ-wmQQHqGS8cCpVK8T0S6+Ox z36Ea_yE7tUxOo!6E5i*+W$gk~JI`wUP85UX70W}5{@)@x=m (QT>)J2uLNP!^5kwGBR2rE| zNQ=@^N=r+pAl*#Sh2W%=l ~YwdTR@tyI#`#t0Qvj=0Z zHC*^S_kG2$o{6gJ^OPK7Fk*x|e7VPrW)xyiDoYW1GPJ$>(F0) ? z=%7&MpADBSruEJh5O5*boudG7$Q#=cvNn!;QAgDLMWE0AB|K@#&mZh?95jkx(+l0? zH*UK!H&l{sS-sJx{u)j?Y8Cc@<{fN&d|0m>YvzL`Xiu$K=$S~97Eu0=jLi`ri+7!8 zHv5tCc1?g>&y0bG{PT_soX<~PcYESy+M@-uX9wlHJ)qi%sYV>;7^`X7c%P-=@5${h zGI`wCx4VHeDbXx44$yL6skem@va+@odSC1qA$e>N=G^NRKqQ!+4;7!;XOngdXH&lc zRV+jxFfem%i|F!39n|Yb9ryPvOXDy%(&eHVV1-r-5122yB+vV$eK-9YOb{jKova^{ zsU13T bY17K+Ug7yp?Fe)6}aXgCsOy!3_%png*M zZ%&I=<5WnHB3b&)**XQhrc%hNOYr0kj7+fSoWb6hB6!%gT48z9boD7dD-QP{@eZZt zTZEX@;{{5a5BS *b*L{Ra);*$<*$9Bt{6{bJlxrhhHu46{hFZ@|q7LMWsxzO+ z7FFHWuHgDO`d*Tjd8qT`Rm*o9<-(epGos{;X3d5=#PeJ^OzhpNoDqQeJOv18gX)HG z$udM8v{M;x%=gNBSf_E3duM*ggQ+Ts;Im1*$352Q7{>$$WEQlT?r*Ok(|qHmF8V-abHISa 5IV|yI zwx*WN^bG*%7JRWV+Qs&sSJ2`bYv$VgdKfK{FJ^KHPCp_(2}T;=nR)*+K >Mf6ih5kyQ@&6%n>D*uir6jc9|3-=lMNrj-L)a0F$f0grF?iMBZ?NTuNxQ>1JV< z#8pDoEt8wAy;yGw9VQ^~La=de9hr(!Wa*JZ5`om}-@k>(^FL|`q+z{kRi+nEv2((! zoZk~Tom7LyK$phe1q*&_>oYAmGt0N6-QegmPBsK&>tR7WT_pByH|G(h8AJJ b+>6%MUg!tUEI$`=Y-MYbM_pHA_HKh;q1izv>p ztdW~#&sr;m5)?i!AJ_l|?l) EiJ4QFnMA9%JWGqA$E%_Ni>lMF=b&Da zEKhMi_6~tPwVnB8&sn!f%U3MLfEkE%9C95`tRYkM!<<#I{E+R8%VM$y9@P8Js>?Tc z3O7$i6)yQ&r?k<1IPP@=4l*n0m0r3h)5xN*L-1_(g70g1hP+IiCy&G@53chd4K?Td zzZDRa8d-X^j(wN7ZLf-2`SID~CLYd@yk45YA3;BPmsW!jLH`HQlQ-IVktYn&*F#Ne zRJZx1u{-Ss^@FWDS-d(uFveWJKmj5doA>g@)SF|5WqXn;E0IJU>-C cH~Jt=enz>{aq)AxI}kg8zZOdR zbwXf(Qkw6{oIHK8q#cNY8weL>dQ!RA4+b{v!}ZQLe+l0 CM)NlS45-%81SB88uIB*JU}$~v7IfGRkZ8llsIGxw-Wzkj;V=R 7AV&&4bE9{wf|CsT)<~i$M{$gANMumX2?{4|ko3^79nIzxV< tcOV7j`*&Z~!b;qMu7&XvQD$I8yaE#= zkHc)o3aCIUhp2FO1?3FC@J3|~dC3RjQwklTsQZSa#(O{o3Rv6r^32W;>uwOd*10!e z*C`b1FoU8*&+c}WZW*_L-dJp`Fk2i&0h4pSgr+v}Jda0Zu8!3ALkABtj}5)Mf~)NO ze!^3UCG{QT7yn~14(OldpAagOo&F&G3t3?cXN@q%54*8U$o~WK9OX{$qUdc2L}C6w z1KFXEpoux;1s$6>=Gaa#42O@|jf$x(?lp<%Z-T#@H zEP^8UaPiwpglJqLqaP`cTq3ecYcLsBK)C1Zve 6`Z_dMFp(p^B5TM9o?P#~yz2kXJ*e~Otp^qPtB$NvI5o~ (Hc``$i~5*x?$aqD@(Asy zju3+1(G=SD@4-OE@lhvrCXrf2EJMFUWO~RV-$Beba)O+B#vDgpZ^rOB)^UhA|6})X z5C;(9l|~_Q_m~YeR6ILC<2BOppUX>lD`~Xoi@Hs2?J9njr4(??S;zI~OB;7`Jx4@R z*(P{S)IXvZIL1fPNnb>H#$@(`0xC5Km8pr39{~Z^-?1S_`#0mi1S5BLY{hMMjTOlE z1!2lqIu^Bo)Y$C13C6c7K`Kz_SqraB=HIBho(pAj(b5!bPp<>f*leDz-U6jpM>I4= zeI7V|>H)R1*TruqY&{tNd4z{6VdKkayqn8PJ%yd|>(=6~3gN@; }>)jhArkgx9I@=ZJ#i>r+buW}elDWVCKgxE=Pl@{X)0}SxDuhP-L zBz7U=H1N2XXL54sAS;-}V6J@K$-41$4jdOR9}I$~EiB+pFAdD=Lqb;~UVjFRe(qZ? z{ {EN$1XJ} (8#ili%D4r92YvfDr(h?NR^UnkC87pL1UwfOWEvU$?|O%o0{W_1b7* zbj?lAwQ$(OrI$ymi#$P))7gAP>s3OTZayOR1lq-B+IiDON&$Y8_Pc!hr)z5jDgstB zUIKdSM@39a3q_sb?AjH)YZ*Y`w%#@Oe5hZDP=A2n-W+~j8vEL!J&HRJy-&HY&PhHC zloyPjybj!UL!Z5lk660zRziJf&QM5ZsW|^?CXr;#p`F_1+r^~;WC_iXlCKYqB)z5R z2E>Gzw`XLMbq8p&42otx8a9(M%4nsTo~%X?99XLh=go9|XdIu0zfg*_`uOGKqXSCW z#WKNS`CN+|cl{4|Nd4`R3G%uvBKx>0r{V+eXF9McVBDRYPmv#_$=5HOfx+WQ5dup- z$X=)E5^Pr5WXAS;ttuDqfyhA^UWg#PkV)+iPDg^`BWmq`R$WAK&sIGZVvG&<8ifzv zcgsc5;{aBQAQ9ew0!o@1wl6`SJYd~M25a?2?&uif0k{Nldv1TRf-k85jTH=sPBbxO zo}K$MUgg9F>^M>fyBikk6t~_;XERwr4+->b(M_63KiI1`j4D9Jy~0sfoYA>_^*)Xp z3k89sp8EQ|kE&3hInF{`uK?56iWKtO)XOX~EC8q5g;a{)cPT&~3(HWDwbBwmli z*qVj!c)?>I5IAQq|E&(OHTXAv=VYAm;zBgq68X ZeJk%wYS#8Na>8y*3JG=CY{;G{B#hmQj&%gyxZ?je=>&9!zZ~oA4Z9>VOarl+wPw z%z+2s3dT%5vfhzNHx%1{Qz#?DWI4#>MuPsPJzX+&IW2})z7J{i^ItOfAL-0DrgdRd zdGNqsVt3-6N7p#86KuP-f*xLac@&qU?l4;Z`7#~>4lRy+G)9j9(95HN$zN;0UrVPQ7%;`S_Q-M0V87(e0Rpab%DuX%6`(RCT#*@ONW z%Wp yL~vsb#JGO|y|ZNxbdB{RkbJr;;*QYOU+Tn(7SG276rO zquT>$xz)>`01)XFgF(*9`qEeiE#8)S?Ei#eT-iWqfN!E86+yftBJMX4r90RSK{Nd3 zW;J}J6n@IS{Fw9c>05|>=hbgYs=xZ;ug;Gv?F1i`eZlKN 3fv5UNB8x)f47{j^cP1}=JCShI15ONbZ=Hfb!)Brt7u;x9B5IPC(c`F@ynCy5iQ zSJ-E+jYUOT!JQ^l8`SfmVL(>R`BXWwf6&$#yYmWb-Ck8mW!GtS3|7yK>`P#?HRoLH z7X}pKV0Evu7=I^v-iCu}M&p#8m<>Q6C3UD-x9^Ffr{;PxLvHT&$l4>z{+E(Rgw3QJ zd6O{)Bf-z`B^{} )aL2IO7zUbwi f-}f{zV7}8SpeZd!&7~J4vbgl9Bv$6 z`Obf(QkP6k>UwJRY-%MO87*3usf)lDK2U9B`Rxiv%?NftJ2b%fZou$bseAU@0LW?F z#b$)dudNwYE43P#Le}wtE#~x?8!Qdo!S@tmh%&g`bn-~)Yum2qC}?3jVvP{av2lxN zglI78F`3$&%b)7RFb9(Lz)B-tK7Gm8yc#GQfg4>0fqaON=JhLFu?8y$daXK({!_Ds zrjxbPE8icBo7_hz@eLTV{smYbIpyFf{CAc;^$6{z1jW0$q{_KhhLr8wQVX8(gx Ocz^!Un4zzYNPU2S{D8 zPTqeSE3CF&8868P;SdJ^r7>rdN$cr_NMfHUC-E-gKsNJ!yw0cf+uKXTd9_eU`JuMa zN@hMfazhaP#|zm1pBnUXPSrj%y!Y3-MT^X&+y4KyZneVr zoDUO82vn0!nqPD2@!^3q0u{ogrd=X1$IKrJzWDVyDZ-1W5x%xUm#vx`eEZYD*XL+N zl7&p^A8UbZYzAa2))g@98sKdPEsNTJ-etWF<^kP?*;`^Zk2*!Mw5d$&b+!mlnI@#| z!{Vt`Zfo?*H3y_G2+xv4%`|xA8N$Gg`p-N=6bdmT=Zz6_Tmj%U0S?+sbzt21Dn@@g z1#!s#cLo^*g8VOo3{-5u4dCz2ZqVRwbIKW5{ZybpmO5FC-QX_@^MrDmdY$y`QGbId zFGM`YG@ydWQI~#}%U8ox{|_m-^a1oy;_Z*mJr*I0SQoS(4ZBdkLlK`xLjLAHtUw%g zGi^CRr_NE`f;PxfrjwmZ0DhcJ-v1{a6fh+9abG# C$Ip;6(+c#9v-H7{u=c z!DDfD|HrKbw*=YhB>bL2?8zpqT2(R+z3rgP zRA~bAey p?SyM1b^GC@&dv>|B#w$GZv z*7(E0fh%L*YfW~YZp(I|g>ki#4xL*yFWF@^=O0`rB2ZZTqOftPK4xM`)IbU-ix+Qt zujnR5s5Ly-&73U2hf8<(gY&ZO_a#-4>xfG%=iGneLjY~yzd45P-7gM&Wki<5Oa5g8 z*WbyFt-$5Ak~Zgprq>ZX5nH6es{5ehh-sC2D2~c@E3%$T-GDvjdv)0oh1%R}=jsd! z`!kPG3&79ItJj@)JE2ixPM=@3iqTw#k2{1ygD8LFa+u?+k@(k@Y5)7mR6bRR!Jr<4 z&LPL)*P^KK_tu*TV%m|PtV8MnQks~~N~dLZlKb1w$aJ-{cfnDnvXpa|a&v6;AX{If z+MZh61zta5|FNrBjsF9)sJo?fQ0e#&ziYWRFrS^^0u-Zs-w>Qv z)~PT;xvzN7)^HoQeRy)mq4O&5iv%uMl$1SKBE_E}CJIn<8d1{B(BC!tV03pS=+36= zUN;5ToL>~vg(kSrMq3&m@792V_G}lLf ?^`^?KldxO`|l zjl(ZUg+fUbTj2!S4rZ(e4*(}9I{i13V(D&5L)gkBW&;~tJW?3BC5sy72<@y9{BH`D zd`EOD0V00rb-pwW1#MbTw$t!=_sM=8w_F4~w9@p5PSt7nQ5tH3F}ALRp*$uBrLnI6 z3t0+<+&1kG$24Dw*|>gj2LRKGJ2&~0A^Uo!?=ldJb|+pODw-+81X9ooFXn%c(W_i2 z^lN ul8H^h|Cm*))BKgs_v5H z$dD={xPZ0*2(zzZn?Ac}k&T1}UFoUmn#<#}1> B zrCappSv7QM35}xh2Z+`xTsR@!2UN|TF*45AxXPMAPS7Wra-QcS=jPaU>^;yk{?Nm# z7MzuJzj?Xs?K#D{wXj3Yr}zME>B##Y6>H1vmoPPD;@)eKKR|a>=sEr3XZ+zhqk>IM z?f%{vUfyH#m;S^xy}sv(e(P!Ztlf(wlXcQy&Q*C-(Y&QScfj+OGMojoHslHnHs4Bz zJL;T_zLme(HLr}#Um^zsl1pe4;94k}Rn)Yn_a}Ok9+P{Fr=IgZ;PFI36h%DWO_9&a zFkQ=TP& Xn1f`~>p7x(svPSRhveL! z8+`f{j`@j@Aq#KQMM>)MsN@Ljx>rT%KEPmwjkIn(7cw$uO@TQeJ#hc>ico!UsJMDF zb)p<}A|@N@ugbu4+5aFRQpa)3!^s71P2ryoqnL+KOk8Q4e|d55wi@QN8txM5)A}Hd zpk9l}PmwHQO0dVt8&qv+KjE%f WysPA)*yez F3Idia}<>GE~m|PvYxM#f|*ezpFfj?hahR(qs z-Zn|Y)u=y_U(2$vsN0d&eUhwhRE^3~keru!ygnwdYn=?T`{pEZKXb!py{;AM9r41t z2qoo;cjGk5C