From d4d813a7eacc545e6cd078a049bc978ec208af9e Mon Sep 17 00:00:00 2001 From: Andrei Solodovnikov Date: Sun, 4 Feb 2024 10:54:48 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BB=D0=B0=D0=B1=D0=BE=D1=80=D0=B0=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=BD=D0=BE=D0=B9=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D1=8B=20=D0=BF=D0=BE=20=D0=B4=D0=B5=D0=B9=D0=B7=D0=B8-=D1=86?= =?UTF-8?q?=D0=B5=D0=BF=D0=BE=D1=87=D0=BA=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/SUMMARY.md | 1 + .pic/Labs/lab_12_daisy_chain/fig_01.png | Bin 0 -> 45671 bytes .../Labs/lab_12_daisy_chain/fig_02.drawio.svg | 4 + .../Labs/lab_12_daisy_chain/fig_03.drawio.svg | 4 + Labs/10. Interrupt subsystem/README.md | 2 +- Labs/11. Interrupt integration/README.md | 4 +- Labs/12. Daisy chain/README.md | 67 ++++++++++++++ Labs/12. Daisy chain/tb_daisy_chain.sv | 82 ++++++++++++++++++ Labs/README.md | 9 +- 9 files changed, 170 insertions(+), 3 deletions(-) create mode 100644 .pic/Labs/lab_12_daisy_chain/fig_01.png create mode 100644 .pic/Labs/lab_12_daisy_chain/fig_02.drawio.svg create mode 100644 .pic/Labs/lab_12_daisy_chain/fig_03.drawio.svg create mode 100644 Labs/12. Daisy chain/README.md create mode 100644 Labs/12. Daisy chain/tb_daisy_chain.sv diff --git a/.github/SUMMARY.md b/.github/SUMMARY.md index 0dd04dd..2b0a269 100644 --- a/.github/SUMMARY.md +++ b/.github/SUMMARY.md @@ -27,6 +27,7 @@ - [Лабораторная №9. Интеграция LSU](Labs/09.%20LSU%20Integration/README.md) - [Лабораторная №10. Подсистема прерываний](Labs/10.%20Interrupt%20subsystem/README.md) - [Лабораторная №11. Интеграция подсистемы прерываний](Labs/11.%20Interrupt%20integration/README.md) +- [Лабораторная №12. Дейзи-цепочка](Labs/12.%20Daisy%20chain/README.md) - [Лабораторная №12. Периферийные устройства](Labs/12.%20Peripheral%20units/README.md) - [Лабораторная №13. Программирование](Labs/13.%20Programming/README.md) - [Лабораторная №14. Программатор](Labs/14.%20Programming%20device/README.md) diff --git a/.pic/Labs/lab_12_daisy_chain/fig_01.png b/.pic/Labs/lab_12_daisy_chain/fig_01.png new file mode 100644 index 0000000000000000000000000000000000000000..442c67b7f60273b2c329d82549ddc8658ef9cf89 GIT binary patch literal 45671 zcmeFZbx>T<(>4gf-Q696yA4Bd3l<3O1PSg8?(V^Z1t$b2!ENy1?mD=;+c){W?R-A|wH)2I76M5(FBVW5(t!oa{_D9B5Hf`Ng{g@J+fLq>$&vFmDt zK!3ryev*@fsTw0cfL_2`NhnLez|zz#89i9-jU6{ICJ zK}N?p2s-$NWZ|$lt)expHMOn({iRmh3fC$MBU7Z_(rW6}AzWX76wI182t#(}_i}a< zpmN5wH`2V9f{7eV{omiT1T+`)|LgJ-0j}!*9{T+M+M#c%zT{?wJvf9EF+x%B&fMye z$hRTsrJ^gVx}dJA#@ zJ(mSSy?wH@GwWnVzQEqF2&Oh)I2?S5s6c9D+I9t|i`cz2g4)Pbr?>Gpjcx)nI&4DH z;6&`Nq2V&rJR&MBx$+ti;iSlfga~>L#H1wd=k+LRTLC&rH zOR%+G>${;;)`&U_#loU|ZV^nqgnCE&O-k8uwL`oFWGW=zjyeR5M}ZIEV1#DosLNSd z)0=~*`+eMSVpFBy34AlD6Q_U&^onIyc&6%=e#83d1(9;G?=BB&%`O(rZDsh1n)dM? z_3;p}9Mk=DI#)1tq#K=IFYgkSIF(&rEJcZs`zX39W!5HSPGNtpLgfAD@?IGk&58wL zibvWfz+pQ`Pfr%DEi($PH^*u2D8h zvN=gO1k=s!OMZggLv+E%xCKecmv^&kLV?{NqX zfY+NnWPsKd3SK?pe6=)R=1=Vy;Zz_vPVamic!?sk1G?PW*BW77%04B0DKM@3gjK&l zcE=t1c&=D~PXw0p*^+4m$sGFUtKAQqE^(7y{a$TYMdK+ymB`yV+xth`pPZN6$OtjZ z!+aO(C7F7Nj|0wB`5B}oX#*gO4gOq%I+$_&SsOn?IB~UYWFGZu%tDTq>ZTyoDv7AvGh+D6yn#9niw7+3%wOnT-&)0SSSlEx9yt|%jWgZ^ zvyht^`7RSJ-)&$==xPq7W3pQ$i1|#LD`yVBPbY{)4$f`u^4;l-3>`s~oOB?OLB}$< zZxmJ46H9`G!tcwN0FE3G>61jNynK@wbI%pWYU#Y_$F}Pf>sC}j z0~VYZReJL3)4q~0eP>9qC~asl53LxRNrN|b`PF46){P)A)Ud4P8}$siLL>u+>epyX z4dwIREmf+r5EK6|?@0G+`P7J0A9F&zgg(FELG8nTpt*Gr<7ibzs`j-8h!Ay52MPWtXkeU9}Q*@XJbK@iq@BL0oVw6KvXZh-qzowuhtDa>;`y# ze4ps=SB+vFv*W724%+ge>jR&4KSc%5j}bPi7f){B`Z$fV zM~Rb4l;KPUr8V)H!f37CzpEA(h>Z^2>g(H2PKvVfz-Q~k6%;FLXP3a1)=LILNDiVL ztxCb5Mft!XK$v@P_)}wkAV!P{iuZ2apX1K6Otoo&w)hZ zQrOATtRTmFeqw{%S&*f4t%$4hQdBPeWYT^2-&HK5AO+vFn47NQ8}=l@EDpDp)6h)Y zl$v1bnXIP$56`|YnDJ}*_g5Mep_~z=`838`nMh$vzdnOX5kRlIY}2M?zUL+K>1gbRTK;^6iLs9#8}Y$Ga9#G`L;Y zd`I%cv93x~yPGBpn_d<=>WJfK6S5+Q>P5q3*^BMD%Mr_tqekRjkjNizPg4YtU`|0#^NZNp=RXOQf@DXSYu$3= zWp8=1jQwaToT_FID+*J71FC&>tLf(>!XKY~IfgJe1w20lk;|yrPTK24sO4u(P(s>s zP399x2gkl=SviI!S=nQ=RV3r>qGb6X)%e~D#hN_~?q6i^`QhCfJ|oX_^~JIh=3^!} zgStTX{94MqxQTw8dg-@g?UrKs*#PN z=|q`Zo8Uh>b$cR4pxP8FxVLIglNNK9JRL8qPNp&L$Dv&7Rg$p|^V^e0~0b zC;iQfj?X$G0c0QZgy|wt-Qn{;7bSpRF>pECmW1E&*E@5fu9}qzKC@K>2aM+z1fQH= z-V;`A^4u)eTbZABGw672usH-=NEDgnb8`@LIF6ZI6v*h**|5(!E(BtbX_+n-cx4Qq z4BV#nWk1B!*v*PKydYK>H{uQxR&! z!$Y*sM_6=1ajX>pQ7PDQ*b(VM%_W?%mlnY)@gn;z`|y;EHft;>&i%{Nwp`9#*w;3z z1R>$I-AiiM6;_e42+{cltw}oW&%)$kbIqSF$U~}bF!BfPw6|#k41bex0ZdIDx2fGK zzENd{*&rpay#zvZ7?^Sr_9`&Q{ToJie$ z%6+Snmmr+XXueQ%@!aw9T~jg%vZK~|hi)hGfFmwL{z4CYCaY56mmMRg;C>6Ac7&6_ z3AMyUY`hb6cKU>tGCWp%2nZaCrIx5$`R^KULy zbM&7NZwR8!r?x-NCFHTkxnCw4K4H>yPDrGoj!xRwm;rnH&QGm1InsT}Ug}P`zTu4{ z8H;a$A5n;BYT-oO?NJKJR~`?iYhL)%iE?z~!S1MocaxKU!=g|6%_lcK6@e?x_rCo* z?%72unbF*MjHW`OXNhCh)|!MCwr)LT56jM{_3KnXOBwL+GhZ5KUIOH0hcn>UxlmN(T{ zQk#tg$8{Lm$;5QfOlnk$p^vwJ7&Re&OnLyd!bArVBfP3lf%U6>ST?cvg1AWRj>bTt z@m0hA(oZJu+v6xqcSTyIS4rkYQ}Q`-e|WOR71&zXn$AWzxEA8V-$86rxo(Iwyf{U(YXOdSl-J_7Gy*V(H~pE63A z3%J69Bu@M@ns-EiPb||PP~LTBnZ6yS8h~Bd!m-YV^BQgIm&!i1Fp{EY2Yrsn-O%r% zQj7o^J6mkYvgPsMgfvMCEH}D_pfYRyMvr|Q@0XpvbHY?oh(m-%Uve`Xvp0Ao5BvU> z8?qXgHTu{CJv6WS9clGKQysr&I0IZyU@S)P^a+Et9vg4E(USQbgVh5sp<@7wYZj3d zV_N+Cgx(>h4wUZ;5gqFxU}0Sm-oV%MtNVg&^~QDnclJ7ZBcIUh(>f)Q^@*?GI1@%? zI@fY0e}7XWp0N+9$_*!}kbuhWfm-!VKA)HYA=e zW4oNmjlJ>of3|@TnZ&!+FBi%)I;^kUa5+u;EzlDWG9iN3In8Ff7@74P;0dXCBdTi< z9U5zDbk$$mGL^9U3RuEa5*=EvELiC2iW}ehf?4S1LixC4pxq!`c z_Av6nA2USC*)!uBNsD}ShTZdgcq7D#GCFE zNmws7bB13#Mvy)<0|fM`*qUBLTGVht3G;CwBwJsDZ1)mO-(Eu&+MR`Wu^hu(!dz*5 zE*gkCcRASF@d!F0h1ln&;^8yH0~WFF69Gq}_sGA_r_pVFG^GX7)QQf54g?L7evB~J z_UtI!Bx>iifAlsxv46_R(3o-POb8Tz(EYXt^KvZ1x);Aw5|uaWJR@!`}pCYew832r8+Yx z+`lJor(HdG_R{hv7z@KOv#iqi_dFVT)--|zdaG&gP=r(Bi%?$a!qP9=yUT5V&)3ro zU+`(b_g#8~e;!h>@pQ{2dwmuxP)V8}ug-u!o*Se@<)!{>*(IZ+A>0~>!`@F(A9TGpKsUBW5szLL73)1a zaWWxy&)8H0qjUN_wnTT)kriWWhqIZ%Yy&Go$#vofD-y#GgX{nv-0wK2hePRv%@YS#gz$v08nR z)!ia!+N7!2h>}@&%CXkXnDyS3swZf?hkky$O-$&---+}=6QS)i z;-1k1QOu#}m4$Y{&X~FF+6G@1Y~Pb@_&wxNU(mm%%HInG^yjSBPj))cyef4%fD!i_ zPf3CI%z)zyu#=ZJ3|h-w*M_^N2|-HD{-(PhtapmZxQn5i;WZEVIgh4+sHTEX|BeWv z+eFZksl&v!ApP2#>|U7^!#VP&J7s!Zh+ir6Ny?7mQ%t&C4q$fTTe2}QFY>OZ(OgQs zw+lwZVt4a*YTfrhWT9OBz}$xn-#ys_Lj8-B6LKoVJJA@md1_uarSTr!ti*L&%J%im z>u+G|Wj~&|RcFHdevM$}J){NUaw?Ik))>xL&0f0Sp-t5HLV)0dx=Cx>jO6rAwy+kH zrA;EI*u>&CQ17E}Zy3M%Waaq#sGaD=+bImmBP!!*K@^;??}&vait$7vJ5j8W{BNOzJte}@HozNq8>_i&#~(ciL>yC zb$?=Cdguh9#Ydq@z)M*3yq}v9KsOqra<-iZpjR0qFY@kx;54SVHt@%(79)r;!8w0% zB99Sm_>dJPcRs;jYE`z8zRcb5o>enVsy#^%4^=0YXzk=Un$}lCPX)la@Fp<$A@)Q@ z0&w-iZnYBh?Z*-gvN0Cchecnz0J>|#H~jdh;r6v^XE#Ojulf8++%r1oY9JQro&h_W zL&7i09}&%a;5->5i7@Vvvbfv0e%b$x2F#{!F}{7;Kuz3znrPKg+5bWj8kZpEzb@GI zPFou@)Ojm6!)XS9@P~muS6VSi;O0=9UGR?F^?+Ix!_DXk-{|d*x=)sRVU@IT&UKvo zt+)f&!tTXT1(JR4+H$W<?#_4>q-z3 z{tZCqarw09Do*Lm%*od$Y&@_8TYSHsTkmUJ;YSsIFHh9AvVfUc|0PJJ8V&@>dHnev z*iEV0Fe06xvh4IG2dYC&fX^oZZCxcPSobxWOaw{fH)Mc@F!MY8Zq!5ZrnoqT#Dya- z>=m7!4hlaO$}~M|e7T5yM4!eC1_>Ahwi7Cfgblp*)}MqF|4CSkDcDW(JdeQ)Ia_@w zOU-ltydM~5WgkGr7Bzr&hNb%9tH5{1-FIbtM;zH(P3zcC2>jGO#%-Tt;qi#(2h_ zii!7-)!Te)%@RWIG- z-^h23$zJKry_`S9iOI9kyAt`bPv_A-!+lBy=S~tD_@>IpS!@wM|6Gy_t{n+us+J82 z?(q+o-!jSl_(ECLwG2W~VIrrH_#zKL!AV?zO#N12{;O)52pe{&(gj4@ zfm7%W^9F+t`A4b@`X5f}Co9!izHIHS*d`7^7O}EM48p*ixVY!uR3$U!f6@$qYK}}s z;RCeW%Pb!`yQla)k2{bqHn1R3YOdMer)8JuJFPL?I`?DCepEM!6eIGGdM;n^kpoK*2NY=_`Iju9@-Vq|Lw2rSYlAckn zb;l|B)Y_<#X^wy&eXJxh`+u_KV(gk@-BrEhs0kV9#dFx9qr3z&3%wwAAc<@}ED11o z3l5*f_F28s=T18DF9%9gJjJW1Y}+>FvBo%cir%9L%(2Fji!7=IOuFm58bv;MO0I34 z_i7DlQ~sJ@r+H}FxzuyrMsP?M@^mvg89wdKZ zx}=c>VpKn;dP*js1T~`F)q&iw1hFc*YHmL#hB(S%ftDe}>4~JF1F8)O~ zX}}4ks#%tH>5gV@eu#-;s{O_$!~d1K2RR??XVr5AeAPsu{Ydqb+TKMM6JDFz&RA3_U%!M-Nc{?tX;E)zfy zU4QdwWrLQ}@CXRUg__ovLpO_yN6p<_K7XjUKijNc(E8X-0B>&$={Uf>ww^%7Xi*s` zVa0MXKjXVD@8wzIE4u(ZD*ps2uH>1$l})V(=n7pJL?2acM!Gde3-`GyAZdQ>z#Rzi zQ9_YlIrlze#y5f54t1-YYLm<+0jWN=nDhIPt1!vOQFLfo5IY3av~Cm>M4(eibGNel zD~xd&IE1v66zV$=GHR~Y2vScu;3ryk(CM1xgx};=cLIpw8AjLhrNu-3K6-l&_txSf99f=e9)?L?^8zReFwkvK=z1Vk!537DMxIg65oHhJuOvGP1sCF#-}ngAfEIOld^dIX$7m*(+X zsb>8u*r8fKx*;g{onnCp?)8_Ps5y2F>JFPB#uWPuMl~Xh@5IVegH3;#X83H=j8FhJ zsc_&DkjS{pQHK+!RRLRKxtm?qjJeI~H5agL7zr{J>wXp7xHf?1;Jw>YqoF5*zSgbL zj-f4s5^K8)a2$#uiuH0eb!U z(>^1N#Zr(bQ00_#|Mz@!_0PBq@7Nss=yS=Rh4U1w4#H@(ImjLT^>CiPe)yHm$l5Dg z*iH4j-NMsfojik^njm#oUYA22fMvQi&^X%c>TB!nFf_y7dQ;j3uobel`qm8kW zH6I&ibl;n$i~;6l6yA6^+p0^_Y7LQAC-TN^yi8d$O8;lp_zDq%$++YJPB7|8IY9V= ze8dJ|0bya=Q((P_4L^Eu-_J_I+YLUcJ+I|7+mbX1@a9w8v+&aKn91-*bi||3L;ZEJ z63<;xtXcJa-@h028Qpc#*x5r~8Q+Y3sLm67%sUrQ#=TRg<;Y`2>3NoQ49`)}T`J0sV8Y>KYaL0O9$9ir{p$rf$P;_|2nCW^kA7Gg zfFa)DbckhJWwKOe;IL148ct#*F6G?y@l1}48=!0hST-4>>gC;yAZfVSh)*geF6Z=q zr`o_ZM9%c6DG9vwanmT5cD&$hSO zdo?Q13=%N*LYnK0D#hS%-b;Ue$Ydu)8^VWboQT3rnp1LC^JAO%|Wl-G?9n%+O=k^Occ(<2WletTFeLUEg zLVF`NwNBOAzsARv;HUu*Y+EF~Ac!Iiv=cx-480=uUy#?cBxw zOuap|={L(#)uOLOj_hwzoJUsVZgWl3!CM);=a32Cj{;y=T2T`hi zIiP2}T+svUHAgO*_lgqzuT8azj-3$}$QgV{@|Jq~8pqJQUXM$+~|Q4B^N$kLhpLvDQZRn7a| zZTsZ|yWhR|VkC`>E4AE1)WR!`nvn+f-WBSTw`R&3UJg0)j45SZy>j~n`)E=u-(Tu!LXj*!sx z@}Pnb+}nM0z!A%B7Ccx&@HI&NiLIF5H)-AJs{#ME2_(~;{I=s(A%oGt!Sw4o&$B-R z>G%K(tLO8x3zi_zDJ=M2N7{cOh_DT`D;G0sS)=fb^L_=lbgu!DwQE(qKxAvg@J-4H zprq8ttM54?Y;~0tEA!G6qMS2KqjAbe?0nDq&SKF%8wq$yidnewIPq7F^hDcvPxbjp zirvXuL_2NJ0Ocgj<&t@P0D^PmOQ~^0km&Kk%^WP!BLMkUoF`dn33vwP_TTnR*A9(b zoqbbA@tOwAYLhONqR zg;LYMdcw+OG3)Mo`ydq;HI8;nra|SUQ&N_P^;s@sLked2fj+WMI84C{y~r4cDFgDk zAR%0eo7+?Gu;~bdlKm0QSwZqa1h8@!Gkoc1Y4Ht!*;raA^PL z1=xZ7wNX<1F~+a(-@~(`unx^$iBaj?H>qen zx?R==GiTN7Xo_<3Y##<6%;yB~!=b+gYe*eYbBb?#!o+tF#yFxBVQllS>hd*x;z8GQ zr^D!8*}a0@yL0I7ra5wk%xOPAzVk=P2RmpCW6xKbH|wXpHCga}U*(Nlrk*x#PoU4E9~|#0H^6 zaEz7y_6`!tP@r9^ocRtzScxTfJgB7v>5z<2HnkS%{9LXeIEfxTcihudnquya7mq0+ zre-fSt4)i4@&&$RLGP1t#zT&xE!SNPhI0E%_0T$-J?bdN}M1D&x z&#_M|G$H7Xi3HmQRMkCGB%}+8G!rP|bB0a1FXvk&aO}_goIaZ@;XWk30jKcpIu%+r z9Vmuw;gM$wV&{0r_e-9hC7Eofa`++W8u!iN_%(Mf+t~@$hXn*b1JF4*6U_f^6Q#u{} z);AYY9GLT_kyq0V!n~}zw+0aW`I?*%KU$`1I#{fpUb({z3=E(r>%iaEum{`ysTNk8Vagz1>%* zE^e&q6tZv}T`D^7BZdVHtH&k!+A@>;W-PNi-*9eK*3Pj?rw}Bp@eXEY(vnr*RGXYY zWNEQ0ky}JSu#`^E)(dRuu3H$*x-$?-@y;+xBkv^?Ju6x8%xYn_A%(A=?>MG!J~V2M zVeQ_-N3_JP48};uy^dBjYRP)q2XT(li-XV8wfBale{i7FI+n}nC@XYt_uRh;2kuv0 zdK4_GR#uRCd^aj0XD*x?N2eN|z9o!hmfm}Glv6C$>7V;r9D=BBda+x1@9_Aowu(-B za6UQ=F@}x>J}X<9T=C8uUmm=?Yn5$~sWo8d@*PlWVq{j9rrQ`ss5sUoS-f9QNAM~a zkel}p;R0>IT%WDN<>>#B-cq-%y>qQm8+;>bB0B6NDH}7)^WTlv0g0=p@<<> z)5${q)>w1#M-e~@(E@WMmE3aT0+UQ{YaS4Aj-om0&H+WdZ(!hlYam%HW44fxr=Ilr zllx@botYib4c3#=030R8JK6dP6Bu`}Z6C$mI(j~K$j`xk7$r+k-2FbT0!r@T_CE80 z&pJoG2dqRbuKogZCEJM+Ee;i)PGsubNrK|(0ya>7U5xZjIZ?QgG!VxSsYt$c-@gr%WYwNWn;h|Csz*E$8S z={E#qybolZ@ox{$i5bY(w)n~(%g00GS-F)EP~)0X>xO^a8MQR* z^!FC4Ge({_c%8BfxntLeiont!!aTSQ_%0VKy%6qAkXO2teSGs9wbWfi-$iX%f3;&| zt(9FWAJIG`1n2aglxQrccQYi5%Xa$%kloX68vc(`y7a}TxCz%?R6EfNRFBtas@5&+ zg9kz;ElfGqxoCw>;&Q&zh_AoywnlP%n!I;m($MW=3!eSPBHp*BL+&H;&i}NAu&?Un zt2hfJFzPcI8kd}Yr~ul-zJat++vZ0b0$Z70+t}%dRqhf@hF4&@#@N}X<>`oqJcz>0J! zqu$K7J-v9vVu2ITlGTOG{ZmL<;2KBTaR`*B6tI_MA8#+vAHxSCJ~~;i!`f}3`fnkj zcLl<>PZTRK;By+Gq>9A$$IeDToyF`53sV8vAdjjy7WK^-7E*ESGvL~fxbKSzk;vQU{CvX$ha>j1S^ofqo|}alkc+ zUGSTs6^b$gslPa|+io4PLcalhIE{TEdN#{>|Ijs~m2oy3hzcvf>2%wLX{XnS$~u<` zIjlcB-}OWe+UmJl=(H7AS-WSfRL1xNuHVY4aXFE-Tm6I9s&l*$i}6d_WSSkVNk)cd z@LA+zLq-21`*Kb4x+PMBy;02PWvtD%RJGE-F-&9zkvHj-u@s)2-H$z=kC%T3x87Rl zbX-!atTt*dc|Hktx0&9Zvtc^yR^`2&EIaM5*b0TcbqXj-wwpX{^L)fY?(Dlp9ARrK zqMG~`)I0F5QTfhnYmQ=Si=LqMZetKF0^Sc2bxqShPsqth1+IEwa@uJ}lf-S?hG1`+ z#v=`2xdb%EfUI{?%PcU{J;;r=TK@VUi+Ye%=LG*0g%3$46VDnDsphFTW zgys6et^@yR%`akfwQ!+tkHNs`_X{$I9_UrZ-h)pv$9S{*f!%j**FcLCapKB~;oS z?~m0r2s#_`k=O5&>ApGmYPZGnVjq!*rmWh%`S?h`JC+&ZrIcpAQ~p`!j}1ba%aoAq zsq@M!Y3w~R*(pLjChs0c?-YUE%lit04q`M*&VEP^XYtE4Bt+;U1%qP-CnmnVNBip6 z3YsOM=ZOZl{iBVY=nW1>K=QKOL-#3I;aK;t;TzxWGLh+M{Bq5?x`3VnEv>J~-99;{ zeUi~$xjm!M#SCl^3yYd;)80U1OY)X0)j)E6H)qDnP{Z}%Rmk%QGFpj&M-SN&~BUp|k<|8Jmu!hc;6(&`>UgOVl)m>pw7u)pvai_HhlnIHOwb^d0Q%_fC{b2*7d^}N ztLi*Nc;oN)J5P1Hy(CeB)f6Dz?VIPjgkyGD(YM7IP1nOyHJFz(6j8-UXB#2yoZUas zcqOoZM#I-ih?_d^@x-&ACA5$fKVXXo2ej%g_?}|0Wq(EGh3*vaaK}68fdcqz4OHjH zQ?ju(YHCK-qw20gX_P*()$tw3Psh2Zn^^L<0%>n$XZQ4$c_S^pQ2-53-)oH+_e*zmk|#DOXzD(YU#}yGfyn z-30e)&@(E3?PId+am|{R#u8&cE5g}DkQE_r}E5fD~64GfBJ%o#5%8!hRiJ7v}C!?dL z{?NoKttSOhXliX`RZd@`tg5Plp3WdT#m&e3=Vno*9#=0R^n?2pD z>QvAv7A{R26cPgWUaO+)dU39Q;rG{MC(p>=;l0Vwt#|U2+s~899};lAy}ihuQEEv4 znZO#YwRLsh-d4{)2|(0o(M&V?!+?KP3=Im&pmJ!Zf>r|ZbCo%|G$;s` z!?+_>H4pgJkeGzz?=&nFs;Z{uW*Wz}w#&V)nHkN4tEz*^A_cq$G3b&g4h2ExBAeGL ze(JiMz1Cq>Z=;9>iDX+ZxtKmaeTIOA9FFGZ+2&>1=W>YFUjAXuI}6g z_VT_!-4nm>Y6Be7{pn5uKD4^$Ta|JF5G2e4=&wG?S4j*qJ$u)QFlS9< z_W^J5e+#fuYaUUfDJtx`8~Y4}shsM+HA)02Lbc|D#Z_gY&n<`QA^~|o!&SWr|4)SY zL-wEhp^P6OEHVZcv2vP;SS#e&8#rtZ65K|(Q84p)PIsu%8Hg$eau9_?&?{7>_Wue^ zC(tLLLZLx{egcj@K+4~@xBZ2+*5r{dHm@0BfJ(QAS5GJB9c0Vb)XSfjP?b3LwP(*P z?k`-1j|{5q?7tA!dqqT_dx#NLDxV0l5v0%k1Vu+Vuva5`LD}9s*x>vGnhY5TA?A?H z$gRp6a$9e*0NgS08t&yFQqWB7-7Pyw(CH{yf%nd%HMf&6rntLAWKEO^bQ=HP3aZc! z%)LN<^+yv8Cn;15$K|5*$4)S$qsEyl2^BI%TQQiYlGSxB_^|qS;b{d9r(4AR-)A>FMdu_xbNxa=&pk`8FlQ=i#q?yj=i&<9#s^B@}QHggZ{)wnUCYQUlb#xf|SZJe&Q)-*Qm zi6<5lmb2v6BD?}&JN;J}rO-LAClb7IR@)2vM z0*K%vju2^dr2tVVLi9Xc34$hB0Ahl8cPL5|=z^9r!c3veCdvu`sfaiK(*ACOb()HG)Bq2;F&+$12zg8!R1k< zy_>X_zuCgkWkk()8IV-w{c+AWu}kKD1%K)p0|P#;NE#i+SP8XJR?A#{%*-#H##C|; zj?&swo3b^QGd5&ioXLpn~}`rn}#@b}uBaMhzejn1zN&Xo96l zkpbEr&oh3#lPCWunVC@+Y&Tt^?EHN1tfQktO;5j_hgMO}kZW4QOA)fv+`PW*4OF48 z8$Nd&;QnRGfPZ3*ik76`U6cl@BNF_zSl7_7d&X}&mqN-3ef(_bEQpZP2moG}<*u_F zjrM)G%s186KU=FuBKB+gcG=nN; zU`0S)P7XyLQ>}dEt3Pygh^Xk-xb;*ZU#zp(8m3`TOxe&ksC5vpu)D0LYWb`T=&2kx zSD$8^_^VH`Ixd2uWYM&-xzf+94i|d|NWid5&*1MUIj-QRET zpeU*NE()S!xVX%J@)oKOkS%?+{2R-cJhNWHU5k103R5Qa+mq!YElvMI?1A%Y^Hq#k3SqJ zJ-4h*b6U?5lnVbfu`;;L!vQokBa!mrI^ntG7n-rq9na+`lr&it_cxho>vCt+D-<}MYOVvq zfKd447jiNJcV(Jw|4zN5^YoMbQG@t;W-8LotEib5`C{BlhNBf;0L@`SAh@H3udwKx z88{@oT2gO?Y1pHpaJgpY<2Hj8$rQ6lR9(Ce7)rv&aQy``F`%TxRkA)4egpjmyUjjn zHc9}9S{x|KNw%3OZ)|369`L00AP8<~lq#&> zFU@2g%G>V0_lbshUGJ-#9(00j2rNgx_hGG3iwuQc--53?g~^~WhW*)bMKKVDrQ zX!twP^mUGQN>>>)tNpS0{3@Iy!jlfIsK6796oUP%$?-xh%IoQ0 z3_m|V&2r7C@q~=tI;&mPGoH_Q<3b4o3&7|&(#nMA)RK)*I&F?imvm@8x@P?w^gS!95So2{#jQXIW232I6dY>Em(MbxGa8~-8)4S_&CHp9e2+%N z(Hnt9b?={#&cwvjff#R}{tEfKX%Q|%F-*tgDb~D<)q79!tJZzRfKA*DL0i04Y411M zTadP#)eoP9+$o>=Qlu95(?E~*hOL6;H}RWcHGEaAo|JpXjA2-{19hDl3M}hS&MF>egHOjtU$djXs9eeMi^&ReXP3 ze77Nq>>D5V5|^0Xns%)0W72!n#opPOb z7kZsK$}3V)2k0KXvk1rvh|`r4HB}v;ofu7_Vvx-akx7&n149f=1b&IVx7e-HujU)# z-w*A0NimjkDTEd*p8XP6lZy&u<46?~E;zxt>Wj|0A|}e-|Ah7c=Z5v3#iSrUG54=o zRKy^Wsm1xhB!kn28#E9uq$^l+k4eK7S8n!+szT>n=gp@lNOYS0sXSI|d&kwjdfx`P zB471G&!DUwcR0VTxAThpCQA_Z0d5*cP|!jbb3QG=BGDzZ!ZAptf{Mx=qI@(_V=8rh zIE!|*JKEFYeguLwJJOT{Y{J%Ova9JOw63)ktChacW*C65n7p#|t7#z|j7 zyEl8K@rN`?XT49lFtSpVRlY4jeikMZc#&0r4d=@O9w%-@)t#ET@J1CC_4Cx!tR-t0 z+bi-~j@J)3a%;se#DKvLXaz3w=y6s z$^T+t9D%ApLCG<==m)l_j(FDX$@0~Um!QK6vWA9+*VWoJ-uMS0z;cMpRjKKhYJMUA z$M-7ihY5#X?hmjq2$({Tw!*Wfsr1xPvN~_?TVxvxqGF&PO34X|4_z-u`4~l!PV_(ZEPWv^ zZ!`*hInw}sv$csSHJU@UZhqwl^pO&P zV@I9(@ka0ZLJjBay^<{J58zEK4yNY+I6HSo?<()=-(&;*ohUL#X4Zb zrk@7QJmQI?(3Qst(u=aNv^2Db{KXG2{TW~mF!eG;c=WK2(uz@qG^bN%RB3ZJ`k{O= z>&#cvKwo}<^}j3+(+OQL92nZ9tKBZacqdJa^g$g!Cg@OceRkCdeq4PS4dkha;yt=5 zIwt;$(N{ghrbG3?Vp+Y&-fe#(DDT^c3&-Rs6XpLw+gk@jxo+*lBHbNIcOxMsLrRB$ zAf3_;qJX5*jYx|O5>kS6Nw<`A3IaokR!=XK+(+B3?Cf^;Of>0e>HayAbLM|t;qz8|ywucmgYTM| zw8;Sw}xszci)WC9dvcPooW=qNUThMfyj=deIz|*c}Z5 zbLHPy=G?}+!!KL)a=SZ@HgoZ`_=8d|=;xMP&o9)t{C=rYW>IF7=qL45>r>f=ws?Q!Hzbk_AM&o+=wC+k@*PO8Q^R`dvSFhnGa!IoK`!17xHgy zFXLV1jvMvS{?3--Gd)?0_Dttzh@Gxc$j4|s6hHB>5L_&*DP7|E+NMxW)7#1m zr%|3%3D28+Bm)zzb+1Fs5}s%rZQn7~UR^9L8d zzUCdBN{#}NFu{&5<>tE-DV8e(3hzT~Ut+P`8=q8F=UB*{`h@~hoG0?sU6iaoz7mzx zDr>2WF_~TmgY1#{6ySm_%#_lpF>G97JlHdr(Oe}nGc%Zm`R_XqD#}MtBM#S1*WrnS zX}YB*;?2q7f)TalFX;W&TOGu;t|RsYq+MF?UqURFtZR_2uz%87Wa*@OP27R8@hhC# zP;EE_-+q9`COC;Qp;8wU90El`Vt0{O z%f&gSDtjG3a&sL(jEYURVpRxElSV23^Fz$|_?w#}X5%h_N$R1=LmAO4N45zYavJP~ zFDsp>t;hSm_rI~`hDGL-9hFlXfwt=P=xUMk*0rg*4hAWZVEqO7{c5#mzR`i`Cm0>0 zrjat}X^~9^CoAPt)IUgInD5krp{E~=X=*9pdw&@$+smsQjfdU-LECoNefD9<*fcr2 zdgR&H=Un>bxU~WDk@pM2NaWy_b{aT(l|2?cvCLj@Pz@&pobmIK5`(&P?<~!cDJQze1tyjAsW7gek*Um*g&=u4 zp`CrohPM{#mDwVHo<+SGt6~q3(S*!|)sYZy246UMe<*t-Pf}QkqHC!Zu7$(8Wg7Rv zRDZ`MPZyiN=IZU!2Mcr$J;qn5rmL^p3Q7e;_wt*KY9M^5HTjD_p-X2!if3{+O zj5QI&5p~2{r9DT6A9dnX^>a4KX9OmV*!Q5LTxM;n7}-*sJdIZN7*ql^Dvp4Fz*)I| zLT{@SUrQE1TD8@{2k5uOiW3)`&I1hQrDo#M)Ft_-8YE{P?yT;zVp*N`z-q+(g7Z?_ zz!p2?D(T}-ec3lqqtJquHTJn{4L>$aYz0d%%ZjneY1o}zZ`yS9XQ+DO54F>Mi58aD_RkYFIwAU1C@pEC>VDu{RSl)KL{baU#$JAB^9Q= zp$jQ5568m0a-z#_0c6r2%y;5-gw4)e{b~UIBv-=3n{pN&$5u+6S5N)AFE1};`^&&% zGQQt??k-H9Go_G4lkPUgb9!>y+L!5ei%AaBOf9p2|ndAu7DtL?rwS z@PjLrx%xdSn)bIV{~iuHD_xh`eTmt08hYQ=mZjX{Oy!?Z?bYp(jCY3Jp~c8g?;jD$ z=Ux9`qIsX9nsEKc^(#|Xg23Czi#N-h5eNKr`YIT=t^VmulhapQn$MYUOybE znPD49eL#TAue7Rl&xW}wvxz+AhucQxcM0BBRMUH(yAB6g-Qb3{zt{Z6i8X$=?m%$# zs<-)>JK>m1G4a6KeQCZRNWp_mhJh{@oUFu7L8#-cFXMnJI5Jzs5IUvuS*YBXzq!70 z17&*i9c~|<>r&d6&y>{R(Vi_q6V#s=&;$JaND9PnMGZBEHhJ;}2HqxITt>?mCNB%< zvaBkQz(}xBmpyqF^6~rTs$9~JK>2DOs=t@Y0q>M9Yq`^v0awfVvHI1>AJhgBNc7aE z0e5uvT9%8O`;5i2FoW;o!lDd39J{8iqZ(O*FYNW>_Qap;qC9@ST^GPYVjr9=*6BGNB|T~PAR7&l=jED@~q zLd7+&aQCYLS7staO-+4fhxXXratLJdUWyFw;r2a>6s!FV<999PV=v`228Ickm6Ktk z?n;RTV^rcgCaqeWv^*`9J!5_e!}V_t4PM|@&wEKrRBW@FFC*_juO5=I)p()# zNdy*FKa(jfo`#(vv?#wYNPezHIVsG2E0$L;hh}ijXsk@|QIEoLI1?@P>dJi%Qch#BNhZhRe=)#jWJf@j;fsR35J0OJ{ZA0yW@+luQYMjU z+JY}_bNYX-C%^Y&`BM}6CBwDR&uFauSIc23UcD|ixZg~cdYxnQF%TqOZmpMcgmiEz zqeM#pckVjyBzY0yGM%Yqt6CuZUb3m1)BmE>)fHc9gst{z6f3L|e!Zwjv9T_<;T*Pi zJau`>E*ofjA&{ykNd6q_u=AOKE<9HV6Znl)G0b;q(MgOGd+5*xLpDf%_*H~Bm@#GF zByuaYFCNWP(VlHfwvNtXXR$jLgQMwBlH-wc7nXJnsM>e0?89x&8NYZj&}h=!Gv^xa#>PZ%A?4)7A{$E*pRNiMh5s;AR@7x`m)+hjRaa8Hf(qgii3^Fb)I) z2qDqGN6Vnbkv#xS5dsc{JHI)iap!@-LE`ZBI9kbI!CBzil7%TEDoU>og#g_^d%KKY zj`80EdEahS_8Mnvp~Y0MDC1wVmT`G`mJopXeD??S9e&Hjo9pxQa}kd%itL=6kdi8N zz&mG{3uY+9Qb{i~`PglGfHvEK6B?_}3z`Zsr7ervt>tNupb$_{ zux))5|JR5bmqo{6+FW0rmA^b#LrH6iiNT$%aq1VYx4Po5Dh!|ilN1XSVNou9$pSWy zxJ;X=e*E~+ez$dI<_^FHr9io)S?g@v=zI29F9*Pfzqi3%kp~a`plSI%)VU#E-90_apscU+IpLAZHXAh2lF`t3GrG)y zt)imRJVSk9SV{klk&!VZ=MpxOqX04mrk25a_x0e9@9-mR_RoMEZggFhGDy%V^2Za8o$OBlCob>RtA2oSmub54ni{rWx!>C=g(nj5gD0j$g7Hb$>5^o$@UUV(B6Et zbRo=dg@fjfjsrsx7p1&*mO;quV#k@;?(5%txmhoEy^nrjDkx)c{shQm>Vo{%xY& z2>n@Xik$FbqxyC~5uIIdo)xIfpcdv}MCnt-}F z)|;ndevgqQrMN6B6<(gwKKfB5UeG}YDEp~OO`3=%Z4slbQ0|&3=DD)~6?Vets+y~^ z(^~q*L_67O>_MetYq6m|b4FqThjrCG-ykw=XdM-IxLYdnihxtZd9IES%q{HVdF7hx z>}?QTZHv4(k~60Zw);k7@)Y73Iy)!(0_Kl`;)(I&_e+Uw1&Mfdzb5B@;o+QR{}0?`}sR|F;?u! z{Dcx4WQ_7{{V|H;TC+hrJz683HnPy4P7)8#W5!MsF<_#8Jf`TwY*xAf!E&t>A~ zob)2&F`~f3!&4s0rzj3hn6Ry=_p-Vu&kHSfnMfCQDf2$ECt=fgb#JA7&B^f{vJ)a6 zR!Kv^&6eJuxAiX5(WodKear!M^cI}CvSgg+6wBnA7U=qdQ&y<02kq!1EOx-Zcr}Q| z0rA?SyJx5xITQZmavu=Ub%bD(o7via z-A&*&6e8i!4!`%oy7z5}X?Jc{Z?DqyLouKdLp+a8WnK)M&^ECOL?21~{(Wt|g!{$y zmlF;{N0y zX~!Vz?AzPhYXzp8XQgi)1CHO0=GBV<<7`z4?K)jtcw(D@SlLT){lUO3J>We|JZVpU z=mB6O#dX7+2r(ozH$SB5*wACQ`&1_<5{r9T>{q3MY4*LB*Xs6bb zEE`1rB1jH?81i?nK2#M3N>s%3YuB;DwV(W)L1amT;P)^7tf|0Gfo9sJPvpL0~z2Y?~?L_;eNLwtzTpM?CmE$~C|aetmhR3-q{f8ZeUe2)%~ zhOa9`_;@dtZ1N*W?~2gD*k}&6`$5``OZL{ju;V@3ID6A8*m$}VgJE7W4JM3*2?|og zw3^N^@7A>q()ah5`Y6!VVciG2d$B}1kvKpw_Gj#aJ%9)YBDv5LG2zZ_5@P zfD;M_22y5$cHH(kvejg|v8V5%T=zsX}M*}d*Lc+Y2^ok-Y=Zu3Duo8TTL@+hG6v;QkswUhECx!wG}>#cLO zM!}j_ar5RY4SzW{$8UpDIkVd%b`!{TvXK|kpfLM;GGz=wWq5!ihUT7TFT{8_>++h{ zT$EAbC%5YPgwzkTe%H|lvU(ige*T(~jP@oJq}^llx0(``Jd!x+3n-ZVci`a_4`MY# zS2cY4>>A0>CV|rA&*YqUo(Ht{5>CW(I;b7aoFGBV+p**i6}GmGXjdKLIzE@eYU-K) zwQ7cSfF(o|xrErEZ=rBID3u!W{0R|f5CV%8n9x%0HeWg)Ym z1aXIK*^k$HM@qIC^gt;2&s@!NKxs}UEfm>zys?D4UnLyRIl#y@@z(i<3Ml$;feD#O zWF~tT02zO8lp?LVlg|DZK^h?qvA)&a%dJz2U<|2fYEwR#Yg!!6T;hCV!2bzi-Min( zn2kL#YKw3KpVU2MoaYYa19u!w*-7|e0Y{;jcZ-!We%d4bpS{K*e(ooI(LYs-rRM0dOoHRrr|zKOcew6usi@4Sn!7PmH= zk>fm-jWSkELg2cHcs;>B*VDGVL>686)mSBzp@4r8(yZW)+Oq5EYU!{3oU)cIZ&#d< z{#wMG3Ci(T&6FoGVlq_T;=@N#w#hC)p5KDX$TEPW4xCMHq;txD4zSkAg`0MR((vzy z1J;i0dx4$e?HDYeJV^N*noLag^yN^mUj4~!p7aKWa2GOS)Rcx#e02^M_wDCU)b0w) zATN6t7}}7m(OgHGT}y!-*EQDNE&o@^L;HkdPGyePd!0(!(-sSKoXjPP+D)zRQ{v14xWr;h3zfx%RKKJG}g*1X47-R5uyn|y+Ema(8JKV zL314A5_C-@|b zpP4PXpRz4@QXflJhxi1#iODSPyW(3{b8(l140DIuBa=Vf>|#A#JafsAd}0hKDJ}+2 zC|Bz|zXDX@2cC+Mu|N?Nh)D!l+ELwRZ}{8`1@pCX^3z}R8FgyPRDoNx?UqKIiA0~p z441P~YnSiu_?~pN46Nn#!CvkyN}CsYJlmcX{6~x~!`UV9m1-)bv@7tMk+Up?@h{j+ zxkb+c^o0`!i)e+96zoil30kPSNInOt!D{MJZyR1C{ZKk&thIwi;k=J2p=`n;K;%e`RCF=j2#IR^}qBoFFYMD(0u3*1%RmD zX`@(Z5@<@k89oy6xa5Hv&qopp?z>KXjEe@}46!L@>ij7fWiBlQ&zRNxIw_Mq`B7+5 zBx}h1`_hn}SZdBP ztyad9PB{@%2=oELyiZB1TSFqg+b4V21`zm4;)UD?C=#o9=h*PDhTc2x_abgG{>|V! z32eOrzC>T;gqa@}3+j0t6Pk!mN6=Se(Gh#9>G$FGtf7Ba6nU*o<^O)+l@jiS**Q1< zjw$=Yq^<;*E{GVQcxT9BgUZXx>oxn<|11Z}N)$n5gbL#nZcE9Tw2q^$@@&Ba0;n$UsGdfPkmay*X@%s>}<84{Op=!bo$GSPp+Pw z^oZ>Cr)Dx)S2PeE_7A13gYGt zQu)~^8#W^-P3wCP?va`v4x{o!T#L;R;mt2uvhp6r^%~7X&U4p=ysHVjD(?**;O5wv z232CvWZT1lqD$?JkIi2W6f^*K0Zv2l8YDwikyYeFA}IP)Jp(Ks-&7wnIliQ3;IiqY zTRgxVaM25H5t_%T9`RfE@jBSNgu{n9RH5!fCr+04;uCX}VH+D85gMRF=fJ?fwv7`b@w-`VcbqU{nWUL16pxwtGx} zwq9@B^eLaJ-Z$WweobU8eDAfYV{y2n;D}Sd*5yizi_hYA+Kbd?OMISb&To>JyFjtL z^P|bo?#uY`beTCa4EETdMJ*S2Q!?;b4^W()jdF|{0gbMko3F*nSZ~m5!cdzLJfro^ z>C*R*dfQYX{5Q_R-7x+k#}v z*3cfYo`4J#B~gIEK6tAGvvYR-e1BK5M1x9&VH^1Iw(Z85*#~XSy;R9s`{3Y8G|5Ca zi>8}jE8DC3WzGXtv)WDgFtd!(##uDimN%;tAeFMe0J&#f7CTS^gL*<)sadIQ zy)!pse*YIQ^vc|Ipw23h25 z?=L{-!lMI)cLes$Uc(69C)v3*72hnJY84!fi-v3Tc82* z$SQ=*)Vtf9?JA4G54-!5<~2mI#ayft?Q1aa3m<~#$`W(^^IAtvUG{bKwrQQ4W3y%vb za(nPsOvh;T0pEwGnky@{Ly`Q{tmcFDxed7wRB&rs)O2*!iYNU z%-u%nxV?$b^M<<7-8C?QQMbG7EV^es&g^3RbHTg|N8UYX%FZQ1|e0kio|&y1-?9nHp)fTlYe(;yJM?r4-Mf z4G*Pa>Q}7FG|R|oRz2meGWNZV--1f_fQ5wT9=^GM}DAlJHOGL zj-xYaRVQOK(Mro;o&a2LqqMeLX!_6Gt)ko69#}1u3w;vVxkPLHBS4ydyvrq2hck<6s)?;|>1EbVSH>ZRVoe3HWiV!U%B@y2YljYGheG2XT z4;tNHqX)VgEcVa+M2=3e-}~jz4JE-W2-ePVcT1hSJ3m*)XEp4kk6yA zLGs+y*m(bnT}l;x34rZOJynRYkx{Tr*4(E2_62y9~vfd4!JcVc-Dd8Rzo>q~t-rUS+k zu#VjcRUiOk=a9rBR+p5N1YO|a_yCk*NcNJKlgk2x$Noh<=w<8d$!`tElol=Kx^Uyh1|q z-O=sZ+E|E2_CSDB!==YBZgTJV^1^`47zQzvgp^oWnAd;`5ZfHf6`HFc6nUx zx+G(dm&1U-?IK}m@8c8!OC$x*=#>kOD4W8f5{@I%Q_KKUc+~}z7HoNHE zSK3#39(pU|7|K?mC6xQC|z| zEwI&;IJV?IUHKZXyxGGlCwd2-WtwoS6W&6zv3gNaQA{7ge+F1q6Otf? zip)t@)@)gEl_b~umKlD11?oHX0^DW1Fr5&v`-Mlo7 zXf_fTZ@sP=0V^Jr9}^Q(wzg|#{M>%Bn7t*g5724-63)cILSQ-no_l8C=_fAiG}{>$ zn(h_LJqgJJn-CC|p=E+uSbser&`_$FZ`^dqS6{W*#p~U@IowDnLzfN*`)lnj=;Cfk z=m%Vc<|iHQk5)L7^ETh!i(+755!J9@Yy&0JpM9P{2zt(k#(L3c*tHAZT~cFZ?; zhLrpjn81Qx$+eoqfvUBCdpF0jquzBrn0o-Yz)Q;=6nfAt{4R#JS+D>>+uu z+TU}6WOemm=HMX#f}25X^f!q>bs#j@o}&=A(gVI+QMcm4ouCjA;Py)as4j?B{6Yro zdGLK_cxP^@(G@nKxe1Egh)n}1g6hvjdga-d{uMfR&CSi*4FZQH{_JKD#&7_mc?Kfs zsA3I(IKfjB!7X{~E&U{br1YL7o8tRFo?T_o|9GjZb{X72JMtPYudTIJQk&K${5;6c7 zQkxOFVgXuAT3BeHH#W7VTGVco7e+?jyV2#KZ0+qYt7fQ7|_w#@=$o_&H3^WNB;74>F zfV!mp?$O#Qe0hIC7FH+@>&?ppk9UXS3E?3I(I^dZacp_-lekIkev^l_|fN&_(;|)2_`c2NpETWySlYzw3}8f5uI8- zot5D90^k<|Xg-&VB#B=@CmI@;&YoTIrx+Kn?hcfPB$Ukqi0`VD7VwPy}aM zs{4KK`1lcTidcjVf(z)D22W6^R#t!4DuD6tw_xDm$s_ckL+@F@w>m}S=OH)++Ym3n zHxYo?KziqK|B2au`49lf2c0%B zVF5!7%j^{3A(E!?D61-a)kV(fTUj1bl0m)Y*s}axS4A&1y<~WRLB}ub6BiXuy?RteWuh=pGlME*u29yp#--!lesn%=Dp+Htmn4rBu+p;gB{`et?Ey-_$}=E^Avy0 z#$|#R+ILvn+K+{q2PW`{sI$(iH7l1Phtb$I-hsu>(ULK;N1U)Xd$_}43frS}M{gx|RlV#$G$68Pvm0S-K1qbR!34pA5yrR!0m z3Ou`*G7Yv^U#dOBfBpDK);}3NklBOa4~$f}yTi*%X{yV-3knB0yr&^gsqtX%lPZUaz@RvS3 z*Ifk+egHdk1Blc9_bSq&f?HN+@JM}~qEf(!&-iQn-UapDmaft0upknH92jV}cb4^tHtcXR$+q~43ay~NEz zM1kU!3NDP3EQqeq2F3 z#$R$(#zD8BKZxbv(Rg6JgzL|-IlZ4KOyYpAGt*V*@0xM6hq_y70Z%|@^~ z#QLm%1A?@wuna?wzpi5f>&3XT4RqtiiBB_D$&#liI}x~i>bqy&?+t25P-Flx(QlU> z01;_0gYudMDlILYD()ln{Kbpa6S%r2K&~6T;4;$!+x7leUoH)_O(4q_1cY}Z_lBjs zu3g)O4PAn}u{IyS;)q}+2%()y$x%;o9A5p*tTkb-=W`-T<1!Q63usk@I^us!hbm+l z26KhO-Whx{zGjgLL@U zdnVIs3!2>UmGG+w8=vlM%`BX`qm_pfIuCjC7MP-oT5yN{k{Ez0>bD3MoX;{zpqfha z;-8zJ=W|_@qM)Gox@!ePWL==)onb3pq9DvmzICVVh0z1sz{(z73)N47!&AK>FhL<$ zR%V$J7J(eZCXx+U9b}oh+LdVaOja!q zDl*4hLzbN4h;8_C&zSMy_(RAtAu&zp@S;X=*v#U${m*R038c&pF5Qd)<_RQkp2DNu zI;r(zY{p1M&cs#q;=@IJ=Dt_o9(<75nL=T%Pt^HEyz`nKS0lXT^JPIQ7yNl!2WpdM z?Dv#X`29G7{w2*_<|0SCZ`boD`=e*d#8??_F`{N_P zQ$Hmm|HsMJg5t#`C0bli9CUQ_L>^-Ue@T7+fW=lMgs}(*hw?PXl?Faso9R~aMR#^6 zM}*C|un~oI@NMt8>p>BC)mevlv}bEmMsfE6Q}gwcg>gNUCh@>tZYD3F$d2K{h4DvgxzQm=l_Q^?J1h{}mtBgT?0niC{zez#yPUU_C zob`;PUmegRy6?b!>glTpiD&>YLP#i?wqD0WQlC4Y10x^jh*;e;b(cEm9S0*69$wZG zE_Zami2YsCR9IEi4vCi8SeMqh|K?qecwE zbL>$KA>woq~Xv7M1u`Ez}OK( z`e$j_mHxR=k_WzH(*dOFEYCoUOQhWdrU>9@kfQE7IDn4uD!agO+*&LBaz?7m#m9@Z zaYTdtUOayuUvDO={mCXebnIj?PZz^?*QsYqzPrG%nrXknKyzpIAW1-`$=ZqU>mhOD z^{$v~q5w^?VKAn+(30ERV+y1m2M6Bf1ioKS_+*{^W&}6rEM7k=&@3gKJ=Tj*5i$=a zK2`*?J%PajjTA%%>O{XRRZM_hd5?fdk1|wIqo6#>50ar=s;<0UAbhN-AOgZiFgYpr zOvxq-(3qe%Y|s&;Q~1(@*fgrwz2(Fr?n^{BwN1WfkZ({(Y>on6N9UHfV@Ec@&K}x{ zD&F!}O|AD2Jdsj(plyW~EF#agn0O4m>9+2@o0o5xZiRg#_EoDWbmF@02wk4E+o*q( z*}&G6r$X);+rW~*$RgslbEnwPf{yUdZAZwqOUeSpah4)Ut;+)0&S(qRh`HoIf2(z_ z>fivBc?p2j=rg~fO!}zi6a%^p>3R1S?sB~Kij0X2w|U1X?d!+%sD_&C*n`8j~p00I7=FCXa?n54xkb%tGjR5;xekgaMnN0ba>KvEUB2qMAX z7Kk!b@I<=tQ4}phGU-Vp(qXG3CtrMGosR?{l^;Sl)6s#3z`wl_lL!<*bLdMS8UvC9 znw-mF@MT=w#mb<900je(yi2VZxMinYD4odt+nNlI3K0o<+9bFb3OXY51(5=HMiM=Zv;j5hfBOv+^yxDCL6e0> z0{IZP7ZDxTBajDz66Qbe2+-g{NZ?yG`4@2$O$2snrgx!SK-u_x)1@IdyAvh=?Jm(&fJ$+PV#TC zfe_BRi+OTFBJ=N-*^dAY<7e9F)#jrH@F~|{{w2UIOcwY!0o^seBhbSFj~0;LN$OnX5rPT&_fZTM z0hz=x@$Nn9);w-jx9{zggzYfUKvC!qZpa50M{m3K(Ax@unf&ks@Lsr8e{$QvK=h4M z5vYX!a}~Yw%0qy4jL?W2Un-c5m?lr(SSo+2GEM@vu84nj>WD* z090nez(Zs@f4P$~cM_^&GBjtl1wOKhuXW`<{JxKY7Y_zo26ooqwKH8F6p&J2?>JqC zgvi!5Nd>S-*ji7p=K+k2K#mO!4TD1?1s#fkuioDqxhc_V1N7qn(^q*acyvfliKwkJ zo4EX0me1a>ie3`faslM(Sa!ViP5^!eLWAIg^`VZL8U4g}8vnWoct6Gy5DieC`pLDsIF!P#hfY!z#@Xcd6%VAV&Kbd>*`wOI&}?NxBkA1zb?Q9I4vrM z+mNN5rLYf*@VrjYsh2#9+}Ky}zkuS7u?=`xf&rX9h_8_UE5ZL*PXJCk=S|Zh83N%M%R!s?7^<>SP~+|G?MwSDPc8lFMA4H= z_g*xjr)qW}O$-+Ji1*LZR(}dVJUAepBmf4qpcE(q|3AL+5+Y#pEgC@S764r36%bg? ze}svNN%#?SdjZsc1XSSNS=R_?Njn@k>ms}^{q7q>W?a%G{2qYbjSltr_P*NRs`*ix ze+?yWAe~B&qeKNDvoIVGZq(p+6AELX6v%S=(I^V&f*`~)18CSD9Iljf{qE-W-_Pky zOibL-VhI*RQ>y-tA(oD2&s}I4DRAbUMLc^!ju#7!QMhpcz%2O!u6=>r<~A7_83qmx z$*~52E&r_i6d=YidGP7UCl>XdNOMcePV%zU_e9{q0Z?BQ_a!2K%cWaBi(15$4p^}b zNa{Meekd#BHRl9s-anHj9ER{Nae=<3k_tn?S0ls_F!~eS~pXU0of9!#L>T`Ln)))f~kUUc={V9C}*0#tj~t z8X6k8N@XJt0RYA}6eJ%YwfE8?C+liti$kk(TAq^(rLHhATdLn(cNDP?XfaS49Oh`Fz2N1e{y@hLA z$azi=>d(#w{=5YmqtOe%#C@?X_TmQ(0*ojm;TC2jn%%SB9w$BP4zw6fDSE}+N>ioTOenq6Dkb{WFtlkoU zWo&HhI9r7YTnpR5Nk~wrqOGkRsOdBlo?FxjEH754AWM$UX{xjMkgT^)1gLgmf z+nJfYnyYtTZheic{auMb_FcPd>>6C#2?*}U{&_VE1H*05Rgsu)F{5drV2~#mMu>Up$R0ulQ;qz2N&72MwwccgDUj z8{Bsa4xQUSW}I4X#3hA<-ymYjcqRhY9&-bYBTJi`oCu3*MTBG=@!4{ModVt1rY=UW zHrh&37iwv+FavxusI1H&R@eYuPJLcX8+9HcfQcW2gf&4Mi`sw>>zr6W{YA<7KA7$r z2eGdHBr9N_fQF>m>}P6D%*hJ8*>;2*$Qlj8Yt1Pb04{=Iu2m6+e&QKN0_YB-iJlxm z05BQ;UvKvIg9Mm#Rqc@G;!DMRPCZ||hlS@n#rN^$%MFPnbc4cl-t!AQ z`8$FnObCL%Ad(>f1cO-dSFRI03ESC;jiD6I26{4p9Hc|Wdf$r*0F+v)8U#0M#QBQ= zxPH%Yluo#fuNOw3ukqg1AhJ>YIcBW%D9r~=2_Y}x5e;GXXa`$Lb#mn&%Q4R2 zg!nGTi$gEB+r)fNR&~F|%X+n+U)xbhc%k&DXC#^2%n*zCuh8M8xt-8M@J4uO%{+eH z^2E&(>AGna5b+yD35(6>exjo5HPg}+bCAa?T9?_NvvEZ8z@I38riL}nz5hfhWmoJ~ zN6)wAb3en=P7HE7R-Eft7q{(T%$Duzhdr(vOA6EHtW>A$ES;n}_&ob3o{|B8S4ed| zIl}QY&NnYA^Igcw5pi4PGr74OGgi4PEG(>=#*YeG8{gOnMOc8Ax%=pJ(glcI>o*wu z*ZP`)-PwsKJ;Ap)dcTn>WXJYJ`(9|YJ`3z?4{ce1U1W96JG$Dv4;vJTAtN7>c>Nr) z>+wUxmeYDw$4fQIPz5l*yT$Vbh-&ZFAx|}j(M?|QB*$(>&aPrHeA?3cBC1)Ztd3)N zO@c|H2gC2l?Bn~zAVN?51N15pq1Znoju=5 zqEmiO7*!W%&eBr=CB{ilixG3}7}7q$b*B$&=OtvrzmD?&6+mmw#I zf%#9_YzF0g4+f?q$M78&87~)a9ayC5(i0yZB+B7hczh1E)hH3+$DB&4R%9M`Y)uxH z%BVQ|pqqQgV5b&F0(sfl)nyKjl&`6LIj-u73QO%FZU_(z81ZXUcS*NLlHZF>OT7n_rznjx^SIXyHY;wz=1Wa)!Ogju{?pF5ZD9OIST7WeQq zwupx85z@G|D zRzF9w{MI_T9%|nIk@t!$QL4M$Y3Qj*4AtY;oYVMGpT9Gz>alj=?|Q^Ysa>Ct%Gdv3 zIql?7&)ISdc)_ZD=L;&ilckT>GQ4W7puNV44_B-it3}`%9qRZ#r0vKC_CBbpjGWdP z82ed&P#;U1cHI$ZJpDL#-D^(B8pcAV*BBIkA(M!!Ysun)-tZf~>z^O=Qq`Qq)de0)z;kD<4*Ky?CZ3qtq0 zIOax04T(f|z@=AdI6GKh$9~yYlk?%j2gN9_^Fwy!WG?oh6d}jy4pLhERp{VnuPOzi>yGY-lov&iW%N8fDqKIM8TkLo`>LompRZloLW>kD(&B9?P_)Hb ziWYYQMFK%vC~ifAdvU1X5v#TlXPvdq&6%6Ic$0Z& z?RR89d-gm}HtUn7IAG~dvIYtCPDXEdkN*4R@0mK^y*hW92nD#uf>k=yCeJ3`eCE`R z;bqYeP-P*WX?{hG5($7K*dXV)=M7WeZ*t0B7$5$eJRKp!qiO%Xa9Mk?p%F3uic%^E zB4o7II`BuoS;`-`x_(ldk-e;R9@t1qeWnxGi0oUW>YploMKS<5{j4!_^r^H@`-u$M zV5@@GZZ|2z)e{ezHEFJ@CX`@Gsk(MIDb4x4T$al38C=z(K#DQYSycVY=L467Dntyv z{M9y#EOr4qe!=Rx>1;w;z4?>27u)fHKFyK5>?~had!Ng_y0NdRA>R!r?yM8yYLH`p za{TR$43*iMx1EZ{Ud@BSD-k0%mq*{L=b~L(@cE&J#2Jc-4YMve+(z4uLDVL84U-jw z1+qyCjywgzQ{m|O8=chu%=hx zZ}?IN&$IDSD-Ffk$}b_A#HeQ;hn?^nNXtY`W!rf?xam-nq|;ttPArguF*)5tUaJ7) zPu9wNo;jqWffx|WcvwbdB9nnt|a}t0;cdle;#aaT@I#5eo?kSxgH3x#^~VY@?-te$PHiL^dGOS^r3udn^4zAXg3T z6DeKVk7nY+mv-Lx?O`TxGoU?cK~0#Lgz}1sLp>h|hn&pbd7gI#ME}2B)?hH&3vr=S z*fEOr@B=fV?d7Y*=MoX%r?a|a6f%X~MFz?hiKu4~1RJ(bYkxb>A#G?Q+-qft%Gig@ zBU=B@4IKe@rZdqVZTnE(poMl14lAX&p)&XQTgDUK81ZQNWhi+2kjPP^L5 zQJ|EnpYj&8vuP>qwFH-?R@WLQW=n|yWP_FPb7=A5H|~(fQ4)nx!w$bm0DHxl`!g>% z1hFB2cNvN<4>n8(qF?6pq+=M7@v@xo$XR0;+>Tacit%lRmrIx=zPu!TQgj|K4-#Hp z&LkzH2*s|y!of(Vn9nygp157488OacGOd#92ZS+JW247}bmMdNF}Y;kmai~egm=J0 zy5uNe>G^kSY_G2~Il$LZ8-RbtDP`EYNdoBM?ZnA%yrt;y;HnDMY1 zW=PWr^`B=#vy+}!x%-|$*OvhaV=vjOG071T#{sA**4LeQMa8z#Ct@dfkY*S$8OhZt z7WBOl4$A{_xCqU9YK{!WvfFJu*k#IZTkPee$vKsM3FLvpXwsV&34)=}5RIn+@3w8YxVFb`1v*sV16Bcnwkp`j!&GEx~)QW=~z zO5D`E3IGDY-(S;Uzp^;I0%EunxEqp$Vj z?fdt@IyxL29BB|X`#y#iQU>ydP8h7Z>9R?Ii8}o7rRYR_DGgK9q=(gt1IU4Kv}{NC;tJ6W+V*e7XBVpaOoILT!3RQVM|%@$nl z>RWM}V}NrabWRFUuoC|8qD(ZrUH{mzb4aq3TK!v(N+{UnZ8`=?@GIh82dM~xm6 zH5~eD(85mOB_T}nI|AP8FJLq7OSKwmq=TZx{4CL=Ypvcb^QA6kWxc0~Xf1PtD{w4}x# zOsCSZQxci2g}#RDfy?0xCnz2XmR^z__svxEw>iyBnA^O{y5tgu zh717@374!CmzHBsIx#9dOc`#N2!Se7Lf5eH-QgMr-^420MC-CW9rS%V^S1Cim(vk{ z`*X5n!G1+^mnGL{mbEcBy1;dR;(0bL(M$jdjHi9`>wQAv(3BVj1_$| zH1Td?O*qb_zu(3z1jfjPkeTEVX8<(i7x5fE4yfF8s#vb-29*+PH9RJdV|g;@LSy8< zEkHyk7ErL}?VlpkaszK4B_xKvi;uFrWI2q%ZrMajj13!)_G)~Lw}CHYUa>ezwe(Np z!|lA<_eBRnb63SL@~XbvrFKmYV_^G*g}O;1(KgHJV(X*N1Q?;%W7im9(m#EE&f6!7yU^8LyO*zG3#xmAK^AN>(`3PZij`eA!hj&0_TT78)$?8 zGFf}3iqFY`zoRQ)J{^pFm0@RJV&T2=^>W=N#Fl-(<=w|`qKUYZkd(+`Yp-IzK4w^KgqRz~G zUHd+r#JG;<3*BsEtSt}q*!=#|(6^}RXjbBum{yi41xE&U3(k@Kw~W=l(QyyvJo2*f znKj245%s%P-`_-d*Z`_0;gTD`@(`!Ah9d6sAq*>FQUiFxk6srZPry`f-6pMwQ~9fA z=^AQ~r&);ALo^#TqY^3;NeB+QZe=@EkKNd)M$CGY9e(jSTpkg2;^?QJ*2|lAdk=Xf zASL|eN^EiI#PoG{)X(yJGIX8~AGx8UzIPrgZy3Ub9mbO*Qs0O?84EdD(qVs8R_f&( z)(S?G3frrjJ5rm6{{AhLX??0-F0w8xicQdqgOTPl@@`M*>N|bIjrWLy40(oL++AzQ z>z^=V3xbi^y--U%eB-}w>=qt2@NZ#xTX#mNLmG=0IT#YT=3dbCIV@H37 ze>(xU&z_PJ_1{NyNr3ig$+U$xJF!2WO(sW3O?jecZ`_Q8H#tPv3ydiIFj`-VX$)L< zr%)nyvGlt`bq%k(_|rJa;KuEA{c%m+R#5cvC};UdVR5XYj>TM0?lwQ?wtLZz0Xru_ zFQ03>m;C6geZknL89iRkQG4J=wR8tYekrMMk0>Y}lSsQzm;~=T`pQ$4WjgFUK6bkl z^syg!9L2c)HtkqQG3I`A0yNY%VC*pQQgaHOW+G{;5mr<HBWPT4lhDy(k5fLayHUAKS{-a(SSa1{T z#jO(#3B-4qQTSd0-lBzf;QIL2sDnP?m-E99#;0;(4XkFwQ|s$sn9$JH-n3@wO!cr8 zSJAlhAKHsf6GQyL9o&oN8Fl?|$f$vSole^5b?$mi-f_tw$|mA4VhnM>A>3J>$)@F| zNbo>nrP-;$y~6cp_+gEfO{XPnT|AYQPKAnly7Y@bsM5B8D79Xv*@val?idDgPKKjM zEqa8?bB&7a+5t_Hk1gCo55hu|vh3|FBg73d2LyTVG z4i@x!u7jr~Hw&h}3r>W6C4+F9b-iE1H=L#jWKks|fnfCo9`K1Fj<*~J4utJh#DwZb z+pH1g8!l|kZ~4N+A`Y-=85Z&WDB%K*8HM3o>$rn4*C3HhzrzQb&ma#f4i?;k@ds1D zKFU@`goE*>UGI|)8b)vde-26i)%34}$HTwgGjMyS7mruQ8X$v{2d@ydL2EItTe`~b zE6}BakqHLQv!UY&rkYRx@n<&VVq#hX6oyHYy9y2R2A(bD+i?QgW;40IFL-iolEZG)eINsOST1Bj&)|3sMLW zSW7hM7_7CuTy;C*lSRRCELA&veltZlj?F^tRl~dfMpiFoRZ(fJTq?2kP{;O z`$IO;@VNxGIao8WUiWN*2C8$DOS|>sGcRTa{M+aSdckG}GGR+EiCK4sNa;lAGrGFu zj0KC07lSD%sWa5`6PbysJy%lzs!ry42%_L^ZK*}8Hz`q@8$S^~qw?)(gP+@u@n8J! zjrM*RIK=jTu!tuhiXih%6aaxuO$F!M*$I3ABoH9+BHpuqOxN}kQGVbom{n21rwKQ> zUb_4Uo__it&oL?0mQ!UpdU|>(mX?1TYB6GX;6tzH!n@%I*pCBQ7S3@2Sf*c24^9pa zYR;zfbE{vKallH~*hMR^<`4t66*~EiJ7Rk7ZAO zb93_)xr|XLV|($Ur4AdbxCwF4u-|maWg9OnB2uJ?wJrs|{~dE3$l$776?1BR!K%W7nXDA=R5;@^!>4C6aP- zA;rx%?&BD`0*o?EPk(kFGo#tB z7EC!k%wUupvrq=dqHynD6a^x^VjA$`<<%w@wGR_hSbZ#32*~a0PGndOH-j7aGmyH} zH(z~U@)VWdW03-9UMUd&9?Uy+FBSK?F1QJ(t6!RTc0J|>f%#g|zF%-c#gpby^g0}x zC(#2C!Gt(7{ri9T%A&1W1NSUZlUXps+ZS_=>YC%$JgVhH**XkH&ZoXwji``PQJ_X; z{L|M0KlSCYb{10*jbg*;xoN7c?!?=E^?RQxVSv2j9^*PAFR9YUsoHz6X{5GEZF#im z!&iAHH+Fw?NFcA9d3?rB;iAJauClQCa6%^!Y2z#(JE6#{cUnx3#PLV6Dm)I8EpOVg zV4yR`qUhc-u6st*wWatve3A^!LZASUNPfK?&%`?Q8yK=jZfb|ECqg{|Dc5*3mId?N z7di@)E7zI7x6o6Qo?v5;^nQ;nat{fL+^eOw6mVncDRCQRmgR@G-4` zHHIev5PPjamXy|(3roXW%H?>>23GxAFNZi#%`~tI4k-o-6%94LLXf?!42j*EUvbg7 zIc2C!u5BLM@PDzLO;mWRR5bnOlMx?gYa2Ks>a~(H*5Pp7g1lpQDmn3^bfXevSj>RT zK`oPj*o+W+5av~q?&;79up9+PH0*lChzVq781p-OayR@W|4fa^>{}kEk>v*uzFbL3 z%?jb{r?S=)tlK-`N24({R;8kc_~V;=qD%Kms-<>Qk&2ZZnohths_CR(cBzIEF==b? z+3bE<#Z-DM0a66nK*n>W-oNH~GaSw*BX51AbI?9lcmF zp052CO+>Gez zdf!-|PIzUCgSVFurnN3|kMi@2FYY*28`Z9DphGBAq|PU1xvCxaWdfj@Y{j+_CCIo+nwX;~Mp&yrXi%&Z zUS)YEKNC)Kf8hH;;BSGfBHO{u&x+C_Tj)yvL0vO;^;`*0zWwW<>BL{aFT`IVJgp7< z^Vf{dK7~qnAy2%>9Dq8^0PAi~<{Jdy$DYqvMxx zR?dn=L`hA&sF7jy#0(I>Tb$M-dSIC|QS7cyZ$c~kQoPt%-ee=h!;U}yleng#yW!u`4yf3rtj#f~Fnayr_L6V+pb6WTZ>}Ps) zJ&oz3GeC2N+clU@fuBJ_gQi;i!1cWzLIj!0OW^R|R+L^pKI~wg8$_9yd7heFu~o3| zByf$4Dz8t^iU8k-I+`v^HELbD>yK_I_v0yk8u8-we>r`Pcj>|@3pS;CDG1sATvTO3P zIax#R2Gx1bW+^hgt$a}O1-=}c7l884f48R&y&+pYTHr6cs?TNSI3A5c6;!Utq2JJc zxg^6Zty#xH&;my{NuKu?03Wdww`w6oGfAZZ62PhPvm$|!X!s06ie{P$+ zRyz@wV@bykS<2G)-UHQ%d^(J8%+v5wagWeIy1dE1$QxYc@7LEQ8*%0ukyQs>sq?#Y z0p+M%Gw($O9t4iokO-^W&}hZ2PE4cc4?Y~tq@^D>UnKs`6H zg+P9=9&A2`xslm&kNB|X-AxMm^g*Luc@wB_HlOz~IFt6J@FE{RqDiY>hW~5+HLSzi zQI9pJnBTz-wb2Ek$=gPUYb^<+2nEilp zLN_ZoGG@DPH;nz5GW7skiPgIi8bMX;^81=1)i(7^*CEQhv6GGSl1oqiY2h)}fd;6j+HfA{DEb0LOogLnKs{N}WNY(QPci!G{=Htn;}L}St$Ji#){67XEbClCETX%W zO-^&8V;ofVPJ40PdvGlUW7_qGsGEg?)q?v@&ub$(k!zh6`&Bm6B_c8wOpsrWf}ln5 z;8^o(YAo+&y&T9SYg&6j1@}@lakJd?TdjTuE7)y~jh4Uj-ylYI{>4=^OlSx|+RUSk zFTjHt{Lj@c@4xGsF$-2{i+46(`E{=8h0;z1j$4UmI}`aftAt6oT8~)n+X%YDRygs! zrBw=DIB8)(h?_XP!g1X9p4T`=!@_tAI`DwmJZ_$w@$0>X=q|NSD_lh=z1;L60Y-5j zMVP;sc>(m+BKI?mPhFxe^h?vFwg>|{9&$URyZ!z<8#iyf8X!g}kfkS4DMtpoXZg5a z(DNPO1M8!celthD<#1;~FmpdTfk$DwfMTCWYer_=Idau>PUn^hmAqKA`)wx-yEsZO zC-re0a)(fmBrU6sBO)9sC1zFIj4JUqjh$9q$Q5K3nFx75P@TLx<1BD7NZ5 z;mxPe`j;BE$T+vMrsa@S_(AcEtvEt<`@X%48AX$QI!L1^t1h~c4f)O1-D<_jYq!?0 zdqVaKI%|&O*(eqMbXT>nJ(_G&u(20d-l>etR9;ko3aF`IdJQa7DIU!QXvMW-R_Q&9 zY%K<`zRcVrr|0~(+h{rD z9kcc@6@4vKb&o|FoaxyerM{7rzqN@jU9$_(pc=$_U?k(#E!bomhptl@+2IfF70tw8 z28YEi>c-m%^G1=c0f-MDXwUWkAEJx@Lwxh + + +
ready_i
irq_o
...
cause[15]
cause[1]
cause[0]
masked_irq_i[0]
masked_irq_i[1]
masked_irq_i[15]
16
16
32
— побитовая свертка по ИЛИ
masked_irq_i
ready_i
irq_ret_i

clk_i

rst_i
masked_irq_i
— входные сигналы
irq_ret_o
mcause_o
irq_o
— выходные сигналы

clk_i

rst_i
en
cause
16
1
0
16'd0
irq_ret_i
irq_ret_o
16
16
irq_cause_o
{12'h800,mcause,0000}
32
cause
— внутренний сигнал
irq_o
\ No newline at end of file diff --git a/.pic/Labs/lab_12_daisy_chain/fig_03.drawio.svg b/.pic/Labs/lab_12_daisy_chain/fig_03.drawio.svg new file mode 100644 index 0000000..fbe0bda --- /dev/null +++ b/.pic/Labs/lab_12_daisy_chain/fig_03.drawio.svg @@ -0,0 +1,4 @@ + + + +
irq_h
D
Q
RST
exc_h
D
Q
RST
reset
set
reset
set
mret_i
irq_req_i
mie_i
exception_i
irq_o
irq_ret_o
irq_cause_o
clk_i
rst_i
clk_i
rst_i
Daisy
chain
16
16
16
masked_irq_i
ready_i
irq_ret_i
irq_o
irq_ret_o
irq_cause_o
rst_i
clk_i
rst_i
16
32
\ No newline at end of file diff --git a/Labs/10. Interrupt subsystem/README.md b/Labs/10. Interrupt subsystem/README.md index de17b96..49919b9 100644 --- a/Labs/10. Interrupt subsystem/README.md +++ b/Labs/10. Interrupt subsystem/README.md @@ -145,7 +145,7 @@ _Таблица 4. Список регистров, подлежащих реа _Таблица 5. Кодирование причины перехвата в регистре `mcause`._ -Нас интересуют части, выделенные красным. В первую очередь то, как кодируется старший бит регистра `mcause`. Он зависит от типа причины перехвата (`1` в случае прерывания, `0` в случае исключения). Оставшиеся 31 бит регистра отводятся под коды различных причин. Поскольку мы создаем учебный процессор, который не будет использован в реальной жизни, он не будет поддерживать большую часть прерываний/исключений (таких как невыровненный доступ к памяти, таймеры и т.п.). В рамках данного курса мы должны поддерживать исключение по нелегальной инструкции (код 0x02) и должны уметь поддерживать прерывания периферийных устройств (под которые зарезервированы коды начиная с 16-го). В рамках данной лабораторной работы процессор будет поддерживать только один источник прерывания, поэтому для кодирования причины прерывания нам потребуется только первый код из диапазона _"Designated for platform use"_. +Нас интересуют части, выделенные красным. В первую очередь то, как кодируется старший бит регистра `mcause`. Он зависит от типа причины перехвата (`1` в случае прерывания, `0` в случае исключения). Оставшиеся 31 бит регистра отводятся под коды различных причин. Поскольку мы создаем учебный процессор, который не будет использован в реальной жизни, он не будет поддерживать большую часть прерываний/исключений (таких как невыровненный доступ к памяти, таймеры и т.п.). В рамках данного курса мы должны поддерживать исключение по нелегальной инструкции (код 0x02) и должны уметь поддерживать прерывания периферийных устройств (под которые зарезервированы коды начиная с 16-го). В рамках данной лабораторной работы процессор будет поддерживать только один источник прерывания, поэтому для кодирования причины прерывания нам потребуется только первый код из диапазона _"Designated for platform use"_. В случае, если вы захотите расширить количество источников прерываний, вы можете выполнить вспомогательную [лабораторную работу №12](../12.%20Daisy%20chain). Таким образом: в случае если произошло исключение (в связи с нелегальной инструкцией), значение `mcause` должно быть `0x00000002`. Если произошло прерывание, значение `mcause` должно быть `0x80000010`. diff --git a/Labs/11. Interrupt integration/README.md b/Labs/11. Interrupt integration/README.md index 32026ac..332eae0 100644 --- a/Labs/11. Interrupt integration/README.md +++ b/Labs/11. Interrupt integration/README.md @@ -18,10 +18,12 @@ _Рисунок 1. Схема без выделения новых частей Интегрировать модули `csr_controller` и `irq_controller` в модуль `riscv_core`. +В случае, если вы захотите расширить количество источников прерываний, вы можете выполнить вспомогательную [лабораторную работу №12](../12.%20Daisy%20chain). + ## Порядок выполнения работы 1. Интегрируйте модули `csr_controller` и `irq_controller` в модуль `riscv_core`. 1. Обратите внимание, что что в модуле `riscv_core` появились новые входные и выходные сигналы: `irq_req_i` и `irq_ret_o`. Эти сигналы должны быть использованы при подключении `riscv_core` в модуле `riscv_unit`. 1. Ко входу `irq_req_i` должен быть подключен провод `irq_req`, другой конец которого пока не будет ни к чему подключен (в следующей лабораторной это будет изменено). 2. К выходу `irq_ret_o` необходимо подключить провод `irq_ret`, который также пока не будет использован. -2. После интеграции модулей, проверьте процессорную систему с помощью [программы](irq_program.mem), текст которой [был представлен](../10.%20Interrupt%20subsystem#пример-обработки-перехвата) в ЛР10 с помощью предоставленного [тестбенча](tb_irq_unit.sv). +2. После интеграции модулей, проверьте процессорную систему с помощью [программы](irq_program.mem), текст которой [был представлен](../10.%20Interrupt%20subsystem#пример-обработки-перехвата) в ЛР10 с помощью предоставленного [тестбенча](tb_irq_unit.sv). \ No newline at end of file diff --git a/Labs/12. Daisy chain/README.md b/Labs/12. Daisy chain/README.md new file mode 100644 index 0000000..0c9e51b --- /dev/null +++ b/Labs/12. Daisy chain/README.md @@ -0,0 +1,67 @@ +# Лабораторная работа 12 "Увеличение количества источников прерываний с помощью дейзи-цепочки" + +В базовом варианте лабораторных работ вам было предложено реализовать процессорную систему с одним источником прерываний. Этого достаточно для выполнения лабораторных работ, однако, в случае если вы захотите увеличить количество периферийных устройств, поддержка только одного источника прерываний станет источником проблем. В данной лабораторной работе вы реализуете блок приоритетных прерываний и интегрируете его в контроллер прерываний, увеличив число источников прерываний до 16. + +## Цель + +1. Разработать блок приоритетных прерываний (БПП), построенный по схеме дейзи-цепочки. +2. Интегрировать БПП в контроллер прерываний. + +## Теория + +В случае, если в процессорной системе более одного источника прерываний, необходимо разобраться с тем, что делать, если произойдет коллизия (наложения) нескольких источников прерываний. Необходимо организовать приоритет прерываний. Со схемотехнической точки зрения, проще всего реализовать схему со статическим приоритетом. Одной из таких схем является дейзи-цепочка. Пример такой схемы вы можете увидеть на _рис. 1_. + +![../../.pic/Labs/lab_12_daisy_chain/fig_01.png](../../.pic/Labs/lab_12_daisy_chain/fig_01.png) + +_Рисунок 1. Структурная схема daisy-цепочки._ + +Дейзи-цепочка состоит из двух массивов элементов И. Первый массив (верхний ряд элементов) формирует многоразрядный сигнал (назовем его для определенности `ready`, на _рис. 1_ он обозначен как "_Приоритет_"), который перемножается с запросами с помощью массива элементов И нижнего ряда, формируя многоразрядный сигнал `y`. Обратите внимание на то, что результат операции И на очередном элементе нижнего массива влияет на результат И на следующем за ним элемента верхнего массива и наоборот (`readyₙ₊₁` зависит от `yₙ`, в то время как `yₙ` зависит от `readyₙ`). Как только на одном из разрядов `y` появится значение `1`, оно сразу же распространится в виде `0` по всем оставшимся последующим разрядам `ready`, обнуляя их. А обнулившись, разряды `ready` обнулят соответствующие разряды `y` (нулевые разряды `ready` запрещают генерацию прерывания для соответствующих разрядов `y`). + +Для описания верхнего ряда элементов И на языке SystemVerilog будет удобно воспользоваться конструкцией `generate for`, о которой рассказывалось в [ЛР 1 "Сумматор"](../01.%20Adder#Задание) (необходимо сделать непрерывное присваивание `readyₙ & !yₙ` для `n+1`-ого бита `ready`). + +Нижний массив элементов И можно описать через непрерывное присваивание побитового И между `ready` и сигналом запросов на прерывание. + +## Практика + +Рассмотрим реализацию нашего контроллера прерываний: + +![../../.pic/Labs/lab_12_daisy_chain/fig_02.drawio.svg](../../.pic/Labs/lab_12_daisy_chain/fig_02.drawio.svg) + +_Рисунок 2. Структурная схема блока приоритетных прерываний._ + +Помимо портов `clk_i` и `rst_i`, модуль `daisy_chain` будет иметь 3 входа и три выхода: + +- `masked_irq_i` — 16-разрядный вход маскированного запроса на прерывания (т.е. источник прерывание уже прошел маскирование сигналом CS-регистра `mie`). +- `irq_ret_i` — сигнал о возврате управления основному потоку инструкций (выход из обработчика прерываний) +- `ready_i` — сигнал о готовности процессора к перехвату (т.е. прямо сейчас процессор не находится в обработчике перехвата). Это нулевой бит сигнала `ready` в дейзи-цепочке. Пока `ready_i` равен нулю, дейзи-цепочка не будет генерировать сигналы прерываний. +- `irq_o` — сигнал о начале обработки прерываний +- `irq_cause_o` — причина прерывания. +- `irq_ret_o` — сигнал о завершении обработки запроса на прерывания. Будет соответствовать `cause_o` в момент появления сигнала `mret_i`. + +Внутренний сигнал `cause` является сигналом `y` с _рис. 1_. Как пояснялось выше, этот сигнал может содержать только одну единицу, она будет соответствовать прошедшему запросу на прерывание. А значит этот результат можно использовать в качестве сигнала для идентификации причины прерывания. При этом, свертка по ИЛИ этого сигнала даст итоговый запрос на прерывание. + +Однако, как упоминалось в ЛР10, спецификация RISC-V накладывает определенные требования на кодирование кода `mcause` для причины прерывания. В частности, необходимо выставить старший бит в единицу, а значение на оставшихся битах должно быть больше 16. Схемотехнически это проще реализовать выполнив склейку `{12'h800, cause, 4'b0000}` — в этом случае старший разряд будет равен единице, и если хоть один разряд `cause` будет равен единице (а именно это и является критерием появления прерывания), младшие 31 бит `mcause` будут старше 16. + +Регистр на _рис. 2_ хранит значение внутреннего сигнала `cause`, чтобы по завершению прерывания выставить единицу на соответствующем разряде сигнала `irq_ret_o`, который сообщит устройству, чье прерывание обрабатывалось ранее, что его обработка завершена. + +## Задание + +- Реализовать модуль `daisy_chain`. +- Интегрировать `daisy_chain` в модуль `irq_controller` по схеме, представленной на _рис. 3_. +- Отразить изменения в прототипе сигнала `irq_controller` в модулях `riscv_core` и `riscv_unit`. + +![../../.pic/Labs/lab_12_daisy_chain/fig_03.drawio.svg](../../.pic/Labs/lab_12_daisy_chain/fig_03.drawio.svg) + +_Рисунок 3. Структурная схема блока приоритетных прерываний._ + +Разрядность сигналов `irq_req_i`, `mie_i`, `irq_ret_o` изменилась. Теперь это 16-разрядные сигналы. Сигнал, который ранее шел на выход к `irq_ret_o` теперь идет на вход `irq_ret_i` модуля `daisy_chain`. Формирование кода причины прерывания `irq_cause_o` перенесено в модуль `daisy_chain`. + +## Порядок выполнения работы + +1. Опишите модуль `daisy_chain`. + 1. При формировании верхнего массива элементов И с _рис. 2_, вам необходимо воспользоваться сформировать 16 непрерывных присваиваний через блок `generate for`. + 2. Формирование нижнего массива элементов И можно сделать с помощью одного непрерывного присваивания посредством операции побитовое И. + 3. Проверьте модуль `daisy_chain` с помощью модуля [`tb_daisy_chain`](tb_daisy_chain.sv). +2. Интегрируйте модуль `daisy_chain` в модуль `irq_controller` по схеме, представленной на _рис. 3_. + 1. Не забудьте обновить разрядность сигналов `irq_req_i`, `mie_i`, `irq_ret_o`. + 2. Также не забудьте обновить разрядность сигналов `irq_req_i`, `irq_ret_o` в `riscv_core` и `riscv_unit`, также использовать младшие 16 бит сигнала `mie` вместо одного при подключении модуля `irq_controller`. diff --git a/Labs/12. Daisy chain/tb_daisy_chain.sv b/Labs/12. Daisy chain/tb_daisy_chain.sv new file mode 100644 index 0000000..c34df2b --- /dev/null +++ b/Labs/12. Daisy chain/tb_daisy_chain.sv @@ -0,0 +1,82 @@ +module tb_daisy_chain(); + +logic clk_i, rst_i, ready_i, irq_ret_i; +logic [15:0] masked_irq_i; +logic irq_o; +logic [15:0] irq_ret_o; +logic [31:0] irq_cause_o; + +daisy_chain DUT(.*); + +initial clk_i = 0; +always #5 clk_i = !clk_i; + +initial begin + rst_i <= 1'b1; + @(posedge clk_i); + rst_i <= 1'b0; + mcause_onehot_test(); + random_test(); + $finish(); +end + +task mcause_onehot_test(); + ready_i <= 1'b1; + masked_irq_i <= 0; + repeat (2**16) begin + @(posedge clk_i); + masked_irq_i <= masked_irq_i + 1'b1; + end +endtask + +task random_test(); + repeat(2**16) begin + @(posedge clk_i); + ready_i <= $urandom_range(1); + irq_ret_i <= $urandom_range(1); + masked_irq_i <= $urandom_range(2**16); + end +endtask + +logic [15:0] cause; + +always_ff @(posedge clk_i) begin + if(rst_i) begin + cause <= '0; + end + else if(irq_o) begin + cause <= irq_cause_o[19:4]; + end +end + +irq_ret_o_is_not_0: assert property ( + @(posedge clk_i) disable iff ( rst_i ) + !irq_ret_i |-> irq_ret_o === '0 +)else $error("irq_ret_o are not equal 0"); + +irq_ret_o_is_incorrect: assert property ( + @(posedge clk_i) disable iff ( rst_i ) + irq_ret_i |-> irq_ret_o === cause +)else $error("irq_ret_o are incorrect: %08h", irq_ret_o); + +irq_o_is_not_1: assert property ( + @(posedge clk_i) disable iff ( rst_i ) + ready_i & masked_irq_i |-> irq_o +)else $error("irq_o are not equal 1"); + +irq_o_is_not_0: assert property ( + @(posedge clk_i) disable iff ( rst_i ) + !ready_i |-> !irq_o +)else $error("irq_o are not equal 0"); + +irq_cause_o_mcause: assert property ( + @(posedge clk_i) disable iff ( rst_i ) + irq_o |-> $onehot0(irq_cause_o[19:4]) +)else $error("error value on irq_cause_o: %08h, should be onehot", irq_cause_o[20:5]); + +irq_cause_o_borders: assert property ( + @(posedge clk_i) disable iff ( rst_i ) + irq_o |-> (irq_cause_o[31:20] === 12'h800) && (irq_cause_o[3:0] == 4'h0) +)else $error("irq_cause_o borders are incorrect: %08h", irq_cause_o); + +endmodule \ No newline at end of file diff --git a/Labs/README.md b/Labs/README.md index cb1de49..8caccda 100644 --- a/Labs/README.md +++ b/Labs/README.md @@ -21,6 +21,7 @@ - [9 Интеграция LSU](#9-интеграция-lsu) - [10. Подсистема прерывания (IC)](#10-подсистема-прерывания-ic) - [11. Интеграция подсистемы прерывания](#11-интеграция-подсистемы-прерывания) + - [12. Увеличение количества источников прерываний с помощью дейзи-цепочки](#12-увеличение-количества-источников-прерываний-с-помощью-дейзи-цепочки) - [12. Периферийные устройства (PU)](#12-периферийные-устройства-pu) - [13. Программирование на языке высокого уровня](#13-программирование-на-языке-высокого-уровня) - [14. Программатор](#14-программатор) @@ -79,7 +80,7 @@ ![../.pic/Labs/labs.png](../.pic/Labs/labs.png) -Курс *Архитектур процессорных систем* включает в себя цикл из 15 лабораторных работ (10 основных + 5 вспомогательных), в течение которых используя язык описания аппаратуры **SystemVerilog** на основе **FPGA** (ПЛИС, программируемая логическая интегральная схема), с нуля, последовательно, создается система, под управлением процессора с архитектурой **RISC-V**, управляющего периферийными устройствами и программируемого на языке высокого уровня **C++**. +Курс *Архитектур процессорных систем* включает в себя цикл из 16 лабораторных работ (10 основных + 6 вспомогательных), в течение которых используя язык описания аппаратуры **SystemVerilog** на основе **FPGA** (ПЛИС, программируемая логическая интегральная схема), с нуля, последовательно, создается система, под управлением процессора с архитектурой **RISC-V**, управляющего периферийными устройствами и программируемого на языке высокого уровня **C++**. Создаваемая система на ПЛИС состоит из: процессора, памяти, контроллера прерываний и контроллеров периферийных устройств. @@ -163,6 +164,12 @@ ![../.pic/Labs/l9.png](../.pic/Labs/lab_11_irq_integration.drawio.svg) +## 12. Увеличение количества источников прерываний с помощью дейзи-цепочки + +В базовом варианте лабораторных работ вам было предложено реализовать процессорную систему с одним источником прерываний. Этого достаточно для выполнения лабораторных работ, однако, в случае если вы захотите увеличить количество периферийных устройств, поддержка только одного источника прерываний станет источником проблем. В данной лабораторной работе вы реализуете блок приоритетных прерываний и интегрируете его в контроллер прерываний, увеличив число источников прерываний до 16. + +![../.pic/Labs/lab_12_daisy_chain/fig_02.drawio.svg](../.pic/Labs/lab_12_daisy_chain/fig_02.drawio.svg) + ## 12. Периферийные устройства (PU) ![../.pic/Labs/l9.png](../.pic/Labs/lab_12_peripheral_units.drawio.svg)