From 844acb226086e55de9a2442396a4e002471295e8 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Wed, 17 Mar 2010 20:12:16 +1100 Subject: [PATCH] build: waf quicktest nearly works Rewrote wafsamba using a new dependency handling system, and started adding the waf test code --- buildtools/compare_generated.sh | 44 +- buildtools/waf-svn | Bin 90898 -> 90557 bytes buildtools/wafsamba/README | 15 + buildtools/wafsamba/gccdeps.py | 108 +++ buildtools/wafsamba/samba_asn1.py | 16 +- buildtools/wafsamba/samba_autoconf.py | 8 +- buildtools/wafsamba/samba_autoproto.py | 3 +- buildtools/wafsamba/samba_deps.py | 823 +++++++++++++------ buildtools/wafsamba/samba_errtable.py | 26 + buildtools/wafsamba/samba_patterns.py | 21 +- buildtools/wafsamba/samba_pidl.py | 13 +- buildtools/wafsamba/samba_python.py | 37 +- buildtools/wafsamba/samba_utils.py | 50 +- buildtools/wafsamba/wafsamba.py | 174 ++-- lib/replace/wscript | 18 +- lib/subunit/python/wscript_build | 16 + libcli/nbt/wscript_build | 2 +- libcli/security/wscript_build | 2 +- nsswitch/wscript_build | 5 +- source4/Makefile.waf | 20 + source4/auth/gensec/wscript_build | 6 +- source4/auth/ntlm/wscript_build | 6 +- source4/auth/ntlmssp/wscript_build | 2 +- source4/auth/wscript_build | 2 +- source4/autogen-waf.sh | 10 + source4/client/wscript_build | 4 - source4/configure.waf | 9 + source4/dsdb/samdb/ldb_modules/wscript_build | 86 +- source4/dsdb/wscript_build | 4 +- source4/heimdal_build/wscript_build | 100 ++- source4/kdc/wscript_build | 11 +- source4/lib/ldb/wscript | 82 +- source4/lib/registry/wscript_build | 2 +- source4/lib/smbreadline/wscript_build | 6 + source4/lib/smbreadline/wscript_configure | 12 + source4/lib/socket/wscript_build | 4 +- source4/libcli/security/wscript_build | 2 +- source4/libcli/wscript_build | 6 +- source4/librpc/wscript_build | 16 +- source4/nbt_server/wscript_build | 2 +- source4/ntvfs/posix/wscript_build | 8 +- source4/ntvfs/wscript_build | 4 +- source4/param/wscript_build | 6 +- source4/rpc_server/wscript_build | 6 +- source4/scripting/python/wscript_build | 8 +- source4/selftest/wscript | 6 +- source4/smb_server/wscript_build | 2 +- source4/smbd/wscript_build | 10 +- source4/torture/drs/wscript_build | 2 +- source4/torture/libnetapi/wscript_build | 2 +- source4/torture/libsmbclient/wscript_build | 2 +- source4/torture/local/wscript_build | 4 +- source4/torture/smb2/wscript_build | 2 +- source4/torture/winbind/wscript_build | 2 +- source4/torture/wscript_build | 42 +- source4/utils/net/wscript_build | 6 +- source4/utils/wscript_build | 3 +- source4/winbind/wscript_build | 2 +- source4/wscript | 6 +- source4/wscript_build | 20 +- 60 files changed, 1329 insertions(+), 587 deletions(-) create mode 100644 buildtools/wafsamba/gccdeps.py create mode 100644 buildtools/wafsamba/samba_errtable.py create mode 100644 lib/subunit/python/wscript_build create mode 100644 source4/Makefile.waf create mode 100755 source4/autogen-waf.sh create mode 100755 source4/configure.waf create mode 100644 source4/lib/smbreadline/wscript_build create mode 100644 source4/lib/smbreadline/wscript_configure diff --git a/buildtools/compare_generated.sh b/buildtools/compare_generated.sh index 98504a868a..ae20fef37d 100755 --- a/buildtools/compare_generated.sh +++ b/buildtools/compare_generated.sh @@ -2,13 +2,49 @@ # compare the generated files from a waf +old_build=$HOME/samba_old gen_files=$(cd bin/default && find . -type f -name '*.[ch]') +2>&1 + +strip_file() +{ + in_file=$1 + out_file=$2 + cat $in_file | + grep -v 'The following definitions come from' | + grep -v 'Automatically generated at' | + grep -v 'Generated from' | + sed 's|/home/tnagy/samba/source4||g' | + sed 's|/home/tnagy/samba/|../|g' | + sed 's|bin/default/source4/||g' | + sed 's|bin/default/|../|g' | + sed 's/define _____/define ___/g' | + sed 's/define __*/define _/g' | + sed 's/define _DEFAULT_/define _/g' | + sed 's/define _SOURCE4_/define ___/g' | + sed 's/define ___/define _/g' | + sed 's/ifndef ___/ifndef _/g' | + sed 's|endif /* ____|endif /* __|g' | + sed s/__DEFAULT_SOURCE4/__/ | + sed s/__DEFAULT_SOURCE4/__/ | + sed s/__DEFAULT/____/ > $out_file +} + +compare_file() +{ + f=$f + bname=$(basename $f) + t1=/tmp/$bname.old.$$ + t2=/tmp/$bname.new.$$ + strip_file $old_build/$f $t1 + strip_file bin/default/$f $t2 + diff -u -b $t1 $t2 2>&1 + rm -f $t1 $t2 +} + for f in $gen_files; do - echo - echo "===================================================" - echo "Comparing generated file $f" - diff -u -b $HOME/samba_old/$f bin/default/$f + compare_file $f done diff --git a/buildtools/waf-svn b/buildtools/waf-svn index 740082d654ad379c4538c9b107cc30613d98eefe..0643c28f72b1782732a813af367815762ea08ab8 100755 GIT binary patch delta 87268 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 N7+Q%q3L`u{Jqi?Q#yJ20 delta 87630 zcmZTvWmr^Qv<3u(D-StzGc@85gLDkc&`1pupCTn)f^-}@h7Re@p+vetx=Xr6xIPrZrKU8qVg-t|-1o`+(pdu#1W~Ksy{AT=bp(3WnP-Aoc z&qC$`EdQhQP8$hRRh8u6_#ZibNe(dN`4o6Qd1^v%nekt;cTqWF4cI4qC!zxIOuLAw zF#H0_@r*}X$Gz+^{@*9%VMUHK7So{yBc>c;W5hLSg;V_rQwOsDRNd#3!%S z;m-~VZY|ATQZCumvL zmAT#ZnzvW`T-#jz#iej{`?v-99C>$58vnJ=iQT!|>Pq@j#j|h+lNC}uF)iCw*X?6F z#d9?!8x3o2vHh6S!ZVzm;6$;yzxolg;vK%&l8#y>n%d^ojvTsXE>e_x@ARhe>o zbLlf?+uknpD(mF?_iUf_G4`dS<(bTOsk^y8$rh)(Hc`+{rk8MYzq&g8l6qTZYW$k= ztz-km4=_(-S)1gERK>Zm`&E?dsStK(Zp)!~jRR@3 z$Oc1BnudtMJg=;CvzEmUr{7+uH~+V6ifJ4~d?}wf_rcxlZ@60)tF73x7LKt5p z1sJZut4k;OOWxdvo4ZAUg>GiIu6E%thJ?4*5HL^cMWxu)PCWx^xpl6k-Z?}iE>1pG zd}Yn_p5T>b;aazMdN1pIdn?k&*oV`itEHr97ms_U{2CFy|1f^~IcW%h z?-qc8DxN_SnA{dIraXR5ZVDJuq=aJ2HTWFBWE{@T832YDF{Ay$^6*V$lZ--AOmeJ@ ztip|$QcA7-OYp*3l+)tV!p(DXICD9z{khRON+|{`EU77J>?xKh1xzKDVTcgUyu2_@ zbP^MHDJrDM7;TgipN3A-V)ajC;j%{J0Xj?pCHPpMnZnq?5IjHba27B`k(t><*({Hm z3C~Aea+;WFo&EC6L`m6wC^%fmxia>j>+ zv7?I6rD^`?JTSx>#hwZnu%Oc{!_$~c0@6&lI2GBSHJ-y-s>GCA$ZlyFpHj#k?uTN{ z3&$(vMi&&7=2`1m2C#&c22h9Pq0Mnw(IwpREO;y|Y0p+54J%b*vE(Y{Dl#`I$q7@8 zXXj*2$qP^lQ#98IK+%-MhvXIHgo7bq2)FUGmJ7r3O1asAB3V?CWnl7^JvWFF*EDN6% zX~gm@TS=N?0XI9lG9EQLjg&>1sUVNlvY;rIlO-&dlZ%suh0}_ih7=vnZcs|26^61Z zVz*@F1h7JKN{jH&U1IZsR;e-SI-6{ zeReJurrc8Vk`y$mG=K$domZ6OACQ|H3vd^q!=C-8aye)c%md;l(b8nn(B#L45lsxW3|ZBS6W5b-Edn-30!6KnDE054#~a8GsI2heZBmgEW2+pU;qQp!FS0b(MrHa7OAt6P8Vqw^D zIno*YSJ*1rNMa=t92_Af9O7PPKCNzSa%8QJ4gy4~s-pwffCs@5APs08KWi12jMfYp zHt9qnAB>+^2Pw!VN8F3xgMVWt!G^0o-}1T(K7~-!N(5A7lvLqC!#b}gdV;3Nv}RZl zTu3BLQxk#RNumN*QBu?h(&)v8f~qG~kiW=4g*f;K42>B~Sr|eMpC74-gLwTD)I+KU zdNv*#4wr_87CC9qC_V-;D zs|EE(f|z00Lad!+8gPC=kSdHx3&{`g!{PC@ku$1l$RAoGI3NO9_$V3iPi-~=HBbzAyFa*CBP@;pkyTE2qcacCk%v5ECe6LA?U?nBUc2bloW$u@Ncpj zwK(u7Vi=r&SP9I7B-7EDsCl8I2q$4xeOA>E&^L`95T}NQ92_A7f=(b1ILsuN1f2*j z(kUF(X@m?M&L_jF3CGbULA+3&(5QpQ!my@5I7l)~m?l1{HW?`ho&b}P{e^?6Jb|Nu z!~a@2k+esXj7bY%;{qv9*8tbBzUJ&|xEwi4nw z@hcJIkb!wrbwE@6YJ3O{5-1KF8U#~O#E`{=f8!-l!(r_qQ&iQ2k+2c#2&$5UkR-2r z`6fn4SV%}%KzVVj#L!ZZRv{Z!Jd|8f2UA899!C!7fa;(mtU(^@PyqC92u(#M^BmttbzHPxe3BaH`CHT#cPzdX^Y`k7-@xO9sH zZOW&AT7HkhcYPED*d*8@?0bq7GrIpKkXhdxZW-<>|J`PvE-X%cICZ6)$)l$Ex z`wgfSOkw$sIgfU9cH(x{r;f1E#S1?!B=Zl7ZR6coMpX#b|KVfF^5AR?m;yt9pHD@@ z)1xYul{yorpDk)F#>AHmA2URWKbo4D($ExINV$FK1;vEe(&jwua1YpK#DDg&lYKLw zEuN-e=*E_(!|5!;t3Z&870+xgxwf&h@D(Tlxz<#*8V(-h^D`rOl%}1U{;Rb-p}{LM z&pEp=av5srL;13g9?l<`-ub5btQZA6eeZrKI+M9V7La5p^lC}DW!^T=6Asn^$>JtS?f&&K1Dg=qsprozwpJVKJF5{a7AFP9OC_(Z7y$sX_k7;!wUM|E-J~(0i0Y|uYDJ}c)7yb1dG_%*eO1XY!ESlArn^LtMn?^ zO!!xq0oTX&?1*UoAYH>fB=s;&W2hGnCDLP3-~=m zwK`iO2Kee$xIZOjz{W zE;}l~-ofRM??5i}l53Y-%~C4bUWw$LozVgpX5$9E^$V*emiAp^eL)DVf5?YZ<=V|r zchQ>s&Gfyo3lk2p;ZFNX;GMnrFCL_p+t^kqPsQ)1fsxKq;p$?YB^TPv|5C4%0z^$( zD+ossDEKHSH$IR;qgkvTT=)Fi){j=3>g^XWDZV!QY8P3~i+rEkmc^gvUOC)urINf*J#N_|f|3m6*j63ET)|2ffA16#LEQKT3fw4k}{ih(OvJ`CT z%d22RQU6quVI0bKY*pMT%c+bEIJ9`TdA-;S%)`Zx@EAicBnBk<*$(IhJhcxYwIlM} zQfgAeOG_^2^J2JzdK7kRTssTmY4SX~i#MqJ3NPjZ*u9j*-gT>2iuJP4K2g#GX_%`$ zeYd?rAnH!$yKr7$5}l7pMGvS^t!s?U&~yu#izT~v7UU0?`;bl3ne7v5<7gtCw8wU1 zc)!o**3&sVG}xPh+-lLS_65yf-uFPi%&9cUgYtONDoE1}Vh=8R>f(-BppEV`c3Gi< zKG0A!RThG3#n-knOzy+4ct&LQ%Yfyzb^q&Hib0e+vnc?ABZ*ia)Jr-EDi0KnLFTxl9+6_?#?MuK)e=#eZuF%o8a3_k1HGq4&K2&e~z)m*2le zezYSNB6TTkzPRjPzm7d<6LilLjdtx0f=qQD(ZyLZ)}FjbScp>uDw*$PwGKD-dY6uB z#*VK)i(4tZ3Hy|;Yj7ZcJp8DCvYus03y!3SH~~sQzkdzN(hqi9Gx<6QE9WAw-;ZpC zbLt=Vir@acZ^19<2b)E>inClvu~tOgFB3i(QaBT}{#5z(iwNd2bGZ5asI2JHf(@&X z@QhaT#Ez$f+VQ2Qmi6eneXb99DaK31mgb>oXdi?NN2Ji!>dNM{EGA>DBe;qznEoRf z9VO6pU!_;nrlex=d74C_DewMeWX0T@+7Z}4cJ$k(;L2EW-TEdKejY5^=P_()G!4-KqH}o4~KqM_k+nBK^T6Z9m z$F-O)A%6D9^0QHK@~7+b#?IX;-_|~cEp|YKcm3OJy6K>D*x}!f_f@WG=2bVcZx_Eq z3DTmke(*gR;*>Ng=T{7CrfMaS>$)KdF>cciG7Ho6?Xo76Nw${4pz;zUS|5Vk!4Oij zJd?C6noo3*m()k|5wtd;lfhO>Td`x{1tpt8SCzy@niI18K)Q4<=g(oSW%4U&)8c>^ zm*rHPO;`_cvuc-fdw-JRiKpVtJF~P!CVBVeCQzoWS8VqV2nUJmT(DX&HTz`_qjI*O~Acmi~DTUfZ*;R zT2vZWMqE}x`>4d#0{J-V;w>>1L+xE)9_3U2c3!eu?UTNw@o0EpM+~JHqTy47@}fxS z>dX?}lGJwIdS)}VM+Wt`MjvT5@T(*ApBw<+CVBWGyHFUkxUd3kK86dF1F&-~_R#rU zyu(aq+a2gr^0k`8W&ty|uNG9g^ni~fvUO2-G{sif{UAcJ{H$5vpk7p@&+?%3i0jMl z^^1wr-IH*|r{?3YJ}ez;Abar!3XlGHA=500AM^iEV_qRzJz3VIBTYSGmLLClxcx`3 zUcbA$+5aKadR!v^NXXN>5fJq$23>c3nqi(IOmf%HpEM3R6eJOxbk5@^< zrTebV_ju@4C=T_)*Eel$>j7CKx~xK5@Y!9>x1~5?qBId|EQt+nzoN^lisF!^;^`-s zK9bIf!i!7!rG#r;rUM?NwS_$|9+><&)!MVmRt6%*l_Jaa{c#T!4*@XGr>}et9*dbR z=2NuSHg3fICL*6deK?q#pFOGHXdi2KS<@Rb$M3uo(te2ebeMv>G-WIOQyv`n;dmlF zIE#VpIlNc11fT?uDa1s9yFH5#MQJAs8|pwejUoZ)YQfGHB_yb~-Y#&PBznwv+-)7( zpfFOf4$qjfar&ddu1?ZbJZwfH+V9a;a48H&E(}f=kS+c3b-0i-g+)VqWFe{J>hD>foxjLK4 zS{t$(T6ID)M_8r3V*ZGDrdIn8)H0(K17x%V9pDgY_}4clS+9i*dPke>cr&lf{xk07 zZKJN~{TcZ(Qwu$YciM9QL}2&5*m&kzgj1TZjJ~xm$*-tPwrcA zBw3+qWWUE$Qh_@9+Cf@e{zTQzhC6HI8KptQKr~9^7^Pu$7Bm7n#dK{6(!a4XZUS})=jkz(D6!GbN7#9c}8sKQT=m|m2c=E@M`^C5btY6 zux&>q4~^;hx3z4%c$ z%b>?u1!tp9^VRyxBBv!8x@XOT*J)w@w!^*Czw6>)zQa! zXqkd3I>TrN`RRDcBi=2{)0tw%!Yw4|w57U>+_#nL5tdnf5^;*LS0M>yDfx%fsY(8p5d6Zf(I;>~`;zuK{} zRO%IW4z>7jNCEHsMm1En!Ul>Dy5Nmu&^QHt{hrWxx82xw{UMtwSX60H-$Kv#J!o%f zVv3H@u$I(=CC;o%HYE-g3y6d!{Q0+0{PE`1DPixmDfO6guaxypXUC_)c!|L2BGjuBi%3NFidp$8rI}$ z;g$5hP5-F9SkiV@%CIA9cQOIVMk^F+DhP%=36?=EPT7|w5j1Q{M|hBG-870nIiLFMMR^25rQEfPtf?P1I1rQbruP&CvCux8K^lC z`9aGaK00-W8}q~%%)G6u=M6Z1Qast^>U#9vwAXg&PeGk&mJlBu z9#)(=wtqg3U)p22_5H}ze{by4B|n*GN>5ccp3eA|PG#EN8xB4&`2kvCE_m2-MxoeZ znqzB1MoJ9yz!|Mfogb;}k;V@r5nJav7n=y|neOl3fnuVre_sJg3thSBbgoOpD2q(^ zi=}tF*pHjy8KKO_HN7J3bZxW5^<@2rQk$Ds>>9BvY~wkCW);C0?Bs0Fh zbD12v*k;A8_1B`qODjd_&3l*UC0_t_akTMCdyRU;hGL}PNhCWpuZJ&)TEjR3bJ$#%V>WEw~Z`!H*a$kDR@|QAxsggcg zxcra>82By%w0(?u-9SEKJizZHtwb!k#*B+aWVps6U?vq=&0zC(cFYfOW zW+UT`dTy(OuZEU6LIfi>#5Y?YKg1uC2S7CZ&Q34KrCy(Mix6>Nd9eW?aoU#dpz6a# zPoG*Ci!YCk4(a14%B$Fwjk(#>n&NBVi8+u+vW;!2$u?`s%=oQXRZ?`+ zN#@Iy84+RI)9I7KdQN*@du1@!T#Ji8u&OMfjO{q3zog#2us(__-Y4VnMbu&G(f9tJ zky#1FBB$6p%Mzwiba;Sb-upZ*R^)?AcJ>Qq=5;E&Z#mUNW)B3?1a1!ZZU0uLWx~8x zy1G74xq4F^6ccf9d?Ly;%aF3I#t_R*LVpl%z5GxyFaCTBN{U7{aE~F<(wQ(Fz-dqj zc&&?j(h_dWdpK?Kb}VBP56sgmi~WLz$s(;5q|krs3RYsb7rGn%wY5p7BouiaRdJ}s zv%w%#u(JKsKp1sj+v$O&59k)o4L@{B_a$j!;V=`wY(`7-#}>v++=?9;Y|vk7vTx>>KK;tY_D~I zs0B$oo$yF%jLnKqgv*nuBN)NKItU9AnP!j zaCh^KQZI{Y|K4!LlWR6rNT{+jB*Vtr^ZdK#4(qWF0csD2HCPO`YIZDLFCMgCO4pd3 z^tDogY;M@0x=7HzW(P07k5l-U3KcJ`aLd}g;3Ay+zA@vZuLYe>-Y#^yUz~~ z$0Np-vz4d@N8(xhpm~Wj8by*n(fDH3kwQ8n&1i}3*MIASJv@_KERA?*9P_fX6UN+s zh5R`W``h}Sp*)Zi&@;Q2y;9Y9H#x}Rq{%DtrkY_Z)!blTE!ugh$Ykf`&vCV}Xk?^g zvAzl$CcRcLj%l+tgh?{6N3lgx)z=K;=GaD5nI=C>pC{(9rL$Xw*w*A5fw7W`DHeaM zV?sx*^yvctyz+k=1Bp7sleKHo{un_U)LmrwY)i43Irr~?Hdc}tSiSjNm$0VW4Sm3p zgrj*87C{2$P(!YgJo7$YhHtQcNdOL=JiKalHmxIqv;=Fxj2G%`>Ob=DbDGMl2T6=}{y`3dRK-sA1L3X1d2lCES6k6kUxpqdEOIvS1Q zQJx9A;yDEf$aP~jj_C%$H&|^Kizn7}mxe+OU+aJTH4#;qj2MpOcn3I4yN%Hkj_Ry| zaDH41Xn`RrFnW+0Fw%O+4pxzzir?H6@ zaWGv#pxzSup9;;Q1Os1W@X$BY?>MiFb?kDZLlXfa$Q7Nd!z2}-{by$${87g$2|K>g z$VB?AbPFeR7%pb2pZ-c)nqujXCNk627m0ES>?Z`Tkl}z zXb*7fotJMKbU-8~U`mN>VTr&M)cQH>nSr9R@8XrMzId%o3-pr+x>uI3HAL8tm$#fW zqAJ6ViwEh)ZFIfvzioIXO27V?=nnb@8~Q`s;&@)nmERV%4e9_ANyA3h?Yc%@LnedY zB{PLIE-CDD{#>Se|NHlcWs&>w`-fd7an^VqRuU)^Sbl* zfA!ej{3%SLI}j{36d9QZ*Hf;fCINu_GSb#-5bFHd+Y2)Zs~OU6_8P#1v0M+uz){<@3()| zSVuFl-C8t+1P!fE&X&+AG0C`Fd?*(rc}XR85o6`T6i(}3q?e)y);;1i`Y&@Z7j#p| z$CN_cY+0PigmQ#D8X82^Hz>42g|X^t>a~Aodv{rx&HNg&m-iYchgQ?&js^t@OEu`Z;1PDYZdeou|9w-n#5#}zRt{B z65U48z`guwo zKSB-`S@E9O=&hcU>~9JJksJzb89fEI_}C&JG-Gz<`&n(j@hy&KF>n04#-dH>`jJjN z^EwtR?8YFQ)G< zu%Y(%Zk*ni6N1=8%mI-tZ=*N=D!N8n5h@-U`}!PD{LIBRCFuSJ4B;^dU_GoX&jXSl zUf*1H&DqS+Y>fy1+Z!2QR5PTfP;ZUD>{!sx%L4N(`s>Ek{8yF~44T#B2Qme-OC2Pc1%4^+qW4YK(D>lZ%Ed9(Y`P8B3@ZmL; ziK=KapSA`E5D8TVQnx|xCD#%TYYbd_*rpM+0@Bh^&Fj;$WffDVr&T@N zWrim<`p?BwMOc}05jCuLC(TqH+JSkhde@UU=*`QoB~D0yN89Lq^la04*|=vL(GH6U z%*?`vce04#HmE|;R#r7vHkd=nf%y94OHFSbbF71_#rR#fam_Db`RNXTlp%V<*$k9kWb{(pXY3 z&(wnT-Gw%Got`{i*w_4CxH5RDg=#Nt;vc1UR>#lOimM6$3s<04=tNshU6^kIB1Vd) zo6iUb41A5VKhe%rbqbdBO3$cD)MZui&I+-Fmee?rx?J(7c(;#(d5G=8-YdQQ!s{h9 zDLM+_NN-Cb97sA_DK$^$c%^Cqva3s=Kxryfjo`b!^lz_>)9yt+K=IggAI(9ga(LgR*C73zC>Mytf500AJr3p zP5%1W*3j&sU67vLc6_p z#8p0q=1z zq+5901WH+U?gtH(I=vj6-xSq;F5@I-dCN}javj!o7(?Bzqq-~gKHSwo!VXsQRbmL9 z)Fqk!s;3iWw27dR3{ts=J%FEvT-Qy`g~nsln%YxnXt&;NMJrL8HPKIJED3;9rwc!o zfloe$L`y!691I!gp&*g?^I_FBSS!_z+4;U=P|Ez}J!2OateRv$K!66J7<1q>q|Ey^ z%89T`$;@Qr7i{{KfJey%@=aNbqrZJwF&Kg^5>Y^^{Tn)bCrNq!4VA$n!3yRPmJg-S zH~b#3!Ep_SxC_UyR0B3r31>`4T3Z~o;mSnj40WEWFJp;XBVL9|b!M*0GpdJ( zj-M=bWbf~Jl9jr$<+cNs_0&gbZ4lCaUoWXEUMrkSTI%W6T-6q$OmrYOb#m=V*^#xD z^;S&ER9)3`2?4(ylaHn9ye41ByNT$@p_IClY-WrQ^q9gWXc z1-$lk!2SL0<=d(^?0K@NY*zsUNOcJLo9w$(|-Tg+O^Wz(EBq}V2MtrYQ6w!{Ss`m1jq?(6Rx8Di$Rc+&q5 zFcstY%Z{T6zAJt+Rr@$%+Hz0<=7~&DrL>=lWnPV~2S}vTIy@0Ey84brM2QS9mt3Nj6$h`_CvA`XUElX5;4DR5oDshs&Z0BqI5U&Tov8 z;t#rdEwIA~Oqi8$-$DnCfZ{&vX622Ku6 z>7~yBwg>9(L+vS+z!EFxuRy$fjEqdw8IVLL(Ja{-RUcj_a2H5&M|n>2S8#5Q+lC~G zRadvyw=~)Nq9r}maYec^Cd0j#HJd027KpMOz7o#J`E~89FAv#(l$~l8TOJ4&JOT$& zs~>=1=RB^gm@<{Uj%c#qR`eLZwe^YcoZ4-FY-Yy9VaSv;E~^)f&|uvEN<^xWeLef;Db0vKJW@W#mfP@gC_)dS4QJx>quXRp7vW<}d1p7b z_V0kI`;8J|M*76wO9i6I6a9V@Q!wDOd&rsom`%F7BA5$)70uFWW%r;5)n=T&_)iSz za5-wJ%I#Iq7(e z^yGbG3}|hz{F57N3g)bN932a@i=F>%C~@Qby^-4Feyp7(>(_v1&5iT5A!n|X)SEow zIH#C{YoDt22x0|vlRM|cx*54Bp(7opX^XmV`-)V#=QHg%1NGvHrhp%Gqskj5PmbpE zXBx<-nbFY|f0HfeqrOe)2t2dOx`TqMsP)f?vbj+|uD`LH!k3x(Lj#$VJmZNykS}|x z?Da)!H7TH`oW$_16eu|pigo%irsBJPhgZx+2xdl^m)KiABaSkv_SC)}7j_cI#O`#q z)@9Zdzg;d?Y4_{Etf`4Vr1J($D8)$%gg|VW-Y_tfE=&n6d+ntNyzHj7me#1x5ZMBb zfGH}<(+92We|*=cH%n18a+bg@=JI0xPy^B4V0V>R|H2j_4bfh3vyf%ydD+^mz_otE z-pO&wxB8;=)_=Ti{Oc4emNi0Kw;$b_JRUbbbB$6vb%*8yV3&`B!$Vf;=r0Q6YF|%I zYMl-ik8N;!J9b-uH$3*^ay{^q|6FjQDjedoA}`jw`^LmhH)`mKfnfjtruZ>!rN(07 z0xQpw2`ektNPbszZwvzO!rZN|sJ?)@(RMc-yyJ{Z3lLtEc3=K@-=yHH4c`&50ZZm8M%Wcwxt_`Xy;9Ax`b<=^11HpOal zhn3CHuWRP64{PH`pzC!}FmT9O|2b5Hwt8BEiE(r6faum0bcVqt2&hUaAr#+5*yc82l3{#|nW zN_vkVQJ@yeef06^4PQz<4pZ$^aS^zQRdQ(bU)&5rSw==g-{Dm*A$`T~rCXljhRRQ; zm;E&}`CE&+!ha>j?_56Dl#OrK{v~Ru939;l!|G_U`op(*8uJX$d0f3)gKWFcK3OE6 z#WGf53S$iJ{TgT9e3UTQ*?GwXgeROIsWG2D@&LJFE7({EuRDgG_=%VZHYu$0dbH1V zePTipN8hZX&8g;p6rc4pg}dQyzVmvw3Jl+`Wq^4~S7Rt54|!Lr+I(N$v&V*Z6o&eo zy5Aj+OWb%|ex!Uz@pQlF#}dpIUww4YEyWN$qb=y_a13mb7@C~7-zw&)Xj;hI7-(TQrqBjBzUNr=QHCw9zA)=#Pm1syMtFjoG0tGo965 z*hXAuFD5BVqqy_1R?4FATZ3FvE5K>AP3x~W{X_RY zBbet!%B6MF+FSJXypY8vrz|m1lbwu+Ey|I0l__3UhGWUHv)!w*?ZLI8BT3)~klix+ z=lrX=aNK6%Y#SI!r6AKy-Tfc((1|X{vQqVA4ZMX8G zK=GnAxW~@5_;^0)&@sCq%ntLEH61rRtFun%(p8(k@?=1JJGx>yk#4C&VaHDRAe^3R zzxIJB>!ig8#&Fbk0_JgxV3KnJ1ZqFxmE;5c-Wqmx8~N<`kcIy7kjAo{j?R(ql3)6q z8MoD!6r#Bm_FCCb3z#GGzy2cI*tIwZAr1bds-B=l%KdZlt&x25)m0>UCx%wn;` z%KByBGLAO%LQMkC(rvxAj4Z+JZm%_WSamd9xR`FF^^Sm9>z(xQFiFL z_#y+3v!qp}hc|t>aJ+3Wj}gCuEk+EPeu%@FsaQ_e8aAw+IdC~LQaGBkYbD9|*!!Mk ztev?-m&eN^dr_k4pt|t{n8}q?h`9R~T=E-#*E2O(`_Gy1$2GH->Iv~4X(_`ar-QE| zK18d6`>MgqJhx&d9cZBO;DI5AHr=P5;NHMsjewbdNX)xttGL#{5hAl}OUyjHO%b<= zatk#%kqzT+C|t{O=7IluUCzX}@7O!F@5aU;VYz90H=XQ%j|Wr&7;y)l9&FL$u+1B# z)_y?n(|A1=WjT&FTZxqUnK0zdhz-pd@*~WyyZY7F?FE$$pypxKcWMtvkCxu0HOMEs z|BvpwjXXd}5L6{SiSoZ)oqY0+`K%OcrJ`v`@Ln?)7F3OKgeMO|GDX0VZ)Fn;L(WM; zm}*%~231+ea76*!*S4CnUDN#YIQZHfM7X@VOYWUN#A=l}BWX>sMg{V6I+F^f9D+?D z%Uuh>`DuEoT6HNgPv>SGI;>8>CJO@U=$6<$@* z+i!@d#P@*f@#;9l!L579%x2B-g!a~J?DV8a*FE!@5d;`@B0IxfoP>>-U#TMXhN+ZU z`22p^1+onFrDBwZJTGH8W07m$4FwQ4SzOt^SghG9@OTj3FOGU7?EJO=b#LnKyH9eM z`MS}gju@`fnLf4LL1eAdlGVf1?!xcrGM7uTdnpD7dJ%2E&SM3O+b1e@xZ+Gh%f@-= z%@HE`-3wr{Z2I`vPE;c_@{%`OSJ#}#EyVt8u|u(Hr|JRxw}*28ztn?TvxkCAoyPU1 zE(u3n<7DsZe$9F+y1W@$@F+J0EyV?%xz_O%4bXSf*lyQ0WOoDw?^@uVj9iAF}TpC4Q+I67A&L zFW4`ZY1eiy%)(Pp!UX0nH>LHLM^FBu*3~Z)h01hhOv##ZS?5vpXjsuyv8V7}iQZelSEUx6lZwj1@WtY(dM7 zAb0{TVwJ-AM9BsOoyrxrf9zw8xyadP^5g`z~{yubVE$?PdwZu{1X`97}8)hD9X z|6KReCYT!x!9uEF`{?!@qQE@q-z1zgq^x5U7PjwSG^aD>%v73{0 zT{;aE&xqECyWU4os&ig6HE$FFJ3-?_c)r-27C#spML6v~=61cnEWrD(M$fII+2+u> zsoAc00j4TpBKh8K+dE?Vt9$x5KQ_WrjFPNq~_0s5f6(?!v_+)}G1Y^Ihcis{$= z!)uRF%5bNZz(9lU3%ZTTSMK$h;H{4}gp;RMCb@S(@oyI{Z2$xqqQ0XG{EGdrqSjHJ zA@S9CK?!TTl3-JM&DUQ^H(okRowYV4w({BYJC?0RV8|WA)9WGzIPUroi`ZtvaZjqx zofulQ`_B77Xw7}t)*}p!{druq?rr(W&L{f zQ5Hw^S~2M#vVRlL8^Q<*fYZ{tK#@ly$4^5q*Vw2+97UVucl#K!n&JwrdTtIMR^JBC z`2Tz!ro(own=a1&9DZU<`44&ZpwFU(RDr7hr$o<(_!$ zN5_4Ga5w`U7g>$gQ(_D*w!y8K43u^*ap=tGFYWGBsT zT%3%%C@pexid_M8xkN;q=f+)L)B2J7e%a*zMgoq9`n|jMJ7L+!MrLPbjC6L{bj)qx z9EqyH|7Jv6G*=)vfFCt`u2_q|ypN5~Oqq))3L{Siv49SPY!p93MWg2m^*Q#KLkeKToKe`f; zKMX3eC1}2GwhJ14t*mh|w&5Q<<{pztj~^_Fag`N7Wohn}7XtOtj>&(@grOQyh+~_z zDAYImTHjWttUDnl!W~t{A*2jq# zqYR0Klu=7Y%|Q_ry16(`8O+~eyO1&+UF`@wdKn!}I^ajgXox$Agf6<8ntFD|m85VE zu!FEg+hZ_T|FS5wjN^X;7})hAD_O#UJ490UX;Vauc-s%zXZdiqUHj!E&XW@!wQFg# z*|CEhX}>NrFtC;)inLbCDH&lB(cpR(x$yWhOeLw(Mx2~T*ZSYvfsYBZIdXVHi#oD-pmo&=^7-!$8DQp!xK4VHW;mO zjGD5C6)IM=NF{&J6~H;dC<8&Qy67_@CPh%poD8F_kcS@MrvAMI5E~RaAV!1`QQ@2) zMRS3rqqo14;JY;@-_KspS7i%@*A!GJ*O-r39;HhA^kW&Vz^J3$jn>StFxS7!T1??B zSd(Jq;^7I*(Ic`fEwGW&70TQ!<(|(5v9YMZ$EZ)KWEFprM9gxZ9Esu3(!&NRk;cN( zjj}HG39&JuCvbY0b<*#?O+sDhX0*r_l-oc?EMl=Dv>2nnDJauBJ+n21BXNP1L7GOI zP^2kGs)F&W9dN-g-OO5h#_6%5oOaL5p&w7g`IlA*GURw?tC^_Tsxpy`(muK6>L0~Jy> z54FlbJ4p2ph#SxgL;xLXrZ_(TX68@piELAi{7jE$onEL<9{RbevIKQp$->dSIMna> zcByGbQyZbXt%n1JX^s>1rgL3E>1^!Ord&%&zYKp&7+bO$0nl#&|5MQR_``^S?@91A zuXb>p9Er~Gbt?vIwXtj5ppc`+dYVdbVY2WuUzLu$Je&U4o7N5lVM)kx;a|H&nwq3h z737p7NlPVjyWc+o&3v&34j@ zMtOg_na+J3^f8=zH|?Tr`6XIRUEDQ?^^f#>rxxDpo41-9k_(`FbhuJiYhv_y!G+Im zah;wNnMu90f`cK&IC1B+#I8ENIW>BBUG1nEoVOhlDBfM(6q;|1_SCwz*pV|N;Yjb3 zy7zsWZEX02?o&fmpW!4SJ8Xi}6lyi85`KS1(H(Pxk)h&p@YhQ~L`F!03>Yv~Scq*! z3`EpBbup)2y8O4UCN|@XjBKF3+qT|2Z?pjt;drBxZUCiFC0?-?wIcK{Dune~^SzJ9 zgqot9TCN%pI+>|Xr=558&|o^E(`~1Sbix)ias>s!M|Kj&9kkdMG{c8@@ylH_Q*(bq z=az8w6O}ESC@7kMarYd21fV{esmAb=49+LR){KBTP}mmc-Ro*>{GrnCCJsdNns!jb-NFwRiI& zHQp0CcXY76oftRSINgW*p@RJC)U>^w&rjY&$AiVvBYNQO&aOTWw!gg@hRb_xqE1Mo zA09IkjbW)}e~neUu0zIU0$NT{6-u{6E_-34I7gtVZ&sQKkD4os>xchu4pM)$Iv&`TZ2Gml94zLpRnVF1gQpBRJ4AwZe zjrMXQEB4wkPY=rzaPrTH#E*7FIM!L)*f_IVfbk~hk_g0%?y|!GtEp)0neb6#bd93= zNdj6QnD0?N(rmZtblmWoR=j^=xSgU@A^YUosvx%rR=8H0GuBw2I(5w)beQ2f5V1YE zR&AF{(hR?3(;0|(d>qealf}m|hl7Zd2<*svc&;b;<*%UQp>ffN))L$iXcs=PTz+-W zEc8Io9dWqr-1hpYGVWC2rcX{&8&H`hVEJQF6?QB{Nfb>4QC}rj9u%& z-^EQ*L#QKFOm_Uttu{ZC&29S2m>$hih|R*cVNXhhUhp?T@XmrBdez+pt{s_Z#{w1J zf99FD&KX<*2aEYRv|WFXE6;?7pa6%5eY{3l!=xwF_5NR9ZrwT@^b$b&?jtJ}|1G%S z6s_$v_|R6r!TP>Vdi{J}GX-?sNt8^iXBr4lDet}kktn}^Jgy$DRhcsQr7~10I)1Mc zULlX6v+bnU>G^zkXNK{3Ml^H3tvZd+R!Q{KC}G2&&@P4$9jbr7*`A@WQ@jCGa2ODw z$`mJMRqq$-Ttr~Y*cixiUZQ`Nnn+00`zC#-Psg4-Vj8?yWWmefP0DY8%xPJ!ff394 zASQS+V^Pbri~G~~L6t{y?YT`W1{2m9+WN`VyJ|hh@_G@G2MeAXNmHE$bCKN4#MNT> z-JLxoe(`aJ&L)2dg#H0oVqrkxWEe<5Iy81AJ$|pv`m_CC+y1}wzxm;AjC2)FR?>}d z?dEtA$A9r(xPq4b#5Z=FmK+CLp!bN#txq=-z78EeS_at>8jb&bPbAA>d+RI8MDK91U8tE5}i~Lqa?C&sxa}_0giGPEu5Z@ z#Fo*Kq17n&lS@HewgVmc=ehkJ_}yA#5ICQG^8oH+>fvG!4BUn{o9EnkREn>pkQsA@ z3r?QIy`F!%2y)W6PFbGT)GGEcZn1ngCBdD0VrHEc_fFD}+p#IWCLbaQOgdrVaeXHG z*XD9Ejj_{ej6AWt$FydAx<=k%SuUWh@OGn}hemeXXu&>-BqLj$Fw9neu^vX&BF5Jv zXXsyua^#XnGyBHGB&~3x#OEFFc_!5VD3rWvfn0x%<@Vyb9=jX>8lo9YW?L26t?z^4 zBVm)BhXN(10e!;Ri$~w#o^XAxh%=aB5!8B@=}sS-r|I#hRg=F{xl)v4y+6;E8W>}R zqx153+&p^58h$tl2Rdk;MkH#^BP+Dl%GAjb&$xcLF66_zb3sup)&4s+{`SsK?LL_! zjw63On}frhV{$qIc9qU%XmDJ|6a>`nI^W{DP~aTaWB4p8YLtZyQg?NY+!EQV4gX)Uvo+BLfZ>X6?k#@31;xe zGCi>V)#X10Q-rzre}v{&MrO!w4~IICcG>aaJQR-E!@9tlO5eKikF+PS#X$v1Pa}UX zc_Kq3d!|dfk`(eQojvJZAh~FYL?W%opSDk^o65GVdzr9*$Z@lG+Z({^{~__>I6Vk$ zbr{GxzT?(f>~N#p=bSwbh2a{(3`}&y5me3PG7OMYPbeFfv$LKa7{s9S_~w4q-F7z? zmv>B9JvX+?(@jM;1ipOde_qrXW5Itmz|vX6cRsu|-!Uz)*ysi(HHP--eWy8|Yg2sc zRbmqh$@N7Pn{pXs<@D+H&)1t6`tQos1l06!ZAWs>A}<0%5JjUHZ*GfbE{6sxBNtK6 zj8s#?+36dVgr-z z=%=0Z?DG81gD}aGMoN?+5<~zfRw~d|Tw@$f%g=1Z=ta5~(Q}BlP}|mG?d*1UAaXH> z#WURrBIW`M)=cEtKXNtQCbxgqx%?lkeW+dW+rZ+2baEN4SeSD%x zetDZm7ujVPT`V%YJNPHo`Q^FQN-)c^2SSC#aQd#>hBkL3#L9}^`(?Jze)=Km9wQ6! z_;?(qkYV~%<{odw&bIw78TxXXY8Wi{{GDt@8(5r60M=)b(uDgHNeS7vC{ZvDr1YFdfI zRS#~)3%8~+S#bpAz%Rir=bjVbw@OAd#5-0`3G^{g!a?l%c>6wAeVN;|qbnmNm#pa6 z!X5JkSTE8)VeNasQP+P?|^xJ(6Sks~Yg%a$S5&*3m-HGA#k)i)SoIWm9vXFWQnAf!9r#+15; zGwW?pg5BGOC)3_y+BaB%5-fPkp(1O=o@BJjw%Q11t#g*9 zGTu+aEshmxp`M9!>mL(vSfZ-l7VGS`Ww1~K0AhvP{!|YfeZAWJs~6b0_}_BP@s&Nz5YA|^Z5^FlF6uv}bH2GpSuvee-{uv|rCf*Nok&lIw+^m%>_( z7E@5aRoKQ-6;ZT`Glk6PVMmcwq)djdS~af2dPcu9mE=(j93` zDRVQky)rQaM(rajJSQA^CN9}6nB$K%%K_4>ORr=4m{};ntyX%d)s43~?_6T)0tnFc zZd=y$0@QibUDU zvD0HZ*%83F@vY&j8ICqI2Q31|O~jka*M5t~U|7@L~PC2WTd;`#F*I^=oj^zN{G zRc(2V@NR zHFoXq(N9#AO*@KzPF_Gc*6st%(d-pDns zuE4Byt(?0ogto@b9vVE^9O&v{WL}Ob#NkU`3#i*#BP*ey$ho*XOfsKMBHaA8OGb!- zFwKAHy*Dx?&KXhClJlK81vQH!D-K+?hFB`=P}<$5HM$}9zXB=mUIcTHEHkxLbap!} zCg4r{jW<3E1q+k;`SWMSD%sn0kgbZ+@hm(#o*_$U8;FuKDNWm9VmM6*=G$oayVpIi_)n zsX|m&nS+O2!d7=q@xkc}afP)G&JoR=@aC_FX{xpo_SSE5mE@Yg!ZWAh)FtHZL63jd zKAYTMaW2?YPfnFmoBZ}Fa!wEryJT#jnSD{h~KB{5i@guv;5dGaxj5)$JjJVEmQ(Clj$p2Q~1ICbewgIdFP4xHI-YUl=~gNW@|u_QJR0E>b6CtkTco zFw>j%x~wK;8?11dbN(&^4FN`Gn(rq1YyHnu~n`X|mg-9#SjtNAblM{;TkrGk`ALJh4mG%Ax!CwaY{M_sH?eWcTo`)`_)n>h?N;aj3DQ%CYZ^{Bwvhm3}ZT`5r zz-cL~x}mAI=QcRNH4%TEZcurYS`lnC?35^WnTgLz#fyybwpS5s)-o_Vx#_YmHQJ*+ zSLl4&Hro9JMZ&^NBB8qWAR{l7Uu|>FwCgx0_o9B;D;c!>y=qf>4tU$o`!%_W=@Z;f znJbpRBP&2;=ab4(Ps=_yiTbV>J++l->kjH$bg*;g#W#^7H*$Z&#I`IQGJ!?~OpOBC z+zUo3qDKqZ%=VhhruJM;O8N4#`t2M~#z>Qr-`aifP3IcolHPFS;-|Y+@~yXH890wLk>a$H)zokV9LUE1mfup&aE4Em=(nb$$Z*$>vtn%QZ<7Li}WS3tDq(Fa($!7AeI|woxFC#CLbQqT{ z+;Ev73*Uun!sou)+d*tu$4Q;$tR-PqS_ko^cgrU|f~NV|T|A;0gF~@wJlbsmjZ*MY zOK96yKap2j)uh)8gClAW8Xo9tw=dsYB_Tv4L6;*dkJBa91!=AJ>cadWvWX)ryf`Sd zg%uah+hKo#(XXEeQbIJW)W$SwXAywpIGqB=g+k68F! zw0J*q<*rQ_#K-53FzLCf!}9)_G$ICZKO|I-uO|uqe-k<@J1C}wbqkJrybc#pl7|*Z@qS)C-)p@15%5@fQFQO&T+x1U z7WgA~K0#}yn`JRY6C*2h7QLm=D#chi7DF!%S6`qvTaM)s>l@zLMYhK&VZ2!>2&t76 zF&cmDXq|E~j)M+%bA?9>DTChK2RCc7{^wyya*dvMI57~krnXU{dbuF@=;J*nmFr|Y z%pE6^&#UO-L)y@MU>T z?7DH4BCmt>&e-*3`;3d9S0;RN$&;k6zXN|{`ztV@xzCdcbF3T*!FkvdRRl&w!Ttz_ zl>j`EQPf&8*)7{J+8x`eo##+FNS&(idLupCoE|iLcli9-eZ8K}h+)GHLV57PPA?mN zzi)q$A!mdGxcwsjORXG3wa$Qb^0aG$Ds_XO>QkWyW$zsKZroUYkyBe{22@fZMPq;D zSC;ZE>@dKBgp!2dp+Y@FyqjHsy>}1OOm~Ot4k@^9oXnNhU8Wa=)Y4Q^kg|iO5(u97 z@BHNl+3)_}#^|T)#~S^9{XDWuz=;-A{KO}>Vh(+MT>hQywZn9pkm`WnNw!z^2~M39 zXuN$Mds82Tm~-Bv8v@+nX1CnJFj#*QndPG@!%w%}J8K0YmY8vGZB6rxge2!_*fSOH z#MiRKK79K*sW%mDWI!0)@!D$ zl-5=k#z(>3fqxo`)K>huM;vywoXor<_M$W`r`GG%_9v4qL-V3%%I&zVOi6#p=@HD> zn7jPE6LfT#fme@SPJC{-Y_-@&L=o<{T_XePh1AVnKz5TaqmlH8y{RMLd#UT3Cb~#j z!MANAD@`3$kRvN(At-SJOa_UEgIYDNgdqB8k43jwB_l7-MQMbBpty-Y%GxhMgs%sjIfnhI9 zk4k{_-a;kOULz~Q(4o!9b}~nr&Lc15AC_MORvdQ~mCm8Ie$es9)X#r-`ZBD+8d^6$ z!5G;Uow`BjjP4>pFnYN!q06qZlNdT7klncPFXLh zTBmB^)He2OZBeJ5yZt_%+ZNMY@3F`*tgCr|hGk|xDmfbv{UY%1;;&(|m|<0tWSiLh zpVA#K6ltF_DH~xk_Pkl{Aw+l!#quTY)f+Wiz^{H^Jl%hb;P~~;UevvN;wUEN~=No?`r0NM3tex&Op`~?A?}-vy&ZWdi<;L+`y)nvfqvD5tsgKGg+1Mu%yyL>F zClEztTyZD+Va|5_)4=_#-we%ZoL-M`d3>&lSr)!7n_W?t7edPtWS}DD0TIo4`z~@k zRqQ;Mg|XOmRy=zF@b(VCyN8@}3&p}*;5SMP8WMl-N$<%1M(;v0vjlzv;|%EJcewM8lzJh8ZkBb7ougFT#C-1@5Iuh4H@ zn*4v?*7%WZy{2tvv&$!1RNbw-IH-f2qd!iOIEChVgLM)Nq$2o!SG4@Tm*#Nhe$Loo z-OAm`Ol*w)cZ?F|*=Dip;W)K`k$&%3x!n-RXJ1!Hkk~@NrfnF2vT?D|VEUo)|QY{cH_Ur5LwNCUa$SDYSmmT&Kb zpp6xIE;gY6K|6G+2pwC8k%JTD?^cbX9x)gK6e*n*twHU@o)-?Qa6pjmWj%t_nR(@E zjk;5QBE!>ykVu0tEUEpF`vdB+>BE1KjAW=FzAy2=sQvf$Rs70yJG$>WBi7-O@n6~@ zFhT1reQ(p`=YPfafXo$>;8|Vv&1j6gEwcW#?HnUh%hVyp6G z==47{HQcNqQOj_2bSCNVc$SYU^OxuJlv^9%b2i!1tMR$R-9zuG5hwEJkCuPVWTaRr z-e4+Nim25a*kMV`_THTHv8zHP>CVeoOPG&7ZhGCNzQTxtlnxJ$k45!K_!}j%Mvrc_8uA*iRD1CfSZ)RUl1NyAj^{M1<#1r0*b-72(SzT?*2>4A) zyiKqXVmuJ3K&!uUv3mD#qlSMOJB!6>2)V_|5)vu2pT|@h37*Q;zMIY(s58wg@%5O8 z5*rgdsaJO$eD9#j6v7Xb3qT|zD>JSG`(m02#$y`<75uQ-KTJQy3*0~t%>d~l*S^+V zV473eKyHfbh@9dk*&+tw0jTz+Ib=L#lz64lMWChZWx7l>%df0aV~2ml{0u`G5Epog zMnoM3Oiz#;K-s|H?We#X`YK-J!yiN(CO!wxK2Uo>N5j6L8IvaFe~vq+Jk4NkbPuNT zw(YTOOSYg3haEibrnT9&e=T(Y&_yB0C`zFfIf!b*pmf6+cEJY%I*Ryy+?<|Hc0yYV zWX@axz?+AHp>}0DKsS`#AcGsk9dogqIO@KQ@{H4cJmqjv8}jW0rsOi_{_cEHxZ#L`S8$JZ znt45^&j)y_s;Yn2TbCm%H@{Ijwuc_Gk!+PbQBmLaLkEwC(_cT`R~(`b zs$*y!j|Ux4nH{c4lrhba%f$k0+a`*3GKcT!+cSvHOSOMtSxYfe&IzeYhQ86u9Nq%P z*}L_T@fY6n+Xm!`HXIdNT|h0}jT}}JUD5k}5pa_t@P%&RnUng&#JBLfbKtzyYtmFtL6g> zHE0evGXTcxxfPM+R+ESivd$wbycE&!No{aZ6sW|foyn0n>Uq3O4pm#qC{^E#G`n+C zX*p-m=g`h1!wK$@h9+)Vm!C>vXuE6O{4ICj>EX(TLwFpWlafQqI8IMzq&n;<@Y0Pv zCZvCpqP%xbcW#c{29BoN8t2b#W}p)$WPn^-)+X=^glU<4+$j()jIwk2^4@WKrXO7# z*2lMd_h!4W6!FR(%;uWY*$#SL^YA-_Q>IA8Gjintz5}-#L-1HVo`_>SIMkSep(cNZ zGtH;IT|ednQEh*eR^Xl@Ym#M$LxQ?y7{&soVooEckkPX%yfgR7%b9r zr7{;RdYj_ePd6th?u}N&W0tFo8B88NL*$(@*}>(~WSOn_J;a1_=d$PUSzC?koe@5f z9Qu`-#xyoFNvNdI9aN^;#i&Ms0y$(X5fD-aqLz^@qF7n_uvEHjZL80F@)n1n7!-d~ zxP=<>vQuluVj;n#@&pVYe54eRYNJDFI-vbo*q%I}g+R(PO27+)`JC-8^GcPnDhAg)hVZyv60}1f>M1m z10bKIpOQwC*T-kv!~1^e?_Ol?Mj?N^jnTXOFp9z^hew~Oj&yoPH`l(}guxpQcL-~| zKptLeSo`~S!M^R+c?_`J;M+NIl1wYn6iFi` z8$r)Zg_QGKi;CZ5EP>y@86)JGC{lRPNRJ5;NnFJx%F<>*Z5Sz$5kIm@ND_aAcRFOI zT@RyVW5CdTNy z-4R9=ih)8A;DGU^8GM_9k>wnrMnldth+~>p!@1;^wJNXZ{gmm5o&DM8N!Po}mS|c|!dOdojjz)H{_~ z7MN2o?Th?f4m(+MY4mG@vMmL9oW+MmQ5HRHRX8YF2jnn{KwBMBN(_IBT0)ZtbAElE zc;g$kW-G)c2*oU?F1r4RNx360pVevWTcue)5Wv0z6Gg&pIam-wg#{o$ zC@-$X384LiDwkN{%<;hs1QQ+aoJK zsSovkXZl4H5fy(0kdaeG&yno*VU86D?|?XaA>Cv3#9!SmL|jDvpXqFNZVyi#bRMw#wP#}c!!NTxZUA@!B1ka-Q3t1h zf(PtZk0UFbBgnTCZ=hAs^Hab>>*YlTKT)q^R|H}*#p8cwk7k1*=X3Nj1svRTH!s>Z zzY@{F)E$X~r&A&=*ZOF3+h1s6+crCtgaQ4P?MS%=N?l1*SpBFwGHlHyIyh7^gv`g4 z2@KYQpO9t0F1jRZPt#&dl4(jKE0jC?e|b?$+dy3~E9Hn~HlAU3!f@XCeyP;{o|9KB zp15m_z3hLRQs8PgjXBPGpBrLk_;{S}@WKgUb;FASp=i0q$prfq6$nc?!VU~L<7siT zCo!}(8|K{yePt^y`sw`i`Oo$8&}t(qA*v*bNT*b05J3T*pnjHLm-95(obP`wmIj1AHo6<`fZ<7=RtAoR$Vdsp(`WE)iRU62os1N;~NSunW-5q$r~1 zkkAIDa>>$zpq3plyQUzfLj&QIK~O^@D}ID1Qw;rQus=)v{vI3;zqUc#K{obMAB2$D zRX=~6k}acAav_mFO^y0hFN1DsivD5M#KrGv>!r@m*s~b%nxvdHx;21rzI zLh4#OM1g2X`vsXBee~{z{oLg}$k?k6eehEz$5^pi3?`dF7Bpk8QZ~V9R9{A1I+C2s z^lA?{GkY>vfv5GPOR3$YdKga|kL8&6(t29x;E^>TJH!h-6QPn9{9k)>UPYL$R=N-x4 zH#pB*Lj+LL`}^g-u|_ej9o$?o8clN}9+}aCqrU0JvYNh{#QL%ts%`mL7@v|rFC%~K zywHMeusD@O1HZh4CKz@4%<@hrZf2e(SKo+j)SNr{$t&jCh>rRWa|NysCYuKXaE?fB zIeEf0G0Sq2G~&0yD~BTAzGoFGf;trhN7}1)3&SP*OZS#wx@@m+b}vv)2e7#hc=Y&o z`BPm`V#9NCW$Z{OBQGCB0oe5dLYX8NM16;YjmLbL z!*tP8A;yIgaKYk&F~QTfY#2?nmYA=y?e#UMU{A7e0o9$)mL)`n1|zcdxFepIIx2~P zjLzzyB~CB{QH0Y-V26}VIGCGPR_&Z4X=oZaE~$+gk>9UuEQ0BXI^cA%BP)N=-ve_4 z$|MUeP5s{UtEFC2jYI`WmGC9?@yc_Z`Ljh9~Nf58SuOWp1@dV2hzMy)*@P>YQ z385|v)4VR|@o6YCUOS%;BRE64JMpO_D-qSKkxy+%P?XZd6chsy_CcYdgrbqsq(O*O zhysOJfjmI?CZ1zBlc*~-2(f=6v?_QgszQ>Yl`5)d;#`)w6z}ucMn_Gy!UE~>AU{mF zqdHPBg-TvZK*}tVhoIW8X@zN`y&bl;tw8`2yt-{HX$Y}5(%6D>GSM_@#-&QC#fjT} zn{(c6J|DN)*N%xJD?5=RFDJ&VS0gJT!xqks4^DXlCY2+Upq*O+L@j?a*0|L{-X*@S zd`5E8=W@36Ut#!~vxs;2@Vi*2MbTVyq$;E-5Y#<4(m*pN227x&Tp>t9Y`%ye%38eH z4-uh}VL18U6*L{F1@7fRjs+e5nC5N?)b-x7h~V%BEbP{lFfpJvY=wr-sh|sGMWNvu zc=_~s(GJkw-!2_Y3BrGth)r^V+-pjKMN%0;-1TkUt9&!n18nT*-PPjehRr=Y(%nZ+ z=?jz+5mL7YYb9rOfB~akfOF1ZjOwb7!|5nmBkuP=U4+x_7mgH&cHiMjFvVkGtn(sT@?H z5)6j86ii#{(s1Hxz{h6IFtbf4X#t@ZkzYPFxt8~!GA7tgVbZY=2W<7zE}fKDXyEL`;TfbaYJPu~+7q<6N)VgEjwxW_TF|~X zI80Q_n`&@j-4bjh4>9+1?kwUnpujnBh_Rxmq*5mchqf1KLzf&zkg#GA9Q&xq-rP~N z9{fu^ZN5t|ceP1XQ$W=IO_zk2g^LkkMk>Wvh&H24W;s=5i4tWa zD-PtpqqKk3r?OyHA!(;)hmfsgMVl*p%$9DNb)s=eP+*=QpwbKv+Cp*$mF*)hb@Rw5 zQ>HY>W_A;kBP*HW1%l8QzSuK7u+_$=8sXEzEAoaV?;(a9 zqYR~*j1QH&`I;tqo4a$YLEbsWXT}_6@m)K+m~E3o6p-zzs$o(AknD}En`4IcE}ld* zMZ|w_d8_K-?nSU+`Nm0qL~=k|I|;ZD<_Rxh>_t6^0pclO*MCrP{96_=%?t@J8P4PS zEyD?d_Ao%lHApsFsz2Ou^M2h@*c+H8lpaeFQr*G#79qn#J3h&3dGa3r?6x zCO|&a=a{|5(>|3+QCuCr6sC6e?Z}PI&PY|b;_efZYp+a0c2jTaq+s`%W6B+lB*8%j zgF~b~c1;08%7bhWK_V;A=GVlQ)tm^7J0`W8P41)bm*v88m}AL z`wW?V3&e;AIw|F-+s5HXd@zf`sC<9Pz{X$;sU+7Yejo-b+o{);Z|OF?qkD8YLl2Y# z&V5-cK`&ZLzEZ|vqGpm zd?nFR`}iUH^$}SZZK7ZFP?w=lx>P8c00i0#1ed$p>k|TzP<;JP^46vN5dZ@iN4w$F z`>Bm42|M1WkiZC;@@(1PCYBRzPR{Abm*Oj#AIzRJ)!p34E)!|_}bU9s0Z~|%1Q|%Z*L;U?qLkcG5bH5tr>=q zN>)Q!r9~6^cDekl<3}An8(ycQ!_@oivYHe6heP<}{1b{wf{Rp8EUbULazm1iXuCy1 zArvFPQo1`V-GraVFMo|$#*E1b6ZlZMk~*(pZS{Xg^VMg{2O25gu7D6EA-+gR6d-{D zr}!V^`~RQ%?SJh5J=d&^~JRG%Se1Wl}_6IvZu%FYpt)Wff zdSM*s`_(@;7xY%!{nPl>B~wyTXDw|t@3qT)0pVjDF;Cm~eSZ9$!~+;0LyRI<?0srOye_xHDf6H@h?7YAmPqnsf;*!T3 z3<1|#hkgXvMpYmnTw!q<_I52ZY?y5(T62H~O$Z6>#}GBUg`q4Fj7Ts8oJO`ju=R*_ z|J#1fxx=J#8Wdm2*C&tNCPo6qiULt!E=LZ(2X7j66z6~I1GsoTw+zXKC8ZSsv&a-T zoleeXiSXQmo%f#L@=}VDiK7rD+KEF&k41W3-{Jf{XKnht=ZB}J7+T(}FH$R7QE8{c z?)CU*{U6Vr4+Cf;OfrZ1B2Qum_pk=uI56k?SIZS+!G3@lFZrzu@)OEJECP^ZAgPL5 z*1$7SLJ)tf7zP8$ha)R;T+_>;c2RKf+AXBS>YGRlV}(I$HYlKXn%RKwygqIb!?boH zS~{;`EF^QRf#@Lxx5V-}d_#(cl#ldyu+`Cl?J@RyyZ*1Y@^s=3ANd}ioVCCMN&0Z> ziiWp$Pz!1a&c-O$mEVF-nQ1@j6O632)wWEJ0xy55GP3e9J6Vet0p$pdo?ZO_354b9 z+0(*X-R4x7mIIGCe=~!!Tey|Kz5~KOAdhN<{U%ADU%F4s6hd++u0?a$Z!{A^BlD+w z#svpb8P&SsBmu3B02g{j|CgWh`gxG`);_o$*yP9HojoHj4(}V2*zf`6{>|R4U3hi* zBQJlmAW_eQZJw^rGv7dB`~14+F|W<#zstN#L=Ya*3+49m!hQkPJ5+x5_v~}OEoMKB z?Ui_TcIp1yJY@f7Gw-d~ZeQbwe(1s}+D;=cA6vg~DsAN3&B`c%Y4q~|!nBdpFAUZj zO@h&6Lm~uDQi%>|TPiL4c32<;-~;MKl}LY&o8}SGD8|vz zJ2`I?orPk2yx$J~PoADm18%q#-bg?IA-A^oxnHn6jQUDmK$0f!p+MS0lWF-FIvs9H zMSpu2{ueo#|0;Dvx%F-|f5xg#UjCGQolnb6Z2)h9mGB0$*dM=ubs!94(k3Nal|Fx% zjA#5fBQIb~R8D_UuTMp~H1B`VV1E!Fh`xih530F0C``6iW^<96Rxo}P0WyDtNEor0%J=qm`5=$FBQI2ougO?poLVCGV5U)? zr1cU!{+`!3dcA;K^n?Hpk|q_6ofltzSkz>%`ELmpM=4Pil~L>*Q)psA@FycHM}x#Y zOo|B}T@l_0#+5-S%eS-&FhZ-^oU%z%H6D45}T ztMSPbq|l-!By{p``X|*3$1W{0tdM z5TDoI7~+R_Vfd3m|BsX1v(TB;BQKnLciD2*fmKJv&PEU7Tclw8bB)sK|CVE(bdBW1nF^h7i8k|CS-)t%GoSt&2S#}^}DYa}Qm zE1(*JAZUU+5yT$JaBu$dceoL(pW1^sgAjO1j0Xs2w^! zcyx`>m(4ouFAF(c>r{1v9E5k==hTjZ(U0}y?Z}@|?w-7qZ#-wq&Wv@eHqK@rM=uE~ z(QZ#ms@3JT-)vs$JSBhs;)RaNv+&z79+>i{)a%6=gltt*6J~1_Ne&3&x6n#pl0i7m zF`h47WI4)6S}#W95`m$W* zidWp6>`Uo!P~?6I`*g7_tAW=pFMGl@*}L*dFOLa~R$ZTt9>2RE3w427+C;LYD)5?3 zt(!UOPGKlN&5FyUewQOFhvuJN4)uyN?e2U|Bcj1V(RwEkdc@(*hf($sgpxel^V)So zX$#TLM9Ip@U)F!WOZ%={9Uq!6jg7-2FJw;+@AXc;xOfxky&bVW_;g=(_au*)k#3Az zj&TJz^3e0=nT1!~ejkqIuRb_wTU75gyhncVO6&0_dvbCM!vvj8caYY(F9RA3bHw*z zDb7N6r*j@%r#^Q9w%I0OYnbuHc9)zScf8+a}yfX9qOg|8*`Z>FGdqV zy=o**TCIZG#lqVeGj$`zwZB=tT~*^%670T)ybL-ylxs~7iN^X&&KB~Nq7_mID}<;p z*RI@!>t)1SUUSUA2Ldq|1w%{dmNdi(GK&tPD)(Td9U5d9gPzuFnUvNc>2a99C*@gQ z<%7-N=&XMsMkMOGugl5stsx(w1aK+%p|_ny+xwWQr*i4naWC3>YY|kU^D~=>e&O&s z!Ly3~lN*~;Putq{XKfsnl1H7h)@;3(rrC_WY0~DO@2*Q?js9P8xf|`K_Eb>1UaJ=6 z-wPTqRolk~dA(rgB&|HdgY1`4xQaNcQ7_W0Eqi}zw#-is@?%$DHCl4L&e&P#N2iO> zG0fHyh7g6u;$V$TZ<=WZNb`%pcd8nGXZyO(1?D$R@7I#KqB-F5qGD!eqD$Q$uAKb4 zW8QS%#TfIRe1~LUuc=e<|7`Dh`SzThYD`Y>3oKI~{=++Y>^n5xsm!|FVx>e6Otl;_Na$~+2HX|$b z+2jOgq&Hq}%_)i&$e4KS-mt}{I9!(EV8lc)c_1dqe#}lK>$gvYjY#fH-Iq1LWzBx3 z{kSp6ynM$es&PLfF+1?&1&rL?OyA7Cw)}rXv-V-~lWa`c=i3ZO?x} zRxp7vLjynNHbj!f1Y0VI!9+2VB^N;N&93XJg|a|%U6AXEEa%mV#Uxg1|`x-tFMPakI1-7z%BEAGM!oXEbO-nm)h2V)!-|KB|RF_b`xS3$%U!X=|K|7 z+0|RP#E+)OSmNQ9mA12t4ft&QISvA)RGq-O**aEo2xzPN!Ga8@Fxxw|Hz4BfRpRC4 z+4l>A6X$}my}$ld0vTpWlBBXy&tcAJgfu#^w|0GVb%-oTcrh;k5_+uvSU(lYn?`&YI6iceNQNb>(kuuOWBab2+`0R0 z{2mDQ-aNj3T_*>XZv`1m|H>K>pZNLZmg;c=IIb;7D#KC2(W1VR9Xt|~7DWCxk?(gv z8$70l%ux+*4RYL1_Ujb(heWd#msld}c5Xx3o%?4NUXTmeK3(1Shn}N86r)VSDts@7 zvRK|SeA->6~!z_suy`qOu4?>`oC{~w^6mAPqu>u@ppRGhyA9!-80=}?Qu-Ev(jSI!t z{rV1t$f{arb7vmo)|1x_B+ZGNTqiY>a(No~T;g=I`IdjR2h41~S?Hx@5Os z0lgoDes&5?dyM`MO(CJ-_AJh>Op_rD32H4bqL;m3PlUF4ZHwDoF+9-p2ySa z^Rgs&&o9;;o=wQ(9!WFYDYX3$d$7s&GFCXZljM_060lJ-$@pFPF(UE7DOLC1rJ#b+~aQ{fN!mm2uZ7 znSXEPgIF%yv(w<_{~4(ZzYcP`>4?&%(Z#)i1?HI3FK72T-p7$E)u_nqDa*7qK47q)lS?~c?!uvJnQuL z@E2FV*WQrRkhtR=s!BnE?C}A7BCJWBkAjx z2bQA!TP_Ka;SFwR;1xbah&y4q$9Y+Cg)I!>rH-6b))OmeZw@;h6BRfDnCJb|trwEj zN0!2_+`)Rnmm~eKlk5eolx$8UxLDY5pFbf?o)y!Lgwq|k#0F5qcGj^2g$fhZhdZHY`q|c z@aQGqbkA%ndwzQ3V5yM)e8G3_tfmcZN(tIWNB)=f|K8FrRp#S^sUbJc->eY+1kMle z8)li*85aNftUClT1Y(K7s+NOT+MQy~JR+JH`oxC4-K}upKZ|RDm{Jr7aIFrJqA7pv z`NW#G!OKqD+B$b!){Bs5v%G7T3djC>NihmzL)1kV_mFoSNY`qWeUaz1#dVl61%x4C zyANV1T@+L1dB{4rv1#)R{ad*cjslZ}GIFY88Ie^A+S5?uB0hqF@P!{9KY8hInfH}e zIj8yB+=B^6WwrwvWbsQwu`0Uc5i?%Ac*fvm)*XUo`y*<3V{>k}B%PcP_HA}W;K47_ z&(gvwWPMHrF(-LlE+d?258l@5VahhdEzUz?2R8nK_F}ys<-vUYV4Vlib1uM^vgJQe z6XDs6(DgQLF@uQP{Ggc*Dhca1@0Ea!)>>WqsPK=31qp!C!oH}3J3?D;;PB`0q_xIj zOmujOl(;!cW}8U+<46D0SGl4^T~~9nv1&68wBZQkK_w%MPdN=zL2N0hzL8_>hSqD4 z#=88*c`$5W{69}0PIJ{3RrjI1?$E3yHNy# z+owzpeLw=E+B&zeckzXQUrD^)@5`pL9OAe}l)zsIC6~8bo;D1i)2XhV3 zwq4@fo4S&Qep@~II(nff#x&V9cQf6G=qkFSS@ropi#$t8i>_6C)oIfW@h~<^rz55x z;QRbgL{@tzC$brz>dThH!T=mQu#*MTD}+4+0PZZr?sZ~nGnXP}^C9h{)2=#n0M)2O zr2-cQN&LYvLE~h#f3iBxS5bHTZfp9}q3I?7R8G@-v3h}que9rXHD})xHdVTe^R2cK z&-_dTV4ieLA5gmq{ftWYUH>{)Aenr87u<1b?|OF$(Vq5p=KwL}?HQ`rs>8In_NJ2KDe%Nt=#FF_-+ssr+1s< z<5}Z2Ym)0C_NmdO5_<4w=&j#$u@PDXTW{J+C;Tilt-eGF84L}wyEbUh|7ALO@-?Uq z17avgEVXux7fjzI?5c&+Ong?nf`oC*G=lR{Rgd$!in%Td4Xg#Qkc%Py zG_vUlMPGe*0xjf;WFdcwlIqCR<>5xi-H-}&)W8M-1Q~0woJ#?4+U8Z> z2@%%}6kyvsa20qw9PeuBf2;J8Bz}(wi1*6~Af??zvv{7uN?_yGIhC@7@Lj(FB$!~j=Ynp+{sid&Sto%!vigf zXbOEr6OdcRR&|a)C_3gDSxnuvo5Ul*}34Iw3U$+=l2=CHT#PxO-kl>MY+8s5aWb{{2Y^CXxlsMwtg#N zn$!tRA*@mm3umPH5gjH8?vwm6bUaZD^DYN-?~p-U7u`a^ckSD^lZgyevsCbuB=K1B zWt11j2W(YrU+=i7vWEP@)Vpf`8DTzbp~t>bHvsnxdz=ph>##P6;3Bl;&syZ^o;7EW zp01$y*jYWK`bvjY^_oU$1*=RRock!3W9&h z(DEZaRIQwII7qeMR=vv}k4{GffrWLj4O7|`LCgVrj1H%)@~si%xGAAJfchF~tj z!FOJ~=4QvTkLGC+$#w2Qx3Pj_ku{VfT4a12dSnMUp+aa|#|b2)nNu6HuRMF~B^5bs z(Fc_TPvT30Qj2?7V094c-H=Ga{P@B!b9@Vfm*tHw)aO^&b~w@+SmffAMGtEqj&KPh z#E>Z!2Mt9r#(3~I%oY+dhAo+{9nGBe(2`@QkfFO;!;zzqnOB>kZs1CqsVsow6+Q{5T4OY*OP} z7sct8&w986Le8b~Zroycu!wy9zMPCX=v4%Khz3VRH2_L1Sa5T-QkNstg5erUF^DBh zO!rM7P;2FHXD7#RvETOmG7yL&;a{nDe6#Qt-JdFyY&Vr{SYvq}-}DeXflT<&`k!t=$BBYSaE8PSjMm#dCi1^Tk)bcNXLDwwR}}B7-)<=bG&Li#MUxqD3ehaxLm+n>p5j^JL`7$9Obb4 zv(+l-+t*Yl!BnWk5HJ~%51Gq$w__-uVE|jcv?}8BHPkCHozlnzD z(%}u+rE(B=!h8LABc5YaJKM29EaW|5#?dt7T54Sb_2u8FTqrNu4iHZsRcE%pth&bc zUiCHFbylDA1F_NTZ?C9=*?!oTWqg(VW8!-ymZ&7lM)W*MAr3m6@Sq;pE`(UbU*=DR z1|~wLl=>n*%D zlIv=b@l&Dub0*y22s--VS^<Ag{fZv2# z4r}8J#z)H7(d55p?#VN<9!M9@^|fqL0ORN6r+oL4&=JC~i?$>o_kr zn&gnRK9Df51v&eT=ZXrbjLh!?MKk`lFDX|7m1DN6&9zcot%w-Nrb51Z zRsJOtxv^lbgx2PfD)2nNB%uW+t5INS9X44lr{MgM+e}uk4qLX|kQV}m{6}jhUX5`# zL&L*(2G46$gU2_m3W$*akkn!Ggfkfh04$v8fU(ijkE^KK>(eT3VFk{aZ4-Hg>pueUj2t`D%IQgzXde ziMOlIEX2u=@d^&?SRX(Wt$r!44Xh+lIDrz0E+` zK-~dPO<8pbfy6meA!g(L(?tZsc{vCBH8zCdZNa95W1^ts#*UdJ__Odt%wAZSllb4~I0l%u8D7_YzKYAI9^6#k&ADJ5;`5VI33 z4lJOyEB7pc3yiA6V){y(rlF-a!81?x@7iiqnI6gP<;VVyJ77dAN%S9PFeiRl-8E)} z4&TPhaY zx?EarBXCR-TEGU5+nBBBzX5v;wq(vBjcOl%(hRMfdjMInh`j&qufT0GHeB&|150`p zWs>Iqf81ZdvY^&9%3%-EwTM;=WvWHbMzOKC6_KoDQmv zx5~oU^=C3Ek(kP=eDTtX$QWl~X}`(#`~W1K12e71?@>}J&OP9yjm#q&M&Cn*@0r7v z!M4t)`u!J)%a>&ZZx5{fwj8sln;?H$>R>XT5DbC*{)QKy)tictQw|DdOLi9)!k!^9yBX&Yu_c5+<#O&|BU*b+GU(-ctT1p)5-B#79ocW+4T=P&2}46RP2OHyR-=s{eHC-SDtTd08!U6NWMljHi$Vzx+0-E^7<=@0i& z&KO3;nvY)>>z|091>^5ZK@YhqRlxV&Yk}1~n@IvNn<}6ZwB3hwQl>Guvfg)lVrp%7-3;p-2;m|tamF!Ns=DR-?aMAq z-qCF{>BNp^vM`a(93~P<$YmLGJwobAvV0~YWAnQkUv;1+7DB@G5X!>*t$cig z8*}@%5ElPU*zge%{78cS=PXkB6(;2|qHk@LR29c|=e7`M1X6ZDvMmn*OLYi`I~D3z zX521lDI%1FXIkjyFQ=ah2hdqsdNaxa0hS4bVs@+i*kZ z^=mEjyTIeQ98)Icjs9EtysF3)GFdBoCr87FlD0Qma>JhgafaFmGmNLG08i?PcoL$zao z}Vo6jgMHXDM;5ssH z($b*4(5N7exmJDOw71X^_iMBceZwn;@)%l64a2Bz<&yOWM7RjLnE5~q?WQ&4OqxU9X+Uum+MvO1KUp@k{?xoDW5tH7$?RnHq$ybWF_(QW`m z2HWER-y_3dv;2r85t>6M+m-u!X|p5P9daN}Q(ll|b^B%qp!GiRM?Jb@U)Yhvn@Gmo ze{2mC$whrLxoPWZW;Hq*N*(z}$I&xV{`sat6AFA2`6HW;N2jy>;1(f9jBDhV7y)5D z-!|d^r@BicU%k9(l|`hiU}X03#JT+Xct7rH5cyh!K|sTJ%f&C4Hxl|m6KuR9aSZ}; zBlR{UL{kumWy9e$F7WN}KCCZnNP{g10UaSRD&KBuwX7rdGVlf71jWmYFxl0Loq&WQmU-9z*s=WT2RTl|ZPJ)a9&pT3Rx3Uu0T?|unK#x*wN1QgWNTL&)` zEjrb-{Gr4OrBFoZ5Uo_CWqUHkQAEsD{L!8AVA>1=qS%t(H1!fEMY7QdXk2U!H$iZ0 zM$0vz{WTQf)_h>0yqGfbOgwWD^m&Jd0zmLt5X@Z2TlPQdZU_P;02M42do z%6_Mb@3NgF9K7~b801EHP*VA(WBtK-D9^{zpd=t6;D3aG@^Zha* zk|D@fl9rWR%nen%HU-vLN;8Nc*d46x)%RB{YfD$WY&fUdd%_qpad}@ra<(}JB&uwV@;W^)D^mwlo#GH9~H!c2;IFZ zZR1+@MC9CaP(H%j_=YI&4G(X6wBQfd@_@N2MSRye?mIyUm6aX0G_qBP1#>d&Ie#Wl zK-Y1*gL9UoPR+z{P96Q6;@w~#-2NPPago9p!lhlFx#%pvvzX?ngyeqa(Op=R&ETXy>c zqlew^MjNiAN7=EgsEToUC-`Rg02Cq5cfY*u+ZZm9;{tWi%A#dsdN9x7ZGJPJxJ`41 z1{^6GmPx2|vt0ro_G|B5z9)s;iMXnqSRnW+36nm5r33S<=`Dy-nZgc_ zP=%;c6hi_6F4;%zvdc~-NJAn{RBr)^BS-3$kz@mB2df|5PRlC-Ce5+f4Y?hTV;@j1 z^H9&%X5SeR;}cQB_`hN1Tv`*~?X+j-6nWkc{ywr_m2(1q6OtXAl0Sbk2P86J7$s7I zo6VipqZLE z&BX3H?{}#Q+cX!7!#PUuC4BcXDsybz+a#YL|61r8I+u2dca4gfK%4;M6J*X`LcXQ& z4t(gfvnRmE`}mKpgm07RF{KWr_$KoGOm)Xs$)5WDdC}L}f9&;etb6dmggn}aVx3!N zBk2m%EL1p9338HdOrdA!$J66Fg30d^TBGCENDZrOw-sC zS*RFJ5-V)vp7xR%US?u<%9%g#+DPjm%iqaAR&$)TfaRKOpwR;lP)hjE>_3r=ah2QU zf-1o`y#keL_({*Vd2ftcdJ$PfIp|Go6@uD|#^z5)t@=}dwDw&F<-fQtjtCB2{9FwX zdJWJRBnx8UY!i%Or3f%e$WRC1%<(U8FN}dD?WHJ1y*T+0&E-42 zR|G3FbqPi&+9lYZ;{BLENf;EwtRX=5)dNU0j)#)T&YsyKl`*TBxj9J>jquD=*A00U zSd&oCpTzg;Z|#|@X6w?D*~6-G5|5VMAmg=?*X0dV1Q!N{`YB^5Fe8T8)u5(6kKa76 zzYCeW!bZ~$yxSM31rA2b1+kkKH5mRzhM%E`#X=9Jl;9m}acGG`PkV1M8rLR0-34&$ zM{T3&vsFZU{e2&1j5K|pRSr7dZ0Ht;{Z|a??Bn=sINeU||JMfLO$5+@BwP zF`HBu6vVjT2ZUja5yOheZMV&7b8gxoze^_klr^yV4>e^;`ey(2jG@2qX0a5;x*!!c zzO^ARl&lGvk95GdqPn#bVg5-kGytr4GUi%WBHEEm%m3_=>O}fZ=*4t+oQ*8;L7rxb zEl~p%K>I6x`GiukNW}El-aQ^IJpqL{ZA!v4D!4EzbCJ@h`Y%t2E2VLG+KPtRfVh5B zV>b|%`1>a&`uGMJHbg7U@}ICVq9%tgzeLUORGNcL4M!d{oH6-qDyUQ{NkIQmWZBRE zR$z8Ec;H7ug<>|^n>7Obp8i{S0H7t%%KZ~)%sEc7t>L-+& zsM7La4A923oHrO&%``BGD=Yn_o7Y+6eh%63FvUE4gc# zb2wi^!akZnrSu)orNiL8vG6yS5s0Pyr8uwVC(?~ZnSxZH^grlcKu@@7haaI$Yy*CU zAL^_8?m2vMKqc#|=+kKb;*RoPwf|{ve}a)CK#XM;Ra7i8g^o!1LsD9loK(B)SDGKB zj4RAYu(e#M5`GdJ0xmLinR;p|Ut@T*=VX)`#b}`cVkyKXX{-%SB771p>KDVW=`S&6 zxgG_P`|DEcQ2Sv=fNJK@4$cBB~jJ_B-(;7uW}jx`NPDK)^%N~ zK0-kmp1{q?()5AAtIekahE9?I6ns8Dlesa5Jb;!T#DY#?94}z{#z!FI$6k9CHUFOi zG7z83vwFc(p-6P+X3A!&s?KpL);rWMrM5uR$x^@(ke}=8KES!nai5wcl91UrHj?Rz2lyex?ls$eny&15fTvN-Y z?XEiZdhw@vnd^M&)WnAPbG_@F{M&L^^aaStp{Yfqsc{GVIIdhfDhq--bNAi$jl@Mp z5&pI98FBt?>m$v9ByIRU*OzGxbk1^^&sM>_eYU1AO;#b@m&79CaNM{jnh2uM=~;y@ zD2ULP7>*CPzD9)E(b#h+6bfkP+m(-NsjOJriG_ToI(EF*jTmOvk z5wkTTx_-DBJJ42b5g25T zqpZ)&M6Q@BnrmX){*FLUNtvLsdipxbto#9&Vd9J^F?E$Y(ES#qcgMHHy zM#S6<8)+C()i@#C<|UJz&Y?7Bj!UnWlik=fSlxb5t2$_KJ7%M21aPHgxpd_bx7WI* z*WN($^J^*2YTo?EiEemi#fU{Kn|L6BgeSOiax1To)J=molU~SH{QRS9%FwtvCb4t4 zCw{^plwbzZlm&hRrp_1zQZtRzt;%f3i)|@Bq!tlM7ADY)r|zGm$>;mSZU;>Y+jkmt z!^t~_2>G%jl`IK~7NE^~{m$ob_h9^I-+G_;%60F@MT3zMYoaXaLdvm~+{?K;d0cqK zQkWmfc9)^}{73TUyS<1Pjp^!E0d|MK}1E_g)_0gH+(y#A`^ z(Sh!wtbr-zfqHOXD-4o#9a-#xu`j!LgvU4`Kd@=pjy=dx&|HMqHT+BG`Qtiky;N*^ z|AnK%$AW*~KnkbBh;mfyFP$=X?$?rnOEiIuSP|1R_#<=unkOH%pf=OR5Hz~bJ~tX3rR&>Z$|U4%zhaNPMB zm4ROt`!QBnKpYverRWnODbB)rymIxAifBX|Zn5H%nJ^+UAWgN=L_#7A*B$R)xb{XR z8Aev9$ImaH5v4oMQB~e=)6lAskawV29l}XCTO&(8QRmC;w&vsY0#hNZ897K+RCEOk z5$!Yuc=dgWWBmfLh;WN(nK}_hy?->(JoWGFy@`a{%0-p_6Q5Ue(3K@1vldw)y(4ON zM1lWd$w!^!>~}Yl4MpLr6H>w1#z~O)HGchb6Yqk<)gpFS>mYUO^!lWz%~9S2++DBz zDe)!fj+?gZwkdYx_9qycbvTlQbF3wSW`A_Md zQ45}Eqer|5~b_CIL?lCDTU49gZ9ZYl2 zr-%=cE~8F3v{Jb35o>zv-_v_`)>WI?IzR= z5Dc*cVwf5Gn$1u9Nq%?5>NPH3992q4b}>aPPE;TeEt*P8 zOCQ=Fcp}>0>hAQ{=jUa}Qd@|cfDoYz0;||ZxwS}uXi2aVNpivE?_xC63@ByVGEF&p zZ0|}paNwg2v;Q%wb9$sPGfZ_z_i%RnohtWp;E0|f|d*2-(dd}QRz6QA?^ z*Q88xcZ%v-_&n`U&$e%orl&E$uWW7&%BoGbnJ0)rv8+;BIXN}9cb6o)N0$}PLr34t z3kiuOo9ua|e}j?!MMh3Qm(UpEX%bAhv+?}cLS6DZD#If-(OSdX9mH}_E2v_v7A*Ic zMMWZC9gI*imo=~*y%(-|qUnmX#un2FVrkNcqaUlT-kS&r@Gx}!la&O}r0(`@lzT>j zSnl*hxQke!$Ov@TmJUoH7Z{!lH4!@F%kOah&Oj5E0{$m-Rv^g*~#34?is?@d4lBVLN$&5(a z=SCb7y?_2SGt-LBM~DYd@GhQBj+or%j1@{{ZpBukO+bTKBA&9<%!E9YrpX7F=3En? zRrwHKbOmUn2BdWNe~--1pkPS;T1*228`#FgVk2+cNKB;=Z@A+!<7B}|EiG~@1f|j7 z`0HUeEuXCK{luqsh+kyVQ>q5Or7gc#2<^okY#cYx3G>Cqp{Idqk6w@ zpZR>3oUx|zbrg2oocKw0uWZnnPt;a$` z!4vb&wyv-h@(uy?F=EXL)sD2m^b^H6(TOn>#44B>CK_*P_$Hi)WhRYDNBl#&T(s5I zajZ(wB;Nyr7m7Rrn4#u2a&;Y3e%_8^dJ50Hf$EjY;R`?0NQ5xlLJ(NT3mT#(x!Tiy zFVT1Q5bIqQm9?1*ctLFJdut3_olYm2aFfVZ{3N-qu%rZBFo|%K_OsLN20Vry!A+Om ziDKZ*)gNVJaWiXuc2D{Us2hy)1!yg8g~?*95+~lOg}M=ZZt7LND0RCa2`{K3!sjquFH?BHv-3RUVb{vKpPR)e69vH1?-+uzb-L?hOooS-1R z2xtyrL1iFdOJ6ze;EJes_LojUPPxkmo6$#wYT*d(FbTJy4u~})dYsX@@EQTve(8yp7 z+lDhYagvyY3nz7>gyYly%aLl>hW`mnEq+!hzq92oRYK!aPY6EcL_ion)2_uVoi^yQ zZ(=1k&Wz{_7Uxo6C-bZ6CGhocsdcN+%H1m# z>`jkz0kL>zbjwd3&)m3Eom+<|((;6#0^UdjuJWp8odf*;pOBdEE= zaNpE0Vp6he@RCz?Zg_5brLJ0^)NI2E5;~sBW~#PURy^`&INn`ohO1Zr44WR_`as};BW8}KCQ4~p`QjBJSd0BrZ3V;}M%5%(OrV4T6H#gX)1 z7(5MGx$zHGdNNDx?acMU1uJ$Ci{%~*ISM6Z@2kYPL1&|^qYtE+H6MrCdA86t%%ZP) zshq|ScoRg6o&So%wIlztMCm3f+NNFB$+I+g#mdZ|i&d4xL6_1b~_1jGTP}(9%0kL-!zCR&k$G^x@u_>|B{peu)amN86Wb1#< z_^24>ON>6zpt>BDEKxs1t61nzhF_F3Q#j{f6d)WeL5TIwFsKo4*k~E=^ke0d>k#z+ z;#otVbdH>OP!5Cll@w!xxT&NNoqar|h+&lO@uB(NUY#zex}{>P0V~3M#ZP#vQA4*_ z%h;?Ib_>Dn3i2Y#EQ3BWQN2PRIn&))aLuZN!eR{rReA1o|fMmAwSN z{#{@|x}Yi`DGV($YxeEP3bX29B}rXLDg+LVPb+$=nU)<@hm(-iC<1KesME6`g#mXE z`5V18-6br=4-*ahO{tVmy6qa`FQl}WjDhbSR5I#^~}8^Ql{9#Pp1c3mJ3y+^bi&)FX^aPI&gKjivWr8!-I2{*Nw~_Fus_ z$tj3|I@Zn-C}7E&fvxl@^oCCamn~PQ8JU`@g7dh#6m+>rpUy=edBmuHUS2V;-=|SZ z-}1v>Emg#^euBeKk9z~h6T@q&<-FcDtqe|RyN9n7$iWCw6bOZAQw!5j!3G zH>6ZiN;_pgxtoU&)Mkcwq<9!lSfS>zVoyjRy0bw51Bj(6!R-$m{{x6&R$Vl8h?F(O z_hS-rr9K?&TKiE4Etxe z!c)|;D>tzPlwU99mvxwOl;8_bShfS1U_mVJu5qw6a~;2VyfwZ;p2-BKLzjig%y+70 zN>~-wt%E3_NuVf!Gvw15IzxqHNZ1h1JrBV13)ovMiFDnialA-O^n74Y#OEjfps3Ox zeIF(#ZX~7i3Kd~QRmbZ-BY{dX8fN}USAX9`ZsSjKVfF_ZQbG<>-XXC9a+nt1dO4Z^ zZzSjg?8Lmuzn5Bom`(12%7&qzyTQC^RAR_VYiOoNP6cjT>Jgon$;6!Jq2nXgY z$-BKFp2MI&H zR`nK4R`T19T0(piIXNDsAO>Xdd;p@7nk-Y$;z~G%aXd6sc@kWX{XOvs3s$@m!(l=d zxUoOr3!x@(HLM9^;_l%WkwFcsZ|5DRU+SV)t(ibYIEckB>Yi4z66l%J06axX{eVPRBZ~F*{exmsc9UqRa|+NL=s{d zD@D^5M{}>QZ4#R1{_i_;ZqKo`TKk2(JepNED8jgWI8K6!Oua(zdjhWq0({qGK;6za zIOW=+0%E|oou5V9rvSvB;^4*Vb*XqF_y^OJM=Jj#Yh#tCJqb^f<~g<~L@9dE7SH7G zaz!>8k|oO)$0L|oFJyP}44rX>La2wrL%!RoIjLR0X3a)qxkR7OgYbDv4lr@any99i`?$2h+F@Ix9A%KXU!!!TSdX&KTCQd9J~^jOc`#`Y~2$%n7r0l{kYU5iNtM&pHk(?s)p~u zqkA3!+L0odEeb1LXFG-7N30S1cUN5`kb$(arNKyhp`5`5*#w28AeQmaA{*Iq7^{1P zU-5CO=*reZ?26z1zLbnA+5R5F+Z;A2I1W5Wu>2!F3P(kttiDiLw_^GA{U}ho(tb8C5B4PZc_d=d48fOmbyH6s#amyG{N z(H>_%bmdjNQ7y+m$ZBYhqLpzNZHl8Ec@@I4om&wV0*S>d4gynPNV-eI<_JhCe0a<< zdw&|Wm~yw=Z!G_klZ<$wO8iCWZU5(GClckC+Z{?2g10J?T6_+)*u37@InrB z5o<#Z0+7%IA#;-iX)0Ehgov&K^FxG^PQwkIsJ>%Z363E9d}h+s*%R&X48BE;Y<$O4 zmXvuYHg~Utf)P}Y&i_^B!IugWU zM2EIDF4=VAs3CB1-5)Gi0C^7@4K6|pjhsL@0w_En=nB1Y7bd9tCGxxHkeR+cg^9TS zjc-L-3`?cnqZkE2WrTToH>zlP9IzvZ#HzhI(wZDwYhn#Y-4r}OKLx1#_gMhE1LOaw zOC*1Ev9vh`GUgE;HONiUYC!W=SsOwBHD-G(MUBOJr-m`ITL$4HNDo?cD?;ysJ-gMl zz*f65d*@vn8Qvi8#4tP7BN!I=c|RB%aJ83s9$i0SZZt)*QQy;PjPipf; zZc2wOaZHIoE>000DJrzR`{&M{rH89+TPI`!y*RW5~ke z*z=dbPb%3tZv=?NtOSi~e)iXsJ0{e6Zclf4h+nIGdWHDTL=f&h*nYfGt)stZn&O=0 zn`rOwd)c=!(y4`~k2W&63cZ0|T$RvUB$B{Onr>2&al*NWYQn_E}JLGB*ETo1c_@RRzG||A? zu&yz~5>-@BV*i0for-}W%0J93xm*LIw9_!9sjDfv7bv62Oc9@S<^jByd0cKfbS$JY zF{-U7kO%N6VR}c}Nc?GEd>JghgCA3Lg?QwR_nRiCUqcswK?B=@9rxMp%n6t_&!%S` z1U#^RVIHDOk$F=opF2O%J^e^>yE3;qnimhYzTzYPvQRaKPu;!rl(F$1xBURIFh=H2 z+5cUmLMb!ndx{x(GzZAE=xIj;LBekXbb%A9td|a0m|U5CY8-TU^Jp0*%;8$E*szyD zY>Rsv*S4+P*WT)n;z(HK#6${D6uQn|cey9&c!C0L{YCgMv*Zd_#nbM zBGZ`LPZCHM{;p167|L1c zu4FgREeAIi@>$000W2-)1Bs(QiK&%n(L)%e@wiD;IfpmIZDe+_^uQ~G=Gy|~3acmW zZeqP7ARAskyVEL^nHz0-YdFyzwe4b(tFv!^Daacr0LzBnn$*iHW+khut~WYcSPU5& zH_6zV^6vcxh3O^X(BbIiREgO2*k5{`o!(7MWUbsL7;+TDr7P#mLBZLEDbnMetL?Hb zhC({6x$QAUWsh3f*~67OzvYT**|4gE5X4d7Q)=dN3`0E#%`-f9hn9RM6Zv3Xy?2Zo zvVwufJp*}DS?Z)8&0m>so|^aNn%$nx{`9?^3}v5z4_R1u19v2>#<#*}Jn#|o87V<< z#_&}1s@QtD>}!$5DHF^At>tnzCZW_Aq^lQA(pNikC?;PmCz8*E^~K$#xMPpM_=1V< z&68zmejejDMYL)A=IRZqu$f{K$Qw}CHID+|(AmVQBeoE~wpE3<>#n2T>9rRPnWPUp z(KJsZQEsG@^bN3Nr!j)0-bJg%~BV*TsK}Vq7^Pg?lF^ zJ)3n9yI8BqKiwVOR7?^s{bhw!hz%MilWxg$o_y1 zL1ye40m!18l+C&{ z3ogaoy;ywS4!Z9|5C~&v9v8Ny9=kR5_(!N3TpCt$oi=E$RZ%> zIq|jkqm4fv@@IaE2vO~^JTG0%~ z!bN91GXkF&V9KnoYI28-8TL3$`p{&xF$?B|W`70qVz$iT#kB>zeiescAUP%`Ve`>l zQN}^Nf5WcQmyjO>9(%F>PA=id!uMO*U+sG37a9Ww^KyD&V4ULLRq&5u44O;wF>jaY z$)rbB@#XiYk6MC+5+yY?5I)&-fXS=I*$ zm8GI+{SR&YR6MC%V8PW}fK>NflZff4G2;hn;)^Z)%&#r70Yxc4B5c5dRF1Qlf6-BI zG00moT%z->g?`tFFZjs_7^#B~18>ov&?u4!DC~i8z+8qkHx|sxPO)J|Ek1)K&c^Eh z2|g0aH5(KQjrAY7!VfJIK!AA{_?_fp)N;i1zG%e)^No5Oo8rk}qLPHfWojk+pHu|G zV*gwU7<7g+iS~Z5radDrV-fapQ_mK|U!B+6Ic=;jw0Q`)uuGXCEcO9GJ;M>2lH%bu z2*cayH%bp;wGRHAHFZo#``DjfYKkkp;abI(f@yO8kbh~XW9gG`x!E$<>OaSws65ULADi?zCS@f(1VrvBy^PG)v(v z&^Ve7$VvmMy68~E3+4&?I6I&BpHs^k!{!rR-f_+1m0~XjgrIL6Z;?SP)wrx5E+%46 zFn068B|OD9MGVFw=3Tz#+fMkHE-N>w8b!LRD(1Pfl$2GBvNhz#Q^JF8N%XZD z-e*l87SUD+W!wmFfCb+gi8%j46%DlN#_>E(T5aY(VG`dvS=8VmKSFzxpc?ISbQ&@`=xM2(> z(e-0(mFV^gyl1MasKO6~|Hn#>NcbErbr|<6eHw9!Bs7l?>X7zaLX=*_{X}ODEw$;{ zXIgnereic9-;fn9KJ9jzb}o3>&f9jn5n(mM^Vq7&(cP0%kZA%$xf3pdrps|KZUie@ z-CqOHo?Z@=yRzDYk;+bq`85-9=1++&Dl?5mLfl0yn~J`FCz6HN^eKDIQu`;z%Mj!4 zd5lUui58$K0$U%k9Nz;FTBm+kUxdjo+spRxVpzG%}rVJ5GCwGdb_>y5XmPZ6c% z{)Lma6-XL-@ft^WpdJq@&#Pp~6ZchsE{a`c)A4@Pesok&%GHP2j^<@A=F#zp`qDdK zNehppqT6`XUCAGwmx=pmyj>izS<_=QjZCx zefL^LYJKBSeV!HULS7bGCZD!pY(qj|E|H{gbkA2oB$o`|i&OZNe8NDLDLRHdhH&l- zj7)%<;0(u$t!jE;Q;U!V5&i0;D7|6|!*5471)S$>%Yk-&AsO?9pZ&NzRo72czfZmC ztgum%T{HAP%Fe%!%YD001{U<%8LyPAJ1%=OI6ze*-s3#O$wr|_IElCnEHPZd=PAL? z=x~SYTHnI|d`M>a^k5*(BfgK7ssG1c--fn~g$+^mg`OTB^ec#PjuTKYVRi48)MXQ! zY_ooQT$RLLG=W`?Cz`KHxo<(W#PSinV?7%+(Oc5uG*}IeIOL62to*7?j-POgFiohv z6G^6_jMpRcqCwXCfb6Fidub6lY($uOno=yy?a}ZlZDPclswz9W;Ij?70#RVZZ{Fx| z3WDH%M->C;qJt)=wn%G>m0O{Ic$hNdh+lDz6w3{7Y|4y9LBrU6bZy|kG{L|kMwPs4 z;etUg5-eEOvhC>f#!GvU4Ij*1dN8)N<7TR4PACa-OOn&n5JHsVgSvrO!<3Frm#(8|P zEqWdMuXj|7dV{YC&AQxglJ%nQ%stxE;F5OJA`)}v4dUvtv}W3|B0olp@brZJrX_DF z{IUvTEIyrnzgn=~Y9RF@h@T`Ikm2iQWLrA>%2{FagLMyE}9Kk}a zuXZuL8T^BoKGM1}PYA+_uSRRr;nO#X-*fwXvlD*=IAxJjb<@I~P1(fjT;Xtdr2?Fi zNuxM_S4}E0_wB^!K#iRu3NeT?E7%mEHiXYBNXtc@yvuxf_bsd zVYo?@Q4Mk}ya-l0pvahF5Dqb%KqaI`Ym()+ojjWGGxv{KIj$UG@qP*Yc?fQZ?#xl$ ztq%V=h%>Pt*fIF0^KwDzXOXut#1@%sJqcQW>N){4-6U9qzNJ%wm~@zQrZQ=#?n7pNCRB)PoU za#>qWUbS_dx^BEWwn7yZ$T-V|JPU&h>pw+E4GUJ5y3z@kIMOC!dHhY}X%)wtz+##J zJxeCPdP)o)G$z* zA)*vr@lJXvrGwlUZ+roIwHPE$c%SB{;FLP*WXND~TNrJ!Wf5MnpXP+bF# zV^hH74EPlF2n_Z04S>R9hV4ecHGm#Ju_%rb1w<1Qs0YzEYIos^Ei22;VT;0Ib*?r| zDNE)>F@~@(F75{TiF3&3dc(o$>=izP?2e3m@Iz%v4u2toRIQkZH+U*gD7P0wjR|A$iDCT}T0S@-qL#ts@{QVvPy&a5oaW457lmGkt$uP)!zMDpy% zPaf|MZpOMJ^mNmu#IgXZa!^T!m$7B;o%E35sqNjuw5gaxqSB{VpDx^6ssyLHQtcHWoGXf|g$H`a|`Sx>D zLRS3RV#wu+dbxg&eGU4>cmj43dPNzy-4t9g*64PP} z20*{bFoHB9pe?!TL!3XO%|N%l;t99iCf zyA1lXy&VD)hZX<&oQ3<`nX;@bHX;5?24Z(p>R(^w`bLR(Nh@;Y7s`Uyn+N>iz7}!UIb}1;c~C-xe}{ zlv}V1Ms1(YlPIOFoA2cJbua|K>G^Rctr1T5p#1x8|Fq3Bii8yC8g$W-Oy{XsTu?85 zm%1r(njtplvc|dl>F9uIw*r`&eQ;){@ww-+^Cr{ZRYmXTJb9*z9}%}^QYTEPHD)W@6Ej``Ohb!fBg~D|UeL zQi*E9qG2nNUu#p3l?aooe%PN1X_|2sr-1J4KS?sFJ`G)udkdyk5{~_(>n1_KZ9q{M zP)W$NKVFuB$8Un+YG$VQdOhhsv5&Ux4`@V&Uh!JPYh^8N!=g8&KYhkcD_ME6hV00Y zXT0%v5=~~c0$O+}7n+z_rXMo|pP4b*-(1vBRgvA z#zHpw}Xyv02B?tfR00(UufOyzf7MxY7j z7rq1smeP*4LB&(eHwyNL!~<$S)$TjvR}2_Yq*u#KfS>?(gYRm5A?#kNpflhaub z?4MU0CecT@^~2}?p>dz@_e%EPFN%DYH5K*fZPP<+cp;Pcs>ev`q|z2>V(lX!To-P} zZpCepB1w+s)LYLMbWjf*Ffj{0Sa6TYiINRjv8kFGj)5vK zZId*N2&e2lN%TQWuPvYJiytN1=B|An%yV&*+vrS?2kQ6G1=%2{m3ay?(kpU_^F>Gz zB`T)U1}SfV(yF%5LEqHa@fN&Sr9SMs3dM?x*tT~8Tpaoy5w(j;I}Re|p3Ot&+Ad|s zz7lv)rHrX0)&b1%3A%$msI(LPMy_ULS?{=tpq8UD{K-azEo@ivNYoIzW*2A(Tg>OO zsNim$VEz~g5z3@Haf^%ZI&8gR@!|V;J{Jev(Ch;8otaC0AxgtIZow-**8Zv1;j>^{ ztb$m-PS4^xvTBIympYhn#*K3fl-DYB6?Cd<%_%&j*CvQvKlQS>0xZN8Jtpb%iChm$ zTBa()OOw!LKW=ZYyQn+;7Xz)mYPU$vyw3MSgV>nivrx3%Uf0Q+or6@kytR&}{b)6?10m&aht2o|J0P6*&rbFLPACtRfa-Q zcO|&%`CnGxCxg(EiyggkKYm@L9~PRr+*0L#yhpbGEc&%pK^=w3k(qKlVRibB84q5J z)2CvRa#a(ryia&=;+D`?;G!YZ(AR^wE;8f0Yz*t`Rr&-L^pJDOlR>Lp4w5uV8$<1v znzR^ZM4dbZAYV)Kfm@BCUnr$c_p3`1n`dHp()&ki)6EhZxV%#;64`YV+`Xljzf5I4 zDNNna9H?QA%#8*sS3trX^V4V#i{RKiw5e9f;+yjtmfXsYT&8>2O;qu2q7g@4c3h7S z>&=a&+ZHZ<{ZOJ_sP#hzNpH3HEmux#HnMMLsah?SG#}FDVZZAb$1z3WAPITK{lM9s z6spOK+BdL*NHVmfq@R*Tal1^9jJ^3~WU4CE<*1_)C;ri5Ry}pVrpB`a1TWpzq=$XO z6$bO3iYCb|eUQKVxDTe+pwP?95f&D%)W`x_BHP;=&`yGQK2)F`k6ax-zpP#`?>$2# z_A6c$Y%rAPW1U-0##SudS*bq^#VA_W6yKrz%*a@uXB$D>yX@fxEkm0TkeN0`tWD+A z(ab~Spj<3V@eHpN7gIRl$sGKYz~uxbNAh|l!%o_j)BnAeQt0dr>0>Xi{468!_5B=eY-pWxJ%EQ0 zL7`5CXO9V>T?D`s?~4|?y_ozW`-q_0HuAnoodvMQgwu5p%1GrH%ehwNt6luUM1C*1P!eVgnts z&bs($wl2YmJWFrmfUd+=yK<;k+KyjGl1>WUDRz$Q8Mr|Ml{r5;r6<}dQau=ZUmT75sqTQF) zQrtg}n^UYO#>I%QUhkLq#TJ-XIlOIwd|6AV&vl!C1Ym{H9;YoaY?d{U(huh$i zT4)V(ub{am4KB2C(|_7=o1h&0+b+?wONgMsxy&HkNNH-#Q z`<`}(sw-j0CB@PeO$c8V+H}zH>T3_D)OAr7ss44*%}Ma`;Bs>CZU|+-pJ*7BmOgru zo+9DO057BYlGi&5z}%1E2hJ1kf|Ay zCQnU70uarV!=yAaBC|rLvrE!~c^$3E)5m0t4NtK_Mc5hx3@i9l#AyD)bh_3WcYGC2 zk2Sx#4OxZ8X7K>Mvdv?EWetnZho_wAx^pC|_Kfga`^@r1N>!92H}9?V?3XO>Il#OI z2Ehz*u07$hn?$Y@HSwK6 z6eWbJK)`dCZ!)$kQ0tcLdY-Q>njyA|xkRGuTi*s+MH)9rYa|&PJG@rrTcDoES}Fk+ zge)~jth%#DHAZ9wST8Ij!(CGSQF}4fZ1M!p?~I@v&nmEV^1-^>|EMS;d?@9R@e%OG zkr+zyIt+OMmcwKoVel?2>>hvXXPHPu~J!XE-ne_G(u2N>7o#4uS}UnyifHre@gf*83JeT>9@NK}dGs85(=qwygzc8ky!Li?L1sd=C+{%dNCa6h zLzR({QJ0)`ZA)wmZ(LqVcA=-Ca1{d!s&fS3XWg>b4mn~2a%~O)#3u!(1d+*d)3unT z9#0=?-CUlAeaj@ja+DRP?hUu?RCIO6mDeGo#`*e}QL6vwkKPS0%x$k4yJbXBvzM4V zYmS|j0!c7iqY}vFF@-S{v2+otKxi}$n3oDh1cSZS*bIdK6F)4#`*x0N;f8URLr1Yq zMe*L6#B+LpqFrjFHqHpY{kgM0iT$da%QBMeOf4T|qaPPLo#d|RXH86AL;H4FTqj7{ zUpF9i{C8~V;N6Vd8Xh4QKyzDY>dHp{T}yrKw=-5P&Uk&nvvmEKT74pxmq#x0B@>_O zt5oJvn3yx1+LPRQ!OVyUs%)Fmk-T1eVn^=gM5flwy6vf$-hPx=SD(llrH-RWi799w zW7?>X_vDeKi%xl6z)IC&+P#p3*&2zz(3$HjDz%B=Ja1(_`W#M0H=a~3RUV)k8Z3<5 z_foqTDC+5deqyNx^CI@DI~3Eyb~NWl^BvLF28f-VeY#NtQMGBgs4Ck8v6qhW@{`@( z;*#NiTl`$^WtStZdf2u_Y4^5AX4SdG5>N$&g1?F5QSk%Nv6G<*!uIE4 zOoB~Kf$SgY@-wEo+#u?Rw7!{yL{<He%w{I`_fWu<~#36d8LPru-G5Hw;etVBQYO zoOb2W*!EcN1ry%Tur1A@!ypX>hLuHn7pqb~CAH?Bp9WUxQ~4&Aoc3*QHTQd2Ao%=_ zhOMuwyJ@T9nadWGq$lEFw1BgPCNG7HL}kL-iEqX~DI_JQtJu{!;|cHKVXPp8{XoOPiE?6MIjN5ydh=7<#lpU8GM*&I|0l;m2uN9jOaoo~VAhLS__5feu! z3@XhcGciskv(1fQyvH{~Q;ryB@XB9f?1}b3F{}WWb+>oAQ~*x6QbC4%9h*UC{4>SK zDOk{kV*XVshX~Qeg77tzWSTTNvaSQElgxF@0V(G#lqzd@eoDKOHp;WZo2`5?Z@f$# z0Zd6`7`L37t-V?D8B?T|Wa=z`E?@QV;B2s?kr|!FC!PM&l)HtbS*R|CC+q$kiGuvQ zXiS8}H%75OgNpM+$Zln$TviTFGJYKmR`st^^-2`lw-gtmG*|q~!JM>V3|p||S~K_y z@%8{Pb};$(INyI@!Ew$St&#k5U|;WtSIwfz02SqS!_`1RV|;AwGAgb&oc#z_RXW!V zfKW$O%Eh^2lLOZm+LcOp5uvDt8met}Kx%9kZ!>RQh-*Yp`D32Yy?G$TGNPH4Ht7s`p0jvaCPAEM@o=@?V$$*WmMwa_gpiBMJocE-56vX2|{-rx5c)MkZF zChm&()+lxFa_b1&NC(?0M_O|bma4Zr2@ru`C#Y0RPlLw^W_Co(eJJdpf?z2ND?=9R zl>lVeni&x9zwnUIIGY;^QROWaGlKB($HDD z<+43m8hG;F8HoJbALv5<)j^?ykdir(({A>-vg$Qih0-)vzIdQdRP3<6N|BhnjUgg~ zoM~>r3Lb0uU(w0Mxa3U z^g70#lbRX~*rdOV^MN4Xrn{sxOeS;>ELbo!)RBvsr&!LWMfeilOzDkxI@JgL=*fan z>#DPyc80YZ%IMXlJATI0DTx_cZ+yn7Cl_d@3RiR`JB+LNgj&jx}|TSzL&{8}4ZyV|V)lcX~Anb&#urnc!db?@9$%3eH_h zsdg2}KymkX?~Mx7m*)QN1KL)jv?DTgaQAz^h=_^ws4lujwb==+EEDWRC3wtzB9dT$ zw^R2tB_8&s?%sFUA3R=T{E6hez=-05S>q6ZnC|o@HyysI?T`iD-%T|-*wFtChf{2D zwhnjatFo8oY()_G0?Qn&vs_D~ko1j9#Bzj#1!4B&VQOXBoSoLrq=w05xK@?IAc0>bWTx8`o@F;y<8bBR6 zOfKnP|C!U=eZyXXTeSUHNB~zM zO?fPeg##6vr5}UK7K6@zWy=Q4h$yb%0?WE+sJQSmE--Y=LgSM2hEHe3F(g=EOc`-l zWpbTja_aG2s@1K4N#SQD;(;u#duxM5d!6Lkhtf)A0v4XgYBOXO3n?6h_XZPFmUL}ulspf*+?1@i z%h-yLxT9>$L$F}QG<9-RAwpY;Aj}#tR?o8QC4`*}tNU+v^sR=tv_<+-|J=j!@q+A< zP@U-z0~uk%9DMUpt1Wl&p=Eo5HdXVQj#N5Dj6r~7CV8&*qZCQk3u+ruGc?3UKqraq z2HOQGi*c%5eePl!)*YeGRvcAM(>k?33Hpk-tmyobcd7kFlERl-gn}Zn7dXQ6-M@hC z7P$27u9q7S*K`d&3NNKsIvbZ#%5=vXVzQ=(KC*07!ui3xPXD(A_YTGZNML~Vv<#n^ zLoBuRNc?u)D=r=49YKO+*B#F9+>0?{<6X!3Z1xu>gI~R`1*NUr24v{%c4*L;XjQ2} zDSFQ6RC?rZztpfTZ8YGBswB8@e3j7IJ(nl_m{Yb>?l;<9VOE?OsiImnx3$7w`C4g- z5n=QXUi0wm6V{N~YnDqA+i*y3A*LINX{HYSN5^yIp?t^sKpFhy6W+%$L z;f{-oG}_#p+TFky_w|5lpOTcnY#h6^8IJBt)sdhJ5dpY@~{hkBz^5oD<4!qXS=x? zZjq{{i~99_JO^?cv3!s2#}OkY@_w*m0qf6rA3L?PbO&;E`HxoV#Uus=u(zzW#vXmV@)-H;cj532B7 zQa6gtGzq0b*kO{E&@mq(lhLD0%LCla9&r@9(_1-0G|XlZO1ad||K_AQd5Cg2YN z&hCC+MEa+mF=q6nn%bU;IR|*HjvS(YMWDJnr@8!xri3(l0snF(@W&2z&pUV>Yw|1i z=kV`8LYP%~Z_}Nne0z&gE?@VsO^JuZu9jk&KYAR0u^_$JY&tBB!O?NXN0GA5$Q4Qm zeow~<8-JVL;`mXVJu3I|kvJ%^N2vJNKQHCneO8=Atf(QZFZi?*lHxi1_iLIo}+`YRAhEXF8)`jAE}bkxF`c9RK= zQy=qF_|RX8!pPBQht|PEjPJ9o8WEO78U!8Yw*RI@tKY7$kVP(qiXwGnKprnVMhjFTK zCXHo1kg{aD;C^iJ-CXJnNDChLyQq-8C^)$kxYnBuQ9sOi>}Ojk~Pw z=)J=L1ik{%Y#;Q~DggCLxgU#+Kp7k)FRn_#bhh|W`~-f%xBLCCP{uFs=Ok0C8vqzz zVR(IdqC46C*7a(Vz=7*?o}KUm#Yk!pEzYfD;;^chKT}#@PzSbF55?-@n7yGL(CO=^ z9ISFbM=MN!b((hq{GV>&Uie+X!|GxEPGec2@Tr=teq!S#LtXvIGTnOh95o~_)fVnF zH#sURUY}bFSgBsK!Kp|zC1d?(WhniQCji4&v1L$;ps^AQ-vwjxr3NKiBT?4+KxaIZ zyn;nMfu0JkQ(?OVkhMO%TkB|BvMXW6>~hKg^9)O@ATM2JU&5TeIT{ z=}|7{C->vxqV7i2X>cFC%*RMxeES71`fKVGqe#sr5u_Y%J|3pcJ0IE;_(8N{3d2~j|({* zjA6^PSUx6Bx}OoFwdm`Az5dp!(R}^o3DnC2S>+fiZKKy>t$3Z(e?LfrksgU5H`@(|OVS`qawjZ2x`)96yO_#(7AEU^Plb>HlWY*LDewLamajWDo{%>-?68y2k zh|%EtWhc@qb9cdLwS~k`09Gv~EM8m@xx8b2RuUwTQO{5}jF$`F4qK3hA z6xB%zM?;$l@~Zd@tqU0V@!$gI%sZYslOVF0SJ@9-?W#yL1{fXHbCZ81i2@6bmEQg4 zjDKW!e~BSeTw12Mh1x_T2G^`f!HF>#*6Cy~4sXtT888N54dkPk0G13j+T5N4F{`a$ z9V94_n11P!5dHnGr;)B|dQ|oyFW|#716Im^R)3gWUEsW<=CnUd;ZMH*VMNk$OwzB+ zW>Jx`VF^)(^lZAf_@s~Q3JpAPt$Dn@!_IwZMPjjF;b2K))x~r2GP0+Y@KTcEPjZYA z#a^hIZ_3pITK_?mi)L<*$39-|H_ay%IWe(gT?onLmFpAXPqzuE(yF+A0$fsrAi#p4 z@L5>%_2W;*{Lldl_|IDgPUw9L)_+95yhm2P#s1uJ{T1}O5Jx%#^El#eoNDz-epV8- zg}*Ey)KX*!K$tykH*P$>ZwNdnaC4`}8`%_lMZ})=%h~XOrK5I-`%~T|FQYyVP4oMIhR90RO9g$MhV}Fbi3v!V%Pdy8=ZOS*tmv=GgFW{i~ zS_J)>ej`&Qd1qtJv>e!ra(2qoA)D>w$X;H=ca~2-WTB+r#WlyKBN5@6z^Z`7FL4~^ zrm%Oe*o>n4f3$X~+3`EC?`Uqyt4yD6edrdfP9Yy=dh9wwHN4n3Hp&J)@)5|$+0IL3 zHBeB3CM8rCsK8d5a3!hOe$MW6K?9VOaFjTm#H;Isnon=Z^i*(Z)2M|M)j)Lp^hRnt#@?c^h5f*Hi<-b zKc32$d5l*1rGcy+eVO}gr6kIO7M|k}8+s!o3XvK6G zd9v!N!On|{Wcq~*wJK0j!4z{BT(}*-xNJHHy~T1M(2h+69qcHgInK+~jjJEd?{lVR zrLWdQUSB*h$tp+eF>@7IOR2UX3=){ftmL0)by5{zH3`z6m8C!F#ipvA!I-89;qUUW zTTz`$fE0q|kpjTA5|$B&sl}A5ET2g|j0K%uLm>@{%>%Kr5N7%FxWtl@7gZ!-jdAKu z%*s{zuv~*Q5xb8+LP7?<9mj42E9=XXw7Hf}#ADlxV*ZCaqRG#VEf3+4+ry$7b+$(X zI;_qkuoF5l`jYIdDM?+r))i|whCPOg!7p}-(sPR;;fIMa?MqUE-}XPW5;ax*py(CX z)qZgWfxv>zwSj7^Bia#_j%ClD2q)+RMlxD|bIT+V6+?MYhL#%}6m#onl)CXgyr}A| z_}$HxNsZWS^v7@DzH|SldsDVtX8RVAao2D+`$jm_13lbeCs(hW+SG#Q{ou4WeEr57 z%xg?Zgv4YbdC&4FyW!Gp&|DU6p3h(zDjM(h=9JW22!!)1B_I2WorSYen0Zy)m0UFu z15NdE$#Z90+prOW96$+?@$sg{=-)yF28;g9J@FHg47l8p`G+=5fPH6_^ARce@`_p= z#I3)@trHeu14pNAy1@?~Yo;&N|9-Bz59v6{5n`iGm_@0PgwqzZ{qEqJ@Sd9BQL8EE zT`gITGpSqLt1FQy9TX_ArBx?eoasJ*+Wk#Kr{LMicUxh@s>Di zjn2deqKJaVp)Ykjni>cxHkPj46A{7rS`Pm|S~TpYoAgGt{Zyp`-5I7?WAiB*_=khj z2qF5i_K4JYn>n}?8g{Sn)bL(asGJs%E(z!yd=$F`kq6&0}pdTTI`!+j`I(hswz(TYb zxEMFnh}KX5cS%c99=IEU{e_v_?Uo`%i2(+kTsdvqT!6cgDcY9msRPxQ_FfZBZakN_5nmBQu4G}G$C`;xEKDF_pCm_ZU zv^k^R5sfex2Pk*KNlwn#l+0*Uld*oh zcKqZk1?Cn1>OYz8;Nic0gGMRJlXwz#KWI<o_sp^<;Skn8E*2RKK2$~Wt(rPQ#bSY=FvE}@vq#@8vZEMcDXZc$ z1GGs;Y;r~H4@b7rV28e)_JnWrbk3$J{TrilhgCytBy^CNJGG83!@-*;|JBfI%Q)7QX=u?>Fk5g*N>Ikh2G=-7B8wF$3?o_a=#fqk8I6WQrN9o2sIjoP4pw=u6J@qMvt6iU&v=Ne-9nIAYZ!$Zoh1%V2Z zk#!ClG^|`g8HDgx?vkc4`CwiLgwzjk73tjO!N0fmM!LU2tWeuZBAf{TsGQ3gjL#B+ zzcv!OljjI_U29-e1O3`JFb3?jboM$KPHJRjFIcn1_g&Bt&)mEAtqO|!ot7uB21iof3owjtZGTq|$`|ZJ3AE(aZ zIhz;LcW;X?OAg(ZH$AmJ{_Lw?>kG*B`&QZbq=Mf?cY3f%;pj`DC8FT=JhZaCw^igC zcf1qG)~`VjFXr)~K|C++_kj&T$&F5wiDeK!!H{6DZ&?0l5?2^=%^#_>)^}1SOHJN| z!^D-MP5}548%-3#mX)wGvR4gzciqvT+|H3kNkk;tOc&k%Qz?3)4|)EW7q_n`RMkh# zn<+uV_Mc@EVC85^*~kIOza*^Kl0^aMM1`MjR^a<2Ke*Q0^x$CpnjaBL<7V2@y!@Ca zTOv;BGcI$i&Y(?6LU%buQ!j^r2pG}(m49{egZJz>K+HnTt6rVg*s{AQBs(@wl`n1Q z`pth8$-8lsA3+$$C1RM9*Oz^B0}FbeMlBAbf)p}Gp&yrTZNY|NJ0E}s@nwJCuF&8A z;_P3iNJuBG{qF4@n5eQ8e83!;OiDgET^pQce;GWGpvgAl-);@~DNRg8V5?+LfCx>h zhI4QSgrPp_uU;*irs)E;^X$Na`~AXRx;{1uj^{O<#1wT?*r7?eU9R7iuxNZ@;L2b__aUDkABwH2nGuEdS3Cz-EIVon$GO5}w>px(xLK0H#ANo6~D$VSGgd1xz)RB<1NjV42Ore($Yb7r*0IBg2S0<3hutG8A$9N1B*+`Qi_~ovJE&da>&So68j+4MaN?(L0gVz`edc z2!QXymu=X>>nXI*qeu@$f~1TrP!$Lapt(G9Nr=>H6Xu}M?9vwl(c$TNYxWxPXIDo9 z5l9md*Q{+54uwz>jijc_rZSE&UvG6MO~j7=n5v>$WB!gZ|3r>hB_UlsvO+gfeCVhJ zIbH=B8=AD9bPNle^i0`|CL4!~W-1>O1uF3?TEv$HTD2p~%Rias+p3de+mxlhuH6;F z`yuJuDhNoP%L6-rdAV_FiH$gribECj4h4XeY!{+Z8W+H8$Ic5YbsLXX&M7WiTIsp! z2}bu`?3RGzrC)G%_l*TQoPStqR>pq6)~n)W4Ryznb!b-x7Zbo~1ls@NtNy|nvM;Nz z^OIxI@EQq!8|Em>7P4>Qo?C4Qc3ot#r z1ihM~(uE6wL}(`98ivZ~=Xze)pY&M>LKoZ4BU<@)?n=Bq`@*UZsAr^ETU$Z-t$vI- z=y*2cAAr+yC`Bw|_H#e-(23r91&@{*Y*2zrYGm^kBRQMjsH2lA6cIoi4F`Pi5zpUE!t249hXO~v* zEPzn3po)fvS<9Ydw1ys7u;?`P_g^XNPu62*ThS#UgZ83&6t=YxGpFr}qXgxyjls*{ zTSl>kPu}qGqsh}+mk;VHSSCA36skn=ZH7Fxrss;mn;K50&5r&zq# zUHuk6*Wn2LI|F#!WdyA?=AnQ)E@Q|G-E?YsNC}+g&wm^)gvF2v=h@Fz8_h&ZxJZ%_ z!Jbr(|73!|yyTr%qy_Gi=~@a)$El$!ss$P=OQ=P&8ilgSV8semi7T>>;>UeDi>+Ae z)9)5apS0+cAto+G3JEuSo!lCUU``+ss0>0Qw3t&T`ucGoI-OY*X*t?zY2A=pwcz#J z894i(!w5*+g;`Z`>!*Cgrob0Ee&{F=Ai;QKJ``AdEB7HLpsy>;ng-iO_AI1^LjWM4 zX-I5D;8)6@^_LBgzz5%R;)<@9-lu06QZ0%pH(j}cLCvQ)+7;}*;2rViBvFKeMf;i< zK#H~>B`5R+Yx1K>Y%s#$PuP5_1Eb9VeD`fngPYcLFRKiVhtMry(-|;u+0fC5CqJjn z71G_rjAZeC9%n^NOIAS?);MgPC2{Bn`s@PG!AOiM}<)M_)<%x=_ zAVR*B&|f72TE6u~?DfQ?jn~g1BkCp_LiRNR3>~lJ#cAM*1Dx*XS#RtN{6GM_F9 zE!GMYjD%>dn2_Rd27N0AMr&;fK0t?-5nGTF3qqy*o77;rrY zk{aUJE79Ni?75?;$+vEtQ9JRc@0YfNBV+c$EIt^HXIBY{&ZX7&r?SG)y6;e$G-kMi zugpigpmMA+Imhuw!9lO}-wf?oddOTGTiH3nA&Fo-z4_fHQ>zXKkS?ofHNsj+F%nRj zh~vue(iiSlt)A(iYtmsf_}|6%onR(_AR{lELCFAcvxIyItE0G?Hs4xW$SKf$qylxOY}RsetC+HYKk z)kCo{g(&t7kpXkeJ@(>`VBXj7{XF6hp+&(vV0XCXSdROOYvVC72PTBQxyp`_(O~kX zK;`1LA6z#j$56#-$q^{;GZ`%KzPepDHN)?0Aq7P%_fnEs_<+`bOb_k@Uj%-zS#llv z1(3cHq+F|vwL$jtHXW;uSci*GE7G+ny*8)WqGgZpg((C_kB~ti(>4c%nVH12T%`;j zByKrJ!^;_+hCyM|1A+&a1lQoM!QGwW4#llNkl<3> zp}1>tcc-|!Ymo}2P}=|IKIbLloMh~^*PQd4;8~`gBMp%0ze`|!bLRrRO-QTQe8rCL zC^qXf*M^Ff|6f~)>Ymv9P58Ci4c{Gv%Y}ZASXr4*(~7O2GPrZA$z%HeWD@b%_WT_~W{K0FMUVkZc+B+`P+5 zv{Rg_aO+d6*3*n4D_fUC=v1E*=Llifvy8oE{$pYMqeKXUEb-J~Gkio!8a}Sas?92$ zWew&bFwv7+`aph(zEcRipQVXM9c-3j*ph~%;jAjLn8NV(qiKO@0uUK?ZTcnMGTkh> zA6P_rTZ#;_mD)4x`Z72OEDUTMuUkQ*zIXng8k)RBd8yLm27lf9`{K2ih7jj|z2Et5 zgN=zfM*1FFr_hS_0B_*s1)xWu0|)+udm{&ILaE=G@&|rSe~S|Hd&Rz7KOaRmq|rL5uC*&-9_@&j_zO;BnlROP+5z7m;Fm5V`;i#@4=Zq0>w1|TBsxz^xgrAW z#q)9LC8UuLsee}?CV_mHs|FT1=;o6;SvV&10D+JBid&r2jHuh@iAT$8q2%v_s^4f9(6)OSqzHS936MG>2sN~gn$ zKS9VtI`LxQqhoF+>$gnKUjLxq`V<=r)@ar@9W-Cz(Wlhv&6t(62e%A;$a`j_99EI9 zu-MY7d?x?mz}-&!q4xCLI%DsA=2#_ zmOUTE<13HNCSw`F8e1pHfR8~KsBe@V>g_b7O?loO`Z>sMGkwB<*(0A&Em$ZQq2j$SA$msC{MJQV&; zz3$lw8cX%cWp+l1y8tsF>e%Wi0E|J zI-+;23>ujHW6a`?Z&<<(fHp>)dqN zfE>~=ZV`K9X60ruvRv3mg$qn%WXsLd+Dt;k*sb+iBC8WL0Z84b-kF|v^Ons|t|mS3 zbmnszi%5tWcp@smt~SO36K0XM*i!$;#5VRmHDgHb3B?>YyQrGbo%*R|p*Oz@%+ovl zWWgC=NKa3ypT($YDLc!Yn~tvnU)T-?6W1gNC+oituHGp%B~^m+^p zI4#jKMp%tpAx@%WL4NM8hwEv6RAjt9D#u9%m1#idh`BMfZK%+ah&>%-He#vLWNf0< z%qVxKgecii^P^LFVbCaNdIvtZQeC6cWg$r6y8{#hUYa#c__oH(9-mVT`5Q=&I#c5d*1IYUoDW-2$BXIQgUcsF{+ z?$pWTygXP~qp;wZq8+HX9k5b>Mia%~W|o3ZXnluohdRkEfGZ;V|-* zR2gi4I`o&pCn|$xDNt6Ca7CGyMIsG?(pijD>sIe~ zyN;yt!^2FUluYENJ%9XlIGMX|?%`op+yH4xm#kh5v9K;|SguS0!*r$hnhNFQ*a+p5 z=?gW!6{_mZ!KqA4-uwqXV6OsBAD{qwPE^NG16@H}oGFpF^AyJA&3_$(e_;=ur*MbC z@6#`?`$5Mx6#jLh8P7N5L9FHbruoI!|JD_&`q?T+0G1Bos`?zKu<)8SN}9VbRQ}< z7k7Qg7O79-3|N$k2z&6ty_0+)7Q|B_LWL0xOU~l@d_Wtsj`#Yk_bnkz7Z8biuT;u} zE5qlHOTJ+qi~4vy(PPtK%WLE8Osxh^Vo=3GENLT^qRLqi(*4G&YK8A(KTfJls11WB z0ks)&<6b(%| zJhRM%Js}Uh|Eu+qK2$?n14UaK!vKQ>Lykd3hlwA`2~5Uh0vF}m#4}n|+Lx-962(~6 z+X7`OV$7v0q>T8?6Rj%)=x9ef3$M!@aC7ajY{VkaKQiV!v+6QcvD=u+!v76LiHbKo z98n9qtEF{es-p{?<6}co=^?OS24_Ogk}Kal;dm&wgZ;j27n14*Mq?nvU&+-${$9h7 z%*dXw9-}LSr%WvUIGBSp2}DwgQDTfie%gvMhft=|g*Pfcdd5_x1i? zOM4jw+|ZMq2tpIhtfK*UZpOrek;%v~3)FT@Ufe5gcpjAxBD+PT@Zyjp5zQpOx+5yG zv{7DUcNK~^@2gu=OJArBvWytaBjF!S&}1!BRPcCwRVV&!aU#EiCcS9^6ivBg|0fS@ z8bK09nSGV7D2=Zat*OtY{VHGiXC@c9M0n8s7fNR0Z6;SGq6?Qp-kcks*vE8|`9M<6 zrDikSm%5t|3tWHRL-^SvuDVY{YiudX9js%x9)tMqqO^2HarZZ;pd_qbwdr_kr^b}>T0$FAC?|WWS#I@`6 zzeQfJ!hOxkx&0?^U?&==hR5u95K6lB<%L+OFhN{23eE@i`+B)*k%m##y%Se=8mR}K z{u(UJ>L#O!-?GE#U=DMOnXA4e0oDS?cs!UCAp!Al_c89jkFGI zK=f&eaFQ9|*94wHN~{QCc3Cd8V4C#kv(Hn_#z6$$oJHN#^miL*y}b6RHev!RRhQ@- z<9j09W#lmx>1z>wEZj-C!L_~%SM&Qm5SCzbka3@ z>`>#v>VOMj7PQ+DssrWbng4ADgwq6O+&#_rn__X&`irv@VJjvAwKgbJi*u&D>Zl7G`mw zd+*X2Taj+*TGS|r)bo3=+TjMNASgrxo)e+(` z-fk}ipucYSmY>*D6XeaUKN>1ccg0Q@i>8&9Asg!+ZGs`0Y8W%`9JjnhgT_1zN1D_X za&GG4@d)j8&Ao-+xwn_~%J)6zRm%E358Mwe=LWmTeF}7Sj#IT#uH;o70drIz*T4mM z6>tqUuzzY{;oAe!$D^muFvjFOa|)D6b+{e*0nXQxD&Q$baiT4k!*kD(8NEjeW=7OVUo@%ZNbM+l zl%3*fta9j@4UY5{jKE=8r0SswUput)qyt0PHzF+&m&61YO%8WmCNn&m72i0_;F|%l zA!DrdtBIACvDJm=JGs&&NK`ak83iGIE9QUiBKr9r%QP2mRUVkhN4MZ(G)m2j+mGvM zg`Gkx*ek5gJLS!m)k;>;CkTSG=Y1*5mYZPo8jS{V{FRg1ZaH2^nog39p=6nj*ETS$ zTf2SY+)Z}acyC;K59SdfotUhxkJNJ^l8>aeg!*M{*+|llj&cHa`^PKah<7D2OfOG} znk}?eUfJa_@9`N_EjT#Uns%!CbnpnX#;(XM#bFUhCRoQ|C-)EGwilz3EQKoNsN^ZV-hwy zZ%5q2iDK`?3sVIuZR4AK2QU2_LMnu3ti2~dMvYH?eRK#`IMoOS52eIuSSnT)3o0oYiA{$k7#rGP=iYD5sOj5?8 zr$0u-=K3ZVqE;6<=eEsDLRHB@WRer;aJ--1To`y=E!IL-m11A4&(>%s(*?dUQV
    JG5>2*Tjic*Z#XxK*7?C2-cO$ADSE2un@ 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" % (dep, path, d2)) - except: - print "Removing dependency %s from target %s" % (d2, dep) - rec_deps.remove(d2) - continue - c2 = chain.copy() - c2[d2] = True - (rec_uselib, rec_uselib_local, - rec_add_objects) = expand_dependencies(bld, d2, c2, "%s->%s" % (path, d2)) - uselib.extend(rec_uselib) - uselib_local.extend(rec_uselib_local) - add_objects.extend(rec_add_objects) - - if t is not None: - t.expanded_dependencies = (uselib, uselib_local, add_objects) - - return (uselib, uselib_local, add_objects) - - -def expand_deplist(self): - '''return an expanded list of dependencies from the samba_deps attribute''' - - if not getattr(self, 'samba_deps', None): - return ([], [], []) - - bld = self.bld - deps = self.samba_deps - - uselib_local = [] - uselib = [] - add_objects = [] - - for d in deps: - (u, ul, ao) = expand_dependencies(bld, d, { self.name:True }, self.name) - uselib.extend(u) - uselib_local.extend(ul) - add_objects.extend(ao) +def expand_subsystem_deps(bld): + '''expand the reverse dependencies resulting from subsystem + attributes of modules''' + subsystems = LOCAL_CACHE(bld, 'INIT_FUNCTIONS') + aliases = LOCAL_CACHE(bld, 'TARGET_ALIAS') + targets = LOCAL_CACHE(bld, 'TARGET_TYPE') + + for s in subsystems: + if s in aliases: + s = aliases[s] + bld.ASSERT(s in targets, "Subsystem target %s not declared" % s) + type = targets[s] + if type == 'DISABLED' or type == 'EMPTY': + continue - return (uselib, uselib_local, add_objects) + t = bld.name_to_obj(s, bld.env) + bld.ASSERT(t is not None, "Subsystem target %s not found" % s) + for d in subsystems[s]: + type = targets[d['TARGET']] + if type != 'DISABLED' and type != 'EMPTY': + t.samba_deps_extended.append(d['TARGET']) + t2 = bld.name_to_obj(d['TARGET'], bld.env) + t2.samba_includes_extended.extend(t.samba_includes_extended) + t2.samba_deps_extended.extend(t.samba_deps_extended) + t.samba_deps_extended = unique_list(t.samba_deps_extended) -@feature('cc', 'cshlib', 'cprogram') -@before('apply_lib_vars', 'apply_verif', 'apply_objdeps', 'apply_obj_vars', 'apply_incpaths', 'build_includes') -@after('default_cc') def build_dependencies(self): '''This builds the dependency list for a target. It runs after all the targets are declared The reason this is not just done in the SAMBA_*() rules is that we have no way of knowing - the full dependency list for a target until we have all of the targets declared. So what we do is - add a samba_deps attribute on the task generator when we declare it, then - this rule runs after all the task generators are declared and maps the samba_deps attribute - to a set of uselib, uselib_local and add_objects dependencies + the full dependency list for a target until we have all of the targets declared. ''' - if getattr(self, 'build_dependencies_done', False): - return - self.build_dependencies_done = True - - if getattr(self, 'samba_deps', None) is None: - return - - target_dict = LOCAL_CACHE(self.bld, 'TARGET_TYPE') - # we only should add extra library and object deps on libraries and binaries - type = target_dict[self.name] - if type != 'LIBRARY' and type != 'BINARY': + if not self.samba_type in ['LIBRARY', 'BINARY', 'PYTHON']: return - (uselib, uselib_local, add_objects) = expand_deplist(self) + # we need to link against: - if 'GLOBAL_DEPENDENCIES' in self.bld.env: - add_objects.extend(self.bld.env.GLOBAL_DEPENDENCIES) + # 1) any direct system libs + # 2) any indirect system libs that come from subsystem dependencies + # 3) any direct local libs + # 4) any indirect local libs that come from subsystem dependencies + # 5) any direct objects + # 6) any indirect objects that come from subsystem dependencies - self.uselib = unique_list(uselib) - self.uselib_local = unique_list(uselib_local) - self.add_objects = unique_list(add_objects) + self.uselib = list(self.final_syslibs) + self.uselib_local = list(self.final_libs) + self.add_objects = list(self.final_objects) - debug('deps: dependency counts for %s: uselib=%u uselib_local=%u add_objects=%u' % ( - self.name, len(uselib), len(uselib_local), len(add_objects))) + debug('deps: computed dependencies for target %s: uselib=%s uselib_local=%s add_objects=%s', + self.sname, self.uselib, self.uselib_local, self.add_objects) -@feature('cc', 'cshlib', 'cprogram') -@before('apply_lib_vars', 'apply_verif', 'apply_objdeps', 'apply_obj_vars', 'apply_incpaths', 'add_init_functions') -@after('build_dependencies') def build_includes(self): '''This builds the right set of includes for a target. - This is closely related to building the set of dependencies, and - calls into the same expand_dependencies() function to do the work. - One tricky part of this is that the includes= attribute for a target needs to use paths which are relative to that targets declaration directory (which we can get at via t.path). @@ -191,82 +100,68 @@ def build_includes(self): attribute ''' - if not getattr(self, 'build_dependencies_done', False): - build_dependencies(self) - if getattr(self, 'build_includes_done', False): - return - self.build_includes_done = True - if getattr(self, 'samba_includes', None) is None: return bld = self.bld - (uselib, uselib_local, add_objects) = expand_deplist(self) - - # get the list of all dependencies - all_deps = [] -# all_deps.extend(uselib) - all_deps.extend(uselib_local) - all_deps.extend(add_objects) - all_deps = unique_list(all_deps) + inc_deps = self.includes_objects includes = [] - # build a list of includes + # maybe add local includes if getattr(self, 'local_include', True) == True and getattr(self, 'local_include_first', True): includes.append('.') - includes.extend(TO_LIST(self.samba_includes)) + includes.extend(self.samba_includes_extended) if 'EXTRA_INCLUDES' in bld.env: includes.extend(bld.env['EXTRA_INCLUDES']) includes.append('#') - mypath = self.path.abspath(bld.env) + inc_set = set() + inc_abs = [] - for d in all_deps: + for d in inc_deps: t = bld.name_to_obj(d, bld.env) - bld.ASSERT(t is not None, "Unable to find dependency %s for %s" % (d, self.name)) - t.samba_used = True - samba_includes = getattr(t, 'samba_includes', None) - inclist = TO_LIST(samba_includes) + bld.ASSERT(t is not None, "Unable to find dependency %s for %s" % (d, self.sname)) + inclist = getattr(t, 'samba_includes_extended', []) if getattr(t, 'local_include', True) == True: inclist.append('.') if inclist == []: continue - tpath = t.path.abspath(bld.env) - relpath = os.path.relpath(tpath, mypath) + tpath = t.samba_abspath for inc in inclist: - includes.append(os.path.normpath(os.path.join(relpath, inc))) + npath = tpath + '/' + inc + if not npath in inc_set: + inc_abs.append(npath) + inc_set.add(npath) + + mypath = self.path.abspath(bld.env) + for inc in inc_abs: + relpath = os_path_relpath(inc, mypath) + includes.append(relpath) if getattr(self, 'local_include', True) == True and not getattr(self, 'local_include_first', True): includes.append('.') self.includes = unique_list(includes) - debug('deps: Target %s has includes=%s all_deps=%s' % (self.name, self.includes, all_deps)) + debug('deps: includes for target %s: includes=%s', + self.sname, self.includes) + -@feature('cc', 'cshlib', 'cprogram') -@before('apply_lib_vars', 'apply_verif', 'apply_objdeps', 'apply_obj_vars', 'apply_incpaths') -@after('build_includes') def add_init_functions(self): '''This builds the right set of init functions''' - if not getattr(self, 'build_includes_done', False): - build_includes(self) - if getattr(self, 'add_init_functions_done', False): - return - self.add_init_functions_done = True - bld = self.bld subsystems = LOCAL_CACHE(bld, 'INIT_FUNCTIONS') modules = [] - if self.name in subsystems: - modules.append(self.name) + if self.sname in subsystems: + modules.append(self.sname) m = getattr(self, 'samba_modules', None) if m is not None: @@ -279,112 +174,530 @@ def add_init_functions(self): if modules == []: return - cflags = getattr(self, 'ccflags', []) + sentinal = getattr(self, 'init_function_sentinal', 'NULL') + + cflags = getattr(self, 'samba_cflags', [])[:] for m in modules: - if not m in subsystems: - print "subsystems: %s" % subsystems bld.ASSERT(m in subsystems, - "No init_function defined for module '%s' in target '%s'" % (m, self.name)) - cflags.append('-DSTATIC_%s_MODULES="%s"' % (m, ','.join(subsystems[m]))) + "No init_function defined for module '%s' in target '%s'" % (m, self.sname)) + init_fn_list = [] + for d in subsystems[m]: + init_fn_list.append(d['INIT_FUNCTION']) + cflags.append('-DSTATIC_%s_MODULES=%s' % (m, ','.join(init_fn_list) + ',' + sentinal)) self.ccflags = cflags -def check_orpaned_targets(bld): + +def check_duplicate_sources(bld, tgt_list): + '''see if we are compiling the same source file into multiple + subsystem targets for the same library or binary''' + + debug('deps: checking for duplicate sources') + + targets = LOCAL_CACHE(bld, 'TARGET_TYPE') + + for t in tgt_list: + if not targets[t.sname] in [ 'LIBRARY', 'BINARY', 'PYTHON' ]: + continue + + sources = [] + for obj in t.add_objects: + t2 = t.bld.name_to_obj(obj, bld.env) + obj_sources = getattr(t2, 'source', '') + if obj_sources == '': continue + tpath = os_path_relpath(t2.path.abspath(bld.env), t.env['BUILD_DIRECTORY'] + '/default') + obj_sources = bld.SUBDIR(tpath, obj_sources) + sources.append( { 'dep':obj, 'src':set(TO_LIST(obj_sources)) } ) + #debug('deps: dependency expansion for target %s add_object %s: %s', + # t.sname, obj, obj_sources) + for s in sources: + for s2 in sources: + if s['dep'] == s2['dep']: continue + common = s['src'].intersection(s2['src']) + if common: + bld.ASSERT(False, + "Target %s has duplicate source files in %s and %s : %s" % (t.sname, + s['dep'], s2['dep'], + common)) + +def check_orpaned_targets(bld, tgt_list): '''check if any build targets are orphaned''' target_dict = LOCAL_CACHE(bld, 'TARGET_TYPE') - # make sure all the earlier functions have run - for t in bld.all_task_gen: - if not t.name in target_dict: + debug('deps: checking for orphaned targets') + + for t in tgt_list: + if getattr(t, 'samba_used', False) == True: continue - if not getattr(t, 'add_init_functions_done', False): - add_init_functions(t) + type = target_dict[t.sname] + if not type in ['BINARY', 'LIBRARY', 'MODULE', 'ET', 'PYTHON']: + if re.search('^PIDL_', t.sname) is None: + print "Target %s of type %s is unused by any other target" % (t.sname, type) + + +def show_final_deps(bld, tgt_list): + '''show the final dependencies for all targets''' + + targets = LOCAL_CACHE(bld, 'TARGET_TYPE') - for t in bld.all_task_gen: - if not t.name in target_dict: + for t in tgt_list: + if not targets[t.sname] in ['LIBRARY', 'BINARY', 'PYTHON']: continue - if getattr(t, 'samba_used', False) == True: + debug('deps: final dependencies for target %s: uselib=%s uselib_local=%s add_objects=%s', + t.sname, t.uselib, t.uselib_local, t.add_objects) + + +def add_samba_attributes(bld, tgt_list): + '''ensure a target has a the required samba attributes''' + + targets = LOCAL_CACHE(bld, 'TARGET_TYPE') + + for t in tgt_list: + if t.name != '': + t.sname = t.name + else: + t.sname = t.target + t.samba_type = targets[t.sname] + t.samba_abspath = t.path.abspath(bld.env) + t.samba_deps_extended = t.samba_deps[:] + t.samba_includes_extended = TO_LIST(t.samba_includes)[:] + t.ccflags = getattr(t, 'samba_cflags', '') + +def build_direct_deps(bld, tgt_list): + '''build the direct_objects and direct_libs sets for each target''' + + targets = LOCAL_CACHE(bld, 'TARGET_TYPE') + global_deps = bld.env.GLOBAL_DEPENDENCIES + + for t in tgt_list: + t.direct_objects = set() + t.direct_libs = set() + t.direct_syslibs = set() + deps = t.samba_deps_extended + deps.extend(global_deps) + for d in deps: + d = EXPAND_ALIAS(bld, d) + if not d in targets: + print "Unknown dependency %s in %s" % (d, t.sname) + raise + if targets[d] in [ 'EMPTY', 'DISABLED' ]: + continue + if targets[d] == 'SYSLIB': + t.direct_syslibs.add(d) + continue + t2 = bld.name_to_obj(d, bld.env) + if t2 is None: + print "no task %s type %s" % (d, targets[d]) + if t2.samba_type in [ 'LIBRARY', 'MODULE' ]: + t.direct_libs.add(d) + elif t2.samba_type in [ 'SUBSYSTEM', 'ASN1', 'PYTHON' ]: + t.direct_objects.add(d) + debug('deps: built direct dependencies') + + + +def indirect_libs(bld, t, chain): + '''recursively calculate the indirect library dependencies for a target + + An indirect library is a library that results from a dependency on + a subsystem + ''' + + ret = getattr(t, 'indirect_libs', None) + if ret is not None: + return ret + + ret = set() + for obj in t.direct_objects: + if obj in chain: continue - type = target_dict[t.name] - if type != 'BINARY' and type != 'LIBRARY' and type != 'MODULE': - if re.search('^PIDL_', t.name) is None: - print "Target %s of type %s is unused by any other target" % (t.name, type) + chain.add(obj) + t2 = bld.name_to_obj(obj, bld.env) + r2 = indirect_libs(bld, t2, chain) + chain.remove(obj) + ret = ret.union(t2.direct_libs) + ret = ret.union(r2) + + for obj in t.indirect_objects: + if obj in chain: + continue + chain.add(obj) + t2 = bld.name_to_obj(obj, bld.env) + r2 = indirect_libs(bld, t2, chain) + chain.remove(obj) + ret = ret.union(t2.direct_libs) + ret = ret.union(r2) + t.indirect_libs = ret -def CHECK_ORPANED_TARGETS(bld): - bld.add_pre_fun(check_orpaned_targets) -Build.BuildContext.CHECK_ORPANED_TARGETS = CHECK_ORPANED_TARGETS + return ret -@feature('dfkj*') -def samba_post_process(self): - '''samba specific post processing of task''' - if getattr(self, 'meths', None) is None: - return - count = getattr(self, 'moved_to_end', 0) - if count < 10: - # there has got to be a better way!! - self.moved_to_end = count + 1 - self.meths.append('samba_post_process') - return +def indirect_syslibs(bld, t, chain): + '''recursively calculate the indirect system library dependencies for a target - samba_post = getattr(self, 'samba_post', None) - if samba_post is None: - return - (tgt, cmd) = samba_post - self.env.TARGET_DIRECTORY = self.path.abspath(self.env) - #print "cmd=%s tgt=%s" % (cmd, tgt) - cmd = Utils.subst_vars(cmd, self.env) - tgt = Utils.subst_vars(tgt, self.env) - if os.path.isfile(tgt): - debug('deps: post processing for %s: %s' % (self.name, cmd)) - ret = os.system(cmd) - self.bld.ASSERT(ret == 0, "Post processing for %s failed (%d): %s" % (self.name, ret, cmd)) - - -############################## -# handle the creation of links for libraries and binaries -# note that we use a relative symlink path to allow the whole tree -# to me moved/copied elsewhere without breaking the links -t = Task.simple_task_type('symlink_lib', 'ln -sf ../${SRC} ${LINK_TARGET}', color='PINK', - ext_in='.bin') -t.quiet = True - -@feature('symlink_lib') -@after('apply_link') -def symlink_lib(self): - tsk = self.create_task('symlink_lib', self.link_task.outputs[0]) - - # calculat the link target and put it in the environment - soext="" - vnum = getattr(self, 'vnum', None) - if vnum is not None: - soext = '.' + vnum.split('.')[0] - - libname = self.target - tsk.env.LINK_TARGET = '%s/lib%s.so%s' % (LIB_PATH, libname, soext) - debug('task_gen: LINK_TARGET for %s is %s', self.name, tsk.env.LINK_TARGET) - - -# for binaries we need to copy the executable to avoid the rpath changing -# in the local bin/ directory on install -t = Task.simple_task_type('copy_bin', 'rm -f ${BIN_TARGET} && cp ${SRC} ${BIN_TARGET}', color='PINK', - ext_in='.bin', shell=True) -t.quiet = True - -@feature('copy_bin') -@after('apply_link') -def copy_bin(self): - if Options.is_install: - # we don't want to copy the install binary, as - # that has the install rpath, not the build rpath - # The rpath of the binaries in bin/default/foo/blah is different - # during the install phase, as distros insist on not using rpath in installed binaries + An indirect syslib results from a subsystem dependency + ''' + + ret = getattr(t, 'indirect_syslibs', None) + if ret is not None: + return ret + ret = set() + for obj in t.direct_objects: + if obj in chain: + continue + chain.add(obj) + t2 = bld.name_to_obj(obj, bld.env) + r2 = indirect_syslibs(bld, t2, chain) + chain.remove(obj) + ret = ret.union(t2.direct_syslibs) + ret = ret.union(r2) + + t.indirect_syslibs = ret + return ret + + +def indirect_objects(bld, t, chain): + '''recursively calculate the indirect object dependencies for a target + + indirect objects are the set of objects from expanding the + subsystem dependencies + ''' + + ret = getattr(t, 'indirect_objects', None) + if ret is not None: return ret + + ret = set() + for lib in t.direct_objects: + if lib in chain: + continue + chain.add(lib) + t2 = bld.name_to_obj(lib, bld.env) + r2 = indirect_objects(bld, t2, chain) + chain.remove(lib) + ret = ret.union(t2.direct_objects) + ret = ret.union(r2) + + t.indirect_objects = ret + return ret + + +def expanded_targets(bld, t, chain): + '''recursively calculate the expanded targets for a target + + expanded objects are the set of objects, libraries and syslibs + from expanding the subsystem dependencies, library dependencies + and syslib dependencies + ''' + + ret = getattr(t, 'expanded_targets', None) + if ret is not None: return ret + + ret = t.direct_objects.copy() + ret = ret.union(t.direct_libs) + ret = ret.union(t.direct_syslibs) + + direct = ret.copy() + + for d in direct: + if d in chain: continue + chain.add(d) + t2 = bld.name_to_obj(d, bld.env) + if t2 is None: continue + r2 = expanded_targets(bld, t2, chain) + chain.remove(d) + ret = ret.union(r2) + + if t.sname in ret: + ret.remove(t.sname) + + t.expanded_targets = ret + return ret + + +def expanded_targets2(bld, t, chain): + '''recursively calculate the expanded targets for a target + + expanded objects are the set of objects from expanding the + subsystem dependencies and library dependencies + ''' + + ret = getattr(t, 'expanded_targets2', None) + if ret is not None: return ret + + ret = t.final_objects.copy() + + for attr in [ 'final_objects', 'final_libs' ]: + f = getattr(t, attr, set()) + for d in f.copy(): + if d in chain: + continue + chain.add(d) + t2 = bld.name_to_obj(d, bld.env) + if t2 is None: continue + r2 = expanded_targets2(bld, t2, chain) + chain.remove(d) + ret = ret.union(r2) + + if t.sname in ret: + ret.remove(t.sname) + + t.expanded_targets2 = ret + return ret + + +def includes_objects(bld, t, chain): + '''recursively calculate the includes object dependencies for a target + + includes dependencies come from either library or object dependencies + ''' + ret = getattr(t, 'includes_objects', None) + if ret is not None: + return ret + + ret = t.direct_objects.copy() + ret = ret.union(t.direct_libs) + + for obj in t.direct_objects: + if obj in chain: + continue + chain.add(obj) + t2 = bld.name_to_obj(obj, bld.env) + r2 = includes_objects(bld, t2, chain) + chain.remove(obj) + ret = ret.union(t2.direct_objects) + ret = ret.union(r2) + + for lib in t.direct_libs: + if lib in chain: + continue + chain.add(lib) + t2 = bld.name_to_obj(lib, bld.env) + r2 = includes_objects(bld, t2, chain) + chain.remove(lib) + ret = ret.union(t2.direct_objects) + ret = ret.union(r2) + + t.includes_objects = ret + return ret + + +def build_indirect_deps(bld, tgt_list): + '''build the indirect_objects and indirect_libs sets for each target''' + for t in tgt_list: + indirect_objects(bld, t, set()) + indirect_libs(bld, t, set()) + indirect_syslibs(bld, t, set()) + includes_objects(bld, t, set()) + expanded_targets(bld, t, set()) + debug('deps: built indirect dependencies') + + +def re_expand2(bld, tgt_list): + for t in tgt_list: + t.expanded_targets2 = None + for type in ['BINARY','LIBRARY','PYTHON']: + for t in tgt_list: + if t.samba_type == type: + expanded_targets2(bld, t, set()) + for t in tgt_list: + expanded_targets2(bld, t, set()) + + +def calculate_final_deps(bld, tgt_list): + '''calculate the final library and object dependencies''' + for t in tgt_list: + # start with the maximum possible list + t.final_syslibs = t.direct_syslibs.union(t.indirect_syslibs) + t.final_libs = t.direct_libs.union(t.indirect_libs) + t.final_objects = t.direct_objects.union(t.indirect_objects) + + for t in tgt_list: + # don't depend on ourselves + if t.sname in t.final_libs: + t.final_libs.remove(t.sname) + if t.sname in t.final_objects: + t.final_objects.remove(t.sname) + + re_expand2(bld, tgt_list) + + loops = {} + + # find any library loops + for t in tgt_list: + if t.samba_type in ['LIBRARY', 'PYTHON']: + for l in t.final_libs.copy(): + t2 = bld.name_to_obj(l, bld.env) + if t.sname in t2.final_libs: + debug('deps: removing library loop %s<->%s', t.sname, l) + t2.final_libs.remove(t.sname) + loops[t2.sname] = t.sname; + + re_expand2(bld, tgt_list) + + for type in ['BINARY']: + while True: + changed = False + for t in tgt_list: + if t.samba_type != type: continue + # if we will indirectly link to a target then we don't need it + new = t.final_objects.copy() + for l in t.final_libs: + t2 = bld.name_to_obj(l, bld.env) + dup = new.intersection(t2.expanded_targets2) + if dup: + debug('deps: removing dups from %s: %s also in %s %s', + t.sname, dup, t2.samba_type, l) + new = new.difference(dup) + changed = True + if changed: + t.final_objects = new + break + if not changed: + break + debug('deps: removed duplicate dependencies') + + +###################################################################### +# this provides a way to save our dependency calculations between runs +savedeps_version = 1 +savedeps_inputs = ['samba_deps', 'samba_includes', 'local_include', 'local_include_first', 'samba_cflags'] +savedeps_outputs = ['uselib', 'uselib_local', 'add_objects', 'includes', 'ccflags'] +savedeps_caches = ['GLOBAL_DEPENDENCIES', 'TARGET_ALIAS', 'TARGET_TYPE', 'INIT_FUNCTIONS'] + +def save_samba_deps(bld, tgt_list): + '''save the dependency calculations between builds, to make + further builds faster''' + denv = Environment.Environment() + + denv.version = savedeps_version + denv.savedeps_inputs = savedeps_inputs + denv.savedeps_outputs = savedeps_outputs + denv.input = {} + denv.output = {} + denv.caches = {} + + for c in savedeps_caches: + denv.caches[c] = LOCAL_CACHE(bld, c) + + for t in tgt_list: + # save all the input attributes for each target + tdeps = {} + for attr in savedeps_inputs: + v = getattr(t, attr, None) + if v is not None: + tdeps[attr] = v + if tdeps != {}: + denv.input[t.sname] = tdeps + + # save all the output attributes for each target + tdeps = {} + for attr in savedeps_outputs: + v = getattr(t, attr, None) + if v is not None: + tdeps[attr] = v + if tdeps != {}: + denv.output[t.sname] = tdeps + + depsfile = os.path.join(bld.bdir, "sambadeps") + denv.store(depsfile) + + +def load_samba_deps(bld, tgt_list): + '''load a previous set of build dependencies if possible''' + depsfile = os.path.join(bld.bdir, "sambadeps") + denv = Environment.Environment() + try: + debug('deps: checking saved dependencies') + denv.load(depsfile) + if (denv.version != savedeps_version or + denv.savedeps_inputs != savedeps_inputs or + denv.savedeps_outputs != savedeps_outputs): + return False + except: + return False + + # check if caches are the same + for c in savedeps_caches: + if c not in denv.caches or denv.caches[c] != LOCAL_CACHE(bld, c): + return False + + # check inputs are the same + for t in tgt_list: + tdeps = {} + for attr in savedeps_inputs: + v = getattr(t, attr, None) + if v is not None: + tdeps[attr] = v + if t.sname in denv.input: + olddeps = denv.input[t.sname] + else: + olddeps = {} + if tdeps != olddeps: + #print '%s: \ntdeps=%s \nodeps=%s' % (t.sname, tdeps, olddeps) + return False + + # put outputs in place + for t in tgt_list: + if not t.sname in denv.output: continue + tdeps = denv.output[t.sname] + for a in tdeps: + setattr(t, a, tdeps[a]) + + debug('deps: loaded saved dependencies') + return True + + +def check_project_rules(bld): + '''check the project rules - ensuring the targets are sane''' + + targets = LOCAL_CACHE(bld, 'TARGET_TYPE') + + # build a list of task generators we are interested in + tgt_list = [] + for tgt in targets: + type = targets[tgt] + if not type in ['SUBSYSTEM', 'MODULE', 'BINARY', 'LIBRARY', 'ASN1', 'PYTHON']: + continue + t = bld.name_to_obj(tgt, bld.env) + tgt_list.append(t) + + add_samba_attributes(bld, tgt_list) + + if load_samba_deps(bld, tgt_list): return - tsk = self.create_task('copy_bin', self.link_task.outputs[0]) - tsk.env.BIN_TARGET = self.target - debug('task_gen: BIN_TARGET for %s is %s', self.name, tsk.env.BIN_TARGET) + debug('deps: project rules checking started') + + expand_subsystem_deps(bld) + build_direct_deps(bld, tgt_list) + build_indirect_deps(bld, tgt_list) + calculate_final_deps(bld, tgt_list) + + # run the various attribute generators + for f in [ build_dependencies, build_includes, add_init_functions ]: + debug('deps: project rules checking %s', f) + for t in tgt_list: f(t) + + debug('deps: project rules stage1 completed') + + #check_orpaned_targets(bld, tgt_list) + #check_duplicate_sources(bld, tgt_list) + show_final_deps(bld, tgt_list) + + debug('deps: project rules checking completed - %u targets checked', + len(tgt_list)) + + save_samba_deps(bld, tgt_list) + + +def CHECK_PROJECT_RULES(bld): + '''enable checking of project targets for sanity''' + if bld.env.added_project_rules: + return + bld.env.added_project_rules = True + bld.add_pre_fun(check_project_rules) +Build.BuildContext.CHECK_PROJECT_RULES = CHECK_PROJECT_RULES diff --git a/buildtools/wafsamba/samba_errtable.py b/buildtools/wafsamba/samba_errtable.py new file mode 100644 index 0000000000..d324a3541b --- /dev/null +++ b/buildtools/wafsamba/samba_errtable.py @@ -0,0 +1,26 @@ +# waf build tool for building .et files with compile_et +import Build, os +from samba_utils import * + +def SAMBA_ERRTABLE(bld, name, source): + '''Build a heimdal errtable from a .et file''' + + bname = source[0:-3]; # strip off the .et suffix + + if not SET_TARGET_TYPE(bld, name, 'ET'): + return + + bld.SET_BUILD_GROUP('build_source') + + out_files = [] + out_files.append('%s.c' % bname) + out_files.append('%s.h' % bname) + + t = bld(rule='${SRC[0].abspath(env)} . ${TGT[0].parent.abspath(env)} default/source4/heimdal_build/compile_et ${SRC[2].abspath(env)} ${TGT[0].bldpath(env)}', + ext_out = '.c', + before = 'cc', + shell = True, + source = ['et_compile_wrapper.sh', 'compile_et', source], + target = out_files, + name = name) +Build.BuildContext.SAMBA_ERRTABLE = SAMBA_ERRTABLE diff --git a/buildtools/wafsamba/samba_patterns.py b/buildtools/wafsamba/samba_patterns.py index ef89db69a6..237020ba29 100644 --- a/buildtools/wafsamba/samba_patterns.py +++ b/buildtools/wafsamba/samba_patterns.py @@ -1,28 +1,9 @@ # a waf tool to add extension based build patterns for Samba -import os, sys, Options -import string, Task, Utils, optparse -from Configure import conf -from Logs import debug +import Task from TaskGen import extension from samba_utils import * -################################################################################ -# a et task which calls out to compile_et to do the work -Task.simple_task_type('et', - '../heimdal_build/et_compile_wrapper.sh . ${TGT[0].bld_dir(env)} default/source4/heimdal_build/compile_et ${SRC[0].abspath(env)} ${TGT[0].bldpath(env)}', - color='BLUE', ext_out='.c', - shell = False) - -@extension('.et') -def process_et(self, node): - c_node = node.change_ext('.c') - h_node = node.change_ext('.h') - self.create_task('et', node, [c_node, h_node]) - self.allnodes.append(c_node) - - - def SAMBA_MKVERSION(bld, target): '''generate the version.h header for Samba''' bld.SET_BUILD_GROUP('setup') diff --git a/buildtools/wafsamba/samba_pidl.py b/buildtools/wafsamba/samba_pidl.py index d37e7f1d23..e76e029a12 100644 --- a/buildtools/wafsamba/samba_pidl.py +++ b/buildtools/wafsamba/samba_pidl.py @@ -1,7 +1,7 @@ # waf build tool for building IDL files with pidl -from TaskGen import taskgen, before -import Build, os, string, Utils +from TaskGen import before +import Build, os from samba_utils import * def SAMBA_PIDL(bld, pname, source, options='', output_dir='.'): @@ -41,7 +41,11 @@ def SAMBA_PIDL(bld, pname, source, options='', output_dir='.'): # remember this one for the tables generation table_header_idx = len(out_files) - 1 - pidl = bld.srcnode.find_resource('pidl/pidl').relpath_gen(bld.path) + # depend on the full pidl sources + source = TO_LIST(source) + pidl_src = [x.relpath_gen(bld.path) for x in + bld.srcnode.ant_glob('pidl/**/*', flat=False)] + source.extend(pidl_src) # the cd .. is needed because pidl currently is sensitive to the directory it is run in t = bld(rule='cd .. && ${PIDL} ${OPTIONS} --outputdir ${OUTPUTDIR} -- ${SRC[0].abspath(env)}', @@ -54,8 +58,7 @@ def SAMBA_PIDL(bld, pname, source, options='', output_dir='.'): t.env.PIDL = "../pidl/pidl" t.env.OPTIONS = TO_LIST(options) - t.env.OUTPUTDIR = 'bin/' + bld.BUILD_PATH(output_dir) - + t.env.OUTPUTDIR = bld.bldnode.name + '/' + bld.path.find_dir(output_dir).bldpath(t.env) if table_header_idx is not None: pidl_headers = LOCAL_CACHE(bld, 'PIDL_HEADERS') diff --git a/buildtools/wafsamba/samba_python.py b/buildtools/wafsamba/samba_python.py index 0845a7e61c..4073dcf9bb 100644 --- a/buildtools/wafsamba/samba_python.py +++ b/buildtools/wafsamba/samba_python.py @@ -1,7 +1,6 @@ # waf build tool for building IDL files with pidl -from TaskGen import taskgen, before -import Build, os, string, Utils +import Build from samba_utils import * from samba_autoconf import * @@ -18,6 +17,25 @@ def SAMBA_PYTHON(bld, name, enabled=True): '''build a python extension for Samba''' + # when we support static python modules we'll need to gather + # the list from all the SAMBA_PYTHON() targets + if init_function_sentinal is not None: + cflags += '-DSTATIC_LIBPYTHON_MODULES="%s"' % init_function_sentinal + + if realname is None: + # a SAMBA_PYTHON target without a realname is just a + # subsystem with needs_python=True + return bld.SAMBA_SUBSYSTEM(name, + source=source, + deps=deps, + public_deps=public_deps, + cflags=cflags, + includes=includes, + init_function_sentinal=init_function_sentinal, + local_include=local_include, + needs_python=True, + enabled=enabled) + if not enabled: SET_TARGET_TYPE(bld, name, 'DISABLED') return @@ -27,18 +45,19 @@ def SAMBA_PYTHON(bld, name, deps += ' ' + public_deps - # when we support static python modules we'll need to gather - # the list from all the SAMBA_PYTHON() targets - if init_function_sentinal is not None: - cflags += '-DSTATIC_LIBPYTHON_MODULES="%s"' % init_function_sentinal + if realname is None: + link_name = 'python/%s.so' % name + else: + link_name = 'python/%s' % realname t = bld( - features = 'cc cshlib pyext', + features = 'cc cshlib pyext symlink_lib', source = source, target = name, - ccflags = CURRENT_CFLAGS(bld, name, cflags), + samba_cflags = CURRENT_CFLAGS(bld, name, cflags), samba_includes = includes, local_include = local_include, - samba_deps = TO_LIST(deps) + samba_deps = TO_LIST(deps), + link_name = link_name ) Build.BuildContext.SAMBA_PYTHON = SAMBA_PYTHON diff --git a/buildtools/wafsamba/samba_utils.py b/buildtools/wafsamba/samba_utils.py index 5db9f2542a..d01edcf3b4 100644 --- a/buildtools/wafsamba/samba_utils.py +++ b/buildtools/wafsamba/samba_utils.py @@ -1,11 +1,10 @@ # a waf tool to add autoconf-like macros to the configure section # and for SAMBA_ macros for building libraries, binaries etc -import Build, os, Logs, sys, Configure, Options, string, Task, Utils, optparse +import Build, os, sys, Options, Utils from TaskGen import feature, before from Configure import conf from Logs import debug -from TaskGen import extension import shlex # TODO: make this a --option @@ -102,7 +101,7 @@ Build.BuildContext.ASSERT = ASSERT def SUBDIR(bld, subdir, list): ret = '' for l in TO_LIST(list): - ret = ret + subdir + '/' + l + ' ' + ret = ret + os.path.normpath(os.path.join(subdir, l)) + ' ' return ret Build.BuildContext.SUBDIR = SUBDIR @@ -189,16 +188,22 @@ def ENABLE_MAGIC_ORDERING(bld): Build.BuildContext.ENABLE_MAGIC_ORDERING = ENABLE_MAGIC_ORDERING -def BUILD_PATH(bld, relpath): - '''return a relative build path, given a relative path - for example, if called in the source4/librpc directory, with the path - gen_ndr/tables.c, then it will return default/source4/gen_ndr/tables.c - ''' +os_path_relpath = getattr(os.path, 'relpath', None) +if os_path_relpath is None: + # Python < 2.6 does not have os.path.relpath, provide a replacement + # (imported from Python2.6.5~rc2) + def os_path_relpath(path, start): + """Return a relative version of a path""" + start_list = os.path.abspath(start).split("/") + path_list = os.path.abspath(path).split("/") - ret = os.path.normpath(os.path.join(os.path.relpath(bld.curdir, bld.env.TOPDIR), relpath)) - ret = 'default/%s' % ret - return ret -Build.BuildContext.BUILD_PATH = BUILD_PATH + # Work out how much of the filepath is shared by start and path. + i = len(os.path.commonprefix([start_list, path_list])) + + rel_list = ['..'] * (len(start_list)-i) + path_list[i:] + if not rel_list: + return start + return os.path.join(*rel_list) # this is a useful way of debugging some of the rules in waf @@ -276,3 +281,24 @@ Build.BuildContext.ENFORCE_GROUP_ORDERING = ENFORCE_GROUP_ORDERING # raise Utils.WafError('object %r was not found in uselib_local (required by add_objects %r)' % (x, self.name)) # y.post() # self.env.append_unique('INC_PATHS', y.env.INC_PATHS) + + +def recursive_dirlist(dir, relbase): + '''recursive directory list''' + ret = [] + for f in os.listdir(dir): + f2 = dir + '/' + f + if os.path.isdir(f2): + ret.extend(recursive_dirlist(f2, relbase)) + else: + ret.append(os_path_relpath(f2, relbase)) + return ret + + +def mkdir_p(dir): + '''like mkdir -p''' + if os.path.isdir(dir): + return + mkdir_p(os.path.dirname(dir)) + os.mkdir(dir) + diff --git a/buildtools/wafsamba/wafsamba.py b/buildtools/wafsamba/wafsamba.py index e90bd35ef4..5b63c1eef9 100644 --- a/buildtools/wafsamba/wafsamba.py +++ b/buildtools/wafsamba/wafsamba.py @@ -1,16 +1,16 @@ # a waf tool to add autoconf-like macros to the configure section # and for SAMBA_ macros for building libraries, binaries etc -import Build, os, Logs, sys, Configure, Options, string, Task, Utils, optparse +import Build, os, Options, Task, Utils from Configure import conf from Logs import debug -from TaskGen import extension # bring in the other samba modules from samba_utils import * from samba_autoconf import * from samba_patterns import * from samba_pidl import * +from samba_errtable import * from samba_asn1 import * from samba_autoproto import * from samba_python import * @@ -19,25 +19,26 @@ from samba_deps import * LIB_PATH="shared" + ################################################################# # create the samba build environment @conf def SAMBA_BUILD_ENV(conf): - libpath="%s/%s" % (conf.blddir, LIB_PATH) conf.env['BUILD_DIRECTORY'] = conf.blddir - if not os.path.exists(libpath): - os.mkdir(libpath) + mkdir_p(os.path.join(conf.blddir, LIB_PATH)) + mkdir_p(os.path.join(conf.blddir, 'python/samba/dcerpc')) + ################################################################ # add an init_function to the list for a subsystem -def ADD_INIT_FUNCTION(bld, subsystem, init_function): +def ADD_INIT_FUNCTION(bld, subsystem, target, init_function): if init_function is None: return bld.ASSERT(subsystem is not None, "You must specify a subsystem for init_function '%s'" % init_function) cache = LOCAL_CACHE(bld, 'INIT_FUNCTIONS') if not subsystem in cache: cache[subsystem] = [] - cache[subsystem].append(init_function) + cache[subsystem].append( { 'TARGET':target, 'INIT_FUNCTION':init_function } ) Build.BuildContext.ADD_INIT_FUNCTION = ADD_INIT_FUNCTION @@ -50,7 +51,7 @@ def SAMBA_LIBRARY(bld, libname, source, public_headers=None, vnum=None, cflags='', - output_type=None, + external_library=False, realname=None, autoproto=None, group='main', @@ -73,7 +74,7 @@ def SAMBA_LIBRARY(bld, libname, source, features = 'cc cshlib symlink_lib', source = source, target = libname, - ccflags = CURRENT_CFLAGS(bld, libname, cflags), + samba_cflags = CURRENT_CFLAGS(bld, libname, cflags), depends_on = depends_on, samba_deps = TO_LIST(deps), samba_includes = includes, @@ -98,10 +99,10 @@ def SAMBA_BINARY(bld, binname, source, autoproto=None, use_hostcc=None, compiler=None, - group='main', + group='binaries', manpages=None, local_include=True, - subsystem=None, + subsystem_name=None, needs_python=False): if not SET_TARGET_TYPE(bld, binname, 'BINARY'): @@ -116,38 +117,26 @@ def SAMBA_BINARY(bld, binname, source, features = features, source = source, target = binname, - ccflags = CURRENT_CFLAGS(bld, binname, cflags), + samba_cflags = CURRENT_CFLAGS(bld, binname, cflags), samba_deps = TO_LIST(deps), samba_includes = includes, local_include = local_include, samba_modules = modules, top = True, - samba_subsystem= subsystem + samba_subsystem= subsystem_name ) + # setup the subsystem_name as an alias for the real + # binary name, so it can be found when expanding + # subsystem dependencies + if subsystem_name is not None: + bld.TARGET_ALIAS(subsystem_name, binname) + if autoproto is not None: bld.SAMBA_AUTOPROTO(autoproto, source) Build.BuildContext.SAMBA_BINARY = SAMBA_BINARY -################################################################# -# define a Samba ET target -def SAMBA_ERRTABLE(bld, name, source, - options='', - directory=''): -# print "Skipping ERRTABLE rule for %s with source=%s" % (name, source) -# return - if not SET_TARGET_TYPE(bld, name, 'ET'): - return - bld.SET_BUILD_GROUP('build_source') - bld( - features = 'cc', - source = source, - target = name, - includes = '# #source4/heimdal_build #source4 #lib/replace' - ) -Build.BuildContext.SAMBA_ERRTABLE = SAMBA_ERRTABLE - ################################################################# # define a Samba module. def SAMBA_MODULE(bld, modname, source, @@ -159,12 +148,12 @@ def SAMBA_MODULE(bld, modname, source, autoproto_extra_source='', aliases=None, cflags='', - output_type=None, + internal_module=True, local_include=True, enabled=True): - if output_type == 'MERGED_OBJ': - # treat merged object modules as subsystems for now + if internal_module: + # treat internal modules as subsystems for now SAMBA_SUBSYSTEM(bld, modname, source, deps=deps, includes=includes, @@ -177,7 +166,8 @@ def SAMBA_MODULE(bld, modname, source, # add it to the init_function list # TODO: we should also create an implicit dependency # between the subsystem target and this target - bld.ADD_INIT_FUNCTION(subsystem, init_function) + if enabled: + bld.ADD_INIT_FUNCTION(subsystem, modname, init_function) return if not enabled: @@ -193,7 +183,7 @@ def SAMBA_MODULE(bld, modname, source, return - bld.ADD_INIT_FUNCTION(subsystem, init_function) + bld.ADD_INIT_FUNCTION(subsystem, modname, init_function) if subsystem is not None: deps += ' ' + subsystem @@ -203,7 +193,7 @@ def SAMBA_MODULE(bld, modname, source, features = 'cc', source = source, target = modname, - ccflags = CURRENT_CFLAGS(bld, modname, cflags), + samba_cflags = CURRENT_CFLAGS(bld, modname, cflags), samba_includes = includes, local_include = local_include, samba_deps = TO_LIST(deps) @@ -234,18 +224,14 @@ def SAMBA_SUBSYSTEM(bld, modname, source, depends_on='', local_include=True, local_include_first=True, - enabled=True): + subsystem_name=None, + enabled=True, + needs_python=False): if not enabled: SET_TARGET_TYPE(bld, modname, 'DISABLED') return - # if the caller specifies a config_option, then we create a blank - # subsystem if that configuration option was found at configure time - if (config_option is not None) and bld.CONFIG_SET(config_option): - SET_TARGET_TYPE(bld, modname, 'EMPTY') - return - # remember empty subsystems, so we can strip the dependencies if (source == '') or (source == []): SET_TARGET_TYPE(bld, modname, 'EMPTY') @@ -258,16 +244,21 @@ def SAMBA_SUBSYSTEM(bld, modname, source, bld.SET_BUILD_GROUP(group) + features = 'cc' + if needs_python: + features += ' pyext' + t = bld( - features = 'cc', + features = features, source = source, target = modname, - ccflags = CURRENT_CFLAGS(bld, modname, cflags), + samba_cflags = CURRENT_CFLAGS(bld, modname, cflags), depends_on = depends_on, samba_deps = TO_LIST(deps), samba_includes = includes, local_include = local_include, - local_include_first = local_include_first + local_include_first = local_include_first, + samba_subsystem= subsystem_name ) if heimdal_autoproto is not None: @@ -334,6 +325,7 @@ def SETUP_BUILD_GROUPS(bld): bld.add_group('build_source') bld.add_group('prototypes') bld.add_group('main') + bld.add_group('binaries') bld.add_group('final') Build.BuildContext.SETUP_BUILD_GROUPS = SETUP_BUILD_GROUPS @@ -360,3 +352,91 @@ def h_file(filename): @conf def ENABLE_TIMESTAMP_DEPENDENCIES(conf): Utils.h_file = h_file + + +############################## +# handle the creation of links for libraries and binaries +# note that we use a relative symlink path to allow the whole tree +# to me moved/copied elsewhere without breaking the links +t = Task.simple_task_type('symlink_lib', 'ln -sf ${LINK_SOURCE} ${LINK_TARGET}', + color='PINK', ext_in='.bin') +t.quiet = True + +@feature('symlink_lib') +@after('apply_link') +def symlink_lib(self): + tsk = self.create_task('symlink_lib', self.link_task.outputs[0]) + + # calculat the link target and put it in the environment + soext="" + vnum = getattr(self, 'vnum', None) + if vnum is not None: + soext = '.' + vnum.split('.')[0] + + link_target = getattr(self, 'link_name', '') + if link_target == '': + link_target = '%s/lib%s.so%s' % (LIB_PATH, self.sname, soext) + + + link_source = os_path_relpath(self.link_task.outputs[0].abspath(self.env), + os.path.join(self.env.BUILD_DIRECTORY, link_target)) + + tsk.env.LINK_TARGET = link_target + tsk.env.LINK_SOURCE = link_source[3:] + debug('task_gen: LINK for %s is %s -> %s', + self.name, tsk.env.LINK_SOURCE, tsk.env.LINK_TARGET) + +# for binaries we need to copy the executable to avoid the rpath changing +# in the local bin/ directory on install +t = Task.simple_task_type('copy_bin', 'rm -f ${BIN_TARGET} && cp ${SRC} ${BIN_TARGET}', color='PINK', + ext_in='.bin', shell=True) +t.quiet = True + +@feature('copy_bin') +@after('apply_link') +def copy_bin(self): + if Options.is_install: + # we don't want to copy the install binary, as + # that has the install rpath, not the build rpath + # The rpath of the binaries in bin/default/foo/blah is different + # during the install phase, as distros insist on not using rpath in installed binaries + return + tsk = self.create_task('copy_bin', self.link_task.outputs[0]) + + tsk.env.BIN_TARGET = self.target + debug('task_gen: BIN_TARGET for %s is %s', self.name, tsk.env.BIN_TARGET) + + + + +t = Task.simple_task_type('copy_script', 'ln -sf ${SRC[0].abspath(env)} ${LINK_TARGET}', + color='PINK', ext_in='.bin', shell=True) +t.quiet = True + +@feature('copy_script') +@before('apply_link') +def copy_script(self): + tsk = self.create_task('copy_script', self.allnodes[0]) + tsk.env.TARGET = self.target + +def SAMBA_SCRIPT(bld, name, pattern, installdir, installname=None): + '''used to copy scripts from the source tree into the build directory + for use by selftest''' + + source = bld.path.ant_glob(pattern) + + bld.SET_BUILD_GROUP('build_source') + for s in TO_LIST(source): + iname = s + if installname != None: + iname = installname + target = os.path.join(installdir, iname) + tgtdir = os.path.dirname(os.path.join(bld.srcnode.abspath(bld.env), '..', target)) + mkdir_p(tgtdir) + t = bld(features='copy_script', + source=s, + target = target, + always=True) + t.env.LINK_TARGET = target + +Build.BuildContext.SAMBA_SCRIPT = SAMBA_SCRIPT diff --git a/lib/replace/wscript b/lib/replace/wscript index e3f7075897..ab7ef9783d 100644 --- a/lib/replace/wscript +++ b/lib/replace/wscript @@ -28,7 +28,7 @@ def set_options(opt): action="store_true", dest='developer', default=False) opt.add_option('--timestamp-dependencies', help=("use file timestamps instead of content for build dependencies (BROKEN)"), - action="store", dest='timestamp_dependencies', default=False) + action="store_true", dest='timestamp_dependencies', default=False) @wafsamba.runonce def configure(conf): @@ -43,7 +43,7 @@ def configure(conf): conf.check_tool('compiler_cc') # gccdeps can be useful for debugging recursion in #include lines - # conf.check_tool('gccdeps', tooldir=conf.srcdir + "/buildtools/wafsamba") + conf.check_tool('gccdeps', tooldir=conf.srcdir + "/buildtools/wafsamba") # make the install paths available in environment conf.env.LIBDIR = Options.options.LIBDIR @@ -52,6 +52,9 @@ def configure(conf): conf.env.RPATH_ON_INSTALL = Options.options.enable_rpath + # we should use the PIC options in waf instead + conf.ADD_CFLAGS('-fPIC') + # check for pkgconfig conf.check_cfg(atleast_pkgconfig_version='0.0.0') @@ -163,6 +166,7 @@ def configure(conf): conf.CHECK_FUNCS_IN('poptGetContext', 'popt') conf.CHECK_FUNCS_IN('res_search', 'resolv') conf.CHECK_FUNCS_IN('gettext', 'intl') + conf.CHECK_FUNCS_IN('pthread_create', 'pthread') conf.CHECK_FUNCS_IN('crypt', 'crypt', checklibc=True) @@ -269,8 +273,6 @@ def configure(conf): cflags=conf.env.VISIBILITY_CFLAGS, define='HAVE_VISIBILITY_ATTR') - # use this later -> conf.recurse('.', name='getpass') - if conf.CHECK_FUNCS('getpass getpassphrase'): # if we have both, then we prefer getpassphrase conf.DEFINE(REPLACE_GETPASS_BY_GETPASSPHRASE, 1) @@ -294,7 +296,8 @@ def build(bld): bld.SAMBA_LIBRARY('replace', source=REPLACE_SOURCE, - group='base_libraries') + group='base_libraries', + deps='LIBREPLACE_GETPASS') TEST_SOURCES = '''test/testsuite.c test/main.c test/strptime.c test/os2_delete.c test/getifaddrs.c''' @@ -317,3 +320,8 @@ def build(bld): if not 'HAVE_CRYPT' in bld.env: CRYPT_SOURCES.append('crypt.c') bld.SAMBA_SUBSYSTEM('LIBREPLACE_EXT', CRYPT_SOURCES) + + bld.SAMBA_SUBSYSTEM('LIBREPLACE_GETPASS', 'getpass.c', + enabled=bld.CONFIG_SET('REPLACE_GETPASS')) + + bld.CHECK_PROJECT_RULES() diff --git a/lib/subunit/python/wscript_build b/lib/subunit/python/wscript_build new file mode 100644 index 0000000000..f690ae30d5 --- /dev/null +++ b/lib/subunit/python/wscript_build @@ -0,0 +1,16 @@ + +# install out various python scripts for use by make test + +bld.SAMBA_SCRIPT('python_iso8601', + pattern='iso8601/**/*.py', + installdir='python') + + +bld.SAMBA_SCRIPT('python_subunit', + pattern='subunit/**/*.py', + installdir='python') + + +bld.SAMBA_SCRIPT('python_testtools', + pattern='testtools/**/*.py', + installdir='python') diff --git a/libcli/nbt/wscript_build b/libcli/nbt/wscript_build index 3055e19a60..979ef53f30 100644 --- a/libcli/nbt/wscript_build +++ b/libcli/nbt/wscript_build @@ -9,7 +9,7 @@ bld.SAMBA_SUBSYSTEM('NDR_NBT_BUF', bld.SAMBA_SUBSYSTEM('LIBCLI_NBT', - source='lmhosts.c nbtsocket.c namequery.c nameregister.c namerefresh.c namerelease.c', + source='lmhosts.c nbtsocket.c namequery.c nameregister.c namerefresh.c namerelease.c dns_hosts_file.c', public_deps='LIBNDR NDR_NBT LIBCLI_COMPOSITE LIBEVENTS NDR_SECURITY samba_socket LIBSAMBA-UTIL' ) diff --git a/libcli/security/wscript_build b/libcli/security/wscript_build index bb3a2d4e92..5bf24e4786 100644 --- a/libcli/security/wscript_build +++ b/libcli/security/wscript_build @@ -3,7 +3,7 @@ bld.SAMBA_SUBSYSTEM('LIBSECURITY_COMMON', - source='dom_sid.c display_sec.c secace.c secacl.c security_descriptor.c', + source='dom_sid.c display_sec.c secace.c secacl.c security_descriptor.c sddl.c', deps='talloc' ) diff --git a/nsswitch/wscript_build b/nsswitch/wscript_build index baa3411aef..0af59358cd 100644 --- a/nsswitch/wscript_build +++ b/nsswitch/wscript_build @@ -3,8 +3,9 @@ bld.SAMBA_SUBSYSTEM('LIBWINBIND-CLIENT', - source='wb_common.c' - ) + source='wb_common.c', + cflags='-DSOCKET_WRAPPER_DISABLE=1' + ) bld.SAMBA_BINARY('nsstest', diff --git a/source4/Makefile.waf b/source4/Makefile.waf new file mode 100644 index 0000000000..50a55ab84f --- /dev/null +++ b/source4/Makefile.waf @@ -0,0 +1,20 @@ +# very crude Makefile to run waf +WAF=WAFCACHE=$(HOME)/.wafcache ../buildtools/waf + +all: + $(WAF) build -v + +install: + $(WAF) install + +uninstall: + $(WAF) uninstall + +clean: + $(WAF) clean + +distclean: + rm -rf bin + +*: + echo "target not implemented" diff --git a/source4/auth/gensec/wscript_build b/source4/auth/gensec/wscript_build index a504e38689..444608d644 100644 --- a/source4/auth/gensec/wscript_build +++ b/source4/auth/gensec/wscript_build @@ -1,7 +1,3 @@ -# AUTOGENERATED by mktowscript.pl from ../../source4/auth/gensec/config.mk -# Please remove this notice if hand editing - - bld.SAMBA_LIBRARY('gensec', source='gensec.c socket.c', # PC_FILES='gensec.pc', @@ -49,7 +45,7 @@ bld.SAMBA_MODULE('gensec_schannel', source='schannel.c ../../../libcli/auth/schannel_sign.c', subsystem='gensec', deps='COMMON_SCHANNELDB NDR_SCHANNEL CREDENTIALS LIBNDR auth_session', - output_type='MERGED_OBJ', + internal_module=True, autoproto='schannel_proto.h', init_function='gensec_schannel_init' ) diff --git a/source4/auth/ntlm/wscript_build b/source4/auth/ntlm/wscript_build index 2632e25a8f..dde33c6077 100644 --- a/source4/auth/ntlm/wscript_build +++ b/source4/auth/ntlm/wscript_build @@ -1,7 +1,3 @@ -# AUTOGENERATED by mktowscript.pl from ../../source4/auth/ntlm/config.mk -# Please remove this notice if hand editing - - bld.SAMBA_MODULE('auth_sam_module', source='auth_sam.c', subsystem='auth', @@ -59,6 +55,6 @@ bld.SAMBA_MODULE('auth', subsystem='service', init_function='server_service_auth_init', deps='LIBSAMBA-UTIL LIBSECURITY SAMDB CREDENTIALS UTIL_TEVENT', - output_type='MERGED_OBJ' + internal_module=True ) diff --git a/source4/auth/ntlmssp/wscript_build b/source4/auth/ntlmssp/wscript_build index 625762029d..3fbf254515 100644 --- a/source4/auth/ntlmssp/wscript_build +++ b/source4/auth/ntlmssp/wscript_build @@ -8,6 +8,6 @@ bld.SAMBA_MODULE('gensec_ntlmssp', subsystem='gensec', init_function='gensec_ntlmssp_init', deps='MSRPC_PARSE CREDENTIALS', - output_type='MERGED_OBJ' + internal_module=True ) diff --git a/source4/auth/wscript_build b/source4/auth/wscript_build index 5985551511..ddfb046bad 100644 --- a/source4/auth/wscript_build +++ b/source4/auth/wscript_build @@ -33,7 +33,7 @@ bld.SAMBA_SUBSYSTEM('auth_system_session', bld.SAMBA_SUBSYSTEM('auth_sam', source='sam.c', autoproto='auth_sam.h', - public_deps='SAMDB UTIL_LDB LIBSECURITY', + public_deps='SAMDB UTIL_LDB LIBSECURITY ldb', deps='' ) diff --git a/source4/autogen-waf.sh b/source4/autogen-waf.sh new file mode 100755 index 0000000000..f168e69676 --- /dev/null +++ b/source4/autogen-waf.sh @@ -0,0 +1,10 @@ +#!/bin/sh + +echo "Setting up for waf build" +rm -f configure Makefile +cp configure.waf configure + +# this relies on the fact that make looks for 'makefile' before 'Makefile' +cp Makefile.waf makefile + +echo "done ... now run ./configure or ./configure.developer" diff --git a/source4/client/wscript_build b/source4/client/wscript_build index 12b609b82e..6f5df10b58 100644 --- a/source4/client/wscript_build +++ b/source4/client/wscript_build @@ -1,7 +1,3 @@ -# AUTOGENERATED by mktowscript.pl from ../../source4/client/config.mk -# Please remove this notice if hand editing - - bld.SAMBA_BINARY('smbclient', source='client.c', installdir='BINDIR', diff --git a/source4/configure.waf b/source4/configure.waf new file mode 100755 index 0000000000..cf45177c20 --- /dev/null +++ b/source4/configure.waf @@ -0,0 +1,9 @@ +#!/bin/bash + +echo "Using waf based build" + +WAF=../buildtools/waf +export WAFCACHE=$HOME/.wafcache +mkdir -p $WAFCACHE + +$WAF configure $* diff --git a/source4/dsdb/samdb/ldb_modules/wscript_build b/source4/dsdb/samdb/ldb_modules/wscript_build index 7a01ecec9b..76503ef82b 100644 --- a/source4/dsdb/samdb/ldb_modules/wscript_build +++ b/source4/dsdb/samdb/ldb_modules/wscript_build @@ -1,7 +1,3 @@ -# AUTOGENERATED by mktowscript.pl from ../../source4/dsdb/samdb/ldb_modules/config.mk -# Please remove this notice if hand editing - - bld.SAMBA_SUBSYSTEM('DSDB_MODULE_HELPERS', source='util.c ridalloc.c', autoproto='util_proto.h', @@ -11,7 +7,7 @@ bld.SAMBA_SUBSYSTEM('DSDB_MODULE_HELPERS', bld.SAMBA_MODULE('ldb_samba_dsdb', source='samba_dsdb.c', - subsystem='ldb', + subsystem='LIBLDB', init_function='LDB_MODULE(samba_dsdb)', deps='SAMDB talloc LIBEVENTS LIBNDR DSDB_MODULE_HELPERS' ) @@ -19,7 +15,7 @@ bld.SAMBA_MODULE('ldb_samba_dsdb', bld.SAMBA_MODULE('ldb_samba_secrets', source='samba_secrets.c', - subsystem='ldb', + subsystem='LIBLDB', init_function='LDB_MODULE(samba_secrets)', deps='SAMDB talloc LIBEVENTS LIBNDR' ) @@ -27,7 +23,7 @@ bld.SAMBA_MODULE('ldb_samba_secrets', bld.SAMBA_MODULE('ldb_objectguid', source='objectguid.c', - subsystem='ldb', + subsystem='LIBLDB', init_function='LDB_MODULE(objectguid)', deps='SAMDB talloc LIBEVENTS LIBNDR' ) @@ -35,7 +31,7 @@ bld.SAMBA_MODULE('ldb_objectguid', bld.SAMBA_MODULE('ldb_repl_meta_data', source='repl_meta_data.c', - subsystem='ldb', + subsystem='LIBLDB', init_function='LDB_MODULE(repl_meta_data)', deps='SAMDB talloc LIBEVENTS LIBNDR NDR_DRSUAPI NDR_DRSBLOBS LIBNDR DSDB_MODULE_HELPERS' ) @@ -43,7 +39,7 @@ bld.SAMBA_MODULE('ldb_repl_meta_data', bld.SAMBA_MODULE('ldb_dsdb_cache', source='dsdb_cache.c', - subsystem='ldb', + subsystem='LIBLDB', init_function='LDB_MODULE(dsdb_cache)', deps='SAMDB talloc LIBEVENTS' ) @@ -51,7 +47,7 @@ bld.SAMBA_MODULE('ldb_dsdb_cache', bld.SAMBA_MODULE('ldb_schema_load', source='schema_load.c', - subsystem='ldb', + subsystem='LIBLDB', init_function='LDB_MODULE(schema_load)', deps='SAMDB talloc LIBEVENTS DSDB_MODULE_HELPERS' ) @@ -59,7 +55,7 @@ bld.SAMBA_MODULE('ldb_schema_load', bld.SAMBA_MODULE('ldb_schema_data', source='schema_data.c', - subsystem='ldb', + subsystem='LIBLDB', init_function='LDB_MODULE(schema_data)', deps='SAMDB talloc LIBEVENTS DSDB_MODULE_HELPERS' ) @@ -67,7 +63,7 @@ bld.SAMBA_MODULE('ldb_schema_data', bld.SAMBA_MODULE('ldb_naming_fsmo', source='naming_fsmo.c', - subsystem='ldb', + subsystem='LIBLDB', init_function='LDB_MODULE(naming_fsmo)', deps='SAMDB talloc LIBEVENTS DSDB_MODULE_HELPERS' ) @@ -75,7 +71,7 @@ bld.SAMBA_MODULE('ldb_naming_fsmo', bld.SAMBA_MODULE('ldb_pdc_fsmo', source='pdc_fsmo.c', - subsystem='ldb', + subsystem='LIBLDB', init_function='LDB_MODULE(pdc_fsmo)', deps='SAMDB talloc LIBEVENTS DSDB_MODULE_HELPERS' ) @@ -83,7 +79,7 @@ bld.SAMBA_MODULE('ldb_pdc_fsmo', bld.SAMBA_MODULE('ldb_samldb', source='samldb.c', - subsystem='ldb', + subsystem='LIBLDB', init_function='LDB_MODULE(samldb)', deps='talloc LIBEVENTS SAMDB DSDB_MODULE_HELPERS' ) @@ -91,7 +87,7 @@ bld.SAMBA_MODULE('ldb_samldb', bld.SAMBA_MODULE('ldb_samba3sam', source='samba3sam.c', - subsystem='ldb', + subsystem='LIBLDB', init_function='LDB_MODULE(samba3sam)', deps='talloc LIBEVENTS ldb SMBPASSWD NSS_WRAPPER LIBSECURITY NDR_SECURITY' ) @@ -99,7 +95,7 @@ bld.SAMBA_MODULE('ldb_samba3sam', bld.SAMBA_MODULE('ldb_samba3sid', source='samba3sid.c', - subsystem='ldb', + subsystem='LIBLDB', init_function='LDB_MODULE(samba3sid)', deps='talloc LIBEVENTS ldb SMBPASSWD NSS_WRAPPER LIBSECURITY NDR_SECURITY' ) @@ -108,7 +104,7 @@ bld.SAMBA_MODULE('ldb_samba3sid', bld.SAMBA_MODULE('ldb_simple_ldap_map', source='simple_ldap_map.c', aliases='entryuuid nsuniqueid', - subsystem='ldb', + subsystem='LIBLDB', init_function='LDB_MODULE(entryuuid),LDB_MODULE(nsuniqueid)', deps='talloc LIBEVENTS ldb LIBNDR' ) @@ -116,7 +112,7 @@ bld.SAMBA_MODULE('ldb_simple_ldap_map', bld.SAMBA_MODULE('ldb_rootdse', source='rootdse.c', - subsystem='ldb', + subsystem='LIBLDB', init_function='LDB_MODULE(rootdse)', deps='talloc LIBEVENTS SAMDB' ) @@ -124,7 +120,7 @@ bld.SAMBA_MODULE('ldb_rootdse', bld.SAMBA_MODULE('ldb_password_hash', source='password_hash.c', - subsystem='ldb', + subsystem='LIBLDB', init_function='LDB_MODULE(password_hash)', deps='talloc LIBEVENTS SAMDB LIBCLI_AUTH NDR_DRSBLOBS KERBEROS HEIMDAL_HDB_KEYS HEIMDAL_KRB5' ) @@ -132,7 +128,7 @@ bld.SAMBA_MODULE('ldb_password_hash', bld.SAMBA_MODULE('ldb_local_password', source='local_password.c', - subsystem='ldb', + subsystem='LIBLDB', init_function='LDB_MODULE(local_password)', deps='talloc LIBEVENTS LIBNDR SAMDB' ) @@ -140,7 +136,7 @@ bld.SAMBA_MODULE('ldb_local_password', bld.SAMBA_MODULE('ldb_kludge_acl', source='kludge_acl.c', - subsystem='ldb', + subsystem='LIBLDB', init_function='LDB_MODULE(kludge_acl)', deps='talloc LIBEVENTS LIBSECURITY SAMDB' ) @@ -148,7 +144,7 @@ bld.SAMBA_MODULE('ldb_kludge_acl', bld.SAMBA_MODULE('ldb_extended_dn_in', source='extended_dn_in.c', - subsystem='ldb', + subsystem='LIBLDB', init_function='LDB_MODULE(extended_dn_in)', deps='talloc LIBEVENTS LIBSAMBA-UTIL' ) @@ -157,7 +153,7 @@ bld.SAMBA_MODULE('ldb_extended_dn_in', bld.SAMBA_MODULE('ldb_extended_dn_out', source='extended_dn_out.c', aliases='extended_dn_out_ldb extended_dn_out_openldap extended_dn_out_fds', - subsystem='ldb', + subsystem='LIBLDB', deps='talloc LIBEVENTS LIBNDR LIBSAMBA-UTIL SAMDB', init_function='LDB_MODULE(extended_dn_out_ldb),LDB_MODULE(extended_dn_out_openldap),LDB_MODULE(extended_dn_out_fds)' ) @@ -165,7 +161,7 @@ bld.SAMBA_MODULE('ldb_extended_dn_out', bld.SAMBA_MODULE('ldb_extended_dn_store', source='extended_dn_store.c', - subsystem='ldb', + subsystem='LIBLDB', init_function='LDB_MODULE(extended_dn_store)', deps='talloc LIBEVENTS LIBSAMBA-UTIL SAMDB DSDB_MODULE_HELPERS' ) @@ -173,7 +169,7 @@ bld.SAMBA_MODULE('ldb_extended_dn_store', bld.SAMBA_MODULE('ldb_show_deleted', source='show_deleted.c', - subsystem='ldb', + subsystem='LIBLDB', init_function='LDB_MODULE(show_deleted)', deps='talloc LIBEVENTS LIBSAMBA-UTIL' ) @@ -182,7 +178,7 @@ bld.SAMBA_MODULE('ldb_show_deleted', bld.SAMBA_MODULE('ldb_partition', source='partition.c partition_init.c', autoproto='partition_proto.h', - subsystem='ldb', + subsystem='LIBLDB', init_function='LDB_MODULE(partition)', deps='talloc LIBEVENTS SAMDB DSDB_MODULE_HELPERS' ) @@ -190,7 +186,7 @@ bld.SAMBA_MODULE('ldb_partition', bld.SAMBA_MODULE('ldb_new_partition', source='new_partition.c', - subsystem='ldb', + subsystem='LIBLDB', init_function='LDB_MODULE(new_partition)', deps='talloc LIBEVENTS SAMDB DSDB_MODULE_HELPERS' ) @@ -198,15 +194,15 @@ bld.SAMBA_MODULE('ldb_new_partition', bld.SAMBA_MODULE('ldb_update_keytab', source='update_keytab.c', - subsystem='ldb', + subsystem='LIBLDB', init_function='LDB_MODULE(update_keytab)', - deps='talloc LIBEVENTS CREDENTIALS' + deps='talloc LIBEVENTS CREDENTIALS ldb' ) bld.SAMBA_MODULE('ldb_objectclass', source='objectclass.c', - subsystem='ldb', + subsystem='LIBLDB', init_function='LDB_MODULE(objectclass)', deps='talloc LIBEVENTS LIBSECURITY NDR_SECURITY SAMDB DSDB_MODULE_HELPERS LIBSAMBA-UTIL' ) @@ -214,15 +210,15 @@ bld.SAMBA_MODULE('ldb_objectclass', bld.SAMBA_MODULE('ldb_subtree_rename', source='subtree_rename.c', - subsystem='ldb', + subsystem='LIBLDB', init_function='LDB_MODULE(subtree_rename)', - deps='talloc LIBEVENTS LIBSAMBA-UTIL' + deps='talloc LIBEVENTS LIBSAMBA-UTIL ldb' ) bld.SAMBA_MODULE('ldb_subtree_delete', source='subtree_delete.c', - subsystem='ldb', + subsystem='LIBLDB', init_function='LDB_MODULE(subtree_delete)', deps='talloc LIBEVENTS LIBSAMBA-UTIL DSDB_MODULE_HELPERS' ) @@ -230,7 +226,7 @@ bld.SAMBA_MODULE('ldb_subtree_delete', bld.SAMBA_MODULE('ldb_linked_attributes', source='linked_attributes.c', - subsystem='ldb', + subsystem='LIBLDB', init_function='LDB_MODULE(linked_attributes)', deps='talloc LIBEVENTS SAMDB DSDB_MODULE_HELPERS' ) @@ -238,15 +234,15 @@ bld.SAMBA_MODULE('ldb_linked_attributes', bld.SAMBA_MODULE('ldb_ranged_results', source='ranged_results.c', - subsystem='ldb', + subsystem='LIBLDB', init_function='LDB_MODULE(ranged_results)', - deps='talloc LIBEVENTS LIBSAMBA-UTIL' + deps='talloc LIBEVENTS LIBSAMBA-UTIL ldb' ) bld.SAMBA_MODULE('ldb_anr', source='anr.c', - subsystem='ldb', + subsystem='LIBLDB', init_function='LDB_MODULE(anr)', deps='talloc LIBEVENTS LIBSAMBA-UTIL SAMDB' ) @@ -254,7 +250,7 @@ bld.SAMBA_MODULE('ldb_anr', bld.SAMBA_MODULE('ldb_instancetype', source='instancetype.c', - subsystem='ldb', + subsystem='LIBLDB', init_function='LDB_MODULE(instancetype)', deps='talloc LIBEVENTS LIBSAMBA-UTIL SAMDB' ) @@ -262,15 +258,15 @@ bld.SAMBA_MODULE('ldb_instancetype', bld.SAMBA_MODULE('ldb_operational', source='operational.c', - subsystem='ldb', + subsystem='LIBLDB', init_function='LDB_MODULE(operational)', - deps='talloc tevent LIBSAMBA-UTIL SAMDB_COMMON DSDB_MODULE_HELPERS' + deps='talloc tevent LIBSAMBA-UTIL SAMDB_COMMON DSDB_MODULE_HELPERS auth_sam' ) bld.SAMBA_MODULE('ldb_descriptor', source='descriptor.c', - subsystem='ldb', + subsystem='LIBLDB', init_function='LDB_MODULE(descriptor)', deps='talloc LIBEVENTS LIBSECURITY NDR_SECURITY SAMDB DSDB_MODULE_HELPERS' ) @@ -278,7 +274,7 @@ bld.SAMBA_MODULE('ldb_descriptor', bld.SAMBA_MODULE('ldb_resolve_oids', source='resolve_oids.c', - subsystem='ldb', + subsystem='LIBLDB', init_function='LDB_MODULE(resolve_oids)', deps='SAMDB talloc LIBEVENTS LIBNDR' ) @@ -286,7 +282,7 @@ bld.SAMBA_MODULE('ldb_resolve_oids', bld.SAMBA_MODULE('ldb_acl', source='acl.c', - subsystem='ldb', + subsystem='LIBLDB', init_function='LDB_MODULE(acl)', deps='talloc LIBEVENTS LIBSECURITY SAMDB' ) @@ -294,7 +290,7 @@ bld.SAMBA_MODULE('ldb_acl', bld.SAMBA_MODULE('ldb_lazy_commit', source='lazy_commit.c', - subsystem='ldb', + subsystem='LIBLDB', init_function='LDB_MODULE(lazy_commit)', deps='SAMDB' ) @@ -302,7 +298,7 @@ bld.SAMBA_MODULE('ldb_lazy_commit', bld.SAMBA_MODULE('ldb_validate_update', source='validate_update.c', - subsystem='ldb', + subsystem='LIBLDB', init_function='LDB_MODULE(validate_update)', deps='talloc LIBEVENTS LIBSECURITY SAMDB' ) diff --git a/source4/dsdb/wscript_build b/source4/dsdb/wscript_build index 3d3a35768f..0699dfdd28 100644 --- a/source4/dsdb/wscript_build +++ b/source4/dsdb/wscript_build @@ -12,9 +12,9 @@ bld.SAMBA_SUBSYSTEM('SAMDB', bld.SAMBA_SUBSYSTEM('SAMDB_COMMON', - source='common/util.c ./samdb/ldb_modules/util.c common/dsdb_dn.c ../../libds/common/flag_mapping.c', + source='common/util.c common/dsdb_dn.c common/dsdb_access.c ../../libds/common/flag_mapping.c', autoproto='common/proto.h', - deps='ldb NDR_DRSBLOBS LIBCLI_LDAP_NDR UTIL_LDB LIBCLI_AUTH' + deps='ldb NDR_DRSBLOBS LIBCLI_LDAP_NDR UTIL_LDB LIBCLI_AUTH DSDB_MODULE_HELPERS' ) diff --git a/source4/heimdal_build/wscript_build b/source4/heimdal_build/wscript_build index 3117095824..6b0b951eba 100644 --- a/source4/heimdal_build/wscript_build +++ b/source4/heimdal_build/wscript_build @@ -126,68 +126,48 @@ bld.SAMBA_ASN1('HEIMDAL_PKCS10_ASN1', bld.SAMBA_ASN1('HEIMDAL_HDB_ASN1', '../heimdal/lib/hdb/hdb.asn1', - includes='../heimdal/lib/asn1', - directory='lib/hdb' - ) + includes='../heimdal/lib/asn1') bld.SAMBA_ERRTABLE('HEIMDAL_ASN1_ERR_ET', - '../heimdal/lib/asn1/asn1_err.et', - directory='lib/asn1' - ) + '../heimdal/lib/asn1/asn1_err.et') bld.SAMBA_ERRTABLE('HEIMDAL_HDB_ERR_ET', - '../heimdal/lib/hdb/hdb_err.et', - directory='lib/hdb' - ) + '../heimdal/lib/hdb/hdb_err.et') bld.SAMBA_ERRTABLE('HEIMDAL_HEIM_ERR_ET', - '../heimdal/lib/krb5/heim_err.et', - directory='lib/krb5' - ) + '../heimdal/lib/krb5/heim_err.et') bld.SAMBA_ERRTABLE('HEIMDAL_K524_ERR_ET', - '../heimdal/lib/krb5/k524_err.et', - directory='lib/krb5' - ) + '../heimdal/lib/krb5/k524_err.et') bld.SAMBA_ERRTABLE('HEIMDAL_KRB_ERR_ET', - '../heimdal/lib/krb5/krb_err.et', - directory='lib/krb5' - ) + '../heimdal/lib/krb5/krb_err.et') bld.SAMBA_ERRTABLE('HEIMDAL_KRB5_ERR_ET', - '../heimdal/lib/krb5/krb5_err.et', - directory='lib/krb5' - ) + '../heimdal/lib/krb5/krb5_err.et') bld.SAMBA_ERRTABLE('HEIMDAL_GKRB5_ERR_ET', - '../heimdal/lib/gssapi/krb5/gkrb5_err.et', - directory='lib/gssapi' - ) + '../heimdal/lib/gssapi/krb5/gkrb5_err.et') bld.SAMBA_ERRTABLE('HEIMDAL_HX509_ERR_ET', - '../heimdal/lib/hx509/hx509_err.et', - directory='lib/hx509' - ) + '../heimdal/lib/hx509/hx509_err.et') bld.SAMBA_ERRTABLE('HEIMDAL_WIND_ERR_ET', - '../heimdal/lib/wind/wind_err.et', - directory='lib/wind' - ) + '../heimdal/lib/wind/wind_err.et') bld.SAMBA_SUBSYSTEM('HEIMDAL_ROKEN', '../heimdal/lib/roken/base64.c ../heimdal/lib/roken/ct.c ../heimdal/lib/roken/hex.c ../heimdal/lib/roken/bswap.c ../heimdal/lib/roken/dumpdata.c ../heimdal/lib/roken/emalloc.c ../heimdal/lib/roken/ecalloc.c ../heimdal/lib/roken/getarg.c ../heimdal/lib/roken/get_window_size.c ../heimdal/lib/roken/getdtablesize.c ../heimdal/lib/roken/h_errno.c ../heimdal/lib/roken/issuid.c ../heimdal/lib/roken/net_read.c ../heimdal/lib/roken/net_write.c ../heimdal/lib/roken/socket.c ../heimdal/lib/roken/parse_time.c ../heimdal/lib/roken/parse_units.c ../heimdal/lib/roken/resolve.c ../heimdal/lib/roken/roken_gethostby.c ../heimdal/lib/roken/signal.c ../heimdal/lib/roken/vis.c ../heimdal/lib/roken/strlwr.c ../heimdal/lib/roken/strsep_copy.c ../heimdal/lib/roken/strsep.c ../heimdal/lib/roken/strupr.c ../heimdal/lib/roken/strpool.c ../heimdal/lib/roken/estrdup.c ../heimdal/lib/roken/erealloc.c ../heimdal/lib/roken/simple_exec.c ../heimdal/lib/roken/strcollect.c ../heimdal/lib/roken/rtbl.c ../heimdal/lib/roken/cloexec.c ../heimdal/lib/roken/xfree.c replace.c', includes='../heimdal/lib/roken ../heimdal/include ../../lib/socket_wrapper', - deps='HEIMDAL_ROKEN_PROGNAME HEIMDAL_ROKEN_CLOSEFROM resolv LIBREPLACE_NETWORK UID_WRAPPER' + deps='HEIMDAL_ROKEN_PROGNAME HEIMDAL_ROKEN_CLOSEFROM resolv LIBREPLACE_NETWORK UID_WRAPPER util' ) @@ -218,7 +198,7 @@ bld.SAMBA_SUBSYSTEM('HEIMDAL_HDB_KEYS', bld.SAMBA_SUBSYSTEM('HEIMDAL_HDB', source='''../heimdal/lib/hdb/db.c ../heimdal/lib/hdb/dbinfo.c ../heimdal/lib/hdb/hdb.c ../heimdal/lib/hdb/ext.c ../heimdal/lib/hdb/keytab.c ../heimdal/lib/hdb/mkey.c ../heimdal/lib/hdb/ndbm.c ../heimdal/lib/hdb/hdb_err.c hdb-glue.c''', - includes='../heimdal/lib/hdb', + includes='../heimdal/lib/hdb ../heimdal/lib/com_err', heimdal_autoproto='../heimdal/lib/hdb/hdb-protos.h', heimdal_autoproto_private='../heimdal/lib/hdb/hdb-private.h', deps='HDB_LDB HEIMDAL_KRB5 HEIMDAL_HDB_KEYS HEIMDAL_ROKEN HEIMDAL_HCRYPTO HEIMDAL_COM_ERR HEIMDAL_HDB_ASN1' @@ -272,14 +252,44 @@ bld.SAMBA_SUBSYSTEM('HEIMDAL_GSSAPI', bld.SAMBA_SUBSYSTEM('HEIMDAL_KRB5', - '../heimdal/lib/krb5/acache.c ../heimdal/lib/krb5/add_et_list.c ../heimdal/lib/krb5/addr_families.c ../heimdal/lib/krb5/appdefault.c ../heimdal/lib/krb5/asn1_glue.c ../heimdal/lib/krb5/auth_context.c ../heimdal/lib/krb5/build_ap_req.c ../heimdal/lib/krb5/build_auth.c ../heimdal/lib/krb5/cache.c ../heimdal/lib/krb5/changepw.c ../heimdal/lib/krb5/codec.c ../heimdal/lib/krb5/config_file.c ../heimdal/lib/krb5/constants.c ../heimdal/lib/krb5/context.c ../heimdal/lib/krb5/convert_creds.c ../heimdal/lib/krb5/copy_host_realm.c ../heimdal/lib/krb5/crc.c ../heimdal/lib/krb5/creds.c ../heimdal/lib/krb5/crypto.c ../heimdal/lib/krb5/data.c ../heimdal/lib/krb5/eai_to_heim_errno.c ../heimdal/lib/krb5/error_string.c ../heimdal/lib/krb5/expand_hostname.c ../heimdal/lib/krb5/fcache.c ../heimdal/lib/krb5/free.c ../heimdal/lib/krb5/free_host_realm.c ../heimdal/lib/krb5/generate_seq_number.c ../heimdal/lib/krb5/generate_subkey.c ../heimdal/lib/krb5/get_addrs.c ../heimdal/lib/krb5/get_cred.c ../heimdal/lib/krb5/get_default_principal.c ../heimdal/lib/krb5/get_default_realm.c ../heimdal/lib/krb5/get_for_creds.c ../heimdal/lib/krb5/get_host_realm.c ../heimdal/lib/krb5/get_in_tkt.c ../heimdal/lib/krb5/get_port.c ../heimdal/lib/krb5/init_creds.c ../heimdal/lib/krb5/init_creds_pw.c ../heimdal/lib/krb5/kcm.c ../heimdal/lib/krb5/keyblock.c ../heimdal/lib/krb5/keytab.c ../heimdal/lib/krb5/keytab_any.c ../heimdal/lib/krb5/keytab_file.c ../heimdal/lib/krb5/keytab_memory.c ../heimdal/lib/krb5/keytab_keyfile.c ../heimdal/lib/krb5/krbhst.c ../heimdal/lib/krb5/log.c ../heimdal/lib/krb5/mcache.c ../heimdal/lib/krb5/misc.c ../heimdal/lib/krb5/mk_error.c ../heimdal/lib/krb5/mk_priv.c ../heimdal/lib/krb5/mk_rep.c ../heimdal/lib/krb5/mk_req.c ../heimdal/lib/krb5/mk_req_ext.c ../heimdal/lib/krb5/mit_glue.c ../heimdal/lib/krb5/n-fold.c ../heimdal/lib/krb5/padata.c ../heimdal/lib/krb5/pkinit.c ../heimdal/lib/krb5/plugin.c ../heimdal/lib/krb5/principal.c ../heimdal/lib/krb5/prog_setup.c ../heimdal/lib/krb5/pac.c ../heimdal/lib/krb5/prompter_posix.c ../heimdal/lib/krb5/rd_cred.c ../heimdal/lib/krb5/rd_error.c ../heimdal/lib/krb5/rd_priv.c ../heimdal/lib/krb5/rd_rep.c ../heimdal/lib/krb5/rd_req.c ../heimdal/lib/krb5/replay.c ../heimdal/lib/krb5/send_to_kdc.c ../heimdal/lib/krb5/set_default_realm.c ../heimdal/lib/krb5/store.c ../heimdal/lib/krb5/store_emem.c ../heimdal/lib/krb5/store_fd.c ../heimdal/lib/krb5/store_mem.c ../heimdal/lib/krb5/ticket.c ../heimdal/lib/krb5/time.c ../heimdal/lib/krb5/transited.c ../heimdal/lib/krb5/v4_glue.c ../heimdal/lib/krb5/version.c ../heimdal/lib/krb5/warn.c ../heimdal/lib/krb5/krb5_err.c ../heimdal/lib/krb5/heim_err.c ../heimdal/lib/krb5/k524_err.c krb5-glue.c', - includes='../heimdal/lib/krb5 ../heimdal/lib/asn1 ../heimdal/lib/com_err', - public_deps='HEIMDAL_COM_ERR', - heimdal_autoproto='../heimdal/lib/krb5/krb5-protos.h', - heimdal_autoproto_options='-E KRB5_LIB -q -P comment -o', - heimdal_autoproto_private='../heimdal/lib/krb5/krb5-private.h', - deps='HEIMDAL_ROKEN HEIMDAL_PKINIT_ASN1 HEIMDAL_WIND HEIMDAL_KRB5_ASN1 HEIMDAL_HX509 HEIMDAL_HCRYPTO LIBNETIF LIBSAMBA-HOSTCONFIG INTL' - ) + bld.SUBDIR('../heimdal/lib/krb5/', + '''acache.c add_et_list.c + addr_families.c appdefault.c + asn1_glue.c auth_context.c + build_ap_req.c build_auth.c cache.c + changepw.c codec.c config_file.c + constants.c context.c convert_creds.c + copy_host_realm.c crc.c creds.c + crypto.c data.c eai_to_heim_errno.c + error_string.c expand_hostname.c + fcache.c free.c free_host_realm.c + generate_seq_number.c generate_subkey.c + get_addrs.c get_cred.c + get_default_principal.c + get_default_realm.c get_for_creds.c + get_host_realm.c get_in_tkt.c + get_port.c init_creds.c init_creds_pw.c + kcm.c keyblock.c keytab.c keytab_any.c + keytab_file.c keytab_memory.c + keytab_keyfile.c krbhst.c log.c + mcache.c misc.c mk_error.c mk_priv.c + mk_rep.c mk_req.c mk_req_ext.c + mit_glue.c n-fold.c padata.c pkinit.c + plugin.c principal.c prog_setup.c pac.c + prompter_posix.c rd_cred.c rd_error.c + rd_priv.c rd_rep.c rd_req.c replay.c + send_to_kdc.c set_default_realm.c + store.c store_emem.c store_fd.c + store_mem.c ticket.c time.c transited.c + v4_glue.c version.c warn.c krb5_err.c + heim_err.c k524_err.c krb_err.c''') + ' krb5-glue.c', + includes='../heimdal/lib/krb5 ../heimdal/lib/asn1 ../heimdal/lib/com_err', + public_deps='HEIMDAL_COM_ERR', + heimdal_autoproto='../heimdal/lib/krb5/krb5-protos.h', + heimdal_autoproto_options='-E KRB5_LIB -q -P comment -o', + heimdal_autoproto_private='../heimdal/lib/krb5/krb5-private.h', + deps='HEIMDAL_ROKEN HEIMDAL_PKINIT_ASN1 HEIMDAL_WIND HEIMDAL_KRB5_ASN1 HEIMDAL_HX509 HEIMDAL_HCRYPTO LIBNETIF LIBSAMBA-HOSTCONFIG INTL' + ) bld.SAMBA_SUBSYSTEM('HEIMDAL_HEIM_ASN1', @@ -320,14 +330,14 @@ bld.SAMBA_SUBSYSTEM('HEIMDAL_WIND', bld.SAMBA_SUBSYSTEM('HEIMDAL_ROKEN_PROGNAME', '../heimdal/lib/roken/getprogname.c ../heimdal/lib/roken/setprogname.c', includes='../heimdal/lib/roken', - config_option='HAVE_GETPROGNAME' + enabled=not bld.CONFIG_SET('HAVE_GETPROGNAME') ) bld.SAMBA_SUBSYSTEM('HEIMDAL_ROKEN_CLOSEFROM', '../heimdal/lib/roken/closefrom.c', includes='../heimdal/lib/roken', - config_option='HAVE_CLOSEFROM' + enabled=not bld.CONFIG_SET('HAVE_CLOSEFROM') ) @@ -335,7 +345,7 @@ bld.SAMBA_SUBSYSTEM('HEIMDAL_ROKEN_PROGNAME_H', '../heimdal/lib/roken/getprogname.c ../heimdal/lib/roken/setprogname.c', cflags='-DSOCKET_WRAPPER_DISABLE=1 -DNSS_WRAPPER_DISABLE=1', includes='../heimdal/lib/roken', - config_option='HAVE_GETPROGNAME' + enabled=not bld.CONFIG_SET('HAVE_GETPROGNAME') ) @@ -343,7 +353,7 @@ bld.SAMBA_SUBSYSTEM('HEIMDAL_ROKEN_CLOSEFROM_H', '../heimdal/lib/roken/closefrom.c', cflags='-DSOCKET_WRAPPER_DISABLE=1 -DNSS_WRAPPER_DISABLE=1', includes='../heimdal/lib/roken', - config_option='HAVE_CLOSEFROM' + enabled=not bld.CONFIG_SET('HAVE_CLOSEFROM') ) @@ -359,7 +369,7 @@ bld.SAMBA_SUBSYSTEM('HEIMDAL_COM_ERR', '../heimdal/lib/com_err/com_err.c ../heimdal/lib/com_err/error.c', includes='../heimdal/lib/com_err', deps='HEIMDAL_ROKEN', - config_option='HAVE_COM_ERR' + enabled=not bld.CONFIG_SET('HAVE_COM_ERR') ) diff --git a/source4/kdc/wscript_build b/source4/kdc/wscript_build index 27272f81a5..6e35e72262 100644 --- a/source4/kdc/wscript_build +++ b/source4/kdc/wscript_build @@ -45,9 +45,10 @@ bld.SAMBA_SUBSYSTEM('MIT_SAMBA', ) -bld.SAMBA_LIBRARY('mit_samba',source='', - deps='MIT_SAMBA', - output_type='SHARED_LIBRARY', - realname='mit_samba.so' - ) +bld.SAMBA_LIBRARY('mit_samba', + source='', + deps='MIT_SAMBA', + external_library=True, + realname='mit_samba.so' + ) diff --git a/source4/lib/ldb/wscript b/source4/lib/ldb/wscript index bc5ffdbc9e..43947b4af5 100644 --- a/source4/lib/ldb/wscript +++ b/source4/lib/ldb/wscript @@ -26,29 +26,89 @@ def build(bld): bld.BUILD_SUBDIR(LIBTDB_DIR) bld.BUILD_SUBDIR(LIBTEVENT_DIR) - LDB_TDB_SRC = bld.SUBDIR('ldb_tdb', - '''ldb_tdb.c ldb_pack.c ldb_search.c ldb_index.c - ldb_cache.c ldb_tdb_wrap.c''') + # in Samba4 we build some extra modules, and add extra + # capabilities to the ldb cmdline tools + s4_build = getattr(bld.env, '_SAMBA_BUILD_', 0) == 4 LDB_MAP_SRC = bld.SUBDIR('ldb_map', 'ldb_map.c ldb_map_inbound.c ldb_map_outbound.c') COMMON_SRC = bld.SUBDIR('common', '''ldb.c ldb_ldif.c ldb_parse.c ldb_msg.c ldb_utf8.c - ldb_debug.c ldb_modules.c ldb_dn.c ldb_match.c + ldb_debug.c ldb_dn.c ldb_match.c ldb_attributes.c attrib_handlers.c ldb_controls.c qsort.c''') - MODULES_SRC = bld.SUBDIR('modules', - 'rdn_name.c asq.c paged_results.c sort.c') + bld.SAMBA_SUBSYSTEM('LIBLDB', + includes='include', + deps='tevent', + source='common/ldb_modules.c') + + bld.SAMBA_MODULE('ldb_asq', + 'modules/asq.c', + init_function='LDB_MODULE(asq)', + subsystem='LIBLDB') + + bld.SAMBA_MODULE('ldb_server_sort', + 'modules/sort.c', + init_function='LDB_MODULE(server_sort)', + subsystem='LIBLDB') + + bld.SAMBA_MODULE('ldb_paged_results', + 'modules/paged_results.c', + init_function='LDB_MODULE(paged_results)', + subsystem='LIBLDB') + + bld.SAMBA_MODULE('ldb_paged_searches', + 'modules/paged_searches.c', + init_function='LDB_MODULE(paged_searches)', + enabled = s4_build, + subsystem='LIBLDB') + + bld.SAMBA_MODULE('ldb_rdn_name', + 'modules/rdn_name.c', + init_function='LDB_MODULE(rdn_name)', + subsystem='LIBLDB') + + bld.SAMBA_MODULE('ldb_sqlite3', + 'sqlite3/ldb_sqlite3.c', + init_function='LDB_BACKEND(sqlite3)', + enabled=False, + subsystem='LIBLDB') + + bld.SAMBA_MODULE('ldb_tdb', + bld.SUBDIR('ldb_tdb', + '''ldb_tdb.c ldb_pack.c ldb_search.c ldb_index.c + ldb_cache.c ldb_tdb_wrap.c'''), + init_function='LDB_BACKEND(tdb)', + deps='tdb', + subsystem='LIBLDB') + + bld.SAMBA_MODULE('ldb_ildap', 'ldb_ildap/ldb_ildap.c', + init_function='LDB_BACKEND(ldapi),LDB_BACKEND(ldaps),LDB_BACKEND(ldap)', + deps='talloc LIBCLI_LDAP CREDENTIALS', + enabled=s4_build, + subsystem='LIBLDB') + + ldb_deps = 'tevent LIBLDB' + if s4_build: + ldb_deps += ' LDBSAMBA POPT_CREDENTIALS POPT_SAMBA LIBCMDLINE_CREDENTIALS gensec' bld.SAMBA_LIBRARY('ldb', - LDB_TDB_SRC + ' ' + COMMON_SRC + ' ' + MODULES_SRC, - deps='tdb tevent', + COMMON_SRC + ' ' + LDB_MAP_SRC, + deps=ldb_deps, includes='include', vnum=VERSION) + bld.SAMBA_SUBSYSTEM('LIBLDB_CMDLINE', + 'tools/ldbutil.c tools/cmdline.c', + 'ldb dl popt') + LDB_TOOLS='ldbadd ldbsearch ldbdel ldbmodify ldbedit ldbrename ldbtest' for t in LDB_TOOLS.split(): - bld.SAMBA_BINARY(t, - 'tools/%s.c tools/ldbutil.c tools/cmdline.c' % t, - deps='ldb dl popt') + bld.SAMBA_BINARY(t, 'tools/%s.c' % t, deps='LIBLDB_CMDLINE') + + if s4_build: + bld.SAMBA_PYTHON('pyldb', 'pyldb.c', + deps='ldb', + realname='ldb.so') + diff --git a/source4/lib/registry/wscript_build b/source4/lib/registry/wscript_build index 72478b0d7f..cd2b508144 100644 --- a/source4/lib/registry/wscript_build +++ b/source4/lib/registry/wscript_build @@ -57,7 +57,7 @@ bld.SAMBA_BINARY('regtree', bld.SAMBA_SUBSYSTEM('torture_registry', - source='tests/generic.c hive.c tests/diff.c tests/registry.c', + source='tests/generic.c tests/hive.c tests/diff.c tests/registry.c', autoproto='tests/proto.h', deps='torture registry' ) diff --git a/source4/lib/smbreadline/wscript_build b/source4/lib/smbreadline/wscript_build new file mode 100644 index 0000000000..15a746060c --- /dev/null +++ b/source4/lib/smbreadline/wscript_build @@ -0,0 +1,6 @@ + +termlib=bld.env.READLINE_TERMLIB or '' + +bld.SAMBA_SUBSYSTEM('SMBREADLINE', + source='smbreadline.c', + deps=termlib + ' readline') diff --git a/source4/lib/smbreadline/wscript_configure b/source4/lib/smbreadline/wscript_configure new file mode 100644 index 0000000000..d89c357cec --- /dev/null +++ b/source4/lib/smbreadline/wscript_configure @@ -0,0 +1,12 @@ + +conf.CHECK_HEADERS('readline.h history.h readline/readline.h readline/history.h') +for termlib in ['ncurses', 'curses', 'termcap', 'terminfo', 'termlib', 'tinfo']: + if conf.CHECK_FUNCS_IN('tgetent', termlib): + conf.env['READLINE_TERMLIB'] = termlib + break + +if conf.CHECK_FUNCS_IN('rl_completion_matches', 'readline'): + conf.DEFINE('HAVE_NEW_LIBREADLINE', 1) + +if conf.CHECK_FUNCS_IN('rl_event_hook', 'readline'): + conf.DEFINE('HAVE_HISTORY_LIST', 1) diff --git a/source4/lib/socket/wscript_build b/source4/lib/socket/wscript_build index cf75d82206..7e456a8391 100644 --- a/source4/lib/socket/wscript_build +++ b/source4/lib/socket/wscript_build @@ -13,7 +13,7 @@ bld.SAMBA_MODULE('socket_ip', source='socket_ip.c', subsystem='samba_socket', deps='LIBSAMBA-ERRORS LIBREPLACE_NETWORK', - output_type='MERGED_OBJ' + internal_module=True ) @@ -21,7 +21,7 @@ bld.SAMBA_MODULE('socket_unix', source='socket_unix.c', subsystem='samba_socket', deps='LIBREPLACE_NETWORK', - output_type='MERGED_OBJ' + internal_module=True ) diff --git a/source4/libcli/security/wscript_build b/source4/libcli/security/wscript_build index 1b5ef77184..f2236a4a9c 100644 --- a/source4/libcli/security/wscript_build +++ b/source4/libcli/security/wscript_build @@ -3,7 +3,7 @@ bld.SAMBA_SUBSYSTEM('LIBSECURITY', - source='security_token.c access_check.c privilege.c sddl.c create_descriptor.c object_tree.c', + source='security_token.c access_check.c privilege.c create_descriptor.c object_tree.c', autoproto='proto.h', public_deps='LIBNDR LIBSECURITY_COMMON' ) diff --git a/source4/libcli/wscript_build b/source4/libcli/wscript_build index b20c52155f..bded7da4ca 100644 --- a/source4/libcli/wscript_build +++ b/source4/libcli/wscript_build @@ -54,19 +54,19 @@ bld.SAMBA_SUBSYSTEM('LIBCLI_DGRAM', bld.SAMBA_SUBSYSTEM('LIBCLI_WREPL', source='wrepl/winsrepl.c', autoproto='wrepl/winsrepl_proto.h', - public_deps='NDR_WINSREPL samba_socket LIBEVENTS LIBPACKET' + public_deps='NDR_WINSREPL samba_socket LIBEVENTS LIBPACKET LIBSAMBA_TSOCKET' ) bld.SAMBA_SUBSYSTEM('LIBCLI_RESOLVE', source='resolve/resolve.c', autoproto='resolve/proto.h', - public_deps='NDR_NBT' + public_deps='NDR_NBT LIBTSOCKET' ) bld.SAMBA_SUBSYSTEM('LP_RESOLVE', - source='resolve/bcast.c resolve/nbtlist.c resolve/wins.c resolve/dns_ex.c resolve/host.c resolve/resolve_lp.c', + source='resolve/bcast.c resolve/nbtlist.c resolve/wins.c resolve/dns_ex.c resolve/file.c resolve/host.c resolve/resolve_lp.c', autoproto='resolve/lp_proto.h', deps='LIBCLI_NBT LIBSAMBA-HOSTCONFIG LIBNETIF' ) diff --git a/source4/librpc/wscript_build b/source4/librpc/wscript_build index 225a7f172b..66d00ca544 100644 --- a/source4/librpc/wscript_build +++ b/source4/librpc/wscript_build @@ -1,5 +1,3 @@ -#! /usr/bin/env python - bld.BUILD_SUBDIR('../../librpc/idl') bld.BUILD_SUBDIR('idl') @@ -623,9 +621,8 @@ bld.SAMBA_PYTHON('python_winreg', bld.SAMBA_PYTHON('python_dcerpc_misc', - source='ndr/py_misc.c', + source='../../librpc/gen_ndr/py_misc.c', deps='PYTALLOC python_dcerpc NDR_MISC NDR_KRB5PAC', - enabled=False, realname='samba/dcerpc/misc.so' ) @@ -722,18 +719,19 @@ bld.SAMBA_PYTHON('python_drsuapi', bld.SAMBA_PYTHON('python_dcerpc_security', - source='ndr/py_security.c', + source='../../librpc/gen_ndr/py_security.c', deps='PYTALLOC python_dcerpc_misc python_dcerpc NDR_SECURITY', - enabled=False, realname='samba/dcerpc/security.so' ) bld.SAMBA_PYTHON('python_dcerpc_xattr', - source='ndr/py_xattr.c', + source='../../librpc/gen_ndr/py_xattr.c', deps='PYTALLOC python_dcerpc_misc python_dcerpc python_dcerpc_security NDR_XATTR RPC_NDR_XATTR', - enabled=False, realname='samba/dcerpc/xattr.so' ) - +bld.SAMBA_SCRIPT('python_dcerpc_init', + pattern='rpc/dcerpc.py', + installdir='python/samba/dcerpc', + installname='__init__.py') diff --git a/source4/nbt_server/wscript_build b/source4/nbt_server/wscript_build index 49e0000a13..d1928203c4 100644 --- a/source4/nbt_server/wscript_build +++ b/source4/nbt_server/wscript_build @@ -11,7 +11,7 @@ bld.SAMBA_SUBSYSTEM('WINSDB', bld.SAMBA_MODULE('ldb_wins_ldb', source='wins/wins_ldb.c', - subsystem='ldb', + subsystem='LIBLDB', init_function='LDB_MODULE(wins_ldb)', deps='ldb LIBNETIF LIBSAMBA-HOSTCONFIG LIBSAMBA-UTIL' ) diff --git a/source4/ntvfs/posix/wscript_build b/source4/ntvfs/posix/wscript_build index 3336950974..070c2fb8f6 100644 --- a/source4/ntvfs/posix/wscript_build +++ b/source4/ntvfs/posix/wscript_build @@ -28,25 +28,25 @@ bld.SAMBA_SUBSYSTEM('pvfs_aio', bld.SAMBA_MODULE('ntvfs_posix', - source='vfs_posix.c pvfs_util.c pvfs_search.c pvfs_dirlist.c pvfs_fileinfo.c pvfs_unlink.c pvfs_mkdir.c pvfs_open.c pvfs_read.c pvfs_flush.c pvfs_write.c pvfs_fsinfo.c pvfs_qfileinfo.c pvfs_setfileinfo.c pvfs_rename.c pvfs_resolve.c pvfs_shortname.c pvfs_lock.c pvfs_oplock.c pvfs_wait.c pvfs_seek.c pvfs_ioctl.c pvfs_xattr.c pvfs_streams.c pvfs_notify.c xattr_system.c xattr_tdb.c', + source='vfs_posix.c pvfs_util.c pvfs_search.c pvfs_dirlist.c pvfs_fileinfo.c pvfs_unlink.c pvfs_mkdir.c pvfs_open.c pvfs_read.c pvfs_flush.c pvfs_write.c pvfs_fsinfo.c pvfs_qfileinfo.c pvfs_setfileinfo.c pvfs_rename.c pvfs_resolve.c pvfs_shortname.c pvfs_lock.c pvfs_oplock.c pvfs_wait.c pvfs_seek.c pvfs_ioctl.c pvfs_xattr.c pvfs_streams.c pvfs_notify.c pvfs_sys.c xattr_system.c xattr_tdb.c', autoproto='vfs_posix_proto.h', subsystem='ntvfs', init_function='ntvfs_posix_init', deps='NDR_XATTR WRAP_XATTR BLKID ntvfs_common MESSAGING LIBWBCLIENT_OLD pvfs_acl pvfs_aio', - output_type='MERGED_OBJ' + internal_module=True ) bld.SAMBA_PYTHON('python_xattr_native', source='python/pyxattr_native.c', - deps='LIBNDR ldb SAMDB CREDENTIALS python_dcerpc_security pyparam_util WRAP_XATTR', + deps='LIBNDR ldb SAMDB CREDENTIALS python_dcerpc_security pyparam_util WRAP_XATTR attr', realname='samba/xattr_native.so' ) bld.SAMBA_PYTHON('python_xattr_tdb', source='python/pyxattr_tdb.c xattr_tdb.c', - deps='LIBNDR ldb python_dcerpc_security pyparam_util share', + deps='LIBNDR ldb python_dcerpc_security pyparam_util share attr', realname='samba/xattr_tdb.so' ) diff --git a/source4/ntvfs/wscript_build b/source4/ntvfs/wscript_build index c806720860..7b4c10d8cc 100644 --- a/source4/ntvfs/wscript_build +++ b/source4/ntvfs/wscript_build @@ -23,7 +23,7 @@ bld.SAMBA_MODULE('ntvfs_smb2', bld.SAMBA_MODULE('ntvfs_simple', - source='simple/vfs_simple.c cifs_posix_cli/svfs_util.c ./simple/svfs_util.c', + source='simple/vfs_simple.c simple/svfs_util.c', autoproto='simple/proto.h', subsystem='ntvfs', init_function='ntvfs_simple_init' @@ -31,7 +31,7 @@ bld.SAMBA_MODULE('ntvfs_simple', bld.SAMBA_MODULE('ntvfs_cifsposix', - source='cifs_posix_cli/vfs_cifs_posix.c cifs_posix_cli/svfs_util.c ./simple/svfs_util.c', + source='cifs_posix_cli/vfs_cifs_posix.c cifs_posix_cli/svfs_util.c', autoproto='cifs_posix_cli/proto.h', subsystem='ntvfs', init_function='ntvfs_cifs_posix_init' diff --git a/source4/param/wscript_build b/source4/param/wscript_build index 7e653f35d0..ea1bfc6e3e 100644 --- a/source4/param/wscript_build +++ b/source4/param/wscript_build @@ -1,12 +1,8 @@ -# AUTOGENERATED by mktowscript.pl from ../../source4/param/config.mk -# Please remove this notice if hand editing - - bld.SAMBA_LIBRARY('LIBSAMBA-HOSTCONFIG', source='loadparm.c generic.c util.c', # PC_FILES='samba-hostconfig.pc', vnum='0.0.1', - deps='DYNCONFIG LIBREPLACE_EXT CHARSET', + deps='DYNCONFIG LIBREPLACE_EXT CHARSET dl', public_deps='LIBSAMBA-UTIL', public_headers='param.h' ) diff --git a/source4/rpc_server/wscript_build b/source4/rpc_server/wscript_build index fc1d43d549..6a871ab903 100644 --- a/source4/rpc_server/wscript_build +++ b/source4/rpc_server/wscript_build @@ -73,7 +73,7 @@ bld.SAMBA_MODULE('dcerpc_winreg', subsystem='dcerpc_server', init_function='dcerpc_server_winreg_init', deps='registry NDR_STANDARD', - output_type='MERGED_OBJ' + internal_module=True ) @@ -99,7 +99,7 @@ bld.SAMBA_MODULE('dcerpc_spoolss', subsystem='dcerpc_server', init_function='dcerpc_server_spoolss_init', deps='DCERPC_COMMON NDR_SPOOLSS ntptr RPC_NDR_SPOOLSS', - output_type='MERGED_OBJ' + internal_module=True ) @@ -132,7 +132,7 @@ bld.SAMBA_MODULE('DCESRV', autoproto='service_rpc.h', subsystem='service', init_function='server_service_rpc_init', - output_type='MERGED_OBJ', + internal_module=True, deps='dcerpc_server' ) diff --git a/source4/scripting/python/wscript_build b/source4/scripting/python/wscript_build index 91bd516408..cfa028f4a4 100644 --- a/source4/scripting/python/wscript_build +++ b/source4/scripting/python/wscript_build @@ -15,7 +15,7 @@ bld.SAMBA_PYTHON('PYTALLOC', bld.SAMBA_PYTHON('python_uuid', source='uuidmodule.c', deps='LIBNDR', - realname='uuid' + realname='uuid.so' ) @@ -30,3 +30,9 @@ bld.SAMBA_PYTHON('python_glue', # create a dummy subsystem for EXT_LIB_PYTHON bld.SAMBA_SUBSYSTEM('EXT_LIB_PYTHON', '') + + +# install out various python scripts for use by make test +bld.SAMBA_SCRIPT('samba_python', + pattern='samba/**/*.py', + installdir='python') diff --git a/source4/selftest/wscript b/source4/selftest/wscript index 8327838366..d271ce783c 100644 --- a/source4/selftest/wscript +++ b/source4/selftest/wscript @@ -1,5 +1,7 @@ # selftest main code. +import Scripting, os + ######################################################################## # main test entry point def cmd_test(opt): @@ -11,8 +13,10 @@ def cmd_test(opt): def cmd_quicktest(opt): '''Run the quick test suite''' print "Starting quick test" + #Scripting.commands += ['build'] + SELFTEST = 'PYTHON=/usr/bin/python perl -W ../selftest/selftest.pl --prefix=./st --builddir=. --srcdir=. --exclude=./selftest/skip --testlist="./selftest/tests.sh|" --exclude=./selftest/slow --quick --include=./selftest/quick --socket-wrapper | perl -W ../selftest/filter-subunit.pl --expected-failures=./selftest/knownfail | /usr/bin/perl -W ../selftest/format-subunit.pl --prefix=./st --format=plain --immediate' + ret = os.system(SELFTEST) def set_options(opt): opt.ADD_COMMAND('test', cmd_test) opt.ADD_COMMAND('quicktest', cmd_quicktest) - diff --git a/source4/smb_server/wscript_build b/source4/smb_server/wscript_build index cccb285b5d..689ff94f20 100644 --- a/source4/smb_server/wscript_build +++ b/source4/smb_server/wscript_build @@ -8,7 +8,7 @@ bld.SAMBA_MODULE('SERVICE_SMB', subsystem='service', init_function='server_service_smb_init', deps='SMB_SERVER', - output_type='MERGED_OBJ' + internal_module=True ) diff --git a/source4/smbd/wscript_build b/source4/smbd/wscript_build index ba2f081678..89362c8892 100644 --- a/source4/smbd/wscript_build +++ b/source4/smbd/wscript_build @@ -19,9 +19,10 @@ bld.SAMBA_BINARY('samba', source='server.c', manpages='samba.8', installdir='SBINDIR', - subsystem='service', + subsystem_name='service', deps='''LIBEVENTS process_model service LIBSAMBA-HOSTCONFIG LIBSAMBA-UTIL POPT_SAMBA PIDFILE - LIBPOPT gensec registry ntptr ntvfs share CLUSTER DCESRV''' + LIBPOPT gensec registry ntptr ntvfs share CLUSTER DCESRV''', + needs_python=True ) @@ -35,7 +36,7 @@ bld.SAMBA_MODULE('process_model_single', source='process_single.c', subsystem='process_model', init_function='process_model_single_init', - output_type='MERGED_OBJ' + internal_module=True ) @@ -51,7 +52,8 @@ bld.SAMBA_MODULE('process_model_thread', source='process_thread.c', subsystem='process_model', init_function='process_model_thread_init', - deps='PTHREAD' + enabled=False, + deps='pthread' ) diff --git a/source4/torture/drs/wscript_build b/source4/torture/drs/wscript_build index 2743b7c2ad..4008ac9a41 100644 --- a/source4/torture/drs/wscript_build +++ b/source4/torture/drs/wscript_build @@ -8,6 +8,6 @@ bld.SAMBA_MODULE('TORTURE_DRS', subsystem='smbtorture', init_function='torture_drs_init', deps='NDR_TABLE RPC_NDR_UNIXINFO dcerpc_samr RPC_NDR_WINREG RPC_NDR_INITSHUTDOWN RPC_NDR_OXIDRESOLVER RPC_NDR_EVENTLOG RPC_NDR_ECHO RPC_NDR_SVCCTL RPC_NDR_NETLOGON dcerpc_atsvc dcerpc_mgmt RPC_NDR_DRSUAPI RPC_NDR_LSA RPC_NDR_EPMAPPER RPC_NDR_DFS RPC_NDR_FRSAPI RPC_NDR_SPOOLSS RPC_NDR_SRVSVC RPC_NDR_WKSSVC RPC_NDR_ROT RPC_NDR_DSSETUP RPC_NDR_REMACT RPC_NDR_OXIDRESOLVER RPC_NDR_NTSVCS WB_HELPER LIBSAMBA-NET LIBCLI_AUTH POPT_CREDENTIALS TORTURE_LDAP TORTURE_UTIL TORTURE_RAP dcerpc_server service process_model ntvfs SERVICE_SMB RPC_NDR_BROWSER LIBCLI_DRSUAPI TORTURE_LDB_MODULE', - output_type='MERGED_OBJ' + internal_module=True ) diff --git a/source4/torture/libnetapi/wscript_build b/source4/torture/libnetapi/wscript_build index 5110cf54ce..bea5f06f9e 100644 --- a/source4/torture/libnetapi/wscript_build +++ b/source4/torture/libnetapi/wscript_build @@ -8,7 +8,7 @@ bld.SAMBA_MODULE('TORTURE_LIBNETAPI', subsystem='smbtorture', init_function='torture_libnetapi_init', deps='POPT_CREDENTIALS NETAPI', - output_type='MERGED_OBJ', + internal_module=True, enabled=False ) diff --git a/source4/torture/libsmbclient/wscript_build b/source4/torture/libsmbclient/wscript_build index 688e0a9533..6fd5e8d7a3 100644 --- a/source4/torture/libsmbclient/wscript_build +++ b/source4/torture/libsmbclient/wscript_build @@ -8,7 +8,7 @@ bld.SAMBA_MODULE('TORTURE_LIBSMBCLIENT', subsystem='smbtorture', init_function='torture_libsmbclient_init', deps='POPT_CREDENTIALS SMBCLIENT', - output_type='MERGED_OBJ', + internal_module=True, enabled=False ) diff --git a/source4/torture/local/wscript_build b/source4/torture/local/wscript_build index f930a432cb..785101ed79 100644 --- a/source4/torture/local/wscript_build +++ b/source4/torture/local/wscript_build @@ -3,6 +3,6 @@ bld.SAMBA_MODULE('TORTURE_LOCAL', autoproto='proto.h', subsystem='smbtorture', init_function='torture_local_init', - deps='RPC_NDR_ECHO TDR LIBCLI_SMB MESSAGING ICONV POPT_CREDENTIALS TORTURE_AUTH TORTURE_UTIL TORTURE_NDR TORTURE_LIBCRYPTO share torture_registry PROVISION NSS_WRAPPER ldb SAMDB', - output_type='MERGED_OBJ' + deps='RPC_NDR_ECHO TDR LIBCLI_SMB MESSAGING ICONV POPT_CREDENTIALS TORTURE_AUTH TORTURE_UTIL TORTURE_NDR TORTURE_LIBCRYPTO share torture_registry PROVISION NSS_WRAPPER ldb SAMDB SOCKET_WRAPPER', + internal_module=True ) diff --git a/source4/torture/smb2/wscript_build b/source4/torture/smb2/wscript_build index 542ebf4f4a..7d4f48813c 100644 --- a/source4/torture/smb2/wscript_build +++ b/source4/torture/smb2/wscript_build @@ -6,7 +6,7 @@ bld.SAMBA_MODULE('TORTURE_SMB2', source='connect.c scan.c util.c getinfo.c setinfo.c lock.c notify.c smb2.c durable_open.c oplock.c dir.c lease.c create.c acls.c read.c compound.c streams.c', subsystem='smbtorture', deps='LIBCLI_SMB2 POPT_CREDENTIALS torture', - output_type='MERGED_OBJ', + internal_module=True, autoproto='proto.h', init_function='torture_smb2_init' ) diff --git a/source4/torture/winbind/wscript_build b/source4/torture/winbind/wscript_build index 82bf44fb2a..4345b7bd0b 100644 --- a/source4/torture/winbind/wscript_build +++ b/source4/torture/winbind/wscript_build @@ -4,5 +4,5 @@ bld.SAMBA_MODULE('TORTURE_WINBIND', subsystem='smbtorture', init_function='torture_winbind_init', deps='LIBWBCLIENT LIBWBCLIENT_ASYNC LIBWINBIND-CLIENT torture PAM_ERRORS', - output_type='MERGED_OBJ' + internal_module=True ) diff --git a/source4/torture/wscript_build b/source4/torture/wscript_build index 5be7385e5d..489d3300ae 100644 --- a/source4/torture/wscript_build +++ b/source4/torture/wscript_build @@ -10,22 +10,22 @@ bld.SAMBA_SUBSYSTEM('TORTURE_UTIL', bld.SAMBA_MODULE('TORTURE_BASIC', - source='basic/base.c basic/misc.c basic/scanner.c ./rpc/scanner.c basic/utable.c basic/charset.c basic/mangle_test.c basic/denytest.c basic/aliases.c basic/locking.c basic/secleak.c raw/rename.c ./basic/rename.c basic/dir.c ./smb2/dir.c basic/delete.c raw/unlink.c ./basic/unlink.c basic/disconnect.c basic/delaywrite.c basic/attr.c basic/properties.c', + source='basic/base.c basic/misc.c basic/scanner.c basic/utable.c basic/charset.c basic/mangle_test.c basic/denytest.c basic/aliases.c basic/locking.c basic/secleak.c basic/rename.c basic/dir.c basic/delete.c basic/unlink.c basic/disconnect.c basic/delaywrite.c basic/attr.c basic/properties.c', subsystem='smbtorture', deps='LIBCLI_SMB POPT_CREDENTIALS TORTURE_UTIL LIBCLI_RAW TORTURE_RAW', - output_type='MERGED_OBJ', + internal_module=True, autoproto='basic/proto.h', init_function='torture_base_init' ) bld.SAMBA_MODULE('TORTURE_RAW', - source='raw/qfsinfo.c raw/qfileinfo.c raw/setfileinfo.c raw/search.c raw/close.c raw/open.c raw/mkdir.c raw/oplock.c ./smb2/oplock.c raw/notify.c ./smb2/notify.c raw/mux.c raw/ioctl.c raw/chkpath.c raw/unlink.c ./basic/unlink.c raw/read.c ./smb2/read.c raw/context.c raw/write.c raw/lock.c ./smb2/lock.c raw/pingpong.c raw/lockbench.c raw/lookuprate.c raw/tconrate.c raw/openbench.c raw/rename.c ./basic/rename.c raw/eas.c raw/streams.c ./smb2/streams.c raw/acls.c ./smb2/acls.c raw/seek.c raw/samba3hide.c raw/samba3misc.c raw/composite.c raw/raw.c raw/offline.c', + source='raw/qfsinfo.c raw/qfileinfo.c raw/setfileinfo.c raw/search.c raw/close.c raw/open.c raw/mkdir.c raw/oplock.c raw/notify.c raw/mux.c raw/ioctl.c raw/chkpath.c raw/unlink.c raw/read.c raw/context.c raw/write.c raw/lock.c raw/pingpong.c raw/lockbench.c raw/lookuprate.c raw/tconrate.c raw/openbench.c raw/rename.c raw/eas.c raw/streams.c raw/acls.c raw/seek.c raw/samba3hide.c raw/samba3misc.c raw/composite.c raw/raw.c raw/offline.c', autoproto='raw/proto.h', subsystem='smbtorture', init_function='torture_raw_init', deps='LIBCLI_SMB LIBCLI_LSA LIBCLI_SMB_COMPOSITE POPT_CREDENTIALS TORTURE_UTIL', - output_type='MERGED_OBJ' + internal_module=True ) bld.BUILD_SUBDIR('smb2') @@ -34,19 +34,19 @@ bld.BUILD_SUBDIR('libnetapi') bld.BUILD_SUBDIR('libsmbclient') bld.SAMBA_SUBSYSTEM('TORTURE_NDR', - source='ndr/ndr.c ndr/winreg.c ./rpc/winreg.c ndr/atsvc.c ./rpc/atsvc.c ndr/lsa.c ./rpc/lsa.c ndr/epmap.c ndr/dfs.c ./rpc/dfs.c ndr/netlogon.c ./rpc/netlogon.c ndr/drsuapi.c ./rpc/drsuapi.c ndr/spoolss.c ./rpc/spoolss.c ndr/samr.c ./rpc/samr.c ndr/dfsblob.c', + source='ndr/ndr.c ndr/winreg.c ndr/atsvc.c ndr/lsa.c ndr/epmap.c ndr/dfs.c ndr/netlogon.c ndr/drsuapi.c ndr/spoolss.c ndr/samr.c ndr/dfsblob.c', autoproto='ndr/proto.h', deps='torture SERVICE_SMB' ) bld.SAMBA_MODULE('torture_rpc', - source='rpc/join.c ndr/lsa.c ./rpc/lsa.c rpc/lsa_lookup.c rpc/session_key.c rpc/echo.c ndr/dfs.c ./rpc/dfs.c ndr/drsuapi.c ./rpc/drsuapi.c rpc/drsuapi_cracknames.c rpc/dssync.c rpc/dsgetinfo.c ndr/spoolss.c ./rpc/spoolss.c rpc/spoolss_notify.c rpc/spoolss_win.c rpc/unixinfo.c ndr/samr.c ./rpc/samr.c rpc/samr_accessmask.c rpc/wkssvc.c rpc/srvsvc.c rpc/svcctl.c ndr/atsvc.c ./rpc/atsvc.c rpc/eventlog.c rpc/epmapper.c ndr/winreg.c ./rpc/winreg.c rpc/initshutdown.c rpc/oxidresolve.c rpc/remact.c rpc/mgmt.c basic/scanner.c ./rpc/scanner.c rpc/autoidl.c rpc/countcalls.c rpc/testjoin.c rpc/schannel.c ndr/netlogon.c ./rpc/netlogon.c rpc/remote_pac.c rpc/samlogon.c rpc/samsync.c rpc/bind.c rpc/dssetup.c rpc/alter_context.c rpc/bench.c rpc/samba3rpc.c rpc/rpc.c rpc/async_bind.c rpc/handles.c rpc/frsapi.c rpc/object_uuid.c rpc/ntsvcs.c rpc/browser.c', + source='rpc/join.c rpc/lsa.c rpc/lsa_lookup.c rpc/session_key.c rpc/echo.c rpc/dfs.c rpc/drsuapi.c rpc/drsuapi_cracknames.c rpc/dssync.c rpc/dsgetinfo.c rpc/spoolss.c rpc/spoolss_notify.c rpc/spoolss_win.c rpc/unixinfo.c rpc/samr.c rpc/samr_accessmask.c rpc/wkssvc.c rpc/srvsvc.c rpc/svcctl.c rpc/atsvc.c rpc/eventlog.c rpc/epmapper.c rpc/winreg.c rpc/initshutdown.c rpc/oxidresolve.c rpc/remact.c rpc/mgmt.c rpc/scanner.c rpc/autoidl.c rpc/countcalls.c rpc/testjoin.c rpc/schannel.c rpc/netlogon.c rpc/remote_pac.c rpc/samlogon.c rpc/samsync.c rpc/bind.c rpc/dssetup.c rpc/alter_context.c rpc/bench.c rpc/samba3rpc.c rpc/rpc.c rpc/async_bind.c rpc/handles.c rpc/frsapi.c rpc/object_uuid.c rpc/ntsvcs.c rpc/browser.c', autoproto='rpc/proto.h', subsystem='smbtorture', init_function='torture_rpc_init', deps='NDR_TABLE RPC_NDR_UNIXINFO dcerpc_samr RPC_NDR_WINREG RPC_NDR_INITSHUTDOWN RPC_NDR_OXIDRESOLVER RPC_NDR_EVENTLOG RPC_NDR_ECHO RPC_NDR_SVCCTL RPC_NDR_NETLOGON dcerpc_atsvc dcerpc_mgmt RPC_NDR_DRSUAPI RPC_NDR_LSA RPC_NDR_EPMAPPER RPC_NDR_DFS RPC_NDR_FRSAPI RPC_NDR_SPOOLSS RPC_NDR_SRVSVC RPC_NDR_WKSSVC RPC_NDR_ROT RPC_NDR_DSSETUP RPC_NDR_REMACT RPC_NDR_OXIDRESOLVER RPC_NDR_NTSVCS WB_HELPER LIBSAMBA-NET LIBCLI_AUTH POPT_CREDENTIALS TORTURE_LDAP TORTURE_UTIL TORTURE_RAP dcerpc_server service process_model ntvfs SERVICE_SMB RPC_NDR_BROWSER LIBCLI_DRSUAPI TORTURE_LDB_MODULE', - output_type='MERGED_OBJ' + internal_module=True ) bld.BUILD_SUBDIR('drs') @@ -57,7 +57,7 @@ bld.SAMBA_MODULE('TORTURE_RAP', subsystem='smbtorture', init_function='torture_rap_init', deps='TORTURE_UTIL LIBCLI_SMB', - output_type='MERGED_OBJ' + internal_module=True ) @@ -66,7 +66,7 @@ bld.SAMBA_MODULE('TORTURE_AUTH', autoproto='auth/proto.h', subsystem='smbtorture', deps='LIBCLI_SMB gensec auth KERBEROS POPT_CREDENTIALS SMBPASSWD torture', - output_type='MERGED_OBJ' + internal_module=True ) bld.BUILD_SUBDIR('local') @@ -77,7 +77,7 @@ bld.SAMBA_MODULE('TORTURE_NBENCH', subsystem='smbtorture', init_function='torture_nbench_init', deps='TORTURE_UTIL', - output_type='MERGED_OBJ' + internal_module=True ) @@ -87,7 +87,7 @@ bld.SAMBA_MODULE('TORTURE_UNIX', subsystem='smbtorture', init_function='torture_unix_init', deps='TORTURE_UTIL', - output_type='MERGED_OBJ' + internal_module=True ) @@ -95,7 +95,7 @@ bld.SAMBA_MODULE('TORTURE_LDAP', source='ldap/common.c ldap/basic.c ldap/schema.c ldap/uptodatevector.c ldap/cldap.c ldap/cldapbench.c ldap/ldap_sort.c ldap/nested_search.c', subsystem='smbtorture', deps='LIBCLI_LDAP LIBCLI_CLDAP SAMDB POPT_CREDENTIALS torture LDB_WRAP', - output_type='MERGED_OBJ', + internal_module=True, autoproto='ldap/proto.h', init_function='torture_ldap_init' ) @@ -107,7 +107,7 @@ bld.SAMBA_MODULE('TORTURE_NBT', subsystem='smbtorture', init_function='torture_nbt_init', deps='LIBCLI_SMB LIBCLI_NBT LIBCLI_DGRAM LIBCLI_WREPL torture_rpc', - output_type='MERGED_OBJ' + internal_module=True ) @@ -117,7 +117,7 @@ bld.SAMBA_MODULE('TORTURE_NET', subsystem='smbtorture', init_function='torture_net_init', deps='LIBSAMBA-NET POPT_CREDENTIALS torture_rpc PROVISION', - output_type='MERGED_OBJ' + internal_module=True ) @@ -127,18 +127,18 @@ bld.SAMBA_MODULE('TORTURE_NTP', subsystem='smbtorture', init_function='torture_ntp_init', deps='POPT_CREDENTIALS torture_rpc', - output_type='MERGED_OBJ' + internal_module=True ) -TORTURE_MODULES = 'TORTURE_BASIC TORTURE_RAW torture_rpc TORTURE_RAP TORTURE_AUTH TORTURE_NBENCH TORTURE_UNIX TORTURE_LDAP TORTURE_NBT TORTURE_NET TORTURE_NTP' +TORTURE_MODULES = 'TORTURE_BASIC TORTURE_RAW torture_rpc TORTURE_RAP TORTURE_AUTH TORTURE_NBENCH TORTURE_UNIX TORTURE_LDAP TORTURE_NBT TORTURE_NET TORTURE_NTP torture_registry' bld.SAMBA_BINARY('smbtorture', source='smbtorture.c torture.c', manpages='man/smbtorture.1', public_headers='smbtorture.h', installdir='BINDIR', - subsystem='smbtorture', - deps='torture LIBPOPT POPT_SAMBA POPT_CREDENTIALS dcerpc LIBCLI_SMB SMBREADLINE ' + TORTURE_MODULES + deps='torture LIBPOPT POPT_SAMBA POPT_CREDENTIALS dcerpc LIBCLI_SMB SMBREADLINE ' + TORTURE_MODULES, + needs_python=True ) @@ -161,11 +161,11 @@ bld.SAMBA_BINARY('masktest', bld.SAMBA_BINARY('locktest', source='locktest.c', # COV_TARGET='test', - ldflags='--coverage', - manpages='man/locktest.1', + #ldflags='--coverage', + #cflags='--coverage', # GCOV='1', + manpages='man/locktest.1', deps='LIBPOPT POPT_SAMBA POPT_CREDENTIALS LIBSAMBA-UTIL LIBCLI_SMB LIBSAMBA-HOSTCONFIG', - cflags='--coverage', installdir='BINDIR' ) diff --git a/source4/utils/net/wscript_build b/source4/utils/net/wscript_build index 47b0f21425..ef31d0c3d3 100644 --- a/source4/utils/net/wscript_build +++ b/source4/utils/net/wscript_build @@ -1,13 +1,9 @@ -# AUTOGENERATED by mktowscript.pl from ../../source4/utils/net/config.mk -# Please remove this notice if hand editing - - bld.SAMBA_MODULE('net_drs', source='drs/net_drs.c drs/net_drs_bind.c drs/net_drs_kcc.c drs/net_drs_replicate.c drs/net_drs_showrepl.c', autoproto='drs/net_drs_proto.h', subsystem='net', deps='LIBCLI_DRSUAPI ldb', - output_type='MERGED_OBJ' + internal_module=True ) diff --git a/source4/utils/wscript_build b/source4/utils/wscript_build index c11c49abc3..4dde99e2f7 100644 --- a/source4/utils/wscript_build +++ b/source4/utils/wscript_build @@ -6,7 +6,8 @@ bld.SAMBA_BINARY('ntlm_auth', source='ntlm_auth.c', manpages='man/ntlm_auth.1', installdir='BINDIR', - deps='LIBSAMBA-HOSTCONFIG LIBSAMBA-UTIL LIBPOPT POPT_SAMBA POPT_CREDENTIALS gensec LIBCLI_RESOLVE auth ntlm_check MESSAGING LIBEVENTS' + deps='LIBSAMBA-HOSTCONFIG LIBSAMBA-UTIL LIBPOPT POPT_SAMBA POPT_CREDENTIALS gensec LIBCLI_RESOLVE auth ntlm_check MESSAGING LIBEVENTS service', + needs_python=True ) diff --git a/source4/winbind/wscript_build b/source4/winbind/wscript_build index 3a62c13ea4..e0c44c35d1 100644 --- a/source4/winbind/wscript_build +++ b/source4/winbind/wscript_build @@ -3,7 +3,7 @@ bld.SAMBA_MODULE('WINBIND', - source='wb_server.c wb_irpc.c wb_samba3_protocol.c wb_samba3_cmd.c wb_init_domain.c wb_dom_info.c wb_dom_info_trusted.c wb_sid2domain.c wb_name2domain.c wb_sids2xids.c wb_xids2sids.c wb_gid2sid.c wb_sid2uid.c wb_sid2gid.c wb_uid2sid.c wb_connect_lsa.c wb_connect_sam.c wb_cmd_lookupname.c wb_cmd_lookupsid.c wb_cmd_getdcname.c wb_cmd_getgrnam.c wb_cmd_getgrgid.c wb_cmd_getpwnam.c wb_cmd_getpwuid.c wb_cmd_userdomgroups.c wb_cmd_usersids.c wb_cmd_list_groups.c wb_cmd_list_trustdom.c wb_cmd_list_users.c wb_cmd_setpwent.c wb_cmd_getpwent.c wb_pam_auth.c wb_sam_logon.c', + source='wb_server.c wb_irpc.c wb_samba3_protocol.c wb_samba3_cmd.c wb_init_domain.c wb_dom_info.c wb_dom_info_trusted.c wb_sid2domain.c wb_name2domain.c wb_sids2xids.c wb_xids2sids.c wb_gid2sid.c wb_sid2uid.c wb_sid2gid.c wb_uid2sid.c wb_connect_lsa.c wb_connect_sam.c wb_cmd_lookupname.c wb_cmd_lookupsid.c wb_cmd_getdcname.c wb_cmd_getgrnam.c wb_cmd_getgrgid.c wb_cmd_getpwnam.c wb_cmd_getpwuid.c wb_cmd_userdomgroups.c wb_cmd_usersids.c wb_cmd_list_groups.c wb_cmd_list_trustdom.c wb_cmd_list_users.c wb_cmd_setpwent.c wb_cmd_getpwent.c wb_cmd_getgrent.c wb_cmd_setgrent.c wb_cmd_getgroups.c wb_pam_auth.c wb_sam_logon.c', autoproto='wb_proto.h', subsystem='service', init_function='server_service_winbind_init', diff --git a/source4/wscript b/source4/wscript index 31bc3070d0..aecea2df5f 100644 --- a/source4/wscript +++ b/source4/wscript @@ -35,10 +35,7 @@ def configure(conf): # set a lower limit on recursing in waf preprocessor conf.env.preprocessor_recursion_limit = 10 - # we should use the PIC options in waf instead - conf.ADD_CFLAGS('-fPIC') - - conf.ADD_EXTRA_INCLUDES('#source4 #lib #source4/lib #source4/include #lib/replace #lib/talloc') + conf.ADD_EXTRA_INCLUDES('#source4 #lib #source4/lib #source4/include #lib/replace #lib/talloc #lib/tevent') conf.sub_config('../lib/replace') @@ -63,5 +60,6 @@ def configure(conf): conf.sub_config('../lib/nss_wrapper') conf.sub_config('../lib/socket_wrapper') conf.sub_config('../lib/uid_wrapper') + conf.sub_config('lib/smbreadline') conf.SAMBA_CONFIG_H('include/config.h') diff --git a/source4/wscript_build b/source4/wscript_build index a924dad2ee..8d3b670e02 100644 --- a/source4/wscript_build +++ b/source4/wscript_build @@ -3,8 +3,6 @@ import os srcdir = ".." -bld.env.TOPDIR = os.path.normpath(os.path.join(os.environ.get('PWD'), srcdir)) - # create separate build groups for building the asn1 and et compiler, then # building the C from ASN1 and IDL, and finally the main build process bld.SETUP_BUILD_GROUPS() @@ -16,29 +14,25 @@ bld.SAMBA_MKVERSION('version.h') bld.TARGET_ALIAS('attr', 'XATTR') bld.TARGET_ALIAS('execinfo', 'EXECINFO') bld.TARGET_ALIAS('popt', 'LIBPOPT') +bld.TARGET_ALIAS('tevent', 'LIBTEVENT_EXT') +bld.TARGET_ALIAS('z', 'ZLIB') +bld.TARGET_ALIAS('pam', 'PAM') +bld.TARGET_ALIAS('sasl2', 'SASL') +bld.TARGET_ALIAS('crypt', 'CRYPT') # missing subsystems bld.SAMBA_SUBSYSTEM('pyldb_util', '') -bld.SAMBA_SUBSYSTEM('pyldb', '') bld.SAMBA_SUBSYSTEM('dcerpc_mgmt', '') bld.SAMBA_SUBSYSTEM('TORTURE_LDB_MODULE', '') bld.SAMBA_SUBSYSTEM('INTL', '') bld.SAMBA_SUBSYSTEM('NDR_SAMR', '') -bld.SAMBA_SUBSYSTEM('LIBLDB_CMDLINE', '') bld.SAMBA_SUBSYSTEM('NETAPI', '') bld.SAMBA_SUBSYSTEM('HDB_LDB', '') -bld.SAMBA_SUBSYSTEM('SMBREADLINE', '') bld.SAMBA_SUBSYSTEM('OPENPTY', '') bld.SAMBA_SUBSYSTEM('SMBCLIENT', '') bld.SAMBA_SUBSYSTEM('BLKID', '') -bld.SAMBA_SUBSYSTEM('LIBTEVENT_EXT', '') -bld.SAMBA_SUBSYSTEM('PTHREAD', '') -bld.SAMBA_SUBSYSTEM('CRYPT', '') -bld.SAMBA_SUBSYSTEM('PAM', '') -bld.SAMBA_SUBSYSTEM('SASL', '') bld.SAMBA_SUBSYSTEM('smbcalls', '') bld.SAMBA_SUBSYSTEM('SETPROCTITLE', '') -bld.SAMBA_SUBSYSTEM('ZLIB', '') bld.SAMBA_SUBSYSTEM('NDR_SRVSVC', '') bld.SAMBA_SUBSYSTEM('ICONV', '') bld.SAMBA_SUBSYSTEM('NDR_MISC', '') @@ -54,6 +48,7 @@ bld.BUILD_SUBDIR('lib/ldb') bld.BUILD_SUBDIR('dynconfig') bld.BUILD_SUBDIR('../lib/util/charset') bld.BUILD_SUBDIR('scripting/python') +bld.BUILD_SUBDIR('../lib/subunit/python') bld.BUILD_SUBDIR('param') bld.BUILD_SUBDIR('librpc') bld.BUILD_SUBDIR('dsdb') @@ -114,6 +109,7 @@ bld.BUILD_SUBDIR('../libcli/samsync') bld.BUILD_SUBDIR('../libgpo') bld.BUILD_SUBDIR('../libcli/named_pipe_auth') bld.BUILD_SUBDIR('heimdal_build') +bld.BUILD_SUBDIR('lib/smbreadline') bld.ENFORCE_GROUP_ORDERING() -bld.CHECK_ORPANED_TARGETS() + -- 2.34.1