*Yr#}MK8T7(YGZ?d-swwy(h}I*tO;+ zbVh@iWR%zM1Da4UVo~CJ+Kgp+jp2lCXmD;SUc9NKYQ4SeajS#*dbj<`{Ne?=dBpzL z^z{Ao^uMKR*M5?B)AQ4*rQ6#@*AoZYt;hub|F0=a`q_C1G|(IwDX@)$99|Mx(f7jq z_U21|rk`lh-5+*8EDQ{T59Rjm$S5coxW^j|-uPr;}t zrLQrNNC~DGes7%ELPVj&P~xggroF}g`4+E0LV$hCm6^LZ?S*n&RWhFf8{*{3$Ir*f zi9d&AIzf+%0HX?~gwNaEU?Zf@0{=l&)W@yNrlJ@}j1wZeK}tr3O*N;@sfUz|dwg{Z z36OzULKGovn @*3$U@|N%-+lkS2M%{g4Cb0%G{wXc&H}VnE^R2JDK2kgV3$%=3$jA!HGGwmZH6 zx^z)js{vS;h%(WX9YHsFA;J$0qML*c*@Y4WiN3EVHi!r)nQ;_wy45c{Q6H*JpJIjv zrcV8QlC*f>&k^tz>X1r2*#Gl3@bBNhZ;@lOizX75mzS+=g=X!c9)bbOB{k>}ayS_| z{NkTey*CTEU_qy-DBRHhhBn0BV$>IDWnW!g#V9=eQVEfTkU}}-5`!a#{{+2KP_T<< z+!~6ySlIN7tgx55J011!eR!E}-WMpn)cU-8!9;zd@7-Go*T&`h?&9UcD<6LajODX& zy`Fu)?ZSLXXSNwe`f^ I18Fe2Q>X&a1F*N}5@0gi zv@shMve^#A0kgY)!LfI?wzipX5bCG}R11VImR`@{59pBl?4MkTB3`GPTyQvCYIHj` zn<`GwD?>3jR_aqxX<7Ii=95;4M|BPPjr4$TpzW*qUmGV^cF@BwgMLHnPR-UH9+!^~ zNGFr%MWxh2LLbLCzv5KivU+mW;=ehZy&-K_cezqy7f3`frSKYJQ@|%g=YM-d9`I1* z(V7t$7&r?(McNEd+CR6tC<$T7^l^&gJFnAy(KvsP4!O>vjPrzw3 zR;bCzJ-7l4Ar09|-+b%@v4Z*B8a??Ez{C8JNlduOl58Y0iN@Zg9~0ywhw}*E&yS7< z1)<}wEVT!1?(W*W=}*Ow{cY^+eKQ$N{o+_Cq4*yPCiboiFXZ!gR->QlDFiFD;1i%4 zBsOB(8gg&nzBOk<7zuJrPE5FAYaFjzZF({77m4`YUY GNx{371&joBT2_> z;#QJ^q&4w!#pgJkC@4ZvUQA20_l=#)tT%KFrt{`v6x_)>xWaP|o%vZsg_JGE7#IRj z8!IcTP`>kb93c|4LucH{#n{`-m8fTm2ph0(D7vTKnW2JDGYT$wa<4!S!xgrcRZDOY zp_W8XH2ny90il3+7N9i2e@||lH2*%h@Ne5V@$ERcXkFd>n{#7q@*j)CdKULHc7gVC z6R~9%Q6tZ_-(Ok-?FtxP>lm{H6=#=F!l!R;Zr(~W8S}Ux|5ACv3qfeG&)aGZuO3|* za%&5Z)&Iiu??16LHCvd;qh-G`%SIQRc0)S9^0~S5d&minr9<|R z0=pV|nbN DXJ%%QAhdx>|IrrY{zmrEp;;85j9O^4o-D cziSe&H|D?1yhki&toYm#$`O=9- ?p2o$) z!*YFda{!9!U^SMTn_G*6pWi*hrqw2nhU|}v+eAoR=Z{# 04t7URP= fSdcb_5d?*4ADy7ns(O2nq~toIF@*4cpb?pP!ym zhbpzbw>i@3**K9PBOMzGf4O2=z^MMo?>w#jAL1@Akk73+#3W;3VL?Bu!R3hlX %V!&(-jIPI;Gl4BcHhUBnUV~wH_brH9Vjsn(phfr-pAbf3 zfOppUs@e5W)tf?%?O@8>+>uuXON2564kRM!f8aM42d%i >7!?G*Wd1=sV9HNXAS;b{TWv|BwQt0p*pQ{5xbw<$jsL?p*Km3a4`dft z*XC*PF(IN*N?Mq-be2q3y}|xsmXePd{oUQ&P@qy9*D#l@Fc&Il(zv627>=O%X9lab zofR}Y-d-LNLC(_>Bf3l!Ryj)jgeZ;nP>|5zyF_LmKX unjBwgII8CO*(|6VO&u?iM?bI<-i@5{8Dp6l0L_%6Rik?js5WI==wcp)r& zA-Fe`SC7rtO$`&4r!re4wBUAYAgNMkCH}|%b-+_MiKxqjua_JSYSZAdgG*IamBF4{ zW0^wyA1<&>?Oa9E7dc5IbPL3`kxtW3qo-7`#dq2v!|H{nsQIIwX}TZ6IxC8ci+752 zI7x%JbsfpF2P3yqwT7ux^PP>fwI|!b*Ta;q6$^4Lrms^8OelSxrK@HZt=#mF4~g|g z1VWATRnxCG$F+@oyLZm+!{_a!R52XcKgac%@|y!F=btdNF*-ads@1?CxUGwE8bJ5S zrxq#}7r=&?*5N$g?Ca|rrMyzJF=jt-5tRrE3L4tl-M!URjBARr31d{GX>>pEo1UAS z)6TjfJQmLv`zVWzG5p;8j}O=$Tu)@rQ%Lsr_gmOVBcgH)xHvmkR%kI$@Sb;Pm{&Xc z`ug&G?lLjYF8VG3+jzoqn|ekg<#)@hv^8$#8r=E8?#|})Ztz3c<-Jw_lyz`m;Fh=z zCqP0d&9?SC>zq`Yv?1IHW*A#XrT#oaK6YQor00nPd*XFjeSQ5aa9=zxLfaN>POH|F zdHT;?-vz|P8Xqx9tN+8jn4Z4A(a7)fs@mFCf;KtW_%K_-4G|V0=@h0h#I$=V8I$2a zfMafEh7xipm=Kn?7WdurW8{2@3g;XsX~CV#b=pZE_k+Iu)XPkq8tO7} by zzc`>#u?r$XA`f+uV^zHIr)*1gLsSS#Sq0MkN8^k(K%VpE_1f&lpY)p~<}=c4ykW)w zi~vnY1mqud0Gcvh`T}wiBKyJ1%4(agWBE{uuX|0Qx_{Y$dUJELj&gg=LM}a&5eZ2J zO(lQSz4KGBY2|c-m$x^*jBqzU<>lC~LE%Lk^uyUS%ao)qy(t78DG{?cdF{g7=!=V3 zyaj17;sGcD^Z`r-Y|LcU5f3d$^q-HVnUS ocP>O(?8%H*GZc?d&OZOF)=ZSipMSNKp)Uq0HFm!F@{hLEaMuPZL@Cr{`+ zPElnftd%)anI{$%6En&h?|KIRN(sO6X<3C>6=hPu5yreCpVJR+^f5D7pJKbF>jySu z3?kJ*TqX382xPD7>)S|zX|g{>_pD0ky?-wm %i*ejX3SlhXfv4woL|hR1`O)I{$r%IL79-ALWxfXNqxSvTW-p zyTPKZR!WhM`P7k4BfOBAQPFB|Z?74; zF7v{wC_9EmtcI+uY<#w^rKN>TX7M-W_%PMDCFPwJ0PQT-_jaP?m}AwEwVC!$>z+&} z+MIeK20K-%-DjDW#>dAGWQA)two|g)y0Q< U8^H&yHx#zQ%9_ zRoIXuO5xcsGI?$`eyoBj-qz*ODhr9cCzN3gt$T_=7UONa1$wM$Bmz3X*Zqe;HsjB_ z(_&gm%7502!jxfx-whLyx79gOx j31W@05>QjH_ z ib1emAJ(Nd`Mm1#2qW5_cbGbRQL7$afP|y4lJKhu@!TPBsg}5 zSl)9Q)MZkfi>b(pf2wN9RN-YG;P?O1>}y!!d&!_8n8qmtP6X2EfXZ&0J?kTnKoY@U z`U{9?4j`gTa$>0x_`=mm`1tsA)w6r8o#fu!0lxuZI}_bAN}6pbLE-E_Ru`cbQl+ eJ<=wqC^cIW#cM@Ms z=`rX5qX27FPOSuEpdi&g@4k+5)hdqRJHLAeYI<2gkCJcP&_*M2n?80($6y@e3nA7? zd5jkjNN}t^w5hhaxmkpt|JYVHNlH*i==}NS>gU#-bfsTpCn)+1#xXt5cO67#s LDFA>RWzeROEVW#kzWWSaQh?^|f--)GWbsy*hh#s?70;Ev*V?C!y+adV)>k z$Ywmj?)M_p_Z=%MCV>x)$L|BBjp^XKL6G le z+^)w8-@VlsYuxvYrjxq&>7J@!zYx{gn~pm45C_O)@j+ZMZUiq34m#zJ>AmwGjEejW z!AR1D8eVIsTce{>9X_BxT;fJn)Pi}P%~n`g*%Kh$LE S0kBKYTI)0qHf@mMJxK%h-P?Pa`7!Ovrt+s!CvT7K)R~A)EMgLSJ8zmpN2)h zi8!uU$*V~sY0hgM+ Gg)k;o9b%Qs-1JOj6&4%d!s7n{XPVxRF z$#K}coj*=n$*`t*n(7B3aq*@wzH`k2U!CF>2XR_|h?W1zbG~ >fcL%S%rzyKEzK?PkY*wXYKQrgJqI= zrC%; z%R-9RhRmsNKCY@dk9y524C!HWad8O)z%vIc#$j0Fg59)Fp((FEfN~SYhM>z!Scn$Y z> Yhg3I#0Hlk%pt7^)wybdlfT>X7rR%s?x$Qm(1(*nT+sI0}MDxRp1kPft|~n zp>~_q>%+G03!eEv-fGeo%WomV^&$(7eFkV{3lM^M0C{(( M)(ED0xOWj8n9p>UeMHi^8;m~IC3c ONGB_UdzSrZuIJ=4h3MXHs!?wAj9v1r;r=Bmgh8=!e`I3`X7LDvX2@5VUNw zch>Uhd~4NN)P__4L `dZgvnc9Nz*TZlHsq)CV{#%UfrjM%CN=`;N)Tjyhn2X z%u7topW693jx@g1fHP!DK|x^wWoZK@7_yVaiWQWqTg2~cI(Tl&0 X2qNj z`2K{nyKil6jra#@Q5mLUoJSr(nA> 6nkK;N!S(t2a0ZX6L#vj(-u494L*=uy!%n$JedJ%);W2 9Hp&P0BHi zyoZ!@c6Pc?+te6A3Yhr*W&h(`z;%66CYESfs9_b9!Cub)?ytPg^cx%0E|b4?*-LEL z!fR1!b`6DL>esyRT^_ZM@jvAW9^2NWf%9PUoSi!z4oW!MpxmC04UfRnJ<#jUZtjc{ z8MjUfDzuW7m>SQUp$V;JsZ&BoTEt9pZ0qb2@ZAXog|g-Cy(KOCml(@pu3~+d @s1)Pn=d%~vWudj%|cX9{&_+fzGYPHVqsZG>i}+D$8eph8wWe+l NOIM1T`jU3F06zDT^145wcC)0|19A;*nyXuz+ zX$GX&>M$y92h@ZE2t+eeYrl90LtLiDew@aW@GV)No19f>i{ztStw)jA)_gA8!&mTU zSO1gQFZk(;1($^ZY5L&~@*Di_slO#PJ?t0^>40-&?rm+oK=OThV$P>0`V&-6IyEJK zi}e=JFYSX{rX0eDe@Ol3=B7o2P`C8_@L^e8gYA<&bzO+bS7_+sK`TicSvI%ZU}#BB z&T6Ok#r~bDgS^PeeqF2PU#M3XohakhoyqDPBI(yDMipO|(cp1`( zzjeT>lT0Be_*gkz849aTTWHe%LW#-H2tD1Mtvy(`tG$sZKlBqsDy<2hKJ`*yvkh#> zq7wF2Q51!bL<#RXFE@h7|Z-UabW?J|{?_ec55o>+WpQA9DS#N$tg~Ep3dsRKP-U zX~XujIL7qyV K65U&F*aMkBc4 zyG9TlJQIA#Pfm1zD1dUv1}UH2v*k{<2GYlcelt3Q>EzPV(&EdUzfxl}G+}lK%c}Et zBU`68Gqbb)NbxdjPW87E5)!X+{#uZFm0zYp?|dZ}OUfOD8XFp}dB@}<7mG18t9AYn zQDC5y!XxL=u{U}n`Se(c|CsZCEwmA$;!af3mHiLw@#;q`1q6xazh;%Lsq^RoIr;e; zcYr(@NM;Iimy20+J7bB*D22GUl(0F^0;=Yr;Zu-;d|W;P}#|VP~_+D zzvQxqbs xE(rm(C2Hqufdl75yX8Ox#-)m)z4Eh|EybF}D{&SNjxyS+Lw3X^Y)P%k9@ zW6BSowsEW1;bdk*3@kf%=;`UX0gb*BbeMp|8xQe}NnAX nH~Y zM~s!sKMHnE1~F05Yq!0bGj*=kVoNHZFCPKDtyQ&u_ZL|qbszd?elQ)P;^IDKgJ#dI zIkpZC{51tA(}UR&l*qf 9Q}nD!u|n!$tS+>oh3l}cW<~-G5pwtgnydDEB47$x zIXWI?18qm ~gT0D34JzY+MIH5|rz zx&)LBk%=KW)S~eVIWS7vd()L0wLqJhRwLQk+3|kMN}LMnl26pyN%?-14v?|~qobo$ zXr5T5@hk`@adp+E1w=*7D~<$F2)Uv;AFnCC&4yhDC;m(r**!i!_RWTEQoFEeD#*Vd ze)+T_={4gYTpXOaI#4kht6m!l{v988om^R2fqyRI;cFNpM=znq3wy8vrCbPrIPZq} z{Z*imPBIdPqntWqYa)yXnc4+DkAR2nWMx^*b+d;%_(Cq wc-Ez?T=aIvX5kDEMxfZpWkGzyjwXjQs69Hdet!P|Ed7A zLoYb2C_z)QG&3{%w+~i*u;goJor6`Kk?mU4pmv}+pWK}9-DFW q!ox@LvLB&g2=Tj_Jg2*zSl@PIbAH z#TsjBy6 hLLd_T=Jb__LAB7QTQrgLT e&wH!Yc1=V^HrnA<#p& zO4&%hhN`MlP2{U%jgKD+bk!m)$*+cVA 08mN0ci6n*~tFp$iRZpIBJ% Vtz_Wvfh|-72he=Nnr67e*B+QyNI8kFg z$-U1!$*!obqMa|B&1-*n*SzNGAK$y?-re0TNfV_&29qrHz_}*Sh>74GbF^msVHQ{J z*o* e*IdOpv0uQ|Dxbd^Xq%Jd4o61 z@%g}@T1=G)9yHsbqNeuYb9tB#&5J}N {eI5yO|Ql? zW{kSt!<)MyDC}Jn5@gHeI(gaQ66qB4OYpTxayH%=)7}OBSn{CJC4T?{D2DdGf8GXJ zT?lmm-vsFD)WJ%|a~)F_62Bp=%MKy{TS}QOKe2u6e+aj-qAf~*Ip{jpeh9_)ikGCj zpKO$|-ys1f`7T;9Z3+ UE$z}<9iuV zX8Ps_FcXHCwab1A1;`a5V7&>b q)L**&X*83(_CqyGSmx??THxKQi)p`A0y#nmJ6*#7m%3l3;jpmZB_DaPsy3jYD9 zx~Y#}&Z)JJ9T1{6c)LrB#xuY&1U*|jn}^%cf{1b(MYx-MV@Mei3-5_Gl*jPQVN@(D z(?ow|ZN0-+FwwL(jNJQss*S)_EQ`s)Lpm;3c$|I1LF63B4*M}ZtJVNs ?Lt5 g(41vLF*>iKe@+bY3n`5?0YjG5)72k0h6HqpG^t<>v60` zlTTqcT!EkKeE}|Vm(28k!LU{fy%l})sg+y?!x3mCMs#>#tHZwiSO0!+|5`l)U1pR2 zbTyRGW$RlRlaH;Cm!^(THyCc8vAJnvY4*fa+4@tmpzBZdC_2`{T`UC15P3D)pVDnX zFm#KLeyd8YOCw`rWAJCso-KZ1Ed2LrZerrxB)R{LE<~0A&ybLlulwGdi_WH7#}BAq zd YduLudVCIN)_9*9Of1hS%5i4h7p)wzoiNd*ZbJTo>mtp%=S09d7A zG6;5(cAM~(`nBYG`h%)N2SDYV4j;Cw-LXp{UqVmGq8-O&Nu89V<&^p-5~VH7$|)>> zyPxdXibnP*F+qMETrA=&MS;$PC;K0X(XAD1&hEl4p-1qojBv`lhCl1)xRmttJ4~13 z^${_th86Q$1Ky(kOLYPVqU?IQuc3y(ndKP9d=_$sVk+OP0R0^t%QA=sp3tqpoKd{_ z`(J{75gigp7XSzw0CDojM_IfJCb$4%gS`Zhb@&C?E~hHsP*6erhk+rO(q7)qdZ(3f zhXle>=mX4t0OrXiCvYp70cvgI;BY7mAb>p|NOZY&7a 7m?#*aUqDma z|4aDO{=b@ xNIe7mKh{ufqfm$sF-eMzKu{1Cvt~M z@26Uq)@PTL?7hWgD0><_=3+U8kuYMzolF%2j8UK=ME;BDBTKd-a?I!YEs(DIpl@!z zfo{AaWKub8b*?7Agu8!jlHkXqWDL-jaw^(-;+c?mx~lW!Gx)z8;9P4x{rW}{`HnS6 zxm9hmzOO%;KjR~Bq6Ufl@<}-c{p8}}Vm(NOXam(n3}#-#&-H!&4SS*}5nfmi2n3>0 zp*t7#Ln8PT0EK4l6MjD@5=r+$;MblCSX&JJKlS4Va7}O(+3Gl6HA@CZ62#TOqNn!U z!jjrMIV*`!>CuDQ@$vEST56I$zm7Qa-WeDekN}G$Y=Cqg1b*nqeULeZ{EE3tBl$*u zYeR;Cg9V=F!6c^Vgjz8U?T1f3VPu7YP?|(M;7-A^45|$Zt;!S)FSQ0?b}V0b)4qPy zrJ +SmFW%a>%NtLsU)gIKgWh*Vz4bQVoNo9O-2zBJ03NvCpjSMrjRRLr~}S$|!a z-EjLOZY8~h9>t1VBiOtLEfpmtgZ8zvF )28dJqttT0<#Ui$SeTPD<)~$|_?xClu%R z;>{gZ3 egEsN3H{l?W>2lBqdfzp5O>-AB$K_Zda6+2fIp+l@-euo~$nn zh*NBRh9y(}E7J;{wTQI8XBIgj;TbQS|26ux`a`X9^Hj27teh5>${Zz`Y1=pb Rt5^%*T_FL1QzuZPf9lx+GY|lB{Lp Yr!|jtt6Wx>Iz%&0(r#(#~SHeGPAJr&}}@I-SQxvU>`g z?+CwEDI7uD#ZU`d+j*jhE@n!Nl0qt#LXFSa1}YY4Xwr)LqlLg`Oa= vH-~6$KkDD8#VQ&9}>}vKd}!R7&U(q#R;qZX%F2=vPx+eKtS!E47n69_(21 zqT bv2E5LZJ5Wj%4iacRkc@D*q;(^En9QGuuNd;qw z5 KR`Hqc@0(d0 z4ZH5tFWhH8gN5*SLX!qoG(em$UNxU+c(Ot121~UeQJtH`koGp0AG1Si@r$E`MJl3^ zeu+7VzzM5uu)42qem@9M&gLx_QIxavF_J&L1Q_CBd_pE#+-ZZ{vUIyzy{q3l{XmYS z5 +2%uKwn&N)PICIfT%!si-xRz&^}@)|=M0XV`(QVM|W49pPORlPTQw5qZ3 z;fXXtLo@1%4Pt{+eK ll IjH=Pr`b! MG)6lpzZ!K%#z zO fuW&K{ zJL{2yh j%5XkQ8_WprGU;c<7wzE6EUCkN zv`bOoyFH{ul|T;;G^x-Du=~}S6B&|)7HIU+bNEVr6O+e-k$?63VpaMf6I#^Er$#}j zK|<0@oiJ7bypuMn>b6hq#)0bBOdPJv@rpSIWq&tS$Yu6$cp(oT5LvT(wCu!KFZRT4 zeVMafC9O;^L@MHXbP&_l#0_ i82~g$?%D1*GzpCqvT7>76l^v*fpYM7~p4N3F z@p}RGrHyo%n<)BdB4qK{7<9}=D#ge|iTP%Oyg+fHs30pKg4H9qdO~*D34Yy5^>Ss%0!v`8hvt1Z1K&-( r_Z!qF@Dy>HawnxzD zOfOLQM*vWOhdSm$!a_Qi-%X({8bNnnGZJ33e{%RxJ9~pqBYMhQJG&?ADe^YMD>i;V z?%WeaPdp&!Rm?sm*zw2)*=gKhEj|hYMCD7ZN*IoSjW=z8XtKS6XUjqq;|Dh2xDvHZ zeqeB@=j< OmGYXL?7M`c&HTrxjDZ#(>su+&0IZpNJKP7DNRRlu17Dd;T=!&+up^ZATc!i|#f zuT$r=cECV+IbO4I{rK_YP@4R9*FC3=D(_77&6@#rC4Ze_7+^%gk%`I~7us!vQv(BU zQq`}Aw6Mg||1>}5?ZwXb=e;FP%cD7FG!+^kPCd~yJHXF-m|S;CPh#9!1^;fOXz-2X z8{7F9 p3|8B$=M2=KOY)W=Iqfeai68Oz}DGH^C6<2oc{S5>=K~A)XQdPot~Y!&hDKv zKzNvg=g`{h9m?t&K#LfH`d~Dyy?2jIpg|J_$&h!ML&6|8Ql$n~*O~GjPBVXvo5Tn! zKHBjM#W=g^g4lmI`deXaV?$#2HXlE(6M+!mLlo#&s}zveabpVrv-JQdQ^rmjfuE#= zpd-TyF+aX)nwy;50BIT!!kR}}(t?x)wEyX}t9^){-0^i}j$fYGyxqj9i|mmzL>VB* zK9W~bo3M^|If#zRX2p{7|G9$X`~r|!APLinIV`o6n0@^$!l>Aghd`{`mo;n`#Q<~J z7)v^qpaZgt p_kGx%>pY(P>Sy_r<-jqoX6C7a_!s!Sh9ou4<@J z6|giktEJD{sLqsHsa?Q8qybZ+7}n$TF};hjrB(K>sq(QZGy!iU9kA*Ca@H?OaaBWm zZVwCrQZ}}NQ5L<9mu-Q_2ecp*f-`XwWK?rf&P`JF7ySo}l|KG&PF&ZjBg{(jF}p~R zb|TmOO=k7TLy{WrK@x8BF@CZ7iEQblPq-11;D1+nziWXc4leP?Gevw6=;ZVN>JyE* zGl%R`?4s3E4Rv%bEfX7R31_09tRRKa9Hf3dz}(uXD+1Ea4`^-l0d@sFNJ)SG@gNUt zu)E?59To!54X%k~KbFS2_OxT!K}Id1s9Wdjn}0U)1^s;(8c1U3I05{UlJ{Ah{h1bS zA64^D{7=u%X~QU|3UIe8W seDviy2BJ2FD}Z)1Z`N-D;f*J6vdLdS-BT&20} zCE>qdM+Rc7<}d0EZiVdJq!AGy2id5tT%t*F`82$w@QgKJ1jL;?6GrGXIS3-UXvZ~D zqT>9r6SbdydHoa&12@8@Cb~u+$ZM@fU>x0%Hc^N1#x)0ihFs&JJ< `e zLNo1@K{FO+X6F3~j98xUjs>Bwx=mN~)pm}Ss2|Wt2!W4!1k_NLsvB+W7xjrLy~NUv zmX? 9 zgE3kF5d1HAyMN@ia6ItCf12TFP+Z&R=Q&yvUrG;x^Gx9YWeEe+ZZFhH9>u2>`SR&v zMoP-%&m^kk%*C#3Jt~DP!VmLojgjLrgA_h`Y6(144;3{v=e&r7R{i}O^D3W(zR-xw z&VL{$a0?KKAy_vN76E}v4WG&TSqQ^lk;orO&wJJ`_kH=a1*CU5SV;$uiLLD(-zJ*( z8OlNdDlJ9vfCNvvsuXm7I4Uf|#%l#NkSoZVbA*V9C=*2L4ssJhQ(^cZ;g!E~ d%pqR_1294tBA{Z3!knJu~#`} z21ljZ-QZAN@?$OeyX?^94rbC$$r6iQjbbRB>aMijOAIyOB}fZ@e)*IPgn(l}ADZ7j z@=(}yYg`}m*6RqZ_Yl7y0}G+f&F#-B#F?<*)tPt?`7?-3f;u`x3?6A8fC S{@-he3ofJ2B zDCzLKa|M&6F~ZZ%n!mG(yV#CyENi*p5{`9McP=~NJZ?ykxmhr&oyDj8xm*rBuvjI; z9{_~!W%UO{u9&k4k?>!ThLtAGVX QD|BuSe6smj;Grb~a0^aQHODblzm8i&qE}O@{QTYYqi!@9{wuKa za^-zj*zHQIm(Wa~6a*r7%q(i Q1pPMJd}0akQ7R*5@CJnl(tF6 z;hPyUbAdfWGH=qV(WS+>#DBI3+Vuuh9Ax&d4Y?7!^xxgwk>n_~krvlsLfoI(<2s z?O_mDl4Wbg-i| AAojd^6&7_b$`eTOs6`G<6yuJC(zq;Z zXW?#*61J7o?83OyfGu8}o(j;3-vZZRu;AzN-S6=u8o+fERrAfWdxA?N?`3f=mXrBx zDe-@{b45pSzZz63>4LBVb%+8hqz>^NR}?DTw`rZz@WN8-+?+kWmk|U7s3$I1k}=qC zD*0jJ2XDE%dMd6eVer|@uk2aoEe#%dQD-tNsa%h3%bOhjtll8H5o0Dhnjz<}!Lvmg zDmuDM5b47Qa-hA;d?f#-x_hOMzh|ZsRRZUjIj2mf`K_U5gQ4JxA^FY*)kpL(cRNOC zX*<7O`sDKk5zFZ+@8cs?+=u51IkSB!t5g$x_bUBAzhQ-SJ}IC=W*IZD`QU5Hu_`XW z{C3&-8Kx_@Q(#BI3;v+-mW@00=?mQS2>rp(U*q4z!}&Fd5ujC%vP!Wa_n{MOhaXGN zp6wR76Uj Z3}|d|L}P>5 zQLAM4 ^uYJS_3Eo %Y(3_Bl5x#aIHjFDuuVLs}$lDzo6Wo%o4TqV8G1tYal{%K#&OP=Al+#~- zvlv <(kidyUp*7a5d$ zeA`!+>1guh8rBHan^lKZYxo4(oi+mZQ}oc{jJ(oRaP_L5vH|tFdmtsOQ62twQ)f)5 zV5s?v8r|Y+N?gs7f=sKe@E;HeiudEs1$c2u%{!q+p`BsRUqsO MLGJuUYmmD@_TKCayfs&)M*=u% zSGyQw%lrWZa+%}l9^HUW)*;Hy$~zrQ# Vnj z>yB73sflFQ?_^(539X6<5<>jx6ci(kqO7p}_xn(g6-OMu!aAT}N7nAN}s~5a`}u zNoGu|=v}d%RoIzPAS`#}rd;gQny4N;_k9*aHzAn&<$~Ys=g~LZf|ha{SH5^i9XLAd z6gIne&p8lZC5#%$M;WE?@DUunWEmEw#4IqMo7-@Ej(&MN&0eNw-sU4sIWCnfyE2b) zOA$$A)i?vU!KTZpzK++br*yrSD{p!KOsC7Wuw8h>fXN)kXYt25xiGWa50+pvlg7nY z2$~LsGkXM`)%b_GOGB)|gz1^?Sq)FTH-9f(O=oWq6w&>O$PIe=LRP%WFtUhqYryRV zfqR_U#*`FH0T-ag^Y;YFwB+F-QjdMzjN|CcXJZ^&Cz)pP#8VmaH%^~){V8vbrl*p- zRj^6aap3Jq1PtAk;RK;^#I4!@LC)d}q{MnUmZ8(O)~mHU7*i>mImSE2D68WsIL3#u1D& zL6F-_DyEud_ue0Si1WzAXR16~EaTzgN>`|tU#D~#cSfA$20UJn0FI!5D^*2k7O+0+ z&Em@yTJQm-kU+j0NY;;_?3A!$vrT*ak8Oz&9DxCW%C9@njwM3CQ7GA{0m7HgL8=&! zmjSd+9fQ0;wgY57E54X_eDXm>0T*QmM|eOW7GZRk3GTBGGA&4tSJbaWg*IuT*E+Ff zk2jXiabzOo9hN3Eiv&ru@iHDB9&Jhk%wv+rA6`*FrOggS#-;zD+5(*O|Gn#Hj;{fM zT(RZ!Mo@4Cnyo0Y7-wN&0?^R~j;Z4+{_mYDk8J3Tvpxlb+*2qc=WlIka4o4XP0O|g zpgw*aIB50&Vr-Te|Ide6Jk3x+!5O0mn+V9LM&QiXzl!t-f;A3$a1ApGJfm4&hhSRG z$npd{vb7DEk~ctAdN(+*RgsgaKmYI3nR7sqNf>dm@TGYIgbMEBLR0_#$D;MW_u-wY zZG_HZWXSTuFB>tkG;hR^6FrFj_q)d8X-vj=+?b8oN}YClCrBDAgEG0q#E)ZP!HWVd zj?JRXeUW92suZgHe}_+w0YeA EnO=|G4U?4 Date: Sun, 2 May 2021 15:57:38 +0200 Subject: [PATCH 15/17] Add a custom long description for PyPi --- README.md | 3 +-- setup.cfg | 2 +- setup/long_description.md | 21 +++++++++++++++++++++ 3 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 setup/long_description.md diff --git a/README.md b/README.md index c5d87907..af613ee4 100644 --- a/README.md +++ b/README.md @@ -5,8 +5,7 @@ [](https://github.com/vkbo/novelWriter/actions/workflows/test_mac.yml) [](https://github.com/vkbo/novelWriter/actions) [](https://codecov.io/gh/vkbo/novelWriter) -[](https://novelwriter.readthedocs.io/en/latest/?badge=latest) - +[](https://novelwriter.readthedocs.io/en/latest/?badge=latest) [](https://github.com/vkbo/novelWriter/releases) [](https://pypi.org/project/novelWriter) [](https://pypi.org/project/novelWriter) diff --git a/setup.cfg b/setup.cfg index 01f6989b..0ef845b5 100644 --- a/setup.cfg +++ b/setup.cfg @@ -5,7 +5,7 @@ author = Veronica Berglyd Olsen author_email = code@vkbo.net description = A markdown-like document editor for writing novels url = https://novelwriter.io -long_description = file: README.md +long_description = file: setup/long_description.md long_description_content_type = text/markdown license_file = LICENSE.md license = GNU General Public License v3 diff --git a/setup/long_description.md b/setup/long_description.md new file mode 100644 index 00000000..ff60a17e --- /dev/null +++ b/setup/long_description.md @@ -0,0 +1,21 @@ + + +novelWriter is a plain text editor designed for writing novels assembled from many smaller text +documents. It uses a minimal formatting syntax inspired by Markdown, and adds a meta data syntax +for comments, synopsis, and cross-referencing. It's designed to be a simple text editor that allows +for easy organisation of text and notes, using human readable text files as storage for robustness. + +The project storage is suitable for version control software, and also well suited for file +synchronisation tools. All text is saved as plain text files with a meta data header, the core +project structure is stored in a single project XML file, and other meta data is primarily saved as +JSON files. + +The application is written in Python 3 (3.6+) using Qt5 and PyQt5 (5.3+). It is developed on Linux, +but should in principle work fine on other operating systems as well as long as dependencies are +met. It is regularly tested on Debian and Ubuntu Linux, Windows, and macOS. + +novelWriter is developed and maintained by [Veronica Berglyd Olsen](https://github.com/vkbo). + +**Website:** https://novelwriter.io +**Documentation:** https://novelwriter.readthedocs.io +**Source Code:** https://github.com/vkbo/novelWriter From 9c0f596c0d98846c7fa971053d36ddff05dae28f Mon Sep 17 00:00:00 2001 From: "Veronica K. B. Olsen" <1619840+vkbo@users.noreply.github.com> Date: Sun, 2 May 2021 16:49:08 +0200 Subject: [PATCH 16/17] Release 1.3 --- CHANGELOG.md | 54 ++++++++++++++++++++++++++++++++ docs/source/conf.py | 2 +- nw/__init__.py | 6 ++-- nw/assets/text/release_notes.htm | 28 ++++++++++++----- sample/nwProject.nwx | 6 ++-- 5 files changed, 82 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 91878a70..60bc72e3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,59 @@ # novelWriter Changelog +## Version 1.3 [2021-05-02] + +### Release Notes + +The main feature of the 1.3 release is internationalisation. The release introduces support for +Portuguese, French, and Norwegian for the main GUI, in addition to the default English. The +settings for choosing the GUI language can be found in the main Preferences. + +The implementation is such that the projects themselves can use a different language than the one +selected for the GUI. To allow for better support for multiple language projects, the Build Novel +Project tool has the added option to select the language of the injected text into exported +documents. In particularly for the number words that can be added for chapter headers. Available +languages here are the same as mentioned above for the main GUI, plus German. + +Settings have also been added in Preferences to allow for automatic injection of spaces or non- +breaking spaces in front of, or behind, certain characters. These are features generally available +in text editors for French, but the implementation in novelWriter simply makes them a free text box +where you can list all characters or symbols where you want a space added automatically. + +The translation files for this release have been provided by Bruno Meneguello for the Portuguese +translation, by Jan Lüdke (jyhelle) for the French translation, by Veronica Berglyd Olsen for the +Norwegian translation as well as the minor modifications for US English, and Marian Lückhof +provided the translation file for chapter numbers in German. + +The work to rewrite novelWriter to allow for internationalisation was done by Bruno Meneguello and +Veronica Berglyd Olsen. + +_These Release Notes also include the changes from 1.3 Beta 1 and RC 1._ + +### Detailed Changelog + +**Bugfixes** + +* Fixed an issue when saving a document from the Build Novel Project tool when the previous path + used for a file dialog no longer existed. The dialog defaults to show the same folder as last + time it was opened, but should default to the user's home folder if that path no longer exists. + There was a bug in this default behaviour that resulted in a critical error. Issue #761. PR #762. +* Remove a duplicate error message triggered by a broken cached index file. The two error messages + reported on the same error. The first of them was also not included in the translation framework. + PR #759. + +**Installation** + +* The setup script, and file locations for the translation files, have been updated such that the + translation files are available in both the PyPi package and in the Minimal Install packages. + PRs #753, #764 and #765. + +**Code Maintenance** + +* The source code files for dialogs and tools have been moved out of the main `gui` source folder. + The `gui` folder now only contains sub-elements of the main GUI class. PR #754. + +---- + ## Version 1.3 RC 1 [2021-04-18] ### Release Notes diff --git a/docs/source/conf.py b/docs/source/conf.py index af2ae7ad..73308b04 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -27,7 +27,7 @@ author = "Veronica Berglyd Olsen" # The short X.Y version version = "1.3" # The full version, including alpha/beta/rc tags -release = "1.3-rc1" +release = "1.3" # -- General configuration --------------------------------------------------- diff --git a/nw/__init__.py b/nw/__init__.py index e07ba2fa..9cd28627 100644 --- a/nw/__init__.py +++ b/nw/__init__.py @@ -62,9 +62,9 @@ __license__ = "GPLv3" __author__ = "Veronica Berglyd Olsen" __maintainer__ = "Veronica Berglyd Olsen" __email__ = "code@vkbo.net" -__version__ = "1.3rc1" -__hexversion__ = "0x010300c1" -__date__ = "2021-04-18" +__version__ = "1.3" +__hexversion__ = "0x010300f0" +__date__ = "2021-05-02" __status__ = "Stable" __domain__ = "novelwriter.io" __url__ = "https://novelwriter.io" diff --git a/nw/assets/text/release_notes.htm b/nw/assets/text/release_notes.htm index b8c5f4e6..ba7ecefd 100644 --- a/nw/assets/text/release_notes.htm +++ b/nw/assets/text/release_notes.htm @@ -2,13 +2,27 @@ -
Release Notes for 1.3 RC 1
-Released on 18 April 2021
-This is a release candidate of 1.3. The primary feature of release 1.3 is the addition of -internationalisation (i18n) of novelWriter. The release introduces support for Portuguese, French, -and Norwegian in addition to the default English.
-There have been no major changes since the release of 1.3 Beta 1, but the bugfixes and -improvements from version 1.2.3 have been included.
+Release Notes for 1.3
+Released on 2 May 2021
+The main feature of the 1.3 release is internationalisation. The release introduces support for +Portuguese, French, and Norwegian for the main GUI, in addition to the default English. The +settings for choosing the GUI language can be found in the main Preferences.
+The implementation is such that the projects themselves can use a different language than the +one selected for the GUI. To allow for better support for multiple language projects, the Build +Novel Project tool has the added option to select the language of the injected text into exported +documents. In particularly for the number words that can be added for chapter headers. Available +languages here are the same as mentioned above for the main GUI, plus German.
+Settings have also been added in Preferences to allow for automatic injection of spaces or +non-breaking spaces in front of, or behind, certain characters. These are features generally +available in text editors for French, but the implementation in novelWriter simply makes them a +free text box where you can list all characters or symbols where you want a space added +automatically.
+The translation files for this release have been provided by Bruno Meneguello for the Portuguese +translation, by Jan Lüdke (jyhelle) for the French translation, by Veronica Berglyd Olsen for the +Norwegian translation as well as the minor modifications for US English, and Marian Lückhof +provided the translation file for chapter numbers in German.
+The work to rewrite novelWriter to allow for internationalisation was done by Bruno Meneguello +and Veronica Berglyd Olsen.
See also the Releases page.
diff --git a/sample/nwProject.nwx b/sample/nwProject.nwx index a6eea4bc..a61941a2 100644 --- a/sample/nwProject.nwx +++ b/sample/nwProject.nwx @@ -1,13 +1,13 @@ -+ Sample Project Sample Project Jane Smith Jay Doh -1059 +1060 166 -49528 +49679 False From 9980d225f5ddde23a062214ef228253c5e980bf6 Mon Sep 17 00:00:00 2001 From: "Veronica K. B. Olsen" <1619840+vkbo@users.noreply.github.com> Date: Sun, 2 May 2021 16:54:25 +0200 Subject: [PATCH 17/17] Fix test that failed due to change in version number --- tests/test_tools/test_tools_build.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test_tools/test_tools_build.py b/tests/test_tools/test_tools_build.py index cb16a557..46865368 100644 --- a/tests/test_tools/test_tools_build.py +++ b/tests/test_tools/test_tools_build.py @@ -117,7 +117,7 @@ def testToolBuild_Main(qtbot, monkeypatch, nwGUI, nwLipsum, refDir, outDir): testFile = os.path.join(outDir, "guiBuild_Tool_Step1_Lorem_Ipsum.fodt") compFile = os.path.join(refDir, "guiBuild_Tool_Step1_Lorem_Ipsum.fodt") copyfile(projFile, testFile) - assert cmpFiles(testFile, compFile, [4]) + assert cmpFiles(testFile, compFile, [4, 5]) # Change Title Formats and Flip Switches nwBuild.fmtChapter.setText(r"Chapter %chw%: %title%") @@ -171,7 +171,7 @@ def testToolBuild_Main(qtbot, monkeypatch, nwGUI, nwLipsum, refDir, outDir): testFile = os.path.join(outDir, "guiBuild_Tool_Step2_Lorem_Ipsum.fodt") compFile = os.path.join(refDir, "guiBuild_Tool_Step2_Lorem_Ipsum.fodt") copyfile(projFile, testFile) - assert cmpFiles(testFile, compFile, [4]) + assert cmpFiles(testFile, compFile, [4, 5]) # Replace Tabs with Spaces qtbot.mouseClick(nwBuild.replaceTabs, Qt.LeftButton) @@ -206,7 +206,7 @@ def testToolBuild_Main(qtbot, monkeypatch, nwGUI, nwLipsum, refDir, outDir): testFile = os.path.join(outDir, "guiBuild_Tool_Step3_Lorem_Ipsum.fodt") compFile = os.path.join(refDir, "guiBuild_Tool_Step3_Lorem_Ipsum.fodt") copyfile(projFile, testFile) - assert cmpFiles(testFile, compFile, [4]) + assert cmpFiles(testFile, compFile, [4, 5]) # Putline Mode nwBuild.fmtChapter.setText(r"Chapter %chw%: %title%")