From 97cabb780c47bb9400a6609ba5b1d19cd3a06fc4 Mon Sep 17 00:00:00 2001 From: Manuel Penschuck Date: Wed, 7 Jan 2015 15:12:05 +0100 Subject: [PATCH] Added CBMNet bridge docu --- trb3/CBMNetBridge.tex | 175 +++++++++++++++++++++++++++++ trb3/figures/cbmnet_frames.pdf | Bin 0 -> 43093 bytes trb3/figures/cbmnet_sync_chain.pdf | Bin 0 -> 10249 bytes trb3/main.tex | 6 +- 4 files changed, 180 insertions(+), 1 deletion(-) create mode 100644 trb3/CBMNetBridge.tex create mode 100644 trb3/figures/cbmnet_frames.pdf create mode 100644 trb3/figures/cbmnet_sync_chain.pdf diff --git a/trb3/CBMNetBridge.tex b/trb3/CBMNetBridge.tex new file mode 100644 index 0000000..79bd015 --- /dev/null +++ b/trb3/CBMNetBridge.tex @@ -0,0 +1,175 @@ +The bridge offers two high-level features: +it enables TRB3 installations to tunnel their complete ``TrbNet data stream'' via CBMNet and send it to the FLES.. +Data of all CBMNet and TrbNet frontends is therefore available from a common source and can be processed for online monitoring and analysis. +The bridge additionally provides the means to synchronise both networks, i.e. to achieve a fixed delay between two networks that remains during operation and after a restart of the DAQ. + +\subsection{Synthesising the Bridge} +The bridge is currently available for the CTS design only. In order to build it, you have to obtain a copy of the CBMNet source: +\url{https://subversion.gsi.de/cbmsoft/firmware/trunk} + +Place the \texttt{cbmnet} folder in the same directory the \texttt{trb3} and \texttt{trbnet} repositories reside. + +To active the CBMNet module, make sure the CTS's \texttt{config.vhd} contains to following settings: + +\begin{lstlisting}[label=lst:cbmnet_config,language=VHDL,caption={Configuration required for building CBMNet bridge with CTS}] +constant INCLUDE_CTS : integer range c_NO to c_YES := c_YES; +constant INCLUDE_CBMNET : integer range c_NO to c_YES := c_YES; +constant USE_4_SFP : integer range c_NO to c_YES := c_NO; +constant INCLUDE_ETM : integer range c_NO to c_YES := c_NO; + +-- optional if, TDC messurements are required +constant INCLUDE_TDC : integer range c_NO to c_YES := c_YES; +constant TDC_CHANNEL_NUMBER : integer := 5; +\end{lstlisting} + +\subsection{Read-Out via CBMNet} +By default the bridge listens on the Streaming API Bus between hub and Gbe and ignores all data. +To active the uplink, set bit Listen of the ReadoutCtrl register (see XML-DB). +The bridge will now try to uplink TrbNet events via CBMNet. +If the FLES invokes backpressure, the events are discarded and no pressure is put onto TrbNet. + +By deselecting the EnableGBE bit in the ReadoutCtrl register, GBE does not receive data anymore and the possible CBMNet uplink rate will increase. +Even in this configuration, the bridge refrains from forwarding backpressure into TrbNet. +Thus, events still can get lost (around 1 to 10 ppm during for high data rates). + +An unpacker for the CBMNet bridge is included into CbmRoot; this section is hence only included for completeness. +The CBMNet bridge currently supports sub-events with up-to 64~KB of size and hence has to split the packet into multiple CBMNet frames. +The transmission of a single sub-event is called a transaction. +A transaction can only be started once a pending transaction is completed and cannot be gracefully stopped. +Due to CBMNet's strong data integrity guarantees, no redundancy or recovery scheme was implemented; if a single error is detected, the whole transaction should be discarded. +CBMNet v3 discards corrupt frames without retransmission. +While this should happen very rarely (less than $\ll 1$ error in $10^7$ frames), current tests show, much higher error rates. + +A transaction consists of one or more CBMNet frames containing a single 16~bit header followed by up to 62~byte payload. +No routing extensions are used (as inherently supported by TrbNet). + +\begin{figure}[b] + \includegraphics[width=1\textwidth]{figures/cbmnet_frames.pdf} + \caption{Two frame header types employed by the CBMNet Bridge. On top: A start- or stop-frame header. On bottom: An inner frame's header} + \label{fig:cbmnet_frame_header} +\end{figure} + + +As shown in Figure \ref{fig:cbmnet_frame_header}, there are two types of frame headers \texttt{uint16\_t hdr}. +In both the MSB \texttt{(hdr>>15)\&1} indicates the last frame of a transaction, while \texttt{(hdr>>14)\&1} marks the start frame. +Note, that both bits are set, iff the transaction consists of a single frame. + +\begin{itemize} + \item + \texttt{(hdr >> 14) \& 3 != 0}: Start- or stop frame.\\ + The lower 12 bit store a sequential transaction number \texttt{hdrTransNo = hdr \& 0xfff} intended to detect data loss: + The bridge increments the number with each new transaction; if you detect a mismatch, it happened somewhere along the way. + + \item + \texttt{(hdr >> 14) \& 3 == 0}: Inner rame.\\ + \texttt{frameTransNo = (hdr >> 7) \& 0x1f} stores the lower 5~bits of the transaction number and \texttt{frameNo = hdr \& 0x7f} holds a 7~bits sequential frame number. + The transaction number does not change within a pending transaction, i.e. \\ \texttt{assert(frameTransNo == hdrTransNo \& 0x1f)}. + The start frame has the (omitted) frame number \texttt{frameNo = 0}, i.e. the first inner frame has \texttt{frameNo = 1}. +\end{itemize} + +The bridge transmits all frames in order, so no sorting is necessary on the receiving side. +Frame numbers only provide the means to detect transmission errors. + +For consistency reasons, the TrbNet's 32~bit words\footnote{In this document, a word is 4 bytes long. In this notation, CBMNet has a half-word granularity.} are sent MSB first in two half-words via CBMNet, i.e. big-endian. +The FLIB then represents the half-words in little-endian, leading to a middle-endian representation of the word that cannot be dealt with by the standard HLD unpackers. +It is therefore advisable, to switch the half-words forming a TrbNet word and thus to obtain a complete little-endian representation. + +All frames but the last one contain exactly 31 half-words payload; only the stop frame may be shorter. +Note, that the last frame can contain as little as 1 half-word as payload (incl. header: 4 bytes). +In order to satisfy CBMNet's minimal frame length of 8 byte, up to 2 half-words of padding \texttt{0xaaaa} may be appended by the bridge. +Padding can be detected by considering the length information (in bytes, incl. all headers) stored in the first word of the sub-event header, i.e. the first word of payload in the transaction. + +\subsection{\change{Synchronisation with CBMNet}} +In order to express the TrbNet reference time in CBMNet time using a TDC the following approach is suitable: +For every physics trigger the CTS provides a reference time signal, that is distributed in the whole network using a dedicated physical line. +The arrival time of this signal gives the means to synchronise the system and gives a $T_0$ for each event . + +The reference time is also sampled in the 125~MHz CBMNet clock domain. +Its leading edge triggers the storage of the CBMNet timestamp (1 word, incremented with each clock cycle), yielding a granularity of 8~ns. +To increase the accuracy, the moment of timestamping is measured using TDC channel 3. +Hence, the accurate time is given by +\[ + T^\text{event}_\text{cbm} = 8\text{~ns} \cdot T^\text{timestamp}_\text{cbm} - (T^\text{ref}_\text{cbm} - T^\text{ref}_\text{trb}), +\] +where $T^\text{timestamp}_\text{cbm}$ is given in the sync-module (2nd word), $T^\text{ref}_\text{cbm}$ is provided by TDC-channel 3 and $T^\text{ref}_\text{trb}$ by TDC-channel 0. +The difference between the two TDC measurements should be in the order of $16$~ns to $32$~ns. +In lab tests, the RMS jitter $j$ of the $T^\text{event}_\text{cbm}$ measurement was found the be $40\text{~ps} < j < 60\text{~ps}$. + +The Sync-Module can be configured to receive any DLM (but DLM0 which is reserved for CBMNet purposes). +After enabling the $i$-th bit in the DLMSenseMask (see XML-DB), the sync-module begins listening to the DLMs of type $i$ and store the arrival with with a CBMNet timestamp (see read-out format). +Additionally a TDC hit is registers for any active DLM; this, however, should not be required when using the aforementioned approach based on the TrbNet reference time. + +\subsubsection{Read-Out Format} +The CTS-sub-event contains data from three sub-systems in the following order: CTS, CBM Synchronisation and TDC. +Each component has its own data structure and must be dealt with individually in order to find its length. + +The CBM Synchronisation Module measures the relationship between the CBMNet- and TRBNet clock domains only with synchronous logic (in contrast to the TDCs). +The first word of the data section contains the header \texttt{hdr} that indicates which data follows: +\begin{itemize} + \item \texttt{(hdr >> 26) \& 0x3 == 0} -- \textsc{NoData}: section's length (incl. header): 4 bytes\\ + The CBMNet link is not active, so no data follows. + \item \texttt{(hdr >> 26) \& 0x3 == 3} -- \textsc{ExtendedData}: section's length (incl. header): 44 bytes\\ + This type is transmitted for all timining-less triggers (i.e. status triggers). The header is followed by 10 words + as shown in Table \ref{tab:cbmnet_sync_mod_rdo}. + \item \texttt{(hdr >> 26) \& 0x3 == 1} -- \textsc{ShortData}: section's length (incl. header): 20 bytes\\ + All physics trigger include only a shortened version, i.e. the first four data words of the \textsc{ExtendedData} format (Timestamps \& Pulser Timestamp). +\end{itemize} + +The TDC channels are mapped as follows: + +\begin{enumerate} + \item[channel 0:] TrbNet Timing Trigger + \item[channel 1:] CBM Pulser generate by sync. module. (simple pulser operating at CBMNet clock with a configurable period.) + \item[channel 2:] CBM DLM received + \item[channel 3:] TrbNet Timing Trigger sampled in the CBMNet clock domain + \item[channel 4:] DLM timing reference provided by FLIB for debugging (n.c. in beam-time!) +\end{enumerate} + +\begin{figure} + \includegraphics{figures/cbmnet_sync_chain.pdf} + \caption{The TrbNet timing reference is sampled in the CBMNet clock domain using an ordinary register chain to avoid meta-stability. + The arrival time is expressed in terms of the CBMNet-clock yielding an accuracy of $8~$ns. + To increase the accuracy, the original- and the sampled strobe signals are measured in the TrbNet domain using two TDC channels. } + \label{fig:cbmnet_sync_chain} +\end{figure} + +\begin{table} + \small + \begin{tabular}{ l c p{12.5cm} } + \toprule + \textbf{Addr} & \textbf{Bits} & \textbf{Description} \\ + \midrule + \midrule + 0 & & \textbf{Header} \\ + & 1--0 & Epoch ID defined by: \\ + & & \hspace{1em} 0x0: Incremented epoch \\ + & & \hspace{1em} 0x1: Preset via TrbNet slow control \\ + & & \hspace{1em} 0x2: Preset via CBMNet \gls{dcm} \\ + & 3 & Low, if slow control update was chosen and no update between last two \gls{dlm} \\ + & 7--4 & Barrel shifter position of CBMNet \gls{phy} (always 0 in default config) \\ + & 23--8& Lower half-word of CBMNet pulser threshold (in clock cycles) \\ + & 26 & CBMNet link active \\ + & 27 & Extended Data \\ + &31--28& Header version (= 0x1) \\ + \rowcolor{light-gray} + 1 &31--0& Timestamp (TrbNet clock) \\ + 2 &31--0& Timestamp (CBMNet clock) \\ + \rowcolor{light-gray} + 3 &31--0& Timestamp of last pulse (TrbNet clock) \\ + 4 &31--0& Timestamp of last pulse (CBMNet clock) \\ + \rowcolor{light-gray} + 5 &31--0& Current epoch \\ + 6 &31--0& Timestamp of last \gls{dlm} (TrbNet clock) \\ + \rowcolor{light-gray} + 7 &31--0& Timestamp of last \gls{dlm} (CBMNet clock) \\ + 8 &31--0& Number of \gls{dlm} received \\ + \rowcolor{light-gray} + 9 &31--0& Number of Pulser pulses \\ + 10 & & \textbf{Reset counter}\\ + &15--0& Number of CBMNet resets since \gls{fpga} start-up \\ + &31--16& Number of TrbNet resets since \gls{fpga} start-up \\ + \bottomrule + \end{tabular} + \caption{CBMNet synchronisation module read-out format.} + \label{tab:cbmnet_sync_mod_rdo} +\end{table} \ No newline at end of file diff --git a/trb3/figures/cbmnet_frames.pdf b/trb3/figures/cbmnet_frames.pdf new file mode 100644 index 0000000000000000000000000000000000000000..16646f4c007c9d2c227b9fae1f6aa51fbe9f510e GIT binary patch literal 43093 zcmeHw30zHG_rEAAsfdJzBdIjrc_35sB&kT|TU`xOng}I53P~a*DM?5&YakRQL@5+9 zm8cLhR4R%8KIeApo_kL3o80IB`SAWc$K$r!XSmChAbdCuV&( z)gexX2#}YfySSbnq-)9cbn$bAD4@wk9D*QSV>b^!wh#E%gXPCIWIK5|v&E-P6ZiG= zVY60>2PB@{W8w9bA${}Xw~>0chm`7yst@Cga9$~Vteb=>isg}Epgd(TquRJ8>7Za9!U0UM)swB?fm1TQSn^Dp?Y0~nh zsLHBaKhM{HJv4uR&Wg(K?uvycFJIIey~@LBuw;JV6EPv%J@&-i`Oe|HXJ(F%?|gWf z_%U{T3H_a_f9oyb;(U>>su@QNV-7id-1p%1k%i^~89$z7(xX~~bskplJCY$Wz%VQ~ zZ^e@XtqISw_1fJ!?>B5_?~l*6q*|YNeW!e_fmj2y#plr8__OSbw8G^4@ckl6IxZs2 z1>%Z9G>3VS;n4Iu#VapWdF3h54k%u!3Z`G_%<2fbv@~$hl@)vBRP-*+kIs*u)ULCb z9+l8}NOgp-`QD^iwev;I++UPDsod>6XxO^q=#TrEV?{keezH8B*SZXBb6sq8=*o`Q z7mMc^l^wbSK3pnY`KfV>%xeqkT(i0q4dpy5*)OV2kXTE!R$^qLf@J!t>6XJ=5>Lkz zUapXTa1dH{W|xlI5JvcRf~frc2Mq)E4D(L(J-S2QC`!h^Xx+fO>XNPQtlBn1xfgFV z*b+j1dQX=gA+)^<$PU)soS&;?mCHJD{O25@H|skUG@-c8z$cJy-6i4A${W3N-1nBY z<=7~1r(NHB|FKQOH>bsh{>&3JYstG~A|#YmYA?>Y9sl}E-3Rr_;n7Ls2ZYpGET1fv ztkxdSFgbtl?J)0U=Q2K}8^7KZJNCi;n3+Wzj1Lt*EFS)#xXNG#!_7}Ad&`F(A3y9@ zT)e}5ZB=%uT*iExDY+M3P1}E}{^f{gn)c8E0$XJ3^Z+r12jB9Ze_h2?njDyOE>Np> z>&P?}C1;nn&6#g5R+5TXAzwz>)K~2ak^M3&O#4#-xmGrCh(h(kf%BV7nequW?+Hgv zFebKdyVqJUF#0uZ_3Yj1QV!|q(BX;2i)XIdB5f-fbK50;w|J!7r7b@imIqdpS~rttrI4YKC2owC|*rw&LHO%_d)OOrT(`FmI* zU5@|n35ip3{C}5>$#V=~2e2=D{TNj8z4fp-+tay=o!}G9YnaUNzktq6A{G8U{1d60 z^$5?60{l#D{Q$=yJw3Pq{Ly6*zz>kF!Ayt<={m8%{{i#4zaw&gN6;bC7)&bCgZsIs zpDzufag_;tObW4K;Y<7H%Jd62?7VIg#r<~RT8HU4I-kiOJqRc;5~~(fWU!j zAweYcl}Qu`9H>4th=jf}i2;Fww-1>Bfdkb-g2?DAlPM55P`pOgr1P+Yge%$U2B#L8}0`__^`o+klP>)v)ImVEPby4XdyTWNCcIlLn2WL1R(STiVmGg zq|j*4Vx+49cm!~=FN8c8(q!V}<-dyOu{d`_TH)WrceDl1;KTCtT?OCSX)U+e4D$2w zN1h4pWB_^@vRAt~v29HB;Vxa@+J^1x^zX7}vR=BR}DJ z7Ra;tJNhB`7<>7wM0)CTpr8ODVGy}rp8{BlLF511R|mt0JlcO&n*<%MTBLS?$B_x} z|8570Y)u$Ykm4uOX*ejX*-=Mkg009n21~O!_h=Irir?3>eFpAEAGiybYu(}-< z+5ZE)7dzD@uPB{Hr9t3;`HUS3&03NjVSv8$u@%WK&dXTt9w|E$i;o;|P2RcWMDkLW zd+LkmvQb4M12RoTKVXM~iXDqtEZ-G~m;fft^jPJ}LVhrTs2m*uo}f!Rz)yr8#%{sl zoDW|KLhitE%VBGb{0278$cLF`w$O5xhcDuubCnKk0?^kLARoz0Iu9SoOkjZdwbP%^ zM<)wkd_JDl5lzJk0cZ0)b}@feqni$y;$4$8;OLgcx@!s zmf$9mENWF!fMr+OGk z0^zd1kdYH?dyBK~5IumyNUUD|pGLe7jHEzx#Ap2VK&xj8myzapUMn5zuk^}D&U}!^ zYwcTP2f4*BF%rvkLCObM660YcSdIJ}89AYsNb4DYyp<1RB@wNc|ECe}10%tDF5)xx zgOR7Wj9iN6wbHSy>Xnh4`CtztktKTcIO5t!#NYlEuk~Nm*hFCKdl*RszQXA`NtvN2S$SM zAmTIjgOMk=jI_Y>S{c~rOmB=th{8LML{ikyhPK*`~Aone@1HzyDb6Y_&66CG% zFcPF){f&&2=`FIOfVcXAwKA|#wq6;DtiSNY zT9Fh{^f=-&k`tr-1x8{$X*~I$A&&4bXV3w@_Ye}G`WNzXXfI)%G=I@mI4 zyxFW|689%gYVV()tOF;rTHxferkRR*VnqPS??&rXJh*=&d-zX+`@fTsNrJ%9uQd<1 z?o1s^JYSWGU0>*pj0i_~eN|**1bP&4$;gS!_T4fvvHmljboA3Q!nv&7(gCNk{(WSG zGg)!T*dn?bhm2Sez=OM=Wc<_M?gJTtGDn=mU$=~I-AOtuJU5kzU0UdsjGPHzk7Y#m zB=v!eoS^J4kP+)T<4H$<$q14wddLVOt$!gIK^ki}8F?~v((a4;^5(!w}S&(c5Nvu6=1UamK zAsayoYd0HtqN+!mMcr}O*f-_J=-(Wj{D;B)-`Pkcz^h~Z%+7IL#!b)39UwLmI~YU) zc2%J_MskRPa#pdn6_1jfoBYbukx1y9|I|+l2`5!{a}v&C{rflxC$V;OlGj3R5cS52 z0kYQ@?dagCzo(GL88<;Eca+#@>|hWHSbwE=PI4xKJZ7?Q z(HzcAevOk@w&Mv&KRF4fRd#cd4Dwk2K2E}EtlgaCwUf_8-LPVS?79EfIQgf+-4{-R zx(NitYwQmvxhXoi8e(IygFz%yZfnz8C)fms826taL z39?Bz71{b@C%K6_xth4XD^g7iE&RQ6l0Q`ksf>m`8K0A!c_l1)n2fC~HUO((4H(w`rhL{3YK@xHH zZS>Ab&a{xncf~RXmyH5;-+U`(Y=YxoJDOqj7y#oETK>?Vq z+OxlIBAvO3JGol8ZYxfbc<*%NPu)RE^P&e5pN_wpyMvU!V}=CrfzSgu{lD- zEx*Yd+vXzOQ#e`>NFy~kLG5Yayy7F>9W@jX(v|lYl~rCH(HqiIyXA1IViLQPLiv#H z0qFOTMk?0v%XCjcZh;^TS62i`gGdQ3(wyqlusszN(k1$3_azSZBGS@>$&%5Jwv_e8UL+miAN$^%Y-fq_P<<>4p~PU&w!0$n(xtmLj-Zz3%b zF1HO2Y4}THl?U>4f>0hvfhmkg_b7V-AdQsf0wwW*RmT_U?of(=M7pS8e%bw^-qm!d zTp}LQ++};T@<7VI3j%4Ra1aLRo|Q}iAdQq<0y2$Mx5ATYPV7m5%HytSS&=+=v%~~@ zq1$ABd-yb7P8APm?yQ_odGy3We@}TJ^ehtga@>s?O{=c zU0KC5;og*oYNQ1%e1^MOGc*(`z#p&*b3P8?9vB%~M(4$?^Whai2t zqM}7oTSL-A7Wj->wrIkHsY7jT!{o!3h0QoMLubISt#UDVICIxXVVvo32N)D0PiD&R zNi3G;r+z(8yMAJe&n>4GZkb3hztw=5|z1k~75-=vCa z_RGD&!9!Zog{);0Sq?qPI18&v{9@?;vVyR2U|5vt^^NkuH5m1 zEvR`SXJZ0C*gS7r5ybQb?4SW)BYS7?BwNsykrVp(PZ~R1t_lb2?zhw+%&u?N4K-&k#7x4FrRUx z^+5ESU?ZtI{GJF;y?y~0M>wYp1{=;M!vPyvoe*Rkl@klm{|}P=0C(=#{UQWDuz8kG zei!T>Z=FZ71sY97mb&102rkruwv9+Q#Ikokq^%ftX|a2q1VOsT58-+3!*3#uDxuHy zL+JnAG;+Ga@7f^JP~nU^hj3rp*I7SHpJzUKsPpuk^M^0Ww<5HPvo9B&^B5|6BjDQ5 z!B6ErN=m9OV~vxS2-~@tqT=Ruf4OVH;n28L@zWOjRtGqkkBg2o3%4kb$&R<|xPL$H zEzQkkf#c`W+~^S1Ssg?4!rygh+qWitOsodSn(;G4cSTRsmucGZHb4IOm4IiKTOV49 zKDgxcQL*Vp$*gx`_jGIKP9GOPW`AmouGEO=oLK3$w{Pq`4yQYw6?&aC-jGbs_FWZF zd*_WwsB>J+{B}9X!z*8lpP3#O)KS@-l(T92PG`rTzLf_Oo@6=goUxWVelYRt=+q&v zmqU@4cXVE>q?f&~Vm56#wcDU_`le1j{m(bfwHd82DjZ81X)Rx~ccAikPWLq_R23EB$sANu6q zX>tpumpAomUN}wuyS}=7*O4dHVGY;O?g*DA5 zG$MBY_>fhfv-$qY{KBPD!Tt?TWxNU}GrT9O*)C6Cne|m+Htoa8eT{?N+8SkBi`F!5 zPu#2d_N9tX?C=f8cKXC^xVQRn&ez6M&Fh{{F;QEx_u@xUwc%>=8gm~Pcy_F6`mwoj zNOQ}!uT!Fo*DOvXKiDH*CmejibJ3wvl9KcwvCzw7H%f$$bRBSfzIg=sy~96IMmBrz zrf-aWB{3vOIr_#N`5o8|mFs1gn^^!q(wJ#In%7W@=NNa_!(R@UI zFgPN6^J}Fx&AQf~oz5>^{aWsn9yz3a_WE7NcLuKF2TkiDS2P=aYcibqzEJiykulLm zdES%VA&sWx(%IJvmL=~$HX~zRetFF4icqUM#^`->>iyPEN{E#a+wgFX^N*9A!y;x6 zQw;F+{8`uO(pbT4zLOxXpJ8>BrklDna0TmWMysdZm&TCx*y|0|)2FYaENdB)e*1Xi zxV@cU2YT(EPAm?1vp#%Rfa%IKO9>I#=A9Da@^5W&7&2N``wc_t4<1Xgirsz2m=GeY zKB<{~)_8};2#=G;4NQ)$rB5nOq+Ky6zP5?JuQfWNb>ALZjkWgmYoYY&>WZgN#EnKp z`4uin+Oc>^pmXNw&zV7QchtXa$zFEicxT@CLJ!~NLP1%|YUxwvFT4`St}d7@d1FMB ztTWA4;azt1S-;>5AFk|~@`$zlohYlysdc!T*kTuo1TubD5Y5EKG8>T8F zhTqjtlVd5XB{;1-<50YnsS#zePC?1#z?G3F&$ny4C&U>SrfiBGSRZ6QZtP-F^GKtG z=g$>vw;x;{vF^&Mwo5y{zaMgQi+p~vlk4}HFH%}cO24_Ld`dEzd@}J~<~KF@B|$@U z=Xcr$#oSC$QrIvoXyt^eowkD)Fxjiv$#EgO%)?ct*cu)8fJDp(cP^h-{ExwzlU9Vt zR;_h9bqi`IZ28m_Cn8)hi8@Vta)r%8Daqm=+SEZC;xe91^io>$laQ`?c-z2<=h7M< zBrU#|Ji)qA;?3()FRQ|}3F`MZ@BL18JQq_DU2lC-LS?(*%ZjF}!c#8nP2TML+NQ2l z*-+?Ct%a)myn?~`!-59yslT5;WNfAK1P6HqbL9{hONX52aT1wt_8hAls64F{iu?3v zjA?z`*fTzho<{7H)f^|TxMFpC`j;=q^RArle1G_XXO`V)FP-$Ng2_sauI&Y-M^#g5 zj#>ZIw21o}eD>6Y3&(R*-`qZ(e*3^!uW8Trf2yMzE-Egr`WpS??u}_5cg(tX@KfVO zP3o35Mul{NLO!FSX4`SHbBv9Z$kn&^P0NWRjYjMamD)1g=b&zRDl6Ao!u*Y3<-8&$-`D)mFNB5KTz}e|*$gP>I#5?o7 z0}txkO2!`C#n|sC;g>|+v})}5VfQS@dQcs%pAeZGBQfGA6u-^0UU|dZn0ZbahsE`i zWzPt^G9|Ul91R>lf604mU!VQ_(YptyHgs0qY*3{iu_f&?UlB+gzA3h#=FWP_hPcy> z2Rh#Fx)^U8H28Url;&nlqjT@4Mp< z*BQGsdyM|lR<|oHZ{y>)4^OSpV@lbN2-~8RaoS|W(%=&_lxDFu=L{n5Hu-)~e@sz+ zVv1+#M%k&(GY{NOV>Q`GpPgW6Q`PZW^j_zB^~8V|wg$oPGtL)mSeP7Qc%~|Mi?`&i zDf%@pmDd|jzPa_w^?yRz+l?tqQGaOlJaKVo;aDx5+XX9}J;Ns^JaJGRBztCXqu+72 z9pY+pXFQ)ZCfU9{bcCJo68BjHW1i~>g|c1!a;|PtQFs?)Q8?Ss&cP@3OT&vVrscVj zYmCkxXi)SLGbb~SDO+TD`MkTA|E*)6w?&iVI8KiqaG! zn@hiG1fJM#5tue_w&J!-`%|{gnvInio}GRbPqN}?omzNxjnE{?y1K{Ix7$lq?mb=` zm|!!CCS^M}!t$8&l#F(bcRy4zz3S3unBV$jbX+gTcmi}=X6We;@j*eXMo0FB4M!e5 zxlEzh%P*=T254D?d{b>*+d0+irsEa8b1O-@awQoZMo9*`o=-pTugnw5u`Il9rQ$!} zp{D7XT$N3=(kAL^Qw+4#jwvUXC664DeBRt)*wEChCl@y>=4GnxO1z!=PmcerTx#wM z_hYjYw_S*=OWk@?VffW^w-g_o93ec|_l^uPcHHw_Td!&dPFpXO6Ki2^V6{ohHf3i- zoncDtP-oB0F?(JoFO#<~4pAtpnaZy5wk~p+e46f{dQaNom}02Uu`I{twc)P^=1D#{ zNePtPVK%1Ww)ppYZIOhD>}iuTMnn<~zNEE%8?|nY*4W6!)wge5FFA1fCqcF@$N$y7 ztJ>q9>~`wi) z?ILAqKAoGhr${-hXvmLxUdVoZHhW9n*YSZ%lPemWS44HRUt(!I)|_;6_m36hhRBLU zhJIaJ*7eb7 z1sUWmH!2r+xz93pNY$AA#N@M$ZJq9+fN8dRL#P|JEE3qNUxnO&#-PLtD2WrfdpKsb1 zdCKDD=hb)ij7U(HnfF0O@^)LU+3g3^tB*t!_xq7TCPwHxv%?l7EuKpM7Q5r*&GN{x zt(&bE?=wB=ecparU|r#xrS|hqB~4KZUM~C2z~*Vzfu~RXGiN*f@c4MX-l=1sA<5vn zbGd<99@WREh2Ao!;luhey|oe%#_rYm>Tet>9_-nvD0XC*kB$H4MXJNSg<@7~)t;JJ zxzIyMQBiLfW!<1pU&W?c3G1DFajkGvORBWq6pP%Ss-sIb?YQ{iakx~W!x)DOrTtG_ zGYv~lEJ;2rexz6?a^Boi#x4I`IZd2d=pp$zdf(33QfrroOMF@6DC|j-CQQi)72i2& z&Mk7tqjf%7%N*8am*26?Yuj_;iuTlo>Bc%cd{tx)M-Mr3Wb9`WzK1@7K*JLX&6ffDUSOly0g*TQ;BTSd2DI;!e(?4W;| z$d5rsf!HO)H_wpSaT}z&77=ckpSzxo#vAC zl_ActS+2SR;saiOi=GoRSa`zQCZjlZ%DX$42iAYA4qL>GXsw>Hz~GK#k&Th)#6y$J zJSAi6RuzvqtMp!D%&N?j#v6~Co4q{|-4ZL$>bz@{;&dTVLf`95z0f21lQ(laZd82D zNoMREcqp#GR9PZODCCpgX~Un^-Vb9&MX}shzI%TqwtnfP4JpCZXR`e)o)crmEz;J% z%ibd+B5^Zd#fsddyM^{s+@s1UUf(TOl)cRld$fG;l6_HaS|QI;qi-fCpRTsea=EbJ zq>X8+;)=18rB4hNUHk0d&PyHEn+|!WpM6(rnC;VMk-H{nz2Ea&!9BHj@s=h}xxTXBYV!%SzDe_CApsC=@&G}97$-7)48*9LFdO=zG9=lOJy3pyS`Q?Beio}a)X8>Y%|oD|2k{o*D%E-7Q5j?WaJe0 z2)=gX6SHq8;nkywzHN9N# zO}N!4y9ygO`4$Pyp<9k5E_gCMb+*>vZIX+Vl7d&TwDPVk9Mybbh3oeGv9#wZmih<9 zr#e5K_*hcxK*?F_JySl|L{>UkxUZR-Ssyp>X>_XUB5Jzc&`i6t7swIMQvIyYAM-4i z)ZaHUFyHkNRCL94{?oLk#D^;wyFR7YyvW(m5ppGQX(+1j~t>u#Mp-{F39iiXei zuh%{V9XODl7`S#r`9_n}aZeskbI=#6G|@Au{sDazrgRogzj!M7oW}Iiw^^Fi7r~q@ zd&jMoVwX$xRSxMDInHh{Gr38t$6oWOvPUBk?-%VXDaeTDTG=<%}6)76KWDmMT zyVlB|bSEZn6I!vYX~($*8p+x5M)DfLN>Yqx2S16$*oeOit+^ao-csGU_$4cTJh{@k zvz0kt*!1%Bc{e^1IxhvUu8Uk^w``AYenz6f>!a!#XJ6kdJX`3sYQLGh^5_8hJ<+D> zZ|;;GE*GDuAriZs>a;;!XskFjaB|Atz@4rWCt5Ffe}w*c;)sU>M8x;)a2FEse|+bW z`-Q2JGqiKR(hh(BYPoY=^=>P+Xik>ii$f-IX^~%7ceuYk-<(L;R-W6^QuXp%`rGyN zs?H}>dpbv3Ude5Hp}A=JJpZ`^s6{i13qKE8FeUGT|GC}i+LO|~K6&U(UUK$T!r7$q z;@NeVi_bltt*SU;o{`LtxuM5x2@S*OUcY1@M)T5>2dG8FZJJ#1`jy!**9Qho^aHwR=NuOH?Ef%%)cx6=v0Kwj$1c}1OFxh_IU-yl=-RRfgWx&y zBQk&9c=)qSNwPC`$1V+(8bhyvIosdIADNxeQAz$Zcx}|8iT0+6i4$k>>r#Ab#$FaSc>!5&+VoxVK%36ACWXL;gj(gbVV4bcc8)G; zsvVc6oiyr1z(0wq2h^mZhZF_XsxQbeb#&hIUO!>;UB#+B&=b~pl~BXE$78l_Z>Ho} zY7CEH>^V3IYHV^2r|gZAQaB%Ga#63bNhFlwS90Bqbw2N$31jZiqZcxh)g*^)iyF4} zSy-E{)u@1Hx26+Ds%3xjoiU}LUbU(6#j3>BFCNRgjP=-5U-Mf3;46javfuSgw3t&* zJ`ddFy*J^;OJ$Q+%Mv{rv*liT7#KydR$Vxn`*fajN5a9P)x!=fZhN~%N&ZKLri00a z#wThU7PZn@rpNBvuY0Cjb8gq-VauzEUPXFeWUUH>NYY;~jJxCgM0T3g$fsw{=RaKa zY_p8_4cXG|#cf$HpOePje06YU#&# z<$P$svn5d-DK{67el#*5)N<<(`{t&j=Uwc6hTVNR`|7tFwqnZjyv;&w3v@%P&$x`3 zwO4r{J?Wyi{t5HQ>Ti1)@{Wzl8JQs$2w`@PPs;|IDy$s8;r)5<*QUdQrXO<-HhuVN z(XbE7!{3{zU*0_V=Jf3qpI?3d`03lcul6bh!k?C`sfpj&6yPV;I?-9>K~mk*W3Q`2 zjKBOm-?H%8R&7YeAYfTSK5fdTHA*)!kLJIUI3;vC*6>r?gz@*|YsX((SY+iC|K{qe zN1=y1<;s<_$t3|=EXS!vTSxew6_=t`nFMYA8BER}s!D=tEjJ8NzsY`crX|REqygkS zBFFW(mVILWg>U8MhB99^%u&1aI6LXXM_tRN-5m#x9*>e6I`pU1E7s!Ac#(DPiVg@t zQVCQl+yz++#my{6-v8J8QV(xh`(m47_iF^{%kMP5Rx19Zw2eLRhV}gjsi3==N-s>` zRah76ua^AL(dcd>_Yagp!Fh=)~y^)w_ z=DU@#KUOzvx}DaZsjX?XUupRR%Fdv>_2+I3Q%rgmc*8_wz~hB}awfqcTTZ_+ODm^_ zDka`Mz4Lgs$d*BmbDL|j4oIJ?xcpB3L)5$ML)p`>zm}E0ovEV|yaGhS|$7$)Q_f_urYNQ`)6|CUu^vWv)jGSWWPReQ$Yy!x?j z+S2uryNnYQ=kA*{+qXF&cnwSPS!~|YrUhp$@dlJB9Mgyqd<>YJHq8m#mo61sn7%v$N@u@+Kyf?FqXnmt%9zF;$M zcOQLyuK;Kvqz#riv`HZ44-{i%Ky>hdlPzcF$MSGUpCwY4-7XSUq1s^mJj!vTe7--CK9{0+=3H( zzy*)PSxW;n(>3yR@^W_bbb)m3-8^S{`nqu&kh|KuIs3W#0tCrm=>lHu>-|3}CB_bCp711exXL;{_3Qh-4iir0(kHw`#I3 zs6YW4U3^%pT-}^}b-a9BCUHdF+Q-Y;---Pzr|~`j_9Zh0EIoE{{Mz_(K*k@*vshIDL69m3y6f?p+y?nk4+T8FQV2)}Fw-A1R*(u|32@pzs*OaU zzy&~1Z9pGj@FS3!aH1Wm9|`CK%rjHyaQy&OKLUjT+jUeMiAscbYM|N(R2sbZi?59i zztarW2B-iRrbV?8fO_S>2LY%=49-*rW_$^B3Y?RIz8;;1;TDNTf_HGE`!UGyD@pm< zs2H6{qEX>@B%%8;Ng!LEzm0;?lO!4w%Y7gS{8)jq_88qsqLVRl1@skMRRi@bpb0CJ zbQ(N&K=%XW;>QYUu;f4I{fmDg&dNNK9}+zGorQsK8@FKOd1s$KXd|GT@B? z==%c4j$dAgbRgt>{m2BMo%q^_3<_MD3w=ERAAdhGfr_b@i(2K@X0nZ|H!PINzD2>G!Bst)6W0BMFDP4u}W0{s47zBUrZmXX23VD1ZS zEk9NyGP30cbv-grvY7kAP8|PzDP$}z6f#C90^NzlfI`F3byzIRNt& z3_nP8D#lkK(U} z0G9@PE*;||0qcPoBQgPNS3w&_Ujgo8WEZ#xI6P;-Gegw(AQKoEo&!dc`Q-()VSHu4 zUmSe^gp&UrL?%Wb0Br!5@I^lh37K*8w_*GPGHgUK=hCn`5eOFMS?El7PK~|?kRg73 z06YOKehdm0XW+JD?!g48_T0nIhXn#6KH_l7wyoPbFuewoNjMB))DAM@UiUey8gdFeAYMUS)|#!-b6hY02ynJ|j4LJv;8TS= z*&uBJ0w_oe7XSe8DcCt6;clqA0}Kh5gIhXV!Eq%da1ls1ILr~(>t&6Bu`^vAssF;G zcE#0OgSrqAKb3bUmT<|zj*0snxtiJip&En=MsJWv{wNj$ zdeveW^)04`y;@+Fpwf>htb9=nXr2uhb}-i0jN7aPMB7U3%W~%ln?FOzsEi=2LG9Yv zci<})WglF|ish82r(GS@D!Za(hLd15jAs~}&)Ks2^Zd7IR>ry2^MZ>EFEze5Y(1jX zK|K4}ahC4qJ1H&o*8|5?8NiK zqm`z6b8IcZ85J&ddQwtdZ%J*R zl2vG&kY^HbGbTLJ+Zy0ZCQ)_F@cABJzGq;X);R>Chg?M^pzHFsRg3h~l(L_?vB&jG zetp#VfVP)D1-c4+@-!_EO$Z4{{iZiokX!wRNG1)=xxXyJnT{(N{fc2d#wo`ZqnKVO zv%D!unsI7JMq@iYnX@mp{TTzrELd%O&!H7wW?8CSX6q|rDzjv&GY}PRb47FBbq}h_ zf>%^;rJPKeX_wCFmrQ4nh4+-wsyQx>If>)A(r)5zT}=GGEwAoITOiajCT}VEcwJZx zrpE5p8}SxH?Srt&5)LikTRe#zC?yP;!V!9qV@Gl8jZ;BzH7#06^!)0r9Ayfovn4kjySSid`|Y~fvsfoZmldIJsVqYS@Be7GhN zmRu7ljRnrzjMc7`L!K3~FO`OID$LSO+cfpoI*wWe);jkWFf`sm+;laOwN5OzOd=#g z-wf-V#Q?3ZiZq4P?GCD_L}TeO^Tn3LuXzKBK6(VQzr_+8!`RgX+jYNOmBzCqH(nr=G)Wj&B0Dyz#4QX&$%8m0uepv zpjgCWS11~sn9=|4>~^#^aelM&FsK^>~`ezM7-45 zsc!55=@LJ6-@jpgVWBeS$axjd#Xgqsbi?O*sdWa+qvAZbi~CH7AcF76vEdsH-!)q|e}a+b4^pou`=@v2Y1ukY=aBkgMNHH^Uj{zdk~($64E)u% z=snakpAm*bRKm95ga;W$g1U`6OXd6TAJJP^;6y7U49qH!)Pnph9bkH?w)>@x;S7eP zJPpq{*QjgeRh8?5rghkCfG#XKvvIN69~-tAk`5mEmHildN%A>|U_+cYyC5Uvd2X>d z+q1oc{ozO{-j58zgZ&1|DS+?s-!ujif}cs;=`IO+qF6JuckI>aU6b^>kB9+!PQucT@?%4-^!<5x8mc z|6OYQDlX)`kc!$!RAB)S6T1OW7at6WY5@3Tr2!xSpCt_SjVd=#9lyW%6r7!q|0ZqC z1LOe$1pkyPC?V9}Uy}*_JsE&c$J+%C;M0KFz<*7w0ds?+#sU4&<5PoM*}-I-y#U52 z2nY}W3-Su_3jx6p0El0R7Xk)>fkFV&U%IlW6`+(6fSbDMcafy%=IrkBZ>#z}+b{Hw zS=y*IxWSwdE;lnm7|A%nD)-farAh~gw1RtM~GQ2WfnPW-VYh&agrabW#*d6QKQd$nP+z$0XV}@AT{S2(RZ597L z6Fr1_Aj;q#;Eg6}qXGss2%U@7l(kRS;pvMN!bwn0;<{F{0##C!h&Ko~fk^{D%RM}G&zA)!Y0U)eq|Ms^a}NDE)0a9n+lCh znF(Ag!p8bdcC<#S@LrqaHQMo<=qG2qFo#Ro6ALy=`)T)$OM2^a$7Ah!v2%%8;JKaJ z%NKEbhmcD)KlDv*X&&1Ld8N0TC>%ZvC?}4RxUg7PWVx7!5mZdwuKB0^ffjY;f7>zD|%SF|Fi?^1w8uk=HSnl=IGuo47+I0)vtQ9DSczhKRF;rg8uGylebp@TZe zG%eKvfWo%7aG6WRtvl*SJad3mMa4o;xGBx62@}skT*6VF`|z+a=#}1Qteqz^U!gH+ zk^xkD%`J}SqU(Iyb7@zbTN)>gOV&Yh0lP8b6;EVNnRcSHdzLGwaYjBq-Sb~KJh?7G zTbvta@g)_4YTv}7|!qc{J*g4(T+0*N5wo}X6q|K^57y9zcp%b#y z?gadn0E`$p$`+!24RtxDR6t-3Hkr7Ek-Q~_vkv5gG|w%A5UO)WH=q)I>BHx5?Oj}R zcuQS1-6`0RU!LkSx(@)tG_FK|E&T+(qoYI{nQ%!b__R%ZbHsHi`i4Twrx0k zF-pc`(pmwD-Q-%A#g@*!*~!^#5{tyA={LCLkCTe=PC`=BL%JwDA|g{!nV~J~K=U>3 zIlv`*VSBN4t37t(ZFxFuT73zlzw&C7o`7(nBe)}sZ@zi+d*sw(AzjKkAFj0Vtv`ZX~Jxh!+C{e7-0^715HOXX5P^S2sVETl1qA}OH-6o!iip)=whtZ^zoIS8pJ z8lqFot*9-B>)2`xOFsT^4P<2hVueoq=KBvN-47BGC!cH24mSo;X)jjTmWj&1K4}bf z5&ElnjQyqpw1(A1AF{OHxEE@l7ABAdR1|;RBV`gi$Gm!>T2xiEycb51=1)8~T3#?_ zR=_j*VgNGS>>GrOhUunB@;3Tsb$wf3v}=$oM@}fzylSk}l0qtT>YdEfxCUtQqEnc< zif26(mnSQv|I29cm{~iXTusI?I5v)G=XEo-LRWVQW`SCCaP%oiO5-2k`B^Mk+<77h)aoS6|-l{C%@Hf)a3@9OX^JDx$^jK+O0pDRUv5U zL(}!TCy)tue8#`Q`=ZA2nGGi{9#`}S0?~8!7+G!mv+dD-WGu%u%~r_{+q2f07PmYA zIcND9MwV%zUg@c~n?;QrxB1g^aD_gGzcbqjGahFg`3j6Ib&_DwR&}+KHc2WuW}@wC zjy65R+NJK6CO+&1!kzl|veC5}T^5b!0n@HAuhN}qc}L+*{*aK%QPozv*4(W{vR6w~ z-j9akxwqUT5o8QQ)yiHY5*1!Y$IwTljKO>?Z=j?+$42>v_^ce{l}7J6!@@9=&OFM(E+!gvx0t+#A2orr>jYIHCH5 zoz8b|#zM4-DvA{sv#!r--BbTi?#Zf;-H{YGXq)R~%!2JQT?<;tRr@YSGnK`Des)rT zQrNThBQcTxb1I^)5JHWW7)aRUQlb=xm1T%2K{5vIZLdmMCmA4LqXXJh<{cXZWVxV6 zSdwZ&F1!c)?jE)qxO*K3i|Tgl;$2~JGsKDc>u*a#g8jmEb$2;XKLeh%_zzROb=>La zYnyP3zVU;rI?a;4RB!Bc)p~kx$2s}AkG^pgsW6iH zPOtTxNi|9?a;RS~5f`s_(_+>>Z$h9JPThAT=%gP&a3Rfb=9cnsYh<)#s2c7)@wl~< z!9^*Rpy3hbHhXikcNx+#GQy!fQ2b4%*jR?T>lxECypdb}R(;XjNhU3st6FU)}%i_1=-gn&W=TMR|X3_HtcoH4Xb?wv@dF5QDA;B9JM<2V^Ym{eZK)73OFWd>?zR&N%4=(`RdR~g z!Rg=x!;J1TS%RimmiJxeb*y`Ur)f@{~U682~7 znr0e_Z>j+`9y zhW_Z{NdYGM-l-_yW-C;4%Nd*wPWPxw%#*{fC?M^pspRTZyDNzH6+w+Z4TgO37YBT} zJ^W=>RTT30c5Q|;;<2Sf;});F>*7Z)@`562CvK!}3I6fJ@VY~2Z}Hr!hiSa2@T|kZ zJAbdK9y3|l#qX(9o{Sj}kga~UzF%36+!GwU_DXZ-S-TCct;VNo)Eb5&=z6P9xh{)e z_^>h4&6p5mJuNr3soU86s4x>5aC*4>Hu$4d@p-M4MaRx7rB6pbVlD10u!mg!JI*ZQ z<17_)Kfp(0t2Ad~pBTD<=W$7q!bH!Uc#J{%0e$7UpWh#?rzfw5uf}&rbH;WgpL6Fci^Ebr#vz2_WO2B2Lt|p^C?d@?LO;lP6dv34m(d;OTwFp8r`G_|L z6@L(I2l!kDO(obbcQrjpxcE-^e!2tut;{mZ8yK$CRPuVc*{$+1(aL+tqme_;h4AE< znb7X=05|%C8Yn}SnQa}q#Pzaowei0A@`~o2@x^<5V5vng6*i{%Ej*$lThryGh>({4 zj79?g2o`FARUHqAQ2rPB#O3i7)p+PE%@yY*({+iXE{g1G>Pb10aGVOR1lSNaAtz=WbATc$XTD}ebD4r zMbY*XzIO@snV&@J8vBoPOMaS6yU)meW^*~{j`)eT>)Wx3DS;F6qbxZZ2gn||MVP{Y z_in$^TdbJ+7R}rgC535djI@e}=-?++uXuAADWKJmSi3J(r!9DO+1+bxhh&63EG*&O z<{Zg->EP(d5RqA0q`EtyzSCBVvcjFZ4@qOfML0cTgnOSbe;P#&u*_Q&KIdkgGNHC8 znqp4Eeoz%W!qI&iTK>{~aS20)X-=m!EKlD%4C!TRLcq*H#*w)7&ZCq+JQ&Lg33Msp zShn6!7U}{YIXfC1*;XoKKdbTEIoxeOOe^f|QMYVw&(_|d&u>AY6B^Uf{QW~S}D@Y6+i^yV%PS~AKbRZJFYKN0N`;K-#-4}Mf015F+j0{G` z^zc2woJJ*hTeglywSL#yqRD0rH7pc#x0e|asvlS(RjMUzgJZyDW|$sk$M|^>hNcJX z$|=U@8i{OHb?hPP6XI)XMZCLEszEZOFA>*sn7@8vf+li4_((|gb80Dmerx?!Z>}Vr zzxdQJwsgQiRZ8mPjSR+#1ry2I+c7!9HT7SvFTy9U`k$(Yr*Po^^yDWw_~AU`A*{3T zDP7mnJ78qDDtEkzM(=s;eRBAWQ+281q*l|ilVhC26v2~ax?$Bd-Ly^E+6MgWUYCi4 ztw)pD%b|gLG8!RnP8DpAIGI@+7GE;uqmRorysQPmA^aaGp3r1eBLs@N#Y|<|+4WsJ zU3cG6XBD+zEimOoBEUbt)>&1n%bAMslRebBd|JP|4BhXs63c3y>{JT<^oZ~M%UByE zV?IX74>`dk+!qtf+2qf4EyE01nM1=)8>|>w_gRD2NmNu%!yRh0I5i**fmL74Kl_z#CYRi4^2|Ho^XUCr>dQCGaM^ib6eKCG?i~om?+ba$0+-no2x2C)EabtSd<3TSVq2uPJEG$Cz&7*7@; zHW-S_k4O9p+g)pJLNMZ4s1lo}S3PUQR6S)SEeG*5QAMu25V;f{3p^iDDT`~^5uQHV zAaBH9rBp1yY!pqUGD~jROF#8;ndAESG0#1V_6wbvHnjq%QN{DuFJ3u!SS%alG3fLZ zhB!ZLeP6fH&_Cy#kVlq}rphyixBBVnA^Ndy0?&z&h4|HBK9@-D(IbUA$*l2!Je#k3 z^DR#9=kN1*PRa})NX;v+|t4z+MGVG1ul$Uw6*yt@ncVj^>M!j_fk=mJs(?<__Wthcf{jmV0iAMOU>eZc`Bj!V;2$Oq z9q3#wl|MIotZN=%%xAsA5*{>s6%%nJ5-jvpkD?BJYn8{--w`e2=Qf6|I z?1CA|M{e)^e*N|qB78y!Cl~#l5Tazv`GxCe60Jg?psjZ=KP@TmIv80Pf(6bu+G|p$ zJm(&dj3(^7xb%`(@W(#oz_&D@=D^(jxO&gNN65s9H`F(;J2we`Vy4iQlVM#UHI<@$ zHmt^17~sDj4t@@WT=~RYnP3kio{^nsoa~U~Lgb7%Q}LSyF1>t0Hp_Qnk;r4TwVqKRtsIvo z`(s%ijfk%7;kUtOV%R=i5zT$~l<=-p17uzmXdlAfXinQQ9ig$_8(+cDQZ!+fV3A;s zC$W?Zc9FseK)b%Z(<8b|U7Ic0NhcZT`JTvGJZAXy_;;%B_k1YDL$2sEr5^6Uy+^A^*H++P9#O@L?(v*BI&fHrbA{jT^X(`D^w^$J@(1QC56z$cT$+h zdPdIXsA<{aTJG!^UEMzRJm)cwUr)_Ld1lYrGGO~LIsd8$k7;|RhLGi@xw3ijhD!El z3O2v!Ql6cUCnZ}(wH?bfzC|ZSylqXUUjlpSB<38EzbSRD_U$Dtx1%DUEr`*5(7PFeme zwt23IR{SNRu*k=cbABQvhey*3y;d$lE0i_kDWpo=$#Ty8!&iSwndJAroVW@v6UQS( zY2zM}tYm7c;GW2Dw8N5)DT?}j@NWAt2qPy3?AvEaS6r#QXKlo`U6fZ3cU7^^A7=b0 z(0jloshGEGT>k#TfEI^B6>|yw8t+Q@FiGG$F>H6=GVKJ90`aBHNe`137xc2y-$o?Q8RN%-MU;7x13oJZd&!!og{wVu4beFuV`bE?04 z>{#B4)_5RKJ*G}=aWH!&{2E%X=tV?~#6LbECXMSL{L=j_Q6d(bC(uKWNJh&gqx!Cg zIbsTd-5(H`xD1gQP@d#t$`c7o^dUZ$M9c4Npd7B6o4v+aY_XOv4)Sh@yOj#}`W!&Q zoG1f%%I=bA?fPCr8R}C-i5>R~u{|kDNn3G9=(C^T~v_cF4WG?H|ork5PqtfRS|8eW&bG8Yqovo714ovKRkfu)t4w_N~^wYe?ri(_Qw61J*Btz z2TPpJ{EIol18g>ESxt9ZXYyz*AvN4kU~OBfYs~*>EAkU5&TxiN}n|k?H`$>oFLe%@PvZ43rs=@T-&kSE{+t7co zh4*m2t^+_v-&L`BaWzXjEBF)#*|%ewu|09`+sPCDu(97vw@bIQw9)nDH6zO3c9zmk zHV$yW?}4QemN%4>Fi`N<7&j}rY4h-degm>F7bUozjV($<@VACG67Hx6fc&eW^rvyN zeiXR_=Lg*IKmX1L-7sPQH2>F(+U^#}Uo4moigCJe%`a32hJgR#)c%Jn?A#DYSzDOf zAG=jyf3-pUpuZjQFV_NoIsf;5l6OL#6tZ)&0r2VDIY~Pq?EV11^z`klkhTaE*9HdP zkZAw=^Z)DnZw=ua=kuf7Ap`~pL4W`uK@dO~azjG?`9MKJzru6V78XW5g9QPCf`Y%a z{>c3IT@Z+(7Ev++s38BjgMlc$zi@ukI4B8zA;8TO1ZB&O)Sq4;01O48{sjPF2;_GU zO7doo8;xISg5m_7b)D>P4pjkeexLq5lK)KP8}<_M%YQ0%RyW?e8BObNR?_{3(EK-Q z5cDsy6~!!~j%%T^AC=QEJ2z(lh!+Ir1pzp0kw_O2J`~N00&U!2F1B`-2wrD5oBO}B zUc=4V%H0xm{OkX&_AmMsbQ9YD%tcukYFjwl{IcPfHGeU%|5EaDgInXGc9Q@u@b3#1 zO+i$&tO0*vP$4iX?QbrC(;ti