From 587f28621f88a040fa1d12b1f10eb0ddbfbdc865 Mon Sep 17 00:00:00 2001 From: Bertrand Chenal Date: Fri, 27 Mar 2009 16:08:07 +0100 Subject: [PATCH] Improve move sorting on Picking List report --- packing.py | 47 ++++++++++++++++++++++++++++++++++++++--------- picking_list.odt | Bin 14754 -> 14716 bytes 2 files changed, 38 insertions(+), 9 deletions(-) diff --git a/packing.py b/packing.py index 178f968bad..1852828732 100644 --- a/packing.py +++ b/packing.py @@ -1545,22 +1545,51 @@ class DeliveryNote(CompanyReport): DeliveryNote() - class PickingList(CompanyReport): _name = 'stock.packing.out.picking_list' def parse(self, cursor, user, report, objects, datas, context): - if context is None: - context = {} - context = context.copy() + move_obj = self.pool.get('stock.move') + packing_out_obj = self.pool.get('stock.packing.out') - context['sort'] = lambda moves : sorted( - moves, - lambda x,y: cmp((x.from_location.rec_name, x.to_location.rec_name), - (y.from_location.rec_name, y.to_location.rec_name)) - ) + compare_context = self.get_compare_context( + cursor, user, report, objects, datas, context) + + sorted_moves = {} + for packing in objects: + sorted_moves[packing.id] = sorted( + packing.inventory_moves, + lambda x,y: cmp(self.get_compare_key(x, compare_context), + self.get_compare_key(y, compare_context)) + ) + + context['moves'] = sorted_moves return super(PickingList, self).parse(cursor, user, report, objects, datas, context) + def get_compare_context(self, cursor, user, report, objects, datas, context): + location_obj = self.pool.get('stock.location') + from_location_ids = set() + to_location_ids = set() + for obj in objects: + for move in obj.inventory_moves: + from_location_ids.add(move.from_location.id) + to_location_ids.add(move.to_location.id) + + from_location_ids = location_obj.search( + cursor, user, list(from_location_ids), context=context) + to_location_ids = location_obj.search( + cursor, user, list(to_location_ids), context=context) + + return {'from_location_ids' : from_location_ids, + 'to_location_ids' : to_location_ids} + + + def get_compare_key(self, move, compare_context): + from_location_ids = compare_context['from_location_ids'] + to_location_ids = compare_context['to_location_ids'] + return [from_location_ids.index(move.from_location.id), + to_location_ids.index(move.to_location.id)] + PickingList() diff --git a/picking_list.odt b/picking_list.odt index f081d8941ee4db5fee9b1f6d544d4377557b59c2..58d8ca582e873e04eb77b498dc2601b2e353391b 100644 GIT binary patch delta 10122 zcmZ9Sb8u$cw)SHi9lt@xw%M_5C*85_H}2TBZQHhOCmq|ld+&43{m%Vn)mmfJm`}}` z>z`*-t>4IVe0M-pkOqgq0Qq|{S$oDJN`e0s;t4^CV?8ncPGjR#{;9-*6317w!@>WT z_%9XPKYQw+9RJp^{I7PB&ftXV6bM}Q?zW(FKst&%)bMH6`4MtT4 zgu*WrL1YDlL|iLbD2OAU>r{!JQd!d4^g5f%+Bhp424u#I<{zYLJdsC& zk0v(pllr`Y+b~o%R7~~-$0`$TdLA_v7%3aTs&!k|CW$LPAX_)Y>K5^Hf2C%}{pm69 z=<-6;c@^XI1~)q+IC;jro1Vd>mT11n5$8Okw5CAQn2n%~o*}TL1Q)bfkZ#ka-5aCr z7}ui?l|NPmT{B=m(k=qKik5y(RSaB*0zyR4MkYng&lVwf3C2lyS=Uds!R4eINYB8( z&m=jEAaex;oj?=$Ji*LFR)LTrHQR@E!2UfBmxBn3ooOtDGMKnWg#>Q_$}Wp4&@#1k zKReNUrBxwFRT$xvGX#}fNQ6<@)OORMERFBUss!Pqyf%jSM}*rIL$w#OnmnuwRXWlK z7A5-GB>ouN%hpB>6ai^qfZmQFkVSvem+|P3lZnXjH&5&7$rMP~|a)Zb#-2?3_^|{}bzYnSOXZqOaX_OnVxCt7g zX|@FK>@D%=7TCWu3k)GNBsut&k|1mCZxgMx%VD zNyOfb)SxQZ^Y%X)8xsr10?Unw5ng}!Mg&HLWQfYOhbzm&ihaM*T=zMvA&F|)DcGtI zT@rL7ZD7Y+voI*tk%dmn3!I>BQM$1HzH5K})*{t?b(w$9_j}T4|A=zc<4^!~@oHeR zn2w(g(mR+`igaw~7c^^%V}&;i9DLvEb=!IuAk>VT1(TKjSgf6}3P@$1RL5pm_^a4{kp*#-?-{X%G{5v)Zg<-;^_Tg650-Ny8fK6b!}lTf2aFdbAo zb#?V4-XN#vHc)74Q=9Nl?}OTShJ^QE|8CCtPndWn5&GCIBjKE49IE|W$a&iyXMm6! zuh$J7)~hVkuvN-d{swwJ1BB(_nm*~PtWXKN)+p1u;Gag|V`!TYL&+Q>sYf9RwXjz! zp;F(fEh+h ge*qrpj9^NhX9Re#&>}oP;7XbFMF0k_3HeTh48NmQQp~1^!>d?9{ z0YbpVp+-8)%%cS@bUONv<-AFrI3p*|R+Sx9B1y5H zF9qwzZz~&I2QPU&*i)8AMT#;DUeFD+2(sAgJ&i1$(_tENaKnNc?ejZY0f0AC!a|8o zct7hw<~yMl&NtzkRy6t0NeZew{6FAKT-yPo)j+Pjw6jw&>Rlz2peHojO}6lU+MhN{ zVy@z%@<@ubMSH=2S>bybaI8QiABeXUVd))VC@7g{uvDJ{dda#Tr3U*H*&!_7iEr*X zG%t59=L&~~j#Y_$yTwMsEZgsGaV2vP<6&{bXO`N^`yq&X*^&0zUesLY)i~xu)8v2H z_bY*1r92n%FyqW}`Pw0p&4tUWwN`XZY2Jx+h2DkV?aWO|TM=gJ6&TQ(j99c)XV@d> zyxiFK^x47fDvdLxYmg)#{^jcPNT?tU4TCJP!@&a$0@6Yc0`jj`4g&)7cPp>oh7E;= z`77b3&fBxEw?hp9qv23tV&!IK;$~svW%y~#{nOCt7eBA{FDFCpUq8*A%xz5RjNOf` zemU~9aK?YfV1QtgVB)M-!^j5xr*%JLQUl#h8S!lzx=uu{ydTmi74zxx#MUt{ev2Rr z)ri;%^;Oa5iRt>IB$X(BA4BVWlB=n(Sv-9G5cs&7$b38WX=8c%xXp5(p5U40n&vs? zHPyo&5e&~r2*QAd{;eafy?NqO-QVl(D=gz?n|U)bwZBvI^Q5F4_sullQGz#;q8=C% zEVmoI&}i>&?L5h&9}d6&fubabiXU-UQy8-&rU9546 zON!h%AqQWq>5I#$(G(WQ1k2eV_UggHR$|f}sHx2Gw6;WukaZ$bqM6!;-m=9#F}2BY zu!T43T17Rwypz<#He;1nR*Pd!uO5H#yj#-zY-s8F-%30 z^y>Al5D+Xk$SO6?w;qbN*8*Q-&Mr2lJB;xtE>6vvpcWT5jCeDDj4rcZsWIB|%xzMHQyh6!E`}*T3|#%MB+)uBXH-lDwt?j@nN&RIosJ!n zirJp-b!Jqx0Ld5P`$R#21Ccxe)&&OuF(#EOBv!YGNB%(Y&qn0&?$RVrc*a}jnA;p5 zz@@!sjq zC2+7(K(#${25SvMqTwXNMZ;-S?(gH{asyRU1I87t3XSw)&v~S;*+VtG^GR98m4Tmk zjuzCko80%=p`}zW6B9C6JBZ4t4R1JwbHQbO+|099En4R<48TQ5$Zqd84KXGtkvHpk zRdJ;>YR)tWAg&=|1yVaa-wzJjVQgysviKSLz)i!8OT{Y0t>OW5%5<%Pia5DB^AMXq zpG=^AHf1cN=dg=dciIo#BR!v`?sTkU67tB}7KmYFxrf!F78d}2ax379(@vC{#u$=1 zD{bzcMnN`>5m0`3ng28l(8$gi?ZD6+8xvzUK9UkwJL(6}WK%1pcKag8QG?^#gx1}I~&_}NWP?T4jM`NJ-6^Q8u+Qn!>7>{Wg1lkaSomHr>I^R zwX&%AK7Y@k3Yu*%U)prMB7~|GtcrVPOQ&f>_5%s3i}f76;2%>hN>#+7Z*`Hdy8`8a3vT$G?G2P1xm44K>ehD?jJdEq-yk>$Td$6vZ?DJ zgX~#oio>4swq6*o1vzD)S)RFnC3c~<78@h4J(mgPl>Sj>brn9Xc0>umXF8Tf6SE^G zo0P8G44G{AEc0Y=xe7{fA~;rjadA#AmzH)AN)l5QvD6!bLa~9Y8i*`Qjymt;G@~j4 z4}ALUxqj&xlqw)!=GaT-zrZi7q>K8nvg-dn1h;qT?^iM_(!n0KHY7SAeg?B!;p>84 z6-MIO2%cvF2Y6PJ7L05b^&fRpY@D82zAyJ?s7>k*iKo{RE-lg}9y2R7ZddExEPYbj ze7jOA!C_m}4q)gk(W(XpxrbsW~qt zU7$YtHS5@sA32Whkk))C%*Bv|<}lnOI;GLq1<=CIA0jQh5LgzkLIjS0AII2_ zo7J6fs9kT4yE(Mig&J?8i%$*@FMlJk3;TA{$rZ)-NXjzvP$e&qDRmAO$I_3v3cRfA zo^Xs>qS)fy5hW3wSZM?N-fd^)Xwb;SJ#jkFfWbvWIca88%>E_tptgZKc9ZlZWX(9< zW*VMaPQNIdMlzUzybyP-kJN0;F{tB$XhFk_Inf44SBCX3#w&3+{_9OHQRH{QiHh{@}B6+MYIQ^+=cNL3W zC$PO&+@Y85DAd5**{`QN1mF>7J6SK&Lm-c%4;cxij}*CzgW_hW@6XLyvn1Su*z|aW z=xwRlOSTFm>UkA=LqrB_1QeS6RK(P&#M4?!5ux!tli%Gx{7I<s3*08Ld%x?b z$oS}Z{ZLwSk>BS6G{?n2o%^Hd^Jhu^xG2Y1CLNUrma!msYz@RWwNwufK_7;Run5QG zVx9WNi&WqzKd^`vn1Q5c@-BLCemg{IB5`tWMJ&qp0Xc0D*rIhaNf!UT%T!O@BV+q0 z3Hnx(9%{jn+o_`6ZpTUN0JO@28g~NV4p%W2mQghdh?jcBUiH>pt3f&oH7dls<22%N zYzmBpQcWB;v?iGCa<*RKm_1JPQ%NVtuYlHO_Vv{$2OT=ua`E20UimmS-wTbqDF%qO zAx%>vIG|YD9T4j@PsoY%k9mCjGO6KFv3OO*WY3d>&y~iwvDH6u2O4c2xDu_ocph>q zUPhqOHK|LZdxwq@_PpG@K0j+H3J79#Q8EuT{Rw}hCO1V-pg?md=SqzwDpRljj^=^s zuKlgW-l^eHw`}5Db$dI!heF^3l702N;atF~X1CREN6W@>IR2^`^-m?fn6Bny6Nl!< z!F)vKpc=6OzV_WRVqncdp62VdOeGZx}Mthy+vu0aLuD0pfV_lP}>NT`8aUhpDHt#3~SXbe?^8}Qt0IWLwhN<^0=>3N(y|uhBkvmMd z0#7XPKKFJbL!yJGx-{TwYVA-IoH_v=?w zxLP|%4PRVDGSE%v00T~!@oPPMzxh70;WhRb9}eF{uw)8u4u+Z4AUyu4D%@FLzRH0P zT&Itve{&ayHcKF5pJ}3VG5FTz0!;j#EclrxiD+H-asMnMmt=^U1y)7^X4DbZGyM( zd)Xio)__*3C{iiWJ#frbl0V|qo7}4X42e-6So4f{?51u=E6CrjICp64*~p+Ncv6Hl zv-LSmlfMI2WHwMHMOUxZiLz=ig=h>$*hh-dYV4gr=~ddMQF{#00>m1J=NH)y+0P!^ zZN3f?@qt${a&eGW!!-Rq&xhxY~_wLm6~7s+lz{D^%J%bP5~)*pXrlBYtM z?lK{fJuBpcF?25L*o-vaRjKK;4^I&c`#A7DiGiy=t8`stD)Csef|OHB>52JKAUzji zV{es`=OS6d+05t;qCxwz-=8$;7W=HC zWVFA$a+bjU;t^v8a0Vs3UBN64-T28z1omr4T2cWSOM~WAY|s|@v?8?adR*pUcii;P zbAZ&l^iJ-xJhh5a1;CFThhPD%{i@aeHk9#s2|{k$vyiIB&Mr~$PWYq59TzTJ4C>kh zvb9RPlYpA7xhHijQ7J}4?$eG;dQ|RBt&hiIPkcVe^x>seS1gmzP_(lrCnbEXp7$<+ z^MsUG9*fpfr(bIpm9^0(?(84XeY5prPQa(LS>2FMR3Qm0veC^O)bWihjRviC*J@%U z{a((KjJP*j9Yi4leAPF+6XYM&;_02@?jmuyDj)NDo}{}x^_6?s<>1)e|V2?$_UASspd5VUMaeJVwsg+=5EjetR9SZ2{2gaDFVu z%vS}PEU)DdGdpx_bE{`4zip<9a%9T9rV8l#XZ%a@sEJV5B|j-A{ki>%Q#OOeX_%ueSJpkG{Klf(E_V;M*{lHKCO^G}6! zJ$)z5tME+LG=#RN^_ba6N!Inta)%StpKzk(zrwtJH`fFhT?iw3O~! z9;_M`xad~aKF)FM@bIT+VF6y{H?&79X?fHQeT_tAG4anR_}YsJMB$n#lzkJNrodXI9Rp}u!O?}#K>>e%t2+w!U(u_aj*nhttfyqrzN=i~%z%npCWVc>^qqx^BB{5-wdy5P* z0BNzzaOFDSrI5bVd;)roctktpIA=X|LQpABta1_iBbPOM(9!^b40&Fi6z*a*xA$z` zBp@2*V^z0LRA(_XpxuWa-8h(Yi32o53Q>@LW@q$qM2Vre-_e6Y$LJeF;H#;pGyP;n zQ7XbPscian>W44F-Yvz&HAEmTHLtIbNlOHwpn~hRxm2tYPk@&N8uG%-^Si%M5$TkcmX@Fl0s`|24&bp*(=7a^JUwfuKhB#Riv!rO z?+mQLw6!!-QGoMezH5BxO=651vS5St=E4m_a z`!`ADP6h_EGJM-#9v!+Y4gwt%o-rfljnq zM@%-Q#ah%`fTwWhX_fV1V{VW~JDgDcP^En7kw7w{TH0_<0gJLxwfjvt;dlLI9Oa4w z>faH!k@fuW;HP1e$sH3Mo|Y@8AA`h1ka!Cr2emwOcgEJ=FdL&nq2271r%C8#Bg1aW z3MfkVoq>n3#XlIhV1pt&vY&E?+UD!|*9PI4g)~V2n*@mkWNdCrxXvqlueb^f9VkQUPb!fgbA5*1(74w;YCg)G_b5sX#G!JztsBdBO_}QP(JgO9-$2x(z|2(6kNUqs z$8#Ldd5o578qsE^J)nN9IBSvLjjoEwci@U2g4KObt(;vAI^H$$y0FCfxrQM8uvKQ~Ghe+29JsUFQGk#Z zJD#L?v;urQ`b|4c=p6(N5a98E6xil&bz}`)@6tM)75@~UvQMV#8dZzwd6$V;)tx_{ zc*br&oDM&AkIjfhDbv~79drnS#2ny99E^2EwTLaTh}x1J-B;O%-5K;K%*_rdF$rzK z+t`yJ0XO!3upP+oi~VH-ZTzehm%#a8sN}t2BvWhE_d=Z#WoYm6w^nVmD>sjvhj<5= zZ_FfV?1{BATRyx+b&UPbJR2;ulhrI2_xuHjQ{zA6kMwS7j3_dsuD-BPx9h%Tlg&2# z&a~}>)Pe+^Bow{GZ&)s6@ZESlGh}MEE=b;m-Jk1m4Zt7{bDT~RdNUzr;RKqVwK%7T z2V;&aEIbf727GF6*WnLRIabIBvOeByk_6{+2YMKnbQWSTn!^1N+CWP<^UDQc)W)q_Ln7UV36*F~S^M7Ak)B%ZTty+PJszhQgW`LcJb_}fB7BX@n%zP@ z#d5G~xy{Lg_QB#bORjzRGE$C+jozCd=KN~YWr+rSWBgYm8Wv*NTXxJ!q}r6xB@FOw zGmP(+yYrIWu?n)%{RkSYDlRh<7x4=ichDh@oiXrb)m@PC7|zRUZi!|U?VTX9*W4K% zlO9u_7l(b(MkWr&2*95CU4K9+Z490BSa#6E_luD1=9u2IzL8)<{hj&d|BkkryD6oCa|3FuuDpNg;k~7suyi!*e2FkS_0|SPD!6 zJ3gjHcoDXWDZJ;Vk04GhT>@qAZrte*hblqFHTZG~#fyIs0?Ko^jVL|6n5Hk5+lz2t zF9|?qqJkbbBMQV_;>=$Xv^sNl8=R7|kw3HblYj;SN+@65<7=+<&Ha_jd~|CBLHw(b zFD)+VH5ATVEc8F3B64K~ZuTd$Zz8uSjzgPfsRZUlr=6aog<%gj@Fw0@g;)@UAGZ^J z+ZTWJg$F*S0B_HB8Q6)jUhbrw$HYlF8<}unI}|5wcd@PGRkF-{qFUh2N>a9|KLNp@ z0?M4RmYp%k2^Db5U|0`MPk6vFvrmKezuTxC??d@xmT7fd+aLk@fUrtE?yx{||Ivor`J&kmbE`b8#L>|u(= zYqZHoiD8YUoA6!*Ebx6#F-gmQ>exn4ujxxqL0qs$w|YY#q^kPU<%cYK@dtMhB`1aC zx;7gK5N6umCK^{4Y)Cnv(SjUN1oM!7@w1*b@1b4H5f3<10lXKKFz3}=oNK2^Rfv&j`J zf<&SOutMe1z%>++odq_*FOKMKyOm-f{-jny>@`wABwz(Hg4S*=xwW?$CjOF7;zgV0 z*wXn^pjb)&Eqs3Pg=$Q*(Z|_Ywb6E28XRNZ%%!Bv>OosI}!ZYw;X- zMJjNBx4h7Kw1#YXm%iNUe_o7c9ujFQcRPG!#sMg`>JX`Mdq``x+R+ZDm%H^A zzUaxlSceBuen>HyO{b>#ttl`H9rOe)FE9rgaku4>+2`&6gjXoM$6B~GyvR%>$FW>7tOPCMN7^7YLBlD^0sN6e?BoFKNVmE-vp2rV&)q{nXrSTq>KAN2Qs;s*^ zc`6k<#_CO&+#Bk|ri~28K>;SB%?g$gPpbMt`tM>9!=&aci$|1^J9|HPXlE#&LMkzN zt<@uag>#6{B|H>z5?pz`w3FZTjtjdyL2Ji$c@y{~$mRzuvWZCr5TIr1nDSMy$!HlB z?3{o(_$YlR#MpB|vd>h(30H?t%GSPJ;<(S)BtofOmICY;1CoDQP;q*8 zDdZlxs{(N}2YBLq5%&V;x1-K}_MpXxO~U}4+D6HSYXYUV_H=;UWI1-bG?u>&HN-VD zI9$L((+tvYPm$EpwNm`6u_`4PTW`yt0jqgA0e45x7dacGYsQ!}biv zu6qP%$PT7$K;|%<4n^!lhQ4p6dz!KHh;xlN$VxV+v#Nb>KXRIIAMbt$x&0xA|J?)p zf#F3nI}S~B1?uohm`@kLZim%NuDhL#VcqK%jo>h6^DNn?9u0RuH-G-T$5YgAr)m5B z5v;ooKCH{kQDr!lzB%!Ihtu$#y<3~fI})D#q>Lx5xtfF=suafQtPIW@FbP3+C1K1g zi0NHW$LD=c74Ensgk^AS%OGk~|K^ZNv8 z=@^7wuueKr>8t!1{&^ss~x znKWNp{x18mdXxERF~>cN#=))`gAEo5H^i!MY3@OthRt(Askn6ck?mLt?KDFU(q3f)-@mR4a*-bbM9oZ2pq_nciiH|z9kOpH&|!)ID#%uO21 z)1@EP0;Wh7=*MKzjE+R}+cy>HV6{ozLY0l58A*4c4S;>O-{5_mZncgya(O%xkk zA}}GJ-BH!FJh@njoV)0q9g_Y9{7`X~Cb3;z>`*#A{W;t>CL9WUOIgYtj#)_>;*98ySsqwW7kzvFp1Y5tK} zaN=?0!h(P}I=TNvvgzHdtrVm|!7xDncgF1>9&Y;AMgM+a{+WFH&x@&4oww_c?4v%Ut}RARtnIA$rXJqj_S9cjlsi Ja%20u`afKLH3t9y delta 10174 zcmZvCWl$c?)-CQ5JcQux?jGD79^5UsJA*?A?(P=c-6gmOcXxOHa^COUQ|I2gJyo;1 zRzWyVQ{VPTQNB{Rk_J2?Vob%sftpCv*{#)|~&hrn)1Az}{>)Nd}qx*Dq zeVfV~a8=Swnk}l)HdnH)UPLSqa!cGC zEjP7lwV3xYBh{IUg3@wTo39o6uI4k*MzbMvJkDL6RUjFQjQNmIZKvXvtIBirw&%zV z%0g}qdo$o8cqwXv`kLfuNl_9T{*6$joHE{*3GVe9M-PI_K(Q%M76VEet3H%PRxa66 z^T2V73TtZ)PP6wHJy>Mwb$Q4VTU+zOR&&89z@`^yxfB#GetLB7h=PuF&XgIQFF}Bo z;!U?KEPKwlK`&LWM*P!_j~r^}{h|}AcaEu#kXKz27RoyyBH9<{kY!DZybD1{#^+t! zSC8Z^7i6vU`Kb|T!%R{-nfiEgek0e}gsKQ0?&~EmR3>gTGm~echbUrWdw}j#s3BTL z4uhav{!B1#2$vIH96tg!&)VWh&I)^O8XHo9Sg6l2MvU*}glWXsOPrWYcl+iXGrNm^Uc%@DJN3#gPlF-QP>*8_{zH5xoL!Y9IayL!ob6`wp>?~&5zInYsIc;G;Ms#r1yl;f=AEEFg(kOs?W{z*QhDSzuM zLZS>{SDRXtjWpx5rnYF!w{9*)9AQ+n7nc+bmV|(%G++o8OOQ!e9NkKT0bRXD6g}9V zK>JT~+J)p=|NbJULoGutQwsIROQ z1wq~HMY_6Ys<&$$py7Hpp^5+o1xo5FSe>?}IeBDhF~vZNz10ISxy5e6 zZf%l!-Yb}$Y9x%SNEQ2bJ8U=2{qymx^7+fcQ?Blk=>5xWcaeAl4=qA&8#<>AyeB}K zm=}fHOx@!FQw{gI>4)9@wk|=TD11oh!1915Wuj%^oAj_AlmT{T*c0dYEUE1L7mvww z4cjz{>_Ihx`xmJO=qA3m@xwTybmXJ_Sw>V;{)w}SMXl`*%WMai%y%mRzmsTsD<$ki^k9#0K0 z8HyOY%yl{xlpc|b+~AxZPiavS>(3aC?*w2~aVxr0&i(EtI$mW@a~4EPQN93nh$1H8 zpgO|q*FAmrs9-ZwOPtZKDLk)JE*OQraS|Hf115SduUk;ur z7`+BBFI|XQpkcnAZL&<<{mt&OtqOuG3;9=BG-EEu${3yst_8c&*j916_Z9={29O=`IT6L-|d-f*-z;s&oU}2^IS%U+Tr2f-^DA{w7R;+Bsev? zTH0@+vSEo6^S%6p!9KZOBiTn|M3ZTxRd zEWnoDJA?bS&dpQ;i&fIw_)>K6K}a@w+GK!)W(i8rZYgY>AZtISQdy?rtN5oU1$4Xo zq=8%RI> z0(*s!*G?t(!(Zu23#>rn{Wlz>hj4s+}jBiYcG=?K)eZmCXpScPvhGEU$ zfOwBMxuWG-tJuV3qZP00iLwS>$u3v^qo&vBp}h|QAcv!f2*tz4UF^Irfo!{8z<#tjG_$0l!ySrm9YZ(~ptVM)| zMoUOXSY?@cp^-G|@dX|+ZvZQ5B}7V516!|f(=vFhB1v$_^RdqxuM<2>mvmFFqAUyeP> z&RB-Ded@zOybUzf$ijwJUSCQ(Gk8T^Df2n6d=IM7btb&#liHyOrtIwdy6K>v*n=L3 z1Qf%XK(FF29u;gRNIgwT{kc0f9(giTi?DE$`It0x=*%o&WDr{ya~!tIfm?=rL?<75 ztwNd(MZG7QkG*GO{khu}G4E^+j+?R$1)B7p{Bk2I;_s*IC!W)oWCw?8M>133Y4CPp zybkP1Jv?Pgf98fhyWlG?yCY1`qUiXY54@r=aOsJT;)ml05IHG@;kqaPxMC~tY!6~y z?HA?uYH6;Fnjh#hW?@)6u_@&8GGDbaZXw#CjWKFA9l2!6S^nh*l$kJkcx@S9$8&zr zVB`$fGv}tv8Wu`fZQ{Vq<8^?Fu&rqL4+qM@)$O%4LNxxI)XvS%zOloQ3N$vD0jA^y z);y+{iL1F$r<8;=%hpC8d9}VlfYys|bzH~9Rt8adHfF9_!j%pD*(p?;wyU^*rh{7JbrSZ}liQx5(K*`hwXTXcHJ2w*(JQy;7X=!ZT7M!y z70(#eCDUye6BTwwFlI*%nhl{Me|^A(MVnu_FK6&}@Mjr@={1OqL~?2b&~&x5v_eW| zE2ec?HWPDn=ylg-tMm2Z>dP4ReAXZ=JGuk+?qhBB^z`2P<``JHtN!i>PXtx-9ve5Fa9Sp&WhlG3$`1VaKTTqZkoZ=_B&kMyUBei8MA!>MT zU{}wcy1k1q3fVc|KuJ75AO$BDjl~_&ejqjhT1=y6o(4M#Sf_qLk5QZnHbOmIAksiS zNKb{)-0s*~#PYSwRx?ZwOD7T>TSshuiO2~WEU%9J0pGNJ){-yUO}G|hC!Sl*vhJ*} z^Lu=BKvWFZmSNI@_33sscWNn;<#W@lNsDI-1t!RPZ;kTnr->a?0@#|8 z)FF5)KRaJMs=01qe+cAU3oZx?bO{-~WkQ8SzPRCR??oqbQo!jM&tuBLBFo9x%y7KS z-Rb)^Li_YPm$2UbT56f*y{q{AK1VlOF2+;*QW%ht2Jj&Oa^Ks!K=B^>az3D#6F3#J z4|{WSPHgn~wGxHOd}D}0G2$K=J3KdRddfS$o|R(T+b3RBmO3=Zu%4#=n%T23H9|cG-e>U5h8~9STmt{3c@!zHh`VlbszKo8Z2HtE;g86ew2bPR1!X8a^8Z zF&hTSIaD7=9U1OK>?O$0@)$vvzWeOAY05-j9IX~0zB=lRhYUX+8OiQDL*xP4koj(c z&hc*SQo{I+tj!?{OcCy|tWZoGIAo32*wKl=y<-fnKmnV5@!3BD_zq>?Dip)nc<`$JoLS5%3H;7S#6)T`{UDEg~TrvV7gd8n=dJaB?Yo_Wew$MCF-i`b0A6^FqMcd>f7s^qwb)*CQ&=v;0dl0nojzp3& zK^Is+(rqgr7Ot7#Dj4yNr%9hC2zO$ysUsepj)m$%r$A9O#8nZS$0B3`dY9Cd3u z23U)7*A`hs_o>#b^q6bVI$lA+e{hy6w=U(S;55&?wY>ufl4;|RpNrEe*GEB<4$X&p zp+>J?#(rU~h3U2R4Y9#qG2XkFcssJwKx%{Jl% zg27xdzSm&g-3flYS8})$SjTB*Y?Yqo*Bvx_LpPmtNRZg5y*~;qJ7widcUgq)guOiw zg7t5FC}j{O2L!k*STV_bA1d#^>2Mb=T-tAS$n}aRXGb;<{Itlu8E`aprK~63l5M&a8OX8n?(ottor0ZgCKW%9Qs%WDHigBJdK=! zPPAoajEiJ_$Mz=QTlJh1Rx_Fe{-xtw&LAR8zgV_{t-#on&%SnZ==Lajq@>Z0c*U9YVC*s~f+JG94ol;i^ z`q%x9Ej?M%zKSOlC%&E3ok+TKcT!dlYKcK#~ruFJDka-jidrW zbBW#cJwC{|zCqUF5wMGkMr<%Mjp({Mw6=IWeMtMvo$YQbyA4~+Z69$0D<&%md9LG6 z!9(Gpp1LHapP{%l37ZF=w~&L zc5f&evGCE!g43OpAerZmNM-{x9OA5G% z_NDnunz?EWepZM-j$Yj$E0)zCL9Jc=l)3PEL?Of z{ZmqADeH5HU|7U&{2t>Ul4K;lQ$26zMA~Ap0cX)*Ua^mDI)&?!N|k^9&dtjL9gAcljkWi zo3r$iGf$BZ1D+A$7_B#wbDyNiCdE&nO7qpZs??>~+T$z>;pqC2ynJIsy)ED^UFXiP zCUc6MI?(|)2wht`SH^oR~5)#vu}Dg=bZ9y~rij&Q$z zvzd|{o@6_%Yj1pm(xfHUCO%g1Lo2}cu7&){_g;&&f@l8_AKOboyZm)|Odq$6 zh@ln%UMrf9`pFG!&MbmS2nx1}oh$wbi$uLW)lU|{^4;!FzFpU7dZAxAs6^R3f)vE? zp^9;w|GvvFopvx9y%X{oo$Mr+v;vw&bB1qQj`<^X=*{$Z82m4t6uvE2SQiU7zvEX?fc zEsa2+UL8flu+J^~$6IhyNVJS388HOSSJA{EH3kqb-yFxXd_r39G22KSre8CfP!1a5 z72!%j&shcjLx6rty22x|)LNs5uOHly7{=%6Qhp58g^01dFar?>$1LWwfzRLbkJIUy z)hxhc&xjU zE}5CAbGb3#u#yMOpJA~@<;-q=F%+in5llfn%FG~i8U4MrSOg+wBa?U(qE6$KSdz3s@PsykMt4Zk|kp9$TmhFT$HY(^2M@VnA=#Z`Y{p6NUT z(Ao{&ar1xIm<`KMp>iVBBQPFiJP6pXDq}Bd4}!G+4Tc7%b*PE=V$*Wy;TzF6yBzAz z=d{;b`Zc?thI%Y+He3n9$OwBG*syrIQ^}x*302k{UnEe)&&_@$UIhpKLT2f!rtLYGbo7J}SZn_=etF5<0dbTD_^a*YKv^!=6=kiEd2R?h zONknDX7S|_ctqSJH$e4Wr=5mF;>K23eJW$1ntds!Yc-pCGv7nXkuWv~>}OtM#*xM` zkvizf11(|`B;+xuge6SZ_%L4(Z_$cu=p zl1p}PY^bI)5u3O*3fm_FIfFkghsCo=SqH8K{H6)Hgk)ugO&wJ>Z!@FqS)QX=FYwlw_%H z`pJvHBAz{~B-O%9xz3ku7`4u;uNR#{E}WhZB(vz#HgONT#0Pj+zZPN5Ilz`M)kBsL z`h$s+s1_+#i(=--ULM;kf2G5)C(yJ=qQ}NHbNLn5bA5t{Lu}ar`M&d`nl<1p2%wqX zaTO1*A6vib9=<*SO2G*$PX0rm8L`X{c$m{YpASuCMl;VyWr|rHNVYyvJm>g<8j&g& zpUa=cPcGAN=3KS<2DuwvUrADs0CFB(CILL^LD|6~PoonwZc(r#w2UjRF%ZM&K-M?^ zkV3yQ7E5Jg_vaVTz>Ij@WK`0|v@X8BVw6v}Nd31S)-QQArSr9v34XQjk5EjKgu4?=YRQ$K+fHQN6iE7X;LE33lBED5+MW) zhrgFzFd#MnjZmzkZNb6Lw$chKK6aYyDp9@q+IEQbp}F79Mtxm@^UV^+US1tv*0Mv-ek;&}Sfiw<>d1VWi-`NQ(Sqoj7 zM=VtqyOHm|HReIJw_kVq+|5kf{Vvp!^4Ho|7dWU~{OVC?-rRRq`dbZP(C*Tj>(#7$ z%X7cbH!Ed-39Beb435N+awz zBffpEbBk`XnesDw9V$rYxa!JQfhKfhGW}`Xshs_wpsx6B(OUQ#emvp$Qob*MKA|=t z;}{n!-(%Upy$)eFHzhdgy!AEjv90}t_M61c^$Rf1j$wCZjWHA;O#8ZU5MqKvu56_a zbP3rI{3!fQP`!4n`ldodJb%~g5$6+%W+8{S*WR%y|6k7rNY9z(dM7!0hGw zg0azDJ>86a#-MH6`Wn;~FL@}itYowVh*TI-`hB<5Xg83HQZDbF845p577dzZ$wiss zq-zk|QO|KDpTl)c!bq#gSXgnuJa^;ah=KlzbQ9-S#&BvntIcVDot=9m`0dF-Cep3R zb7LPz+j&x)1msnyoJB2G7kDbXnmpi%G4beW??nG&Nv0wDzG#+2x%MZ4N{8MNPzYNF z#GqJ|Yqbl?k$0?}JhAUfqIDkaO~2ac1uEQ`?DpwJK3!xj97cSMeV_#1{TyXLZzx^e zDZ;nmOtVll?zndCAuTvv+oJInK*aXamd|Ck&mARue=BIgs7$X=GR)_JW9Z?&uT3gt z7H7daNFQM2IUN`*Bb-wxG#a%A3cSM`804i9$gp7HNzQqeNqku<*mnxr?kc`|v zR~Au{>i{Tk+~FQiP^S*LvUqynvoIeTqxNZotXi4IV?_&v(l(*A&`;mLebX+5}U%rN3k>3 zQ<4sb{vhfEQSSujgI?B1NA>xvemOWyZf(YQNL%YWVANkS)4%ou0}W)u+`wgmFFZDjtCv_Om&T z>Je-eeDka#>yjhkr*?GB=x#sjx$t`DY-`ZyY_f`3vhqu}JLu0H-SEb&ODvijAt&Sb z8MrXa7G>9V^}Gq{Z4>8(!-nd%dNG76X5QA%dp%)~o!c_D6*CCnQpdq^<~AOOnsTG* z)=lhwqHeJdDrMbJ|6qT_@&&QD#xe^C0DgqsUv<+v`Q?W=l*kgsuSuA1?J7S|l+@js z==D~8Scuq1_&vo)!4}3SH!<73A5ZR|$F5*~cpy3`3xJvu>~-IS1t#yv>&>evU;iBP zVs!5oeN9Hm@T~{>VFzD5OlZr>bzfd%UPj1Kk_HH7@jUdiWdDfW%UB7wKkEc#_zx=g z)2?b)uu|Nm3k9`s^jJ4CK27T>+bz=W)@~f#`?k zCXGm&F>jnBz=I+E7$<+n@7}fxO&MaGE)BW{B?)$juJ4~aH4SFZ_y3sOWOq3H5!bkV z{o@qLXkpIft##M9>C)G`S1_SH;^8eT>@rMkAz>4EG*C(HiD#@oz`%zmM8pDwoLkuNm#1adpf$I9=K3qth=49iEwR$K z3;|6aD;4?35ZyFV>ntzr{UXCO)O#nbb$035(8~9KMkVH5_3uB_t8vZy#jj_}#EECg zVCq$RPS^Jx8#nRuZRm@bq~&`8zw7%ffg@+RtUUtzmRjIj^mRJ>+T5O^Nm}Qa@}ff$Xek z8NKj_oAT&3n|4?f)a%+$v!R_7q@&A9AI$!8R@8(;TaQhG=OthtI{+aBf` z(pcI8PjTh?^ONksmTyuxG#aDBpC+c6bhNrY5TZZ&v%hNEn4h+^P_A9DoEzGUG>uja zKN2bY$gOT@ZmxQ-0|tv~ zJHV;$DZ{TfqzauEsZVQUySxfd>JQXPf`VK1(p)d*tJ5?xR6Jg>=WZ+pX1)FTX^u}q z8=qGx#H?*Ovz(HQ<&wxY%dUF6$hPo)(FOU_lQ z?Q{v~>kvy<&nurtKBQ)pmwGc`eY!|HuYAK$5vEVa3O18DyGj^K-j-&wFd z76~__9wbQeC+7=;J}H%U!*T~V_{PzFL2#rk%#X}c?TL9w-Fpy{xGisR8b%JP_$7+G zh@|H~6jdzy04>FM847SW=~#8}%C&js{SxHunAMY8rqD7OEP^8YEtDU?JU*wDmK9F% zTR;n5jR#6f6|G^caTlNj=mkrX(8pm9nx&nmh?b3eA#MEw*Hysf=7}+UCsZ?6cd)E^ z;=4b>5>fW?R5*^Qr$)UfjDG)p^Xl-U6pfi|o)Kl4J2I<5+yK;Ag7J!akNlI#p|v&h zMvZLt0LSNxw1$o#ee^MPvcI3Q+$y+w)gHg%*Hr0pM%xd9`$1pZ7kFKgl8xPF_sKN! zU4MhpxI4@tBh(M|%Bk)6AED7L!=C$IZ--BgcUxOpABgKc4>24LIR9lbvyz6-?Lz(a zm8mGr}@WAhUQTI2emjv{=pm$v48N8L*m~& zUc4M9)qnc&|L%8kN~8SCxE_iAKi+mcHWw}7zbL2P01DN=cDE%t7#PBTm$QM*#2awo z{>Sf*_vgaq)I$RUvoUoxWN^2!R+IsUzy$lx!g>BX!2gZ&|J6?7C%7oJ{&lneer}}y yQh