From 21655a9260f9740dfe69336e9004c5769c1f0287 Mon Sep 17 00:00:00 2001 From: Philippe Bonnaz Date: Thu, 30 Nov 2023 13:46:30 +0100 Subject: [PATCH] Add support for API LEVEL 14 - new cxlib binary - new fonts binary + suuport for new font struct format - RLE compression fix --- speculos/cxlib/stax-api-level-cx-14.elf | Bin 0 -> 65448 bytes speculos/fonts/stax-fonts-14.bin | Bin 0 -> 40960 bytes src/bolos/cx_hmac.c | 3 +-- src/bolos/fonts_info.c | 30 +++++++++++++++++++++++- src/bolos/nbgl.c | 19 ++++++++++----- src/emulate.c | 1 + src/fonts.h | 28 +++++++++++++++++++++- src/launcher.c | 11 ++++++--- src/sdk.h | 1 + 9 files changed, 80 insertions(+), 13 deletions(-) create mode 100644 speculos/cxlib/stax-api-level-cx-14.elf create mode 100644 speculos/fonts/stax-fonts-14.bin diff --git a/speculos/cxlib/stax-api-level-cx-14.elf b/speculos/cxlib/stax-api-level-cx-14.elf new file mode 100644 index 0000000000000000000000000000000000000000..ffad0c768bd15d0977a1401457f53c7cf5fd16be GIT binary patch literal 65448 zcmeFad3aOR)<3?_kfBM3bO1^LNg9T>VQ498u^?%ho|Z`_2N1nR5Df*iqFyWN+k`=J z;NH?Yw23InRVjrIa;wIQML^|x9TEmDBG)QHXzOqSg$6q0``IU_$i2V!ect!a-yh+5 zc5~Jq)?RzORKSV9 zPI9!5NI@aRG2!&t0A`~Q4fG#RP?G**q`#3r5e`H+5aB?C0}&2HI1u4LgaZ){L^u%P zK!gJk4n#N*;Xs4~5e`H+5aB?C0}&2HI1u4LgaZ){L^u%PK!gJk4n#N*;Xs4~5e`H+ z5aB?C0}&2HI1u4LgaZ){L^u%PK!gJk4n#N*;Xs4~5e`H+5aB?C0}&2HI1u4LgaZ){ zL^u%PK!gJk4n#N*;Xs4~5e`H+5aB?C0}&2HI1u4LgaZ){L^u%PK!gJk4n#N*;Xs4~ z5e`H+5aB?C0}&2HI1u4LgaZ){L^u%PK!gJk4n#N*;Xs4~5e`H+5aB?C0}&2HI1u4L zgaZ){L^u%PK!gJk4n#N*;Xs4~5e`H+5aB?C0}&2HI1u4LgaZ){L^u%PK!gJk4*dU# z0}jH@h+6c#z

d)H$4_a-EYrfDp6EN#1+fNuEP^?HpLddL5jG;vGYC=m9)WOMxs%NKtCKkK zoweCXe#LJ!!jt&^5Ild(azB5?==z-glBFkCP}qaFVTiog{mkle~?fMSRwNwC!Wifp7w$ z2jP0eMR`HfH%>AQbeRAjLwFM5zJqAT0VkRM3EGMfgYY`S5Cj9luLvfD+mLVZx4`k4 zlWhJJcn}VJjyQx7|8$ba|AD#=Imv3I-vanF;Ku>?(R`@08gafaoMijgs2jiO_`L-* zeR2fl4?Bqpzjp&>j-m~ePW*m+%t`j10PP4vQTGUhC%9Hoo8_rw|f_lBO78RH{-ShGan{?(KUspks9zv8~Lg7tFlKOdcgV9-i8m zA!G^WAiqQ!;Oy&!WYZ>LurS@LH<`UUQ=V_G$Y>37(gY&ZJz|^Z6o3r$l>+O6VzR&9#n~amw2JdLv!UYM9l2t1)C?% zeS^SO#=5fvrZUD2td-GjBL1}>m<_5Tl^EZr7x;#~XT{BPMOM4tKUd_mEq=6?Kj$a2 ziGF00>J?JKy`X&M%XVfmF{TKi?$<+ngKjSY-=Z@Ug3L4~`@}nmC0frqOSiA2u%wBM zdc{I~C3|D;9DL^^X2mVcJTTw|k@e9tBf4go8 zVZ~cmqj(FKnE$$k1exi6U*=vy#3qFhC+PLWu(^Tqz838yY56|ALA66Aejq_peNzPW zj!^eMLpr10px&uKiU%o<<}4|`MUGb@emCOv&GE>WG?N4TCg3&?4>*1%4|pr!ZJv|u z3Ip#}Rgp^0tr9Pw|K@pgsj4bA(eRlCA|>SAnqkCvww4vI}sjE zB?guFmk+f{;M)F=#o~| zL#q?*8|iX-r9GcH2&2p`bIRwdjmDAT<**5bB;7nj|bnzMDhI&5ZklPEIq@+Ufh` zeBpw&rJdwZkS800Ir>k|&zZPxg1M+cXUr5f1aFuZ>W-GNWQ9oD z$6i*FAUZ}a`H8;UKfYbeixrZD^~EGGTa{>Czmx>-P$YTu0wm3;8@EkJYndzR)RTlM zLcWj#YJTp&K}g4M6!87x6RdyhRP$$mCp2fckYB72jMn_62kwsr@0K(JryBS)ckI!P z+aAWGodkX@5zN5Q(r*#wOBjP5MPMqU#&=DBF-B^rdu0C(&k~^+yr6aN?AMKBj^Abd z6Kd1)-}-qIkA9e{p6nrdrtJZ-l!QlyZk$-nC zt~-L3c?HFeU_SbxaKV9P`S&=2Mfy&p&7DMBAI_7fa|CDT9l@FN9O!>g&gzVL5)Y<< z2aqJxes{k@$n@k27W6(J7>AgN{b^D!P-z?_oNSM-y#{|{*E5wT+cidB(7i@Ev(0lm zxJcz`XsE=Kjq>RdbX_RNa|6DZYN^lXgu1I+!o9C++SCyDit>fnR}?SAyu!Z_{R;Pj z_7(O84KxRtoG56ZIYZqCLu%*_+WJAl^9@O^L9cQZiLR5uI~;69f=gYGypz6c=kL=9 zCTP(wgUJq16QY{T0$CYcr4YL=XEqvy475ij{_8S&iPsC!RQ{ZqO}dO2NZrPUnAR1b zd^TuJ6;`0<72HD714abjAvSLTP}^p0leJ0V}j~Eg-dLOk>@0S^qj|`|N1b?U%O()tQb|PAua# z<7;a$I`c);MB%fmHv=M~_fiS;6|F@P&;#4KOPN>diM>qHj(Bi{ zrkaR#&|&IkP@~kPW}#*x=7FYtSE&D>hZi^691eGQruAn9-zh z;*1t9LC-4$9eN-|;3~OV=uW9b0{Egs+llyOk6xgCK>0{%01>?$Dnaw7=O$G1B@*UuvQn752i(cJ=$j7z2BOH>3!>a59*-E!5p4jn*mB_*7uD zE)*uoqm_<;fw7Abg3&s$h0gU98!a0rVH_k}BP@V!Ck7s)<}biz!gvqk8xpcZ6NG1$ zZ~JqAJ42e8!q|pO*c|qf!tmS%4f0+Lu$2obo@IM5A81CmH3vu>=OYuleL54{rZb&y z)lCev4iZ(G-+XTd)ZCs6y=CpKy{XVPBQVbf^@4U*yZUvT1@@ONH=9budkWDFo_}*< zo)FeG6z2)xJmLMqPg?B1!=5&(no?-q>`=ES#5LR*Pi zb<;XKjq^xxR2Rj756V(lG|G5zH3d?o5Z~(QRIx{io@$oA+2b0m1vGX-(2`gT41nVJMXUT^p_@(-eV(x|oI|wa2+o-hvtMR}}EoQosy+b{d z8foe!e?sF!z#D{Yr*RpuT2x|U@TZk;E;DCz_|DlGA;Df=c$!*=S5{ zLA68B}0IQC0( z;p=vVSOEFF(YM{MG$r{cjT5Z7R!SQ&)^@5C%a-2hA)^7$`^ZmcPg-J8&uRbr*0cVm zp6(u1&#)y_rg>mU^qjJDjm^TFom$21!h=Im7g36HL(7VnSeGp&NYc*uC`G3v$!J4= zb~nXAvnXI&-|S`VBz-<4a;}$*I_`#SBbif4JE zAwg?-ll_E!*ovw`y}-d5PMKM0VSHrVd2g!lj9r0tR262d7(B~mVZA21+rDz?*_Ac+ z;$oz5E=J7 za>ak@r?Nz4Du}s!q_Ewt7C@U2YR)Z;S< z^O5edE5%p)ji4#lMvTAv#io%0F>Y*thHcj_=U_E2>pu%_Q=O=Bkr$~&xdZ*A#W=(~ zSB>`W%(8~M{}h_%kt9ywYN;Md_8{GrXf@ds;73lAZZwY`BZjn0rReCVU*X*6Ng4>#r#}OO1A{MKx}FOdwjz1wuJHtnc@n5AH9BJ2Gd_veh}o zx@_83ik9dx(9Y+$od=-~S=KjY|#2aDL zEi@l^i0G+RSBe!n){1t^>RS62^j$1gz9i!TFG*kR)j>x`@8Bwx;=w-J_UPK3c1jT} z(mpEj(?L;m4S0h!>W1#ruHwZs65r(Yo{d{zEc!dD|KsSRoBZ z%g1hI_VhGfXw-oE-M#O7Sb?d{6Er)nfh;%nmO^i30Sa}0)?ef?2xDCI``i9xSby~E zj*womsA<1k^6Q#Zvo+Q&SkvqF#s`_)^&L9nXH{8R$@?!HLzYu^I|~>9y|(+ zUXQ{BiDDKGClw2=H1;XPmU<}mHFjk{%_w)ow<<+#Z>xvmiUme;*ATB#EXUeiBduQ( z-Bp&a{Yuz|zxa8h!j)S>vE^DH8&2^(0epU}+@=T$7pc4;>75_^?5LCeZj9Mj!Kr6z zhCs{oLW2c8jKEYW#alt;A&(uaC8c;TzN^4r#zm0wG$5PQ3lvI$MV)pfjru2)q7`&e zEgHtYPR9P_RoKT~h5h<}!@lU>uwMe@e_;PF3Hu-!JME`W8{mX7@>>*wwuY3>e^phX zK|fWYCVg{SX><*EiEq(kDmCQJF->Tl=hnK0+2cp->CB58dt`xl?ETa_D(0-Eko=;nyi&VFSsllf-gzsMh>>tTE2UQZDBdFJyV93i9a9yzQz^Ddd7tyexrr(6L`-$AOO0L}joOkM zb%7t^%DVom{+h;Yd%nnWn12l6Qb(jxWnCrpwA}Qr<@MU?SYV$k$KL~ZD&RsHz60=d zz|&>;X28<`UoXS60pAFCq6}N>Pqydkl;Sf|tIN8k))(8SRVnCr5V1Z1C(61e(L9r; zRZoW`cFS>Th`W)=b;r1rVvihm4dSNi!f^pPE~#GYj>dSHUVW2WQN@dySgTW<>iX%` zxo)*E4dq+py!~~+X`r!6u}O~Ws?)lrRgI}pi2ZWOPUM=V%SE|Ma-N^$aMm zBgE~bF_Yw6U)O~>c(9IlFHw#=8tclfo`&>$kUr1@d+QiOF5=+Xm8fj0%dL);dXJG~ zc1c)bPEJF-LiEZsyITbFGIK7C?-w(X%a6H60oa=?+W{7m*)j7md} zkOYZ31)6MF?R7gPTjes|K;!$Q9 zzHIPg#wX~|<}tvQ=1FwvByK;BG=-QDBIBlaEvU;p^J0)})4Jygi8V@$FPF@X(RGxX zc@j0R$Z^B!XkA<-TcLE{N~S{LR#lTqNEW-&&Pl!mDhGVsI)Sq?tr$VX%}}>8$hHpSHbI;CpHPBR9ORi2HaST+7@{-OH~-rRQA(6*^>6* zj#K?WMrZt}bUkRljXXZQ+H%3CzP{da?nq)STNz)=R3>1qohPJK>uQPE49obm*B~gt z59;+MX>C4bbrksYsstU!$d7VmmMX;?r1trI32vQBS*<~iYAMGdU!pr6F|!|zVgb|Vk92v$mY-U1W@=pG4r4Uihpof1^#V}uw` z_m%{0@x@eYAdw33eF=U>(kD-OPqs(tXzXrSPiC>nL1n$=;^Xx()mka{>r#BJ6hFP| zf%+&p{zdrzXo+odiKX>XE^W0M_05C?(3Gbf@G2N%tD_O8l;WQ7(HIT%nnLW8s3_|a z>S>Fwk)TyRN`11NGNqn!CSHan)n}Cs2fSOtRMwSIpIJH_W2IV#Q<0vG^sO?SQm=F= z15pech~h{^ww0#U$Z65Yn*{i28RqL_+{rshVMdeD3UN~(-$;KM zVxY6sMqc>r3@?0waNvwWpmx@I__moEYH5wY7~+9D*>jzz%(D?|GJV)X;bdGNSd_jj zq1c8I0h{iD;O~;faCP}XSg9z)pFvFnM)~Yiss$bizO|>IaYw+w%`quk8TS&xWN)<$ z^|GTzwe1Kz$i`Lu27KpA)9ofy;ER>s9l3iwln>{8zJ ztB+dgPlL86Z7PYDbj-k#AH{jCAdSAfw;Ez$p()U!Dp2GGMO5!7(Ek@ORx_IwlDsOY zWH&1f*!KVz-$1TI9!0eh{0$;k6>KdMH`tq7T5Bb;4Tn=Rw>SYvSj5IRt z@+!n{diBB>$--1rt0XP{r+g~ZbW+N9(x-3@U>z)_ z9`z|;KPueRf}B?JxNTf3lbdUGj!#*u_oa#|Hf2rjT27qK<%?!6cMbANoVuxXN-5O^ zx1ud1?Hym55CvJym!MkTT05mXYRAa7RFRV~EQ1gB2mhN=?_|qmbEMoa$Yn=M&}Lt5 z>00{~Q@H#fAJ(r@yc2X^Te1*+`jCw`X0I8LdO89q9W(or+u)b#KP$;fG5+4k--r5W zzyGZ@s+NO=Mc2Pr)n{)FHt0wtBR&s~+~QAcQj8)mgu0VMtn6PeZ-@~%NlLFlpEgQd zx)HjD14lIy7q9o_VQ)+!ev7nC&3RbMC`2E=7vY=7_doHS*37vc8y>cUY2FivYxQuh z2c@`d>p+=Jp6H$G8d@q9Eu9DNH0Lr&_Or>lVmOWe9wjkn!vCw2dY-OVHpw&&mPW!| z$Wa8jqZE2zwI$1RJdOCXs8bPO)C-5_38cbgr5ImC{3gkUrjYL6>ir|vHmTmNs8=o3 zTY`NG${8i78H2P%a*YmZCBqj?aovRYAZolHt<1Vo-<^ov2LCbVVryxxEr99#%EI@| zz{AM7vV?iV)2s@yw4XJaN)+N!sn!x{zhj`S3b7O1r{jyZvjDYbHs3#-tEMI|iQ+aV^qMdvhhFB>j zhGzk$_QxC<&R?HZO05S@#+SREQUqEZnWZt%SDoOzSvP*_9bL1y z1$7v9l8T~p43i-g6~ST@r%EYLfksu80qy9+u7_E4Y=GW3M1khJAaQ1K?S^!;iNXd6 zet1I;>NZ?O-E}i#jM<EAM2AAAZjnsgSSj|hWH-&*0H1<8gSIB# z08GF4b5cu$4WxW%O_-xk^n_b?qg;MS(NMJcJE{D2Xx##Vwhb5->VV;^{zZ+vu>2=A ztSuch4W)g0*TQ;USn?Awvh+;BT&$6o@mMeKkygGvjy=*knA*29exheDo)0+54g?mq zo>?@n8{oqViBJ9OwXUdYI$uta_!5+)f{1MnnvcdmBjx*TeOO9brCgosX)2YFr+OSx z8-HHkd|}&Mti0Eeb3RA&1@m1*{2SKf4#aJ9Qb}uqg?l?>W-<0;X~}L`F1wvdw+T|i zOg#aqajqvuC02rl8k*;{oaeN2ZxIVylgbk1%?C5%jqig$H%jxNSv=-!Li!CM1LeIH zURrk}QYXr(pE?;DPiTBC;*E0r2Xeg9{if85L*)3nEAg*My`z=m-vFfxD5iz9k0!aR zfU6JslFHW$PRbDt__bHE9?jx&PUx)!Dsj(Ct7fyf4l(Kkt()e0SdJ^Dxr{2QcW;v8 z?nnKU^ZR5>_c}GzTC8_fu$N}adG2u1+TtPa9^|_DN3GO{9`x1pu4^D4vwmC*9MP~$ zKf%7BS=6n^i5*i}S5iHdjHy4uYl5ChT-SV|ZEjiD*}5Eo6napyi@au2(9zd)*qlx(cmgc(Fx_d5dC_``ICteGM@Ky}Uxk{_;8v zu=C;tsZ520eT7$_N_&+TzruQ8MH?NzFJtV|-uY)AF;W?$S{M61m%=n=tP68o>82ci zw>PYx4d_?%U2)$3i34x+z7M@JrR{2-Pn0n#)`iDP4n_+jZia3@fpY-HwgGOxe* z_Byk1vdge5(Uu{k*BJ%wpL;Ai+kD$_frTgFqAz}@{@S6t5)r@Ml4e_BOTnoawc?_W zjM57k)cV-`M<4V_x^(B2vBrxZNfd3rGSYagBg5QtJ5}h%Xes^WE2E4TUzTFZabPjr zM@9*LR%+ABSNf=l1)uEG2*$Nu>3ycB;^B|vP_bMRnCDv!Tbd+ zLb)84%2sLq{gZQm&(%^p7Rh|(#T7Em^JP9Cm(piTG)?cCQ~w7Co{&=VuHwKniT)d| z;=mXg+azbWh3`mZ#>?2o)DOtvvuNXJztRoQzck;|(U~H(Bo`W}Hks<}M0m6Yd9`kp zi`s^~7?g3*mQ()P0Z;GxVHY$d_H3z4hxPk_?56;e8gn-y9zaZZ%=6*{ z{oz`g9bs$beJRr?B)4NvhS^`hP zVuafeZb4XxFdtzq!W@KI2s0205eg9U5%LhGBTPfcMVNwcJ;JpJ*$7z(6A{KEm=Mwt z#v+VHFd`TbMk0(r7=|zuVFXKO0K)GGzan%Zv?KTtP9vN`_z~d;gp&v-5RM~!i*O9#2!apcYlJTm{)zApgwGH@ zK{$Z$@oA-da&`Pprjk@(jczyW#JS5$likU-6Q>^#@8DbU_fh`XY0^S%f4XPOFbEjrIj)*eMru|u>M`iwrqB2Ti?aJmgs#KcBM`_&GG6w+GlzG zcO`qq?|c{b3=v02`#;zDi6Ks+HD98&tZM>%f5ha3A5^EKZAh2nQ>FN_?nmk=r*z;{ zhMY1;N}1ke$F4=VOq`semdh-ur?j@pwD!UCKLXyxp*1=;ZE=b`h68nWSg7rnh|#b+ z9hMxaq^Xa{rGCObM0nO!x&MUu@v!WH{HBh!cMRt78?M-$3x!*e<6}9;Cw2PNbo2-> zI^hGL{_qd6&k@Ja*3q+fG-gj7ZFO0fvYs(USJs|U$=ZC-4imI>woJpet7w>p8p@>_ zKK53g8Q|hJ8Q*gfzUf{6LWwZ9D&>^_l2d%3A*cG-;T?DAk-O*lKmrDza6lGvj5d#>kv`td4T#nlsYeB+E>?oF_?c(|vXE)nRFhl~YtwO3TIDukayGPPx3B zavZZV<%85012p_9rLj~XoukGzA@nyjoVv}=GW zt&I2LuCN@;Kug1NAj)~$rIeP7Q+Lz#H|5joa?1C+bg~ACl{5(5cc=Avcg611)zCgJ zmSaBK6^q^I6s$Xbl*@j!i}pGl>$)qveNRqnkZLUJ;w0Yg_?gPOsyYGqrph^9+oh^b z1Uy-WUk026c$^IXbr)wylIEk&yra?b{~FXa4QIsSIU3y9w*#~-X!;dV~g!xkQg(~&wbvo_VLTnUnG z{h+KDchzDq7dnm?%`y+R*T%Wx;ep`Af&F+FO6jW9oh)SQ7P(w`?Z3}#yJa42sHHMM zx3li zg}x=_nBJ9HAL^ddOivfjY^Hk}p>6@ckK)%N|K8XfUSH5Pv#u#Wnd$UBNILIkHc6+B z*ix)k=HN!qtdx=qIFCdz{Swlb670tqONi(oy1nH%6Q;o_#4m5|));pR5+PG7#jFG#nJ)hV$;enIh#X@1x0$f;XgthjKZ;hRE zQ}2Sy@`NuBJ^PWQ;cxS$3pWD#K!WD^a`F95Z+2-$>4T;_e4S-_%o`E&8cy}`qIk*epDKJO zuOaEq&l|AMscp_n{lbfPqn>RZM&PSBu^EcCFYoG)+3PG!|HdjU@NvR=AJ zS?j#TU2EAVzU_>fsP-yaA0NrWzi)T4sbxQEC-%U?=fp?)!&n}28sLNH#XK47N+K2`ZA~1r8MYEp)2Jaw>zi6i}j&8Cg9LwCeCFm>FLoggVBz7*y@dPxk6_KPL(!7 z243z7*K{N3T>~vO25alZ!cL^TA*W?!W)2JkYT;^RY3JUR7yhK zOK=Owgqr{=(3vgQ7YDkd0FRVm73fxBrOb(gL*e@S9kgB=vqH{u!9g+TW#~7D9=i^l z*dXUWBju;OnJc&aBx16J=-L>R3dy;SIHFydf)bK!>JOJMms37P?s)i&d7N1aQ?S>e zbW1))S9EP-GAEvtb2d6~rovT{j9X$jJ3B>KhPL*~UdZi^FxTFe>b?^xDw!uQ0o&rD z6d{ldd+JL5=Ny!m3z6@TSDjI(4xKRsEqVg2vw7Im&A|`J=HOnECnO;DL8;BtyFRVsD>%CU?$QafCGVU% zRXZaJIc!pn-+h0SoLIvl{${zPwf;xx%w7}pH#9r@FN}4%7XJ?868B-T26qb;!qV3` zah0^UGS3$tmE3Vo{JNLuV}4Y*m)aK(rzd>#m8|zcdFvY=%t)VG^N1~UGNM951^;JmW&ci(hPTbPV;bxYh zG!C(MfdYqz-jR6#EjR&>b&-ckPmFg8=DK3UQ7?9DqXPVN_A0O*sPi?qsZ;NnK_!mn zCuyQ@bMOgp@JYg^-dQvfa`Uwmf6{x(Z(OT#;VxkyN^KV3cF>iv(VB;~F|9jSYQ4{= z#ymZ;hQ{14#T=4OJB);^xqC-S>&zn5^`?aL10TJMX9c`fg5SYxG7U9WOHi$E8d91r zWq}vC@7Jr6^wLDMm!xflA42QWmvZnyQ}{)A7pNTTrPROpvaz2$Z70Dg{%Is1pM_JdySn=nWdtW_mPo~tKvMyV_>eUH5CJCOQ zoGA8Z2@^nFLa)j_0pkL@o8WD`8vx9CIZfu;Zt?0SEpe2 z8Z)=}5L!-ep1#?ms#cfd1Uk+H(4N4mppG*{OMTNPxB9a>6;6q9;(R$ri&S?EcwZvN zyo*(7w2pGBMvmECM>*AUu^2p5VV8l@u~4StwL03yE*X1O9c{(0GPDI}rc&4;H8g({ z@^3nWGbIa1#e~{{)@|tfD|pQ0M5m>+{%{uhG-{YOCO&THki_)9g@5cmhx&rNw*c`B42j1%{v?&6R)$UDA7nCdamHF;6=Yz`;?zYOXfslcput1(XR z3(k`?j{@Ic1ofV%YOaXE+TyEV_(T?6+fnNN*5JlTkWJ8;6SjuBr-t(FWDHly7*l6& z4r((uHqvt!)Se*Xjlm+%R>UzTb?aipjB^q3wcxzQQPOysgcu&W;w5>m_i8xtv))``%Ft@d zFmFofI`KM|3o@o|KedrrAGM4AKk%JNVMK2wH?tWFkp~QN;af6-a`UF-u#ry?4 z{yrb=pG-ljp#c5=5r^H7ltwP#AffJ4AJN;5R9?J6hkk!U1#UI069}*^5|}Na?)&Kp z%f^kk$r0*)wV%a_EBf_M*szOm{&2pKiV;@Qn_9ceGS;_PN~=KHS=?rJ@&R;PjkD>fMx5X7W0*SZe)OetO56 z#U1NwTj&>uuT1HS-n%wQUkZGUk-ivw8CtsWRs}}EpW|`o5jOy^7ESjQV-58vQMVDj zvMtU-CUiqaLfwB3>Cpq?UK;b8uS50wF)Dq`PUfXhcM0~WM4yR2ee`J1q2qA2D5{i} z3G|=#U*9wWtKKAFW(BPfTSTck-EVHh4WG(i44NWN^!6}S9Bu?>z-Oi`!c8P#`yD4_ z>A1l95YSm)yCiG>jw`N+wx*@ONWwL@>#YYVwwnLImV)xXUBNaCkl%;f1=3y?9ls8& z8g#gaMeo3J;(uWkvO~K4nvNUMoLB|e4w$}8z@Q(gXEhBczHmJSseVB8oXo&!N_wYR zfias5d_yFBx6=GLQ^uj}z4#7Fw{h_n2ViBlz&JtL_O97VxH6VrA|6AWR$T3hKU9VqVA3Z03b$uCt|ESLg=s)XQfjCYiSJfvL zD1~RG_HAsSr(ap|G}dDJ=D8gO>O8cP70&~11IHFf9Am|9!1O*big`Lpe^bvEnXZAZb%DerbKpfU26q z_1Tfy0(cQ%`d$Hp^!ETK10JZq9&jtI-$<%yoz%Bdg>@&X3b)1X;i_5qvj}V;nwBQr z=i`w26H2n;WB&_vcS`k#X4{P?5(H;~GT zQ~sCwMLRaR)FAw2n%`e!#SK=|U`g9jy2P;2rRMDDX}5mU?)26YwHIbv{luBmGL9 z6r%L8;~rPk?iR#bdZs)=%f zMNJ8u0=_z;~zq~aKEzR1^6n)1}+l@M%2dpw=pZCoR-{_%bnC z?Yr^9#pa*}w!w`zQLEyufI}VU9_C37_xs83YxuU@(vvStkeNbE@A{Y|U06pVPp2J*Z zz6s|l5cbU>`cU`M7Wy8^9k5>bOio-KGzw8O^MkWZQ8U?qPLU*VU+l6Z+ZNkWVV|kF zi$1+Q*+$#m-efojrS^+OI z*kg8P+Bm#>Fi1$YFSe_*xli_3GLVAxb!@Ud&8Bv1tLe*8x~(i;j)MQxK`QODuu5E| zs=N=su_|Tdy|WYuJZ`|i+t>ixF85?my-iiYxfTSCnM#-2O5>DaSUu~URe?ZR`UuMtE?Rf9@*Z`xt>+;k6*(cguFkWjTkl?udBGZQ)d+2?eq7C2HP$zl zpIYv}Cqc5eoS?zzC-SB^Vth+tN~>nU*NW8Ppb4kg}hqx(`dQWUSN)sN}Nn& z16?R_W+8jwJ9aoq{0i(VCav|a>R`Bs%-aLI^S58fOx%9%9V4a8Z7nv_wQsl@AC(U^Tg-Cy@Fv%lG?RxsJq#}`^5DayGb^4k2Zbga^x*IHTeBJPC0 zY5UwCY;qXa;pTa?s`=&u+*D^fHx8ONe1Bj%tICKK=5~CdP~k>z4oY-G|48p8;ia#A z0W(YEe#Omry|DeB<@bcTE3ua5AG9JNW*^#}(NOthl*92`^!U?Lu`E=J|fo z*zZ^G4K_umEW5^Np?71HzVgC`o~{7XlSI<2!M$_E&~@+jbX|Nn|NX*kmfph+Jr}!d zL(iebNq9xU+n&X4v(OeEW``dhm69Z?_(WeaH1Uf5=(dtO%$ND@!j5Paxg0Crb@N@9 z9lcD}7Rx!`vEU(s78wo()UnSC7yN$p8=Xh_ROoS9b~)b3qAyyUz$y3hbKC;C@a&`B zpe{=R8>t*G>BPp9KpvYTXkMjnePv4f94oLQ3QbpfkI{TVZX1JBeX#U#=8bWMy2Cd^ zZ^LUlBreMLR5Q($BScrjwg-lFmqxZxicF#{f4_Q9r zWo%~QBHja21e^?PK%BDTPbvdnuo>3!f*8sZJv}K#ab`(vs`bjV+-7Kln1tZ0srypM zuuL(;CABc4$S7UOPtrYrryA%jgt#5CZt5*~4kIA`HNLXHyApl>C$Gh>C?^@Wd-GtI z@E9qq=&LuxH{k(5OFt+h_`@!JB64mu%MU{#% z91I>RIT+O8C5Jo}XcAw*?fs*G>FL71^zk@VPOy)kjnxwL&)cDHV@Tgj*GPbPQVto) zqEeq6It2TK=4GzR8-v$;!g=HPSUInfY9e?eLLbp_EJ5@=p8{|2&^%sf>f9d}i}#o2 zx012Hs&OhCAx~3pNjs7)Tqckl)K%YqRO07hHD*sS0jE<{m?4Hr6q4*Op}Rxf-hP{0 z^VL*-(y#WAi9^2&TY$t!sZWv1v6%Imu$mTqXnj@(-ak@ys)*va0dM5Dt1e*qbpdPrN$^7jyH_x+K?}z)?kS_ z)V-;Nr#6PPhNE+(U79Od@!MXbpq?2uo6eSaM@fMh^7Eb2T!~pznk&QeB=tpYL%6!E z=l@ui`l%cURG;#A!3=s$Db2B%UstK{W=?n(-QR2(gjtk~rteY_vAEYd3p#5U=FJRJ zaS|RO%*^h&9l_LRJ2GA{);4$Mn+_FCKY z3Flk4V@^_Fh8ldF&PjjFMxXRh?QuhBrJcSOh}me|AG6U)TSqJP>d@I}GUkzby!Eup z_O;)UI=($vfH_OEp3X^Xb&%8Jl}I~obY_|joN$}4)V|I3Qx9`JlUo=FU9W)yL6uS1 zvGCEk9S0QZR@{{Wwl{FUD%9QAe-LA3n>{>R(fF4@(G>J|Sr6tZ#liM?hURPUSHlK} z@2|&bABMY{Q9k=*?9J!CX%X<3&R~1b1~;zyx4166$20QEoW``mm%29!qv6edI+M|H zu@oBYJZ3T;-!FvNqE(p1GJ5p-4#`(S-{hii$*6^Bff1hyIvVG89bH4$0xW&MOs||} zvYk>NyioM;!Sk>1wYFbu(#tYc&AdGGljg(iNvg-p1^B&2{!LTOHLI!% z%v&sMi3u;r{V8?r>gA^5O?a33A6*}0_ zZv^zQ%;ngA*wfKmx#BX5J515N=8jlm?uaJLWwv*JfUvAMokb2c&26~M1{9ao!OaC%<7S>l#`gw)F?4_MAyby>uo%wfjs=>V-2{Uv)tqA;VP&^fzo%Q{AO*O!v^U zCy(MSN@`hqvCIE{;85I!R$^4HAb})pLjia9Z^!o}=NAk+0_*yr9i2)|vE60Sdlx`s zXeI0V&P!CE?dmUvKGX2bq-|7BDQWIv+iljU<5ZtbwubW-UK)2d8TFZeKh{g^r~{I% z<89~Oh95#$6l}{yor+gH*D|>UfzY*@lwV0)MnT8IM=zH4@FfiifkXfEz$Ok2bYG`KC>13*LMoYbSevpp|b)OHZF*m52LfyZGw6Ngl z%g5~@^-Ugfm_$>*3f_Zbs;r7AiH)q~$ zwjlq1C2WWO$IG=9kicm8OWK&~SA)ci+Q;fAtFySygJfZFve|6+wJVD&h8AL^Cg3ko z`GBR=tSVP+UDv^@eeJR4aYKu+?&He2txt9EmP5@O1t=`e<~3iN1$eJG>}VB1>!QC8^0qnloaBN|rIy<|VXgi;uJcpX!r*nbGP`3a8{m{mkyGXc z)!JE|D%I5M;9qzGITYF#SKHZ1suz)S9*YxhcC)5jRh2X8=?>gTO10GtZHrn<)a4JDQ7chzo!c?QZZ{WokTeo&?ojFTgOeRm^`^(FIz>O0DYVl>@h?o^PdtwTE1ssdowYz3!Ep6<}9>}Fsq0jUtS z4X`X%QPy>Ly#lX?C}1V%CSld!iq0tOI#ZX?Mq2966NmaAAD+MOOjL31+n;aPSa)Bu zDfmMFn)CNh4O}MF&u4An3UE+3`>$}8r|hTh!~tv>32-K(Rzz@g4Hqptxkn1ruAsB4L6Xd z!18Cr=lTHYGpq;kms;)rH|%t;G>rXJpJUo#>8(xd`liMR=1c;;y0$M>NV-WGFsrh0 zQ?gmQL3s_%*w7o48N%P7Gx$J`>iz*6>C=Va6M1#9y~NDC`kDovQsw}3$ZybnrqYAK zpEIc!AMfIVztB;6BZXPlls8N_DZ!(Y!9|X1TgfQK7>hGtL>CiCAO`Hpv+%-mnea*A z#sFjHUf3MenKuXHq3_1wWkTE^*ujWnrLSmwrS^?(q`Ou$mhGdSBOX4KAugJBxpxKh zF5VFih2Qz0UW!Y8O=GBgbW2HL5PJ(e_9KYFoI0)ux3GIhG#&-Tdn|KWkG3Zn6Z2=l zGSekcoi8=Z21ZL_Y!s!P`6$)gArfr9p9KHK`KC1y=H2cfWF=ERs0Np z9BRp=Ya{BXPi{9uvnkJ6Hnot{WGn5>$`2jJXHs;3C+X{NW&)wf zY=GgY4VKgbFJ7wdL#)_E=ZD=*IeRAUK~Id`4K2Jo$eXd(kgol1YmktwK|a%L*%!y; zB--?-gZ8Iz$8yV4qJvvv8J&M3F2Cd0L+oyol?(F2aenuS$@$EbAEXt}Sx+l??gx=S0dk%JLDWS5ePsv^;XGwYf;zJqHQaqDB?4;8$6e+hOut;T*`VO$h9j4{jbnVG?QhK~*F><&NIOO7xi{d9n zv5B`Q+Mc&CM~GhByL`C9W-JYvg5GPC>`_LaXzTJjOaU(kyL`^Dt(IR-+*3-%wR?G! zzjd&Ea_rAOg?(Hp-h3YAPrhl`dzK{IiB@VuDr~>|%ErCWLiCLO2zu^(UKJ!_i12v| z$)G2%x$lWSyi1r;%3>ElY8TF1ya%f<;Kdu28NYc=p#ND+7?qa@8Cr_-K_}8ZOa|wz zyu{!h#lOB|s>a!q8;zw}&)@ML%Tyb0#oI1~(T}tF{LEw~XPk{G{{`M~`VuSsUoQqV z=9V&(OpQkSIZ#0<2<~O3o%6G)DJ4dn{WREa@jRHqq@O#<=oca8PJ~3O(bnmI8E5;6 zN&j6jUgM#Dh{>Sx2X8o5{aqN}wMUQKpjw*|8!sE}jNSxHpZYU| zll}(y5n{Z`R!5q~+m@Cj@u;M*;ljQ$*4u#p58#5I_Ant;6Q8xD)}?*B#d`gNUoQXM z_;t^|rir<8etGjmQ~QS}o^dYOf9sT-rlRwK_`u?!Ud6kATQ|MJJ$GpRu|Ey3O?IyS zu4<>M)xvVynI-EJK6;>};G>OMqn>}~=bH{Z8GXx7e-9md_|A{kJn+op=lUD}oXd^Y;wfcxVY#;o}I;}!0o56=v|`c&aZzn>aCH|Nu>AICKvd;YmEUXLEN z{FPmgJ}|C*{3EPs@y-no&s_iWTlaro({RVpp1i%^ZMyX5riJnA7tFu0s`iI_e_Q=& z)(+jIzmGpOmTQ=9=&AawY;nuavA=(GUfcHR{=e>+R=DNuW24{JRL)=ax$=Q^T-$x= z=}9H`$7(ie-W%IH@vx9%7&c+dKgQhAyL#N5Uo#Hgo*0v}@P|DwZoT;-&GLUOtADOp zQ~c*0?>stn!aw#q&(!@|xN+Q?irj10CB1&O<&Ar|!0cJ~rtDxcEgzOVH*5cvmxJEz z^H+VA`O(eFp=T?6$qRn}W|Xq}8(q!vTmD~dR{|DQwa4!=cbmJ72!f(GDNg|f2LweQ z&xXYTO_bbHQ{?|a`n-*@Jo^WV<@oH=Lach8x*|CwRRg8<`%m&UIeYuIsYcSwu!buBB79^b)d zcJ~=n6!~Jm$#ET*-T2^Q@t!TApTreh-X^u~kvyVuf8S5f_CGv3^2&fig)dLMl05l- zc2N4-9a~S|erJB}ldX3~WhbxC8`H%z+C8sgMov-HYMwec_hyfjR*&mS7Wnxjx4)5@ zun~zWToZB)c z({osC->TvmOT1;M6IKioGh(iiBhOg=+L>!SyoN15q8dW%)a7Z$OG=ooXnd5xtA5QG|zmcnBkmQwg} zd>L2Cp(P_=543b#I4_vlKCG*yGNDo!s98#Y6J=ko_{gfZ4qI3=Sqx6w_PU*GDuZXr zEkm!@iJL^LE??)`mYd)$5S+kaTLw5SLClcXJ!_7}y7kv839@3+2-- zJj}O^-Y28!cNcyDe3FNB$1?5EsYChE+rS zFUU_XKzy>F;5Xq=wh|DBLCZW~;j#vGf~?PnYP~eeK#5o^J4Bc*d`KvcK zwEQr9*2U^SudX<==ioPSzYcpZeM6p^PxPYv+J}EzdF$K<*EZM055U8@Hew%eA<|u?=D?jyY`1||Jc|1#I!4;?|(rp zaJ%2`ct}{3`@qRbLvyYdA71~-lKh!j4+s3(`INl>=g@t=tK6sSUd@e7@g2;>oZs;H zt7WrxeE7=Mx2xM6j5u?m!@X_`*)1(zdUety4@>CKe&@zjDm7iMRV=%fKYM4<#+YHL zaco}4^fIr@{5#=m{iYrsdH(quKD9M-&KB%0TE6@BzJo_}AKT*1yZWQ8wgoKe8T3@W zm3bll$ftYfZ2Emg<-874xXhH1z5A_+c(?PV*5y*$JH6^geLv-5!RB41=jK0J>6z8- z?IHbhM=uWA+UuB7!PGU>)FtutJV!A(Jux#gH7hOELCDI^N=_Y=k=8pUG&EeB zO73tqLmmU!5f2b!13D7fzIR%F(UCiU{{dsiHa&QJST{-mRL^UIhL12 zfm1n26+{kJjtsj(f~+dM%rX+kh!U(hRp14MVR@hkDkFl5#K2+{d7uekN>v$-<3&Z0 zSWx989!zl($Er5dBG0mlBr}SPYmPxVR$&DR)}G4qU{YcfFv&6?E;d|GoK7ZT5z-PN zFch>%>lK}#@+1YvWwOXfq#){Hb?RiAQ^7?_M=$~>QF?`>c@Z376pj!mQ75yYq^Bj= z!Qu#+(JLw_!Q*pPhNL<020lk9J)x6%R!7pJN-(hC1x~L>Dx4_5fU%UU5Hvim0|vJ> zWHaPU$QWx8V=Q94MMt8cV1#Ujj53ZmjIJ`c7livjxCey$Ke*q6dp)?%gL^z@KVr(c zQ&YNmUKnrcFh_Ml0Beq6djhGtoG-7GQ(TJgK_!+P> z;%3Cmh?fy7BThz)jQAL_G2&vx#E6Fx3nLCj42<{}u`l9Y#Jq@i5$ht(MU0F17O^ej zTEw)7XA#RHjztWM_!Y4$;#S10h*uG-B2Gn&iue?`X}0}pg)c8GS?Ad6_>pTXP1opxoo<~CLYUsSUkIREv8dPN zLEl!NgG8X^TkTg`yHeWKej%)St)S^!9qm~)Ifoy--L6&7iOt+-#=v`c=~U0=vP8Kn zEd-V%X;!a#wDt|`PAT60;e5+Zz1%wf!@V<0JWHQwoyRzy7}pbHiehX}?wJVDPzK|E zq73-wObul)1}MsiP6>!r)SxYl5sET8kTF5FLjD#q#uyFz(H>J2sqicf z&f^+t6IUF|6~nJ)$P5bwzXq6GYma}m6^RkstSD$Mi+xuPCpf7hcdO6VRxAXI3yLUwC zJ~+;(&pYYlebb0{z{%SWJXarfYHfLGWAUs{pE-3Z8tAOlbiQlk-y)|@OBjdx{>^am zS~cQLa`KLAzT@0*yeDZI_XI)c(55SIxW+r#1n&incS_?u>sv2pd#9UduZzY#1A5b- zJ-R&)PqVRWGcXg{KIUw5b8W+WBQ-N`*|DF=geyU`{&yjnN9P8WAXpQ{h?KO$NP=r>tTsQg&z-(x!}-0&*-kBt zmFxUj^2k1ipTPU-O3&BmFKF}X*?O4bwB_AstzQE-lbgVIswW<<5OaA%`^R!8wi;WWP! z{MVt&qpMU5X_;+1^AdJ%)zUeTWnt3o_ntMg*rqb=40_W22*c8vSDX4>3mO zj5GEgmz0_UzyCH4&d$z+`-zM!W3VYO#1vu*oDdo~E^%yjjz3U>LV|*gNDU4)bv63s zq-LfjPE7SDB17RTIx#gdDT5#bpvXjL=j5j51;%#`OCZ>0T)aTL>D);V(v$WgTaiAx zb|kFjpo!@db8~VNlZYS?&Lx6U5_1!Ypya%q#Bp%R9ycyE3#gF;bzFO{RfmoEDq_?$*1;$;}vX?8F*6TO{6>%Xm zNg$9!Apx~Qv>?{jsz_YwZEI)GzAu2*M=CDY_THzbMr-@@cmMuB@0ozndhhQ(&wc)X z&hox<&U@bTF5maNe7@fku77Q(6moesxN#zF1ev@v_<>epS4`DNQ2YYK*T{&-^{HNUK;rue0X zn$6<#HF>j#sM39(QCrFvgjZg&m@a883vc?-+VI@MJLolQU!+Smj)cqBUgTV}_I4c4 zH{8eMj1|cBcHjh1=vUWv|O?%BCyx*KTaQedCjj^UL08{ASrwb$(f0)BLiY zrn0ijw0g0md2Zni&3UsU&G|onQWL)W>*iS^4wR)|8)}wkFG!wI-`7YxSCj ztkN|-`}4~FoK;qy*HW8sfrx+SHJAp+O_G!YRk1>|IGcmtHnPz6e_L^RTTR-m9;K?*{Zg-zE=GB z$|}FVJhaIj+UoMR6rNZbutM*7{`ir#a%+9bEz1^pT#Iswvo};`Zw_Uz3%iz973TPt zF7i~}X3ew~n`m~BvSJ=9ve;U+;k75ZcWA53_jBtS`W^1k*Vb99aA%*ZK}$y^=G#h zXFu)9e%Y0s%+5aP8lU&d;-r7%)7BsUaQ>Cqi#)3Bg^rLl=r>kG_j~0L8vSwLJtW{Q(?|rMVc!y_Gg{z_(W13xlG`sx7g9>W%9TRG_B!TQ+XGde!2^9)Go~Vrw?aX7i_stIm%bcpz4a|C zd&b!%iStlE@a6`8ubR&6TGURknWU70n* z`{Ng>hnQ8K)t*q*-0G_A{Z-j5{>+}U)$gkIFJ8R(>Xo_{zz4%x++rDQhc9mGjpRMo_jL&wwJUs!@j@b(!m| z!att%C#u`;@nqL~vJZH&F-M!N3e3~LS~pmEkxx#%7aw_d_-s+tcZ({&U+ymt`-}XM z@}lx1Upk75BgN$vE6b~{^@r{bMJ!M2doL%)>a0twYfUSJsmTAgQy+D>9xJ}5dh5}9 zsvq@txc+DrSfy48?uGtZS9%MX?nO%~aw?|G^^|$f&{5_7*4E7j{3FE^o-Yv`hTrvx zYod5$-GMvl!>5DCtc&{V*Kc~+E;#|}K2MtGGnoplsxJ}Olow{MXG&pStJ}Y_{mv%3 z)G)a3=Hj_kRmH{CeowXE6{*U`e(sH~2@h#i>qDefnabJ;$$oXq)OP+cWX`?$i>6=7 zUc)Wt@nrS+r~Mecm7v}%Yi+jW&atxRzPIR=iUV6WKfNkB_ixrb+}!k{-O%%oOnG(Y z6`AuAYXb;-1LlJq6;}RdAAa`N&;DvnErXXWvKD{sagF_whPR)jH@8-i>G_&L|I%38 zY|Z{tvZB5EXv@@pPiCsIzEOTB?ONBG;~%S*>+hpgnkK9vzTSe8PMOB!is_gI-8Viv% z>hf1F@@y^JbW3&1elKQw%9dd+U%KYKl(~`2M1{3!N3@ChiIdh` z)1F<|^!M^!T~)Vj-79&gF|kXm+3)8aTUS@N>ecD*fm~2#niav)U2mNt^eQxLc%lYEvf_2t9Yuxph&@gFVEm@?~ z|Av|ITh$NSPh_ac?hvp4%Z=Aiiy+`~EjP9zY(My?E0@yCv3c#0{i3V~<%>VJZ|(YZ z)8=(#&^+h2;+A#m&}rW;>uPJx`|FY|iS`r2nXUcANXvT_?+7|=86Z-4vy zXI9S1#~yoh6pGKRzu}Z~^6}k|r9L(nzUz5<@y)B}?MZ*~*Y5gx>u&Zuz3^S{LMv%K zYVEdm;ruAhSAV$pXOVkPYy92d(h|YH{YQ=- zs|`LSIvlLSFrez&`hEdyfv0bPzVC2C-*-9GoeWdx5ZDNglRFD(4<&FlH8j&y!!SRq znM=i}dDQzg`P4LeE`3=zkGd-CqD#UIb4!?Ke;UqXen;~x8{xS!9CbJbB0PI3lkf1? z^4#HCp8Zp;i~0wSX?6M3)i|2!^66CFJnA!6VYk%_-0Sr`_gTHbuGm#T-NWkv-dh_edgp#~z-2aZdq7?d6%p zdkY-5?-iJz?Uk8-$O5yhQDC+;^3010%M2(i|L4ZJjtf+dU8c@+-qf^;x}%9>+ne&K zkC5gy=R2x2o_(pAVctSI=K`L+`eB!21CF~c;Hl>xX1K(|3#e?JXP4vHfukMApLCXz z_i^01eGI#OUq1D-eH=ToPhv0K&#~)p)Zj?$XPC2DbD96x&#-E?z~1lrKiKZJUd3iv z<0J)jeOzP}=N4IIxz_zwsL(1Za^d*8OCS4kt1N$sHMhia70;dUdnSsD|I7}sBgGJY zekTH(veMVFG+FQBMDZKbUfxq3BWKiHnLZpU^s^DE%DK0v{< zzL53t7hBLz?pEX0zhZmc>aY z$H&%$^|5zuwKcEGnuU?@6qC`Za!picPhc48tejfQ)nd7iOt)4pwdT!&hCbn`{J4B_ zpJ=zTQJ~gxM+_HQvD~ir(<*C~-`ec4YRTBVisqa(v#k!xRc2*l_xLB=q4WEvx&FT| zvX(Bgsy#;TD$BprT2yGc=6b$V&dPTCtsJ+<`mXgoYrDA(mHpg`%&@ALSpM~v=WZ+e z0J=Cd5tvRY$TV|N@fXcpRBX*Iwr0$-ikDii7~cZD{J`?Ki!sN=ABT!E`-H#9f)QiQ zo@*`jSeuH>V$clPi>s|-yy0%^tk+X*`TbTEWPmMATfkqktyj>&5lo8TMTp_Q-c2V) zXbgqh?Z;Z|Dyr@3{MFN~*I=tfFbu0)6BVwB5ICzfidSy4enRH4+M2tc%tZEr-1wF5 z_=ci*nLFTk%t7*H?!+?J$f~0E+COQrzKNMW;PqqtAG7YYZnHMHtkuQV$|`b3 zz5yfnD?&`utyTF}{!DBB+)w5fV_}@%35k48yUVRj71rW)_RDQT%8-+l-D*u=H%U*+ zFrwcl#O9hLHc}?@e0BTz3a4f!Zx&nC|Fl13zt^?M+O))4ywu7m$6BoPOk{Su1y**8 zl}Fya#X5M7md`C1ECpmKVx`=Lw;kjAko zN9NXgdqU3*=*PpEjjW_8oyxPxVXMa?^ilc6o@o-QSZK}3`gFrY>%@VNTe3dhpZoDX zH~R49N)}gI1&gc;r(4;jR`zDg17bc`Ri+;IN~>b2l~-W7iaitMrFg%AGGR&*p6WihlADapB(+P<+JL)RZYzGPb~J3 zwRP*nJrf5eo}Os0v~o|_`|mii`La;=V`$+TDE4=wjd$9YGevOrtwk?Ws5pW2eQakf zYnnlS!HLi10!|c51h-h%V^tJiR%DgCp%Sjh9K~+8<Nx!a#wK`%?x|L-;X*W3ZjgPT~t{A?8ieF)mig)2l=i0r>s>lNydd6N@*VyIl zg++S$Ii+WYYD$&Xh4$c0x$-u~^85c(&c3=06tRP_W&f0+^7|n;w_C@&UpvM(I{%E# zTy7^;R;5*$8N)D{jPGN3b{igakMIdA+v+3l_E;fXJ{5bip=UtL_u#<97H4~`lDXD8 zEY>2!ZO>FugbXJZfmLZ|exIxS( z?QImR;%=;zmqFGape*@)54NYRVblFnLJO-Fga7TqfW8KfvTm_WCqMPri|%!+3s-ko zg`SV9K4>{>xFa_4*u1~QV-@FsD3)5qtBKlznu^0%3GEZFFYB89XBu|$yTLp87kO_8 z%laYuquE`{+9wG4SK&9*1#D+A_h6jJO`ySNeHQ{KXNb-`iIHCq4E@xtlRC4b*eC8> zxqG@pDD^u^&3!w|d}BNFOQ%!Ck6c8pEVzQ2YZg{$2|; z*Lac2FFjq8_rnRQ#FrN?@m&|r_chQZr3pH}^z-n%(n4o`=`A>pI*ZplA1QXf7AYxz zCvr=KX?sqYqUwQm|od*-d(E|ruX-7~MO zPs;awhV%+~ZfS{}KdnYC@g0?meb32G^S66fm!92QT>7be_1Za&tIIq}e%TF5iP)gz zPkTjKRhClbmHl0rTP8QHE^{@_EBkg+VcCu9ys}8sJn?y?Z#TJ&zpIE!NHUc8gV|@A`G5y7ENPB&<+$qN*C^ zF)>TsmIoV_pmR)}lZvTvFxnlzYlC z4Cn6yr|=hf?sy!n&igoLc+rW9{h2CXLIyTfjK#Ppy2air?Rk^Lw3p9o*+E?NdbRk>n? zJG}7RQRJ?47hUNtUtLuBZYbUo`ORlR%k^pc)mL&46h%Uj(1D^?FkS??eIaJ7PkN>8spQL?cUaO9jpPyM$ggoMPSE7?&vuEbqU3p~6 z_97mr@w6|lT~bx6#$UPgC{^JU)so%-b}OXitR_1-$>acMM^>m zwQ>XQKX~Fm^|x00kIqehf{UIf@!*%MvfQKwvMmMxn`a-3temm2)L82C$val|gq8it z1lb_&@#5bJYeiE|~$nX>yv1Jmnkwn=1oTM})Nh{BQHScTTRZ zbC)n2*Ze5xv1ffA&hs!9t`A;)HI+Ua@L2iq>C7Tf&}+}`N_`5@2d1&L=!0i>KRQB& zuzh81RYhw~$HZsJoTC++YCY}lKX}RdU4)ICm%ZLP@yUA=R&LM}Uvy&0ezyy>8X_S3b0_}= ziWhs#>%Ql?43fOay<#odLHKTW@sjeD`m5b7m632}&APckL^x-0#lpRn_ilzx(kODen`F)st}I3Ty23JCU2^FF_l#Xr^G>23-RZ2k>ks=fm)k?5i$1dQyl%Vlx36lyYgM_M^l-A5?xLdH zqE$tqwa|jxPhQ|Gde^+_sv&FI$M3#7@|~*<_xs~x?~lAvS6_F+^o)<69C_yEyPr;v ze=zds&38ld*$;<|Cz9Ph(w-fGV-HnW+ib4C84!74y0|{P`9!7Z2`>t{vnt)LBDV*V zmFxCrxwpC_?_OrDSZJ+SwybRSh;^3;5l=!NA-?bMvt^#trkz3fiCfftkwxp1JQ? z#qnVwVi10Dxw+w&lB4SR`R2$A^9vrhLUCMW%Eru>E--F8Avu2TksaF>%`f=b;+q|F zmT-=JOSoCoYx%otUgPslFWr5L{g&vsVA+}i>dL~xe_Sa!CVpL5c*Rwm@$0K3$DH4l zna?esTkxOD8Q~UhnNb*9Y23Bq2ZdM1%ND*B7ab$TYs7(-^QVohT7B8#bV1?OC0xPj z4$*OEDe5d!9T%)AEc|?p=s0dbFl`|Y@tB`4%y zP>!l*CY4P!E(g82a*WpLaU zbAMv;S$*H?N6uCA(&|HJaPx%&3xnpqLuYz4S)UfvYnI@lXj@lcvL0twpjPjWkb06@ zuZHB5c2P7X^6B4(XrJ80>vT#E@EyECC)J>XPst{mq>Z|5rkX@A)ue2Qan)cGs-dP( zI4K$lQD@V%E~X4MCbK$wooI;H(K>%oFc>t#A)VfU2XCQuc4ibMQ-+MfGU`whypfg- zyV{s+@VHDTWitzJ5@|zB@j)>unsf*6<5QwRcd7hzUQLTSe^QkPc_xeDQ|JNhqm@MC z<=uEV2S-BD`A$Wb5|XYY7@bzqd+1bHN=gQwvU4eo(HSkF>8uvhSY1I+r34eil+d^y zXM9XAuEZ6*OzFopcKDJ6tJ6{+Pn&pzTo$| zd{Wc36fP(2%N^vcXcIG^*BK0Qk_jr^3Y}uTv@&+N7CouGtl)F}lS#h{g#WN=-QPl!n-?NxiE zSyEC6O5+l3($Z;ZmJ*FBljQx5Cci1h+MLJ78(cBX2p=AlIl~!ey!&s9cC@|j^@$0Q z4mxNT9o+eyG_pa1k-PU+2ECEP18uJd7R?alXy>74137fg!98aN_N)kc!$0m8C={g8 zWGX<>E9oF+nfA8sIn#OQ8N@f8d`l?0` zP-i+?*g;(aNkrI`S|B-%(wGu7oiWA5I*sYsZ0ZeN-`RD*`4mP$(xqs`*%85A3{dm6 zaaKwx7pgt1E`9Y#-N5L=4Rp{akb@~Qs3IZtHRZ^2(ZjbM?@-N1Q$h_mHLVolfJ~zN3ayO&M4g zGDuxX8Xbf^$)=JpI(S{|P)s>aa#E-2G~}4kfi=;kp`B5qL)M+$$cjd%!6M`96v!}W zPHz`$l0s%TZwNh3qvvqlQ@w0)R;4FbGr3MO6cTN(I$h}DOh&^b2)znp3JGNT1(Q)?$P8$V$wiSFBBikqMmV1^ z3JxWVbB1sduZ@1*Co;K=)T8EbX_*etN|&rNDJf`xtaJvgrny;oR>PPxNyZStdN@08 zh-olYk_9WLJ84}_lRS=2Mwjips&k!OCZELR$s%ZKhm1KiPORQ@JS?QZsZk?%NRlyC zl3|jj*!|mot@qLxHbWX!wInA-(^^`YEvvn|m?TeoX|Yp<9DqP@uxSlkG0p@HHpPMi z#~_2`I3$yddE^r)MFbY+k;ZQ=tr`g|4YZlGQz6SDq3UcWSsFY<^yFoTJ4Wv$GLJ=3 zHVq*H2}&z*5UCc|ScpB=JhJ^Yqqf3iI>?%YU}AzkzPIgw;R|mZy(Id1RLK?JR7_et zrTA!ZTnW< zNjjh~I!T8Vh9qxkGsNhia*@{a!efUZn?Vpx_MZoYW&x zK_4Y`3ed0uTv{=?3k3=+x;brfDW^`UXs#5;YL$qFgLSAS$Z8cpOA6#FS+6M22?po1 zJAf=@XGsYac?y@ovCt1^LNV~usU`)YP*4~O$$aLQ5rc|5O(n$z4JD?TLI)S56tGRH ztLY}gDJ0vzb*5iy+w@eYlB32MLrH69+!WAKH8%N++&sK`F#3`Dd$KIrZadyj8Da+{ z%;9c36L5;1;4htRn@lg)rON#;yuLabS1(q(E>DBGi6B=>=Q|iQS=6aCn%hZ%+2D5< zekalKZgc}3XM3Qoplxa|+6pr6!x6)+enS;OCg585F`#*wA z9HW|!RR8}Wogu`v83LG&Hs|+XM{mjo{U&2dr&KR}3cnd$8dr@dh;STC5ZXExzo9|X zqDMiBSjy5cQAY)x83wUJLmkuzP3g=a4y(G}Y8M4pQSsK>b6Y zerC`(atL(aPY9hiWDFF>)2MwSF2ZUcTwSBRa#S-(p6GINl!$Q*V&~6`i2Z=YYVZR* zd5Gr62+$E#jLK~Ak#C(DP@O@a+9!DrHas<3U`?$@f}rg}x4Iz> zdUdwjsSAA(XF`QC>Wn{liHcc_Jz*YCK)l3+pihi}ePUMFxDfO@6DT9;VjP0nnddav zB&)}vIAO}=q{itY#zc*AI!Hn8V08@*mdQ`24lXX>N&8pC*{Pw z7OO^!$#@fFtO~tYjXQPHiUezL(nSJZO(+Ewg9~Dzk`*Tq!y?HA?Nx_0CMKJoogv83 zvRG6g4nXHka|WmNK#+@_tjWn85^DPFBg$adP16_fI-T-#Q zreN%(GdcBtn45e83ReeF05T_S`}W(QS2bLnZn$<3>`;dCOv`;x|I&gfLJ^?Vv_zS5 zmuyf{w_s3R3^--4WC$G^XdXfgsxvi!HH8PU6l8EeZjjUi;Z z2W6J+6b!Zp)UI|x8IU_g%HXTH%DHLGDelF-0yGbdoQ-fd2Yoq1S#@Z?Z=$HfQK^BJk6*6$mzDQmRfw-2aEUuPDl7-lBNj zN%Bf<8ahZ)($W7#iV^AiLK(MnlLR6%3CgG`8-&eIL5TKoW`YXxJ-kUJD1A@0DFWA^ zM993j1Or8bB19=EN{1Ze386sfBzc`8w9QpxUFBrQ%Zkx$Qyoe zKtXm`@r6QI_2(O&S;_a^w`IyTayR+lgW!A0um;0u#5RgXNRA8?GPE|Vk{onibr_6? zBf0a1O=;wd7udPX0_xnmZEjuT2rO=$;s+s&DKJ@IPTdNhh&f@Ew9J6XVht(X;yETO zo@cTYQPu_&d)2Um_L9jkR|o|16MU6e;6$DK8Xn7l$5Jq3$clk|NSQU;7i3s0Rt%e2 zF+%aGFe?ZO5XrUaV(;emyENu$dkOvIz%L z25RtspW5ZlPrw)B(<$?-czJ*f56!1|EeV`}mSb(cGYQs5=h41~6HpH@P;y#i19Ti( zp4?5OD8b^O27qe8)x{psYnx>~AXD4CCR!{XHHaa`_v|9tmTi;uh*}&MVNck=1rbfW zZJB}UA$R#n$&|`SCK>=GraZj;qS-8vK$wXbwjMAVTI_2+0Ml$l132*+-_yJ`tMvEf_=ip3m)M^rc4Gb z1vU-CC<8~JI+(1PJPVD3pq!P>^goX@I)&7oe{59H^^x z5>%IPd!V{XRGm*G*?)03A9&!ZuPjoqHRpZzT}e3b*FL1qkfNWT0pH%arUz$WSpbZH z{%M`sz4tPv^G&FZ(pzZbTaux@Wyr{qpAxcfLS1>2G2RpaXf(fU0;m8lmO9DfBB?}Y z)NZV58PJY=TG2UWTrnffBT69BJOoqIDGxPAf?VdTAWyD0Rt22Gu)+n#6wVx#Iq#6n z1;MmXx))QJF zRtIrqfFyNoBza`%@j)c87`(%Kt9_(^lkdhka$Q%`f#4&{2D>yE6HAZx$$`4ILD}n+ zN917LVWJE_viSHQDYJBtBs(__k%ve2R(r`oDtGkYgl9XE;C&s<_S-SKJ2wu<-nzrX z&pCIT)S{3;YDeROVbMVpRgEC&9Yi_k<;@P&3*}6vOsW&W0|*SK9{eQeikDXUc`w{> z(DxJo#y=VrDK90T6ut7e%3z(0@Ln1>2W0@!N>rpwM(x#DFR(R8r*8Xq+O7*gA0>A4 zUc42$Hr8RsA^P~Bh*t0;Dib}^_@mz+qISMTufk(J zr^0}dkkQsYBtD@RX9(18Bzo;jfEG!HiQ3}0!_LQL%AjQEk_7w0bxup#`IKN%a>CB0 z$>q461x`uHQ9BD%$K>o>j}RbF_bQZ^r2SCVkPOJsyuKNYUUKrAF-_;k!}NcV7@<%l z&~*(?9P?Zfzwf^L*8J@!p`9liYfWLKsV*oCv>h{obxnPZz?vKT8i70C*VlY3xc}NS zm~z0+!;-i5{_$VX_q_?kdHeS5%cM+|&hv>;U0tQ)CmI9b{p*shrXP2!(0Mu))`TO( zi5W`a%qkr)|I{wnzHpJyLYK;62D>?o90&J-q4YeaNBaadn#@gtv;EKZ;ienn}gIS-NxfV}@~IAN16CJ)Nkh`#B&#qMi(MeXx*a z;3tBPoEFb`qvT###0eO+a5D4)B}jy6VpaFiK(1j@3o!`xKGBfCHM0!o0C~_EPzEJu z0{F9hTAn5K{^s?DYKi~v4Y&WpCPPj;Vp3|>Oys?ix1AWsw&3oAtCTr_0={=lBRU|I~ZvNXchB?t)#kSv|T?QT*GJ?qASRK<%Wq>}v`9xybFfO#+-f#Jb` zuYDoj1PHH#4tin30dD1bBs##z{VJSJGT=_I>RYEsIOQ&H&1Gipz;nj+i8sRRnE}$V z1N51`OsD!L``AnR46p^MJqEqdlE|3AnSobhkoswR*zSVALZN&Z$3YOR!H)1`e8&~J zK-Rhr_na9Nou(XXxB>9LkDwhg9uCMcC)6<3sDBG6hiq`L#})XDh*uMUCWk4P;WQ+} zpxSvrBS2ONDaZgd$glt;L>_7KTzPv`WV;qtcVb}b|6K=41f0LaX%CH)42|dvuu8us z7eesJrwQz$%+LnmL;~q4=ToSFG5j8a`=PojArf^Kbn8pOU*Xibdp1BXP)?FVyZH08 za__yfBuo<)I)GgyUcmBF7G+|0n@rbp#*Y)KFilDbhV3HjIHd1H%LU*e94HN75#|x2 z-lc-N!!&Gur3;rx7Qh>>+F77yD9pw26DWWHoL-6pnuF&N1OSgA9p?yA+eT@5(M9ZZL#+7)3ISBpJGZbgGU% zeSjGpP`5$PVYW^G!uCrjTeohC#(;px5Je4WqxhDs%ydaW=^S0V)gD1d#}&Adj4lDti0rl9O>j;* zq4h!kh{3TW^g9hf_DX|nz)1`(VT^^|0k4Clj^o@o1i|^o$;X-)@B0l@YL_(J(U#>}V7! zZ^+$&QO%S!*?X3zctah=s7@(5R?7}6Gohbu%Y!c`=$Jfh-O2zFtwjYaDq!(4SPSgE z1t};`sDZ@`R#;|;d(c3MS}MzlLjiT)C6uvoxuuYyV`Wb`%bd-b1Z(6-GS9-M8G+A*L_|} zbZ6Kd6a%n3t>2a>!#2N*i__&1P%!2TrmfD7woqqAo;SZcBu|GQ1B)m{R!Qb$PgYt@ z3Dc$SriBTZMzjia61c99#-dgcKtO?}0a_x=01ORiI|cC|0c|J0Rq(?koY+J-0G^P5 z1cMrpB{zw;5#D@Y)Re9Q6NW#xE@Bsk`GLWq!9Sb;ubsNH>sg~9S;vmfNvpH9?xus7 z8kvv;{2%92h($HYyY*160T_@d@Z=2RL`Liech5{w?LleqL;2JtpQlO3`Up{GPV(I| z7)qb_=3`X!_m5G7zt@@H)B5kxE;t#~(@@j;t-;|VsD?SCS7-l$>XQ4x)jD1Ze z6k|vfV1z`A9>g`L+OI-(^`Nv9>MA^N(9?t%9)v$Yz|%=QjfyF$Lt~B9ZlPxn5N{wE z(GMQ~*5F%kZ;PizZ_Rb%DjUF<004+IjW?|IImMHE*W&s~EL=($6JdG{HnsRDG^n>J z5@6*RIELDZtW$)&DyC(i`%NGZA&u&qu%3|7Ypxq;xGvqW5zoTNH!N&qyG*&Txu+0FrMBaUp4Dj60?F-n4qjN}snyyTf|QUUg2kc(-?N0JWC zOOj5EOiIdul%#bi<)`5N(7Ev%XIy8-;dz5sZWJU+Dy`rUY{spGGJ+@&xY48VAHt7L zd?gwbgAP?L;~+M5W}`gpG`Kh6BgrIc}@!0#x4XnomkvFbYk2$A`ixRbOItfx%Y+WyB9kg6#d2b8UF`=@95s2 zOn#rS(^at6k+*xtPTsqb5**uT$5zpk^Gbf{TD73SuL+KI54#GV zc-SSrb3y6a2lUeNylH|XwvQ{gDNAt_whE53IR&LX(?v(m!2<82kK&t-S@^zVR$+mB zVPR>*PhfaH!4=$dQGs{i#rdTT7cVIF&nYZ@|8QZ!SX;h#*OP?>KQ#)x)t3p5eYrxZ z>MAsk9TmJ+&s7{H$Ar==o)H`a^9o86KU--`dzLZoc$P7LTfps}`ExdJW8uxedZ>_h zT=k25;}7$BN6T~h1tpjBj*FgW9J`*+7w>o>zx17Nx=N>C;S_GTf_MDsMVFCpE?C=h zJijdOrToINm-5A?6ZzsQPu_~U_Ia1Bdzmp}FXQ>e{E7pMB}ds3zU)7i@YLSdILC@# zF^0GqU@QrEF_>YpJkL=p@ zgUULRQPxM(I~VjczY&9{FAK;PR4<*=Vqs+ABtm(~xy9tfmS>;(6EfQelK zLn}^-=?piS3nIs*pE&3Z>b19_{6X(z`Ga0Mz4vyM9^8BTAJi1WH~J63!3oBq_9#H~ zI3ER@2n*kEvIdX96A-h`!TU%d@=k%Pg6QTQoKs(|Q%m4pL+A~qd*HFak*&f5L1Ykd ze*>j}^AyivrNbi*dB(?OJkTxssJLn(EDk)3z+O`S-Y1fWmkj>#Vs#t{y4ocP9fFVU zdW<=P;KNv(_bGVHq@K(&AzMl0(K*Jui6Y$0Q%!kJS+a#>{8~FL*DHYyIkl zB+iB(WV}lBdE*<208<3NGonD$XHB@F0CU`V?^(i!l+ zD5t0DDZnuzdQZ%lxP~Q5vZCJlx{eBnKQ{%lN#FOzBM2ctO?W6EcFMC6Ly33*VH$&H zZK9CZM`KX^Vmq%M*gH37g!gvstwfj#=cAb=3}Q~>DinE8MpI=_4>xx={c6eXH+n7^ zKrEXte0!(L1$`V`AduLg3mUG$-=3NC#6iR4VtTl(=lT6yjFyK)?jO4^iZ;w1ZE!{- z^4L+99Z?F50u>;;LmoWTu+w<#vB42s9JG47z)%L9^O-#x#Hu-8e4Vl^o7xM`plsTcH_x_Nqf`K;O1ZpM>=KZ0mzeAn{pboB8I8(dj0HWT=vZz^Ma9Au| zAZ)OG2rC_s3}SX5jbJZ#)l(@IS&$SigHZGtI+QdKIT%9Fj&Rq6Pnk(WL_!)P;>hUL zF6>lhf26{oohcD0jPHY|DysMpdh6ra0K}#7XsctIgU6a6;j}WE$|Bmes}5n2&@n|U zU1T-e+$N?1k*g#QL&J(j&~Er#a-OpfV-D=ivkx;4gVHN3r&7fx=3jtwX| ze6(BUvKSJUqb5N4B#s%;enAJ^Z-}tajAwp(0wI1R59<-oyq!gRvEay}BbN~Xn8~WR z3?_xkul@EzhX}b#7_B=+K4|bsAZOk`UnxM=~v8_MG4Y64Z5~jUz-3aT|i3LO8XZRWezqE^$Ov<0jm= zLhKM7MZkwMEg1W64d{__5-k(-5*;zPbAGQX&6r-_h#tVL0X2t)y2Mua9CRefv+2*ep6fYi(g zVw}(oCsv1K(+97oCh0@L=+z-c23%f2$9Q6Z@Hn7^0<4bO-s^aTN>jcAx;_*2q$Qui z2Y^q&A0ymnT*Tpek;$rrh!UkI99uNVj~G%@{@ez5P6X%Y#`7C`Gl;;=pl zV237ap`I)dwX>d1?WQqi3ScuW30_Msg540028x0{^_GSJII)0;2r1}{F}kx?qP&Q@ z!<_bu^OS_7L=zXMRT;soLK2VJz7}v9^w<8~aS?7t6EmSfvLL70whlBtC4z5(lH}AO z!n;PB+oCaP8kgdy5!6M4po1E3j|HEsp|GR~sYz%NFfPKh5l{{pifjiIRpiio@;QSk zf&WlFN{$qbPDjxAbS)0aDWJ0dWik_#I8*yPE>9Cr;tk`nDUQ8N83sTL4hGu@h7BK2 z3#K7lDWN z5qyr-!+T?Og{eBkbV8|*LW#yANJ2T!9zOB~fdJM_cS%P0{&@3i@axMoKz{|F zJOpWBND-Ha%8C;}dEtmo!;qi}Ujl(ju>A=ONZ5KBa@v2JE7FUMDSTYJ|9<5U&3luAi~v6& z*-9Pn1Ga=PWEqYG265vgdZpV2jR?Yt?=GM^g0w*6hm2@; zz*pZB6SLIBC1@#Tgtvv<|1>EwDyPm2+MH5_xQi2e${uVG>ar5RW+|GdYfQ2AF0VvG#fl;=e+JlYD0Oz&;pPxA17f01Xr zy_)ESiiB&OBJD*eC(4G~Iz)I?@x=hL2=v&xXi9~oL0@@EFI-X1UeOeK$;T%>_{I0a zv0&#oeASi7vAwc4kP{i1PW2*XvPTJ3N|T5hDY^$= zD0y?ez*m!8rfV=&lQ0h81Sfs#kW3OL30IsW3-2OEGR;D7Cz_wqA!4~@mJ#|0W#&tr zl(3Q}J865-@O@6Emt-lOhB*t(DWL!(Mp!)pf7PIbFJjC%>99dVCBec*zzAGyP6gau zOdwQ7f+DCSby_5vVbTs&|8i1plz%acF`K8K0|TB)Oo9RUJ_+V6u?c3KPu=(M(Dfrw9KfXvgQ zaQr~`QS1X!2@xX0vQ46)TrZI(0mMkbPo;F=Aw`SrZG#aPX@f*&u^cEwd3Eny>#KQy zoFn$x*}HeG*$-Q*2XJa9E<5q{5kS_%Nt|mQNQ=Ij9bLeJuj_rBJwBk4Do+V|MFD>Qnf?VxUsG}d|t4%O<2Vd=qdU(M}Uqk-DS0l}=f9pHAP zakz1XujaPl#@Yb#d#ijDH@f#Gb7XH7f=#M|Ob<@s+k3>|Bc*5hQU3PfUr}Xe#x9OY zNT@MehR`E0g%u_H3rp=$$pwT6EdLYOcr0D8d-J$%o!=y z0pAQsF?%t21~~nUShh4!zXbZ^0KS!+JUj2cJIu!5+nhYzci*)m+J!@VLptAwAR@l& z@G;#N+0n5l%;B&-*JG<4?1jZt0rzwC)i5{G?*_!gF6c5-4m z)bsc6zjy%9hTadE-tW|>>Djsyk*rXn^jO=%LBvL@v4|3DL{vX)+d4502O_lT7%Veg z=|iYn^l@r1iiHo;fQr`D@`-~N$Dh%cMb9)<8Ie2S=y8ZW_?}JbHX_eQn~uU2 z1)Li;7y%6>e8Wb(faH6%?s_g=&-K&`$=zI9@*6HA8|(9&8%+hXes9m3c*B|@I44Lj z-2gtHj^pS@3?5h@jh2H-b;K~i_QHXbRIl^_(4qByRzGp*-yflM7IHhd^P2umfGu^d9dN+YXNIMBMV)I(G+ldGbxVXBU z`b&G?+6muZH@=^fu?!Kg+FW~CZFA3@aT1vj-SwkE9^bXpIS23=3PuiaKZaZZ1{ZVc zXt@|e4!8vxjX@{2nbJ$_8f0;$4-6GKmh|G45h)6Nt{=_}m3-u)42zKB=tFIDY|aRp z2#ZG^hT&?bsxeFF?wtid3~HH*Q#aIVow<7k-YK7&rN*~!R64;km2@yjtEn0KiPc38 zdLH4BhmA*)nCe3Rl@gBdNRYnjY78d8n{cY*16qVe}T4H2KOGbsh4 z)HZ`fR2*v%I-6>98E96~?gtSy0Y6Gw3YuxkybF4OgeXpaK*N`^5qO)YsohEmJfYjB zNG&o!vHHT;wpCHZh-yJEdPkEqw)c+M_A=O_F?fan^kHEUBalYw5R(np$F^^T(TX64 z=&;()b^+yeI6E+qB;1lVKs#uhVDbY_J=_j9F~s`VQQj2cOLX?j+c2_=yKI%#K9N=o zHu}MvQu4NS@L1t0kODX~p?7ZIC~48e-W33tV5Gzm1Bc&-I)cFY_7|#YwiPh28cIk!1bro!sP;DvS9L&MF262FCwT`!pfzk-VMJAu?DvdTZF;C-mbz zyiHbL3~slkb~j%OogbP!fEvQSR5(9*f{=mLf~d)2!{;ja07(bks~EF*m<9g>jR71a z;b`!>>)|kdp%%b!G{UCY4q(SI#9DPqGu8O6A4SubbZR8n2g(Kpill%nQ(C^x-h!xM zB^Yob{3L)+7|9h8;V!y7I$QgHg5G|6A3wa}k<&HesXFQu%o=>6r}b@P45}X<`hLV; z3~a|=28e5YZR}G$8lt{CHDCCFbW_+DZb~EM8h{0Bb|H2w-5ByEprx>IjUu2mshQ#C zju+?$dX%*ErXIO}9G?x1IEh1hZ*_ng-CJ#v10k|LC%Bcb=Gq}Ma%j}7*)hsezR02B z!v}OP#f~-|Fh|;s=_W!P^#IjR1rc5AjqDhCYWfS~&{DhcM-Q06bR(g6KB4gjv{_05 zb_fA2LbbpT3>%M-HVE<#9%wnPM)pCv;j2$E&f__J7@j2RMe}#y2R_}#93Rn)n%f68 zU(Fr;O%Y$DxxcyA#|VRaZ}M^^>+A;nLZT|tdvEeFa_q2f!Ux01sagu1jx=}FI+HI@ zO+6}>?VvWNPs`#lAqZDQm>x-?r{j#VbI_b zK^+7bb`qXF`{VHF)~#C;@JidqgAYC!?G|&$7cGMQWl29g{2czQ2Y{*I&aNN=$_zIn z#e^cn8SbZv{N_?&VW5^x+4@9W(Xi6hgqcuCet7$?eBTxDJ^vlYfd<}j%O2jb zR?aW|^WOY|kw)H;XmTz5tjQ%_0Uz{pT50*R3k1hY7jOm3blLItG{M`FB{*(x5gbcf zOG`h>DJeZXy`*&ZjKYGMGs}Ft9?dKL%cJwmV*F<pe__04_{bVaOV>x zrPRfR1^+ly;%z^iU(f)1p zx2}1b-FftBHt+1*n}0>+5Rg%Qi2_FN-b6zwDM@@(%I&{AoXXe(s95pXVG8zrYlH^i4ef zBIo$^6_VqDe`)z;U7P90 zS*?{{x#=K<0n$pt@z>YC5wa>L-}0RJi|bF6)zIoAyTe{N*zc!bUM!SeS$|^j488r0 zgQr7Q`Pjs!j^_?EDsNa53AtSyrG-`vJzX~S!hqFCk2MXo^wJk^sV61Dr84=Pbg1x# zJk`}r(l!oQJ3k~<3C0eo#U8tI!0Wmrsot?WdI;qMx!Z3PhUHSy93NH-{n1i5gy7E& z5($tQ^Ddxy#!wn3(RhJ*Js&mY}=91ZJPgr;&jB094Ii;-{a;u|mq7;z}X{&my z{klR#Dhy%G0I(R6R}M(^W8Q5!4FgAby>s>|YxbyjTf^3tMGX45j(Ql^a!1`qY6E7z z&(80Y4owEvDvY@869b5I3%56;(Xt*K0n!9!x};U@S#9pQ%Xj9K(46YFgrxcG3k>T5 zxl5eJvnHgt$lO1$GhRKQG|`Vv{H^5Yq)?UL&_XR;cjfyDby#4&)Z&0So>GZX8O2_^ z>hyfg!FV5CU=r-b7g#K2iW!zwpYR|1c-sHS&{pZTs)6p0kPvBaP`)D*(pc zgX5XKC^#ZrN>Z)>8wjHT{3biEINq>gt(Sb5zkY6{*KO~8rWS>rMME!>oITr`#j#(+ z36UL(qj4(*K@(GQ6m@j)eW~59bH8nQpU@4$q`Ii{^^hxFX|lfviUg<^O}UC5~HG3K0}+ z0#vxGKykn*9`kO`Q|hzId!!~!B-dwF_DT(((x5i}rj!rm#@w#)sFw#BTru3jNW2S+ zWX87si+Qm=#V|=&13bi}(GK^(z#hj&@6cB3p$kLwecp_QzXpg!bpS6>sn;6swOJ2X zNUh1 z0Vkxm1#D8@8IBav0#Z6QJ&ILI2h{pvRbNn@BwQREawfIG|NHEFrI_MItV!N6u!xD2 z$fS>wD}*zz$`>@(luRK%tdx`XIE7TS+-HfxaJ0^0$E{hosAL0kwZ+-B+2y59 z?v@+5(e^~{X#4fmVWzf-bmV&uq#r?U(j(MEr?kPXjd!-al*wqMU>!*khi zu3w*j!)Q7SC&L{(p}7d3#xy%)5IlnlBCX}pYT+NXEE?##rvD*sV@a!X06Z0!5v{VR7w=llx?4g>tM8;em+O#(uVCh-JKuy{AzY`l|2_lTi-#t zhNEaJ-u!;JNg_?Ol8R1_h8xw8I@xPhdB&((&JZx$gqxw?E)7E5<6Qu7YZyk4P=0Kg zpC9Y$%4eb_MHXWoBUMN%Ez2vRa#|BbHV5TgRud--#t@phv|dV?`EETwiqSe?mNN7x zT)-|MstYQ;P=_eXRK1YWDkG%R@Hfst9ze6B&hB(GH&$`5Y$5VNluT#(FWa-e>CfuZ zM#QOEnkQGYNfP|V4LKgD8JCcp?o_z-JK(4$`XvNZW-cx(L7COx0jt7GA2exH*l zWaR1)k$$Uq0n&);Be+FD`MiR*P7Xc9F^kRvQmLEi_EPGqDP1JKh!&4cQy%fW$sT=z zpJ8-KOVt6r)??FcYA8XA%K@$CRMXOAN`{NDiorf{)P)?*A*Bhk_dW(nQj!UY#AZ$X z;?zlyTKZR1Lr@`w1V2>ID8a$?2N|ENM_U9bM}m349DbZ3KW4LpoQWW@cyEwy!h z`i3RX5NDS`-dm13AUBb55%Y_z(1;06Y6-Hg-hO_|aeUL}(@(35 zcVn(ks_U!$R^$Kl8Mihh&%fz`URnelS_>0k#P5A8FCzg)#r zs-t79qz&o$SDo9&4>}z<#MQ~S9oNx8WdLPE1*zB@UUjZr_enj^Trwkte*Z%_X~X%= z^^X@7+MIA%K6eR7#{ zdh=y{V>K|{AzF^p{miQ2y*RUII$CAa^D5nnd zbHq7bKI#Nra~!!VN3M!M+cK#wCL!uqk%m@;D?rg}O1orNpObd3-tWe71=+p@o!+Pgpj2wo-5Kc)gZ*yib?e={bcXZ9ds=6 z#lYf0m{c*hwnk}a^CNE8{IImpW6t-*#HR;34rjhcD|fDWmDE0t6)1s?H$?E!uR42J z%A69GoM1k}RmT!A(J6XEPj(@@M{KvEuJ}GD_GB93C@hGL>>=UB?HQZVIbojIBFW=K z+73rXiL&i_yg4`alI!(sm>=EidVSDX?j@dg%8a;kq9n49U2=_U;-J0}QjR?UwG5Tk z0w+JvoF95roEz*NorgltT{<}}PR{I&(@%m6k4%xpElvg6yI`3@(4dt>Co^u&a3Cg% zx_QE@fWH=(5V{HSSSdzq4gCdDNJ8f%{|HV-IS|hafdwtuhVpC7&L^jxlQ?GAy#tvv@H-0VZle8Gu{It=?d}^5k z^Wx79{fVelOm`|(uo9zj^uU;fqExYXDcmm-b3D7%my}#c`U9Vd;oAkCzpy((CQA%K zrfwFjj|sQjC$9`CmprE&N7K)@k@sTBgUWAq?d`D(6tK?Hy2(eNR`k|Un!oi8k z`I^otm42{8D05cf)q9`tt0$iO?oNxG!j1?Oith5(mz?V-`Xc4N$V3Q+%TP6~Vvvmo z%W7C2m%~_7m`~-q=mq}Ky@Vea6G}pdW*H7EBNH2YR^Nk6tIDOM55#-^@_PRIak;dD*^u|Pr ztLYPAZYzu~&2`2Xmsx4N$FBCWSD85Kh^t)+;YtU&Zl-p*X8NU=dLaaFWbJykkF>X( zpYE~!gKnbSOMuJ9L?}^TR9r9Ch`LmRi-mrxL?yFJ3K1w32V=UOblc*gmADFs?04XO zS^SlpJ(C4LYfPrqTsBbivTCg-d|@d3)a67w@F=euRyx;|vg!;rOMcULRHIBpMlB!h z`s%7zyZ&?){jLNI#$J|B%OxUa!%=i>ZfHCt=hgEHS-CQ#va5vgIqDtH4au0#uMbaj zV7+4L5ufgW%9VtBby^!D8Lhez7m&xQ!|#mXSv zLuKM$ibIUDc+_1}=>>7`C=-6ZD;N{I_;wQQsw3DxaoP^2t#HVLi=arC$i5tG}qql&Qf4Du>8 zQc#GqmwS!!kV5+qKAWJq6*DwF(Jbg4bQAG8>0Wi{?U!A0#1|XH+nc{ZBmU1;tA#)W zHZ}t|j`*%Jy-)IsBW_{}@VMpFgHE;7FM=Pa_nYOkI^C}q#&&j0U+8|xy+;`jqIT8o z+b{L=h_9s}-ifYn`zOZTu7^s)H2c^`ef4uXg+;V(l4zZ^)GcCkix?x>CADD^5hHae zR3E);vGPPrbNikDHGN`62Vo8EBVj+%$m2L^yG_stekNScX!*24XW`cK13Kb{YUL{y zYyAS-PeZsCni8jIxzTuhnmA5=f4JGmoG4g?e2j4e(V~qftt!iKsBB$M59ubwf)sJP zvT8`_v}z%3!L)!m-c{o5l%fms_g%Jig*Q@Te{$cl8Ml*(Czk~YZ%AV26+Mb= zULcg4p(p_S(Fw;KBeocPVGpsy$U7!?5nH2>Rq%KTKN6+fQSUn8 z9nC7-nIXpCtODw<&t+XAGRF$y7YO#O@fCjhnnva-KchB=jNC5u(5-Z*bpX|JCSf?( zr;5hSZ@7nC^=8AWDbDHllm0~N%6Ujj)*V)rb;9-15%v`XL%uisO`XB( zo5^r4D>wReKMgbhl*FtF3V-n1Xe8>HQMY-fKXxW*pYB&r4@+lytTQ3yY}fU{&cVxk zLTeAM2!&*6O)!te1AL#K?F#vG#MeR*;%gt=zqTv&RytlkYkTmp9{P{3=xgtPwYBYcuj*_6>ImPD z>T73?>7jwYY;F7SZ|omlYFBRZjYND|-ec7fES<}i=e@aG{7HKQg!LWB@WsD#pZV@r zd)GI+!{-ieZREPc#e?CUGq?uHM#LC`boTf+5ALKeMuKF#_auzAV4k|aHQOEbkG{D! z!J6ZGzvtEtJ`#eXkWU(zK-E%MAiYXu;q^Ur4Mg~N^N2IBdV2qE) zAc9LiWC>_PJX#`Sg$Pb1uEPpb7NsxIEdZE;?`R>lgmVO%)=}!NO(4k-Y14Jhd0}V| zu0n8MQ&IxPXRv#)lD9_+ny1WSkm4+ZtNpzL+nWAVj2IYq2T^4Q*e>EBJVtB8A?Z=8 z3}{6JE)OE(=hKTxIC){g<)G`J@*#OkFUTDtXIw}LJasxoC-+$wu5QwhE)jEBXfVmg z$#Q0skd)Mjs})lMl`bw2%lC=PV$4QtU;LU~iMSvv;)odkd0La0tAMHv`Uh* z$!7xen+VCyOGEwmoKXN(UnVlI#>u@W!(w9Wm&c3Q9(3p5ezx`fC#?lml@^g6Wt>9J z@ftMN*wm3z!P~Kzup){#4hlpTaN6|^ciwuCF&Y3hBo+d94b1`+6Ocp2`?B+v`9p$V zAAWewS{c20Me4+CHVKDbjNB>6E@P9jAie-{_Uto_$+5HT#I7(w=3rSUKO1g>O=2z* z@ymimB6>>XDiPH@#nTt{<*`%I<(B{9-`Ojhj?^T;?`Oa9E7KXuL*>>ZoS>(jmbiX4 zp`TN(Kz6^oD{!XKoQMC`G0(wytm?n&QGUH@+`hzydMWnVzp8yF*n&H4)FPVLM+;Tt zgnaf;@!kKs&O*Y@2Or=1f(_`x_y_-8|NhNj8N~lv{11QIwV~{p~E%K2~u49T;|cZ`7T4T*-Zb)FOBxaZ`kupvq~(~BXv`#$>3Gc znI0ocDMGd&8Naa#hHZ>yNv@Fi0vj2fE|1w7t+@1#z=9Psv@lY_46P91BZY`WGvHMU zCKz!R4fq)}2%y-|(NKhi`5PhfjFB95p_0Loxv@Q3gds-46@z{$MJI;`ZX7t_&#eK@ zeE!FW59JEi$2MtSTDXxP|G=fgN>h>}pt5#NLU&~#os{6(B4ddjf((iQnkre5FM->> z$Y*w#>rn#0;Z$7^!R=wQ;xaUXo^$~x{$$%Gk1z~Lj}WW^+5v{jD9n^Hxb@9~i$aa* zKv_HyBXNbYOp(pP4;IOZqj9CW8VnCUI}OsOG`t0F_#(S(wCC~VSByB~hegl zYFGGE#!74a@OSP9AmkC=kmF(7*E_;i0e6}oPRNAE<%?wJ#W0A{pEx@2gPRi)hr0~! z4p~Xdr{S}r^MiO1d=#Se$u`kb)<9PQ3k4KJ+^X&-AE*rN6A)Ps?|B@SSI~2YrT3&I;} z;YWzVy9SJb&>_e`1>7MXhiDz#lS-eRR@uQY%STE86|kn_VKHM5 z0hdHb#iZd5;b+11!Xyglf%)uDz@dq6XdmK+gE9|Yq3*?Io|NQ9Qxstk|EP#6!~vGr zI_4azh&Q%-TLW7TJ5BYCjxdl5EYp|BF9Ne^<`ClPmzT@oxS3Zo?M1qOhu=A16Vpac75hGIuZn2gj~a5;J8^3-qcNm zdm&^j(h5{@hxjO#iZPywyid?|j>WiFM6Q!?MjMsw{D`v?#Dkh6Ir?V@tB!mn?pNBR z8BQeN2eySMvMOVHosOOj^^@DjNXJbup zh?o&M4a^ACzV}Fz>c=jQB)V>-nxdrNBtoLV6fW&zT^swkC+eE~HQ#7&h|fL#?=0hD zbN4MJ5$A>b?saxa!1x&O0d@*@d{B`hnU&WqhJL3; zpDMYu;b5X2HXu{rC|=q~z@O#-uPr<3NENb|G`fRQ$Hl(PMFClZ-C<729f~g{B8>>S zB&bufM>cOG4DD&}WsdyM>|0l-PM*$uFR^p^@i~IYo}oino&CW-ilB zy}}d)3WmgSSkefltAt6Ad}N0&(w)hq$BLWOD}v$FoaAi=CBgBfVr>eZ2$0TUBD^Az zM6S~y^fi#1;ZRgv9maDqLiJgX_aq+e8nt# zpIVyN*kuNU_l>KpawnAlvYEV0Z4qi9+(BEu%Ng;pr@NI-TCFcV?7E_)<-;$8R(UZaZu{$3UPnze0FAk-q4W0;)|rs3H(?uBu3Uwu+1$bWi9G zcy!8T+ohqgJJ3EkoESVo#LFv}7k~NmHh)?S5=M7(okf6(I)UbrDlQ zh~x}C{}msNmO)NKpBLK}OH@ZiyFhHCTBmNMQlCB0mDG66`A|ckmHC{L{(RIg~{g?Z}cU<}S8%sk#jo3?;SuO=4h%qlvRpS8?75Lmq3P`2cx`xN0uWYW=T*l`6nFkf zvzUP!_9FVUp6DADEu%y>a3_}!;y8e+L?NE+BuF7>kvRyts8zCi6B0=Slc6M2OWTeRSVwR|N3k4uL_U%Q;=gcn`CSaG^l>VPSo z#E=QF78%c<7&$3LK`v~l_M=W8P{gx%|xMxOTzD|8FB%8eF8 z(h4M4aY}I&Z$A#Hf(%lS@T6=`SUN-t$i69L0$NdYnnp{r0i17syb>EtM9#FEbBQD% z@^Me#YiE`V7?xVT1CpeO>>?cw(JXW)Q~&1Rs9&~YD=$u+sA(ddoER#z+mO@8#6ew` z0;JMnaobSOp6ndhS}E9Qvi> z;0zGjh`0d#>7Tav@ofY*MAFQIuw~7QA>?{mwfKFr`u}V#ehhZQr3I1Shx}q@C~s`J zS|FREaPztOs28krMx2TGoXCoZ`vn1z7ZYX~1=5}{h!8XavIK<#YBFWiWT8ne6;Y%= zDjFP6S> z7E6Edl;CpaN^`oETYiL4VeE@aYTvBr>I<=eYs3rUx7rK#hkQWq2_ZUM5WO z1e#qC!1B8hk33#CS>WiJ1_!+O0O46m zkbsKK-5X|!Haz?7QGTqE_qVUT~ zyJAeFzZdVxR@2?_?hVy!PrGVP1lzflp6nFYH78eJN9BDnkvQ*CrICK@$H$lKN2DC~ zqZ-g-DF6CGYyn|F3Z&bj`G~G5Oh?2RGCPoIjGNPl<;8EtA1126AYq$)J z_@m)CGXaP!tBIJfhqdY9eK!t_`o&kCK32I4S%X1h$Q=yd8aErtnO=)$lV3`;VbOT5 zqneN8pmf1iPLh&ZhKdRqh>hf{5F959e$w$PD zU>8S%$3Q?!+%TDQx^JI4ynJj{C_vMC$Fu93wUpq~tbtJ%U!d7cZm*FK-4ULKdUF?&jUs%W31*rSMoU`*h6c{oT~40ff3sgWI#hp8Z-4E^A9M}X=lI3r zmwh);%RIJ>1{<0``Oe|4mmj;q`_<9I8{L^>69auWBp_`_wC}np(NN>G@I#iErqOy= z?Rf2`tv+5nbUi6DckJB0{u>hSW_G&`agBYCc`Y3^Mw~=kXsi6%PSjRUtcRu+vUMSP zQ;*C5lf~^Blt6gu_O-o5WL-29Co?lze!op@Sb>l9=5Fhy literal 0 HcmV?d00001 diff --git a/src/bolos/cx_hmac.c b/src/bolos/cx_hmac.c index 5f59176c..62c6f47e 100644 --- a/src/bolos/cx_hmac.c +++ b/src/bolos/cx_hmac.c @@ -2,9 +2,8 @@ #include #include -#include "cx.h" -//#include "cx_utils.h" #include "bolos/exception.h" +#include "cx.h" #define IPAD 0x36u #define OPAD 0x5cu diff --git a/src/bolos/fonts_info.c b/src/bolos/fonts_info.c index 84f94757..5000566b 100644 --- a/src/bolos/fonts_info.c +++ b/src/bolos/fonts_info.c @@ -94,6 +94,25 @@ static void parse_nbgl_font(nbgl_font_t *nbgl_font) } } +// Parse provided NBGL font and add bitmap/character pairs +static void parse_nbgl_font_12(nbgl_font_t_12 *nbgl_font) +{ + uint8_t *bitmap = nbgl_font->bitmap; + nbgl_font_character_t_12 *characters = nbgl_font->characters; + + for (uint32_t c = nbgl_font->first_char; c <= nbgl_font->last_char; + c++, characters++) { + // Be sure data is coherent + if (characters->bitmap_offset >= nbgl_font->bitmap_len) { + fprintf(stdout, "bitmap_offset (%d) is >= bitmap_len (%u)!\n", + characters->bitmap_offset, nbgl_font->bitmap_len); + return; + } + uint8_t *ptr = bitmap + characters->bitmap_offset; + add_bitmap_character(ptr, c); + } +} + // Parse provided BAGL font and add bitmap/character pairs static void parse_bagl_font(bagl_font_t *bagl_font, void *code, unsigned long text_load_addr) @@ -183,6 +202,7 @@ void parse_fonts(void *code, unsigned long text_load_addr, case SDK_API_LEVEL_5: case SDK_API_LEVEL_12: case SDK_API_LEVEL_13: + case SDK_API_LEVEL_14: break; default: // Unsupported API_LEVEL, will not parse fonts! @@ -217,7 +237,15 @@ void parse_fonts(void *code, unsigned long text_load_addr, // Parse all those fonts and add bitmap/character pairs for (uint32_t i = 0; i < nb_fonts; i++) { if (hw_model == MODEL_STAX) { - parse_nbgl_font((void *)fonts[i]); + switch (sdk_version) { + case SDK_API_LEVEL_12: + case SDK_API_LEVEL_13: + parse_nbgl_font_12((void *)fonts[i]); + break; + default: + parse_nbgl_font((void *)fonts[i]); + break; + } } else { void *font = remap_addr(code, fonts[i], text_load_addr); diff --git a/src/bolos/nbgl.c b/src/bolos/nbgl.c index f190f55e..fbf9b92c 100644 --- a/src/bolos/nbgl.c +++ b/src/bolos/nbgl.c @@ -112,17 +112,24 @@ unsigned long sys_nbgl_front_draw_img_file(nbgl_area_t *area, uint8_t *buffer, uint8_t header[3]; uint8_t compressed = buffer[4] & 0xF; - if (compressed && optional_uzlib_work_buffer == NULL) { + if (compressed == 1 && optional_uzlib_work_buffer == NULL) { fprintf(stderr, "no uzlib work buffer provided, failing"); return 0; } - size_t len = sizeof(nbgl_area_t) + 1; - size_t buffer_len; - if (compressed) { - buffer_len = (buffer[5] | (buffer[5 + 1] << 8) | (buffer[5 + 2] << 16)) + 8; - } else { + size_t buffer_len = 0; + switch (compressed) { + case 0: // no compression buffer_len = (area->width * area->height * (area->bpp + 1)) / 8; + break; + case 1: // gzlib compression + buffer_len = (buffer[5] | (buffer[5 + 1] << 8) | (buffer[5 + 2] << 16)) + 8; + break; + case 2: // rle compression + buffer_len = (buffer[5] | (buffer[5 + 1] << 8) | (buffer[5 + 2] << 16)); + buffer += 8; + return sys_nbgl_front_draw_img_rle(area, buffer, buffer_len, + ((colorMap >> (0 * 2)) & 0x3), 0); } len += buffer_len; diff --git a/src/emulate.c b/src/emulate.c index 11d06c61..0fb60ae0 100644 --- a/src/emulate.c +++ b/src/emulate.c @@ -48,6 +48,7 @@ int emulate(unsigned long syscall, unsigned long *parameters, case SDK_API_LEVEL_11: case SDK_API_LEVEL_12: case SDK_API_LEVEL_13: + case SDK_API_LEVEL_14: retid = emulate_unified_sdk(syscall, parameters, ret, verbose, version, model); break; diff --git a/src/fonts.h b/src/fonts.h index b7000588..b4e13f5b 100644 --- a/src/fonts.h +++ b/src/fonts.h @@ -81,7 +81,7 @@ typedef struct { // (They are defined in the SDK, in lib_nbgl/include/nbgl_fonts.h // ============================================================================ -// Current API_LEVEL (12) +// Current API_LEVEL (14) typedef struct { uint32_t encoding : 1; uint32_t bitmap_offset : 14; @@ -98,6 +98,7 @@ typedef struct { uint8_t bpp; uint8_t height; uint8_t line_height; + uint8_t char_kerning; uint8_t crop; uint8_t y_min; uint8_t first_char; @@ -106,6 +107,31 @@ typedef struct { uint8_t *bitmap; } nbgl_font_t; +// SDK_API_LEVEL_12 and SDK_API_LEVEL_13 +typedef struct { + uint32_t encoding : 1; + uint32_t bitmap_offset : 14; + uint32_t width : 6; + uint32_t x_min_offset : 3; + uint32_t y_min_offset : 3; + uint32_t x_max_offset : 2; + uint32_t y_max_offset : 3; +} nbgl_font_character_t_12; + +typedef struct { + uint32_t bitmap_len; + uint8_t font_id; + uint8_t bpp; + uint8_t height; + uint8_t line_height; + uint8_t crop; + uint8_t y_min; + uint8_t first_char; + uint8_t last_char; + nbgl_font_character_t_12 *characters; + uint8_t *bitmap; +} nbgl_font_t_12; + // ============================================================================ void parse_fonts(void *code, unsigned long text_load_addr, diff --git a/src/launcher.c b/src/launcher.c index 8e114d7b..43c962a9 100644 --- a/src/launcher.c +++ b/src/launcher.c @@ -450,7 +450,8 @@ static int load_fonts(char *fonts_path) sdk_version == SDK_API_LEVEL_10 || sdk_version == SDK_API_LEVEL_11 || sdk_version == SDK_API_LEVEL_12 || - sdk_version == SDK_API_LEVEL_13)) { + sdk_version == SDK_API_LEVEL_13 || + sdk_version == SDK_API_LEVEL_14)) { load_addr = STAX_FONTS_ARRAY_ADDR; load_size = 40960; } else { @@ -668,6 +669,8 @@ static sdk_version_t apilevelstr2sdkver(const char *api_level_arg) return SDK_API_LEVEL_12; } else if (strcmp("13", api_level_arg) == 0) { return SDK_API_LEVEL_13; + } else if (strcmp("14", api_level_arg) == 0) { + return SDK_API_LEVEL_14; } else { return SDK_COUNT; } @@ -818,7 +821,8 @@ int main(int argc, char *argv[]) sdk_version != SDK_API_LEVEL_5 && sdk_version != SDK_API_LEVEL_7 && sdk_version != SDK_API_LEVEL_8 && sdk_version != SDK_API_LEVEL_9 && sdk_version != SDK_API_LEVEL_10 && sdk_version != SDK_API_LEVEL_11 && - sdk_version != SDK_API_LEVEL_12 && sdk_version != SDK_API_LEVEL_13) { + sdk_version != SDK_API_LEVEL_12 && sdk_version != SDK_API_LEVEL_13 && + sdk_version != SDK_API_LEVEL_14) { errx(1, "invalid SDK version for the Ledger Stax"); } break; @@ -841,7 +845,8 @@ int main(int argc, char *argv[]) sdk_version == SDK_API_LEVEL_5 || sdk_version == SDK_API_LEVEL_7 || sdk_version == SDK_API_LEVEL_8 || sdk_version == SDK_API_LEVEL_9 || sdk_version == SDK_API_LEVEL_10 || sdk_version == SDK_API_LEVEL_11 || - sdk_version == SDK_API_LEVEL_12 || sdk_version == SDK_API_LEVEL_13) { + sdk_version == SDK_API_LEVEL_12 || sdk_version == SDK_API_LEVEL_13 || + sdk_version == SDK_API_LEVEL_14) { if (load_cxlib(cxlib_path) != 0) { return 1; } diff --git a/src/sdk.h b/src/sdk.h index 6a4e8f44..263c828c 100644 --- a/src/sdk.h +++ b/src/sdk.h @@ -24,6 +24,7 @@ typedef enum { SDK_API_LEVEL_11, SDK_API_LEVEL_12, SDK_API_LEVEL_13, + SDK_API_LEVEL_14, SDK_COUNT } sdk_version_t;