From ce228fd195476eed367c1717fb7725e55c0f3477 Mon Sep 17 00:00:00 2001 From: NellowTCS Date: Tue, 3 Nov 2026 23:13:40 -0700 Subject: [PATCH 1/3] Initial port to ELF app --- .gitignore | 1 + Justfile | 27 -- Makefile | 34 +++ PocketMuse.tar | Bin 1177600 -> 0 bytes README.md | 29 +- app.properties | 4 + assets/icon.png | Bin 0 -> 127 bytes include/albumart.h | 16 +- include/config.h | 1 - include/globals.h | 1 - include/library.h | 25 +- include/metacache.h | 25 +- include/muse.h | 39 ++- include/paths.h | 13 + include/playlist.h | 66 ++--- include/ui_helpers.h | 14 + include/ui_player.h | 27 ++ lib/PocketMage | 1 - partitions_OTA_APP.csv | 1 - platformio.ini | 50 ---- scripts/build_firmware.py | 28 -- scripts/package_ota.py | 41 --- src/UTILS.cpp | 1 - src/albumart.cpp | 558 ++++++++------------------------------ src/globals.cpp | 1 - src/library.cpp | 141 +++++++--- src/main.cpp | 489 ++++++++------------------------- src/metacache.cpp | 368 +++++++++++++------------ src/muse.cpp | 9 +- src/playlist.cpp | 524 +++++++++++++++++------------------ src/ui/ui_browser.cpp | 72 ++--- src/ui/ui_helpers.cpp | 152 +++++------ src/ui/ui_nowplaying.cpp | 94 +++---- src/ui/ui_playlist.cpp | 64 +++-- src/ui_player.cpp | 282 ++++++++++--------- tools/make_icon.py | 50 ++++ 36 files changed, 1351 insertions(+), 1897 deletions(-) delete mode 100644 Justfile create mode 100644 Makefile delete mode 100644 PocketMuse.tar create mode 100644 app.properties create mode 100644 assets/icon.png delete mode 120000 include/config.h delete mode 120000 include/globals.h create mode 100644 include/paths.h create mode 100644 include/ui_helpers.h create mode 100644 include/ui_player.h delete mode 120000 lib/PocketMage delete mode 120000 partitions_OTA_APP.csv delete mode 100644 platformio.ini delete mode 100755 scripts/build_firmware.py delete mode 100755 scripts/package_ota.py delete mode 120000 src/UTILS.cpp delete mode 120000 src/globals.cpp create mode 100644 tools/make_icon.py diff --git a/.gitignore b/.gitignore index 88d1ed0a..eebaae11 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ sdkconfig sdkconfig.old .DS_Store compile_commands.json +build/ diff --git a/Justfile b/Justfile deleted file mode 100644 index 80290f37..00000000 --- a/Justfile +++ /dev/null @@ -1,27 +0,0 @@ -env := "OTA_APP" - -# Build PlatformIO firmware -build-firmware: - python3 scripts/build_firmware.py {{env}} - -# Firmware binary path -_bin := ".pio/build/" + env + "/firmware.bin" - -# Build + upload via USB -upload: - pio run -e {{env}} -t upload - -# Build + upload + monitor -monitor: - pio run -e {{env}} -t upload -t monitor - -# Package firmware.bin into PocketMuse.tar -package: - python3 scripts/package_ota.py {{env}} - -# Clean build artifacts -clean: - rm -rf .pio - -# Full build: firmware -> OTA tarball -build: build-firmware package diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..3109d932 --- /dev/null +++ b/Makefile @@ -0,0 +1,34 @@ +# PocketMage app build recipe for PocketMuse. +# +# Point at the SDK checkout first: +# export PM_SDK_ROOT=/path/to/PocketMage_SDK +# or pass it per-invocation: +# make SDK_ROOT=/path/to/PocketMage_SDK + +SDK_ROOT ?= $(PM_SDK_ROOT) +APP_NAME ?= $(notdir $(CURDIR)) + +# The pack target ships $(APP_NAME)_ICON.bin; regenerate it from the PNG +# asset whenever the name or the artwork changes. Plain `make` (the ELF only) +# needs no Pillow; `make pack` does. +$(APP_NAME)_ICON.bin: assets/icon.png tools/make_icon.py + python3 tools/make_icon.py assets/icon.png $@ + +APP_SRCS := \ + src/main.cpp \ + src/muse.cpp \ + src/library.cpp \ + src/playlist.cpp \ + src/metacache.cpp \ + src/albumart.cpp \ + src/ui_player.cpp \ + src/ui/ui_browser.cpp \ + src/ui/ui_nowplaying.cpp \ + src/ui/ui_playlist.cpp \ + src/ui/ui_helpers.cpp + +APP_CPPFLAGS += -Iinclude + +include $(SDK_ROOT)/tools/app.mk + +icon: $(APP_NAME)_ICON.bin diff --git a/PocketMuse.tar b/PocketMuse.tar deleted file mode 100644 index 9a65d48b4db16cb9eed2f10c8f50bfdcbb5936d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1177600 zcmeEv2V4`$_xMtzh#(>;3hF9FigZMbw1grkNJ$Vx5dsMi2}w*s6#)f%@93#u*Hf{g zD2Rw%ELZ^xpl89eV8MDS|2Mk{Bv|ge`+oob-~aQwJRiF|JM-qvoA=(lncW@ZIKre< zrjTtN!{K57rJpVQoE#l7IM@vtY$toPb#xf)=wNG$*$uWIY;W)6IM~h!v$b=8e;982 zU*boOY_dqq6yi80Oy=>}Lb+RV7k_qNF7y9C7mrmG1J8(ucsvJ|)e+mRt>~`;j;Xmg z$E#!Zj0@XQg7n8039LA*I0~NPXzge{1b1*|vtyX{b`DH32UEyO=J5DdTuzKtOfrYd z>L61)dkXv;>>#BVfP_C7x3{%-B$7z7RxFNCoG#5Hdo1*vlJsCh_t+Z=hKya?w_AIb zpB|N!aYfi;hV|LT-(FYA=KW8ci-fT@p$tENx^=8TfDvcdSQDq@$g$p$V@*U9ljKO; zL}X@8!Qm7CJm?w08(CknWAq$Iuzx0a2d*fu18Vx^G}u z)EIAS2u7!l_Kpe)4D$}bsQ&(tIw~-V?uD^g95Gbk!{M?q-@pLxsK8NCw7@_H=0l}3 zqC&iVLcHm|SfIbRR}?M8Z@4dGlsBDDUI$RaqkMwsSU@PlJBk(>5dowF8B{y;#~%H0 zKz|%D&t#zxq(K!3=wharjRo>z_@FCn7Fa&TaVW*k4x_ULxE-MiP8fzP(IzQb#EG@B zh65Y*rR=p$EHgHN9mN!ittSZLF)S7CQ-l0GQ9f-zwSR#BiSmesbrfcuByhm21A-hR z%ws|}lSNAxvqe~{kOOjHCbKwvn^b0sKHkA5X{P z{F$Cuh@X!SHkK$IiL=)iEGm`NbLKf2ExD}2u|2+GsAa5)Z$G*u4ArdPwpARe`W~fNO4C2z0 zFJu#!WFn1;w9Avvwj85BVE82fqYCv zxQLk~;IgBHASFZ@x4~l*m@po3MUu-Hj#v~WU<;$joJ93>E;EIViG|5*ERM+q6Zwbo zfHv9ydh&U3oOo|~kb^xiCrq;ur{PJUUQnk96Yz!NC?21vpCgJ&Vv59UA#sOf43{L<_R8J|*QG7AZ=JAu`6YwN<5?`23 z7`fE6f4Zs;)+*6XFCmCRDAmrNWxpfMKoA8XT`)YH8As}})G7Te@vr3V$rq$U1*7;l zKUpkD7ULqqg@C(` z8DR!n$d6(rF{4O3`e_EeIHE)w6jk{1`2yhTXC+FMC)z;gCktcQKtjYu-nz{OS;$B{ zVaSMK#wOBb?m@66#sxxt3J1j)KU=Y^WCN19VveMX$le4~0x=7v{Wu7Z1z!!-0V_DV z6AOQl5B*2g%CLZ(0@RGE;Gl6L2?8l-6qufbEy4n2JNReY+in*$!h@n=2}LSYp^%x5 z1|(7^{yy0dHaR}X`Zl_lEubUMjGM&C7>UF>$oL3n3xz0BVBskuq?Lc410N;}2~j$( zy4qq=#bi(@ZBZGji77@kiP&t2mRKYk9pnJ9ofU+47$%varYc}F!xb>>BZlRaVwl$s z$S@hhDk3p#z-UNw!>~rk-OUoiJo;hS0YkX|7k)qy`*CCdI?)#Vftc8Y{kJJ5VZ)%5 zlAwVIFUV1j&{mlDA~pK^B9-wjAXyk)WYrN16Y^o~@|OgL_-M9J1VI+Y;ZZPfhZGD{ zN?t1{7>9*pTxL3$76zsp2aW^B;)LvpxU}2g62ed(TO|5vwq@*z91W>n3_7rFh5PYR zm|UnDB@ls0JQ;?F(s{8RZiA|da5LL9lQeUJG5EtwVn=b=ym;}?yEj>uP{_>|1~G*q zwh$xjiF3d&1yrm42T>O`XefNyca#vGjt41u4!1;q{t0=Q$EJfR+KeWe*%s~m!!b69aP7dNklhwzg13(2Tg!w8XpzSDpUgc8 z*+`~YZJZOeNY#j}f=KG1LF64^4+Rxy&I;3q_C*sErXU)yOo^ry#0m=Pbt0;iIEGN3 zbXp`#ixQ_rNtPT~7&;-M`L?;X?1BNz!KDGC>}(trLiOYAED=?+i0NY#hX;(pa0H{d z6|yA66$+GK!jFZD5dUcH8p3TJ?ggu01Z8rXPYMY{Px*U`HlF-sE{kXmDFxsU<`*zR zB1<656jnz-H0Ulkbh4M>77V9I`9-*eq+S#`<1Vf+SfmAc2B0f5^Y8S&bP7(chsn`(=e@kLC;3#DLa36=|C|D_E zA?<)+R?J~?QN)6QQ-+X>a98AX2rWxVmg!JWAph2u@K4%>=6f(8qRQB40aY6Hb+9?4 zEp73Olo2Aaqv!0nawzMa+NX`M90XA&PlS9t&Jp3GLjC<=0a!#XT1XQ{!El_y=BDFq z=19Ro0g0&C)-l|C5bo#g?H%RgA4r996+&e)k?Kzkler8CmAytW2O36EPzJ)5%&$dY zyzwZkfxZAUg>^qP!2APGY_+dAGFf_cOgIb4abkaj{6;^>y-HU%fS zB$g~?M1^EvD{%+1r9dsrOho3Gq;jM&gxdp+N#elRMvQX_VzB`DpO_3T5&A?Va|>mP zVnIlT*2jr^j0Co{(J=H&9YhR}LgPBYDp2STHX6l`iy{}-&{#lDo{6DY8s4(gVj-dv z;bI^Ou7Q)3oFo+tND-Al%dg;Ih;R%~<%ko2EY8FSqCj~dxankGB1oGV1Evp-5RK?k z+DROdh%J)lgm{ezqQOUkff0HqlNSt!@T25%KS4!itZK`RDwRy1AdQG0K+Z4Z>{`i=dLVP+%1-3o%UUi2MlCt`aD+f$n949gxz7zy%hn;h_o4 zR$)yUCx&KpBAKzGQ#5BqM~P9AN$nFwxNfssG9H3<#-Wug(lF7LWEDa>J&{l%22Iqj zgkaHbFahP3eJ7a@Pje*&+jG07@P#q3U_;gq z=@?oi=i3AX*)t@G0-?xS#9>LUk{p?mGnOb$at4;-AUQ>6k~b01lX~e>X$Y!uVrD2E z2iYuF6K*nkoR!Svy0$%umgWazCi(>)5R#8e$j8^P4q?Lb&48&q#SVEzVyrcXC)n+w zG?9c8%|TOPFtV?1!cq(q4K@axm!K2Z9emq)@_E?h5h}GK(VKI-pS6d1AOQ+~ls!AdneEYN|9h zmFzse(9|3si{deyfxDtd%Plgs|q^RuiDDZuBC3;ap` z4zpkir9;AhOAfN*4Ta*Fz>ZA>5&SnKF8ge>P3Fj-L}Fj70TpSTRBd_eG%@PfZ>fS@ zM(|QnFDre{Yeuxi%)(q=;ibbbdas6DLWRe%U_BOt!1Tp1F_r5~So1>}$!Eqe?`&6K zQmrlIvlBd#)+A+vLP3onb4!{cv6k<&y<>5yF?=VxR8(X(!f_Dl|BbHvR)j{F5?Pi3 zB9OG|yT50FxJHQxB#uvd1N>i{h(bY^ z-%{LfQX-tt&(V?7GXYHGzG;x8;Ls3EdUJV}zu~K;j__-X`__9G66g7qb;>dKmogC} zu{Yt1|3ss}rh=H_1T*xQL1H8A>i;#{Qo{n1`EzG4msujKZ)mJs^9auA(A&INwi)63 z!7ngODB+tLE<0`#^D|jJg%bZE*dLh%<#PT%q?ZYH8m5rMq`CAU`uT%dK-5+(GY+DJ%mYCVkDFE^} zZNbcs$^7%~`N1$QZRywjB-_q5JOAzgD63L|k{8lCmik(U2`|wm2H6RV{LoM2LvhEq z1|Ip+bO8){nfQY;FqWFYzQ5;&&QIjxc|f)>k71vDik^AnZkUB>dL! z^c4a5)tWeB6%Q7!h&REI!}#tT;Om${IzD`@E*-g)biRx^cbM}0T(!^-qzKH&!w=^! z-{Knxka}qrgjSpXPI(Cfa=Jxm=3ijxTlN7DIN(JVPFy-c#FKb{`W?NelkXt|*RU2M z=EUM(t6GQ22Ze&3`$=P2Gq_8<^?-~B=7gxY#gDrFD{6m>*`MxXNf&)BV)6#+wXf7$ zCUE$>GfScakZ2@wwt%4pJsJ2$nA>sW{)WGSETo$uUSlR^C*%~R&D6d&pPwfCqt5F{ zOcGvx*Ulk7sltENM}3zPAxNqJ|A)TwTPE`lNfPWy=Usn^)_2XV!`eUxbBlu8Kd`s2 z`~NF)694%FmHEm)rStlifeC0I6Yr%M!lL-?#hpZ!Qc#uSfm|mK5ZT z>|4u(e{b|?6YPJEd2@SnEAz3}?KD0&IbE{R$PD8K5(uKOhUxa6Cp6!!ZYN zAz&e337`j*F$U}c_yTx74{6r`Zv#FBOke27wH1A#LVq=${hkKRAwqw2g2)54Zzx zKj8gwARnl=p?vI-MS1fl5MgDew_i$0AF0dXeR)J;GEEz8;Uf2 zIL85{JT8Pj-H-Yf$}bGUXx}TJ2KNkQ%6mL-z3vVj`!PToOuPKeNV<*pzRFU!i7En zJP)+40iw1)h2zh*xudVb!A7G25x;|)!CwQ-g<$L7NBmyslih~F;P zz@Hp%=i7NYsXHE!_9NYCd;>Cm+b-wxaQ;;0+85}AOLP#)W+u=>$9y=tfQ=Wzv8`_) zJqWJ3fC~ZhCt|cuKhoP1Dzq}-ANhhj(EUazqYY^la747L;n)biUHJ?~GlTSwv|qq| z9MYwAyoYP4?>{4{R}JphO6tgmI+`GlKBS$2Bl7*VaC{GS=tCXOkiHeJcLSCHo{-S6 zg>-2fZ-Z~`0{x2oUp45cE$A%re`a9E$p1A?CH>!ApzW0f{mF+uhw`kYFqT3+Qs1-@ z^6LZ2`auEQm+~*IucKaldI381vc12&z|M96-Y$o95!5*vqv2`LXJA(qkoFXOdLbOm zAblpJDZ@Aw4!97`^8r_bzb^#-!#}|huJ;3$0ZQxF1zj*k2sHMi@dVKU`cHv|GNkFl z(HD+8Al(qk*}^porNMa+AOq;<0R55{paIv;fF6KS`bfWSgRGDo-e1OOz96e0z!y_6 zLI)gEV9bK{U&g2G zfP1ojyX@V!{q{mAw;FIR*y9dBsSnYA|JVGutgW#?w_X4(wUZzhI3jz%;JgC#v=*=l z(xkG`hV(zPHGz@>Z6Tnn+@*GHd>o@C01W})8PFkAmj|40g#6b4o#9+s*Fvz1pou@0 z`L&avAAoZay%V5YtHICi0b7A#h1(lM0S6cx63-_Mh`F7uJg?sw}rG1xw8|Xq@CGEr7`XBeYa(1vqkI64C+0D1uW0tNww17-r|0Y(GP1(eb-1O2hhB5kA#@V^x9 zNqt@+oZp5tX|T{s{rbAJcuH^lP!fYLH%z@M)S&)Rw5 zHz7arb7w#w)FA#h2HGBQMD|vj2r(eo^$x%U$R}%W$hHNLChhZY#mlHYnG)WrA#Wof z;;n2a#9P1@SB5tM@U>8eH{^HTLw>|tIPl>Je0c%tg1#W$3L(uF_zD7i0r@)eR(-0S zH{EZHVX}Vhd%mU#{EWWx&-=xYUxBS>EzVQ!3r9ZLIj z2b8V&2j#^O3oHdh_5V+f^Ne8}c7|~n^|2?HDT1x+@DSJy5`7hb-g$=27vN<&40ce8 z7(I~*-#o&5gT!YKTr3DaRZ0|L@K!62B^JW|OPF`EkZ;9c$0qRj7&R$| z0~=Cc456gf(eQ}^7aPIM$guQ*Zw%oE!J&kCxa9{gBMM=203LjrjZtIa>yzQ|%^XP| z_vCT}*l@l`z~;i&q8#|lM20o8<#YiPS{#5jvn0Mzl_Ll{a|+}W2x)nX6L_3hAS_OR zgBMenh(5)^$TnC3M@SMJAu!~P_ML()Z6F(vvhv|`$@a2HIm6dbNr+V>OP;hRlGvC-76n$*>a+k|Vr1Da8EwRz4gg?ih*q@E{~+BuE@d9jfC(4~DRz z6<7e;SrhUhA>gLKFMQzO3;S`BoTJ8B5%NJS5#Qtz?WL!pFG79b>n+>|2*7SWG z2J?qpJfNJyfseH?Pd03r1@0QY z>~JBUkE9O`7Qz8BGy*!_lbalaG2pXGKH4lKhKV6@ap5C!C`D`t3t!g2mYN|6>Ea}4 z4d@9M^AWP)+u(HQcdumVYSdX|PbdlvOj|}lheK=N z4K@O?L{I056VQnlCm!q<8~}Xz!H>s+yaF%=AUq(5qBFdrd;&uP zs0`xLpH7p#43NJJ^7Zrg3!=;BAhxcJ8WBoo`1$z3UbeEdynPtoz5}0;W1*wGynXye zK@qgE3>FeDJu)O`7k1x(Dtr?`hZ4&7JyEG zu7Ey(BLRZ}!vNy|qXCluGXV1dX8|q&Tm!fna1US^UePyjd?Fc)wpU^mM~YqU?C^fzF1MI_oo&T9wkE(iO{!PG?V zhbbs3DR)v)RqNbEOIt^`^{Z>;wtGGF4RN`$|A~vQ>g&kQpVW`FF|P~knYCil{KTa# zT&s1_M(4(6gKQn0TNiRX-T%uLN{PAK$}d%mT6r0&K$mR zl(Ykf{mo!&@AeX~rvr;6n-@Nyl;p+yZ9*tKW(rOZ@}wYc@E{88os9cXfM48;0z)$H zPJs=c1wYQ|PvOEwpVF-8n{8Wr7Ut%LW0{#aW+H;Gx#5dTIF2=8MPj2VCJrnU6BvVt zP0Z2$9%v|m&u`I~3xNU7~!?0XDpWw!-je-FiNfV+3b3&|;UBE;mCTs%+TbGlcgP}yogn6dJw!@My zig7dO4IAhin;X!$XwwkMW^Aw* z7OI2jRvH>sp^-5{ek$z$M+A4Ug9m(hDuPWAVD}ntx+m~N#k|vC>oLd}NJqY*e7u^= zS-=LsM}RTWnl7KhcEqVBQ`j++6C0NtdbLfsdHq{PC;M#7h5e1QN?Wn>BGz%Fc?gqnmRFo_(QWH*r8 zAD}Hsq%EXTBxh1(0X?M(#Yp$D5IZb{iqYecg1`s9NF`C-urGugh3HzFaW<3`_{g-K zNDyc(*oTxD>S1(^zOu(jWs@eM&w0^@$my7gJU@aC9t;MXahP6n*7QiyVTEN?I52ZIEz`|V-zCdM-!N=)n4#hL?D2+}zKcHA`snzhR!rX* zo!xrWYU@i;(K0npH#haj?$k*Y{+PH&xIA)+$aXU{R8uoFbj#KqkUc;*Dhi8=Qc=%V z$j0JkEt?RHeoNQ4u3xIAoTaR$jc4K7YHAj!goT<~Uv2nx=?h@%?B;B%qUENgB58XR z9902yvjL1PvMqFsx~s8bocu=PL71AV5{4NLpu+!HFu)MAFw928+|<;t9DyyShJMhW z(HK;vtmqc(=k12kvOO@NpP!#kf2v=AgTAg#w)Q~SWof9(2tPkNYX5HPs!nj%$;Z#n zyf237LggOlztd3D9YEDZKd4AoO;KTtx{4b$a?Geqoo+gr*{FmYl}a6u4S(FwB{f@J zU0ngvf<@WDMK(swree4U)mb=Z;Oo58M zl0vqEk~`#e?}vNf{oFmAJ=|k;)pTQ(l+%=zm}C3`JTX+KB9bU*HXE4${vdz4_oSnVAyv*Q_S++BS!O+LlveXszH*Q>=maV3&oQ8Q#_5l7oT(N9z zGcOP)h$$25NXtZbQCa6t`o_lk2tT1THD91&tgP(rW$fbNfoB>5e}*m|wjM5CW9FuVo%Y<)X3DO@49tN9SW4q0ER-x^bZY9rw#yiY5hZi zXPgn5?$M=hh)`!}XlUq|p-|hHp`i>$IEHy=QZYsE$uvyCJJVw_bim{nW+rAYG8v)X zsJ)qt%+BiBe)dRy6kwcUKf>47mO`cW&!Ese;0e&0!ota}G#bs-6{O_qV%%zM?3?B1 z8E0wp$;Pr(-TW_=U$Vkw!Xe2?43P424r9vojVIBYxc66Y-(<9V+McB zO>KPxJaA`1+2D_}jrN%xhi$aY9AOLNNl0-lbO#K8KWd>Ez^@2eLjgc0tr%#1D+XGH z&RVfnZS5D@FW~YMq`iaN@UK-@w?+Aru5M55e%kP_AKdMSioJmH7$l)Ybg7N#p)=yw zN?d~W0s)k*Cx(4eZb4LfB6=<8#ycQ|e(#90p1M-HiCbfYf z-B!p#+=N6T?0tcLa0Xd{bZb}i1Eq2H`ZQw12*)f%MHLmrEP&WhKWZ%8a8dTi!u#SV zQE}y_N1Ij}TKHKQ`U@3={ECmIHEDQAW@{02E@(3Q` z<>BEqBG>~eQ&4KmfqK={5);*&bexQxRJy8n1?QoU#t3a~%+{k-K>_QhpwJiV)u*Qp z<^n&&CDzZdUta+92W@hT-h6`ZP~y?LPi!JYBt!xPNfQpUGV0zpohsr4@@3pL;@xWUvOm-Jd{a@Rwf}w znS?@R5-OBQXjCQvlY~2XClWk5kr3U9gq%(!6m}w^q7w;?ok+kW;SsJvf`)CJ%*ep%Hnu6_bbEm^_qV@=zfO zsHDd;m^@Tt@=%M(Lt|SgMxHfc^6&zahxgdO@UH~gB_Or?e~5{#;n7eM)MzA_(Ma$c zK>}w439~~;_%(!tst6LEM3B%WmV`mEBm^Xqkd#Qmd=UvnA`&i5BB6N_3EFui*yfQC zJeP!tb4ggdl!U!YNw~V2gx9M{(A`9W<0cY9cao62lZ55PBpfIvq2>q)?~ah5e~JX> zQzVSJNJ9EW5?0+H;qVO-Zq<|UM?DFKk4S)L@3=~ zd(Yl|`-=}8EID+zwCqUv(TZc0$4{I*b^6TNb5-XrT)b3$`O4L6*KgF+*4?~y`%ZmB z+1FBso$%&fnlG%{qX(+jEqf82b!5%SPrtXwz0LdcW@l+G{ku* zWtfYro4W^<<_Rx95BK#OG15O^RA5kW2%Ql+IxKul#Mp6>}3m%4}a_Am43BwpMpi>s5(5I1*Bp_7VMR|7*uWmQe>-hC{T)Vg%*)z{ooT|-B| zpV^?noxAtM2UGtSvYV9z@MQ?zKjlJ_QS0iIvyP*^}cROo)Ydbp(UeZrOU)I3; zhww@vM}WTS0Ol}kxvgsIAg0#y!@=q+d!0y9UC=T?FnCk!;|y0z(uB@>1KcIdjb5EA4Rmr18eU2_zK3g11!cjBSf_0;mb$=7c7escd#QgHFL zmebR&=8n$icCXl)$jbN-^ZDsn_UyoM3c7V%mDpIlMs?9rt^M;Mr=J?;IMqd|B zj9-8GzLLxEYsw=(Pt&}TSloHj$F0SKx%qo(H_n#c^7v4;<2P=tee$>l?@O9DZjW)j zynTmlohb#Y56%g$In#q#eYCh`e}AJB`$n%^cKA})O-D-BmMEI3&FmDlx30@6Ne672sniI0ET$9vRa9N8K#>GBt2~JFek8KQVZQ0XCVKJ|sEmPr6 z+N5A`tVL~V*om%hPSx#Z2R%Nh^Lt78oXnYrJ~i~Y6XR!fQ}1==)wyi{Yk!0@_Xb=H zE~bdFvJLlaORrHkHH@fPR_mH{;_}8nT5epO@R;NIsgCF9Gc$f?bxHJ1k(IL7gFZ?Q zQU0BOJ)5a{$7N!tpkJwq1GTj^%BSO9&YBb_gzcNg$JMXJ9V)obyr}h|etiDfI`aYf z)w}m^tvTJ(b>EmNn)|JXjXQF1C--m#o?G(lz`moay4*XUwCc(p@zCMdf8UjQWsRQc zE#=%Ew?#S{vA^XFV=Z-?kfgaaVnT+-C9V5wTGf{fEW$ePS*tqPYf0A^S2n24NO+~t z_e-S;Co(MNT~$0gXQC6g*CUlgUW&oBFO8O0XGLV()ILArPCUQi(1#DruD2tUoT4+7 zsmGh68$ui6w>Hn`*`=3reCFQhudc6TM~7t>dTZ7O@PqmfBh+RJCUk8*H%ujNoQ6WT*0t;f zoT8ZbS6dUA-j}#N((ZLGe11iO^tD~ zKTfx@R6faNdAFoap1vhw^y%f)K(*O*XZ%VlFVAjj{#aGl@>`d{;vE55MaA>2a@Srm z%%2ggQ#nH0sE&SB(2};8+RO~CDYDjmSUjYrINxx2UT&u``36(y7i4{iati7x&q_g_*joeDmF=myfDnHyP*FA7}49dGptz z$jB!JK3-<$6ZxFaf|Q~}yP?ey7Wg1_RgENPL!H-7J`HM=ILe+(Tloj+mJTFfxy?&dCbMs!8*7Vn+a^I#2lMPN%T`cOuI|Zh{@XCsL zJi{um@{}Rtmcnekr5>eP^KzSvHdod;AJsfr=_2^}!*Y&2r+4vW#k?WSk&+La04>L{FtHM~$)uT2PEmF8wFk8R>`7I97 zpUW(E-8J6%yxM)gRjy6}cdz>N?Z&=mf7hc|oBL$_k&w#1_cq<#=Af^!lh{DL&tMB3 z2}Ro(O+Iad~~$(^Owv;)z@7MtImIPnw?v!x@c7zqioMm_Li+9 z^K*xF-j+Y$?8jpDnN>yFfsxHoTHF?&3+{DEbG0hPo;ne)6^*FB9}{qo=hu1i* zP zg$rYf=3J&1FYa-&(W*nk}Y1OHVwv!&h*X zZxH$3+QR4VU8nlELe-Pmv5Y3h0QT#E2e0=kZmis95WgtT*0iv|yrk&l{SO88pDE{G z-I<@#i# z?v0EcRr9f`>%+TO&KIBmFfXsBafHtDT^dI74xAAbu9-zG&GU&gQc~qQ_demSXE#kt z%Z!#E7_YRAkyY_AJ#80D|oqP6e#a=l*-Fvf!jyTDH?V`6G*>FF1H z2Hy1>o%JzjnN`iCYli1zy3d|x6;is~aZyugzv{X|m8Y+>#_z0T59clN<=Pa|lbf7$ zDBD!kjV3UR)hyZW-R`GvS-#1)Y(bpCqKyMBW*=!Rt9rF=UiFih`p*?c%@6C2+%41n zRJ}#hJ$JTg*4{<#hm5NQ@AaxU!+ajnGEzT}Elym1Iz&lY|*UV`j@$b?D--nBfXG37prx3{XRKB=ry*_$~}d0LOaP9?$JwH6G!-1Ww^ z6`FUOL%Xm(^j4=Ysa5N2wYIbC@NpV~4W@>}&))CTH+6kK^FGmicWBrc{K9uQRU(>$K*->%Q4^Pq#(>B5mCW7d<1}FS;4?OL_#{&*<6c6X0AkXu;6=i_Z=_ z^j?GF^4!Z^BX7D}2&KY>9i-?Q-gCSYfAZ=fPRDN!R@kQRn0GYHZr}A~w!bG{wZEg# z&0*n#MB^?!vC<$7}3 z?O9oY2S#T1P}7{;Kju>AMsZI1lD@D_SD|vo=X0kf?Y1uC&hW}gs{iQBf4uM`k2}3M zaqQF735p?h34@(qbJVhT#klJw#l~&7WCkC59DS{3GyAtAEY@MA0deyxIhjx1&6~j~P$(^0L1`6@_>8 zuz2W4>oa$bXHddRM!cd!s9RZbnEH)_qvuw(>z^`PqMzNrXVY|b=CjAMowh$YGLG~6i<0i2PhYwGX)Slf zmu)Jct%J0Ce>BLb{eyO5?T6%|aqoQ}W3RJwD_@zq=Dp|^=JRqXRlQ|{W!0OH%jUhi z&>HwQIx?*;Y{=nSty!OL4*kvTR@s}0^>YgLHC*Zc=FWqWLvGi0Nvvs(+jiqXZS%D$ zd#$c3Z;YvSxLA03g5crR$lk_Rw7-l$IdJLf6Im8FPx*Q1pFTf2tnv?+WyjY~y?Sg} zQ@4t(y8@~TPA-6+I(z12H;uDmRj>1&Nz*U%zFKj~>X70^kL9}-rG83UXic+R+{^6o zlGSdTmv3jVR=oOsz_OD$jZ5F3E-SdSGi&Yg?#`>%rGH#w%rDOG-YIqEh*G;>CSQKN z%69Oqd8$z(=Z?RtIiEA<(t@XJa%SIpN1HR%PkC0c(W#j;S*vo7YK2dIxVvx8<(s#s zFwQT@i`^VNjiTRkhNkfP^up?U+g2RLw_a3^`}G5Flh`xo^?Zbv1W9CEH%(`>f??rNx?r&7L8Eym^_LeEW?KyGHT?78Oq{B?ctMNy zyC&bQuHm}Bgu8DwI^v&-|MkE>h}6plaG)9~S#l5H(6 z4SN359#vj$%*o4ZHZ^V7;q|H6{GH~D<8g{@aVWd+4OHyCnr zbilwvT4o-d4xDPY|LE{45#-;L}py7ZdAk{Lk9ve7F_*$UAm* zp?l(o)45lBCO91vcAcGGH6-$WQPACS9<7W~CizWoMKk9V^=KZ_0SeQ;Ij<^*C~D`ln7d=6*d#jC!-{b;d59Js8%dE3yPpU;o)=B@HPASHIz%Zu|&y>2&A-?M_#Z9X{mT|&LN z$CQ5b#;PZePkq=ocb&IJjMj@@svQ4y<-xzW+;SS2H+bdZ1QS{oJdWKocr9z$2CZ8&?bC0UY;3 KQ9bu-lu_*-V}$vpC?#7cGH(LRg% z9Mon_*p0t>eQ2U@UOBbC_swgQlkVJq(sHdhIQQzb)7`oGqgjbtD?Z13$e7JO`&3t9 zTwtsUx9($C*VuV#ns0{j@H74#?eW*6srT2%PZYW+-M>6i`P%R+n$tdS>Rg;SxOnSF z+TMKbtQc9NkH%wT8-C`D@C5&E$C!P#ABeMZO}R~7sBmkd zO8ynRtogdO#l$_+W~m$~?pJX1{-&mqYYu6uXV-VdJ~%E{-#Y)UR=$4r1kF;lBv-3N zEbfYjvEvjH6N6g}xy+bpY}?vbG1w@s%Cct$3Y#WPRckr+rt66?_U^h0t@QCOCiEzC&@>)Gspc7mTm}pk-cnHh*_@{(#dpTlbII=i1YHzvh&KN5&1SILzJo ztRxp-b#&hWr33f6i1%Ds_51bVL)TnM-KBiXR8MrfNA7R28ahi^!}2tfCb(rxh}e2x z>ypM2_0~0=v7&*KRoCu$(RGQ}47Ckc`YOCi;HXr7c^4BFnZu5+>cw@M$V*gt^yQjC z%B-uFjoLReBI56iIRD{L1Al&b^M{@X%RQra&%b`-#)hVKmzQKY*H)egYAYH9W!n=iCwHN0{IpJ3SodW|M@+p}lA$|k zk7ZGp0|w5Eugw4D!S!;@%-hWeHEuQZpMLeqwU^iK(Gu?Ld*AP7E^kVCj|*=PnU3Y} zPQ9ytaCquWwTOqUT_*_QREC}Frl2uy0efxh`r*}t{aRqZGa>{48m6|gqfYW|FT!%HJ7b%N=2M%rmDf~(AC>SF7nn$RJ| z4|NUmi)%XN<}IIUkU!=ZY@7aWtB<#~IaRHCm>L<`%H}_@yy-shP(BxZAJ!vpGyxzj)MS5VT$1z!6m4Q|>ZZQl`E!CT?Fi)%0W3y3H?osEu zO6S6pn*B>#{5vn-vY`9CD`Z4-h8ZDB8;gSmze&rj|Zc;eoSCqK@TmR@UD7By^Ng&H(iaWzpy_i zZpnlNfUqiclTp>qEQLiy8}w%v+;iA+zQ0A;=jffrcX#b~uYO*jlWR3yeJ}T{ukrS3 zy58@9WciriW2YwAxTn8$GWI>#N8LcItYa~FB)#lai0{08>FjzzbXK$7qld4*eED2? z^m_H8%=1-+uDP?FKCW7%TDqr7|7S?g~PIt3UsusfZKQ`bsdw}BJ z*AEP~Rc^G+TNH0zP-uGpWKqfI`hpKPUZ1C2YWh4WXIo;~%DoYv_ZFzTZO?Pg9%N{| zd$6kB%f1#q_NsQNB45GX{lSUVZ!&yxonj;RrdEBd8Fl6E!>%7-0idxaZ{DuuIwKCu zGtyX7C^(Z>N}Z)-6zS93nX782=YGOWOKVzuU_LF2u}vv7{bPlHOx2Vr&L{ij8?}tz zr?q9xuX@XGKVV=6p91Y7YGPtmUQDOg`rQre8T2u0^rRZAWijUsuUXBT-Q96{X-L1) zrbQ}+b=BjuUOyequH4D>UBpYK7uryCoSKZ(Rkx`bGbVI%XIn1cl74?dneV2Jiwxq9 z%(fW#s;aEK-;5>6YC+qPeB|lj-bSclSkmvjo+~hd5Pw?`aQxhK>E4 znsJ+*SbQ=oqUAYVeaJgs=adrlqCM+$3SP{1Kku-___Gk%ze44NAxe4Ic#1ydV^r0* z-d3rqe4;!rb8n}>9@DhC2bXlcJZypHifK2xgf`z*@BM+LR=b4Wd977vjd8bw=?CAZB`HTMchRR-?;x{^jU!CdxF2A+g9@EX*BL78tE)lxA zUu=zfl+4fQnQ=eBIl!lJ=z>8t!_F?APtkaP$ldF?i`(=(4VMZ^h^t}{+i85y@FA-w z^9SEN?&PSyO~EegXrAq|>-+4lCjRcwP2rAl;)8`I+ZJpY*lhR3)N1TmqnH5y0fhr6 z;SX01=x_X5&mwKVndRa7e&(N|eazfCPqdn7*fMBe%5m#AXI9w^S-(@TYF@>}@JH`N zea93DZ#%3^U1DOG5*%nL?)g%feEk>itXa3yvPT{WoUEzVBlA*B|MVR3#xz>rB^kV?FQV!pDil)43B;pN>ti3sK~}b{-tFD_bo#Nza{WxjioW z@v&g`=9+6P){)=h1}GhlZ{*DLt*OHO^w#wpN$)pm#G>T%!1~xvqYTxn{38x74#>Z= z$>+qX{NXAuc6ob@dh0dS_!#wqy_ZMVa1qV#p@rw1xqTQf6M{k=6yw8^%iKmEyrE8i zUokg?@@r{OrtZDq@~rC-_l7o&#pw-W;+{!eu z$IoV7eX`wY_V1i=M?QBidGYD;mD68VaM!kms%-n%TYJzSwHXE<)}ElfA6Jz88hh;f zsxmkGMV_naOP{cAE$Y;zZ>lUeyqmY|p()7Rw}^Nm-gcIy6%UFnEbuP;xYH*2u%+>ueL^EK~|UvOy-XLin-r*mlU zZp~8mn>zE9QE~1n*37BlT1RvG?tVDs_RY(AOU^T<1#ga>(Nmu?{kl+d+r8?-t@z;; zzs4zF+`f_bq3B6k<}P!ckvsW2baw1KWwPbv6#dN(Pi!_Oho)>g=uRzsZ+>DO#q;%s z%+J5BFJG~y_=Ko>ze=x12RycvADnt&*4_)Zy6o$^XV@OUt}(mkutQ601|%HT^NlK@ zzg0Q3XtiBg{p|fm3>$NgMvT8%p6~b!*?&n{Jo{JmGjnu`cRgPavm$Ir{R?}O#HibA zYMc+9+;7%ASuJoj|41XN1{MHD+&EhDYC`Ru#)edf@L289LA}BXnl{;f{HR@^OWW~& zV#B10Gx4Xl>`WG_d0x24H(jV-ilDQK z+S5bAQ-AY#R;&3w_-Mil%lGSiR}`Fx7+`C0Z*5p$wjclP={IUiu6t~mob;(ee{ezd zsCh;QEen?GpB!kBU3mEO@Lq~kJX5=6!Q!pHP49lu4RK<;_XW@Za>)u_}O}R8- z$GNRt%d=JQsvM8b8(%26^3bs7!Io_$WBm0RTrO8Wn#Re>X`EDLqjfyhH?c~y>w3|i zgwssr)8=(0h5lar{5PMjwk~`g7nC*n<`4s|Ljwa2bn-CUxV!n3VV9X3rrg@yduV)3 zw&j(yMN4@7T85dvQ_5YnFm92J`%LpC;m`JaMKij*SGDUKu(e_H%S(s9EN*z}V_hzx5%Z`e@KOA#P=$SsdtMGp0kg9QagNjBm zT0P!2<(m}EnJMZqq`8OkRFC&%ZUfi!f85V_WoR08PGik3hjF{lJsWdiSm=Yxw3(v{@j~0eALg_KYk>bKYyy(v$fY227lNy_5SE6O1K?m%L4V>eh$2cn$wS| z6;n1R9r3ukvD2sN$9npi+w6KXYJ~lOl-IM@c3YlrS)PWksOyu~a&}~eZ;|zt&k7Y2 zsBxR#Egx?fXfZTBvS9g&2SzVn1tj+B^rj{&`ccf~`BC);o>Z#O56LKgJR|}0sjG$s zfSC<;zuU%+UNGRs2j;2?Yn4@D0pO^@vD%&cc}{w2>hwOsQL8pxG;cjPX?nM=r|*gv zYu8<{*ipXKxmP!zoJ}c4wWs2eqcaq=g_nxHoD-e>C2Zr%0nPf$hkxEVbeng#@#j+l zo~vAZIV<+Im+3s#dur1MoAhAnlD>{~(>*tzth#Y@--lC=HN4l&?e*gSaQEI(QEc1Z zXmvvaO-6!<yzODL%#LWt}!b^CCbfT#^2J6eWSUx>5?OpGq3M-Rr|Js z0*;wePix8AG@3gM$N0?XeAR#3HEh%2ho>s!lKAU0LN6`e`i8;vEj$Lc2uy(8Yvh+L zg}o&cVDo^bA&~?D8w28N|L{{@(Q$t^XoRh#U<<5eu}cUdJO;LSgdHVQ!(*1fUP|~Y zD*w8Fyp_5$tIQ2h}p{CKVl?7`-?N_F<&j2#&(tCzIfp;Q!rjViN3HxJ3T1 zOYno>VM)ti^#?&D#m34<<9<+oeI_59Aio55`1!LLVq$u9Fm4(}wHp$Q{~8B% zEf_XX8gC+DX&i2O`0u{|)SEE_2bzeR8Nn7lGh#z${22?5fodZPHs^vZL1&H+@6S}J zYt*2qj;YW8&pNB?wjhM`!(L@;{#8d`NScJhKrZ8xn;tVT7hC#CwW^fRa3>saGp+HD8X!4U7OhSr5 zs)XSi+gxr zp$&5*A<7L4b$HSMMnFFyM7Uwm4G$~=;(-M^%u`T813aq%4nX%oeOQRY;|>rb#CbkI zeGNDV$@A#L^;)Pe0Oz3GJjy^HffDau4zLCKGt|fS`~cEG?-rJ_wP=6CgoY z!c;`L_24`OUf0Kn!#%stS52%P5t%zkLKwC|`b+-F zKpVjIx^ek~6XH<;x)Ms{*9w3g&|Od;ZU z<^eqf^-=z)Gomp6+vD<21RCVPygM#`phSHt1ULcR5A|_AUVzDelYc7Ev*3FDxctL_o(A*@D6zj)fH^?- zLVe_CAOP%^xo=$lB+wQ>zZsW*EYLH7z78eo(+0o-pvT7L&(8jDLi;HHAb>pFUjiio z$OTve{SL09{JjB^KyMnCe;Uw6KsSube;LqfK%a&Z<+U2%0Q5JgkMd_{|M$n`zXa}4 zhWjg^#QT>6Y=Q2C`q-WyKpN;>imuk0RV(1|=Pk53mOM6Vyj}_yVMW-Zn1(44_Sbel{-u2%y!0J`W}Gb1h&l(7&KQ z%AcM6KN^>RDBPn8_aBE6`MnZg5A+wPkMa)y$O650T>d#gn*;rNT>ddYYXN-?N@N z0FFTafchv;cJ}{ZT>eYp9u>I%D3r*r6#zS+yP-bH-ya|Y^zL!_X9GPO=vU+Nj|O@M z&{v=o0IUPd19}+hqx{*~|Gjbfhrm5baDO?Jcz*%F2Ivl`kMdsxmR&i)^d%Rdb6nFjZtgcAE(1(*Z$SE!Htr0jqHxcn*m ze>*P!Sh!~<+6eRl>sL#P_{&M9|;%C%>{o(;u`R6*)!T{s}c=$i_ zk%v+lfb-V`K&D9O1Hj{htO7}eE>1wwIv`I zP>p=20}aRpR0BYWge4#sP!0Gq!0`g-^8a?6OQ4N7Ko+0~K#j2)&RYODMt&HVHozNz z<2(X*0vH6y!x$X^ae$ow9P?*@FpSj*5Cm8aI0a|{{BOsv4ORZ9{5=5oo&wYWsIjBl zRt8uCf&e)F1AuBk8-ReZ;v6giL4aJq0YEjN4M4z{G^QeZowEbVq zM-y0px^D)s1vmrT0e%3~sVG1a0QG7$U@PDN;27X4;31$DfcnJ=a*zh-16%-6fFi&t zz*E2oKn-N!4JZPjYzP>$B_J12{kQR>O$Y-d0rCJf06QJ}yYByUj8#w%_2?YViU8H)=!24iG_;EcCjjNZ4-f{30sbiuOZdzWkPExiUZ# zU<9xQxB!9xae!O^9uw8Y{{CKHA81Q}GXVRI0^|bl_)qoa;X0*5W^j(O@do@)>np>( zIDYJ(U46Lp=YR|iBJ^Ltu_Lf91*|`P9FWyO9`P424kL|#Z0ldZar6HTe~+I+@cBeQ z5rP{0ImX2~PW@HjD|^&El!`zmM_`;qnJbJ#6-w-%0yS6)goD-=uVl^7l5Xj>S z$oLq125D@yKja$lc!0k#&<06{2u#cp5|FJ!JC?Q=mb$<&$cfHzj>tnk0OkysJ7Ap0 z@!>c_6jlfy>ep*3wCuF+tG_kvT_Q>eP#Ke7}b&nfxWLc$I_aBs9(?ebFwn_-@#gsW{uSJ=4Z4f5Z`M^Nw+eo>cfg zbKwTJg+HfC3Eg_=A$BCVcgl997jj}F0;(-rS87gwFk3GJ_C9}h!prJlkGpiXh?0@KU-2G}6epJV9 z@c6lT?()f=j~>Scmh_Y?!}`1Sf0lAGueUkl6`jP)TO{5peM{O{@|g0zIlMFUEE)_P zxChO*_@z2LGICrfvwWE!@7pJ#W0^Ve433yAsBSrZaH?~0dcN<{oYF`dg8|zm^U&#Z zPR7V!A8hlCJ^Y{dELbp49)7IA&3YmHTKwXeX-V?%i#G5JQLur(3Vi*Gzx<9W^~WFA zLaF(efmogvHPxZ?3w_Da%1ZS~Wjj=t4fRa5Idx5NCqtC8yhv0YE?L%RpCO^lMg2t@ z?}bvnc-O8eusyT*W@SfwED>J+!AS7Y!-xErKbP{sJ-lo8wlEzxD>K)uUX3H?S-ol% z_q}*&?vo`~xk5ujxmGTgX zwB}L3A#$1zwsF+lzRj`R^c^_#^z=A%jpR6PYx8q_<{P5V zy!@G7Fr$Ue=Tl2(=v<=1cr1M_o+z7m@c#%1F%y6aE`}+qAlUN zJn{@mVdNE*_!+T6TiE7$j}pfK=YZYGPCG7xvu7M;@ho9pFSK%!^~>TvKU6aB`bd#b z>*~e@Gr6`-%580MO)1_WZg+W~TlxEJ$?ps!4_;yasZ($7@ig++ki9DY&`VdSL;jBS z9q+`H^-60`t@0WADyJ&nG0Ass`!2N;8$*4=8;8_U*HEvoHQuw_D0rXP@O^=G+ozuv z#VwC)9v|=F7;&_+`@QY9MYKSreZo5dZl`W;hY#N)EJ~02I{I8u=QWfsojXUb+kB1i z8z)g0D}nd(1m}G%vo-gu(48+>wLrMx*W3l0Pp8hF!sF#~Ti9Ln#RX5-?N67RmA-Ub z_&VEJqJN&YTg{;;Q>QOX_a*AHrikr$?*6%crb)HNc8?avNz!-LIe3OkJT^K|^2O6_ zN~`Sac`Ll?-JNDl$rSS5-L_eQQ>@6_EWONN8DrR6_lLf+y1Advn^kZ0oKK$g2|it| z+UxYo$6?oiju&%=@2oZY(|g`{`rdo-ZKmnn1mEm|^&0(`bA2mU*Ux|z9CSJd93Ts$ zQQ=&N^wzU9rTJN#tu|JaD@sgK+3v7XW%je%6&CtW;$r88jduQ2DJ+tzzoS~7aQExs zF{xK`E7hLQDEv6x@|%>juKj^E4nZNNhI-*o0`kOdG;)6oXlzIfs#;+`?3Z+QW!jxS zov@1uVTVg~4j1JIh&>DvqBTf8E#POay4<|GwAVLq*R^?tvYG3bm+rr^^3&RHs#`^> zs&8=Xd$^_FT)56YFnN$OQX(&XSy`d7jZMHhkHZ&-`tKACAIiOGcD~4c?cwaTZ(H_6 z&0<`BzyAElA+P77bp`>1hu^(T?XD??D{e&OEs!qQuxF2j^}bD&9{M{|b8W5npZ8<( z=00re%zjXI&3=ikq;vcR8_n|)3F+3rk>}x(&12!ZzI9Ql}QTee*I{1uz~xHmt$zcs^9eADX15A7_{H#4R&cE3THUct$c_awXTPYv*%b|5(<&+S+OV)hgnnp74T6&xwR0 z{*5-oCGjIq8)CxFC;M9Zfu0JwINg&3K_|db_|Ks}IZ9x)<1#$mvUwk@wB@ zPsPWC8^19v+3M1fCnCbky^(0LqW9+S+?B-6k80~9R;zCPT;BX;%WDDQ&B;o6LwrwF zc~@-vp|3?mO|||QeCW_d7mNAM`z6ghrFNJ#rf|FtbIV9-zW*RI;(DmD#Np8#@c>&7 zi=(BP-r@p&Va3$MUbV?#=0A9B%VywRd;1S`mM1U+wT0>#W_MVA)`Q z)fy@F#OQ0XJmucHmN}W-V+tK5&HhpcKPYXl-95=YQmRCnLzZkfbaT{A%W}JvP~4^G zJPdH*?kpR9uSbPm}$s9y=#t^=HA02XmWV92k)w?TdV)x=>)1wEj=VTe{D> zgWt$SzFK`Jr+?c;n|*ifu3v7Mx+-TgPx&0%C3M7Np%t(0H^0gq$}N2D51m4?(iRmx z%Q5LzTRW${O!;PMdf_L(z-=`e4Hb9gWiyVIe=#@7zdlf}Je`xnqA>TRgSFwOZEDAc z&L0U6DID8TdB5x0@wUX=@>eQRjjjR28k>%VMLU~(_WWr0w5ioAv*VSN{yL4P6^Z^@exzz-Et04FNf;w)wAlS+5ny9S|sJ6dXzHZj8=o5EbNg6DxlB z^Qj)G>Iab5l}^fJT$P1H=yGMBS_!`)@} znRk-Tb6jZJ%yTiBV_*J3=XaWQ#_w-$^3Rmk zaXH>@>>TK@T=ROcm+YhMo;w)+=2-5n*ItL5_VrC4cyZyoWYM{bxl5aBIWp?(lAno{ zt$Im@idqTw31nXkJEUH;QH4x9J!AR|&1IAJ&oew`dsxRw>PxoVs<2JJ$!8_np_c-T zR2-kpo52~k_N37DeLC6~i)S73Y|T?zF(cpE>COAaci>0dbvC}w&pPAXkX&+2{FKW*`2;I>Py5$$FQ4Qk zrDonu)Jn_LXfCSc5+-FoX%9;}>{|8eUWa~UTP0aNoYeI*gTFD-ctOp4rE^?c)V1E$ zat~{XOj%ja=yFNE!uO)3M{A+Cyg_7Ar}Ogq+sFLKw#ge_KKT7*W=+n(nd+aSu`Al< z6*$#rWFC_+jX&kP$5Cc`IoH}l##3X=S6sO%otE{h`*QWx567~v_WI>LotF79?{rdr zspa+3)@QWWV%=ZKv>s8OhpF0^rDY#~I&tjrm)#~c?$+wh{X8Obw=D8wa(sy3Ua$V> zM*QxbH#4N}nFcpL6%S~T(I2iG_HVwf`|?T1M$e}&!_)L4g0yFsK3wz2@I+(wBaR}v zCL^Hb&OUh6Wb-I__vfNF24`wkYh72%U((Y~MqH2B6&-r&jYw$KKE+FpjgjxqN-h&o z$lY_PFtAbJLCiXq+MFtt+v<(st}*MLU&)y)^O2#pzohc8(V4Z^8Q)wVGI_*a*d>yC zeNUKtyjy=FQGZyfVV`1u*iVmjCWLN|82^triytdPTLPXw@jAL-Nz)YzlbS#kKHB8s zu$atu8#CSfbyw}qd{p{AvoiGloa|3mXCJ(B+h=8%=%Iu*`xsHICs+yj~#hF4T*k8XKqtK?OE=c`Fp-O>4C=$+A+FJK$hGOuo!| z!?=`piyTR#ujh`Q-|S+0YpYfJ@2vQ=Ms@Kc`!_Kf19M4Z?^MmUd+)ctQ($g=aj7lwCQIQu(>x);8Zgswf$LAU~Yk75gj4lGOG~ zDU3aKsPLini^ZC0Pv$8eXwYxWG>!2}DjqBP@HJG{@y@3Fdt}w3HEYrqY~H%1Dt>Qj zW-{m9ikj(ZZ~fkO%IDhU2juR&oj*7DT2RPH(3Lc?CvD8!5<#cJ9adFKJ|75A_4$$g z`qXmWQLR?90J$cwhvCBRTAeAA5AM_EoY5_Q;ObCj{h-kWE3GX{3!KkIEPs&u@XE2M zp|xF#HDtAg<^0~_V>g&#&g+M1>*>3BC89aCJIU5PLg@!)$wg>??HJ$`>N?k6`!iE6 zF0Zqx!u!_c8xJDxrMrJ^Dcr;DDP$$J>!RB-+JZ+bFDS*_UFzYjFVH5pPU`X_GBf_Z zuEYMB2VPk^_J3<>4mhJ!wODdZtbwd}`GN5J7U|txd~R{No%-ir*DQ!Ce6~7i4%0CA zn0$YNNeai|`@+9x42On(F4RnJ8I3N^7AbFdditj8?9?#cboH|~E1tAEYiDx>s(0RC za5OgOtT2=6c%LbF0E{_m%!vx(e!=y-%6V_!fR9 zuZ3e^y+`iZqAmH)-&JcV+H&T)#(ivH-4#lZ;5d^{&s-=VUd$PC{L-@wnI(rBS1u5< z%Gku2SzTHqE|Gp<@7!N93MZMbNs9%W$Hp{8bDm4e6c@U9W}WQo%Y9zIEw}l}tlWkv zVRW0Gz_N>3(i%5?AC(>7ACeke_=ucVRFbE)>Ens(y`5ce^0d2OR_dhs_4;>xAVVsr(4#=VX3u%Lxt=G#XjK_w zRq*r8=@%rDE!u9xFT3HHtIR#`){m}$K6k256#s*c$+F74T_0rW zN=K}C4LFZpydL*!x0CG^A2E7C>(X@v%lFtwyVtbFs{GjZRXQqIQcgvHzOtjT#^Hh3 z%EM;A`j5U6UM0|Tbj?kxz26Nv&TmcI^mMer+dk;}3c=j;Q&a1@*B>IshAtkAw9#&I z4(eWV!uznzEYZrWcDtvqJ$?`8#P@Jrbc>uDET<&6&mn=iBctS9iLKV_Wnx-;$)vc4 zuXkAKdaKrKs6An67)=-s=ETv9ligb`>|DOv?0IRD@~qLKZy#Rq9ret)et$*x*W~?#Y`LdgfHb z?@&m3dF%Vq{H_oY|6DbHv(*mH6@{?kZ^2oERRi&cE8e*+up?KHVv_#vnAuzP7raVb zrBfiy)w1G-pj5G$x5~|JQd89}gkO*eMV;}@T3akL6u)c|^b9cTd?WEWcj}r` zmyL)Zfg>;OF#}kntBpmDvTfv*rw+EK-(8Gcr)nrZJnPxo!(8%dFE)kG?7w+rw*epP zA>C8)#-@4F{i}wH2cm61V3a^LG!|F71l7h>l4ZyB4#WH}RK#scC=4 zjZE!SZLXHAwy$gz{WvdbeyOPv6}lUBQKt(Vy&jpDPGPGX>V28*^~8C;YkkSVMCniIM>)x|YXG z9>Fk{o;ml=D9)J)&39y0GjCsiI`)&pim2=V$||dkBWx}w(X(87x#M~g436%;6D9Y( zxux~?KIYN>A7h8)%!tCwudFYl$;3H>ee~=}N4Pg_Z#T?vE{cknZ2D4W?P+G5z$Dgh zyII7cx4o=nqfCOftCr4R;m2L$=xa1t(J^Y$qTR3RC99b#16r&L#kz!xL@#S=dM>f< z;}5#`4Lp8DqcqgOY_ML+lAJZ2n0mX1)ttSS=%dZ!m}Kn3HD%H{vn5BYBhQ;uyyf$J z#{Bjnhvo8GnaJ$uW{o&)AdH@7aBLhNVC0-uF<)oi93g8x(#D+jj7js`!5Um5Pn>b- zX5CfZN?Zx8;K)9_kx?~syG6jB#Sx(!oZeULX<$AtJHc`^kR~>7>SB3R?IhYyws7nv zl^Aym8CJ`8ybt$3wEe^POLfepA8J?@agszzT_@{?@Lryu-6Nd4u2B>{h+EETu-iooqhKG?naS zgmf1qGQ!_xzKMNV_o)N zLYUJo>A|u&4kGkvJ8RvJ)5IzZZ3b6N9<6j%bPloHzC`Ar%a^$H8BD7ME`-X^C`-bm~}U=oi)q(BJm~m9%JLH?W_+P&*vvC=?c!A zx9)4@*cYAyYT-nk+;7&C=ysNqaTVcO{hM)DsbfsAS=mMYJ9qH@Z3p|5=0D)6g8%Y9 z&+BI$i*08Kj8zdmzcjeKxOB!YeT{KF=qtfyn`thm4`!nSY&mu2(mk;-j9 z-2z$KfvY~({8;7S!&A9x1M#(^kG0sXgLTT}B2nE}&2{b9=iz}3Gd;pWW(M3%togaa zNSo(Y>vm$B(pQ!k=Vw+?5qwLM|BdU~#VNzDotAp;zOL$DA$0v$yaX4IYS~^wvgQlR zY0+oaqlmMF;td7v@B_9(zZl!RPCSwDyZz&IKdJGOdxOhCg1Nkh^~AlCwJh=!Q98+$ z`&8g?(b*I0hUGjtR$xW5luIm~rel2b>Ge3Fn4$#JS>} zaqh?iPDGD2CQ%useHLzE@T z6lIGtMp>iGQTC_>6sJp1csLQC+sN1OHsOzZnsQYLGXbWf)Xd7rFXe($lXgg>_XiI2QXj^DwXlrP5 zXnSabXp3l*Xq#xGXsc+mXuD{`Xv=8RXxnJxXzOV6X#3~`{`dm$3FsTpN1(4jpMkyu zeF*vz^eO0D(8r*!L7#)Z2YnFwBJ@eyc0LB802^bqNMqsSKn1QhaV+h6)j42pfFvei4!I*=w2V)S% zB8*8Gn=nRUtiqUuu?u4u#xjg)7~3$$VXVWLhp`W1AjU$Bi5MF(Mq;eQn2E6yV<^T_ zjHwt~F~(x7#h8n+7h^ESVvNZcn=wXXtj3s)u^VGJ#&V457~3(%W30!RkFg(f0L%q2 zC&1hQa|Fy4FlWHr0dok-~FlWKs1#=k8 zWiY3~+y-+T%yls5!Q2OPAk2j@C&Jtab0o}_FlWNt33DjSr7)+$+zN9n%(XD*!rTjU zFwDg;C&Szfb2QA=FlWQu4Rbim<%A%on<)RAD2JOU51S~LnkXNdD5seyFPSK}m?%G( zD8^3|rzeWF6UEDkV%|h?YogdQQT&)F22A9~C-TJ;`O}Gf;zWLJBHuKTf0@WfOl0R1 z+3H00Hj&Ltr1ul)?nKWXsFUM|@Ijg%EZ`>OC+$;Jf%EBOJzbhWYtP}R(uL0q2A}%O zg3pcT5C*1j&FsSdd{~h}SjJj}TERWm&G`d1aGzaiuf09oJ0~|k$N}zmR56=37wR~5 zaf&%ZJ?A-dFVBOz^L;{W7eIZN-OtavKpUT@q)I!H|%`t4ek4kzIf&XefWx6-SUNg7IkkZTLgXi@g?T^L4ST3 z%ia8;Pk-0>askk9z%%EM0nm4#U0-P+^dAI(pBMgXEf4NUj{lG!g%bZ~I|3yx5*UUO z*USt-iR&AFLy2o?2B91P;6j9cC~=L=FDP+w#7`)H0C4@ycPR0n^53Au-!#T`IbWdc z1$+hITAj~O_5g65SUZ&609=>U31tVM3s3{N1Go#g2dD+y2h;%`03HG!0qOyd0Z#x8 zfJQ(Q;3?o4;5ncf&;ob?cnNp~Xa&3myaBugv;p1$-UB`WJ_0@gL||OFI0M%!H zcpw45wamEQ3>66%*5I0FT)QO$kOjyA%gN)ez0PzI;~Q~}cfY5-g#g^NLO4HqgQ z{3HF(+Ul85Y6Eb+mo5O;d*OOA1Arl5768}B83RlJrT|9^#FNJ@fP`tazlNf_=~bZnNaKekYA_+D052QDBHIHlqJd$Wq~|L9#cI1 zpXk;<^$K+gb?NVV^miRX{XyBYllwnqj`F5t{eL54T!sW){*f)p8D)#IM%kjQ|7pi4 zTa-20@89{3@<6%#-9}M`hmKF_K&uYdVxAY>BHakfRZ~UZ%Vc( zKRlqBf9WaeC^ZKh|9|pDI0tGR|8M5<|HT~slRurv){v(-A8IVfZ{#)d9QjZ2cOu_} zHiP!@Kjp#yR!0BHx51GAi~Ro6-2WL%s5zq?kq4A6QFEts3i*M$h`t7O3weTig}w#n zje1M@9rPopqD*EyUA`We)7)V=@2OY~dl>(Rece&?Tl9WD`+{h{r#)7^>e26ce) zy~q=^ONtj14{+{yz^(ry`@nYoQ(yn7kAKdCoeWVA{}bQ-r#kqbdR>*`QPgAf8rtfQ}jy|f6zZ+{G4d4l+B_Z;eq<`-vQ-7=@GV#=O{NkNBwXBPzUNZ z9uu{R?Vuk;;B~A|f%=RZH~Is#DJ?)c0An}S|L*{|{Ht#~#{=sizfp((etZW4`S9Ph ziP!PKF;eGL9h?WAV|>MPJe1&r|4qA88(8A}u|0~<*ry@@4|lkL{Ke}N0q?;!{t3Jn zKf|^texv-5AE>Ka;0Dy)iQ4?q}13yO@VY}>(#{XrzR9~pKs8{Tc?*FD;tVfND zY7;-x``hP8|MTF4O4u(|2TMFC8qX>H#`FK_VFT@oPnOrvvh?uJ6%Y~;6_=bUr!-Ad z*Vqz?$x<>3D$}*}j4j0^B&DR~6ji3r&@nW%6rVh0s*Jpn>R%KRa7j&Lrrs=5OL;|Q zRW)@@Egk(?CbR!RDgAXxTldekzx`N^nYkr{i<{@KU%3&UBsO`f+&^iq@vHC~I5;p_ z?tlLz4h(Lp9M8XhAqR#hEzisU@1M)T(enN6=W~$$KYmU}N?P`xKdpl-tZwH1cs6up zcG>Pc|E)m(AM51t26xqvPuB(d9`q*OJ{MThb|6qpb<^2J1fJt(cnxl`#QWf|{PTCb#I@CWx34$i8f_n${0=OG)!x>O-&ajt$2xc) zRZ{m|v0Ho$*LIKJkC!d+4;+^G2iJzbKUnYs*NnSLT>gz~!yA4_exdrKuHzc;b!*~V zsgk-6*Mh6FR@PJFpz2Zm;xb$(zz^o^1eRgaPnuKBm-NbF1X^PLkBr9Qa-*!6{vGX_3W*Qxe!?SKE* z(vSE~z}ls8U6Y@(9N+vB{AHkO>ZQCWsg05=)eofyR6S}OpNyXRoZvgqLdl!zAKw+& zF@y08-zli?lYFb|UOj*BjNV=;GSheC*RlqxJ!)K(Jn@|aF5$Kp(J?J9Q3rdvU;51O zxpC^)14=)r@nX9vzoqU|{rqd5oZmdIhd;Z^PCxPfD^^>dw7-vczq(Sm9s8NqYjT_F zpPC=egGukciQ|d0*!i#(+6~)e`~msIXZWp}(lct_l>Di2QG7%>TYTlL#`{qJD1I=# zYR!zVidJKPlDsN+y)zehd+)mS+S%abEZJF^Z0!Z--+%4eZRAVnFO^qOC--RTq9kJHr~Puuvej?jJ1bKu9BMqep>R3a4p7UfK4RjQ*sQ}T@R zp7#Rvp5hawXIouDnov*K`jb!DvXs1#FX!r9YSGRp{!#KDI5O)t+PU|@s5t5=>O*;s zOYPei3D*O~H`CbpC5o@8Z>Yze8pH)f-fz4`Qg3E|iV&0d^?EK^r9(osL@2HpUxy#EcV-z$gKTYZ5!q{D9cGn|kDoEwOLqCN6q+D|S z&8hb^4sWqd(q-pwDY;R0_~1p&5ud!1v+@c&o?#rL^jC1`UghUsFOBbxr8ZFh5bbKQ zo7M4{X%|e{`E6r=@jCRo=x+}%(X3AJT7A~1Bi=l$e(PO~mz2IgaGrN@ta82uC1=Xc z^Q2R+`0j497}tMv`Ih(x4om#Q&ablbSM1{EczgfFzS!w4_C1k4u;cT1`&i8q|G;61 zf2er#&p1WJ3Fi@=f~LjD|UVfb!8%bW9Mhs`4e`2gPq>8^8@Vcot<5e z^B<>SiGSd*#6MKthVMSceKTa?yN|9v4vkXwKwYQuHL9fU!*?Rr%YGlE?1ZXE*$0)k z;k%SN3q?opT}cs9$Dh=7sy!MLQ-{IWF9WsFLT<&>R+s@9esk{x}^(?o2_6y&|JhXb{d&)kk@lyE_)ekjK zd`EMsT=W}u{(;Kd@ZHfbC$E3UcQ?;D=D(!!HfnxUzC-10_>QT7x8XN@r}KWwgXir0 z3^gu_kNB?VxkvMwsJxBh2bI52c^kg7dh?2AFTN{ktSb0~oxh^;Hhi~r_Sd65_|B;W zUE~p!w^96~@)2qtl$`M0)tZ&Qb?p2emAB!$vP$`9JMkUZv#GuJsJxBhHqLpHIlAnE9)3vGc=J z-iGh;s$KZ<0p+~bB7|)oPVtG-Gt^TVfo*K_bCeh6ZOE77?Mm;^&J3Q(R#SN!C4VZO zQ+XS{L;Q{F?%TcR4J?{WX>9X(im#L&54^K8;f^q4o983HFmFS-8ZDjj`kNuc;DW#t zw)sDmx8b|X_52TBjf`f@6!E=slgisD{i2==C^=AevbFuh^a`F)w$BTw-bV2`5$0`ZSFeVOpK;1<60ZAV{D58Dr1Ca=SG#~G{%J}3Z)Q~}Pd$~lQTk3j zr%-aH?A)r^ox@s3x?$Yk|Cjh1JiN>tpXcy?&s3ep8)`>Kupf5MH3n|7rkF?Kc(C2T zDO~-?Cw6h1dj6yQ$VgkvSClim=b)w=GWz&Diu`;>azC~_)cYCrlwCfctQw__c{a)m z`O+7*{yo|myXPiKk0?JC&FR&Oeu7zA2_DJdB#+`W*cnyXUOgrN@== zIRy0?<;qE4@dW)eyZnUGJIW6V-5;vMIP;dxb6Lf-CDQmDh4z@gwBSBd_VOK!lkD=G z>{ca7d`?4qN4*T0TUU*7p51dCrKgmi4V|WY756}3moJsurVHWs8R)NebZXx_FE)5F zY;X?`yXQVD7coA3jzxcnc9r^7;T-Onz%K8i^qTVHGkMRSvaoFuX=U@Ac(=rej^D?i zKbM?6<4%Ceh2yx#0_Hjsed_eSwKAL9l3g`Q>8k80E&mSXo@Nj=|FaUv*SQU&hG zz%CEGakBd-exHQ#E7)cF)CE=gx1& z@6j+H!?iZQcPS?HlKaYEdu*=&Y9D7%T-=|`} zEic7az2&>drD2UdY@gHjaqhT@-@{@)k8wR-;M6tT%Y?>5=j7mL@Nx_C2@qUNA%bQ} zm*)uL6lS<^X>-Rh9eCCFmhnppcncZ{rHR;1QWjkz?k=G}IcbWsl;+eZ89!Mwxhw^1 zrC^nXs=Ct>rq9)gnBl8sGBZQRUN6+Zb5@G+eAAfO0Twwni|t(J#5;x0^I4GYw$v+m zQFLH-SYm7@Y?v*rsBUO(<>=ub5}8V(LBfImuMCN$5%52FGXDbyt~n!@Y~Utfy%?!< zo1gH9^2-ZRB4vz4?lqAiDo0qPocDCX?Kg|OcG`$Y_`xFQH8~N5oh;JGBZNqP0rgu+ zLb;knew$KCEZW5)pVZY6ivn5XjEh4=GB1lfd0LmYY2z5VW_u!S-^WohWbSp^*Iy%~ z@Fh|D@{_})?9(K=$-r;YWYc^4w_^ij)MtN=;);jmVpN2 zsof_sbwfLYuKt>gH9E(&jjM@#z`Kq6T=HG=YttH@>l_!!HrFl8HCl(rHtjRKElbvs zO3V(vK}G_(#ZOmY+hSMp#MZ5XPcEvHD+od19mbk4&SHO5+C36WeVt9Q4WuVzR(-w#!dZP)YCQ%m z#%6?XN0iRy4fX}gA4L4(_Hx|X*|F?ihNQFf@t)8-MC1G&VK0|-UCnd7*nB#8{d*Pn z6Ymm(ZdG0NlvuA2kh0g-CzzCk>WW078u?hxu>Eb_GVLxSPYB7ZzWaa{Z%iB>2p|QxK|qyY6|vZ z5BmYnWRa@wy@Z@1*k9f+V!arP+)+P5cyqDHv!jaE0W=Z$F_M3E7)^kCj68EHj>hU4B@0K>X>S`w$#*dYw9@mVB*9om zv)(yM8dPtmolPGl>kb^C_4Ga;WzsaoaE9qDE{U)bA*h2SM^qWl3D4`z}|4lx)c!GZN(I6Qeca`p1 zFi7tAsH5i_4w4mNEp(lZ0kZLMJAMAP0dleEFM6%z0J-Nl2gmx(ezGok632!O{iJr3 z0>@?Deo|tSHpg(|FY?Am3l8hJUu0s~0*(ycUu5!>K#t8NKS|!<7>*Q!pJW<8$ua5f z50XBA1BaX253>8leh%f=-^ujgQyg(2-^niqH#wBrzmbI|jU3aKej~TVec%Xd>m%p4 z{N#A()khA*b8%We_)0d-mgGEc@|9FHQ|BBi>m^m9%{WB_dP$jv`J69fzmSg07IV(7 z?;*Q&lQ2P8)mu2fqQtY!9*W>Fi$Y5W4u7Kheaw#K#t1hOQbni^&`eyo^4CY$Tb&B?k zyzO_G>*I|kva;toS42u9>2RT$OID?UY`E0N_42`EGI@Z>oe@z_E{#>y*Ks_c}V0Y_nd~?SXS%ICL^_lnXC~^Fk~%dHnU0P7$wkUN%tK4}k{!4Bc-?x6$shYQ zcvV7olKZYW@pd$BBRM6ac*AtJkTxfacoUXyBvV!$=Y3YYj=Z$5p4X4HmQ?-qmA7fy zYO-am2p^~Q3bH*=kMGL7d@?-AgYWiSl1#5n<@;!qMQZpJ^L0*6CwI)e#<#m8nS5g1 z#&^3sf$Z7F!LQ~WOOC2d$%}gv1PqSMC10N1DX?^pJ-M0p zhJa{}HQ8D6Nq}>nIoXlUFZi3sgxt1SPw?Dn19GU_S8&i?hm=~GFSxu`lN=4I6r5_P zMwVqY3TACkA}7BX5)6APOM0d#3GL;SB7@zXg<9pr$=Qj?LLXFw$@a#5ut@?R8IV{j zWdDspmbiZxlDR;TCsL$^&n+3w$$MchTsQJ7M?5=TcuG!R&eFwugo8eJjyXWktM;U*yE6&lPDXYswipkRsB(^HGj4^Posj;=P=b(~m{E^>5~s z7LSP7zP_BpRWp6kw5W4AH)eQEa(;I_=W6rvNl|9yIbUv`nPioHAji6=ZBqWhT{%ZQ zg+x0}Y|i1MnTx9LFU;}jjuNFOEzijm-y^CrBRj{Rd?4yvmz>kCHY_^BDJF-Qq#;J0 z49(eWvPf*OKOiTsv{1}N!7JyS<5e+Jtpzzk+F!)tWai`~d&r8H^_u70zqCMneTiYt z7r#95_Xb)yH_gwAdmdHEQ3?DczK?+Nruz*>y#(G5!nWb52i$44a~mfNtbG0;-0-Y*;wjpheP(8`Zy_5yV=>a zkRwuASvuL1Y$2uzc^*DPL9bsCuS*|cqcH+Eh1Bv+rc$Uum6Iq=6>re zp{nn)+w1hQ_MOy{8@jKYwX-!sPGGNi)*171xdI!mtb@-!$cbF*&y+2Zmycq0WVRge zm!GTFoLTU+SUzaVz03yF7Wt*E7c!Hciz^7kAI_Y5$W1}Gd0S@6p-l?Pf-5rhn;$E% z#FH}VW`c@7y}_C58l4q8x4UNM7Z)mq30Y>Y-BPEx)=MjM;WefbU#xUy!DL6J5)aHx|_@{aXJiL&}avS@~UKMwY*W@_br##@a)xm9@Se%jlePUpc38SH|pX zOqD_1l^N65&sFhWosi*DRH))x8Ia+2@uAA4opUpq1O-*~+zd0~H!n~vc%hK-z-p7~ zG7W)@T0QTmO)Fkpm9DMRI&DowY5LnYvT7@? z6s2!EzgTVlj+FGabBEN*%!1OFwsxpFA9YNx($JXB`9U{5t~6%)#t&1|l`YRqKYNTb zJ(9D3y0-b3w3c3D^@ls2rO{d0>T@q$OUu%~r5;yWmiBTzmj6b>NKGhHrvPmlmnxZN9YI@peRDdQKEu406_d(6!JN>CjJ)brGKDMUv1!&EP zslAo@xi4|XQ2dcp$3vH9JZf8)T9wM0aYigLwI;$&D^0*VwLhy+tGmuD_0{nPtyj(p zsly|aXNqrOq`nUim>IseGiA!pLo+KPAEiv&4Zr6%dMagmfUdTd+t!rc+3DJoqf%4O z8&zxTJNTv~%;(ne=`c$^=pUkoj!Li4qboyUjd^a^F&*0Gx87V{|G zqY;Ob=k=V`UA1#nvd`&ZU8mK{lJnNt=rtHSCfnr}>is-6Jz0HClivDw%;eMMQ}wf( zJCl50h3M~Fe?O^Q>6rc_u8O27xj*%LELJDY>@zcHF%CY2|H+=M9b+x`bR$loa`9xb5xk#GNC?vtCb4Pdqb_KTA;3Gw}oM z;Vj{&x`{`m#EtGR5K7Fk3NTVG>`r)>TyDg>@?OHci+x6+mIo8e879Wcmva)d0}G6G ze)uHpt9fXg-mRa&VIX1BT`H9D@?@Y%>Xfedefkw9{0nO0>u!BF*=w^ezS+mjRB9kK z-tzYf)3k8c_?!ceO)HDl;{_H>F*~%DBYp{Ih*^MfYaHvwF|$X9&&7G<^_z7z7R9}r zV>$ciwIy-VqHAXhgqg+Vylexo?l(Dy9>k2Z@#=4>$v2!c}mXCSenJK z`K7j)*x6I|Cq(8&&)B+Xcj1$FC2I z4ph2gt-jwRTIvI*&7By5=x=-G+bkG;8@0$~r_J-ZXQCQL-q}QYEsuIsqG2noxv^~y?5I^TNoKR^Ug=R`^Bb_lc#Cf zN0#zMF3e7~Zwh}E;d`&ze(JZ%hzd^LIetbN5tsDc=A5-~jNta#GiNrpWCVZYr#X{1 zw1?ZpX*n!zJ{PVTn(AQOmLG26TaZ`e|B9KIVWi@!&r8i^Qo(I=QwqRSuq$+A#xYO?%U0CT5&!vEI59f z({q7&VMVK6I~Ax&hTUDI;#|e}5V|ow+PSRkcxZ&}dFM2qw9sd)5$7N+>rl6Yw(~Yl z<_}$>RW#4I=GoGs15NYR>+fIc^jm8F?PbfBsu%^&7g(&bbgy5<{DU$>OJ;@k&A+nm z){<2BSqs*ET)X6*YR&?;uM3w9x7IAMzah26F@?{i)ct*k+jm!&(vuY-`(1Xr6g-Iw zIlJ+V%kqn}LL|>9yM9dCgT7iWao_4bJ7{yo5%)SxT9C$<9(TRRHGvL%Iv&zys{^w*l06y|odUg|Re6-9 z2nNRHj(B{sZ3tM%Y3cdy&6a@eK?R;Yww?ixx8C*iN|g-Qe1Pedn)1>=sleH5zx5t} zf!Q0plw1A%zdvm7^0$%mzoskZeITvPk2A*8+b*lbFC=HD_o4a0ehDEjy(Rh-{T@n7 z`}7BWSR_#C@3X(;;GzcJ{XS7=LKa;xZ}YjlMQM?@oq}(N-3MP!*k}#-9Ts-cW+kMJE*D*N z(M#YG&KJu+{Vo2bznaACLV5hho<_;`{XX&UX{O61=z{T82m7U|^0jd*yPa3sZFG-Y zJ~ASsl0F-oUFA*M$CnvfX7HSB+ank28Wljj(o?g$#&}A07*F5*DJwue^kQd>W%zRi zLYzemT;Z*lQ`8Z?!)8Qjm70F^{CcO=qvBViRtEO2S-pi4<=tVRk}Gg{m#0OwDxdPF z$d++AHLFIaNW0{d>ZzTTJ0D14G`~CW?KHWtW1XD;mWX3NhPCpz%9w+z_1Bwge+yr= zlC8sqH3+}g#ItcRIwee*FHm>Sv8ElT-?ZrwwtNpg=SniLc%~9MV6dD1P2MNu?b!iC zX^kVnjm}i#+l0Cxg}_J?zpjz(Ynxk4ExZ@Dy>k&XCq9$hc0ti^%>UF_NH5~pXdB3yIzrS-_W5x`)%LCeI)jv9D+r5c*mpE z9Q%Ua6HLqCDHTyBqBU7xc;V_r<`$-nDNR5m8-2{t& zVk?){gK?Ie^l7e&@-ddTLpN9W&L^z8ee+zqsUs}%%{AQJoCmDaAHBH!%=<&SZj z+!$i*cWdKj$_%o;?ElI=72MCVX;{URm)pxa_-YeRWp5V?eD~tPj<&N-8*_LH9=EVu z!e@9+c5+yc&rz`h7aLi`HfOAhZ#`@I+jOjwa4oA%xB+WZR>cz2ev7@iuAIfaSq8@{ zE@mBJ+2aoL7qIfOQ*iIx*(@_oHSWUkORVirUf{Cpvsjq#lDwaK&#>@fR=j6>PO$c@ zP2fFVbCl&_TF(3Q&>_~L&Eveu_WM{uOcA~qcn@nd)r7AtE0HyQBAPEyE{>(cF68q$ z7sYC*9O1h<&t&=E5Lo7E5z5l&)L-VEx{XB~U@p5^=*J@7yRs~*aSLnp!+Xp2Uw3Ee zjbQn|pBEU(S;?vkSR)uyBf%=O^%9J$A+Ss| zG6i4cEMx7GXcerF6Ovf1BX!+lUv> zoJ@#c_Z}bic{G6sM-tL9evt6?K0_!xX)r(eVT|yZnTDwKBpv^reLD;CU?$Jg=$b5QOio%}n5OG7>J% z-=8p!*(JQlpOSF1B2Tz)OKifiO%H@uT!=_;Me&Ke?hH!c%H1HMGv=Fc+$2HdI(9tQSR#p5JYl02io>rl{y7By0PNej21D)V7}zee125aLTSr zG~zKSVfp=UqN&D`2|Dh|V$`$vgy{#H#Tbux5@^mx#Ds8*@pF9~F(1m8cwM6zF;m62 z@pIJ_an6c~crw*Vyl>%QeAVGJ@yPDm@s~f>ieF9XjDO|&QvA@WoAF6?QWB`^)$!gU zRuZB*#qr6(@e=L1Iq{D;r4r(cr{e>J#w2h?N8+VDg(NRV?uq}HOP73jEH-}fb%bR7 zh4A>-%4|vc$$CGOQ)_0Bat<3b$QKuu3<6h2}Y_&*tj! zUp#xI4&GW7Uy`yQb#J3g{Q4_vmft-q5`T)bW%<4dTztcD#`4cni*Xm;G%c6X{S>!; zerEZ1>z8q9JXGn^7Ej{h1e~Nls@;hb7D|&Ah6-VSq;5`aljgx>*+H||yXEJ}cq5(IM#3%fx180nW;+(h&)>s~5%1L-qI;=6V+x-qxn!Ud4Rx7$e>F}D`9sTAVW!U=RZZ!oN>R0*R-5#E{RN429 zyWbpUQ3EcQ?S6QzjC$SZ(r)7DD0S7H%-yv=1Z7KYQg@$}(3iEXjoe+U945=pAFx|U zCtLQlt?TZKh6A#%S?0T4OdvVIto6Iq3{~XZ^OSZgulJJcyCA(=TPZ^>B!z#slNd)% z+v!KluJ7;VG)3OWoO~!F@5dR9DXp@V?{pi8sZL|b`;2j7avjR#H5@BqqNGOUjjJ!k zP#y^=WTG=;E}hU-AnGN@yfP0}msJW5t`2cy3})>P8ujf)mg@>e>D4T_Ek zKcQs%$t{{#(W;bk%PgAz)kh_z?>DJ z`urg(JbP66=$5f4lX8L8vbB9t3fDHS)|ML6J-((W>Pz*x)k3ysqV5)SukQ2M z8+G~Q-0Bsskx}k(3TqbieWO0QyR3;8w~q>-rL8&eNH?k!RlR2YA?2v1o@Z;)m8GK2 z93rfZxyBQ<#>`-?fcocMyT9*PYk7WrS7hFWwX~W3U6NL})^=z#?%MqF`&#~h!d>fG ziYi=br*;+byQy5wOx=}xe6Nc1q3~UDA~h=dk)FHA2Paf0mX^Ct%o9{Q1+;eU+G?Px z%AxMM(Y`~~cZ<-j0OAEzuQv;k+nBwoiUF@88?S#;ZR@`m>9MFlQ^uN`WRkYMD#*Pqp@E`8g%|2{<>t2((esli^|sr2?v|5GgWi;|5yX+b6G zQ_TFGqneM@)$5P#^#6v{*z-PN=Z$JjjZwn(o#TOi8YWbyon6A28rLcMJ40)3Y8VMA z?d-C9t12=UzpNRZ&xtU(KcIP4u_%I} z_d|2}xf2o3E-0-lonuAJe0E(IZn8Zh$|!AJV3K1*$o{HzCku5WdOOC}EjB4c9Gd6X zVs{WC3KVp-4mQj)C9MLrYO^Mp_xw+2DTNL&A4E56y;81cN+-Y9`ugB9^Hj35woBw8 zrr~aLZT`hwOv!D#w3kPDF@%}_Wg^Qb}tlx9@ez?=uvh`aBIpJv+M%LFi7KC5kfYaG`Dl?pYTSMp0me}yL%|1F= zVt(PeV~2HKH&}&txHaf-Y&F8Ax?kuJ2UmovsETY5FyszLAJN}%IOkp1{%64(u1wzx zr8!o!$g-I8D*l>V(Bury?#YXAasIaFC<{O=uTf!uzc5T#lH4VG3 zoU`$k^4c&F&AyEy(_&$r8s9b&a(?W1rzEG_O`qJsl3?f>4Bpxi@jYI5w_Wv)mZ1XO zn8x!vg09@vrAwyn@ZJvV4f_V|$d+5Jr=P{xL3-e-7vHA6<8e}|UgijKM<20VZ_hZ- zjyKhh^jz=13#A$G=;IsihMsDs>6ah69xArpQ-7oF<Q7VwM*#1t9%Btg&RZVziAqHh*Lu=HGB-(n7pB@0uC8yG){-49N)iySdFAVa!;cMJsd?ZNn%OT^^g@_;tN}Vy9?Hc54JZ{{hvoWa8W0?uInG_Vg zP1B@l9e0pTkeA8q`B&R5eD<4Ee(2l2)#j=R7y!Ke%-Sa=P1{awALYWDt~?aGUG=uA zDL#A4_VlBhOwZ;RZhvC3$F%9V{C4FJrKbCK@of*u7&iT4`hMFPD#}a%cV}BsiIUl! zYc<=>DLI*0xu4zUcOk(n_Er40MXr3at=qk~ZS}crhJR?Z?P%3EvjlC0ZLxC{^XhcI zZ7bES&98O53ykpHWq#z#?ZBOTFPg6xtqxqC-D!T4ayrnvg_i+k%U)P;+Is@Bx&$rj9ZLh|c57MI z3}ys05WOwy^&dm?Uh2DpjL?x*JV?(sn4!3##f>I@`k*FvB zHUf@TA!!`I5+7$p-IL>QPx=aAt?qiytq)cm-KrwZZ__Ulv3359x=o0` zxj$tb=;Y1_vLw_uXR$9-7P(D-@8eJc6R#>d?zF4?Dn*gd}B8g?ZZF7 zz6Z5T?ZpMgeMEUe?Gu(a`{28d+ZRga_(Uc&*k8gX`{>J$+xt&>`)qH)G8XF$eBLqE zGMKwbK5ciM7|qJC&nwF~#^?SqZ|CY92Hub3jUjX~Bwk+he&_w3LD<6b7GR4ypxZsY zH$T#Gm|mgleIMiF@Wg+GcO)s@VK95%OI5Yh;daj>FK+cAho>*0zB^kyqEJql zii#~y<1uMdX(N~Wf&D++W0|Ym<5xX$_mZ@B53a9ucdZO_ z_uP2=zup6ZS3&wU+7BpXY%Rh=^>kRzP>bk{ZgSaSm}8%g#+6(!98Ii8 zBV)IaF_CT$=M5c)S7PKVm5i(*d(6}pccU!X6bv$ESJtc=)4!qCs4d_HrZMQbk!PwT zmtvT(@trJ7E@Z42`f5Cv*j%XbKzkXNd;EFh<@cU)mEG$yZhI=sjf@3G=JbkTsU{6? zqqske+L?5{E#MA07;n<>@)7qE57j-NdnWxudOU{?qD-q=!g+S>Ut_vha+wDiV|?=1 zU7ko(nyJf99;{@AXUj(m%^V=Oun_V6KN{ocQ+;oGX;ZSllm ziZ6^dW3jVJa+$#wNz3DWmdlW_)(GEM|4g9e=PM=4Jd`pl=bk@VX01_cDIkOAN5&Q+ zV@7AMW2|0BGx<~3D_KRKxy&!T&)({6#SlL-hFhbFOW?`rEGxxMO@TLVEmrRB0Rk6a zPg&(PoEAXFGJeeK5;&izW=%ZsO`tZ#)mm_?lAyFpy!B-b4?$#XI5HP;duY40etn~$ zT;(fk{?K=Vx7!44cqC--$k<7Q*XyE(vkkXRBL2i^jLpDuHJO4FD2pOx1jA50hhS;X=K@$>4M{J85)Cf&)%Wcn0 z`Vx@2C?Jm8b2#^;HS) z+)`)v^4v3FWQ;sAXL7IQtleY0p-AZ$aeHkdRQmXBk?NjE`w?GQ zlu>%zK51A*^qgmvy|BKQC^GgQ;Z=JrKW%^T#SPJ3eF27+{5w%Wd1c0Cw-sW@*jHps zEpt-K?3kx%VSRm+w09+-F}Ig6jU_Av6(( z$lW6q*<(kO>PL%%IxjYDe9b{SI9Fp&{a(h;r^Xsvcl{WPcoKJF>uSCXXBV&#k z4zLT4Bv!_)U&Q4km%2>8sDjJnlPxmH9FLJJ2V`a-8y63kTA90SFBhvX<1&LH5iS`? z0z_mixZs>N@r~Unmtv2t#F-TZF4n~v#L27mF2gSxh{)WLpL1pPAG_$238d%h?_8#c z8%dOpKU@U)0!hf&bA)&9dasOY_@zb?W@@eLF6$}MWUroU<^+L^%t^`j-$=Iq=;@k$ zCxG0c9_s3;lu0hvi+Ak~xlTsLx+7ztuT`9N)vd%++9e8HMXs)=P|Ryx*JS%qkhw+( zUtccQ9oKHnI!fcwF<0@YPbtugx2}efeAFeLySHz6+|5 z`(^9o;@wWAew9V$E+IUDBy^_R14Hnjz4E-9RAQK1Ix5#K_sVHGWbObmCi^<|n%lbE zDY?5o&2Gz5@bX8t^|*DKYRMyWN*JHE$lnHxChy_?*6nV;5P@Zxu4KdyRXYdF+^tT3 zT$NjE?XH(3sVE!3a9?i+7CQ!WPmnR<-&SsNe|2%cqNV&6_i$pl;^VJA?w8Z}(L^Qm@(_0?DPyJ7Wnu2tV%wFLcmw6lBHjBMtCUPKquiCY4J)0#65}2> zH?M@uNkQgF_mbk>vpbEIiw`EaoA7K`Zn(*E->Z078JTNhMXOZaoRH+sT6s_T11{Me z_kK>fd~>q<-ODRhBXhM7K1S7!b2m3cpIcN`yL;nQJBnjZ7P@gL823Zvylta}v>-<> zKjXS*Y1I4!>!AjD8(EIwajAx!*vW6X$-ea*S7VMKvFzG9g7aKN#6q3ix*eS26q~w{ zvi7erE;+T&#&bAvpJ!_nGPS3m!eM@xA?0uN%BoshIU-#ks^JJ zYa6QiJl~>z^FvAJu+Xba=hzbb zC)rkaX>7@do-X6ssejg*RSyUV_qD{CrpCpop9bl+4oeB(09qjH%vwnB8N_JDi`CcEf){ZM^K zI{W!OuiK6hN$mRB6L$o^#Iq%yM-A$ReY}a<@o|yr`tYU{AH;cU-gHw;scA9WIREC( z4G>4y^2klQ7l#*n-FMwIJpplSc5c2oaM@$A^OVuex;+8;i4D{e3xc{n{^FgI2_o?r0Fd(${Ih2_Zl3^mGU zcP|j-uQz_Y!pmWNx!icj@ASgW{sWE7^ktlos))ugMgN7(mo_!}9TVW3IAhrO_Ji7j z_<5zqjy62!MZRz&wE<$S+>PDYrM{Pfv%^|bzZ2mapckF!NN$%a?2>o{c13#FdF ze$ZTk!_}X9-HjYH?@bN4o+r7Sqmb%!z4)Wn{FZkcuPX_y@*LgoXBy(|!@e`GB{yitC~-8B zgBpt0>V7}uA|;8%Vz6qsOvc1qEG7? zBYEGV6}s#7Ty!`(CRO#b?UCO~L(kW*sL49SXR5T*!O|Gc zRQ1`qwvQ`jUyi5N?HOfprloe&>59Dh3VFKK6|76+tSC0DtJ1FjYRQ`^BlG-epOPo!`r)oLq zk6#i!lWRS7@;QUcLu%g`HhpoLaH&;GDC6+g(QAA59r?0wa&@ifR1HTyNuoCX?&dEU zyU?|8%ni=^sCP9adF3w(DS)p}rJdt>wzXy`;oIl2>t!|11p7GUug=!gjC6j!O-ZZi z7rn`SzZt)$c05a<<6cs>TZ6{^q zan%^v&`;R+0o9U8gr?v-4%K;e8$LO;=vB+zSl-lnL#g_J1K+0`ZQ|97B-tk8VRUu> z=La7>zP!JhRlKH&hd6RI^J4x-GpEk0-#2SDkxyQ|I%600@yvMkRbfqfQ~CNsSNVBO zK5n}Zb9GeRs;QIT|0=3Sb5pXQ-qrWVp3O{LQo0(Q>(%sCPvYu~U**ir zmzb;TC4-uDFMg;})J>X+_IgrvvNEzMY;{jnwT#`20(V{29%f?Gl~-4)D!{7klMjzp zq1_HNeYlrUwQ>IKhps0qBa+SbTU#rV zNLSvM9H^{NsFrJ9ej~era5&<9_Wa?Bh^uPN8%^UYhB1ckzhnhfJb9qsd<$}~nAt;k z-?qc7!c*3!`ROaoia4S1cNC^<#k-T6nh$e{RGiGKct>TUDpJ;LYkq0>q1?kP>D?H1 ztX%BPu4de=zVf#p?cQzAYAnClpW2MxU0fbeNPIW!bFN(EL1y!7m;L3FLDO&b++xZ@ zu$P+e`v;cq*W$dbPIM{H*<9BADA%Ms44?7V=7C0e!Ej@PvVp~#ZiDlJLOP} z=~~q3mS@?%rCwGouWpz*mMWCzx2P@{m5NUtd!=_nqtrd+TFc7=a;02H{a&g0iaA-#V!6yoyEq*DpUBI^~KU#FSYjEFD_>Ap{BeR zE)*|pxY~Mq?a^YTm^&|IcBB+DwL4m^8zPI}e!lWzvq)g^4)=$xjNR_VHA%Z(D8IET zesS?_>-%86;!DzIFS6!TiwAIUo8~cUaZkJCi<{cw#VbyWv}wJ?6*CfFPhKvWFKV$+ zXv4(5FS0jpoZRFzUUZeTp{;Pk-J<8DBa@$1I*Xo5+qG?=H54iGdQT?nmlj!U@N4VZ zbg4)er8X&?dc5c!E4t0++TJ1^Uara7@4JiQUL0%_wG1uNC*OY_pXXhq5^<^RBi^Yf zz@p&!uDxbOljNE|sMO{?l zb4BkTg-39o+sxHw3Qr!MnMfl{7IvBOwm4)@=8q;J*K4yQuL;z#t7jD>0cWh*Vx^Kj8GZ zKIEWXV z-8R+nCYZnA%Y?*J;p6Cnucc7umCm_*+^aWZ*}T*FqhgYsyzZ0vrl_W|@tTo*!%M22 ziljUFJ*!WQJv-f%FJfcSiC@XdFAv@}R#9G)Pha8N*=bjjFLZO`n9GmL`Hcc`ou1du z=JU!D#zvEl=0}rHbdI>B=U=@rIqISVrYyLYcG@cM%2!ry80}OH$qy>;=xo;X%Rg}I z$f&N}ru-l`%g^h=v^j-Rt z_qi{w%RlH%o^FWGljHP>yk?D4U2gItd1ortJ-I45l(+ImMOT4jZ(c7i{}V0w*1T^4 zyv`{^#~-f>x|(OA_M+?XrQ*Dm^RMhrCC9^&>+Yt@60H=5{-%8Rw}_WsD?g>gI)OH+OrPuFDG) z4;XpBRVA-#&694`%vE_uJvNTW_LB3i8-45U6PC{Fsudnl-X@wC6D!tZ&?}IqwCdF( z{*BnYhl8}9qYZFgUpePdpXvA9TNbuG?N2}D_Su|z6tnMLuEDdQo+;g_Tsk`RkqBx$ zmvTP6XK@hRf%=Rd6;#~K^^Iir2w&*Wohe)XNcVJC?z_G=Z4?w?RE0?&fT|j&jaglk6d2C*S!*lTyoz# zZGKQw!^o8lz}-@KXPv8PtMMRA%{;gKiTtfYX-2sYUi=S|Ug+hXi8Q%o<*bvNyzlw& zyFty|9;L0fwr{584s2Ot{NbZ8p(_71~;BysPWQGlkmgS}%g8E!J*j!e^?0uVOnB4IN znLerroSV+Leg6?-fz5SDuP@@_9NS&5@c!Gm&+Os#Tly?~X4w43Dfjmezhj&6u=+|p zUbE|cJ?_`Md%-rCxzKm{@B};hoW}jg4NuwS-*5D-o_);rdLwYZr|BU(kuut6cji8O zpYznc>j^{bi`y3a@XXt6zK2cstRwo^v$tgWnaMruAG^-oOT5_0jQ#}{nwja+DCpDIi0XTc5ZfENn)_?dNV{K1_5z0=if-q)ym@8YW1 zo@p)p2I3X$Ozh*k$u~>cAr~h4%Oi`~lKQoGZ)q2@6^FP6?(^ldtB)SNJMfy#PLP)$ zsC#gk9lsECH{?0qRFcLly?v9sj14^&H^XHQc|cdhKsvh@ZJ3=ADT z&F*^geaPnNNw(a%l7Twi6Ktic_l86YkFj-=`UiX{nQY}N6+=0N8Ej_ihk+rzBkYON zgG009hu9@ogl`KTKgixT6fh*|aDe^bsm5(F;(qoW5yK(w@9FGu9oO5hp6z9?3tKtV z^e~NGRk{22!O=bJlF7L{mNThrO_QwKKM1L8i|D&|*aj(V=Px&J>n9|$EVpoD)aNf~f@ z&>;ro4~~P*IW!F^z`-yFmP7rHNfEGp*g%2Me(35?N!;Mv2>*3vh!i`>3vj0$gz}+I zaAwl59efZTfO-EU2}w@`j2K!#3w}^4RQflPnBd%V0HP^K47P&z14+_nKmziK`h=r0@SZwitCn$CbnU`>=3YCUQLO82Lp zu)y+=^yxeMhK6VX*c=*yVHgFYQ7{UHLZiVSL?TE8+)l7L zf`7_j!TTXlcB&l&)%inEt2qjaK8}Gl)GRC_@whU;(*uqV0RkB${lPyt6#_y2KoB8{(1IteY zgg;bc2+C#v9vndwlzkKfWydWndPRZ#V4;XakpB%J98m!2cm9#z5#&z=@zda{JH7(o z)B{*d!TEfIA&JA_{^7N-7?uF=URYc_kK_j=C3uiN@Q?gfApb!S9{^i4APbq$20H*D zQ{p`sqVB^$#fA%u<*9%t=gi{bagcuk5KYX2Ysuq}{6-*o2FNP{Hs$4Dzd8hstOoa@ zdKel=#z5!g7Z!>8A?V7n#l>Kde+ZDGjDY-Bf8^KyBflTmR}M%RrhyG0dhX1EA?a8Q zG{v{D*n1d){0=WJQbB$WAmQMEv>QNvgv&<@R&zhU3UCAg(t_b67+S^z z@*nvDTqqIbCxZMEV6~(`DhR=UBYzmW5`ckv@6Iod zodEkmg&BeTseqs*737!rBfm1pzZ2xo03ovYzbi-+2-1jH!qD_443yq5zvy}z;A1T= z=7ak6dcU|B2=Zh8$gcphd4T)~uRt+a6ebK1w+ug7Ty#}|p;;RYG<<1(QTi;f(OAIY z0qS=HAdj&E`KN#U;@JUkA;g{#dsF~~80CQEE39{MQCbX!uIq#R>GO*l&VjZs3g`;t zmjI+Qz%-$eKk^enej>;(4e|#9q7rFk5y!HbLOKsV*!to_1&sDTHKiOuQZmGdI7`5)pbR#zODe{XG50@wnas;B@ zk{sdRCFt}17;#%Hg z3dVUcH1J;^Y>)?wD4g=0NJ8X`C3tIZ{N`9hO2chjR6K-}0xUFz_GtUUu~y|;8x!MX6AreRSBgc_+NO~k6k{^+S$V22J@{w}>U*QpXZ`8=hR;^p7RakXpUu_w} zT`=;dq(H{pFMm2vqQqRruuhZwsk34-|M7@Z)F(to|I8seKy-qH2u6@*3^@nnoRD)w zLL`pt|Ks>S6Z5~m4|nP?isQKlbIC9Og;#zupFAS^S?Bq&H?xVI6UaJgwRnwt7Acy6;QN{cZPmo$a=-*M4%q#q03+3t#ZkcBI0D+x$AH`M5#alK z0Qep|0C!~jV(X$D;8|1v9E*y8Cs7t~^AQ0bBN=cpB2R&8pf9Tdp1an8o+Ax#@vQ;; zfGU7*aXr)x*d=cPX34HaCD6;)fjR->2;cn`4u-34ru1AuYxHfWia_=k|QM|1;j z0Y6m%)bsQI&&B}!M|8EcA^VW~6p{vXmwu*0LU7CevqM1wJm7+c0X8hefjMY>0d4R+ z&UnqV`?0MZhGQ9J@XC|IBajz&cbbfRqmt5X-;56_~t zQ7p(zKv1Ala1L%lcc4uLW(5~vb4U{vQYhki-IwzF0{D-OJGiL5pDakb%O*DbUXkZ79j0}^#!6qO_~Bt^9XRzS}2a7 z9>4|zbXWlcXck6rX$k0~%z)kSpkg3xfUzI$M4O^;U`X~HY=#m9sI&!U(b1?TfUpxF zX%g%JI0XSR7Gw??2raFP7_X1V z;`PZmq8ZVEh$Wk=z+^L;IUPqcpg|%iJTFn7nobiU+N&gzEmX|Z@%VJ29WfD4Ct|7l z==)UcX!i6Z8lEgfOCp*ZSH>DKs_ClVXtBV5baapr6tkmG$EQk6-!M7DCop= zA}_$5L`0E=h!ksu1Pd>6HS4Ch9jCv*dy0JWeuLq3opl!JbZmInRB zBq$NOh{iw{p?NeFnm{L^H-HD4M)YNLEBXRD8S;RPAYUjMJ%YXfo}07KDQG|F3OWVK zg07>_gZ_FdbRJxAM1T$kI7tAZ9<&JX7ywkG;CXW#tqJOE6#ER@ie+QdumRXH3=gIan~R;m?#1R|pJOMn?br_N3oKGH5ktnp7&>Tn zmJs-04MCYnp!{S|GJ+-rl#~OI7y~?)LAj}*1Po>mHW7oA-h`C{<+p&cvN5dyUm8F$ z4$5x>2;@Pj0id)AEC;g}U_{F902mNNFF={UpFbUF;Lqo81WHT>Xpr+q%9s0zqzRlo z7brU$BM;ChU}0P;z|{=O<;I|JW&n*T&;tp#3gF;i5N)7wJQy-A@TWGg7z11@)*Rr4 zxW+Kguyh;+hruZVjEIiXfsVFey>a>>gY& zb}Q}$HWlZOGr=9izQh(``7mj?Zfqi#DXtj%3afxyh6%voaI0`;xYyXdxE?GYE)e$y z+l%GJnd6q>6md#8Wt=5$AI<`|4VRAFj@yqrfV08{;ev4oaU@_#2Ec|8y;6V;dH<|S zq-KqP9ubRzAfz@C9jE@ZC&a>#I=uok)(otv1=MO2&^J=2Y+ylYKr7>*4o!h>P`GD6 z=TCv|VVpeBDPm7%pmv{wItavKaOt3Cxq#-7Iws>dm`*GOw++;TIj9$Ipu>GY*Qc*M^y($6iE8tRqCX0YR18|6LdqAz3ff`7{;V=iWt8i&JE1)+;oH8~Lw-@NM80gU) z#|QMri+KZT2GQYm93LhKXw?#z$h8dU)e7i080d5vW8_|fwMM@^65tB$Mq;{eS z5l+v(U@dM;-R8Ii@lfFOzI%+A(@aeNW9b*QWFVB9U$2e zO^G}tK58pz85IxO^fZzkIh|-q${_Po(PR|4lc+BwKph~rk+7t_q;?V)9zzzS;wj*6 zLC&CkB14Kx~lGH|SC7Y4ENjNed z&rjmP-y*h?4JbwwH02P{n8HgwKuRa?B_~rb6iebVQWLqCXiY>>dPsdlE0Q%Sl_Egu zAg55cC?*tc3Pk86A0(QS_fQUz_LG|_d}Ir98f72ZhSWt)q8uh3Bv}#7C|JBHrI*A* zxkYNBz?8$JBg8gJE5(LrNfspSrSOx@Da**Vq<-Q7ayJ=EX{U5h1jtR4K9W8GhqoqM zk#UrC$|3ST3NPgdsh?y+?xggP`^dJ$gXF_xONs^M7P*%!NIpQZqVQ9?DEldi1U`x_ znHRr|!XXGyj*zV>{P=^EZb}cOpL~d-FU*Ixq4ZL2Q3NT8!iOog6iE08MF77H-$&sH z3*!4Jzj%<5KH#4n($7O2@_darBt-UsS1bS54jAWuIYd6PA^k-}7Sbn2`k(?}`%j!b zNQ_|kGhPgcqrisrQ;~iw(oaR?BO8Jl!GY{wI){uOqAAn12{SdxY01Fy+`a>gR^ zR)Gz9nSzw_@0=hI^1ECFGh%0mE|9v@0oyvTZ2_AS*p_S%{QZ}%4gm)`Nk4yo3;z`d z%fI3V`B$7sf5`s_E`@)!#y^7PpRGOruhv9Q1kc;h4?zeuD+A%j^q|B<7Bq|g0VT`K z!n(6#==8mNc@96*5;%M2jAT(^p(29E2{?b?n9?2L(ZDtH$iyX#@g!j9VOApW(=r^^ z51ug=gqmh0LbEK8hlspivTqjF|4!ax&or^sZ#1sb?fQbArw{*?@9xmDI@B0yai2F~&C3#3bL?&YD$bTeU+K_Wb z{v&CT5V;nS5NTVG5NQvQa48+q_8{@4^vJb`#Fz3d-7}DO|K-VyUmj-s@&x){J=x%|o}~X*|L>OL0Hbg=L0;g^Qy>%s5qyyL0I_g_!7u;&8T?-2|I`*R(+p#} zF~f*qNYkKc(7_uzvIbd$L1WMevcEifnn7ZaU=5nOJ<*;>SEH$+rpZ(~nIJ+Cfv4$0 z26)soOeIrjWS9a^6NG6(@U$wPOu$aVFfS|!6ZSBY2(TzjPNgRkQt4p%PdL>e5nTDn zgcMp5oT8dY_W9-i;rjlqw*Ol91o~g={vTuizW)AqQ~X|c|7ra9y8ch&f8YN8?;i!0 zqrp(8%hF{T!oNIfnkGx9l10g)@H7K4ifNh%T^OFW$J2z7Yrz7t1=oWM7%NBcqkALm z0@5BJZ2|17>V>ogNIS4(2TL`+bj|;M2l!pzzw7V!YZJjs*PzMLWEm9T)nN_PG(aoM zAQNN(ULl$Yhzrw&?TIiIo+gXX2>`#a0e;ESCE(>S5tfAsdznd!@M@R_6ViN=yc5^K z>*0+su>GW8b`Pf@cRE@)E&TubPWMM^u+%F29{zr&|7rYp&HShF|7k1q|LghD)68`~ z>zJC1bxaK(O}ac?9yQIRGUR+@Y4YG0g-M~y(dCeVLEv*PF z4wLsXlciy1I5V8EH$0J+=9A)`CzE}w9pa7Gd>)jm;nsa;O` z*(yhnBaj{$!S|P6>Y4pluk4SO8o5jT*)Ls@|0-O%e=mhdkN401_bc~5jsK_i{(JiW z)ZTwj|G(ds{(T9++T?xYnQ}~7^t6whj~rrwOe(Ozbqvsk{j@`Inm9bo6s7~40_`ys zY2)B&AH-y)=_3E9J*ErOgn6cuz4;&Lr%l`O@qE#l<2e}i7(ZqqqDGXV%I2q9@fi8yVl7Q?LVhVw) znuuJ#KH$zq7iA!K4H3EsEC+54(*!YZaP87W8Q>UM6x;*By$=>a?tRHn3p4?7fd)VZ zRsrL4bzwu;1O`1q@4xg14d9>tcf|kG7L$MZK7?ebf|Pl4rFX6Zz6BX+3K?`$1%r|8JHZ9>6q!r3}E_K(tmk^ zn=0%o>@uA*o$2m$cN*|H4ml1CH-=lLQ>GL66!6pM(0_TZX@Uj8BF7-d z0Cx9ry`+ChKiQe?mT8!2NONPjCOi4Kkj=^Fncyos!-eStKBb!_8zvk2IMZF2jtplX zC#D0Cp#95ds{Zn@Ic$DZ|ENCQjBb`}lx)PLGwF0^A4js*FP}{N7$cPeCRY|^mH=#0t9O%sSq@MKvj9GfIhq--Ds)b4r{;~ zzk2QjS)}KVc=R+)ovvoDLRP2KXlev1feLI=h%N+E4T#_#1N!a+VFIv7(02#FNben# z0v&)3Lr0Vt^WV0d-M3V&MN=^%3Txa z=I;BAyToo{yK#3{Nsw$MapDcxY1)P~NVaS%ktO#^auyicx(ftoLrr(K#x2maQy2_% zSjtk1p?oP@&AwB!7iLHebcVIR_c_nKS67ac!gpTZKYn#Tx!ZG}`z+@<=RD_}=h5`y z=vmRTxK}%Ue$!b^oK2oOdFuF*i3>veCQq9|pPV@X@wYE|=8TN5vqEQu_C0rO{LIk4 z=@T99Pn{g)eC+heQ@C@&_-Ubi6Q?G*KYhG&I^+6`DRLM;)sg!rkDq+VzH_YEKmXf$*~=uM&fSpo7`=p&&|g{DH!guW5_ZsNm!3b#7WwC6YgSYy6g)+md6|w?(R&ZdI9obM%&)Vofpb#GUG*aPj!{p<7>lV^cx6 zc{E>B5PlwYn(|F~;pg&KU8pXE_!Hjl@pqZ8M@EFphw^iE1>yVh=gr-{qgcCwe?k30 z&OM&*9fSIToWC5;f4S!&mvbKIc-*TF{x^5F@XuZ!wr_Ux%;wqarZ>-Y&UDUhn%X@3 zn(6CiHcf7xT{pXK>bjZNOm|FoOmt0j&90qYJJ~teIkRqN-Bia^$8`I2`*_!Q7df=e zw#}@aSv%P=*)hFtdfiypSl8^D*)>z`Q|;rO1$#cJ)NZM91{n>9v#X zlkLf_WY@%Xq0NWxo4Qg)=Io_ooil6VUE>|Im&{(`tZ-J$TsCvrM0g@hisq^2$tx$X zoNgQIh^~yToV|GV;wEBOXD^z)X!`Q$%MaZ*bLq^bH7jdY&Nj_9B|BeuRrSj1m9xuc zmyL(V!&6sGUBNtR#l)49%`=xc%cn1ku9&$PP7$8EylF*p`ShhT7mZ&zdBvgoYF5;& zm}s78o@ttCs$NmOVrJRQvQX!9uZk~^FQ2|-`VwStci02Ts$cpXwmedc=*{1r_P%?Z|s7x3##@_ z)JB(1otuR3OrAe^{`eK4aMRMJrBmljox?XSa4wiw%-{JF=Rb8}=t_7?^;C7u()bd1 z%X!sH$Lhvwxwj~~Wb)i3c{MF@>L!n$Jicn*_~NnJnk8}WO;%4Y?_|AIYs@{}apXzZlusqmf? znoi~24NWt=oF@11%l`a|@TF>EjKlO3Kmoiaw=$&;dz=7bP= z-E?eR^pO)ijgJ|_$=CB%2;IZXRgVwN?mi`SCbQMqv1Os^-Lp4c9Eu_72a)ExLJx!< z3jJ&7qoGfSo@V`(;Y+^={e}$UH~l{JV(3qBCz;K@6jCdWJC{{Uj#KmUR@;}G%f8$= zonr}~s|mf__5W5=`v3d;hwPhKIlE$d+2(O1`|Raojblh{ zr*U?1vT^o&W)F?C=S9zsiljSX_V`2hy>M*hUsI#`o3Vb+`mn=7BEdsvAG+_))=L&a zJ)u{kSDq9)6;XUns5UgyQjd0f5gO*9`)Wf=LJgr%$Fk7Hq02%|?aiU;_NQL8JR}^U zrn9>9(0$V_H67E@=}6PM#!&V0>g7|d$#qjL6RT^&HQ}k~WDIT<3AIPpO|~Z2POO@| zX!4@?+KE`rl{HsRHcd8FUs-+Sq5CG6O)d+q`_QYBZR4w=YbRQrHDjwME}FQgX>Gi% zrn#p1(0${vHJ6XojMYRhb1tr~ zt*$ki+fDXOcIfi>rA>=H+d%S?=%qD_YZfzj;AqK<&E5jr7qEUnggn>D>+ zdd18Y{H>jCn`vBfAmN4^kjW*Y*CiX!nob%&18%%z@`9Q3 zrgD{xp&)z<@dusRWTW8-oxqEW=>|6NTY5pd5 zPwXD&Z+3_Kw|!Rs#&(bGcKDm!X8w{ln7`Rk^B2Ft{LL24U-Sm^H(M}&O*fdo*}VCy zxxxI+I_}@~v-(%PyL$HvH@e9Vb*$=!XIIU3{qO$Ht*WbPs=BPInb_xO zRjg`lRYz5KRZrDbRo7I#rfPFlvMNW@y0Pl!sy9`=rRt8V zJFD)hy0_|qs`pe)-t}P(Untc1%eIKlv9G|TEXw~>V6L)>AYV6*o2PWPgzkmGh zng=GvC+k2W9o}{13NF4H2G_C%%7(vdq>Z* z<{d?omOrrw%U_LWX>*T3&3V4_x!UyHYtOgh9X%hacbscc{%5Zbq*ec;_Ybanzx>lm z`_Mms#XPlPx?!e%s)4hm)Af@LGw>n!-_nVO8PW0Trh3&N^wpZv zipHVbaH`QMX0s`$v0)^WC=BGB;dHKXB+<7uF__9X4mgS7)V7?nwLanW7t`5XDnH_+ z^7-_@MNN&Fbka#UX_9q2sezP}%Jy-dclv_Y4Sgdc*2eQLEpFNv+qCh#eDit5P4;>D z+PY>tJDT4-kV)i+Hm9@c!sd~LQ%D!mxvV{qNM}<0%_KW&;X&TbjimnJv?(W%Pi@|s z+M$_C)-RWPUv79fUHFHS=Tn8v#moPxvKI1mg%hotouv6Jw zad61a)B7nqowY|3nPQ3;i*}fQ4%!vo=cMP#pW<#$!AWNat&w8jtSwuR8|zz!5{{Kj z4W_eJSMQow+^V2Qp}NNIT;JAIp`(~j1y5UY{r)v%+SMbZ=q2Dr3Bvi+Hq)0@a|HIYr`-!J|0 z@aUKBt&08@JSgX1Jv{mi;HCK-_kO^$HCKhAYkpOJe%C!!(RY6B@aV(f58z4g9qmf&&7U|rERb>r&maH! zF=2t+51!`>h^u@mT}TNx$QM$XOpzedtgwj!EH7^*iUWg*BzFq1h`hBm0Wa=PIaZ&Z z!1^+&?dh$#tRDL~!tn|zCt2(pvJxXBb|#mQU~Xu_@IDkq#-TVuU7>c7^TG;$>m0@ZHc_SHIb!T?Ea#)Z75N&`x05n%kIxv zi7iF?iwfql1L?t{ljuX~pqHFff}3vdq;qb+Sd>N*py}jz>I^3ObJ8oBbf3ORMhT~H zC_S3X(=~lVDTfp3o1An@%IZVPWfJ6~86=&wR9TxnmrwU6`mI7bH9V5zFr3O23$#}z zx5Y|iDd$kmadO;1J?i6iiw_T{>4ah)%|~csC`ZnPlzn|M&1dB-F`To8Q+6Tkr0inW z9!XJO%9*gPFQ)7~yF_3m-i9Z^VI$cuW?4qEdBDk8-kruV2^CN~J}pnWoi=#1Pjq@=Yi zq!XERo}!GVXs(o%M;GJFO6Ia#a+IMjSLAJ((374XI)FlQqAU&ZMJ%7u|i_d>d5J#l_ASFxhB_bIS9Lz z1T>l4TSaZ<*pnF6>$QojwJMdgI!X^aR%FDnIudDXZ7~ZnR-{P6)QHu!wP1DTMy=M= zPHTO3u=Hf6kmgButgQtls?%N-ThqQe*3+`4J+eC1xyXt+1G&r~Ut)Yw+YvcQIfX^m z>heW1vBmW(Z0p)sTYJpz>5jK`@-CHWwV}NsbVEnRQ(=+4alU&!y^(nD=2ell_D$Bh z-0%q0kxXaOh0?=?{BW+nn76m3oqqYca81}jgkH5#}1Fi(b3F)L!uVJuMD4e3>BCL4*Zh4iSoC^x!3gEEp(07)ao z0&f)31L>Xc92u0AoojU>aga@0U78(C4VV`L!%8o^rKy^CAKbYBn`cV%Hi`&Vqc(D;a!;x(~<%3(3#9KfF|f zDA*KVswy>~mq&HzXsURZqEPS3S9@ff&21iSPQO@zqV}i!yHZ$97r1BjFjP`@ru1-e zKx^Ytd{0}e*H9^WuUA>5w5H26A$caVJE5lQ9|KRe;K-HB{^Yh$FC&r0d64GDy2 ze{N7j)Yke9t-Y3#ic=gZ=+*jcGNmk-ugLt@wwPMyhJD7l)LuX2z#`G8QrVRj7ozwH z%atl9PszH}6_f&H2|_IsLm8`eS+m_*q%G((Wo*kxzOD46Gmy#@mZFmlnz{;`o|n@H z35Sf5()sX$H3=s1OYKf18`_dE`tFXd9@;?&B#*|7RBIbVMp|o9JC>rhEuu;C_Fy_$ zSe##JNgqQ)be#5H_#zASHEVaHZ(1$g>+L@5J3~sGQA|-o87Vuua0-FEK|~LHLyTGl zb0rEp3aE@ut0#l$V_WIrA=<6ku8q{yM(b)@>S|l-kiaAIBBm`Y7PUQf+Y%%7a*yVB zY!ak0atR;l>*}fRNEH(O!ptEmk2a0$41CS)fkl=XLJbVldS&;E=x!~ODpqqw?wp4e z+-H#$g`9a6y*X0f8mPApyG$zOEQ0+MDV2UGi$O0NNTsb)9Hym2zMBy%5-C%90-6?5 z(iBJ|yhW|P`TA?3bJ3|Qz&JioVX00hbywd6!VHz^jCj+}S zm0fD5@}SUH*KBpQ$6D*xlxJ+wbf%x4Njt;!z3!AjlGsSI`c>UMFl%&W;RGD5o*i(6 zVP=8WTIO+fA`4RxRX1iPZer_$X+GDYJZ=|Q!-0e+|Fe?f+v^T0Zn32%OF zk78wBoi3~?Ceb}SULZ`VHHF1btvH{x9ez2Pau`iei{OzpEuAmSrwlNtgn1q4k*nz2W}J#jO--F50|qm4 z<;+JF?(6|FGSi{O`F@?rFBWZC`W}XtEj{U1P3AY4O@}e;LVcpNF>w<1YrozMA3tTY zrCnwBFh6CSH@NJyvo2Lc_(PxBG%^w5Dsz=iv2sAYMxZzQ$&5ykk)Eh{Gl{JN21AY6 zY+2t8-tm$Kc$|OB=W~9B71Gj_d|CaaOAY^b%idGxHa7GZtbs73{?xFo1JtVyf}76h zH*6=EU;r&hXFMi_%I}IC$_ZK%GK)FD!wu;a;{)3ODso;~$^jC(%^EC&*T#N5@+o^+ z{bj*Eii*WPTY&nO(zBF9&o&GV3X?}BTWw5o+jC;?a%^n;%vKq~j!Yv-5l;xWE%Wzo z?zJ*aM>MxadSh)iQ&)E?+bi1THY^>~quCyz9~re_8jhBPK2}(rP;x_Gz3Olch3y3+ zO3MRRCmOCEDGUZdVkELZM)`oyR1z*|8^wW{d?s)2_g|OO56hGmN7#s>-`7u3($0!< zN;k!6nq@nqkJdA*)6vLzY zrJzb89z^$PRJm^K76nWuL%{->oKz(jmC+jBN_Fh8wk(x$%Tj*cmtj!(we3w|ipnN3 zXvis%AhdokbK7o1tG~L}E$-14~AnwIsgorm>+aVNHOO)oUja~89&RBdC z2OTzjoO=bi3>1f~xeIj|8COro&5Y3IxVUG>bHKnC9QiQS`}z`S!XWje^8J-Px- z$4b2&RvOi2m2pV3wYzHJTnQ2!sY15c51}e3m#KPYh4pH^oICp5yD~%AN+TMJP};hd zR}MZs4t`CBz?`oIAG>tlFEv_WwV7Fs*Io0ph)eK(gH+@tM6Njn_|MDnozgur0^oAN zoMapr+B5~TT>_Rwa$h(lr(2P*BN#CT{b>mI+lB7;=VLyjG-GIPG5Ze69E~DgsTCNW zZ<;(Qf@W0{2^s z4At_JU|#OX6bC{h@_}S4{I+xHNJ&&pIohJ$-MQmNry#D`MZ6bwSVX2UTceYw7*Z}r z_ilI=7b&~d8@syKYUyf?S=YApMtZIF?QN)}sO@^_#opH0-qzU`Q*~ACt9oYjU>)p< zbXpx<*r#K?y-U`ukN31)rRP>>SG)sDv?mGYG3%A?S+&Zu_mPt)JJsH3#o`p9z5U>( zz5^w4C8akIq@Zo9q^Lbo)~@ob26@1I^#q;5Rr=@G9sug%SJ3}8y3w# z9~O3uEMkgb9A%P4Q0YT|w%upOo&zUCSffwqbT;@}`OD2-c1Dv9&g<0vV!jnn{nS|J zt9_D2?*!(s8;o(lu3c7tVI3w6DOYW0ovZwN#aL8+u&VU1=U~e-4prd^D1v1*t`}Wc z%L1@|^Iy9ciZI$`OS z&Q@l7*w{-?4C-9eVaA)SPiO041@#^2eu6RTBiTVX)WCti;TNic3rI1XBHl??dY0Rz zzVyyy${E3cr(C$QQL*M_hf^8EqMbm9yI0ao74_;))@ z=GS1AKZ|@a-UKlyVw`6ZN3C^SwY73+VPH`a?r8sH+mkc%SJe5 z5gWJjs!cz1E6=Dw3nWv0OKAb8Rd;`@6T+0X~a>nfAc_~D9Ar?2tVUxou*I>7%v8?NSyn{&u zKCg71E-`)?sj9rzAafvbVqtr z6oqaRN0+=sZ^(0-;7)OntxYVo=hVh;&S<%}-6lO)oA|9L#vPfBN*^5T1^H}!tV{&1 zFKZ4qE=6P8`4ev4aiB;YA{sdXvA|w#K6`fWD4o}W+v6YCDaG*n@m}2 z)cfe_2RZ2@{~2>O7$5|j?{jicYZj)UZY?S)?1l~(p9Yb?gfnTx4g;DJqwo)>d8O=+ zHz5GH(8Z#bqMO$ei=lMr=|D;%vyFiD}8TEE8&(y>WM=_Ej+IoC`hb_`Vnp&Q5gXodUGPzwc z|K}R)IIlB)3Q{JS9*~8}uRn31BF=3s!Z7$Wyjr3}%tHcn;%&X_;}Kh;M%`5IV z0HY#(i^QBsd$?g{R>Xvx*={hJ`!0PG?TW`E@rsxIk}wbL>WCijaSO2_^S(-vy1E-G z^YkcK3qYeru4?P)YSxC5c9yaRgp!1QV8df=K#qokZ9B!`5uqxLGr)*Ql-a0%B^h|n zg!YAOAXD#?3ET^WfJo>aW5SB3u#X9)kQ55&PjJV5%cY=lv`1+V;T}SZN)VDwE|22Q zklI=C34g>{F;NIph5%uil8RW5T#|Q*+_NH5aILM>L`cIF6aBo8SV9Lyf?$>MO+z(~ zEvd_Q`J9PDMB-+Y;7!A5v&bhgh?sM!k@qESyMFJ9w2+q7r%|CbiO*;;O~|WKKC&ve zjusg4A@UwZgZ6^okWr(Yg}TVpk4JcEhM_!dxDltAN+uWrInhEBtPpT8ySlIBrD-+r zvBByt;)0-cOCL&zRT+uqC&E@|;uRA(gWKr>%{^}y62nQ@RhHOAF&IGITX<`S-KW7B z;yI>7USUh0An0wlTv(g&6(P1$;v*$6V`@(n+k;bj90tn2LNJR6oXAUfMt3ojPf)Fd z;kGs|P-U~kAi&0?Ric?3rOd(2x=VXt9l6HX_P*4JA-Qe{IA;$E$4m3nB2+^wo}kOU z3zy8@H%zPN`h?~Q-Y9*zKRuXZLT7HD2G!1JccxWy+g(FdVm%u0=oF46aPhL11 zc~GPRBa3%qjNZfu%36X3Ol*;aLp&^f0CR~Bi!P?~smIl!zcVLxZh^a$XZd)iB|t+S`25FxUr9k8 zxP>(mTm+T!35bpHsFkE^xkV=uoPjfRY7b3_*cwgrl^&;AI}yt{SlBRDTOlL&!_Dw9 zz3C0;sn0|S1}>L-rKQ(2lC)^2|GsJrBWW~)7J@Lmw|f)A3`HSmJ87aYd`=~nU12=# zhoQ<$%EUYC5Mhm##77ISt$5<4cf&C%$ka~QmI<;5(4`-5u?lNynWQzX-tj0nL4-&! z#e7*s_|Jq`NDsJ_k0H?ncH6K^2?`Omo_DEprR9w~(Y*T8(B0fXi>QWXtFIOhwZvpg zhm0hU{Fw};>h58pvuAsQNzo&bXviu@LJ~xka_BN5w|OUH=SAZlPB7pkt_@yzMZ~70Ml?L#sE1k(h`mj;8Ac;PPH2Oo z>{~D;41jRjyeb(U2h+k}kr|N?Y!R{yZpoSeaGBLhS(1j=1)m5j3SJLLe^_m%(Sp_U zXuLd-B}e5}xKWuei@IUht1$P3W8vG4w6t}Zo79{kLO{Ehj||iR^|?8fN14!RAR3>K z<@uh8<5*<*dXjOKNz6Wq?$jR47$P?+US;4ZSMU@E2O~noYhIB=OpL%Vn0QblcT5Lv zGE+{C$|L1e8r_i+7GxqjOjju>GE!B84{#DJw$hqn>tST>{~%9rhyQ@yPKd(8L1M7)V`pAe$?YC0teStFk1sh*&>H3bZC=W@PSN zYGRN7nY>n7?z>6hiXtgYRw|bD+O4UCYS1gxk&^Y)B}P+T!KgXyCXpE~!=WKfJBaM_ z9w}p+_erZiG6TuuDV8HJI%U8HZZl)1&&s))(&kNMh2LUkT+>a&RTNEB1^IC;uUgm8 zKeCX81&E1^)j=>%VvD#H18g}Dp)zx0eFBS5BJq|rZC7=<6Sh|THhBbq7e(Q+`xU5i z8663Uei#VfaUbLftU&pas0x3+5mdB=SX6W)K!v|#)36n$q4UK~i2VU_N;tGlVxGW> z7G(~8g8kwqRML3`n z^qK$hiXe&hG!q?BGfk|-{y`GVx+f{brlC;G6Q&ZSZU)rUNKWRxyBp| zeVp71yH|vr#6EZmRIt0vU5RW^PUSV#MrOJu7-IjIBqT!a?)Oq$>I)qjUX3jD^%$*% z@<#6iURsaG2UEk(5teWTPwnx_;N4)tTV$5t20+aHj2TOF!gC1B5Sz6W&;O*Tuy(F| zU#C;vH~q4k*&?MupfL-{ne6A#sk!NrraydRl4H5G_s`P%n2vsp((&It@X*&$PZNng z4vXlrWp^ z)nYYbxtDv{onj7$z%iw-pleI$wb^bF8g|dSl#<;xHc>wnBreVn;o&~T=zs|r4v^1t zROxbx%CG{%?i^PO_4F#=4501SvOX5??m}mMdu!Wjjzkt%5>ODad)#9urav*Vxd;2I zNK5JVh^2=vs|S}&XKXbVrpS^OjVp+F*JX2&Ys!Pvu@W`dk!~EUm^@v%p@t~LhHpV? ziO1%(5Mg-IN4}g8az-S(lM+v__iw;U+-{fPOn2gwQANt{ThR`PwN!1{O^k3BjYO7~ zp&OUqbTu3?hW5%F+%-Bd+UL%#jG80~{Rx6QfAVKn=pQL2vC2%`XMKTrl&j^raR8$E zX&`{H?diMuMYgBqNQi)$%3x9v;R-?cdWEO$Wn_W@RWT>Tnj~_47 zXH;lPru;2W;Ed=OxMUhUl})ruW?f#cWvelR(wHBNAq~?_`E8qNfY{7%cZ;_o;RXS? z8YSe<@>^d)#e`?wo7_79rFfZ* zTv;wIo^vrQNtq(8S3!@lPL^ag+f#emBX&!BMo2FcFnN0AAdPWTCwc5o|JSF6if%qGD+^WCSHR*i~I!8nP-^M9q$Y+C+F$`Gb(X^9KZbS$Z#~CCs&O zI;L>gK$yt06r2T;EZ}yFU^an~Wuz6Jc%3g%DB}h0G6oRw2f4FxGBB1N-`N}^yq>RD zykMN}kpdFLeP?c|+I@WL!@KwR(sCP@YvMOVxknG&7M`!2w8k`kkaqK1%}jl@*;tqsWDYKe z@XMa7TW2?s?MWapSsy`qN>GqII*Mj3G_lH)g4#?#W$gnSnauzwTxHI znqkQ%9Xp{J35-hQq4NUMV-+Tzt3r&?kqoA0R@$-A0R|D#SHx%oVW^*-vbk>323sr! zECDmp3p=~$CE^Vs7Xo4kP*9JnXJp{9WaLQ!lMigfz3+YCWwNDRXjSwB1VMw1Wm~+1@8{!xyOu%}l%5Yk2rbK{3WHe_`Bil8?J<7N>N+H)h}+Gtk^J1dxeBb zdsE_RKk%cu{&rpvy$yGJ3clgH+sQ}*R53cij-A9PyL&-=7#(49vO*Ucp)@o!^uV;+ zlw+ir&dbm)?PUb;ko_7wr+Y;K{r)S?_g$e?8bMTrd_tY8;;Axu9;CGMHY+n6;&^1} zyZ-ms`nXL>b->4r1KxeHWexs!?TgBnFuf5qs6jXon(Xr;gtp2YZS3P1^!Iw5+Oxj9 zJ08RT+SOT^i~AAv#dkzj$L4)1uK4+%baj_@#Us7*WNQWjedia`LRXIWw)OOAWyCq} zHlB!4)L3MAS*(^_^z1EzzJaF3+VYX2QJ{>Ae!$hHye=@8Fk<1vT6cFeqO}sCBil5X zU1F?wX>UH2Kp2Z|Q5+RjgrTf&>WJ)5;4Jk0^zM{!*lf-qohIrr(>}si;MlVGtKgH4 zP^&wzS)M?As?jkiPDGX~!YDn5J^R@pU(u6v6&Zb~8XCSckBg8ML(Dujj(hKk;V+Wj zPh7-fV_1jq9T_%(M}dacm*gL#q*1O`8p9}Oa|@!$c-K58saA+l$yPUx>ei8BAFdY9 zuW$I7=-lM#H-lWaAeR_73|lb{riRm{N3b(0zX&`OuT6qhGEFSXW*f6njG(ew-lZga zBvWKmU*ze~R$c9JDebgOsJ2Y|BH_6YquW5VwYxTqa|ql8}Gk$awteMg1)A zrg)dsiP4-2<~)X@(g%oJV&yYgkdE)lw*!TyM)7i)<+X%ax59$e>YU z0Ho8f!z25olFFjh>0eO!p{Hi}uy2DTZIj59Y!Nl4h$~OqTDp@)T53p0#M5H57ugF5 zcR$s|;VrZUlPmLn!+AVf@TCB@6(dc=>5o1NlVi^#G4hJvA2}qtIe}|9{$->D`MOAq zAhGopp%{9dmMP@YO9{3eOceVUS*157VEOdYFfu8T&JzSzbhff+eXoQDq!+QYE0>nG zAZm7CrM0CnZ2bRQ@*`~B(PzmH4Qz2l&5O3{|L-9iiN4;c?N70gvHjvO6wQ_~s?CNP zg-OC~?wtF={xJZu3zsCKJ4a-iC9UQL17sG9mdBP~_lubFK`9y%AYy~YbZ@)i03Kg}$i3IK3@Q)(V*9KJ((5I1Vy7DcAmdW{MNC-G zKYS6dgEXM~5!dxEn^($M?lJWeGVznJU4Yz`eOPl@Nd(W797GDs)(gh@Z}wzCWV1UJ zKBQb9!T%CPgG`3hB{_^+X|gQPT86x)*1pM&Al^+U^e~GdJs-?!$9cu|0stxq*DgKi zg#f_y4UPH%0J8AMCvi=wcf52~#dFvDAIQb{{@1RpV{Dn6Q6&lC87@6SXgfWJ_QB_M zpRhFu3oK7U{n|X)L0P&Zp{w5h3O2f)w?`Qv)4lD5!ORR2Ba%>V54XXMM5!Vdo#_{?7e^pG@C6r30(ga3uQ{D z>A3w%dy~0AS5PNY#qEf$z9M_yz+XKbh^JyX!dQqxhQf#l?a}Rc5V3T*jyNGu#z2Aq zNH%sU?UfazN=Gt%=aZ-berl1@gR(9QZX|tKzJ}w{V^%vW1H`h%K3rZ!4Ot5l^#-xz z>PtpOG$8<`T`|L4k&@^Hj6V$maBmhE8IC(X7^urJ20 z8N>R-j2_(@Mrd4EPdN_2>}hA1m4x!TTtw$CL#2-tWRM2$x!!;GR{vsn7oK0`bxO-d z;jVZ^RdBK~{Ze-FtAYh77$TA>wdiaNW5x;GEytuLOM&q@i=RJOKN^JxVp$gk#%zd@ zQ|QCZPt`i>sJqX47%a3`Rs|KFepeq5+Q8dS4y9fGV^y?DdsQqcMM#&z1e--pxi`ei zC$9zAU+@bnEAsPsf5qKYdE(@j-wy_0g#r~I9KfxB=mMF=X7EeT(ZCQxQWlGppBULZ z?<3sx&`K~dqY2*W?q?mygn4~MxDSgTlH$F6YYiD+pT7Eyi4ixqGM6R`p*LMQ30 zfSe>s0A)?W1Tb2mB_M-Q-#qovpCAQQ{}xx^GdBN`$N`a4m}Zc5FpB+mU0`BHAiwsQ zn`XcG0gr|xBeyQ|L=gm2`JbCVmOzW-Kx=P(ELxe*0Ogn0rAgkA#WnX~&s zi_%lD;uV1fu>svej^}2+gS|^#yTR=yx{9NsZ;D_zKzKoE7ZEmEiV=4!2HB-^{|y*o z+YyAQ_fp<+$^!=+NY!8~ECJDdA2^>Ia^MbF%~6w8xMwBoK(rR=)R7z-UNGt)?KH9* zD8*c13r%kqfm9e$xhnw(*~Ow?5sE4$@Vk)*?s>%|bR)v4+r%Ku`<{d$%=cak4r1)O zuE9m5s>g;YvDVF~W>Pk<4DLI@f#9=tks;1pRcwyxNjw7nL4^HIKPW*d*8LJaG?XI> zH{}gp4NhRD(I=ZQ^og=7u|9HL(FE;i_vUUz3wXrs6)`wDrj9xblTZbt8@l{LN5Y&> zx{v$;pmr0M<YGI&&|mjG6yMF-@MGRTx(AgM=H53uTuoPnnL|$WmyD?8|Ev8h=f?(8MCfp?VPnb z9_d*^qV~2|uQyi|W*!SG7B>PK#QxW{{wh4XuJlv0ACk|r0>T*PwX47R2A(7h%+Bg}4_`%TY->uq|Q=5)MW5!$6u@4KEtYj0i-OG%-f#wAT-RaLxKM z43$mq%&Xa_AP4V zPw@3V^dLjJYgB$3vt2(m~K7 z?T<)@hLsj%-dkZ|7Ag(&{o=V6XrX{$MHWNC692~-!e%Vd6Tzpni|e}36dFPyIc(&% zPejB}s5mwgvgV4#^nqHaomh?Ef!T-#RJdJhY{PzKF^gk308|+#iZPsTm-=~1*iLt^ z0&$`(#zBnfOzI(?RyFw=g;1#6Sc@eOiLTH_lvKE)U472WO71R(EG71)UqUO~&w7*K zJUvs|rCAuWxwM8@p|xGR`4@w$XTA1Yh}Z=}d3<(AoJB>0nScxT7E@1xE@TpX@J$bl z3Zzq2H$A2wwMpw|)tev%X~4L$B`5x|onE~}-Eb==1r7$kn1(WgG7oi25Qa2hhp~8S z&;ty_x0b-@uL@XBY&GZ4y$P}ShI}=*7?FnkTZ1S1bC_v$e|r03;SZN%dS!0}3|Pj# zprq%C3W>Uas3ZnM2A<}ihI9?X5Ke$c%Z3KcdOe?5Y*mk2cjD?(OkrI1)fUSyYr?QKS&E8z= zB@M(5+$c)w%@fO6gH5lLqcfqbxa(kjrSQp3HGgWZXQ`VtgOP zP^ThAycfcQ#2Oih)(~Z6R;8FKHgx#_NZPbZ|t~+F>DWW*m8h*mmV}1B5f>vLKD7!TpqzU-5?IeM?na7Se7F} z6tc`+oigGdhTB{S+1@)aYy>1&xwOODb*^p?bQsB?@w87*Ze6op~GP6!Q~ ziR*Fq<2ih9e1k299|AhWEUjB67?nv~UF1MahgeUDi|E@5;}GtTC)VZRBBjK){(qA# za~Lep1a-)7aPS4}KN{L$-1cg^mAsd-J`%$Xi%x|fz%-3bHSRh&^X!vwKwiPd?-C-Q z^KPf~XaSB9IjE1#yTdN#a zb?<=xG8LDTR@_&vkAdya2t8fJ4_w4p!M{3}>&HwwiVsKr#kydv?&|Hb+2<{$znMX2 z+pQYRlj@g1418^KZp{h6z*Wh-2;Y?`7 zhewP@KiU#MQkF{Qay*jl4d#B2;W#&Ew>4#ZgMzbzuZxnwdp*SZ@S8ezTXw$U1e$@F z6aiThP$3%_*c%9@h{@c_YVV4)x=mG1)6S0>NflR#o-hAUkwibeNjPte7fsWa(-R^Q z>Dd1^u@Tqom$s{Wzgv>IM=!Fk7`sPH2!yndl!5@zfM^IrKTvH^wQ=53G*xNR>?>x@ z@IOe)mD`yLQ{2>Fp+rd+bNq#EqNX;U?iqe*bA3GY#5Ge%De05lER~W&04rnCOG;+>^0n_8fr!dIgaJ5>Duq z&$d?+`Kol3XVu3@IpSc4-68=8EYV}?g_xK8cCfqY4(%6LE=vnZR6$=Lra*r7!LIn( z2fgZ+AKSvRpC?{G`bvM43zdghe7lDq(t-ad4M1xiud;~|W5*i(B?qao?)pP(NJv0` zk)Nqxl=oHe13YsGPOl$n!o>(V`E5{%E6rqf;J}uZhj});%jB(V*c#CMNCUa^D-Aqa zjJb7$A89C#+C}63Pxo(?#@@i`fq_0879~f#A#@Eh&P{b1X)=?yrqcty!hXVJyD;& z-tpb{F5@U)3-^?)X$P^@h-N{jm<9b%FVTtx+9)QhgF&}VbCb<1)s;`Mr%U~&c*6Wv zB3sDNePCY1-ojpq`c@04?z0|tT0*?UnEuP25Qd3L`EkaGjScc5B$<#r6@T76WwWkl zUP)#Bh}dBIg$NDpxHo*7+5blokgb82Tsdf5!L7nw=H|c#Qu?zB<)1%r-+|z0FzS={ z-&s=}T4}^TN)yBg`Bix3&95HVtjK5MWyExzSSW`*EA6?zcwoyf9(0IrB3j(Z&Ux++ z9_#8kWykg7-0uJ>Prnde`Z$i|zSo1Dly$652x-VT8ecqlgTV z!sMjlj-DG8n{2y&fDtJtIz^@k@xF>X5{U0@uEul~a8IP^T6`pXQ zTqxF{oxwWZBXI*NWJC=2sw%w^?GE$Hq%7X^vHS?fF#Vj#WG5lzDFtOe+Np+yJBbh|H zxvSPu4TYQZyVpinJ1~ z4R_Zl88305wtiYIf$OC9+DShzyI^);yO)LOHYRdwa|ly|LAED3txm zY@tEpuCUlnkhSK0DtpzJtQ^{t_Oz5R&44Zykw|3GI=nG-kd@~MwuAYNdAOg$IIaRl z+4ww;V)v(E7TPDeE>sD?wk9sFlRjQD}J)oN98{J zE$SCW@E~R8^#aRpWHTrZ-~v`cJ>UZKI5snVcpzV|IM6J4xW9|n+_B(Q72E7XvU;6I zu6b+82~733*B6>rhm*UUT=*R=jik#tJG>?4d1<@y-Hokn{z~%7^zJ(HIqAC-g&`#- zWqLwgsp33P%1`(0_u+E!MKcm9 zq^g)1M61-GBIJ~_+a-9PP(m@Wm^(eg$QiG^6-0`zi&f7{$3l>yLglSieh0#PQ%SYr z2O_*mDm~zL6Jc9HU=-A?y*9SkKm%LOZ%gwta7;B^jlokLyy95VuGVX;SFi74hxzr` z8+v*zF*|TrW5?IG$E+yZPOjq)eo;N;h4xnC7;Vw>pd|x(?dpzo>a1Pav`pRM)3Tg< zo;i8NZ8UqCWHQT^G2p3(A}hH-+Uk8}b#l)Z&B0CS%{>?|az_NXr#$NPDw>AelWCPZ=H$(lR)0Xr7WJBhYUMD}$@nw^iLE{iw#3BLJrC9F0hTR9e7QwY;>DXkPKP+MFu_+~0BEe+@$g9tcT z0Bp{f)MEq0Vj+`k-MyF1_2CT_mKs9|^V)9cfO2V+&9kZo3u8w5&MT!cl9ZQM`<9JV zzbvmt+n>iLXly_9MqaFjVxLhP5oQ*4TzC6RY!Y7aJ&TGK-%YIxK}0YI7g%q@9V%ke zxB(>~iIQQyfS$#6JV>t*|B`e%&M$I=awVti%5s?SQ z5zkJdulq8?^8&d_c;F@DON%lHb&gsbq20^tn^D2bJBtSjA~edRu!tcDw`qYeGbV3r z7w&E<9&ns_ro0h4j|8gKV@pQ?g)Q>$fNz0QmME6C98~M@5Ru3V9$nfjWV@7spBmBk z%vR#oHR3&?))<;hspopeT!*8!PN1S*YruBl#W3*s+r#)0O{>m3?1V}yM@a>D@%gyO zqMUbyYaqZgT>7?Dgq+Vlr^w2dBCcE161|8ScNeoL*d7G9opuxJR--+bvy<9wVyE<7 zTrI2|z`mt!EM^94m>?*ta2F=K_tkj9&flmVdB{2rFF+uxHB&NA42aoE&6pN`EJq9# zo~H@FQ$MBwSyIaIvODMcutZksq>YR?!D@&Hi>05^+rp0IedR*`cNy}-@RF7BSc$(w zSDE&+@JRTbld5+ZR4Um9i?W15jUS9?5xVNKsu**4(`W>`cpl4aQhw9Uw@A@x!aZ>1 zFw{m=``|Z6@+R5=*|V<1>iVv3Rna#0GEK}AO_k%2Z)2Kz_s8ykOTu@ z3&;Wo9RA{h@F>R{!2{sK;3@EV@GVfk>!|Sa92bl)2seN>kO5=h%cYOU%*4)Y4ALF37m5mX+RA0fX;D3t%5O@xBG&CU6C41#3YM*bJ@*uLHZl1K<(xaqtcB9QX@pynjJB0LHKOY3|4|`KpMOr z>;m_I2f+uxr@(i>3n27PXbGGRE(EUvuLe?&%^dUKP2ip2Y4B6lLj zz7Kv6Ub&a=fy+TR*amI|uY8>T;P?diCU_AX_b6onL*RYjE8vgdkjEB;PXl!z28O`x z;KSh4;9KDMf8`rsJ;;Iw!MDI~z@LD{_l^LIz(wF%a09ppd>VWod>#B4{2Kfj9Q6VE z1zZePfvbQ6?gf+J)8IMqiVrRb+aM15z!CqpAbbY65Db8O!6V?);M?HmU=|3U`y0oj z;8~}GC7=n2e7S<-a*%xOQQ=mOuK_vm2JjB>7f`e{283}1oQ$TpbK0FM!}oF9`F?S z2KXiTJvi*&p;d69du-=;Ey#fz!5!dU@LnLY>Isg|g8u|Ze{4bcQqTw90PX+}fk(lY zz_-A!!Jok4AE$4?Vj!}riQ@*40^7hY@Gy89h^+bv$KQZ`;4k3FPe3Q&RImiB1Z%;1 zFaq8H?gJ(81Mo+1>?aq5&j*)*Zm=0#5B>$*3El7km!<82k|&_t^#Eb3qem0dcSyjDQ=!Zty605_}uH z01kg@LHJBi4_ZJw=moC<3D6HjR^>SE0G_Pc#rd6J0(=a7AG`pLn4;alT95|2z@y+x z;CXO3AI_!X%795Na#1DAmgFaWlJaqwR78So?UU*HgU!YSY)&;gQQ z8@LTT2tEv+1wR0P1&4i}wggMSO0W^^1iQck;BoMA@OkhP@Mmzw)9^RY3D$#6APKer z2kZcE1R|^M;3%?coZ|#|0En!5l;i&a-vxgFhkT(@R#kI-4!9I_gAs5GcsqC;d8y2{1u$^e~heZD*0Y3l>pFs|RTF?yEf)uzB zyc;|YL{@#8;}5`#;K(o0FCYhQ2A-_CoAXD&C&2eX=*x@+5C$TvHgFsOd2kE34?F^% z20sALgO|YhUqOz5bzm#F9lQ&C9{doz?yKAb?*r4|@8I~aG3G!sSO=~KePA271-uO$ zNLEeo?33Wj;78zZ;OJ+OQQ%^58#s5GF$LCxO`soa1wmPr=UQadTRA=sME<cAyc2u`d=h*E{1&_f?4Q$@;ME`xc7cb%zk_dqzk-v0fo%dT2d@FwgLi?w;2H2N zm;t{B3w}v{U_BTCZvhX2kAts+-+{w^Mf-qN;A$ZAs_Qrof($5toi0RHdGn+jxOY3a z1&FK~=lBHpJop)S5d`N|hy5Cw12v!-Tn)B>o58!l<6sIr3%&e1+N9ygFC=S!B@fe!Aszr zedvoI1zrbgUx1Fl)!-KJZ{Ty_dte`^nuVsp>EJ@J0(5`_$*LsJc7Qv<1o#4&0e=IB z{~q2B{tAxz1GECdpcQn2psZTYwaBV19B%_6e}Xo^1-DZsZ~+imb){UF$cLks*0TW~ zC~cgyL0NS>-+4QD0PF#efPVv@044B6;Mo90R*4NTIIr?-fZn|7>!cT1^=*zn2EPUW z4MbMG#Bt#tjjTG8xV@HqG^_$HVEe*jhg1MdSTfpdY#s!KR_fIjd>@B#2G z@Sh;`Cu0LVo}%75Ct7z5ahuf;KSf^;2Yo<;J-oDU#J790gd2F&<-{Lu>oGk@p^D8xF0+U z{vCV;{22Te{0SWYSH>8q2Th<0YzA5II`Bqt7kD?=3#P!=zz@N%!5=}@-x&Mg1aK}0 zgLZH&$b-AUBj8E!Ecg-l9XRsu%qhWAuo7Gct_Qop`@j?6E8r*KKfzzYQ7<9e!TI1~ z@G5XE$b&b7J>UuO6)*!{1m3(#Y=AFuUB#SA=2arAj^Y@URi|=&E?5q(1H<4Z@NV!) z@E!0+P#szrZUpTh4Q>MufzN^;fMvDJ_Wu4ym{64IsY&4S8&=wcroY# z4iH&&E63g7KJZ@fVem;X4SoWC3;qu5S3oP^a&Q$Wf;WQ?f=_|=S1t^{7C7KO@EPz7 zcnD*?#l&k}-JwGi`Je&DN?K-PbLTVdvwy|?rqqu_`UH33f{NSmCkb2j+5xaUC zGwEdDM&pS14+p?te%U&cHj?jrrrnb)gYHYsZnvniBwl3Bm0hTx+aha}jm%NeV)%@3}|6hHz zrLJijV6D|$XEnE4SMqPS)!bz@*ILc5XPZW=^nR;!r&aopReBE_&s(MYt-B#&7tMp;3G-;JSVwIk-N*}dKAG1ogTcx*Jr8}(B zZmaaTRr*(}^Z~2%L96s8tMq28^cJi1h*f&jDm`YEZn8=@TBR|obcJg+9fk>Esd1gHXsgJZ#AK<*y`jsx;c5CZbt{1@V0BddQ$^vA6lX;}3a zo2&l^l%DSoQhL5$DP4B|-Q3f9FtUtGq_B{M#0f&^62^62{-}jMRnALR`WCKmH2_zU~n~7|HzHv?0hF)U+TBDJcb*tlD>pNR}v>n#4+=0)@DylvrV^~uV zc&mBgvIdsaY~|NB0=J=FqR5FdTgKMl1-mxM4p>`lel&X95KB+%G)&;4rVF<>U3{TE zlHQ)my2Y+}li4;h|*-jYs34@_8g!@^6bOLj|cM>&|sZMki*f)Ux~kR?Zr z?48)y($&!s>1^H1KkFmy+TP~`*CWCLSoVKy-zy9pONn zh@4VkA`NBjhOS;S>q=M^XQD6yu{;D75ziqDSQ_kJs$=q_)7ZbBP9wI4$Q}755kl1@ zyJRA7qB#ig@U~iQSh%phzJB33=h&;|_alfu2^6?iBibZ(D>E$dd$RhCck33`+qJ7Y z>-gdOT03ml$ArX{K+>shm^SIb6PdABmKM)Kz81M7sCYY`{0xTJBz ztK5=%O|oG~25XNj3gm+{(m7Dm2qRCIrD*q^!wT`_8MBf-d;mPXpZakl2t`|wMwrfhIm_gr{3w+I~u~P z*PZ72>R!F-(JPN1=&csL)xyeu7Kb}}Ypvc|Yu4%OomRb5UN9wOv^@>?F=cGm$GV&u z<S()3%f>&pePhG6$QR14PsZtN2TaVrTL!4AeRE4JO?wcBh z#@!YBB1rRoq^H)BjIcvCo0c3Is@376nKEsnptM<*t}!h5fe;x)AqfgY=v{+DN|Rm`r{Afv0%JqlwZX0nNJ_U;wN@w( zuvfQVP0pFrfC$@uTbImA9tV_I(xFl|qqu0&3t?gGUr}pc!HF;0Saro%SEA5V(RDrD z`h2yCMy2JII1IsLQtV3SS4MbrcZT(}swP!P7@9)^mb+V|Wk%DoqJy!cS)oI1F{_#p zc%mT46B)M};m&KaGTn`D?{7FrQ+a&Y=l05QB{y_n?aPBPMam^H|EP%)=*)JA5}T}S z7{Nse2H65AYb2Mq6-s3z`)_GHGJ2bwvtG?xa13rQKv{C~aeJ zT(f3V^Tv*jO?Ev$Vl_in4q+8N>_nIzjx@1|?MHiAxmRZXxYkMPl zK}K`(Zx!5cNznL4bQb?Ra^s>4<#nG?&7pR$3oFGr%9$=aa)*6^5agvo%A(BVvh}W1 zV;emd<>w`LpIsOhm(H5;EUREuhcZber9J;J`2W~@7x<{Eb8mR|BIMQ6g%AHVz7wyJ6ltl{c=djoc~?9Z2w7gj7QZ=0aS{YwtY&{IB(mF$o`CG%~7` zsI{o);*qWXhP6EL&Moqu@4V+c%=|64PW0phTNhPfnn%Qqir*7leh*yq_=~$N5)>%W zIxs!C)EXM*iU#GIE!qlIh?$9|P5D|qNMG{;12x)N@fJJl{QmYj_^H;Ald7R<@Z9kd zn|KQ(O$t9IQ)`P)O)j@4FZpq`VZtun3xc;);>D9A!wZk&o?0#>WauE zL<{H}a<0aUWatTx+$y#5f)_1vBM(DlMow<>n@%57vI)`G);Ae;;-bo%mEfP^xj87)4_r$;z5$kYQ z;*D1{l|Y9*gz7{SPx1?~#6-RfM*F_rL`-+4;oaTzzMG_%(FjATH1k{^e_h0&r)Dk{ z>Jwfn6`ys}A_AaQ^qO~iCsEu{#kd`RL!q!Yy)b5u?`&(SE?#W0tfWqx<2!ejj}FmX zef3>^O;9X!h&Pqpm0wK{Od`=mV6C1MEEXE#Yfsd3po0LRNX5~_i<_)vHtRif0MUAg z$l)8euQ~T}^f@E~6&aBF@AVLU!u~5inLhu{!Vl(4?51UC16YIFB zgjOt;u@eisiSOhEUN#dd#Y10W-BAq3cg0t|u?|U&P15ew6<1ubpoU)NCLmZWzj6Vt zk>T?#d{*MK3ZGhh?!~78pC9A%7(To4c?qAZD{Aoextax6R4qY{E2(dw?`&5=;%}?F z0?W~OWLzv-XJ6mOWrT0wRe<76d_clAUR`^21!GMW`Sa|M`CGU^uomCfV8Nfh-=AcC z>l3YSv|Ow|V`T!q94t#!!+P%mUZ7foAKk10V-2lu)%1h<7SmVeGkPCT()mDB%@M5A zl9th~y!vbOYCSX;P&oq3-;FFKfNPOJ*%*5wBe9py(u3ONxjA8hk zjZXnS!|@q`4_)V=YaVp&S@@LTL)Sv+n#UA;{+@jQ6W9J|5j^QqAa=zyk*mLX^^!}k z$W~i~3s3z3^}lzD*ZIM3S$SjjDnl#HbP{Z3y#f#pws;s+^eE(RQ9mhm?p&RN3mk$g zo;h7<6eBwXf)I#ntSqvXVgY`&^p>)FI&}82XTK#7ARtu0VW4!Tr7YMl4Z=lyAPFiSamBIYtDOA>rbD zHqNs%#`*H}9JN2r=Lj=jR>Hi1iyGXBD&b9JhB}NE!sS0D?xe_!i}Q_LnxlEf`6jgL z*#*oCR5GTsIe}pI>P39Otui`zPiE=hCk2+U5NClvRdzGWAcBq!V^?;ZEr60TUsqsR zcARXWq-+H7ksFsW*aEAAxLYLvzN|ReF!q3?+jxr1k~x5n1e}9nXT?cIcdIV(SS~&( z5D0`~P$O9N%-J%@SVb0rm^pBPE|>xZ&dFyO?Zns0n3gSHiw|OE$1y|jNyMjS;bUE7 z3Pyaka5h{knHI%1Huq}Ta26kEPoam)5+EP=n9)il$r9cPz_g5YEv1rV3E+DQhgUr< zDr{z8wZ#{>M!+-UZj19hOX|rIP+vp^yoSt|C4diAg-w4p5X^#N?7BGLD#Of*TV)7^ zOz#TlS#g&@Kmf)X+0DVGTYM99m;)_MAkJv*&YCSdh4MnO{Mf%`#rcU3IG$b2Zu1(! z=g+QYTZDa=_`KcEQme}tqL?g$@4)fEs%&QSgWzfKtuqYj05b)fi6egmUsoVtbz6fY zMTbXxP<0@1^WY$)3fvzA2+$|9;-o&lii|iLjz~)dAL5s@ARW6(f2;yWG)yhQ+$qCo;lo-g=XscVzWK`@j=xDl{ySD+fBR(O&|iGu_wZ1EY! zZi8*SDy$BIp(N>DwC@1bsp|q>{kDt_hqRlq2|yXf^C1{kHa9hGDXdRLzfJ`Ym8p%{FX4qGdPZ|t`>YD zSeW=+jtsa7hPle={RXC%l|Zg0D*OX@kp$;raQeFGV$2ie7C5 z`jJdH2zbq_M%!PXMlYGKXTeQq1z!&;|1LHn8_pS6w=YJGX<2qY$#`jnPK{|7%hRMR zp2_N^EuwKQV-C}n1vla8AUVCLIeFS77G{}(GtRe!$(^5g%}g*RwPM^5e74)a^+iS) zW8Z6sd`1`ePVIdv3vMFD4e%LE$~J_6Yp>v2%4}9|l!;PWZGvx=!7d5ZWWrFo)ZI?< zEwy#GMzZ3%t|z|MO9IztgTb?E)g5Rc-J-9|0zETO3%<5MbruXAvKhOIR z3tW?ZJSRTsdgCkO*;Tp3gN3_l0@vhnn?TsLsC8Nip_wU6V# zm)*6G#v6ni3h zz&H44=3|9{I5&@3hqCkeBTV99C$Qi{Ulb2%d=fWtp!Q&o6lM9=%*+C&mBU-IeNo8| zUPnBYk4WZA)r&VwXUmKRaGfXfrRdoi#&L#mkCYI^9H2_<4~W(yQ~W=&XsQ+S!K
gPW36e8~OO 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 z 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
    1X7*IL18&HA2zdOCtfO>Gn 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 z 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 z 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%0Am&O0^>k`5HVO|eGR$}ybV61jK4w8q)@le zDbU(v>Q$q$J`VnKm&W=b^dAG6Ck9|o(pcAmM?mkF&W~0GYOL-={Gf$*YOIezmx8ar zFQBJZV|}ffE@&aIG=Ia%K7F$&MIrTp4hHrp9@ z8U1|^^aN-I+U^>w84LywfwAC*_XdNyZRkYI^T7CVFqrha42fErc z)+azd<`Pf_-UCDL(pW!*o&x8=AnZ4w{wjG(0er27y8q8)0ijjW9|VP@$-PS)Wrvs^9#(sfV&8{gYnWef_eeb zchL8ti@=ZITf!qn**b(VprRc6@1)-|2JQh5f*If?@HTjnG9(i|nl_qD-Y)n(Hjq66 z*t1ZwKQ(}UfqUC<{GcO8FlPV*^LA5<&RU3@l&-Pbz*rzL1~R~85KfqFglz}W2POLi z?9&Oe6?njj(WEm*V@-iB1V6?QZxrPQJ4iQ$c;~6Je$<5(oFLA?4En?UtQ+8Ua2*8W z*6rhym0YhVMo zM4exT-T-$~pMAu<*NZZerj_|*0OqtVls{aO?!kPS_9}qV!-u{MT@Utv!{8(cC*KCj z=%n7S03G}rfZy%(MQ{hOf{`E#d-tpS!Cvr{WG}>gc9LXYC)}WKLmRRr z`}pu0j4}d-iy%&1@OUXX) z3(0=yUihIeGX;Mn-SDO#rEc5cFKQ@xVs=2=?`F)?29xR6)zo(e@kgZvTQ|~ggDcs8 z?3Sd5ar10GG;{&<$~%XK?&zhkFN~vpHys+f8@JWv$d-jpW=vm!-p2eVMG}TICck}X zXt9MdWW$qim*x+PX3VRr+1CgZNz(ne*M}(VHNPg?zV-1dCNgg{eQp{2W>R(FEko? zi)Pjb&8kB3)#25 z1iDi<{XhX@HUat^w1WEiIi9sQ1>P8E3&C}85UghWI`MyqGWG^ye>(vgxsnCxiO_to z2eSu!N&e50o|AkEp>x49>ftEJ$DBZ!C(sVtpgU;O1lsZ-ZCAMQ&`^8=bK&uyXG;Y-8&|%Ob z!WRM;>zJs+?m5g|xUU0QAdP3trT9<4U7?T^+o0Q~k$?1Xp7=dHyZPIA&bIBw?I8FH zoB^%Ce>(Fx*b{yjftQRj_VcHDAyZM$K)Qe#*`%$=8Epbt#pG9@u|9=N=`7+*ih|~o zPrKLaT1?%8Y~V#s<5v3Mx5S;w^N{%J@<+_kKYP8Wp;L(e9dz>Tq~C}vN8~t)?{g>f z+$7S;S_F#NH{8crNTI@hdvx6xculNCZh>02m1F0(XOCkOBq)E4b4|z5+xSlJ>lO5jPSZ1T*rK@Mq#h_Aa{AFBw7CBZ%+U=%tOI2a1TfZcY#4* z2uKAFfcwFHU^sXPi~^&<81VfZulJ>3yXN|4+OUE?38V%|N`u~we+n23n6@MV20!Fsmq_Xd5(>zVQ$cX^8Yh+J(DGC!h4`LkBsx zd(8M!@Z>!_C+~H|en>QZQ|skqKPq1=cD@_*OseGYS%yq?nEFF$1+N&F0hBu&Q;9y}lm=%&`8dkVLy1+{r~wD*&y3Aan^}Ls4${~Pf@3Ag{RoMFE9aw3!_S4g z*SlCje!-u=n_$VJ%=KOQPz84bV}4JPJ-`gMBpw$)+FkdGPHS+>_QM;1ideF`Z(H`R4aDR_9g&EdUp!NTu zt&B>0{V~=@@}X-;R_e(H#CdHx^;rhqA+Z`?o7AD?xlF_8PEx(!+b z5-8(3zd-9+`qQajSa;#UGda+zdlxm}X@jF0$Zp{v~E`w%3Cy;JG^0^%z zE~N)rd8x!2%sgv|q)trKcMfhLjPHG+wri%BM$b-v$hP;s?Y7ShK{JD`-`i*QznZ%2 zk*`zJ)-TU64*Y%Cs#mT*`dHUb#~g^PPk$rgA0( zVm^ENiP{y`r#9c7HU9jsBmb^`@U77{WWdvap6=P~qd=2D4s!i@Cd6w#Lw3FeHxKpE z0Or6~v%q74)+eV1T3^S!6s!ZK=f8gH9}$DYUjDF4PSPD+|1tb@`j}qNZg^qAHG?th zp+M`&QGwPgq`mB=Kx+~0*ZF6`FZ@By-srm;V8Ps^V(byl_89AWtJj<247B!I6lk3Y zqFzt7-HH82%pU*?<{pcwOXz*j?$BqUXTj_22hy;At6-gjZU-B2E8?0mfR1||T7i8B zIMJGHYx)U26y#Y{Lj6l^lF%z-VQ;Yq{~FLj{HgCqcEiue-X@HCNU&8S!YU-c0^%*i zyy^$)61;oex3;UhX|45`4}(v^A#f0E13N%7&@_`b^i-VIIyGKv&EniD3`paUg^&AL z(mn;6K|9b)W&Z(Ez*sOH6oO@7BRBxI60RPc0EOTP>HHf^&cz?P6YK#VPy-$&KMni8 zf%xmdS<>ipHPBkoPirk&wOZQx2l-(Bd{j$kn7nX{YiD)wv(D32d|&865EQh(wMT%7BtN$7BWDcN?Gu)!Hx>wHiR zUIGVjQ=j9E9(o029#+~7P06;*7W9i;OtyJA8@^Rnmx27#6o-fEzNP=1PPR=ym2A^M zYraXg*@QcBx?f1PwG;0wJTyVAJCki!piS5%!t5bVCjEQ@@isE%&f@3Stg|lQjA0VA z6l}yVnlyz@5}}*qI$_#5&*v`DS^}B~a~rgwUTIH<3O!(t)3&1TG?UL(_OW7FxWbuj z4dw$t_+^lPEB-BD0_Mr!g5axFXZ2h__XKnsbP4nzcm=aTi9Q)%0YXpFXSkiYsI$hm z>8x4cFy@ue51@5W6LcO}x0ky3kUE5B)KX6qyI2b{h2AeQ4JxGH2&1};9*9dit5`7M zII9TrQO+HAhw?lQ^cnqA zjs6Tp7wcs34A61zUW}U}S_=Og^j6()<3gnHk+@kwD|i~bL>w3TU>@~DHvKf_tuDxe z@0wzJ5WCQoGz8jLn1PG10nk&#I|6nI;IUb`VfB&e*Vbo@5b{Sv>N&tbS2maUZ+m( zMo*q909_nlB$y5U1q#t6)d#=*n12S6N;e=x{_NUsGHNSb>kjtF&Gd~D1%SeMm3OPOVW>VVMUCiJ@5Dd$!& z2TZ3t68Zvz>BFnA7lTe+i0f#x;IJ-Mp#!n6o^sMID(pfD(QiFyFYqSrN1(gFeh~(J zM5s{X22#|!%DVygbGWa9b`7Py!ONJ(LgzxC!EZ6|cTc%C`^{K9X$9`jNSR9dkbz zM%YXEcL%rXR}{Jxd*GKs_)jRS0mOjSqMn>SooF9mcY&qgIWQHRWL%AcN(<2i0uR>k zF4kx7Np0z`giQ1!FOvgQoq)nuLBoBlcj> zid#R{GZ*Pn53fy)pfB|F&1b>TbkG-!zedqoLpZ9tzGbKsr?qu%0 zwv{mNgEJr~hJHZVrV9{H-1X1F9ATx6Vi|k*i+2$I2325x68a5jdLr2tJ~P?2AM@GA zlWlK9mxJc%$+mw$TYCDw_w{`5D(iFYB2FxQBDpxtmI z47e~f2s6?&Bp2OL1q}w`osTZi?C?d38p7-EK(`gNCvH1lMV}?&jHI+_9vkS@zc@Y69^}Cn@+_%9Yo)iV$ zUU2ZA#fOG|0giwa!rehS$zV0uf!n*#55X7UJm{6kyhZ#r($4@DbCYd5pa))H&soTv zv{Gfa5vE%bb0pN2m|{CSAjOtOoTb2tzSNI#zX8_$!FXeC6FMq|Zq=o`7{~R@(Yw*z zJpkQ9q>%#c2PEcK>Rht);oRgxp!}YVbq{-8AkK+}{?h}VWSb#@JGv;N4y8*rDE_5S>po^V0DBvt2 z9~{DO1n$3se*vM_Q9NUnV;1)i+o3{VZX?u1*pcglt!MK>taE_Sd%A~lfBj8#$TFXt z#7-Y%Jj?F`v5`9T(XIMfy}j{Cqwe9Y*L3bf(4)HWd7i1dr`Wo?lI7=`cIqnlZu-@W zJWGKD>iD{EAy)Ok{TJRl5oh~nsk>P0&wvk1+|^)T2j*h018JBufIhj4H5){uGj%i6 z0BwYdy1EJtO=0c?{lR+fkw!yjfakzMaFo0@Q+Kant^>i?*F!%9pMr0|PhcU>ccM&J zn4=N~v#wFL;euknz7d_GpkN+*uC+>NCZMR7~0C<(W`nAKXJC9xtF#8e*A|bFozRA z3W#SX@w_aapKQlec4?I)WwEywXIjz&JRxz8DDMe1oN#e|B`s8OL4e<37X09@lA$y} za+zbKtRKRpqJ_6}up1&ZOuLIocZlSv>n{o3(`@KX1S3Ercp7{IJ_GZ>4)6wO1D*TB zEto$B*Fm72y(y@A+YisviWIp2AOIJXdbe1+a$I8zj*b+O)gANv`o*f$(aO_AS~ zti^7?{p3Twz0p_LTYwHXn?1!Q_8?+kq9ZNwj4amalMnKI0E8|)3%KsRNFJXJJ#m3| z0!Oj$#xDpMf!O;z0G$Y&oIQx=TCw*L`s&SCL~zx@jINh zvCuty1EegHbzXYXNJH#RmM&(EXYSXa%l8xfPXTU^JhXUhFqsN{#A073p4r9rU+lke zE)sf)g}!2;7a048WW|8_$lCzFzA4Y+75j0a&sXfdCKFconHVoc1UCSiBy{|SfwTV> z?$Qu&FURJUgK^6P@IOTC`KJ>1tw)&yal7JkUr$)_@qUzrpZ7Db_eK2sf_s6`?<=iD zzc_3B7uYkNWu7P8?YDm`1~pN|+`!$SUy3c9aANIBfUW~6jGHG3%R7}^4l%#AsqEWu z7w-Xx^E9Cwya0cp1Gxx#_72un)>ltLicNwp6n>zcIO1+cOB&*Apcgb6f3aT{I)fK4 zrQZReUs&i5eh(`23Gd*%_!Mn;f^{c+@(Op^B=+_4H|AqshV^};(h-Zid%qPgp z0-Zp8PX<=ZHX!DYG^nnK_b*?ekG;xT3QfW7CCoa?BhH;07(?T+KZjo&^gZa$K<#8- zg1z5sU93tV_FiJ|oKPwFcrj)RCAD4bO~w2n#=;(W zslji=a`;%r^9%3NkH}5w>o_b6X*_EHYpfDfNo(^)<$*#5S$7eeHn$|+ zy$0SplFiMFNqwW;{f5Z?Pe*fZOzO&Z_v=1KzUC&O-0Ya_W$o_e?OXi!xva92IV&dh z)pqx*zH)aam>rY4q}}~;yG}=va=7v-F-W%&%ml}#zSLe;tF!G8)o5NDU%LRd5s%>G zG57B=rSsci9nbQr4#so;;bXk<#rVBy;tIc2@wLz0THe3Kls?lD&s^DA;CUSdp7&=w z^UC7KF#w&j@d+uO)--A%?=WAj(UwL?XvWsB&BfX1F+PA z?WZ2|rI=-1dRV34TQHT}i^^wPE7T6VJR177AM4ld@Lq<)(S6%P6{<|Xt5Qfj@)m{! z*-EcEQbedD+HL<4Vo+!@$1ftNqg{?*Y)|Yhx`EJP;zzEt`-o1OJ1KPOVUwbJkcoc# z>lmf~a|8(G+cf+d9}NwQP@5E?d#Z(PS1jLIx}Fxs3o(1OzDh9{#P8eCL_L!uKIWaV z9qv=&%UmLZ@(Y#eRixh}oOQ|{Bg8j|{R2?rQv22AV<&xa z8am^|NqI@}wVz);_IYPMUkk4vBc|4Va{1V29ci7A(=sj6O0~6@j~(`<@tH5+^ca(} z?u57YyM;iO(H1x5R%0*vz{S{&r)9GnKJGxA|3yC16$E3uq zm-)r)>&yPJp=QUMa=awI|I(T0l)5p!rVg!8?R}^H7{>jZRGKHUD*s%+i1!3^{W{Yq-$fcaUmm*Xs2=`5B2&E6v#};7 zN&~HgrA6KM;PKk1{Q4q3@zZGqAMP0D*y`GTo~@!k=e`#s()-BI zX{_9>>w3Jl-@Jp{+{T7?61AclDk9 z$&I?B-qD83WBib9FZEj@oR?Tc=w30?jnwyq!L#dv^Yg`o)40dWZ*HWRm8K7#_Fh(L zUpcu0`h#!_uX~j;pShd=!e?V;2cLq=gNg77msMRwf*WIWy3z>2X25CHUNJW}zO66q zA=hB7eu}?vi0eC36h8M@jPG}O{AJ{qE%Izi310dQ9biTv?&b3>2tk%~m5x55U*Tdl z^+ipf)0nNiJo{iUvUl^_t3-O{U3yWsa69Q>C%^0d%I|u?uhU4)R_@++@WvUJ1kaiE zMSoUq?wS}M%SX_XlC?>0442-Q{QJJTH5>XmjeW;GQi0N;OD3hXG)Jym^RskS(J33d zcdi%RaL0j962G0n?yvubriqy zxG;~pyZG?+{@V95l#5W{=9(?)=B*eM%=nhR#u&!OvoSec%Up9}W^2k^&&7;Umbso0 z6|+trF>)h}i`Qu#Cj=K_S}njgckRvbWQx~q-K+Es*2a6|>BSvo8W-mZSf_G_U+Qf2la2ek)zaCFVAhM2<}#yTvBXA zpzQ$K0L)`UJLIWVB=uJ;>RohuSnAEHtC5{#4T;h^B{5Q z=m#Nfc_H~Pcp97`^Pa18E}5HOV60>8=A~=fW|IAEt;90&jiANrq%znc27lhPvyMIU9Dvk6=x1Y%?}q0b@rY&XYu9{ z&W9>OYVKUJeF)k{-Z41N3(1)}{UU|bzgs$Qh<56bEOUj^uN%L$I~p$@`{81ZM%NV`SR>?l z%NAOt7Q^7{83-f$CI!K!DWRie^;JAy%U~As2tWIyRMio z)te;8k&Aqq9X3gF*I&&2Y6i;ilqIH;&VG&zxIa4folBP&Ty!52qtO{yyYJ%j*=4nv zyJqcG%@~bSNkF;fwwc=c_&VNk!6UbE#!SY)ph1g@78zQ!s|uu`B}GdNUpf`WoflKL zUko-C*~*H{XJ;UtDFr1J{^=s(8MJGknNfDQb%iVVj8VCHP^4qaMRc=PI#+8P6&EWj zoJ?&+%PNm=nU$`Pbj~%i-qg4^U6lL}N9?W$lI}e$#UGY}uTHxIealyE?yI)4t3Me_ z6l+3MspK`tuEOx(q@oW7d6H4P!*Myko*BJb`|!Xx2;Bq znJaFkFBHP7e1i#gd+dGc-OAk?}iUqnjo({_Y* z8A5ex{~RIWxA8o!#%J#5XS|{fIvBLch4#yX1{WfY9`ai{r^+w){0t$JP6|7`!f2LK z4oh)|CB@Zg7Nw-RYTG92Iy5zKK&qx>mSdP;FjNsZK%vRhUJVY8PmtnuJ&&bbl-z42 z*V<*fA6{1Z@Ro}^^*g_>x!8BpPLtHrCdHR-?w{zs6Ooi_vdbT{yZc`}t*ugi?P$!g zug*T{&;=ZQegUJcMeCeZf6n#%f<1HV6wDW5l=#`hs-&Y;hBMiLr zr;xFdc&=@fvPKp5gznf6ZMBVU2r(DiuW~8$W%>DkjTrlb88|&8-N?gkpW}J`5G0@z z%&ZFCH0=8%g}Rt&cx7<0!Y|2nGI{l9y3j%DMNAUKu9C$oYjK{eN?yIQSm8hNhve1n zVnx8nXOdTM(e)Xmc6`&8GONTG*2kZ2=L~&Q6I6j|o_y0Cco|DYk z!{olK@Js!B+vqKABsN`LBOWPpvfr4g4BI{G*al*S>$)PfQOsp+dThc_GNXP(dV+X- zF_mRSn5wIq%BpH~TX$8v%8Eo?eWQg=@rs$_>KlqTWB6_vsZGBUi+(?3Sb$ zKGGh$G9XDY!kQEt8d~fN>#VFGY-6k5zo!WMfNB39jK%j&-B^%S?)XrD z@X!iHW=Tk~V)Sgqs5QotM3dsdY13XHaKxJGs-uFZk-K)fwg{ebkLhDZ+y=XXCsU=o zFKR*u&gg%%)tw`$gfd0q3PsXB#elqFJ+{@L12@FA+u+%4Scc4}-3BqG7u6_`P33bf zl3hF5)T9kR`&FqEK>)v(&=OoS|xEqTK<`E%68`%p!-vck{(ko+h%cZQt6 z(Fo_UN84)rYKOP6eRfsIRrs}DF7wggHATJxm}k#875`WMPw5wJWFNmeHbq^xfC|xV zt*#x@(M0=b0%iI?DA|~5#lvNau`3kgbh_fy(0!@5Ri}0@OYN~DH4G7@v-kZPmeQ+O zG2WzjWQAfvnPQ?SKXafd1R2UM_@|^MU-_A+J6%QjO$J?5*zBIM=s=q)x$mH>gziJ` zNPi*r?x12F5=(u&m_O7TVm+`~qg?c*H+`Da(Lmd13Usk|w9g0n7!Crgl4+k;$J1m- zS8IGvpBJGG(}yN0^vFCPa3d^7pH!B`VV&q&dv$W>GS}#n6v!jhY0%q;E41oO;~Xs=>}8Ut2cT>ixw%j3kmJWP<39rFz8I zj6Z(OzuoI==m=luHh-l5OCwWxi!7qX%Bqfb1Zmv!*C36%^*Vi=zx+tmxLt@d{W)M! zm_#*+I343}r(Wi&Cc-zy%4_s>oR7=t)^wzs`+;7_p_H>f+A&6W4wlpD9LMJO^z1+B z!Eap5uT3H32DVp&g+{g<{oIuzK<_15J)`UJH(3>LAiXW6y0;jEM%?s-`LB&yFl37K1 zV#6oSTgDjQ;5S8`+~e-_AZhdq7s_hWCf15lluuj4tM+p*P-_v+va0&Ziiz2{n>YIA z&fG4;94SI@oh+kB?CB;*oSZdgdzU|QL8qw*TpZEW{ltZG>kJ_cs&R|=6|E3h$vI+; zGVGep@!*9TP1p;%V-H-Y9Z9Clu_T_mwsV3VFheXc={*p-nHS!x*x3DfMM=mX{v1%K zkEoDB=9|AC^`;yvCq!=wNGk^y9|Z3#DgTk!741C)4r-A2oN-@;l><1}c#4u)ah{1()R;rAA&b zMI%{K5!=I*WRj-qlf$&^Uqj=P_6Mh5_m)xp@lx(TQce4GXor-_qGkJwsij9+%^`86 zhg!>n<4WsVbNSuZ+So0ww7j)(SF~8~Q<16Ptx7q!Nl~FRsk(92I`@pCM&*!1+q&)) zs)=bc#~ZD5lj%Yb(hPUd)U4P19(NWwj5Af9=Ry{5N{Zan_IOB8oo7$Tw#txQ)s z#(ml1Am4n|doa=UbE8puUm_* zM~$faggAKoyWivEW~wt&jsEDC;vg()lAQk?Jh;ne{$5LJwkVZ+%t-CVhK4y72mxRn z{(o5HPR4_fuMS3!Z`~^fpwsWuQb>tgU941yQ26ElbTcxn96GRl7u z8d7Br%P)FSQrvOA(kNs&5;V6?h^I`E*`>bx9N~gpF+kX}re0{-DO!5y z%)3?&Ml^R;hR4yP^^xt$x_BwMMwuQbjel4>MK$8SD)sP0k?0MJzgXj?QGUJz*QAc` zj$Tob(`S~jm&5~@2sT*cTHY*vbKgwuxCD9Ej;3ord5Gm+_Sz2zR~R{Y%Kt!akV{CX z=dndTCvEdC&GVV=PW223nW!8*Zn%D;n7?%D^zXfk8oUS!mo;&>c>T|a+9^sgcs7LW z3?V=B$seDO@sZ{vwmj{yEG1Rf4 zJsc~9a68#6x3;4}%jAAsD`n@lj7jZAsuRS+#l(w-$2?<7rDr zVv5hx0f?Qu^2@KrHS|-SP%-|aiI9VxRwybdEdu#?i+TFZnJWYo;)VHG5dm< z-27(m7yIV&jozTNy#ZSz;9WX+ufIR4i32*?vdp`VmXUWQa;2A-dc!7hP2{V= zpS&|wfA+`5^6TgSLzzQf-O;&vtBxNx>#MabuCn`?}VD$8$ZV#qCtGJ3?FMLGx-(g$jegW7PY1c~>EkOA$GWZT z-N~IBwX0r7i;!WNWbDhY$s)zBRHoNRj;wixUpA$dbU(@6(&@XwJ6?N( zkU~54U+c44X1t-fqdLA|D2n9G$1Uh zgoeg$a%tMfDzC7Y>v=)-QJX#idemg>lJ1hKO%#U@r9X9Kkj< zxkq=IwZ><};@%M>cb?a&wm5IsCk|H9r50S1Kh$s0ulf?6pQyXeWF%BolaQKRLOA^}z z*8V<91(6MkCy4r-6wj*?w(6_mMTr1Wl0;K8N6I8-P-vY>PDIfJuk0vc;%&`_kci9y zSEXSQh5-?(RFy3?-nRX!ZR1tPmGcDR4GsA`S}Q9e6J_qwtn1lP;1%}pD2?uUYGh5Z zBdEFX_cdi}s@Loj$_O4WQLZ^7R1uWeOU9JU-m+rL@fBlkFU|=r&IuWw6w_U&Tay>v zZB1FR-AV=M77i~HiuD9tQ_aHWYg6NI=Y4hfi;tR2A>&Pw@e($<%}pk~uwUr38(V$h zYJMnoE$laP$!>)9{wzu%hcA^Jr_b+I(PF30e_DELn-%ww&?iqgovtQz^(oE&3I{hNliX_&Cv-ZwDX8I_<`zK0X|^=XE;r^PE4eyEQ-O z57m}FWtQj_7PBtgCFdma>G?nN(bemM=*|wOD1+mj^CVSu{?>##>Y;3(E!Q?}Q$#Qi z+SR6B#TJ$8ut9EP0>G~mz0SS@CRUyoeL=<9cZAK@+4pYoFZ=)SU;E$ut6f4vPWffq zGGDuO*f0GL`^8Rs{bim~tCUH7ESxor(u$*H4kwZv3q?6~>dpUbeq>`Gr+$Q!dn`wh zaI`HbLiLWY77FX;Re_Od{=cF&0p%GwHM1Q3AzRY*;E3xbal}=hVtZ-9(hQ$k?&%ai zCnkk+6m~7sl}EHWG2O+yg+qaIrgnBLLbw|OIDT67<@GA{p%6!o$m2yGp&ePmv|9O! z_ITVqE8=2Z$(|BpmGXGDsv%H1nOKQpp@uHf!4Ri$wLYuf!-V&E&EuPQ?ToCi+~Rmx z#I4ZpRUZj>ywdTIuw^6-9ylnezu%&-WjW~e0|q70LgbS!e4Wb3UB#ArMsd3!+eD+K zU|KqFc+znDAbonf*J)oItq95>RkmG@dqk`hy-qV?K=CkXc#?m!sE1VPh?>VrRe!bP z>dyr5^?^U#e)%tMZ8zO?LB&e*&e=PQKL`&zxUb^4Gqy>pUnk z%KI)TG^91PwB``CxGAieU2%NZ_JlOg&e=!QyLLH(1*07)4=3esM9Q{$&xlILF_Ang znc(|><$d_S<~@PDCwxraeo}H}$p6fnFWP65^RDd`$9K+d7#o7lm|eS$_&F|!v~J?c=t z6~#^2aI>aO6~(@qHXTuK+g0RvuQQ8~ou=VQAB2B>aCSv8Rc)&*ay%#eI9=h|o^j(F ztD;5-x|5)RBB*1g2;}QCdsX!+T_pNs%Y>V6`4n|jrCK`7@z%|7vVHAM`@y6NJxjb} zm2lF9bAxDENs4mc6n-^atUBZZGyMrK((H^=ax>0?n{k{2bn32KyFmpyE|!ZAt2IHDEd98-i@N0D5878qP8HIvhx zpce=3nI&R2YIbtg-kbsxBSqMm+JdD1>bYg1NBogyUtZ*MT{@J0^GJ!X2!v_0_iVYSK#8ffH za!;{EOtTuPa%1E!dF%>ZRwHVH*1pkKT~z4_8qqPSX+@k0eM-`Z%E6U7RniD7jvGJ8 zIg1WKo;vmW!@9c_KeMkJ>5$|KxuubO{mgysC*4Ta|0^PZn=p9TwFN~BQ$5a*B8Mk9oH{(Ba;BgMO@VKJ`7A40 zJj_N*$>DyEDI(8~x^b?kDboe=LJODKg;$gNhE`l!vLHdc-;!G}ed(}O@lryir=ySl z-(k&Hru~nw#irZq#mifb3wxF2++OB#MzJ}mEOTUwyiKOtMQ^_;Yo2rCj_|oBZ)}%c_8BDGlgBHO$t?)FN=2!72(RVrJW(Aum0qI<);=EXZy;=`LP}4l;^?A z^xecKe%g9fw(ZB}R1VQPugD!uiulI(^iPuNFxzE${~d30U3J(+x?$gt%DuwyX zI42#U*b?X)tfB)Y@?%lQ(igsIy4e?Qj?Gcp>)%Y!@A)TFP+yTDx&@U-)M)RN_dyyd zM%(*fl2c##-nM#AWyP+V$a+T~5zd*E>GYH&)p17NQSUd?oT9zHHbcK>ENO0r{}ngo$XQH8exvk)vIBI+atjIr4nt ztDnmE1odZyaq3BCaCv0?V8P6J5x7Dx&g%wOI+|{&w?{VK!GqE`4^v{~dvaMS^y@0w zdzlqM6Gm)jGjUqZNUu{*a@sSbiJ~y@^TAsuwS~I{NeNW_W5l?-~w3;zs>AaNC;Yow^WYV$!s|kf~wPUwP>X!XqU5CDl z6#bq7DM?!|i@u%ICxv0rJa~#WC5gJu&<|c1B=4)`$V+zxu?HPIaLh1?7y3JS(bbGX zhkA0&c=z@uot1jsEHa9XNY{;YzuR!jU42&a#)4>iv0smBpDFU$@ptzM5ys!~iUMTwExN!Ey|wU zg-u8NN0d1p7oO|pMW!Y15J|r2SMFf=SHrY?_Fzx}4Woy{ceI8%ud^#P~{b#xbg&by~*M`?A+ z%@$j1MB?f&*K|*O`iS9nwG{tMm3l?C(h($r%?{uQqbi^z(GeiWN?dK+93GsX<`H`- zTb~7^lyX-IJ9{J26#LITybi{0N1ihrkxj`J{)rJygOt7691%^6H~1y?Y^uBFEgBFa zu8+i6)cMU+zT$_Hr>x=yHuFke)_7!v84k~%BkLEnQjbqjK<$&GKfxFZ0cRKKCx(xXW4qc@g<7lgNibjqG;`c`a>-7 zm1XAD!CWZ+!aD*RCB8$D`8Z~5sx>y18k?$JUpb7TpuRGcnUuvQm8{iqab>s2cxOpm zTzxpIdMlmubuuIGzl1?YOYCZ8;*UGm~Y9m*F6{>zEkh1c`+OQ@hsDAD4hWZf4CQ%E{q}3u^+2QMz zYjoNzfk94gwMdCqy2J;VB0aGNWJK>(F;Df^HXlxHIahoB+-X&HDHn9P1>=lm=iEP? z8^U93W7k-=o(whfnmk_G>=x_q_1#mZO5^)TN%BW*xl=8C*fYLTynW#KR&XGvdGcKC z*PUsapBZO-<(&J3oMw4oN1BZ*Nz<$qY5ML_9rudZ9c3Q>xia;WbMC|EIB0ZyBs`3T z=iCR*@xHWQ>|Qm~nzHdVk$`{fC?1u2wN0Q<6W(Jf*&H3@TjYW$AN|g2SL z$fN~jC~gwngnHnzPhXN$yrHSYVCtKVwZo%B?>HI`~42WP)^E~ZEK?6v2@ z8l~(t=VHtn@q3pt`}K3~)#pf~{7TFeZG{r;%D=@_j&r|$u0okBOgO0;e~qcU%e@>Y zGo}F*O5V3umn&l{2e_Bw*w`LZ*{3t#TiP}Cfph(}73$_omWUtiz1<7X>4xlcJz)OT zTcNJam)qsevcsC(iQ_8NjhDQp4QyJGP2oxSwwi&7vbf~ z-0>p(h0Z=uA4(VCMTInr&@rs0%#ZrofBXoQu`k>?BYw=d-91&#{3%ptRVZu6cBWN6 z`u`#AUBH{Fvi{-ZOL|1=>?iTMB5CqO=Iw1T2N3&~Oz&X)u7d89_$zHa5X2 zDXk+EF9mTX2?RogkyBJIiZ%fYLbsfiH7u`sP}hX74XFO6DNTszw?d2KZ9PC z&-`7Bvc^S~5FVNARe4&2THMf(wUpLt%}sgU70pY{jdHUpui_gwKmLF+L$gznVG1q9 zw3=JC-zfhM@f0ACF+hCqyGEzn@3aLjqSkg!b1g=BImS2ayD~X-j(bu6e5(K1?)uY2 zDbOC&|J3SL5QcOSSK;&-*8vDDjuhvrqHS5<`Sjndax{fYxT9m3pCj3&&3gcB&y$jf~(1V=4Cj5s*b4cAu;Be>z7qXfrkd=U~0fuR7iHrxj5 zYz5djY=ZzSM(LAFVAlHx+re(Ibn!ZY%?KO{I?Pi2e{c2OXuVy31HtbP+IiKL%aY78 z#P6ug>z;Zz$D}e>T76f$%TW8?i$b2gL?k4RQ>`S9)z)vBIEF(UM_VC|Bdxx3tt5^? zC_v))CTQnId>P+eaDZ4(q`nM%!^(|7xjHKMO{?z+mGfjsO%iON4`8iZ0UL1#?7IwhPGBp+R{GXR zutFk{{}iy{cfgi0*m=Td1Z(%Llwhs#fDMR%)ue@|OFSfte`c`HSZe^=$ZLFmC16y{ z(~CI%1kjOb;R79pIXP+FB3nQ$0IV8e`7-@;bcpIU32n{5w~eZah>=;;7kf6r5C={m%xhpvB@ z%TI-Q?pw)~)FvPgArjlZ=)vKm{n;_0; z^}9A&*9PaQ#hI<;>ujk+VUt>L1udLyW1XAtGfy+`I2IwJtCO9(YuhVsE$*L}v*rCx zxx>p=8c{mX?-Q~&X4o4rRzPe09MxbA1=(8yl5xX0Qgk8U7RVCB^I{$(Ci6QN2&-Y; z8Xj!*J=l7c3|x7&5S#@2Ruyzy*c4t-H7)#ra+-j#TgALSY&_Q=4oHGe67OMc^`z&6 zV2%Pm%GcO_B6dp8P%%A6lM{>egfx!n{ee*5fWhxCF)%x@f{Lb4(eqN#z_R}+ zN@JjY3zapY?fNH)(V#kGoOM~SKq1Dpx_5`$8d*`L@OF^rdrYx#UPVDd>!?IgjaHuV zoab$#p&=T3L+mYOO2Jn13T+Hn%ty)-qO($}TYRDz3~29~u{uyjWjg~XyFJ8TDMI98 zwF+xNromJZ8aIsP0oZlYE!6Fo014OCM<@*zD8-)wA?L$`tjZ zzF5{}{Xz4-q_&!f1{x#sP3%5PUil~KoOrOl0SCx~{IxliAB^wqyX>*D~ucvuc8JJsrCe8y3e&-?UtYC&p>>DU|+hQ3HoONa} zKY$_VqbZjaZoWU3co`ZP1_PUfPzBb-a-}UnaVjI-WSv2zrv$EYA>y8|L0ot&Sb8+* zAWw-sLy6XzlG$E&NLrg1xC-47PJj54G_=Ggi9;Exd7h~x>ro`@pDsz=e-iZ(>y-hd zW~46$Znf?gh2D3m+j86=pi%B?VGem^4#VE$}{6GQCQhNqMvovAjB(Ku*Fd9ugWt%cIyGs&P4EV*s!_=3Q z)R#6e8p?nP!4Kf2q5V^%cFB*lb$3kF;*jrEZ06o}02lX6-=qHq*uo zZj(C0uT`O6Fd(CFn*|MXe3BV)&w5E*hDz#w#94AI#uE@pIuRH9?MO-CpN9Z$a? z1;cgI@%-!mfzG-AM(5&fI!{aWNg_IPZ`1L-N%iS1(J4l*1BL$hMX9r9h)-Oi&iWxf zd-b-bE<#Wah3~OTS2dlHi%jk+EuMn(;mVOj3qM zpLr>RGdz<{I%G_2gd+^*P4J!hhrA#zm5xtHvs0eEf~^Q7Q2ubar*~(RiDWzZ87t zy~W2)MG5wHvu^X@oji7nZ4l!FfD#{n$?;@n=Xy#nlI=0@mAV%r4DRq@22AXdth(xO zUPFLm3gK?+`j|ls>%)TRyGWy4r*N$cBzsw>DSf*yUe&a4 zH2!-6lVEYJKjKs1_s&q854_dpeZ(D*kj(E+6@KhOt8cvs-5SeyQV2hExt*WVzFM)> z?OKEf&o7;B*EV|7hKC!~ZV%T*V@-{OH>KCbZkyLfT*oBuEcaaQg0)$55o7NVhL`gM zx+J$T>FxaRixy{vH*6;Nj0IzMOuAUYWc0KU=z{496Xy0T=Y1=wJ~ZXVqJH!wZ6Jipmp80Y=;M3k zBAZPKd7$n&*;OO-K_sJS~^l*rtT`>d-}OF?N{xI}1d zBA*XJMef^lG8i3eJ<-X%O~-mK=mhru-_iN0n@&wts7AxEBY!hkGd0M3(kgztMCH42afb=w0+6_BUqn;5NI|X zjvtGk!X$ylW*4?KFG$8ZQM`0P+Xu7RuSoY5r2FNB1AenFy6k)(gR^3op*21iv6x!C z%k8P1p^a>J+1k$oNIR|_;qad9p6!U)jkEq16mu`&A#k&E(6`{vS+>G%=~IKk3p1ydG=i!WaA#(0cYd@-fO zN>K3T4#hfpkj%D~SkPr?o{!W<4Bz2*zP>;$TQ(;7g^?7wG3BVtzUOGk$i?-e*5A$T z`CtL!mG^uRZmJL3m9n(G^RR2EOX7xK&l@-U0Al@ZHwf8&n>S``!G00TjZrdTn03n7 z8@hC5;^+2A1O-_3zO`WQxmhDu;52s9_PkjOA5pxV8)e*fK^B&m_rmhmufH%VD=$x3 zp_}sVZ;4+ZhE|q1r}R|t03AWlYVr@>+W$%xXKA(CzZt79B(Bc;*uCnAbB*!bQk?ex z3H$NowUM3ny;=70vaR>z9JkAO=ithEj(B-nQ*LB$%UE{`Lj@oBQ)CMOww&HSxZh z^9@U}cHbFcdz%{mZOuoKiP?2Gu=w$9Jm2u~d4mal_noRT<4V23ILP)F0&*Cu^vB0y zGwTBOxq`%x{Xp13SdyUx9(Uuvv>uqxg-1pY` zhQ;SM6mOr;=vn9;arXXFGv$rSfBlXb4~3al~%ESjn?8DG%VjdN(P~}L#QU-psebN&b1{7J(12Z*$jk$aKf2G z#r3Dpp@j;5X3a%Tna*=~3!7Oi*B?E{_V4X1la9SO)ea983*&2kwKMFhn%Korqrf?= z$@YtmD(3V79(zhE{^F<=_VE8HVPm$@mUSK*3$bM}_E;t2j|~WrxD|(5vkM$~q*NGW zM{9Ov;dck~gh;#(q1iHg73`M67MWWiT@mOn>am+zgemA#y0pIPQG+T;P-Q zG#7Z^^AgPkem#%5z;jgpO)AfeT}2T9dn{#IjJYU$n&C11G?UpFgDJ#)DWdDVcCg>M z+WKOb7as5?gYWWrj7;P{K0Xl+@IQ9(sSsy4ED&xz_Ux zLGC$E^UMb%Q0v^T8a}P!V=PV!5(=velvumrxxA(z!M#t(e!?D_cz(&d8Z)0-5oh0> zv!s`iZ1rlhKPv}4sL+-3q9+h6#L+n{@TO$S+@{qAJ{7suOmHLmlm!d16@ag_Q&yjV zk35GZZ-})aKZ{SJ9-QB~*)xl5yYoD3dmLj<;hEWmqtEbBns^!PFX2)OX9*WAG1+o% z9vULFI{9}vPxJp3+*87-e}mihzuTORZ<)51uRcLpONa&gW57j6nech-9!x3fc`1Z zo%3?&NkU(-@f<>i`UeTmeM%BuseiP++MpsS`o=k6blp;*|NA;ljiFD%6w zb(#M0b0IAowNCV%(~cNE$U2O4ERuBWHL@?5D-7+*zYxUP5T;<^!uDV}%@RD@f{tR? zo9G^}H+Fg7(1C|raGuX4IN|gE4u`qR@N;bL0*BK6b1)$87>|L7Up)unGbG}kd%N_3 zbK3Ai(Qe7ijduHUw6SGHWyNK-vgKtiyKzuiioHl}H})_Tg&T@`2snHb9bQ#rH}j6- zN=uC05(@?mrnl|p42R9_pJ%u9axAx7bPku@a<^SR$Znb?WOqty1Ht)}v^EInLu&&e zS6Ukc@;VKs%~%{TS0>p*M~rLtxk!gLV#%;%dyFzEGtvRYSu!jZ`+39L=*L2B%#t1Q z!4b*J77mUen=f;x^7hn}B?)~)o4KpU)}-=qfUFXPZ^s?$U$`FJ z*oH}^(i#XFcz&mHnxfD(P38Fzey2haYc`%w-KossV6_z1RZ^d3u6(LDA@$$z{4Vi= zJ!)qat)YGl>N2tDN3_0!?2Ypsz0+Ik{6r-g9895`dTj?DlR+waEl)zH`@$srJu1NbOAEBP#R3KeYyw4Nnq93B-h z^B`-P^&xJ!F5|;z#bM`6#auy5xyw`(UchG<#^`xtjI~dfM9)t23fEY#FnX;8H^j!X z%x|*HD(m9=%fx}_un1kjFe1xUXDOmdV6VW(+*|UfWh~h66)Yr^JeGtwXzOJ1FgdHN zuLsAPXjoMWVzA;AX+>aHP}H5DgTcesM9hq3x^3DOtOGfdNPXb&{b%Zuin(Nd^oj>_-cO<8@z z@xxG@Z7P=As;M@W-2Ha0KpVTHcbvhAd?DhuXWgF+sa|8-L@nuB7Q+2&NU^rkGj7PGjZcWu-9Hfy#lxLo$6$KQz}^4( ziw1qo88%Ghq>8Vi6JR3rl5m(xa`!j9a@My;pHCTcusR}SafD~%A_+tWk(M)@UgPh zZuh=UyK~vN#m=0?u(!hRLFXEKa&;rGjLggo*;Tt@)=ou*H>noT~yY?+vL#_x7|Hg$?O&g3Y-cY(yW zr@9j!2h5(P@SHvgg_KlPDw8G?d!K>faeJ)Qo#GEDg`h<^8m|Of6Z-0-&uC+qP%;*Z zJ)>DLptKmE#${@ zZ?`%-#XV=RA|gL@467F>eAI~?+pxkZ{xj>{nLsAsxfYoErd$9T13F&nR`I-q;wxcw zr?}%x23PuH5TKqj!IZ6M(pROVG_|;)ADQxXshs*kP(0Q`0@-C<*(q)YwEAMukgA58 zGA)&>I~CN|xA0DNxBQL=#cvt-KI{9PqKE3|Vq?;IS+0I2r<({5NW^H~kn*)utC69Z ztoS8(!iGR|pt2Kn61TTdwVGQ<%{b3HG_q+q?cL(47O(yl)qq|D1pZ;|fQR|X8vbG3 z0IPPmt&CvPk(|1pEMc{vwK3gy}zOnWs^Xc{_xq2(7(Gyle3yrV_7uhD z-L>#@Zr)acwdr6@>HeU8N{c&1k@e|F>y6nPY;!dC8W*?FRBheETq%ZCTMKok8`ifv zv5)vxOK2a_^PSnN6l|TPUj$`2wko~&=ayjuvWCsmH$XpUMf{tc&)RpA(&y?;MyQQui0QMZA1`A ze2o*U&m3D@GXz+fqR_^dHDs3QZbZ8A(;55#A{`{F370ZC(?% zp<%NtZo~Q4+bYAk&2*4Q={62uw$^A5SGbKMmbsA^?ZIU(<+5eUN@HHh`^L)R=#qEi zDvbptD**XWrEyG+Z%9cc5<--e;PqI0ajbP$aKn7$kZ}8k;C%M-ku4jFB9|`7 ziVZC+ekMM-X}*}%;&=5IUg-3yn~HqHTduN=fokg!vsWE>t~1g8N^yR)tT?U3oyG!Q z`ilKqFcEXzEj*7RzI$7worG%ZVJh%+=e*?(JzQ;{CwohTmf3SOTxp?P8&M53E9Vam zS35AqIU34}r>uysI&YUhm{bqOkw9ZjaHUx0vbB)lMz818lVw%K^Lw|PD~qmjts?i| z(k1qInJylw6NY%auppGm-O-Si!{y%#kq@!14<7zLy86f3AEO-&mGTE+kELQSFSuLg zD0<<~jW1yO?3!iECkib5IeL4FZ6y8jJ=EMFZ?PHa*%4ipLf1nuuiqQ=2Bb>$vf@Cq zB(kyMrDm%CXkn%#vR|67hDkmaq1K#Fc{WcsLsp9tTJP>Fo@B81Tc?w(zH1K2%Ci%) z5~f19r8|(305$qh;{NcD(WM9xs4D*8gN&T>4spqf6odRhuj|~B=;gkEwU%rQEaCuUa_ zSozmV@3*_oT6d&#GKKv zWle~XFZr}qJ96oUtS?5|i{;j@W;>#F-w)A$*z8rzOK8<4i>ny6XRTwwizC{%vAIPG zru1wAGs5W3oaOUKRkmcV^Xwo^$@j~ud2Q^X;(7B&yC1Bwx!!GFX0Kh6nVtMrZQ1g5 z1sGC-^A|U>U6}a3qMf1d=@|uPedXPZ2G*OsVOC=&zdksc=hPyMq`dWh4mK7+?eiBl zCuc{w)9FS8%m{R;`qqp-;tS0*47e%+4|QgQiHn=j$(K{h!&nRl?u>+1K1rO@OorfX z&j^BfjbI!SjAvLU5E4*7ai)anuhs{Mrx%;M<3augo`js+a1$lCcLF(pYcl$tZf0{e zVKv}9_uYmYBf%}R-cR_7n_JY$rlr8Pv_q17aF0 zx6(Qon0S=CtGxO|j4nfEQqf4A$CnrfH`7Snzoaon<{L(J3j7r~tQjHFgT-D9#VYH7 zZqnua`Z!oEL=5@v?I!Fgr|JozLW9I`R_Mck(798^r?dXDAPAltX{B>2E?`V6q4@)9&z;GYl900@s<-x-?lzvxG}{I(WIkC+o%~ zya`;Mc#d};hr7h14By{{-lRyEPt(}^>uE{bdUXy~l=kS-s_VuF=grr~sviwL zjeqjRE`CjLwEJ#tOlz84%Q=h-pwl_r0;lW+J~@9(u*$gXUih8>9GcAi7g*Je?7yel;k=m(tgQqR76yZ;k2{>+z-ZMVen=?v{VGQ>;GC zdWGB5gZPJ%?mykByc$x#`KVZ3T32X&N=`rLY;qW5yk>#sTm;c{W3C`IX=;%PqtFgOZ3bV{!&U3TFD4rsID0mcS z1CeRz$SL4s^Klz(Q)Li!$jQR@o~ePPcFYMR&NhC3`t=)QqP0p%P-+NDIVQzq)Q&NZ zfuMv{77B+ebOrPsqchdjlg*YSZ5*ASfUK~Q@XqWJwB-``>+F*1=&a1-O z_9NI@65a+3rhpZ*OBP4VhDC4UvT~9G<+Jm$lS?w?S#;6{xby>0dle?=et%qW#PlP} z`eO&qohXD0!SYeQFsYl;a-#@#-1B`0mZ1d+t^NCn|6t&H>kl1X7Hr;mS~6FUlD)rt z8*VLwGXyRZ9H;SJm*9kPgfGwy*H>J{;Igf)fNP5JT?wHZL+CDcgY^@aGq53ni;S$= zcQJ%+G@(1!!Q_s5{d$TGk{SKQx2S*8e8 zh^$_}EkYY_H^skx!)^(aQ2Dbw&F%Ruv}P-onJx09B`?3vl}?q-spHh^WNDvs>hEQF ze^ialN7}RrqZ)BeFq|qua~s#|r^LUXwoM}~w5jN=g_BJf)~0(Yym;d&uNqUAbiFu& z3F(DwBWFF>;pJ_)1h`1;TYj2?mDtGU-V+|k!c@k(uOnN|70*8PlP6jmHX*HTbUIfj z%AQwfBc^T`Xn$W8%W<;seNo7eQ?e>bp|MZFb&5#J6QMA1i7N-r!9pw5#FZjDU*gNv z*>(R4$`){P-PCZKnJ`YsXdAum!8aJPEc*xD$hblYpM9$AC0S%vbV4$6`$R<`PY+PO zjFcS`%EUR<*+_`X+#hoNLg)bb_cKKmtKPGoTB;jIb(^N}J$}1x|XiC+s#I&zl{#t0zGR6o8$Gyd;YT=_pwO zUa?$DQnMDmoPRZFyFm1?Tbwv&Uv_>g2BzJLy!SLMu z4s|S?lmA<{?m!!HGE=|tWG+u$Fj@ZV=x-M2=KE)C9}{NM%>i89T%_*P;@*gRZ=vqi z&NAG0_3z60GFqZrIc13}q3=HiQx2XCxd}#c`PQKL#3_V?Y6I_gV9~kl6ee+3siLqA zD>_PNG9Lh)fy2zUWL|QfW$^_2;*vSZ9doiQi#v4ux;%Iwk|)o$y+eiGz^x-wcl0%X z6P%Tn?3`Rn=PonX+LqI|if4GgJpHpDLidtj?}1n8s%14!yY&yl5v5XQcJpfX;-d9= z_QE2KDSG$Gkna)G=jErE7iChQyaPV1zn+3`$j8`K1ROB1O6++9m)+9SZi%BjRHmVJ zQ;vkEfYUAPkz>&)6y= z-2FO}y*4?wkIhc{0r0l&55w@mYtbrdoENRd!*ea#k+}$yRf1~>~qsLx91bVM`zh?Bz28He1;%NQEQ%kdR*b&NXs&t4`M%hf1?SaRJ=bDK! z*$<4bV!^4rqsiocfYG0+S(h-<4fb5a{mzTp$mcb-ADVz>`j)3H6L!}coEP?NiSe58 z&8A~AzDY?oNaQ%@}1+$VOKsjf-FM z{@vpi?o^GAO`I`mbS$Sn6BK)&%BMYG+35Fw7#AnTof^I3;(oWyL|ldPEbTXAGIf>c zYG*j>Yq1%ivi(Fq#jsP_aaeHJuF$XNHB&T7NI_UWe5ab~T1{^^SS*~@VXjokEd?@* zimNQZsXzr9!CatVB0;ca0|8<%J&ipD@t2c+r-G0kr?*pfbW#1whr2B*RCMeX%B2AL zW5a{yN#{Fl-=9<{6cjI}h*X#qc2gvq|6u15AlQPlW^~aPg~H8!WjB4TFl8B>@wQV< zLlb(~&YVo!7j8RsGHoe`XV?;jX*6qJ%tuc*b?={@JV{$tbF9-luvv2AB=%j}8NW*F z)DFl(4u9=VIrQL0(4>g8JL{L)b(0Xiw!6e$QovDGf_S@SD2qGb8|5?x#j}`N>;XAH zMLy;z7t*eFV+idFVxIFw6FajLmn43{=%2NkI}n1go#>wq(I4MI4sETeQR#L!*+(s` zc3ayz-0lg8^Y`Oi%+Fsw#c<$+Q1wYR(-j`2&b{FzI`=+?Lm?D)xcQ%Noi6w}Lz7`) zktC3@aaEJFcSpUMySSSX^dztSGB=tSNIlwv^R4c9r=Z zN6H!<7t1c#6~pbO;daFcyJ>_y6}j-D45`ruOLVAD*6gCd1q9=;HB7PG_zc>R<_Srn zr-|x6M|iLUfjG~eL?F&m#=J^+pkrEWv#Me4NuTv(jdQMR&Pm%6`ecq()_WRepY+Yb z>v?din-vuk%U+ zTiJKoz@1VZUc-;yB%c;(@hvk8a_lIZoy%%Ic_Cr)=Fdt1Equmc71)-WqEUCV{xW0z zk5&W8-AHnOT#~!>-VX7>lQ3!2gyRb|1w&vc8B^BH43S*;4X)$yJLO0h2lR$i&hs7i zCBZGWEfGi4pVqUj{B`k(CTd&fpM*gj8A>tpB!(&zqrnLSIxx&h{mt#K@O+OR%IsgL zEw6RjQx*R|n-OhDEh#l4&4cHB%9UoxlEOx(M?UkXId5@wBV~iteSTWtjDI<9>YUxz zW|@q%RsQhkUf(TJX)7-9!Ye7S=nEUPVfzp!vY=S*S(o;5LfZWAPcSDF_G^lo=y*q= z(6?hznD|Rm`Ffj%)h|p)>?oY9rjUB5t+g%0v8q$Z&sk3%9^< z4-{ev_a4H1M#3#bbqt&gBR};6E`LYRq#}eSqtawll{aXWTH3Kyj7jmlpEf!n%~*Yc znK0Bpn&C?ndXNrnX@U;zWB8OpWJluUx*x#n{pV#xe>>q-k<%|pR5p>#TY%3v0_JVP zk<71H0ksg`p;Z^wl)Eg&@_-+aEHK;aEOQfPgApvg3ma&8>-lTi+=NswJD`;${(OSG z`-`mV4jj;WuL;WaF~h}K6&-GYd~Pu*;^h;K2vK*wDkwX=s>{*7il&g)O_*EcRe59` z8R+GHt_RlJd6$y2j*#`Ywgfjst6^NApC(1T*(ulZ$W<{d8|hcQtPdTB*QUW+~?iRm1fxTeYD&c0kXl=q?SES7IyL1Kxqro^XIWw8El0F*Lh*$IBJ5K zQWFIJ1)?V~I}G&1_*3W>_5|m>IK19siM7NcbD_noMqXvx{^L+a+Ky$lSeg5|o4Zol8-8jK?A@EQUmcu987g=6!d7&lB ztDZ7byJ**#`L7rkt;kvYN>Og{V>a43j7<=So$xz<^E9>RsKtMtK$~8tTEQkCYX{95 zUzBINpsVJpeZ!sJs@Lo9++a!) z0*38fi6_s_b~e}+M4Ele3gR#_Vxsnb=Odac@Et&6rc}{+oGs73Z1*az$u$?El}*vU zH$n=~uL$m=?d{~4!{CW9Ww#i5~=LRSrqa`(tQx~jr@4Rgf2Qp)3wI^sQk>5eLldB-sr!?I)~iLbF5 z&Gc*`F+WZnH7) z>=d4Ge-mzdl;Kbb8{46qf9ae_Vo*wAcoJfmq4jKR_bRU`G#6r(h?5*HiNV^l2;s)w zcFO3(S}e1Z48HJjr-`OG)0E||X@b>4qks~#ncMY*f6WXJ0bMJHdNSomS{EBG)U{!? zi`kjAz76?sr2J2mUsoIHa9~z~1xEb3vEdXzk1*`eoi?oey4V=EKS}Vnu{Ed;Sn|VU zvMamnyiQw~=%Bzw4l#BPpunrv93=|}MI;rJDu8$j*ki=HrzyU(BX^8bWzPs_ z*I+&dK=2v(B2}w$TjCEW&6eJnNcodIf(3b6D|6hNxRUHz2R9*mqN55l)~Di3s`WY| zqof>RYA6Pal^1>uPC3;P^5>fTNksnV;Fn`_IPC+5R8nz3zCWE~2kmF$d4z`5_GjEF zur4-IinD4%gau-VV!M5wZ*VhF9~=c;J=vY!XVy2f9h%H74ziZ;1XS}=p6MDLGf3Zj z%-3-Is**M*VSoa^Oek7*OgwQ6E@PE-DYBc=vdt4`*`x|A4du~sjGQ*{wStnj)|8A) zLER?V9RZA#LIbCnPhM@U%EpQ9B`d?KV(p0kMq*|@iNTxsKDzfh_DOskiHrx}-Pe@JUhu6Dspohd)&T6t9h|-Myw@ zWbLk$ym~vd_mZSj|Fd5Dj9)IKri7}t--i)`FGkdTJSw;2R^|8U5qV5fqgqyc1 zpoV3H>X5_fcB$bndQolQ(zJ2*U7cE0$)v>-aJ0W5>#fDQ8%llqQOUw5i$5Hb)}2-h z>~xdGCjcAEe)7!(>>oVYo?{VHjwAb>!gheTYJMi?+O`YOh$o6OBzIG0XhAB*OJKVt zFazJShVOxvv_4*ZK$C%qo;INr^%0|v`<+U>w{0gt-SkdTOK(8nGkWoe20QqSL||&D z;3g&cL`B7MltM<;j|psqX3EkV*vZN9-4M-(1&oJ+$0HoshO~& zc3tAYO-kHfM2T9j8Qg`5)wW;gWKLIH{_|ZK-&P*SYUcE)T@$vPxg@o*j z^`2eDmh>2VdTjMNZOq(Z^1-U5ynAjOKev}TJ&sTBm26Gk_?sm?cCH~j{rz-4JtqCL z6dcnU-IE_3Wk`=Pr^k*Rsf`&r1pArOdDGk&er_xpnGfq}cFHDLlc&a z&7l}D7ndf54bWRRcYUNmNJgDr2Btpc>h6_+uX^{Mq?OUONyM6aPjX;;@%ka-_kI^y zU7I=E`@1&MrlT)a(ca&`*nWV+5f@t_z0ht*AHc0MBcxm#;op;$zTu&r5u3Ctqy5E* z#|*kPD6u!?0D=F_~iuI@^MFBr;CC17D1>(eGm_fKsdxp1rxfZqWgJY!;Si>P^ zuudaOnSL|`nA=Yr14ZQgt`mV=KsM=p701|IQTS*Ab_?%sFPxlYO7F$x?+WVje?+cT z1+H!h3%I%lYeF@%^$pd_y0JKUQf*}Qgz2-tsPX=OK(%9wHpUiDUmsgPU~2vbT5lIU za1?8!&{`l9q-B2hp%nj0cWEQ@s*`Kj7Elqdt z0xqX{F203Xqs?4+#b@*Eh2}KfG~EzaZc)w(xNa_};Vj z)nd$^wZ6pm{SijSvpZPB$7$6F?0WjzjxBWIMSTfYNecIAJEEduzQkIQR# z1-y1Ri?~U>V~g#Cge|bT>lH)(8N|%+VYUW65nR>vw4wBvWSfd_90`Tu zq=w&{>v6i!un}o zv^JvlbZzove`3qvh^yGtGQO?Ma@T5=17}BeRHyyEw#R~aq{&<`Q8v&qLS1(=_(qRM z!hcVUc2~&~gNLgdU#%{AHFcmv-4+B$;>r<`RH}g4L6SZ+K#$z;`_gB z7f3GWj^oOZyg9XpkNFelJfc0Z@rh~t8xfI{wGmlw)fQe{`smaR+Jdmem17izFOTQ} z3s1A9;xIce|0rzR{3V_=N7&|VDcBC0?E_`_}O9V>()$NMJ z`Vl?Qilit1qkf)ix9Vq*iVX4BOIkJPxjO9==O1Wql~ri{1|JI zpDIq)jenp)#A5dwLI^DfT$wL?tK}an*;-hTj!W=!`wyR zfBzrf?G8U8FIeu-k9#H#8hA1QOxR8>|KRDLTjDZ2olxEt9--P-t2J!r{;l?(^~ zC)Ky_HaqHjg?KZXXD zs+Ib{Wg0Xy7rP5&j?b&~6$R#R~zCN!G(;abH6Rh!v)dFZ=g3N9-z8Mmm6UXuWkOmLUr z0v(|(7^|Usa}2xWQ8En;*>U@DHU?S9ZK*^9H;>c!1DWA^GTPv2>-HJ2^>qBkPYwKV zbIcPK=jE))BejaDYZ7-VW+Ab~^`LD~qe3HN8{7k5lBpB3)i?#Nl#Cqk*?AM#ShA+4 zZm-M@fBw%1%42Jql)jDmv{*$Q%-BV8#xLnLW6n2pMnCN{PCY`FXEb8I11E3YC|OO+ z6Ij@6{_Fx~(e@QGy8S17pPl;}oA1r@V!6?@nJ?pTchRiqHri)r&j_eUoNULqlU+xC zV_BXlgb;r4+X#OR+EWRkw4eX~igWWS9F!JpZT1ueS`a2OyAHW|fLg1X8u#oiwAP=3 z4t7b=|0SD*NR1!_eN1D>CLr4-*#y_)f|uEZuY6O{{FJXV65Ttnw)>u(B6XverTa=2 zl}E_ES1EYfkO^Yk5e%Kutlk~%(g5;2osAx>L41ldmK9xUNVX)0T+d13 z`9|WU)VjJ2{^`sk@J}lkV$Qmf_;9BUnzHH+K8`a!9QX)6IO5~?2F8c=eO6JHWXz3R zQABgrx@2Sp)lKih9rTp1>;Kx|RnQ=jCiWqo)|3fLpb*-HzEh23DFO_^i2W|K(NC%s4+& zR5a4SvSzubq;02i9&H=r6lY_CtbC5|Yp{6lCbe)8v^=l3C63DPzO$vu&>YcF-r(EH z>UN{SR^DB=$cA4Vd}63>KP|>#AVi=qWl7u6X4v>xFwHP^UG`4(3+t1u?Lo69y#Bt# zIhYVS5~gX8s96CS>GpNyxF54uOsu#M=Qb6HPc)d4kRQ3Sl*}QuJ(KOT4ZbQyzp26Y zY&ZS88jdyiDns;TGCCo|Z0DV078{Q+rX|SuiT`c9>K@au5Bi@lY|JXjPNkvm)|eIe zEohj2Ys_N2jcV{MV7!S9wo$iv`$vQCxmvg_cD;U%PZVLV-maS*b})%=&SG*TLC zGc*IRBK?oC7z{~c@$c9*4tvKetyA>@6lUu(x$X@lsyz5ngVW?!F>>S!|pz z$G^ZI4l|6|?h;Qcr5Y)%ozBi2EXJ7w1XLhZIzstyu3@r$x(vr>y!QIBfd%cbxOsNt zPt&8F4nJ;dK!a;l>ph+-Ka_-P@cprYI=~+qY#a$!V+wfciHZnpT0O`e+KKsn< zdFmZ2pN>eJT>4XR+O_(Jtlw+S-3t{~B3uc;rKGJ~Baq2J`9ZneErv56VS9X3>vN?Hh z_{Jt)wf0J*zWT7#9s7yHskkdec$Dn3knigN_hg?%^o_t+X0~L!%3E*ZRU33Bx!dWz zpmI0%njkIeoSqWlC7cD{cIzj?9^JyIP?l9Gp`x1ncvugZ;fGjzrAA+Vi+B$Y~8an-d_8#eY~+TBmGsi>N-|GHolkS_3#s^nuoSo;91PnhS&;5H5Tf3}@! zW9@VEO2YB?729z6k!wLTvnPaLq~fk#}QYMBliRd$CR3ilGE}Q$tyA|mEFPc>X0A#1YnYqAPxpPeIa4-G1@H7s zjV>X)_@9ToYT7A8zRITwv#VdAPaDqhJk-#lV!c4HjmQ32LR%>2s$*DjGm2nAi@o9* zhpFRa;wwrF=`Im?10}3?V;1X}Zhq{VwwKwIr&XCvP2OvRH5EIgG^3#zK%bxBgfUzC znYl%}&q7`jw||E4VGzD_-Jd#&eTU%Okj`2n8Y_>nD0pH)utnw5HRK;>x=tx<9I0jO zl5EGwoQVjVF)xWtSv?Vo=ZGz-N_Ov+mmpdGMY(fn@&~J~dd(FH!n!AO>4YTp6=aN> zFk#`k*dj;FJlq$f!f^-P!%DAdr^10-XJlw7ZTQacmlms+uBsU$OT;1AxDAHYsaG-^ zZXEXAIPALTaETG}K_qar>vWD6~mCmDpo3Sy)&V)zxl0XO>@Lp zctxo3JZQXg6QdoPo!HHy_N)1(V{;7>NNFPyzj&!!u`;~SVWvjZ-6uyYmLB$%A9n3L zM6EcUgn7Fag?V5THOY<9O}V2L=|+od2LVY9i63ao&*>+OFZkSsJ2AF;quE^-)hnwa zK8WQL9ki$5cgnF7+~}0;`vMzeq1!O3SLQ}w32Kn)XjC5ZcIT!zM04*qJ(q66`|;Fa zct83xHBfra-^5xBn1q{1B-^86k@1Pc{JbR7Jd!%-vyUA@DE9|q)&6ym;lvK=>_fN& z;7jXSLRoZ}_NjYHIIYb$-F_`f2H@`G@n1@MLL{Fl$IS#>VKqjUkh~f0>z+_94d|2c zKib#R%G%d6>A$q^)=>N2cNjh*w6AT*VY@|st9{Yvtbub#DLxIs4hrdlZ6Lu4ECUtl z==SdgtW;lsTS2h@aQFtSMA?}XsC0xl15*hGi%w000Q zU_-WLA)2cKkdp1%bf}E8bM^|aoA1MvC0;lVarj`VIQy&Fo%;GYb& z7uo?lI=%S!gmAcq8C06IVSRtW9`uR=WcyP;G2V z-o}Y8>z)8nJbMf0&~CZk4_tjv6_UFYS}W-iwH1{S=G`iD_aVBkS&RFzzm55p|JGnP z#f>qw;F5D(9}=Qfz-#Zqh>f^;>z*LaV}y^6jmW_TNm=$4NDW1fO-UC_eB{u$`@hUK zzH&ga>wU$p12lUJ1Z+1k?~FMV$`T+19`!0cf0jmz@W4&v<&R`*%VL?)SI>O^Im()~ zG||r;YVb#4Yq$+9Z|yTn*QP8kJ}^@*g`6dcI}XrTG&k_t&3S6E{U97MHtMgN)PY4e z_g>q?-Er##?wpv1I|S#g!?YD=8sxzDQd?9nB67!h!9DdT&gxA*SFE#nkjFhgvns|) zXEoeLBo@V&ce~&;;N?BxNFX00WO`kK4aEE>to5TiVVRGaf-98p`fgIf6YP2K$%>_t zV^{_17|P&j7C!1?o@Ub3e;h3O$H6k5?wfp!8xu3eLg`h@%$263vKnfZa`PkMWXrw_ zjDO863ojr{8RnwZwV|e372aEo6P^%cjnfy`g;zDI^Os)Z7R;1{} zMTRg#_<_iH?P7xkPLNGX`nE+vB|HgKk}f?$s4?KCJb%!=dlCOsAN&;l9!yzsaDXzU z^dMfORN-&mlrQV~r_$KpbS=+MnvlftqliU@ce8}o^H>OPfnS?2^wTWk<$9(<$UgOl z1DKfjU1K~mX>#z^LCiP8SsN=o( z_0f(F&9u1Ihf_r}n1T;$A~n>cn_fl3U+aBOV2Ggw`qoFWK%a0EOC9qx3Tc`b*Lr`3 zn2!>if6Zf5q6l-EdDewbW+;5-gVO0ocVG*OSs%FxGGjX^3XA+=&vjf`RiGHmh<+yC zcYqvpPeO6V(bzufAjbA@NMA7nA9J(rQV<{K7b zZxgYXe^c@UJ8pUczU*X^G*r zO1pF00zT{IwX>HlpcQPH-t&1^Wdg4Jo4c}*Ep|Wa@+P<~gLSX6gMDI-hR!UfMqxfe z{?1>*a=4vbPORG(k2f{Gcm%};zG_1pYN6Yj(T;Y}cOW-Obr6oh0P@$CBLAuBlg_;S zsI<6Yrn@nU+_R^)hm1io;~;Dpl9HdE=2Z`TR_Y| z2bat?cXMRJwFACu2VB1#s9EE*%_sRHjTK89{_T@B{9pu(2=!0a_y>VG;WJ_mW75es zWKkjAD;ic0CpE2Ip}OCKJYoPQ1@t%Jw>@_Ne%r@bd#M8V+%$7F^^-$88D?&??mbTO zq`;D#!09BMXti^qZf~c9bMCIiRrc)Wb=)QVFtWXx@kQvEhWkv-LKIm5tehXwtZns7Ho_KmkIt6sEqFbR3=AK8Bf|xw`)eVTN@d01+nh3Soub|-LweC5BAI$ zULOi?Oc&p&$K+h=5pH_3ZSU`gJRC~jCkN=*D*r6q&TjiFq1%@2cGY623n<%6IBgSeAN8fN zX1_gVg30m+6X)K

    )Y8pUJX-oF1>3c$ukxZ@6bxk0noy^n5_$cCOvYf%0Fv3gEXd zbQN5(e%Q8&Ll!_da^ScmyXBJER_!mc9Vm;&^s-2a>7`L)Td{wqqD+t3rxAK*Un?ss zG8fA{AE0I9;gD%*^Tx`Qr^Xm>XMFnuF}*<_CF1COeBj--93!^Aa$Pw^RDye~SYeDX z6h|UHh^!0tvrYVb*mRwebNiBoO5ja4@bi(Z2Ac&qHdf=yVe=URMq^ zWy^`jxTJ9XcpLa~fY{U61}=bGVR`{Dp7OTb z^Ep0+Jkn77e^`6>xTxy2N0Gvu5tOSkBcLMgD&5R#(`w4@YNB|Z@AGxepw;f@^Z0%r zzaM`L=e*DR@_Juh@7L@7dcQ6ana71jq`GkUvW6{r&X>Yk)g>P_6(7lCNjwvzyZ7kE z*+=pWTqGB&FO1N8Qd%PDeBA&>T~=G@@kC>P_pZXU3LCfMuYQ8S4f?lo?<_IJdo2ri zz>Ume-5>WsA`p?q!-O|WuPuZdUqzN7t6Vs%k&35Qzd&n<(HfMr<|M3h^igir47(|p z##hlB<5V7<*M}i7-9-uWSxy$Z8oqp1g}AI|*CYx74GaOy>k3x>2Uw{|tUY0S<5>Aj zX7ZHIZA(v?Z4z_AU8d3_T%NfgalvYtSvP%wDRRLAnL#(x5Wt#sGZs|p%(__%%o%3g zeG5#;@CS2%^i)~+hO#ht`q@wx4_R=95%~)$O7UA*u@JxaR~Yd7z{U%GhJb*4OE_Ga zF8G^jgC)K?KxQoqKURyBcyqy6bAY^}S|wCcT#|95q9PJ9E!`YK%NfoqM{q_PM}+n4 zAd)5bafjE{_e-XKE}3y&GHXp%Fa*uj?o(^4EGMeN$GT7U)vBr``OxtX2aO>@TX0_; ziE@nJ4jQbd$Om3o{Wf}!x@y-wu1NdQ5I%O=w%bFqhsKMHjCcDUeZdpNyuLZe93-(? z!uCcFi!JMc{4zEh1|{|659dj$`%46u?7(8B7jHgv(Bso4*sU9s_3-0DNqN2=E8-Sa zz6q5>q$0_Y>t79@X5FQdKvqdrz`Nid!Ke^l zB605Pg_^+3S*&SqFBT2QCU44ugF|W;WFLV!*VzcRXMMtd^+kY%_!;3L&^7Sf;AHW+ zt0%`V1^ytD@ooSrJ~}4(`}Z$`a~7+*qfaxTFBKZTsgc@J*51WY{t-US*uK=pEE)c( zDtfaLHEDgR?`36hyyh>x`~z|BQGIc&wv^+uCvofST>_hR5FWw!>zE zxM}{_+YkUFEiOS@m`KApU323I&R6(}K%uP9HGzFu=c&qXG&Xr3l~0(-m#X+uUL^$} zxOC!66Zuj#7&!ic`}nO4UrKjd0&nu8MsxKDxEXZ!$`SMxKN-d}U(RR3-hwk1RX5*< z!3ycqoH&BM1@{$Nw-R3%)HnBmqp;9Lbz{UnISPD+?g=ofN155aa_f7l3rAKiO$`J9 zi^lMaZsQ-Q=ckzq7mdaNkuNQx^;z#Az|(zv>3qX`5t49QGWGgmDqi#Z4--^DQ6h=(U8vOO7$p>Ju7t%;*IFfveG?Nxsx79+sp%a{z|{sAd#^)9Wuyeo8pb{oRz0_NQHjhz_oD)^c@jD;Y;jzeRTt=eajZ~LoZznxxH%!5fkY)f)5T^vc zJ8^6udnSyn9K&etqSr9yv1gbkU#i zOu`u{`wnLTjhn57vMn2`_*1GlSL&ACT2$(jsMqlnSRLZ=1^(q4^!o+=&c^8OJv`*Y z`tDwmN4(`NAH-R8pciM=`829Hvi%vM$cXwfDj7e4_9T2_6Sj!UqlA*NXU?d2J8cpmTg=6|hqj!vxCA)`uBN63&} zi_rJ=7*pCBFczkcUhLz)xJNPW5oMyM9v0qpl1!=*zhi{oR7l&& zP8=%u`yoMukgIV{K1|0zYc;K(IYZN2Dy$!wySkV54*&XTn}rL@*@Mt_)AN}VUsaA| zvveB{g~coLGp0CDbsAI; zZjoa49VRs0;h05rFYfgtws#lmHclS|Nu1mm51i}1k?ShjiakNk-(^uwo?@o55~1ua zZyuGMJ5*NPfU=I9K@_Bs?YaRz%KOhjtw9{`65P$6DN@S~o(b4Ajjo3$wifADAHs)lSHryDGGO>FW9!HRdDK1ADgmsf|Zh-!Ox?+@b0 zc()?6@ppt$49z4LSR7KQj>bWDhX$`5a(a!zYlGZakM@6$9dO6P#jXci*~-zlcP>_b zHFd1>uu%JP@7;q9@?zO?mt*_G>t?$XXiBA@24V`ZJO2X>c_*TI=%kHQJ39{1T%C7h zqDZF9vGw6~>F(HG(es|v@dkC_&cRHLV#-AVLrUHdqHxb7C&l(ceuAAJUs%H8y4s^+ ziybarBV1aG!m4gNTq6v` zzrP7rk3}^w#`YfeUzHnQqW&ij${Wyu*k#+MMQhn_6hHq+V-C5;8K_3w4{1xzUefKq zTk-7~V{W|MPW%PzyLk3JyOr4rnlI5s@&-{@Tl z6Cnuc@d^K-Gza0zOAqTV9;BG+SjLb=Jd9N{^O{-(0Nwi!4|y+rp1>PDXiu1EwNH_g z2!r+&oaSj~5X=BKAc@inzBu?eG~!ZVJ3HDr1EY2iXN;p|-Ei2C5{~Bx-C_oL`Fr2% zMP0jC=VT1cJ>wiPgHW~Gau@=T!Gp9VOC1VYe0s3w{)q_J{`Vt1x}g|3UVRd zsXWwAQq>=gK{$VY{yO7caC5ypHVf`#WrNU*B8NASnP69iUy)BPl*~GqFDHhLQ#`|r zdR(^ZLOK7~*%!jsE-QbX!8wG9Eq$%=2HHpC{+7#YnAa`_BWc0Sq{148N$h=6-N|Ts zRZkp@S1IdQCa^bC884mw)yO|MFC3(74TD%FJ;Z(Nc}LNZw*_?LPxZ6hV2J9Lw6 zS6T{8KhwKA2%d_SJs`6X+PEvZ~>S^CPaP#vIJ&uP`k5kARY- z!}$tyBZP_HRKdeMnc>B5m~&2G9&F6Bk~zx?-t2)428XX=9H6T4f6m^5;Dh;5pf6*e zVbY4Fhn5xJ33~^aAyQQ79dgYpJ;;^27eAR&C=|*6!k8Kf!orCBqHb1`aWG#UFR~r) zI@=Bs+cCj-_7a40GFp@Oi)+&O!=;|@edgpqkCmy|sLQYIFYK38FOpXWv>%oqj0yHk zZO5`>;Sd|uo}C?D-92K%tGZ6e95!}_#W3b%c{NTKhkQ)X$*O6as?Ggu%!ATtY}Lft zQBwAak%6q>CXDp)xL|uk{`MVXJp2=%22-82fyUFmnn25gXIsKyXz~!OWhyWFEECC0 zagMy2f2pp{THE>hoxwE_x>cuA{JZ7{>qZ?7aB!DvvAf@)wSk>E57 zeY{`&`6bgpkF)PkP0+d>wSlG>>S#@1L$KrDmk1>GNob5q^-tt{2>hy%Ha}RCbu<7< znZZnr{D%;#c6-zZrZ4@~_BsC~R6FOJK*uMSOrQ0f39Jip@4?0*lH1?UGMz+L7(fWt zy0oz!nkJ0cKYf{tMzT*Z(%wutBT*)>PZlpjvmnDv)X8}G$CH3}Pt)}F2y+w}?<^G7 z;Ue`1m+GWv?IZ3GhNADOyak zsK545;8J1%Q$XBp)P)QKYv0pXHg+bs2DZOqi=5r>X229av-kRsKV%c_)eQ0epMZx zsOy9)UR7sU1T)w5cXn^>eKm_hYnkAawGRS0H`Pd|$!aG`gMf`PKQ{iJurV6gIKDsS ziH@Kjg6#)Wj-uw;WaBAcO>*=0Q#-=z?JXg(wU$wEVzeW8My=qFz{9^7*PPmc!FWKqSx!c@zs?NR+3 zFL#TTA99+6%IAEO?6qCmc%l1Da$T_d$U*-i_sV8%{0UhrVTa4Wwm&GP(7Z?jPRlat z(1R6q@nB88y%^b)MI(crVA$Ri0d0ex%v>hT#rsKSf~nv-PJeyb7^KB^#6ghm2^u_I6Fi)pX>flx_OG|=JG%yo4=-;!fvrV=(V1k zWK&2f4!T7(ZQZ}2ngz}z0V+S$^sXh!2PYUrHq&U;|AK5L(Yw3s;D3-!&@#t&7$Wrx z0^OW^kmzQ9_bs|veDEgS9DNovle%Drsn|`L+28daH1nSB|BYt$bOAwsO*6ml0(gF! zxv2XWH1o%90ZrA<5}Hmt2sEvvo`Be|`~}Ud{vT;3T*IPTpy>Z+nmPIxG!wNF%{)ak zb4O@wZO;(NeB>7-Gl)oL%^YB)D>;Bjrm+_2C?ezSrt#f%L1fqrn%N}u@qX_UmrN<$ zPU%5E&74UcC7Nk`?EisgjzYbJna6qr)KmA&g#6@>H)$pi?{EWTYGqWzx@zAA0)^3Q%&%a-{V7B|(ohX%}+@=p4vIlb-yM=>(qj&Bl zKACYg^^ncyHCj=SB|LZudne*#@+&4kAKxAeJ)7xmxQsl0-NUbN@z2=#XHAO zr*gr+^v7w%J43NusgQC&&5XS80x3 zAL-}U!3+L2J)6_xqjU5r=eX`#O%C}FxF!Fc_e&j9FLX?gi8`i!`S0Ma-K1j5aWNzS zmLHC;E@syKQqT1JZuet7wuEky0XGqNzmNfU&nKe%TN&^%=$RH%PLcuR1$uIELcat( zQ`4Lt*RNzkFtHT$~3hwPHIC> z+QQKs7yM#KM=%%n%<7Pqpq6M)ZcuFPkzeRNw|2Yl?y;TiqMir?eXA!VL2p6(wSK+l zOn%$Qug)F_pVZeOC$-r`f*GXSqiL_OIXcGu zMYr<{AfE(Nijjt*p8IsS^E3bu@2P(Bxj*Z6es=TyN1yxCZs(^r-+%DAKkjyZeDnQ# zpZlY3=SMf+zw^02>~?;5^Zi?&`~7a``#0ae@wwmacD{S_{fy6jyxV#F=KI$^_rJQG z|GN49mCt>&+j;cnyVvJF((OEQ^ZiSo`*64OjRQmQf8lfYbURg&J7 zt0ChsQFe9T zUvUzViA_&YPQppN04FEX>;KEWjE))7zp@+{lG+UK5>5hnj(|&$X;*ebBvME9Hpm?8 zB|#jVf~(bA`d22V&^GAeU!DsOv>;mu|FOH>O&58?IS!{1NVm z0wJW%AwRe#L%07(6!x8ILAMlHqLC#H6NH0BMO%V#-8DR`Q|2qKun^$=J+LpN#_r-@ zIQv$(i(gk8Ufe2)=LbgF||$>VN%O&-p*r&i{km!16A)s@wL? z0onz1zg|1)KmFIWLmS|i9{<`A_r5xM71xew#Bcj5?&rou|JhfE=l{QckaId2yoNo<&Zxp&dJ;9%>VI>jkYLOH7%Tv_72k2E z2U2yx2i$1q&I1CfNxlEP2rqEEyPz+2l)#5p;*pEURt&$mw>h_B7xLI-j=qbKF^_b= zg*}3tD|zpj34!|ITlqE#`2y6v$OjvGw~aDFKXE+rd3$c<+aTnVI}TF5kurCUn9rL= z^>tmeZ=Fmxdg_-k5V%0f!MNaJ&5?T&N0-d% zGFz=mi?*!V^-ihgiklp`6laB}s`Lf&a@}yXX7DI31B>a71%c-DUA8b!yeHmk9j!_6 zs3v!n{2rWjY8eT<q%WOC(RMo2KseTm2<$P>cUN`RHhJJB{=`> z#x)ggn=k~)H|q4uLzeHw-GN;{4E_GrXB*q)%^IZS@?-|-MU#ftNtY|Xnl{=w42w|e zv9>z4U34aNEtkTP=s2OFK*yGgOO##9L%5mCUkAGt$SBfA3>7;k6w7eDc@gKj@GhL| z!h~W{2e@ofg0TlMPOb~?Bysbu&7MhT+Lvgs$qAoYc|-M_TO;q{d1k$xPOy^)Y|<|E zThf$~@D0y*Y9w9piKjP@tm7b3MDTMj?*nMj8x%GZ_BC-KEVf*5GR#7z$u{5RV8NYv9;#%eo565O9_ZH%u59#OSD%!$9L1V5#Z?|EdVs3z$ zAAe#=U(gA=ng2^eK$Xs%eCJ2u5N?=D0@MxjPOXKnrxW4ZqEqS$>RalDotb3Ia#yLW zho;o&YBjB`AB8szJ2jlKsA@EDI#geqa{-Fl-gN_@&#OV7E8oQ^4*5Q^F|cV??d&u} zAv6=j`wZd~aWQyI-OB}qCdI>$H-4%4eE^^J_Tjhf_5f(ozrHC!R11frPR*O0<7LQx zOEgjWB4g_8#6(mFWv+i@J&dmPNoFk{G^waRgb%t~;bO|}3PNI;hpqf8!>h;Jt;gye zeQcd0B?NZRFp9*!f;$0xdiik)WX4zdUkVC;ki014g3nuzDT)J-gA0jIS(vO;Zfb4a z?Fwbi_J+HTRP_E61L~T`#MW10!*i*}pLJ9ejb-fWkdEQtSdOw)(`qMv^Wf!VBR9Wh zqGeiIZM>!P%!7l;a<~v-;BBb#FfFvCGFF~SV8kr@4=_Hr9{bjNUGg|!`DT%#ERaA6 zjZa#b9Gkmo-P+Zd;(2qemI+Wu>pT&D?AX$ZuEcc>>#u!o3;MPpDK5y<=VRg~Gxavc zl2Fl`@LDlrwJyNJ*>&M-U-lF;v2Ap@p&nnis4u9_(J?}Rx_08_WVHkk$Cq`c)ea`- zoc5(GgX~oP4`0$Vth~w@x6IBdBLGGvGI04zxc7|SNx*sgvV|h zgw4>0o_c##gm*41gPK8jujBu6{NHsAiw?J@-X=WIhd`K;E%xq22q|?rDR2M|?EYjo zG?~Z(S`l~>usMQm#bn}llKgG&_t>q7dBm9Zc~B*(ZnS%#x&g=3cIzidF+Pk3M7&o2 z0mmQX--q-=&=l!z5am^g^^P#YWPy^u8-q)9ihXQ zoS)Gk&C<|Wtn50D9FLYBWyy}2zH6>)U`rUPEq%gO`e*(<#Bwmjc5aOA)apAmjK^GB zUS0YW7hPy;=541o{?(I~s4ZRUDt+2j`i%L3ALl+$%R&np){L-}kqgDaof@8t%?SU!`T^cHxI~AFOp?xxlFk)?gd0_^5317F7PdraOP?pDYHpQalVw8~Yw)>XPro10PYNzrRHV<9PRL!V&6VkM113y@q><4$F2X}*LCI{Wnwb<+kxR@(-cDwDc&fZQ#-yk!x7tMUk`b=05!fdIlL%^zv)N5u`Mp#Zh`028GQpn zzMXDCR4eRPdix1={pIQU2ATJzONIS1t>HYZRi-Xg{4CY{aldHvJlgrkPJs)0$#``D zY~-76u#tZiV3eu{2kb(4m7lNLx17-O=j-j-MSc^Eh?z{COBZ zNaHhJ5#o!Rn8#Vwi|#qPR5|_?gzQgM5XKbAIW}tvpEF$B6Ung+(m6?~IrC73os;8?DYRL$%pkz^x)M)8$hW?e?&tY!<=%!Ta3}(=d0QqpB&dJMaBGZ~4^8cKf)YJTD7*)E954 z#<=wh3;2ci^Y;9-B>h5!0mLdxEt#G}{r&K&IBt^b3nPJ4U<)hsn9r)-U_{Zoqj7mn&*7~Q`xCPlf14{4C1MsJr-u3(&>cHR?5JvcI; zs@doKsxyVfDY0W8p{ii4d2j$)Orj8Xt93N#@cS>!vv=Wj z`3pYH%zgX^K)f)`^nIo^okJD{@W~M;HRbMuT>%Fnh*m!n8z)GcwX~lcengoK(ONy8 zmHmd;enVWpeyOT_pWvT!WJZcEa|vH|E-U9=HU(J3^TWX(D?$P@H7NznDjb-#WgCGl zz#MVi70i77n=?}c04YZ;(halR*#_bhcKo#V?s5ht=>UZ#d) zwPhDFb$r>+DI+`N@Ex&*`0-F!{At7nW*`%PV5$6^PrK#Bq%s&TDYEX8H~Mm#e9*7! z+3S;&ML70G8>3~56$=BKc|~lXmLH|qE!U16eZ-cT;5xFD%oh1kFbm5J%^Z2thS8zD z1T(=SHpik%ijz`}W}m2k9p_v^JH2g%_Z`}_R&`?2DiFFO^}ap8^P`S9Ghv34m??GK zP8C2lLNS1Z{n^e-G`HoLxUI_VlN)KQP!)cr`OU(?Pz47;vz zJ9b?P7zNQDqfcNUx3xrml?jnWCq+jIZjh zkY1h0z`1{HZLMtWvTY;lujN|K$CfRsyR$9;bSFE(sqCc7;u_;7z|qe~xYIhXOZ^da zjn}8w1$bW@7#}$LEGN(T7-u3ll2x~iCi062ygeWIoT0+JylH&RUp(#?#V=Fw>H+yt zAHxNTt{<@`bnP9YfG&!6UfoZ$$oiC{dZ14BIa(h!G!Tw~>CotWd7zNZ?wcycGA)ki zyR%rU2=FQ1y+MrlN!Uh8i$jX1g1#5BnU9C8Zz|dZ$=3z%&e4^avqD}zvFUa((9~_t zQ~Qa&T5t@8PUVID!Z<+|sQwAmp|9c$rnXMXGV0$ms6$7 zw>xZCI-rsY1&~05k+Xvh_%?G>b9vTUZAjeu^rMJ6gs>#h>o;YFG?!;49Hnpz9``t~ zbLb`b*yXN!LpDEX>F40DC#-6Tck>m?64WPc2ts`rN(iHp)0}le|JuCI4lH-p$yS7C z!To=PyKVn-oo?Ani|{Fe@qVOcg{ z=fl*SM(0@RER1Jk?PwazZBeZJ4WDzpP_Wng491gMvhNoemXkD|PYv``6ECdMb@*`& zUXgVBaO>rd*CAd%C`O5gsu;7YsJ_Q@peoCL5Sg*K+J@JATl z1{6-=n(OiJ(P-$)ng-gd5@7sV_#=|V_-=yBGO0FuDaC4A3#=^!qUT5e_JyJ=(3S@* z^f+mRo^{O&qq=lp zF`}OAhrEv$Ixbh241jC?!MExn7oA_Z1yl=;rveOVj3G$^=L;maLjV%Hp8GW9d!=YO z5$pV^!(*>8{*fjuZ$Gh^Bg7d~&l_+&J9<_~ogV!+qyN+E?F%DwSO$8_Q?RCrlxIhu zHU4F^J|S{@BP-wUtGwz1mmvqL5Fa~>Cq+Y2V^93Ks8w!H#K;9< zK5$&OZmn<}AQ@TTr1GT5Pm+z#jD9wxE}PtJ1!3K+thbj%VrTruH_;VjkPVOD-C3jv z684(N-#a@yFb;OsaX;;Oar>d=>(_AKgPp>dKhPsb%rtu7x8g=5_7 zM}(1s0CY@G-;|di$#yn$2%PLUj{B&-KoO_c)q9;(+l+x8bPOOUE?y!_TrYDO%ERcV zt*66$Qq~;gCCd!FoBL(vpi*4aZq7B^K3QwtoUn0zdu<9AQ(gEY7mP3zLRj66542+d zYEy{+pe3oz#e&pgIl6q#x$QWkTp1)roa*1%!G+>DMC6Cwja-a_i`l#>j!)hcZ48YW zAEFM8v7~XS=0i6ihuO5cmPc0J8lJpK;Ruew(5i#!dvK_QQ&wzxCFc^(&gR|=T+H~; ziqzFFvV5;MzGd|;OMH=q;d}Q(M5kz$8V7x<{cYSZ=hA&(R{M2gDZgrUhnc028tYFarHoF>R5`Y?IVTD0jRmY6 zk-iv4{W04kIQTTql2%?qjNYC5AmTFP2H~lWYCS_kO?|an51BqCDy7-J&v@47cwn?e zs<$4jSlg*u+_9!{-VUkp-dM-)W49^q+c-H6_+ozW?eUSz0_d%3eIPdN0 zx;6VOvdt&JPC9l5G|QOKleetX4^maSihVm|dX`gF>}y}Dw@T2cUe6d`Wf2Lao-(Mj zN9XkUHpcJcwu%rEw2d3ZXY-+p&`@C*UHQIT*=t>l?n)Z~Sf9Zq%71|KWij>~_Ca5p zc>IcU`r2tP7-dYLP0+Xxo8WEjXr)1Fj301WB_vq-;HJ+YTWp7L1xjNp>V3dP+E*jP z6nn6p$vWhm)baX5S=!NOEfJ!m;ZEN#o!;3E(jukgcu>20=000cyUUhp3ZlkfIIMW> zn&MT7hiA9Nfy*JS6-~(QR9_;C#gQC4 zIpLL|bSZL_ z2F&oQrf6n}Xik7fG&n6VbD`_(YI-#5k%jtY=Eo?4Xw1Fkm+kx*$K`N*G>oBys}R~* zJk~gul|cZYJE-p8lyUr-%6O-9LuCLnLI!!PiDDW4RvFU|9Y_QDYvKJq^gb8w!2j}) zC|~)i12=_LECiIoJFNn`?@qyk`c#IP=ifMi#=}?BC7FdId7 zVK4dwB?Nq=;)6(xqzXUw*Yi)Y9%!DJdc}HBB}RPUSM}6^^qd%~N7LC+(%zx#?8t(7 zxwa5)bU5iFe4gP`DQtETc_~Y)HOR6Gao#Y#@6+w>c*K)eUeeS7B3h`>dnS+(dX_z_ zKkM_X^9Dm0mBMnug=e`(IED3N_B*6_M+I=_q~9vq_j*TN&>JFGT`0KRsy9UG23v8Q z(i$RYff*E9!zjHW8lkN824$fk7Iy9Mgf-+~0Ws}K#t65w!g0>{)txwdV~j8il$>@I zw$`;kMA$vow14zvYNTpZTOA8uB-^5OaMX%Cj)*(QhY&azB{MekDi+HDCsCJSjLUGF z%MkA}q`C|$9OL5pus*i8Vtu53sTZv4ouzGYtEjB^0?uAbJ8;BwrdONN0t~*m;ACwRg=U;NOA+T#I1S z?FheG@LVfzJ(QL>hb?%vbxs7QE`&z|_!|vTjc(_ncv#rSwHIcefRVjQ-Ck%t#g|S{ zCAQCffG@>al`p-MFP*6Rs=XlqKzZ9!BT+xhGb%%w5=*tbkG4M>VmpYO)*Tg;loy~_1K$)AsMy{s8=q{4 ziN1S6?Qyd%v${lK*3sM=-??Ji-|lR0-`I}&js~_iZxZmS;Xf-vU3tx=q4Mwy@~DO;=2>wc9oh z0i#y_EaK*tJE3EEYwv_3Xw9UyLaRjouB-tabo^<3uNb^-p1o^OZ# z$#?;c0=!!;kl&*TzPc$mQI&RpfaL|YNtJsc-E%*aAB>d}CaIDx-Y|E2g-_4ea?Vs`2e~YtN|KT0B<7 zgp6xov*f1DG$(N8T(0*KJmaLQ-?wWlEjw6Xu z2FXaHh?XrIzT6hR3o3!DCV;)QUr)M_Co$a(tkznQf48!_l;NL_h;c zk-c>^#>$n#i$flu`m_zB^K%=|GG!4@s?N8G8}ft!OE~lkR8=O6rfQ>!Z>cJ==&Ed% zf-2|c6m+*Hx*<5WWdk?Tbw={{(Cu%Wwe_~aw-Op~JbFb$c;olySK)f{Hj(zJ+XqbU zHXLqp5i*p9;@k7I-c_A#6y+TW>P1&f&23yT)bqy&&*DZL+d9s$c*xUGIp41PFr2M_eW9z#h-0an?8go+8Xdd zxr7U$a;ho#&6FYxU*yB4-OYr^^V=-S+>ptZ&Wh(%YwRC(uwMCGK4e5k$gh(5Gs-GIvAWsd*x>G+j zENga_G3#md%Rbc@OplShYI>tpukXZ_)}~f2kuH8~!KjP}18G{@#w|4)QcZ`O^#*uk z9!ox2i^)f;%XFxjd(~`6;})9@>1M-3vz^f!G7$M<)dh3EM4LMSYH-k-(;6me4R>n| z8f{^@-f*YhaF^aNOK-Suzv3=ZX+<(RPNvq@GE4JJ=FLwhe>T_3Z$6AdCuh{xp9q(MR z-P`89SM+I6!f+wmM`D9CS!g-L)?2L?>;-|4?2ogAeCHHceouJd`ptE4T?TOgx#t&g znS&=zNZ^jh1YZ-lOP4yzAL8IEH@VT{) zP3{U0>>Eq2&kDPJyJjzhB^WH^yl&a{zkN418=3j=z~rWX)4tv-L*D$hPUyi(!S9ps zWPA`r;WRcS5M{DLt;T&ajx9@zGKU9p5$jJNYY&y9Lhz?T@Vc25n!NBis%Kfn?oqsy zQD{f0qMMsp#oeQhGi`3B&F)SSH;g_R9%;ugf>1{yRwMjO_*3@E%BGK2U2M%YCBGVV zGz5Zg@q=*>oZgpBCyF2@IF8DCbWB+qoHPkl;kqb%#14rxXYa)@IG)s3rUW@ zY4u+8e1x^F!Vj9)mlMkLtE3Bh;LpvU-|OpF#duVR2I^0Mf~Wwf+9S(}WKcduf`qg- z+OST8%A|;w{P0A6^BIi}6*qnjKOQL?lQY=L{XTA-%RNS{&AU~WL(wESTouqTI5uJL z8!wgLz#N8F!pDY?YOEFaI&}i=bt;J>{cf6{{z*%A?S&bQV)`WKrdHlvOcfM9bo|v; z_upEZ1G(XL_hck_oia*#RY($NI8l%K6-+x-Xv{(0RQfhSOmNg-YVTUIyw$AYmeq{6_F^1|>Us^IV#ST#@uqCY z5-J7(Ce`d6%ou#{>#xsVNSt$uP-SgoeqUA+Dq!s9BH=}`jAqS`!3tRT=VR$!9J zM*-U`{(Ak%>I#`BJPIXAMZ@?UE=29_dsdtySX+G^0eHcq8jlDcPmjhH-}2M3%T}Bg z;r%u}r6871ElANI-UzzpcSPld_sy(Y4FPbEe>f^+Nolu>L#+Nf-Jke6TB8M_eqE+Y z+UtzOSq*QF@ej%8091%Cg!00Yc^X4FM$sy;A-}^Yj(JwVHDT?nL?6a<1p4cG3VuOR zi}zG|ohGz?ho^W0v{LEQVi`9|DBZx8 zmk@{JScJXP6ho5-X>fs(22WgrUL*Ra^jEGn{sLx)^(M^TH*dlWAGzXCI7~9tu|1l$ z7TWaDggW{mXIl$wa&S>hEk-}&&o}?Pe>KhrW{YXYdHyu-Ln2-~ycuu`M*B5rnZCvQ z+#H*(#kg_q5Pj49u7yvSs!zyCjtr+eAtn~Il8NO#iB!yhJM+3{rc%NP#x(coYGfCRQc(*Nmh`)$8IOCEjPemtspL} zWQ{i}V}1xHTP|&oE?`u3+<_B3cE1#~S$S|jU-Urh2A_@(9I7=iu6{hII4IJ3j&U7&Q1@b)vrfLm- z5&LmsWPmA!>LNOd{`i{yvp+$<=}*0!`g7ke`*X&pn2voR4%$HFk~qbv>jLm zvhYPIDS+H46Cq!43v%!FUqMbL*)-01L(tPETNFvY@Qe-t_79tW3;X3JKkR~k#L$)o znRsCTSqWE?U13z+&&nRy`v@Y26G{Q=)U88j5UfeZhe|9G^@qx#b!NNTj6;aX2k9<1 zqeUF9@e5J)_nH2~-;r^f*V@iCqk1E_da7If={Va@l;BWIGkx3q+7}W%Ked|AQGMGy zxwdmdwJN^W{Q8#QV?&X`o+k(9V#(9v1gN~bG6XzAOp_CWT$Q1tMz-ig7VB^b*RLpD z2f_e&yq@q?eOZ~ZI`#P>VO_7khi{8@O^hJLdqgMnBm$+d6bLa<*L>N;h`Yhji*g)D zJ&~cXJCUv>#1Yz%juZo2VaR;x^r;Ops4h{hi0M9znI$@v z^jgx39tafF3n3~{yugUCIZ~-*$HzkZ>(j-JQvHt%7)%9-0;ZpR`rgDk74&v!hgYA6 z{%c2|@X7m=Z+)5YWK?5K9h(w9DFeaC=CG4y&*5n#I2qh8SAOOLhbpL1e(wYJV3h6+ zI<_TzQvIp=@Ro3Dy(fKsNOL&(Ab@?P2!e5+ui&{R+#@sxDBcP@{#5fi8#nx@(5ocB zx6l1^=ZCb{uOoXN#jCWky@!3366i!@B-`O@S@a1SE8D?}UO`i2>(!QsPavhI9L+v1 zKuixfPov!-U1!I6jfbmZsp)lE_F8=)4wmyn=?+QAX=MG}*7^+0vDQO=V!XS3&RNZ{ zNs$^a_|~r#ELB$htTkkd{*#aoH|$&3N)-c_FP7Q4#)|At)4k1b3s#YBp0?#lgGUD4 zPsckxVdc8`si$(or?;6yM=U!dX~qqQ$I2j<)Z-y$ernMs+4M|3pJP6dI4ycS>QRlQ zdg8Oq+akyC2NJ;tNR9u(>dmkp2=o3^X-)_a&8}K~FN<5bI-|Y!lO0BHk8ix3W`=>} zQqL6g(=Br>0G1Xejs4>+&+EA$E+)R_mGQw7-VE5l$FHegVo|Kw@`x$6sX0gyD?c8F zx%h!y*Fz&dOq>hvwz=(B3`u$lMR!-Tl;gyay$**Ge&4Ld%}`GeQXL~?o72U$U*qH9 z#aYTlLOX9l{8F*d_vZlM_@JKaerK-VofFY_DNv4ZEB}2m;f72e0Z4uk-E*!a?j6!_F^-SM@hi@cA?-BPuw3)xk=J4?U(}=~Pm=u6GVxxrej<2QGHv>L-#N2za;`P;i-&DKf zrdQc>;egj{^{sjJq#5tITp%`>AVdl?eMaSrCJk1LZHe+j^$n>U_nU&m>QOsjR9}}u zi)DOh&%b?UNSZ7FOAtn?Px{AWA#JjE*<=NeHa^Y*D53M*D53l7Qi8aE_y<>y518=B zfP6lFvz=oL7El(wY8`$v1IU-r=QA`6(=vh_MWUO*+WMtkW=X!8a zDW>f_E2J5p_4WJ{i`0ya7UxrYMY(UWk_$Ae^44shIPG;=>@s3&Z1E7Mc--+FfuaxN zevr-^0<`9avuI&$izu&sKuNawVm|hfBfuI?_yO~NDaF{B<~Po5(}#|*r!dRD z1X9uhS~=H~G<9Q9+yH=-^W>4!MytiAZ;SUFcOXUY;Y^hwzhU%g%1L%RghjZ1u} zOQ=Ywg@fFHYTD(~CQZ#vntOlV3q2k5Joo-pKWDuF*PcRGX-r54?PwLJ-Iy)X*3)dk z_q$DZHRfqBow)(cK{U4|_bbMZI-ar@oB}u8&u_j9|CDi5!Jp>hPP0B@V`^ieEng3T z0DWSVkB`A)d&7OL1I&B0l@+LmwM z+2@ygJNl(P6BuTeJm;cMaV3BwE(KK?_XsGl11Q18Rs6oemAxS=wMKH7tD2jx2G;ZAQ{Gzxe!s8jT}7#SDN&(*ysFg4+co2HI5oz4s`*Q zQ=_8L-?8P~uRCf#=X`m$U_Yc+-A_1#uqYEv&fP$uS)mX(s3 zce~U~`(Fyy>~X)i2lkiTaO~Fv=37#;b(i6t1!0zo1$DIA98=~NJ<9UdUG{et_%BV2 z>uJB$s>b3sMV1U71Ung1F^w?FDlL!Fx>VbxinZ4aw#Y~MlB(TYklmeaE(tT2gjYGM zjz40nI$d?H%1!y|iiHN}q1@u50dTSEKOep+Emwt`RZ%OP<*JBkRpbhHxoTvCe8q9x z4U|NcmqacG!xRijmkT^#g9e0x<&0xLRT8-K5KW@D6=1$d~L0?Up2a1vMjb&D2V)Vxbt)&Ydy`BdaV+%l9Ukh zQCVZ2(rmS?73gRTJyzH#llNXyLO=^*8HXO9YEXrkQKwvWsk|huZsGE$mMN2j+E4}# z<}C}&hZ3t64h^rc*BM`w=8yv=kJZuj3F@n6n*Vtw>A=12J5b9OT#Y~0qZ*w5C%E1xMl--mPT^D4uZbfgM`C`bl zYBuLVCb^OANoJBf%5k#fjFh+xq*hL5;vT^No*YJR9X736y)BwoZEmV#*VHT3|B%RO za%Lt{aRZZ_aoar?sLUcd#EG{gd;*gUUTG0ydc+0f)myVELpC$BbXxUCUq!P$w=*gW zRhLHYB5*f&#A&=oqL>@POE|^(U|Uer5vO{mPc^^Eu4gI}&>HGMS++7A?cF{vV_HO> z-fBRCT+hstO{;!heYZrnvU6xO{p^Pw?5Ti;|^9HiK2g+7V%7SMxfqW29rLj z>&a;meR}It({O>=?=vlK;v)GVW->p4&t+8K?uJekw5S-}f~FK1?l^M}`$G9tnQnfQ zMYhH+!PWig-CShPfKT^eQ|Q_h*&3d$?DUytH^o-h%5sDBUE!~9{h0ThO%3X~;8UeG z>7lO{8NR->EU_C0B5;`q%)!765qekGeYT^GdkmXso;oE@ldGAQ!1lm5iM1W;O^M45sy9kvx3Nu#G{kQ>qe zs+`+d(U;IMLX>HEm(Fp1&}jRxk?KA^2j%rUL7TYY(@z|gbL%)I!84WWB?j!RGHT{P zOl&$%#kRwZF5%u={m(gv*toIcVLB9hVLKN(lf#BDH$ z@wQI?ony`ppBD9}Pv1g~?TZml!f&SQDaSlwdVj&2Xda*u&!tt7w}hbiFltsv5znZ0 zGmX)WR7iFf}a#=a&(mG5rRwjq~7aqt|p!Kuo61wlVVj@ zeDW5BX+tA79MO6*zfpY?UL`qi{b1E~_2Fni-gx|_M)ymN$KJCe_p$eNoiBzT6Jmo` zeA$UAyw|5~!1jPWaoknBnnJ0^>qBDGLbE#%ND0#2tpvjKDNw)3X2yMo1Xjq>stsY* zFXX3_;k6Lv6a1J&Gm84`$An~6Cdn3PsB&576ODE^#RE}y#T3Lh>gp&XDT7ojEsK7{ zxwuj2q~kOU?gt0gHFbU!jBHtIn((q>UMnNI}{M-M_k-f zxicF-ci+?R9_O;+#$+Dl_<9=m*M92;4p>SPM@gZqRL1Cj=OllKZJb zqajAOW;YU{qM8(We|uL_;zKk>lCk~otWuVp{9xIaU{eBh&+T?cG@g+OkglROKbb~w ztcv^IKfn%7Q5j0Zi?Nk8ine0=VsgHRoea{lolGNE{S|^hIoo+-cfA8L9|pXx`^Ih> zYZ((4TCrj2DZz8siSUyrPJJ3~y12Xl=yMgH+Hqnz_Mwh?@xIXN%s7lsjWDn30ELKM zNnmlUN*+BCbwes+gmy7oqE6WhgfV(mGJb(Fks8zHU0AQ;fGB4R;ZTgLZ_ck64#+H` zl4D`|O?<`uK<91*{aQDNP!x}2;``$phR0!}HC~Id?cI%0*(8tqQ^#;e${gU81UnyN zTp9hjRdT$0H!_an)_E^S=^7~GtMZQFaesmyx_XXt-)@g}L6|Mx)Jt%UmyBD;1)N}y zN`DBTP0MjH>O=&+%p1!oy#rB4(#_UA>-aUVeC)5LK?bKIM%A3-RI$g}gAh4ZiSg$s zTm5cFi_cLVWo(J^^EBLU5U!e_nTyweuBS1{nPqVnJoZe-V|rXB9xI_tW{nzp7`CQ* zoa%SNEU|=#NzrW1c*gkEMJ^==M^gAi@O(BdC^<7Eu7;|aLWiz<2I+AoGc#pP^-rp^ zPA;etaowzjH4*2MGn3{8;VW3{d6{b>?w@&RO?97Y((eDm+PjB0bzFPHTU!^)_695) z3*P`qw($*8Nha}ykVxCYH%My>d~I@SDM%P6X~8AX64GpMsF4lnu>}F!O&UocFbW1+ zNeGwF$c8usOlv!r(loS&#yONUsY6^sE}-`}TZYh{@4V;xp6B~V+I#lQnl&?P)~s1; z%^ED2^Wt7oUXaa8A8u9=xV-D}tf9PdgNdzZyh#Do7`uBZ23bM_H;q1o^_LnBjg8n zbup!uz6_s&XjR7YwBvNDOr-AbW8#`8P>f1V5aDD5d597f5+xqhTQkoSK2_*h4ZjIV13KJl)(ERPXDP z`GRV1U(=ubPMXM_Ol~uY>`eBs<#{g~^Iq2FVK2tpD1Idcm%pviDd;xk65Pj^=tJuK38n9*!-7b(((1KP%Hkv; zPP?q6nskH)H3h*zgixGOA)4K>asZF{k^&edo>bD zFQ&ADTScW+>W+RHUu{Fd5yi`&(nKH;mSFGOu_Mz-!ryNvoQZWukgVgsBAR;JDnTIm zRV*sdtBdfPE+fK7yr}8WVIWuD=_gf7N#Dwb7|HGN-b1MyWu zvcMBkPY2ak{J5d<3jOgM8U(2x_ursDo=XpEppqQ<$e$tNg2~)x$w@GCqd&(hfSIi6oQvJTxj;QH}N zS|G-8S1k6k#(2L6i(rCgUS_s&v7ePt%7v1V$8YBZKPC13Cbl_(qDE}DlaV(5d@ONh zW2TSP`KN$3gGXovk_$hDMQV<5S6~0bgj@kKDbm2LgYAJcabxc)FjiRSjQ9Jo&Kbx$ zH$Sw_rLGdzx%uCr=-owT0_bOC5!q(Wi&jj%<_fPGdL&1{=oe^zXoBsC9gUGOzv31o zkDi~n=Asa$Wx(Yb`>je4$!%wp73#?~TtYN%4);--%I{zWT zh?h!OgKb$X3jiiexX=P07GF4d%Z#LuAm^2Z7Vq)@(xY-B>%(RxR4GX1UP(M&$ZUnm zqVS90RKaFk5cWk7zoE6#XzW90-~WX}l7j_i5tWv$OUfpXX?P4{-ho{b8IzVHX)u$r z4}88a?lbklKC*%TIMqYRNN6=`SwT*8PFi;Qvg91+u==q+CWZ_hTzMsctt!~DKw?bq zh0v^?*9%8h*(X80%bFAYp5C=G$LUhf?IXIx7jP50{Z`Y>nM0*c87Zi7U^rS7{V)}=>!0Z0V`m>+AD9zs{@)juU2nj&mgUqr0gLtt=fzE3|m zwOJj!d$XEO>j$E>_Z8&n=8LO!Pt#SX5Kqo!WY04DRyV{Iug<&pj;vz%`d6O^Qyk{XO1+H{d8%8#zi&#zK7rqXHzlMS$CqV2>WoS zOT@bp-^T{_UY|L(Ar&Y8>4nR&m_$d{daOMoK-s7jojfxJAlpdS3cNgnull zZi?sy7xL6oL!<4|-t_p6@HRp9nL)0khr5ORR%I#t?QMU(DOm8JBr9}kmN1cRj=;XS zj{(CgztxOEMIt_dE#X7ErI+JzohzSsV(Uu-f+iXKg0>{~G(FpckxiGiZzKO2%X0PB z9vm9dF&a&|9G99Kqt!n?#Kap%LY>_b7)&OJkXX{5CQDNJLuK0}PEU#4LPe$|UjW zm%u+{n!=eAV&Bc7n!?FA>HFoLQ`Lk{M!pQu3x~A_h4qK7Xmbf@d>iks(x?;o{lPLH zmzGQK*U!>~P|%#09`{e(o%+%>2o!xKJ>;{;mv$KW=d z=M*`2vG*Sro1h=eR(_eBCXz(K6naKp$srk>H2 zJ^IsHd)0lkYu}?|8x_!QdSB3$wmuQTglh{_>$iwInmfYno2F z75n3VYMbFgWeV0Vho!u>ay7ltUK71q0~da>9)Z5A4(pF2UflC-ElPksEFXg z9SijO)oCZ#UVk9elV1ekHz9w4Uf&`|gmB+WEfI;1NX_eXlZ5OS5}gilo9`MtX2$%u zlfdV|B><5JB0J?UyT0Z>J?2sP9J}LQZ;8RSPWR>E4DsN25PN*3U**R>>?xJ*;K8F} zhmROBNsWCpBuGW{&%V4e+MyS*X!xMZ3P1^R6+j zD=I5xYv*q_UGo@c6X(!5OWhhHL1p}`$e#JQQ#6}NXnR@R8<-h6AKv?|n>p3Gw)UBo z&Kqr+n=AD9Xxud_oppP&s5n;()zuCB}6{Cf1kN%gab$$cOQ zOt3FnIk4wSVALNN;D^16vXiMztz=iSIAVb~gxsG*Sl#Ryk=wVRi29ks&G6{A=P}!N zlGmpXg90cj?2}>gw()S`RqW(L<&I#xy&w`E=zWNU#J@wV89rOcw96Tj-3!Bk< zFG1|UNEM5r;iU;Y+o%1qa>R51s2Pp}nVW zsxKWfzI_Pl6DInc8?|aoIO=o@=Q`TIHE!v_Tj-bIBOJ#e8Z&9r@JoO!=!(@(9nwu6 zf+$6nB~{9Da&1ikDdMn)V;+mNy+el<4DOgg$eNE7+l&c`GgR&pl$yJc{yu@{Rh1LwXnK zD+r?MjzhYyUea4Bbxlv`{8!;;xK>ix!3=yV-9zS9WlG(#rc=(hgS%QpIHuAecZkP2ac4lcJngt}F7;#J6zMFy5p3dsSfua$+FMQS zhkC@o&Yu23q^B?x*Fo((!9m+6`&UOGUxL@?h;{v+k2ajGQwiw?uc+tXayM z!&=xpD~}kfJYZNTUJ=KAnao=#?&Dw z&*!;IbS;XfX~-cg>h*5Nj&CNnIm44x~S%uK~)avALm zpV7q7j5(^hKkj%Lz9V3Cjq*5-o$2{#Q?`XMT^bOS>g@B3Z^gUs?8Kz^c zqp7Xk*ts^cqpfXSqNcM6cvjYY)1gkZM`qwTLyah=m6|WpjrEFE(HRbPWD30RS~k~* zDXZmpOUASEXxI;5P2YD#aYn~H8-h$zqJeNX^*_UsKs z;U~ckOZqNy6V9>YuigL(!+%u(zR*6JYKBjaMkZImaSUCq9IjB*;~r*BEQ}Olr&PN7 zl2uBZrLqjg>a{KXolQ0EM^b3nJ=77L6`cpIX!ldH>XS8MJ49pw$HIeYTzz87dl*1dNBePqv@cmPp14ve(5rFu}n3x|VeEH{h| zuNzMEpXob(tfNcl`xD6!A}|pEp&5$G`n8D_4Mh8jE*eCzUd)vaUW+(eEn)T-V)ZnF zx5$UH6?}9!m(A(T;lv{uTlm@6^>iXn$9d@Z=f9Z9RrsCq*6fLF#qn&vQ`D~47hCue1#t+uOtqEd*q(?OVb7FoZ{H>ctqqaA|6b6~&6>X9bLE#oI zS3W6zgglQQuBoAWq)Z~7Q@6oGS?LRBnE8uP87c8q5HCwZy5}3@`G+CV`bH27-u$WK zCts2mze^n|W4kVV%L)nm|0IPT3ju(-otghs2!QasO?XCFUZFhkphumyYveWQM5z4d z!ppf3fQcaSVeWwykKnc+cbAg?ejVER2x%w7qX%;Qv}_*5c#80!LZL^aUyy5^JGOSx zg>xwbzk^}kihJ@|I&F_=F};2>xore-c(@@Iev|&xBSnCD`0B=Cn;qXHK8fgU$dH(= zIducypNME1QmN`U<8guP)5xMdqEDxd395Ew<4wP74t&Iz&G0)fdU+;$`b#F8Niv+; zk@O7$i6bB_)*FH5X>z(v7#j$2aAr=u9NgZJ$aAW7vTuV)iSTaza}d^V@%Y7H(jvTF z3^MmKJS?9?Hm0rVqvj87aH;LKWop6A5MHo z*z32|l+Y+ZR0HFWWs|*Xk0jKi&Z!yU58GuZnV|NkZ$Tg)%x0c*Ii30S*Z> z1Aj1Q%lUE%PSYACO=o?d&fvN{%1=|63~U zG=}~6RFTstM=HdM+u6Cz9sxeL+2}MzOmskk03++BTQ~drCA=}xi?DFOQ-_~iNlu)! z>6rt91ckOWQKS9w9*9OR`s6fb#${I+lf)b2Z4KGiL_0ZM00$fjlHCBod^U1ril}Z;}-+3sGXv@p)@44?N#%l z_~Sz%U>vs+1$~{|ZRq69fkhMC*S~+bMKm$7ZftBF!jofEj~~ORHWRsm%zt8$9uK3c z8khmsUjk>N$l8x?a_|gzR zX`-&VNYEVe{roh4KchD?sioP>>~5O8&b67rv*w2QlZ7h3*$r<7biXwfb}SJdR_mA} z=VeW6$w0j1wym$?VWDNIWe0ZSN*#Cs<*Anyu0r7cd#Gi0@}EjAQ?BYz@ggx(!k_sS z(=3}qE&CfXH_t`p607SWl4}n2L$`Nr)kz7n-NV8HCu*u86(qV-*Hn2}c-%_7Kf#0K zDR(OQC)8U^s3KjOHnXbf>u%&-c70Wx@!|Vcb-cptYQ}mhqOC3q6SpdU2B~{Bf5yqI z=T>j7YgX~B2peB!o)!P(mFC_~#+V*$INq()b} zoQ$Di@_aa2EDTboD7BQdxI?7uVm3man>?W2^!3KgYkatuU=puq)L3%Dd=)+ua}SQ( zDpD6f7mHN17+z)Q;Q5q80gxmY2IKo6hfGRnvXuE1K4(%B8x+MlRIz3Sgw@G4>jR{N z6&<1@_ogR0%x~V}41}`IhXWy;f=*pTb%-ME4Y)v?G>7!!cph~mXTDiYH@Z zKsbpT>7f^;y?IotAZdeBdo>FII@eLS0& zD^TIq>~M5iSrs|iDU_@iqzIhALs77+)a)vaOGIX{00S{_!dA^S3?! z21>ts&!A?lN$;;=3VC z@A_a%3grg6ccqRe0NoTo4}m@}L*s#sEgqRmUqwbC1+yd$IHwBvNb$NsRj8Mg6k_8n z31~@1gMfFefVYKEG^h&PDe^{Jr?!sWTE_D`lu$766dQx#i zSLO(mZ3ti{;kZ?3HRS4(LG56y+=gT(yef~}l0)rMin2DWaZN^6G_;~3ZeudCIo}px z%1<0nc+QHhsl^SgC&`oqAY2`;#&?7;=ui`P3yk^yC;X=U@A%pNf50#GF8quXVY$PT zhQOp&7?JVFDSC&O)7|N|h^cfwT93?xyn83N-k-onXK#IdCLgWcx@bBdt=oD+4uDwH zZDE9YgRcD1*`8>9U8o9SA@W97DL+8E&J(SL)&s^AMOEnNAIa}9GtNR9uEvX{$o88=Strk!gb&;kLKoY0cB_u#9K^RU)w0HI0FsJIXlls6hLIp!PBfaXfJs4U%L-|gpzbc^mh7aH??Ot#>sh+J|ef|Q0{4_Go7K7`g&cHKgqkN*rf zVkT#q*C8tL@dFHO=u2Vtkt7d@V7g`X;4s5T}aqCn#o{Vtugk;rmP<1S(-Z ze$$`y80o=}gWETfDz->a#Z45j-2g ziz9h9k{2^P%kbi9JUfjSPv_a`ym$uB&fvvSJR6mIsnTN(CtFbO7@i`MeuzEjU+@$e z!nFww(`GuBrDs}cWm((0)fR)D@bJ3Lk9L+T>m`kJ0`*lg^-;3NDLX&o#7Jb9(ScAJReo^uT68!}q>gfyoyoJr&614cHa1V=r&Un@uyH+- z@%JkIwA#ZednBpvRl2n6{Iuqg2t7NiN8&}48amlkw+^4kV~VQ{kDY1~a*$RMjhl|z zkldmEcotolM0Hi5S!HE)A?+AxnUn~l-V5j#8EKI4I{r>2B4e8)JZ1!(_tSIWh%tU1 z7|eBTB!LN2&sW0k#t=Ek`w3!e^w8&}sd&IydE2?l%KTeaI+pq=QNL}N7f9EIyRM9&g70h;J|MwVH; zK*FTf9U+7@eyY-EB8TB@rz)3fa`Lb65)oWRIEO;zP;uCbIE)-oXiO?K-=yu3ElO!7 z_it$=bf&3!lIZxcga|~=$hRge+NMVr zY83&mgz}(=7ijhIZe=#Ke1(;Ana1@^j$gr;H6?{wtwdj=QA-ar$D<9dFLV463@fD1 z1dGwQ{sE^gMlU3!z~P4E`3uRT5t0_d(}8!rp;b-h98JR+69Uf!{~%4gMyp-n(kLPw zs%#acSLEPJ3Nqgqo&H-H8=j z6Rw<$&{RdRRS2Xze(6rz#i{R-w)?|0P-4$ZoVESjysU(Ii{>;mKqHJGikX?v)x+1J zv=q<>aeJ*MfFoIy%M<|rTp*l#N54LVRZU}>qcIh38fWMyV11ZuJT3Q&DbOEyb<-2T zBN0+~Rl-&DcbE;+$(Ib!4atB`>?=;moaf_t$^BGkGL)WOj?DBrO#t7f<`-d7M#lSU zCB|fH!VJVdW|Gn)&h@2hu>L(8K}JsCXP~r~E6K1b^?-;h^%WNWl70V4X`p1oR>GkOl}^SQ-b_2=-I`Fzylh;k(A&!3hhm`>t<9g1GCO z?ZwJxBewfO7&8C*&HKU~+=-23YE8r(OMSi)ai$Nb59oU6ZGEY0{&CK2lUB^0I9hOC zk{h|rtxui~M9D4(ywaac8BVJ%O6$hfeHeL6eM~4b{y55{(kSCV{*b6d7H0GrFPVY) z2ssc1P!KU3&R}b36WnhIJP?C2lXgTnIv_N4Akspoy2E_V-Ga-wTSP62PM!DL6-(W= zZ&yswQu(mgIvQ1$9c7-UgX*8xWaQt={L`sP_h{0#zN+Dt8*6>e2+ABG;yOhXTo5|V z5j4l8aG^(WZKsu9Xr}LDW>HE5wZUCE&Y0NlUpC0V>ka*4sYv)&AbHSIP#B@aXOhtTWS#`mXP< zLv`k}6~`;!AT@L^p+u_e6?IwJ!s8C*lTzlJttT|x4r3QV)gM9?>cCEa2-VP|_;}}h zrtHH26=$IS=BB0@#(LW~eLMCK-Pn*8Z-GF2;6$L-L7MSH_fbjh4{Id2?+U6rI=}o6 z`^!vmcF-gg^a;j$BFsUMmp!U{WLD+-1>&HF+wsBA>}qG zs7^&-1IM44XxpvI@+HZ*!2rb=+5+vDPVEm2PY$m${^7TDV9n`z9d=V2*I!02PQNzx zGviob-9|@I5E@S$%;eTrlDPt7DQP$xYB+E# zafTWW4e(AjLTu>dP;+H~k{a5|+WYtJFRPoZGZ|OCPL~-@U(k_OJ;ctWlq;_qs*SY{ zL)kimVWIML*u0r^^WGr${QxB~v>Dp3scC~jV)$|gMs?x`ssd7_kOZ+ zG5TTa8!5slT#KNbKqe?c^Sgp~kZF67yA~my=;XLtgfhOYnZDuKNa$;J-4v~{bJm9` zE1i>g;u$MC|n!7p#H!<2y=L3gNh7-dBI*7$7lrPBLFGA1kBu!1oHh!s0^Kw4O5ryuQp~1B(%gl zQ>KZb*aUf*c|;QvJ(64*J!kmuioj=qz;6{}Cjw_roLw0>9q2u(e%n&It@opV z^0|0(LY&{-FkCTGRul-lt1w&)z}p+Y!>J0OJ$zA7da+ld=r!?y*AyGy+<2nQ9Dogd z?1Taj8&3>hP?uG!@%BN*#-{=m0YkBRO}e_w6d2Y7N;QEsM1i>R2ozdaS^YIs?NO*S zE?E3E^0D5@(sMv^peAY` zvV0%&(~HX)nu#@}ZicL{U|&gji|(kg@kNS%QB=7t z?Lv9wvvXnl7%o<{c5*3!zyU?8$=BIyRs>86RYjoH)Yd^70`%M3>UzSS2s;VcdgB5N zS>}8U)bNIYrhq!0di%ZXhjJNtME%23t(h6hGIn)71p!7dL7SO_(YpAo8+#3ALd&?$|u3c@}XtUNt z_2Q#nk$D1SHT46E9X=6g-FCqOQsU+X)?mn*1Lp&V&jOm7IKD<@u1O!L(O#~}9sDT* zqBqn%%s;`Pp`ggY)4|Ix(&iV%!#`Gx%?kvqin8K>%1-Dzu#=Fup)&vi#{;};THnLl zn3<3Sj6dkK(oPj9KON2{W5nYmL?w9as%X_*wGRsfkAbMGCp6#Y3~W3ywm(p}Dp1Zd@8qAOm33?j7cB2Yq<^?ieQLPM=`2w03#pV~Knd7Kg z^I}*l3!6u4YQU*b0iRCt3w$y=H9e1({uyI9W(okg{}DAlgcv%TVATO^3YQ5oNt1G) z`Av@dCGU>em+#=V?}RC^)z=igk3G$CTln@F-=%i)@s!i|Oq+>spSI7FK($ryT&t?q zly5RD+o=oNN7kYO{Y*;hQ1Ry5@?bkn-~$+slF#t~>30RY9PKx}`3}677Ux{d}&AjpS|u6y~7{wYt-*S$kEQAy zD#JqrA<9Jb^W2s@IJr*|gwSA@mmm49m#g5L0$$)Z{65dwc^K(|#&e|=`Nzw)t4n=o zaQ@=bhZt$^>*_#fffkKFh$&HEScXv61%d2>fUh86Dk$q*UglU{mc5+oRFs`qj(#aK zEidye*LJF?6AInAy#`?7Q}lMKT!16UmCqi<-0y=7u>f z-I|t`c2uK+oM<=8C|)MwDnt~Mze-tGIj_hQ5`MKkeFq+DCnnGTm~;q$cfk2JD(NR(aC*l2Zi zbxL*>AjW~_5lSDHe?9pq8ZyvWy?7ruC3sV8Q!8}#3M>pMloM+JuZm{1-hJto*)xsW^R2W`F}?QJt*e(1gHo@nXA43tG%w?$=-!z z;9c6&-9iuM`_Y4uW4)vYd(nf*;po9L=)vCJg>N0hZ7jWr_J;JIO6Et9PQ2IM3mh4P z*42JMtv#&U^o48B6n+CZDto^oFqWc9R_WC=HOD}Gi^m?@JH=yzcI2QTo}0NrFRWs|?xyf+v``Yme#xF(D!zb%xQZmVhCd=gqgu7OS4*?DJ^V z2B^|B7l>Hy9HldKn)K+-wX-hM%{Ho9Hygwyn%)&vV!Gl~}A6Y5m$_ z9q-~gEZfprn=|@x9KTBcu4q9Rv~+$6LNvFY;3e__8AblX@e{tdLs54^F&a))b~D(5 z|7VbwH2Ec5D5qmUCLuXn?#?Nx#D3m0zC8#HGSoprPBCDrkV*V6FjbXjBH+=K+KQ}A zesKt>7(i1<)_(z-Qh6oZQJ&dt+Zu$exj)g-qR7%@nG)?;6ecx z8tLNPwe{@|w`Sm$s(#0|><(ReU*6h=4J6+i0xeSZIOs;lah>rQPB%7zFz+v5<*7S|mK_kU3nUQ*DuCD{D?&_|}D zJoA9}onZ6(1uk zQcypETe{!2E+{*NW+~;VXM=_CSi}+cpOfp$No!)mvi8Hbaqz!_OZSg&2;!`RU8(pE zE}~rGdUJ{z+pEyNqf!m1P?zn=AmWuQ^=n%!CA!Y`428q!eDjt^zWAZ=1!0x>VIam) z83#h_q0y$)`XFd-RMs>g6D{>1VcZ_{yeslYAQL|zqcis)&1*x{Le94rsU3<@+2#S6 zIP-weA*m~aS(>8fd=6trxkkP?tAY^5j?L+ot_@WD4-fp2@Tog#^J%DJfcL0alWBCs5HlaN~3OdoAaLTC`hnl21K#0Tk zA3>*^>)MGgj`pcGO~HORxD>GW$D9}^!OgG29xdR+H2v9LpJIbk#|Eyhw+kq50Z|qZFmRK@jSNm z71e7y6x%9l)|%C`Ftxg}9il4d>kgg9qr!&D>^5Ykmlo+Sh-#~yE;t)W+8ViQ^2L`{ z?71i*QB==|!5yWs!eP8rwg>4A@1CT$?KvMdzNW&V(4UIhrfD^Gh^ltH*_;rhzDX|f z(1m*m@`)OiT5V{PWVkyOAG37fE=n`-Ey$-Nz1lsTt*9lU3lp8QSA^|sVTNV3J27Q= zuOgsPjIC5m>{OJN@&gk%K|^?;Nny3b@RoR|B~D{WU@eK&Ygsj-fN%{qAg)&8s8&he z>Px&j#;J~D)rs}){G80Ry#AVzjgGF}IEhnQlq8L`1#ov`Q$$kOKCT$|ZB1>L`Z-d!*X^ zwKYRObE;>gb<%@tDZ@vqy7yJyCBZXIN7Zl}ko8E%O~K;wB2O(g>0*ajw%96execEi zz(pA&9hXYf0(=0s$|Y>Lq|%#Q-Oj6{IxGNRJ=EeTkGzof0$s@8hX3H*@E-`W?+}*H zx<#c01LR*`T3~jEv)E-XhyJm{Nb0Llgj!+^UtB{PW0t6d#;7Xyr8(6KG{&mvvJcgF ze2$hB?w~yCNHpf6bUgQVU5I|1nj7pW-|hJ^>*h)es*OUWO+uws>0;LHFuPky3!vJP zkb|M2T0`vwr-)SDEP{R+G{b_p4ksd29!%5!|478f5HbK8d7IFtPAgEBry8QxXF#U=G8ci`B5 z9F%PWgF=u+hhlh&dUDa_@v{iA*s|`1kr|Y&y$!>ga0kYCd{Fk-?ex@`JL$IQpzLYF z{5sn0u_oZzwZE&n!!oqmQ9gPmm^OO~&+*6asw4IBplr=;Sl*R)V2wW-lr;pYi5i53 zoH<2>{|3jax(m+u+@S0~Zo?U$aR*N7jG(NV;6$kDT@_51^3XTXk}WJKdmPJD2_XeS zeXaH(JkLmrn|+)1Qmwb^Ao(ppS>4^Ryft@VAx43$CP;PkA&MnDcc9|3k_G(^MACNH zAZ)RB!Sl`x%AgMbT4islypr!=iG#AjP(6%*^Z2*71Uew}|LrZ=!(Jv@P*7Havk?7`_KAH8ClIe!I4rUG z@E#Ap8)SG;w&*tAsbAf}&35CK>|RuruEUM<15w+uS#?Z?E^lq=279WgbOZQ)y>3-3 zUD$W4um2Y)#JAJ?HMP`%V5) zrzQ^33%H@calg+q7LIe$GtWolJ6idZa#S=rkZb#51=4)5`pgvUO_wNRvzw8YvL)s0 zXpDK~eM?zG*}^2rkn|A=lu8Dpnmt{MrKyxS$dHpCY|!1 zx~q2nrMQVnFU`&~>NP1j-9I+(32ya1VBH_wy05mQ>4FjG=UOl7g&L-fS|l*uG2*@z z?*6&IL1o8Z?zU)251_hYBO~{je0xfa2b!wOTbDFSsQbsc97Ur+0`tqzRSMSq{srD*2w_Kr@h-jpvKv{J zW7%f2l#X0tX0zegaoxmn*@}j2{i&N1OB6Uax5!kq<9oV=?nS@Ke;{Aagfp|Ri78er z`pTG9?;m)Q31dpvw@$wnNu4pi^&&mkC`#P$*a^L6J~M+o6_wYno98aEX!V@lBGJ?L ze7T$+{4-T;sWNai6*1{2bWm-dwSPE&dfQwME658^7VOrx_CGK`cbTC zIo&)@1b2D+mI?PaE>o1^JJ% z*Ed%!pa)!3;DjpdFS5*Ryfo*${&(F5#c!#jaYw&Z6{Y; zQM?e*@H^tNyln^u$xQ{Rp`Wk0ix-U(lg0W?yo&ZfRk!CSX8F@HLHAiPR&Jadw5zzB+m}_)(ZgA`iXNtDUSQyl;!k(Alp)bpr+3dDn3V%jRKJ zTY2lilTdKC{;kNH<-xJwLXoGC8d~DPkyUnqM@}ztcnayq>_>1f*xVqd0Lmm*fc+7p z=X_jN&9V!cGr@%C70}J;=wAsdk;3R*x`egH7N!KB4R3A?w*Ior7ieA+wAfuBr=?c_ zW7CWVtG@@QgPN452CK`NGgp^DdfO_Yo25apx(QR1>z9hxXSP?n+A0)X-!EmazJI*J zBcYrU(byIoML;Y8U#GL0$};_7=YO$>pE>(kDPaSHp9I~xu4UoAYG_Dm&FfpDM~Yon zw|oFz%j2|#iLaotDlY%ds6X`v+VHGwFp8YY?6B}>IOp3Fo6c8Ta5!@0k87FbOa!x1 zYYIU8TU*lC(brlCDq>FW-b+_j&J92pWFiJ3_H-Q>M1u{@E4j4#^M|A!OVp@3s{Zpw zB&9t?yXeAPgy2lN4)v_7tdA^$YU;7gMAPPTcNkqR1Zx57ThqHv`K7$RZ)4@YCrJ(` z{XMH|U{(AkM(O;3UUMNpjH!d}K!t*uZJ^$Fce*1tFyXzgsz~~JciSV&1NJ~~@4B}| zR!g+m5>qc)bzn(bVBLn6FbJWwLjjz}q#I#lR9O(T+1*&x&{bHTpt7@!j*e zeLXllTJIiE$0T;1wXb#yPR185^`2BckNY$Txsc$ds40I~0+e`Dh z`<;VPj=tLEQ06XFjE$h2K_~mnph(b5pt<~-at_am6Te=c5{o%7s{L`UJ@gOA8|4I&@|0f3S>jPRtQ;CdlA)lZyKMA|p)h&++# zdqJ85#_^|M^WIxb_F&E}iaEPqLJw}cwQ0u0-l+Q{$<%h-n%J+{xRH1!G#d7*p`P{> z{fsU8`DhVNH)Um49iRtSVxjrrm4=__p%G{AYkiOvi&-`YXDzjch1!K`mR+c4?=4(^ ztGKDp@glb{aQtX@`FZhif71_0mk%zu1s$FkO9)vKEE!}~*cqXR*?bF>e&lj%O?1_x z^k6#TIYculhUHOaOKjzHk*sAV6PxzeIAklpwlfy*Nz(0GnERMmt7Rtgta>z3PcOcn zE!Df=gt*wUW;vwX=g9RIcI6BG$JmM>f6q!6x)@;t*-l zV-1znIpE?9d*MY(aBY9`#m1Rbclgpy*9LygCUxTq%uyWpVO?BecBx%{yGf zl0UPOzkt6rWS3^^t?9b_7a2*uUT;Bfr0JvYXRR6BqtKeJ)80pvqIyfVKKen{lK-!X z3-!?~Ysvf9M7^F~z*=&XX4TUhVx&1a8P}5+J$0WpTV3qQ8_DHMv!BYwi{7GKCegb% zM8C2`Gn*e0%c3c2{;UlMKv+o4Ps6|L`&3fehM4IkB*$W01f(n(K@irvK=H0XY4$hS z7=P$K0I;RcX^Bn}Gh49vSu1}LTtlnv(_7;8^aeZ|41KO_#YVyEqSx<`m0Z$W=CJhB zdU~_Vq#&P6_-ImqnoHSyJ-bteOspjn_X9v-q1VKAT*3wDhCJSQ;@4W!D8`-K6MPQ^ zY0)v_)XXvz7r+bZbKWw$C_~eziH4?UjRWEQXP12bd|b!ph95|~OhoXs%wYFYtY!9* z0&LEtlcM=c_YQ1T%LCuZg-NK`mU1(J!H+vrg88aZAOH$dCL>* zk9IOKGQ=5~FVtTuse!L7E-c`(P?b%=T3FJA)9wv9>j)NZ<%jZM>8?x z^05LpZt;pVSuLroC9NL%7e`;6iHGK$wanrz^Pa-?c9x+4eV|=bY+&*Ky^fLmVoFQ~ zhqc@jS%TbS709hKTjCf=U0EG#iPBpVS&N3X#IP2GJIJxB)x27{bspUuE_13AnHbz- zn7?B`%x6-WUL8XoB(hv{F|W7WZ&uIOkD^=(n|xo5asSMF>z&wOJJl&>dU0EBV6_qA ze_b|zxmID(%uGhzFU|CV`6+-Z%MR7&cX9t-q3kuv_S8+YI^4BHWk!9m%AYPUleW#VO#4k)H4hCU zyi{rt6P2RYE4WIBO>nj3sf-VE(u>h)*YoJ+^CDJ*TTG(#$vWlfh4oDhrX*$65xVda zWz|HRU36J4|Rt0WNGM7@3 z8!GqTtcH{qRc7LL?>N)ZlzS<^v$H8g$lGIN|CAIrRU4~jPOBf`)#-XTBgW8!|B!T8 zw#UmplOPB*&Izh#<}ZXRAb4=z+T7@RXuC5crt-(lek zX}(az7g7V7EPD;z?2_15(}f<1y@ZzSg|vQC{(^k5yx8(~c}WwqrOgz8LV44q)}$@z z=hgAuP5V3OLARvX@-)*UTa0tB;5S>b6n99DmXErE`P(4G`qhc0j$uauEZdx+k8rKe z++!c9CJLf(D7)xI+2tZCaRW2`LO%=V#%H6rCiU=91-wRkUsjJ@P#ib)9>p%*UrNLO zbNC(g@sq=jz$m;yOGO_zc*J1OPV^043VOe|IhYh2pf?C7xVPLK%mTZmQm@^tZg*9v zYTBE#$veI;!+DZa{^sC=!uN@r_3f@gm8>{OzF`L7BX_fT1^Hq$BbIx(F+O{gaI?>EivHK3V<3Q*0PLeeJ$qW<6J_TDgB&>H z_y;!~?XF@KY>NZ*(|&a{8ryJFc7gOAW*kBe2hNgwwhK39hygP|Z$64ZQRDSDW%GpY z1z9$=nq*`E(>@MoepzOZV&dy+c04VALf)_gE)oqpJtb7)uHDbYbQo*1yG)6@S3z~6 z4?az9bElpNAN*%x1DMSdt92 zCM(v9RKh+Vz>W}Xr%_C`uE?=R;-Wax)Fp`1eQTEeKb&ew<0<*r0TjBsy?JP_Uuf?M z(%#4X(y-%qw|7AL3*XU(A+#6GetbZ>_3YHwrPQ4kA1-|FR+{}mRA?28I*eAK#dq3U zZ)~U_ZC-+NRZSDC6%Fh7B2lB5$8nz}RF@r%Z!isZVKnNEX#DUI#kNQJ!5fBkq4p~V zu>Exm6j7t{XO6!$x(uD+FmAIW$ndJJKfp1QGX>BKSQXF>^GP=p`fqg@G2UG(b8K_W zV#-X$fz!Vu!a#tW*+QXL3Ppw8x2QDRdgLHuM8*omOd_+GHW%Ve421&9nN74=++;S1 z&0^kMi091&QlXf1vc0j8ny6OrVo@z=5--MCdT>yTa#sb0g}~y>MMC)^p}a{LX_L6Q z>EF8 zl*u;!;<7C4>INLbZB#dwQjM}_F3WzA=p)~n$+xX{zKI*9qRV7l@l8s~N$->^p&F&n zTm~I?l5eD(^iH`FalMg06V+hCy3+h%Q1+u+6wxy@4PQ{Sbq5Ac87{lIC&W)no|Q5! z>s#jU?@q>g<}afB?~9-}{NS}~OQ~%)_8*>hO~zd-l3%@kZ3cC1DONhzpf=PSw`Dh& z-rDio=8{`U$vMx_gDE21JvykTl)s#w6qAFsxBweTcyF*!+?hCg294j)>I%AsT;ICc z{EleW$8=!}h{a)q%)5H6)omDaC>kE+EmEt6sc|>H7u3JWF*1)-G%AHbl5$<-JW{zo zEc6ggUd5uUi@qU`SUxwXy<~<#5NE5l`j;#-bypT{kC8;Q6v=w?0wax@=BU(I1 znYLb9TXcrjUI%S!)rxt4E7;4Kne+eh@`3EV_FB(+)>_ZHJ=e~yCMN2pvRg))#?s1e zIhtghd2?7M7&K$O{p*w_{3gYjalm)TBPa94aPP6Ss4wEy`QdYs6B8f@zFj*0`uy=w z)NtdC-}Bl0^<1Jhgm)o?s(ZKcYi)=q)lm7H3n8JYjh{~+8wkVb5$$YB3w5`{5eM>i zZ9c5I1c3#$25e7uIgT7-gnlZ|X&I*S(J?0E?9b&YP|oz8xTsuR^k|&@U4TgCa0cnT zLA;-`%b$2MqO?rN&Stqa!WNs@Xm+ZfD(zGhR@M5dHuy~CaZWWGUS;#`^{>QT<5JJ_ zw&KYz#fQQy^u1pWZVIdEU1;Cz2&E=Z2X!f5bj+pBzUz1t^BD$oY{(j+<{$WZR0I>% z7s6_w2vK}Y^?9E3pdA;&eOveY|1#CJ5eJ8p&pi+5_Dz;Kl<9QPif&WfnWpp zfKQ{YF(Ez7w;***n0JTb0c7Nl3HihPjj214=-r_~EIh;9oC){;0^xa!?&+R_$_rrh z{u7KB{{;ros;MTRf5yS{mZ19nDJZ}2X{_o03yF!sp8>3xMxv)+O7l3O38VR`okn$y zH?wN*A~tMI$gbxzjcQCZOr>JQ^Z4IzIOj5bFHS(`1jB#j9e8yQ|0`jus%QPmI&5u! zXC9vF1rc;({CD}BYN&@fbYiC(y2h>{*5-1vq3zpNI&>lJO(sm93o>Epb-LzG61#T% zB@?t$J|Fq~y~&rw;G7S$q<6hLz$H$f$eOyC&dH=-Ylu|LFmGYa%cax#$45-#@0tEh ziMCrMU^rRxa`G=TkN@A`k=a=fyt-5a5TOovj@|5jesfoz)7?}O?sB=CxKi7 zd2*>3leAEUj`81#%lne)DVj^9_>gR2kHs?dcj6B;UtO*?>Tr|C?HTfQcWpiR0)@+; zEKXY$he(#e<33l6rGyb-BO|||V*>Ik;$5Kc#j+#dNk_fsr01#*ihV<}6DMUJ*^<() z1(n|Fq$y`HRJ>fS;?%rUgW=i!{Q8C?BK_eA!y;OL7>+mYEq8N6xw0i-O*`w;$~RXo zlDdGatKMLv{gXHDW#F%`P!-hBGRzlMdV8LnA{M8U6XMUkJxNp6PXi!yZHP%9LWUw^ zb(xZHLhU&!F)=^$$CYOB6me7e>T^Wl>Nta%4)K{40mIxFT+^WPf&|d+blyXJYe|4o zESSPE1L+{iAJhH+5x_!{7f~=I$&=^u>2t!IJU}a*I}>#&=3x#r1mT<$9%mp_*flX{ zN{=lTJ;%p>&DS&L2AU{$p%e<7gHdqlzL}}s9tlb!LAn7PJ(7Az(BxIj2IZS@sB)@N zCP*OZ*cO zsjAZD5!qe>MKSXhl+0-ld8w*tT(Z5IPi|t~L(08Gp$A0L$UgB;jjWpTgAr}PS)3zr zeR_LlP3HlIKjx{PIpu$o%!ioUVcInDDCt_#;3t29Z1p2k{$T_%IVR`{CqokKknvx1 zNZ1s@z!DgVP_u#D9-f{R6{rdsC!Z8|{j%XbWmA41Y*S?dWIgeuxTzP-V}8*|zku5# znDW0KgqxJ+HBE!=S$PX?*0e^+&t2i)iBkjx2G7rVsb6#(xIHU=>Ne}UIKBmE)eu&d z6JQILV2uG|Gghm+yS5&d=(4*Z^e_%tbc?gxPB&Mq4HZF0ET=@Q)j@e>@i2XF-PXF( z7%a3=8%j0Iph{zz$tz+w*%4m%D!#dabj*M9TIf|=zTtG^aDwTdnrE=S3?-?<5z50w z3DtDYqPSf8UW+W&Ap^5xN$y)Wb8MUK%Z$ajx+VGbt%lUR+Tw!x1V|{)2AJ7546(QW zRLMl{)Q^>*&vU${3H6j_A~60V55AwGRz+qn)dLaFNM8*V*G}t|A!y<_Vg*{xd0(Bk3s!cXc`upG1z2=|L!r9MPbQEvUE1LL4&T1u$h83W}u| z{xM9U>DG@3J#SC;jNX8&+Tsf$!2r=kH3xGDZsoWtfX3FbUti z#xkb|L+o@LhcL)c`YGDBxizm#)dCUqhXKusA26IE0zYO7|ABHiGAAoC|>SVc2Bam`zwFQH0KwC z+ay)l^Rmp9qXosx!#^lx_vCA##;5Z2)_1KeOTop0O3U^sbvgNZtt>(>n_IZJ+`_qw zR7krQ+3J=q?-izH;_W_Quau|a26AN??_L48?hqy^<@4rwp%&th$(6F(^3`dsG*kf% zp=_`gJvymFCkNAeIgb4cF$#4njSY3H%Mxf!GF7fc9chbvS!&~XP91)?X=8-V+;$OE zBFpGfmFvA@-_#8H?^vzvA@B z;tCH2O-o?Tj2ST^rhLr&)*5~bh!b)|J}Nd>1}lcd5q4IVE*01(DHiaTgFAQ3cTS zdOTrNSDp#Cv^;NKL8N-A)4cS@jJa@+1MzB(6CQGckX`!GqpWRtmgtQQwBH?o)Q4S3 zy52vZdgM&Y8QQ-+aAmE?(OtW|g7&)t37Iih@IcHUEqzQ{{k^b&-eS-Fged?XS!6d{k}dE%eHv(Z_(1zM>}-Ma;+5|$LAg64tvSFn5@gL!rq;nwdE z1a;qJbn%=mSwp@!$|x*X;zzGrqWh$?prcM-D;s@1b9nT3Y+eD{scGja<$~N-pp_B< z4m!l{IVzL-hfdwKPNEkVr@qq33hPw;-*;9($t9l%Mek|z46QBTWvR6~g;tlK)g|h6 z@zt+FGoD?LmKkAGX1P1Q>eTDvjP5Sw146A%R<&|-`d6JS=NQh+R#u#ct$`TU2K8B& zG9$~=GZeI@l4lev{ns*f%yi1u2nub|MX76-JcM4&6k}P+^HnbDtZ$EH4r+CBV_Hti#Nm=6Fa#?F$UA2}GSQsI=T!acsc=i&MurMJ_ zCH4C{?In$~v&s@fb+32U%$}o3oG4NqrKv#Ot)ld zftD7rQMwm9iTZ`gU8ny9ys+DO<}ICUqFqT68{OHBxS=?RJtPguP5Wlq-V$+wc}WOSZl#GpVe9coxC3ttKS&a#ZTsMq>qy+TqiJG(-=;w3A?Gc1^) zWJ1}xtOhnJ3;agjikA{r(HaW(p&6{VqCv@on{YjYB&tD+d=d)gREy(kwOI|C??LC3 zWa*vd;|JZp0os{1|l1lg=4aSG!<=> zM<;wEg|=?Ot}QE_xZ&jCI6{x)O80BwHFw()$YXt!sckGlaod%}Ov3EjnHtRH#UjHp zvT6EPQJ>7I)I_5RpTwqUs_=^vn%}^ICbUoO73U%VNecMbu&V{JW70du_uLpu~6xJ0Ka4xSb{eAe}65sk~#rjan6GBz#)Lw%g zQYV+R5gyCR)l$yBl>q#GxV;+Hu5X(I+>z13P~MWFVwt@JtYPE^FB38a!<wp0N4spH%6pOy;Wb^Hnvyf;A%F z_PCmtc`t+jY3aGHZH{Hs?^$U{xVO}PLvuT2f4J;m>YDKOGjV&@`8*7DVFq%2j`&W{ zg93+c-_2fL^ObHxT3vPBpXyv1irNE@p1xymAIYZuvnZ3Ps+%<6ZhM`*0<-QiLprAD zAHJefzR%a3I7yHIHm6<|oSXT?_i?9o@}`8^FtqLZcb7>#<6*g=Tv__MfTN9C%m!$* za3_0*8ffUY%+u@UaObtU7&!1KPxt8N&NFykdBiz9teb7oNe6VX4LS*wxx71}FZ^L0 z`z$-B!eTQsu!c+b^;x_<<^nSNjOpb(PAxUmrrUTGYHJNS@*C#PB($^jujP^O^Pdi7 zb7S$6(l->ewIIMnvJ0HzEQ>9D^r$rzYm_7^EYoa77qe02;=+;&@rpcuJkG!}PxtP^ zH-@`&AYU@yNvc9Z|DJ8+RZL#DhmnN7V8RTNP^*Sc5wIGKC>w&Cul zy&i;4DqA=Q_c-%B^4-0CTcy@p!ZM&i5*yJxo1_+ZZetO)0BM-V(bNi6;ZpyOo0;a^ zZh_?0Ud)h*4qlSQFUFA{Yp*77WpNlgrv=N_vVea_V0s={9}8eRbgDU?Hk79q@rsHe zInn0x*f|XJCcSyq_M1*|>9t8VkNLw*_wOCpVsd3L1Ew;=G7!V$MF;Q*o`u-Z&ds#- zFI4ljI9Hk^@2<4C=-n3c6Wbo;%Y{_?pt{`w55Q}2z3y^4L#3+lytMAeCPsHma;*ftqQ`FK$j{?q*7QC?E`MJXz3 zpIqBszV7nJ{Py0p;{n1DyMDE@yuE#$=PaEx%W;NxRY>kDy{NZ5tjjqmPwNdGm!}oM zXP-9>4w}2m*U88D-Ojaelz_sO<=x%uQj%cXeN~u5d(QGu?qX_}6EMm{y}c;z47*hv zb;G}NusEsvR&msvl7zZRanz1-7nl71t9`})zuF(ZRXb289Y2kHJDT6VHm-b~;|xCz z$h)T79v8Q+%Na!887dzOBL5hQ%h7d{uC$aSc-M5L6}i$#zsId>@1AZx&vTYfnvWPy zCE|AH+LR=3FAUVq&?LLKH>_NE@u@CnkvFY8bi9icpRS!$UA`{v;@Y_GbtpKVEWYp& zU0IGkPe~g8S{xj=B>MA<-rn+=&M=@~1f*SQ1MkF*9p~+Z-#?UJPnQ%6eWkJ`uu;U;~ZC7#@4?#Uj}(&J$!+_BQ$s} zgAdh)7wGL9dJ(N)mn({!<9=mp>@_dfk`=DjHeBc)7n zm$Tg0d!g`EvTm@`#VSz9A4)wCk~vmBki95ttZXwM_mZ)};j)9`!W9L>RvIqU%si4C zh9c9BP|2B8qGdRXM8t3o$slpwdO1*;`wol%tmlR-|5x9o?o3_e(?%6+Q z=(CRg!YwC1?MO*tL*>T#a$}6#C~+mRk*@sxMwfHg7%^rPJB*Q*(^9!n)qGiQTts@J z`Sa;Z6RA^4TjZkcr#Z)VCzKw(2y6=bFwEHiweJ14qqZ|}{(MImdb#<+t-g~e1;{Ts z&9}%y-`s!_7XvrKxQ6#vQE6#a8tAj7?T{_J_OLetLcKI-#9V#D#vA>{W8^E1VYshN zT>WQwI|R6&K$&vnf7oc#md)*^wKq0s-ySJ?X7iU<-<0QDZ2HmF1s?UUw&vU*~qICAA7#aUbBtBD)Ais(c9YJw(i4b9j$f5sJ-MQMlQ2D)d#nBW>RkS0)fpQo~h z3i?MQ{X>FG%V-ocEXZ_>Mrnp|o$mP{(5Gvgr@v%b9p~*Dq^UGQSXyo*h(oZ-oEv*x%1&pf5h*mBw#iC_(Jij6qtnnpe8I%zA^* zUL)Tgp-P{b&0OO9??xuWi#_eHk zGFS1n^w@8DY=OQ;rTTt$q4Jg1fuZ}A>IZr_SbDPjzD8Hf8a_-c(!mu5`Es4Evd%gD z=4-BzkjE2E+r(9z8s4()F7u8pralkQHJR03&h(6WZ?D*7_nB-y$p~fs;})CV>;%Hr z_xM%qixO-CjRF`~tycH$!n^YDjaJu(g^n7WWoC6Ah&FE_`P)eTqkQ&<&Lv;@5h@|5 z8M@h>+3%`p`v$7eENMVb9j~vEll2WNJye<@Vsxjue#^ZK3gSvdrLWzxMwAtEuSl~i z@B-gPLt}Ux-Uz=cK&1*^BYe?N*en-QWPKGr%kfd7D z-#z@y&Nfw*Q{duv8Wv<`B(9p@+gO#UCXw*&x9I50I=)^V?7y{$2LQYpb*s0q{91G( z6Nb8hgN5J_`)_f;sgjDlmXXDjzBc9G06&qPZT#9OWumZi)m_R&{&2S-gH1qvr`1*M z-&JLX0XnOgLQ61PhebK3v8;vvQ6QgkI6|xZ|iMDeZjT{s|1lK41vM2tLc4> zdt2kuQ@3QrD0fh4OCmnpyoTQqy~VGfNby}?(3%CLiop;+;&HRgz0Bw{8Z{6CUibZ< zcy$Q2WOl*}33^~98QUchqYH4^qqq!qsYw+v`YNW>rtmfV?mtCXXHuTT5MVakO#{X0 z0dVMq*U}Y_1h_Jm>1&*xfA=!Z;;ZR?ni}lv)wQi)!}?bA>Rd6B1B@dvs{P$nl0Cwa z&fRbJ-oLwP@Dc9u_IG?|zdYtWaXjwRL18;*+B@PqBs>GR#OC|kv8Qop`e}8iaSoS} zXpHJ@JU)Yb1qDnzgfTd+?rQ|p6L13O@|`Vlpe4zEKD2Yn*igK5jBj?ubS!CacScA; zLq?;SDVhz-*%G(jcIQZ^)b8zpE}(s4`$iaW+c|e0tL|_p-py1{TZfp_5Hx&V)1FUMMisSLZDbwdWVQBdvqrD z530AbEzH#v#N=8`$DcP7H0Fkk#%n$R_bTiKD2^rm5{>(Nw{H(4XzZ5$Krj$q{<(e! z$g}n~Mb6IoyX3S6XX3Wn+G|OMZcXqZt zX|f4y``J0RqtlC>Z+Bev60CClwVV5f_s95epPm;l(wl^_|8`!Ow(&5-x>Oxao5>o- zMc7s54Vz)wnSC#L;V4RExiiCQE*S4y&m3IXcZ04{L*} zs*Yw3^lpBbH1Ah5WfA@~hovQUL#wLFB(Nn`nWGbu@)I&2N|-aloUyrTmD&~qBQgJM z%KU5cW~q^|PD{-k^NP(#w$#M1<(8Vc=DPrt8%i+JekrfFW3b+(+iQn`7;Vn|2?Vq9 zCS}eEzUs|Mq_i!DSxr;Tb|4sgty>i_jb%nw{OD`e73fc_aRo&4eUtFttT!LKD;;F< zLIe|6TIU?roI=Jfk~Hqubb8WeOHEW(Oy-bb)l4JkgypweeONm02UTKR-9I?`VkB3! z&U(``tJ=9$qsHEjcDqlLNB5c!36G0xGIRBFWM;}R^9Jij%qEu)8n^aQ(4W0zfBjK2 zW?pZM^~4mg%+tidckaK#@qCpjuWD;vm3PsAn@2n;t?*iEq>h?cPtCjm_x!5gLZSI` z%Mx+y#m-FD{IP>fqubDcD9U`*f!2KFu*GPk^goT1@~~*qCO*JH?FSO3kxb|SRr%sk z(%v#$&R~qtwY#!rX~3^?B;MvpoVRO#c>jdsifW{E(GQyMc(F;HnRmL+I{*Y5EIiU4 zi|=-;3BT$XZ@qn%V-9qk97i*Wm$%M=3MMwwQgfR{HsiAAhNWgc#^2H%0s@%)-gMze z)!2~@vG)udX=cL|E~@Q-`8Yv)FVMDr#WNpsct~^3g=tn}6bBOL3@0K!M-KI8_ufCJ z?X^ZgNNaC{!iQxJZ`Z4;(H)xq=4}#&yGARRQ9QgLz^F@0$SH(#+YP_S--??#DWf_8 z|F=t|j^hMZ>AA6*+qycbFhc3z&si!Mu(u3@MX6n#uadQ3A7EmvUg!P0vFcQv|Ec8Y zy)bV>-yP2Y*eX+WSEpw#vxKYCqhoJsr4!@fk$~{Gb~4% zExK72&ke_s4W<^8r)IvVMly1q?Hat~shKk+Iu{DkVCRujVNW9_k+T@2QRwJT0T3*i z2A(Hz{y?I1O2l1)uRu>t%y42XTj!~nd*R6HbD;+Y*%ZZEs_mHhSB{R`P{b9(RPqq3 z0WIN%491yGEHHh#y*8hwoOHE$vBOfsdt>zj@MB|vVgDeEdPJ^Vo3er~h{V!4*unC# zjw)-!kV_n=oXX7H-Wc<>j;wl@xtz|A#FYd$k(PN7#NHSz6N zB{#WE=h7}DN~$&mDfSPbSY*RoeQeP%M2&=avpcu2{`q9|2>EJa|CM}yQ5f?V<#OK& z1Znsk$>?vILp$Le?Z0@_!)tJc-T5W%XOHIK9AGaaC=H;}`B znKJix_{n42&3i&kfA9^~pRV8QS~X~H_xjq;`P$zxjp;%> zHBo!F`_|h+Jw*52vjTpvL2O6OZROaDzk;gAc~!?}G1eP5fnt8N69`5@f3eUvo%FP=LnEb} z^|-2btl|542zZM-ARf){;q#kcaAj}yl6Kra`pm6MzBTIKHRfZkr3UA@%k2Ps6eS@_ z44#8-73%n^-4#RF1B7pXE3NsAO9$Q%*YUp&q(bLDET!7uk+jUUAhV;qzAP#)Gp6{% z_Kd~%6!*7hygt)7#LiawZ=`KSaJ{v=Yd!Li0h!1&5?6ij=IAjl*V$pK&yU1?9@nSl z;bfg`XM1uC^iUkKFuk1C%7vLNIR(B#gT2JAs+Cu0vsyCy-{g~v zsjs)uCaXMnT-3I)+H#YVp>tr*^joNYkV}e3&tgq?CK_YhPq%9i=d>^0yi2mK__cO6 zq_UKqdnlx6|Hi#VYa6$Q*6(d^GE`M;Y?}?0MpIrKl)6PZ&u+{bFy*Wr-I6q<9KMmZ zY@_5|CR5iukfz+2rPIuzn*Uy)vr51@o2bx1szEh>QmeB@;`gFWXN{nmKLe*_CirT} zI&AIQZd0YodNEKs__5|W=p_DPy~P6O?|}~BKc#72x|yWA#XsCVmTB3&In%LwB^aDL zZaxt9;jzJnUJv(0oAZzesyDr!OvhkD&^1d|gB5+y{P$aOcQvoJUq6%sS5zI3GH~?4 zU%ychbeF&t!<4|TYJ1DH(g$TEh*KaE#KHI*?NH7pK4By)=TMHJ9H;;bOVYymbspYeg$>Dc|`VRq5$86r{8EGK3B;&9U0IRj_#~eOqDdhdyz)X^_ztr|XASJBIS+ zd0C+yfy%$tmO{V3W?raeE^OKnl@xN|Zxv9(>!#K}Bh$`-fVOI~TAa$&)wO-6l@RBR z-d$J~9hDSH;tbVB4eD}VdT8Hk32dalol3>ESQAOb<~@1x$)N&S^7(K%s6`OBY-0|h zjbDPHa&cU{F0LJi5H_^pWbKemmVC)|9!sUJ7tuMw4>n)USNFO5()XK_>yPsG%o>QH z%4O14$avV9Wtq2^Er}^=g@cO0A)?m5&E9$;lp2^rY0x=r_=WB&BafX;Mdwgk-4v7K zGj$NV-S^yGupK1&jy7?5x>4LbLQ;F(bhF-4pvzwOx2{^iWWY@I0 zTUa6ZYb|Zp+Kk~&-_ZykXPSIPJTR2w{gY!J748Bn4!!W<+>94#jf#@T@SMeya&b!X zEjEJ&x0LzbIMA#$oi%R5>R?`zvdz3JrYVZWcR4EB+uoHwY;bdRTs^E*-&7}e$d$%0xT zPGr$k^JRY|r5(P>GDVur@C*X;K~GV^`Igs(HBj7pGT?SU*YA0b4Ry)-PVOHH`k7BV zxN7fTe#b_Wo6bY-{pt#xWZ=W)4qEeg0D*LZa>%&u@8XKSHAKflT$8@_xgxEp>{X#` z%X9D!@9o+3szBE9T#A?Sii=X>n2nTV^X=^AeroQO+0GVXr2% zw^Yg-_)I02f-fN{!7rjZu8C`^*78H^8tOPXKdh;`iPQ4Kr{CD=w;6RPH?xjQ;Zl%u zR$U_sl{9gcoZSnBA76^cSM7;=T3z*@>Kv;$ClMTB-xI)_69e@od7Tlw^QscxWKN#CZk04|{WA^dp9Zu;>)_LsiDP_z zimQPyNKtgjyB>uPlFCL0+97W`hjui{&*Gctth}paj33%1C*Q)RzlBeKW2e8(nEp0% z`r9n>jeJ0=JcYDF{?0#q`C|BE&XM~hUr_R4-g=8j$v`_HyQI?VTkJtY)BaN(_n)H1eKDZ%Lf9D+TYckU+ z-TRBPh6dFI^_lMcj-tx6h9f@^d%HS!(?Q$Gs=Bm_{z8@ZBdO)i2*;g~V|PmS>uSxh z;YwXZ#ijdM_LI)L<@xH?3Z;MtwKoD#ui z>XDJ3V={H5xqSCBZEx(eN{?7+|I3tSKlYqxp7KFT8qmB+QTsO1)?TWrYLPaYx7%N{ zKPq3X6u{dL0k3iw!27l1XwWz?+YPVa;A&-;U`YhvDwpp^%xZ68h9;@p#-A}W1Tm{s zXZD+xM);qB7;aHRG%sVn5`HxqsWCSHMGyNDr-c*KtO5 zs-ad*E?R}~XOU(cGUY`yt*v^{_frEK7tu@^m6PE!!bOERM`iWu=!MzM0=q_L@>D3)RbJASM{KFwTcm7KgRi@LH{Wu1)<%J2BO5wCq#_+WO)zrp{qOpM|h1aiE0)&mR( zLi_fVeks);;K2{TQeK0AUZPr(*Px-N_-h1L7N3(Wo(V)i7zqj?XamAMB?CI)r3N%g z>Va8L+~>nuwMNj8M zl>zM|8yAvc%y#RedDFyHx71inNLHg4@IZDyQPw{G7~)~1r<3vfeiO!T_RobusMCcj zmjP{+pyh$TFG5wH-!5IsXK#;^a{k{k87WPC@MV zHHm`eZ>%$5L`wpwcPgQkhQR8bDGfpzuGl)|dLjS*>auO~ScO&}H8zwqJQP1Lv=BU* zBM4sB)D~~eF)@kK4w=XWgpnW@_)z8$*Bf?AGP(0Ec1${JF@t3>zFh#G* z6cI(+yjQ)36JBw5kFU@D3!t_AikASkwCOs^8icQ(c8_!f&FBY_Dyh7VaO#G|yU@hw zBD|lyX8kyT=!tsNFRAFLNdE<-o*V+_`gcYTmp;B;tb27+lflT;s_Trkx}A5^Fkx5| z#;IF&(o8&M^cdhvAeGV&ry&%zx@A}JMIJ3F6>RXZ^Yllqv!PX88{4bamaeB9N2c2A zHtyb;kU?A1DcuX3jCa>n1EOC|9fCH4!pkd7i5RJ$*64ndSL&VhC}Y&s!t5n1VLc7g zN4+exR1>C^$8g2c60JVQ*q@3+mXG=B^{u`iC0MFp?)0MpB~c}cv;30_fYHq*yUe^Y3LrCy;$ z#y?$eKSDk${)bv&C_N^CvfyxFgJTW`)pOUuiPzd ze6ky_0J$~5wWZ>~{G#dhs z|BY!3##}khXGy$m^ZmB*pW<_GkL;x-Db&PbTyrdXLf4ALKgJ~VbXQd`X6^{v-Zju& zHSt40owsR^K(UDFqwftHZ36Z;g7NYW2^7}@nkifnpyR==*u$?@F`irsF>(1lN<8sM znu0vh!LR9f;*+O|G&~7{U&)g&SmG``G3*kk=TF>;$B^J>@+3m=G^AGF!T3P4-D^F$ zp>3ZB0WM^6>ChZ+98#w9C{lmQ6E>Ykk%By7!8~Ee1ALNy$`Zaih15Keh%Di-g9+ve zXQimDCxN6*C&cB(HFWc|G(T>&uPk8=0yf5IX#siJNo(S$>389+cLjN0uBDkz|FZdq^7b-(U24u)gSNSWAQTMFG~*Td;C9 zM*?sF$*+!N{O^#sXP#GXN<6#DepOX`tsqI*?eX;qyI)DS!ZCj(tyx7~sic{F%24+fM@vLk*%c^j z6SLn}hrp91CvNNtXIqg}%`lw!i#o@ys)o}cT~2*X%%)JbE!>d6z%?aRJ77tKa#yWo z=bT7=NENgxYAt&IH&+q_tVFMmcIj;m{?h@yoRWNU3CAKu+Y#UCPe_$Vy6<*9K@_9-qKNarLrzfD@LjiMDo4pZ} zH+O`kH_^vw2eYRW63v4FHq<`@vZHPu%2;$fhmL<#)^klb5JF-0P?0(CcDNU`17&47 zfTVJPfP)F9JqdlJH3o$)4|oeFM_~72gSeA2!`T-wG|= zI8L{8g-*YJBTPwYYec0HVnopvHoPyC*GL+A9(lrGg6+I~IAEY@|K`A<5M=3@6he&( zYw5MXz)*zeNan=BfF%2GSjC_m^9#HcUkf?0C!ZRTNjYb_|3$24=fOgf(6e&UwL4~N z-xV1U6i;!FJGL!B5_RGw*oFGWz2a=IZcZEKbd?vO477^*`Y;}}5fk8W>`qD-(^gqp zF4RfdkOWhKZc}Z2ML%A1R*LINDj%v)`&No^r>Ku?J5eoeGSscEHR~eUd?jL7mu4@j zD`7(`AIg#`{~BJ=;aHXBSao+_v9VYgmfo%LW$d6e0}$W9{wnu$cy9dNaBu?~tcCQO z$?a+1v5})H$|a7CY|mUbx>PewR{LsgBw*sI`7 zH9~PdiQ2z-zheLF{lZu-_L11FxMNn0l51tY+6dUTlSj{2Tv~5U+#q=3KhldD(~25> zJD1b`yC}<04%y8%a3Q9Hai(X}ia4K5up$o;ql|7&J(51I5hLKxs7-w|eT534C(F~9 z_mExCSRXt|W(v6e5j70yNUx7(>W-?Vsw`c3u~DZKDl-yjrV_RVnf11G&1B${n1#7- zeP+sAYW@cYO&v;*W18$=-xht~zcwI>UgKRt!T~wuKCtdg$clsTc$`0fzmN*afycUn z+4*V_#xDw_pQrs#M4%1pj?*wUN}ybtFs{2gnFtD@tBlh{1J10M|pAfDB*DC zNlT8xgC6|)s{?oI$ojrpZ=`o8{It67;q_d8a8R&^rx*~j@8GRpXnww>WnM`0+3B?& zzAkyyd&wGrEtuEy3Z8f*O+lV$l2-jPp2%^5Hv#234R$gL$6Tkh0%>i6Fs^iHXK=Y3HuBY z?zoCLui?jX9{MkvcN_Q3JHq_m2bvvLxWJ;O_wn5xjI)7^^T0bH)7$vOUmu*_ zxvMt|gB!twLwJ8oBgXpJt+6J%X-|jn{^gBbp9gdFvHKthLz-yC2;X*Vb0W|4 zr=P3sc)mUMDU_YC3Hz+myR8jF-oV`M(Zr9o#FC9)!3q0zHuy7N2w_E5STyv-VL!sI z>EiWhNsJ_(6nqn{hl$^nbb)|sgCmZ3_FA~zCL5GBU)`4#&Wa9+V%c4Pf(s&Q_U!e z^T&WAglCwmbA*UW_X{tC@W(;~mqUd1Kb+;RbJx-@hcNc%K245dLr*2&#)h6wKb4#) zJ=kzW%e)il`u_4P_Q)*sfYb#Y@~%%W%#Ci6=I=E_)AWPe@D+(RyquN@!xLZ!hfCjkB7MR=3GgnQ zMCnrPb=9>xPS>Hb=lo6#qm{1CuB~LtPNeiZBI;I+8^q9(I1^DA zo>(h9U3^hJc8+$YfBM4TjR4?bc)B$En24^csjDtM8{)pxK6IzuyMxTno}Aaj#|~ah zInEq-eNU+3Jng_$bM6eX$0%zTuuHRYSydKHhwPcUlsxQ1az0)7Y;qFIkcjOkR*4az z4R~Z5>M1)s+%y?9V`v-Dt6F73dR4V)IDtA8%Fc78S3f3nrfWV380N*hXWEBm+Pim{ zfI)YU2`KmuntsCJQ=0h*Kny7h+yeWM;Q!1=^O<)8R6;h5I^EZ7L)UEo+9c5L#3YSq zMpSP-g7|dVJ1*G<V9CzCgDhmJOFvE4&A| zU7Z)0L%@WrG3vkDa3@s8Q?S~c*!EzWuZrw&$K39ZZSR~sB2H6&1py^l3XG zI4`bVDfBGGf{ubcT0D{!ot`KbYWY0RQre&>W>?_TL=ism*{6`dNXSNdmI~xc)8$K* znD_S!*|ipadRf@)aL&HbAyPt!mal}hTzFpTLpN`mlyWB1TFcUO`$l&H^z=m9oz8m@*obt0Hl7fgR+BwZByFy8Y~DrEc_vHDN8NBQ1O ze@{Xr4J8KIlQ!qc)BS^?BQu^ln6er5*7-V zc)=VX%X&^vs*p3YOK?xX%S4LMsUw?60VPSnv4MO~7JBlg0V$G&xP5nI+qyZQXXK`I ztvbu*bp>tWhXoWXI9*)02jQV-Q2Tb!{`D}h=_}^UP90eTZDyBFilAq_glB30nLu!x z$x*}$E$%v#)gp_tnSN*bsksM|PuH`l+8MZnRu!B2c3Y*~LW7+^$!WT9 zd9rSNfjDk~&sMxCWU@hwajlc@m5VW|<8pCaqOX3o4VX8{E9%+XlHCmg>QrzLu^+O+ zV;lVY5TiNaR_;1^@dq4aewA{~e}LkDnf~5%I%5FRxQgcV%n^2j4W*IYusDNuG_; zibH|!MiX3|qi1s8qL~Kx{pp_3=~Mu?WC@Rbo>V9n!pw1o_95zwPJ@^-7^VGzpmZ5w zE+AqJYsrd4V)bCaA``;6xY+U#rTHSjiWsm{Qwe|>!uq#3cqb(E#y&>!vO@C^XD{(A zql$eTEVT0qmp&Q-Mk?+s)`!thAu^$56QRMeCuC9`iWYkE1Q^Ub|F?ldBBVj#4)>3q z5Fv?0u$F@vGJjVn?eoTg5DpP_nLKL~j4ucd)j~pp)6^U`9waP+-~i>O2eiJ=k1Qb7w(o7sme@4yrQ2nA2b5!$RwB2%JpnmQ)}0_m0?>C@$&xG7L? z?{~c@49Q2v_#sNRG+AL zTY9dQV{&d0FPeBJ{hGS^OL#(@?$wDe1XtCb++JxwDnAXw59>by$C+T8dg_E^FT7jE zYyNh3Lpi;Bu^~#4`<^H_{vJbgta=t#xU4`tzLeaGb&A&xA$3G*97JbX$>B%Hc>KIb5g+VTbUG>6otyaG6}kErKyIZN^4 z`<*zg(RZRnTz|8LWt%oMZQbC35wvUQsH||AAtp?oa8I~A?#RYr9Ssi%A~};@n_efE z>*mP5X|cJ%mqy4v+1D*83b{^-OTHLRbgLHnjzHIRgmSRTVTP~!s3mTprEVSK1jMb9 z#kI$$D2`r|>*hkBKhj^Pf)tf^m8J3CVp%9wQ#bq}xt{*Y)lg(Uz(vU+IlYG8bZ7X)2JX$Z8MH!20 z9H~h(yq`Ne;*!YfC3U6bxjIHV3^#wE@{BX0Bbl22&5m7kHKH+rUh}s1HONx`~G4veQhy~diMU= zgmc@_{+98B;=OPB;!+2&RLA`xU6Mq}4p_V0GH;*d*jF%Xw#m}!@cnGf;v3z zs=9%_PG8mkq`!Yu9DCXHyf4nRl%>xJzM>mnCO(CY?l|~%c60SO@)I{mxT$e8bg`Xg zs3*J3T(R@~hGa1dMA=oNAeQRo?wNm!u~@v&NNm1db1$1JB#o}6xooHb&ud4y*A0v$~) zh}3{%sr*}OPk_@6t!t4dW%}e6jDj&U2sJnqQbS|HIP*flD8r3$+=$6%GsV@7-;w;w)7MJznkr2L(x!so(UM^u4`ld%Zr}jBa_{igV1Hfmk}& zGkXyDvN4s`z@1Q-^dJ#0b8gc=(oG*)s=fvo&)JXc=S~FD&xB2$OPf6BJAu+(=9|FC z$)uBT1}T-Z%u#dl$=Z7V-axOr=doW~WRc-s`RNFyJR&27_A>}p7NHRah}=Tdp=mh; z=g5rRGXQr596Q&cf7&y~hw^UWZqHb_>$-f5wd8(zOSi1~;`Ro0cFP`t*|u?91Zm9Z zF?UAGA;E;`o@UVOivya zR2Z}*JzdI8865`6g6tA74zo+TOT^Mul@D1IPoF3S2bHiUNm|iECQJ3xMV>9cj*-&GG%iOswcJfxsvkg82n7s=_8VoTA ztb(6dn|b^takd>ai*Bi&+>9Wn;_TYs?asGe+;HTPrq@sWPMqC1poH>)N-P2HyRssr7zA!>OC=p9vok9Ss?o z)5;xDvcMR#`ojq7(_f}RZas`!}t7p(h0F1b%g~5Cp(_Eg3ZfyZ8=d0_fA;E zy?MSo@t9mV02>q;dpzW;&^?ST-6iYM(Of#9nO>J2cnxEG;Pv6u&!k-U?l{k5pLx1X zUc*AWQ?|=_7+MkP7AtqDP!pWePPh75YwZxJE8i@MpQW}~bsMdP%SeY_mPcGvk3a)& zkKkO0q7|mz5l+}_iA^pOjv~45(luK?P&ZjSp0XnN(Xy_sp7;OQ@b1mRy8A`zx$wb| z{mdX*xL?w0K-T51zi~SFAWQmOZ~Q#h_!+k5Y|c52>PYv zPXeg{-hVf-Si!G~qzA8sT%BV%O<#+_VD8)VrPSM+$9#bm=dw&VCX0Y8NJz1d1C5?l zl(8R37cOgvpPw6lyDr*V*qCpwtA?g`=%SYRW%#;Y+_VnDEPY~Z{S0fJv1wiG)#cbz z9f2oyh<_Sf@2+#8AjKN+OCq3z4ciKDpIVy7r3d}&BHIO-U|2R|Kn4!vxsaZ^pUA-O zav`7oeH#7#_FP{;9P1i7kEgks(_8t6w}(mX*&_-vjesi9c?4Fimt3+ON(xG z=(d(R*Zi&%+V0u&eSQyrg!A$_pZC}MzV7Ruo0rALhR$BBhqeOSGIB8~J|2_RkzjN5 zs)}j(BKB0+Ztb*UQ$g9@c(s}cRm{|#D*%{IWoN73`_SM#OcPn%JY{@xW_3t`PEc^i z-B77#bJoc-D6Ni_%LO|D#%Z|wHyq~3*^B8KP~vq$8A-kSEM^o=l2=_}R*39WS!hlQ zj(28pgq)^IXq)N3o~;1LP)){`(Cgq-^B`f)e1#P47VWUdmU!997g@J!sI{i<6)(IL z9P;M4WftWo+I=oL-ab>Av0jm6%RFbxJik<2NYR;nI$>n~tIu|&)C$XH6(;WNEx%Ya z2DDFiVEwlH=#U071|_01+vpj*%4)Vc^LP%nA;6H_NqRXH)m?0XOChJ)uaq{^?4(Xg zwLEK}D`+#p1CJW~9&yzz%Q_n1#SZ;>ZJ1nMvcncyE0EOegjxs43AC()-u3t20$-TV z%h>xYwo}OopbM#yDl;hSvl;cz)>SJ)wX1B(Dr)z$M?~^PHZnBnm|*fHDLI?^<+GzX zm@Kme!x=gGm}U)hHet`F9(-1t&BEW1UvE1rOxA02)X2rDu=fQnY2p2A*c+@zhk6mA2K#Jv&J=XThz4w{oQ#M{Bs47rCTY`K6P5r*z6B+c(U& zp5ZsWK$1zXaab1ESR4sWI>|{huXHazB|b|uB6QoAYwgluJ{a#LUSE6jSr+ESu+ISF zX~#&W-@ok|gj_t>()h2kLA&C!MCs>i4SQww8gF^BK4)e_allVAO`ln5>D@kdK#i>@ z^V39`{VdskF2G9$tvNcbe|T%wy8$o3$H`DecSAJ7!*c5GVQ!b~wf0Ew{&{plePOEk zH>?AYxWOZlU}S9VVkCfUyIew@4gYl@d>Yl6jfyE1PQVoNy~Q7?(@m=^DEwLJyI=6ko458(rN|Tt8C5Ezk>2TBKgedVVG&J8&*REj%C%6%S#?<1~hLi zPbcABt@?VIXgxi2gnaH%8U0mgrI9mxWvt5jBy4}t6S&jO*Z5h^*pn?P3LYfzEM}P z$&d-9ui@GKudeG}N5;qsk`fA%drpb2@+G;Ye^^V-f`fK?@n;*3<Ee&9ZR9aZG4t0+ix_A>#?q*RRXBK1D1B~528o(2{Ueqt>{{rHVWJ8k;_BeXm zsy5MhfLGkWpmW&qsQ1ji(O*fy(%SlK-)qjW_VC+h_QCe2*+n%Uu^qnOv|k2SSx1N+ zjbvYMvhN;TBAi}0U*;>`n+5n9&lc8Z%Q<#1Oy)!%U#9u|zoMKrAc-sOoqY?5VUqe^h}XGwiue#n2`>tB?*ySZOx* z78%CU(jimSb(7SE^J$!hiYdGeUhdV2=Gqy?8Eqs{SD^7MI!J8r5?Q-L3Li0h78S!U zZQDcts7oP3Ii|s1hD>LT4q=!}Dn(pGU`QX_kzUFFT}?m(W=q^CvBd z;@{Fj3EglF7^ype$y}$TWe?Mlyz7yC8zo)*b6`Nt?uNy>A!@GC6kYMOQ7p>Ae5r|u z%D(@(?T!z@aT$_r#ouvBDW&wiBXeUY?Ovw4`=I=y?A=Sxs^QE#%2l)}?heT!c<{ zpm&P^h05v7NZjXsNLm%YZ@5Kri;CZ8$V3_IcIR9yAG>*7@p#g4q9FzLOuPPuYM!|5 z>>Q$iW|*xp%QWVN8nawIcb`L-cXMevovgqq^xICf18th6p=QMmsW`z!^yGcgo4Ald zoH5av`pD#c>;ssLp9U(S(4$M(VoZEWL(MJoI4E$s7md*&Qrn`Z;eJXOqHzo4hxS5@ zqN7k^_^Zc|HwyWr$Z>T(TE%FR<#d`&(GF95YNw8ptv*VKRuaRv(a41!$Qs6EBeGj0 zVJ_X`D1FLS`t;S?=ybFxD$5+8flQzx`Ds%eTl*6doAx>+ep}jb9n{K z0}t^>B*ng!q;IXvzA+4VqEjK4H+`$}WB}s+83yTfYF6bhq!mxSPuR!yFM+zPzckP; zDvaf#Zwf}AinzZD+n>V!Dgtr8o;Pkg7zY_LQrL z9qx|IfxJT2w`#bB+kCGr-k2unE-=Gys=dL&O%7<0>`q!J!T{0;+8Dv{iZ^0up7+B7 zd&>|Nhq(bRrf5N4b;2C%wMoIX^BV<2Z3(B368!}*mW%t$c6EMr*&K7(Y)#p`^&ibu zCtC;qfpJJj%ox>3seOCXX${TU(RHHV8O@Z&Ja>qmrweQA3p-(^v&lEdE#gLIm z?8cadjz$<`1k{bN8-TmD(fj1eF=q=&^j)1lgvsnl$eiNoCljcWy`vkY$@*&rs1X=j z8FH4A=!9jxa3BaEYyVGqx+S!;Q=3oemc$Q*9mj47F8Y=vn8VuWB@|RxS9^=~D@AgO zI=&AYO@6E~htlsQ1@N($uiFb}YdnEAPurPvOhgj2DQT$?k0x3;H4g33ohUU}Y}71l zB;($yc*=OpYSpvO-oxng3;DyHvXQHu{YileEGc~FjAlFgfKv*Y->z#l6D{1v6Y!PF z9h9?WOu2V-ue7PLC3){n`$S9Yq1NAEiMNZJ9V{o0Y3_t?%jeZ~1<#eqXk;HfSeAlQ z08iuQ!3#~puP}qoRnOmRj+_BZZ)J)#H3UcU{+9x$1n`#w&Xb?5l~kyfGaTIin5Xn- zeAOdr_cLl$jm@pMxl_D#diVgNqOtc)PO#_GeKB;|yeV}*+;4N@4_Wp7z_s&>pEiqL zndrq@`sK?e`xqozIDa--S}jJi3_bx*2!>mN0*2y^Wx{-AeMvo4Y(FJF4_=tY{L)9) z+VdrK8^bxD!0n#INBLweL?M;6EH6~+uIw!FF;nVkGme3bYIB^?Jl{ym%OGYhex^FK z;5tPD_Ehs5!f2LP(+lCB(%D;Ah&cyPrwy)$WgCXjQOpayM7|>eB%bk$Yd$Hr-A`Dp zf-m5jCy$3tVTG*?hrMBoUtv6!A)PL&Gf=*dOmz+wIxhfTVbKF zayx@eKDX0B$2GsifUjYQnrWsNESgVbsd?)gNHZN*Qox`z=2r(fVcuB)m!o5U8-lGb zFj(KJ$5*bEG;tQ=q}J=U=Cy!9UgX{FHhigYzpL z=TSd%0yL7Pyorl(|N2t#i_v!0@5|(cYdid%mi0zp!qfe1)AQW+ zsNmPb*TV{IVe8RdZ^MV*iPvXNcsS%juy%<4lK}t`j^m&XiYeZ(2TSgjriKQ{l1erl z>i;mXF|^?Wbgqeu*4MvJO~s{l`czBowWy9)<>{=s!#Bo|Ld4Kr~uuZO{~9DPix*{r(0xy1H{wrQVB?4{$I8>prx zn>l``;Kx2OpPKO4{=~P5JJ3U}%$W%{rQ+tMz0WyqbOHu-U2U~F;kn~xn$BBK<*m0G z&2(XJF5p>3y$!?P@xBrtpGUYSVCu+re5wZgtHavKTcG9jc=jJ5M4tpYBkDWOsyJQd zW|eJoNy8_oE^2|T;p%sTI!r?S!{2F-$w8{rwqUKq=QSm9G0GK;qP$aYyW$An?>ba)cij`Sn$IK|KvV!{^tiJvXoql==68ICl|+kd0HWe z+usa4<3y#Mb-%*Z0&-D}!eEy0dG^m0dj4Q_pH!U`VUPIz2jrLk_Xoe{KJZ#pSdo87 zgWT|cf5J?EQj#?sz@iF`(^~qY`DQwClG`d{gOpBBct&wvzRzr~)O`d|%`AEdEc9|& z%7*y&Wp+y;0d*}+MaiHUidv*2vU+(S&hBkE4eub)Ul&uscyu1t%^?AXTe3Z4Z`T(- zo}6%VB`Mf&jA(cWavJ=@E zv9>Pgev>3M@N{FMyr%g#ub;oDG0}?0Q!geRC4iRyp(NR3>=v~wK`xI`j=lDUVupHe zy%7n)A`m+=XG_&gYc8FvB!#C!Qy+f-sL-c*?EUJbSYdC3mF-h`DQei`P84tzwp2q` zOmwp6IhvGdH@`7d5sh)iEjnB!HswAuXE+!W3Sj*f~iyiE(ZBSX@x zNHay#B5u==ggJZ(h+1YUI+I$(3JDGuTPD*Y6}`0)i_Nk7rSR3DqZX((s0;<|7qe&3 zRII@erRU4RxqiR8vRVb#&~*tKYL1RtsG_5^1yQ=Clc`}PB`>O$G3C8wb5%RkC3;5n zwAz{?t%((S?z6gAsI*V3wL8>Seeg-L)t#jRLHlym<7&J}3(J|SxR{rsD$%R*QrHqb z3q7igRt?IP7Z12{M{;{|Z$V9i@KQ|UB=a)Z zhcms@tXzu>!+(~gSOOskq6eTM>&w7O0q5DRu-CJoessAsyEi?(FhsVDLsF$HB2z>1 zjEstA@(L-rf`WI5Y$7#U`-)n7R(*OdQJJGsy`okHuia^?93m}RR&an8?E`nSC*538 zZUZ=+&f0x%*i#XoytEqU>XfW!?vY9|!qtlt<*PYWRl6BQ4dkE zW-7_ma^B;h?yu}q*-Q)UV;Txx+LxSH-!a9F{#6bA-sCA&$?w&p!>Z;F)pj-ftvgJ! zJJzdMmkN7Jhlx(Ro#%ujS(VBqce~^^iuSwYR+oIeYoW7c*i%`gs@%?YY*cj=uz59d zBNb<(a4?Z+m#Ze*RoWDG5~c!IRjL~K=m_hsk^5`pL(~HHl#2DS?i2FTH`jPC$k&9p zQ`orAf$Q(z%A07J@^~-&iKZaBz;qykTW)SiyyfA31Hs?w;P0m3Z-VDW%eTR+<(^%e z-Fo)>Dry^AgXPgkB?5+*_lDa2uF8K#)p1XLol3A#i`FlUcYmPrcd6X3v3|HL_Q@Mf zuKXKSrM@-rbdWz$#pO!k?qTEpa{4u*VLv#?{=}vK^I%GL&#rR!NtP3DI(S+i>ueeD z#Qj|x+-x;BcVf%MvS3E(Glk=_vXXmHQo{X0xsP8sdahi}lpJSTFhS|9&6u(@41k2q znJkP5`j_#sA!szUdDcj}SAyf6+YX$mYCFQ~s){>rH=RC7^xuOVWWwWL&5ZUlm;zWm zoA)T|E?_#&uz4S<*;Oh$;YqYwZRc@l!*26N4>SHO#%g0)_11l?yPa`AqSm&mv@R}G zb4Ta#T%!L=0JAuQ(*nv@gw`LL&0Em)11c0}p+Kb_G|Fy=6%Pnn!ctJEwxP~+9~!9HJ^L4%Tv^%^c0Tay zvY$;L4BY z3ek?Dxk3;v_p4QP>Mq1&l?VPuUuoOFW&$pk?56&0frmahy(D?b689j>T=E-3b^$Fqt4YTkqT>7y|Bo8?)5 zQl{O;$jw~S|BP$;tO}lJ7v~py7P-P|VVCURv45Vk-X6xCMeUx(F#Fu^ujYcl9DGJ* zEEp3W?F(w{Pi%P;wyBnzpJ|tSD?e4I->Q7r=Khy0Z^U-@Z`$SJPpxk{SXVnd(;lL^ zM5NV^rmMf1DIAO6Gx~_C@~`U3yXq!A`+)Szg~Hnl_DudnHPL%5B_}d%0VvjQ^s4@< z9!*hcOtI{CLFz?qK+T=~w@&I+lX~_}QiW`AQZK(l#g0DAs`PT*6BWB9Ys1b)91%mp z2fs`8@y|G@g-t73Q~W8?K59;G3Ju@y4_&9^Ujikzl$RYc+$*DVBC=;9XF2l$x4zm7 z;{bBT9c;Cfyw_}87a->XGYj(9w#P9)tPRc&UT%JPjGG^v&ivB~U@C*1Wo^jPkRfW; z7b^*oBLES~M5pyAGel8p=`-^Cn9AqBQj~N|gCL+2wvmdbMMZV96*QPG?O_2j(WpmjNnMn(CKC(O_ zx95QUfXjQ~9_WWk{|UWoKFcNWdoBT}AAxDrXSuZYacPM@|Btfn+T#?Nc5yE%T#IIL7Havmd+f9FYq)QV?VhcB z;3yq{<7$+D{{zg&!SWYh8i?o^ql(`;FY*1YYliQgn>}ZyYkh(o5Ou|}A26e6-Wg{i zatjVvekeLuZj=)>fT9k$wbNyt`|q-b{oiF37tZ;Qvbqk~gJu0GSA?}(5nzRcvKqMj z=WzKKeaMxyp2xN8KAtIKPpt?)m;x$lxU%l$<*(dhTDhlC7)0kB2{|Y*UkdfQM|U(y z2Ew}Lo)@2)a{#G0-1q8N?18JYk3!)pqVL4LTxMdn0t&pY(9!Em2g4{txpzAN{tRz= zQz2{Qi(Ta7d9(mM$cBaKF>E#ddMzNQy0*r)gd(mNmCYmBom{FdL* z#rTIAyPDbjdx`yOXrnr}2KxW?io0DVY*?`rU@kk2ox~@Bsf>YqSZ%uRc|Q%UZohZ? z>)q+J7#Sj1y4@imu1)1=m6d9_zCz`x_Z zcm0#^)=F|8y!*a)Brp}J2(gFDpJoadl)zpxyo{75GRSoDA|JZUvn zSaXvP-0B;=mvrQj0V!Ny)LlFM>({5$buQbd@J68&E9WQ`%2aq@-|xDOaq|1!=o0_6 z8(ks`h-O}X&u&xC?qGiaZ9pN_kF(d2&}{xnPOA))MtIBQ=EC~7cXz(Mn=D#6xua2H z^)ld6wKg%VUCLqI@Lpnj=>=$wO6}g=>LhhLY|{3bxhV*OuB^3l@i)0RpBrRY0|*9? z&KJ?5G(pfNUS$Q*~|=a4BPC!YA7oH&#A005WdBU*Ot?%ch*`y}w3?hCf}yi!T` z;aC5fZbx8=vQf|g4YRCu8oQ2sIowm8>fNo5xRAoRWrTg+aQHxUc3AP(6Y16fI;ylQ z*?N%88(|DT8--BymJ~B-2};?+YIB*U7bgG3HWJ@P=MBQ8;`zBnVFzgMg(%1QDM`xu z&+Z26_rarXFQtBLx6M7}_esZ!b~o94UQ)0zH4nQ|}UBqy7M*(x~586S-e~EF< z@qfZzol`tGB|cANFG!7S{yjVSsI$*RSFB5Xx93c>ZD8sEorPmO zXY=C}oeklTJ%`B8-Y4jf_#5ImE{-LaR0WyFckhrPOMuvlPJhjt%u`*p@`PHqyVJV` z{)s%xcMph01f?_9qza7gdz#JK)R^K&HJdXu9&!4z1IG>u;%@9{jP4Q|-@Vt-QNnEE zb%p2p&dh}4#{~H)LbLf9O#%hi9-7U28r5xZ+ewUf5vPdB)6((32F?-=&pi^bwbmC; z5jDw=k|C;^b^Z-Nnm_c9nzn7(BJw3NWJ3&Jwk!>(z__naKz~6d+(VAAOConXPx&6Q zhXB$GIj&XJ$w~k19_*>qAN*4Fg36cH7?SJD`Y@0xk@-{~s?)^mI#p^ITfibWs!!Ev zbNnePe+mmHX(~WWv8-aQgRxecAT35#1IX2@kG2k~QSN zy&T=zH7WlOFGr)>urr$ottIY!6sUaOR(XrLd_V8bM*go(5C@I&E=)Mp-%;) zKSdy?AX}sT)~0o#r>zbDCY8TdQs=t!r$F>x%5T^qt76-&d^$8CD&7u5di9B-3rvR3t_lkjh)staJOqNpec;&JPF zzz+&`R#kp2t@hljd#3JOx%%#=yo=O9VmDOvN5DdO1&aH{;O2LqUB@1Pyw?9KsUQCv znt#onD1baf5nUu!hMk;4pTBpKko8~yWAQS&7t(It=|n=5#G^mupAx}PCOIDTIll{> z5{);ZgSRyiYa{^H_6F8){49yRuqTEW6J8(9V`zTiZ0l?6Nl}NpB+tiQu;WyFGS+6% z8Z8+IY7Wo`EQb$Yny4B!4X8aEcAX7ryAnthU?>n9X7Xk6N*FLq%t1bGWK1YzJvXR{ z)EoH|Vyp!>!Y8O3^CmJ5_--gC@^8$|8VF#e2vc%_m2+k2;tfL_E;@Y~Is1VZC1C!H z+3@lluA+G05J4`-KjM4!z}WB`zQL@aeT#e6c8TxJ;+gyT00ZJ%Qb;a(AQ7@I&{}X` zT;%8NvwE{RXvw$S`@bw(@;4y0jwbvNqU}Sz_Ss+v{R0VqCI#Beb+9=mL8X!P&w$}2 zj)zvC1#Aj9l{9)j<0cSm=^)>ow+#p$?Pj?JE9(j#Z&iHk--Q+!-)!VrmJ^}|@U?CX zNmDNkffsBYEXW0RHGHM^pW_)tA-h8)s~o+H@dQxEcR7dR#aSxVHjQ4O6A8YCpSX8< zAYICuq05Tm5cUF1Ry3U@MLkTX-u4b(m!lro^T1O5fmTA7#Ye^%Hy;#HH0-;x z!VxAZUMkTb<}`roW93vvTu8$o1J$DN^sH)qIHa0fEo#7)xS!OkR_|RI%;o-LAKQ8t z8EQ4)=+L7II5rRTm(sI*EDvtgHdwC{rN86L3_4iI3*Fjns}q-_OjVa*R9U=%5%Sx* z;pGt-AjmnA0*i1NNvx(<=|lu_^>so%I5>qx>i#p+@pA2Vns4ik2bX;@r!e&*)q;kb z0az5_oy|lP?`V6Q?_C`Z#@IgxY`u$<3lTcGwmK9t+Uiw2oML3OmS+2J1UPOO%-#&w zG+ZVVam5uKCoSYufa?bm9;_CHWW0);*6A4mf30Zz4RjuYjKkxS7ug!+1Ms0rXCt$5 zpgxUF_*{~(2=o=t2P8>Z2VnxlwSC)b-{;rxLw@z}=nbbdM4yR2?n4I+ACN*&dJ`o? zMJ8u+`E^3sEu$erZTJ#4WvIY*KDikAM1D_j^@Y{1Bxl$Yiy!BzeFsU@ zc!_>F4<(W%qng07AbKnyN$xNDzBI^l+bbv#a9njxuKv;8YX+nMhE12&VIta&@ST*c zS1$9lc5xwKm*&Fa1FjU*2Hu~Sw*3kryg6LCxi{10b|TW`Aj*$sa(GbqagB${kpH_f zL{MRIb!6b0v#tP8Ov4VxY9Ua6%fP#f8gsd8Sggc`G&RF+HW^zlVm~;eY<(i`HAg(xa2V(p=Tyf+MMCo&Uhae1%9jgor zw&(%80f7@Yv*L>6o+WZu5e`9k?D=3kiH*3A42HJjYDUn^w{1Tzqqq+fxhttcpvj=n zxAUb+fis5U|1z~+?uwG9MD4osfGbfWkUVi{p+-P%I5bxy2rZ;G9Fo$42)i22#Q;4C znFgU@@2Yg@B@Qp&@u&zbLVF4N(NNmMrymu=T{*Yk+88pr3~rH+2%rzd1k{=`xl`&d z4_?-^S~TZW>C3TO2kL{%St}l;LFmmN-^FKZq;88;^EiQ~K-hps97AiAb#D4^ZAUyPZ--AQ(`eB3#n8R|8Jzb*~V+jaEItw80<4sv*I{ zj3DLa7k!tBo8uSWMJ2w1aD7KblUz8UURw1mhn{B==3nUN-j{j;1M06r$QdJ{9Qj(? zI^w_IChjAG6fuJ?Tog#G{rP7zTrZ5R}uU+*D3UV|b>Cmy`P-8~S1+GQ#p_)4Ee&-=Rg)W}tw-t#@ct0a%v{cLGU^Jhq6vg;oB1rFac|RIiZQF6ufBhl-1q*jJvdZPTs!J%ZLR78K;QY8x*kYr7r~PxRx7z8TN%0 zE?fb|VaTj-c?Bw5wE`xt@(R>oLda2j1sY~xnKwt{6{K{(>CH*;4#fJ7l3~~1Ng0ad z^#K9wy8^`WCf?|AX@w7yOYp~cw6(P_XPHj$Fd3#ZJe+Ovz7vatgQ*6844HlJJUm45 z4lgAd3VG-_uym>5@-)#4n?pTz?|Nz5F9U|m>25X2eTzOcF$S_4yhTrH+lja6Oam>b zpj`n+!hBM2_!yC8;7!yIWT00G&xW8=+(-QP+wq?h6Zr#GUKe#l-O3>vsjp6TDgb=qsg z=%N)h*Dj%lVkDw_Z3|R9!F2@;zfwKFVpFl@Vqj;Xn(N6Q2ZLcBgyK{Mdvd8R*pn{> zdvZ6|B@#1!=*ct416=yr|EDV-2def#Sc>%-Qu-t!nXAu`ChKW<5f*r@UEOaENwlrq z_?N2%^yQU+y~WUOzs-d64DFopnqKrq07gDr0@pYpADA5 zF%DsG$&KC8`?;|z0*S~9K7S*z>&|l@rwX4t1crqmw?YVa`d74BqQ9muNsP35a1~9b z$J)N56BZZ+oVdY~xF=t}GdWQ~;2-XbjYSuMcF12CyjcfK0QJ(&qR#wPJCoy!aT`Sv zI>D);UL}KR;wTdE&?9kMXj&#TYrJX?0muHl@rjtb(;Gob(7d83sUh zMYqc?8lhxWxA&5Sv$LqBJR_%GIi>?RI%C6&+q_hy?ow1@Zmux_D&`G7!n-*NJ%_#& zHJ+2Jqov*pfz^0umcl>@_=oJ?LQk?KSzivG3b@v$qKZ67F53f%cmD{)JZ4H-ktolk zV9Q-tRc2CBG!ziCnK1%~3dXSf`)@Eens0)$tTok7$qr9cz^}w!i zSQNzlBTt`6hQi46z=FD>LSf!|29*!>RUVX5(7g__EG@6QP(sE&auWiy$n~S!rFGNRnpIV`#f5bR_#XBVpZsIm+MUPy zZ}#r_IklL*i}fJ&!O%1gi$S1A)6otAAF*IyEm9H<1-zF2+B%mr3`XZI@75*!iAB;6v{XJYUqTkvDbuT7^b z%oSxV%W88x<((Nnt<`Rlwpw63S!T#C9~*r_np0&q&CSTEH5qF0)NIJECqu455p53Ur}Wi0lFNOd|X*iQ?uY%+-!;l zN(p=e)O_%x%p*i9K!BplV9*}rv-s%3F)t-8uY&bE21Z4J%m>YX(U{i+inc3`Qy}## zYS#XPcJtRi%Hz3!tdcfoZy(gt)4YCbmg6zq7v%N(>8#-OkGy^yNX8D6MTvt}L?tOX z8%0N1RMxLi-!0pJtk$hRR_j+a!D{_W&2+Us^+UBD7|zREpIMXlt6$hIIb! z88<(_`K9Uhw$Vq_qwCZq391b*inX_-?qhGe?~}JvfN3b}loCUa{1G+AjY&(Za0rtZ z$R(Dd+vTS9i>7qcygZk@y;G5q>^s?6SZ@Yb8p`@ri;{?WF zZ=kRfy2grCs2Qzx8Fn>>pVkU8B5DoZ6HXcC?bQxV~Hbj0ARvEx)SpdO|s zGG4v_J~SQ^#ykB=>YY$N6UION%Kdl32qu)+)!*@ZRmm@+N;eS-liHH z>MOqw<Z(j!z3G9vmtA7J0I2ny0!{n_)h9;lY+zyR z#3`pSAK%)N)cc{m&gYS#S)Hi=zW9{)PDD=ELE9keAkgq?z>5##SD5?aYLb6a>0{py z_5BtG;QV^Q)=_w9>T4wc^&Aov@Szo|V&eFbbag zxD|P=|B4H0=7K(8=T~q+Q{nOy{y4>{*u9m2CtuL^j$zlA4F|wPAvr68Q@fD9-X&k* zC0F}xGk9H{PU)GdfhvEu6dH&Nt^t$J(nZ?&&3|N@53w&_AWp|C|0VtkOoU4~!flsy ze2_>r+4;F3{&Y$&cL(dd^uG+dY8tA8vL@7G=~@cf-sZIYU$Px^v~`f zqj=kC!>$ck8v-D`V6tU59U4ntm?t)*w{pW&? zw~q!n!&Dd=U4q!hc-~&s_?W?eLJG=;I$wGLTOjrOq{Y6%dSDRR2JSkqtv|9Ne{u(R z@_We`#xsZUI}S@1Eg`bfczwxHzgyE0WW}vK&thQ&zvzVv=q-p8*7?x0Ud>PZ#4wyc z01q@5&UQ1LXlcZ9@DuW(@4vzb!dEWoE{W@`_i{;AiaCw%7 zkiVPGA4*sHfx$+F52%y7xPsB|IX;gofK(dEW31rK_s=&tZcN6*V~Wu;1qAXYDfCMa zq*w~;{WVe+Dc0Cq>XxS-#oi}bkw$1v6H_wtBHNGvT7* zqGBVnO5_L+b*u_?go_=k#E$SV$Eq+#c(`L#c;S+cE7I7P#FZP_jyE|2C{+(z?7-UZ z4U=>i6dS#(B;GL6yNdLNMR-?5c*7#St0Em?GaRdCv_I5wNQ!2Rtq@m^u<*U9Drc{G z(U44dRK>_OGm{m?gi9H)9)w3TSv-+ZvOu5<Gq_?gho#Sco7f9V8H!LWtpX>%PwXdh+3`<6s6QjJQD8>X6;+aFH zX!sFRUU`|w>Ig90E?&ANqTv+Uw)rCEb-&qMBDj*A;R)Ra8g2I}23vjiQL5R;`dg(w z&NC?N?^}*UYHW z{V@oM5Qvq`$!dn}{2OHJNK4ChJZL`RHJYNETQY+2MYXmDBa@OvSqKa^x~--BQ!<^5MMF%!B31o^9YtGM zq<6n;P} zS>d^M1n5|(SZxDgq?@wJZ#;M83@eu&S$C3S`xxcFLoQYrUz zd~>#g3+QO#FGHM&1s)i++Jv0YxCFa&wc|7h^n-elsO@Ko#Jyud4J!8E9&)>!ktb$c zhu4^9Y}L6iMw&0z$yF-7&AqUUqo)AACC}Qz;e-o3MKP-NY*B)h%D5~fP6^tU8SF9G zYXN>?ZEk6%<<0~yT&kzIs3;*VCb-A9(}?SVcJQ+TBEymKs}1&OE)<}!(Ri84rqMs- zhoL!zT1Q7h>Ak>oe(HHR2ht`1b$uJSU-M`y7(C3{K{?j(dU()U7 z{wWv$rcmivI5-jCFN|cowF{D=XK2*7IwIp?yuahGky!x+{!9qDtxY(0l`UO`)p^Z{C6xq z0hSn~7R@w+FWG)Zz8E}&03yz6syP7vyi>d zSy>OTRv7L9j6T^p-GJZB7v5gDb@HGJQ%6Y!%UYPm1r08gQChSbg*m@^?(R@Es{IxMRIsWuNX zfVB+IEDN7Xz2K1F$GULVbXHX?1*ZyEXXjb}Ri@-gMn1w;n6J(&59ewj#d~22RHGb@ zF~hKp+imHy;YdWCwJnFAv3gr_N@_^5p3E5#Q2K3LNnM^asyWJ zimXf`Pd6a`gTi1)PR_O03d)G4#xsI!aSpLlST06j+2H!re-%=p<3z(2UKxLBc*!|x z{a?h{{EN`7Kc{`0YMWu;1_(oPF=93DF3uL_PBkUptr#Y1ML9(7;$*{wAX#}sbXE9= z;hlnO#i_#XoC6bS(p16Cids>ch)c6vxKoggnL39!us9hp{Gq2zTstF2+-I@5D!Q&+$ENF3O*wbczni>G-CdDJccig+ zQ<=#k()5}}b5V6Uv{*XC(5Wma~Osr?L1lwqJ$SlAhx8c}46sryuZ2-G%*Z4ZG7=ye$u0PUezKwj#wv zG)C{Fb2Mqybe|k%ZrmL0;emSNGimxQAo$X6sZVb8-;y2?+{{cB92DYkTJ^ zl+$i=>iW-e3agfca|9BKvMW{d}N20B-Uvp?fE@8Xv{$ya^C zX9pAfBWmC8P7&u#SM$e@1_n%d8`YJ&)g@bC_T;37^QSUmmjo?e9`-!F1CCTGmYX|!ij2J{F3EtB5-aPdFdWc`PQM{ zIPmp_j^D}Ys`@It<62DKt9+F|`wF=n3g-^Evb5 zqbP*?VRha*mHS~~@jB=npZhiL*>fuQ8^Q}0io(v%)xGoG0apX3Izj&O*KSRd8WTTR zTu?-nNxz5<)-{KRc|WI&S`t#Sj^%KD#h%VpTRoYq+N4CA5&qovaPvg(Qg_^^4R8vF8!Qua}4xe2mFQ)xB!&Y;n+B89c4 zviu^P>I*|b?Cn(VSDJ%p1Me{&@MP#1XGLuv=NK~cw^SQ6#p|FBc&!xIWv1XYVl7^8 zDyuGpe8&;OQ$JCit_Q<7r=aa$804|^KgtO&5zbIhwXzxotSiX65@@e-s(p=3Hg6Ii zlty{Q?D|)E5akHRKgj71;qktBOjdGPp7(Chsni8fjp2KltJvZKGP~iUfXy9#S`jfF z;#5fK^xqC>2#8$L3t)Aco>~@SBLvnR?D1HB(~g}m z_?6LENQ3p6mamp`H3~1HM%1Sz=BJuP4_RhrtEJWEMGMk3ps_H;RCBKBs%BPWPhDpz zuVOb#wH7vGW;M=421|vx+_W2tM_q_o^#r>bz6c)Vfm*W4mC+E1HuEo&VxIwFz9FUR zUKQ%JE(IE->{tbys>u^rT^O%XZ41?Km7hAQLrrC8a0Z+?8Fo{4hQSHyBYVbb#RsIg z&u!I(YE~<@Nc5FZ>tnm6hf=NvF0n^ZNtI_n)Hn$EYiV~*zX0j-zIb$wmlAgTQ7-S3 z!wuVS5lH3&tuEw`JXGRpMbz}`_X#kQ_69hp9#@Yq_Hd8?AU{jAT?jxjO)uhAc1h(+ zSctLE@4Sj2to1aveR-NH5XQGNTz6OLgWYU=A_T59#OyM)LwAy;5U_ z#rQ%Hc^GMp&Wz`ajOIl~Iz?k%siBjM<|HGXt}|;i<`f-$pN78QXui)#Kd3XOYs?QC z&G(a;2VqYeQfn`B77jRvhuhn`1}3tnu07!U;=(@+XZ%-K_FdL}oaIgf8(FrMHOZS6BY)-!hxwJRq7#-@sEvwbP;Wz8*=ucj_V<)OO& z)bU@e?*{h4F8kzRX>$szYT-1Ct*_!V>{Oi0ZZA7Ckp2MV0v&I%lj$7EbbD&*9A_b- zsf7~K=W0FbR#P{`>0bfDoaUTNld95LM2z)y@)~=!a5&W$m^>vNu1!yK!&35;6sO?U zS1T{EK)&CY!^QA)LF#8~TBNbbNw6eSh*tFVIwbsC1vvmKiZo4EU zr@g%E%*4*AG_`F&yZ+Kw^`BLdO*@)Sn$cBgX{|VQj$ys3fB|Be8z);0FEKQwqva(v zOj&BGBCm$+eiRjhU2VskO!|r;T4koypts5{?0&oAeSo@CvjK32#-wBulfKNK!c;uT zVvFC;R`iq++0i9tD*fZiuUV}16*XETRh-j2&em-#A`FieMYE5yMsrlhTdeBmtiOi6 zyXIz!(Tq7j4nyzh?r8(lDvm@ri(w^H!Lhepn(x99L% zqnxTJ8-g=zYKabpDoqT0?{~hJm)5DdG+z@Rt8Cd>m6JgW_^}}(dsS?gklaK*D$m@T zbCIkem&sQjBIoAxk_oPSdFG*^Esqjq??3umOO-nQOS0yWcM;o1{gM!xI?k0BZC!2o7;WO<# zSA4U69iq4m52BJh%x18IWYJE}YkYDFA*_WV8A`e(4xw|J+LL^VkI8 zO+Ekzv3#v|Jpy80tKK?VD@B$aln8nl-8&LP79e++rqBNa%52!*ch$GIG^)>2U}P$=eVRquLP4iPbFRqIP*#I5A7rYQP%MC0jl+-EA8_bvfvI{ zW8#|!WAB9Vzv=nUR0pADlerE?!iR#r6J%eygjjB`(!})@Xn1w+sAMThPmZbI#BFTG zKCi@CA@1G|n{vAChNYFw0*n!~VC!!%o1ht;VQfw2wQFd|W;A33iu4@!DfZoI^~x#* ze2wXbxMWreV`F%Kc@N0&0@9w7U)0&?vAO>Vm{ZdtK)34s-1y2d!3{%;PCR3E;!IsO zBqC%qxs7~DnV-{HY zD`zq@I*wk8S+V#Q8PUG!#HmNRJndC3>S_iA31@+Pvgh9s@Fvu)Z%uckn>}}ZP%{jJ z?^ZU#aVfS}k&lg!eP_?ty&;?q;??mmEa$dw0)YO6QuF_@_U>^}RqOxwu;&88RvEw% z0d4jk1_#pOVhN_jjD&;M2{4hX&WwVHsX!h7!G6w(+#N3nVCX|DGR2~i7-zC z6{6ueh#o_VLJC7oL$X3k=KEeV*yVic^ZNbqd%bwE*Q~vsXI=MN&sytw-cQ8r2W=bn zhh*0Yi;ddDRAYVErLfP&&0afe0s(%>OOhqt?>zk$biz}ng&tbfAOb$HgYm;17d9F4 zzhkI41lK)`G3t_jtYTL;uSI)kdt6F>0=UJtu_eC`+=gBH5d`8<``wc^=J zCcf8hL1K!3x_NBvGoSDNuJ&nV?X%IfwSoqpJ~Uf$uQCWSvfA?K-i*pYVfwKfsa=)ML1`YHF?h8*ExqTb)YFw23$NCu zUhVx*40|&3&{by-3G}WLUm%J<7uFp6@T{U&f#^61;P3TwAj>U1%h zjeY7goesj(B9rb8NshPkesS+9r}F{v*j4BC!S+Grc{kypW#E+VC0^-~8!gFVO_G!B z1d}X9N%&}0y4##9p|Rn-Zf|d=MfGl!wnLWUj7sGv+dDqlo}GpLMRsocTdEg$>CfV` z!fqWlk>+zx!$ZWE&SRH{b#aQ4Pls8)P{kMMS#csO)yImZ3Z+ygl}fKhcGJ49YN&Qm z2&t0yy5|-HFS=5ydc!5*q;SW&SXvk$Id_Y?EZ#dE2hShe$avU0Y|a8IF|v|)u<@@} zMwZ-9C8Q;2<$U7?I3OE3m|LPi<=dzjPvV9L*v*^f4GT^HBW;sQKGC8 zew!YrDNpWck=m4!d@quBD9Kxfyx$~w%X!GVYuH79gdh1Xb@R*a0yj;no8NRh*ppAH z+q~&|I;Exl>BG~S-zVk$N!@&sc(C!$N9YSl2z2Gij~~^|-@2nmuB)wZI+}w>ISGp0 z!Tf7#VA*X5v~CE1w!JMNUeuA2j=TwQm0kf$RUq&#%UHGO;2nNz{1mr*RHG;D} zRUpCO#MyeElRxsDzwOu*_#~2$laAycEUigm~HXKZGt;Cn84;kHW1P*fZA+-c#DvaZ0b<dtO!DT83`Xr>^cSC3az6&E;>)Wpt1DxL0@!T>Aw8pCj(=wWpF7e=Rk z!|22|-0TxZ0ff=;FN^>j3`X+`St}b*-pA?09!6ciF#7N}j5=>JVhN+Zn~dPt)6Hlu zP!#jdE)&pcAqCipH<7m8&ExJuS1Qo9ahqJIT8 z3_7)Qwl&9V1|5asT|URU>^(LHY7k>ZPD|jnGr=gGEd~W^tN%- zVrMn3N#EF=zR~GU8EQ+<&N7`6G*>rI!#nFKVdJw6H4VNtM}42Y!FozWewf%mFg)d* zRh@-IIBU7Z7E7pnJXC?WlAWR&uXhkCUk}x6Lgh!OY^CX^Xv_i4k2MR^+1b`p({Y(u zljUn0Pd_!o9eHYI!($D?v>&z-&E@R4%z&)QEPgr*P}MmVYf4!t>y&O#mu^Tjn#zZ3 zpqXYY-JmaJCEQ6N6rDG8r*CkU>(WmOc0IOBSc-!nHiS?~D*n97xXZ^lTyCu?<4%gm zk5b?PpPYubC%v=wW_g#h=_h>%RXQ71>Y)mlqOz8E5-ML0RSoHV(w@A+ zaLPsU3i42ub4EAS3_``S{=nrvIWvpPq9j|qaTr%>z9sFe%`IgF`YJWGPKsMS??h>B zYx;+-y>lqNJeq7YSxaP9q$o_ZvudtF@N<&iyx$WEzbjs00tH{X-OWPZx+$2_{7hdN z349?q>vLtib;EtW*TI8lR@F>+X8mr4Iv~X$*)yY%CB9e@-9KF&E7>!>P_?~d%qAD6)w4KG_;%)J1>i)2b~v2joQt15VL8~K)tbU^OenK&sa)N0U6HQ`Y&~J ztChX|0C1ASd4-R?xSu^0P|lv4O?55hmB*6j5}u}5pwTiJ`)7{JeZ05di4@RoaIidu zwy*o{fxccDu=NTJ5TuseStta|I8L!*JK{4U#G`cy;z%#p{0QXTRN-TB7%F;x9x+? z-lFeak^_7l<6SDB&YtEMc79sG!iyS9)NbcHOuWvH_=AFxQZ;;f;Y>}}CB~FdG@mtj zk2%Cqhj7H(7NDS{hgOTe1E7*Se8LD-N_%)0riAhTZ7>&+Nndu%+vZtvy} zzpb^E{zoe3VbU7!@UMBQ-lukr^t6nJ4Yx6-J-&gz>JV{urKGm5s3dN*$(9gjEC6t* zZ9To<#)Oz$s?}R?51{<UC@H(eaat-o(~sd+V1S33@f%guMlAN4ec=mKXm2O zhoC@u<&%euGu5}~s{z9Vr}bDA)wg>d_qZSR4>TI<&OCGsRuFhs*Z)wjQGD!ZH;vnN z=W%Bh(K&=?!oa=MTO&e z-WaeY?4^x7tGTcE5og<3C_OcotbDc4m$&aB%bO3aw0HXQ+B%LM?{6J?1MbRu-{rbX zs$-6Qa@_l{Zv%5)j2p_&0Ec6YsUW6Z;(Z}1t@wT)qs1I2E%zzAeIKCTVRf=DWk$-~ zDYvD}OZgN1_xVkd1=NZ_xJ^7A2M;jt(@Vyf=qCVEn)_;#oU9i5Bmt~85a*C-W9edb zf2b+@!O~}gRnN|D&?c^M!tS-Ptp2RABmL-&>@pZ^W*LUoi?cJ0C$j3QOXz8}`}Ni+ z-#%|(>-n`^aSn35c5%CXV4$tUR(D)L99xlc=bv)DYr6h~l9P_JlhWLPlG|9J<@vP+K$xK|Yq&^_b5KPhm z(KvABZonPS3UP0ixFWpqS!aV73OBa2Mm8#{ez>q-5*b=QPONc?cqZ2W>lBWi&AeO~ zYJ@XGK-}O!82d>weMFF10+&i`@-&n};gi8h+F~lg+aCirr%~LUR>MXuVA}d|e?`9}pUsP^W2d?#F>;3IUg|FR>|& z)7qGt%5Fn{t6s)LVJZ&CG5M;VRfD5-&C2R&?=VLVXIcyHK7`$4XnF5^cvDiu#HaP@ zU_As;4x(RCS;fP#^Fx)cEzFHAn85UU%@P)DmMl_GYJQvYC7%PqGc%R?XpISmQ-?g- zBk9&d?-b}?>?>Qi&l9RnqekOBTn-cn+((vvRsc@H?6FJQ(cLITq$77!h<(>=CJtsnU zpf5y!#eH~1_`qXmceMT}Y5Ko%k+V&a!J$T&Su`5)Frv$93P?9R$4h<*Ow_H+hg+=S z;^qR($F<@&0>2{tPnGmKlF`w0f{`BMVcgq7XW7e zCck(rCd5DzcKQ563c9V!t%)%`F;P<&S}>|5i{Cb#goop{ca;DnBYcxAnzt4m37vlS zxlMlT&3&#zvd8$-U~k@|8X7leJ2F->Erg=_hN9_ zwbl1@4zM# z{X+^clGx&&&g2av|J&A|n{(L7I+w&MnCMt1Ogc!r62F{i%T71b&z!uutmPxl|_BWt_&g0eQ>8YF3MOa>_00R6wveN>H5!}4t;gNzGV2o>r~ZW zT!X^%;!Lsh4rku<16E2D#XBwYTEgNI-OtK%qs&Gp`Qy{?ze2hWoocSL9-Hau!+pn2 zM43LtF3oaX<` zTVMC1af)^KiJ2bO`X>nMBNzh@x|&7R5{vu;0rLZuA#!Y9>*sX^KMf9xE zv_dUh0svH&pv&;+C#4&ez!zRm52A+7`=?$eQHx;$(>u9v`sTU2re9ll zK2{OaciexKee3l3QIx2Ak~Wc#VZfFA;bhH%bHKyw69-=Fc zyzGt_>K}6t=}HUWmO~H4v={iLLnD3f`Yc}31cPBT0(43dKe{UPG`ZHQqYCl0W*Gd;bu~c8}tV=Iyu{)sn4WjF}4cWyIb|d-rg^_{ggU*@-z^6qORGvfC8ol=+y&>_XET+b!9^XUtMZaq*xVcUUr;+S&=SnaL`o4o9qTLyTL#5+sH2> zPe#6v?btKol?@Pf8jV)-KD({+{UqE?y#Vv=MpfgeS}=TD05%)_Awyp}8oxy@=V!w9 z@l4pNhAJ2=qwY^oiBdtvV?W(0-{hkAQ8eVe4%M|2iIOq3^8%C_&X$D zu!U!s{nv8P}dBsHDU!D@JQ0HSrLyJJ_>_h zdVL+kZEh^nzb$V6VgfoNMz%h7SQ{{^>ra2@$~A49YN9kHt-3_b8BGlx!`i@l>o5}l z8MgW?d`B4_^_{l9w&CvaGnR2}P|6ARUy4VC`)5<4Jd~nWE*=8nUR>w;YAJ_QoWhj9|iRiS7|lGx=*DI zL_K>|Fu|{dJC77ny$HZR3^U?**|;`j;tDN@JVBSHepz|F0B{w$PV0|5_bcZf z_KLg$9EifY*v_Aft-TTO^-u(JImnvWla@06xHZ>il>pg-(*^?p!mtT8OO?>ZNQ_wR zzN)G}0W-s4#vd{?oFT`Gm)y-U0Ta*#p&!o99E)>ir6rVb%p9y3UDxrY!9B=VSl}zX z#zBHD#`du9Xm68QKOZn`&v_}d3xxa9X`xzsI;a5X`K`Tw68GLCz8-fW$te?~KQTJc zpE468QH<-(z<6358Q~|7ET|TxB)ic*d8jw8zYQy%r9@BRU_U~W0poqg8rMr zaRz<{13>}z5fdj!7M;ip`s{xbbe@UrKS6Rh3(W4DnT)b2o$9`!&mD;q4*g}v znA@7}4BN*@Fsr+ZF&dE4ryd?U<4C;jFkg0HE=D4}!D(}n_)I{`@F=AoANs_R_>;ql z*Qno1dGJJq6Z%) z&%bcblET?UK+*L?HH(0k%QBHxvtG(DtTvKmq#dF;#`+Q!?vmpN^`+C2K;G?n~JUkF0d#&YHsbeQdb6 ze~(n=m`LmGW8hk`=9>XFaz>53pQ^bPFscd)OUeM-_@DmiL-=yy9F5Q>kbV=hWLZnU zc;Ms6=`CjnyzRip3DbcSI>Z7cG#a8Y6z!s8rO^e_RZvCx30l?w{G~jO0#iGHAtR2o$ledsc*D@-@*>v9TDqGQd=VdY}=6Y-A$ z?;tvsnedGchoXFnZ~U~eM2$4b3HLIq>?lc8oMKJ_Ee&@>0|tQ=j{)Mq6%*-`7#BST zzyqlFAp$6-1=7bG`i}nuAl3^#T(`deN_Rz;Y(4++S zjq|Fq__N91L3ZQCGC}D~;9@Jf9!QEEDs8~I@|gOP_%xF?z*9q6Ie)YS9asz<9)5Y? zR4A}q@Oa!*82ARZG>2Iqa!9__6`wY4uD{;8>gD{0Tq<+R<1eplZQ26NyYAz{5cpkf zdf1g|hzUenEQF{py#XxfmO@!lVsLT<(bPUU@H4ElE;s(j?v!6a8g$dQ_@< zdi}eJYaC!Tteso?j6*%q_$;noRyNdvQ3~>zr#>;v%r=VN21h4&P+@6WhuNj z05U(z^7cFmhq|#$#7D^(E(xMoW_zfP%Lc z<+xuICfixb-z8{-%J-^*F5M(A9=cBCtW+!7FiB+KZ#GE(79(wn(N{+wXrQE3j9wvg z-*;%e%K1h?VNkkkw*COuI#>V+EcH1qwZPGy4ft+)_JKR7QZp|*tEP+&e*O*$Cn6QF zjV%u}hU=f_^tg_GmJVK|=PhvpeV z6Zl6ouavL;9h$cYO~4<~d{DmOcW6!#8u1^|d|CeR|E4M0RDRVe^Di#enAdW+FU`&b zZpYp`D66}%ixT&XQy=_$s$H7@g{$-w;OhM|y^W%d(gOXnoHdyQQ9MF*;yAA9^6ci}tHoW1F9y(-zTE!(sPSQ%#2gCz=**WG-q*6tNbjaR2Nu7$<=u@-x ziA`e7#=m2l9r=&z>^%k6bpO82yVHRQ-$}vTNcBNtpH|9hSz1DS4{K!;L5gtWqR}MV ztUkG99C$g(i3b&OP75`oS{4t=Bpt zPt*(B1f6oodSRolOuS{gw@)58to0wwSFGXW0nKO6T(N!7e`;JicUT)VE*E1?g3Qfn z0~B8xuUd(f^*r03Yd_=0wX?1S6~Idzr@aN3O4kpfoUGix_Ojy%(Z@@?p73t@l)GRY z7-;#)aY=Mwnb#%n>qdBgOdDqAjJ?i{U3S>HC;j*Nu=cYn~jt#ElI)E?nr- zGJ~Q6cT>e5lSZ*Jw~+UCi=j?WHj0{t5%_W%RqLbk**!#kT#(I*W*PwS}Pn)tn z?bz{_W^Pbqe;sMQLg#!eZG5qlnKP{EUKv)8gyXN19tR4Lw8Bz3vCAH ztDN%_huwBqv==laz7PIi>X3Ki3qx((kkQfJj!|?MX_szGO@pzu@vkVA)9A3jdR+82 zXpTtxn9$LV-WE+wL*t7>A8|v69LJ7pI@>zb0>u8`esHfD!gLM7<1WA{0!QceDv`We^#o*kgMovQF_#_Xp&s zQt?)^g#@&UQ8%brdV=@Cvk-*N0;UoG{brw`*UCu*pfi&|)ZZRos%o_k~oVlS}6 zvOA*|4s~(#T(rzN(lVY{7O^(OBK0VGZ7TK-#D3^WJMv3fxCI<~!;|)#n`xsK4$Btx z#|$0khAv@5&~v9allXAB-8@L*?XUe@4iX>Nul(Kga$KVPUi#R6?eC_Kz=i7XrH|<^ z`CsX+viYMOQ47tVaj`V^WSJK|!_G$CW-|=SqKA%gLl+#!j>9u9TE_PR8+F0P zKk?Q^^R1lukYm6~&z(=&ru}fAYcKqk1_5vayHL%{4HK^^U0dW#~Flc4Omn5OS;$EIr%2 zj*N`#^!aEUZ+o*TLS{cuyO5(LQE~v5tc|5~XiK|&Khm2b!s*$yxm@jwH`6yZHa=e( zA%`-*f-5d}M9DqrD;i26Ld96;M>IZX&gaZcjv^gBYyO?s&)FMF=g+q(8=ozX;^GEq5+y)TGL7Y!f9zi8#S+TnnRB4B1o|y@@{{-d=5RQ_zkYu<*@JHgb_In z#VL=teyIJO;=dB77Lded6G_bb!o{{bFMQQ9o}Bx*|!jlW_elzH?Jv=Z$&)|blfarLK-YOQ&=FC`r(MbzD{i8RCK8&=(({_owo zeN!Kp6u4f?G#GdrhX_wFekSjUuGERFpr@f~wsD4pDe^@qKCzEor#kRnfG0i(A zecE7$Oj6sc8P?7j*ZO0+8wcu|HiUy?_$1?l4F;<=tX^i7&2nhx_G!iX79^ZEuDxY* zT6LXCE5!ocEhrCnXao9WY~hZHjl;4#jByT`tPk#qWQ$C)AdOjbEoR~wNP?R!qk9UM zbJ}o-Wt=R~Dg#+WpLV_j6WA*zt$eIjbFEdURdCu!6L5jFQ4Z~`XS8tt@Rn5;+jeSV zwN4h$zhOwPIp1N`-aaf7+pd~q@^S3~opvGW!f9u{bApq_v_0IXjn>H``egpY+8FbY z#-zP%Tq~*nV4{T6#xeJpatevgX!tgWr?2{Wb?{S*X9T#3j(`}`&0&W$K zGjj$CobPeYZ}7BPA%|vU_ zR=6nbeS`3^|H6Ml39qH#^H1<;ZwH@Wm3~2g$A6WclxHEzqy3%oM30_umq*$sHNUFA zSt17$Lkd;<30Hg3F)(nLg5Y`>tuxLn8a-RI1^JG>?r1-JiTe01uS-IEft9(VXq$e3 z(_erKHhrHqew>L%)7?X*{zqzMLI^LN_AciDr;|mGGs|?^JDnFC*AF^m^S4qTFQHQN zr5DZ(YZG)#C^^(U%?*8zTrZJaFA1$o!u6t}ZIC&OU+0P^A*Lf+$mqiB1x4G&nOkt+ zJoGs^V;vY6*CzZzG?8XUf?T?&*L=fi2-|BVHz-K)H-v>HMRxle=-lGZx#I2ECfuODT84NM z3vbvHbz|qau>w$RzDdzvQkXX2rjcnrC)@@;Bi!6n9&Uw}aVFvqaw?1&XXgJA9S)hJ z{)kRF&fNM(bRFZ&ZGS|k9cOO;Bf1mgOziK`4Gesao~wO>tKIIfzmB>sAuY1C|7_9r z-izD~YUqN#7ZN;aKPz)*J338&ozu5Fu1_AMz9N0lUf^JYi;DV~d$5DpT!Q_>Ks(lv zt(g1BCy0&ku`V6sKS*g_=QP_e-?(Qd2NPD*bL@EWCtUFsvJEDa0R@}`e0N0;bux2{ zwhX7YB!%1Dd0;d{SC4SeFXJKiSUZQpNyUB}>qV~$gre{!1takL!Pe~hd@ zl=fj>jH$3gq(06KJ?c325hf4pL;x0|W8_u_(xUkvWU6}?YUoGEL|s%is;qbvQzIeR z`U^qPCM%g3ae>j>4h1|%`@4gbo4{T$%q*~Ji?*8o1xCj{g5=`P!M-0`Ap5~SW+9n; z9|ZwsLN|quiLS8Mc5(KD$3Cjvi8+6&L?$N2%0N&xzr&d~J6hh=y9vll2jLJ!TBJYD z>3>zEVdf5Or;0Y||4EjQclH0{I7o_gP>932qC}XIV{f!ydX164H(7tBlSyzeOCh`^ zZgFp=_De?&PZDRlcX3R7;x@50&r9!4pa1TpiCH|sKo{7PddwX?(mvVAEbhNz&GlL} zh%?z?X33c=o!Z4;&84b-aH~-h-1_>0NK000#x#-bABt0;W0V}qel$JCiKC1MX*mCc z(OcSa>LuW%JVA8<&^5Dlp|AapSU#`d;p9R?n86l=!99$%+vl>F0TqsaKJ&$INcCL>h(^;^woV4d-JL>asdEpBVIsx|Q}Fs}Xl! zu^R`BN1~|YmtE)3*cMkI+?mAoO#?>Nr~&G9oB5ekd_Z?y>N-dCQpedJw6LknqAqk2 z2jw_&rg2R_8UP=1xT|mLaN-mjz#tbLnmB2p62`5mPsJcOv_0m0fPPK1=5jO?Yc!Xg zP|qnmk;xiHw1A7O(Giv+z{J3URI>)Si_*5U@ocv?`YuP75}DvmB7sc>>&wzq0y`p2 z(2oE6MyUNGw(DOm^Z`+cvx%k}sBjyaC<g54BaNpQg&-U zUZBd1(RG9m+&h#9gc%@cX9`z5yWFVEgr8egqgQ7mWh_bTaSpu)jP>ZAZSEm(iEEECFpxlr9WLoh~M`#kPt# z+OOCc4a5x6MH_->%f!0ghZru4Mz^!}Jt1r5yMX<5qnf(a4(J}%tEQBnBv zLMx%*97S#+u4&uXELoz~?tR4%w%Y|j)xE2)tJmd*(jHQa(auo|SKh}`v(HPSMtq9oJ^dvUsKK>|%l%T|vO&DV-Gx5g!(cZHVHIL{$9 zhBI`Sz;~yuyiYAiiJ=86Oyu`O+R6t;1%M$`2*yuMgIDFy9`YT|#JwP{1Tn`*8>AC4 zFd@0!LB2xV779G^6U;|RQWvJpDnP{&eVRupmJ-1CRYo7JS|OC&>w8ex6g7RTucSy| zxJL_6=#ItO6YFygmFp3{-`BE8E3dvc?ORPuoOV;wytG(tYJoo)oEs)Y$9>O6Yc0{* z1qTlc@-IqoI5oi+U3Ybwy>NQy{2=-;AG{-{F9UC(LE+{t)t*r28XlVBJy)Awd2iaM z8f}<%ano&Sq1x0qx2nRO6MXQVqg}f2u)s1$D;mW`q8CmITi%L>9b(hM=`eTaO^9G* zK?kra1VBn3BKE*!LUh*=AVQKhSZwm-E2eYU_^IGQkJKGd(UY(YC;BZsq}fW*0a9Z$ ztSA$mJ2EDO^sMN|Dl^K3Dv@xZPezc?1{a$7is|?JN(Kam2@PqRG0lnKT*FdQ{ybmH zB~5KJ(*;g_i$l z&_F=4xaPLaM7`)awWw9?jyx(OQbY$wS3jL$6PhSesT842cw7JvgSU{ZF9-~s?yTE2 zCx&wjqN%Lk){Jbv*RWH={6n+CCO7;;qyKfa+BKH;scO9g@n+h-r@)l11k7XiT% zR<`mlU4Yw!jvjD~C;`r)4nUja4jwwMsS;kCGA;-cn<_JEgz1zp<3D~j>bL-OBf-=2 zd?mg@LzTNo|D!pvKgV#46bVE85zR>Uy@n+krb4q8^{vq8*Z5=hCeAI;je3nm@2Rgv z3;?EgCA4qy93BjUP+uMyWcf3vqd<~IfnmFw`6kVYr*aH$PBGu8k*~SeAk(C6(9B1D zbs9bEk54oTo^6i%y6ao0>9a^M&^KtH7OfDHemp2J)a0OW1oa=|mJ`fG#ZisK52R(I zUflxun9J=Dz%!0bW-olu=yR2FCI&OoWdP1)PIPr;kI_c`*dd=jUF9{Cm_vKgyT?aL z43Zw^L#^DMu-ry{)G;z+x;n<4?pN*Ibj<~~G;}acnH81fJ2LRJUuHk*<&^S_qE5a5 z&+0PTr+O0|tnZ0-I(PKs(!q({m9K?ibfDNxD+Ou&*+`|D?~VWQ!o|-}qQyMJwQN+- zD&zGX3C8r{N2Z`-0>eCa6G}8E?#?mjNE0sewFGM5`K7gQeO-WN)2p)908LAkKjwB~ zA%y-3(O5z>)m}FQeU>i{^GB?bWT3%J>q74sH-Yz$M*SWo^z-!wr++Zd#@BWD9~U7* z0hyQD1qRBU;q~<=*c?ML$q**lKdc`~xVP>f>kZ$pU)(IM`)+-$XI_er$Gnt)tj^w8 z-)FgSSY)}e9@0&`59u@bJp!`O$b3Q7`<^*Q$z#4>@9w`=l%74ZsQI zHN?B;KP4|(f0dp?^YsZ&N9#3ped{qA*v^eRs|B12*yW#8aDnuWB6`<2yk-UPX zRPyb-g0LB?0Kx8SEe+8t8}9efSIc5Ub|uzcRr!7uZFGVpHl!kBqc6ZFk>hg{B2&mC zBs*KdbBjc=jk_1Wk{26NZVlNPZSOEAITI7F>R*vPS0m8J$rjsH!0<>+>3F1GU;k$9 z(@bL$Uaw@8e_bC-ZA>)!pEmORjJx+F8l|B|dWRm$oWTS%#b`m5C9?$jN-3w>2!9zU z-c>&%N)sC(Y)OhcoVU#?G)Vck~+2&0pneo3`S&g7G>-Bmk)|iVqg!_1eg3VN3K|)*KBY@d)FO_G z16~qvPoOMq3V=$no=azF><#Gty^Y?0YDkw>{pi}=uh(Ba5Pz=I#5hdSL0@a9&j@>o zqu7Yxx%);V6yXK&$G8B-Y;z_HcswpZ3Ur}#DJdCZNthvPC*qNUd?W7iFl#*H)bQYX zo6o+Y-9H*ulVRu{yM_ly+)6y$G4Awr_pgT&RE#EW8V`-QI9P~qY>FFR&W-W-X%_8= zD76qu0C=jj-asyHD&Q#>=2;fz9Tt#ZUoE#$Hw2v_-i5w>jUrt{Kxfanu-ElHGTLuQ z#IsTKOuSS3cJ_R&3ZI1(hi8WU32%o4JT*BhTuts%JhISzWFav;F9mf;)M@hm=tO7Fb-+fLy%0UJn&*BkKgmZS<4f>QA)FsL z%g~pFy1HNGp8zN%;oz7%_1&OgcNu+Aed8#G8Pe5Lv@dr?ZdHFt`&u)1S$x)83zwPZ z2u+#0_q}WbW}m{BWdnyO(mI%b>6M;!mbtdBb#h%ZWtm*3GV_{x?~NJBO}n;^3ly>^ z)OW&nR->FL9)%5ssL?WOH6ylXCeK&J?9qpIEGN*Gf zkDOSpJc%c!xD(3{!foTozn8-y8-K*BkINW$;VCQk~jG@eUv#048dXZ*dR^jANef|L^?rJ4s-Jr68`+QNzU}d;q5nA zn|ZNX0PA_h!fqAB{NsE#`8);)S5tD>8JA&GmdS@l`$!tRA)81Ngq#Y0BDdGbGcGi< zU(@&G5i0-Q_1|s$#=6$V+@G7-Mj3rMMIdToqpZim^S_b;UGbEA66Pq;_n86{CD`{4 zz91DQHxcdEbq+XN2w}OkQX&)O{d_ybBY|WWUXv8Kt0L{_E<^t1|CM>|y4FYjIP)QC z*XO_xCExdP7qWNf1dJ`>!*bXx?=w#e%cXDiw@CBtW!@q`1$c*^DFoHcA9HE%|ef*4t(_YMEkJ1sr{vSnlQ9Sl&ctpIAJsMr0z6?g} zQB8#Ldz#xD>(3rlM-*OUk3JYtJ_0Y*u**AI9#KEQn)lH5sK~ubdfB57!CwpF&HZ6f zQIQ9N|G9Tb9BY1yzD|C$?p-2b%`egey(SN_#oIuiTYe&HLOJn=^S&u zRJtRB^TJdmxyWPQ$;1e~ehV4v`I>u4D>-Cdk{lOvE(Zfg-u<=v%`?lZFhi5|!n~vD zq6-|%?QRM9M>4h%-xI)G%QH;mbzIAf^r3wY`>+R6c(n25KY7GkGGAisl$v>)4%|{K*LPApy-j+U zUmY`Y4d%fI!UZguRzu5(A^q1vb zH}j=^PT2E~`&g%1ZJ@1l70+%o?9ZcpP3Ac}tG%sio>k4?V*I6z{-GjQ(}ut0p+!CQ z)L%7O?92;!dlMu~LmuQ(6U7^97T4A1*7T`no)VP|vb= zfHB+2O3hc%Yzuv{zPsCle#f#mZ+?RB7OUBOm8?G3Zng*XAS?4QZT6%XIPx?Y@;Dz} zMnBJ>CxITd;V@CEk7!zHkh;5+VX=q{)Lgi}?IKNgcQ3omi2%&?C_nkzEcX+N`{@ zS$USMyyH}#^-YrQ+$_T7Egr;WtC?`jhfi={&uU)6?|gamqgMCAJmT;y)FT;uk;_HD z2FI)DDyz6pzx2?2C}|9NjlZKEU(k-Z3rU`8q>HI zuV89U`17&xN$&G993tG2ZPR)5>Wf7PtUu>(Nnw0>7aRKBUD$G7l1Ni-ccT9kW*8f zE02^dUoB`;lG5D~CO4+l$8bl}^a(xs#UYl6cxr zav|BMl6l&JT>RIWy>$1w>%Cl%_I<83pO^MsuIgT%yT9`LT%?8zJnhh=6olHV-gWW9 zLejp;J@CR7wM^TcySpF4yh+4UcIB3QkXsNe>8a)fyq|(OZ{DZDSlyF(ToO;j=Vi=s zA^y{PT7*K-L8=ub)BL3ZhJJ1mp=K>rwy%S6Cw18BpqV zSH@l%X-8rNI>r}fj5_ni19uXeKg(@vp;$-Q_%AmkuWfxTw=X#Mxc5QtGfEQK?9wK# zZ9R|+v#d+LMOwt!9BPIF?X3@TDF12J{zx!< zLK^vtE{k9-`j> z3lZKCK}sSVzeA^7mYXi%Nj^N1S(2XQ8DsL-T%u4H8Q37of5T&!g?6?7jlgS{JV%l1h%^6(oFE=bzh!($@)dj~&&~ zJgZrI;5n+Qf_GmCo}xz)k&i&vZr**_o~PBknWR8OqvvTgZ$}^*5!XFWtNG6eh<5XG z2??H7^TP;qJ%YeC1gak4-FLzBw3;^{kc@~Wp67xK2PBlJ$3^c+8^{4TaNSoqqBCgT zx^p=qfbVKU%MG$Twb=2Qui{B>2?D&2@!_QsrHnOMvam<7LVsW<{Tq2fQX%zLG;mS-u4> z?2>p@J(Cgg@Pa!=SE`w=9N1{BRAD+|X8k35W(0^3`yE&ZGg~dKBe8mfQ zDxb`8lPg#9C{YYOX_xkuY5MASQRXCh~Fs(QT?xyhEnge;9-jP<619=(GO*vJUN&LnfY>n{L=2Ts9 z(cx+9a;iqjGdrj19C>EtRDDUF`8id%{0vXi_Ov1d;qQx7aINb= zxEum2n3DFGq|%z#kk;_5;pFf#`97ZE*cvi`{sc(PFr;c4r8*hP(GjNE?PrjC!h_P^aPAM%lI=OT^NkV@V2Ne2RMA}0c* zvT`St+>WDu&+GT5Vn_ZtH9*WanH?sC$=|ymf8xJe28PdiW0arq`}iewyc`(F*Hp*U zt+594VgqCISGiDA-}`-?uSw-gUFJ8P`*baD2;19XRX=RzC7zOYnxzM4LnYpJ@3q9`5z8&3l!)v*!2myOygupaY~ zCtg%j9p>!xpjcH<9POPF6DCN}syf0h3HmyM9Uo2{gh^J@6<2voGqZnof{l9IE?;)B zTRY0M3632Z@S+W0p=JYVyB#pRp;uV%~j_4j~_{%q>N0Z&9&4Rghb@`Ph|q_CfdI zq)|w(Ni{BSF|MxLn2l|l4NjgWeCTcT!LZj*7&6ii%wt*~Os9BZl;qEH^5JlkSU)<* z_a{Gj!QnN{+Hqf}nMlVYPJBl9SvztOZaPG@re%A=`JYj&moNQnYfAR~zf<^6NCzp0 zm+wMfP+B`4A`yo{{E+**YwD-)30gadC@6m$Uy%EKH3DwVMg;D|tC79H%KqrY0y@lZ z=yfvX$h}=#EaW+Mf&8E2mPN?dI`UVFUIybn@{PNBeM|E4e98Han;BG6%&rGp!?RIW zCOlixM0>t&`3oqix4WDRz^lmt+NpU%{x9mVd!pz?5}!O@`ZZ6<@>@tl9CR zsl!Xe9q3(%R5gdD8pc7<_tOg;9gzP>xth+Ca(O1*{BDYfQtrv7eX58f^4%|VP3JsxZ)D-q-~{C4{qyn~t($rQP4Xo< zd_L)pmyd%Qm~~lSU^~0B0#!Xo=J(uT#%`{zITBs zPU)ty&zK^SlRz$*;>3ej^^*%Cgy@`S-O%EQ7!tta_NK85;Lif z_VG;>+5h;>O`4|Z1^Ps(ZP6wreWJKcinK-0Bz;Psuq_Y@D=Vd>6n0%LqM(b~8?>Z= zyHH#xh`UK85RfXVhy_JS#cl=aQd9(lkAUVQqO8;h7Lk(g`^-%Nf8W>l_fK-~otbma zoH=vm%$YMY9ZKC+J~mzfdi`$)VizkDGcoWwIod zdE$c@oJf)X`vz%7+og+aknlb*6Lx^j#p6(CYw5515hvm9zgh57$Qfm(fP%P3>F^Du zKVWu7_{wIQYx(m&K~Svf-yhl`FVWjJ1um)2V8HLvcPQYnW@8W3BnCXNztc?G+m>fu z!@lc(H&gT8R6DbN?D+~YcV@aA(P&XEINbVfal%af%Tw)h$92fvSp{PD%>L||zVS1? z<7alrTX@@pcV?c+{4VoXq=pu-u@!!uKTX|FOCk;hG!g#oZ2d+ziw`0B$rMb={0>5ycS2*mxQIDqID+l<(ZxjmPesio615JDW9!QkwjSTG}IxcT7a4qC;s{f?!vX|Vfl z-lHe^yj!ZbZA7Ayd1_f3Y0lKJaTsmbsg>!fPU2y8ylq1~{+lp*x6+Lt-8(4z40xc3}1_{W=% ztfa*!s&B5jEIYHHc-<-eyEXVmwx-`;{;stD?V2tga~{~2F_drpx50LL1cW~Gwz{w;{de@zz5 z@V9Sa>vBh~1<^iyvMjs)l~=&SVEPN+!qAhRZGSu|8RkDHz?ZFrM{|Nkrhl#4^p_fl za++KihCgj>g67p~ArS^ToBZq?)Gw|fgFL9zE)7;S)_51y2#N3)u`IUl25VofZZ8VH zy){V2JE=rl3g1a5x}n=J#b~~5{FzB(zU$7Z#Hy5hDT6leoUIyyjeajklskct{u~BnBNi zA(|J|n>V#Pm)dLDL_&~DP8^}YQEOdkovo5ylc3pp!|RCxwcMKWtJpL?M~AAwicE*lMqLOd708+;2*<# zM?w%Ni@TWjM%NIAV%|9sQ>Yco^>IeGeY(OCsBanKds% zP8jejPGTdUuH<6pu5WJ$5kT^*Sc;PWwyYPSsqVMPcyO!lupU_ zf$#?=4b%WS5<2l4v93F5VVBXgadL68O*Vfg{NE5La_0bF{68H=nw+^zZq zWd9dj+nS;Jd^J>`FR}HmZ&*;YZO;rs%q4BB+de4qVAY_jn=soh^5P+CeR{q(z*uV} z{EyzOo9(LXR^8lrL1gYTGR;3{2+;e~P?^ znBGY)No;|o*E?k1cA`LchfI8xD5&};{FIkxhAwi-o@6F^4wtE>3>V_zBn4;aIc;>~ zh8e}tTRw;$!(T7ubL#u~hfPZ{>i*$N$KXe7!#;U+>FY#Z0~q^F8Z= zuA|X`he3Bf6{xxeTX*UvY}?7-!e&#Vg+bW5cZ0Cq`)`*qUCkirP9|G^yCh>e+n`i4 z-9cXYENkTNqCqRHKdU{%tbXH&!idPdt2W^>3AlA6T2Ro048>(ruM#yD!^cpR=O% zvg^Fn=9an6S^ZmZ&nmM+x-mm?M!=%?$Er1A)sY?E&#mwhv|wZH=*zZAVX+rE?`Kx$ zA^3r8f04ns=DeR!h7~gLL+TL}-(z=vpXv$4ylY!)#OTXnpVgz%?J>t5y3qss#CzD9 zxO$aKoKBs4l_)I0dbCHC8m}mGfCYg12Og^|j21DOAR+?uJ?rdncemLWXYDsu1(ycv zXkvk(WUuwyUaM=b6-$F~U5ts*{HszJ=G|k3wkD&cmE_93cyKc=zabIxKL{?` z?jQ7D2HW5cxo@xt%b+yIQ-g*oydG<}v$EZnB#tFA1%<&mvf7taim1%s*#0YS*uxdT z$nH0UmK8k6r@nZGq~fQ5_%n6-+EyzTHs@?jk`^}od(6HI)B7VC^>9gv*+jm6jdh^K zx?k;DX}u&z1zb$9;$lqeE1{yj&r>C&MFLyOVB_;tk5Fb;`sWXhQ?K4f?^3$|fkBp_ zGYkq$;c+*-|C#QJq-7qRMdnJImRTkY%Ov=^#zdwQ{p;g}@Cugsv&3aL8XvLt4HqtT zC_0@Z%uFS^KTkBLLK@`l3W2IthhQ7#1=isyTzc9cCGMl@zM$?;Z$&FmxN(;vnZ;U_oRousebi8tu?^+8H%fU-w~ z7}L(bhjYX#WCq{U7`L z>0L0e#$4jhuy*P{u#)kZDS+@Y;SQuHDX zir=x(WXJuywKQ_+KDj?=N-Z$qnj;CAt@A|eHp~!6g8l!xNOs{edR!#)9-1yayB|Ms zWM44H(ThED4!)jc?LL}4`o{)($h4;-I;#waK|>vn!Hex9)RSP^cAh|B9R-1XWp^Uv z@=5W|>Grvk5pRcJJ4d5dqfEt$hJ_Q~Bymq`bkuq~rZ-_@#TZRe#`z%Rg|e>N0|?%R z6N?e|vW)2b6M|vJaJJ3&$wpUIB%azGAn;(D! z(|T;Uz~Ts`HS+pF<#_U4v2t%-G<`G8xiG1C(|qv{l^_qACw5;5j6c}dQXcoVi?wH` z&EGUldiB41Q3&5F`@wnnyvuk-(HAZmo#EdEW!>L5c%rs@U8wMn3~YbB6zpv}hO!MYV?+w}^-(4pvlz~-f7}lf@$-IW?-M(c(yIwWegJbpyV#Oe%-fcG1 zTRFkEJqA@Wj{xM-`Qu;{fzaJ8^F~h>a1}Xa`RO|QcOSnlUXxs9jLPL`|4B&q+ws8s zA2)7DHFk?9B;2;}gdo6l8SWWT{x~GxX|kdp@Jw+0&jjVjpCVIU3Mk?1`Zk!&t)nl{ zOCqPaI;GutjVy1Hu=GZ80yQxe&wwL`jVHE|e0@A=Xn#77ITs#u>Ab#s8k%(58@coy zmz2?5tP;=eU4y|`9DlCtRxA!~En|)!-JLiEgk^&|5)%j){BM%KGf^_V+=KDB4^(q( zitnjvkd%vPU;O2H^~a|Pe?I0E9(+|&U$$>YTW5uecM#`biyxiVqTj0_YVJ4F^$q@GgX^xD^HIG}vCXdd*SrFDZeqe@Yy_^)3Fijs+*Y9TB|J@Jx#Plcoh2o!esauhDmY-@va7i3o9)%x4RCBo>rT z!&t0Y+OoY5FNUtL5x1W9-QPT+tr!n*AJ3U(Zz)?enGyV zQHXwYUXl)@uWCay-(1CQaP!TTT(ORSbViaP$}l$y*FYq0%xzrY+9+<$ z#>k7?Xk)Y1uiIGFCMGKBf$ob~y9j4yE;*K1m$fAS(ed_G+N|{l);tojsa^>0;OEq8 zTJ#C^y7R_4Yktbg`ss{(e^}!G2$>yxYpud>`-a8T>dqS5OjsOxfKuRb;Qh~jWHktGHSpOO03GbX;KVe~vWwiYndJp#CX=7Whkl7W6wWY@ghdjBCS~z1D zzI{T~D++hxSah}Sk-@gwgzU178*87cFHYW(TNV4ILJ+zdI|SRJ!G^VeoJDBdpBXEQ z4me!K`$I~zyL*4cZ7#yQl}CR%aNsB50Yo065&ZQGt^X4vZXg+cqOtqK!F%7pdW~)Y zR0+uW*f{!fO;yqB@IBRX`>{|oK5Ny1bd5GLu}_h%e>t=wR2zBc|HjeorpDP-$Dik_ zHz?aRf^+(T6d!IkTtY=8a7LfG3|*9pd5-p*Vnug;Y8V2f3;a0RSh)DQ%`c!+sPfFEi&5+Mu%*!MrfLz+*Fi&Ro~Q`-1KGg83m%f zL*1*4-J?P;@!?0#C=j;KJ~bQ3`hZc3bpP|HJ>*Z2BO=~RMjHe)FKRn4Ok%$0JlyDh zmhOq4TW6^5HO#dc=GG%@U;Ko!w$Gj4?%HXX+hCZxz%X~=j&|LbrdAhcKPEHGeWbPe zJU|&NJqEL2Fqa$54;#!+8_fSOn7=TXFBmLg21_ZVAGl53Q;`!(A^2@VjPiR^t!X?n zv)#Q>o1caaycJo1rPE5Zr z@6>X!vp8`RtG{+WJ#S#ouH8G@{ijV}$c}b*<8>6Fy17r=P4}Fu`voWA8}+_7vSiA#mWX}PnNCNJ<^`c;S~5yj^4N~736;F=!61T zYnXs_Ql!1jJ(>y#a^05EhMTmwYNy(M4${B&A!;W_Nm5!8{?ki_>LJdW+RAKcgnYPW zP8Db1mA0a^HgN8x0&<~Es-{i#gv8FmF}G(Fs|GG9uqi}=#TM}a;+-c%oI?K%2xnWk zu(;LW!RkyOmO0Y(VhJVW>V=qx`K)>C=4372EO(As2VJ?^zF&=kOlE;2c3r>|k~0}% zk8KXTIGKvo$NTk$sVs~pE!wDMR7Yd>d-UT2eTt*U>kfNM^rD_}TJ)>8tX|0g-c9eq zu&kcC{k$inhr-N=*BMhi{IVZbFBH=$U5cMZy)Hm947uuNi>-UonpvTkge*IpHU2kfZmnD6j3%rG12>+L4-BxBDkRYEpAJHm1X0$ZjWdOST@of8*}|D{o*<`19v z)S^%>A)7w)U?l!?ql8h9W>aJ5MZvxp!vUn&L-6p)pyaT*2KUyj^dG~KzVc%}g`t+$ z@2g(r^I&U_|Jwlel_B3!e&xJHMI3qv3`#CfqwlOP>-Wf4`Gm0u7}j@G4+Uo#+PRz% zvP|--HQOlY^SPc&bPu^OQs9lcX81>1$hLO1w#IBo`8_(<#+0n!S;_^(MLo z+Gnfkf1w<{ELs-XMKevU5y$SQj~%yU^M%h>A0r;z*-$co-T7T zKH3+^)*5b+vpQE;iJ(brAXQfV{I-X8Wszy|AkP&kQ>@ zOo(fO=u@j*Y1QP0`q*|kN|V62VCF!F52Cg^~x)TUZi9Ho2gnJZ+2QG#0`aG#Ge6L>omNG5XYkscU{I&RH6)vUX5= zZI8o`fgkEUx_<@?DI9{0@zu_gB*tEq$9^eaq>;yNP;@BW58?Dhf_-Lq-|+pzm+Hk& z3A97MVuLK4dTX%IgZg%+Rpy%Eu2-Gho zn7G7yk?zluCElA@>du1iC~>0he)=nQ-#6rA9VgfCsq)BIuM|I`lGq$AU)?Q??cl}3 z^uAqwL@nuBz(ZcIly}R`yypdh3`B9`?YWUxe7Q>hHu0v-A}DYofPQ(EMQ(kO6XL~>$VIVT zuK!C_uH5>DywgR4{6OHkTHHn{@b^Af1%Gdy$+x+(|6o~gbMx0^{Gg9Gs$7n$V=iN# zT-Ot&pLaWqiv(kR5XNJGVSC8rTUFWr#t@9-K^RM_TuT9?s88s|!xBf-p`$N^4@OI}M zzd15?lU)3BkiIgaZ@S4>SJ}U6h`!f?^gU4Jss??(?~{vF#CMoW=YzJ6xVcQ)S=ai? zg^g)z^Q$&W`-fcX%XD7{^K{5JM~n6{6m;-?YDX@4yzvsW4NS7RwTjwbORH<;Fm#?I z5wR$%eUtESuDz>5R^q}%3Z?zR-zsF6WPS2-tX7;{`-}IaucZH%bAH!7$7f+JfHG_D z!f&oJC#F~&PRJ(x^mNF!EeQ#wa1y;kAD&jnP8>Y3_JZrG7q*W=_m6vWK~HWrtjN%_ za?mql)E=xliw{y}1o#g1At}7p_M>!=gCtYl2$D115Ae&Y^osAF{u$FD<61F5;wPmbbn>vC@4;xudHsub9e-ce=^RG_|2q?w z7qhbFux)Cf=D&d*I@l;7i1DC4L7R>7Roc0RciTwWc7t6@eZ`&@3b4m7a=I9q!_c(j zfJ3`t;+M;=4Ye0Ho5#hKQBjrdB$({$H{sg7b_+J)7hMasxA#zG2VcR~A~aG6G4{W$ zKP7YSS}e^?rcz`Td$cJbOysoq`VKnCLE>!(zq(s|o8(gLs-yz}s3Ab3ou_jpnwsX> z%_E3|bGeqN{VH3sDX8m^zT|=$+5&TpZ;3Umf>K#by`>2O{7Y4HXupwJN1DT28)|kA z%Nf7GjKW_jEWGs-cu3rdCIdgh{CblyJIP=k;iS2_KhY#aDPuT{DJ+&`nApp3D8!=@ zF54X@09o{U)1w7RX7h-L)gAnjuMoQ0C;!|l?x#GM?rN+>wq#R=CD3KuHA zN@a6)3&!^k2;rsM#7F2IV8XMF#(5wqFX~BNiBo58=htutzxt{pDknEwh#n`0gj^`X z;-DnTx=V-)hDH(yrd!Q1vJ0b!okPq;G2<`=~!?DZR5Tcu&yNaz`8y) z7-6b~i*d zUk6cc`i1sji74Hn?kMaz}X5TgzHl6#Tk^hS`KC}@yjgH)yU?T zl|&)*?3!`EnyUM&Q7a$OAx}!0r_CRMNU`X2%&BbGj5yOn5>r55GEb4!L-Wj56%~_R0O%NENXe2F@Rd3lTd@ki=vPx~`>!={QG-r1I>w;kJW- z@hZVMGz3G9z48RZiysMw>n02nXPpWwjczv+M#j#A9pL}cSh|o-E5W+hY;|n>jYVjQ z`MReOw+8pyj&0osW#G}0?6_@jj1(^tAa=CLIinJ$_fj6~+2R@c3Z=vN-XRBrQ{(yO zL~hBK;b3YV+&U!tobHU#;FQJ22dG6(8@XsBH_L@{VSuQQy28Ri$m5cESrtHSJ7t8Z zDt2rU`xr{-cK0bGOOIvgCyYC`pr@2_MHd1Vz6bM83y+!ClDZg-5ANgCw5%yE19I~h zfm}6BTd2KY-)xJHq7LyUK@R4_)_&5!Xe-QdszQatZ?UD+U>ffKPWq00*RLco$r(lP zj}mpXw0tpeWFqK)jmZ!2OLB8$Dw1~M8=-kAh(?mMuLEE)93B#{c>iJJX|)g)yPSic zG%I5rrbpD)=rmA4r?a7iur-+HglIvX^vd#aYUJU&zGo>)(yk;Xfdm!lH~VY+*a zvnk3+*JFfxPzWo&=XdBKFYrtJ3XDNJ&udqyE_+jtya0!5bo z0w2T^+9hvwavKs7om&p<@Q8W8#iW$MZn35f62>9=_Ys^oVi+7K#EEIGJQvItxGf)g zlK(B^w(&~xdw}tz25b{%^9co|(*+gwp4tngZ)vmn4$KBir;9HW^0|dv?2hXsOJ8Bz zHHRx|aTG-jUxYY}8oq~)5Fj~0t9BZJBK#0*=&M6=Q2Zv2f2jzWt@3_91$EyZfW~^= zxNUb#<&HY2GbpiKx$)3}(l;Q)TY@^m`_&ZJS5y33>6Ku+&Q0;J45o=+Ou-~N1$%k- zuE>jObqcr^5|^FQ4Y^4_F^6g<|8>Kc)V&~1&a?Ym3OD^iK|FbP*qra~i@moLP%Yyj*_r@fYP{ zYmk7y5dr@&`c_o*zdl63u^<7frnp)d0srWeySb?L$k^sE67_0lnE!_W)-ihS?!~?--8UhV)kjt$o6gUK!0wV)Etz6^a>|NLMdIUx(77_HBc!Df0TH?l=zAC_ z`A8NNF~6e!Z-k!a{hbne*Po`~)F>XCYMh?F5ckzc_37pD?-F=xtl zm9*>JjFAg6>%Sf_8Kx}z6>c!`JIbQZnvyHuJoUS3&D~QR*`DMxd>}uoPV}`7Kv$96x9X1kTAVWn3_Ke za2sPv!mz!B>I?^8)#(cGRmX|zDShp!3QO2KyBo$kVsh3GYZ#NdUX`Xe(%KT%BjYMm zH0-oQ<;JX*r{m}z@mlfi@Sm4zf)FlWknj%~;ktzq;k(QGPZ#eGdst0QqySkv=*tHy zTn8)Y;JRbZ=MaA2KO70CIdiLvjRbF;LdkYG-s>@Z;qL~@_Bq*bfwx>_2>yCsn6<6L4!}g#Ar#?dg-$W+lC!3uto_!t4tmB+qu70X`! zLxCcA*SJyHLuCQ${ zDVVL1pv7O=Mr0tXm-6qD^1qdvxpqc{py~({+Mlq8_p0AY9G&36thsDQyHowd%J8)9 zsR`lI7b-sba#Pac9t74wE&Nv3 z6$T7r1@v{k(U(x(pIvjMW%PYi)__;%iA&PE_!DPG;`-$av0UsQ`L4;S*@j+)oE-A0z z5NVm1LZ%wAN*pLI3eM@oO;q_I{=o;jp5A>gl=bf^5>E{kknA@M=;E_Q5(=V2Tt#_z zF4|$}Q@T!?R)xIC+A@e#+`_2rvd*Q{K=xffpEu|mA<523Lc!+J}F zaNEP7aDHJ4%l2mIIJFg^M;ebz6ehYAk+u;=_i!T^VpV03GY^gET!Cm@TQSUgnr(Q*W>y2FjWNoD=>ih{P<9hI@EjK1HM_0Je8^Hi|R>~dFKIqW-^itM|Ekyz6JzOh4Pr!jmA zqc5qf-!fG8kHNB2%3V`|538rT`H?+7vOjEhM@S70p6jQSL&&sp>NwW+kg76zHH6Td z+WLmVHYNgNi>bI=UtAu0O)k*t9Bh4Y7@!>WNi%>{#u*`vA05>g+LE z-=iz-np0)=UT3;0VaF;Q6#n1MpJ@7VW=aH(JymnGaK$nq2R`?p%Tk|>HQdl7WGh8mBJwA;RcX-jnitE?=0_TGdxd! z%Y~8}y`Y*L=KWJyW$wD19KKo0r7Rz{a;nfgV?spJa|eX@YA4q;Yh5K)`x-)zVQKDe zu5Z}U{YjF?UW_D|kicn>K;66d`;?{qcNYc+$f}?OTFYG4vSaP}7$B1(1$FZjE@A80 zS&=)Y;}rPn4^Hfxj@@-fK22~utS)ZjaiIA8xBlm0dBTL|&jSz31r=OLXCI5KDkz&c z|0wMbEt#-iS?u9^CXls0oH3-6h?uwnH?yyVFQVn~7F)~omO^{sn3jHn%A$fnRBn*{J^DJ&kLtmw@E&cI4=bRJG?J_z}Z7f(?6 z?IG5MKQZ;(rBD2>-KQ0|6Lsm0T4$5CDh5<)o%28>?v^JqwWbVrIf$}8b){F|xrIE+ zyXkf1&oH#)woo|*7{h)P!q32N@8btUI>PfJOEh_~=w|9?HctA{eKq@GKB07+dfOY( z=$&_x%wl%FX`H$!4*iMKpD#TTc|mhkzhBX(gb&R9bGGYzDQwW6#HXn4sk>F=lY5(} z)SoVO$Wv4qrsJixpOv~kE1j%ZT{Br3-nM4qI_Si<$JVU*yLBV&b2lU>WQ`wh{g_<_ z0=-Ewp}l7{eWjQJ$EI<%C2Dv0dGT;*tmlUKA)zV4Obhume=lHmx%hr5Tww6b*p>y{ zHv%|~Ry}Z_)O(=R~9)BRXZ?cm+|QLHbUxJhAxDm6V)+*3-{ zR$3ar>?)mA|2LfC&dOad<3c)ZSCj|abVh8iW;k67O1%q8F`pFKLPhAs3~2>Jv%S>2 zwNzUx8`y#)E8p|sw-#sQUc$Zy_h5w9#r!+s0tu6YZqNhR=XZK0NPRh4?H z7<}f*C;02A>YBBs-oG;VYXQH@xB52t|Gf!+RcUKSV5Jt-0ec-h!guiBg0+ukI5?TE zcIB0N^BDa52`s_?3xoe;srLy6|1W^w<6C?i{DGVBA1_V(#i8=3aJ+Mr5yv~Hrc+o- z%MP)zlwq~I$Xq3aML!0-3u(!!?bI$ugtwt|*T#sZ78(>=PBk-M6Y3gU>WyWzBo5J1 z!)URVdZ#j4W`mZ~zN%Za_%Ga~rMeUo6o(3Rb*O|AHZyTV1>EJxzsz6;V1--Pkp(!aJbLk#F2L!j%9mq;$U384aZj{-me%A=Ex7dm?oyM zdW@0u>O+DDE$5eeJe>1ImIu zNBlsd49g+G{{m^DVr(JvZ^TN_f{Y zykbe~>(Aa&61P=$rGyk)A0(W2mw4}HIL8m+e3aq*bBXtlgj4H$all^UTW|}f|Ft2U zd+K7ShAKp|mU!osq(^F zW{lC7O;aQqDyW41{t`!aeXgqMTY1w93VWTLTqMPm(wR)B5cquo7Jmtx7cJh47Sbh` zX(Xq9p2=`#lz3AaPBU!D}1huNYO5c+H_|yQzzJK9-t6cM!Csqa$4j=)+4$sAgt4 zBJ^P;S=xvuJJY^1F%+a`P$y`~qg5G~jOAP4bVRrU7U#`;3&zQ@wHCa_eCEFvQu_`J zmZbUGu5!F_P10Iirh|bLAM9xnYrnUk#qhl;$*Yvs>rlUcSiJvW_1iL3zq9n9`5%k- za|@H7?+5;C@twqTu&?-64%Kf@evJ4j%l*B@d(=YmbD87^Es~O~P03D4i5_A5h}JjU zZ{p4_CbRwzXyx^7b|?*}`ykMRQ4g*@X^j%}JZ14d#pr30=t&dbVHoyVyl)Xb1IH~| zSG4cV+vpL4?bn_ZT9@d5mhg?Li+8&Nf~6@N*2LyI+d80!3q$uD!{=_H6LZjMb!~xh za<+U(JgngxqUPL_v^m-Iu0{W@#aI}TH6bFaAW4wt#3YI@5gFd~7GIYI;=1eGB={qB zPf4izaK+Dlr8re0nQtD;i8Cyib*wC~D6BEE{tk<;!{X|&bh^sLSIvM!Ym|!uv8AvB z-4Dv`TE0UbdVw#}aJt0-hqgnWdV%k`i}SBwFQf2sC+BVpI1C-~SVySe8E}~Kv@}%b z4RlolmhHWOqZ(g&l~`C`*0uIUOVe`^8``4QHd$P)7Bs&j46;M=MAGL_tbKt*VeKb{ z!LeA8kUc4;7za-DQ8OJ5xElj-^l`f804>pQ9KyVmxLe5P4D{d+eDemB=K`F+H_-DX z$)CuJ-*yUYtZ3HS;Xq2}}fPAp#%!#@`YFH+E^du+Z+h zSnU0loTHb?!5?}tT^z?sj)^7~YvLn)?GM(_)qVEV2q)?xs?%XyL2UXyF_ zsu{gGKzrV&x{Y3IkluHTz3&md2Z>&@lPf-zA##l58^zvVi$QW4%6{qlrC1`FeBjlL zW?J*shY-y)e9MD0`(Kx6hOO)<0nHd^Z?Lrvo*D{kht@^Bc!9oXVl3V-2|=Vq+b;Od z-G-o?5RAT@w^o0tI8jA|bxUo!h=`_{F7X>y_H?nsP@fwrspA#{QScQdv}@(wKykM( z&aa8Wq0alnKKknYu-JF47z=;lXVgNxzX;$%ig3q|H`e}(_yNmtp!lknl6?ck=%&!S z`uB@1`LWOO;(mtkQn9y-h`m^>b#?pp6raJJL2SG*W4w^lcu}>?wCy}!byuP3y<#wh z28eg5D6WeXR!xc*&(h2Ge2h|i=_xlK$DPOKU++Ir>^gxKKujpkBR~`^>HL|+-kHTT zhCD=BY212=9yA+^z3Yof2YpnmZO`<*Sj@&PHh;*AsCMy1*Z^aG|N50N^&~#y1DLJP zh?n99{6+HFYSYGIHmo=vT$VHq zi9-!qs5}L-h>z2gx3So_11up9gTGl3boMFLBemF@%IYzWvQa%2(1XTR?48Hz@ekDF z@4mTGJs3a7fuBm^C)FU0A`Vw$1CTD8ZZzY>7mJyFh$F~c%Gk#TO*W}M^9ZW=Lh-U6 zs0u1ve7Hs%(Lp}Hbd~rAO6-u6UyA01H7Eku;tcw{RxEbei;?e^e(K=GDoP5@|3p)< z;r(ftLS$nK0h?%IF6E8}8Bkz&Y>C!iFTzYMBiljSDsok8q@4$BlMjuH`eJxYQPeeU zQ!Bu1L}y06wz&3JgSO>H;&5A>Yfdrl+N&&xgvDu;tk5{|e~VasG3)Fy-Cx{fk0@@7 zGL0=>JDJg}2$G;MRTmqxrRf~S-%ThsIwG1RI@p|&=qP2ZbF`^k!wc={G1~N4b|q7i z!=6@xGeDaWyHYfVqd~7HDOarID#>K{+|M-$l|lrk(C8a zxM`_*>3ER8A#z}3u@DwMW&v7g8SrWr$u_AXF2+C$w^D2c#SYP8n=U{S)kL3 z3-}H&q=6!HyMI7d?2{Fj$RypNlSj~s47#fL7Rz&`Nc&36z<-N;H;RUIx}O7GGMs+?fA*cT?ZegIl0=n-?WCQ*prilDSMPCLI3W`1o z^wym{8F^~8M^$@|38GS?o->_#=1eudY%lo#emPMT{6f+>Q++|z6^#ea@Ljuh8-E{p zc}GO06wW^!rT=|1@2)oqRzDo`#JXH(4_%=OzDF*81^;5UOBM2$hY}syV$;#P*<%eIy*OV;q;o2#6varh<_pw+vN|dzl#^m ztgMK#(*|BB^8K}l)I3wKU!trG?qgv!ZZ-%JAEu1kl?`%x3TM446UVcHj}`gstnttR z&LYr@2?`DF!BP*gQuPgTM}4g4dbk^hs+Ng%s!EM~yR~6@to2uT_s)@nYRdmEJh!bmwo}ivf;b(}4Zo(gP3w}hASM&dXp9uIo!JqpZ_&7qC zPP8Hnzf$FxPi&7iMZ8FF-i#uxD{)|Ak#8cJ=2AFB14f0rZ-gE5F4CI#kIhHtNfFXr z8w$M}3dNVHTlz$J)|8t?%m5KZzQhrrY&mqiV|5Hd}_MAh7sn4i}5|g6n0Nx978pd@hR2?Di z^MOu<(i4px2d2To1L!?tI{C2nWI1AtJ9)Jy-;EQtRn7a5E3_lT{{{X-n#m~!VMz)3 zgR8R8TS;}bO0-N8*U^LKSmD6MLf^NA2A3MH7M%Q=hXY(>?zcvWt0>*znwTdW_`DDs zfYrY9h5LD>lR%263lFqnL~Ej8uMpiAfrXej9H@?*J0`+(ywH<8t01*LvQr_qodFp# zPqhDZpr=2;bt)9L)A+(Sv$^UXZMxXVIN~kTZoOyVNTJVHc++mQy*@(oufj_HnzT|O zZY>OsZFX%Wr#eMJtmwmgv|4cvgW&{>p9kJ4^zFI@L-(rGhxKn2;;@T}uO_U$f7vu*UW>7G%vg$QFE zCn=>Zn5~VyEc-l|tXA9%(GdR0!zru@hCHM z3>9n+DI?qJ5oVRHu-Ar&lcGDx2tA!+c>gXThQg%ByA1Vl9jc90x{>#_RkhcTGN(isdW@;_LUE+z zhvWS(tMMUc-mqE4h_FN82Ds&ZU2RB-$uf?K-K`WmSUoQlXtz3{A%sFUwnr2e?G5Dq zQlCHCq%Jhq#{sz^Jp#AkOi&18vMlQ+D-89cdcF$i6@|bqWGmsL*erM5C=jMPJw$4I zeO&XY0EZ|2^#aP0-19>qQ<1ZKxVV-fJPL#^sJU4=9yywKKIZlhahTLAwVdUYJ%emT z!x;KCkBQ96da)_nZY+J#nH_1&?l!B_^IWUPTlQJUa7Xhav&MI0@$1m|lC_4aQM!1w z{;LAZT3oAcT;6T3iYZ{DKKxD48RA?c-^BT#D^)_yu~;0 zS%L3F0W2x`83b?_MQ}tL6S2wjzkEWhV|2F{7`9Xn{JX&SVL@Kd=JNk>g!mv!dU={+xHXx3bbMsqS|PkCyBnMU zAKYPTeLMJ&CkEM&&BI?I8W^HRkXZ*U`?7>+V}bG`>a3j^qs&fz*Y3w!Ga}6yBfHh< z5W?6=p^ihbZK1|I`>uR@iEH(w+RVE)Uum~X2YAr7Nt^OlcFWCKeJi1WU`6!iQvATBCcl z3XWpk#vuzX-Mrm-$Via>1Y?p!uc5+m$~%Yb)V8Zw;PF0GuuGcWTxFlU58^$dvz`0R z*Us1QPKM{kV6Lf@i@np~kAi$dTzJ<)>g@^a)}~5CR;6>T86m5ml+fGesYwS2;cW{% zGsR+J!_I8+P(J>>VFl1S=@18>@4f=ELC)Z$Lz%5`g!23iFa-Vi0$tKFtJtG(Jay!R z_zo*|Jzu-^1LY$DiBWD0(TZ~!1-+*_B|hy8e|y(1#;3Q5PrLRrgL)@O?%LUZC12vx z+l)`ED5+(qM5y~u>Y*BCy5DC_2f)MRPx zX|inziuN@5^-@nwpYm{*ID&GV-lt!hFAU2_PQyA`+T8u%6Q(17rzG5r0sw;A(EtG3 z(@unTJ&Xs>SO*y&y<;!jdjJ>gK39iOJJpWYT53-=ivO8}VkdCKS=Yl&1qWE>mDwvP z*lGJ%PsqxZEg=XA$2^$oo50BbeZKaUWdob?eSbs^XekYH>%T*)uc;~@BkZj44f5P4 ztjoFF`s?|y6MhLSmB)?>%>$qZUs0;6e(~F5$q!!f)HrPptFm@-+?l z1NHg7dv3L(O$fFlsvc~|rD(^KtUz48<`4M;vxeGn*3EXzrew6^(*I{WzHCAcw4?G? zJ1z>gWAbm>aVa$f+R^hg9=b9d6lvd^abY5B$NWCkzIVwniFRCevmKxQ|7pis?qU9& z&i_r$GiB#9FWer&CVpi;n~a%rjS5c5(;=E`<^wo7-QdYypu*MkHa7>0tAjH3;LJ~P z6FqrPnl+mIfxGg3cje#abFuw0Tq}hTP=8D^CvDXxi!ZPOeP&Hu{y=QLFFII&=Crme zQvRwDAP3tX#8yVn0W)#ikqdg{o8|iB<^#AuDc>_5JH8q?9q0)WTNpiX00-^$#SF=A zvvylxAYk?#G~bj>-DL@feuw$2Inr3yR1NEIIxjY`65Gu1Woqu8H1LDj_d~D{{DQ%oOGqir&Xt>!BOD*6&ZD!=a!=HLVxE&tLrdO?9O+Xp zPSS%VNS}IH7SnQb2Os=$LU%C$9)wYwqkr`>dG>K7jWesBh6YR)^{j4>f*bCE_sl*K z6(h9^hJP^}K3Z~{o?a)WvRw0#Yb!MKn`Wk&cbl=NFSpL@e8%wpjhx*H;+-tlY~=DF z*Q-*lSIuU zRI%I^WseQHa-Jv7M^YR^x1Y)F^4yy4i^^1eM(W6w`> zb_R!q+{CVx6dF}bO_Rxv#`StCg z_qONHug~RslDIv&>Gc+hPOGn>U-1)0SG3u%Z2|1A`BMEG%st7dJ|||I?R9ZNn!Rq6 zy)M=;CSv}VyfT*yJ28ASX-tSRz&OpA|mmh=+@qTx>=wV>LM&h1< z31;7YHxqUHNkp)H?NC7ZI5AabZdw@u^0D*7UaRnzPwq}0W!EU2JHez;!u2NS&$zjH z;SV!*^2**o=t5b7BVoGJWh#QRTsZQt?ip#930<)-M@LYADaA*Fkxc2K`7kr?KNe&mv8sML~Zwt z7sHu&cufm)yX5U-Bep%y7bSC@hsPkz_AZaTt=O9JM}}mF$UG8R%AUOrh@DrO{@?7 zXo5G;kj#lcnA(%W`f$ZoT8qm+QLbNUTKI9-FvD2PX&)1!I}ay;xRa*5bGF@pcESXB zW(Lo0GPnP(L^kk+1n-;)SJ>Id5%TslRj==)$#z95uuq)83OtSiStxK!DsbFH?jKJ7 zsR^j_T)D$M%Mor{0(Y2u#f_>4(`5C+54r^VSj@Srp{_dk4^6t=HxO}XdS{=gVGwJ< zh35x8F!_2+B#x4c%=Xf7F`gyQMDiijc$a zch@R(uQ3FuV;F-_0thXD&>=zSFe$$dp!m|fIK9zSHT?dCb-BvikD>b-KCY}Mi*v!p zOG8uVlfrEHSZp^n1wZCUpWbhL+4QLN>3vUa=Ru?GXjn~E>^(|PBSMK+i6zX(I_A5H z;y3iQ8-1_j5CR&8CE22_TyZ9m<=Y7VMVviRbskynBT%;IAT)|OlWhqgi znc-Koym!sSap9vccRHI=s(EqV{_eOxo_B1XWVkx}I+XiE-Yf`&LA4OU2NMgTGxI z&a_EP1MU@3>$KgM>|3~^Zvu%Iyb*wCPtBc@*yjCk(h3Abp9!SqrX)6aRVKVOpA3|T zuju5l-7Ik_$ipYxW$i5orVF@0C$ZOCM%jA)9q>Lh5jAbbig`HgNy^L>R#Ev60WD1^ ztMBG}dIG}OEBHSc$c)PjM`BSoT#DN6|49tnuS(jxy!qWgW(}}`hIazqwf6xnE>_HJ zkkBgM3V0vA&)$7f2y5EAuK5j!81XpW-p*~n?w-8I6ICgT;;z`o;zN+V7Gkdo>=kn- zk}ucJ*ejklUYYy7xNZ`(lJJJOdQwi*xzy}vVI6ps6Lnn7n3$S#Yj_5 zRJVB0m}7Vc=_#Fi#6y#{-QNrHq~+^q4KML3ReubZnp==qC%$dWiFz?LJ2Ej}NXv;@ zS*}XWejc30j5cw(7%)=2`I!L7$U)U`Q}`=_1)qve1jK7bZMUC%SedyiqNb$gCS=}` zsoH?F{y?HCbuVA^@4zIBV9v5H$FWM8Q_EFU?odE1z7L?FYcuNzD!zRX5L52ccAq34 zv5=P4vJSKIM2BFfs1D-Sh1A^9i5tO#4V`0!jp7%^4N=L7Pi~01GsTb~o-!7NaG5jl zzaeT^YToe7Jn>UwY95bY;$P+h@fcEmRMNheTd+P3!aDjJScikK4&QSm_*jLUwdQGYnS>EAJCOhr((_3tdw=?6OC zph5jK4x>Q$g>x%uhwa!xgww+Cv{a3wJ?K!)Gl6ASot~^mC8wt{Bf0tmS+yAvegqOW z?bZA7A6$EoX!)nnx5eoCr!n!c$TM30$!OUOT9E%+$}es*W;hHgE<79Y?FI{HT~1o{ z8;K%p{>6TH3GL9L6~25&sWl*r79{*12b^w3u~KvdDLF1t0{&+HCH3v${ZAWx%Z;w5 zjpErnLir43t9pv42oVoaUM%Z;O+YQ`$!a>&$^8-TnIxbkv;v$aN5vgkNz&>t&LLuG zLd1816$T!00e#afB$&MTCMD<_jAps!bb)EU(GmmJ>;8+qz-AaBxR@$mBhF?(c=6RB zts?Ea*<()?|4tvg4;r=3wF5JazTX>fpAh8UoDhiR1i&;!;$<5Z!Y6`ZHab*CVeqGc zbceb1bq@b6R?A-xLazfFB-DAf@zBv8QeORlqr$T8a5 zaMvNS{(FU-|3laJz(rYQ{Xg@67)E0NM+CH)(UAecW`=(=2r45Xkd{zR=&rjCH3)9K zD`xp;X_sd#91u4_%Yn6hXQo(@l@ux^%YAt$$rRsJYs*^PMT;`C63a4E=l4C&Gnl>a z`}=(S;5_%9d+xdCo_p`P=bn4+MLPd7n5O7>yH!io6bh~FMVd+3d_H%~L6!eTbUOoy z0{jjx5rL50*#e`;2-wnZA_o9ESvV4L^8Go-3?~K&`W>PTDPPSY3T6aO4ASOfEcN)D z+n@|pcOt6?#LS?QhN>w8|0I8v{SE^g&9mggIfg*==+GSQgE_bMVeJzIHVOi48Jq*j zldxKXN7814(1k*iTKsimZ9oNR;@o@o zA+9;tNrE5u5_0__qDjoQ@ig5#ClEKst2CR*yxU?j*QJZboSe-37EBt z60Ih4^L=yh!!8Wtt-|hD_-HPsoLhiG-mTB(d2{|}N;Fc!xY_A^>&5IEq4oS$GCViT zo%`*6$24{s-@d76-w&gfIh^5k(J)>R_~440v$;$=HNq<&em3l2qug4TdC5nULaS!} zYw_$oJQ@wqTnC$`2yB`%2XhfCBN_sVIXE3-O9{--Z>o~hq&6K5gERU|%-p$8L1gBJ z`wXd$=~L9v%!IiJ4kFyUHB?SvzoEi`Z)d|KIG277oQBWRSA62vvteY+p`S(a+H*iq zF>MNp>u}o14k)Zh7*}SBmn_Vww_D|Kb6ZzaT z$W@PiIh*@(_L!MrZmE@Gh7(JM3K$9f+FUZJ13=Q0)_DQ94xhMg%6$rgQ&?XZgcZ?e&NDJI1q@siN*) z;E#sa0-OUdQMZ@eIN{OgyJwr<)ioM=4aezT_Z0$!3-Uig%y%gF316-g<+Qls1g8aB z0q5Vayf_=fRyVb-*UFblCGzWG3C7!d?VCfV3{u>@5qCtNI4Q+4zq@(oHTEQr$v4{? zd}*|EHuu-rw7=jzINly-YDT1~=+$CGrWt3RyQXsD{S|Lr&r|F#lvFk6$uZcS=`xn% z5qLq0ZFJ{suKpHV-EWR#5AvCH$lN=+Z8rBJuoKs@f#t@v1jMb)g`b8h{MWtBFeoAJ zdi};cC3OChOm%(sbcs4qN4JA=ZUG8;w?4abXaCQXNTkrz02t77Cr`d^ zHv1?M7ML^J=d!Duis>z4-T8_mt6N?DF2y;QlAXZAX=l>_cJZK=*_+o4uhneW09?I_ zlUgF9$3^Q@k3OodQgh<rfv8o2wjnbG_$>CTJl!hkzO|y;$~fNAY0r(T z>K-1JE>G__w|ZReZ2#{?%UgqIKhEPzZGAR>YkJ@Cr%|iE(&2pord2asph3>(GIOi0 zgibG7RqQ^#7kcv8n`9@g*M%6QL+aS|d4bpS>iFfu%8L^(icx{*a&8Hv02z3hs?4e+El zs0vSD;7p&0n@=}SiM9RFs#e!KH6OBUE#IOi^DvZ-P@8xqX5s%bR}B5t$3WPy)-6i!FJFzW!2e}pT}i8Xv8SkI`QjkC!!FKW zl-_qKU2|!%2(o6*B>L>6E!z~O&*z#8M2pf9a*|I~47kGU=W#I}t&n~xyI969q^|0Y z&GQ70joS0L9QYuE+dgD>=BuHl7iqf_&^A98Oqs4pKEw)wlJ(xE}op1|vwbroTWP(<&YlCyQvRvk?xt_^R;Sqn5%W24`g6!?T z06I}2#XjL8^Z243m%PQLV2cQJ02+i^*^3L$$#*x%8YVOtJ&Wa@yT^OnQ#bu7srd0t zlf?B?8NBQeffIp;$!5FTy}?;7!`*2&Jod)14^i3%C*EX_R8KJfV&kH%YsySh4m>;I zz$Ao+ejhV z<j{LB|`NKg!9e4q-+mBYPDC+o?|>lS^D%BzaO&KM(PQZ_G8k_^Z(a zxtu3=OwV#VNY8?66T{^1%B7>%f-0#~E@t=fCDx+EuSYv`xxfBYV$L{*7mG%a+>E# zOL8|m*2#)%F#Jl^Vpy$H)c&|?RpzB#SUNi@`##e&WKPi77& z@q!(Uv+VDP&F4$W2y$Y+W;ngCJryA_$^J7kFXYX~YP4b9dZ$`p*RGcrPw&DDa_vkA zZ@-9J3dbSvOW_-#B3XG&N9AxP@5@KSTEf0bm3357Tr#}l@HhIB_du@4A-1s+mHvt< zT_^KRD49~|8bAo zMfYtG*w~qaDS&5JVXnbHWwaodyBpmn3_kZ%L9vEyKR=h>Ko=4ydl#Y9nd%VGu*DR! zBUV^ z-yJlEnj*X=zhFs-P+O7E5kZj%J%QTGbp|tT;2|kF0()HHO-N^VWJR2p}{0juwsWyP05{f5+FIY!V0lI1BgBbgg~*`dKGnx@s})Mw5G0wG;(mY)eRded>SJ zjhlcMOV~&Gx*tQ`$3|;saW%7kS{vP8sU0{E#|6>Ijrg(O_D%k8g#KSeh1exI%~ir^ z^@;=Ek#=rK&fn}6hJ~Rzf7qvCt7hTm5`Uw{WTF*S7&2sR@tJPF$;4jq3C{t&zu|_b zI;D_=5dHfXE7pI$jm5JJfyU9oS={_thT9B8!)hT$D!i%l9kcGqEJ^35j%>b(Ib*ZY z(gK6QHAN~yMe~)2p?ibuDyhnjI zZuDdhcjR`w?!It)2=kji!+hWt=G}yu#{zmGRAD~-Cy)0P;MI@5k;C=ej(6nXZFswW zhBt5v?=Hg2WBD201|IL9fj4DzR}Q!HcD(LaZ^OIeXLvV{;T;*T1YRD?&+tCR z`e;iISARR+k-fL!Wq*eE@mqLf2``T&jF%-JCi7I?Uoxh$zvQv6$}zn7htb*`?ze=U z1OggyXBc`y zkQQx8G$se=5%)aMxL9zAx|eV?FV5*+m|fD)q4dgWTFLR+)Z^869v>g+g+J!jzi+Jj zdRt%Ln&G-NL%WB_g6@q!po~BHKo0jnPGE6P&xut39Q+9A#Ru4iLtJ!}NqqnFUYHEMPBI!IYV_)NozhU>* zEM2k=p{#umHrX2DKHzQUy`zOlu)_}T0O7>eSu%Kx*;d#moAzlBRoxc;tuCfQV+rc^C zX`D9%p2+g^2W+jUDajXTw+ZJGtv>!c$eUPNE%aeQjygUJE~Fs2)hFO5U*t<0HO=Mr zAyS=>EJ0B3zP{$ZzF1=!LwAcQ@$-QnXib6}*uV@%y*>LC+%Tth>etx2YwQ$C;_~Q! z*ty@rP8;U`L!>JW=xM)qDH|cg>I&){({RFP%nj{{XVa;0cZHo6qp%_E_lC3=7&eIqe-PkTU{mOlx|fA^s#pV`T8h-~258?4?C#P~(*-tx&$tH} z-`7L6o_J2mYbolM?4Aj1EM@A8?A`Nty06J`HH*=|oo#(nHH#^w4$-A&TG; z*@5VKA*}D92|EV&-8@ZVKF^B08@P4~&GiAI=>|zdcPdhE4)ETN$S4YFKl+~ij?bBn zoDe)qNath`Lm(pQl@#`C%F^rY-BU0SMK~iF)!Vs58k7Pv+wUc2()s`Xd0O@p9(t0! zJBAt%$RFVExnXLC3g12w${(@u+ky)O*8H(8aF}LNZv>t?4(r`y5%SU>{^Yr%#Q+7Y zgtp}~fy*|QpX1!dNPQpCBxVm2Ap194;4dU!1*SoSX+zOUwc`73>)1EA z&K}?^0T&>L`hVIy2FB?XvjIxge`M?ayA7-x{lI1ju-tL{9t(ex1J>bkRQqIXyV;Y} zXS{+X@ZSplznsE8!z1Br-GAeeyaOan+#5e3Y0nztzx#6N5aLQQ?m@f=h8Bku`3(ZQ z|42A2n{3U$rKWl39U6-jHjh5jn=fYfbBW;q9_h{Fd7yN)YAmJwq5^Q9sSbTzW|tJq zrLTubtEIGd8&q8(g?*eVYX3T9sv&=OoCymu^ees%Ew=70)CNP~AET`{Zu3uVaHov5 zVgI}s_I@6^+1Bl`kqo^L89F3Zryw#<{$im$OZjSgLxD0IBu5a03)J;K2m!ExCi0!?w6@Q;@zJr+Ha~X)2Io!{YSv; zG8^8i_9?w_t*(Zeksbv*#TICwHQsmRkT@)0NBGY`hozs39ZLeXcM;LHDW&#mLn&?A zCK5X14=Sr(W__3`d@n5LSR-9`+e)5BSb)ZQPaM-^B4?x#ow_o95(XvgXYIamX{wUN zmvA8AG%RK)h7M!=R#o$3Hf5Os_$f`}3%;Dl*47+nv8*>`DDtGy#!a^cro)BrKK8m9Fs&&a(T~uzgqD=cC8U9Y zNcviduja`%ei1_Kx!CrDH^8rd6WXSSF;1SR!iX;~CRi_}Vv7C-5o6R6A*2uH z2^$*acr&(3x=vCR!yY1V@4VX2VLDOc@N-GJ=OHQEOQ{{v55}jv*Q>xZa%t(Iv`f!v zyc1Wp`on=Ds%R!zQdE0|{ws$>b`lWH9@SJideQhz$l&K)sc4S+dEI{w*ZtvG-BYRV z*0H*?+H1z@-u8dgU13T@tz}h-eC=gblTm%+SoOtY)qf#W4?WBtC=VdS^2CJ_-F&-8T%lQvmH2}84YH0FJ=ozu>c)850s+93!y4@ znH(1@xr6Dc$GRkDVE6+SdQ?@;4jp9Y^9Z&B!8R&7+MNAmB)2^qfkM6x`NXX?+K8Ff zWCpQ~*<2p75s<#oP1#%%$QSk=?sJi91;}rDoUTvEh#}f~-u^76-%aTVtodO``~7H_ z!gw+?a2WT4YE02ZMM>Ke*d!k5<3QSq%2%Uu+|7F;n>-TXLH6V3)o2MjlYok1x)fyA zG!*qD6cqQcDU`S~bIDY^%XD|{<>bZs-)7ro$xoXCOT;^~s?!l;y%5Px{mN{++!jc# zua*=A^sa21G?|K|54;d!xX06b{ByCovN?neTcL|9Sus!2B9QdL=)!F70kCwvCVamA zF7Z^37BD!5r9sXr2)a2p+mI}F_C&5vZZ6JFR})sy~GE>cH${0u0a z+qexvjAxgeMKbNf&}R_C%T%L|dr}-}!h^)RXJqP0c;+;Do6ZzvaLJv)QSF*&_Bf&M zPC%OujK*bi243`vHDsr751>sl`PPt^ZE#`X;mqJkBJt!36++~hiyPQOeEG<1U$evi zmr-Rl7X_}g>Jb^0KleBGM?NXW83wbtzl*}hmI_B7Ue}S*bxP*}rLWnpY>jCaXRm)K zS<-s{lM=71OYJL1%gfnbLhb9;z9SEOk%d#mm+9Lk4xG<|(w39sOHXKRc}T*(M9D30 z$9Cbab89KPn}?e3D>c6uHMkVP!HV&)!Peb6_C?Cju3>0U^@P^d*qXicdb-!%+~CSn z4E&Xv*^S*AX2qq%XABT#T}_^1i$cB^Z@ZYMZA6?JZ4a?}RmnEQy>)K?@Z<+s+y_~K zfvg^XFZ(=|;`e%8Vnq2^OZ9cXmF4k&I(jmTdoznp*65sUWM5=3e9zD80Sul}!1VeAyjISewZe@=F65?e~Z27|2o&sn(S*@Z$kxjiT$j9B9?z)NuAQzb5U*lLR8 zPNVAm7+Ja28+++)9N_pd&b*LThbc}y0VhiIvnozVs2y2UKpG1Y9DY9!R&J`;+h?Bp z0M7a6-c7*8COg8D$p0DI{8SeLS2dKXC$M=$(YgY+GQTgthnTEixMm1U7^-N)Hf}9)w5N3tM78Cg*LOp14;PfI7ei`5okIJ$* zc~&t$>+;sE+DHg16vdZQ6P4MvJGI~7DFYt-Q-H7K1?7iKUQm9>Ec_-k{mm8Xl*)HM z@``&Mq#z!d1Q$5x?_`Y))QTpM+G4_00O6{23oqG7NcI< zJTeiARp;WCcOE&rFSGlOnH|Ok5j}_%Y8z~DxnGD_h|Ab?S!oVcs^5}1x+|00m1%w9 zUTjRQK82k*zSM85WqRR$iA-8!1+pG0X zy!2Pi!A^hJbvVfDR*tGf$6j(raa2tvflMdZLsI&A7yYc#uA6wN9`UoN`!@OLTmVX$ zHd(4p3i}0BC87!=!P+Dp(e|LN#@@pIo(AYbyeRk;JC3rte*x~jO?rkPE01SF*RTBm zvqd4fVpALs;&-`Y`UE2@;!E6%5~oHV&EyvT#P9nfE5L6#?b_Fg)$$@mb@yp$@5JFp zH6K-8s??x;A5|Xg947B7&C1_&+cS^EqPZ)7bF8z4OYIyyyEL;y+r2cil{o%FsMY0e z!kb1um-d2${g_OodQ0Z${h8c7;CK2MzY+T8o=A3xvaNx$qeYqA-M90*gy(lT)<&=! zi=>P_OQ5|IeX+OLO>W^G#rRWQT>BmUw*+9P2@KCE%GiIH(2weLDe7;lQb3!JrQr^zzeCFb6eFC26 zh1R%pBl{Pg2-V5BOzv_<;Bv;fz<2BJQ9-Q2hx!Fh0|(^}i5h zbC@PvYSE+!JB7-a9JI{l)hjY}=~05albu#Flh-22Gz-UKUiKcsh0U1sjSALB*kC!p zuGZkMOCeyJQvZF%PvvPDF)1xGGQ#DRP>m5bkjl|*7sw6TQ>OncW2`-^!|nMzgZo=X z;BOh{g5%f`suJxf5^uJaOWBlgYb5Mi0`@t)6HKv{lPo_qg(o_Hd`8%Eg- zhym(F>{$Cqy+8s21ceL64O{|qSu>R&FL_#5#QD!<^uKf!ps<@qb<Bqju6 zC3{Cyyy0kngQ)#=rYRoLTPR;ocA6q-nrc4YGWCX=M(cIIpXqypY-`4^nS}^;JhYUR zP-We98C+dP*gzMH>v2{;)1M;UJbLUb9I7N%m&C}3mZ`Gi6WQ;r1ivPOdmQjLWV}AD ziA{>~E>gRCUk0QAb~7AEA#9J^LH_9}$|-ANwBGEU&1uR??QKJ%^cF zpyBQ_?|uRg>B@{(n8CKxamVHS$7j6NmY28EUuKwO&I(!J7a4A)XrZc7r8&7IgIki( z6HE>)$zYcfdW6pG@$>h`KO{YV@Zib&Gq_TK%!G#x?U_f;;4lSYJG&&CGRFBFZQf0< z$lL$PB;#)O$bU0=DregbwwN&Sbz1#VYN_GPOM>GNcItQ@63~M=(3mG*N=Q$QPTKbG zle06p*%<*_Mo-`mtUX+oV+L1yFlSO+GuT>r?~IQ_?6eGL=gp#M=d_zP!_W)xYeA?S z_xtefkZDtH9Ko9j#u1zvkOX&$Mn0iea42iTkGK_NHfJnT0p+fjcXx@5xlF>#(^cku zIhuu{oD7>}(d*~3XC>BN_Ya!k_qkBCFBgtAaD#d1j2M{Chp@d|`Z@xf7Q5hHBc)ry zM1mIe7gn%57kR`Qw9}c|?yNchK9cNFDLor>owp{l<@L zSZ3)Lr8&l+nAvk-U%JM?Mder#+fN<&`rOyg^&E@p+k@vC812eyaQ%5V6n-xiY^z6% zNB>bBg4vD?FnGd=kQnfy!>R9aYm!kXjGVxp#JS;Sy&(S_y|?DZh4d1gRuzfg?WyRc zN|m@?&y0+Ov?}Er(fc-P(nO6O3j8%aS*=cPtuk+2vp-o83~xqyOw8Q(bmqP_C=Q{)s9um|n;ms(?32uWRv38a+J9?~?cQD$hudM|6qM zBxn3J)@^~Lu<1OOz3JS4(c(oL%wZKA28Y4pAmYvbi+G(6wF&kbI)k9!Di~k+-yCe7 zBJ6W@Pi@3gK+ZU&`KgW0UPXDdCm_F=S!HPP-%&AeX@z}~@q^H#DpdSt$p65`MgBE| zIm=77H9ZXR;AN~_WHLl9#`V+Xi_bk6JvpdX29Ji8cb?nTGGx%-f#>XuQf61n33aSo z!oUGj0alENnO)ER11;Q#y^q86uv&?Dia0lijL{a6r#Z4KlHE)*1jHD0L(^Fhgb831 zC577pixiG)-EKSLI<}3s;X!owjgbF^K6MNp$R+8gvjOqAGO@Z2o}LA8)Qfm9HiaD_ z)>*}BgLqu`n)Et@21^b17#C3O6_4D2mOe$aEs?I=Bzp0F_Y20 zC1STz_1$UdT-q%O?o|nXEKJ~%<=9DoFv@S}%jr2Tb-3U(Mo9AL3jNc3!8_AA9caUg zjpV=aii+;87FklJ(Rz>mwrJCvJROpz681XDILzNTen2|>BzL;mSVGoxL9q3*nlbvq z-{a|B;1*5Qy9Tx-9NF-*%=%QviE{cv`n9H*}g z4l;%8&fN_)?kgBG-WqMmwbH{@S`tU`$0kdYXUC?o{nR4Yr&i~Ln>d7b@a*{5>Z{>C zw!+Xuk64mKw7;N|gD1QkyBOVSU4H<1yW*Z~xHnEtY=W;Ey=Q&BO?z0` zqDWB3EmLhR-v&S0olE96(%^17?RGG`rP`$m0v?&iv?!z=|L2Y*X452twvf@kX+>P+ zJ9$DlE7uP)Zb5bME+4bi`WXJmq6k_*AxXbpRnjGNtUR_@PK50rVLuDw}BkxekpIp#_6<)mzr z*naZbWrKfbN>Vascsucjv&qeQcc|qcFlqWUlLBu57Cy}QPCAPt*-vcJQYpipL zta;sxB>R1v(|t;N!1A~?aBOCdJ^P@_@|czW7Y`IM-awrla`mltqsDadBJPy1eS94i zR$IX5;#Ts!gdoU?F5^a(T*QFtreggPYvI|@j7s)Z0;k8QHgzwyUM=E&5pILKP9=x7 z;n7F7;L$Aew}>t0+m;vM8#UYem~@RU{UPlHc}F({=FQL)suL`>Eu(~429~=9{(#w`d#TZ8>nVRqlhwoW%A`3c;Z7A6W&J z`%=|Q&)~|BOO3Bl`q3YHV~zvLeUiQ|T*ZrQCYjbDXMd#O;yfrb$)Kw$js@5Yl+YzU z*4;ji;YKZ~k;eiC|FAJ+OPQ9cK86?R*-HfRBsSHEZos$ZLkoA_BG?t%T`KNV6vEN? zbz99T3xXxN5kR@AO&w|QGwrZQx*6y9mrC0$;8jsK{$T!5WXH|#4o9@r%0`rJduVKKjRT3C277BxT|C&6QE* z7JX<&ew!u5m~1IoyioFBODcPsY|-6q7Ou@AIPqbQb{DG*(2}>SZLeVOv6;#*l)&+@ z->)N20zBV#52djUmKKc)tN5l?vE0J2^%nm3U$IZ&@M>BH+elFAgj^NtrC-?IU%1-* zq{SD}3R^`h{IXh0T148`_!iN`))XJNb*r?c#HfyFDKW97RN$g2SZGWHHeGNamR-ju zZ7kluP;Thg<;m;+j`73*LDM^dYKyOw9A8xCU9HE}lUfRm&^UcBx9+cgnU05x6+yjJ zSP8T(7uY}XZC+;KeobxGUFL18#vB#Sb9%T8YTvJ@u0-|G9{MPtk2Do_4Qvx%@;(c< z$U@UAt!G)_l|=rE@b(!A#3ITKltLy}vJq6&W*vM1Qg5fn(s4wsLr36vyEo8E=I05Ilmt zNiY<57WmG{hQuc|7EWUcL;}GP_AScna6m22&Y7|lu}h>oaQfu zq^yD{*rMWfas4GTw09HK;jfQNSrO&Xm;&xYcx#vF`@zgzHwV5o_XIv?_YnFc4s2Gk zb7Pin3j%#^7=PnWP~7%O|h%zbUf6Use-ABD5+|4-R-x0O9EMVp4q+&OdL zeREH6Jo^k~`uIxix{{5kbdx=9Zrv+GxE1~iNEz&)1|EEw{a_3WzaRKgah#|B9W!^* z9C!<;X0o*ev5rTToi3oto>8;U>=m!W4otq*H>JaRM&6koSa_Ft)wdg7fdz|wipmU@ znB*G_$^4rS&_}jlJ|o`rn7P-@fiAS~&#ar^IvfUK{hdp<8Hn{04N7B&a>#MSc1Cve z&AG4W*uVZnBVNKYw;156DBscc)n!hNw@+|=MAoG=lE^qaZ}jT<3&rz!#1^)Y{)g2C zeZ&5zc_C)7`Mn0?4>!Fzn=+zoCF)5zFc6G?UR)@q88D|nJ!!t}(pK91^Zc-EGbc^8 zT7G4QtCiV&h22W%uvHcKJJ*x%59V(=IGJta(}VfD(&Gi6a7(E<$7(iP>R~kzxPkbH zIH2f;ML`aJr37QhR~zzU)n&;D%E~Sii1AxDTJvMsrS#R*c2B^N zpTd^YM_`e;2L+w<8%pv=mW5`T?C%%8FMi~W_1(YewHf+%@AAS#D&2X6T{aV-=VMRb ze@Mm6GY96GhcD!x_$Z(KJI!g-==_Q1hWqW(LYgbku7KU#&hUf_{IKMi)q_P6ORgDF zjNg>9m#7?@W42ox48=HU9OGNiFJ;APl$T-NtsJ~|GTqFjn*-_QU;dRnJXRO*v#I9V zA3K!n#nf>9l$HcOv!4qo^ldVGl{=L_+m2|dH*Vm1$Yi2J&B>SadNV!KPIR(5lxgY| z;#{#$Q_Xz8u66e8eIE|$@FWomW$s<-6J%9N_XsEHng}|F8)p03ekV=Nd%;3tM z&z-Ls9QjTsQr@um9tQkXmeOtEHo#EBY#XZjz& z{w5Pqtd3_7QM-1FofmFm>rhW7Bic6*O*cYAAL0LY9!vWi5tdo{Tq5FWXdev;G$0Ko zCBBMwtp;rme0AN>)})N{-uY(`uOpZM9M@ua2vVXqYr8Z-}T$PN=M? z76;ut(dV(|5k;ScDH^9~T4_=l3?gum{6?U%^Kx|XE)YNlqc?R3ZA82rYd1U+5nhs0 z6U}EsI4Oq(bwh{6ksoPNsi&BFPH~YaH2gOmFs7*lD85ca^yj(YmV?m(4@W4ehf`9^ zhfvGV$_{<81$gcyJZj+S@yCwgX&(}3Hx3DSMnt#ppzs(?BOd_IU}p!g7z`0(Wk*g6 zW!Gl=Qn)?uQP~R}76=vsCK(LkTjk#imwzu@{@PFFDJfk31hpZh!va32 z&PYxD$0fJ%q5VXd{u2U@kt?@w;G)tPj*(+yIPM+8aT^cdrYQ8^F#$*WDB;LwzLdcv zCrPENhl423k0or919#tLMV$9}V$W2`rf8`x2J-}_PvbmWaH_azsaNHVgG^z{4beQ~ z9sqKZNscK!IMc-6z>%pHP+p5iwPNLZ7p%&!XX;wC;L14?D6jj`Umm-I#SjODT6_OQ#fU{kkTZS zA(;R8U!|%k<(z2nl<4p3&>M$?{`ZdGvH8{b&JSIm*IahV*fW%W+I7C>YUxl)i!AQ5 z)^R~u{H{Dji)>P7>y9*C`2=iKP0`pb*nz0h0*=C$QSU4X2MlH zAny<5&!0)V4?SJQG)a?UWbEC9pXXbE@rV|+h#oK)q%bYfW6$Tv7j}1ds|M%7igR4* z8JVyvYp7{;jXW*#*7#h5C4#nsUcuRX;N_VEKhm6`#|`y0c5W5^oVBFPEIx_)5Ng){ z2ddqbVC!Ep8ks(K-b4E`5M{p)K0YPsu$Z&$GgrJUmcs>IR^6N@Thjfcti>RMLr;rK z+3v;xhmRdxyCP?ezh0*;QfM>cJ^F~CK4Px-p}Nk#pev%|Y(t=P6YNSI-3=n|=+(gK zlf7K$`30%)}W`ci6&_SR6OW>4UmUA8S9_Sz$x+LD6(QSKoNIayG@ZdI4UZl5q=twzkcK0P-ng42xx4S4%-dqAx#v4yBi>!YY zOlQjNwQtRTHWsw?fM0SVuSc)MDN6m}5SU1b_lc0$%WB(h)c2u?gIlmnTKj|A`-E58 zQV^F=;5}RI_S`*r_1%dWCdHzTGUAB(nRDF33!03nBK_={TU1GH6g$zGa#5Rp$rMv0 zStf4ENRBn%uWJ$)(*FaOe=Fm z@=Pn^a(Tg+sFv8zcCc1|$gY7gO?Hm6oslkRIwY=eMU4D|%oYcwHg{n1%oW?_S!Ib8 zvdQ*9b&u zrA^n02XNuUk2fA$MN2foT*Nn4(xpfawAPFaVCweOI6D;`fiEL&U`hugB<@C0nyN*w zaOTK8qM`~>@s0`N70*7<=mgdk6Ylf)Lk(#4Eo`YcdsMjlL)r}tdn&E2vF@UYJ({+u zO_5Lu9?|6+* zlJ3&s1b4`TAo-Ol-mf!^8GM5`}lDL{3c`fv%YN)eCw4_W_-rBrcKf%W? z32agMSL)FJJ0{*+d()!(sXuIz;h8#&CAkUVg{jh3&HAwpSt)b~f-sDfi@t=LiZkcB zueotOI%UU>1FNY^HdMCgRduV@>^N|5i#`IxwXMa_=cQsjq=N5I1VN-Q4(@#*jG{Pb zJAWwkq&*lr|dum_YHr)fHnkObV<{tBiR7!X2>s^Rr_!tp1SIC9=Aha7WR+s=#dB zzAJR`=+&Bz0Ez#Xa(=#5w3mnmWay4_dd2ehb$CMY5bit~&xb4zre(*!VtJRUbLfR0 zN>foEow%ispG7Du%BK)#M2^Q5<1tJEY18Ax@_IVG2tZ^OOlrUsKSs-frX8^&q0#Ms z4mB-h=cP3^4xL^Q*AdthE3RJ%n?=Nz3fL886h+ebW@zXFmI+JuPjp}?fe_d|f6K64 zM2k02`=Qqs>BV-2m(ZUo6Y4SgaJlB}jI@)fY5jqW?ip!pD)qQWR9tuIVdsBoTaMHP z5sB~Gwli|tZ&SUPom)e$_%v_LiZ*pXn}z{+L$yUU@EvBR@7D#i*|IZA0n+_;$Q75i zqD?$d$T(MC*&V0~Xa~Nn%BuY!vT{YXxG;yQ@Q12@8a4bPht3%JBQEx+&&tzI%0ZQf zk17Dj3YVy2tm78_L$?5XM{uDjq@J`z;cwW6)kk~e2iJG0D_1Vxv2pA2HO{QB2Kd5Ils_aeyM15CGLs~M*UfBjE69$$pG_qpz&6Bni_^T$ z7*;3T>q5@P>mJeML#mb|f7^Osdrra)_IWvt%haQH)e3{ZaNexf_&AG0B6i`Xrxo8sl#5=?B^21a9F(oo$wjGk(s8aqNW|;DbREpDf2M5n3a_+mB~pL;|op%-bcSYFXLCOu(I5 z8CM8h?2U6vT>bt~zf06lVn>Wa=aJC0f61^;G)z16kw-MeCv9wPmHJ%J^jt0eCpW$J zjwzbX>2Pn3&L)KZfMtm$h$BP?)lasOJ<$Ap@jJ^~<91dzM0gF6UQY$=e*{8zSrD4! zhfqT_w#@uKBG_+hzaBCeRNB>2YyWlJ9=()-HxW*ZDRQvk%+t+}j&!`WC-_#u2+PQ? zhjcIW>Fud7{OCG8dS#NXGs>`c4}J%aUhjMXPg@9m$ue{6)}TAFYEDm`9xEQOGF6|c ze|STFJYw^H=oOY$JsVGgl&11pe0umkRB1urqhh&&(N9Q~Ct=0Hp4EsJ>ouv`(@J%; zA^%PcIH27TJ2cmrKaAU#Nd|)^p#Ya4b^L?e&T~IDX+8OOUiOR5ad#pt-*GxuP`LMC z@pX1eD@1py zo%T70DC3aKaQDRE+cx8Gv#F6*d7SlbasnsWMc+R>W0|DX~z~kOb)ckqwdGC z$nQL8^&{2~iH5MxnNCLr@)CwEC(PEvHdu>BJ`SxuT%dmHiKnE=iq&sR9Y(3P0N3=A z^VQ=F{!lUwK6#Oef{AM!oORqsacbk-fY%<`I>G{*c>K8as`bM5Y;!0345hAiOk6FR zTsbk*Bg!}=_BilzvGJj7k2tPQ;GvPiudEGt44PHzbgL^g2GNvt`5O#~@=+8EuX^0@ z#F}U|Y7BdCnhjA_9MT$eH3w%H+!}*14ozBRh^jd-qlb%HWzZSiaq#dg&Mz)4cDW~k z>rHJA_atK<`aht=IUwyy>pqz3cNqAR+P z95w>Ko-wozhZDb|rX^hCiTYA{M$+%s8-IUWy-@!ajgUi7VAc%ndWMHHz7$3o=0_l7 zhIW#O+E+5e*+4LOVtQoPSiLT+Lb%k(Q0*x*v{wZr$GG-x_)?iH$yf_+dZRs6Wem(Q>Nr1xw&K^(s zsXrIhWnk?DK42wlzOBPL(r{b(|0CbM>b88SO3@7lcH9gYOT~lp*r#s8O?CC$_HB{P zFi9>NQXAP_l)4kwiDo3nH>i?Rl5>(vl9wj0Ox|EvsZ4I$EivJQg>RS1v2%5Y0X7&D zN+8}BkFTi&ixmW#hhfRrV(wEqnEtheilP~ax4Uj1`AAx3sw5hQ@j>!n=JA$ z`Ihxf-FRGlio5fW(%lKBI^)S|xRL02qthe0v-xyNan3^VqInz3lak|;Q(9G?k|;-s z##$1Mji(X1YKm>*lK9<8gOc47%d-;}FUj7`dppw{%iC>TOqHZdQZZdTEXURr%h5Od z>9aiOuVSmIo=4%EC(?c-rTJxj$@-=1SFYc%zHxoq`p)$i)?Zt_GHUh8N%oW{RZwYh zWF&?KTkYMd`(7pL^^72yWCSG;H4X_Go)$K=G}*E9!v z4Uy_>tGajAzTW&@f07>UalXzZv|>T_#>uZ>4G7D%O}uj+DJw-W?UA@p$evFIWqDG} z)c~M6#0WJOhAk39*V0O5YGu{5Wy&t4I-&N)Chb(jHfr16AED0P8F{K$y)1IDF~N&b zu{QBaSESYm-$)d%m?m;wqd|X2YLsPT!uxNkXQ5m>a!rndO(|49Vg9JSYIQIU2jcIG zS34vPh6ZbcqoJ&!qG9zR`A#jC?tZ0E7J(fc6A80JSsy;9z#CszYd^Pxd3FP)0Y{4? zw&9$o;tp#?RItBb$y!@dkz2DyLYwb z)_#19wObQ&@{~_BN?VE|61=tN8zf$MGB?C{#Ic@vO5=~A-H!zgvAvibQpb7AVMfNB zvH{XYxV*dr1st2R+rBn zYfG7~;T$@e+B$c6LG6|6pRPN%Ofg+ytGc{QK3#4pJ(8TAX+cj^5>bz;5UX+LLCn99 z{4)QO>`)XY6l@;5}wO6P$g3lB(*JghCDB`ZfmK*jR(5zFH9iHo5aqv}WNOF`} zrdkoB=#sNeLf~9{9dypUJAdx-Z%_Hf%a7GzE&n=enaZj9(HgDGDX^V$l<8Kc+t0z- z9Q`5^c|>*1^5h0`#qdV(z2R|9#0~(uKf5!z>9y$*#tv)kJM6~f9c?p8ubTkp(35=# zPAX*DD}(}emF8#|*Uw?P(q1Fe9{L=2BAzCa)IYGBlXuzQY~G9qfRoqS4|Yl2|H^Wv zDAWy}fOxIFQ#~nlT*o=~H_6jge{O3F`hUM8=eetvFJ&kGkxxrlkjriVM~KYOxj`s19 z$hZ?9Mj=e?spGnYRyb)fc;v22Zd8kQpSA9VTXW*-(s*lW!iY>LivC70NK}$?X_dLa zyteP+MD1f=t7Wx6q)MN7Dgy9J8(WH)gvG}t8}_pYsbcJI;a`Y(7-bvucrV$j*S1~9 zR($U*xwF=O6zSWMqxKw$YN|3h!Uuq<$#eh+`SDrVyyVIVsofEt!;psV=bo8nQ}r5b zk74G_Q-viH>t*fLU`15JxrWQ03JI9f{#vLWYb46F7$opZ#m(5Bz1O?MdQZQU9IE(<9<)kE)fsCTR?Y@h$$^B)gK0Pu_=U zhTcA!SFv7r40p8bB~xm)Pj5Tddb!2_`>p8@l@#H1vSZvKX|O-e_+HlFQm>`bBrCp5 zl_nIxO;N21?=?%SOz^9LEEUQ4Jz4SS>i)QqFGKwtb`98coXC2V4o`|))2E3G)0uvb zw=K8_vz(18>fSFHFYD+pI3(E>x2Q`xvL}Qq0hn4x4rV!`b&&;-bVsy40srfr8x-o; zb(gbuh_N5a$#59PXTKuG4yklL3AC^mB&Scv^Hhc{;N@8gRSw52CHF@@ooz}!qy$yG zYB7-IwOribb5$lQF!m#9noss-6@Cz6gsFh!?E?H;uD~2_KS$~OS^&G%WRtKj_bPo>yT&S71;Syz zLJ*RKYKvW8AzG8CJoQf0iCG)BZr)g3TDMV$Av|O|_~D7o8_y^QJ1X?_AbkaP!uw^e zEhf31>9~C4oZt2sMx1}oL%UtUy`s*ywv797T;Jwxi@wFn?y+PL$dSM`UK zU&=sXkV|df89F5C=Td2g|08^3c4h6ukwRZog1#(^5vgmf;puS!HMydi*dJRozgQ+OM?n=PUr4?uO{dZ?TV8H70jl#Q#&)& z*Eb))o(X{Lz0|L#Mb3jidiB)Wj-BzrxBfPGG^mhlYTLEIko3Hz{tjlrW*|7QJ-tUE z+4ZMpZ|MQTHF;B8{RgpzDh*$(*E*^L% z+;4i(8QI)LYw}-8GVdc>icQ*K#eX>Rap0s)VwZYETU$iiEe_M3kLXwlHpefea6b{_ z>^Dy})P|?vH)mbEu&6I%ZKAl|g#BLurg}dyr?fRGja=-)2Q4x%ZUD0TEajDH3=bX< z*H2+qPh*xpr(69trums2(oXND1Gau{0U1nTP~VZ|t7*!~Q$f8+yq2nbFh{gSc3jyN z(Zemkp~WUb=Y{Vq-zUjG z3Ne;w6W&ll9MnrmxZs9)LNCG=qx8`*2XH)jB+P;`o&_?9X^UuU5L{qP+Qf+6npU0- zFf2h-P7v;+2=HnAUDnXSxdI>H{mb*Ag-Fz1kXg+TxdZ2*M;(gwJm6| z3@3sImWEpl$-Rpjg8opBYIwWoSNDtKb=lW;BuR+sT-TGnYy_JkC678L+by5#N-#sHQ?zi&B^#Jij^mXk>XbU(zhH)-H& z;sM7juUq3vO@hfCcv_~D;fj8^?pUu;M>N3J5(h!)TLURU*SJRdLW4_tUC;%)=mO}v zQT(Zbt!l+Y89SNk#iRhfTH=zH@qV@vTP7e3u7uhi-P9}@$ZAHRLg~7-l-O=hku!mtqR3V=q z)z8tK1x>&G39J>)3)idI%IVcrS1RQq`<03bI`~p7)+MA@_>(yAgQWZfoHpC zV$C7bqO^TQmh+?W>u}tv*4ADvglUbboTx^QtbH4<30=X0iz$(&cbU5apx>_6t1(x) zS!UNn4S^Y(L(UD~Y>}w7@;HWpjfx&0OvMCe4LPrk9#Wxnmtw?@9b-_Grq&u4WbNs! z5Y2pEvhw54Ueh0n03C4TF8$nP{B@SE^t{V?P1eCqPZ7%<*ksgy7uq7pKA^<7mbEwH zH_qSw9;#G|<(ttIdjMzPR(}Y`;B<^~nOks!kqaDm$Z{+$hq79x2h zH*3$zgl#L|{opm-ttNly8o3WmKJ9WI{f?R}psNieeP%iqtYDBC**or0m9}yGqD-CRBQZ3y9)sAE z!kh{+9+Tv_{NT$NFi)!XEF~o#)5G3z%M@v{(ljEbh_)x>q5(}KjbT%!19W-4&Zn%5 zko)4MM$oaw?VH(J#sA~%ec+<1(*N;0cm6O8SC|=K_^aMKFfgDN z0~!Nq3#f=%yZ%Wcw>CvVv~^R{G?#X{W5Iy93s^ds?Pu=j#K1}km7?Y+&?Gb572C>O z-K9U2Y3^@9+EL#cR(0=RD^*f9`Y6dCv1J%UO;-*!B<>gkHS9 zfI&eFK#x5wT)Wwgm;KNlmKLsi!%a_f81R&JPd+DVtl4j}bi#g-nDP5!a6<=~AG%3xE01NjHU4{e}J(%QSi@S@;IABTsY z?C|*8N>_Y){DU{Td`G7ZfA?MKjvJ6G!jVNqid=g3n>DIPm-jcb)~|Q^lBTVH@zukc zHy~uq`!jB%Qwy6QTULCBH3PgS-ZU#b75HDa@z)^fEw}aKj3E@~oF^5h?OEc?c0GUD zlT()oAtXzo{IdE6OhjpO;W-t?E$Q^M|NH^k9dhds^W|CSclujy4M zR@Y8-Sxk8}Uon-=tFC`@Slg+txB&k%VO%1w@LP?qi+oyxD|9b({2It%n?ku0ug#0) zmpw&mkH*gf`8Rgk#@tqmhlV(fK2O8vw)bGL$x%nA?M~t&a5L*%ZTT{@lbyNdUKe@> zjQAVbo$9=~B&GJ5?BLU?uiujsb=hxPn15=Q33`u*I!v=Wy5iHQ8-If-u_u4_#)v2G zHIPyn_u_3%mD0l%-+t#_oPG4}2wcQqom?5_EMH!3`9M>C^u`9=(9Lx8*&nPipczkXZ4GTsli1D2KpRR!0p%O^3F_p7Oxl{6h%& zx!Yvn9;hjc-U8#oBQ7?3U{G*{jOkR!>-dWs>{Tgbi$~?omr)T=_C)gLyeS z5VjnLplDmtG$@VU5Jzv~mM1I^d(_gZ)6u~@V#{*^jSWnYsF-4U?8_9}@&0Czqc15~Gj=LMy(R6qtKhsrBk4CB`;@ zdH8vcISB5s%*Ap#Z|SCGv4*+pZ3`DJi)CwHfdDhg+M-d{Kb6f8VSR-lDe+%Tvd`<( zl&<+q+GHz!Q6~AV@3B1MEd(1+r60tVc3ACSV7H#M(&6yBwjHGQL7t{fX7;o>7iTT# zy*$aZaQ>-Dup2_sRM|)O^}e4$EaA z9H>@%PzD9!*y3|?Su6<0^ptn9`G<6?=_7+Z_DPl-M-NPH+_;~fnC!e*ZmI+@`m>5 zhuI@uRrPhTJD4+>6Zewu_HHg&?7S%-?#uu&@S`{kJ@L;J4%O?JXzR+h(K?Yx@;&GB zA;tTKfOPRz8)Ta|`cfF%Xu3EIN%Di*d;-lmZnPD!6JKf zKwW806dS10v_yXJMrz-UROv=)x9@JTOsRU*Niu6Pfq>y?JfIfGlNT^HDai(+e)0-B z>_k61E~hHm9!^o7yIA3~R69F>Z-IC+gp8Y=5&uuSRYyY5$X^<*8XQjT8%~uzO6~S; z5^pD%cJ=+$RR0q4huY`!a^k%d1~rfExj6Sv zKm+qYe2%J>22#0rkD)Qo9qu}=s%K{!>NTC(yqMNhv5nF>ZRp)4@b689W;QzE_fiUd z8oz*$N!OuNPo_Jf%@f-iAx@`yP`^hhi!=Bw5k2;{r?0l!i?7oA2QFgoA9?Ww%GH<| zFbrf8h1>?n&IU63Vc$HF<_GfOL;0!9rGjs#$Kh?1A5TUTx!D*5`N7b@Ebdj(?$1RG zdQ-uuM~MGJ32yCO`g33H*~*;|lPPT3_-$UIQ=4I!p#HS{(--qH+qJdWSa~$t&6y>s zIBdy_;WRqDI^3dm+GlLNnqkM~_g$>r3ZBrJitMSl3B|r)$+z~@8J@r5r5%mD2m-AG z9N;RtQt_^#MbD%s7_22sV>zt`C-7Re;*^$-<0ub*NzG5tI5wo>^ef+rtxyrJaOd*@ zwsF>wf$>h?1YK&@%1!^Uq%yXTC!ym|=6G6EtETWyDe0q1kSXi%As1bOeK-;PO4((hyu_&^FKi zzr#(r3GUc`g9{Y*UQ+KptnptX?xP9cE~UOJDYq8hPD6(XXQD#lZK;q=ZO9?zd-_M* z`hdEvMb)aForAM&L$D5_>z&G?@=!`UofTs2#Ji?4;6|E=X~*%V1_|;YM-1Uv8iGXc*sbj_cl;JU2t5j59@b@!=bS>q) zdQm@*GiNc4iljx;fn&wyNr11`Tej-0z@SJawo!Q~!07upMfxm7OrpHNwVR^372-cA zET+?Mxmr_NslnoPkwS~#Noh>P55gZQdAuogJJ`j4Nx@~6UTh9xg~aoe2&IyzQl!C@ z&vb{wM3!QlDaEi09<3u@KkJe@Yl^0f-8o&{MCCw_S5u@DXn^=N^|H^qRQwYa;w&6! znN_-Jigss_xFMAHK#J6xa$YNbN_jztS1D^T)Jsx7b){e})rgN#-nq}F;9#>#TdL!d z@rqi^ri|^{0o)Uak5C5XTh#YbN;#hRtx#pp(!X)>yza1W@+@1LcBKJwa?hs>?oH|1 zn{veawpgxU)Zw3hRcKD(M)$4b50f#X4vL1mg zL@AicO(~1!lJ*`m%~5hJ9N0TxLfIW57_A|v!ZjwN=r3`%Q}!cq;~KN&XGz=Z=R!2U?PEClG~8Qpz*~$3QD*u-U{a43vv5f-u4G z4c-}7yn)@H%1hUOM8s#2Tye(N=l1{^H3HR7b>*aPk?#L9KG|~epwih5(r+V)fDTBXA>AEN7 zh%`YAr!rPmRHM1#7(Gejs6IRge-nkMT|yq(MQfgx62u89nD9NI2^+)XHGGEwU|F$PjT zXxZ>%w~3WX<+0@UEwR)X^lMZ%5)%iT3n72H=T*4JkgorFBSSoU6at`;XzD18Svc+uMTp|#t) zjt;)jLzjZtdGR87ycg9j@8z0ozesP>Pta8rR}il%{MY@1%#Z4EZZJ)%LKPITRD^Sh%%%F@|k-BnPn`6(-R zQGC)`3qAWZrng(|ismTtZzJMOz*`(fe1g23r!Mh|n;VW)oe;C7X?`}`bZ_CT%dg>ChD?9$?g0*d@&UNH#E`NYlu-{tS^^Gp!H&%|C zQ4e+yce&dWzEJps`PL94^Y^iUUUNxZvqj_hnH9n#HJfTUR?+Z}UOGdm zLzmP;pK1C^tm%IkeO}$Yo4ND4?G??=i|-X%2aBy;#nvO<)j>|-Gj_1RiVXLWwDkzz z&K<0{^tEt@wePJl+-Pnb=owBeg8M10f{xbFo$N_9sW6EU)k>dDIjJV=cp?+ZCsRIz z-zQgDw}K3slwqxSK=yg#hc{@vm(<=)O>*PpUyIi%TXI9iBcKM>U{SDksuVr&s(O<+ z)~a}gdWSfmfK`bXLhcE2G2i<`u2LP%e+r||0ZTGsC0om>i!$+|Hv+2O&;`!5Sy@k| zeel&AgIscVUqnUfB*)*zAig9z?!$;et+hq^(v`~8wT}(PEsYMj8n_v1;f8?2Q5sVC z9xWB0q(#N8f#i**n1qoqrjx7@E+1CnOv-~3G1^)vs{-=O#6F)gTG%n$sw8!2z`skd{5NZ1#T1t&}*tz0b*5RQ;4Py zlgmvx(sl|vAeFc|6s_z<5nf4Qka&5>eIn#8BbSiI+1y--)(NK;KRB7QU6ma#2-#}J zvMa3cInb_311B$g(bP?ORxYQgT$5d{3S>iJ3O<>(Pvyct3gCnNm*i}##xj)&tQk^+ zfAn9J#aD^c5Q>v_3;s{!K>6?`S@H=`|Aq&oJ>{H1e3p=)T9qdhc5V7rwss~X{+7x) zt(HyKq-FtX)dDQ^P)SWf1-w@1p_6_m_&=0MlbPf90(gR_2n^&-6171aL5M1$DDeUM zU1^{%YX*6xCxpIDqX+L6y!(9KXI)|$MdGVAg^oML$rOUCa7b{+P`Kh_xon`MnrIRh6#@JSd&%^KELYdEm@^$f|yQ?6p93&6&Kr7&QU0I6$nLEkgLMT zx5pITA(XK=Iam9m_;%Z2u<|&lj^x`X1=yanNb^e!>_sl&U0|Q(3gT7CDhYQSEe9k3Kd_C5;6owreHmCBe(mf z96MYkb1@bFq^nD7A$>foDm@mEmwmX$Qwi_#ovI9z*g^PXGW3VsfYP1>0pig#`idC; z;@fmGbd9mNiotD#LqlKYA_bmHO(PUgv3LM*jq)uGR+X)$;=u~DM&iY4TG9K@Q5S(% z8-FJU6+Yru6glUTdd~ftLYW_`Fs*nTpOcr5f@$-=FtKu>wlbCl1~|>=o;a|sa)p-A zVU(kju8EZ!V?`9wGxsENi>B3By-bEiNw2`kXQKE3!7fmE)6y4dTk|i<8~Xi#5-kSY z!u$736yN6y-yREjLUD+n`yLOgGzGJ2W=tYMmBPRAbN?0!)(TAFdA_Ehw{9X`>=z1S zXLS^w<=b9-s0##TZS51WJqQ5nhYR24v2~iKkX0it3b}L04I(tt!A+Z4i08kn3s3Ud zh2x7BYjKl;R$HPq7~GEI{2Nl9m?8Q1(;A2+LFuB(7`FJ&a_s=8px#ADHA=#GA)P~k@v6gpXQ*wq#26bjuM%u?$_~?x_k=Pm18HBSbFVE>V zsJU2vfA3woz02Ww^IILT?1BV8_6xCs^Wuc5s0A}|yaxE5j z;(@%>K|h@mRcupP~q#RYjT9!%r&7R%BDwZ>#~e zJV)QjGWIStqzB5qDpHtUE6s5mD@)k^B<4z4Y+Ae{&HmG*oXVr`OAWlgNh!;u_53{T z_@YYpN5W%#;bZg_u(MJ%xh0xfm{?fN+kOYUY)!KC5MQwcRPf`m(n{XnC>P_VPxvKY z_{&hK2ZN<_SY8-uIZsDkjPxLnb2A)wtl*^;l#U~ZVK)KXEMw(Fgj@e{l~$_Y{dKam zlrM(W3D8Jd!e@P=#@%q(60NkDAAUlPgJ%(6@r0bdWD-1eOU8@0@PT+Pp6}@8STO70 zU5*g_#XkC-V2~E@6)vjCB}?;pzbNMd!hGH)$}`}Z$NOvKd*GSN+iE}w$R>9E4E?wW zdML#Y#{hzKCy#42i0R`#Z<8#|;*E3pipS(NeT$^qF@XHl@(RB%lj$}vmY=JJe=SQz ze8sQj6}tn8$R!of!aWl*L!9M_m=wvXspaKO##GzTy$m9P8g8OSeJ?g}P!L4G?6V!1FJt{c91Te3?A| zqT2s3h1SVBXw$5W#=%ZZWjU$%4UG?%HD>(AW-DKpAKonRWKFacTBK5%$MUT?15R-a zUq2P*4wfir)Wfp7W90)NJ90>`?V=56?(Ri|5leWQ@LC z3HARFZB~R)DmR=I-=Yp^S1b3!LImF)oiSC};S1q>#?<03$p(Yl%q8QIc+p|7i|%Z! ztMx*LLu7-~1pV)3H@`XbjA@4l10)d6joaHnL#3Vcy9L6l{~Fo@1%uq|n^O;sq_!Nj z55aa#5JuNCqi@RA^%BCgDQXX&{Q{Q=&-?Z0Z_0xfla1RE17joW2!=*w3aiUtuH@+VyqOlgj1nrRvc-kWm8qnc zv~vEZ;?dEYv+20ki8?$fAXO`mwVh$a!=tm0=#i4;tU*#s3R`^$TK3^>O~H?|tYtSt z2B})5tgI)Sf@bZ@@Ww!gPj&Niqc^*-i)pAw&K|p>P9MGlcKo;F6n|Ve;}A2**SC4hAU{@2Cx7s_V28`C+P*D(-h7pBKC6Rl!=l#SrshTK z4}=Ay9t%%ekXc#x)bn)fkMSH}`x0m_c+PgkkHr)TntNzHizxSrUbk_toBE{wL~u+m z#=#G<>i&PoEhZgKTpIIyrm#;bx96&~CK(#);BCDc46nL5?0b$udVd1LG<6lW-OkpI zW4!IX-UFwR`}oy}LxbhXd-pz$!S@ zpqad2CEmS{6Wn%VXzd79{n41vd4du?<5L*`qt%2TkE#24hRjt2p#-C(ztSqwdZtAk z2^W^VTAP~gZfeD5(Acz<2+-O?1n?d>0>6T5?oGHN_P|wd>-%tft|qniWhWEXhm5OQ zO-)ZL<%4*2Kc`gfeLQF^qdkOedUAgcrV@>{5Pi@5Cw(tSi6iv9fOdm%*M3q)VdkLVk$slA4~(;*}3iwo(x#hK+%8%$p;Pf_h9-s|rQ_4YcsxXc&J(e9bgf!Bir2 zQK%B5fCk=Ftx>2$4CMhLG>5U~QNO!Lrqz|H@5=qY-}Q)bH#DEaL95bP4Z-mGkuDB} zJ4ZTG37=?QF_M0Q@}Fq#r}E9mMviMkv8TTe+d}e)#6wBdgoek1brEjJc&&6_QfP7V zAQEFhdUbR#Ly)+hGtylnInGe=Gg3QckOKHs78@n@xHOa)f_vQa@V-3i(iVHTbPchT ztEDR3r%t8vp03W(Ua!U&G~*Kl;qj?$N?P~xzeQTpzop@$N9DX!Zm2``!+MHxBs1J% zk9AB>LSk=+Dr;o1ZK=Y?81zTG?@-$94&mn}Xl`lDNUK8OxdfN& zpwepkRaza2-SB;wS{)SxeJIrER(Gh)?ygn;(PpG6ZFU21H2bDDBTZ?u+p#3n=I@); z>JE*olANmf5!1@1a&h}oRa_XnQe7Pgx2V7cmLu@V2?K(l_y0 zYniZurl#h!=?mr^`)bbet;kf;Bixmkm80UP8DXap5qVU_?UU-1K-VuVwP|3Rl1 zfb9tgWr-1$ixy4e4;iy6O^Y7nJ+!S}9>7mkKuAlBcxmt6X*Gvbe5G-3CE=w=aXWGO7O}Npx~nO36W_F!F%%ROG^b6S zlYR87th<#41_XU#){ompC^!Q|lc#9SYFZj%9fI)@(}c~51qF8xO`{bpxNObDS8qgo zm)4~eCVj?%3X;qIOBPozOc?#ud)c|wRW;$Rf&Fg&gjd8ivM{TN`x3j zLF<2Ioc34L=Rmqh86RAH^0fd<8#}j@n~?!9t`*T@N<#M08nG@+ zH;P@0llXOc%7Eb%1RF6l^}})9y~_I+B3A@YW|#ts`|3 zD}Xv_emiD|U}m|Ej+qHrKZZ#%Mc^k&SmAz!ok$&1^LT8UT`%05oaSVOzsC=jC3A_V zj=E00>5JI;S{{p=xri+d4Vmp+()N5Zigrl+LlT(yfm!0dM7Z7@7ol}G?k$>ECuBhz z^u!m@%B&zWez%h5n3l}*6M;>yRTbKzQi3&gOhgAG?k3vPJ#q#)mlj7SNY zS8v+6HVKBMTutsHAzKev-ya}id9c1yjjh39^#lJ(3nu7Q_<6$I&l6@9ZDBd{jF(uP znHK&dVR3uXtP(DE#y%CNonz(0-j5P4CKT>U%Cx7ysIfn6IX$Xu)3Z1Zoy3$Z5h9YS z9zHeAl$qLCEQBTVsWtE0nZ~!%ERU{clhe}l;u0d}>Ti=ytMx5vO{ac*BNtJ!t5rC? zSpA7f+(4;k92ZQdXN~d*pBP$ZMYgEZ9!6|JA>h&_)xby2_fKkd6S9DBb_L%5LGTHh#~JZscCDL`0Ipo zW)yOkHDO5%E)ZoXL{S%hh`K-*cEH2&P(rDX9fk@kmj+p&rn9C-YthT4W(rzU=tB@1 z_E3TxgyTNiTs^|D9Ys3AJ@G*%zWyjl3Mz5%z_n9`47ygZ3;m%pYY!`~OR7v5jY!W0 z-}8U>2A9GMN?2M&9ElEcTN$Ju{=es`8X?bxZdTL6YPnH9R@d}KFE?hwsNP$)o@Bk_ zdilR?eTTcNEnyZw9KUdSkGz+Usj-@{7v=|O2E9)8A>sL-H1RRs|4bPCS(2BJS#(pv z{sTWjA^U~u15H8M0)k<`u>W8gS055U2*&*K+DHcKFJ$su7;n(w$s+mf7q%aa=Vsni zp!!i1P$XUc4YrbiLK#88$>Av0e<8T{ViL}=Y0(oc^L02A>&GQkbpl483|dq#@TxI_5jND*b+A8}eE|JbAIHrya-I2WfkMr{MNFEVD_r1grE+KSJ5N?XV6UOO0 zuX4CQ2}f5i&OH*}{7GVIHeKAhZ0b`vDq6>#1UI`vZ95^CvS9>rQdXAM0y%h}P6^>B zk7k;aPPp>CF|jwXCP=DK_(oh!aCRLl zrZYPw6Q1@cE`IW8%sT~o3Pbai``Kqv+)8e|#meB`B)C?*Kx-w{iS)w#i9;?^&9oZa z=;MqtHy+Qd{XKG?f)n00Lf2xYIf_g3^~Gl_w$6<#FB}6&H4kL>prkq(-$v(LrQ$h`wH$4EAld3eeq}jUW(K20lB$4 z(Q!DQo~$+der@ zJ9|Oaw3>Ui1+oPlK8)?1KMn7&k%lvCOg&i&$Bmaq&` z_dY_BtO*4B=Cu$_Ueg`K#WFD?l~QwA;-W<_p7Wu_?%Y$AG>jHi(J)#L${kkM?hW>< z`?Z_WUL*Or@2k=sl9|S*xZei~D4VdLlWB;%d(*I_?V+ zx$vy|t%|%4#`YI149E zC?PIhsZ+)OP^U13K4!r46&gIQ@_hQW<^$niFf_)iukK_gU(3zo@bSubJ5-4cIWBd` zI3LY{BI|^1@9vYDgWV7vc$vl&?&Gf~^j%Mot|xR$c5!M*S@dyog)b7?VpOwI030+t z4F0dT8}cE`C~bn;C8?$udK^1Dnm-cic}s3t zv*gw~%Zrcdlox~C4agehQZii(p-n;iFz2C)6=)1uS3tGP~LUrG%6eEc==CENce zGJgjY9E3ApCuk~yrs=?iAVv2rjTIbhHxjtR1}^eEUUXu@1mC$4y}Uokme}-(4-~$X zFfa7csteEJUPMVEoiFeA8EL~J6y#aN~w&vis_YUfmqq19UxqeJ0$F@fPO{$Kiug>5w?ATe|LYQ6*wRs` z^)T5g;Es@0$4>GV-;iyOj?;-tJ(yt$A$qb?P+6Z5eRh zx2gCW8P7k;%}N`B%F<8=$>cFg_3)FN4aTh+dIA+#6}<#&$B$sS(+E^;5LDC;9+qzocw3;?vL8HUv7+fdt(qMsEu;3B|vywYS)C7Pr;)A zUn*(GE_^Q@kD)Z;TNVU@i`HM_Y0+ZBE^sy7nw^`u46Ki?sSx}U|4f-69e`gF0^lZN zp_oKHP<_=kRppvWV&uVbg1hz85HbfI{^#Vz*ngw*6C-WXhLw*3acs9>q=2p<4f+=} z`WN*TeOyn`WTQNe>L^@D_emBJrd5a+Y zKJ?v>;S>FK%C6Li(y|ba)O!&inbLX1AUDAp8AsrP{sX^5{{_G8BlvBT-N*jFYs#(G zg$%LI41<`E%#F{?@Y%erllG$G9R$2|9t~T-b-zF0#>xU~M;N$_hYefK`K&<#La)Hr z5UZf(BZ=q-IN+(sD9!{0$Zp1;H=4!?eVd_QltxKEMu~=?q}~FXxHLX6=oB+G@akya zit|P6lri+K%T2+t47e4$WDG(vPJ#OYW1FbJ4J{kkQJNLl*Od{-p}C+3A%^iB9D~Yu z2Di5h{VQq-3i|1B&`%qLf&3(Y_!zo6y0nA=o>!H5$|*g4l3IyPwK8x*W09@+1NFrh zH2Xq*0rh7;^o8wFoT$Zo4@-@SMsprL0ld&oW!wbi1v7*^2gKhx)t|EB*|@H=aUT74 zvlXoRK`;%LfXZdJSxQtWM=~fOYcg*I*W)CsGWHf@`>Vhp*5Tay;_GpJuPac9;V0H( zr`=^wYdk}Bt8n-K+V`bL)(h!qTm?o?rcOE%2L(aOA};jCwX;%h-0<&Z_X_EiIO10U zp&gn>m2c++P2s_~fW}`h7rqqdP7G*HvY0Q(A?}Ow*%_N#Mr6!Mu-b^DF@U}mpNk9V zA%5g;APybzL@~q*fjFEg4?ivoyW(7#Vek{2-N@|UB)c~TP-hSb!FWai?~aPSmIMkdX3!Ng!EXX2U`@ZEI6jbM#_T@Z>~e0IOGBNADzXBk1OfFmR*_g(qnPK zcKtZL8mJAUk0o7WM@y!?@m{nh9I^q5PA%ZLRw=(;Zhi>xlm9yo4^s2i$<39>GCB~h z&}pO%OO^5u%gqlUam;_>cOTWiT5i4v$zy+9R%FBlamyD6^lKJ}4L?K(?%dImnX+@H zOE6woe06m_bQux7ZpOE3R-7~|?ueHe{>4r228aI%A>Q{2J?2eAYB{t<&e)JM*^tUEN>C0uB%*sdkJycQSUeg)O1(O8%~z(o+N z{CF(&^*<~eTmSvL5=TZHzHO&tkW!c)r%2seQ&lxq+9+hi2z;EFN@LjVI^F_dN-hD4 zfMBHZP;b+r-j9+J2WB@X#nt7RX={+GimMtF<0*H$>i|9VJxowTcwtSzE2Q9fmbkcC z4~s8R>Rf%?`mIrtKCU2@7rQ8i#&5ZrN!ymEfv175bVmSql8PAf}d)N zia;~0%vNuie>mByPz=lu=r!;ctJhNTVJHrT(xMa6QrOamzjMVfoQwAurL&fu;gHT< zh(#4#{3RL77_i~2yxrKihBId@oDdGi0pH+-bf6BHgMYE~{ly~v#nSCPAZn;1g7ahU z2@6_dk1g!C@PcM%Hv(3hDy}>%sJ$#tE51s+Nc-alpbJ#&BftA`&y&;_G3blCSad`I z^~F%>&%Y6REOp(_)9M~v175IHe*u7=`1Iv;h+@}c^$V>J(hC+YOuSp^gEq^IxMfw^ zG+lD_wN@?Oxop#U7E~r!xo0V|DW=5t@M;-LYR0PRSfMw z-L^j^gTDdWmbT;fgu*NR!EaOPn+!U^Hb9-AC<9H#AjX(_lL`vIw%F&Du3=r#$fU=E zCD(k$70p&3!9JGDMp)3sxaPANOETu;q2Xn@(maH$TyPD?8n_N40evE_wG2U$&F!*d z&tB7FXFwzOqct^8fx7$bpND!NDAy(~59YP&J*+}h%J^jC2I{X2<_Efp4_Jm;uygX@ zI?0}p#^Srzo`COrJ3{l)?U^g$6iRJe3LbY`aJD5``*Es{@gg!?!XDFb6AP?Uiv;6x zfz#DHmTS0#^k-RJE(kPU+(ac-8j7G4c4Jftbg0ivEQy9CPxZ_dC2_3_Jz+B&N@80# zdbBe;I8E!0yv#@Q@11p6(}HKu^}1QRx@R#-(>Tpx4OdU$wotfJL-u2Iv!3!{s7)Jg zxdMA_W~B`pE-rmHX=&p$Tr7OGnT(_dl|%z23p&f{FiRO52uoTpGzpqpL@h-FyT-Ha zVfh`sgBi}TT!J*7-c0dtSE{fThTBio&Ill1&A7X@m3nW{GR#UA@mo2lcE zJurTkb%;M;2174k}Km+)11!0GOHA2gEINU zu~$kvuDTs*@uMo8$id=lo*=^-F~p0Q}@0HZXM zqKj_>tQpb_^4Cs;KUtctWY1=#sfx$JNJa20OV;=Q8Is==S9}X2{Y3FhV5B?XnU!2Z zPbnE`GQ~n@m*C`+zc!tboQfxnk#gY~o9ymCEK8Fp4mTOnMDpn1$x%E4n#15;s09L; zFUs82{%)DuP}?PQ&SD(Wa`FAo$(+5mQ|8Kw_aI!=-yw57&{@NI$bdE%=zmt`&cG%V zccFN)co z*O4XLtLCj5E(y`l{`SGYN;h6Z>|w)<@-W_}0RScY@IU?qF1YmI*V!>NEbBJ0{iB)g zRBg%98A+_}UAgUp#oU*J_e7Hh!slO=jYjXrRI16nK^XKgpFpr?r0HgKTXsc89gd_c`+a z6L+95P+b$5{W;OxR(NZ3s9OAX`^vD(;@+e&dnBrp;-o3Z@sNCJA@9&elHpE~CBW-<5@&AV0m&tu3ruZPa>tc#YAhm04 zO!2;u`y#my#}s#mTnuHVYfVh?b8^?}nEpL7`TrP-BmGM>?tB<`QNvS`v%TTjU~__p za|2WTVOK1fa>eB2V;@Q#?iJ7T1t#B@tJ;w%DD znG;`_7(;wks-4YdjX_>KibTi3i^qu3N}AoyDlEAXN(-(kEcy5l`%T|L$GOM1D^1wECY!34W%K>Q8=`(p*p{d?$gIe za&))%glM2VbN?DWRBl?apiDb!iSHOE%JczTwl(4nzxXYAiJw@5{m%9%_d3Oh7vhp~ z=oHqyAkBW!y-wNNfa_mS8GjD6!FM*#K{b6C-S^LE=|j}?wRqV?HT4E-a%#DE%8%;7 zx`-cA4fDLrJuw9sFSb(IyMtf9<33-Ct}@ZcwYwb)11;dn7F4#LD-L5y&wkg*wk&4- z^JR}vX|UU)!N1aD%1`ArOH>4Jkl@X+@dN9)?h12=b7#QzclShBM!eY`jjdOup{+Q0 zPN$6T$l)mLNW)zt;~Q+RZU4V$d`Hqw6~jlNy>J*?QuKlJGIWUy=jTX=;8wsrhz6>L z^KzsE6p@z`+P`q40<5BsYNbL%<>-t0uyAiQw;5NZiQ@B=a6dc2@G`iY`(`7igJRmv z1J?uQa~IKvZxPk7LC|26jeWXS+@)k-EoZ;QUh7YkinT2`HgKs3j=E!H+CP15tmRK?Jk^4D(w;$ML$LtigxG;q5aUZ zF#iOm7xGk6uQ8GF-@;5$oi{v#o2Tll?@Y|+G@ElKXx@3U^i+{4bK1}}(>D{dCKmSM zA&;Zi2#$`sU$v5ZXJ_%U7FIWr8T@H<-z;GGXupZUO_@4Pt4gvaP0K!N1n1S0krq*v^wG!Nror6kzFdG>COM)- z2Q^`6GmidnOZ9n9^z5Efx0$XVTCwYD60x`bYl&AQdd6Kd9LT&H-ji@G|N5cNGola7 z>dJ_2`2B%}Equ2tju(=(YMy3c@I4aI|Up!%@p^)QhmT6WBC+ zKCF~?AB`8U(i-&X-Qs0)nSQzc-dZ9{YWkDsgfGqLD(8Bo+tQ;W#cPz&t-e=XzZI7o z%6KMCMSSTdh%1y%GC*Nb>099i_+1x1BZVzaWmf;yTozXPmbU9n^Y~ffB`Oa!ubDb1 zMi~%4q@eIObKY$;i!(~+RqC={Bn1Ng53<`IxwqDGP}AKXBMvH={%R)9M0|<@PCW9> zt6d&80Ty{FJo<9gq#4h$xzA=)O^3TIMJRis_L#eUi0XkEw`Z?dZg1-hFJBg3wjE|EYi*2Uo!Qd{yo%DJ@#|DKS$p|Zfwb$E zFyaO(UuF)lw=eMSG4?JnwzKz|+x(`%$IN|?nY+E^(qm?E31!-Ry6(`_3)YV_xxq)x zeUBh*sSYP#_dIut;}Nq{y+{3ST@c!ty2A$N=)N`PJk`}v7tCi^X_Z-ALm+~`Nrxtk z(!C}37|IgenN|7Fk+#fKzRY~!>v_wJ3om`EUa8#@(YoKWe@31mS<59Xd+DBj=pH>Y z_MN~ljz@jG=OUNzaVHKWIm>GS6{lO&3bEp~H!?o%biNjtwD)lD-j{l7e%X5<@m-W& zW@Bp)%gfE>%Z&5VP37t4diGxH^6dJrv2Ix2{mgg5*#8nb_%*xn)USHCjPmT?EGMMp_jPX13|dI9gz zU~%sBV%6{sne5G-G4-t8AAeSKnz_V=%^X*AVry^B+Wi)O=b6EY=Dvxb;YMkqS&Sg! zbn5nU(Y|4(eRcoma#buBvFMLm>vlv8PB8anBIB?7zmi?v@0RsM3}%@7Y>25Yz6|}| z%VV29iZ=3ej#b6xZVPjg_(*m+leL7Dw?H>VJU2MT+&2aV{y=Zv?6DEnjM#J8!dIpY zZPrN9RUbt!2U9Z7E2qEo$zY7R&y4)Lb!U`0CB_ndLX;Wbar&0E(YMSo%3K&pW4=u7 zh%gTfi=D>iJ;r)Dc6{7I-{|*E z(70u%8wHQP$*axXp>1lOo}TcTqGB(Yr`(Dg(nX7>cj{~_bez62k?rTfIB^LzJ-qM4 zcXJMG@_M#5{oGjh)JiZ){z_fj{P0fQ@KW9OCE9_7q*gL5@v7C#guVX-cf7`BtPGe2 zkD2<8nWTPGxAz-y3*pSUky5JvHoZKyZpn$Pd<~9-`J7%ZHmhtaM86rP0Q&BA6-O8@ zcFw{qtjoGj>f2+s>z!tF>~e{ z8>d@Jo!hKVw`eJ0+|3quZrhU4mffnt`;4paGZqxr%-A1U_=su5&-T9sDVy(RY|?Y7 z16uAw$kSG`Y=0qB{UP_S8Rq!vza(qPd6io?!)&U4ah`Yd40HIr=j8{Bxcvq9Z0brd zK~t-PP;D=?%!-y4nQ#>Ou@T{*o(K-?9n9&>bgc1yC*Do@@)ob(q~ktbwTZ7^yn3dI zyVDa^`fhldmhGR-a8J&hTe4WZ%jA<7?`~uL>c_%;izB)PH4K^g-=^E$bF)@?r(Hg% zD!juK7%b?Z7o6>bMST;G2waU!};l*jC*cf2ip%ue|_a^J1eydrEHT`(uxNO_duceExFj^SJb|W6T$>$L-=bA zKgZFYH{fV9v&CbX62~g^@{{Y*wAxjxr>}qNe}gD=hM(7ByI}hhwhOQi>khA(JH5w& zLxXoP23IGTN-x3`rYMDK`H)NU??+>dz0NdOCaXL^b zlf`}>n_0}KnX7TPQ-`yi9B7FWFA-vv>t7@{LMH4y1>EBD{QAVI7IqP1@6 z@*}45M5cb$d4umcmA4YlW%%lkS5+Fz?`O(!aWn(ruD6Zv#+2WUi_|&ZwKg}&_Wi{; zRApMx!CBTkiKa8LB+S@`dQ%y0d@tH|H&gxfqGefoD~-zy+fFk92MptYyBB9g0SkL! zr*ri+8n1rMLdNneb3`y4 z)&UFuZ<*~&Mqw_ZX3WnQs0^CpeMBYgF;;1U?O3jX0%@lDT<>}#5ZYVG>(0rj=^@Gt zjTd0NbPwVCfVbeI$Y?r@vW%kDX!uA_wyTh_oQ{MpP`u#rdbL4SnYoEEU9Cp`2tWLD zybXW`jFhcBzi9MjM}rakpjtE$Z19D@Bew_VxUM7y=fN+#edAQ6iK@ZP#=gx)=@DbM zZ;N;bOIOJj{VeMd+2Cy>c+suw*5U{FtbN-q)h zf!!@s3v@XS%JoTLOrJ4W0#~8g?Yu&g0SqLpbD#rRHGzLIBP=#L7LzDthQl6RsR*9i z9i>H#eb@GKH7*XLIkQ`xky2?lcy_tG+PZMox`eTfVFvPHj&_O0p2E?wqMNVZG(qo< zPK(#Nyc*ory47j%8qQ9>sT3(OWb*~Z%ZZG!`D4Ya3Z1=d3F;3noE%=4F}XRyNV13ZZvD2a ztfV#8)J$vgsDx2Q_d$H*a7idckc_PtFZPs2L(UG)%;)g+2Vq?;gp;5#iW+KZfNfSA zYZOHrZnjT_atbL}E@E;dH@5oQ{kNzF644IFKca@lLEW*Nty?(ml*a_F#_?IyDZHTC z>S+fYJJ<9~7QO8Fy~MW~Yqn$|u9XAeq(jQ59dr;bMR5t(MCnSL@mES+nuW&qSX9IrH5~GD@*xXZIg1tEi42WzSZMnzKL2p~PW^QlPUF_oCsDd?x9J@X{7e)}T zOi-`SF5=94mIy1N%1CfDcC`3Qs^jw)Awt-UaV--V?-yBLC*(psQ1q=eRlIn2lv}@N!@I&Yhq!=XoDmMw zTZ#*#t~&ZWQPML};v9hb(T5>e?3N4fOhxLSh=Ar&vk_ zgyyKAw$=-g2sQsc${h|<4dHKBk+DN@m?FhI%GlKq^|?E$uOaHZ;WN62ov0EgQT(S) zu_8)xkS2u|dm)%D@>CV#7dj$-8x?v%b5+cz%mnik!BprA925}3s;ChE{hETruYd%! z0ftw`r;0y~k`n(r?B#$>m9<_KQ$}DP_%ZCCL`f0y{}XreJeYlr)8US6Ob9b!R!z$$d?l6h({m z(5TQFb4~mw6#&pDLO{`9u)?9tgNhG>u8CRR$Mwn%xABROMH?Xpm{w4Mp!s0VS2lxiYJ1_%_&vEuy{Cw9?qmm%tN zeN>-eWPF%aVkgDl*dU&dl(=9=03B-gNaZooc~tx3m{{q`_c4UXbOM1+0v?x1{kr4J zNK)66VrLznM{@C5)?QA{JGUy2DUc`mYI={F7CrG&BqSm9%$1VMDA#mJ-SmtmvsL&Y z@>D%UBWfH>L;Hw671WdDO7_)yP26`W>)AA^wy~adB8e1KF!ziM(oEwb8ih zdEU|y=3}GcRxBOb1wom%9MxUArk>uDQRl-TEQ5`?=@a3L#kez|(%7AwE(lju&t~41 z{}V3Z>m1cHx`y=|AI)PQH7goMpQl{TqE4NCUa*HC2Lt_(IBz1fktcQH|4@FE+et1I{G8NvMjj3?R`^Zy zh2OvoYZ(ZIG|@T)Ug60|h~uAOKmDw)C9-R4q_j2i^kRnpf`8v@5nBibo^uD-b1QtX z<-wwi)EMaxXG%Lp>`sdflnIKkSUM$B*0y1_EIbkEWZmYh{9ewSo6n-Y8a#6z*DJP< zLT>M_Uhy}PTmopuh3~cY`l=Y|*O53UvR0{VWe!438RP3CLH+eggYYdB*M)o>H%@%` zNB-3c1{hyxpJP>I;jbe59*XQ*6`Az`f7;9Vytij){P%%L+>_||c$8DUbEuKkm;hH=>F44F7Yrc&L{9~X4By8$iCT; z-O^fVcBHtA017iBq2*HH!h?B64HifC6(P?fI6Q^2xT%qlH;8~nu&Imc8Vyw6fXkoNx3%-)4Ou7~&D z&KEi&OaBFh`H{`4$a)RVTBt5&*uqrBlxddTKD>V$dr$t~@lw|^{X2gwb0OxcX3?)y zi+-;1zFm0vO5v%u_{&%L%g^-gEiD}SsF1U4pTd@VnW1C7P`>_AvbOZo>z4n+*xSHG zRqX%cXCGOXv$;HqfVq1BT@deu)nc(NmKAYTEI=hREfxhIvQpDBuU+@728&u3&=ibn z&nCHW^(ttE4-`wrRfDd0?eS`URr{eJKL{{Osq@63GWGc%u=Gc#w- zJbdQZ&&PslL+`1Uy2BlQpVi3rmP0#VQ4--hd-iPe?vtWzcI?kFU^-@!qVyXT`?acO z^3?l^r4>PG3aY~IOnB@wbkNQF#bzfp^`Ud)8>dd8gC^V$bx|3UapbE}I3uQ_nz3SA zvb>QVyUZX))o5JUcy4~*2g*{I~-NJEhiOLXQd(9sI$AtJKn{9g? zmYDWT7UTKE>S8D20ihAlq5CJ3X{y6@jc6Y2l94|3pm;|>JI;)eVIpY<`D%E;WIq*B zKd;hB9D%X1bl`ryh?Zrkg&&p<;(y3od=bZ{Mh#hg|ykDs^8iyT5Gi;2Hh_yAN0GJmQb{x zA4mIb=i2-Dst@mAb^&#Vb(6r8l#BiHhj`7_#>DXJc8?(VEKNa}pI$5qdG;Q*lLkw|HdT%!J71bvtin4~#{Pv6mrFXD zv3|Fm1gVyAl&V3_783`%3AwIT;ECH-Y{8Y0*^XbF#aqb69vQoZgmgNLv&Fu&+%35zZ5Ozy2C$w{fyg=nyq+0Y>9Cx>iMcJo+ zHpu)YC&{vKY6mB+ckLrTiKoH=tOwOK09EQq=fS2hW+YEs7REaLef z6qIXO6C}XKYIeg&)*e!Mri1@5_mGO+NN7m1#od;o@|ZwAf_Dt+vfV7QJ4JRgHnc`Y zxAWRRs?g9z5}qg|e7r4A<(Z5SCz>(9zWc1=h~FHNZURHnjilIxBk5{Xo*1wePecAr<2zTClVQJVk9io(85v$t7s;0ND*NRoFn56e!m>RlKchp?@g>Jh=H@($W zIK;acc^%{PUYI``M#ypM$^hLq0I$L39=?uI*_nG>3|;iv==$FM;X9%SaaZ2Zl@7YC zgKpXAF^=Z%4NFkGWwec}*Ql?&; zkSa}{>2RC}QucfNFW3>@9xr@*f&z=<0OWA74G+1?OvaIU0DL!@?6>>c(ZXtG? zHSeQJ>*(r#9c2Mvx-(+ zQq(zD(%a}b`d;`}E_km(T$m=>^T4w7f84AP%cqNaoy%{I`7^Do)>bD##peDBaq~KA z4>sh@hIVRExo*2=~_guOMTPQ!} z(>Ly!`sR3pqQD_e^Alxn81pA)Q*lX|dV5U7wwEOnYUF!jMRE3*r5H?~9x4xYIh_tg z-JxY+HO1PBgzZ=8m+6k<#|w8;)S_)9KYxSF6Bp$ajS4;U{jZ^z6a{qY(^#r?IalwQI@aZU zW`B}cUIyn15{FhO%cIzmxJ-T)zw1dMZiDXzSkfFgv-vEM>%f0Y0i6e96@MNeY-*T7 zDv9&lx=wKf-8`D2{;O0%UW|;>NlJw|Ue|mdHUgo*p$61)-|Vu8ZR0~NgSuz_@9=SU zZ+OS?`sQe=AcuS*4B{8|<>KZHYW#-x!{^Jh`4@fvV|kL2q078cR2)Ah52mR9#+fOl zBV1n28az1V|IXR!3L7316GL6~D3Cd0ua}!Y{(;Mr8vP+Z$tNv>qW(uU@!1oLk+<&G zdg4%Qzd~vVo&HpZvUxRSL;?orSA>seOp1>+$ zAKb6c?GN7PwrEiI!v7U&4qYi{NhgN~27MrSVAvHpe)-4aH;4;&{zUCBub?0Se+Lw3e<@B7if8C)s;QFtZ=}UCl7k99ImaI@i z547GY!;S&HRb89qr}yOQt)ui#sov^;`2FC^@&1|&oc06St_woe)mSO&Lu45XZc5%Crdn-|SHtx53;4blc7(U-zd>ZJ;e>&m_CS zw;@MmJOaP>fOkM&BvKhK!>-w-GV*-#EuI%qb6{TttN@+^wgGPdbwD%lDG;?A`G+Za zRb^y=6yRB)95@F200e;N4Wv<@sWN7iP`RNtNiP2Z&+~u54F+n8a)wc+T|hr%w1Br5 zyw3p}Vc!Pq2fFcQ_yHyl%!A((z%QdHN}|x%mZup^tL!KPm^VOADOVZwfD~W!-CGk) zhMq(d&yS)y>Jv>vz?7d7P1LPXl*5^5x^N8T&3}>{YE3j9MY;Sj=xlNe%zA+D9^y@o zGsy~o=YQerpD>sxN=j{*W-#R_4W>m%V;@ioyuSNPGQsLxgNXpmGJ_!M@~B*bZa&eZ zLzu0*5>2a-#`^7Nl86k=99|2$&BnwI!NDpGq`ce=^Y& zgfQQMcRp}0FdOdj2+DM!7|#??7oJI8gt#*%OU)+W!hKTnsVP!(JZR_gQBNS}qzaXB z2~F=m5$@?Nu2+-*qP0Q+6h~2edsqAt%DyfLz!o0)z0g0~YW<0&@oV zJ^-FXI1c86Fl9h1c)x(VwDe5!=IQBaQz(3mBmOG*JpyyZ%V(0~02SVOqdd23;e!(nu@R2LsL_Y`aoumi{vqrX&_q#ZKHzyd?595{BC@}x zGG2!Xp3CqbwH)mccFizoI{4ASXOq)kJ(D~d_yOgFXh=NCl*pIrh8$M#FqLQ{F!zDy zDc}v*rJ(%-=J&vI(3SvC07D34g5MV;9UGN7K|i*$z&w~vXXa$$<#z5|hv zVmHzx(?9o6>kx(~QrO^Y0+8vU5Xw}K@FxL?*2s^$%#Z3Ol2W!tFU`h}Yve~==6TZ_ zD&uL$aT2h>?)xV4h<5o1%*|-O4z*cfgNf$JQ{FgCkmZ9H;J;`y+N#K4x`jMYp=gt! zeGE|DlHAb4l3W`=0cs!!pn(WL1DF6E!tAR=`vy9u8%*7t${4g%YTf~}9H2hEaPnkL zZGAlWTH%(uRK|GJ>3v(#o&X)(>A-d17O*2jg%{yv5~0{v5JG-Z;2{xjTn+$!TL*cSjXRcKd0 z8tjj~jXn=B!Twj!E(71d9kyR(G=dfjWW&A%2!s6|;1}2@Aih_C7T_e20Wg_IQI+r? z07zVlF=vxCoDY@jl$uWh%lqZ#_&23yU7sBJ=lMIRX{iyTjO&1BfR(@!U=g50*oZ;7 z*#dLiOFw09GOCS~?}NyllDa^hO)h}jw!55?KBzXf!2T(5M^n_gC1;YqfxQFh|Fhb- z2>zC_Xp6u+U^U!0j$!-+W;D!RnBg!(A5t65z*3+L=t@x=KZL1*Ul&Y@O2)xuG>kAg zbqjtW$!gi^mP8&AT_hj|rH!M+Ij$pzMtd;yA%M3a2B+ISXN z2y6iDfQq7Cfqm;4sd*1f(m7BzwDCsNL}cmiJ3Ez(J1*fp3Z8$ZtBsEX(wEL8Z-==F z@i;L>@gwY;A6EZbPo~d78o&oY7qA|FT3{8h6vzN}A#4#$=Ob$4a{$kiN{R(BbVPrH zyCy?z^aUz`R{$1x7RU$Y01E&}`VBCQrgH~@#X;B6CLkL{2~+*#M~&))?vCF~QASul z?-D5EEBA)*N@pS?ZWvY$KfwK8(E^19S-`8n zccA?PW-q|=UHBBEs7il>>21)b%|jiErzkt@j{ziWYhb1UPs5M@J2DuGF)-Y(!mWjQ z3T6)pXFzM(yq*dUMt=m^Q*S1kTG}x-I+|!Y05^5?l++EgvLVs55VAi3>_geKfHrNR z+E@tpF@TI6Z@?TSR1W?QMH)2z_&XA+S*9>{El?ZBKB_iG0sDZ72z&0mL{kJzJR4pK z^DyY&0;(L;L-3cvJPgwV^E>eV3-)fo57pJgHbA>hv>y(_2@4=sY$eYcy1HB}Hi-Mkl)jET|D3i03*W z^^uwX@g7CJiZof^9B2m-?i6qUWdiQoG{)Zjg!kUF$)g@q8&@w<8;vl#kV!QvZU*eP z#-U&?^SteCX!(Jh8$o*%eBB7Q2ln@1KLoQB<_9p(020_=0w_h081G3c686mtcwV7F zTqUAh3Z_ugkq{NIk)jsniCbG*S~eR*)W5(x8S>r_@Hct>C}g!jzEt3(2hX}C(R2$) zhx>K#Tm@QyPXS6t8V9ALqIiCO4bKmNHVovDu!sl418M*R1~TWIm1Rv?yEer-4}JrX zv0JDCRQKh_QRmbm>XD995Az7CfO|8K(xA|wFH&FR!i_-)>LKEQU5PSB4?iju_EA7M z@JHaW>|ohLw286*MuLx=r=()%PpMsJ8;|k++&=&!lfK|XO;3WFo z@_91z(rlS|d6vw4E>mXio+~rQKO!?ba%ARBvt{N*^JV4(@Y|XpGw*Eg%c_voNQ@?1!m=xdHqeU~U28a%JWdFuQ=<0=01`kn{}d+%oi4 ztI(eVc3>;Q>?lH+16%)KFh$|J>2kEeRIW3aOmPO&JkV;u7mu)4VBP?fPoc~~SAaLC z8+FYj&ZRQMxhudk9)4LcXTW?GxV#i)vP5Qf1KoKjQ_u#1u}`aw4+CM~eF>%;_!5x9 zP2;;R8DmC%)GhpYfaIZn&dF0#5vX1^o{ERryavw>yoEqKo;R4@d>8g>z~A5}S`9kB z^Hng*;2r~WBTOw!D^Lk6fIEZ43BG-BC&R6V+Yv}n6JY-qG&M}5Y06xWHUxVYaPL|? zAGoK(Tn)SiOoqD&<`|g0FqJUFo>d!TfDE8-o!YnrCPm4pmth_Uz67lVxDI<5%msiG z_z?I4a|;-?lb7S_?a$#EBEA(sKJ2A1zXrykKf|BHRLS!%f<6h@3+w~F08%!fET6|a z3}z_IX@KTqe4gi{djUoU{t^nqsOP}58vbrzG3;N%B>B+6J_aDNlf0mtv)%V6yz@aj z3fv3(w=ij#_q>2Q2J~$7mfd-nR=7#HzreJ0|153-tpWD$fK1R2!95k24!j6BHmi-Z z5!YvbRvY)j{0g8p;r#%FVhq0yZ8QQr`HL~GM>~EGe3|gWrw#QdnEQZ#0GB{-IO1#k z2TY$A(ci)}!~78DGMLW*Zv*QP*LR?O4f`mVCSV<~1L;h`xBUeh@(Jt$a$m>yIuM2V zh&Y%c%A~QqjyjEbhU+I}X3a^Nc^=>ZLSF;Gw@HO@{~I#12sKoJF!Y-;vknNu`}`a9 z+cq+Y0ph_+A%Cez*Jt`4nrxXOYSqt5>Pg_EBd*e7hr_WmYGzr3{K=$8KDy0s);yW? z<)-EZDW9#StbJpajhpz-_Rnn-KbyxwUbN{|h${;Ar9pUiLH4C6FLgcouRfkHMV?Q+ zg8m-pcp3cQyFkL(@s0piZ$%jZ8-PuK4JZY^gCE)%{<_esHzwmvXTnP_d09b00lHW! z7d#oj1{=Pq@U2mgxv`5tD48E)FrNWTf%_KRs{kkL>%bQUSsj=MJBP9|qKqy8F2r*f z`Dn!Zs0#L7u)hUV!+sL@8YqXmyNBn`!hQ+pM_#*Os$ar;7f=-b_q=G}S6PJT3=nxw zllLC}4#0gBcn7E-@jC|d9Dujq=23Vzy#RjL!LP>nb12z5?U^O}i_Rw>Ii0&*x2-w( zmlxj52u%HF^73tHKMvF>m=qO-vWfs2Z&6T#vJ`pWiZ-5sGI79Og1i_}4lR%)BS&FO zLO4>#Y0UkQ^bZuPjj5<3B)+6qzQqWS;uS)?uu&P)&{^6-QSain;~4<)JMf(Ykmp98 zUoPwy@vK{b`UdpH@5{_Kd<&fV3*OuPJU@i*=peUQ zbBn$PlUs=~8f`FD!o3f6HRgW1fOWtOU=_yd6LS^DFQ==FUjy?LKIVRyx-^wBA81Ke z8Eas^3!J;(V47gT90JOWOuC{ylDa_g!pn2BZ2|n;;6DNL8N|^DyaFsWq5qd{4r>-$RYZcCU@R zXCq(djN~@*Y{Ji&cYiyTZri|n*7I?*u;XP~kxW};FD~_&xmT%;2>;}Rc zLDPO}PQ#|(b)4mBF+H8N5O;jm7R^gGEQ04@^$oYE7uxc4*brFt^rXvm{#e>*RUWU$ zsWBOa$^R$#wgr6cjv&+2B`Kc|HEK zHcXE;O~-yP)BY_^)4G=aluw3li%s(zGj49_&R7>xMOmyxyTm?A#ahqsGALu2Otm!+ zdzy#2zYo_rbJ*r#NR}rSF#)2r92HwYi$%#v5N`(qZ`8dG!s zzO%vSl24&8MTKuzU6P8T99ME^i?d{1_@$N=mvM%7c;}AI;oIK}xwk<mBX zM;n@4f8i;q$!RLx)I0toB__~=O*n+bH1V2Lb-9n$HjLfCG3rE@!jIYHurZo&=A`*g z#U;f@a2R=8VJlP;(|*PN6;{e(adkeDcqN@ z1q*wL9X_!Yf701>M_PR~k=lb$f*3oVMDk?r(rV$h8e?~eu;Is6~zhc96~5f8E){2T>*9raav8o zv?{g$rI{p8cxbp)6-!EXrX;~Q+~Bn@kR(hUj-8Bss1K0<35g`aNH=OYn?wj$ty8%b zI0&U;?LK7+T4* z?Cl{CAC%&-5;dDC2<(RxhFbjKcyOSM4JJWQ4M{z;bK*fJl=UYhJ0~fKrJ)p6&}bR` z1Mk(q`FlQ}-|>z0@>N~?J)h<$iDr`2<&22Vy@gI9qNT1Wlf6a6i8$N7_|^`)c4$b@ zKq=fm=z$t=qUU5_$TKih=e*AK53!#R=JAvL+IojP-5~zZJj~-@h_-u(Zkfs$uo0PT zZt5glbU@vQxo|Nl@zE1|q2cSel!*+j?x9E5eYh0IG-KLcxRM`3JYpr!@18=BZ&hNG zQRJ8g`3i0Os$Li=F`2DmS7d1Ps$TqJFI4_=SjIrxLe;X~61nCdY`rj} zpTKV@T$_oR|9J1n9#bpDo*0@Vp5@r|F)cn^kHbtsOv)(iuxFf@I5SaY93GzAZ&Pmx z6HiAFN(<+7shyP?CmmS!6SaSg&n2a%TD|}EpD2Z?#8zr^u0vZ5aK`N1Q=|mj zLr>=b?&{FExkD)q7t5o|2es@ukqmsQ-{J z!v;nt6<@sNK}Ds394WJNu@3FJp++1zu)E9K4|V;zUlOY3V|DD)Lr|p&0BkP;JT(PJpsOBryGw&yT^ZuMp3JL$y+x)_RdWrvwo;nCve|NJI_;w8N0t-!Nm^M#tyYg z*xQ7|XC*eLiP&C&TQ^iYR^aBFoB7krcE^diaYMD^hP>WBKL)bb1wPGCZ6M)ushUsn zr=KT$!9%sdLtbyf_qD(`dZ^Y{;8R2S+v%d+i^QDYP_5sP*W2gE5cYz=ch68Qf0M)) z*bLQgPz=ja*vh{9EowQpJDbXL+Te2dkVAgI+^qfOW~-vu%6>vZ#>sI6Djqj%4FoV#(e_QuUtRk8KFRgvdZvmX#fA=DQv@}IU^#MTL6!FWjs zt7$Iem)Gtt5aHtC*aGhJn?$k4N?V>hyiDu2tRfF`rH%NVBYrDa=E?6Z=ayAic26U8 zO@WO&^J}1S%XY@^w%nzE_$xhPS$XJg)f3({-oG2q*k!Ma3!f9wX^@asHm?^^AzzKQ z?9byGO=;?7LE^$VVf5O1)6;sBtG-#sz0TT+^g2#&4Q8xCx@Cr1#u}=7UT+OytYdUV zmQuzVrhWUS-5Q`5Pd!ie^n~lh516f^_0|Zz*r>OT)r%k0TkqA26ZF<`dhz{wt41$Q z)LXTBu|aQT7;%!`8O2y5^E{Tz<82H>y&Vu{_pJKSQV+f8SFJu(&Q2O9LNqw*ysz{6 zn%OrJ-}tAY2M7LkLf;|3K+-L)&8o$qo(Qn3h;<`FC0Kxnn+v1;+v!ciL4Wgs&;nPyIellI~cvEQ{Ku`yF(S_ zSFH1Ig0p4jvUYLWKPdWvgNo?*&e$!aLn_4BPXP_3*aXi$L!Jc&5xC3zeq_<@L(}Y& zgl6zzm)yL(#6KbT=E}*-C7X`K->)v(8Nfb%v-F9ZNUvOg*S0|k?^Yl zAxZ8Yy*pN6*Q%_O1vxB`qxldvB}v*RbZWNPAP2rPh#(U8=vEaw=ilV;bB~4`GX*(D zvnhfc5B<9w#+#)N{wFyMf*j;`M2^JWKg#I`P!`de&e+M;Q8$IWB4vrxorskGKvKcu za3?lF@ok)tW+EFUq^bS)G{@a6)%>S4!-X`-??{?6?xxuuO495d{54IPdj`_<_ok_G z&md`z64IQ(`Uq)C|2<9d%~HvKO7qSjDR1&SlI8^5^HJ`xem;n-hI|=JKM?Kz`{zx$ zCy?jeH~9PKEpkslId>77VFLU8AbH;34gTBnzB*X??co1>-um$r`?Vkd`6UAA3n;vO z;#1X$LD;&?8y>ZuA4J17EJLF;ply#e6s`4Spw&XU*vLkVjt&mSGd67G)2CSU;(M_7 zPcQb-r_9oeN9j{$>%|IvN;(wt=~L$D#lDQ#U!U?Ylk$k(vx@OpERx;d$xx-G(UMN# zJEoN!PdQ1lf%b4vibBN~Cwq(#W~Di#rH2PM9W`0hdv*ns{%w#uMDk zkrqX1&0tBYTKFZ|nW>n_%$_`9&o22e=AdxiPLY4BBkew1ht>W|N7{Ut`7jUiR7e_E zUb@@2oU;wqvV$dOH0)fGDtS*Wyu(_EUAuX(_Sr%5zECzt+{wOnD{cLq-3ke}Zm@RU zAbB}_$+BsL(P1SWe8lcKBJQcd+NTClQB1$lrRj3g#XfxbJ9YLQ_wxNNt}%C|dVh$x z&~|5hfVlaMJMLxW9QwS9@zn+8weIID(yE^;FLf97dREmg9W0iA8B$%Cbbm$m!BKJP zB+(z%uxm*4*VlZ(I;^*q^xo&T1^oDKz2ENFs2~4vn*MvZxUl%n>>KoWl5W_h!Hj}< zQ-ONZjmy{6A+K=ShXxZ10@+a{3eTKD948h-$5vSMGq)cFSt*b$zmlt-x;>*Hh?NTD zX#yDs)xf^$_A=1#43JnJ`i)+-^7iwf4+-?7-{{dRZjT1NSD;V%jb63vb`j_u0{xEy zy+Q19ilPf{v)>b9!oLQ)G5BC^!N`ph~+156TNf>aZ-XIASuPbBxM@( zI&+ehvHD=Tfbq~~hT6SO#Q6@^`VL}?CHpTDna@g@3Ci&XJHjX9Yh~_N!k`%A>g-P? zcs;U%19+p7ckptXU9O?W#5)=f%52qJoVIn9^`=*MLLF3PQk^^$SJ)(W*1z2dL6Ar$)cZ<3g_T?3cV#p`tvvx`FgHi%8$enXt{!vOkry?VyZfRyhC zGOrI1Uz~v>Z6k>s2s4ONz8x@4RtvvEUn3@3H_#>|(I0oDT_NAby8}dA<3MfW02F7i zJH4X&xBY9t^REH!z(Aer9QzU>LeuNF9p3RS&JDQ-$mfQ`p}Wm09vmo=1+#Mn@4pVz{#o$8)eIF>)c*Wnc8=gtHBh@j@VHZm zAuJTB4dA0PdJ><#QN*SS9B&TPJ~KcD=5L9K`YI@SbuPyYRweOVtPEKhu(1&5bjH-9wL*<{!FT3E+UbAEuO)SMrfQamsVDpdwd zmbzIM(`>EnFA28P#uh156>ar5IT|lJ{O$Sb?ydf_h%z}$ttpV*%_M%u8drWWA+UcU zPJ47PJ%;wP9oyo{4>^nzY~>1ag3X{X=Lgk!bo3P0M~i0G#>aIDmC=q2(<)!qlQU z|B+F+%O!d;L<@<%=87I2vXFwR&Z+>)6&;NB#O9OOUC|-z5@ONk2kY}g^s>~Dx#SFL zeh5+CRTa&zF0f%z1Tz*32v>}}@FhN7VV<4};c>*ojB~};QEo7a@^JD!%LaSvl1{Nh z{4s+n0a}WB04h!wi&sV&poK#cGEL@yK9>ohKCVdb%_FW4>HJ3C6*;;JB1ML<4+*kG z2D3(Dp%wNe!S*E~c1h|E!$DaU%|l&sdpM6Km78j#C9Ixsk@LSK{ek|Gx=f3cLTBpk z)^R#KUCE9ojCM{`c^0k7d+8og`A{BcAQ$WvhZUc#_$ukgYT=qX#0Bl&Wp=0hIpIPH zFw~P5RHa|r=mF2@0WK7+=~1?}A5qS(VEswdLfc8fSBUsPUXCOqLwevPTJmw$ixN6? z`T1pU`8}mrO$X++Q?uu{yq$CY(Vg@2IQb+wxg{;_CZE@&q36<}^s?6#8Tc^2Mx9*X zH#x8Qmf!Q)@7;kyx0qne&f)8r;TrX#+_nCzCu=m5HA&Hs3I7Y^_z3uyzE&&<22+ILiI-V0*MMi3WX+t zawum?Y`H|$dVp=n-~HGffo?GJfJ+Lq()t|?Q1v;0S!`2p?yfW zX!4l!W?woGx)zJJeE@aoq<%S=(v$u50VU;X`ynWMk0(+1wffqs)g{o9_Y?KHvazNy z`>b%?Zg`_Zy{9a=oSCEqe@V%%mK9)k%~sIRiGr3Uw#970Z4Gj=QH#WlX5cNc1|_+W z&ubr<*ER&8%daGYIT+hEwXI~=$zx9EF2tvk6?sva&-Op1uw9d6IMg;l-Ji`O!Hf|mSsk2hCQ%(oQ)7L>V12qj z7iy3M9`t~65niBusA-k6*cBu_%%bP@b9w!jWb99Ua66(hbNh8u%2VCaj2yKkC_@OT zv5+WBgowu~RZ?$!LOZUKqP&F!z_Xts^SK0Y8~N7;BL za=boHxC?}x)32S=Uo5dPjpP^~#m?^6&W4+mC_AfPJB!$dV4vBqok{Fo9dvbE4jy;A zT!f?ZB`A9G{GC5ZoEXuX?usCsmxdy@*_eS-SiQjgng+f#kb!aMVXg~+6O4tlDp5{)ugMMD=0Yf%9{V_M0+G+wX*(tsawp-i355SVsEjXBn0BT)yLiGgFc04h+EJxY{eL& z72gJQ*n))oH+!EF&rv?QcMN-FBtUl`H_*p$GIj|eKnUHeL323!<%sw7KJG>zyNI}m z_Exeob>1m$^3a%G%|D81*~)F~CnLO<`nc~%+8M-66#w7`2gT`kEz+FSqIbgBQ(m_7 zT8ZbMecZqL*ffC;^KCQb#S${6z;k9lBSf~P?~=4~W$Ed@GGE1xA22(QyV2Nl#EaBF zxQPnqR^k@=9xJt`p$}SzM=zYW>^>R$0r7B&qeAxj#mSuW8%^_<%&x&5hmsl>`vUQ^ zi=(z-eQ%xJ993|7(QCdX0xc$(fEl)t+_7HZI>)U-?UEd`+JBGN) zy8_3t6|S?IYO&kZ;7d*fR!tG*nWIQB#3bmAy^ru_q&BWnU_m_O3n@uw;m+UEiSD_Z z&Pw)0Z#tLco*jK$MW4JK7w187f{RhwPHRezX^OQ~e-Jse%f;K~Z!1_K#vlfhp1Z__ z7x`A{!Xr>JHH}1IHb;>G6xNh5w7`udRR<>O#ZhyVnd|#PBBchgTQ)myYE2y7AkY5+ zx3wXEPk7VyJl%&o&7sEWN-xPD-Umpz$*IAddGrL4L##JP;ayXV%zj)O(U%`9nlaft zTVJ2hDn-{DMdFB)o0=PGzgcgwH%Sz3S&q0B_bD%|sk(}k4jgBvkK|C|ncK(Z^%X*| zDP@YEvSS)Mm-x74263yjK4EGNR0BK2vn(^k(9R~bear`;_EtUHdvO*!c|=}wAD7j~ zzDtrqfBjIOV=CQJEOyLl5Elp7mC>})ZdS0f33Ii+dC(hA!jwL`1t-E>7-EW=xIXS7)IIi1Z_E}+2sS1M4o(YUgGW-1>f;jo*geEweiOH6^sx^R zAM$1OT5qksFG1gj-Ydy3A)zlRocugMekPKi*;TLea-#QJBuc34ZF0tWUqLv#O)S>Y zj1y~WG5+j+5_y~~Mq5=fagGudSM2hrp`?T(^cnB?w`ux3nm$g`SI2E&pC!cYwa_A- z?}37r?6Y#c7W_HT*b%K1Jtgkwb7@09u8kfgs@J;xFQM(Kpe9{!Fk{-_EW-0^p1Vo%Srk)=QV6Lp=7S?h45zW zX#5&vi9rk5rwJKpw))h0rsPXR8w*xXZY(6v5>yGk!RkC}ZzX{QKmNkLPxw8b^foBD zu3m=oWle-opTKqW;vIlr@Z-$}eU!r3#Y(l4L)BEVwm2dGC%$Fj$FU zh}aquzCqdcO|R#hUhZ=5Rp)JXBB5}w-o z|Jmy~*USC0_qP11^K&+WP%--6HR5}w*K?+qYwNu&zKZTUh){(AIJN2T59C9W2nvUW==!ME_xwrh73BgHg+-3u_B6ESY$w}9F zf-XzY%N+<~H;klqxYu*AmpejIbAHbb_mG@ig~L(_P-&-*~&)cK3RA^>VNE;!vwD;q3r1E`4ckBKn}b zH}+J$PGx^3V&{5;d?EHYdbypw?5Bb_UwJncIKR?B?Vh8D_qYIiMYR>&fcn@`Tc^XJ04rk~JZFbl@xtz9`9& zUnV-ZRq8;gH%Q=%XQgCSBcZc;J?36+o)Ef;eZ`xL!Y{FNKx&Q-j7=rSX36}@-8>y2 z90^l<=irjGsDjWG+7g5HOs{};D;3=#NH>-pAbhCP5A}Ltd%1^%nzxjFj!?&TGm(L_ z7-mUeoEYQfmeck?9n+)NE9>H85cuRz0y)!H^Y- z(O8{8iRi7Naa&xO(Z+Or=44W#o23SXHO6Ux|ud*ucy0*^Cf&PE&Bi=Cp^+4^flq6uaQ6-x;zjSlK3DOI6>cZ z$2d(hb;~44+E4tofKb*=yc(1whRC+T9?!)dZm=hvF#$}1i6PIL7 zTEkihDL;d+%Hdljb)L96%KQa<;@*cIRMOI?B&Ky5%&|T~CK|$&2j%(S;@$Rkn7H`{ z#lGxKtnHf~Pg4(fwFmW>t7KJ#iVOG|KU4m~+K3m)>G>YdJ3ZX_ z9=(;iExpRIEJb|S4I>eL+T;0K4|h$7@B};D4L{`2jP8`A{3Xvm?PW|7kHAO*|S1ktTH9XEhRb@$Vzq*>Jhq`YhhvR{NMY(+E&%$arAKR9{B}+Y5`F)(BuiN^N_js~#GL%C)m)B=n}wSmlV{f*wzD54VcM?V7}HABp>6bO0e! zeciPvoVt<1(NOGd;*AErxW}XK;T8)5b+RuKYWBN7Pi45rdeSGZ%)<~Nrj}hwQfS{! zRm*B2eRfa!%UEiTE`hYy!qV6uN21E?@r>)?GJ8-hTvGN)A$=+Pt=E^7)#SGL9?$3= zZcdMU0&<)h{`~kEV);k>Q&Rc2JgFmFsf*j#&%6OVbPt!@!yLNJ<`9CslfR^F()w`^ z^whbk@*P4y#jqa}KT@gnJszruo6@6!8a!N`Fk1*i<_(?uZ0(1LvQAQ~J{Vyq(u{74 z?(y_>bGn{FOk%B!EtEhBGU`fE6x`N#s z?>G`_4466>ADHVle_V^+??ELlf?{9tM&&ut&E4$AINL`^o4gDR0hMpL%>rX(82cwL z-zABswwt@rjW6Pa&TdCSv7~(!X3DAqizACC7f*AW9ZZ8HA|0Y&6hDi7`qxlzb#qs{ z3k6N{cBjZbFUlUIJB&%r(^KqA1KZ!^ch^YlPVxVsI=$_^bYvxv(MeO+deYyw$PX7OFM zjrJ|GD9bEB*Y28XXoIU$aW&oA z8aVdX5yfzOj)c=;P6yFtd{LpT>W;5y+*2nysBk*hkwFWsEWAw~J;~GFZf;FId(G2Hu2arT2VNPVt00Pe-T2BD=kB) zy*pzo_8gy3x~rSp)eTj6iak@q&^0uRG5@hu;5)p2BXfup2WX>^E*1hqc1-o}4M*ku}EKfSt`A@%pcyLl&b1X)(`f`mr{ z#E*4mD+2WLXw@7O8cCSr%26<(@3dD8>?$WeLu*gk)JpJDVgz=rIWGvV=00 zFd^WFE=xFLiO8~y&9dB^Wf|xE(95P3*fflV5!g<-ERl>QD$5d`Wf`AknczI-Ws4Em zbc`idVEf2rnaEh;vMiIbEPu$d{L%T5mn}hHi)So)fvwqPnao(GWLfUZvfQ6#Npv=Q z*^&e{17n#gu+_RO4=@&EmgT`L%R^a~WM{3HEk$56F&4AHR_C%zV=Spzmg!lRv@FXE zXPuXArod)lEVBf*BQDEq#*&_8nUiICILq>g^N5!%Q(((rELj5EQI};dW0{v_nV)6J z&ayn}JnCgzAh6{ymW2Y_J1)y(jAc=lWpS3}@hr;|&Ud_QR)H;-vE&JC@475Y7|YTu zOMaH6Aj`5W<6TLHZe5mTIb&Iop;@1igD1H%%km`SE6s^vQZ0P*I0j{Big zXEDA$S*htv>THB!Qs*EDllpLm4!@5?h@Z1FZa;gA=`uQstZZ>vf1!j# zGQWgGlC6EAt8Dr_O^v#wd_798Z2F^l5Xf6{sk2}EAt z?__6mY0A+QDZC9dCF?c1^>`sL7V?r5`nHfPjPkndc@*Q^b(f}Hj9rKbyQ2)94C(nR zLdlL&fxki0(%bfEm*>$g?$NGA+u5WW=p!npVb)E`eoE|)fNJcuBpTGwul|itFiZDv z7x!=%8&6zBhb7|1QUX!aj=8>zIoOPNQPDP|%QK^kGk4WF*RWB9bB82GLYwcVD<(7B zrY?`Ei%SAe9UCt2tmPi;V#A2FUcx=l#f~OcZfX}BOe_dY${?|exodBiP*`==#A36R zs02ko{Hw&j(x|(%e9;IEi_zHqfvsBJxU|uvY^>0^-{nwz28FqiUHIs+>&*Bq*5b#Z zwb=%66K}%3T@J}-8$=1=gh3xk7?Kk3V@S|vK`?t3)l6P+NIxWxE*FQ4p&etOs!vfJ zTCL+ob=CTJRU5c_NMHvpw^G;M({&ivGYM;L#Y)z%i}NFX<%+s}xC~a!`F4#cCnpO` zRMu(4bNF3NxiQvW~%E;egB3HH&JZ!$Nqn?#gKJAP>+J@b&u3xhd5ns%b17O zA0-h=eQqnxH|fX(Z~kcNMNEK1hu~}k zMpHg=GNvsE{Rgc8AA)YL%lD_SV-_Qn@VX{Nl|PjqNMT(6e9$KlB==O~$|D&yHg+eG zLeMFeLN#IIvmd7B@(FDuPj_j#ga$!$@x?psdEpN#$VL;?ZA`i1(+HEhtV zfwq<6o8d^Yrzo>h{7P)|nxKj=MQ&VgYiTUHPiou&v-YtYxX5V;GxZlY(mSy5B#yog zM++v{x7T4_{Ba`dB%G{DSs z`}kkH3vxeoavh!9wmc;%I{pOvbtm^V97V?;4>>A(SFg}JZSUG;-6>c+FvZ(b>{e-f zYE#HZn2NpR)2e_Twbc}jTJpMV2JSx=V~(XsD_#9LStB?ouFzIJO_giI=T9wo(HHaL zkXX3uPD`4r^^?x>1h%zv<%(tX;^sW6L3YsB+pl7s94C&kjv!+LNx`g0z>O!?9pABj zH#ol=+qT+@Qk-sAwH0rNOh;z9bx%2tlcZS@`=DN2ID>i@>QeuS*$&f8S5ke%P6lFw!}C`;*#poeM(mQYz;mIs|MH0+MS6NR@Ui7h@M5 zKDQTYLbhS+zwp?Pbz%~>)6dh?Sr|;ED{xq;eoZTGYi!SUB?;_!#2nmry3lL)i-|_ZGFwQ z&X%7Wd|aMXXadHB>_WG!Dz%H9BnZB>)3cS73f9Ch8$tFwwGaH9Buhen<(6U6s{Pq6 zH`XdN`OkLI7CO)E(}4BGVoz~GOj~a?7G~y9(w#N^hEZ4BUq+!Mxr+J4yNuKJ2z9irfbct2NM46ZV z%+m_DZ_(aA7M1yOLwxkykTkTY)8g@QY7Q5EPpnG7P8)GEIoD5}ZmR9!xgP$#%Ih({ z!p${8zYqj+8sln{JTC;Gl#gBv6`gh1W^k_RC7FNLL=$ncdO`(Pc4Z z5n=Inojwv{4iRQANIRxZU*I`O>F4_WWl=~6@m~Ke-jjU^A0t}me!d%T*6-t; z_iMa`_->|jYu(cS5Nkhlfn5Ml4%#+e&rlk(CVQGV;T`Nobx02SIdrHo)#8g`kiQP; z;ENM#)io439|I-(l|O20cr1z@@p^Ug?e}6@+%47VkrvkFaS?YH&m7`gR<`>hM^MR* zmyr~Drl#Oo!~qJ}<6(xN+%zyRLnj(!VQ=zfxIQL{JHVF?@YTNDAYa=5I}=1anrdI+ zo*(jllW;h1i|`i2v+psSTL(@8hk+eHIdB?~E}~3BFgt(<*mb~i*h!jq$k|g&ym6hl zmYd2Cpz?3>DL?W0C~CsayoA-fQR$F4%1L=hC+rO-1%e!UGk%rNA0@n0@T8NJ377e# zF!B>iex{P2Sqb0pNeju(O7gRj{A^43nortGerm|iagvYcAb*Fq47A61gL#g)V@X2R zzda1|#aaKBHlBx%khZp$kHK4oL_=YnBFR5t?oVI%qp>(7t>RAUZCN^w-9^A{w}#Ku zW?3ceZ;T}_t#>hCk}?q&XJ!0^45IJhu=p*i^TcDTf;vIdDmo~hsa=q;BISk5B<@)0 zm$lgMA@ouIUwkOTk-n_-xeg+WZ}tXM0+e_A9iCm=fj!mOE@_%(!+zEoJHu0+>Ck%* z4KAg$Pj$2eYgds_NhDWp$<%V#t9@rrF2wc1q`$2CnMV&-Y87}$zYybVGOeRSwbqX8 zC`y}4=)wmPcrj3De@$=8$&B5lw)TR$@OL2M7^`zwM#CE({&t=7%rIcwcKJq|bTJ#E(&c(aM|W*+JRXrt)I1#0UkZ$SyfaU;ZrQ8ex4)Dh0783y57 zM+uu9^U!yW#Gg>Y(=R$CO-_8bE+x?{A#qF2iv_pw_Y@J~NdG-WOel-)Qgo7t7a3+L z%El=o@p#j?Pyrnpa-sjD#SydE+oTU<*Yfne4#lN=?7Dnol1UV~Zr(cSQC0K)*P<{=++Q%Gbs5 zd$+Ltye-ClxXd5>x-`Y-?b9jL-v7tj`^PnPWc}keH$O?PN&-eC*e1bX@JAPdEof~E zks_e(BCQl{`z%m{Ke~M$v{qPW%2Dpo}pCI|w`1|zguhcqV+p4%XNTX^i)P+#8= z1OZ}DJxjOG(dPSea)x}8hRGXor;^|_ZdHQoZl8i;7PI>Z&3qE3{o3RrLhYiyF_g;_ ziOZG*-MDV4{o`E=HAy+!hCq!BifVt3kZx$wpQ<%$u=I$VB$_q~JL1zs@T50PHFP8;lp?2bMttf<03VwmB564mq@?2?;}>dyg2$k!cwA;X6<#4t&LV zPjZF<4v@+SB&_Oqxu&~yciz?%dg?q=?2-l-cy=kOOQGj&#rxE9?CgdT7(M|?=`Rvm zT=74pbh+%L5LN~wd4egk$Odr;OeoKpe@&Sc^HWO91b~?}?_U#sR(BU1vSOFuij`Tv z`w4I;sl}BXOiOIJ3ty|_f-d1wen5m;M+RRgDFiW?vW#R3;r_Ff5T?PD0Z0CldRR5Av4h?0a0&;!=#H7y-*pL`z8Y z6UlWlTOFFNFb_la)9&*kjWZvZPawx5x0a*lcUo%NsK@?g7sZf)7GkWXu! z&K%ivfNq^gZC`qk7_@Osri&cxhKLs#X2g>XB?JVjCwuPRnejFqRi>eAB7svxLF&MO zS0?<$tJNMm<(*dCY%dbnkfjPYUutb4dhR-ofGmI?77!KbCI|O6tfi*Kt1k{iUezf=`Wuj_6K+yv*jy#JyF0G! z{;BjPll)LVBadrLLX)Yu?)#p>SqQ@{{3u$*l))^>kPr$R(gYF_dGJ0e0N$*T$5$SL ziz8c*SI{S+dK2*l|LcLE&WJrVd9@1XYYh(zJWFt%l4?0DFuAy74b$}rNxlPDf-;Ko zED`7#m|Qr0dZedakgOVwh8Z;RcERS&j_DvZnX{J&^>WhJ`t-4yTFZERoF>QTbnt3F z>Zz%(aT6~d55@L;v%Tk=%^w`-obxd9>{_@uchOZw)&96yH|oQQa8ib_)fa{{-%aaVkJ*dzZAK?EUHe9blN!n5vf%m{ST#c@w*%8vvphLb{Kj{NeTbkq&XJ^TCjd5i;HvY2p z_CobqO=g-}&nWDh)72j^l@eR4R=QkdLvv(~dRyB*yNns{XinHD!kGkHp$aSgIuWT< z8jm%*r%*}ik;Hei>K@6v6Z8<#hzo=?!wKBY5ovE$`^0cUXp$i*AdN2zr>M&2-A8OX z)$X;ponUu-V{==5oq!ZLg{98E+60M|T7T=kcUiw^YTznwqYMxM0+4*5S zEt!lsAVsam9K~5LEh?MwZv2iigdL`m&xWU5ZQq~Sd3~a^c>IJi!m`EVMXfsgpEC08 zO+g4Fg3KSOQ&GYW0X(=%s7i=~}2wH~wSB0SH9bx3fjpEQ`? z8zw*^^DxYUJdel(2nIu*ED8a$Dg*iyV}dIwQ&dJI7DlFJG!>YJ)tZc%(R!4t>{rKM z&1mD)Em!8tGFmaMld+9#fZ$b7`j%sMr%%7kmS2=u{B$n@VHbWW!F zx~y&8SAQI2G?N|?Fp694M-R4ZKAbkXJc}R@gWZWTDJp2o*Bm-E4<`uy2mJ@~8>1Bm z4@7SoFRaRR$SZx*!b0_0)>5{~lsZM+1@LDF8;qkac3d48WX6Aid*8xt9sIbeef)=0 z#Y`9xT$TB!YA8+Br5TNx2jm%2%6Wv#`vw=KimK$EwgiJtK<1BAiwGeskyKTFs1Dt+ zLB1XAXM^Yt?AKY=-P@}o-FO!Pw?uddd>7Qk*iS?G0zJlUXh~>(ets}4Gd62840J~5qciEM^E;}P@1>xUK*jqaHuaJ zcX-BfMnWR%aFn1g;Pu3 zVDqBE`o)8`6{N+6iG(ge8hF3qQ$8i|3#r5>2lXvi>Vz`{h95b5MESBxdYi|(>0^;Y z)vBcG=MGj^GQKFgtVXq~vWmt{Nhwj~8}^yQC@dnN=y#Gon%ycH!nd z)lMlg3W*I9c133qWhxS+DB>gP1Qv3O3;GguCJ$oHg|}qjDraj6*Slm|`-`{j>uKyy zyMHxkjMz(8(v2$IN#wf319P|-+21Ol!r)W3;ULgRnY`gC0;jecg zw9vN{prx#Yki)fE+g=OH`Aq~zYL5=|!*8^J-&6SS^Z2SiS`ZpD+am@&EiQX}b>pbY z8N2M8K9*R%6Wf0M-au-ydInOl|* zxxASITz=}k#_29yXufoz{?dhbIgD*YXT>?I5xwZJ|3kghx0ZDKKZxC?Ql_YB3d5;9 zCPF_*y-k1Q{I30$J>PU#i$kAez(B(xgyU)DvSDpsM9nZ~v-y(>QK4c$kYkv1aW%tp)b-sInQC)Z#n#`9~yY$d7KAa*2o#YaTGrdu) z)fU9(>)R3ltc^f?m$S4I{{+bF%Okct_AeJeDc~L0Pj1EJ>q7!Bvlu)W+`;z!JDIha zkoR9?)|?%qAe$h5ymzn_B{?(Mr@t&Q%6r5{TZagf3S>br3K!TCM3s(7IJ})kLXyXRqj2ZAVQ^83Z*1n3_px6w_ z7^sc9@ai4o8zvDz*r}^pfSU~MX_X5gE#nFQ`1DZjjBZ4Rjw&!Sq_b*^~2oNm(ZU@lu!Li21 zU2spl;FO7QzRzQ%0#9EHDGZ=h;{6wN6E4_H6!Cg7k;5W`~rp);ZC#2JO7%~1#EH79B-j9&q_(fS!_GWr*yoHRu)hnH_YVJjTm)d< z#psCqc^c*(q!}XarIE4HAu5iP*@TqMOktr^p3eU1Cz_#;5|EObgvP&3!(k*C2?RdOt;cRzD>~aqUN>AF^7+9>Bfx!;H-8gSQDH zh;G}rgo;k34!WtT*nM{GE44e8-*w#crNSld^xHCzg3?TJAtPd|A>&a#V^tHqW8U4E z+dCf~y>x}b^FBwu?s8*UPl{t~{j05^bsEOph^;{qOKo3s{%5uZVrsBlCvzG9bd$3S z{#T6*^9il~-;E6DS7KmLJvy?ozmKf!!}fMFbX?;U?DWNTk0T5F`^dsx3eGWBwBlzE ztRs|hKbbYyBvK3SN778qDsQ4mSlI8+AlJUY}C=4=ah&{ZmDo7UErP^EX6 zGL(?9W_twxwK5k`K4Ao@q7jW`+ipLjAqouD_m%R?uBuU*gU%!2o2FcOTR>9#8kOB) zA2*yXcc;nwp`<~igj;Ur{Qq8~B84XqlK=Yc-6=YG0i_Zdvr)?1FUvTT8IVA4TY66NPDN zSGg>;@2;twY7@y}?+W|6EoQmV;b1r>zGnMLn0Zmn*<{N;%CH&)FKb4t*Y>lo>#s^{xOTj~RU z$44e=zI@#}+ib*Qm5il!R?1+yvds=Fqp4>mS63?dH<>0~5{`=+ex3#xk$QWvbYB2q75}AW>M$V&R*9 zC0)5CJ^S%opENGCAvu;{(~&W%H_`~#7z$!TJ`ov51f2Ic=X>IeyfFes zreThy11YPlwc!ca9t!dRqh{uSD};t#&Th_s!it!%vYbsDpOxL&Wf!zB+q=3I`U7g7 z(nfcyhJ}~ueSbwVjSb|#ke>uvIPV2Y9ZmUk!D)q*H+n+(oP0h(_)0B1jf|7T zDS`uY+s8QnHG#4}HLKiVKKjuN6F?p& zAnWLs&q|u4SgA~t7q5G=ZRu7a6OEbI{8`H8iQV+(NrUv;ifM|zT@}YBS7_noiKt68 zeQ*1xDYoH#TWR^}w}rbNxJmDt_9H#Fs`$XQx%OgvbKflGlqAZWnjmCbxzJq7xA!Vx z0T#dhkbvUb>$0|MOAcB|gFhH)@a`aXGfd_p5l}>M-#`z+aaATG8(iAr67=b+4E4%gp^*{~C@0yOgC^@CDJ^ID+0AjbWR2wuRM= zdV7@LQ?buku~Q!LnTF7h$L`Y2(YwC=ar6lNW-F(p1G`iau;XP1&J@w*Df|EfzWo&8 z>9st9ulxc*bTH4O@U{uO$u)eI0yCmz7urO|xVlMLC&dw>_M>sR48GM#y&rOjzRo~; zVch(0=r~taD{*va4eSq^ol9%R_svmeXSPL>P?rv+vyj4OVWq&XbiKT%Z=rH=X5UlF z#rbXG;AecZD^EoWeBw$`jp)i8WtI3@sit)4qz`x+6;k<;TbAUkOoNtpSq!g8IKV=~ zyvZrn6iY8FRuh0vGBUFMqI`zRi8T|e440)nvS2=k0C&*a1&TGfpWZn??rWYNyzX+J z_TJ`*d3PJ8MoccSYQ({Pj3Ips`7fZR@so==)K`4DhemXs2|=Bwk?1_}5(!0gozc%A z#&>d5G-fMfL>W|`SZE*Y&4D01AQ*H2`@hi%@0|Tto$%~EoiOmftrND97W{wcgy<(T z=GZ4nG0hq-b4~IW942p9IiI;l(DI24ZmX_6rG_h!zDjHu%kk$BV`?P```w>QDH zBygT1y2QM;O%?BHYBhR9^qNL=ca~zpo(+2;Y-`y18wesmQJE2HQP|u)soDNHQIFS& zu>J>AJS*R{OSJxah7NiV_8BZanBw1-d#Z0*KMt>cOPRB;)Ppdm@FKB?V_^Y3%DSiY zsb~q44NrK7ImcSs6xJiya=1?BEEL16U?55q)Tfi&R%zve>)Fh)S|y?oVQoS}z54{4 zi-Sy%4&N9w1*c)@RckR=AF9!h=dRu)P<~? z>oKa}5Mt?tXbYwl!W@9*v@53+TBg|h8Mo!|+|DLB_zHF_vJZQQb0v^(!oa8CI#BWx z=s$rYT&2dEz^;DX`!_YQH=t-k(X+pc;P81aE5N`yPYwsbRwlJXmTiOb$W#M*Vd802% z^D(^74n)=3vy65T_#%C)WSJ;$$MqmR-PBrhNr9-m)o0E(kqDsnWU8p1ZJ7oTs=8QA`}l=|BgLKgY?tSDqTk zHZ5d*k?`C}nK+P7D- z-3ta+-Ynel@tv1PZ`m;SySY8Sv@dqGZ;)UsY_lYcs{OQ^sXfxhl(+Y_Dvy48da9-v zcw+haneylnysgn3oLl?RpTAf>whi*{ViJabQ7|Z(1bEGG$^Nk&~{? zGH23rlIYe_juDkD#Oh>D$+~cLvcx`?34^CQwfW_em1$(Ee>`)dV|$&biVYm*Tz#c4 z5DU#{663m@8(i5W-_p6|le*E~ZM>W)a7||vf!DcZIzrKaanE zYe8nbn{k#as=kT9vUwkh?PDd8)aI8+O_P+94VikUNahiRIn!iLk=&COrWYxkX>xs< z!YN`rqEXH?xKfPvqzUw*G0rp^1K6mWlr(CYV1<6tep)h-(k$gGdFVaKQO@-o1V_QU zT7!+dEUz3}pq-u(PVL%cWz+hw&y7|!jplKeIJP?rW#6o{yvjELlLpvsBj@9rFu1Zh zNxoLFuC_WUNwaoq*xRz5$sZ$jJ2md&m<%yRLgyK(F;328^P}ghyRGkWNG0RP>qYuK z-xXFepwA51I}hdB=|fTRN&4!W>u<)-)=>ivY`*0_N2_g=`))t`chYz4aDSz2hOFv| z@>T91``LDqMg}?2`9|S#4b+UyF<$4f)8#ikt|+#Sef{kIe^Uqc6!gRmyi(j8Dm(A!Aqf zp$%mW;+%aYhhbte@il>ErryAclyg$yWi<&O9`C9J^h&y=yPjDYfK98w#fS)f+1v# zqB5V%d*iMIs8HK?_1m8$pB!O<8hosj)JcfxiE0aL6n!*H>NyfwxhOA;t9mj^p7)uU z{bPToEbrAj87gFPZ|-NGCH1r?Gg272jFGZtsrA=ff z*zgoT(~-5O%d^oP}c@gp5ZnQbme_|E8{zE8qQjP7YeCN=T=xPO7lJuvTH~! zIGIz@??^nLv#f}N&!MjQzxq4>tACojDGX=4x1fNJ<{ zT=VSy&e=RvL?=uS0e!sRJv)f+Om8y}wQ`jYP=W6*9wK&$0nfQ-uu8xE;eLdEq!Bg2 ztaO@HPM0+SmrCT$ig&0SCR`NlC~~ZF*c?uW$Cj(EYO$H8I|dxrZ01zky{$C@>(p_% zjaKH;;Z#cOC3tKyuO+;;5znX2QD$1jyh*(ptI0%k-}z#bS!p(_7!^3CSok2T4z*_t zX-{rk^O*k5F(d5>549(v-yPBa%p)DN_k$b!j{B)sZv!fo9$PGWpB0l_ux`2U_U(IG z8<-#0e7CRjZXfnUAXY>yNB9_>NcVTSmUYl>x*zr&xE?%t!%T*ezaNuyR&wZ|M7#@F>9il+>4VX~`REo1amIVFu=*6sqhwKF8kMFYo z2tjTGvG?R zJ%-&k2q7rn_4T(|IRO+Gox;9L@`20$+=u>qD6aX>eVu>qBU}y`t`LlxK6h;&nA|93chst1JZj!^N}QQTsRYks}2^YxM9+d{>w`rK~;g?RM;8#n4Ch5(N7v|VI*dO0)k*FFZN>tV(rrKkvgRzEU5hBNBkPv8ucdn^F zmVqXp5;$?u53+?JR2Bo3z{I%b#eJQNM;i5X2$ki1ZVOM7d6rE)Q=8~i4;`*PO9ygA zh@+7=nexDN1NnA}>vF+IVhoRK9jSwfX6S^;Bt9*|W*eRssaFi6Xuu|VM2_Hv6ot4N zB;+8$jh)>G7-X;Qp9tnSraYVdoUuXPC8zzU^Fr&{s1LSn*LpnIZ@HwcrH2-> z|0G$!!{7Cyzry00zw7P%t~bQP--n6|`rLPWyWEE`4Oo76gPhlIbKYUt^P!@>C~A?! zHTU**_KpkOWiP@Nt1E;9dZtS+Z&0a8r>z#vm!q`^k=i6?A0jQBCRU4X zncPw)H#xFWlg{Xw*{QJ=h=>HGGZHOljU-piz%-%cYm9FeROkEbLH2M6nL`AbVMFtw z-p)fK$TWqJIo9iL2R=O=bl|r)GIFV9Mdc3_>BH_6v-?R7LdU&?j+P${&3k)0_uivp zT?l|5r7>f<|GT%99JR(pdehZAWXlFvnxKW-4_fb|(6(d^oiUlpHBVo(YLU&C2=`FBzI&?(KYegcR#S zz_y|#KcXcYdovDkY$-{F%Z>YYy|zLr@UVOn#A8Ko=kp_YJWn#|Rci3l?|a>U=#3W; zWWI&Soy!kmY_qb52`X_24)ryc>!Jo*+KSNHCLy82HN>D1dH)mR^r>C6bChEhB9Ct* z1gcqeN6wBTZ9^|55r*wDG>7+ghNG9@8H(8>JlOF5slD!Ly|Xa;2c}~JLY+3f0OJ-u zduV<^L22Hg#HJVJEu(z7mIiT+xzX&Q(RN(oBNW%D)N*mbYvHN(@C17}RT*0x_BeL9 znZw&sDo6nF zMT;8YAsZdFdl^pns?d3X95Ke*Dt^2vf;ENk*3(g7BE(oRgTiS&T&Disbz-F?=#-i|^^}_uwIakGS0AU4s&qDdLg% zCD_SIJ)uoF3_A<NLZ{*t;zM||7QOt4I#2-ZGusi@mDKt~imGH(3eG?61QP zxOat?>B`-S~qGHRholnmPtXun~L9gK;PLgSla{*G+|Qs?%^WDz(c@D!i4AMG;CXeT)e$8QnWT1k zlf<5a;ak14vGpo1V}g)!j+LTAu{(zeruq%doWH7pyj^Zzi@b|BY8HAjVQ(A)S1@Cz zfrrs=WTucZQFA_;T4^d-;@?*MT)`Xu9@);1uo$6^oeVE%)t2nHLhL&d;Sy+1EML50 zP3sRF6HR&^?YZWnu6(a8IaW$W4%&K^E8oRTz`hbJH-?dhLl^PUFVN-dNTxtLhQV4> zuFJ}(N^&Q4+8(^V7oV`)EJjNTRW*Gz7S20Pt00rUzr^BxgI-Uh4E>| z1&jy=QhTC06U+TTZeTzXzP{(!*Wqn1Ax<@GF~>B%)ZL1-HU*AU)F$|Yr-T*0hw`FTS8xVXTbk$mryj*|>i|ug zXH&Stqk~(2+x1=oqWADMGvZdnos4^wE{ny2C4#SLtUaxietfu9*V9w z2Ja11DR@qyHk?VelgKSK418auUUQ)Fr8a_$Pl4o6ksy6iLro}_lgJG}wPFjo87SD0 zj4t9{I~Z(7Uu}3RE_NlbenAmZk6{*o{S3`EplRT19jWu*)1>TcQb9K=@Yj;YXAE&# zU0TLR;9Kll&`eB2GcFPv16@Qf7&9U-ec%?ms!`S!<$Z$}qTn^8MO!NIhG!40q&COK z$;6mnEKvbI4O|MZIH)5;O9`C~$0O8|z#T{|-ULU+AkrYGA%gQ(2v%5@zL}Cedrm|= z4niT%bxxB6QJ{X8DmbNWalwL*(WL$WqJZkb9f4rqKLL~l(Je5?QVn91@%|9>1>xm9 zzTMz_G|r%&i6&s9c(9hML9kSLX%LEc7gu1hKBW$a%K<_Ad(QJXrCHc|i@#R~($7Vr za{#Wjkkb5C=)VU@z6@zG7A!3GH3VG=TNv9h=%F-}vOT+pp;X^bgtRAW(FqWh0$ zV1MzhK&%c}8HLomw+#P`wbLoNEi#%JHT84sGYF}&uMndfVD#b^nUJIc4I~GP25~@e&st#{)2^u66Zb<(!|H_pii2i*ag1~g_seF6PR}Ta2(lhAXyQo3mbWI|rV}Qtu>#7R9sPW`CX4~x#aYldlyht- z)jxza3Nl00#qc2G1LMu!jufw>J#Pi^V8(d-@7SQ8)oeUdZ#= zGcAHKP4de^lrj{L>;>3_RE!1=!ZsmX$82VSO-S3!v`vU-A-tyH=xh^;ZDz4eD6yF( zHlfsJmck1Ule|qBW;2J`gt*y3ZWAhOW`#}2V69*ijp4`VOZgC}{+)9`pBPl^%QXLC{JmbDG^Hk8WUNwHhRn(ZRRqwdDBQ)j2$SGXd13MW>nrk8G=_rX(#(J)JZ1H#hAU!h0T>K`{>oM5V1{1My zuX-%_#aSq_yp6?ahrBZFrfzSejV=R|T$c8Xff0xH*2ZSfMs-V*?yoG=EZjETkNSwp zA;Jyz(BSCT^16p@^rnn!T*?Bo*=jNeeSRPV_(mYk4NnPY9d@BN8m@5-bcL&=v`z$p z+CabID!`-n3YSaU;8ReONG*&#KbCGaQ7bB_3$fd_6`)D*R7OiW!kR|+NUIQFz_P}@GPloNF|6|4D$f@SN$;FfCRwH#;-Xkeao|v=PPaTidT>SEsW+Av3 zqcO)dB*8|)+1SOWE?x{KbwDA5gngr3eM^LhwYjOe7Be*5HNy+I zyoB5#Pk8tOam}VX#8?*)t7u@OAy0m{h-Rr5W2xfUHE~UdB!=;9OhmU;#BRg>>r0C- zYKjYZBuWZ~Ktg6*&Qt!yJE$jObJqAZ#hQ!j)`dR1hPD+9Wt`@9Lz_MZwmZmiTidwg z>2YRPLGlL?dR5M3*!%_MMP?b5{KmB@@V1{PO8($mz3MkmwJ}Yo7BG^@nbSm!0WK*( zIIzZ0n@;pP%NoO6ee%pfn+O|-6trn* z)}b|3bS~}NoDSh4fg)|9ZMzTaX&;poOAd(ZC#PG}{oo*ces`>BG08S^_K&uMet3si zi;H?h?W5z2nQTwoMX1?|^~|rJhara#Qra@@E1mrF zIu!dg!l=P6EFgz)cySxJ7i);^{?b-70o;hbBs{fWn;aGHah1C~R#Q<7w)@bd7DMnm z+a7|0T!wQa>qNv*RQ;+!^+0O7KjEOipbw@gh;_ez2=htaqk@)p?$|+p@HMc6NO9;2 z_YEly9&7g_2R@XMB`B$XK$YC3day?sPKHX$fB|B9~I~$MMa+4%i34c0O4?y&yh!Z(;O-|J`o9b7f z#?BP+wo1PfDbZ6Au-djb2{a+dp$taDQqpAd%x?d(j^?9MYHWIyJqrE9({vSpx&^k} zg=TZkD)WL>=GRu4y{pVMMMbKjI6zoc6q8$|G!;c)*#~%Jb#3^DTV=L~;6i3X+|vpC z&2#N7w!_!0@f+LC349P1-M-T!HWiXDnvo@J-iXLAZ_{~$GX3G}+RYpD@@2NLxV)QU zz3X;zgObVBXT`aa!cB|9b(SwP#uJV3MskB37pP{%!E;;kBh=6DlN%Vu#3xL|YMkWh zC3*CG(saocICcFuFi38U^N>>MW#8idk@4YBC0%-@!j7v4fdn$xvf}iM!t+voL}PTX zg>WrI_If!dYW4wzE_v{EUr5Md~G>?2VU21cU-E>gPYkMCxK4x>>-SpN~UXzPQ zv6i$kmj8%tg&anb-Go@jIx_>2P>^fLbpiH z^YRFK<}%Dq$te?J@;B`_#$+<`O%)UDW?0=Zl28lDiYj8(Zi>*xR5J49Mr=V&xDs4q zc;_3Mpja5lYMAgPsn0Ucknuf-IhM?;E)q6tX~pRJQDiI_vSXpuw@N7H)KaLmbExEp zRK<9Bgvxa(o`N3#7=PBI$Tb?DTeGMl*O;Xhmr&6AYeSJ(vWnIpD^{*6#>{LJi(h%E z&#qj)proJ_R9?Q)DHf%Os|vR**IL(Ny)zc29BJMRLlYcyymJf>f3%Oc0?#otxK;z> z#|@1O@Rwm|T#4_G8@3#GUp#G3JDoUyU=TvVuzX5VgG=_(mizj)iOR=2U00;PlQP4{ zsrcD(50Sq)&8fq^r-GdopEZAZdMYfCINV@1C{E2?bF82gx}-fVPkp1i zP?2uxNF~Ps>>vlw%^Mn$jKgL<9hlf&|Ji9^(8rZEl5t)C>1p-3yY-)(Mu+7+DX2eu znl%6Gpc<|+nf0xI;i&q*p$Pm3Q)rVg0vS<$7TU$)Kbh|kZ;F9WE87#26^v~A{?iWV zbFnsaoTF&{%_@DBsmkmufv<{2SiFE?+7k6E}!iDenh%C%#W?Jz3 zE%N;&zLOwIfEQ#Z%P?&5A8Z3i>Y-+exxbMn5TCgOfHx+Bo$3TdhqoHK?t%e8$7kgq zmOavN*n=|@vVCP6t@}zZebu2r-j=(hXot|#tR>|QLld!T72(a$e7C%eVRFC;0*fCm z9*hLjGO3@)jlB)7SN1-K_%rxNt0CZ8Tx|`m4PX=U_(6l~51{&WJlYyuzenGZQ_sP& zz-HdqBG)2Jgh3nV5U2SoS+7i42n*rTH_r#@R7jOrOMSE>5!FEjL^H})#3-?Ay?Q~@91J=r|Fhl`hebJW}N0xrd*jh zH!L?-UX-g?mCF!UlwcjC-ityLtpghB7ljyVmVcf_@E>B}2#^OxVHrB>QE3dL&{`ym zE$7H9vnQeUMMfA8t4Mt($OGy-i|>ki9d;ZYhPIfTid5Ioj@e=++H&ix<;GduJr(Jp)q#PtHYZbE zX|xaQUFN%nNfU{d{$OH6VCbxURYEO1qa*4Ub-SPH_8uQV-_(f=*U#d>zxVsIP=X=! z4F5b!Oh%~3=WO(}H9$-Roy|G~XyN8F?dP2CdbHfs%p6Jo}CC*B5-_equ(; zsk30wCy7@ZKOPAD7QKR0@avI+dkvycR z;aG^LeNGr80}JleMY;71DeFw)f-6JtK>*xm8Hp^uW%6x!F zsj!3c786MAJR#s&LU%gyb0a3T1{Y{-xQ(0FV7H-hHX3o=6e-7f10OD0GAD%Sf$$FK z{_?eUn%|z8aHT^L^RV{@hh0tZ4rYG{i#d+2;m5RvF69_+OcihkYlCdwdM6y zto1dmb$RTKWpu_2N>OGl)8eu0AsBTY%){OcZ8?iOc@oNfc5o|a&*YW!2G@3|4$WMf zdyws3*@zb`@*A5$Qa`AU^JDhHoC+N(vM(q}_rJ0_=czr4wf1^&^18JNYnl_%Z8=X2 zty`V_I3p`58A5W0>{(|0@J{cejaL`H<8lp^KfJgae~q2B?={FNUw?V_zNQ3>1rXg< zD1@=BiIt2+GMObaZ-$lHoO;{ zPYWrJAjKv~!0d#6@(`%Btx)i?z9RVPubjbFC7QRJR&Aed+Wt_{_LN27 zLGN2p#51q){v z-ae5EhDi@cWv5=H6zS{B3evTj^ah>8^ZrfOd*QAce?skSYi+FQsPx-f^kTxyJ*mt5 z2}wF&0uD}6x;}iuniT7*e!`m0bMVY!o9laIT`On`-iX@*5|5+>KH}QaDiguGyHoD*ZdGDSp$HQj`SOb6+bXMLk98xYFF4qt^QZf< zN!8|V+>UM}o1k8vr!5uWp1^J{zp$V}my@K+Cwy$R#J-YOVA)gfoNh(ZvX$%q$>Y0> zOdNvzTl*8CT~hhPoy{r^uG;8}!y z<6*$2l6wl9hdBR^g`@f=rj0%fW$y+AkjKAaBc_i4+OVE`<~>Lp8}|$f2VOzyPQ0>c z89JfCr6MwS9ao=vs^y(|NPCf=SIF$a>jRL%yJth9Gbv{W+^JozD@`QYPM;9g8^FH7 znaqi0#4UyBCO`mbt5HATkcv=!pcMZv<9%JQ{ulB31zuk!^=}!ee-&4+JJsSjgtX^> zS^p|J5e$7#ER~kO zWWQu{KZb-NcWP>}A2}7POIB-dTsWY33GokZT&Pd5PF$Ri-e*-OFbu4l!cSFF3cK_D zn~21ru|xX38ztSc(E6I+x)y2&_}j3QTfYS=#$`!Ka1$!9hP3K?w91KovT%|wc%3ac zu?5t($)W&s0+C2mZaf#_@ST~Kd0bq{6~xmmbqW%gan)~RufIz++3FAwxk~vX?o1Bs z8MfoT4Qv;Yqxlkn2mTY%O65)6oap;{!aBwje5mz?3pU8lEcVc{^*yZ#5>JBzfz!^av5s-PxFZpo zsAa)z-QJT3n;7kw952tBS(E6lIk}~te7V7W?j{SO4`Im)Y9P|vMp2!}sOqChz%uXR z+vHaP<%VRRfaM&apL^HIKm&@9x{0p1K++IP;|^nA#0*6FBR;uUKj{(XM_{NP4$+)c z^VnJJ^Q4uZ?9(fsl}}DLiZJ>5Q~}>GZp^3^8Xh^DQ|nKjd4YZOB%~QU>})6DVfRdI zbMnc~$#-b8tmMeI0IJ$xUZ zJ{k0H&m|MJu6fMK&M_zF%W>yCoPF3aAsiQ;bT0&szwZ!PJ{STtMq?Q_QWuyF)x|~p zru=YR?9+_7I4O-$!GnQHOh4IYR%RzP3i-a_Z2^RM*SX!JMK8%JKc{S1~Et*l@@8_^ZbL>w3C% zI;B7S1wN7IL<-Jbv0A%ZpO$5;x20v-3FlXwLG!KFm})U7Tl<00ecctYW=o!_(yOuVvR}{iQ=@cx$Lm0_EM~T4ES?woVd2Y>({!Q}}=iB9- z5^PuLiO$lW+Ese5U5C)94?1M-LnkChFd=-XPi23{Lx6kmz7xb%m$gg^V)xvM&gXy~ z@5;U;gxlT|?!TPiU4va8gJB&*lF!gY*!6xu%%_4^H|D%ip&q2l51@-&ocD#{8gc92 zKsl=D@J%=%BZGCB)^@nnnq85ap{;&{h7V1372Wz*&NpuTZA;0pBNcNP ztk2a`f#Cty3N47~F$fSS&9H2E(k`X<&Okw}-{$_Iy72;kat8MOyOVbPfILJIh3jI; zuy1UA)p14@ST>w1j(S0^UOikV#7ZeJNV(qiGeTEv1uBBa#>kjo@Si98ij*rB=8K8Z zLmXA;IIgaw8a%K+c>}nyhacr$+<`(*ik|2j+awA+JB<2TJY=)iTa5aeB$fjFq4D_S z(x#8dlY-I$oIgB-1#coF5Wv8AfnW*ert&C4(9x7RDB_Vb80nyzT z?NVc6TP8EArG3~xabpJ^qp1_)NOXB^o!ARZ;n{+^g7hGT&XU%N1GQY9`L3ckFYk5+ zoM=LIM4ad|C?^{kX?!BdT1$Mg)idR=$Rmbmm>t`bbjc^mE*BIQ6*&g}5tsL+7@)C1 zC=QU}CDyDVqmTICnul;0FjP*9i76MBzJK=bPRd_W3W>!zT0FzMSUfug{{ZYFY$>uBFj9eEw*9@ zHL!!H+hU0`j+YxPpYZR&DIG4BiZpzBMB;F_lTxKY>38lI{ z$FmaqW+PJca^2d*Wpt*}sAI(TjN&Lc?6q6DGb;!`paZon05lG1|KQX!@3#KPbx7A{ zfZ`?X!R{ST)TJu8UDgQ=cCM8-e6+akV5Aa1?p6-I2XTw1YZhXP#X#J^sTU95G2>|? z0*@PB2?sQ!=KrOnJdM7u`u54hb&^@0gzK@6o=TGIuodaYS-f2vul7u;vnEAff~>$p~O zb}h(1xj*rb^l~Io{f}0VL9|!LzKKlA!_z2EiWN@3{ z+Rf;R(jQ`{<`$#8-U}{Dhw*OM?AdQMyf;m35Hhla2$ISvY@^90Jr_Lds z7^$_|DTvcSf@0|19)Z&3njU=C#;3J@!y&X<-jl?cDzF6my;Mek#9nPZOWGfjrMJ3x zEh$B4e^ELpvJ%aYiS$L77f9+w$J=nK5tkW(&fZ&hpm@P@O`iWS5R;w@l`{gnL8K1^ z!wM|Oajy0*@_;8v+J*tbi~O*D5}nQ;!yW}h@Xhc77Z?3vP+C9DwK51r^hOt2-28f1 z=j&aplRVFtyH9o@Z(yGu^7?F-`)pSi1RIIRX^0%cJ~X?DFJkNJ+}OpwMxG%Y-EE|d zw~mxK)#d&IWpJkl0TVvd3MV(dPQ#O!FPNBF2ZI|AkUai>Ui|tB~=~layNAii*Q0XIHAag%HD%S!ZD!M z1yrUk*A4r}2Tw(s*u^}YgyTf$@c(pJSEL|>9Q*>KanyfHX9x+) zYaH<>Y@XQFY3O1ng}|@i!S4VqhDH5rQ9&%g|GrCdh&yvJQ+HvAZv7R-OlL-A&F&c0 zfPUiH0OJSdBm^1c@eS|l4DVtiLICr4fZGYaO91Wx$#D){LngYJ!NP&{AV#cNN6#sp zK&bJ;z=Gd)!Alf;CLW>3I!*#q*0r4;<5o;ijP&~lG}U$VWVri=uN zCrJ|Om;;i`?8;cfHJ|M4Jk`l|hfvWFR4g{aNAbw^8)QrD%E;xY%-M0%AHihhp<-b0 zAn;${_I}JB;hXbGXXmG#>}Meua=tmgCorM_BM&fiT^VUXd1lzp>F)2!jIDWMjtA%C zGhbXkkg5-le-YwsE?KpD$8!>zW6bfh^}?94TO6Ngi3%3>nr=7ObavKuvU@{yecws& zU85(OePq_`)>9nfd;gQ&Lq3ypv_ZMD;9Mus6CcbJUf1IY5$2ne3TSqlDxPi<@fuYi zoa+%H_ybI7fEV~JM>YV+(>vl73n8jJ6NP#UH7VLa(rkzcjRbbaF;s%nVaeqGb9YcJ z@Q#8wnJeRkVTR!3vJyTu#ic^5^wf-z7uCyjl4s+^rn zuqQW75bX?0i0mjvH6uEH-ODqxCKqK>FK06kW96b7@Q4xG$os1Sk6?@r1evL}h)-uza zXfY^u5L*kjok?O-kxB(@DPFiFTto!~d+%tAc4*bs7Svj6)qFqeoS<~(eSXjTJU{*j z=j^@qT5GSfFKe&8_S!avljD$uen%Gh<*i+e%j%3h)) zW4bG%uP>qx2gONQ98XYC7K{7r#eEn7caOtH3VpGISH=w9@jD2b!M1HKd?^rKIubCrA9nVDRy38IU(2DM+`vIJeE7e4E z;E%ov8yaGzy&D&dlJuNs6&RzI$@xQGGPipXuYkVkK%z(`l&I|Q?W-9<1L^{RH%eA&DR<;Nm=v~l<|phb|o?&-mXl?fBn;*y^E1b_&>ajK3V9QBu{yP z^ejqqp1Lje^zU!LzQy_0O8U0>PLGsM!Wqe34u>BzXjPfFL~q#&gK$WN;HFA&ezn(o zxA{$v65y)J%6u7fr?I6Xday#Z>-Dnx$wd`ctU#vTT(G&Z>h%ncl3=PDH&}QbZrz2~V@;gN zG%5pr-Wf^+un>I|vnAy^^hoqjxI%GbGxz$`e%L#s1PUd8y9cx#>?q;L&t#nW#LQx%_cGS7%r;qsQsqYIjIOWKWbrS|rv z4zr%-W&L2U{b27Y+cVwlfaMC^+%j&k*luA14i*42Zl7UQwROFC+{+icW^{3>4%b3h zkIJ%r`A>;C&S1$Nlaqa4$y(SaOxa^h#<^}A2Ya0>fOitW)^n#^0d5!0?kuD+BH;P- z+*Dt*B)?JFJA2c2_2&6K%t3+IWy?uUEal+;A#r2|qYkN1W{8zZK z3YUkMQV!Wq-qwf)#ZhAE8z=jIJ?Z7-SL$u(psRat$%vO%x}~}Qb45Xc9B}Li?j1jC zI=-VlTni2zo@bnMeZd*5BtL10Uz!;(xBdUOIXf3TSa_Y2CLoS8ni8QUyrS({|J^Uz z(Y^m^dv;#;S=!0Hg*PkN6Se$g5~Cp|Vsui;xjfxBv64`2WG~KelhblcM6W{<0ME^V zcbSHCX!-+ATm+y{-}rUl)3eCY*D^?K#9cKEIfYY74Wqrk7Y&MKu%s31857joDb0LC z7W#<8X67YACs_`a?B*)IjJ^+zu=n(0gw+peU0YA~ZKbbA{S|{UeZ8~FUc0h)?znEL zbHNp|+A>;s?`Leu!-CZ|X5~qjw6|8;YnS%kViBS40scZaRf)|!b&KCXC@>scI|+OE zcUsr8C;OfqM!(jJe(>buh!A4GdNSqC8q|3e>uJ_)gR>5E+|GYR2=OUm__HT*BwAT` z^F*!A7{GT>`mo&tXBYM*3Rl*-IQ|sn@Slu?#@2r}e^4xe@4++n&rjCQKgqbm__rz5 zVv{&%%UQnF&M6PZBp8dciwg!mIwy=z4pxCtW#<+gHL9~S-J|#(V&1~a9)G>W>TiAg zaG8xUAKZbJgCE~XSttMv1Z8lhhK4hRgOwA8DiH(L`+Vatig!xN{jGJj$4B7!K*S;E zLQn_}cI1aOly=w@) zDx)$7v36{PA8$F87K*&%eX|I0c-$ln$=&~cdN(Sa&A#0BPHdeealG%;IZd*O9v)j!Cluv=NpVwMaA)(PPW9Uw!~E) zKtmj)0zg&>WCNXA*M*+G3q9Uxp2jD&ylPS8XKlg(Pde@v)NykDbg+gR>StiSQ$JuO2^Eedcv3-$cA( zY?c)p52ovnXz7X$SA9=kJynLr(+|YT*dIB0$>)@9I;>E+4_wKxOX%D%!(?qVZ%;Z2 zYUZV8;H=am42wTei3m>Q_l(4yTQB1NM^E2BhH=}xxTga5j59#(9DAkkr=s(8PShe7 zwtDjs{)3<}ZsX((F*#5xBHGr|w`~~F%OavnK657_UWe|a;u3b-3qnqo%qrO3v--K^ z{3Zgpglb+$KWH4N)?PQBPcJWU754NM_G}aOEtsWY#YX-Gg0mXW-gC0i52r!w0Vlha zx7fLjOC`^%2JX2cTtexJ<-hF$7&mrlZJjF|vZz*Mq>sfOjeSk_sDUIF0qPUweEvw1 z&bPJa)2|y{f9mPW>X|1H2 zZU3;RA6r+ETo7b!GEu8|est)sm>ZoRNs7*hYqYGj=m6Iu9vMtgr628CHHDnFrvg$J z#@;OBClg{Ci`_jKi*qrj8+!T-!<`_~OSZMg-q?drd&>6gz>Uik!Hgkdm0@TpJk={N z_&q`?rDaU!8aW?K1-HR?(jx@S+JP-vpjP$tsfNGyXfNu0J@$P)=wG(=`k#P#RWhl+ zvqZs#W5B{qdHj<^0@g`fE$6I~U}JH^El_jJWQu5y#3kW#y5L!n5QD^cB{;zU*zC!% zsJ3n%dOcs<6ZI@2Z*EwR49j>nHk-{<%K0H`;^_UGdeHl=TGz$yzKh-HFf<8$M|l`Z zHuu^Wuo8#IvbF2|zZ&+eK;c0!YOvOsM5E3D%84F3o*hy=%YmIj9z^m+#7mR(3& zn;6qh8#zxn!d;gwWv z`jVcgaQfJKQ8YTCO@#@9`2v2$m6)>}uAo!d50q7KWG8hu~(7!v?vJA+JbE(K2O} z8IM=>hFj{NuT}dv|4Y~5^$p3UkA6uJorQC)g3RX*npFJ6o+xT+(eX5-SkTtW`B$iR z)YisRTXPm@UE8|*whfE?WpCXl^w@Q%dpnw&{v*_Vl62f4P*7Vt7IQ(%51as&&Y1Js zyx@IEkCl?!UFNfL{x4qf1_*6#;3=`qt?lkx+wD~hpYxI!-DAJEr(1f;c6^{46rz%~ z&`;3pOx|WE$hM2%(Pse2sCr`ocYSZ{Tb+=G!n}gQ2{fF)- zVdyRfcjbng6@2D!y)Sf=zLTSM{jt06kHhtz?`7(TZu`HwPub4V2-kIxfF`ku#WiKCOj_0R zGI$|nXjPmnO^%UT&^6HxU>3M$iR6!TYpmun8eZvc7=&>ye{F}ntn+qh=Z;2}^V5%# z(m&_tn3+WxUb8H~#-VzLf>Ur#jnSBpeZtPod@^RKF)clzV4#y-8Jxh&h6U;D#_T^& z>$=s|cdN_WWp7inN0)ke{<%mWDPkYIoy9~t$9&jQ>GXE!Hp5}b`k@v18_fb1T=}SkX3lW|uagmq^SUCUB zD4x-2E2j8QnwqubFEP(sg!BjXW#wG1WzllZKftbeD3^~RKC^O+-E#FtA6VTae5UX< z+1kgusX49h)vIEbbo=X~bpZ%H0dE4N?xm5je0@ztfF_dOBiD26$}-aP49b{4c1Psr^ryRSWpJLhV=bl(!_et0CD&+^js0o{Rc zt!rsl-_l{a%e-`@-F6A+ev0O}8FUM;A`py>fA2UrM!Y64(dY*{1D}gLM%dky!`Zc+0S&H zvfTzhfBmf-oP8n>D@8dxGExrk?EMcpe1u(el79yOfL9Lfpqm?{b=}w1ci%AGv0l2Z zUH0a#Q}!^(|IZ>_)E$RaIP4?#khi+jd8}U{o*AIJ#mewen6R)AcfL^T#Ok{}X+;P7L>dY9#3YRb6%`2&JNetBDZGmaK4zZi&9*4`DgxMXI z>+Vm%lJ__5O03rb)ayKFPDXHWE<9VU0qOYU!7_F|BOZASm(ztt<(CDcoQ zWMsX>wky)u4H_rCH2w@4PDbnMJki%VOyiiB#=0*1YS1_W`%lil(Li8zlHI`jBWN5! zTsEPV1$$drIpU6lqkmNv7haFHMk6dgwJ9VN7YkFJir`466Xk#<$+fs-^=KKhFzk~7 zoVQV$Y<}tmQvNOChbHhxh}oYst~XEgy*bS6-@VMv>$1-RvpXS>B?7a_)X$*zJKv%9 zm01o?#Q!eY=zpNh_CGbn8yl6UY;=E7_oxAQO@vT{gTr=AG*>)0mdg3(js0rw3+mms z{1416#+?_UPt1{1P{mL~DSz%5I6^dJMa-$5A3UqS@QUzFpSdFw z&L1V~^5gM)km_|Xm424c4>44ipGc3L_$lwSFFSt5-}|k-Ddoqz@1zLLy$%b}%wc|E zi%W=s?}ljBtq&7ocnyZB5_JWR6Htma=*mYAE?234VboHzE_Lpeuko7#b%G0y)bfuI z9;H6|Bl%4}l>zWO?PrQVklN2k1&HWT7B%zGup77Mpq?Qof-|@!X zF3XO9;dI`6|`_0#bUTl5@e#;DuU56e-qAL@0mU88~Ur1*uSK5C) zHZr3@S%d2x9>G|0#=qO2KS>n4W5Ya()uc8lb?B+srst0iQ2tD(z{9>%fMx@_iQIH%}$q>OmMnqF(h+Ke#)bOO)V@}JA z`;VLBR2qXZDJ}qk4TQi87>6__joRU7(lLNEg|kU%W4f>zlDkU#u%B11vxjTI))rF@ zD%XczMGJsu4qonR&`I8g=Yv$SL8dBW{(3w*nZQiHkux$D9}_dul*qkP2cbC_td&p@g7 z6G_DHrL~`tDY>HybRUHrFwTGhN{183u>O6Na=hb%pnuD(tX3hmW?kF4ia^%`G+p26@R1BXDb_T6Lu=W*h#k>kOzoUwrYYv+h@!k`3w zpe{4eToG?5)m)99KIXJEX74d`1q}<(a8NlUi{JlER(;v;u1GTXO3XVX(eV4XJqIvz z738zlR-s{F>Pn!>SFW$+kA+_Tzf27nfVJzqG7|^jVWuIp^#2gr2&ReS9p(f{so}X& z^K+1{8JpteYt3=!K&sLmnn}JwKQ6hPG(RY*%%~oN4feVBgx=c~gi7^)wA{*OFFw{= zt@5wR65>}bS)aY|*x<3{S&IT}i>MY$*K>YHcl`lROO)A<9?KFF>ANmbuKS7Phjc^d zZ_+pa^mG5?s%3F46)nBVEh+y($Le3EsyiOOY{3$F|6$dk20}am+xF*$K9`NYH9sq8 zzS~%$c6Uh%Jzdz1u(ER%p}tukF9+=U^`-lk_dcWAKIz!m3CH}QNCcFw3&16?$a|jp z7y$6TlHQ+O&nf;QrC2OlX3x%LNXb{8)g0^36EcbMeC4`p#CX24;Koth8cT&Jeb{iJ ze#Ni1CMfd--#xEWjK!Q2;erVt5bGoQpHi(_@w_7Bu;RLhj($8_?z5&NeAuL1ff#$R zPUjrGQ{tD1kac@ryF?~Xwu7gU67{KbDge@{ro%7kxnj)xHmD^l|f{aaK| z##lOUa*7jYSN(m}diXtTSX(w5H^#1f{rl5_9dgEh6(U_dBYjv_Bx9bDmVDU1O0_CZ z-FCZwgX$UShAH!;wyu`mMJ*326xH4_P2csEtK;aNy5+V+qw8|#^w?!s{$kD*Gafp+xXAU=xCUIB>;zckQu*sbg8Lj zer!vUF)KPIYx-MKobmMy5geN_&Sf5ucy<2O9pac9E6l$JsW3*w3yMx0eWN(DWoqdg z3qvYGtff|q`7JlX#|g&Ty>Z^oZmYs=bH zEiIkDDc4_n!X;i-%W2)NpgPxBI8gg&MQ>}R_Muw5Ue;8zIQ9gsC5R5L4tnU0IOkZY z_79!au(u+g5(Wk}R;lh?hA1eL(pG4y0%drDjG@UVZS{a$Ie$;fPH)Ml{Ynp}vvZ-Ct)JdeE-mme_mlmB=yR1{aUc#Sk zhqzr!IyL983kEZAaPIOU0P+8%^h@j+KUYR4+-~q4=dq{RzWJT5`JHud724-_@_ht? zJ^om^VagHKnjAWHGu+X`m`ItW^Lw2;C~`_MPRT_EMTSG?l!kKrebg%AgE%&FrUENB z*Z7V)TaW{Hr06Nbv4Y9Gc(d?wwM>YBvm~g?**Cq@H3j50r+n=(OnJi%8VQ>ZPKcZ} zf}bNacUET9Z8(--lbHM>u)eI<>3AoxTpQY{v+o+xcDl5k zk&-ihm;AxQz=9!RYuY%j6E1(tro>CX592EY@Bo0nJ~XD&HP#D`6YJ?ig_k>E|6uIW z&Zt}r9JR-euBsaNNK+Y>gP{G#e{_URcrt8dum*c_Zx9x|Lj_c1)oVnoc;_!r#>mz& zb=39Gqj%(zYZB#xBZ(S=87pz)(W9|$Wm23O9TwLE6Va%*oFAYq^KJBki(<$wB;rjI z@U{T&>7nCCUF~=A4$Sy>ytO0o)_C#0M|j`;54>>#-m0Uz-6=!wA9d{q-b?;x{O}!f zr;B*~XNC^Uem{hd6d?Zr$k~ySp{k<<=GuF-2zF#tDawEvrSCYp)wC=b^^x&q0$nG9 z5g()r5&kApPC*1Vj5XOzxAcsxQGQ8Luha9R1#&|nQ>Md9%t7@lKWF?-qri>HO~mxL0_QQ{|1TO(2{IEqa&2HvaL zc}M%#s8&aigKXygodlMe?Z}yM-k2#vKwplAx9uY8367jV^^{*txS{*m=v{qG^=j zj1OdsR^d2Vu3b}OJZ6u;FAyqlT&%!9J39X6Ipto`c+cZ= zt4D$FwUm3_2(JoQp=30`e@0(SamvH+vxJg|#gZpGQdSA=U5r}xwl0i+Sja!nq1&B1 z)YaiS*dg|81W@>8P#B;YW@jsF&ugpAYwLz@I)VFK4B;mW<(w#&hj!oCA@uVj9Tcr* z=SQr4SzGP0wr&|eNrVsO!vy#Wz&{1}S`ogsLjhk~X6J|OKBs+NTkSj|p%IG&^J<|; z35xtTio7KjdAkGA-*<+yZ(Oq*+iHzOBSL^}p$_gz|DB=>;UM0gfFa zj-4GTM?rRQjVfw9x~Fz^#|E8+Ws9>dthBgb=K&us1Vi{5meH{i{k(pX(GHyMg8}WK zw!#LuPwy!oZBJ;cO>BdLVD+o9lEtvt4?mVj#y+(T5rMGFV4u=v6HLICC*e-){8K;Y z-zA5Ky>wtvzi?2G!u41QUIOe6^0~N6PV|3uDs95dHbOfb^iYYT10zq9k=L2F-?SgpHK( z_Y#?g0*=G;D0(ib$FT&Nb8bJ!DmHqcBMTcAkMw6nXcR9B?S;n1x>kVJMt0~NZx5w( zxPB+J6me|Se>#|h0T>q%WBjcY;2s3r9*BH~DDnv%IPsY(tq%|8Z9@Ki$gf2H6fr-p zBjpl&$rO1(5p`iQ=K>EL;qwxw@UIHM{s7(wV1o!8*?}RkVSzp!r_u5f@8wGbAQnLH zlT-9L=_qWQb%r$r-lCwEeI5i12)>2`VAY7ZPg2YuztQg7@q}RTiyX5W zYetBFkz{@bt*J7e9OIS-Oj6VZ`nHVU(M^Hqj5uryY)duVW3XK<)^Pi<>nF=ypsD=@ zA)VjT0 z_tws#^X;zl?PvTVC0uaLcN%@u;P8AX`g69}&HO3?hkiqPG{RdBEcJBI-k*r;Aput% zaQ%Jgvv$|VcX8z&{9kY_7H}1|dU5F&4da6C2IjNxb^Le%;hR9%IMm+ma(NM6^3Q#5 z7$3Z_>&R^mGMBUby#n?k zV1IjPf4l3Ic3n1udY|!wI{of2e&%!;FBbp{0Z47p*)EJye{V-y%nP~~PQH*T3pa=q z(kvOSOY{oY2<()%&z~g@wEWA3~;Bx$0m`F!ghSk`Y9p&X(2ZQxo41DDCWMqyk#fMAXdpz(7d4{EVZL`41tu~!=`_S*&T~hCtK?5ln zv|y})*^h?)+ie?kOW4d=EWbf0FoXhSL)vziZlrjMQAC<@*<%2oi76kJ)pcEt<%bOK-tfmgCN_+qlxL zJ18DdrSIuxewk3Vx6P$!$9F-4CjFWpO!*M4^SUqZX*+wR&Fl&I_8&{GCv4;VJ%d|! z+)}Dvlvmz=&2?GiLHB@B;37&*ENHKYX=8qo-OMvdRfF0RuL^+H!1P( zAGUG6tE^=RrluH}?5S4hr+Uhzm0_GRKCn14;U_MvVxV|x@ghfVK*B5>vZ%#}tyVZ= zJu&m!s^Q0zd+otSDLLW&^q{r2TG6N!wb|I+=lLcgtl7}w-hF=E6s4xk3_DPC*R$ZN z&NYLdLb-XtzUznb?)%U%D=#B43*i^8-`4JLgT|VrLzsT51~&@z!r8!Cv|Vk<_UAdO zpS8B=IRq(ndLGPNb)};hk&g0WKZ>!naj&e3(@7Cu7duqrr}*k-GKJTRDDY#o!U7Mg z%ePYyx5p(ZxamT)SxgF61R>pO$Acw%GVd!$&K0_KdvSWTFM|DJ$SlqtaCpAII2fnm zLTV0ZxKKDJZnf**@tm&WCXxT)R=cy+)Aa??oStqNMrgmVkM;q)o|rz9{HEhB^b0O< z4cn(nvi;03ZQl{JFH*kc-)ZY##|dvah{IKj3k9j&c$eYkBM^4Dl+H>|<{T-K%RS#8 z{|$e3&*?+p&!z8}flYW?NI$j>-B9ARz9*s<|4mwRtdK*@R z6o00~jje_p!C#>I4vc+HTf}IeJe^XT)>bL3@a%tTjfnk;^UE_0in^`#u~to$B?Zy( zVKZ?mSe#~3AHw}>EI*^okxv^I{3gN&ZOxU~cBfwrz$I8LlRmADY+?M5H0*O@ABiI` zjCeaABXDLlC=D!P0nq2u#p0eVddP_d{J#Wvc)%g0OcyISmtaH|uKFNedM&DGt9kp_ zHu5bmHd_qL8)GZ;VV_t_>`YZxmJW z`k5hox&Y+^sACv>eA|Q>&9|)xdO?A_O*fv&bg=wv0@5nlYHzjbvL!wcA_E$5tw_fuC4x=?v<{LU~I~azMe=R#dV<*^;bU zeK;UV+?OYVS*kK`+T+=I?kr({PuRw@L`^Ad!*s+2VJ;$Jt(uZpQFbh-7fu1Y@NV@j zl)@Ea{`@KPh5TZ23W)bLT3V~wByk7Dm)|DJHpT79{-hQ0_W+WngoY@r)nk^b{vyqM zb~H04iAlD{oNP_f8Y8ud4k*my6D5sUx1I6f4^cmR!Y}6wkNsFHZuE&;naFlL$i$pz zeZnU{uu>Wy_GETKfg@X<;|hv(X$*?fj@p{mO8@V_I4H^er>8;k{hUYgR_^!)2m4eQ z0_~Np5u?XcqbUaPdx*K(Mt2RG9fO;ymT1k#RknubmhIynIGTv)*u=o0Ccc7LsNLHN zRo3x^XU{|L#@Zy=Z?~F0_ROwl6;VuH;C$GwFd%7mZ`8N^V0@(&?$b~N=Mnyb?XBy5 z*84<^9<{QJ?MP%IbZk)~!Z|<^Ipe1kc4|t4%tZmEqKH>cL9rw%c1kO$(@LYi)^y7` zzuYf`NGy3_OJkmIT_WArZcxQbnbAp1n?1VWxfZ(-TftSkxuEG_TE>k!^dA4TC^dvW z`N+f2fvV$(_;Hgz&_Xp?)#}>NddBaToZ8U9eS@$}P#CF*xCh1uj^%V*V8ra8zW-@; z{ZFg?e_HG8M|dX{gNrGR+^ukzl|V@J(c0|hIVzB^dW%!f25kjs*Yop4+C_*^sVi#t zOj4w@;d_gHV~4=NoK~If($HhAuDPvu`bO@(-oB9>!fz3vk^n`TOM0u&H%zV6H?n`< zni0WdI$7RKK-xdF)=m@pMk=6xbR`0z*f(%pZ*d zmpW;xF87VI{t?_~sJpq^qPYL6!gEM<`l+t23U28_U+G_BM^>$~4+hxnc5irA^K0fS+J+lJkug@ybe4x4VAfF&)=<=^NYLn`apns22jnY zmsPCSOG3T)?_7%;g86p^h+IIl0KzOnyy#Y3^6)ust1{Ed@=l@NE8Mk@xg%9WMAGH@ zlegN?ZJi$q_5RvJQ{g}f{Gkw0jJ?D{_mIIH@(i&q%#wfc;JAgbR*hx(Qi1MlAX_w) z>vrV|{EO=tXOCEcc%5~0DqFuXn14wCeh9$-1tyn@OfGZ7o%f9f{;xvj6lDGhnHgf{ zRCfm=k}&qY&9zm{-Lm3zzL3DI={^^O`2wMY0VT3fB1J4Q+nv(y$v4%f1oKY{`5NSB zBmehezRnGk)sonHeK4Ob`V7OGY8>E^MHWz_KSRk^L~ z=}y$==!w`;k6iW!dQL;^u-a%^0Z+3a|Z0fft>g$$qIBaj>&=0oj|HVSYfo z1*AvHopE1j?{#+;)FH_JsKmo)S$`pR5F<*wn?f9?BZd0)yL65Zhh%QoIoF*bVc@;H zZA&9SeF7+ikQ=(;68iQJF6uMoq2*wllk#7Z21IQq7j_P;yX;O`L2|3E<6YFF)B0)NK=eZf_Emp`YMKXg1CE{`nW z-Ncfi0Bd3Di@c!ooe?O#;?nK*89MB8?HnO5yO$s6d>;u=TL7g5KeZx1HG;g-tu7j4 zHnIG1fuCYmty$ow641V`O?UZu!^@9xgG-nR;)tC}v=M9Y62Fl%!AtnwOK3p(ObNz0 zb?@paPZkW^`(R}OR_o3b&%-!_$m^*zb6*nkiM@N2dAF+fs~D&h{Nps%&i^kXPJ_z% zrSvk%Ptk)4V@!>C$t7%BTfzc9S0RD{C|H)0Q$Sf*Sh2RWCYc_WhaHT8QiBD~r(^vd z!KSa0f1XGQU;(A2KkfSkkJcT9H%fOQ48l)Pxba@TgMkZ3=~Z(vHP+%CF;BT3sda=g z{2&P>UX>Ta=;jvOEplP=K~>)hmurQ~zQR>!+sr>t!2Dw_&33KjGZH|h zvi46d|BBMmDR5|64d0SogkEqiDp%Gnb@^ijI3?Ply6ed&&YJcGu0fr|cIP|^rNR^P zNDEh0Dt0F^rR?25l!~@n@x8DZuiX8=h1q{}7>56YSOMZ6(JaeUeGj=@GhFtmt~&dA zK8?7C+?+vQVJgF1c>PPPFWSD$o5Imr137#dfe5B&bPRqQy+Ir#5B>ocM@yV?CA@j= z){&d@+t(=ZRrKX5SNdEamy&YjeHVTd{*S-#try=m%(d(_L*90!OJ^s;v?DUeW((T< z#X{ZNjAnPh_+9r1iDRIj2vgOmnK6Fe!i_;@c{1tDi|hzCTzF%CRWuqJzAcqXwjXVV zrC&r>oD8A=?BTy?;e5F{)8oTf)( z#nstBR2DAH8_lK|n8FiiOGv1gLUhCH_A_|*w(4*U?ikO8s6OS%_DUMOt;t}f^i|CW zCWO>#7JUPjOW}oqkqsAFE}^%j$+&F+3T$G0e;C|Bw5}$&UufdU;mEKM%KKTG4?8r?~8KVq_9U|Z>yTpv!895 zNTvQo2D1OL-`g)6r4~E;#zuZxOQq6cmzG@YX8EURO5|9W!EBZtWETa!GW1?uj(u_q z_UyM*AzID!#D!cab%QQ@Uf`ql(Jh77QM>Y0E!JrKH>^UuZ4Az440)QXl@v}bOy0(ln6IhllrIN?QlU)wa;A!A58GbCzjry=@*snHovQD0v+HuR{Y-P6 zp+raiOfl9?;fdVkQD#7i=u*Lx5rwu%g}9mEt(tuJb>J>)IyZLv+sza)(P}s2@i}Xq=h$Y zjzrf8Q)ojP#$2FA7e;<@8e+B5xLRY?bkOCEz{kJZY_AnWhe<*hq{P|oH@_P=;1#oG>fOS64_69}bQ@l(DYtpgy@;-Es#jkf3}%_ws{br zxgyHoV5N1wQnVkdAP|zZ0<*3x@40K(TCXS;g6>Op*bpLkb(<1WD_ z5c%cXGgS_mR3C{~*?paxXCMNLb1s!qiW*GsduH z2gZ4sdSNi;%#^1X_3mI^*9?!YI%)K>)b+b_!u%~VrsN%mo&BJJE&3BvvsGh!uz7n( z^Rnb(S=6jbDKVAiNMVyxtmE zx!jSgsC?Fu>{GeXk*uuT;Yjw4|IlYS?i`~#BXIX}d5l$Slr%?8g;6^(IWfV3n4U6* zn^>$xAk{jV#37a7gFb~v)*)rN8Mw0As=b!VD#ig$>X6dseiFGdhg8PRz~aI!mD{75 zY8{RI^}{q+M()k7;2o~9obSPcitQElirU;KzjR0uIz~U|ORF}|IoC`cY z4yg}NuE3+xAytClaynD{ze>g>ZmD8MKZs}+2Y7e?V+`ejUOQ?+8*f;u^_hU3))1Jwgc$r=ytoC|^O z;DD)P+~AC(@OYU~RCL9IuhMaY=4-wY*vrQ@7%G)Rhnt?@#*dM79W0q!G4`NgujnA( z@=w(lFUI?PazIk@bj8@Zd=|F#zS<^NT~nRyq`kI@-%FB-`S~#SKy=#j*KoD^J@Gz; z_5J;_thj*wA5{HcYcBW@hU`5}d&eU!`|T#~o~$@c_Qk^qJ|PdiR__ztAJp=L>f(=I zym(=HecITh)j@BJALgO&jV9M?AoV#ss|$8Deeu;p@4*u7DsNgpuBN7~WnDncI?eOr zk}6u}R7KYWg)HJiQ)t;C^!w7L&1~>%Ipfhk_!Ui&yU}k9$};F)UR_)l=BHi**9k?* zXlE_#@#}J+OZcW-_57S8GwfKI(*Z*##Uh5Bmh3P#9Zs4R@Ww)mgE7Apuy1|s^G(=e zceE<`!z6&sIgyx1Z-)0h*W`Mx$^KMRojsjjPC46W(Rf#WtT?VBtaxVef}*RQJ-O`4 zbMpJnjX|%s*nJJli+8Jap4`12#jnJ>#jZ@DJ8eN%ySxduG-+Q>lPjmmo(VzB=jRDc zF__P%|AKJ~am;D_Ao#^imF#K1z9mhrB~A7@fM3oV368H6N-60AF6zJYnhJk)gfsjf zDY?#NKv)8bt1SOa+G}2zSIsIkjQSZRE_@8Rbx-Av>=zGbtqPc@ctW90VQguLDQH_I z>snnAbYgBLf-dqlk4FobeuYSJg*}Hsdk?gio${U$pLBh zRQrH{`lCpZY7hdbli_XfDK^5Bx#X$x>7O6ffm~YjTCaW+~nx9au z&QpO}R+S1{6-gB;Te2qlu&Oj!qxnHqldK8wsQQyNgPSz!rxi<{t)HcYYkr1ZmO0I@ zWi=ky%ssx@-yL4ng`cCa-G?#8%Z-gbbK%H=fDu8&{t_8igaZLfW!V=Smn?riVyU8l zXO8yCRfcp!%})Qv7HjDZ)l@#Q24I(^*9fv-+qe@4mJ&yQ%b*0Cj?- z?A=C$jHqTylLH32J#YFbeBnzm$M#l0-Ma^|d89ssNQjNnitK?Cp32?j*KV%jeQ?9nqLX%1@K-9p^u@e%`>pxQ)ZWz?hJ6ed()N|p!Sv3?r1E3 z$iJfEq4JP@$3B~Ic6%e|$Ibn7$$eFCmX-#!K$H5r`En$)^M9D~gpexrFP?+h`Z`ap z+0&3+`4E>-;`gQx947tDyLP}}$89Nm9z25SH+|GmKMQuoMi1v(^tng>SC4wv#SFVo zN9FJsvb`~3w9sda3?hQP+(=zH->Zt`3orI9jb61VADs|=5O4<${V#C*zrmHW_E(Mo z&YBh-{Vy!!qJ`x{ahi~1zjQbtS%Oq?Gp#s{aAyN|S=((c7;AyjsEwL3jeUSH=nP|8 zDkShn@~$xQ$82BO7!l5H&uh$+Dr52*qZ1s_Q;b==RkpqEkSbdRjQwt7c4O&TW9fmb zrKhg;Yp%ZOKm9#^1AUWWjDHpWr^VpsdW@}Qtz$o9^8~bD=G|KDeqcxja{y@hQ@s@BNKk?_aTaJ{LuE5Hl%rHABqvE{(>-g8uSz5ZO z<#2$g5(|fi%RlpfxCPo|^d|98Qo?6|i#4eFHOVb;0X6|`Y(6Ppv4+5>?-`L6D5M39 zNFhBp)-bxIHNduys5?HUyRN2}%KYuOkBEBxUTR{M`EdLh`98L6f3x>pfXDlb zBj5A4{|n`bNpJb>XGh{I&$oYh#7j?X!vEfW9s6nj9$GdsLhq{8Vp`!v5nNRB%g5U1 z9`V+bm_ec8dILa^iBR1#!|y9bbL2c1DT*VM)reZZ_=+|7Z{Be?!pLl_rSHBPs7RzB zw|w0@bo>$T6+%_U>h?E#--UdZVF%$rjERdy)=H-4_-*hu=eewyUbI;E3zLkIZ-h z&P`0{+(s$Cg&?BB_loOVipI0zNdGQ)zgm@6C9(uBd!hc6_r#q%x+4C!d6~m`XXI8x zw+zF&7X?e8Dbs*d1XKvab` z;0P9XSRel3VChcdYq1aMc6&C*PSy4vgcUH#YSw*RIE-_yzyh2lXG+W|3r8SlEi`Iu#!_Y32v+T7DoK<6FbjY>&nXhihTEsb##l^J%YM4CwD=shzefKE|oeP#y#W5)h&*iqCIpNr!#3wjC1c> zRJn+|?A*h?alG){QmH06KqqJ3&^hE1+>&C`$hy{)Oc}pQ!a2qb##A51lslNG(#>MB z!pshMh=Ye&lH6{O&&97wg2rF`48`2-aBO9rA5viDk~xTSj>Us%jDr8i;WZ!K#+{t_ z!0Y0_UDM{7z4@%|kOn6M1}@=xmWU|7Yf(?FnrV_r)NMX%?6)nhfHKGLH$1oNRdcGQ z&Ie*GIsC|;;+P7_z(2;7OAriPx#noVBi3~lXIDLI@sX5_#Z_0U;zHv3^Ho_Z%xfZ; zGMlvI12{9wi(_yDxHaZYzZ@xZT3sLcV2HIo_0zmGw&+t&5q&Z|c6{Wik5q7{QrbO# zVPoZ~VA;G}6)T^OMcVXNzA2M0ppPWaz!%DVo^iBi<-RuVO}}&UxfQSa|Nh)8vNl}{ zYtE6UWkp|&T_jh>{pvq$<;HjG&c#dczQkC(e25eb$I$THsxU^$0m(!#T7H=Et?Zw zdfs{L{o;=!rm>322+z6FT&c3i^K4*js|FU#Oy!`XJs;vNhIse3!!qu_DKS22rhE25 zR&mgS_WfK!ZtQ+@>?~Q{v=y=PXUsDppQn@JG>>ZOF?K1{8j*EHl@bq0;heK24)Z;A_Z-EX+INmJd_CDuu7^<93 ze%#(%<9&y7W-+lrOh_Emuh@l5>>{b+30y|-#K6U_W9@?*Re2Gzhn0$tJ&9H`Z;XzX zCB}F3c^JFjVJ>3&AvUGO!>JX`bnc9cSb2a|=$R#!#c{NR$zYk4ud*ExOx{$sD3-|^ zvms}+B0AmJP?xwUE7yIf9+ra^!FOJPj5Y2VAuj=a)}nLE7AIw`RnL^<$Qk?4p_W%v zSy@wT6#=Drnyjp~;5Nf1$uLPXMl0%c{_~f(Yu-1*G7~d!7`Uu4rxTGe-+FG#x{?o* zlGmDMGhAS-NlIr2VttrG`TV$mq|_-%Gd1udhvm_WCEYlG0U^RJR_+JH(-$|_j8?$B zli{ARI__NJRMSi*DRnJ|!lLgyjJHq*6*}}jMw|DjNYyVWf^Rxp1SdtG8dtle0ZWwH zmP0j%0&1{rCe3|%TnE;iG)I{g!lUrw?LXU4x8%&8M*J^#;RMEAcYx% zTxgQdfX6##g(S^;KFiya!i^n2dUQdGx^RDu)~E?{*VLJ@VAR70bJ-1D+YD0>RXPbZ zj@3yeW`{~AWo$Z4(K#yA@Sa9TWe(NR8uKkrX4KC}74~<|Iof6iEPWxzsCMuu^ z-blh6Zv0on^!F581c{%C&PvXV@GQ|Km{QrBFRhU=_0y&6+rB?)36e!WXWab3r|a9E z&#~q#%}{sVToa@)war+)zzykdS(KQ(G$(Bh`GDi<5T7+catrFW&V`F})*ax8na9UD zaug}JV9lXpaxc=#Ho{L;AN7(YT)8=s#UgNZTnp?`oVo*X$|3tyw(GGyhk0lx)e0dc9)(rgiU2o{>MH;O?_- z3R$#ys;oX@Kd1MW|H`BOLgEh%YPkH*A!7NTSH60(=&VP*=w{(fikylie%G#&XUX%T zS~k#$dtu@?8P+ac5!-rue4Nx@7r9m^lW~DqD(I4B)$){XToJ^kobVLh@b2?0Ve7-P zbM(rU2Oc{;g;Rq*CQSXO9)umkEm{oh_O(+#dCzTO^5y;NL~~#n65yk`ZbFVcF&>RdA!^qG(Ryg6WjH&<@n2C6?Bo>J9#} ztwZVs_)7BJc)=EpZ!wSM%J!`=$c|)KSZ1HKEQqy?mTs=lRA%H(VfSq@$e;`8|0K+m zrc_xPrrb&y;>q9eaAlkfuFwL46lk{G<#~Q7*i4|YNVc9e%~Yr6s27eg>HH&PtYQjd zvN1^uHP$sDx$~Ep9dah`INLFu$y>%cYy%k`KXr!w`*qk;u7ZF83S=_ z<}N=@HV0P>=gjiWkg78mjZ(kmU-;+OH*%Y!^I9fe2=xnn-K1p9nP!AIfT{j9#H>wV zGTNH4o4fcS{|uc^hMZgM!gpOMd# zm)SgupK*N-+>PtnVDaUWx(L(25@=0VtCG>?>Q|0oQ(T^+ZjhdF6>`BTM%l6jrdjIL zH6|I?6=a&}tJC?ISbv8*)HG8$@ZdPda>m5oXI`i>v1-`0ObetY_I@2Z7NZHNoD0}e zhWU#hwJPEJ#1bA!ul*=45RJ4}D5v#oKY>gu3|q-x7j!y4AmT;*`yKdvDMa}{*1fwAK{ z9cTz4U5(OX=g!DDsndwthGlLWgH*%@b(%b}bUh4gl&~tY42|TOP!g{}Ndm7zJJYe! zn>wNE+&>P3oohw?-hVyeM_1+y1dYS3t!hhru01@;8W+bv)`9;@})WDIb7-+7c$g} z`J2vVT75z)8Zs(!PCpW>mL)ARPM^9GHy8lIyU? zGtf~gC{ccL+|z&tWG&j9s8I*rY{=B`P`gYX$btDBE(Q{sEcP)O?mzkpI+3EgF}R~J*PKV*JPx^ zPaR6W)ik>y82H%S%NU_<<;@v|jty-N2@Z(%=CJn`8|3dfYMz9?V^;mNwi5 z=>uHTr~I*+tI!@a9*c4QED8CLHg~37@^b_-pQm5Q&b=l%pIxqPFm}d#mcHlj;nm#3 zqi`?eN3&n6H2E?sSKL!_NGK2+h;hc#73cp56pT8X&>^Ub#6_y@4$DVnNdFodt%&d zij0i*Y{#&tec}Ba*#sCR41&RA=F(KC^h2TLs!2ZeE9v^&GHgOU*XTRr z@270{YFef^x}x_qv5v0kjx-4+%}D7SIeh|*fN{s&&8vwxoa;emc4_W|Byu?x~PvF^B%00!7m=Y zH8U8?4vEgTV*Gt<%I6+#O^oS%)G@UdKe*Wsmhk59i9mlp?-hfGG=~@ z3_Gg)1NBi8=cgMtvuuqn`r*Nh`?=GYt@IYLpHCy`jTdi z29b|y>Qshga8Og%g6sT%Dr%@wt3MU`j9*>20;hMK_Xq+x{$u%C?x%*C8EO8j=dX37 zagMZLM_P!#b8wleYEl0p{P4fLUm3HycWqAEDDKNYzZ~iM>HVX@zJpFx)jN)0$aqNG zaKr897~6H@@nep;%;mX~u3-Cj?}z9%2m1{!QZ0K-H-^bH(RImZG^f(&_AV^)>C|qW zP{nWk*JZwT4O~Hkl~c-=ZyNn7*G}a0uF%T02v~B&*&VuMtw}Z^vE^<{|I~gxTcQm5BTO42-ivg143+*i{VYXHNnbDbqf)BYu$yY@n!8Ui3X9a zzlwEh*V-*Nb|E1C3TPFqwn-omB2h?NMO(H6EoBvV3w^UzTVEQb)^^3V)>%$YMYXU;iu2J<5r|9Sp0{yZVAHG*bq2LB+_Nh=?rC?at9$GP6W z&z=xumQb==VGWYdvH^Np55KN%ac|GohFo!H??(Mu+A}cRIlSY2&^4BZUth^KzW6s3 z{qy0e*ES#q_KN!5qVl1aJIWNTuU#8xy)&61cpi$cFF7_|@;rzI@3 z5tm4CH%N3Z*kkFl@@`oD!`4a9Y)`)M!QrdqmZUv%zXF!VCWY*dujTmg zCmU8$v6fRIOdpStP-}36p9bqfrLqv__lj*5G@n^Ug<@~D5yTAg?E^VvW!Ew5uYt^& z+Q^6JE?l6*xBM3@Z(f;7cy#b}Uza?0526%s$_-43hx_mN=kdk=!R>PW+#SL!wSmFD zlV`S4S^@P$u;=(tr+zEWu3lT*0~%YFztG5 z3X#vA46axm*0#%(nVC&TuM^a4Z4mQj%<23pEdE=*csgap0noa|u_c-LiZzXw*cT4h ztX}i>W_HJ6HTiPhnSw%Xn zqNG-Y;4j!`((e}P!{QyH;=;(1hlR8XS);y`29+RR7@iZzLoktyII_Ov*Yan`&P<9g z;EUV**6c7^mucUc)8b!xfADqezA`snd3a|4@HZm*ZQ4@#KNPelFSH#=C5Gai3J9BK zgBWYTKZ`z9e^vfdmZOS?Nb|~pqSNY;@>^M(%BE+f9kyCmyIL@_EDWjLQ$Oo4*3!2> zYkOr*poW#Vb6{e%LZbX4^zFlGlEByPbpIl%Mr-ZP@?8Skd`M5VpE!?ikW?$dFI2*6e&thWsW|sbe*dGC zE=ruIwFgn2_vRKtta!`!zw&k_k3UKuKAlaA?ABh-!QQ?$KiDvK74>4=uG6RIi8G78 zm)}~`Ei(5H>7y^uQ)vm3dnD%LLlsB1c4F^jxuiYbl3Be~f9sq@$-~rZ4D_>ubSWMi~`bUDD6*uksuFhv{fqQtaGnE#5eoQ&+kJ24s2;*l_06 z?V@KalL5lmKhBkDlkq~Ac&v&(YiOsvqDlFw+P6_o2RABDtLa+Uq92X@irj{_&pwrs z-98t8BDCSeus-SR(pUN7r~Cn;?z>M6fs9@up2@AnEKZrrlho z@RZ$$NEk8QGEuG1xx`Vz8%(Ads62zs3#e}OwOEZ(P|Q@M^NB|I$|>9&1y%D~a2Qoc~)s2=Z;eBJ8! zgWR%dW=KO`X!j_CO?AYP?^`cI+Lu7(%nPrDFY=A5vF|wAM@@n`d}-ljY05HdLEQg+V40_|pEK+@zD|^R!Vi_FpDbR859 zZV@e`LvUZUwSVhwIX^YE$YT`iGrrxR6dR+ y_KK%wn^DUB}lF-Srj%&p!eJ76n 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 to build a different PlatformIO environment. - -```sh -just upload # build + upload via USB -just monitor # build + upload + serial monitor -``` +`mp3` files live in `/music/` at the root of the SD card; the app creates that +directory along with `/music/.muse/` on first launch. ## Key bindings @@ -74,11 +70,6 @@ src/ ui_playlist.cpp playlist queue view ui_helpers.cpp header/footer/scrollbar/OLED/time formatting include/ public headers -lib/ - PocketMage/ shared PocketMage PDA framework (submodule) -scripts/ - build_firmware.py PlatformIO build helper - package_ota.py firmware -> tar for OTA ``` ## License diff --git a/app.properties b/app.properties new file mode 100644 index 00000000..a7307ccb --- /dev/null +++ b/app.properties @@ -0,0 +1,4 @@ +name=PocketMuse +version=0.2.0 +author=NellowTCS +scope=all diff --git a/assets/icon.png b/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1d633164e54dd2a429eec87acadc0de1956ccb7d GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^8X(LFBp8;owjKadZk{fVAr*6y|C~Pn1T0Dt5_|?g z;Cw^p&wojYeGWHnoN$X)vxuJekUh*);FBUV`zopr0J@+ofB*mh literal 0 HcmV?d00001 diff --git a/include/albumart.h b/include/albumart.h index 91340887..eb427053 100644 --- a/include/albumart.h +++ b/include/albumart.h @@ -1,7 +1,7 @@ #pragma once -#include -#include -#include + +#include +#include class AlbumArt { public: @@ -12,6 +12,7 @@ class AlbumArt { AlbumArt(); ~AlbumArt(); + // Extract APIC from mp3Path and cache it. Returns true on success. bool load(const char* mp3Path); void clear(); @@ -23,19 +24,14 @@ class AlbumArt { int width() const { return img_w_; } int height() const { return img_h_; } + // Render cached art to a 1-bit e-ink buffer at (outX, outY) bounded by + // maxSize. Uses pm_image_decode_to_1bit. bool render1Bit(uint8_t* einkBuf, int bufW, int bufH, int outX, int outY, int maxSize = kMaxSize); private: - static constexpr const char* kCachePath = "/music/.muse/cache_art.jpg"; - - bool ensureMuseDir_(); bool extractAPIC_(const char* mp3Path); bool detectFormat_(); - bool renderJPEG_(File& file, uint8_t* einkBuf, int bufW, int bufH, - int outX, int outY, int maxSize); - bool renderPNG_(File& file, uint8_t* einkBuf, int bufW, int bufH, - int outX, int outY, int maxSize); Format format_; int img_w_; diff --git a/include/config.h b/include/config.h deleted file mode 120000 index 1ff388ac..00000000 --- a/include/config.h +++ /dev/null @@ -1 +0,0 @@ -../../PocketMageOS/include/config.h \ No newline at end of file diff --git a/include/globals.h b/include/globals.h deleted file mode 120000 index 2fe32e80..00000000 --- a/include/globals.h +++ /dev/null @@ -1 +0,0 @@ -../../PocketMageOS/include/globals.h \ No newline at end of file diff --git a/include/library.h b/include/library.h index 579d0627..f5153d24 100644 --- a/include/library.h +++ b/include/library.h @@ -1,23 +1,30 @@ #pragma once -#include -#include -#include -#include + +#include +#include class Library { public: Library(); + ~Library(); int scan(); void clear(); - int count() const { return (int)tracks_.size(); } - const String& path(int index) const; + int count() const { return count_; } + const char* path(int index) const; private: - void scanDir_(const char* dirname, int depth); + void scanDir_(const char* dirname, int depth, int maxDepth); - static constexpr int kMaxDepth = 2; + static constexpr int kMaxDepth = 3; + static constexpr int kFallbackDepth = 1; + static constexpr int kMaxTracks = 400; - std::vector tracks_; + const char** tracks_; // malloc'd array of char* (each malloc'd) + int tracks_cap_; + int count_; }; + +// Global accessor (function-local static). +Library& library(); diff --git a/include/metacache.h b/include/metacache.h index 76691f7b..21e6ba68 100644 --- a/include/metacache.h +++ b/include/metacache.h @@ -1,20 +1,25 @@ #pragma once -#include -#include -#include + +#include +#include class MetadataCache { public: - bool load(const char* path, char* title, size_t tSize, - char* artist, size_t aSize, char* album, size_t lSize); - void save(const char* path, const char* title, const char* artist, const char* album); + bool load(const char* path, + char* title, size_t tSize, + char* artist, size_t aSize, + char* album, size_t lSize); + + void save(const char* path, + const char* title, const char* artist, const char* album); + void clear(); private: - static constexpr const char* kPath = "/music/.muse/metadata.bin"; - static constexpr const char* kTmp = "/music/.muse/.meta_tmp"; static constexpr uint32_t kMagic = 0x4D455441; - bool readStr(File& f, char* buf, size_t bufSize); - bool skipStr(File& f); + bool readStr(const uint8_t*& p, const uint8_t* end, char* buf, size_t bufSize); }; + +// Global accessor. +MetadataCache& metaCache(); diff --git a/include/muse.h b/include/muse.h index a01e515f..5fcdad88 100644 --- a/include/muse.h +++ b/include/muse.h @@ -1,9 +1,18 @@ #pragma once -#include -#include -#include "library.h" + +#include +#include + #include "playlist.h" +// App modes +enum AppMode : uint8_t { + MODE_BROWSER, + MODE_NOWPLAYING, + MODE_PLAYLIST, + MODE_HELP, +}; + // Player state enum class PlayerState : uint8_t { Stopped, @@ -18,26 +27,12 @@ enum class LoopMode : uint8_t { All, }; -// App modes -enum AppMode : uint8_t { - MODE_BROWSER, - MODE_NOWPLAYING, - MODE_PLAYLIST, - MODE_HELP, -}; - -// App globals extern AppMode g_appMode; extern AppMode g_prevMode; extern bool g_needsRedraw; extern int g_selIndex; +extern int g_trackCount; -// Library / source -extern Library g_library; -extern PlaylistManager g_playlistMgr; -extern int g_trackCount; - -// Now playing extern char g_nowPath[256]; extern char g_nowTitle[128]; extern char g_nowArtist[128]; @@ -46,12 +41,11 @@ extern uint32_t g_nowDuration; extern float g_nowProgress; extern int g_nowTrackIndex; extern bool g_isFavorite; -extern volatile PlayerState g_playState; +extern PlayerState g_playState; -// Playback extern LoopMode g_loopMode; extern bool g_shuffleEnabled; -extern volatile uint8_t g_volume; +extern uint8_t g_volume; // UI prototypes void browser_init(); @@ -61,7 +55,6 @@ void browser_render(); void nowplaying_init(); void nowplaying_process_key(char ch); void nowplaying_render(); -void nowplaying_cache_art(const char* path); void playlist_process_key(char ch); void playlist_render(); @@ -83,10 +76,10 @@ void player_prev_track(); void player_cycle_source(); void player_toggle_favorite(); bool get_track_path(int index, char* buf, size_t bufSize); +uint32_t compute_duration(const char* path); // Low-level playback control void music_stop(); void music_play(const char* path); void music_pause(); void music_resume(); -uint32_t compute_duration(const char* path); diff --git a/include/paths.h b/include/paths.h new file mode 100644 index 00000000..979c3e44 --- /dev/null +++ b/include/paths.h @@ -0,0 +1,13 @@ +#pragma once + +// Filesystem layout of PocketMuse on the SD card. +namespace paths { + +constexpr const char* kMusicDir = "/music"; +constexpr const char* kStateDir = "/music/.muse"; +constexpr const char* kPlaylistsDir = "/music/.muse/playlists"; +constexpr const char* kFavorites = "/music/.muse/favs.txt"; +constexpr const char* kMetadata = "/music/.muse/metadata.bin"; +constexpr const char* kAlbumArt = "/music/.muse/cache_art.jpg"; + +} // namespace paths diff --git a/include/playlist.h b/include/playlist.h index 330a986f..e605e5ca 100644 --- a/include/playlist.h +++ b/include/playlist.h @@ -1,14 +1,7 @@ #pragma once -#include -#include -#include -#include -#include -// Plays directory -static constexpr const char* kMuseDir = "/music/.muse"; -static constexpr const char* kPlDir = "/music/.muse/playlists"; -static constexpr const char* kFavFile = "/music/.muse/favs.txt"; +#include +#include enum class PlaySource : uint8_t { Library, @@ -17,91 +10,80 @@ enum class PlaySource : uint8_t { }; struct PlaylistMeta { - String filename; // full path to .m3u file - String name; // display name (filename without .m3u) - int count; // total entries (-1 if not loaded) + char filename[256]; // full path to .m3u file + char name[64]; // display name (filename without .m3u) + int count; // total entries (-1 if not loaded) }; -// Lightweight cursor into a playlist for streaming access. -// Builds a small offset table in RAM (~4 bytes/entry) so paging -// is a single seek + read per page, not a full re-scan. +// Lightweight cursor into a playlist or favorites file. class PlaylistCursor { public: - PlaylistCursor() : file_size_(0), count_(0), offsets_(nullptr) {} + PlaylistCursor(); + ~PlaylistCursor(); - bool load(const char* m3uPath, bool isFav); + bool load(const char* path, bool isFav); void unload(); int count() const { return count_; } bool valid() const { return offsets_ != nullptr; } - // Read entry at index into pathBuf. Returns true if found. - bool getEntry(int index, char* pathBuf, size_t bufSize); - - // Read a page of counts into the given vector. Clears vec first. - bool readPage(int startIndex, int count, std::vector& out); + bool getEntry(int index, char* pathBuf, size_t bufSize) const; private: - bool parseM3U_(File& f); - bool parseFavs_(File& f); - bool readLine_(File& f, char* buf, size_t bufSize); + bool parseM3U_(const char* data, size_t size); + bool parseFavs_(const char* data, size_t size); uint32_t file_size_; int count_; char path_[256]; uint32_t* offsets_; // heap-allocated byte offsets for each entry - - static constexpr int kScanBufSize = 512; }; +// Global accessor (function-local static). class PlaylistManager { public: PlaylistManager(); + ~PlaylistManager(); - // Scan the playlists directory. Must be called at least once. bool begin(); - // Playlist listing - int playlistCount() const { return (int)playlists_.size(); } + int playlistCount() const { return playlist_count_; } const PlaylistMeta& playlistMeta(int idx) const; int findPlaylist(const char* name) const; - // Playlist CRUD bool createPlaylist(const char* name); bool deletePlaylist(int idx); - // Current source PlaySource source() const { return source_; } const PlaylistCursor& cursor() const { return cursor_; } int playlistIndex() const { return pl_index_; } - // Source switching - bool playLibrary(); // switch to full library as source - bool playFavorites(); // switch to favorites - bool playPlaylist(int idx); // switch to a named playlist + bool playLibrary(); + bool playFavorites(); + bool playPlaylist(int idx); - // Active source helpers int entryCount() const; - bool readPage(int start, int count, std::vector& out); bool getEntry(int index, char* pathBuf, size_t bufSize); - // Favorites bool toggleFavorite(const char* path); bool isFavorite(const char* path); int favoriteCount(); - // Playlist content management bool addToPlaylist(int plIdx, const char* songPath); bool removeFromPlaylist(int plIdx, int entryIndex); private: void scanPlaylists_(); - bool removeLine_(const char* filePath, const char* line); PlaySource source_; PlaylistCursor cursor_; int pl_index_; - std::vector playlists_; + PlaylistMeta* playlists_; // malloc'd array + int playlists_cap_; + int playlist_count_; static constexpr int kMaxFavs = 256; }; + +// Global accessor (function-local static). +PlaylistManager& playlistMgr(); diff --git a/include/ui_helpers.h b/include/ui_helpers.h new file mode 100644 index 00000000..9f8b96e1 --- /dev/null +++ b/include/ui_helpers.h @@ -0,0 +1,14 @@ +#pragma once + +#include "muse.h" + +#include + +void draw_header(const char* title); +void draw_footer(const char* hints); +void draw_scrollbar(int total, int visible, int position); +void format_time(char* buf, size_t bufSize, uint32_t seconds); +void get_display_name(const char* path, char* out, size_t maxLen); +void truncate_text(const char* src, char* dst, size_t maxDst); +void ui_update_oled(); +void ui_show_help(); diff --git a/include/ui_player.h b/include/ui_player.h new file mode 100644 index 00000000..23738afc --- /dev/null +++ b/include/ui_player.h @@ -0,0 +1,27 @@ +#pragma once + +#include "muse.h" + +#include +#include + +// Fisher-Yates shuffle state (app-side) +extern int* g_shuffleIdx; +extern int g_shuffleIdxCount; +extern int g_shufflePos; + +void build_shuffle(); + +bool get_track_path(int index, char* buf, size_t bufSize); +uint32_t compute_duration(const char* path); + +void player_play_index(int index); +void player_next_track(); +void player_prev_track(); +void player_cycle_source(); +void player_toggle_favorite(); + +void music_stop(); +void music_play(const char* path); +void music_pause(); +void music_resume(); diff --git a/lib/PocketMage b/lib/PocketMage deleted file mode 120000 index 642ef7dc..00000000 --- a/lib/PocketMage +++ /dev/null @@ -1 +0,0 @@ -../../PocketMageOS/lib/PocketMage \ No newline at end of file diff --git a/partitions_OTA_APP.csv b/partitions_OTA_APP.csv deleted file mode 120000 index 3fba22c3..00000000 --- a/partitions_OTA_APP.csv +++ /dev/null @@ -1 +0,0 @@ -../PocketMageOS/partitions_OTA_APP.csv \ No newline at end of file diff --git a/platformio.ini b/platformio.ini deleted file mode 100644 index 3be32d43..00000000 --- a/platformio.ini +++ /dev/null @@ -1,50 +0,0 @@ -[platformio] -default_envs = OTA_APP - -[common] -platform = espressif32 -board = esp32-s3-devkitc-1 -framework = arduino -board_upload.flash_size = 16MB -board_build.mcu = esp32s3 -board_build.flash_mode = qio - -[env:OTA_APP] -extends = common -board_build.partitions = partitions_OTA_APP.csv -build_flags = - -DOTA_APP_FLAG=1 - -DPOCKETMAGE_HW_VERSION=0 - -DPOCKETMUSE_FAST_REFRESH=1 - -DBOARD_HAS_PSRAM=0 - -DMONITOR_SPEED=115200 - -DARDUINO_USB_MODE=1 - -DARDUINO_USB_CDC_ON_BOOT=1 - -DARDUINO_RUNNING_CORE=1 - -DARDUINO_EVENT_RUNNING_CORE=1 - -DCORE_DEBUG_LEVEL=3 - -DDISABLE_DIAGNOSTIC_OUTPUT - -DPNG_MAX_BUFFERED_PIXELS=5120 - -std=gnu++17 - -Wno-unused-parameter - -Iinclude - -I../PocketMageOS/include -build_unflags = - -std=gnu++11 -lib_deps = - adafruit/Adafruit GFX Library @ ^1.12.0 - adafruit/Adafruit TCA8418 @ ^1.0.2 - adafruit/RTClib @ ^2.1.4 - olikraus/U8g2 @ ^2.36.4 - adafruit/Adafruit MPR121 @ ^1.1.3 - gmarty2000/Buzzer @ ^1.0.0 - https://github.com/TalismanDesign/MP2722_Arduino.git - https://github.com/TalismanDesign/U8g2_for_Adafruit_GFX.git - https://github.com/ashtf8/GxEPD2_Editable_useFastFullUpdate.git - https://github.com/esp32beans/ESP32_USB_Host_HID.git - tobozo/ESP32-targz - https://github.com/esp-arduino-libs/ESP32_USB_Stream.git - https://github.com/bitbank2/JPEGDEC.git - https://github.com/bitbank2/PNGdec.git - https://github.com/pschatzmann/arduino-audio-tools.git - https://github.com/pschatzmann/arduino-libhelix.git \ No newline at end of file diff --git a/scripts/build_firmware.py b/scripts/build_firmware.py deleted file mode 100755 index f2494cb1..00000000 --- a/scripts/build_firmware.py +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env python3 -"""Build PlatformIO firmware. - -Usage: - python3 scripts/build_firmware.py [env] - -Defaults to OTA_APP if no env is given. -""" - -import os -import subprocess -import sys - - -def main() -> None: - pio_env = sys.argv[1] if len(sys.argv) > 1 else os.environ.get("ENV", "OTA_APP") - script_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) - - print(f"=== PlatformIO ({pio_env}) ===") - subprocess.run( - ["pio", "run", "-e", pio_env], - cwd=script_dir, - check=True, - ) - - -if __name__ == "__main__": - main() diff --git a/scripts/package_ota.py b/scripts/package_ota.py deleted file mode 100755 index 35d43391..00000000 --- a/scripts/package_ota.py +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env python3 -"""Package firmware.bin into a tarball for OTA upload. - -Usage: - python3 scripts/package_ota.py [env] - -Output: PocketMuse.tar in the project root. -""" - -import os -import subprocess -import sys -import tempfile - - -def main() -> None: - pio_env = sys.argv[1] if len(sys.argv) > 1 else os.environ.get("ENV", "OTA_APP") - script_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) - - bin_path = os.path.join(script_dir, ".pio", "build", pio_env, "firmware.bin") - tar_path = os.path.join(script_dir, "PocketMuse.tar") - - if not os.path.isfile(bin_path): - print(f"Error: {bin_path} not found", file=sys.stderr) - sys.exit(1) - - with tempfile.TemporaryDirectory() as tmp: - tmpbin = os.path.join(tmp, "firmware.bin") - import shutil - shutil.copy2(bin_path, tmpbin) - subprocess.run( - ["tar", "cf", tar_path, "-C", tmp, "firmware.bin"], - check=True, - ) - - st = os.stat(tar_path) - print(f"=== {tar_path} ({st.st_size} bytes) ===") - - -if __name__ == "__main__": - main() diff --git a/src/UTILS.cpp b/src/UTILS.cpp deleted file mode 120000 index b905796e..00000000 --- a/src/UTILS.cpp +++ /dev/null @@ -1 +0,0 @@ -../../PocketMageOS/src/UTILS.cpp \ No newline at end of file diff --git a/src/albumart.cpp b/src/albumart.cpp index e0190c43..223a2d97 100644 --- a/src/albumart.cpp +++ b/src/albumart.cpp @@ -1,11 +1,11 @@ #include "albumart.h" -#include -#include -#include -#include + +#include "paths.h" +#include "pm_app_api.h" + #include +#include -// Helpers static uint32_t readSyncsafeInt(const uint8_t* buf) { return ((uint32_t)buf[0] << 21) | ((uint32_t)buf[1] << 14) | @@ -13,331 +13,142 @@ static uint32_t readSyncsafeInt(const uint8_t* buf) { (uint32_t)buf[3]; } -// PNGdec file callbacks -static void* pngOpenCb(const char* filename, int32_t* pSize) { - File* f = new File(global_fs->open(filename, "r")); - if (!*f) { delete f; return nullptr; } - *pSize = f->size(); - return f; -} - -static void pngCloseCb(void* pHandle) { - if (!pHandle) return; - delete static_cast(pHandle); -} - -static int32_t pngReadCb(PNGFILE* pFile, uint8_t* buf, int32_t iLen) { - auto* f = static_cast(pFile->fHandle); - return f ? f->read(buf, iLen) : 0; -} - -static int32_t pngSeekCb(PNGFILE* pFile, int32_t iPos) { - auto* f = static_cast(pFile->fHandle); - if (!f) return -1; - return f->seek(iPos) ? iPos : -1; -} - -// Render context shared by JPEG and PNG code paths -struct RenderCtx { - uint8_t* einkBuf; - int bufW, bufH; - int outX, outY; - int fullW, fullH; - int outW, outH; -}; - -// PNG-specific extension: Floyd–Steinberg dither state -struct PngRenderCtx : RenderCtx { - int pixelType; // PNG_PIXEL_xxx - int16_t* err; // current-row error (size fullW + 2) - int16_t* nextErr; // next-row accumulation (size fullW + 2) -}; - -// Grayscale extraction (single pixel from PNGDRAW) -static int pixelToGray(PNGDRAW* pDraw, int x) { - // pDraw->pPalette is always non-null (points to ucPalette[] in the PNGIMAGE - // struct), even for non-palette images where it contains only zeros. - // Must check the pixel type, not the pointer. - uint8_t* p = pDraw->pPixels; - PngRenderCtx* ctx = (PngRenderCtx*)pDraw->pUser; - int type = ctx->pixelType; - - if (type == PNG_PIXEL_INDEXED) { - uint8_t* pal = pDraw->pPalette; - int idx = p[x]; - int r = pal[idx * 3]; - int g = pal[idx * 3 + 1]; - int b = pal[idx * 3 + 2]; - return (r * 77 + g * 150 + b * 29) >> 8; - } - if (type == PNG_PIXEL_TRUECOLOR || type == PNG_PIXEL_TRUECOLOR_ALPHA) { - int i = x * (type == PNG_PIXEL_TRUECOLOR_ALPHA ? 4 : 3); - int r = p[i]; - int g = p[i + 1]; - int b = p[i + 2]; - return (r * 77 + g * 150 + b * 29) >> 8; - } - // Grayscale / grayscale+alpha - if (type == PNG_PIXEL_GRAY_ALPHA) - return p[x * 2]; - return p[x]; -} - -// PNG draw callback: Floyd–Steinberg dither + nearest-neighbour scale -static int pngDrawCb(PNGDRAW* pDraw) { - PngRenderCtx* ctx = (PngRenderCtx*)pDraw->pUser; - if (!ctx || !ctx->einkBuf) return 0; - - int y = pDraw->y; - int w = pDraw->iWidth; - int fullW = ctx->fullW; - int outH = ctx->outH; - int outW = ctx->outW; - int16_t* err = ctx->err; - int16_t* nxt = ctx->nextErr; - - int oy = y * outH / ctx->fullH; - bool writeOutput = (oy < outH); - - int dstRowBytes = (ctx->bufW + 7) / 8; - int prevOx = -1; - - for (int x = 0; x < w; x++) { - int gray = pixelToGray(pDraw, x); - int v = gray + err[x + 1]; - if (v < 0) v = 0; - if (v > 255) v = 255; - int bit = v > 127 ? 1 : 0; // 1 = white, 0 = black - int qErr = v - (bit ? 255 : 0); // always ≤ 0 with this threshold - - // Floyd–Steinberg error diffusion - err[x + 2] += (qErr * 7) / 16; // right - nxt[x] += (qErr * 5) / 16; // bottom - nxt[x + 1] += (qErr * 1) / 16; // bottom-right - if (x > 0) - nxt[x - 1] += (qErr * 3) / 16; // bottom-left - - if (!writeOutput) continue; - - // Nearest-neighbour downscale - int ox = x * outW / fullW; - if (ox == prevOx) continue; - prevOx = ox; - if (ox >= outW) continue; - - int einkX = ctx->outX + ox; - int einkY = ctx->outY + oy; - if (einkX >= ctx->bufW || einkY >= ctx->bufH) continue; - - int idx = einkY * dstRowBytes + (einkX >> 3); - if (idx >= ctx->bufH * dstRowBytes) continue; - - if (!bit) { - ctx->einkBuf[idx] |= (1 << (7 - (einkX & 7))); - } else { - ctx->einkBuf[idx] &= ~(1 << (7 - (einkX & 7))); - } - } - - // Swap error buffers for next row - ctx->err = nxt; - ctx->nextErr = err; - memset(ctx->nextErr, 0, (fullW + 2) * sizeof(int16_t)); - return 1; -} - -// JPEG draw callback -static int jpegDrawCb(JPEGDRAW* pDraw) { - RenderCtx* ctx = (RenderCtx*)pDraw->pUser; - if (!ctx || !ctx->einkBuf) return 0; - - uint8_t* src = (uint8_t*)pDraw->pPixels; - int srcW = pDraw->iWidth; - int srcH = pDraw->iHeight; - int srcRowB = (srcW + 7) / 8; - int srcBaseY = pDraw->y; - - int dstRowB = (ctx->bufW + 7) / 8; - - for (int sy = 0; sy < srcH; sy++) { - int fy = srcBaseY + sy; - if (fy >= ctx->fullH) break; - - int oy = fy * ctx->outH / ctx->fullH; - if (oy >= ctx->outH) continue; - int einkY = ctx->outY + oy; - if (einkY >= ctx->bufH) continue; - - for (int sx = 0; sx < srcW; sx++) { - int fx = pDraw->x + sx; - if (fx >= ctx->fullW) break; - - int ox = fx * ctx->outW / ctx->fullW; - if (ox >= ctx->outW) continue; - int einkX = ctx->outX + ox; - if (einkX >= ctx->bufW) continue; - - int bit = (src[sy * srcRowB + (sx >> 3)] >> (7 - (sx & 7))) & 1; - - int idx = einkY * dstRowB + (einkX >> 3); - if (idx < ctx->bufH * dstRowB) { - if (!bit) { - ctx->einkBuf[idx] |= (1 << (7 - (einkX & 7))); - } else { - ctx->einkBuf[idx] &= ~(1 << (7 - (einkX & 7))); - } - } - } - } - return 1; -} - -// AlbumArt implementation AlbumArt::AlbumArt() - : format_(kNone), img_w_(0), img_h_(0) -{ -} + : format_(kNone), img_w_(0), img_h_(0) {} AlbumArt::~AlbumArt() { clear(); } -bool AlbumArt::ensureMuseDir_() { - if (!global_fs) return false; - global_fs->mkdir("/music/.muse"); - return true; -} - -// ID3v2 APIC extraction bool AlbumArt::extractAPIC_(const char* mp3Path) { - if (!global_fs) return false; - - File mp3 = global_fs->open(mp3Path, "r"); - if (!mp3) return false; - - uint8_t hdr[10]; - if (mp3.read(hdr, 10) != 10) { mp3.close(); return false; } - if (hdr[0] != 'I' || hdr[1] != 'D' || hdr[2] != '3') { mp3.close(); return false; } - - uint8_t ver = hdr[3]; - uint8_t flags = hdr[5]; - uint32_t tagSize = readSyncsafeInt(hdr + 6); - - if (ver < 3 || ver > 4) { mp3.close(); return false; } + uint8_t hdr10[10]; + if (!pm_sd_read_binary_file(mp3Path, hdr10, 10)) return false; + if (hdr10[0] != 'I' || hdr10[1] != 'D' || hdr10[2] != '3') return false; + + uint8_t ver = hdr10[3]; + if (ver < 3 || ver > 4) return false; + + uint32_t tagSize = readSyncsafeInt(hdr10 + 6); + if (tagSize < 10) return false; + // Cap: a sane tag is a few KB; anything larger is corrupt or malicious. + constexpr uint32_t kMaxTag = 64 * 1024; + if (tagSize > kMaxTag) tagSize = kMaxTag; + + uint8_t flags = hdr10[5]; + + // Read the whole tag (10-byte header + body) into a bounded buffer. + // pm_sd_read_binary_file reads from the start of the file, so we get the + // header again and skip it in the buffer. + uint32_t total = 10 + tagSize; + uint8_t* data = static_cast(std::malloc(total)); + if (!data) return false; + if (!pm_sd_read_binary_file(mp3Path, data, total)) { + std::free(data); + return false; + } + size_t pos = 10; if (flags & 0x40) { - uint8_t ext[4]; - if (mp3.read(ext, 4) != 4) { mp3.close(); return false; } - uint32_t extSize = (ver == 4) ? readSyncsafeInt(ext) - : ((uint32_t)ext[0] << 24 | (uint32_t)ext[1] << 16 | - (uint32_t)ext[2] << 8 | ext[3]); - mp3.seek(extSize, SeekCur); + // Extended header + if (pos + 4 > tagSize) { std::free(data); return false; } + uint32_t extSize = readSyncsafeInt(data + pos); + pos += 4 + extSize; + if (pos > tagSize) { std::free(data); return false; } } bool footer = (ver == 4) && (flags & 0x10); - size_t remain = tagSize - (footer ? 10 : 0); - - global_fs->remove(kCachePath); - File tmp = global_fs->open(kCachePath, "w"); - if (!tmp) { mp3.close(); return false; } - - bool found = false; + size_t tagEnd = pos + (tagSize - (footer ? 10 : 0)); + if (tagEnd > tagSize) tagEnd = tagSize; - while (remain >= 10) { - uint8_t fhdr[10]; - if (mp3.read(fhdr, 10) != 10) break; - remain -= 10; + // Remove old cache + pm_sd_delete_file(paths::kAlbumArt); + // Scan frames for APIC + while (pos + 10 <= tagEnd) { + const uint8_t* fhdr = data + pos; char id[5] = {}; - memcpy(id, fhdr, 4); + std::memcpy(id, fhdr, 4); if (id[0] == '\0') break; - uint32_t fsize = (ver == 4) - ? readSyncsafeInt(fhdr + 4) - : ((uint32_t)fhdr[4] << 24 | (uint32_t)fhdr[5] << 16 | - (uint32_t)fhdr[6] << 8 | fhdr[7]); - if (fsize == 0 || fsize > remain) break; + uint32_t fsize; + if (ver == 4) { + fsize = readSyncsafeInt(fhdr + 4); + } else { + fsize = ((uint32_t)fhdr[4] << 24 | + (uint32_t)fhdr[5] << 16 | + (uint32_t)fhdr[6] << 8 | + (uint32_t)fhdr[7]); + } + pos += 10; + + if (fsize == 0 || pos + fsize > tagEnd) break; - if (strcmp(id, "APIC") != 0) { - mp3.seek(fsize, SeekCur); - remain -= fsize; + if (std::strcmp(id, "APIC") != 0) { + pos += fsize; continue; } // APIC body - uint8_t encoding; - if (mp3.read(&encoding, 1) != 1) break; - fsize--; remain--; - - for (;;) { - uint8_t b; - if (mp3.read(&b, 1) != 1 || fsize == 0) break; - fsize--; remain--; - if (b == 0) break; - } + if (pos >= tagEnd) break; + uint8_t encoding = data[pos++]; + fsize--; - if (fsize == 0) break; - mp3.seek(1, SeekCur); - fsize--; remain--; + // Skip MIME type (null-terminated) + while (pos < tagEnd && data[pos] != 0) pos++; + if (pos >= tagEnd) break; + pos++; // skip null + // Skip description (null-terminated, encoding-dependent) if (encoding == 0x00 || encoding == 0x03) { - for (;;) { - uint8_t b; - if (mp3.read(&b, 1) != 1 || fsize == 0) break; - fsize--; remain--; - if (b == 0) break; - } + // Latin1 or UTF-8: null-terminated string + while (pos < tagEnd && data[pos] != 0) pos++; + if (pos < tagEnd) pos++; } else { - for (;;) { - uint8_t b0, b1; - if (mp3.read(&b0, 1) != 1 || mp3.read(&b1, 1) != 1 || fsize < 2) break; - fsize -= 2; remain -= 2; - if (b0 == 0 && b1 == 0) break; - } + // UTF-16: look for 0x0000 + while (pos + 1 < tagEnd && + !(data[pos] == 0 && data[pos + 1] == 0)) pos++; + pos += 2; } - uint8_t buf[512]; - while (fsize > 0) { - size_t chunk = (fsize > sizeof(buf)) ? sizeof(buf) : fsize; - size_t rd = mp3.read(buf, chunk); - if (rd == 0) break; - tmp.write(buf, rd); - fsize -= rd; - remain -= rd; + if (pos >= tagEnd) break; + pos++; // skip picture type byte + + // The rest of the frame is the image data + size_t imgDataSize = tagEnd - pos; + if (imgDataSize == 0) break; + + // Write image data to cache file + if (!pm_sd_write_binary_file(paths::kAlbumArt, data + pos, imgDataSize)) { + break; } - found = true; + format_ = kJPEG; // tentative break; } - tmp.close(); - mp3.close(); + std::free(data); - if (found) { - format_ = kJPEG; // tentative, detectFormat_() will correct - if (!detectFormat_()) { - global_fs->remove(kCachePath); - format_ = kNone; - return false; - } - } else { - global_fs->remove(kCachePath); - } + if (format_ == kNone) return false; - return found; + // Detect actual format + if (!detectFormat_()) { + pm_sd_delete_file(paths::kAlbumArt); + format_ = kNone; + return false; + } + return true; } -// File-format probing (JPEG vs PNG) bool AlbumArt::detectFormat_() { - if (!global_fs) return false; - File f = global_fs->open(kCachePath, "r"); - if (!f) return false; + size_t fsize = pm_sd_get_file_size(paths::kAlbumArt); + if (fsize < 4) return false; - uint8_t magic[4]; - int n = f.read(magic, 4); - f.close(); - if (n < 4) return false; + char magic_buf[4]; + if (!pm_sd_read_binary_file(paths::kAlbumArt, + reinterpret_cast(magic_buf), 4)) + return false; + const uint8_t* magic = reinterpret_cast(magic_buf); if (magic[0] == 0xFF && magic[1] == 0xD8) { format_ = kJPEG; return true; @@ -346,175 +157,28 @@ bool AlbumArt::detectFormat_() { format_ = kPNG; return true; } - return false; // unknown format + return false; } -// Lifecycle bool AlbumArt::load(const char* mp3Path) { if (format_ != kNone) clear(); - if (!ensureMuseDir_()) return false; + + // Ensure the state directory exists + pm_sd_mkdir(paths::kStateDir); + return extractAPIC_(mp3Path); } void AlbumArt::clear() { - if (format_ != kNone && global_fs) { - global_fs->remove(kCachePath); - } + pm_sd_delete_file(paths::kAlbumArt); format_ = kNone; img_w_ = img_h_ = 0; } -// Render to 1-bit e-ink buffer bool AlbumArt::render1Bit(uint8_t* einkBuf, int bufW, int bufH, - int outX, int outY, int maxSize) -{ - if (format_ == kNone || !global_fs) return false; - - File file = global_fs->open(kCachePath, "r"); - if (!file) return false; - - if (format_ == kJPEG) - return renderJPEG_(file, einkBuf, bufW, bufH, outX, outY, maxSize); - if (format_ == kPNG) - return renderPNG_(file, einkBuf, bufW, bufH, outX, outY, maxSize); - - file.close(); - return false; -} - -// JPEG render path (delegates to JPEGDEC with ONE_BIT_DITHERED) -bool AlbumArt::renderJPEG_(File& file, uint8_t* einkBuf, int bufW, int bufH, - int outX, int outY, int maxSize) -{ - JPEGDEC jpeg; - if (!jpeg.open(file, jpegDrawCb)) { - file.close(); - return false; - } - - int imgW = jpeg.getWidth(); - int imgH = jpeg.getHeight(); - if (imgW <= 0 || imgH <= 0) { - jpeg.close(); file.close(); - return false; - } - - int ss = jpeg.getSubSample(); - int mcuCX, mcuCY; - switch (ss) { - case 0x12: mcuCX = 8; mcuCY = 16; break; - case 0x21: mcuCX = 16; mcuCY = 8; break; - case 0x22: mcuCX = 16; mcuCY = 16; break; - default: mcuCX = 8; mcuCY = 8; break; - } - - float scale = (float)maxSize / (imgW > imgH ? imgW : imgH); - int outW = (int)(imgW * scale); - int outH = (int)(imgH * scale); - if (outW < 1) outW = 1; - if (outH < 1) outH = 1; - - img_w_ = outW; - img_h_ = outH; - - int stripMCUs = 128 / mcuCX; - if (stripMCUs < 1) stripMCUs = 1; - - int ditherW = ((imgW + mcuCX - 1) / mcuCX) * mcuCX; - int ditherSize = ditherW * mcuCY; - uint8_t* ditherBuf = new (std::nothrow) uint8_t[ditherSize]; - if (!ditherBuf) { - jpeg.close(); file.close(); - return false; - } + int outX, int outY, int maxSize) { + if (format_ == kNone || !einkBuf) return false; - RenderCtx ctx; - ctx.einkBuf = einkBuf; - ctx.bufW = bufW; - ctx.bufH = bufH; - ctx.outX = outX; - ctx.outY = outY; - ctx.fullW = imgW; - ctx.fullH = imgH; - ctx.outW = outW; - ctx.outH = outH; - - jpeg.setPixelType(ONE_BIT_DITHERED); - jpeg.setMaxOutputSize(stripMCUs); - jpeg.setUserPointer(&ctx); - - bool ok = jpeg.decodeDither(0, 0, ditherBuf, 0); - - jpeg.close(); - file.close(); - delete[] ditherBuf; - return ok; -} - -// PNG render path -bool AlbumArt::renderPNG_(File& file, uint8_t* einkBuf, int bufW, int bufH, - int outX, int outY, int maxSize) -{ - // PNGIMAGE embeds a 32KB zlib buffer so it must be heap-allocated to avoid - // stack overflow on the ~4 KB appTask stack. - auto* png = new (std::nothrow) PNG; - if (!png) { file.close(); return false; } - - if (png->open(kCachePath, pngOpenCb, pngCloseCb, pngReadCb, pngSeekCb, pngDrawCb) - != PNG_SUCCESS) { - delete png; file.close(); - return false; - } - - int imgW = png->getWidth(); - int imgH = png->getHeight(); - if (imgW <= 0 || imgH <= 0) { - png->close(); delete png; file.close(); - return false; - } - - float scale = (float)maxSize / (imgW > imgH ? imgW : imgH); - int outW = (int)(imgW * scale); - int outH = (int)(imgH * scale); - if (outW < 1) outW = 1; - if (outH < 1) outH = 1; - - img_w_ = outW; - img_h_ = outH; - - // Allocate Floyd–Steinberg error buffers (full width + margin) - int errSize = (imgW + 2) * sizeof(int16_t); - auto* err0 = new (std::nothrow) int16_t[imgW + 2]; - auto* err1 = new (std::nothrow) int16_t[imgW + 2]; - if (!err0 || !err1) { - delete[] err0; delete[] err1; - png->close(); delete png; file.close(); - return false; - } - memset(err0, 0, errSize); - memset(err1, 0, errSize); - - PngRenderCtx ctx; - ctx.einkBuf = einkBuf; - ctx.bufW = bufW; - ctx.bufH = bufH; - ctx.outX = outX; - ctx.outY = outY; - ctx.fullW = imgW; - ctx.fullH = imgH; - ctx.outW = outW; - ctx.outH = outH; - ctx.pixelType = png->getPixelType(); - ctx.err = err0; - ctx.nextErr = err1; - - int rc = png->decode(&ctx, PNG_FAST_PALETTE); - png->close(); - delete png; - file.close(); - - delete[] err0; - delete[] err1; - - return rc == PNG_SUCCESS; + return pm_image_decode_to_1bit(paths::kAlbumArt, einkBuf, bufW, bufH, + outX, outY, maxSize); } diff --git a/src/globals.cpp b/src/globals.cpp deleted file mode 120000 index f6740e96..00000000 --- a/src/globals.cpp +++ /dev/null @@ -1 +0,0 @@ -../../PocketMageOS/src/globals.cpp \ No newline at end of file diff --git a/src/library.cpp b/src/library.cpp index cc21c089..91591de0 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -1,66 +1,127 @@ #include "library.h" -#include + +#include "paths.h" +#include "pm_app_api.h" + +#include +#include +#include #include -Library::Library() {} +namespace { + +// Snapshot of one directory level while scanning. The host exposes a single +// live enumeration, so the listing has to be copied before recursing. +struct Entry { + char name[128]; + bool is_dir; +}; +constexpr size_t kMaxName = sizeof(Entry::name); +constexpr size_t kMaxPath = 256; + +} // namespace + +Library::Library() + : tracks_(nullptr), tracks_cap_(0), count_(0) {} + +Library::~Library() { + clear(); + std::free(tracks_); + tracks_ = nullptr; + tracks_cap_ = 0; +} void Library::clear() { - tracks_.clear(); + for (int i = 0; i < count_; i++) { + std::free((void*)tracks_[i]); + } + count_ = 0; } int Library::scan() { clear(); - if (!global_fs) { - return -1; - } + scanDir_(paths::kMusicDir, 0, kMaxDepth); + printf("[muse] scan %s -> %d tracks\n", paths::kMusicDir, count_); + fflush(stdout); - File root = global_fs->open("/music"); - if (!root || !root.isDirectory()) { - return -1; + if (count_ == 0) { + // Cards are often populated at the root instead of /music. One shallow + // pass over the root finds those without crawling apps/ and assets/. + scanDir_("/", 0, kFallbackDepth); + printf("[muse] scan / -> %d tracks\n", count_); + fflush(stdout); } - root.close(); - scanDir_("/music", 0); - - std::sort(tracks_.begin(), tracks_.end(), - [](const String& a, const String& b) { - return strcasecmp(a.c_str(), b.c_str()) < 0; + std::sort(tracks_, tracks_ + count_, + [](const char* a, const char* b) { + return strcasecmp(a, b) < 0; }); - return count(); + return count_; } -const String& Library::path(int index) const { +const char* Library::path(int index) const { + if (index < 0 || index >= count_) return nullptr; return tracks_[index]; } -void Library::scanDir_(const char* dirname, int depth) { - File dir = global_fs->open(dirname); - if (!dir || !dir.isDirectory()) { - return; +void Library::scanDir_(const char* dirname, int depth, int maxDepth) { + if (depth > maxDepth) return; + + int count = pm_sd_dir_open(dirname); + printf("[muse] dir %s entries=%d\n", dirname, count); + fflush(stdout); + if (count < 0) return; + if (count == 0) { pm_sd_dir_close(); return; } + + // The host keeps exactly one enumeration live, so opening a subdirectory + // would clobber this one. Snapshot the listing before recursing. + Entry* entries = static_cast(std::malloc(count * sizeof(Entry))); + if (!entries) { pm_sd_dir_close(); return; } + int found = 0; + for (int i = 0; i < count; i++) { + if (pm_sd_dir_entry(i, entries[found].name, kMaxName, + &entries[found].is_dir)) { + found++; + } } + pm_sd_dir_close(); + + for (int i = 0; i < found; i++) { + const Entry& e = entries[i]; + if (e.is_dir) { + char sub[kMaxPath]; + snprintf(sub, sizeof(sub), "%s/%s", dirname, e.name); + scanDir_(sub, depth + 1, maxDepth); + continue; + } + + const char* dot = std::strrchr(e.name, '.'); + if (!dot || strcasecmp(dot, ".mp3") != 0) continue; + if (count_ >= kMaxTracks) break; - File entry = dir.openNextFile(); - while (entry) { - if (entry.isDirectory()) { - if (depth + 1 < kMaxDepth) { - String sub = String(dirname) + "/" + entry.name(); - scanDir_(sub.c_str(), depth + 1); - } - } else { - String name = entry.name(); - if (name.startsWith("._")) { - entry = dir.openNextFile(); - continue; - } - if (name.endsWith(".mp3") || name.endsWith(".MP3")) { - String full = String(dirname) + "/" + name; - tracks_.push_back(full); - } + if (count_ >= tracks_cap_) { + int new_cap = tracks_cap_ ? tracks_cap_ * 2 : 64; + if (new_cap > kMaxTracks) new_cap = kMaxTracks; + const char** nt = static_cast( + std::realloc((void*)tracks_, new_cap * sizeof(const char*))); + if (!nt) { std::free(entries); return; } + tracks_ = nt; + tracks_cap_ = new_cap; } - entry = dir.openNextFile(); + + size_t len = std::strlen(dirname) + 1 + std::strlen(e.name) + 1; + char* full = static_cast(std::malloc(len)); + if (!full) { std::free(entries); return; } + snprintf(full, len, "%s/%s", dirname, e.name); + tracks_[count_++] = full; } - dir.close(); + std::free(entries); +} + +Library& library() { + static Library lib; + return lib; } diff --git a/src/main.cpp b/src/main.cpp index e1639a1f..2f914542 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,400 +1,123 @@ -#include -#include "AudioTools.h" -#include "AudioTools/CoreAudio/AudioPlayer.h" -#include "AudioTools/CoreAudio/ResampleStream.h" -#include "AudioTools/AudioCodecs/CodecHelix.h" -#include "AudioTools/Disk/AudioSource.h" -#include "AudioTools/Disk/FileLoop.h" #include "muse.h" +#include "library.h" +#include "playlist.h" #include "metacache.h" - -#if OTA_APP - -using namespace audio_tools; - -// Audio pipeline components (global so callbacks can reach them) -static AudioSourceCallback s_source; // callbacks open files from SD -static DecoderHelix s_decoder; // MP3/AAC/WAV auto-detect -static I2SStream s_i2sOut; // I2S DMA output on GPIO 17 -// Workaround: this audio-tools snapshot's ResampleStream hides the base p_out, -// so setOutput() never reaches the pointer its write path actually uses (null -// deref on any write incl. silence). attach() sets that shadowed pointer. -class ResampleStream48 : public ResampleStream { - public: - void attach(Print &out) { p_out = &out; } -}; -static ResampleStream48 s_resample; // resamples every track to 48 kHz -AudioPlayer s_player(s_source, s_resample, s_decoder); - -// Currently-open audio file and its size (updated by callbacks) -static File s_audioFile; -static size_t s_fileSize = 0; - -// FileLoop for LoopMode::One (wraps current file for endless replay) -static FileLoop s_fileLoop; -static bool s_useLoop = false; - -// Metadata cache -static MetadataCache s_metaCache; -static int s_metaFields = 0; - -// Log-only observer: reports each format change. The I2S/PDM output runs at a -// FIXED 48 kHz (an exact multiple of the 6.144 MHz PDM clock), and ResampleStream -// adapts every track to it, so no driver re-install is ever needed here. -class I2SInfoLogger : public AudioInfoSupport { - void setAudioInfo(AudioInfo info) override { - Serial.printf("[audio] decoder %du/%db/%dch -> fixed 48k i2s-clk %.0fHz\r\n", - info.sample_rate, info.bits_per_sample, info.channels, - i2s_get_clk(I2S_NUM_0)); - } - AudioInfo audioInfo() override { return AudioInfo(); } -}; -static I2SInfoLogger s_i2sLogger; - -// Metadata callback (fires during s_player.copy()) -static void onMetadata(MetaDataType type, const char* str, int len) { - switch (type) { - case Title: - strncpy(g_nowTitle, str, sizeof(g_nowTitle) - 1); - g_nowTitle[sizeof(g_nowTitle) - 1] = '\0'; - s_metaFields |= 1; - break; - case Artist: - strncpy(g_nowArtist, str, sizeof(g_nowArtist) - 1); - g_nowArtist[sizeof(g_nowArtist) - 1] = '\0'; - s_metaFields |= 2; - break; - case Album: - strncpy(g_nowAlbum, str, sizeof(g_nowAlbum) - 1); - g_nowAlbum[sizeof(g_nowAlbum) - 1] = '\0'; - s_metaFields |= 4; - break; - default: break; - } - // Cache when all three fields are received - if (s_metaFields == 7 && g_nowPath[0]) { - s_metaCache.save(g_nowPath, g_nowTitle, g_nowArtist, g_nowAlbum); - } -} - -// Pre-read metadata from file (faster than waiting for streaming callback) -static void pre_read_metadata(const char* path) { - if (!path || !path[0] || !global_fs) return; - - g_nowTitle[0] = '\0'; - g_nowArtist[0] = '\0'; - g_nowAlbum[0] = '\0'; - s_metaFields = 0; - - // Check cache first - if (s_metaCache.load(path, g_nowTitle, sizeof(g_nowTitle), - g_nowArtist, sizeof(g_nowArtist), - g_nowAlbum, sizeof(g_nowAlbum))) { - return; - } - - // Cache miss — quick pre-read of first 10 KB - File f = global_fs->open(path, "r"); - if (!f) return; - - uint8_t buf[10240]; - size_t n = f.read(buf, sizeof(buf)); - f.close(); - if (n == 0) return; - - MetaDataID3 meta; - meta.setCallback(onMetadata); - meta.begin(); - meta.write(buf, n); - meta.end(); - - if (g_nowTitle[0] || g_nowArtist[0] || g_nowAlbum[0]) { - s_metaCache.save(path, g_nowTitle, g_nowArtist, g_nowAlbum); - } -} - -// AudioSourceCallbacks -static Stream* openStream(const char* path, size_t& fileSize) { - if (!path || !path[0]) return nullptr; - File f = global_fs->open(path, "r"); - if (!f) return nullptr; - fileSize = f.size(); - - if (g_loopMode == LoopMode::One) { - s_fileLoop.end(); - s_fileLoop.setFile(f); - s_fileLoop.setLoopCount(-1); - s_fileLoop.begin(); - s_useLoop = true; - return &s_fileLoop; - } - - s_audioFile = f; - s_useLoop = false; - return &s_audioFile; -} - -static Stream* onSelectStream(int index) { - s_fileLoop.end(); - if (s_audioFile) s_audioFile.close(); - - if (index == -1) { - return openStream(s_source.getPath(), s_fileSize); - } - - char path[256]; - if (g_playlistMgr.source() == PlaySource::Library) { - if (index < 0 || index >= g_library.count()) return nullptr; - strncpy(path, g_library.path(index).c_str(), sizeof(path) - 1); - path[sizeof(path) - 1] = '\0'; - } else { - if (!g_playlistMgr.getEntry(index, path, sizeof(path))) return nullptr; - } - return openStream(path, s_fileSize); -} - -// Called by AudioPlayer::next() on EOF for auto-advance -static Stream* onNextStream(int offset) { - if (offset <= 0) return nullptr; - - if (g_loopMode == LoopMode::One) { - // FileLoop handles endless replay; this should never be called - return nullptr; - } - - if (g_loopMode == LoopMode::All) { - int next = (g_nowTrackIndex + 1) % g_trackCount; - char path[256]; - if (!get_track_path(next, path, sizeof(path))) return nullptr; - s_fileLoop.end(); - if (s_audioFile) s_audioFile.close(); - - File f = global_fs->open(path, "r"); - if (!f) return nullptr; - s_fileSize = f.size(); - s_audioFile = f; - s_useLoop = false; - - g_nowTrackIndex = next; - strncpy(g_nowPath, path, sizeof(g_nowPath) - 1); - g_nowPath[sizeof(g_nowPath) - 1] = '\0'; - g_nowDuration = compute_duration(path); - g_nowProgress = 0.0f; - g_isFavorite = g_playlistMgr.isFavorite(path); - pre_read_metadata(path); - nowplaying_cache_art(path); - g_needsRedraw = true; - return &s_audioFile; - } - - return nullptr; -} - -// Playback control helpers (called from ui_*.cpp) -void music_stop() { - s_player.setActive(false); -} - -void music_play(const char* path) { - pre_read_metadata(path); - s_player.setAutoFade(true); - s_player.setPath(path); - s_player.play(); -} - -void music_pause() { - s_player.setAutoFade(false); - s_player.setActive(false); -} - -void music_resume() { - s_player.play(); -} - -// appTask: UI, progress, volume -static void appTask(void*) { - vTaskDelay(pdMS_TO_TICKS(200)); - for (;;) { - processKB_APP(); - - // Touch slider: volume - { - static unsigned long lastTouchMs = 0; - unsigned long now = millis(); - int scroll = 0; - if (now - lastTouchMs >= 200) { - lastTouchMs = now; - scroll = TOUCH().getScrollVector(); - } - if (scroll > 0 && g_volume < 245) { - g_volume += 10; - s_player.setVolume(g_volume / 255.0f); - g_needsRedraw = true; - } else if (scroll < 0 && g_volume > 10) { - g_volume -= 10; - s_player.setVolume(g_volume / 255.0f); - g_needsRedraw = true; - } - } - - // Progress from file position - if (s_useLoop) { - if (s_fileLoop.file() && s_fileSize > 0) { - g_nowProgress = (float)s_fileLoop.file().position() / s_fileSize; - } - } else if (s_audioFile && s_fileSize > 0) { - g_nowProgress = (float)s_audioFile.position() / s_fileSize; - } - - // Update global play state - if (s_player.isActive()) { - g_playState = PlayerState::Playing; - } else if (g_nowTrackIndex >= 0 && g_nowPath[0]) { - g_playState = PlayerState::Paused; - } else { - g_playState = PlayerState::Stopped; - } - - ui_update_oled(); - vTaskDelay(pdMS_TO_TICKS(50)); - yield(); - } -} - -// Application entry points (called from PocketMage framework) -void APP_INIT() { -#if defined(POCKETMUSE_FAST_REFRESH) && POCKETMUSE_FAST_REFRESH - FAST_REFRESH = true; -#endif - - // Restore volume - prefs.begin("PocketMuse", true); - g_volume = prefs.getUChar("volume", 200); - prefs.end(); - - // Configure I2S output on BZ_PIN (GPIO 17). - // Single-pin mode: BCK and WS clocks generated internally, only DATA pin used. - // A simple RC low-pass filter on the pin converts the bitstream to analog audio. - // Fixed 48 kHz PDM: 128 * 48000 = 6.144 MHz, an exact clock for the legacy S3 - // PDM driver. All other rates are handled by ResampleStream (see below). - auto cfg = s_i2sOut.defaultConfig(); - cfg.pin_data = BZ_PIN; - cfg.pin_bck = -1; - cfg.sample_rate = 48000; - cfg.channels = 2; - cfg.bits_per_sample = 16; - cfg.signal_type = PDM; - s_i2sOut.begin(cfg); - - Serial.printf("[audio] i2s begin requested=%lu actual=%.0fHz\r\n", - (unsigned long)cfg.sample_rate, i2s_get_clk(I2S_NUM_0)); - - // Resampler: always output the fixed 48 kHz rate of the PDM hardware. - s_resample.attach(s_i2sOut); - s_resample.begin(AudioInfo(48000, 2, 16), 48000); - Serial.printf("[audio] resampler output fixed at %dHz (1:1 at start)\r\n", 48000); - - // Set up AudioSourceCallback - s_source.setCallbackSelectStream(onSelectStream); - - // Initialize the pipeline (setupFade, volume_out.begin, etc.) - // without selecting a stream or activating playback. - s_player.begin(-1, false); - - // Enable auto-next for gapless track advancement - s_player.setAutoNext(true); - s_source.setCallbackNextStream(onNextStream); - s_decoder.addNotifyAudioChange(s_i2sLogger); - - - - // Set up metadata callback (fires during copy() via built-in MetaDataID3) - s_player.setMetadataCallback(onMetadata); - - // Set volume - s_player.setVolume(g_volume / 255.0f); +#include "ui_player.h" +#include "ui_helpers.h" + +#include + +#include +#include +#include + +// Stub: the host exports __cxa_atexit but not plain atexit. We never register +// exit handlers, so this is a no-op. +extern "C" int atexit(void (*func)(void)) { + (void)func; + return 0; +} + +// Exit key codes +static constexpr char kKeyExit1 = 12; +static constexpr char kKeyExit2 = 27; +static constexpr char kKeyExit3 = 65; + +// Process a single keypress in the current app mode +static void process_key(char ch) { + // Exit to OS + if (ch == kKeyExit1 || ch == kKeyExit2 || ch == kKeyExit3) { + music_stop(); + g_appMode = MODE_BROWSER; + return; // main loop will see exit_requested + } + + switch (g_appMode) { + case MODE_BROWSER: browser_process_key(ch); break; + case MODE_NOWPLAYING: nowplaying_process_key(ch); break; + case MODE_PLAYLIST: playlist_process_key(ch); break; + case MODE_HELP: g_appMode = g_prevMode; g_needsRedraw = true; break; + } +} + +extern "C" int main(int argc, char** argv) { + // ABI check + if (pm_app_abi() != PM_APP_API_ABI) { + printf("PocketMuse: host ABI mismatch: app %u, host %u\n", + PM_APP_API_ABI, pm_app_abi()); + pm_oled_sysmsg("SDK ABI mismatch", 2000); + return 1; + } + + printf("PocketMuse starting (SDK %s)\n", PM_SDK_VERSION); + + // Initialize audio subsystem + pm_audio_begin(); + pm_audio_set_volume(static_cast((g_volume * 16) / 255 - 8)); + + // Initialize filesystem paths + playlistMgr().begin(); // Scan library - if (global_fs) { - g_library.scan(); - g_playlistMgr.begin(); - } - g_trackCount = g_library.count(); - browser_init(); -} - -void processKB_APP() { - char ch = KB().updateKeypress(); - if (!ch) return; + library().scan(); + g_trackCount = library().count(); - if (ch == 18) { - KB().setKeyboardState(KB().getKeyboardState() == FUNC ? NORMAL : FUNC); - return; - } - if (ch == 17) { - KB().setKeyboardState(KB().getKeyboardState() == SHIFT ? NORMAL : SHIFT); - return; - } - if (ch == 12 || ch == 27 || ch == 65) { - music_stop(); - prefs.begin("PocketMuse", false); - prefs.putUChar("volume", g_volume); - prefs.end(); - KB().setKeyboardState(NORMAL); - rebootToPocketMage(); - return; - } + // Start in browser + browser_init(); - switch (g_appMode) { - case MODE_BROWSER: browser_process_key(ch); break; - case MODE_NOWPLAYING: nowplaying_process_key(ch); break; - case MODE_PLAYLIST: playlist_process_key(ch); break; - case MODE_HELP: g_appMode = g_prevMode; g_needsRedraw = true; break; + bool exit_requested = false; + + // Main loop + while (!exit_requested) { + // Read keypress + char ch = pm_kb_read(); + if (ch) { + process_key(ch); + // Check if exit was requested + if (ch == kKeyExit1 || ch == kKeyExit2 || ch == kKeyExit3) { + exit_requested = true; + } + ui_update_oled(); + } + + // Update playback progress from byte offset + if (g_nowPath[0] && pm_audio_is_playing()) { + size_t fsize = pm_sd_get_file_size(g_nowPath); + if (fsize > 0) { + g_nowProgress = static_cast(pm_audio_get_position()) / + static_cast(fsize); + if (g_nowProgress > 1.0f) g_nowProgress = 1.0f; + } + } + + // Update play state from audio + if (pm_audio_is_playing()) { + g_playState = PlayerState::Playing; + } else if (g_nowTrackIndex >= 0 && g_nowPath[0]) { + g_playState = PlayerState::Paused; + } else { + g_playState = PlayerState::Stopped; } - ui_update_oled(); -} - -void einkHandler_APP() { - if (!g_needsRedraw) return; - - g_needsRedraw = false; - - switch (g_appMode) { + // Redraw e-ink if needed + if (g_needsRedraw) { + g_needsRedraw = false; + switch (g_appMode) { case MODE_HELP: ui_show_help(); break; case MODE_BROWSER: browser_render(); break; case MODE_NOWPLAYING: nowplaying_render(); break; case MODE_PLAYLIST: playlist_render(); break; + } } -} -void applicationEinkHandler() { - einkHandler_APP(); -} + // Dispatch audio events (state changes, etc.) + pm_audio_dispatch_events(); -void einkHandler(void* parameter) { - vTaskDelay(pdMS_TO_TICKS(250)); - UBaseType_t minStack = UINT32_MAX; - for (;;) { - applicationEinkHandler(); - UBaseType_t hwm = uxTaskGetStackHighWaterMark(NULL); - if (hwm < minStack) { - minStack = hwm; - Serial.printf("einkHandlerTask HWM: %u\n", hwm); - } - vTaskDelay(pdMS_TO_TICKS(50)); - yield(); - } -} + delay(50); + } -void setup() { - PocketMage_INIT(); - xTaskCreatePinnedToCore(appTask, "appTask", 32768, NULL, 2, NULL, 1); - APP_INIT(); + // Cleanup + pm_audio_stop(); + pm_oled_sysmsg("PocketMuse exited", 800); + return 0; } - -void loop() { - s_player.copy(); -} - -#endif diff --git a/src/metacache.cpp b/src/metacache.cpp index 477576ff..53735e75 100644 --- a/src/metacache.cpp +++ b/src/metacache.cpp @@ -1,214 +1,230 @@ #include "metacache.h" -#include -#include -bool MetadataCache::readStr(File& f, char* buf, size_t bufSize) { - if (!f || bufSize == 0) return false; - buf[0] = '\0'; - uint16_t len; - if (f.read((uint8_t*)&len, sizeof(len)) != sizeof(len)) return false; - if (len == 0) return true; - size_t toRead = len < bufSize - 1 ? len : bufSize - 1; - if (f.read((uint8_t*)buf, toRead) != toRead) return false; - buf[toRead] = '\0'; - if (toRead < len) f.seek(f.position() + (len - toRead)); - return true; -} +#include "paths.h" +#include "pm_app_api.h" -bool MetadataCache::skipStr(File& f) { - uint16_t len; - if (f.read((uint8_t*)&len, sizeof(len)) != sizeof(len)) return false; - if (len > 0) f.seek(f.position() + len); +#include +#include + +bool MetadataCache::readStr(const uint8_t*& p, const uint8_t* end, + char* buf, size_t bufSize) { + if (end - p < 2) return false; + uint16_t len = static_cast(p[0] | (p[1] << 8)); + p += 2; + if (len == 0) { buf[0] = '\0'; return true; } + if (end - p < static_cast(len)) return false; + size_t toRead = len < bufSize ? len : bufSize - 1; + std::memcpy(buf, p, toRead); + buf[toRead] = '\0'; + p += len; return true; } -bool MetadataCache::load(const char* path, char* title, size_t tSize, - char* artist, size_t aSize, char* album, size_t lSize) { - if (!path || !path[0] || !global_fs) return false; +bool MetadataCache::load(const char* path, + char* title, size_t tSize, + char* artist, size_t aSize, + char* album, size_t lSize) { + if (!path || !path[0]) return false; - File f = global_fs->open(kPath, "r"); - if (!f) return false; + size_t fsize = pm_sd_get_file_size(paths::kMetadata); + if (fsize < 8) return false; - uint32_t magic, count; - if (f.read((uint8_t*)&magic, sizeof(magic)) != sizeof(magic) || magic != kMagic) { - f.close(); return false; - } - if (f.read((uint8_t*)&count, sizeof(count)) != sizeof(count)) { - f.close(); return false; + char* data = static_cast(std::malloc(fsize)); + if (!data) return false; + if (!pm_sd_read_binary_file(paths::kMetadata, reinterpret_cast(data), fsize)) { + std::free(data); + return false; } - for (uint32_t i = 0; i < count; i++) { - uint16_t pathLen; - if (f.read((uint8_t*)&pathLen, sizeof(pathLen)) != sizeof(pathLen)) break; + const uint8_t* p = reinterpret_cast(data); + const uint8_t* end = p + fsize; + + uint32_t magic = static_cast(p[0] | (p[1] << 8) | + (p[2] << 16) | (p[3] << 24)); + p += 4; + if (magic != kMagic) { std::free(data); return false; } + + uint32_t count = static_cast(p[0] | (p[1] << 8) | + (p[2] << 16) | (p[3] << 24)); + p += 4; - uint32_t entryStart = f.position(); + for (uint32_t i = 0; i < count; i++) { + if (end - p < 2) break; + uint16_t pathLen = static_cast(p[0] | (p[1] << 8)); + p += 2; - // Check if this entry's path matches bool match = false; - if (pathLen > 0) { - size_t pathStrLen = strlen(path); - if (pathLen == pathStrLen + 1) { - char* p = new char[pathLen]; - if (f.read((uint8_t*)p, pathLen) == pathLen) { - match = (strcmp(p, path) == 0); - } - delete[] p; - } else { - f.seek(f.position() + pathLen); - } + if (pathLen > 0 && end - p >= static_cast(pathLen)) { + match = (pathLen == std::strlen(path) + 1 && + std::memcmp(p, path, pathLen) == 0); } + if (end - p < static_cast(pathLen)) break; + p += pathLen; + if (match) { - readStr(f, title, tSize); - readStr(f, artist, aSize); - readStr(f, album, lSize); - f.close(); + if (!readStr(p, end, title, tSize)) { std::free(data); return false; } + if (!readStr(p, end, artist, aSize)) { std::free(data); return false; } + if (!readStr(p, end, album, lSize)) { std::free(data); return false; } + std::free(data); return true; } - f.seek(entryStart + pathLen); - skipStr(f); skipStr(f); skipStr(f); + for (int j = 0; j < 3; j++) { + if (end - p < 2) break; + uint16_t sl = static_cast(p[0] | (p[1] << 8)); + p += 2; + if (end - p < static_cast(sl)) break; + p += sl; + } } - f.close(); + std::free(data); return false; } -void MetadataCache::save(const char* path, const char* title, - const char* artist, const char* album) { - if (!path || !path[0] || !global_fs) return; - - global_fs->mkdir("/music/.muse"); - - // Read existing entries into temp file, updating the matching one - File old = global_fs->open(kPath, "r"); - File tmp = global_fs->open(kTmp, "w"); - if (!tmp) { if (old) old.close(); return; } - - uint32_t magic = kMagic; - tmp.write((uint8_t*)&magic, sizeof(magic)); - - if (old) { - uint32_t oldMagic, count; - if (old.read((uint8_t*)&oldMagic, sizeof(oldMagic)) == sizeof(oldMagic) && - oldMagic == kMagic && - old.read((uint8_t*)&count, sizeof(count)) == sizeof(count)) { - - // Write count placeholder, will update at end - uint32_t countPos = tmp.position(); - tmp.write((uint8_t*)&count, sizeof(count)); - - uint32_t newCount = 0; - bool updated = false; - size_t pathLen = strlen(path) + 1; - - for (uint32_t i = 0; i < count; i++) { - uint16_t epLen; - if (old.read((uint8_t*)&epLen, sizeof(epLen)) != sizeof(epLen)) break; - - uint32_t entryStart = old.position(); - char* epBuf = new char[epLen]; - if (old.read((uint8_t*)epBuf, epLen) != epLen) { - delete[] epBuf; break; - } +void MetadataCache::save(const char* path, + const char* title, const char* artist, + const char* album) { + if (!path || !path[0]) return; + + // Read old file into a single buffer. Peak heap usage is fsize, not + // 2×fsize+1024 like the old double-buffered version. + size_t fsize = pm_sd_get_file_size(paths::kMetadata); + char* oldData = nullptr; + bool hasOld = false; + if (fsize >= 8) { + oldData = static_cast(std::malloc(fsize)); + if (oldData && + pm_sd_read_binary_file(paths::kMetadata, reinterpret_cast(oldData), fsize)) + hasOld = true; + if (!hasOld) { std::free(oldData); oldData = nullptr; } + } - bool isMatch = !updated && (size_t)epLen == pathLen && - strcmp(epBuf, path) == 0; - - if (isMatch) { - // Replace with new data - uint16_t len = pathLen; - tmp.write((uint8_t*)&len, sizeof(len)); - tmp.write((uint8_t*)path, len); - - auto writeStr = [&](const char* s) { - uint16_t sl = s ? strlen(s) + 1 : 0; - tmp.write((uint8_t*)&sl, sizeof(sl)); - if (sl > 0) tmp.write((uint8_t*)s, sl); - }; - writeStr(title); - writeStr(artist); - writeStr(album); + // Replace the metadata file in place: delete first so append creates fresh. + pm_sd_delete_file(paths::kMetadata); + + auto appendByte = [](uint8_t b) { + pm_sd_append_binary_file(paths::kMetadata, &b, 1); + }; + auto appendBytes = [](const void* src, size_t n) { + pm_sd_append_binary_file(paths::kMetadata, + static_cast(src), n); + }; + auto appendStr = [&](const char* s) { + uint16_t len = s ? static_cast(std::strlen(s) + 1) : 0; + appendByte(static_cast(len & 0xFF)); + appendByte(static_cast((len >> 8) & 0xFF)); + if (len > 0) appendBytes(s, len); + }; + auto appendU16Bytes = [&](const void* data, size_t n) { + appendByte(static_cast(n & 0xFF)); + appendByte(static_cast((n >> 8) & 0xFF)); + if (n > 0) appendBytes(data, n); + }; + + // Write magic + appendByte(static_cast(kMagic & 0xFF)); + appendByte(static_cast((kMagic >> 8) & 0xFF)); + appendByte(static_cast((kMagic >> 16) & 0xFF)); + appendByte(static_cast((kMagic >> 24) & 0xFF)); + + uint32_t newCount = 0; + bool updated = false; + size_t pathLen = std::strlen(path) + 1; + + uint32_t oldCount = 0; + if (hasOld) { + const uint8_t* p = reinterpret_cast(oldData) + 4; + const uint8_t* end = reinterpret_cast(oldData) + fsize; + + uint32_t oldMagic = static_cast(p[0] | (p[1] << 8) | + (p[2] << 16) | (p[3] << 24)); + p += 4; + if (oldMagic != kMagic) { + hasOld = false; + } else { + oldCount = static_cast(p[0] | (p[1] << 8) | + (p[2] << 16) | (p[3] << 24)); + p += 4; + + // Count pass: determine final count and whether path exists. + newCount = oldCount; + for (uint32_t i = 0; i < oldCount; i++) { + if (end - p < 2) break; + uint16_t epLen = static_cast(p[0] | (p[1] << 8)); + p += 2; + if (epLen == pathLen && std::memcmp(p, path, epLen) == 0) updated = true; - newCount++; - } else { - // Copy entry unchanged - uint16_t len = epLen; - tmp.write((uint8_t*)&len, sizeof(len)); - tmp.write((uint8_t*)epBuf, epLen); - - // Copy title, artist, album - for (int j = 0; j < 3; j++) { - uint16_t sl; - if (old.read((uint8_t*)&sl, sizeof(sl)) != sizeof(sl)) { - delete[] epBuf; old.close(); tmp.close(); - global_fs->remove(kTmp); - return; - } - tmp.write((uint8_t*)&sl, sizeof(sl)); - if (sl > 0) { - uint8_t* sbuf = new uint8_t[sl]; - old.read(sbuf, sl); - tmp.write(sbuf, sl); - delete[] sbuf; - } - } - newCount++; + p += epLen; + for (int j = 0; j < 3; j++) { + if (end - p < 2) break; + uint16_t sl = static_cast(p[0] | (p[1] << 8)); + p += 2; + p += sl; } - delete[] epBuf; } + if (!updated) newCount++; + } + } else { + newCount = 1; + } - // If not updated (new entry), append it - if (!updated) { - uint16_t len = pathLen; - tmp.write((uint8_t*)&len, sizeof(len)); - tmp.write((uint8_t*)path, len); - - auto writeStr = [&](const char* s) { - uint16_t sl = s ? strlen(s) + 1 : 0; - tmp.write((uint8_t*)&sl, sizeof(sl)); - if (sl > 0) tmp.write((uint8_t*)s, sl); - }; - writeStr(title); writeStr(artist); writeStr(album); - newCount++; + // Write count + appendByte(static_cast(newCount & 0xFF)); + appendByte(static_cast((newCount >> 8) & 0xFF)); + appendByte(static_cast((newCount >> 16) & 0xFF)); + appendByte(static_cast((newCount >> 24) & 0xFF)); + + // Write pass: stream old entries, replacing or copying each. + if (hasOld) { + const uint8_t* p = reinterpret_cast(oldData) + 8; + const uint8_t* end = reinterpret_cast(oldData) + fsize; + + for (uint32_t i = 0; i < oldCount; i++) { + if (end - p < 2) break; + uint16_t epLen = static_cast(p[0] | (p[1] << 8)); + p += 2; + + bool isMatch = !updated && (epLen == pathLen && + std::memcmp(p, path, epLen) == 0); + + if (isMatch) { + appendU16Bytes(path, pathLen); + appendStr(title); + appendStr(artist); + appendStr(album); + updated = true; + } else { + appendU16Bytes(p, epLen); + p += epLen; + + for (int j = 0; j < 3; j++) { + if (end - p < 2) break; + uint16_t sl = static_cast(p[0] | (p[1] << 8)); + p += 2; + appendU16Bytes(p, sl); + p += sl; + } } - - // Update count - uint32_t endPos = tmp.position(); - tmp.seek(countPos); - tmp.write((uint8_t*)&newCount, sizeof(newCount)); - tmp.seek(endPos); - - old.close(); - } else { - old.close(); - // Corrupted file, start fresh - tmp.seek(0); - tmp.write((uint8_t*)&magic, sizeof(magic)); - goto writeNew; } - } else { - writeNew:; - uint32_t one = 1; - tmp.write((uint8_t*)&one, sizeof(one)); - uint16_t len = strlen(path) + 1; - tmp.write((uint8_t*)&len, sizeof(len)); - tmp.write((uint8_t*)path, len); - - auto writeStr = [&](const char* s) { - uint16_t sl = s ? strlen(s) + 1 : 0; - tmp.write((uint8_t*)&sl, sizeof(sl)); - if (sl > 0) tmp.write((uint8_t*)s, sl); - }; - writeStr(title); writeStr(artist); writeStr(album); } - tmp.close(); + if (!updated) { + appendU16Bytes(path, pathLen); + appendStr(title); + appendStr(artist); + appendStr(album); + } - global_fs->remove(kPath); - global_fs->rename(kTmp, kPath); + std::free(oldData); } void MetadataCache::clear() { - if (global_fs) global_fs->remove(kPath); + pm_sd_delete_file(paths::kMetadata); +} + +MetadataCache& metaCache() { + static MetadataCache cache; + return cache; } diff --git a/src/muse.cpp b/src/muse.cpp index 05f7e160..0bd29a29 100644 --- a/src/muse.cpp +++ b/src/muse.cpp @@ -4,10 +4,7 @@ AppMode g_appMode = MODE_BROWSER; AppMode g_prevMode = MODE_BROWSER; bool g_needsRedraw = false; int g_selIndex = 0; - -Library g_library; -PlaylistManager g_playlistMgr; -int g_trackCount = 0; +int g_trackCount = 0; char g_nowPath[256] = {}; char g_nowTitle[128] = {}; @@ -17,8 +14,8 @@ uint32_t g_nowDuration = 0; float g_nowProgress = 0.0f; int g_nowTrackIndex = -1; bool g_isFavorite = false; -volatile PlayerState g_playState = PlayerState::Stopped; +PlayerState g_playState = PlayerState::Stopped; LoopMode g_loopMode = LoopMode::None; bool g_shuffleEnabled = false; -volatile uint8_t g_volume = 200; +uint8_t g_volume = 200; diff --git a/src/playlist.cpp b/src/playlist.cpp index 2af70d17..07cf0bd6 100644 --- a/src/playlist.cpp +++ b/src/playlist.cpp @@ -1,196 +1,183 @@ #include "playlist.h" -#include -#include -// helpers - -// Read one line (including trailing \n) from a File. buf is always null-terminated. -// Returns false only on immediate EOF/error (no bytes read). -static bool readLine(File& f, char* buf, size_t bufSize) { - if (!f || f.available() <= 0) return false; - int i = 0; - while (i < (int)bufSize - 1) { - int c = f.read(); - if (c < 0) break; - buf[i++] = (char)c; - if (c == '\n') break; +#include "paths.h" +#include "pm_app_api.h" + +#include +#include +#include + +// Read a text file into a freshly malloc'd buffer. Returns buffer (caller frees) +// and sets *outSize. Returns nullptr on failure. +static char* readTextFile(const char* path, size_t* outSize) { + size_t fsize = pm_sd_get_file_size(path); + if (fsize == 0) return nullptr; + char* buf = static_cast(std::malloc(fsize + 1)); + if (!buf) return nullptr; + if (!pm_sd_read_binary_file(path, reinterpret_cast(buf), fsize)) { + std::free(buf); + return nullptr; } - buf[i] = '\0'; - return i > 0; + buf[fsize] = '\0'; + if (outSize) *outSize = fsize; + return buf; } // Trim trailing \r and \n in-place. static void trimCRLF(char* buf) { - size_t len = strlen(buf); + size_t len = std::strlen(buf); while (len > 0 && (buf[len - 1] == '\r' || buf[len - 1] == '\n')) buf[--len] = '\0'; } // PlaylistCursor -bool PlaylistCursor::load(const char* m3uPath, bool isFav) { - unload(); - if (!global_fs) return false; - - File f = global_fs->open(m3uPath, "r"); - if (!f) return false; - - bool ok = isFav ? parseFavs_(f) : parseM3U_(f); - file_size_ = f.size(); - f.close(); - - if (!ok || count_ == 0) { unload(); return false; } +PlaylistCursor::PlaylistCursor() + : file_size_(0), count_(0), offsets_(nullptr) { + path_[0] = '\0'; +} - strncpy(path_, m3uPath, sizeof(path_) - 1); - path_[sizeof(path_) - 1] = '\0'; - return true; +PlaylistCursor::~PlaylistCursor() { + unload(); } void PlaylistCursor::unload() { - delete[] offsets_; + std::free(offsets_); offsets_ = nullptr; count_ = 0; file_size_ = 0; + path_[0] = '\0'; } -bool PlaylistCursor::getEntry(int index, char* pathBuf, size_t bufSize) { - if (!valid() || index < 0 || index >= count_ || !global_fs) return false; +bool PlaylistCursor::load(const char* path, bool isFav) { + unload(); + size_t fsize = 0; + char* data = readTextFile(path, &fsize); + if (!data) return false; - File f = global_fs->open(path_, "r"); - if (!f) return false; + bool ok = isFav ? parseFavs_(data, fsize) : parseM3U_(data, fsize); + std::free(data); - f.seek(offsets_[index]); - bool ok = readLine(f, pathBuf, bufSize); - f.close(); + if (!ok || count_ == 0) { unload(); return false; } - if (ok) trimCRLF(pathBuf); - return ok && strlen(pathBuf) > 0; + std::strncpy(path_, path, sizeof(path_) - 1); + path_[sizeof(path_) - 1] = '\0'; + return true; } -bool PlaylistCursor::readPage(int startIndex, int count, std::vector& out) { - out.clear(); - if (!valid() || startIndex < 0 || count <= 0 || !global_fs) return false; - - int endIndex = startIndex + count; - if (endIndex > count_) endIndex = count_; - - File f = global_fs->open(path_, "r"); - if (!f) return false; - - for (int i = startIndex; i < endIndex; i++) { - f.seek(offsets_[i]); - char buf[256]; - if (readLine(f, buf, sizeof(buf))) { - trimCRLF(buf); - if (strlen(buf) > 0) out.emplace_back(buf); - } - } +bool PlaylistCursor::getEntry(int index, char* pathBuf, size_t bufSize) const { + if (!valid() || index < 0 || index >= count_ || !pathBuf || bufSize == 0) + return false; - f.close(); - return !out.empty(); + size_t fsize = 0; + char* data = readTextFile(path_, &fsize); + if (!data) return false; + + uint32_t off = offsets_[index]; + uint32_t end = off; + while (end < fsize && data[end] != '\n' && data[end] != '\r') end++; + size_t copyLen = static_cast(end - off); + if (copyLen >= bufSize) copyLen = bufSize - 1; + std::memcpy(pathBuf, data + off, copyLen); + pathBuf[copyLen] = '\0'; + trimCRLF(pathBuf); + std::free(data); + + return pathBuf[0] != '\0'; } -bool PlaylistCursor::parseM3U_(File& f) { +bool PlaylistCursor::parseM3U_(const char* data, size_t size) { int cap = 128; - uint32_t* off = new uint32_t[cap]; + uint32_t* off = static_cast(std::malloc(cap * sizeof(uint32_t))); + if (!off) return false; int n = 0; - char buf[kScanBufSize]; + uint32_t pos = 0; - while (f.available()) { - uint32_t lineStart = f.position(); - if (!readLine(f, buf, sizeof(buf))) break; + while (pos < size) { + uint32_t lineStart = pos; + while (pos < size && data[pos] != '\n') pos++; + if (pos < size) pos++; - trimCRLF(buf); - if (strlen(buf) == 0) continue; + size_t lineLen = pos - lineStart; + if (lineLen == 0) continue; - // Skip comments (#EXTM3U, #EXTINF, #) - if (buf[0] == '#') continue; + if (data[lineStart] == '#') continue; if (n >= cap) { cap *= 2; - uint32_t* nf = new uint32_t[cap]; - memcpy(nf, off, n * sizeof(uint32_t)); - delete[] off; + uint32_t* nf = static_cast(std::malloc(cap * sizeof(uint32_t))); + if (!nf) { std::free(off); return false; } + std::memcpy(nf, off, n * sizeof(uint32_t)); + std::free(off); off = nf; } off[n++] = lineStart; } - if (n == 0) { delete[] off; return false; } + if (n == 0) { std::free(off); return false; } count_ = n; offsets_ = off; return true; } -bool PlaylistCursor::parseFavs_(File& f) { - int cap = 128; - uint32_t* off = new uint32_t[cap]; - int n = 0; - char buf[kScanBufSize]; - - while (f.available()) { - uint32_t lineStart = f.position(); - if (!readLine(f, buf, sizeof(buf))) break; - - trimCRLF(buf); - if (strlen(buf) == 0) continue; - - if (n >= cap) { - cap *= 2; - uint32_t* nf = new uint32_t[cap]; - memcpy(nf, off, n * sizeof(uint32_t)); - delete[] off; - off = nf; - } - off[n++] = lineStart; - } - - if (n == 0) { delete[] off; return false; } - count_ = n; - offsets_ = off; - return true; +bool PlaylistCursor::parseFavs_(const char* data, size_t size) { + return parseM3U_(data, size); } // PlaylistManager -PlaylistManager::PlaylistManager() : source_(PlaySource::Library), pl_index_(-1) {} +PlaylistManager::PlaylistManager() + : source_(PlaySource::Library), pl_index_(-1), + playlists_(nullptr), playlists_cap_(0), playlist_count_(0) {} + +PlaylistManager::~PlaylistManager() { + std::free(playlists_); + playlists_ = nullptr; + playlists_cap_ = 0; + playlist_count_ = 0; +} bool PlaylistManager::begin() { - if (!global_fs) return false; - global_fs->mkdir(kMuseDir); - global_fs->mkdir(kPlDir); + // mkdir works one level at a time, so create the music dir first: it is + // the parent of the state dir and may not exist on a fresh card. + const bool musicOk = pm_sd_mkdir(paths::kMusicDir); + const bool stateOk = pm_sd_mkdir(paths::kStateDir); + const bool plOk = pm_sd_mkdir(paths::kPlaylistsDir); + printf("[muse] dirs music=%d state=%d playlists=%d\n", + musicOk, stateOk, plOk); + fflush(stdout); + if (!musicOk || !stateOk || !plOk) return false; scanPlaylists_(); return true; } const PlaylistMeta& PlaylistManager::playlistMeta(int idx) const { static PlaylistMeta empty; - if (idx < 0 || idx >= (int)playlists_.size()) return empty; + if (idx < 0 || idx >= playlist_count_) return empty; return playlists_[idx]; } int PlaylistManager::findPlaylist(const char* name) const { - for (int i = 0; i < (int)playlists_.size(); i++) { - if (playlists_[i].name == name) return i; + for (int i = 0; i < playlist_count_; i++) { + if (std::strcmp(playlists_[i].name, name) == 0) return i; } return -1; } bool PlaylistManager::createPlaylist(const char* name) { - if (!global_fs || findPlaylist(name) >= 0) return false; + if (findPlaylist(name) >= 0) return false; + + char fpath[256]; + snprintf(fpath, sizeof(fpath), "%s/%s.m3u", paths::kPlaylistsDir, name); - String fpath = String(kPlDir) + "/" + name + ".m3u"; - File f = global_fs->open(fpath, "w"); - if (!f) return false; - f.println("#EXTM3U"); - f.close(); + pm_sd_write_file(fpath, "#EXTM3U\n"); scanPlaylists_(); return true; } bool PlaylistManager::deletePlaylist(int idx) { - if (!global_fs || idx < 0 || idx >= (int)playlists_.size()) return false; + if (idx < 0 || idx >= playlist_count_) return false; if (source_ == PlaySource::Playlist && pl_index_ == idx) { cursor_.unload(); @@ -198,9 +185,9 @@ bool PlaylistManager::deletePlaylist(int idx) { pl_index_ = -1; } - bool ok = global_fs->remove(playlists_[idx].filename.c_str()); - if (ok) scanPlaylists_(); - return ok; + pm_sd_delete_file(playlists_[idx].filename); + scanPlaylists_(); + return true; } bool PlaylistManager::playLibrary() { @@ -211,19 +198,21 @@ bool PlaylistManager::playLibrary() { } bool PlaylistManager::playFavorites() { - cursor_.unload(); - if (!cursor_.load(kFavFile, true)) return false; + if (!cursor_.load(paths::kFavorites, true)) return false; source_ = PlaySource::Favorites; pl_index_ = -1; return true; } bool PlaylistManager::playPlaylist(int idx) { - if (idx < 0 || idx >= (int)playlists_.size()) return false; + if (idx < 0 || idx >= playlist_count_) return false; cursor_.unload(); - if (!cursor_.load(playlists_[idx].filename.c_str(), false)) { - playlists_.erase(playlists_.begin() + idx); + if (!cursor_.load(playlists_[idx].filename, false)) { + // Remove invalid playlist + for (int i = idx; i < playlist_count_ - 1; i++) + playlists_[i] = playlists_[i + 1]; + playlist_count_--; return false; } @@ -234,95 +223,122 @@ bool PlaylistManager::playPlaylist(int idx) { } int PlaylistManager::entryCount() const { + if (source_ == PlaySource::Library) return 0; return cursor_.count(); } -bool PlaylistManager::readPage(int start, int count, std::vector& out) { - return cursor_.readPage(start, count, out); -} - bool PlaylistManager::getEntry(int index, char* pathBuf, size_t bufSize) { return cursor_.getEntry(index, pathBuf, bufSize); } -// Favorites - bool PlaylistManager::toggleFavorite(const char* path) { - if (!global_fs) return false; - bool wasFav = isFavorite(path); if (wasFav) { - if (!removeLine_(kFavFile, path)) return true; // unchanged, still fav + // Remove line: read whole file, write back minus matching line + size_t fsize = 0; + char* data = readTextFile(paths::kFavorites, &fsize); + if (!data) return true; + + // Build new content: copy all lines except the matching one + char* result = static_cast(std::malloc(fsize + 1)); + if (!result) { std::free(data); return true; } + size_t result_len = 0; + + const char* p = data; + bool found = false; + while (*p) { + const char* nl = std::strchr(p, '\n'); + size_t linelen = nl ? static_cast(nl - p) : std::strlen(p); + bool match = (linelen == std::strlen(path) && + std::memcmp(p, path, linelen) == 0); + if (match) { + found = true; + } else { + if (result_len + linelen + 1 <= fsize) { + std::memcpy(result + result_len, p, linelen); + result_len += linelen; + result[result_len++] = '\n'; + } + } + if (!nl) break; + p = nl + 1; + } + std::free(data); + + if (!found) { std::free(result); return true; } + + result[result_len] = '\0'; + pm_sd_write_binary_file(paths::kFavorites, + reinterpret_cast(result), + result_len); + std::free(result); + + if (source_ == PlaySource::Favorites) { + cursor_.unload(); + cursor_.load(paths::kFavorites, true); + } } else { - File f = global_fs->open(kFavFile, "a"); - if (!f) return false; // unchanged, still not fav - f.println(path); - f.close(); + char line[256]; + snprintf(line, sizeof(line), "%s\n", path); + pm_sd_append_file(paths::kFavorites, line); } if (source_ == PlaySource::Favorites) { cursor_.unload(); - cursor_.load(kFavFile, true); + cursor_.load(paths::kFavorites, true); } return !wasFav; } bool PlaylistManager::isFavorite(const char* path) { - if (!global_fs) return false; - File f = global_fs->open(kFavFile, "r"); - if (!f) return false; - - char buf[256]; - while (f.available()) { - int i = 0; - while (i < 255) { - int c = f.read(); - if (c < 0 || c == '\n') break; - buf[i++] = (char)c; + size_t fsize = 0; + char* data = readTextFile(paths::kFavorites, &fsize); + if (!data) return false; + + const char* p = data; + bool found = false; + while (*p) { + const char* nl = std::strchr(p, '\n'); + size_t linelen = nl ? static_cast(nl - p) : std::strlen(p); + if (linelen == std::strlen(path) && + std::memcmp(p, path, linelen) == 0) { + found = true; + break; } - buf[i] = '\0'; - if (strcmp(buf, path) == 0) { f.close(); return true; } + if (!nl) break; + p = nl + 1; } - - f.close(); - return false; + std::free(data); + return found; } int PlaylistManager::favoriteCount() { - if (!global_fs) return 0; - File f = global_fs->open(kFavFile, "r"); - if (!f) return 0; + size_t fsize = 0; + char* data = readTextFile(paths::kFavorites, &fsize); + if (!data) return 0; int count = 0; - char buf[256]; - while (f.available()) { - int i = 0; - while (i < 255) { - int c = f.read(); - if (c < 0 || c == '\n') break; - buf[i++] = (char)c; - } - buf[i] = '\0'; - if (i > 0) count++; + const char* p = data; + while (*p) { + const char* nl = std::strchr(p, '\n'); + if (!nl) break; + p = nl + 1; + count++; } - - f.close(); + std::free(data); return count; } -// Playlist content management - bool PlaylistManager::addToPlaylist(int plIdx, const char* songPath) { - if (!global_fs || plIdx < 0 || plIdx >= (int)playlists_.size()) return false; + if (plIdx < 0 || plIdx >= playlist_count_) return false; - File f = global_fs->open(playlists_[plIdx].filename.c_str(), "a"); - if (!f) return false; - f.println(songPath); - f.close(); + char line[256]; + snprintf(line, sizeof(line), "%s\n", songPath); + pm_sd_append_file(playlists_[plIdx].filename, line); if (source_ == PlaySource::Playlist && pl_index_ == plIdx) { cursor_.unload(); - cursor_.load(playlists_[plIdx].filename.c_str(), false); + cursor_.load(playlists_[plIdx].filename, false); playlists_[plIdx].count = cursor_.count(); } else { playlists_[plIdx].count = -1; @@ -332,32 +348,47 @@ bool PlaylistManager::addToPlaylist(int plIdx, const char* songPath) { } bool PlaylistManager::removeFromPlaylist(int plIdx, int entryIndex) { - if (!global_fs || plIdx < 0 || plIdx >= (int)playlists_.size()) return false; + if (plIdx < 0 || plIdx >= playlist_count_) return false; PlaylistCursor tmp; - if (!tmp.load(playlists_[plIdx].filename.c_str(), false)) return false; + if (!tmp.load(playlists_[plIdx].filename, false)) return false; if (entryIndex < 0 || entryIndex >= tmp.count()) { tmp.unload(); return false; } - const char* tmpPath = "/music/.muse/.pl_tmp"; - File out = global_fs->open(tmpPath, "w"); - if (!out) { tmp.unload(); return false; } - - out.println("#EXTM3U"); - char p[256]; - for (int i = 0; i < tmp.count(); i++) { - if (i == entryIndex) continue; - if (tmp.getEntry(i, p, sizeof(p))) out.println(p); + size_t fsize = 0; + char* data = readTextFile(playlists_[plIdx].filename, &fsize); + if (!data) { tmp.unload(); return false; } + + char result[4096]; + size_t result_len = 0; + std::memcpy(result, "#EXTM3U\n", 8); + result_len = 8; + + const char* p = data; + int idx = 0; + while (*p) { + const char* nl = std::strchr(p, '\n'); + size_t linelen = nl ? static_cast(nl - p) : std::strlen(p); + if (idx != entryIndex && linelen > 0 && p[0] != '#') { + if (result_len + linelen + 1 < sizeof(result)) { + std::memcpy(result + result_len, p, linelen); + result_len += linelen; + result[result_len++] = '\n'; + } + } + if (!nl) break; + p = nl + 1; + idx++; } + std::free(data); - tmp.unload(); - out.close(); - - global_fs->remove(playlists_[plIdx].filename.c_str()); - global_fs->rename(tmpPath, playlists_[plIdx].filename.c_str()); + result[result_len] = '\0'; + pm_sd_write_binary_file(playlists_[plIdx].filename, + reinterpret_cast(result), + result_len); + tmp.unload(); if (source_ == PlaySource::Playlist && pl_index_ == plIdx) { - cursor_.unload(); - cursor_.load(playlists_[plIdx].filename.c_str(), false); + cursor_.load(playlists_[plIdx].filename, false); playlists_[plIdx].count = cursor_.count(); } else { playlists_[plIdx].count = -1; @@ -366,76 +397,45 @@ bool PlaylistManager::removeFromPlaylist(int plIdx, int entryIndex) { return true; } -// Private helpers - void PlaylistManager::scanPlaylists_() { - playlists_.clear(); - if (!global_fs) return; - - File dir = global_fs->open(kPlDir); - if (!dir || !dir.isDirectory()) return; - - File entry; - while ((entry = dir.openNextFile())) { - if (entry.isDirectory()) { entry.close(); continue; } - - String fname = String(entry.name()); - if (!fname.endsWith(".m3u")) { entry.close(); continue; } - - // Strip .m3u and directory prefix for display name - String dname = fname.substring(0, fname.length() - 4); - int slash = dname.lastIndexOf('/'); - if (slash >= 0) dname = dname.substring(slash + 1); - - PlaylistMeta meta; - meta.filename = fname; - meta.name = dname; - meta.count = -1; - playlists_.push_back(meta); - entry.close(); - } - - dir.close(); -} - -bool PlaylistManager::removeLine_(const char* filePath, const char* line) { - if (!global_fs) return false; - - File f = global_fs->open(filePath, "r"); - if (!f) return false; - - const char* tmpPath = "/music/.muse/.fav_tmp"; - File out = global_fs->open(tmpPath, "w"); - if (!out) { f.close(); return false; } - - char buf[256]; - bool found = false; - while (f.available()) { - int i = 0; - while (i < 255) { - int c = f.read(); - if (c < 0 || c == '\n') break; - buf[i++] = (char)c; + playlist_count_ = 0; + + int count = pm_sd_dir_open(paths::kPlaylistsDir); + if (count < 0) return; + + char name[128]; + bool is_dir; + for (int i = 0; i < count; i++) { + if (!pm_sd_dir_entry(i, name, sizeof(name), &is_dir)) continue; + if (is_dir) continue; + + size_t nlen = std::strlen(name); + if (nlen < 4 || std::strcmp(name + nlen - 4, ".m3u") != 0) continue; + + if (playlist_count_ >= playlists_cap_) { + int new_cap = playlists_cap_ ? playlists_cap_ * 2 : 16; + PlaylistMeta* np = static_cast( + std::realloc(playlists_, new_cap * sizeof(PlaylistMeta))); + if (!np) { pm_sd_dir_close(); return; } + playlists_ = np; + playlists_cap_ = new_cap; } - buf[i] = '\0'; - if (!found && strcmp(buf, line) == 0) { - found = true; - continue; - } - out.println(buf); + PlaylistMeta& meta = playlists_[playlist_count_]; + snprintf(meta.filename, sizeof(meta.filename), "%s/%s", paths::kPlaylistsDir, name); + std::strncpy(meta.name, name, sizeof(meta.name) - 1); + meta.name[sizeof(meta.name) - 1] = '\0'; + // Strip .m3u + char* dot = std::strrchr(meta.name, '.'); + if (dot) *dot = '\0'; + meta.count = -1; + playlist_count_++; } - f.close(); - out.close(); - - global_fs->remove(filePath); - global_fs->rename(tmpPath, filePath); - - if (source_ == PlaySource::Favorites) { - cursor_.unload(); - cursor_.load(kFavFile, true); - } + pm_sd_dir_close(); +} - return found; +PlaylistManager& playlistMgr() { + static PlaylistManager mgr; + return mgr; } diff --git a/src/ui/ui_browser.cpp b/src/ui/ui_browser.cpp index a9283fbc..da24edc3 100644 --- a/src/ui/ui_browser.cpp +++ b/src/ui/ui_browser.cpp @@ -1,20 +1,28 @@ -#include #include "muse.h" +#include "library.h" +#include "playlist.h" +#include "ui_helpers.h" + +#include "paths.h" +#include "pm_app_api.h" + +#include +#include static constexpr int kItemH = 10; static constexpr int kListTop = 32; -static constexpr int kListBot = kEinkContentH; +static constexpr int kListBot = 214; static constexpr int kMaxVis = (kListBot - kListTop) / kItemH; // 18 rows static int g_scrollOffset = 0; static const char* source_label() { - switch (g_playlistMgr.source()) { + switch (playlistMgr().source()) { case PlaySource::Library: return "Library"; case PlaySource::Favorites: return "Favorites"; case PlaySource::Playlist: { - int pi = g_playlistMgr.playlistIndex(); - if (pi >= 0) return g_playlistMgr.playlistMeta(pi).name.c_str(); + int pi = playlistMgr().playlistIndex(); + if (pi >= 0) return playlistMgr().playlistMeta(pi).name; return "Playlist"; } } @@ -22,10 +30,10 @@ static const char* source_label() { } static int track_count() { - switch (g_playlistMgr.source()) { - case PlaySource::Library: return g_library.count(); + switch (playlistMgr().source()) { + case PlaySource::Library: return library().count(); case PlaySource::Favorites: - case PlaySource::Playlist: return g_playlistMgr.entryCount(); + case PlaySource::Playlist: return playlistMgr().entryCount(); } return 0; } @@ -40,7 +48,6 @@ void browser_init() { void browser_process_key(char ch) { int n = track_count(); - int page = kMaxVis; switch (ch) { case 19: // LEFT - prev track @@ -73,7 +80,7 @@ void browser_process_key(char ch) { if (n > 0 && g_selIndex < n) { char path[256]; if (get_track_path(g_selIndex, path, sizeof(path)) && path[0]) { - g_isFavorite = g_playlistMgr.toggleFavorite(path); + g_isFavorite = playlistMgr().toggleFavorite(path); } } g_needsRedraw = true; @@ -92,11 +99,11 @@ void browser_process_key(char ch) { break; } case 'd': case 'D': - if (g_playlistMgr.source() == PlaySource::Playlist && n > 0) { - int pi = g_playlistMgr.playlistIndex(); + if (playlistMgr().source() == PlaySource::Playlist && n > 0) { + int pi = playlistMgr().playlistIndex(); int idx = g_selIndex; if (idx < g_trackCount) { - g_playlistMgr.removeFromPlaylist(pi, idx); + playlistMgr().removeFromPlaylist(pi, idx); g_trackCount = track_count(); if (g_selIndex >= g_trackCount && g_selIndex > 0) g_selIndex--; g_needsRedraw = true; @@ -118,7 +125,7 @@ void browser_process_key(char ch) { } void browser_render() { - beginEinkScreen(); + pm_ui_begin_eink_screen(false); char hdr[64]; snprintf(hdr, sizeof(hdr), "%s [%d]", source_label(), g_trackCount); @@ -126,12 +133,12 @@ void browser_render() { int n = track_count(); if (n == 0) { - FontEngine::drawText(DisplayTarget::EINK, 8, 80, - "No tracks found", FontStyle::Body); - FontEngine::drawText(DisplayTarget::EINK, 8, 94, - "Place .mp3 files in /music/ on SD", FontStyle::Body); - draw_footer("No tracks - add .mp3 files to /music/"); - EINK().refresh(); + char hint[96]; + snprintf(hint, sizeof(hint), "Put .mp3 files in %s", paths::kMusicDir); + pm_text(PM_TARGET_EINK, 8, 80, "No tracks found", PM_STYLE_BODY); + pm_text(PM_TARGET_EINK, 8, 94, hint, PM_STYLE_BODY); + draw_footer("No tracks - add .mp3 files to the music folder"); + pm_eink_refresh(); return; } @@ -142,32 +149,33 @@ void browser_render() { int end = g_scrollOffset + kMaxVis; if (end > n) end = n; + int w = pm_eink_width(); + for (int i = g_scrollOffset; i < end; i++) { char path[256]; char label[64]; get_track_path(i, path, sizeof(path)); get_display_name(path, label, sizeof(label)); - String row = truncateWithEllipsis(label, display.width() - 24, - FontStyle::Tiny); + // Truncate with ellipsis to fit the available width. + const char* ell = pm_layout_truncate_with_ellipsis( + label, w - 24, PM_STYLE_TINY, PM_TARGET_EINK); + char row[96]; + strncpy(row, ell, sizeof(row) - 1); + row[sizeof(row) - 1] = '\0'; if (i == g_selIndex) { - display.fillRect(0, y - 8, display.width(), kItemH, GxEPD_BLACK); - u8g2f.setForegroundColor(GxEPD_WHITE); - } else { - u8g2f.setForegroundColor(GxEPD_BLACK); + // Selected row: black outline rect, text drawn on top. + pm_eink_rect(0, y - 8, w - 1, y - 8 + kItemH, false, true); } - - FontEngine::drawText(DisplayTarget::EINK, 8, y, row, FontStyle::Tiny); - + pm_text(PM_TARGET_EINK, 8, y, row, PM_STYLE_TINY); y += kItemH; } - u8g2f.setForegroundColor(GxEPD_BLACK); draw_scrollbar(n, kMaxVis, g_scrollOffset); char footer[64] = {}; - if (g_playlistMgr.source() == PlaySource::Playlist) { + if (playlistMgr().source() == PlaySource::Playlist) { snprintf(footer, sizeof(footer), "L/R:nav SPC:play P:src F:fav D:del ?:help"); } else { @@ -176,5 +184,5 @@ void browser_render() { } draw_footer(footer); - EINK().refresh(); + pm_eink_refresh(); } diff --git a/src/ui/ui_helpers.cpp b/src/ui/ui_helpers.cpp index 89481890..eb4d23d9 100644 --- a/src/ui/ui_helpers.cpp +++ b/src/ui/ui_helpers.cpp @@ -1,136 +1,132 @@ -#include +#include "ui_helpers.h" + #include "muse.h" +#include "pm_app_api.h" + +#include +#include + static constexpr int kLineH = 10; void draw_header(const char* title) { - u8g2f.setForegroundColor(GxEPD_BLACK); - FontEngine::drawText(DisplayTarget::EINK, 8, 16, - title ? title : "", FontStyle::Body); - display.drawFastHLine(0, 22, display.width(), GxEPD_BLACK); + pm_text_color(PM_TARGET_EINK, 1); // black glyphs + pm_text(PM_TARGET_EINK, 8, 16, title ? title : "", PM_STYLE_BODY); + pm_eink_rect(0, 22, pm_eink_width() - 1, 22, false, true); } void draw_footer(const char* hints) { - EINK().drawStatusBar(hints ? hints : ""); + pm_eink_status_bar(hints ? hints : "", false); } void draw_scrollbar(int total, int visible, int position) { if (total <= visible) return; - drawScrollbar(total, visible, position, -1, 0, kEinkContentH, 3, - false, GxEPD_BLACK, GxEPD_WHITE); + int h = pm_eink_height(); + pm_ui_draw_scrollbar(total, visible, position, -1, 0, h, 3, + false, 0, 65535); } void format_time(char* buf, size_t bufSize, uint32_t seconds) { uint32_t m = seconds / 60; uint32_t s = seconds % 60; - snprintf(buf, bufSize, "%d:%02d", m, s); + snprintf(buf, bufSize, "%u:%02u", m, s); } void get_display_name(const char* path, char* out, size_t maxLen) { - const char* name = strrchr(path, '/'); + const char* name = std::strrchr(path, '/'); if (name) name++; else name = path; - strncpy(out, name, maxLen - 1); + std::strncpy(out, name, maxLen - 1); out[maxLen - 1] = '\0'; - char* dot = strrchr(out, '.'); - if (dot) { - char* p = dot; - while (*p) { *p = '\0'; p++; } - } + char* dot = std::strrchr(out, '.'); + if (dot) *dot = '\0'; } -void ui_update_oled() { - u8g2.clearBuffer(); +void truncate_text(const char* src, char* dst, size_t maxDst) { + std::strncpy(dst, src, maxDst - 1); + dst[maxDst - 1] = '\0'; +} - // Top line: play state + now playing - String now = " "; +void ui_update_oled() { + char now[128]; if (g_playState == PlayerState::Playing) { - now = ">> "; - now += g_nowTitle; if (g_nowArtist[0]) { - now += " - "; - now += g_nowArtist; + snprintf(now, sizeof(now), ">> %s - %s", g_nowTitle, g_nowArtist); + } else { + snprintf(now, sizeof(now), ">> %s", g_nowTitle); } } else if (g_playState == PlayerState::Paused) { - now = "|| "; - now += g_nowTitle; + snprintf(now, sizeof(now), "|| %s", g_nowTitle); } else if (g_nowTitle[0]) { - now += g_nowTitle; + snprintf(now, sizeof(now), " %s", g_nowTitle); } else { - now += "PocketMuse"; + snprintf(now, sizeof(now), " PocketMuse"); } - FontEngine::drawText(DisplayTarget::OLED, 0, 8, now, FontStyle::Tiny); - uint32_t elapsed = (uint32_t)(g_nowProgress * g_nowDuration); - char timeStr[32]; + uint32_t elapsed = static_cast(g_nowProgress * g_nowDuration); char elStr[16], durStr[16]; format_time(elStr, sizeof(elStr), elapsed); format_time(durStr, sizeof(durStr), g_nowDuration); + char timeStr[32]; snprintf(timeStr, sizeof(timeStr), "%s / %s", elStr, durStr); - // Progress bar outline - u8g2.drawFrame(0, 14, 144, 7); - if (g_nowProgress > 0.0f) { - int filled = (int)(142 * g_nowProgress); - if (filled > 0) u8g2.drawBox(1, 15, filled, 5); + const char* src = "Library"; + switch (playlistMgr().source()) { + case PlaySource::Library: src = "Library"; break; + case PlaySource::Favorites: src = "Favorites"; break; + case PlaySource::Playlist: src = "Playlist"; break; } + char srcBuf[64]; + snprintf(srcBuf, sizeof(srcBuf), "%s [%d]", src, g_trackCount); - // Time on right side - FontEngine::drawText(DisplayTarget::OLED, 152, 20, timeStr, FontStyle::Tiny); - - // Bottom line: source + count - String src; - switch (g_playlistMgr.source()) { - case PlaySource::Library: src = "Library"; break; - case PlaySource::Favorites: src = "Favorites"; break; - case PlaySource::Playlist: src = "Playlist"; break; - } - char srcBuf[32]; - snprintf(srcBuf, sizeof(srcBuf), "%s [%d]", src.c_str(), g_trackCount); - FontEngine::drawText(DisplayTarget::OLED, 0, 30, srcBuf, FontStyle::Tiny); - - // Volume bar on right side int volPct = (g_volume * 100 + 127) / 255; char volBuf[16]; - snprintf(volBuf, sizeof(volBuf), "V:%3d%%", volPct); - FontEngine::drawText(DisplayTarget::OLED, 152, 30, volBuf, FontStyle::Tiny); - - u8g2.sendBuffer(); + snprintf(volBuf, sizeof(volBuf), "V:%3u%%", volPct); + + // Draw all four lines to the OLED buffer, then send once. + pm_oled_clear(); + pm_text_color(PM_TARGET_OLED, 1); + pm_text(PM_TARGET_OLED, 0, 8, now, PM_STYLE_HEADING2); + pm_text(PM_TARGET_OLED, 0, 20, timeStr, PM_STYLE_TINY); + pm_text(PM_TARGET_OLED, 0, 30, srcBuf, PM_STYLE_TINY); + // Volume on the right side of the last line + int vol_w = pm_text_width(PM_TARGET_OLED, volBuf, PM_STYLE_TINY); + pm_text(PM_TARGET_OLED, 256 - vol_w - 2, 30, volBuf, PM_STYLE_TINY); + pm_oled_send(); } void ui_show_help() { - beginEinkScreen(); + pm_ui_begin_eink_screen(false); - FontEngine::drawText(DisplayTarget::EINK, 8, 18, - "PocketMuse Controls", FontStyle::Body); - display.drawFastHLine(0, 22, display.width(), GxEPD_BLACK); + pm_text_color(PM_TARGET_EINK, 1); + pm_text(PM_TARGET_EINK, 8, 18, "PocketMuse Controls", PM_STYLE_BODY); + pm_eink_rect(0, 22, pm_eink_width() - 1, 22, false, true); struct Row { const char* key; const char* desc; }; Row rows[] = { - { "LEFT/RIGHT","Navigate / skip track" }, - { "UP/DOWN", "Volume (Now Playing)" }, - { "SPACE", "Play / pause" }, - { "ENTER", "Select / play" }, - { "P", "Cycle source (Lib/Fav/Pl)" }, - { "F", "Toggle favorite" }, - { "S", "Toggle shuffle" }, - { "L", "Cycle loop (None/One/All)" }, - { "D", "Delete from playlist" }, - { "B", "Back to browser" }, - { "?", "Show this screen" }, - { "ESC / A", "Exit to OS" }, + { "LEFT/RIGHT", "Navigate / skip track" }, + { "UP/DOWN", "Volume (Now Playing)" }, + { "SPACE", "Play / pause" }, + { "ENTER", "Select / play" }, + { "P", "Cycle source (Lib/Fav/Pl)" }, + { "F", "Toggle favorite" }, + { "S", "Toggle shuffle" }, + { "L", "Cycle loop (None/One/All)" }, + { "D", "Delete from playlist" }, + { "B", "Back to browser" }, + { "?", "Show this screen" }, + { "ESC / A", "Exit to OS" }, }; int y = 38; for (auto& r : rows) { - FontEngine::drawText(DisplayTarget::EINK, 8, y, r.key, FontStyle::Tiny); - FontEngine::drawText(DisplayTarget::EINK, 82, y, r.desc, FontStyle::Tiny); + pm_text(PM_TARGET_EINK, 8, y, r.key, PM_STYLE_TINY); + pm_text(PM_TARGET_EINK, 82, y, r.desc, PM_STYLE_TINY); y += 12; } - display.drawFastHLine(0, y + 4, display.width(), GxEPD_BLACK); - FontEngine::drawText(DisplayTarget::EINK, 8, y + 16, - "Press any key to close", FontStyle::Tiny); + pm_eink_rect(0, y + 4, pm_eink_width() - 1, y + 4, false, true); + pm_text(PM_TARGET_EINK, 8, y + 16, "Press any key to close", PM_STYLE_TINY); draw_footer("PocketMuse help"); - EINK().refresh(); -} \ No newline at end of file + pm_eink_refresh(); +} diff --git a/src/ui/ui_nowplaying.cpp b/src/ui/ui_nowplaying.cpp index b82c3638..e85c16df 100644 --- a/src/ui/ui_nowplaying.cpp +++ b/src/ui/ui_nowplaying.cpp @@ -1,6 +1,11 @@ -#include #include "muse.h" #include "albumart.h" +#include "ui_helpers.h" + +#include "pm_app_api.h" + +#include +#include static constexpr int kArtX = 8; static constexpr int kArtY = 28; @@ -8,16 +13,15 @@ static constexpr int kArtSize = 120; static constexpr int kInfoX = 136; static constexpr int kInfoW = 176; +static uint8_t s_artCache[(kArtSize * kArtSize) / 8]; +static char s_artCachePath[256] = {}; +static int s_cachedW = 0, s_cachedH = 0; + void nowplaying_init() { g_appMode = MODE_NOWPLAYING; g_needsRedraw = true; } -static void truncate_text(const char* src, char* dst, size_t maxDst) { - strncpy(dst, src, maxDst - 1); - dst[maxDst - 1] = '\0'; -} - void nowplaying_process_key(char ch) { int n = g_trackCount > 0 ? g_trackCount : 1; @@ -66,7 +70,7 @@ void nowplaying_process_key(char ch) { break; case 'f': case 'F': { if (g_nowPath[0]) { - g_isFavorite = g_playlistMgr.toggleFavorite(g_nowPath); + g_isFavorite = playlistMgr().toggleFavorite(g_nowPath); } g_needsRedraw = true; break; @@ -92,10 +96,6 @@ void nowplaying_process_key(char ch) { } } -static uint8_t s_artCache[(kArtSize * kArtSize) / 8]; -static char s_artCachePath[256] = {}; -static int s_cachedW = 0, s_cachedH = 0; - void nowplaying_cache_art(const char* path) { s_cachedW = 0; s_cachedH = 0; @@ -109,22 +109,20 @@ void nowplaying_cache_art(const char* path) { if (art.render1Bit(s_artCache, kArtSize, kArtSize, 0, 0, kArtSize)) { s_cachedW = art.width(); s_cachedH = art.height(); - strncpy(s_artCachePath, path, sizeof(s_artCachePath) - 1); + std::strncpy(s_artCachePath, path, sizeof(s_artCachePath) - 1); s_artCachePath[sizeof(s_artCachePath) - 1] = '\0'; } } void nowplaying_render() { - beginEinkScreen(); + pm_ui_begin_eink_screen(false); if (g_nowTitle[0] == '\0' && g_nowPath[0] == '\0') { draw_header("Now Playing"); - FontEngine::drawText(DisplayTarget::EINK, 8, 80, - "Nothing playing", FontStyle::Tiny); - FontEngine::drawText(DisplayTarget::EINK, 8, 94, - "Select a track from the browser", FontStyle::Tiny); + pm_text(PM_TARGET_EINK, 8, 80, "Nothing playing", PM_STYLE_TINY); + pm_text(PM_TARGET_EINK, 8, 94, "Select a track from the browser", PM_STYLE_TINY); draw_footer("B:browser ?:help"); - EINK().refresh(); + pm_eink_refresh(); return; } @@ -141,16 +139,21 @@ void nowplaying_render() { bool artDrawn = false; if (s_cachedW > 0 && s_cachedH > 0) { - display.drawBitmap(kArtX, kArtY, s_artCache, - s_cachedW, s_cachedH, GxEPD_BLACK); + int rowBytes = (s_cachedW + 7) / 8; + for (int py = 0; py < s_cachedH; py++) { + for (int px = 0; px < s_cachedW; px++) { + int byteIdx = py * rowBytes + (px >> 3); + bool bit = (s_artCache[byteIdx] >> (7 - (px & 7))) & 1; + pm_eink_pixel(kArtX + px, kArtY + py, bit); + } + } artDrawn = true; } // If no art, draw a placeholder frame if (!artDrawn) { - display.drawRect(kArtX, kArtY, kArtSize, kArtSize, GxEPD_BLACK); - FontEngine::drawText(DisplayTarget::EINK, kArtX + 32, kArtY + 64, - "No Art", FontStyle::Tiny); + pm_eink_rect(kArtX, kArtY, kArtX + kArtSize - 1, kArtY + kArtSize - 1, false, true); + pm_text(PM_TARGET_EINK, kArtX + 32, kArtY + 64, "No Art", PM_STYLE_TINY); } // Track info @@ -158,58 +161,47 @@ void nowplaying_render() { // Title truncate_text(g_nowTitle, buf, sizeof(buf)); - String title = truncateWithEllipsis(buf, kInfoW - 8, FontStyle::Body); - FontEngine::drawText(DisplayTarget::EINK, kInfoX, kArtY + 18, - title, FontStyle::Body); + pm_text(PM_TARGET_EINK, kInfoX, kArtY + 18, buf, PM_STYLE_BODY); // Artist truncate_text(g_nowArtist, buf, sizeof(buf)); if (buf[0]) { - String artist = truncateWithEllipsis(buf, kInfoW - 8, FontStyle::Body); - FontEngine::drawText(DisplayTarget::EINK, kInfoX, kArtY + 40, - artist, FontStyle::Body); + pm_text(PM_TARGET_EINK, kInfoX, kArtY + 40, buf, PM_STYLE_BODY); } // Album truncate_text(g_nowAlbum, buf, sizeof(buf)); if (buf[0]) { - String album = truncateWithEllipsis(buf, kInfoW - 8, FontStyle::Body); - FontEngine::drawText(DisplayTarget::EINK, kInfoX, kArtY + 60, - album, FontStyle::Body); + pm_text(PM_TARGET_EINK, kInfoX, kArtY + 60, buf, PM_STYLE_BODY); } // Status line int statusY = kArtY + 82; int col = kInfoX; if (g_isFavorite) { - FontEngine::drawText(DisplayTarget::EINK, col, statusY, - "Fav", FontStyle::Tiny); + pm_text(PM_TARGET_EINK, col, statusY, "Fav", PM_STYLE_TINY); col += 40; } switch (g_loopMode) { case LoopMode::None: break; case LoopMode::One: - FontEngine::drawText(DisplayTarget::EINK, col, statusY, - "R1", FontStyle::Tiny); + pm_text(PM_TARGET_EINK, col, statusY, "R1", PM_STYLE_TINY); col += 35; break; case LoopMode::All: - FontEngine::drawText(DisplayTarget::EINK, col, statusY, - "RA", FontStyle::Tiny); + pm_text(PM_TARGET_EINK, col, statusY, "RA", PM_STYLE_TINY); col += 35; break; } if (g_shuffleEnabled) { - FontEngine::drawText(DisplayTarget::EINK, col, statusY, - "Sf", FontStyle::Tiny); + pm_text(PM_TARGET_EINK, col, statusY, "Sf", PM_STYLE_TINY); col += 30; } // Volume char volBuf[16]; - snprintf(volBuf, sizeof(volBuf), "V:%d", (g_volume * 100 + 127) / 255); - FontEngine::drawText(DisplayTarget::EINK, col, statusY, - volBuf, FontStyle::Tiny); + snprintf(volBuf, sizeof(volBuf), "V:%u", (g_volume * 100 + 127) / 255); + pm_text(PM_TARGET_EINK, col, statusY, volBuf, PM_STYLE_TINY); // Play/pause status int playStatusY = statusY + 16; @@ -221,31 +213,29 @@ void nowplaying_render() { } else { playStatus = "[] Stopped"; } - FontEngine::drawText(DisplayTarget::EINK, kInfoX, playStatusY, - playStatus, FontStyle::Tiny); + pm_text(PM_TARGET_EINK, kInfoX, playStatusY, playStatus, PM_STYLE_TINY); // Progress bar int barY = kArtY + kArtSize + 14; - int barW = display.width() - 16; - display.drawRect(8, barY, barW, 8, GxEPD_BLACK); + int barW = pm_eink_width() - 16; + pm_eink_rect(8, barY, 8 + barW - 1, barY + 7, false, true); if (g_nowProgress > 0.0f && g_nowProgress <= 1.0f) { int filled = (int)((barW - 2) * g_nowProgress); - if (filled > 0) display.fillRect(9, barY + 1, filled, 6, GxEPD_BLACK); + if (filled > 0) pm_eink_rect(9, barY + 1, 9 + filled - 1, barY + 6, true, true); } // Time char timeBuf[32]; char elapsedStr[16]; char durationStr[16]; - uint32_t elapsed = (uint32_t)(g_nowProgress * g_nowDuration); + uint32_t elapsed = static_cast(g_nowProgress * g_nowDuration); format_time(elapsedStr, sizeof(elapsedStr), elapsed); format_time(durationStr, sizeof(durationStr), g_nowDuration); snprintf(timeBuf, sizeof(timeBuf), "%s / %s", elapsedStr, durationStr); - FontEngine::drawText(DisplayTarget::EINK, 8, barY + 24, - timeBuf, FontStyle::Tiny); + pm_text(PM_TARGET_EINK, 8, barY + 24, timeBuf, PM_STYLE_TINY); // Footer draw_footer("SPC:pause < >:skip /\\/:vol B:browser P:plist ?:help"); - EINK().refresh(); + pm_eink_refresh(); } diff --git a/src/ui/ui_playlist.cpp b/src/ui/ui_playlist.cpp index 11d51914..ca66b5da 100644 --- a/src/ui/ui_playlist.cpp +++ b/src/ui/ui_playlist.cpp @@ -1,9 +1,15 @@ -#include #include "muse.h" +#include "playlist.h" +#include "ui_helpers.h" + +#include "pm_app_api.h" + +#include +#include static constexpr int kItemH = 10; static constexpr int kListTop = 32; -static constexpr int kListBot = kEinkContentH; +static constexpr int kListBot = 214; static constexpr int kMaxVis = (kListBot - kListTop) / kItemH; // 18 rows static int g_plScroll = 0; @@ -32,12 +38,12 @@ void playlist_process_key(char ch) { } break; case 'd': case 'D': - if (g_playlistMgr.source() == PlaySource::Playlist) { - int pi = g_playlistMgr.playlistIndex(); + if (playlistMgr().source() == PlaySource::Playlist) { + int pi = playlistMgr().playlistIndex(); int idx = g_selIndex; if (idx < g_trackCount) { - g_playlistMgr.removeFromPlaylist(pi, idx); - g_trackCount = g_playlistMgr.entryCount(); + playlistMgr().removeFromPlaylist(pi, idx); + g_trackCount = playlistMgr().entryCount(); if (g_selIndex >= g_trackCount && g_selIndex > 0) g_selIndex--; g_needsRedraw = true; } @@ -60,12 +66,12 @@ void playlist_process_key(char ch) { } void playlist_render() { - beginEinkScreen(); + pm_ui_begin_eink_screen(false); const char* srcName = ""; - if (g_playlistMgr.source() == PlaySource::Playlist) { - int pi = g_playlistMgr.playlistIndex(); - if (pi >= 0) srcName = g_playlistMgr.playlistMeta(pi).name.c_str(); + if (playlistMgr().source() == PlaySource::Playlist) { + int pi = playlistMgr().playlistIndex(); + if (pi >= 0) srcName = playlistMgr().playlistMeta(pi).name; } char hdr[64]; @@ -74,10 +80,9 @@ void playlist_render() { int n = g_trackCount; if (n == 0) { - FontEngine::drawText(DisplayTarget::EINK, 8, 80, - "Playlist is empty", FontStyle::Body); + pm_text(PM_TARGET_EINK, 8, 80, "Playlist is empty", PM_STYLE_BODY); draw_footer("B:back ?:help"); - EINK().refresh(); + pm_eink_refresh(); return; } @@ -88,6 +93,8 @@ void playlist_render() { int end = g_plScroll + kMaxVis; if (end > n) end = n; + int w = pm_eink_width(); + for (int i = g_plScroll; i < end; i++) { // Track number + name char path[256]; @@ -97,36 +104,33 @@ void playlist_render() { char prefix[8]; snprintf(prefix, sizeof(prefix), "%2d.", i + 1); - String row = String(prefix) + " " + label; - row = truncateWithEllipsis(row, display.width() - 30, - FontStyle::Tiny); + char row[96]; + snprintf(row, sizeof(row), "%s %s", prefix, label); + + // Truncate with ellipsis to fit the available width. + const char* ell = pm_layout_truncate_with_ellipsis( + row, w - 30, PM_STYLE_TINY, PM_TARGET_EINK); + strncpy(row, ell, sizeof(row) - 1); + row[sizeof(row) - 1] = '\0'; if (i == g_selIndex) { - display.fillRect(0, y - 8, display.width(), kItemH, GxEPD_BLACK); - u8g2f.setForegroundColor(GxEPD_WHITE); - } else if (i == g_nowTrackIndex) { - display.drawRect(4, y - 8, display.width() - 8, kItemH, GxEPD_BLACK); - u8g2f.setForegroundColor(GxEPD_BLACK); - } else { - u8g2f.setForegroundColor(GxEPD_BLACK); + // Selected row: black outline rect, text drawn on top. + pm_eink_rect(0, y - 8, w - 1, y - 8 + kItemH, false, true); } - - FontEngine::drawText(DisplayTarget::EINK, 8, y, row, FontStyle::Tiny); + pm_text(PM_TARGET_EINK, 8, y, row, PM_STYLE_TINY); // Now playing indicator if (i == g_nowTrackIndex && g_playState != PlayerState::Stopped) { - FontEngine::drawText(DisplayTarget::EINK, display.width() - 22, - y, ">", FontStyle::Tiny); + pm_text(PM_TARGET_EINK, w - 22, y, ">", PM_STYLE_TINY); } y += kItemH; } - u8g2f.setForegroundColor(GxEPD_BLACK); draw_scrollbar(n, kMaxVis, g_plScroll); char footer[64]; - if (g_playlistMgr.source() == PlaySource::Playlist) { + if (playlistMgr().source() == PlaySource::Playlist) { snprintf(footer, sizeof(footer), "L/R:nav SPC:play D:del B:back ?:help"); } else { @@ -135,5 +139,5 @@ void playlist_render() { } draw_footer(footer); - EINK().refresh(); + pm_eink_refresh(); } diff --git a/src/ui_player.cpp b/src/ui_player.cpp index 617a4844..ada84dd8 100644 --- a/src/ui_player.cpp +++ b/src/ui_player.cpp @@ -1,45 +1,69 @@ -#include +#include "ui_player.h" + #include "muse.h" -#include "albumart.h" +#include "library.h" +#include "playlist.h" #include "metacache.h" -#include "AudioTools/Disk/WAVFileInfo.h" -#include -#include -#include +#include "albumart.h" + +#include "pm_app_api.h" -using namespace audio_tools; +#include +#include -// Fisher-Yates shuffle state -static std::vector s_shuffleIdx; -static int s_shufflePos = 0; +int* g_shuffleIdx = nullptr; +int g_shuffleIdxCount = 0; +int g_shufflePos = 0; -static void build_shuffle() { +void build_shuffle() { int n = g_trackCount; - if (n <= 0) { s_shuffleIdx.clear(); return; } - s_shuffleIdx.resize(n); - for (int i = 0; i < n; i++) s_shuffleIdx[i] = i; - for (int i = n - 1; i > 0; i--) { - int j = rand() % (i + 1); - std::swap(s_shuffleIdx[i], s_shuffleIdx[j]); + if (n <= 0) { + std::free(g_shuffleIdx); + g_shuffleIdx = nullptr; + g_shuffleIdxCount = 0; + g_shufflePos = 0; + return; + } + if (g_shuffleIdx && g_shuffleIdxCount == n) { + // Re-shuffle in place + for (int i = n - 1; i > 0; i--) { + int j = static_cast((static_cast(std::rand()) / RAND_MAX) * i); + int t = g_shuffleIdx[i]; + g_shuffleIdx[i] = g_shuffleIdx[j]; + g_shuffleIdx[j] = t; + } + } else { + std::free(g_shuffleIdx); + g_shuffleIdx = static_cast(std::malloc(n * sizeof(int))); + g_shuffleIdxCount = n; + if (!g_shuffleIdx) return; + for (int i = 0; i < n; i++) g_shuffleIdx[i] = i; + for (int i = n - 1; i > 0; i--) { + int j = static_cast((static_cast(std::rand()) / RAND_MAX) * i); + int t = g_shuffleIdx[i]; + g_shuffleIdx[i] = g_shuffleIdx[j]; + g_shuffleIdx[j] = t; + } } - s_shufflePos = 0; + g_shufflePos = 0; } bool get_track_path(int index, char* buf, size_t bufSize) { if (!buf || bufSize == 0) return false; buf[0] = '\0'; - switch (g_playlistMgr.source()) { + PlaySource src = playlistMgr().source(); + switch (src) { case PlaySource::Library: - if (index >= 0 && index < g_library.count()) { - const String& p = g_library.path(index); - strncpy(buf, p.c_str(), bufSize - 1); + if (index >= 0 && index < library().count()) { + const char* p = library().path(index); + std::strncpy(buf, p, bufSize - 1); buf[bufSize - 1] = '\0'; } break; case PlaySource::Favorites: case PlaySource::Playlist: - g_playlistMgr.getEntry(index, buf, bufSize); + playlistMgr().getEntry(index, buf, bufSize); break; } return buf[0] != '\0'; @@ -47,89 +71,66 @@ bool get_track_path(int index, char* buf, size_t bufSize) { // Compute approximate duration from file size + format header. uint32_t compute_duration(const char* path) { - if (!path || !path[0] || !global_fs) return 0; + if (!path || !path[0]) return 0; - File f = global_fs->open(path, "r"); - if (!f) return 0; + size_t fsize = pm_sd_get_file_size(path); + if (fsize < 128) return 0; - size_t fileSize = f.size(); - if (fileSize < 128) { f.close(); return 0; } + char hdr_buf[128]; + if (!pm_sd_read_binary_file(path, + reinterpret_cast(hdr_buf), 128)) + return 0; - uint32_t duration = 0; + const uint8_t* hdr = reinterpret_cast(hdr_buf); - // Check for WAV using WAVFileInfo - WAVFileInfo wav; - WAVAudioInfo info; - if (wav.getInfo(f, info) && info.data_length > 0) { - uint32_t bytesPerSec = info.sample_rate * info.channels * (info.bits_per_sample / 8); - if (bytesPerSec > 0) { - duration = info.data_length / bytesPerSec; - } - } + // Check for MP3 MPEG frame header + for (size_t pos = 0; pos + 4 <= 128; pos++) { + if (hdr[pos] != 0xFF) continue; + if ((hdr[pos + 1] & 0xE0) != 0xE0) continue; + + uint8_t b2 = hdr[pos + 1]; + uint8_t b3 = hdr[pos + 2]; + + int version = (b2 >> 3) & 3; + int layer = (b2 >> 1) & 3; + int bitrateIdx = b3 >> 4; + + if (version == 1 || layer == 0 || bitrateIdx == 0 || bitrateIdx == 15) + continue; - // If not WAV, try MPEG frame header for bitrate - if (duration == 0) { - f.seek(0); - uint8_t buf[4]; - size_t pos = 0; - while (pos < fileSize - 1) { - int b = f.read(); - if (b < 0) break; - pos++; - if (b != 0xFF) continue; - - int b2 = f.read(); - if (b2 < 0) break; - pos++; - if ((b2 & 0xE0) != 0xE0) continue; - - buf[0] = 0xFF; - buf[1] = b2; - if (f.read(buf + 2, 2) != 2) break; - pos += 2; - - int version = (buf[1] >> 3) & 3; - int layer = (buf[1] >> 1) & 3; - int bitrateIdx = buf[2] >> 4; - - if (version == 1 || layer == 0 || bitrateIdx == 0 || bitrateIdx == 15) { - continue; - } - - static const int bitrate_mp3[15] = { - 0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320 + static const int bitrate_mp3[15] = { + 0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320 + }; + + int bitrate = 0; + if (version == 3 && layer == 1) { + bitrate = bitrate_mp3[bitrateIdx]; + } else if (version == 3 && layer == 2) { + static const int table_l2[15] = { + 0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384 + }; + bitrate = table_l2[bitrateIdx]; + } else if (version == 3 && layer == 3) { + static const int table_l1[15] = { + 0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448 }; + bitrate = table_l1[bitrateIdx]; + } else if (version == 2 || version == 0) { + static const int table_v2_l3[15] = { + 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160 + }; + bitrate = table_v2_l3[bitrateIdx]; + } - int bitrate = 0; - if (version == 3 && layer == 1) { - bitrate = bitrate_mp3[bitrateIdx]; - } else if (version == 3 && layer == 2) { - static const int table_l2[15] = { - 0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384 - }; - bitrate = table_l2[bitrateIdx]; - } else if (version == 3 && layer == 3) { - static const int table_l1[15] = { - 0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448 - }; - bitrate = table_l1[bitrateIdx]; - } else if (version == 2 || version == 0) { - static const int table_v2_l3[15] = { - 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160 - }; - bitrate = table_v2_l3[bitrateIdx]; - } - - if (bitrate > 0) { - uint64_t bits = (uint64_t)fileSize * 8; - duration = bits / ((uint64_t)bitrate * 1000); - } - break; + if (bitrate > 0) { + uint64_t bits = static_cast(fsize) * 8; + return static_cast(bits / + (static_cast(bitrate) * 1000)); } + break; } - f.close(); - return duration; + return 0; } void player_play_index(int index) { @@ -145,17 +146,25 @@ void player_play_index(int index) { get_display_name(path, g_nowTitle, sizeof(g_nowTitle)); - strncpy(g_nowPath, path, sizeof(g_nowPath) - 1); + std::strncpy(g_nowPath, path, sizeof(g_nowPath) - 1); g_nowPath[sizeof(g_nowPath) - 1] = '\0'; g_nowTrackIndex = index; g_nowDuration = compute_duration(path); g_nowProgress = 0.0f; - g_isFavorite = g_playlistMgr.isFavorite(path); + g_isFavorite = playlistMgr().isFavorite(path); g_playState = PlayerState::Playing; - nowplaying_cache_art(path); - music_play(path); + // Cache album art + AlbumArt art; + if (art.load(path)) { + uint8_t tmpBuf[128]; + if (art.render1Bit(tmpBuf, 16, 16, 0, 0, 16)) { + (void)tmpBuf; // art loaded + } + } + + pm_audio_play(path); g_needsRedraw = true; g_appMode = MODE_NOWPLAYING; @@ -166,13 +175,13 @@ void player_next_track() { int next; if (g_shuffleEnabled) { - if (s_shuffleIdx.empty() || (int)s_shuffleIdx.size() != n) build_shuffle(); - s_shufflePos++; - if (s_shufflePos >= n) { + if (!g_shuffleIdx || g_shuffleIdxCount != n) build_shuffle(); + g_shufflePos++; + if (g_shufflePos >= n) { build_shuffle(); - s_shufflePos = 0; + g_shufflePos = 0; } - next = s_shuffleIdx[s_shufflePos]; + next = g_shuffleIdx ? g_shuffleIdx[g_shufflePos] : 0; } else { next = g_nowTrackIndex + 1; if (g_loopMode == LoopMode::All && next >= n) next = 0; @@ -193,10 +202,10 @@ void player_prev_track() { int prev; if (g_shuffleEnabled) { - if (s_shuffleIdx.empty() || (int)s_shuffleIdx.size() != n) build_shuffle(); - s_shufflePos--; - if (s_shufflePos < 0) s_shufflePos = n - 1; - prev = s_shuffleIdx[s_shufflePos]; + if (!g_shuffleIdx || g_shuffleIdxCount != n) build_shuffle(); + g_shufflePos--; + if (g_shufflePos < 0) g_shufflePos = n - 1; + prev = g_shuffleIdx ? g_shuffleIdx[g_shufflePos] : 0; } else { prev = g_nowTrackIndex - 1; if (prev < 0) { @@ -210,44 +219,65 @@ void player_prev_track() { } void player_cycle_source() { - PlaySource cur = g_playlistMgr.source(); + PlaySource cur = playlistMgr().source(); switch (cur) { case PlaySource::Library: - if (g_playlistMgr.playFavorites()) { - return; - } - g_playlistMgr.playLibrary(); + if (playlistMgr().playFavorites()) break; + playlistMgr().playLibrary(); break; case PlaySource::Favorites: { - int plCount = g_playlistMgr.playlistCount(); + int plCount = playlistMgr().playlistCount(); if (plCount > 0) { - g_playlistMgr.playPlaylist(0); + playlistMgr().playPlaylist(0); } else { - g_playlistMgr.playLibrary(); + playlistMgr().playLibrary(); } break; } case PlaySource::Playlist: { - int next = g_playlistMgr.playlistIndex() + 1; - if (next < g_playlistMgr.playlistCount()) { - g_playlistMgr.playPlaylist(next); + int next = playlistMgr().playlistIndex() + 1; + if (next < playlistMgr().playlistCount()) { + playlistMgr().playPlaylist(next); } else { - g_playlistMgr.playLibrary(); + playlistMgr().playLibrary(); } break; } } - g_trackCount = g_playlistMgr.entryCount(); - if (g_playlistMgr.source() == PlaySource::Library) { - g_trackCount = g_library.count(); - } + g_trackCount = (playlistMgr().source() == PlaySource::Library) + ? library().count() + : playlistMgr().entryCount(); + if (g_trackCount <= 0) g_trackCount = library().count(); + + g_needsRedraw = true; } void player_toggle_favorite() { if (g_nowPath[0]) { - g_isFavorite = g_playlistMgr.toggleFavorite(g_nowPath); + g_isFavorite = playlistMgr().toggleFavorite(g_nowPath); + g_needsRedraw = true; } } + +void music_stop() { + pm_audio_stop_playback(); + g_playState = PlayerState::Stopped; + g_nowProgress = 0.0f; +} + +void music_play(const char* path) { + pm_audio_play(path); +} + +void music_pause() { + pm_audio_pause(); + g_playState = PlayerState::Paused; +} + +void music_resume() { + pm_audio_resume(); + g_playState = PlayerState::Playing; +} diff --git a/tools/make_icon.py b/tools/make_icon.py new file mode 100644 index 00000000..bc5431a8 --- /dev/null +++ b/tools/make_icon.py @@ -0,0 +1,50 @@ +"""Render a 40x40 1-bit PocketMage app icon from an image. + +Usage: + python3 make_icon.py input.png output.bin +""" + +from pathlib import Path + +from PIL import Image + +ICON_SIZE = 40 +CONFIRMATION = 200 + + +def convert_icon(input_path: Path, output_path: Path) -> None: + img = Image.open(input_path) + img = img.convert("L").resize((ICON_SIZE, ICON_SIZE), Image.NEAREST) + + # ink when the source pixel is darker than the midpoint + ink = lambda v: 0 if v < 128 else 255 # noqa: E731 + img = img.point(ink, "1") + + pixels = img.load() + data = bytearray() + for y in range(ICON_SIZE): + for x0 in range(0, ICON_SIZE, 8): + byte = 0 + for bit in range(8): + byte <<= 1 + if x0 + bit < ICON_SIZE and pixels[x0 + bit, y] == 0: + byte |= 1 + data.append(byte) + + if len(data) != CONFIRMATION: + raise SystemExit(f"bug: expected {CONFIRMATION} bytes, got {len(data)}") + + output_path.write_bytes(data) + print(f"wrote {output_path} ({CONFIRMATION} bytes)") + + +def main() -> None: + import sys + + if len(sys.argv) != 3: + raise SystemExit("usage: python3 make_icon.py input.png output.bin") + convert_icon(Path(sys.argv[1]), Path(sys.argv[2])) + + +if __name__ == "__main__": + main() \ No newline at end of file From c6852ee82beb774c941ee1c9dbfe57a51929e0f5 Mon Sep 17 00:00:00 2001 From: NellowTCS Date: Sun, 8 Nov 2026 20:12:09 -0700 Subject: [PATCH 2/3] It (mostly) works!!! --- Makefile | 1 + include/albumart.h | 44 ++- include/library.h | 31 +- include/metacache.h | 21 +- include/muse.h | 66 ++-- include/paths.h | 13 +- include/playlist.h | 103 +++--- include/ui_helpers.h | 10 +- include/ui_player.h | 15 +- src/albumart.cpp | 309 ++++++++--------- src/id3parser.cpp | 243 +++++++++++++ src/id3parser.h | 37 ++ src/library.cpp | 185 +++++----- src/main.cpp | 133 ++++--- src/metacache.cpp | 408 ++++++++++++---------- src/muse.cpp | 33 +- src/playlist.cpp | 730 +++++++++++++++++++++------------------ src/ui/ui_browser.cpp | 327 ++++++++++-------- src/ui/ui_helpers.cpp | 215 ++++++------ src/ui/ui_nowplaying.cpp | 410 +++++++++++----------- src/ui/ui_playlist.cpp | 235 +++++++------ src/ui_player.cpp | 468 +++++++++++++------------ 22 files changed, 2253 insertions(+), 1784 deletions(-) create mode 100644 src/id3parser.cpp create mode 100644 src/id3parser.h diff --git a/Makefile b/Makefile index 3109d932..87958b52 100644 --- a/Makefile +++ b/Makefile @@ -21,6 +21,7 @@ APP_SRCS := \ src/playlist.cpp \ src/metacache.cpp \ src/albumart.cpp \ + src/id3parser.cpp \ src/ui_player.cpp \ src/ui/ui_browser.cpp \ src/ui/ui_nowplaying.cpp \ diff --git a/include/albumart.h b/include/albumart.h index eb427053..385449a7 100644 --- a/include/albumart.h +++ b/include/albumart.h @@ -1,39 +1,37 @@ #pragma once -#include #include +#include class AlbumArt { public: - static constexpr int kMaxSize = 120; + static constexpr int kMaxSize = 120; - enum Format { kNone, kJPEG, kPNG }; + enum Format { kNone, kJPEG, kPNG }; - AlbumArt(); - ~AlbumArt(); + AlbumArt(); + ~AlbumArt(); - // Extract APIC from mp3Path and cache it. Returns true on success. - bool load(const char* mp3Path); - void clear(); + bool load(const char *mp3Path); + void clear(); - bool hasArt() const { return format_ != kNone; } - Format format() const { return format_; } - bool isJPEG() const { return format_ == kJPEG; } - bool isPNG() const { return format_ == kPNG; } + bool hasArt() const { return format_ != kNone; } + Format format() const { return format_; } + bool isJPEG() const { return format_ == kJPEG; } + bool isPNG() const { return format_ == kPNG; } - int width() const { return img_w_; } - int height() const { return img_h_; } + int width() const { return img_w_; } + int height() const { return img_h_; } - // Render cached art to a 1-bit e-ink buffer at (outX, outY) bounded by - // maxSize. Uses pm_image_decode_to_1bit. - bool render1Bit(uint8_t* einkBuf, int bufW, int bufH, - int outX, int outY, int maxSize = kMaxSize); + bool render1Bit(const char *mp3Path, uint8_t *einkBuf, int bufW, int bufH, + int outX, int outY, int maxSize = kMaxSize); private: - bool extractAPIC_(const char* mp3Path); - bool detectFormat_(); + bool extractAPIC_(const char *mp3Path); - Format format_; - int img_w_; - int img_h_; + Format format_; + int img_w_; + int img_h_; + uint32_t api_offset_; + uint32_t api_size_; }; diff --git a/include/library.h b/include/library.h index f5153d24..22eba53e 100644 --- a/include/library.h +++ b/include/library.h @@ -1,30 +1,29 @@ #pragma once -#include #include +#include class Library { public: - Library(); - ~Library(); + Library(); + ~Library(); - int scan(); - void clear(); + int scan(); + void clear(); - int count() const { return count_; } - const char* path(int index) const; + int count() const { return count_; } + const char *path(int index) const; private: - void scanDir_(const char* dirname, int depth, int maxDepth); + void scanDir_(const char *dirname, int depth, int maxDepth); - static constexpr int kMaxDepth = 3; - static constexpr int kFallbackDepth = 1; - static constexpr int kMaxTracks = 400; + static constexpr int kMaxDepth = 3; + static constexpr int kFallbackDepth = 1; + static constexpr int kMaxTracks = 400; - const char** tracks_; // malloc'd array of char* (each malloc'd) - int tracks_cap_; - int count_; + const char **tracks_; + int tracks_cap_; + int count_; }; -// Global accessor (function-local static). -Library& library(); +Library &library(); diff --git a/include/metacache.h b/include/metacache.h index 21e6ba68..64ab20a2 100644 --- a/include/metacache.h +++ b/include/metacache.h @@ -1,25 +1,24 @@ #pragma once -#include #include +#include class MetadataCache { public: - bool load(const char* path, - char* title, size_t tSize, - char* artist, size_t aSize, - char* album, size_t lSize); + bool load(const char *path, char *title, size_t tSize, char *artist, + size_t aSize, char *album, size_t lSize); - void save(const char* path, - const char* title, const char* artist, const char* album); + void save(const char *path, const char *title, const char *artist, + const char *album); - void clear(); + void clear(); private: - static constexpr uint32_t kMagic = 0x4D455441; + static constexpr uint32_t kMagic = 0x4D455441; - bool readStr(const uint8_t*& p, const uint8_t* end, char* buf, size_t bufSize); + bool readStr(const uint8_t *&p, const uint8_t *end, char *buf, + size_t bufSize); }; // Global accessor. -MetadataCache& metaCache(); +MetadataCache &metaCache(); diff --git a/include/muse.h b/include/muse.h index 5fcdad88..dd0f46be 100644 --- a/include/muse.h +++ b/include/muse.h @@ -1,51 +1,52 @@ #pragma once -#include #include +#include #include "playlist.h" // App modes enum AppMode : uint8_t { - MODE_BROWSER, - MODE_NOWPLAYING, - MODE_PLAYLIST, - MODE_HELP, + MODE_BROWSER, + MODE_NOWPLAYING, + MODE_PLAYLIST, + MODE_HELP, }; // Player state enum class PlayerState : uint8_t { - Stopped, - Playing, - Paused, + Stopped, + Playing, + Paused, }; // Loop mode enum class LoopMode : uint8_t { - None, - One, - All, + None, + One, + All, }; -extern AppMode g_appMode; -extern AppMode g_prevMode; -extern bool g_needsRedraw; -extern int g_selIndex; -extern int g_trackCount; +extern AppMode g_appMode; +extern AppMode g_prevMode; +extern bool g_needsRedraw; +extern int g_selIndex; +extern int g_trackCount; -extern char g_nowPath[256]; -extern char g_nowTitle[128]; -extern char g_nowArtist[128]; -extern char g_nowAlbum[128]; +extern char g_nowPath[256]; +extern char g_nowTitle[128]; +extern char g_nowArtist[128]; +extern char g_nowAlbum[128]; extern uint32_t g_nowDuration; -extern float g_nowProgress; -extern int g_nowTrackIndex; -extern bool g_isFavorite; +extern float g_nowProgress; +extern size_t g_nowFileSize; +extern int g_nowTrackIndex; +extern bool g_isFavorite; extern PlayerState g_playState; extern LoopMode g_loopMode; -extern bool g_shuffleEnabled; -extern uint8_t g_volume; +extern bool g_shuffleEnabled; +extern uint8_t g_volume; // UI prototypes void browser_init(); @@ -54,6 +55,7 @@ void browser_render(); void nowplaying_init(); void nowplaying_process_key(char ch); +void nowplaying_cache_art(const char *path); void nowplaying_render(); void playlist_process_key(char ch); @@ -63,11 +65,11 @@ void ui_update_oled(); void ui_show_help(); // Shared UI helpers -void draw_header(const char* title); -void draw_footer(const char* hints); +void draw_header(const char *title); +void draw_footer(const char *hints); void draw_scrollbar(int total, int visible, int position); -void format_time(char* buf, size_t bufSize, uint32_t seconds); -void get_display_name(const char* path, char* out, size_t maxLen); +void format_time(char *buf, size_t bufSize, uint32_t seconds); +void get_display_name(const char *path, char *out, size_t maxLen); // Player control helpers void player_play_index(int index); @@ -75,11 +77,11 @@ void player_next_track(); void player_prev_track(); void player_cycle_source(); void player_toggle_favorite(); -bool get_track_path(int index, char* buf, size_t bufSize); -uint32_t compute_duration(const char* path); +bool get_track_path(int index, char *buf, size_t bufSize); +uint32_t compute_duration(const char *path); // Low-level playback control void music_stop(); -void music_play(const char* path); +void music_play(const char *path); void music_pause(); void music_resume(); diff --git a/include/paths.h b/include/paths.h index 979c3e44..074e56d6 100644 --- a/include/paths.h +++ b/include/paths.h @@ -1,13 +1,12 @@ #pragma once -// Filesystem layout of PocketMuse on the SD card. namespace paths { -constexpr const char* kMusicDir = "/music"; -constexpr const char* kStateDir = "/music/.muse"; -constexpr const char* kPlaylistsDir = "/music/.muse/playlists"; -constexpr const char* kFavorites = "/music/.muse/favs.txt"; -constexpr const char* kMetadata = "/music/.muse/metadata.bin"; -constexpr const char* kAlbumArt = "/music/.muse/cache_art.jpg"; +constexpr const char *kMusicDir = "/music"; +constexpr const char *kStateDir = "/music/.muse"; +constexpr const char *kPlaylistsDir = "/music/.muse/playlists"; +constexpr const char *kFavorites = "/music/.muse/favs.txt"; +constexpr const char *kMetadata = "/music/.muse/metadata.bin"; +constexpr const char *kAlbumArt = "/music/.muse/cache_art.jpg"; } // namespace paths diff --git a/include/playlist.h b/include/playlist.h index e605e5ca..6ba169f3 100644 --- a/include/playlist.h +++ b/include/playlist.h @@ -1,89 +1,86 @@ #pragma once -#include #include +#include enum class PlaySource : uint8_t { - Library, - Favorites, - Playlist, + Library, + Favorites, + Playlist, }; struct PlaylistMeta { - char filename[256]; // full path to .m3u file - char name[64]; // display name (filename without .m3u) - int count; // total entries (-1 if not loaded) + char filename[256]; + char name[64]; + int count; }; -// Lightweight cursor into a playlist or favorites file. class PlaylistCursor { public: - PlaylistCursor(); - ~PlaylistCursor(); + PlaylistCursor(); + ~PlaylistCursor(); - bool load(const char* path, bool isFav); - void unload(); + bool load(const char *path, bool isFav); + void unload(); - int count() const { return count_; } - bool valid() const { return offsets_ != nullptr; } + int count() const { return count_; } + bool valid() const { return offsets_ != nullptr; } - bool getEntry(int index, char* pathBuf, size_t bufSize) const; + bool getEntry(int index, char *pathBuf, size_t bufSize) const; private: - bool parseM3U_(const char* data, size_t size); - bool parseFavs_(const char* data, size_t size); + bool parseM3U_(const char *data, size_t size); + bool parseFavs_(const char *data, size_t size); - uint32_t file_size_; - int count_; - char path_[256]; - uint32_t* offsets_; // heap-allocated byte offsets for each entry + uint32_t file_size_; + int count_; + char path_[256]; + uint32_t *offsets_; }; -// Global accessor (function-local static). class PlaylistManager { public: - PlaylistManager(); - ~PlaylistManager(); + PlaylistManager(); + ~PlaylistManager(); - bool begin(); + bool begin(); - int playlistCount() const { return playlist_count_; } - const PlaylistMeta& playlistMeta(int idx) const; - int findPlaylist(const char* name) const; + int playlistCount() const { return playlist_count_; } + const PlaylistMeta &playlistMeta(int idx) const; + int findPlaylist(const char *name) const; - bool createPlaylist(const char* name); - bool deletePlaylist(int idx); + bool createPlaylist(const char *name); + bool deletePlaylist(int idx); - PlaySource source() const { return source_; } - const PlaylistCursor& cursor() const { return cursor_; } - int playlistIndex() const { return pl_index_; } + PlaySource source() const { return source_; } + const PlaylistCursor &cursor() const { return cursor_; } + int playlistIndex() const { return pl_index_; } - bool playLibrary(); - bool playFavorites(); - bool playPlaylist(int idx); + bool playLibrary(); + bool playFavorites(); + bool playPlaylist(int idx); - int entryCount() const; - bool getEntry(int index, char* pathBuf, size_t bufSize); + int entryCount() const; + bool getEntry(int index, char *pathBuf, size_t bufSize); - bool toggleFavorite(const char* path); - bool isFavorite(const char* path); - int favoriteCount(); + bool toggleFavorite(const char *path); + bool isFavorite(const char *path); + int favoriteCount(); - bool addToPlaylist(int plIdx, const char* songPath); - bool removeFromPlaylist(int plIdx, int entryIndex); + bool addToPlaylist(int plIdx, const char *songPath); + bool removeFromPlaylist(int plIdx, int entryIndex); private: - void scanPlaylists_(); + void scanPlaylists_(); - PlaySource source_; - PlaylistCursor cursor_; - int pl_index_; - PlaylistMeta* playlists_; // malloc'd array - int playlists_cap_; - int playlist_count_; + PlaySource source_; + PlaylistCursor cursor_; + int pl_index_; + PlaylistMeta *playlists_; + int playlists_cap_; + int playlist_count_; - static constexpr int kMaxFavs = 256; + static constexpr int kMaxFavs = 256; }; -// Global accessor (function-local static). -PlaylistManager& playlistMgr(); +PlaylistManager &playlistMgr(); diff --git a/include/ui_helpers.h b/include/ui_helpers.h index 9f8b96e1..59815470 100644 --- a/include/ui_helpers.h +++ b/include/ui_helpers.h @@ -4,11 +4,11 @@ #include -void draw_header(const char* title); -void draw_footer(const char* hints); +void draw_header(const char *title); +void draw_footer(const char *hints); void draw_scrollbar(int total, int visible, int position); -void format_time(char* buf, size_t bufSize, uint32_t seconds); -void get_display_name(const char* path, char* out, size_t maxLen); -void truncate_text(const char* src, char* dst, size_t maxDst); +void format_time(char *buf, size_t bufSize, uint32_t seconds); +void get_display_name(const char *path, char *out, size_t maxLen); +void truncate_text(const char *src, char *dst, size_t maxDst); void ui_update_oled(); void ui_show_help(); diff --git a/include/ui_player.h b/include/ui_player.h index 23738afc..5634db2d 100644 --- a/include/ui_player.h +++ b/include/ui_player.h @@ -2,18 +2,17 @@ #include "muse.h" -#include #include +#include -// Fisher-Yates shuffle state (app-side) -extern int* g_shuffleIdx; -extern int g_shuffleIdxCount; -extern int g_shufflePos; +extern int *g_shuffleIdx; +extern int g_shuffleIdxCount; +extern int g_shufflePos; void build_shuffle(); -bool get_track_path(int index, char* buf, size_t bufSize); -uint32_t compute_duration(const char* path); +bool get_track_path(int index, char *buf, size_t bufSize); +uint32_t compute_duration(const char *path); void player_play_index(int index); void player_next_track(); @@ -22,6 +21,6 @@ void player_cycle_source(); void player_toggle_favorite(); void music_stop(); -void music_play(const char* path); +void music_play(const char *path); void music_pause(); void music_resume(); diff --git a/src/albumart.cpp b/src/albumart.cpp index 223a2d97..6a853123 100644 --- a/src/albumart.cpp +++ b/src/albumart.cpp @@ -1,184 +1,179 @@ #include "albumart.h" -#include "paths.h" -#include "pm_app_api.h" - +#include #include -#include - -static uint32_t readSyncsafeInt(const uint8_t* buf) { - return ((uint32_t)buf[0] << 21) | - ((uint32_t)buf[1] << 14) | - ((uint32_t)buf[2] << 7) | - (uint32_t)buf[3]; -} +#include -AlbumArt::AlbumArt() - : format_(kNone), img_w_(0), img_h_(0) {} +#include "pm_app_api.h" -AlbumArt::~AlbumArt() { - clear(); +static uint32_t readSyncsafe(const uint8_t *p) { + return ((uint32_t)(p[0] & 0x7f) << 21) | ((uint32_t)(p[1] & 0x7f) << 14) | + ((uint32_t)(p[2] & 0x7f) << 7) | ((uint32_t)(p[3] & 0x7f)); } -bool AlbumArt::extractAPIC_(const char* mp3Path) { - uint8_t hdr10[10]; - if (!pm_sd_read_binary_file(mp3Path, hdr10, 10)) return false; - if (hdr10[0] != 'I' || hdr10[1] != 'D' || hdr10[2] != '3') return false; - - uint8_t ver = hdr10[3]; - if (ver < 3 || ver > 4) return false; - - uint32_t tagSize = readSyncsafeInt(hdr10 + 6); - if (tagSize < 10) return false; - // Cap: a sane tag is a few KB; anything larger is corrupt or malicious. - constexpr uint32_t kMaxTag = 64 * 1024; - if (tagSize > kMaxTag) tagSize = kMaxTag; - - uint8_t flags = hdr10[5]; - - // Read the whole tag (10-byte header + body) into a bounded buffer. - // pm_sd_read_binary_file reads from the start of the file, so we get the - // header again and skip it in the buffer. - uint32_t total = 10 + tagSize; - uint8_t* data = static_cast(std::malloc(total)); - if (!data) return false; - if (!pm_sd_read_binary_file(mp3Path, data, total)) { - std::free(data); - return false; - } - - size_t pos = 10; - if (flags & 0x40) { - // Extended header - if (pos + 4 > tagSize) { std::free(data); return false; } - uint32_t extSize = readSyncsafeInt(data + pos); - pos += 4 + extSize; - if (pos > tagSize) { std::free(data); return false; } - } - - bool footer = (ver == 4) && (flags & 0x10); - size_t tagEnd = pos + (tagSize - (footer ? 10 : 0)); - if (tagEnd > tagSize) tagEnd = tagSize; +static uint32_t be32(const uint8_t *p) { + return ((uint32_t)p[0] << 24) | ((uint32_t)p[1] << 16) | ((uint32_t)p[2] << 8) | + p[3]; +} - // Remove old cache - pm_sd_delete_file(paths::kAlbumArt); +static bool validFrameId(const uint8_t *id) { + for (int i = 0; i < 4; i++) + if (!((id[i] >= 'A' && id[i] <= 'Z') || (id[i] >= '0' && id[i] <= '9'))) + return false; + return true; +} - // Scan frames for APIC - while (pos + 10 <= tagEnd) { - const uint8_t* fhdr = data + pos; - char id[5] = {}; - std::memcpy(id, fhdr, 4); - if (id[0] == '\0') break; - - uint32_t fsize; - if (ver == 4) { - fsize = readSyncsafeInt(fhdr + 4); - } else { - fsize = ((uint32_t)fhdr[4] << 24 | - (uint32_t)fhdr[5] << 16 | - (uint32_t)fhdr[6] << 8 | - (uint32_t)fhdr[7]); - } - pos += 10; +static size_t apicPrefix(const uint8_t *b, size_t n, uint8_t *picType, bool *png) { + if (n < 4) + return 0; + + uint8_t enc = b[0]; + size_t p = 1; + while (p < n && b[p]) + p++; + size_t mimeLen = p - 1; + const char *mime = (const char *)b + 1; + if (++p >= n) + return 0; + *picType = b[p++]; + + if (enc == 0 || enc == 3) { + while (p < n && b[p]) + p++; + p += 1; + } else { + while (p + 1 < n && (b[p] || b[p + 1])) + p += 2; + p += 2; + } + + if (p > n) + return 0; + + if ((mimeLen == 10 && !strncasecmp(mime, "image/jpeg", 10)) || + (mimeLen == 9 && !strncasecmp(mime, "image/jpg", 9))) + *png = false; + else if (mimeLen == 9 && !strncasecmp(mime, "image/png", 9)) + *png = true; + else + return 0; + + return p; +} - if (fsize == 0 || pos + fsize > tagEnd) break; +AlbumArt::AlbumArt() : format_(kNone), img_w_(0), img_h_(0), api_offset_(0), api_size_(0) {} - if (std::strcmp(id, "APIC") != 0) { - pos += fsize; - continue; - } +AlbumArt::~AlbumArt() {} - // APIC body - if (pos >= tagEnd) break; - uint8_t encoding = data[pos++]; - fsize--; - - // Skip MIME type (null-terminated) - while (pos < tagEnd && data[pos] != 0) pos++; - if (pos >= tagEnd) break; - pos++; // skip null - - // Skip description (null-terminated, encoding-dependent) - if (encoding == 0x00 || encoding == 0x03) { - // Latin1 or UTF-8: null-terminated string - while (pos < tagEnd && data[pos] != 0) pos++; - if (pos < tagEnd) pos++; - } else { - // UTF-16: look for 0x0000 - while (pos + 1 < tagEnd && - !(data[pos] == 0 && data[pos + 1] == 0)) pos++; - pos += 2; - } +bool AlbumArt::load(const char *mp3Path) { + clear(); + return extractAPIC_(mp3Path); +} - if (pos >= tagEnd) break; - pos++; // skip picture type byte +void AlbumArt::clear() { + format_ = kNone; + img_w_ = img_h_ = 0; + api_offset_ = 0; + api_size_ = 0; +} - // The rest of the frame is the image data - size_t imgDataSize = tagEnd - pos; - if (imgDataSize == 0) break; +bool AlbumArt::render1Bit(const char *mp3Path, uint8_t *einkBuf, int bufW, int bufH, int outX, + int outY, int maxSize) { + if (format_ == kNone || !einkBuf) + return false; + return pm_image_decode_region_to_1bit(mp3Path, api_offset_, api_size_, einkBuf, bufW, bufH, + outX, outY, maxSize, true); +} - // Write image data to cache file - if (!pm_sd_write_binary_file(paths::kAlbumArt, data + pos, imgDataSize)) { - break; - } +bool AlbumArt::extractAPIC_(const char *mp3Path) { + int s = pm_sd_stream_open(mp3Path); + if (s < 0) + return false; - format_ = kJPEG; // tentative + bool found = false, haveAny = false; + uint32_t firstOff = 0, firstLen = 0; + bool firstPng = false; + uint8_t h[10]; + + do { + if (pm_sd_stream_read(s, h, 10) != 10 || memcmp(h, "ID3", 3) != 0) + break; + uint8_t ver = h[3]; + if (ver != 3 && ver != 4) + break; + if (ver == 3 && (h[5] & 0x80)) + break; + + uint32_t tagEnd = 10 + readSyncsafe(h + 6); + uint32_t pos = 10; + + if (h[5] & 0x40) { + uint8_t e[4]; + if (pm_sd_stream_read(s, e, 4) != 4) break; + pos += (ver == 4) ? readSyncsafe(e) : be32(e) + 4; } - std::free(data); - - if (format_ == kNone) return false; - - // Detect actual format - if (!detectFormat_()) { - pm_sd_delete_file(paths::kAlbumArt); - format_ = kNone; - return false; - } - return true; -} + while (pos + 10 <= tagEnd) { + if (!pm_sd_stream_seek(s, pos) || pm_sd_stream_read(s, h, 10) != 10) + break; + if (!validFrameId(h)) + break; -bool AlbumArt::detectFormat_() { - size_t fsize = pm_sd_get_file_size(paths::kAlbumArt); - if (fsize < 4) return false; + uint32_t fsize = (ver == 4) ? readSyncsafe(h + 4) : be32(h + 4); + uint32_t next = pos + 10 + fsize; + if (next > tagEnd) + break; - char magic_buf[4]; - if (!pm_sd_read_binary_file(paths::kAlbumArt, - reinterpret_cast(magic_buf), 4)) - return false; + if (fsize && memcmp(h, "APIC", 4) == 0) { + uint8_t f = h[9]; + + bool unusable = (ver == 4) ? (f & 0x0E) : (f & 0xC0); + uint32_t extra = (ver == 4) ? ((f & 0x40) ? 1 : 0) + ((f & 0x01) ? 4 : 0) + : ((f & 0x20) ? 1 : 0); + + if (!unusable && fsize > extra) { + uint32_t body = pos + 10 + extra, bodyLen = fsize - extra; + uint8_t b[256]; + size_t n = bodyLen < sizeof(b) ? bodyLen : sizeof(b); + uint8_t type = 0; + bool png = false; + size_t pre = 0; + + if (pm_sd_stream_seek(s, body) && pm_sd_stream_read(s, b, n) == n) + pre = apicPrefix(b, n, &type, &png); + + if (pre && pre < bodyLen) { + if (type == 0x03) { + api_offset_ = body + (uint32_t)pre; + api_size_ = bodyLen - (uint32_t)pre; + format_ = png ? kPNG : kJPEG; + found = true; + break; + } + + if (!haveAny) { + firstOff = body + (uint32_t)pre; + firstLen = bodyLen - (uint32_t)pre; + firstPng = png; + haveAny = true; + } + } + } + } - const uint8_t* magic = reinterpret_cast(magic_buf); - if (magic[0] == 0xFF && magic[1] == 0xD8) { - format_ = kJPEG; - return true; + pos = next; } - if (magic[0] == 0x89 && magic[1] == 'P' && magic[2] == 'N' && magic[3] == 'G') { - format_ = kPNG; - return true; - } - return false; -} - -bool AlbumArt::load(const char* mp3Path) { - if (format_ != kNone) clear(); - - // Ensure the state directory exists - pm_sd_mkdir(paths::kStateDir); - return extractAPIC_(mp3Path); -} - -void AlbumArt::clear() { - pm_sd_delete_file(paths::kAlbumArt); - format_ = kNone; - img_w_ = img_h_ = 0; -} + if (!found && haveAny) { + api_offset_ = firstOff; + api_size_ = firstLen; + format_ = firstPng ? kPNG : kJPEG; + found = true; + } -bool AlbumArt::render1Bit(uint8_t* einkBuf, int bufW, int bufH, - int outX, int outY, int maxSize) { - if (format_ == kNone || !einkBuf) return false; + } while (0); - return pm_image_decode_to_1bit(paths::kAlbumArt, einkBuf, bufW, bufH, - outX, outY, maxSize); + pm_sd_stream_close(s); + return found; } diff --git a/src/id3parser.cpp b/src/id3parser.cpp new file mode 100644 index 00000000..e56b42b6 --- /dev/null +++ b/src/id3parser.cpp @@ -0,0 +1,243 @@ +#include "id3parser.h" + +#include +#include +#include + +#include +#include + +static constexpr size_t kId3ReadChunk = 4 * 1024; + +bool Id3Tag::parse(const char *path) { + clear(); + + size_t fileSize = pm_sd_get_file_size(path); + if (fileSize < 10) + return false; + + size_t readSize = fileSize < kId3ReadChunk ? fileSize : kId3ReadChunk; + uint8_t buf[kId3ReadChunk]; + + if (!pm_sd_read_binary_file(path, buf, readSize)) + return false; + + if (buf[0] != 'I' || buf[1] != 'D' || buf[2] != '3') + return false; + + uint8_t ver = buf[3]; + if (ver < 2 || ver > 4) + return false; + + uint32_t tagSize = readSyncsafe(buf + 6); + + size_t extLen = 0; + if (buf[5] & 0x40) { + if (readSize > 10 + 4) { + if (ver == 4) { + extLen = readSyncsafe(buf + 10); + } else { + uint32_t plain = ((uint32_t)buf[10] << 24) | ((uint32_t)buf[11] << 16) | + ((uint32_t)buf[12] << 8) | ((uint32_t)buf[13]); + extLen = plain + 4; + } + } + } + + size_t pos = 10 + extLen; + if (pos >= readSize) + return false; + + while (pos + (ver == 2 ? 6 : 10) <= readSize) { + const uint8_t *fhdr = buf + pos; + + char frameID[5] = {}; + if (ver == 2) { + frameID[0] = (char)fhdr[0]; + frameID[1] = (char)fhdr[1]; + frameID[2] = (char)fhdr[2]; + frameID[3] = '\0'; + } else { + std::memcpy(frameID, fhdr, 4); + frameID[4] = '\0'; + } + + if (frameID[0] == '\0') + break; + + uint32_t fsize; + if (ver == 2) { + fsize = ((uint32_t)fhdr[3] << 16) | ((uint32_t)fhdr[4] << 8) | + (uint32_t)fhdr[5]; + } else if (ver == 4) { + fsize = readSyncsafe(fhdr + 4); + } else { + fsize = ((uint32_t)fhdr[4] << 24) | ((uint32_t)fhdr[5] << 16) | + ((uint32_t)fhdr[6] << 8) | ((uint32_t)fhdr[7]); + } + + if (ver == 4 && (fhdr[9] & 0x40)) { + pos += 10 + fsize; + continue; + } + + if (fsize == 0) { + pos += 10; + continue; + } + + size_t bodyOffset = 10; + if (ver == 4 && (fhdr[9] & 0x20)) { + if (pos + 10 + 4 > readSize) { + pos += 10; + continue; + } + fsize = readSyncsafe(fhdr + 10); + bodyOffset = 14; + } + + if (pos + bodyOffset + fsize > readSize) { + pos += 10 + fsize; + continue; + } + + const uint8_t *fdata = buf + pos + bodyOffset; + + char *target = nullptr; + if (ver == 2) { + if (std::strcmp(frameID, "TT2") == 0) + target = _title; + else if (std::strcmp(frameID, "TP1") == 0) + target = _artist; + else if (std::strcmp(frameID, "TAL") == 0) + target = _album; + else if (std::strcmp(frameID, "TLE1") == 0) + target = _durationText; + } else { + if (std::strcmp(frameID, "TIT2") == 0) + target = _title; + else if (std::strcmp(frameID, "TPE1") == 0) + target = _artist; + else if (std::strcmp(frameID, "TALB") == 0) + target = _album; + else if (std::strcmp(frameID, "TLEN") == 0) + target = _durationText; + } + + if (target && pos + fsize <= readSize) { + if (std::strcmp(frameID, "TLEN") == 0 || std::strcmp(frameID, "TLE1") == 0) { + char lenBuf[16] = {}; + size_t n = fsize < sizeof(lenBuf) - 1 ? fsize : sizeof(lenBuf) - 1; + for (uint32_t i = 0; i < n; i++) + lenBuf[i] = (char)fdata[i]; + lenBuf[n] = '\0'; + _durationMs = static_cast(strtoul(lenBuf, nullptr, 10)); + } else { + decodeText(target, sizeof(_title), fdata, fsize); + } + } + + pos += 10 + fsize; + } + + return true; +} + +void Id3Tag::decodeText(char *target, size_t targetSize, const uint8_t *data, + uint32_t len) { + if (!target || targetSize == 0 || len == 0) + return; + + uint8_t encoding = data[0]; + const uint8_t *text = data + 1; + size_t textLen = len - 1; + + if (encoding == 0x00) { + size_t n = textLen < targetSize - 1 ? textLen : targetSize - 1; + for (size_t i = 0; i < n; i++) + target[i] = (char)text[i]; + target[n] = '\0'; + } else if (encoding == 0x01 || encoding == 0x02) { + bool bigEndian = (encoding == 0x02); + size_t i = 0; + size_t n = 0; + while (i + 1 < textLen && n < targetSize - 1) { + uint16_t ch; + if (bigEndian) { + ch = ((uint16_t)text[i] << 8) | text[i + 1]; + } else { + ch = text[i] | ((uint16_t)text[i + 1] << 8); + } + i += 2; + if (n == 0 && ch == 0xFEFF) + continue; + if (ch == 0xFFFE) { + bigEndian = !bigEndian; + continue; + } + if (ch < 0x80) { + target[n++] = (char)ch; + } else if (ch < 0x800) { + if (n + 1 >= targetSize - 1) + break; + target[n++] = (char)(0xC0 | (ch >> 6)); + target[n++] = (char)(0x80 | (ch & 0x3F)); + } else { + if (n + 2 >= targetSize - 1) + break; + target[n++] = (char)(0xE0 | (ch >> 12)); + target[n++] = (char)(0x80 | ((ch >> 6) & 0x3F)); + target[n++] = (char)(0x80 | (ch & 0x3F)); + } + } + target[n] = '\0'; + } else if (encoding == 0x03) { + size_t n = textLen < targetSize - 1 ? textLen : targetSize - 1; + size_t out = 0; + for (size_t i = 0; i < n && out < targetSize - 1; i++) { + uint8_t b = text[i]; + if ((b & 0x80) == 0) { + target[out++] = (char)b; + } else if ((b & 0xE0) == 0xC0) { + if (i + 1 >= n || (text[i + 1] & 0xC0) != 0x80) + break; + if (out + 1 >= targetSize - 1) + break; + target[out++] = (char)b; + target[out++] = (char)text[++i]; + } else if ((b & 0xF0) == 0xE0) { + if (i + 2 >= n || (text[i + 1] & 0xC0) != 0x80 || + (text[i + 2] & 0xC0) != 0x80) + break; + if (out + 2 >= targetSize - 1) + break; + target[out++] = (char)b; + target[out++] = (char)text[++i]; + target[out++] = (char)text[++i]; + } else { + break; + } + } + target[out] = '\0'; + } else { + size_t n = textLen < targetSize - 1 ? textLen : targetSize - 1; + std::memcpy(target, text, n); + target[n] = '\0'; + } +} + +void Id3Tag::clear() { + _title[0] = '\0'; + _artist[0] = '\0'; + _album[0] = '\0'; +} + +uint32_t Id3Tag::readSyncsafe(const uint8_t *p) { + return ((uint32_t)(p[0] & 0x7f) << 21) | ((uint32_t)(p[1] & 0x7f) << 14) | + ((uint32_t)(p[2] & 0x7f) << 7) | ((uint32_t)(p[3] & 0x7f)); +} + +uint32_t Id3Tag::readSize32(const uint8_t *p) { + return ((uint32_t)p[0] << 24) | ((uint32_t)p[1] << 16) | + ((uint32_t)p[2] << 8) | ((uint32_t)p[3]); +} diff --git a/src/id3parser.h b/src/id3parser.h new file mode 100644 index 00000000..0fee283d --- /dev/null +++ b/src/id3parser.h @@ -0,0 +1,37 @@ +#pragma once + +#include +#include +#include + + +class Id3Tag { +public: + Id3Tag() = default; + + bool parse(const char *path); + + const char *title() const { return _title; } + const char *artist() const { return _artist; } + const char *album() const { return _album; } + uint32_t durationMs() const { return _durationMs; } + + void clear(); + +private: + static uint32_t readSyncsafe(const uint8_t *p); + static uint32_t readSize32(const uint8_t *p); + + static bool readFrameHeader(int slot, int ver, char frameID[5], + uint32_t &fsize); + + static void decodeText(char *target, size_t targetSize, const uint8_t *data, + uint32_t len); + + char _title[128] = {}; + char _artist[128] = {}; + char _album[128] = {}; + uint32_t _durationMs = 0; + + char _durationText[16] = {}; +}; diff --git a/src/library.cpp b/src/library.cpp index 91591de0..6cc4463e 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -3,125 +3,134 @@ #include "paths.h" #include "pm_app_api.h" -#include -#include -#include #include +#include +#include +#include namespace { -// Snapshot of one directory level while scanning. The host exposes a single -// live enumeration, so the listing has to be copied before recursing. struct Entry { - char name[128]; - bool is_dir; + char name[128]; + bool is_dir; }; constexpr size_t kMaxName = sizeof(Entry::name); constexpr size_t kMaxPath = 256; -} // namespace +} -Library::Library() - : tracks_(nullptr), tracks_cap_(0), count_(0) {} +Library::Library() : tracks_(nullptr), tracks_cap_(0), count_(0) {} Library::~Library() { - clear(); - std::free(tracks_); - tracks_ = nullptr; - tracks_cap_ = 0; + clear(); + std::free(tracks_); + tracks_ = nullptr; + tracks_cap_ = 0; } void Library::clear() { - for (int i = 0; i < count_; i++) { - std::free((void*)tracks_[i]); - } - count_ = 0; + for (int i = 0; i < count_; i++) { + std::free((void *)tracks_[i]); + } + count_ = 0; } int Library::scan() { - clear(); + clear(); - scanDir_(paths::kMusicDir, 0, kMaxDepth); - printf("[muse] scan %s -> %d tracks\n", paths::kMusicDir, count_); - fflush(stdout); + scanDir_(paths::kMusicDir, 0, kMaxDepth); + printf("[muse] scan %s -> %d tracks\n", paths::kMusicDir, count_); + fflush(stdout); - if (count_ == 0) { - // Cards are often populated at the root instead of /music. One shallow - // pass over the root finds those without crawling apps/ and assets/. - scanDir_("/", 0, kFallbackDepth); - printf("[muse] scan / -> %d tracks\n", count_); - fflush(stdout); - } + if (count_ == 0) { + scanDir_("/", 0, kFallbackDepth); + printf("[muse] scan / -> %d tracks\n", count_); + fflush(stdout); + } - std::sort(tracks_, tracks_ + count_, - [](const char* a, const char* b) { - return strcasecmp(a, b) < 0; - }); + std::sort(tracks_, tracks_ + count_, + [](const char *a, const char *b) { return strcasecmp(a, b) < 0; }); - return count_; + return count_; } -const char* Library::path(int index) const { - if (index < 0 || index >= count_) return nullptr; - return tracks_[index]; +const char *Library::path(int index) const { + if (index < 0 || index >= count_) + return nullptr; + return tracks_[index]; } -void Library::scanDir_(const char* dirname, int depth, int maxDepth) { - if (depth > maxDepth) return; +void Library::scanDir_(const char *dirname, int depth, int maxDepth) { + if (depth > maxDepth) + return; - int count = pm_sd_dir_open(dirname); - printf("[muse] dir %s entries=%d\n", dirname, count); - fflush(stdout); - if (count < 0) return; - if (count == 0) { pm_sd_dir_close(); return; } - - // The host keeps exactly one enumeration live, so opening a subdirectory - // would clobber this one. Snapshot the listing before recursing. - Entry* entries = static_cast(std::malloc(count * sizeof(Entry))); - if (!entries) { pm_sd_dir_close(); return; } - int found = 0; - for (int i = 0; i < count; i++) { - if (pm_sd_dir_entry(i, entries[found].name, kMaxName, - &entries[found].is_dir)) { - found++; - } - } + int count = pm_sd_dir_open(dirname); + printf("[muse] dir %s entries=%d\n", dirname, count); + fflush(stdout); + if (count < 0) + return; + if (count == 0) { + pm_sd_dir_close(); + return; + } + + Entry *entries = static_cast(std::malloc(count * sizeof(Entry))); + if (!entries) { pm_sd_dir_close(); + return; + } + int found = 0; + for (int i = 0; i < count; i++) { + if (pm_sd_dir_entry(i, entries[found].name, kMaxName, + &entries[found].is_dir)) { + found++; + } + } + pm_sd_dir_close(); + + for (int i = 0; i < found; i++) { + const Entry &e = entries[i]; + if (e.is_dir) { + char sub[kMaxPath]; + snprintf(sub, sizeof(sub), "%s/%s", dirname, e.name); + scanDir_(sub, depth + 1, maxDepth); + continue; + } + + const char *dot = std::strrchr(e.name, '.'); + if (!dot || strcasecmp(dot, ".mp3") != 0) + continue; + if (count_ >= kMaxTracks) + break; + + if (count_ >= tracks_cap_) { + int new_cap = tracks_cap_ ? tracks_cap_ * 2 : 64; + if (new_cap > kMaxTracks) + new_cap = kMaxTracks; + const char **nt = static_cast( + std::realloc((void *)tracks_, new_cap * sizeof(const char *))); + if (!nt) { + std::free(entries); + return; + } + tracks_ = nt; + tracks_cap_ = new_cap; + } - for (int i = 0; i < found; i++) { - const Entry& e = entries[i]; - if (e.is_dir) { - char sub[kMaxPath]; - snprintf(sub, sizeof(sub), "%s/%s", dirname, e.name); - scanDir_(sub, depth + 1, maxDepth); - continue; - } - - const char* dot = std::strrchr(e.name, '.'); - if (!dot || strcasecmp(dot, ".mp3") != 0) continue; - if (count_ >= kMaxTracks) break; - - if (count_ >= tracks_cap_) { - int new_cap = tracks_cap_ ? tracks_cap_ * 2 : 64; - if (new_cap > kMaxTracks) new_cap = kMaxTracks; - const char** nt = static_cast( - std::realloc((void*)tracks_, new_cap * sizeof(const char*))); - if (!nt) { std::free(entries); return; } - tracks_ = nt; - tracks_cap_ = new_cap; - } - - size_t len = std::strlen(dirname) + 1 + std::strlen(e.name) + 1; - char* full = static_cast(std::malloc(len)); - if (!full) { std::free(entries); return; } - snprintf(full, len, "%s/%s", dirname, e.name); - tracks_[count_++] = full; + size_t len = std::strlen(dirname) + 1 + std::strlen(e.name) + 1; + char *full = static_cast(std::malloc(len)); + if (!full) { + std::free(entries); + return; } + snprintf(full, len, "%s/%s", dirname, e.name); + tracks_[count_++] = full; + } - std::free(entries); + std::free(entries); } -Library& library() { - static Library lib; - return lib; +Library &library() { + static Library lib; + return lib; } diff --git a/src/main.cpp b/src/main.cpp index 2f914542..7048d9b8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,9 +1,9 @@ -#include "muse.h" #include "library.h" -#include "playlist.h" #include "metacache.h" -#include "ui_player.h" +#include "muse.h" +#include "playlist.h" #include "ui_helpers.h" +#include "ui_player.h" #include @@ -11,86 +11,124 @@ #include #include -// Stub: the host exports __cxa_atexit but not plain atexit. We never register -// exit handlers, so this is a no-op. extern "C" int atexit(void (*func)(void)) { (void)func; return 0; } -// Exit key codes static constexpr char kKeyExit1 = 12; static constexpr char kKeyExit2 = 27; static constexpr char kKeyExit3 = 65; -// Process a single keypress in the current app mode static void process_key(char ch) { - // Exit to OS if (ch == kKeyExit1 || ch == kKeyExit2 || ch == kKeyExit3) { music_stop(); g_appMode = MODE_BROWSER; - return; // main loop will see exit_requested + return; } switch (g_appMode) { - case MODE_BROWSER: browser_process_key(ch); break; - case MODE_NOWPLAYING: nowplaying_process_key(ch); break; - case MODE_PLAYLIST: playlist_process_key(ch); break; - case MODE_HELP: g_appMode = g_prevMode; g_needsRedraw = true; break; + case MODE_BROWSER: + browser_process_key(ch); + break; + case MODE_NOWPLAYING: + nowplaying_process_key(ch); + break; + case MODE_PLAYLIST: + playlist_process_key(ch); + break; + case MODE_HELP: + g_appMode = g_prevMode; + g_needsRedraw = true; + break; } } -extern "C" int main(int argc, char** argv) { - // ABI check +extern "C" int main(int argc, char **argv) { if (pm_app_abi() != PM_APP_API_ABI) { - printf("PocketMuse: host ABI mismatch: app %u, host %u\n", - PM_APP_API_ABI, pm_app_abi()); + printf("PocketMuse: host ABI mismatch: app %u, host %u\n", PM_APP_API_ABI, + pm_app_abi()); pm_oled_sysmsg("SDK ABI mismatch", 2000); return 1; } - printf("PocketMuse starting (SDK %s)\n", PM_SDK_VERSION); + printf("PocketMuse starting (SDK %s)\n", PM_SDK_VERSION); + + pm_audio_begin(); + pm_audio_set_volume(static_cast((g_volume * 16) / 255 - 8)); - // Initialize audio subsystem - pm_audio_begin(); - pm_audio_set_volume(static_cast((g_volume * 16) / 255 - 8)); + pm_oled_init(); - // Initialize filesystem paths - playlistMgr().begin(); + playlistMgr().begin(); - // Scan library - library().scan(); - g_trackCount = library().count(); + library().scan(); + g_trackCount = library().count(); - // Start in browser - browser_init(); + browser_init(); bool exit_requested = false; - // Main loop while (!exit_requested) { - // Read keypress char ch = pm_kb_read(); if (ch) { process_key(ch); - // Check if exit was requested if (ch == kKeyExit1 || ch == kKeyExit2 || ch == kKeyExit3) { exit_requested = true; } - ui_update_oled(); } - // Update playback progress from byte offset + int scrollVec = pm_touch_get_scroll_vector(); + if (scrollVec > 0 && g_volume < 245) { + g_volume += 10; + if (g_volume > 255) g_volume = 255; + pm_audio_set_volume(static_cast((g_volume * 16) / 255 - 8)); + g_needsRedraw = true; + } else if (scrollVec < 0 && g_volume > 10) { + g_volume -= 10; + if (g_volume < 0) g_volume = 0; + pm_audio_set_volume(static_cast((g_volume * 16) / 255 - 8)); + g_needsRedraw = true; + } + + ui_update_oled(); + if (g_nowPath[0] && pm_audio_is_playing()) { - size_t fsize = pm_sd_get_file_size(g_nowPath); - if (fsize > 0) { + if (g_nowFileSize > 0) { g_nowProgress = static_cast(pm_audio_get_position()) / - static_cast(fsize); - if (g_nowProgress > 1.0f) g_nowProgress = 1.0f; + static_cast(g_nowFileSize); + if (g_nowProgress > 1.0f) + g_nowProgress = 1.0f; + } + } + + static bool g_wasPlaying = false; + bool isPlaying = pm_audio_is_playing(); + if (g_wasPlaying && !isPlaying && g_nowTrackIndex >= 0 && g_nowPath[0] && + g_nowProgress >= 0.99f) { + int n = g_trackCount > 0 ? g_trackCount : 1; + int next = -1; + switch (g_loopMode) { + case LoopMode::None: + break; + case LoopMode::One: + next = g_nowTrackIndex; + break; + case LoopMode::All: + next = g_nowTrackIndex + 1; + if (next >= n) + next = 0; + break; + } + if (next >= 0 && next < n) { + player_play_index(next); + } else { + music_stop(); + g_playState = PlayerState::Stopped; + g_nowPath[0] = '\0'; } } + g_wasPlaying = isPlaying; - // Update play state from audio if (pm_audio_is_playing()) { g_playState = PlayerState::Playing; } else if (g_nowTrackIndex >= 0 && g_nowPath[0]) { @@ -99,24 +137,29 @@ extern "C" int main(int argc, char** argv) { g_playState = PlayerState::Stopped; } - // Redraw e-ink if needed if (g_needsRedraw) { g_needsRedraw = false; switch (g_appMode) { - case MODE_HELP: ui_show_help(); break; - case MODE_BROWSER: browser_render(); break; - case MODE_NOWPLAYING: nowplaying_render(); break; - case MODE_PLAYLIST: playlist_render(); break; + case MODE_HELP: + ui_show_help(); + break; + case MODE_BROWSER: + browser_render(); + break; + case MODE_NOWPLAYING: + nowplaying_render(); + break; + case MODE_PLAYLIST: + playlist_render(); + break; } } - // Dispatch audio events (state changes, etc.) pm_audio_dispatch_events(); delay(50); } - // Cleanup pm_audio_stop(); pm_oled_sysmsg("PocketMuse exited", 800); return 0; diff --git a/src/metacache.cpp b/src/metacache.cpp index 53735e75..c6976457 100644 --- a/src/metacache.cpp +++ b/src/metacache.cpp @@ -3,228 +3,254 @@ #include "paths.h" #include "pm_app_api.h" -#include #include +#include -bool MetadataCache::readStr(const uint8_t*& p, const uint8_t* end, - char* buf, size_t bufSize) { - if (end - p < 2) return false; - uint16_t len = static_cast(p[0] | (p[1] << 8)); - p += 2; - if (len == 0) { buf[0] = '\0'; return true; } - if (end - p < static_cast(len)) return false; - size_t toRead = len < bufSize ? len : bufSize - 1; - std::memcpy(buf, p, toRead); - buf[toRead] = '\0'; - p += len; +bool MetadataCache::readStr(const uint8_t *&p, const uint8_t *end, char *buf, + size_t bufSize) { + if (end - p < 2) + return false; + uint16_t len = static_cast(p[0] | (p[1] << 8)); + p += 2; + if (len == 0) { + buf[0] = '\0'; return true; + } + if (end - p < static_cast(len)) + return false; + size_t toRead = len < bufSize ? len : bufSize - 1; + std::memcpy(buf, p, toRead); + buf[toRead] = '\0'; + p += len; + return true; } -bool MetadataCache::load(const char* path, - char* title, size_t tSize, - char* artist, size_t aSize, - char* album, size_t lSize) { - if (!path || !path[0]) return false; +bool MetadataCache::load(const char *path, char *title, size_t tSize, + char *artist, size_t aSize, char *album, + size_t lSize) { + if (!path || !path[0]) + return false; - size_t fsize = pm_sd_get_file_size(paths::kMetadata); - if (fsize < 8) return false; + size_t fsize = pm_sd_get_file_size(paths::kMetadata); + if (fsize < 8) + return false; - char* data = static_cast(std::malloc(fsize)); - if (!data) return false; - if (!pm_sd_read_binary_file(paths::kMetadata, reinterpret_cast(data), fsize)) { - std::free(data); - return false; - } + char *data = static_cast(std::malloc(fsize)); + if (!data) + return false; + if (!pm_sd_read_binary_file(paths::kMetadata, + reinterpret_cast(data), fsize)) { + std::free(data); + return false; + } - const uint8_t* p = reinterpret_cast(data); - const uint8_t* end = p + fsize; + const uint8_t *p = reinterpret_cast(data); + const uint8_t *end = p + fsize; - uint32_t magic = static_cast(p[0] | (p[1] << 8) | - (p[2] << 16) | (p[3] << 24)); - p += 4; - if (magic != kMagic) { std::free(data); return false; } + uint32_t magic = + static_cast(p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24)); + p += 4; + if (magic != kMagic) { + std::free(data); + return false; + } - uint32_t count = static_cast(p[0] | (p[1] << 8) | - (p[2] << 16) | (p[3] << 24)); - p += 4; + uint32_t count = + static_cast(p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24)); + p += 4; - for (uint32_t i = 0; i < count; i++) { - if (end - p < 2) break; - uint16_t pathLen = static_cast(p[0] | (p[1] << 8)); - p += 2; + for (uint32_t i = 0; i < count; i++) { + if (end - p < 2) + break; + uint16_t pathLen = static_cast(p[0] | (p[1] << 8)); + p += 2; - bool match = false; - if (pathLen > 0 && end - p >= static_cast(pathLen)) { - match = (pathLen == std::strlen(path) + 1 && - std::memcmp(p, path, pathLen) == 0); - } + bool match = false; + if (pathLen > 0 && end - p >= static_cast(pathLen)) { + match = (pathLen == std::strlen(path) + 1 && + std::memcmp(p, path, pathLen) == 0); + } - if (end - p < static_cast(pathLen)) break; - p += pathLen; + if (end - p < static_cast(pathLen)) + break; + p += pathLen; - if (match) { - if (!readStr(p, end, title, tSize)) { std::free(data); return false; } - if (!readStr(p, end, artist, aSize)) { std::free(data); return false; } - if (!readStr(p, end, album, lSize)) { std::free(data); return false; } - std::free(data); - return true; - } + if (match) { + if (!readStr(p, end, title, tSize)) { + std::free(data); + return false; + } + if (!readStr(p, end, artist, aSize)) { + std::free(data); + return false; + } + if (!readStr(p, end, album, lSize)) { + std::free(data); + return false; + } + std::free(data); + return true; + } - for (int j = 0; j < 3; j++) { - if (end - p < 2) break; - uint16_t sl = static_cast(p[0] | (p[1] << 8)); - p += 2; - if (end - p < static_cast(sl)) break; - p += sl; - } + for (int j = 0; j < 3; j++) { + if (end - p < 2) + break; + uint16_t sl = static_cast(p[0] | (p[1] << 8)); + p += 2; + if (end - p < static_cast(sl)) + break; + p += sl; } + } - std::free(data); - return false; + std::free(data); + return false; } -void MetadataCache::save(const char* path, - const char* title, const char* artist, - const char* album) { - if (!path || !path[0]) return; - - // Read old file into a single buffer. Peak heap usage is fsize, not - // 2×fsize+1024 like the old double-buffered version. - size_t fsize = pm_sd_get_file_size(paths::kMetadata); - char* oldData = nullptr; - bool hasOld = false; - if (fsize >= 8) { - oldData = static_cast(std::malloc(fsize)); - if (oldData && - pm_sd_read_binary_file(paths::kMetadata, reinterpret_cast(oldData), fsize)) - hasOld = true; - if (!hasOld) { std::free(oldData); oldData = nullptr; } +void MetadataCache::save(const char *path, const char *title, + const char *artist, const char *album) { + if (!path || !path[0]) + return; + + size_t fsize = pm_sd_get_file_size(paths::kMetadata); + char *oldData = nullptr; + bool hasOld = false; + if (fsize >= 8) { + oldData = static_cast(std::malloc(fsize)); + if (oldData && + pm_sd_read_binary_file(paths::kMetadata, + reinterpret_cast(oldData), fsize)) + hasOld = true; + if (!hasOld) { + std::free(oldData); + oldData = nullptr; } - - // Replace the metadata file in place: delete first so append creates fresh. - pm_sd_delete_file(paths::kMetadata); - - auto appendByte = [](uint8_t b) { - pm_sd_append_binary_file(paths::kMetadata, &b, 1); - }; - auto appendBytes = [](const void* src, size_t n) { - pm_sd_append_binary_file(paths::kMetadata, - static_cast(src), n); - }; - auto appendStr = [&](const char* s) { - uint16_t len = s ? static_cast(std::strlen(s) + 1) : 0; - appendByte(static_cast(len & 0xFF)); - appendByte(static_cast((len >> 8) & 0xFF)); - if (len > 0) appendBytes(s, len); - }; - auto appendU16Bytes = [&](const void* data, size_t n) { - appendByte(static_cast(n & 0xFF)); - appendByte(static_cast((n >> 8) & 0xFF)); - if (n > 0) appendBytes(data, n); - }; - - // Write magic - appendByte(static_cast(kMagic & 0xFF)); - appendByte(static_cast((kMagic >> 8) & 0xFF)); - appendByte(static_cast((kMagic >> 16) & 0xFF)); - appendByte(static_cast((kMagic >> 24) & 0xFF)); - - uint32_t newCount = 0; - bool updated = false; - size_t pathLen = std::strlen(path) + 1; - - uint32_t oldCount = 0; - if (hasOld) { - const uint8_t* p = reinterpret_cast(oldData) + 4; - const uint8_t* end = reinterpret_cast(oldData) + fsize; - - uint32_t oldMagic = static_cast(p[0] | (p[1] << 8) | - (p[2] << 16) | (p[3] << 24)); - p += 4; - if (oldMagic != kMagic) { - hasOld = false; - } else { - oldCount = static_cast(p[0] | (p[1] << 8) | - (p[2] << 16) | (p[3] << 24)); - p += 4; - - // Count pass: determine final count and whether path exists. - newCount = oldCount; - for (uint32_t i = 0; i < oldCount; i++) { - if (end - p < 2) break; - uint16_t epLen = static_cast(p[0] | (p[1] << 8)); - p += 2; - if (epLen == pathLen && std::memcmp(p, path, epLen) == 0) - updated = true; - p += epLen; - for (int j = 0; j < 3; j++) { - if (end - p < 2) break; - uint16_t sl = static_cast(p[0] | (p[1] << 8)); - p += 2; - p += sl; - } - } - if (!updated) newCount++; - } + } + + pm_sd_delete_file(paths::kMetadata); + + auto appendByte = [](uint8_t b) { + pm_sd_append_binary_file(paths::kMetadata, &b, 1); + }; + auto appendBytes = [](const void *src, size_t n) { + pm_sd_append_binary_file(paths::kMetadata, + static_cast(src), n); + }; + auto appendStr = [&](const char *s) { + uint16_t len = s ? static_cast(std::strlen(s) + 1) : 0; + appendByte(static_cast(len & 0xFF)); + appendByte(static_cast((len >> 8) & 0xFF)); + if (len > 0) + appendBytes(s, len); + }; + auto appendU16Bytes = [&](const void *data, size_t n) { + appendByte(static_cast(n & 0xFF)); + appendByte(static_cast((n >> 8) & 0xFF)); + if (n > 0) + appendBytes(data, n); + }; + + appendByte(static_cast(kMagic & 0xFF)); + appendByte(static_cast((kMagic >> 8) & 0xFF)); + appendByte(static_cast((kMagic >> 16) & 0xFF)); + appendByte(static_cast((kMagic >> 24) & 0xFF)); + + uint32_t newCount = 0; + bool updated = false; + size_t pathLen = std::strlen(path) + 1; + + uint32_t oldCount = 0; + if (hasOld) { + const uint8_t *p = reinterpret_cast(oldData) + 4; + const uint8_t *end = reinterpret_cast(oldData) + fsize; + + uint32_t oldMagic = + static_cast(p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24)); + p += 4; + if (oldMagic != kMagic) { + hasOld = false; } else { - newCount = 1; - } - - // Write count - appendByte(static_cast(newCount & 0xFF)); - appendByte(static_cast((newCount >> 8) & 0xFF)); - appendByte(static_cast((newCount >> 16) & 0xFF)); - appendByte(static_cast((newCount >> 24) & 0xFF)); - - // Write pass: stream old entries, replacing or copying each. - if (hasOld) { - const uint8_t* p = reinterpret_cast(oldData) + 8; - const uint8_t* end = reinterpret_cast(oldData) + fsize; - - for (uint32_t i = 0; i < oldCount; i++) { - if (end - p < 2) break; - uint16_t epLen = static_cast(p[0] | (p[1] << 8)); - p += 2; - - bool isMatch = !updated && (epLen == pathLen && - std::memcmp(p, path, epLen) == 0); - - if (isMatch) { - appendU16Bytes(path, pathLen); - appendStr(title); - appendStr(artist); - appendStr(album); - updated = true; - } else { - appendU16Bytes(p, epLen); - p += epLen; - - for (int j = 0; j < 3; j++) { - if (end - p < 2) break; - uint16_t sl = static_cast(p[0] | (p[1] << 8)); - p += 2; - appendU16Bytes(p, sl); - p += sl; - } - } + oldCount = static_cast(p[0] | (p[1] << 8) | (p[2] << 16) | + (p[3] << 24)); + p += 4; + + newCount = oldCount; + for (uint32_t i = 0; i < oldCount; i++) { + if (end - p < 2) + break; + uint16_t epLen = static_cast(p[0] | (p[1] << 8)); + p += 2; + if (epLen == pathLen && std::memcmp(p, path, epLen) == 0) + updated = true; + p += epLen; + for (int j = 0; j < 3; j++) { + if (end - p < 2) + break; + uint16_t sl = static_cast(p[0] | (p[1] << 8)); + p += 2; + p += sl; } + } + if (!updated) + newCount++; } + } else { + newCount = 1; + } + + appendByte(static_cast(newCount & 0xFF)); + appendByte(static_cast((newCount >> 8) & 0xFF)); + appendByte(static_cast((newCount >> 16) & 0xFF)); + appendByte(static_cast((newCount >> 24) & 0xFF)); + + if (hasOld) { + const uint8_t *p = reinterpret_cast(oldData) + 8; + const uint8_t *end = reinterpret_cast(oldData) + fsize; + + for (uint32_t i = 0; i < oldCount; i++) { + if (end - p < 2) + break; + uint16_t epLen = static_cast(p[0] | (p[1] << 8)); + p += 2; - if (!updated) { + bool isMatch = + !updated && (epLen == pathLen && std::memcmp(p, path, epLen) == 0); + + if (isMatch) { appendU16Bytes(path, pathLen); appendStr(title); appendStr(artist); appendStr(album); + updated = true; + } else { + appendU16Bytes(p, epLen); + p += epLen; + + for (int j = 0; j < 3; j++) { + if (end - p < 2) + break; + uint16_t sl = static_cast(p[0] | (p[1] << 8)); + p += 2; + appendU16Bytes(p, sl); + p += sl; + } + } } + } - std::free(oldData); -} + if (!updated) { + appendU16Bytes(path, pathLen); + appendStr(title); + appendStr(artist); + appendStr(album); + } -void MetadataCache::clear() { - pm_sd_delete_file(paths::kMetadata); + std::free(oldData); } -MetadataCache& metaCache() { - static MetadataCache cache; - return cache; +void MetadataCache::clear() { pm_sd_delete_file(paths::kMetadata); } + +MetadataCache &metaCache() { + static MetadataCache cache; + return cache; } diff --git a/src/muse.cpp b/src/muse.cpp index 0bd29a29..e32a17cd 100644 --- a/src/muse.cpp +++ b/src/muse.cpp @@ -1,21 +1,22 @@ #include "muse.h" -AppMode g_appMode = MODE_BROWSER; -AppMode g_prevMode = MODE_BROWSER; -bool g_needsRedraw = false; -int g_selIndex = 0; -int g_trackCount = 0; +AppMode g_appMode = MODE_BROWSER; +AppMode g_prevMode = MODE_BROWSER; +bool g_needsRedraw = false; +int g_selIndex = 0; +int g_trackCount = 0; -char g_nowPath[256] = {}; -char g_nowTitle[128] = {}; -char g_nowArtist[128] = {}; -char g_nowAlbum[128] = {}; -uint32_t g_nowDuration = 0; -float g_nowProgress = 0.0f; -int g_nowTrackIndex = -1; -bool g_isFavorite = false; +char g_nowPath[256] = {}; +char g_nowTitle[128] = {}; +char g_nowArtist[128] = {}; +char g_nowAlbum[128] = {}; +uint32_t g_nowDuration = 0; +float g_nowProgress = 0.0f; +size_t g_nowFileSize = 0; +int g_nowTrackIndex = -1; +bool g_isFavorite = false; PlayerState g_playState = PlayerState::Stopped; -LoopMode g_loopMode = LoopMode::None; -bool g_shuffleEnabled = false; -uint8_t g_volume = 200; +LoopMode g_loopMode = LoopMode::None; +bool g_shuffleEnabled = false; +uint8_t g_volume = 200; diff --git a/src/playlist.cpp b/src/playlist.cpp index 07cf0bd6..2787d750 100644 --- a/src/playlist.cpp +++ b/src/playlist.cpp @@ -3,439 +3,485 @@ #include "paths.h" #include "pm_app_api.h" -#include -#include #include +#include +#include -// Read a text file into a freshly malloc'd buffer. Returns buffer (caller frees) -// and sets *outSize. Returns nullptr on failure. -static char* readTextFile(const char* path, size_t* outSize) { - size_t fsize = pm_sd_get_file_size(path); - if (fsize == 0) return nullptr; - char* buf = static_cast(std::malloc(fsize + 1)); - if (!buf) return nullptr; - if (!pm_sd_read_binary_file(path, reinterpret_cast(buf), fsize)) { - std::free(buf); - return nullptr; - } - buf[fsize] = '\0'; - if (outSize) *outSize = fsize; - return buf; +static char *readTextFile(const char *path, size_t *outSize) { + size_t fsize = pm_sd_get_file_size(path); + if (fsize == 0) + return nullptr; + char *buf = static_cast(std::malloc(fsize + 1)); + if (!buf) + return nullptr; + if (!pm_sd_read_binary_file(path, reinterpret_cast(buf), fsize)) { + std::free(buf); + return nullptr; + } + buf[fsize] = '\0'; + if (outSize) + *outSize = fsize; + return buf; } -// Trim trailing \r and \n in-place. -static void trimCRLF(char* buf) { - size_t len = std::strlen(buf); - while (len > 0 && (buf[len - 1] == '\r' || buf[len - 1] == '\n')) - buf[--len] = '\0'; +static void trimCRLF(char *buf) { + size_t len = std::strlen(buf); + while (len > 0 && (buf[len - 1] == '\r' || buf[len - 1] == '\n')) + buf[--len] = '\0'; } -// PlaylistCursor -PlaylistCursor::PlaylistCursor() - : file_size_(0), count_(0), offsets_(nullptr) { - path_[0] = '\0'; +PlaylistCursor::PlaylistCursor() : file_size_(0), count_(0), offsets_(nullptr) { + path_[0] = '\0'; } -PlaylistCursor::~PlaylistCursor() { - unload(); -} +PlaylistCursor::~PlaylistCursor() { unload(); } void PlaylistCursor::unload() { - std::free(offsets_); - offsets_ = nullptr; - count_ = 0; - file_size_ = 0; - path_[0] = '\0'; + std::free(offsets_); + offsets_ = nullptr; + count_ = 0; + file_size_ = 0; + path_[0] = '\0'; } -bool PlaylistCursor::load(const char* path, bool isFav) { - unload(); - size_t fsize = 0; - char* data = readTextFile(path, &fsize); - if (!data) return false; +bool PlaylistCursor::load(const char *path, bool isFav) { + unload(); + size_t fsize = 0; + char *data = readTextFile(path, &fsize); + if (!data) + return false; - bool ok = isFav ? parseFavs_(data, fsize) : parseM3U_(data, fsize); - std::free(data); + bool ok = isFav ? parseFavs_(data, fsize) : parseM3U_(data, fsize); + std::free(data); - if (!ok || count_ == 0) { unload(); return false; } + if (!ok || count_ == 0) { + unload(); + return false; + } - std::strncpy(path_, path, sizeof(path_) - 1); - path_[sizeof(path_) - 1] = '\0'; - return true; + std::strncpy(path_, path, sizeof(path_) - 1); + path_[sizeof(path_) - 1] = '\0'; + return true; } -bool PlaylistCursor::getEntry(int index, char* pathBuf, size_t bufSize) const { - if (!valid() || index < 0 || index >= count_ || !pathBuf || bufSize == 0) - return false; - - size_t fsize = 0; - char* data = readTextFile(path_, &fsize); - if (!data) return false; - - uint32_t off = offsets_[index]; - uint32_t end = off; - while (end < fsize && data[end] != '\n' && data[end] != '\r') end++; - size_t copyLen = static_cast(end - off); - if (copyLen >= bufSize) copyLen = bufSize - 1; - std::memcpy(pathBuf, data + off, copyLen); - pathBuf[copyLen] = '\0'; - trimCRLF(pathBuf); - std::free(data); - - return pathBuf[0] != '\0'; +bool PlaylistCursor::getEntry(int index, char *pathBuf, size_t bufSize) const { + if (!valid() || index < 0 || index >= count_ || !pathBuf || bufSize == 0) + return false; + + size_t fsize = 0; + char *data = readTextFile(path_, &fsize); + if (!data) + return false; + + uint32_t off = offsets_[index]; + uint32_t end = off; + while (end < fsize && data[end] != '\n' && data[end] != '\r') + end++; + size_t copyLen = static_cast(end - off); + if (copyLen >= bufSize) + copyLen = bufSize - 1; + std::memcpy(pathBuf, data + off, copyLen); + pathBuf[copyLen] = '\0'; + trimCRLF(pathBuf); + std::free(data); + + return pathBuf[0] != '\0'; } -bool PlaylistCursor::parseM3U_(const char* data, size_t size) { - int cap = 128; - uint32_t* off = static_cast(std::malloc(cap * sizeof(uint32_t))); - if (!off) return false; - int n = 0; - uint32_t pos = 0; - - while (pos < size) { - uint32_t lineStart = pos; - while (pos < size && data[pos] != '\n') pos++; - if (pos < size) pos++; - - size_t lineLen = pos - lineStart; - if (lineLen == 0) continue; - - if (data[lineStart] == '#') continue; - - if (n >= cap) { - cap *= 2; - uint32_t* nf = static_cast(std::malloc(cap * sizeof(uint32_t))); - if (!nf) { std::free(off); return false; } - std::memcpy(nf, off, n * sizeof(uint32_t)); - std::free(off); - off = nf; - } - off[n++] = lineStart; +bool PlaylistCursor::parseM3U_(const char *data, size_t size) { + int cap = 128; + uint32_t *off = static_cast(std::malloc(cap * sizeof(uint32_t))); + if (!off) + return false; + int n = 0; + uint32_t pos = 0; + + while (pos < size) { + uint32_t lineStart = pos; + while (pos < size && data[pos] != '\n') + pos++; + if (pos < size) + pos++; + + size_t lineLen = pos - lineStart; + if (lineLen == 0) + continue; + + if (data[lineStart] == '#') + continue; + + if (n >= cap) { + cap *= 2; + uint32_t *nf = + static_cast(std::malloc(cap * sizeof(uint32_t))); + if (!nf) { + std::free(off); + return false; + } + std::memcpy(nf, off, n * sizeof(uint32_t)); + std::free(off); + off = nf; } - - if (n == 0) { std::free(off); return false; } - count_ = n; - offsets_ = off; - return true; + off[n++] = lineStart; + } + + if (n == 0) { + std::free(off); + return false; + } + count_ = n; + offsets_ = off; + return true; } -bool PlaylistCursor::parseFavs_(const char* data, size_t size) { - return parseM3U_(data, size); +bool PlaylistCursor::parseFavs_(const char *data, size_t size) { + return parseM3U_(data, size); } -// PlaylistManager PlaylistManager::PlaylistManager() - : source_(PlaySource::Library), pl_index_(-1), - playlists_(nullptr), playlists_cap_(0), playlist_count_(0) {} + : source_(PlaySource::Library), pl_index_(-1), playlists_(nullptr), + playlists_cap_(0), playlist_count_(0) {} PlaylistManager::~PlaylistManager() { - std::free(playlists_); - playlists_ = nullptr; - playlists_cap_ = 0; - playlist_count_ = 0; + std::free(playlists_); + playlists_ = nullptr; + playlists_cap_ = 0; + playlist_count_ = 0; } bool PlaylistManager::begin() { - // mkdir works one level at a time, so create the music dir first: it is - // the parent of the state dir and may not exist on a fresh card. - const bool musicOk = pm_sd_mkdir(paths::kMusicDir); - const bool stateOk = pm_sd_mkdir(paths::kStateDir); - const bool plOk = pm_sd_mkdir(paths::kPlaylistsDir); - printf("[muse] dirs music=%d state=%d playlists=%d\n", - musicOk, stateOk, plOk); - fflush(stdout); - if (!musicOk || !stateOk || !plOk) return false; - scanPlaylists_(); - return true; + const bool musicOk = pm_sd_mkdir(paths::kMusicDir); + const bool stateOk = pm_sd_mkdir(paths::kStateDir); + const bool plOk = pm_sd_mkdir(paths::kPlaylistsDir); + printf("[muse] dirs music=%d state=%d playlists=%d\n", musicOk, stateOk, + plOk); + fflush(stdout); + if (!musicOk || !stateOk || !plOk) + return false; + scanPlaylists_(); + return true; } -const PlaylistMeta& PlaylistManager::playlistMeta(int idx) const { - static PlaylistMeta empty; - if (idx < 0 || idx >= playlist_count_) return empty; - return playlists_[idx]; +const PlaylistMeta &PlaylistManager::playlistMeta(int idx) const { + static PlaylistMeta empty; + if (idx < 0 || idx >= playlist_count_) + return empty; + return playlists_[idx]; } -int PlaylistManager::findPlaylist(const char* name) const { - for (int i = 0; i < playlist_count_; i++) { - if (std::strcmp(playlists_[i].name, name) == 0) return i; - } - return -1; +int PlaylistManager::findPlaylist(const char *name) const { + for (int i = 0; i < playlist_count_; i++) { + if (std::strcmp(playlists_[i].name, name) == 0) + return i; + } + return -1; } -bool PlaylistManager::createPlaylist(const char* name) { - if (findPlaylist(name) >= 0) return false; +bool PlaylistManager::createPlaylist(const char *name) { + if (findPlaylist(name) >= 0) + return false; - char fpath[256]; - snprintf(fpath, sizeof(fpath), "%s/%s.m3u", paths::kPlaylistsDir, name); + char fpath[256]; + snprintf(fpath, sizeof(fpath), "%s/%s.m3u", paths::kPlaylistsDir, name); - pm_sd_write_file(fpath, "#EXTM3U\n"); + pm_sd_write_file(fpath, "#EXTM3U\n"); - scanPlaylists_(); - return true; + scanPlaylists_(); + return true; } bool PlaylistManager::deletePlaylist(int idx) { - if (idx < 0 || idx >= playlist_count_) return false; + if (idx < 0 || idx >= playlist_count_) + return false; - if (source_ == PlaySource::Playlist && pl_index_ == idx) { - cursor_.unload(); - source_ = PlaySource::Library; - pl_index_ = -1; - } + if (source_ == PlaySource::Playlist && pl_index_ == idx) { + cursor_.unload(); + source_ = PlaySource::Library; + pl_index_ = -1; + } - pm_sd_delete_file(playlists_[idx].filename); - scanPlaylists_(); - return true; + pm_sd_delete_file(playlists_[idx].filename); + scanPlaylists_(); + return true; } bool PlaylistManager::playLibrary() { - cursor_.unload(); - source_ = PlaySource::Library; - pl_index_ = -1; - return true; + cursor_.unload(); + source_ = PlaySource::Library; + pl_index_ = -1; + return true; } bool PlaylistManager::playFavorites() { - if (!cursor_.load(paths::kFavorites, true)) return false; - source_ = PlaySource::Favorites; - pl_index_ = -1; - return true; + if (!cursor_.load(paths::kFavorites, true)) + return false; + source_ = PlaySource::Favorites; + pl_index_ = -1; + return true; } bool PlaylistManager::playPlaylist(int idx) { - if (idx < 0 || idx >= playlist_count_) return false; - - cursor_.unload(); - if (!cursor_.load(playlists_[idx].filename, false)) { - // Remove invalid playlist - for (int i = idx; i < playlist_count_ - 1; i++) - playlists_[i] = playlists_[i + 1]; - playlist_count_--; - return false; - } - - source_ = PlaySource::Playlist; - playlists_[idx].count = cursor_.count(); - pl_index_ = idx; - return true; + if (idx < 0 || idx >= playlist_count_) + return false; + + cursor_.unload(); + if (!cursor_.load(playlists_[idx].filename, false)) { + for (int i = idx; i < playlist_count_ - 1; i++) + playlists_[i] = playlists_[i + 1]; + playlist_count_--; + return false; + } + + source_ = PlaySource::Playlist; + playlists_[idx].count = cursor_.count(); + pl_index_ = idx; + return true; } int PlaylistManager::entryCount() const { - if (source_ == PlaySource::Library) return 0; - return cursor_.count(); + if (source_ == PlaySource::Library) + return 0; + return cursor_.count(); } -bool PlaylistManager::getEntry(int index, char* pathBuf, size_t bufSize) { - return cursor_.getEntry(index, pathBuf, bufSize); +bool PlaylistManager::getEntry(int index, char *pathBuf, size_t bufSize) { + return cursor_.getEntry(index, pathBuf, bufSize); } -bool PlaylistManager::toggleFavorite(const char* path) { - bool wasFav = isFavorite(path); - if (wasFav) { - // Remove line: read whole file, write back minus matching line - size_t fsize = 0; - char* data = readTextFile(paths::kFavorites, &fsize); - if (!data) return true; - - // Build new content: copy all lines except the matching one - char* result = static_cast(std::malloc(fsize + 1)); - if (!result) { std::free(data); return true; } - size_t result_len = 0; - - const char* p = data; - bool found = false; - while (*p) { - const char* nl = std::strchr(p, '\n'); - size_t linelen = nl ? static_cast(nl - p) : std::strlen(p); - bool match = (linelen == std::strlen(path) && - std::memcmp(p, path, linelen) == 0); - if (match) { - found = true; - } else { - if (result_len + linelen + 1 <= fsize) { - std::memcpy(result + result_len, p, linelen); - result_len += linelen; - result[result_len++] = '\n'; - } - } - if (!nl) break; - p = nl + 1; - } - std::free(data); - - if (!found) { std::free(result); return true; } - - result[result_len] = '\0'; - pm_sd_write_binary_file(paths::kFavorites, - reinterpret_cast(result), - result_len); - std::free(result); - - if (source_ == PlaySource::Favorites) { - cursor_.unload(); - cursor_.load(paths::kFavorites, true); - } - } else { - char line[256]; - snprintf(line, sizeof(line), "%s\n", path); - pm_sd_append_file(paths::kFavorites, line); - } - - if (source_ == PlaySource::Favorites) { - cursor_.unload(); - cursor_.load(paths::kFavorites, true); - } - return !wasFav; -} - -bool PlaylistManager::isFavorite(const char* path) { +bool PlaylistManager::toggleFavorite(const char *path) { + bool wasFav = isFavorite(path); + if (wasFav) { size_t fsize = 0; - char* data = readTextFile(paths::kFavorites, &fsize); - if (!data) return false; + char *data = readTextFile(paths::kFavorites, &fsize); + if (!data) + return true; + + char *result = static_cast(std::malloc(fsize + 1)); + if (!result) { + std::free(data); + return true; + } + size_t result_len = 0; - const char* p = data; + const char *p = data; bool found = false; while (*p) { - const char* nl = std::strchr(p, '\n'); - size_t linelen = nl ? static_cast(nl - p) : std::strlen(p); - if (linelen == std::strlen(path) && - std::memcmp(p, path, linelen) == 0) { - found = true; - break; + const char *nl = std::strchr(p, '\n'); + size_t linelen = nl ? static_cast(nl - p) : std::strlen(p); + bool match = + (linelen == std::strlen(path) && std::memcmp(p, path, linelen) == 0); + if (match) { + found = true; + } else { + if (result_len + linelen + 1 <= fsize) { + std::memcpy(result + result_len, p, linelen); + result_len += linelen; + result[result_len++] = '\n'; } - if (!nl) break; - p = nl + 1; + } + if (!nl) + break; + p = nl + 1; } std::free(data); - return found; -} - -int PlaylistManager::favoriteCount() { - size_t fsize = 0; - char* data = readTextFile(paths::kFavorites, &fsize); - if (!data) return 0; - int count = 0; - const char* p = data; - while (*p) { - const char* nl = std::strchr(p, '\n'); - if (!nl) break; - p = nl + 1; - count++; + if (!found) { + std::free(result); + return true; } - std::free(data); - return count; -} -bool PlaylistManager::addToPlaylist(int plIdx, const char* songPath) { - if (plIdx < 0 || plIdx >= playlist_count_) return false; + result[result_len] = '\0'; + pm_sd_write_binary_file(paths::kFavorites, + reinterpret_cast(result), + result_len); + std::free(result); + if (source_ == PlaySource::Favorites) { + cursor_.unload(); + cursor_.load(paths::kFavorites, true); + } + } else { char line[256]; - snprintf(line, sizeof(line), "%s\n", songPath); - pm_sd_append_file(playlists_[plIdx].filename, line); - - if (source_ == PlaySource::Playlist && pl_index_ == plIdx) { - cursor_.unload(); - cursor_.load(playlists_[plIdx].filename, false); - playlists_[plIdx].count = cursor_.count(); - } else { - playlists_[plIdx].count = -1; + snprintf(line, sizeof(line), "%s\n", path); + pm_sd_append_file(paths::kFavorites, line); + } + + if (source_ == PlaySource::Favorites) { + cursor_.unload(); + cursor_.load(paths::kFavorites, true); + } + return !wasFav; +} + +bool PlaylistManager::isFavorite(const char *path) { + size_t fsize = 0; + char *data = readTextFile(paths::kFavorites, &fsize); + if (!data) + return false; + + const char *p = data; + bool found = false; + while (*p) { + const char *nl = std::strchr(p, '\n'); + size_t linelen = nl ? static_cast(nl - p) : std::strlen(p); + if (linelen == std::strlen(path) && std::memcmp(p, path, linelen) == 0) { + found = true; + break; } + if (!nl) + break; + p = nl + 1; + } + std::free(data); + return found; +} - return true; +int PlaylistManager::favoriteCount() { + size_t fsize = 0; + char *data = readTextFile(paths::kFavorites, &fsize); + if (!data) + return 0; + + int count = 0; + const char *p = data; + while (*p) { + const char *nl = std::strchr(p, '\n'); + if (!nl) + break; + p = nl + 1; + count++; + } + std::free(data); + return count; } -bool PlaylistManager::removeFromPlaylist(int plIdx, int entryIndex) { - if (plIdx < 0 || plIdx >= playlist_count_) return false; +bool PlaylistManager::addToPlaylist(int plIdx, const char *songPath) { + if (plIdx < 0 || plIdx >= playlist_count_) + return false; - PlaylistCursor tmp; - if (!tmp.load(playlists_[plIdx].filename, false)) return false; - if (entryIndex < 0 || entryIndex >= tmp.count()) { tmp.unload(); return false; } + char line[256]; + snprintf(line, sizeof(line), "%s\n", songPath); + pm_sd_append_file(playlists_[plIdx].filename, line); - size_t fsize = 0; - char* data = readTextFile(playlists_[plIdx].filename, &fsize); - if (!data) { tmp.unload(); return false; } + if (source_ == PlaySource::Playlist && pl_index_ == plIdx) { + cursor_.unload(); + cursor_.load(playlists_[plIdx].filename, false); + playlists_[plIdx].count = cursor_.count(); + } else { + playlists_[plIdx].count = -1; + } - char result[4096]; - size_t result_len = 0; - std::memcpy(result, "#EXTM3U\n", 8); - result_len = 8; + return true; +} - const char* p = data; - int idx = 0; - while (*p) { - const char* nl = std::strchr(p, '\n'); - size_t linelen = nl ? static_cast(nl - p) : std::strlen(p); - if (idx != entryIndex && linelen > 0 && p[0] != '#') { - if (result_len + linelen + 1 < sizeof(result)) { - std::memcpy(result + result_len, p, linelen); - result_len += linelen; - result[result_len++] = '\n'; - } - } - if (!nl) break; - p = nl + 1; - idx++; - } - std::free(data); +bool PlaylistManager::removeFromPlaylist(int plIdx, int entryIndex) { + if (plIdx < 0 || plIdx >= playlist_count_) + return false; - result[result_len] = '\0'; - pm_sd_write_binary_file(playlists_[plIdx].filename, - reinterpret_cast(result), - result_len); + PlaylistCursor tmp; + if (!tmp.load(playlists_[plIdx].filename, false)) + return false; + if (entryIndex < 0 || entryIndex >= tmp.count()) { + tmp.unload(); + return false; + } + size_t fsize = 0; + char *data = readTextFile(playlists_[plIdx].filename, &fsize); + if (!data) { tmp.unload(); - if (source_ == PlaySource::Playlist && pl_index_ == plIdx) { - cursor_.load(playlists_[plIdx].filename, false); - playlists_[plIdx].count = cursor_.count(); - } else { - playlists_[plIdx].count = -1; + return false; + } + + char result[4096]; + size_t result_len = 0; + std::memcpy(result, "#EXTM3U\n", 8); + result_len = 8; + + const char *p = data; + int idx = 0; + while (*p) { + const char *nl = std::strchr(p, '\n'); + size_t linelen = nl ? static_cast(nl - p) : std::strlen(p); + if (idx != entryIndex && linelen > 0 && p[0] != '#') { + if (result_len + linelen + 1 < sizeof(result)) { + std::memcpy(result + result_len, p, linelen); + result_len += linelen; + result[result_len++] = '\n'; + } } - - return true; + if (!nl) + break; + p = nl + 1; + idx++; + } + std::free(data); + + result[result_len] = '\0'; + pm_sd_write_binary_file(playlists_[plIdx].filename, + reinterpret_cast(result), + result_len); + + tmp.unload(); + if (source_ == PlaySource::Playlist && pl_index_ == plIdx) { + cursor_.load(playlists_[plIdx].filename, false); + playlists_[plIdx].count = cursor_.count(); + } else { + playlists_[plIdx].count = -1; + } + + return true; } void PlaylistManager::scanPlaylists_() { - playlist_count_ = 0; - - int count = pm_sd_dir_open(paths::kPlaylistsDir); - if (count < 0) return; - - char name[128]; - bool is_dir; - for (int i = 0; i < count; i++) { - if (!pm_sd_dir_entry(i, name, sizeof(name), &is_dir)) continue; - if (is_dir) continue; - - size_t nlen = std::strlen(name); - if (nlen < 4 || std::strcmp(name + nlen - 4, ".m3u") != 0) continue; - - if (playlist_count_ >= playlists_cap_) { - int new_cap = playlists_cap_ ? playlists_cap_ * 2 : 16; - PlaylistMeta* np = static_cast( - std::realloc(playlists_, new_cap * sizeof(PlaylistMeta))); - if (!np) { pm_sd_dir_close(); return; } - playlists_ = np; - playlists_cap_ = new_cap; - } - - PlaylistMeta& meta = playlists_[playlist_count_]; - snprintf(meta.filename, sizeof(meta.filename), "%s/%s", paths::kPlaylistsDir, name); - std::strncpy(meta.name, name, sizeof(meta.name) - 1); - meta.name[sizeof(meta.name) - 1] = '\0'; - // Strip .m3u - char* dot = std::strrchr(meta.name, '.'); - if (dot) *dot = '\0'; - meta.count = -1; - playlist_count_++; + playlist_count_ = 0; + + int count = pm_sd_dir_open(paths::kPlaylistsDir); + if (count < 0) + return; + + char name[128]; + bool is_dir; + for (int i = 0; i < count; i++) { + if (!pm_sd_dir_entry(i, name, sizeof(name), &is_dir)) + continue; + if (is_dir) + continue; + + size_t nlen = std::strlen(name); + if (nlen < 4 || std::strcmp(name + nlen - 4, ".m3u") != 0) + continue; + + if (playlist_count_ >= playlists_cap_) { + int new_cap = playlists_cap_ ? playlists_cap_ * 2 : 16; + PlaylistMeta *np = static_cast( + std::realloc(playlists_, new_cap * sizeof(PlaylistMeta))); + if (!np) { + pm_sd_dir_close(); + return; + } + playlists_ = np; + playlists_cap_ = new_cap; } - pm_sd_dir_close(); + PlaylistMeta &meta = playlists_[playlist_count_]; + snprintf(meta.filename, sizeof(meta.filename), "%s/%s", + paths::kPlaylistsDir, name); + std::strncpy(meta.name, name, sizeof(meta.name) - 1); + meta.name[sizeof(meta.name) - 1] = '\0'; + char *dot = std::strrchr(meta.name, '.'); + if (dot) + *dot = '\0'; + meta.count = -1; + playlist_count_++; + } + + pm_sd_dir_close(); } -PlaylistManager& playlistMgr() { - static PlaylistManager mgr; - return mgr; +PlaylistManager &playlistMgr() { + static PlaylistManager mgr; + return mgr; } diff --git a/src/ui/ui_browser.cpp b/src/ui/ui_browser.cpp index da24edc3..5f33fde9 100644 --- a/src/ui/ui_browser.cpp +++ b/src/ui/ui_browser.cpp @@ -1,5 +1,5 @@ -#include "muse.h" #include "library.h" +#include "muse.h" #include "playlist.h" #include "ui_helpers.h" @@ -9,180 +9,203 @@ #include #include -static constexpr int kItemH = 10; -static constexpr int kListTop = 32; -static constexpr int kListBot = 214; -static constexpr int kMaxVis = (kListBot - kListTop) / kItemH; // 18 rows +static constexpr int kItemH = 10; +static constexpr int kListTop = 32; +static constexpr int kListBot = 214; +static constexpr int kMaxVis = (kListBot - kListTop) / kItemH; static int g_scrollOffset = 0; -static const char* source_label() { - switch (playlistMgr().source()) { - case PlaySource::Library: return "Library"; - case PlaySource::Favorites: return "Favorites"; - case PlaySource::Playlist: { - int pi = playlistMgr().playlistIndex(); - if (pi >= 0) return playlistMgr().playlistMeta(pi).name; - return "Playlist"; - } - } +static const char *source_label() { + switch (playlistMgr().source()) { + case PlaySource::Library: return "Library"; + case PlaySource::Favorites: + return "Favorites"; + case PlaySource::Playlist: { + int pi = playlistMgr().playlistIndex(); + if (pi >= 0) + return playlistMgr().playlistMeta(pi).name; + return "Playlist"; + } + } + return "Library"; } static int track_count() { - switch (playlistMgr().source()) { - case PlaySource::Library: return library().count(); - case PlaySource::Favorites: - case PlaySource::Playlist: return playlistMgr().entryCount(); - } - return 0; + switch (playlistMgr().source()) { + case PlaySource::Library: + return library().count(); + case PlaySource::Favorites: + case PlaySource::Playlist: + return playlistMgr().entryCount(); + } + return 0; } void browser_init() { - g_appMode = MODE_BROWSER; + g_appMode = MODE_BROWSER; + g_selIndex = 0; + g_scrollOffset = 0; + g_trackCount = track_count(); + g_needsRedraw = true; +} + +void browser_process_key(char ch) { + int n = track_count(); + + switch (ch) { + case 19: // LEFT: prev track + if (g_selIndex > 0) { + g_selIndex--; + if (g_selIndex < g_scrollOffset) + g_scrollOffset = g_selIndex; + g_needsRedraw = true; + } + break; + case 21: // RIGHT: next track + if (g_selIndex < n - 1) { + g_selIndex++; + if (g_selIndex >= g_scrollOffset + kMaxVis) + g_scrollOffset = g_selIndex - kMaxVis + 1; + g_needsRedraw = true; + } + break; + case 32: + case 13: // Space or Enter + if (n > 0 && g_selIndex < n) { + player_play_index(g_selIndex); + } + break; + case 'p': + case 'P': + player_cycle_source(); g_selIndex = 0; g_scrollOffset = 0; g_trackCount = track_count(); g_needsRedraw = true; -} - -void browser_process_key(char ch) { - int n = track_count(); - - switch (ch) { - case 19: // LEFT - prev track - if (g_selIndex > 0) { - g_selIndex--; - if (g_selIndex < g_scrollOffset) g_scrollOffset = g_selIndex; - g_needsRedraw = true; - } - break; - case 21: // RIGHT - next track - if (g_selIndex < n - 1) { - g_selIndex++; - if (g_selIndex >= g_scrollOffset + kMaxVis) g_scrollOffset = g_selIndex - kMaxVis + 1; - g_needsRedraw = true; - } - break; - case 32: case 13: // Space or Enter - if (n > 0 && g_selIndex < n) { - player_play_index(g_selIndex); - } - break; - case 'p': case 'P': - player_cycle_source(); - g_selIndex = 0; - g_scrollOffset = 0; + break; + case 'f': + case 'F': + if (n > 0 && g_selIndex < n) { + char path[256]; + if (get_track_path(g_selIndex, path, sizeof(path)) && path[0]) { + g_isFavorite = playlistMgr().toggleFavorite(path); + } + } + g_needsRedraw = true; + break; + case 's': + case 'S': + g_shuffleEnabled = !g_shuffleEnabled; + g_needsRedraw = true; + break; + case 'l': + case 'L': { + switch (g_loopMode) { + case LoopMode::None: + g_loopMode = LoopMode::One; + break; + case LoopMode::One: + g_loopMode = LoopMode::All; + break; + case LoopMode::All: + g_loopMode = LoopMode::None; + break; + } + g_needsRedraw = true; + break; + } + case 'd': + case 'D': + if (playlistMgr().source() == PlaySource::Playlist && n > 0) { + int pi = playlistMgr().playlistIndex(); + int idx = g_selIndex; + if (idx < g_trackCount) { + playlistMgr().removeFromPlaylist(pi, idx); g_trackCount = track_count(); + if (g_selIndex >= g_trackCount && g_selIndex > 0) + g_selIndex--; g_needsRedraw = true; - break; - case 'f': case 'F': - if (n > 0 && g_selIndex < n) { - char path[256]; - if (get_track_path(g_selIndex, path, sizeof(path)) && path[0]) { - g_isFavorite = playlistMgr().toggleFavorite(path); - } - } - g_needsRedraw = true; - break; - case 's': case 'S': - g_shuffleEnabled = !g_shuffleEnabled; - g_needsRedraw = true; - break; - case 'l': case 'L': { - switch (g_loopMode) { - case LoopMode::None: g_loopMode = LoopMode::One; break; - case LoopMode::One: g_loopMode = LoopMode::All; break; - case LoopMode::All: g_loopMode = LoopMode::None; break; - } - g_needsRedraw = true; - break; + } } - case 'd': case 'D': - if (playlistMgr().source() == PlaySource::Playlist && n > 0) { - int pi = playlistMgr().playlistIndex(); - int idx = g_selIndex; - if (idx < g_trackCount) { - playlistMgr().removeFromPlaylist(pi, idx); - g_trackCount = track_count(); - if (g_selIndex >= g_trackCount && g_selIndex > 0) g_selIndex--; - g_needsRedraw = true; - } - } - break; - case 'b': case 'B': - if (g_playState != PlayerState::Stopped) { - g_appMode = MODE_NOWPLAYING; - g_needsRedraw = true; - } - break; - case '?': - g_prevMode = g_appMode; - g_appMode = MODE_HELP; - g_needsRedraw = true; - break; + break; + case 'b': + case 'B': + if (g_playState != PlayerState::Stopped) { + g_appMode = MODE_NOWPLAYING; + g_needsRedraw = true; } + break; + case '?': + g_prevMode = g_appMode; + g_appMode = MODE_HELP; + g_needsRedraw = true; + break; + } } void browser_render() { - pm_ui_begin_eink_screen(false); - - char hdr[64]; - snprintf(hdr, sizeof(hdr), "%s [%d]", source_label(), g_trackCount); - draw_header(hdr); - - int n = track_count(); - if (n == 0) { - char hint[96]; - snprintf(hint, sizeof(hint), "Put .mp3 files in %s", paths::kMusicDir); - pm_text(PM_TARGET_EINK, 8, 80, "No tracks found", PM_STYLE_BODY); - pm_text(PM_TARGET_EINK, 8, 94, hint, PM_STYLE_BODY); - draw_footer("No tracks - add .mp3 files to the music folder"); - pm_eink_refresh(); - return; - } + pm_ui_begin_eink_screen(false); + + char hdr[64]; + snprintf(hdr, sizeof(hdr), "%s [%d]", source_label(), g_trackCount); + draw_header(hdr); + + int n = track_count(); + if (n == 0) { + char hint[96]; + snprintf(hint, sizeof(hint), "Put .mp3 files in %s", paths::kMusicDir); + pm_text(PM_TARGET_EINK, 8, 80, "No tracks found", PM_STYLE_BODY); + pm_text(PM_TARGET_EINK, 8, 94, hint, PM_STYLE_BODY); + draw_footer("No tracks - add .mp3 files to the music folder"); + pm_eink_refresh(); + return; + } - if (g_scrollOffset > n - kMaxVis) g_scrollOffset = n - kMaxVis; - if (g_scrollOffset < 0) g_scrollOffset = 0; - - int y = kListTop; - int end = g_scrollOffset + kMaxVis; - if (end > n) end = n; - - int w = pm_eink_width(); - - for (int i = g_scrollOffset; i < end; i++) { - char path[256]; - char label[64]; - get_track_path(i, path, sizeof(path)); - get_display_name(path, label, sizeof(label)); - - // Truncate with ellipsis to fit the available width. - const char* ell = pm_layout_truncate_with_ellipsis( - label, w - 24, PM_STYLE_TINY, PM_TARGET_EINK); - char row[96]; - strncpy(row, ell, sizeof(row) - 1); - row[sizeof(row) - 1] = '\0'; - - if (i == g_selIndex) { - // Selected row: black outline rect, text drawn on top. - pm_eink_rect(0, y - 8, w - 1, y - 8 + kItemH, false, true); - } - pm_text(PM_TARGET_EINK, 8, y, row, PM_STYLE_TINY); - y += kItemH; - } + if (g_scrollOffset > n - kMaxVis) + g_scrollOffset = n - kMaxVis; + if (g_scrollOffset < 0) + g_scrollOffset = 0; - draw_scrollbar(n, kMaxVis, g_scrollOffset); + int y = kListTop; + int end = g_scrollOffset + kMaxVis; + if (end > n) + end = n; - char footer[64] = {}; - if (playlistMgr().source() == PlaySource::Playlist) { - snprintf(footer, sizeof(footer), - "L/R:nav SPC:play P:src F:fav D:del ?:help"); - } else { - snprintf(footer, sizeof(footer), - "L/R:nav SPC:play P:src F:fav L:loop ?:help"); - } - draw_footer(footer); + int w = pm_eink_width(); - pm_eink_refresh(); + for (int i = g_scrollOffset; i < end; i++) { + char path[256]; + char label[64]; + get_track_path(i, path, sizeof(path)); + get_display_name(path, label, sizeof(label)); + + // Truncate with ellipsis to fit the available width. + const char *ell = pm_layout_truncate_with_ellipsis( + label, w - 24, PM_STYLE_TINY, PM_TARGET_EINK); + char row[96]; + strncpy(row, ell, sizeof(row) - 1); + row[sizeof(row) - 1] = '\0'; + + if (i == g_selIndex) { + pm_eink_rect(0, y - 8, w - 1, y - 8 + kItemH, false, true); + } + pm_text(PM_TARGET_EINK, 8, y, row, PM_STYLE_TINY); + y += kItemH; + } + + draw_scrollbar(n, kMaxVis, g_scrollOffset); + + char footer[64] = {}; + if (playlistMgr().source() == PlaySource::Playlist) { + snprintf(footer, sizeof(footer), + "L/R:nav SPC:play P:src F:fav D:del ?:help"); + } else { + snprintf(footer, sizeof(footer), + "L/R:nav SPC:play P:src F:fav L:loop ?:help"); + } + draw_footer(footer); + + pm_eink_refresh(); } diff --git a/src/ui/ui_helpers.cpp b/src/ui/ui_helpers.cpp index eb4d23d9..32504d1d 100644 --- a/src/ui/ui_helpers.cpp +++ b/src/ui/ui_helpers.cpp @@ -9,124 +9,137 @@ static constexpr int kLineH = 10; -void draw_header(const char* title) { - pm_text_color(PM_TARGET_EINK, 1); // black glyphs - pm_text(PM_TARGET_EINK, 8, 16, title ? title : "", PM_STYLE_BODY); - pm_eink_rect(0, 22, pm_eink_width() - 1, 22, false, true); +void draw_header(const char *title) { + pm_text_color(PM_TARGET_EINK, 1); + pm_text(PM_TARGET_EINK, 8, 16, title ? title : "", PM_STYLE_BODY); + pm_eink_rect(0, 22, pm_eink_width() - 1, 22, false, true); } -void draw_footer(const char* hints) { - pm_eink_status_bar(hints ? hints : "", false); +void draw_footer(const char *hints) { + pm_eink_status_bar(hints ? hints : "", false); } void draw_scrollbar(int total, int visible, int position) { - if (total <= visible) return; - int h = pm_eink_height(); - pm_ui_draw_scrollbar(total, visible, position, -1, 0, h, 3, - false, 0, 65535); + if (total <= visible) + return; + int h = pm_eink_height(); + pm_ui_draw_scrollbar(total, visible, position, -1, 0, h, 3, false, 0, 65535); } -void format_time(char* buf, size_t bufSize, uint32_t seconds) { - uint32_t m = seconds / 60; - uint32_t s = seconds % 60; - snprintf(buf, bufSize, "%u:%02u", m, s); +void format_time(char *buf, size_t bufSize, uint32_t seconds) { + uint32_t m = seconds / 60; + uint32_t s = seconds % 60; + snprintf(buf, bufSize, "%u:%02u", m, s); } -void get_display_name(const char* path, char* out, size_t maxLen) { - const char* name = std::strrchr(path, '/'); - if (name) name++; else name = path; - std::strncpy(out, name, maxLen - 1); - out[maxLen - 1] = '\0'; - char* dot = std::strrchr(out, '.'); - if (dot) *dot = '\0'; +void get_display_name(const char *path, char *out, size_t maxLen) { + const char *name = std::strrchr(path, '/'); + if (name) + name++; + else + name = path; + std::strncpy(out, name, maxLen - 1); + out[maxLen - 1] = '\0'; + char *dot = std::strrchr(out, '.'); + if (dot) + *dot = '\0'; } -void truncate_text(const char* src, char* dst, size_t maxDst) { - std::strncpy(dst, src, maxDst - 1); - dst[maxDst - 1] = '\0'; +void truncate_text(const char *src, char *dst, size_t maxDst) { + std::strncpy(dst, src, maxDst - 1); + dst[maxDst - 1] = '\0'; } void ui_update_oled() { - char now[128]; - if (g_playState == PlayerState::Playing) { - if (g_nowArtist[0]) { - snprintf(now, sizeof(now), ">> %s - %s", g_nowTitle, g_nowArtist); - } else { - snprintf(now, sizeof(now), ">> %s", g_nowTitle); - } - } else if (g_playState == PlayerState::Paused) { - snprintf(now, sizeof(now), "|| %s", g_nowTitle); - } else if (g_nowTitle[0]) { - snprintf(now, sizeof(now), " %s", g_nowTitle); + char now[128]; + if (g_playState == PlayerState::Playing) { + if (g_nowArtist[0]) { + snprintf(now, sizeof(now), ">> %s - %s", g_nowTitle, g_nowArtist); } else { - snprintf(now, sizeof(now), " PocketMuse"); + snprintf(now, sizeof(now), ">> %s", g_nowTitle); } - - uint32_t elapsed = static_cast(g_nowProgress * g_nowDuration); - char elStr[16], durStr[16]; - format_time(elStr, sizeof(elStr), elapsed); - format_time(durStr, sizeof(durStr), g_nowDuration); - char timeStr[32]; - snprintf(timeStr, sizeof(timeStr), "%s / %s", elStr, durStr); - - const char* src = "Library"; - switch (playlistMgr().source()) { - case PlaySource::Library: src = "Library"; break; - case PlaySource::Favorites: src = "Favorites"; break; - case PlaySource::Playlist: src = "Playlist"; break; - } - char srcBuf[64]; - snprintf(srcBuf, sizeof(srcBuf), "%s [%d]", src, g_trackCount); - - int volPct = (g_volume * 100 + 127) / 255; - char volBuf[16]; - snprintf(volBuf, sizeof(volBuf), "V:%3u%%", volPct); - - // Draw all four lines to the OLED buffer, then send once. - pm_oled_clear(); - pm_text_color(PM_TARGET_OLED, 1); - pm_text(PM_TARGET_OLED, 0, 8, now, PM_STYLE_HEADING2); - pm_text(PM_TARGET_OLED, 0, 20, timeStr, PM_STYLE_TINY); - pm_text(PM_TARGET_OLED, 0, 30, srcBuf, PM_STYLE_TINY); - // Volume on the right side of the last line - int vol_w = pm_text_width(PM_TARGET_OLED, volBuf, PM_STYLE_TINY); - pm_text(PM_TARGET_OLED, 256 - vol_w - 2, 30, volBuf, PM_STYLE_TINY); - pm_oled_send(); + } else if (g_playState == PlayerState::Paused) { + snprintf(now, sizeof(now), "|| %s", g_nowTitle); + } else if (g_nowTitle[0]) { + snprintf(now, sizeof(now), " %s", g_nowTitle); + } else { + snprintf(now, sizeof(now), " PocketMuse"); + } + + uint32_t elapsed = static_cast(g_nowProgress * g_nowDuration); + char elStr[16], durStr[16]; + format_time(elStr, sizeof(elStr), elapsed); + format_time(durStr, sizeof(durStr), g_nowDuration); + char timeStr[32]; + snprintf(timeStr, sizeof(timeStr), "%s / %s", elStr, durStr); + + const char *src = "Library"; + switch (playlistMgr().source()) { + case PlaySource::Library: + src = "Library"; + break; + case PlaySource::Favorites: + src = "Favorites"; + break; + case PlaySource::Playlist: + src = "Playlist"; + break; + } + char srcBuf[64]; + snprintf(srcBuf, sizeof(srcBuf), "%s [%d]", src, g_trackCount); + + int volPct = (g_volume * 100 + 127) / 255; + char volBuf[16]; + snprintf(volBuf, sizeof(volBuf), "V:%3u%%", volPct); + + pm_oled_set_power_save(false); + + pm_oled_clear(); + pm_text_color(PM_TARGET_OLED, 1); + pm_text(PM_TARGET_OLED, 0, 8, now, PM_STYLE_HEADING2); + pm_text(PM_TARGET_OLED, 0, 20, timeStr, PM_STYLE_TINY); + pm_text(PM_TARGET_OLED, 0, 30, srcBuf, PM_STYLE_TINY); + int vol_w = pm_text_width(PM_TARGET_OLED, volBuf, PM_STYLE_TINY); + pm_text(PM_TARGET_OLED, 256 - vol_w - 2, 30, volBuf, PM_STYLE_TINY); + pm_oled_send(); } void ui_show_help() { - pm_ui_begin_eink_screen(false); - - pm_text_color(PM_TARGET_EINK, 1); - pm_text(PM_TARGET_EINK, 8, 18, "PocketMuse Controls", PM_STYLE_BODY); - pm_eink_rect(0, 22, pm_eink_width() - 1, 22, false, true); - - struct Row { const char* key; const char* desc; }; - Row rows[] = { - { "LEFT/RIGHT", "Navigate / skip track" }, - { "UP/DOWN", "Volume (Now Playing)" }, - { "SPACE", "Play / pause" }, - { "ENTER", "Select / play" }, - { "P", "Cycle source (Lib/Fav/Pl)" }, - { "F", "Toggle favorite" }, - { "S", "Toggle shuffle" }, - { "L", "Cycle loop (None/One/All)" }, - { "D", "Delete from playlist" }, - { "B", "Back to browser" }, - { "?", "Show this screen" }, - { "ESC / A", "Exit to OS" }, - }; - - int y = 38; - for (auto& r : rows) { - pm_text(PM_TARGET_EINK, 8, y, r.key, PM_STYLE_TINY); - pm_text(PM_TARGET_EINK, 82, y, r.desc, PM_STYLE_TINY); - y += 12; - } - - pm_eink_rect(0, y + 4, pm_eink_width() - 1, y + 4, false, true); - pm_text(PM_TARGET_EINK, 8, y + 16, "Press any key to close", PM_STYLE_TINY); - - draw_footer("PocketMuse help"); - pm_eink_refresh(); + pm_ui_begin_eink_screen(false); + + pm_text_color(PM_TARGET_EINK, 1); + pm_text(PM_TARGET_EINK, 8, 18, "PocketMuse Controls", PM_STYLE_BODY); + pm_eink_rect(0, 22, pm_eink_width() - 1, 22, false, true); + + struct Row { + const char *key; + const char *desc; + }; + Row rows[] = { + {"LEFT/RIGHT", "Navigate / skip track"}, + {"UP/DOWN", "Volume (Now Playing)"}, + {"SPACE", "Play / pause"}, + {"ENTER", "Select / play"}, + {"P", "Cycle source (Lib/Fav/Pl)"}, + {"F", "Toggle favorite"}, + {"S", "Toggle shuffle"}, + {"L", "Cycle loop (None/One/All)"}, + {"D", "Delete from playlist"}, + {"B", "Back to browser"}, + {"?", "Show this screen"}, + {"ESC / A", "Exit to OS"}, + }; + + int y = 38; + for (auto &r : rows) { + pm_text(PM_TARGET_EINK, 8, y, r.key, PM_STYLE_TINY); + pm_text(PM_TARGET_EINK, 82, y, r.desc, PM_STYLE_TINY); + y += 12; + } + + pm_eink_rect(0, y + 4, pm_eink_width() - 1, y + 4, false, true); + pm_text(PM_TARGET_EINK, 8, y + 16, "Press any key to close", PM_STYLE_TINY); + + draw_footer("PocketMuse help"); + pm_eink_refresh(); } diff --git a/src/ui/ui_nowplaying.cpp b/src/ui/ui_nowplaying.cpp index e85c16df..640090c1 100644 --- a/src/ui/ui_nowplaying.cpp +++ b/src/ui/ui_nowplaying.cpp @@ -1,5 +1,5 @@ -#include "muse.h" #include "albumart.h" +#include "muse.h" #include "ui_helpers.h" #include "pm_app_api.h" @@ -13,229 +13,245 @@ static constexpr int kArtSize = 120; static constexpr int kInfoX = 136; static constexpr int kInfoW = 176; -static uint8_t s_artCache[(kArtSize * kArtSize) / 8]; -static char s_artCachePath[256] = {}; -static int s_cachedW = 0, s_cachedH = 0; +static uint8_t s_artCache[(kArtSize * kArtSize) / 8]; +static char s_artCachePath[256] = {}; +static int s_cachedW = 0, s_cachedH = 0; void nowplaying_init() { - g_appMode = MODE_NOWPLAYING; - g_needsRedraw = true; + g_appMode = MODE_NOWPLAYING; + g_needsRedraw = true; } void nowplaying_process_key(char ch) { - int n = g_trackCount > 0 ? g_trackCount : 1; - - switch (ch) { - case 32: case 13: // Space or Enter - if (g_playState == PlayerState::Playing) { - music_pause(); - g_playState = PlayerState::Paused; - } else if (g_playState == PlayerState::Paused) { - music_resume(); - g_playState = PlayerState::Playing; - } else { - if (g_nowTrackIndex >= 0 && g_nowTrackIndex < n) { - player_play_index(g_nowTrackIndex); - } - } - g_needsRedraw = true; - break; - case 19: // LEFT - prev track - if (n > 0) player_prev_track(); - g_needsRedraw = true; - break; - case 21: // RIGHT - next track - if (n > 0) player_next_track(); - g_needsRedraw = true; - break; - case 24: // UP - volume up - if (g_volume < 245) g_volume += 10; - else g_volume = 255; - g_needsRedraw = true; - break; - case 25: // DOWN - volume down - if (g_volume > 10) g_volume -= 10; - else g_volume = 0; - g_needsRedraw = true; - break; - case 'b': case 'B': - g_appMode = MODE_BROWSER; - g_needsRedraw = true; - break; - case 'p': case 'P': - if (g_trackCount > 0) { - g_appMode = MODE_PLAYLIST; - g_needsRedraw = true; - } - break; - case 'f': case 'F': { - if (g_nowPath[0]) { - g_isFavorite = playlistMgr().toggleFavorite(g_nowPath); - } - g_needsRedraw = true; - break; + int n = g_trackCount > 0 ? g_trackCount : 1; + + switch (ch) { + case 32: + case 13: + if (g_playState == PlayerState::Playing) { + music_pause(); + g_playState = PlayerState::Paused; + } else if (g_playState == PlayerState::Paused) { + music_resume(); + g_playState = PlayerState::Playing; + } else { + if (g_nowTrackIndex >= 0 && g_nowTrackIndex < n) { + player_play_index(g_nowTrackIndex); + } + } + g_needsRedraw = true; + break; + case 19: // LEFT: prev track + if (n > 0) + player_prev_track(); + g_needsRedraw = true; + break; + case 21: // RIGHT: next track + if (n > 0) + player_next_track(); + g_needsRedraw = true; + break; + case 24: // UP: increase volume + if (g_volume < 245) + g_volume += 10; + else + g_volume = 255; + pm_audio_set_volume(static_cast((g_volume * 16) / 255 - 8)); + g_needsRedraw = true; + break; + case 25: // DOWN: decrease volume + if (g_volume > 10) + g_volume -= 10; + else + g_volume = 0; + pm_audio_set_volume(static_cast((g_volume * 16) / 255 - 8)); + g_needsRedraw = true; + break; + case 'b': + case 'B': + g_appMode = MODE_BROWSER; + g_needsRedraw = true; + break; + case 'p': + case 'P': + if (g_trackCount > 0) { + g_appMode = MODE_PLAYLIST; + g_needsRedraw = true; } - case 's': case 'S': - g_shuffleEnabled = !g_shuffleEnabled; - g_needsRedraw = true; - break; - case 'l': case 'L': { - switch (g_loopMode) { - case LoopMode::None: g_loopMode = LoopMode::One; break; - case LoopMode::One: g_loopMode = LoopMode::All; break; - case LoopMode::All: g_loopMode = LoopMode::None; break; - } - g_needsRedraw = true; - break; + break; + case 'f': + case 'F': { + if (g_nowPath[0]) { + g_isFavorite = playlistMgr().toggleFavorite(g_nowPath); } - case '?': - g_prevMode = g_appMode; - g_appMode = MODE_HELP; - g_needsRedraw = true; - break; + g_needsRedraw = true; + break; + } + case 's': + case 'S': + g_shuffleEnabled = !g_shuffleEnabled; + g_needsRedraw = true; + break; + case 'l': + case 'L': { + switch (g_loopMode) { + case LoopMode::None: + g_loopMode = LoopMode::One; + break; + case LoopMode::One: + g_loopMode = LoopMode::All; + break; + case LoopMode::All: + g_loopMode = LoopMode::None; + break; } + g_needsRedraw = true; + break; + } + case '?': + g_prevMode = g_appMode; + g_appMode = MODE_HELP; + g_needsRedraw = true; + break; + } } -void nowplaying_cache_art(const char* path) { - s_cachedW = 0; - s_cachedH = 0; - s_artCachePath[0] = '\0'; +void nowplaying_cache_art(const char *path) { + s_cachedW = 0; + s_cachedH = 0; + s_artCachePath[0] = '\0'; - if (!path || !path[0]) return; + if (!path || !path[0]) + return; - AlbumArt art; - if (!art.load(path)) return; + AlbumArt art; + if (!art.load(path)) + return; - if (art.render1Bit(s_artCache, kArtSize, kArtSize, 0, 0, kArtSize)) { - s_cachedW = art.width(); - s_cachedH = art.height(); - std::strncpy(s_artCachePath, path, sizeof(s_artCachePath) - 1); - s_artCachePath[sizeof(s_artCachePath) - 1] = '\0'; - } + std::memset(s_artCache, 0, sizeof(s_artCache)); + + if (art.render1Bit(path, s_artCache, kArtSize, kArtSize, 0, 0, kArtSize)) { + s_cachedW = kArtSize; + s_cachedH = kArtSize; + std::strncpy(s_artCachePath, path, sizeof(s_artCachePath) - 1); + s_artCachePath[sizeof(s_artCachePath) - 1] = '\0'; + } } void nowplaying_render() { - pm_ui_begin_eink_screen(false); - - if (g_nowTitle[0] == '\0' && g_nowPath[0] == '\0') { - draw_header("Now Playing"); - pm_text(PM_TARGET_EINK, 8, 80, "Nothing playing", PM_STYLE_TINY); - pm_text(PM_TARGET_EINK, 8, 94, "Select a track from the browser", PM_STYLE_TINY); - draw_footer("B:browser ?:help"); - pm_eink_refresh(); - return; - } + pm_ui_begin_eink_screen(false); - // Header - char hdr[32]; - if (g_playState == PlayerState::Playing) { - snprintf(hdr, sizeof(hdr), "Now Playing"); - } else if (g_playState == PlayerState::Paused) { - snprintf(hdr, sizeof(hdr), "Paused"); - } else { - snprintf(hdr, sizeof(hdr), "Stopped"); - } - draw_header(hdr); - - bool artDrawn = false; - if (s_cachedW > 0 && s_cachedH > 0) { - int rowBytes = (s_cachedW + 7) / 8; - for (int py = 0; py < s_cachedH; py++) { - for (int px = 0; px < s_cachedW; px++) { - int byteIdx = py * rowBytes + (px >> 3); - bool bit = (s_artCache[byteIdx] >> (7 - (px & 7))) & 1; - pm_eink_pixel(kArtX + px, kArtY + py, bit); - } - } - artDrawn = true; - } + if (g_nowTitle[0] == '\0' && g_nowPath[0] == '\0') { + draw_header("Now Playing"); + pm_text(PM_TARGET_EINK, 8, 80, "Nothing playing", PM_STYLE_TINY); + pm_text(PM_TARGET_EINK, 8, 94, "Select a track from the browser", + PM_STYLE_TINY); + draw_footer("B:browser ?:help"); + pm_eink_refresh(); + return; + } - // If no art, draw a placeholder frame - if (!artDrawn) { - pm_eink_rect(kArtX, kArtY, kArtX + kArtSize - 1, kArtY + kArtSize - 1, false, true); - pm_text(PM_TARGET_EINK, kArtX + 32, kArtY + 64, "No Art", PM_STYLE_TINY); + char hdr[32]; + if (g_playState == PlayerState::Playing) { + snprintf(hdr, sizeof(hdr), "Now Playing"); + } else if (g_playState == PlayerState::Paused) { + snprintf(hdr, sizeof(hdr), "Paused"); + } else { + snprintf(hdr, sizeof(hdr), "Stopped"); + } + draw_header(hdr); + + bool artDrawn = false; + if (s_cachedW > 0 && s_cachedH > 0) { + int rowBytes = (s_cachedW + 7) / 8; + for (int py = 0; py < s_cachedH; py++) { + for (int px = 0; px < s_cachedW; px++) { + int byteIdx = py * rowBytes + (px >> 3); + bool bit = (s_artCache[byteIdx] >> (7 - (px & 7))) & 1; + pm_eink_pixel(kArtX + px, kArtY + py, bit); + } } + artDrawn = true; + } - // Track info - char buf[128]; + if (!artDrawn) { + pm_eink_rect(kArtX, kArtY, kArtX + kArtSize - 1, kArtY + kArtSize - 1, + false, true); + pm_text(PM_TARGET_EINK, kArtX + 32, kArtY + 64, "No Art", PM_STYLE_TINY); + } - // Title - truncate_text(g_nowTitle, buf, sizeof(buf)); - pm_text(PM_TARGET_EINK, kInfoX, kArtY + 18, buf, PM_STYLE_BODY); + char buf[128]; - // Artist - truncate_text(g_nowArtist, buf, sizeof(buf)); - if (buf[0]) { - pm_text(PM_TARGET_EINK, kInfoX, kArtY + 40, buf, PM_STYLE_BODY); - } + truncate_text(g_nowTitle, buf, sizeof(buf)); + pm_text(PM_TARGET_EINK, kInfoX, kArtY + 18, buf, PM_STYLE_BODY); - // Album - truncate_text(g_nowAlbum, buf, sizeof(buf)); - if (buf[0]) { - pm_text(PM_TARGET_EINK, kInfoX, kArtY + 60, buf, PM_STYLE_BODY); - } + truncate_text(g_nowArtist, buf, sizeof(buf)); + if (buf[0]) { + pm_text(PM_TARGET_EINK, kInfoX, kArtY + 40, buf, PM_STYLE_BODY); + } - // Status line - int statusY = kArtY + 82; - int col = kInfoX; - if (g_isFavorite) { - pm_text(PM_TARGET_EINK, col, statusY, "Fav", PM_STYLE_TINY); - col += 40; - } - switch (g_loopMode) { - case LoopMode::None: break; - case LoopMode::One: - pm_text(PM_TARGET_EINK, col, statusY, "R1", PM_STYLE_TINY); - col += 35; - break; - case LoopMode::All: - pm_text(PM_TARGET_EINK, col, statusY, "RA", PM_STYLE_TINY); - col += 35; - break; - } - if (g_shuffleEnabled) { - pm_text(PM_TARGET_EINK, col, statusY, "Sf", PM_STYLE_TINY); - col += 30; - } + truncate_text(g_nowAlbum, buf, sizeof(buf)); + if (buf[0]) { + pm_text(PM_TARGET_EINK, kInfoX, kArtY + 60, buf, PM_STYLE_BODY); + } - // Volume - char volBuf[16]; - snprintf(volBuf, sizeof(volBuf), "V:%u", (g_volume * 100 + 127) / 255); - pm_text(PM_TARGET_EINK, col, statusY, volBuf, PM_STYLE_TINY); + int statusY = kArtY + 82; + int col = kInfoX; + if (g_isFavorite) { + pm_text(PM_TARGET_EINK, col, statusY, "Fav", PM_STYLE_TINY); + col += 40; + } + switch (g_loopMode) { + case LoopMode::None: + break; + case LoopMode::One: + pm_text(PM_TARGET_EINK, col, statusY, "R1", PM_STYLE_TINY); + col += 35; + break; + case LoopMode::All: + pm_text(PM_TARGET_EINK, col, statusY, "RA", PM_STYLE_TINY); + col += 35; + break; + } + if (g_shuffleEnabled) { + pm_text(PM_TARGET_EINK, col, statusY, "Sf", PM_STYLE_TINY); + col += 30; + } - // Play/pause status - int playStatusY = statusY + 16; - const char* playStatus; - if (g_playState == PlayerState::Playing) { - playStatus = "> Playing"; - } else if (g_playState == PlayerState::Paused) { - playStatus = "|| Paused"; - } else { - playStatus = "[] Stopped"; - } - pm_text(PM_TARGET_EINK, kInfoX, playStatusY, playStatus, PM_STYLE_TINY); - - // Progress bar - int barY = kArtY + kArtSize + 14; - int barW = pm_eink_width() - 16; - pm_eink_rect(8, barY, 8 + barW - 1, barY + 7, false, true); - if (g_nowProgress > 0.0f && g_nowProgress <= 1.0f) { - int filled = (int)((barW - 2) * g_nowProgress); - if (filled > 0) pm_eink_rect(9, barY + 1, 9 + filled - 1, barY + 6, true, true); - } + char volBuf[16]; + snprintf(volBuf, sizeof(volBuf), "V:%u", (g_volume * 100 + 127) / 255); + pm_text(PM_TARGET_EINK, col, statusY, volBuf, PM_STYLE_TINY); - // Time - char timeBuf[32]; - char elapsedStr[16]; - char durationStr[16]; - uint32_t elapsed = static_cast(g_nowProgress * g_nowDuration); - format_time(elapsedStr, sizeof(elapsedStr), elapsed); - format_time(durationStr, sizeof(durationStr), g_nowDuration); - snprintf(timeBuf, sizeof(timeBuf), "%s / %s", elapsedStr, durationStr); - pm_text(PM_TARGET_EINK, 8, barY + 24, timeBuf, PM_STYLE_TINY); + int playStatusY = statusY + 16; + const char *playStatus; + if (g_playState == PlayerState::Playing) { + playStatus = "> Playing"; + } else if (g_playState == PlayerState::Paused) { + playStatus = "|| Paused"; + } else { + playStatus = "[] Stopped"; + } + pm_text(PM_TARGET_EINK, kInfoX, playStatusY, playStatus, PM_STYLE_TINY); - // Footer - draw_footer("SPC:pause < >:skip /\\/:vol B:browser P:plist ?:help"); + int barY = kArtY + kArtSize + 14; + int barW = pm_eink_width() - 16; + pm_eink_rect(8, barY, 8 + barW - 1, barY + 7, false, true); + if (g_nowProgress > 0.0f && g_nowProgress <= 1.0f) { + int filled = (int)((barW - 2) * g_nowProgress); + if (filled > 0) + pm_eink_rect(9, barY + 1, 9 + filled - 1, barY + 6, true, true); + } - pm_eink_refresh(); + char timeBuf[32]; + char elapsedStr[16]; + char durationStr[16]; + uint32_t elapsed = static_cast(g_nowProgress * g_nowDuration); + format_time(elapsedStr, sizeof(elapsedStr), elapsed); + format_time(durationStr, sizeof(durationStr), g_nowDuration); + snprintf(timeBuf, sizeof(timeBuf), "%s / %s", elapsedStr, durationStr); + pm_text(PM_TARGET_EINK, 8, barY + 24, timeBuf, PM_STYLE_TINY); + + draw_footer("SPC:pause < >:skip /\\/:vol B:browser P:plist ?:help"); + + pm_eink_refresh(); } diff --git a/src/ui/ui_playlist.cpp b/src/ui/ui_playlist.cpp index ca66b5da..a1a24b2d 100644 --- a/src/ui/ui_playlist.cpp +++ b/src/ui/ui_playlist.cpp @@ -7,137 +7,142 @@ #include #include -static constexpr int kItemH = 10; +static constexpr int kItemH = 10; static constexpr int kListTop = 32; static constexpr int kListBot = 214; -static constexpr int kMaxVis = (kListBot - kListTop) / kItemH; // 18 rows +static constexpr int kMaxVis = (kListBot - kListTop) / kItemH; static int g_plScroll = 0; void playlist_process_key(char ch) { - int n = g_trackCount; - - switch (ch) { - case 19: // LEFT - if (g_selIndex > 0) { - g_selIndex--; - if (g_selIndex < g_plScroll) g_plScroll = g_selIndex; - g_needsRedraw = true; - } - break; - case 21: // RIGHT - if (g_selIndex < n - 1) { - g_selIndex++; - if (g_selIndex >= g_plScroll + kMaxVis) g_plScroll = g_selIndex - kMaxVis + 1; - g_needsRedraw = true; - } - break; - case 32: case 13: // Space or Enter - if (n > 0 && g_selIndex < n) { - player_play_index(g_selIndex); - } - break; - case 'd': case 'D': - if (playlistMgr().source() == PlaySource::Playlist) { - int pi = playlistMgr().playlistIndex(); - int idx = g_selIndex; - if (idx < g_trackCount) { - playlistMgr().removeFromPlaylist(pi, idx); - g_trackCount = playlistMgr().entryCount(); - if (g_selIndex >= g_trackCount && g_selIndex > 0) g_selIndex--; - g_needsRedraw = true; - } - } - break; - case 'b': case 'B': - if (g_playState != PlayerState::Stopped) { - g_appMode = MODE_NOWPLAYING; - } else { - g_appMode = MODE_BROWSER; - } - g_needsRedraw = true; - break; - case '?': - g_prevMode = g_appMode; - g_appMode = MODE_HELP; + int n = g_trackCount; + + switch (ch) { + case 19: // LEFT + if (g_selIndex > 0) { + g_selIndex--; + if (g_selIndex < g_plScroll) + g_plScroll = g_selIndex; + g_needsRedraw = true; + } + break; + case 21: // RIGHT + if (g_selIndex < n - 1) { + g_selIndex++; + if (g_selIndex >= g_plScroll + kMaxVis) + g_plScroll = g_selIndex - kMaxVis + 1; + g_needsRedraw = true; + } + break; + case 32: + case 13: // Space or Enter + if (n > 0 && g_selIndex < n) { + player_play_index(g_selIndex); + } + break; + case 'd': + case 'D': + if (playlistMgr().source() == PlaySource::Playlist) { + int pi = playlistMgr().playlistIndex(); + int idx = g_selIndex; + if (idx < g_trackCount) { + playlistMgr().removeFromPlaylist(pi, idx); + g_trackCount = playlistMgr().entryCount(); + if (g_selIndex >= g_trackCount && g_selIndex > 0) + g_selIndex--; g_needsRedraw = true; - break; + } + } + break; + case 'b': + case 'B': + if (g_playState != PlayerState::Stopped) { + g_appMode = MODE_NOWPLAYING; + } else { + g_appMode = MODE_BROWSER; } + g_needsRedraw = true; + break; + case '?': + g_prevMode = g_appMode; + g_appMode = MODE_HELP; + g_needsRedraw = true; + break; + } } void playlist_render() { - pm_ui_begin_eink_screen(false); - - const char* srcName = ""; - if (playlistMgr().source() == PlaySource::Playlist) { - int pi = playlistMgr().playlistIndex(); - if (pi >= 0) srcName = playlistMgr().playlistMeta(pi).name; + pm_ui_begin_eink_screen(false); + + const char *srcName = ""; + if (playlistMgr().source() == PlaySource::Playlist) { + int pi = playlistMgr().playlistIndex(); + if (pi >= 0) + srcName = playlistMgr().playlistMeta(pi).name; + } + + char hdr[64]; + snprintf(hdr, sizeof(hdr), "Playlist: %s [%d]", srcName, g_trackCount); + draw_header(hdr); + + int n = g_trackCount; + if (n == 0) { + pm_text(PM_TARGET_EINK, 8, 80, "Playlist is empty", PM_STYLE_BODY); + draw_footer("B:back ?:help"); + pm_eink_refresh(); + return; + } + + if (g_plScroll > n - kMaxVis) + g_plScroll = n - kMaxVis; + if (g_plScroll < 0) + g_plScroll = 0; + + int y = kListTop; + int end = g_plScroll + kMaxVis; + if (end > n) + end = n; + + int w = pm_eink_width(); + + for (int i = g_plScroll; i < end; i++) { + char path[256]; + char label[56]; + get_track_path(i, path, sizeof(path)); + get_display_name(path, label, sizeof(label)); + + char prefix[8]; + snprintf(prefix, sizeof(prefix), "%2d.", i + 1); + char row[96]; + snprintf(row, sizeof(row), "%s %s", prefix, label); + + // Truncate with ellipsis to fit the available width. + const char *ell = pm_layout_truncate_with_ellipsis( + row, w - 30, PM_STYLE_TINY, PM_TARGET_EINK); + strncpy(row, ell, sizeof(row) - 1); + row[sizeof(row) - 1] = '\0'; + + if (i == g_selIndex) { + pm_eink_rect(0, y - 8, w - 1, y - 8 + kItemH, false, true); } + pm_text(PM_TARGET_EINK, 8, y, row, PM_STYLE_TINY); - char hdr[64]; - snprintf(hdr, sizeof(hdr), "Playlist: %s [%d]", srcName, g_trackCount); - draw_header(hdr); - - int n = g_trackCount; - if (n == 0) { - pm_text(PM_TARGET_EINK, 8, 80, "Playlist is empty", PM_STYLE_BODY); - draw_footer("B:back ?:help"); - pm_eink_refresh(); - return; + if (i == g_nowTrackIndex && g_playState != PlayerState::Stopped) { + pm_text(PM_TARGET_EINK, w - 22, y, ">", PM_STYLE_TINY); } - if (g_plScroll > n - kMaxVis) g_plScroll = n - kMaxVis; - if (g_plScroll < 0) g_plScroll = 0; - - int y = kListTop; - int end = g_plScroll + kMaxVis; - if (end > n) end = n; - - int w = pm_eink_width(); - - for (int i = g_plScroll; i < end; i++) { - // Track number + name - char path[256]; - char label[56]; - get_track_path(i, path, sizeof(path)); - get_display_name(path, label, sizeof(label)); - - char prefix[8]; - snprintf(prefix, sizeof(prefix), "%2d.", i + 1); - char row[96]; - snprintf(row, sizeof(row), "%s %s", prefix, label); - - // Truncate with ellipsis to fit the available width. - const char* ell = pm_layout_truncate_with_ellipsis( - row, w - 30, PM_STYLE_TINY, PM_TARGET_EINK); - strncpy(row, ell, sizeof(row) - 1); - row[sizeof(row) - 1] = '\0'; - - if (i == g_selIndex) { - // Selected row: black outline rect, text drawn on top. - pm_eink_rect(0, y - 8, w - 1, y - 8 + kItemH, false, true); - } - pm_text(PM_TARGET_EINK, 8, y, row, PM_STYLE_TINY); - - // Now playing indicator - if (i == g_nowTrackIndex && g_playState != PlayerState::Stopped) { - pm_text(PM_TARGET_EINK, w - 22, y, ">", PM_STYLE_TINY); - } - - y += kItemH; - } + y += kItemH; + } - draw_scrollbar(n, kMaxVis, g_plScroll); + draw_scrollbar(n, kMaxVis, g_plScroll); - char footer[64]; - if (playlistMgr().source() == PlaySource::Playlist) { - snprintf(footer, sizeof(footer), - "L/R:nav SPC:play D:del B:back ?:help"); - } else { - snprintf(footer, sizeof(footer), - "L/R:nav SPC:play B:back ?:help"); - } - draw_footer(footer); + char footer[64]; + if (playlistMgr().source() == PlaySource::Playlist) { + snprintf(footer, sizeof(footer), "L/R:nav SPC:play D:del B:back ?:help"); + } else { + snprintf(footer, sizeof(footer), "L/R:nav SPC:play B:back ?:help"); + } + draw_footer(footer); - pm_eink_refresh(); + pm_eink_refresh(); } diff --git a/src/ui_player.cpp b/src/ui_player.cpp index ada84dd8..069f97d6 100644 --- a/src/ui_player.cpp +++ b/src/ui_player.cpp @@ -1,283 +1,301 @@ #include "ui_player.h" -#include "muse.h" +#include "albumart.h" +#include "id3parser.h" #include "library.h" -#include "playlist.h" #include "metacache.h" -#include "albumart.h" +#include "muse.h" +#include "playlist.h" #include "pm_app_api.h" -#include #include +#include -int* g_shuffleIdx = nullptr; -int g_shuffleIdxCount = 0; -int g_shufflePos = 0; +int *g_shuffleIdx = nullptr; +int g_shuffleIdxCount = 0; +int g_shufflePos = 0; void build_shuffle() { - int n = g_trackCount; - if (n <= 0) { - std::free(g_shuffleIdx); - g_shuffleIdx = nullptr; - g_shuffleIdxCount = 0; - g_shufflePos = 0; - return; + int n = g_trackCount; + if (n <= 0) { + std::free(g_shuffleIdx); + g_shuffleIdx = nullptr; + g_shuffleIdxCount = 0; + g_shufflePos = 0; + return; + } + if (g_shuffleIdx && g_shuffleIdxCount == n) { + for (int i = n - 1; i > 0; i--) { + int j = + static_cast((static_cast(std::rand()) / RAND_MAX) * i); + int t = g_shuffleIdx[i]; + g_shuffleIdx[i] = g_shuffleIdx[j]; + g_shuffleIdx[j] = t; } - if (g_shuffleIdx && g_shuffleIdxCount == n) { - // Re-shuffle in place - for (int i = n - 1; i > 0; i--) { - int j = static_cast((static_cast(std::rand()) / RAND_MAX) * i); - int t = g_shuffleIdx[i]; - g_shuffleIdx[i] = g_shuffleIdx[j]; - g_shuffleIdx[j] = t; - } - } else { - std::free(g_shuffleIdx); - g_shuffleIdx = static_cast(std::malloc(n * sizeof(int))); - g_shuffleIdxCount = n; - if (!g_shuffleIdx) return; - for (int i = 0; i < n; i++) g_shuffleIdx[i] = i; - for (int i = n - 1; i > 0; i--) { - int j = static_cast((static_cast(std::rand()) / RAND_MAX) * i); - int t = g_shuffleIdx[i]; - g_shuffleIdx[i] = g_shuffleIdx[j]; - g_shuffleIdx[j] = t; - } + } else { + std::free(g_shuffleIdx); + g_shuffleIdx = static_cast(std::malloc(n * sizeof(int))); + g_shuffleIdxCount = n; + if (!g_shuffleIdx) + return; + for (int i = 0; i < n; i++) + g_shuffleIdx[i] = i; + for (int i = n - 1; i > 0; i--) { + int j = + static_cast((static_cast(std::rand()) / RAND_MAX) * i); + int t = g_shuffleIdx[i]; + g_shuffleIdx[i] = g_shuffleIdx[j]; + g_shuffleIdx[j] = t; } - g_shufflePos = 0; + } + g_shufflePos = 0; } -bool get_track_path(int index, char* buf, size_t bufSize) { - if (!buf || bufSize == 0) return false; - buf[0] = '\0'; - - PlaySource src = playlistMgr().source(); - switch (src) { - case PlaySource::Library: - if (index >= 0 && index < library().count()) { - const char* p = library().path(index); - std::strncpy(buf, p, bufSize - 1); - buf[bufSize - 1] = '\0'; - } - break; - case PlaySource::Favorites: - case PlaySource::Playlist: - playlistMgr().getEntry(index, buf, bufSize); - break; +bool get_track_path(int index, char *buf, size_t bufSize) { + if (!buf || bufSize == 0) + return false; + buf[0] = '\0'; + + PlaySource src = playlistMgr().source(); + switch (src) { + case PlaySource::Library: + if (index >= 0 && index < library().count()) { + const char *p = library().path(index); + std::strncpy(buf, p, bufSize - 1); + buf[bufSize - 1] = '\0'; } - return buf[0] != '\0'; + break; + case PlaySource::Favorites: + case PlaySource::Playlist: + playlistMgr().getEntry(index, buf, bufSize); + break; + } + return buf[0] != '\0'; } -// Compute approximate duration from file size + format header. -uint32_t compute_duration(const char* path) { - if (!path || !path[0]) return 0; - - size_t fsize = pm_sd_get_file_size(path); - if (fsize < 128) return 0; - - char hdr_buf[128]; - if (!pm_sd_read_binary_file(path, - reinterpret_cast(hdr_buf), 128)) - return 0; - - const uint8_t* hdr = reinterpret_cast(hdr_buf); - - // Check for MP3 MPEG frame header - for (size_t pos = 0; pos + 4 <= 128; pos++) { - if (hdr[pos] != 0xFF) continue; - if ((hdr[pos + 1] & 0xE0) != 0xE0) continue; - - uint8_t b2 = hdr[pos + 1]; - uint8_t b3 = hdr[pos + 2]; - - int version = (b2 >> 3) & 3; - int layer = (b2 >> 1) & 3; - int bitrateIdx = b3 >> 4; - - if (version == 1 || layer == 0 || bitrateIdx == 0 || bitrateIdx == 15) - continue; - - static const int bitrate_mp3[15] = { - 0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320 - }; - - int bitrate = 0; - if (version == 3 && layer == 1) { - bitrate = bitrate_mp3[bitrateIdx]; - } else if (version == 3 && layer == 2) { - static const int table_l2[15] = { - 0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384 - }; - bitrate = table_l2[bitrateIdx]; - } else if (version == 3 && layer == 3) { - static const int table_l1[15] = { - 0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448 - }; - bitrate = table_l1[bitrateIdx]; - } else if (version == 2 || version == 0) { - static const int table_v2_l3[15] = { - 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160 - }; - bitrate = table_v2_l3[bitrateIdx]; - } - - if (bitrate > 0) { - uint64_t bits = static_cast(fsize) * 8; - return static_cast(bits / - (static_cast(bitrate) * 1000)); - } - break; - } +uint32_t compute_duration(const char *path) { + if (!path || !path[0]) + return 0; + size_t fsize = pm_sd_get_file_size(path); + if (fsize < 128) return 0; -} -void player_play_index(int index) { - char path[256]; - if (!get_track_path(index, path, sizeof(path)) || !path[0]) return; + char hdr_buf[128]; + if (!pm_sd_read_binary_file(path, reinterpret_cast(hdr_buf), 128)) + return 0; - music_stop(); + const uint8_t *hdr = reinterpret_cast(hdr_buf); + + for (size_t pos = 0; pos + 4 <= 128; pos++) { + if (hdr[pos] != 0xFF) + continue; + if ((hdr[pos + 1] & 0xE0) != 0xE0) + continue; + + uint8_t b2 = hdr[pos + 1]; + uint8_t b3 = hdr[pos + 2]; + + int version = (b2 >> 3) & 3; + int layer = (b2 >> 1) & 3; + int bitrateIdx = b3 >> 4; + + if (version == 1 || layer == 0 || bitrateIdx == 0 || bitrateIdx == 15) + continue; + + static const int bitrate_mp3[15] = {0, 32, 40, 48, 56, 64, 80, 96, + 112, 128, 160, 192, 224, 256, 320}; + + int bitrate = 0; + if (version == 3 && layer == 1) { + bitrate = bitrate_mp3[bitrateIdx]; + } else if (version == 3 && layer == 2) { + static const int table_l2[15] = {0, 32, 48, 56, 64, 80, 96, 112, + 128, 160, 192, 224, 256, 320, 384}; + bitrate = table_l2[bitrateIdx]; + } else if (version == 3 && layer == 3) { + static const int table_l1[15] = {0, 32, 64, 96, 128, 160, 192, 224, + 256, 288, 320, 352, 384, 416, 448}; + bitrate = table_l1[bitrateIdx]; + } else if (version == 2 || version == 0) { + static const int table_v2_l3[15] = {0, 8, 16, 24, 32, 40, 48, 56, + 64, 80, 96, 112, 128, 144, 160}; + bitrate = table_v2_l3[bitrateIdx]; + } - g_nowTitle[0] = '\0'; - g_nowArtist[0] = '\0'; - g_nowAlbum[0] = '\0'; - g_nowDuration = 0; + if (bitrate > 0) { + uint64_t bits = static_cast(fsize) * 8; + return static_cast(bits / + (static_cast(bitrate) * 1000)); + } + break; + } + + return 0; +} +void player_play_index(int index) { + char path[256]; + if (!get_track_path(index, path, sizeof(path)) || !path[0]) + return; + + music_stop(); + + g_nowTitle[0] = '\0'; + g_nowArtist[0] = '\0'; + g_nowAlbum[0] = '\0'; + g_nowDuration = 0; + + get_display_name(path, g_nowTitle, sizeof(g_nowTitle)); + + std::strncpy(g_nowPath, path, sizeof(g_nowPath) - 1); + g_nowPath[sizeof(g_nowPath) - 1] = '\0'; + + g_nowTrackIndex = index; + g_nowDuration = compute_duration(path); + g_nowProgress = 0.0f; + g_nowFileSize = pm_sd_get_file_size(path); + g_isFavorite = playlistMgr().isFavorite(path); + g_playState = PlayerState::Playing; + + Id3Tag tag; + if (tag.parse(path)) { + if (tag.title()[0]) + std::strncpy(g_nowTitle, tag.title(), sizeof(g_nowTitle) - 1); + if (tag.artist()[0]) + std::strncpy(g_nowArtist, tag.artist(), sizeof(g_nowArtist) - 1); + if (tag.album()[0]) + std::strncpy(g_nowAlbum, tag.album(), sizeof(g_nowAlbum) - 1); + g_nowTitle[sizeof(g_nowTitle) - 1] = '\0'; + g_nowArtist[sizeof(g_nowArtist) - 1] = '\0'; + g_nowAlbum[sizeof(g_nowAlbum) - 1] = '\0'; + if (tag.durationMs() > 0) + g_nowDuration = tag.durationMs() / 1000; + } else { get_display_name(path, g_nowTitle, sizeof(g_nowTitle)); + } - std::strncpy(g_nowPath, path, sizeof(g_nowPath) - 1); - g_nowPath[sizeof(g_nowPath) - 1] = '\0'; + nowplaying_cache_art(path); - g_nowTrackIndex = index; - g_nowDuration = compute_duration(path); - g_nowProgress = 0.0f; - g_isFavorite = playlistMgr().isFavorite(path); - g_playState = PlayerState::Playing; - - // Cache album art - AlbumArt art; - if (art.load(path)) { - uint8_t tmpBuf[128]; - if (art.render1Bit(tmpBuf, 16, 16, 0, 0, 16)) { - (void)tmpBuf; // art loaded - } - } - - pm_audio_play(path); + pm_audio_play(path); - g_needsRedraw = true; - g_appMode = MODE_NOWPLAYING; + g_needsRedraw = true; + g_appMode = MODE_NOWPLAYING; } void player_next_track() { - int n = g_trackCount > 0 ? g_trackCount : 1; - int next; - - if (g_shuffleEnabled) { - if (!g_shuffleIdx || g_shuffleIdxCount != n) build_shuffle(); - g_shufflePos++; - if (g_shufflePos >= n) { - build_shuffle(); - g_shufflePos = 0; - } - next = g_shuffleIdx ? g_shuffleIdx[g_shufflePos] : 0; - } else { - next = g_nowTrackIndex + 1; - if (g_loopMode == LoopMode::All && next >= n) next = 0; - } - - if (next >= 0 && next < n) { - player_play_index(next); - } else { - music_stop(); - g_playState = PlayerState::Stopped; - g_nowProgress = 0.0f; - g_needsRedraw = true; + int n = g_trackCount > 0 ? g_trackCount : 1; + int next; + + if (g_shuffleEnabled) { + if (!g_shuffleIdx || g_shuffleIdxCount != n) + build_shuffle(); + g_shufflePos++; + if (g_shufflePos >= n) { + build_shuffle(); + g_shufflePos = 0; } + next = g_shuffleIdx ? g_shuffleIdx[g_shufflePos] : 0; + } else { + next = g_nowTrackIndex + 1; + if (g_loopMode == LoopMode::All && next >= n) + next = 0; + } + + if (next >= 0 && next < n) { + player_play_index(next); + } else { + music_stop(); + g_playState = PlayerState::Stopped; + g_nowProgress = 0.0f; + g_needsRedraw = true; + } } void player_prev_track() { - int n = g_trackCount > 0 ? g_trackCount : 1; - int prev; - - if (g_shuffleEnabled) { - if (!g_shuffleIdx || g_shuffleIdxCount != n) build_shuffle(); - g_shufflePos--; - if (g_shufflePos < 0) g_shufflePos = n - 1; - prev = g_shuffleIdx ? g_shuffleIdx[g_shufflePos] : 0; - } else { - prev = g_nowTrackIndex - 1; - if (prev < 0) { - prev = (g_loopMode == LoopMode::All) ? n - 1 : 0; - } + int n = g_trackCount > 0 ? g_trackCount : 1; + int prev; + + if (g_shuffleEnabled) { + if (!g_shuffleIdx || g_shuffleIdxCount != n) + build_shuffle(); + g_shufflePos--; + if (g_shufflePos < 0) + g_shufflePos = n - 1; + prev = g_shuffleIdx ? g_shuffleIdx[g_shufflePos] : 0; + } else { + prev = g_nowTrackIndex - 1; + if (prev < 0) { + prev = (g_loopMode == LoopMode::All) ? n - 1 : 0; } + } - if (prev >= 0 && prev < n) { - player_play_index(prev); - } + if (prev >= 0 && prev < n) { + player_play_index(prev); + } } void player_cycle_source() { - PlaySource cur = playlistMgr().source(); - - switch (cur) { - case PlaySource::Library: - if (playlistMgr().playFavorites()) break; - playlistMgr().playLibrary(); - break; - - case PlaySource::Favorites: { - int plCount = playlistMgr().playlistCount(); - if (plCount > 0) { - playlistMgr().playPlaylist(0); - } else { - playlistMgr().playLibrary(); - } - break; - } - case PlaySource::Playlist: { - int next = playlistMgr().playlistIndex() + 1; - if (next < playlistMgr().playlistCount()) { - playlistMgr().playPlaylist(next); - } else { - playlistMgr().playLibrary(); - } - break; + PlaySource cur = playlistMgr().source(); + + switch (cur) { + case PlaySource::Library: + if (playlistMgr().playFavorites()) + break; + playlistMgr().playLibrary(); + break; + + case PlaySource::Favorites: { + int plCount = playlistMgr().playlistCount(); + if (plCount > 0) { + playlistMgr().playPlaylist(0); + } else { + playlistMgr().playLibrary(); } + break; + } + case PlaySource::Playlist: { + int next = playlistMgr().playlistIndex() + 1; + if (next < playlistMgr().playlistCount()) { + playlistMgr().playPlaylist(next); + } else { + playlistMgr().playLibrary(); } + break; + } + } - g_trackCount = (playlistMgr().source() == PlaySource::Library) - ? library().count() - : playlistMgr().entryCount(); - if (g_trackCount <= 0) g_trackCount = library().count(); + g_trackCount = (playlistMgr().source() == PlaySource::Library) + ? library().count() + : playlistMgr().entryCount(); + if (g_trackCount <= 0) + g_trackCount = library().count(); - g_needsRedraw = true; + g_needsRedraw = true; } void player_toggle_favorite() { - if (g_nowPath[0]) { - g_isFavorite = playlistMgr().toggleFavorite(g_nowPath); - g_needsRedraw = true; - } + if (g_nowPath[0]) { + g_isFavorite = playlistMgr().toggleFavorite(g_nowPath); + g_needsRedraw = true; + } } void music_stop() { - pm_audio_stop_playback(); - g_playState = PlayerState::Stopped; - g_nowProgress = 0.0f; + pm_audio_stop_playback(); + g_playState = PlayerState::Stopped; + g_nowProgress = 0.0f; } -void music_play(const char* path) { - pm_audio_play(path); -} +void music_play(const char *path) { pm_audio_play(path); } void music_pause() { - pm_audio_pause(); - g_playState = PlayerState::Paused; + pm_audio_pause(); + g_playState = PlayerState::Paused; } void music_resume() { - pm_audio_resume(); - g_playState = PlayerState::Playing; + pm_audio_resume(); + g_playState = PlayerState::Playing; } From f4073c6b583124f37d472b45fb761059d36df965 Mon Sep 17 00:00:00 2001 From: NellowTCS Date: Tue, 10 Nov 2026 14:51:57 -0700 Subject: [PATCH 3/3] Lots of improvements --- Makefile | 3 - README.md | 103 +++++++-- include/albumart.h | 37 ---- include/metacache.h | 24 --- include/muse.h | 30 +-- include/playlist.h | 7 +- include/ui_helpers.h | 5 + include/ui_player.h | 41 +++- src/albumart.cpp | 179 ---------------- src/id3parser.cpp | 243 --------------------- src/id3parser.h | 37 ---- src/main.cpp | 97 +++------ src/metacache.cpp | 256 ---------------------- src/muse.cpp | 3 +- src/playlist.cpp | 280 +++++++++++------------- src/ui/ui_browser.cpp | 132 +++++------- src/ui/ui_helpers.cpp | 171 ++++++++++----- src/ui/ui_nowplaying.cpp | 225 ++++++++++---------- src/ui/ui_playlist.cpp | 50 ++--- src/ui_player.cpp | 399 +++++++++++++++++++++++++---------- tests/run.py | 34 +++ tests/support/fake_sd.cpp | 46 ++++ tests/support/fake_sd.h | 11 + tests/unit/player_test.cpp | 246 +++++++++++++++++++++ tests/unit/playlist_test.cpp | 94 +++++++++ 25 files changed, 1307 insertions(+), 1446 deletions(-) delete mode 100644 include/albumart.h delete mode 100644 include/metacache.h delete mode 100644 src/albumart.cpp delete mode 100644 src/id3parser.cpp delete mode 100644 src/id3parser.h delete mode 100644 src/metacache.cpp create mode 100644 tests/run.py create mode 100644 tests/support/fake_sd.cpp create mode 100644 tests/support/fake_sd.h create mode 100644 tests/unit/player_test.cpp create mode 100644 tests/unit/playlist_test.cpp diff --git a/Makefile b/Makefile index 87958b52..0b9838b5 100644 --- a/Makefile +++ b/Makefile @@ -19,9 +19,6 @@ APP_SRCS := \ src/muse.cpp \ src/library.cpp \ src/playlist.cpp \ - src/metacache.cpp \ - src/albumart.cpp \ - src/id3parser.cpp \ src/ui_player.cpp \ src/ui/ui_browser.cpp \ src/ui/ui_nowplaying.cpp \ diff --git a/README.md b/README.md index ea72a25f..f9461364 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ # PocketMuse -Music player app for the PocketMage PDA. Streams MP3, (AAC and WAV soon) -from SD card over I2S single-pin PDM output through the piezo buzzer GPIO. +Music player app for the PocketMage PDA. Streams MP3 from SD through the OS +audio service, using the built-in PWM piezo or a USB Audio Class speaker. Supports library browsing, now-playing with album art, playlist management, -shuffle, and loop modes. Runs as an OTA application slot on the PocketMage OS. +shuffle, and loop modes. Runs as a dynamically loaded ELF app on PocketMage OS. ## Build @@ -15,10 +15,22 @@ pm build --pack ``` That compiles `src/`, links `build/PocketMuse.app.elf` plus the -`build/PocketMuse.elfo` overlay, and packs both into `PocketMuse.tar` for the -OS to install into an app slot. The raw `make` recipe lives in `Makefile` and -`$(SDK_ROOT)/tools/app.mk`; it needs `SDK_ROOT` (or `PM_SDK_ROOT`) pointing at -the SDK checkout. +`build/PocketMuse.elfo` overlay, and packs them into `build/PocketMuse.tar` +for installation through the OS app manager. Packaging requires the SDK's +`elf_overlay_relink` and `elf_overlay_emit` tools on `PATH`. + +For an ELF-only clean build from this checkout: + +```sh +export SDK_ROOT="$(cd ../PocketMage_PDA/Code/PocketMageOS/lib/PocketMage_SDK && pwd)" +make SDK_ROOT="$SDK_ROOT" clean +make SDK_ROOT="$SDK_ROOT" elf +``` + +The SDK build recipe locates the installed Espressif Xtensa C++ toolchain. +Build the matching host from `PocketMage_PDA/Code/PocketMageOS` with +`pio run -e PM_BETA`. The host must export the playback-request, image-region, +SD-stream, drawing, and activity APIs used by this app. `mp3` files live in `/music/` at the root of the SD card; the app creates that directory along with `/music/.muse/` on first launch. @@ -31,45 +43,90 @@ directory along with `/music/.muse/` on first launch. | UP / DOWN | Volume (Now Playing) | | SPACE | Play / pause | | ENTER | Select / play | -| P | Cycle source (Lib/Fav/Pl) | +| P | Cycle source in browser; show queue from Now Playing | | F | Toggle favorite | | S | Toggle shuffle | | L | Cycle loop (None/One/All) | -| D | Delete from playlist | -| B | Back to browser | +| D | Remove selected favorite / playlist entry; keep the music file | +| U | Output: Auto / Piezo / USB | +| B | Switch browser / Now Playing; return from queue | | ? | Help overlay | | ESC / A | Exit to PocketMage OS | Touch scroll on the slider controls volume in all modes. -## Dependencies +## Playback and storage + +- Auto selects a connected UAC speaker; Piezo forces the built-in output. + USB falls back to piezo when no compatible speaker is available. The USB + status chip appears only while USB is the active playback output. +- Volume and output preference are shared SDK settings in NVS (`PMAudio`). Favorites use + an absolute-path list; playlists are `.m3u` files under + `/music/.muse/playlists/`, with one absolute SD path per entry. Blank lines, + comments, LF, and CRLF are supported. Empty sources remain browsable. +- Natural EOF advances once. Repeat-one affects automatic progression; + manual next still skips. Shuffle stops after its cycle unless repeat-all + is enabled. Favorite edits outside the active source preserve the current + shuffle cycle; a missing playing track keeps the not-found index at `-1`. +- ID3v2.3/v2.4 tags and embedded JPEG/PNG cover regions are read by the SDK's + streaming media service. The OS decodes covers into a 1-bit image buffer. Unsupported/missing artwork + uses the app's fallback display. +- The OLED uses decoded PCM frame timing for elapsed playback. Total duration + comes from MPEG headers, including Xing/VBRI when present, with a bitrate + estimate when an exact duration is unavailable. +- Idle sleep belongs to the OS and uses its `TIMEOUT` setting. Native and ELF + input reset the same timer. Playback, open SD streams, USB audio presence, + USB mode, and OS timeout-inhibition flags keep the device awake. + +## Architecture + +PocketMuse calls the SDK C ABI; it does not link Arduino or audio/display +drivers. The host owns Espressif `esp_audio_codec`, `pwm_audio`, `usb_stream`, +JPEGDEC/PNGdec, GxEPD2, U8g2, SD access, and sleep management. + +Playback queries, metadata/cover probing, image-region decoding, SD operations, +and canvas primitives are generated wrappers over native SDK services. The SDK +owns PCM gain, timing, shared audio settings, and metadata parsing. PocketMuse +owns its library, playlist, shuffle, and presentation state. The SDK retains +ABI 2 adapters for existing apps. + +USB serial is the default connector role. Piezo and unattached Auto sessions +retain it; an attached accessory receives one bounded UAC probe. An unsupported +device can then be tried as a keyboard. App exit waits for audio cleanup while +its callbacks and code remain resident. + +## Native tests + +```sh +python3 tests/run.py +``` + +Requires Python 3 and a C++17 compiler with AddressSanitizer and UBSan. `CXX` +selects the compiler; `SDK_ROOT` overrides the adjacent SDK checkout. The +tests exercise playlist parsing/mutation, shuffle continuity, playback progression, source +cycling, output preference, playback request results, and idle-timer rollover +and inhibition. They use in-memory SD files and require no device. -- **PlatformIO** (`espressif32` platform, Arduino framework) -- **arduino-audio-tools** - audio pipeline (I2S, source callbacks, fading) -- **arduino-libhelix** - MP3/AAC decode -- **GxEPD2** (fork: - [`ashtf8/GxEPD2_Editable_useFastFullUpdate`](https://github.com/ashtf8/GxEPD2_Editable_useFastFullUpdate)) -- **JPEGDEC** - album art decode -- **PNGdec** - album art decode -- **U8g2** - OLED display +USB enumeration/hotplug, audible output, album-art rendering, both displays, +and deep sleep still require validation on a PocketMage device. ## Project layout ```text src/ - main.cpp audio pipeline, app entry, setup/loop + main.cpp app entry, input and render loop muse.cpp app-wide globals library.cpp SD card track scanner (/music/) playlist.cpp playlist manager (favorites, .m3u) - metacache.cpp ID3 metadata cache on SD - albumart.cpp ID3v2 APIC extraction, JPEG/PNG decode, 1-bit render - ui_player.cpp playback control, shuffle, duration compute + ui_player.cpp playback control, shuffle, shared media-service queries ui/ ui_browser.cpp library/favorites/playlist browser ui_nowplaying.cpp now-playing screen with album art ui_playlist.cpp playlist queue view ui_helpers.cpp header/footer/scrollbar/OLED/time formatting include/ public headers +tests/ native regression suites and in-memory SD support +design/ chosen display mockups ``` ## License diff --git a/include/albumart.h b/include/albumart.h deleted file mode 100644 index 385449a7..00000000 --- a/include/albumart.h +++ /dev/null @@ -1,37 +0,0 @@ -#pragma once - -#include -#include - -class AlbumArt { -public: - static constexpr int kMaxSize = 120; - - enum Format { kNone, kJPEG, kPNG }; - - AlbumArt(); - ~AlbumArt(); - - bool load(const char *mp3Path); - void clear(); - - bool hasArt() const { return format_ != kNone; } - Format format() const { return format_; } - bool isJPEG() const { return format_ == kJPEG; } - bool isPNG() const { return format_ == kPNG; } - - int width() const { return img_w_; } - int height() const { return img_h_; } - - bool render1Bit(const char *mp3Path, uint8_t *einkBuf, int bufW, int bufH, - int outX, int outY, int maxSize = kMaxSize); - -private: - bool extractAPIC_(const char *mp3Path); - - Format format_; - int img_w_; - int img_h_; - uint32_t api_offset_; - uint32_t api_size_; -}; diff --git a/include/metacache.h b/include/metacache.h deleted file mode 100644 index 64ab20a2..00000000 --- a/include/metacache.h +++ /dev/null @@ -1,24 +0,0 @@ -#pragma once - -#include -#include - -class MetadataCache { -public: - bool load(const char *path, char *title, size_t tSize, char *artist, - size_t aSize, char *album, size_t lSize); - - void save(const char *path, const char *title, const char *artist, - const char *album); - - void clear(); - -private: - static constexpr uint32_t kMagic = 0x4D455441; - - bool readStr(const uint8_t *&p, const uint8_t *end, char *buf, - size_t bufSize); -}; - -// Global accessor. -MetadataCache &metaCache(); diff --git a/include/muse.h b/include/muse.h index dd0f46be..a4c9a8ca 100644 --- a/include/muse.h +++ b/include/muse.h @@ -39,14 +39,13 @@ extern char g_nowArtist[128]; extern char g_nowAlbum[128]; extern uint32_t g_nowDuration; extern float g_nowProgress; -extern size_t g_nowFileSize; +extern uint32_t g_nowElapsed; extern int g_nowTrackIndex; extern bool g_isFavorite; extern PlayerState g_playState; extern LoopMode g_loopMode; extern bool g_shuffleEnabled; -extern uint8_t g_volume; // UI prototypes void browser_init(); @@ -55,33 +54,8 @@ void browser_render(); void nowplaying_init(); void nowplaying_process_key(char ch); -void nowplaying_cache_art(const char *path); +void nowplaying_cache_art(const char *path, const struct pm_media_info &info); void nowplaying_render(); void playlist_process_key(char ch); void playlist_render(); - -void ui_update_oled(); -void ui_show_help(); - -// Shared UI helpers -void draw_header(const char *title); -void draw_footer(const char *hints); -void draw_scrollbar(int total, int visible, int position); -void format_time(char *buf, size_t bufSize, uint32_t seconds); -void get_display_name(const char *path, char *out, size_t maxLen); - -// Player control helpers -void player_play_index(int index); -void player_next_track(); -void player_prev_track(); -void player_cycle_source(); -void player_toggle_favorite(); -bool get_track_path(int index, char *buf, size_t bufSize); -uint32_t compute_duration(const char *path); - -// Low-level playback control -void music_stop(); -void music_play(const char *path); -void music_pause(); -void music_resume(); diff --git a/include/playlist.h b/include/playlist.h index 6ba169f3..c26fefe6 100644 --- a/include/playlist.h +++ b/include/playlist.h @@ -20,11 +20,14 @@ class PlaylistCursor { PlaylistCursor(); ~PlaylistCursor(); + /** Load path offsets, accepting an empty or absent list as empty. + * Return false on invalid paths, allocation failure, or nonempty-file read failure. + */ bool load(const char *path, bool isFav); void unload(); int count() const { return count_; } - bool valid() const { return offsets_ != nullptr; } + bool valid() const { return path_[0] != '\0'; } bool getEntry(int index, char *pathBuf, size_t bufSize) const; @@ -57,7 +60,9 @@ class PlaylistManager { int playlistIndex() const { return pl_index_; } bool playLibrary(); + /** Select Favorites, including an empty list; return false on a read failure. */ bool playFavorites(); + /** Select playlist idx; failed reads preserve metadata for retry and return false. */ bool playPlaylist(int idx); int entryCount() const; diff --git a/include/ui_helpers.h b/include/ui_helpers.h index 59815470..ee3922a8 100644 --- a/include/ui_helpers.h +++ b/include/ui_helpers.h @@ -4,6 +4,10 @@ #include +const char *source_label(); +/** Draw source-specific empty/error guidance on e-ink without refreshing it. */ +void draw_empty_source(); + void draw_header(const char *title); void draw_footer(const char *hints); void draw_scrollbar(int total, int visible, int position); @@ -12,3 +16,4 @@ void get_display_name(const char *path, char *out, size_t maxLen); void truncate_text(const char *src, char *dst, size_t maxDst); void ui_update_oled(); void ui_show_help(); +void draw_transport_icon_eink(int x, int y, int h, PlayerState state); diff --git a/include/ui_player.h b/include/ui_player.h index 5634db2d..307ffb34 100644 --- a/include/ui_player.h +++ b/include/ui_player.h @@ -1,26 +1,61 @@ #pragma once -#include "muse.h" - #include #include +/** Current permutation of source indices, owned by the player. */ extern int *g_shuffleIdx; +/** Number of allocated shuffle indices. */ extern int g_shuffleIdxCount; +/** Current position in the shuffle permutation, or -1 before playback. */ extern int g_shufflePos; +/** Rebuild shuffle for the active source; disable shuffle on allocation failure. */ void build_shuffle(); +/** Copy source entry index into buf; return false if unavailable or too long. */ bool get_track_path(int index, char *buf, size_t bufSize); -uint32_t compute_duration(const char *path); +/** Play source entry index and refresh its metadata and album art. */ void player_play_index(int index); +/** Advance manually using shuffle/repeat-all; ignore repeat-one. */ void player_next_track(); +/** Advance on EOF, honoring repeat-one. */ +void player_advance_auto(); +/** Select the preceding source entry using the current shuffle/loop mode. */ void player_prev_track(); +/** Cycle Library, Favorites, and playlists; reset selection and refresh counts. */ void player_cycle_source(); +/** Toggle the playing track's favorite membership. */ void player_toggle_favorite(); +/** Toggle path membership, refresh the active list, and report storage failure. */ +void player_toggle_favorite_path(const char *path); +/** Remove the selection from Favorites or a playlist, preserving music files. */ +void player_remove_selected(); +/** Cycle repeat None, One, and All. */ +void player_cycle_loop_mode(); +/** Toggle shuffle and rebuild its order when enabled. */ +void player_toggle_shuffle(); +/** Poll the request; advance once on EOF and stop on failure/cancellation. */ +void player_poll(); + +/** Increase, apply, and persist volume; return whether it changed. */ +bool player_volume_up(); +/** Decrease, apply, and persist volume; return whether it changed. */ +bool player_volume_down(); + +/** Cycle Auto, Piezo, and USB; apply and persist the preference. */ +void player_cycle_sink(); +/** Return true only while the OS is actively streaming to USB. */ +bool player_sink_is_usb_active(); +/** Return the current preference/output label for the OLED. */ +const char *sink_label(); +/** Cancel playback and disarm automatic progression. */ void music_stop(); +/** Request playback of path and capture its OS request ID; report start failure. */ void music_play(const char *path); +/** Pause the current OS audio request. */ void music_pause(); +/** Resume the current OS audio request. */ void music_resume(); diff --git a/src/albumart.cpp b/src/albumart.cpp deleted file mode 100644 index 6a853123..00000000 --- a/src/albumart.cpp +++ /dev/null @@ -1,179 +0,0 @@ -#include "albumart.h" - -#include -#include -#include - -#include "pm_app_api.h" - -static uint32_t readSyncsafe(const uint8_t *p) { - return ((uint32_t)(p[0] & 0x7f) << 21) | ((uint32_t)(p[1] & 0x7f) << 14) | - ((uint32_t)(p[2] & 0x7f) << 7) | ((uint32_t)(p[3] & 0x7f)); -} - -static uint32_t be32(const uint8_t *p) { - return ((uint32_t)p[0] << 24) | ((uint32_t)p[1] << 16) | ((uint32_t)p[2] << 8) | - p[3]; -} - -static bool validFrameId(const uint8_t *id) { - for (int i = 0; i < 4; i++) - if (!((id[i] >= 'A' && id[i] <= 'Z') || (id[i] >= '0' && id[i] <= '9'))) - return false; - return true; -} - -static size_t apicPrefix(const uint8_t *b, size_t n, uint8_t *picType, bool *png) { - if (n < 4) - return 0; - - uint8_t enc = b[0]; - size_t p = 1; - while (p < n && b[p]) - p++; - size_t mimeLen = p - 1; - const char *mime = (const char *)b + 1; - if (++p >= n) - return 0; - *picType = b[p++]; - - if (enc == 0 || enc == 3) { - while (p < n && b[p]) - p++; - p += 1; - } else { - while (p + 1 < n && (b[p] || b[p + 1])) - p += 2; - p += 2; - } - - if (p > n) - return 0; - - if ((mimeLen == 10 && !strncasecmp(mime, "image/jpeg", 10)) || - (mimeLen == 9 && !strncasecmp(mime, "image/jpg", 9))) - *png = false; - else if (mimeLen == 9 && !strncasecmp(mime, "image/png", 9)) - *png = true; - else - return 0; - - return p; -} - -AlbumArt::AlbumArt() : format_(kNone), img_w_(0), img_h_(0), api_offset_(0), api_size_(0) {} - -AlbumArt::~AlbumArt() {} - -bool AlbumArt::load(const char *mp3Path) { - clear(); - return extractAPIC_(mp3Path); -} - -void AlbumArt::clear() { - format_ = kNone; - img_w_ = img_h_ = 0; - api_offset_ = 0; - api_size_ = 0; -} - -bool AlbumArt::render1Bit(const char *mp3Path, uint8_t *einkBuf, int bufW, int bufH, int outX, - int outY, int maxSize) { - if (format_ == kNone || !einkBuf) - return false; - return pm_image_decode_region_to_1bit(mp3Path, api_offset_, api_size_, einkBuf, bufW, bufH, - outX, outY, maxSize, true); -} - -bool AlbumArt::extractAPIC_(const char *mp3Path) { - int s = pm_sd_stream_open(mp3Path); - if (s < 0) - return false; - - bool found = false, haveAny = false; - uint32_t firstOff = 0, firstLen = 0; - bool firstPng = false; - uint8_t h[10]; - - do { - if (pm_sd_stream_read(s, h, 10) != 10 || memcmp(h, "ID3", 3) != 0) - break; - uint8_t ver = h[3]; - if (ver != 3 && ver != 4) - break; - if (ver == 3 && (h[5] & 0x80)) - break; - - uint32_t tagEnd = 10 + readSyncsafe(h + 6); - uint32_t pos = 10; - - if (h[5] & 0x40) { - uint8_t e[4]; - if (pm_sd_stream_read(s, e, 4) != 4) - break; - pos += (ver == 4) ? readSyncsafe(e) : be32(e) + 4; - } - - while (pos + 10 <= tagEnd) { - if (!pm_sd_stream_seek(s, pos) || pm_sd_stream_read(s, h, 10) != 10) - break; - if (!validFrameId(h)) - break; - - uint32_t fsize = (ver == 4) ? readSyncsafe(h + 4) : be32(h + 4); - uint32_t next = pos + 10 + fsize; - if (next > tagEnd) - break; - - if (fsize && memcmp(h, "APIC", 4) == 0) { - uint8_t f = h[9]; - - bool unusable = (ver == 4) ? (f & 0x0E) : (f & 0xC0); - uint32_t extra = (ver == 4) ? ((f & 0x40) ? 1 : 0) + ((f & 0x01) ? 4 : 0) - : ((f & 0x20) ? 1 : 0); - - if (!unusable && fsize > extra) { - uint32_t body = pos + 10 + extra, bodyLen = fsize - extra; - uint8_t b[256]; - size_t n = bodyLen < sizeof(b) ? bodyLen : sizeof(b); - uint8_t type = 0; - bool png = false; - size_t pre = 0; - - if (pm_sd_stream_seek(s, body) && pm_sd_stream_read(s, b, n) == n) - pre = apicPrefix(b, n, &type, &png); - - if (pre && pre < bodyLen) { - if (type == 0x03) { - api_offset_ = body + (uint32_t)pre; - api_size_ = bodyLen - (uint32_t)pre; - format_ = png ? kPNG : kJPEG; - found = true; - break; - } - - if (!haveAny) { - firstOff = body + (uint32_t)pre; - firstLen = bodyLen - (uint32_t)pre; - firstPng = png; - haveAny = true; - } - } - } - } - - pos = next; - } - - if (!found && haveAny) { - api_offset_ = firstOff; - api_size_ = firstLen; - format_ = firstPng ? kPNG : kJPEG; - found = true; - } - - } while (0); - - pm_sd_stream_close(s); - return found; -} diff --git a/src/id3parser.cpp b/src/id3parser.cpp deleted file mode 100644 index e56b42b6..00000000 --- a/src/id3parser.cpp +++ /dev/null @@ -1,243 +0,0 @@ -#include "id3parser.h" - -#include -#include -#include - -#include -#include - -static constexpr size_t kId3ReadChunk = 4 * 1024; - -bool Id3Tag::parse(const char *path) { - clear(); - - size_t fileSize = pm_sd_get_file_size(path); - if (fileSize < 10) - return false; - - size_t readSize = fileSize < kId3ReadChunk ? fileSize : kId3ReadChunk; - uint8_t buf[kId3ReadChunk]; - - if (!pm_sd_read_binary_file(path, buf, readSize)) - return false; - - if (buf[0] != 'I' || buf[1] != 'D' || buf[2] != '3') - return false; - - uint8_t ver = buf[3]; - if (ver < 2 || ver > 4) - return false; - - uint32_t tagSize = readSyncsafe(buf + 6); - - size_t extLen = 0; - if (buf[5] & 0x40) { - if (readSize > 10 + 4) { - if (ver == 4) { - extLen = readSyncsafe(buf + 10); - } else { - uint32_t plain = ((uint32_t)buf[10] << 24) | ((uint32_t)buf[11] << 16) | - ((uint32_t)buf[12] << 8) | ((uint32_t)buf[13]); - extLen = plain + 4; - } - } - } - - size_t pos = 10 + extLen; - if (pos >= readSize) - return false; - - while (pos + (ver == 2 ? 6 : 10) <= readSize) { - const uint8_t *fhdr = buf + pos; - - char frameID[5] = {}; - if (ver == 2) { - frameID[0] = (char)fhdr[0]; - frameID[1] = (char)fhdr[1]; - frameID[2] = (char)fhdr[2]; - frameID[3] = '\0'; - } else { - std::memcpy(frameID, fhdr, 4); - frameID[4] = '\0'; - } - - if (frameID[0] == '\0') - break; - - uint32_t fsize; - if (ver == 2) { - fsize = ((uint32_t)fhdr[3] << 16) | ((uint32_t)fhdr[4] << 8) | - (uint32_t)fhdr[5]; - } else if (ver == 4) { - fsize = readSyncsafe(fhdr + 4); - } else { - fsize = ((uint32_t)fhdr[4] << 24) | ((uint32_t)fhdr[5] << 16) | - ((uint32_t)fhdr[6] << 8) | ((uint32_t)fhdr[7]); - } - - if (ver == 4 && (fhdr[9] & 0x40)) { - pos += 10 + fsize; - continue; - } - - if (fsize == 0) { - pos += 10; - continue; - } - - size_t bodyOffset = 10; - if (ver == 4 && (fhdr[9] & 0x20)) { - if (pos + 10 + 4 > readSize) { - pos += 10; - continue; - } - fsize = readSyncsafe(fhdr + 10); - bodyOffset = 14; - } - - if (pos + bodyOffset + fsize > readSize) { - pos += 10 + fsize; - continue; - } - - const uint8_t *fdata = buf + pos + bodyOffset; - - char *target = nullptr; - if (ver == 2) { - if (std::strcmp(frameID, "TT2") == 0) - target = _title; - else if (std::strcmp(frameID, "TP1") == 0) - target = _artist; - else if (std::strcmp(frameID, "TAL") == 0) - target = _album; - else if (std::strcmp(frameID, "TLE1") == 0) - target = _durationText; - } else { - if (std::strcmp(frameID, "TIT2") == 0) - target = _title; - else if (std::strcmp(frameID, "TPE1") == 0) - target = _artist; - else if (std::strcmp(frameID, "TALB") == 0) - target = _album; - else if (std::strcmp(frameID, "TLEN") == 0) - target = _durationText; - } - - if (target && pos + fsize <= readSize) { - if (std::strcmp(frameID, "TLEN") == 0 || std::strcmp(frameID, "TLE1") == 0) { - char lenBuf[16] = {}; - size_t n = fsize < sizeof(lenBuf) - 1 ? fsize : sizeof(lenBuf) - 1; - for (uint32_t i = 0; i < n; i++) - lenBuf[i] = (char)fdata[i]; - lenBuf[n] = '\0'; - _durationMs = static_cast(strtoul(lenBuf, nullptr, 10)); - } else { - decodeText(target, sizeof(_title), fdata, fsize); - } - } - - pos += 10 + fsize; - } - - return true; -} - -void Id3Tag::decodeText(char *target, size_t targetSize, const uint8_t *data, - uint32_t len) { - if (!target || targetSize == 0 || len == 0) - return; - - uint8_t encoding = data[0]; - const uint8_t *text = data + 1; - size_t textLen = len - 1; - - if (encoding == 0x00) { - size_t n = textLen < targetSize - 1 ? textLen : targetSize - 1; - for (size_t i = 0; i < n; i++) - target[i] = (char)text[i]; - target[n] = '\0'; - } else if (encoding == 0x01 || encoding == 0x02) { - bool bigEndian = (encoding == 0x02); - size_t i = 0; - size_t n = 0; - while (i + 1 < textLen && n < targetSize - 1) { - uint16_t ch; - if (bigEndian) { - ch = ((uint16_t)text[i] << 8) | text[i + 1]; - } else { - ch = text[i] | ((uint16_t)text[i + 1] << 8); - } - i += 2; - if (n == 0 && ch == 0xFEFF) - continue; - if (ch == 0xFFFE) { - bigEndian = !bigEndian; - continue; - } - if (ch < 0x80) { - target[n++] = (char)ch; - } else if (ch < 0x800) { - if (n + 1 >= targetSize - 1) - break; - target[n++] = (char)(0xC0 | (ch >> 6)); - target[n++] = (char)(0x80 | (ch & 0x3F)); - } else { - if (n + 2 >= targetSize - 1) - break; - target[n++] = (char)(0xE0 | (ch >> 12)); - target[n++] = (char)(0x80 | ((ch >> 6) & 0x3F)); - target[n++] = (char)(0x80 | (ch & 0x3F)); - } - } - target[n] = '\0'; - } else if (encoding == 0x03) { - size_t n = textLen < targetSize - 1 ? textLen : targetSize - 1; - size_t out = 0; - for (size_t i = 0; i < n && out < targetSize - 1; i++) { - uint8_t b = text[i]; - if ((b & 0x80) == 0) { - target[out++] = (char)b; - } else if ((b & 0xE0) == 0xC0) { - if (i + 1 >= n || (text[i + 1] & 0xC0) != 0x80) - break; - if (out + 1 >= targetSize - 1) - break; - target[out++] = (char)b; - target[out++] = (char)text[++i]; - } else if ((b & 0xF0) == 0xE0) { - if (i + 2 >= n || (text[i + 1] & 0xC0) != 0x80 || - (text[i + 2] & 0xC0) != 0x80) - break; - if (out + 2 >= targetSize - 1) - break; - target[out++] = (char)b; - target[out++] = (char)text[++i]; - target[out++] = (char)text[++i]; - } else { - break; - } - } - target[out] = '\0'; - } else { - size_t n = textLen < targetSize - 1 ? textLen : targetSize - 1; - std::memcpy(target, text, n); - target[n] = '\0'; - } -} - -void Id3Tag::clear() { - _title[0] = '\0'; - _artist[0] = '\0'; - _album[0] = '\0'; -} - -uint32_t Id3Tag::readSyncsafe(const uint8_t *p) { - return ((uint32_t)(p[0] & 0x7f) << 21) | ((uint32_t)(p[1] & 0x7f) << 14) | - ((uint32_t)(p[2] & 0x7f) << 7) | ((uint32_t)(p[3] & 0x7f)); -} - -uint32_t Id3Tag::readSize32(const uint8_t *p) { - return ((uint32_t)p[0] << 24) | ((uint32_t)p[1] << 16) | - ((uint32_t)p[2] << 8) | ((uint32_t)p[3]); -} diff --git a/src/id3parser.h b/src/id3parser.h deleted file mode 100644 index 0fee283d..00000000 --- a/src/id3parser.h +++ /dev/null @@ -1,37 +0,0 @@ -#pragma once - -#include -#include -#include - - -class Id3Tag { -public: - Id3Tag() = default; - - bool parse(const char *path); - - const char *title() const { return _title; } - const char *artist() const { return _artist; } - const char *album() const { return _album; } - uint32_t durationMs() const { return _durationMs; } - - void clear(); - -private: - static uint32_t readSyncsafe(const uint8_t *p); - static uint32_t readSize32(const uint8_t *p); - - static bool readFrameHeader(int slot, int ver, char frameID[5], - uint32_t &fsize); - - static void decodeText(char *target, size_t targetSize, const uint8_t *data, - uint32_t len); - - char _title[128] = {}; - char _artist[128] = {}; - char _album[128] = {}; - uint32_t _durationMs = 0; - - char _durationText[16] = {}; -}; diff --git a/src/main.cpp b/src/main.cpp index 7048d9b8..4be66a63 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,5 +1,4 @@ #include "library.h" -#include "metacache.h" #include "muse.h" #include "playlist.h" #include "ui_helpers.h" @@ -11,22 +10,22 @@ #include #include -extern "C" int atexit(void (*func)(void)) { - (void)func; - return 0; +static bool exit_key(char ch) { + return ch == PM_KEY_ESCAPE || ch == PM_KEY_ASCII_ESCAPE || ch == 'A'; } -static constexpr char kKeyExit1 = 12; -static constexpr char kKeyExit2 = 27; -static constexpr char kKeyExit3 = 65; - static void process_key(char ch) { - if (ch == kKeyExit1 || ch == kKeyExit2 || ch == kKeyExit3) { + if (exit_key(ch)) { music_stop(); g_appMode = MODE_BROWSER; return; } + if (g_appMode != MODE_HELP && (ch == 'u' || ch == 'U')) { + player_cycle_sink(); + return; + } + switch (g_appMode) { case MODE_BROWSER: browser_process_key(ch); @@ -45,9 +44,11 @@ static void process_key(char ch) { } extern "C" int main(int argc, char **argv) { + (void)argc; + (void)argv; if (pm_app_abi() != PM_APP_API_ABI) { printf("PocketMuse: host ABI mismatch: app %u, host %u\n", PM_APP_API_ABI, - pm_app_abi()); + static_cast(pm_app_abi())); pm_oled_sysmsg("SDK ABI mismatch", 2000); return 1; } @@ -55,11 +56,14 @@ extern "C" int main(int argc, char **argv) { printf("PocketMuse starting (SDK %s)\n", PM_SDK_VERSION); pm_audio_begin(); - pm_audio_set_volume(static_cast((g_volume * 16) / 255 - 8)); pm_oled_init(); - playlistMgr().begin(); + if (!playlistMgr().begin()) { + pm_oled_sysmsg("Music storage unavailable", 1200); + pm_audio_stop(); + return 1; + } library().scan(); g_trackCount = library().count(); @@ -72,70 +76,29 @@ extern "C" int main(int argc, char **argv) { char ch = pm_kb_read(); if (ch) { process_key(ch); - if (ch == kKeyExit1 || ch == kKeyExit2 || ch == kKeyExit3) { + pm_activity(); + if (exit_key(ch)) { exit_requested = true; + break; } } int scrollVec = pm_touch_get_scroll_vector(); - if (scrollVec > 0 && g_volume < 245) { - g_volume += 10; - if (g_volume > 255) g_volume = 255; - pm_audio_set_volume(static_cast((g_volume * 16) / 255 - 8)); - g_needsRedraw = true; - } else if (scrollVec < 0 && g_volume > 10) { - g_volume -= 10; - if (g_volume < 0) g_volume = 0; - pm_audio_set_volume(static_cast((g_volume * 16) / 255 - 8)); - g_needsRedraw = true; + if (scrollVec != 0) { + pm_activity(); + if (scrollVec > 0 ? player_volume_up() : player_volume_down()) + g_needsRedraw = true; } - ui_update_oled(); + player_poll(); - if (g_nowPath[0] && pm_audio_is_playing()) { - if (g_nowFileSize > 0) { - g_nowProgress = static_cast(pm_audio_get_position()) / - static_cast(g_nowFileSize); - if (g_nowProgress > 1.0f) - g_nowProgress = 1.0f; - } - } - - static bool g_wasPlaying = false; - bool isPlaying = pm_audio_is_playing(); - if (g_wasPlaying && !isPlaying && g_nowTrackIndex >= 0 && g_nowPath[0] && - g_nowProgress >= 0.99f) { - int n = g_trackCount > 0 ? g_trackCount : 1; - int next = -1; - switch (g_loopMode) { - case LoopMode::None: - break; - case LoopMode::One: - next = g_nowTrackIndex; - break; - case LoopMode::All: - next = g_nowTrackIndex + 1; - if (next >= n) - next = 0; - break; - } - if (next >= 0 && next < n) { - player_play_index(next); - } else { - music_stop(); - g_playState = PlayerState::Stopped; - g_nowPath[0] = '\0'; - } - } - g_wasPlaying = isPlaying; - - if (pm_audio_is_playing()) { - g_playState = PlayerState::Playing; - } else if (g_nowTrackIndex >= 0 && g_nowPath[0]) { - g_playState = PlayerState::Paused; - } else { - g_playState = PlayerState::Stopped; + static bool s_usbActive = false; + bool usbActive = player_sink_is_usb_active(); + if (usbActive != s_usbActive) { + s_usbActive = usbActive; + g_needsRedraw = true; } + ui_update_oled(); if (g_needsRedraw) { g_needsRedraw = false; diff --git a/src/metacache.cpp b/src/metacache.cpp deleted file mode 100644 index c6976457..00000000 --- a/src/metacache.cpp +++ /dev/null @@ -1,256 +0,0 @@ -#include "metacache.h" - -#include "paths.h" -#include "pm_app_api.h" - -#include -#include - -bool MetadataCache::readStr(const uint8_t *&p, const uint8_t *end, char *buf, - size_t bufSize) { - if (end - p < 2) - return false; - uint16_t len = static_cast(p[0] | (p[1] << 8)); - p += 2; - if (len == 0) { - buf[0] = '\0'; - return true; - } - if (end - p < static_cast(len)) - return false; - size_t toRead = len < bufSize ? len : bufSize - 1; - std::memcpy(buf, p, toRead); - buf[toRead] = '\0'; - p += len; - return true; -} - -bool MetadataCache::load(const char *path, char *title, size_t tSize, - char *artist, size_t aSize, char *album, - size_t lSize) { - if (!path || !path[0]) - return false; - - size_t fsize = pm_sd_get_file_size(paths::kMetadata); - if (fsize < 8) - return false; - - char *data = static_cast(std::malloc(fsize)); - if (!data) - return false; - if (!pm_sd_read_binary_file(paths::kMetadata, - reinterpret_cast(data), fsize)) { - std::free(data); - return false; - } - - const uint8_t *p = reinterpret_cast(data); - const uint8_t *end = p + fsize; - - uint32_t magic = - static_cast(p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24)); - p += 4; - if (magic != kMagic) { - std::free(data); - return false; - } - - uint32_t count = - static_cast(p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24)); - p += 4; - - for (uint32_t i = 0; i < count; i++) { - if (end - p < 2) - break; - uint16_t pathLen = static_cast(p[0] | (p[1] << 8)); - p += 2; - - bool match = false; - if (pathLen > 0 && end - p >= static_cast(pathLen)) { - match = (pathLen == std::strlen(path) + 1 && - std::memcmp(p, path, pathLen) == 0); - } - - if (end - p < static_cast(pathLen)) - break; - p += pathLen; - - if (match) { - if (!readStr(p, end, title, tSize)) { - std::free(data); - return false; - } - if (!readStr(p, end, artist, aSize)) { - std::free(data); - return false; - } - if (!readStr(p, end, album, lSize)) { - std::free(data); - return false; - } - std::free(data); - return true; - } - - for (int j = 0; j < 3; j++) { - if (end - p < 2) - break; - uint16_t sl = static_cast(p[0] | (p[1] << 8)); - p += 2; - if (end - p < static_cast(sl)) - break; - p += sl; - } - } - - std::free(data); - return false; -} - -void MetadataCache::save(const char *path, const char *title, - const char *artist, const char *album) { - if (!path || !path[0]) - return; - - size_t fsize = pm_sd_get_file_size(paths::kMetadata); - char *oldData = nullptr; - bool hasOld = false; - if (fsize >= 8) { - oldData = static_cast(std::malloc(fsize)); - if (oldData && - pm_sd_read_binary_file(paths::kMetadata, - reinterpret_cast(oldData), fsize)) - hasOld = true; - if (!hasOld) { - std::free(oldData); - oldData = nullptr; - } - } - - pm_sd_delete_file(paths::kMetadata); - - auto appendByte = [](uint8_t b) { - pm_sd_append_binary_file(paths::kMetadata, &b, 1); - }; - auto appendBytes = [](const void *src, size_t n) { - pm_sd_append_binary_file(paths::kMetadata, - static_cast(src), n); - }; - auto appendStr = [&](const char *s) { - uint16_t len = s ? static_cast(std::strlen(s) + 1) : 0; - appendByte(static_cast(len & 0xFF)); - appendByte(static_cast((len >> 8) & 0xFF)); - if (len > 0) - appendBytes(s, len); - }; - auto appendU16Bytes = [&](const void *data, size_t n) { - appendByte(static_cast(n & 0xFF)); - appendByte(static_cast((n >> 8) & 0xFF)); - if (n > 0) - appendBytes(data, n); - }; - - appendByte(static_cast(kMagic & 0xFF)); - appendByte(static_cast((kMagic >> 8) & 0xFF)); - appendByte(static_cast((kMagic >> 16) & 0xFF)); - appendByte(static_cast((kMagic >> 24) & 0xFF)); - - uint32_t newCount = 0; - bool updated = false; - size_t pathLen = std::strlen(path) + 1; - - uint32_t oldCount = 0; - if (hasOld) { - const uint8_t *p = reinterpret_cast(oldData) + 4; - const uint8_t *end = reinterpret_cast(oldData) + fsize; - - uint32_t oldMagic = - static_cast(p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24)); - p += 4; - if (oldMagic != kMagic) { - hasOld = false; - } else { - oldCount = static_cast(p[0] | (p[1] << 8) | (p[2] << 16) | - (p[3] << 24)); - p += 4; - - newCount = oldCount; - for (uint32_t i = 0; i < oldCount; i++) { - if (end - p < 2) - break; - uint16_t epLen = static_cast(p[0] | (p[1] << 8)); - p += 2; - if (epLen == pathLen && std::memcmp(p, path, epLen) == 0) - updated = true; - p += epLen; - for (int j = 0; j < 3; j++) { - if (end - p < 2) - break; - uint16_t sl = static_cast(p[0] | (p[1] << 8)); - p += 2; - p += sl; - } - } - if (!updated) - newCount++; - } - } else { - newCount = 1; - } - - appendByte(static_cast(newCount & 0xFF)); - appendByte(static_cast((newCount >> 8) & 0xFF)); - appendByte(static_cast((newCount >> 16) & 0xFF)); - appendByte(static_cast((newCount >> 24) & 0xFF)); - - if (hasOld) { - const uint8_t *p = reinterpret_cast(oldData) + 8; - const uint8_t *end = reinterpret_cast(oldData) + fsize; - - for (uint32_t i = 0; i < oldCount; i++) { - if (end - p < 2) - break; - uint16_t epLen = static_cast(p[0] | (p[1] << 8)); - p += 2; - - bool isMatch = - !updated && (epLen == pathLen && std::memcmp(p, path, epLen) == 0); - - if (isMatch) { - appendU16Bytes(path, pathLen); - appendStr(title); - appendStr(artist); - appendStr(album); - updated = true; - } else { - appendU16Bytes(p, epLen); - p += epLen; - - for (int j = 0; j < 3; j++) { - if (end - p < 2) - break; - uint16_t sl = static_cast(p[0] | (p[1] << 8)); - p += 2; - appendU16Bytes(p, sl); - p += sl; - } - } - } - } - - if (!updated) { - appendU16Bytes(path, pathLen); - appendStr(title); - appendStr(artist); - appendStr(album); - } - - std::free(oldData); -} - -void MetadataCache::clear() { pm_sd_delete_file(paths::kMetadata); } - -MetadataCache &metaCache() { - static MetadataCache cache; - return cache; -} diff --git a/src/muse.cpp b/src/muse.cpp index e32a17cd..5dafd5c0 100644 --- a/src/muse.cpp +++ b/src/muse.cpp @@ -12,11 +12,10 @@ char g_nowArtist[128] = {}; char g_nowAlbum[128] = {}; uint32_t g_nowDuration = 0; float g_nowProgress = 0.0f; -size_t g_nowFileSize = 0; +uint32_t g_nowElapsed = 0; int g_nowTrackIndex = -1; bool g_isFavorite = false; PlayerState g_playState = PlayerState::Stopped; LoopMode g_loopMode = LoopMode::None; bool g_shuffleEnabled = false; -uint8_t g_volume = 200; diff --git a/src/playlist.cpp b/src/playlist.cpp index 2787d750..b202f478 100644 --- a/src/playlist.cpp +++ b/src/playlist.cpp @@ -6,10 +6,11 @@ #include #include #include +#include static char *readTextFile(const char *path, size_t *outSize) { size_t fsize = pm_sd_get_file_size(path); - if (fsize == 0) + if (fsize == 0 || fsize >= UINT32_MAX) return nullptr; char *buf = static_cast(std::malloc(fsize + 1)); if (!buf) @@ -24,10 +25,80 @@ static char *readTextFile(const char *path, size_t *outSize) { return buf; } -static void trimCRLF(char *buf) { - size_t len = std::strlen(buf); - while (len > 0 && (buf[len - 1] == '\r' || buf[len - 1] == '\n')) - buf[--len] = '\0'; +static constexpr size_t kPathCapacity = 256; +static constexpr char kM3UHeader[] = "#EXTM3U\n"; + +// Counting, lookup and deletion share the same definition of a visible entry. +static bool nextEntry(const char *data, size_t size, size_t &pos, + size_t &start, size_t &length) { + while (pos < size) { + start = pos; + while (pos < size && data[pos] != '\n' && data[pos] != '\r') + ++pos; + length = pos - start; + while (pos < size && (data[pos] == '\n' || data[pos] == '\r')) + ++pos; + size_t first = start; + while (first < start + length && + (data[first] == ' ' || data[first] == '\t')) + ++first; + if (first == start + length || data[first] == '#' || + length >= kPathCapacity || std::memchr(data + start, '\0', length)) + continue; + return true; + } + return false; +} + +static bool validPath(const char *path) { + return path && path[0] == '/' && std::strlen(path) < kPathCapacity && + !std::strchr(path, '\r') && !std::strchr(path, '\n'); +} + +static bool rewriteEntries(const char *file, int removeIndex, + const char *removePath, const char *appendPath, + bool m3u) { + size_t size = pm_sd_get_file_size(file); + char *data = size ? readTextFile(file, &size) : nullptr; + if (size && !data) + return false; + size_t extra = (appendPath ? std::strlen(appendPath) : 0) + sizeof(kM3UHeader) + 2; + if (size > std::numeric_limits::max() - extra) { + std::free(data); + return false; + } + char *result = static_cast(std::malloc(size + extra)); + if (!result) { + std::free(data); + return false; + } + size_t used = 0; + if (m3u) { + used = sizeof(kM3UHeader) - 1; + std::memcpy(result, kM3UHeader, used); + } + size_t pos = 0, start = 0, length = 0; + int index = 0; + while (nextEntry(data, size, pos, start, length)) { + bool remove = index++ == removeIndex || + (removePath && length == std::strlen(removePath) && + std::memcmp(data + start, removePath, length) == 0); + if (remove) + continue; + std::memcpy(result + used, data + start, length); + used += length; + result[used++] = '\n'; + } + if (appendPath) { + size_t length = std::strlen(appendPath); + std::memcpy(result + used, appendPath, length); + used += length; + result[used++] = '\n'; + } + bool ok = pm_sd_write_binary_file(file, reinterpret_cast(result), used); + std::free(result); + std::free(data); + return ok; } @@ -47,6 +118,12 @@ void PlaylistCursor::unload() { bool PlaylistCursor::load(const char *path, bool isFav) { unload(); + if (!validPath(path)) + return false; + if (pm_sd_get_file_size(path) == 0) { + std::strcpy(path_, path); + return true; + } size_t fsize = 0; char *data = readTextFile(path, &fsize); if (!data) @@ -55,7 +132,7 @@ bool PlaylistCursor::load(const char *path, bool isFav) { bool ok = isFav ? parseFavs_(data, fsize) : parseM3U_(data, fsize); std::free(data); - if (!ok || count_ == 0) { + if (!ok) { unload(); return false; } @@ -66,6 +143,8 @@ bool PlaylistCursor::load(const char *path, bool isFav) { } bool PlaylistCursor::getEntry(int index, char *pathBuf, size_t bufSize) const { + if (pathBuf && bufSize) + pathBuf[0] = '\0'; if (!valid() || index < 0 || index >= count_ || !pathBuf || bufSize == 0) return false; @@ -74,16 +153,21 @@ bool PlaylistCursor::getEntry(int index, char *pathBuf, size_t bufSize) const { if (!data) return false; - uint32_t off = offsets_[index]; - uint32_t end = off; + size_t off = offsets_[index]; + if (off >= fsize || fsize != file_size_) { + std::free(data); + return false; + } + size_t end = off; while (end < fsize && data[end] != '\n' && data[end] != '\r') end++; size_t copyLen = static_cast(end - off); - if (copyLen >= bufSize) - copyLen = bufSize - 1; + if (copyLen >= bufSize) { + std::free(data); + return false; + } std::memcpy(pathBuf, data + off, copyLen); pathBuf[copyLen] = '\0'; - trimCRLF(pathBuf); std::free(data); return pathBuf[0] != '\0'; @@ -95,23 +179,14 @@ bool PlaylistCursor::parseM3U_(const char *data, size_t size) { if (!off) return false; int n = 0; - uint32_t pos = 0; - - while (pos < size) { - uint32_t lineStart = pos; - while (pos < size && data[pos] != '\n') - pos++; - if (pos < size) - pos++; - - size_t lineLen = pos - lineStart; - if (lineLen == 0) - continue; - - if (data[lineStart] == '#') - continue; - + size_t pos = 0, lineStart = 0, length = 0; + while (nextEntry(data, size, pos, lineStart, length)) { if (n >= cap) { + if (cap > std::numeric_limits::max() / 2 || + static_cast(cap) > SIZE_MAX / (2 * sizeof(uint32_t))) { + std::free(off); + return false; + } cap *= 2; uint32_t *nf = static_cast(std::malloc(cap * sizeof(uint32_t))); @@ -123,15 +198,16 @@ bool PlaylistCursor::parseM3U_(const char *data, size_t size) { std::free(off); off = nf; } - off[n++] = lineStart; + off[n++] = static_cast(lineStart); } if (n == 0) { std::free(off); - return false; + off = nullptr; } count_ = n; offsets_ = off; + file_size_ = static_cast(size); return true; } @@ -215,29 +291,20 @@ bool PlaylistManager::playLibrary() { } bool PlaylistManager::playFavorites() { - if (!cursor_.load(paths::kFavorites, true)) - return false; source_ = PlaySource::Favorites; pl_index_ = -1; - return true; + return cursor_.load(paths::kFavorites, true); } bool PlaylistManager::playPlaylist(int idx) { if (idx < 0 || idx >= playlist_count_) return false; - cursor_.unload(); - if (!cursor_.load(playlists_[idx].filename, false)) { - for (int i = idx; i < playlist_count_ - 1; i++) - playlists_[i] = playlists_[i + 1]; - playlist_count_--; - return false; - } - source_ = PlaySource::Playlist; - playlists_[idx].count = cursor_.count(); pl_index_ = idx; - return true; + bool loaded = cursor_.load(playlists_[idx].filename, false); + playlists_[idx].count = loaded ? cursor_.count() : -1; + return loaded; } int PlaylistManager::entryCount() const { @@ -251,88 +318,36 @@ bool PlaylistManager::getEntry(int index, char *pathBuf, size_t bufSize) { } bool PlaylistManager::toggleFavorite(const char *path) { + if (!validPath(path)) + return false; bool wasFav = isFavorite(path); - if (wasFav) { - size_t fsize = 0; - char *data = readTextFile(paths::kFavorites, &fsize); - if (!data) - return true; - - char *result = static_cast(std::malloc(fsize + 1)); - if (!result) { - std::free(data); - return true; - } - size_t result_len = 0; - - const char *p = data; - bool found = false; - while (*p) { - const char *nl = std::strchr(p, '\n'); - size_t linelen = nl ? static_cast(nl - p) : std::strlen(p); - bool match = - (linelen == std::strlen(path) && std::memcmp(p, path, linelen) == 0); - if (match) { - found = true; - } else { - if (result_len + linelen + 1 <= fsize) { - std::memcpy(result + result_len, p, linelen); - result_len += linelen; - result[result_len++] = '\n'; - } - } - if (!nl) - break; - p = nl + 1; - } - std::free(data); - - if (!found) { - std::free(result); - return true; - } - - result[result_len] = '\0'; - pm_sd_write_binary_file(paths::kFavorites, - reinterpret_cast(result), - result_len); - std::free(result); - - if (source_ == PlaySource::Favorites) { - cursor_.unload(); - cursor_.load(paths::kFavorites, true); - } - } else { - char line[256]; - snprintf(line, sizeof(line), "%s\n", path); - pm_sd_append_file(paths::kFavorites, line); - } + if (!rewriteEntries(paths::kFavorites, -1, wasFav ? path : nullptr, + wasFav ? nullptr : path, false)) + return wasFav; if (source_ == PlaySource::Favorites) { - cursor_.unload(); + // An empty favorites file leaves an empty cursor in the same view. cursor_.load(paths::kFavorites, true); } return !wasFav; } bool PlaylistManager::isFavorite(const char *path) { + if (!validPath(path)) + return false; size_t fsize = 0; char *data = readTextFile(paths::kFavorites, &fsize); if (!data) return false; - const char *p = data; bool found = false; - while (*p) { - const char *nl = std::strchr(p, '\n'); - size_t linelen = nl ? static_cast(nl - p) : std::strlen(p); - if (linelen == std::strlen(path) && std::memcmp(p, path, linelen) == 0) { + size_t pathLen = std::strlen(path); + size_t pos = 0, start = 0, length = 0; + while (nextEntry(data, fsize, pos, start, length)) { + if (length == pathLen && std::memcmp(data + start, path, length) == 0) { found = true; break; } - if (!nl) - break; - p = nl + 1; } std::free(data); return found; @@ -345,25 +360,19 @@ int PlaylistManager::favoriteCount() { return 0; int count = 0; - const char *p = data; - while (*p) { - const char *nl = std::strchr(p, '\n'); - if (!nl) - break; - p = nl + 1; - count++; - } + size_t pos = 0, start = 0, length = 0; + while (nextEntry(data, fsize, pos, start, length)) + ++count; std::free(data); return count; } bool PlaylistManager::addToPlaylist(int plIdx, const char *songPath) { - if (plIdx < 0 || plIdx >= playlist_count_) + if (plIdx < 0 || plIdx >= playlist_count_ || !validPath(songPath)) return false; - char line[256]; - snprintf(line, sizeof(line), "%s\n", songPath); - pm_sd_append_file(playlists_[plIdx].filename, line); + if (!rewriteEntries(playlists_[plIdx].filename, -1, nullptr, songPath, true)) + return false; if (source_ == PlaySource::Playlist && pl_index_ == plIdx) { cursor_.unload(); @@ -388,41 +397,8 @@ bool PlaylistManager::removeFromPlaylist(int plIdx, int entryIndex) { return false; } - size_t fsize = 0; - char *data = readTextFile(playlists_[plIdx].filename, &fsize); - if (!data) { - tmp.unload(); + if (!rewriteEntries(playlists_[plIdx].filename, entryIndex, nullptr, nullptr, true)) return false; - } - - char result[4096]; - size_t result_len = 0; - std::memcpy(result, "#EXTM3U\n", 8); - result_len = 8; - - const char *p = data; - int idx = 0; - while (*p) { - const char *nl = std::strchr(p, '\n'); - size_t linelen = nl ? static_cast(nl - p) : std::strlen(p); - if (idx != entryIndex && linelen > 0 && p[0] != '#') { - if (result_len + linelen + 1 < sizeof(result)) { - std::memcpy(result + result_len, p, linelen); - result_len += linelen; - result[result_len++] = '\n'; - } - } - if (!nl) - break; - p = nl + 1; - idx++; - } - std::free(data); - - result[result_len] = '\0'; - pm_sd_write_binary_file(playlists_[plIdx].filename, - reinterpret_cast(result), - result_len); tmp.unload(); if (source_ == PlaySource::Playlist && pl_index_ == plIdx) { diff --git a/src/ui/ui_browser.cpp b/src/ui/ui_browser.cpp index 5f33fde9..7cf1b80a 100644 --- a/src/ui/ui_browser.cpp +++ b/src/ui/ui_browser.cpp @@ -2,6 +2,7 @@ #include "muse.h" #include "playlist.h" #include "ui_helpers.h" +#include "ui_player.h" #include "paths.h" #include "pm_app_api.h" @@ -9,29 +10,13 @@ #include #include -static constexpr int kItemH = 10; -static constexpr int kListTop = 32; -static constexpr int kListBot = 214; +static constexpr int kItemH = 16; +static constexpr int kListTop = 36; +static constexpr int kListBot = 216; static constexpr int kMaxVis = (kListBot - kListTop) / kItemH; static int g_scrollOffset = 0; -static const char *source_label() { - switch (playlistMgr().source()) { - case PlaySource::Library: - return "Library"; - case PlaySource::Favorites: - return "Favorites"; - case PlaySource::Playlist: { - int pi = playlistMgr().playlistIndex(); - if (pi >= 0) - return playlistMgr().playlistMeta(pi).name; - return "Playlist"; - } - } - return "Library"; -} - static int track_count() { switch (playlistMgr().source()) { case PlaySource::Library: @@ -55,7 +40,7 @@ void browser_process_key(char ch) { int n = track_count(); switch (ch) { - case 19: // LEFT: prev track + case PM_KEY_LEFT: if (g_selIndex > 0) { g_selIndex--; if (g_selIndex < g_scrollOffset) @@ -63,7 +48,7 @@ void browser_process_key(char ch) { g_needsRedraw = true; } break; - case 21: // RIGHT: next track + case PM_KEY_RIGHT: if (g_selIndex < n - 1) { g_selIndex++; if (g_selIndex >= g_scrollOffset + kMaxVis) @@ -71,8 +56,8 @@ void browser_process_key(char ch) { g_needsRedraw = true; } break; - case 32: - case 13: // Space or Enter + case PM_KEY_SPACE: + case PM_KEY_ENTER: if (n > 0 && g_selIndex < n) { player_play_index(g_selIndex); } @@ -80,55 +65,31 @@ void browser_process_key(char ch) { case 'p': case 'P': player_cycle_source(); - g_selIndex = 0; g_scrollOffset = 0; - g_trackCount = track_count(); - g_needsRedraw = true; break; case 'f': case 'F': if (n > 0 && g_selIndex < n) { char path[256]; if (get_track_path(g_selIndex, path, sizeof(path)) && path[0]) { - g_isFavorite = playlistMgr().toggleFavorite(path); + player_toggle_favorite_path(path); } } g_needsRedraw = true; break; case 's': case 'S': - g_shuffleEnabled = !g_shuffleEnabled; - g_needsRedraw = true; + player_toggle_shuffle(); break; case 'l': - case 'L': { - switch (g_loopMode) { - case LoopMode::None: - g_loopMode = LoopMode::One; - break; - case LoopMode::One: - g_loopMode = LoopMode::All; - break; - case LoopMode::All: - g_loopMode = LoopMode::None; - break; - } - g_needsRedraw = true; + case 'L': + player_cycle_loop_mode(); break; - } case 'd': case 'D': - if (playlistMgr().source() == PlaySource::Playlist && n > 0) { - int pi = playlistMgr().playlistIndex(); - int idx = g_selIndex; - if (idx < g_trackCount) { - playlistMgr().removeFromPlaylist(pi, idx); - g_trackCount = track_count(); - if (g_selIndex >= g_trackCount && g_selIndex > 0) - g_selIndex--; - g_needsRedraw = true; - } - } + player_remove_selected(); + if (g_selIndex < g_scrollOffset) + g_scrollOffset = g_selIndex; break; case 'b': case 'B': @@ -148,17 +109,14 @@ void browser_process_key(char ch) { void browser_render() { pm_ui_begin_eink_screen(false); - char hdr[64]; + char hdr[96]; snprintf(hdr, sizeof(hdr), "%s [%d]", source_label(), g_trackCount); draw_header(hdr); int n = track_count(); if (n == 0) { - char hint[96]; - snprintf(hint, sizeof(hint), "Put .mp3 files in %s", paths::kMusicDir); - pm_text(PM_TARGET_EINK, 8, 80, "No tracks found", PM_STYLE_BODY); - pm_text(PM_TARGET_EINK, 8, 94, hint, PM_STYLE_BODY); - draw_footer("No tracks - add .mp3 files to the music folder"); + draw_empty_source(); + draw_footer("P:source B:playing ?:help"); pm_eink_refresh(); return; } @@ -175,30 +133,54 @@ void browser_render() { int w = pm_eink_width(); + // Fixed column for the serif track number; the title starts after it. + const int kNumX = 8; + const int kTitleX = 44; + // Room at the right for the drawn now-playing marker. + const int kMarkerW = 14; + for (int i = g_scrollOffset; i < end; i++) { - char path[256]; + char path[256] = {}; char label[64]; - get_track_path(i, path, sizeof(path)); - get_display_name(path, label, sizeof(label)); - - // Truncate with ellipsis to fit the available width. - const char *ell = pm_layout_truncate_with_ellipsis( - label, w - 24, PM_STYLE_TINY, PM_TARGET_EINK); - char row[96]; - strncpy(row, ell, sizeof(row) - 1); - row[sizeof(row) - 1] = '\0'; - - if (i == g_selIndex) { - pm_eink_rect(0, y - 8, w - 1, y - 8 + kItemH, false, true); + if (get_track_path(i, path, sizeof(path))) + get_display_name(path, label, sizeof(label)); + else + std::strcpy(label, "Unavailable track"); + + int baseline = y + 10; + int titleMaxW = w - kTitleX - kMarkerW - 6; + int style = i == g_selIndex ? PM_STYLE_SANS_BOLD : PM_STYLE_SMALL; + const char *title = pm_layout_truncate_with_ellipsis( + label, titleMaxW, style, PM_TARGET_EINK); + + char numBuf[16]; + snprintf(numBuf, sizeof(numBuf), "%2d.", i + 1); + + if (i == g_selIndex) + pm_eink_rect(0, y - 3, w - 1, y - 3 + kItemH - 1, false, true); + + // The track number is always serif; the title uses bold only when the + // row is selected, keeping the number visually distinct from the title. + pm_text(PM_TARGET_EINK, kNumX, baseline, numBuf, PM_STYLE_SMALL); + pm_text(PM_TARGET_EINK, kTitleX, baseline, title, + i == g_selIndex ? PM_STYLE_SANS_BOLD : PM_STYLE_SMALL); + + // Now-playing marker: a small drawn play triangle rather than a font + // glyph (the serif fonts render such glyphs as tofu). + if (std::strcmp(path, g_nowPath) == 0 && g_playState != PlayerState::Stopped) { + int triX = w - kMarkerW; + int triTop = y + 2; + int triH = 9; + draw_transport_icon_eink(triX, triTop, triH, g_playState); } - pm_text(PM_TARGET_EINK, 8, y, row, PM_STYLE_TINY); + y += kItemH; } draw_scrollbar(n, kMaxVis, g_scrollOffset); char footer[64] = {}; - if (playlistMgr().source() == PlaySource::Playlist) { + if (playlistMgr().source() != PlaySource::Library) { snprintf(footer, sizeof(footer), "L/R:nav SPC:play P:src F:fav D:del ?:help"); } else { diff --git a/src/ui/ui_helpers.cpp b/src/ui/ui_helpers.cpp index 32504d1d..cbed7c7e 100644 --- a/src/ui/ui_helpers.cpp +++ b/src/ui/ui_helpers.cpp @@ -1,17 +1,72 @@ #include "ui_helpers.h" #include "muse.h" +#include "playlist.h" +#include "paths.h" +#include "ui_player.h" #include "pm_app_api.h" #include #include -static constexpr int kLineH = 10; +const char *source_label() { + switch (playlistMgr().source()) { + case PlaySource::Library: + return "Library"; + case PlaySource::Favorites: + return "Favorites"; + case PlaySource::Playlist: { + int pi = playlistMgr().playlistIndex(); + if (pi >= 0) + return playlistMgr().playlistMeta(pi).name; + return "Playlist"; + } + } + return "Library"; +} + +void draw_empty_source() { + const char *title = "No tracks found"; + char hint[96]; + snprintf(hint, sizeof(hint), "Put .mp3 files in %s", paths::kMusicDir); + if (playlistMgr().source() != PlaySource::Library) { + if (!playlistMgr().cursor().valid()) { + title = "Cannot read tracks"; + std::strcpy(hint, "Check the SD card, then reopen this source."); + } else if (playlistMgr().source() == PlaySource::Favorites) { + title = "No favorites yet"; + std::strcpy(hint, "Press F on a track in the Library to add it."); + } else { + title = "Playlist is empty"; + std::strcpy(hint, "Add track paths to this .m3u file on SD."); + } + } + pm_text(PM_TARGET_EINK, 8, 80, title, PM_STYLE_SMALL); + pm_text(PM_TARGET_EINK, 8, 95, hint, PM_STYLE_SMALL); +} + +static int transport_icon(PlayerState state) { + switch (state) { + case PlayerState::Playing: + return PM_TRANSPORT_ICON_PLAY; + case PlayerState::Paused: + return PM_TRANSPORT_ICON_PAUSE; + case PlayerState::Stopped: + return PM_TRANSPORT_ICON_STOP; + } + return PM_TRANSPORT_ICON_STOP; +} + +void draw_transport_icon_eink(int x, int y, int h, PlayerState state) { + pm_ui_draw_transport_icon(PM_TARGET_EINK, x, y, h + 1, transport_icon(state)); +} void draw_header(const char *title) { - pm_text_color(PM_TARGET_EINK, 1); + pm_text_color(PM_TARGET_EINK, 1); pm_text(PM_TARGET_EINK, 8, 16, title ? title : "", PM_STYLE_BODY); + // Tiny PocketMuse mark in the top-right corner of every screen. + pm_text(PM_TARGET_EINK, pm_eink_width() - 16, 6, "PM", PM_STYLE_TINY); pm_eink_rect(0, 22, pm_eink_width() - 1, 22, false, true); } @@ -29,10 +84,16 @@ void draw_scrollbar(int total, int visible, int position) { void format_time(char *buf, size_t bufSize, uint32_t seconds) { uint32_t m = seconds / 60; uint32_t s = seconds % 60; - snprintf(buf, bufSize, "%u:%02u", m, s); + snprintf(buf, bufSize, "%lu:%02lu", static_cast(m), + static_cast(s)); } void get_display_name(const char *path, char *out, size_t maxLen) { + if (!out || maxLen == 0) + return; + out[0] = '\0'; + if (!path) + return; const char *name = std::strrchr(path, '/'); if (name) name++; @@ -51,65 +112,68 @@ void truncate_text(const char *src, char *dst, size_t maxDst) { } void ui_update_oled() { - char now[128]; - if (g_playState == PlayerState::Playing) { - if (g_nowArtist[0]) { - snprintf(now, sizeof(now), ">> %s - %s", g_nowTitle, g_nowArtist); - } else { - snprintf(now, sizeof(now), ">> %s", g_nowTitle); - } - } else if (g_playState == PlayerState::Paused) { - snprintf(now, sizeof(now), "|| %s", g_nowTitle); - } else if (g_nowTitle[0]) { - snprintf(now, sizeof(now), " %s", g_nowTitle); - } else { - snprintf(now, sizeof(now), " PocketMuse"); - } - - uint32_t elapsed = static_cast(g_nowProgress * g_nowDuration); - char elStr[16], durStr[16]; + pm_oled_set_power_save(false); + pm_oled_clear(); + pm_text_color(PM_TARGET_OLED, 0); + + const int w = pm_oled_width(); + const int h = pm_oled_height(); + + // A font glyph for play/pause falls back to a tofu box in these u8g2 fonts, + // so the transport marker is drawn, not typed. Reserve a small column for it. + const int kIconBox = 7; // glyph fits in a 7px box + const int kIconTop = 2; // top of the glyph on line 1 + const int kTitleX = kIconBox + 4; + const int kTextOffsetY = 3; + const int kTitleBaseline = 11 + kTextOffsetY; + const int kSinkBaseline = 25 + kTextOffsetY; + + // Elapsed / total, right-aligned on line 1. + uint32_t elapsed = g_nowElapsed; + char timeBuf[32]; + char elStr[12], durStr[12]; format_time(elStr, sizeof(elStr), elapsed); format_time(durStr, sizeof(durStr), g_nowDuration); - char timeStr[32]; - snprintf(timeStr, sizeof(timeStr), "%s / %s", elStr, durStr); - - const char *src = "Library"; - switch (playlistMgr().source()) { - case PlaySource::Library: - src = "Library"; - break; - case PlaySource::Favorites: - src = "Favorites"; - break; - case PlaySource::Playlist: - src = "Playlist"; - break; + snprintf(timeBuf, sizeof(timeBuf), "%s / %s", elStr, durStr); + int timeW = pm_text_width(PM_TARGET_OLED, timeBuf, PM_STYLE_TINY); + + pm_ui_draw_transport_icon(PM_TARGET_OLED, 0, kIconTop, kIconBox, + transport_icon(g_playState)); + + // Title fills the gap between the glyph and the time readout. + const char *rawTitle = g_nowTitle[0] ? g_nowTitle : "PocketMuse"; + int titleMaxW = w - kTitleX - timeW - 6; + if (titleMaxW < 16) + titleMaxW = 16; + const char *title = pm_layout_truncate_with_ellipsis(rawTitle, titleMaxW, + PM_STYLE_MEDIUM, + PM_TARGET_OLED); + pm_text(PM_TARGET_OLED, kTitleX, kTitleBaseline, title, PM_STYLE_MEDIUM); + pm_text(PM_TARGET_OLED, w - timeW, kTitleBaseline, timeBuf, PM_STYLE_TINY); + + pm_text(PM_TARGET_OLED, 0, kSinkBaseline, sink_label(), PM_STYLE_TINY); + + // A two-pixel frame has no interior. Use a dotted baseline so the empty + // portion stays distinct from the two-pixel filled portion on a 1-bit canvas. + const int kBarH = 2; + const int barY = h - kBarH; + constexpr int kTrackDotPitch = 4; + for (int x = 0; x < w; x += kTrackDotPitch) + pm_oled_box(x, h - 1, 1, 1, true); + if (g_nowProgress > 0.0f) { + float p = g_nowProgress > 1.0f ? 1.0f : g_nowProgress; + int filled = static_cast(w * p); + if (filled > 0) + pm_oled_box(0, barY, filled, kBarH, true); } - char srcBuf[64]; - snprintf(srcBuf, sizeof(srcBuf), "%s [%d]", src, g_trackCount); - - int volPct = (g_volume * 100 + 127) / 255; - char volBuf[16]; - snprintf(volBuf, sizeof(volBuf), "V:%3u%%", volPct); - - pm_oled_set_power_save(false); - pm_oled_clear(); - pm_text_color(PM_TARGET_OLED, 1); - pm_text(PM_TARGET_OLED, 0, 8, now, PM_STYLE_HEADING2); - pm_text(PM_TARGET_OLED, 0, 20, timeStr, PM_STYLE_TINY); - pm_text(PM_TARGET_OLED, 0, 30, srcBuf, PM_STYLE_TINY); - int vol_w = pm_text_width(PM_TARGET_OLED, volBuf, PM_STYLE_TINY); - pm_text(PM_TARGET_OLED, 256 - vol_w - 2, 30, volBuf, PM_STYLE_TINY); pm_oled_send(); } void ui_show_help() { pm_ui_begin_eink_screen(false); - pm_text_color(PM_TARGET_EINK, 1); - pm_text(PM_TARGET_EINK, 8, 18, "PocketMuse Controls", PM_STYLE_BODY); - pm_eink_rect(0, 22, pm_eink_width() - 1, 22, false, true); + draw_header("PocketMuse Controls"); struct Row { const char *key; @@ -124,7 +188,8 @@ void ui_show_help() { {"F", "Toggle favorite"}, {"S", "Toggle shuffle"}, {"L", "Cycle loop (None/One/All)"}, - {"D", "Delete from playlist"}, + {"D", "Remove favorite / playlist entry"}, + {"U", "Output: Auto / Piezo / USB"}, {"B", "Back to browser"}, {"?", "Show this screen"}, {"ESC / A", "Exit to OS"}, diff --git a/src/ui/ui_nowplaying.cpp b/src/ui/ui_nowplaying.cpp index 640090c1..678994e9 100644 --- a/src/ui/ui_nowplaying.cpp +++ b/src/ui/ui_nowplaying.cpp @@ -1,6 +1,6 @@ -#include "albumart.h" #include "muse.h" #include "ui_helpers.h" +#include "ui_player.h" #include "pm_app_api.h" @@ -26,8 +26,8 @@ void nowplaying_process_key(char ch) { int n = g_trackCount > 0 ? g_trackCount : 1; switch (ch) { - case 32: - case 13: + case PM_KEY_SPACE: + case PM_KEY_ENTER: if (g_playState == PlayerState::Playing) { music_pause(); g_playState = PlayerState::Paused; @@ -41,30 +41,22 @@ void nowplaying_process_key(char ch) { } g_needsRedraw = true; break; - case 19: // LEFT: prev track + case PM_KEY_LEFT: if (n > 0) player_prev_track(); g_needsRedraw = true; break; - case 21: // RIGHT: next track + case PM_KEY_RIGHT: if (n > 0) player_next_track(); g_needsRedraw = true; break; - case 24: // UP: increase volume - if (g_volume < 245) - g_volume += 10; - else - g_volume = 255; - pm_audio_set_volume(static_cast((g_volume * 16) / 255 - 8)); + case PM_KEY_UP: + player_volume_up(); g_needsRedraw = true; break; - case 25: // DOWN: decrease volume - if (g_volume > 10) - g_volume -= 10; - else - g_volume = 0; - pm_audio_set_volume(static_cast((g_volume * 16) / 255 - 8)); + case PM_KEY_DOWN: + player_volume_down(); g_needsRedraw = true; break; case 'b': @@ -80,34 +72,17 @@ void nowplaying_process_key(char ch) { } break; case 'f': - case 'F': { - if (g_nowPath[0]) { - g_isFavorite = playlistMgr().toggleFavorite(g_nowPath); - } - g_needsRedraw = true; + case 'F': + player_toggle_favorite(); break; - } case 's': case 'S': - g_shuffleEnabled = !g_shuffleEnabled; - g_needsRedraw = true; + player_toggle_shuffle(); break; case 'l': - case 'L': { - switch (g_loopMode) { - case LoopMode::None: - g_loopMode = LoopMode::One; - break; - case LoopMode::One: - g_loopMode = LoopMode::All; - break; - case LoopMode::All: - g_loopMode = LoopMode::None; - break; - } - g_needsRedraw = true; + case 'L': + player_cycle_loop_mode(); break; - } case '?': g_prevMode = g_appMode; g_appMode = MODE_HELP; @@ -116,21 +91,18 @@ void nowplaying_process_key(char ch) { } } -void nowplaying_cache_art(const char *path) { +void nowplaying_cache_art(const char *path, const pm_media_info &info) { s_cachedW = 0; s_cachedH = 0; s_artCachePath[0] = '\0'; - if (!path || !path[0]) - return; - - AlbumArt art; - if (!art.load(path)) + if (!path || !path[0] || !info.coverLength) return; std::memset(s_artCache, 0, sizeof(s_artCache)); - if (art.render1Bit(path, s_artCache, kArtSize, kArtSize, 0, 0, kArtSize)) { + if (pm_image_decode_region_to_1bit(path, info.coverOffset, info.coverLength, s_artCache, + kArtSize, kArtSize, 0, 0, kArtSize, true)) { s_cachedW = kArtSize; s_cachedH = kArtSize; std::strncpy(s_artCachePath, path, sizeof(s_artCachePath) - 1); @@ -138,6 +110,18 @@ void nowplaying_cache_art(const char *path) { } } +// Draw a small outlined chip with a centered label. Returns the x just past +// the chip so chips can be laid out left-to-right. +static int draw_chip(int x, int y, const char *label) { + const int padX = 4; + const int chipH = 14; + int textW = pm_text_width(PM_TARGET_EINK, label, PM_STYLE_TINY); + int chipW = textW + padX * 2; + pm_eink_rect(x, y, x + chipW, y + chipH, false, true); + pm_text(PM_TARGET_EINK, x + padX, y + chipH - 4, label, PM_STYLE_TINY); + return x + chipW + 4; +} + void nowplaying_render() { pm_ui_begin_eink_screen(false); @@ -151,14 +135,13 @@ void nowplaying_render() { return; } - char hdr[32]; - if (g_playState == PlayerState::Playing) { - snprintf(hdr, sizeof(hdr), "Now Playing"); - } else if (g_playState == PlayerState::Paused) { - snprintf(hdr, sizeof(hdr), "Paused"); - } else { - snprintf(hdr, sizeof(hdr), "Stopped"); - } + const char *hdr; + if (g_playState == PlayerState::Playing) + hdr = "Now Playing"; + else if (g_playState == PlayerState::Paused) + hdr = "Paused"; + else + hdr = "Stopped"; draw_header(hdr); bool artDrawn = false; @@ -180,78 +163,86 @@ void nowplaying_render() { pm_text(PM_TARGET_EINK, kArtX + 32, kArtY + 64, "No Art", PM_STYLE_TINY); } - char buf[128]; - - truncate_text(g_nowTitle, buf, sizeof(buf)); - pm_text(PM_TARGET_EINK, kInfoX, kArtY + 18, buf, PM_STYLE_BODY); - - truncate_text(g_nowArtist, buf, sizeof(buf)); - if (buf[0]) { - pm_text(PM_TARGET_EINK, kInfoX, kArtY + 40, buf, PM_STYLE_BODY); - } - - truncate_text(g_nowAlbum, buf, sizeof(buf)); - if (buf[0]) { - pm_text(PM_TARGET_EINK, kInfoX, kArtY + 60, buf, PM_STYLE_BODY); + // Title wraps up to two lines inside the info column; drop the rest. The + // wrapper measures against e-ink metrics, which is the target here. + int y = kArtY + 14; + const int kTitleLineH = 18; + int lineCount = pm_layout_word_wrap_count(g_nowTitle, kInfoW, PM_STYLE_BODY); + int maxTitleLines = 2; + for (int i = 0; i < lineCount && i < maxTitleLines; i++) { + char line[128]; + int n = pm_layout_word_wrap_get(g_nowTitle, kInfoW, PM_STYLE_BODY, i, line, + sizeof(line)); + if (n < 0) + break; + // If the title is longer than two lines, mark the truncated second line. + if (i == maxTitleLines - 1 && lineCount > maxTitleLines) { + char tail[132]; + snprintf(tail, sizeof(tail), "%s...", line); + const char *trunc = pm_layout_truncate_with_ellipsis( + tail, kInfoW, PM_STYLE_BODY, PM_TARGET_EINK); + pm_text(PM_TARGET_EINK, kInfoX, y, trunc, PM_STYLE_BODY); + } else { + pm_text(PM_TARGET_EINK, kInfoX, y, line, PM_STYLE_BODY); + } + y += kTitleLineH; } - int statusY = kArtY + 82; - int col = kInfoX; - if (g_isFavorite) { - pm_text(PM_TARGET_EINK, col, statusY, "Fav", PM_STYLE_TINY); - col += 40; - } - switch (g_loopMode) { - case LoopMode::None: - break; - case LoopMode::One: - pm_text(PM_TARGET_EINK, col, statusY, "R1", PM_STYLE_TINY); - col += 35; - break; - case LoopMode::All: - pm_text(PM_TARGET_EINK, col, statusY, "RA", PM_STYLE_TINY); - col += 35; - break; + y += 4; + if (g_nowArtist[0]) { + const char *artist = pm_layout_truncate_with_ellipsis( + g_nowArtist, kInfoW, PM_STYLE_SMALL, PM_TARGET_EINK); + pm_text(PM_TARGET_EINK, kInfoX, y, artist, PM_STYLE_SMALL); + y += 16; } - if (g_shuffleEnabled) { - pm_text(PM_TARGET_EINK, col, statusY, "Sf", PM_STYLE_TINY); - col += 30; + if (g_nowAlbum[0]) { + const char *album = pm_layout_truncate_with_ellipsis( + g_nowAlbum, kInfoW, PM_STYLE_SMALL, PM_TARGET_EINK); + pm_text(PM_TARGET_EINK, kInfoX, y, album, PM_STYLE_SMALL); + y += 16; } - char volBuf[16]; - snprintf(volBuf, sizeof(volBuf), "V:%u", (g_volume * 100 + 127) / 255); - pm_text(PM_TARGET_EINK, col, statusY, volBuf, PM_STYLE_TINY); - - int playStatusY = statusY + 16; + // Transport glyph + label just under the metadata. + y += 6; + draw_transport_icon_eink(kInfoX, y - 10, 10, g_playState); const char *playStatus; - if (g_playState == PlayerState::Playing) { - playStatus = "> Playing"; - } else if (g_playState == PlayerState::Paused) { - playStatus = "|| Paused"; - } else { - playStatus = "[] Stopped"; - } - pm_text(PM_TARGET_EINK, kInfoX, playStatusY, playStatus, PM_STYLE_TINY); + if (g_playState == PlayerState::Playing) + playStatus = "Playing"; + else if (g_playState == PlayerState::Paused) + playStatus = "Paused"; + else + playStatus = "Stopped"; + pm_text(PM_TARGET_EINK, kInfoX + 16, y, playStatus, PM_STYLE_SMALL); + + // Bottom band: source label at the left, status chips, volume at the right. + int bandY = pm_eink_height() - 40; + pm_eink_rect(0, bandY - 6, pm_eink_width() - 1, bandY - 6, false, true); - int barY = kArtY + kArtSize + 14; - int barW = pm_eink_width() - 16; - pm_eink_rect(8, barY, 8 + barW - 1, barY + 7, false, true); - if (g_nowProgress > 0.0f && g_nowProgress <= 1.0f) { - int filled = (int)((barW - 2) * g_nowProgress); - if (filled > 0) - pm_eink_rect(9, barY + 1, 9 + filled - 1, barY + 6, true, true); + char volBuf[16]; + snprintf(volBuf, sizeof(volBuf), "Vol %d%%", (pm_audio_get_volume_level() * 100 + 127) / 255); + int volW = pm_text_width(PM_TARGET_EINK, volBuf, PM_STYLE_SMALL); + int volX = pm_eink_width() - 8 - volW; + const char *chips[] = {g_isFavorite ? "FAV" : nullptr, + g_loopMode == LoopMode::One ? "R1" : + g_loopMode == LoopMode::All ? "RA" : nullptr, + g_shuffleEnabled ? "SF" : nullptr, + player_sink_is_usb_active() ? "USB" : nullptr}; + int chipsWidth = 0; + for (const char *chip : chips) { + if (chip) + chipsWidth += pm_text_width(PM_TARGET_EINK, chip, PM_STYLE_TINY) + 12; } + int chipX = volX - 8 - chipsWidth; + const char *source = pm_layout_truncate_with_ellipsis( + source_label(), chipX - 16, PM_STYLE_SMALL, PM_TARGET_EINK); + pm_text(PM_TARGET_EINK, 8, bandY + 6, source, PM_STYLE_SMALL); + for (const char *chip : chips) { + if (chip) + chipX = draw_chip(chipX, bandY - 3, chip); + } + pm_text(PM_TARGET_EINK, volX, bandY + 6, volBuf, PM_STYLE_SMALL); - char timeBuf[32]; - char elapsedStr[16]; - char durationStr[16]; - uint32_t elapsed = static_cast(g_nowProgress * g_nowDuration); - format_time(elapsedStr, sizeof(elapsedStr), elapsed); - format_time(durationStr, sizeof(durationStr), g_nowDuration); - snprintf(timeBuf, sizeof(timeBuf), "%s / %s", elapsedStr, durationStr); - pm_text(PM_TARGET_EINK, 8, barY + 24, timeBuf, PM_STYLE_TINY); - - draw_footer("SPC:pause < >:skip /\\/:vol B:browser P:plist ?:help"); + draw_footer("SPC:pause L/R:skip U:output B:browser ?:help"); pm_eink_refresh(); } diff --git a/src/ui/ui_playlist.cpp b/src/ui/ui_playlist.cpp index a1a24b2d..eff59a58 100644 --- a/src/ui/ui_playlist.cpp +++ b/src/ui/ui_playlist.cpp @@ -1,6 +1,7 @@ #include "muse.h" #include "playlist.h" #include "ui_helpers.h" +#include "ui_player.h" #include "pm_app_api.h" @@ -18,7 +19,7 @@ void playlist_process_key(char ch) { int n = g_trackCount; switch (ch) { - case 19: // LEFT + case PM_KEY_LEFT: if (g_selIndex > 0) { g_selIndex--; if (g_selIndex < g_plScroll) @@ -26,7 +27,7 @@ void playlist_process_key(char ch) { g_needsRedraw = true; } break; - case 21: // RIGHT + case PM_KEY_RIGHT: if (g_selIndex < n - 1) { g_selIndex++; if (g_selIndex >= g_plScroll + kMaxVis) @@ -34,25 +35,17 @@ void playlist_process_key(char ch) { g_needsRedraw = true; } break; - case 32: - case 13: // Space or Enter + case PM_KEY_SPACE: + case PM_KEY_ENTER: if (n > 0 && g_selIndex < n) { player_play_index(g_selIndex); } break; case 'd': case 'D': - if (playlistMgr().source() == PlaySource::Playlist) { - int pi = playlistMgr().playlistIndex(); - int idx = g_selIndex; - if (idx < g_trackCount) { - playlistMgr().removeFromPlaylist(pi, idx); - g_trackCount = playlistMgr().entryCount(); - if (g_selIndex >= g_trackCount && g_selIndex > 0) - g_selIndex--; - g_needsRedraw = true; - } - } + player_remove_selected(); + if (g_selIndex < g_plScroll) + g_plScroll = g_selIndex; break; case 'b': case 'B': @@ -74,20 +67,13 @@ void playlist_process_key(char ch) { void playlist_render() { pm_ui_begin_eink_screen(false); - const char *srcName = ""; - if (playlistMgr().source() == PlaySource::Playlist) { - int pi = playlistMgr().playlistIndex(); - if (pi >= 0) - srcName = playlistMgr().playlistMeta(pi).name; - } - - char hdr[64]; - snprintf(hdr, sizeof(hdr), "Playlist: %s [%d]", srcName, g_trackCount); + char hdr[96]; + snprintf(hdr, sizeof(hdr), "%s [%d]", source_label(), g_trackCount); draw_header(hdr); int n = g_trackCount; if (n == 0) { - pm_text(PM_TARGET_EINK, 8, 80, "Playlist is empty", PM_STYLE_BODY); + draw_empty_source(); draw_footer("B:back ?:help"); pm_eink_refresh(); return; @@ -106,12 +92,14 @@ void playlist_render() { int w = pm_eink_width(); for (int i = g_plScroll; i < end; i++) { - char path[256]; + char path[256] = {}; char label[56]; - get_track_path(i, path, sizeof(path)); - get_display_name(path, label, sizeof(label)); + if (get_track_path(i, path, sizeof(path))) + get_display_name(path, label, sizeof(label)); + else + std::strcpy(label, "Unavailable track"); - char prefix[8]; + char prefix[16]; snprintf(prefix, sizeof(prefix), "%2d.", i + 1); char row[96]; snprintf(row, sizeof(row), "%s %s", prefix, label); @@ -127,8 +115,8 @@ void playlist_render() { } pm_text(PM_TARGET_EINK, 8, y, row, PM_STYLE_TINY); - if (i == g_nowTrackIndex && g_playState != PlayerState::Stopped) { - pm_text(PM_TARGET_EINK, w - 22, y, ">", PM_STYLE_TINY); + if (std::strcmp(path, g_nowPath) == 0 && g_playState != PlayerState::Stopped) { + draw_transport_icon_eink(w - 22, y - 7, 7, g_playState); } y += kItemH; diff --git a/src/ui_player.cpp b/src/ui_player.cpp index 069f97d6..8a3da791 100644 --- a/src/ui_player.cpp +++ b/src/ui_player.cpp @@ -1,11 +1,9 @@ #include "ui_player.h" -#include "albumart.h" -#include "id3parser.h" #include "library.h" -#include "metacache.h" #include "muse.h" #include "playlist.h" +#include "ui_helpers.h" #include "pm_app_api.h" @@ -16,6 +14,10 @@ int *g_shuffleIdx = nullptr; int g_shuffleIdxCount = 0; int g_shufflePos = 0; +namespace { +uint32_t s_playbackId = 0; +} + void build_shuffle() { int n = g_trackCount; if (n <= 0) { @@ -25,31 +27,36 @@ void build_shuffle() { g_shufflePos = 0; return; } - if (g_shuffleIdx && g_shuffleIdxCount == n) { - for (int i = n - 1; i > 0; i--) { - int j = - static_cast((static_cast(std::rand()) / RAND_MAX) * i); - int t = g_shuffleIdx[i]; - g_shuffleIdx[i] = g_shuffleIdx[j]; - g_shuffleIdx[j] = t; - } - } else { + if (!g_shuffleIdx || g_shuffleIdxCount != n) { std::free(g_shuffleIdx); g_shuffleIdx = static_cast(std::malloc(n * sizeof(int))); - g_shuffleIdxCount = n; - if (!g_shuffleIdx) + g_shuffleIdxCount = g_shuffleIdx ? n : 0; + if (!g_shuffleIdx) { + g_shuffleEnabled = false; + pm_oled_sysmsg("Not enough memory for shuffle", 800); return; - for (int i = 0; i < n; i++) - g_shuffleIdx[i] = i; - for (int i = n - 1; i > 0; i--) { - int j = - static_cast((static_cast(std::rand()) / RAND_MAX) * i); - int t = g_shuffleIdx[i]; - g_shuffleIdx[i] = g_shuffleIdx[j]; - g_shuffleIdx[j] = t; } } - g_shufflePos = 0; + for (int i = 0; i < n; ++i) + g_shuffleIdx[i] = i; + for (int i = n - 1; i > 0; --i) { + int j = static_cast((static_cast(std::rand()) / + (static_cast(RAND_MAX) + 1.0)) * (i + 1)); + int value = g_shuffleIdx[i]; + g_shuffleIdx[i] = g_shuffleIdx[j]; + g_shuffleIdx[j] = value; + } + g_shufflePos = -1; + if (g_nowTrackIndex >= 0 && g_nowTrackIndex < n) { + for (int i = 0; i < n; ++i) { + if (g_shuffleIdx[i] == g_nowTrackIndex) { + g_shuffleIdx[i] = g_shuffleIdx[0]; + g_shuffleIdx[0] = g_nowTrackIndex; + g_shufflePos = 0; + break; + } + } + } } bool get_track_path(int index, char *buf, size_t bufSize) { @@ -74,67 +81,6 @@ bool get_track_path(int index, char *buf, size_t bufSize) { return buf[0] != '\0'; } -uint32_t compute_duration(const char *path) { - if (!path || !path[0]) - return 0; - - size_t fsize = pm_sd_get_file_size(path); - if (fsize < 128) - return 0; - - char hdr_buf[128]; - if (!pm_sd_read_binary_file(path, reinterpret_cast(hdr_buf), 128)) - return 0; - - const uint8_t *hdr = reinterpret_cast(hdr_buf); - - for (size_t pos = 0; pos + 4 <= 128; pos++) { - if (hdr[pos] != 0xFF) - continue; - if ((hdr[pos + 1] & 0xE0) != 0xE0) - continue; - - uint8_t b2 = hdr[pos + 1]; - uint8_t b3 = hdr[pos + 2]; - - int version = (b2 >> 3) & 3; - int layer = (b2 >> 1) & 3; - int bitrateIdx = b3 >> 4; - - if (version == 1 || layer == 0 || bitrateIdx == 0 || bitrateIdx == 15) - continue; - - static const int bitrate_mp3[15] = {0, 32, 40, 48, 56, 64, 80, 96, - 112, 128, 160, 192, 224, 256, 320}; - - int bitrate = 0; - if (version == 3 && layer == 1) { - bitrate = bitrate_mp3[bitrateIdx]; - } else if (version == 3 && layer == 2) { - static const int table_l2[15] = {0, 32, 48, 56, 64, 80, 96, 112, - 128, 160, 192, 224, 256, 320, 384}; - bitrate = table_l2[bitrateIdx]; - } else if (version == 3 && layer == 3) { - static const int table_l1[15] = {0, 32, 64, 96, 128, 160, 192, 224, - 256, 288, 320, 352, 384, 416, 448}; - bitrate = table_l1[bitrateIdx]; - } else if (version == 2 || version == 0) { - static const int table_v2_l3[15] = {0, 8, 16, 24, 32, 40, 48, 56, - 64, 80, 96, 112, 128, 144, 160}; - bitrate = table_v2_l3[bitrateIdx]; - } - - if (bitrate > 0) { - uint64_t bits = static_cast(fsize) * 8; - return static_cast(bits / - (static_cast(bitrate) * 1000)); - } - break; - } - - return 0; -} - void player_play_index(int index) { char path[256]; if (!get_track_path(index, path, sizeof(path)) || !path[0]) @@ -153,39 +99,47 @@ void player_play_index(int index) { g_nowPath[sizeof(g_nowPath) - 1] = '\0'; g_nowTrackIndex = index; - g_nowDuration = compute_duration(path); + if (g_shuffleEnabled && g_shuffleIdx) { + for (int i = 0; i < g_shuffleIdxCount; ++i) { + if (g_shuffleIdx[i] == index) { + g_shufflePos = i; + break; + } + } + } g_nowProgress = 0.0f; - g_nowFileSize = pm_sd_get_file_size(path); + g_nowElapsed = 0; g_isFavorite = playlistMgr().isFavorite(path); g_playState = PlayerState::Playing; - Id3Tag tag; - if (tag.parse(path)) { - if (tag.title()[0]) - std::strncpy(g_nowTitle, tag.title(), sizeof(g_nowTitle) - 1); - if (tag.artist()[0]) - std::strncpy(g_nowArtist, tag.artist(), sizeof(g_nowArtist) - 1); - if (tag.album()[0]) - std::strncpy(g_nowAlbum, tag.album(), sizeof(g_nowAlbum) - 1); + pm_media_info info{}; + if (pm_media_probe(path, &info)) { + if (info.title[0]) + std::strncpy(g_nowTitle, info.title, sizeof(g_nowTitle) - 1); + std::strncpy(g_nowArtist, info.artist, sizeof(g_nowArtist) - 1); + std::strncpy(g_nowAlbum, info.album, sizeof(g_nowAlbum) - 1); g_nowTitle[sizeof(g_nowTitle) - 1] = '\0'; g_nowArtist[sizeof(g_nowArtist) - 1] = '\0'; g_nowAlbum[sizeof(g_nowAlbum) - 1] = '\0'; - if (tag.durationMs() > 0) - g_nowDuration = tag.durationMs() / 1000; - } else { - get_display_name(path, g_nowTitle, sizeof(g_nowTitle)); + const uint64_t seconds = info.durationMs / 1000; + g_nowDuration = static_cast(seconds > UINT32_MAX ? UINT32_MAX : seconds); } - nowplaying_cache_art(path); + nowplaying_cache_art(path, info); - pm_audio_play(path); + music_play(path); g_needsRedraw = true; g_appMode = MODE_NOWPLAYING; } void player_next_track() { - int n = g_trackCount > 0 ? g_trackCount : 1; + int n = g_trackCount; + if (n <= 0) { + music_stop(); + g_needsRedraw = true; + return; + } int next; if (g_shuffleEnabled) { @@ -193,8 +147,13 @@ void player_next_track() { build_shuffle(); g_shufflePos++; if (g_shufflePos >= n) { + if (g_loopMode != LoopMode::All) { + music_stop(); + g_needsRedraw = true; + return; + } build_shuffle(); - g_shufflePos = 0; + g_shufflePos = n > 1 ? 1 : 0; } next = g_shuffleIdx ? g_shuffleIdx[g_shufflePos] : 0; } else { @@ -213,8 +172,27 @@ void player_next_track() { } } -void player_prev_track() { +void player_advance_auto() { + // Called when the current track ends on its own. Repeat-one replays the + // same track; everything else defers to the manual next-track rules + // (shuffle, repeat-all, stop-at-end). int n = g_trackCount > 0 ? g_trackCount : 1; + if (g_loopMode == LoopMode::One && g_nowTrackIndex >= 0 && + g_nowTrackIndex < n) { + char path[256]; + if (get_track_path(g_nowTrackIndex, path, sizeof(path)) && + std::strcmp(path, g_nowPath) == 0) { + player_play_index(g_nowTrackIndex); + return; + } + } + player_next_track(); +} + +void player_prev_track() { + int n = g_trackCount; + if (n <= 0) + return; int prev; if (g_shuffleEnabled) { @@ -222,7 +200,7 @@ void player_prev_track() { build_shuffle(); g_shufflePos--; if (g_shufflePos < 0) - g_shufflePos = n - 1; + g_shufflePos = g_loopMode == LoopMode::All ? n - 1 : 0; prev = g_shuffleIdx ? g_shuffleIdx[g_shufflePos] : 0; } else { prev = g_nowTrackIndex - 1; @@ -238,18 +216,17 @@ void player_prev_track() { void player_cycle_source() { PlaySource cur = playlistMgr().source(); + bool loaded = true; switch (cur) { case PlaySource::Library: - if (playlistMgr().playFavorites()) - break; - playlistMgr().playLibrary(); + loaded = playlistMgr().playFavorites(); break; case PlaySource::Favorites: { int plCount = playlistMgr().playlistCount(); if (plCount > 0) { - playlistMgr().playPlaylist(0); + loaded = playlistMgr().playPlaylist(0); } else { playlistMgr().playLibrary(); } @@ -258,7 +235,7 @@ void player_cycle_source() { case PlaySource::Playlist: { int next = playlistMgr().playlistIndex() + 1; if (next < playlistMgr().playlistCount()) { - playlistMgr().playPlaylist(next); + loaded = playlistMgr().playPlaylist(next); } else { playlistMgr().playLibrary(); } @@ -266,29 +243,159 @@ void player_cycle_source() { } } + if (!loaded) + pm_oled_sysmsg("Cannot read tracks from SD", 1000); + g_selIndex = 0; g_trackCount = (playlistMgr().source() == PlaySource::Library) ? library().count() : playlistMgr().entryCount(); - if (g_trackCount <= 0) - g_trackCount = library().count(); + g_nowTrackIndex = -1; + for (int i = 0; i < g_trackCount; ++i) { + char path[256]; + if (get_track_path(i, path, sizeof(path)) && std::strcmp(path, g_nowPath) == 0) { + g_nowTrackIndex = i; + break; + } + } + if (g_shuffleEnabled) + build_shuffle(); g_needsRedraw = true; } void player_toggle_favorite() { - if (g_nowPath[0]) { - g_isFavorite = playlistMgr().toggleFavorite(g_nowPath); - g_needsRedraw = true; + player_toggle_favorite_path(g_nowPath); +} + +static void refresh_source_after_edit(int previousIndex) { + const int previousCount = g_trackCount; + g_trackCount = playlistMgr().source() == PlaySource::Library + ? library().count() : playlistMgr().entryCount(); + g_selIndex = g_trackCount > 0 && g_selIndex >= g_trackCount + ? g_trackCount - 1 : g_selIndex; + if (g_trackCount == 0) + g_selIndex = 0; + g_nowTrackIndex = previousIndex > 0 ? previousIndex - 1 : -1; + for (int i = 0; i < g_trackCount; ++i) { + char path[256]; + if (get_track_path(i, path, sizeof(path)) && std::strcmp(path, g_nowPath) == 0) { + g_nowTrackIndex = i; + break; + } + } + g_isFavorite = g_nowPath[0] && playlistMgr().isFavorite(g_nowPath); + if (g_shuffleEnabled && g_trackCount != previousCount) + build_shuffle(); + g_needsRedraw = true; +} + +void player_toggle_favorite_path(const char *path) { + if (!path || !path[0]) + return; + bool before = playlistMgr().isFavorite(path); + bool after = playlistMgr().toggleFavorite(path); + if (before == after) + pm_oled_sysmsg("Favorites update failed", 1000); + refresh_source_after_edit(g_nowTrackIndex); +} + +void player_remove_selected() { + if (g_selIndex < 0 || g_selIndex >= g_trackCount) + return; + PlaySource source = playlistMgr().source(); + if (source == PlaySource::Library) + return; + int previousIndex = g_nowTrackIndex; + bool removed = false; + if (source == PlaySource::Playlist) { + removed = playlistMgr().removeFromPlaylist(playlistMgr().playlistIndex(), g_selIndex); + } else { + char path[256]; + if (get_track_path(g_selIndex, path, sizeof(path)) && playlistMgr().isFavorite(path)) + removed = !playlistMgr().toggleFavorite(path); } + if (!removed) + pm_oled_sysmsg("Could not remove track", 1000); + refresh_source_after_edit(previousIndex); +} + +void player_cycle_loop_mode() { + switch (g_loopMode) { + case LoopMode::None: + g_loopMode = LoopMode::One; + break; + case LoopMode::One: + g_loopMode = LoopMode::All; + break; + case LoopMode::All: + g_loopMode = LoopMode::None; + break; + } + g_needsRedraw = true; +} + +void player_toggle_shuffle() { + g_shuffleEnabled = !g_shuffleEnabled; + if (g_shuffleEnabled) + build_shuffle(); + g_needsRedraw = true; } void music_stop() { + s_playbackId = 0; pm_audio_stop_playback(); g_playState = PlayerState::Stopped; g_nowProgress = 0.0f; + g_nowElapsed = 0; } -void music_play(const char *path) { pm_audio_play(path); } +void music_play(const char *path) { + uint32_t previous = pm_audio_get_playback_id(); + pm_audio_play(path); + uint32_t requested = pm_audio_get_playback_id(); + s_playbackId = requested != previous ? requested : 0; + if (!s_playbackId) { + g_playState = PlayerState::Stopped; + pm_oled_sysmsg("Unable to start audio", 1000); + } +} + +void player_poll() { + if (!s_playbackId) + return; + int result = pm_audio_get_playback_result(s_playbackId); + if (result != PM_AUDIO_RESULT_PENDING) { + s_playbackId = 0; + if (result == PM_AUDIO_RESULT_ENDED) { + player_advance_auto(); + } else { + g_playState = PlayerState::Stopped; + if (result == PM_AUDIO_RESULT_FAILED) + pm_oled_sysmsg(pm_audio_get_last_error(), 1200); + g_needsRedraw = true; + } + return; + } + + int state = pm_audio_get_state(); + PlayerState next = state == PM_AUDIO_STATE_PAUSED ? PlayerState::Paused + : PlayerState::Playing; + if (next != g_playState) { + g_playState = next; + g_needsRedraw = true; + } + if (state == PM_AUDIO_STATE_PLAYING) { + const uint64_t milliseconds = pm_audio_get_position_ms(); + g_nowElapsed = static_cast(milliseconds / 1000 > UINT32_MAX + ? UINT32_MAX : milliseconds / 1000); + g_nowProgress = g_nowDuration > 0 + ? static_cast(milliseconds) / + (static_cast(g_nowDuration) * 1000.0f) + : 0.0f; + if (g_nowProgress > 1.0f) + g_nowProgress = 1.0f; + } +} void music_pause() { pm_audio_pause(); @@ -299,3 +406,65 @@ void music_resume() { pm_audio_resume(); g_playState = PlayerState::Playing; } + +namespace { + +// Volume keys and the scroll gesture both step by this amount. +constexpr uint8_t kVolumeStep = 10; + +void save_audio_settings() { + if (!pm_audio_save_settings()) + pm_oled_sysmsg(pm_audio_get_last_error(), 1000); +} + +} // namespace + +bool player_volume_up() { + const uint8_t volume = pm_audio_get_volume_level(); + if (volume == 255) + return false; + pm_audio_set_volume_level(volume > 255 - kVolumeStep ? 255 : volume + kVolumeStep); + save_audio_settings(); + return true; +} + +bool player_volume_down() { + const uint8_t volume = pm_audio_get_volume_level(); + if (volume == 0) + return false; + pm_audio_set_volume_level(volume < kVolumeStep ? 0 : volume - kVolumeStep); + save_audio_settings(); + return true; +} + +bool player_sink_is_usb_active() { + return pm_audio_get_active_output() == PM_AUDIO_OUTPUT_USB; +} + +void player_cycle_sink() { + switch (pm_audio_get_output()) { + case PM_AUDIO_OUTPUT_AUTO: + pm_audio_set_output(PM_AUDIO_OUTPUT_PIEZO); + break; + case PM_AUDIO_OUTPUT_PIEZO: + pm_audio_set_output(PM_AUDIO_OUTPUT_USB); + break; + default: + pm_audio_set_output(PM_AUDIO_OUTPUT_AUTO); + break; + } + save_audio_settings(); + g_needsRedraw = true; +} + +const char *sink_label() { + switch (pm_audio_get_output()) { + case PM_AUDIO_OUTPUT_AUTO: + return player_sink_is_usb_active() ? "Auto(USB)" : "Auto(Pz)"; + case PM_AUDIO_OUTPUT_PIEZO: + return "Piezo"; + case PM_AUDIO_OUTPUT_USB: + return player_sink_is_usb_active() ? "USB" : "USB(Pz)"; + } + return "Auto"; +} diff --git a/tests/run.py b/tests/run.py new file mode 100644 index 00000000..dcf633db --- /dev/null +++ b/tests/run.py @@ -0,0 +1,34 @@ +"""Build and run regression tests against the SDK headers without hardware.""" + +import os +from pathlib import Path +import subprocess +import tempfile + + +def main(): + root = Path(__file__).resolve().parents[1] + sdk = Path(os.environ.get( + "SDK_ROOT", root.parent / "PocketMage_PDA/Code/PocketMageOS/lib/PocketMage_SDK" + )).resolve() + shared = ["tests/support/fake_sd.cpp", "src/playlist.cpp"] + tests = { + "playlist": ["tests/unit/playlist_test.cpp", *shared], + "player": ["tests/unit/player_test.cpp", *shared, "src/ui_player.cpp", + "src/muse.cpp", "src/library.cpp"], + "audio-playback": [str(sdk / "tools/pm/tests/native/audio_playback_test.cpp")], + "idle-timer": [str(sdk / "tools/pm/tests/native/idle_timer_test.cpp")], + } + with tempfile.TemporaryDirectory(prefix="pocketmuse-tests-") as build: + for name, sources in tests.items(): + binary = str(Path(build) / name) + subprocess.run([ + os.environ.get("CXX", "c++"), "-std=c++17", "-Wall", "-Wextra", "-Werror", + "-fsanitize=address,undefined", "-Iinclude", "-Itests/support", + "-idirafter", str(sdk), *sources, "-o", binary, + ], cwd=root, check=True) + subprocess.run([binary], check=True) + + +if __name__ == "__main__": + main() diff --git a/tests/support/fake_sd.cpp b/tests/support/fake_sd.cpp new file mode 100644 index 00000000..79014efe --- /dev/null +++ b/tests/support/fake_sd.cpp @@ -0,0 +1,46 @@ +#include "fake_sd.h" +#include "pm_app_api.h" + +#include + +std::map files; +bool failWrite = false; +bool failRead = false; + +extern "C" { +size_t pm_sd_get_file_size(const char *path) { return files[path].size(); } +bool pm_sd_read_binary_file(const char *path, uint8_t *out, size_t size) { + if (failRead) + return false; + const auto &data = files[path]; + if (size > data.size()) + return false; + std::memcpy(out, data.data(), size); + return true; +} +bool pm_sd_write_binary_file(const char *path, const uint8_t *data, size_t size) { + if (failWrite) + return false; + files[path].assign(reinterpret_cast(data), size); + return true; +} +bool pm_sd_append_binary_file(const char *path, const uint8_t *data, size_t size) { + if (failWrite) + return false; + files[path].append(reinterpret_cast(data), size); + return true; +} +void pm_sd_write_file(const char *path, const char *data) { files[path] = data; } +void pm_sd_append_file(const char *path, const char *data) { files[path] += data; } +void pm_sd_delete_file(const char *path) { files.erase(path); } +bool pm_sd_mkdir(const char *) { return true; } +int pm_sd_dir_open(const char *) { return 1; } +bool pm_sd_dir_entry(int index, char *name, size_t size, bool *isDir) { + if (index != 0 || size < sizeof("Road.m3u")) + return false; + std::strcpy(name, "Road.m3u"); + *isDir = false; + return true; +} +void pm_sd_dir_close() {} +} diff --git a/tests/support/fake_sd.h b/tests/support/fake_sd.h new file mode 100644 index 00000000..da66c436 --- /dev/null +++ b/tests/support/fake_sd.h @@ -0,0 +1,11 @@ +#pragma once + +#include +#include + +/** In-memory SD files and failure injection, reset by each test executable. */ +extern std::map files; +/** Fail writes without changing the stored file. */ +extern bool failWrite; +/** Fail reads without returning partial file contents. */ +extern bool failRead; diff --git a/tests/unit/player_test.cpp b/tests/unit/player_test.cpp new file mode 100644 index 00000000..619b5b02 --- /dev/null +++ b/tests/unit/player_test.cpp @@ -0,0 +1,246 @@ +#include "fake_sd.h" +#include "muse.h" +#include "paths.h" +#include "pm_app_api.h" +#include "ui_player.h" + +#include +#include +#include +#include +#include + +namespace { +uint32_t request = 0; +int result = PM_AUDIO_RESULT_PENDING; +int state = PM_AUDIO_STATE_IDLE; +int playCalls = 0; +bool connected = false; +int output = PM_AUDIO_OUTPUT_PIEZO; +uint8_t volume = 160; +uint64_t positionMs = 0; +bool savedSettings = false; +bool metadataAvailable = true; +uint32_t cachedCoverOffset = 0; +} + +extern "C" { +void pm_audio_play(const char *) { + ++request; + ++playCalls; + result = PM_AUDIO_RESULT_PENDING; +} +void pm_audio_stop_playback() { state = PM_AUDIO_STATE_IDLE; } +void pm_audio_pause() { state = PM_AUDIO_STATE_PAUSED; } +void pm_audio_resume() { state = PM_AUDIO_STATE_PLAYING; } +void pm_audio_set_volume(int8_t) {} +void pm_audio_set_volume_level(uint8_t value) { volume = value; } +uint8_t pm_audio_get_volume_level() { return volume; } +bool pm_audio_save_settings() { savedSettings = true; return true; } +int pm_audio_get_output() { return output; } +uint64_t pm_audio_get_position_ms() { return positionMs; } +uint32_t pm_audio_get_playback_id() { return request; } +int pm_audio_get_playback_result(uint32_t id) { + assert(id == request); + return result; +} +int pm_audio_get_state() { return state; } +uint32_t pm_audio_get_position() { return 0; } +const char *pm_audio_get_last_error() { return "decode failed"; } +void pm_oled_sysmsg(const char *, int) {} +bool pm_audio_usb_connected() { return connected; } +int pm_audio_get_active_output() { return output; } +void pm_audio_set_output(int value) { output = value; } +bool pm_media_probe(const char *, pm_media_info *out) { + if (!metadataAvailable) return false; + *out = {}; + std::strcpy(out->title, "Shared title"); + std::strcpy(out->artist, "Shared artist"); + std::strcpy(out->album, "Shared album"); + out->durationMs = 123456; + out->coverOffset = 34; + out->coverLength = 4; + out->coverFormat = PM_IMAGE_FORMAT_JPEG; + return true; +} +} + +// Rendering is outside playback control; keep the shared metadata handoff observable. +void nowplaying_cache_art(const char *, const pm_media_info &info) { + cachedCoverOffset = info.coverOffset; +} +void get_display_name(const char *path, char *out, size_t size) { + snprintf(out, size, "%s", path); +} + +static void favorite_edit_preserves_shuffle_cycle() { + files["/music/.muse/playlists/Road.m3u"] = + "/music/One.mp3\n/music/Two.mp3\n/music/Three.mp3\n"; + assert(playlistMgr().begin()); + assert(playlistMgr().playPlaylist(0)); + g_trackCount = 3; + g_loopMode = LoopMode::None; + player_play_index(0); + player_toggle_shuffle(); + const std::vector order(g_shuffleIdx, g_shuffleIdx + g_shuffleIdxCount); + std::set visited{g_nowTrackIndex}; + for (int i = 0; i < 2; ++i) { + result = PM_AUDIO_RESULT_ENDED; + player_poll(); + assert(visited.insert(g_nowTrackIndex).second); + const int position = g_shufflePos; + player_toggle_favorite(); + assert(g_shufflePos == position); + assert(std::vector(g_shuffleIdx, g_shuffleIdx + g_shuffleIdxCount) == order); + } + result = PM_AUDIO_RESULT_ENDED; + player_poll(); + assert(g_playState == PlayerState::Stopped); + player_toggle_shuffle(); +} + +static void edits_keep_absent_playing_track_at_not_found() { + files[paths::kFavorites] = "/music/One.mp3\n"; + assert(playlistMgr().playPlaylist(0)); + g_trackCount = 3; + player_play_index(2); + player_cycle_source(); // Library + player_cycle_source(); // Favorites, without the playing track + assert(g_nowTrackIndex == -1 && g_trackCount == 1); + player_toggle_favorite_path("/music/Two.mp3"); + assert(g_nowTrackIndex == -1 && g_trackCount == 2); + g_selIndex = 1; + player_remove_selected(); + assert(g_nowTrackIndex == -1 && g_trackCount == 1); + result = PM_AUDIO_RESULT_ENDED; + player_poll(); + assert(g_nowTrackIndex == 0); + assert(std::strcmp(g_nowPath, "/music/One.mp3") == 0); +} + +int main() { + files[paths::kFavorites] = "/music/One.mp3\n/music/Two.mp3\n/music/Three.mp3\n"; + assert(playlistMgr().playFavorites()); + g_trackCount = 3; + player_play_index(0); + assert(std::strcmp(g_nowTitle, "Shared title") == 0); + assert(std::strcmp(g_nowArtist, "Shared artist") == 0); + assert(std::strcmp(g_nowAlbum, "Shared album") == 0); + assert(g_nowDuration == 123 && cachedCoverOffset == 34); + metadataAvailable = false; + player_play_index(0); + assert(std::strcmp(g_nowTitle, "/music/One.mp3") == 0); + assert(!g_nowArtist[0] && !g_nowAlbum[0] && g_nowDuration == 0 && cachedCoverOffset == 0); + playCalls = 1; + metadataAvailable = true; + assert(g_nowTrackIndex == 0); + player_poll(); // The decoder has not yet observed the queued play request. + assert(playCalls == 1); + assert(g_playState == PlayerState::Playing); + g_nowDuration = 100; + positionMs = 25000; + state = PM_AUDIO_STATE_PLAYING; + player_poll(); + assert(g_nowProgress == 0.25f); + + state = PM_AUDIO_STATE_PAUSED; + player_poll(); + assert(g_playState == PlayerState::Paused); + assert(playCalls == 1); + state = PM_AUDIO_STATE_STOPPING; + player_poll(); + assert(playCalls == 1); + + result = PM_AUDIO_RESULT_ENDED; + state = PM_AUDIO_STATE_IDLE; + player_poll(); + assert(g_nowTrackIndex == 1); + assert(playCalls == 2); + player_poll(); + assert(playCalls == 2); + music_stop(); + result = PM_AUDIO_RESULT_ENDED; + player_poll(); + assert(playCalls == 2); + + g_loopMode = LoopMode::One; + player_play_index(0); + result = PM_AUDIO_RESULT_ENDED; + player_poll(); + assert(g_nowTrackIndex == 0); + player_next_track(); // Manual next must ignore repeat-one. + assert(g_nowTrackIndex == 1); + result = PM_AUDIO_RESULT_FAILED; + int before = playCalls; + player_poll(); + assert(g_playState == PlayerState::Stopped); + assert(playCalls == before); + + g_loopMode = LoopMode::None; + player_play_index(2); + result = PM_AUDIO_RESULT_ENDED; + player_poll(); + assert(g_playState == PlayerState::Stopped); + g_loopMode = LoopMode::All; + player_play_index(2); + result = PM_AUDIO_RESULT_ENDED; + player_poll(); + assert(g_nowTrackIndex == 0); + + // Shuffle visits the remaining entries once and stops without repeat-all. + g_loopMode = LoopMode::None; + player_toggle_shuffle(); + std::set visited{g_nowTrackIndex}; + for (int i = 0; i < 2; ++i) { + result = PM_AUDIO_RESULT_ENDED; + player_poll(); + assert(visited.insert(g_nowTrackIndex).second); + } + result = PM_AUDIO_RESULT_ENDED; + player_poll(); + assert(g_playState == PlayerState::Stopped); + player_toggle_shuffle(); + + player_play_index(1); + g_selIndex = 1; + player_remove_selected(); + assert(g_trackCount == 2); + assert(!g_isFavorite); + result = PM_AUDIO_RESULT_ENDED; + player_poll(); + assert(std::strcmp(g_nowPath, "/music/Three.mp3") == 0); + + // Source cycling visits empty Favorites and playlists without stale selections. + assert(playlistMgr().begin()); + assert(playlistMgr().playLibrary()); + files[paths::kFavorites].clear(); + files["/music/.muse/playlists/Road.m3u"] = "#EXTM3U\n"; + g_selIndex = 9; + player_cycle_source(); + assert(playlistMgr().source() == PlaySource::Favorites); + assert(g_trackCount == 0); + assert(g_selIndex == 0); + player_cycle_source(); + assert(playlistMgr().source() == PlaySource::Playlist); + assert(g_trackCount == 0); + player_cycle_source(); + assert(playlistMgr().source() == PlaySource::Library); + + output = PM_AUDIO_OUTPUT_AUTO; + player_cycle_sink(); + assert(output == PM_AUDIO_OUTPUT_PIEZO); + assert(savedSettings); + player_cycle_sink(); + assert(output == PM_AUDIO_OUTPUT_USB); + player_cycle_sink(); + assert(output == PM_AUDIO_OUTPUT_AUTO); + volume = 250; + assert(player_volume_up() && volume == 255); + assert(!player_volume_up()); + volume = 5; + assert(player_volume_down() && volume == 0); + assert(!player_volume_down()); + favorite_edit_preserves_shuffle_cycle(); + edits_keep_absent_playing_track_at_not_found(); + std::puts("player tests passed"); +} diff --git a/tests/unit/playlist_test.cpp b/tests/unit/playlist_test.cpp new file mode 100644 index 00000000..e3a3556f --- /dev/null +++ b/tests/unit/playlist_test.cpp @@ -0,0 +1,94 @@ +#include "paths.h" +#include "playlist.h" +#include "pm_app_api.h" +#include "fake_sd.h" + +#include +#include +#include +#include +#include + +namespace { +constexpr const char *kPlaylist = "/music/.muse/playlists/Road.m3u"; + +void expectEntry(const PlaylistCursor &cursor, int index, const char *expected) { + char path[256]; + assert(cursor.getEntry(index, path, sizeof(path))); + assert(std::strcmp(path, expected) == 0); +} +} + +int main() { + PlaylistManager manager; + assert(manager.begin()); + + files[paths::kFavorites] = "\r\n \t\n# favorites\r\n/music/One.mp3\r\n/music/Two.mp3"; + assert(manager.favoriteCount() == 2); + assert(manager.playFavorites()); + expectEntry(manager.cursor(), 0, "/music/One.mp3"); + expectEntry(manager.cursor(), 1, "/music/Two.mp3"); + assert(manager.isFavorite("/music/One.mp3")); + assert(!manager.toggleFavorite("/music/One.mp3")); + assert(manager.entryCount() == 1); + expectEntry(manager.cursor(), 0, "/music/Two.mp3"); + + // Removing by visible index must not count the M3U header or blank lines. + files[kPlaylist] = "#EXTM3U\n\n/music/One.mp3\r\n#EXTINF:2,Two\n/music/Two.mp3"; + assert(manager.playPlaylist(0)); + assert(manager.removeFromPlaylist(0, 0)); + assert(manager.entryCount() == 1); + expectEntry(manager.cursor(), 0, "/music/Two.mp3"); + assert(files[kPlaylist].find('\0') == std::string::npos); + + // A failed write leaves both membership and the visible cursor unchanged. + files[paths::kFavorites] = "/music/One.mp3\n"; + assert(manager.playFavorites()); + failWrite = true; + assert(manager.toggleFavorite("/music/One.mp3")); + assert(manager.isFavorite("/music/One.mp3")); + assert(!manager.toggleFavorite("/music/Two.mp3")); + assert(manager.entryCount() == 1); + failWrite = false; + + // Appending after a missing final newline must keep the entries separate. + files[paths::kFavorites] = "/music/One.mp3"; + assert(manager.toggleFavorite("/music/Two.mp3")); + assert(manager.favoriteCount() == 2); + assert(!manager.toggleFavorite("/music/One.mp3")); + assert(!manager.toggleFavorite("/music/Two.mp3")); + assert(manager.entryCount() == 0); + assert(manager.source() == PlaySource::Favorites); + + // Rewriting must preserve every entry in playlists larger than 4 KiB. + files[kPlaylist] = "#EXTM3U\n/music/Remove.mp3\n"; + for (int i = 0; i < 400; ++i) + files[kPlaylist] += "/music/Track" + std::to_string(i) + ".mp3\n"; + assert(manager.playPlaylist(0)); + assert(manager.removeFromPlaylist(0, 0)); + assert(manager.entryCount() == 400); + expectEntry(manager.cursor(), 399, "/music/Track399.mp3"); + + char path[8] = "stale"; + assert(!manager.cursor().getEntry(0, path, sizeof(path))); + assert(path[0] == '\0'); + + // Empty and unreadable playlists must remain discoverable for later retries. + files[kPlaylist] = "#EXTM3U\n"; + assert(manager.playPlaylist(0)); + assert(manager.entryCount() == 0); + assert(manager.playlistCount() == 1); + files[kPlaylist] = "/music/One.mp3\n"; + failRead = true; + assert(!manager.playPlaylist(0)); + assert(manager.playlistCount() == 1); + failRead = false; + assert(manager.playPlaylist(0)); + expectEntry(manager.cursor(), 0, "/music/One.mp3"); + + files[paths::kFavorites].clear(); + assert(manager.playFavorites()); + assert(manager.source() == PlaySource::Favorites); + assert(manager.entryCount() == 0); + std::puts("playlist tests passed"); +}