TxYtrw&1Hxg~39MVyYT9xA}ky2s&S*EuVMq zEjaVyaDK 7>%sZFe$5X37O&G9rlQ#JXXx 4>nz(TR>5idu>zG-Lj*@A_`v15&Z=ZKY#g4qOy?+ zIImw%_HG%VryDr+X55|v*bRF56FBdBUg;xz`cmf|{@}#|LoX 5Fj1h7!b|sluOhU%@cOE zWZo#RB*@^vna5H8RrQ}$f~~TxTRd%%jr}RUZ!a8&=%=V2jA_!<5OY=qn}>zt*rsqu z2hQ9Ypy~4eg LY@6iOqjlY7ZAUy_PRu_7 zg#T;Q`q5c46|1KFaNXxGO9S4kQU8*MeIW_WaySVi52rjmmyV#b_EV24cs0CCed>ju z_H^d2peWTzqUuq}T${u>?OL}bZ^5d}{MC*0^`nnWd}IMR)o*qG3RRD$t4dl^DTQ+m z9H`{udfd>(oR)!RLSSTM8jwk@SsCQjzg#St2MDWwqyL<$exrUKT5#%3Gz&4_p;{Wu^H*YSJt|velbwYm%Q}MPL{-}T= z`gZ|33v6B{kM#_}Yb8M#n;Y{J&gJ(?)dcwjDrR!snYfI~O#K8mzjpeYGJ*P8_+b5W zSGsokpFbiP=vdD_&b }cwNkuU=D?qp!D?g-dwXV z&krB&Ku^H{8VNw(cC2dHrHOr{44G^U3xfpIv&w9jw!CZ!RhcGTtwNGQ?R;-m^_Sc7 zRq#b-T3XtR ?SHx*xuSCp_yVeR5Dd7x zyQ_xRMS`$9Fd~9wrbC4pg0IK#=T?k+yVb&n-xCrTT%bpzB>wto3qm#uCxW{`%99PJ z=P7hM;Joo#*Gy}S2k8Ca_EfZ>f<`*NACyssOG732+Dn5)%Agv$?LR-1kWh_V8PDri z$&xp49lFyC@V=dyC303*yg|=v)|2r7dc&>oW|--g?*U#*ie6(XpaBsBpS(%hYeHI` zd8cZ+-=eG&td{^HnV&zRgLx^-AL8NT8^LjUR2lc(4{F^1i*xqhjx3fAb)(acc(KBM zQDe%|@3Bf}_ZJGSG#;#RRIf7{v1G6t8jO5Uw3+^?TBy=g_ku|Bs^&?L3k^>)U)W{- z(q>MyvNou%&F)|z5v$h3yLNB7VQY(|%z3i<5&!zQ&5$5%zscCzVX@=z+?u1~eB+*w z1>T)Wi`Iu9`a`qWiaMP>O*tfyfoM$B#YIrd;jeq`<9>R_Xfj+}+{Y3U59H)7L^@7V z{HdyvR@xPsP%`lk3Gsv##0ME}SVOi;0R7NqsJtH<8#4m!EUTe$Hb+fRbw-B2QrKg2 z^4!A@(AicEtJS*zdcV)Uij0BNv$Gedc+4*$@1)}|YCEsE+m;p=Yow@TK3p+banBEN z@)2`#;*Y{vf1~#9-MbGc aV9y={6oY ~EWoU>vN9`lfB3G|pKLHEL8yXfCDA^ldAWsr{WwC1%Hf0qE?=zu+akFim zaIxb$D=RT5?htIzVj-dTWwt7`arC&fv>`(6(&fu^*RJ8f`8o%n19a|?XXw|H#ma4} z!d)N@chVLS5z(1xi=CdHes*KHpXKok-Xa&AMn6qJ@TSu^Fh@OAsUb?37Fh;1_XRXs z42_H)+`o@VN=dbLcgKqq3N=SKA?473_||H8?)-Ti@5(p8K!1G_S1a8O6ZRJMCi^=R zA61noAD`j8V~yO`(xQ=$5)z!*+2yb|_W$$=J3DJ^v{s#K*018xUp^QmYr6-x0lmR> z_wEVg1TOCLJLHz2*^+3+a9Ez0zQ!0RxfveSYWS|zP~i^Uk)4Ym3NG=pRxG-^Mu7+y z*U|a*i()6;#N_$iu GHkxed86$=Ekq z>Ei0@VQ)fq=(~Qu${_n6-`BWZda<$}NSTL*T$JBoqURohOiCJlv05tGB0#Q#?)xkW ziTD1#GrQZN^Gd5Yt!HVe(0S-lI4qWur+94Pnfw*3P;-!hQ7@)czI(WWSIi2uNu`Rh ziAk&wh*L*_7rXfT_wQeN9G<6Wou91~yKt+JES>54_3BN|awN=|UWIV$(Z&%QfSC_9 zGRqYAVLsP|f1kMufBC~d>M!0W^z&xR6OUo}$6xZ|+SVF9MvAI&$J8jvz{N^L2vd;Oigt^_v WlYyZjEePYM!gwq;RnkPpsg4KO-JMGZh|1>O z)YQbjck ``5vmYOOG&J*_}WOOCdbGoS#UdFMbrsi~tQZjRz zM!|`Z*(4=VQG7T@`#i6|wW9+M`O1%Bv|AiF6V~|t@X+-NzwK$`9JRaVR#xmON=zqD zo_waM`LV4{?rWpL%)SbffmqD>lW!mJ6B7|tf+P7YE}Cl;+MY2pGgE p^pIEv=!i zTTFNEoP#j2y;{#USXkDbrNYe0lm>MWzZ>*QdKT>T^z{cjwnfInz!=dI8v{1Y&kYSv zLo_hyO2I);0n7(q-zrEYpMrwkx5vwjfdsKFsS|3lWiXsB= 8CAQuIx3cQgRC`u6sZ0K2DFu=?{oSRv$I7O=i?WJeQ zohqfye5@Mz2$GPPSaDHC;I&bEoWubqC+GPqSA3d<_DmbXv(;FjHbOV%8SUojEx)wv zA!w(=F%({?fNssT4-K(~O VgN2ZDRz}3kEY*@f;)SK m RKzt+1mr(DQINd&I>26nRQE6~|w zJL*-u!EdWhiRtU>`_?`)(8R>YM*%pb&3G^Y8tk_A_EOc5)$$!yqHPD-+v!~J1YCA) z|5R6_OUvUN5gJN)>C&Zd#l=_PD3`;0W_6XO3n3xl@0yyLuT!&gb1Q%{>iVp$tutH? zoPtY%NEdT;6|&`zs4oH8*=Z7zvggDi<8H^Bi;|MkIz&&??NAM}1f)C&UiLG4U~LI) z!fRD7gWwJKW94f5(gyV|P*8Zf9qyb`OYPE6fht`>TYGPRV0!K(o`#EBRm4+D@NNf? zLVXGi^@3LTDAb~NLZ0x p~FJG?SyorxIQ&shxigKfY<1k-2UlI?w?wK`&@yOh5 zf@F*W5zq_6?<9(fiXXhZ0-B-(Uy%VZUI~Aq$UiX99RTu=*x0{0-CDn49}hHbedHM` ze@{g9OhMrt6y}eTJK>M`Jno8*i#rK;^Q+*iyRgdD)Xl~@qkzVL0nnJYBaZp?`}Yb2 z;R@5cx`25;czZw6& &y |<%^DnO4X;@drc{^ZEc z&8^d75*DTfEc4LOkq>0?<~^o&zdpHjh1art!P$PH&mCO4c)d-krx3#g2^9iA{apLN zfDgp_Z~;fT!uKm39UVGw);}RB$@(72$SkL)%~Vq*cn>r_+#W9kvuOtj9lFjY## +_*j*yDfd` v79zSaP_>uM}h()Y$siSy&1ixZM21lY{VY8pcZ9yv)okz6%056Q4a_t z#j9^d-=jry9Sw)g iuVml@OcUBHf lq~~|eES|Xaf0sEY-FC$9_gB}RkwV}<2~la0w1+xx{x=;h9FYJ3 literal 0 HcmV?d00001 diff --git a/lib/gaborator/doc/filter.html b/lib/gaborator/doc/filter.html new file mode 100644 index 0000000..25aa939 --- /dev/null +++ b/lib/gaborator/doc/filter.html @@ -0,0 +1,266 @@ + + + + + + Gaborator Example 2: Frequency-Domain Filtering + + +Example 2: Frequency-Domain Filtering
+ +Introduction
+ +This example shows how to apply a filter to an audio file using +the Gaborator library, by turning the audio into spectrogram +coefficients, modifying the coefficients, and resynthesizing audio +from them.
+ +The specific filter implemented here is a 3 dB/octave lowpass +filter. This is sometimes called a pinking filter because it +can be used to produce pink noise from white noise. In practice, the +3 dB/octave slope is only applied above some minimum frequency, for +example 20 Hz, because otherwise the gain of the filter would approach +infinity as the frequency approaches 0, and the impulse response would +have to be infinitely wide. +
+ +Since the slope of this filter is not a multiple of 6 dB/octave, it +is difficult to implement as an analog filter, but by filtering +digitally in the frequency domain, arbitrary filter responses such as +this can easily be achieved. +
+ +Preamble
+ ++#include <memory.h> +#include <iostream> +#include <sndfile.h> +#include <gaborator/gaborator.h> + +int main(int argc, char **argv) { + if (argc < 3) { + std::cerr << "usage: filter input.wav output.wav\n"; + exit(1); + } ++ +Reading the Audio
+ +The code for reading the input audio file is identical to +that in Example 1:
+ ++ SF_INFO sfinfo; + memset(&sfinfo, 0, sizeof(sfinfo)); + SNDFILE *sf_in = sf_open(argv[1], SFM_READ, &sfinfo); + if (! sf_in) { + std::cerr << "could not open input audio file: " + << sf_strerror(sf_in) << "\n"; + exit(1); + } + double fs = sfinfo.samplerate; + sf_count_t n_frames = sfinfo.frames; + sf_count_t n_samples = sfinfo.frames * sfinfo.channels; + std::vector<float> audio(n_samples); + sf_count_t n_read = sf_readf_float(sf_in, audio.data(), n_frames); + if (n_read != n_frames) { + std::cerr << "read error\n"; + exit(1); + } + sf_close(sf_in); ++ +Spectrum Analysis Parameters
+ +The spectrum analysis works much the same as in Example 1, +but uses slightly different parameters. +We use a larger number of frequency bands per octave (100) +to minimize ripple in the frequency response, and the +reference frequency argument is omitted as we don't care about the +exact alignment of the bands with respect to a musical scale.
++ gaborator::parameters params(100, 20.0 / fs); + gaborator::analyzer<float> analyzer(params); ++ +Precalculating Gains
+ +The filtering will be done by multiplying each spectrogram +coefficient with a frequency-dependent gain. To avoid having to +calculate the gain on the fly for each coefficient, which would +be slow, we will precalculate the gains into a vector
+ +band_gains
+of one gain value per band, including one for the +special lowpass band that contains the frequencies from 0 to 20 Hz.+ std::vector<float> band_gains(analyzer.bands_end()); ++ +First, we calculate the gains for the bandpass bands. +For a 3 dB/octave lowpass filter, the voltage gain needs to be +proportional to the square root of the inverse of the frequency. +To get the frequency of each band, we call the +
+analyzer
methodband_ff()
, which +returns the center frequency of the band in units of the +sampling frequency. The gain is normalized to unity at 20 Hz. ++ for (int band = analyzer.bandpass_bands_begin(); band < analyzer.bandpass_bands_end(); band++) { + double f_hz = analyzer.band_ff(band) * fs; + band_gains[band] = 1.0 / sqrt(f_hz / 20.0); + } ++ +The gain of the lowpass band is set to the the same value as the +lowest-frequency bandpass band, so that the overall filter gain +plateaus smoothly to a constant value below 20 Hz.
+ ++ band_gains[analyzer.band_lowpass()] = band_gains[analyzer.bandpass_bands_end() - 1]; ++ +De-interleaving
+ +To handle stereo and other multi-channel audio files, +we will loop over the channels and filter each channel separately. +Since libsndfile produces interleaved samples, we first +de-interleave the current channel into a temporary vector called +
+channel
:+ for (sf_count_t ch = 0; ch < sfinfo.channels; ch++) { + std::vector<float> channel(n_frames); + for (sf_count_t i = 0; i < n_frames; i++) + channel[i] = audio[i * sfinfo.channels + ch]; ++Spectrum Analysis
+Now we can spectrum analyze the current channel, producing +a set of coefficients:
++ gaborator::coefs<float> coefs(analyzer); + analyzer.analyze(channel.data(), 0, channel.size(), coefs); ++ +Filtering
++The filtering is done using the function +
+process()
, which applies a user-defined function +to each spectrogram coefficient. Here, that user-defined function is a +lambda expression that multiplies the coefficient by the appropriate +precalculated frequency-dependent gain, modifying the coefficient in +place. The unusedint64_t
argument is the time in units +of samples; this could be use to implement a time-varying filter if +desired.+The second and third argument to
+process()
specify a +range of frequency bands to process; here we passINT_MIN, +INT_MAX
to process all of them. Similarly, the fourth and +fifth argument specify a time range to process, and we pass +INT64_MIN, INT64_MAX
to process all the coefficients +incoefs
regardless of time. ++ process([&](int band, int64_t, std::complex<float> &coef) { + coef *= band_gains[band]; + }, + INT_MIN, INT_MAX, + INT64_MIN, INT64_MAX, + coefs); ++ +Resynthesis
+We can now resynthesize audio from the filtered coefficients by +calling
+synthesize()
. This is a mirror image of the call to +analyze()
: now the coefficients are the input, and +the buffer of samples is the output. Thechannel
+vector that originally contained the input samples for the channel +is now reused to hold the output samples.+ analyzer.synthesize(coefs, 0, channel.size(), channel.data()); ++ +Re-interleaving
+The
+audio
vector that contained the +original interleaved audio is reused for the interleaved +filtered audio. This concludes the loop over the channels. ++ for (sf_count_t i = 0; i < n_frames; i++) + audio[i * sfinfo.channels + ch] = channel[i]; + } ++ +Writing the Audio
+The filtered audio is written using libsndfile, +using code that closely mirrors that for reading. +Note that we use
+ +SFC_SET_CLIPPING
+to make sure that any samples too loud for the file format +will saturate; by default, libsndfile makes them +wrap around, which sounds really bad.+ SNDFILE *sf_out = sf_open(argv[2], SFM_WRITE, &sfinfo); + if (! sf_out) { + std::cerr << "could not open output audio file: " + << sf_strerror(sf_out) << "\n"; + exit(1); + } + sf_command(sf_out, SFC_SET_CLIPPING, NULL, SF_TRUE); + sf_count_t n_written = sf_writef_float(sf_out, audio.data(), n_frames); + if (n_written != n_frames) { + std::cerr << "write error\n"; + exit(1); + } + sf_close(sf_out); ++ + +Postamble
++We need a couple more lines of boilerplate to make the example a +complete program: +
++ return 0; +} ++ +Compiling
+Like Example 1, this example +can be built using a one-line build command: +
++c++ -std=c++11 -I.. -O3 -ffast-math `pkg-config --cflags sndfile` filter.cc `pkg-config --libs sndfile` -o filter ++Or using the vDSP FFT on macOS:
++c++ -std=c++11 -I.. -O3 -ffast-math -DGABORATOR_USE_VDSP `pkg-config --cflags sndfile` filter.cc `pkg-config --libs sndfile` -framework Accelerate -o filter ++Or using PFFFT (see Example 1 for how to download and build PFFFT):
++c++ -std=c++11 -I.. -Ipffft -O3 -ffast-math -DGABORATOR_USE_PFFFT `pkg-config --cflags sndfile` filter.cc pffft/pffft.o pffft/fftpack.o `pkg-config --libs sndfile` -o filter ++ +Running
+Running the following shell commands will download an example +audio file containing five seconds of white noise and filter it, +producing pink noise.
++wget http://download.gaborator.com/audio/white_noise.wav +./filter white_noise.wav pink_noise.wav ++ +Frequency response
+The following plot shows the actual measured frequency response of the +filter, with the expected 3 dB/octave slope above 20 Hz and minimal +ripple:
+ + + + + + diff --git a/lib/gaborator/doc/gen/allkernels_v1_bpo12_ffmin0.03_ffref0.5_anl_wob.png b/lib/gaborator/doc/gen/allkernels_v1_bpo12_ffmin0.03_ffref0.5_anl_wob.png new file mode 100644 index 0000000000000000000000000000000000000000..b75fa6c368f0a28f89c81cec46c35aa97363ef08 GIT binary patch literal 124422 zcmeFYWX&=?h!yBkUP(n ojxbyv`Lf9d?%-P8Q7HAKza-NnJ#-QkS|vxoItw>QpC0^9=Jf?UkD?(QybVmv&K z|M!33c7AKaL#q9|4qOD^MajSo{F3q84~Fc+G%pAS1oB*7M%ycWr_r;4%fRGGQ=M4% zXr4yH Wx&n_~liBr|J)MFvPyd$?F5Ca- zkPkk5fe3p4zoSc!To67s{J$dtLoG{4@PCJeG`a1a{~aG_hOrFg{&%q9{Qsxj`TvLH zcBTA(XqE7joZ?FuzcLt;^C!6Xe;o-4%HJ5bUS33nu@CE!UXf`2pG$bT0K@Qt@O_ob z|FbnZg4l=uch (9{)|1!^5~h zdSn38e!zJ>X7_7;+8OWljER| R>9xI@ICT(-5ma@%>*XMpp&+FvTV0(qV^+wO zGdme @oyAm7X@z?SBjI9ehYuftV51~U_eay*EEJU{?|K_=N zY8Dh_Rr+2=6&v;FK_Ez(>!@O+%QNA`Zd(Z@zd7YvxQET-LvQ@st6f`C{oeNX{-MdG zZJtWL>bYpDkY5v|ULC3Z==24mPfzey_;sM?jBEJmo@ev4XJDggHCKOGQPY)O)$YaN z@@H!U-9p{yiucwAWA$@>tElT)v)Wg)E(3)QNHp?Kb7{cQgZ+xR)7Skz?FIXl#CyJ> z?@klCjW~*Yzn?bFpNVbb$Dv+td!qNfw|iO@4Pb85W(M 8qd z_ +iJ~zQ$A;fFnZA;aG#|C$XFh{X6j~i)9JQzHEQF7-0k3Spqx+Y zGtq=&`=~zb0z(6JKc~xPi?8?WZ(bq}Wd9o*4#~4=%i_ukui>joaVcm2=wWv(ono zRi@~lJO;&q|B|`dl{An($y6kU8UZ_=`uU&uPU(~0w)>1!qodv(FE_b;KSymNP7}xW zZ;oge%k8JoTAb}ZmvP8%r?9}2p~A2!LyJJBxWJR+LiG9js#8oJFMkU+Xi4UII@ A-Sp zWZTe9{pnwhhGFHrayKKwpmzhM90typmHlHz0lP=q=&rm==lQA1F-P=n;n=q6;q&b$ z%^s6JH#vwvg)!_`-?TWl?GXWKr?|!QrCir`D(LlNGn{*0e`q@- PW$z0hrXqI+|~Fy5;4?XX7CpM1Kx z$%nofb!_&6@w$EfTD<1$XWC(CS`#e-{ihiNVtO;{xrCTIH*)w**tDqw2{OvOkn|eD z4Zxkhb}Vk6zv(Z2WpmCtcSbjTaUO?c*}FkfFAk%~Awgih&=84vwW-Y$LA<6BC<>>B zJp)J(hg6p?(ruE}6isLbh4{_)E7QdKc+EbRf`eV_ ;iqziuMXG+5gNDKoZN~Lo|0t4P$d?UYkff_?a9?8hA)j+-i1%EC}-lo0Tdm>`_te zR`11-Mx)Whd4xS8mV8_i6Z`}RwK0qCcH@p~Jfwp_;=ETx7M2m0_CqK(T&6IyOSBXw z @3E6PauGP{<1+F0@=Urnf_FK*&Bx>=6b@|5f?DOzr@CbCO50Rp+g`? zMQhMx7h#A?Pd~KAKfi9BzB>&EMge4ygI{?~G|tzf2(8#OoP2G9p{CVv&Emqv_x4Vw z4S4}Imxnwpmd-cN8dgD12$A7%Z!ph2%;C9`lsM*uMd&r{an`J(;+`3 %GNhjhgqj^!FtyJ&pP!b-`tPtclU x||~pE?Kj+oEC03 zq1V{UK)gu@M(3+Qp4Mxro9ogwNRXl_+M(eDcP_ST38O;X=wc!d_4cPY> }ct9EUsP=kfh1#sYZQ&hvojZO~~zsccC(HtPsS9ml=Sq%MIK1gupx z%lex$Kn^}qqlBeA$D7%Ix-*HN(D kz$ z?nqb|wu6&XSvRDlzJQ&g*ymrt!B4%$D9LIr!s6@Q^`T2ulZLgxK&)}ocLKz_&1BQ! z>vG-axC|6W*4q6l4o3OfxR97
_3D(H$(tq4B3-_ec(orsqD;71dHc?pHiS z#ob^)7REUInQpgUsq4R^yIYm-%q1^n7hL0fGR2$9LJQXnwEONrg0Qbce(IW-Ti*Vz zyukqCZx$Jj;(iMWUI)KzTu&BqCaYGv%+G2xVL==-Cj+*gRiWdW54Dr_dlN$9x-^ Le)Aa<6JnibjW<=EY>B;#;t0=h>8zLe6xR#l75ky#JCa-P*GsxnR0l1;J@r^| zg#;B4!_>Xic~DO0vaiuom5k7gq2xpVdDP>bS_Fd?`s#G&a9j%6eK?N35nJ_ntfDx% zye_e;cvy`-D(G`HJO7 z;;g2USQ5XJU5J*~)d2d={5iNt^KmRws<%@M>i1 -D*rt} zkJVeRZbUOZ$B-Wm4-y4y5kOp7_^pudx7jou3`G_xUW^qtGhB}qwdP5o +(pzjF-QsIay3Q)orq;i@j6MmkNBaK _0&%(7Ag3j}1HIIB8%z>@l}ONXrj1@J z*zb&PzE=0!9Sw-tWr_>0SxhzBT@II|hn>lvPq=@UEYi^{ZSqN%9I}r7;Ub^WMXKB> zM&O d0a6JZZdhz7MJlGTZ@|qGvK4m!Z%tp%bNSqh9@9#w47WTj4=hNNvQU^+4 z3Wg5Buvo`=zg5vUYKkf(so77Au?%NyXM`PH**xyH67X)V4t%xivnmRyL0uHi%)}{F zmhFh2eS;l%+^nd~MN)&=Ubr?ppu1g~%i>fJr@F)K$>kheX99Xc2<)iQ`Sl7dDVp)- zKyv;{<+gjgBDik#kHeG1fjBjwCVQ+2Awlk9Asmux)2s}*5S}ZKYl~3s-{5Bk32`Qd z5)s`q7pD_*Pvdqoj=g?=m=Ah}lwMiJxMpn? 2%^p; zo4fXYNT5bW@v(=RI@#TwFLRi>&5)x!IWK;ch(C8Noe_-z7yWR1Q9X2*+rd7QFUL{s zU8kD0H!lZpAsW7a&RIYU2c3WYpuqV`H@)6P#7XRMX1IBt*RT6HfEY|i!?~Pus}cI* z+kY#s)&V}NkczDm9q!UDRK4`4>v_ZBE-V7(HLme>vM$1A_UNv0;LYchb=;u+i!MYv zs?z?@3~@q%{i`>S77?lIW{xJtS7z}6{o_b3 zoObTHBgJZPBSD_%WuC JV)_Fg0k*G?_H?G2KFF|W7CE+krpdI(q D^ZDtl5Hsdld`YM%u?uOXttBDyt$8cQD9xWtj99iY~E=oCz>AJ@m3(~M2 z;*0~iEmV}7HFU*+RDfj>rAwV-Hy};UlKCc6vlmh{{P~F3KAihsoP+M!aOZtO7pPZD zJ>5LodbdkcV7)man(lnLpCo|(H0&Mygs0rfQ^+kI#ehg%cLug{z|K7(LEW%NQgG8> z``wmKH#mYu)Q7!8D28$^6W@OWrR&fjoB6ADULwp}q-tRidpOC1A`J4P=Hz#B=N3dG zEdwJWpLU7QBg-K{`(F|^q^?2>U!f1pCiB(NC#d;n>K6_6SZqve5-jjS@7d24;cK z{<7gs;luD)hFv;DA`!md7I_mLSTyHzn^BMVuOs|9mQys4t@2}#pgh>+H3q~PnZsnG zP`-~GHUcNQZj(1tN2h<`fBa{YEA#LZQ->9Q7p!r FWxcmm TgNY*_tX9U;?Y zkK)19_~5>si>|SY({3?0lN`4Z5rcECW2J#ohmyCXX)X>XDT-yiOu>rb0Wm55mh3wn z=B!l<6Xy14!s{1Ye`k>2#MpYyjD`7%k8`JKhYFmmy9YJbl%$%S5?)sJR+-bh`6VVV znAXdd^cMa6QxxHz#Dl$?r+ mH(VmbmiE_N zd$nj71goIwLm1MwQsiJn<0i#r@X;rgcgA34OxR_%gLQB5?()ZhFA$+<^+ADM8}wdl zj>(n=o2cDoq8-2p(hMhZ+_PEI{JDkFxSMBR*02JP#)~_2kLej*cSj|gIVg) HyRF3h*o5tRHVQCc!w?{!u6P>h4;_x9*hO+a+1*V>-2Q%KSe~#UZ{e?RL{bs z29gEb1^TLW9vk8}=k4#xt>pzks;I{WUrog!gxgU90=c-zLlYPcxYYoL^_^V^K)KSU zw?gWfC?XZt6xC-JZIb(nUthEW0_XkH8^2m&(H8 H0iRwzeVyP&0DzLX{m){E1D0{mX@YW`ISv z5trlw#d2OtYV*N9j&~3@GxO&4-m#7%1Nf*-e@`f+X>k&kG2s)0l=L2rT(>CjCJsaw zH?!<)pLrZGA#U6#2z4YbOXm|d>VlBx$cFVB4WME*Y&+XDA0N8hN@~qpI>oY&lJ25> z*906_cdDkH+8wKBySie#EgN>MdE|0Nq;p1EG;TUHUh&r+k-gCzahLkNRe7q!^y*ok z6G8jS*X>!)`1W*B(X5Ea<=y=7wI}z0Py_EsR*7zVf--!k@FHEM6RhT-g4g2(+ 0V$7Yvi_oZXAx{MIR_da9Nu5OZO}|J1{NE !N(THMAk{ANxE4)drg!dT>{kpg(! dBKQjIsc8ejB)j$Ce01lR~>>m3J#| z6&yr{N_p5(+`&X;cz$by=+MMGN7x+T3r7si0R3*d E=KYfvTLybiE7j#@Ne9I8NSE zsICsV*6_dE|3NOH2ZcJ_E&-*QXZD=Mc*+YxEwa}Qo{97`U3eH_4YTpPl|x9-H3L*F zcSXJ>1C#b&AODzM-11CVJ%H;N5X8mrc}RrwGP9O6qeFk0%RVNP98f41gXXIVy5l7A zLDlzLi$(_z?2bZ$z#pQ4ho osN0@`wDNr=OR5 zHsV4Kekl6wY9B+-nvs^_Od$g6O%Ex=VxRfXAXiCpv`jln+vD)Ru+VF#b6@XQr>!64 z524w%2)AoCyCx-;AO{yfkNLAnB!x<8KI+IsEjKq}EFY5I3IH}u%*=itEOm0lRV3!F zzgB0B&vzDTTs27-7#d4#mV(Zyv<#CvwE6O74k~q3O}4K7QhVm8V_zm;zugyhLM3xK zhSvoa@V>R6CpUyymMnlSzN3mF8B5kGvRL^0jDa*)Q~# fn&k_GgJ@kyR1LBqF{{shX$VfnNJUS(k#9Y}}O6SRTJ-?uIaVAE39^ zOaIHu5$|8(-AA48+y@(U9^vVUV_o%gI70o0l3~GzUNkCjser#l-Zkg&xKc;75H=iu zS|ICU8SdUmulEv}R#!-O)tSf%XM94hkrhbp%6%6v&OIs+wr>2T%+0T*Y5DCy>E 5#F;jSk)XQ8 gavzU2zg3QWLo#Z_E6Axh3@GZG?ln*~ zij;=IAp7wWFYHvdQi K s<;yZ0 zGAAhKaN4wui}&$;yML4`$JXXVWaFdjO+jOO*57u6@d69{X^mnId?NW8sRuF$V~l?~ zu&o3(RV?1Mg_#L8zTaJY>aZXBcvwWVGZJzAr@8E05KKN+s`e)^ry=GveaGy>P5o)a zaF2-1R%9#I)x=^q)Mc0Cgz?fu;s6XE@o0L<@y(2hFkiF syi(WUusZ`XHRGjRCIVsqSd)}*Ic(UWRcQSl`SRRgW;5aK;{#W~ zmpeBnxM9O@i4@L_m2F&ddCTbSV !&mE6WLFK> rtS!{NeNm70}!6-pKksLz{ajGZbG-g|dSRxB5pDgEu&>BVN* zaoU}-aO;{%Na}ah-0ReIDFasGVQ}_N#K$Mxre&0K%=TC>vog*Fe?rxY6UJB-Oy2Re zv86qE_2!USxJuo8Nxo+m)Z%tQHQi6tSd{SZso|%1SU#@iO!rQaqW)*cG#{=UuBk1i zL}LY@PXabGpQ07&tC$zE!*IzwQbI?PFNN^QHhAWc0gyxd6JTuoDrThi>k9?i3szU+ zh<0aeIElnv!b+VPH?(5X(^W*{wj^)NiFPh;+LMI?xFWzD>M4|g=n#Z--gF0WLL&XX zvV{=XBA3X!ms$1#56FM$ehyvQs`2_AS**xy)WRWkUA;3OO?1B3wu6<5Lcy*(&o5#x zmn4~5toUDhlD-aeoaY4~v*9tX*;FhmmJ{$i*vq&f5{uuR;XoKJ)j+Qr*K6-7*g_k_ zM>d@>Np)Vp;`?^4G9B%)n@JXwggP!nCNWJGl#GNEley@Y+zjB{ly+@y?Yw~9Vxfh| zbOIRG;2xi*d#!#)RMG1w9+THLfD!|F<=rmt_gsg9!nV836}2P@k%yW*`pZjyRx&+F zF_?(3tZs~Sa#oz^M!*tSV1(Ts$MjWIj%Dlx)gP{8POcr@eZ_4(cN<=$MCd&RJ?0w? z&)>1(JqJrcMyyA}1+h?n*Y*Gsku;l<7e+b(e8&WW$X~jjKUp5v-X*x?_weAsD8b)y z@+A*Hn}2wdakTJ+KFB@+??~pD8Y1luo&9k;KF`YEkp=mW+vL5&SBb{OBqV)a+Po0& z+oBtkR!C_3mn8H`v=`=Yu8eJX1|$Cg5mf&3{83WdVU9)zfZ?3^2|d_(LGMh;6fYN< z*@m;Bvw%dc-I(Z`)ryrlKTYCyxoBYnctX;2Fk@Cl^xc`;M74+7h5~UMUCPys=}^<+ zk8q%8;{cW-q0nZ|eEO%jmheHis^zk%&%uaNo MuoUt}Jn-D}Db%y@ z8_dKKOPP+Dlq5zLC3|Zf63CpSwciWSj k@fkq9d6kI;V$ zRtpfRQfEo*Wl8H5Xp?ZKsQxJ5!t-=RLpN))Dj*DO-*4BT rDk?@au(;5Ir?^FAQmz#|aM zzsTKkc0$M$H`6I)f#JGp6RYwZB&_xpsn!5;3Vt9tzcvB?t7hlT3L2dsZC5c=#A|_{ zdnl1~`uLogSPpNEIeC@ 4H==LbJgY0%kYGUb-C9}Z(>4$}@=n(i*A`5xS#ta7Qz z73Fz6Jkt~-3#a %(umQxetPz7mM5(xXK n z;o3{@YaGb;;NyhgAhip%(GDly(Q(XyYeZOWE{^EgP1Stkzba>ET*|xrgyC+nGSBHx znvSXmHme$bKL618-4Jd{_##X1vpn{_5}gf;uUp$TMdM?Dx_=gveWj2RWuXEkQxOyK za1fY)5l;|oZyoXNRB)Ga8Mjn1C#*}Vwl?*JOOIj?zg6NES)d}F^Zaui#-wn%F5|sf zhI=n!Kjf_3ne>N}>%5)2N-IX5eV!Se^-+)+U3vV$Mr#^xN{s(=C;M~$s;VK2`7NQo z@5(Z-_`*2;5eP1@pQ 1z)8^grT3c87Mr~6& zqBgPWo@s0oLT8!4 uqlT)LxEGD3N;HE-G)1x8EDehEbiMjZUI8U1V={nmT zZ=izY%sUH&W&U~!CpbCMJh`fujW({1e_`@Mu_N`DAlCRxM(HfQ1}Y-R#LUro4*6#~ zkDaB?JH^GPZL2(NX#?R@e2h{qY^rWcETQe1Bw&^6zoEw;X!(AUI%?CH`;o%->Eg4n ziiB36;f^?%SW&-`=s6DvvX^ASI_idb8LDOVdQf&J`o2Qq5QR(5dlmbBfih&={~SeV z%f;9d)_;!uD8ptjkZjYP-J|I29~s34U@D=efz+UL^J}d=C3%$P-}0Q|s2wyc02zRp zP3JG(gtJ(a!#?kM1e5D7lWn8*8|EmgeEx=l-*+Bx$KvK_P@PXw?#;cR9tWKCtI~3B zKLQK>o%PSHkMlZndl649>zvnu%$CDnj(M2ifeQ2RO!)g`X WG#<(ubbvod-);@x1HO^Uk{tTGlgO(dj zzuhXZwspnVqsw`Ba^2XSyFp(CW%E*fm4VI6^H7yYWCQ1hxEC!1? z zDJ?s5Ft5G{Mn-bQ|LIws(a3{|Q>1cuq^IYI)4Zr;xz^o59HJ%_D6)asQ^<@2X z=Nojl(xv8Sok(D%{*P=eQ>!h3SBY)6DuIdE&zp~rlc_WxapP?XknV-BR|dY+%6dL> zZm*7cVI*o>#C){t$<_R%rwi=q|I=p6yYG}NqQROrKv=k^lVvf`Z)B?Fy?KQ6KzU#h zc3-6y7XAEd)6)33WNEZR5vTLZrGe rq{`K7*G->G8`dH*>AgR+NBfDL^m0z z5~vqYoaS=X& ulFko4Y_87gPYr#Puag&mx=>HlIdoDN-zg$l6dDcXib{;t$T(Y zaNj((bZLadF)c8(YtFXv@a8!*Wl-y=tmRtqoZB?hty>3b^n*XDn0EP$Nz(fs!iNhf zLl*w4Tl%H}t5f3>E66>bK(FuKj77s(J|vc+Wpp0$Y{Rk8frQuJppG^7Lpko3g|R&* zx80*((Z-vGWl(q7l%KhccbkNp)6fu!(|ow@0rM~WXM5j5bO*>Ht-ODFULVsC)zgSk zldh~|8+RstGS^D)-II}@S6eKJK71P+r5@#)SHFA6GJ3BupkFQ?V;WO3C1zxMzYOWl zsD05xVXF(Vbza|PIrA3UU9M5J^O@P*$8$TxGSq$dq+cHFcx3~2fNCUZJoxBOC8>yY zX(nCq1ryv-R=#U-a&hmp5AG?f8QBn2uttV_3#%|8RGjYq40SPei2Q3( 7yW+2v$IK5N=PS~*IhNGvs_J5Jdr`ilGr;LcR4 zF!-l^H|k~z(Y=#e9-#GkTks)U@Z6R9tvopHTiAQI1dtH1?HWn prw3h6gaGOB;QTylvPk=~y3YYPJrRUvOz3e!G@hNjqZ+`2+iYn2&kpISXK)e0_OX zIrUzYUpif{Xd^)*P_RJDU;aBeMCds$n0;HeiCE(`i@JJ6dapTN5 |bs0`QcsE{&?%-qj@b0`4-NM)OX*W-Pchhfe5+}r& z`IZ1TL8{E1mw#%SEaFE2g^0lk#ej@e&A6xJuq?5AZL6t<-jv3c;L9xW=^dH?`UFd@ zEN? CphBF2WOHX3`BOy(e9#3kko&dMD?;4uyERI$s4enTg@J=$Y zp6iE8U&}+Lip_ F~CX5DfMb`V=0D`+1fd+;68d7yK_Cq^g$XyTzWUZ zWrvRBYFY#@Z%|D!D~{2JNY#ziUG$_~(yR*KeMVFkQggLI&c{gNFS*OlXf^P8NkrSb zqf!GG;>Q<^PLb}&q__lA+Or%#u;zN645NQ6%k8w1OOPuS_`HvKJc9VP?0yMjqb`yr z*D_{Hs!)cn@qY{PGix}yZzQ_H!_C^ZLO1xDAm+qV6#Je_(y(z=P=lK>uwPm cFk{)dR004yqQKvBqLC z$VHzH9Y6@clCz}88-8- ZIB;Ut&jAF2Y{OEAZ*uQCD-*culP$ho=H=h~MQYB$M3-y&GBhJf+AKmkD{{j5 zg4E21N!xJ=A84h(rxWxXyuR|}>~oqoEFqcVX^X}E781Iu%p~=y`i7Xz=yw-cYfdAA zVuKgDYn-c)LcT!2(N1A&1LHi^T+qA!6MDHoa!s-N^F=|?t6En)8y>&jbJ?(NO!f7@ zHNxRQjsI(JFY3J}01u0j$QCp@!lX3S`l {4; z4_w?8pu2g}iSNQVhZR`Y#oLC;7T_L30|EOD^12GjlZNRehU#OGzblpZq_eC)*7w{M z6~*>hmw+%4;wJc`jGx1aOI&)e47tx%SgH@%hqq%3ZWW4FK{acP2c$dZ-_IXJ;fnRN zk;!Mhae}R00DBqIdaD}1{%pqlL90fjcC>QQ10gK+B6LEOc(1-Sv%kAZMl_JKj^wJP zPI5ivxV3tG`Pn%Gh*$y}Wu1G5K@{M#TfH3!2yr)0)#Z7A1jR2Hie?)z#y+*;i}J^W zuqTq;N=KmE)t6IZuLPowo}(pR({k7_4=a+)t^7XR?CCzibu_MV=NZ#2x+@i(V_|rA z8gSIBnf1~#_fUh`rQo`Tt&6(N+iB=xejgS>N(JvM7r?ElS_h1&*dh^*cA_* zs&ZKg 6?%h831TBSMR+(`FmE}myp{x)(>-4fDxJEeA zQU7z~;*X)V1xnlNylJj5YiZB>gt#xWB3~6ep?8;(Z!q~+GdQOwCh}c6F=~L!mU7V= zJ35`D?sv~cm3S B Z9au)tb?P2xNK)d zk9_e=QbZ9RyA;Ash|92yE8;9+46lklBVGj9R8dP;191%n)-iH>@i{&4xpBveZ&hlI zad}E0NSFhe0emOU81mfC{u5Lddg;6DRhxo-DvQCg*!Jz3m&U_&Wg&-^33Fnp=W0u+ zroxq9kXr-CM5#mPD@afk)nDb)#9k$Ed-#n@(wiZ nfd59A6#w~92rL2 zl$Jp#+wQ*aS}TWpjaAJXn9Ww1T1A93iK671^XDh@e-Eq#w*;_Ll@4wH+T0)4fOD5X zn@vt|>mO46RQjgXv#v}->|4S`9%7!Hzx+T3?lG$R1$T<2Bt#~>+@(e#6cYNHGpXzc zuK*z~CE4fTC-g Yk5IMs8H%-~NH!Jf#isiYD?@mcxSm_lzj!?Sh)}V3 zzAOiwdm+)3$O^I|Zh&3{3t^Q+ pPg03;Tk$Ds~x=Tz-Xe`%PpBL AabH}8^|mc; z!{_cp{r`I2@j-yo@$NWKQJ=9S4*GDLTD_n!{}N^?lvR>|8$C&=c^eAT{TvJ2h29qh z!A32#pb p11z ziwwnO47Pr&W&j6wEZ}(G%*f1#G_x>_{0G }A%bC n!C z(GT%edvzWTOTclM< _Ep*GFBUNnv0_QYWLa1m=gp&@#*Ok3;&Z}7`0H{Ob}lanPQY}4cMI-R z*7kh)9v?p`V$s0fRzV>6A@1Yn>^9_JT{m$j$8ga*`Du~YaQ0ze8u^ xmvqd(YVPzFJb<3BRbxv`LeW>&6t%=3f5pQt=?I8*HH6n#c)|!5qXi!F?6@^^noJ z557m@5e99NZTkI3@O=&=@asUluv3<@v6Xw8xFzw(ym%CDPSf*tmVC2@dmR6xfdYLQ zcb Rtklaor*fjPK>xD@@?r0Yfq>ZA?^aHfjYj2BfI#F1OcJq?duYcAF}=A+OV74 zPQr1(&IoLV6eVWMGd@pP^B?Y%y))@xdSK@}D0d{oGj?uibDqr+9K|{O$4h*)zQ|#r zwV8dgOGeGiDqDSms3-V)t#&aX-eB-|N0~8vD!Fy?=IRPByyadcB|Xi7gnmkY C#o|5}zkQL|7@L z-4`wDyQoqszEUdNMzcE=$5@BoQh_y9RYo73kM&agGLek@nbivn%b9l=3pFo?pBL^5 zeGmC>(wIl_@7glTD66nrf`o~>oun$t){75an z?^Al|YGtCy+0DQy8RCqR1yUD4m6JEzn$(e^%m$+AulXcCQ4!mDWWUJ57{MKo7?vUs zoL5yyqG}tITYSU4^0+6r+yQZ9d|&1Hw+g&=UO)VkB8^WbY@rv}4_trv%}NAQ*oqh) z1lusdBlsEvB|r`bM0Fh;5qIuCkRL{B+rIY2FL8kgN0uK~$2~e9y jVpD8m&7Dy|Wx~P5wx=?61 z+rwe2;|L#3nHrZ(sTdA656!zc<7;;%=~8&r?&7iyztk5Mn{_mv5{*RKk1IqyyHD?` zz5j#EpC9PTgJyL$KcQW>y5!;y*uU$7McG>hv<8pWr~ilr^jk=a3x%!eH)iY46r8M) z@;?+U^-Km|AA$1q+fw<1PFH$Z2 tbY>l7&gr+PvU bb+wKow# zlsoH-oSB#yP+j z`S`jw&I}o`Qz;yp*`e;5q}dHjV*b;>dr(K4 zmx>RD0g_L^jFZiqCORFuUWAV#K&RnzWQ*(a;*auU`PTMa5gBXAWZ*>q?AuJsts2=u zuhCfb9&C|&@`CH%qzhWKo%1G2`X3MbYr3+Fhy0SptkUoi+_F@~nkw}_uzcH481nHc zeYO&IWY9EDx_5@67Exxdbh2`lvP$ rFi2Y7ND{7wpCjH`YLioqFpFl-)0?U77k_%qLe*fIZT6 zwRPwcJjlg*h$p!4aq*!r@jZbLvQtbIu8T*>x7j6f?cfsU(|ap#JM(wwLTjWp!nPiP zyoRVRswkfT4}X+`SBq$|mxlAvJ-h$VnVCyUJW1z$8M`NBlyl|c^pga<8F2;D;#jHW zHY;V=M2h}ri*0x(6KadEI>U|maSgb<%mgcGnZyGeSXZ5#%8lglAgipL!^Ci115qV7 zV;zC}b1l!v9Uxw+J~=OUq4*M(!}eRH18@;d?tclw{0}J}nL>Ae?7EvT4wi2Z$|+YZ z!?~X`+*x(CSX_c$g~TfMW~~sh*8a^jSxx&y_y{A5%673N$=p=4DD TvuN-VmRD@J@})j-9Md`van%UNoFXVIP&ju zYxd3!UWG<#6jNKnQiZbwBaY!~uNP;hhSGO&3#r2wpsmzGp?*y o+8T}6{WJ#_t6G{83SwUgG9|4#@5gxg zbE+9@1eCM7bM &{BRT_#;rSzR`WXT)k+zK0{&&hm7 SRW2LT1o` zM5|=!JibgK>}=tb7+yw_FO8NGv=$Py{FOd}jJ$0`z~{PacTZ0Ki_)o=#KJE|Y|j~` z6Xisxnj6)zx*OFbP&0J&tUV-w%|9xv6?1&af6ON!J7@q~VU=ysT~EQSd(jFkr~PqY ziUAMXjf#>$5Nwafvdh$rH#FCk-uT5ck;Bg1dYaWkPm`apCJz3@ch{?MDN&D_xhy}I zv9l+xu`B4q9N?l)5~U(`zN`2HcS;e?uAsyH{(j6e56uGlmQ`JKr&imC@$BBlk@@?*q{m;dM!)8@E;;l(WiSY8H={@7-OX9}I9B zpB~x>RGRitkN|Yq36ht($#IuaR0S{ZZuGM>xwllt%2%cz)X HMj4+fqvVRFIneKMz-S0A@7L66#Aj?B|uTX4g`sEr8Ux8WJ(BWm|DQOlCEh1 zqCOk!U)DmsJB7Z7|A%+F)(WK)@7cqEP21NJ$`%@=M%-nY%v-+x8*`TWuY+Cqof@nu z-F%ZY+=Yk3#GHd<`D uTl=~!cQI!)027ZG8BOqZju1^OtBCmjUws1 zor7?~%d*koZ(Q;AVmzPQz8**)ubBM12pxm$EcL0f+e|;af4BdWLoeo&f=O;#>Ro1K zC;&SuZ4;(JP?MMqxKlX=u`}6MCRz{Vv?=zKNSBjdp|oDV3aG7cKGRPj1BnYIc;d2d z>k@z_#P{EsAaDl_?L;-U3lo_BeRy@N5d`k_<@lrN51)H|!V^cmgV $R%;TXM|EO2iv}axmI=sqcN@aw2I1^blV{vU z6g=#r+qjQeSCq Pk-1g_y%X~k3N0s>}#$zjJzs0pWtU!<6L_Zd6T;<;k9^S74j zV!PAC^^`y2mpPNB7Dhj$wEtyJ#$reI)!G11J6-aP2z>gW0;}W0(4*SW2f-z^`nolq z++sYVf^3)h7}xt&ygTo|`*Z-(x$sd=9%=Yh!+x=bzO`-f*+i#a)-0=9Aar025uAm2 zwm#c67NTz=)fb9KNi0Tin! 3)0rEaKbwiae1Q`P>uCI_j z4nji;cGZkHW9 ndXI!uALMFnRJl@J{vFhcPwb9ytg13B&nuQ=^c|06(^c^X|8Pekr_z zw4%*#=lv72a~A+vz|r_q=pT;>4B(%ezSL3-Yov-IuyS)DsCYyWXBN#(-zTLI8e}UT znf)l)?_OtwrBNGA(6KbGzUZSUidYXtwJc9e3R@V7Am?mDwmh|_pRem`DZx->S_;F> zw|qMax!OVVEujVHW#BM&*b3sAAjW#F-e&gjX(d+siE$nQ48L*a@rgi?Z2TdaM-YR; z#8l(2^v8}?!yu-jd+hLQsTTNDx5=N^u)WKtwEy_<1?@wZa~u>mmwu#s-Ws~DyzopJ z_-m>ZW~gKc5WW+FWTXxa0N~8n69&OVpdy~@fA#uROz&Bzrd}*XK4^L$%HW{+v<8j! zXH%6GcyhD%Fl(?wr_kv{g7CR^8UaGZqvkahjVuO@vJ%OpGRdKjxP~us8At@lHu&;H zN4>OiFWcHnSE8w+@B}_lORhvzsr-B+0a-b&B9IO9=lWPA?bvQjh^r_6@G?iG6PxD! z*M=`Z3(x#?Cjds7b{hUM%yQxGibd&~X6z)&cruYq?Uh34WmMisv_#R1AIwS0u2$8X zwBx(gfJuTVBj$5g4P{z>dtRmjEk>f>52TZGe6u*#Xm$rb^E->F!e2*; zC 1>VAcc0E(&1`}i57=sFBlcR* >eH2E*;kAmyH{zG6L9Q-^a%@M&qQJI<5F)e|;iXbpyd)0e$0% z{pm?p02ygM;3PQmNdSfKD{KSn@i0E=h6+n(R?7}PeJCLaCUYCTSSu~B{Nm4MYDq&G zaS+Zq{E6u8mIFWIioh>XfplqmY%zoX;GtcN*?Cb7uUhqlqIOnoH*u+;77qIw4ZF>0 zyyOUf>)Lak1=1ZpGTXs5mT9pIi*~{Fq|Xt;WX@M9Ls4P=MGQGh4cs7?GnCZ8=P_8C z+eZMrxkkAcS^2Kfa%I|#wk_=8Dehx(vEC#VGrhwMa!-eK%m{H|+=$25-(4W-*(Sdf zw33j9N&O2+yV{RH4s=qFli>sI#`$!17+Y2XK?{ec{5fC@Bz5{f$_UF#c5JIMWe-j9 zHf1+53&z{X6ybB4fW~Ynez3}Uy7e)+j*$gF6u3gfq_c5_=>`7>OJ^Mw_4c)K7(if9 zIz)! oE_Ks)D358^W1j;@ zp?^cS<*5{bRC$Nb^Q8Kw%=%9~uzjlus#XarKgH5U?j7T?F@5b0qDEsXf{Qara9xGq z2zh7bl1+#a_hJOj?FWgdZA6CSfhLd0P>PNvIX*)^TB-pSoaqZka1{r~*7WE0=Z$W$ zO2Da;vhGa%tr0(+J`cPaUAFQv%X=g1 ^9Wh#bmNAB!^JENV&>8#sIh&(G@|3 qzmt!ZXX;XksIN VEGeDM=QuaO!4@Q-}}}htB^p{fxv4d;-oPFWR`(|v#_ArlLDiUvig@ThqPll zc)N1@NpMmdE4wLD3;y%o;c==O6>D9a*TmCbJ&bu%mVrl)z#$zL6yzX(r@O#5PkHMY zWb36C5>^OWlE(VbvFOuro2=H?ruBWNI8pdIkK(Vt3U#5!$TbT55E|zX%XMgpL^)Hq z)QA&KNgk*CRR8
f%2^?a=_!(toCuN(q5kwngYH;V8k>w?=v86G!dsIYR+2qM zbppY))l8e$SWD7TcfCq*vg{TLc}>0bN^qD?A)HgUF?M~DP|LLkvN46T&Qp57hi0S# zzSJ_J#Z{aa_{pnmyucJg#{#eFJI)EX>evE*h6dt(PyyN&5AYP2CqNG>hm%z7?3#z{ zKLSHQf|Udfi|smLRJ}1`C$OVblw4vu->{uf4f_}P-KUa1E!?@c?`%E>Fq* aQl@yJULANWg;*k;mOVe7zb96*9+BGfaQO5ia_^};3uoV=I!#!B zXe!RQjt^*-r-c;(catwaRIdYFIIO7f3_i@x0Bl_?QEGx`McE-V!i?o>n2N7UE@HO_ z $Y z;xP=$NZG3ji;By&MTOs4XheR`#W?g_=STT2C47D z0l@jNace06s5iMkS>^$ z37vNf_>?jl`9y_YKRcc(?jDWqQB<#I{PwKS?|FM8a^R~0SyRxsBVA_YKryCaFV(sE zlI|qQbw$ LcBAiaYldU0ZjYSv`GEa^foHh@bHAN_Yy4!&+N1n&l@gD=*Yv1C7r0I(6J|aoM$jVi(_&qKhq1bCqcu-c zLwmy(P7=%ob3bdnCA3}#4%8(|0jj#ApC${=u78Y07R2zg3b5vk0}B!$W;NACdR6OR zOZ-d6nhe&Rlv7u}kLd$xGHOwHp^d0bVy3IOWBw7yg80R<_V+w2;5~USaE!QoR%DiJ zr^@FuHpEeHBL{2=^%F$)T?$vq-+Aoa2EzqeugW4OFr5Ew;o+laAZ?98$dm5xGEEEq z%fzXg!8kIMwho@~D5GZhzKh_Yh=ND>Be$Q7%mCs7CEo)M2Cl72t|2Y&>$b{zx8F&Y z3YHPk9p~pum`mLYNvNH|!|1R__Zg{`k-(YK-Y`kJ2Obc?U*mY|A>8a+C6?4#UP8nO z{lSYmp>GWwC?amyd$ta?>H! iPu(>aR#%GVK8m`bhS_{h_lDfs HkdVG} z+}{Pb7DgzQ(x8(_Vw+){#%4FBdv{+SOUfs8a(o?!OZv%ZMUJ;caJ6Vpx_1U_UrI$0 z4%wzYjgITQx( ?gBq#b~B4VqLG~&F#F`9Yb zst3IQ=o;s%|ax2>F*y4e)lL6 zt?WTk{HCxFR#d4dKJy5I9N(_0x{%5#$MJx7VY9ASFQo*Wh_zN`y4-(CjK*Dbky%Z0 z0da!n8p)ko*)47(#}EE>B$80I5sqk?TVt9?1PRjg2(rrJH%eeXZN<}H<$J5v5##5d z8*PnY*``Q}hfVnDN3W4cAF(*v{El`7SC|jI^>AW!;hY=UUSc>~7u3t1k*x0ALfg@U z5;*IIQj!w;08#}c4zK^34{Vx%3U5Mqvfzy=WU|a{u5#8N={F<(fC$_7$+AArQ+5mx z(F11Fp{@t6M&x%6(RXbuY^kX_)U1{X5#3L=M)W9AKd!O?7b8qDQ2IL7((^G*bIz80 z<6b#0=xjFyk^`61p=au30h$b}>5^9f3aWeX8fo_oi4J^`Hk-=)h!8^C^%qdDV64!$ zd6|u!o-}t<00v@$er0e#dV_y5e0AZONbI|1_EnSDQ&+E}qVosBPcM az&tn#p2SMpn)9;KTrunS&-d$4$so@!XYCZ6%+1E24 z6pk&UQ0aUwvU*u(+F5)(u>b0Finl7eq#S}w>I^*(S-xK&Tm~3q;hKl#zz?zQxHb&L z$f|u+CIT <@+Z4KbkG}9tHap^ zW->j_@x#>z)wE$f7?<7GE;UaY!iwfyEqD*1P(i;6uyZe7EGV?h6Ysp&PY3C`+LdTK z;9`F=4Fd2MQ(0v83T;XN999(c;yVDZvG)X!d-0eI$U2iznUvXHo|!KNpn>XlHXyWO zH$KjqoVTV)PdO84$ISs`KFc`>ifMPkR4mB^!Pu3{du^T6RidhGvA3S}ZfMN}VkuJ` z^X6t!;ik>JPyM|fJO)ps%{5#{J@t<}tX-HuU7|^dIK;E$r^JoZ8%jxp*@v-aH@8Ct zk7I;FEoGL53M!*75&~~# 4(tbkgQM{R$o~@K%9BvAW+Qv*>l=G8M>cvu$yLH>AZwMTukg1BUzk zFTx_#5%CtD3l3)Tt$KDZcN@n}fvNR<8nciVOguUk Y|LfbPAu|sAKv4 djB zZJnLKkhH3gw3{6NRb*HWeU*rF=Z$b%P}>SjC9>Y6bG M;9I{4i0rhQwsmgwR=N)25pl=F5k zUOP`0qZ?cQ*Ka|v7%PViJS2P16L#ZEo>WFR3=VSO8CZntjk(u!J0?WESU++6zA?p| zya6;~D(d0Nv9N$A#PmC!$Xh7>V5_4#;)hosPNPXK#S@JX>Bl_=NY)g0rm(7&McG!p z2#ews7LMvjsNlRhbNp=xDw*pcc)GN88dObV%nw- 41lW`(Czhd$1qK7 eYf zUmzm_7!Ig%Ug<5kfV8?`{0op1VppGlw4oVhq^<$aD{vP87)74pcWi>_Ba`QnKNidI zaCR~74uqQ#jWxc~1PJ% )TpS>A>`P& < z(nH@6!H2`yS1`L4)vC$05Ia_XN_B!9oH}i<{l`oG=qdQTRqGqYkZgLjNZ*e4bPB^a zhM1x(wwAFrSbEq6q~k$tRJ7Q}+w{4Qo54$kjX7Z=Te#|_^c3kiCBq>OReaxM%D+E- zQr7&f@=% P^Cj~lJolg+? z1b5$J 4Wfl8^;i;SYIz5cpx5 znIH;`u6ruKiQe%bw2FE?&dT0gA3=|FsbZLxYbgRITGrrrGB%*#p@~QJCtRFi1;cAW zTu$e+eAp^*uK+MvZ7Km-BwEU!M_Ud%+>{d-)X1|lTv`{Xk|2RsQ^!`RL#S^SIHAqo zWGvqEXtmrD`WSGY{*i-UZ6kBTFvzL8?NNIaG$({{{cSZI_`K`%m9s9|k^*LpM9?x~ zwQ|rk5 zS`Eql<(nZ}pJ!yLLw4b$oB@)%3H0t967wsgaU7^z_g`2QTlVU4lrSyaY$gr=pr>GX zO=houDd7KHF>t5s(op2%?l(nt%kL4-8OfrjQ+}OWowe3`bO+{cmQ1DbWyPj(G%b&{ zv%oefg$Yf(#;g0o>hMRa4V)jpNGzP#g;Oy4BKIXgD5$|oUUQvII5R_ZqEBYmjBAeJ zx^(e%Dygmuue9|X)Hj{c%qTzF?QBcfg@jB9TdA)hOJWRsdhhx2g!6_Q4G4SGhDOQx ztHZ2JR4+5VrF#C}d _#wq+cW)l zgKrp$JUngW+WABrFdZN4m`&0<&c*6_q7Z7qPGznZ(T6b^DR6tiF_CT~c2H^ r_8_)c^l8Du*eP98~$n&c!|OD36KH0iZhH9 z&TLjm@0aR|3lT`$WX(Cw<8Rc!Nzi@pNQ(UayJ~XNieY?1nk7JcK<#^lC#9D|1zr1* zvcr4doBTh-evByJmM|1Q8JoGdI|IX 5CfX-@kLTb*7&jb8<+K$1gcS1(W<4 zel{4(;>@XsRZ&H;qf{Z1c39c$Uq{(cXl{$AEayxq5-18{@Oa9N>)*#5tw}3h(r_~= zjDZSDvQ{e0WU4EE?6{)4OYie!#{EGjJ=<<2`V}GY-xdWv2KmqR>ZR~XCn|ET585bF zJsVGc+hNU#I(Q>%sr~-R;jdF+Y!1}SrXB~`OYyp#2K5)k_b(R$3BC>x@R@}+RI!oT zpV?y@iCFi+uV*M-KQTyCkg;))*}LS7W%m}i3LPAUE7L(HH% VK +Jf2=YydrbrzT=OdyAznyZK)oPDKA5`WS0Y`&t_JMTc0mc& zrn s3oHmhz559T%RxMAHh