From 610f0a754971449775502a01fbac6c22e1d12426 Mon Sep 17 00:00:00 2001 From: spdis Date: Mon, 25 May 2026 11:04:05 +0800 Subject: [PATCH] Add async model thread, vision FPS throttle, configurable FPS, .gitignore __pycache__ --- .gitignore | 2 + ctl.sh | 2 + model/export_weights.py | 51 +++++++ model/model.cpp | 288 +++++++++++++++++++++++++++++++++++++++- model/model.hpp | 34 ++++- model/nanodet.bin | Bin 0 -> 107752 bytes scheduler.cpp | 179 +++++++++++++++++++------ types.hpp | 2 + 8 files changed, 503 insertions(+), 55 deletions(-) create mode 100644 model/export_weights.py create mode 100644 model/nanodet.bin diff --git a/.gitignore b/.gitignore index e2b639e..6f937ac 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,5 @@ smartcar_framework bench/bench .vscode/ *~ +**/__pycache__/ +*.pyc diff --git a/ctl.sh b/ctl.sh index 809d3b2..5ebf023 100644 --- a/ctl.sh +++ b/ctl.sh @@ -47,6 +47,8 @@ init_pins() { echo 0 > "$DIR/mortor_kd" 2>/dev/null echo 0 > "$DIR/start" 2>/dev/null echo 1 > "$DIR/showImg" 2>/dev/null + echo 60 > "$DIR/vision_fps" 2>/dev/null + echo 20 > "$DIR/model_fps" 2>/dev/null echo "[framework] 引脚初始化完成" } diff --git a/model/export_weights.py b/model/export_weights.py new file mode 100644 index 0000000..90d189b --- /dev/null +++ b/model/export_weights.py @@ -0,0 +1,51 @@ +""" +NanoDetHeatV4 权重导出: PyTorch. pth → 二进制 +""" +import sys, struct, os +sys.path.insert(0, os.path.dirname(__file__)) +import torch +import numpy as np +from model_heat_v4 import NanoDetHeatV4 + +def export(pth_path, out_path): + model = NanoDetHeatV4(num_classes=3) + ckpt = torch.load(pth_path, map_location='cpu', weights_only=False) + if 'model' in ckpt: + ckpt = ckpt['model'] + model.load_state_dict(ckpt, strict=False) + model.eval() + + layers = {} + for name, param in model.named_parameters(): + layers[name] = param.detach().cpu().numpy().astype(np.float32) + for name, buf in model.named_buffers(): + layers[name] = buf.detach().cpu().numpy().astype(np.float32) + + total = sum(v.size for v in layers.values()) + print(f"层数: {len(layers)}, 总参数: {total:,} ≈ {total/1000:.1f}K") + + for k, v in sorted(layers.items()): + print(f" {k:50s} {list(v.shape)} {v.size:,}") + + with open(out_path, 'wb') as f: + f.write(struct.pack('I', len(layers))) + for name in sorted(layers.keys()): + data = layers[name] + nb = name.encode('utf-8') + f.write(struct.pack('I', len(nb))) + f.write(nb) + f.write(struct.pack('I', data.ndim)) + f.write(struct.pack('i' * data.ndim, *data.shape)) + f.write(data.tobytes()) + + print(f"\n导出: {out_path}") + + # 测试推理 + x = torch.randn(1, 3, 120, 160) + with torch.no_grad(): + y = model(x) + print(f"输入: {x.shape} → 输出: {y.shape}") + +if __name__ == '__main__': + base = os.path.dirname(os.path.abspath(__file__)) + export(os.path.join(base, 'best.pth.1'), os.path.join(base, 'nanodet.bin')) diff --git a/model/model.cpp b/model/model.cpp index 601114f..6ca4c17 100644 --- a/model/model.cpp +++ b/model/model.cpp @@ -1,13 +1,287 @@ #include "model.hpp" +#include +#include +#include +#include +#include -bool model_init() -{ - // TODO: 加载 TFLite 模型,初始化解释器 - return false; +// ============================================================ +// 内存预分配 +// ============================================================ +struct M { + float stem[8*60*80]; + float b1[16*60*80]; float b1_tmp[16*60*80]; + float b2[28*30*40]; float b2_dw[16*30*40]; + float b3[40*30*40]; float b3_dw[28*30*40]; + float b4[56*15*20]; float b4_dw[40*15*20]; + float b5[64*15*20]; float b5_dw[56*15*20]; + float sh[24*15*20]; + float cls[4*15*20]; + float sz[2*15*20]; + float dw_out[64*60*80]; // max(8*60*80, 16*30*40, ...) = 38400 +}; +static M* m = nullptr; + +// ============================================================ +// 权重表 +// ============================================================ +struct WT { char n[64]; int nd; int s[4]; float* d; }; +static WT* gw = nullptr; static int gn = 0; + +static float* wf(const char* name) { + for (int i = 0; i < gn; ++i) if (!std::strcmp(gw[i].n, name)) return gw[i].d; + printf("[MODEL] MISS %s\n", name); return nullptr; } -void model_infer(const uint8* image, int w, int h, float* output, int num_classes) +// ============================================================ +// 基础算子 +// ============================================================ +static void relu_f(float* x, int N) { for (int i=0;i=H) continue; + for (int kx=0; kx=W) continue; + s += ww[ky*K+kx] * ii[iy*W+ix]; + } + } + } + oo[y*Wo+x] = s; + } + } + } } + +static void batchnorm_f(float* x, const float* w, const float* b, + const float* mean, const float* var, int C, int N) +{ + const float eps = 1e-5f; + for (int c=0; cdw_out, in, wf(na), nullptr, H, W, iC, iC, 3, str, iC); + std::snprintf(na,128,"%s.dw.1.weight",pfx); + batchnorm_f(m->dw_out, wf(na), wf((std::snprintf(na,128,"%s.dw.1.bias",pfx),na)), + wf((std::snprintf(na,128,"%s.dw.1.running_mean",pfx),na)), + wf((std::snprintf(na,128,"%s.dw.1.running_var",pfx),na)), iC, iC*No); + relu_f(m->dw_out, iC*No); + + // pointwise conv + BN + ReLU (to output) + std::snprintf(na,128,"%s.pw.0.weight",pfx); + conv2d(o, m->dw_out, wf(na), nullptr, Ho, Wo, iC, oC, 1, 1, 1); + std::snprintf(na,128,"%s.pw.1.weight",pfx); + batchnorm_f(o, wf(na), wf((std::snprintf(na,128,"%s.pw.1.bias",pfx),na)), + wf((std::snprintf(na,128,"%s.pw.1.running_mean",pfx),na)), + wf((std::snprintf(na,128,"%s.pw.1.running_var",pfx),na)), oC, oC*No); + relu_f(o, oC*No); + + // skip (no ReLU) + float* skip = m->dw_out; // reuse buffer + if (str==1 && iC==oC) { + std::memcpy(skip, in, iC*H*W*4); + } else { + std::snprintf(na,128,"%s.skip.0.weight",pfx); + conv2d(skip, in, wf(na), nullptr, H, W, iC, oC, 1, str, 1); + std::snprintf(na,128,"%s.skip.1.weight",pfx); + batchnorm_f(skip, wf(na), wf((std::snprintf(na,128,"%s.skip.1.bias",pfx),na)), + wf((std::snprintf(na,128,"%s.skip.1.running_mean",pfx),na)), + wf((std::snprintf(na,128,"%s.skip.1.running_var",pfx),na)), oC, oC*No); + } + + // add skip + for (int i=0; icls, 4, N); + int cnt=0; + + for (int gy=0; gycls[c*N+idx]; if (s>bs) {bs=s; bc=c;} } + if (bs=OH||nx<0||nx>=OW) continue; + if (m->cls[bc*N+ny*OW+nx] > bs) pk=false; + } + if (!pk) continue; + + float pw=m->sz[0*N+idx], ph=m->sz[1*N+idx]; + boxes[cnt].cls=bc; boxes[cnt].conf=bs; + boxes[cnt].cx=((float)gx+0.5f)*ST; boxes[cnt].cy=((float)gy+0.5f)*ST; + boxes[cnt].w=pw*RS[bc][0]; boxes[cnt].h=ph*RS[bc][1]; + cnt++; + } + return cnt; +} + +// ============================================================ +// 前向推理 +// ============================================================ +static void forward(const uint8* bgr) +{ + // 预处理 BGR→RGB float [0,1], CHW + float in[3*120*160]; + for (int c=0; c<3; ++c) { + int sc=2-c; float* ch=in+c*120*160; + for (int y=0; y<120; ++y) { + const uint8* row=bgr+y*160*3; + for (int x=0; x<160; ++x) ch[y*160+x]=(float)row[x*3+sc]/255.0f; + } + } + + // stem + conv_bn(m->stem, in, 120,160, wf("stem.0.weight"),nullptr, + wf("stem.1.weight"),wf("stem.1.bias"), + wf("stem.1.running_mean"),wf("stem.1.running_var"), + 3,8,3,2,1,true); + + se_block(m->b1, m->stem, 8,16, 60,80, 1,"block1"); + se_block(m->b2, m->b1, 16,28, 60,80, 2,"block2"); + se_block(m->b3, m->b2, 28,40, 30,40, 1,"block3"); + se_block(m->b4, m->b3, 40,56, 30,40, 2,"block4"); + se_block(m->b5, m->b4, 56,64, 15,20, 1,"block5"); + + // shared + conv_bn(m->sh, m->b5, 15,20, wf("shared.0.weight"),nullptr, + wf("shared.1.weight"),wf("shared.1.bias"), + wf("shared.1.running_mean"),wf("shared.1.running_var"), + 64,24,1,1,1,true); + + // heads (1x1 conv, 无 BN/ReLU) + conv2d(m->cls, m->sh, wf("cls_head.weight"), wf("cls_head.bias"), 15,20, 24,4, 1,1,1); + conv2d(m->sz, m->sh, wf("size_head.weight"),wf("size_head.bias"),15,20, 24,2, 1,1,1); +} + +// ============================================================ +// 接口 +// ============================================================ +static bool g_rdy = false; + +bool model_init(const char* path) { + FILE* f=fopen(path,"rb"); + if(!f){ printf("[MODEL] open fail: %s\n",path); return false; } + fread(&gn,sizeof(int),1,f); + gw=new WT[gn]; + for(int i=0;iWA+=!E^5Y?z%r_t-bc@>8|dns;BCy>JT9zA?3bjxv#(bDkDRW zAj5HnL7qO|E7pni{VUb?2=_gre>?-O2eXb>O>pp)HAFkgqNJA*o|&tHmCaJjFh>jM zo^c>D&4dMXF+jV90o})fG&r1*t;~FncCfA&bsqS_P}noqpL~a z@c0RvW*cg0Z#xwW{Kcrr^EIHg@g3owMZx9y^=x+CAdr~hh>tIdoO%gLzBgl_*YFsZc@g4zq1s!lS<3d`VCeR;MdLKfBj zKXYtw3;c5mO}PT%G3yyfz9@p#wmUhqDJHNw)_`mfUd^qw9YOx7H%5Qx&0lXXNv2cQ z2GZI)*>q(x&`#IwRDNL;o%+>>4t*a;e|vk)Keg`HDgLQ>zh>*dFBYz4IHHri8oz4E zbXZm+!DlV|3Ih9&@F_5!lXO&tFPt2`a?T#({ECTG#&by7kpc=HgQ)KkTWs8NN#d)>nhLs3esC(&0U&Y+G8kTSO_RJGD3cdT!-IyMeYyQZOsT{oy) z+5lqV?ricE6Dn&|fE#PASxlk?N?BU)^OTn1Ta{I~!Kas{xmU2TpkZ`sMHLz;XW?_1 z9P|bUoD+TnAisv?q@5(QzZ7ttGs>9g;i)vjYZ>PFrEz(83z_P9ZGN_vGf2F%f>5V= zW>zN7xA)7yOq~I6M5u%;bUx8vvySQQ`$V!{>Ik;JR3?(u@Heab&)okvtNYK;e_P!zab&K~XR&RHbcozV(A8eTJuw=`*J$z(;$O_< zWQvf#9t^W;?BIHt5O4bZFobm7MLjKb?)iNK=q(oJf3wPetnr6c{#xS9ep_1W+YF_J zduYf*J$iqtB0aGx6k-FXL84_2-1nJJSF9aDO`mzwWSz56`+5c3n~@DStsa1>l+M5G z?su#GHM?PBD9w#2_Ipu( zsYO(@%boU@4WK#x+vu-3{_ucnJ%9UFztH4K?=7+?^dxcaw!tHEv+*|%@Sm}N_2jK5J#tfvmzZhIZdoYv+pgB|8hbL(DoLCY&0A2VDxe4U-Q-^U zw4_dUUzt&rIovJ$9{vuF4HCx&t@E%a(hYhY z*YX*yLG-0a6Ti814R~c&q3@kMT%xstmz|3s-*qZxxbG z+MbBxhL~(Z){ViMq4$Wr(i(2q9b1UWHiDanDp*|OeCZ{N1UFW`Ye)^)@n#RVR#XF=B{4?H&Z226eYl=%L9jIOcDoRD1wO27318&!XB znc73*!#;ys!aL4?Y%kmBy8+{$Dq#Lz9v&G);X2J;*7`n40%r7&eDYk9cqH2qy zO)>-l0i`UcX)um>eF%hZ*}$p9H>^i~8%+D*32#XU7ap_|l=r5Pkzpr6E_eXlp5g!s z8n;R7`b(^7gD>=)06Z#@1^zGh;n^F>kh9XBH=LCQ{H6u??1v_~J81=&J~cp#TmqEL$B(-u6xo%zHBuLR&;IGpw47nOnkX*_{F9ng+~L(t#R3C2+0o zA)jou>4R$}xG2Me2E4zIx_Xk-(CLz3%@_-Q{HOq0ziSspe-eSB?b`Iwz^iyGxdYxk z+Jo%N9kMEU4(?sxNWFw+;B=Y;FZ}xBtgUaL$Z#W>TCkUE{!#(+&dS%1IVBB-x`lY! zPn2#tVT@Cn&cRgK$^5-138XYthHr_OjMMauL6V%oRQqgrVweI}ZQ``w9XWVA?-15% zykaMEUEuy|DSlK#H%{@<;q!-S@|v+C{I$t8_~q$-(40|-pQTSj>*Pd`NZJmD)~f8C z!9&pbW-izqG?_*WjU<`|aaelv8Cnmtrh#6es2*K|cM~20sz_k_Rs$M&F&IZkDD$Hq z3-behi17w{b?F}OZD2F0lhqjtlgV>)1@r8-;hDoCu*-ftjCT{I=I`r?yZlnP+LcP4 z9~pt8qR)X22BTd13Up6+f?s`~Sb8?7@#Y3cnD<3-U}|x&bZH~jz8uQ$l#%DoSZMP) z6+UdRgEXC5HWN%APvVE}xQpuht_g+|&!%tIr{I2p2=B3F7hD^%i)nYB#E7UO3^XjH zoOuH-Z@iCo)8`W7z1h$`XfRdrQ-t4r+b>=DCu$X{i~_?^o5B1-GCQ2Fil<*pf|o|h zp#J$VYxph%k_Xc%XE4hsYT3BGW9JKzWiAIM13vOxtx557t zaxD{c3@xWq60J zb9iz24=f~Do@)GmSNRRQ6gR0ub6o{kE0odoy2Gf`l|#hljynA@b^z7g(~qvOT0kEw z8&aucVcPDp72FQV(A2B5=rt>8x=i3e|80T)Mz3B7p%M{(RQXUS-83bL#`q`FysV|v z_<=pulU+hH)<;kivrPImDwi(ozm$GR-$CCkkD-^PgX!lh;eTVJ@xL>nU-tdW5B`}6 zd0CIb{n=4CW~vSMaeFG1mztvLhXoiTl1x_Aq(H#9H%wb`4z5(nL!FCL1@-T?!OU05 zIOdRq<+1gJAooy~yt*UCY%*4%M&5RCy>)8PLHhevTH{9ry&}XY`a*qt zJ{z4EM?QGH1C7-~aAR>MzUTWRKe(CPf741{G@c}#amj**-NV`Uxn58huZiYIQ;7VT zJ^1)=6`MRKk+_{IhflL*VN<>qoE?%5DQn(w#~v=hqjo#la;c&4F4GiBObM}6-U82j z3!x!*J#&1xg{<+HgvALX**!iSPwVYNw^_lsyV?e9E({LQ@R$*`tZUnqp8%mBDa@Hb|Zm zVu!xf2%;{XVP-$h5>JB%5HMjE6FB&w(wfiY1X*Xqx_1~_O9fdRv+P3ZHnULcU!^s3wcCn@=>nk?O`r^ zrXxJn9`B$ zfwa_n2hFjLrp8?!^wAhEY8jhD-$sYhwDW0nb6_0Ri&;v8kGaz=X&dP-l|8?Eg}$Kt zcYb8hA1nMBA<1ZKP`PERfIWz09cRChE!T9Yfx|wKdf|>|OVr`H(?Gg#&{dQiYewdK zNs>+0-DFp{D9n89g)7VSaCz(jP>8r(zsgNhP-lG=i%$L|<7QqZ^6Oi{uwb>$Ao5mLdC zF~^9r?jcwoI~s3$3&H8tkx;6zgc@$10gKwJ@SuDL`_}G<6URrxLWi%oSN$mrXzs-` z^EZQ@!FGrqr@)Uta~<{113$8^gs8vz&V+RwQ91n-3_3XrQp8g*O7A06jlRP+z7K&d z!)IajR|A-BCrsCliGuC=&5&b#5Vuq(uz_2pD7sxhk;VH!bbT=#7VgF{@rl$yu@#LJ z6Vd8?HbmL>VEnOW;@2h2=bxL)I;O|tVFz(u>S_*t&C|4WDw+vuwNm^W*@^V$g0VO? z>MprlR*A#Rqw%(oJuIF?s4{J2AIK`!m30b&bRV*J-79d}Avq|@%*M!vaafZsU>EWt zKs3LV*z2q%+yh;N=ORRDzXD%)DFxQgmP0AO7oa4O#@u8pvHqznwc6i|Eq&2#tkFf* zo*s|KD)+FdyPsmbuLLL!Z{<>=2BB_36DiZ-iRhC}EXi&WEE;85|Ct5(st@wa^YLEFfDi0wh{_5oRb zf=)Y$F!1K)$CzMS@&eRU(g*cx6Y)j*8$o-Z2z_&Y5qq{yfmY4r$v6K}vf1YxmK|?~ zZiBTJ_paw+-Y#K&|9(lF)EEX?4~yWQXe&;hn8d~yRuktnz96O9!MI23u(IPEHdlvZ zO<(r-;Lu0>Va*BbeN~xNj{qO-&BA3NL#dauKL35?TU7nF2hJWg!u_$U*#Ltf5F=g! z+gKTs_z(?tJAqHi*bLuJw!sYTOJwZfW*i!|3&qb&q=y=$*vUOBQDpLHvgcMhd_Ol9 z-wt|!-LsUa-nS|AM{b{eY5HQ~RzRP=cmdoEwGw zt!nPjcRvsfl*9?MrRdP1=SaT)P~JvQ3sQc(B?Bj1C1S6xlJ>PgOTO7tuUQvK?KU&` zOcjV0lci(oujAn(E#!olH}t=r&-Nw7fXa>lyuG{G-Y>>>%%_~_lbBBHzZ=fWx85e$NB27;$(EHIF*7U3ZXKf6}V|s;f zJn}jQ7Z1nNUzJJgCq>I)`|Kd=lBr;4*-v=V6-{2ZE@bh|t!T4CgV%bXLbY8Z;aZqZ z{Qwy~lz%mXybBiMl^%Eq);i3>gp?i@*SG+@+Kl+T0f~64_7#3T`;zr8T@oy|0k4U=_YmEtFZ7Jx2Fs?(j^S;XKDR zc%j;XoqO;YW6P%Ts^W7X%q59v&!0hFdzKKfT|=o%a~^h7EdK}wf!2w|} zW|egb4z!&_mEv6>@0tu3wGNR%+HHb2SHj7Pe^JoJ}&OT z^gew0g|`36kc|!hLtp*LfB(YC&ELnv)$MyZGpXZD@7+4Vw_{tF>v0p3ksioN%$C73 z<$i)|31Oh-I2z36+2hmCKS=U*aVW^21g?|o1nsST`)O!m5~X1{Fu0y`Jr;q1j(%8D zJrLHWhLiYZZy5J^5L{fSMQV*r*k8=vAF}-4qM(1UZh!LWzr=qcKZA}i%fe<$ak_yU z%qMOMr`GYa`SB}C*i*&N_+Z>9YNYsu$zGqywuP1A<%Kr<;_m*i$agJO+aZHqH+1Qj zW@T8lb2Z&3W=8Awe1;D>C-KK}Bf7otMLl~d!M|y@;JwD$)f2sP_=^erL;OD@vp=Gy zUm|Uvn@GF&t)oLymQ$Dc<#c~B&==!U=&HqzbiB0MR~|b6kBWxT*oaOTJai%b zx^Mx_UmZ!8vW!h##a7T+ z=>aq?BY<|erqJMfHh(jX#)ki38YTN=*`ca}eir*JT%LR(WlBRy)BO3^Ejt8G)}Lp; z?c!go}JT(0teluaG2{ zjXA?O{F2khF->!4_8Rik@AO3eX&>+9x@`y@kUAfp>u-bSgG}(`iC5SU8uia zf$BZ($ET}h^ZdHEWQ4_9G@82&T@pURf%^A&be=lDV|_M@Yfi&6yVFpx;SP-PeoV^E z<7j}hA(($iAsMDWpjFZjK7AIYGD22lzU@y)o3frD#G ztW6_!a~LTj&o7>AOr6IH6DQO0beQdK+#!+)_is%m??)UZN^cu*t*I)R`Pc>yEHWmM zrF!(~{^8U~_y%4*c@yrJykiB!l2NlZ21nL^fcF8}EUEq#7`V=bo3?!!#DqqH&$(fI z?h0q}Ca{u?zV`;#Oc_BhJQ$D+ugg23DP=LCYD0=&$GmD%w1>R>bWlLuT@I5N! zIRE2n>TYxi4BaEh)f_RZeftJuxtnm=sYKpx*A$p>q91LGHs<|vY_ax102dZ)iJtE{ z`lWt5>rk4_`}&yjJ60ZtaF=U%eQy{ale2)%^>yU0M{UR6_pczRwuPAKIPi%Ln*7C3 zCH`1@99-%D8fs_T;_UVskayPQ-;DxzcL5zH=5I z&|V`b9z2%*EKCvHdm#nFqSAk}(EqWxzgg&CHWPG1fvCD_!1q+-)(%MFr1V5_9h*fa z&V35ER>={!w?F5xvC!%gB1MZ(Jsrcds`KM;PL6Q)DlgUQmRml*xoBaoF?1v6jFgwwsLq}ur`nPwLRUsOWbF~b@hez_QI zz1D+E?q!lKejVBpAJkiv=VJ1)WKN@C0Q7s)OBC1(RyRtO8=e>hNwdDzHmK>5c zN*g|WwgLymr?8`U8;&-c0c*5ES#g*#{HzC9_Vfs|RXl+WuRn9iHwRHUtDyR`uMXg) zP5E&BV-i$Ar=VR~0LS|^kmoCxK+Ef3!3gtDTv+H6d@dRZ2R-%amx6k-rT!$jU~`#W zbP7Y6+9*z>!v!+Lma(8EUx*vupI17b3Hkn6ME}ZIzV1+$K=`eurA@#>+~s>5?ke0P zCqwSC<$JxD$BZ!8cCnY#Y82z=d-qw=;l=Fa%;V6exEEuUlDX;&iL5<(GaBoJvbV3S z(YS3kUhInrbr+anwTT{tzWRu*S)tg{AjB8(XK`vDSGq7Rmzm8G;!9sof{E`PATwA7 z9Y5}cgX6!$>o=9e#dQ><6mMfMhgXBcdQn*Kl8z<2o^hH(qA_qQGQH@kzpEI1R{ZZO z#xL9Xlj;0rKN=DJaqhkEnDw**v;vl4{Qhmw6d}&04mbd0dOKErE@gL4jptX{++q@M zTUo`!Bs_L+jKJgU5YQ_+4PA0CVaXC9aKBs+2c>G+`>n&UDCsLv^OdD7=ZY}%trB=A zjso|7x%fRM3;BU_dG(13G(Ye*8ftP_Gyfrm9;@Pn`5Poc%n+ydcL2;tg{x0X@Qt?w zx{fl24Y}S#e(4I@le`~F)}O<=3`zckdkMUD7>p`|^g%LoH#RjeOg!$4i*zrsWt~+R z-A^6N%hE`;?j0QMQH?o?)i9;)9Lq;r)bG~-*A8(|#XZOReG@sUN()wTY6=9K#=yyA z3EcK}1sbfSK;_eHS*33ibcKYXey9r!Xeh;+@Ia%Z zaYPb4EbT>Y(jT6(Ds=C>567f$z(cFc%*{;_a{_ll!SxjQ=64ttiyeUgu|@FaYc5d| zE(Fdr9|LArK$cV~Ha~yL5>HJ9wD`(Wt>ocnx&kYin+A{W-iB0_Q0(cIqj?@@1^uCx zERxK@fO=W}bl>j=B^CC2xz4T=LY7Gy?L$BdHo_Z54k8FnxmnTE+z|Wv7 zeu6#Ssf^D)M#3Ez9X8t46(S}sA|IEIq44txD)gMU2N|?!2Cu)ygS=Q@g2{JR(Ctesx!uV| z*zx%-OkY%ts|};E$wiFL(cOVxnr7jXVVBVP!(ov9d=Re2+yT8tcd|!wIw}sE3znH( zg3%*tVB`+qmu`Q?dhJ9(Zq)(iRw+V5FUK?2FmLqgZX-@LnsnX`b$02RG;Z0Y2s>A= zAaB3FB_@v}Az_*)^P8FkPj_}RnVuSf@49j5buAV(9#6){Eob1}a#`A6_!(OhKLj0y zd4XqvG~Ma65po=4$tv$cJYcVlQli$7)v^&%JvsjK?2&ZC?IUc)b2WU(X2Rzw9|XIz z0@$*IUG+gPMRC5}X!J4~4EhfOVQ=-B)j`I9;2Q#vlnvp=##V*er#C9-JPS0K86VpoVpMigw#;`>>fP3P69W6Spg+a zjc`7=)vMYm50;AtW93T`d=guWf=Vgu z%qj-K6k`+`0XW<21GZTu0k7|gE8Zj!(Zl+4GRi=#FlIpMZ1R4^kW;( z3_~Vz7c^WjwDT#8{#w8_O{`=y=AJ{BIsO7qfivV=KVla{6nM5MoqV><$B$P)O$jTrvJCK2m35xXU7JrC5S;_WB+v3o{?r_NeHIz>Ih7REo$W3p=H;{j$#h+a|$ELi$FR=kJt|TiPIe8q4(KXnA9-w z?+%qeu=4LZ%`c>UZa=ZUqxGI;^m!?i+cOkhY+40zvIk+g&?pG7c}bcyXE2k8xez^G z9_=-ZP)1G1lB*nm#aqGzZt(&(_W5RJny-mJ=ei;nu!E52%W?l1ThvP54$iUn*w5ML znUC2Z2xuJ$+B+owuKNBZ&Hut_{8jb+Yw({8!tbmGovFxM4<3VNB6En*uzTn~$_olC zg!p}{MEQs@Qz5Ls4DF7)2!loM^eL4BU-Djr=1IoD`qV+RW&0;GM`JXVF-!-Iy2tE{ zxhVhblst-@=)hH>#cXcY2jpB&!dh1)6ltpm>o*eoUsdA&Ce?4e#(BR5&||TMPPt@6 z&FqiDzyaa#`i4Iwf6alcry1aNFNn^3(2r`K6o-w6Md)a$8}KtE2<&1lXrpdl@5GgC zP<#;&LIn-5wTOe3t09muqywf`iP7GSEih$+KkS-h0^F@O*vEyyUsdJ5g!(75VdrH@ z_la(&Lbv^>R=XYbbBmxaMLlR{dMv%*u!1^#aHWUttfry+7t)u{6Y09d4fLY_8ro0M zp04lqp%cCaQ|0Vs^umL+)Us+h)t6mI?E`|Sse(UMQ%|Jv6BFpQ9~-HjZ4ligk@7ds zV)E}Q^e?UZ6_@>4gElc7OtUSQ zoH)*v`9|r|)6I%rfMIYcM2hTqL*=fl;$>7n==5Vv}47p+5KxFSd;|_eA%w>tp z!or{;fo-=fQ?a>%cc*KBmXfL9h1w;7a7-bQ9-B$}`y68#!LQIHQw~k|1ol|*A?sfw zi_7lML1mdb&MPgLXuP_~DsF}_cybc*EX%lybfutj&?u%NuEy%G4+ZDNGT}Z)_u;y8MU+tgi>Hl{nj{gY9-< z4DkLTn3Loy2z7hL2C4fqrvW?hR?cKtmOTlNx;wKdvrJOldZhltu*10amI&5;$;T)6 zm)91|Ng!pp7f9@d1~%4z0IBE{A4?m)akG@KA%vy}@l?5(x zs~C)qm4(X05@PQ$8qW0-#Rmuax{NjsVDc}*@tn60MvE-P1f{`nV0I3r9QOeJ9Er1hft-_aM#e2=+^OUZT@^LwLCyR%<2++ z4E{hKjM2pv9<}IB7sC=gFV!Ibk(@WsZGb&c4^77D*(Q{%&!(6Ysrx0RyN zQgJm4uk#Xg59-SUt0PI^y<(i8ef6pS5rSP(JS3XklL#&y2)$Qkzwq~f9qEO5F_gmTA2(GNT38qh<0 zPiSD!+1YrtT@l9*AAl{h(r`%Y3@$)L2fsTnCi}Cl;b@uAdb=%+ti0kpxqK|01zNVS z7l{SvdMB35i*N$-O9sTY*_ovAr%2X8ISlewKwa-HCOiH%R+&%Y^d!o;o>eb6r7cCk zyac56*<6w@J`I&*$Dmxx%)h$^{^J?`iAHyCIkRztoM2bl6xbM@1AE)&!RIY2u_<^U zEUdXotkPDQy*07ENV^R8;5*(b8$E7A@vgHGJ3zSChA(L-U0<~{q zc>Ks);yRe(G}Q@k=UXT@G(DX>DtSZ1y1)M2W$=eA{|grV)n)L<(EkaECPr+ikJD~I zqm<$7g~B}+K3a;+JHMn}W88cuaYX@a`buzv@14dUz02zpo~|MDe#GG7%i$JbBX{8b z)?i}1AOl9D4nFB?3hRlN!%6wg#9=`d+gqI=sH^lKo%hn&ItMRw%vV6OGsWCr{QAFS z`VEJsZfoZH9oz&&?*a*EOXVcnPI9#_+S~+D12V>D7ngW48t$hq0)gge?p9GHm)9H$ zork5l=!pYBYxy2dW~e-!@geIeTem0 zML6Sx++WP}A0qt|g(O~Vr4{qj>64d{RL^o9m6wmD5?^-G$i($jW{^8|*^)#{3SH>k zHQQ;%f-stuu$j7?3#V(}M^dvsM3VTBN870leU+U+T@BaLq6r(c zbir%O1$boUePUkO4~1V(WDA@&!>y`I(P_&zwP}|1q*z$QuNQD^PWc z8r|}GI*WLcDLAPwMxAGTf(GaQY|7Jt{3S@m(}NZHDfTFs_2xNC9D5MvZB>VsDmzdq zOC>H*Ug$QUgsfSj0QG%ztlIz`e$f^REsZfO!CsgSUw0Xe%2I)g+K-2Hmw|@CGxC=B zL*;@U0K490;TnnWq-uRA9y=$Fmj!n)y6Pv1sh-U&eTc@%sum4YJ)(Qstt8L(Wip0yXc*kvx^dpzncIzCT>NGOL^#XNrRoR*@(ROcdo5Hja|=fA|H=ifcF4b zc$fB;c>fqqzDFmL71tjNMy))-S@}6)OS?FFtsDt&!t=mWUIeQhH=)4G3>qSH$Q;cb zIC$v;^b;%x;g#hu?STPTHexqfdhimqHLAm9kf!AEo5lu zQ8Zfng=n9PhJ%tj;9|Ngj^R|n>{}6b#RbES%f;wAPK7C5od!=;vr<<_K>+?vcD0VO~#pA{eAe(ZbnHXmi@eGQ?DY zcXm9DV@ztEZLEw!7 zChy$=?G2B~3gPACOIR$r{7KW%fB-Ue%g*jPnRkf|MV{YV4}SDwji+09uGeQ20^gfVOBdM19s}2Vio!t zyrgM4WaUlgCDSS!^HS0V^6}k zsBAcqybl!ayTLV1RNxe3PLBGElWxGP`bYd9B+xzUd#3H(LM=h zEqIA3Ga`WcOkvgoHp5hh(R`goFL-C2VyA~65L`VwjNc$<3%fTQ6u1n$#`M>wL!p5o zYZN&_G$T^5_~K4DwtWv|UGXDA#}e^js}Dr&s=$}N+aQ3y0uhVPb1#~{G9TS^3>~}= z>K4rd&mmKAT68b|jB7q+t%1@tfJ|&9JuISToThs9dMzS5jj2wzlfSMHr0B5=^XR67P6`hKp zIr1^ozKkPL!Y`O2DnZt<+r+)cr_ZnKh1=Vguz91b@I~+xcD&|3=^A7QAu-b-CvYAZ z^j_l5M#$pM@u6I^M*)N_-HrShbzVPn0=QVjf@VWGdEq)7$_kR8$-0a9b#{Y|+F%y! zH5%9PAJ{AIB6r$(8QN8^hXrMaabi;~p8XL9L$Zd^xg*=ShUzeKdUh-7rW}RL_o|?O zJRLzqoUWcYgig6`15I5%pbEjvWZz9v?Qf2Hd6!|yvC;T?mMdngWf;1xuZj^E4E}E$ z$f1ZKtk%nrzP!`dAzmB<+rPiTXL)H5!sie}^K7`Wt(T>Z3HraWVD3wDBWoH^`0 zTEIREuVE`CR&ZQ|GjVeW$CrFINY<^#=yp4hE3$(9ul1psrVGNvXr?jyQxJ8+D{S~79|WU_T~ zAHOqC0vbm~agSRPxxyC}sPSL&eWC*r{UL*cdVS;68;Z8+0+Ve@pc291g=hpMWhO!$HwTGUR0-p_5M|BO5`Q>P4M zI|v(gEC+SM^T|2AwFc_OD<@FUP-FuCPf?E_vA46T|13t zp4*v;n*pA1pM}HhWO?buv*@{U7t+1{fS~Q!b;z5voB2#*sB*ikuRFGd-8#GlJCF8d z(me-YUCj!1|A-2G8n>TWh8mGJRb3R%o(RWOqqz8%FWjUJfpqbFdq^35ge|sRi_I=s zDEq7*Ce*znJwv2m-AMsE@$wN$-!|bZb$s!KaVv`*d|i4P>s2 z#nv8q$ky*>ZAN-%nm>_Sb>S=YUTY_b-zUN=%{eHoGL`LL*n+bs7vMb0&5)#<3%VBo zYxl>%wBB*pI-vtMo+`o5ks|dP5{JNLqZ)njV>Fm-j6?r-JX@oXf+iz)JSXym<$8}s z&tdV9ttHD}mNx)bm)C++(S0a;MH$ni6v1_LJc)0RCn5>DG|%!l49I>*M2Baga%m?T zJiEmj&&l(diq%Xj;T3$m;tOsoA_Yb^$v7y?pHu(Z4U_wYq6}n0+ug?chSUO9r`J+{ z>0LHTy%xo>vk!1%2FvmtUXskUXc)h2`6H~_cnUjKbds~95@6#nA@I=1XFteE*tX`J z;6VFX^8HCB*bVi-sTo5+r*jZl8nhOLZjR*LN2ihzUK*J2s9caI8;wh@MG5wsuK~@R zUbd|@992)eCL<3kppvu*Uu>NZlI@T1p^q+}dUuWtRPraLuUznqK`tw)_QwE;uiRO~ z{?IgkwxyNy0W!y=0QcNh0m<@wc5wS0GJJJAs&-ln)_CYqOZNxt=PC-ti;KZ-If0+1 z*>$1&H^BQL4n$E`&9Vn=SXy6?i0&B``gq=Gd~jceyMI}O8f?3Ob{3mq;nY}w@qM?M z`lm9zTLih-6GU&!BEGP54xIdOiP>!&OYIk2Lg}V;;9j?s3BMJB#~sQ<__-6^xMT;O z)-J&lK?<1Zfy?ijpZx!X=Y95DY$8}KDzDm%r@fb6HHjug)PsNatm1Nb!T0Gw4 z(PzU&7~5lv9c!1tnCFwAKJqg&URS_=6lv2-0}W8*h!buM5o1!@f3RWw9x(bk9ZG0E zX5O2EF_ACX`Sm{7nUllF^1Hb0{ciShS6bg)!+gkY0XX0(#MT%UvAGjxk@vg_>s;Ur zn$7dkP;E5$3r@qKj|5bPnDaVO+d(?m1=yo;{Q2G@SbQRnC5Yc_@fh#S?=!hKlevH5xjh{lW1m(P>(q~N&f5*PG|XD zg4b&yX_pAz&=?)}sQ@Q%ga2Oa1!3dJe29SEoz1PG`>s|0J3h4Pm959RIP~m$iM^ zgz-tjaAW&nZtv`HvdlLYhK>|wk{T6IaLtT(bRT7M#`{68VI+2~E$FM@y~bTV7hufo zEC_Jo;c9*rTfE~EG&wbp{RuS!cS~gq`BDf{bMwi#l>N{y^^u*Odl)4fN6|xlxrd&j z5KF6m%$B`A%QiWg@b|HS_<|(-*yaWkRkPSP_YmeB^9q!W>*2~}Q7Y%%7YA)BgavA~ zWSx8v^kgW($G-07H1G2uHO~oBQ}tkHVHX~X68@bP{72XAFP4| z56GNBUx@zT91;*qV0Xb8HuBL3@bxyuE|UVwV>!yIh}otmI2Zx=_@tVxPYCnG*D5Smvbf}owep;NVG^x@%nVuRELA&f#>DfUd z)O%GD?aB|Q-{dRl%J(Cv#^>>LZ;AW(}d^`xr^LsV>xUmkt%Ki>LiR zR?zrrA$s*mA?>lg2%k5fgRC_n^tOyMow{WReSckc(pUv2x?#b68hTcfmNeqOc){Oq zVE&T+e#r#d+q{xyPhUZojy*_CL&K?N-!07Mx(qr$FM~R5+e8y2mQsrm;nea;1T7h} zjJEWPrq^G@(~iN3blZdt)Np+!o!iGoKJpExTQgi~?5NeWb#VcGUKvRvODEHq^I_Cu zODx^EHi?>#j-&TKc+;s3A=IRg2|Z{ULAezL^tSYR>P)ifkMZ%;%W5wjRBc4JZt?rO zYuMzUUBmtQWIrY>hYbds1!jZI$OZq`%KNoX+SAuXrh@kNppGD_q@*e{mwbh^T+f5-ut!I zUc-Ie*XQ$jUv?$5H`o@&&(UVrY940A!j}ktG#Uz>KDh}OcZSR`lzigz zvTxyn;I1XYigIg(@l#}k#S=VX%92EQ<39%+R@vhrnN+e{>=ND@bDQ2Y zvSNiTa?GIbek3Q>(p)t~q2}24FwZp%Bz>v_B+gQnSr2?_` zP+0zP2=|p1QQHkyNpt85_N~_taawd5drSR5YW6qV_I*}_@lqBxnTg@(E?t@%KZuJG z9nfjA0@L?566WN!f{9}<_HEV>-VvXK?Ylo<(@wtYIVB3JOI_ik(=MVn=LW4UJb{}# z4cQ~x#)6S-5#(*orYUbU*P+YbXH6)_((z{-!QkxY{GqB^8ZW);NVmSN}q!A@& zO*V7$9meUyWqSAgXY^?j6B6nL%T|5|4Mit5COsR{rn<74tv88%qpHy8<5##*heXho z1mDBoK>oDb;D7ucu#Zg1nhX1d)89+8$w3;d^8NyNF?di|zoZtDqt~Io^jh+Y9WIo( zP4MylT)3-S1d~47LRH2Z$ba?+eg&MTmXGhiU=9P@l(vHRCS}a+qu?06A0Bnfv6oZN zfLhiK+*>e8m^XWgP`mdcCT{nJNM4~oJc}ihe0O7j)CfH3lSj8MwV^G~lVDE2r{J%} z6n4`f?-!G(gj*jc<8C9w{3bY{3FsNL?TcF|EmXTz(3xaWfdAZ>}eW=PPNohz{GJ(hf~sweD3qNUS7$bT4oAw3(SS;vo=A-{BpcT z)P>({ljuRat!!ewJPbEkj*C~P(K8wM>G*lKY4K?}sQwy{PAzTtbmClLp0YLmNK1gV z{(*QTL`?X}aDuSnPzLi@O9Jk9ltaWUQDNfr0&o$1370Cy38SW~3Loi8P}%!a*{>Hw zg*Ms_LPfa+>~MBG{CzhR%Qr)Q!}@kWcAoFL8o?X-UApg=4X|*8{!PZ$fQYHfSk6K}+``a1~ud zr@GD)j+Q&lMyxJGx75?{Dm+|pa9k0-yd=r89x;ULF&FNZcCR_^(?idxb#Xi66=2dM zNuk_vZ(+#xc&PdrNz5bOgY)mhI1ul`dY=ve#oKE@DXIW!TjrA5g10bbR4`S%s0x40 z$AQU^C2VY{!H{hf{uquT{!!=As!d0zBAo+sF6ZK_v-VJZR+?2?Kaw@9y2q@}e?gw< zZKY#tvT3GZ1{;vqg&O;B5w&$w`nd>(?ZyBMd(o zDhe%grG>C{H71#@#4Lj(1*LCoz&yK3x z{0J%8rJ&<58^rVfk{(WribZ$Ri%QPy#lmLW)HAh6bsEV%kD2VGpISnD$#3AGT?b#i zgW3JbQt?6+bq`m-sxRB&UwNwkSZV(4xc_I3DOwwX#;e=8 z@l$%pwgEBjOW|VDnq5Igr})8)5ROb2Rx@AjT_Fk|eZZsBnkG(&ra#^XkZGX@VE)H0 znis*sgN}XV?(FA+f$*C|bNN29Y~^sI>qo)vI#<*;cr0kj`oRo)R!*;6Jpqs9!b#c4 z?PP_kGVJG-HZ#*Xcw_Zz^7P{*(${D}=Hx4rBlB9}_^M*srj_z!Yb=4-`o&aoydIP+423&q4uf)xV;%C9mzoOsAJM&S2L{eucQ+O6!db7}KNV@2T6+Dt+ptLMgQ1^~Pqt9^6n>quP zobHgSp)#_2S{I}|JkEJ6&xX1CCQ%oB2<6+I7~LEv7?nJqp5eJDuQxTpWJeE@UH6>p zOy7gobN1qyCJp>0YrrJ#UkQ1WZ`&42jDcZAiC9Hl;oA-^7*q9&v0EB~uB~x+{8|x} zTe*i!IADsZIa~1bL~A-0UE%NSTpFZ%6dZyCG_Dv(!`Wmqb4(+e^=*K_ZTZl-Ybj*4 z-Gz2jS)gKK^yjRLBqFktel4p7%@zf`?KVoNyEGA%#LlBzz)gX6uRU^$e?h9}HLTLx z&Q1DT2ryMF~E}xO3Ll0EYQoM{F;j4(X^~F zjyojnN9=V6==;O31nRTZ@YmK&=xs0?f4tGBm!w2MboT^If89dltf$dOjbFv!!K_g7iQCToYMMwJ zIuBvD(@{`6AqF$mPV>RM3-CTR6b+WIhoXJ?Fc4NvXU7O}-sD19HJ`s{zt_=mZRTY7 zNd^44CmV*UJYYm#9wc~bp!3e#L_}#GS&^d$Px=?3^`0YS**stLz8y{V)k`s9jt#I6 zf7x#E{B1kJ?Fz|VJ{t-Q)8YQKpJbEm1av#QocgaC23AF@A=iB}z0r3ZW}jXP@eZy; z|8qG^?sdk=IkFgO;|_E4HiK}JB^UF>5k5HNqP{SNzh0m5&W{5y`gu5xJDY-gF3PbX z-uh$(uOWH;5`+71GdUyI6f*HrCl{HONvfnyGUJZs!Q)L*u#GyQi`g2c@BAoyY$OJA ze%>Qjr(Gqdv)6-)`c&cYk~%JMTPu`t^Wi?fhitMMBaDCQhic~GR7c`9P2p;&g`yX| zsp?A~)P)dNja&3v;|%z&uM0uBeb{C55FYoAW4DW6VS>a@!nhrT^Phi#DIBSZk5X&s zuHT}pUXv)AFG#}N%O^p$i9(pw01;nsfyzhn>HkCKwCh$eKgj2ofw=syy zOSh5dmwxk3)CGcjtM8${*e$xMI*j^??FOl>)|l^Hfi>y-ap0Snt>929$dpZ_>wR2c zaghYO;%X%M>MDcd$xm|K`#sEYJkPj}DTgJ8CeWU)DF_SHSmlQGl9kD|ziH ze_tEQU-!Zv3Qx(Qv#}s^JObQ&ifOe?GMIdKgonX;%%`P1lc?b;m_AL!>o+^0L0yE6 zHFd?+V;<3p{w(sw?G}oRd&#Y=FbAiaW2khria!5&k_)z82~pxwcw}8Jd9zuR9Uim- zK0GUc!qPBqmCIKup?3mX-ff~g7cIo(Z<9gml{c+&sfFEDw)n2g8m2a!!JM#SDAzH< z<-ZQV_|0NCq2?V;%)SAiR)mtH);jQ^|1RCMt{%dCdckFJ51)|X;Az!p_QaM-P&)6! zk!OqG`}PnB`n-it zoXc>=F9wU?`j#%{++P*4LB#@XZppJ_VrS5PjAy(P4gZ~J;a8gfooM-It@-a>6$KM{ zdZ}4v;NU$7rw!g-+nM}xG3vBaGP2ljKH!w8M;nqJG}WMr0Jrj zoWFd^Tzt9ZEYw6VK@+=rGIrezY@U>b@?TZh0h@JXSVRGmQai{Cvj(kx2KZJgnXSR# z&bbwMbx$%JkC;ddEcK}2xINTr0ubqEUr9r&CVmhd!D`=b!1lTplH!oar2C6u%8~Cd z=n#kgN2Z{4B+tikyu;sL$#~>+2ljNjaSkWSai3}?%H0KcvR02QTqz;+{*(l@K9bO~ zEuE9hv_!7Hlxp-;BXJdAgknF8eUeMkuMTp4PDf~pwI$UtI)l$lPGS2F-pMG=>!GVX zY5BkaI(B4`?4Ps2f8q&9FFrs-C;TNl_9u|IjxfI3zYpz&5^!$T2GIFgh0{GHG3Lcl z>~UXJZvh=K)(1c=BP^X58Q?z}L~T!nHS7W0zJ13NIWY)(2#n$$Ng&?e}BgoYz^r z_S8x^qOcOet-s-%mThRq>rE?v<-_C|#dt|f47at zx5r<=@q8Ory71bDM>f3Yos~m!jwCfij~zN)1XaehFuf?4qzV_XZHtmnt92@BM3#_* zMH$%oPz{n8A!Nw$GX3jna;G^3w61t#^&kr#Phvr8oi=T0y@u0rzN}dTyA|WWOXkDSb9R-W!U74+~KHvLhKBe~((RnWVI*3cnr8=R79euwCl+ z1y-jYh7(Owx!n=9Wa=$(Ns(*Y(ox_ixa7lK#-4c9x!R zYlZ6eKHS$GhEs#X>1P{pjGf<24|#Af_R)8`?2ZG}Czivmx;121ZV%kqdJdAO8l(TJ zH`qc?QsK)`QsifbAuUtD_+UBl{o#T`@1wylsRXoM#$%RJE3@|iuRmScf`?X1)`lHCBR7>1aJLu@NA)z zP_WF9luSMYfzog3QV&z`EIEVUbEC<@^`r3BI1TU!?y?Cgc#Jni50US=r_i&}8&6Is zgRr$-@N>g3_RS|%JpBDA4QR}P(5|!S{=p8mXXZf38os`*;qc(2dk{VKE-`RjL*G=E zQRD1z+%fDeJ=D!-+AoHXuE=26G)4iO%rxl^0mG*x#*>}x97#HsMGHp{hrx?0K>OYI z>Ap>$fKBF~y%}Gq)XiuVjnapYE)NintFup6KBoHCyMcl^{^q?RGJccMEGHay+aDx* zqaTt6%S@Q?B!FbBoPkd^J!8`6C(yGz{nC?JLZ_DuXA4iHVc@QZ%(3^!c!1Pby3XSk z3~9Zj4!hKZSCh`e>w{LpgVA4XRaD(EyI+~7c?@yvm&*_s{t?ShS-_1LDWS})S}>@eW$Q zF9=5{Kc`31;>ku+NgB9I9d|dlqpFA^yKxLpK}ng3T_+_4nwwdy^Lqhm4Gp#zbf3fA z%{rj_gZJn3D&T9Qt7KDRJ}G=;4HFC}P*&$E*%n&LXvY_z#*1>|Hj9PnCGVgveKYJy zD924Ng5iS67D1uKBCr#1a4!7~G^Gt=Zf+-V#d!hleb-A5SPKyH5>Veog7r4Nz%2iv zioOf{82|XY~(HeKO{XXnV8_H@#t=nPwmuh9qTao`lu zPJdk*fr-*tFbt6Ql2Kx@bu7y9x}~pGG>%_30@Ne4*#5l}iLOiuNYrjX>68v~jPGb1 z%DGF1BKR&th&!>BG{z;1ROwfDNp%07fNsVYsr+=_G5=;ZJPW9DCC&_Cy-Ur}XMN~7 zx87EacpLHr_wv_RsuKy4h9X#)wj5sjS+nkcovD?&1#Z1A4ZF^$;pNKJ*zOTUc3;0v z`_&V8;>#>J;-p40m%XEAF~PVr>Niiv8X%n^zKCDnf?RSEq-M+FIaPP+Am)wjEAFCO zeGcx*tHb_qBPg{RhaE%PnC+Jip}qDrT)t9HIO9bsy_#qVcGYW%T(%`HvWdXzO$%YU zo*8yEEhb^h3h7OcKy>Jv3Ag@=lUH0JxJaa0u=Q!XvCw`N)y>p{ zr3L0B|I{py4G#lX=Kv%R`FG2MSE!L32!B6r!@E`HP%Bdye9T5%F zvd80Bg+y3ad4~Fo>gGwF)8W$a%_!pb1ywuB$d|MyjOT+A4BAqN?b(iCoD_uHKK`VO zW11;@%EhKgZw$Hpx)8FiA?Y5`0{TsR0q5{ZRmsuBBJDh>AEpcU@3mt_{}=qM8-inf zWwHCPBds#1196vGR8nLy-PCjfxZhduL^T06`{i;Gj3;^aMv>Npw!vplKk`sg9mIXE z;oWOLZG$zpV9@t|?xA%Aj$AYxQtexaCRczum2V+Pdj+%b(g$dJHv;>w6jSHE6sWx0 zhm$1Mk!S73Xi*dcFCM+3d1cqpB147=z zh-~TuD4Am`oE%(DrN_=eTv|fX?wx{{=bw=wYgH6G(~h#6q{x+?8yIR!am_nd_!W1H zS!J*gYik22jEV#2i%C$``4m5Ih=S?LSE#MnY6#V?B;Sv?!k)XYW({H3RbT>NhU!(sN4sA|T_j#i(Y3wF#oF|RvuBIqH{mko?AN+Pb#m1 zv&MtO`bG}@$&C^6F-ZJA`vMy8TftNRgy1VxK)<{w0i&_Okh)o2IFNCix%@5>4s~Th z;|@7cslFjNR%u0?cAv$gIX?8|I!QLScoLiAR7S49DaEadFF2^*Q(LmqX`P`9Y>`?QMO@IHql$x567?W zW&Ym0Pd>Qhp}Fl=v`_ZO-=CwoANpHi`hp@NGdq*{{zqEKj4@(b`2^Tnkw9EA?FKm% zQj4NG;%MAsB#ay2_Xnf&`F(O7PVTb9FQYt=-NG|Ue^^qsi0J; zi4o~`bll!_c(YMNxa0O{Xt^I=EY7@LQuN}$rflLr5cgNc2ERN=>bc>1vgC8r+5wr>qslN||9b2CX| z_*;STkT-MEUy=4qEX2!&W#IY60K)Fd2}^(6L^LLJb*l8c*IHiIIl`f#uY2i}*Sq{zo|PxH$N1(?RjmNbr2{4GX`z z;~8T`h{`JxoUehBoxUV@m&vD9Its_;3U zfcke6gj1ut(NlIF-ReSlZ?gp^jM<1<_v*L}WjT;NZa-&n@gYQgSPXl0ks8h~r+ooc zFeUplXWIP`(oNiO>#KI+V;F_CDTO4WMi&j2@o8qhH@Vnr2i(Zv`zNLO^uE;r;%FO5 zbxzviht(I!i@s+#Y{x6X+wd|Xo8=EvRe6=~lsJ1~K_E}zJ6tVu)tzd(gyQ=au=T(N z)O)xJ-Z)uFjxAb_FXtwpV$URa`E?7**ng(csaEi}cPw5!F&Aa79wj%(EgJYr7V(yMl-1q6-8YkTJ#v`ad&aw=T@S*^dZ;>ufpuz z54i#zMVyg;6*?-4v2J!8W`1nszORS`2XDpyp`HIvF7`j2niKIx==*3VeN+_Wz9u^ab|DSt|>{V^NO{MtMhb9=Qn}Gj~Tf|0Y23b*lh}#w)!T3y0w^fdw zh4zOpaM>s1Nl8o>z3n!VRDcs4Dm_P8t+7PB@;9T;ALD=U?f$dV^#8}*{?~{9ckb<< zQ%+lX0M|a4QxkrwSU7M-lU4HDD}2`#!-hh;5w)-BQYc zogFZHOc}d*>}YuVCKVNv*0RET(!xmhJ9LRn2{5ZdgxPUA!j&%!*j9gW;fB$s?7tG* z|JPakH_yuNV{+_MkY{%??QBbsEn8~ygmv;%vAbwL+-_W3IxAhxYiW^Ec6BoX*?c=0 z*4So0E35mKJ$u}lRWA7hudQ~l4>{<)f(V!gO&CX`KEZ4Jddka{v0Wr3A zx)i&WEn;u@JF^$e@30GCJ-fqhADia-lzl0Egbj3=%v$Frv7PzD?BvEKusuFw?6SsW z!4BtH|K^7O>m>f2t^4O9*k;DCS;9y*`&KZ!Gkghqe#;!zCUGNs>6kz3+kTJ@k@sT{ zOGU7rlB?KvHxILR(c9QRem3k`IUjcE(HZPZ7az8{a1|@`T*p3nzl5!h_hyqsTv(#( z$v$2)osAh6$@Z)4Vdp5>vrbnIvg$83vp>7muz%Vj*cAVW&_8Y{o znGX-Lc4LmQ+e&t@5vE)J?YXh~--+;lj{YAV?Y|P?%QDXpv6{&^XUBKCSu&e`U1Ul| z*c=5he*KLLkA${?Bx3vJC-vbyq{*o(>G5}&#A3=KQlZWV>ik(acT59&H~QnJIwkOm zH01S&0@(X0nGA|X3Va86|7>bGsrI#?*9)A$^0EV`_M(d(jNQ%zJpau!_zu#cE?p4i z>#akYGofN2A4WQl1Pwzs^nLn_xp_Ylc5Dsd5=T5H^T{mOlnWeKNj4ZtjoczFt^` z_pcwpQ{jM%r=F!jDvdPGREY-qMxo%!X!;;-9WL0&Va4UiOr%Z&-8}LsjYyS7IYm#r zq;Z|*7+Nud*J_CA`PGnT{eft>PJz{D-DyLA3|jpO#Vn~`q~BE!jMCLX`t4P2qscWY z$Qz9&_aD+ff!@gENYM<>Qz+&2o+>O#rY}zz&L2T;3l}axeJ+VakmE2E6bv`F7;)vtu9KrP zc~^zl7+h(hLq1M*rLFrXgF}ZlDP}*>2NPGqSp919YC%cK-q(T0=5@aD!NIPfqNAABt)v5!Kba7r}vBrD^oGi`LLyr^xJ zqZU=o&?6SZlp$dCIr`x251W1^F`)Z0vEcAgjPiI%J}lf#gbfy;8T^9WJyMQOm7R&= z^bsh&A%c8y_Qc0GB;bR*HSAqP;M;+6;*xK}!zOr5c)v32s98z3J>Y2~8!PGk)9v)^ z5_Q^sn%7-2Vr_eNO{4LC;;^hRf_ZqU47@DLp-1)zalPBhZ92b~q*M(MuH-S3e@F|y zbvBaB){oS+)*SpDWMJ}#UAAvZ8cHjB=yuHt^zufm)& z(@D#YBOv@^0J@Ds^tR?Jf~OylXQ$7jht3|_%;)CLmYgQ{%}$cXfi6`0%P~^bVMsNK zy?E+t6l^_KO_52!_^xZ1bz%*=?Wn?4@{+{Y+7V9rD^M{jS7zowAz9rnEwNUCvy~kRNJCmoDErf&Kg4Zc@vd)@i5wBFDzJ; zOF!|w{RzvX$ce?H!S6Q`vq6?T9hix;#3V6e_)mJGAcyo-8luab{TSzC!R>Jz6l8nJ z2=_FnFdxoOM2Tq(KTji;NxR_5eF-n5`sNbV;L;4c9XSW$W!o*p$nV}A5U+#17MV%qSVGhPkXtfQW zB#kzGyw3DvB>hmM2SdurFvigihqVKWj&pNP4Sy)yp$+#P- zQOThcDpem0%g>oZ$?VntW+?v0oBZDi{(s)%vWs8R1@^Y|*^|Fy_4m)J88E0+@RoL*F?0RYe=5BzM~0tuDHp&f({lBk?R@?wu#H6aX>PL+C>k?n{D3& z-ec}kqjg6ytn?ANmO z=v0!h=$vU4&tsU8%~#2b`Ia=2e}4W&)cwz6|Nrso{^v*kUzJa5U=|toWCs2&;G;}` zmw-S-8!r5M$yBXgg3IoG!IyW9m`e*z(NFCixMztJ*yT8JMsZO!j%8BNSbZ2Sk61t_ zn&gwm8n?La`1`h^I?0^4*ljrWBm_n$d68?XJ~cN?>WSC71Gqf-0y8c4Je~gZ8{LU( zaL1J-D3e#k_19lu?|wcZ zO_|Gxkz6bpAv7S3OXZo-DmR#zr%~*;g!8tGWq#Nun`uGvQClLRE6wbxZnT})Z%yiF zPv*JN3(23VIj}=3gp|I2!R*^SjOkm`P4IXkK*j5Y8MXZO18W-n+(uqziGXO+Ad_HM8@J3rou zJ!bB}2IU5^m4)f-y9$0@*fN$i=clN6r|@21$9Zf{Xe2u|A*hs!`TBJM_7%5qwEFo!|eHu0c`I6a8^G!oL%Re%v$&EWX;S2{(IHK zo2CEz+=XfU)AC=H&p*}A#rVDS;?`CO4RSzBs>v2zU&Av%=752d3|?P!jf4O{?Psnr z9OZY0JT%f2! z9>+KxI{l^xt)X=Bdk8J5hr>pdK$1ReWGzKQqF|gs}e&(F>8v3Jh zm@rW24SA_5(9t;x-;F#0YBM*J>|NThbmcu_c3y^TG5t;qs{2uNqCUQIZl|kS;?P!h z3mur!@=%A z8+qWq1gu~Rw>&KrOm3YerOg+(Db*_M`H%5j`Ibg%(0Q3I-)F~k6zhVN%?_flVIrLx z)kykIKEr%>OWInkOn)srjXsvUNx;Y!n$JV_zp1Ok$HY6_nd$b-f+_dtlmt0k728M> zZwKN*`5d@*#2hOZ#lY@Yr?7ghmhF|i2vTiUM5xf0&hJ}Vt^nW)USu30~1YTEGzNcOvFg znDnC(_bd;D-F}&%W%CuSgwxTg!$p`>kqU_i%b4YVIYHm-My#EuhYsJ)9nH8>q?9Na4KgBdD#t1gJZ$2azs&dck=V z4%obaiSMOQ#CANiES>_Y^6l_4H=YDOu7YfSe#;Aq@60NlCNNoi9KPJmr90Yhqvyz7 zaJJkYU8ZGXhGPgs?tI26Tz^Ew_p89HqFS1F+Yn~y?dCf{daT^EHrkSP8Ox~=3A-;t zij-sER#XN`OQ%4i_XPO7e}s_m>{bwR;2$~>V^WU6^9PDTrGrP{ymKkH=v)S5AJ>2t zSL8r8=Ok1=eNK+cyvEhLw(^}}B`RMyn+Y!4hh|I+(=Y#=oE-3jBm3Qngx+FM*t!4} zKd*%^+dn{IyCRI+Ucqz*G-7D&e)5BNr3EQGAgpv1yt(_9?piVnN}n#onsdn1j%eko z#wy{6`k8cvR)`?&MlN;qtU&8~QY10c5%e>Wu8n4d9j=xr#vLZ#EBhIb#uGSsc{+T4 zp9(R~yrZNr7GqjEF#FyFFuNBFe`~{#s(fJ%oO(@fQeUDnE{^(U-@zA`mEc62IBJ}& z#KQ}DMcycZnr)l|HOu62*XjlM+RGgNB(H^U9?G22ekW8qD?uO2m%??AFnUYu2@Rb( z8|)^$!du#lVcN4Je8)VC29GCTeCa4^3|PS=2|0czLFuTF2)N_)iKbmy56$C+FpQms zmL!-gk5$6qBn9>3cv^e%aoC=95f1P>$y>>eWV79Ry0X~~^*4&(cb;P!vg8d^tym3B zFOHG5o@vE|}8bhCjZDf*Mg4Iy%RYwQH5ZRev-5e*BF%yw1l_doN>u z<3gOSmP2>0n2gRJW!ZU^Dsaj08|@dFhuPlZs8$zG1Ez_fz4LgKc~pem3yX;V$^sm< zT%NQxX>x;OL#TXZ8V>X0YbNF%nX|hc->-ImPHXw7iyRT%kF zOnCIlG)R@NhuqY5h`%ZWS(k?iyaW+wzO@#9-u8#8Rinu%$3PO#fA7|FYdH4xqG0-{ z3-r&1-FR@B8s6fX$n+Hz@cNGrnRH_^c*vwvlj;xnYx7ll?A!t(L&cWFC`XqSnbk^$N zTud~*iD&j5gIC7E#6fEwRu?2dfA3Tn*nue4IUfxs7Nc0tYDl-74t6F=7+NSwb1M#@ z^t)`#uX#d`IoQGdRWYa(p#s0e_&H5h#~|djA6`;6q&AzKNx+g^oU0@Psofet%`(Vc zX=50t5RE4m?gp(mX_Aj_bph4X04RG?; zFLd0PYCP`X2c?`B%9ZlI{UM4o9TY*S`zmzmzhUHj1=P?b6)()Yjdc>8bb>}9>~=1p zr!{_(;ij3~hgB=kJ2{Qq6U2hQZ7?0PPYyzpr1AEew`9WW#iWQGNeV1HNYT4hnB;H} zUE7-=!FK~l9Bd*PuYn9Dw!^}2-^jk}s&FWS&#g3dlaqfhFmqF9!*t7Sg1J_GOlVa+ z&XTgn<<+_vCfE(zs|--pNCE4;WvC**8&x?!hiRD8MSL^{>EWRW(letE{X;~A3lC>t zQ`kyQTz43J;8Vo@yyL9n&l584-bu(md{U5PB?U^?F5@U~BMj%Pm_;!S^rvhYIocP1 z8SC`$+>sObW?dVMj80)}^dy;Q9TixTc?WoEc}>Fd(~$Bl8fpfaWkYJX)tHjOts9v43_Gi#wx8eVz-| zEXsmsXB=sWRyjTYU6tAHEr%}@hr`Wdb}*o(CA32yP(Kxg?xT+44)+rDf@%p-S#u-G{}xM`*3=I6mcV40HI}&L+VFN&@HMx$|4luhv+YG|K^sS0=)*Nny6* zr2=_%Rs(MsxZwwNHxP+8WON2kk>u6a;Z*l;lK$j4&y`*X&09DQZzVbg(auWVek3|IDTa=*he^!lJ7>~*?OP+JY<3x zcLF9{ut(Q9!(eG^DnyCMz=NN=8Q1n{IOQ`xDZ3{ZrRE7?I^T5&Gx3Ez%A?W6O-TOc zjKxp)YN>?E9jJMDohoFdAvbe7T{pB9&vS+3<&Js4b*q5Mf;GfecP!NNu7-&dwnEqH zTuz(su=IakgAaBZgSE2?k}K=b`lTN3z4VS4=-k3$yJ=9S?ndYBeunI}0djvx5+YYc z+3ugJOG=I~aA1}V-tnlw1pP8%^*NK?8C0i_)u?=P8$35t%?^@%jLT7+ZEDn+{Mu&dDCcO(w(9wDrM z8$+B!%Bg%qJSr;6fl$i`yIr=?WPV0i-swR;ZK1~Z{cA9F=~HIDYbTohxQNo}mu)q8 z!dJ~$IY`r0CF1jzl0Ak5R!grew zi{nyFT}EQq{BSvR6KN1GTMM3I=XjDy zFdeeU!Pv=m5dBz@tqK*;#l9a=J9s>No~(ik-%llb-e%&pODj?8hcQH3HsSr(nYeDN zE;$h=#SHO@0?R$uu&lJNW`)>(2-!X!bGQy$lk-UBykvP2({T*falvI~_BbJK3VqIX z;jf3o*o5mX*frq*4pd39VP~XxCqxWwu2K@dxgx?Y|EdXjmPKGD^^LptiiJoCRWkaN z9;AveSZXLs&5BCN*zYF9<5WFA2iy>YkIW%{Pe-$7FCK=3FIAvBsTRV-d74>I7$jTm z#BcXiA?KPqHCo!tl`~J652G&dDlB+#AN@Yp<7O*QI%2a8>Kl)OT@IfhrL~80Z)2hJ?kdjel?6`o z83y*LhIlIVDw=QH2P(gn*$BZM{PDhwd^WsF56{sB^IlsrG{X;wgc@>^yFlMOh87)8 zp$k8Epy;h3GC9oxJ{InUoo#dB^Pb}*AWjXLY6$?_sleQGA-`iJS(%m1WW5{5-Ipw^ zc_l~zi?T1I@4y-KT>Knchr)5|a5Ea4y9r%GBtiFzGn&;LM6cjtW`lkj7QeE=qu2d0 z@atqysEVfEH4hmlg$C+2TY*zMj>LEJI6U2@g}>@wWAphe+_+taMAeLf5vf{`cS~Kc z^-K|JZ@x??@$NETZzCqrOP1YoKAE|9LkWxXOmQI9iHPX_q#iHoxPt<9 zwXo3tJJq%j!8g++QQxG4C*nwg?}7&I?4uv#%1meI2+hE?KgjfvgJ*-TvXK;exMS1z!{9aAgWgxwBeY^6_?y_E#DE0O%PFFlrzF6d z?6cfw!7CaqU1>Y3E0&(|4hOG20$O+0SolD6fE+xP%fBDzk)_>NxWt$%AjlI?&V$c2 zISvr>-w&zrq_H&ny8!QuR6l1${rhR3w?`6?E`4H z22YrIq0G)adlwH?1ku1-+b}sT43BuvAd6f>Xvs)*NS)+;LPv zAO$I!M>**ZaafwCCL|@_$Yc#Is#AIsXHR^Lel5B9Mtm_;#vH*$pR44gmnWvPw@~w# z13rBng(km#kXt)^@y#t|loq*zkLPRi*Wd+N<5P!U(^Mfmr*O)2= zGe|w?M1F7H1=hbDv2pDvn6oT%))0fL_f+NaxX9Hej z_*@NKDVGPGymRuykqngQCm-dv9K%e5>Co*o1vLcPurQzybN&`_(vFUpVtNV|teywU zbcSK8Og-JG@frq78c5(77jBmHF<9vGnf^L;6L%!Wb% zch*_Vf)TvC!=fCotjeY4%@@dlwU?Liq)^|clzc>a9&t0IESLPdlxO*^6Vf%Ed-0)5%{$ag6kEVAP}dJ;@rTsVExY#%u7cRf9rZ3E}lW8T9wl zWb#h*JZOxpWAaBR!>;blvO( zPb3xkhGfT`P#OtXV`mkDjh9bj=crIrj=jQM|CIvUR(VssX9GC=NC)n<&cdLGydN8gH(MOg){fN~hD3q|a2V zUK!_Id&RVR&H}$-vDh=K5=;6ONPoL24AhiEZP$JLd?S$PxTavnf&nh5{yAy+>&PsB zq>awB^j9ZGMxNC z0K(Pd;L#yn#LeO8^28mTbX4HokHdn(g?n*LwK3LB>A<^vlK3gmf@(#?g14$Img#uY zJx=Y=X0wvapVffp#5)D=H}GV=PD)&*d3w|7CMF?`pB3fO#BJ|6PPSN?<1(9U^r@Z- zGPA}3KbQ|SRAw6zX-~k7l4dX36Y7%*8PaG5vfkT%IBi zhZJv+9Vu!s(Y2Wp$8g%avPy8_=Oubk)IxY;!U7b$%H*A^At6%(iCyGC2;CR=l!ZUoAlU_@4-h+EjRT6*V?&z|n<9 z0%!00@Z4sQ>=_wLPRy@{0E-4ZNptX{r7_ar27ZPKp-K|J1=<<^hp{&grz(8kzD*S} zmB^SB5gJ5_z3yvClS+dIN=2HbK}ke|d6rOSQ7J>Eq>#PtYn3LYh)^ksG|?!Pq2XQM z_xL^U_j#Vb-v1r@*z30T-s?KA^Zc9&U>>JPyd8ECMeolrOxFr(7B5BmA|16ZD9|HH zt!Q_=S?DPljO!|H(s}3oL4SHau9&TW)o(ZA{rx$N>xvhoW_BNWDPe^@H?6^Gx(02n z^`pbRq9IW7BzF4=9Q(``+Oty$M#Km%z`i1m3CV<^%o2K|X9sO-N?}T*woz^M5~g-a zBRz9HU)(d|c?PWfdW!SCx&hR3yG1lc6PcBzYdx4XJ^< z@Y&vNV7~4s#$0=eqyL6td!{SCd|L%O)y@C29}t|5W|*vSjlLeLLp|b?;9}WyFl=q0 z4)e9(-7IykU}QFZv7(ylOJpW$2U?{%@8JdRU^H~uO+^R-;l82a`4DYXHE7H z>wg0GC=VpS)-P&%BYX!B zih+&eHDS%_P?}QiC+PkYaOC=XNPi56agoD_MecgWprseT&RI$~G+7Ed;S_-NcS!xZ zFmU`>0DTufaq91@urewIeq;`z5@UaIH})pt{VG4K$O)#}=YsKokkp$TngfzUujAP4 z>-5)(G1$B%5;J#Nfn?VSY&N@&r3S}{_d^AY)d-_M6cthZmMYw;jwZ}V9iYoC(S?r$ z@w`#ssh&;M|CG_v*(FdGCPODyJVck3d2o199djjYClEmgybxGLV`t=HdTR|6@pl$jrmv#Wd`c{zfw~o-#J88Ia|0NprVFa~&SR!-@|DcB&RWWEp z1pM5}lkT6zm@-L+Kk>sIB-|XhF1HfQE3zT2S^jr7c+@esd$ALxHx!VFsH z0j60SVBW_tTo$&hvJSaSbRR(sPrF{_I&!2)P&uG!&#xvMINf!7>De`$~4~f33f)ntN&rOQI#GOFpDI39jDbbaqDu z-T2RhZq`{tWwdk1j;y&ph4E8Jy?YXs*siz6WS@Vy zbg~M(KgtP~iTkv!B;Wc*(q3G#A&cDHl#Q(pHF&A>64hI`1iJmkqJHLDE@fOGrvI#g z>ih(vKQs(1pWlV&YFkLFnt|XzAIuDGy91SC5AZWBBx-S`cqaTJSEcz+xF_oA4~ey~ z!l;vs`>p^z(qf^ByG!W8j)YM~g1+899&$C(Aox`gnrF|$rrH90Q9lcBROaE_>L5Dt zrLZgM3a4^YzC&@M1gtdD;=LzNLmWRA?%Eg74K2##_Ltu@qW2Omu-wfwJs$;!I?pjx z;x*LYaTM?R(UKZ1lY}`(l89QJ1B`p~hQ6%WM22r0&PUa|)6}V*WY4WCQCi4$G&*yL zUfB4M9-5{t8vk!CDCz`}4MWeB$=Vv`RrLhXWkD;v@!NNKa3oMhw)nhez^<6zwJ7yg5-eW_} zW{>5EEWb`-wWs2*7w(X3{03L(l+Y`)u8=mrB#6>|i0Rjk36xS*(9j21DJ0v=Q?5~m zexwMAIXuaHh55WG_})vNz2w`z@-n$DEj`HhHczV=VXt-BE?7Ix1m$X=U4m5 zV_|nUTc(fO6ul7hRvkk5Z+AG{Cg|Gz(@5{92Ei%6ka?CfiyS<-iJ)u?4W6S-CR+u= z?whjku~v;KHuwn+dmqu5cU#1+!Vat7aw*(1evDNC9{5>59yfT@(8X$paaY_odP9WN zIZ+Na|IUQ^Ib-0`Zb4twtR@P&iQJ9fMY!Iho4b)#%0#M#!RC4WM7&8s=#M){7M=Ra zP5kE~ex2mRJr8fft6i@lUHkyUKBmG;pC=%GGZ;SJ5NH)~7H}|mC!q!=C>%EtIflX9 z;0msG%Q?ILz6q0F`;9cHPI90mD#kq!zol z^#gMw*n(~>oJt*!egyZKzLk%}z=Rr3sq{86>!AoRwmoRaEm=_Mg z^n9o(9c@1a>{pw?U=1g{<<>}}heyETyH*&fE9kpby4Yl>&i&30qwS8)&@&^MyHPAS z+RTFJzr`+~L9-yY^D2{j<4CQT5%JytS3$d3T&5XvJ$b?ZyAimG=LeAo)MX^nbh3{&QR|LUq!S?0D*T z(-clFzt?cYRrj zZnekxvnj8r$2350tu-I4auiDTEaq!YU&3mi5&VpPNwy{`p5Jil5KK804D!mzYCE5S zQXftJ#TFlau$vA0YXJw=+q1zn=rqPVO-HXRYof|`W7@>8V4TXbF~LiPF!ldL82+y_ z_#ao>e~#eYw?a02+%>j-maT2RIFdbm?+qI!(amc2@~ooP2KI!!jO|eIF?Q{#8MdbR z_3WImp|lWDXS-hqvrok;wo%ThEdRisZJyT29!~nmeu@}xE0?m9b+avIajPdQ{-Y~U z#%{3pIF23Z>1JE6IoMX{&tgY+RI!okDXZjqj&1(9gY{C?vz2v-VrMj8Wz(D|upa|8 zY|96vY)1~WvejzUv*oXT{J(r<|2x6*KUeQx62s2$c47D1WwMe|N7*4mz1i(&W7!qs zm$CJ;L)f${8`=HkG3@arKCI-HF!q@!j;(KuX4g&M%odx*v*!Dv*s;AkS);N8?2^ex z1a@XLd*xR;+Y&vC-DnfcDl`WPq4`i&Ps*9?DPGUMntOmfV}6XipB~PxF^gtL9o)?p zzC6ILKEICLIU}A`iB4h@U^|p!phpHux`tS{XdP5zieDma?d;ICa{(ICbbBWN@>Stk)|WoLGcI1Lkbhk*I! z>u@%}iyB-j6>px#N8;Dj?3aA~3j%SC8{s-H4@Yn?1C?)U)56_Q1#&FAoP zNjWg7RD%^<&sJ4 z#2Hfjo-rr6t5%Om;1eBmkvK-L`Ne`-Ycerew;t3k4`$11*0Ix1q+)6&2c;vGskQD` z82nTfpVghmulw3CU$TlSB@wL6jDYwTmtfQK0djuRc>eKoUEbYcGXx&D;vcsif%7yD zzYdfUc`C+JODx%C-T!FfvVB32GL`!DEwP$f8BPSL>p8D#OP5&ShB7w9j{fa^*paHac5 z{=n83!sM=ms_$2Ufz~SM$=k|g9&CWj2nm>SbO9WEVgc_LK7>1K60vlaCrW(Jr8NBy z+PiM1^+u9>-Hv?FTdWTogFHcMU;+56U&ND3=dmGLOZf0BjRcN&V}Ex9q_nhwp-&Ud zj%mlK8)mWlyi>{O3{7|uFcx*zNAl%Aw{YCk0O&q897oLEhDoFMb6pZ1RFvP2p^Fvq zasM^6T5=Q1Hwcu)s}W?M$d@l#kVur}b@08+0+_e26FazY|q=i^2geHd9XSA6ZMG9qsIcW}0MYj5IcHln^!{=dXKvuZSw-MxMoljem*t}w=H*|PK$Q) z`}YO#_Sa59;>ZHBB`1M;WvW0&=M7?Ja0J$jbH@jzD_O17wNyM&g`K$QDha%@60hA% zVY|AQ&~Io&mYJ@AnFE8_`5j8sWppE*>6Z_G(vL#UO-FW1?Ju0{p+|o&$px*R6dXvD zM8|Fwvg6WbyeRJrSs#pIpNne}TJ%a<;BO%pye!2XO~MC#QJc>7R}T~>6K+?(DEef@>tug#!+ zb2yV7_y})UFqm;@uD~x@flunZ;jU6Ha}GuPey$8Vre8+yhv$(Wm&qs{?GhBG*R`Z!$S(Huf_^+1XBss64w5r?tDFq|Zqb5Z8%mkutnc@Gwf>pOJkXtCAj)%kus zO+wEJ#(&KWMsfRk*gjc}uTi@XW^b+%zfNb=ED{H)K-xmh6_DiU+(LDztY`3ua-O1Z*x=a6!c!FOAHi~|g z1NnA+Detz;1Lr5Z@)4JxaTSS6v0QK+zkN^*c52f6xZLmfIPCz8FY*K{r8k_+Za298 zB#K5Yx&arwX7XzrnuJ{NR$hMhW4dC4Et>1h2PIV%i0BK4F&)G4QPoFrL-9|H&OM90 z)B$(U%JeXHrF@lvGt;qI`XZRoG(m3_jW1Met2mJF4*usKZ__+QO z3|pYg>d$wFReQ$K^H&t;JUEFvF?2T55cHgc&L0Yi+cbE3HXAM6JHTy212Suj z_=MuAjI?PPsB{$LSWjp6Us5LB->SUU+U`K(@EZvq$Sj^9N-=kvi4s@Oqn=OwkdXQ>DhxJ1Pfc)_)_1+y>zC{wz|z zz7l+IR&s^*4j}!cis`p`i*j`nA#`Xinf34m^qGgC2bs)DU+M>E*G+iaGX^`Ws|d!H zVw&}OFne?v9))hkJ@-!&{jMIWQ)mi4UrXqe`e`_(Zztb%@C!ytuO&fWZ-I?x0m$!+ z6nbz}0T*1rU0a1N7+pu$GQk9vQ%9WJkOfO+cjGe3api0G(FF}WYMfaM@e8+r*^zg+ zFYzq5zb=^`G&cpE$!9RL<}rkCSb{G`C6gW{1+;C=f%A7Q`4HzWF7iqUe42O#oMO7k z_bqm`b9)q&v}BRYua$@?iv`E4FFJ0$im^j3;*XA5*t|LxZauSvmE$zold&4C)&qT3 zhb$8Ap-_HMy&X)uZb4Ir)MDcOuiX2yD`D!V({Ll+h=1%Y2}|@YkoI8$w)mC`U$o{f zWAS+|E9EcbxxOah>e-PPEp?8}OYeeon*s0^y7Erd?8eJlws2a%4UJB}qBcq_uXsm` zZ}cvqDK>KaQh`Mpu}uX7L|bvr_bIq)%s77i!Wm#G?+*jptsqc69s~7VsKM?&PGhtr zzW0{o+buGPOhFz_D6!$&>JP&`*-?Tsu?ccF0{vt9i);_uL?>-fh505DeDLKFtX!)h z^K<4n_E~ZcZXfvzUR1c_VD$;0l5>teF$!WX4ciS;pB=FMpCRe7s{~nxaC|%DEtjc3 znfuv$nKVx{;-7l`LuRcuzcS<|I=wlG-sVrGXHscgiUl^HU3+ZyxaeuTV zxpPS1%lYhuBh%#Ad9(FMPul{)T@sGR?2Bpj?k`Z=V@}+ARQXg+8_ySLL%pp&-)ku% zKTeDAhDHbIPOqU$>r>!k?>7>wqQ_7BX-<^KsjxO#@mS+I8p@n>`TfmBn0E!l6O`jn zw6%o(XtZEMe=cAR=WL~I^IPz{$~{Os5XuHDFT_94PrNuOl-uzM&rdl(_P@GAngq9& zPsu2_I^#Dw+If)Yu8HOQUdaBJi2VOf8vi9C|7XUCtsDn_;z1RM=PrP)ORLG%N%i#M z?+2W<`#rj}cL*%ra))!>Hyn4#)DXkhaU|8Gn;X{BOfvOqnK~i+#s$aIpPU-W3%7+I zVe>(1raLsy&NtB7< zD}e?4dk_&%p2WypA5@|AlG1IH)Zm5Z81dMD<3KJn_P^|e|GD=6PFerC`u|K?|7*&6 zwPh(e5Of+&O-}{YuuN|Az$5B-R~yJfF*R^9gnkg$Gkn!J}0dDVB!5qsB47id`$Jx6J-jyUSvG^2qi;Uw23TF}Pt0VD4;&Dp!mP7Vv zRr-nEVEE_Zc;;*>t;?NC!jDcS+e};_c&rVojIn^A|^CtbIF*lVR&M;nSznxW&}OX79W_ zyeRzrnlWe4^V0&H$(M^WR<)yF`z@F{Bo&OF^wHI}HiE7!(5GF(QBs(gg4On;?BFa2 zsM(GQgT}LyCabU!FI`#tqbJFx zNMbT)yk4F}sY>$?6QaQ6Y`oYoZwh)U<>Kyr&++ft4R|A68n6B_BQlGo(cvYFpga2v z-E>t2be1Wy`_ki~(mxSr?umwPrLt^s)&ge58U}*rc)(|)c=-Kb8<~DX*yU6~il3$>uTX(prI=^h9WN`5?r&sDYza8yP=wIygNoMP)hy zcKFMSM@`%aV?u3(6mKe2N^|5%-8hsj%fbPJ;1JAfr;gt znc}&Av~$NP68822T1G3fuhATbM3=*z0c)YrIS6|P7+f?_4ZR$9V&jTv{8{#ZG#E;v zyACk!Vd`-HL?D%txK2W{j*)+7wnI~RC_U@t4vyEWV3-0+F796kBYz|lS!IC+HdmMY z5weOl_ny$z=N#!ih1oc6SvuaG*2M*EwZ;d+)8GpQSCS|vLBI4QkUtrYB=q11vaH>X zakF!!m$DL3K=U~_ICZ@ByoNl(=O4RJ) z$z|6YqHqT{+!N>Iqga4C_^isp^FPdommSkEr)e8O=$HK95(kN9vm-v+lna@p| zkgv(0pSv~ihr|?WD>h(fOz) zz6zWPY3WkLZ5&H_Zbgb;?A0MUQzqib1&Lr3qsn=|j={N)l%ew-0jKy8!soIW(tHhI z!Qg-N$4~~h$R@yQmr*!unKuNEHRMiSp9uQ1LWwxwB(?2($^Gc`VHz#Mn6_3!$n*U` zLxM(<3u84gXQMQ}iwmdIC#~XcFUWy6M}tMjQx0NCxI3}E8p^4xtR=GD65#hejQJ80vkV1`JEANE-dTMdiRB>WK9w_+32Cnqukcg;ZLs!C37)S!1~MWfH% zXXMvEe^}Od3%t|DllPG-?6g-GxlOaopxRgs!>$IR?U?uQ?q?i5 zIBqjd?zKfZrD3!$T^W4?pOFmPQYt@07xIn5MZ4FfQTbVe(Ymk|!aO6$sJ;tyz48#c zNRNlkEm5Q=K?1(_9mP87GPpJ>hPXvPh2BHCC>tP8Cp5KF-$HG2*iHtd4tye$eFw31 zQbok~$uMY|w*-Bq4RDj-BQNZ7#kLWuaO0E%MvpuN4sNFCtTz_JU&C&_^R4WAVoeaA$2M+DqTU+JtC0nw&?ow{9Vu zKkHEc=5wUvr!dtn$)bS|&VcE+Hm>)X4fb@cqTxD<5V?ISrc2MoYa%1=*!-0=u%rWi z>b7%#S8sy#hGLjfD+47jOXwGkOC;M;x8jXc!B9Ta0_~Q~Lt>W*xXq;3WL{>kXg6dxL;eFK>NRK}To2`qO1h3V^r!fdy1x8Tf zjt%tvlT*~;(l~Z)Wj5R$m54`z_Y;rKX5#l(g*8c=i5q@?Wj=ZoiMK|NqKf-7;oXZh zMDN-mbe>m&x<%%sQr(D5nQ*M)_4K)<`n{KE&ic`y{=tNp4pAo4=kF#av#;Qj+9YzR zvyzVa^o~^5CDPJYYMi}v9?rR)3AtZlsS{kn_OfjJGtf>}zFUJYrle!gw~r8Z=MC1x zq*9xx5$vD3sU&hKi@TFwV%!ZUeDtsaW8_ru-eh+SU44M0=1hbYQH~J3U=?a4y(e#8 zk0(P%xncYYb=-DqDXu$iiZ7mN;hOjy>|Q&ZFUqhZkEE2byMGkq|2oX&a+C2|++-?~A#`HxG#0J(-3*>@`$+L!Yf?7j0J%HP1}fJM zC5GCRyO}i{W}ehUhnCAw?D&Y&fO|A|!Vz&z^JRGV!vj2)gfRNg2a&P%t3h$0E%vXv zOK25^q}4-dt>7Jf{%jl?Y;?!fJN3cpJzXwOsebyb~oGoLZV!=()81o2L$=-ynnS04=@`pT2iNjkdDrgWbg}PUM)1`kk zF}-Mj+RwNQ0h`tEk$WJK*!7Aju4cu{H!gzE3pY74!Jj_PdJ)|_OPxsfs<3ts*I`A| zSGs&lHyuF|X~&Q8c$oH(lL{Y%%g}8|&i1kJui=if_}|$JH~PG|Id?rpeU0Pk&2uHp@#s3@Jj4e&j@$*Nrb_%Vr^6z7)d09JTP1D4UUxrer&Y}GC>cvpkrVF3_fl*)s zVba1!@T&No$n9$`=D+RXoLIoB76S}AEy37yzZb!@V8NGpm8dp+5RE(Vo;qfmf`jZF zsJnj{f9;XuIY~3vU!YGX8#mxFw=l4ooJ=ds&%+_>WbW%^Lv%eX&04JOrCY5>;liE_ zawXCfcV<)ARXB}^#~UFTvI}4RInCKmJ&fgZWZBuR0z;v7F($2!!xSM`7d;S;3JD+3 zDJPNeZ?%}>>3~4QJwobM zWKp@sIPznh7wHA4X%(9R6;MT7`B8yvItGcwX%3; z=nQO;vqAp>C9DZLC4$dm_$_a&z;t~JwQ4#-|6aL(5AuWIuvrkOEq=(bN4?R(d?HX| zdoE%2PW1542V)f*Jnmt|*{F?X0@XGOoai59ZPPGdvh``eqfx|rT>zemy9nU?q1yg_A8ERaYUQ5 z`vo6M1xOp7uq1g&j?TA7)`&AL5-c|9)-4~83)rZHhS-MEvp*Z4%f?pr6!hEJG} zZ^BV#swIB;R!hDnYlF-PH(YRK4pvP*4i5x6-1M10=*2=uOx;!r4R6#yM>ByI7lnhK zPB5I!OUH9lq}aaV)l_F|0nGcl4Zp2eO`iVhB{ReI8QhzJEBOq#t(gz86@J8O@MHLt z77Qr`=D0+Bj+>I2%FSLFjB%r4nPqJuc+D;lRPDz=`O1;doODI3(w&VGCS`<{Tw)e` zR6F1r$86)A9(_7N|l%cQfH1MS(50VGV zn8?5>C^ck0Iq-fR)iL}AVZyv`Z<``)M(@Ht+2MS{Bz@R$V#RyNXuRj$I=|BgPJbxAB+AAnk|D)4FBTI?cIKzsKyGECtt z>8v)zr;f@PGc%IDaWug_HNo)lrU>`j-6WaKV$xQXfME`aIP%pA)Qbi3+;b2FKNtzA zy`%AQ$5o={rUMsr*MM%^a+tPPmkbv&1&6NJqIbq8{1#Wn44v|p=oBbXlj*kzU06!1 zM3%6{Yb>+tP80XAPZOej2NSDVUR=3HHMR=$SKAUx{PsN$n~auo76;X_qje;z3BJnR zxq`3OrI54-FQrpf-@xmmo`Ig#Hlt%F8!N zS6l*WSC-Mq_VT>^r*xd`yq4=rH%8lB8Sc0xPrmBEgxXgk2sJLk_W7AG&*~l?I^l+Y z@}saSK8}h?-!d16P6AE25WwseF!(?=T3VX%ll+I$IjQSl=-C3uQZpm(41Q3f)YJ6O z>~O4jb(h3%ybQz2CCIMGK_o*j1>?HUkZaMSL^pP>hmYQ>tbgT1Htt&}Y8Squrp{>; zhPTt}ZwJHc`uAjr%UIlC>o3ax{Dkg#Jr;-eHWRn;!!Y>UTSkA!87$o|{9YT%qM~XI z%DZgEq$^)IjOZl~Meo7+>}tq+a0OqbRlv=^1>CK#7I^E!2vFQ~Ow>^@3A$oa(euZB zZeNrG^TTHdh6fi>NBIxLZ$mIt%$fiixr9~i+z1yhUZSJaVxiMD0y^wtAm{3H`lbIj zcR96%C=L?ADw`&(F*Jq8R^u7@jP0bT`W9q5O<+bx2-%*nE11@$hArPKnI|*KVP0H1 zy42<1DFZol9c00sS)c_u|CC|!Kq+R_j>iat6fj)$lwOE;Lu$?nyx*n* zrJB98y+;eL-I8ML}?!}{myxKLLUyyujrsgD^R{{M^u%BCh`bP_Q3o&GUBf}Zg*)GpPy(?P7Vk(xkO(oIakg+JlI?ur%bx@KlzkZd8 z(>g+*A9z9SPH%vf{v5RydRmVgZ3JDv2GnV^!!kV|+O=joI%L{|;dTmRKI|m@nKy}l z-U(RT7zyzY58<>@Q;a^*NoS;}(aX+i_&RtZv@FiRP^%cBoi6|b2Or@Ii8W@WNkV(< z8A#qCaF4Qf(dedgVC*m#XKcDkt=~$6;T4{=UeJP#M-;KYREElF^ukdifrsHW7~eJ3 zlZ7%ew8wumpBQ%y_9Pua&(wKzx!n>*W1=zryCRuu(debK!&->s=0tMih8B37HwGwq zBbG1=XPkDn&{xGD2?-ZS<`U9)L>&w@@<-g4b_m5XYI; zV7TTAgr#-j>jzEZ*9AwQaMfS(?x;E*kN!eZY|nyexfQxin1IVqm@unUY_VZ5Ug(;cnM6FkE&S6wH@m?MO;Ogv^!61b-UP8wSqm6+}GI3OjcQM4i$4e3z>w=pGA1 zWd~zEAu9{6RKxlAt(-HoA|O1SdsI7peIiB+l#iLiskJ$oei`SN>7|8zxi zIzNrfI22EPhFrs`qMfkuawGk|7O<>D3!R?$f^6M4u0qNb)~NpCDqBT#UmK;De|Csh zd#{FSJjR{>ngrv!Vxd~98h@#3vk&(TX6?hSl0^-caOztk?P9gBp;jdN^bLV|v67%~ zeTw=^4uacfy>KtTi4Ke0%IzNBMXuG|h3m6sbJG4-KtZ>GkqVK3lHND;YOS?E3O`1A zpMEFjW@$s@BWcWiqe7g*pVLh%b1=vz5h5h7le*PI*$;lhpqCwtSM7gt19k7n_9fTh zcGU>-=wB_-92SQ6Q&y3x&?MX+{FZ#N+((_J3P{vBOUOtU3ECGp8mvB>VEeT(0?Vs~ z_Wk@vME1|1@ungHlkxaEOpZ9`^ozZB&p_o}-VnKEC8(tQ7VRpEfT5|~%rsjLJ2VHV zu9h4$x=7%?vOILLJVGajFv53w1jsI43@t*Bw0Pou+%sk*-*~hTWj{|rJ+UH>K6T7) z>rc#=2qU2ndMCtc3H%a=QaogvRl4uNK{6HirgJLZFAhV!ox6n1 zI>E{J{xEuRqeTJp!=btGAinF#A<1(S80VqG**klKaI2NT7m{5Fn{4mmtBKQjr}j8* z>K;wB^4KV3lw;@-b{%oFV)1IDB44iX4%gMY!sD6eXsl=ufS zMAb5-_ZGq_MOkQC^A=;%q(EMF8Q!?_Q)F59fw;uprw-!|VCbe!5_?vI=-pd}bxq&s zBi$=dMoy7CH*V0X`{(hP+Ac^Ooq#`bli^LuG_*KW5BlPJ#PmER?|O#Q#yRI`%%vR| zxiTDnvpvLz9l^g0+le|q4&#bVVOVc!O?-!#P~WaeFhf3sso6akFXU(t-<&+W?$Qqh zvk2ZEeV++mcMF^6@4|zKh>bKy#Z8N8eM}km zz;iWBxOA3`yM2-5EjWtNzM*tH%mqDp&Q|8=T>4~GnTD>k`F$;Z$MY(6mG7w2R*$KoO9BLtg+37 zbdO|A+I<)EY|dlIMg{20kS6oH4&#u2TOn|zA1Dm?!H%Wo@F|X<#f52jCt*49nmdz9 z_2tT_N9y7 zmQSSaVW*&}`~et@5S~HP44|_j6A~ll!h%Wn$aq~pJaM}K?7S0cs_?$kQjKBMeJlLU zFTuUn1s%(zhIj{@Bf0(h=(b=q$llwDqvlVCt<6Hallv7KcF2rurUbM{4})D7gq@4A z4C;o>5y;C?@ORQ`ICP?bnwiI<)}uU(Q`sugz1zXL_RRzFvOU~qiNjdbT}$lWL~*@0XKl zqSWcakX?D@AN+x7!gC{(#7zG|)Ik@ijdN|;+ z7ALIdAeyYip79E>apwhiU~SI3`+dOcOCrcBuJ&N^qeag78#RoN66UCRp#qSU7}X#oy@2 z8ee#R`##Z7MaFN)d|0^h8+rEd6@89UynN?zddX3QCxcItc`t5)lJN$#SKWmTvxC8^ z6a}`SFW!P+aQ)eV%gy4rjB9rwV8l#JxLr>Tt?bah=LC!g@L_$;OnOG zFg~)9oK1Gbag*z*ZLvSq89WC1J+1I{U4FQlANdZfCi5H9NrmjWH~LW(T~`fD-bxgt1N-j|C+!$|1e0n+Xwb)rve%SDn{5hSE^6hH-xE51rUrB!I7R!c0&%{J4xeUL zgp)s7L-`&Nb>7{Ga}MNU>)Mg{#z7bBe+fsMA;$1_0*+A?RJ!Co^YVZXNoorLU&fO} z{dh0Vs~AMVrkyf<-moy^9Coi_>6u%K)Yf|)l=&-@bh&8|`No)(^72IbL^LidI7xg< zWHDja6Z&yjES+IGhBvx$3RFhap}d?Eyvvk^T(75$!;=e;XdZ>(yPh)+n;o&P=sU5z zpa9OY)A4QKE(nZS%N)PgL}cA!;QNjy4$Bija~D$5c?OT|$itt#&uHoMnMCoYCiai4 zA-k0`8P6sc2-#@p%N_F_-wM?-4yT(nfl5I>?3|BnQy~b9;K|aJQQ@ zXUT86t20V)m~J6|PpjjMj-%+Uw-xi0R?*6V6VTss6PV6$?9l1PU*(^;u+36@bciH) z+Uda4J%kv<10Fv=nXYiUfQE9nA*#9#WZz|i*rbJgJ0g$WufyG3&S?DXA5kn3LHTA? zyqVoe93Flq1=9kFt%oP>F;eHH9p|EF!74hh^A9O9EFf)cEadHY4W*u2xzk5H1rC%d z6T5CS(~}rRd(SO_F^+R#@ttAN=X(J2n(V-)egxZ5eVj@i=iuVRZPZ);x9HZv67tNr z8Z9j5q0FZ$ChE;;m_K&`mGh9JXJrnFYUFv$nLdMyUXdcSovw#S?Yl7NVK$ugET9X+ z+~9aXJ5fxD1&iMbZ1mMlq_4C=XlhF)a<^Cj$=^i6r0JiT^u91!~iZlqf}qFw@s-{*756`#=cf(f}HBLY^!Zr{Wn6LU38wb-T27?h0g_+*(BjlX zJa{ygdiyWq`Wn*6!p@PnaHc1CJKv;hX1%6SkbqjzP6AtMDsl9&fXI>paC&_hF58sQ z6Z0QY-C7|tI{O3ledUPKD-(!B+}0~Q|6vm@ zUfTxRHwA8sut&MRBavD+z7=#I1^B5cg>E{-V3d9=9bvu}PoN<@|1kri(F8BZreZ;z z49>541gW6SK96j`T{||QOZ^(MCR&cqu~8McSud#QoIZ`o{DzM>YihUo5Mq1|u@|zd z`T;YES=2Jh%H-3C1xozl2SvnamDtxhsBip`Jl6fuR0uMC=*6#0zzlmyM zJ;kqd&W2cl%lRIcA95xSlb&&@vPZ}@&5iVXY5*5dq@;G8ul8tj*B{lmCaW_YTK04*UNpTgnb4sZ>%)3c0V( zdEG`L(LhU@C`!o)4H=oq&IlPHNr^neAn;z{?BpT z*FMMl{d&iUvJnm4jCx}W5jR>!ehaqJ7cS1Y2tJwYe z3b6@wCq6d@ssEx3_}e;FAaqTJN2Yx6kTPYSCGLUC4f;a6R}svXaTB52%Z_~5TMkl! z+wfWA9jCtCNS5>)KvJDLcrs5pCGQLBH#i;bWCqDJ!*U|yDo?g0OoTwL9)9+9kmUYJ zCaSt$Xz{=(Qh3A)l%}o6J1g&ik6$@sYq?aY6Xi+n1nc9G^ONyRw&N(K&+W7jU=mW@qto1|dMGD+NN zdjzii3ZY+)Na1;{V&LNJ$iO-iCQ;!G%{Y=xw!TS#$Y0;7-`)UB)>puFF{@_p^ZW*Tna-zPN<(duo4gYA3?O8g~bq=l`iH69S zNE&)41N+}Rp>GcvKv98XaEK^hqIu9k#WrbByt zD^8+F7kiwd>pEA!+nH^|xl}?JzAFI@!*7FyfjHawFPclvGDqX|I@lq*A4L+3!TpOO z+1gqIH?P|u-}osBtqmjHr^eBIl1OW0#BkNLiM(FfR_+)rV3KM+Y}p)vx5DNS={!fe z&~P!_jH&`zhf<7VL$Z&_nXc1oqP$l-wT0Vo4v`f{cYN( z@r#^2I~lu7?V;5|0k*Y7V&3zUz@**6S>A@|?XVvITC2g+CTnJ+_DT4CG6r>ABH%~; z3FuQX#>iP8NO8&%==&Q)@(!xNVtR$^a~LrDv=7G39)6Ad@r0-2&dgY zDQSDqje2=%(0y?~e4KC%#p)h{l35XXGu01AUai59p!xJ-FvZs&#Zmvx5!(NIJ1Fmx zK#R9Jct2bMo5nvtmF}G+Y|H}E^y@M{T&=_Qth9u8a+}ah;W0_7=J?X_vc#ZW8ro90 zxuLThh%T!nhp%!B^&}6$fjNHE<8L)-+8ztSv`U=(@)+!oItXTs5wQ1GEw*1Dk8$EY z+_$s}U8f8&Uv?TWd;TP0l+cLkJsoFTR_U&*Km7~+oZoH zhr=y3BIv1u`|N1qr2K)zyspIbh)S~OU7NuBjT;sBDS(*!ThY~ZF8+RQgUS<562sZU z^u}Euv`d$y?k8>OH12y@I`>E1 zj8);m>!s_kHclD4g*=kmXbqFUX)#sdpWw-xAnbZG1rPS65Gc9}1(#F7Q70eXPyWh0 z^~uL4-zN*@R!2dT`C58F&W!9iAWizquOMGu1rPKWLi{yjOnY(z<{v%7$m;(l+6gUm zNyZ{#e&!VZo8C^2CUo&m|EULNYXNWsI2trqgvr|_FmO#TUF&=fcFX94U91$V#7cta zn;x>9R|c^uJ8|Xl8|bR%POJ}=L&1mFV4?d3UDyS9FJ=SMn0Iu%%|f!ODgq{sYl1@g zhh$jc6q!7GA+ZfO4-TQ?*wVEc_FS~5r5dN8*k4?zrt6GvW+=nNq))VcnIV)a-6h2r zxjE?L>tHy{r2;*4AZtPR4$!&PXU&;^uU6zlDO=~TzId24d46-#2b4`IBsbV z(VgK(;_M1Ra{F!4k@|tg|IMu1Qgas<3bbI^P&}Ge{KOHtW&wS)6C@X;!6rL9`e9-& zd>gbP#l}vI+tE-o`lLcPhiBt_g-GbSxeru4y&-b912|83Kwd052CW+Z$joo8SbAn2 zYUU2(j$_O5#5Et>X8B6sqB2b1e0K)-I#0|H8 zk=&M7;Az_nP5u|~S>Xb*QIy+pq?s@y6*bW1>j`o23u9LKVW#pqNE?`d;oB<7gK{gJ zwILM-hqWQED;DlCnQ&OTh>G0Hr+4XXaP*8JR`F9nsxFUCpYaBo%g&%oV1U5eGl^&U zyBGOTi&7f5<7<(JT22228=ZD`)ex_ zr>hA0x2}*?5_@UOnAxbaupaa#h0rZ2`lRw_4*m5yN-)an1no(`#s&CDgT3KvLATwj z`b4{Yu#8&{@?X8l&+Ah3;xB1DeA^j|4G%#7k1^D9!UbmSv^2V`iAy!OP%ik)ekajh zBaBP~myHzliH3_!5PS(QzzsYx^7geok)N*KV@G?J{-`d}ngYd}%QFW0osikuBecS3~LoBY7f zQJ;OcNe0GGnNPIK%-O)UXuSMAi%qqT6eesf6)uhyV)>a^VUG3@Rz~zL%ciFab>40l zdbv9az3fJ@g^fE|D-SbaZnvn=?K&S$uiGiSw;-II#gApR=`LZ?n=E0Qy}K}6v=mlN zAIs*oLE;W<^|eS<$Ue`1@XT^7Do| z*u?8ue1`yEzQ(`z?D}F+e#lN~evdoh|4x?Vzc}E?4=~@tceZw7m&7!)V+wBa2g7Ic z?dk^EqN;TMEUUBp8djcP`tS??k!mx$D`pYj*wvNK!87?qT1)xcox}Na#;WmK$_>oC z6wUa3-Iw?YRfqT<3l#Y^lC}H~L+AN3zg%NCe7?+=ySss)r7y+Kau|}XBBJf zHrdP|>HuH4-tJ@!TX?`>>0KIm$tZ1sl#fvUc~Q z*|CZ{*!Oq$vxU_*?5-I_j+y*@gcU16Wf;(}wW?Iwnu?HJ9< zTw2FU{ou$8j?V0p!>ifOXdm`%fd~8YSU7vG$derwi)6j}m$9o?xUzTLma_5_H*lW) z05($g1S{{lhn;yofIYbJ{;pctGzdsY2!7Kq9NZ z5;}Yx$jrU1q=-xYwW`qP*ir9zNm=3`{`Y#_oq}d^fRTdx83}ZtU=|H|ZHix0#=^qO z{@8Y-5xdDq^vxmaIh#T6=sx&;aV9nj z)aikTJ-odRJF%s1G*kM^l!`o`iE{!T(WOB-wAEMwm%4;u(f%v+elR!BzF9=egB&nd z(q9m1H%R$&4`QnSA+kM99`oHfEo!R?Wiofu!t(@gDH>Be8;(}NjnwAs91vU9Lwocl z!FQ!XQhTkA@_uPjqo*SDq`xASP_GtfUX;NOz9?4{bGpVe&N#(sKYqJcNcrt4I8**R zT`|cL^PkGltso8}H=~)3hu5hur}6z*yb;BY)?ngdWgP3Lk5``d)$fhoL|eJp=*H+} z_=P_kEInpn8Jz^xSi$?OPU0baMF!d}fJRHv0dk10)Yl?n zJrRsK3c*V(45ap@Qqd|cwA|f5ndY5z-vK#XbaXUTe>M(29{NLuCyRp77Y!UT@xoBG zBxTV*B6-qP6E?WgW(AglkU}J&76Bpq^%{9!Vi`g_*rh_`jPT`{6w z1{O7xGcB9U;eF}~aBl#SrJSwOeHenbtNGH~L!2-=&M zMa>>8qu%|FbP!CKL&K6-8KjJbZB2OQPYLo$e987Pzo_@IiKN37khq3M`O+Ko9?# z7SKMu62Wc$3Xa`+nAvhU7M~<7$MJowXk$w^{6TLY9k zjN$TUz`GCqxQkqvCeShV->lp z&9O=KRbfXc)}MSU3q{j2h(eSYvp#YWIdfEs45h9D-tu%%I>0g8=jaowy*y~h&n1HF z$uQyL5?E~|3yQ+W^oaB{+AMm97L3zC<(&zFu;Gn3bUThdF>2-2xGZ5dL=01rF%%#F zTtr{x45HS17F{j3U{ALUX3dMkk_p<}T;L8C$Lidj;MXOM`;Cu5jKU+b^;9$c^yL%@uuF%}{ZD9tw=u}xX<%gCC7~hq z5m_GenmF8;$9Y~(ld;#hlcSRl64oNxAu3&FXS`Pz12&O&a*Vl;Pyc> zQpu$M7N^_f|08EwM4|p&1sN-91QSwDlEuq(!1}lr?3f@9kJiT5 z4>#fh%S;;d;}^{=GeO>?Xv)NE;4!-sV7E|@d|Vd=_bxdKhCF!nHJ38DnMpH|kE$R? z`pn?n1!sXW&Y>dtQe@(3XE6JF1WeDyLula_YF@36Du$fy?s*IzeEg6(_MjYX-{g{G z5@mu#Daxd2Lq*;5v5O&LIUhF}=tA8h1E$7G4#Kw-FrlBK$QmCNraDgoWJM0a-_gM^ zmdnq0=H*B}uC<06@j1K+opaE#dnr?DCPq%{2jYVMl^75{iEdPVOK)uAWB+n4ugR~N zzStHH8{1Sl9{Xex>bjdQbexZwqsKz|S2Y}3|Aj7|af+;SNWhmHR${E70UVrcK&`@N zVY_EAhWnnu7dKDPsIY%DA1IYvIttg#8X%)}9#iu@k+5^*C=u!%BMna;5U~{@%wkeT za}O4q)>hBvobNVRW(qV|rcAI)XhqB;ACuM{a`1k5m{d($icQY~ar@{@96P&$oQj(P zL%rw7sK4XEo)<5exYYHVl_JT0S%u%+V_nJ_y6_j%u7TKfc;#AQ+?c*Q*905wG+=uO z$BVb%D)|4Zg#Je*@V|Et;+~?^YSM302dy9Q$Eg5YpAQK-8ZzkovL-q~Y&|iUoN*EdUc@PnrMMdf| zp;apiN=H^gmHjs|`M3<2#a<zA}Z!6we@yCV^d zb>p~uAf5(fErpTuQ|N!Q+y3*|{~x`B+W&Ey{;Ov8a@(@|Kgy;5D4T98w9~US;;`t{ zA(XJ^0&*SV@LSXivi<8D^6p^+^PV4s9xK!_r6z$IuHS?wK99k{7Ek28k%YOe2O;3_ zd%^fCjyQXcn6Q0+Gwrz+%S;}K!0%JSd9@l>Fs4=wHw!cI*=lJtQ+h!@7j;t`k@t}K zemiKEZexm0YNG2>NrC#xe0&~Rs%eqK3)+}3*jKNCs+^K|{! zIrv}thWERs!i-Kua@#|ayoxCx=SKdKuMSmkJ<1c#9PMIe?95{Jbj@I{u09K&4^$Gh zSy7DCMueKL2F%@i$5~MnBhxvTNt?Jm7?{^HGrF&mXm3rBR4`-e)^`xO=6$4NNg;W0 zD3#n(iX&xHqZmacW7v0BgoM8vgx`s$VaBLF-UQxpvi0s}Sdg%V{IJx9dpo5#s_|6D z#Yvaw&y`?ngHs3prwGc+J-=?{% z1bf!}ESusV$@(2T$37H^W6wTb#GY82!baUc!mg9v#a8c*Vy73!u+5&K>_|}@`}lz})WP2G5yRVY2qI`_u0vJ%N`vZpm`HenlUYU;$M&;r)N@d%qG za*&->bcFprJ%l}@8Ob&&d9xMAQ`tL3VgGB_@P8zt^8fP@_%8y$XpW24i>o0<=!WW? zyGr`wG+~(jE&=|Ig6UqT=;CV(cyrqtXwAStS#gk$zRauiQHCF{ufSP8*HOHyf#r!i zK%`^_aq>5Zw+9Pwy!a~6|6qa5mue}QaRt`t&Vdr(xCU=CaEB;Ejs}$gZ*?N+Pg#r& zo2N4a;)^lOH5WAQWPrJKGUV(FB+?1_@Z2j5`N;xWws0){c0Cw3c$mPPgL9bB#fQ;4 z?h-ZCj1egHi_?@>Haz*Ux)9%}jN{jA0J$qOA^YNcMo}RY#G7nz{oiu}mu^e4*vL*0 zoFb1?(>~MhMtnNPCm$4BIt8PD&Lm-8tGLHm1>uh;Ufz-gXA3gOuT2%S>)Th5)=)-~ zxyJ2Vl4QH9032S^$@zMn9OWr+4e8bppM%>UlqJ1!ULRJ@QESz@6IDF zuG_e6i5c10kO^B88|a0~y+m&(H#rPgNeyE};cwX((A;;1D&Jf}?bIqLw}~K!4`(CH zcfg2OAIb3XN$}TxC+s<1PS+0IrCabFDz&-dNXBmJ{b~bjX!{D$s%49898^GYc^|du zc_TQaCPP#DVwl|vLa5O(9sF1Bz$H2D;~D>xgUwM!^ml$O)CFi@!3H!flguEzO;rLcp%@=}s-9$F0 zQ-~vbnu*GtCq(@7WvC5ZLBg-6f$dsDY~OpD_I)oS{@?cCdWE&H*=8z!(s_icZ~qFm z3|CVhzs;Z&qJz&9uOh$u2q-^Sgd+>0Y4vsosOhhT?lr4m;iBu9dBO_ZuPV~)Ip(-+ zc`-e?Kpq^VFVZ8LKJenCEIu2pjv;xIaIuLWTzb6*H~|9=FFFfDJ^ccidRvlMW{SET zUBTh*dC1w@KvQ4vP|KmV-erj%{jtXu>c_`G&%6`3XRSC`?hmG8%YGyKR3Fb6i3r!4 zs38e5VWuvWqk|Td$uag|Y(1P(zDtI*7dK3Qn}EhElSRqsg9njNf|Ypzu{S+>u*P zCyn%C%$8uhYVCpl{DL9$iVS$DY2sV%TA6YGBRpFGLELtMzttK4Fg()r>MYl(&LB}1 zlJrhCm%ZM4iM~_0OB7SnaE0$nqJN0Ran9?BYIGH}X6=DNr}K416}5|OVx|k7o|v)) z%94;2k^mK+6NCXyC3OYk-34jQ7t!4{6bGL9lc*nSupr$BW3!v+lZu^?HolR{f7Kyd z6DAR{78_V^C@$>bRMbzDm6)U=b*d}RVEfsNcuq3})y|J%d)hBj5w$XymWF}>&q%z* zDY+KjbD&p}>mY3R4rt!lK+WbT;fRF@Rz;5k^OYP;_+UKI*E9lNf;~(x5*11XRD<0T zWAHs%39vAUo*8|MW^XzI{zu*6ip~o%{dpK1IxvnzG|Dnpx0Dc5wLn_JZSB^~?}h7Y z69sP^w7^unok*8S2)~~YB`r2m_(XI%-de6qj6;<1TfqXjTG$C`*27$4>^0am(Fayn z`Elo<0XN<72IbK+V8hF0BwK}%%50~?@k2cGx50~_PP}$c9+p{^UDR(w-sTM z+5|FAX)c|j9!nckw$Z#jvxTEupK`jES9Ja?37q_oSNHTGlG#7Po_>rzZs?W39wt2gu?yj*Ef&=M^*4y`<3kZ)=88*>u7YV4M?gzfu$Nzg8f!M$pd>XMaAkgGxE}%oHAA6 zx+3R#y$>ctT`<51$IHTOGbwhRq7En*MPRU;9Q^&=N$i$<=RFR{L{Iv>p4{?f8u&8A zC4UJpt;=A;o^nRK!GW61HbkEQ3D&3x1)}di(Lw*G*mpY-e7a}BW8DOh*q}zoh>b&I zE+OsF`J2Qd;Ra(n?KX2M`98|bwZKP@HXvFip>0tb$W60{mOp1G&rk(#9u6djBBny= zv(eaPdmX(FJCgvomIVVCk_;T*0>M8ZS)uTb39-@&p%~*IY!1Udb zQ1*w|7T$wKeH@zRNahtwgO;@mJS($cI9n!diEB)qwR!dCPtVo z6HWOkU8KiL2CDk4;Z4pM#B(*^Rke+_WT(M3CocKo;%4~gQb$#u){_TSB~+{ME{^)t zLZ_s7;pRV=QDU(Vow{&tg!GJi0t@as z86Cb&J+3s+OCANFwIh~pVA~6*pBanbM2mjKRHa~KG>>T+0 z@Gt}{VllOU4P@5bB8C4ZLhVjJQp@p4w?BHqEc%^{-kWEl%kdYqDE%%DySq_k}r z@;P&Hoj*D*xj--NQpBk1)%%S7Mr8nk!hHwl0BmWC-i zq3)d|vdc#XC5l5hcg91CPkh06mb>7Ue+!o=!lS-y1{F?DrmfG@XhnfLd~#ETMY?Sy zw@87#_;dg*Qg)+Gj2GrE5W+mIvGghVLP{=H;=#xa(iYl6Y+! zs^~L$H3S`Vf$3Av!+Gx<>>TwQ#vZIBCH2QZkBz3TvHPf1LM7D5>B7z37f7LB zDY20lqAiY`qVVJ-cqnRwZ|r(-VCPlBTNFV1KZjHK8`jW~;7=_+=0KXe5~Y1(*af*F z0>4%htm4>_f_stVK->oUDzS)5CAtjucSrL!Z`cfyw{Fon`EI!TFgKO97lpi;l%D=1 zCd`>OfxV* zc2KaoEey^^bPz+8M`YAe6zr1VuC4P5Fg+nA)G;&!{_Sd*Hh&`i3*X1NKSP+c??;27 zS`IwdpM#Ba6Y$OCadhmqDsCD#8(!+`;xy3)C|Nd_e&?Ix;yf*K+4T$z8cPc|D3=fy z``7U5R|P#N&P|M03YeeB3K~s|n71ZASeMjGqB=T=Lc$E9^~{P(@X~_jAuaN}q?fE( zpAH8MfxOf{PDj838zpzblBGS6*rdYhq)0Ox9wg!W(FaYQ?9D+Zg%9*#^c>Ena*ABk z|1CHrF$Y$1w3;)9GwHUdIPhx!gw0%%i+adpe0Em=9ZU3pSE(Y@l@S3;PCab)ZwW@r z10D`|$k;5kK&J;9H2vFjRA;>4=t3>Q^od*XUkVS>wuuN0%cEic`Yf;*;=|A7?zk!H z9erdtkGhTf$f*ji(9B*pB4PCxV||kF_Oj1(GB@2hWv~iciuAzUI-BguNFv8S$ugc# z8X@0`qd(OqW1yuiZc3SiV@m8X*m@g&G!Pd$>Rq9aH}HgJaeeg9%Rw^IJxup(JOUhT z1Xs>G4|`*F!Cn2^0x|1duvI!5)t*?x&!rdWYeiG?W??EWYRrNkTA{EcDjGToOV*9u zN?u5XVEscYcKFg_7-%B6^yWEAk`h7r*<+$&U`M%ZJvb_4ox>&nHjusx|CoX6xt!X}3Y+=c@s3w6T(tUv zZ*MEpjaRoIMJyeTM48xo z^w!}_IKFs399+E%YFf|I8mnPYQ@aN#ixr@>!~>!ySHW?cCVVvKD9jExj^{e+nDvGn zoO4rxSX#T`;*oyyro+UTgI=8WNoNAz07PuM%AnRBN~ z2-lSSq~aqY?CArc^!NLE+St2?Q|R4;r%y-0o6m>g`aN~BdhZFQb7eJL8`A+2lh>fn zEF^L3UCG>Io9QLRSX4UNKvzm~s+KWt$c)O9M17?LmtLJl#xH&bJ)1Zuc*zhrZy7}w zE~MnxQ3=@ny%S^he}sJmI7=O?4y>tv=$#9rmbTJ3;~S8?CKPU( zgqm6#&cFlt3kW;@0w|Bl#Yg)OVcjQlTvX1nH0ASgsrW=t-{lVepB=c~#R%LvlGxzJ zYHH^w$qpabfGzq}sCo7RjIA7v6Fw2a(yPHRbUjG$?2j1?aQx&gLE5-`fiHNv7SmLX zKTPZAT5RmNO+~WBV7XTWEPq&yGju)B*CZ8-Wv-LG*10(E6Q_C#_r<0QPpQgA%DeGk zG`q^>7`zoJu3se@NyT<|;6dq1%uxHn?CU#)8~^Ty?XEXLM&~ekWx!bya$Ou;l83;h#Eoc8xJkY*mV$0Z1f zKSYapBXq$nE3#?NMcUjqnRjIu#o3PSaC*cYr!Zx3hTD$abT33T%Pi0~D+93`BDimE z4S3%dXY~dZsHFZE_}lT2@>W%l)_tPH(4n4*omPN;6L!E+=MX%7d=|>;egoq_H(}N7 z6hTs_IBGtMz-FgOP&~(gN-3wK@1E~OyUi9OMz@h|Zt1Y?%zE^6bENB}bQtUB($FxI z&unh_D#*4zg86@>@fSzstP^)W24-X7@SJPtKs)T$0eC-M8r%M>mYq%s}NGl3=C%lF=Q18)V;d zX>3yEV-uvT?xXDr;~??cbCP*6 znaU;gEjq7zl=!4Q;@z_YdeH74ZP}F#n|>4#gN5=CV;u(js0!(cxlA&T%oDQ8mh}3u zcygTp+RH*@Ei*DfnX7W}Lf9fDX&mVV!sYzMei4f_2Ydk-Xwe*kpYc z-0q%*^M&QG;!!1duBanj8a?Fnd>xoH<0;9G9pSj$lX2{GQDNM}HK+) z?D);43vMjN^RK(>(_1*F{pL6*inzvXSv3`xE^&n~$`hb-+gb9sigUL3Ov0lj$KmrS zZxDT1MJk;h<3MN~@&EjqjASe(r>&B)`Gzl9_Uthg6>DOa)XPKibz{)QUDT)UCB5Kf z59do}qETQ7N>v;sp&d1XZ?FE4yEbRJ?1QJ6cq5R;q{Yw^O*J?yG7py1+3?Kznm}+R zovZyD1)JxU;>hnC#EjwQ8V&JyKRSSUE;|5miN!enZYHKpn+5`!MLh`4ogLUIItBKy=_X-1oTpB~{}P*dJ4etMlj6 z#g@^qz&e?nZ!zYS4a?~^jTfXx=R2sMmXKWt$wZ4;JPYI#WC7)(6vxK16j8`OiFn`|#thIhZCQ>c~<%%mT zJlse&o^qj&A~^-Es5bV=|6_)jBD!LuNPRc2hGaYmV(#9GBSfZ}niS7tJ{O#1rWkHR zNjVYL`28e!-trBOEfxo*ciX8!`#Cyxg8*(WdCN;^JcZj-u0qD?bb9=I9KOrR0Gl*# z*cve(EZi)hRCWTr_F*%5XEljLpXe9NS~&*RCBK05#t5Eh^c2|kLKSz9u_w+)8KH92 zOnPRS4h}54K*!#F!K|(*#AqE?-1g)Q*`K(l2}xXt(~YAe`<=Y?A#z@!k`wLa5VyXJ$7ny9eQ zbP~}PXQ6WCDMm0VRIvH+I&jYXO0vF4V?%(lP-l?@I);@J6S-p2TOx@$HU)IvVFkPz zkb>L%qex)JOktW$FFaD1O9m6iL3 zAAg$(8aEG;)}PYgbnrfe*9cHQSs$;jevMPwj=`i$SLos9(ZblPLd-f*1m6eqQT6L3 zruM>S=&;m4-Cixck|ZS@PU@hV(ZR$r<2lZ~Hx{zxIbx;6EkR`H3|{;xCCK(^qjTTL z;_dlsP*f8!cBD+e|GNxRem=$fZDZ+TGX&Az2Cm-iqMt=h2;O%{kyr1OfbV<_K3q}6 z+iQY>H2b3M%H=qqluU-?EMWPYc>1_rofja`#2;b)I1)5Y$Y0csI-N358dyPhtl0)S znHFHN@;QB3{EvJy;F0?_YdJMm2pY;b(`$*+q;b9-vpNJ}L?r;0+wH_cA9;a`oE))N ze?Z=N)KW9!M&e}^hrF6kbuzx;nD})Z&N{RYk3Aj>`=9D!kkTJ|j%Z^;@-UuP9Y^j) zYJx|b7pxkyl6hSpMSG$ep=12Q;UJqTAwg7Jy{iTm@y2I4n?zq;X zPcV2%ku+<4ShKtm1nPY(7Ri{Ddh}3S+ML`zlQ1h(; z{N<}5FpqyomaZzp(J>bIZDlyge!x+=KUd;+(Q3TGx!AVa+mWHau_Rop0+%0Ypwp9l zaavg|S7WK;an&#w_@fKk4i%w6g)=T1bsqZT9Ox}M#^nHr>@f4S+{X+-F(>>@pKOfh{Zsy49V}zf4I?A>VL3mT!G>$(_L*kJvssD0zQ(CH4R2!7^g3EUcnPY%1#!f- zWN`j#igKsAY5b(;^m1_^*f!@e%#=Fvde%kQp_M{iveQVltTwEjULi2sz6AMgoZE86 zP5Pi}9X@d0Pu}0Ip@({PiGzCvy+8gZ+6vad@4#-}pyw!o-XiXOzFk#t_z{;!5nc$< zeM9tNG2(jjo%ko|8OPG^q?a?yplPQT8cMD~q4Q#p^~y#mGgVUPWClyh$3S%1X;A%Z zN56Y9AQQ(xY4vupzwa4Q2yo|_zm5Z`>r*JtBnU{34%D#j^&sMeSN(Ia<>lHy@l^)laQ!D(S)(THy3X1=r8zTn{0S>8g?0*el;k232#2 zcSSme3OY$pObflfXCj(-^uU*pDp-GxBj$|UBlAuM!7N)vGz!%~t?$wxH55oaNHXp!M^v!gXz5*h;?OpQBTR8glU<72ZW(-I@x9Id zm3xln=g`?>GMEeF+sGE53Z_g_8O4Kd6Gp3oIrn}s{<-qBKD(lhM!)%sH-Go>Vn0?= z1?>;yNZAU(=AZRsu>TG3PWb{n|CpsZb40}*GQPNBFqkdC9!}yvMvfnL_4jX)=y{T_W?W7T^`mznrjroN^;j3|{ zpp*s__=2^{aU3o(7Ot#6M!G9HnYNl*Z178`zjzJg!TktS+I<+3pAM4K4XtoR@*Z|2 z?t`Q}Zye0bKKK#vOvKM_4v{l=57E_469H%?=*YKh)QmYppLr{j*n2wIVvIFw!#NjKxYIrxSAQN9=u7^_YQ`8gC{S|zdm^zGUy7%eg@C{HO468+fm6FR@ztzsk5+~YJt@@nvlQ}}wXmbg8)DjR;P>`KXz9tMZo{+j zpkFfYR?ZpRlT|E8eB=RDyH3Kf9VL)z=K>KMV@N@ID|+p}N<6I6K>C3V?s#rYnHAxv zrKXJ&)-I!SHa0`Z@EeeEasiM1!GheMPe?`836xtS1}ci5XthfPb&NlQYi#FXj>jU{ zsCWusa|Tgo=0G4fCtj1Y5FCOj%{(YU`ds(nWieNLJ#Q-(xfIaw@&@=;ehe0hEJe-x zRi?`9EArxCB$xM=A=o&tm8zbl7}(ngs+YboA?o9Cs;v=RJpg!Q;dQe1;R#4SF&@K7 zEU`?|{3N zv6wp9hnl!;!aJ|!Y3k>8_{cA2w7zL#N8StSdTa#SR!h;co!7C`#DdZ^HQ2e8BR%Z< zh23{!u)53!6YAd*x2#A7$BL;5o~fsw;6tQxANMHm3X5m%<17Rp8T@f;?vz{A<_G z=*QpUh?_^CX{jOMx2*uS=MGFaeoInX_rQ$0aN=#H2kPTa!E~2)F#oa@3T~QHjRQ#n zxf7pAVBRP)d_)}@d9jS{gX!oQN5E;?8bQy8PEb6$2}QJ<;Dzf(CPV2Ih(>8*@WCj| zdd9+SO$O!}KNGa6TL|@37m&bcS4^Fz}qkGP#(Pm8aKPqr#U0!-%fSXU3!f;zoS_2?GcSOJJ0=Y z?q-jfM3?s*fnJO2xJt?!mre1*KS~xj`r;-!W6BRgX%@5u2(dTyIOjsFAwLIB!q@a# zI`E``o^<6XWL~NeB(VdoO2v|tD;q%l+&1`VeiP|x6ZqF4K*@MTv=2&VjP6^~)i07z z)su5%@7clFo0wu(&_lrlj`|*0atps~Jq^Q+>QF}%h0aC$xS6vU`5vZ%QmPjyzeWSD z8QbHS1{dDiXL~_3>@ohG6pC$rnvBTFIxI7}MuJzppmGyAS7=KoZ;JUua+X7}<7LtoR64rVw?HGztWbCmn4Oj5Jiib=k* z6e>)d1pe}3ZRYpREf#YQE z@zKIfx&IikojG{g@Fq!YOr@q0=gA8vS1RWrq^8?GGu8q1c&p9{4^3{T;x(LN)g}aY zX?Kw4{ci+|JoK^Z(+`1ojz3sR`@uF9X~t)|6f?nh1uo>&%t7xw=)M~WQ}6x2|qUI1F~oJw|`eFC-VPjRTbhoHlOyA7tbApjM^{7N3cN zy31F%U5gN;XYZ$~(`sPN)?LIs;k;m$(QA@)RGZ{HwStc;d(q9ohm1t+hkN5&1=mIH zljUFM($HstbaJB>SeEt)?ks!9TX;VccD>NRr*|0#pIGy)plccFZ5F$@iR;5xq_ zB;>d)M=RL`-`kRLVtgTqn!1y`%hn@f$E+2m3|ix1)0OqnBSQL#caoZlC!+eI>qJlG z6b5ZA6ub%RBo_Vi@rT}Iy2<7q=udw`A1rQw9<3z2d~-aVq8x(%mgBy~H_Cr+~}c0{mwVg17i|k*Khf zQ==EASAeaeEis%oMCMLb5*kSA3-5a!A-mryqKoo9BF02uZ+9EhzHBrG4LzcV{nXeP zwXxJrqKMReeJ040I{*&avc!)g?g~VMVQPQ{`o_;7({`<=9_ghd#O5wDrDHmn80g}a zSpjh8>J=_&=euC)Jx%)S$X?jh9}VN}S3%Ic>-eMoC?SW;1nIU{$pq6GDE2;%5xcv% z-Z$YZQ9O&p@S!7(J@FOFx`za*7e$%IiRp0k_#=q@+CWe98_9SRGrW|VNW5kq1s*ql zH`+Rp?&@5NvlUMW8fT9Z3|u?PQG)8pw*mta^LG^7`jCz)$*N%5wVKWtWk4&Ar;y-L zQ_x|rI+nC3!tlArbeigAYIN`p1Umd9dFw ztMG06HqQzbp`^hSiBN`h9!peGiXO=YH(_Z-*WCt4URX4|acx#*oo(XuGE(Bra=% zPGw6ls%nAgit9{$XE1t%*a$9rUm}a%6_Y>v_u{6?Pm}`1@x_7AUSmUk%V}{74&Eou zqnfF~B3-=Da+977J4wx&{#l;#kYGwp`DE4f1kB%;Pg<@-(mlGzF}U~&$(~e8{O}vi zUCNWyK8z(M?c0gfu{Qea!g0oLau%p8KLK9tH;GeqF%3C2j6?1RU;zw*f8=EDJKsqv zW~?HRygLEycN;P<`bF_X!(HT$1V$a{(g5F#Q=IGlps^U{YjOPAhA`jle zH2sNK@@pY8#w!sHww4Pp*OSVet)i>DBtZJhR|qQmU@_&d9BdVopw8(!UC{e5OL~z327l#s{$DaSSZ}l}n2s zU7`8!71&t#N$OqJ!^JoOxsiSpS4xUtdERPpLm}!pu?*B^OQU3KI$Zm9kG}Dog$){O z=makoI(JBs8=2-Hp7I)Rrex5!5^gwdnjAQ;Y^G$s9Miw9pE&7R6T^$vFg8q!WZjjc z0eXd0f3_}MiYO%do6XU;ryH#*!~`#vFTll361cVNAnZ-+BjW;f1?Sw?<8r4_FmvH? zYBVZRp!+P8G>>e9HI6-a&Ga?q^tZ!fr3d8QuseF2UceA`1C5J*f@DtvzMuSFa65Se znSDlrT~_2qO=}}CrbtY%Wk3v;6h<*UMUznDKrHS3dQ9N4?LAuT*T-jd>HNIT*6O15 z9D42BSZ>OO$)sAd4Cja(r`PIdL4xfpI(hnQJY4q(d?Gx#oprnUCWTrY)JjI1^kTuc zo?hyfxRo@#j>d`nepf!t7)6$iW+R0h;nI^auy9AJU`N0nI!!}}{VE>`55UMv@aSm{FFuHbneE@mge%#w zYyWsUPyYwQI@f}{!Z0&(H5&6b#X_QI26%ahB6pEj>>d2I zK?wD##nAoYJ)XcAfr}1AL+#;66vVgEGoE7Lt+xw$yB`Y%_$I72vt!hfDWg55CG^Mr z9{Raas%nAdb5z}+j_bPA;mg!dWYYSQ>M0w;amS)m&}aUVv&US~w|Er0b;nPL9eowD zOw6#`U@QD?I*nIWJ{LG?mOzH}W;B#^B)O@};j4ZUowFesBG+5shwx4+<7x`=6NhL) z*Apt?sEBLtABIbRLaFionOG+ClNl6PFxS@S9K{M zpWjL*+-br+lS}DRbfpP-Vf62>Gt{;1QuQi-0Z|g%M_1SH^!uF{h+qAf{yr~Z?S{90562BqToFf+lTIdty2IiIAT^y@o2UbdjG|cHN+BIq7stf1v*qJ7p z*bN|f7C?4*p2Dv}4G_L}GktXQC!;tf1HH1kNzS4BsHXOdZ?6l3trOzN)dT9FQ_?GV z5?Bo*QM0XH4rU3MoC7#8AT0>%-%a-C24O*HonV%V3_ScJOwB6oVf&|}_*B>hZ(KCT z%THb4#o`sHbndR;{b^r533eXOT$SVYh8ojo(^hON4x{65#zOto2Xv>_3e>KtqCW?X zN#2Gx%!n)R{qF6c!CQ9Fz|U9F^m+k)tS^JA<$2UdWvRf%e-yXYWHR%i@d$R_48;qt z<6!uyH&LH(8_v8t4|5*(@V@-Vcs=V4lkD@wYMFZq#)hn;fnV)$$=E_NJ#{^v(Ppql zQGpEpl0`SRnPzU529L!r7~&sFpR9C&GZ)IiK=B0`Z?X~tj=Z9c;nQH=W@%iYB!x~( zlXzW@Zx`J0j-(hB;O)!70#Y9Vr_7qDT~inhH(EC=FlC{W!1N3JRZ5Tk*t-zN}1eT$P{v+pzZ_~k1d^hHe$%0wDf57@L-|8~zCt1<_3(`(x z!UMNx)XTm@#lshnP0xm?|2t=J3cCdRi3PYRm(iRk6UgG{y3bepLf_G~DCu#TMsSG5ZpD`hOgH5)5ervB!TI%O36M) z3uq8NN@xH*-d{gaRtncOPsS5}>WKF2d~CLuiPBFytLwDnKI z)1xQhzWrhNL**=XD0#r{Ohm`pA(GI37GBCvo}QMV}kz%zcO#_CD6((nmlrL<6CkrlBHR7c*@3u21czF=!(oEi8r6(x>xdOqi+tr z`;Sr~_phWjP8IIiNkGcPQ2IHo1&=!{LHJq-(tdI9E_o}C=@()hh8yrro;j&__J!o$ z`GQjyKF5D$^Jsyq3P#OrV-(&GP=B9BdaPwOF1fji`FP)l23ecodp$p@X7`%z8@nIt zeJ+yS%tM-Bbdrhu-ocnGek)l1>L#9=X23TRe8Z>9KhX=jv!Ezo6w229BngLhl8c~# zNfHSl6sQAlz0^rv1Od7EEAfPe4%BYKr885J8t-zJ0+~3D*lJGw<$cV9miBxF}E^qXKimV#N!L z+8hSydnDOsidm#K*8oy~Zh@`5ccE{n2euP;=#xH91;2gKO0txWHJpt8vHqkqtdqFt zT|zDe@YNl8T-NA>SC2%~k zuj|sOUP&1quYXtl&14O-hl9|`;|d6EW|`%;+VS5xW6(SzpfT?(F>q5D5y~$7pQ&O# zDfoX<#sA3(+8Y0)T;aLu`5%)Y%r6HAGi*q{!dCQ}xsNPJDaMPt=i)}aeK^smh+ds@ zjmUUw6VU!f@mmz>kN9JiReX)kE0-XhRqyBpg_pSR#0BwBai z6rBFyLpB_^O#O2^sp=9XP%@hf?H~AfZPX>AXX^sdUyRZF#AKX1HJ0>--J+LA^iZq1 zh)MPDAsT(Ic)H9J`ua-fPoZ-}xxP~1PZ+4*v|3O*xQK2x38$SFcZp?<9IbGQBa1!5 z==>>ecq&Z;Z(|gEcX&d|d!@*k4{5a7UJ-;BzNUteO3=O{t@?kYj{j?I{{N+p|La%( zJ8}EpspJ1Fr%1&yHZh`#&Gp^G?z3(oZ&ZZ2p5Rb6Mg285P+iWp@`&dd?a^Fx!x`}2 zlE}RZSD<NfmM+E#7@#JVz)huv6h|Q&#rkh*;+kmF?%Dgik*8cggv1R z*1M`6v-6B9*wC@*tQJ+UKKv?^U0?Kst&N*#{qbcI>!Rh$c07w@M?Ja0My{M_JtL@& z_1o*i)(n1SpQ~MDUuz$=e%R5)R@}C?zH(8|`hI67TRpy#-F0UkYq(yIHB6&yvuqUm zgZ<5(dOyVWo9t)xY(v?X4iDKkGqSDs9kXQTxYn}A=YL>(p9onuL?~PLojbvbZePjX zpTCtov{uskNyiN9?KOJV6YS5iC6!(5-1#2Xm)~m8!ySzE?ZJ6$`zA{^cSjm) z=c!@+KT^y8wM73Xwfvve*|QWGKcDZ~QX?>zK19jKy;O1nN2-}YW^{-yk@T5lS$}034ew|b+!GgCHH&n`l$F}AR}<~&c6=D*{AU!4E--T%+Zi}9cS=i9CMpZ`uwA88ZC zA7|Ep7puU1n#xlMomX%%&dH>G%2|kWe@4HiT!U?Je5QDExroLx^ppl+%k5(#aPZZ{|-pJEaW+Z)~s7WIx~sq?*>Pl zhR5^QvUSdz(Da-XyZrTBv^-dYcejmYJ3{SY_CZ;0eW4_~efw7$c0U4r`Gn)H;SMmb z&8H^Cv1~)wCY1W)j+5l>py?@dDB1up>ka>3j@lVoWyHbk4fL9JJD)TU;NP-)`B^&PxvD~*{Np8&009d@$ z0h;j{pM9)_BVW{DX%T_%jzhF@<{a+%`$O=oDH$^;kef{oT!7Is=-Awj1-!zX^=Kxy z`{-MmS^X9~c80?3Zr)uubOyJ%X|i=^BQSWK1zm0$DX8+T0@(u}d28c)_|zZEq>tHz znI)NE6nzqHWV)%F(jQEz>Ic7^dCc94z12pmrohnUJCHrJi54=0!nNneKEL<^O&y+ z%j@ldY#5Ug3KSciW0^ z-&e$A9yn#XAW7Kq5a8r2ajF^`6Q2 z`K3CX<9mo!cb(&WB|cz(*#ungXNVKnWJr1)M`!5;uqLu+@uJ)m=3!GLQO;S)C&9hQ z*Pq4LD@~hm=$JF;yNJ;1hOX?}lLa7tWg1)HG7m#;{D2YdMlhZd3Bg~!(AmZ((dqX? zo*~vutFtme;pJrXRGZ3KcYeg!7q3w`%b3;I=2P*P7sKII7Bv5ZGI!neBRQQLjDO9# zV3b1%9Fyhw|32CChUCo8D6KKW1WQUt(3_#Xnwzn z^WpqZ)8&(3DB(1W`6tUcD{8U2`@JcfZv*uz#(0lUkd0mP4;|w6kn>X~u_LnU=qJZM ze4PChE)R*bpQAI$-!@_JzoaGjGOo|^#7b4nTOEO1&vr67M{54 zqrb#n?qTaVq8q0I(g6(jYn~F6o{vCxzisT~fGm>nw1kf8`3j}uZqrtGClZ_-1r}{_ zROh1{H~IB9e%hQuU%v{bo`+9>t5c!XtlNH&pHPePyZUghR7Uj*$G>RV(uY%R=W?NK zO6u)Rfu^`Va`Mz5w3U27q0v#O_OT3?>HR=?GZpSZix=9t$$-^PbEv=U2pJ6( zcz$LjKAzS`)K|ze9|JC9&)sf531kTU9t>x;G>v-QPOM(^`2>x8or1Q_!}Q|V@$A^g z%BYfl6yiR{;*1F~IHRYUh7a$+K8s3PHoJ}IvXA4EwWra<35x8&6XT5&9Y;%We!r8-=)bsb#!SBLcxU#Qfw=Li`wBv`EkW7fvO_4#jM%DVUXvH2Y0 zWD2u~l-bGZ4fwbGF(g~Xk>nrp>`s>jz`acbkzMZGPnljAZL^RYvib?}r%%BwwhN{- z-9g2e7Dn8#2;yd}1U-wXz_xC{_E*awzr=^66|Tjj_T@15Yc@`58OG;&5sX_wCLK(C z4#B&-tc0^zHZv`m?n#N{%b+3f5P5+HP(YVESMV&WJovkfWv3WBu}7uC(0)`p z6TdndoX58!yJIt^>u@L%7ePJ_httCO>p3mo7|ebxhHIXuLds5cw$(xd9{Aj5>^&E8 zH6ul6Gmqv(YKIB-oRHF!>Kw=hL&q*Vaq8aw!^8M zjH)k&IHEvTiHL#w0#9rbv@`q9{-u462cU_0PSn!$;Yjfbn%!^4U5eDk!#y9tC*B>{ z&N#Bjp&K;IUNeU0RJaq)HISN-fR79`=(^A*`bJb2n8Q3@(DEfS!6F_R$AjdQkuVVq zJrsBrmXN-hb2x3(J*sp+jGbYO|LG2;$tn3Mauwg@}-7t@u-PdCM;zZb2MHw*eTP6Nj(njAb znFF2we7KovIdHxCK8zf$$E-P(u+&WwlPy(nckc??rL~WJd{~Oxv_c+=W8$&$a|WE8 zsKr{ppTnHy6~~Tc@wB>oE;v75z;3$bjnBtfk`XnYYOr@HBu{OwPB7Jg8$^=tc~K`) zjyup!@Q|@EIE60lE|4}xksJQ{nE2}*gY>Uj)IU;GARSzYoc~&|-sj8u!4!CqV@sx& zXp@~q6>$6N3vd~EUfmTGfvQH@u)Bd3gbcJoK3#C#MBy^f^* zLK_6FOoVf9XTn9*7Et>ofhW~QamD(n7}j(KRAoZo!fjc0d#*SP1Qd~Dqe@Wgx;A(D zz%!KoVG9+V-Lxz#0k^DPffLr-VeWtdE1Wf#TX=LgUXKjN#*CGawcq96d8e_6#Ss&9{`M6o`<%wzt?R&c?--DADy3!(uB^MkPk5_l zipTrI@PpD>%)wz=X_zkfGjt?R1Jy3?t}m3pG43CIGCKtOn7&QS962*I-QjD%>ocgF?BYtVH-2RO?Ry zotXE6yIH23?rcSN4?L}&X(`G$Nn5a?)&qiQ-U;bi9!>w08NsWGn%o1AB&fE@hL1;z z!KpqKuFMH0M{Gs8ImsD7$A_RvXE@w~A^4kJ3088SiI<%d{XQWNc2q?%D%;HkhguBa z$Rb0Q@pEG%58V-XnC^wEo?X;!aW0)(RRdp>PSW9ZdhD$8Z{e&=59Ii1aLIqV$b$Z* z@FDU!{kmc%{Vg1b|V^PCPT&Lb0~gp0mjD^LU?U6 z&Aq-Hgq5PfX3`2!uKWm$)kaVX+rvg@i?cNrx+t$U4IbT_hZkn9<7(qC!J0jC+?jMq zcD;}iCM>Oi)mmrqwYMsplliQ=M&~Z=l?mzl8#r_axfkWZTbXt9~t2ZtLd{Xz}|yo$n@wE4E(~OzTzQ3dag_nu(^Y z#j&SW-$$>3*Ett3HC30aD%QqVtM^lq5l3pal|X7^3EyY?8TzeN(a%zXn)As$`(2gr zZMhOB{YnFqH1DA{GZvoA&?3emRk%wm876Kp<*+*rhKhnQLU;sEk4dI5Za*#>+)JiP z{6X6&eJ*zWG0@-jfr=a!;f}4BLtkkDjz3$8Yvzn*pUgceSUWeIbDMR7**9|{UM`Y= zgFk|Br0o*fdT=IN`m2O0)_*~tN@6J)QsK#<{<9cH>!JD2}Alvqus32)MjEe+6{@as`J#zdc|JQ z&0ENBshNw$l9O1i^O3M(`Fr^7;*AEeC1j1+PpaGGg(>-IYG9-7w|% zWe@d8%&ZJ*GdT}q>Xwl{&r_WDMSdD~l-~~-FXzhQy6Kd={CRENSFFSu5@Wms52(pQ z|3C~b`c_3&@LgyMtrft{nS>ULpMlJjyL7DG0b~xbU_k7th<*xijGmy3XX!f9b+9~7 ziWTO`&yRNR2c;5wSk)gu#%3hqLi-gYBXmEu@1F$^r1|ctekHE>#YK!iX#pO64J1AL z7EZL8&Z+f}<7R!S$1oEs)O=rpt1nN%n>tgt+K6m8t#k#47I>i7%Go$Rse^a4guz)^ zo&Twr@=Ae;;rcD>cK=5k_>V?l^ihh*Zhc6mjXF!EPb!0duQEL=>Ov+*h(g*SHD-~f zH{DaB0GmhpEkjyFXh_Db4u)m9;?^wX_E+Pm2aoHW{rnnf)m z^P-7bOj?AGeCN_s3qShBubqt2pTivS{7fEyNT(0mZjsI`KHab*SMa%NhhXuU8sh)j z>;FLX>41BjVhpGsfLk8zWb_XCe*|H6KF%VKZN{Ex& z7CiIpDMe*mhn_+I7tXRo@0yx3}-aT=#smc~wTNMI)HQ2hV^+@n<|t zd1WK|7f;b1re9($VR4Kq@kpqks~pSmo}4E4c;FST{>f+Qk5xgy-F0ZXU79m2;WG~% z8|nV`MXnH< zRJs(Pap_J>Yedi=A4bf)cHpK3KWW2$Q5@k-dCX1Wo^`(atAp&}p9-SZofaTc7mOFM6X1%-u}N-S`Hjqm6Xn z=6j-N(Trl&@)%UB2(Frgbe!2|T5S56EO$u->*5N+J=H-6WpU`zkVIvpW2k!|5Tf|p zL9pXZ5PeijA74%)-uuhIZ?KpU-!c;2c9fg8YdY!uorMd&J%u2n@t7*Q7FUKHrM+Tl zZ~$aEJC~(+!HsWDlJ!Tob83*@wh9cM9%6En4q%S05ajc-tj!Yf7{2p79U0sVGXj=@ zU9$nIER{q0JB*5555?WhmjqAFDRSeFX_G_Owi4~e`Ao~!X7Cgh2lwQyg83I;k_}xR z;Q759S7_LQa#|Km?U@Zb_S(WI|J{JnmBeoIV{jHbO&qE}k;DEe@TnmmHEw<-t1U{X zpkIbQQ`04r<$_UDhi?|=mD`CC+Hg93AC6jnl~!mjAwtntAZS_~T#h*_SaIEtDbGpg zTW0dGIGVG15NyNyGx?058sA8HMwY(Wn+^VoeONJFmrBZ|Q1{7*hj01`{!BYZf5?Sm z+V3mma@-E8Ix>;$2)x521XbaDF?ZYr%{TPiR3o2<``)_PXn?~#yPpCYlhUaoABR|Kkf#=(9AIT(0!oET;f5Y~7+ zXB!s{D@@aQew8})<#{)ny+T}pc^!sa6Yz|XF%Z(Z9kshA0It-9YFl@Kgxmwr_m2hZ zrw5=+Y&R8cFeg8D=z-59f^?Y_Sif3EUVoSlH5N+jcvT^8*8MohQ?7@Wuwk5UUk7_r zi>a8?G4k(YDmgTM3_HHP1QX_!Q*Emo^i$a+=)AugCfztASUIFglLOrGXu$^*ZVM*| zB;J9jj0if(PP9hKdU^xLdTJmdsfuuzY5O zIo3Y>`z{J+T~cCWW=mn!!w~4uX@P|r;`nPxBRCvr2U%+q_&45!{V09|%oer7&Yrb! z`9LD+t*wTj%~R>IX<2aIM2$UTKbmc0_L5g?S7NV6a<#$E9O`~km~&4X&*ytJ;7FDz zk%)H3$_0}t3a!Ai+AHu-gD7qlHKF!CzpCTkYh%rdj{>K2Ca4My$^zV8wO{s*nnrGK2qV?`sC)GS|-6*1p^d*qqB&B(XML{oV?d&jiJzZE5eHZ2Fv8OXpfXfeV*B@Uepuw0I9v z;f0>~pgDs`I2x1d(Gy8R{4q3%kcM{&wT%70R=6kOB~Vp50qx)F;YFYxel_NEcWP&N z8hiuEyQKqNRhx0D$V0RosD##dVRSBCO~>?4hHqD%lO^jeW7gjV=#ZU-pJQ|(Ang^Z z-dMub@_VnVK9{LqbqI}y%iz_h#@&A&DHuwbgWSQzs3{i7{9U4m<$y!Z^NK`IL~o;M|YQs(!wpJWd7oOOwOM`_kNdVAL>@Y*fwcY9Y{cl z50_A=QUZ*m|51%V0#{Z$&t^w{?zuGNiSt_jl4_aRs(LA3cK5K+>GNew0V!}2ivqTBg)?npa`+gz?fZLKPb#>G+Z9p|muQq1vm%{DUY(pMdP{8QGMd5Oo zZ>EI7m1D4MniB+k`-wXxMsXP#UfjezH)*~^9W;v!oi_3c#(nRzwAbK$ zfM%g^oZFAxbFLG&t_ft6cnB%)YQgyI5H#NDgX7EU1uegV=#XWSV1`BnuGA=iN&mc| zx8wtz_U;A{QxOcg+XUafJ42#(0x>_jkaP{?!L;VhsHQC-ijQM4@6HPHBJn6Sm69R5 zUPqDUnpB8Yzeghnrg1@6pTgHl5Af>lAQS8z(dGOx{9%6xXRue$$M+3x6x>DMg{RQr z*$V>0o5_YZ$FWOQiY?BX0A{kWl;Imfl$ve{3Y`AnVBlFuioc0h^=0-z$BU=1>&7K=YEvH(huaWeHUY#X>WSOj?{M~5DfUhZfTo?w zP;3(poiohQzf_2I)@cHp;%I!gu8u})R?ubd95B#w8`B%LNboYr2@G>0uWQ*<0`2*JZ%>w*i>mOsKVQ3GY??5R2|o@A?^Mv;wH;?`PNSvwF2Qh;3og2? zL_-2!;mhq4;a*8$buHiW+{GTjZPnGpL+UzA7j>j&Bln?$7gDsG z52_Ql!?KN6$VX8rfvf&Oj2?3ZSFBRwa(4HS#2QsR%(FO}njgaaU>PE~u@lZ5vdxng0mT!qZEpwm(z)+ zhB?$E-(=dChr{Q4o> z+4%qVdYKvS-nPZx(CGit3jVv@>OXqHy>3ft&2yt)5GnXMXAu-6-GC2!bg|~_3DmP4 zu=?cnmPADU!uM*6Fn6*D=1ww%8K>3I`Kk+DC!&O1zn9>{4qr6=jG!{F316S|v6^92 z3|_ltGK;Fx$oX4Q_{#YzRS3*v#J29l2Jb4qN$5V^Hgo}nqwDF_h0-u$w}@_VIw!a} zl1m4pm($%7-c#$Of5_aQiQQ0dm2$j_>diC4^z6mZaZ&qw7!S&~Gk@ICs@K6q+DGV@i{uUaJ${rk}KYsU3sAWTUX`Py_Y-W&}sC z&fpH7kY|RPqeU=92)5iefJ49E z6VGsKe&1oWUf@!ilgICW{5>E!Q;g*wH!Hf1HOef5YWjd+1bv;yxmSd5>ld51xx1S`I81C)-K zA}6tviTyVka`wAJ;#FnPxhcTk%O&t|<_TJ7^%q`FYQ{B|;!J!ch=6s0+XC zYRR6A0938dhc*29qc!*(u^HXTgvfqm|dzZ2IYL+G=X!kHseX{O5v4ZiKgw{YuY*TX!*{y9gVPUrb8w|>wNxtTnpD+@Qj zk%Oi88hBp2C%M?HLdy%(;o>hp24y1U3-`!(G(*KTYGp%3Se;KRolbk@)6cu3m6`0o>bCOxLDX z;;DZ=B*1%;p#4xD40ZTo!tp^i|YVg-Bdz8Ph*jjRmP_52>$(F1$!Gq!FlgdOj%`v? zv|I!sOM%YW)l4*8=D^KyCzyfT&7ffM0FFMCBJYl+;)hDdlp~)_JCVscj9+7ArQG1gV$ueK`Q4wT@AE|SU6AtV@kMH%Z7HjqfvUzfvR^d>rDd>4P6 zI!a0x6@kdbn`E(+I6L?$1TXDP5G;99&-`|=MfHqEVp~v+?n!}ot@9;SIFyZ!_PLe= z1((SE3H>l{!(!ZKJc-7x^JW%^ijcjrY8dGe%s)p(!Ip&KhJp1cze*MJts@}7pvWpy zZW%1Nze(WJo(D?h`*F&WI@D>G=J!B|muLt$Zx!W)q#lv)&R;-840=9_%bb=2&yID&wS7hqGFpWuKMF_LXc4?vD@FWE zUlJKQ9{o>Q!1|kYD1WJjguMAIn0xXiy6%j^G}l3ln{<=r)&78)yqQ{HcY$nMxR)Hs zOry(B?x0lxBTW1{4cr`+3(ubL)z;4=ksj2uP&7P70voMhv}8VdwcBA?Z#t^V-v z0J^ksJ$Pz9BA$=V;8n>{OxN0V(BFL!f*k5d#o{|C`#hBIl9i(gs~KD@;lM0Dx&%iv z#&kmbPkj8$3LQ^Gkx3FKX{zuUNY{Ld%R9^=`+gSeWjfJtOe}WpJIQEe)l>65A^6<0 zo+Ms~#4l?`tdj3)fykP8TKJJ5!}HUu#pAK@bf(})sT(ctji{a(Ue0rCc>i#pG9GZ) zhOl)WtS`Jq8=K}KsM})8ZZTLep-MpIGckZYj_1oNA!#gDqfZsvNZ|F0bfM2yEKRqC(1#WzepeNoa7O3| zi${IM^;j7whaKUwpqY0kx+mmP;g#-qHS``6$}@obJmX0&+hvhlbdP-XtAO~|@~HhG z4b$HS@Qv4IklheWZ|oe)vmsiU8$5^c=En2*Y3&;ltv4M$E?Nkugq%oFmm0j;sz#g3 z9}CEZ)0n*SG_NCGBfB={LeG~fGLPpyXocK^FD5lau$zUnmr_ubQ9!Sjgv0ZIKlt}j zF{~tf4^H4x(5-f&6Rj1o_md&J#dkHzWG%=3x^US2xtMM=&cIcw=H$-PD!eu4C3Uih zh1OlYBtn3KkNo@Q?(}$EdAFH4^oj2vo<9-kg=k!oBS+S*6(+R~^>o?UHtMx%KWaB< z;XywOR24~ti88WqAt8e%*N6+I`%iJKvhuu(g=M#gc4aQ6_9U7Eg?3iDI$oK002(jb2_L zhAuB8;ZFR1(tqL--E7}Uoz6yssCN)XswQLE&`q*qwhNz$zJx}iNyI}(i2D_u443+B z(Q(#f{{P^+3}z|g<7MvHw@n)FKhuJx`XM|sHw`Rbc%y9JZ>r~_OTx`qyvJN7pU-mw zbHik$dGp}$yFg;O&4u&@EP^#+d4e;%ldq2FPUwIDJo)Ro*vo`OnTfMGBb(qs7T+8? zs{j*wDll_fDa2Y!(%A{Z)pmuHgv^c;j6`r}>aWQl>;@>|cTADr;Qe z^%zZkXW%={bQr76vnO5KNvE(EIdtYGot!qG9`P!~am&hJNp2IlKNN|lM_TBbz5+&R z>nY5$>f-OMa;o!hB4k^?p!+s%6>M%}U@*`Co><)0nFSGiro+u}i`J)Et#4ahkJvtmG z+`2@CbH%Yk@RV{QX3!b88yDJ+!emEV*pS?d&&_Vot^9Q%;@X0)!KZP~EKibN5KiXH z3ll57LG3^nN>adb^g~Kc4_jqdvmps;j)?`6ku6b{%HRzoSbgIx}1Q8mRuO zLgviUFmkspiJ#lZ!y78i<^_L&3vuhgcWWy2j0D4_1J>aB>k}C-9L7{MHV_T61HMa? z!@d)eWU6%>ofgG+5j8bI_g!@|JpB!s8@-K;GPS4F@(t0=yTe%heu$Zd_RK@K$(<8*n|~+Ko^>Q8Hg+&shG#2{9HfKtarFA4G}!hspXM7K2Y;KL zP<6MQrWpo;ytf*0t1XADQd5*3mq(vg{3c5dcY@Z|4S4<33L-jZBj{d#Nqg%JfQ&fd z90zf@7PK9rd{k+-@i9CoY{K)cDxp#AD(ndMh9??DxWB^@<~+(KcfYvP;h-59Si1_d z_4$n3Ss4tvy&XJr6Je1<4k!%CGGEifsfzA+cD&vLD1Q+^qRt*;hC0ttkN?Hjn}<^s zzWv)sMJXgh6onLtC>8d7EkkLLG?Fx{&>)dWDYMKnMMTJ$Oog!SYiU%eB$Q|}l&LhL zx!?L8zxR3H=Xs|;`fqpCu{Ueq_jP?f=V@dP32Y;^a{s|DdlYOuyrqcL_eHa3Y{p~n zm|ajSp#+^JiL5T~fj#BEobF#=P9E&4z^b+k%$p`jPwy%r!G-1YcT787R#!nDO_87t zSK{y+pGdvc5d>aoXXx(TRpf@y1(1JfMo?)28u5uw1=WT4QEVf;Opn0m4cWBl&s%t- z){Z5N2Dq~vtW;N}I|B7!n{GecvU^3$LW=O)P(S~y(4o`!7YTx{-Nbj#JE_&a4!S;_ zVS8M+k+XYe(XLm1^uVS>%t+BegXn0on}{&$&EKG)MHeg6_%ugZ4!YiT!Grhh=%Ka% zIU#hal)?9#RW^ z7*qb1+OO0iqo!G5;Tyhxw)=uWY3mq>j>$yHy6J-T2I5d469wwkPpjvyn+E~O#gO%J zG1`pxhK|do(7B%fe4Gs7bCEbcz1T@T&DMfr={w{2bP1lrkVd2KNHVdr1aReJGsxBq z@I2LTY=qTqstD|RGz@-;GO)=0U@0C_l#{jjS-Rxf`h|xC~GtiO=IG)IDQZ0 z>@p|zV`@o3wI$o~Jc;^$TtPBD(;;ympW=-)jJ*0x!Vh14l5_NEj__ zKC+L;0IuLU#t)qoaPy-SyoHxBQ_C7wTn)gK-5QvhTh7i&zb0^2uM7uM~8%489A_>xK+@~Yw25T7xYphir$I^8HG^?hd}H8{ z1$$2T7<5gzM66D9vK6zI&_fq5LCSjt9C`eg%)8IC>iNX?438T)y2Bq#ZU53T<4b&N zMGw9I%!jyRlX11=B(S*jmj+EJ#e~QFPH%A>G*&*x=LXVX>-s}*MQS%1M1;c>>z(A~ zmoStVFv9q;(O6UFh1NH$>4kwv8X@}GI8bUbs-Haz7xa#z?z6L47sWS^1{VQ{0f8977IH=`6R6)E^IO&^1UbM((mao?#(pPu&4^9em|o6%cQyL;oWTX_6C~T zwF%|JMKR~`L&1_0ci`eZBi!aIOPxs|G&(htCz|$HJyb#SdJF)(9w1c^rq%ia?8#pM z^E-L|oT>^GE3C#7J{&DH{XwH1_~K#79#Y%89q+qN;$FEV&^y`d;i$rL6kWX*SE}5k zKYb>_p*`*F+w8w&Vs0wdeOnAx(dXc@KZEwKC7I!tI6QUhBwpQI2Uqxfl*{|9YN;_k z^tEe}KyT@3tlu;l()gs}l?VAGN#QF^zw>~+S$q^!^L|s!AKz)z)Y0Vkl2PDjT?$Xb zHObz(DEDY%DA0&0h@(JFy@jO{T{LxM51h{_!^$^B&`l(q>kZ!t`EAC z;^~8(v#EJ0gZ|%3aqjL6@<8V{2$gPwGm3R2_3b-q6Fo>Gt+PqA+GL(x>PM_yV)1j7 zHvX97PZ}!qNZi)xFnRM!c0^wsYkJH0dD=U2kWr_89-g?%;SqjWppUQhzf$SO-MBMG z2(G_tp&y7jruBcSQTlX*pJDEDTKjA#;T&TluB9n|vJOkakr@vs2eCTT8EsWTHhCoPe%|X^A0c}_lznMGDtND-^7>v$YQAWQ58x&B%ogevR7 zJ%2I|MGo>w*Ae#CrB$GEN|MH#_>=CtqBth;7#bZaqAvx@nC`K~;4A-vs2{R|sQsQe zb(%EnaU6?AS)Js8=UR||U5tu}U&yCbFO4rI$f4L5aj@E)gXS{>pgQCsEBo^tE#>bb zf}CSed3Pq+6TObK3WRak<1{{+cZP;eJ}Y?PXT@3c*<$MwdvduTiB>pvrqi zZuG7+n&T7(%D$%s1zaMGt!^yRyl0TYbn@--$6wp%8liFz7sc1HKAp=wCr1yjatR zqLLnX-NyrW|8Rs8Lcc*@A~BF0^ZYi zi}!3c({1x>SsT7-b6w1gZaiLrH%FrIpvGpnb9f(aG19{eQ<|t|iUm1!)dGXfe#70d z+B9|AE>!H^Brsm>j4itNA?%1BIl3$#SA5!vN7JOZcCbS;eu7ana|^V61qDdiT|`zmt=2 zdQ}23oD~Wk&ySJ01y|{oyUBD)-8FRC`im<1kI-3h6X{f*DQq_q4n=Dm@$>Y#7)|%V z{&#$=PB;?Fj)`%`t@+gX)+2%al4P*Wze4X%{6M68rSOL6eROC2=C<&G zOv=`5(BoT9qM@ZI-0g?ArS9V9T7G^VB!f@96sSTBzbF405B96Cv5~SS@Z{H0GO+@P z=!!RFxMn77m}dbG4LZs3Zx&#CC7u+N_zQwlgTPU3Dm%C~mR0HH=T$CBs1o5zX5I{g z)~xvuv@Hh2o?J05E3<*@&RE!Ck^%kGbb-=da2Zz(p5aqKWBOmxsH}mF_a#vN!7Y6I z;U3M%RL4L~MRH+n3sqkF8mFzhX8dO9au8k>4S{~=@nwPr*gltn&yI7@?Z*X-E4WK! z=4O(0{V6zI{05Gv6Hv#ti_Sh-N`lf#NgXFHxDzFUV)K5{FV)f1^i4eGw*4i(S%=WV zzz2xS+^*E~T zScC0f`9|Y6GxC|=!^-Cd_lyzy?-r09zV-xVxes<+IoH#jLj^fhrQ=RU?Jl1$n$jlrmJ*C z_e|<}>@qv+z)jrnEC$!`vp^!T4UTr~Ce1t>YiE}!%E$=8(9|oib?Fr>6|`dJ{8HR< zI1efwq>-mKHUh2QOK3fbhq37=`;&)!azpnc~QQoDBgBG3k&nPlMNKm6}OXEsfrD#GYq%R&;j z8Q1l_0&u!d%QprKMn-B`!I@xM=oU|9y=S7+JO)-aOr|Sm)EH?xtYP=@jNNvTR*W!x zO4VV*8!7~Th>ie2hUt~8i{_lU^Ar;OC$w(cH##cX z7+gfRk%t3QxFf-TsP^Y9Dz?Xo>b$&9zR#Q`@aVW(9T`83G+W8Q6_qdOE+xvHzEX%X z?c<^8_;~!8_nJ02{2tK9#v7B090aoSyhO9@^i(qwV9gsD{EF;IBJrlPr$u5RAUy zN9so?6pW;jE&L2&#mo|F(dr(7~Ru6q$LDwkQX%1@x-#! zIXGA)!URp73eV(1U}e-7+GFvSW{>2eF4zHnJl(XteLooO~6UE z`*`n&6BN#ggr8%kLHCw!kd!sycQ#sJ)6J2TC40ycylfO@X^KaZFJt@f(Rga*E!OMA zXvV2`2ChHSO9NKSp!3OeOhy&*UT!JVW719D-MmQ4UVg60KeG)hpSr-Wmv)fjdI-Jv z?!(I$;jp*#A8R!8F3+T&Nh}=SlMuaC$aGV(Xv+lHZci}FFb${e*@n^$H_$i69>jmV zX2*OUg*rtJY>?<2`a7z*Mo%u1Uf&@Q6z29(-xO_Fc*2!NU6kQ0#E!s^e4aPgA&oyp zd@*{w7HHOdCr$>jXz*bXw!SNZeeR1vd{Qac6G^o8t49&FE978A5hl4Y?5V6Q`s#Qj zs;kY%G5%+Wu46O%!tg0RxfDSgf9hhu;RWz!*)wB}%v0p6#WYlZpU66^?#D|RwqVw` zg7=3cvFqntqym3w@E(Xk>-)B-;Ij=M3AGbz{@kkH77s>q`9_^=BmBnkT)W&!LH>jT z#ttb7=&@lkDYd*t@0sdA^H_IK-gJZJ)-R@vaSD0Rmrw4j-)p?pd@4ToU4n5Fl40=2 zSlF8*$GM!GN^Oi+p!8w~YP|m`xgI2s`iI7nduchmw^xk(X?Q`RR|VtPr&&1oEgdNAL@oag_TR*K+sBQaGWNGCssv)E@=V3frYRmV;atE;^1|C0lcYo zX8QxHfji0JtRQWS(EeCs*f*a{$=piv%5&KFsUq-^BmpK|or@^wbUT!D@C-A7^%Y0<{ zMvc7SQ*a9UKDwueC2`zshMpo~P$H3Q#0<*(yB+P9xY=1Wb zGv_RaAzX`BybFLfSEEa?X&Zhh zPKC7JQn*Ss6O)2?pWM+Pto)ILw+)k^{bMY>p)7;vKPcn$kYN5f%lq*r?t+)&jJc&5 zPVDvdd>-m)0naI9VA|7tsJmwroaZ}5(Sa(d{aT%(Eh*Iht&bTPIaxDHZ$*T7m< z!Fb?rEwP;*DBTevuq=iz62t zwaBBE4RrP00^aHNipcn`Ac}U|=$NH9seZyUibrkn*z__ye@qjZd1dgVP#9;M6i^qj z5(tS1!L^-Q#_uC1P!rP(!8qwExYR0&8QT-^&xkWbp3Oywxd6HSTQTtVKKk~7ElL?q zBVCqz$>CpzkzekE)ul#S;xa}s#;<`r`=C&eudpA6vld|3+1KFTzLX@lZ^ug;iwT@M zL&u~>(3w##hEk%6sK4I_H%FThweWG^rzB!@IOhhKeh#IN#WZk&(*_)@JtkPNpQE=u zLy6IV9?DD{s5v|?mp!U73*rJI$%fH#nByb~^WS&SzaBnRUFs!W=XwfO-8l=~SQmV! z$GffDdcgT^B`r+d1bar#V8L4rcDGk378Y1wgBxqys;!Lo*RMj`zgKbT-a>v3djw+> zlkt#eBMnI&OAFgfp<&rh_!?S6Kk5Y;n{|~Cg{SLb#)brNbM1j9)du+P7y;p5Ex0bMN-J&r4n#? z<4pXR?+1E5*P!WbBRs7W1^*dx&>~R{<;%u%Kh`XOYtznAn*+y)_0kY}w7TX>lm2xh08adY`UdeQEM;Jwfkd=PYxO#B>#mjo+d!rUYbGxjkHtPe5DgxBmFo7t?kB9Tp#dNE?G8#*FQz@C} zcp5_KHT`x0@0EqI zx5VI}<}jKX+S1C6>8$g^d8mA7kSuB0gQq)vps*o`u1noZ9;YOce$h*KYlc3yXSd>q zFd^hT_hGdBb@India48(#jA#K;O}gXvIYF^jXq@G#7SXqsvjyRkAnR(cdD5Xs-ufg{6&ml$Hkk} zBWMTxAw3Z)Gb`vLwP5^A)VPpVZ4%S56J1_SMi)zaOuV=OXH4fa{)3mGt!E|(iH@cX zHGNcasVN*!uqG+?SJ~B)@gV&E9Wm3?gv1Yq@Ps@iF6Ydl>Fh3;WA(cxp=vz6rF(&- zWOva|yTw5JBZYMKEp;8vg4JTjF=5qKZexBt9pbYb=0|w9aZMba{HacZRDDSH{0`Wx zCo1?8vz^>AQNX+Fb67aZ_f{v0)0mWUq^~Zp8#fWw=)DB#S02kr7f;~&wbKO$i+aIH zpoGg04Wex}|ExX95vjrAYLj1@(A!*0GsadB<%Qm;x}^(VnKN+Df)Sh;ru0VlY<@n2 zg4wxZO#0~sX!dLztJ}5&$DepZ$~*F)Nns`=EO26zn;UDu2q-vK zK^OW@#@u8P-T~DqcsUpk{^}<%-@cvY6gBYmED20kyo?R}+*wj|J%;3%Q?Wl{urvP+ znVFc6>!c{LUc7J&Hg)fz@q-j+p_%$l?9!@`8{f^S_Lu0sAVL{~b zqzdquZ@^ue`>SRwf6g1I|4Mzrzms)af(dil0KdLELcbnO#nU6sxUO_Nbj3Ttk#oW5 zE+37v|4hUqm+f)6#CJOWk)EKY+mQAt?!kMS!GaSq`%&opeX>b70H3W@gdJhNcyvVx z#MDFxI&+NCK0K3*-F1Ne`*4J4@^`M3=1;h#&kkEcR8X}zp0>GNAwBzgsd%}tpg~;- zI!YI?(_`;LZmA+EDgQw(o!Lx^Zoi_!AB1S+t}KCN1MfR`-bhaF-w%IBj}SbfQM1=f zoz9xJgM6{}XBD>a_nVwo?Bp%)X_-|%SPHpeX47LVd?&*|{#>3e6;9oa_kpIycC=h@ z8MgJ8lg~;L;Lv*xr)hTyeundWWb0$pHhvBhZq-0{yUbz^zj{JOZ$1k9BO(N4c5|yc zi~o`n3x(<9jfX*g)mu7lQz@*R{1L_=hY9348K3rt_^0q^Y2`AqWX?A_J$fnqEbR#M z`~1KsE1BFglV{EcU&JRyy{J9b1M(tXQzN4{tX8rl`L*mM9vbHeGgPE;9JdYnqBhaZ zlirfPcX~jX)fnksg<0ZN^hq9{4+<_8{614h`iTu@5|NWb&1Gk!P@S`Jlk!5e8C^=8l+(7G&#wFef`MAa=R(aEuRyk;ki6Wwp7INcr!}vW@ zIZ6E$0}CYlcynsB@m|qb*i%|bGeu-UDbp4{?rx#W*cnu}R28Q_*oe5Im9Dlv3)6(x z;q|JI#+!Nn`@RlQE`;}6yh(ATPqiA`<9I;O;r(Dkf`Lj-g4%0jk9txp)cokJ& zECtPKZHPOtj{47gil%vHuxj-zc(~~;WSt1dgrCLWJs}LGwsbM@+4+Yz<(@f_z z_;6Yv+&}%6d@bAwE&C$LpB@QnaW@PlEj{Sww_$Lo>J@!@^aXuuW`>_c|H0j;FJ!lz z2nz2{LWN6yR5#uSc3<|!p`cyZtma27-j{z#g_2`N991W(-8}VeMY)${(Ok$m(OBIB)*-aw>STJE2owt;en18b1_16sKJjBt_ zPM03oyOy@A_Kli)iq7Gre%Mgk*O{vJsaSf>g>lqR?GI$E^(^$;;p3pP;v3m~joH4nkT8uXxv_ z;;!YeswIyu)QlkN7bKbccY7fHM=TY~c>>>FXF&eqF#I@SHyU+4Lg^G&xD&pCJTxnZ zHR5;aZIL~+e?v5i_~oN)?m_xj#SaFim0(%qZ8|oF6Fh194i1h^XnH=0cDzu;-|f4q zU6gNNhnp=HdZc38LLXu;jcdCQ}?j?e*<8D&m_=4c9mpo=wnlN z6+!jAv#jYjo}hFdNbtIN)+Id^mR-Ms5w!^!7a?9WxcJSxHh3DGI>=_Xtx-OM$aBL&D)^Mm~Hjk=w@u*AHh2VBJiN@7j!0s-- zqh6GaJIv;zoufTrCx=40Q3cNMG$#jD*Mo(ZI7(FP16E%b-L_bfLwuI}qV_pVFS|rt zvm@~H%p^8(6w(JxABeccRKbbbPO5S}hsX=75WS2}vQbzUPDDYX zkCbW3g|Bqr?P$74Wi~bP)#LilThTpw5%B5mdzu>6QnUDn2&%+hCm&lZ$zO9nNQ*YW z@n?--&A&nLvCF_SxAf?PlxI|w=UK?d-o$ImO5wk=ng7!j{GXKi(_y*v$ZR26&D&!8 z&S`@6!}&C80#AzZ%oThZKR}<)TaQvoD^cX@T+~@zL6U<9jMBbf8QF%<(XsrBK5*GJc3x3bJ z&l<_{sV8yX;^O#?dZwn)`erqD2H%kUFLL$&es}(VIQ5GEj~D;Hk?J+fY`K9j8E%H0 z5>r*!g;T8VVO7*@Mm%;6H#1+1mkd9IO*CqQGzT3rd6^G6-?_Zq4Aa*in zVK90-1af`mvCQ+Uxm?vUS)OJcn1>)6&Vxbh4)OJuDN2Of5*V2 zjf-N~2ir|Pm`^snIsdxJ);&Qck25q(6E{bitgDST*>q!(smGVurW>bQn+83XFdcue z)}-w_Fh^{)OncQWnXHjOlaJ}&*ae5PLtzHi%rx7I;JnQ%S;~D-Zsga zeb?mswN#V2*`lW5VVPChjWtDJ7~==}o|`yJ0rh9j?;Y!ye7Ao1lUs>0Hy#jc}G zbBL2k^R8i&XFG;XiVjRNP2TKhI^k)nN%oa`CgSF7la5VlCaVu`F}=F(8WXBM#AsNF zm?W+dm`dN4HSz9!X5zg%it*OJY4TCxqDjdyA=6Pb&Gi4?;MMy-8od9-LW}PAXF7wu z7NM z8=<3&WyAsI-Ns{#q2yu4V8JfN{EQEC{=;VGgqIt0BiNt0cH5ItH`u|Hc=$2C*Af}8 z94971cqKFDMlo|E-+@_{zm@SAUd9+0IWgZnLzz2q&P?MEU;gh!F*Wsjm|d~{%;*kh z=Hej-M!@c6ZdvbSzHc#NguNY@c`iE`!;gLpS-OhRFt%g97;R!+4D#BB`s0j`$`0oE zL@&moI*rMlwvX9jeS{ftc4H=;v}c+;oSEc=?Mz(kPG$oCL*#J4eY?}1oxA@}NZfyb z@@GTt!y^?vu3Su>=h`QKmoe-YFE^HK%=&wmlq9-8%{2l>qP$rgcGR4udn>M~OI zDWCDu%jN#;RbbxVZQ+X4SD{X~4aa%?V4OR%m=&F-wJ%%!xytJmwC|-mqv#UE{rsRy ze6fn#G*7@?*O1`mx92fCERHi$EfNf)G@;fs*arusw7I6=(p+VMEvLEApRswclzHRz ziHUMw$ZY?cPsmI$=E3@WZo;Y*J-sqk-RDsDf} zMUG{wbM?a$F-lR389lg_3uqPL9{sY%=8yzzo*0TZBMneSIf3TR%z^pi&Qiy>X1tW1 zUnpFdiJR*;f$fJVLCFa|0I@*_Q(Y|?d-)qsptF+ZM&^@a8}Fcch#MR{?SclT3UDyh z5l#MBa8^5C(KDtSsPoa4cy;@FW}^CG{N?S9%N!4rHuDm!^jpLY=5&xTvo*mJYJa=}K80HACg0EjG{FZzG8rC*A$9*m*cIgnf zYsukoR1Ud3_aAC~(8FT+h1}l{Z-BE4p|cVW!_C-qI#gK(;?h1)rJPEa)!zg*B^EcC z2jJ)fYna}L;aI+D2Je$g-fr~iQRTlF|>7$Sr zIS0o)`(vjXwz zhGn33bslr;Hev2gTne|e6L<{qX3%{hivFUvpx#|rusc5vE{{5d=TB{dKTZS^52Zl= zzf+8V<#T~o;0+YH*+hPNIk^Z${F%8YuY2vZ@;QDMIqSgv!2zM3@} z3}kG;Q+yrfN{@o2s^h^?agjhI=R7$ytip6FHRG9w!6;WZ6@(=$5{PU{Yhw|#< z;g-&9q#}*9p}QZdMO(2gs0ROh{R^VHCEzc86;0qKK2ASNI({YybY@=@m>gdQiiwX1 z9Ld2@$xWD-FbWT-#c{zu+;P~VpXADXV}GwxV#=2@T*#Nl)M?>8EXw?hZEoe5z+YC? zooCPo)~jh%x&|@0TR=k{tMKm6%V47TlhT7_xYpqh9dt9rnEm#gZOR4=2;zeS%iYPq zZyoOI#6;{fY=u8t(&0cw1cn@mzk2- z79tjUYj8oc1@-^1$@p>NX>4hHMA+~I+9+iOg`P`me1?Zffb|J#FnSY89ty`Jb_MXq zrw69%D=}MQg*e%Sa-8;I0lL0PqmSm~;f9}EQ93sROeGqzvZNmqmR3+pbs=t6>m~Mt zNgwTg)q_*x6JXU?QTG*ArxMLo67;2*09cr~U3&z=dxbWImD(^*8m8Qdq4gG;dXy$UmMFrD0vKgt>R z&!A;;pTKIP7wPQhC4Syz5FJ!V^jGeu)q(}AXW%ZF@2LTGHmTI(!5~{Zy_vqxNZ^-v zOVD8Dcmav*!o>Jhw9Sm6rmuH{-Scd4Y|BBptUmhYpAxfCW(?=_;5yM~m!Ky9Y}jj) zg~j?Ccr^Vk%G`QG9XITUI)Mu6&YlLGS_O2x*h;QeRiR{*Kb|T|BFEQzlX-hLkd4kK z!TQo7>`T(+TuagfO*-dDiCZU%NY>+k&MzpxTt&j;nsMTjT-3i31ZTbGaB1Hpx#H-< zTzf<#$!QX1W*%0;rLEiHzETt2lCy%e%sy?XaP=r*d00-^@LW{c?@K=ayU0$Qt;++D z9>Db^4KDS*EObV;qwH#R=Gu*P==fp`TW$|RRIW3;UVIti4=fN|(9)o_M*m>Nl1Dre zo)YcmMqE|&7JJ9FfKm7%G=MAQGw#4t z&{MvP=cgz$OTPwzj+8Hi-x$Z-{xuU0_sTE_cC^s!&#o9TSc_ZtN7eLye1hjKH{gop zhRm5nDX5o7f-RrZ@#yV2uqW;`{Mq~%^4IFX(~D~%>e+3`(`>`P^X4%L#+hUwVlkds zu?qOE1~JSU%bghgk-W1LVXo5zJA^W7~X$F@_(&9FAW}&I{MW_O8>g#*UZhMUB8VMFr;KVt?$N`jMI~-Xqw3 z#+j3=)1z9kKXCoH%Sac>L4y82v~j#l9Zc_&7&~<)qFJ6+G&wQj^Dg0LZw=JoCPI!# z4Mt{Ep>J~s;D)JqKJE&wO$!G(9(McmatPH)aAGaqi!u7^-{X|PgBXRyU)Bsc@*#2W1YEW@fIj{$0WE9^ z>L1aExmN4gN#;ZBX#*ifAwUFHHQJM>aoucq-dJv%w>SydXMkl#I2!!Y4==8L1t+~^ z1iUYo4++fW_8pkU%-9^UZY4Go<%((TNsfJt@s9Cm? zm-&wP>hVSLGx7uYY`KOz&0j+QbWJ{3(M?m0TR==V1rO|Ng!x&Cz{zEi0g1WvuZA@D z@|hw&ekDfd@}UXKk6Yoe*mgj_ae|K_{JC>6iyEE>1WxnEketr5f=4GGk$GJk>7-Oo z?0rp14=Kep{jtz<#vK;?5Mt&!rwF#Gry@5~2ecNY!Qn#={II*o_|WzbWZS!m_}=kM z%`5IHt+aoH2Qt)|v&)u3f7b}w%x^(mO;7BqNCZ!-qj;AW9L{{`hM#6#fNMVLV9PJ` zX|yy`TA|6Yx;!SoMHcG@02K&?5B)-9qEl{g2*H6htxc6J%B*@>*_&kF^yTZUY6`~i6Whr{*VDG*o^ z2^(LW!@%HfcXz;pKQUfoF{bcXdK4DIL_~+8wN*Vw)qUy7RMO_o-Ouy{in5!>4cw%L~~p z=WfFyyUFC##t-!Nx0Q6_j6=9@@IsAYdn%UBa3IzrqRiejHxl*!J-umDz-tYJxUdJ0 zNdT<^&&rE}1k*?K7_SKW)_w<$O38DLrElqvvMXfA-vGLJ$8ECYOB~b)J8^BRQ{ka! zFosDzCW5W1=(;=-);!&g_iAUt7&}=^X)F{d$;^X0KMY~H(lTz8k1tRwS+tq9n|b`> zAQv-tm`Lvlqh%>~Q0)|7;OBK1o((fN5v^0iqUZ!pY?wru`Fyw~DFT)4%<$^(aQ1gl z6$~F)27CJI&{v_J=2QVR)cC5a%FW%I0{^V1;D}v4UebGxsR8_QDeea7@6bk*w0r1v+mF4F$qH0>J;$}l zsr&*f0RU?ze(9q3*A(O77mAETtQ1;(TEVER5D5g3{mwlvc?~#yK%232{AiCgS);(8A5rj()xJ;psXZA)(rHLN-zGsC?CgI zCY9rh^RmoW)qbioEDgzXCx9V;<<}mq$W{8sg3^*@VDkJ1{gj!2OF}-=>Vrd6ZKVmJ~;4g*}fb1tS;dlKccHQ7#!(_ClgNNIkPR; zB-TJa?9K(7x`i-lbvWD+or&Azmq0*xKIU|qvxSQm!JpZi7+Y}%by%M7aC3~LO+0Ki3D21M!fOMp1NJ#g`4=_mxJk9JiN&PkFSwuTpQa-&X;Jc z{-8@)uZa%@E;sZq)~gzGSRF zxdwx+cJZ3K5_IAP!h)&xsJE^Kn#a5(`hDv_EaMD*baj9$UL5&Rqk=^N5%{Ie4Hl)D z!KBzqXnEm_GBeM^NO}~!*uDTwiXw>g^?Wkx3&l3a%jD>rv7D{>VvswrnFbh&!2)Fm z7&Q0{CnbwXYPu?aH_pV2?#s}&E*Z9*9?ygq{~_rcL-6GlNAf+wwT18+3n!TZp0sI;yESJ}(rRqc8VHE#sad5Vt32VrjDK_ZqY!n7KMK;FYhz6>kD z{KR>D(didyx_%4xX4GQ;>LS`A$A??_5|hWp@3^snTI?rygb3=ien3BQIDR$0%^St;gk6l@U{eXn5OL$_6-fl6`*vAnC0w zH^2Ki#`N5VD8+H;R$GfQ9>H`$LIX9CUCb<4KLd8@Qu;QhlC(ckX3STWllR*e;-^q8 z9IG`%59Z9Jm+f;vC2b;;Y7J`FB=cQG|;g z9|00;eDG%XV(gJ#2SP6zP<`MG&fZo{4{f>y11H9kBTm6&`S3h$WMU31Ii3&GE+yjV z(fobQ{3|5>DkS13J;CiKk|_=qv|~jicG+|g)6xw%EL@ML>SDPNk6Wm7q6g;$#^8jo zYy9HQ2PV5ofL8$v^@iRMw^fdtH?Is8w@$zr_ihrOw=1|kJ*&{IZyL9-))3Q6(joVK zrXczae~0buf>t$6tZ)2`C%xOz>R&B3MFqpMqKDKy%!M0%lZQ#C$CAwDePsXj574}_ z0FUvbyq|U%U_E9LxNL~6`Lg~ap8r^lzOo3<#WsU<+DzKNCW&M#jw2QxKdEQSSqMGN z@nFh0w4eC^rVn04i!pb>&`^QP94E$kjp7TN(V4ij*p$n=l*hK;55wT>Dk2#>4F1`A z;1X9s78Mh&-a`ta7Y5Li-^<{}*43Qs>f5+;cm+sw@xhU|JWN1t5)m$+%@yv5pwpi| zM&-$!SU86_c-}3*D{Gt3`amg8@VrVJq(qnphZf_q#t2;Bu1-mM3)%8z40p6R2|dpJ zB_ag|I2f0Pve(0nKRUPxyzc6;9_#!dK4%K#2@l{@18pc;9f{u7HTcDU3w@BqEA6%~ z!&qlC=)C8Q>01Zr%OF>J&@2#s7b?-h-)$twZYh}PTEpMJG7vi;&fOZ>h(22^amwh? zjN!#7Y;XLF2X+Yaa25&plmEZ^I`^oYvNw)bMkR?PT{VPK3YALr?q~O=s4#MwFi2&@ zs~b|0Zn_|e?kQ4;(q&0`HR|2ZF@!QGshE+;7%db^MU3z}?<|J-{V{)>fA-pYJ^QS6 z_GO*V_j$exQ9tN9ZYPy6{6Qc3@oeLbEHADz2dw3-24z$afq!Bdew(wDTr8Z1CsRHW z%UVsrca?RL+R^fY)TjYwzy2Hc)7ZTd|GU+Y@TLdrWvn2@N1vPDIiH2zHYbs4ONnQn zB^qlSB}V=(V4-J(SG@DdxXl(2SbA3w#ox89wzf-NKZ+o~My12?iM)Z@?x^R?jum|xtR~)P#$I>GxhPBp^)Ja zrAUc$vf@pq6BiTR3=b^y@xyoLo-#9|>6kZmAM;4L%o_CrYo;qmpg7T)8<&)Wfqt8z zQ$GfthKzw8OM47*;6;49bg;;y8Z~p8p=aC+bojoMFLGzVTXj}KmTwh!oq2!{{rZUG zj)`1cM>ISA7enjdeoV^CV5G8$#Qix|a(2pUoZeSTToz5{zFmERIUO7eraUL{U+)Ok zhmJ~y^2zgsCKqwn$27^Bwu4~OGK{J$x&-6vml*naOfJy!Hz|>tU2~q2z(L%HR5cdcD000G?|WdbNS50q^0ce^(Ewn zf(gpBrb9=0IwS|Fu|}(GHtDxc(rf8XT{dasHwmijNP!_XVHTE2($LTH7j~zT7uXJW zg6P2`Y;l(n46Jpr`$4=JZcNt2#sq6T*4vY3 zLm=l^FWkv>;`ZL+#T2*|uWD|C_@*Wnnyx`Lc#y6A-VEe=ufYCQhGdH&UwFe!21hAi2Ss@D$)rl-b$hi?qV*(}9vWERZml!45VO?IgVJ>k`}NIVxXh|AnnxQB0! z;o;1iT>ZRG_(SG5qOYz43!QuCs|P`m)eU8*3`a>HToA26$qjoAG* zo!zw|@IwCc$037>!HzrNQpZ=cG1#P?CCI zo}0Ke5l6n8iZX#?IG=lc*cj2upiKF1?DGi|eBsnmNZ{qcU$Fgd6Mu6{ScN9SLQzyLTYDz_+Q^>%aQ{*DIn|HPEC9|TwmH61!LSKa$-v4+I6^6ZJg$qx^ zo@u4Tn^!{Bi%mdgi#>P+WD{LJ#y^4o0|Bdl-S7YDuXLhQ-gR)%kvzOhi{p|kUvS3F zncRxP8ZKV6fy*(A_PciO7oHy(>+luG`I=cuLrbzY(YOU7>X|W*8a6MX{UJ^C z!-4tqwZ}U8(_{WsD`V-<`vO{c*P7nDF^5Ja&!9wFwVBtedg}b`F7>6y7aAz-Bc0)A z8dz)_i(%c|%ULpp*-W#_^XlUD4vz;qui+DyE^ zOJvvNbI7ebX>65NqTtusbNGnz0=gtS435pkSQ{7gP3G;h2W&Y-`&rmmAA>q^Y7(84 zMyznmfSq5`lR9N})G>jd^ zCu9lDvHrx5VEglWu+6rC=Qsk@o~?mm5kQINY#fzq0CKz5;%ZJ0w`11 zyBbezsKw|*Nks7Q5W6kE7QE{Vc?&f?ntWzAi$1OaA!5F?#=`k%`f7t@#;s`*FVn|0 z;~gAf$M#}))$%9FdY{Kg9Y8gImfsAB7WA#+3y?I7$B!Krf{&`h(XWHO>vuPCWlKD7jeC?G znUyRNDWAZNL=(FQoN;4yIlh{z%=U+BLF*5Dh$$Gs@RCU=%O==0Zk`9h24|qS_83dC z)&}=;ny```XAx-{Fu_-i>7JcRDpiJHtPi43sV%p2QXf0|Vt{Rti~{3qUSRuSIv#sb zz>@arV#R(>W>hSP%?=7QwkZ;83)D#nZ+U0ntc0h$<>>CtN93BfKk@6nN=)2WV8n7& zeDC-YikcDc%q}5KnlDLnxgpcM9Kc36oB~C|AP|*hpz~SD`6BO`xWMHEi{uTg?z*Ys z$#u_IX>$uvG_7O0JG#jC6LQJ>WqD+-k}u9GsUZ93Gq&;hL`*hT#S4cXk&h1z*m&1{ zXkAnf1^IR)Ol`5G===mysppI3FZusUBbBj6K?OoQdqH8vFuMJz7|PBaBQ+K&&@R^w zJNC?k;hz`bmy=4m1YJ9BlR<+>$Xu5VYu#IjR!2VDv{DA62Dd=JtU5?VM1QYcvuXcv z&ZvFq^?8%`U*{Dd-N2+lJP%o+-BelTqUgkl)_njStvIfIODC>2jB9i4Z*mdr}>A{ht6VQG6AkuTZGTOK45`-CtOTodGtb-T|)w literal 0 HcmV?d00001 diff --git a/scheduler.cpp b/scheduler.cpp index aaa69ea..6b36bf2 100644 --- a/scheduler.cpp +++ b/scheduler.cpp @@ -15,6 +15,7 @@ #include "strategy/speed.hpp" #include "debug/draw.hpp" #include "debug/config.hpp" +#include "model/model.hpp" #include #include @@ -37,7 +38,6 @@ static PID g_pid_speed_r(0.6f, 0.2f, 0.0f, 0.0f, PID_INCREMENTAL, 100.0 static float g_vision_yaw = 0.0f; static float g_speed_l = 0.0f; static float g_speed_r = 0.0f; -static float g_base_speed = 20.0f; static float g_user_speed = 11.0f; static std::atomic g_sched_running{false}; @@ -45,34 +45,58 @@ std::atomic g_print_flag{0}; static int g_timer_fd = -1; static int g_epoll_fd = -1; static std::thread g_sched_thread; -static std::mutex g_vision_mutex; +static std::thread g_model_thread; +static FrameBuffer* g_fb_ptr = nullptr; + static int g_tick = 0; static int g_frame_cnt = 0; static int g_bad_frame = 0; static int g_empty_cnt = 0; -static FrameBuffer* g_fb_ptr = nullptr; // ========================================================= -// 5ms 回调 +// 帧率控制 // ========================================================= +static int g_vision_fps = 60; +static int g_model_fps = 20; +static float g_vision_acc = 0; // 累计 ms +// ========================================================= +// 模型异步 — 双缓冲检测结果 +// ========================================================= +static constexpr int MAX_DET = 16; +struct DetResult { + int count = 0; + DetectBox boxes[MAX_DET]; + int frame_id = 0; +}; +static DetResult g_det[2]; +static std::atomic g_det_idx{0}; // 当前写入索引 +static std::atomic g_det_new{false}; +static std::atomic g_model_frame{0}; + +static int model_interval_ms() { return g_model_fps > 0 ? 1000 / g_model_fps : 50; } +static int vision_interval_ms() { return g_vision_fps > 0 ? 1000 / g_vision_fps : 17; } + +// ========================================================= +// 5ms 回调 — 传感器 +// ========================================================= static void sched_5ms(float dt) { if (g_enc_l) g_enc_l->update(); if (g_enc_r) g_enc_r->update(); g_imu.update(dt); - g_speed_l = g_enc_l ? g_enc_l->getRPS() : 0; g_speed_r = g_enc_r ? g_enc_r->getRPS() : 0; } -static void sched_10ms(float dt) +// ========================================================= +// 视觉回调 — 按 vision_fps 节流 +// ========================================================= +static void sched_vision() { - // 1. 视觉处理 cv::Mat bgr = camera_capture(); if (!bgr.empty()) { - std::lock_guard lock(g_vision_mutex); preprocess_run(bgr); SearchResult sr; @@ -86,14 +110,10 @@ static void sched_10ms(float dt) info.base_speed = calc_base_speed(info); info.curvature = info.deviation; - // 十字路口锁定直行 if (element_is_cross()) info.deviation = 0.0f; g_vision_yaw = info.deviation; - g_base_speed = info.base_speed; - info.line_valid = (sr.lines.left_valid + sr.lines.right_valid) >= 1; - bool line_ok = (sr.lines.left_valid || sr.lines.right_valid); if (!line_ok) ++g_bad_frame; @@ -124,23 +144,37 @@ static void sched_10ms(float dt) cv::Point((int)(sr.lines.mid[y] * sx), dy), cv::Scalar(255,255,0), 5); } - // 帧计数闪烁点 — 验证屏幕在刷新 + // 帧计数闪烁点 static int blink = 0; blink = (blink + 1) % 20; cv::circle(disp, cv::Point(10, fh - 10), 5, blink < 10 ? cv::Scalar(255,255,255) : cv::Scalar(0,0,0), -1); + // 绘制模型检测框 + int di = g_det_idx.load(); + const DetResult& dr = g_det[di]; + for (int i = 0; i < dr.count; ++i) + { + int x1 = (int)((dr.boxes[i].cx - dr.boxes[i].w/2) * sx); + int y1 = (int)((dr.boxes[i].cy - dr.boxes[i].h/2) * sy); + int x2 = (int)((dr.boxes[i].cx + dr.boxes[i].w/2) * sx); + int y2 = (int)((dr.boxes[i].cy + dr.boxes[i].h/2) * sy); + cv::Scalar color = (dr.boxes[i].cls == 0) ? cv::Scalar(0,0,255) : + (dr.boxes[i].cls == 1) ? cv::Scalar(0,255,255) : + cv::Scalar(255,0,255); + cv::rectangle(disp, cv::Point(x1,y1), cv::Point(x2,y2), color, 2); + } + g_fb_ptr->write(disp.data, g_fb_ptr->width(), g_fb_ptr->height()); } - // 截帧到文件 + // 截帧 if (read_config_flag(CFG_SAVE_IMG, false)) { static int save_cnt = 0; - char fname[64]; - snprintf(fname, sizeof(fname), "./capture_%04d.jpg", save_cnt++); - cv::imwrite(fname, bgr); - printf("[SAVE] %s (%dx%d)\n", fname, bgr.cols, bgr.rows); + char fn[64]; + snprintf(fn, sizeof(fn), "./capture_%04d.jpg", save_cnt++); + cv::imwrite(fn, bgr); } ++g_frame_cnt; @@ -149,30 +183,39 @@ static void sched_10ms(float dt) { ++g_empty_cnt; } - - // 2. 舵机转向 - servo_set_angle(g_vision_yaw); - - // 3. 差速辅助 - float steer = g_vision_yaw; - float curve_factor = (std::abs(g_vision_yaw) < 0.1f) ? 1.0f : 0.8f; - float base_spd = g_user_speed * curve_factor; - float diff = steer * 0.15f * g_user_speed; - float pwm_l = base_spd + diff; - float pwm_r = base_spd - diff; - - motor_set_pwm(MOTOR_LEFT, pwm_l); - motor_set_pwm(MOTOR_RIGHT, pwm_r); } +// ========================================================= +// 持续控制 — 每 tick 都跑 (舵机 + 差速) +// ========================================================= +static void sched_control() +{ + servo_set_angle(g_vision_yaw); + + float steer = g_vision_yaw; + float curve_factor = (std::abs(steer) < 0.1f) ? 1.0f : 0.8f; + float base_spd = g_user_speed * curve_factor; + float diff = steer * 0.15f * g_user_speed; + motor_set_pwm(MOTOR_LEFT, base_spd + diff); + motor_set_pwm(MOTOR_RIGHT, base_spd - diff); +} + +// ========================================================= +// 1 秒回调 — 热读参数 + 统计 +// ========================================================= static void sched_1s() { g_print_flag.store(1); - printf("[FPS] 视觉: %d 丢线: %d 空帧: %d\n", - g_frame_cnt, g_bad_frame, g_empty_cnt); - g_frame_cnt = 0; - g_bad_frame = 0; - g_empty_cnt = 0; + + // 帧率配置 + double vfps = read_config_double(CFG_VISION_FPS, 60.0); + double mfps = read_config_double(CFG_MODEL_FPS, 20.0); + g_vision_fps = std::max(1, std::min(100, (int)vfps)); + g_model_fps = std::max(1, std::min(50, (int)mfps)); + + printf("[FPS] vision:%d model:%d vision_frames:%d bad_line:%d empty:%d det:%d\n", + g_vision_fps, g_model_fps, g_frame_cnt, g_bad_frame, g_empty_cnt, g_model_frame.exchange(0)); + g_frame_cnt = 0; g_bad_frame = 0; g_empty_cnt = 0; double speed_val = read_config_double(CFG_SPEED, 11.0); g_user_speed = static_cast(speed_val); @@ -197,6 +240,39 @@ static void sched_1s() } } +// ========================================================= +// 模型异步线程 +// ========================================================= +static void model_thread_loop() +{ + printf("[MODEL] 线程启动, 目标 %d FPS\n", g_model_fps); + + while (g_sched_running.load()) + { + int interval = model_interval_ms(); + std::this_thread::sleep_for(std::chrono::milliseconds(interval)); + + if (!model_ready()) continue; + + cv::Mat bgr = camera_capture(); + if (bgr.empty()) continue; + + int wi = 1 - g_det_idx.load(); // 写到对侧缓冲区 + DetResult& dr = g_det[wi]; + + dr.count = model_detect(bgr.data, bgr.cols, bgr.rows, + dr.boxes, MAX_DET, 0.7f); + dr.frame_id++; + g_det_idx.store(wi); + g_det_new.store(true); + g_model_frame.fetch_add(1); + } + printf("[MODEL] 线程退出\n"); +} + +// ========================================================= +// 主调度循环 +// ========================================================= static void scheduler_loop() { epoll_event ev; @@ -214,7 +290,17 @@ static void scheduler_loop() sched_5ms(dt); - if (g_tick % 2 == 0) sched_10ms(dt); + // 视觉按 FPS 节流 + g_vision_acc += 5.0f; + float vis_interval = (float)vision_interval_ms(); + if (g_vision_acc >= vis_interval) + { + sched_vision(); + g_vision_acc -= vis_interval; + } + + // 持续控制 (每 tick) + sched_control(); if (g_tick % 200 == 0) sched_1s(); @@ -226,7 +312,6 @@ static void scheduler_loop() // ========================================================= // 初始化 // ========================================================= - bool scheduler_init(FrameBuffer* fb) { g_fb_ptr = fb; @@ -245,12 +330,19 @@ bool scheduler_init(FrameBuffer* fb) element_init(); speed_strategy_reset(); + // 模型初始化 + if (model_init("./model/nanodet.bin")) + printf("[SCHED] 模型已加载\n"); + else + printf("[SCHED] 模型加载失败, 继续无模型运行\n"); + + // timerfd 5ms g_timer_fd = timerfd_create(CLOCK_MONOTONIC, 0); if (g_timer_fd < 0) { printf("[SCHED] timerfd create failed\n"); return false; } itimerspec its; its.it_interval.tv_sec = 0; - its.it_interval.tv_nsec = 5 * 1000 * 1000; // 5ms + its.it_interval.tv_nsec = 5 * 1000 * 1000; its.it_value = its.it_interval; timerfd_settime(g_timer_fd, 0, &its, nullptr); @@ -268,12 +360,16 @@ void scheduler_start() { g_sched_running.store(true); g_sched_thread = std::thread(scheduler_loop); - printf("[SCHED] 调度器启动\n"); + g_model_thread = std::thread(model_thread_loop); + printf("[SCHED] 调度器启动 (vision=%dFPS model=%dFPS)\n", g_vision_fps, g_model_fps); } void scheduler_stop() { g_sched_running.store(false); + + if (g_model_thread.joinable()) + g_model_thread.join(); if (g_sched_thread.joinable()) g_sched_thread.join(); @@ -283,6 +379,7 @@ void scheduler_stop() if (g_enc_l) { delete g_enc_l; g_enc_l = nullptr; } if (g_enc_r) { delete g_enc_r; g_enc_r = nullptr; } + model_deinit(); close(g_timer_fd); close(g_epoll_fd); printf("[SCHED] 调度器停止\n"); diff --git a/types.hpp b/types.hpp index 8f5d947..1e228d8 100644 --- a/types.hpp +++ b/types.hpp @@ -107,6 +107,8 @@ constexpr const char* CFG_MOTOR_KI = "./mortor_ki";// 电机 PID 积分系数 constexpr const char* CFG_MOTOR_KD = "./mortor_kd";// 电机 PID 微分系数 constexpr const char* CFG_DEADBAND = "./deadband"; // 舵机死区 (归一化偏差阈值) constexpr const char* CFG_STEER_GAIN= "./steer_gain";// 舵机增益 (放大系数) +constexpr const char* CFG_VISION_FPS= "./vision_fps";// 视觉帧率 (默认 60) +constexpr const char* CFG_MODEL_FPS = "./model_fps"; // 模型帧率 (默认 20) // ========================================================= // 赛道场景枚举 — 按危险程度从低到高排列