apr/0002750000372000001540000000000010110755602011277 5ustar affweblibuuidapr/flowersm.gif0000640000372000001540000000220007071364532013627 0ustar affweblibuuidGIF89ack!k!s)s)s){))1{1119999B{!BBBBBJJJJRRRRZZccc)s1k9c9k!{!!))1k119c9BJR!))1199BBJJRRZccZccks!!)9BJJRRRZ{Zcksk!)19!)19)19BJR9BJRcc119BBBRZZcks{s{)))11199BJJJRRZZcckkss{{!, HZ` 4Ȱ`-JXaZ<2e 8)&OZ-! 'TNG5)dX-AniYʜ3*1X`ḙ(Z@x!l Ea炕5xprt++p ,$\˃ӵ +]pڬ 0(Z@h ,|0@XTC0nqP[H%8Er׈(a@;apr/easter/0002750000372000001540000000000010110755600012560 5ustar affweblibuuidapr/easter/background3.jpg0000640000372000001540000001711407071364523015503 0ustar affweblibuuidJFIFHHtPhotoshop 3.08BIMHH8BIM8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM8BIM8BIM@@`8BIM   JFIFHH'File written by Adobe Photoshop 4.0Adobed             "?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?kA657" u:{VoC~&eYLyVE3{Աߝe[Kuq'-+=qQ_' 5׆n\W޿vI/Y{e$I)I$JRI$I$$I)I$J8BIM'File written by Adobe Photoshop 4.0Adobed@      O  s!1AQa"q2B#R3b$r%C4Scs5D'6Tdt& EFVU(eufv7GWgw8HXhx)9IYiy*:JZjzm!1AQa"q2#BRbr3$4CS%cs5DT &6E'dtU7()󄔤euFVfvGWgw8HXhx9IYiy*:JZjz ?f{STLιiM4lvI_#._$Pν{.x"CC7SkQ]ï%shaBE3kv)v*UثWb]v*˿ď#W~~=sO8؝v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb_f{SּiKkPHc4ݯD<˳t1Cd;_vv*UثWb]|HG?l?_Qh}sN]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWbf{~*|߬\Xkb3Prj7=`B2!3l~Eu=>+Dk$% $xja LQ`}s~\o^{+HF:o;f&Wb]v*Uث.F?^ga0}_C/{X8]DWoӠ˓[n("&bRxsd,p>^ΫhesܔFۨsƶcRk-=<8.82&f`>vzzn(h~sIkpj @d<@"=ۭglvM>R qc·? +b(b2{gȃ=r Wb]v*U#oF3{>/}Gqϱ;v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]f{Rլ\%4mЩ9ca3rtzLϊF3$t#O+yc"yӧf:}'Jj{t CQ߈"|[m?dMݟUFq?kbOךu ]K9[+M*@HC,Bf2 C{ES,qH/'[ׁ>!v6/&|I.?!%חﮮ(ā9o[DdL#HOj:}>|(25RsgaWbM垯w&3%(y~ K߳e1{:zեbgnFڔsQ9l@=.Oc0r&!/i_ euHVo]˷xWgpHfBꝊ|HG?l?_Qh}sN]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWbf{ST\42XɦZ|ZbyoB f.I N3|w105}gL`W !=yqgѮN1?Tdv ku%O c}/jGf@҉5[&T2*7r{0{#C('_29]Y;.dz@8b6F;#DER1l{Wgv:x p='sԾ >r9s27taѼpokNKE?.)wX>{^;pb-r2>>_ecں或 'pw1:Hr"miYXXaIoke CFQgd /Q#j1Dw=ճ|S1nC-og0sojd}ID6 tskT<PWlیCYSȀj@G{rhG/i+$b?U3.$|c <\ظN_>yw780>vj<Ǽ"Zq~Wb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*Uثf{SWb]v*a& zj~KW.d! *T3h˂P@Qcw^.;+0s6w7+=[ʳj-K_w zچJ WnFu=C dA޽_=˰u$߄;v}kc54XX6),?#ߧ_sw/v}?.)o;UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*f{SWb]v*& ,n#e֕cLrMG:;;>HX,򱸾J4<װQw{Y?fdN>?'9=C(Lpu# Gnx8‡KnkHNNq)=C] Xd@F߳xGw:%5CHEbVGӘhOm2Glz"G{K9;ixaQS#nS9.;XȌCs8oퟴHIzq>[s/+hb10H]3Lx"Z͖FS&D$*kCWϞ]$3?`և_y>UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*f{SWb]v*U柘_m~d-͸x_ϛ} UiǧȎe? olj/ i5z\ZT3- R  qk>+]Xngԁ>A?rׯUms5Mc$ VM}F8d>^Gn[vwbtR|G=~_yIN<{|Zt :Gxbퟶiuq͒<xclG#FwO Uث.F?^ga0}_C/9'b]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWapr/easter/easter2.gif0000640000372000001540000001076107071364523014634 0ustar affweblibuuidGIF89annュ罭Ƶƭεֽ{kZֵέƥƜƽ{{skkcֽ޽ֵέ{{c֭ΥƜƔ{kZZ199Μƌ޵֭ΥƔ޽ޥ{Bέscֽ֌ZֽJε{cJsZBޔ֌ބ{cZJޜތքskZR9{ޔބ{cJތs祽!,nn@H*\ȰÅ[H2D3Yjȱ#/Ca$hL+\.na)eL3\@XbF/;C C4} @ݪI`6yB%Uf Z%K3Vո3s Fý_P$APiJ"_ +13&kJ fPxWx2!DA4lP@8Ht?q0 čaBK@HW` ?~r=zQ |Q!$ U F( _|9{,^$$}:p,{B 2 ١GB2О}& HA}D! ?L8 > \~2 (%ea >4xe_~0 <'{N(C]ryb ?_~‰=B +|PP+C&B1*( 2p AhaK1膁r e(Im@kTPT8)%IWT35Q c$S:QSUF71Qm6TH^pDa\a^TK"Q!yLZ5,Wk X[a,ܗhbi&lKX!XH\UjDe%39@iMD!MT2[AFXgLWdi@qVuB%EV$ato3VB%g-D iE d z8| a^(=@oCH@@ (x1QwQ F"Cx;  P#z@A}`B D©v&Ԟx=p:Co0 B,Xg?᜛РF#E'XDK! q @ v>+ R:dY,Џ xWZY0A@KEsU?"A*HC2S{TC0 )q F*Z E. db@O$//V1*cȂ8/L)\ƴ௓HluV$򔑘1*[#;E[$"1ReRQD"v3ыZ /+ґ##" 61r^&Erc,ʦ@BɮKD2 \/Y3  Y3+yfAf0 M෎A@*C5( Npz(s X!LA@%8f N  (d  dg9CT̀%2?fE& L Xf) 6 $HH5n GphA^jET1XZ+F Kn&8k`qpzՋE8 QUvâN@AB!0%d O zp, @VA4ȬֈP1 5.@  JVd'Z@"`u`m0  =@!P?@vypTLx0-݉ 8x!Av(]uWRf%D*8 @MQA NP$=ide*1b(3 S>a3pA XP!7k*>vYFHQ}a }[n9u8!bd(xra/l'aIxfyϝ_Ae94hB@ ` \$e$p2' E}ۣ0eE~&}@?գigT+1!N5,#2s{CO0ha+_y\>&BLu}`}~@J!7G |ߊ=w;& ~gD JqwY )C\n".dȢrqޮL1jfA)teHnHP,.bHH~L l\:iF0ڼc\!=`VpTe%U8"qL81\<`m]D}b9 /u\$aY09eOK>#J0^f0@RέK(NB.TM X;/ #g`N`Y?ܝ̾UAg- e]r ot9ϭ5eG5JQ[H1ߔ2UPyaTPAXp`A4LX 6aO O#UU67!XQ0OU!56$8L@66DK1RX*hP-Q/Mǁ)UL7?U6OeR7SD5tD#=XHU(R8HJp~P^4OtQzSCRxxkXE|؃K 6pD4Se TtXЁK55aAq5L!R7oHRrEesTuU_1Pp`15RNTݷMPҘ ohaw`x6ܨw`po0&9BV^|P( ǢBC/#`D'F+1*ZB=q{lzHQ9|; *2tf>h}]D/r8b^# ;% i9kp$٦v"3'BCh'“"tv8ZE t}9V6%)%2B#l2j>[De?/0*Yb? +<`5fD(mxq"bf"qV$铘 fE-W4iW:00{l@),vfo ZAd2–' *WJi7 <ƪֲAb+*c@o2b'Jm*.d%-hz 90Щ­[*j"N@X#X[ì H,&\$TBaXʫ&;;y8%#j2i+=8!i*ZҬ%2ah,DZү&J-,[C,l5䫬"(J(hK+GDLiBXEXrg'tm:Βs:]pKp;˨2;kBpa !⑯)/*٧=j~ BaK;@+#:ۻ;apr/easter/reddot.gif0000640000372000001540000000060007071364525014541 0ustar affweblibuuidGIF89aҶή3ɪä6: <@@qBJ{u'SQwNsKr5^.Z9d8b&Q}}}}*U|2\|%Pn*SlhjaaaXUVWVWU+PM,NDDD---,@@АY&PE6t*e$f`pXH(A `fĥS(tB0c@"On|}R'$m ,5.N*)+,7640$Mh  M%mB"Q* +-  70Y}24(n %S,263$M$-00.(YBN贁dA;apr/easter/index.html0000640000372000001540000001101207071364524014564 0ustar affweblibuuid Happy Easter

 

Easter is the time of springtime festivals, a time to welcome back the Tulips, the Crocuses and the Daffodils. Its a time of new suits, new dresses and patent leather shoes. And a time of chocolate bunnies, marshmallow chicks, and colored eggs!

In Christian countries, Easter is celebrated as the religious holiday commemorating the resurrection of Jesus Christ, the son of God. This holiday is the biggest observance in most Christian religions, and marks the last day of the Passover festival.

 

Easter Fun for Kids and Adults


Here's a few Easter crafts, you can make at home to decorate for this holiday.
Easter just wouldn't be complete without the annual Easter Egg Hunt.

Billy Bear's has a large collection of games, puzzles, and even Easter wallpaper for your computer.

Art, music, and scripture can be found at "Easter on the Net", commemorating the Christian holiday.

These Easter recipes help put a little hop in your day.

Passover is observed the week of Easter to commemorate the freedom of the the Israelites in Egypt.

Send your friends and family an Easter Card on the net.

Everyone loves to paint Easter Eggs with all of their favorite designs, and in Europe it has become an art form.

Eggs-otic Easter provides links to Chocolate Eggs, Chocolate Bunnies, Chocolate Chicks, and more Chocolate.

Copyright 1997 ISP Alliance. All Rights Reserved. You must obtain permission to display the content of and/or link to this page.Designed By: Greg Dunn

apr/easter/yellowdot.gif0000640000372000001540000000061307071364526015307 0ustar affweblibuuidGIF89a~өΤǡĿs}jwhdW}}}wwMlhjaaa_V8YR1XUVWVWDDD---!9,@@@x`.E`8,XШ aBDLPӴ(DZ0zd1 zB}~R()mP,5."&'*,7642)LhR nL mBT& P*- 72"Y r~#04+nT,063)L)-22.+%YB붩dA;apr/easter/rabbit2.gif0000640000372000001540000001250307071364525014612 0ustar affweblibuuidGIF89accckkksss{{{Ƶ{{!9!Z91)1s9ƜB9cZRR֔sZkRRJZkcZ9{B)sckc9{scZ9ZΜ{cƌc9Zsk{JRkkkBBkJBkJ1ksRR1kR{R!s!1ZR)k)B9Zc1JkZ{BcR{s{ƌZ!s9RJkJc!)9BZRsZ{Μ֭Z)k)1JZc{1BJcs{ޭ9JRkZsk!{9B)1c{k{9BZkk{k{s9{Zc!JRck)s{1{9{s{1{k)kBBZ{){9RJ{!{BBBkk9RR{{,@H*\ȰÇ#J$@A 2J0aĎ#d\`(SBG$<`'Mr1dgΟ; gO=o`G(`–/#TSgעE5J,RHvINh*XT$P +V܀:qc„ /`y1 ~@ =8quR/*Dc>y] %`f!ï "Hh<4ݾlP U0;'߅ _v>7 ğFx > P:W_R @ z90aՂ("u,u%&>@߃5ߎGID!<&$} 衠he-R(܇cBbD$l)2J *zl"I~l*l'$“(| xw"&De"pfJ (@ '$nq/%v&mxs($b$҅ju7N @$&ia#J.q $a%P`:Pc N*z=Ѐת@i2$ dXEL܄J'y>ꨮM!UM\lZtT4ŖwrrCdI `@lH'L7P@aSt8YE7!dq%` 5%sjR(Ar^dDumKF@,=$^=L" b*]oE'2 LeSRɢuYYF"N;/q`Gt! T=FQ #]!@$wXhn_eF ~}>y@K+;ڗiq4S"  hu"Р/5LGbfO""T ƻ6W M`*@m$IDE ԰QJ(X|ȣ+"i_$u!|*X=*rQB # JHp+d! dA0%D@ fMRQZ)6 E=I.,@l*6AK &+ߴ)BgX  FAH3EELb@D 95[ EE:= d"p"&<3" PQA k DC愲Yte (&De@AGJҒ(MJ% f*iLFs40M+Mڦ3DZ8L:HLc!xa > lrb6').T.Ԃq0jdUo\CjȵrcA \-'Wu)VwVlekk׸kbs3 2M5Y0ҁ崺 `@fBMp1FbP8/XB `} t5ѨOo\PgQ"/XOj |u &1~%a<ZJB9~=4s@ t]gu/ItdgN`#\({gr(>JoE2TR0ģ$e U3N!aOPFm 5E Yu*%ј P 8tC EpIGtpuƒ وuͰy9,5xj4- zmLlAfL r W4 nzCҊ 9@ uA ^B{$Vш>a h+q6)@ K"G([LY" ^n%/X@rxU$XUBh|ҁ [we -= 5v$P$#r\)t6Bhqs\ fױHSY6$1+~*U܂ypPG"`D)1>PEpV\a{3j;flArGe3X!! Ĭe6" &-4)Ei^4UrB RqBDv͛ɀr}tkJ@WPZ/fP2%AwbaE aqXtH|>2bP(}3@QJVlqUpmFXe%=&*3Y#QX@TdU PG@Jv&> VP\3Mз3rr#R,1vDa/EDxSB34Dj=؄NPR8TXV-u \@8u3Rk=s AT7T`TS8(iMӷ=S $17oX;U5pŇ 5hSZP؈Y0Q\'8LEVWYu5c]6c3d?A671l-TqRU#TQQDU7DZ]6ve!FBTу{T֤EVXh#Ja8Y*U|Q-2ut^q̈8R'2n4d7q%RᆌzXvbFZ7aWX7'1QFÏ)3YQX}1t8Xӏ5M3}Un9V/ i,Yj43VQa*:@[?psA8[a@, `[CCh˳gHc; 5"Be;Gi.li47`S`kGh[6Cge36`[2u; b4"Mg]Pc)/t7=Aٕ0M~2~ٙ46bE\^A;ך0_`n'&-iAAb),x;PЇu9up}v=l`1` xDPa7 sM@!QX񜾦Jg+J @D]=j9>10SA><$};6yÍf{n_鏃֝.VFDS 0& e^/Y>lM(A"8*T7v e[F ]@cjApPb#Ce6֣<# [v Zx"6DfO@G̲! pJ c5AK  >Xk*Dg kE[՟|SVa-;"ZB3b>  kT&>DI\Mvcgni!XHdCLE"ún*1F ʱ"iv&ii':lzQljF*v*mj29I%kcՊj/j\FNwk`Y: qک jkL RD p]Rb*F`d2? 0" KW`  k0 Pz0pN @ Oz Z:%Pf 0wW,M.A`e @zf .+2Cʅ=$LA4q@|;U;; Pw[4he-y\!e~C*<Q5Tt*q1nǜ9G7##OSҰ~k:]xPT { 1v_=9R4xfK$X1u?T xFםvwj׃Z1Qhؒ]e.#Qc-P\XQc"ɲQR`cPQSQ ;S9 瑧:ͭ=&4j 4x}k(}xJhFa筄]=]4;apr/easter/purpledot.gif0000640000372000001540000000061407071364525015303 0ustar affweblibuuidGIF89aovxƥĠwù̽ۼǻڸܸwݶڶx۴~rĒkk_]}}}sRlhjhDuaaaXUVWVWS*[L%TDDD---!9,@@@hh:`8XШi>f|@a0(t(Iza`1@/zB}~R)'mP-5. %(+-7640'LhR nLmB P%P+,$70 Y r~&24* n#T$-263'L',00.*" YB췩dA;apr/easter/WS_FTP.LOG0000640000372000001540000002727007071364526014213 0ustar affweblibuuid99.12.01 07:02 B E:\ispa\monthly links\easter\background3.jpg <-- ~ctcis /com/ctcis.net/www/easter background3.jpg 99.12.01 07:02 B E:\ispa\monthly links\easter\bluedot.gif <-- ~ctcis /com/ctcis.net/www/easter bluedot.gif 99.12.01 07:02 B E:\ispa\monthly links\easter\easter.gif <-- ~ctcis /com/ctcis.net/www/easter easter.gif 99.12.01 07:02 A E:\ispa\monthly links\easter\easter.html <-- ~ctcis /com/ctcis.net/www/easter easter.html 99.12.01 07:02 B E:\ispa\monthly links\easter\easter2.gif <-- ~ctcis /com/ctcis.net/www/easter easter2.gif 99.12.01 07:02 B E:\ispa\monthly links\easter\eastereggs.JPG <-- ~ctcis /com/ctcis.net/www/easter eastereggs.JPG 99.12.01 07:02 B E:\ispa\monthly links\easter\logo.jpg <-- ~ctcis /com/ctcis.net/www/easter logo.jpg 99.12.01 07:02 B E:\ispa\monthly links\easter\purpledot.gif <-- ~ctcis /com/ctcis.net/www/easter purpledot.gif 99.12.01 07:02 B E:\ispa\monthly links\easter\rabbit2.gif <-- ~ctcis /com/ctcis.net/www/easter rabbit2.gif 99.12.01 07:02 B E:\ispa\monthly links\easter\reddot.gif <-- ~ctcis /com/ctcis.net/www/easter reddot.gif 99.12.01 07:02 B E:\ispa\monthly links\easter\yellowdot.gif <-- ~ctcis /com/ctcis.net/www/easter yellowdot.gif 2000.03.23 14:50 B E:\ispa\monthly links\apr\easter\background3.jpg --> www.america.net /com/america.net/www/apr/easter background3.jpg 2000.03.23 14:50 B E:\ispa\monthly links\apr\easter\bluedot.gif --> www.america.net /com/america.net/www/apr/easter bluedot.gif 2000.03.23 14:50 B E:\ispa\monthly links\apr\easter\easter.gif --> www.america.net /com/america.net/www/apr/easter easter.gif 2000.03.23 14:50 B E:\ispa\monthly links\apr\easter\easter2.gif --> www.america.net /com/america.net/www/apr/easter easter2.gif 2000.03.23 14:50 B E:\ispa\monthly links\apr\easter\eastereggs.JPG --> www.america.net /com/america.net/www/apr/easter eastereggs.JPG 2000.03.23 14:50 A E:\ispa\monthly links\apr\easter\index.html --> www.america.net /com/america.net/www/apr/easter index.html 2000.03.23 14:50 B E:\ispa\monthly links\apr\easter\logo.jpg --> www.america.net /com/america.net/www/apr/easter logo.jpg 2000.03.23 14:50 B E:\ispa\monthly links\apr\easter\purpledot.gif --> www.america.net /com/america.net/www/apr/easter purpledot.gif 2000.03.23 14:50 B E:\ispa\monthly links\apr\easter\rabbit2.gif --> www.america.net /com/america.net/www/apr/easter rabbit2.gif 2000.03.23 14:50 B E:\ispa\monthly links\apr\easter\reddot.gif --> www.america.net /com/america.net/www/apr/easter reddot.gif 2000.03.23 14:50 B E:\ispa\monthly links\apr\easter\WS_FTP.LOG --> www.america.net /com/america.net/www/apr/easter WS_FTP.LOG 2000.03.23 14:50 B E:\ispa\monthly links\apr\easter\yellowdot.gif --> www.america.net /com/america.net/www/apr/easter yellowdot.gif 2000.04.01 06:43 B E:\ispa\affilliates\apr\easter\background3.jpg --> www.accucomm.net /com/accucomm.net/www/main/apr/easter background3.jpg 2000.04.01 06:43 B E:\ispa\affilliates\apr\easter\bluedot.gif --> www.accucomm.net /com/accucomm.net/www/main/apr/easter bluedot.gif 2000.04.01 06:43 B E:\ispa\affilliates\apr\easter\easter.gif --> www.accucomm.net /com/accucomm.net/www/main/apr/easter easter.gif 2000.04.01 06:43 B E:\ispa\affilliates\apr\easter\easter2.gif --> www.accucomm.net /com/accucomm.net/www/main/apr/easter easter2.gif 2000.04.01 06:43 B E:\ispa\affilliates\apr\easter\eastereggs.JPG --> www.accucomm.net /com/accucomm.net/www/main/apr/easter eastereggs.JPG 2000.04.01 06:43 A E:\ispa\affilliates\apr\easter\index.html --> www.accucomm.net /com/accucomm.net/www/main/apr/easter index.html 2000.04.01 06:43 B E:\ispa\affilliates\apr\easter\logo.jpg --> www.accucomm.net /com/accucomm.net/www/main/apr/easter logo.jpg 2000.04.01 06:43 B E:\ispa\affilliates\apr\easter\purpledot.gif --> www.accucomm.net /com/accucomm.net/www/main/apr/easter purpledot.gif 2000.04.01 06:43 B E:\ispa\affilliates\apr\easter\rabbit2.gif --> www.accucomm.net /com/accucomm.net/www/main/apr/easter rabbit2.gif 2000.04.01 06:43 B E:\ispa\affilliates\apr\easter\reddot.gif --> www.accucomm.net /com/accucomm.net/www/main/apr/easter reddot.gif 2000.04.01 06:43 B E:\ispa\affilliates\apr\easter\WS_FTP.LOG --> www.accucomm.net /com/accucomm.net/www/main/apr/easter WS_FTP.LOG 2000.04.01 06:43 B E:\ispa\affilliates\apr\easter\yellowdot.gif --> www.accucomm.net /com/accucomm.net/www/main/apr/easter yellowdot.gif 2000.04.01 07:09 B E:\ispa\affilliates\apr\easter\background3.jpg --> www.bayspringstel.net /com/bayspringstel.net/www/apr/easter background3.jpg 2000.04.01 07:09 B E:\ispa\affilliates\apr\easter\bluedot.gif --> www.bayspringstel.net /com/bayspringstel.net/www/apr/easter bluedot.gif 2000.04.01 07:09 B E:\ispa\affilliates\apr\easter\easter.gif --> www.bayspringstel.net /com/bayspringstel.net/www/apr/easter easter.gif 2000.04.01 07:09 B E:\ispa\affilliates\apr\easter\easter2.gif --> www.bayspringstel.net /com/bayspringstel.net/www/apr/easter easter2.gif 2000.04.01 07:09 B E:\ispa\affilliates\apr\easter\eastereggs.JPG --> www.bayspringstel.net /com/bayspringstel.net/www/apr/easter eastereggs.JPG 2000.04.01 07:09 A E:\ispa\affilliates\apr\easter\index.html --> www.bayspringstel.net /com/bayspringstel.net/www/apr/easter index.html 2000.04.01 07:09 B E:\ispa\affilliates\apr\easter\logo.jpg --> www.bayspringstel.net /com/bayspringstel.net/www/apr/easter logo.jpg 2000.04.01 07:09 B E:\ispa\affilliates\apr\easter\purpledot.gif --> www.bayspringstel.net /com/bayspringstel.net/www/apr/easter purpledot.gif 2000.04.01 07:09 B E:\ispa\affilliates\apr\easter\rabbit2.gif --> www.bayspringstel.net /com/bayspringstel.net/www/apr/easter rabbit2.gif 2000.04.01 07:09 B E:\ispa\affilliates\apr\easter\reddot.gif --> www.bayspringstel.net /com/bayspringstel.net/www/apr/easter reddot.gif 2000.04.01 07:09 B E:\ispa\affilliates\apr\easter\WS_FTP.LOG --> www.bayspringstel.net /com/bayspringstel.net/www/apr/easter WS_FTP.LOG 2000.04.01 07:09 B E:\ispa\affilliates\apr\easter\yellowdot.gif --> www.bayspringstel.net /com/bayspringstel.net/www/apr/easter yellowdot.gif 2000.04.01 07:16 B E:\ispa\affilliates\apr\easter\background3.jpg --> www.cgemc.net /com/centralga.net/www/apr/easter background3.jpg 2000.04.01 07:16 B E:\ispa\affilliates\apr\easter\bluedot.gif --> www.cgemc.net /com/centralga.net/www/apr/easter bluedot.gif 2000.04.01 07:16 B E:\ispa\affilliates\apr\easter\easter.gif --> www.cgemc.net /com/centralga.net/www/apr/easter easter.gif 2000.04.01 07:16 B E:\ispa\affilliates\apr\easter\easter2.gif --> www.cgemc.net /com/centralga.net/www/apr/easter easter2.gif 2000.04.01 07:16 B E:\ispa\affilliates\apr\easter\eastereggs.JPG --> www.cgemc.net /com/centralga.net/www/apr/easter eastereggs.JPG 2000.04.01 07:16 A E:\ispa\affilliates\apr\easter\index.html --> www.cgemc.net /com/centralga.net/www/apr/easter index.html 2000.04.01 07:16 B E:\ispa\affilliates\apr\easter\logo.jpg --> www.cgemc.net /com/centralga.net/www/apr/easter logo.jpg 2000.04.01 07:16 B E:\ispa\affilliates\apr\easter\purpledot.gif --> www.cgemc.net /com/centralga.net/www/apr/easter purpledot.gif 2000.04.01 07:16 B E:\ispa\affilliates\apr\easter\rabbit2.gif --> www.cgemc.net /com/centralga.net/www/apr/easter rabbit2.gif 2000.04.01 07:16 B E:\ispa\affilliates\apr\easter\reddot.gif --> www.cgemc.net /com/centralga.net/www/apr/easter reddot.gif 2000.04.01 07:16 B E:\ispa\affilliates\apr\easter\WS_FTP.LOG --> www.cgemc.net /com/centralga.net/www/apr/easter WS_FTP.LOG 2000.04.01 07:16 B E:\ispa\affilliates\apr\easter\yellowdot.gif --> www.cgemc.net /com/centralga.net/www/apr/easter yellowdot.gif 2000.04.01 07:19 B E:\ispa\affilliates\apr\easter\background3.jpg --> www.ctcis.net /com/ctcis.net/www/apr/easter background3.jpg 2000.04.01 07:19 B E:\ispa\affilliates\apr\easter\bluedot.gif --> www.ctcis.net /com/ctcis.net/www/apr/easter bluedot.gif 2000.04.01 07:19 B E:\ispa\affilliates\apr\easter\easter.gif --> www.ctcis.net /com/ctcis.net/www/apr/easter easter.gif 2000.04.01 07:19 B E:\ispa\affilliates\apr\easter\easter2.gif --> www.ctcis.net /com/ctcis.net/www/apr/easter easter2.gif 2000.04.01 07:19 B E:\ispa\affilliates\apr\easter\eastereggs.JPG --> www.ctcis.net /com/ctcis.net/www/apr/easter eastereggs.JPG 2000.04.01 07:20 A E:\ispa\affilliates\apr\easter\index.html --> www.ctcis.net /com/ctcis.net/www/apr/easter index.html 2000.04.01 07:20 B E:\ispa\affilliates\apr\easter\logo.jpg --> www.ctcis.net /com/ctcis.net/www/apr/easter logo.jpg 2000.04.01 07:20 B E:\ispa\affilliates\apr\easter\purpledot.gif --> www.ctcis.net /com/ctcis.net/www/apr/easter purpledot.gif 2000.04.01 07:20 B E:\ispa\affilliates\apr\easter\rabbit2.gif --> www.ctcis.net /com/ctcis.net/www/apr/easter rabbit2.gif 2000.04.01 07:20 B E:\ispa\affilliates\apr\easter\reddot.gif --> www.ctcis.net /com/ctcis.net/www/apr/easter reddot.gif 2000.04.01 07:20 B E:\ispa\affilliates\apr\easter\WS_FTP.LOG --> www.ctcis.net /com/ctcis.net/www/apr/easter WS_FTP.LOG 2000.04.01 07:20 B E:\ispa\affilliates\apr\easter\yellowdot.gif --> www.ctcis.net /com/ctcis.net/www/apr/easter yellowdot.gif 2000.04.01 07:25 B E:\ispa\affilliates\apr\easter\background3.jpg --> www.daltontel.net /com/daltontel.net/www/apr/easter background3.jpg 2000.04.01 07:25 B E:\ispa\affilliates\apr\easter\bluedot.gif --> www.daltontel.net /com/daltontel.net/www/apr/easter bluedot.gif 2000.04.01 07:25 B E:\ispa\affilliates\apr\easter\easter.gif --> www.daltontel.net /com/daltontel.net/www/apr/easter easter.gif 2000.04.01 07:25 B E:\ispa\affilliates\apr\easter\easter2.gif --> www.daltontel.net /com/daltontel.net/www/apr/easter easter2.gif 2000.04.01 07:25 B E:\ispa\affilliates\apr\easter\eastereggs.JPG --> www.daltontel.net /com/daltontel.net/www/apr/easter eastereggs.JPG 2000.04.01 07:25 A E:\ispa\affilliates\apr\easter\index.html --> www.daltontel.net /com/daltontel.net/www/apr/easter index.html 2000.04.01 07:25 B E:\ispa\affilliates\apr\easter\logo.jpg --> www.daltontel.net /com/daltontel.net/www/apr/easter logo.jpg 2000.04.01 07:25 B E:\ispa\affilliates\apr\easter\purpledot.gif --> www.daltontel.net /com/daltontel.net/www/apr/easter purpledot.gif 2000.04.01 07:25 B E:\ispa\affilliates\apr\easter\rabbit2.gif --> www.daltontel.net /com/daltontel.net/www/apr/easter rabbit2.gif 2000.04.01 07:25 B E:\ispa\affilliates\apr\easter\reddot.gif --> www.daltontel.net /com/daltontel.net/www/apr/easter reddot.gif 2000.04.01 07:25 B E:\ispa\affilliates\apr\easter\WS_FTP.LOG --> www.daltontel.net /com/daltontel.net/www/apr/easter WS_FTP.LOG 2000.04.01 07:25 B E:\ispa\affilliates\apr\easter\yellowdot.gif --> www.daltontel.net /com/daltontel.net/www/apr/easter yellowdot.gif 2000.04.01 07:27 B E:\ispa\affilliates\apr\easter\background3.jpg --> www.deltaland.net /com/deltaland.net/www/apr/easter background3.jpg 2000.04.01 07:27 B E:\ispa\affilliates\apr\easter\bluedot.gif --> www.deltaland.net /com/deltaland.net/www/apr/easter bluedot.gif 2000.04.01 07:27 B E:\ispa\affilliates\apr\easter\easter.gif --> www.deltaland.net /com/deltaland.net/www/apr/easter easter.gif 2000.04.01 07:27 B E:\ispa\affilliates\apr\easter\easter2.gif --> www.deltaland.net /com/deltaland.net/www/apr/easter easter2.gif 2000.04.01 07:27 B E:\ispa\affilliates\apr\easter\eastereggs.JPG --> www.deltaland.net /com/deltaland.net/www/apr/easter eastereggs.JPG 2000.04.01 07:27 A E:\ispa\affilliates\apr\easter\index.html --> www.deltaland.net /com/deltaland.net/www/apr/easter index.html 2000.04.01 07:27 B E:\ispa\affilliates\apr\easter\logo.jpg --> www.deltaland.net /com/deltaland.net/www/apr/easter logo.jpg 2000.04.01 07:27 B E:\ispa\affilliates\apr\easter\purpledot.gif --> www.deltaland.net /com/deltaland.net/www/apr/easter purpledot.gif 2000.04.01 07:27 B E:\ispa\affilliates\apr\easter\rabbit2.gif --> www.deltaland.net /com/deltaland.net/www/apr/easter rabbit2.gif 2000.04.01 07:27 B E:\ispa\affilliates\apr\easter\reddot.gif --> www.deltaland.net /com/deltaland.net/www/apr/easter reddot.gif apr/easter/logo.jpg0000640000372000001540000006011707071364525014244 0ustar affweblibuuidJFIFHH bPhotoshop 3.08BIMHH8BIM8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM8BIM8BIM@@ 8BIM &9JFIFHH'File written by Adobe Photoshop 4.0Adobed            &"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?TQVXO椥Ɯt_a鴘tΫrrE46CHsL͞Szmu\x=ޣvLU*jh}K#)ayo?#kqǂ &#KIW(Fr8ND\tRP1sj/kKEk ozYl ~ [?octEY6d8ƺ{K=9g[{˭!-v?݋FmWXqhFXM @hRI$_U.ˍZ~ ߤZazX}@ Uզoq޾  U6oxVꍤX- a>ENK X> bIkO}@Jk[k+`9&x$X?8d۪euZtѽito>d`TXs^{Oj`}nsYa#kէ_Rc4fQF3uϷ~:BV5 (c~x&:GջkkZwmje1.#c$DnϤ벽\:/"Zٴw~~s?Sj{Kۜ?Dߥ]7:Ϡ<.n<pǃU" %yf#)~]QznC_[1@{׃2ZP N]i1w&Mή5;~dWMc*Nqqp0+\?ĘrÀʡq_.[ jt %03N]o Zݮh>lw&eKn}Jݻ؏zk222FM7mk}ӀE&bQWxoUzML{j1 #q&=>9_ɧ*I?dt=Fլϱ߾@l A[]uwsw E.s/G{c%2ys]u ۵cZǹMжv] OT tiHP"lߦDOTʩ$==vqܾWI$~%R;K| ُ߷W˩"-_<>>F;^z zl<~jq$-|M0Q>Ko?[;~ѦwFzy$rK_OOҟQ_g>}gnݞ|{ˉ G~ꏳ}Cܬ]mݲ#|Do_,FmKo~?aVڣOD۟E|Eu~8BIM'File written by Adobe Photoshop 4.0Adobed@      z4  s!1AQa"q2B#R3b$r%C4Scs5D'6Tdt& EFVU(eufv7GWgw8HXhx)9IYiy*:JZjzm!1AQa"q2#BRbr3$4CS%cs5DT &6E'dtU7()󄔤euFVfvGWgw8HXhx9IYiy*:JZjz ?v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*Uv*UثWb]lg<=K)YZ3014>Bjw=ogh1R?﮿#vkhg7FV}&_õW"wXds-Ϙ5+Y%,Nw*8G|o'krlGOX|k }yzޣ\K^[x(i7kǵ:m-12c4*Dߗ1}=0yLu+ÿn͚N$~ᷖZ1jA4a{9dPe:Dd%owy8vl 9IILN澫 #O0kѰtuu!:<cGq62Kռ2W]]pYc7PE|k,2r_G luP2WS];F_EWb]v*UثWb]v*UثWbR}[T/€{^ *>G@38΢ qxPJ;Bܒ ڄ4o^.mhz\Cj0f]1;G^vohe\8p RSg)%CUa):XK9>=)v*UثWb]v*UثWb_v*UثWb]f4k"QfDe?A7>H_彵cjAm!ݞqU[j6Vy)H`#Qېj}9U}6.1MsbI_f_iYKK[˸nneIctZTnrbǓ/HbSU͇N!8BRA ;|w? yAQB۱Ŕ1?I5N5F1缾Ck79;0LwD6+FuJb# $t.4*PJ:gc1C:&L}W_I?MIaynPh{+##S̜RO@j೜"#"I?xkCIEI `7GN.g.>$>o{-'dv'K-FnuR+Poo-?$iACٺlp˼;[t]=NA 97>Cx9)l4za?0?:7"eiM`%Zlctm._F{1Ld:dNF3:y- r21bGr{#N#395#@xb)ݔE8% #QfvOa2K?GgR2~ <c?sQל.M**вVoCPkMZ7oij;>ZHqH?Fw?fG]'G[voR5P>\:>ƿyߐ$MW| 8K%<)4/,Nwd˧>=9$ΰK G?2e=_~M"k"ck+zKɽWs}:yL߸~)k|zì#/`6wJk:ϗ4mE%+ظ?Β~>`xLYՉ@Ǹ}ses+K.añ:f7tH~79( bEem[^ Ye$J+nˠP@޸#u.|6န,-"K_L}hi^Hؒ9þ9FC6>.,9DX_,X&22;# v"7͸ߢ-.y~=>mȦ'gv9v>;coBUثWb]v*UثWb]v*UثWb]S%?KgY}}O?H~ug?,2.ym[/hjaQF$ 9]@ h׬l-ZēiG/@écAVwP|r9@ y}֨gYfdfe&f vV"\R6bezw?e#Lј Eϯ?xrc0#J21 $W]_'>*|u/Rk2Auc y!dz[&^ '-HvTo:Rnj;\guSE%KYc1^KZW|=&:1?7KCɧ㑉#Vȿ.٦WZ\ d " LЖK,U|4=hvhcNF1G:'k~I_jv)iw%G#K0_U"DrNJAua?XdjeퟲBFXO j0n>[ 췰X{cY%_fqkI/.nW͔AphVAb"|X索H>hqS}KWh:WRA7xG!MA2S B]m>-eki&8'pLw^ {{i^PmX. @`C-O˽ke7lO#ý'Qx9s76Ρ{ח5Zۮyd_8>FHB\{I[q xv{HA[){/!ئplcE? -ʁFgWnk9Uu'v?4o{43|1e{79>UkR6laaJ+I2-Ig|(P\`y]g#U|RO?Mg//-,>km55[)lnàd#}7Ώ.ۊUثWb]v*UثWb]v*UثWu{3ΐj硠jdVnoWP}Jӝ<;ӓ;7M\տwc>_P/G1z\iJp&~$cx~?G{:4ZHN+W3=+žQC&'k;ij+3i0zK4k@>Dkhb$|b <:@}ό7V*]VV/H(4 |yw5`+M@4%ٓ>6=4~4~EK^D,aw R=~63ǖ}(:-gŦԙ~Vz#O} V/XM'˶!  Ү'xE,<<7'HhŪGn_y>5ZDJ?V}59-1 Q}̞ӵ{cUy]D̉:G#t?ʍ;-K&ވ2 ,e)NEwȚҝSIi8GcwoOGkhsۆQ/Mɳxw>c IisXmy8gd:ּj*:g{C-vS @حn-Gd&"m撪ay*_s@)7WvƦYO5ŝ;@7 ne`n ,FT0=" P; 䐏@Y;m1]{EMڇF_McBEG#Ē:sYV&(0@}jwTL`㐔eF늨{;{6ASmoMqq"**xIvLh $".R O LWdXZר&@E}֣$~!5J\iٲ`O ma_t O$G  ?ƞebů +AyZY@9v/h9?yaGkv~L\Py|_r)GBUх#b=kaVQ14v!ia/;F;kuyX*'*Ϛ8q$D~ M,Yrikv&eVBTsQY%DփG }0 L-ثT r֮]i)b,`rGq'(đ.F߲5X֯k.AWNޗ7d6DGn1Y*`7\HvACL9 SWC0ֲZX5ߕ k/o[h%Fn縎g_:͂zYHQY6>1R.FG!ӝL|Ɉ]Xu7pފN 4(=KǧYH]{,}`k ̦5i (`:|\Mj< i8d*u @VMmuowA,dTP_v*UثWb]v*Uثv*UثW7Q|-<\GBw{,zv߻opz%gixu|~?>~:?z~=N\=?Nxӗ-\ O+} #p.48BK-ϖtrhc#tr~wo.׺O{W嗞?3ڜ-i$um$dWFUC1 Ҕ|=Lp-]lwCqKhi#}Uk ̚W${=]kX4?Yedy+,(jOQ/͋&yVeU+{'χ\Lp剈bTO9b'4> =sM@1Kj/v]cG,zJØN|-~!m ob{cc&|WGϑ,yQ]cY<$ lIž'#31D/s̓/OqO&r\`r/}9WywyeR>r#T m힏=G}φOfMLl4y{گuHtm.G&uoّbb9r>f.iA X;tdg\W%z uO~T/;_|M*%>cW6M#a$v?f ֤Ҝ_ T =re;S˗?T3[G b7=2U2^FӒ V1(`~YWh5')yy> #YGA=_|v9tvO-_ȿ+GJ]$%ji:N7ؽO:G¼8SBu>?o:t)t:{hYy!FebVa:e5QՌ:}|>'dEg$>Ì{WUTa*v"br6kDNJoc1}׌:aVCsh|9kΪCфmyl>Bϖ϶3˟Rna (}kWɤ0(D}F2J2Q Yrhɾhύn14\](ATۮ|ߤ18a:#1^<8r 'e1(2#p᜶ل$UӺItXֵn-voRGQȲrNgY=46YDX8sS1ۃt̛ hjK-όnTu`M;o٠cM91q  J$D|:z\YN<@d7rX}jtحm4?7os#Kޯfۍ0&[{8OWÈpk;wc>p~etk_$yZ<(1 fvQe;&O*\c3xȽ0F3΁1i0rF{_4Vo}#Rqw{Ue65@EZ׊ E;T/d]_iєcg#a #%s^0džC"bu]v*UثWb]v*0PYUQVcw8WyA|ɦ\wk'o$oZ*AUxA'>mHzWVʡԂ(E{W7XFq&)W˖?^DM<W{rXzEt,$Ĝopd/[o'2YDzgCN*?#?ιEm)9CҀҸ.g@#C˼tZ$l"y+ee jם.\2yGñhiPˤX$؂+'%n.[jrDGG; 2"|L!A4OQ{^Yer 9 W QS>dԭ-&VJ<8؅nUL&ŗ"oҾO ~ i$kcza!FM sT{2 ď" y7U\91N'ď>~ƔlUgX*\ laA! v?<2x ,nDRI{X߿n<}GitĬ7J,PS$f9ăݣU Kb}'_{5֥jDO<2/fb`{ C $@#ھg08e8Hi:w -/STQxW J5=OS_{6I$nI= 7]۹aF`D"1F_l_hyCʚo4+]Lsrfr=;PƒyivMvc'^Ctb,ty )r?0WbT+YbQaP{hntj&)d.'{AQ 3q4C A|t=i_|qχo2T @Et?c6[ $vN)&u)n 6qca9"&,M %ʖ~ ??moFe_h3?n_xd:ldkc*M+uY玻v1CQ9d1 m<]FÌ|S3ou]v*[dgKDVUCZ)Q866WX9feC++ R6  _]v*Uv*XıE(u)_oymRKxSx.|Pk@@޻-PG.{>Z\Qa9XsscݘmXvpQb X jܸ;}(R8P_T,{9X`Kǯ!uQ1 %志:|{ I;]6dPb] Ҵ'0tYb9dnݧkvDe L_{g:7b]<>?!aq_/jϥ_gPZ%JхEF=/kg\b;Hx۞u)޹S@vߖ]Ҽ6-P@$f.YGy}0kLL /`ĦoOݞ{/$⽰J?S=>G<\6YOC%ؙq9rQߋML_:nABXyqW =?H=!x/nt2yPJ{n=y2J#:~(䄹J2 "P ?fGv*UثWb]v*UNo7[9Zy~ЫI_\Vg<پ_g5}/Fg9:}$|9+r]i:ycNUQJ|dhٝNFz~]dI >eQEݿo*ѽ/7weU 0JU%IIqbC=]&eI#UثWb]v*UثWb67Tj2Z^Xe#vЀăM1y^іmIo ݏ+C0u*}qwk 2T%Z O}ZY,&@~?:mtN;Wb]v*Uyʺ~| s"8b5)Dʄh$:ϜcPǕmHcu!x&uR7!Jgbsb$ sۨ67aj4]nAx9?Uc]ƥW'mm|O>U5&ԭ5ۻ/(@ d̚a^ZsWRrI-%Ə,NDXQ罢D8a&=WQ2v*Uثȿ>m=)Sq\aڸ#.^h)3'{{U&9k+?&~:B8{?w:ajm( -ī>'f( Pk!:xr_*A2<89Ǖݨ V-_q IT0.=NofPi/BACD+-ޞqg^>9sWXar Ϗn44Y= ?,H8LG*[]_Ǵ2p}^眣??ϯ#~_M64k5hXO+.u=쎷KG377Oɛ~C_-v4]Iѭ<=UeeC"Egʢ>TO'e9R/ʿiK}F*PKjCǍ?يOx'ӟ\CO9khzD hcOK{Gf|LC}|@uϖ7u%m-{j(\#ӎ$Ey^gӎ?TSv)nO,R<@,?>Fg#uxa忟X) >. Z D\~փXzo^0|\ꄍTC yWSzh/4D~{8{8ȍkD5o$y6mΜWԼ-^eAe6f˽35Z%qEDog̗7SIK31$s8 6܀ɥ>V~aihuYRGUwi-wc9 vyg%.tHN],27eO1O1fkIN[x}RQАA8l^ D>57Ϙ'?)yvL#ԋ07瞙Ξ1QRtj#c옏bV?6 'EcA5*)fP㏘^>/-?%+}Vʺ k#CVR\P I8S˄<ʝ~qGq5 *RԮⱰG(fca<24KLo9g-2I]XUj'%yX{\?KQ1wTD~1vT弍}Կ+2ncceiPDWM,У:|=\#̏e쾀m7gm#Ӭ^\FsNh{#ڿXc@|nr>|˖[hag8;>`}_{;/Qؿv_~^P[Qk\TgI#b% F_i;}B!q?x>csN W0y=g9ثc+}ZImJ&xE@ܞ@ wSPHm^!E~t|yG4DѼBh䅬.{I[H%dVE֎q݊2}[HW!9{NvhFaߣ:b]v*QYPu Ykrwv֍atR dKFSbr>&Z` ]e@pY)B<.{QA<;=@Ɲ\CE&>#Cʨ3&?Vk>|rS˽O?>K8햣٦'_ީ)LY ɕ lzbbEE/;U;]RR+{ht+4I$m]U,y*UثW~n,<]%9s4F3>z]ymirY%rFee 2aQ;wdbma'o{;y=Xg*$@'z)H`oMx"nh %A?Wc 3CΏ^O6ÿ05?k;ve1āċݔT܌v6<952W-q"\ϙuXt*V H0^Gv?1=i̟,Cս :=I Έ?1oG qD YE2UD!*[8Fq1EҨYuM>EOG.ß&12#iGDwFyhFsc\iN tU_'=ٍ,41( |ޟG 17K]O'NȚy&ZwO_[n()Sڝ##B7OqK=nl9O'6?ZWt*Pkw5H֪ d\+˖<{AٹrرŸ<<ʝa _ZwkwZ5/no@vzOjKI8eGቯ.Јeʋ cDh)@ɥW?/=j=V)xLiUDP`Fy?>kZ1Ċ}t~\yLcT?˯!PΑ P=X.i-U4Rh*~hvֻB$nA˨ɨ _#گ7/E-8V0:VZ=;#e飆:]OE0D|Soɟ-h>l42Z9gY=!pbB:9+CR+L]GLl/X2K"co?-#ǭNX] zhG!*qP9NCZW8ob[2N,Ҝ IG#gur~|"H|'ߠWWZV[mkL; oAIe9ǃ-Z8;002Wq㠺uiu`lw/yڗ[83۱hIQdGRNb6;gv_ictʛҵCć*뾻b&_F=uҥ[[gB5?H#//p}tݭ1W厕ت Q0H ++ʔ4ZfcOɈPR,yrܼ0G Dxe/юP0N x;O'?2bzkn֗W/֮(sF  55E-dcPpߪȒ?ޟN;zTb]v*ԭ_^KnXփB~Af,18bA_ĿqӛP ZKSKn#Y!Kɋ* u1Y%21Vvm[M$tڂ%>>*"Ilr&m|A;=z޿y?]8L˟n0<zguY}v'58o`=$^hiن5C$ J0Ө9rʓ~]/Yu}[*̒C*FvyGݿ䔡$[}oo;t TQAyW.|ɭykwM7Lk 9HY.nY#Sʝ9 0`}R}u&cy?ֶ~j՗O[1@M)Z+jE"aZk})|Ow7QO<Ƣ-7WyW#VfX)Ă5 Cٴ:y3}*JфJ2#~>ot/m%!W?g7uJ44vC$ 1QWy~&o/u qw)F,@$iqB;rv \_F'<3%輎%?{O O@EV˞bMy4bUqI@:,9+t+_YtLbҽ܈;R'}ϗvi :ZW4RH=ulZyb%Ћ gT-櫻_(rDZNGaTZ+tjr_j}IgQb;sr{?pw>:uO]O:Z9sG@~~AWOQSgƮxr__ nVG#..A>N%OFD}:yϠ64-c̚Fͪjw!p/'`]NcxLOg8\{*O_mKWGp8;THڗXWw˭{~Z..?:rP}hZG=BMC`:If'rI;z.YJ\}sf;6|>azơo_qYlu J =,= RqyZ)Uk"*V v_lZH9<\xW$7 *ۛ]Ko,#ɿ&<{/5s_y2/$[ZvW5(D\#>*zbIuy{wM8q2=@]wqOHUثWb)5Oicj LgI\q6uinz@JG@Hs:Y/+TC5b8gGzӷs4Qˈs$^hBCͮjVqeX_Z>H^|Ge DAy3Q;o y>Iuo2IneI'n%EbӬxokf=>L`_??nZ7-Zh.G( nnijSƕ ?g{=wϫt8zf>PҖi!~MBG+kRZP_ޙaè(bt߼GoL#jdz9?_pi-Reb"9U nbe<Q)2.\wΫ]]/kq׶Zݨi_W d-ďHFSţ QA~m< c3|zmUsF98`Yqp%h ]lV6W1[z,$l?䧙#fǒ?3yOY&FhY FFGM>47Ϫ;fp=.~b~]jYI g5.BKFK~5]~走&FB7U0NÈr#c[Ѧ g{Y-mw RKi#5H(VdrF2FWnҼ4vL: rsH'/ jmZt1ꬲ0`~DgӺY b#= %s'ߓ>Ww-KyFq$diUj]#}CZ<_b:iπdžuvH Wqk:}_g&N(EeoЇB}5IwY#y(PZ[Sk>W8[Uw}>M1Jw֟wsa{YJ][H(ua؂)ɏ$rDN&E a=w/%yI>3zׄ741;Kuwa#_MTd@n˨'I!zt'FxγnH |Ĉ#y&<YhQ_ iYjo_" >)lY.ؐe`s} mUt6^%vŪ-XRP6;}{;Y=8<\5G|,ݮXOqՔ1AGH-m, ig8*TI⑗z- 0o* TN'n<6mgNH4LhM\r :S~@X3ꭁ{AژqV<ջh)^ #WXu8t4M7􎱮yg%Ro%"I%0ຟI9\=N I3 d97_?'.7y{Ǯ4r݁<*K9Pw^o>>#:^5)=F8lvr1} n]v*UyȚ?5 Ȁ#8XXԚ@Wb]59 VE%_{: >)ʷ";Gɂ]ʳ}_,{?R1r3*#-yT]H?3*#-yT]H?3Á yP:wj}Xcz gG(ygz<ϦRhu+UeЊ RO]x4ij% c=)ɚ0;M?Kϖu/cwHcǕ )%y7 F}Yǔ<+<Ǡ^RBLDދoJ27F{~؉`wchd .Cl˚<ưFLk"v`0{KM|;3 ,1qGuhik%A*Aj PdYb0#;Ʊ呈Fiai7z㐢M7 ; ::hq嘌{˜r4|WQ°0e .w` >1퇴In.WO{1>eǜ5S:uMao$K5ո5 ^B7;fF9`*\D k!8"/0m>]/Påirm: vz3FMiūg2Bx1"xlOk_\OTv\)DwAdǍak62T .'3tꈤW|Lz|گlR%) >Ԟ{B<&͓y#|+MvM궺Ƶ@9\Ep4)EEVg= pK ёH G+;W=އ] E՝݌o{k5}'FmՀ=ұAݸ fVn#CHhڄ;@$ {C9rn_F.1!#7=cY4KV WQ@Dh;IݏP(ik8q/?;&42Pn]Z T-TY[i7,]/~_zgτu$<a桥2W&aU$gSK$e;wC'AI,CRAX\j'z( ޙ6i.mQC WX;=+ źg>1ӑ'J]}~T}G}umQ(/|uZ0[i? .-pf$U-S9>{V:i$FDzMwMxyâH:KyݴNQ55dz8䌹R` 4fK6W3Z;ˣ"R"*wH5iNlÙ5dQO/Z6:ewV/+_Z8e92cɞr*DwDe&a]BD*f3iRJ)AdU^N8Fxni;CK.Hdh甼)q c P7#^ x.#(Fk}bkoۿ$Vfj KxUU27PRϣ2k$<^~/y'|ւ[_Ғnbi̢f<e2T]FFdMftcߏ6No"%I#2HYej 'sժqs 8vz.I]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*Uv*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*Uv*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*UثWb]v*Uapr/easter/bluedot.gif0000640000372000001540000000060407071364523014720 0ustar affweblibuuidGIF89aĻ篫詟ӍΈɇق}}}rlhjaaa`_XUVWVWUMHGEDDD;;;:886z322hw---#I\EV,@@p|Da8lPШʊf`H0 DA Rt)b(UB1RzB}~R&m$P15 #.1762!LhR$nL+mBP- "P.  /7!Yr~042n%-T/146'L !!YB췩dA;apr/easter/easter.gif0000640000372000001540000001330107071364523014543 0ustar affweblibuuidGIF89annJcJ{JB9ュ{sZRJ9){kJBƭ罭sRB91)޽޵ޭZRBֵֽεޜޔޔތބ޽޵ޔsB91ֵֽ֭֌kZέ֌ք{ss֭ZB9)Υk91ƥƜkcZΥΜƜƔZRJJֽ޽Ɣƌ{{9{k޵{skkޭkc֥{ޥ{{֜c֔֔֔kΌ֔΄ތ{{{{csskkkֽk֔kΔccֽZZνZZ1JJεBέB99!,nn@H*\ȰÇr]<ȑ :4Р#\R,eE06M;A$6uI4|Q2&*YJ[k׺=R*v KժuԦZذ.F(jDt("yyAE4K]XR% )j 4SA6 h|fi!A'lvA6dt((c\B".:Fj)멼ni('.ĒJ,8^j`I&ꆐ :9bIGPN *jl#\VJHV A <["ɶp7+q5դd -mrJ|M5"wrW0`U7] p>> YP F!ǃ9q1W*61oLJ\r#ԖhOEbw`q$BEM7iA^H1  M4@= Yŀ b6FM< $}A[ |lC0?@4s !APbP!xBiHFsc݀I MOl r [ /C!AhK"-чY%{@HT}JV>J @-p'!a_A HHHad)H:' Bp:ta S!H4WQ0G)$V~ (K^!@j\ۀXūc?; (F `B 7+Hfau <$,hqY$'IIZBC&`Mvҍvp IMnB$KaI,)`HY(X.w^ry8_Fbmx|,dB$IPN ;NL28c%{n{FU s)' ~V"rOAt-,(@H s\bʀu(͘>60$[ ?Q\d⁃Z z8 pm1aPhCıQ1!l ponq ]󦓟.&OE2s|D0Bg1wu`-ڼkvұzpƁ8$t ,14iVKl`h ,6ȃ!f8Wi/tB>묱.Q{c(u@;NXOKYx5|CO9>bL4U,mhנCS2f4;;1t-&Hd)H OC@e& KPC 'GJ ",HE+[9VHa{ $$ ?FB>`"z V@?TD2pBH,A HKjЇHt H^ P4PA8CB eD 1ILH h;(<D X%Q iBB0FS@d%A @-cכܔ TãUP}&ԤWDk]o|#?HԢ1 F+ |D5$8fٌj̨ru-k GW!܅sJ0a,ի궩.EWUBuAMN7Yma8I PX#!rFaQzEK8$,R!8"Z@+?x" ,(%R߼pDbq G$ϽwCH._ĭ}YMx09d{ۂ{{AOn38QTvoZD(%-ԠKsy#RĦ$B 'T5DaH#9%9@0]U4DU50YW YqWO/ ` (1d6<lpRs7~#}#PO+22`^!"8 /2$5*SUb C:'urpgS1|/` 72EC-38gU:q=acY6(0F^0;~122 2RSG522=\6y ReG3>`8!ݧS8)!2t3yO)a1$Q`Y±4bp<~[x`M׉.V8[`X:rW>s{axT3QS7 06x0LXUgU{3wH]6pWE5" 28  U0oP>q @sr1\x!kk\u3`<Nˀ XWKn=NYW0xC>a\aaZ0A}e  5PP9!E%90mA:3\tYOG PThQ!!Za}m!)SqkX"!Zر\T 𑵠 ; 8 7p 1\ \yP^k`=.Г[q 6   K1ٱ`9^:`dc#=O Ua! 0P;Q`A 6>eLV@v 0.dCb ac S = 9AcA KFpIbმc/p ;p!b:󟴱 dؠR)ǂ,G&a?WZ%`%X?fppt.2(p> `'pr@gtLf%?i#zK'@t Iim pIpB V {\bY+C&$oBgRkjjB$O2 ]PMj% `*e2$G$JrL&vtj`$'K6 !8Ҳh`%0 $j7AWVHb(+>7ktBm@/*v @PP/T&m&+b+wBpnk‚FȺJ&tCh>BpB[0KCAb#R $ pQ+RsQq@1Wq?ToԫNQwr-8s;(r(tћw])/xR'|bptQ&2+ҵ E9g.d*m+KD H2 7B o4,*n)Nb"B,f Gt w(bp&8$cx v11*u&,+íR pfF:|.NG>'F,F 7r-wzْ-.PH \\)Wed"rK@*BƄzIC,O˴7 w]`> 0>Gtu(` \ %0R z,g|wlCe&w,v'ʁE"-$ 0-x\Au-9.%jW,hT"uGG]#2{r  G-GZ>Mûv *-oE{C~V -Ph8TEUQeQe >PM'PX  P==Q2O8tsce <>@@;#ԇ}NM]+`~'./5O ̇!&?402$)`g/ Mg3H0?|4|& A,d)0 )5 ~y8)¤P|+R=$20+|.6P"z.0vEO/r+FbS-3hyCx( =LrF5'q然5QC+Մ 0ՅP3 ؄{)O_ܯmPF Uݫ1M|..Ev-4ĂSR8N2 EMz5.+Њc}p+s, 3.hn+PE30ކ{N'v ̓̇N_T D3΀5s'3x");`x0PCl}?=txٴۧ}wWS2ΓSSs0=?PJc`5PQ膺rH(ǭQQ*[+1 #S4ӈވ2IcX4ki6=wrngӜ轸N%~ 4 N4A4&ʾ8wR2%>/$S.NKb&K2.Px@ ;apr/easter/eastereggs.JPG0000640000372000001540000002150707071364524015274 0ustar affweblibuuidJFIFHHtPhotoshop 3.08BIMHH8BIM8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM@@8BIM  JFIFHH'File written by Adobe Photoshop 4.0Adobed            "?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?TI%)$IJI$RI$I%)$IJI$RI$TI%)$l{kK7cloS)XuzIRI$RI%?TI%)a}pzzneuQ?"^Wo~5I; &rQ`SYuvapШZ݅RVr(S5D.#QX.VCm,i{C7Vu 5oge)LHc4\:c;7OITb8בa֗4m]Yk9έ!d^X̀Gg3kͰU@k q~X[w}J#jJ+_uOCu1g[gMg7}!G}g3Oe[\+Vun9rMkjmQFD^qšmMQSc﫳B}jN6<ֽ[k9YvsߪEO/{kx5͕c:W0*i5߲cy$1]Ms̖DsD- Ux5P2 k5|h\\WÒ8zzhG2140X$mv1J9:ylg$*=?tkM]?4[]||wXLDRy<[=zLt_ӭkȤ]:>~νfuN] Z5̰;ZC_:YLvVmWA{ag2[,Bzۜlq{8ˉ䒋OԞ+f=d2ӵp_~m p@C=+\5+յJRZ:p]^z*:GwS^vuTwU]r485]g18^9Rceuݖ4=\\ހi=45A% 0_0!gXSsI$TI%)$IJI$RI$I%)$IJI$RI$TI%)$IJI$RI$I%)$IJI$RI$8BIM'File written by Adobe Photoshop 4.0Adobed@      dd   s!1AQa"q2B#R3b$r%C4Scs5D'6Tdt& EFVU(eufv7GWgw8HXhx)9IYiy*:JZjzm!1AQa"q2#BRbr3$4CS%cs5DT &6E'dtU7()󄔤euFVfvGWgw8HXhx9IYiy*:JZjz ?v*UثWb]v*Uثv*UثWb]v*Uثv*CrK{(h.VSԥS!*HҲsOj2p=/7{?Q9yw-,O4tOu}^Qo+p.l.gcD6ߢXʤwe{K[!  ]Ajɥ<@|^gJލ4IjZkiO%¿FHD<ЁRVyihVC 69*,)A33$qu/oʝwPGPS^j Zi}o=I d>WIDr/sGW#5<{HI$]j1C)ύAGijΛ =G=(`e/0:|I_}{͗^e5GP=_SfhĤ3)b흟`fr_7--y&.n/t[xBg7 k2'8τrOd=grjg1Rl6/|s~\ Agg-%Ԑ)!TU=k;GKNJv@koj##*k6._Oϟߔ:?<%WލC%+JBb4e.4C<=`}ߗ_󐿔W|ȥ 4E-w Zs :i}m+>gm{=>i"7P~,߻!>كIqDѿw~RU=;ȞPԿsOu[@QmR1k#I>{p~Ō%(! Gt]tM77WM'Yi߂;9'­\~Ȟ@\~v>3Znʄ2e?8c03u[ rxxXDz^}0>GHD/)~[~^꿞Zo統ү;T֧>V8D*9+S3txq2NF\_>G:Ghbll8P1z+?ɿ&yOD7>d[k+ۡIIt!]қ(ť5xkxF OSLV6"PG9R?:'<\WEx E9AtP0L^[)C5X9y9Y[?^_ԧ_+ZΩjMH)mudY*D۟|} ^hS \I߯;Z pG `=~AKr{ם3|{>a0y<堽tЭK*4whGHO !S2/:?h\8`a ߂<1ru_{?4yOA<'ο*?0両]՚1̶Ü/ئi%Q=AOwupg/ŞG$Z8M2g&)x--rm.[8anr~Пr"IۦoͿ+?7wO׺i@GŸ$j+_ƞx2>ގ6QR;"XɎhQFSЫ0n:A[=44\"iBg?=>z cb=@/aǡwyX9qZwE{QaCBAK?j-kg'D$"GI>߯q$^&0ց8'qd@A?eg=d?A`(|B̢Yn|}ި<0\ 9匣!=K55i\_ւ㉈+1+˗DG}ϼ"|s%1+\S<1@5u\Bh4:c~k@ij4/8~R藞w.Zyto\n#搭ݳbhPiF˦V^̝GME|,ϐ.|gq<Ɖ&pY60d&>,r-te?QסCl>nmPԼ+E,ZϜqyy[/k12"ėDIpr=g{?73ӻ>~bWFCG?/?+tnOS%T+ŷviP]mpgy)pAϬ`~XCwm]D ^\'o{85;kvf sK`E9|ݧyoUQJKyI$835݋>@y=F, ~IygRԼͪdZtm'M71sLHOqeSUIG+>v>],e(!@~e;E< b {eiiBd))؆22 +6%=r]RP<$?y.ڴH: 5%3]ߔ+,fh<\6A!0*?>AO`p_$(- ΂;>*X qD,ݡ+6,lQ(wQрه-r1giҺ*0`(%uj8qY\^+ȏ%#a!;  )R|G6:B[ IcYJͪpʀk(SE>XB8¤4JNSxxŽf\}Vvo9w]z&F2Zi'uپJimԺ%6+>zwlӵ;:6v}<˹]kv~weV}*:hܶ'4;ޮ5Ex%nzֶ[ȆkWU} :~/Ҹڐ>i<'?G]m7nLR+L{wɴ[_>&P_bf3{j4'a?}E!F>ׇ&}3z>YyWxGf5laRyr Ȁ5reYw<IwQw{Mh&LeSt H}PO5~*8Ey3&_ł7?yJwUSgSZwԃAHu緁M`KG+T:H8Nyl|WOQzD$GeX\W2wq(o8vwPqE7TC=uYt{lw[MALNSeT|Xic(~TaCtф_}wC50(x&PRK 5K!%2%ċGxGΘcEjJA 8]CH6T1Lu(H/! eǘ|w֓)2TH}($V؋gMGM7 }u%['(!8JOюxRx, HAn!i$|HJ +YH!hRюca2y&L&5d=U~ebYhu^Y[b'\xe9uj[fɗE9: )HMd=9SY~h)wx@t=.T|`ٙ8WII#\E(y MrIEfyybbW794#W>|vȄNؖɆb]h{׋xQPtS8 h؉6ŅDz~8W f̩WP8<1|()hC>TxlȞUnřVw)јI%h6'wYbwɡ#~R|c!ڝX3zyv&Y)'gn8fv曚yRD'zw~9&hyyQgs5Ӣ$Xwgҹm]YĘf%wzWZgj9N?~xzz:['ᄅ56Jy{ZgZxc iR74o:Zz;apr/aprilani.gif0000640000372000001540000000304207071364531013574 0ustar affweblibuuidGIF89a^K! NETSCAPE2.0! P,1H1`(jY(hj0}KʛO5_L,`Ң4vp.a]XPj^P3Va\5rm|U)Lp7'wrźinζkҧlWrBӘՑujX[D)YiCb0B!e%4D#WL5#(HdL[%Ĉ3,RCJP=ZB榆@Gr%lӰD۬AF5p<0mkύ^vפvGe&iY*I(~6bzKK^.nCvWE}ϸ:&MZo7fmc#IkeoƓU<4%l|˲4恔u+X2 _]Tߗ'z?yB\i9>exTIVQׂ! P,9Ii8{5divVb#WjYɸަVhBSpK:?fMaMj4$Ukik֝T=A4in-ΐ­c5bvtb0Q[-)Mߎ9./C!of;apr/index.html0000640000372000001540000002135607074341007013307 0ustar affweblibuuid April Holidays

 

April is ...



Find enjoyable things to do on Easter.


Kid's Stuff for Easter
At www.kidsdomain.com
New information every day at the
Old Farmer's Almanac
This Month in History at
The History Place
Send a Special Easter E-greeting card from
Blue Mountain cards
Easter Recipes at
World in your Kitchen
   


 
April 1 April Fools Day. Send a friend a card
April 2 Daylight Savings time begins. Set your clock ahead 1 hour. Find out the hows and whys of Daylight Savings Time
April 3 The Pony Express was established in 1860 and would deliver a 1 ounce letter from Missouri to California for $5.
April 4 Tell a lie day (but don't get caught!!)
April 5 Booker T Washington was born this day, 1915, in Franklin County Virginia
April 6 Sorry Charlie Day - Sorry Charlie Day honors those who have been rejected and lived through it.
April 9 US Civil War ended (Lee surrendered to Grant at Appomattox; 1865)
April 10 Publisher Joesph Pulitzer was born in 1847 and established a fund for the Pulitzer Prizes awarded annually for excellence in journalism.
April 12 The first space shuttle, Columbia, lifted off the ground for a 54 hour flight. (1981)
April 14 President Abraham Lincoln was killed while watching a performance of Our Americian Cousin in the Ford Theater in 1865
April 16 National Stress Awareness Day and National Eggs Benedict Day
April 18 The San Francisco Earthquake of 1906 caused mass destruction and the loss of over 4000 lives
April 19 Oldest continuously peaceful alliance made by US (with Netherlands; 1782)
April 21 The Red Baron was shot down and killed during the Battle of the Somme after being credited with 80 kills in less than 2 years.
April 22 "In God we Trust" was added to all minted coins in 1864
April 22 The Oklahoma land rush began at noon in 1889, as thousands of settlers rushed to a claim part of 2 million acres.
April 23 Happy Easter. Things to do on Easter
April 24 The Library of Congress was established in 1800
April 25 Hubble Telescope sent into orbit (1990)
April 26 In Russia, the nuclear power plant, Chernobyl, exploded resulting in a meltdown of the plant and evactuation of a 300 square mile radius.
April 27 Samuel F. B. Morse, the inventor of the electromagnetic telegraph, was born in 1791. Translate letters into morse code with this program.
April 28 James Monroe, the 5th U.S. President was born in Westmoreland Country, Virginia
April 30 George Washington became the first President of the United States on the balcony of Federal Hall, in New York City.

apr/easter4.gif0000640000372000001540000003346607071364532013362 0ustar affweblibuuidGIF89aP;f3̙f3f3ffffff3f3333f333f3f3̙f3̙̙̙̙f̙3̙ffffff3f3333f333f3̙f3̙̙f3̙f3ff̙ffff3f33̙33f333̙f3ffffff3ffff̙fff3fffffff3ffffffffffff3fff3f3f3f3ff33f3ffffff3f3333f333333̙3f3333333f3333f3f3f3ff3f33f33333333f333333333f333f3̙f3f3ffffff3f3333f333f3! NETSCAPE2.0!SCopyright (C) 1997, WWWeb.Ready! Corporation Visit us at: http://www.web-ready.com! ,P;H*\ȰÇ#JHŋ3jȱǏ CvF䵄$EnYթQ )Њ٘4`KD\}z˖mбdV[p+x0\cٴyҧs -[sVIH勀/I&VܭlйM(햲k׶VxvֶU+noW D\ѽZ ' ɺ {ȡՋzVny_? K%wVcMV[gkG^Y[הdqU@׀f!`+Rg[ytgbzFنo'^DcNK9꘤kĽIm(= oOfˍٔI?4^I%d )ؔb! p}y ]S)Iƍqe%8Kp>ƐkZog.IuRT(aI:eAKa(~ȥD UUں~iDd_!\n7KB`qTk\|b:&{t~8P`k 7x>jfFWY"%vlior%~ES(bKښR'~P!Tbu *7\GfArUҧt:)oHX~[0T,ý]?1I ~H+-[Y@Zy've: #ڧF)} Vk|%3I 3:O.We+ZPHkY% `#QS= c{A.VpDn5_@(i5i*}ҵB"pNݸ^@1eEd`tSnn%#۾.찟O:D)wJ 备FY^.DMK}$*W۱ˇgY~PC|p[.Q%I`G#ZnY^)) | L\6ΑtIUcǨ !k]"+LsUޤ*PRf—D"kגYz`VE1% 6,ݺsIڴ֊.޺]Rjյ+m勀/dL$K w~ WÜ9\laTSV+OdzuYf_wet6̉\Ҭ^,< ثpO5͗`o_}Ɂ9WUlݴ[j9=StX`U!~Upzu o Weuf\s&q`mYU8j?Y2 Wa?"9 VO 1RQYMvڕG&$3eGXJT^[5hniJ9cɞtMe{eVi1'lgrߝ{iZc5(XCQ:fpqjU֔] ` Vp~Sd.qZ6$lKfڙZi`v!l@Zva!] ;]k-jGZ[Mfx)۬DnpfJc쟘zPh [\Pf)Ya,LVUJ*Cem?9\kllfі~]sV|o$ov^Upt!Y-[Bs-9sI ]GaSK&]i%UItu3y/eYpa<1T{P/)8༆0~\g`&c~j:b+Fzk gzM"̾gfWXgbʍ Y\bbETm/ ~dh1s@Cy {Ta  O+$`:!(Б")_Ǣ󿇬n7A;㳟WBS*\洤nXIqfdNc) B7X!0 0ʄtc)b@?)c C4cuqD! ,P;H*\ȰÇ#JHŋ3jȱǏ CI$k%-$haPT@͐/WQe" ^~ +VtƼXӂ/UeScjݪ)RJ4jղfVy0WK%SXNV2Zu7 |lD^:׬Vk X0*j2@+ץ0x 4¹>~|j^O:+Qk%lѺ-ļJ/{D[F utvov5B _xp5.'POUEbǟm`AAEX&_TLݱ%2ixZi9%V]_LFlu$xdj]u(E ¤/$5D%-p>B~e[W"Ԣ['WE"\ jIm0}J/%ٖbZڅcQ$H"9'{~yM1x#oHWid-v"iIo)VGylUbȨD@B* Qj顨%J[ZAHꨄ=ibi֩iif)B+lIN].ɡ[AGZdNxd=TJŨO`BkR2,j Uy7ns.y좛[j)[Hq\:IpV{)fAga {'iH@Ӏ #ԂU=g{BךK^&B 8 `VM u&Em6s&4^K{V!M}eܾlA*d|59k9SˆN.?GToݜWcU.W\{{ލcU bei1_ v\eTy3jf}bqkKC'Y Bh݅x RA3kks9 Z :4=D&2sXFb@@Aa Al$1 68MK L"FZ|D a+ J1EˈP[HXF! ,P;Hk *\ȰÇ$\0ŋ!^@1Ǐ7vI„G\Y ,cfJE8#`ŦB@s B/a eI+z:h!@ K ,*qbTb06 <+B} bDꥪk+JD4Ԇc-X(ܪ^ mYy~S_ٴ5~Ib QuJT}6֣* |rhhRNƬZ|НWlU멩mqB[@aE݇j额R%@,"qqmVVEF&m)Zb;KW|%?m{݅wf qf~)ՙ*_22zy!EZlHedn?#gݒ6HpY"EU0puKze ~HRwإܱԛptaE ~Wnؐj]ibY瞯Qtj'FEM5:E#0ՅmGWAS] O<~ٮ.dž٤]]=C׷-pS!7{r)nS@0 _4t[`+tAYC"z皠ED} *0[C#93L 7B ce3MBB S;ap.![7*Qpz]A E  ;%I?| RA(@|Ȕ5,d4OqcI! ,P;Hk *\ȰÇ$\0ŋ!^@1ǏrI 9vZ7)hJG g_B:` f]'jcF@bZnFkffvU_k*YZ\Lk C^~ѪqiF_%瞱w'U ٻ(%e&qڪ'o\&5dRw$暛'J7?aPHjl՝덊%GGV̙*`alr214tSyӘnz V]15kYҒsRuqm}!Sӵ_`SUrW!ȀBukؖbclkV#3yy{+l砯j`NEM¡. Į^V~PUok-5_e(if˺6D9/U Y =ꆝ{-B 5ur$(S ѻׄ"@G!H .ּje@AKt'g7sLf&BpS(L!buFer1|XS&N=k E @ ?G]`K2bA4J(A[$|*dt4gaZtI! ,P;Hk *\ȰÇ$\0ŋ!^@1Ǐ7vI„G\Y ,cfJE8#`ŦB@s B/a eI+z:h!@ K ,*qbTb06 <+B} bDꥪk+JD4Ԇc-X(ܪ^ ڴA2g|$A9Yh׬XY!G#>TfI"D})ԩ`%kq _%R ߻wOFK8GݫVƎ*k:)m{Vbw2鞙~"㈉Awc/PIV\sئ.F%en>7kCū. N~D[c/_.];b块w{_gQv~P]BiW_NYWZLX W[]zAC~,MSqw)XQQB2>#l)Dg)&&Uіb%i%ZGhP-֌GEģgB%pmTCN d)yinUkHu ]m&u6$5tƐ6<[,h`Z(xb<2Qt!eRm)]ZZPs5P0 xiih]鄦k,P)k^|NԜ^T)b]ɪoJKnDGg2fD$\c&|n+^BZS1߾1L'BHh\fW p7I(W"~d\ݜV'\dD߷q o|p<4U*u":+(pY7~=j](jHX9U 0hJ$E^%"w3H;+G840mr"7qB=x (~xB~|J&*M&o&NH1kHv%D~8P, D=OXEq'pZ3spS5^9 5 d{Mm E CH;SvD$/,lyU4H)"ĞH6%XF-kC8BeOűcH! ,P;H*\ȰÇ#JHŋ3jȱǏ CI$kHZH4Ȕ`\@͐)+2/>]zYΝkZ%Q"+@]# VVt)PR}j Z%ړ+WKJ1Y|%,D^{([EMϮ>6܉`Y)_T/SkV4c>&\J^zZ+fwmoR=!7{ۛǓώɼqچn2u6hkK;[{r9C_TjTFzaر5U$\SCu`j9CU&a1HdGW_ zyF`bVLqw`8ى4T⇈ {UFQbXe;R&dD׬=w ]eW*<>T{(9 |YYdd5r]vnhCiYؐfiGV% ᖢ5EIHhB(f jW톨hZWJ(N6[ tC9: ¦1zS:) o_^Ǿve7b^9WjV8kZq8H@kߜ Yxk f/{+l1(V(C!-`> &#BD*{"jVj%K1"72m;oK %/'1kj!QlkHGH zf[ : ~H0D %v)N<ݷT2s#5w_{ ,/l`ZW#FbqA.9ӤzF(a.L憪YnCYq}rYe׸zlUeCpNޔ4|/ 4`y 7t%]2´}c,r|?t[Ī/ 1Y72f0CU8=%0CX%~nt`: :raa  *K$LrQ13Ĉ$C(VDBoibH".i ! ,P;H*\ȰÇ#JHŋ3jȱǏ CIdk(Qh!@ 'W LY%L79^[!s浏-Y"1X)gƛ,|IhK/VFRN/RZ(UfVugOZz4رiaIm؇_ekiU{Kĝ3NiS>~u(Yc/թS<+T*h״-*jԾ~ ;6Chmֲh|x;]*KSk~mTvyy>PX] odwO5TGnQ[yy~ iXv}!JRk蘅)].DPl(6$0Bc-Ev:dbK&$i]X$l5*ZEiނ!:&]@B l&a_Xry^ XpaiX&Inõ`k剐c&6Ygh*mzJɚLl槜XFꞐޙ[ĭ(d^pBecJSDQouURXʹޙf]hknű!{>b&8PYkTkۨR]wʎ:a0>KhnXĚ ZJi6Dٸ TA+Ӭ%}gU"~D~cƟ?z1f~L2z7o=+ڐqz~T{W;ӊ10梯?֚E`ؚ pʏM;ZШH _(&ALr?Lr׍!1=d\l-jf-ul~]Rh^s*wzK,Q6buz\{@]c1hfn즬'D</LtitEGTUCקFaDqXkt#X|+ N^×5df 5@Q$9!JZ]iāXPmWH.>$3OpjQJx^44$JҭK+SC!F1C)! ,P;H*\ȰÇ#JHŋ3jȱǏ CII  )YyR൛8+Ld O^RiD,|IgJ/N& ITX:dڴOPm(֫7jU3N\& ƴVg|%D^kU+T0z V..b8ʓkŜy%kB`UݩaRGK.DW%Wlu肱yMĹRFKrZƞ{'祜SKܑ[E+?s\*egoIDɇ^DlTOA_Wu6]V}ġ6RAubn2GFuՆyVZxu_WhX!ZY+WaX G)6YْN"w1s@ ]xq]t`Yfht&fkv} Ws^ce-iB_ mr$$tB)6>:Qnn޷^藘2yn27jj% M5Va!*+b+q 6P1fz٬Ҳ!VTJ *$b.5Wkx Ba&CnYyjQNk!u޶lP KӋk OJemRŗq˓gǙ-/%h,cdy www.evansinet.com /com/evansinet.com/www/April aprilani.gif 99.04.01 09:08 B C:\webstuff\Templates\Monthly updates\April\easter3.gif --> www.evansinet.com /com/evansinet.com/www/April easter3.gif 99.04.01 09:08 B C:\webstuff\Templates\Monthly updates\April\easter4.gif --> www.evansinet.com /com/evansinet.com/www/April easter4.gif 99.04.01 09:08 B C:\webstuff\Templates\Monthly updates\April\flowersm.gif --> www.evansinet.com /com/evansinet.com/www/April flowersm.gif 99.04.01 09:08 B C:\webstuff\Templates\Monthly updates\April\index.html --> www.evansinet.com /com/evansinet.com/www/April index.html 99.04.01 09:08 B C:\webstuff\Templates\Monthly updates\April\spring.gif --> www.evansinet.com /com/evansinet.com/www/April spring.gif 99.04.01 09:31 B C:\webstuff\Templates\Monthly updates\April\april.gif --> www.evansinet.com /com/evansinet.com/www/april april.gif 99.04.01 09:51 B C:\webstuff\Templates\Monthly updates\April\april.gif --> www.ctcis.net /com/ctcis.net/www/April april.gif 99.04.01 09:51 B C:\webstuff\Templates\Monthly updates\April\aprilani.gif --> www.ctcis.net /com/ctcis.net/www/April aprilani.gif 99.04.01 09:51 B C:\webstuff\Templates\Monthly updates\April\easter3.gif --> www.ctcis.net /com/ctcis.net/www/April easter3.gif 99.04.01 09:51 B C:\webstuff\Templates\Monthly updates\April\easter4.gif --> www.ctcis.net /com/ctcis.net/www/April easter4.gif 99.04.01 09:51 B C:\webstuff\Templates\Monthly updates\April\flowersm.gif --> www.ctcis.net /com/ctcis.net/www/April flowersm.gif 99.04.01 09:51 B C:\webstuff\Templates\Monthly updates\April\index.html --> www.ctcis.net /com/ctcis.net/www/April index.html 99.04.01 09:51 B C:\webstuff\Templates\Monthly updates\April\spring.gif --> www.ctcis.net /com/ctcis.net/www/April spring.gif 99.04.01 09:51 B C:\webstuff\Templates\Monthly updates\April\WS_FTP.LOG --> www.ctcis.net /com/ctcis.net/www/April WS_FTP.LOG 99.04.01 10:10 B C:\webstuff\Templates\Monthly updates\april\april.gif --> www.daltontel.net /com/daltontel.net/www/april april.gif 99.04.01 10:10 B C:\webstuff\Templates\Monthly updates\april\aprilani.gif --> www.daltontel.net /com/daltontel.net/www/april aprilani.gif 99.04.01 10:10 B C:\webstuff\Templates\Monthly updates\april\easter3.gif --> www.daltontel.net /com/daltontel.net/www/april easter3.gif 99.04.01 10:10 B C:\webstuff\Templates\Monthly updates\april\easter4.gif --> www.daltontel.net /com/daltontel.net/www/april easter4.gif 99.04.01 10:10 B C:\webstuff\Templates\Monthly updates\april\flowersm.gif --> www.daltontel.net /com/daltontel.net/www/april flowersm.gif 99.04.01 10:10 B C:\webstuff\Templates\Monthly updates\april\index.html --> www.daltontel.net /com/daltontel.net/www/april index.html 99.04.01 10:10 B C:\webstuff\Templates\Monthly updates\april\spring.gif --> www.daltontel.net /com/daltontel.net/www/april spring.gif 99.04.01 10:10 B C:\webstuff\Templates\Monthly updates\april\WS_FTP.LOG --> www.daltontel.net /com/daltontel.net/www/april WS_FTP.LOG 99.04.01 10:27 B C:\webstuff\Templates\Monthly updates\april\april.gif --> www.energyunited.net /com/energyunited.net/www/april april.gif 99.04.01 10:27 B C:\webstuff\Templates\Monthly updates\april\aprilani.gif --> www.energyunited.net /com/energyunited.net/www/april aprilani.gif 99.04.01 10:27 B C:\webstuff\Templates\Monthly updates\april\easter3.gif --> www.energyunited.net /com/energyunited.net/www/april easter3.gif 99.04.01 10:28 B C:\webstuff\Templates\Monthly updates\april\easter4.gif --> www.energyunited.net /com/energyunited.net/www/april easter4.gif 99.04.01 10:28 B C:\webstuff\Templates\Monthly updates\april\flowersm.gif --> www.energyunited.net /com/energyunited.net/www/april flowersm.gif 99.04.01 10:28 B C:\webstuff\Templates\Monthly updates\april\index.html --> www.energyunited.net /com/energyunited.net/www/april index.html 99.04.01 10:28 B C:\webstuff\Templates\Monthly updates\april\spring.gif --> www.energyunited.net /com/energyunited.net/www/april spring.gif 99.04.01 10:30 B C:\webstuff\Templates\Monthly updates\april\april.gif --> www.energyunited.net /com/energyunited.net/www/april april.gif 99.04.01 10:30 B C:\webstuff\Templates\Monthly updates\april\aprilani.gif --> www.energyunited.net /com/energyunited.net/www/april aprilani.gif 99.04.01 10:31 B C:\webstuff\Templates\Monthly updates\april\easter3.gif --> www.energyunited.net /com/energyunited.net/www/april easter3.gif 99.04.01 10:31 B C:\webstuff\Templates\Monthly updates\april\easter4.gif --> www.energyunited.net /com/energyunited.net/www/april easter4.gif 99.04.01 10:31 B C:\webstuff\Templates\Monthly updates\april\flowersm.gif --> www.energyunited.net /com/energyunited.net/www/april flowersm.gif 99.04.01 10:31 B C:\webstuff\Templates\Monthly updates\april\index.html --> www.energyunited.net /com/energyunited.net/www/april index.html 99.04.01 10:31 B C:\webstuff\Templates\Monthly updates\april\spring.gif --> www.energyunited.net /com/energyunited.net/www/april spring.gif 99.04.01 10:31 B C:\webstuff\Templates\Monthly updates\april\WS_FTP.LOG --> www.energyunited.net /com/energyunited.net/www/april WS_FTP.LOG 99.04.01 10:45 B C:\webstuff\Templates\Monthly updates\april\april.gif --> www.mound.net /com/mound.net/www/april april.gif 99.04.01 10:45 B C:\webstuff\Templates\Monthly updates\april\aprilani.gif --> www.mound.net /com/mound.net/www/april aprilani.gif 99.04.01 10:45 B C:\webstuff\Templates\Monthly updates\april\easter3.gif --> www.mound.net /com/mound.net/www/april easter3.gif 99.04.01 10:45 B C:\webstuff\Templates\Monthly updates\april\easter4.gif --> www.mound.net /com/mound.net/www/april easter4.gif 99.04.01 10:45 B C:\webstuff\Templates\Monthly updates\april\flowersm.gif --> www.mound.net /com/mound.net/www/april flowersm.gif 99.04.01 10:45 B C:\webstuff\Templates\Monthly updates\april\index.html --> www.mound.net /com/mound.net/www/april index.html 99.04.01 10:45 B C:\webstuff\Templates\Monthly updates\april\spring.gif --> www.mound.net /com/mound.net/www/april spring.gif 99.04.01 10:45 B C:\webstuff\Templates\Monthly updates\april\WS_FTP.LOG --> www.mound.net /com/mound.net/www/april WS_FTP.LOG 99.04.01 11:01 B C:\webstuff\Templates\Monthly updates\april\april.gif --> www.teleclipse.net /com/teleclipse.net/www/roanoke/april april.gif 99.04.01 11:02 B C:\webstuff\Templates\Monthly updates\april\aprilani.gif --> www.teleclipse.net /com/teleclipse.net/www/roanoke/april aprilani.gif 99.04.01 11:02 B C:\webstuff\Templates\Monthly updates\april\easter3.gif --> www.teleclipse.net /com/teleclipse.net/www/roanoke/april easter3.gif 99.04.01 11:02 B C:\webstuff\Templates\Monthly updates\april\easter4.gif --> www.teleclipse.net /com/teleclipse.net/www/roanoke/april easter4.gif 99.04.01 11:02 B C:\webstuff\Templates\Monthly updates\april\flowersm.gif --> www.teleclipse.net /com/teleclipse.net/www/roanoke/april flowersm.gif 99.04.01 11:02 B C:\webstuff\Templates\Monthly updates\april\index.html --> www.teleclipse.net /com/teleclipse.net/www/roanoke/april index.html 99.04.01 11:02 B C:\webstuff\Templates\Monthly updates\april\spring.gif --> www.teleclipse.net /com/teleclipse.net/www/roanoke/april spring.gif 99.04.01 11:02 B C:\webstuff\Templates\Monthly updates\april\WS_FTP.LOG --> www.teleclipse.net /com/teleclipse.net/www/roanoke/april WS_FTP.LOG 99.04.01 11:34 B C:\webstuff\Templates\Monthly updates\april\april.gif --> www.sowega.net /com/sowega.net/www/april april.gif 99.04.01 11:34 B C:\webstuff\Templates\Monthly updates\april\aprilani.gif --> www.sowega.net /com/sowega.net/www/april aprilani.gif 99.04.01 11:34 B C:\webstuff\Templates\Monthly updates\april\easter3.gif --> www.sowega.net /com/sowega.net/www/april easter3.gif 99.04.01 11:34 B C:\webstuff\Templates\Monthly updates\april\easter4.gif --> www.sowega.net /com/sowega.net/www/april easter4.gif 99.04.01 11:34 B C:\webstuff\Templates\Monthly updates\april\flowersm.gif --> www.sowega.net /com/sowega.net/www/april flowersm.gif 99.04.01 11:34 B C:\webstuff\Templates\Monthly updates\april\index.html --> www.sowega.net /com/sowega.net/www/april index.html 99.04.01 11:34 B C:\webstuff\Templates\Monthly updates\april\spring.gif --> www.sowega.net /com/sowega.net/www/april spring.gif 99.04.01 11:34 B C:\webstuff\Templates\Monthly updates\april\WS_FTP.LOG --> www.sowega.net /com/sowega.net/www/april WS_FTP.LOG 99.04.01 11:48 B C:\webstuff\Templates\Monthly updates\april\april.gif --> www.sat-co.net /com/sat-co.net/www/april april.gif 99.04.01 11:48 B C:\webstuff\Templates\Monthly updates\april\aprilani.gif --> www.sat-co.net /com/sat-co.net/www/april aprilani.gif 99.04.01 11:48 B C:\webstuff\Templates\Monthly updates\april\easter3.gif --> www.sat-co.net /com/sat-co.net/www/april easter3.gif 99.04.01 11:48 B C:\webstuff\Templates\Monthly updates\april\easter4.gif --> www.sat-co.net /com/sat-co.net/www/april easter4.gif 99.04.01 11:48 B C:\webstuff\Templates\Monthly updates\april\flowersm.gif --> www.sat-co.net /com/sat-co.net/www/april flowersm.gif 99.04.01 11:48 B C:\webstuff\Templates\Monthly updates\april\index.html --> www.sat-co.net /com/sat-co.net/www/april index.html 99.04.01 11:48 B C:\webstuff\Templates\Monthly updates\april\spring.gif --> www.sat-co.net /com/sat-co.net/www/april spring.gif 99.04.01 11:48 B C:\webstuff\Templates\Monthly updates\april\WS_FTP.LOG --> www.sat-co.net /com/sat-co.net/www/april WS_FTP.LOG 99.04.01 14:04 B C:\webstuff\Templates\Monthly updates\april\april.gif --> www.bayspringstel.net /com/bayspringstel.net/www/april april.gif 99.04.01 14:04 B C:\webstuff\Templates\Monthly updates\april\aprilani.gif --> www.bayspringstel.net /com/bayspringstel.net/www/april aprilani.gif 99.04.01 14:04 B C:\webstuff\Templates\Monthly updates\april\easter3.gif --> www.bayspringstel.net /com/bayspringstel.net/www/april easter3.gif 99.04.01 14:04 B C:\webstuff\Templates\Monthly updates\april\easter4.gif --> www.bayspringstel.net /com/bayspringstel.net/www/april easter4.gif 99.04.01 14:04 B C:\webstuff\Templates\Monthly updates\april\flowersm.gif --> www.bayspringstel.net /com/bayspringstel.net/www/april flowersm.gif 99.04.01 14:04 B C:\webstuff\Templates\Monthly updates\april\index.html --> www.bayspringstel.net /com/bayspringstel.net/www/april index.html 99.04.01 14:04 B C:\webstuff\Templates\Monthly updates\april\spring.gif --> www.bayspringstel.net /com/bayspringstel.net/www/april spring.gif 99.04.01 14:04 B C:\webstuff\Templates\Monthly updates\april\WS_FTP.LOG --> www.bayspringstel.net /com/bayspringstel.net/www/april WS_FTP.LOG 99.04.01 15:12 B C:\webstuff\Templates\Monthly updates\april\april.gif --> www.aceinter.net /com/aceinter.net/www/april april.gif 99.04.01 15:12 B C:\webstuff\Templates\Monthly updates\april\aprilani.gif --> www.aceinter.net /com/aceinter.net/www/april aprilani.gif 99.04.01 15:12 B C:\webstuff\Templates\Monthly updates\april\easter3.gif --> www.aceinter.net /com/aceinter.net/www/april easter3.gif 99.04.01 15:12 B C:\webstuff\Templates\Monthly updates\april\easter4.gif --> www.aceinter.net /com/aceinter.net/www/april easter4.gif 99.04.01 15:12 B C:\webstuff\Templates\Monthly updates\april\flowersm.gif --> www.aceinter.net /com/aceinter.net/www/april flowersm.gif 99.04.01 15:12 B C:\webstuff\Templates\Monthly updates\april\index.html --> www.aceinter.net /com/aceinter.net/www/april index.html 99.04.01 15:12 B C:\webstuff\Templates\Monthly updates\april\spring.gif --> www.aceinter.net /com/aceinter.net/www/april spring.gif 99.04.01 15:12 B C:\webstuff\Templates\Monthly updates\april\WS_FTP.LOG --> www.aceinter.net /com/aceinter.net/www/april WS_FTP.LOG 99.04.01 16:27 B C:\webstuff\Templates\Monthly updates\april\april.gif --> www.crpud.net /com/crpud.net/www/april april.gif 99.04.01 16:27 B C:\webstuff\Templates\Monthly updates\april\aprilani.gif --> www.crpud.net /com/crpud.net/www/april aprilani.gif 99.04.01 16:27 B C:\webstuff\Templates\Monthly updates\april\easter3.gif --> www.crpud.net /com/crpud.net/www/april easter3.gif 99.04.01 16:28 B C:\webstuff\Templates\Monthly updates\april\easter4.gif --> www.crpud.net /com/crpud.net/www/april easter4.gif 99.04.01 16:28 B C:\webstuff\Templates\Monthly updates\april\flowersm.gif --> www.crpud.net /com/crpud.net/www/april flowersm.gif 99.04.01 16:28 B C:\webstuff\Templates\Monthly updates\april\index.html --> www.crpud.net /com/crpud.net/www/april index.html 99.04.01 16:28 B C:\webstuff\Templates\Monthly updates\april\spring.gif --> www.crpud.net /com/crpud.net/www/april spring.gif 99.04.01 16:30 B C:\webstuff\Templates\Monthly updates\april\april.gif --> www.crpud.net /com/crpud.net/www/april april.gif 99.04.01 16:30 B C:\webstuff\Templates\Monthly updates\april\aprilani.gif --> www.crpud.net /com/crpud.net/www/april aprilani.gif 99.04.01 16:30 B C:\webstuff\Templates\Monthly updates\april\easter3.gif --> www.crpud.net /com/crpud.net/www/april easter3.gif 99.04.01 16:30 B C:\webstuff\Templates\Monthly updates\april\easter4.gif --> www.crpud.net /com/crpud.net/www/april easter4.gif 99.04.01 16:30 B C:\webstuff\Templates\Monthly updates\april\flowersm.gif --> www.crpud.net /com/crpud.net/www/april flowersm.gif 99.04.01 16:30 B C:\webstuff\Templates\Monthly updates\april\index.html --> www.crpud.net /com/crpud.net/www/april index.html 99.04.01 16:30 B C:\webstuff\Templates\Monthly updates\april\spring.gif --> www.crpud.net /com/crpud.net/www/april spring.gif 99.04.01 16:30 B C:\webstuff\Templates\Monthly updates\april\WS_FTP.LOG --> www.crpud.net /com/crpud.net/www/april WS_FTP.LOG 99.04.02 09:12 B C:\webstuff\Templates\Monthly updates\april\april.gif --> www.cgemc.net /com/centralga.net/www/april april.gif 99.04.02 09:13 B C:\webstuff\Templates\Monthly updates\april\aprilani.gif --> www.cgemc.net /com/centralga.net/www/april aprilani.gif 99.04.02 09:13 B C:\webstuff\Templates\Monthly updates\april\easter3.gif --> www.cgemc.net /com/centralga.net/www/april easter3.gif 99.04.02 09:13 B C:\webstuff\Templates\Monthly updates\april\easter4.gif --> www.cgemc.net /com/centralga.net/www/april easter4.gif 99.04.02 09:13 B C:\webstuff\Templates\Monthly updates\april\flowersm.gif --> www.cgemc.net /com/centralga.net/www/april flowersm.gif 99.04.02 09:13 B C:\webstuff\Templates\Monthly updates\april\index.html --> www.cgemc.net /com/centralga.net/www/april index.html 99.04.02 09:13 B C:\webstuff\Templates\Monthly updates\april\spring.gif --> www.cgemc.net /com/centralga.net/www/april spring.gif 99.06.01 08:08 B C:\ispa\april\WS_FTP.LOG <-- www.cgemc /com/centralga.net/www/april WS_FTP.LOG 2000.03.23 14:50 B E:\ispa\monthly links\apr\apr.gif --> www.america.net /com/america.net/www/apr apr.gif 2000.03.23 14:50 B E:\ispa\monthly links\apr\aprilani.gif --> www.america.net /com/america.net/www/apr aprilani.gif 2000.03.23 14:50 B E:\ispa\monthly links\apr\easter3.gif --> www.america.net /com/america.net/www/apr easter3.gif 2000.03.23 14:50 B E:\ispa\monthly links\apr\easter4.gif --> www.america.net /com/america.net/www/apr easter4.gif 2000.03.23 14:50 B E:\ispa\monthly links\apr\flowersm.gif --> www.america.net /com/america.net/www/apr flowersm.gif 2000.03.23 14:50 A E:\ispa\monthly links\apr\index.html --> www.america.net /com/america.net/www/apr index.html 2000.03.23 14:50 B E:\ispa\monthly links\apr\spring.gif --> www.america.net /com/america.net/www/apr spring.gif 2000.03.23 14:50 B E:\ispa\monthly links\apr\WS_FTP.LOG --> www.america.net /com/america.net/www/apr WS_FTP.LOG 2000.04.01 06:43 B E:\ispa\affilliates\apr\apr.gif --> www.accucomm.net /com/accucomm.net/www/main/apr apr.gif 2000.04.01 06:43 B E:\ispa\affilliates\apr\aprilani.gif --> www.accucomm.net /com/accucomm.net/www/main/apr aprilani.gif 2000.04.01 06:43 B E:\ispa\affilliates\apr\easter3.gif --> www.accucomm.net /com/accucomm.net/www/main/apr easter3.gif 2000.04.01 06:43 B E:\ispa\affilliates\apr\easter4.gif --> www.accucomm.net /com/accucomm.net/www/main/apr easter4.gif 2000.04.01 06:43 B E:\ispa\affilliates\apr\flowersm.gif --> www.accucomm.net /com/accucomm.net/www/main/apr flowersm.gif 2000.04.01 06:43 A E:\ispa\affilliates\apr\index.html --> www.accucomm.net /com/accucomm.net/www/main/apr index.html 2000.04.01 06:43 B E:\ispa\affilliates\apr\spring.gif --> www.accucomm.net /com/accucomm.net/www/main/apr spring.gif 2000.04.01 06:43 B E:\ispa\affilliates\apr\WS_FTP.LOG --> www.accucomm.net /com/accucomm.net/www/main/apr WS_FTP.LOG 2000.04.01 07:09 B E:\ispa\affilliates\apr\apr.gif --> www.bayspringstel.net /com/bayspringstel.net/www/apr apr.gif 2000.04.01 07:09 B E:\ispa\affilliates\apr\aprilani.gif --> www.bayspringstel.net /com/bayspringstel.net/www/apr aprilani.gif 2000.04.01 07:09 B E:\ispa\affilliates\apr\easter3.gif --> www.bayspringstel.net /com/bayspringstel.net/www/apr easter3.gif 2000.04.01 07:09 B E:\ispa\affilliates\apr\easter4.gif --> www.bayspringstel.net /com/bayspringstel.net/www/apr easter4.gif 2000.04.01 07:09 B E:\ispa\affilliates\apr\flowersm.gif --> www.bayspringstel.net /com/bayspringstel.net/www/apr flowersm.gif 2000.04.01 07:09 A E:\ispa\affilliates\apr\index.html --> www.bayspringstel.net /com/bayspringstel.net/www/apr index.html 2000.04.01 07:09 B E:\ispa\affilliates\apr\spring.gif --> www.bayspringstel.net /com/bayspringstel.net/www/apr spring.gif 2000.04.01 07:09 B E:\ispa\affilliates\apr\WS_FTP.LOG --> www.bayspringstel.net /com/bayspringstel.net/www/apr WS_FTP.LOG 2000.04.01 07:16 B E:\ispa\affilliates\apr\apr.gif --> www.cgemc.net /com/centralga.net/www/apr apr.gif 2000.04.01 07:16 B E:\ispa\affilliates\apr\aprilani.gif --> www.cgemc.net /com/centralga.net/www/apr aprilani.gif 2000.04.01 07:16 B E:\ispa\affilliates\apr\easter3.gif --> www.cgemc.net /com/centralga.net/www/apr easter3.gif 2000.04.01 07:16 B E:\ispa\affilliates\apr\easter4.gif --> www.cgemc.net /com/centralga.net/www/apr easter4.gif 2000.04.01 07:16 B E:\ispa\affilliates\apr\flowersm.gif --> www.cgemc.net /com/centralga.net/www/apr flowersm.gif 2000.04.01 07:16 A E:\ispa\affilliates\apr\index.html --> www.cgemc.net /com/centralga.net/www/apr index.html 2000.04.01 07:16 B E:\ispa\affilliates\apr\spring.gif --> www.cgemc.net /com/centralga.net/www/apr spring.gif 2000.04.01 07:16 B E:\ispa\affilliates\apr\WS_FTP.LOG --> www.cgemc.net /com/centralga.net/www/apr WS_FTP.LOG 2000.04.01 07:20 B E:\ispa\affilliates\apr\apr.gif --> www.ctcis.net /com/ctcis.net/www/apr apr.gif 2000.04.01 07:20 B E:\ispa\affilliates\apr\aprilani.gif --> www.ctcis.net /com/ctcis.net/www/apr aprilani.gif 2000.04.01 07:20 B E:\ispa\affilliates\apr\easter3.gif --> www.ctcis.net /com/ctcis.net/www/apr easter3.gif 2000.04.01 07:20 B E:\ispa\affilliates\apr\easter4.gif --> www.ctcis.net /com/ctcis.net/www/apr easter4.gif 2000.04.01 07:20 B E:\ispa\affilliates\apr\flowersm.gif --> www.ctcis.net /com/ctcis.net/www/apr flowersm.gif 2000.04.01 07:20 A E:\ispa\affilliates\apr\index.html --> www.ctcis.net /com/ctcis.net/www/apr index.html 2000.04.01 07:20 B E:\ispa\affilliates\apr\spring.gif --> www.ctcis.net /com/ctcis.net/www/apr spring.gif 2000.04.01 07:20 B E:\ispa\affilliates\apr\WS_FTP.LOG --> www.ctcis.net /com/ctcis.net/www/apr WS_FTP.LOG 2000.04.01 07:25 B E:\ispa\affilliates\apr\apr.gif --> www.daltontel.net /com/daltontel.net/www/apr apr.gif 2000.04.01 07:25 B E:\ispa\affilliates\apr\aprilani.gif --> www.daltontel.net /com/daltontel.net/www/apr aprilani.gif 2000.04.01 07:25 B E:\ispa\affilliates\apr\easter3.gif --> www.daltontel.net /com/daltontel.net/www/apr easter3.gif 2000.04.01 07:25 B E:\ispa\affilliates\apr\easter4.gif --> www.daltontel.net /com/daltontel.net/www/apr easter4.gif 2000.04.01 07:25 B E:\ispa\affilliates\apr\flowersm.gif --> www.daltontel.net /com/daltontel.net/www/apr flowersm.gif 2000.04.01 07:25 A E:\ispa\affilliates\apr\index.html --> www.daltontel.net /com/daltontel.net/www/apr index.html 2000.04.01 07:25 B E:\ispa\affilliates\apr\spring.gif --> www.daltontel.net /com/daltontel.net/www/apr spring.gif 2000.04.01 07:25 B E:\ispa\affilliates\apr\WS_FTP.LOG --> www.daltontel.net /com/daltontel.net/www/apr WS_FTP.LOG 2000.04.01 07:27 B E:\ispa\affilliates\apr\apr.gif --> www.deltaland.net /com/deltaland.net/www/apr apr.gif 2000.04.01 07:27 B E:\ispa\affilliates\apr\aprilani.gif --> www.deltaland.net /com/deltaland.net/www/apr aprilani.gif 2000.04.01 07:27 B E:\ispa\affilliates\apr\easter3.gif --> www.deltaland.net /com/deltaland.net/www/apr easter3.gif 2000.04.01 07:27 B E:\ispa\affilliates\apr\easter4.gif --> www.deltaland.net /com/deltaland.net/www/apr easter4.gif 2000.04.01 07:27 B E:\ispa\affilliates\apr\flowersm.gif --> www.deltaland.net /com/deltaland.net/www/apr flowersm.gif 2000.04.01 07:27 A E:\ispa\affilliates\apr\index.html --> www.deltaland.net /com/deltaland.net/www/apr index.html 2000.04.01 07:27 B E:\ispa\affilliates\apr\spring.gif --> www.deltaland.net /com/deltaland.net/www/apr spring.gif apr/month/0002750000372000001540000000000010110755600012422 5ustar affweblibuuidapr/month/aprilani.gif0000640000372000001540000000304207071364530014720 0ustar affweblibuuidGIF89a^K! NETSCAPE2.0! P,1H1`(jY(hj0}KʛO5_L,`Ң4vp.a]XPj^P3Va\5rm|U)Lp7'wrźinζkҧlWrBӘՑujX[D)YiCb0B!e%4D#WL5#(HdL[%Ĉ3,RCJP=ZB榆@Gr%lӰD۬AF5p<0mkύ^vפvGe&iY*I(~6bzKK^.nCvWE}ϸ:&MZo7fmc#IkeoƓU<4%l|˲4恔u+X2 _]Tߗ'z?yB\i9>exTIVQׂ! P,9Ii8{5divVb#WjYɸަVhBSpK:?fMaMj4$Ukik֝T=A4in-ΐ­c5bvtb0Q[-)Mߎ9./C!of;apr/month/WS_FTP.LOG0000640000372000001540000000301407071364530014036 0ustar affweblibuuid2000.03.23 14:50 B E:\ispa\monthly links\apr\month\aprilani.gif --> www.america.net /com/america.net/www/apr/month aprilani.gif 2000.04.01 06:43 B E:\ispa\affilliates\apr\month\aprilani.gif --> www.accucomm.net /com/accucomm.net/www/main/apr/month aprilani.gif 2000.04.01 06:43 B E:\ispa\affilliates\apr\month\WS_FTP.LOG --> www.accucomm.net /com/accucomm.net/www/main/apr/month WS_FTP.LOG 2000.04.01 07:09 B E:\ispa\affilliates\apr\month\aprilani.gif --> www.bayspringstel.net /com/bayspringstel.net/www/apr/month aprilani.gif 2000.04.01 07:09 B E:\ispa\affilliates\apr\month\WS_FTP.LOG --> www.bayspringstel.net /com/bayspringstel.net/www/apr/month WS_FTP.LOG 2000.04.01 07:16 B E:\ispa\affilliates\apr\month\aprilani.gif --> www.cgemc.net /com/centralga.net/www/apr/month aprilani.gif 2000.04.01 07:16 B E:\ispa\affilliates\apr\month\WS_FTP.LOG --> www.cgemc.net /com/centralga.net/www/apr/month WS_FTP.LOG 2000.04.01 07:20 B E:\ispa\affilliates\apr\month\aprilani.gif --> www.ctcis.net /com/ctcis.net/www/apr/month aprilani.gif 2000.04.01 07:20 B E:\ispa\affilliates\apr\month\WS_FTP.LOG --> www.ctcis.net /com/ctcis.net/www/apr/month WS_FTP.LOG 2000.04.01 07:25 B E:\ispa\affilliates\apr\month\aprilani.gif --> www.daltontel.net /com/daltontel.net/www/apr/month aprilani.gif 2000.04.01 07:25 B E:\ispa\affilliates\apr\month\WS_FTP.LOG --> www.daltontel.net /com/daltontel.net/www/apr/month WS_FTP.LOG 2000.04.01 07:27 B E:\ispa\affilliates\apr\month\aprilani.gif --> www.deltaland.net /com/deltaland.net/www/apr/month aprilani.gif apr/apr.gif0000640000372000001540000002134607071364531012566 0ustar affweblibuuidGIF89ad2d#bm+6:Bl8j%jVVXV=*g8N25yrmdT *]5+w<K+IQ4Ekn8i`k]2Q3Sb f{$sgc'> cPbSn>jYG?Xa+dfŝ埤ѣ֩ڭʦ! NETSCAPE2.0! ,dpH,Ȥrl:ШtJZxdفO ye2Ù?v|E@ USAJ|$MQ5L0IYj5 MА4&m#bIf[NT}&bl:% xAFP~+&iXfBe垲4ꪌ2A[jr+آ9J@)) (:,x^Q=r`cہ 6* 7hkN9;i^Ěx^)/%CH[~\0-WXα>HAY7e Oک3xP![Ŧdal!MMDIAY;3 h <Rh1GBۨӚ-9IP;{BU6A V06j t矧mC|_TTm7Ll H4PlA00 3h*X0l!o /\p i%5Z`zx4䏯4'(=%<I?@ S!]@ ր\$)+p*XAY ?銀9Di@Ld:+1/_';:(_ 0n%L`O @< v#VvO`p l@!q@ H」 +EMSX XЂBwBB|f"~D6U2QfD7]HfT  HĠda*HՀ4` z@sl vaZR2E @Q!@*E5ځ;M^~CXks)@#O$:7yx8sJ0 Px/80,N 3A t2,'%G^e dHT"a7S>gy `5%Dr>*9hGE|J IĚb6Bf >WS!OmW*Ԇ9}t+4^"j;i>K}*jsFCB@MO@/7@ ͟I]5.v͗Au@j8 tɾOly93#r/}&>6\`Ё2(lxщ,*8)K N|hEw8?=\h"X*%-#|xeFНB/ҚHg@˥.xwL.K8ϜF2 Ώ* R˙=(~;FhF3oԡY |P,@#NbP猕:@CJٓEG׀Ы,2}Lců0L?7 BSn#/oEF.K(pj \.^+\]" 7(~bLiۊ?? wvp-C:}^/L2+/X]Rt6cc}Q4ҡ,7_P!Ձ  vm$Ipp/U\qDKC>.v5_pD06LK =)+AQ" 5p[W!FOɧDK1t@@;0P~4,ޡnMeslnV:" 9,pTX86 ( d0itWB@9d ~O0ϣ|"~pf֠MH3|! /XK b-EFWt-bMAhK}Wt R;gz~rHH(o8 `"S^GSHXtrG=XzQɂ4"A(mՠr "APHBsSq7\H0}`Np031r3nj~kpXV}whm4i3 $*'{nX pshCC`{VDe^tG6Hqv?!x^˅IXp"9 v@4) CmuKsG>5t4- TÏ@(KIߧvW!?KKt3c +:yoA9 DiI0`;ӑ7HgHYVx*/#umbI9'𑂰c0Xww&9 4!4_Jc՗+JGfߕS0e೘`8%JIS2qF$8y);u֗Ӄ|fVd :ⷍŘKx H6PuIh9,5FxFvvh6c}@(SpiAcyPw _av/xa5.ufdYffPJ`Iq(GIڊ%;yT%0S9PIS4{zk 7'6{4д?J_LZ4krwVP=.GK!}@G zk<2h m"o!ii)JZiaeX .<4KP ,r*a5hD;h=G ojWx_:gK+: ,ZX8ĊjJ)+@+ggR [9`䫹Ѹ& yl)sO<&,+{ @]5ٗ kK;vK wwK[;k =p«K,@I{W LgO9;8볷@LIp *[KjO\zm$B,Q;HN;WUpIVV¹Z, L5;a4|f&dF=q, c/K< lJū'L50>>1 GyW yK|;+;PL0IZK;3G@g5 Q̃}9ƶ<zkwk  :̯,J Z{aKkC  )"Q7ʫA[w  ľibξ,j(k;0 T ;ƲS.!1Xd 7M5F|\α?;Tù:oD;qѶAl !N@)/+; Lܫ0 ӾIUV^ʲܼ:i־,~KLQ ӿ7}׊‚=güj ؔ fF7`֚ΠR٠΂UĤڨ= Yڮ]aڲ=۴]۶}۸M! ,yF!p(t|5rT?uiZ)/Fw zZ.TǦ4fE?tD7wBr=ʢ@HM7ՌRXaK=h{ D-[1I'K{kB(3r882`tFftˬ'?vصp*G L>9ZP~0|(b.rYsee! ,x?%ppjql6]>oJM:A@FRyS $4ghpE'/_r:7:pr66v3<M?<9==irjd 3?=<" pHȤR1.OUӉ$YQXtRU.&JjnwndV^mNʞtv2mV<DzEҦXgpz*i7^%@R9:ŊuA#"= "W9rٶđs@ m%Bw` 6 ó=l,QB-'1䔌HZBP?1P92 3a<;߿#dF ȑw 4auxzPnc'! ,zA p(Ȥ2PY:I%T/'i>bd,q(*#3ydWiR?B6[(iI+*ly~<<:=CG 4B522>?<44:B< -7C9D63<3391GECf 0IMwÈ4R W Za5.@*MǏEEZn B^2i#Vr) >]j^N̨7 @7B]@(Q=!#a")q1DM<:4=CC ,:G79tGDB 9D9 WCs9 99G,<= 33ƴ-^ 5Ҧ]eJ6/7&J@/Z"יhѮ5{vo_'P_w… aÔE*_$z"˗,S<7 b7՚JЏٚFMW)I%_VkqdfڴYy]x É;Xt_$m7kLyV?,㳘kїMΙkZL[WknWZ*L$پȀ{K:xY%|}fYmz3_ZV%ЋʫYfG疮BO4Ku75Мy,GS`FG)0([|%"unAfqEXd~H`ל)l9! Y[5`)Ć04A)ӒY0u#w~^3;l\Cys5pPhY%m݊|x3߷*b/2סu^>SsO-ݖݙyɮ: q_)kmesSݼQ%TW1/Xb*QAjxLy=DLJԒ$NrH2ȿͤo}ˋ ADP*an B"a45O홐䖧WH[D;jtw)d]賩rn_%Q/u >n3ZxLR=śA QhFy瞀Zr%`׭L7y5\P |@YXKYݷ".ՑtZ!d5]UӋZD\u6S{h}]U=F9q8g"h4uVz0nDrmZ"V4&bR4'hgR9\~ߏe%݆yNVuVk=#zW)Y~`68d&(":gZ҉&V[ԫW5)nJZd>o:X~mtZi&Sm"~l%Py8eu+"Z%R{v ^lcitMzcxdP襷[u"feIi"ByѦN6qJu[۝2ZɝН@~tu}rq|"vڹuvpe5f9*'r[dR+Ф _kkt]Ģ%t΁Ysf*FޥY}P #eLw)0RVe]˭`W!)ttZ[Ux"~8Е:gy3!31j u-Gר#ДGGq_C~&l\gXOJwR]z{<|j4U&C&LCT>U1rV t w|e(?]J= ~SPf5n|s]ciWiKR K 02O+RP6D" : q$ћ޴rϜ!4 Aw5 NZRT,a 7D0Jdm͸9 ! ,P;H*x‡#J|xm3jXbC\ȓ(+pˑ*Y|IS5++?9σ7TsJ ڲ@ AbӞB:0ՂTU\өT/\zUp2:wy"UoD_>n\KW=ɗ_{GvhbP+1#.KdyR~ީ}|Ip/|q۱c-N$4`Z]10[jޥ}MnNGTHw=ێ!LѰ{.5/N!\iIG~]JN$nYZ%epxav%^6wNhq(^af^DmjDeaZBڤ5)uW& Y$|) 7p ?@jbیsnYE):fաOVw0Yܜĕ)&_{Xݟ9j栓 pk aՈ&6f QZA>FSأg~PFmQ哮h(QV.Ru.kZ\N%-[̗lr->֊"{GQqpi5\vHkDu:w%sx٥f^ًeqRNEYv ٮzOS dK0ۧ#o\eot3hdeAw JRZa鶗;ÖqRh9۞fl~n3TNC gJ7`U7N ~H-+l<<4s}8\!  ds%`%6Ć07R ִh}1PV:l\y|^1=TJ|ԍ<|ϾO%fyOΐyჸU>\7YDv #0΅(XȰ./Du5$bŊ_(t}WI `lԣ)TRJ 1$8A !R:  <Ęc&M[1` C()6IҘ%Z}PԢB|C Q"ћmxA4fH@! ,P;H*x‡#J|xm3jXbC\ȓ(+pˑ*Y|IS5++?9σ7TsJ ڲ@ AbӞB:0ՂTU\өT/\zUp2:wy"UoD_>n\KW=ɗ_{GvhbP+1#.KdyR~ީ}|Ip/|q۱c-N$4`Z]10[jޥ}MnNGTHw=ێ!LѰ{.5/N!\iIG~]JN$nYZ%epxav%^6[&G}W#i 'EEU1ZFoyc>'dmґȗ_Qd+`ipIF~}SjYfb˽9n^2khi[fV>ffufbS!A'5d&u^>"TIJZ]* i!ny*hue*b{hf=W36cIo)CzVzQ`]QH|UZf]W\ߝ6hͧ.I"y&PYTGݛRl"T@f6S{۾@yMoBLqv y{V'SY%dE7 YРI7tF i^gp^S B34e'ؚL3TSC2eWp*d!laL+^؅0@f9Wj^bClyCS+G4\I# Zfw2n;Tn].L㤗gQO'>%qy?8o{IU+7G~{MO>dY3+6A|sXDk$Jҏׯkuhr1*m(S]V a*0B7F ^_dc1g59x/5~p=@Ƈh-G#ETQ/QDM6kdd>.iQ!nA! ,P;H*x‡#J|xm3jXbC\ȓ(+pˑ*Y|IS5++?9σ7TsJ ڲ@ AbӞB:0ՂTU\өT/\zUp2:wy"UoD_>n\KW=ɗ_{GvhbP+1#.KdyR~ީ}|Ip/|q۱c-N$4`Z]10[jޥ}MnNGTHw=ێ!LѰ{.5/N!\iIG~]JN$nYZ%epxav%^6wNhq(^af^DmjDeaZBڤ5)uW& Y$|) 7p ?@jbیsnYE):fաOVw0Yܜĕ)&_{Xݟ9j栓 pk aՈ&6f QZA>FSأg~PFmQ哮h(QV.Ru.kZ\N%-[̗lr->֊"{GQqpi5\vHkDu:w%sx٥f^ًeqRNEYv ٮzOS dK0ۧ#o\eot3hdeAw JRZa鶗;ÖqRh9۞fl~n3TNC gJ7`U7N ~H-+l<<4s}8\!  ds%`%6Ć07R ִh}1PV:l\y|^1=TJ|ԍ<|ϾO%fyOΐyჸU>\7YDv #0΅(XȰ./Du5$bŊ_(t}WI `lԣ)TRJ 1$8A !R:  <Ęc&M[1` C()6IҘ%Z}PԢB|C Q"ћmxA4fH@! ,P;H*x‡#J|xm3jXbC\ȓ(XQbʗ!+t kVX~bCqZdϔ2-phѣ- L$P4:ڳ"*QTWqĊΚl&D*Q\8o_{B8M+3[qxn/ 4U |B甡S6vC^%nǚ::mӼ{R?VdRz{C&d`Ǖ/zڒ5tm{KFJZx[LY@Me.Eyi40UEZ͒RUJX] GCVA4PC| e"$$BKP4H&%)1c (Ѫd42iܨ% ! ,P;H*x‡#J|xm3jXbC\ȓ(+pˑ*Y|IS5++?9σ7TsJ ڲ@ AbӞB:0ՂTU\өT/\zUp2:wy"UoD_>n\KW=ɗ_{GvhbP+1#.KdyR~ީ}|Ip/|q۱c-N$4`Z]10[jޥ}MnNGTHw=ێ!LѰ{.5/N!\iIG~]JN$nYZ%epxav%^6[&G}W#i 'EEU1ZFoyc>'dmґȗ_Qd+`ipIF~}SjYfb˽9n^2khi[fV>ffufbS!A'5d&u^>"TIJZ]* i!ny*hue*b{hf=W36cIo)CzVzQ`]QH|UZf]W\ߝ6hͧ.I"y&PYTGݛRl"T@f6S{۾@yMoBLqv y{V'SY%dE7 YРI7tF i^gp^S B34e'ؚL3TSC2eWp*d!laL+^؅0@f9Wj^bClyCS+G4\I# Zfw2n;Tn].L㤗gQO'>%qy?8o{IU+7G~{MO>dY3+6A|sXDk$Jҏׯkuhr1*m(S]V a*0B7F ^_dc1g59x/5~p=@Ƈh-G#ETQ/QDM6kdd>.iQ!nA! ,P;H*\ȰÇ ]HŃdȱk4zIrĐKxJH+cBlYaL8?Vy3ς4y4)QbL !%TP& dӧWX2ԣR/,PBjG(X+IpyTnD_NefFZ^KܹNҥȉٺ\ kVjaҙ&JzG˞^KZ\/_|BdEI.KD7Ϧ]hɼe+yv&;s-[-[5b-?0Y Ecٻݩ;3魬pѥ{u%f QdPy}ttMu3muaI}wewVkhwI$\fulWpEV@Ւ+{EH5:9H9ךoww`"K]i#}6Άd쵵B_F͙AϑMm%S|G&`whh 1>:sզ_qj 'i*:scZ^#ryZTxHM KlQ9_ Yp4ڎ 5e폐¹g*hM%}[/tF+W bIg%m*p}]d!LT ۶9&tnF_D&ԡӮVzJ[\:aqi ܩtҪ6~}E#,ɂ~zB-psU-tjMԛٛs-'0;UPaH |*+m2}xo%5Y{谇IP۽y~#9pa=!UmPWvzF]^XNz!G qc^t rU6uu-FNָw 2(VȓkW~k^~S"ۡ0e~tF*}S޶DdJ\@a1PT ?Ykt֦aU}yZvYkԼ2YkXy-3rMM]jpևGFO'=5ad]^gmU755aq b_C-=x}Tm=%]uWJecEZyȐ ؅AcRgM]b0FcceEc5ߎBYCvX#dEXe腵dzZP7>֑t5BKe&V9Uzt-xפg\(Nx䔣tؘ~$D0 Z(Т鸦mFw6UfYjuZWP9^Z$;fi"nojSkQ)Bガ2fLkS:+6ggRŔ@Aj;q{ iI ,8m{6-yқ_ 'iuXSqo[l_BR:&Y1$Q, 5.~h0May窳}N~h(m5k7ߩkqchtx!P3:.}kYAk0q o8TUK}6O 8Pk%ۗ!} lDZ><- Z!S{@R &|c-9Lyqxn=c5#8AV$6OȘ[cd9pku('k1\g_yy/_kt~\U]?_>-}.i l`[3$fPDk#=c^+}y $8V`aWԒz#ۜ,DE|txN!I涫/GLB1!'rC"^%3:"bH/!K )YFC ! ,P;H*\ȰÇ#JHŋ3jȱǏ CIH 4 KWZPY6L/3izy'FHyRiD_| \1'+X1)ӧJ5QkZ\KX>ǂRZIZezmlaK|ĿװJ@򊁀 D6v 1՗S[60jP?<|mtԧv:,rKzӪepO"uiqa]Ȼ7p̐'}|hrK]+~)Mz[^?O\Ӥ1[TzlܱW;A\ChauUoQh'|OmXT pDmahnK`!A2nc/CvGxg.|Q(YV dk56cAx"f8(%di'zY!S(F2喘7V%cLY[mWZi KjA J(Ni)+vUmX]9e%\p[wQa\}ږ wR/ 盂]In6Wh`Ke[Ac~iYU.eŚ]gSWڳ] ڕPuTbI.,xe•Ժ^kJ IxX^Nj ]U* /\^6lZj` GXcGWov բ ƚlP=1t oZ8 !wʃܲ1.=j>'0,|7-Le4IVeQ%]o֤݉!L R Ć0tAC*7tߺ#Mw}: x3Vh) zf~طL\'<'bW3}$nt!)"d佮' |F%FҞYy-Vv<ڟ{֣ nTV/? ao ߺF┲H)UR9@~$ D".cIJdo:H eXµ\+aw$&,o% ! ,P;H*\ȰÇ#JHŋ3jȱǏ CIH 49r,CK//aRƳgI@yRhD_l \A#=*t(US=ׁP;~*UhUZ4!W5 V V[as1VZPOᩣ.i&fҙأ=y R`6JD,2fFRe&cH)pwj;x)riS5WɆ\ckΊ_)yaK+=~ҹPxֆ9``[M1~ާ)fk%xdF[PVlk/x)WEF_9%[s-Fi!,/ 7,=l$xrLof>g\!WvyV,w6,j~qNxTR eu)a]EXp%'\Ne1`I i[g׵ҵdW #uMW|G&Efaz!v?T%fbKl! Pt Ć0#SlYé#QN;LNy=a+5jũ_W5v/7M7UVoƱKUZ>Mѡ//7gx: qFa(kd%S}S]OPpԠ*A|]FyQal@O!6F^Fe$& ʼn)`L`(͐/S(1=0Jdؐ16 ;April2000/0002750000372000001540000000000010110755635012074 5ustar affweblibuuidApril2000/images/0002750000372000001540000000000010110755634013340 5ustar affweblibuuidApril2000/images/apTEST.jpg0000640000372000001540000002776707446366442015201 0ustar affweblibuuidJFIFddDucky(Adobed     $$''$$53335;;;;;;;;;;  %% ## ((%%((22022;;;;;;;;;;"!1AQa"q2Bb#Rr񂒢3CSD%$4!1AQaq"B2Rb#S ?Q@r\;PLhTLcҘ1@ \MjC=CQgJܨj_ܮ!%+ʺ$r6$iQ-wܥ3W U@FhqKT42e\*j*p]^Ψ *@ވ -+ZMӀ-\TL-wIXHh(1֪ԃ#XUu5b5,hkToQf"Um-̕KHoM!1%ͅXq FXH eaj4 j:Ue>]juRSd ښ.gT8 yP)TCcajQ$Ghj (i0.ZEjTQE ( (%EP\;WkjZjϞ&쎴wdP}0Qy;7$b!޳\q9 U}1qVrԋRdj<G$ Z8q{ JUnN#FDԐt>Du՘A1-LK^7Xf qlt.mÝщ!q"MZԖ5ނԒd*ܗZ iV,XZ64kaVV"N]* -@o%jޟy>~ zbRjA6Z$UY˻a7͢kwcn|/ONԵcD`{ʜ~ڤdtojC攀5ש T5Rj aC "V;wf7 PZjp)e=nҾ涧1xvBJj_3-1[^[;eD`¯o{*׋KS{K6Jk3gƋV#$7Wk[Ts01{6k's?aBI,ZIZ[9l' 5\m=M õD㡯'qMƅnjϽ< $K\q;ܑq_AҩwfJO(? U 䄕]Fɐ_R1H )pO߁;E^f^t|73jaUթHP_]ԋշBzR|XD2׈?鶿v'( [g_wWW:1ؖ r 4c/ ; 2\ F?kVe96hBIЩ_R{0ʄ{T(((TQEõvv%r:VA& ˙t; C'TyXlXPX0FDٱc$ V؂,+>T!kS0T&g&G$#KBmj4|y7oQ0), ҩZIkn,ǂu4-MmU4d1N@kQq%u;-uE}KaU4V`514qs0AU?^ŏȑJ:Hה`^Ïqq׭k;udc$/Ѓ3ZX\X#:Y*׃&xe&k^ʛ~Urf콡;r7m,73m\ʿSF>>랸5tQ> V,L\-kf%8:kOh$Xtv̚i\ kupd{}&OR?*z$~1K|ZL<6K&rf$9D"[n(#.a9O)AՍSܳXV)gp?FZM"=Nێ8+I& hqKּq7K`!eʢlSgsa4qE[][!ew F -/+N:_\ˏy]q||qfImx ;N.~wt9Y34Ol\*Sx'I8w>d<L0 { xV2r A]򦵞ŀmK:ni,Fr8VE+c)S&:((( QEWڀ|zRzP5:Ν${NAh)F)YComf)<+oʔSƖeI-NV%$CO-6S2s$UFޡpw6ZrV$~R@0>˦0=̕[oTc;X*NC{Đvkmj{Qȩ7:Ҟ6ֹwSXұ].GJAP.:-X (gM?*/ki{ompb$葏šM[H{ ~Qbc!ԛǏy;g'(W';pLLT<+[/vSQ7 !JXupfvL/w@Zcngե21g_}G>\YeDqCb_R=珍nQ=#{k]L[숲>e9k$gw꫏LQ<6uٶlDd]Л=b͈ k}γg6{^J+J;^\osUXđNB#D Z:^n>¯[k> 5V:B{vc]_؜LJO#{!ʴF6<@Q xOEn޹i&[ڝO+NI\}w>G:7 :2xxŬ/ȍId3F^.e{V4WW~6XsĵzͳՕ)6VlAVoQ6©}%Cu72Svt 6[xhcBāorqO5뮼yۙ{r;/n332Ƕƅy97 \<yfΖ|w bVT>p^ֽKX@cHrXuQx'U@,a܅(]x9n`{N&yĂ9^kR7\gQqq'ʙXH@䶱Z|;S@~n:֞,G}|)X1P>E [u$E'_-+ZF M(dK뿕;Yr F:ڟkڧPJhEPEPEP+jp@ KIJzvjB|4 *~q}V|ke#7"S%Gu0U>9,}ڑx9,4>@ G7VՈ-ZEV7ڒq,~۱ޚi2Hq/r;f Kjd9~@bzmذ#wrif#gW^j xgfAIj9(&SjܱfŨ%l~ʔdq>tg~/8Zmՙlf#% ^ч.$rԙVQ:aOKD"iיa6"i5elqCjo`7$+k2m_!xPq^NJ4o^k3dde˙9-<ȟ>ю=؇f<(V1cpmM.xsJTkXg&.,ݱq?Kʀt/z_`ʰ~9)\y-˷_np52Ȣ77S?ȋd(4[ ec45$1o}OTX_e#[yi[Y^(fج vfz +x7ačbӽ?*+מR25`w鄝' a@f֔[ ^?!J9 4Q;UW>/Vkʵ:*^ť>^v~{Oeg7'\t5:];wuHcv"8,uuJyH4g"G=1l9QЊ~;ڧPMuc ( ( (%EP\;WkjZZND{0fQmM!=Ra"uk>lg  Sk3zIg$K9R23`shāVvc(㙢!I!t0't֥y[[@ěmƨF։cۯFTxRY(؛;LƇdut:;F0yēc[[lYvrwӑp;L+b8}Lv-fwsx!T=>zڵ_3M**!jwqǷFT=P*ӛ?10 @FV,TE)c.\ @˓ۻKX\ V'@E]^R$ b[=+dv!)d,ɮ4ą`S*uЫH;N$eK/Е ,@ 5pA *a3%2KmrRHQ@2x(UFg1*I rz,xY 6ޫWffEJ֕wTgsf۱,N7y]$ݰbJVE o{xo 76^ bH[j҉x!׹±8X^1syM`v5keiAۚS@pcvҜ"|e i6TXTQEQEQEJ(vDC!S񧥤gIR@ޫ C,c<ҞhBRS(!:¡.y$XW̾$=OgHAU]?VVR)\G b.X YZ2sH-jRi<K?+Džg-U(}3'ي,c+;Q[ѡ&ލ <9&H,k*iܻ϶ `H$­'4L$|-^] P{^ ܔ-̋4+l]LIduOeTh^DΓLw'QcLi\yڣ<XqU !vUM57|ogoJPC$PX)>;1>\Fsf{A ˜Ky"E$zUB; MK#ML>ϑ9G5_Һ*UճFiIiWŘq!# RZcExbR-}.AU#R+qe ]ZąCP%?v4Z{ͦz}]V$tE6*>SQx=(Es2mkxݵ4v?svz"8؉2}(`G\rM8^N?kZ44%*CXӘt#[QGAxH體 4\' y[-8_reߑU K30BU0k MCEww[0`܋¯QP0+aS5##K3h]@\ G>j-446юF k[}iZJJCą['3Qc6#SAoQ9`<ҪNc<9bEDgʸfrGwXQI2'+4{+^;\Ց8URAdnn=琡\uLm5[DGjDˑJr7ʴTJ[{ݴ7ڦ֫n^UjI. qdshxjRM輒Β%ږߥrel7ZV?ez}`ݭQ!v 5[{^Τ,5QYmƵ/gŕncWB,vUBM.Xݚa&@afPƧkH խʍfOm{[QfgQv|D.e Ŗ*aXFF8'@?eto UfZ4Aә}LַXAkyEj[.NoRm[3kX{|K;PySmEz |O.oҊ(C:gʫ}zEO̱t6>55P[>Bf1PvYoo*(k}%OחWeㅿj((@zAG(In9~Llb( leTQE Pny1F??E$8s當Ur}i4N[E"߈8F[Z򵼨R%跪Ơ=mEJ Ջ_b-EPZ՟@8BGloMUU^*fPEm\\/[{۩lXMJl'Ç`,x mѽ+;4lM.n;{ӺLXe8'[nO*Xp!3ƃJb2KJ<.#j"6ܚV̽GmtSC69WA=T]M?[9(g&5)uۇJĚ{*54dJ5|nd6_y MEmA;$|BޙƚZx֝x0p] JiZ([dT21\k WqbH%9&Ǖ伋͆ʗ+q Sl짂Q#-ݕ.Km(D[ -oDl=&Dޱ~䉱:>jZ0܄EeٔUL}R̬ .ꍭv $|i)_`p+cMûZ.r\G=lky[oi\{n?zӪك>ʼn.s]4sSKpdmIgK|amH"|)'g>F%$sʄI>T?ɞ2$*^" 5Y5>3m(&HխdfK;%9ͯZVmLrFJM2d4*߂;ZOC/\}B2+e;#Q^H$Z6ky CB7^Zas}(c#HZp#JEAo`m H7?*N?xt0}ajKI4)|l9jhuk!yiG|6؞v27M9bE;=FPcq53DqMR}8yY$tfۯγ]*l+0THIy:>NMODx(f}m\qtn$:r< L%J^NrM\7xI1O E(]+'it͌3IT¬8-5 k15ivK}$8R~ rW?jms@E?ʫeyD'ozcG(aۍQv߲zgԀV;XG~qN><-<.fw4Έ=kvPk P$l!bBȸf ,ѵ ș3+5 ¨A/* `{XywQ=g#4vR9ai[Ed<["B'@|OyQPxT$}cv䚞hleo9 e^vSi1zsㆀP7̎>**ZIqUfB{ \y2ON 5jUG SK$`?cђUЕe ؊M24w#Q&8.<9\|jTt+# ; ,L:WΨOT+0$)P<aӏODDՈ;JvѷV{Z`VLp.tgXf0 jZ14?_AߴFW u;W[.@, 0#Eu0rh8{s`Ċ+qdO>گCk~ 3:KGd=~&S%%@U9[ƮC WGNM:xp5+穭mLm,Cs MozLcIή]֫ԋYrAJ!ͫ@ykM@ h]NdޠZSf ys'i}bԌ&+o5J#j)tp#CfV"u_2+ItJ;o޴u X>^֬pr"LoLΨ&hRI1j <(8Vԏj<+%zz`eau#zca`ܛ4i0i}oX`U.\PX}eĥ9 wݘ<3% vYMΡ٫jkZS]dp TDHzN,r } xQLsHK!7sJԩ2r$1 ݧ}2@*< 颐]Fʸe҇tV+S-I҆%YnaEb4'RdGR @YUK7 mXG]°BK#mo¦Jӆs%2snF/ƫ66u:~yxփ+[`nuG<c3oDže|t^@fҷ0G&' K''\.FQmQg8FI .+@#CRb@rʼn!;IynFˋ#)U`Mr}vfw2܎CQBK7^~C;.IrlB( m{4 W\B}D>UO3HU(coM&jak0s0KQN~ٲu#[i6E)bnm?iYȵ4BV9f[12?J(5hĵ&o)^U޴Z9̹A/wːېX^PV"`t޵Z"V%ß m+@Ξ57Q H}mQkhNJ8!}Ki`Yy#p]@캓SƙS4Sʻ[#ۺs4#J+*-!F*h3qVԧ%,/Li1Q`$<Ԡ5Bj™՗ Gz6\yFc4y#ʯ2ZAŤS͎}-y}B{KbvM+Z-o lyKxՕ^ZOB? L|GB(?jbny2iʶ7:7H+24 Px[ Iæ X>uJߣHGdM` Yjik=51e鏹t ߚ=dgE8>Yh [xj="uE;ȸҟiD=<%w46ޡ2!76u%ڷ.;j%By %b"0~7#CUQ{n B oӂI,)s%LL-{ӲL"BW&>lYZFFiM2È}VV]ZZל;.Ҧ* 553|bڴ`On/Л%l,lFA?!z, #bI52GI`ʤ{,b;AO08"YBi>OH\HPXv0aRڙe# "T VEjbLz(| ۥ}H+`n۵zLəR| q5rRh=v xII ВÐC Eg}$ē}p%q_͕ d8X==O2ˈŔ =2RǵM(:Wu fksgVlb5L|ŏ 4joQ{}I|q]*r#"ٮNƽM_ԅLk2eQr<() SQ/*e>^p,Hqj6fI8BGʳ9/+7euhr0<S!MZb.`u.ZK2ۗyt1rc),0G/DfgC0rQƢyY!Ab*\8&y"U;t a [CƋ)vv7mFLY"CMӽ{ʍrTDM9*ߋn+I[+ڤyZ~l])ͯY%]~ڇ9޺w\poN}LZbJΌmX8UϷZ*z^׻QO_ ۀ#Q˿VaZI<O|H&ěʲXH9TaUSեG ՎNVgIpAÍ4jH X!$j1UG]_%^~k[.cM*O r 5lѐJū$V$d,; ^nt EyLGe69 IpW\XUEYNT #_t1JEAGH|TVq7ccNxJ/_-fG {X <6/ZArwAXqpSU$bF:Mjf~ U2/u_}!Nn>i b8lBy/v>V n'bCkK^20"" Nbz@@64"F9,OyQ9LCXkt6+ofh =.c:X",n/kj^&\R-@=UYz\; ꤝǍ (7aI}a)cƴ\UG&(G ;Π.N d"ۅK'u7LP{)lKBS@!tĖ\*_-0 ]߉Ƣ3Vbq=f5$P .xkP >GA'@;|sqǝ*Ek]>U]Vm~9VVZAG.,جXў#"FY@_*2e sʋlٹۑoV ŁFb,`nVy]bm]bn u,t@12G0xx 5FDGi$dpͬ?m7Sr].wT|}Q$v]~իlF

D,߶A>QڃyǎNII`› = JqCi'P ~5ұO&慟@ )@Y0qT184%GQ&rb0z~=Tp'V{"9#mt$j)U؍jéQd-u8ERjw#h_O7(Q_>G&D)e](BP$bl<־uΐA;es 1;)17>C+"0}1T@Oʭz1&tH#8d.ʖ&QɘϦ<48*w^?KPUz$^[T]|Mi8/tO=1&mQMձE:O 8Qr\UӉHvh>"8Ux"]l?RT,fT ֓&ֱ] 1wWTxvc;h8WxYUno)@MW|rSTJ%ˊ9 8ەhkPZ'TgoaZ9IRBI$Th5pioW\FhV՟&jdbCŋ*)т#&iA:ߝ|wAVD1쾀R[xinzS31DXb`´x+T EZ “ 5ȘzpR6}mɢ[>۞XzͷFֈNKO U--'$'0žEz<}N'Q}ö0 e% \Z^tR rV(a& xdx8?#MG((B8Ԉ}D酇ڊ04 -1Yqsxp:tQ:[[^vޡD>ngA6V)ڣ},AX RrS¡d@  jUVJ<*csazU[QTpB0\T,CyFTBZ7iOh~6.K^7׺|ig,<~'Jзscz'[-]8 b6Gi#:iob8߯f]!($@Mk >f;nt6羔E Bmrw\p:SbV,CL \MFK=/m;N}F{(m2Ig1#UMJĿ=G-% N =KX\?p7!kzM" XOn*C4*=ܰ"ʾPMG,Z {LXǙؠ?{ʛx1ńv*iKʲoF޲&joH U|;mVAI~]q4N 8duʼn x:*5ݲ0ELpmûVb=G{b HETeaXH0Xj(,_o! ,!9viz%PMb̭83L ׿h<ź);I6ܦO GEf6^4㏁ TTʷMqEJnAWFRteMp$.?uZXe/cĝh(<$hcsʌ_R5ZM D1BJl6,ښ9bEEEΠE|. [S.nFNJny4H[C}*QLKl4SZvAUS5%LӾ)-;۾B_sn y]E]e9IMr?^s4|<xП1?\ՌecK=GY_BO?UɟteB^Sq;dKʊr{diM))具n#CL0p֬# xTf6^^h:^4+ {=57k}HÙ쩠`f&D6״|93G^tP7{RU{ةnݔ9,rh%P!us^[ڈ ъYHⴋC3A]o*˲o`5OLՒ9Uo"64YL yxyV1Ȫ[oqL*o"ku[[J2.4qE4ee3_p߰7 ۅ^a(1R66*9Tb_#?;6f$7`שԝdA4nw~1$XbAtFǛ[~z:x+#\}K~D Rqpn/*Xp8Ѹ Fzl@Rt*U ,P,HЭߖQʢe"@xz Xi}qO.,V&M"4P$E nݶVX]HkX[Ϗu2V!?vۍO![ yunSaՑoev݀ 9Cn`OUehQoef6_[?T%\`˥mp4W=HEi'Q`帾3œGp$Ir s]1Q-(Z8\4Y"hhr.^4\.WH ƹ~ H";1myYRmlnĞ4H:kq;O/C"JpG(w鮦cʙgfHrtŸ,vv^.`U1 s'J\ dIr"ΧCE6Usʙ0QsMHCܘxI<߶&}TEkTIQa{/c Nq$Vn]V4lVBfRnNdxU;$5OByOOpS;4scIIhAf-9ruN5,("*`KK?|6f#ȧc!i$`mߺӡq /EZ!9@l죦S<Ʋ2LļO`j8:V <4ȼMX2Sg2BbE& Z{$D@w-nPK [͘h @#G7s i~a NG2PD"Ğm, Khy;jcE&!#IQ1eWI rMiu-70H i kz9~ZɓtDgWoo3U?:pSgW)b/WKkbj̑ٳBH5\?;U"11HkR;[iE:tB>c#Qt wcy$}Y۵J0#, j;(}W$|D3I`_ר1{I#q7zNR@; *pb%FEH]@y@_7r y&Á}-)cᆳ -{/:Lp4 ̛v[_OC39;Oq9J&UP|hEQ ɣ1L#BC%SQj:B6.9ڹiba(Hc2\ kI3 axK \>]wHd}UO_ĈU[cOcR8~tJN>nݟ ӺA]E3s߅a)%$C"ŝ74\}7Sh; /ӑʹvry5=;9Zn`ʧQpgwE3aQCՄ;C\>Q^:Þ o$L?J.&շ!]*"p).ic~c7n͗NPX?^Li#Xv-E"L#+,Jԕ3)>2)i eK夻wt,q^VP<?&x'1!77p=-ǂy/#u,Qxk{"gVl &*L̔Hy[O/ 1љfP&ȧIÍ1Q o`f`6EU4鏜(ؤ AW\|>^B}-Scޣ[ 86 lU9=@s)$(4Tűor_'?PӨtp,s-eHyTi]kE)v1 U i6"4/&j*5I@ $ScŶ"skkqkt)W~96=Q^.)bie3B ,,˹m~ Z֎gl`A.o@Rd4?6HodV_cUUmo}ŀ [ 0oMVJp䥞#F%B7*X7mH%I0>*ySX{;bnFrIȒ\$~:m(#€8k\\Z=-%c8o'rWTR>Xb gRo 3kZΈrJG̚'OCnPB1:*$e٦0vo Mi%*̩̅NR:r<>1Ǖ;jmHyj%% 4VlXi?Sycu,l&Ώ9Dqvk ,Γ :Z\1A)+w.W2wGMrU1WJwE|W*!gV?"񪼬 s~:!yD2+JQyխJdtӢs؛ <}5_єLH lfcԟ<"QeaMJe\>y[fbAhٍC1=K+|mQS8]O*tp`d [9,(ac'UQ6=O9]Źr呇Qfh\NEA\9MۺPvnI8ݕu1&CM)kJhe٩ro+4vte7rQr}4DA=]?QԳr_KǏ7̰UWF~u\V:yQʄ-kLׅ蒠gX\HeDh%/r}8bx(֔/?ez7!=C )pNVTXPo&wJ* S,{,RkI @Tj,8r8S;FUm( 8AOSG ڎVޝlre<DضT^呠~cT۰ƊLmT{*|K+1-B&&.4xA@#V۶QLߛs7PƓ##r΢,9x  G/%#w P>T@mQjg ds664ćhxqK-sXM7^;YЌhײՊUy%h$~[rmo]4E4iJ?hB("bnΤ9Qo}´Xmc0°o=Eɕ"UPc!jy[Nj+c!|6rTC On(tg_9+E98qNCtn0?($EfkƋ>O (u3xK1ڗ:QL#-Y3=O"9eXHa^o4M +[vUZեg[?xMfO3o**Ý>h&Y5]. IX1ĊѶHniF^Lع–UX 3RǍ+5.ϔizt?UW^v[S=ѺRn \Ƅ|ﬧT1Ǖ舖+ B[7^̜͖dQ}{MjƍxLWZ~qZ2rLT66&⠨6)'IƈH+[F"p<4~ ~dhغmj{ٿNߛt]+G>>Ԕ/s~`F NcW2뻝f/Q3:A*+WWES;`ԩ ByWHraz7gōr*IR¶G0 5k|Mwu[J7faf#CRO/0_雟q05hI ۛqsx:tYm_+*Skj&ljzYƀѨ . F Ǚ²9:p4 !ȃnB7Ny\^/](䵁<& L#7k 6oŃvUJ¦˴[MOaƊwl6hGI/Q O3ZA6*fD,ex۷ԹMՓțZˢ;@w5ÑQ -GkrsO$Oߦ|@G ߺUUK @0 Aq)քF}l*,)|jsrjewUvO:4mBPc<1sm3Jr `ѫcf]<9ГHoʟ&[(^MUC@|^܇ 0l/BKEN\TTw<]>Vde|u\leR#1j#C ew&C;BLddqupUeoz $01} 8k֮T V'9Vɓ@8+c/̍X|x{0}aU]"i}͟L=?q5V6MJq7SONB~^p]CKNU5~"DZ\J :)ZoQuc!Aɫ0cKa(<nlq :*>čE|n6zԹIOѰ;Wbګkm_h $=7Rb#Xzh[]d}ᙳDSUQ{&ٸ:|mdMU4z; .^E#]aEB_Aq̌ m?7ukֽvM]ula' mjL:aqWva>j!,ƍ7=7L#˧R8"Ic6nͭ5_Ф0xjOzIc^rZh ~b_AEzv=Ɛ_Ʊx5MV<͓VUWX[rNdH]_ ]{t:?ν|}e8٠2t 0ǞviOOydxcuꥥvf$72NOs%RUe>J[nw ]O/Pt%p/.Z+7_jֿsBUgOngy='T-$Q7HOa* /vP,6CA MDRR;4"<Ӽ.6iSyUbJK>孮7YfXŽo+XT<%z>T 8#wPi+"r})껚N'5۶gSu|}BgHiX67l AOfzk۩-r<6G^*"?l*Cλ S%Ų)#WR. fM|9|x51 Kpjvfd ,E;)OBpZ_Tm\zFVI5wbmx! nWg, .pkW_C2:H{&⍸CTi4"CmAA߯~HRgB@W^BG*Uwy`nkZk9wgB3KԽ}m@Mn6Zp+i$"۹NmtDekk1Vu5 Oƶ2" #`Ti q]EK[c*m-[ݮG_|EӀ #5ʶ, -n4N?GqQ3jhܙ_BNm8>VD [#^J=B0[vQfNClpvS鵈ty y3?s5MxMΕX4"ŸRqfa3i7%G(F4>\z6`%77h5>#Vb)bV q }GF,~E uԡ76Ll ,#tNoƴVFNA_"Kny3jHlT\,]jtDzD #j7ְ* }KxUW鸱:^SܨⱯ I*bKJNjn.91F淘w@aeIo쮛FI2Y8 uc "|)PGX\, $"$WƋ*!me}ў4L~Ŗ.!܎!\[T;=r`=:I-$#t7Q_?eiI_gZ8e4V%aX7GWO&&j.$rwmAUk^Z\e9X.dӇ>Kdphմe,ȝs/49>YnyT1Drj\࿑q3'y2"%2dV=W E7CZ} D16jn,e`}wL寗"0I. -u:x^'8_}Ƿf=_=鐶䐓]of(uWõL=XrD-~!EN*wZUq$r_`{lhDܘt ӝX.!Wݾ[rΤoZNmځ"m_5IKtW.x ?X-r :ГNsEWsQdc\.Z\loVj3֌(ߒlO['@{kr X;ҵStekY 6Q aM[J64|>\x&1b>OtG M|T{^Yj\qqV]X6TAeRjͺn;;8qzV"ȶ=2T@Ӯڻn٢$^"o=+3KN.D!@bespD=7+fzV9ⱛp;h)a?u%*cl-'  J*ۓJDNeb5N.ڣ-O\(TӒ]CtbTI#S.:;b ;l7P䊣,H?OoƹհJ +:_@rJQJ*TPV^|[eqebnooR-r#VvK8"v1k`xRc1EQn[cIJ*J*TR2SPjOo9rlj}•*Fߋ .?Fz2*TRJ*TRJ*TRJ*TRJ*TRJ*TD928*EBJ0[}KUF"O4`ƿ{jצeF16J-eVsy1h7_v)EDl-Í.0d871IҥSo_ TT *TR@ *TR@ *TR@ *TR@ *TR@ *TR@ *TR@ *TR@ *TApril2000/Aprilwht.gif0000640000372000001540000002134607446366432014375 0ustar affweblibuuidGIF89ad2d#bm+6:Bl8j%jVVXV=*g8N25yrmdT *]5+w<K+IQ4Ekn8i`k]2Q3Sb f{$sgc'> cPbSn>jYG?Xa+dfŝ埤ѣ֩ڭʦ! NETSCAPE2.0! ,dpH,Ȥrl:ШtJZxdفO ye2Ù?v|E@ USAJ|$MQ5L0IYj5 MА4&m#bIf[NT}&bl:% xAFP~+&iXfBe垲4ꪌ2A[jr+آ9J@)) (:,x^Q=r`cہ 6* 7hkN9;i^Ěx^)/%CH[~\0-WXα>HAY7e Oک3xP![Ŧdal!MMDIAY;3 h <Rh1GBۨӚ-9IP;{BU6A V06j t矧mC|_TTm7Ll H4PlA00 3h*X0l!o /\p i%5Z`zx4䏯4'(=%<I?@ S!]@ ր\$)+p*XAY ?銀9Di@Ld:+1/_';:(_ 0n%L`O @< v#VvO`p l@!q@ H」 +EMSX XЂBwBB|f"~D6U2QfD7]HfT  HĠda*HՀ4` z@sl vaZR2E @Q!@*E5ځ;M^~CXks)@#O$:7yx8sJ0 Px/80,N 3A t2,'%G^e dHT"a7S>gy `5%Dr>*9hGE|J IĚb6Bf >WS!OmW*Ԇ9}t+4^"j;i>K}*jsFCB@MO@/7@ ͟I]5.v͗Au@j8 tɾOly93#r/}&>6\`Ё2(lxщ,*8)K N|hEw8?=\h"X*%-#|xeFНB/ҚHg@˥.xwL.K8ϜF2 Ώ* R˙=(~;FhF3oԡY |P,@#NbP猕:@CJٓEG׀Ы,2}Lců0L?7 BSn#/oEF.K(pj \.^+\]" 7(~bLiۊ?? wvp-C:}^/L2+/X]Rt6cc}Q4ҡ,7_P!Ձ  vm$Ipp/U\qDKC>.v5_pD06LK =)+AQ" 5p[W!FOɧDK1t@@;0P~4,ޡnMeslnV:" 9,pTX86 ( d0itWB@9d ~O0ϣ|"~pf֠MH3|! /XK b-EFWt-bMAhK}Wt R;gz~rHH(o8 `"S^GSHXtrG=XzQɂ4"A(mՠr "APHBsSq7\H0}`Np031r3nj~kpXV}whm4i3 $*'{nX pshCC`{VDe^tG6Hqv?!x^˅IXp"9 v@4) CmuKsG>5t4- TÏ@(KIߧvW!?KKt3c +:yoA9 DiI0`;ӑ7HgHYVx*/#umbI9'𑂰c0Xww&9 4!4_Jc՗+JGfߕS0e೘`8%JIS2qF$8y);u֗Ӄ|fVd :ⷍŘKx H6PuIh9,5FxFvvh6c}@(SpiAcyPw _av/xa5.ufdYffPJ`Iq(GIڊ%;yT%0S9PIS4{zk 7'6{4д?J_LZ4krwVP=.GK!}@G zk<2h m"o!ii)JZiaeX .<4KP ,r*a5hD;h=G ojWx_:gK+: ,ZX8ĊjJ)+@+ggR [9`䫹Ѹ& yl)sO<&,+{ @]5ٗ kK;vK wwK[;k =p«K,@I{W LgO9;8볷@LIp *[KjO\zm$B,Q;HN;WUpIVV¹Z, L5;a4|f&dF=q, c/K< lJū'L50>>1 GyW yK|;+;PL0IZK;3G@g5 Q̃}9ƶ<zkwk  :̯,J Z{aKkC  )"Q7ʫA[w  ľibξ,j(k;0 T ;ƲS.!1Xd 7M5F|\α?;Tù:oD;qѶAl !N@)/+; Lܫ0 ӾIUV^ʲܼ:i־,~KLQ ӿ7}׊‚=güj ؔ fF7`֚ΠR٠΂UĤڨ= Yڮ]aڲ=۴]۶}۸M! ,yF!p(t|5rT?uiZ)/Fw zZ.TǦ4fE?tD7wBr=ʢ@HM7ՌRXaK=h{ D-[1I'K{kB(3r882`tFftˬ'?vصp*G L>9ZP~0|(b.rYsee! ,x?%ppjql6]>oJM:A@FRyS $4ghpE'/_r:7:pr66v3<M?<9==irjd 3?=<" pHȤR1.OUӉ$YQXtRU.&JjnwndV^mNʞtv2mV<DzEҦXgpz*i7^%@R9:ŊuA#"= "W9rٶđs@ m%Bw` 6 ó=l,QB-'1䔌HZBP?1P92 3a<;߿#dF ȑw 4auxzPnc'! ,zA p(Ȥ2PY:I%T/'i>bd,q(*#3ydWiR?B6[(iI+*ly~<<:=CG 4B522>?<44:B< -7C9D63<3391GECf 0IMwÈ4R W Za5.@*MǏEEZn B^2i#Vr) >]j^N̨7 @7B]@(Q=!#a")q1DM<:4=CC ,:G79tGDB 9D9 WCs9 99G,<= 33 April Calendar

Mathematics Education Month
National Poetry Month
National Garden Month
NCTM.org - National Council of Teachers of Mathematics
Math Archives
- an archive of math related material
Poets.org - national poetry month information

Bluemountain.com
- electronic poetry cards
Gardenweb.com - listing of the many gardening resources
Gardening.com - plant encyclopedia


SUNDAY
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
 

1

APRIL FOOLS'
DAY

Daylight savings begin

2

International Children's Book Day

3

Find-A-Rainbow Day

4

Tell-A-Lie Day

5

National Read a Road Map Day

6

North Pole Discovered
In 1898.

7

World Health Day

No Housework Day

8

All Is Ours Day

 

 

9

Winston Churchill Day

10

National Sibling Day

11

Eight-Track Tape Day

12

Space Shuttle Columbia Launched

13

Thomas Jefferson's Birthday

14

Titanic Struck The Iceberg

15

IRS Day

16

National Stress Awareness Day

17

Sherlock Hemlock's birthday

18

Pet Owner's Day

19

Humorous Day

20

Look Alike Day

21

Kindergarten Day

 

 

22

Earth Day

23

William Shakespeare Day

24

Pigs-in-a-Blanket Day

25

National Telephone Day

26

Hug a Friend Day

27

National Arbor Day

28

Poetry Reading Day

 

29

Zipper Day

 

30

National Honesty Day

 

 

 

 

 

 

 

April2000/foolday.htm0000640000372000001540000001226007446366433014257 0ustar affweblibuuid April Fools Day

Did you know that...



About April Fools Day
also called ALL FOOLS' Day, first day of April, named from the custom of playing
practical jokes or sending friends on fools' errands on that date. Although it
has been observed for centuries in several countries, the origin of the custom
is unknown. It resembles other festivals, such as the Hilaria of ancient Rome
(March 25) and the Holi festival of India (ending March 31). Its timing seems
related to the vernal equinox (March 21), when nature "fools" mankind with sudden
changes in the weather.

On April Fools' Day all people are given an excuse to play the fool. In France
the fooled person is called poisson d'avril ("April fish"), but the origin of
the name is unknown. In April the cuckoo, emblem of simpletons, comes, so in
Scotland the victim is called gowk (cuckoo). The custom of playing April Fools'
jokes was taken to America by the British. It has continued to be observed by
children and adults and sometimes involves rather elaborate hoaxes as well as
merely simple jokes.

History of April Fools Day
The origin of this holiday is rather uncertain. However, the common belief holds that
during the reformation of the calendar the date for the New Year was moved
from April 1st to January 1st. During that time in history there was no television
or radio so word spread slowly. There were also those who chose to simply ignore
the change and those who merely forgot. These people were considered "fools" and
invitations to non-existent parties and other practical jokes were played on them.


Día de los Santos Inocentes is held in Spain on December 28th. This is The Feast of
the Holy Innocents. It's celebrated similarly to April Fools' Day with practical jokes.

The first of April, some do say,
Is set apart for All Fools' Day.
But why the people call it so,
Nor I, nor they themselves do know.
But on this day are people sent
On purpose for pure merriment.
-- Poor Robin's Almanac (1790)


Links
April Fools Day ECards:

http://www.postcards.org/postcards/cards/0040

Yahooligans April Fools Page
http://www.yahooligans.com/docs/club/fool/fools.html



April2000/images2/0002750000372000001540000000000010110755635013423 5ustar affweblibuuidApril2000/images2/wraak.jpg0000640000372000001540000001507407446366462015256 0ustar affweblibuuidJFIFddDucky<Adobed       w{!1"AQ2a#qBRbr34Scs$%& ?kک2Ƭńu)at'/:PFyv<HY& v+py@h 4@h xeq<-3[4qoi; vh:q?nhY@%Tl{5 `@$I#?sO#Cx/ʵ(4jPڊ%XTV^@ WqW#7p՝X} /ų3-Lq%JÄXY##ڪNi Wyb2^M 1НC"K'wr*7>} s)5v5ڰ2Pؽg`Y4 UYM|_p?n+ESc`jX)RIoOӧASy,|OT{5eI5L/wy ̑!cI贶REC$yz]mӷm Bۼd0f,Cs$*$abҴ>mEu sW;m/^! ٖ,Y P6*x2;#綁c@0f~2]y.`n ZPynj۫^<u4| ϖóul`8I9mfشmqz~⥈+pb>I/᱘5agfk zM) [X]1Y78k2rMd$T5i#BòNX$o;Nq.7Wo,W2A5v~k\/&ؚHј+k{E2o7հ9ɓԈ8OcwHT}=Haf+l,7&ON'୷-w1407n|Vo/!kR͚*(?v᠝4 ͱ⽿]t`.@f52Jݪ?i$9^"Z9W^;z5{UzyEQqMd}  O+ߍ^q&>ֽG)J$LݲTA60+l`$d l`JԔ"n۾2|ݎ<7QttyòVdw F>rVmKnt t4ߴ8NSQ`,o( CvDGm1;SoMw_ C#Uz s[g)>mVlRV̇\hr{.j5u|A+?B\9,Z( s!݋`7qoy&$MIo:ۨ|tP^3LA0siݫ@oJ=͠Wvgv+rD 96o+tبrrIVŰvԵxo!d}qk}K˞j4[T䌣砝גf@Z>nk']wJvfʽ7,@h+ Q4Ф"4gFw]+^WoFχ$?}*(U({q?-<:B2O =@Wc+\?nbc}^'^'A"#JC[mZd,qTfYρ$h8"n:82^b@ {Ysx5sr ۘuIn|J׺yB>`qٴK)DBĆB$>C0O,3_xfJn.-et=I񒊃AYf~ȓNGjU= 4c<'RS =R-i>(Nϣp~oոSC8"x;뾂@h3ܗ#?Wp.?fܹ">]@@a4 \^*Z)p2R·c®xh<)&#naܤ2yѣze׽{C 4Ø<۵%3O߾=?qܴyV217dYGnߠvJ֢?RvH@3!=(X =~ ~(,D K f;2* cZ`O GR|z= ?=v B./ jCB"z/N73wF0{v6ee u#pG@*ȖpYz^?%O7c^/*HBs!7$YزYs 1NJt&w!U/#cA5ޝ+Jw,lr=>@?Fʯp,9*=zw v$r/f)ibHcݏ:KI13y\SyHkvX4{ZV!.ǫh/x[uǞHٵuw*XXo h=eH+ޛ $U$5m2ke Oh,29|f9YHcv"34 >c׸7%irhZR=h܎?4oU{AϹ*NCfXl` жѩܟ5r7 (8?a;bd1YBޤF.({Q(}l4Vڞ;5z[ 3佘8 ]jy֭]-4 ̰IԛvBIq>Koc?W#I|Q$ א)=; +GzdfcBV> E"QDڢ§@ʿW2Do[|cX&z~*o$EaXHn[['R{d,䪴sqJ#Wy_h՘t]>G> Pܟ^8W%vd rn'K;h)k.F4 Wrz7%tg >vvno&MJzjФP)ikec n75xTP#Hʝlq %Z&'&#Uqg!Rͪ!vW]xTVIc x<ǎFѪd'7::+Ծ}6`mGqnx+IK^n=~5X@XmTt9(G ܾZ/AWLz~_R՛ 8Fo2AHʻu;՟E 57e M!|zh4|/$O3$\']s ik$,;ee|:/g-U*KWRFH̞fpeX/q~ o(9&ոԯƃge$康h q,YX޳A}ApI/0);'F;8,Otfr(hT&UK3O||:˳ה֫]`d֍)5/'S~1uqjr{d7*JOwƿG8lB]_[2UHt쐆` k BQ 7 v@d)vKm!"`gn@6NV9h-)' ch1ه{+5Af N$Y9; H&_߻$?#t|& uyĤ%heacHO@ƿ#Ȱ'R[?Kaa"˼aT'wa.O^a";rv-ڝdGeXgb,ʼnF`M\nl'~fG-Y4JER&UFVpXz19 C-oM~!-rf覫n-a7fz]wUrgA /ڵ U%X jۏ ^,Beæ/Bk9xU 4;!S҉`&g7ƃe_qWDI,h)G>&VaQJ i: g[̹g=+c%dHKp^FU>z;Q=+ "+wE aIYF zU렡DhzH+;]o@3v8؏W⹏ ݊Oۨ ׮gh6fa6 A]R^al핦J .QfJq揷K[]BZe!cnc=òfno][vhhF^^gm@G-,s|1҅&h(e\;rIf ӂറ4`:ܫ?_]dYDaR[y$,ߠгa@- O"ẩn~ w݂&YaK%@@6\<|U&>KnEoI[7QB>i s>]eck H8rXR2^xKjP{ 걅QAmTq^Yo@CTդ^NwB>oj.'L>ڇxzۀoR*TɸRyly"/#EAH;4STuOom*ٜ6V"ʂ52#a3>qv=*J?u2=,'&ǨR2,tfCz^[M|s=r0+A{}/7# à4PU=AnR1b`b`$iWMV}K9MȪiZRX-셍5U]^k" J(UU*4zAWx\D٠].Ƿ^u,DpWV))-1sksRRR·21e!,& H*\ȰÇ#JHŋ3jȱǏ /mR\ɲ˗0Y Âwǐ#KL6nj]AŐjFTSӨIZX&A;uڳmͻwݮ_ -ec;rs(C.:ֳ߄kr^>&|$*-Y˷m79{-ݲq (o7`%hj  ?#mvmuӇ$b[f&P 6Pm8矀RV8AiC Lb$g(| ɢ]H , ԘhB  `@1t`C|(HЄ'Epь^v*  DM@6 d @ LpLʘ5F얺K]|8Eqn9˚@` !@8] 1CB8MJ@D DC|8Ag"9IQI( DM@9muZ{Էj FiΤT%1)A(2\zT1[5KHC$" IPb x`!d X#4(rЄ XZ, ȀNp/$Amhv 0YT"Bf` FhJ-R l@7JdԲ$?Ql\lnFIJG9ԨxfCH˄@(8 9P2V #H @@a:c%("|AW@A.Py!@AW ^>Qd8u[CIRTC1I5snzsYF|Œx ( sDi2$y|xPwc3 ˎ  ! 2 3DNȆܚUt) bp#>>sJvܰ[LVj)}7%#W鯴Vr((=훀-) @ "xM "4!yhȠ M,& H85 Hd "glmǞ^TxC4eOLfo h6ЍFy RhQjnf?tn&Zə<9^)b@l4@Đ8+~@6!2D.t@#" .s' u@QC x@!1NAˣe$sY6kS.E?$y}lPlp?[zĻ͚qBF dk7HD5ᐜ%6hc G [>4 La ؠ!&|euDN )"2d 02`_p0,FHYHRpDd6jt6Pk*-2$xx== =f p7rH ;#9k)W!6/~@  ^%h`1  E` wgHty1jjV+@zV#4W,O3p <Ipw ECCq#i'I'~\P X 8ddш#PGr)uvp3"YV_``P1@,1'@G4pt&`1nʷ$K 16'MX@ X fHB'v H"$i,vo,F i!SQb8~x8X #Q7/H٠!DaW_$Ð 0 2. Q H%9"}q5t '`~~ 1fj ;t %Hj~`W+ `? uHME ``d :! P9  LPm Iț1`a;0|V`9p Y1[DW siUQCpV ptue J 9{*A4v|ʧ/ $3b6`(II4b%z ;Y @;z xjn×eTXmM p+Qf(ܡY&K0;P s` (@1 H`D9 /6 ZH`@ |S$P1 p L0 9pa9Y\ 0 x׭*@xm9O'xPW7|#I I"Wtj82 8/!Z%0m8t&3U\&0w@ ȀPPlL2+Tx +@tj`Gфf&TE|ApnBp EIMy Ojb}!i@rI9gHV Cp79k RaORqQ;F0ۥ{`F(G`d;8`H |J8p ;a"/~L_ s 0 J '$XZ€_ `: b$F 4,IwW&5@' K1B* (g(9GlO piUԍ9Q\V4abv 7U%3Pd1EәHwP P Ӏ m@+yPEDPZ vc$F `[2ukd5Ek5E0^s v4S66 5\e:#UOwt)R1q7 &S w;Ѭ'y@yݐqwj [ (lſPW^:"P$ /P!Иo`AS8qί?#&@#YO~`[Лp; F E|Ax c |muZ 2jZOHp p7b~:!`QZ}/`x^%#A9GM @#bf7WMq Z0 `] ѽᕘ)<p]> 0`cE-N 0o*D0aQXTj$` M`~0  sD -S WB@r[-,`-7 pQI'mڍ,a5Yb\ڣ cod1` @P.Q\qQd,8N‘ඓ>  >>mp|:J᫇!E y0v``2`'кX̱F䧃@9y``IaLVT:+P40P[FT=MZ; OUPIŻjnxP qWq&bM^TZ ֜$~n.iՆ "02P%Ð%/7pL-.H%,ߗeƐ a ; H p[4 & Q0I_ p@d1 n Z 6=i`M0ۆRXpp$~ PiK\@8@O/egX ȀT7 0m2!`?KHtAc"Vxޥ:r2aHDdg,2 /@30ka! @}: 22Gtk =aVAAVb! # 0` 29Ԥ !1L8(X5 ic#+k1@dP*n3\6HŅДqZUYn۷ ͆ ZF[iWm\*`ڴmƭ7ܴeەܷw6llnc8 D*@ZAZp*`UNLkܹeU 6T Z?ɑ їۉbF(QF8m:%DbXA'1xɏH1.Guv'(\lj 08pd8, (0 \.)!h( b@J&@ƂC` F+>@>`v(" iK:*/Caj#tS+m) L̆lj+ଂ* Qb x3B]F\ 63jTFU[,9`*m< ʆ2juخG6Έ*>6Y{bjh#' lV(!^T4 ?N!(VdV$5Ԑ @ HйC> [V@0D&PQBJJ)ha2! 4%Vn.8FCBl>dž =[KB *_見22T^˦\B|Rg\ #,mHӵpmolsCldQ8gT b6ѶBpI$9]x_?'.8!K|a9h @h Q (,ZF(bp5BPC\gyxd! HbY1@>J/})КaW;[ñ#Al;]`P(A~P!ad2D!\Cځ x( ( y=)MR0$ J' °^*0fC`#}hL9vb#1!2$BXłpFk)/!蛍?Ln1gۀY5F#wDJ=@=9ܮ~#_wų93*H2]XށQ"!8p ʳx?r3%/\ ꯁ!%2m\<X mIRɲQ)Kh2VH8S>P%!`,2C6\$298@VF) `;H&=3#B0J A,x!;*[@"0K(X+6`6 aM X Mu>pЁ,@X  IC4YX'0Tq/0IS Ȁ 4\8ItkImX 8h PÞOTCʴ uPmЂM҆n#  JkJZx;)ta 9P@X333p%0_23i8)XK 'pLC-f3Y*@N\XXP&t@6>P MZC8@P  ,lС~(o0.qX2H\P7C #Q!P8Í1Ѓ4$OP؀^$|1܆ ؆`IY(VQтڔl`JU~RX( )K\:?ўAH\K]!ȁY˽K@@610`Ժ= YLDH;@;%,gPCXx (!dN4DiSAT@@@g QgqC5P3$Ò^0S5IZU6nHۭhxxxJִb۲݊mnPn0Ȇ;+OoP{ت  hUC l9kTq]VȬ-R4YW1QhhX'_K2iĆCxpbdeE)/%8P) /0؂xȁ"(E` :O+(/+_-YY>S&H0@\ CeHTʓREXOQX8\U;.(Y) *<D9 #bō!DΨh+@OPn mmm 8ñXmU߈"$mHh>{pМ5zm)@-3)2o?UpCſq] oW8Tsh:[靟o x'$@0XZ#(0?N@*/$E_SMe6P4fS|'I8-@q'$(O+8O4\i Q*  -O ` mxh7r%ĽQ~@Et:9 -``Uo _ЀЀm\kb,^.zocML1d=+`28ԅ[ ؍qp18'u]<^?%@^E]|d%`z5 'p ^ jkI!0Q!T X Z_bx:D6ٱ[ã䐁&J0hƆ"CpTf[ZA8%|^I >x00ngn6[`UED> (#bJ XXnh (w=j؀!؀78b%,UAVP(f]r5Ӎ9;^՚zlp+Xan~֔s֛<ŭi`58n؀ j6V+., n Ć_ŀDR Jy48VpQsQ`v]">v x}9U%8(v9 ue+.9 ,P?0(x%"k:υe;–_M48_eR!9Jh<g~ 1;ho^OA<) D|n' u m4V+ګW"PK? IP (87 SJFL OIb7Ex8&?~](i1V}E](v,TvU_}i:p*>N:u-,qk?Ͻk;(l迆[ǁS,['N`)Ɠ'@h`(2ঀ!p l3``<X<9 y!ϐG!F)S#B b:$!!f5)(0 h 5A(t@85x 3mSP5|B$M&CCUAKXbD61T0D-d=T`B ipPC4J  QK=C8*`CRB+?`\ AܴO 1X87&7TpAT@X3D `r전7x8QJ xj+Qíb([OlMc=Vf?x8_L +&P1 Ȑ0e.o>& Ùo 1O @1 1|X-"rT8D#@KP'‰ĭjو lk\7,f`ܐ4G+7XjTPZ#Md0T@L@&I-X]eGPRj@8lˆhK9\VT *@2&l8S-l*\  6*J,Bp@ Z `kY"C 3[N %b0ծ `-y0H"$L r+\EpߤK]Vp& '9VM/PԒ( 6d@e ?$ 4  i?a7nnX;@0? "!hJؐ!#a-jmk( B/x<B z"2A45lWUyT({r,p<%*]h,0- 0e%-" WpW]b|ՠDjb1yyyDvp CK@@r sO\=K/+"y)Dd~`)/5aF#&A`7Ԡ&AAS#mIw%r t-YHM-ЕeT0pK[ThJT4QQE\YV Xg7ZPe v:1V AJz *mTL}qvDoX/40Vlr-6B I6BQ$M".Y[#9h{\NHػbж` taBVVcLw_=b5 ~" H`B("o&AK N@~1h(,+(AKt +C_ Z_+'h3E) oBáB =A=^ 6>"[WeI@4 ;6h;?BLă LHP+QI͂pCpC@ Aă9D7lt JȐ]ܝN(TRR8A\ʣZB `l.Z)M^<&B&8\ l| &W\BtbG?Bq% BtT&@  ɛ5$3 @R@GЂ%-|X]C58H]AZDUH@!h9V;\ BUmD7T@-̉|U]Q I\XЙ 6\< YD.7u ЛJPM 0 d#Ue\Yl)y]X*,IE.1B]@ 1Z?HF"s=S8' Xlld @OyeBQ E,X\#B&( O a7n|B Bf8oC= \@=\IiC=hY   O- Ӡl}C+P"Q1e)J* )d̤d!^ -rX dl^DXAҦ6ى:)D7 $W! $~V6ށj +@~YBN6 @ B*0 ܀E؅q5h?Te\؂" 3@+!%X$ %P]UT8 D _R솒[®CET @ȀEf<8X7BPm,)©״X‰A mTP JtiA9j>(AuCxZFVH=Øy J]`@͋uL9MlXBV e]$E+^p"YA:ȅG$A+drAB/?DDnG/'0)$B"2z -LJDMUmMA|Ml)0G֪wJ77@- oЩmuۢsd'Npbt\A-(rn.i@Bw94ʈ@.IĐ TCimqM<e1i @T!N8@E74s@ ,5A1RK!X*!DSU<" 5:@̽ /F(o'!`PX Ѐ打r +A@r,w,`Ѐ$x;@#8fGg'/43JhAϞf5[3ErUX8P}CUרDP$g- HuF tĠ~Co6@C L rw*X} iC6CW8NXɄ!vIEB,j2yQX1iN Qܷ _Ut еvm7 uXHa &JC97FALxxX8^yIL@ ,p> r !:8 & ɡCeT蟲‘I8`E ("   ab(@y *3rXaOy&Y"ʃ D >ANlH! #p`X odf'*D "P*`mﰻTx!囦^>`?j,iűn_T-cʪn5a:`L+Z(kFkO!f F3^coxhAp`yXbE$Є '0VX4dY!rxbffZA4Gb[(@BD )X zyƐ"Pdn z2`ÂY$!ldE 6unD4'&(*haҺڱuښS8Nδ7Z.؀ymXUw+댬̲A;U-jvm{ 7ˆױbCk p6َ4t `xE`0QaF)D< F^TXEV!*#}pЂɡ([~n!MHBx 88iHƨV~X&?dX-$@I/VqV|BC0·H` h(5.|^   ?8X*s2xD{3 hB3P. P'FE+Nj3ɡ҂CU@!N rni rp `; , d"( Ja"XPL0A & 2hA+Ql$)Uv8|NW<yUx.YPڹ;R(iLm)hjTŚ䂦yE/(٬P- PWyEeNTM U-Uj `{0F $| ;e7ch:>"P Pl$,,ԧVF3jA& @C8A NWUG*W cP &F4$7 PD !`" cl&q#PBT6[@B8뒢:Bt& ЙMU[T/ˬW"f3 є&V pjqX0Y;7}|o6 PdN[p,'t #\> )e&1bCޓ@!}nɁ*!@-FR(!/TdCLs$TQ3UAHq`[", +`qHA4`PXA $X`h!1$ A4@4M#( l F#p@B* 2x6Ы8qw(mj]dYPns@aSecOz;+2J+ث_EdGٍY1͹qʿ7}=8tm=<OHzfx, n03qR,aZ T A9ЅT]B*5 t1aEkQQ`d8#6ar  *" " p@4DnJ  Ȭ,V K& p*.Q @ 0| A@.f(M,F-LecTNa-r 6k U  KѲC e}CUFfaD1 m0 /څ~ʢG, ( e` ,p!6h^dփc#nR:då` ae?`Dav .,$ĀjVc#$.k EG .ȬP%M00J VB"@I,@L %, ֌Y  t@"RTGV&^@! 1w'p)p` J%9",T@0 p3P j}ZʠC8! Ap8v4@E8"9: *M/Dπ@Lj! @JcJ\exj Zj}*$ @\@&o(hκ⢀H !@!P.# dQq 誤`#,2@ s@X m08v)E2 |RA ` x@JaJ#9 C2*^MȖȋb+{%R.l)"xk2`9pk[(]ER`o`4T`7@zE@t'-$6**`, ,4,~@/r2;fpqB@#/Xjn`j@B \x @ 6RbBA eO(jd nDhq2 @`44A* X"J0 T%b`OQK;K RP Qx'"OahJVa .?s`V[Z!܅H= w(2 lT҂'c+2nV6ZT >t%~r_JBU@VAF0lA4 4 Rj]Y/ K䏊#= ?nB`0[`&?K $d.LG# 82K VVHFFb<6j$b`PI@&.Ȭ7)5@ 6p0T.q)  OdU &7Ii D&wwQUX= +Ȃ4`@/0Y@~* (9-@O6v*^DU0Z!T d!WVzEc8,6O~AޡVC4!j0`׆@~ &TUw,M>Ǎ6 2CeZA ,]zug%Lg@ڔ>2dj"pjBׁAq,!dq9d M2 4am7IAnnq 4Ob "BBJ71zWAtq&`W<$72eѰEpcBZY@`Oɪ`nI\y'c#m'TE xC5\7+8Y5{aaC6x|i& Dהx-V@B-34 I!c=v>Pv/` L  @e2hD :  2-` RS6oƜ4 z ર%rNN# :1P) :NdqLTXPzr͸ 4ڤØ"ؑ *X(.#@٧^K0`'m?GKRwufy4 |'d-+6vH%t !/^1D\6B*4 s`߂DxK8 '3Dm-#Hy׃dISvaZvB@v(Ӛ3reTƲujxdSe0i>.y:@ @.F/G*&*.(!m .) `P)QQMGN4:\ RPn" 2MT͍ v`?m1pgpYCİqCҮ[1:-BGo̢ ` Z0􂖩9CH{2B~R+:DaZ Q~` ~x_jwjc2G[J^v1x20c-{ {82КUI;3bHVjY&Ȁh< #;`' 劮 ^"S ]Β kP,`4 5:17a`;#kڦhzT4,|YS.4Ӿy6@].j\Bm2rp&lT;*F ;=8Mިey mdn, JQ $XTj-!N\ m " a< `0{<vҠ?u sln3SMF}) za ^K⎾5U],BB vfk *``B>4>a%'K^^B[U`2wfE/ȒUcN4<=8&ҭ_ >ޚި42U#SGk@ !i3Iw!4_Q*Nr@L@ @硤.b~p Zza (Pxi E,4)*QB &@p\!F M<8yV"% P KFLFDpGܿD=4ilݾ'mِ2?.jSh6n.xw6lͦlxBoܶyjm6o l%߆ oy W:_AlV zJ.Ζv*zj׆lOTQ~˭†_?^HP\6"ƍAC>cVyG?=7Fܺą!+,X8\1\t B܂7x: ?V(a8xc?`q$bE@dPDx@@AD@x@`qX%G0  h@ HMĈ+J4ALL@N<`wbd/Tl :6dUPWu bD1U;@?'j 8|)7mZy@Wؓ?*Y Y?5 b|Jkcj6lMD-Tя5X3 $W s6 4/z݅ p0ox /:-'<ٍ@L԰  ,H`AqsZ\.\a: 1QA?`A Df@0 ;3NF,0L&iR2 R _ S8QK-Ѳfo©.t`wdxm`[mvsh5֪ouÚ?Tu+5h=؆F :3͍z gZţAXzQoX `*|UdQQ5賏i /U8_E֜K}$u/ Koxu+{CA~5(_ 'W "hjh! cB *$2a , iEz5`;zRԀ-X,B0B1- ^P$KWծ6@ -P22ImDI1\a@~o'4P h"YX >ieV07uROT E(A**\0V &OYӆ!`!70n1b+\2l!ӥFs Hh @=& CC) v& @z"(+<Fk`֐ J0IcRC(x:aHC$  f lc+A mV0$v! S(5 p42L,1KX"V7O`NOzlB<&Q1OP| nH($ml@7FWAh@\R (0 TJ #61pfex Zց}@P`L8Lf~?;3Y-GcЅ44nC 0/\-I[" ElMlip($tJD1`(6f:ÅLfB QHA~" lJhf5Jw9LQH 1Q-T(rCCTT(/ *(IFm 5@eSvéX+!j3dtP@}F6A 2 A@AB44Dv MP.b m(F/.t!aQ%!(Z:}U7c$UU)0)QUsUmRS_eR ܰHyus7|lZ(  ڠx%ց@G8nUY71S/uzz!pSF{{e?4qa2!`V2Z #I@^ D`D 0sD-`#oV=gR jI@ `_#5Z]#pÐ!pP&E^ gRg+`O3putC!rjLw ava &P+S+6Pwo -6/*G+%xxJkIG)cIxR3 0c 8 oQ">YpK2epg|'|#M`ZO [9$# #T ^`AD ~6&`HBP9pM%v!-`aQuRpBP Zlj@5YnQaPoDT!-Z1x (bmmh`ThG1hI!)`mXw8.M q/.=6dJI8?Rnn S@WH2!qb{p^TJ$=Ć@@Аr}RR@I1`P k\p 99P LbuHXO509ɉ@9p-`+p6|~7;2RuS*`8QTف00;ŨFaVɘ4!f `5x P `8EP{+mi"3|Mxd{#sZ)k@S4 %#R 4=}#^0  kH5ut(ɈuH@O _5'bbV8_bW5F-E0py2HZYHUf)6֡+00.|ɔY efT@GpZWf瘌M'2`T 'ii%64}g8AZ^ZR]y鰘x&6)H [  - 4Yy8^'"(yv0 Et_rWЌ*y/x7s,wEC^aD hC7P6vj "BO :LR&?71D'0 d0;! MT^@60^0sjyRpAĕT ykh B!tgG:pHp H_P KG۸0z<7PZ_R4US`y[9F ؋E aFЌ|Z`wJEx݀<' Zq;";۠*=K=f 6LkL9@ X qZ!5'p)D$#! 2t!5}X| rG@O 0!4ඊ@$(@ U؅]@!9^@x ,3tpt$ XFne]0Оb(P˘0{+cG F yP6I bb9aln!ZDax raQ ]ӋYSU."   A%MdƾD1@hжV0 ,4 )0'BT;@ 0.YQ$@i`d3T-#P0 @Ơ 8 "_ f-%+SPh1C0k+ьiVx!HɰÙ-!E0;0SZ`G1ƽZCU!V,q|.t얺rJKe ` o[7};I %P\_{!ژ C%APʒh dPVNdBN i@2@mZb @(wR7uYfpf`8 o@ Sf 8;꣥[)Asl:&ߍiH %\ #$`@2 U01$ @09s@w $p <'P~PEu@+GP͟H9Hl@-C@]`]TUvhGE >zz0c 08ʟ x=) (Ol@Fw,%(C1,ke%l=RAŸq>ҙ9xn=DGbRU!OF=~R?$/L3K(0aAuz鳧;-+@2b Ȃ V ZQqD+.G \"iV?@quwS?%Pd$>')ʄ@C爼ŜYfΝe UOzٴܹimݶ~m6ٯqMy7+(ܟ5jUPBuV+!Fx}*.$Cxel䋪(5h#@&:T0A#1*f/.* (t "j CW$ -0@#&@  H'.# q4X a?z!Y)r@1枠:Y=lB$$($_րl0@I'U3. V/@ ;h.ixz@ф̢OAGQTqX2Mi|0@A~uREkxGUF9+F05PMgJVJSY'qL)ffE< P f%i \2EU_\(( hH(r%@v X0 TJyG]!J p,8KFNf/ΰt1OU8-`\ZZ+56<†rtq:&nP'mH6p nP 9@Ijfy>LL[Ϻ3G7:wxTgB05n+TH8:T|IdF"hbFz@RhEa5ƖHa =@ (o/,s@ d@4&Mz 4:`_ רDlׂcV%aF*#`3; h?`UY?vW౬v !3xg5HqLI‰l΀5bLP-D 2C0pPHy!IŬ\qYA0lA`nUsn&&g!II- z`+d@]ī< [ .z8 h`/V?H T@=k ^Mmg#z8:>|+n$C9[uؠD m}6ZSkqZ`[3f&kn@"ɭy|OD 8P}!a5! z lj~ Y ȆϙcX+2LH_q$(Ћ yЃNp]@)5ZzrU}߈OҕdUuEa prX [̙[?j!x"qSOh'x80:Q<lᒞ]X/(ǓYHɁPb$&3H=#$,9  h<8ƓI&<9!*p8ȹZr|gcHpqȆ цKh!RpjX?q@ܧ @$nm |;{hD.Es ́6_Ȉ E- p V9=MH>(9@|qH"t?A>z, $K>*"rd>q*sh9wXX${)~]!?[1zR!Pܰ䌉uH؆_`'ig*2s9\Y< NdM7*Mxh ^PhA!F `4 0xPh\!,Yu "@A+CU8**!ssB)Ty˽4)LԠo gRzاPGh#ȧ'fk$('SmV,JMԪ͎А|; .A#,Hc1Rc$J\# <3fL,Ё"<8[BJKFFX9N3j``A88 ӸLMngJQ6 UᕻckakUILe#hjFmkCG,IQKDMt*H`RPt)ac=͚Q-xE`!, @̋ 8`ʞV /xJ'ؚq@Ȫ8S؟gTGuC PHX%@p ṡa؅BŁtq |tm`%[䨅QQ0R:UQmp 1Q܆뀺IY n(Z% ;$*]6hV) .pceOb@Kȳ =Z?b`״mH'pD4;3`!$@P4H 8C&jPT˹ς]|b)=]8p ā1qaZHqTU4ܡT pnؖn PoVTYZ\QtV jZ/xd$C9&qHcEdq9lP̨@dd2 ^t.͇k8헾|WpS(O vn&b].nIQJ0S9F,/bia .Ror) /g$) ̓zҹГx:vF~)0XYiw!`bdА ϛpV?`f| qq&Ap=bT ]`iq†`In>fZꮂoֈd@)yg R~)d ,<(P2h@p)-1 0R(eLbdGn*@cg vXk>m>]·-c@tfFN~niY~qe!Ժjj)տ $Nݜ۸m*HC[,y*nu^q uWMi@0 .c @(ՄoP8bps"H ehw)epN TniGt|G/q[y)VKqa{0*Rk '> Sp{ڜm xJLe ,^mȅyNh w;6rq7g`a\Tkr=.hOip<8x~3 `kLhR'fX( $@g>}}7-agqv'i{eGP1ğ? 2C U$Ӡl.b̨ql X!`l u_Œ)s&͚6or̦m[7njmSF"M?F.wam3Om*@]v)ٲe\"!1>8 ,L3ߧД41`Q"B!]ZGq-h"Jb'kD7[(O_Ypfٱkƭ[wìO7ȉĩ|9;9dZ\"C/A:WVA#7iPϟSNXceShc [;T;8ڀ.?&,:C `Pb |H?2I`Ӏ`\8x5 10A$NP0{QD%6Ml}[nb[>C)Ȓ~o) h56TAvA6lvAh 8e6+)Fy(pAlhj6:uM QEZ"E5߄ yՏ?|ÍF*V*R?x 2X dPd&0#(,Ƙ p4v6'j^|L@N:`e]ϖ\ mpv n)ȅڰ~nW@*WX^vA2 tHǓ#:z\MuSAjF5Qa9Oغ6T?TcM]lC*q 1 (dl( 1iFcsG` &a ]GY %XY웙a 6~ h^6| 1;5 Ŝ2M&|CXx#_ 1s3?6^O5FREV xT yO~@;5 Xp X M-A`2A(\\#`\PD4"4  jWf_(&scF&#@{4ܩ@ITP0 *píȤ!!v%XE2uT%1ܢHe*N)dzK\Χ! h9M)PY f4$ St[%ɔ 3Bø5#/0ц`&Lamt&f"-#,y afGt_R*.<Ùm E`ZbM*6 1lkU\54 )԰=3xx > %($c?0 4+2[ np`3 B(R$GB۬`d5VeL&.5`JPS`@bX@Ƅ}x u771}#lr &3yX'4RR2Δ#t¤R`30NL<*A`t"ZA# * 0l E ǩɆɌP:63Z *80R1hrη$( B d\q% hR,u1`*ݚS:ۋP uC7Pg HŇ@z` OD<>1e']f:bej1VZz7OYL0 bPF[arQ0?'p/+I:Ns"B7ML3J!T-\PTylIkXǕr Ӻ c* dclz4ƓgMJle%H@fMxcl0#`lwv$Q42ih@=8~gBD5)T&yB1ʹg[gʹzټ]N;Nb)=s?ݍ ' ذ~7 OI$0\F@ F1)mN]ӻ|D[#d$<͸?.Ҟ "eE"26Eɑ߉ 8plI[ќ܁@ ^7ċg<MMȍ(0(\fX&,ZiQ4qߗНo n ͌deDļTpm쬇l4`GC+(,,<%;^D۴CC$A(ݍc @Օ! L&@dyA<"LTjhu_IK1Ȣ U<uSrmt\$22c<3Bc4J4Rc5Z5bc6j6rc7z7c8c6;April2000/images2/gilette.jpg0000640000372000001540000001254507446366452015605 0ustar affweblibuuidJFIFddDucky<Adobed       O!1A"Qaq2Bb#Rr3Scd!1AQaq"2b#Br3$ ?g{W{[2 K$t0[ov*+i}w7 s[.^ zjQHʫ|z74t0#rъnY"@;؃ױ-!]!5MBP!5*=׎r\F*kI4S^N-DvCoGfv:t[*KP{DzY; k[G$ 5[xǛVa޽uy}V<Batq":o5+ѺonSa \nUBpfwZ WoqmRY#)ހar78/ X5mdmD7;j%Gf׹yq%ndZ=ݠ)J1'^_ݣi"}`>I!8ۈbEx!>W_Zfee^G_֔RS _2Ǝm2X^yC^$k*H84:ku(;T4)ea&܍h~Bp*bqØG/U?f>}pCK$w]7x.('֯@H+=oR|OvꞧLLײG$&ּj͊O'x],IJ24ҭC%Ӧ*6nj %Rt}? t\j=QLmܙ /'5,hkz,>;^TMrcړA.2}ŴbǑ%ѷ+JX%]RZ \Mgcvoc|XϕYmczTPm{TC;&.y.vWA)ZөՕZ3@L$`Zi+utTIZ,{^^wLn˩xu6V X$Q ijx]}MX5\ -[]X/lq?C`sk0N!Nd+# fmQǷx 't!uYbFr~J+];ZH0q䝺ԲƔ'sP~c^ ܎]MB\quRBdeSX ͫRZ3ki:x}z!VZ?#KC^Ft7\9m7!0.{nΠ#}O1{~#EI$VFt?&F¦쨰㐭Q'*nER2m1˸lWw j<]TѾeYjQvW㲾Ñ=]\ٙ-\\:#R˙P)V#"܍£YʝC0i_2[&; HrJ7Q]: Į6p^ەஒ{K覆o*4jߔ0CӮW z5%Jq4-);a[TV%D[t,r˄ge"]_ʤ\eg}Vc,uC(umu/OB;K j]vֽR*fdHXHS7ȼߵd A8 +r6Z (Moce¸RrWBiKiڮМ|mr@YissIgoYww`CM @WyUbU֚ρzմ8э9vJ5Iꁼrۑ}qt';5IŴ7YYvh~11(SLe.:9<'$[Ku$]0y7b_$ 6N߆8\:x2.Y=夒k{qa\@/io}E%H5|Wl48m/a=ԨP${f][4$e薿s^6 gOMaVKTu Zr[:E)EQ6W`9Y=HI0C 㦘~G/KUۚk!. #q[8# a%`dNGd|5_K"y21*1,=85U͏רO#VHj>V&-!PZD`MZKʓ&jzXgoq.·.9_,@7Q3{,KԇoviOuA1d|4?iOjzZ+q()\sOxM5XxmۿW0 &>Yo%-xz`wy')19˙eoX EMvcA> zev1WF</fy뵻:F+Jo q}9cP+M~*5'Xʟdg9M;,B6>?33F`z\\ Xe[6t?r5+Z̰Erz^4ua|H7vv*c Xtvru;HʊT4qdvZ]VXOp(Fu<"nѫήZ.;"nkn3J#dqJv Mvk\xA-'%kxčT>ë eg,˶d}$fJEzþ\VO㧅#s5qcZZ (s:-[۫.mqh_+Q@JiO?*2|ݤO2[R`*kWVjgɷ" Gp-&׶oR'B|)M9=ZR{BotE7$(O>w]6yh*Pa@Bj1\7[>iZlNt>::Ls~OmvGҭ:ҕlx6OfM^d>wo{SWfhҗmvn]5_ WYz =^&D_Cof~SZ"April2000/images2/good2.jpg0000640000372000001540000007174507446366460015170 0ustar affweblibuuidJFIFHHC 2!=,.$2I@LKG@FEPZsbPUmVEFdemw{N`}s~|C;!!;|SFS||||||||||||||||||||||||||||||||||||||||||||||||||"M !1AQa"q24rs#$35BRUbST%CcDE,!12AQ"3BR#Caq ?FK)JD atpY;wSz.7wroQM,VG/K,-./wr٥_fw)}_Kܥ)}.@Z;(\n/\/KrBQJ/]_h!quKODuKEk+yGTww)~E5_w./;ȰvPZCJr w)ESҞGw}ȰvS\O9Ozo>|!~a -ʟS~a#TOhq>Oi4*[i4 Gm *_)4* M܀vq~O8*O܀v\OS*>O8T r0~q%ah%>1AvF+*ODXZ;XOG)'_CB'_w|'_w<_w|)_wGXZ;i./œtGœ& (yBFEW~g R?-./œc)|+v7H ,q>{(}#܀|-_`P=Z{v\O W?ragi/vGv) 7vx$+;)⸿ V}<{g݇ǹ;%%^ܗv;gi gݮKᚱ]ܘ'efp#ᚿ_@+.7vZjvlb?5?*9ܛ% ?2 9U4SZ$hpKO*{ cVI}T0Rad[T)(8^X-t؈킖$YRb#l 8-<oh̤<(d#RB-OK ![w F|Qv#5 ,#l-R"VM3-P ;Ҳ)5V26rvA&0N)YHEl$!'dO0HHhL! Rh  EE ґ0 #F&Y+n`#;l:"ȵmdd0R@Fꖨ8k襭lvz~vZcrPkjũfد|o݈7r74IjDy&-XO*{ ˯lF8 }DX% FYl.9D/؜OzF]J;pP쑂r7]+YssE?XoNM#aQޮ+pm5ݺ?ji#>+i Yhak3{R/,Hm "6mn*uCӱ)Mh5ŧrM??Ջ\0sNLecj,ͫctd299WQ1{} 8yKn邏v18,fSwW} 03#^ *ӽY,i ߣqmFK cpsMw'ie|QK#batezKT'qcߞ˳#zC-G;&5ѻfF'=ơ"z::ůnfW3O yUtJO:#&9R8A,cc`cEUh{8g(SܧG@ T%B&_p֋H&XgU)iceWHj*;ûⷐ2h,eWuSr9.}S rbq/myVM+aa{chsetFR +4T n6^ob ~./1ܖMN38ـ]'i3`3pac%H$[='C̱C׽Kɸ#ց*4l7;\a[;*VJMOticqi-xtRx0s~VlѶHAJ29F$5+#+o(hl/'^)O!sn4߈MkZӆ?RO}QsmƁ-Y G4ێ M5fmQ$f0_c`ap)؀FV&2i6kUL\szбVFVg)4Qtp ,sV9,$>#B\ִ,=7 [ELҙy\vb6_z$m{ pV6րaܔin9D;qqܲTԽlB.捧_+nVU;jGYe.7s.6̪d(Ѝ푁7*{v*i_b=sxoUrK Eߺ2\vŧsERy&-#Iض 83N3b-F3OgI6pYː0ӟ߉VGp*lkU'P:o ɷ\jd{VJ\ V|.[jQvЃ*FD CvyM jUpA\nbJ+&rA@$a)e#h;WsHI#&Ⱥ6;6溋)Nq qfqNcA䮙8/s5($w@MJ$d7n߽'Խtݗ;ahbdx8.3^F # Vx"G;xx4=1j)E4xC/v+~((;'*pc^=%[BzuUM;[ݥ[B:{k{30ɨ*N;2R-ofQg'XSX5T^Ss~h 3=ضi+\Lvj zRU]j TA7zf5ԗ84I\C$kqJ\n=~ZoWUUGM[+6i  M 48M ,c֯ҩ`D^\veT^ 5\uYhW_Q`*fh{H3ob;_h|Qy.T۹$¶z|;T>7ozN 2Uq*rLx&;&'&VzZ`}aB䣡^G2/j#;TK}Uϒc`R\v"O%?J^>u_A"0(qBFɒqY]ѳe#$} wiY(ԓZτLM'20*pS\wjX pB3wͩ*ro=,ܢ2=[iLPzqO[^~.>2;Y[ "u*hZ#-tdqDS]~Qbw Y)?ɷZKmyJ%1у} 6qcSuCt+ wSSPpeڳ\__=C1}5+"iL[{<X{\q#zS]GTIbERy&-qڏwJqߙnd(ߘ{niR[7eU89Vokb*sjoD-D>f3ډjXmi(M7AJ|X{BwOhTT͌1yS"\ 17UTQfln\r2Iv/\Vw>Y3; z4_yKQaa*W8#G_2EȎI*LtXGiVH*ch-7@in|U%x!8 &ߛ{עp)˸4K,D{(ZiOퟴ %c\뗴i+@s] Ej[RZuN-nj`Bh8b:'rtvj\ZIdiZ/&[VZצZp6r ڨ?{s=jt?UCd^o IymObލNhT/^mU؂<  פ;jtှN x R7.ij!Ƴqc.b+c`B3+~UD1#{#Oo! d/g^Oho 怟g(,p [1\μ a8aHSSoԣ=4KD~{PGFR&-k%}Iض.AGF\%9XXi;q[>ikb$Y+?o^ ;A2M']?':HY$ uZZ~R UݡE&W_m*a*d#`Iix-zTQōlUc/I4| 37S#t`7miob]IdSP H́=Cv{{pR4R2VeryO:rZ`iv_҉>}^B5F(I^;l+ -R-mcX0@&l{~7IN;nͬwJhs־Dx[k?> k"{q ÁNf Fr/Y bX؂ 9)1v+ޛ0b{V[ 2\ٝqvc  oRik^#{ߜ߶5'ŜCHNJh`d6xҥ;;B}a r6xP? 5M1Z!HԤfjjyjHq -,fu,OqyU^[KM=ʌ5'*c5<٩U4|ۻBQGt>.~lcQi[%@ ͅl6:ʇ- mmW+:K^s(|⌤ҹ(o:5rζ%.{pR=O$U678ܖ(h&rsN -MfZ:u gyl,] JCKֶXSH2bb)ơU6X/mC:-@TܯЏ(]<ӹy#Bѽ.男 F9\/,T%8Z +I!F_1>?);W;*"m@A8-l4UT~M%Rh.&HK * V#8XFTDř6vOx=ʨgmUjҥ9w{v*lm,gECI${VlQVf9p-=}1~v6Ak2?wjJG4qmݥ\"S"cĚcޝ3*g4Yſ7/ڈ+$2s7oDꙎKGoV*&b O$ !ٿ7άV>$buN:P@R_k{²NYOߥ}kX{آ; =[ڽOX։po#ާj`պW3n{oVɶ mZmiN|+jzVd-p1Pձu+V**R3*()VDc\GfC }L)3Tװhmĥ\ڨ,2DCt5F4@W?lWtIj_FR&-%Љ81M?(/K K[Obq*_$4q*cvk \ ,{_aW'=ǍSx0H\hգ'2Ti|.{3Tsڔ9(`}s]~:{TpR{ߊބ[LG%MC l-3;ԥ!a;h 4W7Bc k@ej6Ŏ 7cUz)YY+^_d.&7&I*d3F/˝JR\cאA)4.-)u]Qۖwjw*H6$dxO2iIp8ڳ|j(8ZxDZO5T#7o f~uU9gNWA wjN?jrOhQg0ÿ,λd:m_GM/뻵9peFvT|b'6COb'10Zb#Z̡q(Tct'>p$*{{O".Ή᪜>C$᧖`LmrVIE3PM>R9آrU>F+|>P'/آs'oG{&;xiKUO ^:6N圤ݒl0UjvW^r? РM'ʦqErÈMSH)g '֤4 %WKn$z ELq4^;9h[tLH4 Hj$.;LnovqTCd;[.+^ݒ{\Ĭ@ q}N8qq:YUxc9˪ l%`[: &*-4MTJLۗByoC%;f9@k8V=cCۓ}b3(͠yYmD%O'tlxR"tr^ωm~WޣP>!]ѱ,۽7GN ћw*O{jc(Sx38}+QW)vjӦE8RrrI:Me̳7'FiX2URɌ -mMWOs dGQ-92J-W,TR'{d"&Fě ?V@wumOGRWXIIe q|赱_+Mbwe6AF(Gw g,fܤh8jX|YZbpIuqw?GJKqT4V1 M$FH9K##=hԮ5t[91/#rRCU;f6۔`2%?7qB>nIM ailT>O2on 4~PRƈl@ɡsfy!.?)I#$;JR|t;alzBcDW]&d(C8M =e]Craܩ'x\i. py *N/uvHGQ(rUOVU xc{q%WS3n#~ qn-RBHବlD /(Jm4Sخ@k 9QȒMڪm(? wnvGoEjfu{?oiSvF7Zf9֤&b\T[;*`>bo޶$oR62 n>V%ÇUU$quV֩6r$FS#͹-0E}|=5<$mE%dvC 4%[m:ՒQ~=/jrYQI-6z.J27lX(fRy&-/Apdy?j?k>ji9jBz21ZOU]9, V6T/?Ʋ`aS|P@)v`_Y#/48sb6ԫB GknLUtOn;-Oh`B X]h|h{Tl9m~nq̳-;"uMa"ʚxHtҳ+tJHiEQ,D|h6S<ӢRչTQRH#y 0z UN~oRjGi!ކjΨ6$b1Xl>0usl^A+{ 2U!KΑιu0WVE[ZdM4s]=aWI?qx꛱WH#}UI:D.K9X,"'#vT{\F8llB հ2'% e%r]~M [ܹ _&<|4!J3롫GQwkP%G'Js!r׃)Kq=%}Iضh_є{ۚOb{P?+YNu 73u\5US|:hf>U>򨛬X=24h[[`NэgrשmaW$Biq7Yd{MW0haa}Bvzj*<4HBw^|δbt l|y)sQRەR~Okko8D\]aBfƄ,[! d!#ҳ\b)傾{jJs+̎$4`,mu:x}72mcvwKVe-coP* @md1>í5U52Yv9Cn6>edjI'f=@%5dk֬Q6;jK *fX}x'*IzA7[ ir|/7#pՍR9=[~v8oJB)>Ǧ&:ۊR rCwӗ8ғF>rؠZ2pV'Fet_2U!'u?NU4owj#Yp]# lւI\Z܎hk;Dv+I{88C uwZ:Cm˽\<Uˈ v;%}'pO:sn CkQQh?+'j^ x5p]o5C(<;(8ɧR 'Dۈ >0#,`hQ10\liIXvM[>J27lz'hM<?k/+Vy}wr5M עš<~V;B+XMJYKjQcXx3ڂ~W(2ƟhUPY.UT"ղ~(r9`:U!4wWN~SbLsk=kѿ˨Ev\]C̝I%7F?YWRe(eO[/Ʒ9/.ܝ!sJLCvq:0*ggUWi{;֐Bɼ蔲Ѵֽة v8W8v#.yxrjm/5@SBa-dbT2&B N.w-TU[ҩ>H9ܖ1 4T@=șcg`V9H]Bx29ٞHi{Wo zWڎ#vpZB"0{kn+ֆ蜨kzb{VN rc|m!7[R7mIMD^6hzZX\X`T"Fz 6'셦Yڕg<"CbkDI%dZzN` ӧ``Bݹ] ƹ,a7`kpdۜ.\ɶ @aZ#Rhqt֑Z'dzVڣMQZ'Z3C=OIh&, -Uwã6,Oa06wH3 -_NnVl)-D`2*$lܞ4 4,mE6?̧ qĿ#V ih(8uR6FeT71?ڪnڭ'ڲ!ia M6˄EIFMdEX 1⓭9[]wAiTfu`ͬN[#ls#Ig8;GPllCz+GmFilך^G2̮^FIJxZ8x&_^lxfe`1hqURɻ-r38J_uv;JIT' |`)xl|cwhJŚQ~w6йiUTcۀ т^!u $@cNp{\?ay93nGEbAGC *d|S1(#]俣)|{MZ^2<_b?kn e+lW#L~Ltx]eM/3^[2xcrv ~}JJ }~cOдwYU{/V誏yٻ1GرAOR+FuU\2I2KR饦(2+t8Z.^w_Nْe^n'8 ⳽B 4Į)hhž>u{T)۠x!_& d /·L8*YYcT>^lfq\+|m*v溭FA6i#O_lSl[`?֏ڥR~];.~5D$P}jኢօ. %@|෡H_BoUlW?NEFC&@bf8U'Ae_,1K<P4Ji+O"űcIص阞{SqG}jb7v]K5!&[4.*.Gb+i\ƀ ԅ;s|-[)Ɇ}Vns_'jֽw-Yhv*-w 6]ZUjBR@,ZzUSû]Rd9IK4ƂN٠ $hI#@ ikd\2R>eP,zҽ#Cڣ #%׎(钠kpgG\U rk_@U2A#1:M,ps2= .lX'fv\r%QY8}ڟ2~ {%ty2-Z!*͘*]h$#FVI( tϰ7ܨa3?gܳ ܑn VR&[|qr%W*nF/05z p\NM"QOHǢzޣsdy T/L-ᚈOB%~9Fǥ\R$(NTp(>\4N(Gގ@DXJI; 6bURq4$4/>)d- b/a,:D$C-PRQQ5V4 ,tLN` YZ֗]sN-uvU+v,t117b M[rIZ3nǿz{4;qKO!iԌ%co-2 Pc,iͭ sBr4U_O 4*{Efmk9pѴG|\14m_Uz[]筤E~kqExbb"@qr0*3 $y:S5+OcKl`mgC')B6 ;J8#&4:+$Mcsvv5E#%(?CY9fykhhO02PvCaq* \;M ~fj־IԎ{Lh6=eVTiTUì0 =%ʤ7ܓgTJEnՐu/b$m8웎*uFDi'lABN\Pl_ҫ}4 E3Pi {s܇ z):TzJ27kd䯢|{z38?_B u,/=Hĝ\o9usxp4/eF7e=aЇTXʭf-ܤIT?`E!qʉna]b6*/ciY,=4VwPvQLȢڍRm{[Ze\:jUS͸5H !9"<[R>WQݡL X69*fs;PI 6g l/$ii"zCOܖiVE[9SLYReIkl?j12$7pqd,qPSfIVث{I*pܹK1Ys\l-u;"&ΐpԩXFg[Q24 gH(Ns4?2nlV|:`SsشF(2I5fNQ@.={5 mfrI-遴E3SJ,99!pr%#_uKZiqn!{`ʶqTSa%L/2bJJM% 4{BuwbSIZV*5NҞ_@%YfKuz}UU0ZݽERTn48bi?oz]ni}e)VTRFi~rKDOy)K9&id}d8A"iys6/֧bM-drR>?jɥ# e8,۴ Z&/Bk$#c 퐦cڭZ;;:-|v{T\h {TV;(QosOДv{I!nH5JԦ޻cx?խJE|g'WdؔNJu~bjE38{+$ZBdǎo '[nj!, E@g%[*S4.1_)OĨrWtE]NJ.ȷk^ji)=5~ 7qRWæ}TH775]x>*9;ЬnV]Wbk|JkQ!܁fI SUX,Up"ojNa ʍ1{y\k0N˧#70쪪ձsZ6gGtog9,9Oڢj!$k1AKmw,u_-`EoɧEB)s ;gTj`u4Hll[ǵ gJAC؆ش"pa@K/hz&T_E~4FJFxDA=]H*{rB8솸k"'#Gbǧu*cpJbjHֵ[E6 a~É 6H=,SCِ\WR41i5<7BQۚ^ָceIE7K$pBn\rdNx&pN"]V X6M+ejuy:ܞ#!R[.%ҵ@ P$!#o LY|̉/e}q&Ym ʙImpQG<Bo&I7:SnQTr<,M.=eZdϩOc&%ZOb1Ӱ?.ɷڣMlOkZ; e[͹,ljR~OIb/ xj9דnbOB {6,6Fi'd)M8ܓWua1.0׊V&ObIW$cP}J95tNfkvHܣ3+6ΰTJ Ttasl .vc y!]qЦm6dZ4w!╒6푶 @YO^ĭ,v-&2A{ b`tng\zB3^:+dݦ Շ5S颐Ѵf緩/yPiݤy(royw܊^Z5 Rj1I -:b0O_E,J鹽Jג֗R]x]\R$"gLmkES2/2\=މU!͹ik_ۑVWq[+g:t{MUknjhAtj1U=wFkl_N{ 5L2l55 Zkw?k`VY?,Kivk$ s@s4geVI]L#pq 9`Yy,_:Hu!ͭkYt xYЊvFnQpjU~bT}{ po7k\K+"~b؅]}Q],P.P*û6 Tik)]u9/fI3Ev-8/*VFZkjD&GG?Ec䯢<{dq9y<\mԣ`E*\}(:Cl|xvGs \:J+d,aXR89i#"EA-Nd},dFf顶 r.Ͳ>eb,+~} McX,ր8)!;b#a"A0[.hsH FI6(ޱ)[6AMV0+)k{Ȱ#k xk@FrE \,/8Jyt^ \)e0 1Ժc5%&D1KqhB"ʷKѰsq-TsQ(NٌsSXLщ%6 `b8CXѸ(P$NN.Зԛ}m4ɋwȺcŞRS?)oz:Л| V4o@ EvH"GZ,b#-@XhvAA@\gᨲ)0v!W[&@o~W,,p:jI QD VجNl{D:Cޜ}auvCؑKЍs\H ܡ]Y,tsRKc#zq L3-VⵓQ#kFAJؠ#ɶ"q `*Q֝LdȲVEQL? mRFe=O 䕮[N6FȲeX  ,Ԫ$ɻ\U5 7wb? uy+O$ůEMZ_HS˞C?@frS~c8 & #HPBȵѝh9 5FH0%Ӿ%X0Apc`1]]qe7KCp7:2oEmkq"һK^puƅϕn-nDjr||ԞhA7ٽ4p!얼Hd'd!4d|.f O$~adހj9rKڙ({NqBjih#qK06'9u0 Ulm?yƒ}DShPdtoݩ];T*FHqZ t]%;07[e9m鿴 avX#Tu p78 Ж䝍R;#؁ ̣΀HT9GkuB4*ɻ^p*nU_FR&-z,m/obԾ<&b˾C?V:mVM.XYI$ AބiJe%HuBE:vIR}q(t(6!ЁjPnP I=#4̅;eȫ}46X 2[|G՟19A9͌첦'0$V^35̗4?q+C۴k\2pR klp#k[g#Jl_o]MnSATBp|oLs]F\t}VVl̤Bk]ql^ hpJ|'Әru-#i휎9CȒ)FLvmFNREb`db)h]^,wўz'(q͆>p4I6U r(x%(1@zpIiLLv;QiU{*mݶ.86?2ёd8n/1ӑv8íB VGki]+ᬝj'tK]i$:ɠ [*e3lޜ0c\TV=ę$` :9`e-sDmnwb:!׳@grSTTikYN|[1~s"kI6eH:Z@.}G>f֎Mfwzf_SX HLg_E,w7J.XQ\8qArfQ]h^A$o@;{uA-΀jI(Ged#bTxM݊0檭9Gv+rr_ѴIZF&-k1 ثg.xMZ:mH@j4d \du B7"2\Q.) kt!N@I3V,Uك;dԈ1upi;hqop D\@Th P1KE}G9-Q~a.ų ^Yő< j>rŮ7w@׼O9\iˇ]19Hsm(]QG {nJ3N=җf-vS,nfBH{zefd%'qnv6\jWv㹆"W$eZl-x(Z{k8)>B;@/O&dU$bEjeb γU ;UrqZc X` L$Ti'=D)KY-GF&|z$!eZ.]&5-TVCcZX $f,G1QKCebV)Ag\bw6&٤#u/9OV^OM]C)`t8 !(-]=V* H6nvW>Ζghp8Q {n.Z~ڎhd uhi}Y9 |gYKՌVm?֑:,jljQlEWrꐋ#:src$Ҿkid`=6BP4܁!p4fi$В}ބoA@ }Ӻ:؀R=H9 qk|&qS[sG?Ŧ>'ϣi|{>MZѮc˘PPU~Cl|OT(54Bg$ A~Ԑh(EhE@Êe,А]Q֗Z.EJC8#ցPS6bM!0ԐՑlI4VBS0}G59\ѶXb -qODԄ՜q)kvy"$0 i%M~d }2vbSH EXnF!.(a~*C"w1'ےQ+v:0,7Ը)ֵh`ͼw?~Ԙc߅`~z}(Cʜ#enWOz|]A.fuJ4γd ]du7yv=2dK06-{K3aV_eD _x\3 ,RLra#; Ӽ{ F؅Ph A@)#̍0A@TYժ4Tdx.F#̏:bF! (iGb @EiM݊󒢷nWrgѴIZɟF&-%}8ܹ4>3aY˃4>3ay=o5!QO5A#H;G_R{Q8r:amIivܮIR0툈kXz3WWi41.M]~ HY[U P4l}KP.U*G m1cqodi#ЀI_3MT8weC^L0drk䒢~vFl47e&\jڹc=6ow7[ͺ:nzly5~,A0b4)l0$clU94 pV29屎Fqk{m_̷߁ruSG?>岟)pqGfvFVff`EFK422l ,K@[m7Xqh*\1q4YX;fȿ[B(4FÂg=LHB4B&F(ߚG$sLR;#̀#4%23AςhBTVM݊EfS7v+ށv93o$~M I_F97.M^j],C\|Fik}SpHva qGjc$%w@M! iB^ZY;$ tH@hEPF+zPi !BUOV ǿC3+f Է5snqg.Gʩ<*߼oxLccI])C7].N-\9 H,C3~k,UT8SM;,#NA,4%9ֽ͋WӰԱ. ʶo.Skf=NO7y7j(m5d".pA[+N*ҸB 9p{\HidEMs\I[.qa.xm$Qx029 ;' _q<28m7402r[LAՁ&煲Z7@YouS9kbmϞMMɤtyKN)P@Ƴbo^@6M-F{Fd,܋D6LpGƝĪ y'tGg)0e\IJݐ;Ɯ>iݶF@w[e5}4Qꄽh\E4r@ ҕNu !];P@s(R܀Z e- H0oB8fsA:I>9,PدQ^/CQدzwIAY?){psn]UT>3]Ay=oy> #Α(J4,pB Z\5@IF tIԳ:0 ""hЄ s!%ME4`@%P`~iſ̎*9A܇u҃h$깝w).0Ҋ{> c浽gROy>XHTlѵ׷l2YatxpsA%2Dzqi[> <'d+"J*z'EDILcaH˸;kJocm0-۶L)"dLxY#W !ca=j]qdw&fmLaE KZGuQ&99Fbv޶:6'mWEد+9 ت[˾@?ay=oy1nFKi#T pGI=4ibR@ҍ4B;PFI&)dΩk=K B5H`IH&t&:Ѣ7F;:GbYE0 YH#T `{׊Gђ X A{]M 斛@'ԍp@5`G(@/7X `i @})_ri@{@é$$:sށ Q]5|nW Qشމ|ɷh+=Aد+qتܵr%MK餥kb.$=ֽiyWx^Uy'q4H~_ʣ/hT;q,}^U2 hU_r~q#V ~} Z,GWܫ,?',?#eb O!* ~|L#Ԫ4$?#O"/kEuTԑ~w1ʟߢ>&_C֋FT/#{G5ε+W8;G5ʟߢ>&_A yS?rqw菇jE *~S(7G5*yT ?Qw菉kE%W7ʟ3G.o?4#e9S3 ?4#eѡYyO~h 3o愾&_AIBϳ7B6yO/֋.6yL/|LރZ/z'ugnR~hG5#A)^R˸??w}_(਷)}#JGj>&oA#OG^Nw5/jEt*/?w;G5#Gލ=BG:Q|LރR/ت?>7ޏ 3z^wE /'7ޏdzev3֍XU_o_o7ԍܳW7ލfvsԍⳗɳ;}ۮog7 H.qQ]o&v_]lz>.o-H=Vm&f{W}?3ޏi+6p3=+fjFs%wݓ3}svO#ԍ7,~vsvO4 %m2sfѷ[eG7ޏjEnrʏK}+oeG|\bJrڏK}+>ޏе"E[nG9YmGUOvO,m^rjeRM9*=Py6+ʪ:Xg5W Bɡ !@!@$EBVEYBdY4 dY4 dY4 dY4 RB6T#dl!+%e$ dY4 dY4 dY4 dY4 dY4 dY4 dY4 dY4 dY4dY dY4 dY4 dY4 dY4 dY4 ; &dЀdЀdЀ,,!$iApril2000/images2/gilette2.jpg0000640000372000001540000007263207446366454015674 0ustar affweblibuuidJFIFppCC," }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?j_<5u |a"v7˥]v~ uM CR8K<8o/?O~! < };?hqu-{&3@ kxc* ~{pxO+|mKBT__h _Wo st3Ԭ~ms 8xZqgi,C}+O c*|]ݶݯ¥l2[kvﭒi'{֤q sd-#M|bW; txs>$Ѕ׍oLp^7zE9Gkxc෍I⯃cGߌӼKZ^cgL6w;CQš_/هҼ7ƍ7ך<;?ᥘuV"Լw? {#SluB_ᯀS ~? ɨ|-~ o4WTgl5zg{އ=WE㿀IOWMz8>:*Uч?x'ƥijJ%zEY~/ILqm Þ|v:G>+L5i 3'P"T1Ek]٤kcq<-k}I앯}3 ~ xK GS|"Bw>3Ay_xS^|}iXn] ;C7i ʚS]|~3Y#p'7Oe'oT}kQE xQE럨9#i%և[ϛe5*ѯ7X, i,7[6ߚͼ<+F8g+z_ P ctn:Y*AÍ@흇{+H:>_2_i'Ȳ[_s|#l/Ǟ)o|+\y 6OQ_<^ꫧY s_7-6jxß-G?]Za1϶i]j?ז_0~W/P~G~ P9ϊf"g6:ڃ?_}f?׌NX\Ҽsw|I;'&ǟ |??WWh~|K<[|N5x g4|ޤ?WߝiVc+QWKcaNaCijJ.#R׆}pI<@He ?3k7ޥTK{7>;@d)dpF=J[ܗ/ootM^{7_fg=F 3dn #sU-Xo? ae\iC=|~5WGfSUχ5,hugdW;V<\^lݧzWg_ _㛭C>[>b; V~'b8w2,nM,d{w "x{OsQԴN5Żgb~u ?J2 ~nUѼ-gQOb!;co9ъ@'A."ęd1I4qpqC-atvvI=9O=zf6I`A9 u)WRF:}+'>׵ x8WsUx>{جE, Jl./F=]v8?->x+T6jsmk9 s'4~ '5X/=Fqq{}>{W_Ǐ=R[Ra&.A|U Tsowg:geIA?< ? eZFaխRE|zĞo$n=A^K~(GCLWZo!з}Sa⾖]CuMbGʚ|f_'1R+|-;X20 3ןOh~ |w⇔MwCGO&v+ߤPvx?{W?64/:b_.~D25㨋~~UC>UիʰU6$0SQf&K {?<h=P̶^}.ioN :^ r8~*xJ?>ߦoVcO~ZEo<'k??4S +طF||!Kt{eju~ge/ǿUt~(pV~c'iF+?0ҴxQK5kSZuj:?}:W P{~>#R?ÿ&'ῇ^|m73NJWU ޷#N׾3zJOgk So$\j#C]]LS"4܂A 1_5ѶWxbZ5f ! Vl8;bw=q~Y$38>|Cʾm|-_z_{[2 Ο{oZĻּKmu]J?O^OV>8EWP=wsy^O/`0wή0ʰ~#VfQawi7]Oms ?A%y=p9W#/[? $cӠW&m_P'?vcx f6?h&&\Wk}=T>G8|~1V~}˲Nl+V}o|o-|=koxG/x>3/qjO|u}3J`<]$|&ď>u8wמ)n_xR}:xg$xX*^>l ?YAɪѲc,'K 5? >hSݛSO?Ozxo" Ṽor:4+٣GG|dEFVW֞!oΡS' W|/o|t? O{;m\XiӴD:5Oա^x,6?q! fcRȗ֞bBm7.^o?G.[’x]xWڿo P~lM}7coZ4]IӴ(v66|1BD7R~@9dtwR_͟ļCʶ/0dxC'o\~g߇|7~;Ún/;xsĚԎ_]v,I=?mOşeO7K[>.nfhh:|e@B =^,νNW5q k_1~E+[x;/٧U߁|Fo?WGOuw:N<5yaYi}~??'ƿ~ 6^ 7i\|]_׼_ߦ;G@X "%"3FlwǠ=:VkZ^k_O=JYf |n%ULg*1]Xd0>~>=$= 8g\ZމQx׌+O2Q'+W*:x`n??ƿ~hZ_5K4K W'G=l4[?55> Rm{_e\s¾vMm{[[Lݷ 7/\yd˨/ӚïCA{m`M?!k_<1cJI-t#GѴ;)U<; }kO|_bmo.-p+6;,s[\2ݽ۶ڿ?f~:.S4j|:As_~߶#S}Wύ>Xf 3ZXYjQϰ_}Py_ߥ>Dj 'MoLMP HLo4mW8o+;ƝچwksoXyѴEFx/k)xVxGO͌);ɡ'U燬I|:Z]^nt=JLԴb,2r-a1p+篑Y烹_pT 'eϧF/]RhZY:4 n<1CJ^ŷ".XaӀ~~XϞ9>9o&?5[;ιoqؿP,_~v|>bN#}Eh6ڕ3ֿ'Gϋ#^|tEσ~ W?_iBj^0wxsQӇ+Nl޿̱M(r᜞2=tÚWɫhӬ5-OQgسgO~z%pÞ#?dtN=eF*Qfxfb2b=mF~X|-kzk gJ{j??ᨀ?)k +.+ B=:dznOr7?[Jh,?٣QիOd|b;Kh~37ş ϲ'Z wbuk[O%k\t쯦%oc| ׆ SÖg4Dj0lh[Y9d1錞1pN82I3X s9Wf=F"lV'R7wživOuQ]Q@W#fyp V*Nŀ~'x+?_]m;: kcPpLQ@gy pqggzZʵ UuAhU*PR;?8n _kZ7ty$7\;w= xRwϧ=د>oCg>%x<7OƁjWOiu}_*Vxz,93OѼ7#_?Gi5ѿv_p.x|l~>5>CǮc +Mz{wxOuO>1a>X.?}h4_0~Wyef+v?x4Zr\m~ztKI,q?u_>l >%GQ0Gk0zĻgd~< ?:F3Fyj)Ҽ ×x @~sn_=5SV~Vj~9>ާ?((=O_ju ;:Ñ_Uq䦙b;k=ǿߌd1EsCg{ G$xNuh~Ugxex2ٶyeU3S&^&[ y? CHy_7$ 7ڋgJe;<9WDx7ֱ_.p z:n`9vI¤r۬cnq3_?8ia +,ǛxѤ\\+OOEwQ?~TT33>Fko$|2 S~%ԯc 35g]^5=_)S~(~5폈?Gy WM6Ϗÿ 촭;Nӿ_fj/4xOǏp[ǝᯅz;H?'i_e*j7٫/ɲ_3i}!Kױ8c'/5 o5x,n.lFP?MKKg{Vg\yZ}ŜPț].%Ҿg9R ?~7G5 {+zgy.f Tw?O%߶Xtw +Xm}\xKƥ'~xFmQ72 8ۤ$xRZ#s Ӄ8Z!2x_ xxnYhq[[mX{wczM;^ÿg6g%e,_nE=ǿ?|Z-hrK_/Gl,X36t ^ɪo_n^: tEWaEPp1ߎ9?*M/gø?Vǎy?)7.Ꮗ&I3XOn¸(_n̴k[E};˾W5͛&M.eqb䢴w|{o}zzOS[SOHiI+xsOs_:h[K% o [u>>G?hj~ 4- LM~`Կ"&S7LƔ8+xT%C+v.e>7N.8L5牍nnTuM k?GwWCǟ5G'?7 vWO:W2X!\z%KBO7|;ǏMx^Y^%l>g1(Okf7 ׅeon.i~5%չVtGq N_;'Fi%gۻ?$ U'>UW_?I@$2;-EE$uPy$HӑٟOM ((_0xS+~'|Gy}㷋1efiܚ~c!' .ޝ\ɯſ>M?'3|io÷n?-诣p'ic~ >.bBM֭; ?Nq+GO~,g!%:/??gx|@akOsgNiba=;H:vc`rKi>~~7mێ_@l:Ny+ ZvY6ޚ~<+ oq'bԓ+Owm/k\Vo'߰hA B86?-?~NSNJ'ڃ;d_Hw~&š@ơjNt3-'&O Oz_|Tux^ZW=%ψ~"E%w<9cZJg|24L e_eVֲS}{T[J> '} ^> kڭq-;%`fF+ٞ cG|7sy c"z%Ï_;gqJN9~*~zDMz/~ڟg2C:|YMFL?]Aj{{/gyd_.8d%<>E[ oҼydç ωjc㦖GMnIn!~o;4sq϶P*kbϑϷC?-D͋ǏѻR\Nk_^G\I@{+oč>9t~~0?ijZ4-ב+q>n$m+DЧiCCxה*`+/_և=v\XHn,5]2UcYj6bцH8Any= 1:q־3~b`5~>"f?T/xJm#> ?#LuGOSm4q _Q\g&SO5\=0 ŻBU:cF7 y!k[4gmyOj|po5 eg|/杯iy3L,q)U 'wGNӯ{ä{;+ &zWkƙ?W?\:ڞHńM'/4_bs}llzi<?.ʱm^XJ ?aC>Eyg_3 Wհ؟aib~mG= @<{A{VYڟx&nltϮiO_'/ 0|'ſ>ϋ#jeŸKR;-e >PӼƜ41CG¿ط_ ß|[,ߩiv!gK]a? %zXhC~q:=g4{gBoI,4T~j?E (~j_oQ?Z?~;; /'77|o/cVH8;"d^/~귺Z^!x?Eųiv|27y7Q7TҀlx ơɯKg[z&oNcoi+յڇH|'Wh_xx 9˼W*K?a1X\*X_\V)wf>^k_c13 8eh}.~fv-5 |E/1w^[ ;O5+6.1dځg~:u͋Gyj65;; -&ơx3R|YeC߰gOB#\=dzVx_~4+o G|eXkO ڤgW}o 8_`nb Ҷ+ վ!>~ l[620~iLJ}yc~t^x;L__:W.sƞe>i,gï{?#ҭ|AE}<ǵu 濎akѢ;?և'u _w~CBlH?}~|;Lj5MzH%ӾX٪HYK,}7{W%q`ty"SۇZkh#̖j]XAO?~/R͗}fA55S> Sm?v!q85( RD ;zu] /[q:➞[V/8x!G~ Ǟ?e-ߋ?4>-?;W6nTύ?Q_)o,~?A3P>#~?X>,5/|U ;+j^]OۃC?f/Ⱦ$|L>~&xTm?U7Ǿ8iEԵ;G4,>>~O]a֧R? xo 7Hfy_p?[a<;vKe_VM!ɟbiV/<#o?W/|io x&ǿ?|k-;þ¢Mާ{Ѩ>Ͼ3 =jt ~#WIˆj ?_'d i47uah_ۿV"|y C>^t?~#~-+)OG?lP.?G'|N>Aa~З$൏^x{M g_uk_ڦg^}Z?&8'm[ 5ao&mk^8;`Ӿ3?Þ!g>T"t?vC+24/M8uxzs_k /~#<U -0ixGL6'Ў?/LGyK|?oZ?cZLjx?c5JA`o zw5=cQ?|DF~=>?_? #=gqx⧃|[kAkGAӬ>!>&?д;NӾ Ƽ! r3h+UbpjsĜ~}Q0 gllƷ|7ss+_É+VݰZy,|;TooqqoS^4OHe7%6[xx)_WoL7' xLlHjD+Lʟn#u>|q}<sRѿ ?i6??5vWƃ⻯?Wzwu=}C |G_0!z87E+oßCh4 o|<AUt߶c_/xzO |/9'<VX{i|Q'5g|#,>g U?C}g[iSakڶ~gkvi3o|U47GR 0\{qֿ%_Q~_e]p%.6 6',uH285DݾF1EV]2}?)~?اOKↅ{ P׿ ?{W9?Adg)=SBkiC8iڡ+ϩc,{'UQ|at?4{yeDG%ľoWtvzƟi|?go/{{ˍ NlX >9Γi^Gz\7B?ߗT|U4iuR&iP}>U&O2+-_۫h~*w4/XXҧtXgºwU*~"[7c]?'4s{W߷?hz__S *p|I1;Ngp~tτhzQE˟zou?,%#,wr-eUܶA8<u ?ʗV7?ke|7oo ?Ӡ_xon:M:%Z_~ /Rvzgoy7ƏmE-~ȃ=s=>fT#izX+揪|?~/?M+G1H756hoImno6?٣k>6,_4hj-WY,+g>ٿ|}*~=N+>&՜7ouXસ;?zRh\ch&5\Y#RoA< 0~V?s  fO`gZߏ,?ꗗ׿Uxÿ.)zWq7/oo*t|D:o5=Wڷ?L9 5 @mO J>|,?<[;׌LsB? ? [j+ѿu_ ] -úxcNxOOt ? ꥓V3~gJ`r^O_S~|pyW~z=i^)״jGQ׎hwLվǛsUg R?6RW#<˞W#Qk|Fٞ|?麗#8> -/>%5_^Խk>; )(fg= q2f&,^+|?7Ɨ| 4}sß+=Ǎ jsN߽Nv0FSG>8iUgvG#ņ_qԁ_p24?iPJ7[y-Q_f~VRܱO9VoO? 'ι/__ꚞoG3V9xoGLp?,?{gk_~5~5rhZCAgiT>s=|_bl:ӹׂ^G񂡞ė] 9=,Jb:~/Y&iq:\?V>+iڟ: "VŮk=ڭiYgĻ/|7,<+hg5u`>}iZ[;~վש~ dU<ؽu 1M&+EďzĚƗy#敡=wGN$R?u4G>2O7h}/W}- u~bFoq`ݾ|/h?c+ |ah [X~ck4;RhMJ` kGXkM村ߥ~3?b^=Elsy F$яïv-?O qE0r+Oğ K%-}>JEK] .h? goO >$;KU4~iy Ԗ?hO9>/m%Ƈa[}=%:Vo5,|A'k(g.5K/lj:v_Nc?2loGw~:?? O/ijo i/ؼ! Erzg (c@~H q ⿢2QSkwo#?EZj#:Ne鶚u)Pb v}\^~m6 : Foe?u!xV_NX+^%IJ34-Q%Dd}ޮ7EkNEW0RZw88_O85+Pn>W(_!=K<+AJOmb/9~1 LjA]luQ_X| >o_oq\^ YE~n|E2hӌp~*x/,4ٯ/E+8$:vj==,.1PdѼ)Dp[;l2<>]4]i|a1>g|텅x7X>5_㏆z$Z_?ukҬ|[]Y$Zf?}#g/Cך_U_}\x< ];38Zvf~'4cK^  ^1_{}?l=voVs'o ֗?6ޱU#A3Ox~gc 6Khq_bhuR2ֱłhеzǗvqXtw[|YZt6Zt =ޕ/ďس/#eZ k{⸾x7|[ߟj:}S^!h>_Ո qӃ;w&-7!ɟ4CO8o|w{/]NQsz}gg_ ƹ=b6~?]sJmחpmY]>$é|>gy-֗_^j?m/zutg߉| |7a<t>Pņńt_c9y4_I.$-K^ hί8G >P?7\7*XZ^p3Lq)p~T.n'qwAZ/2'Hp/BY>a?]n^ |QٍSt`Cυ3gq~>ɏm`qMoޭI+gY3?0_ ƣkkysR}(xI.ҧ?a=;?h1PjV_|q?𬯈d~ |-K[㿋^5\rNjt$W,(%ߪ?ҜVk,z("4o ysSOz^KjFk'?/Zt~Uj98鞘sϰS1_XZk Q ~a+UxbEr.`CI|zhxHS\h',/Y> nΚkİ}q'kKd/ZHc[Kl $PN 1>^%ս %?>9}8;KZ}Rj懠iRA%#6;Z"1/R|'5ym|/*&?9fgkNlyӇuV>xTFz Yxij:9yφG> IŮjT|i|IO}ob 3qkYS/?3u)zzG^_'+ 'hiKU"+kgMLJVT6O֔v?ĊPǔ|uN:q~CGB82fOrj/&]-Q3(09'߽~/j1oO ];v`3!xZGY 2$ p(O9ץ~Y^'khj^׌T'ڮW'zQ؎+9ixwXN:]pNvv_+~G~ξ8 t^#ȾOM~~ɾ3t[.+藾d:i, S?ٳǑxY~3lXt9-đ ~ zۿ2w>A<a߭.=9O୦?̻]jFHЂV2:2>xEO6RG?[IB$ry'8?+~#|8kOYxw߉tRAy-;P, ޾<ZVx CH|E}mJ&^{moiǽy2n.W_wϛ V ;{<;޾qy9>[[} xx`p{|^/5 t./58\'M~)پn4[G>" |61.䯈Q Z|_3NK_VV8/q,RVQvq yϧ'#<~5r=K?&ŒWhog#\})~ܿh7^- _'C-D?٣VT{@~,4/04XuO_x* ]i>g8;n;%# ).]}_;yV.y?3++$Nue|8&~Z\X^y;["Ė1w:j__:(n o~?ޑo/ x}kԾCö&ؿcgK5`9;i3k<͗5H1|m-|9i4.G\ Fx7S1|ď_ D<w^xs,-KL<5bbS.-b$~TJLˇ^-~]v?2py[k5M +ž;:?nS<}3?\੟<_a]/>? [l|Cxھo;8WmAhc}/>2IxK[OI&bQ>$?y9g3m#Vt??{?i<1?~oXد:i{[pSQٖ{[z/?X? ~4~0K|79:lxM{7>iljx\Sf5YnZGq+$64>s\䓂F2 ``W99Ҩdʚ{knU|+4ip}n| 5K>nLL9J+{-"ַ½BJ4k?ڞecYIJ&u\&ӊ洩M K4?ߋKKk];W 3ʺk\xoT?q_Z۶0kx{M?j`2&g2LFpZ=VOSXVa'&o _>N;~zN^@zqyoEXsF|:'B% }Ԏ8_ә&.?+W?tq>[[( ]ZTz= ~B;i?~qZMi޷W҆\i0K QRĒyKGo'ܳj?%ÐEN46rs̀XꗄW"Jh+aƔ_a>՟$t~Ǖ~f}\8>~Ho_j, z'~:BO]^oO0m4luv.xA\XjzyqA?ȳBZ zW Ec;*╟]FR7z7<)imTj@ikQYu{/O2S< A{O[BOnv~ }=x8tbH ϧ^?1_.<ג|wuwgz~m^+ƫ隝-,%΀@8`B9ҨEgfӷiJ5gB:ݪR~ioK?`c%|a_k:ׂ~W^մSPэ5Hln+W:^:Pk@? lK_x߈5r_YP-iZ{t1(XD\5tWGì\mJʔeH8Z-}ݼ?kO/FI+|u%G q~ߴu/]? w}9^WQΪr`';_]/_;[ރ ]Ʃ-Wzǟ?ejWvڝko5K ~>TĐko=;7_ه?kOxJ,|i> l~_  ^x_Zua]yi?Wa< :2ϊ=*jzwp&N_514U_xZP$Z%eC,ĭ_{Yt_ AA>.kNgm;M:c9X=:¿4o3֙xo].HmZĪQduu8'tox{ Q+,4ѓZFVBv8A)?xzQ_;35ItmBX7`ү~wxpj_:w?hu>:4buup;p_iFm5?-NC0͞{ik rg /;<ΞYƸ,'>uW> SďoykZit>hi~kM[^,i^QzEkZNhZ?ij?3kE"(#Ğs=>ŃßXxwM?/u_iknbNӳ\GOGWw|UѼ)CzGԼCc˞ug{C7K o$/˦c#^1kmwþ7ӿG^:iWj?v_/iyO?+K8VUr]w#<,86dO/}6EW|QEQEQEW!O׍t1wm~4hzn&iwRXQRx"qr>ĊF3nM?T*2$ 8lӳ_4|%iq࿂|~5cGgKR]ɱٝm^? 'ʊț+2ж00+ɴ&OkE􋨵IZx=bk}Qo[_'\':+dV1_ 5+vnǯ<Mg-7d{Z/¿^֩ڍލ`,&Nol6xD˃bsOƊCN?Bwa0=5JvHqV.XDUs^lZοm5e&B\ē.zI=?´iAܤdd J*u"g4kJg]-u 躝^鷚Y?uesbq"nzVv h|z6GE>IixU?NǦP)¸%BjբOCXJKeh`&8򥢻42mvApril2000/images2/good.jpg0000640000372000001540000003017407446366455015101 0ustar affweblibuuidJFIFddDucky<Adobed         !1AQa"q2BR#3$tbS4Td%5rCsD6c&EUeu'!1AQaq"2r#c%BR3b$4sS ?H7+X,+Y!I6 HU"e\Ky{4ݫC<DfW4Ӊ'NGiJēݖg<= SDN!<=9bC!5PˋYn3Sd`&jy2l=U@<ccdc/ MK($#Ohj5$]}HW ?|80QtYmU nͥGKM Js|H <(ԋ&G={<4dX!bRMnm* ~GeSBxiXKJ !rME)F0Zѽq3js<*-%Pn[[(&OH|T(5;qi4 ^#B;I v_>_7G h &,|$bÇ/[#:c$5LqkO|Pdo@=el=bϊi$XrZg^'Z*\| yU$m6dFUQ8XN+to}F,(VwZT#b3HTSXЇ#I %(j*$Qi!2*Z ++cqܣFh/ULUO-(|eMsfKilGv UPkJ`XamB7*m(@Xys&kCLխ@G-`,\W\_yeaZ $K=bYuO×;5IEYKrD@2l>?g%t/>Lg|Hn9?Lc/T=R̮d<>S%{4=T $f0Ded@q<0b+.ZzihCgz>3,nKkV&kA*GUkk|1OYimIѓXeļ^vskn{6:׼cc McUp0~-Ċۡ_XƸM6m ҤR ]B\I33{M VM¨waMJU SKl}.W S%pzhQ"M)0nsLXtiM Z46`T:N7Ԭ^aDu.kR㓙,U'Zev(ryc5IS7o[MHcgTX-+}\}-vm5TEȎ%\s^@xqt SK,m6mG!A$Jxspr5WUq,W:oT@;M娒Q5 MQ5!jdj{XtH+Y5C*7O  ^ֲ,?872tmʲ#O<1·aݝho-&hRVUC:fR'F]5AX cA͒׃~1 6ޥ ((@bJ+BItVAK ػĒRq$ngÍ#}0 o\)Fxf_\*u*֚f27D(<1Zl. {0Ny NBf#h~UF_c;`+H(C51_F:#58UZZ,U`fwV)??2X; ##z [ /I"M%e:*i@{1/eʫZIOGjӹJts:. ZTT(šOFҒns/O"l Jw*vU:tϾn0nmYjJ)GJGwckG伻/ZF\Gn~&M%X a%-ٶj:ѱُ/@q@'IRy}Q9Tt]ϳ3rF2UIo=(^+PSXӦCR4.vJ4.[Ο*?Xv#Wh~,z !Pp˳\v8\S։3iqwIgtnRXEʭAG&-nVSz~-4PƑAЄ~8%+unt/)!.-n'v%fSR4Ԕ^xHeJXU5~F.ᭃ頠Q)9*Q%j $uuÿ7zVA/!>@?Y {}vI{onu4 3 )#Évqʴmyr}"`J`XǷ:bRGƆQqܠ8b E BL<AF;]?7j;rn0w˖`@DdNfM;rQzqMſQMa+4 8y*)aH:pf{tٵ Ҟ-ιL (řqHrUw*hJ=ޖu5m!2I4^_DžIkOa9k9653kMS(r2Fr{kSo%c +E(K<(,sRP֋+s Qr[yaQ#‘8w/m)+'F׸G{-$#_uz#!w~Jtlj_2a/?hI@pZϩ!Wq>M #1^kU-*ے"֚ɑ/xGm4qU9>#kyv!FEym乞cY0Q2U&h>^ɱZK\p8 S*IYnjiHbUW<,+;Dˮ^VVu[O))Pܣ!&ϮabǶGJo/n;E}4,<*{==Ǒ J[B#Ka2vg5wc̠?_o!ljL*2ÍVY\J>yw-7ĺS#0Œ\LR[w$Hj9zqw,O-U ^CHC\)SõT_UE @[ ߘcZ f *YѻLrp^﴾c^"- O[~܊8ė=d?pqG&O˗ DXR6σ\[=Ƨ^f)cdr \Wqֱ茧~eߣh!efٓ<-iѧ>=:0=c:M^Wm.ސݮMGTpG\Șמ*η)^Ca!l`buxdkh=Xў;i=u_yM}^~kI%p$Is[mK!9tR{: GV*їU{q~Ti#bX;r۰F)5V"R=/ |V:X()u|-DQq7>Ps* kx-@{I8.JnbP~A#J<$iˏ<B. bP7BxasƤ(3Pr3-ZH'r1UlectT"_Og!K˼,aX``ᆢcqKs~e['yb5#D@XIZ#5uYckCn)#[V$ڞ+̆N9fXD:7n+SbqzWs| M)բdX-tqf)<[?S;+22;[a 8%[SQ,jx9c9q39UPSBr#2kD!h Q0e W3ZvE$A:eKGO=8-˼˛qgPR ГbhE_۷/@r*(: x!Lrzh@IGhW.tZetcs"QSV~v׶k0:MDOЍrԂ[3˖6PIK|mEp&ef $k&(2-PQs̝W>^:Ne;F#F)\1vk+~ѸU-y+ gr? &X--g}!'r-xpՙW+Ѡ ZcO/w=/'Hs)XJ1F$>)ߎ[Ԍ5w ':Z)A8fŵ:Rn(a Ơ@qK:i= 1{Fرb5WHQSey=4EH$],+E,Trm:>n:STz2mJɺAu MmA TIf|dѣn+W;h-ׯHժiۉm*wlkZj"mn%Vu> }Id cb)<0 p²;q*2B`=#^!rB|.yV*ce%SEr *9f]Ӭܚj;w 1Z2e4Ui(/^8vlQU{_JoߴzAܵTcUm}9طH) iL2 .qYPj2qn-F%F>WRrMvԔ4~P-l!t:~dhPc%9'F,\ҵ4T2&$Ӈ n PA?c2Vĩ #Iw_Ѿhg?7q7OyOMWԿKuDPASN9 B3,妝$9b"ەieK`-ycQhwoA "ƤGs*Z+F.zWn%MB׬rV ђ+#G9)OkR7ifAC,j>8󒔛J̷_k/D{ 塹5%}J[0r8*)E5J>{tn6%ܻz,HԤ<1|4n dM:ԛw$R^HɣQD\0-q~n^sm&sqnJ!G(@57v>ogV҇yR߼5̷;:6HJ@3g̐1ac[J0SKۏv/NˢIdV_@`Q8Ϛ\OT+h;e8_$+Ns%W%fk^TO,B0SS H Bf5H Fo?A9G?;FO~=xwԋ# <5T=@Uh>!1߁@(1F%5eq($o0QMԟKt=D&R)\"Aupx.D|8+ӎ{V=2%q~_m"}q}n[Tv†dVbhJ@rDEZjn)o6c nb,AOߏ [w˲foUf7ʶN۽gnATou$$#Noήݴ}V,'6,yl3A WW+^c}7E1 ِ]$.&aG<$x$дy5,un\S)vKn{;d݆]5jOHUA:Ǖ1y>_}ԍ48@PXT0Apr& 2EǑ$?B73dnq G&Hy߱}Frasj [pEpA NxKIbmFkQePF6`EܪqCU~ r =Kk]o^lWq˷Qpx,iAJ n9rUVZKk'mֻ\pȶp}R5O-9T'Wa<"zQKW?XG[\tix&PG\NMt?g˟Q<2^33Bܕ˲q Hjh$d{«DcX{;TI"i hTԜ$$\YV+ H+*iß#߅{Pˀq8l'|{,Ϗ}S~k#q`c9&=~>aGO/pԑ +D9e0 / *bP&(AE8@+@ɢ ]]ǖ   ι֘G!e@ aĠ5an%cAL@kLBȼW7ߡEs_FFQǯ2}{یok{~Zm1] Ӂ_1 >G` ;ESE27s G&4+`^ghe}^WOy }_ {A_Ͻ1>W{B)_y'~'ʾ=h}2pns OyOOŸ)O0tq5GSC1.~ Oz?߷n{惥ϔۏtO {t~OO| 3vܾ}| Cպ}%y?0?VwOy{qzO|ޅksO|2/7vQѹ>]A<Qs%?hjSh*j_֏iӴ/ ?April2000/images2/wraak2.jpg0000640000372000001540000005377207446366465015352 0ustar affweblibuuidJFIFHHC  !"$"$C@" D !1"AQ2a#BqR$3C&57Sbcuv ?jM;'>Zȱ"kC$:Cn%#9ͧjty*}^ߒPjj0rDuuw頤ɐ5Js W+FTy C h' Գf*H\tjv+ڼC|&F46![6HZ0C Md4 4@M4 4@M4 4@M4 4@M4 4@M4 4@M4 4@M4 Dznۊ΂']-u-+or-Fthc,)ej0}%r'OՓO遁BU\u.dGeHn4%Ɛ Š19٠iiiiiiiiiiiiiih|4Q,Q/(fS(bTNjr5y$gjnu2BP#*)qJK'Og9vM4 4@M4 4#4 5.Jm*8 fJC)8Q9;hgc':ko:E ?>uJ 2:t#MM44MM4M2?#MM44MM44:h|h(hK[rr?0}D%={*?pqѠ5Wt۰Rob Z[y ڸv<z9b#;iihzC0eD( S@_pHHI$K\G*wkLUR$e* <PKݺƶ* ]lR9iXo{ f 쁭m (IA]Oo`vl+v]u_@v^*:ƥKv\]""ڛ)1_zh+9 Se9%pAitQ!]r;\m)3*e8c= Ư qG =73z;vT*$́É)R>:WZB>u_]{t÷4VȸRpt8: WcS{rXT,è' .>9$x$h͝w$K}h-I b/˾d۲+IPI9Q?B|D?:fZ-?yeL3A$=9\Gn:!o:tMA|VR}FH8+[qƯk{MӧݕTEުs|lvGG8MPvCקSxĠV;$FiSQE)9ԦԦWiv]i6m '3(>I kn}I[_ +$6T$q@U v  ]t0n)^ JZdcb@5,Rd"nR***)9 ΃)3n>BTiV@9z9zc:.K6C"څTFKq!>Y%Mc3ulm!ܔ1% JтFĜwgA'M4 4@kտX{):؁Tu9׮m}A$HGޔ+ҙrOx'֥(%)JGdGpuU]+x(cU{bRHKEy`R2#8NTz;ӻS)f#9VsP07騂O: ٵ sNQ-&Efm>7T@Q=t:8 TjNXJRĈ=4]*qcz@G8VtNDZDrћ _ɶIVy7zj51kMG0 hu@yC $:=-4 e!HJ0\$$osi$P;y t3mܴV#y<(w(2~5wuxt:$0\?ڄ$GzwKz]èD[vPL6[rTR N2h4MM44:htQ!y<:e,+SkGO5>@KƏ%l\.9‚yO$܏Dd;kwܴkNߙ_&TH }%J :H$HNonkPPӸ$ ۚS: %o]T$5WU5(/ED,$q! R@ 'dRV1֝}52g}=&4S5!2XI Ұ|dV#rOf.qm!eChK)B\'i< -Lܨ-P)ZOa@ z4 C_o(k?C3ϫKcxk?GGS@RRJg$A7>o^>`v[Ҏ [H˪ ZR@P _XSil S%x8)/xyޭ۶V+')>޾TR?k_/j{Yv;<MQ5` WyYH' o>+nVA Yn3@N($tp@Y=[Vջr1͜ z 1# H99y^Z beM."p!!T,*W"y-K$$UnͼMn΅P}Ȩen̺ *֌峜$Hpċ6om}Vy"KICɖɎAJ u/9e2׮91%?ԥd0G =aq jQaJh)<R +l|wӶӹQ굺E%%UԠnrZ ' ~څm:֍\W5Q**|pa-7 #ǁ6 'h4TһGQ b!y mK?<0;]LQf E>٤-Y:W6hB0rBZJU9an&Ԯwn̐ q*W.,Ag98~6 4Eh6fI.y[ pF="rr;Gt>4AVEW~rw–KrKl8q)<F)UOz')T(&VRCkׂEd}v5­+q* Gq)9Aτ,ƹdVJ& k[O䔧 mg^fr6z"{%d;꾾n ޞ.?!2oYFyRV+օ6rN~En3XM!ҀIi$`v1oQ[UP/цQD~ZPrrTG*ݶmgV~uț ()zM,Л]>\G% Hvq `tXNZITBEn#y=j\I@RA0 Zޟ |q%HQ j?~Vg[v̚2]q\r:$!r_]hw>.4I dT!̖HZFR M45*AV0'TF4GB29:hFF4Sgli<Uf1Ӑұ-)HP=Q2iz{ڲˤ:uy$()9[@V[N H6*6E nM!DDpP~[MFFBRԂ3),6'Z{{+e&?M'֋a/U$.(g{ #fsmMȥ9.)MLae\U$o$ @xpxkh_/K yviI!P~xc#Wq(ԙuZLJPJ kWnU.ЯդUȕ:Tڒ`C㎩9D/'ˏy: M4 5L2]XB^ܿ[˧62p%=a01Z>c_w's}i֫o3:$VHa$c'c@מ|㡇_RHm $ 5UdXn܄TB}&Տn8:3!Wl-JTVtI=Q?j2ԥC1D!)H?9.ʵrk$ʎQ>%. ?HIN9 z-UelJu'ؒK:+['ԀOBI MƸ&cQm5ER?J% Ƭ_ݱT e*TmB6Ǟ;ѵK龙.Ci|Zfr82R@[ʈ8p;^lu4 %IbzcAcT?= `2% _ k&L MIHt*c) e@\WHNINZKS\ .e9$ rgpgy5)[42?ﯧ 'qVcQ+hܓS#XO+*@(o,uBL:q! 'C-`:̿hQ$ܔl)5Jcje-8P-gz km =g>]p{;-xHL M44M\(AGFƹj,Z꒧ثSHk; {>NB=|n\J0*jl@RppĎ=IJk15Z HLn"*<KS[C&:OhtYXVq?*^YҍWT KQÈ$+‡e8#r(>2_NlNo}Lu_j55n5Gnb*Kzl)R[% >2a(N>J 2X.B~@ǜ$QMjڏճ;ć8 G !e)8ӌFN3th~n[;+vTx28+Kd8JY]jlݲ?uTJy#ڕu)D?۠}m݃VP>4ħN-ckz,Td13qJP$$`YԦŧAzt G ⸥ %DBWY{qL& I,4>z2ٴTfĻ9itj2sPlKI( 1`Dl5$FW =E). ƗUfV=tdq9% JAhN6Vx+rpH}@4=i 5Nݶ%YZHȝsH ,t; ~"Wm ﵴ,zFJqP'zÐ fIAT .J"*b[ uG`ւ&7jqmD?Z^[۳h>}%C&@%g#'᷋Ź)TJ)J*@JAϝSN6ךv.;4InJ)% €]pĦդd UblTx* IvFIi%l$]\j-+u]rJ3TW6I jTKmeźg!M$'`7VQ+9AA˯8<[k*NI:h>iiW,&o!W S"3ؔI=::-?ֈP X=?iuf9uS)N%>@e$dBVR@Q;t-z"GOș✒r p0:j{uYiTfReUI-KQC*ߡ:Cl/(ֵU2\HԅXʒr.61#4M.O"BSJͺ035L3:CvӇ%-51FCnI dSmz$wSN^ :н(4;ioPjCjqBS(-p(+ q4h: ckL,BB@B$daCo8{IkٕZM U$?s#ש.7&kWLpW0ps@liiiii4Jpz :Ub^N-l% `Qd`c7~k;f>2yG3>I#A{ץ>c_]pޢW\v O8pA 8: "ݓ:TB4Hr "4<Jm9\Y-p:iiVxh9U~5d_.ԗjuFu! ; 0JYgzs(Ǵdy>{j9}q(AZOkuܻ2~Yu ^—bX h? =4LtyK4Zq)ZAݛ+"Q\DB"rJB%Iu(`u꫾6o`jjLu֤a)i)O {8-SuۦD䪚 w"=< ?!*o fڍ7vLdJJB xrqUuK46Djթm)іSCx $㣯%/?h H?զ65|8ՁcmYoMgaJl IupCR}C7-nv 9* R Sgٚ\8{ xKLBR0נ%#$TMm]KA ?H~x㳝L~[u*")I@Lvg'?>5&[if题Sf(Juր=uiCUQ(qi0!=gI5̕'SzBGGC!0m> 9y=2ihx)9:XύۇYbqsERCe!I[YQQmJJBР A_i>%Ce9Q.#M,6V9(d!LBF3ֿ@xGi<[i A G\頥7ͳm|#"Xx #W;d$ v5enη1=ĆR~A=up]vҖLai'To49P׎8[öiyMrur H$g$+1f[3!'Fp; v,rҐ@< ?ݍ}c[, ?I E2!WQ?l;s6Tl!Ǥ=V$U:j'xPI;ǒ6W)-yxQaԱ/$(`μU &FO l2]}E*Ogɗp"hB"2J[XH{O E9<܍RuqqBO3'$6;UfԯZ3ˮKe u8Gy胜c!:k][|O^‘H-Ya.ۊnVMz*-ԨHAzk[Եv5'hna/;.Ɵe )VJ)GGc>TS>ڻϩf#si5zK+ǜ[j7i o(Jq.#5bҪTKTώ!ϥ)'$A\rOq:N$'7qBၵtd]Ԕ='&Q!Npd@!ܚwtb]Zף-3nL8*>8N%p[ssR ~A[=symIgij%JP!DD+wWȢfUD%0 mj'!=Ak룎g?$T_Pyi&KI# 6N* :]Wl UU#) )CMpBRx3: wy6ډZ4ZM ԧ֑>Vxk7{ bmvCp/'z}j6կ4 6:8Ғ:c$NOu A*JE{vۭ%mHKJ\mg#Lv$@۲$sa{h3qG 0:_RqmZU2F=:"EIC3@JhtѴΩ7M5"K75'CĆx(/@HHJ 4yZ bKu)n:_ȈV\RSkHܪM JPN`rI:4v.mjj)mQ VVZĬ$h(67~m՜jS6U )B0sX_X7 j( \_fJ֗J}W[uԋ*NWSĈ\S <@m G`7hinl%b%0Г Ceq |dRnEUb=T:7bKf\w_ ˀO,I@TkM{W*M^TBR,k GdZMS~. 3bHCR!3'8*)_:mrlߧ}DvbcJ-H.9)<$^bʍrPyÍ9\v\yĵN$Od1#YM6RD)쐠yG+^G| kT X[&Ipm[F}U٦PIn8! ġTm +Bd:M *e,.N]d~ӑEè[bL%EKSdO*[$jjѺjgbw]R*)hQ $%XO@xRw6VVAzTJ0aH %INdu,jJR$5x}E1f0㰪*-(!|RJIN# {jˢlJb'2ouےYYYe*mDI+l-@ }:LCojNLu$ K9m>h%q5jsOprCyi.x ՃGE$(tF9ꬸ7DLQHZʃQYuūG6c%>N5g4r0;'_ "Sd8R H?@FUuTߤ 62+Ү+i vArܫڴ9]\zBX[2#eO 'i 胐$p=>Fmq.x;o@ &* e΁@AN^YߋNA]dNN>n%5kRw,~1VP>tQOxA[K-,TI].3)$F:߉JYUDKZ$hl-mȐ9@? TUa!*'ݖUvtwv)"@Yfm,RUE@d9 n@K *ކF8ǝE$#tmʳiG#zm&( åޓKV!p(h֕alBBv*c%8k k r2ք%XIP?)P?: ‰U.utBe:=%!eoR2OxO{"ҩ[rݵ/I1#BbBԔq-qj !l J9ԣtA`]1dzWYn -{q)W"9 #U5}Qg^1+Jd!cRY- R䬐:O0\RAUp"E=qkp)HA*xYn ][4b>|xuZIX% 8#X- $:34CmĪ|j\S!*_|UU DZ!X oK24.O9 uQԥWKO5@cx&DEi*_N=GR\FGG\,VMᐗbS20a)ֿLrY8H|ci BLJ%mˮdݟOWՂJNVvZGۼ.nNAaz4r7M]FXT̗SJTI  1z"ڡCС:"82BA$=: t uT H'GIS~oP$H\qN yO8A₶Ҥ~H8:n2mme JW gA,];m\uvòU<cZȸ I%$*W}r]b,eþ c 8ܤߓvԹ] {qaQ,>jum)#}CG2MpVpOzt_Qrl ^ݏcI[ ps|w 9Ams[Cu*Mk %^x>*)2qĶPu 錦CL=] iX=4GD CX{9ʓ)ڻ=P\U)Ɠ tSTCJb:1mЯ=iQuf=RLGM6#APIR]l m`+ڮoK o]~\\ma.EĐPcQC)$tͷVnInV02h [Q*$૴ `j*@)3TI+P@%AIJpQ$/j}K6"]h@g{d% V^ շ a U)ʣӑ-"{{ʕqVI JmjQ5rH!J LʹdD0mJ̶i*£m`U SŹ$8or̶d7|XVB+ʙΣ;V,\ҡ׷jHgߌK[DžhF@!h#)2/AcQ苃!,&\!I iڲ9Zk_ڹ÷w"M6:Ni[B#AJ}I#Qj-M7R")#u.hRJ䃔gU=7lmV&#OqR&FdGC,4ne* k!C$$ {hK ֫2j1.):NTuMQIuD3ƧWŕo޴"ȑPgAKv~ASDnޛ_Kyp2d3@5^NDGx]u*S0n){$PRg8?i{{GW4 r V!I}3XbEO%J9J >Jsx^ -\vuݩMiChPySԶ館8dz:;rǻj{ qXIE\ڲGdvSX [mp]4r&PqNpQ8:B\zIm.a숱ryԑ=Y酫E:n#PLxb M֖O0zWy u\U)|i⏾KL60R(C߁֫Rj(5@SzO:fA'tȕNU<$AJyq+yIl$T2ϑQ8ַo}noV*f--Aa8_y*\ڌ B܎h˪6M.>ʖBd(BĎ@Ԯ55]Bl4-mzI)9*Dp m"Bj(4+n$ͼr;^ީɨ$hS ~ܱԯnrznj΃k[0anқ=}A`.R NU)JINI=&rvI\~_'Ց-1T7!^2~{:]:JZm*2)dN'h6F Vf3\m-ٯ8ךuB J1I[B2I'kJ.ēo]=FeN{{ J!>MiT$SLbTRhr?c#?gҤ6*݅ .T9e bR}D)$''Vv="L$ʘ%nTS-:íOXSqaFqucΈR|B${-WԨqS+6J*R ~CsG;Ism}+ NH Q=! j)HJrS:rpV$ޗ]!Lz4{'^x.BCcN;)yڊT(dX ƌYe R2{8h4HVWo_ ;(ߩTvL̪]-℉!pN<CEGakv#ȇFԎX9giVJ CW%1= Ҝ2=p8 *گR|9Q!B3`fLgu%i#) 9z@IƃR;IZQC'ZCA)'pd}fvF[T{"MMC!ʤ8:$>IʕNZv9FRXRˎBB֓/ҕj7 ښ -RRiRa6(pt|YI)A=Y+ZԦ[kN한A#Oznu*{rdS$:Z;I}. #G 9(zvbBjNUHJO QBInM_7}n4t qaJw5%*PJ@trcWC/:]kq dDQ[ǂ-.eڒհMoڹtM5Ů,I``HuJ+qV-.W|.oM6=_ԧL~uYO"Np Պ 2S٪1G B2z[1WAR'9ƆyaE(JJ@>vI)L9),HQ@xi`(9;k%snέRXn6ڷ&B8TmV0R{p>|Y6i3U;ea)rUliMqiHd>5~Kv54LwTYi¤I= ӭlߏxk&ڡNvQHu 6s':8rtkի)kEA<˓)HgG9]{-}.GVlLG)Ɣt%`c8P-ѨEѮ%+R:.3F20x^A6۶ &-F9Pah(XrfPYzugk(Z-[p?$ѫoR@ؒ,@6-]s2P %% ?s,9֟Ln^:Yn R}@ m:1ǹ#ζq7nlXsm½wA!EeA=ƴZW{eR}c˩*1q]qPR[XOg \i&#ӍC6B?dr@#5u[߄̓Ցa.ܭ,>R-{RIJFO~z?1X"Q JB^iB dq*Ohj;3w/qϜC^?W#|;tUvVuWih!B0EXsܲTS ލӯOŧ&IO2J=GA,L硫ϷT"lJBU! R y:=~q9ZvZ.U>HH(@r=gOǒRKxY) I PTJR=`"*;_jW!+̷!i`)JZr15zPɡUy#RkG]VJQJBBpUksF6Mܫ~KMqO5ӎ}&5Di갩?P"&B("^m"lKo(r[$"AjŠYu[{5kU'a7.YAB[Bթkm]G2aʥ%J8'!%#A- m)d6T[Go)Gꔥ) JBR5J|86Cqi%KqÀA䝺n-Q.>rVA#2;?m#!˨:2:$y9?kt;Vݶi *ێ62QSq 'HRטЫ6^*-S$օAp}Ӏ8,$ F< v$.ʦIE:`Lr/=<|[BFQ`ҡn;AG'2~zMZvRO Ni&|G@u04bl6˕^S s85dB̈ۥD镥\&@$s ;KlY#ən<^MrcFc5#h &׼jL7إ V\ O:3nXv)s(\ϫ04%ܒ}++WG.m)9kWwԵC;~*wډZ~ۖGRGc kmy'գ&7lqDX8H)Oc q7Yk#{#G|!+C˥?98ŹGT4" zďzl N>sMy*4ϩLbHm#ʔt[]&~)Q\*B}ޚR<$kWw^[.>vK+px]?%iK SتT!jS#&:WTmnq P$lyn62[_۩bCL(\*+#8ǧ ,WlM!$LJGvp>>I98:h:7p¾Ek*%(FRFC¾|dCS]4]wmliWT'V-ևS>JrQğpIgVޱv*Ss(N'rNC)JŠ0r$q$BߖKn/7_ncws[ Qq ??$}XY-QR5Ą 󻭻B^DDm*NY 44MM44MM44MM44MM44MM45Զ>uM[v|*עd)3hoIyRR@PqoiOSJezUiT8<r9m|b\W#Ieu% mą%@A1,ݳ*Ω6FIyM$LJB\% < g;垅fÞJw Y3񍺾v%|s| dw:S>$AX^PR׌^oVmhP\$5Ҁ+-]oX UuBQN&W[jPJց$-Xha# 6ջVurp򔤌%ENdO99h(ӷt[vn$]\8§ T0=2dqhih?August2000/0002750000372000001540000000000010110755624012273 5ustar affweblibuuidAugust2000/index.html0000640000372000001540000003653307520043467014307 0ustar affweblibuuid August Links
SUNDAY
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
        1

How August Became August

2

North Vietnamese torpedo boats attack the U.S. destroyer "Maddox" in the Gulf of Tonkin. (1964)

3

United States President Calvin Coolidge was inaugurated today in 1923

4

George Washington became a Master Mason. (1753)

5

At the Olympic Games in Berlin, African American athlete Jesse Owens broke the Olympic record in the 200-meter race. (1936)

6

U.S. bomber "Enola Gay" drops an atom bomb on Hiroshima, destroying the city and killing some 70,000 people. (1945)

7

Christopher Columbus arrived in the Caribbean (1498)

8

President Richard Nixon announced his intention to resign effective noon the next day. (1974)

9

In 1854, Henry David Thoreau published "Walden," which described his experiences while living near Walden Pond in Massachusetts.

10

Missouri entered the Union as the twenty-fourth state, and the first located entirely west of the Mississippi River. (1821)

11

Duke Kahanamoku broke the world record in the 100-yard free-style swim by 4.6 seconds. (1911)

12

Thomas Alva Edison's completion of the model for the first phonograph. (1877)

13

The first taxicab took to the streets of New York City. (1907)

14

As a protest against the Mexican War and the spread of slavery, Henry David Thoreau refuses to pay a federal tax. (1846)

15

In 1769, Napoleon Bonaparte was born on the island of Corsica.

16

United States forces in Detroit surrendered to the British in the War of 1812.

17

The English defeated the Scots and French at the Battle of Verneuil during the Hundred Years' War. (1424)

18

Genghis Khan, the Mongol leader who conquered most of the known world, died. (1227)

19

Old Ironsides Earns Its Name. (1812)

20

The newly organized National Labor Union called on Congress to mandate an eight-hour workday. (1866)

21

Leonardo da Vinci's painting "Mona Lisa" was stolen from the Louvre Museum by Vicenzo Perruggia. (1911)

22

After landing in Australia, Captain James Cook, claimed it for the British crown. (1770)

23

In 1754, Louis XVI, king of France, was born at Versailles.

24

During the war of 1812 British forces capture Washington, DC. (1814)

25

Locomotive Loses Race with Horse (1830)

26

The Nineteenth Amendment to the U.S. Constitution is adopted, granting women the right to vote. (1920)

27

In 1908, Lyndon B. Johnson, the 36th president of the U.S., was born near Stonewall, Texas

28

Ten suffragists were arrested on today in 1917 as they picketed the White House.

29

The Beatles made their last public performance before the group disbanded in 1970.(1966)

30

Hurricane David hit the Caribbean island of Dominica and killed 1,100 people. (1979)

31

The House of Represent-
atives votes to establish a new Cabinet department, the Department of Housing and Urban Development (HUD). (1965)



 

August2000/Augustwht.gif0000640000372000001540000000712207520043467014764 0ustar affweblibuuidGIF89acddNuӶFWfŰfӣڋӓP,%pK9̹jN睢ʋjDDD333,'dihlp,tmx|pH,:҃l:%tJu2G"C-h@`^o xgNrtqppmlihf"jhlrvywK []`> h I 0-4(\ z#%#b''#T` "`%Wq$& )Yȣ2d$dQ?%\hd^J_f(y%=h%h%6@ `Tj e&~~ 裒NiHr(9 唍 qjbI&rzƙlA0V%l%*ZÆ|si}@~ZP)Bhu/:iyfn%P0j id2 c`0 lAʠe7 $_0 DnX K̲4 Ӱ [pDAEO0//lr/D@˰',09ZrЁ L@h(.,@=_c1! L8@doPtyK`A:؈G1^@pmFzwlq$PAEcL`AC/ǮNTR,so 7GW L_Wo=0#L ^Se@|}(0A_\NP `^'8o&fHЀ<.0 kiv(@>10r oݘ082l~.C/@2:"9"TR& @}` (^ܩp,}Cx8W !8k瑀4 5FSZjf dwFdSFUrޖ(m?\0 ,`aDd P H5*cMm; Ns+V4 %>{裑례&pe9.z"ڶPҰ ,Izc ]^HQ4,=1UhGkaq y4 [5u7_@%fc s3;^ڃĊ @3~Z8bZ+ c` ޴kj.%"cɰvMVZuD?=6zjζr 4Rv4ryqի ӳdÓ4)~f+lk k6_6g8kЏ-}K|iWú'"z{LzѭvŐk/V5;HXhYy(ꦫ "E&+\9 \h$xϬ/ NvYBs׾&63>bE#FdHh; Po$`&(`ϼ7wB }9Hr O5/[ʋ t1et?q(8a1|gy~ sEZ$GA> Do>GWGZW}~w׀|8 (hW{hЁPhx,Wy(8+؂W|5H7h 4|pHJLWF{jqyw2~S|[x]DUT!}Xhk؀ǧ7E(xo}劉}X~sǃ?h}zB#0~~O8GA.{2؃x>8ȉhh(h} (HȊXr  ȌHx091M=8 XxrHgPחP~la|QЀUȆgj1# P|q`! HhixH-ْh%ً8(Xx"(tx^1AوGCb=, 6Y 9yyWi\ٕDX9z'{ zgz{;eH~3}WxyنͧA1l7|XH `o֔H}&(qMy,TيP FYSy(Q7aI)',pz+YRɝteyYI[iXyQ_ipjx|{T蔴)g Iy4YpD#|)ɓɛ. ٛY H! J$J *I7)~9y4׈AHCjZG J ׈ i@Nr#\yMb:dK B jlڦnkʣդPvzxz@7s:Zz 2٨d!;August2000/august.jpg0000640000372000001540000005772007520043467014325 0ustar affweblibuuidJFIFddDucky2!Adobed 8_         #"""#''''''''''     !! !!''''''''''X"! "01A2#%@$&B34 !1AQa"q2 BRb#0@r3CSc4Dd$tPs5!@10q AQP`2a!1AQaq 0 ,.u'e4`Xb4Kne;UQI6hkYBޓ(0ĬK\Śk^M5 ){4C ƘXyV*XSQNYYLuyQ{Tq/@)窟Ξ&5xA?+ԪM9ӄ;e9 N ԡnЍ)IMXm5Z':'㐋Rf-V#L΁".b $/ئ!5Z&6$ i%#bLR '_`{ mWM ,xo[]U"\{b;$oήu1ȏ OUwQG.U.3h)w_T Ln`j>[ju1AGp~3 20Ljt1a:Y{ֿ~ϤW,|5.|/okӲݹnk47pʛ͸rkU{L{9a[c1C={:pqUr\:;=z{m9爪-vv)TI31bO0N\ _Y&t#jI K1_78c HB^Dg ׮hr} :*6|kz~Vpz?S]Rzѿ-}ѹpURX;cMްߊu8>uCkh?Zwev~LڧsjGӶ?7l]DjRVdmՈY_=|oaBtn&q>Zfȩ9_8ܖzNJѲO{{gxSs ~AOE{`U?U>]»> ,E8WgIU1cGaV߶t-kEeI-(§æT.3 M^닿ur%5)6li4هX~1wkJ7>aTmP8A)RTO=.fZQdtE8!ނ0cH`V+3<^&6U'ʎTwۧЗl~9jl"5 fYPKCB:ʼnLbѷ劽 Ra)]~{ec[/KS RC_q# 0q1(ppLQHj-e1$1go$`=p`=p4&=c(PF #N08x yFNFLz-11Bf[o~,`r8 ZBG ,n^ cx>ˏƮ{}rt-Q+>k]rz ܊;w˩7~~=>E~ju'({ _s+[D13[YWg}gumpSQbw]TͮIѫ|>Ɨ+띮Nyg1NL\'@VQ'HxȘBf}*ǯreZliQlCKgs쯖WO-[TR;hUlR5w}}Oe|(Ǒ]~ݭ\)ggk߫vcSֶQS㽗.s۩[eu-xⵋ#h{&.LaIy x쿸mdq^"Ƴfnz(wzOSYGAt!ڥi=W+s8)=V6ҮfWQo?ǗaW|Qc؉ vnk#?O}TDmg}+wS/%>k{]/ XF^┬vvV9G?.9n4rA+~-X$dt8w v{=u8lqzݍ1qq]wjȩ~1ObVJRfpytr?dIY)qyעr`xGT4ɐn[uƪ7-]k[-5+4%ZUl6*mVCI=ż!e;=oz]5.b|?zQ;|^xŗ+ Zgi}N+{N~nujةQd/{:^2YWĿk8!1f?L36dv,3R#LplUU깸Iǩ#~0_J&[mUdC;=RP}Mx(NPCYiZ5ﭧ u:.Λi=ƴ)u!k٩wZWGN_R՝7(FkWm\c/j8ýq{kSUZ;J+utkY(2? Q$#yfs?,R,HqD}EPltݿ^|#_;)t?w$_>Gm {Oom=U3'̡)YwV׻WR9) Cccg##fNFO?[.D'^/1͊G2S9x\6~ #D\T:%n6/}$; N/֑wa}Y9dyC]ηm')Y2sظYnRj̎gc%l|e{V#Z Hs#bKrcؔiv9cg~bC"EMD)#FLD$פI'(Nݏ6B.JF%/j)q%~̑YT<+aTdzJ)lΐn/AzKڟSM+s#JBxY)|PTNMxtF}l>L;[^=q?=-B :HO.$sǸ܂L5*;T΋Z9QT22f9>+Ȓ n%5I1a/gEf?G{ j7Zo pE[0PRS*iQ%a%@kF Pp `)-*>򑂵ZSt+}jTڦ6)X#jСjV! U>S8iX]4McRa:XghDKSV{aJ\IOjbhZ>5iP2]-D$Lؠl}|dyKCHaY. % XQS^FVE[/{ϻYQQ<@35D4!%MXPS 6q+(:jGNUF-]ݝݜ0X% %HEkS <w:P-J֡-l:$6 eXA]b,qs[O 5 $m6 seө;ӧkݤhDH&`Jj#;\!%. 8|*70aNJ.*} @Hh!РJ$t)7MN!Qҋmα,X&(~_E[B )l N <(s%e6\˘ 71CyN uýѡ6] mSD8%N0B;:V(j {- eg*\- sV))ڠWR0(A~1#z.̔y%7Eb:dՌZW`#ĩ%IS6FcRf̉]G S2u5pͅl>+0;n#ȴ_lf{O&:񶠴ڦiNNy[DS+ @<]`66@N[޲w)W ̘gOA!hAx{ ЦIQ8+ߓSjt .o;w8sxM,6V }Ganʶ-@#F0j^?@(nj[tVƛA/P޻w0)Uw0/w0UPx]T  nR*MV)ڠ k̜NЄl(zs^ca,u'zV=Iިwt ޴.c+5NGQ(RqL6[5Z6ф*4pE|v Dm*>Фx4R·:emWi2UKpgB!m8*wdcOv(A|Mɿu DymMkii/7ɣS6oIgAY-8GY0Sz)>UVToO9lӧ-X&24)Zc,E14reRfk*!,85:Ә2ۨb,2*| X"ʟEK'<38*(Uk;|4'V-G F 뇝 9r"ʭ"]a4MZ9U/YT7dZG:S~"6XC-;Xzrj?ע Cw D<ʟȨwki;5DS`m0GeI)t>AXR"D0JQrP -g@EgG*7R63N"-Yt6ӷRkOzm̤ޤݸl A /jvlLxZZg Y DAAt|z*V웮ݟpTit|jl0әP,`4DdOm[+&/Ɋi2׃z '/:C6 _ߝ^3dꘀi#ʧ53V<c\B?x1v3-kN$˦G;_8T@"/,v։CjKOO/nōC?cMf8V+v eSG.XAԄc2cV=d5 @J^6* HDX~ʡvtFFTBxN(F"Q;ߑe>4f pqv ?>>GR/H *TXm*+WiBll. # d"-ڋotjQ *Flvы(Óکfh-/)kf8~cYF8]a"ySPoZ.褄! Y@Y7Bx{^I "rݵv'RuCyꕶlJ]X!U~aͶBW Uf]U8 l͌=Jie bD6ޥO5-K0\dc ZuojAݚ%x}[K5@aca#MHa5`wR~]kV.6'ȩ Ln"]h7y:ݦVC.(z)Ͷ؜>7z+Gd];C2i1???vܞ:m$|FY|TSm=zDnt:З8"7+6pAvQxfP!j{1S$>{h=8 &-G{6+7Rt9W˴T:0g}F֝=^̂q*׉Ê ):Z4W3Nw`zIBޥl%dx`-FQiRx]NV1v4E jP3i-|FgZy 8[ݓEs! o()T3'3Qjc>l)%eR̰N3,1 GB ayxYW8HVHTZZ7`Ok:@uK ?w |p]e~RNGֶRl{JETa\GVq"U/>m\PU/,qmDt6a/&jʝ"p1Ev֠>?W*"1AvDs˰sK CX+)zKii2)?fVC_mg}ijPMJEMvz? 'eȋ&;&bNY%9"ZԛQm1G k,#+4D a d 4ٗ6/JΏ Yvgd7Ш=_Zq hU0ly874z)Lj:mtD7d9k>Uzj cu0ڲAlwpnSrEh/fɱ> Qx(1#x*y8b2.وPZs 0,Zm5v#jX{dImHnLGNCP OwjDLjˮgAB0p!rM*1&aH3'@gxiD8 /h+Bs\7k:h}4| +z(u mr bV)o{AI( Gbqt &I[,tiDt,L"=`[tӆ.oJWTmы [i6V~o*b:؛3~h6U{]=ˋw:ֽ?J%xm?FmӄX[dATis#h2`ŔlQFfÆf6X*] `ӄ2|@BJnTKZm Q}@3ݍ_1bT!gΤQ5*:m^T0D`%D[0:^ qMiTi\pT_IT@S|箚sh2 `ϔeLf[aʂvEM(esG8C_4Ƌ٤ŤyB F4ra1NMXֵ+eU8tRˆ8.&clg[o xw6[=?~h=#GWwj#⣄%QJ:pQ3lrp UJh'eama)>0uڕzT2ujPUHQEߨ--5V {7ӔmFI#c.xxJjF|9O_EzF{ʬsG G*nXyin \A&GFTWq0ku+۹YN8{11Xf-譣0< e*,~)ROR  |鸱BV2 z_a?$rlT){Gb:`K6(UiWVsPE n4\j >5,'J ڀ UP>4R*а9kbWوb5BB0EfuL11$]MBukbg"EdM*M7I .tܠG\Ԡyn<"B uZ5-(mt.'Jqa&ȅt՛=} Yb 3l1;v{܍Erew:k&'@F' u K[3bJVUj VeHIBPiW!7ORE|" ok}qAgL9%㉽m^o8hO/&A+\Fܽ 1a3αBQ:%` ѳJ\M˵=Ňاx-V]̄r"  |Q|Bg^m6#`I~Kfn&g-+nZ| i`[b*Yƭ.dgɪ0:L!̱ 3!d֯'G),NبJ׭i(@CB$޻s?c!\Z$*KnXT.X+B?_w.SZޟh$BQ @cq"˯QJļDpKl/ $*gw,5AA1HF)r}9FɈj,nWSN؇/p0{E-PPIJ-Ķv>yNWq&;K{WxSY sʿi HP%*" 2b׿ev+1~ay'~_c.a|BsqŘKp\Jg5\˃˅mYr1uܩ_yaMP7(3-/J68بCi^8}fUxQm>;wQ+i|AK$d˱GUW\2z&1Ra6}5vu^|mĘ'//xXYBUWP™{JTṮR emB6bI*WUX.j/rx)98DQl^&m.j!7a9kqX1"&Ԥ,y4=ua;NEKW(LY% <% Z{s1L@S2|%Uq )X=%v# gĩNKp^ Bo]Ƥ]DBj`1Bs6f md"ʕ`<q ,>9N&-8-5눭 D 7bk9q7eį9V'K[ `$Q5!/qEsj(Z员8<C dYeXi%KE1X KU(ؙN gP,]K3* q T!VCEqR\ H {cw.b4}M eb4r\#!#l x- w@2F(ѩ{51o)z*zyHJ`2!X"_P q <RDCLTe>"WMX5-ܷ sͶ̐B.uQP_tU(ͥ>&|Kd9{bA.$.Q(,Gl4-3kC@aN!Yiq=fp;pLPH/{V ΩP bwn2ۭ6UÒ$ 7#NM18c@Âq1",pQoWPq%z5l JܼĢqzc\ pGc NuĴ4߉bb 9asR6ARQzs>\P wa&9;1k)]("9`Wwdˡ;B-SKf4w#aG9i9&>mWU݅lf)ģQ"mw0b̢Y!S%G9LeTpf\AAࠀ>f J4ztU٘p x%G(Tw7֎aLqQP 0 ;x0_p o6h..%X@=6XFeY)h1+lW{++Egpvs7%p#HYXBsqhc,Xt)3$8@GG5YڻpSw VMH 3~hqF "6&9.aÿi/s7㊺XqAa1E=ƿc~Dv,$5!yV}+QQ4(`KCև&.e"J7KJ~Ү|MR"FϘN|R9x" DX__g2TCrшlz(߂75*ɷDZ+ɖ[U/CxeRju)X\~RTc)o cU&0yL0 G5΍!mj%n\h4 >Y xj?3-*#VnBw#Kfa<^> qXJ]ozaR¤<%;tzQ/SzUoQi , bP,tֻ\KJ\f-]rϏ1%Ox"FF YzQReP[pCqi69!!ҰD%SXaE6:_Kt,2^+P2RrƁOÈB,Yݟzy:r4rޚ(9E#_?C n7RŊIC5^-vùC s Du-VfZx["j1RBP}ˏƥJbmyp$27vghQ"h]Z0?N@r dYcu_sA_P*mzcX00_V&!㸜b9A2Ϩ v28Va@%h$v^^r3<>X,X ݑlZ+N @9ۇw>eG#Mj\̼5kw0"-Ъuc&%xĀ^Jq-~%\n)ؿZJduPY;?25EsHE3H`tqOr1\Gh=KFϏ+2W @lG1cZ[!JZG1zY 2 Qp*YOgj sxy6oC4.}hw>e`6w9X8!H)]|0ш8ȷV.1Sl u8IsBb(ܥM}RP&p!o16F@,.]nPDs-pW<܃|.Sq,Ns2zyE- *,Ds͝s=D'/xa[ʴ9=D޾t7p`XNb+9{{x.gԠUqp V % WkD659oD]lB Ѩu}CCAU{d|K_㕸3n~1%$*(lzVA `/Ԭ 'h n7QӹFX\`?8ug"y~όH/J0J u}x>[O[(@x6,;aoC4-U//Q??DHNEf^`CqЅC2"8 Ems֑f9(P?YG1Q[b&{XcXxb f?^knz : 1tf>aV0!#Ƅ_?!FC ȼ&s[a@0t-" TʛL@GGV p?R6.[u!*V=G cXjK.,r9ʨ-+&(Q5&}4dPqx[=ݪlxT tHJG:PQfXseTXDK#ۏԀ rw-)Mk1h |}F1ɇp4)$# lZUaL_%*p:~#Sl Sc^Qw Qѥs**v>mqD97FEy沕|oLT!6i?*wbgJwʷJ /Ptյm~>3;{%XCBٛX- *߈)bxX`'@#\Պ˸#dr'udi2{Ʀ,b0Sĸ rfx 9.r5M`b 6/BX=Nu@”_Q <=9"`X4'Q l1%D#Qg??Le \.1d i\L+-ݥ_*b+( rPݯ~mk^Nm"&Pe?aRpȦ|o]'.= 3(%>McC!k?JaP9= `4DT۸#b,oS r' EqF9@,}̵8~@Q*2<8q#xHid>i{7Ft9btNn;Ow204+pY:݄#)^qU)1fYB}j`"Jhl3Vjya͟X謐9gM FQd*dCZY2l"@V5AέYoCԾv T~BʚZ FUnZͮNrvJ:-^D8 Ql}BBҷ`fWFK OAb` sAؼYdPoM)`T%AHY}ʶf註V .j0 %=6~䪍Yp85p Y՟r0E4ֈ%i[>| 0xr?@1wj'űD`Lp2#~e hlqro_>fWL/wO|&:ε(`8tE똝9CjS&C8Tfaωyc xʚ4hkpk QSD}Ŝ1X(*,.h_O2mb "gC")4*P%$|vIx.JA(>;Y=#C ž|fJwb[κPx@CO2YMh 7;3`e$MJT~:[pr ClK`TIfe jVqj[i- W*}ꇻCO(gDxkٳPg1eQc 9<Lv 6N!È> įΈD41ki_O1q`N&@O`V>`JWR qRcqwYMxV=+Yn6S O^l1W"ZUEp$,t<ʔs rm{Y/#lm cE7ق y}tHDdh?S({L0 %ѷ{T2#u5!')Ʒ0vY Vmp޿iӱ.T֣;CUZըfPa4mz,yjq֐( sV5%۰^}˥7W& _堊 , %|ϙ|,v)&(z`x, LŇ5h *4$+.W⹂ G* l")lnw3 3)ykp<yb )qܷLNp/<2?g8.PSѕ8!œ8~ȆTe-cgg_:EZRvbȣ*?pFA7ʮŋ\9@TyTSKt?5 beI+\˕u@{u' )d5ilN^6Kn7i@jhaw!y#Jl{xqk&P6R(ɽYeQk@,cpߏNS}KRbYgM0v5!0e1G,ܲ*oS}g);2CB./qqwnrG5ҙG 52 XJ P|;?qI\GKϬ—T mBY+P6ƫ`N%nSa*\a]Ӏ%*f\27Pn*o]\<X9ҿ0hUA q kaY~QS⧕EEȲysmwK1c|s,; NԭK`[,J]L[baoj_P,[e]^fٙmzTH:^ yN#k%Ti`K}S+ߩQ@,5VgERp0|w(KR֧4Vesppc 5>6#1R Sl2^1$ x/rKv=Dqu/PV5Cw~uDP{50 >[]c9*j嚶t"~Z%ML0`yJø(:j*j-Z ,4sKyH*4wh&Gj %6S@aNnT*ņVQi%r"h"-՗ʭʸ QG&3ؖ$T+`1Uk QUAycKh1bFo7P-Qo\Aw¦8fSaJ'qsQ#ѩǹx[ c"ct[G([Vxrwj:A]znkS3{ /ɉq@` /KK]Se`@vN ] , w-bpg?98_ķEE1kი.t %)\▣Y\uQmC7 Z1,W&L@C uէeLѢ^fqjR#`5d%@/9@4;< !h!$y[}ɹ>ݙgyN7p8g<&)9ͫ:TƱ7ybusiness/0002750000372000001540000000000010110755502012347 5ustar affweblibuuidbusiness/chart.gif0000640000372000001540000001165407026432516014156 0ustar affweblibuuidGIF89aiUJJJRRRZZZccckkksss{{{ﵵﭭ便眜甔猌kk焄{{ccsscckkssccZZccZZRRRRRRJJBBBB991111))))!!޽֔ssBΜƄkΌ{sZB{1s!kcskcJ{Bs9s1k)c!Z޵֜ޭΥƜΔƄ{{skccZR{Bs9k1c)c!ZR1cRkcZ{R{)ZޔƄ{k!Rc֥ν絽ν޵ZRkZJc{ZBZZBRkJZޥ,iU@H*\ȰÇ#Jh&1Y„ q6NLi2K7t&"7n,YBj 9j:zSEO(S 1ȵk  HJ4EB[+vE!C ``,V*8"iГoI,De )%a#,H! 6 h+@ C`j@0@d!"P+n@0DΈIHS(̻ vt(e!EeF%G}Dze&K"Eg$J(-Ki5`J4S$INQSM,|XVlRD@'And< (DiH&dB& dP>9dOFieEAueC"`DD o\(Hf])hy-DŽ+0X D`vj?\0 @z!$z-A4@r 큈u8Nڛ# v@(5l\F4%EJf XWK)d*dFBdХf&_D䨦Qڝxk0@q ,l?%d!E WLg\w$o,ɈP,;AM X2Gei$tD_jGE;SLRFNT]a*LZc TA ցljIE(,A'UY Ű+F3\RЭ@+e1:vw!nmrB]؋rK94CgP9WGǕd]p%GW7~gB$ DAUĬ Y^jmR$ F]Q]yi K' 0ˈ ~ׄ`]IvYnBK/ C. ?Wyjzd Ts z]pPBHrrmMh@*a @\ĥ ZB BF`э gg(N <ct#\0wc'Љ)DSJܠ05$b4$ANCI&G:AAk %ԒGAL(t!DT'&"A70fIZ̥.w^ޒzY@_dP`2f:Ќ4IMiN`Kf262ad2Bdb3ʂR2bSN8W<Mb>@ЂMBІu8H Z% xL0 ,ŤlU\' ](SCh2R kPЇ>==C X܍Ma9ѪRC29PF!PςYG;J Aށ`@nH8l5 t[h QGGG75z҃\v |8{#Haa{iyce 8tܛd"nC0̸B jL )iZ@<ЇЯG" # %Lt":-RDSr?ľ  f;@i7R [VNP޿K۪?x\q!gHfWVr2ceHF|3YX(n akuViyhaz_&hr#yLQX(h cv:4eUc%Qr~28# f07n.$[m#fAdyWĦ8KXLfq9vYXndIgDx0_HnR~xn tNWՀq9Qx>܇'dH7=fN0vg](=T!MȆQ:Qx8a7F0DK!omh+c~We0tdajKr܈8=((8Uih6(d:\g8eC 1m1iO 32b%[8#RXw({hLhk(d(fRNTa{ىSwaIIeu;g\'c#`+!YJ' _7st9 u?#'M-)v{ZEوxy!k"vF֕}(biX?rgDH1huH!k7x SBq?oG9piOJ(ȘaF Y/sgə6/{1xLHY'V/q9r6KTxro$t鄕IG i(9K<8PnhI%j)5!W'9rW(IǘhE%}U j!S.ٙ#!s g@JU"Z@J}H'GďJ *jA#jz#g X$5ꢞ#ף]0ĢoqHE*:!HV 幀uCu5Q BNI&{( #fʡdHr&ʟ9E]*xx\ q B=Y$š'j|RǦ/oGJ&aI1> #JWF(.A;74fLZ-(8A$j$Jf֓(r!*$ɺg(z5xx:u: J)Zّ-  7ZvRH%pږgZx纛[ꨀٙa^: {FS*'Vg([$ZP0k2k/7!; [M?A˭B uxtGK vO#YnZ\UQl6ŵ[q+kCG_N+eUg쪶%AJ'겂*]z a?uɦjzz|[ nUU:HDq&ѸʚIbKK_6 9k5 kxtjf+wK7ṽK ۭ@*<ŋ[cb{;}q";kx홦{uʯ[㛼}}[y ;uҲ[lh1jvP<&S3+& ]!;&z0E%_3n/ $0c|,SF##0l" gQ)02$ //#1D۶;,k1ºSĒyP0`.? 6(\#NlPI6A%C\Y\\ƭ"8 s¾1}knT\5l̸o|'_7hJǡ._[b~n%l46q9lnj\ɖ:ɠU<8|ʪ0#Dʲ<˙Ǵ|˸L˼GO<<̶|\ l<֌ru|Q ŀ *|;business/local.html0000640000372000001540000001611707026432520014340 0ustar affweblibuuid DeltaLand Community Page




















Local Subscribers' Web Pages

To add your Web Page address to this list, please send your Web Page address to rsledge@deltaland.net.

Note: deltaland.net reserves the right to not post a Web Page if deemed, in its sole discretion, to be inappropriate in any way (Please refer to the Service Agreement).





























Copyright 1999 deltaland.net, Inc.
business/index.html0000640000372000001540000002124207260735401014354 0ustar affweblibuuid DeltaLand Business Page




















 

 

 

 


 

 

 

 

 





Copyright 1999 Deltaland, Inc.

 

business/WS_FTP.LOG0000640000372000001540000001564007026432521013766 0ustar affweblibuuid99.10.19 15:25 B E:\ispa\affilliates\rnetworx\business\chart.gif --> www.webhaven.net /com/webhaven.net/www/rnetworx.net/business chart.gif 99.10.19 15:26 B E:\ispa\affilliates\rnetworx\business\coldcash.gif --> www.webhaven.net /com/webhaven.net/www/rnetworx.net/business coldcash.gif 99.10.19 15:26 A E:\ispa\affilliates\rnetworx\business\index.html --> www.webhaven.net /com/webhaven.net/www/rnetworx.net/business index.html 99.10.19 15:27 A E:\ispa\affilliates\rnetworx\business\local.html --> www.webhaven.net /com/webhaven.net/www/rnetworx.net/business local.html 99.10.29 08:15 B E:\ispa\affilliates\rnetworx\business\chart.gif <-- ~webhaven /com/webhaven.net/www/rnetworx.com/business chart.gif 99.10.29 08:15 B E:\ispa\affilliates\rnetworx\business\coldcash.gif <-- ~webhaven /com/webhaven.net/www/rnetworx.com/business coldcash.gif 99.10.29 08:15 A E:\ispa\affilliates\rnetworx\business\index.html <-- ~webhaven /com/webhaven.net/www/rnetworx.com/business index.html 99.10.29 08:16 A E:\ispa\affilliates\rnetworx\business\local.html <-- ~webhaven /com/webhaven.net/www/rnetworx.com/business local.html 99.10.29 17:10 B E:\ispa\affilliates\rnetworx\business\chart.gif --> www.webhaven.net /com/webhaven.net/www/rnetworx.com/business chart.gif 99.10.29 17:10 B E:\ispa\affilliates\rnetworx\business\coldcash.gif --> www.webhaven.net /com/webhaven.net/www/rnetworx.com/business coldcash.gif 99.10.29 17:10 A E:\ispa\affilliates\rnetworx\business\index.html --> www.webhaven.net /com/webhaven.net/www/rnetworx.com/business index.html 99.10.29 17:10 A E:\ispa\affilliates\rnetworx\business\local.html --> www.webhaven.net /com/webhaven.net/www/rnetworx.com/business local.html 99.11.19 14:34 B E:\ispa\affilliates\rnetworx\business\WS_FTP.LOG <-- ~webhaven /com/webhaven.net/www/rnetworx.com/business WS_FTP.LOG 99.11.19 15:09 B E:\ispa\affilliates\rnetworx\business\chart.gif --> www.rnetworx.com /com/rnetworx.com/www/business chart.gif 99.11.19 15:09 B E:\ispa\affilliates\rnetworx\business\coldcash.gif --> www.rnetworx.com /com/rnetworx.com/www/business coldcash.gif 99.11.19 15:09 A E:\ispa\affilliates\rnetworx\business\index.html --> www.rnetworx.com /com/rnetworx.com/www/business index.html 99.11.19 15:09 A E:\ispa\affilliates\rnetworx\business\local.html --> www.rnetworx.com /com/rnetworx.com/www/business local.html 99.12.01 14:14 B E:\ispa\affilliates\rnetworx\business\WS_FTP.LOG <-- ~rnetworx /com/rnetworx.com/www/business WS_FTP.LOG 99.12.04 13:20 B C:\WORKSTUFF\Affiliates sites\New AFF's sites\rnetworx\business\chart.gif --> www.rnetworx.com /com/rnetworx.com/www/business chart.gif 99.12.04 13:20 B C:\WORKSTUFF\Affiliates sites\New AFF's sites\rnetworx\business\coldcash.gif --> www.rnetworx.com /com/rnetworx.com/www/business coldcash.gif 99.12.04 13:20 B C:\WORKSTUFF\Affiliates sites\New AFF's sites\rnetworx\business\index.html --> www.rnetworx.com /com/rnetworx.com/www/business index.html 99.12.04 13:20 B C:\WORKSTUFF\Affiliates sites\New AFF's sites\rnetworx\business\local.html --> www.rnetworx.com /com/rnetworx.com/www/business local.html 99.12.04 13:20 B C:\WORKSTUFF\Affiliates sites\New AFF's sites\rnetworx\business\WS_FTP.LOG --> www.rnetworx.com /com/rnetworx.com/www/business WS_FTP.LOG 99.12.09 09:41 B C:\WORKSTUFF\Affiliates sites\New AFF's sites\deltaland\business\chart.gif --> www.webhaven.net /com/webhaven.net/www/projects/deltaland/business chart.gif 99.12.09 09:41 B C:\WORKSTUFF\Affiliates sites\New AFF's sites\deltaland\business\coldcash.gif --> www.webhaven.net /com/webhaven.net/www/projects/deltaland/business coldcash.gif 99.12.09 09:41 B C:\WORKSTUFF\Affiliates sites\New AFF's sites\deltaland\business\index.html --> www.webhaven.net /com/webhaven.net/www/projects/deltaland/business index.html 99.12.09 09:41 B C:\WORKSTUFF\Affiliates sites\New AFF's sites\deltaland\business\local.html --> www.webhaven.net /com/webhaven.net/www/projects/deltaland/business local.html 99.12.09 09:41 B C:\WORKSTUFF\Affiliates sites\New AFF's sites\deltaland\business\WS_FTP.LOG --> www.webhaven.net /com/webhaven.net/www/projects/deltaland/business WS_FTP.LOG 99.12.15 16:50 B E:\lamar workstuff\WORKSTUFF\deltaland\business\chart.gif --> www.deltaland.net /com/deltaland.net/www/business chart.gif 99.12.15 16:50 B E:\lamar workstuff\WORKSTUFF\deltaland\business\coldcash.gif --> www.deltaland.net /com/deltaland.net/www/business coldcash.gif 99.12.15 16:50 B E:\lamar workstuff\WORKSTUFF\deltaland\business\index.html --> www.deltaland.net /com/deltaland.net/www/business index.html 99.12.15 16:50 B E:\lamar workstuff\WORKSTUFF\deltaland\business\local.html --> www.deltaland.net /com/deltaland.net/www/business local.html 99.12.15 16:50 B E:\lamar workstuff\WORKSTUFF\deltaland\business\WS_FTP.LOG --> www.deltaland.net /com/deltaland.net/www/business WS_FTP.LOG 99.12.15 17:01 B E:\lamar workstuff\WORKSTUFF\deltaland\business\chart.gif --> www.webhaven.net /com/webhaven.net/www/projects/deltaland/business chart.gif 99.12.15 17:01 B E:\lamar workstuff\WORKSTUFF\deltaland\business\coldcash.gif --> www.webhaven.net /com/webhaven.net/www/projects/deltaland/business coldcash.gif 99.12.15 17:01 B E:\lamar workstuff\WORKSTUFF\deltaland\business\index.html --> www.webhaven.net /com/webhaven.net/www/projects/deltaland/business index.html 99.12.15 17:01 B E:\lamar workstuff\WORKSTUFF\deltaland\business\local.html --> www.webhaven.net /com/webhaven.net/www/projects/deltaland/business local.html 99.12.15 17:01 B E:\lamar workstuff\WORKSTUFF\deltaland\business\WS_FTP.LOG --> www.webhaven.net /com/webhaven.net/www/projects/deltaland/business WS_FTP.LOG 99.12.17 08:58 B E:\lamar workstuff\WORKSTUFF\deltaland\business\chart.gif --> www.deltaland.net /com/deltaland.net/www/business chart.gif 99.12.17 08:58 B E:\lamar workstuff\WORKSTUFF\deltaland\business\coldcash.gif --> www.deltaland.net /com/deltaland.net/www/business coldcash.gif 99.12.17 08:58 B E:\lamar workstuff\WORKSTUFF\deltaland\business\index.html --> www.deltaland.net /com/deltaland.net/www/business index.html 99.12.17 08:58 B E:\lamar workstuff\WORKSTUFF\deltaland\business\local.html --> www.deltaland.net /com/deltaland.net/www/business local.html 99.12.17 08:58 B E:\lamar workstuff\WORKSTUFF\deltaland\business\WS_FTP.LOG --> www.deltaland.net /com/deltaland.net/www/business WS_FTP.LOG 99.12.17 17:00 B E:\lamar workstuff\WORKSTUFF\deltaland\business\local.html --> www.deltaland.net /com/deltaland.net/www/business local.html 99.12.18 08:07 B E:\lamar workstuff\WORKSTUFF\deltaland\business\chart.gif --> www.deltaland.net /com/deltaland.net/www/business chart.gif 99.12.18 08:07 B E:\lamar workstuff\WORKSTUFF\deltaland\business\coldcash.gif --> www.deltaland.net /com/deltaland.net/www/business coldcash.gif 99.12.18 08:07 B E:\lamar workstuff\WORKSTUFF\deltaland\business\index.html --> www.deltaland.net /com/deltaland.net/www/business index.html 99.12.18 08:07 B E:\lamar workstuff\WORKSTUFF\deltaland\business\local.html --> www.deltaland.net /com/deltaland.net/www/business local.html business/coldcash.gif0000640000372000001540000001701707026432517014635 0ustar affweblibuuidGIF89aiSBBBJJJRRRZZZccckkksss{{{9Z19c1֥ƽs{sRZRZcZJRJBJBBRBZsZ1Z11c11k11s1)s1){1)1)k1)c1!1!1J{R!{1!11޽JsRBkJ!s1111{sƄ1111!s{ksckBcJ1R9BZ!911111111֥Zk1sB{111)1޵֭Υ{s֜RcJZc{kƄB{R9RBc1J9Z)B)Js19191)1֭Ƶs{ksJcRkRsJkBc1J9Z){B)J!B)Rk1!J9BB1911c{k޽scsZkRc{ƔZs9kJRk1cBZ{)Z9Rs9R)sB1R9c)J1Z)R!J{9B9B191{ZscƜkƌcBc9ZBk9c)J!{B)R!Js999֭ΥJsZsBkRRkJc9{R1sJ)kBBk)R!RJBBΜƭZk{ΜsƔ9cJc9Z){JƜֵR{cc{RkJcB{Z9sRZRsRcZﭽJZRBRJ{眭Zkc{Rscs{{9BB,iS@H*\ȰÇ e*s)FK,,\`nLbb}Pa$ě )tKL*W  $KbĐKʴOXUTP;Z5,422` -T0 52X͚0ٕ[ws€:fdQ3ju-_@UKc}k+AfsߝXuG=dt]9qŸ @*LQL_RiJ@M8=D !tA(aQU4` - D@A"!2jޤ c`@ 橳ц+@HSxn֔6ώ+oAEX-;8]T{ D4d FL % ; 2İBxUPPGQ{Ƹ]bCA0}.BtKD Ĥea<,AVT`T\^b2L, 4iB:F.PCJla~m)5CVXnfQ Y <j-ACw-| ] nO7HHȀI=͟RZ&WDu0C{@c@^ea ;~c !5SPD2hYo twY ^eJb ۲C>`Ľ*MUJjӔX.EEnbNddns" PGtd$kp= Ql@@0p < C7̎0A^ r tIRHSITp*v+ĥ <xєYO'LVm'H:hQ Sˍ /AeM!&p>&@2BfF2cMф&#_HF:~:PE&xH炙{,21  e(s"^QBh TWp@-kru܅M .+B$aoLz { _q$@MP6(bpsQNQn+A3p)*>9gѥbuZH A[HX2Qt1Off lh1Tz(%FIcF!zS@$b#\3o@!$!1i s%sل&l"D^ n@'+D,9y" kѬst 1# $ ɀ3,ob0'[5c%a,}n  Ȅ h!`_pب 6ہ%xCBFq 6H Ћ@# !I,w͝ C>Ɣm n&7 GƢl=,My=bRJFxЅhC. : ^k@i|(DhsG%}57[ ,:ʀ]@BH3iI S1xfsBx:j AY`rd`[Ȣ@U~{08u͙Uv%'ηB40E.G~9'Q3pH RxC$C\r6SWT(@ o5תP(p Y+Q!V@UT(`[ZU*АZu26[ 7I  P8,$݊ :4"P1=rߊ' |*wI{B--#P%>PIx$33Chrzl!Df:_^d_++i $9AgJB^2"R>aD<3W2H׆ qAA5B:bj"~W,hum1yܹq=2Lcf&̀픡+*qs<r\("YpN< dOOna ~, ICT$|Mn6wŇQ^-}4A0!$e.p_҄J&$` $cPIX8;@0VgP`#kb"&Q@y/[J AV@=@3F[84.UArXqQQǔ%4i50tX/hbPR#D!$@€hՃ@}ZQ6@QQ(vfe Rd1I`&OV$A6%Rq աUeV BV&"F0IJ B=UgpS@{07~fɷG O>=U;PY/Ac5Ub`T# T"0<3PP1 !p`7c1Ɉ<sqg'_-:GgpY y{g'"/ Z Z^8A40v0}qTa9lu[!Y5׈"etv$Q[r z$oSxxJ Z">='\Pq'Ks :L2iZ8Ƈ!ؕz7 u0 X0q  CGtC$ Ya` ]`:řֈS>##cW◍s}ٕj!m ;2}4邌CXY'9TSusNqQS!S u"ѕdɛX8BP]IkJEƚ#(E$)\&xd6<qi)x1- DDSM㄂f3yٞvcgg)c V_$(X1zTk38vc3 젚kVqӓFKa<{5\+zٔ66Pe`ud4/0ӡA=}!uwV3d!N#Rd:7V(XX2+LQY7;~?Qi5R#f#0`8JaY"V1e$3CJ$'A_:B-8Fa @  p [u֥1et p 3[Hbgmp,q+ 'm 'zSGBO/+[,+lmP+k;.# 2,;(g+m˛+f*'j@vHۛ:iR51Tٻm:ě%/{n&hIy vH讥yc-bl k&^*v1g'2,Ku wXg¢bI 80QƶA5T4+s0>v,3KFS\⒬H7,Dܟ˫|^\ ioܟzB xOߓaS,-eKW6͛܋p>Dj{d̽p1 ƏI ܇SRLR tI*Mn̠j$Ez{hļTk ̻EـyӼpY kiX̱y*扳@}EN (>~]MNqʮjHRu6Gzd{>@ gJ{vI{bi$1IZ-ߓfधK=*Ni冢HM}Z([Jݚ}eRU~N֎~yMeQY>X,F.c=Cwkk,rmWomk˺sSs3BwnЎPv|&VƇ ->b)k8>1t,Ѥ~i{ˆ\Z~O.5ȣ-=DFUUM' 7aBy豸hO+17V="lbYr=uOzfݛSiq]A4;.Vtk\ -bok,i#ċZmsRXlI_^,9&u>k ڃh{V_LyYZd;im *c>F̏<^OPA_x\.,QΙqƍ DPB aCD-^Ę@=~DhȐ<FԘH 1SL5męSΙ2&qcȖEvRR jȧEdgTeV؛UQ(} qܢ$Kt 7-]X͌U8[5rLՃS2آd-Û%MYŁ]RHW[kh޽on!#׶V򣴝΋c\ƞ]Vp_E5sQE>0,V76sv5x|./K!f-4c -b4*O57VX6>aEIu[s|ҌdrM62/q5&+'W[VVqiE˘g|h!] cXXfW,8e\ f/Ɖi= ʪ:>[[L3roַ#λ;oq!Y)֯za,0uAmHZŻfEg=; u|!y@=ue7k\kB#rgA wy-j y*7>|"gñB62߇ǦFV5~tX܇πD&Le}%nj"6Aytℋ"7YUϑP!S sp|\PVAp6b4/u^h=UdB D*..DHٞSB`uUc*}G%^ȷv"S5ֱo-A;Qt8SG9j$p~Dd߆@UIc"%&PIvRpW\`xCMѓI%ڨ@/c˵ᑈ +ҘJ D2%;f46?5q'Mnm9bn3c_dHsse"zbBӝ|,8k.g@RQW2ו$"ԡZRrȇVtL|C9HZԣ U…4SD[FhRGL[G[:ЄtiNT>7nT"2iPCM)BEꃾyB.OcTUejV{#^ĞZkͰu0', 'subject','', 'email','', 'realname','', 'redirect','', 'bgcolor','', 'background','', 'link_color','', 'vlink_color','', 'text_color','', 'alink_color','', 'title','', 'sort','', 'print_config','', 'required','', 'env_report','', 'return_link_title','', 'return_link_url','', 'print_blank_fields','', 'missing_fields_redirect',''); # Determine the form's REQUEST_METHOD (GET or POST) and split the form # # fields up into their name-value pairs. If the REQUEST_METHOD was # # not GET or POST, send an error. # if ($ENV{'REQUEST_METHOD'} eq 'GET') { # Split the name-value pairs @pairs = split(/&/, $ENV{'QUERY_STRING'}); } elsif ($ENV{'REQUEST_METHOD'} eq 'POST') { # Get the input read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); # Split the name-value pairs @pairs = split(/&/, $buffer); } else { &error('request_method'); } # For each name-value pair: # foreach $pair (@pairs) { # Split the pair up into individual variables. # local($name, $value) = split(/=/, $pair); # Decode the form encoding on the name and value variables. # $name =~ tr/+/ /; $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; # If they try to include server side includes, erase them, so they # aren't a security risk if the html gets returned. Another # security hole plugged up. $value =~ s///g; # If the field name has been specified in the %Config array, it will # # return a 1 for defined($Config{$name}}) and we should associate # # this value with the appropriate configuration variable. If this # # is not a configuration form field, put it into the associative # # array %Form, appending the value with a ', ' if there is already a # # value present. We also save the order of the form fields in the # # @Field_Order array so we can use this order for the generic sort. # if (defined($Config{$name})) { $Config{$name} = $value; } else { if ($Form{$name} && $value) { $Form{$name} = "$Form{$name}, $value"; } elsif ($value) { push(@Field_Order,$name); $Form{$name} = $value; } } } # The next six lines remove any extra spaces or new lines from the # # configuration variables, which may have been caused if your editor # # wraps lines after a certain length or if you used spaces between field # # names or environment variables. # $Config{'required'} =~ s/(\s+|\n)?,(\s+|\n)?/,/g; $Config{'required'} =~ s/(\s+)?\n+(\s+)?//g; $Config{'env_report'} =~ s/(\s+|\n)?,(\s+|\n)?/,/g; $Config{'env_report'} =~ s/(\s+)?\n+(\s+)?//g; $Config{'print_config'} =~ s/(\s+|\n)?,(\s+|\n)?/,/g; $Config{'print_config'} =~ s/(\s+)?\n+(\s+)?//g; # Split the configuration variables into individual field names. # @Required = split(/,/,$Config{'required'}); @Env_Report = split(/,/,$Config{'env_report'}); @Print_Config = split(/,/,$Config{'print_config'}); } sub check_required { # Localize the variables used in this subroutine. # local($require, @error); if (!$Config{'recipient'}) { if (!defined(%Form)) { &error('bad_referer') } else { &error('no_recipient') } } # For each require field defined in the form: # foreach $require (@Required) { # If the required field is the email field, the syntax of the email # # address if checked to make sure it passes a valid syntax. # if ($require eq 'email' && !&check_email($Config{$require})) { push(@error,$require); } # Otherwise, if the required field is a configuration field and it # # has no value or has been filled in with a space, send an error. # elsif (defined($Config{$require})) { if (!$Config{$require}) { push(@error,$require); } } # If it is a regular form field which has not been filled in or # # filled in with a space, flag it as an error field. # elsif (!$Form{$require}) { push(@error,$require); } } # If any error fields have been found, send error message to the user. # if (@error) { &error('missing_fields', @error) } } sub return_html { # Local variables used in this subroutine initialized. # local($key,$sort_order,$sorted_field); # If redirect option is used, print the redirectional location header. # if ($Config{'redirect'}) { print "Location: $Config{'redirect'}\n\n"; } # Otherwise, begin printing the response page. # else { # Print HTTP header and opening HTML tags. # print "Content-type: text/html\n\n"; print "\n \n"; # Print out title of page # if ($Config{'title'}) { print " $Config{'title'}\n" } else { print " Thank You\n" } print " \n \n
\n"; # Print custom or generic title. # if ($Config{'title'}) { print "

$Config{'title'}

\n" } else { print "

Thank You For Filling Out This Form

\n" } print "
\n"; print "Below is what you submitted to $Config{'recipient'} on "; print "$date


\n"; # Sort alphabetically if specified: # if ($Config{'sort'} eq 'alphabetic') { foreach $field (sort keys %Form) { # If the field has a value or the print blank fields option # # is turned on, print out the form field and value. # if ($Config{'print_blank_fields'} || $Form{$field}) { print "$field: $Form{$field}

\n"; } } } # If a sort order is specified, sort the form fields based on that. # elsif ($Config{'sort'} =~ /^order:.*,.*/) { # Set the temporary $sort_order variable to the sorting order, # # remove extraneous line breaks and spaces, remove the order: # # directive and split the sort fields into an array. # $sort_order = $Config{'sort'}; $sort_order =~ s/(\s+|\n)?,(\s+|\n)?/,/g; $sort_order =~ s/(\s+)?\n+(\s+)?//g; $sort_order =~ s/order://; @sorted_fields = split(/,/, $sort_order); # For each sorted field, if it has a value or the print blank # # fields option is turned on print the form field and value. # foreach $sorted_field (@sorted_fields) { if ($Config{'print_blank_fields'} || $Form{$sorted_field}) { print "$sorted_field: $Form{$sorted_field}

\n"; } } } # Otherwise, default to the order in which the fields were sent. # else { # For each form field, if it has a value or the print blank # # fields option is turned on print the form field and value. # foreach $field (@Field_Order) { if ($Config{'print_blank_fields'} || $Form{$field}) { print "$field: $Form{$field}

\n"; } } } print "


\n"; # Check for a Return Link and print one if found. # if ($Config{'return_link_url'} && $Config{'return_link_title'}) { print "

\n"; } # Print the page footer. # print <<"(END HTML FOOTER)";

FormMail V1.6 © 1995 -1997 Matt Wright
A Free Product of Matt's Script Archive, Inc.
(END HTML FOOTER) } } sub send_mail { # Localize variables used in this subroutine. # local($print_config,$key,$sort_order,$sorted_field,$env_report); # Open The Mail Program open(MAIL,"|$mailprog -t"); print MAIL "To: $Config{'recipient'}\n"; print MAIL "From: $Config{'email'} ($Config{'realname'})\n"; # Check for Message Subject if ($Config{'subject'}) { print MAIL "Subject: $Config{'subject'}\n\n" } else { print MAIL "Subject: WWW Form Submission\n\n" } print MAIL "Below is the result of your feedback form. It was submitted by\n"; print MAIL "$Config{'realname'} ($Config{'email'}) on $date\n"; print MAIL "-" x 75 . "\n\n"; if (@Print_Config) { foreach $print_config (@Print_Config) { if ($Config{$print_config}) { print MAIL "$print_config: $Config{$print_config}\n\n"; } } } # Sort alphabetically if specified: # if ($Config{'sort'} eq 'alphabetic') { foreach $field (sort keys %Form) { # If the field has a value or the print blank fields option # # is turned on, print out the form field and value. # if ($Config{'print_blank_fields'} || $Form{$field} || $Form{$field} eq '0') { print MAIL "$field: $Form{$field}\n\n"; } } } # If a sort order is specified, sort the form fields based on that. # elsif ($Config{'sort'} =~ /^order:.*,.*/) { # Remove extraneous line breaks and spaces, remove the order: # # directive and split the sort fields into an array. # $Config{'sort'} =~ s/(\s+|\n)?,(\s+|\n)?/,/g; $Config{'sort'} =~ s/(\s+)?\n+(\s+)?//g; $Config{'sort'} =~ s/order://; @sorted_fields = split(/,/, $Config{'sort'}); # For each sorted field, if it has a value or the print blank # # fields option is turned on print the form field and value. # foreach $sorted_field (@sorted_fields) { if ($Config{'print_blank_fields'} || $Form{$sorted_field} || $Form{$sorted_field} eq '0') { print MAIL "$sorted_field: $Form{$sorted_field}\n\n"; } } } # Otherwise, default to the order in which the fields were sent. # else { # For each form field, if it has a value or the print blank # # fields option is turned on print the form field and value. # foreach $field (@Field_Order) { if ($Config{'print_blank_fields'} || $Form{$field} || $Form{$field} eq '0') { print MAIL "$field: $Form{$field}\n\n"; } } } print MAIL "-" x 75 . "\n\n"; # Send any specified Environment Variables to recipient. # foreach $env_report (@Env_Report) { if ($ENV{$env_report}) { print MAIL "$env_report: $ENV{$env_report}\n"; } } close (MAIL); } sub check_email { # Initialize local email variable with input to subroutine. # $email = $_[0]; # If the e-mail address contains: # if ($email =~ /(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/ || # the e-mail address contains an invalid syntax. Or, if the # # syntax does not match the following regular expression pattern # # it fails basic syntax verification. # $email !~ /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$/) { # Basic syntax requires: one or more characters before the @ sign, # # followed by an optional '[', then any number of letters, numbers, # # dashes or periods (valid domain/IP characters) ending in a period # # and then 2 or 3 letters (for domain suffixes) or 1 to 3 numbers # # (for IP addresses). An ending bracket is also allowed as it is # # valid syntax to have an email address like: user@[255.255.255.0] # # Return a false value, since the e-mail address did not pass valid # # syntax. # return 0; } else { # Return a true value, e-mail verification passed. # return 1; } } sub body_attributes { # Check for Background Color if ($Config{'bgcolor'}) { print " bgcolor=\"$Config{'bgcolor'}\"" } # Check for Background Image if ($Config{'background'}) { print " background=\"$Config{'background'}\"" } # Check for Link Color if ($Config{'link_color'}) { print " link=\"$Config{'link_color'}\"" } # Check for Visited Link Color if ($Config{'vlink_color'}) { print " vlink=\"$Config{'vlink_color'}\"" } # Check for Active Link Color if ($Config{'alink_color'}) { print " alink=\"$Config{'alink_color'}\"" } # Check for Body Text Color if ($Config{'text_color'}) { print " text=\"$Config{'text_color'}\"" } } sub error { # Localize variables and assign subroutine input. # local($error,@error_fields) = @_; local($host,$missing_field,$missing_field_list); if ($error eq 'bad_referer') { if ($ENV{'HTTP_REFERER'} =~ m|^https?://([\w\.]+)|i) { $host = $1; print <<"(END ERROR HTML)"; Content-type: text/html Bad Referrer - Access Denied
Bad Referrer - Access Denied
The form attempting to use FormMail resides at $ENV{'HTTP_REFERER'}, which is not allowed to access this cgi script.

If you are attempting to configure FormMail to run with this form, you need to add the following to \@referers, explained in detail in the README file.

Add '$host' to your \@referers array.


FormMail V1.6 © 1995 - 1997 Matt Wright
A Free Product of Matt's Script Archive, Inc.
(END ERROR HTML) } else { print <<"(END ERROR HTML)"; Content-type: text/html FormMail v1.6
FormMail
Copyright 1995 - 1997 Matt Wright
Version 1.6 - Released May 02, 1997
A Free Product of Matt's Script Archive, Inc.
(END ERROR HTML) } } elsif ($error eq 'request_method') { print <<"(END ERROR HTML)"; Content-type: text/html Error: Request Method
Error: Request Method
The Request Method of the Form you submitted did not match either GET or POST. Please check the form and make sure the method= statement is in upper case and matches GET or POST.

FormMail V1.6 © 1995 - 1997 Matt Wright
A Free Product of Matt's Script Archive, Inc.
(END ERROR HTML) } elsif ($error eq 'no_recipient') { print <<"(END ERROR HTML)"; Content-type: text/html Error: No Recipient
Error: No Recipient
No Recipient was specified in the data sent to FormMail. Please make sure you have filled in the 'recipient' form field with an e-mail address. More information on filling in recipient form fields can be found in the README file.
FormMail V1.6 © 1995 - 1997 Matt Wright
A Free Product of Matt's Script Archive, Inc.
(END ERROR HTML) } elsif ($error eq 'missing_fields') { if ($Config{'missing_fields_redirect'}) { print "Location: $Config{'missing_fields_redirect'}\n\n"; } else { foreach $missing_field (@error_fields) { $missing_field_list .= "
  • $missing_field\n"; } print <<"(END ERROR HTML)"; Content-type: text/html Error: Blank Fields
    Error: Blank Fields
    The following fields were left blank in your submission form:

      $missing_field_list

    These fields must be filled in before you can successfully submit the form.

    Please use your browser's back button to return to the form and try again.


    FormMail V1.6 © 1995 - 1997 Matt Wright
    A Free Product of Matt's Script Archive, Inc.
    (END ERROR HTML) } } exit; } cgi-bin/stats/0002750000372000001540000000000007723267203013176 5ustar affweblibuuidcgi-bin/stats/wwwstat-2.0/0002750000372000001540000000000010110755476015211 5ustar affweblibuuidcgi-bin/stats/wwwstat-2.0/tempstat0002640000372000001540000000011407005603741016766 0ustar affweblibuuid#!/usr/local/bin/perl -w system("./wwwstat -cgi -- ../../../../access*.*"); cgi-bin/stats/wwwstat-2.0/wwwstat.10000640000372000001540000006455007005603741017020 0ustar affweblibuuid.\" Copyright (c) 1994, 1996 Regents of the University of California. .\" All rights reserved. The file LICENSE (the Artistic License) .\" specifies the terms and conditions for redistribution. .\" .if n .tr \-- .if n .tr \(buo .if n .tr \(em- .TH wwwstat 1 "03 November 1996" .if n .ad l .SH NAME wwwstat \- summarize WWW server (httpd) access statistics .SH SYNOPSIS .HP 8 .B wwwstat .RB [ \-F .IR system_config ] .RB [ \-f .IR user_config ] .RI [ options ...] .RB [ -- ] .RI "[ " summary " | " logfile " | " .BR + " | " \- " ]..." .SH DESCRIPTION .nh .B wwwstat reads a sequence of .B httpd common logfile format (CLF) access_log files and/or prior .B wwwstat output summary files and/or the standard input and outputs a summary of the access statistics in HTML. .LP Since .B wwwstat does not make any changes to the input files or write any files in the server directories, it can be run by any user with read access to the input logfile(s) and summary file(s). This allows people other than the webmaster to run specialized analyses of just the things they are interested in summarizing. .LP .B wwwstat provides World Wide Web (WWW) access statistics, which does not necessarily correspond to statistics on individual users. It counts the number of .B HTTP requests received by the server and the amount of bytes transmitted in response to those requests, according to what is in the logfile(s), and outputs those counts as tables broken down by category of request. .LP .B wwwstat output summaries can be read by .B gwstat to produce fancy graphs of the summarized statistics. The .B splitlog program can be used to split a large logfile into separate files by entry prefix or URL path. .LP .B wwwstat is a .B perl script, which means you need to have a .B perl interpreter to run the program. It has been tested with .B perl versions 4.036 and 5.002. .SS Output Sections .BR wwwstat 's output consists of a set of cross-reference links, the sum totals and averages for the processed data, and a sequence of amount-by-category tables partitioned into sections. The section categories are based on the characteristics evident from the access request, as provided by the common logfile format (see .BR NOTES ). These include: .TP 20 Request Date e.g., "Feb 2 1996" .TP Request Hour e.g., "00" through "23" .TP Client Domain The Fully-Qualified Domain Name (FQDN) suffix that corresponds to an organization type or country name. .TP Reversed Subdomain The FQDN, usually minus the first (machine name) component, and reversed so that it is easier to read when sorted. .TP URL/Archive Grouping based on Request-URI or non-success status code. .TP Identity The user identity based on IdentityCheck token or Authorization field. .LP Each section can be enabled/disabled using the configuration files or command-line options (see .BR "Section Display Options" ). .SS Output Table Format Inside each section, the statistics are presented as a preformatted table. .LP .ft C %Reqs %Byte Bytes Sent Requests\0\0 .I category-type .br .ft C ----- ----- ------------ -------- |--------------- .br NN.NN NN.NN NNNNNNNNNNNN NNNNNNNN | .I category-value .br .ft C 100.0 100.0 NNNNNNNNNNNN NNNNNNNN | .I category-value .LP .PD 0 .TP 12 Requests Requests received for this category-value. .TP Bytes Sent Bytes transmitted for this category-value. .TP %Reqs (/)*100. .TP %Byte (/)*100. .PD .LP The table can be sorted by category-value .RB ( "\-sort key" ), number of requests received .RB ( "\-sort req" ), or number of bytes received .RB ( "\-sort byte" ). It can also be limited to the .BI "\-top" " N" entries. .SH OPTIONS .SS Configuration Options These options define how .B wwwstat should establish defaults and interpret the command-line. .TP .BI \-F " filename" Get system configuration defaults from the given file. If used, this .B must be the first argument on the command-line, since it needs to be interpreted before the other command options. The file .B wwwstat.rc is included with the distribution as an example of this file; it contains .B perl source code which directly sets the control and display options provided by .BR wwwstat . If .I filename is not a pathname, the include path (see .BR FILES ) is searched for .IR filename . An empty string as .I filename will disable this feature. .RB [ \-F "wwwstat.rc"] .TP .BI \-f " filename" Get user configuration defaults from the given file. If used, this .B must be the first argument on the command-line after .B \-F (if any). The file is the same format as for the .B \-F option (see .BR wwwstat.rc ). If .I filename is not a pathname, the include path (see .BR FILES ) is searched for .IR filename . An empty string as .I filename will disable this feature. .RB [ \-f ".wwwstatrc"] .TP .B -- Last option (the remaining arguments are treated as input files). .SS Diagnostic Options These options provide information about .B wwwstat usage or about some unusual aspects of the logfile(s) being processed. .TP .B \-h Help \(em display usage information to STDERR and then exit. .TP .B \-v Verbose display to STDERR of each log entry processed. .TP .B \-x Display to STDERR all requests resulting in HTTP error responses. .TP .B \-e Display to STDERR all invalid log entries. Invalid log entries can occur if the server is miswriting or overwriting its own log, if the request is made by a broken client or proxy, or if a malicious attacker is trying to gain privileged access to your system. For the latter reason, the webmaster should run .B wwwstat with this option on a regular basis. .SS Display Options These options modify the output format. .TP .BI \-H " string" Use the given string as the HTML title and heading for output. .TP .BI \-X " string" Use the given string as the cross-reference URL to the last summary output. Any occurrence of the characters "%M" or "%Y" are replaced by the month and year, respectively, of the month prior to the first log entry date. The empty string will exclude any cross-reference. .TP .B \-R Display the daily stats table sorted in reverse. This option is primarily for use with the .B gwstat program for producing graphs of the output. .LP .PD 0 .B \-l .TP .B \-L .PD Do .RB ( \-l ) or don't .RB ( \-L ) display the full DNS hostname of clients in your local domain (which is determined by the configured value of $AppendToLocalhost) in the section on subdomain statistics. The default .RB [ \-L ] is to strip the machine name from local addresses. .LP .PD 0 .B \-o .TP .B \-O .PD Do .RB ( \-o ) or don't .RB ( \-O ) display the full DNS hostname of clients outside your local domain in the section on subdomain statistics. The default .RB [ \-O ] is to strip the machine name from outside addresses. .LP .PD 0 .B \-u .TP .B \-U .PD Do .RB ( \-u ) or don't .RB ( \-U ) display the IP address of clients with unresolved domain names in the section on subdomain statistics. The .B \-dns option can be used to resolve some names, but not all IP hosts have a DNS name (SLIP/PPP connections) and sometimes a host's DNS service is inaccessible. The default .RB [ \-U ] is to group all such addresses under the category "Unresolved". .LP .PD 0 .B \-dns .TP .B \-nodns .PD Do .RB ( \-dns ) or don't .RB ( \-nodns ) use the system's hostname lookup facilities to find the DNS hostname associated with any unresolved IP addresses. Looking up a DNS name may be .B very slow, particularly when the results are negative (no DNS name), which is why a caching capability is included as well. .RB [ \-nodns ] .TP .BI \-cache " filename" Use the given DBM database as the read/write persistent DNS cache (the .dir and .pag extensions are appended automatically). Cached entries (including negative results) are removed after the time configured for $DNSexpires [two months]. No caching is performed if .I filename is the empty string, which may be needed if your system does not support DBM or NDBM functionality. Running .B \-dns without a persistent cache is not recommended. .RB [ "\-cache" "dnscache"] .TP .BI \-trunc " N" Truncate the URLs listed in the archive section after the .I Nth hierarchy level. This option is commonly used to reduce the output size and memory requirements of .B wwwstat by grouping the requests by directory tree instead of listing every URL. The default .RB [ "\-trunc 0" ] is to display every requested URL. .LP .PD 0 .B \-files .TP .B \-nofiles .PD Do .RB ( \-files ) or don't .RB ( \-nofiles ) include the last component of a URL (usually the filename) in the archive section. This option is commonly used to reduce the output size and memory requirements of .B wwwstat by grouping the requests by directory instead of listing every URL. The default .RB [ \-files ] is to display the entire requested URL. .LP .PD 0 .B \-link .TP .B \-nolink .PD Do .RB ( \-link ) or don't .RB ( \-nolink ) add a hypertext link around each archive URL. This option is useful for local maintenance, but it is not recommended for publication of the HTML results (it often results in links to temporary or nonexistant resources, and leads people/robots to resources that might not be publically available). .RB [ \-nolink ] .LP .PD 0 .B \-cgi .TP .B \-nocgi .PD Do .RB ( \-cgi ) or don't .RB ( \-nocgi ) prefix the summary output with CGI header fields appropriate for use with the HTTP common gateway interface. Using .B wwwstat as a CGI script is not recommended \(em it is usually better to simply run the wwwstat program periodically and serve the static output file. .RB [ \-nocgi ] .SS Section Display Options These options change the display of entire sections (as opposed to the entries within those sections). They allow the user to enable or disable an entire section, set the sorting method for that section, and limit the number of displayed entries for that section. These options are context-sensitive and processed in the order given. .LP .PD 0 .B \-all .TP .B \-noall .PD Include .RB ( \-all ) or exclude .RB ( \-noall ) all of the display sections. The .B \-noall option is commonly used just prior to one or more of the other section options, such that only the listed sections are displayed. .LP .PD 0 .B \-daily .TP .B \-nodaily .PD Include .RB ( \-daily ) or exclude .RB ( \-nodaily ) the section of statistics by request date and set the scope for later .BR \-sort " and " \-top options to this section. .LP .PD 0 .B \-hourly .TP .B \-nohourly .PD Include .RB ( \-hourly ) or exclude .RB ( \-nohourly ) the section of statistics by request hour and set the scope for later .BR \-sort " and " \-top options to this section. .LP .PD 0 .B \-domain .TP .B \-nodomain .PD Include .RB ( \-domain ) or exclude .RB ( \-nodomain ) the section of statistics by the client's Internet domain and set the scope for later .BR \-sort " and " \-top options to this section. .LP .PD 0 .B \-subdomain .TP .B \-nosubdomain .PD Include .RB ( \-subdomain ) or exclude .RB ( \-nosubdomain ) the section of statistics by the client's Internet subdomain (reversed for display) and set the scope for later .BR \-sort " and " \-top options to this section. .LP .PD 0 .B \-archive .TP .B \-noarchive .PD Include .RB ( \-archive ) or exclude .RB ( \-noarchive ) the section of statistics by requested URL/archive and set the scope for later .BR \-sort " and " \-top options to this section. .LP .PD 0 .B \-r .LP .B \-ident .TP .B \-noident .PD Include .RB ( \-r " or " \-ident ) or exclude .RB ( \-noident ) the section of statistics by the identity of the user (if IdentityCheck is ON) or the authentication userid (if supplied) and set the scope for later .BR \-sort " and " \-top options to this section. .B DO NOT PUBLISH this information, as that would reveal security-related identities and be a violation of privacy. This option is provided for administrative purposes only. .TP .BR \-sort " (" "key|byte|req" ) Sort this section by its primary key, the number of bytes transmitted, or the number of requests received. .RB [ "\-sort key" ] .TP .BI \-top " N" Display only the top N entries for this section. This option assumes that the .B \-sort option has been set to either bytes or requests. .TP .B \-both Display both the top N entries for this section [10, sorted by requests], and then the full section (all entries) sorted by key. .SS Search Options These options are used to limit the analysis to requests matching a pattern. The pattern is supplied in the form of a .BR "perl regular expression" , except that the characters "+" and "." are escaped automatically unless the .B \-noescape option is given. Enclose the pattern in single-quotes to prevent the command shell from interpreting some special characters. .LP Multiple occurrences of the same option results in an OR-ing of the regular expressions. Search options are only applied to logfile entries; any summary files input must have been created with the same search options. .LP .PD 0 .BI \-a " regexp" .TP .BI \-A " regexp" .PD Include .RB ( \-a ) or exclude .RB ( \-A ) all requests containing a hostname/IP address matching the given perl regular expression. .LP .PD 0 .BI \-c " regexp" .TP .BI \-C " regexp" .PD Include .RB ( \-c ) or exclude .RB ( \-C ) all requests resulting in an .B HTTP status code matching the given perl regular expression. .LP .PD 0 .BI \-d " regexp" .TP .BI \-D " regexp" .PD Include .RB ( \-d ) or exclude .RB ( \-D ) all requests occurring on a date (e.g., "Feb 2 1994") matching the given perl regular expression. .LP .PD 0 .BI \-t " regexp" .TP .BI \-T " regexp" .PD Include .RB ( \-t ) or exclude .RB ( \-T ) all requests occurring during the hour (e.g., "23" is 11pm \- 12pm) matching the given perl regular expression. .LP .PD 0 .BI \-m " regexp" .TP .BI \-M " regexp" .PD Include .RB ( \-m ) or exclude .RB ( \-M ) all requests using an HTTP method (e.g., "HEAD") matching the given perl regular expression. .LP .PD 0 .BI \-n " regexp" .TP .BI \-N " regexp" .PD Include .RB ( \-n ) or exclude .RB ( \-N ) all requests on a URL (archive name) matching the given perl regular expression. .TP .B \-noescape Do not escape the special characters ("+" and ".") in the remaining search options. .SH INPUT After parsing the options, the remaining arguments on the command-line are treated as input arguments and are read in the order given. If no input arguments are given, the configured default logfile is read .RB [ + ]. .TP .B \- Read from standard input (STDIN). .TP .B + Read the default logfile. [as configured] .TP .IR filename ... Read the given file and determine from the first line whether it is a previous output summary or a CLF logfile. If the .IR filename 's extension indicates that is is compressed (gz|z|Z), then pipe it through the configured decompression program .RB [ "gunzip \-c" ] first. Summary files must have been created with the same (or similar) configuration and command-line options as the currently running program; if not, weird things will happen. .SH USAGE .B wwwstat is used for many purposes: .TP \(bu as a diagnostic utility for measuring server activity, finding incorrect URL references, and detecting attempted misuse of the server; .TP \(bu as a public relations tool for measuring technology or information transfer (i.e., Is the message getting out? To the right people?); .TP \(bu as an archival tool for tracking web usage over time without storing the entire logfile; and, .TP \(bu most often, as an easy mechanism for justifying all the hard work that went into creating the web content that people out there are requesting. .LP In most cases, .B wwwstat is run on a periodic basis (nightly, weekly, and/or monthly) by a wrapper program as a .B crontab entry shortly after midnight, typically in conjunction with rotating the current logfile. The output is usually directed to a temporary file which can later be moved to a published location. The temporary file is necessary to avoid erasing your published file during wwwstat's processing (which would look very odd if someone tried to GET it from your web). .LP .B wwwstat can be run as a CGI script .RB ( \-cgi ), but that is not recommended unless the input logfile is very small. .LP All of the command-line options, and a few options that are not available from the command-line, can be changed within the user and system configuration files (see .BR wwwstat.rc ). These files are actually .B perl library modules which are executed as part of the program's initialization. The example provided with the distribution includes complete documentation on what variables can be set and their range of values. .SS Perl Regular Expressions The Search Options and many of the configuration file settings allow for full use of perl regular expressions (with the exception that the \-a, \-A, \-n and \-N options treat '+' and '.' characters as normal alphabetic characters unless they are preceded by the .B \-noescape option). Most people only need to know the following special characters: .LP .PD 0 .TP 8 .B ^ at start of pattern, means "starts with pattern". .TP .B $ at end of pattern, means "ends with pattern". .TP .B (...) groups pattern elements as a single element. .TP .B ? matches preceding element zero or one times. .TP .B * matches preceding element zero or more times. .TP .B + matches preceding element one or more times. .TP .B . matches any single character. .TP .B [...] denotes a class of characters to match. [^...] negates the class. Inside a class, '-' indicates a range of characters. .TP .B (A|B|C) matches if A or B or C matches. .PD .LP Depending on your command shell, some special characters may need to be escaped on the command line or enclosed in single-quotes to avoid shell interpretation. .SH EXAMPLES .TP Summarize requests from commercial domains. .B wwwstat \-a '.com$' .TP Summarize requests from the host kiwi.ics.uci.edu .B wwwstat \-a '^kiwi.ics.uci.edu$' .TP Summarize requests not from kiwi.ics.uci.edu .B wwwstat \-A '^kiwi.ics.uci.edu$' .TP Summarize requests resulting in temporary redirects .B wwwstat \-c '302' .TP Summarize requests resulting in server errors .B wwwstat \-c '^5' .TP Summarize unsuccessful requests .B wwwstat \-C '^2' \-C '304' .TP Summarize requests in first week of the month .B wwwstat \-d ' [1-7] ' .TP Summarize requests in second week of the month .B wwwstat \-d ' ([89]|1[0-4]) ' .TP Summarize requests in third week of the month .B wwwstat \-d ' (1[5-9]|2[01]) ' .TP Summarize requests in fourth week of the month .B wwwstat \-d ' 2[2-8] ' .TP Summarize requests in leftover days of the month .B wwwstat \-d ' (29|30|31) ' .TP Summarize requests in February .B wwwstat \-d 'Feb' .TP Summarize requests in year 1994 .B wwwstat \-d '1994' .TP Summarize requests not in April .B wwwstat \-D 'Apr' .TP Summarize requests between midnight and 1am .B wwwstat \-t '00' .TP Summarize requests not received between noon and 1pm .B wwwstat \-T '12' .TP Summarize requests with a gif extension .B wwwstat \-n '.gif$' .TP Summarize requests under user's URL .B wwwstat \-n '^/~user/' .TP Summarize requests not under "hidden" paths .B wwwstat \-N '/hidden/' .SH ENVIRONMENT .TP 12 .B HOME Location of user's home directory, placed on INC path. .TP .B LOGDIR Used instead of HOME if latter is undefined. .TP .B PERLLIB A colon-separated list of directories in which to look for include and configuration files. .SH FILES Unless a pathname is supplied, the configuration files are obtained from the current directory, the user's home directory .RB ( HOME " or " LOGDIR ), the standard library path .RB ( PERLLIB ), and the directory indicated by the command pathname (in that order). .TP 15 .B .wwwstatrc User configuration file. .TP .B wwwstat.rc System configuration file. .TP .B domains.pl Mapping of Internet domain to country or organization. .LP .PD 0 .B dnscache.dir .TP 15 .B dnscache.pag .PD DBM files for persistent DNS cache. .SH SEE ALSO .BR crontab (1), .BR gwstat (1), .BR httpd (1m), .BR perl (1), .BR splitlog (1) .LP More info and the latest version of wwwstat can be obtained from .LP http://www.ics.uci.edu/pub/websoft/wwwstat/ ftp://www.ics.uci.edu/pub/websoft/wwwstat/ .LP If you have any suggestions, bug reports, fixes, or enhancements, please join the mailing list by sending e-mail with "subscribe" in the subject of the message to the request address . The list is archived at the above address. .SS More About HTTP .TP HTTP/1.1 Proposed Standard R. Fielding, J. Gettys, J. C. Mogul, H. Frystyk, and T. Berners-Lee. "Hypertext Transfer Protocol -- HTTP/1.1", U.C. Irvine, DEC, MIT/LCS, August 1996. .br http://www.ics.uci.edu/pub/ietf/http/ .LP .SS More About Perl .TP The Perl Language Home Page http://www.perl.com/perl/index.html .TP Johan Vromans' Perl Reference Guide http://www.xs4all.nl/~jvromans/perlref.html .SH DIAGNOSTICS See also the .B Diagnostic Options above. .TP "[none] to [none]" dates .B wwwstat did not find any matching data to summarize. If you get such an empty summary, it means that either: 1) there was no valid data (the input files are all invalid or empty), or 2) none of the data matched the search options given. Try using the .B \-e option to show invalid data. .TP 100% unresolved If the subdomain section indicates that all of the client requests come from unresolved hostnames (IP addresses), this probably means that your server is running without DNS resolution (common for very busy sites). You can use the .B \-dns option to have .B wwwstat perform the hostname lookups. If 100% of the hosts are still unresolved with the .B \-dns option in effect, then it may be that all of the clients accessing your server are doing so from temporary SLIP/PPP addresses without DNS names, or it may be a problem with wwwstat's DNS cache (delete the cache files), with your system's DNS software (contact your system administrator), or with your network connection. .SH NOTES .SS Hits vs Requests vs Visitors .B wwwstat counts HTTP requests received by the server. When a request is successful, it is often referred to as a "hit". Retrieving a single image is one GET request. Retrieving an HTML page is also one GET request, but that does not include the separate requests made for in-line images or related objects. Checking to see if a cached image is still valid (a HEAD or conditional GET) is also one request. .LP In all sections except the archive section, .B wwwstat shows the statistics for all requests (successful or not). In the archive section, it normally shows all non-successful requests under a special category for the status code and only successful requests (hits) under the URL or archive tree associated with the request. However, this grouping of non-successful requests is disabled when .B wwwstat is used with the search options .BR \-n ", " \-c ", and " \-C "," since those options are normally used for finding error conditions. .LP .B wwwstat does not count "visitors" -- individual people or programs making the requests. HTTP does not, by default, provide any information that can be accurately correlated to an individual person, though it is possible (in an unreliable manner) to use HTTP extensions and request profiles as a means of tracking individual client programs. Such tracking requires extensive resources (memory and diskspace) and is often considered a violation of privacy. .LP With the exception of the ident section, .B wwwstat does not reveal information about the individual people making requests. Unless the output is limited to a specific URL or a specific hostname, .BR wwwstat 's output does not connect the requester to the URL being requested. .SS Common Logfile Format The httpd common logfile format (CLF) was defined in early 1994 as the result of discussions among server and access_log analyzer developers (Roy Fielding, John Franks, Kevin Hughes, Ari Luotonen, Rob McCool, and Tony Sanders) on how to make it easier for analysis tools to be used across multiple servers. The format is: .LP remote_host ident authuser [date-time zone] "Request-Line" Status-Code bytes .LP .PD 0 .TP 15 where means .TP ------------ -------------------------------------- .TP remote_host Client DNS hostname or IP address .TP ident Identity check token or "\-" .TP authuser Authorization user-id or "\-" .TP date-time dd/Mmm/yyyy:hh:mm:ss .TP zone +dddd or \-dddd .TP Request-Line The first line of the HTTP request, which normally includes the method, URL, and HTTP-version. .TP Status-Code Response status from server or "\-" .TP bytes Size of Entity-Body transmitted or "\-" .TP ------------ -------------------------------------- .PD .LP with each field separated by a single space (it turns out that problems occur if the ident token contains a space, which was not anticipated by the original designers). .SH LIMITATIONS .B wwwstat cannot be more accurate than its input. .LP The common logfile format does not include the amount of bytes transferred in HTTP header fields and in error responses. .B wwwstat attempts to estimate those bytes based on the response code. Although the built-in estimates will suffice for most applications, your results will be more accurate if the estimates are customized for the particular server software that generated the logfile. .LP Modern httpd servers have extended the CLF to include additional fields (Referer and User-Agent) or to make the entire format configurable. Although .B wwwstat is able to read logfiles which append information to the CLF, it will not make use of that additional information. However, .B wwwstat is written in .BR perl , so if you want to parse a different format all you have to do is change the parsing code. .LP .B wwwstat does not do anything with Referer [sic] or User-Agent information that may be present in extended logfiles. In order to do anything interesting with Referer, the program would have to build a Request-URI x Referer x Count table, which would require huge gobs of memory and is better done using a separate program with a persistent database. Naturally, this is easy to do once you learn .BR perl . .SH AUTHOR Roy Fielding (fielding@ics.uci.edu), University of California, Irvine. Please do not send questions or requests to the author, since the number of requests has long since overwhelmed his ability to reply, and all future support will be through the mailing list (see above). .LP .B wwwstat was originally based on a multi-server statistics program called .B fwgstat-0.035 by Jonathan Magid (jem@sunsite.unc.edu) which, in turn, was heavily based on .B xferstats (packaged with the version 17 of the Wuarchive FTP daemon) by Chris Myers (chris@wugate.wustl.edu). .LP This work has been sponsored in part by the Defense Advanced Research Projects Agency under Grant Numbers MDA972-91-J-1010 and F30602-94-C-0218. This software does not necessarily reflect the position or policy of the U.S. Government and no official endorsement should be inferred. cgi-bin/stats/wwwstat-2.0/domains.pl0000640000372000001540000001561607005603740017203 0ustar affweblibuuid# Mapping of Internet Domain to Country/Organization Name # # The country codes are based on ISO 3166 two-character codes, but what # is important to us is that they correspond to the names assigned by # IANA for Internet domains. NOTE that these change over time! # # wwwstat matches domains to names using a suffix match of domain # components, with the first (longest) match being the categorization # for the stats-by-domain listing. These values can be added to or # overridden in the wwwstat.rc file, e.g. # # $DomainMap{'uci.edu'} = 'University of California, Irvine'; # # NOTE: The first (key) column below must be in lowercase. %DomainMap = ( 'ad', 'Andorra', 'ae', 'United Arab Emirates', 'af', 'Afghanistan', 'ag', 'Antigua and Barbuda', 'ai', 'Anguilla', 'al', 'Albania', 'am', 'Armenia', 'an', 'Netherlands Antilles', 'ao', 'Angola', 'aq', 'Antarctica', 'ar', 'Argentina', 'as', 'American Samoa', 'at', 'Austria', 'au', 'Australia', 'aw', 'Aruba', 'az', 'Azerbaijan', 'ba', 'Bosnia and Herzegovina', 'bb', 'Barbados', 'bd', 'Bangladesh', 'be', 'Belgium', 'bf', 'Burkina Faso', 'bg', 'Bulgaria', 'bh', 'Bahrain', 'bi', 'Burundi', 'bj', 'Benin', 'bm', 'Bermuda', 'bn', 'Brunei Darussalam', 'bo', 'Bolivia', 'br', 'Brazil', 'bs', 'Bahamas', 'bt', 'Bhutan', 'bv', 'Bouvet Island', 'bw', 'Botswana', 'by', 'Belarus', 'bz', 'Belize', 'ca', 'Canada', 'cc', 'Cocos (Keeling) Islands', 'cf', 'Central African Republic', 'cg', 'Congo', 'ch', 'Switzerland', 'ci', "Cote D'Ivoire (Ivory Coast)", 'ck', 'Cook Islands', 'cl', 'Chile', 'cm', 'Cameroon', 'cn', 'China', 'co', 'Colombia', 'cr', 'Costa Rica', 'cs', 'Czechoslovakia (former)', 'cu', 'Cuba', 'cv', 'Cape Verde', 'cx', 'Christmas Island', 'cy', 'Cyprus', 'cz', 'Czech Republic', 'de', 'Germany', 'dj', 'Djibouti', 'dk', 'Denmark', 'dm', 'Dominica', 'do', 'Dominican Republic', 'dz', 'Algeria', 'ec', 'Ecuador', 'ee', 'Estonia', 'eg', 'Egypt', 'eh', 'Western Sahara', 'er', 'Eritrea', 'es', 'Spain', 'et', 'Ethiopia', 'fi', 'Finland', 'fj', 'Fiji', 'fk', 'Falkland Islands (Malvinas)', 'fm', 'Micronesia', 'fo', 'Faroe Islands', 'fr', 'France', 'fx', 'France, Metropolitan', 'ga', 'Gabon', 'gb', 'Great Britain (UK)', 'gd', 'Grenada', 'ge', 'Georgia', 'gf', 'French Guiana', 'gh', 'Ghana', 'gi', 'Gibraltar', 'gl', 'Greenland', 'gm', 'Gambia', 'gn', 'Guinea', 'gp', 'Guadeloupe', 'gq', 'Equatorial Guinea', 'gr', 'Greece', 'gs', 'S. Georgia and S. Sandwich Isls.', 'gt', 'Guatemala', 'gu', 'Guam', 'gw', 'Guinea-Bissau', 'gy', 'Guyana', 'hk', 'Hong Kong', 'hm', 'Heard and McDonald Islands', 'hn', 'Honduras', 'hr', 'Croatia (Hrvatska)', 'ht', 'Haiti', 'hu', 'Hungary', 'id', 'Indonesia', 'ie', 'Ireland', 'il', 'Israel', 'in', 'India', 'io', 'British Indian Ocean Territory', 'iq', 'Iraq', 'ir', 'Iran', 'is', 'Iceland', 'it', 'Italy', 'jm', 'Jamaica', 'jo', 'Jordan', 'jp', 'Japan', 'ke', 'Kenya', 'kg', 'Kyrgyzstan', 'kh', 'Cambodia', 'ki', 'Kiribati', 'km', 'Comoros', 'kn', 'Saint Kitts and Nevis', 'kp', 'Korea (North)', 'kr', 'Korea (South)', 'kw', 'Kuwait', 'ky', 'Cayman Islands', 'kz', 'Kazakhstan', 'la', 'Laos', 'lb', 'Lebanon', 'lc', 'Saint Lucia', 'li', 'Liechtenstein', 'lk', 'Sri Lanka', 'lr', 'Liberia', 'ls', 'Lesotho', 'lt', 'Lithuania', 'lu', 'Luxembourg', 'lv', 'Latvia', 'ly', 'Libya', 'ma', 'Morocco', 'mc', 'Monaco', 'md', 'Moldova', 'mg', 'Madagascar', 'mh', 'Marshall Islands', 'mk', 'Macedonia', 'ml', 'Mali', 'mm', 'Myanmar', 'mn', 'Mongolia', 'mo', 'Macau', 'mp', 'Northern Mariana Islands', 'mq', 'Martinique', 'mr', 'Mauritania', 'ms', 'Montserrat', 'mt', 'Malta', 'mu', 'Mauritius', 'mv', 'Maldives', 'mw', 'Malawi', 'mx', 'Mexico', 'my', 'Malaysia', 'mz', 'Mozambique', 'na', 'Namibia', 'nc', 'New Caledonia', 'ne', 'Niger', 'nf', 'Norfolk Island', 'ng', 'Nigeria', 'ni', 'Nicaragua', 'nl', 'Netherlands', 'no', 'Norway', 'np', 'Nepal', 'nr', 'Nauru', 'nt', 'Neutral Zone', 'nu', 'Niue', 'nz', 'New Zealand (Aotearoa)', 'om', 'Oman', 'pa', 'Panama', 'pe', 'Peru', 'pf', 'French Polynesia', 'pg', 'Papua New Guinea', 'ph', 'Philippines', 'pk', 'Pakistan', 'pl', 'Poland', 'pm', 'St. Pierre and Miquelon', 'pn', 'Pitcairn', 'pr', 'Puerto Rico', 'pt', 'Portugal', 'pw', 'Palau', 'py', 'Paraguay', 'qa', 'Qatar', 're', 'Reunion', 'ro', 'Romania', 'ru', 'Russian Federation', 'rw', 'Rwanda', 'sa', 'Saudi Arabia', 'sb', 'Solomon Islands', 'sc', 'Seychelles', 'sd', 'Sudan', 'se', 'Sweden', 'sg', 'Singapore', 'sh', 'St. Helena', 'si', 'Slovenia', 'sj', 'Svalbard and Jan Mayen Islands', 'sk', 'Slovak Republic', 'sl', 'Sierra Leone', 'sm', 'San Marino', 'sn', 'Senegal', 'so', 'Somalia', 'sr', 'Suriname', 'st', 'Sao Tome and Principe', 'su', 'USSR (former)', 'sv', 'El Salvador', 'sy', 'Syria', 'sz', 'Swaziland', 'tc', 'Turks and Caicos Islands', 'td', 'Chad', 'tf', 'French Southern Territories', 'tg', 'Togo', 'th', 'Thailand', 'tj', 'Tajikistan', 'tk', 'Tokelau', 'tm', 'Turkmenistan', 'tn', 'Tunisia', 'to', 'Tonga', 'tp', 'East Timor', 'tr', 'Turkey', 'tt', 'Trinidad and Tobago', 'tv', 'Tuvalu', 'tw', 'Taiwan', 'tz', 'Tanzania', 'ua', 'Ukraine', 'ug', 'Uganda', 'uk', 'United Kingdom', 'um', 'US Minor Outlying Islands', 'us', 'United States', 'uy', 'Uruguay', 'uz', 'Uzbekistan', 'va', 'Vatican City State (Holy See)', 'vc', 'Saint Vincent and the Grenadines', 've', 'Venezuela', 'vg', 'Virgin Islands (British)', 'vi', 'Virgin Islands (U.S.)', 'vn', 'Viet Nam', 'vu', 'Vanuatu', 'wf', 'Wallis and Futuna Islands', 'ws', 'Samoa', 'ye', 'Yemen', 'yt', 'Mayotte', 'yu', 'Yugoslavia', 'za', 'South Africa', 'zm', 'Zambia', 'zr', 'Zaire', 'zw', 'Zimbabwe', 'com', 'Commercial', 'edu', 'Educational', 'gov', 'Government', 'int', 'International', 'mil', 'US Military', 'net', 'Network', 'org', 'Non-Profit Organization', 'arpa', 'Old style Arpanet', 'nato', 'Nato field', ); 1; # This must be the last line cgi-bin/stats/wwwstat-2.0/wwwstat.tmp0002640000372000001540000021202307005603741017450 0ustar affweblibuuid#!/opt/perl/bin/perl # ========================================================================== $Version = 'wwwstat-2.0'; # # Copyright (c) 1994, 1996 Regents of the University of California. # # This software has been developed by Roy Fielding as # part of the WebSoft project at the University of California, Irvine. # # See the file LICENSE for licensing and redistribution information. # See the file INSTALL for installation information. # See the file Changes for known problems and version information. # See the file README for more information. # See the wwwstat.1 man page for options and usage information. # sub usage { die <<"EndUsage"; usage: $Pname [-F system_config] [-f user_config] [-helLoOuUrRvx] [-a IP_address] [-c code] [-d date] [-t hour] [-n archive_name] [-A IP_address] [-C code] [-D date] [-T hour] [-N archive_name] [-m method] [-M method] [-H heading_title] [-X lastsummary] [-noescape] [-trunc N] [-files] [-nofiles] [-link] [-nolink] [-cgi] [-nocgi] [-dns] [-nodns] [-cache filename] [-daily] [-hourly] [-domain] [-subdomain] [-archive] [-ident] [-all] [-sort (key|byte|req)] [-top N] [-both] [-no (daily|hourly|domain|subdomain|archive|ident|all)] [--] [ logfile | summary | + | - ]... $Version Process a sequence of httpd Common Logfile Format access_log files and/or prior wwwstat output summary files (compressed if extension $Zhandle) and output an HTML summary of all the input. Configuration options: -F Get system configuration defaults from the given file. -f Get user configuration defaults from the given file. -- Last option (all later arguments are treated as filenames). Diagnostic Options: -h Help -- just display this message to STDERR and quit. -v Verbose display to STDERR of each log entry processed. -x Display to STDERR all requests of nonexistant URLs. -e Display to STDERR all invalid log entries. Display Options: -H Use the following string as the heading and title for output. -X Use the following string as the URL for last summary link. -R Display daily stats sorted in reverse. -l Do display full IP address of clients in my domain. -L Don't (i.e. strip the machine name from local addresses). -o Do display full IP address of clients from other domains. -O Don't (i.e. strip the machine name from non-local addresses). -u Do display IP address from unresolved domain names. -U Don't (i.e. group all "unresolved" addresses under that name). -dns Use DNS to lookup unresolved IP addresses (may be slow). -nodns Do not lookup unresolved IP addresses. -cache Use the given dbm file to read/write DNS cache. -trunc Truncate archive URL after Nth hierarchy level. -files Show filename in archive URL. -nofiles Truncate filename (if any) from archive URL. -link Add a hypertext link around each archive URL. -nolink Do not add a hypertext link around each archive URL. -cgi Check HTTP method and output like a CGI script. -nocgi Do not produce CGI output. Section Options,
    =(all|daily|hourly|domain|subdomain|archive|ident): -no
    Exclude the given section from the output. -
    Include the given section and set scope for -sort and -top. -sort (key|byte|req) Sort this section by key, bytes, or requests. -top N Include only the top N entries for this section. -both Do the top N as sorted and then do full by key. Search Options (include in summary only those log entries ...): -a Containing a hostname/IP address matching the given perl regexp. -A Not containing " " " " " " " " -c Containing a server response code matching the given perl regexp. -C Not containing " " " " " " " " -d Containing a date ("Feb 2 1994") matching the given perl regexp. -D Not containing " " " " " " " " -t Containing an hour ("00" -- "23") matching the given perl regexp. -T Not containing " " " " " " " " -n Containing an archive (URL) name matching perl regexp (except +.). -N Not containing " " " " " " " " -m Using an HTTP method name matching the given perl regexp. -M Not using the HTTP method " " " " "" -noescape Do not escape "." and "+" in remaining search options. Filenames (none implies "+"): - Read standard input (STDIN). + Read the default logfile $DefaultLog. ... Anything else is treated as the name of a file to be read, with the first line indicating whether it is a logfile or a summary. EndUsage } # ========================================================================== # The main program is really quite simple ... $Pname = $0; if ($Pname =~ s#^(.*)/##) { push(@INC, $1); } # Modify include path for bin, # current dir, and home dir unshift(@INC, '.', ($ENV{'HOME'} || $ENV{'LOGDIR'})); $StartTime = time; # Get the current date-time stamp $Updated = &wtime($StartTime,''); # Format it as local time $UpdatedGMT = &wtime($StartTime,'GMT'); # and also as GMT time &init_defaults; # Set the default configuration &get_configuration; # Get system and user configuration &get_commandline; # Get command-line options &init_summary; # Initialize the accumulaters &output_cgi if $Do_CGI; # Output CGI headers (if desired) &init_DNS if $LookupDNS; # Initialize the DNS cache if ($Verbose) { print STDERR "$Version: $Updated\n"; } if ($ARGV[0]) # Check for explicit filenames { foreach $filename (@ARGV) { &process_file($filename); } } else # if none, just read the default { &process_file($DefaultLog); } if ($Verbose) { print STDERR "Done processing files, now doing summary\n"; } &output_summary; # Give us the dirty details &close_DNS if $LookupDNS; # Close the DNS cache exit(0); # and we are finished. # ========================================================================== # ========================================================================== # Initialize default configuration options. NOTE that all of these options # can be overridden in either the system or user configuration files and # many can be overridden on the command-line. # sub init_defaults { @ArchiveMap = (); require "domains.pl"; # Get the domain mapping (%DomainMap) # Specify the URL of the previous summary period (for use only as a # hypertext link). Set it = "" if link is unwanted. # The three-letter abbrev for last month is substituted at any "%M". # The four-number year of last month is substituted at any "%Y". # Note that this is the month prior to the earliest one in this summary. $LastSummary = "stats-%Y/%M.wwwstats.html.gz"; # Specify the perl regex pattern for directory index files. This will be # dependent on the server's DirectoryIndex config (usually in srm.conf). # 'index.html?' # matches "index.html" and "index.htm" # 'index(.(html?|cgi))?' # matches "index", "index.html", "index.htm", and "index.cgi" # '(([Oo]verview)|(index)).html?' # matches "Overview.html", "Overview.htm", "index.html", "index.htm", # "overview.html", and "overview.htm" $DirectoryIndex = 'index(.(html?|cgi))?'; # Specify the default location of your access log $DefaultLog = '/usr/local/etc/httpd/logs/access_log'; # Specify the command for displaying compressed files to STDOUT $Zcat = 'gunzip -c'; # specify as null string if none are available $Zhandle = '(gz|Z|z)'; # list file extensions that indicate compressed # If address in log entry is one word (a local host), append what? # Specify an appropriate '.sub.dom.ain' $AppendToLocalhost = 'darientel.net'; # Specify whether (1) or not (0) you want to display the IP address # on reversed subdomain listings as follows: $LocalFullAddress = 0; # Show full address for local hosts? $OthersFullAddress = 0; # Show full address for non-local hosts? $ShowUnresolved = 0; # Show all unresolved addresses? # Specify whether (1) or not (0) you want to insert a hypertext # anchor for each URL in the archive section (-link option). $InsertLink = 0; # Specify whether (1) or not (0) you want to add CGI output headers # before the HTML summary. $Do_CGI = 0; # Specify whether (1) or not (0) you want the Archive URL to be # truncated (this saves output space and runtime memory, but loses info). $TruncateLevel = 0; # Truncate after Nth hierarchy level $TruncateFile = 0; # Truncate any trailing filename # Specify whether (1) or not (0) you want to lookup unresolved # IP addresses via DNS. Note that this could be *very* slow! $LookupDNS = 0; $DNScachefile = 'dnscache'; # DBM files for persistent cache $DNSexpires = 5356800; # Cache for two months (in seconds) # The following lines define the visible header fields for HTML output. # They may be changed/nationalized, but changing some may affect the # parsing algorithm for reading old summary files. Test all changes! $OutputTitle = 'World Wide Web Access Statistics for www' . $AppendToLocalhost; $UpdateHeader = 'Last updated: '; $LastSumHeader = 'Previous Full Summary Period'; $TotalsHeader = 'Totals for Summary Period: '; $ReqRcvHeader = 'Requests Received During Summary Period '; $BtransHeader = 'Bytes Transmitted During Summary Period '; $AvgReqHeader = 'Average Requests Received Daily '; $AvgByteHeader = 'Average Bytes Transmitted Daily '; $TotalsFormat = "%s %14.0f\n"; $StatsHeader = '%Reqs %Byte Bytes Sent Requests '; $StatsRule = '----- ----- ------------ -------- |'; $StatsFormat = '%s %s %12.0f %8d |'; $PrefixTop = 'Top'; $PrefixTotal = 'Total'; $DailyHeader = 'Transfers by Request Date'; $HourlyHeader = 'Transfers by Request Hour'; $DomainHeader = 'Transfers by Client Domain'; $SubdomainHeader = 'Transfers by Reversed Subdomain'; $ArchiveHeader = 'Transfers by URL/Archive Section'; $IdentHeader = 'Transfers by Remote Identity'; # These Old headers are for reading old summary files $OldDailyHeader = 'Daily Transmission Statistics'; $OldHourlyHeader = 'Hourly Transmission Statistics'; $OldDomainHeader = 'Total Transfers by Client Domain'; $OldSubdomainHeader = 'Total Transfers by Reversed Subdomain'; $OldArchiveHeader = 'Total Transfers from each Archive Section'; $OldIdentHeader = 'Total Transfers to each Remote Identifier'; # The following sets the default ordering for the daily stats. # Change this to 1 if you always want gwstat-style output. $ReverseDateSort = 0; # Display daily stats in reverse order. # The following sets the default sort key for each section, # where 0 means sort by the primary key value (day, hour, domain, ...) # 1 means sort by the number of requests # 2 means sort by the number of bytes transferred $SortDaily = 0; $SortHourly = 0; $SortDomain = 0; $SortSubdomain = 0; $SortArchive = 0; $SortIdent = 0; # If the output of a section is sorted, you may also want to restrict # the output to only the N best in that section. $TopDaily = 0; $TopHourly = 0; $TopDomain = 0; $TopSubdomain = 0; $TopArchive = 0; $TopIdent = 0; # On the other hand, you may want to exclude (0) an entire section. # If set = 2, the top N is done first and then followed by normal section. $Do_Daily = 1; # Display the Daily Statistics $Do_Hourly = 1; # Display the Hourly Statistics $Do_Domain = 1; # Display the Domain (Country) Statistics $Do_Subdomain = 1; # Display the Subdomain Statistics $Do_Archive = 1; # Display the Archive Statistics # The following option is only useful if the server is running with # rfc931/ident support (i.e. "IdentityCheck on" appears in httpd.conf) # or for resources which require user authentication. # NOTE: For security reasons, you should not publish to the web any report # that lists the Remote Identities. This option is intended for server # maintenance only. Use the -r or -ident command-line option instead. $Do_Ident = 0; # Set 1 or 2 ONLY if Ident is ALWAYS desired. # The rest of these options are normally only changed on the command-line $Verbose = 0; # Display valid log entries on STDERR? $PrintInvalids = 0; # Display invalid log entries on STDERR? $PrintNonexist = 0; # Display nonexistant file requests on STDERR? $SearchAddress = ''; # Pattern to look for in hostname/IP addresses. $SearchCode = ''; # Pattern to look for in Code. $SearchDate = ''; # Pattern to look for in Date. $SearchTime = ''; # Pattern to look for in Hour. $SearchArchive = ''; # Pattern to look for in Archive names. $SearchMethod = ''; # Pattern to look for in Method. $NotAddress = ''; # Pattern to reject entry if in IP addresses. $NotCode = ''; # Pattern to reject entry if in Code. $NotDate = ''; # Pattern to reject entry if in Date. $NotTime = ''; # Pattern to reject entry if in Hour. $NotArchive = ''; # Pattern to reject entry if in Archive names. $NotMethod = ''; # Pattern to reject entry if in Method. $EscapeSpecials = '[+.]'; # Most users forget about regexp syntax # The default system and user configuration filenames should only # be changed if your filesystem can't handle these names. $SconfigFile = 'wwwstat.rc'; # System file for overriding defaults $UconfigFile = '.wwwstatrc'; # User file for overriding defaults } # ========================================================================== # Get the system configuration and user configuration # sub get_configuration { local($forced) = 0; if (defined($ARGV[0]) && ($ARGV[0] eq '-F')) { shift @ARGV; $SconfigFile = shift @ARGV; $forced = 1; } if ($SconfigFile) { eval 'require $SconfigFile;'; if ($@ && $forced) { die "Unable to read $SconfigFile: $!\n"; } else { $! = 0; undef $@; } } if (defined($ARGV[0]) && ($ARGV[0] eq '-f')) { shift @ARGV; $UconfigFile = shift @ARGV; $forced = 1; } else { $forced = 0; } if ($UconfigFile) { eval 'require $UconfigFile;'; if ($@ && $forced) { die "Unable to read $UconfigFile: $!\n"; } else { $! = 0; undef $@; } } } # ========================================================================== # Get the command-line options. # sub get_commandline { local($_, $first, $rest, $pos); local($scope) = 0; local($letteropts) = 'helLoOuUrRvxis:H:X:f:F:m:M:c:C:t:T:a:A:n:N:d:D:'; local(@args) = split(//, $letteropts); while (defined($_ = $ARGV[0])) { if ($_ eq '--') { shift @ARGV; last; } # Last option indicator if ($_ eq '-') { last; } # STDIN file indicator if (!s/^-//) { last; } # Not an option if (/^no(.*)/) # Exclude some option { # indicated by suffix unless ($_ = $1) { # or next argument shift @ARGV; &badarg('-no requires value') unless ($_ = $ARGV[0]); } if (/^escape$/) { $EscapeSpecials = ''; } elsif (/^link$/) { $InsertLink = 0; } elsif (/^files$/) { $TruncateFile = 1; } elsif (/^dns$/) { $LookupDNS = 0; } elsif (/^cgi$/) { $Do_CGI = 0; } elsif (/^da(y|aily|ate)$/) { $Do_Daily = 0; } elsif (/^hour(ly)?$/) { $Do_Hourly = 0; } elsif (/^dom(ain)?$/) { $Do_Domain = 0; } elsif (/^sub(domain)?$/) { $Do_Subdomain = 0; } elsif (/^arc(hive)?$/) { $Do_Archive = 0; } elsif (/^id(ent)?$/) { $Do_Ident = 0; } elsif (/^all$/) { $Do_Daily = $Do_Hourly = $Do_Domain = $Do_Subdomain = $Do_Archive = $Do_Ident = 0; } else { &badarg('-no',$_); } } elsif (/^all$/) # Scope determines what sections are active { # and how to apply the -top and -sort options $scope = 0; $Do_Daily = $Do_Hourly = $Do_Domain = $Do_Subdomain = $Do_Archive = $Do_Ident = 1; } elsif (/^da(y|aily|ate)$/) { $scope = 1; $Do_Daily = 1; } elsif (/^hour(ly)?$/) { $scope = 2; $Do_Hourly = 1; } elsif (/^dom(ain)?$/) { $scope = 3; $Do_Domain = 1; } elsif (/^sub(domain)?$/) { $scope = 4; $Do_Subdomain = 1; } elsif (/^arc(hive)?$/) { $scope = 5; $Do_Archive = 1; } elsif (/^id(ent)?$/) { $scope = 6; $Do_Ident = 1; } elsif (/^link$/) { $InsertLink = 1; # Add anchors to archive } elsif (/^files$/) # Show filename in URL { $TruncateFile = 0; } elsif (/^trunc(.*)/) # Truncate Archive URL { # after Nth level unless ($_ = $1) { shift @ARGV; &badarg('-trunc requires value') unless ($_ = $ARGV[0]); } &badarg('-trunc', $_) unless (/^\d+$/); $TruncateLevel = $_; } elsif (/^cgi$/) # Output CGI headers { $Do_CGI = 1; } elsif (/^dns$/) # Resolve IP addresses { $LookupDNS = 1; } elsif (/^cache(.*)/) # Change cache filename { unless ($_ = $1) { shift @ARGV; &badarg('-cache requires value') unless ($_ = $ARGV[0]); } $DNScachefile = $_; } elsif (/^top(.*)/) # Limit to top N { unless ($_ = $1) { shift @ARGV; &badarg('-top requires value') unless ($_ = $ARGV[0]); } &badarg('-top', $_) unless (/^\d+$/); if ($scope == 1) { $TopDaily = $_; } elsif ($scope == 2) { $TopHourly = $_; } elsif ($scope == 3) { $TopDomain = $_; } elsif ($scope == 4) { $TopSubdomain = $_; } elsif ($scope == 5) { $TopArchive = $_; } elsif ($scope == 6) { $TopIdent = $_; } else { $TopDaily = $TopHourly = $TopDomain = $TopSubdomain = $TopArchive = $TopIdent = $_; } } elsif (/^sort(.*)/) # Change sort method { unless ($_ = $1) { shift @ARGV; &badarg('-sort requires value') unless ($_ = $ARGV[0]); } if (/^key/) { $sortkey = 0; } # Sort by primary key elsif (/^req/) { $sortkey = 1; } # Sort by requests rcvd elsif (/^byt/) { $sortkey = 2; } # Sort by bytes transmitted else { &badarg('-sort',$_); } if ($scope == 1) { $SortDaily = $sortkey; } elsif ($scope == 2) { $SortHourly = $sortkey; } elsif ($scope == 3) { $SortDomain = $sortkey; } elsif ($scope == 4) { $SortSubdomain = $sortkey; } elsif ($scope == 5) { $SortArchive = $sortkey; } elsif ($scope == 6) { $SortIdent = $sortkey; } else { $SortDaily = $SortHourly = $SortDomain = $SortSubdomain = $SortArchive = $SortIdent = $sortkey; } } elsif (/^both$/) # Do both top N and normal { if ($scope == 1) { $Do_Daily = 2; if (!$TopDaily) { $TopDaily = 10; } if (!$SortDaily) { $SortDaily = 1; } } elsif ($scope == 2) { $Do_Hourly = 2; if (!$TopHourly) { $TopHourly = 10; } if (!$SortHourly) { $SortHourly = 1; } } elsif ($scope == 3) { $Do_Domain = 2; if (!$TopDomain) { $TopDomain = 10; } if (!$SortDomain) { $SortDomain = 1; } } elsif ($scope == 4) { $Do_Subdomain = 2; if (!$TopSubdomain) { $TopSubdomain = 10; } if (!$SortSubdomain) { $SortSubdomain = 1; } } elsif ($scope == 5) { $Do_Archive = 2; if (!$TopArchive) { $TopArchive = 10; } if (!$SortArchive) { $SortArchive = 1; } } elsif ($scope == 6) { $Do_Ident = 2; if (!$TopIdent) { $TopIdent = 10; } if (!$SortIdent) { $SortIdent = 1; } } else { $Do_Daily = $Do_Hourly = $Do_Domain = $Do_Subdomain = $Do_Archive = $Do_Ident = 2; $TopDaily = $TopHourly = $TopDomain = $TopSubdomain = $TopArchive = $TopIdent = 10; $SortDaily = $SortHourly = $SortDomain = $SortSubdomain = $SortArchive = $SortIdent = 1; } } else # End of full-word option arguments { while() # Loop by each character { ($first,$rest) = /^(.)(.*)/; if (($pos = index($letteropts,$first)) < 0) { &badarg("Unknown option:",$first); } if ($args[$pos+1] eq ':') { shift(@ARGV); if ($rest eq '') { &badarg($first,"requires value") unless @ARGV; $rest = $ARGV[0]; } &set_option($first, $rest); last; } else { &set_option($first, 1); $_ = $rest; last unless $_; } } } } continue { shift @ARGV; } } # ========================================================================== # Set the single-letter command-line option given. Gee, this is fun. # sub set_option { local($opt, $value) = @_; if ($opt eq 'h') { &usage; } elsif ($opt eq 'e') { $PrintInvalids = 1; } elsif ($opt eq 'l') { $LocalFullAddress = 1; } elsif ($opt eq 'L') { $LocalFullAddress = 0; } elsif ($opt eq 'o') { $OthersFullAddress = 1; } elsif ($opt eq 'O') { $OthersFullAddress = 0; } elsif ($opt eq 'u') { $ShowUnresolved = 1; } elsif ($opt eq 'U') { $ShowUnresolved = 0; } elsif ($opt eq 'r') { $Do_Ident = 2; } elsif ($opt eq 'R') { $ReverseDateSort = 1; } elsif ($opt eq 'v') { $Verbose = 1; } elsif ($opt eq 'x') { $PrintNonexist = 1; } elsif ($opt eq 'X') { $LastSummary = $value; } elsif ($opt eq 'H') { $OutputTitle = $value; } elsif ($opt eq 'm') { if ($SearchMethod) { $SearchMethod = "($SearchMethod|$value)"; } else { $SearchMethod = $value; } } elsif ($opt eq 'M') { if ($NotMethod) { $NotMethod = "($NotMethod|$value)"; } else { $NotMethod = $value; } } elsif ($opt eq 'c') { if ($SearchCode) { $SearchCode = "($SearchCode|$value)"; } else { $SearchCode = $value; } } elsif ($opt eq 'C') { if ($NotCode) { $NotCode = "($NotCode|$value)"; } else { $NotCode = $value; } } elsif ($opt eq 't') { if ($SearchTime) { $SearchTime = "($SearchTime|$value)"; } else { $SearchTime = $value; } } elsif ($opt eq 'T') { if ($NotTime) { $NotTime = "($NotTime|$value)"; } else { $NotTime = $value; } } elsif ($opt eq 'a') { if ($EscapeSpecials) { $value =~ s/($EscapeSpecials)/\\$1/go; } if ($SearchAddress) { $SearchAddress = "($SearchAddress|$value)"; } else { $SearchAddress = $value; } } elsif ($opt eq 'A') { if ($EscapeSpecials) { $value =~ s/($EscapeSpecials)/\\$1/go; } if ($NotAddress) { $NotAddress = "($NotAddress|$value)"; } else { $NotAddress = $value; } } elsif ($opt eq 'n') { if ($EscapeSpecials) { $value =~ s/($EscapeSpecials)/\\$1/go; } if ($SearchArchive) { $SearchArchive = "($SearchArchive|$value)"; } else { $SearchArchive = $value; } } elsif ($opt eq 'N') { if ($EscapeSpecials) { $value =~ s/($EscapeSpecials)/\\$1/go; } if ($NotArchive) { $NotArchive = "($NotArchive|$value)"; } else { $NotArchive = $value; } } elsif ($opt eq 'd') { if ($value eq 'today') { $value = substr($Updated, 8, 4) . substr($Updated, 5, 3) . substr($Updated, 12, 4); $value =~ s/ 0(\d) / $1 /; } if ($SearchDate) { $SearchDate = "($SearchDate|$value)"; } else { $SearchDate = $value; } } elsif ($opt eq 'D') { if ($value eq 'today') { $value = substr($Updated, 8, 4) . substr($Updated, 5, 3) . substr($Updated, 12, 4); $value =~ s/ 0(\d) / $1 /; } if ($NotDate) { $NotDate = "($NotDate|$value)"; } else { $NotDate = $value; } } elsif ($opt eq 'F') { die "The -F option MUST be first option on command-line\n"; } elsif ($opt eq 'f') { die "The -f option MUST be first option after -F option (if any)\n"; } elsif ($opt eq 'i') { warn "Option -i is no longer needed, ignoring it.\n"; } elsif ($opt eq 's') { warn "Option -s is no longer used, ignoring it.\n"; } else { &badarg("Unknown option:", $opt); } } # ========================================================================== sub badarg { local($dreck) = join(' ', @_); warn "Bad command option: $dreck\n"; &usage; } # ========================================================================== # Initialize summary accumulaters and non-optional configuration. # These settings may be customized, but are unlikely to need changing. # sub init_summary { # Setup the table of response codes and (if not '') the name for archive %RespCodes = ( '100', 'Code 100 Continue', '101', 'Code 101 Switching Protocols', '200', '', # OK response '201', '', # Created response '202', '', # Accepted response '203', '', # Non-Authoritative response '204', '', # No Content response '205', '', # Reset Content response '206', '', # Partial Content response '300', 'Code 300 Multiple Choices', '301', 'Code 301 Moved Permanently', '302', 'Code 302 Moved Temporarily', '303', 'Code 303 See Other', '304', '', # Not Modified response '305', 'Code 305 Use Proxy', '400', 'Code 400 Bad Request', '401', 'Code 401 Unauthorized', '402', 'Code 402 Payment Required', '403', 'Code 403 Forbidden', '404', 'Code 404 Not Found', '405', 'Code 405 Method Not Allowed', '406', 'Code 406 Not Acceptable', '407', 'Code 407 Proxy Authentication Required', '408', 'Code 408 Request Time-out', '409', 'Code 409 Conflict', '410', 'Code 410 Gone', '411', 'Code 411 Length Required', '412', 'Code 412 Precondition Failed', '413', 'Code 413 Request Entity Too Large', '414', 'Code 414 Request-URI Too Large', '415', 'Code 415 Unsupported Media Type', '500', 'Code 500 Internal Server Error', '501', 'Code 501 Not Implemented', '502', 'Code 502 Bad Gateway', '503', 'Code 503 Service Unavailable', '504', 'Code 504 Gateway Time-out', '505', 'Code 505 HTTP Version Not Supported', ); # Estimate the size (in bytes) of typical responses not counted in logfile # For better accuracy, tailor to your particular site's server %RespEstimates = ( '100', 100, # Continue response (never happens) '101', 100, # Switching Protocols response (never happens) '200', 200, # OK response (headers only) '201', 200, # Created response (headers only) '202', 200, # Accepted response (headers only) '203', 200, # Non-Authoritative response (headers only) '204', 200, # No Content response (headers only) '205', 200, # Reset Content response (headers only) '206', 200, # Partial Content response (headers only) '300', 400, # Multiple choices message '301', 400, # Permanent redirect message '302', 400, # Temporary redirect message '303', 400, # See other URL redirect message '304', 100, # Not Modified response to a Conditional GET '305', 400, # Use Proxy redirect message '400', 300, # Bad Request response message '401', 300, # Unauthorized response message '402', 300, # Payment Required response message '403', 300, # Forbidden response message '404', 300, # Not Found message '405', 300, # Method Not Allowed message '406', 300, # Not Acceptable message '407', 300, # Proxy Authentication Required message '408', 300, # Request Time-out message '409', 300, # Conflict message '410', 300, # Gone message '411', 300, # Length Required message '412', 300, # Precondition Failed message '413', 300, # Request Entity Too Large message '414', 300, # Request-URI Too Large message '415', 300, # Unsupported Media Type message '500', 500, # Server Error response message '501', 500, # Not Implemented response message '502', 500, # Bad Gateway message '503', 500, # Service Unavailable message '504', 500, # Gateway Time-out message '505', 500, # HTTP Version Not Supported message ); $TotalRequests = 0; # total requests received %HourRequests = (); # per hour %DayRequests = (); # per day %ArchiveRequests = (); # per file %DomainRequests = (); # per domain %SubdomainRequests = (); # per subdomain %IdentRequests = (); # per ident $TotalBytes = 0; # total bytes sent %HourBytes = (); # per hour %DayBytes = (); # per day %ArchiveBytes = (); # per file %DomainBytes = (); # per domain %SubdomainBytes = (); # per subdomain %IdentBytes = (); # per ident $StartTag = "
    \n";     # Note that these vars are used by both
        $EndTag   = "
    \n"; # input and output of summaries. $TimeZone = ''; $AllMonths = 'JanFebMarAprMayJunJulAugSepOctNovDec'; } # ========================================================================== # process the given filename as FILE, based on the content of its first line. # sub output_cgi { local($method) = $ENV{'REQUEST_METHOD'}; local($crlf) = "\x0D\x0A"; $| = 1; # Unbuffer STDOUT if (!defined($method) || ($method eq 'GET') || ($method eq 'HEAD')) { print 'Content-Type: text/html', $crlf, $crlf; exit(0) if ($method eq 'HEAD'); } else { print 'Status: 405 Method Not Allowed', $crlf; print 'Allow: GET, HEAD', $crlf; print 'Content-Type: text/html', $crlf, $crlf; print '', $crlf; print '405 Method Not Allowed', $crlf; print '', $crlf; print '

    405 Method Not Allowed

    ', $crlf; print 'Only GET and HEAD are allowed for this URL', $crlf; print '', $crlf; exit(0); } } # ========================================================================== # process the given filename as FILE, based on the content of its first line. # sub process_file { local($filename) = @_; if ($Verbose) { print STDERR "Processing file \"$filename\"\n"; } if ($filename eq '+') { $filename = $DefaultLog; } if ($Zhandle && ($filename =~ /\.$Zhandle$/o)) { if (!$Zcat) { warn "No zcat decompression command has been defined\n"; return; } $filename = "$Zcat $filename |"; } if (!open(FILE,$filename)) { warn "Error opening $filename: $!\n"; return; } if ($_ = ) { if (/^/) { &process_summary; } else { &process_log($_); } } close(FILE); } # ========================================================================== # Process the summary FILE by reading in our own output, section by section. # We must assume that the old output file was created with the same options # and that its content is disjunct from all other input files. # NOTE that using search options with inclusion cannot work unless the # included file was also created with those search options. # NOTE that Top N sections are skipped, since they cannot accumulate. # sub process_summary { local($_, $date, $hour, $domain, $subdomain, $pathkey, $ident); # This code depends on the content of the output being similar # to the default distribution. If you change the output content, # you must also check to ensure this code still works. local($heading_tag) = '

    '; local($table_rule) = '-----'; # The first thing to do is read past the HEAD and crossreferences # until we get to the first preformatted section (the totals) do { return unless ($_ = ); } until ($_ eq $StartTag); # Next line should be "Files Transmitted ..." or "Requests Received ..." if (($_ = ) && (/\s(\d+)$/)) { return unless $1; $TotalRequests += $1; } else { warn "Invalid summary file, skipping"; return; } # Next line should be "Bytes Transmitted ..." if (($_ = ) && (/\s(\d+)$/)) { $TotalBytes += $1; } else { warn "Invalid summary file, skipping"; return; } # We don't care about the rest of the totals for (;;) # Loop through each section { do { return unless ($_ = ); } until (/^$heading_tag/o); next if (/>$PrefixTop /o); # Skip any Top N sections if (/$DailyHeader/o || /$OldDailyHeader/o) { do { return unless ($_ = ); } until (/^$table_rule/o); while (($_ = ) && ($_ ne $EndTag)) { if (/\s(\d+)\s+(\d+)\s+\|\s+(\S.*)/) { $date = $3; # the date after "|" $DayRequests{$date} += $2; # 1st number left of "|" $DayBytes{$date} += $1; # 2nd number left of "|" } else { warn "Invalid summary line"; } } } elsif (/$HourlyHeader/o || /$OldHourlyHeader/o) { next unless $Do_Hourly; do { return unless ($_ = ); } until (/^$table_rule/o); while (($_ = ) && ($_ ne $EndTag)) { if (/\s(\d+)\s+(\d+)\s+\|\s+(\S+)/) { $hour = $3; # the hour after "|" $HourRequests{$hour} += $2; # 1st number left of "|" $HourBytes{$hour} += $1; # 2nd number left of "|" } else { warn "Invalid summary line"; } } } elsif (/$DomainHeader/o || /$OldDomainHeader/o) { next unless $Do_Domain; do { return unless ($_ = ); } until (/^$table_rule/o); while (($_ = ) && ($_ ne $EndTag)) { if (/\s(\d+)\s+(\d+)\s+\|\s+(\S+)/) { $domain = $3; # the word after "|" $DomainRequests{$domain} += $2; # 1st number left of "|" $DomainBytes{$domain} += $1; # 2nd number left of "|" } else { warn "Invalid summary line"; } } } elsif (/$SubdomainHeader/o || /$OldSubdomainHeader/o) { next unless $Do_Subdomain; do { return unless ($_ = ); } until (/^$table_rule/o); while (($_ = ) && ($_ ne $EndTag)) { if (/\s(\d+)\s+(\d+)\s+\|\s+(\S.*)/) { $subdomain = $3; $SubdomainRequests{$subdomain} += $2; $SubdomainBytes{$subdomain} += $1; } else { warn "Invalid summary line"; } } } elsif (/$ArchiveHeader/o || /$OldArchiveHeader/o) { next unless $Do_Archive; do { return unless ($_ = ); } until (/^$table_rule/o); while (($_ = ) && ($_ ne $EndTag)) { if (/\s(\d+)\s+(\d+)\s+\|\s+(\S.*)/) { $pathkey = &striplink($3); # the pathkey after "|" $ArchiveRequests{$pathkey} += $2; # 1st number left of "|" $ArchiveBytes{$pathkey} += $1; # 2nd number left of "|" } else { warn "Invalid summary line"; } } } elsif (/$IdentHeader/o || /$OldIdentHeader/o) { next unless $Do_Ident; do { return unless ($_ = ); } until (/^$table_rule/o); while (($_ = ) && ($_ ne $EndTag)) { if (/\s(\d+)\s+(\d+)\s+\|\s+(\S.*)/) { $ident = $3; # the identity after "|" $IdentRequests{$ident} += $2; # 1st number left of "|" $IdentBytes{$ident} += $1; # 2nd number left of "|" } else { warn "Invalid summary line"; } } } else { warn "Invalid summary file, skipping"; return; } } } # ========================================================================== # Strip the potential anchor tags from around an archive entry # sub striplink { local($_) = @_; s#^##; s#$##; return &truncated($_); } # ========================================================================== # If the options call for it, truncate the archive URL down to the # Nth hierarchy level and/or remove filename (if any) # sub truncated { local($_) = @_; local(@levels); return $_ unless m#^/#; if ($TruncateFile) { s#[^/]+$##; } if ($TruncateLevel > 0) { @levels = split(/\//); if ($#levels > $TruncateLevel) { $_ = join('/', @levels[0 .. $TruncateLevel], ''); } } return $_; } # ========================================================================== # Process the access_log FILE by reading each entry, validating and # categorizing the access, and then adding to that category's stats # sub process_log { local($_) = @_; # The first line has already been read. local($host, $rfc931, $authuser, $timestamp, $request, $status, $bytes); local($ident, $hour, $date, $method, $htv, $has_head, $idx); local($fname, $rname, $dvalue, $pathkey, @address, $domain, $subdomain); local($saveline); LINE: while() { s/^\0+//; # This is due to a bug in perl 5.002 s/\0//g; # because this line should be sufficient $saveline = $_; # # First, parse the logfile entry into its seven basic components # ($host, $rfc931, $authuser, $timestamp, $request, $status, $bytes) = /^(\S+) (\S+) (\S+) \[([^\]]*)\] \"([^"]*)\" (\S+) (\S+)/; #" Now, is this garbage or is it memorex? Note that $bytes can be 0 if (!($host && $rfc931 && $authuser && $timestamp && $request && $status)) { if ($PrintInvalids) { print STDERR "$.:$saveline"; } next LINE; } if ($status eq '-') # Test the response code { $status = "200"; } elsif (!defined($RespEstimates{$status})) { if ($PrintInvalids) { print STDERR "$.:$saveline"; } next LINE; } if ($SearchCode) { next LINE unless ($status =~ m#$SearchCode#o); } if ($NotCode) { next LINE unless ($status !~ m#$NotCode#o );} if ($bytes eq '-') { $bytes = '0'; } elsif ($bytes !~ /^\d+$/ ) # Test the bytes transferred { if ($PrintInvalids) { print STDERR "$.:$saveline"; } next LINE; } if ($rfc931 ne '-') # Test the remote ident { $ident = $rfc931; # Save ident for later use $ident =~ s/\[[^\]]*\]/COOKIE/g; # Replace all magic cookies } elsif ($authuser ne '-') { $ident = $authuser; # Jury rig support for authuser $ident =~ s/\[[^\]]*\]/COOKIE/g; # Replace all magic cookies } else { $ident = "unknown"; } # # Looks okay so far -- Now figure out when the request was made. # $timestamp =~ s/^0/ /; # Remove leading zero from day if ($timestamp =~ m#^([ 1-3]?\d)/([A-Za-z]+)/(\d{4}):(\d\d):\d\d:\d\d ([+ -]\d{1,4})#) { $date = "$2 $1 $3"; $hour = "$4"; $TimeZone = "$5"; } else { if ($PrintInvalids) { print STDERR "$.:$saveline"; } next LINE; } if ($SearchDate) { next LINE unless ($date =~ m#$SearchDate#o); } if ($NotDate) { next LINE unless ($date !~ m#$NotDate#o); } if ($SearchTime) { next LINE unless ($hour =~ m#$SearchTime#o); } if ($NotTime) { next LINE unless ($hour !~ m#$NotTime#o); } # # Then parse the method and URL pathname from request # ($method, $fname, $htv) = split(' ',$request,3); if ($SearchMethod) { next LINE unless ($method =~ m#$SearchMethod#o); } if ($NotMethod) { next LINE unless ($method !~ m#$NotMethod#o); } $has_head = 0; # Check for HTTP/version tag if ($htv) { if ($htv !~ m#^HTTP/#i) { if ($PrintInvalids) { print STDERR "$.:$saveline"; } } else { $has_head = 1; } } # # Now we update the actual bytes transferred to include header/errors # if ($has_head || ($status ne '200')) { $bytes += $RespEstimates{$status}; } # # And then determine what the archive name should be # if ($rname = $RespCodes{$status}) # If not a successful status code { if ($PrintNonexist && ($status >= 400)) { print STDERR "$status $date $hour $fname BY $host\n"; } $fname = $rname unless ($SearchCode || $NotCode); } elsif (!$fname || ($fname =~ m#^HTTP/#i)) { $fname = '/'; } else { $fname =~ s/\#.*$//; # Remove any trailing anchor $fname =~ s/\?.*$//; # Remove any trailing query $fname =~ s/%7E/~/i; # Fix munging of URLs $fname =~ s/%3A/:/ig; $fname =~ s#/[^/]+/\.\./#/#; # Fix usage of relative paths $fname =~ s#/\./#/#; # and another one $fname =~ y#/#/#s; # Remove any extra slashes $fname =~ s#/$DirectoryIndex$#/#o; # Remove trailing index name } if ($SearchArchive) { next LINE unless ($fname =~ m#$SearchArchive#o); } if ($NotArchive) { next LINE unless ($fname !~ m#$NotArchive#o); } if ($Verbose) { print STDERR "$date $hour $bytes $fname\n"; } unless ($rname || $SearchArchive || $SearchCode || $NotCode) { for ($idx = 0; $idx < $#ArchiveMap; $idx += 3) { if ($ArchiveMap[$idx] eq 'i') { if ($fname =~ m/${ArchiveMap[$idx+1]}/i) { $fname = $ArchiveMap[$idx+2]; last; } } elsif ($fname =~ m/${ArchiveMap[$idx+1]}/) { $fname = $ArchiveMap[$idx+2]; last; } } next LINE unless $fname; # No value indicates URI exclusion } $pathkey = &truncated($fname); # Truncate parts if that is desired # # Get hostname/IP address and determine domain and reversed subdomain. # undef $domain; undef $subdomain; $host =~ tr/A-Z/a-z/; $host =~ s/\.$//; if ($host =~ /^[^.]+$/) # Unqualified hostname { if ($AppendToLocalhost) { $host .= $AppendToLocalhost; } else { if ($PrintInvalids) { print STDERR "$.:$saveline"; } $domain = 'localhost'; $subdomain = $host; } } elsif ($host =~ /^\d+\.\d+\.\d+\.\d+$/) # IP number { if ($LookupDNS && ($dvalue = &resolve($host))) { $host = $dvalue; if ($AppendToLocalhost && ($host =~ /^[^.]+$/)) { $host .= $AppendToLocalhost; } } else { $domain = 'unresolved'; $subdomain = $ShowUnresolved ? $host : 'Unresolved'; } } $host =~ s/\.[\d.]*in-addr\.arpa$//; # Remove any DNS garbage $ident .= '@' . $host; if ($SearchAddress) { next LINE unless ($host =~ m#$SearchAddress#o); } if ($NotAddress) { next LINE unless ($host !~ m#$NotAddress#o); } # # If we haven't already set the subdomain and we don't want the # full subdomain address and this one has a machine name, strip # the machine name and store it reversed (for later sorting/display). # if ($Do_Subdomain && !defined($subdomain)) { @address = split(/\./, $host); # Split into component names if ($host =~ /$AppendToLocalhost$/o) { if (!$LocalFullAddress && ($#address > 1)) { shift(@address); # clip off the machine name } } else { if (!$OthersFullAddress && ($#address > 1)) { shift(@address); # clip off the machine name } } $subdomain = join('.', reverse(@address)); } # # If we haven't already set the domain, find it in %DomainMap # by looking for the longest match. If none, just use last component. # Note that this destroys the value of $host. # if (!defined($domain)) { for (;;) { if (defined($dvalue = $DomainMap{$host})) { next LINE if ($dvalue eq ''); # Indicates domain exclusion last; } last unless ($host =~ s/^[^.]*\.//); } $domain = $host; } # # Now that we have categorized it, add it to the corresponding counters # $TotalRequests++; # Total requests received $TotalBytes += $bytes; # Total bytes sent $DayRequests{$date}++; # Add to Daily Table $DayBytes{$date} += $bytes; if ($Do_Hourly) # Add to Hourly Table? { $HourRequests{$hour}++; $HourBytes{$hour} += $bytes; } if ($Do_Domain) # Add to Domain Table? { $DomainRequests{$domain}++; $DomainBytes{$domain} += $bytes; } if ($Do_Subdomain) # Add to Subdomain Table? { $SubdomainRequests{$subdomain}++; $SubdomainBytes{$subdomain} += $bytes; } if ($Do_Archive) # Add to Archive Table? { $ArchiveRequests{$pathkey}++; $ArchiveBytes{$pathkey} += $bytes; } if ($Do_Ident) # Add to Ident Table? { $IdentRequests{$ident}++; $IdentBytes{$ident} += $bytes; } } continue { last if eof(FILE); $_ = ; } } # ========================================================================== # Initialize the DNS cache and remove entries that have expired. # sub init_DNS { local($ipnum, $value, $host, $seen, @expired); if ($DNScachefile) { dbmopen(%DNScache, $DNScachefile, 0666) || die "Cannot open DBM files $DNScachefile: $!\n"; while (($ipnum, $value) = each %DNScache) { ($host, $seen) = split(/\|/, $value); if ($StartTime > ($seen + $DNSexpires)) { push(@expired, $ipnum); } } foreach $ipnum (@expired) { delete $DNScache{$ipnum}; } } else { %DNScache = (); } } # ========================================================================== # Close the DNS cache # sub close_DNS { if ($DNScachefile) { dbmclose(%DNScache); } } # ========================================================================== # Resolve an IP address to its DNS hostname (if it has one) with caching. # sub resolve { local($ip) = @_; local($ipnum, $value, $host, $seen, $aliases, $addrtype, $length, @addrs); $ipnum = pack('C4', split(/\./, $ip)); if (defined($value = $DNScache{$ipnum})) { ($host, $seen) = split(/\|/, $value); return $host; } ($host, $aliases, $addrtype, $length, @addrs) = gethostbyaddr($ipnum, 2); if (!defined($host)) { $host = ''; } # Many hosts have no DNS names $DNScache{$ipnum} = join('|', $host, time); return $host; } # ========================================================================== # Output the summary in HTML # sub output_summary { local($prefix, $earliest, $latest, $section, $value, @dupes); # # We first need to combine slashless directory names with slashful ones # @dupes = (); while (($section, $value) = each %ArchiveRequests) { if (($section !~ m#/$#) && defined($ArchiveRequests{"$section/"})) { push(@dupes, $section); } } foreach $section (@dupes) { $ArchiveRequests{"$section/"} += $ArchiveRequests{$section}; delete $ArchiveRequests{$section}; $ArchiveBytes{"$section/"} += $ArchiveBytes{$section}; delete $ArchiveBytes{$section}; } undef @dupes; # # And create a sorted date array for later output # @SortedDates = sort datecompare keys %DayRequests; if ($#SortedDates < 0) # Handle case of no data to summarize { $SortedDates[0] = '[none]'; $LastSummary = ''; } if ($ReverseDateSort) { $earliest = $SortedDates[$#SortedDates]; $latest = $SortedDates[0]; } else { $earliest = $SortedDates[0]; $latest = $SortedDates[$#SortedDates]; } # # Finally, we can print out the resulting statistics by section. # # Note: if you have a heavily used server, you may need to increase # the length of the numeric output fields in the forms below. print "\n"; print "$OutputTitle\n"; print "\n"; print "

    $OutputTitle

    \n"; if ($TimeZone) { $Updated .= "(GMT $TimeZone)"; } else { $Updated .= "($UpdatedGMT)"; } print "", $UpdateHeader, $Updated, "\n"; print "
      \n"; &output_xref($Do_Daily, $TopDaily, 'Daily', $DailyHeader); &output_xref($Do_Hourly, $TopHourly, 'Hourly', $HourlyHeader); &output_xref($Do_Domain, $TopDomain, 'Domain', $DomainHeader); &output_xref($Do_Subdomain, $TopSubdomain, 'Subdomain', $SubdomainHeader); &output_xref($Do_Archive, $TopArchive, 'Archive', $ArchiveHeader); &output_xref($Do_Ident, $TopIdent, 'Ident', $IdentHeader); if ($LastSummary) { local($prevmonth, $prevyear) = &lastmonth($earliest); $LastSummary =~ s/%M/$prevmonth/g; $LastSummary =~ s/%Y/$prevyear/g; print "
    • $LastSumHeader\n"; } print "
    \n"; print "

    ", $TotalsHeader, $earliest," to ", $latest, "

    \n"; print $StartTag; printf $TotalsFormat, $ReqRcvHeader, $TotalRequests; printf $TotalsFormat, $BtransHeader, $TotalBytes; printf $TotalsFormat, $AvgReqHeader, ($TotalRequests/($#SortedDates + 1)); printf $TotalsFormat, $AvgByteHeader, ($TotalBytes/($#SortedDates + 1)); print $EndTag; if ($Do_Daily) { &output_daily('Daily'); if ($Do_Daily == 2) { $TopDaily = 0; $SortDaily = 0; &output_daily('AllDaily'); } } if ($Do_Hourly) { &output_hourly('Hourly'); if ($Do_Hourly == 2) { $TopHourly = 0; $SortHourly = 0; &output_hourly('AllHourly'); } } if ($Do_Domain) { &output_domain('Domain'); if ($Do_Domain == 2) { $TopDomain = 0; $SortDomain = 0; &output_domain('AllDomain'); } } if ($Do_Subdomain) { &output_subdomain('Subdomain'); if ($Do_Subdomain == 2) { $TopSubdomain = 0; $SortSubdomain = 0; &output_subdomain('AllSubdomain'); } } if ($Do_Archive) { &output_archive('Archive'); if ($Do_Archive == 2) { $TopArchive = 0; $SortArchive = 0; &output_archive('AllArchive'); } } if ($Do_Ident) { &output_ident('Ident'); if ($Do_Ident == 2) { $TopIdent = 0; $SortIdent = 0; &output_ident('AllIdent'); } } print "
    \n"; print "
    This summary was generated by \n"; print ""; print "$Version\n"; print "
    \n"; print "\n"; } # ========================================================================== # Output the stats for each calendar day represented in the input file(s) # sub output_xref { local($do_section, $topn, $frag, $header) = @_; if ($do_section) { local($prefix) = $topn ? "$PrefixTop $topn" : $PrefixTotal; print "
  • $prefix $header\n"; if ($do_section == 2) { print "
  • $PrefixTotal $header\n"; } } } # ========================================================================== # Output the stats for each calendar day represented in the input file(s) # sub output_daily { local($frag) = @_; local($rqsts, $bytes, $pctrqsts, $pctbytes); local($top) = $TopDaily; local($prefix) = $top ? "$PrefixTop $top" : $PrefixTotal; print "
    \n"; print "

    $prefix $DailyHeader

    \n"; print $StartTag; print $StatsHeader, " Date\n"; print $StatsRule, "------------\n"; local($fmt) = "$StatsFormat %s\n"; foreach $date (@SortedDates) { $rqsts = $DayRequests{$date} || 0; $bytes = $DayBytes{$date} || 0; if ($rqsts == $TotalRequests) { $pctrqsts = "100.0"; } else { $pctrqsts = sprintf("%5.2f", 100*$rqsts/$TotalRequests); } if ($bytes == $TotalBytes) { $pctbytes = "100.0"; } else { $pctbytes = sprintf("%5.2f", 100*$bytes/$TotalBytes); } printf $fmt, $pctrqsts, $pctbytes, $bytes, $rqsts, $date; last if ($top && (--$top == 0)); } print $EndTag; } # ========================================================================== # Output the stats for each hour of the day, accumulating over all days. # sub output_hourly { local($frag) = @_; local($rqsts, $bytes, $pctrqsts, $pctbytes); local($top) = $TopHourly; local($prefix) = $top ? "$PrefixTop $top" : $PrefixTotal; print "
    \n"; print "

    $prefix $HourlyHeader

    \n"; print $StartTag; print $StatsHeader, " Time\n"; print $StatsRule, "-----\n"; local($fmt) = "$StatsFormat %s\n"; foreach $hour (sort hourcompare keys %HourRequests) { $rqsts = $HourRequests{$hour}; $bytes = $HourBytes{$hour}; if ($rqsts == $TotalRequests) { $pctrqsts = "100.0"; } else { $pctrqsts = sprintf("%5.2f", 100*$rqsts/$TotalRequests); } if ($bytes == $TotalBytes) { $pctbytes = "100.0"; } else { $pctbytes = sprintf("%5.2f", 100*$bytes/$TotalBytes); } printf $fmt, $pctrqsts, $pctbytes, $bytes, $rqsts, $hour; last if ($top && (--$top == 0)); } print $EndTag; } # ========================================================================== # Output the stats for each requesting client's domain/country/organization # sub output_domain { local($frag) = @_; local($rqsts, $bytes, $pctrqsts, $pctbytes); local($top) = $TopDomain; local($prefix) = $top ? "$PrefixTop $top" : $PrefixTotal; print "
    \n"; print "

    $prefix $DomainHeader

    \n"; print $StartTag; print $StatsHeader, " Domain\n"; print $StatsRule, "------------------------------------\n"; local($fmt) = "$StatsFormat %-5s %s\n"; foreach $domain (sort domaincompare keys %DomainRequests) { $country = $DomainMap{$domain} || ''; $rqsts = $DomainRequests{$domain}; $bytes = $DomainBytes{$domain}; if ($rqsts == $TotalRequests) { $pctrqsts = "100.0"; } else { $pctrqsts = sprintf("%5.2f", 100*$rqsts/$TotalRequests); } if ($bytes == $TotalBytes) { $pctbytes = "100.0"; } else { $pctbytes = sprintf("%5.2f", 100*$bytes/$TotalBytes); } printf $fmt, $pctrqsts, $pctbytes, $bytes, $rqsts, $domain, $country; last if ($top && (--$top == 0)); } print $EndTag; } # ========================================================================== # Output the stats for each requesting client's DNS subdomain # sub output_subdomain { local($frag) = @_; local($rqsts, $bytes, $pctrqsts, $pctbytes); local($top) = $TopSubdomain; local($prefix) = $top ? "$PrefixTop $top" : $PrefixTotal; print "
    \n"; print "

    $prefix $SubdomainHeader

    \n"; print $StartTag; print $StatsHeader, " Reversed Subdomain\n"; print $StatsRule, "------------------------------------\n"; local($fmt) = "$StatsFormat %s\n"; foreach $subdomain (sort subdomcompare keys %SubdomainRequests) { $rqsts = $SubdomainRequests{$subdomain}; $bytes = $SubdomainBytes{$subdomain}; if ($rqsts == $TotalRequests) { $pctrqsts = "100.0"; } else { $pctrqsts = sprintf("%5.2f", 100*$rqsts/$TotalRequests); } if ($bytes == $TotalBytes) { $pctbytes = "100.0"; } else { $pctbytes = sprintf("%5.2f", 100*$bytes/$TotalBytes); } printf $fmt, $pctrqsts, $pctbytes, $bytes, $rqsts, $subdomain; last if ($top && (--$top == 0)); } print $EndTag; } # ========================================================================== # Output the stats for each archive (URL path or category) # sub output_archive { local($frag) = @_; local($rqsts, $bytes, $pctrqsts, $pctbytes, $asec); local($top) = $TopArchive; local($prefix) = $top ? "$PrefixTop $top" : $PrefixTotal; print "
    \n"; print "

    $prefix $ArchiveHeader

    \n"; print $StartTag; print $StatsHeader, " Archive Section\n"; print $StatsRule, "------------------------------------\n"; local($fmt) = "$StatsFormat %s\n"; foreach $section (sort archivecompare keys %ArchiveRequests) { $rqsts = $ArchiveRequests{$section}; $bytes = $ArchiveBytes{$section}; next unless $rqsts; if ($rqsts == $TotalRequests) { $pctrqsts = "100.0"; } else { $pctrqsts = sprintf("%5.2f", 100*$rqsts/$TotalRequests); } if ($bytes == $TotalBytes) { $pctbytes = "100.0"; } else { $pctbytes = sprintf("%5.2f", 100*$bytes/$TotalBytes); } $asec = $section; $asec =~ s/\&/\&/g; # Replace HTML specials $asec =~ s//\>/g; if ($InsertLink && ($asec =~ m:^/:)) { $asec = "$asec"; } printf $fmt, $pctrqsts, $pctbytes, $bytes, $rqsts, $asec; last if ($top && (--$top == 0)); } print $EndTag; } # ========================================================================== # Output the stats for each calendar day represented in the input file(s) # sub output_ident { local($frag) = @_; local($rqsts, $bytes, $pctrqsts, $pctbytes); local($top) = $TopIdent; local($prefix) = $top ? "$PrefixTop $top" : $PrefixTotal; print "
    \n"; print "

    $prefix $IdentHeader

    \n"; print $StartTag; print $StatsHeader, " Remote Identity\n"; print $StatsRule, "------------------------------------\n"; local($fmt) = "$StatsFormat %s\n"; foreach $ident (sort identcompare keys %IdentRequests) { $rqsts = $IdentRequests{$ident}; $bytes = $IdentBytes{$ident}; if ($rqsts == $TotalRequests) { $pctrqsts = "100.0"; } else { $pctrqsts = sprintf("%5.2f", 100*$rqsts/$TotalRequests); } if ($bytes == $TotalBytes) { $pctbytes = "100.0"; } else { $pctbytes = sprintf("%5.2f", 100*$bytes/$TotalBytes); } printf $fmt, $pctrqsts, $pctbytes, $bytes, $rqsts, $ident; last if ($top && (--$top == 0)); } print $EndTag; } # ========================================================================== # ========================================================================== # The following sort comparison functions take $a and $b as the two # arguments keys or values to compare. Speed is important here. sub datecompare { local($date1) = substr($a, 7, 4) * 512; # Years local($date2) = substr($b, 7, 4) * 512; $date1 += index($AllMonths, substr($a,0,3)) * 12; # Months $date2 += index($AllMonths, substr($b,0,3)) * 12; $date1 += substr($a, 4, 2); # Days $date2 += substr($b, 4, 2); if ($SortDaily == 0) { return ($ReverseDateSort ? $date2 <=> $date1 : $date1 <=> $date2); } if ($SortDaily == 1) { $sdiff = $DayRequests{$b} - $DayRequests{$a}; } else { $sdiff = $DayBytes{$b} - $DayBytes{$a}; } ($sdiff < 0) ? -1 : ($sdiff > 0) ? 1 : ($date1 <=> $date2); } sub hourcompare { if ($SortHourly == 0) { return ($a <=> $b); } if ($SortHourly == 1) { $sdiff = $HourRequests{$b} - $HourRequests{$a}; } else { $sdiff = $HourBytes{$b} - $HourBytes{$a}; } ($sdiff < 0) ? -1 : ($sdiff > 0) ? 1 : ($a <=> $b); } sub domaincompare { if ($SortDomain == 0) { $sdiff = length($a) - length($b); } elsif ($SortDomain == 1) { $sdiff = $DomainRequests{$b} - $DomainRequests{$a}; } else { $sdiff = $DomainBytes{$b} - $DomainBytes{$a}; } ($sdiff < 0) ? -1 : ($sdiff > 0) ? 1 : ($a cmp $b); } sub subdomcompare { if ($SortSubdomain == 0) { return ($a cmp $b); } if ($SortSubdomain == 1) { $sdiff = $SubdomainRequests{$b} - $SubdomainRequests{$a}; } else { $sdiff = $SubdomainBytes{$b} - $SubdomainBytes{$a}; } ($sdiff < 0) ? -1 : ($sdiff > 0) ? 1 : ($a cmp $b); } sub archivecompare { if ($SortArchive == 0) { return ($a cmp $b); } if ($SortArchive == 1) { $sdiff = $ArchiveRequests{$b} - $ArchiveRequests{$a}; } else { $sdiff = $ArchiveBytes{$b} - $ArchiveBytes{$a}; } ($sdiff < 0) ? -1 : ($sdiff > 0) ? 1 : ($a cmp $b); } sub identcompare { if ($SortIdent == 0) { return ($a cmp $b); } if ($SortIdent == 1) { $sdiff = $IdentRequests{$b} - $IdentRequests{$a}; } else { $sdiff = $IdentBytes{$b} - $IdentBytes{$a}; } ($sdiff < 0) ? -1 : ($sdiff > 0) ? 1 : ($a cmp $b); } # =========================================================================== # This is a modified (by Roy Fielding) version of Perl 4.036's ctime.pl # library by Waldemar Kebsch and # Marion Hakanson . It is distributed under the # Artistic License (included with your Perl distribution files). # # # wtime returns a time string in the format "Wkd, Dy Mon Year HH:MM:SS Zone" # with no newline appended. # # USAGE: # # wtime(time,''); -- returns the local time with no timezone appended # As in "Wed, 15 Dec 1993 23:59:59 " # # wtime(time,'GMT'); -- returns GMT time # As in "Wed, 16 Dec 1993 07:59:59 GMT" # sub wtime { local($time, $TZ) = @_; local($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst); local(@DoW) = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); local(@MoY) = ('Jan','Feb','Mar','Apr','May','Jun', 'Jul','Aug','Sep','Oct','Nov','Dec'); # Determine what time zone is in effect. Use local time if # TZ is anything other than 'GMT' # There's no portable way to find the system default timezone. ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = ($TZ eq 'GMT') ? gmtime($time) : localtime($time); $year += ($year < 70) ? 2000 : 1900; sprintf("%s, %02d %s %4d %02d:%02d:%02d %s", $DoW[$wday], $mday, $MoY[$mon], $year, $hour, $min, $sec, $TZ); } # =========================================================================== # This last routine returns the three letter abbreviation for the month # before the one in the date that was passed as an argument, and its year. # sub lastmonth { local($date) = @_; # Must be in the format "Feb 01 1994" local($midx) = index($AllMonths, substr($date,0,3)); local($year) = substr($date,7,4); if ($midx < 0) { return ('Err', ''); } elsif ($midx == 0) { return ('Dec', ($year - 1)); } else { return (substr($AllMonths,($midx - 3),3), $year); } } cgi-bin/stats/wwwstat-2.0/INSTALL0000640000372000001540000001176707005603740016250 0ustar affweblibuuidCopyright (c) 1994, 1996 Regents of the University of California. See the file LICENSE for Licensing and Redistribution Information. See the file README for more information. ========================================================================== The latest version of wwwstat can be obtained from http://www.ics.uci.edu/pub/websoft/wwwstat/ ftp://www.ics.uci.edu/pub/websoft/wwwstat/ ========================================================================== Installation instructions: 0. You need Perl (4.036 or 5.002, or better) to run wwwstat. If you don't have it already, see for information on how to download and install perl. 1. Get the wwwstat package from the distribution site (above). Normally, it will be in the form of a gzip'd unix tar file. If it has not already been decompressed by your WWW client, than do: % gunzip wwwstat-2.0.tar.gz depending on which version (the 2.0) you downloaded. gunzip is part of the gzip compression/decompression package, which can be obtained from any Gnu software archive. 2. Move the resulting wwwstat-2.0.tar file to the directory above where you want to install wwwstat, cd to that directory, and do % tar xvf wwwstat-2.0.tar to create the directory ./wwwstat-2.0 containing the following: Changes -- the list of known problems and version information FAQ -- frequently asked questions INSTALL -- this file LICENSE -- Licensing and Redistribution information Makefile -- the makefile (for creating executables) README -- general intro and pointers to more information domains.pl -- a mapping of Internet domains to country/org names example.html -- an example of what wwwstat output should look like monthly.pl -- an example perl script for monthly log rotation oldlog2new.pl -- A tool for converting old NCSA logs to CLF format splitlog.1 -- the splitlog manual page splitlog.html -- the splitlog.1 manual converted to HTML format splitlog.ps -- the splitlog.1 manual converted to postscript splitlog.pl -- the main perl script for splitting the access_log splitlog.rc -- an example user configuration file for splitlog wwwerrs.pl -- an example perl script for reading the error_log wwwstat.1 -- the wwwstat manual page wwwstat.html -- the wwwstat.1 manual converted to HTML format wwwstat.ps -- the wwwstat.1 manual converted to postscript wwwstat.pl -- the main perl script for analyzing the access_log wwwstat.rc -- an example user/system configuration file 3. Edit the Makefile according to the instructions contained therein. Most likely, you only need to change the value of PERLBIN. 4. Run "make" in that directory. If your system does not have make, then you will have to manually edit the first line of each script, as in cp wwwstat.pl wwwstat chmod 755 wwwstat vi wwwstat and substitute #!YOUR_PERL_BINARY with #!/usr/local/bin/perl or whatever is the pathname for your perl executable. 5. Edit the wwwstat.rc file so that it corresponds to the default configuration for your server. The example file includes a complete description of each configurable parameter. If needed, you can also directly edit the wwwstat script to change any of the default settings. You can do the same for splitlog via splitlog.rc. 6. Read the man pages % nroff -man wwwstat.1 | more % nroff -man splitlog.1 | more which includes complete information on all the wwwstat and splitlog options and usage. The manuals are also available in HTML and postscript. 7. That's it. You should now be able to run wwwstat, e.g. % wwwstat > results.html 8. Optionally, you may want to install the script and its library files in generally accessible locations, as in % cp -p wwwstat /usr/local/bin/ % cp -p wwwstat.rc /usr/local/lib/perl/ % cp -p domains.pl /usr/local/lib/perl/ % cp -p wwwstat.1 /usr/local/man/man1/ I recommend that splitlog only be installed by a webmaster, since it won't be very useful for people with non-shared logfiles. 9. If wwwstat's libraries are not installed in the normal perl library, then you should add their location to the path in the environment variable PERLLIB, as in % setenv PERLLIB $PERLLIB:/usr/wherever/wwwstat-2.0 If you have some old (prior to NCSA httpd_1.2) logfiles that you want converted to the common logfile format, you will also need to customize the oldlog2new script. Usage information can be obtained via the -h option. The monthly.pl and wwwerrs.pl scripts are provided as examples, which may be very useful to some webmasters. However, they also require an understanding of perl (i.e., they are completely undocumented aside from the program comments). They are not part of the wwwstat program. cgi-bin/stats/wwwstat-2.0/Makefile0000640000372000001540000000150407005603740016643 0ustar affweblibuuid# This Makefile is used to configure the perl scripts so that # they all use the correct pathname for the perl interpreter. # It also makes the programs executable and creates links from "GET" # to the other commonly-used methods. Use the following command: # # % make all # # You need to change the following line to the full pathname # of your perl interpreter PERLBIN = /opt/perl/bin/perl # and here are a some commands that may be system-dependent COPY = cp -p # The rest should be automatic CLIENTS = wwwstat wwwerrs monthly splitlog oldlog2new LIBS = domains.pl wwwstat.rc splitlog.rc .SUFFIXES: .SUFFIXES: .pl $(SUFFIXES) all: $(CLIENTS) .pl: cp $*.pl $* $(PERLBIN) -pi -e 's#YOUR_PERL_BINARY#$(PERLBIN)#o;' $* chmod 755 $* # # A "make clean" removes what "make all" produced # clean: $(RM) $(CLIENTS) cgi-bin/stats/wwwstat-2.0/example.html0000640000372000001540000006365507005603740017543 0ustar affweblibuuid World Wide Web Access Statistics for www.no_where.com

    World Wide Web Access Statistics for www.no_where.com

    Last updated: Mon, 07 Oct 1996 10:50:17 (GMT -0800)

    Totals for Summary Period: Apr 20 1994 to Apr 22 1994

    Requests Received During Summary Period            2082
    Bytes Transmitted During Summary Period        23243392
    Average Requests Received Daily                     694
    Average Bytes Transmitted Daily                 7747797
    

    Total Transfers by Request Date

    %Reqs %Byte  Bytes Sent  Requests   Date
    ----- ----- ------------ -------- |------------
    35.01 48.99     11387909      729 | Apr 20 1994
    33.43 22.46      5220024      696 | Apr 21 1994
    31.56 28.55      6635459      657 | Apr 22 1994
    

    Total Transfers by Request Hour

    %Reqs %Byte  Bytes Sent  Requests   Time
    ----- ----- ------------ -------- |-----
     4.61 17.33      4029057       96 |  00
     1.20  0.88       204121       25 |  01
     3.60  2.00       465015       75 |  02
     1.54  3.32       772363       32 |  03
     1.87  2.95       686771       39 |  04
     2.69  3.31       768372       56 |  05
     1.68  2.46       572340       35 |  06
     5.38  5.34      1241516      112 |  07
     4.32  3.97       921919       90 |  08
     6.24  5.64      1311868      130 |  09
     9.80  8.66      2012638      204 |  10
     6.00  5.75      1335809      125 |  11
     4.32  3.72       864705       90 |  12
     5.33  5.61      1304162      111 |  13
     8.36  5.97      1387109      174 |  14
    10.90  5.78      1342549      227 |  15
     4.27  2.65       616708       89 |  16
     4.61  5.01      1164098       96 |  17
     1.97  2.03       472441       41 |  18
     4.32  1.97       458924       90 |  19
     2.69  2.74       636717       56 |  20
     1.68  1.17       271010       35 |  21
     1.73  0.96       222024       36 |  22
     0.86  0.78       181156       18 |  23
    

    Total Transfers by Client Domain

    %Reqs %Byte  Bytes Sent  Requests   Domain
    ----- ----- ------------ -------- |------------------------------------
     0.43  0.71       164185        9 | at    Austria
     1.01  0.74       171591       21 | au    Australia
     2.93  0.99       229441       61 | be    Belgium
     0.91  0.87       201592       19 | ca    Canada
     0.24  0.13        31260        5 | ch    Switzerland
     0.48  0.11        26606       10 | cl    Chile
     4.23  5.99      1392375       88 | de    Germany
     0.10  0.06        14808        2 | dk    Denmark
     0.62  0.78       181435       13 | fi    Finland
     1.20  1.70       395794       25 | fr    France
     3.07  2.02       469892       64 | it    Italy
     0.48  0.36        82646       10 | jp    Japan
     0.53  0.95       220641       11 | nl    Netherlands
     0.19  0.56       130828        4 | no    Norway
     0.10  0.04         9546        2 | nz    New Zealand (Aotearoa)
     0.14  0.06        14353        3 | pe    Peru
     1.15  1.05       244869       24 | se    Sweden
     1.63  1.85       429529       34 | uk    United Kingdom
    14.60 16.23      3773157      304 | com   Commercial
    21.52 21.53      5004903      448 | edu   Educational
     2.45  3.27       760723       51 | gov   Government
     0.82  1.00       231829       17 | mil   US Military
     0.05  0.02         4807        1 | net   Network
     0.38  0.91       211937        8 | org   Non-Profit Organization
    33.81 32.38      7526401      704 | uci.edu 
     6.92  5.67      1318244      144 | unresolved 
    

    Total Transfers by Reversed Subdomain

    %Reqs %Byte  Bytes Sent  Requests   Reversed Subdomain
    ----- ----- ------------ -------- |------------------------------------
     6.92  5.67      1318244      144 | Unresolved
     0.14  0.31        72914        3 | at.ac.tuwien.edvz
     0.29  0.39        91271        6 | at.co.kapsch
     0.14  0.00          825        3 | au.csiro.dit.csis
     0.14  0.05        11909        3 | au.edu.curtin.cs
     0.05  0.00          277        1 | au.edu.monash.cc
     0.05  0.02         4267        1 | au.gov.erin
     0.14  0.09        20117        3 | au.oz.lat
     0.14  0.05        11267        3 | au.oz.su.cs.gh
     0.34  0.53       122929        7 | au.oz.su.maths
     2.93  0.99       229441       61 | be.ac.vub
     0.14  0.04         9823        3 | ca.carleton.sce
     0.14  0.06        14353        3 | ca.qc.hydro.smtl
     0.05  0.06        13762        1 | ca.sfu.cs
     0.10  0.20        45709        2 | ca.ualberta.cs
     0.05  0.05        11709        1 | ca.uottawa.csi
     0.05  0.16        37429        1 | ca.utoronto.utcs
     0.19  0.17        38697        4 | ca.uvic
     0.19  0.13        30110        4 | ca.uwaterloo
     0.05  0.06        13762        1 | ch.cern
     0.05  0.04        10303        1 | ch.epfl
     0.05  0.00         1046        1 | ch.unibe
     0.10  0.03         6149        2 | ch.unige
     0.48  0.11        26606       10 | cl.uchile
     0.05  0.16        37249        1 | com.ab.hh.cs
     0.10  0.02         5133        2 | com.allied.atsc
     0.10  0.26        60219        2 | com.alta
     0.10  0.06        14808        2 | com.amcc
     0.29  0.62       143876        6 | com.att
     0.29  0.23        52691        6 | com.att.research
     0.10  0.04         9546        2 | com.bah.src
     0.29  0.27        61818        6 | com.bellcore.base
     0.14  0.20        46975        3 | com.boeing
     0.10  0.06        14808        2 | com.cftnet.ppp253
     0.10  0.04         9546        2 | com.comsat.sdd
     0.24  0.73       169727        5 | com.cray
     0.10  0.04         9546        2 | com.cursci
     0.19  0.42        97199        4 | com.dec.pa
     0.19  0.09        20435        4 | com.delmarva
     0.10  0.06        14808        2 | com.dg.webo
     0.38  0.37        85328        8 | com.digifix
     1.34  0.81       187622       28 | com.digital.research.crl
     0.38  0.63       146836        8 | com.eds.ug
     0.34  0.50       115594        7 | com.eit
     0.14  0.37        86061        3 | com.eo
     0.10  0.06        14808        2 | com.ge
     0.05  0.05        11709        1 | com.gte
     0.67  0.28        65072       14 | com.hac
     0.10  0.06        14808        2 | com.hal
     0.72  0.31        72189       15 | com.halcyon
     0.53  1.59       368942       11 | com.hp
     0.10  0.09        20606        2 | com.hp.corp
     0.43  0.42        98720        9 | com.hp.itc.sv
     0.10  0.06        14808        2 | com.ibm.austin
     0.10  0.04         9546        2 | com.isx.east
     0.10  0.06        14808        2 | com.jpmorgan
     0.10  0.19        44772        2 | com.link.hso
     0.05  0.02         4291        1 | com.mmc.den
     0.14  0.39        91323        3 | com.nec.dl.syl
     0.05  0.04        10303        1 | com.netcom
     0.19  0.18        42332        4 | com.netweek
     0.10  0.03         6149        2 | com.phs
     0.19  0.45       105085        4 | com.rockwell.cca
     0.29  0.32        73803        6 | com.rockwell.dny.roses
     0.19  0.06        13025        4 | com.rockwell.rsoc
     0.19  0.07        15695        4 | com.saic
     0.58  1.08       250232       12 | com.sco
     0.10  0.10        23418        2 | com.sco.scocan
     0.53  0.20        45473       11 | com.sgi
     0.10  0.06        14808        2 | com.slb.wireline.clamart
     0.48  0.25        58654       10 | com.stsi
     1.44  1.84       427209       30 | com.sun
     0.10  0.04         9546        2 | com.syntex
     0.24  0.26        59529        5 | com.tandem.mpd
     0.05  0.02         5439        1 | com.tandem.posix
     0.24  0.45       105432        5 | com.tasc.read
     0.05  0.04         8701        1 | com.telebit.sunnyvale
     0.77  0.48       112401       16 | com.trw.fp
     0.10  0.06        14808        2 | com.vyne
     0.14  0.20        46755        3 | com.wired
     0.19  0.38        88133        4 | com.xerox
     0.05  0.04        10303        1 | de.dlr.go
     0.05  0.48       112581        1 | de.fh-karlsruhe
     0.14  0.03         6329        3 | de.fh-wolfenbuettel.rz
     0.05  0.04         8701        1 | de.fzi
     0.14  0.20        46755        3 | de.hu-berlin.rz
     0.10  0.18        41333        2 | de.mpg.mpi-sb.ag2
     0.38  0.21        47744        8 | de.rwth-aachen.informatik
     0.29  0.36        83144        6 | de.rwth-aachen.rz
     0.19  1.39       322973        4 | de.tu-muenchen.informatik
     0.10  0.20        45709        2 | de.uni-bonn.informatik
     2.07  0.66       153228       43 | de.uni-dortmund.informatik
     0.10  0.04         9546        2 | de.uni-frankfurt.rz
     0.14  0.20        46755        3 | de.uni-freiburg.informatik
     0.05  0.04        10303        1 | de.uni-karlsruhe.rz
     0.29  0.56       129419        6 | de.uni-paderborn
     0.10  1.37       317552        2 | de.uni-sb.cs
     0.10  0.06        14808        2 | dk.aau.kemi
     0.58  0.44       102722       12 | edu.berkeley
     0.05  0.02         5439        1 | edu.bgsu
     0.05  0.02         4291        1 | edu.brown.chem
     0.10  0.06        14808        2 | edu.buffalo.cs
     0.10  0.06        14808        2 | edu.byu.cs
     0.14  0.05        11388        3 | edu.caltech.cco
     0.14  0.39        91323        3 | edu.caltech.galcit
     0.19  0.05        12298        4 | edu.cmu.andrew.bh
     0.10  0.03         6149        2 | edu.cmu.andrew.hl
     0.19  0.05        12298        4 | edu.cmu.andrew.res
     0.14  0.05        11588        3 | edu.cmu.cheme
     0.10  0.03         6149        2 | edu.cmu.cs.ius
     0.14  0.08        19304        3 | edu.cmu.cs.mt
     0.10  0.06        14808        2 | edu.cmu.cs.slip
     0.10  0.03         6149        2 | edu.cmu.heinz
     0.10  0.04        10359        2 | edu.cmu.sei
     0.10  0.03         6149        2 | edu.colorado
     0.19  0.12        28817        4 | edu.colorado.cs
     0.19  0.53       123270        4 | edu.columbia.dorm.wien
     0.24  0.78       181420        5 | edu.cornell.law
     0.19  1.44       334954        4 | edu.csuchico.ecst
     0.10  0.03         6149        2 | edu.ctc
     0.29  0.26        60388        6 | edu.emory.chem
     0.10  0.03         5987        2 | edu.exploratorium
     0.05  0.02         5439        1 | edu.fsu.acns-slp
     0.67  0.87       203062       14 | edu.gatech
     0.34  0.12        28164        7 | edu.gatech.cc
     0.14  0.04        10440        3 | edu.gmu.isse
     0.14  0.05        10977        3 | edu.harvard
     0.19  0.26        61539        4 | edu.harvard.hbs
     0.19  0.06        13512        4 | edu.iastate.cs
     0.14  0.05        11153        3 | edu.iastate.vincent
     0.05  0.04        10303        1 | edu.indiana.cs
     0.10  0.04         9546        2 | edu.indiana.ucs
     0.10  0.03         6149        2 | edu.loyola
     1.87  0.19        43806       39 | edu.miami.rsmas
     0.58  0.18        42341       12 | edu.mills
     0.19  0.45       105085        4 | edu.missouri.phlab
     0.14  0.09        20741        3 | edu.mit
     0.19  0.42        97199        4 | edu.mit.ai
     0.14  0.20        46755        3 | edu.msstate.cc
     0.14  0.22        50742        3 | edu.mtu.lib
     0.05  0.06        13762        1 | edu.ncsu.cfr
     0.10  0.06        14808        2 | edu.ncsu.ece
     0.19  0.16        36898        4 | edu.ncsu.eos
     0.10  0.04         9546        2 | edu.ncsu.stat
     2.59  1.76       408840       54 | edu.neu.ccs
     0.10  0.04         9546        2 | edu.nwu.eecs
     0.29  0.04         9785        6 | edu.pima
     0.05  0.06        13762        1 | edu.pitt.scrc
     0.10  0.04         9546        2 | edu.psu.stat
     0.19  0.59       135986        4 | edu.purdue.cc
     0.10  0.03         6967        2 | edu.purdue.ecn
     0.14  0.05        10956        3 | edu.rpi.its
     0.05  0.16        37429        1 | edu.scarolina.biol
     0.10  0.03         6149        2 | edu.shsu
     0.19  0.44       103032        4 | edu.stanford
     0.34  0.52       119886        7 | edu.tamu
     0.10  0.08        18640        2 | edu.tamu.cs
     0.10  0.03         6149        2 | edu.temple.ocis
     0.34  0.48       111581        7 | edu.ucdavis
     0.43  0.13        30810        9 | edu.ucdavis.cs
     0.10  0.04         9546        2 | edu.uci
     2.55  0.80       186719       53 | edu.uci.acs
     0.05  0.02         4739        1 | edu.uci.ece
     0.19  0.29        67654        4 | edu.uci.eng
     0.10  0.05        10878        2 | edu.uci.hnet
    28.63 29.44      6842468      596 | edu.uci.ics
     0.19  0.10        23601        4 | edu.uci.lib
     1.63  1.08       250474       34 | edu.uci.nts.slip
     0.38  0.56       130322        8 | edu.uci.oac
     0.10  0.04         9546        2 | edu.ucla.asucla
     0.91  0.09        20519       19 | edu.ucla.seas
     0.67  0.94       217762       14 | edu.ucr
     0.10  0.06        14808        2 | edu.ucsb.mcl
     0.05  0.06        13762        1 | edu.ucsd
     0.05  0.05        11709        1 | edu.udel.cms
     0.10  0.06        14808        2 | edu.ufl.ee.tcad
     0.14  0.39        91323        3 | edu.uidaho.phys
     0.19  0.49       114094        4 | edu.ukans.cecase
     0.24  1.16       269777        5 | edu.umass.cs
     0.05  0.02         5439        1 | edu.umass.ucs
     0.19  0.55       127257        4 | edu.umd.eng
     0.14  0.40        93237        3 | edu.umich.ifs
     0.10  0.39        90277        2 | edu.umn.stu
     0.05  0.02         4807        1 | edu.unlv.cs
     0.24  0.43       100869        5 | edu.usc
     0.10  0.04         9546        2 | edu.utah.math
     0.48  0.92       214320       10 | edu.utexas.cc
     0.38  0.37        86086        8 | edu.utexas.psy
     0.77  0.39        89787       16 | edu.vt.ee
     0.14  0.27        62307        3 | edu.vt.sv
     0.10  0.02         5133        2 | edu.washington.biotech
     0.10  0.06        14808        2 | edu.washington.tjp
     0.24  0.08        18464        5 | edu.washington.u
     0.24  0.98       227011        5 | edu.wayne.science
     0.05  0.02         4807        1 | edu.whittier
     0.82  0.36        84445       17 | edu.wisc.cs
     0.10  0.03         6149        2 | edu.wwc
     0.14  0.39        91323        3 | fi.csc
     0.34  0.04         8260        7 | fi.helsinki
     0.14  0.35        81852        3 | fi.lut.cc
     0.10  0.06        14808        2 | fr.cnet.lannion
     0.10  0.06        14808        2 | fr.ens
     0.58  1.23       285980       12 | fr.ifremer
     0.05  0.05        11709        1 | fr.imag
     0.05  0.04        10303        1 | fr.loria
     0.14  0.12        28570        3 | fr.u-strasbg
     0.10  0.06        14808        2 | fr.univ-mrs
     0.10  0.06        14808        2 | fr.univ-rennes1
     0.05  0.04        10303        1 | gov.anl.aps1
     0.05  0.04         8701        1 | gov.lbl
     0.19  0.08        18644        4 | gov.llnl
     0.48  1.29       299041       10 | gov.nasa.arc
     0.24  0.15        33907        5 | gov.nasa.gsfc
     0.43  0.33        77769        9 | gov.nasa.jpl
     0.10  0.04         9546        2 | gov.nasa.jsc
     0.24  0.17        40413        5 | gov.nasa.lerc
     0.19  0.47       108848        4 | gov.noaa.ncdc
     0.29  0.53       123935        6 | gov.ornl.ctd
     0.10  0.06        14808        2 | gov.ornl.xdoe
     0.10  0.06        14808        2 | gov.osti
     0.38  0.37        85249        8 | it.cnr.mi.siam
     0.19  0.40        93212        4 | it.infn.roma1
     0.38  0.19        44703        8 | it.polimi.cdc
     1.87  0.39        91511       39 | it.stet.cselt
     0.24  0.67       155217        5 | it.unipi.di
     0.19  0.05        12298        4 | jp.ac.hokudai.huie
     0.05  0.04        10303        1 | jp.ac.kyushu-u.csce
     0.05  0.02         4807        1 | jp.ac.u-tokyo.s.chem
     0.19  0.24        55238        4 | jp.co.nec.gate
     0.10  0.02         5133        2 | mil.af.afit
     0.29  0.55       128926        6 | mil.army.cecer
     0.24  0.08        19098        5 | mil.army.pica
     0.10  0.34        78122        2 | mil.darpa
     0.10  0.00          550        2 | mil.navy.dt
     0.05  0.02         4807        1 | net.tiac
     0.14  0.26        61265        3 | nl.esa.estec.jw
     0.10  0.12        27524        2 | nl.rug.cs
     0.29  0.57       131852        6 | nl.vu.cs
     0.10  0.52       121282        2 | no.dhmolde
     0.10  0.04         9546        2 | no.nta
     0.10  0.04         9546        2 | nz.ac.otago
     0.10  0.06        14808        2 | org.eso.hq
     0.24  0.69       159700        5 | org.io
     0.05  0.16        37429        1 | org.rand
     0.14  0.06        14353        3 | pe.net.rcp
     0.14  0.22        50742        3 | se.chalmers.dtek
     0.29  0.25        58919        6 | se.ericsson
     0.10  0.04         9546        2 | se.lth.efd
     0.05  0.04         8701        1 | se.luth.ludd
     0.43  0.11        25638        9 | se.luth.sm
     0.14  0.39        91323        3 | se.sunet.pilsnet
     0.05  0.33        76515        1 | uk.ac.abdn.biomed
     0.10  0.03         6149        2 | uk.ac.brunel
     0.05  0.02         5439        1 | uk.ac.ed
     0.14  0.39        91323        3 | uk.ac.ed.dcs
     0.05  0.04        10303        1 | uk.ac.hw.icbl
     0.10  0.03         6149        2 | uk.ac.ic.cv
     0.10  0.01         2000        2 | uk.ac.ox.stannes
     0.14  0.26        61265        3 | uk.ac.rfhsm
     0.10  0.02         5133        2 | uk.ac.staffs
     0.05  0.04         8701        1 | uk.ac.strath.cc
     0.05  0.04         8701        1 | uk.ac.strath.law
     0.05  0.04         8701        1 | uk.ac.strath.stams
     0.24  0.26        61563        5 | uk.ac.susx
     0.10  0.04         9546        2 | uk.ac.umist.co.sna
     0.14  0.18        41286        3 | uk.co.bt.axion
     0.10  0.03         6149        2 | uk.co.unipalm
     0.10  0.09        20606        2 | uk.co.x
    

    Total Transfers by URL/Archive Section

    %Reqs %Byte  Bytes Sent  Requests   Archive Section
    ----- ----- ------------ -------- |------------------------------------
     0.10  0.72       167328        2 | /Admin/Feb.wwwstats.html
     0.29  2.45       568740        6 | /Admin/Mar.wwwstats.html
     2.50 17.12      3978780       52 | /Admin/wwwstats.html
     0.82  0.68       156893       17 | /Arcadia/
     0.14  0.47       109830        3 | /Arcadia/Chiron_Logo.gif
     0.67  0.10        22680       14 | /Arcadia/atUCI.html
     0.14  0.11        24486        3 | /Arcadia/chiron.html
     0.38  0.10        22288        8 | /Dept/Faculty/
     0.53  0.11        25993       11 | /Dept/Research/
     0.38  0.06        14736        8 | /Dept/overview.html
     8.65  3.72       864000      180 | /ICShome.html
     0.14  0.02         5604        3 | /IRUS/
     0.05  0.04         8924        1 | /IRUS/4iss_announce.html
     0.05  0.00          690        1 | /Test/transparent-GIF89.html
     2.59  1.92       445986       54 | /WWWdocs/documents.menu.html
     0.05  0.03         7053        1 | /WWWdocs/guide/www.guide.app.b.html
     0.10  0.29        68560        2 | /WWWdocs/guide/www.guide.html
     0.77  0.60       139216       16 | /WWWdocs/htmlquickref.html
     0.67  0.78       182126       14 | /WWWdocs/localFAQ.html
     0.05  0.00          692        1 | /WWWdocs/papers/
     0.14  3.99       926553        3 | /WWWdocs/papers/draft-raggett-www-html-00.ps
     0.10  0.97       225162        2 | /WWWdocs/papers/html-spec.ps
     0.24  0.11        26305        5 | /WWWdocs/personalwebs.html
     0.24  0.01         3460        5 | /WebSoft/
     1.20  0.44       102175       25 | /WebSoft/MOMspider/
     0.05  0.01         1204        1 | /WebSoft/MOMspider/WWW94/
     0.05  0.01         1819        1 | /WebSoft/MOMspider/WWW94/acknowledge.html
     0.05  0.00         1001        1 | /WebSoft/MOMspider/WWW94/appendix-B.html
     0.05  0.01         1846        1 | /WebSoft/MOMspider/WWW94/appendix-D.html
     0.10  0.03         7482        2 | /WebSoft/MOMspider/WWW94/conclusions.html
     0.24  0.18        42035        5 | /WebSoft/MOMspider/WWW94/design.html
     0.10  0.04         9378        2 | /WebSoft/MOMspider/WWW94/existing.html
     0.19  0.22        50248        4 | /WebSoft/MOMspider/WWW94/figure1.gif
     0.29  0.11        25920        6 | /WebSoft/MOMspider/WWW94/intro.html
     0.05  0.02         3641        1 | /WebSoft/MOMspider/WWW94/meta.html
     0.86  0.37        86670       18 | /WebSoft/MOMspider/WWW94/paper.html
     0.05  0.32        73772        1 | /WebSoft/MOMspider/WWW94/paper_A4.ps
     0.24  1.58       366535        5 | /WebSoft/MOMspider/WWW94/paper_US.ps
     0.24  0.09        21870        5 | /WebSoft/MOMspider/WWW94/problem.html
     0.14  0.06        12801        3 | /WebSoft/MOMspider/WWW94/references.html
     0.10  0.05        11300        2 | /WebSoft/MOMspider/WWW94/solution.html
     1.68  1.55       360605       35 | /WebSoft/caching.html
     0.05  0.01         2054        1 | /WebSoft/rewrite_history.txt
     8.21 10.01      2325958      171 | /WebSoft/wwwstat/
     0.14  0.08        18885        3 | /WebSoft/wwwstat/Changes.txt
     0.43  0.68       158346        9 | /WebSoft/wwwstat/README.txt
     0.77  0.30        68656       16 | /WebSoft/wwwstat/country-codes.txt
     0.34  0.14        31472        7 | /WebSoft/wwwstat/example.html.txt
     0.72  0.76       175635       15 | /WebSoft/wwwstat/oldlog2new.txt
     0.96  4.00       929140       20 | /WebSoft/wwwstat/wwwstat-1.0a.tar.Z
     1.10  3.16       734781       23 | /WebSoft/wwwstat/wwwstat-1.0a.tar.gz
     1.20  3.86       898350       25 | /WebSoft/wwwstat/wwwstat.txt
     0.05  0.01         2849        1 | /ZOTnews/93.09/ICS_Software.html
     0.05  0.01         2187        1 | /ZOTnews/94.01/EscortUpdate.html
     0.10  0.01         2422        2 | /ZOTnews/94.01/Intro.html
     0.05  0.02         4101        1 | /ZOTnews/94.01/PasswordSecurity.html
     0.05  0.01         1782        1 | /ZOTnews/94.01/RandomNotes.html
     0.10  0.03         7070        2 | /ZOTnews/94.01/WorldWideWeb.html
     0.10  0.01         1766        2 | /ZOTnews/ZOTnews.html
     0.34  0.04         8260        7 | /cgi-bin/finger
     0.67  0.07        16520       14 | /cgi-bin/searchICS
     0.05  0.01         1180        1 | /cgi-bin/searchICSds
     1.10  0.12        26780       23 | /cgi-bin/searchOrigins
     0.14  0.02         4821        3 | /dir/
     0.05  0.01         1607        1 | /dir/eli_dir.html
     0.67  0.04         9688       14 | /dir/faculty
     0.34  0.01         2163        7 | /dir/faculty/AI/
     0.19  0.01         1592        4 | /dir/faculty/CORPS/
     0.19  0.06        13716        4 | /dir/faculty/CORPS/ackerman
     0.29  0.01         1854        6 | /dir/faculty/CSD/
     0.14  0.00          927        3 | /dir/faculty/EdTech/
     0.34  0.01         3360        7 | /dir/faculty/Software/
     0.29  0.22        51642        6 | /dir/faculty/Software/djr
     0.24  0.01         1990        5 | /dir/faculty/Theory/
     0.10  0.01         1612        2 | /dir/faculty/Theory/lueker
     0.34  0.01         3290        7 | /dir/faculty/other/
     0.29  0.02         5784        6 | /dir/faculty/other/franklin
     0.14  0.01         3162        3 | /dir/faculty/other/kay
     0.86  0.05        12456       18 | /dir/grad
     0.38  0.02         5408        8 | /dir/grad/AI/
     0.14  0.04         8742        3 | /dir/grad/AI/honig
     0.05  0.00          968        1 | /dir/grad/AI/rmyers
     0.48  0.03         7500       10 | /dir/grad/CORPS/
     0.05  0.00          787        1 | /dir/grad/CORPS/aandeen
     0.48  0.08        17840       10 | /dir/grad/CORPS/covi
     0.43  2.55       592263        9 | /dir/grad/CORPS/lisa.gif
     0.19  0.03         6004        4 | /dir/grad/CORPS/palen
     0.14  0.02         5178        3 | /dir/grad/CORPS/rgrinter
     0.14  0.02         3726        3 | /dir/grad/CORPS/tmcmahon
     0.34  0.02         5271        7 | /dir/grad/CSD/
     0.29  0.10        24144        6 | /dir/grad/CSD/bvickers
     0.10  0.02         3868        2 | /dir/grad/CSD/mfukuda
     0.05  0.00          988        1 | /dir/grad/CSD/narayan
     0.05  0.02         4953        1 | /dir/grad/CSD/snovack
     0.29  0.01         2388        6 | /dir/grad/EdTech/
     0.10  0.01         1860        2 | /dir/grad/EdTech/ddubrow
     0.38  0.06        13888        8 | /dir/grad/Software/
     0.05  0.01         1736        1 | /dir/grad/Software/FULLNAME.html
     0.10  0.01         3088        2 | /dir/grad/Software/artreyes
     0.10  0.03         6268        2 | /dir/grad/Software/cpatters
     0.14  0.02         4164        3 | /dir/grad/Software/echarne
     0.24  0.03         7640        5 | /dir/grad/Software/ejw
     1.01  0.27        62160       21 | /dir/grad/Software/fielding
     0.10  0.01         2266        2 | /dir/grad/Software/garywong
     0.10  0.01         1326        2 | /dir/grad/Software/ike
     0.10  0.02         5544        2 | /dir/grad/Software/jblevins
     0.14  0.03         7674        3 | /dir/grad/Software/jrobbins
     0.05  0.01         2274        1 | /dir/grad/Software/jshaw
     0.10  0.01         2082        2 | /dir/grad/Software/jueic
     0.10  0.02         3746        2 | /dir/grad/Software/kanderso
     0.05  0.01         1422        1 | /dir/grad/Software/neno
     0.14  0.05        10998        3 | /dir/grad/Software/omalley
     0.05  0.00          951        1 | /dir/grad/Software/self
     0.05  0.00         1136        1 | /dir/grad/Software/tonne
     0.05  0.00         1154        1 | /dir/grad/Software/yessayan
     0.34  0.02         3955        7 | /dir/grad/Theory/
     0.10  0.01         2454        2 | /dir/grad/Theory/dinesh
     0.10  0.01         2046        2 | /dir/grad/Theory/peymano
     0.10  0.01         2456        2 | /dir/grad/Theory/rhutchin
     0.38  0.01         2472        8 | /dir/grad/other/
     1.63  0.24        54638       34 | /dir/icsds.html
     0.72  0.06        13065       15 | /dir/staff/
     0.05  0.01         1385        1 | /dir/staff/craigm
     0.48  0.04         9410       10 | /dir/staff/erickson
     0.10  0.02         5032        2 | /dir/staff/gbolcer
     0.10  0.01         1398        2 | /dir/staff/hegardt
     0.14  0.02         3918        3 | /dir/staff/kari
     0.05  0.01         1340        1 | /dir/staff/morgan
     0.10  0.01         1400        2 | /dir/staff/sam
     0.14  0.01         2688        3 | /dir/staff/tellier
     0.53  0.03         7403       11 | /dir/visitor/
     0.10  0.01         1968        2 | /dir/visitor/andrea
     0.19  0.03         7140        4 | /dir/visitor/nmatsui
     0.05  0.01         1241        1 | /dir/visitor/osy
     0.34  0.05        11011        7 | /dir/visitor/slamm
     0.10  0.01         1936        2 | /dir/visitor/tyamazak
     0.10  0.02         4370        2 | /webmaster.html
     0.05  0.12        28902        1 | /~cpatters/ics227/overview.ps
     2.98  1.45       337038       62 | /~ejw/csr/cyber.html
     0.29  0.01         2616        6 | /~ejw/csr/pete.html
     0.05  0.00          692        1 | /~fielding/Maori
     0.05 13.09      3041527        1 | /~fielding/Maori/video.mpeg
     5.72  0.36        83380      119 | All Icons (server)
     9.80  0.88       204780      204 | All Icons (site)
    12.10 16.31      3790903      252 | All Pictures
     6.39  0.20        45845      133 | Code 302 Redirected Requests
     3.31  0.08        19333       69 | Code 404 Not Found Requests
    

    This summary was generated by wwwstat-2.0
    cgi-bin/stats/wwwstat-2.0/monthly.pl0000640000372000001540000001156707005603740017244 0ustar affweblibuuid#!YOUR_PERL_BINARY # ========================================================================== # Copyright (c) 1996 Regents of the University of California. # # This software has been developed by Roy Fielding as # part of the WebSoft project at the University of California, Irvine. # # See the file LICENSE for licensing and redistribution information. # # This program is provided ONLY as an example. It is not needed to run # wwwstat and is not supported by the author. # sub usage { die <<"EndUsage"; USAGE: monthly THIS PROGRAM MUST ONLY BE RUN ONCE PER MONTH, DURING THE FIRST WEEK It assumes a lot, like that you use wwwstat and archive your logfiles once per month. You will need to configure it for your server before it can be used. Reads the logfile (assumed to contain more than one month's worth of WWW common logfile entries) and moves the prior month's entries into a separate file. The new file is created on TMPDIR (to avoid filling up the disk), compressed using gzip, and then moved to the archive directory. The program also restarts the httpd server. EndUsage } if ($#ARGV >= 0) { &usage; } # ========================================================================== # Get defaults umask(022); # Compression command and extension $zcommand = 'gzip -9'; $zextension = '.gz'; $wstatcmd = 'wwwstat'; # Set up the filenames to be used $ServerRoot = '/usr/local/etc/httpd'; $NewLog = $ServerRoot . '/logs/access_log'; # Current logfile $OldLog = $NewLog . '.old'; # and temp location $PidFile = $ServerRoot . '/logs/httpd.pid'; # Server's PID file $ErrorLog = $ServerRoot . '/logs/error_log'; # Server's Error Log $TempLog = "/tmp/templog-$$.txt"; # Temporary file for last month's log print "Got the defaults\n"; # ========================================================================== # Figure out the archive name $ArcName = "/dc/ud/www/oldlogs/%M_access_log" . $zextension; @MoY = ('Jan','Feb','Mar','Apr','May','Jun', 'Jul','Aug','Sep','Oct','Nov','Dec'); ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); if ($mon == 0) { $mon = 11; $year -= 1; } else { $mon -= 1; } $LastMonth = $MoY[$mon]; $ArcName =~ s/%M/$LastMonth$year/; $ArcStats = '/dc/ud/www/documentroot/Admin/stats-19' . $year . '/' . $LastMonth . '.wwwstats.html'; print "Figured out that last month was $LastMonth $year\n"; # ========================================================================== # Open logfiles if (-e $OldLog) { die "$OldLog already exists, stopped"; } rename($NewLog, $OldLog) || die "$!: Failed to rename $NewLog, stopped"; open(OLDLOG, $OldLog) || die "$!: Failed to open $OldLog, stopped"; open(TEMPLOG, ">$TempLog") || die "$!: Failed to open $TempLog, stopped"; open(NEWLOG, ">$NewLog") || die "$!: Failed to open $NewLog, stopped"; print "Successfully opened the log files\n"; # ========================================================================== # Iterate through the old logfile print "Splitting $NewLog\n"; LINE: while () { # # First, parse the common log format into its seven basic components # ($host, $rfc931, $authuser, $timestamp, $request, $status, $bytes) = /^(\S+) (\S+) (\S+) \[([^\]]*)\] \"([^"]*)\" (\S+) (\S+)/; # Now, is this garbage or is it memorex? Note that $bytes can be 0 if (!($host && $rfc931 && $authuser && $timestamp && $request && $status)) { next LINE; } # Finally, extract the month and determine where to write this entry $month = substr($timestamp, 3, 3); if ($month eq $LastMonth) { print TEMPLOG; } else { print NEWLOG; } } close(OLDLOG); close(TEMPLOG); close(NEWLOG); print "Successfully processed the logfiles\n"; # Restart the httpd server if ($PidFile) { rename($ErrorLog, $ErrorLog . '.old'); # Reset the error log as well if (open(PID, $PidFile)) { chop($_ = ); kill 1, $_; close(PID); print "Restarted httpd at $_\n"; } } # Delete the old logfile print "Deleting $OldLog\n"; system('rm','-f', $OldLog); if (-e $OldLog) { print STDERR "Warning: Failed to delete $OldLog\n"; } # Run wwwstat on the temporary log to get last month's stats print "Creating monthly stats in $ArcStats\n"; system("$wstatcmd $TempLog > $ArcStats"); system("$zcommand $ArcStats"); # Compress the temporary logfile print "Compressing last month's log\n"; system("$zcommand $TempLog"); if (-e $TempLog) { die "Failed to $zcommand $TempLog\n"; } $TempLog .= $zextension; # Move the temporary logfile to its archive location print "Moving last month's log to $ArcName\n"; system('mv','-f', $TempLog, $ArcName); if (!(-e $ArcName)) { die "Failed to move $TempLog to $ArcName\n"; } print "Finished Job\n"; exit(0); cgi-bin/stats/wwwstat-2.0/wwwstat.html0000640000372000001540000007135607005603741017626 0ustar affweblibuuid wwwstat manual

    wwwstat manual

    NAME

    wwwstat - summarize WWW server (httpd) access statistics

    SYNOPSIS

    wwwstat [-F system_config] [-f user_config] [options...] [--] [ summary | logfile | + | - ]...

    DESCRIPTION

    wwwstat reads a sequence of httpd common logfile format (CLF) access_log files and/or prior wwwstat output summary files and/or the standard input and outputs a summary of the access statistics in HTML.

    Since wwwstat does not make any changes to the input files or write any files in the server directories, it can be run by any user with read access to the input logfile(s) and summary file(s). This allows people other than the webmaster to run specialized analyses of just the things they are interested in summarizing.

    wwwstat provides World Wide Web (WWW) access statistics, which does not necessarily correspond to statistics on individual users. It counts the number of HTTP requests received by the server and the amount of bytes transmitted in response to those requests, according to what is in the logfile(s), and outputs those counts as tables broken down by category of request.

    wwwstat output summaries can be read by gwstat to produce fancy graphs of the summarized statistics. The splitlog program can be used to split a large logfile into separate files by entry prefix or URL path.

    wwwstat is a perl script, which means you need to have a perl interpreter to run the program. It has been tested with perl versions 4.036 and 5.002.

    Output Sections

    wwwstat's output consists of a set of cross-reference links, the sum totals and averages for the processed data, and a sequence of amount-by-category tables partitioned into sections. The section categories are based on the characteristics evident from the access request, as provided by the common logfile format. These include:
    Request Date e.g., "Feb 2 1996"
    Request Hour e.g., "00" through "23"
    Client Domain The Fully-Qualified Domain Name (FQDN) suffix that corresponds to an organization type or country name.
    Reversed Subdomain The FQDN, usually minus the first (machine name) component, and reversed so that it is easier to read when sorted.
    URL/Archive Grouping based on Request-URI or non-success status code.
    Identity The user identity based on IdentityCheck token or Authorization field.

    Each section can be enabled/disabled using the configuration files or command-line options (see Section Display Options).

    Output Table Format

    Inside each section, the statistics are presented as a preformatted table.

    %Reqs %Byte Bytes Sent Requests category-type
    ----- ----- ------------ -------- |---------------
    NN.NN NN.NN NNNNNNNNNNNN NNNNNNNN |
    category-value
    100.0 100.0 NNNNNNNNNNNN NNNNNNNN | category-value

    Requests Requests received for this category-value.
    Bytes Sent Bytes transmitted for this category-value.
    %Reqs (<Requests>/<Total Requests>)*100.
    %Byte (<Bytes Sent>/<Total Bytes>)*100.

    The table can be sorted by category-value (-sort key), number of requests received (-sort req), or number of bytes received (-sort byte). It can also be limited to the -top N entries.

    OPTIONS

    Configuration Options

    These options define how wwwstat should establish defaults and interpret the command-line.
    -F filename
    Get system configuration defaults from the given file. If used, this must be the first argument on the command-line, since it needs to be interpreted before the other command options. The file wwwstat.rc is included with the distribution as an example of this file; it contains perl source code which directly sets the control and display options provided by wwwstat. If filename is not a pathname, the include path (see FILES) is searched for filename. An empty string as filename will disable this feature. [-F "wwwstat.rc"]
    -f filename
    Get user configuration defaults from the given file. If used, this must be the first argument on the command-line after -F (if any). The file is the same format as for the -F option (see wwwstat.rc). If filename is not a pathname, the include path (see FILES) is searched for filename. An empty string as filename will disable this feature. [-f ".wwwstatrc"]
    --
    Last option (the remaining arguments are treated as input files).

    Diagnostic Options

    These options provide information about wwwstat usage or about some unusual aspects of the logfile(s) being processed.
    -h
    Help - display usage information to STDERR and then exit.
    -v
    Verbose display to STDERR of each log entry processed.
    -x
    Display to STDERR all requests resulting in HTTP error responses.
    -e
    Display to STDERR all invalid log entries. Invalid log entries can occur if the server is miswriting or overwriting its own log, if the request is made by a broken client or proxy, or if a malicious attacker is trying to gain privileged access to your system. For the latter reason, the webmaster should run wwwstat with this option on a regular basis.

    Display Options

    These options modify the output format.
    -H string
    Use the given string as the HTML title and heading for output.
    -X string
    Use the given string as the cross-reference URL to the last summary output. Any occurrence of the characters "%M" or "%Y" are replaced by the month and year, respectively, of the month prior to the first log entry date. The empty string will exclude any cross-reference.
    -R
    Display the daily stats table sorted in reverse. This option is primarily for use with the gwstat program for producing graphs of the output.
    -l
    -L
    Do (-l) or don't (-L) display the full DNS hostname of clients in your local domain (which is determined by the configured value of $AppendToLocalhost) in the section on subdomain statistics. The default [-L] is to strip the machine name from local addresses.
    -o
    -O
    Do (-o) or don't (-O) display the full DNS hostname of clients outside your local domain in the section on subdomain statistics. The default [-O] is to strip the machine name from outside addresses.
    -u
    -U
    Do (-u) or don't (-U) display the IP address of clients with unresolved domain names in the section on subdomain statistics. The -dns option can be used to resolve some names, but not all IP hosts have a DNS name (SLIP/PPP connections) and sometimes a host's DNS service is inaccessible. The default [-U] is to group all such addresses under the category "Unresolved".
    -dns
    -nodns
    Do (-dns) or don't (-nodns) use the system's hostname lookup facilities to find the DNS hostname associated with any unresolved IP addresses. Looking up a DNS name may be very slow, particularly when the results are negative (no DNS name), which is why a caching capability is included as well. [-nodns]
    -cache filename
    Use the given DBM database as the read/write persistent DNS cache (the .dir and .pag extensions are appended automatically). Cached entries (including negative results) are removed after the time configured for $DNSexpires [two months]. No caching is performed if filename is the empty string, which may be needed if your system does not support DBM or NDBM functionality. Running -dns without a persistent cache is not recommended. [-cache "dnscache"]
    -trunc N
    Truncate the URLs listed in the archive section after the Nth hierarchy level. This option is commonly used to reduce the output size and memory requirements of wwwstat by grouping the requests by directory tree instead of listing every URL. The default [-trunc 0] is to display every requested URL.
    -files
    -nofiles
    Do (-files) or don't (-nofiles) include the last component of a URL (usually the filename) in the archive section. This option is commonly used to reduce the output size and memory requirements of wwwstat by grouping the requests by directory instead of listing every URL. The default [-files] is to display the entire requested URL.
    -link
    -nolink
    Do (-link) or don't (-nolink) add a hypertext link around each archive URL. This option is useful for local maintenance, but it is not recommended for publication of the HTML results (it often results in links to temporary or nonexistant resources, and leads people/robots to resources that might not be publically available). [-nolink]
    -cgi
    -nocgi
    Do (-cgi) or don't (-nocgi) prefix the summary output with CGI header fields appropriate for use with the HTTP common gateway interface. Using wwwstat as a CGI script is not recommended - it is usually better to simply run the wwwstat program periodically and serve the static output file. [-nocgi]

    Section Display Options

    These options change the display of entire sections (as opposed to the entries within those sections). They allow the user to enable or disable an entire section, set the sorting method for that section, and limit the number of displayed entries for that section. These options are context-sensitive and processed in the order given.
    -all
    -noall
    Include (-all) or exclude (-noall) all of the display sections. The -noall option is commonly used just prior to one or more of the other section options, such that only the listed sections are displayed.
    -daily
    -nodaily
    Include (-daily) or exclude (-nodaily) the section of statistics by request date and set the scope for later -sort and -top options to this section.
    -hourly
    -nohourly
    Include (-hourly) or exclude (-nohourly) the section of statistics by request hour and set the scope for later -sort and -top options to this section.
    -domain
    -nodomain
    Include (-domain) or exclude (-nodomain) the section of statistics by the client's Internet domain and set the scope for later -sort and -top options to this section.
    -subdomain
    -nosubdomain
    Include (-subdomain) or exclude (-nosubdomain) the section of statistics by the client's Internet subdomain (reversed for display) and set the scope for later -sort and -top options to this section.
    -archive
    -noarchive
    Include (-archive) or exclude (-noarchive) the section of statistics by requested URL/archive and set the scope for later -sort and -top options to this section.
    -r
    -ident
    -noident
    Include (-r or -ident) or exclude (-noident) the section of statistics by the identity of the user (if IdentityCheck is ON) or the authentication userid (if supplied) and set the scope for later -sort and -top options to this section. DO NOT PUBLISH this information, as that would reveal security-related identities and be a violation of privacy. This option is provided for administrative purposes only.
    -sort (key|byte|req)
    Sort this section by its primary key, the number of bytes transmitted, or the number of requests received. [-sort key]
    -top N
    Display only the top N entries for this section. This option assumes that the -sort option has been set to either bytes or requests.
    -both
    Display both the top N entries for this section [10, sorted by requests], and then the full section (all entries) sorted by key.

    Search Options

    These options are used to limit the analysis to requests matching a pattern. The pattern is supplied in the form of a perl regular expression, except that the characters "+" and "." are escaped automatically unless the -noescape option is given. Enclose the pattern in single-quotes to prevent the command shell from interpreting some special characters.

    Multiple occurrences of the same option results in an OR-ing of the regular expressions. Search options are only applied to logfile entries; any summary files input must have been created with the same search options.

    -a regexp
    -A regexp
    Include (-a) or exclude (-A) all requests containing a hostname/IP address matching the given perl regular expression.
    -c regexp
    -C regexp
    Include (-c) or exclude (-C) all requests resulting in an HTTP status code matching the given perl regular expression.
    -d regexp
    -D regexp
    Include (-d) or exclude (-D) all requests occurring on a date (e.g., "Feb 2 1994") matching the given perl regular expression.
    -t regexp
    -T regexp
    Include (-t) or exclude (-T) all requests occurring during the hour (e.g., "23" is 11pm - 12pm) matching the given perl regular expression.
    -m regexp
    -M regexp
    Include (-m) or exclude (-M) all requests using an HTTP method (e.g., "HEAD") matching the given perl regular expression.
    -n regexp
    -N regexp
    Include (-n) or exclude (-N) all requests on a URL (archive name) matching the given perl regular expression.
    -noescape
    Do not escape the special characters ("+" and ".") in the remaining search options.

    INPUT

    After parsing the options, the remaining arguments on the command-line are treated as input arguments and are read in the order given. If no input arguments are given, the configured default logfile is read [+].
    -
    Read from standard input (STDIN).
    +
    Read the default logfile. [as configured]
    filename...
    Read the given file and determine from the first line whether it is a previous output summary or a CLF logfile. If the filename's extension indicates that is is compressed (gz|z|Z), then pipe it through the configured decompression program [gunzip -c] first. Summary files must have been created with the same (or similar) configuration and command-line options as the currently running program; if not, weird things will happen.

    USAGE

    wwwstat is used for many purposes:
    • as a diagnostic utility for measuring server activity, finding incorrect URL references, and detecting attempted misuse of the server;
    • as a public relations tool for measuring technology or information transfer (i.e., Is the message getting out? To the right people?);
    • as an archival tool for tracking web usage over time without storing the entire logfile; and,
    • most often, as an easy mechanism for justifying all the hard work that went into creating the web content that people out there are requesting.

    In most cases, wwwstat is run on a periodic basis (nightly, weekly, and/or monthly) by a wrapper program as a crontab entry shortly after midnight, typically in conjunction with rotating the current logfile. The output is usually directed to a temporary file which can later be moved to a published location. The temporary file is necessary to avoid erasing your published file during wwwstat's processing (which would look very odd if someone tried to GET it from your web).

    wwwstat can be run as a CGI script (-cgi), but that is not recommended unless the input logfile is very small.

    All of the command-line options, and a few options that are not available from the command-line, can be changed within the user and system configuration files (see wwwstat.rc). These files are actually perl library modules which are executed as part of the program's initialization. The example provided with the distribution includes complete documentation on what variables can be set and their range of values.

    Perl Regular Expressions

    The Search Options and many of the configuration file settings allow for full use of perl regular expressions (with the exception that the -a, -A, -n and -N options treat '+' and '.' characters as normal alphabetic characters unless they are preceded by the -noescape option). Most people only need to know the following special characters:

    ^
    at start of pattern, means "starts with pattern".
    $
    at end of pattern, means "ends with pattern".
    (...)
    groups pattern elements as a single element.
    ?
    matches preceding element zero or one times.
    *
    matches preceding element zero or more times.
    +
    matches preceding element one or more times.
    .
    matches any single character.
    [...]
    denotes a class of characters to match. [^...] negates the class. Inside a class, '-' indicates a range of characters.
    (A|B|C)
    matches if A or B or C matches.

    Depending on your command shell, some special characters may need to be escaped on the command line or enclosed in single-quotes to avoid shell interpretation.

    EXAMPLES

    Summarize requests from commercial domains.
    wwwstat -a '.com$'
    Summarize requests from the host kiwi.ics.uci.edu
    wwwstat -a '^kiwi.ics.uci.edu$'
    Summarize requests not from kiwi.ics.uci.edu
    wwwstat -A '^kiwi.ics.uci.edu$'
    Summarize requests resulting in temporary redirects
    wwwstat -c '302'
    Summarize requests resulting in server errors
    wwwstat -c '^5'
    Summarize unsuccessful requests
    wwwstat -C '^2' -C '304'
    Summarize requests in first week of the month
    wwwstat -d ' [1-7] '
    Summarize requests in second week of the month
    wwwstat -d ' ([89]|1[0-4]) '
    Summarize requests in third week of the month
    wwwstat -d ' (1[5-9]|2[01]) '
    Summarize requests in fourth week of the month
    wwwstat -d ' 2[2-8] '
    Summarize requests in leftover days of the month
    wwwstat -d ' (29|30|31) '
    Summarize requests in February
    wwwstat -d 'Feb'
    Summarize requests in year 1994
    wwwstat -d '1994'
    Summarize requests not in April
    wwwstat -D 'Apr'
    Summarize requests between midnight and 1am
    wwwstat -t '00'
    Summarize requests not received between noon and 1pm
    wwwstat -T '12'
    Summarize requests with a gif extension
    wwwstat -n '.gif$'
    Summarize requests under user's URL
    wwwstat -n '^/~user/'
    Summarize requests not under "hidden" paths
    wwwstat -N '/hidden/'

    ENVIRONMENT

    HOME
    Location of user's home directory, placed on INC path.
    LOGDIR
    Used instead of HOME if latter is undefined.
    PERLLIB
    A colon-separated list of directories in which to look for include and configuration files.

    FILES

    Unless a pathname is supplied, the configuration files are obtained from the current directory, the user's home directory (HOME or LOGDIR), the standard library path (PERLLIB), and the directory indicated by the command pathname (in that order).
    .wwwstatrc
    User configuration file.
    wwwstat.rc
    System configuration file.
    domains.pl
    Mapping of Internet domain to country or organization.
    dnscache.dir
    dnscache.pag
    DBM files for persistent DNS cache.

    SEE ALSO

    crontab(1), gwstat(1), httpd(1m), perl(1), splitlog(1)
    More info and the latest version of wwwstat can be obtained from
    http://www.ics.uci.edu/pub/websoft/wwwstat/
    ftp://www.ics.uci.edu/pub/websoft/wwwstat/
    If you have any suggestions, bug reports, fixes, or enhancements, please join the <wwwstat-users@ics.uci.edu> mailing list by sending e-mail with "subscribe" in the subject of the message to the request address <wwwstat-users-request@ics.uci.edu>. The list is archived at the above address.

    More About HTTP

    HTTP/1.1 Proposed Standard
    R. Fielding, J. Gettys, J. C. Mogul, H. Frystyk, and T. Berners-Lee. "Hypertext Transfer Protocol -- HTTP/1.1", U.C. Irvine, DEC, MIT/LCS, August 1996.
    http://www.ics.uci.edu/pub/ietf/http/

    More About Perl

    The Perl Language Home Page
    http://www.perl.com/perl/index.html
    Johan Vromans' Perl Reference Guide
    http://www.xs4all.nl/~jvromans/perlref.html

    DIAGNOSTICS

    See also the Diagnostic Options above.
    "[none] to [none]" dates
    wwwstat did not find any matching data to summarize. If you get such an empty summary, it means that either: 1) there was no valid data (the input files are all invalid or empty), or 2) none of the data matched the search options given. Try using the -e option to show invalid data.
    100% unresolved
    If the subdomain section indicates that all of the client requests come from unresolved hostnames (IP addresses), this probably means that your server is running without DNS resolution (common for very busy sites). You can use the -dns option to have wwwstat perform the hostname lookups. If 100% of the hosts are still unresolved with the -dns option in effect, then it may be that all of the clients accessing your server are doing so from temporary SLIP/PPP addresses without DNS names, or it may be a problem with wwwstat's DNS cache (delete the cache files), with your system's DNS software (contact your system administrator), or with your network connection.

    NOTES

    Hits vs Requests vs Visitors

    wwwstat counts HTTP requests received by the server. When a request is successful, it is often referred to as a "hit". Retrieving a single image is one GET request. Retrieving an HTML page is also one GET request, but that does not include the separate requests made for in-line images or related objects. Checking to see if a cached image is still valid (a HEAD or conditional GET) is also one request.

    In all sections except the archive section, wwwstat shows the statistics for all requests (successful or not). In the archive section, it normally shows all non-successful requests under a special category for the status code and only successful requests (hits) under the URL or archive tree associated with the request. However, this grouping of non-successful requests is disabled when wwwstat is used with the search options -n, -c, and -C, since those options are normally used for finding error conditions.

    wwwstat does not count "visitors" -- individual people or programs making the requests. HTTP does not, by default, provide any information that can be accurately correlated to an individual person, though it is possible (in an unreliable manner) to use HTTP extensions and request profiles as a means of tracking individual client programs. Such tracking requires extensive resources (memory and diskspace) and is often considered a violation of privacy.

    With the exception of the ident section, wwwstat does not reveal information about the individual people making requests. Unless the output is limited to a specific URL or a specific hostname, wwwstat's output does not connect the requester to the URL being requested.

    Common Logfile Format

    The httpd common logfile format (CLF) was defined in early 1994 as the result of discussions among server and access_log analyzer developers (Roy Fielding, John Franks, Kevin Hughes, Ari Luotonen, Rob McCool, and Tony Sanders) on how to make it easier for analysis tools to be used across multiple servers. The format is:

    remote_host ident authuser [date-time zone] "Request-Line" Status-Code bytes

    where means
    remote_host Client DNS hostname or IP address
    ident Identity check token or "-"
    authuser Authorization user-id or "-"
    date-time dd/Mmm/yyyy:hh:mm:ss
    zone +dddd or -dddd
    Request-Line The first line of the HTTP request, which normally includes the method, URL, and HTTP-version.
    Status-Code Response status from server or "-"
    bytes Size of Entity-Body transmitted or "-"

    with each field separated by a single space (it turns out that problems occur if the ident token contains a space, which was not anticipated by the original designers).

    LIMITATIONS

    wwwstat cannot be more accurate than its input.

    The common logfile format does not include the amount of bytes transferred in HTTP header fields and in error responses. wwwstat attempts to estimate those bytes based on the response code. Although the built-in estimates will suffice for most applications, your results will be more accurate if the estimates are customized for the particular server software that generated the logfile.

    Modern httpd servers have extended the CLF to include additional fields (Referer and User-Agent) or to make the entire format configurable. Although wwwstat is able to read logfiles which append information to the CLF, it will not make use of that additional information. However, wwwstat is written in perl, so if you want to parse a different format all you have to do is change the parsing code.

    wwwstat does not do anything with Referer [sic] or User-Agent information that may be present in extended logfiles. In order to do anything interesting with Referer, the program would have to build a Request-URI x Referer x Count table, which would require huge gobs of memory and is better done using a separate program with a persistent database. Naturally, this is easy to do once you learn perl.

    AUTHOR

    Roy Fielding (fielding@ics.uci.edu), University of California, Irvine. Please do not send questions or requests to the author, since the number of requests has long since overwhelmed his ability to reply, and all future support will be through the mailing list.

    wwwstat was originally based on a multi-server statistics program called fwgstat-0.035 by Jonathan Magid (jem@sunsite.unc.edu) which, in turn, was heavily based on xferstats (packaged with the version 17 of the Wuarchive FTP daemon) by Chris Myers (chris@wugate.wustl.edu).

    This work has been sponsored in part by the Defense Advanced Research Projects Agency under Grant Numbers MDA972-91-J-1010 and F30602-94-C-0218. This software does not necessarily reflect the position or policy of the U.S. Government and no official endorsement should be inferred.

    cgi-bin/stats/wwwstat-2.0/monthly0002640000372000001540000001157207005603741016631 0ustar affweblibuuid#!/opt/perl/bin/perl # ========================================================================== # Copyright (c) 1996 Regents of the University of California. # # This software has been developed by Roy Fielding as # part of the WebSoft project at the University of California, Irvine. # # See the file LICENSE for licensing and redistribution information. # # This program is provided ONLY as an example. It is not needed to run # wwwstat and is not supported by the author. # sub usage { die <<"EndUsage"; USAGE: monthly THIS PROGRAM MUST ONLY BE RUN ONCE PER MONTH, DURING THE FIRST WEEK It assumes a lot, like that you use wwwstat and archive your logfiles once per month. You will need to configure it for your server before it can be used. Reads the logfile (assumed to contain more than one month's worth of WWW common logfile entries) and moves the prior month's entries into a separate file. The new file is created on TMPDIR (to avoid filling up the disk), compressed using gzip, and then moved to the archive directory. The program also restarts the httpd server. EndUsage } if ($#ARGV >= 0) { &usage; } # ========================================================================== # Get defaults umask(022); # Compression command and extension $zcommand = 'gzip -9'; $zextension = '.gz'; $wstatcmd = 'wwwstat'; # Set up the filenames to be used $ServerRoot = '/usr/local/etc/httpd'; $NewLog = $ServerRoot . '/logs/access_log'; # Current logfile $OldLog = $NewLog . '.old'; # and temp location $PidFile = $ServerRoot . '/logs/httpd.pid'; # Server's PID file $ErrorLog = $ServerRoot . '/logs/error_log'; # Server's Error Log $TempLog = "/tmp/templog-$$.txt"; # Temporary file for last month's log print "Got the defaults\n"; # ========================================================================== # Figure out the archive name $ArcName = "/dc/ud/www/oldlogs/%M_access_log" . $zextension; @MoY = ('Jan','Feb','Mar','Apr','May','Jun', 'Jul','Aug','Sep','Oct','Nov','Dec'); ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); if ($mon == 0) { $mon = 11; $year -= 1; } else { $mon -= 1; } $LastMonth = $MoY[$mon]; $ArcName =~ s/%M/$LastMonth$year/; $ArcStats = '/dc/ud/www/documentroot/Admin/stats-19' . $year . '/' . $LastMonth . '.wwwstats.html'; print "Figured out that last month was $LastMonth $year\n"; # ========================================================================== # Open logfiles if (-e $OldLog) { die "$OldLog already exists, stopped"; } rename($NewLog, $OldLog) || die "$!: Failed to rename $NewLog, stopped"; open(OLDLOG, $OldLog) || die "$!: Failed to open $OldLog, stopped"; open(TEMPLOG, ">$TempLog") || die "$!: Failed to open $TempLog, stopped"; open(NEWLOG, ">$NewLog") || die "$!: Failed to open $NewLog, stopped"; print "Successfully opened the log files\n"; # ========================================================================== # Iterate through the old logfile print "Splitting $NewLog\n"; LINE: while () { # # First, parse the common log format into its seven basic components # ($host, $rfc931, $authuser, $timestamp, $request, $status, $bytes) = /^(\S+) (\S+) (\S+) \[([^\]]*)\] \"([^"]*)\" (\S+) (\S+)/; # Now, is this garbage or is it memorex? Note that $bytes can be 0 if (!($host && $rfc931 && $authuser && $timestamp && $request && $status)) { next LINE; } # Finally, extract the month and determine where to write this entry $month = substr($timestamp, 3, 3); if ($month eq $LastMonth) { print TEMPLOG; } else { print NEWLOG; } } close(OLDLOG); close(TEMPLOG); close(NEWLOG); print "Successfully processed the logfiles\n"; # Restart the httpd server if ($PidFile) { rename($ErrorLog, $ErrorLog . '.old'); # Reset the error log as well if (open(PID, $PidFile)) { chop($_ = ); kill 1, $_; close(PID); print "Restarted httpd at $_\n"; } } # Delete the old logfile print "Deleting $OldLog\n"; system('rm','-f', $OldLog); if (-e $OldLog) { print STDERR "Warning: Failed to delete $OldLog\n"; } # Run wwwstat on the temporary log to get last month's stats print "Creating monthly stats in $ArcStats\n"; system("$wstatcmd $TempLog > $ArcStats"); system("$zcommand $ArcStats"); # Compress the temporary logfile print "Compressing last month's log\n"; system("$zcommand $TempLog"); if (-e $TempLog) { die "Failed to $zcommand $TempLog\n"; } $TempLog .= $zextension; # Move the temporary logfile to its archive location print "Moving last month's log to $ArcName\n"; system('mv','-f', $TempLog, $ArcName); if (!(-e $ArcName)) { die "Failed to move $TempLog to $ArcName\n"; } print "Finished Job\n"; exit(0); cgi-bin/stats/wwwstat-2.0/oldlog2new0002640000372000001540000002420207005603741017205 0ustar affweblibuuid#!/opt/perl/bin/perl # --------------------------------------------------------------------------- $Version = 'oldlog2new-2.0'; # # Copyright (c) 1994, 1996 Regents of the University of California. # # This software has been developed by Roy Fielding as # part of the WebSoft project at the University of California, Irvine. # # See the file LICENSE for licensing and redistribution information. # # This program is based on an early version of the wwwstat log analyzer. # It exists only for the purpose of converting old NCSA httpd 1.0 and 1.1 # log files to the common logfile format (CLF) used by wwwstat-1.0 and later. # ALMOST ALL SITES WILL HAVE NO USE FOR THIS PROGRAM. # # It reads the old log, figures out what each entry points to, finds the # current file size for that entity, and outputs the new format including # a reasonable approximation of the server response code. NOTE that this # won't work if the logfile entries do not correspond to real files that # are still in the place they were when the entry was logged. # sub usage { die <<"EndUsage"; usage: oldlog2new [-hez] [-f logfile] [-s srmfile] $Version Convert an NCSA httpd 1.1 access_log file to CLF access_log Display Options: -h Help -- just display this message and quit. -e Display all invalid log entries on STDERR. (default is to ignore them) Input Options: -f Read from the following access_log file instead of the default. -z Use zcat to uncompress the log file while reading [requires -f]. -s Get the server directives from the following srm.conf file. EndUsage } # --------------------------------------------------------------------------- # Set the default configuration options: # Edit the next line to specify the (+/-)HHMM offset from GMT $GMToffset = '-0700'; # Edit the next line to identify the server's default home page. $ServerHome = "/"; # Edit the next two lines to specify the location of your server access log # and your server configuration (srm.conf) file. $access_log = '/usr/local/etc/httpd/logs/access_log'; $srm_conf = '/usr/local/etc/httpd/conf/srm.conf'; # Edit the next line to specify the command for displaying compressed files $zcat = 'gunzip -c'; # specify as null string if none are available # Estimate the size of a redirect message minus the two location URLs $DirectoryRedirect = 1; # Does server do automatic redirect for slashless # index reqs? (1 for httpd_1.1, 0 for httpd_1.0) # Is the server running with rfc931 support (IdentityCheck on)? $IdentityCheck = 0; # Must = 1 if server uses rfc931 remote ident. # Edit the next few lines to specify whether (1) or not (0) you want: $PrintInvalids = 0; # Display invalid log entries on STDERR? $CompressedLog = 0; # Access log has been compressed (or gzipped)? # ========================================================================== # Get the command-line options require "getopts.pl"; &Getopts('hezf:s:'); if ($@ || $opt_h) { &usage; } if ($opt_e) { $PrintInvalids = 1; } if ($opt_z) { if ($opt_f) { $CompressedLog = 1; } # Require logfile name if else { &usage; } # uncompression is desired } if ($opt_f) { $access_log = $opt_f; } if ($opt_s) { $srm_conf = $opt_s; } if ($CompressedLog && !$zcat) { die "No zcat decompression command has been defined, stopped"; } # ========================================================================== # Get the other needed configuration items from the srm.conf file open (SRM,$srm_conf) || die "Error opening config file: $srm_conf\n"; $UserDir = "public_html"; # Start with NCSA defaults $DirectoryIndex = "index.html"; $DocumentRoot = "/usr/local/etc/httpd/htdocs"; while () { next if ( ($_ eq "\n") || /^\#/ ); # Ignore blank and comment lines if (/^DocumentRoot (.+)\s/) { $DocumentRoot = $1; } elsif (/^UserDir (.+)\s/) { $UserDir = $1; } elsif (/^DirectoryIndex (.+)\s/) { $DirectoryIndex = $1; } elsif (/^Redirect\s+(\S+)\s+(\S+)\s/) { $alias = $1; $rname = $2; $alias =~ s/(\W)/\\$1/g; # Needed for later pattern match $AllRedirects{$alias} = $rname; } elsif (/^Alias\s+(\S+)\s+(\S+)\s/) { $alias = $1; $rname = $2; $alias =~ s/(\W)/\\$1/g; # Needed for later pattern match $AllAliases{$alias} = $rname; } elsif ( /^ScriptAlias\s+(\S+)\s+(\S+)\s/ || /^OldScriptAlias\s+(\S+)\s+(\S+)\s/ ) { $alias = $1; $rname = $2; $alias =~ s/(\W)/\\$1/g; # Needed for later pattern match $AllScripts{$alias} = $rname; } } close SRM; # ========================================================================== # Now read log, figure out the response code and bytes, and output new format # if ($CompressedLog) { $access_log = "$zcat $access_log |"; } open (LOG,$access_log) || die "Error opening access log file: $access_log\n"; LINE: while () { $saveline = $_; $ident = "-"; if ($IdentityCheck) # Does log include IdentityCheck info? { /^(.*)@\S+\s/; if ($_) { $ident = $1; # Save ident for later use $saveline =~ s/^.*@//; # Remove the remote ident from log } $_ = $saveline; } $htv = ''; ($afield, $date, $method, $oname, $htv) = /^(\S+) \[(.+)\] (\S+)\s+(\S+)\s(.*)$/; if (!($afield && $date && $method && $oname && (length($date) == 24))) { print(STDERR "$.:$saveline") if $PrintInvalids; next LINE; } # # First, we have to figure out what file or script was accessed # $fname = $oname; $fname =~ s/\?.*$//; # Remove any trailing query information $fname =~ s/\#.*$//; # Remove any trailing anchor information $fname =~ s#//#/#g; # Remove any extra slashes if (($fname eq "") || ($fname eq "HTTP/1.0")) { print(STDERR "$.:$saveline") if $PrintInvalids; next LINE; } FNAME: # Get the document's real name { $rname = ""; # and start with it unknown $rcode = 200; $fsize = 0; study $fname; if (($fname eq "/") || ($fname eq "/$DirectoryIndex")) { $fname = "$ServerHome"; # Handle top file with extra care $rname = "$DocumentRoot$fname"; last FNAME; } foreach $redir (keys %AllRedirects) # Is it a redirected file? { if ( $fname =~ /^$redir/ ) { $rcode = 302; last FNAME; } } foreach $alias (keys %AllAliases) # Is it a file name alias? { if ( $fname =~ /^$alias/ ) { $rname = $fname; $rname =~ s#^$alias#$AllAliases{$alias}#; last FNAME; } } if ($fname =~ /^\/~(\w+)\// ) # Is it a /~username/...? { ($name,$passwd,$uid,$gid,$quota,$comment,$gcos,$dir,$shell) = getpwnam($1); if ($dir) { $rname = $fname; $rname =~ s#^/~$1#$dir/$UserDir#; } else { $rcode = 404; } last FNAME; } if ($fname =~ /^\/~(\w+)$/ ) # Is it a /~username ? { ($name,$passwd,$uid,$gid,$quota,$comment,$gcos,$dir,$shell) = getpwnam($1); if ($dir) { $rname = $fname; $rname =~ s#^/~$1#$dir/$UserDir#; if (-e "$rname/$DirectoryIndex") { if ($DirectoryRedirect) { $rcode = 302; last FNAME; } $rname .= "/$DirectoryIndex"; } $fname .= '/'; } else { $rcode = 404; } last FNAME; } foreach $alias ( keys %AllScripts ) # Is it a script directory alias? { if ( $fname =~ /^$alias/ ) { $fsize = '-'; last FNAME; } } if (-d "$DocumentRoot$fname") # Is it a directory? { $hasSlash = ($fname =~ s/\/$//); # Remove any trailing slash if (-e "$DocumentRoot$fname/$DirectoryIndex") { if (!$hasSlash && $DirectoryRedirect) { $rcode = 302; last FNAME; } $rname = "$DocumentRoot$fname/$DirectoryIndex"; } else { $rname = "$DocumentRoot$fname"; } $fname .= '/'; last FNAME; } $rname = "$DocumentRoot$fname"; # It must be a normal file } # end FNAME $xname = 0; if (!$fsize && ($rcode == 200) && $rname) # Get the file size { # through use of a cache of Sizes ($fsize = $Sizes{$fname}) || ($fsize = $Sizes{$fname} = (-s $rname)) || ($xname = 1); } if ($xname) { $rcode = 404; } if (!(($method eq 'GET')||($method eq 'HEAD')||($method eq 'POST'))) { $rcode = 400; } if ($rcode != 200) { $fsize = '-'; } elsif ($method eq 'HEAD') { $fsize = '0'; } if ($htv) { $oname .= ' '. $htv; } # # Phew! Now we have to swap the date format around # $newdate = substr($date, 8, 2) .'/'. substr($date, 4, 3) .'/'. substr($date,20, 4) .':'. substr($date,11, 9) . $GMToffset; $newdate =~ s/^ /0/; # # Now that we have categorized it, print it in the new format # print($afield,' ',$ident,' - [',$newdate,'] "',$method,' ',$oname, '" ',$rcode,' ',$fsize," \n"); } close LOG; exit(0); cgi-bin/stats/wwwstat-2.0/splitlog.ps0000640000372000001540000011461607005603741017416 0ustar affweblibuuid%!PS-Adobe-1.0 %%DocumentFonts: %%Creator: troff->tpscript %%CreationDate: Sun Nov 3 18:39:11 1996 %%Pages: (atend) %%EndComments /vmstat save def initmatrix 0.1000 dup scale clippath pathbbox pop pop exch pop 0 exch translate clippath pathbbox /pgtop exch def pop pop pop /page { copypage erasepage restore save home } def /home { newpath 0 pgtop moveto } def /mf { statusdict /manualfeed true put } def /af { statusdict /manualfeed false put } def af 0 0 moveto 2 setlinecap /y { neg 0 exch rmoveto } def /X { currentpoint exch pop moveto } def /Y { pgtop exch sub currentpoint pop exch moveto } def /s { show } def /l { neg rlineto currentpoint stroke moveto } def /c { 2 div /rad exch def currentpoint /y0 exch def /x0 exch def newpath x0 rad add y0 rad 0 360 arc stroke x0 rad add rad add y0 moveto } def /a { /y2 exch neg def /x2 exch def /y1 exch neg def /x1 exch def x1 y1 rmoveto currentpoint currentpoint x2 x2 mul y2 y2 mul add sqrt y1 neg x1 neg atan y2 x2 atan newpath arc stroke moveto x2 y2 rmoveto } def /e { 2 div /yrad exch def 2 div /xrad exch def currentpoint /y0 exch def /x0 exch def x0 xrad add y0 translate xrad yrad scale newpath 0 0 1 0 360 arc savematrix setmatrix stroke x0 xrad add xrad add y0 moveto } def /spln { rcurveto currentpoint stroke moveto } def /ft { /fonttype exch def /xsiz exch def /ysiz exch def /sl exch def fonttype [ xsiz pt 0 sl sin sl cos div ysiz pt mul ysiz pt 0 0 ] makefont setfont xsiz 1.7 div setlinewidth } def /pt { 10 mul } def -90 230 translate /savematrix matrix currentmatrix def /BracketFontDict 9 dict def /$workingdict 10 dict def BracketFontDict begin /FontType 3 def /FontName (Bracket) cvn def /FontMatrix [ 0.001 0 0 0.001 0 0] def /FontBBox [ -50 -250 1000 1000 ] def /Encoding 256 array def 0 1 255 { Encoding exch /.notdef put } for Encoding dup 65 /Cbv put dup 66 /Clt put dup 67 /Clk put dup 68 /Clb put dup 69 /Crt put dup 70 /Crk put dup 71 /Crb put dup 72 /Clc put dup 73 /Clf put dup 74 /Crc put dup 75 /Crf put dup 76 /Cbr put dup 77 /Crn put dup 78 /Cci put dup 79 /C|| put dup 80 /C^^ put dup 81 /Cr1 put dup 82 /Cr2 put pop /CharProcs 24 dict dup begin /setC { 0 -50 -250 500 1000 setcachedevice} def /C.bv {220 -250 moveto 0 1000 rlineto 60 0 rlineto 0 -1000 rlineto fill } def /C.barc { 750 moveto 180 0 rlineto 0 -60 rlineto -180 0 rlineto fill } def /C.barf { -250 moveto 180 0 rlineto 0 60 rlineto -180 0 rlineto fill } def /C.brk.end { 1 setlinewidth moveto rlineto rcurveto reversepath 60 0 rlineto rlineto rcurveto fill } def /C.setl {dup dtransform exch round exch idtransform pop setlinewidth } def /Cbv { 500 setC C.bv } def /Clt { 500 setC 0 150 50 210 140 250 0 730 0 150 50 250 200 250 0 750 220 -250 C.brk.end } def /Clk { 500 setC 1 setlinewidth 220 -250 moveto 0 400 rlineto 0 50 -50 100 -100 100 rcurveto 50 0 100 50 100 100 rcurveto 0 400 rlineto 60 0 rlineto 0 -400 rlineto 0 -50 -50 -100 -100 -100 rcurveto 50 0 100 -50 100 -100 rcurveto 0 -400 rlineto closepath fill } def /Clb { 500 setC 0 -150 50 -210 140 -250 0 -730 0 -150 50 -250 200 -250 0 -750 220 750 C.brk.end } def /Crt { 500 setC 0 150 -50 250 -200 250 0 750 0 150 -50 210 -140 250 0 730 220 -250 C.brk.end } def /Crk { 500 setC 1 setlinewidth 220 -250 moveto 0 400 rlineto 0 50 50 100 100 100 rcurveto -50 0 -100 50 -100 100 rcurveto 0 400 rlineto 60 0 rlineto 0 -400 rlineto 0 -50 50 -100 100 -100 rcurveto -50 0 -100 -50 -100 -100 rcurveto 0 -400 rlineto fill } def /Crb { 500 setC 0 -150 -50 -250 -200 -250 0 -750 0 -150 -50 -210 -140 -250 0 -730 220 750 C.brk.end } def /Clc { 500 setC C.bv 280 C.barc } def /Clf { 500 setC C.bv 280 C.barf } def /Crc { 500 setC C.bv 40 C.barc } def /Crf { 500 setC C.bv 40 C.barf } def /Cbr { 0 0 -50 -250 0 1000 setcachedevice 40 C.setl 0 -250 moveto 0 1000 rlineto stroke } def /Crn { 500 setC 40 C.setl 0 895 moveto 500 0 rlineto stroke } def /Cci { 1000 0 -50 -250 1000 1000 setcachedevice 40 C.setl 500 250 400 0 360 arc stroke } def /C|| { 170 0 -50 -250 170 1000 setcachedevice } def /C^^ { 80 0 -50 -250 80 1000 setcachedevice } def /Cr1 { 800 0 -50 -250 800 1000 setcachedevice 40 C.setl 0 setlinejoin 700 180 moveto -650 currentlinewidth add 0 rlineto 200 -200 rlineto 50 360 moveto 650 currentlinewidth sub 0 rlineto -200 200 rlineto stroke } def /Cr2 { 800 0 -50 -250 800 1000 setcachedevice 40 C.setl 2 setlinejoin 217 18 moveto -150 150 rlineto 150 150 rlineto -150 -150 rlineto 633 0 rlineto 50 360 moveto 633 0 rlineto -150 150 rlineto 150 -150 rlineto -150 -150 rlineto stroke } def end def /BuildChar { $workingdict begin /charcode exch def /fontdict exch def fontdict /CharProcs get begin fontdict /Encoding get charcode get load gsave 0 setlinecap 0 setgray newpath exec grestore end end } def end /BracketFont BracketFontDict definefont pop /f.R /Times-Roman findfont def /f.I /Times-Italic findfont def /f.B /Times-Bold findfont def /f.BI /Times-BoldItalic findfont def /f.H /Helvetica findfont def /f.HB /Helvetica-Bold findfont def /f.HO /Helvetica-Oblique findfont def /f.HX /Helvetica-BoldOblique findfont def /f.C /Courier findfont def /f.CB /Courier-Bold findfont def /f.CO /Courier-Oblique findfont def /f.CX /Courier-BoldOblique findfont def /f.BR /Bookman-Light findfont def /f.BO /Bookman-LightItalic findfont def /f.BB /Bookman-Demi findfont def /f.BX /Bookman-DemiItalic findfont def /f.S /Symbol findfont def /f.S2 /BracketFont findfont def 0.0 10 10 f.R ft save home %%EndProlog 0 Y %%Page: 1 1 694 X 480 Y(splitlog)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\()s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(1)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\))s 2586 X(USER COMMANDS )s 4906 X(splitlog)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\()s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(1)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\))s 694 X 960 Y 0.0 9 9 f.B ft(NAME)s 992 X 0.0 9 9 f.S2 ft(O)s 1030 X(O)s 1068 X(O)s 1106 X(O)s 1144 X(O)s 694 X 1080 Y 1054 X 0.0 10 10 f.R ft(splitlog)s 1380 X(\261)s 1455 X(split)s 1653 X(WWW)s 1960 X(server)s 2228 X(\(httpd\))s 2525 X(access)s 2804 X(log\256les)s 694 X 1248 Y 0.0 9 9 f.B ft(SYNOPSIS)s 1157 X 0.0 9 9 f.S2 ft(O)s 1195 X(O)s 1233 X(O)s 1271 X(O)s 1309 X(O)s 694 X 1368 Y 1054 X 0.0 10 10 f.B ft(splitlog)s 1391 X 0.0 10 10 f.R ft([)s 0.0 10 10 f.B ft(\261f)s 1532 X 0.0 10 10 f.I ft(con\256g\256le)s 0.0 10 10 f.S2 ft(P)s 0.0 10 10 f.R ft(])s 1964 X([)s 0.0 10 10 f.I ft(options)s 0.0 10 10 f.S2 ft(P)s 0.0 10 10 f.R ft(...])s 2433 X([)s 0.0 10 10 f.B ft(--)s 0.0 10 10 f.R ft(])s 2590 X([)s 2648 X 0.0 10 10 f.I ft(log\256le)s 0.0 10 10 f.S2 ft(P)s 2931 X 0.0 10 10 f.R ft(|)s 2976 X 0.0 10 10 f.B ft(+)s 3058 X 0.0 10 10 f.R ft(|)s 3103 X 0.0 10 10 f.B ft(\261)s 3178 X 0.0 10 10 f.R ft(]...)s 694 X 1536 Y 0.0 9 9 f.B ft(DESCRIPTION)s 1342 X 0.0 9 9 f.S2 ft(O)s 1380 X(O)s 1418 X(O)s 1456 X(O)s 1494 X(O)s 694 X 1656 Y 1054 X 0.0 10 10 f.B ft(splitlog)s 1395 X 0.0 10 10 f.R ft(reads)s 1634 X(a)s 1707 X(sequence)s 2101 X(of)s 2213 X 0.0 10 10 f.B ft(httpd)s 2476 X 0.0 10 10 f.R ft(common)s 2855 X(log\256le)s 3140 X(format)s 3435 X(\(CLF\))s 3714 X(access_log)s 4174 X(\256les)s 4369 X(and/or)s 4652 X(the)s 4802 X(standard)s 5168 X(input)s 694 X 1776 Y 1054 X(and)s 1223 X(splits)s 1460 X(the)s 1607 X(log\256le)s 1888 X(entries)s 2179 X(into)s 2360 X(separate)s 2711 X(\256les)s 2903 X(according)s 3321 X(to)s 3424 X(the)s 3571 X(entry's)s 3873 X(requested)s 4280 X(URL)s 4505 X(or)s 4613 X(virtual)s 4899 X(host)s 5091 X(pre\256x.)s 694 X 1944 Y 1054 X 0.0 10 10 f.B ft(splitlog)s 1393 X 0.0 10 10 f.R ft(is)s 1487 X(intended)s 1858 X(to)s 1963 X(be)s 2084 X(run)s 2244 X(periodically)s 2748 X(by)s 2875 X(the)s 3024 X(webmaster)s 3483 X(as)s 3593 X(a)s 3664 X(means)s 3946 X(for)s 4089 X(providing)s 4505 X(individual)s 4937 X(log\256les)s 5258 X(for)s 694 X 2064 Y 1054 X(each)s 1267 X(of)s 1381 X(the)s 1534 X(customers)s 1970 X(of)s 2084 X(a)s 2159 X(server,)s 2458 X(since)s 2694 X(it)s 2780 X(is)s 2877 X(less)s 3057 X(e)s /Cff { (f) show xsiz pt 20 div neg 0 rmoveto (f) s } def Cff(icient)s 3414 X(for)s 3560 X(the)s 3712 X(server)s 3985 X(itself)s 4215 X(to)s 4323 X(generate)s 4690 X(multiple)s 5054 X(log\256les.)s 694 X 2184 Y 1054 X 0.0 10 10 f.B ft(splitlog)s 1402 X 0.0 10 10 f.R ft(does)s 1621 X(not)s 1785 X(make)s 2037 X(any)s 2217 X(changes)s 2574 X(to)s 2688 X(the)s 2846 X(input)s 3088 X(\256le)s 3252 X(and)s 3432 X(can)s 3606 X(be)s 3735 X(con\256gured)s 4197 X(to)s 4310 X(write)s 4550 X(the)s 4707 X(split)s 4915 X(\256les)s 5117 X(in)s 5230 X(any)s 694 X 2304 Y 1054 X(directory.)s 1470 X(By)s 1618 X(default,)s 1951 X(a)s 2026 X(cached)s 2333 X(DNS)s 2564 X(lookup)s 2873 X(is)s 2971 X(performed)s 3416 X(on)s 3546 X(any)s 3720 X(IP)s 3839 X(addresses)s 4251 X(which)s 4525 X(are)s 4676 X(unresolved)s 5144 X(in)s 5252 X(the)s 694 X 2424 Y 1054 X(input)s 1305 X(\256le.)s 1528 X(The)s 1728 X(log)s 1901 X(entries)s 2212 X(can)s 2395 X(also)s 2601 X(be)s 2740 X(anonymized)s 3273 X(if)s 3379 X(there)s 3623 X(are)s 3789 X(concerns)s 4188 X(about)s 4454 X(the)s 4620 X(requesting)s 5080 X(clients')s 694 X 2544 Y 1054 X(privacy.)s 694 X 2712 Y 1054 X 0.0 10 10 f.B ft(splitlog)s 1399 X 0.0 10 10 f.R ft(is)s 1498 X(a)s 1574 X 0.0 10 10 f.B ft(perl)s 1778 X 0.0 10 10 f.R ft(script,)s 2057 X(which)s 2333 X(means)s 2620 X(you)s 2802 X(need)s 3022 X(to)s 3132 X(have)s 3352 X(a)s 3428 X 0.0 10 10 f.B ft(perl)s 3632 X 0.0 10 10 f.R ft(interpreter)s 4079 X(to)s 4189 X(run)s 4354 X(the)s 4508 X(program.)s 4928 X(It)s 5021 X(has)s 5186 X(been)s 694 X 2832 Y 1054 X(tested)s 1312 X(with)s 1515 X 0.0 10 10 f.B ft(perl)s 1712 X 0.0 10 10 f.R ft(versions)s 2070 X(4.036)s 2320 X(and)s 2489 X(5.002.)s 694 X 3000 Y 0.0 9 9 f.B ft(OPTIONS)s 1122 X 0.0 9 9 f.S2 ft(O)s 1160 X(O)s 1198 X(O)s 1236 X(O)s 1274 X(O)s 694 X 3120 Y 874 X 0.0 9 9 f.B ft(Con\256guration)s 1437 X 0.0 9 9 f.S2 ft(O)s 0.0 9 9 f.B ft(Options)s 1780 X 0.0 9 9 f.S2 ft(O)s 1818 X(O)s 1856 X(O)s 1894 X(O)s 694 X 3240 Y 1054 X 0.0 10 10 f.R ft(These)s 1317 X(options)s 1637 X(de\256ne)s 1906 X(how)s 2103 X 0.0 10 10 f.B ft(splitlog)s 2440 X 0.0 10 10 f.R ft(should)s 2732 X(establish)s 3107 X(defaults)s 3448 X(and)s 3617 X(interpret)s 3980 X(the)s 4127 X(command-line.)s 694 X 3408 Y 1054 X 0.0 10 10 f.B ft(\261f)s 1162 X 0.0 10 10 f.I ft(\256lename)s 694 X 3528 Y 1414 X 0.0 10 10 f.R ft(Get)s 1590 X(the)s 1743 X(con\256guration)s 2307 X(defaults)s 2654 X(from)s 2879 X(the)s 3032 X(given)s 3285 X(\256le.)s 3494 X(If)s 3591 X(used,)s 3830 X(this)s 4006 X 0.0 10 10 f.B ft(must)s 4248 X 0.0 10 10 f.R ft(be)s 4373 X(the)s 4526 X(\256rst)s 4713 X(argument)s 5121 X(on)s 5252 X(the)s 694 X 3648 Y 1414 X(command-line,)s 2067 X(since)s 2323 X(it)s 2430 X(needs)s 2708 X(to)s 2837 X(be)s 2982 X(interpreted)s 3465 X(before)s 3770 X(the)s 3943 X(other)s 4199 X(command)s 4644 X(options.)s 5040 X(The)s 5246 X(\256le)s 694 X 3768 Y 1414 X 0.0 10 10 f.B ft(splitlog.rc)s 1868 X 0.0 10 10 f.R ft(is)s 1964 X(included)s 2337 X(with)s 2544 X(the)s 2695 X(distribution)s 3186 X(as)s 3297 X(an)s 3419 X(example)s 3785 X(of)s 3896 X(this)s 4069 X(\256le;)s 4253 X(it)s 4337 X(contains)s 4698 X 0.0 10 10 f.B ft(perl)s 4898 X 0.0 10 10 f.R ft(source)s 5186 X(code)s 694 X 3888 Y 1414 X(which)s 1685 X(directly)s 2016 X(sets)s 2192 X(the)s 2340 X(control)s 2649 X(and)s 2819 X(display)s 3134 X(options)s 3455 X(provided)s 3836 X(by)s 3962 X 0.0 10 10 f.B ft(splitlog)s 4300 X 0.0 10 10 f.R ft(and)s 4470 X(contains)s 4829 X(a)s 4899 X(function)s 5258 X(for)s 694 X 4008 Y 1414 X(altering)s 1749 X(the)s 1901 X(split)s 2104 X(log\256le)s 2390 X(name-selection)s 3024 X(algorithm.)s 3493 X(If)s 3589 X 0.0 10 10 f.I ft(\256lename)s 3957 X 0.0 10 10 f.R ft(is)s 4054 X(not)s 4212 X(a)s 4286 X(pathname,)s 4728 X(the)s 4879 X(include)s 5202 X(path)s 694 X 4128 Y 1414 X(\(see)s 1608 X 0.0 10 10 f.B ft(FILES)s 0.0 10 10 f.R ft(\))s 1965 X(is)s 2066 X(searched)s 2448 X(for)s 2598 X 0.0 10 10 f.I ft(\256lename)s 0.0 10 10 f.S2 ft(P)s 0.0 10 10 f.R ft(.)s 3028 X(An)s 3184 X(empty)s 3468 X(string)s 3729 X(as)s 3845 X 0.0 10 10 f.I ft(\256lename)s 4216 X 0.0 10 10 f.R ft(will)s 4405 X(disable)s 4721 X(this)s 4899 X(feature.)s 5258 X([)s 0.0 10 10 f.B ft(\261f)s 694 X 4248 Y 1414 X 0.0 10 10 f.R ft("splitlog.rc"])s 694 X 4416 Y 1054 X 0.0 10 10 f.B ft(--)s 1414 X 0.0 10 10 f.R ft(Last)s 1611 X(option)s 1892 X(\(the)s 2072 X(remaining)s 2502 X(arguments)s 2943 X(are)s 3089 X(treated)s 3385 X(as)s 3493 X(input)s 3724 X(\256les\).)s 694 X 4584 Y 874 X 0.0 9 9 f.B ft(Diagnostic)s 1302 X 0.0 9 9 f.S2 ft(O)s 0.0 9 9 f.B ft(Options)s 1645 X 0.0 9 9 f.S2 ft(O)s 1683 X(O)s 1721 X(O)s 1759 X(O)s 694 X 4704 Y 1054 X 0.0 10 10 f.R ft(These)s 1333 X(options)s 1669 X(provide)s 2015 X(information)s 2528 X(about)s 2791 X 0.0 10 10 f.B ft(splitlog)s 3144 X 0.0 10 10 f.R ft(usage)s 3412 X(or)s 3536 X(about)s 3798 X(some)s 4049 X(unusual)s 4400 X(aspects)s 4728 X(of)s 4851 X(the)s 5013 X(log\256le\(s\))s 694 X 4824 Y 1054 X(being)s 1301 X(processed.)s 694 X 4992 Y 1054 X 0.0 10 10 f.B ft(\261h)s 1414 X 0.0 10 10 f.R ft(Help)s 1633 X(\320)s 1758 X(display)s 2072 X(usage)s 2324 X(information)s 2821 X(to)s 2924 X(STDERR)s 3333 X(and)s 3502 X(then)s 3699 X(exit.)s 694 X 5160 Y 1054 X 0.0 10 10 f.B ft(\261e)s 1414 X 0.0 10 10 f.R ft(Display)s 1752 X(to)s 1857 X(STDERR)s 2268 X(all)s 2395 X(invalid)s 2700 X(log)s 2855 X(entries.)s 3173 X(Invalid)s 3483 X(log)s 3638 X(entries)s 3931 X(can)s 4096 X(occur)s 4343 X(if)s 4430 X(the)s 4578 X(server)s 4847 X(is)s 4940 X(miswriting)s 694 X 5280 Y 1414 X(or)s 1533 X(overwriting)s 2035 X(its)s 2166 X(own)s 2374 X(log,)s 2563 X(if)s 2660 X(the)s 2818 X(request)s 3142 X(is)s 3245 X(made)s 3497 X(by)s 3633 X(a)s 3712 X(broken)s 4024 X(client)s 4281 X(or)s 4399 X(proxy,)s 4692 X(or)s 4810 X(if)s 4906 X(a)s 4985 X(malicious)s 694 X 5400 Y 1414 X(attacker)s 1754 X(is)s 1846 X(trying)s 2110 X(to)s 2213 X(gain)s 2410 X(privileged)s 2840 X(access)s 3119 X(to)s 3222 X(your)s 3430 X(system.)s 694 X 5568 Y 874 X 0.0 9 9 f.B ft(Process)s 1187 X 0.0 9 9 f.S2 ft(O)s 0.0 9 9 f.B ft(Options)s 1530 X 0.0 9 9 f.S2 ft(O)s 1568 X(O)s 1606 X(O)s 1644 X(O)s 694 X 5688 Y 1054 X 0.0 10 10 f.R ft(These)s 1317 X(options)s 1637 X(modify)s 1951 X(how)s 2148 X(and)s 2317 X(where)s 2585 X(log\256le)s 2866 X(entries)s 3157 X(are)s 3303 X(written.)s 694 X 5856 Y 1054 X 0.0 10 10 f.B ft(\261x)s 1414 X 0.0 10 10 f.R ft(Discard)s 1788 X(any)s 1996 X(log\256le)s 2316 X(entries)s 2646 X(without)s 3016 X(a)s 3123 X(\256lename)s 3530 X(key)s 3737 X(instead)s 4083 X(of)s 4229 X(placing)s 4586 X(them)s 4849 X(in)s 4990 X(a)s 5097 X(special)s 694 X 5976 Y 1414 X(OTHERS.log.)s 694 X 6144 Y 1054 X 0.0 10 10 f.B ft(\261v)s 1414 X 0.0 10 10 f.R ft(Use)s 1613 X(a)s 1701 X(pre\256x)s 1978 X(of)s 2105 X(the)s 2270 X(input)s 2519 X(\256le)s 2690 X(entries)s 2999 X(\(ended)s 3313 X(by)s 3456 X(the)s 3621 X(\256rst)s 3820 X(":")s 3973 X(or)s 4099 X(space\))s 4396 X(for)s 4555 X(selecting)s 4953 X(the)s 5118 X(output)s 694 X 6264 Y 1414 X(\256lename)s 1791 X(instead)s 2107 X(of,)s 2248 X(or)s 2364 X(in)s 2475 X(addition)s 2836 X(to,)s 2972 X(the)s 3127 X(URL)s 3360 X(path.)s 3615 X(The)s 3803 X(most)s 4030 X(likely)s 4290 X(use)s 4455 X(for)s 4603 X(such)s 4818 X(a)s 4894 X(pre\256x)s 5159 X(is)s 5258 X(for)s 694 X 6384 Y 1414 X(the)s 1561 X(requested)s 1968 X(virtual)s 2254 X(host.)s 694 X 6552 Y 1054 X 0.0 10 10 f.B ft(\261dir)s 1257 X 0.0 10 10 f.I ft(directory)s 694 X 6672 Y 1414 X 0.0 10 10 f.R ft(Place)s 1655 X(the)s 1802 X(output)s 2083 X(log\256les)s 2403 X(in)s 2506 X(the)s 2653 X(given)s 2900 X(directory)s 3285 X(instead)s 3593 X(of)s 3701 X(the)s 3848 X(current)s 4155 X(working)s 4513 X(directory.)s 694 X 6840 Y 1054 X 0.0 10 10 f.B ft(\261anon)s 1341 X 0.0 10 10 f.I ft(imu)s 694 X 6960 Y 1414 X 0.0 10 10 f.R ft(Anonymize)s 1908 X(the)s 2058 X(log\256le)s 2341 X(entries)s 2634 X(before)s 2915 X(writing)s 3231 X(them)s 3458 X(to)s 3563 X(split)s 3763 X(logs.)s 4007 X(The)s 4189 X(value)s 4432 X(is)s 4526 X(some)s 4764 X(combination)s 5291 X(of)s 694 X 7080 Y 1414 X(the)s 1567 X(letters)s 1842 X("i")s 1983 X(\(ident)s 2247 X(\256eld)s 2456 X(is)s 2553 X(removed\),)s 2990 X("m")s 3180 X(\(machine)s 3581 X(name)s 3827 X(is)s 3924 X(replaced)s 4291 X(with)s 4499 X(ANON)s 4817 X(or)s 4930 X(0\),)s 5068 X(and)s 5242 X("u")s 694 X 7200 Y 1414 X(\(authentication)s 2038 X(userid)s 2307 X(\256eld)s 2510 X(is)s 2602 X(removed\).)s 694 X 7680 Y(Sun Release 4.1)s 2382 X(Last change: 03 November 1996)s 5324 X(1)s 7920 Y page 0.0 10 10 f.R ft %%Page: 2 2 694 X 480 Y(splitlog)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\()s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(1)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\))s 2586 X(USER COMMANDS )s 4906 X(splitlog)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\()s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(1)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\))s 694 X 960 Y 1054 X 0.0 10 10 f.B ft(\261dns)s 694 X 1080 Y 1054 X(\261nodns)s 1414 X 0.0 10 10 f.R ft(Do)s 1589 X(\()s 0.0 10 10 f.B ft(\261dns)s 0.0 10 10 f.R ft(\))s 1909 X(or)s 2045 X(don't)s 2309 X(\()s 0.0 10 10 f.B ft(\261nodns)s 0.0 10 10 f.R ft(\))s 2735 X(use)s 2921 X(the)s 3096 X(system's)s 3499 X(hostname)s 3935 X(lookup)s 4266 X(facilities)s 4662 X(to)s 4792 X(\256nd)s 5000 X(the)s 5174 X(DNS)s 694 X 1200 Y 1414 X(hostname)s 1837 X(associated)s 2287 X(with)s 2505 X(any)s 2689 X(unresolved)s 3167 X(IP)s 3296 X(addresses.)s 3743 X(Looking)s 4122 X(up)s 4262 X(a)s 4346 X(DNS)s 4586 X(name)s 4842 X(may)s 5053 X(be)s 5186 X 0.0 10 10 f.B ft(very)s 694 X 1320 Y 1414 X 0.0 10 10 f.R ft(slow,)s 1654 X(particularly)s 2140 X(when)s 2382 X(the)s 2530 X(results)s 2817 X(are)s 2964 X(negative)s 3328 X(\(no)s 3487 X(DNS)s 3713 X(name\),)s 4013 X(which)s 4283 X(is)s 4376 X(why)s 4574 X(a)s 4644 X(caching)s 4980 X(capability)s 694 X 1440 Y 1414 X(is)s 1506 X(included)s 1875 X(as)s 1983 X(well.)s 2230 X([)s 0.0 10 10 f.B ft(\261dns)s 0.0 10 10 f.R ft(])s 694 X 1608 Y 1054 X 0.0 10 10 f.B ft(\261cache)s 1367 X 0.0 10 10 f.I ft(\256lename)s 694 X 1728 Y 1414 X 0.0 10 10 f.R ft(Use)s 1599 X(the)s 1751 X(given)s 2003 X(DBM)s 2261 X(database)s 2634 X(as)s 2747 X(the)s 2899 X(read/write)s 3333 X(persistent)s 3746 X(DNS)s 3976 X(cache)s 4232 X(\(the)s 4416 X(.dir)s 4581 X(and)s 4754 X(.pag)s 4952 X(extensions)s 694 X 1848 Y 1414 X(are)s 1578 X(appended)s 2003 X(automatically\).)s 2648 X(Cached)s 2990 X(entries)s 3299 X(\(including)s 3753 X(negative)s 4134 X(results\))s 4471 X(are)s 4635 X(removed)s 5027 X(after)s 5252 X(the)s 694 X 1968 Y 1414 X(time)s 1620 X(con\256gured)s 2075 X(for)s 2219 X($DNSexpires)s 2785 X([two)s 2996 X(months].)s 3402 X(No)s 3552 X(caching)s 3890 X(is)s 3985 X(performed)s 4428 X(if)s 4516 X 0.0 10 10 f.I ft(\256lename)s 4881 X 0.0 10 10 f.R ft(is)s 4975 X(the)s 5124 X(empty)s 694 X 2088 Y 1414 X(string,)s 1713 X(which)s 2003 X(may)s 2221 X(be)s 2361 X(needed)s 2689 X(if)s 2795 X(your)s 3023 X(system)s 3346 X(does)s 3574 X(not)s 3747 X(support)s 4092 X(DBM)s 4365 X(or)s 4493 X(NDBM)s 4838 X(functionality.)s 694 X 2208 Y 1414 X(Running)s 1784 X 0.0 10 10 f.B ft(\261dns)s 2010 X 0.0 10 10 f.R ft(without)s 2341 X(a)s 2410 X(persistent)s 2818 X(cache)s 3069 X(is)s 3161 X(not)s 3314 X(recommended.)s 3954 X([)s 0.0 10 10 f.B ft(\261cache)s 4300 X 0.0 10 10 f.R ft("dnscache"])s 694 X 2376 Y 874 X 0.0 9 9 f.B ft(Search)s 1162 X 0.0 9 9 f.S2 ft(O)s 0.0 9 9 f.B ft(Options)s 1505 X 0.0 9 9 f.S2 ft(O)s 1543 X(O)s 1581 X(O)s 1619 X(O)s 694 X 2496 Y 1054 X 0.0 10 10 f.R ft(These)s 1323 X(options)s 1649 X(are)s 1801 X(used)s 2015 X(to)s 2124 X(include)s 2449 X(or)s 2563 X(exclude)s 2904 X(log\256le)s 3191 X(entries)s 3488 X(from)s 3713 X(being)s 3965 X(output)s 4251 X(according)s 4674 X(to)s 4782 X(whether)s 5133 X(or)s 5246 X(not)s 694 X 2616 Y 1054 X(they)s 1259 X(match)s 1536 X(a)s 1613 X(given)s 1867 X(pattern.)s 2226 X(The)s 2413 X(pattern)s 2722 X(is)s 2821 X(supplied)s 3192 X(in)s 3302 X(the)s 3456 X(form)s 3682 X(of)s 3797 X(a)s 3873 X 0.0 10 10 f.B ft(perl)s 4077 X(regular)s 4425 X(expression)s 0.0 10 10 f.R ft(,)s 4932 X(except)s 5224 X(that)s 694 X 2736 Y 1054 X(the)s 1216 X(characters)s 1659 X("+")s 1837 X(and)s 2020 X(".")s 2166 X(are)s 2326 X(escaped)s 2680 X(automatically)s 3263 X(unless)s 3552 X(the)s 3713 X 0.0 10 10 f.B ft(\261noescape)s 4185 X 0.0 10 10 f.R ft(option)s 4480 X(is)s 4586 X(given.)s 4897 X(Enclose)s 5252 X(the)s 694 X 2856 Y 1054 X(pattern)s 1363 X(in)s 1472 X(single-quotes)s 2036 X(to)s 2145 X(prevent)s 2475 X(the)s 2628 X(command)s 3053 X(shell)s 3273 X(from)s 3498 X(interpreting)s 3995 X(some)s 4237 X(special)s 4545 X(characters.)s 5029 X(Multiple)s 694 X 2976 Y 1054 X(occurrences)s 1554 X(of)s 1662 X(the)s 1809 X(same)s 2039 X(option)s 2320 X(results)s 2606 X(in)s 2709 X(an)s 2828 X(OR-ing)s 3153 X(of)s 3261 X(the)s 3408 X(regular)s 3715 X(expressions.)s 694 X 3144 Y 1054 X 0.0 10 10 f.B ft(\261a)s 1179 X 0.0 10 10 f.I ft(regexp)s 694 X 3264 Y 1054 X 0.0 10 10 f.B ft(\261A)s 1201 X 0.0 10 10 f.I ft(regexp)s 694 X 3384 Y 1414 X 0.0 10 10 f.R ft(Include)s 1739 X(\()s 0.0 10 10 f.B ft(\261a)s 0.0 10 10 f.R ft(\))s 1930 X(or)s 2038 X(exclude)s 2373 X(\()s 0.0 10 10 f.B ft(\261A)s 0.0 10 10 f.R ft(\))s 2586 X(all)s 2711 X(requests)s 3063 X(containing)s 3510 X(a)s 3579 X(hostname/IP)s 4104 X(address)s 4428 X(matching)s 4825 X(the)s 4972 X(given)s 5219 X(perl)s 694 X 3504 Y 1414 X(regular)s 1721 X(expression.)s 694 X 3672 Y 1054 X 0.0 10 10 f.B ft(\261c)s 1173 X 0.0 10 10 f.I ft(regexp)s 694 X 3792 Y 1054 X 0.0 10 10 f.B ft(\261C)s 1201 X 0.0 10 10 f.I ft(regexp)s 694 X 3912 Y 1414 X 0.0 10 10 f.R ft(Include)s 1739 X(\()s 0.0 10 10 f.B ft(\261c)s 0.0 10 10 f.R ft(\))s 1925 X(or)s 2034 X(exclude)s 2370 X(\()s 0.0 10 10 f.B ft(\261C)s 0.0 10 10 f.R ft(\))s 2584 X(all)s 2710 X(requests)s 3063 X(resulting)s 3439 X(in)s 3543 X(an)s 3663 X 0.0 10 10 f.B ft(HTTP)s 3962 X 0.0 10 10 f.R ft(status)s 4215 X(code)s 4428 X(matching)s 4825 X(the)s 4972 X(given)s 5219 X(perl)s 694 X 4032 Y 1414 X(regular)s 1721 X(expression.)s 694 X 4200 Y 1054 X 0.0 10 10 f.B ft(\261d)s 1185 X 0.0 10 10 f.I ft(regexp)s 694 X 4320 Y 1054 X 0.0 10 10 f.B ft(\261D)s 1201 X 0.0 10 10 f.I ft(regexp)s 694 X 4440 Y 1414 X 0.0 10 10 f.R ft(Include)s 1746 X(\()s 0.0 10 10 f.B ft(\261d)s 0.0 10 10 f.R ft(\))s 1951 X(or)s 2067 X(exclude)s 2410 X(\()s 0.0 10 10 f.B ft(\261D)s 0.0 10 10 f.R ft(\))s 2631 X(all)s 2764 X(requests)s 3124 X(occurring)s 3539 X(on)s 3672 X(a)s 3749 X(date)s 3948 X(\(e.g.,)s 4183 X("Feb)s 4407 X(02)s 4540 X(1994"\))s 4847 X(matching)s 5252 X(the)s 694 X 4560 Y 1414 X(given)s 1661 X(perl)s 1841 X(regular)s 2148 X(expression.)s 694 X 4728 Y 1054 X 0.0 10 10 f.B ft(\261t)s 1162 X 0.0 10 10 f.I ft(regexp)s 694 X 4848 Y 1054 X 0.0 10 10 f.B ft(\261T)s 1196 X 0.0 10 10 f.I ft(regexp)s 694 X 4968 Y 1414 X 0.0 10 10 f.R ft(Include)s 1749 X(\()s 0.0 10 10 f.B ft(\261t)s 0.0 10 10 f.R ft(\))s 1934 X(or)s 2053 X(exclude)s 2399 X(\()s 0.0 10 10 f.B ft(\261T)s 0.0 10 10 f.R ft(\))s 2618 X(all)s 2754 X(requests)s 3117 X(occurring)s 3535 X(during)s 3832 X(the)s 3990 X(hour)s 4209 X(\(e.g.,)s 4446 X("23")s 4663 X(is)s 4765 X(11pm)s 5028 X(\261)s 5113 X(12pm\))s 694 X 5088 Y 1414 X(matching)s 1811 X(the)s 1958 X(given)s 2205 X(perl)s 2385 X(regular)s 2692 X(expression.)s 694 X 5256 Y 1054 X 0.0 10 10 f.B ft(\261m)s 1212 X 0.0 10 10 f.I ft(regexp)s 694 X 5376 Y 1054 X 0.0 10 10 f.B ft(\261M)s 1223 X 0.0 10 10 f.I ft(regexp)s 694 X 5496 Y 1414 X 0.0 10 10 f.R ft(Include)s 1748 X(\()s 0.0 10 10 f.B ft(\261m)s 0.0 10 10 f.R ft(\))s 1982 X(or)s 2100 X(exclude)s 2445 X(\()s 0.0 10 10 f.B ft(\261M)s 0.0 10 10 f.R ft(\))s 2690 X(all)s 2825 X(requests)s 3187 X(using)s 3438 X(an)s 3566 X(HTTP)s 3850 X(method)s 4184 X(\(e.g.,)s 4420 X("HEAD"\))s 4846 X(matching)s 5252 X(the)s 694 X 5616 Y 1414 X(given)s 1661 X(perl)s 1841 X(regular)s 2148 X(expression.)s 694 X 5784 Y 1054 X 0.0 10 10 f.B ft(\261n)s 1185 X 0.0 10 10 f.I ft(regexp)s 694 X 5904 Y 1054 X 0.0 10 10 f.B ft(\261N)s 1201 X 0.0 10 10 f.I ft(regexp)s 694 X 6024 Y 1414 X 0.0 10 10 f.R ft(Include)s 1739 X(\()s 0.0 10 10 f.B ft(\261n)s 0.0 10 10 f.R ft(\))s 1937 X(or)s 2046 X(exclude)s 2382 X(\()s 0.0 10 10 f.B ft(\261N)s 0.0 10 10 f.R ft(\))s 2596 X(all)s 2722 X(requests)s 3075 X(on)s 3201 X(a)s 3271 X(URL)s 3496 X(\(archive)s 3847 X(name\))s 4121 X(matching)s 4518 X(the)s 4665 X(given)s 4912 X(perl)s 5092 X(regular)s 694 X 6144 Y 1414 X(expression.)s 694 X 6312 Y 1054 X 0.0 10 10 f.B ft(\261noescape)s 694 X 6432 Y 1414 X 0.0 10 10 f.R ft(Do)s 1561 X(not)s 1714 X(escape)s 2004 X(the)s 2151 X(special)s 2453 X(characters)s 2881 X(\("+")s 3077 X(and)s 3246 X("."\))s 3411 X(in)s 3514 X(the)s 3661 X(remaining)s 4091 X(search)s 4370 X(options.)s 694 X 6600 Y 0.0 9 9 f.B ft(INPUT)s 997 X 0.0 9 9 f.S2 ft(O)s 1035 X(O)s 1073 X(O)s 1111 X(O)s 1149 X(O)s 694 X 6720 Y 1054 X 0.0 10 10 f.R ft(After)s 1291 X(parsing)s 1611 X(the)s 1759 X(options,)s 2105 X(the)s 2253 X(remaining)s 2684 X(arguments)s 3126 X(on)s 3252 X(the)s 3400 X(command-line)s 4003 X(are)s 4150 X(treated)s 4447 X(as)s 4556 X(input)s 4788 X(arguments)s 5230 X(and)s 694 X 6840 Y 1054 X(are)s 1200 X(read)s 1396 X(in)s 1499 X(the)s 1646 X(order)s 1881 X(given.)s 2178 X(If)s 2269 X(no)s 2394 X(input)s 2625 X(arguments)s 3066 X(are)s 3212 X(given,)s 3484 X(the)s 3631 X(con\256gured)s 4083 X(default)s 4385 X(log\256le)s 4666 X(is)s 4758 X(read)s 4954 X([)s 0.0 10 10 f.B ft(+)s 0.0 10 10 f.R ft(].)s 694 X 7008 Y 1054 X 0.0 10 10 f.B ft(\261)s 1414 X 0.0 10 10 f.R ft(Read)s 1644 X(from)s 1863 X(standard)s 2226 X(input)s 2457 X(\(STDIN\).)s 694 X 7176 Y 1054 X 0.0 10 10 f.B ft(+)s 1414 X 0.0 10 10 f.R ft(Read)s 1644 X(the)s 1791 X(default)s 2093 X(log\256le.)s 2399 X([as)s 2540 X(con\256gured])s 694 X 7680 Y(Sun Release 4.1)s 2382 X(Last change: 03 November 1996)s 5324 X(2)s 7920 Y page 0.0 10 10 f.R ft %%Page: 3 3 694 X 480 Y(splitlog)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\()s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(1)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\))s 2586 X(USER COMMANDS )s 4906 X(splitlog)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\()s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(1)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\))s 694 X 960 Y 1054 X 0.0 10 10 f.I ft(log\256le)s 0.0 10 10 f.S2 ft(P)s 0.0 10 10 f.R ft(...)s 694 X 1080 Y 1414 X(Read)s 1647 X(the)s 1797 X(given)s 2047 X(log\256le.)s 2381 X(If)s 2475 X(the)s 2625 X 0.0 10 10 f.I ft(log\256le)s 0.0 10 10 f.S2 ft(P)s 0.0 10 10 f.R ft('s)s 2983 X(extension)s 3394 X(indicates)s 3777 X(that)s 3955 X(is)s 4050 X(is)s 4145 X(compressed)s 4644 X(\(gz|z|Z\),)s 5002 X(then)s 5202 X(pipe)s 694 X 1200 Y 1414 X(it)s 1495 X(through)s 1831 X(the)s 1978 X(con\256gured)s 2430 X(decompression)s 3054 X(program)s 3417 X([)s 0.0 10 10 f.B ft(gunzip)s 3765 X(\261c)s 0.0 10 10 f.R ft(])s 3917 X(\256rst.)s 694 X 1368 Y 0.0 9 9 f.B ft(USAGE)s 1027 X 0.0 9 9 f.S2 ft(O)s 1065 X(O)s 1103 X(O)s 1141 X(O)s 1179 X(O)s 694 X 1488 Y 1054 X 0.0 10 10 f.R ft(In)s 1174 X(most)s 1406 X(cases,)s 1678 X 0.0 10 10 f.B ft(splitlog)s 2027 X 0.0 10 10 f.R ft(is)s 2131 X(run)s 2301 X(on)s 2438 X(a)s 2518 X(periodic)s 2881 X(basis)s 3117 X(by)s 3253 X(a)s 3333 X(wrapper)s 3695 X(program)s 4069 X(as)s 4188 X(a)s 4268 X 0.0 10 10 f.B ft(crontab)s 4637 X 0.0 10 10 f.R ft(entry)s 4878 X(shortly)s 5192 X(after)s 694 X 1608 Y 1054 X(midnight,)s 1477 X(typically)s 1863 X(in)s 1977 X(conjunction)s 2485 X(with)s 2699 X(rotating)s 3046 X(the)s 3204 X(current)s 3522 X(log\256le.)s 3864 X(The)s 4054 X 0.0 10 10 f.B ft(\261D)s 4211 X(today)s 4485 X 0.0 10 10 f.R ft(option)s 4776 X(can)s 4949 X(be)s 5078 X(used)s 5296 X(to)s 694 X 1728 Y 1054 X(split)s 1252 X(the)s 1399 X(main)s 1624 X(log\256le)s 1905 X(on)s 2030 X(a)s 2099 X(daily)s 2324 X(basis)s 2549 X(without)s 2880 X(rotation.)s 694 X 1896 Y 1054 X(All)s 1215 X(of)s 1331 X(the)s 1486 X(command-line)s 2096 X(options,)s 2449 X(and)s 2625 X(a)s 2701 X(few)s 2882 X(options)s 3209 X(that)s 3391 X(are)s 3544 X(not)s 3704 X(available)s 4096 X(from)s 4322 X(the)s 4476 X(command-line,)s 5110 X(can)s 5280 X(be)s 694 X 2016 Y 1054 X(changed)s 1411 X(within)s 1692 X(the)s 1839 X(user)s 2030 X(con\256guration)s 2588 X(\256le)s 2741 X(\(see)s 2926 X 0.0 10 10 f.B ft(splitlog.rc)s 0.0 10 10 f.R ft(\).)s 3459 X(This)s 3662 X(\256le)s 3815 X(is)s 3907 X(actually)s 4248 X(a)s 4317 X 0.0 10 10 f.B ft(perl)s 4514 X 0.0 10 10 f.R ft(library)s 4805 X(module)s 5130 X(which)s 694 X 2136 Y 1054 X(is)s 1161 X(executed)s 1554 X(as)s 1676 X(part)s 1870 X(of)s 1992 X(the)s 2153 X(program's)s 2602 X(initialization.)s 3197 X(The)s 3391 X(example)s 3768 X(provided)s 4162 X(with)s 4379 X(the)s 4540 X(distribution)s 5041 X(includes)s 694 X 2256 Y 1054 X(complete)s 1447 X(documentation)s 2068 X(on)s 2195 X(what)s 2416 X(variables)s 2803 X(can)s 2968 X(be)s 3089 X(set)s 3227 X(and)s 3398 X(their)s 3608 X(range)s 3856 X(of)s 3966 X(values.)s 4298 X(If)s 4391 X(the)s 4540 X(default)s 4843 X(algorithm)s 5258 X(for)s 694 X 2376 Y 1054 X(selecting)s 1439 X(the)s 1591 X(split)s 1794 X(log\256le)s 2080 X(name)s 2326 X(isn't)s 2533 X(desired,)s 2875 X(or)s 2987 X(if)s 3077 X(some)s 3317 X(set)s 3457 X(of)s 3569 X(names)s 3853 X(should)s 4149 X(be)s 4272 X(combined)s 4695 X(into)s 4880 X(a)s 4953 X(single)s 5221 X(\256le,)s 694 X 2496 Y 1054 X(then)s 1251 X(uncomment)s 1748 X(the)s 1895 X(user_path_map\(\))s 2596 X(function)s 2954 X(and)s 3123 X(de\256ne)s 3392 X(your)s 3600 X(own)s 3797 X(name-selection)s 4426 X(algorithm.)s 694 X 2664 Y 1054 X(The)s 1241 X 0.0 10 10 f.B ft(wwwstat)s 1644 X 0.0 10 10 f.R ft(program)s 2014 X(can)s 2184 X(be)s 2310 X(used)s 2525 X(to)s 2635 X(analyze)s 2971 X(the)s 3125 X(resulting)s 3507 X(log\256les.)s 3859 X(See)s 4035 X 0.0 10 10 f.B ft(wwwstat)s 4438 X 0.0 10 10 f.R ft(for)s 4586 X(a)s 4662 X(description)s 5138 X(of)s 5252 X(the)s 694 X 2784 Y 1054 X(common)s 1429 X(log\256le)s 1710 X(format.)s 694 X 2952 Y 874 X 0.0 9 9 f.B ft(Perl)s 1057 X 0.0 9 9 f.S2 ft(O)s 0.0 9 9 f.B ft(Regular)s 1405 X 0.0 9 9 f.S2 ft(O)s 0.0 9 9 f.B ft(Expressions)s 1903 X 0.0 9 9 f.S2 ft(O)s 1941 X(O)s 1979 X(O)s 694 X 3072 Y 1054 X 0.0 10 10 f.R ft(The)s 1236 X(Search)s 1533 X(Options)s 1876 X(and)s 2046 X(many)s 2294 X(of)s 2403 X(the)s 2551 X(con\256guration)s 3110 X(\256le)s 3264 X(settings)s 3596 X(allow)s 3844 X(for)s 3986 X(full)s 4151 X(use)s 4310 X(of)s 4419 X(perl)s 4600 X(regular)s 4908 X(expressions)s 694 X 3192 Y 1054 X(\(with)s 1304 X(the)s 1465 X(exception)s 1892 X(that)s 2080 X(the)s 2240 X(\261a,)s 2397 X(\261A,)s 2582 X(\261n)s 2720 X(and)s 2902 X(\261N)s 3062 X(options)s 3395 X(treat)s 3610 X('+')s 3770 X(and)s 3952 X('.')s 4081 X(characters)s 4522 X(as)s 4643 X(normal)s 4964 X(alphabetic)s 694 X 3312 Y 1054 X(characters)s 1508 X(unless)s 1809 X(they)s 2032 X(are)s 2204 X(preceded)s 2614 X(by)s 2765 X(the)s 2938 X 0.0 10 10 f.B ft(\261noescape)s 3422 X 0.0 10 10 f.R ft(option\).)s 3812 X(Most)s 4069 X(people)s 4386 X(only)s 4614 X(need)s 4852 X(to)s 4980 X(know)s 5252 X(the)s 694 X 3432 Y 1054 X(following)s 1468 X(special)s 1770 X(characters:)s 694 X 3600 Y 1054 X 0.0 10 10 f.B ft(\303)s 1454 X 0.0 10 10 f.R ft(at)s 1551 X(start)s 1748 X(of)s 1856 X(pattern,)s 2183 X(means)s 2463 X("starts)s 2740 X(with)s 2943 X(pattern".)s 694 X 3720 Y 1054 X 0.0 10 10 f.B ft($)s 1454 X 0.0 10 10 f.R ft(at)s 1551 X(end)s 1720 X(of)s 1828 X(pattern,)s 2155 X(means)s 2435 X("ends)s 2684 X(with)s 2887 X(pattern".)s 694 X 3840 Y 1054 X 0.0 10 10 f.B ft(\(...\))s 1454 X 0.0 10 10 f.R ft(groups)s 1751 X(pattern)s 2053 X(elements)s 2433 X(as)s 2541 X(a)s 2610 X(single)s 2874 X(element.)s 694 X 3960 Y 1054 X 0.0 10 10 f.B ft(?)s 1454 X 0.0 10 10 f.R ft(matches)s 1806 X(preceding)s 2224 X(element)s 2565 X(zero)s 2761 X(or)s 2869 X(one)s 3038 X(times.)s 694 X 4080 Y 1054 X 0.0 10 10 f.S ft(*)s 1454 X 0.0 10 10 f.R ft(matches)s 1806 X(preceding)s 2224 X(element)s 2565 X(zero)s 2761 X(or)s 2869 X(more)s 3099 X(times.)s 694 X 4200 Y 1054 X 0.0 10 10 f.B ft(+)s 1454 X 0.0 10 10 f.R ft(matches)s 1806 X(preceding)s 2224 X(element)s 2565 X(one)s 2734 X(or)s 2842 X(more)s 3072 X(times.)s 694 X 4320 Y 1054 X 0.0 10 10 f.B ft(.)s 1454 X 0.0 10 10 f.R ft(matches)s 1806 X(any)s 1975 X(single)s 2239 X(character.)s 694 X 4440 Y 1054 X 0.0 10 10 f.B ft([...])s 1454 X 0.0 10 10 f.R ft(denotes)s 1788 X(a)s 1861 X(class)s 2084 X(of)s 2195 X(characters)s 2626 X(to)s 2732 X(match.)s 3029 X([\303...])s 3231 X(negates)s 3558 X(the)s 3708 X(class.)s 3980 X(Inside)s 4252 X(a)s 4324 X(class,)s 4571 X('-')s 4698 X(indicates)s 5081 X(a)s 5153 X(range)s 694 X 4560 Y 1454 X(of)s 1562 X(characters.)s 694 X 4680 Y 1054 X 0.0 10 10 f.B ft(\(A|B|C\))s 1454 X 0.0 10 10 f.R ft(matches)s 1806 X(if)s 1892 X(A)s 1989 X(or)s 2097 X(B)s 2189 X(or)s 2297 X(C)s 2389 X(matches.)s 694 X 4848 Y 1054 X(Depending)s 1523 X(on)s 1654 X(your)s 1868 X(command)s 2293 X(shell,)s 2538 X(some)s 2780 X(special)s 3088 X(characters)s 3521 X(may)s 3723 X(need)s 3941 X(to)s 4049 X(be)s 4173 X(escaped)s 4518 X(on)s 4648 X(the)s 4800 X(command)s 5224 X(line)s 694 X 4968 Y 1054 X(or)s 1162 X(enclosed)s 1536 X(in)s 1639 X(single-quotes)s 2197 X(to)s 2300 X(avoid)s 2547 X(shell)s 2761 X(interpretation.)s 694 X 5136 Y 0.0 9 9 f.B ft(ENVIRONMENT)s 1412 X 0.0 9 9 f.S2 ft(O)s 1450 X(O)s 1488 X(O)s 1526 X(O)s 1564 X(O)s 694 X 5256 Y 1054 X 0.0 10 10 f.B ft(HOME)s 1654 X 0.0 10 10 f.R ft(Location)s 2034 X(of)s 2142 X(user's)s 2405 X(home)s 2652 X(directory,)s 3062 X(placed)s 3347 X(on)s 3472 X(INC)s 3669 X(path.)s 694 X 5424 Y 1054 X 0.0 10 10 f.B ft(LOGDIR)s 1654 X 0.0 10 10 f.R ft(Used)s 1884 X(instead)s 2192 X(of)s 2300 X(HOME)s 2619 X(if)s 2705 X(latter)s 2935 X(is)s 3027 X(unde\256ned.)s 694 X 5592 Y 1054 X 0.0 10 10 f.B ft(PERLLIB)s 1654 X 0.0 10 10 f.R ft(A)s 1751 X(colon-separated)s 2407 X(list)s 2555 X(of)s 2663 X(directories)s 3109 X(in)s 3212 X(which)s 3481 X(to)s 3584 X(look)s 3787 X(for)s 3928 X(the)s 4075 X(user)s 4266 X(con\256guration)s 4824 X(\256le.)s 694 X 5760 Y 0.0 9 9 f.B ft(FILES)s 977 X 0.0 9 9 f.S2 ft(O)s 1015 X(O)s 1053 X(O)s 1091 X(O)s 1129 X(O)s 694 X 5880 Y 1054 X 0.0 10 10 f.R ft(Unless)s 1353 X(a)s 1424 X(pathname)s 1839 X(is)s 1933 X(supplied,)s 2324 X(the)s 2473 X(con\256guration)s 3033 X(\256le)s 3188 X(is)s 3282 X(obtained)s 3653 X(from)s 3873 X(the)s 4021 X(current)s 4329 X(directory,)s 4740 X(the)s 4888 X(user's)s 5152 X(home)s 694 X 6000 Y 1054 X(directory)s 1444 X(\()s 0.0 10 10 f.B ft(HOME)s 1824 X 0.0 10 10 f.R ft(or)s 1937 X 0.0 10 10 f.B ft(LOGDIR)s 0.0 10 10 f.R ft(\),)s 2431 X(the)s 2583 X(standard)s 2951 X(library)s 3247 X(path)s 3449 X(\()s 0.0 10 10 f.B ft(PERLLIB)s 0.0 10 10 f.R ft(\),)s 4010 X(and)s 4184 X(the)s 4336 X(directory)s 4726 X(indicated)s 5122 X(by)s 5252 X(the)s 694 X 6120 Y 1054 X(command)s 1473 X(pathname)s 1886 X(\(in)s 2022 X(that)s 2197 X(order\).)s 694 X 6288 Y 1054 X 0.0 10 10 f.B ft(splitlog.rc)s 1804 X 0.0 10 10 f.R ft(User)s 2017 X(con\256guration)s 2575 X(\256le.)s 694 X 6456 Y 1054 X 0.0 10 10 f.B ft(dnscache.dir)s 694 X 6576 Y 1054 X(dnscache.pag)s 1804 X 0.0 10 10 f.R ft(DBM)s 2057 X(\256les)s 2249 X(for)s 2390 X(persistent)s 2798 X(DNS)s 3023 X(cache.)s 694 X 6744 Y 0.0 9 9 f.B ft(SEE)s 887 X 0.0 9 9 f.S2 ft(O)s 0.0 9 9 f.B ft(ALSO)s 1170 X 0.0 9 9 f.S2 ft(O)s 1208 X(O)s 1246 X(O)s 1284 X(O)s 694 X 6864 Y 1054 X 0.0 10 10 f.B ft(crontab)s 0.0 10 10 f.R ft(\(1\),)s 1553 X 0.0 10 10 f.B ft(httpd)s 0.0 10 10 f.R ft(\(1m\),)s 2031 X 0.0 10 10 f.B ft(perl)s 0.0 10 10 f.R ft(\(1\),)s 2369 X 0.0 10 10 f.B ft(wwwstat)s 0.0 10 10 f.R ft(\(1\))s 694 X 7032 Y 1054 X(More)s 1295 X(info)s 1481 X(and)s 1650 X(the)s 1797 X(latest)s 2033 X(version)s 2352 X(of)s 2460 X(splitlog)s 2786 X(can)s 2949 X(be)s 3068 X(obtained)s 3437 X(from)s 694 X 7680 Y(Sun Release 4.1)s 2382 X(Last change: 03 November 1996)s 5324 X(3)s 7920 Y page 0.0 10 10 f.R ft %%Page: 4 4 694 X 480 Y(splitlog)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\()s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(1)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\))s 2586 X(USER COMMANDS )s 4906 X(splitlog)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\()s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(1)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\))s 694 X 960 Y 1179 X(http://www.ics.uci.edu/pub/websoft/wwwstat/)s 694 X 1080 Y 1204 X(ftp://www.ics.uci.edu/pub/websoft/wwwstat/)s 694 X 1248 Y 1054 X(If)s 1195 X(you)s 1420 X(have)s 1683 X(any)s 1902 X(suggestions,)s 2469 X(bug)s 2694 X(reports,)s 3071 X(\256xes,)s 3360 X(or)s 3517 X(enhancements,)s 4181 X(please)s 4504 X(join)s 4734 X(the)s 4930 X()s 1873 X(mailing)s 2218 X(list)s 2380 X(by)s 2519 X(sending)s 2869 X(e-mail)s 3163 X(with)s 3380 X("subscribe")s 3878 X(in)s 3995 X(the)s 4156 X(subject)s 4478 X(of)s 4600 X(the)s 4760 X(message)s 5136 X(to)s 5252 X(the)s 694 X 1488 Y 1054 X(request)s 1367 X(address)s 1691 X(.)s 3311 X(The)s 3491 X(list)s 3639 X(is)s 3731 X(archived)s 4099 X(at)s 4196 X(the)s 4343 X(above)s 4606 X(address.)s 694 X 1656 Y 874 X 0.0 9 9 f.B ft(More)s 1107 X 0.0 9 9 f.S2 ft(O)s 0.0 9 9 f.B ft(About)s 1385 X 0.0 9 9 f.S2 ft(O)s 0.0 9 9 f.B ft(Perl)s 1583 X 0.0 9 9 f.S2 ft(O)s 1621 X(O)s 1659 X(O)s 694 X 1776 Y 1054 X 0.0 10 10 f.R ft(The)s 1234 X(Perl)s 1420 X(Language)s 1838 X(Home)s 2107 X(Page)s 694 X 1896 Y 1414 X(http://www.perl.com/perl/index.html)s 694 X 2064 Y 1054 X(Johan)s 1312 X(Vromans')s 1736 X(Perl)s 1922 X(Reference)s 2350 X(Guide)s 694 X 2184 Y 1414 X(http://www.xs4all.nl/\304jvromans/perlref.html)s 694 X 2352 Y 0.0 9 9 f.B ft(AUTHOR)s 1112 X 0.0 9 9 f.S2 ft(O)s 1150 X(O)s 1188 X(O)s 1226 X(O)s 1264 X(O)s 694 X 2472 Y 1054 X 0.0 10 10 f.R ft(Roy)s 1268 X(Fielding)s 1648 X(\(\256elding@ics.uci.edu\),)s 2610 X(University)s 3078 X(of)s 3207 X(California,)s 3683 X(Irvine.)s 4017 X(Please)s 4318 X(do)s 4464 X(not)s 4638 X(send)s 4867 X(questions)s 5291 X(or)s 694 X 2592 Y 1054 X(requests)s 1409 X(to)s 1514 X(the)s 1663 X(author,)s 1970 X(since)s 2202 X(the)s 2351 X(number)s 2683 X(of)s 2793 X(requests)s 3147 X(has)s 3307 X(long)s 3512 X(since)s 3744 X(overwhelmed)s 4314 X(his)s 4458 X(ability)s 4741 X(to)s 4846 X(reply,)s 5103 X(and)s 5274 X(all)s 694 X 2712 Y 1054 X(future)s 1317 X(support)s 1642 X(will)s 1823 X(be)s 1942 X(through)s 2278 X(the)s 2425 X(mailing)s 2756 X(list)s 2904 X(\(see)s 3089 X(above\).)s 694 X 2880 Y 1054 X(This)s 1271 X(work)s 1515 X(has)s 1687 X(been)s 1914 X(sponsored)s 2358 X(in)s 2474 X(part)s 2667 X(by)s 2805 X(the)s 2965 X(Defense)s 3329 X(Advanced)s 3771 X(Research)s 4174 X(Projects)s 4534 X(Agency)s 4882 X(under)s 5147 X(Grant)s 694 X 3000 Y 1054 X(Numbers)s 1473 X(MDA972-91-J-1010)s 2346 X(and)s 2542 X(F30602-94-C-0218.)s 3416 X(This)s 3646 X(software)s 4041 X(does)s 4276 X(not)s 4456 X(necessarily)s 4951 X(re\257ect)s 5252 X(the)s 694 X 3120 Y 1054 X(position)s 1402 X(or)s 1510 X(policy)s 1785 X(of)s 1893 X(the)s 2040 X(U.S.)s 2243 X(Government)s 2767 X(and)s 2936 X(no)s 3061 X(o)s /Cff { (f) show xsiz pt 20 div neg 0 rmoveto (f) s } def Cff(icial)s 3369 X(endorsement)s 3904 X(should)s 4196 X(be)s 4315 X(inferred.)s 694 X 7680 Y(Sun Release 4.1)s 2382 X(Last change: 03 November 1996)s 5324 X(4)s 7920 Y page 0.0 10 10 f.R ft %%Trailer %%DocumentFonts: count { pop } repeat % a little cleanup is necessary vmstat restore cgi-bin/stats/wwwstat-2.0/LICENSE0000640000372000001540000001562107005603740016215 0ustar affweblibuuidwwwstat: httpd logfile analysis package Copyright (c) 1994, 1996 Regents of the University of California. ========================================================================== Licensing and Distribution Information: This software has been developed by Roy Fielding as part of the WebSoft project at the University of California, Irvine. wwwstat was originally based on a multi-server statistics program called fwgstat-0.035 by Jonathan Magid (jem@sunsite.unc.edu) which, in turn, was heavily based on xferstats (packaged with the version 17 of the wuarchive FTP daemon) by Chris Myers (chris@wugate.wustl.edu). Those parts of wwwstat derived from fwgstat and xferstats are in the public domain. The latest version of wwwstat can be obtained from http://www.ics.uci.edu/pub/websoft/wwwstat/ ftp://www.ics.uci.edu/pub/websoft/wwwstat/ The wwwstat package and those portions developed exclusively at the University of California are covered by the above copyright notice. Redistribution and use in source and binary forms are permitted, subject to the restrictions noted below, provided that the above copyright notice and this paragraph and the following paragraphs are duplicated in all such forms and that any documentation, advertising materials, and other materials related to such distribution and use acknowledge that the software was developed in part by the University of California, Irvine. The name of the University may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION (INCLUDING, BUT NOT LIMITED TO, LOST PROFITS) EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Redistribution: The "Artistic License" Preamble The intent of this document is to state the conditions under which a Package may be copied, such that the Copyright Holder maintains some semblance of artistic control over the development of the package, while giving the users of the package the right to use and distribute the Package in a more-or-less customary fashion, plus the right to make reasonable modifications. Definitions: "Package" refers to the collection of files distributed by the Copyright Holder, and derivatives of that collection of files created through textual modification. "Standard Version" refers to such a Package if it has not been modified, or has been modified in accordance with the wishes of the Copyright Holder. "Copyright Holder" is whoever is named in the copyright or copyrights for the package. "You" is you, if you're thinking about copying or distributing this Package. "Reasonable copying fee" is whatever you can justify on the basis of media cost, duplication charges, time of people involved, and so on. (You will not be required to justify it to the Copyright Holder, but only to the computing community at large as a market that must bear the fee.) "Freely Available" means that no fee is charged for the item itself, though there may be fees involved in handling the item. It also means that recipients of the item may redistribute it under the same conditions they received it. 1. You may make and give away verbatim copies of the source form of the Standard Version of this Package without restriction, provided that you duplicate all of the original copyright notices and associated disclaimers. 2. You may apply bug fixes, portability fixes and other modifications derived from the Public Domain or from the Copyright Holder. A Package modified in such a way shall still be considered the Standard Version. 3. You may otherwise modify your copy of this Package in any way, provided that you insert a prominent notice in each changed file stating how and when you changed that file, and provided that you do at least ONE of the following: a) place your modifications in the Public Domain or otherwise make them Freely Available, such as by posting said modifications to Usenet or an equivalent medium, or placing the modifications on a major archive site such as ftp.uu.net, or by allowing the Copyright Holder to include your modifications in the Standard Version of the Package. b) use the modified Package only within your corporation or organization. c) rename any non-standard executables so the names do not conflict with standard executables, which must also be provided, and provide a separate manual page for each non-standard executable that clearly documents how it differs from the Standard Version. d) make other distribution arrangements with the Copyright Holder. 4. You may distribute the programs of this Package in object code or executable form, provided that you do at least ONE of the following: a) distribute a Standard Version of the executables and library files, together with instructions (in the manual page or equivalent) on where to get the Standard Version. b) accompany the distribution with the machine-readable source of the Package with your modifications. c) accompany any non-standard executables with their corresponding Standard Version executables, giving the non-standard executables non-standard names, and clearly documenting the differences in manual pages (or equivalent), together with instructions on where to get the Standard Version. d) make other distribution arrangements with the Copyright Holder. 5. You may charge a reasonable copying fee for any distribution of this Package. You may charge any fee you choose for support of this Package. You may not charge a fee for this Package itself. However, you may distribute this Package in aggregate with other (possibly commercial) programs as part of a larger (possibly commercial) software distribution provided that you do not advertise this Package as a product of your own. 6. The scripts and library files supplied as input to or produced as output from the programs of this Package do not automatically fall under the copyright of this Package, but belong to whomever generated them, and may be sold commercially, and may be aggregated with this Package. 7. C or perl subroutines supplied by you and linked into this Package shall not be considered part of this Package. 8. The name of the Copyright Holder may not be used to endorse or promote products derived from this software without specific prior written permission. 9. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. The End cgi-bin/stats/wwwstat-2.0/FAQ0000640000372000001540000001431007005603740015534 0ustar affweblibuuidCopyright (c) 1994, 1996 Regents of the University of California. See the file LICENSE for Licensing and Redistribution Information. See the file README for more information. ========================================================================== The latest version of wwwstat can be obtained from http://www.ics.uci.edu/pub/websoft/wwwstat/ ftp://www.ics.uci.edu/pub/websoft/wwwstat/ ========================================================================== Frequently Asked Questions 1. MAILING LIST Due to the popularity of this program, all questions, suggestions, bug reports, fixes, or enhancements should be sent to the wwwstat-users@ics.uci.edu mailing list and not to the author. You can join the list by sending e-mail with "subscribe" in the subject of the message to the request address wwwstat-users-request@ics.uci.edu The list is archived at the distribution site. Send "help" or "info" in the subject of a message to for more information on (un)subscribing. 2. Why is all that legalese in LICENSE necessary? Isn't wwwstat free? The LICENSE exists because others have abused the privilege of using free software. Because this software was developed by an employee of the University of California, we must protect ourselves from lawsuits by those who would abuse our legal system for personal gain, regardless of any actual damages. To our knowledge, no damage has ever been caused by this program. wwwstat is distributed free of charge and will remain so as long as it is legally possible. If you are not distributing the program to others, there is no need for you to include mention of the University of California in its output. However, I would prefer that you leave in the reference to wwwstat's distribution site (at the bottom of the output) so that others can know where to get the original program. wwwstat is in use around the world. If you have translated the output to another language (i.e. German, French, Maori, etc.), I encourage you to share those translations with others by sending the translated configuration file to the mailing list. 3. Will you be developing a version for other httpd's ... Obviously, versions of this program for every HTTP server would be nice. However, I don't have the time to install all those servers just to see how to do it. Feel free to do so yourself. The wwwstat program should work on any system with Perl 4.036 or 5.003 and on any logfile in the Common Logfile Format. It does not need to run on the same system as the httpd server, and will only need network access if the -dns option is being used. 4. I am still using NCSA httpd_1.1 (or earlier), which doesn't support the Common Logfile Format. What can I do? Well, first you should seek professional help. :) Anyone running a version of NCSA httpd prior to 1.4, or CERN httpd prior to 3.0, is running a program with KNOWN SECURITY HOLES. You should upgrade *immediately*, preferably to the Apache server . Version 1.01 of wwwstat included the oldwwwstat script for pre-CLF logfiles. That script is no longer supported, but may be found at the distribution site above. The oldlog2new program is provided for converting old NCSA logfiles (pre-1.2) to the common logfile format. 5. I am using the Apache server with a configurable logfile format. How do I get wwwstat to read the custom logfile? If you know perl, you can always try editing the wwwstat script so that it parses the different format. Seriously, this should be easy to do, provided that the format can be unambiguously parsed. The hard part is doing anything useful with the extra information provided by your custom format. The other option is to write your own conversion script that converts from the custom log format to the CLF. I am sure that I've seen this kind of program before, but I can't find it at the Apache site right now. 6. How do I setup a crontab script to run wwwstat nightly? Well, that depends on how your system's crontab works, but on mine (a Sun 4 running SunOS 4.1.2) I can edit the crontab with the command % crontab -e I have the following entry for my nightly script: 15 0 * * * /dc/ud/www/etc/update-stats and the following is my update stats script (thanks to Hal Varian) ---------------------------------------- #!/bin/sh /dc/ud/www/bin/wwwstat -D 'today' > /tmp/wwwstats.html mv -f /tmp/wwwstats.html /dc/ud/www/documentroot/Admin/wwwstats.html exit ---------------------------------------- 7. What is the general procedure for monthly resetting of the access_log? Again, that depends a great deal on how your site is set up and how frequent the accesses are to your server. My site gets about 150000 requests a month, so I have a perl script (monthly.pl) which I run a couple days after the beginning of each month. monthly.pl reads the logfile (assumed to contain more than one month's worth of WWW common logfile entries) and moves the prior month's entries into a separate file. The new file is created on TMPDIR (to avoid filling up the disk), compressed using gzip, and then moved to the archive directory. The program also restarts the httpd server. The monthly.pl script is provided AS AN EXAMPLE. You must configure it (by editing the script) before it can be safely used. Many sites will have too large a server load for only monthly resetting of the logs. In that case, modify the scripts so that they do things on a weekly or daily basis. Sorry, I do not have examples of that. 8. My server load is HUGE and wwwstat runs out of memory, what can I do? You can use the -trunc N option and/or the -nofiles option to reduce the memory consumed for the archive section. You can also reduce memory consumed by configuring special groupings using the %DomainMap and @ArchiveMap tables. Finally, you can exclude entire sections using the -no
    options (see the man page). If all that fails, then just run wwwstat on less input. 9. What is perl? Where can I get it? Does perl work for my platform? See . *. MORE ANSWERS The above is just what I knew about prior to the current distribution. More questions and (hopefully) answers can be found at the FAQ page linked from the distribution site. cgi-bin/stats/wwwstat-2.0/wwwstat.rc0000640000372000001540000002464707005603741017267 0ustar affweblibuuid# ========================================================================== # This is a configuration file for wwwstat. # # # # Please note that this is a perl include file, and thus may contain # anything that might be found in a perl script. However, it SHOULD ONLY # contain variable assignments which override the default values in wwwstat's # &init_defaults procedure (all global variables). Most options can also # be overridden on the command-line. # # wwwstat allows for two optional config files: # wwwstat.rc (normally where wwwstat is installed) # .wwwstatrc (normally in the user's home directory) # which are read in that order. The file pathnames can be changed using the # -F and -f options, respectively. If no path is supplied, then both files # are looked for on the include path, which is # # .:$ENV{'HOME'}:$ENV{'PERLLIB'}: # # All wwwstat defaults are listed below, but commented-out. You can change # the associated value by removing the ## comment and changing the assignment. # Use the command "perl -wc wwwstat.rc" to test the syntax (ignore typos). # # ========================================================================== # Mapping of Request URI to Archive Entry [default is none] # # ArchiveMap is an ordered list of string match and replacement patterns # in the form of an Nx3 array. Matches against the request-URI are # attempted in the listed order and the first match wins, with the result # being that the archive pathkey is changed to the replacement string. # If no patterns match, the request-URI remains the pathkey. # The first value is 'i' (case-insensitive) or 's' (case-sensitive). # The second value is the regexp to match against the request-URI # The third value is the replacement string if the pattern matches. # If the replacement is '' or undef, then the request entry is excluded # from all summary counts (this loses information). # No replacements are made if the -n, -c, or -C, options are in use. # # The array value can be set en masse # ## @ArchiveMap = ( ## 's', '^/Icons/\w', 'All Icons (site)', ## 's', '^/icons/\w', 'All Icons (server)', ## 'i', '/hidden/', 'All Hidden', ## ); # # or to append, use: push(@ArchiveMap,'i','pattern','replacement'); e.g., # ## push(@ArchiveMap,'i','\.gif$','All GIFs'); # # To insert, use: unshift(@ArchiveMap,'i','pattern','replacement'); # Other array modifiers (see perl manual): splice, pop, shift. # # ========================================================================== # Mapping of Internet Domain to Country/Organization Name # # The file domains.pl initializes the domain --> Country/Org mapping as # an associative array. wwwstat matches domains to names using a # suffix match of domain components, with the first (longest) match being # the categorization for the stats-by-domain listing. These values can be # added to or overridden here, e.g. # ## $DomainMap{'uci.edu'} = 'University of California, Irvine'; ## $DomainMap{'ics.uci.edu'} = 'UCI Information and Computer Science'; ## $DomainMap{'co.uk'} = 'UK Commercial'; # # NOTE: The key must be in lowercase. # # ========================================================================== # Output Options [defaults are what is listed in assignment] # # Specify the URL of the previous summary period (for use only as a # hypertext link). Set it = "" if link is unwanted. # The three-letter abbrev for last month is substituted at any "%M". # The four-number year of last month is substituted at any "%Y". # Note that this is the month prior to the earliest one in this summary. # ## $LastSummary = "stats-%Y/%M.wwwstats.html.gz"; # # Specify the perl regex pattern for directory index files. This will be # dependent on the server's DirectoryIndex config (usually in srm.conf). # 'index.html?' # matches "index.html" and "index.htm" # 'index(.(html?|cgi))?' # matches "index", "index.html", "index.htm", and "index.cgi" # '(([Oo]verview)|(index)).html?' # matches "Overview.html", "Overview.htm", "index.html", "index.htm", # "overview.html", and "overview.htm" # ## $DirectoryIndex = 'index(.(html?|cgi))?'; # # Specify the default location of your access log # ## $DefaultLog = '/usr/local/etc/httpd/logs/access_log'; # # Specify the command for displaying compressed files to STDOUT # ## $Zcat = 'gunzip -c'; # specify as null string if none are available ## $Zhandle = '(gz|Z|z)'; # list file extensions that indicate compressed # # If address in log entry is one word (a local host), append what? # Specify an appropriate '.sub.dom.ain' # ## $AppendToLocalhost = '.nowhere.com'; # # Specify whether (1) or not (0) you want to display the IP address # on reversed subdomain listings as follows: # ## $LocalFullAddress = 0; # Show full address for local hosts? ## $OthersFullAddress = 0; # Show full address for non-local hosts? ## $ShowUnresolved = 0; # Show all unresolved addresses? # # Specify whether (1) or not (0) you want to insert a hypertext # anchor for each URL in the archive section (-link option). # ## $InsertLink = 0; # # Specify whether (1) or not (0) you want to add CGI output headers # before the HTML summary. # ## $Do_CGI = 0; # # Specify whether (1) or not (0) you want the Archive URL to be # truncated (this saves output space and runtime memory, but loses info). # ## $TruncateLevel = 0; # Truncate after Nth hierarchy level? ## $TruncateFile = 0; # Truncate any trailing filename? # # Specify whether (1) or not (0) you want to lookup unresolved # IP addresses via DNS. Note that this could be *very* slow, particularly # for those machines that do not have DNS names (e.g., SLIP/PPP clients). # ## $LookupDNS = 0; ## $DNScachefile = 'dnscache'; # DBM file for persistent caching ## $DNSexpires = 5356800; # Cache for two months (in seconds) # # The following lines define the visible header fields for HTML output. # They may be changed/nationalized, but changing some may affect the # parsing algorithm for reading old summary files. Test all changes! # ## $OutputTitle = 'World Wide Web Access Statistics for www' . ## $AppendToLocalhost; # ## $UpdateHeader = 'Last updated: '; ## $LastSumHeader = 'Previous Full Summary Period'; ## $TotalsHeader = 'Totals for Summary Period: '; ## $ReqRcvHeader = 'Requests Received During Summary Period '; ## $BtransHeader = 'Bytes Transmitted During Summary Period '; ## $AvgReqHeader = 'Average Requests Received Daily '; ## $AvgByteHeader = 'Average Bytes Transmitted Daily '; # ## $TotalsFormat = "%s %14.0f\n"; # ## $StatsHeader = '%Reqs %Byte Bytes Sent Requests '; ## $StatsRule = '----- ----- ------------ -------- |'; ## $StatsFormat = '%s %s %12.0f %8d |'; # ## $PrefixTop = 'Top'; ## $PrefixTotal = 'Total'; # ## $DailyHeader = 'Transfers by Request Date'; ## $HourlyHeader = 'Transfers by Request Hour'; ## $DomainHeader = 'Transfers by Client Domain'; ## $SubdomainHeader = 'Transfers by Reversed Subdomain'; ## $ArchiveHeader = 'Transfers by URL/Archive Section'; ## $IdentHeader = 'Transfers by Remote Identity'; # # These Old headers are for reading old summary files # ## $OldDailyHeader = 'Daily Transmission Statistics'; ## $OldHourlyHeader = 'Hourly Transmission Statistics'; ## $OldDomainHeader = 'Total Transfers by Client Domain'; ## $OldSubdomainHeader = 'Total Transfers by Reversed Subdomain'; ## $OldArchiveHeader = 'Total Transfers from each Archive Section'; ## $OldIdentHeader = 'Total Transfers to each Remote Identifier'; # # The following sets the default ordering for the daily stats. # Change this to 1 if you always want gwstat-style output. # ## $ReverseDateSort = 0; # Display daily stats in reverse order. # # The following sets the default sort key for each section, # where 0 means sort by the primary key value (day, hour, domain, ...) # 1 means sort by the number of requests # 2 means sort by the number of bytes transferred # ## $SortDaily = 0; ## $SortHourly = 0; ## $SortDomain = 0; ## $SortSubdomain = 0; ## $SortArchive = 0; ## $SortIdent = 0; # # If the output of a section is sorted, you may also want to restrict # the output to only the N best in that section. # ## $TopDaily = 0; ## $TopHourly = 0; ## $TopDomain = 0; ## $TopSubdomain = 0; ## $TopArchive = 0; ## $TopIdent = 0; # # On the other hand, you may want to exclude (0) an entire section. # If set = 2, the top N is done first and then followed by normal section. # ## $Do_Daily = 1; # Display the Daily Statistics ## $Do_Hourly = 1; # Display the Hourly Statistics ## $Do_Domain = 1; # Display the Domain (Country) Statistics ## $Do_Subdomain = 1; # Display the Subdomain Statistics ## $Do_Archive = 1; # Display the Archive Statistics ## $Do_Ident = 0; # Display the Identity Statistics (DON'T PUBLISH) # # The rest of these options are normally only changed on the command-line # ## $Verbose = 0; # Display valid log entries on STDERR? ## $PrintInvalids = 0; # Display invalid log entries on STDERR? ## $PrintNonexist = 0; # Display requests resulting in HTTP errors? # ## $SearchAddress = ''; # Pattern to look for in hostname/IP addresses. ## $SearchCode = ''; # Pattern to look for in Code. ## $SearchDate = ''; # Pattern to look for in Date. ## $SearchTime = ''; # Pattern to look for in Hour. ## $SearchArchive = ''; # Pattern to look for in Archive names. ## $SearchMethod = ''; # Pattern to look for in Method. # ## $NotAddress = ''; # Pattern to reject entry if in IP addresses. ## $NotCode = ''; # Pattern to reject entry if in Code. ## $NotDate = ''; # Pattern to reject entry if in Date. ## $NotTime = ''; # Pattern to reject entry if in Hour. ## $NotArchive = ''; # Pattern to reject entry if in Archive names. ## $NotMethod = ''; # Pattern to reject entry if in Method. # ## $EscapeSpecials = '[+.]'; # Most users forget about regexp syntax # # so we escape these in -a -A -n -N # ========================================================================== 1; # This must be the last line cgi-bin/stats/wwwstat-2.0/wwwstat.pl0000640000372000001540000021202007005603741017256 0ustar affweblibuuid#!YOUR_PERL_BINARY # ========================================================================== $Version = 'wwwstat-2.0'; # # Copyright (c) 1994, 1996 Regents of the University of California. # # This software has been developed by Roy Fielding as # part of the WebSoft project at the University of California, Irvine. # # See the file LICENSE for licensing and redistribution information. # See the file INSTALL for installation information. # See the file Changes for known problems and version information. # See the file README for more information. # See the wwwstat.1 man page for options and usage information. # sub usage { die <<"EndUsage"; usage: $Pname [-F system_config] [-f user_config] [-helLoOuUrRvx] [-a IP_address] [-c code] [-d date] [-t hour] [-n archive_name] [-A IP_address] [-C code] [-D date] [-T hour] [-N archive_name] [-m method] [-M method] [-H heading_title] [-X lastsummary] [-noescape] [-trunc N] [-files] [-nofiles] [-link] [-nolink] [-cgi] [-nocgi] [-dns] [-nodns] [-cache filename] [-daily] [-hourly] [-domain] [-subdomain] [-archive] [-ident] [-all] [-sort (key|byte|req)] [-top N] [-both] [-no (daily|hourly|domain|subdomain|archive|ident|all)] [--] [ logfile | summary | + | - ]... $Version Process a sequence of httpd Common Logfile Format access_log files and/or prior wwwstat output summary files (compressed if extension $Zhandle) and output an HTML summary of all the input. Configuration options: -F Get system configuration defaults from the given file. -f Get user configuration defaults from the given file. -- Last option (all later arguments are treated as filenames). Diagnostic Options: -h Help -- just display this message to STDERR and quit. -v Verbose display to STDERR of each log entry processed. -x Display to STDERR all requests of nonexistant URLs. -e Display to STDERR all invalid log entries. Display Options: -H Use the following string as the heading and title for output. -X Use the following string as the URL for last summary link. -R Display daily stats sorted in reverse. -l Do display full IP address of clients in my domain. -L Don't (i.e. strip the machine name from local addresses). -o Do display full IP address of clients from other domains. -O Don't (i.e. strip the machine name from non-local addresses). -u Do display IP address from unresolved domain names. -U Don't (i.e. group all "unresolved" addresses under that name). -dns Use DNS to lookup unresolved IP addresses (may be slow). -nodns Do not lookup unresolved IP addresses. -cache Use the given dbm file to read/write DNS cache. -trunc Truncate archive URL after Nth hierarchy level. -files Show filename in archive URL. -nofiles Truncate filename (if any) from archive URL. -link Add a hypertext link around each archive URL. -nolink Do not add a hypertext link around each archive URL. -cgi Check HTTP method and output like a CGI script. -nocgi Do not produce CGI output. Section Options,
    =(all|daily|hourly|domain|subdomain|archive|ident): -no
    Exclude the given section from the output. -
    Include the given section and set scope for -sort and -top. -sort (key|byte|req) Sort this section by key, bytes, or requests. -top N Include only the top N entries for this section. -both Do the top N as sorted and then do full by key. Search Options (include in summary only those log entries ...): -a Containing a hostname/IP address matching the given perl regexp. -A Not containing " " " " " " " " -c Containing a server response code matching the given perl regexp. -C Not containing " " " " " " " " -d Containing a date ("Feb 2 1994") matching the given perl regexp. -D Not containing " " " " " " " " -t Containing an hour ("00" -- "23") matching the given perl regexp. -T Not containing " " " " " " " " -n Containing an archive (URL) name matching perl regexp (except +.). -N Not containing " " " " " " " " -m Using an HTTP method name matching the given perl regexp. -M Not using the HTTP method " " " " "" -noescape Do not escape "." and "+" in remaining search options. Filenames (none implies "+"): - Read standard input (STDIN). + Read the default logfile $DefaultLog. ... Anything else is treated as the name of a file to be read, with the first line indicating whether it is a logfile or a summary. EndUsage } # ========================================================================== # The main program is really quite simple ... $Pname = $0; if ($Pname =~ s#^(.*)/##) { push(@INC, $1); } # Modify include path for bin, # current dir, and home dir unshift(@INC, '.', ($ENV{'HOME'} || $ENV{'LOGDIR'})); $StartTime = time; # Get the current date-time stamp $Updated = &wtime($StartTime,''); # Format it as local time $UpdatedGMT = &wtime($StartTime,'GMT'); # and also as GMT time &init_defaults; # Set the default configuration &get_configuration; # Get system and user configuration &get_commandline; # Get command-line options &init_summary; # Initialize the accumulaters &output_cgi if $Do_CGI; # Output CGI headers (if desired) &init_DNS if $LookupDNS; # Initialize the DNS cache if ($Verbose) { print STDERR "$Version: $Updated\n"; } if ($ARGV[0]) # Check for explicit filenames { foreach $filename (@ARGV) { &process_file($filename); } } else # if none, just read the default { &process_file($DefaultLog); } if ($Verbose) { print STDERR "Done processing files, now doing summary\n"; } &output_summary; # Give us the dirty details &close_DNS if $LookupDNS; # Close the DNS cache exit(0); # and we are finished. # ========================================================================== # ========================================================================== # Initialize default configuration options. NOTE that all of these options # can be overridden in either the system or user configuration files and # many can be overridden on the command-line. # sub init_defaults { @ArchiveMap = (); require "domains.pl"; # Get the domain mapping (%DomainMap) # Specify the URL of the previous summary period (for use only as a # hypertext link). Set it = "" if link is unwanted. # The three-letter abbrev for last month is substituted at any "%M". # The four-number year of last month is substituted at any "%Y". # Note that this is the month prior to the earliest one in this summary. $LastSummary = "stats-%Y/%M.wwwstats.html.gz"; # Specify the perl regex pattern for directory index files. This will be # dependent on the server's DirectoryIndex config (usually in srm.conf). # 'index.html?' # matches "index.html" and "index.htm" # 'index(.(html?|cgi))?' # matches "index", "index.html", "index.htm", and "index.cgi" # '(([Oo]verview)|(index)).html?' # matches "Overview.html", "Overview.htm", "index.html", "index.htm", # "overview.html", and "overview.htm" $DirectoryIndex = 'index(.(html?|cgi))?'; # Specify the default location of your access log $DefaultLog = '/usr/local/etc/httpd/logs/access_log'; # Specify the command for displaying compressed files to STDOUT $Zcat = 'gunzip -c'; # specify as null string if none are available $Zhandle = '(gz|Z|z)'; # list file extensions that indicate compressed # If address in log entry is one word (a local host), append what? # Specify an appropriate '.sub.dom.ain' $AppendToLocalhost = '.no_where.com'; # Specify whether (1) or not (0) you want to display the IP address # on reversed subdomain listings as follows: $LocalFullAddress = 0; # Show full address for local hosts? $OthersFullAddress = 0; # Show full address for non-local hosts? $ShowUnresolved = 0; # Show all unresolved addresses? # Specify whether (1) or not (0) you want to insert a hypertext # anchor for each URL in the archive section (-link option). $InsertLink = 0; # Specify whether (1) or not (0) you want to add CGI output headers # before the HTML summary. $Do_CGI = 0; # Specify whether (1) or not (0) you want the Archive URL to be # truncated (this saves output space and runtime memory, but loses info). $TruncateLevel = 0; # Truncate after Nth hierarchy level $TruncateFile = 0; # Truncate any trailing filename # Specify whether (1) or not (0) you want to lookup unresolved # IP addresses via DNS. Note that this could be *very* slow! $LookupDNS = 0; $DNScachefile = 'dnscache'; # DBM files for persistent cache $DNSexpires = 5356800; # Cache for two months (in seconds) # The following lines define the visible header fields for HTML output. # They may be changed/nationalized, but changing some may affect the # parsing algorithm for reading old summary files. Test all changes! $OutputTitle = 'World Wide Web Access Statistics for www' . $AppendToLocalhost; $UpdateHeader = 'Last updated: '; $LastSumHeader = 'Previous Full Summary Period'; $TotalsHeader = 'Totals for Summary Period: '; $ReqRcvHeader = 'Requests Received During Summary Period '; $BtransHeader = 'Bytes Transmitted During Summary Period '; $AvgReqHeader = 'Average Requests Received Daily '; $AvgByteHeader = 'Average Bytes Transmitted Daily '; $TotalsFormat = "%s %14.0f\n"; $StatsHeader = '%Reqs %Byte Bytes Sent Requests '; $StatsRule = '----- ----- ------------ -------- |'; $StatsFormat = '%s %s %12.0f %8d |'; $PrefixTop = 'Top'; $PrefixTotal = 'Total'; $DailyHeader = 'Transfers by Request Date'; $HourlyHeader = 'Transfers by Request Hour'; $DomainHeader = 'Transfers by Client Domain'; $SubdomainHeader = 'Transfers by Reversed Subdomain'; $ArchiveHeader = 'Transfers by URL/Archive Section'; $IdentHeader = 'Transfers by Remote Identity'; # These Old headers are for reading old summary files $OldDailyHeader = 'Daily Transmission Statistics'; $OldHourlyHeader = 'Hourly Transmission Statistics'; $OldDomainHeader = 'Total Transfers by Client Domain'; $OldSubdomainHeader = 'Total Transfers by Reversed Subdomain'; $OldArchiveHeader = 'Total Transfers from each Archive Section'; $OldIdentHeader = 'Total Transfers to each Remote Identifier'; # The following sets the default ordering for the daily stats. # Change this to 1 if you always want gwstat-style output. $ReverseDateSort = 0; # Display daily stats in reverse order. # The following sets the default sort key for each section, # where 0 means sort by the primary key value (day, hour, domain, ...) # 1 means sort by the number of requests # 2 means sort by the number of bytes transferred $SortDaily = 0; $SortHourly = 0; $SortDomain = 0; $SortSubdomain = 0; $SortArchive = 0; $SortIdent = 0; # If the output of a section is sorted, you may also want to restrict # the output to only the N best in that section. $TopDaily = 0; $TopHourly = 0; $TopDomain = 0; $TopSubdomain = 0; $TopArchive = 0; $TopIdent = 0; # On the other hand, you may want to exclude (0) an entire section. # If set = 2, the top N is done first and then followed by normal section. $Do_Daily = 1; # Display the Daily Statistics $Do_Hourly = 1; # Display the Hourly Statistics $Do_Domain = 1; # Display the Domain (Country) Statistics $Do_Subdomain = 1; # Display the Subdomain Statistics $Do_Archive = 1; # Display the Archive Statistics # The following option is only useful if the server is running with # rfc931/ident support (i.e. "IdentityCheck on" appears in httpd.conf) # or for resources which require user authentication. # NOTE: For security reasons, you should not publish to the web any report # that lists the Remote Identities. This option is intended for server # maintenance only. Use the -r or -ident command-line option instead. $Do_Ident = 0; # Set 1 or 2 ONLY if Ident is ALWAYS desired. # The rest of these options are normally only changed on the command-line $Verbose = 0; # Display valid log entries on STDERR? $PrintInvalids = 0; # Display invalid log entries on STDERR? $PrintNonexist = 0; # Display nonexistant file requests on STDERR? $SearchAddress = ''; # Pattern to look for in hostname/IP addresses. $SearchCode = ''; # Pattern to look for in Code. $SearchDate = ''; # Pattern to look for in Date. $SearchTime = ''; # Pattern to look for in Hour. $SearchArchive = ''; # Pattern to look for in Archive names. $SearchMethod = ''; # Pattern to look for in Method. $NotAddress = ''; # Pattern to reject entry if in IP addresses. $NotCode = ''; # Pattern to reject entry if in Code. $NotDate = ''; # Pattern to reject entry if in Date. $NotTime = ''; # Pattern to reject entry if in Hour. $NotArchive = ''; # Pattern to reject entry if in Archive names. $NotMethod = ''; # Pattern to reject entry if in Method. $EscapeSpecials = '[+.]'; # Most users forget about regexp syntax # The default system and user configuration filenames should only # be changed if your filesystem can't handle these names. $SconfigFile = 'wwwstat.rc'; # System file for overriding defaults $UconfigFile = '.wwwstatrc'; # User file for overriding defaults } # ========================================================================== # Get the system configuration and user configuration # sub get_configuration { local($forced) = 0; if (defined($ARGV[0]) && ($ARGV[0] eq '-F')) { shift @ARGV; $SconfigFile = shift @ARGV; $forced = 1; } if ($SconfigFile) { eval 'require $SconfigFile;'; if ($@ && $forced) { die "Unable to read $SconfigFile: $!\n"; } else { $! = 0; undef $@; } } if (defined($ARGV[0]) && ($ARGV[0] eq '-f')) { shift @ARGV; $UconfigFile = shift @ARGV; $forced = 1; } else { $forced = 0; } if ($UconfigFile) { eval 'require $UconfigFile;'; if ($@ && $forced) { die "Unable to read $UconfigFile: $!\n"; } else { $! = 0; undef $@; } } } # ========================================================================== # Get the command-line options. # sub get_commandline { local($_, $first, $rest, $pos); local($scope) = 0; local($letteropts) = 'helLoOuUrRvxis:H:X:f:F:m:M:c:C:t:T:a:A:n:N:d:D:'; local(@args) = split(//, $letteropts); while (defined($_ = $ARGV[0])) { if ($_ eq '--') { shift @ARGV; last; } # Last option indicator if ($_ eq '-') { last; } # STDIN file indicator if (!s/^-//) { last; } # Not an option if (/^no(.*)/) # Exclude some option { # indicated by suffix unless ($_ = $1) { # or next argument shift @ARGV; &badarg('-no requires value') unless ($_ = $ARGV[0]); } if (/^escape$/) { $EscapeSpecials = ''; } elsif (/^link$/) { $InsertLink = 0; } elsif (/^files$/) { $TruncateFile = 1; } elsif (/^dns$/) { $LookupDNS = 0; } elsif (/^cgi$/) { $Do_CGI = 0; } elsif (/^da(y|aily|ate)$/) { $Do_Daily = 0; } elsif (/^hour(ly)?$/) { $Do_Hourly = 0; } elsif (/^dom(ain)?$/) { $Do_Domain = 0; } elsif (/^sub(domain)?$/) { $Do_Subdomain = 0; } elsif (/^arc(hive)?$/) { $Do_Archive = 0; } elsif (/^id(ent)?$/) { $Do_Ident = 0; } elsif (/^all$/) { $Do_Daily = $Do_Hourly = $Do_Domain = $Do_Subdomain = $Do_Archive = $Do_Ident = 0; } else { &badarg('-no',$_); } } elsif (/^all$/) # Scope determines what sections are active { # and how to apply the -top and -sort options $scope = 0; $Do_Daily = $Do_Hourly = $Do_Domain = $Do_Subdomain = $Do_Archive = $Do_Ident = 1; } elsif (/^da(y|aily|ate)$/) { $scope = 1; $Do_Daily = 1; } elsif (/^hour(ly)?$/) { $scope = 2; $Do_Hourly = 1; } elsif (/^dom(ain)?$/) { $scope = 3; $Do_Domain = 1; } elsif (/^sub(domain)?$/) { $scope = 4; $Do_Subdomain = 1; } elsif (/^arc(hive)?$/) { $scope = 5; $Do_Archive = 1; } elsif (/^id(ent)?$/) { $scope = 6; $Do_Ident = 1; } elsif (/^link$/) { $InsertLink = 1; # Add anchors to archive } elsif (/^files$/) # Show filename in URL { $TruncateFile = 0; } elsif (/^trunc(.*)/) # Truncate Archive URL { # after Nth level unless ($_ = $1) { shift @ARGV; &badarg('-trunc requires value') unless ($_ = $ARGV[0]); } &badarg('-trunc', $_) unless (/^\d+$/); $TruncateLevel = $_; } elsif (/^cgi$/) # Output CGI headers { $Do_CGI = 1; } elsif (/^dns$/) # Resolve IP addresses { $LookupDNS = 1; } elsif (/^cache(.*)/) # Change cache filename { unless ($_ = $1) { shift @ARGV; &badarg('-cache requires value') unless ($_ = $ARGV[0]); } $DNScachefile = $_; } elsif (/^top(.*)/) # Limit to top N { unless ($_ = $1) { shift @ARGV; &badarg('-top requires value') unless ($_ = $ARGV[0]); } &badarg('-top', $_) unless (/^\d+$/); if ($scope == 1) { $TopDaily = $_; } elsif ($scope == 2) { $TopHourly = $_; } elsif ($scope == 3) { $TopDomain = $_; } elsif ($scope == 4) { $TopSubdomain = $_; } elsif ($scope == 5) { $TopArchive = $_; } elsif ($scope == 6) { $TopIdent = $_; } else { $TopDaily = $TopHourly = $TopDomain = $TopSubdomain = $TopArchive = $TopIdent = $_; } } elsif (/^sort(.*)/) # Change sort method { unless ($_ = $1) { shift @ARGV; &badarg('-sort requires value') unless ($_ = $ARGV[0]); } if (/^key/) { $sortkey = 0; } # Sort by primary key elsif (/^req/) { $sortkey = 1; } # Sort by requests rcvd elsif (/^byt/) { $sortkey = 2; } # Sort by bytes transmitted else { &badarg('-sort',$_); } if ($scope == 1) { $SortDaily = $sortkey; } elsif ($scope == 2) { $SortHourly = $sortkey; } elsif ($scope == 3) { $SortDomain = $sortkey; } elsif ($scope == 4) { $SortSubdomain = $sortkey; } elsif ($scope == 5) { $SortArchive = $sortkey; } elsif ($scope == 6) { $SortIdent = $sortkey; } else { $SortDaily = $SortHourly = $SortDomain = $SortSubdomain = $SortArchive = $SortIdent = $sortkey; } } elsif (/^both$/) # Do both top N and normal { if ($scope == 1) { $Do_Daily = 2; if (!$TopDaily) { $TopDaily = 10; } if (!$SortDaily) { $SortDaily = 1; } } elsif ($scope == 2) { $Do_Hourly = 2; if (!$TopHourly) { $TopHourly = 10; } if (!$SortHourly) { $SortHourly = 1; } } elsif ($scope == 3) { $Do_Domain = 2; if (!$TopDomain) { $TopDomain = 10; } if (!$SortDomain) { $SortDomain = 1; } } elsif ($scope == 4) { $Do_Subdomain = 2; if (!$TopSubdomain) { $TopSubdomain = 10; } if (!$SortSubdomain) { $SortSubdomain = 1; } } elsif ($scope == 5) { $Do_Archive = 2; if (!$TopArchive) { $TopArchive = 10; } if (!$SortArchive) { $SortArchive = 1; } } elsif ($scope == 6) { $Do_Ident = 2; if (!$TopIdent) { $TopIdent = 10; } if (!$SortIdent) { $SortIdent = 1; } } else { $Do_Daily = $Do_Hourly = $Do_Domain = $Do_Subdomain = $Do_Archive = $Do_Ident = 2; $TopDaily = $TopHourly = $TopDomain = $TopSubdomain = $TopArchive = $TopIdent = 10; $SortDaily = $SortHourly = $SortDomain = $SortSubdomain = $SortArchive = $SortIdent = 1; } } else # End of full-word option arguments { while() # Loop by each character { ($first,$rest) = /^(.)(.*)/; if (($pos = index($letteropts,$first)) < 0) { &badarg("Unknown option:",$first); } if ($args[$pos+1] eq ':') { shift(@ARGV); if ($rest eq '') { &badarg($first,"requires value") unless @ARGV; $rest = $ARGV[0]; } &set_option($first, $rest); last; } else { &set_option($first, 1); $_ = $rest; last unless $_; } } } } continue { shift @ARGV; } } # ========================================================================== # Set the single-letter command-line option given. Gee, this is fun. # sub set_option { local($opt, $value) = @_; if ($opt eq 'h') { &usage; } elsif ($opt eq 'e') { $PrintInvalids = 1; } elsif ($opt eq 'l') { $LocalFullAddress = 1; } elsif ($opt eq 'L') { $LocalFullAddress = 0; } elsif ($opt eq 'o') { $OthersFullAddress = 1; } elsif ($opt eq 'O') { $OthersFullAddress = 0; } elsif ($opt eq 'u') { $ShowUnresolved = 1; } elsif ($opt eq 'U') { $ShowUnresolved = 0; } elsif ($opt eq 'r') { $Do_Ident = 2; } elsif ($opt eq 'R') { $ReverseDateSort = 1; } elsif ($opt eq 'v') { $Verbose = 1; } elsif ($opt eq 'x') { $PrintNonexist = 1; } elsif ($opt eq 'X') { $LastSummary = $value; } elsif ($opt eq 'H') { $OutputTitle = $value; } elsif ($opt eq 'm') { if ($SearchMethod) { $SearchMethod = "($SearchMethod|$value)"; } else { $SearchMethod = $value; } } elsif ($opt eq 'M') { if ($NotMethod) { $NotMethod = "($NotMethod|$value)"; } else { $NotMethod = $value; } } elsif ($opt eq 'c') { if ($SearchCode) { $SearchCode = "($SearchCode|$value)"; } else { $SearchCode = $value; } } elsif ($opt eq 'C') { if ($NotCode) { $NotCode = "($NotCode|$value)"; } else { $NotCode = $value; } } elsif ($opt eq 't') { if ($SearchTime) { $SearchTime = "($SearchTime|$value)"; } else { $SearchTime = $value; } } elsif ($opt eq 'T') { if ($NotTime) { $NotTime = "($NotTime|$value)"; } else { $NotTime = $value; } } elsif ($opt eq 'a') { if ($EscapeSpecials) { $value =~ s/($EscapeSpecials)/\\$1/go; } if ($SearchAddress) { $SearchAddress = "($SearchAddress|$value)"; } else { $SearchAddress = $value; } } elsif ($opt eq 'A') { if ($EscapeSpecials) { $value =~ s/($EscapeSpecials)/\\$1/go; } if ($NotAddress) { $NotAddress = "($NotAddress|$value)"; } else { $NotAddress = $value; } } elsif ($opt eq 'n') { if ($EscapeSpecials) { $value =~ s/($EscapeSpecials)/\\$1/go; } if ($SearchArchive) { $SearchArchive = "($SearchArchive|$value)"; } else { $SearchArchive = $value; } } elsif ($opt eq 'N') { if ($EscapeSpecials) { $value =~ s/($EscapeSpecials)/\\$1/go; } if ($NotArchive) { $NotArchive = "($NotArchive|$value)"; } else { $NotArchive = $value; } } elsif ($opt eq 'd') { if ($value eq 'today') { $value = substr($Updated, 8, 4) . substr($Updated, 5, 3) . substr($Updated, 12, 4); $value =~ s/ 0(\d) / $1 /; } if ($SearchDate) { $SearchDate = "($SearchDate|$value)"; } else { $SearchDate = $value; } } elsif ($opt eq 'D') { if ($value eq 'today') { $value = substr($Updated, 8, 4) . substr($Updated, 5, 3) . substr($Updated, 12, 4); $value =~ s/ 0(\d) / $1 /; } if ($NotDate) { $NotDate = "($NotDate|$value)"; } else { $NotDate = $value; } } elsif ($opt eq 'F') { die "The -F option MUST be first option on command-line\n"; } elsif ($opt eq 'f') { die "The -f option MUST be first option after -F option (if any)\n"; } elsif ($opt eq 'i') { warn "Option -i is no longer needed, ignoring it.\n"; } elsif ($opt eq 's') { warn "Option -s is no longer used, ignoring it.\n"; } else { &badarg("Unknown option:", $opt); } } # ========================================================================== sub badarg { local($dreck) = join(' ', @_); warn "Bad command option: $dreck\n"; &usage; } # ========================================================================== # Initialize summary accumulaters and non-optional configuration. # These settings may be customized, but are unlikely to need changing. # sub init_summary { # Setup the table of response codes and (if not '') the name for archive %RespCodes = ( '100', 'Code 100 Continue', '101', 'Code 101 Switching Protocols', '200', '', # OK response '201', '', # Created response '202', '', # Accepted response '203', '', # Non-Authoritative response '204', '', # No Content response '205', '', # Reset Content response '206', '', # Partial Content response '300', 'Code 300 Multiple Choices', '301', 'Code 301 Moved Permanently', '302', 'Code 302 Moved Temporarily', '303', 'Code 303 See Other', '304', '', # Not Modified response '305', 'Code 305 Use Proxy', '400', 'Code 400 Bad Request', '401', 'Code 401 Unauthorized', '402', 'Code 402 Payment Required', '403', 'Code 403 Forbidden', '404', 'Code 404 Not Found', '405', 'Code 405 Method Not Allowed', '406', 'Code 406 Not Acceptable', '407', 'Code 407 Proxy Authentication Required', '408', 'Code 408 Request Time-out', '409', 'Code 409 Conflict', '410', 'Code 410 Gone', '411', 'Code 411 Length Required', '412', 'Code 412 Precondition Failed', '413', 'Code 413 Request Entity Too Large', '414', 'Code 414 Request-URI Too Large', '415', 'Code 415 Unsupported Media Type', '500', 'Code 500 Internal Server Error', '501', 'Code 501 Not Implemented', '502', 'Code 502 Bad Gateway', '503', 'Code 503 Service Unavailable', '504', 'Code 504 Gateway Time-out', '505', 'Code 505 HTTP Version Not Supported', ); # Estimate the size (in bytes) of typical responses not counted in logfile # For better accuracy, tailor to your particular site's server %RespEstimates = ( '100', 100, # Continue response (never happens) '101', 100, # Switching Protocols response (never happens) '200', 200, # OK response (headers only) '201', 200, # Created response (headers only) '202', 200, # Accepted response (headers only) '203', 200, # Non-Authoritative response (headers only) '204', 200, # No Content response (headers only) '205', 200, # Reset Content response (headers only) '206', 200, # Partial Content response (headers only) '300', 400, # Multiple choices message '301', 400, # Permanent redirect message '302', 400, # Temporary redirect message '303', 400, # See other URL redirect message '304', 100, # Not Modified response to a Conditional GET '305', 400, # Use Proxy redirect message '400', 300, # Bad Request response message '401', 300, # Unauthorized response message '402', 300, # Payment Required response message '403', 300, # Forbidden response message '404', 300, # Not Found message '405', 300, # Method Not Allowed message '406', 300, # Not Acceptable message '407', 300, # Proxy Authentication Required message '408', 300, # Request Time-out message '409', 300, # Conflict message '410', 300, # Gone message '411', 300, # Length Required message '412', 300, # Precondition Failed message '413', 300, # Request Entity Too Large message '414', 300, # Request-URI Too Large message '415', 300, # Unsupported Media Type message '500', 500, # Server Error response message '501', 500, # Not Implemented response message '502', 500, # Bad Gateway message '503', 500, # Service Unavailable message '504', 500, # Gateway Time-out message '505', 500, # HTTP Version Not Supported message ); $TotalRequests = 0; # total requests received %HourRequests = (); # per hour %DayRequests = (); # per day %ArchiveRequests = (); # per file %DomainRequests = (); # per domain %SubdomainRequests = (); # per subdomain %IdentRequests = (); # per ident $TotalBytes = 0; # total bytes sent %HourBytes = (); # per hour %DayBytes = (); # per day %ArchiveBytes = (); # per file %DomainBytes = (); # per domain %SubdomainBytes = (); # per subdomain %IdentBytes = (); # per ident $StartTag = "
    \n";     # Note that these vars are used by both
        $EndTag   = "
    \n"; # input and output of summaries. $TimeZone = ''; $AllMonths = 'JanFebMarAprMayJunJulAugSepOctNovDec'; } # ========================================================================== # process the given filename as FILE, based on the content of its first line. # sub output_cgi { local($method) = $ENV{'REQUEST_METHOD'}; local($crlf) = "\x0D\x0A"; $| = 1; # Unbuffer STDOUT if (!defined($method) || ($method eq 'GET') || ($method eq 'HEAD')) { print 'Content-Type: text/html', $crlf, $crlf; exit(0) if ($method eq 'HEAD'); } else { print 'Status: 405 Method Not Allowed', $crlf; print 'Allow: GET, HEAD', $crlf; print 'Content-Type: text/html', $crlf, $crlf; print '', $crlf; print '405 Method Not Allowed', $crlf; print '', $crlf; print '

    405 Method Not Allowed

    ', $crlf; print 'Only GET and HEAD are allowed for this URL', $crlf; print '', $crlf; exit(0); } } # ========================================================================== # process the given filename as FILE, based on the content of its first line. # sub process_file { local($filename) = @_; if ($Verbose) { print STDERR "Processing file \"$filename\"\n"; } if ($filename eq '+') { $filename = $DefaultLog; } if ($Zhandle && ($filename =~ /\.$Zhandle$/o)) { if (!$Zcat) { warn "No zcat decompression command has been defined\n"; return; } $filename = "$Zcat $filename |"; } if (!open(FILE,$filename)) { warn "Error opening $filename: $!\n"; return; } if ($_ = ) { if (/^/) { &process_summary; } else { &process_log($_); } } close(FILE); } # ========================================================================== # Process the summary FILE by reading in our own output, section by section. # We must assume that the old output file was created with the same options # and that its content is disjunct from all other input files. # NOTE that using search options with inclusion cannot work unless the # included file was also created with those search options. # NOTE that Top N sections are skipped, since they cannot accumulate. # sub process_summary { local($_, $date, $hour, $domain, $subdomain, $pathkey, $ident); # This code depends on the content of the output being similar # to the default distribution. If you change the output content, # you must also check to ensure this code still works. local($heading_tag) = '

    '; local($table_rule) = '-----'; # The first thing to do is read past the HEAD and crossreferences # until we get to the first preformatted section (the totals) do { return unless ($_ = ); } until ($_ eq $StartTag); # Next line should be "Files Transmitted ..." or "Requests Received ..." if (($_ = ) && (/\s(\d+)$/)) { return unless $1; $TotalRequests += $1; } else { warn "Invalid summary file, skipping"; return; } # Next line should be "Bytes Transmitted ..." if (($_ = ) && (/\s(\d+)$/)) { $TotalBytes += $1; } else { warn "Invalid summary file, skipping"; return; } # We don't care about the rest of the totals for (;;) # Loop through each section { do { return unless ($_ = ); } until (/^$heading_tag/o); next if (/>$PrefixTop /o); # Skip any Top N sections if (/$DailyHeader/o || /$OldDailyHeader/o) { do { return unless ($_ = ); } until (/^$table_rule/o); while (($_ = ) && ($_ ne $EndTag)) { if (/\s(\d+)\s+(\d+)\s+\|\s+(\S.*)/) { $date = $3; # the date after "|" $DayRequests{$date} += $2; # 1st number left of "|" $DayBytes{$date} += $1; # 2nd number left of "|" } else { warn "Invalid summary line"; } } } elsif (/$HourlyHeader/o || /$OldHourlyHeader/o) { next unless $Do_Hourly; do { return unless ($_ = ); } until (/^$table_rule/o); while (($_ = ) && ($_ ne $EndTag)) { if (/\s(\d+)\s+(\d+)\s+\|\s+(\S+)/) { $hour = $3; # the hour after "|" $HourRequests{$hour} += $2; # 1st number left of "|" $HourBytes{$hour} += $1; # 2nd number left of "|" } else { warn "Invalid summary line"; } } } elsif (/$DomainHeader/o || /$OldDomainHeader/o) { next unless $Do_Domain; do { return unless ($_ = ); } until (/^$table_rule/o); while (($_ = ) && ($_ ne $EndTag)) { if (/\s(\d+)\s+(\d+)\s+\|\s+(\S+)/) { $domain = $3; # the word after "|" $DomainRequests{$domain} += $2; # 1st number left of "|" $DomainBytes{$domain} += $1; # 2nd number left of "|" } else { warn "Invalid summary line"; } } } elsif (/$SubdomainHeader/o || /$OldSubdomainHeader/o) { next unless $Do_Subdomain; do { return unless ($_ = ); } until (/^$table_rule/o); while (($_ = ) && ($_ ne $EndTag)) { if (/\s(\d+)\s+(\d+)\s+\|\s+(\S.*)/) { $subdomain = $3; $SubdomainRequests{$subdomain} += $2; $SubdomainBytes{$subdomain} += $1; } else { warn "Invalid summary line"; } } } elsif (/$ArchiveHeader/o || /$OldArchiveHeader/o) { next unless $Do_Archive; do { return unless ($_ = ); } until (/^$table_rule/o); while (($_ = ) && ($_ ne $EndTag)) { if (/\s(\d+)\s+(\d+)\s+\|\s+(\S.*)/) { $pathkey = &striplink($3); # the pathkey after "|" $ArchiveRequests{$pathkey} += $2; # 1st number left of "|" $ArchiveBytes{$pathkey} += $1; # 2nd number left of "|" } else { warn "Invalid summary line"; } } } elsif (/$IdentHeader/o || /$OldIdentHeader/o) { next unless $Do_Ident; do { return unless ($_ = ); } until (/^$table_rule/o); while (($_ = ) && ($_ ne $EndTag)) { if (/\s(\d+)\s+(\d+)\s+\|\s+(\S.*)/) { $ident = $3; # the identity after "|" $IdentRequests{$ident} += $2; # 1st number left of "|" $IdentBytes{$ident} += $1; # 2nd number left of "|" } else { warn "Invalid summary line"; } } } else { warn "Invalid summary file, skipping"; return; } } } # ========================================================================== # Strip the potential anchor tags from around an archive entry # sub striplink { local($_) = @_; s#^##; s#$##; return &truncated($_); } # ========================================================================== # If the options call for it, truncate the archive URL down to the # Nth hierarchy level and/or remove filename (if any) # sub truncated { local($_) = @_; local(@levels); return $_ unless m#^/#; if ($TruncateFile) { s#[^/]+$##; } if ($TruncateLevel > 0) { @levels = split(/\//); if ($#levels > $TruncateLevel) { $_ = join('/', @levels[0 .. $TruncateLevel], ''); } } return $_; } # ========================================================================== # Process the access_log FILE by reading each entry, validating and # categorizing the access, and then adding to that category's stats # sub process_log { local($_) = @_; # The first line has already been read. local($host, $rfc931, $authuser, $timestamp, $request, $status, $bytes); local($ident, $hour, $date, $method, $htv, $has_head, $idx); local($fname, $rname, $dvalue, $pathkey, @address, $domain, $subdomain); local($saveline); LINE: while() { s/^\0+//; # This is due to a bug in perl 5.002 s/\0//g; # because this line should be sufficient $saveline = $_; # # First, parse the logfile entry into its seven basic components # ($host, $rfc931, $authuser, $timestamp, $request, $status, $bytes) = /^(\S+) (\S+) (\S+) \[([^\]]*)\] \"([^"]*)\" (\S+) (\S+)/; #" Now, is this garbage or is it memorex? Note that $bytes can be 0 if (!($host && $rfc931 && $authuser && $timestamp && $request && $status)) { if ($PrintInvalids) { print STDERR "$.:$saveline"; } next LINE; } if ($status eq '-') # Test the response code { $status = "200"; } elsif (!defined($RespEstimates{$status})) { if ($PrintInvalids) { print STDERR "$.:$saveline"; } next LINE; } if ($SearchCode) { next LINE unless ($status =~ m#$SearchCode#o); } if ($NotCode) { next LINE unless ($status !~ m#$NotCode#o );} if ($bytes eq '-') { $bytes = '0'; } elsif ($bytes !~ /^\d+$/ ) # Test the bytes transferred { if ($PrintInvalids) { print STDERR "$.:$saveline"; } next LINE; } if ($rfc931 ne '-') # Test the remote ident { $ident = $rfc931; # Save ident for later use $ident =~ s/\[[^\]]*\]/COOKIE/g; # Replace all magic cookies } elsif ($authuser ne '-') { $ident = $authuser; # Jury rig support for authuser $ident =~ s/\[[^\]]*\]/COOKIE/g; # Replace all magic cookies } else { $ident = "unknown"; } # # Looks okay so far -- Now figure out when the request was made. # $timestamp =~ s/^0/ /; # Remove leading zero from day if ($timestamp =~ m#^([ 1-3]?\d)/([A-Za-z]+)/(\d{4}):(\d\d):\d\d:\d\d ([+ -]\d{1,4})#) { $date = "$2 $1 $3"; $hour = "$4"; $TimeZone = "$5"; } else { if ($PrintInvalids) { print STDERR "$.:$saveline"; } next LINE; } if ($SearchDate) { next LINE unless ($date =~ m#$SearchDate#o); } if ($NotDate) { next LINE unless ($date !~ m#$NotDate#o); } if ($SearchTime) { next LINE unless ($hour =~ m#$SearchTime#o); } if ($NotTime) { next LINE unless ($hour !~ m#$NotTime#o); } # # Then parse the method and URL pathname from request # ($method, $fname, $htv) = split(' ',$request,3); if ($SearchMethod) { next LINE unless ($method =~ m#$SearchMethod#o); } if ($NotMethod) { next LINE unless ($method !~ m#$NotMethod#o); } $has_head = 0; # Check for HTTP/version tag if ($htv) { if ($htv !~ m#^HTTP/#i) { if ($PrintInvalids) { print STDERR "$.:$saveline"; } } else { $has_head = 1; } } # # Now we update the actual bytes transferred to include header/errors # if ($has_head || ($status ne '200')) { $bytes += $RespEstimates{$status}; } # # And then determine what the archive name should be # if ($rname = $RespCodes{$status}) # If not a successful status code { if ($PrintNonexist && ($status >= 400)) { print STDERR "$status $date $hour $fname BY $host\n"; } $fname = $rname unless ($SearchCode || $NotCode); } elsif (!$fname || ($fname =~ m#^HTTP/#i)) { $fname = '/'; } else { $fname =~ s/\#.*$//; # Remove any trailing anchor $fname =~ s/\?.*$//; # Remove any trailing query $fname =~ s/%7E/~/i; # Fix munging of URLs $fname =~ s/%3A/:/ig; $fname =~ s#/[^/]+/\.\./#/#; # Fix usage of relative paths $fname =~ s#/\./#/#; # and another one $fname =~ y#/#/#s; # Remove any extra slashes $fname =~ s#/$DirectoryIndex$#/#o; # Remove trailing index name } if ($SearchArchive) { next LINE unless ($fname =~ m#$SearchArchive#o); } if ($NotArchive) { next LINE unless ($fname !~ m#$NotArchive#o); } if ($Verbose) { print STDERR "$date $hour $bytes $fname\n"; } unless ($rname || $SearchArchive || $SearchCode || $NotCode) { for ($idx = 0; $idx < $#ArchiveMap; $idx += 3) { if ($ArchiveMap[$idx] eq 'i') { if ($fname =~ m/${ArchiveMap[$idx+1]}/i) { $fname = $ArchiveMap[$idx+2]; last; } } elsif ($fname =~ m/${ArchiveMap[$idx+1]}/) { $fname = $ArchiveMap[$idx+2]; last; } } next LINE unless $fname; # No value indicates URI exclusion } $pathkey = &truncated($fname); # Truncate parts if that is desired # # Get hostname/IP address and determine domain and reversed subdomain. # undef $domain; undef $subdomain; $host =~ tr/A-Z/a-z/; $host =~ s/\.$//; if ($host =~ /^[^.]+$/) # Unqualified hostname { if ($AppendToLocalhost) { $host .= $AppendToLocalhost; } else { if ($PrintInvalids) { print STDERR "$.:$saveline"; } $domain = 'localhost'; $subdomain = $host; } } elsif ($host =~ /^\d+\.\d+\.\d+\.\d+$/) # IP number { if ($LookupDNS && ($dvalue = &resolve($host))) { $host = $dvalue; if ($AppendToLocalhost && ($host =~ /^[^.]+$/)) { $host .= $AppendToLocalhost; } } else { $domain = 'unresolved'; $subdomain = $ShowUnresolved ? $host : 'Unresolved'; } } $host =~ s/\.[\d.]*in-addr\.arpa$//; # Remove any DNS garbage $ident .= '@' . $host; if ($SearchAddress) { next LINE unless ($host =~ m#$SearchAddress#o); } if ($NotAddress) { next LINE unless ($host !~ m#$NotAddress#o); } # # If we haven't already set the subdomain and we don't want the # full subdomain address and this one has a machine name, strip # the machine name and store it reversed (for later sorting/display). # if ($Do_Subdomain && !defined($subdomain)) { @address = split(/\./, $host); # Split into component names if ($host =~ /$AppendToLocalhost$/o) { if (!$LocalFullAddress && ($#address > 1)) { shift(@address); # clip off the machine name } } else { if (!$OthersFullAddress && ($#address > 1)) { shift(@address); # clip off the machine name } } $subdomain = join('.', reverse(@address)); } # # If we haven't already set the domain, find it in %DomainMap # by looking for the longest match. If none, just use last component. # Note that this destroys the value of $host. # if (!defined($domain)) { for (;;) { if (defined($dvalue = $DomainMap{$host})) { next LINE if ($dvalue eq ''); # Indicates domain exclusion last; } last unless ($host =~ s/^[^.]*\.//); } $domain = $host; } # # Now that we have categorized it, add it to the corresponding counters # $TotalRequests++; # Total requests received $TotalBytes += $bytes; # Total bytes sent $DayRequests{$date}++; # Add to Daily Table $DayBytes{$date} += $bytes; if ($Do_Hourly) # Add to Hourly Table? { $HourRequests{$hour}++; $HourBytes{$hour} += $bytes; } if ($Do_Domain) # Add to Domain Table? { $DomainRequests{$domain}++; $DomainBytes{$domain} += $bytes; } if ($Do_Subdomain) # Add to Subdomain Table? { $SubdomainRequests{$subdomain}++; $SubdomainBytes{$subdomain} += $bytes; } if ($Do_Archive) # Add to Archive Table? { $ArchiveRequests{$pathkey}++; $ArchiveBytes{$pathkey} += $bytes; } if ($Do_Ident) # Add to Ident Table? { $IdentRequests{$ident}++; $IdentBytes{$ident} += $bytes; } } continue { last if eof(FILE); $_ = ; } } # ========================================================================== # Initialize the DNS cache and remove entries that have expired. # sub init_DNS { local($ipnum, $value, $host, $seen, @expired); if ($DNScachefile) { dbmopen(%DNScache, $DNScachefile, 0666) || die "Cannot open DBM files $DNScachefile: $!\n"; while (($ipnum, $value) = each %DNScache) { ($host, $seen) = split(/\|/, $value); if ($StartTime > ($seen + $DNSexpires)) { push(@expired, $ipnum); } } foreach $ipnum (@expired) { delete $DNScache{$ipnum}; } } else { %DNScache = (); } } # ========================================================================== # Close the DNS cache # sub close_DNS { if ($DNScachefile) { dbmclose(%DNScache); } } # ========================================================================== # Resolve an IP address to its DNS hostname (if it has one) with caching. # sub resolve { local($ip) = @_; local($ipnum, $value, $host, $seen, $aliases, $addrtype, $length, @addrs); $ipnum = pack('C4', split(/\./, $ip)); if (defined($value = $DNScache{$ipnum})) { ($host, $seen) = split(/\|/, $value); return $host; } ($host, $aliases, $addrtype, $length, @addrs) = gethostbyaddr($ipnum, 2); if (!defined($host)) { $host = ''; } # Many hosts have no DNS names $DNScache{$ipnum} = join('|', $host, time); return $host; } # ========================================================================== # Output the summary in HTML # sub output_summary { local($prefix, $earliest, $latest, $section, $value, @dupes); # # We first need to combine slashless directory names with slashful ones # @dupes = (); while (($section, $value) = each %ArchiveRequests) { if (($section !~ m#/$#) && defined($ArchiveRequests{"$section/"})) { push(@dupes, $section); } } foreach $section (@dupes) { $ArchiveRequests{"$section/"} += $ArchiveRequests{$section}; delete $ArchiveRequests{$section}; $ArchiveBytes{"$section/"} += $ArchiveBytes{$section}; delete $ArchiveBytes{$section}; } undef @dupes; # # And create a sorted date array for later output # @SortedDates = sort datecompare keys %DayRequests; if ($#SortedDates < 0) # Handle case of no data to summarize { $SortedDates[0] = '[none]'; $LastSummary = ''; } if ($ReverseDateSort) { $earliest = $SortedDates[$#SortedDates]; $latest = $SortedDates[0]; } else { $earliest = $SortedDates[0]; $latest = $SortedDates[$#SortedDates]; } # # Finally, we can print out the resulting statistics by section. # # Note: if you have a heavily used server, you may need to increase # the length of the numeric output fields in the forms below. print "\n"; print "$OutputTitle\n"; print "\n"; print "

    $OutputTitle

    \n"; if ($TimeZone) { $Updated .= "(GMT $TimeZone)"; } else { $Updated .= "($UpdatedGMT)"; } print "", $UpdateHeader, $Updated, "\n"; print "
      \n"; &output_xref($Do_Daily, $TopDaily, 'Daily', $DailyHeader); &output_xref($Do_Hourly, $TopHourly, 'Hourly', $HourlyHeader); &output_xref($Do_Domain, $TopDomain, 'Domain', $DomainHeader); &output_xref($Do_Subdomain, $TopSubdomain, 'Subdomain', $SubdomainHeader); &output_xref($Do_Archive, $TopArchive, 'Archive', $ArchiveHeader); &output_xref($Do_Ident, $TopIdent, 'Ident', $IdentHeader); if ($LastSummary) { local($prevmonth, $prevyear) = &lastmonth($earliest); $LastSummary =~ s/%M/$prevmonth/g; $LastSummary =~ s/%Y/$prevyear/g; print "
    • $LastSumHeader\n"; } print "
    \n"; print "

    ", $TotalsHeader, $earliest," to ", $latest, "

    \n"; print $StartTag; printf $TotalsFormat, $ReqRcvHeader, $TotalRequests; printf $TotalsFormat, $BtransHeader, $TotalBytes; printf $TotalsFormat, $AvgReqHeader, ($TotalRequests/($#SortedDates + 1)); printf $TotalsFormat, $AvgByteHeader, ($TotalBytes/($#SortedDates + 1)); print $EndTag; if ($Do_Daily) { &output_daily('Daily'); if ($Do_Daily == 2) { $TopDaily = 0; $SortDaily = 0; &output_daily('AllDaily'); } } if ($Do_Hourly) { &output_hourly('Hourly'); if ($Do_Hourly == 2) { $TopHourly = 0; $SortHourly = 0; &output_hourly('AllHourly'); } } if ($Do_Domain) { &output_domain('Domain'); if ($Do_Domain == 2) { $TopDomain = 0; $SortDomain = 0; &output_domain('AllDomain'); } } if ($Do_Subdomain) { &output_subdomain('Subdomain'); if ($Do_Subdomain == 2) { $TopSubdomain = 0; $SortSubdomain = 0; &output_subdomain('AllSubdomain'); } } if ($Do_Archive) { &output_archive('Archive'); if ($Do_Archive == 2) { $TopArchive = 0; $SortArchive = 0; &output_archive('AllArchive'); } } if ($Do_Ident) { &output_ident('Ident'); if ($Do_Ident == 2) { $TopIdent = 0; $SortIdent = 0; &output_ident('AllIdent'); } } print "
    \n"; print "
    This summary was generated by \n"; print ""; print "$Version\n"; print "
    \n"; print "\n"; } # ========================================================================== # Output the stats for each calendar day represented in the input file(s) # sub output_xref { local($do_section, $topn, $frag, $header) = @_; if ($do_section) { local($prefix) = $topn ? "$PrefixTop $topn" : $PrefixTotal; print "
  • $prefix $header\n"; if ($do_section == 2) { print "
  • $PrefixTotal $header\n"; } } } # ========================================================================== # Output the stats for each calendar day represented in the input file(s) # sub output_daily { local($frag) = @_; local($rqsts, $bytes, $pctrqsts, $pctbytes); local($top) = $TopDaily; local($prefix) = $top ? "$PrefixTop $top" : $PrefixTotal; print "
    \n"; print "

    $prefix $DailyHeader

    \n"; print $StartTag; print $StatsHeader, " Date\n"; print $StatsRule, "------------\n"; local($fmt) = "$StatsFormat %s\n"; foreach $date (@SortedDates) { $rqsts = $DayRequests{$date} || 0; $bytes = $DayBytes{$date} || 0; if ($rqsts == $TotalRequests) { $pctrqsts = "100.0"; } else { $pctrqsts = sprintf("%5.2f", 100*$rqsts/$TotalRequests); } if ($bytes == $TotalBytes) { $pctbytes = "100.0"; } else { $pctbytes = sprintf("%5.2f", 100*$bytes/$TotalBytes); } printf $fmt, $pctrqsts, $pctbytes, $bytes, $rqsts, $date; last if ($top && (--$top == 0)); } print $EndTag; } # ========================================================================== # Output the stats for each hour of the day, accumulating over all days. # sub output_hourly { local($frag) = @_; local($rqsts, $bytes, $pctrqsts, $pctbytes); local($top) = $TopHourly; local($prefix) = $top ? "$PrefixTop $top" : $PrefixTotal; print "
    \n"; print "

    $prefix $HourlyHeader

    \n"; print $StartTag; print $StatsHeader, " Time\n"; print $StatsRule, "-----\n"; local($fmt) = "$StatsFormat %s\n"; foreach $hour (sort hourcompare keys %HourRequests) { $rqsts = $HourRequests{$hour}; $bytes = $HourBytes{$hour}; if ($rqsts == $TotalRequests) { $pctrqsts = "100.0"; } else { $pctrqsts = sprintf("%5.2f", 100*$rqsts/$TotalRequests); } if ($bytes == $TotalBytes) { $pctbytes = "100.0"; } else { $pctbytes = sprintf("%5.2f", 100*$bytes/$TotalBytes); } printf $fmt, $pctrqsts, $pctbytes, $bytes, $rqsts, $hour; last if ($top && (--$top == 0)); } print $EndTag; } # ========================================================================== # Output the stats for each requesting client's domain/country/organization # sub output_domain { local($frag) = @_; local($rqsts, $bytes, $pctrqsts, $pctbytes); local($top) = $TopDomain; local($prefix) = $top ? "$PrefixTop $top" : $PrefixTotal; print "
    \n"; print "

    $prefix $DomainHeader

    \n"; print $StartTag; print $StatsHeader, " Domain\n"; print $StatsRule, "------------------------------------\n"; local($fmt) = "$StatsFormat %-5s %s\n"; foreach $domain (sort domaincompare keys %DomainRequests) { $country = $DomainMap{$domain} || ''; $rqsts = $DomainRequests{$domain}; $bytes = $DomainBytes{$domain}; if ($rqsts == $TotalRequests) { $pctrqsts = "100.0"; } else { $pctrqsts = sprintf("%5.2f", 100*$rqsts/$TotalRequests); } if ($bytes == $TotalBytes) { $pctbytes = "100.0"; } else { $pctbytes = sprintf("%5.2f", 100*$bytes/$TotalBytes); } printf $fmt, $pctrqsts, $pctbytes, $bytes, $rqsts, $domain, $country; last if ($top && (--$top == 0)); } print $EndTag; } # ========================================================================== # Output the stats for each requesting client's DNS subdomain # sub output_subdomain { local($frag) = @_; local($rqsts, $bytes, $pctrqsts, $pctbytes); local($top) = $TopSubdomain; local($prefix) = $top ? "$PrefixTop $top" : $PrefixTotal; print "
    \n"; print "

    $prefix $SubdomainHeader

    \n"; print $StartTag; print $StatsHeader, " Reversed Subdomain\n"; print $StatsRule, "------------------------------------\n"; local($fmt) = "$StatsFormat %s\n"; foreach $subdomain (sort subdomcompare keys %SubdomainRequests) { $rqsts = $SubdomainRequests{$subdomain}; $bytes = $SubdomainBytes{$subdomain}; if ($rqsts == $TotalRequests) { $pctrqsts = "100.0"; } else { $pctrqsts = sprintf("%5.2f", 100*$rqsts/$TotalRequests); } if ($bytes == $TotalBytes) { $pctbytes = "100.0"; } else { $pctbytes = sprintf("%5.2f", 100*$bytes/$TotalBytes); } printf $fmt, $pctrqsts, $pctbytes, $bytes, $rqsts, $subdomain; last if ($top && (--$top == 0)); } print $EndTag; } # ========================================================================== # Output the stats for each archive (URL path or category) # sub output_archive { local($frag) = @_; local($rqsts, $bytes, $pctrqsts, $pctbytes, $asec); local($top) = $TopArchive; local($prefix) = $top ? "$PrefixTop $top" : $PrefixTotal; print "
    \n"; print "

    $prefix $ArchiveHeader

    \n"; print $StartTag; print $StatsHeader, " Archive Section\n"; print $StatsRule, "------------------------------------\n"; local($fmt) = "$StatsFormat %s\n"; foreach $section (sort archivecompare keys %ArchiveRequests) { $rqsts = $ArchiveRequests{$section}; $bytes = $ArchiveBytes{$section}; next unless $rqsts; if ($rqsts == $TotalRequests) { $pctrqsts = "100.0"; } else { $pctrqsts = sprintf("%5.2f", 100*$rqsts/$TotalRequests); } if ($bytes == $TotalBytes) { $pctbytes = "100.0"; } else { $pctbytes = sprintf("%5.2f", 100*$bytes/$TotalBytes); } $asec = $section; $asec =~ s/\&/\&/g; # Replace HTML specials $asec =~ s//\>/g; if ($InsertLink && ($asec =~ m:^/:)) { $asec = "$asec"; } printf $fmt, $pctrqsts, $pctbytes, $bytes, $rqsts, $asec; last if ($top && (--$top == 0)); } print $EndTag; } # ========================================================================== # Output the stats for each calendar day represented in the input file(s) # sub output_ident { local($frag) = @_; local($rqsts, $bytes, $pctrqsts, $pctbytes); local($top) = $TopIdent; local($prefix) = $top ? "$PrefixTop $top" : $PrefixTotal; print "
    \n"; print "

    $prefix $IdentHeader

    \n"; print $StartTag; print $StatsHeader, " Remote Identity\n"; print $StatsRule, "------------------------------------\n"; local($fmt) = "$StatsFormat %s\n"; foreach $ident (sort identcompare keys %IdentRequests) { $rqsts = $IdentRequests{$ident}; $bytes = $IdentBytes{$ident}; if ($rqsts == $TotalRequests) { $pctrqsts = "100.0"; } else { $pctrqsts = sprintf("%5.2f", 100*$rqsts/$TotalRequests); } if ($bytes == $TotalBytes) { $pctbytes = "100.0"; } else { $pctbytes = sprintf("%5.2f", 100*$bytes/$TotalBytes); } printf $fmt, $pctrqsts, $pctbytes, $bytes, $rqsts, $ident; last if ($top && (--$top == 0)); } print $EndTag; } # ========================================================================== # ========================================================================== # The following sort comparison functions take $a and $b as the two # arguments keys or values to compare. Speed is important here. sub datecompare { local($date1) = substr($a, 7, 4) * 512; # Years local($date2) = substr($b, 7, 4) * 512; $date1 += index($AllMonths, substr($a,0,3)) * 12; # Months $date2 += index($AllMonths, substr($b,0,3)) * 12; $date1 += substr($a, 4, 2); # Days $date2 += substr($b, 4, 2); if ($SortDaily == 0) { return ($ReverseDateSort ? $date2 <=> $date1 : $date1 <=> $date2); } if ($SortDaily == 1) { $sdiff = $DayRequests{$b} - $DayRequests{$a}; } else { $sdiff = $DayBytes{$b} - $DayBytes{$a}; } ($sdiff < 0) ? -1 : ($sdiff > 0) ? 1 : ($date1 <=> $date2); } sub hourcompare { if ($SortHourly == 0) { return ($a <=> $b); } if ($SortHourly == 1) { $sdiff = $HourRequests{$b} - $HourRequests{$a}; } else { $sdiff = $HourBytes{$b} - $HourBytes{$a}; } ($sdiff < 0) ? -1 : ($sdiff > 0) ? 1 : ($a <=> $b); } sub domaincompare { if ($SortDomain == 0) { $sdiff = length($a) - length($b); } elsif ($SortDomain == 1) { $sdiff = $DomainRequests{$b} - $DomainRequests{$a}; } else { $sdiff = $DomainBytes{$b} - $DomainBytes{$a}; } ($sdiff < 0) ? -1 : ($sdiff > 0) ? 1 : ($a cmp $b); } sub subdomcompare { if ($SortSubdomain == 0) { return ($a cmp $b); } if ($SortSubdomain == 1) { $sdiff = $SubdomainRequests{$b} - $SubdomainRequests{$a}; } else { $sdiff = $SubdomainBytes{$b} - $SubdomainBytes{$a}; } ($sdiff < 0) ? -1 : ($sdiff > 0) ? 1 : ($a cmp $b); } sub archivecompare { if ($SortArchive == 0) { return ($a cmp $b); } if ($SortArchive == 1) { $sdiff = $ArchiveRequests{$b} - $ArchiveRequests{$a}; } else { $sdiff = $ArchiveBytes{$b} - $ArchiveBytes{$a}; } ($sdiff < 0) ? -1 : ($sdiff > 0) ? 1 : ($a cmp $b); } sub identcompare { if ($SortIdent == 0) { return ($a cmp $b); } if ($SortIdent == 1) { $sdiff = $IdentRequests{$b} - $IdentRequests{$a}; } else { $sdiff = $IdentBytes{$b} - $IdentBytes{$a}; } ($sdiff < 0) ? -1 : ($sdiff > 0) ? 1 : ($a cmp $b); } # =========================================================================== # This is a modified (by Roy Fielding) version of Perl 4.036's ctime.pl # library by Waldemar Kebsch and # Marion Hakanson . It is distributed under the # Artistic License (included with your Perl distribution files). # # # wtime returns a time string in the format "Wkd, Dy Mon Year HH:MM:SS Zone" # with no newline appended. # # USAGE: # # wtime(time,''); -- returns the local time with no timezone appended # As in "Wed, 15 Dec 1993 23:59:59 " # # wtime(time,'GMT'); -- returns GMT time # As in "Wed, 16 Dec 1993 07:59:59 GMT" # sub wtime { local($time, $TZ) = @_; local($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst); local(@DoW) = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); local(@MoY) = ('Jan','Feb','Mar','Apr','May','Jun', 'Jul','Aug','Sep','Oct','Nov','Dec'); # Determine what time zone is in effect. Use local time if # TZ is anything other than 'GMT' # There's no portable way to find the system default timezone. ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = ($TZ eq 'GMT') ? gmtime($time) : localtime($time); $year += ($year < 70) ? 2000 : 1900; sprintf("%s, %02d %s %4d %02d:%02d:%02d %s", $DoW[$wday], $mday, $MoY[$mon], $year, $hour, $min, $sec, $TZ); } # =========================================================================== # This last routine returns the three letter abbreviation for the month # before the one in the date that was passed as an argument, and its year. # sub lastmonth { local($date) = @_; # Must be in the format "Feb 01 1994" local($midx) = index($AllMonths, substr($date,0,3)); local($year) = substr($date,7,4); if ($midx < 0) { return ('Err', ''); } elsif ($midx == 0) { return ('Dec', ($year - 1)); } else { return (substr($AllMonths,($midx - 3),3), $year); } } cgi-bin/stats/wwwstat-2.0/splitlog.10000640000372000001540000002527007005603741017131 0ustar affweblibuuid.\" Copyright (c) 1996 Regents of the University of California. .\" All rights reserved. The file LICENSE (the Artistic License) .\" specifies the terms and conditions for redistribution. .\" .if n .tr \-- .if n .tr \(buo .if n .tr \(em- .TH splitlog 1 "03 November 1996" .if n .ad l .SH NAME splitlog \- split WWW server (httpd) access logfiles .SH SYNOPSIS .HP 8 .B splitlog .RB [ \-f .IR configfile ] .RI [ options ...] .RB [ -- ] .if n .br .RI "[ " "logfile" " | " .BR + " | " \- " ]..." .SH DESCRIPTION .nh .B splitlog reads a sequence of .B httpd common logfile format (CLF) access_log files and/or the standard input and splits the logfile entries into separate files according to the entry's requested URL or virtual host prefix. .LP .B splitlog is intended to be run periodically by the webmaster as a means for providing individual logfiles for each of the customers of a server, since it is less efficient for the server itself to generate multiple logfiles. .B splitlog does not make any changes to the input file and can be configured to write the split files in any directory. By default, a cached DNS lookup is performed on any IP addresses which are unresolved in the input file. The log entries can also be anonymized if there are concerns about the requesting clients' privacy. .LP .B splitlog is a .B perl script, which means you need to have a .B perl interpreter to run the program. It has been tested with .B perl versions 4.036 and 5.002. .SH OPTIONS .SS Configuration Options These options define how .B splitlog should establish defaults and interpret the command-line. .TP .BI \-f " filename" Get the configuration defaults from the given file. If used, this .B must be the first argument on the command-line, since it needs to be interpreted before the other command options. The file .B splitlog.rc is included with the distribution as an example of this file; it contains .B perl source code which directly sets the control and display options provided by .B splitlog and contains a function for altering the split logfile name-selection algorithm. If .I filename is not a pathname, the include path (see .BR FILES ) is searched for .IR filename . An empty string as .I filename will disable this feature. .RB [ \-f "splitlog.rc"] .TP .B -- Last option (the remaining arguments are treated as input files). .SS Diagnostic Options These options provide information about .B splitlog usage or about some unusual aspects of the logfile(s) being processed. .TP .B \-h Help \(em display usage information to STDERR and then exit. .TP .B \-e Display to STDERR all invalid log entries. Invalid log entries can occur if the server is miswriting or overwriting its own log, if the request is made by a broken client or proxy, or if a malicious attacker is trying to gain privileged access to your system. .SS Process Options These options modify how and where logfile entries are written. .TP .B \-x Discard any logfile entries without a filename key instead of placing them in a special OTHERS.log. .TP .B \-v Use a prefix of the input file entries (ended by the first ":" or space) for selecting the output filename instead of, or in addition to, the URL path. The most likely use for such a prefix is for the requested virtual host. .TP .BI \-dir " directory" Place the output logfiles in the given directory instead of the current working directory. .TP .BI \-anon " imu" Anonymize the logfile entries before writing them to split logs. The value is some combination of the letters "i" (ident field is removed), "m" (machine name is replaced with ANON or 0), and "u" (authentication userid field is removed). .LP .PD 0 .B \-dns .TP .B \-nodns .PD Do .RB ( \-dns ) or don't .RB ( \-nodns ) use the system's hostname lookup facilities to find the DNS hostname associated with any unresolved IP addresses. Looking up a DNS name may be .B very slow, particularly when the results are negative (no DNS name), which is why a caching capability is included as well. .RB [ \-dns ] .TP .BI \-cache " filename" Use the given DBM database as the read/write persistent DNS cache (the .dir and .pag extensions are appended automatically). Cached entries (including negative results) are removed after the time configured for $DNSexpires [two months]. No caching is performed if .I filename is the empty string, which may be needed if your system does not support DBM or NDBM functionality. Running .B \-dns without a persistent cache is not recommended. .RB [ "\-cache" "dnscache"] .SS Search Options These options are used to include or exclude logfile entries from being output according to whether or not they match a given pattern. The pattern is supplied in the form of a .BR "perl regular expression" , except that the characters "+" and "." are escaped automatically unless the .B \-noescape option is given. Enclose the pattern in single-quotes to prevent the command shell from interpreting some special characters. Multiple occurrences of the same option results in an OR-ing of the regular expressions. .LP .PD 0 .BI \-a " regexp" .TP .BI \-A " regexp" .PD Include .RB ( \-a ) or exclude .RB ( \-A ) all requests containing a hostname/IP address matching the given perl regular expression. .LP .PD 0 .BI \-c " regexp" .TP .BI \-C " regexp" .PD Include .RB ( \-c ) or exclude .RB ( \-C ) all requests resulting in an .B HTTP status code matching the given perl regular expression. .LP .PD 0 .BI \-d " regexp" .TP .BI \-D " regexp" .PD Include .RB ( \-d ) or exclude .RB ( \-D ) all requests occurring on a date (e.g., "Feb 02 1994") matching the given perl regular expression. .LP .PD 0 .BI \-t " regexp" .TP .BI \-T " regexp" .PD Include .RB ( \-t ) or exclude .RB ( \-T ) all requests occurring during the hour (e.g., "23" is 11pm \- 12pm) matching the given perl regular expression. .LP .PD 0 .BI \-m " regexp" .TP .BI \-M " regexp" .PD Include .RB ( \-m ) or exclude .RB ( \-M ) all requests using an HTTP method (e.g., "HEAD") matching the given perl regular expression. .LP .PD 0 .BI \-n " regexp" .TP .BI \-N " regexp" .PD Include .RB ( \-n ) or exclude .RB ( \-N ) all requests on a URL (archive name) matching the given perl regular expression. .TP .B \-noescape Do not escape the special characters ("+" and ".") in the remaining search options. .SH INPUT After parsing the options, the remaining arguments on the command-line are treated as input arguments and are read in the order given. If no input arguments are given, the configured default logfile is read .RB [ + ]. .TP .B \- Read from standard input (STDIN). .TP .B + Read the default logfile. [as configured] .TP .IR logfile ... Read the given logfile. If the .IR logfile 's extension indicates that is is compressed (gz|z|Z), then pipe it through the configured decompression program .RB [ "gunzip \-c" ] first. .SH USAGE In most cases, .B splitlog is run on a periodic basis by a wrapper program as a .B crontab entry shortly after midnight, typically in conjunction with rotating the current logfile. The .B \-D today option can be used to split the main logfile on a daily basis without rotation. .LP All of the command-line options, and a few options that are not available from the command-line, can be changed within the user configuration file (see .BR splitlog.rc ). This file is actually a .B perl library module which is executed as part of the program's initialization. The example provided with the distribution includes complete documentation on what variables can be set and their range of values. If the default algorithm for selecting the split logfile name isn't desired, or if some set of names should be combined into a single file, then uncomment the user_path_map() function and define your own name-selection algorithm. .LP The .B wwwstat program can be used to analyze the resulting logfiles. See .B wwwstat for a description of the common logfile format. .SS Perl Regular Expressions The Search Options and many of the configuration file settings allow for full use of perl regular expressions (with the exception that the \-a, \-A, \-n and \-N options treat '+' and '.' characters as normal alphabetic characters unless they are preceded by the .B \-noescape option). Most people only need to know the following special characters: .LP .PD 0 .TP 8 .B ^ at start of pattern, means "starts with pattern". .TP .B $ at end of pattern, means "ends with pattern". .TP .B (...) groups pattern elements as a single element. .TP .B ? matches preceding element zero or one times. .TP .B * matches preceding element zero or more times. .TP .B + matches preceding element one or more times. .TP .B . matches any single character. .TP .B [...] denotes a class of characters to match. [^...] negates the class. Inside a class, '-' indicates a range of characters. .TP .B (A|B|C) matches if A or B or C matches. .PD .LP Depending on your command shell, some special characters may need to be escaped on the command line or enclosed in single-quotes to avoid shell interpretation. .SH ENVIRONMENT .TP 12 .B HOME Location of user's home directory, placed on INC path. .TP .B LOGDIR Used instead of HOME if latter is undefined. .TP .B PERLLIB A colon-separated list of directories in which to look for the user configuration file. .SH FILES Unless a pathname is supplied, the configuration file is obtained from the current directory, the user's home directory .RB ( HOME " or " LOGDIR ), the standard library path .RB ( PERLLIB ), and the directory indicated by the command pathname (in that order). .TP 15 .B splitlog.rc User configuration file. .LP .PD 0 .B dnscache.dir .TP 15 .B dnscache.pag .PD DBM files for persistent DNS cache. .SH SEE ALSO .BR crontab (1), .BR httpd (1m), .BR perl (1), .BR wwwstat (1) .LP More info and the latest version of splitlog can be obtained from .LP http://www.ics.uci.edu/pub/websoft/wwwstat/ ftp://www.ics.uci.edu/pub/websoft/wwwstat/ .LP If you have any suggestions, bug reports, fixes, or enhancements, please join the mailing list by sending e-mail with "subscribe" in the subject of the message to the request address . The list is archived at the above address. .SS More About Perl .TP The Perl Language Home Page http://www.perl.com/perl/index.html .TP Johan Vromans' Perl Reference Guide http://www.xs4all.nl/~jvromans/perlref.html .SH AUTHOR Roy Fielding (fielding@ics.uci.edu), University of California, Irvine. Please do not send questions or requests to the author, since the number of requests has long since overwhelmed his ability to reply, and all future support will be through the mailing list (see above). .LP This work has been sponsored in part by the Defense Advanced Research Projects Agency under Grant Numbers MDA972-91-J-1010 and F30602-94-C-0218. This software does not necessarily reflect the position or policy of the U.S. Government and no official endorsement should be inferred. cgi-bin/stats/wwwstat-2.0/wwwstat.ps0000640000372000001540000025256707005603741017311 0ustar affweblibuuid%!PS-Adobe-1.0 %%DocumentFonts: %%Creator: troff->tpscript %%CreationDate: Sun Nov 3 18:10:41 1996 %%Pages: (atend) %%EndComments /vmstat save def initmatrix 0.1000 dup scale clippath pathbbox pop pop exch pop 0 exch translate clippath pathbbox /pgtop exch def pop pop pop /page { copypage erasepage restore save home } def /home { newpath 0 pgtop moveto } def /mf { statusdict /manualfeed true put } def /af { statusdict /manualfeed false put } def af 0 0 moveto 2 setlinecap /y { neg 0 exch rmoveto } def /X { currentpoint exch pop moveto } def /Y { pgtop exch sub currentpoint pop exch moveto } def /s { show } def /l { neg rlineto currentpoint stroke moveto } def /c { 2 div /rad exch def currentpoint /y0 exch def /x0 exch def newpath x0 rad add y0 rad 0 360 arc stroke x0 rad add rad add y0 moveto } def /a { /y2 exch neg def /x2 exch def /y1 exch neg def /x1 exch def x1 y1 rmoveto currentpoint currentpoint x2 x2 mul y2 y2 mul add sqrt y1 neg x1 neg atan y2 x2 atan newpath arc stroke moveto x2 y2 rmoveto } def /e { 2 div /yrad exch def 2 div /xrad exch def currentpoint /y0 exch def /x0 exch def x0 xrad add y0 translate xrad yrad scale newpath 0 0 1 0 360 arc savematrix setmatrix stroke x0 xrad add xrad add y0 moveto } def /spln { rcurveto currentpoint stroke moveto } def /ft { /fonttype exch def /xsiz exch def /ysiz exch def /sl exch def fonttype [ xsiz pt 0 sl sin sl cos div ysiz pt mul ysiz pt 0 0 ] makefont setfont xsiz 1.7 div setlinewidth } def /pt { 10 mul } def -90 230 translate /savematrix matrix currentmatrix def /BracketFontDict 9 dict def /$workingdict 10 dict def BracketFontDict begin /FontType 3 def /FontName (Bracket) cvn def /FontMatrix [ 0.001 0 0 0.001 0 0] def /FontBBox [ -50 -250 1000 1000 ] def /Encoding 256 array def 0 1 255 { Encoding exch /.notdef put } for Encoding dup 65 /Cbv put dup 66 /Clt put dup 67 /Clk put dup 68 /Clb put dup 69 /Crt put dup 70 /Crk put dup 71 /Crb put dup 72 /Clc put dup 73 /Clf put dup 74 /Crc put dup 75 /Crf put dup 76 /Cbr put dup 77 /Crn put dup 78 /Cci put dup 79 /C|| put dup 80 /C^^ put dup 81 /Cr1 put dup 82 /Cr2 put pop /CharProcs 24 dict dup begin /setC { 0 -50 -250 500 1000 setcachedevice} def /C.bv {220 -250 moveto 0 1000 rlineto 60 0 rlineto 0 -1000 rlineto fill } def /C.barc { 750 moveto 180 0 rlineto 0 -60 rlineto -180 0 rlineto fill } def /C.barf { -250 moveto 180 0 rlineto 0 60 rlineto -180 0 rlineto fill } def /C.brk.end { 1 setlinewidth moveto rlineto rcurveto reversepath 60 0 rlineto rlineto rcurveto fill } def /C.setl {dup dtransform exch round exch idtransform pop setlinewidth } def /Cbv { 500 setC C.bv } def /Clt { 500 setC 0 150 50 210 140 250 0 730 0 150 50 250 200 250 0 750 220 -250 C.brk.end } def /Clk { 500 setC 1 setlinewidth 220 -250 moveto 0 400 rlineto 0 50 -50 100 -100 100 rcurveto 50 0 100 50 100 100 rcurveto 0 400 rlineto 60 0 rlineto 0 -400 rlineto 0 -50 -50 -100 -100 -100 rcurveto 50 0 100 -50 100 -100 rcurveto 0 -400 rlineto closepath fill } def /Clb { 500 setC 0 -150 50 -210 140 -250 0 -730 0 -150 50 -250 200 -250 0 -750 220 750 C.brk.end } def /Crt { 500 setC 0 150 -50 250 -200 250 0 750 0 150 -50 210 -140 250 0 730 220 -250 C.brk.end } def /Crk { 500 setC 1 setlinewidth 220 -250 moveto 0 400 rlineto 0 50 50 100 100 100 rcurveto -50 0 -100 50 -100 100 rcurveto 0 400 rlineto 60 0 rlineto 0 -400 rlineto 0 -50 50 -100 100 -100 rcurveto -50 0 -100 -50 -100 -100 rcurveto 0 -400 rlineto fill } def /Crb { 500 setC 0 -150 -50 -250 -200 -250 0 -750 0 -150 -50 -210 -140 -250 0 -730 220 750 C.brk.end } def /Clc { 500 setC C.bv 280 C.barc } def /Clf { 500 setC C.bv 280 C.barf } def /Crc { 500 setC C.bv 40 C.barc } def /Crf { 500 setC C.bv 40 C.barf } def /Cbr { 0 0 -50 -250 0 1000 setcachedevice 40 C.setl 0 -250 moveto 0 1000 rlineto stroke } def /Crn { 500 setC 40 C.setl 0 895 moveto 500 0 rlineto stroke } def /Cci { 1000 0 -50 -250 1000 1000 setcachedevice 40 C.setl 500 250 400 0 360 arc stroke } def /C|| { 170 0 -50 -250 170 1000 setcachedevice } def /C^^ { 80 0 -50 -250 80 1000 setcachedevice } def /Cr1 { 800 0 -50 -250 800 1000 setcachedevice 40 C.setl 0 setlinejoin 700 180 moveto -650 currentlinewidth add 0 rlineto 200 -200 rlineto 50 360 moveto 650 currentlinewidth sub 0 rlineto -200 200 rlineto stroke } def /Cr2 { 800 0 -50 -250 800 1000 setcachedevice 40 C.setl 2 setlinejoin 217 18 moveto -150 150 rlineto 150 150 rlineto -150 -150 rlineto 633 0 rlineto 50 360 moveto 633 0 rlineto -150 150 rlineto 150 -150 rlineto -150 -150 rlineto stroke } def end def /BuildChar { $workingdict begin /charcode exch def /fontdict exch def fontdict /CharProcs get begin fontdict /Encoding get charcode get load gsave 0 setlinecap 0 setgray newpath exec grestore end end } def end /BracketFont BracketFontDict definefont pop /f.R /Times-Roman findfont def /f.I /Times-Italic findfont def /f.B /Times-Bold findfont def /f.BI /Times-BoldItalic findfont def /f.H /Helvetica findfont def /f.HB /Helvetica-Bold findfont def /f.HO /Helvetica-Oblique findfont def /f.HX /Helvetica-BoldOblique findfont def /f.C /Courier findfont def /f.CB /Courier-Bold findfont def /f.CO /Courier-Oblique findfont def /f.CX /Courier-BoldOblique findfont def /f.BR /Bookman-Light findfont def /f.BO /Bookman-LightItalic findfont def /f.BB /Bookman-Demi findfont def /f.BX /Bookman-DemiItalic findfont def /f.S /Symbol findfont def /f.S2 /BracketFont findfont def 0.0 10 10 f.R ft save home %%EndProlog 0 Y %%Page: 1 1 694 X 480 Y(wwwstat)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\()s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(1)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\))s 2586 X(USER COMMANDS )s 4852 X(wwwstat)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\()s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(1)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\))s 694 X 960 Y 0.0 9 9 f.B ft(NAME)s 992 X 0.0 9 9 f.S2 ft(O)s 1030 X(O)s 1068 X(O)s 1106 X(O)s 1144 X(O)s 694 X 1080 Y 1054 X 0.0 10 10 f.R ft(wwwstat)s 1434 X(\261)s 1509 X(summarize)s 1972 X(WWW)s 2279 X(server)s 2547 X(\(httpd\))s 2844 X(access)s 3123 X(statistics)s 694 X 1248 Y 0.0 9 9 f.B ft(SYNOPSIS)s 1157 X 0.0 9 9 f.S2 ft(O)s 1195 X(O)s 1233 X(O)s 1271 X(O)s 1309 X(O)s 694 X 1368 Y 1054 X 0.0 10 10 f.B ft(wwwstat)s 1450 X 0.0 10 10 f.R ft([)s 0.0 10 10 f.B ft(\261F)s 1619 X 0.0 10 10 f.I ft(system_con\256g)s 0.0 10 10 f.S2 ft(P)s 0.0 10 10 f.R ft(])s 2245 X([)s 0.0 10 10 f.B ft(\261f)s 2386 X 0.0 10 10 f.I ft(user_con\256g)s 0.0 10 10 f.S2 ft(P)s 0.0 10 10 f.R ft(])s 2918 X([)s 0.0 10 10 f.I ft(options)s 0.0 10 10 f.S2 ft(P)s 0.0 10 10 f.R ft(...])s 3387 X([)s 0.0 10 10 f.B ft(--)s 0.0 10 10 f.R ft(])s 3544 X([)s 3602 X 0.0 10 10 f.I ft(summary)s 0.0 10 10 f.S2 ft(P)s 4001 X 0.0 10 10 f.R ft(|)s 4046 X 0.0 10 10 f.I ft(log\256le)s 0.0 10 10 f.S2 ft(P)s 4329 X 0.0 10 10 f.R ft(|)s 4374 X 0.0 10 10 f.B ft(+)s 4456 X 0.0 10 10 f.R ft(|)s 4501 X 0.0 10 10 f.B ft(\261)s 4576 X 0.0 10 10 f.R ft(]...)s 694 X 1536 Y 0.0 9 9 f.B ft(DESCRIPTION)s 1342 X 0.0 9 9 f.S2 ft(O)s 1380 X(O)s 1418 X(O)s 1456 X(O)s 1494 X(O)s 694 X 1656 Y 1054 X 0.0 10 10 f.B ft(wwwstat)s 1459 X 0.0 10 10 f.R ft(reads)s 1703 X(a)s 1781 X(sequence)s 2180 X(of)s 2297 X 0.0 10 10 f.B ft(httpd)s 2565 X 0.0 10 10 f.R ft(common)s 2949 X(log\256le)s 3239 X(format)s 3539 X(\(CLF\))s 3823 X(access_log)s 4288 X(\256les)s 4488 X(and/or)s 4776 X(prior)s 5003 X 0.0 10 10 f.B ft(wwwstat)s 694 X 1776 Y 1054 X 0.0 10 10 f.R ft(output)s 1335 X(summary)s 1732 X(\256les)s 1924 X(and/or)s 2204 X(the)s 2351 X(standard)s 2714 X(input)s 2945 X(and)s 3114 X(outputs)s 3434 X(a)s 3503 X(summary)s 3900 X(of)s 4008 X(the)s 4155 X(access)s 4434 X(statistics)s 4804 X(in)s 4907 X(HTML.)s 694 X 1944 Y 1054 X(Since)s 1309 X 0.0 10 10 f.B ft(wwwstat)s 1713 X 0.0 10 10 f.R ft(does)s 1929 X(not)s 2090 X(make)s 2339 X(any)s 2516 X(changes)s 2870 X(to)s 2981 X(the)s 3136 X(input)s 3375 X(\256les)s 3574 X(or)s 3689 X(write)s 3926 X(any)s 4102 X(\256les)s 4301 X(in)s 4411 X(the)s 4565 X(server)s 4840 X(directories,)s 5318 X(it)s 694 X 2064 Y 1054 X(can)s 1230 X(be)s 1362 X(run)s 1533 X(by)s 1671 X(any)s 1853 X(user)s 2056 X(with)s 2271 X(read)s 2479 X(access)s 2770 X(to)s 2885 X(the)s 3044 X(input)s 3287 X(log\256le\(s\))s 3685 X(and)s 3866 X(summary)s 4275 X(\256le\(s\).)s 4595 X(This)s 4810 X(allows)s 5108 X(people)s 694 X 2184 Y 1054 X(other)s 1284 X(than)s 1481 X(the)s 1628 X(webmaster)s 2085 X(to)s 2188 X(run)s 2346 X(specialized)s 2814 X(analyses)s 3177 X(of)s 3285 X(just)s 3455 X(the)s 3602 X(things)s 3872 X(they)s 4069 X(are)s 4215 X(interested)s 4628 X(in)s 4731 X(summarizing.)s 694 X 2352 Y 1054 X 0.0 10 10 f.B ft(wwwstat)s 1460 X 0.0 10 10 f.R ft(provides)s 1839 X(World)s 2129 X(Wide)s 2380 X(Web)s 2603 X(\(WWW\))s 2986 X(access)s 3275 X(statistics,)s 3680 X(which)s 3959 X(does)s 4177 X(not)s 4340 X(necessarily)s 4818 X(correspond)s 5296 X(to)s 694 X 2472 Y 1054 X(statistics)s 1425 X(on)s 1551 X(individual)s 1983 X(users.)s 2239 X(It)s 2326 X(counts)s 2613 X(the)s 2761 X(number)s 3092 X(of)s 3201 X 0.0 10 10 f.B ft(HTTP)s 3500 X 0.0 10 10 f.R ft(requests)s 3853 X(received)s 4216 X(by)s 4342 X(the)s 4490 X(server)s 4758 X(and)s 4927 X(the)s 5074 X(amount)s 694 X 2592 Y 1054 X(of)s 1169 X(bytes)s 1412 X(transmitted)s 1894 X(in)s 2004 X(response)s 2385 X(to)s 2495 X(those)s 2738 X(requests,)s 3122 X(according)s 3547 X(to)s 3657 X(what)s 3883 X(is)s 3982 X(in)s 4092 X(the)s 4245 X(log\256le\(s\),)s 4662 X(and)s 4837 X(outputs)s 5163 X(those)s 694 X 2712 Y 1054 X(counts)s 1340 X(as)s 1448 X(tables)s 1706 X(broken)s 2008 X(down)s 2255 X(by)s 2380 X(category)s 2748 X(of)s 2856 X(request.)s 694 X 2880 Y 1054 X 0.0 10 10 f.B ft(wwwstat)s 1461 X 0.0 10 10 f.R ft(output)s 1753 X(summaries)s 2222 X(can)s 2396 X(be)s 2526 X(read)s 2733 X(by)s 2868 X 0.0 10 10 f.B ft(gwstat)s 3180 X 0.0 10 10 f.R ft(to)s 3293 X(produce)s 3649 X(fancy)s 3905 X(graphs)s 4206 X(of)s 4324 X(the)s 4481 X(summarized)s 5004 X(statistics.)s 694 X 3000 Y 1054 X(The)s 1234 X 0.0 10 10 f.B ft(splitlog)s 1571 X 0.0 10 10 f.R ft(program)s 1934 X(can)s 2097 X(be)s 2216 X(used)s 2424 X(to)s 2527 X(split)s 2725 X(a)s 2794 X(large)s 3018 X(log\256le)s 3299 X(into)s 3480 X(separate)s 3831 X(\256les)s 4023 X(by)s 4148 X(entry)s 4378 X(pre\256x)s 4636 X(or)s 4744 X(URL)s 4969 X(path.)s 694 X 3168 Y 1054 X 0.0 10 10 f.B ft(wwwstat)s 1455 X 0.0 10 10 f.R ft(is)s 1552 X(a)s 1625 X 0.0 10 10 f.B ft(perl)s 1826 X 0.0 10 10 f.R ft(script,)s 2102 X(which)s 2375 X(means)s 2659 X(you)s 2838 X(need)s 3055 X(to)s 3162 X(have)s 3379 X(a)s 3452 X 0.0 10 10 f.B ft(perl)s 3653 X 0.0 10 10 f.R ft(interpreter)s 4097 X(to)s 4204 X(run)s 4366 X(the)s 4517 X(program.)s 4934 X(It)s 5024 X(has)s 5186 X(been)s 694 X 3288 Y 1054 X(tested)s 1312 X(with)s 1515 X 0.0 10 10 f.B ft(perl)s 1712 X 0.0 10 10 f.R ft(versions)s 2070 X(4.036)s 2320 X(and)s 2489 X(5.002.)s 694 X 3456 Y 874 X 0.0 9 9 f.B ft(Output)s 1177 X 0.0 9 9 f.S2 ft(O)s 0.0 9 9 f.B ft(Sections)s 1530 X 0.0 9 9 f.S2 ft(O)s 1568 X(O)s 1606 X(O)s 1644 X(O)s 694 X 3576 Y 1054 X 0.0 10 10 f.B ft(wwwstat)s 0.0 10 10 f.R ft('s)s 1530 X(output)s 1819 X(consists)s 2169 X(of)s 2285 X(a)s 2362 X(set)s 2506 X(of)s 2622 X(cross-reference)s 3262 X(links,)s 3515 X(the)s 3670 X(sum)s 3870 X(totals)s 4120 X(and)s 4297 X(averages)s 4678 X(for)s 4827 X(the)s 4981 X(processed)s 694 X 3696 Y 1054 X(data,)s 1286 X(and)s 1471 X(a)s 1556 X(sequence)s 1962 X(of)s 2086 X(amount-by-category)s 2936 X(tables)s 3210 X(partitioned)s 3683 X(into)s 3879 X(sections.)s 4291 X(The)s 4486 X(section)s 4809 X(categories)s 5253 X(are)s 694 X 3816 Y 1054 X(based)s 1308 X(on)s 1435 X(the)s 1584 X(characteristics)s 2181 X(evident)s 2502 X(from)s 2723 X(the)s 2872 X(access)s 3153 X(request,)s 3493 X(as)s 3603 X(provided)s 3985 X(by)s 4112 X(the)s 4261 X(common)s 4638 X(log\256le)s 4921 X(format)s 5214 X(\(see)s 694 X 3936 Y 1054 X 0.0 10 10 f.B ft(NOTES)s 0.0 10 10 f.R ft(\).)s 1502 X(These)s 1765 X(include:)s 694 X 4104 Y 1054 X(Request)s 1401 X(Date)s 2054 X(e.g.,)s 2248 X("Feb)s 2489 X(2)s 2564 X(1996")s 694 X 4272 Y 1054 X(Request)s 1401 X(Hour)s 2054 X(e.g.,)s 2248 X("00")s 2455 X(through)s 2791 X("23")s 694 X 4440 Y 1054 X(Client)s 1324 X(Domain)s 2054 X(The)s 2278 X(Fully-Quali\256ed)s 2964 X(Domain)s 3355 X(Name)s 3662 X(\(FQDN\))s 4069 X(su)s /Cff { (f) show xsiz pt 20 div neg 0 rmoveto (f) s } def Cff(ix)s 4366 X(that)s 4584 X(corresponds)s 5134 X(to)s 5280 X(an)s 694 X 4560 Y 2054 X(organization)s 2578 X(type)s 2775 X(or)s 2883 X(country)s 3213 X(name.)s 694 X 4728 Y 1054 X(Reversed)s 1450 X(Subdomain)s 2054 X(The)s 2246 X(FQDN,)s 2579 X(usually)s 2904 X(minus)s 3185 X(the)s 3343 X(\256rst)s 3535 X(\(machine)s 3942 X(name\))s 4227 X(component,)s 4732 X(and)s 4912 X(reversed)s 5285 X(so)s 694 X 4848 Y 2054 X(that)s 2229 X(it)s 2310 X(is)s 2402 X(easier)s 2659 X(to)s 2762 X(read)s 2958 X(when)s 3199 X(sorted.)s 694 X 5016 Y 1054 X(URL/Archive)s 2054 X(Grouping)s 2462 X(based)s 2714 X(on)s 2839 X(Request-URI)s 3391 X(or)s 3499 X(non-success)s 4006 X(status)s 4259 X(code.)s 694 X 5184 Y 1054 X(Identity)s 2054 X(The)s 2234 X(user)s 2425 X(identity)s 2756 X(based)s 3008 X(on)s 3133 X(IdentityCheck)s 3724 X(token)s 3971 X(or)s 4079 X(Authorization)s 4659 X(\256eld.)s 694 X 5352 Y 1054 X(Each)s 1290 X(section)s 1610 X(can)s 1784 X(be)s 1914 X(enabled/disabled)s 2621 X(using)s 2874 X(the)s 3032 X(con\256guration)s 3601 X(\256les)s 3804 X(or)s 3923 X(command-line)s 4536 X(options)s 4867 X(\(see)s 5063 X 0.0 10 10 f.B ft(Section)s 694 X 5472 Y 1054 X(Display)s 1402 X(Options)s 0.0 10 10 f.R ft(\).)s 694 X 5640 Y 874 X 0.0 9 9 f.B ft(Output)s 1177 X 0.0 9 9 f.S2 ft(O)s 0.0 9 9 f.B ft(Table)s 1435 X 0.0 9 9 f.S2 ft(O)s 0.0 9 9 f.B ft(Format)s 1763 X 0.0 9 9 f.S2 ft(O)s 1801 X(O)s 1839 X(O)s 694 X 5760 Y 1054 X 0.0 10 10 f.R ft(Inside)s 1323 X(each)s 1530 X(section,)s 1863 X(the)s 2010 X(statistics)s 2380 X(are)s 2526 X(presented)s 2933 X(as)s 3041 X(a)s 3110 X(preformatted)s 3650 X(table.)s 694 X 5928 Y 1054 X 0.0 10 10 f.C ft(%Reqs)s 1414 X(%Byte)s 1834 X(Bytes)s 2194 X(Sent)s 2554 X(Requests)s 3179 X 0.0 10 10 f.I ft(category-type)s 694 X 6048 Y 1054 X 0.0 10 10 f.C ft(-----)s 1414 X(-----)s 1774 X(------------)s 2554 X(--------)s 3094 X(|---------------)s 694 X 6168 Y 1054 X(NN.NN)s 1414 X(NN.NN)s 1774 X(NNNNNNNNNNNN)s 2554 X(NNNNNNNN)s 3094 X(|)s 3179 X 0.0 10 10 f.I ft(category-value)s 694 X 6288 Y 1054 X 0.0 10 10 f.C ft(100.0)s 1414 X(100.0)s 1774 X(NNNNNNNNNNNN)s 2554 X(NNNNNNNN)s 3094 X(|)s 3179 X 0.0 10 10 f.I ft(category-value)s 694 X 6456 Y 1054 X 0.0 10 10 f.R ft(Requests)s 1654 X(Requests)s 2040 X(received)s 2402 X(for)s 2543 X(this)s 2713 X(category-value.)s 694 X 6576 Y 1054 X(Bytes)s 1307 X(Sent)s 1654 X(Bytes)s 1907 X(transmitted)s 2382 X(for)s 2523 X(this)s 2693 X(category-value.)s 694 X 6696 Y 1054 X(%Reqs)s 1654 X(\(/\))s 0.0 10 10 f.S ft(*)s 0.0 10 10 f.R ft(100.)s 694 X 6816 Y 1054 X(%Byte)s 1654 X(\(/\))s 0.0 10 10 f.S ft(*)s 0.0 10 10 f.R ft(100.)s 694 X 6984 Y 1054 X(The)s 1238 X(table)s 1461 X(can)s 1628 X(be)s 1751 X(sorted)s 2024 X(by)s 2153 X(category-value)s 2774 X(\()s 0.0 10 10 f.B ft(\261sort)s 3051 X(key)s 0.0 10 10 f.R ft(\),)s 3287 X(number)s 3620 X(of)s 3731 X(requests)s 4086 X(received)s 4451 X(\()s 0.0 10 10 f.B ft(\261sort)s 4728 X(req)s 0.0 10 10 f.R ft(\),)s 4958 X(or)s 5069 X(number)s 694 X 7104 Y 1054 X(of)s 1162 X(bytes)s 1398 X(received)s 1760 X(\()s 0.0 10 10 f.B ft(\261sort)s 2034 X(byte)s 0.0 10 10 f.R ft(\).)s 2325 X(It)s 2411 X(can)s 2574 X(also)s 2760 X(be)s 2879 X(limited)s 3188 X(to)s 3291 X(the)s 3438 X 0.0 10 10 f.B ft(\261top)s 3652 X 0.0 10 10 f.I ft(N)s 3744 X 0.0 10 10 f.R ft(entries.)s 694 X 7680 Y(Sun Release 4.1)s 2382 X(Last change: 03 November 1996)s 5324 X(1)s 7920 Y page 0.0 10 10 f.R ft %%Page: 2 2 694 X 480 Y(wwwstat)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\()s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(1)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\))s 2586 X(USER COMMANDS )s 4852 X(wwwstat)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\()s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(1)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\))s 694 X 960 Y 0.0 9 9 f.B ft(OPTIONS)s 1122 X 0.0 9 9 f.S2 ft(O)s 1160 X(O)s 1198 X(O)s 1236 X(O)s 1274 X(O)s 694 X 1080 Y 874 X 0.0 9 9 f.B ft(Con\256guration)s 1437 X 0.0 9 9 f.S2 ft(O)s 0.0 9 9 f.B ft(Options)s 1780 X 0.0 9 9 f.S2 ft(O)s 1818 X(O)s 1856 X(O)s 1894 X(O)s 694 X 1200 Y 1054 X 0.0 10 10 f.R ft(These)s 1317 X(options)s 1637 X(de\256ne)s 1906 X(how)s 2103 X 0.0 10 10 f.B ft(wwwstat)s 2499 X 0.0 10 10 f.R ft(should)s 2791 X(establish)s 3166 X(defaults)s 3507 X(and)s 3676 X(interpret)s 4039 X(the)s 4186 X(command-line.)s 694 X 1368 Y 1054 X 0.0 10 10 f.B ft(\261F)s 1190 X 0.0 10 10 f.I ft(\256lename)s 694 X 1488 Y 1414 X 0.0 10 10 f.R ft(Get)s 1589 X(system)s 1898 X(con\256guration)s 2462 X(defaults)s 2809 X(from)s 3034 X(the)s 3187 X(given)s 3440 X(\256le.)s 3649 X(If)s 3746 X(used,)s 3985 X(this)s 4161 X 0.0 10 10 f.B ft(must)s 4403 X 0.0 10 10 f.R ft(be)s 4528 X(the)s 4681 X(\256rst)s 4867 X(argument)s 5274 X(on)s 694 X 1608 Y 1414 X(the)s 1575 X(command-line,)s 2216 X(since)s 2460 X(it)s 2555 X(needs)s 2821 X(to)s 2938 X(be)s 3071 X(interpreted)s 3542 X(before)s 3835 X(the)s 3995 X(other)s 4238 X(command)s 4670 X(options.)s 5053 X(The)s 5246 X(\256le)s 694 X 1728 Y 1414 X 0.0 10 10 f.B ft(wwwstat.rc)s 1937 X 0.0 10 10 f.R ft(is)s 2043 X(included)s 2426 X(with)s 2643 X(the)s 2804 X(distribution)s 3305 X(as)s 3427 X(an)s 3560 X(example)s 3937 X(of)s 4059 X(this)s 4243 X(\256le;)s 4438 X(it)s 4533 X(contains)s 4904 X 0.0 10 10 f.B ft(perl)s 5114 X 0.0 10 10 f.R ft(source)s 694 X 1848 Y 1414 X(code)s 1629 X(which)s 1900 X(directly)s 2232 X(sets)s 2409 X(the)s 2558 X(control)s 2867 X(and)s 3037 X(display)s 3352 X(options)s 3673 X(provided)s 4054 X(by)s 4180 X 0.0 10 10 f.B ft(wwwstat)s 0.0 10 10 f.R ft(.)s 4627 X(If)s 4719 X 0.0 10 10 f.I ft(\256lename)s 5083 X 0.0 10 10 f.R ft(is)s 5176 X(not)s 5330 X(a)s 694 X 1968 Y 1414 X(pathname,)s 1865 X(the)s 2025 X(include)s 2357 X(path)s 2567 X(\(see)s 2765 X 0.0 10 10 f.B ft(FILES)s 0.0 10 10 f.R ft(\))s 3126 X(is)s 3231 X(searched)s 3617 X(for)s 3771 X 0.0 10 10 f.I ft(\256lename)s 0.0 10 10 f.S2 ft(P)s 0.0 10 10 f.R ft(.)s 4205 X(An)s 4364 X(empty)s 4651 X(string)s 4916 X(as)s 5036 X 0.0 10 10 f.I ft(\256lename)s 694 X 2088 Y 1414 X 0.0 10 10 f.R ft(will)s 1595 X(disable)s 1903 X(this)s 2073 X(feature.)s 2424 X([)s 0.0 10 10 f.B ft(\261F)s 2593 X 0.0 10 10 f.R ft("wwwstat.rc"])s 694 X 2256 Y 1054 X 0.0 10 10 f.B ft(\261f)s 1162 X 0.0 10 10 f.I ft(\256lename)s 694 X 2376 Y 1414 X 0.0 10 10 f.R ft(Get)s 1588 X(user)s 1784 X(con\256guration)s 2347 X(defaults)s 2693 X(from)s 2917 X(the)s 3069 X(given)s 3321 X(\256le.)s 3504 X(If)s 3600 X(used,)s 3838 X(this)s 4013 X 0.0 10 10 f.B ft(must)s 4254 X 0.0 10 10 f.R ft(be)s 4378 X(the)s 4530 X(\256rst)s 4716 X(argument)s 5123 X(on)s 5252 X(the)s 694 X 2496 Y 1414 X(command-line)s 2019 X(after)s 2229 X 0.0 10 10 f.B ft(\261F)s 2367 X 0.0 10 10 f.R ft(\(if)s 2488 X(any\).)s 2717 X(The)s 2899 X(\256le)s 3054 X(is)s 3148 X(the)s 3297 X(same)s 3529 X(format)s 3822 X(as)s 3932 X(for)s 4075 X(the)s 4224 X 0.0 10 10 f.B ft(\261F)s 4362 X 0.0 10 10 f.R ft(option)s 4645 X(\(see)s 4832 X 0.0 10 10 f.B ft(wwwstat.rc)s 0.0 10 10 f.R ft(\).)s 694 X 2616 Y 1414 X(If)s 1514 X 0.0 10 10 f.I ft(\256lename)s 1886 X 0.0 10 10 f.R ft(is)s 1987 X(not)s 2149 X(a)s 2227 X(pathname,)s 2674 X(the)s 2829 X(include)s 3156 X(path)s 3361 X(\(see)s 3554 X 0.0 10 10 f.B ft(FILES)s 0.0 10 10 f.R ft(\))s 3910 X(is)s 4010 X(searched)s 4391 X(for)s 4540 X 0.0 10 10 f.I ft(\256lename)s 0.0 10 10 f.S2 ft(P)s 0.0 10 10 f.R ft(.)s 4969 X(An)s 5124 X(empty)s 694 X 2736 Y 1414 X(string)s 1667 X(as)s 1775 X 0.0 10 10 f.I ft(\256lename)s 2138 X 0.0 10 10 f.R ft(will)s 2319 X(disable)s 2627 X(this)s 2797 X(feature.)s 3148 X([)s 0.0 10 10 f.B ft(\261f)s 3289 X 0.0 10 10 f.R ft(".wwwstatrc"])s 694 X 2904 Y 1054 X 0.0 10 10 f.B ft(--)s 1414 X 0.0 10 10 f.R ft(Last)s 1611 X(option)s 1892 X(\(the)s 2072 X(remaining)s 2502 X(arguments)s 2943 X(are)s 3089 X(treated)s 3385 X(as)s 3493 X(input)s 3724 X(\256les\).)s 694 X 3072 Y 874 X 0.0 9 9 f.B ft(Diagnostic)s 1302 X 0.0 9 9 f.S2 ft(O)s 0.0 9 9 f.B ft(Options)s 1645 X 0.0 9 9 f.S2 ft(O)s 1683 X(O)s 1721 X(O)s 1759 X(O)s 694 X 3192 Y 1054 X 0.0 10 10 f.R ft(These)s 1329 X(options)s 1661 X(provide)s 2003 X(information)s 2512 X(about)s 2771 X 0.0 10 10 f.B ft(wwwstat)s 3178 X 0.0 10 10 f.R ft(usage)s 3441 X(or)s 3560 X(about)s 3818 X(some)s 4065 X(unusual)s 4412 X(aspects)s 4736 X(of)s 4855 X(the)s 5013 X(log\256le\(s\))s 694 X 3312 Y 1054 X(being)s 1301 X(processed.)s 694 X 3480 Y 1054 X 0.0 10 10 f.B ft(\261h)s 1414 X 0.0 10 10 f.R ft(Help)s 1633 X(\320)s 1758 X(display)s 2072 X(usage)s 2324 X(information)s 2821 X(to)s 2924 X(STDERR)s 3333 X(and)s 3502 X(then)s 3699 X(exit.)s 694 X 3648 Y 1054 X 0.0 10 10 f.B ft(\261v)s 1414 X 0.0 10 10 f.R ft(Verbose)s 1771 X(display)s 2085 X(to)s 2188 X(STDERR)s 2597 X(of)s 2705 X(each)s 2912 X(log)s 3065 X(entry)s 3295 X(processed.)s 694 X 3816 Y 1054 X 0.0 10 10 f.B ft(\261x)s 1414 X 0.0 10 10 f.R ft(Display)s 1750 X(to)s 1853 X(STDERR)s 2262 X(all)s 2387 X(requests)s 2739 X(resulting)s 3114 X(in)s 3217 X(HTTP)s 3492 X(error)s 3710 X(responses.)s 694 X 3984 Y 1054 X 0.0 10 10 f.B ft(\261e)s 1414 X 0.0 10 10 f.R ft(Display)s 1752 X(to)s 1857 X(STDERR)s 2268 X(all)s 2395 X(invalid)s 2700 X(log)s 2855 X(entries.)s 3173 X(Invalid)s 3483 X(log)s 3638 X(entries)s 3931 X(can)s 4096 X(occur)s 4343 X(if)s 4430 X(the)s 4578 X(server)s 4847 X(is)s 4940 X(miswriting)s 694 X 4104 Y 1414 X(or)s 1533 X(overwriting)s 2035 X(its)s 2166 X(own)s 2374 X(log,)s 2563 X(if)s 2660 X(the)s 2818 X(request)s 3142 X(is)s 3245 X(made)s 3497 X(by)s 3633 X(a)s 3712 X(broken)s 4024 X(client)s 4281 X(or)s 4399 X(proxy,)s 4692 X(or)s 4810 X(if)s 4906 X(a)s 4985 X(malicious)s 694 X 4224 Y 1414 X(attacker)s 1765 X(is)s 1868 X(trying)s 2143 X(to)s 2257 X(gain)s 2465 X(privileged)s 2906 X(access)s 3196 X(to)s 3310 X(your)s 3529 X(system.)s 3893 X(For)s 4068 X(the)s 4225 X(latter)s 4465 X(reason,)s 4785 X(the)s 4942 X(webmaster)s 694 X 4344 Y 1414 X(should)s 1706 X(run)s 1864 X 0.0 10 10 f.B ft(wwwstat)s 2260 X 0.0 10 10 f.R ft(with)s 2463 X(this)s 2633 X(option)s 2914 X(on)s 3039 X(a)s 3108 X(regular)s 3415 X(basis.)s 694 X 4512 Y 874 X 0.0 9 9 f.B ft(Display)s 1187 X 0.0 9 9 f.S2 ft(O)s 0.0 9 9 f.B ft(Options)s 1530 X 0.0 9 9 f.S2 ft(O)s 1568 X(O)s 1606 X(O)s 1644 X(O)s 694 X 4632 Y 1054 X 0.0 10 10 f.R ft(These)s 1317 X(options)s 1637 X(modify)s 1951 X(the)s 2098 X(output)s 2379 X(format.)s 694 X 4800 Y 1054 X 0.0 10 10 f.B ft(\261H)s 1207 X 0.0 10 10 f.I ft(string)s 694 X 4920 Y 1414 X 0.0 10 10 f.R ft(Use)s 1594 X(the)s 1741 X(given)s 1988 X(string)s 2241 X(as)s 2349 X(the)s 2496 X(HTML)s 2804 X(title)s 2985 X(and)s 3154 X(heading)s 3495 X(for)s 3636 X(output.)s 694 X 5088 Y 1054 X 0.0 10 10 f.B ft(\261X)s 1201 X 0.0 10 10 f.I ft(string)s 694 X 5208 Y 1414 X 0.0 10 10 f.R ft(Use)s 1604 X(the)s 1761 X(given)s 2018 X(string)s 2280 X(as)s 2397 X(the)s 2553 X(cross-reference)s 3194 X(URL)s 3428 X(to)s 3540 X(the)s 3696 X(last)s 3869 X(summary)s 4275 X(output.)s 4615 X(Any)s 4821 X(occurrence)s 5291 X(of)s 694 X 5328 Y 1414 X(the)s 1563 X(characters)s 1993 X("%M")s 2274 X(or)s 2384 X("%Y")s 2648 X(are)s 2796 X(replaced)s 3160 X(by)s 3286 X(the)s 3434 X(month)s 3716 X(and)s 3886 X(year,)s 4108 X(respectively,)s 4641 X(of)s 4750 X(the)s 4898 X(month)s 5180 X(prior)s 694 X 5448 Y 1414 X(to)s 1517 X(the)s 1664 X(\256rst)s 1845 X(log)s 1998 X(entry)s 2228 X(date.)s 2469 X(The)s 2649 X(empty)s 2924 X(string)s 3177 X(will)s 3358 X(exclude)s 3693 X(any)s 3862 X(cross-reference.)s 694 X 5616 Y 1054 X 0.0 10 10 f.B ft(\261R)s 1414 X 0.0 10 10 f.R ft(Display)s 1764 X(the)s 1925 X(daily)s 2164 X(stats)s 2381 X(table)s 2614 X(sorted)s 2897 X(in)s 3014 X(reverse.)s 3365 X(This)s 3582 X(option)s 3877 X(is)s 3983 X(primarily)s 4394 X(for)s 4549 X(use)s 4721 X(with)s 4937 X(the)s 5097 X 0.0 10 10 f.B ft(gwstat)s 694 X 5736 Y 1414 X 0.0 10 10 f.R ft(program)s 1777 X(for)s 1918 X(producing)s 2348 X(graphs)s 2639 X(of)s 2747 X(the)s 2894 X(output.)s 694 X 5904 Y 1054 X 0.0 10 10 f.B ft(\261l)s 694 X 6024 Y 1054 X(\261L)s 1414 X 0.0 10 10 f.R ft(Do)s 1574 X(\()s 0.0 10 10 f.B ft(\261l)s 0.0 10 10 f.R ft(\))s 1756 X(or)s 1877 X(don't)s 2126 X(\()s 0.0 10 10 f.B ft(\261L)s 0.0 10 10 f.R ft(\))s 2347 X(display)s 2674 X(the)s 2834 X(full)s 3011 X(DNS)s 3249 X(hostname)s 3670 X(of)s 3791 X(clients)s 4090 X(in)s 4205 X(your)s 4425 X(local)s 4656 X(domain)s 4993 X(\(which)s 5307 X(is)s 694 X 6144 Y 1414 X(determined)s 1921 X(by)s 2079 X(the)s 2259 X(con\256gured)s 2744 X(value)s 3018 X(of)s 3159 X($AppendToLocalhost\))s 4121 X(in)s 4257 X(the)s 4437 X(section)s 4778 X(on)s 4935 X(subdomain)s 694 X 6264 Y 1414 X(statistics.)s 1834 X(The)s 2014 X(default)s 2316 X([)s 0.0 10 10 f.B ft(\261L)s 0.0 10 10 f.R ft(])s 2524 X(is)s 2616 X(to)s 2719 X(strip)s 2922 X(the)s 3069 X(machine)s 3432 X(name)s 3673 X(from)s 3892 X(local)s 4111 X(addresses.)s 694 X 6432 Y 1054 X 0.0 10 10 f.B ft(\261o)s 694 X 6552 Y 1054 X(\261O)s 1414 X 0.0 10 10 f.R ft(Do)s 1568 X(\()s 0.0 10 10 f.B ft(\261o)s 0.0 10 10 f.R ft(\))s 1766 X(or)s 1881 X(don't)s 2124 X(\()s 0.0 10 10 f.B ft(\261O)s 0.0 10 10 f.R ft(\))s 2350 X(display)s 2671 X(the)s 2825 X(full)s 2996 X(DNS)s 3228 X(hostname)s 3643 X(of)s 3758 X(clients)s 4051 X(outside)s 4372 X(your)s 4587 X(local)s 4812 X(domain)s 5143 X(in)s 5252 X(the)s 694 X 6672 Y 1414 X(section)s 1743 X(on)s 1889 X(subdomain)s 2374 X(statistics.)s 2815 X(The)s 3016 X(default)s 3338 X([)s 0.0 10 10 f.B ft(\261O)s 0.0 10 10 f.R ft(])s 3577 X(is)s 3689 X(to)s 3812 X(strip)s 4035 X(the)s 4202 X(machine)s 4585 X(name)s 4846 X(from)s 5085 X(outside)s 694 X 6792 Y 1414 X(addresses.)s 694 X 6960 Y 1054 X 0.0 10 10 f.B ft(\261u)s 694 X 7080 Y 1054 X(\261U)s 1414 X 0.0 10 10 f.R ft(Do)s 1578 X(\()s 0.0 10 10 f.B ft(\261u)s 0.0 10 10 f.R ft(\))s 1792 X(or)s 1917 X(don't)s 2170 X(\()s 0.0 10 10 f.B ft(\261U)s 0.0 10 10 f.R ft(\))s 2400 X(display)s 2731 X(the)s 2895 X(IP)s 3026 X(address)s 3367 X(of)s 3492 X(clients)s 3795 X(with)s 4015 X(unresolved)s 4495 X(domain)s 4837 X(names)s 5133 X(in)s 5252 X(the)s 694 X 7200 Y 1414 X(section)s 1723 X(on)s 1849 X(subdomain)s 2314 X(statistics.)s 2710 X(The)s 2891 X 0.0 10 10 f.B ft(\261dns)s 3118 X 0.0 10 10 f.R ft(option)s 3400 X(can)s 3564 X(be)s 3684 X(used)s 3893 X(to)s 3997 X(resolve)s 4311 X(some)s 4548 X(names,)s 4854 X(but)s 5007 X(not)s 5160 X(all)s 5285 X(IP)s 694 X 7680 Y(Sun Release 4.1)s 2382 X(Last change: 03 November 1996)s 5324 X(2)s 7920 Y page 0.0 10 10 f.R ft %%Page: 3 3 694 X 480 Y(wwwstat)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\()s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(1)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\))s 2586 X(USER COMMANDS )s 4852 X(wwwstat)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\()s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(1)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\))s 694 X 960 Y 1414 X(hosts)s 1679 X(have)s 1926 X(a)s 2029 X(DNS)s 2287 X(name)s 2561 X(\(SLIP/PPP)s 3054 X(connections\))s 3622 X(and)s 3824 X(sometimes)s 4310 X(a)s 4412 X(host's)s 4709 X(DNS)s 4967 X(service)s 5307 X(is)s 694 X 1080 Y 1414 X(inaccessible.)s 1946 X(The)s 2126 X(default)s 2428 X([)s 0.0 10 10 f.B ft(\261U)s 0.0 10 10 f.R ft(])s 2641 X(is)s 2733 X(to)s 2836 X(group)s 3094 X(all)s 3219 X(such)s 3427 X(addresses)s 3834 X(under)s 4086 X(the)s 4233 X(category)s 4601 X("Unresolved".)s 694 X 1248 Y 1054 X 0.0 10 10 f.B ft(\261dns)s 694 X 1368 Y 1054 X(\261nodns)s 1414 X 0.0 10 10 f.R ft(Do)s 1589 X(\()s 0.0 10 10 f.B ft(\261dns)s 0.0 10 10 f.R ft(\))s 1909 X(or)s 2045 X(don't)s 2309 X(\()s 0.0 10 10 f.B ft(\261nodns)s 0.0 10 10 f.R ft(\))s 2735 X(use)s 2921 X(the)s 3096 X(system's)s 3499 X(hostname)s 3935 X(lookup)s 4266 X(facilities)s 4662 X(to)s 4792 X(\256nd)s 5000 X(the)s 5174 X(DNS)s 694 X 1488 Y 1414 X(hostname)s 1837 X(associated)s 2287 X(with)s 2505 X(any)s 2689 X(unresolved)s 3167 X(IP)s 3296 X(addresses.)s 3743 X(Looking)s 4122 X(up)s 4262 X(a)s 4346 X(DNS)s 4586 X(name)s 4842 X(may)s 5053 X(be)s 5186 X 0.0 10 10 f.B ft(very)s 694 X 1608 Y 1414 X 0.0 10 10 f.R ft(slow,)s 1654 X(particularly)s 2140 X(when)s 2382 X(the)s 2530 X(results)s 2817 X(are)s 2964 X(negative)s 3328 X(\(no)s 3487 X(DNS)s 3713 X(name\),)s 4013 X(which)s 4283 X(is)s 4376 X(why)s 4574 X(a)s 4644 X(caching)s 4980 X(capability)s 694 X 1728 Y 1414 X(is)s 1506 X(included)s 1875 X(as)s 1983 X(well.)s 2230 X([)s 0.0 10 10 f.B ft(\261nodns)s 0.0 10 10 f.R ft(])s 694 X 1896 Y 1054 X 0.0 10 10 f.B ft(\261cache)s 1367 X 0.0 10 10 f.I ft(\256lename)s 694 X 2016 Y 1414 X 0.0 10 10 f.R ft(Use)s 1599 X(the)s 1751 X(given)s 2003 X(DBM)s 2261 X(database)s 2634 X(as)s 2747 X(the)s 2899 X(read/write)s 3333 X(persistent)s 3746 X(DNS)s 3976 X(cache)s 4232 X(\(the)s 4416 X(.dir)s 4581 X(and)s 4754 X(.pag)s 4952 X(extensions)s 694 X 2136 Y 1414 X(are)s 1578 X(appended)s 2003 X(automatically\).)s 2648 X(Cached)s 2990 X(entries)s 3299 X(\(including)s 3753 X(negative)s 4134 X(results\))s 4471 X(are)s 4635 X(removed)s 5027 X(after)s 5252 X(the)s 694 X 2256 Y 1414 X(time)s 1620 X(con\256gured)s 2075 X(for)s 2219 X($DNSexpires)s 2785 X([two)s 2996 X(months].)s 3402 X(No)s 3552 X(caching)s 3890 X(is)s 3985 X(performed)s 4428 X(if)s 4516 X 0.0 10 10 f.I ft(\256lename)s 4881 X 0.0 10 10 f.R ft(is)s 4975 X(the)s 5124 X(empty)s 694 X 2376 Y 1414 X(string,)s 1713 X(which)s 2003 X(may)s 2221 X(be)s 2361 X(needed)s 2689 X(if)s 2795 X(your)s 3023 X(system)s 3346 X(does)s 3574 X(not)s 3747 X(support)s 4092 X(DBM)s 4365 X(or)s 4493 X(NDBM)s 4838 X(functionality.)s 694 X 2496 Y 1414 X(Running)s 1784 X 0.0 10 10 f.B ft(\261dns)s 2010 X 0.0 10 10 f.R ft(without)s 2341 X(a)s 2410 X(persistent)s 2818 X(cache)s 3069 X(is)s 3161 X(not)s 3314 X(recommended.)s 3954 X([)s 0.0 10 10 f.B ft(\261cache)s 4300 X 0.0 10 10 f.R ft("dnscache"])s 694 X 2664 Y 1054 X 0.0 10 10 f.B ft(\261trunc)s 1362 X 0.0 10 10 f.I ft(N)s 694 X 2784 Y 1414 X 0.0 10 10 f.R ft(Truncate)s 1816 X(the)s 1986 X(URLs)s 2272 X(listed)s 2536 X(in)s 2661 X(the)s 2830 X(archive)s 3170 X(section)s 3500 X(after)s 3729 X(the)s 3898 X 0.0 10 10 f.I ft(Nth)s 4090 X 0.0 10 10 f.R ft(hierarchy)s 4513 X(level.)s 4779 X(This)s 5004 X(option)s 5307 X(is)s 694 X 2904 Y 1414 X(commonly)s 1874 X(used)s 2089 X(to)s 2199 X(reduce)s 2496 X(the)s 2649 X(output)s 2936 X(size)s 3122 X(and)s 3297 X(memory)s 3661 X(requirements)s 4213 X(of)s 4327 X 0.0 10 10 f.B ft(wwwstat)s 4729 X 0.0 10 10 f.R ft(by)s 4860 X(grouping)s 5252 X(the)s 694 X 3024 Y 1414 X(requests)s 1770 X(by)s 1899 X(directory)s 2287 X(tree)s 2464 X(instead)s 2775 X(of)s 2886 X(listing)s 3165 X(every)s 3414 X(URL.)s 3692 X(The)s 3875 X(default)s 4180 X([)s 0.0 10 10 f.B ft(\261trunc)s 4524 X(0)s 0.0 10 10 f.R ft(])s 4635 X(is)s 4730 X(to)s 4836 X(display)s 5153 X(every)s 694 X 3144 Y 1414 X(requested)s 1821 X(URL.)s 694 X 3312 Y 1054 X 0.0 10 10 f.B ft(\261\256les)s 694 X 3432 Y 1054 X(\261no\256les)s 1414 X 0.0 10 10 f.R ft(Do)s 1569 X(\()s 0.0 10 10 f.B ft(\261\256les)s 0.0 10 10 f.R ft(\))s 1885 X(or)s 2001 X(don't)s 2245 X(\()s 0.0 10 10 f.B ft(\261no\256les)s 0.0 10 10 f.R ft(\))s 2667 X(include)s 2994 X(the)s 3149 X(last)s 3321 X(component)s 3798 X(of)s 3914 X(a)s 3991 X(URL)s 4224 X(\(usually)s 4579 X(the)s 4733 X(\256lename\))s 5142 X(in)s 5252 X(the)s 694 X 3552 Y 1414 X(archive)s 1734 X(section.)s 2069 X(This)s 2274 X(option)s 2557 X(is)s 2651 X(commonly)s 3106 X(used)s 3316 X(to)s 3421 X(reduce)s 3713 X(the)s 3861 X(output)s 4143 X(size)s 4324 X(and)s 4494 X(memory)s 4853 X(requirements)s 694 X 3672 Y 1414 X(of)s 1541 X 0.0 10 10 f.B ft(wwwstat)s 1956 X 0.0 10 10 f.R ft(by)s 2100 X(grouping)s 2505 X(the)s 2671 X(requests)s 3042 X(by)s 3186 X(directory)s 3590 X(instead)s 3917 X(of)s 4044 X(listing)s 4339 X(every)s 4604 X(URL.)s 4898 X(The)s 5097 X(default)s 694 X 3792 Y 1414 X([)s 0.0 10 10 f.B ft(\261\256les)s 0.0 10 10 f.R ft(])s 1722 X(is)s 1814 X(to)s 1917 X(display)s 2231 X(the)s 2378 X(entire)s 2630 X(requested)s 3037 X(URL.)s 694 X 3960 Y 1054 X 0.0 10 10 f.B ft(\261link)s 694 X 4080 Y 1054 X(\261nolink)s 1414 X 0.0 10 10 f.R ft(Do)s 1562 X(\()s 0.0 10 10 f.B ft(\261link)s 0.0 10 10 f.R ft(\))s 1872 X(or)s 1980 X(don't)s 2216 X(\()s 0.0 10 10 f.B ft(\261nolink)s 0.0 10 10 f.R ft(\))s 2631 X(add)s 2800 X(a)s 2869 X(hypertext)s 3271 X(link)s 3452 X(around)s 3754 X(each)s 3961 X(archive)s 4279 X(URL.)s 4554 X(This)s 4757 X(option)s 5038 X(is)s 5130 X(useful)s 694 X 4200 Y 1414 X(for)s 1568 X(local)s 1800 X(maintenance,)s 2367 X(but)s 2533 X(it)s 2627 X(is)s 2732 X(not)s 2898 X(recommended)s 3501 X(for)s 3655 X(publication)s 4143 X(of)s 4264 X(the)s 4424 X(HTML)s 4745 X(results)s 5043 X(\(it)s 5169 X(often)s 694 X 4320 Y 1414 X(results)s 1714 X(in)s 1831 X(links)s 2064 X(to)s 2180 X(temporary)s 2628 X(or)s 2749 X(nonexistant)s 3248 X(resources,)s 3687 X(and)s 3869 X(leads)s 4112 X(people/robots)s 4694 X(to)s 4810 X(resources)s 5224 X(that)s 694 X 4440 Y 1414 X(might)s 1673 X(not)s 1826 X(be)s 1945 X(publically)s 2370 X(available\).)s 2838 X([)s 0.0 10 10 f.B ft(\261nolink)s 0.0 10 10 f.R ft(])s 694 X 4608 Y 1054 X 0.0 10 10 f.B ft(\261cgi)s 694 X 4728 Y 1054 X(\261nocgi)s 1414 X 0.0 10 10 f.R ft(Do)s 1566 X(\()s 0.0 10 10 f.B ft(\261cgi)s 0.0 10 10 f.R ft(\))s 1834 X(or)s 1947 X(don't)s 2188 X(\()s 0.0 10 10 f.B ft(\261nocgi)s 0.0 10 10 f.R ft(\))s 2562 X(pre\256x)s 2825 X(the)s 2977 X(summary)s 3379 X(output)s 3665 X(with)s 3872 X(CGI)s 4073 X(header)s 4367 X(\256elds)s 4613 X(appropriate)s 5096 X(for)s 5241 X(use)s 694 X 4848 Y 1414 X(with)s 1624 X(the)s 1778 X(HTTP)s 2060 X(common)s 2442 X(gateway)s 2806 X(interface.)s 3235 X(Using)s 3505 X 0.0 10 10 f.B ft(wwwstat)s 3907 X 0.0 10 10 f.R ft(as)s 4021 X(a)s 4096 X(CGI)s 4299 X(script)s 4552 X(is)s 4650 X(not)s 4809 X(recommended)s 694 X 4968 Y 1414 X(\320)s 1546 X(it)s 1634 X(is)s 1733 X(usually)s 2054 X(better)s 2313 X(to)s 2423 X(simply)s 2727 X(run)s 2891 X(the)s 3044 X(wwwstat)s 3430 X(program)s 3799 X(periodically)s 4307 X(and)s 4482 X(serve)s 4723 X(the)s 4876 X(static)s 5118 X(output)s 694 X 5088 Y 1414 X(\256le.)s 1617 X([)s 0.0 10 10 f.B ft(\261nocgi)s 0.0 10 10 f.R ft(])s 694 X 5256 Y 874 X 0.0 9 9 f.B ft(Section)s 1177 X 0.0 9 9 f.S2 ft(O)s 0.0 9 9 f.B ft(Display)s 1505 X 0.0 9 9 f.S2 ft(O)s 0.0 9 9 f.B ft(Options)s 1848 X 0.0 9 9 f.S2 ft(O)s 1886 X(O)s 1924 X(O)s 694 X 5376 Y 1054 X 0.0 10 10 f.R ft(These)s 1322 X(options)s 1647 X(change)s 1959 X(the)s 2111 X(display)s 2430 X(of)s 2543 X(entire)s 2799 X(sections)s 3150 X(\(as)s 3295 X(opposed)s 3657 X(to)s 3764 X(the)s 3915 X(entries)s 4210 X(within)s 4495 X(those)s 4735 X(sections\).)s 5169 X(They)s 694 X 5496 Y 1054 X(allow)s 1310 X(the)s 1466 X(user)s 1666 X(to)s 1778 X(enable)s 2072 X(or)s 2189 X(disable)s 2506 X(an)s 2634 X(entire)s 2895 X(section,)s 3236 X(set)s 3380 X(the)s 3535 X(sorting)s 3846 X(method)s 4179 X(for)s 4328 X(that)s 4511 X(section,)s 4852 X(and)s 5029 X(limit)s 5252 X(the)s 694 X 5616 Y 1054 X(number)s 1387 X(of)s 1497 X(displayed)s 1907 X(entries)s 2200 X(for)s 2343 X(that)s 2520 X(section.)s 2880 X(These)s 3145 X(options)s 3467 X(are)s 3615 X(context-sensitive)s 4319 X(and)s 4490 X(processed)s 4910 X(in)s 5015 X(the)s 5164 X(order)s 694 X 5736 Y 1054 X(given.)s 694 X 5904 Y 1054 X 0.0 10 10 f.B ft(\261all)s 694 X 6024 Y 1054 X(\261noall)s 1414 X 0.0 10 10 f.R ft(Include)s 1742 X(\()s 0.0 10 10 f.B ft(\261all)s 0.0 10 10 f.R ft(\))s 1993 X(or)s 2105 X(exclude)s 2444 X(\()s 0.0 10 10 f.B ft(\261noall)s 0.0 10 10 f.R ft(\))s 2801 X(all)s 2930 X(of)s 3041 X(the)s 3191 X(display)s 3508 X(sections.)s 3883 X(The)s 4066 X 0.0 10 10 f.B ft(\261noall)s 4356 X 0.0 10 10 f.R ft(option)s 4640 X(is)s 4735 X(commonly)s 5191 X(used)s 694 X 6144 Y 1414 X(just)s 1607 X(prior)s 1849 X(to)s 1975 X(one)s 2167 X(or)s 2298 X(more)s 2551 X(of)s 2681 X(the)s 2850 X(other)s 3102 X(section)s 3432 X(options,)s 3799 X(such)s 4029 X(that)s 4226 X(only)s 4451 X(the)s 4620 X(listed)s 4884 X(sections)s 5253 X(are)s 694 X 6264 Y 1414 X(displayed.)s 694 X 6432 Y 1054 X 0.0 10 10 f.B ft(\261daily)s 694 X 6552 Y 1054 X(\261nodaily)s 694 X 6672 Y 1414 X 0.0 10 10 f.R ft(Include)s 1748 X(\()s 0.0 10 10 f.B ft(\261daily)s 0.0 10 10 f.R ft(\))s 2111 X(or)s 2229 X(exclude)s 2574 X(\()s 0.0 10 10 f.B ft(\261nodaily)s 0.0 10 10 f.R ft(\))s 3043 X(the)s 3199 X(section)s 3516 X(of)s 3633 X(statistics)s 4012 X(by)s 4146 X(request)s 4468 X(date)s 4668 X(and)s 4846 X(set)s 4991 X(the)s 5147 X(scope)s 694 X 6792 Y 1414 X(for)s 1555 X(later)s 1757 X 0.0 10 10 f.B ft(\261sort)s 1998 X 0.0 10 10 f.R ft(and)s 2167 X 0.0 10 10 f.B ft(\261top)s 2381 X 0.0 10 10 f.R ft(options)s 2701 X(to)s 2804 X(this)s 2974 X(section.)s 694 X 6960 Y 1054 X 0.0 10 10 f.B ft(\261hourly)s 694 X 7080 Y 1054 X(\261nohourly)s 694 X 7200 Y 1414 X 0.0 10 10 f.R ft(Include)s 1755 X(\()s 0.0 10 10 f.B ft(\261hourly)s 0.0 10 10 f.R ft(\))s 2197 X(or)s 2322 X(exclude)s 2674 X(\()s 0.0 10 10 f.B ft(\261nohourly)s 0.0 10 10 f.R ft(\))s 3222 X(the)s 3386 X(section)s 3711 X(of)s 3835 X(statistics)s 4221 X(by)s 4362 X(request)s 4691 X(hour)s 4915 X(and)s 5100 X(set)s 5252 X(the)s 694 X 7680 Y(Sun Release 4.1)s 2382 X(Last change: 03 November 1996)s 5324 X(3)s 7920 Y page 0.0 10 10 f.R ft %%Page: 4 4 694 X 480 Y(wwwstat)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\()s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(1)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\))s 2586 X(USER COMMANDS )s 4852 X(wwwstat)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\()s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(1)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\))s 694 X 960 Y 1414 X(scope)s 1666 X(for)s 1807 X(later)s 2009 X 0.0 10 10 f.B ft(\261sort)s 2250 X 0.0 10 10 f.R ft(and)s 2419 X 0.0 10 10 f.B ft(\261top)s 2633 X 0.0 10 10 f.R ft(options)s 2953 X(to)s 3056 X(this)s 3226 X(section.)s 694 X 1128 Y 1054 X 0.0 10 10 f.B ft(\261domain)s 694 X 1248 Y 1054 X(\261nodomain)s 694 X 1368 Y 1414 X 0.0 10 10 f.R ft(Include)s 1738 X(\()s 0.0 10 10 f.B ft(\261domain)s 0.0 10 10 f.R ft(\))s 2202 X(or)s 2310 X(exclude)s 2645 X(\()s 0.0 10 10 f.B ft(\261nodomain)s 0.0 10 10 f.R ft(\))s 3215 X(the)s 3362 X(section)s 3670 X(of)s 3778 X(statistics)s 4148 X(by)s 4273 X(the)s 4420 X(client's)s 4739 X(Internet)s 5074 X(domain)s 694 X 1488 Y 1414 X(and)s 1583 X(set)s 1719 X(the)s 1866 X(scope)s 2118 X(for)s 2259 X(later)s 2461 X 0.0 10 10 f.B ft(\261sort)s 2702 X 0.0 10 10 f.R ft(and)s 2871 X 0.0 10 10 f.B ft(\261top)s 3085 X 0.0 10 10 f.R ft(options)s 3405 X(to)s 3508 X(this)s 3678 X(section.)s 694 X 1656 Y 1054 X 0.0 10 10 f.B ft(\261subdomain)s 694 X 1776 Y 1054 X(\261nosubdomain)s 694 X 1896 Y 1414 X 0.0 10 10 f.R ft(Include)s 1740 X(\()s 0.0 10 10 f.B ft(\261subdomain)s 0.0 10 10 f.R ft(\))s 2357 X(or)s 2467 X(exclude)s 2804 X(\()s 0.0 10 10 f.B ft(\261nosubdomain)s 0.0 10 10 f.R ft(\))s 3527 X(the)s 3676 X(section)s 3986 X(of)s 4096 X(statistics)s 4468 X(by)s 4595 X(the)s 4744 X(client's)s 5064 X(Internet)s 694 X 2016 Y 1414 X(subdomain)s 1878 X(\(reversed)s 2273 X(for)s 2414 X(display\))s 2761 X(and)s 2930 X(set)s 3066 X(the)s 3213 X(scope)s 3465 X(for)s 3606 X(later)s 3808 X 0.0 10 10 f.B ft(\261sort)s 4049 X 0.0 10 10 f.R ft(and)s 4218 X 0.0 10 10 f.B ft(\261top)s 4432 X 0.0 10 10 f.R ft(options)s 4752 X(to)s 4855 X(this)s 5025 X(section.)s 694 X 2184 Y 1054 X 0.0 10 10 f.B ft(\261archive)s 694 X 2304 Y 1054 X(\261noarchive)s 694 X 2424 Y 1414 X 0.0 10 10 f.R ft(Include)s 1740 X(\()s 0.0 10 10 f.B ft(\261archive)s 0.0 10 10 f.R ft(\))s 2199 X(or)s 2309 X(exclude)s 2646 X(\()s 0.0 10 10 f.B ft(\261noarchive)s 0.0 10 10 f.R ft(\))s 3211 X(the)s 3360 X(section)s 3669 X(of)s 3778 X(statistics)s 4149 X(by)s 4275 X(requested)s 4683 X(URL/archive)s 5230 X(and)s 694 X 2544 Y 1414 X(set)s 1550 X(the)s 1697 X(scope)s 1949 X(for)s 2090 X(later)s 2292 X 0.0 10 10 f.B ft(\261sort)s 2533 X 0.0 10 10 f.R ft(and)s 2702 X 0.0 10 10 f.B ft(\261top)s 2916 X 0.0 10 10 f.R ft(options)s 3236 X(to)s 3339 X(this)s 3509 X(section.)s 694 X 2712 Y 1054 X 0.0 10 10 f.B ft(\261r)s 694 X 2832 Y 1054 X(\261ident)s 694 X 2952 Y 1054 X(\261noident)s 694 X 3072 Y 1414 X 0.0 10 10 f.R ft(Include)s 1742 X(\()s 0.0 10 10 f.B ft(\261r)s 1898 X 0.0 10 10 f.R ft(or)s 2010 X 0.0 10 10 f.B ft(\261ident)s 0.0 10 10 f.R ft(\))s 2339 X(or)s 2451 X(exclude)s 2790 X(\()s 0.0 10 10 f.B ft(\261noident)s 0.0 10 10 f.R ft(\))s 3258 X(the)s 3409 X(section)s 3721 X(of)s 3833 X(statistics)s 4207 X(by)s 4336 X(the)s 4487 X(identity)s 4822 X(of)s 4934 X(the)s 5085 X(user)s 5280 X(\(if)s 694 X 3192 Y 1414 X(IdentityCheck)s 2006 X(is)s 2099 X(ON\))s 2302 X(or)s 2411 X(the)s 2559 X(authentication)s 3151 X(userid)s 3421 X(\(if)s 3541 X(supplied\))s 3939 X(and)s 4109 X(set)s 4246 X(the)s 4394 X(scope)s 4646 X(for)s 4787 X(later)s 4989 X 0.0 10 10 f.B ft(\261sort)s 5230 X 0.0 10 10 f.R ft(and)s 694 X 3312 Y 1414 X 0.0 10 10 f.B ft(\261top)s 1632 X 0.0 10 10 f.R ft(options)s 1956 X(to)s 2063 X(this)s 2237 X(section.)s 2598 X 0.0 10 10 f.B ft(DO)s 2776 X(NOT)s 3021 X(PUBLISH)s 3489 X 0.0 10 10 f.R ft(this)s 3662 X(information,)s 4187 X(as)s 4298 X(that)s 4476 X(would)s 4754 X(reveal)s 5025 X(security-)s 694 X 3432 Y 1414 X(related)s 1711 X(identities)s 2104 X(and)s 2274 X(be)s 2393 X(a)s 2462 X(violation)s 2843 X(of)s 2951 X(privacy.)s 3325 X(This)s 3528 X(option)s 3809 X(is)s 3901 X(provided)s 4281 X(for)s 4422 X(administrative)s 5019 X(purposes)s 694 X 3552 Y 1414 X(only.)s 694 X 3720 Y 1054 X 0.0 10 10 f.B ft(\261sort)s 1295 X 0.0 10 10 f.R ft(\()s 0.0 10 10 f.B ft(key|byte|req)s 0.0 10 10 f.R ft(\))s 694 X 3840 Y 1414 X(Sort)s 1617 X(this)s 1798 X(section)s 2117 X(by)s 2253 X(its)s 2384 X(primary)s 2736 X(key,)s 2941 X(the)s 3099 X(number)s 3440 X(of)s 3558 X(bytes)s 3804 X(transmitted,)s 4314 X(or)s 4432 X(the)s 4589 X(number)s 4929 X(of)s 5047 X(requests)s 694 X 3960 Y 1414 X(received.)s 1826 X([)s 0.0 10 10 f.B ft(\261sort)s 2100 X(key)s 0.0 10 10 f.R ft(])s 694 X 4128 Y 1054 X 0.0 10 10 f.B ft(\261top)s 1268 X 0.0 10 10 f.I ft(N)s 1414 X 0.0 10 10 f.R ft(Display)s 1754 X(only)s 1961 X(the)s 2112 X(top)s 2269 X(N)s 2370 X(entries)s 2665 X(for)s 2809 X(this)s 2982 X(section.)s 3318 X(This)s 3524 X(option)s 3808 X(assumes)s 4169 X(that)s 4347 X(the)s 4497 X 0.0 10 10 f.B ft(\261sort)s 4741 X 0.0 10 10 f.R ft(option)s 5025 X(has)s 5186 X(been)s 694 X 4248 Y 1414 X(set)s 1550 X(to)s 1653 X(either)s 1905 X(bytes)s 2141 X(or)s 2249 X(requests.)s 694 X 4416 Y 1054 X 0.0 10 10 f.B ft(\261both)s 1414 X 0.0 10 10 f.R ft(Display)s 1751 X(both)s 1955 X(the)s 2103 X(top)s 2257 X(N)s 2355 X(entries)s 2647 X(for)s 2789 X(this)s 2960 X(section)s 3269 X([10,)s 3452 X(sorted)s 3721 X(by)s 3846 X(requests],)s 4256 X(and)s 4425 X(then)s 4622 X(the)s 4769 X(full)s 4933 X(section)s 5241 X(\(all)s 694 X 4536 Y 1414 X(entries\))s 1738 X(sorted)s 2007 X(by)s 2132 X(key.)s 694 X 4704 Y 874 X 0.0 9 9 f.B ft(Search)s 1162 X 0.0 9 9 f.S2 ft(O)s 0.0 9 9 f.B ft(Options)s 1505 X 0.0 9 9 f.S2 ft(O)s 1543 X(O)s 1581 X(O)s 1619 X(O)s 694 X 4824 Y 1054 X 0.0 10 10 f.R ft(These)s 1325 X(options)s 1653 X(are)s 1807 X(used)s 2023 X(to)s 2134 X(limit)s 2357 X(the)s 2512 X(analysis)s 2867 X(to)s 2978 X(requests)s 3337 X(matching)s 3741 X(a)s 3817 X(pattern.)s 4176 X(The)s 4363 X(pattern)s 4672 X(is)s 4771 X(supplied)s 5142 X(in)s 5252 X(the)s 694 X 4944 Y 1054 X(form)s 1279 X(of)s 1393 X(a)s 1467 X 0.0 10 10 f.B ft(perl)s 1669 X(regular)s 2015 X(expression)s 0.0 10 10 f.R ft(,)s 2520 X(except)s 2810 X(that)s 2990 X(the)s 3142 X(characters)s 3575 X("+")s 3743 X(and)s 3917 X(".")s 4054 X(are)s 4205 X(escaped)s 4550 X(automatically)s 5124 X(unless)s 694 X 5064 Y 1054 X(the)s 1214 X 0.0 10 10 f.B ft(\261noescape)s 1685 X 0.0 10 10 f.R ft(option)s 1979 X(is)s 2084 X(given.)s 2394 X(Enclose)s 2748 X(the)s 2908 X(pattern)s 3223 X(in)s 3339 X(single-quotes)s 3910 X(to)s 4026 X(prevent)s 4363 X(the)s 4523 X(command)s 4954 X(shell)s 5180 X(from)s 694 X 5184 Y 1054 X(interpreting)s 1545 X(some)s 1781 X(special)s 2083 X(characters.)s 694 X 5352 Y 1054 X(Multiple)s 1425 X(occurrences)s 1926 X(of)s 2035 X(the)s 2183 X(same)s 2414 X(option)s 2696 X(results)s 2983 X(in)s 3087 X(an)s 3207 X(OR-ing)s 3533 X(of)s 3642 X(the)s 3789 X(regular)s 4096 X(expressions.)s 4637 X(Search)s 4933 X(options)s 5253 X(are)s 694 X 5472 Y 1054 X(only)s 1277 X(applied)s 1616 X(to)s 1739 X(log\256le)s 2040 X(entries;)s 2379 X(any)s 2568 X(summary)s 2985 X(\256les)s 3197 X(input)s 3448 X(must)s 3688 X(have)s 3920 X(been)s 4152 X(created)s 4483 X(with)s 4705 X(the)s 4871 X(same)s 5120 X(search)s 694 X 5592 Y 1054 X(options.)s 694 X 5760 Y 1054 X 0.0 10 10 f.B ft(\261a)s 1179 X 0.0 10 10 f.I ft(regexp)s 694 X 5880 Y 1054 X 0.0 10 10 f.B ft(\261A)s 1201 X 0.0 10 10 f.I ft(regexp)s 694 X 6000 Y 1414 X 0.0 10 10 f.R ft(Include)s 1739 X(\()s 0.0 10 10 f.B ft(\261a)s 0.0 10 10 f.R ft(\))s 1930 X(or)s 2038 X(exclude)s 2373 X(\()s 0.0 10 10 f.B ft(\261A)s 0.0 10 10 f.R ft(\))s 2586 X(all)s 2711 X(requests)s 3063 X(containing)s 3510 X(a)s 3579 X(hostname/IP)s 4104 X(address)s 4428 X(matching)s 4825 X(the)s 4972 X(given)s 5219 X(perl)s 694 X 6120 Y 1414 X(regular)s 1721 X(expression.)s 694 X 6288 Y 1054 X 0.0 10 10 f.B ft(\261c)s 1173 X 0.0 10 10 f.I ft(regexp)s 694 X 6408 Y 1054 X 0.0 10 10 f.B ft(\261C)s 1201 X 0.0 10 10 f.I ft(regexp)s 694 X 6528 Y 1414 X 0.0 10 10 f.R ft(Include)s 1739 X(\()s 0.0 10 10 f.B ft(\261c)s 0.0 10 10 f.R ft(\))s 1925 X(or)s 2034 X(exclude)s 2370 X(\()s 0.0 10 10 f.B ft(\261C)s 0.0 10 10 f.R ft(\))s 2584 X(all)s 2710 X(requests)s 3063 X(resulting)s 3439 X(in)s 3543 X(an)s 3663 X 0.0 10 10 f.B ft(HTTP)s 3962 X 0.0 10 10 f.R ft(status)s 4215 X(code)s 4428 X(matching)s 4825 X(the)s 4972 X(given)s 5219 X(perl)s 694 X 6648 Y 1414 X(regular)s 1721 X(expression.)s 694 X 6816 Y 1054 X 0.0 10 10 f.B ft(\261d)s 1185 X 0.0 10 10 f.I ft(regexp)s 694 X 6936 Y 1054 X 0.0 10 10 f.B ft(\261D)s 1201 X 0.0 10 10 f.I ft(regexp)s 694 X 7056 Y 1414 X 0.0 10 10 f.R ft(Include)s 1748 X(\()s 0.0 10 10 f.B ft(\261d)s 0.0 10 10 f.R ft(\))s 1955 X(or)s 2073 X(exclude)s 2418 X(\()s 0.0 10 10 f.B ft(\261D)s 0.0 10 10 f.R ft(\))s 2641 X(all)s 2776 X(requests)s 3138 X(occurring)s 3555 X(on)s 3690 X(a)s 3768 X(date)s 3968 X(\(e.g.,)s 4204 X("Feb)s 4454 X(2)s 4538 X(1994"\))s 4846 X(matching)s 5252 X(the)s 694 X 7176 Y 1414 X(given)s 1661 X(perl)s 1841 X(regular)s 2148 X(expression.)s 694 X 7680 Y(Sun Release 4.1)s 2382 X(Last change: 03 November 1996)s 5324 X(4)s 7920 Y page 0.0 10 10 f.R ft %%Page: 5 5 694 X 480 Y(wwwstat)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\()s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(1)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\))s 2586 X(USER COMMANDS )s 4852 X(wwwstat)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\()s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(1)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\))s 694 X 960 Y 1054 X 0.0 10 10 f.B ft(\261t)s 1162 X 0.0 10 10 f.I ft(regexp)s 694 X 1080 Y 1054 X 0.0 10 10 f.B ft(\261T)s 1196 X 0.0 10 10 f.I ft(regexp)s 694 X 1200 Y 1414 X 0.0 10 10 f.R ft(Include)s 1749 X(\()s 0.0 10 10 f.B ft(\261t)s 0.0 10 10 f.R ft(\))s 1934 X(or)s 2053 X(exclude)s 2399 X(\()s 0.0 10 10 f.B ft(\261T)s 0.0 10 10 f.R ft(\))s 2618 X(all)s 2754 X(requests)s 3117 X(occurring)s 3535 X(during)s 3832 X(the)s 3990 X(hour)s 4209 X(\(e.g.,)s 4446 X("23")s 4663 X(is)s 4765 X(11pm)s 5028 X(\261)s 5113 X(12pm\))s 694 X 1320 Y 1414 X(matching)s 1811 X(the)s 1958 X(given)s 2205 X(perl)s 2385 X(regular)s 2692 X(expression.)s 694 X 1488 Y 1054 X 0.0 10 10 f.B ft(\261m)s 1212 X 0.0 10 10 f.I ft(regexp)s 694 X 1608 Y 1054 X 0.0 10 10 f.B ft(\261M)s 1223 X 0.0 10 10 f.I ft(regexp)s 694 X 1728 Y 1414 X 0.0 10 10 f.R ft(Include)s 1748 X(\()s 0.0 10 10 f.B ft(\261m)s 0.0 10 10 f.R ft(\))s 1982 X(or)s 2100 X(exclude)s 2445 X(\()s 0.0 10 10 f.B ft(\261M)s 0.0 10 10 f.R ft(\))s 2690 X(all)s 2825 X(requests)s 3187 X(using)s 3438 X(an)s 3566 X(HTTP)s 3850 X(method)s 4184 X(\(e.g.,)s 4420 X("HEAD"\))s 4846 X(matching)s 5252 X(the)s 694 X 1848 Y 1414 X(given)s 1661 X(perl)s 1841 X(regular)s 2148 X(expression.)s 694 X 2016 Y 1054 X 0.0 10 10 f.B ft(\261n)s 1185 X 0.0 10 10 f.I ft(regexp)s 694 X 2136 Y 1054 X 0.0 10 10 f.B ft(\261N)s 1201 X 0.0 10 10 f.I ft(regexp)s 694 X 2256 Y 1414 X 0.0 10 10 f.R ft(Include)s 1739 X(\()s 0.0 10 10 f.B ft(\261n)s 0.0 10 10 f.R ft(\))s 1937 X(or)s 2046 X(exclude)s 2382 X(\()s 0.0 10 10 f.B ft(\261N)s 0.0 10 10 f.R ft(\))s 2596 X(all)s 2722 X(requests)s 3075 X(on)s 3201 X(a)s 3271 X(URL)s 3496 X(\(archive)s 3847 X(name\))s 4121 X(matching)s 4518 X(the)s 4665 X(given)s 4912 X(perl)s 5092 X(regular)s 694 X 2376 Y 1414 X(expression.)s 694 X 2544 Y 1054 X 0.0 10 10 f.B ft(\261noescape)s 694 X 2664 Y 1414 X 0.0 10 10 f.R ft(Do)s 1561 X(not)s 1714 X(escape)s 2004 X(the)s 2151 X(special)s 2453 X(characters)s 2881 X(\("+")s 3077 X(and)s 3246 X("."\))s 3411 X(in)s 3514 X(the)s 3661 X(remaining)s 4091 X(search)s 4370 X(options.)s 694 X 2832 Y 0.0 9 9 f.B ft(INPUT)s 997 X 0.0 9 9 f.S2 ft(O)s 1035 X(O)s 1073 X(O)s 1111 X(O)s 1149 X(O)s 694 X 2952 Y 1054 X 0.0 10 10 f.R ft(After)s 1291 X(parsing)s 1611 X(the)s 1759 X(options,)s 2105 X(the)s 2253 X(remaining)s 2684 X(arguments)s 3126 X(on)s 3252 X(the)s 3400 X(command-line)s 4003 X(are)s 4150 X(treated)s 4447 X(as)s 4556 X(input)s 4788 X(arguments)s 5230 X(and)s 694 X 3072 Y 1054 X(are)s 1200 X(read)s 1396 X(in)s 1499 X(the)s 1646 X(order)s 1881 X(given.)s 2178 X(If)s 2269 X(no)s 2394 X(input)s 2625 X(arguments)s 3066 X(are)s 3212 X(given,)s 3484 X(the)s 3631 X(con\256gured)s 4083 X(default)s 4385 X(log\256le)s 4666 X(is)s 4758 X(read)s 4954 X([)s 0.0 10 10 f.B ft(+)s 0.0 10 10 f.R ft(].)s 694 X 3240 Y 1054 X 0.0 10 10 f.B ft(\261)s 1414 X 0.0 10 10 f.R ft(Read)s 1644 X(from)s 1863 X(standard)s 2226 X(input)s 2457 X(\(STDIN\).)s 694 X 3408 Y 1054 X 0.0 10 10 f.B ft(+)s 1414 X 0.0 10 10 f.R ft(Read)s 1644 X(the)s 1791 X(default)s 2093 X(log\256le.)s 2399 X([as)s 2540 X(con\256gured])s 694 X 3576 Y 1054 X 0.0 10 10 f.I ft(\256lename)s 0.0 10 10 f.S2 ft(P)s 0.0 10 10 f.R ft(...)s 694 X 3696 Y 1414 X(Read)s 1649 X(the)s 1801 X(given)s 2053 X(\256le)s 2211 X(and)s 2385 X(determine)s 2814 X(from)s 3038 X(the)s 3190 X(\256rst)s 3376 X(line)s 3555 X(whether)s 3905 X(it)s 3990 X(is)s 4086 X(a)s 4159 X(previous)s 4532 X(output)s 4817 X(summary)s 5218 X(or)s 5330 X(a)s 694 X 3816 Y 1414 X(CLF)s 1644 X(log\256le.)s 1996 X(If)s 2108 X(the)s 2276 X 0.0 10 10 f.I ft(\256lename)s 0.0 10 10 f.S2 ft(P)s 0.0 10 10 f.R ft('s)s 2740 X(extension)s 3169 X(indicates)s 3570 X(that)s 3766 X(is)s 3879 X(is)s 3992 X(compressed)s 4509 X(\(gz|z|Z\),)s 4884 X(then)s 5101 X(pipe)s 5318 X(it)s 694 X 3936 Y 1414 X(through)s 1759 X(the)s 1915 X(con\256gured)s 2376 X(decompression)s 3009 X(program)s 3381 X([)s 0.0 10 10 f.B ft(gunzip)s 3738 X(\261c)s 0.0 10 10 f.R ft(])s 3899 X(\256rst.)s 4114 X(Summary)s 4537 X(\256les)s 4737 X(must)s 4965 X(have)s 5186 X(been)s 694 X 4056 Y 1414 X(created)s 1754 X(with)s 1985 X(the)s 2160 X(same)s 2417 X(\(or)s 2585 X(similar\))s 2948 X(con\256guration)s 3533 X(and)s 3729 X(command-line)s 4358 X(options)s 4705 X(as)s 4840 X(the)s 5014 X(currently)s 694 X 4176 Y 1414 X(running)s 1750 X(program;)s 2141 X(if)s 2227 X(not,)s 2405 X(weird)s 2657 X(things)s 2927 X(will)s 3108 X(happen.)s 694 X 4344 Y 0.0 9 9 f.B ft(USAGE)s 1027 X 0.0 9 9 f.S2 ft(O)s 1065 X(O)s 1103 X(O)s 1141 X(O)s 1179 X(O)s 694 X 4464 Y 1054 X 0.0 10 10 f.B ft(wwwstat)s 1450 X 0.0 10 10 f.R ft(is)s 1542 X(used)s 1750 X(for)s 1891 X(many)s 2138 X(purposes:)s 694 X 4632 Y 1104 X(\267)s 1414 X(as)s 1553 X(a)s 1653 X(diagnostic)s 2120 X(utility)s 2416 X(for)s 2588 X(measuring)s 3060 X(server)s 3359 X(activity,)s 3739 X(\256nding)s 4078 X(incorrect)s 4487 X(URL)s 4742 X(references,)s 5230 X(and)s 694 X 4752 Y 1414 X(detecting)s 1805 X(attempted)s 2224 X(misuse)s 2527 X(of)s 2635 X(the)s 2782 X(server;)s 694 X 4920 Y 1104 X(\267)s 1414 X(as)s 1536 X(a)s 1619 X(public)s 1908 X(relations)s 2291 X(tool)s 2485 X(for)s 2639 X(measuring)s 3093 X(technology)s 3575 X(or)s 3696 X(information)s 4206 X(transfer)s 4548 X(\(i.e.,)s 4766 X(Is)s 4876 X(the)s 5036 X(message)s 694 X 5040 Y 1414 X(getting)s 1717 X(out?)s 1914 X(To)s 2050 X(the)s 2197 X(right)s 2411 X(people?\);)s 694 X 5208 Y 1104 X(\267)s 1414 X(as)s 1522 X(an)s 1641 X(archival)s 1987 X(tool)s 2168 X(for)s 2309 X(tracking)s 2661 X(web)s 2852 X(usage)s 3104 X(over)s 3306 X(time)s 3509 X(without)s 3840 X(storing)s 4143 X(the)s 4290 X(entire)s 4542 X(log\256le;)s 4851 X(and,)s 694 X 5376 Y 1104 X(\267)s 1414 X(most)s 1640 X(often,)s 1901 X(as)s 2015 X(an)s 2139 X(easy)s 2346 X(mechanism)s 2831 X(for)s 2977 X(justifying)s 3391 X(all)s 3521 X(the)s 3673 X(hard)s 3880 X(work)s 4115 X(that)s 4295 X(went)s 4519 X(into)s 4705 X(creating)s 5056 X(the)s 5208 X(web)s 694 X 5496 Y 1414 X(content)s 1733 X(that)s 1908 X(people)s 2199 X(out)s 2352 X(there)s 2576 X(are)s 2722 X(requesting.)s 694 X 5664 Y 1054 X(In)s 1166 X(most)s 1390 X(cases,)s 1654 X 0.0 10 10 f.B ft(wwwstat)s 2054 X 0.0 10 10 f.R ft(is)s 2149 X(run)s 2310 X(on)s 2438 X(a)s 2510 X(periodic)s 2865 X(basis)s 3093 X(\(nightly,)s 3463 X(weekly,)s 3804 X(and/or)s 4087 X(monthly\))s 4482 X(by)s 4610 X(a)s 4682 X(wrapper)s 5036 X(program)s 694 X 5784 Y 1054 X(as)s 1174 X(a)s 1255 X 0.0 10 10 f.B ft(crontab)s 1625 X 0.0 10 10 f.R ft(entry)s 1867 X(shortly)s 2182 X(after)s 2401 X(midnight,)s 2825 X(typically)s 3212 X(in)s 3327 X(conjunction)s 3836 X(with)s 4051 X(rotating)s 4399 X(the)s 4558 X(current)s 4877 X(log\256le.)s 5219 X(The)s 694 X 5904 Y 1054 X(output)s 1355 X(is)s 1467 X(usually)s 1801 X(directed)s 2167 X(to)s 2290 X(a)s 2379 X(temporary)s 2834 X(\256le)s 3007 X(which)s 3296 X(can)s 3479 X(later)s 3701 X(be)s 3840 X(moved)s 4157 X(to)s 4280 X(a)s 4369 X(published)s 4803 X(location.)s 5219 X(The)s 694 X 6024 Y 1054 X(temporary)s 1493 X(\256le)s 1650 X(is)s 1746 X(necessary)s 2162 X(to)s 2269 X(avoid)s 2520 X(erasing)s 2836 X(your)s 3047 X(published)s 3464 X(\256le)s 3620 X(during)s 3909 X(wwwstat's)s 4364 X(processing)s 4819 X(\(which)s 5124 X(would)s 694 X 6144 Y 1054 X(look)s 1257 X(very)s 1459 X(odd)s 1634 X(if)s 1720 X(someone)s 2100 X(tried)s 2308 X(to)s 2411 X(GET)s 2630 X(it)s 2711 X(from)s 2930 X(your)s 3138 X(web\).)s 694 X 6312 Y 1054 X 0.0 10 10 f.B ft(wwwstat)s 1461 X 0.0 10 10 f.R ft(can)s 1635 X(be)s 1765 X(run)s 1934 X(as)s 2053 X(a)s 2133 X(CGI)s 2341 X(script)s 2599 X(\()s 0.0 10 10 f.B ft(\261cgi)s 0.0 10 10 f.R ft(\),)s 2898 X(but)s 3062 X(that)s 3248 X(is)s 3351 X(not)s 3515 X(recommended)s 4116 X(unless)s 4402 X(the)s 4560 X(input)s 4802 X(log\256le)s 5094 X(is)s 5197 X(very)s 694 X 6432 Y 1054 X(small.)s 694 X 6600 Y 1054 X(All)s 1215 X(of)s 1331 X(the)s 1486 X(command-line)s 2096 X(options,)s 2449 X(and)s 2625 X(a)s 2701 X(few)s 2882 X(options)s 3209 X(that)s 3391 X(are)s 3544 X(not)s 3704 X(available)s 4096 X(from)s 4322 X(the)s 4476 X(command-line,)s 5110 X(can)s 5280 X(be)s 694 X 6720 Y 1054 X(changed)s 1428 X(within)s 1726 X(the)s 1890 X(user)s 2098 X(and)s 2284 X(system)s 2604 X(con\256guration)s 3179 X(\256les)s 3387 X(\(see)s 3588 X 0.0 10 10 f.B ft(wwwstat.rc)s 0.0 10 10 f.R ft(\).)s 4196 X(These)s 4475 X(\256les)s 4683 X(are)s 4845 X(actually)s 5202 X 0.0 10 10 f.B ft(perl)s 694 X 6840 Y 1054 X 0.0 10 10 f.R ft(library)s 1350 X(modules)s 1719 X(which)s 1993 X(are)s 2144 X(executed)s 2527 X(as)s 2639 X(part)s 2823 X(of)s 2935 X(the)s 3086 X(program's)s 3525 X(initialization.)s 4110 X(The)s 4294 X(example)s 4661 X(provided)s 5045 X(with)s 5252 X(the)s 694 X 6960 Y 1054 X(distribution)s 1541 X(includes)s 1899 X(complete)s 2290 X(documentation)s 2909 X(on)s 3034 X(what)s 3253 X(variables)s 3638 X(can)s 3801 X(be)s 3920 X(set)s 4056 X(and)s 4225 X(their)s 4433 X(range)s 4679 X(of)s 4787 X(values.)s 694 X 7680 Y(Sun Release 4.1)s 2382 X(Last change: 03 November 1996)s 5324 X(5)s 7920 Y page 0.0 10 10 f.R ft %%Page: 6 6 694 X 480 Y(wwwstat)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\()s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(1)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\))s 2586 X(USER COMMANDS )s 4852 X(wwwstat)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\()s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(1)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\))s 694 X 960 Y 874 X 0.0 9 9 f.B ft(Perl)s 1057 X 0.0 9 9 f.S2 ft(O)s 0.0 9 9 f.B ft(Regular)s 1405 X 0.0 9 9 f.S2 ft(O)s 0.0 9 9 f.B ft(Expressions)s 1903 X 0.0 9 9 f.S2 ft(O)s 1941 X(O)s 1979 X(O)s 694 X 1080 Y 1054 X 0.0 10 10 f.R ft(The)s 1236 X(Search)s 1533 X(Options)s 1876 X(and)s 2046 X(many)s 2294 X(of)s 2403 X(the)s 2551 X(con\256guration)s 3110 X(\256le)s 3264 X(settings)s 3596 X(allow)s 3844 X(for)s 3986 X(full)s 4151 X(use)s 4310 X(of)s 4419 X(perl)s 4600 X(regular)s 4908 X(expressions)s 694 X 1200 Y 1054 X(\(with)s 1304 X(the)s 1465 X(exception)s 1892 X(that)s 2080 X(the)s 2240 X(\261a,)s 2397 X(\261A,)s 2582 X(\261n)s 2720 X(and)s 2902 X(\261N)s 3062 X(options)s 3395 X(treat)s 3610 X('+')s 3770 X(and)s 3952 X('.')s 4081 X(characters)s 4522 X(as)s 4643 X(normal)s 4964 X(alphabetic)s 694 X 1320 Y 1054 X(characters)s 1508 X(unless)s 1809 X(they)s 2032 X(are)s 2204 X(preceded)s 2614 X(by)s 2765 X(the)s 2938 X 0.0 10 10 f.B ft(\261noescape)s 3422 X 0.0 10 10 f.R ft(option\).)s 3812 X(Most)s 4069 X(people)s 4386 X(only)s 4614 X(need)s 4852 X(to)s 4980 X(know)s 5252 X(the)s 694 X 1440 Y 1054 X(following)s 1468 X(special)s 1770 X(characters:)s 694 X 1608 Y 1054 X 0.0 10 10 f.B ft(\303)s 1454 X 0.0 10 10 f.R ft(at)s 1551 X(start)s 1748 X(of)s 1856 X(pattern,)s 2183 X(means)s 2463 X("starts)s 2740 X(with)s 2943 X(pattern".)s 694 X 1728 Y 1054 X 0.0 10 10 f.B ft($)s 1454 X 0.0 10 10 f.R ft(at)s 1551 X(end)s 1720 X(of)s 1828 X(pattern,)s 2155 X(means)s 2435 X("ends)s 2684 X(with)s 2887 X(pattern".)s 694 X 1848 Y 1054 X 0.0 10 10 f.B ft(\(...\))s 1454 X 0.0 10 10 f.R ft(groups)s 1751 X(pattern)s 2053 X(elements)s 2433 X(as)s 2541 X(a)s 2610 X(single)s 2874 X(element.)s 694 X 1968 Y 1054 X 0.0 10 10 f.B ft(?)s 1454 X 0.0 10 10 f.R ft(matches)s 1806 X(preceding)s 2224 X(element)s 2565 X(zero)s 2761 X(or)s 2869 X(one)s 3038 X(times.)s 694 X 2088 Y 1054 X 0.0 10 10 f.S ft(*)s 1454 X 0.0 10 10 f.R ft(matches)s 1806 X(preceding)s 2224 X(element)s 2565 X(zero)s 2761 X(or)s 2869 X(more)s 3099 X(times.)s 694 X 2208 Y 1054 X 0.0 10 10 f.B ft(+)s 1454 X 0.0 10 10 f.R ft(matches)s 1806 X(preceding)s 2224 X(element)s 2565 X(one)s 2734 X(or)s 2842 X(more)s 3072 X(times.)s 694 X 2328 Y 1054 X 0.0 10 10 f.B ft(.)s 1454 X 0.0 10 10 f.R ft(matches)s 1806 X(any)s 1975 X(single)s 2239 X(character.)s 694 X 2448 Y 1054 X 0.0 10 10 f.B ft([...])s 1454 X 0.0 10 10 f.R ft(denotes)s 1788 X(a)s 1861 X(class)s 2084 X(of)s 2195 X(characters)s 2626 X(to)s 2732 X(match.)s 3029 X([\303...])s 3231 X(negates)s 3558 X(the)s 3708 X(class.)s 3980 X(Inside)s 4252 X(a)s 4324 X(class,)s 4571 X('-')s 4698 X(indicates)s 5081 X(a)s 5153 X(range)s 694 X 2568 Y 1454 X(of)s 1562 X(characters.)s 694 X 2688 Y 1054 X 0.0 10 10 f.B ft(\(A|B|C\))s 1454 X 0.0 10 10 f.R ft(matches)s 1806 X(if)s 1892 X(A)s 1989 X(or)s 2097 X(B)s 2189 X(or)s 2297 X(C)s 2389 X(matches.)s 694 X 2856 Y 1054 X(Depending)s 1523 X(on)s 1654 X(your)s 1868 X(command)s 2293 X(shell,)s 2538 X(some)s 2780 X(special)s 3088 X(characters)s 3521 X(may)s 3723 X(need)s 3941 X(to)s 4049 X(be)s 4173 X(escaped)s 4518 X(on)s 4648 X(the)s 4800 X(command)s 5224 X(line)s 694 X 2976 Y 1054 X(or)s 1162 X(enclosed)s 1536 X(in)s 1639 X(single-quotes)s 2197 X(to)s 2300 X(avoid)s 2547 X(shell)s 2761 X(interpretation.)s 694 X 3144 Y 0.0 9 9 f.B ft(EXAMPLES)s 1217 X 0.0 9 9 f.S2 ft(O)s 1255 X(O)s 1293 X(O)s 1331 X(O)s 1369 X(O)s 694 X 3264 Y 1054 X 0.0 10 10 f.R ft(Summarize)s 1534 X(requests)s 1886 X(from)s 2105 X(commercial)s 2601 X(domains.)s 694 X 3384 Y 1414 X 0.0 10 10 f.B ft(wwwstat)s 1810 X(\261a)s 1935 X('.com$')s 694 X 3552 Y 1054 X 0.0 10 10 f.R ft(Summarize)s 1534 X(requests)s 1886 X(from)s 2105 X(the)s 2252 X(host)s 2444 X(kiwi.ics.uci.edu)s 694 X 3672 Y 1414 X 0.0 10 10 f.B ft(wwwstat)s 1810 X(\261a)s 1935 X('\303kiwi.ics.uci.edu$')s 694 X 3840 Y 1054 X 0.0 10 10 f.R ft(Summarize)s 1534 X(requests)s 1886 X(not)s 2039 X(from)s 2258 X(kiwi.ics.uci.edu)s 694 X 3960 Y 1414 X 0.0 10 10 f.B ft(wwwstat)s 1810 X(\261A)s 1957 X('\303kiwi.ics.uci.edu$')s 694 X 4128 Y 1054 X 0.0 10 10 f.R ft(Summarize)s 1534 X(requests)s 1886 X(resulting)s 2261 X(in)s 2364 X(temporary)s 2799 X(redirects)s 694 X 4248 Y 1414 X 0.0 10 10 f.B ft(wwwstat)s 1810 X(\261c)s 1929 X('302')s 694 X 4416 Y 1054 X 0.0 10 10 f.R ft(Summarize)s 1534 X(requests)s 1886 X(resulting)s 2261 X(in)s 2364 X(server)s 2632 X(errors)s 694 X 4536 Y 1414 X 0.0 10 10 f.B ft(wwwstat)s 1810 X(\261c)s 1929 X('\3035')s 694 X 4704 Y 1054 X 0.0 10 10 f.R ft(Summarize)s 1534 X(unsuccessful)s 2069 X(requests)s 694 X 4824 Y 1414 X 0.0 10 10 f.B ft(wwwstat)s 1810 X(\261C)s 1957 X('\3032')s 2131 X(\261C)s 2278 X('304')s 694 X 4992 Y 1054 X 0.0 10 10 f.R ft(Summarize)s 1534 X(requests)s 1886 X(in)s 1989 X(\256rst)s 2170 X(week)s 2405 X(of)s 2513 X(the)s 2660 X(month)s 694 X 5112 Y 1414 X 0.0 10 10 f.B ft(wwwstat)s 1810 X(\261d)s 1941 X(')s 1999 X([1-7])s 2223 X(')s 694 X 5280 Y 1054 X 0.0 10 10 f.R ft(Summarize)s 1534 X(requests)s 1886 X(in)s 1989 X(second)s 2291 X(week)s 2526 X(of)s 2634 X(the)s 2781 X(month)s 694 X 5400 Y 1414 X 0.0 10 10 f.B ft(wwwstat)s 1810 X(\261d)s 1941 X(')s 1999 X(\([89]|1[0-4]\))s 2527 X(')s 694 X 5568 Y 1054 X 0.0 10 10 f.R ft(Summarize)s 1534 X(requests)s 1886 X(in)s 1989 X(third)s 2203 X(week)s 2438 X(of)s 2546 X(the)s 2693 X(month)s 694 X 5688 Y 1414 X 0.0 10 10 f.B ft(wwwstat)s 1810 X(\261d)s 1941 X(')s 1999 X(\(1[5-9]|2[01]\))s 2577 X(')s 694 X 5856 Y 1054 X 0.0 10 10 f.R ft(Summarize)s 1534 X(requests)s 1886 X(in)s 1989 X(fourth)s 2258 X(week)s 2493 X(of)s 2601 X(the)s 2748 X(month)s 694 X 5976 Y 1414 X 0.0 10 10 f.B ft(wwwstat)s 1810 X(\261d)s 1941 X(')s 1999 X(2[2-8])s 2273 X(')s 694 X 6144 Y 1054 X 0.0 10 10 f.R ft(Summarize)s 1534 X(requests)s 1886 X(in)s 1989 X(leftover)s 2324 X(days)s 2532 X(of)s 2640 X(the)s 2787 X(month)s 694 X 6264 Y 1414 X 0.0 10 10 f.B ft(wwwstat)s 1810 X(\261d)s 1941 X(')s 1999 X(\(29|30|31\))s 2434 X(')s 694 X 6432 Y 1054 X 0.0 10 10 f.R ft(Summarize)s 1534 X(requests)s 1886 X(in)s 1989 X(February)s 694 X 6552 Y 1414 X 0.0 10 10 f.B ft(wwwstat)s 1810 X(\261d)s 1941 X('Feb')s 694 X 6720 Y 1054 X 0.0 10 10 f.R ft(Summarize)s 1534 X(requests)s 1886 X(in)s 1989 X(year)s 2185 X(1994)s 694 X 6840 Y 1414 X 0.0 10 10 f.B ft(wwwstat)s 1810 X(\261d)s 1941 X('1994')s 694 X 7008 Y 1054 X 0.0 10 10 f.R ft(Summarize)s 1534 X(requests)s 1886 X(not)s 2039 X(in)s 2142 X(April)s 694 X 7128 Y 1414 X 0.0 10 10 f.B ft(wwwstat)s 1810 X(\261D)s 1957 X('Apr')s 694 X 7296 Y 1054 X 0.0 10 10 f.R ft(Summarize)s 1534 X(requests)s 1886 X(between)s 2243 X(midnight)s 2630 X(and)s 2799 X(1am)s 694 X 7776 Y(Sun Release 4.1)s 2382 X(Last change: 03 November 1996)s 5324 X(6)s 7920 Y page 0.0 10 10 f.R ft %%Page: 7 7 694 X 480 Y(wwwstat)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\()s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(1)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\))s 2586 X(USER COMMANDS )s 4852 X(wwwstat)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\()s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(1)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\))s 694 X 960 Y 1414 X 0.0 10 10 f.B ft(wwwstat)s 1810 X(\261t)s 1918 X('00')s 694 X 1128 Y 1054 X 0.0 10 10 f.R ft(Summarize)s 1534 X(requests)s 1886 X(not)s 2039 X(received)s 2401 X(between)s 2758 X(noon)s 2983 X(and)s 3152 X(1pm)s 694 X 1248 Y 1414 X 0.0 10 10 f.B ft(wwwstat)s 1810 X(\261T)s 1952 X('12')s 694 X 1416 Y 1054 X 0.0 10 10 f.R ft(Summarize)s 1534 X(requests)s 1886 X(with)s 2089 X(a)s 2158 X(gif)s 2294 X(extension)s 694 X 1536 Y 1414 X 0.0 10 10 f.B ft(wwwstat)s 1810 X(\261n)s 1941 X('.gif$')s 694 X 1704 Y 1054 X 0.0 10 10 f.R ft(Summarize)s 1534 X(requests)s 1886 X(under)s 2138 X(user's)s 2401 X(URL)s 694 X 1824 Y 1414 X 0.0 10 10 f.B ft(wwwstat)s 1810 X(\261n)s 1941 X('\303/\304user/')s 694 X 1992 Y 1054 X 0.0 10 10 f.R ft(Summarize)s 1534 X(requests)s 1886 X(not)s 2039 X(under)s 2291 X("hidden")s 2670 X(paths)s 694 X 2112 Y 1414 X 0.0 10 10 f.B ft(wwwstat)s 1810 X(\261N)s 1957 X('/hidden/')s 694 X 2280 Y 0.0 9 9 f.B ft(ENVIRONMENT)s 1412 X 0.0 9 9 f.S2 ft(O)s 1450 X(O)s 1488 X(O)s 1526 X(O)s 1564 X(O)s 694 X 2400 Y 1054 X 0.0 10 10 f.B ft(HOME)s 1654 X 0.0 10 10 f.R ft(Location)s 2034 X(of)s 2142 X(user's)s 2405 X(home)s 2652 X(directory,)s 3062 X(placed)s 3347 X(on)s 3472 X(INC)s 3669 X(path.)s 694 X 2568 Y 1054 X 0.0 10 10 f.B ft(LOGDIR)s 1654 X 0.0 10 10 f.R ft(Used)s 1884 X(instead)s 2192 X(of)s 2300 X(HOME)s 2619 X(if)s 2705 X(latter)s 2935 X(is)s 3027 X(unde\256ned.)s 694 X 2736 Y 1054 X 0.0 10 10 f.B ft(PERLLIB)s 1654 X 0.0 10 10 f.R ft(A)s 1751 X(colon-separated)s 2407 X(list)s 2555 X(of)s 2663 X(directories)s 3109 X(in)s 3212 X(which)s 3481 X(to)s 3584 X(look)s 3787 X(for)s 3928 X(include)s 4247 X(and)s 4416 X(con\256guration)s 4974 X(\256les.)s 694 X 2904 Y 0.0 9 9 f.B ft(FILES)s 977 X 0.0 9 9 f.S2 ft(O)s 1015 X(O)s 1053 X(O)s 1091 X(O)s 1129 X(O)s 694 X 3024 Y 1054 X 0.0 10 10 f.R ft(Unless)s 1363 X(a)s 1444 X(pathname)s 1869 X(is)s 1973 X(supplied,)s 2374 X(the)s 2533 X(con\256guration)s 3103 X(\256les)s 3307 X(are)s 3465 X(obtained)s 3846 X(from)s 4077 X(the)s 4236 X(current)s 4555 X(directory,)s 4977 X(the)s 5136 X(user's)s 694 X 3144 Y 1054 X(home)s 1309 X(directory)s 1702 X(\()s 0.0 10 10 f.B ft(HOME)s 2085 X 0.0 10 10 f.R ft(or)s 2201 X 0.0 10 10 f.B ft(LOGDIR)s 0.0 10 10 f.R ft(\),)s 2697 X(the)s 2851 X(standard)s 3221 X(library)s 3519 X(path)s 3723 X(\()s 0.0 10 10 f.B ft(PERLLIB)s 0.0 10 10 f.R ft(\),)s 4286 X(and)s 4462 X(the)s 4616 X(directory)s 5008 X(indicated)s 694 X 3264 Y 1054 X(by)s 1179 X(the)s 1326 X(command)s 1745 X(pathname)s 2158 X(\(in)s 2294 X(that)s 2469 X(order\).)s 694 X 3432 Y 1054 X 0.0 10 10 f.B ft(.wwwstatrc)s 1804 X 0.0 10 10 f.R ft(User)s 2017 X(con\256guration)s 2575 X(\256le.)s 694 X 3600 Y 1054 X 0.0 10 10 f.B ft(wwwstat.rc)s 1804 X 0.0 10 10 f.R ft(System)s 2124 X(con\256guration)s 2682 X(\256le.)s 694 X 3768 Y 1054 X 0.0 10 10 f.B ft(domains.pl)s 1804 X 0.0 10 10 f.R ft(Mapping)s 2190 X(of)s 2298 X(Internet)s 2633 X(domain)s 2958 X(to)s 3061 X(country)s 3391 X(or)s 3499 X(organization.)s 694 X 3936 Y 1054 X 0.0 10 10 f.B ft(dnscache.dir)s 694 X 4056 Y 1054 X(dnscache.pag)s 1804 X 0.0 10 10 f.R ft(DBM)s 2057 X(\256les)s 2249 X(for)s 2390 X(persistent)s 2798 X(DNS)s 3023 X(cache.)s 694 X 4224 Y 0.0 9 9 f.B ft(SEE)s 887 X 0.0 9 9 f.S2 ft(O)s 0.0 9 9 f.B ft(ALSO)s 1170 X 0.0 9 9 f.S2 ft(O)s 1208 X(O)s 1246 X(O)s 1284 X(O)s 694 X 4344 Y 1054 X 0.0 10 10 f.B ft(crontab)s 0.0 10 10 f.R ft(\(1\),)s 1553 X 0.0 10 10 f.B ft(gwstat)s 0.0 10 10 f.R ft(\(1\),)s 1996 X 0.0 10 10 f.B ft(httpd)s 0.0 10 10 f.R ft(\(1m\),)s 2474 X 0.0 10 10 f.B ft(perl)s 0.0 10 10 f.R ft(\(1\),)s 2812 X 0.0 10 10 f.B ft(splitlog)s 0.0 10 10 f.R ft(\(1\))s 694 X 4512 Y 1054 X(More)s 1295 X(info)s 1481 X(and)s 1650 X(the)s 1797 X(latest)s 2033 X(version)s 2352 X(of)s 2460 X(wwwstat)s 2840 X(can)s 3003 X(be)s 3122 X(obtained)s 3491 X(from)s 694 X 4680 Y 1179 X(http://www.ics.uci.edu/pub/websoft/wwwstat/)s 694 X 4800 Y 1204 X(ftp://www.ics.uci.edu/pub/websoft/wwwstat/)s 694 X 4968 Y 1054 X(If)s 1195 X(you)s 1420 X(have)s 1683 X(any)s 1902 X(suggestions,)s 2469 X(bug)s 2694 X(reports,)s 3071 X(\256xes,)s 3360 X(or)s 3517 X(enhancements,)s 4181 X(please)s 4504 X(join)s 4734 X(the)s 4930 X()s 1873 X(mailing)s 2218 X(list)s 2380 X(by)s 2519 X(sending)s 2869 X(e-mail)s 3163 X(with)s 3380 X("subscribe")s 3878 X(in)s 3995 X(the)s 4156 X(subject)s 4478 X(of)s 4600 X(the)s 4760 X(message)s 5136 X(to)s 5252 X(the)s 694 X 5208 Y 1054 X(request)s 1367 X(address)s 1691 X(.)s 3311 X(The)s 3491 X(list)s 3639 X(is)s 3731 X(archived)s 4099 X(at)s 4196 X(the)s 4343 X(above)s 4606 X(address.)s 694 X 5376 Y 874 X 0.0 9 9 f.B ft(More)s 1107 X 0.0 9 9 f.S2 ft(O)s 0.0 9 9 f.B ft(About)s 1385 X 0.0 9 9 f.S2 ft(O)s 0.0 9 9 f.B ft(HTTP)s 1668 X 0.0 9 9 f.S2 ft(O)s 1706 X(O)s 1744 X(O)s 694 X 5496 Y 1054 X 0.0 10 10 f.R ft(HTTP/1.1)s 1482 X(Proposed)s 1879 X(Standard)s 694 X 5616 Y 1414 X(R.)s 1535 X(Fielding,)s 1923 X(J.)s 2016 X(Gettys,)s 2330 X(J.)s 2422 X(C.)s 2542 X(Mogul,)s 2862 X(H.)s 2987 X(Frystyk,)s 3346 X(and)s 3518 X(T.)s 3632 X(Berners-Lee.)s 4202 X("Hypertext)s 4670 X(Transfer)s 5035 X(Protocol)s 694 X 5736 Y 1414 X(--)s 1505 X(HTTP/1.1",)s 1999 X(U.C.)s 2213 X(Irvine,)s 2501 X(DEC,)s 2751 X(MIT/LCS,)s 3196 X(August)s 3510 X(1996.)s 694 X 5856 Y 1414 X(http://www.ics.uci.edu/pub/ietf/http/)s 694 X 6024 Y 874 X 0.0 9 9 f.B ft(More)s 1107 X 0.0 9 9 f.S2 ft(O)s 0.0 9 9 f.B ft(About)s 1385 X 0.0 9 9 f.S2 ft(O)s 0.0 9 9 f.B ft(Perl)s 1583 X 0.0 9 9 f.S2 ft(O)s 1621 X(O)s 1659 X(O)s 694 X 6144 Y 1054 X 0.0 10 10 f.R ft(The)s 1234 X(Perl)s 1420 X(Language)s 1838 X(Home)s 2107 X(Page)s 694 X 6264 Y 1414 X(http://www.perl.com/perl/index.html)s 694 X 6432 Y 1054 X(Johan)s 1312 X(Vromans')s 1736 X(Perl)s 1922 X(Reference)s 2350 X(Guide)s 694 X 6552 Y 1414 X(http://www.xs4all.nl/\304jvromans/perlref.html)s 694 X 6720 Y 0.0 9 9 f.B ft(DIAGNOSTICS)s 1347 X 0.0 9 9 f.S2 ft(O)s 1385 X(O)s 1423 X(O)s 1461 X(O)s 1499 X(O)s 694 X 6840 Y 1054 X 0.0 10 10 f.R ft(See)s 1223 X(also)s 1409 X(the)s 1556 X 0.0 10 10 f.B ft(Diagnostic)s 2031 X(Options)s 2396 X 0.0 10 10 f.R ft(above.)s 694 X 7008 Y 1054 X("[none])s 1380 X(to)s 1483 X([none]")s 1809 X(dates)s 694 X 7128 Y 1414 X 0.0 10 10 f.B ft(wwwstat)s 1824 X 0.0 10 10 f.R ft(did)s 1991 X(not)s 2158 X(\256nd)s 2352 X(any)s 2534 X(matching)s 2944 X(data)s 3148 X(to)s 3264 X(summarize.)s 3790 X(If)s 3894 X(you)s 4082 X(get)s 4242 X(such)s 4463 X(an)s 4595 X(empty)s 4883 X(summary,)s 5318 X(it)s 694 X 7248 Y 1414 X(means)s 1696 X(that)s 1873 X(either:)s 2155 X(1\))s 2265 X(there)s 2491 X(was)s 2673 X(no)s 2800 X(valid)s 3027 X(data)s 3220 X(\(the)s 3402 X(input)s 3635 X(\256les)s 3829 X(are)s 3977 X(all)s 4104 X(invalid)s 4409 X(or)s 4519 X(empty\),)s 4853 X(or)s 4962 X(2\))s 5071 X(none)s 5291 X(of)s 694 X 7728 Y(Sun Release 4.1)s 2382 X(Last change: 03 November 1996)s 5324 X(7)s 7920 Y page 0.0 10 10 f.R ft %%Page: 8 8 694 X 480 Y(wwwstat)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\()s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(1)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\))s 2586 X(USER COMMANDS )s 4852 X(wwwstat)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\()s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(1)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\))s 694 X 960 Y 1414 X(the)s 1561 X(data)s 1752 X(matched)s 2115 X(the)s 2262 X(search)s 2541 X(options)s 2861 X(given.)s 3158 X(Try)s 3327 X(using)s 3569 X(the)s 3716 X 0.0 10 10 f.B ft(\261e)s 3835 X 0.0 10 10 f.R ft(option)s 4116 X(to)s 4219 X(show)s 4455 X(invalid)s 4758 X(data.)s 694 X 1128 Y 1054 X(100%)s 1312 X(unresolved)s 694 X 1248 Y 1414 X(If)s 1511 X(the)s 1663 X(subdomain)s 2132 X(section)s 2445 X(indicates)s 2830 X(that)s 3010 X(all)s 3140 X(of)s 3253 X(the)s 3405 X(client)s 3657 X(requests)s 4014 X(come)s 4260 X(from)s 4484 X(unresolved)s 4952 X(hostnames)s 694 X 1368 Y 1414 X(\(IP)s 1567 X(addresses\),)s 2038 X(this)s 2214 X(probably)s 2600 X(means)s 2886 X(that)s 3067 X(your)s 3281 X(server)s 3555 X(is)s 3653 X(running)s 3995 X(without)s 4331 X(DNS)s 4561 X(resolution)s 4991 X(\(common)s 694 X 1488 Y 1414 X(for)s 1579 X(very)s 1805 X(busy)s 2043 X(sites\).)s 2353 X(You)s 2574 X(can)s 2761 X(use)s 2943 X(the)s 3114 X 0.0 10 10 f.B ft(\261dns)s 3364 X 0.0 10 10 f.R ft(option)s 3669 X(to)s 3796 X(have)s 4033 X 0.0 10 10 f.B ft(wwwstat)s 4452 X 0.0 10 10 f.R ft(perform)s 4821 X(the)s 4991 X(hostname)s 694 X 1608 Y 1414 X(lookups.)s 1815 X(If)s 1915 X(100%)s 2182 X(of)s 2299 X(the)s 2454 X(hosts)s 2693 X(are)s 2847 X(still)s 3031 X(unresolved)s 3502 X(with)s 3713 X(the)s 3868 X 0.0 10 10 f.B ft(\261dns)s 4102 X 0.0 10 10 f.R ft(option)s 4391 X(in)s 4502 X(e)s /Cff { (f) show xsiz pt 20 div neg 0 rmoveto (f) s } def Cff(ect,)s 4781 X(then)s 4986 X(it)s 5075 X(may)s 5280 X(be)s 694 X 1728 Y 1414 X(that)s 1608 X(all)s 1752 X(of)s 1879 X(the)s 2045 X(clients)s 2350 X(accessing)s 2776 X(your)s 3003 X(server)s 3290 X(are)s 3454 X(doing)s 3725 X(so)s 3857 X(from)s 4094 X(temporary)s 4547 X(SLIP/PPP)s 4992 X(addresses)s 694 X 1848 Y 1414 X(without)s 1753 X(DNS)s 1986 X(names,)s 2299 X(or)s 2415 X(it)s 2504 X(may)s 2708 X(be)s 2834 X(a)s 2910 X(problem)s 3275 X(with)s 3485 X(wwwstat's)s 3944 X(DNS)s 4176 X(cache)s 4434 X(\(delete)s 4737 X(the)s 4891 X(cache)s 5149 X(\256les\),)s 694 X 1968 Y 1414 X(with)s 1639 X(your)s 1869 X(system's)s 2266 X(DNS)s 2513 X(software)s 2903 X(\(contact)s 3271 X(your)s 3501 X(system)s 3826 X(administrator\),)s 4464 X(or)s 4594 X(with)s 4818 X(your)s 5047 X(network)s 694 X 2088 Y 1414 X(connection.)s 694 X 2256 Y 0.0 9 9 f.B ft(NOTES)s 1022 X 0.0 9 9 f.S2 ft(O)s 1060 X(O)s 1098 X(O)s 1136 X(O)s 1174 X(O)s 694 X 2376 Y 874 X 0.0 9 9 f.B ft(Hits)s 1057 X 0.0 9 9 f.S2 ft(O)s 0.0 9 9 f.B ft(vs)s 1175 X 0.0 9 9 f.S2 ft(O)s 0.0 9 9 f.B ft(Requests)s 1558 X 0.0 9 9 f.S2 ft(O)s 0.0 9 9 f.B ft(vs)s 1676 X 0.0 9 9 f.S2 ft(O)s 0.0 9 9 f.B ft(Visitors)s 2014 X 0.0 9 9 f.S2 ft(O)s 694 X 2496 Y 1054 X 0.0 10 10 f.B ft(wwwstat)s 1453 X 0.0 10 10 f.R ft(counts)s 1742 X(HTTP)s 2020 X(requests)s 2375 X(received)s 2740 X(by)s 2868 X(the)s 3018 X(server.)s 3339 X(When)s 3604 X(a)s 3675 X(request)s 3990 X(is)s 4084 X(successful,)s 4546 X(it)s 4629 X(is)s 4723 X(often)s 4955 X(referred)s 5296 X(to)s 694 X 2616 Y 1054 X(as)s 1180 X(a)s 1267 X("hit".)s 1523 X(Retrieving)s 1988 X(a)s 2074 X(single)s 2355 X(image)s 2641 X(is)s 2750 X(one)s 2936 X(GET)s 3172 X(request.)s 3527 X(Retrieving)s 3991 X(an)s 4127 X(HTML)s 4452 X(page)s 4682 X(is)s 4791 X(also)s 4994 X(one)s 5180 X(GET)s 694 X 2736 Y 1054 X(request,)s 1393 X(but)s 1547 X(that)s 1723 X(does)s 1931 X(not)s 2084 X(include)s 2403 X(the)s 2550 X(separate)s 2901 X(requests)s 3253 X(made)s 3494 X(for)s 3635 X(in-line)s 3921 X(images)s 4229 X(or)s 4337 X(related)s 4633 X(objects.)s 4991 X(Checking)s 694 X 2856 Y 1054 X(to)s 1157 X(see)s 1309 X(if)s 1395 X(a)s 1464 X(cached)s 1765 X(image)s 2034 X(is)s 2126 X(still)s 2302 X(valid)s 2527 X(\(a)s 2629 X(HEAD)s 2931 X(or)s 3039 X(conditional)s 3514 X(GET\))s 3766 X(is)s 3858 X(also)s 4044 X(one)s 4213 X(request.)s 694 X 3024 Y 1054 X(In)s 1168 X(all)s 1299 X(sections)s 1652 X(except)s 1943 X(the)s 2096 X(archive)s 2420 X(section,)s 2759 X 0.0 10 10 f.B ft(wwwstat)s 3161 X 0.0 10 10 f.R ft(shows)s 3442 X(the)s 3594 X(statistics)s 3969 X(for)s 4115 X(all)s 4245 X(requests)s 4602 X(\(successful)s 5075 X(or)s 5188 X(not\).)s 694 X 3144 Y 1054 X(In)s 1167 X(the)s 1319 X(archive)s 1642 X(section,)s 1980 X(it)s 2066 X(normally)s 2457 X(shows)s 2736 X(all)s 2865 X(non-successful)s 3487 X(requests)s 3843 X(under)s 4099 X(a)s 4172 X(special)s 4478 X(category)s 4850 X(for)s 4995 X(the)s 5146 X(status)s 694 X 3264 Y 1054 X(code)s 1293 X(and)s 1488 X(only)s 1717 X(successful)s 2178 X(requests)s 2556 X(\(hits\))s 2818 X(under)s 3096 X(the)s 3269 X(URL)s 3520 X(or)s 3654 X(archive)s 3998 X(tree)s 4198 X(associated)s 4659 X(with)s 4888 X(the)s 5061 X(request.)s 694 X 3384 Y 1054 X(However,)s 1489 X(this)s 1679 X(grouping)s 2085 X(of)s 2213 X(non-successful)s 2851 X(requests)s 3223 X(is)s 3335 X(disabled)s 3713 X(when)s 3974 X 0.0 10 10 f.B ft(wwwstat)s 4390 X 0.0 10 10 f.R ft(is)s 4502 X(used)s 4730 X(with)s 4953 X(the)s 5120 X(search)s 694 X 3504 Y 1054 X(options)s 1374 X 0.0 10 10 f.B ft(\261n)s 0.0 10 10 f.R ft(,)s 1530 X 0.0 10 10 f.B ft(\261c)s 0.0 10 10 f.R ft(,)s 1674 X(and)s 1843 X 0.0 10 10 f.B ft(\261C)s 0.0 10 10 f.R ft(,)s 2015 X(since)s 2245 X(those)s 2481 X(options)s 2801 X(are)s 2947 X(normally)s 3333 X(used)s 3541 X(for)s 3682 X(\256nding)s 3991 X(error)s 4209 X(conditions.)s 694 X 3672 Y 1054 X 0.0 10 10 f.B ft(wwwstat)s 1458 X 0.0 10 10 f.R ft(does)s 1673 X(not)s 1833 X(count)s 2087 X("visitors")s 2496 X(--)s 2594 X(individual)s 3032 X(people)s 3330 X(or)s 3445 X(programs)s 3854 X(making)s 4186 X(the)s 4340 X(requests.)s 4724 X(HTTP)s 5006 X(does)s 5221 X(not,)s 694 X 3792 Y 1054 X(by)s 1188 X(default,)s 1524 X(provide)s 1863 X(any)s 2041 X(information)s 2547 X(that)s 2731 X(can)s 2903 X(be)s 3031 X(accurately)s 3474 X(correlated)s 3906 X(to)s 4017 X(an)s 4144 X(individual)s 4583 X(person,)s 4907 X(though)s 5218 X(it)s 5307 X(is)s 694 X 3912 Y 1054 X(possible)s 1423 X(\(in)s 1575 X(an)s 1710 X(unreliable)s 2150 X(manner\))s 2523 X(to)s 2642 X(use)s 2816 X(HTTP)s 3107 X(extensions)s 3570 X(and)s 3754 X(request)s 4082 X(pro\256les)s 4422 X(as)s 4545 X(a)s 4629 X(means)s 4924 X(of)s 5047 X(tracking)s 694 X 4032 Y 1054 X(individual)s 1504 X(client)s 1770 X(programs.)s 2241 X(Such)s 2485 X(tracking)s 2856 X(requires)s 3221 X(extensive)s 3641 X(resources)s 4060 X(\(memory)s 4469 X(and)s 4656 X(diskspace\))s 5120 X(and)s 5307 X(is)s 694 X 4152 Y 1054 X(often)s 1284 X(considered)s 1741 X(a)s 1810 X(violation)s 2191 X(of)s 2299 X(privacy.)s 694 X 4320 Y 1054 X(With)s 1287 X(the)s 1442 X(exception)s 1863 X(of)s 1979 X(the)s 2133 X(ident)s 2365 X(section,)s 2705 X 0.0 10 10 f.B ft(wwwstat)s 3108 X 0.0 10 10 f.R ft(does)s 3323 X(not)s 3483 X(reveal)s 3758 X(information)s 4262 X(about)s 4516 X(the)s 4670 X(individual)s 5108 X(people)s 694 X 4440 Y 1054 X(making)s 1384 X(requests.)s 1791 X(Unless)s 2093 X(the)s 2245 X(output)s 2531 X(is)s 2628 X(limited)s 2942 X(to)s 3050 X(a)s 3124 X(speci\256c)s 3459 X(URL)s 3689 X(or)s 3802 X(a)s 3875 X(speci\256c)s 4209 X(hostname,)s 4646 X 0.0 10 10 f.B ft(wwwstat)s 0.0 10 10 f.R ft('s)s 5118 X(output)s 694 X 4560 Y 1054 X(does)s 1262 X(not)s 1415 X(connect)s 1750 X(the)s 1897 X(requester)s 2287 X(to)s 2390 X(the)s 2537 X(URL)s 2762 X(being)s 3009 X(requested.)s 694 X 4728 Y 874 X 0.0 9 9 f.B ft(Common)s 1252 X 0.0 9 9 f.S2 ft(O)s 0.0 9 9 f.B ft(Log\256le)s 1555 X 0.0 9 9 f.S2 ft(O)s 0.0 9 9 f.B ft(Format)s 1883 X 0.0 9 9 f.S2 ft(O)s 1921 X(O)s 1959 X(O)s 694 X 4848 Y 1054 X 0.0 10 10 f.R ft(The)s 1235 X(httpd)s 1467 X(common)s 1843 X(log\256le)s 2125 X(format)s 2417 X(\(CLF\))s 2692 X(was)s 2872 X(de\256ned)s 3191 X(in)s 3294 X(early)s 3518 X(1994)s 3743 X(as)s 3851 X(the)s 3998 X(result)s 4245 X(of)s 4353 X(discussions)s 4834 X(among)s 5131 X(server)s 694 X 4968 Y 1054 X(and)s 1252 X(access_log)s 1738 X(analyzer)s 2129 X(developers)s 2615 X(\(Roy)s 2869 X(Fielding,)s 3282 X(John)s 3525 X(Franks,)s 3876 X(Kevin)s 4174 X(Hughes,)s 4558 X(Ari)s 4745 X(Luotonen,)s 5207 X(Rob)s 694 X 5088 Y 1054 X(McCool,)s 1437 X(and)s 1611 X(Tony)s 1852 X(Sanders\))s 2231 X(on)s 2361 X(how)s 2563 X(to)s 2671 X(make)s 2917 X(it)s 3003 X(easier)s 3264 X(for)s 3409 X(analysis)s 3760 X(tools)s 3984 X(to)s 4091 X(be)s 4214 X(used)s 4426 X(across)s 4704 X(multiple)s 5067 X(servers.)s 694 X 5208 Y 1054 X(The)s 1234 X(format)s 1525 X(is:)s 694 X 5376 Y 1054 X(remote_host)s 1573 X(ident)s 1798 X(authuser)s 2161 X([date-time)s 2596 X(zone])s 2842 X("Request-Line")s 3487 X(Status-Code)s 4001 X(bytes)s 694 X 5544 Y 1054 X(where)s 1804 X(means)s 694 X 5664 Y 1054 X(------------)s 1804 X(--------------------------------------)s 694 X 5784 Y 1054 X(remote_host)s 1804 X(Client)s 2074 X(DNS)s 2299 X(hostname)s 2707 X(or)s 2815 X(IP)s 2929 X(address)s 694 X 5904 Y 1054 X(ident)s 1804 X(Identity)s 2140 X(check)s 2397 X(token)s 2644 X(or)s 2752 X("\261")s 694 X 6024 Y 1054 X(authuser)s 1804 X(Authorization)s 2384 X(user-id)s 2686 X(or)s 2794 X("\261")s 694 X 6144 Y 1054 X(date-time)s 1804 X(dd/Mmm/yyyy:hh:mm:ss)s 694 X 6264 Y 1054 X(zone)s 1804 X(+dddd)s 2085 X(or)s 2193 X(\261dddd)s 694 X 6384 Y 1054 X(Request-Line)s 1804 X(The)s 2005 X(\256rst)s 2207 X(line)s 2402 X(of)s 2530 X(the)s 2697 X(HTTP)s 2992 X(request,)s 3350 X(which)s 3639 X(normally)s 4045 X(includes)s 4423 X(the)s 4590 X(method,)s 4960 X(URL,)s 5230 X(and)s 694 X 6504 Y 1804 X(HTTP-version.)s 694 X 6624 Y 1054 X(Status-Code)s 1804 X(Response)s 2212 X(status)s 2465 X(from)s 2684 X(server)s 2952 X(or)s 3060 X("\261")s 694 X 6744 Y 1054 X(bytes)s 1804 X(Size)s 2001 X(of)s 2109 X(Entity-Body)s 2629 X(transmitted)s 3104 X(or)s 3212 X("\261")s 694 X 6864 Y 1054 X(------------)s 1804 X(--------------------------------------)s 694 X 7032 Y 1054 X(with)s 1267 X(each)s 1484 X(\256eld)s 1697 X(separated)s 2108 X(by)s 2243 X(a)s 2322 X(single)s 2596 X(space)s 2852 X(\(it)s 2976 X(turns)s 3211 X(out)s 3374 X(that)s 3559 X(problems)s 3966 X(occur)s 4222 X(if)s 4317 X(the)s 4473 X(ident)s 4707 X(token)s 4963 X(contains)s 5330 X(a)s 694 X 7152 Y 1054 X(space,)s 1325 X(which)s 1594 X(was)s 1774 X(not)s 1927 X(anticipated)s 2390 X(by)s 2515 X(the)s 2662 X(original)s 2998 X(designers\).)s 694 X 7680 Y(Sun Release 4.1)s 2382 X(Last change: 03 November 1996)s 5324 X(8)s 7920 Y page 0.0 10 10 f.R ft %%Page: 9 9 694 X 480 Y(wwwstat)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\()s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(1)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\))s 2586 X(USER COMMANDS )s 4852 X(wwwstat)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\()s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(1)s 0.0 10 10 f.S2 ft(O)s 0.0 10 10 f.R ft(\))s 694 X 960 Y 0.0 9 9 f.B ft(LIMITATIONS)s 1337 X 0.0 9 9 f.S2 ft(O)s 1375 X(O)s 1413 X(O)s 1451 X(O)s 1489 X(O)s 694 X 1080 Y 1054 X 0.0 10 10 f.B ft(wwwstat)s 1450 X 0.0 10 10 f.R ft(cannot)s 1741 X(be)s 1860 X(more)s 2090 X(accurate)s 2446 X(than)s 2643 X(its)s 2763 X(input.)s 694 X 1248 Y 1054 X(The)s 1239 X(common)s 1619 X(log\256le)s 1905 X(format)s 2201 X(does)s 2414 X(not)s 2572 X(include)s 2896 X(the)s 3048 X(amount)s 3378 X(of)s 3491 X(bytes)s 3732 X(transferred)s 4193 X(in)s 4301 X(HTTP)s 4581 X(header)s 4876 X(\256elds)s 5123 X(and)s 5296 X(in)s 694 X 1368 Y 1054 X(error)s 1291 X(responses.)s 1773 X 0.0 10 10 f.B ft(wwwstat)s 2188 X 0.0 10 10 f.R ft(attempts)s 2571 X(to)s 2693 X(estimate)s 3070 X(those)s 3325 X(bytes)s 3580 X(based)s 3850 X(on)s 3993 X(the)s 4158 X(response)s 4550 X(code.)s 4831 X(Although)s 5252 X(the)s 694 X 1488 Y 1054 X(built-in)s 1381 X(estimates)s 1785 X(will)s 1973 X(su)s /Cff { (f) show xsiz pt 20 div neg 0 rmoveto (f) s } def Cff(ice)s 2271 X(for)s 2419 X(most)s 2646 X(applications,)s 3186 X(your)s 3401 X(results)s 3694 X(will)s 3882 X(be)s 4007 X(more)s 4243 X(accurate)s 4605 X(if)s 4697 X(the)s 4850 X(estimates)s 5253 X(are)s 694 X 1608 Y 1054 X(customized)s 1534 X(for)s 1675 X(the)s 1822 X(particular)s 2229 X(server)s 2497 X(software)s 2865 X(that)s 3040 X(generated)s 3452 X(the)s 3599 X(log\256le.)s 694 X 1776 Y 1054 X(Modern)s 1406 X(httpd)s 1648 X(servers)s 1966 X(have)s 2190 X(extended)s 2586 X(the)s 2744 X(CLF)s 2964 X(to)s 3078 X(include)s 3408 X(additional)s 3844 X(\256elds)s 4097 X(\(Referer)s 4464 X(and)s 4644 X(User-Agent\))s 5178 X(or)s 5296 X(to)s 694 X 1896 Y 1054 X(make)s 1300 X(the)s 1452 X(entire)s 1709 X(format)s 2005 X(con\256gurable.)s 2583 X(Although)s 2990 X 0.0 10 10 f.B ft(wwwstat)s 3390 X 0.0 10 10 f.R ft(is)s 3486 X(able)s 3681 X(to)s 3788 X(read)s 3988 X(log\256les)s 4312 X(which)s 4585 X(append)s 4902 X(information)s 694 X 2016 Y 1054 X(to)s 1160 X(the)s 1310 X(CLF,)s 1547 X(it)s 1631 X(will)s 1815 X(not)s 1971 X(make)s 2215 X(use)s 2376 X(of)s 2487 X(that)s 2665 X(additional)s 3093 X(information.)s 3643 X(However,)s 4061 X 0.0 10 10 f.B ft(wwwstat)s 4460 X 0.0 10 10 f.R ft(is)s 4555 X(written)s 4866 X(in)s 4972 X 0.0 10 10 f.B ft(perl)s 0.0 10 10 f.R ft(,)s 5197 X(so)s 5313 X(if)s 694 X 2136 Y 1054 X(you)s 1229 X(want)s 1448 X(to)s 1551 X(parse)s 1786 X(a)s 1855 X(di)s Cff(erent)s 2218 X(format)s 2509 X(all)s 2634 X(you)s 2809 X(have)s 3022 X(to)s 3125 X(do)s 3250 X(is)s 3342 X(change)s 3649 X(the)s 3796 X(parsing)s 4115 X(code.)s 694 X 2304 Y 1054 X 0.0 10 10 f.B ft(wwwstat)s 1474 X 0.0 10 10 f.R ft(does)s 1706 X(not)s 1883 X(do)s 2032 X(anything)s 2431 X(with)s 2658 X(Referer)s 3005 X([sic])s 3231 X(or)s 3363 X(User-Agent)s 3877 X(information)s 4398 X(that)s 4597 X(may)s 4818 X(be)s 4960 X(present)s 5296 X(in)s 694 X 2424 Y 1054 X(extended)s 1455 X(log\256les.)s 1841 X(In)s 1965 X(order)s 2216 X(to)s 2335 X(do)s 2475 X(anything)s 2865 X(interesting)s 3327 X(with)s 3545 X(Referer,)s 3908 X(the)s 4070 X(program)s 4448 X(would)s 4738 X(have)s 4966 X(to)s 5084 X(build)s 5330 X(a)s 694 X 2544 Y 1054 X(Request-URI)s 1607 X(x)s 1683 X(Referer)s 2007 X(x)s 2083 X(Count)s 2354 X(table,)s 2599 X(which)s 2869 X(would)s 3145 X(require)s 3453 X(huge)s 3673 X(gobs)s 3888 X(of)s 3997 X(memory)s 4356 X(and)s 4525 X(is)s 4617 X(better)s 4869 X(done)s 5088 X(using)s 5330 X(a)s 694 X 2664 Y 1054 X(separate)s 1405 X(program)s 1768 X(with)s 1971 X(a)s 2040 X(persistent)s 2448 X(database.)s 2866 X(Naturally,)s 3293 X(this)s 3463 X(is)s 3555 X(easy)s 3757 X(to)s 3860 X(do)s 3985 X(once)s 4198 X(you)s 4373 X(learn)s 4597 X 0.0 10 10 f.B ft(perl)s 0.0 10 10 f.R ft(.)s 694 X 2832 Y 0.0 9 9 f.B ft(AUTHOR)s 1112 X 0.0 9 9 f.S2 ft(O)s 1150 X(O)s 1188 X(O)s 1226 X(O)s 1264 X(O)s 694 X 2952 Y 1054 X 0.0 10 10 f.R ft(Roy)s 1268 X(Fielding)s 1648 X(\(\256elding@ics.uci.edu\),)s 2610 X(University)s 3078 X(of)s 3207 X(California,)s 3683 X(Irvine.)s 4017 X(Please)s 4318 X(do)s 4464 X(not)s 4638 X(send)s 4867 X(questions)s 5291 X(or)s 694 X 3072 Y 1054 X(requests)s 1409 X(to)s 1514 X(the)s 1663 X(author,)s 1970 X(since)s 2202 X(the)s 2351 X(number)s 2683 X(of)s 2793 X(requests)s 3147 X(has)s 3307 X(long)s 3512 X(since)s 3744 X(overwhelmed)s 4314 X(his)s 4458 X(ability)s 4741 X(to)s 4846 X(reply,)s 5103 X(and)s 5274 X(all)s 694 X 3192 Y 1054 X(future)s 1317 X(support)s 1642 X(will)s 1823 X(be)s 1942 X(through)s 2278 X(the)s 2425 X(mailing)s 2756 X(list)s 2904 X(\(see)s 3089 X(above\).)s 694 X 3360 Y 1054 X 0.0 10 10 f.B ft(wwwstat)s 1452 X 0.0 10 10 f.R ft(was)s 1634 X(originally)s 2050 X(based)s 2303 X(on)s 2429 X(a)s 2499 X(multi-server)s 3013 X(statistics)s 3384 X(program)s 3748 X(called)s 4012 X 0.0 10 10 f.B ft(fwgstat-0.035)s 4606 X 0.0 10 10 f.R ft(by)s 4732 X(Jonathan)s 5113 X(Magid)s 694 X 3480 Y 1054 X(\(jem@sunsite.unc.edu\))s 2006 X(which,)s 2303 X(in)s 2409 X(turn,)s 2623 X(was)s 2806 X(heavily)s 3128 X(based)s 3383 X(on)s 3511 X 0.0 10 10 f.B ft(xferstats)s 3904 X 0.0 10 10 f.R ft(\(packaged)s 4340 X(with)s 4545 X(the)s 4694 X(version)s 5015 X(17)s 5142 X(of)s 5252 X(the)s 694 X 3600 Y 1054 X(Wuarchive)s 1516 X(FTP)s 1714 X(daemon\))s 2088 X(by)s 2213 X(Chris)s 2455 X(Myers)s 2735 X(\(chris@wugate.wustl.edu\).)s 694 X 3768 Y 1054 X(This)s 1271 X(work)s 1515 X(has)s 1687 X(been)s 1914 X(sponsored)s 2358 X(in)s 2474 X(part)s 2667 X(by)s 2805 X(the)s 2965 X(Defense)s 3329 X(Advanced)s 3771 X(Research)s 4174 X(Projects)s 4534 X(Agency)s 4882 X(under)s 5147 X(Grant)s 694 X 3888 Y 1054 X(Numbers)s 1473 X(MDA972-91-J-1010)s 2346 X(and)s 2542 X(F30602-94-C-0218.)s 3416 X(This)s 3646 X(software)s 4041 X(does)s 4276 X(not)s 4456 X(necessarily)s 4951 X(re\257ect)s 5252 X(the)s 694 X 4008 Y 1054 X(position)s 1402 X(or)s 1510 X(policy)s 1785 X(of)s 1893 X(the)s 2040 X(U.S.)s 2243 X(Government)s 2767 X(and)s 2936 X(no)s 3061 X(o)s Cff(icial)s 3369 X(endorsement)s 3904 X(should)s 4196 X(be)s 4315 X(inferred.)s 694 X 7680 Y(Sun Release 4.1)s 2382 X(Last change: 03 November 1996)s 5324 X(9)s 7920 Y page 0.0 10 10 f.R ft %%Trailer %%DocumentFonts: count { pop } repeat % a little cleanup is necessary vmstat restore cgi-bin/stats/wwwstat-2.0/wwwstat0002640000372000001540000021202307005603742016652 0ustar affweblibuuid#!/usr/local/bin/perl # ========================================================================== $Version = 'wwwstat-2.0'; # # Copyright (c) 1994, 1996 Regents of the University of California. # # This software has been developed by Roy Fielding as # part of the WebSoft project at the University of California, Irvine. # # See the file LICENSE for licensing and redistribution information. # See the file INSTALL for installation information. # See the file Changes for known problems and version information. # See the file README for more information. # See the wwwstat.1 man page for options and usage information. # sub usage { die <<"EndUsage"; usage: $Pname [-F system_config] [-f user_config] [-helLoOuUrRvx] [-a IP_address] [-c code] [-d date] [-t hour] [-n archive_name] [-A IP_address] [-C code] [-D date] [-T hour] [-N archive_name] [-m method] [-M method] [-H heading_title] [-X lastsummary] [-noescape] [-trunc N] [-files] [-nofiles] [-link] [-nolink] [-cgi] [-nocgi] [-dns] [-nodns] [-cache filename] [-daily] [-hourly] [-domain] [-subdomain] [-archive] [-ident] [-all] [-sort (key|byte|req)] [-top N] [-both] [-no (daily|hourly|domain|subdomain|archive|ident|all)] [--] [ logfile | summary | + | - ]... $Version Process a sequence of httpd Common Logfile Format access_log files and/or prior wwwstat output summary files (compressed if extension $Zhandle) and output an HTML summary of all the input. Configuration options: -F Get system configuration defaults from the given file. -f Get user configuration defaults from the given file. -- Last option (all later arguments are treated as filenames). Diagnostic Options: -h Help -- just display this message to STDERR and quit. -v Verbose display to STDERR of each log entry processed. -x Display to STDERR all requests of nonexistant URLs. -e Display to STDERR all invalid log entries. Display Options: -H Use the following string as the heading and title for output. -X Use the following string as the URL for last summary link. -R Display daily stats sorted in reverse. -l Do display full IP address of clients in my domain. -L Don't (i.e. strip the machine name from local addresses). -o Do display full IP address of clients from other domains. -O Don't (i.e. strip the machine name from non-local addresses). -u Do display IP address from unresolved domain names. -U Don't (i.e. group all "unresolved" addresses under that name). -dns Use DNS to lookup unresolved IP addresses (may be slow). -nodns Do not lookup unresolved IP addresses. -cache Use the given dbm file to read/write DNS cache. -trunc Truncate archive URL after Nth hierarchy level. -files Show filename in archive URL. -nofiles Truncate filename (if any) from archive URL. -link Add a hypertext link around each archive URL. -nolink Do not add a hypertext link around each archive URL. -cgi Check HTTP method and output like a CGI script. -nocgi Do not produce CGI output. Section Options,
    =(all|daily|hourly|domain|subdomain|archive|ident): -no
    Exclude the given section from the output. -
    Include the given section and set scope for -sort and -top. -sort (key|byte|req) Sort this section by key, bytes, or requests. -top N Include only the top N entries for this section. -both Do the top N as sorted and then do full by key. Search Options (include in summary only those log entries ...): -a Containing a hostname/IP address matching the given perl regexp. -A Not containing " " " " " " " " -c Containing a server response code matching the given perl regexp. -C Not containing " " " " " " " " -d Containing a date ("Feb 2 1994") matching the given perl regexp. -D Not containing " " " " " " " " -t Containing an hour ("00" -- "23") matching the given perl regexp. -T Not containing " " " " " " " " -n Containing an archive (URL) name matching perl regexp (except +.). -N Not containing " " " " " " " " -m Using an HTTP method name matching the given perl regexp. -M Not using the HTTP method " " " " "" -noescape Do not escape "." and "+" in remaining search options. Filenames (none implies "+"): - Read standard input (STDIN). + Read the default logfile $DefaultLog. ... Anything else is treated as the name of a file to be read, with the first line indicating whether it is a logfile or a summary. EndUsage } # ========================================================================== # The main program is really quite simple ... $Pname = $0; if ($Pname =~ s#^(.*)/##) { push(@INC, $1); } # Modify include path for bin, # current dir, and home dir unshift(@INC, '.', ($ENV{'HOME'} || $ENV{'LOGDIR'})); $StartTime = time; # Get the current date-time stamp $Updated = &wtime($StartTime,''); # Format it as local time $UpdatedGMT = &wtime($StartTime,'GMT'); # and also as GMT time &init_defaults; # Set the default configuration &get_configuration; # Get system and user configuration &get_commandline; # Get command-line options &init_summary; # Initialize the accumulaters &output_cgi if $Do_CGI; # Output CGI headers (if desired) &init_DNS if $LookupDNS; # Initialize the DNS cache if ($Verbose) { print STDERR "$Version: $Updated\n"; } if ($ARGV[0]) # Check for explicit filenames { foreach $filename (@ARGV) { &process_file($filename); } } else # if none, just read the default { &process_file($DefaultLog); } if ($Verbose) { print STDERR "Done processing files, now doing summary\n"; } &output_summary; # Give us the dirty details &close_DNS if $LookupDNS; # Close the DNS cache exit(0); # and we are finished. # ========================================================================== # ========================================================================== # Initialize default configuration options. NOTE that all of these options # can be overridden in either the system or user configuration files and # many can be overridden on the command-line. # sub init_defaults { @ArchiveMap = (); require "domains.pl"; # Get the domain mapping (%DomainMap) # Specify the URL of the previous summary period (for use only as a # hypertext link). Set it = "" if link is unwanted. # The three-letter abbrev for last month is substituted at any "%M". # The four-number year of last month is substituted at any "%Y". # Note that this is the month prior to the earliest one in this summary. $LastSummary = "stats-%Y/%M.wwwstats.html.gz"; # Specify the perl regex pattern for directory index files. This will be # dependent on the server's DirectoryIndex config (usually in srm.conf). # 'index.html?' # matches "index.html" and "index.htm" # 'index(.(html?|cgi))?' # matches "index", "index.html", "index.htm", and "index.cgi" # '(([Oo]verview)|(index)).html?' # matches "Overview.html", "Overview.htm", "index.html", "index.htm", # "overview.html", and "overview.htm" $DirectoryIndex = 'index(.(html?|cgi))?'; # Specify the default location of your access log $DefaultLog = '/com/deltaland.net/logs/access_log'; # Specify the command for displaying compressed files to STDOUT $Zcat = 'gunzip -c'; # specify as null string if none are available $Zhandle = '(gz|Z|z)'; # list file extensions that indicate compressed # If address in log entry is one word (a local host), append what? # Specify an appropriate '.sub.dom.ain' $AppendToLocalhost = 'deltaland.net'; # Specify whether (1) or not (0) you want to display the IP address # on reversed subdomain listings as follows: $LocalFullAddress = 0; # Show full address for local hosts? $OthersFullAddress = 0; # Show full address for non-local hosts? $ShowUnresolved = 0; # Show all unresolved addresses? # Specify whether (1) or not (0) you want to insert a hypertext # anchor for each URL in the archive section (-link option). $InsertLink = 0; # Specify whether (1) or not (0) you want to add CGI output headers # before the HTML summary. $Do_CGI = 1; # Specify whether (1) or not (0) you want the Archive URL to be # truncated (this saves output space and runtime memory, but loses info). $TruncateLevel = 0; # Truncate after Nth hierarchy level $TruncateFile = 0; # Truncate any trailing filename # Specify whether (1) or not (0) you want to lookup unresolved # IP addresses via DNS. Note that this could be *very* slow! $LookupDNS = 0; $DNScachefile = 'dnscache'; # DBM files for persistent cache $DNSexpires = 5356800; # Cache for two months (in seconds) # The following lines define the visible header fields for HTML output. # They may be changed/nationalized, but changing some may affect the # parsing algorithm for reading old summary files. Test all changes! $OutputTitle = 'World Wide Web Access Statistics for www.' . $AppendToLocalhost; $UpdateHeader = 'Last updated: '; $LastSumHeader = 'Previous Full Summary Period'; $TotalsHeader = 'Totals for Summary Period: '; $ReqRcvHeader = 'Requests Received During Summary Period '; $BtransHeader = 'Bytes Transmitted During Summary Period '; $AvgReqHeader = 'Average Requests Received Daily '; $AvgByteHeader = 'Average Bytes Transmitted Daily '; $TotalsFormat = "%s %14.0f\n"; $StatsHeader = '%Reqs %Byte Bytes Sent Requests '; $StatsRule = '----- ----- ------------ -------- |'; $StatsFormat = '%s %s %12.0f %8d |'; $PrefixTop = 'Top'; $PrefixTotal = 'Total'; $DailyHeader = 'Transfers by Request Date'; $HourlyHeader = 'Transfers by Request Hour'; $DomainHeader = 'Transfers by Client Domain'; $SubdomainHeader = 'Transfers by Reversed Subdomain'; $ArchiveHeader = 'Transfers by URL/Archive Section'; $IdentHeader = 'Transfers by Remote Identity'; # These Old headers are for reading old summary files $OldDailyHeader = 'Daily Transmission Statistics'; $OldHourlyHeader = 'Hourly Transmission Statistics'; $OldDomainHeader = 'Total Transfers by Client Domain'; $OldSubdomainHeader = 'Total Transfers by Reversed Subdomain'; $OldArchiveHeader = 'Total Transfers from each Archive Section'; $OldIdentHeader = 'Total Transfers to each Remote Identifier'; # The following sets the default ordering for the daily stats. # Change this to 1 if you always want gwstat-style output. $ReverseDateSort = 0; # Display daily stats in reverse order. # The following sets the default sort key for each section, # where 0 means sort by the primary key value (day, hour, domain, ...) # 1 means sort by the number of requests # 2 means sort by the number of bytes transferred $SortDaily = 0; $SortHourly = 0; $SortDomain = 0; $SortSubdomain = 0; $SortArchive = 0; $SortIdent = 0; # If the output of a section is sorted, you may also want to restrict # the output to only the N best in that section. $TopDaily = 0; $TopHourly = 0; $TopDomain = 0; $TopSubdomain = 0; $TopArchive = 0; $TopIdent = 0; # On the other hand, you may want to exclude (0) an entire section. # If set = 2, the top N is done first and then followed by normal section. $Do_Daily = 1; # Display the Daily Statistics $Do_Hourly = 1; # Display the Hourly Statistics $Do_Domain = 1; # Display the Domain (Country) Statistics $Do_Subdomain = 1; # Display the Subdomain Statistics $Do_Archive = 1; # Display the Archive Statistics # The following option is only useful if the server is running with # rfc931/ident support (i.e. "IdentityCheck on" appears in httpd.conf) # or for resources which require user authentication. # NOTE: For security reasons, you should not publish to the web any report # that lists the Remote Identities. This option is intended for server # maintenance only. Use the -r or -ident command-line option instead. $Do_Ident = 0; # Set 1 or 2 ONLY if Ident is ALWAYS desired. # The rest of these options are normally only changed on the command-line $Verbose = 0; # Display valid log entries on STDERR? $PrintInvalids = 0; # Display invalid log entries on STDERR? $PrintNonexist = 0; # Display nonexistant file requests on STDERR? $SearchAddress = ''; # Pattern to look for in hostname/IP addresses. $SearchCode = ''; # Pattern to look for in Code. $SearchDate = ''; # Pattern to look for in Date. $SearchTime = ''; # Pattern to look for in Hour. $SearchArchive = ''; # Pattern to look for in Archive names. $SearchMethod = ''; # Pattern to look for in Method. $NotAddress = ''; # Pattern to reject entry if in IP addresses. $NotCode = ''; # Pattern to reject entry if in Code. $NotDate = ''; # Pattern to reject entry if in Date. $NotTime = ''; # Pattern to reject entry if in Hour. $NotArchive = ''; # Pattern to reject entry if in Archive names. $NotMethod = ''; # Pattern to reject entry if in Method. $EscapeSpecials = '[+.]'; # Most users forget about regexp syntax # The default system and user configuration filenames should only # be changed if your filesystem can't handle these names. $SconfigFile = 'wwwstat.rc'; # System file for overriding defaults $UconfigFile = '.wwwstatrc'; # User file for overriding defaults } # ========================================================================== # Get the system configuration and user configuration # sub get_configuration { local($forced) = 0; if (defined($ARGV[0]) && ($ARGV[0] eq '-F')) { shift @ARGV; $SconfigFile = shift @ARGV; $forced = 1; } if ($SconfigFile) { eval 'require $SconfigFile;'; if ($@ && $forced) { die "Unable to read $SconfigFile: $!\n"; } else { $! = 0; undef $@; } } if (defined($ARGV[0]) && ($ARGV[0] eq '-f')) { shift @ARGV; $UconfigFile = shift @ARGV; $forced = 1; } else { $forced = 0; } if ($UconfigFile) { eval 'require $UconfigFile;'; if ($@ && $forced) { die "Unable to read $UconfigFile: $!\n"; } else { $! = 0; undef $@; } } } # ========================================================================== # Get the command-line options. # sub get_commandline { local($_, $first, $rest, $pos); local($scope) = 0; local($letteropts) = 'helLoOuUrRvxis:H:X:f:F:m:M:c:C:t:T:a:A:n:N:d:D:'; local(@args) = split(//, $letteropts); while (defined($_ = $ARGV[0])) { if ($_ eq '--') { shift @ARGV; last; } # Last option indicator if ($_ eq '-') { last; } # STDIN file indicator if (!s/^-//) { last; } # Not an option if (/^no(.*)/) # Exclude some option { # indicated by suffix unless ($_ = $1) { # or next argument shift @ARGV; &badarg('-no requires value') unless ($_ = $ARGV[0]); } if (/^escape$/) { $EscapeSpecials = ''; } elsif (/^link$/) { $InsertLink = 0; } elsif (/^files$/) { $TruncateFile = 1; } elsif (/^dns$/) { $LookupDNS = 0; } elsif (/^cgi$/) { $Do_CGI = 1; } elsif (/^da(y|aily|ate)$/) { $Do_Daily = 0; } elsif (/^hour(ly)?$/) { $Do_Hourly = 0; } elsif (/^dom(ain)?$/) { $Do_Domain = 0; } elsif (/^sub(domain)?$/) { $Do_Subdomain = 0; } elsif (/^arc(hive)?$/) { $Do_Archive = 0; } elsif (/^id(ent)?$/) { $Do_Ident = 0; } elsif (/^all$/) { $Do_Daily = $Do_Hourly = $Do_Domain = $Do_Subdomain = $Do_Archive = $Do_Ident = 0; } else { &badarg('-no',$_); } } elsif (/^all$/) # Scope determines what sections are active { # and how to apply the -top and -sort options $scope = 0; $Do_Daily = $Do_Hourly = $Do_Domain = $Do_Subdomain = $Do_Archive = $Do_Ident = 1; } elsif (/^da(y|aily|ate)$/) { $scope = 1; $Do_Daily = 1; } elsif (/^hour(ly)?$/) { $scope = 2; $Do_Hourly = 1; } elsif (/^dom(ain)?$/) { $scope = 3; $Do_Domain = 1; } elsif (/^sub(domain)?$/) { $scope = 4; $Do_Subdomain = 1; } elsif (/^arc(hive)?$/) { $scope = 5; $Do_Archive = 1; } elsif (/^id(ent)?$/) { $scope = 6; $Do_Ident = 1; } elsif (/^link$/) { $InsertLink = 1; # Add anchors to archive } elsif (/^files$/) # Show filename in URL { $TruncateFile = 0; } elsif (/^trunc(.*)/) # Truncate Archive URL { # after Nth level unless ($_ = $1) { shift @ARGV; &badarg('-trunc requires value') unless ($_ = $ARGV[0]); } &badarg('-trunc', $_) unless (/^\d+$/); $TruncateLevel = $_; } elsif (/^cgi$/) # Output CGI headers { $Do_CGI = 1; } elsif (/^dns$/) # Resolve IP addresses { $LookupDNS = 1; } elsif (/^cache(.*)/) # Change cache filename { unless ($_ = $1) { shift @ARGV; &badarg('-cache requires value') unless ($_ = $ARGV[0]); } $DNScachefile = $_; } elsif (/^top(.*)/) # Limit to top N { unless ($_ = $1) { shift @ARGV; &badarg('-top requires value') unless ($_ = $ARGV[0]); } &badarg('-top', $_) unless (/^\d+$/); if ($scope == 1) { $TopDaily = $_; } elsif ($scope == 2) { $TopHourly = $_; } elsif ($scope == 3) { $TopDomain = $_; } elsif ($scope == 4) { $TopSubdomain = $_; } elsif ($scope == 5) { $TopArchive = $_; } elsif ($scope == 6) { $TopIdent = $_; } else { $TopDaily = $TopHourly = $TopDomain = $TopSubdomain = $TopArchive = $TopIdent = $_; } } elsif (/^sort(.*)/) # Change sort method { unless ($_ = $1) { shift @ARGV; &badarg('-sort requires value') unless ($_ = $ARGV[0]); } if (/^key/) { $sortkey = 0; } # Sort by primary key elsif (/^req/) { $sortkey = 1; } # Sort by requests rcvd elsif (/^byt/) { $sortkey = 2; } # Sort by bytes transmitted else { &badarg('-sort',$_); } if ($scope == 1) { $SortDaily = $sortkey; } elsif ($scope == 2) { $SortHourly = $sortkey; } elsif ($scope == 3) { $SortDomain = $sortkey; } elsif ($scope == 4) { $SortSubdomain = $sortkey; } elsif ($scope == 5) { $SortArchive = $sortkey; } elsif ($scope == 6) { $SortIdent = $sortkey; } else { $SortDaily = $SortHourly = $SortDomain = $SortSubdomain = $SortArchive = $SortIdent = $sortkey; } } elsif (/^both$/) # Do both top N and normal { if ($scope == 1) { $Do_Daily = 2; if (!$TopDaily) { $TopDaily = 10; } if (!$SortDaily) { $SortDaily = 1; } } elsif ($scope == 2) { $Do_Hourly = 2; if (!$TopHourly) { $TopHourly = 10; } if (!$SortHourly) { $SortHourly = 1; } } elsif ($scope == 3) { $Do_Domain = 2; if (!$TopDomain) { $TopDomain = 10; } if (!$SortDomain) { $SortDomain = 1; } } elsif ($scope == 4) { $Do_Subdomain = 2; if (!$TopSubdomain) { $TopSubdomain = 10; } if (!$SortSubdomain) { $SortSubdomain = 1; } } elsif ($scope == 5) { $Do_Archive = 2; if (!$TopArchive) { $TopArchive = 10; } if (!$SortArchive) { $SortArchive = 1; } } elsif ($scope == 6) { $Do_Ident = 2; if (!$TopIdent) { $TopIdent = 10; } if (!$SortIdent) { $SortIdent = 1; } } else { $Do_Daily = $Do_Hourly = $Do_Domain = $Do_Subdomain = $Do_Archive = $Do_Ident = 2; $TopDaily = $TopHourly = $TopDomain = $TopSubdomain = $TopArchive = $TopIdent = 10; $SortDaily = $SortHourly = $SortDomain = $SortSubdomain = $SortArchive = $SortIdent = 1; } } else # End of full-word option arguments { while() # Loop by each character { ($first,$rest) = /^(.)(.*)/; if (($pos = index($letteropts,$first)) < 0) { &badarg("Unknown option:",$first); } if ($args[$pos+1] eq ':') { shift(@ARGV); if ($rest eq '') { &badarg($first,"requires value") unless @ARGV; $rest = $ARGV[0]; } &set_option($first, $rest); last; } else { &set_option($first, 1); $_ = $rest; last unless $_; } } } } continue { shift @ARGV; } } # ========================================================================== # Set the single-letter command-line option given. Gee, this is fun. # sub set_option { local($opt, $value) = @_; if ($opt eq 'h') { &usage; } elsif ($opt eq 'e') { $PrintInvalids = 1; } elsif ($opt eq 'l') { $LocalFullAddress = 1; } elsif ($opt eq 'L') { $LocalFullAddress = 0; } elsif ($opt eq 'o') { $OthersFullAddress = 1; } elsif ($opt eq 'O') { $OthersFullAddress = 0; } elsif ($opt eq 'u') { $ShowUnresolved = 1; } elsif ($opt eq 'U') { $ShowUnresolved = 0; } elsif ($opt eq 'r') { $Do_Ident = 2; } elsif ($opt eq 'R') { $ReverseDateSort = 1; } elsif ($opt eq 'v') { $Verbose = 1; } elsif ($opt eq 'x') { $PrintNonexist = 1; } elsif ($opt eq 'X') { $LastSummary = $value; } elsif ($opt eq 'H') { $OutputTitle = $value; } elsif ($opt eq 'm') { if ($SearchMethod) { $SearchMethod = "($SearchMethod|$value)"; } else { $SearchMethod = $value; } } elsif ($opt eq 'M') { if ($NotMethod) { $NotMethod = "($NotMethod|$value)"; } else { $NotMethod = $value; } } elsif ($opt eq 'c') { if ($SearchCode) { $SearchCode = "($SearchCode|$value)"; } else { $SearchCode = $value; } } elsif ($opt eq 'C') { if ($NotCode) { $NotCode = "($NotCode|$value)"; } else { $NotCode = $value; } } elsif ($opt eq 't') { if ($SearchTime) { $SearchTime = "($SearchTime|$value)"; } else { $SearchTime = $value; } } elsif ($opt eq 'T') { if ($NotTime) { $NotTime = "($NotTime|$value)"; } else { $NotTime = $value; } } elsif ($opt eq 'a') { if ($EscapeSpecials) { $value =~ s/($EscapeSpecials)/\\$1/go; } if ($SearchAddress) { $SearchAddress = "($SearchAddress|$value)"; } else { $SearchAddress = $value; } } elsif ($opt eq 'A') { if ($EscapeSpecials) { $value =~ s/($EscapeSpecials)/\\$1/go; } if ($NotAddress) { $NotAddress = "($NotAddress|$value)"; } else { $NotAddress = $value; } } elsif ($opt eq 'n') { if ($EscapeSpecials) { $value =~ s/($EscapeSpecials)/\\$1/go; } if ($SearchArchive) { $SearchArchive = "($SearchArchive|$value)"; } else { $SearchArchive = $value; } } elsif ($opt eq 'N') { if ($EscapeSpecials) { $value =~ s/($EscapeSpecials)/\\$1/go; } if ($NotArchive) { $NotArchive = "($NotArchive|$value)"; } else { $NotArchive = $value; } } elsif ($opt eq 'd') { if ($value eq 'today') { $value = substr($Updated, 8, 4) . substr($Updated, 5, 3) . substr($Updated, 12, 4); $value =~ s/ 0(\d) / $1 /; } if ($SearchDate) { $SearchDate = "($SearchDate|$value)"; } else { $SearchDate = $value; } } elsif ($opt eq 'D') { if ($value eq 'today') { $value = substr($Updated, 8, 4) . substr($Updated, 5, 3) . substr($Updated, 12, 4); $value =~ s/ 0(\d) / $1 /; } if ($NotDate) { $NotDate = "($NotDate|$value)"; } else { $NotDate = $value; } } elsif ($opt eq 'F') { die "The -F option MUST be first option on command-line\n"; } elsif ($opt eq 'f') { die "The -f option MUST be first option after -F option (if any)\n"; } elsif ($opt eq 'i') { warn "Option -i is no longer needed, ignoring it.\n"; } elsif ($opt eq 's') { warn "Option -s is no longer used, ignoring it.\n"; } else { &badarg("Unknown option:", $opt); } } # ========================================================================== sub badarg { local($dreck) = join(' ', @_); warn "Bad command option: $dreck\n"; &usage; } # ========================================================================== # Initialize summary accumulaters and non-optional configuration. # These settings may be customized, but are unlikely to need changing. # sub init_summary { # Setup the table of response codes and (if not '') the name for archive %RespCodes = ( '100', 'Code 100 Continue', '101', 'Code 101 Switching Protocols', '200', '', # OK response '201', '', # Created response '202', '', # Accepted response '203', '', # Non-Authoritative response '204', '', # No Content response '205', '', # Reset Content response '206', '', # Partial Content response '300', 'Code 300 Multiple Choices', '301', 'Code 301 Moved Permanently', '302', 'Code 302 Moved Temporarily', '303', 'Code 303 See Other', '304', '', # Not Modified response '305', 'Code 305 Use Proxy', '400', 'Code 400 Bad Request', '401', 'Code 401 Unauthorized', '402', 'Code 402 Payment Required', '403', 'Code 403 Forbidden', '404', 'Code 404 Not Found', '405', 'Code 405 Method Not Allowed', '406', 'Code 406 Not Acceptable', '407', 'Code 407 Proxy Authentication Required', '408', 'Code 408 Request Time-out', '409', 'Code 409 Conflict', '410', 'Code 410 Gone', '411', 'Code 411 Length Required', '412', 'Code 412 Precondition Failed', '413', 'Code 413 Request Entity Too Large', '414', 'Code 414 Request-URI Too Large', '415', 'Code 415 Unsupported Media Type', '500', 'Code 500 Internal Server Error', '501', 'Code 501 Not Implemented', '502', 'Code 502 Bad Gateway', '503', 'Code 503 Service Unavailable', '504', 'Code 504 Gateway Time-out', '505', 'Code 505 HTTP Version Not Supported', ); # Estimate the size (in bytes) of typical responses not counted in logfile # For better accuracy, tailor to your particular site's server %RespEstimates = ( '100', 100, # Continue response (never happens) '101', 100, # Switching Protocols response (never happens) '200', 200, # OK response (headers only) '201', 200, # Created response (headers only) '202', 200, # Accepted response (headers only) '203', 200, # Non-Authoritative response (headers only) '204', 200, # No Content response (headers only) '205', 200, # Reset Content response (headers only) '206', 200, # Partial Content response (headers only) '300', 400, # Multiple choices message '301', 400, # Permanent redirect message '302', 400, # Temporary redirect message '303', 400, # See other URL redirect message '304', 100, # Not Modified response to a Conditional GET '305', 400, # Use Proxy redirect message '400', 300, # Bad Request response message '401', 300, # Unauthorized response message '402', 300, # Payment Required response message '403', 300, # Forbidden response message '404', 300, # Not Found message '405', 300, # Method Not Allowed message '406', 300, # Not Acceptable message '407', 300, # Proxy Authentication Required message '408', 300, # Request Time-out message '409', 300, # Conflict message '410', 300, # Gone message '411', 300, # Length Required message '412', 300, # Precondition Failed message '413', 300, # Request Entity Too Large message '414', 300, # Request-URI Too Large message '415', 300, # Unsupported Media Type message '500', 500, # Server Error response message '501', 500, # Not Implemented response message '502', 500, # Bad Gateway message '503', 500, # Service Unavailable message '504', 500, # Gateway Time-out message '505', 500, # HTTP Version Not Supported message ); $TotalRequests = 0; # total requests received %HourRequests = (); # per hour %DayRequests = (); # per day %ArchiveRequests = (); # per file %DomainRequests = (); # per domain %SubdomainRequests = (); # per subdomain %IdentRequests = (); # per ident $TotalBytes = 0; # total bytes sent %HourBytes = (); # per hour %DayBytes = (); # per day %ArchiveBytes = (); # per file %DomainBytes = (); # per domain %SubdomainBytes = (); # per subdomain %IdentBytes = (); # per ident $StartTag = "
    \n";     # Note that these vars are used by both
        $EndTag   = "
    \n"; # input and output of summaries. $TimeZone = ''; $AllMonths = 'JanFebMarAprMayJunJulAugSepOctNovDec'; } # ========================================================================== # process the given filename as FILE, based on the content of its first line. # sub output_cgi { local($method) = $ENV{'REQUEST_METHOD'}; local($crlf) = "\x0D\x0A"; $| = 1; # Unbuffer STDOUT if (!defined($method) || ($method eq 'GET') || ($method eq 'HEAD')) { print 'Content-Type: text/html', $crlf, $crlf; exit(0) if ($method eq 'HEAD'); } else { print 'Status: 405 Method Not Allowed', $crlf; print 'Allow: GET, HEAD', $crlf; print 'Content-Type: text/html', $crlf, $crlf; print '', $crlf; print '405 Method Not Allowed', $crlf; print '', $crlf; print '

    405 Method Not Allowed

    ', $crlf; print 'Only GET and HEAD are allowed for this URL', $crlf; print '', $crlf; exit(0); } } # ========================================================================== # process the given filename as FILE, based on the content of its first line. # sub process_file { local($filename) = @_; if ($Verbose) { print STDERR "Processing file \"$filename\"\n"; } if ($filename eq '+') { $filename = $DefaultLog; } if ($Zhandle && ($filename =~ /\.$Zhandle$/o)) { if (!$Zcat) { warn "No zcat decompression command has been defined\n"; return; } $filename = "$Zcat $filename |"; } if (!open(FILE,$filename)) { warn "Error opening $filename: $!\n"; return; } if ($_ = ) { if (/^/) { &process_summary; } else { &process_log($_); } } close(FILE); } # ========================================================================== # Process the summary FILE by reading in our own output, section by section. # We must assume that the old output file was created with the same options # and that its content is disjunct from all other input files. # NOTE that using search options with inclusion cannot work unless the # included file was also created with those search options. # NOTE that Top N sections are skipped, since they cannot accumulate. # sub process_summary { local($_, $date, $hour, $domain, $subdomain, $pathkey, $ident); # This code depends on the content of the output being similar # to the default distribution. If you change the output content, # you must also check to ensure this code still works. local($heading_tag) = '

    '; local($table_rule) = '-----'; # The first thing to do is read past the HEAD and crossreferences # until we get to the first preformatted section (the totals) do { return unless ($_ = ); } until ($_ eq $StartTag); # Next line should be "Files Transmitted ..." or "Requests Received ..." if (($_ = ) && (/\s(\d+)$/)) { return unless $1; $TotalRequests += $1; } else { warn "Invalid summary file, skipping"; return; } # Next line should be "Bytes Transmitted ..." if (($_ = ) && (/\s(\d+)$/)) { $TotalBytes += $1; } else { warn "Invalid summary file, skipping"; return; } # We don't care about the rest of the totals for (;;) # Loop through each section { do { return unless ($_ = ); } until (/^$heading_tag/o); next if (/>$PrefixTop /o); # Skip any Top N sections if (/$DailyHeader/o || /$OldDailyHeader/o) { do { return unless ($_ = ); } until (/^$table_rule/o); while (($_ = ) && ($_ ne $EndTag)) { if (/\s(\d+)\s+(\d+)\s+\|\s+(\S.*)/) { $date = $3; # the date after "|" $DayRequests{$date} += $2; # 1st number left of "|" $DayBytes{$date} += $1; # 2nd number left of "|" } else { warn "Invalid summary line"; } } } elsif (/$HourlyHeader/o || /$OldHourlyHeader/o) { next unless $Do_Hourly; do { return unless ($_ = ); } until (/^$table_rule/o); while (($_ = ) && ($_ ne $EndTag)) { if (/\s(\d+)\s+(\d+)\s+\|\s+(\S+)/) { $hour = $3; # the hour after "|" $HourRequests{$hour} += $2; # 1st number left of "|" $HourBytes{$hour} += $1; # 2nd number left of "|" } else { warn "Invalid summary line"; } } } elsif (/$DomainHeader/o || /$OldDomainHeader/o) { next unless $Do_Domain; do { return unless ($_ = ); } until (/^$table_rule/o); while (($_ = ) && ($_ ne $EndTag)) { if (/\s(\d+)\s+(\d+)\s+\|\s+(\S+)/) { $domain = $3; # the word after "|" $DomainRequests{$domain} += $2; # 1st number left of "|" $DomainBytes{$domain} += $1; # 2nd number left of "|" } else { warn "Invalid summary line"; } } } elsif (/$SubdomainHeader/o || /$OldSubdomainHeader/o) { next unless $Do_Subdomain; do { return unless ($_ = ); } until (/^$table_rule/o); while (($_ = ) && ($_ ne $EndTag)) { if (/\s(\d+)\s+(\d+)\s+\|\s+(\S.*)/) { $subdomain = $3; $SubdomainRequests{$subdomain} += $2; $SubdomainBytes{$subdomain} += $1; } else { warn "Invalid summary line"; } } } elsif (/$ArchiveHeader/o || /$OldArchiveHeader/o) { next unless $Do_Archive; do { return unless ($_ = ); } until (/^$table_rule/o); while (($_ = ) && ($_ ne $EndTag)) { if (/\s(\d+)\s+(\d+)\s+\|\s+(\S.*)/) { $pathkey = &striplink($3); # the pathkey after "|" $ArchiveRequests{$pathkey} += $2; # 1st number left of "|" $ArchiveBytes{$pathkey} += $1; # 2nd number left of "|" } else { warn "Invalid summary line"; } } } elsif (/$IdentHeader/o || /$OldIdentHeader/o) { next unless $Do_Ident; do { return unless ($_ = ); } until (/^$table_rule/o); while (($_ = ) && ($_ ne $EndTag)) { if (/\s(\d+)\s+(\d+)\s+\|\s+(\S.*)/) { $ident = $3; # the identity after "|" $IdentRequests{$ident} += $2; # 1st number left of "|" $IdentBytes{$ident} += $1; # 2nd number left of "|" } else { warn "Invalid summary line"; } } } else { warn "Invalid summary file, skipping"; return; } } } # ========================================================================== # Strip the potential anchor tags from around an archive entry # sub striplink { local($_) = @_; s#^##; s#$##; return &truncated($_); } # ========================================================================== # If the options call for it, truncate the archive URL down to the # Nth hierarchy level and/or remove filename (if any) # sub truncated { local($_) = @_; local(@levels); return $_ unless m#^/#; if ($TruncateFile) { s#[^/]+$##; } if ($TruncateLevel > 0) { @levels = split(/\//); if ($#levels > $TruncateLevel) { $_ = join('/', @levels[0 .. $TruncateLevel], ''); } } return $_; } # ========================================================================== # Process the access_log FILE by reading each entry, validating and # categorizing the access, and then adding to that category's stats # sub process_log { local($_) = @_; # The first line has already been read. local($host, $rfc931, $authuser, $timestamp, $request, $status, $bytes); local($ident, $hour, $date, $method, $htv, $has_head, $idx); local($fname, $rname, $dvalue, $pathkey, @address, $domain, $subdomain); local($saveline); LINE: while() { s/^\0+//; # This is due to a bug in perl 5.002 s/\0//g; # because this line should be sufficient $saveline = $_; # # First, parse the logfile entry into its seven basic components # ($host, $rfc931, $authuser, $timestamp, $request, $status, $bytes) = /^(\S+) (\S+) (\S+) \[([^\]]*)\] \"([^"]*)\" (\S+) (\S+)/; #" Now, is this garbage or is it memorex? Note that $bytes can be 0 if (!($host && $rfc931 && $authuser && $timestamp && $request && $status)) { if ($PrintInvalids) { print STDERR "$.:$saveline"; } next LINE; } if ($status eq '-') # Test the response code { $status = "200"; } elsif (!defined($RespEstimates{$status})) { if ($PrintInvalids) { print STDERR "$.:$saveline"; } next LINE; } if ($SearchCode) { next LINE unless ($status =~ m#$SearchCode#o); } if ($NotCode) { next LINE unless ($status !~ m#$NotCode#o );} if ($bytes eq '-') { $bytes = '0'; } elsif ($bytes !~ /^\d+$/ ) # Test the bytes transferred { if ($PrintInvalids) { print STDERR "$.:$saveline"; } next LINE; } if ($rfc931 ne '-') # Test the remote ident { $ident = $rfc931; # Save ident for later use $ident =~ s/\[[^\]]*\]/COOKIE/g; # Replace all magic cookies } elsif ($authuser ne '-') { $ident = $authuser; # Jury rig support for authuser $ident =~ s/\[[^\]]*\]/COOKIE/g; # Replace all magic cookies } else { $ident = "unknown"; } # # Looks okay so far -- Now figure out when the request was made. # $timestamp =~ s/^0/ /; # Remove leading zero from day if ($timestamp =~ m#^([ 1-3]?\d)/([A-Za-z]+)/(\d{4}):(\d\d):\d\d:\d\d ([+ -]\d{1,4})#) { $date = "$2 $1 $3"; $hour = "$4"; $TimeZone = "$5"; } else { if ($PrintInvalids) { print STDERR "$.:$saveline"; } next LINE; } if ($SearchDate) { next LINE unless ($date =~ m#$SearchDate#o); } if ($NotDate) { next LINE unless ($date !~ m#$NotDate#o); } if ($SearchTime) { next LINE unless ($hour =~ m#$SearchTime#o); } if ($NotTime) { next LINE unless ($hour !~ m#$NotTime#o); } # # Then parse the method and URL pathname from request # ($method, $fname, $htv) = split(' ',$request,3); if ($SearchMethod) { next LINE unless ($method =~ m#$SearchMethod#o); } if ($NotMethod) { next LINE unless ($method !~ m#$NotMethod#o); } $has_head = 0; # Check for HTTP/version tag if ($htv) { if ($htv !~ m#^HTTP/#i) { if ($PrintInvalids) { print STDERR "$.:$saveline"; } } else { $has_head = 1; } } # # Now we update the actual bytes transferred to include header/errors # if ($has_head || ($status ne '200')) { $bytes += $RespEstimates{$status}; } # # And then determine what the archive name should be # if ($rname = $RespCodes{$status}) # If not a successful status code { if ($PrintNonexist && ($status >= 400)) { print STDERR "$status $date $hour $fname BY $host\n"; } $fname = $rname unless ($SearchCode || $NotCode); } elsif (!$fname || ($fname =~ m#^HTTP/#i)) { $fname = '/'; } else { $fname =~ s/\#.*$//; # Remove any trailing anchor $fname =~ s/\?.*$//; # Remove any trailing query $fname =~ s/%7E/~/i; # Fix munging of URLs $fname =~ s/%3A/:/ig; $fname =~ s#/[^/]+/\.\./#/#; # Fix usage of relative paths $fname =~ s#/\./#/#; # and another one $fname =~ y#/#/#s; # Remove any extra slashes $fname =~ s#/$DirectoryIndex$#/#o; # Remove trailing index name } if ($SearchArchive) { next LINE unless ($fname =~ m#$SearchArchive#o); } if ($NotArchive) { next LINE unless ($fname !~ m#$NotArchive#o); } if ($Verbose) { print STDERR "$date $hour $bytes $fname\n"; } unless ($rname || $SearchArchive || $SearchCode || $NotCode) { for ($idx = 0; $idx < $#ArchiveMap; $idx += 3) { if ($ArchiveMap[$idx] eq 'i') { if ($fname =~ m/${ArchiveMap[$idx+1]}/i) { $fname = $ArchiveMap[$idx+2]; last; } } elsif ($fname =~ m/${ArchiveMap[$idx+1]}/) { $fname = $ArchiveMap[$idx+2]; last; } } next LINE unless $fname; # No value indicates URI exclusion } $pathkey = &truncated($fname); # Truncate parts if that is desired # # Get hostname/IP address and determine domain and reversed subdomain. # undef $domain; undef $subdomain; $host =~ tr/A-Z/a-z/; $host =~ s/\.$//; if ($host =~ /^[^.]+$/) # Unqualified hostname { if ($AppendToLocalhost) { $host .= $AppendToLocalhost; } else { if ($PrintInvalids) { print STDERR "$.:$saveline"; } $domain = 'localhost'; $subdomain = $host; } } elsif ($host =~ /^\d+\.\d+\.\d+\.\d+$/) # IP number { if ($LookupDNS && ($dvalue = &resolve($host))) { $host = $dvalue; if ($AppendToLocalhost && ($host =~ /^[^.]+$/)) { $host .= $AppendToLocalhost; } } else { $domain = 'unresolved'; $subdomain = $ShowUnresolved ? $host : 'Unresolved'; } } $host =~ s/\.[\d.]*in-addr\.arpa$//; # Remove any DNS garbage $ident .= '@' . $host; if ($SearchAddress) { next LINE unless ($host =~ m#$SearchAddress#o); } if ($NotAddress) { next LINE unless ($host !~ m#$NotAddress#o); } # # If we haven't already set the subdomain and we don't want the # full subdomain address and this one has a machine name, strip # the machine name and store it reversed (for later sorting/display). # if ($Do_Subdomain && !defined($subdomain)) { @address = split(/\./, $host); # Split into component names if ($host =~ /$AppendToLocalhost$/o) { if (!$LocalFullAddress && ($#address > 1)) { shift(@address); # clip off the machine name } } else { if (!$OthersFullAddress && ($#address > 1)) { shift(@address); # clip off the machine name } } $subdomain = join('.', reverse(@address)); } # # If we haven't already set the domain, find it in %DomainMap # by looking for the longest match. If none, just use last component. # Note that this destroys the value of $host. # if (!defined($domain)) { for (;;) { if (defined($dvalue = $DomainMap{$host})) { next LINE if ($dvalue eq ''); # Indicates domain exclusion last; } last unless ($host =~ s/^[^.]*\.//); } $domain = $host; } # # Now that we have categorized it, add it to the corresponding counters # $TotalRequests++; # Total requests received $TotalBytes += $bytes; # Total bytes sent $DayRequests{$date}++; # Add to Daily Table $DayBytes{$date} += $bytes; if ($Do_Hourly) # Add to Hourly Table? { $HourRequests{$hour}++; $HourBytes{$hour} += $bytes; } if ($Do_Domain) # Add to Domain Table? { $DomainRequests{$domain}++; $DomainBytes{$domain} += $bytes; } if ($Do_Subdomain) # Add to Subdomain Table? { $SubdomainRequests{$subdomain}++; $SubdomainBytes{$subdomain} += $bytes; } if ($Do_Archive) # Add to Archive Table? { $ArchiveRequests{$pathkey}++; $ArchiveBytes{$pathkey} += $bytes; } if ($Do_Ident) # Add to Ident Table? { $IdentRequests{$ident}++; $IdentBytes{$ident} += $bytes; } } continue { last if eof(FILE); $_ = ; } } # ========================================================================== # Initialize the DNS cache and remove entries that have expired. # sub init_DNS { local($ipnum, $value, $host, $seen, @expired); if ($DNScachefile) { dbmopen(%DNScache, $DNScachefile, 0666) || die "Cannot open DBM files $DNScachefile: $!\n"; while (($ipnum, $value) = each %DNScache) { ($host, $seen) = split(/\|/, $value); if ($StartTime > ($seen + $DNSexpires)) { push(@expired, $ipnum); } } foreach $ipnum (@expired) { delete $DNScache{$ipnum}; } } else { %DNScache = (); } } # ========================================================================== # Close the DNS cache # sub close_DNS { if ($DNScachefile) { dbmclose(%DNScache); } } # ========================================================================== # Resolve an IP address to its DNS hostname (if it has one) with caching. # sub resolve { local($ip) = @_; local($ipnum, $value, $host, $seen, $aliases, $addrtype, $length, @addrs); $ipnum = pack('C4', split(/\./, $ip)); if (defined($value = $DNScache{$ipnum})) { ($host, $seen) = split(/\|/, $value); return $host; } ($host, $aliases, $addrtype, $length, @addrs) = gethostbyaddr($ipnum, 2); if (!defined($host)) { $host = ''; } # Many hosts have no DNS names $DNScache{$ipnum} = join('|', $host, time); return $host; } # ========================================================================== # Output the summary in HTML # sub output_summary { local($prefix, $earliest, $latest, $section, $value, @dupes); # # We first need to combine slashless directory names with slashful ones # @dupes = (); while (($section, $value) = each %ArchiveRequests) { if (($section !~ m#/$#) && defined($ArchiveRequests{"$section/"})) { push(@dupes, $section); } } foreach $section (@dupes) { $ArchiveRequests{"$section/"} += $ArchiveRequests{$section}; delete $ArchiveRequests{$section}; $ArchiveBytes{"$section/"} += $ArchiveBytes{$section}; delete $ArchiveBytes{$section}; } undef @dupes; # # And create a sorted date array for later output # @SortedDates = sort datecompare keys %DayRequests; if ($#SortedDates < 0) # Handle case of no data to summarize { $SortedDates[0] = '[none]'; $LastSummary = ''; } if ($ReverseDateSort) { $earliest = $SortedDates[$#SortedDates]; $latest = $SortedDates[0]; } else { $earliest = $SortedDates[0]; $latest = $SortedDates[$#SortedDates]; } # # Finally, we can print out the resulting statistics by section. # # Note: if you have a heavily used server, you may need to increase # the length of the numeric output fields in the forms below. print "\n"; print "$OutputTitle\n"; print "\n"; print "

    $OutputTitle

    \n"; if ($TimeZone) { $Updated .= "(GMT $TimeZone)"; } else { $Updated .= "($UpdatedGMT)"; } print "", $UpdateHeader, $Updated, "\n"; print "
      \n"; &output_xref($Do_Daily, $TopDaily, 'Daily', $DailyHeader); &output_xref($Do_Hourly, $TopHourly, 'Hourly', $HourlyHeader); &output_xref($Do_Domain, $TopDomain, 'Domain', $DomainHeader); &output_xref($Do_Subdomain, $TopSubdomain, 'Subdomain', $SubdomainHeader); &output_xref($Do_Archive, $TopArchive, 'Archive', $ArchiveHeader); &output_xref($Do_Ident, $TopIdent, 'Ident', $IdentHeader); if ($LastSummary) { local($prevmonth, $prevyear) = &lastmonth($earliest); $LastSummary =~ s/%M/$prevmonth/g; $LastSummary =~ s/%Y/$prevyear/g; print "
    • $LastSumHeader\n"; } print "
    \n"; print "

    ", $TotalsHeader, $earliest," to ", $latest, "

    \n"; print $StartTag; printf $TotalsFormat, $ReqRcvHeader, $TotalRequests; printf $TotalsFormat, $BtransHeader, $TotalBytes; printf $TotalsFormat, $AvgReqHeader, ($TotalRequests/($#SortedDates + 1)); printf $TotalsFormat, $AvgByteHeader, ($TotalBytes/($#SortedDates + 1)); print $EndTag; if ($Do_Daily) { &output_daily('Daily'); if ($Do_Daily == 2) { $TopDaily = 0; $SortDaily = 0; &output_daily('AllDaily'); } } if ($Do_Hourly) { &output_hourly('Hourly'); if ($Do_Hourly == 2) { $TopHourly = 0; $SortHourly = 0; &output_hourly('AllHourly'); } } if ($Do_Domain) { &output_domain('Domain'); if ($Do_Domain == 2) { $TopDomain = 0; $SortDomain = 0; &output_domain('AllDomain'); } } if ($Do_Subdomain) { &output_subdomain('Subdomain'); if ($Do_Subdomain == 2) { $TopSubdomain = 0; $SortSubdomain = 0; &output_subdomain('AllSubdomain'); } } if ($Do_Archive) { &output_archive('Archive'); if ($Do_Archive == 2) { $TopArchive = 0; $SortArchive = 0; &output_archive('AllArchive'); } } if ($Do_Ident) { &output_ident('Ident'); if ($Do_Ident == 2) { $TopIdent = 0; $SortIdent = 0; &output_ident('AllIdent'); } } print "
    \n"; print "
    This summary was generated by \n"; print ""; print "$Version\n"; print "
    \n"; print "\n"; } # ========================================================================== # Output the stats for each calendar day represented in the input file(s) # sub output_xref { local($do_section, $topn, $frag, $header) = @_; if ($do_section) { local($prefix) = $topn ? "$PrefixTop $topn" : $PrefixTotal; print "
  • $prefix $header\n"; if ($do_section == 2) { print "
  • $PrefixTotal $header\n"; } } } # ========================================================================== # Output the stats for each calendar day represented in the input file(s) # sub output_daily { local($frag) = @_; local($rqsts, $bytes, $pctrqsts, $pctbytes); local($top) = $TopDaily; local($prefix) = $top ? "$PrefixTop $top" : $PrefixTotal; print "
    \n"; print "

    $prefix $DailyHeader

    \n"; print $StartTag; print $StatsHeader, " Date\n"; print $StatsRule, "------------\n"; local($fmt) = "$StatsFormat %s\n"; foreach $date (@SortedDates) { $rqsts = $DayRequests{$date} || 0; $bytes = $DayBytes{$date} || 0; if ($rqsts == $TotalRequests) { $pctrqsts = "100.0"; } else { $pctrqsts = sprintf("%5.2f", 100*$rqsts/$TotalRequests); } if ($bytes == $TotalBytes) { $pctbytes = "100.0"; } else { $pctbytes = sprintf("%5.2f", 100*$bytes/$TotalBytes); } printf $fmt, $pctrqsts, $pctbytes, $bytes, $rqsts, $date; last if ($top && (--$top == 0)); } print $EndTag; } # ========================================================================== # Output the stats for each hour of the day, accumulating over all days. # sub output_hourly { local($frag) = @_; local($rqsts, $bytes, $pctrqsts, $pctbytes); local($top) = $TopHourly; local($prefix) = $top ? "$PrefixTop $top" : $PrefixTotal; print "
    \n"; print "

    $prefix $HourlyHeader

    \n"; print $StartTag; print $StatsHeader, " Time\n"; print $StatsRule, "-----\n"; local($fmt) = "$StatsFormat %s\n"; foreach $hour (sort hourcompare keys %HourRequests) { $rqsts = $HourRequests{$hour}; $bytes = $HourBytes{$hour}; if ($rqsts == $TotalRequests) { $pctrqsts = "100.0"; } else { $pctrqsts = sprintf("%5.2f", 100*$rqsts/$TotalRequests); } if ($bytes == $TotalBytes) { $pctbytes = "100.0"; } else { $pctbytes = sprintf("%5.2f", 100*$bytes/$TotalBytes); } printf $fmt, $pctrqsts, $pctbytes, $bytes, $rqsts, $hour; last if ($top && (--$top == 0)); } print $EndTag; } # ========================================================================== # Output the stats for each requesting client's domain/country/organization # sub output_domain { local($frag) = @_; local($rqsts, $bytes, $pctrqsts, $pctbytes); local($top) = $TopDomain; local($prefix) = $top ? "$PrefixTop $top" : $PrefixTotal; print "
    \n"; print "

    $prefix $DomainHeader

    \n"; print $StartTag; print $StatsHeader, " Domain\n"; print $StatsRule, "------------------------------------\n"; local($fmt) = "$StatsFormat %-5s %s\n"; foreach $domain (sort domaincompare keys %DomainRequests) { $country = $DomainMap{$domain} || ''; $rqsts = $DomainRequests{$domain}; $bytes = $DomainBytes{$domain}; if ($rqsts == $TotalRequests) { $pctrqsts = "100.0"; } else { $pctrqsts = sprintf("%5.2f", 100*$rqsts/$TotalRequests); } if ($bytes == $TotalBytes) { $pctbytes = "100.0"; } else { $pctbytes = sprintf("%5.2f", 100*$bytes/$TotalBytes); } printf $fmt, $pctrqsts, $pctbytes, $bytes, $rqsts, $domain, $country; last if ($top && (--$top == 0)); } print $EndTag; } # ========================================================================== # Output the stats for each requesting client's DNS subdomain # sub output_subdomain { local($frag) = @_; local($rqsts, $bytes, $pctrqsts, $pctbytes); local($top) = $TopSubdomain; local($prefix) = $top ? "$PrefixTop $top" : $PrefixTotal; print "
    \n"; print "

    $prefix $SubdomainHeader

    \n"; print $StartTag; print $StatsHeader, " Reversed Subdomain\n"; print $StatsRule, "------------------------------------\n"; local($fmt) = "$StatsFormat %s\n"; foreach $subdomain (sort subdomcompare keys %SubdomainRequests) { $rqsts = $SubdomainRequests{$subdomain}; $bytes = $SubdomainBytes{$subdomain}; if ($rqsts == $TotalRequests) { $pctrqsts = "100.0"; } else { $pctrqsts = sprintf("%5.2f", 100*$rqsts/$TotalRequests); } if ($bytes == $TotalBytes) { $pctbytes = "100.0"; } else { $pctbytes = sprintf("%5.2f", 100*$bytes/$TotalBytes); } printf $fmt, $pctrqsts, $pctbytes, $bytes, $rqsts, $subdomain; last if ($top && (--$top == 0)); } print $EndTag; } # ========================================================================== # Output the stats for each archive (URL path or category) # sub output_archive { local($frag) = @_; local($rqsts, $bytes, $pctrqsts, $pctbytes, $asec); local($top) = $TopArchive; local($prefix) = $top ? "$PrefixTop $top" : $PrefixTotal; print "
    \n"; print "

    $prefix $ArchiveHeader

    \n"; print $StartTag; print $StatsHeader, " Archive Section\n"; print $StatsRule, "------------------------------------\n"; local($fmt) = "$StatsFormat %s\n"; foreach $section (sort archivecompare keys %ArchiveRequests) { $rqsts = $ArchiveRequests{$section}; $bytes = $ArchiveBytes{$section}; next unless $rqsts; if ($rqsts == $TotalRequests) { $pctrqsts = "100.0"; } else { $pctrqsts = sprintf("%5.2f", 100*$rqsts/$TotalRequests); } if ($bytes == $TotalBytes) { $pctbytes = "100.0"; } else { $pctbytes = sprintf("%5.2f", 100*$bytes/$TotalBytes); } $asec = $section; $asec =~ s/\&/\&/g; # Replace HTML specials $asec =~ s//\>/g; if ($InsertLink && ($asec =~ m:^/:)) { $asec = "$asec"; } printf $fmt, $pctrqsts, $pctbytes, $bytes, $rqsts, $asec; last if ($top && (--$top == 0)); } print $EndTag; } # ========================================================================== # Output the stats for each calendar day represented in the input file(s) # sub output_ident { local($frag) = @_; local($rqsts, $bytes, $pctrqsts, $pctbytes); local($top) = $TopIdent; local($prefix) = $top ? "$PrefixTop $top" : $PrefixTotal; print "
    \n"; print "

    $prefix $IdentHeader

    \n"; print $StartTag; print $StatsHeader, " Remote Identity\n"; print $StatsRule, "------------------------------------\n"; local($fmt) = "$StatsFormat %s\n"; foreach $ident (sort identcompare keys %IdentRequests) { $rqsts = $IdentRequests{$ident}; $bytes = $IdentBytes{$ident}; if ($rqsts == $TotalRequests) { $pctrqsts = "100.0"; } else { $pctrqsts = sprintf("%5.2f", 100*$rqsts/$TotalRequests); } if ($bytes == $TotalBytes) { $pctbytes = "100.0"; } else { $pctbytes = sprintf("%5.2f", 100*$bytes/$TotalBytes); } printf $fmt, $pctrqsts, $pctbytes, $bytes, $rqsts, $ident; last if ($top && (--$top == 0)); } print $EndTag; } # ========================================================================== # ========================================================================== # The following sort comparison functions take $a and $b as the two # arguments keys or values to compare. Speed is important here. sub datecompare { local($date1) = substr($a, 7, 4) * 512; # Years local($date2) = substr($b, 7, 4) * 512; $date1 += index($AllMonths, substr($a,0,3)) * 12; # Months $date2 += index($AllMonths, substr($b,0,3)) * 12; $date1 += substr($a, 4, 2); # Days $date2 += substr($b, 4, 2); if ($SortDaily == 0) { return ($ReverseDateSort ? $date2 <=> $date1 : $date1 <=> $date2); } if ($SortDaily == 1) { $sdiff = $DayRequests{$b} - $DayRequests{$a}; } else { $sdiff = $DayBytes{$b} - $DayBytes{$a}; } ($sdiff < 0) ? -1 : ($sdiff > 0) ? 1 : ($date1 <=> $date2); } sub hourcompare { if ($SortHourly == 0) { return ($a <=> $b); } if ($SortHourly == 1) { $sdiff = $HourRequests{$b} - $HourRequests{$a}; } else { $sdiff = $HourBytes{$b} - $HourBytes{$a}; } ($sdiff < 0) ? -1 : ($sdiff > 0) ? 1 : ($a <=> $b); } sub domaincompare { if ($SortDomain == 0) { $sdiff = length($a) - length($b); } elsif ($SortDomain == 1) { $sdiff = $DomainRequests{$b} - $DomainRequests{$a}; } else { $sdiff = $DomainBytes{$b} - $DomainBytes{$a}; } ($sdiff < 0) ? -1 : ($sdiff > 0) ? 1 : ($a cmp $b); } sub subdomcompare { if ($SortSubdomain == 0) { return ($a cmp $b); } if ($SortSubdomain == 1) { $sdiff = $SubdomainRequests{$b} - $SubdomainRequests{$a}; } else { $sdiff = $SubdomainBytes{$b} - $SubdomainBytes{$a}; } ($sdiff < 0) ? -1 : ($sdiff > 0) ? 1 : ($a cmp $b); } sub archivecompare { if ($SortArchive == 0) { return ($a cmp $b); } if ($SortArchive == 1) { $sdiff = $ArchiveRequests{$b} - $ArchiveRequests{$a}; } else { $sdiff = $ArchiveBytes{$b} - $ArchiveBytes{$a}; } ($sdiff < 0) ? -1 : ($sdiff > 0) ? 1 : ($a cmp $b); } sub identcompare { if ($SortIdent == 0) { return ($a cmp $b); } if ($SortIdent == 1) { $sdiff = $IdentRequests{$b} - $IdentRequests{$a}; } else { $sdiff = $IdentBytes{$b} - $IdentBytes{$a}; } ($sdiff < 0) ? -1 : ($sdiff > 0) ? 1 : ($a cmp $b); } # =========================================================================== # This is a modified (by Roy Fielding) version of Perl 4.036's ctime.pl # library by Waldemar Kebsch and # Marion Hakanson . It is distributed under the # Artistic License (included with your Perl distribution files). # # # wtime returns a time string in the format "Wkd, Dy Mon Year HH:MM:SS Zone" # with no newline appended. # # USAGE: # # wtime(time,''); -- returns the local time with no timezone appended # As in "Wed, 15 Dec 1993 23:59:59 " # # wtime(time,'GMT'); -- returns GMT time # As in "Wed, 16 Dec 1993 07:59:59 GMT" # sub wtime { local($time, $TZ) = @_; local($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst); local(@DoW) = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); local(@MoY) = ('Jan','Feb','Mar','Apr','May','Jun', 'Jul','Aug','Sep','Oct','Nov','Dec'); # Determine what time zone is in effect. Use local time if # TZ is anything other than 'GMT' # There's no portable way to find the system default timezone. ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = ($TZ eq 'GMT') ? gmtime($time) : localtime($time); $year += ($year < 70) ? 2000 : 1900; sprintf("%s, %02d %s %4d %02d:%02d:%02d %s", $DoW[$wday], $mday, $MoY[$mon], $year, $hour, $min, $sec, $TZ); } # =========================================================================== # This last routine returns the three letter abbreviation for the month # before the one in the date that was passed as an argument, and its year. # sub lastmonth { local($date) = @_; # Must be in the format "Feb 01 1994" local($midx) = index($AllMonths, substr($date,0,3)); local($year) = substr($date,7,4); if ($midx < 0) { return ('Err', ''); } elsif ($midx == 0) { return ('Dec', ($year - 1)); } else { return (substr($AllMonths,($midx - 3),3), $year); } } cgi-bin/stats/wwwstat-2.0/wwwerrs0002640000372000001540000001600307005603741016651 0ustar affweblibuuid#!/opt/perl/bin/perl # ========================================================================== # Copyright (c) 1996 Regents of the University of California. # # This software has been developed by Roy Fielding as # part of the WebSoft project at the University of California, Irvine. # # See the file LICENSE for licensing and redistribution information. # # This program is provided ONLY as an example. It is not needed to run # wwwstat and is not supported by the author. # sub usage { die <<"EndUsage"; USAGE: wwwerrs [ error_log_name ] This program reads the httpd error_log logfile (or whatever file is given as the single argument) looking for failed requests (bad URLs) which include a valid Referer (and thus can be tracked to the origin of the reference). It assumes that the error_log has been enhanced to include the referer information (as in NCSA 1.4 and later). The output is an HTML file that makes it easy to check references. The script should be edited to discard normal error messages, where normal is dependent on your particular server. EndUsage } if ($#ARGV > 0) { &usage; } # ========================================================================== # Get defaults $Owner = 'Your Name Here <somebody@no_where.com>'; @DoW = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); @MoY = ('Jan','Feb','Mar','Apr','May','Jun', 'Jul','Aug','Sep','Oct','Nov','Dec'); $Updated = &wtime(time,''); # Format it as local time if ($#ARGV == 0) { $ErrorLog = $ARGV[0]; if ($ErrorLog =~ /^-/) { &usage; } } else { $ErrorLog = '/usr/local/etc/httpd/logs/error_log'; # Server's Error Log } %pseen = (); %unseen = (); %cfgseen = (); $UnusualHeader = "Unusual Error Messages"; $ConfigHeader = "Client Denied by Server Configuration"; $PermHeader = "File Permissions Deny Access"; $ExistHeader = "File Does Not Exist"; # ========================================================================== # Start output $| = 1; # set unbuffered print "\n"; print "Collated Error Log Output\n"; print "\n"; print "

    Collated Error Log Output

    \n"; print "Last updated: $Updated\n"; print "\n"; # ========================================================================== print "
    \n"; print "

    $UnusualHeader

    \n"; print "
    \n";
    
    &process_log;
    
    print "
    \n"; # ========================================================================== print "
    \n"; print "

    $ConfigHeader

    \n"; print "
    \n";
    
    foreach $pfile ( sort keys %cfgseen )
    {
        printf ("%-70s |%s\n", $pfile, $cfgseen{$pfile});
    }
    
    print "
    \n"; # ========================================================================== print "
    \n"; print "

    $PermHeader

    \n"; print "
    \n";
    
    foreach $pfile ( sort keys %pseen )
    {
        printf ("%-70s |%s\n", $pfile, $pseen{$pfile});
    }
    
    print "
    \n"; # ========================================================================== print "
    \n"; print "

    $ExistHeader

    \n"; foreach $pfile ( sort keys %unseen ) { print $pfile, "\n"; print "
      \n"; foreach $ref ( sort split(/>/, $unseen{$pfile}) ) { next if ($ref eq '-'); print "
    • $ref\n"; } print "
    \n"; } # ========================================================================== print "
    \n"; print "
    \n"; print "$Owner\n"; print "
    \n"; print "\n"; exit(0); # ========================================================================== # ========================================================================== # Iterate through the logfile sub process_log { local($_, $oldrefs, $ref, $reason, $date, $file, $host); open(LOG, $ErrorLog) || die "$!: Failed to open $ErrorLog, stopped"; LINE: while () { s/^\0+//; # This is due to a bug in perl 5.002 s/\0//g; # because this line should be sufficient s/\&/\&/g; s//\>/g; s/%7E/~/i; study; next if (/ timed out/); # Ignore these common messages next if (/ send aborted for /); next if (/ caught SIGHUP/); next if (/ successful restart/); next if (/ killing CGI/); if (/ httpd: access to /) { ($date, $file, $host, $reason) = /^\[([^\]]*)\] httpd: access to (\S+) failed for ([^, ]+), reason: (.*)/; if (!defined($reason)) { print; next; } if ($reason =~ s/ from (\S+)//) { $ref = $1; } else { $ref = ''; } if ($reason =~ /^(file|script) permissions/) { $pseen{$file} = $host; } elsif ($reason =~ /^(file|script) does not exist/) { if ($oldrefs = $unseen{$file}) { if ($ref && (rindex($oldrefs, $ref) < 0)) { $oldrefs = join('>', $oldrefs, $ref); $unseen{$file} = $oldrefs; } } else { $unseen{$file} = $ref; } } elsif ($reason =~ /^client denied by server config/) { $cfgseen{$file} = $host; } else { print; } } else { print; } # This is for unknown/unusual messages } close(LOG); } # --------------------------------------------------------------------------- # The following routine is from the wwwdates.pl package of the # libwww-perl library . # =========================================================================== # wtime() is a modified version of Perl 4.036's ctime.pl # library by Waldemar Kebsch and # Marion Hakanson . # # wtime returns a time string in the format "Wkd, Dy Mon Year HH:MM:SS Zone" # with no newline appended. # # USAGE: # # &wtime(time,''); -- returns the local time with no timezone appended # As in "Wed, 15 Dec 1993 23:59:59 " # # &wtime(time,'GMT'); -- returns GMT time # As in "Thu, 16 Dec 1993 07:59:59 GMT" # sub wtime { local($time, $tz) = @_; local($[) = 0; local($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst); # Use local time if tz is anything other than 'GMT' ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = ($tz eq 'GMT') ? gmtime($time) : localtime($time); $year += 1900; sprintf("%s, %02d %s %04d %02d:%02d:%02d %s", $DoW[$wday], $mday, $MoY[$mon], $year, $hour, $min, $sec, $tz); } 1; cgi-bin/stats/wwwstat-2.0/splitlog.pl0000640000372000001540000006505407005603741017410 0ustar affweblibuuid#!YOUR_PERL_BINARY # ========================================================================== $Version = 'splitlog-1.0'; # # Copyright (c) 1996 Regents of the University of California. # # This software has been developed by Roy Fielding as # part of the WebSoft project at the University of California, Irvine. # # See the file LICENSE for licensing and redistribution information. # See the file INSTALL for installation information. # See the file Changes for known problems and version information. # See the file README for more information. # See the splitlog.1 man page for options and usage information. # sub usage { die <<"EndUsage"; usage: $Pname [-f config] [-h] [-e] [-x] [-v] [-dir directory] [-anon imu] [-dns] [-nodns] [-cache filename] [-m method] [-M method] [-a IP_address] [-c code] [-d date] [-t hour] [-n URL_path] [-A IP_address] [-C code] [-D date] [-T hour] [-N URL_path] [-noescape] [--] [ logfile | + | - ]... $Version Process a sequence of httpd Common Logfile Format access_log files and split them into separate files according to requested URL or virtual host. Configuration options: -f Get configuration defaults from the given file. -- Last option (all later arguments are treated as filenames). Diagnostic Options: -h Help -- just display this message to STDERR and quit. -e Display to STDERR all invalid log entries. Process Options: -x Discard any logfile entries without a filename key. -v Use the logfile entry prefix (virtual host) for output filename. -dir Put the split logfiles in the given directory. -anon Anonymize the logfile entries: i=ident, m=machine, u=userid. -dns Use DNS to lookup unresolved IP addresses (may be slow). -nodns Do not lookup unresolved IP addresses. -cache Use the given dbm file to read/write DNS cache. Search Options (include only those log entries ...): -a Containing a hostname/IP address matching the given perl regexp. -A Not containing " " " " " " " " -c Containing a server response code matching the given perl regexp. -C Not containing " " " " " " " " -d Containing a date ("Feb 02 1996") matching the given perl regexp. -D Not containing " " " " " " " " -t Containing an hour ("00" -- "23") matching the given perl regexp. -T Not containing " " " " " " " " -n Containing a URL path matching the given perl regexp (except +.). -N Not containing " " " " " " " " -m Using an HTTP method name matching the given perl regexp. -M Not using the HTTP method " " " " "" -noescape Do not escape "." and "+" in remaining search options. Filenames (none implies "+"): - Read standard input (STDIN). + Read the default logfile $DefaultLog. ... Anything else is treated as the name of a logfile to be read. EndUsage } # ========================================================================== # The main program is really quite simple ... $Pname = $0; if ($Pname =~ s#^(.*)/##) { push(@INC, $1); } # Modify include path for bin, # current dir, and home dir unshift(@INC, '.', ($ENV{'HOME'} || $ENV{'LOGDIR'})); $StartTime = time; # Get the current date-time stamp $Updated = &wtime($StartTime,''); # Format it as local time &init_defaults; # Set the default configuration &get_configuration; # Get user configuration &get_commandline; # Get command-line options &init_DNS if $LookupDNS; # Initialize the DNS cache &init_handles; # Initialize the output file handles if ($ARGV[0]) # Check for explicit filenames { foreach $filename (@ARGV) { &process_file($filename); } } else # if none, just read the default { &process_file($DefaultLog); } &close_handles; # Close all the output filehandles &close_DNS if $LookupDNS; # Close the DNS cache exit(0); # and we are finished. # ========================================================================== # ========================================================================== # Initialize default configuration options. NOTE that all of these options # can be overridden in either the system or user configuration files and # many can be overridden on the command-line. # sub init_defaults { # Specify the command for displaying compressed files to STDOUT $Zcat = 'gunzip -c'; # specify as null string if none are available $Zhandle = '(gz|Z|z)'; # list file extensions that indicate compressed # If address in log entry is one word (a local host), append what? # Specify an appropriate '.sub.dom.ain' $AppendToLocalhost = '.no_where.com'; # Specify the maximum number of open file handles allowed. # You will get "Failed open of ..." errors if it is set too high. $MaxHandles = 50; # Specify the default location of your access log $DefaultLog = '/usr/local/etc/httpd/logs/access_log'; # Specify the default destination directory for the split logfiles $DestDir = ''; # current directory # Specify the filename (no .ext) for non-matching, non-split log entries $Remaining = 'OTHERS'; # Specify the amount of anonymization done to the split log entries. # May be '','i','m','u','im','iu','mi','mu','ui','um','imu' # '' = none # /i/ = ident field removed # /m/ = machine name replaced with ANON or 0 # /u/ = authentication userid field removed $Anonymize = ''; # Specify whether (1) or not (0) you want the split filenames to be # based on a prefix (assumed to be a virtual host) of each logfile # entry instead of on the requested URL path. The prefix is terminated # by the first colon ':' or space. $Vhosts = 0; # Specify whether (1) or not (0) you want to lookup unresolved # IP addresses via DNS. Note that this could be *very* slow! $LookupDNS = 1; $DNScachefile = 'dnscache'; # DBM files for persistent cache $DNSexpires = 5356800; # Cache for two months (in seconds) # The rest of these options are normally only changed on the command-line $PrintInvalids = 0; # Display invalid log entries on STDERR? $SearchAddress = ''; # Pattern to look for in hostname/IP addresses $SearchCode = ''; # Pattern to look for in Code $SearchDate = ''; # Pattern to look for in Date $SearchTime = ''; # Pattern to look for in Hour $SearchPath = ''; # Pattern to look for in URL Path $SearchMethod = ''; # Pattern to look for in Method $NotAddress = ''; # Pattern to reject entry if in IP addresses $NotCode = ''; # Pattern to reject entry if in Code $NotDate = ''; # Pattern to reject entry if in Date $NotTime = ''; # Pattern to reject entry if in Hour $NotPath = ''; # Pattern to reject entry if in URL Path $NotMethod = ''; # Pattern to reject entry if in Method $EscapeSpecials = '[+.]'; # Most users forget about regexp syntax # The default user configuration filename should only # be changed if your filesystem can't handle this name. $UconfigFile = 'splitlog.rc'; # User file for overriding defaults } # ========================================================================== # Get the user configuration # sub get_configuration { local($forced) = 0; if (defined($ARGV[0]) && ($ARGV[0] eq '-f')) { shift @ARGV; $UconfigFile = shift @ARGV; $forced = 1; } if ($UconfigFile) { eval 'require $UconfigFile;'; if ($@ && $forced) { die "Unable to read $UconfigFile: $!\n"; } else { $! = 0; undef $@; } } } # ========================================================================== # Get the command-line options. # sub get_commandline { local($_, $first, $rest, $pos); local($letteropts) = 'hexvm:M:c:C:t:T:a:A:n:N:d:D:f:'; local(@args) = split(//, $letteropts); while (defined($_ = $ARGV[0])) { if ($_ eq '--') { shift @ARGV; last; } # Last option indicator if ($_ eq '-') { last; } # STDIN file indicator if (!s/^-//) { last; } # Not an option if (/^no(.*)/) # Exclude some option { # indicated by suffix unless ($_ = $1) { # or next argument shift @ARGV; &badarg('-no requires value') unless ($_ = $ARGV[0]); } if (/^escape$/) { $EscapeSpecials = ''; } elsif (/^dns$/) { $LookupDNS = 0; } else { &badarg('-no',$_); } } elsif (/^anon(.*)/) # Anonymize logfile { # at Nth level unless ($_ = $1) { shift @ARGV; &badarg('-anon requires value') unless ($_ = $ARGV[0]); } &badarg('-anon', $_) unless (/^[imu]+$/); $Anonymize = $_; } elsif (/^dns$/) # Resolve IP addresses { $LookupDNS = 1; } elsif (/^cache(.*)/) # Change cache filename { unless ($_ = $1) { shift @ARGV; &badarg('-cache requires value') unless ($_ = $ARGV[0]); } $DNScachefile = $_; } elsif (/^dir(.*)/) # Output Directory { unless ($_ = $1) { shift @ARGV; &badarg('-dir requires value') unless ($_ = $ARGV[0]); } $DestDir = $_; } else # End of full-word option arguments { while() # Loop by each character { ($first,$rest) = /^(.)(.*)/; if (($pos = index($letteropts,$first)) < 0) { &badarg("Unknown option:",$first); } if ($args[$pos+1] eq ':') { shift(@ARGV); if ($rest eq '') { &badarg($first,"requires value") unless @ARGV; $rest = $ARGV[0]; } &set_option($first, $rest); last; } else { &set_option($first, 1); $_ = $rest; last unless $_; } } } } continue { shift @ARGV; } } # ========================================================================== # Set the single-letter command-line option given. Gee, this is fun. # sub set_option { local($opt, $value) = @_; if ($opt eq 'h') { &usage; } elsif ($opt eq 'e') { $PrintInvalids = 1; } elsif ($opt eq 'x') { $Remaining = ''; } elsif ($opt eq 'v') { $Vhosts = 1; } elsif ($opt eq 'm') { if ($SearchMethod) { $SearchMethod = "($SearchMethod|$value)"; } else { $SearchMethod = $value; } } elsif ($opt eq 'M') { if ($NotMethod) { $NotMethod = "($NotMethod|$value)"; } else { $NotMethod = $value; } } elsif ($opt eq 'c') { if ($SearchCode) { $SearchCode = "($SearchCode|$value)"; } else { $SearchCode = $value; } } elsif ($opt eq 'C') { if ($NotCode) { $NotCode = "($NotCode|$value)"; } else { $NotCode = $value; } } elsif ($opt eq 't') { if ($SearchTime) { $SearchTime = "($SearchTime|$value)"; } else { $SearchTime = $value; } } elsif ($opt eq 'T') { if ($NotTime) { $NotTime = "($NotTime|$value)"; } else { $NotTime = $value; } } elsif ($opt eq 'a') { if ($EscapeSpecials) { $value =~ s/($EscapeSpecials)/\\$1/go; } if ($SearchAddress) { $SearchAddress = "($SearchAddress|$value)"; } else { $SearchAddress = $value; } } elsif ($opt eq 'A') { if ($EscapeSpecials) { $value =~ s/($EscapeSpecials)/\\$1/go; } if ($NotAddress) { $NotAddress = "($NotAddress|$value)"; } else { $NotAddress = $value; } } elsif ($opt eq 'n') { if ($EscapeSpecials) { $value =~ s/($EscapeSpecials)/\\$1/go; } if ($SearchPath) { $SearchPath = "($SearchPath|$value)"; } else { $SearchPath = $value; } } elsif ($opt eq 'N') { if ($EscapeSpecials) { $value =~ s/($EscapeSpecials)/\\$1/go; } if ($NotPath) { $NotPath = "($NotPath|$value)"; } else { $NotPath = $value; } } elsif ($opt eq 'd') { if ($value eq 'today') { $value = substr($Updated, 8, 4) . substr($Updated, 5, 3) . substr($Updated, 12, 4); $value =~ s/ 0(\d) / $1 /; } if ($SearchDate) { $SearchDate = "($SearchDate|$value)"; } else { $SearchDate = $value; } } elsif ($opt eq 'D') { if ($value eq 'today') { $value = substr($Updated, 8, 4) . substr($Updated, 5, 3) . substr($Updated, 12, 4); $value =~ s/ 0(\d) / $1 /; } if ($NotDate) { $NotDate = "($NotDate|$value)"; } else { $NotDate = $value; } } elsif ($opt eq 'f') { die "The -f option MUST be first option after -F option (if any)\n"; } else { &badarg("Unknown option:", $opt); } } # ========================================================================== sub badarg { local($dreck) = join(' ', @_); warn "Bad command option: $dreck\n"; &usage; } # ========================================================================== # process the given filename as FILE, based on the content of its first line. # sub process_file { local($filename) = @_; if ($filename eq '+') { $filename = $DefaultLog; } if ($Zhandle && ($filename =~ /\.$Zhandle$/o)) { if (!$Zcat) { warn "No zcat decompression command has been defined\n"; return; } $filename = "$Zcat $filename |"; } if (!open(FILE,$filename)) { warn "Error opening $filename: $!\n"; return; } &process_log; close(FILE); } # ========================================================================== # Process the access_log FILE by reading each entry, validating and # categorizing the access, and then appending it to one of the split logs # sub process_log { local($host, $ident, $authuser, $timestamp, $request, $status, $bytes); local($trailer, $hour, $date, $method, $htv); local($dvalue, $path, $pathkey, $outfile, $saveline); LINE: while ($_ = ) { s/^\0+//; # This is due to a bug in perl 5.002 s/\0//g; # because this line should be sufficient $saveline = $_; # If we are supposed to be splitting by virtual host, then it # is assumed that the virtual hostname is prefixed to log entry if ($Vhosts && s/^([^: ]+)[: ]//) { $vhost = $1; } else { $vhost = undef; } # # Parse the logfile entry into its seven basic components # ($host, $ident, $authuser, $timestamp, $request, $status, $bytes, $trailer) = /^(\S+) (\S+) (\S+) \[([^\]]*)\] \"([^"]*)\" (\S+) (\S+)(.*)/; #" Now, is this garbage or is it memorex? Note that $bytes can be 0 if (!($host && $ident && $authuser && $timestamp && $request && $status)) { if ($PrintInvalids) { print STDERR "$.:$saveline"; } next LINE; } if ($status !~ /^(-|\d\d\d)$/) # Test the response code { if ($PrintInvalids) { print STDERR "$.:$saveline"; } next LINE; } if ($SearchCode) { next LINE unless ($status =~ m#$SearchCode#o); } if ($NotCode) { next LINE unless ($status !~ m#$NotCode#o );} if ($bytes !~ /^(-|\d+)$/ ) # Test the bytes transferred { if ($PrintInvalids) { print STDERR "$.:$saveline"; } next LINE; } if (!defined($trailer)) { $trailer = ''; } # # Looks okay so far -- Now figure out when the request was made. # if ($timestamp =~ m#^([ 0-3]?\d)/([A-Za-z]+)/(\d{4}):(\d\d):\d\d:\d\d [+ -]\d{1,4}#) { $date = "$2 $1 $3"; $hour = "$4"; } else { if ($PrintInvalids) { print STDERR "$.:$saveline"; } next LINE; } if ($SearchDate) { next LINE unless ($date =~ m#$SearchDate#o); } if ($NotDate) { next LINE unless ($date !~ m#$NotDate#o); } if ($SearchTime) { next LINE unless ($hour =~ m#$SearchTime#o); } if ($NotTime) { next LINE unless ($hour !~ m#$NotTime#o); } # # Then parse the method and URL pathname from request # ($method, $path, $htv) = split(' ', $request, 3); if ($SearchMethod) { next LINE unless ($method =~ m#$SearchMethod#o); } if ($NotMethod) { next LINE unless ($method !~ m#$NotMethod#o); } if ($SearchPath) { next LINE unless ($path =~ m#$SearchPath#o); } if ($NotPath) { next LINE unless ($path !~ m#$NotPath#o); } # # Get hostname/IP address and determine domain and reversed subdomain. # $host =~ tr/A-Z/a-z/; $host =~ s/\.$//; if ($host =~ /^[^.]+$/) # Unqualified hostname { if ($AppendToLocalhost) { $host .= $AppendToLocalhost; } } elsif ($host =~ /^\d+\.\d+\.\d+\.\d+$/) # IP number { if ($LookupDNS && ($dvalue = &resolve($host))) { $host = $dvalue; if ($AppendToLocalhost && ($host =~ /^[^.]+$/)) { $host .= $AppendToLocalhost; } } } $host =~ s/\.[\d.]*in-addr\.arpa$//; # Remove any DNS garbage if ($SearchAddress) { next LINE unless ($host =~ m#$SearchAddress#o); } if ($NotAddress) { next LINE unless ($host !~ m#$NotAddress#o); } # # Anonymize those parts which might be considered private # if ($Anonymize) { ($host, $ident, $authuser) = &anonymous($host, $ident, $authuser); } # # Append the log entry to file indicated by vhost and/or path # $pathkey = &path_map($vhost, $path); next LINE unless defined($outfile = &get_handle($pathkey)); print $outfile $host, ' ', $ident, ' ', $authuser, ' [', $timestamp, '] "', $request, '" ', $status, ' ', $bytes, $trailer, "\n"; } } # ========================================================================== # Determine the output logfile name from the vhost prefix and/or URL path. # The user configuration file can intercede by defining &user_path_map(). # Returning undef means append it to the default file. # sub path_map { local($vhost, $path) = @_; if (defined &user_path_map) { local($pathkey) = &user_path_map($vhost, $path); return $pathkey if defined($pathkey); } # The rest is just a simple default if the user does not want to # define their own routine. return $vhost if $vhost; # Use prefix if we got it return undef unless defined($path); # Anything to work with? return 'proxy' if ($path =~ m#^[-+a-zA-Z]+:#); # Full-URLs to proxy.log return undef unless ($path =~ s#^/(.)#$1#); # Errors and / to default if ($path =~ m#^(~|%7e|((pub|homes?|users?)(/|$)))([^/]*)#i) { if ($5) { return $5; } # User-owned directories else { return undef; } } # Otherwise, just use the top component of remaining URL # if it doesn't look like a file local($top, $rest) = split(/\//, $path, 2); if (defined($rest) || ($top !~ /\./)) { return $top; } return undef; # All remaining get put in the default file } # ========================================================================== # Initialize the file handle arrays # sub init_handles { %OpenHandles = (); @HandlesInUse = (); $NextHandle = 'fh000'; if ($DestDir) { if ($DestDir !~ m#/$#) { $DestDir .= '/'; } unless (-d $DestDir && -w _) { die "Destination $DestDir must be a writable directory.\n"; } } } # ========================================================================== # Get the file handle corresponding to the pathkey (the filename) # sub get_handle { local($pathkey) = @_; local($handle); # First be sure we have a legal filename in pathkey if (!$pathkey) { if ($Remaining) { $pathkey = $Remaining; } else { return undef; } } elsif ($pathkey =~ /^std(in|out|err)$/i) { $pathkey .= 'X'; # To prevent accidental output } else { $pathkey =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('C',hex($1))/ge; $pathkey =~ y/A-Z/a-z/; $pathkey =~ y/-+_0-9a-z/_/cs; # To prevent disaster } # See if we already have it open and ready to write return $handle if defined($handle = $OpenHandles{$pathkey}); # See if we already have too many files opened if (($#HandlesInUse + 1) >= $MaxHandles) { local($oldkey) = shift @HandlesInUse; # close the oldest $handle = $OpenHandles{$oldkey}; delete $OpenHandles{$oldkey}; close $handle; } # Finally, try to open and remember a new handle for this pathkey $handle = ++$NextHandle; if (open($handle, ">>$DestDir$pathkey.log")) { push(@HandlesInUse, $pathkey); $OpenHandles{$pathkey} = $handle; return $handle; } else { warn "Failed open of $DestDir$pathkey.log: $!\n"; return undef; } } # ========================================================================== # Close all the open filehandles. This isn't necessary, but I like to do it. # sub close_handles { local($pathkey, $handle); while (($pathkey, $handle) = each %OpenHandles) { close $handle; } undef %OpenHandles; undef @HandlesInUse; } # ========================================================================== # Anonymize those parts which might be considered private # sub anonymous { local($host, $ident, $authuser) = @_; if ($Anonymize =~ /i/) { $ident = '-'; } if ($Anonymize =~ /u/) { $authuser = '-'; } if ($Anonymize =~ /m/) { unless ($host =~ s/\.\d+$/.0/) { $host =~ s/^[^.]+\./ANON./; } } return ($host, $ident, $authuser); } # ========================================================================== # Initialize the DNS cache and remove entries that have expired. # sub init_DNS { local($ipnum, $value, $host, $seen, @expired); if ($DNScachefile) { dbmopen(%DNScache, $DNScachefile, 0666) || die "Cannot open DBM files $DNScachefile: $!\n"; while (($ipnum, $value) = each %DNScache) { ($host, $seen) = split(/\|/, $value); if ($StartTime > ($seen + $DNSexpires)) { push(@expired, $ipnum); } } foreach $ipnum (@expired) { delete $DNScache{$ipnum}; } } else { %DNScache = (); } } # ========================================================================== # Close the DNS cache # sub close_DNS { if ($DNScachefile) { dbmclose(%DNScache); } } # ========================================================================== # Resolve an IP address to its DNS hostname (if it has one) with caching. # sub resolve { local($ip) = @_; local($ipnum, $value, $host, $seen, $aliases, $addrtype, $length, @addrs); $ipnum = pack('C4', split(/\./, $ip)); if (defined($value = $DNScache{$ipnum})) { ($host, $seen) = split(/\|/, $value); return $host; } ($host, $aliases, $addrtype, $length, @addrs) = gethostbyaddr($ipnum, 2); if (!defined($host)) { $host = ''; } # Many hosts have no DNS names $DNScache{$ipnum} = join('|', $host, time); return $host; } # =========================================================================== # This is a modified (by Roy Fielding) version of Perl 4.036's ctime.pl # library by Waldemar Kebsch and # Marion Hakanson . It is distributed under the # Artistic License (included with your Perl distribution files). # # # wtime returns a time string in the format "Wkd, Dy Mon Year HH:MM:SS Zone" # with no newline appended. # # USAGE: # # wtime(time,''); -- returns the local time with no timezone appended # As in "Wed, 15 Dec 1993 23:59:59 " # # wtime(time,'GMT'); -- returns GMT time # As in "Wed, 16 Dec 1993 07:59:59 GMT" # sub wtime { local($time, $TZ) = @_; local($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst); local(@DoW) = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); local(@MoY) = ('Jan','Feb','Mar','Apr','May','Jun', 'Jul','Aug','Sep','Oct','Nov','Dec'); # Determine what time zone is in effect. Use local time if # TZ is anything other than 'GMT' # There's no portable way to find the system default timezone. ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = ($TZ eq 'GMT') ? gmtime($time) : localtime($time); $year += ($year < 70) ? 2000 : 1900; sprintf("%s, %02d %s %4d %02d:%02d:%02d %s", $DoW[$wday], $mday, $MoY[$mon], $year, $hour, $min, $sec, $TZ); } cgi-bin/stats/wwwstat-2.0/oldlog2new.pl0000640000372000001540000002417707005603741017630 0ustar affweblibuuid#!YOUR_PERL_BINARY # --------------------------------------------------------------------------- $Version = 'oldlog2new-2.0'; # # Copyright (c) 1994, 1996 Regents of the University of California. # # This software has been developed by Roy Fielding as # part of the WebSoft project at the University of California, Irvine. # # See the file LICENSE for licensing and redistribution information. # # This program is based on an early version of the wwwstat log analyzer. # It exists only for the purpose of converting old NCSA httpd 1.0 and 1.1 # log files to the common logfile format (CLF) used by wwwstat-1.0 and later. # ALMOST ALL SITES WILL HAVE NO USE FOR THIS PROGRAM. # # It reads the old log, figures out what each entry points to, finds the # current file size for that entity, and outputs the new format including # a reasonable approximation of the server response code. NOTE that this # won't work if the logfile entries do not corres

  • April is also National Humor Month
    Visit the
    National Humor Month for more information!