lib/python/Products/Squishdot/about.dtml100666 0 0 634 7160045536 21233 0ustar00unknownunknown 0 0 About Squishdot

About Squishdot

copyright (c) 1999 by Butch Landingin

lib/python/Products/Squishdot/addPostingForm.dtml100666 0 0 10606 7160045536 23101 0ustar00unknownunknown 0 0

Post Article

Reply

Title
Subject
Dept
Author
Email
CHECKED> Notify me via email of responses to this message
Summary
Text
Encoding
Attachment

Squishdot Powered lib/python/Products/Squishdot/addSquishdotForm.dtml100666 0 0 7507 7160045536 23427 0ustar00unknownunknown 0 0 Add Squishdot Site

Add Squishdot Site

Id
Title
Mail Host   No Mail Host objects could be found.
You will not be able to recieve email notification of postings until you create a Mail Host object that is acquirable by your Squishdot Site. Once this has been done, you must select that Mail Host in the drop down list on the 'Options' management tab of the Squishdot Site.
Options Posting both articles and comments are moderated
Only posting of articles are moderated
This site is not moderated
CHECKED> Mail new articles to the admin address.
CHECKED> Mail new replies to the admin address.
days of inactivity
Plain vanilla web pages
Fancy demo with a slashdot-like theme
Fancy demo with a 'blue heaven' theme
maximum posts on main page

lib/python/Products/Squishdot/Changes.txt100666 0 0 20263 7160045536 21410 0ustar00unknownunknown 0 0 Changes: ver. 0.1.0 to 0.1.1 -- added code to handle both old and new versions of TinyTable product -- modified credits.txt ver. 0.1.1 to 0.1.2 -- modified manage_delete call to conform to Python 1.5.2 syntax -- fixed bug for disappearing subject text editing for plain vanilla version -- changed from DOS line ends (CRLF) to Unix style line ends (LF) -- changed reading of text file to prevent infinite loops -- changed product packaging from zip file to tar.gz -- development proc modified; shifted from RCS to CVS -- fixed bug on file attachment ver 0.1.2 to 0.1.3 -- changed input tinytable data format (*.tbl) in /demo/newtables to fix authorization required bug coming from TinyTable product -- took out duplicate definition of site_url method from Posting class. -- updated message*.txt to current info, as well as minor stylistic corrections ver 0.1.3 to 0.1.4 -- changed defn of site_url, copying code from Confera for Squishsite class's site_url method defn and added different method defn for Posting class site_url -- computed from REQUEST[URL] which I'm assuming is computed correctly even under PCGI. This change is being done to fix a bug in computing site_url when Squishdot is run under an Apache-PCGI configuration. ver 0.1.4 to 0.1.5 -- changed self.subjects from a built-in map ({}) to a PersistentMapping to fix weird storage behavior (with subjects disappearing) under ZODB3 ver 0.1.5 to 0.3.0 -- added new Squishdot logo and Zope logo to the footer of the fancy demo/simple demo screens. -- modified form input variables to html-quote so weird chars are redisplayed correctly -- modified href and src variable to url-quote so they can handle weird url links -- added a preview button. -- fixed mailhost selection so that blank is an option. -- error screen is now customizable. -- message screen is now customizable. -- edit posting screen now returns previous input coming back from error screen -- fixed "regex" incompatibility with Zope2 -- added striptags function for stripping invalid chars for RSS/RDF -- add RSS/RDF channel page -- validation of article/comments are now customizable -- added new rss_ properties -- rss_title, rss_description, rss_image_url for data needed in RSS/RDF channel -- added a new property to control how many previous days of articles are shown in Older Links squishbox -- fixed permission list for manage_postings to list postings/subjects list -- but see known bugs -- fixed mail html removing the first blank line -- removed the dtml file Squishdot_manage_main.dtml -- not used -- attachment file now displays for plain-vanilla mode article posting -- fixed advertising image display banner so it sets a fixed image url -- and url now points to squishdot.org -- fixed site_title so it nows sets a fixed image url (not relative to posting's url) -- added new links to technocrat, gnotices, squishdot in quicklinks squishbox -- added links to static download page and documentation page in squishdot website -- fixed inserted spaces problem when editing posted articles/replies -- removed expire_time from list of predefined properties (demo mode only) -- not used -- converted dtml tags to new format (i.e from
 
 up a level
 post article
 search
 admin
 main
 parent
1">  /index_html#">thread


  Post to

Got a juicy nugget for the rest of the readers? Fill out this form and it'll get whisked away to a secret hiding place where our trained ninji (plural for ninja) will frown at it, poke at it, and hopefully post it. and it will automagically get posted.

Your Name (Required*)

Your Email address (Required if reply notification is checkedOptional)

Reply Notification (Optional)
CHECKED> Notify me via email of responses to this message

Article Title (Required*)

(bad titles='Check This Out!' or 'An Article'. Put in a descriptive but brief title so readers can figure out right away what it's all about.)

Topic Subject (Required*)

(If your article does not seem to fit into any of the pre-defined categories,
contact your web administrator to add it in.)

(No topic subject categories have been set up.
Topic subject categories allow you to pick the appropriate topic from a pre-defined list.
Contact your web administrator if you want one (highly recommended).
Otherwise, put in a keyword that can be used for searching.)

Dept. (Optional)

(This should be a short, colorful or funny quip about the article which will be displayed on the main page.
Examples would be you-gotta-be-kidding dept. or eat-your-broccolli-and-no-complaining-about-it dept.
Use your imagination (you got one, don't ya?)(Note: Don't type in the "dept." part.))

Lead Summary (Required)

(This is the text displayed in the main page.
If there are more than 3 or 4 paragraphs, put the rest into the body.)

Main Body (Optional)

(This can be as long as you like.)

Encoding

If none of the above mean anything to you, select 'Plain'!

File Attachment (Optional)

(You can attach a file to your article which can then be retrieved by other readers.
Try to keep the file sizes below 500Kb in order to conserve network and server resources.)

Allowed HTML
<B> <I> <P> <A> <LI> <OL> <UL> <EM> <BR> <TT> <HR> <STRONG> <BLOCKQUOTE> <DIV .*> <DIV> <P .*>

  
" border=0 alt="" align=right hspace=20 vspace=10> Posted by on
from the dept.

  Post Reply


by on
Post Reply

Name
Email
Notify CHECKED> Notify me via email of responses to this message
Title
Comment
(Check those URLs! Don't forget the http://!)
Encoding
If none of the above mean anything to you, select 'Plain'!
Attachment
(You can attach a file to your reply which can then be retrieved by other readers.
Try to keep the file sizes below 500Kb in order to conserve network and server resources.)
Allowed HTML <B> <I> <P> <A> <LI> <OL> <UL> <EM> <BR> <TT> <HR> <STRONG> <BLOCKQUOTE> <DIV .*> <DIV> <P .*>
Important Stuff:
  • Note: Fields with bold titles are required.
  • Please try to keep posts on topic.
  • Try to reply to other people comments instead of starting new threads,
  • Read other people's messages before posting your own to avoid simply duplicating what has already been said.
  • Use a clear subject that describes what your message is about.
  • Please do not post offtopic, inflammatory, inappropriate, illegal, or offensive comments. Repeat offenders will be sanctioned.
  • lib/python/Products/Squishdot/demo/bottom_items.tbl100666 0 0 157 7160045536 23373 0ustar00unknownunknown 0 0 name urlname relurl | home|/|1 post article|/addPostingForm|1 search|/searchForm|1 admin|/manage|1 lib/python/Products/Squishdot/demo/Images/advert.gif100666 0 0 425427 7160045536 23437 0ustar00unknownunknown 0 0 GIF89a+`mhi DDA472[\[zwzmrr,)DMNLJTrum)+27H"@;;WwxwlrMHmJv@RHz]T^ዀkVJTu~ŀuDh%"G~x[gZxI]Hzm{fE!"%++787X9Fife^}g{^_hnuO)*'2>[GՐcL3,pO|cg^W8^5;=6A+?q=HR^7Icctco59j"7Xd9gL&$|qMR/J5Fs],IO`D)+Pszszᦂ֏[,c3GN0\HҮqKG^XK>G͟c`yVey]JCFw99PNf4wjaVH5{TKJ9|[A2(#A.W3W̯d4B9\؆kJQZ1v.d{! NETSCAPE2.0!d,+`H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧP  Fu$@ 0XPе]6^ $Lp8`#p tmׯ 0TB 2`8 ϫ=0arWp6!D 9m  _ rq`s lWH n,Â7=mL%VA pwB # , {=pP| C2` TPCs6Xe8GQ0p4 |X1T0@L 4  QSYU7x ,`%h5D_i';0졎:{@4gB 8hB T=|& AÚ) @^Ts ߐB@ PVDbBde 8 5Ab%k @s\5V [. ;F00:<bL$L\D¤-LZ)` ; = &$C&pK5@6ńZTxM$AЁF~Ul@ @ٖUn݅ '/ tќM0jD&O4"ΰ `01AE~Ў;:<C4Z3}C7 ,z9@e:P1` > 1l {= ("(fa!\bAXB'{-Pޝ)9r"pHXi@{D#%Yp@p 2_FkE2!hxD@iP#Pa8`X>1fC21 w뀃 'x0PbbBR:9b#`$ RLa Z*TBX8%S"ՀG<# `F&x(8` a }0*V V DsiAnB$ը5Aa^A j`CІ. ,pcH-2Qy`0\&`%K*cݤ`9xhX BTz )BӘ R@s.4((s @x)@X4/r,P񊎂"OE84^"HG4 x0 VЂ-V1 |H 'ah`M--%ܰJkT PP0 F7nKlܒ` +735m21g:0溁i BC kV C `J  sByN dB&%@YB T1@ lA,6S0QP *Si,-NdK" pVH2Nw: \bk'. P6@A "!Jk U!@O؄W7LlCaำ HF2nqBڣ "80d0΃s%2ગCRIQRNLFp$@+Q8ZҦ6I.f*~B.w XKEGm[Zp/9sT%lQ [":Tr.S^bEk5*^Uҁ: HD;hpUKjb0#ъV4n}< ]hXSM V:ki $qF0Iaq=JF}0$S@h0 R jj t=E-r! ; X^A!F(BA%zQ  [` 9lwAtA~ gMw^'HMdc6 p0Ն%d@0E+s: (0Z?#r;0sBN@`ɒ<_ T20 fvm:44uPSp"*R7F-oyDr%&ʵE.r DP l}0h 6-! 0+P&Me GDDˈgCG.m XD3Lhgb:F+6;*Nq#  ϫPV05N "&6sBψsdq~Y4:%} & (@1Q'W @eۖ ntP 8 0  E s0] հ 0KTPe4fU qza5q_ zs`BP{`p Pita3CU|pCpL7+WEjx 2kEPQSE.F~A@04p21 uS0L n 0IP8Ue qw VH 31u u c$@ °SP$mydP'Fr%Fˢ ڀ =hې Y gLpU{SL>OP99Db Xc`9t'}iY)P+EpHd:r`u)Y|p3ql]P$?Lp V PV O&%p, 8],!f0T8t  0R2tHa w qă sP{pi&g M hTm@bR bN~%N9[p/0+iDQ`$ " /#`(~Q[VlyA`4`*<Po@L! V  ka e`(\` / :]Pz]p s`F d QJDTdV!Ń qU&Brpqe ipU@2`o@GCap@ AJ0aR4O+i:FSwu91Bv`>2PFU$    [f @ Ozr] @)=t@gNE4 '__˘ _Ɍp @τ LT ?P b:-1|\!{s2^YO1#Hh)S26 :,(suŤ:svgw P eh0j0YcSpx0 = 08o o@nw KpFmU:_U@V^ O $WQ ]Z{@, @ XW\h^POP:P # P@rnFsl= BЉ3")cªu P <0pP ^PV@I0DńHS88A^  oTn{ 1"Ð0, p UvP=b ƐKPV uit`WBM!  ]@NШ0!V#OMi@@sl+KZT vq&R c4zvZ±^` X sf; I \!i D"1  ɮY%a:Po  ɀ௭ r 69:06Miv!Nw@@P }ڷ]@P8 iĻ 3 @;êO@Ы\e1f@@Ir-m^ߠԱek ްJ2{\I{ mhY +e KPy-ĠP rs{Qѭ"} 9$9ڛ¡.v:fP)ҡ%FR-PBZ 7.e4{01c4 g `4Б R:'n^f $J%sEr y]JqHBTSЕ48q@K ^h詍q {/`&#G`sl46 0t1H0`.R=Ԥ&Ff [ jZ& E" !U.( 0T6 @6: }Ɵp d @ um{  GTP ?pX { p $fUl@`H( {4zzͰfH79s8Qza6-`a,.@QYsW;&𪺲& bd P $ OmpL<R^ A |ST OB#`d]`3g2T! 0|'M2p f VPAA@hQLkq d g HrC퐗x89D zaHrp42>b YR|;>lv$ \]e}_NŢݹ(e 4!ǰ] F3 ! [Jߗa&+]ЮP$VY=. 0: , b2`s\8Dm?f0O -]r9(cZD= ˭r O  O0.@MnHh `(gyJg\n@#]I'+7 K0 РJ \.0(!m\M;`;:KT >-g]u}ژ`G-]3fH`фENFQ2pG$~8(K聤@AIT-0A"D"[ V$RW/[ X`AUh5k9 4tt9'k֪sZʝYDZ-' Р +U\@ٔ-&IZ8J6qڶm+wBy N;{eH g D^@@EE֤!@T9db)$… * bA`#\`)YҒ(<Z@ !˖01(0W9l_~i^b+ά! 7.ϔ&dI\>J(gl +~ 9N 2E{a$X.eh;XwD \QGc XF4R8 ( 𡊿 jG`!bEZrBPD2[DÈl@`>9ĀQD& P^r;2:H2fX5X pr7 518m@dgX|IHP81QQG 0Î۔8 (1$bA pIJM U'%Dal@b2G @Lb6 H9і[Vh :нd#/ 1w [6BzUA|h fp!33 m{;= ] F!LX9cw)!Z 9w#8@fT\A0|c@"f+p(ՄYQQ=8D,X8F/'0 $2@Rebn#6-/85Q 7 /'t0%Kzq8V5;xĘ/`8PD'{\Ғ$ ͢ k H CC2xب< uC°`>IPa@= `U%P!dMQ Т,U{DuLE,BXB|j.1d@lc͈ %h * HX #aM D6ؤ5KƃP" Ȣ}#1=`--њ`0Y9jAR @ƒL! &@D2̈L!&Pʃ30q1)PP@ p@&*E0q[8f,su hKp 23Ր9 } -WJh6  %8p,"!Ģ`F+4 &H4Y^Sw @\_0A~~e-C;.'Š)I | Lqb`, x)@Q,PL#"jZXǗD`T^[$"J!oZSMA`P i| wG4P Kf l`lQ2 n8ZxSޝ'iE3dp`b2u@.[(s80DqY|DL"; x+6 N@1 @Lb/^ Tb8 Lp@ӆBp)hj/7AK,*e&7xB%-)_S]G"#wu s @I^K\Z A=b%zAZ`/K2 0Ҁ|+` ,3`8$B mX 3~j(_4 JXW,Lߒ҅[FRD ;AI ]8cVbY[VBTzbnEv)U Y㞐 mi3`y8"-'awl ,Q *!1g[Z RE T CG1HB ,@KΤ_;2 RQc=B NhGA҅uCC%|^&` ]]$ۼ82 F864x ls窼8ۈ0$6&c#`)B[3pP<ֱd5`,z5HR  BA2Rذ%ԁ61LЇ$ Q(vrVPSH Er]X3 2*:EdD2=,F4Ф6pPynЄ &lM8k0,2HJd@`ehVAh% >>X@Afl J#@h2l؉PZ rˀ*1`/sjy6 @Q>J,pI@#R`f "&)p^8^Ѕ]CPF',o 7PF'7Mkx7{ +07M%@x.8jHE  r؄zͥt@0hJeh9؀n!S0{`dhe@i. T$x~JT@. 3x3`@;/@ _P5!"*Umq!L0i@%p ؏`kuR"Pd uTCraXRkԩ hx 3a~C8`=s\hdO80V}Q XD1J`+T-/ CeUX 0 ^X[}jQH\, 0Xb8 :8GPk.R ȅ!-3 l tu]HLh, (N1+|U rCF u0;ޏ0 pCA3ع7؃:̀YR 2س>\HZhh i^Qb5Ƚ  )څC8  pG GH P$0΀ HUI0k83qϡ/|H`VȒ%O4x8e$aR a" @@xXJ舮1))KMiUp- f^j 1/؋5(]Ѕ`WFZ]',iaMBO0jO(jC&iis,ÃNY q`HNqd/e70uA@cX8+zM +u„LiD#؞92؂)02rB`쁏I`' _GN0 gFa+޽@bY`X<؅[] УFh : (o'PVT.l̍ن9ʎAnAPs4m!؉3 @'M`E8޹&%B5CuPЂ8\\'(mً11Hĸ&6S 3 iMKq8ȍԁRGQ/FRX*E+V15p9 Wƽd} MbظޘuhB+m 0'XT?;-0 ˂ n0b *@SX*:/XW@ .O$e81aDpl.khq?pkL\%NIRzw`Y77kl _9 mm(ЁIxxPM&xh"@bP7#e5Rm# K6#c(j R!h`ȀOa򴙅< X@DΠh G/)zt70ɆJ~ʖQ ShhCӗtxݻx% ”sZ}A`Y{9b^ =*0iJ ,XHc`-/cmIOv9p&xRkvW y<{{EtHԄLȆ}Hl pho2HL!(gR=~' )R`"GYp'DD`b6(Q03bG:  2a"m(@͓X|BZ@H ,2ȋ^^| 4,-Z Jx@:nnhTf.$\,lE.lڄ1kmʶMcv:XZ]m^Y2Pbxn:8|1‡È"GICt@I$0単=H1Ʉ 6Tѣ 2h 9Tr T,-`PLT(X,0|'*8c'r ED5Ts (S%/Pz466l 7HgEs82iݣHAEYm pO!&kP =DžtŒ0'h!2'R l{>HF 2(K.K#MpE+|`M  A r 'u|K+̑ UtAH+D _ ئEcBi6h4DQ]r=|0h`E.p sHvaf]B7qpG^:5x;*`oP@&8\$`ќ40{IT8PzK  h _ E"MdPQ P@kPxj%%` @E EaX@ `F̋Z @ p1\UeY!<5Emkc SQRdHD1W`B ;pJ)<}'@*Ё=(BЅ2}(D#*щR(F#!, B HP`KXÇDhŋ3jȱǏ Cj @ 8@'@8qj@Qϟ@ Jt` @/ <A / +ٟN,6IVT@7Âq 8@UCa *8`kS~,`@  D#eb|9 ,xP s+t8J3NZaHʄ020(F ,PXPDV|9!lpLnPmqs=`OD60 A 4SAxp@,TEB",2P\A0\ @` TPC\m'P0 49ֆF}gL7P0PM] @ AtQU?6P 얕Z&`rE@@ a]uh0@ V] F 0=08d@ -r +?# r"w[üHC ?3T 7p(k@JA4\]wM8tNaZz8` XnzD d5f @ `B6.~0A '8C'"g Dž`mcH: pࡎ C&p*Fy&7 AD,B 9u` yB = IJ&Cp2 @ H@*ЈAX$B0p \VOW'hPJȑy@A tin]eOt@XoDA.EȄWqT!sH0 } UPB ;3 O@ڀ0RAE)0!8E4 '^oHh@p8$ t?.A4Ea2@-4(1rA l$Ԑ!A,3!R̢G=xC /xFȁc;ArLyއ' tՐ50 "q?|!)0nc6;c7N," rd,LƁ6!ߜC{b`MP wALXҠ+ M :4@cX.Ö`U?@R] d! *A c pAP@w y2 C i0VZ Qo p o p P/ AxD70@@/pqd\zxFqڰz DH p P `KKpL%JE_ sE% W4-9'` ?vh@v!@@oU/2P?Ab t'hv7 9U s'X!mPp O' E s/yoP @]g ]e8qK \gۀ gSHdt1SH`x{ ^1# }P>PIip@!_4KO GbbNNhr`JDp7rEj@@cNQ #&P6;!4qm p6$qX 0 Z  h@;T $x '0 Ђ@ O:[ް/p!bSj0gz Q[r 33E&p` ])psI|9G`zH4NJFj @ (J)@| .]d6/PI-- `>aR PM1"JL 1w(EUN^d-I P`ZPF E)r@ @ "- o 7.u/y@1Xݰ\]z  5u 2Mp3쒉@) TU> ?]x:8+MJ++t@Cu@U™] a0 e [0_VХٗ `-1"#X%O*8ZYAO$nP @, GDo tДq !\!gِ z\: p@S5` 0r@D0 @Td?ii>Gl j+P0` P?tAdRbJ45LaaR ~v+6ڱ> P ` j }NP ZAn`S@O\n`f U`6/ JdYWӀX`ʕ Qp [ Ѕ0 0KP.-?o"S>22^q,P='u09`3@a1K)J$Y{Pa/P`riw _9 XsGXj N ^ @ ze -:2 $H @ P@` d ?vqE!;Wj СIQO` \p !pR S]ЏS  c]  3D%;;qG)SdU!cr0) e@J3 6%0$[Pab# P| *6ll$]X TYP ^ X4r# g1% ` [nmLa4M!-Z`@gH رZR܀zO gaYG`S` *2.]spS0 Vg~Mh@D;#D9@\8.2oa]g 71`aHKv#vmGKl ŒİZZ(!ՇXpO 0 t@[e\5`{y ԛ!  9@ \ P7 { @?aCΐ {S `P%i ]Pl j`N`@0rjMd[p6v60*S fWa@&;O P j`$-\V2@<`7|ܴbO`wK u*Xz-7p~-  >߱RAOp Ž ' ȴLQ<.4D[Lp~\݀` *!p0S 7A {^Nq~u #4xj##4N0z*@y`q$Pv`W61q ,T_Bs ; ^ NŁ(gP 0eO Pp00`fJKʳz nPk! @} _eˆ-  !1p Cɫ7+R!6"( Dصl!A@sgh?D4BAFK#֨QI=@I$ICL&|8B0bC#t%V-QO$@@Sl\+n$Ç^  XERr2t 6#|IKI&j6}[)C*PpS?VTjal& A p0Q۶l'}PƁy*<@Z av.+:1c.iQ#s`B`Hz*z&hJ@"%hZ@x8%2N,?ez0@ ŦV k7).q Λ &lReĠ((&Ii<3f1'# 8@v' <&ƐAIw *Ыjh FAbH nzH(ҁ 8ڂ #X. &16Dr0Nh &[lH _PKmYf&jp[2t>Ɉ8? 8&F_2@ >f=+!AOf1z@Rf`Eqڦxgxa ,SX "VrX!Xа0 zء $r .jȠf!|v؀^l\(g%|k @J\0J4eVIW) T\q8jK9:^`" љi alƙD xȀFmƜϘq&lv#XW,m'ga-G@0"0DrH~P+J6/ Oc\p JOlI:$`X-:#~``3;Zhnp-lF@5(7Ʊ% )؀T15*6 m|A}1` mЏA!{CM G(CpD0*8 wt?E*X!)( BQv Zd*n @#@H,`0ɈB@@2( H-|%%p[`1(!3N5cy/R?D?tԄF(`H992W`?@Qd ?#cHJ~R):;\`#8& RhBHAt >0n8N.jP$3 E<h'` <A肂=$0d̢ `[J lU/Tp`jWA#`v]IW!n 3>vLh ?#>l- /j1 z?.4&AC Z܂@()rkt `?OLȀ_ ?IP680 & 0 V JLSoYdS&#gU?B[(0@+ -$m0Ԁ`_K9R }^x)d|-,1F1P3WdxIHE1A?@PER=eDx:*@ .8PXٗ5<x;L=W@HA⇘}92w!5QeC!.l*e4@IJ2E>x+fl:nz? ;Q@0tX})H!dXdTcCdQn` xΕP7 %9-xW`,xJX? X`?P ,[++I'/0 XȎX*g]~XP206iDP8F耫)hϐLІlm`5`Anm}h輏ȀªʀfP" _q~`L/p4(ٔ0@#!}H)Ȃ0=)(- T?bh%ɅTCP8 0+r04 Ϡ!]8]XC1x S<;Y6`А*1k+XVhjLmz50fF"Xv ؏7hYH ` Ȁ?c(ىR4zy<`bZL#8+ЁH)baO>_PK KЂbxZ`Zx0XJa;R@̩9 yaU a<H㸄. H肸(h7MYlFg܀} !0VH]H xz&`u/x*( vC83`h{ȇ h`dЂL(p$ (|9YX?XĐ.QX gF1OxL988$[UpGY`Բ p#z[oxj*XOo GO;sIщH,m@q8!8f73ţ3`BYXxX#Ѐ Q#駓ˀ9 +8'ˀ60340@a8h"B&aۢ iQҭP+/g9(9̀O8EZ3@}NO it(Uv4S4@kF`""gYh@8U0Bp*0>uDbMXxMP>d ^^+@ UV O E3ͷ ܅pݢ kake2So-b -E]cnhqH@ȀX8sj qჽza3@@X+0+*S@!XZHxZzA#8XV3>p[6"g 脟8Ё0!%X E-4u(Dxu \O&RZ8,@)OНUXO_ pb@b^p b@`7զPm2^ BEnhO:>LK`ЅdخC93HvVKVդ88,A(((;0P[KЈ @Ѓ ّĝ0\ >P EfP0X`ҳO`Pډ|„O8ghj18?Ѐ\%ű;!gEZs Y2NkCcIM؆)3x cmh`̃U{]hGF90Y}K]hG>  bǯ,Az N6#œthY;(hXa`8B,+`#ᤃ'/`5H,GЪ H(x[L@*UHU0g \ p5]XWL.&hɖ  OK*m=KhP}H5;,Mn؄*p ȁVep {g%V`v8Mv~.)ȃU";DK %H$!磂J=e` ㄛqb x*P.ɧDAXa(#\@z9G`S@޸e ɀIFx87P@hIfdmȄЄlr򇩂 V`h|{_0]8upʶ^aOf֜5c;^/h %XoȚ p0ξ*Ѻbu`f6 YWPxAl4 ] 65_'46H:wvy牣Kx*=?j\&1ƂaJ< ><@ȡ` ,'6bhT\G'L&PʁSɷJrF,0x"MX΋]Er˽'--!ɧ| 9g>VlN" clF< I -xG:'.:ބRır\Z0R! vGtqJ!Й.$ It [ 8 [*p h@&4VHJL Є9FV%& XHAO"sX"g?U Sա 6i4@O #Q9/G59 F'8 N-(aBj  @,#?b O@!, C Hp` ‚# phPď CIɓ(SDy@`PeGR,  BTyr\ʴӧPp ?\ ER` pM6I> ܻxSF(`@E CJȀTP- Jܹ@Tс]0 &y0#R>AE0‚@?tX` 2\MfHD lH*( ѠQ x T D)`CECuБJ ouZ|I!)H~xvBXAp!A0u@Lh0mG!tQB]p@yQUE q)a21]AA s?] %`B 3 ٷ@LTQq`oT}E0@ 8Ѐ[ U0!V ܰAxXptLpЀP @V!@LY$ff%A,dIgdpY)K 4FZjd? B$$AF0-PxMUEhK ?01 0Z S2ag2QAMP0Ԑ q@Hl6 gQAjk *@ 8Z WWp @ D1kDi38 .xA cрŒ!:3|!UԭNT\ eXPD 9o )?9a i1I\l'až#RiŒ(TU(%|dao4A`1G)uQ)ra֮tl4x@0:y`L"}mˀ># ɸ;pq R?< x ;wCqK?(Mڳ˕&Pd D`?НN\P0 1]b0 IG/V;>(alqDŽ\E70K3,+PP@ R@P3 )Tbpc8 tAo?.7/ 8PYX _? &|[p*80zȣGHq*`B@v04\AKq`F?)NSUdDW X6 M,B!a  Tc ڙ`BE(^'4B E,X(L"bX/A ẐIj^ oT W_ X֠ÛHVBA Jh#c ZE?a}$cD` qN,nrNwIzO*Bpr"bNd._~H! >?n7b> fЃ` A@ "0,E-`6FSx*@X PXl 4` X$0+rRu8"q&"o t??T%)@4kdC6 5UH@dUb둌dxKr (qnֆm 8`U*\qN8 Ԃ*\ M &xaVPe@ ڠbpG 5 `M:& 9@`h PrN0'Z7y4 0 &@/bQ` 0)Pu@fpPP![M@i`tE1R@{I=;@oPJ&]ɵAmh j6@D& 5} q}^pPpjPUk0 7T5u0Rn @n0LP'hu /P'g`'  b` 0 9mxMu 0 (`8;8C`~ rbprV`upPh!% ȕ\H"ssd@{;5x1Lps Ő Ƈ1 > @q D Pp @ 'I 0jW@RbYw `="6j lЀm'1pcmX ` u  @%pdΨhNG4lbYa^ +/ ~V+P D up6}0ŏI@P !mQTg + {X NQ h `4 БpW!gP jnT7gD @ V oP d ,#Ad$ *b!ٰ bI ¸eM L N@{bЖ7xUNd/ЙUqee+ j39PDDPth[\HI@K0$u.ql${1El } *@=` 8st `2t0m  @%*ǝ"-CBWؠڠ  ؀StP0 wqHkdxb}pvYKUP Aq`<< hMD:NtAUP@,0f *@,ڢ^|l" 3`1^hQo 8 x+Ӄ0^9CPP ` HX1tpjTE ]p!5>7 0 / p Pa})H  bP`M00pИK@]mN:$ %y0u^h h`[LF`>a09ED"(/ %q*tEc1GQ/! PS-rOq@ ݚ `+ @^ @U~ Ȁ bevt 6 0j@fk|*$ @ ul` Ȁ) Ы &`cmNP]੝]n8CUP;"v5fL 0uo1/$HJ[t0y;w:*f,>'@!hv^p `pj^P TϤ 0r@R),t `$j o4pk г`a|j @M Ѐp _XzM= V6]qPAc4] Kxֈpb,1wz]:{q FHeI/\H rd=&q%.+38 Z`ŀ jPT@S(PUP 7 Q @y 7)74tZRaV0 ?LW6 XՁp ċ`& PּKAjr}Ph@voS"9)p7puA d˅%`< u;eb&L}s( sɲ {hi06 ` ~>n&\U +6p@ 0y@J @JtPle*p%6La+` ِ 6:n' \0 gpDΐ J_;^0W*/:a6W)Dbic۵Tku[:0=]2BlYQcF]w 6^,#}. 5P 0 @U SA4x@~L@V @ 6` @҈QVc]Р F`\  3 m V ^V⸾N Bu%Z˽+Z@5AFPI 'B@J}1|A$6&\<`/ y?|shP @g_{40 {0@@ s4khun5 gkXZ3`6i` e,p cwx,NmfCK@}B$DEfSr pA4 U \-͢ݵUd\^8?+ K }[- s +y  0!$k} &Pk&$0 *f @wb0% i4q `B*L: ~$ UFvz*Pe6`fS  PFaAD{ˏ< A-PE|=;[`2 0 Ks P- ,}}+y -U0FhU>l/QZ2 kf)j 2n ؠblPP ]TB P &r,qЙm`]7ؙɪ,f-0-`aFP76`p} Ί;8Xk0x/ <  P @n}f+opcጳV2UL (߿4xQ͚4kn&V8Z5::8@~R bԲaӦFqhі8c heOf @0S@mlN 6"| ? ]UxR܉&T<#Xke*T@A /y0')*zH$1,PgF ?mdHؿZ85J ',OrՆ+Mԫ1d`jY挝07?.m?is/`dK tA7 6I`'E Hi%!v+8РuG+E N0,.F㩀88؀$z!xx<@ LG5HDDa#x\hE p [&fheGIR&f&=Șk$7< %VIA$}41jom!up *Y6tdB% 'a$ubƏah[U"8p㢉ìЁ }, g"$)a:x-(!#y8`xBj!3 xQFaS!j /S@&4`!XO~q@`.'`~ɚKPBtJ)Q b!B XX@iD@Q 6d@Rb^<#B8S   FAh9l@^ :lK G.ATR/Qt.a#hc8nU aV |m Yw|PAEș#9 s @_ 8@) h 9R|`{@*15;$ "B~VSE 8ND/HIB ^Ęh=@t?pxp0_ F&,HFo0$9p{\D<Y,H)el[;a,%(wXтR*1jCA ap41lBFAG cxv!\XA@ 6H@ q`A?IT% M@ '=ъ3Ҕ)©60;`'Yը:&pЉ„A p" 1Ac 6 B5HAfK@$6d0 6&xEpLwx,~ 0- z9 @J|pL?ta w'2PNll9v` Zń!]f UBi ))0a^G27EdADFI܀,y&40y@s2D0 58Δ/wĩhD-'@B0D gw! b8B 'D#dO\<?hӀPmC # pc@!5+a:p<i3Ȁ!-s<ԡ`Av?0 ؠL Kh|C $_@u@0aTь Jm1hn*pSĵ`{@pbt L675E]Bp9LݖFxHR6Apy.Au@LlBP!8J#!v ĝFV$h@ 1X?X1hNjP aBP?w5-.<by2>@CA[]0k>,$ 5P5'@H@*XМ % ^Ѕ#PCp.@?h$3?@-@aXEL0$6hi5P).{$}*( Ӏa8i 6v`%f(64rpZY ȃ/ʯPN 0,0!` >3QPP& ȀXN`CK@}s !( a ]bppN p OPQ '/ mЄ*P,q^y #'t3hfH`h:xa>hux0. )j1 ( @X2@DDB(HQxrʅ'xPXQX@&/pJ9 b8EUaГpxk$Fho p@HFM;phP؆oפM![R49 N`tJ($BHhB(5$ &p ȅ!X (G_a (;-2pUY&r7Y(oؐ ( c2P{ &c_U@Xd:jl؆`eЇzXR@ƪ0]P)/: y/ ~[ `q\Ѓ/`* )](dF҃N A㴌-40 Ȁ.""? P('} &x[_H-U48WXpHa8O^R?>KЀF7h idnGfj8H]h]`XVP 9h{ChC`2 ɔ`8RV 5(׼;0+%E[5P0$j @+5(5,Xy1'JHx,p3j[g !XC1ZpSdLΣ乘B; n(0 ss @ChEd|8j9P`^fXӴi!d'&̠Ҁ4`j030d050X50@/Hd#΀g,iB|6H ׁSlkT 4;0[Z8Rx@ج c@@b? t?h &((-K_)>(HzPF%`H`yHYȁA%xHV#hj'.#>00Ȭq.4NI$ 7,|Hޜ7!o®f- tt}aF\hQ1T(p1N6(:3 j9P45(zȗ:*}mII&C" & h_XB|s[ r xUup9+4N5 \JB  @0DIK*d|qxu!fIuIx7Kcs'ЂF68'7RJH^d3Rpz\!hY# A$;mp,}ӆIOɣ*d/q1Nׂ; "p IP2Bꙵ pRP۲ vQh5 2(^L]q-^FX5c $:6!b@# 2e۔Mra-6q LqT2v챳O{% v/٬Y @2,HPbPuKC6"Ĕi? IE9(フC p"9F(A&-@#H0O[䆣3L6#FĒV\2kՂ/(9=hlegEVKCE!9K?&Xf $A^hQ $sޱ5*I㿎^kS0Q<`:  $K] $p#0L)8i@'\PX# DaLLAdey5G 5DܕE&$f >.]dFQ ((r `@ab%p+E 1 RPU8 2YhA@4tt"H2%}C|[Kp H<*O0*BApF;Npt(?ЁW8B4D 8G 8#pAD'`X$M]I`B=CG;CO1? Sp-b£@#F`"-Z@ L1ghPs 'e%/ Ѐ8Lm bj]7tCx`X60dŽ(]3E+ L`nvuGL7x6rt~p6d H hKr :G:+-!,T@ @CA`0 Pc `J:P Nda_1@! vIL 0FA( _nJxB,*$0ыx$Cc#1U| @@- x4`B#ܠj(4d@G' I 3(z}ld>,ZaRAq8*R `:|8x@և E@LXuD %6P ˪R11 @n? t 8Ѐ!@/BqZhD: P& R /DpA#PUp?< tq m00D<5q$_Bne,bDeR G@@ C;ACbd 8DWM`(Yh!(u`շ (u'< GH h]& ?D1 Lppp7  ,:F ?p:u,3 d`1 @POdcL30UN:.w@pCPCJG #q{Xr/8H. 0O`<`KiR H0|  H`1<87cGPB:PؠQ<vHb5($6hA &<Gc+ )YeDG_2IPHmmeQd`p6|"kNY':HG;ܱ?,L|dErr\xB¥(p(L`B`RH P0PGUxrA,ۓuiSsF܀xE @ 8?h_!EqGL}QAo F$QL_UACeތ|`$AtUM IpP `U ѝ (yt0m4?, ـP  b$D!V!NR8@?d^B0ALD`1 lʎ_8t!E 0@<BPm-*nU!+np籢tabY.>#x?X›3^LLў؍x`!4筣;>?;֣= ܣ>n#=f>@$AA"K@!, C HÇ#JHŋ04P@ G(0`5lؘ@#Ɨ0cʜI3c,qj(:$!Tб j ap  `"D*)2h` HСFU "6Nټ`38"|EHF fb Y8FB  @@B`rB=A;N᱁;'6L2 eC&0i0vPxpZjjݐ p`A'n, ,х0 T0e@l UL6WNe` , ,]TOB,c@| xEMp0]G>G$GC TeHu_$ t㆖A@4?aZC4!aB Ѐ8Uxoq "YVPd4}$3鬣: T B;HLP~Q̂#4C -Cq丛qdD<1=IO164@ `!PZb9w5Ж 8 !XOd@e!LVV/AF5xx?2Aqp[ARlۣxЀY 18"?@&z%;< 0<G<(GU2^YP@/?-? |FȜi  ='Q4*M MO(8@Tv4 XA 0KT p9|X*XaBB-ckЁw_ `QA"*$f&*N qp?4 U#p!8@=yY:xnuG:A? я-0 ̀08ৈ;X.yc ф&1,XAҠt@ :|/ RbP`&b>iX P TlK@,7G` ` / /VA Zbh_2 D#xA)tA BY*BLЂbt"_B_D< -80qycp'dxVLOxCB(3 n W X:1Eأb0rB )$=${)}&A d xE* !@&$x@0P@h^Bt` Tn'T (L␄Ć|E"QyG0V gAa`~"=0 dc+5& xj( @\h26wL25 =XTdE# h4A| $H@q PԢ pW`C$|D"!u΀U?$|E AϔF5p^_T3;5l?!c Ʊ6H"TV G0ъCl56x x Dvp2 8@8ȅ hEȅH˗kl1""!Y?Ƞ) Q # [ Xt@ ۢ * LhEC Ȋ +- @F4,KG5^ &l" 8#h1aY9(D1!$;@mWKE>QQBC6B@0esL]6ױmB R`>VK}F)?CB>dd|4`N(@X$ @ `,R NzQ DP S/K܂Z@h06K\BPSCk Jh∶@qH@tъVpB d8 ?XiGt.D*EN 8&XV@'\;bc !ha@ ؋]! ۀ v 0m`} %xc )0@Hm@?`E4eZt5: Emef@0 *3 `f7pf\nN`A}H':}U0[@Y@ ~| P.,+'} g7Pg` `@  g Kp nPBLPu]ˢbv P:s .Y> P ,6  ƀ wX PQ 4VP_{ ~@ 0< Vo ~S @._`j0,PPY @ U` Pc`xDUu Z?!0+p2^;g4p`tw dC00!Spt P:bcR@P H 2'Ti g ,Cjp @ RxrRP! bpW@X 8g L 0 mq((/@(R PE ;SEZtG'/;yи1`P!Z u2EV`rpCv<"s.qƘf0&}e=}w U A+J` CgA pL`O KEVЛLBx5. qƠ qv(6 pYٙ PYXP D0?A0 @}t}p;OxV/SD yaVP!h@)G+` 7'A-T 5\tb!@ Ifh1@16 P&3I `| JА lWh P1P6Oeu r0E U9$A`@ MܡWtrlZ`Xڠ `P! p  JcW0f!~q {ð;OO1[2 X M Gm 2@f&sy9C0.  @%>4?L#>5^xPj  ' p (7 ^{(TV0u`D] _C8ְXL2#`_lٰb@ f1 pCVd YO) G+;D :S 160P^0gGD@!fxK  yge gU _1ehC P4?R8,?^` J^P F P 7#QKpAt+o`LP2IK'Q1 hـ f P @ ` )4s]h%pOu}@GI(ۗrvhpj0`S9@ ,<)pp7P!0 44=.P!`E<| |Q ^4* L@: 1 kd rzaPV@ `/p Л5+@p9RU Ɛj XP@ ʔ buNp­ Ve@#$Qk0/(E;.F\FdlQWQN i@i!4]FlWQV4B?P#u &@& Y7 + /`TԷ` 'm~ DpA P PL` Xqw5/>1I l,0;?p(`Ü_p-% :P@@.YsA @5GlGNU}w#0 U"!Fӡ1TP,0{U + p?"lx\ )X <` qd >A`AgPسx  05lj, A( `Ԧj Li U? nLP.%SZeQ:˸/٣ͱK (pFnwGܨzAfaL p:A±Hэ,q-O "Q U P:g0Oge p-U fcZ.- 1T7E pA `Xp0°gPu>dg`ְ;p/;-Pm-V gQ!GEz`%'W,d]۵1[A*Ac  * O-^⨝0Z K P^bݑ/0y5]L銜A Qb ې l Ba? mX~:̠Pa`,@qE2q)r8D- %+16s3I 3 4:rb ~PgL.P4^(C^;dzqɽ4 ܟUPunxU Cd#p@g  `p g}# `` ;ր ;mNa2 j(eлx+D\(K+\{5 @O|)06J 6P0V pA&UouP wE !m@ p`Juڰ`Yp/H0 0 0K'm1H w3 =QĆ$d@ 0#Rpפ E.Pˆ @ !bÆldР$=CB l<9 H*<'jR5OrIb- H0P`UiњuQ$Ą5iH%:L@) 6cj `ܶO^VȄphIC)@t@gu1&ؽ'>.A2`f Mp!Yd8.@ɐAiP#<KB (fS'$x d+HlQ*`&pZVaB8j2k.j"OZ be&2I,1P2*h?JX'Azǐ*`  :;ݓΆ  Y!$XH!V#­ <(2P4 dp & :~"F,ExAbr_et >0"H!I@p+< 4'>th * ?8`i6pJV 5WPrQi5"LK@bne9Hhl "aO2 64wx4EvA dC}ih."av8wyg8i.8` 5|d!":: $@& ``vȧN{*lwq:`P ng%jG85x_{1I`cv* Cm-p Pds% pF&  `6B{؃<=!8`+GրC QNhW dOzX (#T@0 %U{a'( Z*8e̗`+, X P aDCͤ#AE! ! lRep t)ep "] *,ȀFd m~ð w׭px> duv̨R"4LԀN\` (C F ̀ .X‹8B-0_*T ݇h𐇞qi /0 b́q@ЅK#p?^R` p@@/5XDj4 0 0J!N |>aM@nĆ @`V1 I zP!3d1U0)@QX$1^ (@@Gƥ  .C8v0M TC` T@h6-<hfI"!`@"ъ`'dvwG?Rx@:` QMZ$ `U`Pݾ>#AA`g $([ Y0A \ z`P3) ȅ/ĝ Y q^`"SBƘx %H.vA RGѠa - ,HN?BKxC/mCs8m@cJa=0sxZABT\0? `F ިJvSr mqCPDkLxC 4JK)p+(Z8'811bx_x&KJX ,@R(3PXO8[bpi:,7 `lq. ʀȄ!`c{ Ѐn2`hdHV@ >4!xhExI2#@dp#0r8H Pu".H4<Ȁ#,H>DN10A_F Q(P15@Jgv\ܛR:::9)`UP|Ȁі`@?oPg 80%p+!pP`z:``9^&`hЀ%uHxX>::\C)cEp3<'`F " !8#(,(׀-̀B6NPA&¨ | P_JpSURXCX!韸j lTK:(aHJp0(qdGy ,dVȼ!08y!t8t0묆4)р3d!婫8P9A00Ad 8Pe+@I?A<  N`2=X@8^(9(U`:Ѐy CLrR`Yin#4+xrP@V@*/qcmȆmH3HyЇf̺!hfV( @y; 1xPtH <܈ kd[j`nT(H4'PST3@~*Cd%؃اjZxM X`ShD899`UpU `a8Ep6x KoPhNYK(6Э݄mñ-lhU-Ȁ P{Sh ~D>dhV( g 0>M >N@DPtj"883 28 :\kI`(t~J;0)~; *ȣq\# !(dG=X uUH<ZO8aRQ. hlzi$͛P/hU PsPڏ[dy_(dЀ T>v8Ch{6X>xU`:l (BЃ"(!8w9$((pY5+%HU;&H!+o: 6V Z`a-ւpp[wCȀUPU0C3TZ_`X@ mY0BY@7N&Єk؆qh6j jP39]HzE`0 (deZgE-:L8ݯ#/*Co IX3XјK50D/ymL%Ȣ+`o4ˀC4Q! `8 A p Ra b@p C I=ԭzњO@%i5hpc؄l!`jsM!C|d89p90YhAFQF@q;#(A_B8:ܴ &"r0[308V;Dg(e@IIDa j˂=(&Q`8!'XȅT3H-$00je.\MRP dZhYp`Y[Pb `,ЂFrmhazEb`PdS5=@V* @!` `_(!wr03 &Jx -(]vjyM!ݓ @N9ɒoU  H ҍk8 A`$HW RƇ…IE  0Fc1PӂqȄn`qPS̨{e {ydp3؜~|A%iAAp逘p[dT#h:34?-=('X!JѦ?,o6:R2jҪ}'`NУ΅@bmpvXU(TgOm7:\2.Hpj%(;!Um-Ll=Jh8f`Z{yezV8Q۹Ё4YItPf'ϘԀY&#B1(bA`@D},xp.A7 E`BfD%pfAkN,WH4xC ^p3 8:?)+70hZA8uL Plpz&*V`}{y@!O`Ymd8B!ˀ?0Hxhxk Y(JNNhwCY(FqqHs0Ň,JFp iOxY Ƀ/HfHXYa* FLp6ϖi Mqp!p{`g{sfV/4 5IuTlrL@+ fq!E#XƘ d@#d 1bGK20HZ@zO,R+* ?^ʙ374aA7"Ys2 ) J6mI$l @hX={,X=yfj *Z%@?@Ń'ݺxJ 0/n<8lEV`D<-p"XL]GI С(䣓@ <xD.\XM H^p47 pu *>Hypg *8x`ѭٜ`l|Ն85C A{ '4 Rt Nw5kD@ $ .@P(XD 2K ǣ,'x"шhU|BHhSOEY9$ :a`H^

    P}C"Q2-8F ȀOL's<`F JP4AX@eV{m^H@F!s@ X`.T 8oE p @" R3F<@ArQu9cP;TA6&C"$($@&0ґ$חX 7`t@fS$ A I fHpL:B1=L8E(ЈA &l4>H@p:B/xL,Ta'` 74FpO5q  "6@F jH@f|ʸ?졏dmWI P h:*A!HD VOH%GB$y(\ `A#k` oX@m>)` c@lGOÁPHP!$r*)jrPu9Ȃ<4mVG/&4ʸdrd4;Azz`AW;Vh@‘F/:~H'/XɁ[1cHBv > C&Z"ЀTq(0^T h< -nLW"ؔ ; o1" l XPlRX?dyЏ19X?І~jQ JzdH ZҐ#9'< #%Hq?+A :W1RPs>ԑ1H^0S7h@-Q C["9R@2/FZ0q,b R  хKax ] mpc 1|]H l)9 u8(p8mj嵃GT.8@/䲂08P,@ @f0C'npH. 0)rG C(u$$ /JK (|! ŵ a0 !-pB536P.\G|n’@#6qpc`@c }H2ZA G%Bj!R>z%5?\`R:ey 0 6bB_ @ _h` FX PB δ 0 W.isnL`` @ } ܷ ڐt@^ $pOpO`(EpZ v1c`cP0 ۔Pkgpp" h+ `˰ %T`pcxTSceP)`6h]PE6Rh v (q0P  qR"f 3K(@ qnW s S$0Q @ `t Ep  `  tP p c ̖Z2=v}ptW`p~%>`  N4Ew F iy p)7 n\fRTm =f(6> Qq B@& lhUpg P7 6 ?{U t' jWtܠ` Rg 8@ } b @=l$3=/@AH0X 0n-+`ɑW790-9?HPzy>/0"&= `g`J5AhTj0w ^h Ȱhe 9Ɨ]PjRTqj؀ }ۀ `b ) M P]@@ 5<G#_SqAR+C`)1v70I#P#1'f>䢃N>r^  ^w& 'P 28v r 6PC0 00;0S  VСPp硳P :?@ucgPZ%/LPPVH[ ?I P ,u@,)P \ _z[ Y0J؉|P. RL9 .U l pps_πW&p@Qi RHt` @APpj P  aL_%P p~5 :%3P}`'U0%4_Sp1PXNӊHP7 E#Nm5 P@WpPSW|<H|  &8(Aj ?j cYk &@;*ӥ@HZ( }LVjDS j]a Pg`0 ~ G`<O =zb{395UC5#a`a*B %#PD @9ABLO@۪g8 g @A8 sP `` jyFB:ѩj`0  pɴ p5ٶB;w%05Ben+,[&\&%a0(Q lI ` :u  ( p^%CA,A vC08 1`#W] t [ p) P`= 0@1Vle(c$ ` sN,*HK8E bkpx6PO! y[9 P _hA굍g_NuWA)Ug ./P 4`. ;8 0 g 2PY$m @)~ѣc*бDȝz0+pHWH>3*'*A$1=O-v `  L~UPU 4 v q*EQ 2PF pB5K|JL=mG~VBQ>1/q8V1waV`( uI:@7@ 9"a@TOTXƳm_69Dk-EX]ZJin8$@?Va>cl @}Z`bgҐ@)pfh]u޽Dɟ lR\urZ`A0iD"+Ѣň"F"E# ,e@@E6(IK$9B1PKaXAIZ@`!laX8=A߭[d9/Y#f&j/lZNۧ&m-WoQ R 4pD8 %wށ'zP. 7+<$ n`X.^!'S2X   $aA;~%PjE  beZ` Plq[@3^ 8 & F Ȇ|',;6G LH#U%n2V PPL5r1@P#@*CB|AH(3̅ &,&8ŷ/85nhc:^)d&6SO뻙hÃcE >GBǀ'V`V*T?~(K١Ӧe@m%C ^P4TTA0Td_,:pv,fAr3#b!Z82E|! @@ (,H)*``!h萩7計 訦X+b^L `B%.4"9`*bHhę0:aU"p0P p%m(L<ќLDO XQ5d@ TA+Ge@m`ޑAmPw=2#9 t ZP<@}0bb!d( PH$30 P`q FLJЁF7&.,ـ(E:= G5*ā"Hʆѓh ?4&d"dKa?TG+H)phYt8c qKDUF=0Ԁ5A?x  a#*AN HqNd&!3D ?I1NMAC1Fqp}C2>pJ!(0TR P.DQkXf @JTp@qF>A`gf@0aVXxA d@ջ^00`?-pLP@ 1B/ /*cVt8,ƪ)L@Zd(8+18)j 0N@X$za cg@2Ѐ,`*/1I d T8`6Z !B2!K|HQI.B `#+R 8 aCﱐ^&=%i3P(A.'(Budt KLrL hx1H1v6B&2X * 5C6PC1 ¢ x2`^hіAxipP0E x@І qlC) PjhH)8kUG X1@e@j[+{!(?*p?W{"ςPE,M`X @Kyw"M!1p6$ ;ZB &蛧xpIrj(DETa `vCD }m1qiTȓ2j +jc̎ FERC6$3f#ŀ~Ac,M:0iVcv3P CڒsLvDڛɀo#t؉R8$@')* ,A>SFJ;UhO `p:bpayox7?L;o0UX4Ђl$+` 4Mh^h.`%곾(a>cii(d"PĐ h? e57ˣ" D&((ЛD<) 6X.G !J0RpUXbЀ99Gh&ip 8B qM=' {qڊ 9hd(y:*Ȁ.8xt0?H\Ab( P2 `-ʃ FRI6y 6Vni *0CQQx'Xp(PTdS50RJOp  @BX[P 7Kp_ .8BP hMc-,ІMiySH 3hV07szp|\@Ph˨ 0 #!84@ <F!LH:HhP;(i xHɕtPuC)\x!'&\XBE59WcH8ֈA_Wpp g|0ٳi ‹' p1KM 5,j,Ȁf{h8 p1PB18xpP II!@ѫ5N!(404I BsEX ؃L%8P /C`XI ɃخDaY〮<GbB(1.ت`2q h78`%JkІqhjPP=z`ZP p|8V+>8pLzP|458 1(@<;3@)(I0@@;;Q!*D2xCFM/P.Pz5[ (ab :8bhd#Y(@K< Fi LJ̈́qxr9hhR+_9v9G@ٓ|G}8?`:, ! #@`i@0N@DHn /4!DX7Ҙ*(I&oRSQ!`z XE,T0 pcagPC3*3*!ԩlYj@E`N930V{h;  *[-tu[*HP8H#xu;h;T4X("H0Iq$(`7-܀ DI\'Y7X ڂJ!EVpOޔЅ-HYi3zL,I Yi @In (M|`zPEXfh{d2苀sw>Q+'917 h`)0038!@- 3 (hXIUF")؃{#LD b'`N NY5X/JxOaHZU8CD8&xxتS Qqm`}jppKO{.{DRb<swuXBC+jȰQ0@:.1()(0):؂ O`(\>+ʵn\ b]ЅJS8\!C(h., mMބp^*hev}.f8w Ua%:"@`ZL Kǰd)4*#`ɀH(,-Ҥ:Ԁ%X7)<2hIXD*@Ȁ*ޠ)Qȅb\Pe5xqE8]U(38=Q hfk:488l/lȆnĎ hyeH`ޚI.Yxs,qں;)8 @(Ķ"4;cQ@ [4Uy8)%8nq*RS\`Zr!(^x4M ^Haaճ$jv (10 0qȀ:{`sN`Yh hy `A%:vyÃ@1VHjHc"4p`z[8-PiI:)826,&xN蔷GT4@^> 9(Up+XjP. hM8A1 !55wbn~d0lzVy腃uе!ȨM1;" ($Y 0,݊$Xx6fȀ1#A[x%]U33sO?pQގao^ ۄMlsCLs<0L`աўkoAu^nxכ S8#c.H&ˁت#y#H`L?I6D@m.(qK8h'`w#Z>y UxJ@%:H BMO\pO83&k CD膔7)sN3<(= ?:xx,h0@tي,k…91#2:Aq DF T7E>QEBL$"X8u׿Z@q*$IӿF8(P0gR?J)(ߋ"ҿj],0hKv#7$L@y5L Np Av[?8$p0a\zp2#E$̘bĈ)q.C'A 0 A%@1T(#%`V-U`?6 dkDALu#!d$X/I5? 6qGPC?dO&a@68gcO=2QCd#l x0,`@;::2A A7@E\X@`Aa PAl'dt[tqD hPSVfmTmOQ:? CVVgp C82'xF"qA@UxҎ BA^60 ?tA02 ׁU#?7 =!P t0hAlU@S $yU ЅભI 8sC P@R $F0T RU "?$S;p>Bxh@f!>|B,Ha @P4!zxL@ hЀ?7в6 e3H 0vw>% 82}ZGF)  *QFI +3 8hC|5FU7|lIB< x*TØT!n|R6`@c)LL /L@ݎ8^tLD@o0QF#Y  D +XK| \UYl*(B<@8@808M8|-)oKC*q dۑ]*[6 8Z%$& S\%HB^ձUt?| hŜҭ]U˪׽~ @WBtG!,* C H!Ç#JHŋP?@r*rPALH ɳōx`  "DH* 4t$ >#.$`߃l -O!=`5j;s8ĩ#q"M BNA92% tۿ)TArB,{42a`c Ȑ!(¤„~$@B]3PH5w`:< PptbB-*`  ?T1AGı?mn?}$b U4dDȌG?ЅdP@tq`uXBP0 +Q8DY))pA0FHA 䳃 ?0C6@CH 0[?VmQ@UaQhL?]4T @si ؁SU`@tL LHƠmcH:O:b /p QPbb% iPpe EB#÷9Xmdg1Ā= 0t$b\50U?q@ lsrO)AL$ \,@ T lo]QB;7%dA<ш, ia$pi,TQtEJ)?/|BJV+? 9T]@ 42.|LBذ?(߀GN, p 3clLPxPQ6bM4 hcѿ-K@@1Ȃ|,8P8!@E(8 C0?up` SRP?HO4@+UD4X` %62` L :(L4 bm72q J<\/|cҘ6 2`֤@aA a^ 7.\ؖ0] צ\ЈWx 0 xF_r8J:Q#bTCt|pTPBJY PRqʬT!Gq0C H)~Ua%P  4 Md4  @| "  L-d  +@Q !?NQTA 8 Ye 0 1UC4i[8:! @nG58Xlhas`h`<`v+dw?4wt @ 1 2HK@Nph[HpɏZydd! H aEFZB @Q4X@0^T )!2pRbU5At %Q!F&"q 3peԣG0:!<'i 8 6G Їq)`+ H?4تa"  LaF \)l3|s%`XP`KT»iDi+p3@}.1RBu\]J˄pu a\*!/F  @؂` V ^` <AzDԃXLjaY:2)n<+`CQ^"o/x `C"p`0p @|G Rhoaiu6bd"E(/Bx9b!6a¸1 4x C`Ld1`,̀@ pGcB1ux7@)Ktm@h]k耱KtG XrZ.bBZDd >І` t*+ 5(:N- N aj?mWeΜkx]@KDfq4 m!'y>ьV\z 80(yu RL2x[ s` ^2U"$kP -; 8քޠ L|\ۥp# SZ@B'` ~%LP0DǰV@]2 p %Uڠ ۰  0Xa >0RPKK>E`qXp U?j+ːC[rWD-,$G[@SnMP]  D !ˀ k1ppPBT0DMn@Vq'Qh @`2`( P0IApFPMYK: @ P,BD@ZZN6ڂ6\0i ip# )09IpR\m/ "S>0 l`9]  # :`W ;n` `qp_! Appi` Ȑq/PjR@>#j!6]h&"Vπ6 7eMjIC]g)P7pK.Bqw) 'Q S P 0 0DPO*S P 8 ]!tPPhV r `z MpA@?{O4/5q`/FCːUR? Nшq \Zas @A/U / @v]1 p< p 7 ^P \MJ@ Adu W ZFdHht ؐ )hׁ 0X D@0 0): 5&G6+ 'gv%h % m䅖!Rkq30 EDp[|.H7LE% (%]  V1+ZQEf`0Us*QV\.U =Qf[  PLn @5 Z2r` rup#Y0o G)WZpP PPI58+m0zk52$ߒl -*`ziDN0mp![PJ1  O0jD+x #G 90D  juL & A ր0C pW ep u' L3GG C{V!1e09V-7EkPQ ,j 0 O`8rO ${fT7SA4 *  0h֐L~>"V2Pz,yg 0aUPɶs<4G 0LQDPTH 0aXB~WQ»8Ȱ" 80~  O 0XB\^ p 7D( ~v tL@`Y ـu 5  0@,FYsj~VA ZWa07PzplI~5*Pl E$]0g&' l@qalFP E50 ` 4 (j510`$jPu  _[%jL=K)}!ж&"b0H EĴ,)(`P.8pvX2 n ]T5 _I N Tpo Q 0*)aU *Pz @ V 0Dt~{ :KN£Fpշb-E*P}'pq5p0H 8JBnO  PNa7 iKL0U0 3ZP P]P4` B * p $p<4! =m+|BRHpƢC zp#ɞ)p0@q|=A<f@{A0 Y mP0xF=ri7$p@ 3N2m &`Eq֕PZ q stX2 HL1*5 Cp w~%R%zP@.TPNЦX\a/ۭRpel0ppo@$7(s^ )7| DŽKp0TPP` O` ctm @e7r4%ZGP*W-P S?Bb BV8 szjalѼ< Z` 0xP, eVUܤ0Up )g-I!@$ t-U]&fs]0׆W))$$a2OF\3e. 6ժ+HP V-P@@?("-^ `߀ /vIA7vbFi8K\e@etUj?s&@0PNmݾdL@ N8E9H1L 鑄tL#_ R$C 8Z@l68DzP2q̓3K Aۿ 䱃OU h%С͎v`$8işm jd8 Ap n0 1FTx)fybamG8` X OrI@Xf^l& Oeg4 Hy6ckCD.  @`J "+hCNUz:Kc-j :`BB` 쀁  j0VgA <P$LbG^1\>MKx"TV%SN #mb :o eQ$ȊK71 `jQ@L@@A2?1?*,8`" PFS+lXOB )5>4s0 /̡@@8HL!&0W6 @y$R\F9GN&Ш^ J)K"]tBP Ě*.nj R תt"'J(8G`6EYHH0"wdb @ZX0*@P,@~;g)BXfI 2j 1aL y( o +,7|!@& ܃B?z4#wx6ӥN.2 $ p bR, T 6p< X9x p- H|+?%  E1<@?N -@ V%&2BlpFa/HL8ְ 2ā ̩ UD6}c;PԱ1a-4D:Q6ˣ&le72jgW1 889 \`2NE& 1CNԯ# p,Ts\"621Z n0?P`rP,p E8"n ,Ѳ]0H&tK]A V̱ p`X€V$#Vbx܃FPIHрj(G8X9 X 吀* ?PpO:1s }hgy8ؔd8A8z878p%yy mڀ:#8!R/3B 1 ! H'LI&+5%@PA )2'`FN0 H-XV508^؅[VpG CP@G(C k2ihjq`h|V 0fЇfp @!@Axz8`Q8+ `"*"}S=pISaFxB0X/Y) AxAҋL8N(QNP:@Lh509h]dZX`8<[O paB䠃}IH,r `EЇ{XUhfdp07xwHx؂3!xS)!"p :ˆ4-脵 2HB IE8@_)O0ױXܓΦԂ @8[K@ iqa:.h3 )&3jmЄ/m֨M\k0E!'QOXS3*0XxhpR1OKP ,t:m0 9`* 4REZ8As=6c@q `x.0&`aFh0H2K(P@[^0X ҊZ`6c@h$05MO:8&va:7Ez?X:c{ǝMMf}dzY)H`˵`zuе`Rq P8'+tJM  " @4 `&!3px4͂#1J x((~SReWHCRZ3O0 &1&oW?=-Ybv@܆U\ Ё.A. ynQH`8 5'-"30= Zh ^)H0$B( sX(3I F/X@ƴOp_pCpSg9@ (q$bK7@?)khВI`l05  {}hS`a\EȍdՉN75 ">eѐXv[9)pu)1T$915@4XEj! U)iN 8jHd 0j;{y ؄k0MȆ/ZC}NY8dp8(u@H8"FQ 8V"j RFK6C$*)X֋'F-ȣ)~2"E (U PF&Mp./ ZZg &ln lLp~gEdC9Ѐ@hMdž1pU (O2=(A'X+-Miz@*pOЁ`! =)f&@FpG'P7#@ ?y!%T9o1:* 0h[ocBp0Xq 539^?Y0 ]z-Ap˽rS hd8pX,P 8K0@/<+YbR)&7@u'u> Fd 1A5tى j iLx- .@vpk,DrX0mCJr x]HcOYS5N#('3s]Ai#lRXhXQ tI9 PRPm+Xb\p Њyg{fHtx %HvhC؁%XBʖ8 a3p/*x%y-&pginYqQ-?z* P˖}5`@pY US9 2,("  hOa0ǁC8>9c&YpJHl2Ӏ< U< Bt#*-Sn Ŝ06*d) @ls&A@I?,`&ܴ8Nhw榆k٫KC~[7nҶY +0fn A: Y0 ampP6Zk=8oov <5 5zN@[97 x`S]t!,. C HFÇ#JHE O{ @#60An6ʴ9 N PgUu?590 PҀA])Z8UiК|FX2쵸P9`4 @!Kk< n,@Pf 0kqu3y@4tbB-`lA3 DA)pTLq,c(0CGt{$b U4QAF!:"?2tU6P_`A'`D#dF0B #@ MIA 䳃 ?0C6BHpHFG%$U @aȁ11 @ pqSE~(0U   Zя!N:b /#evAB+C B)9d<C6 C 1 ?1` ?  O 4@q PEXA(ggQrblP&?\\(`aU*D dh0L n]QB;= 30UxTvXWM4 [#vmC 4Vda8P8H@(B'L4q' 2RX- R|H@.i`(@Klv 0êfhC> ?~6FD:O-Bмwczp(Z<1u c2P!@iIv 8bh 5FT <@R>c2$@&A|p `3̆&@h XaSBda\-`c /*Xth@PO\@I#Ȅ81h@:2QH8 p^?A=}Ѱ iɈ 0T V DI#Z0!+@%#Z+-  #؀ 0΃ A}VZ ;~P xCh D*i70`B)@GA:qHZR%|(S%ũPdZ$E(/B ^`n ͇@HцUĘC2 H @@p^O @K |1nC0\D+߸#@„.=vcG:6~H<|EЂ%Sb%^e-@1 (C X Z9@7QmT6TjPBәBʀЋ *U(kx]@P Uapq4 ? D`'ъPࣄ#Qq8VG9P?D%R(`/|`*Bq5q(:, :4I|eNJ! /G$ @,^1rZmA~c1+hqU(n1cl(]a|& 0pj_  OA=CcX ppKi32ԱXp :'?^+ːCXVD5:|TT)[RnM`m 'aA S Rˀ jaTg0 OKe 3T Д oL0 ds؀ =s PH P0zB x@'45XK: ? !C ihpY[-Ӄi ipZ# P)@- %R& !X.R/P 3<3 :Uml`05\ Sp 0wFTu& `qpoF0 @pX3@ _` Ȑq`/@iR ^s%c N8q B7tT P@&U  @HxF ' }lpK@~X%ФP]Pq0 pQ o@I ؀ Px؁ O_ D@0 0P):F"=@@"A/WR)QGW/L' >P9@W%<?R Zw[ә !] OPXPϠׁ m@A *O @1An }W U @p| @  pDp#/Łm=2=`r]pa1Uz4=8Qcc6 hpu;5bl(a`dF lPa V jpPLrP I nj^pt1Fa2_@xj0 F ` )FQ,PF@#i;@Ʒ'~!v_Cw' `@R( UwRP 'E l ([ S5`0Cp-Li`  u Z p1Ю> 0 j0@ 0 p 8r%/*a5 EA',C6cC?)P `f@J``5@C:d <0  z&UO0 &P0\Z1( gmP)& Ұ/oYA X~  p Tp2]Do: rl?Ap.5 L90hɢf*9Tb<0m [I1P ^ OP S Z v$g$0BPrP\70)! X r*(.d }G %ep u& *~G #6q}EQsS,86Ek (@ AjC`cdO7'aL Op֖ $p` ?2p4 E*  @` @ `))P!g`xؒvs<G PG aUr?WYE˂ +͇\I  AXmmN <M+p( `[]Pg:@rZ LM @ې   00yfXl %|U/7Pz k)6+%*kEI&& lo alSyPfv!50 C@B@Pg<$PT ڀ gPA`it[%PX@!Z[ ^u gˀ7I`*Gj0p`~eK 5Q55 ÁCp wN%"%zPP .TP B) 2 e Mvm7 T 90s0]lC(CXT0  0   A` pF^i d?G*T8E0ppR@ j <ZSd @` a[3&Z`  1 e8!v*g.Ұ˛-0Up  .zrhC[ T]3NU/0-IB@y_??QZZ3'PZd ӍV < &1P LAw*0o n6P\e@et/!s L0`@H%MDd 3q* @<-(Ge2LO$4$(߄ <DPdВQ|W ҫ(&0@ xU(CqS%t$&fRx0m_mˠA;0t؀mvD Rn. 0@΀P6f Css(#s 3 ! 1vP T-8d uOR l'e&Ŗ` bd]vqFi.GTaeBD,  @`J "hFU2zx2Bp@t$ (@8`5Hb! 8 0 yrrL`\P\1j.HEJI@$P vPRq-?HqKhA.@o  @z%  E1<@e)`T$2PSXFӱBU 2XxA801U $@? p`j"ɘ"-&~hCxo76Dr@<`@" "A.'!zHGgJ.d H)QM7(9bg0˨C,j+KӅ d@`?4sX<0HF昐%0 xmk )%DJ> a"(€-`S :00'k@&P eBDt`x@ ` UbB(+ ,Ѐ+d } 4{\31A 0 /4a 70 I$, #6 d i0u\GpD X8$2&*ƒ ܀<YCPAb `ȬȀ)f4 E-:*`Z(F(" @ P&l1^#HE؅#8x4 DR 2 p 5aBDZ.cZ:v9-I<"d Ppd'-0 @H܂ 9|% *<1As%@B1P@\jjo _D2\!dgyЀ+c GԬ "~ , x50|[6cC@=*dLFB?A pG<eeD1IzP FqEP1n%`@ٕd@`P %& 4? =2p"+tШp:pe([so C bЂP 䆑x"xa@\FkHO0,d#Z@0a hɒ8d` ewЅ?4BuzP8 h:3HN0d(<`03$` h8 X8DXDI!4D$6 8=`%`;!@*hXFP 4  `ЪaBp E/˳K ?PpO0 as }hgcx;:҉*xPa@0%R؀:#8 b-3B ! H'KIȀXP3 ¶ '`FN\ȿ'@8-7SC]Z`W9pEXb8 `xnzQSBc8:($ihjq`h|V 0fЇfp\ xz8Aɀ6|f+ `]S=GS¡DxB0X/) A2L'' Q pE4eБ6ZHX`8<^a׉&9(k:(Q ؇l4i FX}EXVhzHGH8 (TxwHx؂++B@ ( 7H+Ђ!8N (D 97AIIiK!@)O8'c\ȑȅԂ @[KID^*I nȈ=+8NXqp@MnІ3`{z:==H5xI#Ё`2xB"" '43 H x# XsP  !4qQP`;w=|- HL4 رUhё^~+Zh9 !dY[:-?ɓ"LmzЇOEi@AJ3pCPP#`Sxe5PG8K#X+8$-+1)1 Pl+jQGFC `Xxc4!QO(8mU0h*0rhVP9 Jl@m0 9`v@ZyЅ0RFcAƋ,HB Jp  I&*Fh8 ) ;,h >ȂГ=_H( CBl6 ac6CЧX5>H0)aNP8XEX@ЀO(Ϊ_pCpS+vqHE&b1?p&Ai^ Mn؄l05  @ڤՇV0< 9iQHfF5-ڈoigFщNX_|׹ W+ YAz! I ahD0ua+}1TBFp PJHJ⑃(UOVۀ:p`lK0 @j9kr/́"c@Hy(,uxFރ@h 8Zcp&cd@+-:. 22>z0%hp%F-07LY'&U2OXRPE60 :9q1 &lerM ~NdA9Ѐ #h|A8yCZ ( Ѓ0P"0Kvh'd Ћu6 0*pOAL)dHFG'i#@|0@5 vFpnXJ.m 8?j(Rsƈ 0`ܾY00-j1n)SS 񔰮. ,#8K0{:R qs ` s XZƓ ˒`.Vph@S K7` @6p?ha&} F0 8*pON;~O80}*˜h;&,hP` 3pB3gY uP0 E" 0A L0`&%:@l:0a x( PNruZT+!!@ *!M! eA*TYFQu.l0[#TF: @G.m4⨨!," C H@Ç#JHŋ#D( `?5TB4I͛8qF‚T  9ӡ2 4q2r3F(4H;mTi QL8B HĮb.$gn L_ϒCQ l\** ( ]"T (@P0`5:PMlx0_p‚ Ƨa`@„` hQ!5tYLP!@0mdmpu QS%pzaEa2C0qqp&AT qD|$1 gqx@"uQIAtZveUlPT!`vPa(P"Oj8 $z6HG$TS!00~cȧN<0P:{(0i(E5UCt@B+Q 0B)#`jfE@t"01@.@ 2 p?pA44.`A8_slp@u  UttLUM@g ~P9 . RXq(( B؅ |?̸<::. tqpRmTCAe'PD -?8BOV1D]' 1?<3 kw"A CXb 4djAT3|b?j44Y)8c0SEt#p"ӆ]LGN;;O<#j<!@t y p Pa,0M/5*<&gH0A`k Yx#p`;@#@'<6ЁF A( `xV#* ؗL0L.H @T ( H,R 8pf8D!'`A3xz"+@ dKUl?R`+P| @NРc@lG8A88W *0TB6fAp+Anq­@|P u903 4q m#7zae}1P=6Yy#8)81m0D:=zӣ̈<繃⠹Gaz p6 R/7Au_ (pAb)xǐmȐt6ȅ,4 b P`U0*h- OC@x:!2B/70F3nAcn6vz6c} #CTC;ІjQNu5h VHC"P05Mk#CZ Р-K)9ȂPL$/)|qG!mD- 5D/*aH 8XqCZCð36^,b j50^].hJl  h1y]Ůq0TKi@LtGlpH/ep>P"tp.u*m#]Fh:0P  qA^{9)*p A@ P8@P  / @n 8q` N  w W `N Հdc G6[03@P}pt8`W"O8c N4Ex F ix ЍrP e֊, JB5J.PjBmP  lhV gro et jDLX1' ِk M jPP~pz~`  $@b F ?0 LaJHG ,gId+`S90LcD w TH/00jA&= qaJUAh|g hvr0M0ȰbE8 w ` `XkL Y0P d?/ KPPq4H01Lp`h NId?C)7 I#Pp>Cn Ju&T?"%[T>*^ b `_& 'P %vo r 6i0 w1Y 0\X ٠ SqZјp I}]@.PgvlZSE5%! pf4 P ,nQuP,)P \ X Y0J=1op'*qp l pPw X0pJjDr(P 7 0I]HAPpdHԚ0 ڰ P`ʐ  `i e%P p3 :%l7T0 AU^\q\Njp0PR$ Iyg45=@H|`1 &0TY`^t( p A @7h`ϐ,sj D $PK MP4R0 oa;dӱ & )$ nO t!U:P0/PGK0ZCZ\\MpN ( YA!K0-s@?WxW$f10=5=i]^P A`UEOZ " X,p VP     P [@/`8Ӱ ؠ0Ơ И08$^ g`wKrp p5 45A+0?fV?-n'@BP7q @yt!KBe6<5X10A0 U 8 lTπd"((k eW0r@ `@oL jpxrb X0ok2`lp@ pA̰P1=0 8Sg9Z`he+p`PDepVbjePUJH`6 cp6TZ@q2Q p{0 5^P0 ^ B0 @ `  jPP!d  h / mAX   P"C]v U[W?Ъ,ڥ445dI+`Fxw)!r60PGAA1UНr}P>  (O#,es6+ :t Ɓ  hPE_A *n[0PaI$adx ]> /D ŭ)`cu U&Pj% =`<[96KB0 PŠ>8E`*m%sP P?" ]w P La䄐PyVg 2/X 4`.%!5T!݀ Ò@pdY$)2=QQ8 V$ *#]/* '*p{ 3$1=#bp`1aq]a q &M r8.<\ԃ#2' `NfB*|TF`~@ ~X"|&Q"iL?nEВ ``Xf8A.#pT@T;p_QsQ  ^g7 ;q#)s7 `ҿY3(  2*2lg@A@V70 A4dhfZow~Q'C9 >UT,$!F$*_-Z(R)R1  ,hB><􈱤A0E€G#U+W IZ@`!7„q {-dP qSaj/8 ac S!@Gq( 4p$(;NaX͒A޹{/=7 (hJU`25ָ F kJ!P2v  $aH@E  b` P [lq[@0^ 8@&K *i 6R,K`m[9`9@Nx ?wg8 /SM/0c;@p$tkT( lP"c0AaѠ"$JZ ʅ &p,&8Z`y" #&s3ChE ـv[(L7 X Ɗ:G9 &:PDaGig.7ES! UP! `AC-H`ybt@&Hz-5B:$x5(,]*``!: ::؍ʡD m@v9;0b{Za@(GkG.?R=a d#0pNy0BdH "~@:+|^Z|d袑@:TbA @CIPC\k*x[8bHop 6 D V"%PDBm$ ;DUPt@tL 0iJh@b Щt Z <y r9@p `TI@ L`T@{X@s5ipt?Fܤh@%z A pG6` ?Q t`^AkTC  "?*lh L?Sv:WV"54@xc뀃:0+ 0x5G l8ā@(% CHE yP?p AC( 0A!  &\qMcPQP4{^آhpG&  /tqC8AA<U\8p oX2BX: *&mn X h0D`L`F:(0`k^ 0" d 4٘!Ta" A cpj0H :@|#!@sS/Lƨ΀ d$Y0x!S^8 1b ,@7J02@|Q:.BpV!`#y`R 0 yut"@u2`(;TV("Ud[RKqH hx1H1ntCB%2 * 5A:6PC1¢ x2`^ujh(D @Ej[ o "BB0x 8WQ.]5Q :d KHvII `2X6RC6a<`4#)gǣ # AQk:qJ$@rN3HAYrWqt$ބ p~E>0 P?`P'YP5Pq2PfO G ^bpa؎yox7?8Kx30-0 +m y h%>h^h*.`%AX&\+@؁&x wBN(E(B SP5'iy".8({ `B(H0B؎R(OnaȍP 2_xPX@^J0RpUbЀ)qGhx&i3:~(R؈ @l:cl؆ {c" 9hd(k:*Ȁ.8x`t0?9:4ډN !P2 ,ʃv  \)+DIp 6GЁ>l *80' PbI8@5PCOZXg (Uh f+̉ Mc0,,ІMiySs3dhS/+szpn\@Ph M)"PKF!K| ~ p pPu BZx!&&\nYBD%[H p*9sK /PW[CDgx(mClm h}f"gS jzz0x؁ʀª$+dHU X @ P80Dz!@#LS!Hs#XHB[#(ˀ=T5 02X@;I gD[HZ*9X)3 bB`0FăH h&hhjHЁZ̔Ѱ~TXG#,}p^HA&4XHDI+8!02B e)O0 *P# *HjE[Yx\6Xh#̂!PX $pOCXE$^8Bp>XKE72YpȨЍ@In (bԄ  veXUhfzHY(͔?ndx)As 8"U }Y38!0- 3 5/^VH)='X DY\`N 5Y5X/8Jx;]d8Cȃr@KO {IDž `}jpJ@Ӆ{$R" Sds&wuXBx:+H ZP,0@Ђ(f%()@ oh `?Ě):Ёc&HXAؤܪ.++ZƤ][^03L&z7QFX 姐YMJȥ\n)heb}f8iC9ol0. &j֏T"1 (4*#XVI$KB'>B Xd)= 4Ӂ  x_\(ACV҂JcX]0^R8S6:J3{hԏ8@ lIȆbܨVpObVd݀ѯ@xȽxsE+7 `"4;03P [4ЂԻ8o$|,P4|(Q?@[Qk!((gHȔm2]H3t ji7j"}(kMN8{`y^`0Yh hdՁu xf8wt?TH Z+I&HK` &6øŒ0?0p+Hh P yDd4(^& paqt+Pѐ%*o0 hH}{1 kku0 H_fveA{PP# }fu`AL3`,ھ&0ZK0):"(1_P#?P^yX`U Xg A6P'V33 `A{p>ao([]lsi=3AS0K5y6؁׍]m{L}<:#H7hC-*"1D8,6Εk@=,8-(J8$y&8HdXRX_PRԞH p.8Y f6ll'3<(0u ?g,.!8O(@z7ZF`P5; 3.Uti*)25iSS1&@ML|0A9#5̔2Կ:(!:@ E  xp_.Lk֍?l&q`BvM9'/YY9T_$uуg]&-6L8 3R$,#\dI* d pF &bĀDCJbC &hUkԨZ@q Fsww&:q $x6xd LaSd0&tCM6d6e#c'20рp?#K,s6D# Ab@ '8c@ IC9u@4 ԶO?)MVl X(Pl hH+LUe ~|D@o p8 i|F"sAdT*}H0_L,@Sl qCOX1 h?U7E8S]p5U] c P h9hUPC 8? )9:N;GG?Re.@ 4Ɓ!\|B,PHT_R>)P*ųCj@!, C H/‡#JHŋ3B`@ DPc0aIjI͛87 g$HL#\PC LAAJa֯`i:dPi A&BH1`V8h!&2(P 5? A  }@_(PE`y*R9n OF dB,eD$`@3/VAbh`2 D#x_*tBZ*G뼎V?$NQ !h`gF2!{̃D0T( "fm$<u7q+pa?9.ԂZz/O20% h=PL2H8E-bT H* !+@&<Ù:8c* ':J7EU)q1,;|D&!IC "S\,B15; 7@?d&$ E. 9,r! -T!-HN 8TA8E'\k^8bb L 7b0.v1ٰ Ҷ r m` %nP )00Im@?P 5FPoP[p;c;h/k6h!!Zp ;C B` f`(pg RMPR+G,N`}I>IS::7[@#^tHV q_' (` ^`7Pg` WĀ#g Ln btc0jm  ڰ ܠ 3͠d 0Zp Π .p Qp-<\G $ˣX(p!` +DpH\PR\\@P`VT2 5х.k0Y>>  9As :L sƀ LF U67AG P Σ{`85 }b_Ѐ`Ou e P ` @0b0oZ`)QUF+3^>t%p`WH)S0>3A c>=ЅKбC.6>& d@ : jrss\ jta@ b/{R@ n W@X<&wn a0 &Zp0P-/@`)R Fe_&FsG(/`<yh"Z .3EV'rG@G|.7˦@%fI  0W xWd` Ƃ^` hrTkpLPP @LFmW M(B0.8q  njM&0 h @>#B}t}<\VFF/'lQ{ hsH+` 70!j@0*9\u'Orh c~$cdB5`KRj! us 8@ lWh 2P 0WPaPdPLj( Nct#ZPmp ِ " p  FndpC2P$7 ;Ќh1)8;2r~X@ Ng,p!#pp$xRR1 P3|tP4?`WC?^xj0@|$t O`)qҊ Z}Oۺ sP#] ͤ iW@` 2 C]GL%` ٰh:m'à NJtKVZW) K] q p4f1\FPJ3 ` K+RvF зj2`/S xVp7""gG++VRO$1 U% V^P ` Xp)A J@ X 7RL  y+o`LP8Lh P YV p `'0Y  P` `*@s]k%pc$3G(EA) \hpj3Y9@ ,G)pp'04M4=."w^H'/'#Q _1' L : 1 @ ArP{:b0W@ zv60@9j62  Uݰ `  0TAg % `V] =rU;;_]r!GdzTRW]N i"/gFt J4? >%`qlbP>sۗrU0ݗ`` 3{@"Dl#XAPM0 P 9vm  X:0 ܙ?(`¤i;%e %T ˜R,ЄiPVϿZx70s+/Bǡ4TT {% u @}К t^` `Z 5!@JUs(6`j` EAp uXab\ WPAmѷ Y ` 0ZСBE5(0 (6mȈՀ@pfD .\4a*ZQ "ldР$=CB ld8 H*<'jR5OrIb?[`h}7똣  h:֤'ZZ20X9Sol@7یAz  &A blDz7fdu3?m2,ȜVn x$C fF8ؤ`"#@qJ X1B v>I. 5@C@ DL8E *pJlg*5Bh \~jVZ)$ bK6O$8be&IALq2*8-h#=BJ'Ab{ǐ*` - 8 DV0RaFP!  *2P@4 dp &`oj!H\|ExAb*ep !GneѠ ?z čKND:`fLk8,Ɯ`m* (҆ {n) `BALl3"(T"H(F'"pៅ   %$>th *#C8N?]Qk\ԈY`5AW(@bng9HҴvws#4`E>8ذM1 Cyq8eB]RpEquf<" HPs-(D22* !N af$ tB_jy(O*d\$C'| X P,XPβH m?vqB!H Z0 F& `a B :B} ԫKh 0* Du F`:za\+3 !x -B|`WFR7 ~@G `jh~@2[sbbtXᨆ^l:h?7?L@`l4o88ANu-`Į f2L軈$6$1f`H`~_gdփ BHO6H`/@@JLx @"pd3_ Uƈr&6C86Ҁ%+6 ,uqt|9ժ3F;b#pAMI-P aH#C 㛪 AM0`cm칑 4W @q!.Tg  L^H 0,H] ]lD5"OaF<+#pQq7 Cm@q) 6ġ ,ΰ ~V.8A TІt:<0x\ 08 `D0jn~yPPt P* 1Aa`ȼ*`Ā #.B< E(NX$1^ (@@ΊFj  .C8bt"MLl TCJ -H.GLd#f8>p2NUD+qS4E @RDz@dJDkL L jXu8"L@L$|\K! v#]?(@ ~(F4!v.d!h{6c"B- E&)g2n%{+U([Ȇ6r,ۀd { HpVbpT22/;6x 9鮒,!(bk B@ ™Q] RA b l=K x 7?H91 Ȁbx_(\p&JÂ@3@R3O8W` 7`pOr.؈ xLh 50qh s>֓ 0`dHV@ @>@upw@xi 3؝(0d@0# p PF+ob#H-@#a +p %s=D$0)K_h 8 5@Y{IJ@E( *Bf ^UI\Ȁax@?oP`␀[Lp+ pP``z{`8^ȁ޲ XX/ xX>`B2H8cE4'`Fpp +:xAȂ>xh (bC> Q` @zx PmJpS@.$CIRXCX]$ X 2o@F$:rوaHJFcpІqXdGy c$dV8!@(.y8uxt)S}Ҁ3d!шDE h7I# C&С5 >;؅L N`SX7(9(U:y hC^X$g ŊjoOkx0˴ B*lh0mm3HyЇfJ!hfh), : 1xtH ,߀6,q"dۈ=`f(H@4('7FD[?=d%؃,IM XЬSh3VXWXa@&^XGhЫ?ia\8 OT:d6@/؄mmRՂ ؀d{Su)(lV(9Ì @6z8Aq#g!]"H 0ڈYG&"7Ɂ67Ȑ.) ?D0%x'1hyNhZP xbJH&RX= h\ G ХXpIP?xF@0؄,hnІWd{Y1YgP^5(CP>d*QQ˰3N@DPnI Ŗ8 3 28 HF0@B?ص@0X) 4ڬ\p!(_x3)񩊩@(XgX]tOѫ\ 2/Fȟ7@ (PR.8Ǩdy_(dЀ =v8Ch3v 2)%ZeU9!`B ="!1MlC((pY5+X %5(\0u& +o2 5X)`-# '6ȀU \1{[9IK&,x:7QM ЄYrcЅd{XF^ _ZgH`e:XL8HV#&!+!x "50\@!(APKmR0H0X׾+Zwz'Hpo 0 Ӎ l!05 8p3,8]/ Zb >398cوxqOb~=0Mn@&j8mЄ | YGSfhceȰK;@x5,|;Àq !&9530s>J&.Cp3(KD@/vDaJɂ=(> +*56xQ`Tpc|Ђ00B"\ RPCG@FH-YZPb2 `ۍx,08n<rmV(2v`X` ) HY0 P8@_2X/8 @5U2 00ո ! /-X-Pu 21 @D?o){ȕ?>X6RX:Š @EW R(\]؅*rM)f)݈Kh1Yl@=ЂqȄnq02,Z{`P콇#{Hg8A_aP`!+S#hZ00NV Ѓ"pGJAq?,xo.Tj%P,Fa6'`NxQP[O+Jr^ȕ_E?_;KFq72.ȟG֍ mm-xlNq3h|Uy{y^zH^GE—wpTe d08[>8PHM_Dٵ)x=p2sP @f& Q\8g#N,WH<4@ 8a CCu3 .?pb6YICL KN;ulpMOmvv%y(qO`YldhZˀ?AGv؁BNP>Y+CMNp8Y( k8XuE)p!@ E* 2cr1ІăЀ4.W"qCH0BFaI! F7l JP\3dHtABxq|1G"9ѹ ?-(2E1?2)9 G+AAk{҅?.A& Ax0P%$8Ԡ Kp@G"@Q~Y0)Ja Ԁq?,vL/|!!)@ *@I8h:"P  RmC~&,@ CЀ?"wˀ 4op Xg0 <"D.R%Ag(r8P:b?$@:8Ñ ?8 |a Ȁ{c3)Da[`g 50 pIׂ H ,( `tC0% JaZܕ;()%A#\&8x ` X*XM p@8ЀL@::/EQ* @ X!s !dPj(GD1{ABT6 O$gq6xSAf=pY|Y!0_}FHp!b 0O}݉p'DqxUA ôц҅@]p@M4@L\]$i|BF Y 0GхP &0[<L@D,PvU @5Ac@x P4 dWdՁ7l`@S Da#Dd jR7@F\D^9 )f 0X@j%"m:.:0l!D 4(p0iC #Os@7U-H31 0W '\p1D\D !4A lSB6q@I0i6۲I'D㖬U@xҥ=UV 3K$DU4!Dqh+XU 8Ë3\Pip tG?0cH;x: }ȠD{+g tp7aA)#PzSj$@u (?Ġ{H$ > &1"%\ K.F, PE` T ɧCЀE9Bdp!G)8ռ бҨ' , P@pmQZAh?WZ[ Z0xz wxtCr(━t 2(\ V(rsBp+t t/ 1?L0,ь3&!rq _pB0_l%FT p V B `B)p3P*XY׺ 7Tb ,),,؁@ c@.8U@3#<ꡋyLlS`4`<<ܡCx8H sH@Q?X+dE(Ҷ  @s tU7p 67mPao t`%&( `aV"a( &m'δ2 0p۔ Uw ` PB)jxJnG`52V˰#0(aZU[UDP701_}<Ep5as# PTg@+j zX `NbQ h 4 pty JUm7gG @ `@P o@/P va-Pe!d &6(ٰ W %XM vPc bn0x4d/aUaeg+ 2 :9ED P;IK${C/qj$}1Ej@} @*`i=` ` ` 70?I' @ *(_8snP X6%— Ѐl.eP0 @8v@DC(oG *3KUPv hS$pN:7AU@[) Btg]Bq1ӅArG3]GPP U (Ijf RsPU0 /ЦUp!$`ِ pbJb&Vu pxcpWK@]C鰠  `% 0u{ˀ[,F``>aP09W@^[WA(/ \qH`]ko t4ly1@ {l` ؀% ,0cMOP]S"=YUP;[ 2@ cup-$XBS ekg=V78 @q;|@,|kp :^ ^00M Us &EBg_ Wt` V x Cvx/Q6ib`ư p _W:; D 3`Ɉ]Ե4] N?xZ !X'PWNtp1;ѷ CI/P\s{H AdUD&q#., Zuŀ jPZ0+3J@ U p`,긤 @)7" h5q d@ A6 W|' #lP ' P;.9K\ k|/GYpcN$9\G*rWp7PaF];%@`2!Ef$qj|z , ]Ei6 Wfr  +6ptНo@P aNG5-` @ v8s2U0 gpDΐ ` U/𠍆"`Zp'P(ipZkua:P pp~Lf @p6̚ T1 G  RV\0' `7m M~s0 wV `zRd9 B$aUZࡍ[\i(;-5AFI -'B݅1|Ac((6&\kj0/ Gp(W 7+އX S9@ s vV]2+ n5QFJm` % !mE\@` e-p iANm·mdKP@`q j@5[5[EfS`r !BPq@ R`ȩm<2 "B^17/@g&Bp+ P  | /GL@_P ^, y e¥ K>@k h{VX n0!" 1.&f -p%p 4q B/CCLN 1G5P#`PS  @D1hP3Yw{221]2F|e[2 0 ~s  O@! @ Sj. l/5 P k  KguVpG j`p  lp0$_bp)bT/MBA2qam`NFbi `}0+fz`{`&h28j *!7 N!%H!CD,x xL>z@ d8UL*A o/Yf͍K8FC9 4P'+VA ?lڴ -ڲig,A ɓ &W"vɐF,A{G&Ĝ*4Qg .MB #(Qpfq2£$Ibc;qF`"H(AqOX\+*M럱5d`jUI<8f\(.y UqEȀlQ#‚c^)^ba<@` J'A x2͞Hr(.X`!p`*l?`>衇Y [|$pNDQH$`%[Գ!(!Ye~dBbf5 O8`*IA$}41ƃjma6E^ުp ]Q2GAYwc J}u@X JKpX @6_-ai|J fM\8(EЯD"Y6N`QUJeWZi &<7).`sRam'gsFHGX'erT HWp ݡ1yd O`}9)0ҶLa'@Dxa"$!`G7$ " 6@` *b؍DX (%F YP"3`pƑUai!`U !0p^|5 lPEj6@C8P7RCE1 K=5[Bv/w8lN_V$`-hA #Àg 8ޟ%A$<+ < "y^,ɂE-ؐ lP_z!8*`@`G6 Ln\ ”8[5@q{$pa`XG<^ @I>L  Azr(1 B 6%&(Ih:   R H?r -*Uh@1`Iq qBϞ PGz{) ?@_5 @-̘rJ@ TyL蕱Ԇa[rGKxX> ST e%Z5M0@P!H AD 4d 6Ol ЀA "ՀL$O@#؀(B; A0e<jHd-n G(@NЁ*2^@JXM UH 62!,|(4,!!Qe N@ '=ъ3d 60;_V$Oh'T-@8B$ 3t@8lH@2ePP@`ȣ X ,\u1~u\4 L5 `@!B 'Nꐁ T2è b8 b 1АEkA `cXm/0'n@ "b/!A5ӡ6 @5oH{sN O#`&65BLH/8%G| B0#E+q`4CBpu4bԠ p„:4 p554 @ 5` \x;PCK/ /a ]Fbp[L7x&O8 GMq!J9Ȁ oY3PdVZ?(vXw0. D0@ ( @Ј0$QDBȃ)5PxXx N̂3r* p % _YS8+ I^, DR@RHt\ R(@ *"F[59$;R&Lj0A| ؾXaY^ X0:,ttO):Hװ 9??K\ry )p HK%@XJQʄGs[Fȅ9 5JĄ[ڀO3H 38dg8p7(Qxʅ'PXX`'/@@9x 9:`# b8EUYPi7(7 `x /sK(= 0dh(hlq8G)mȆ}ą <=Ȱ" '^υH2fd0=4`&ԍ4 e: 86Gd'H-#X3pRYgMf桥a8OH_\K h|]tiX[nG0Kj@elV`ЅfyEhE V|8f8_5 La8p%L H"t(s 3j"Eئ[ 8"Zc`H(O!B^O0,jIQl'H(JH^3ag !XθCp9@I&@  N OkPь@ -h38n0Kd8VXXNOSiݪfX!cƈЁBܷ͑Ҁ4rj00MSK5X /@* p PEĊBy PN'5]`‰B=eN 0q[Xc ^z$b8U@b؟@Ano.il 9ڇ/((D-Kh` 5>(pzPQ%``yHY %8xHh#X:!xV$?00%4 HIMX`gЁE!p*l]8 ) aFjQ2T(KN 6X:3  U5(/zo!́`[J}r´`V Ɩ7ćFG9/g: ӟ#q&hrl`&H5ȫ,\B  @PI'Bz]= IP@%DK"\Y-h ϊ "5D% 8vwXŅO𕖅Lʉj I,ad!Y"`mh8[xhf*}XzbjcuXt8t }ϦI@(B3*B('ԘI`.,8p̂q pzP X(X2&{Nr^JjǁhrEulXh%kFCoA6 if 2e۔MrӮÖ-6q LqT2v#ٳ'޽`ʒl,SBHP3@ oP 73!H(,RWdD AqpId8! A䟉)RٲO 7af=` `KZ +W.QGrŁe +-lj" 1`#0)f  M| ?`?l 6؀7 @@e$?CŜ!p3d?1$pO(/R(#< 4R a&٢4P$=-?\V5\r ؛i@V/HP76э$KAԠ ǵ硑qp&80P;:x+:ȀjŁC@ p2FI dp _`` H@a*@5RmD @ 0$|c K! Xe/!Y<о` eH<?~ /  *,F8Qt`{OcGQ&|a$F71ld?E 8T MB+^΢d@#yh d*H$IMv 2 d¨%a Sjh@P*, >021`Zahk0E)ꠁ8 'FJͭr ^PN#" I:h Q0$LH` 1 b@$b@* @Dp[d#FPG1Ј t`@$0 L,c$j@^680+~C(Eei*ЫոG3 ?۫ VRG \"1OԤ*,΀e@:ڱt sCD r8gGۓCz X8h@ ^Ѕ#xB# Bd1 ꀥNP$g,8Xz0@3 u'YdJFRTN.44$0u|vPxr9I1)@6 R#/Πa/@ ZbC 2H1_\X`4K f:P ^Ѐ P>p$#rEƢ AlH$iIpFG +Vq@ R̲@x@`ʁh<7&0`@C`E3`$q|I4`xJ&Լ;# `04TWqmpT6P%Q"x 0u$ p! a0&`{D#y@Z ,0BW0`):0 0{@&Ahf$I -nCɘC/5 (8wxˁNRA!D  1XVS@(@] CT@Z?@YA,ALD`N4 d!@܄ @ D`l@_kS ?yDلUS]d)hޗS̒?|BX Cta؏L Fp8E@Mt0Ip0 VA  ' 'Bb9A0vpD8Rt؀,`*6x-HxH!h) ?<0Az2>@LM Ę]4B96|^ށLL,z":'Dz@#N@ $B&B.$04E@! , B HP`P @ Fhň3jȱǏ CI#*2dz0yC $}`f5p!Se0L%H:G e@d@ =v - P )8?p#d0/D>  xdg @(U ( tl .@ Yġ@!u8@}8` uWL@,@8*Ry .Ì-3u )lj_Gs@3xB P C C 9 $YgO &DޚC=2 @5uW 4Ex JVa`ȩ U!4 $΁uŔ(@ O8@T0?HB`[a(D0 pS24)W8`K@[ h s`YBs#z xo4.<5qH@2\Rr[NFdZhD'0Pb@ I!C*b $DE3Qz`rD:woj:1[H,hp  rP-<pXN8)<hp A6&@/8%15'QPBOs4+ (@ UB+faOh `aBkR] Tָ'eK*4AdB 8 nhjPuTX&p/Q`/~ L D9?S#jp:w0mh L4C?a&%RPT`,HA Af3 DEs@(^qZ p aȄGE*8P X c@2 @l9LTd-~ZcF!0xƑn@.M#cMd#F6QnlK@BGQzz$~N<zY? zj8 WpB.V p- >B_c`7$ЄJ >xS#`A(gC;N64@ @2 [Pgh0xEm? 2v 8?nA bC5a R j\>@;@ ? lhyű c"s|@dH"̜]h!HJzJ:L9O |*P5! V@DCœv> c7H P[`|@ H 1" @ P H+4O  Po C`j0FE p G ǰ p / A ]P t s{\ _PڰhrS  @ dP@_i @ @G`?\u~~6&?B#X0 (kpa @vh@v"B>0c BT/2P?`Lb pv:d8%[(SjP $n3("PoP@Dj 0p 4 p 00 0q]0g<30@ çrrۀ rvHDu09`$U.\OAoJ \#,ԟ/@;fq q 2 YYj0O je˰gy΀ "[0 9PFL ׵gDK< *"c@o+ư l^p !S`TX [i~ r Hp"jRq] (Nә-r0) es:!b[B0 {7 hV ;lP UY`LU πԱ= s om$/¾ ` 7]c5v =h f g}̇ T` p4C;`F`>6 G VVMh@ $6)\Q<m]P 0A1vz@ 8d ŊLl_ dMڿjnf-j5OT4dOZeS6I8Gm۴  pz`-e'2`w |*D:3FXHDHЁЊj6Jb * /8*%b@|hx'jܛ$8 "Izc 2e282* Q7~7^ʢ26jcJ dhHgm1g$P .@a' "* yCh C @@XaT8 (F|'#t8Ӏ8$#.6%'2D8Q6@L[ `&bUfe:!;0!#J溰 a4/%x؏Ԡ(hR݆q|Y&V XWvA`rͨxfSFhC4;XRaT ` Gza6*.é!\Aa~鬆%,!𢒉mg?!@4eZ|GJ᠂,@bIpKЂ:^`,hxJ AlƙD Fq`U`>q lQw @hn&@5sP 0 At`{k` |ADP@tb0N4/, Q` P,+3x" t p~_8q_T#?Y NtBt :t b з lh È ch6Q|";t q2 Gd@S ְpAHp_EGRPx0E Հ T ;A>qD (dD6$p(6 P /$M `d€ l`s8-hCCA1YAz>  ? L RL.Ӊk0R$F 0IhhjCI\a T?B ʨG2ZQ=pL~8:lte)/HP.0(HgE$ eC`ۀ5(̇F, 2S4!0@ p PH\ ʀ[($.pYN.7 ҩ 8pE  $+qÆB8\?T@\@p(!a- Rڑb.5iUН8$~H@M j@k@)p@Ӿ" e pSȂ [\ k@ 8̓@)9+"0Pka PPԡx ~˰3eRࢴ1‹X/eB/A=kx=WP 2xPt@T(*~ؙ+uJ#뙷.i8R肧PFdG4pXL`F:~xHTpHy 8G -<7 1?d:\ z^q zXgR`_[%^ip o^؅Xhnr7K&PB.6ȄlJ7w xCqMҏ(]y~ SVh`d fA8BX =˔ (7'B@ˁ` &*H3E[= k%:-xHX?H: X ?Ph++3/0 X(X*g]~Xᡶh2H;p67PDP\CF 0q hmm`5J¤}Ȁ'!$f$<Ȁ ?x&)ざ2:p4pS)9@+$,ú=q2C>AG,T(SZ\H7AL@xQ!!]8]XCXLЀ *8 A6H88璷Mʨ50LMF"Xv(p|fdP ʐ wY0H9؏8h9ȃ`e*#`+)u]+5O?_'1D KЂbxZ'7eI"[P۫R@ɹyaU a( h:KSޚH;2z 0 ySUф(yIm܀L } #,0VH]H  `ux hQC8L,BHHȁȁ.@-)B$聈<Э (=:YX̝.Q: N)gK\93( pyA8$Zg8$N&Or'x [ox멂3LK5O;u0(‚q؆p$m =Sc\ 8FP]`pOh%xP0j0(8c u± hq,8M #@$aRxG\"+aݢiQ*Rd +0D4~MޔOZ3@T0 `!HxoKPuܞ?a(  cM!vzP,`P0(fY" Mf\M3 xt0.XJz/ (0 ފ kY 8X&H6􁝃'qʀЀ9@:M>(xX`ыxyB@("I^K3pS3 Ņ\^ O(CSꂋHY걞,*  G0הM.,[ac؄kj؄,d` 7ehV#>t(չ4@kF6ֈp eŖXMNZ\HBp*0CuDabZ'Є'PMC 4IIЀHPYhRp[C ܅CpOPC:Y&hi2i ЂP%а@]cn(qH@ȀX8sjHqaza3@@XO2 hzA# Qtd5؛= l 8ЁXH% -0AMPBRD)Qs1Y&rZ8d(OXnOȻ[gSsaD)jXkxX󘀄m$f")= /f$Lj.5>L`k`ЅdCC8d`l B~ME8K}(((;0P][xd=u:4N,\fWx 0@[`aRO`` PCZ4cpkc ^ XJMXSY|xn5iX  ؓ~!مi؄q/0 5rmh'̃U{]hGF90Y}K]@Ccm>x W| d080W S1WKؖ50 x*@e8 ,湺&x88: ͟xr&PǪ0_xg?L@.U 1[q8Zpɜ bFli"yIO帄?ֳ5}PjÂMnXYp(hP`[p٤jF iD^uXih) P! <Ȋ@0p%BWDK06x %H"e*8 V6( `0NsbۏxocZ,^Dbd9o3p*S@dD. .h87P!hmy.3rq VK =Ƈc_0uq)_dYl y! (`2מokX/hh %HDo p0&(:P Y`Y xͅPx<&4@58h_+-b EGy˶$` "ֳflvp)+-fT݆/M Bemy{{hp8 8O%x8d !WB.>T3f-bZ4H/a-KB((7 j6Ɖ[5'P 6N6X`"GɵJȩ8auSh1S ^"X8bYbH8n/Kx?_%zJlHk8nll"`O{eHH*. x{n0 hQ nH"VPH@ )Rb, $P@DH0!EJ- IŌxc  xVri*ʫr%Cjx_%,H׿]rѿEGx k^ luip/tp46`?l6VqӦlض1!@=y/XYZIPe@E41ߺu#@و9VsoɌp7_+HL0= SDY80E<ml\%VK-cqWpx@@-"V.z%?HB?8SGG ҅@" \5T@iOЕ1&t@ 8j1@dL=c;%L0ԓ +4u T Nd!EEb(1 PR1xK Ѐ]? ,Up  ܰVȴD A\@E7]$T^v@;8G (o;ȤVlypU);HB ?(Z1O|5%;CvA$! >Pe.2 -T = v rQYT=ьY7`E1pa$ g2@ |R9`īB !/b!d]X1AM 2&@I0 63ŊPͬxB,zýB &N@qUeD(X)(v* Xip& V'&&"PԠ 6d*yIR9̎ \ޘPS#G+xFh@.Db[eн0 A<Y !ԅDz e(`1G,.+ȅ,pf?`/1P9g0+\YXgH l&4p\?J+:@X-kL#7F6mlU $ہD @!> }(JL!8@Skv> L"px*P \fd|ԸhZ c?S  .^sBf9u ݲz'`X+XAl`B3(33d Ј.4U@8) >{<3*OX5\Gmc8/cmiC ,c 153bGp=Pe|@ ItBA4Ԁ,@]5]! A(D`*!`Z„?!  7!@"q, ;0u0 W\d] L h@&h(kdx94aQd P|yRHT8tOUB:<JTEXK*P CG2 XM`#L&yj=_ AJFP XJ&]4 :b<] B@/P*7  èO8Yx@]&Uy'T?D@ 6A^]T, x,ۼ0)d=Wj9!0C @d X\p(O<@8 *LBx4?վ_+E?T@؀iD-@`T  A!kAP?(@C O[lI9!#98UD]E(V@ Hxe!N@P_L@Y<lb+V&AB‰)coE! ʔԀ8 L! A,@4@H@0 cL)7z8#:8c0jFA!$G@!,+`H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧP@UըT̚ץ\׳Dr=i۴dNnQk%(`߂a&+`‚!a`z'+xčCK]fA+2jȉKkZЏg\5]S޽oo3]<؜/ysⴍ/Vܬ٬]Cu׏/]fM~n}w}YwokMzqFzZkmTvjba *bG/(Jh#XݨcR5P=(dOAi$NEL6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ *무j>!,+` H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘؜y)砛tNzb鐧SZh g/l5ضu?čc9;ry{nny߭/`qzӡW~gvܻ^x~ f.?ih=t~(J"߁ҷ L`^8aL}>!~ןy'J#Aַއ-GX<@)DiH6;lib/python/Products/Squishdot/demo/Images/bluepix.gif100666 0 0 1477 7160045536 23555 0ustar00unknownunknown 0 0 GIF89af3̙f3f3ffffff3f3333f333f3f3̙f3̙̙̙̙f̙3̙ffffff3f3333f333f3̙f3̙̙f3̙f3ff̙ffff3f33̙33f333̙f3ffffff3ffff̙fff3fffffff3ffffffffffff3fff3f3f3f3ff33f3ffffff3f3333f333333̙3f3333333f3333f3f3f3ff3f33f33333333f333333333f333f3̙f3f3ffffff3f3333f333f3!(c) 1999 Mithrandir Research,;lib/python/Products/Squishdot/demo/Images/botshadow.gif100666 0 0 135 7160045536 24045 0ustar00unknownunknown 0 0 GIF89aUUU!(c) 1999 Butch Landingin! , 2!;lib/python/Products/Squishdot/demo/Images/greenpix.gif100666 0 0 65 7160045536 23656 0ustar00unknownunknown 0 0 GIF89afd!Made with GIMP,D;lib/python/Products/Squishdot/demo/Images/roundedge.gif100666 0 0 162 7160045536 24027 0ustar00unknownunknown 0 0 GIF89a ˧!(c) 1999 Butch Landingin! ,  !s0.+TZ@u %Ahl ;lib/python/Products/Squishdot/demo/Images/rtbotshadow.gif100666 0 0 104 7160045536 24407 0ustar00unknownunknown 0 0 GIF89a{{z筭???! , sDvM;lib/python/Products/Squishdot/demo/Images/rtshadow.gif100666 0 0 133 7160045536 23704 0ustar00unknownunknown 0 0 GIF89a???!(c) 1999 Butch Landingin! ,t ;lib/python/Products/Squishdot/demo/Images/sitetitle.gif100666 0 0 30042 7160045536 24121 0ustar00unknownunknown 0 0 GIF89a(`ot4`\Z^aH*75ZB:SuE.i.-=PA8ڹ$!pu?MT6wZtvdHsPỸ^ZA|F;DఏbKQD){٪N^sVkmaX,DpM9a/Jps[xƴ?>,qSKDW*%vL/KWhe!P#*3rs=|mVg35ݍU hjkTQ%?wA28Pqp^ѵĤ~jPJDCkfI2@vaKxa}V.V.sЯW+1R M[FF}YJGۚ.|}X]+RΉ8NI8]q[L6XaDMU+*,R`9Yìv?$9GJF7r7D|X=5p]swׁЖE}[-rɸvJ#ad:ϙr[0r=o[BG)B_jsY=m123+?5ihd`X`…a7fˇ=J4n][_X!(c) 1999 Butch Landingin! ,(`@H@l[d*.]Gŋ3jȱǏ CIɓ,ʗ0cʜI͛WDl٬Af+SX*Ǫ)SrUޱճ"l\AS· tzwp8;ȡE_DQ` aJFoC2 !7|kS ,ŨL8fqď[˂^Xi`5@9P܁m0 )$Iˇ!.۶9Fmij3$MWoaZJ9#@ 0KHqG04/qd19^zol6L(@H8P,jL'P6R)\Cy< 4]%yCr1"zP^($!I \ ?dM1P0EEh;z#8s =-@E6O&(@Ḛ5 H0! E6XF+Q@< ?Ȁ,oaIV+b1b%D-C@DG8<p@d@ sb!@%(#Ѕ$""S Љ!Vq0dP !y8EV\p@1+"#d (#Q|2 ]:X N "9 e£d6!d iH-cipޑ .cP&Z)R4` mz{ʎwq :Mȡt,xo0C1 @u`$ܠ"SYH }8/ PBX*WBkA6^cG(H*fC c32 20]@@]F) @p"F+S;#3qK`N #=0]ca #=T4c#Q]$\@/㉓ V6@v SJP"lh@xD{a,~e~VW@Qko@рFcmE?\#rE X)H@^@E#`1 Xr@l b" aAlx Ӡ z cq` 1P3A@b  " 2p2spK3q @ u@ p}R p^H@õ} Nk@ 6 4@Q" y 7̰0! 7l>0a@ `l.5&8[ o#0 PBp `o0  G@g(P  ٠1M #@' "<`urV#/P4FpE'@ G s BH0"9E<0>~ą!"v@ `m ? mh W5e@$0,N`@$ @`0 N@F1 0Ԑg`q5TG#`}4j#  ǀNHW f@s} Ro ˕pWo&r0kp60\b710(h Kp <7N$*0` Qp %*B`"='p=0 kP j Գ+ =>L ږ ),@óy n%yPdU QZ op0ZXR 3mF4 Yp@݀ؠ .M @| `Z\PP;CwF `1{ O0X RSTB0ķa$/QMbGHRPk]P࿖Sҽ b9nCP„/,eJ >hH"08jxG)d`87pI$nDFnrȹrLaEU1X71R!~ظ(4>jđdANSpxIIpi$l4g2Y2<$2hoBjx7tAԑ^;c'F0b#6(E&Vj>@(Fӄd@2@bo脁oD Td"x 0zcc P,BdlCf-ܘBM$ʈ RNm}'& _|#ܑPQlZGD[WpA\)a=#(N@rp#4@cnf33f x0dAe&|j$TYm`l3lHfG hf`f/b4?8meLJWN1?lk4yhnعO)A7A,d9q A b \q6l# $$2Ha8Pab1}B!H*0p; DP`>l B̰4>l KX"t?. BFpB|Y)ϐ@5$`XC!b쓌'HXG%QLcEBp踁^9Xa0 Bbri$/]I`@n,$1 b 6qe :p! $A $PHA8"3EF>@K>pU `hfDcɸ*1_0GBlp$|p w mg3$> o Q smgcxA@1SbF,1haI 88L GYD%Bƀ$cې% o0` X2 !a# HH P%pأM){’+"O66 c8912@3^ ` @`tpnaRxE| wbm}El{b X6!UH%m(b`r(`nqk=_r*Y| C~$ I41)8ƉdGh 2$Ƞ) 40@`M1J!>P<P*ċjť23cpi''R yCaE&2 D/s$LjWM ORNfbGF A}3PuBIq $݅sw "PAc @ TcB2@h 0*K9N@0" [`J!a@@< l`@ffA  1>.PA{m0Џ/!  HlDzB ,$Y8R@q=MrL"V#!؃XOӬƃ3)0mC筪Yq ɀ8a@ j&|" 0(BR~qR/!;h+À: YLPΪwdgE zMDͰъ?@?~ x Xq 91P+wX+C27.a]UcŻ+pU1$7Bq>!f C,A)0;W:a[Ѐ,kЀ5ЈQ vv脃 cDPl C8`N`dITH40x`D7``t Ȇo,=D؂U6J&PR]LA@'@U`0ʂ”VB/H `a0PTY0ۑr9 83!X{1#kKUʻĂJ@>xPDH3P}pB6ixԟ`ba01``0ՊMHKtTuXU;(hf@H6BP O1$`NQXּW!2RlE@Ehu؆69I@L8ayMO0G8qwP6 hRj cx[6:eX8% S6'PpHHծt,aXeh`xؗ 0@CEOn7w3gxz(ZX#@Yh,Fm(@#A@Dv؂;CN5$P{l8kPՋy89"0 j/s6,5D+M8Ax|ӵf l؂씇DR xn6nhDVrЀ+[TXmYr,84гy6*ȋmIEPabd{N< ;݂(P{]tao:hyѮ&ۄo;Y^6@ ՄAJX@)f56HL0l&;? }yyY-!<88:`?0F $XIBAw(E BB(uPPEqnd\\w磆r(kڤ5eb[X =\ȅf8 6$8hehA^hHpb JތKH[Yl]K0a@ j 0t  RŔHN ~X8p̹O~w@=8cHeV-}?Qxvh;{Px/_Hxsk&N9@_`ehN-`chOwH*h2R0V038ׄ`؄Z܊_ ihQ%0 @t)(QP0Q }rȁL gE<A2n`C+4ЂB{bEqxg[=Cx `8 mRj3%vgĆs@ȿ)@ $Xf`$;HO@f@4p#`O 7ϮuuPڎGVL!h.ܖtDcRAHwHYcxC`Jo{# .Y\ʆCXW+HmAA,w纅5.V8؆HG0`0_r<@H膒P' Ne~Gy֘b9C0Y8 ]Xk`܃:ۥ'0 \ۄ)xfX@ePṌpLN#N w_dKSpaIHT| wu:ƂD,xpe` 2l.[DdQ%5dC$IFš6 ,hH,OFo $1-"[YJ-R89<3@?` Aמ"PG̈́)3B6 ;lc'M D+^ 0(C( $l!8"%^C2 e11  .A!#(18qBO EZ\sbDwHx< 0$ ;*,$ A CfS 0n‹ ̚1B6P05(@"AY"J:i0CP)ldA  @#Cǘʐ?րd3Y E@)e<0Hd"# :,g6ģO82$6҈-;.{.骻..;/{/// <0|0 +0 ;lp@;lib/python/Products/Squishdot/demo/leftbox_items.tbl100666 0 0 202 7160045536 23521 0ustar00unknownunknown 0 0 name urlname relurl | up a level|/../index_html|1 post article|/addPostingForm|1 search|/searchForm|1 admin|/manage|1 lib/python/Products/Squishdot/demo/messages/images.zip100666 0 0 41613 7160045536 24025 0ustar00unknownunknown 0 0 PK&pR rtshadow.xcfK-PHNS(300dV fb&( \A4H^9&0001 T(1o:Լɚ N% >y)yy bPS$6̕ Z)19;(4/EA X b 怲aYFb y `I91@ \zT1~73# ;3ЭPK[&SR! Qmq:qy%XǸϨOQ3FM" QVY CA F|yT7`,x[ڏ@mNL $%w@8^NJ:T>H%`K&Z%/} K@_ RЗb_pm񖈭QHW'{0$' /@^( QScYuS\ MʙT TP;ue"dtfE {9Y\ {`_-ե٩jkcXƐY} DQ J2R(X CS4H2\BA}ب -1SvR .h(60`nFgmYut1S4)b& LR, dyۆp916 20џ: E4z!pz+^3\r H$^oM3p[ުpUp[֣^p[ }=(\Z4\_%C thf8RH OD>4R=x sLZ;<'u8a0!Ȧ6Ȓֻϐmm0SU{"kyeU2M2%ۢ]aoஏ Ru0Y}`. CDR[:9pКi*X5~8kl靐`&5DU^ȹ&3=Krzjlzw0ra#*DpN{h*@äf6q$ xc69=׿k(1^$jow@Io.m1-j^7: : F)W0_3ϲ,0W@ Jj`rt _I_fNB^Zsܟ"Ф瘓uZW%YQj+,z 3m| L&l |6Q˪ K9\DyΙtlM$Lfj3J@_?r_q_ܗ; ;J%$%i?Tw I*NRp'sq2'Cp '!8ljNq‰N p" fD[4(Ո$'8<,C9umr <3N5b|q1##&h!T}-G4@( N+wYP)}Ɂ(h.зM h#Я@ǁ.8Џ8w@y)_&fy)SX?V*E ņVҚסA yieTBTRFebL}tcXm4({k^⽷A ['{X yWV!_ 54TW\C;{/SX?V*E ņ0ޚסxmth/jCV^}<BxCzoЪU{"kyodkP#+FٚGM<1E_ ~5(O ~b%1 ){qguc ?:B|N$?c* n ] <-o1xw1x[9xW7ӋxۣؕbW6w9H'C/kJ i?q7*u@> oV>m B3w p 6@A@- sR_ h#4 L,\|@wqm-QcƓfY%/ f)&0A `ei #X4elkh^ x^ /?eH%^{|mA̕pGŅ<ÜbSHͫβ 恡;s2OgZSw>~@su{l5K?ӥ[Bo{&/7eNmbn6y'%y##zvlԑUptwJҢI#quaq J-;.֖@ ^Lz{pҔmu۸8B Neab:PgAs݂xu |z£Rpu(~%ޭɋ_A-22׸yxFYR8 %l^匱wl],B;9߷5iO"tjboe!3)OifB|xN̰~]VSȌqh4Mߵ]֖R-;^u6ue=&?̀7d4aJzٓ+}ZN kPewtwn]Ͻr|X+r #?{#r23N;rp/hʮc k9/)eZ]Xoɣqȁ;.iE7% ȫ ߽}#/ ߯n <6-z%34nw%_Ϗ15fH֌K ˹t.DNZ˄ٟN?!cMݾ~JfcLِ fM;u2X8^>D]7Y䫄Yq1cG׫[XCnS 4f>xu=;_gO8f}{vءMkUas~;돛֬X`IFDֵcPMaFՐ.{neg=.|OF UoJ4C^D꾟S֯Zc>ޭSy7V507c%iM_~Į};]s&hP]@ZM3ScDkE/׬X4֔# c~.XUiin X H>VAGo>9ylZU.g2FF)Mާ{ׯ^8utNIcE9;nb ڴkK))6&2M(sZӿyA}ulܫCc+%H`@ qȘ݅.ݴVu2RL2?s/[,jQF椭rZkILϸkYnj_tJ2bB]Dz2ӎCRYFG>ЗhXksRPIRû[ܸqӡe3H@Ev=coψAn!<] "xc]{+ʹSGvo]9S|4 S;Nvּy0߀#' ;(-` (?=/ёumXei#-vmN^2 >wMt8#JnۿcʅsZ7P5 P֨p϶K̜8kZNhi6'}鸡z`3\e;Tra!L˫1P3cչ'QAߐjM?Vܜ29Cv vuQrz,l z08iHe@5EB[ck* *nIp֖\+PP艿zg;8A ((oT-s8/zM TWĖVMNWZr}9t@k v$r5XH[$#T$E{<5e36`Lz*XU>sp8 FF3FA) 0PxZTRrP)fb2 kF',N)0qY.d(֔RP@bE"D ֞1,,VN5%-*P^9=8,U6 Lh2dq 'oKZ8sp=LX"*}gȈ Ir((+bEbB*+Q +FLVEbQ@%%̝w3U9;!\;/,h~6,+8\f擛8y3*P"wl_`@GsfPFB7woX!Uv2 @ۇ'#COh/:R >(|yxPxl}1bH|Qx}ju & s3&JDt{zMA3F r0T|c1|&_k|%Q"#XSƙ},yFUkA˻qG;coٴOE.w}]q2_$]op?[SdrD?{8Z:[@2ŚVjv5cj˰V;|/)P9sf ,'hMstZOC8o䥨sFm={pp?|ԏ2r led+ yȅ %^șXR6r"Zr$,Qꡦgb5Yކvn^`+*ck![j&V|LC6 %b%5-}SWf-ţjXy/m3۾|']YAG5 \b. GU1=8 !.y Y@W%Sz9}e4t- 7sɺmN]̠5r8|G^KNA}U5v1aNP#LL'߉Vl}BR#1nbya{]uXaU" 4rR@ȘoVoS!&_y˷/GPSE;qӴe0Řm ̕g95 -mȀcl+I),[;4 1JEMXTEM#:\|a,=GL P  PG/mCK#& &q-ml%@:9S6p0|¼M{XzAȨi;x ?gEXػ.TJ of3nv=17iMm 4tO  8EP `A]ĦK~RGRfd!yp2$L,l˸sW <{)>1QʫٟI eXkبlu?|/*-E *zx =i悠5a{8w%!a }khlB<67*`q=| Wy߾45 yzY29:Sw3jūv_~[T'2rWHEJ0_Kұȉ޼+_g.*bͳtaȁ>/ހ`2?U6H)ۻy Ԍ5M(0RMX>oʼfiY&)Ra:ͽz[z@i +|'^n˾yZgȜt2)C:}66SXV8!t C69z.>,0AQ5kDeFM_6VG<}ΓX 뎜ONIRRYa4mSa݅fUXK66&>~44wS16=}:hKaSGI;Dj-l-,*Rˆm#lŖN؆MJ ۉ-NMv7b;$.N WaWW4 .J K p_! eBl]\,D䬈9ɇl=AEhy@# aS%G{ SC` F` F` ?`pYUk\U[1[O Y"9eU-sG.$>M-Ba>tc? xGuN*'~_(.[OM;u#RVTMIW =C3k5g9Og}vη>k5~3{1N˽^`7k7\F*} wn:{Ƽ0+?܏lyU޸)S‰UN׬}ok[}'\T F_9Zm.=':/_y'EOtj9f{^{˽_~en")g S}WnWz\?Kuގ%RɼIn*ؕ#ɞ[uj꜅_HtE ~ s-~c_`?mW!9*9y{;}yDӺVu;Kƭ:^OZqi]^eIoI:km'HK;m."Ͼb^CrytaӅ5saJO}n[n,k?g}qd Η#]XHJao~~k?e/Wo3.9 lsIzlKLtL˙}xp=iZHxCd>v{c֘g}vy sYWƣe>okQS9RUNV'ݟi丗M6n챊mnIUhԪSܛ,v]{#{*.lݮ:W||ͦh!ۆqν3>\nC3}j껟J>>ޙԷ,8HݙJ||Sh&n4;=w|lT/\ Q 鞣עkcB5;ʙ7jչנ;,7lT:t{VPpB [v|JFyt{] |bs+zrӽ(Ow8h/lpY@pSwqS|œTׇ^y?Ф7Q-5Ar4.sCؗf9d^k~-<=Ͼ]g86tXBf՛v*ΰ7z-=tWik p+[tyG&t5MF5뉗|„+|+hvt U-{s+Hv|SluM\wS 7ek[qq^ko{hқ V+_|.ܬcoq&miS[ͺ#co5f?awq2]iZpC{gˋ8bip#M+% h.Gr@;p?^|'Gٻ:> 77QO&pʼnީ%J++cvM]}cw#~CIDrR~^7|Y u9^$n5w'ogڻ;yJr9U)|Q_R){Xm?Lϴ5W5d6Ek6E[rvk䜐."f=ܯV_M_Uε;I˾ _:YKWv!pd YW_3R^C^~ZAou~F}Y\fw+Ͳzto :o{ V~=ї pߊy.{m~0܍[ͫyQaٻv dό\KɆ-; n~M=cp[w }9K&ZYmn{UV`xbxbxbxbxbxbxbxbxix*ĠUNm~W>.[JYShl\B|*y[$:yYo{9LUEVHZUJU SS%UQIDbI$}%PII%K!mIs%͓fokμkμkμkμy͙לy͙לy͙לy͙לy͙h͛Rn9;+"A6Yo(G E-KX.9q8䪎#YSPNKԂ[Q> 6.ۖ8LmShKz-L^>'KqKp$#`Yq`| |Z~6C^`%{vbU03U[/7UUmn[+[Sg\%ِSM|N VM}e&0S|EzS_)p;9U5wVMm^׫sem`kI+Z չZZU* J.Ww?s{'6;UNuc߮2VKT.@\ŴlEfңYjm/iz7-+oJ~|mXTi%c{PY֔7mޣ.Ϳ[ >(B9f&#u|XՑ*ekk^xKOa*۫(FRHlkSj5,UX=Eg} nN·n^ ]nWV8UδZrQ/KAzҳe.`Sۼ3e4~F5η~rOa>yT~NOiFRƔ< n̗a&whʜ2r S/1{$D9 w}pT|שnUYڢkcs9Z#9F,kj]_]{[[[-[z|ņF{FӼż6w: ޚ[3x3xZ ^1wi}r][Y.Y֏0[-tReAjucybWc|pfNf3~lƙh&jv&0Y=,dLVd)ȿ;S"*E*GLdlƫ$$bglSyLKn \^ԁ[T Ӥ*pʱ=0 I$ J+io% ;%"֒.$|g )|g [8$-Gj%3_>o=u#[ /x IrU~I5 3U6lt 6mWQG%ͻMwSsU*gI#*GUhv|J*42 rW/z*STUD7ͯMWEuqx,H𫢅UѤؓ&8JM?R#0%y@x$ cXrUocQSw$4Qrظo.O @PEz㿢K&~T@Gǒ:~ #9 8Esy*$0%xK,}q||| Ym-77&ehhh䢳Z- ;/p ]h;lhhGs [.̯beF 0` 0` 0` 0` 0` 0`P S˔M`Jl<)H'P (ES$0{ @PI`  @PqJ0#@4 LJ0hAbe(!S ,CCCCCCCCCCCCCCC63r }in܀܅U,0` 0` 0` 0` 0` 0` Jr 5Y| `BL0SYMAItR$0{.!Z H:A @4 L @#:Ss&)9 @Pj\?Ȟ?FD=@b.\s\s#|ѧ; )ϯ.<<<<<<|rfNDnߡK)ϯ.<<<<<<|rܾCCCCCCJZS_]xxxxxx> 0` 0` 0` 0` 0` 0`d,Pŗ)&3e>ʼnMb @ @ @ @ @ @pT7<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<|QC:n8چOnxxxxxxxxxxxxx> 0` 0` 0` 0` 0` 0`d,Pŗ)&3e>ʼnMł @ @ @ @ @ @pT7<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<|QC:n8چOnxxxxxxxxxxxxx> 0` 0` 0` 0` 0` 0`d,Pŗ)&3e+FJ:H^>CRPK膛&urtbotshadow.xcfK-PHNS(300dV fb& fbNKuu׮]gooI䅁i~1(T!avhaҼ CbM1 U9l`Vp!y)yy bPSF$6̉@,씘^_ah`[ SlP>ɀ ͍Ab" f;r@c5b=` ĽPK&pR rtshadow.xcfPK[&Squishdot is a news publishing and discussion product for Zope. It creates a place in your website where people can post short articles, news items, announcements, etc. as well as hold threaded discussions about them. In other words, Squishdot is a weblog product. %%

    Squishdot Features

    Squishdot is a Zope Product, i.e. it works as a plug-in module for the Zope Application Server. It provides you with a news publishing and discussion site with a minimal amount of configuration and day-to-day administration. It is also easy to customize and can satisfy a wide range of news publishing needs.

    Like Zope, it is being released under an OpenSource license. You can use, modify, and redistribute the source code for both commercial and non-commercial purposes following the terms imposed by the license.

    Squishdot was inspired by Slashdot, a news publishing and discussion website (i.e. a weblog website) focusing on technology and the open source movement. While I credit Slashdot with many of the ideas I have used (e.g. navigational structure, mode of interaction, look-and-feel), I must make it clear that Slashdot is NOT in any way affiliated with, nor does it endorse or support Squishdot. DO NOT request any support or submit bugs, enhancement requests, questions etc. to Slashdot regarding Squishdot. Instead, send all email regarding Squishdot to squishdot@yahoo.com.

    I have used the look and feel of Slashdot to serve as a starting point, a showcase, of what can be done with Squishdot. As I get more suggestions and ideas for improving the application, I hope to develop its own look and feel and make it more effective in its goal of disseminating information and fostering discussion.

    In terms of the actual source code, Squishdot has been derived from Confera, a threaded discussion Zope Product and it retains or extends many of the features included in Confera. These include :

    • moderation options : both articles and comments moderated; only articles moderated, or no moderation at all
    • search by author, topic, title or words in the article/comment body
    • automatic article expiration (articles automatically deleted X amount of days after posting)
    • attach files to articles and comments.
    In addition, several features have been added:
    • subject topics -- you can create subject categories to group together related articles
    • subject topic images -- you can optionally associate subject topics to images
    • additional fields have also been added : a department field and a summary text field
    • preview postings button/panel *
    • RSS/RDF channel page included (for content syndication) *
      If you wish to find out more about RDF/RSS and content syndication, visit the My Netscape Network page.

    * New for version 0.3.0

    IMPORTANT NOTICE: SQUISHDOT Versions 0.3.0 and up will not work with Zope version 1.x.x -- they will work only with Zope 2.0.x and higher. YOU HAVE BEEN WARNED.

    Squishdot versions

    Squishdot version numbers have a three part numeric format separated by a dot (x.y.z) where x is the major release number, y is the minor release number and z is a maintenance release number. This current release is currently 0.3.0. As bugs are found and fixed we will be releasing versions 0.3.1, 0.3.2 and so forth. The second number is reserved for minor additional features or architectural revisions.

    Because Squishdot is currently alpha software, I do not suggest using this product for high volume, high performance, or mission-critical applications. As of this time, I have not tested it for stability nor optimized it for performance. I cannot even promise, at this point, interface stability (i.e. in terms of the interface methods). While in time this will change and become more stable and scalable, don't come crying to us if you use it for something on which your job or career depends on, and it suddenly borks on you. You will only have yourself to blame if you do this <*grin*>.

    This cannot be emphasized strongly enough: Squishdot is ALPHA software...don't get mad at me if it doesn't work for you -- ask _*politely*_ for help in either the Squishdot mailing list, the Zope mailing list or mail me directly -- I can't promise you an immediate answer but you'll get always get one (including my ignoring you ;^)).

    On the other hand, if you really do like Squishdot and would like to have the quick response to enhancement suggestions, customizations and technical support that one would expect from a professional consultant, and would be willing to pay for that level of service, I am available for that, too.(in fact, I would love it!!). Email me at butchland@yahoo.com

    Attribution request

    While not a requirement, if you are installing Squishdot (especially on a publicly accessible Internet website), I am requesting that some attribution be given to Squishdot in any manner possible, in the same way that Zope requests it in its license; for the same reason that Zope also requests attribution -- as one way to promote its growth.

    I've created a Squishdot logo and modified the DTML code so that both the Zope and Squishdot logos are displayed at the bottom of the page by default. The squishdot logo also includes a url to Squishdot (http://squishdot.org).

    If for some reason you would rather not use a logo (e.g. it clashes with your website's theme), then just some text mentioning (on the main Squishdot page) that you are using Squishdot along with a url pointing to the Squishdot site (squishdot.org) would also satisfy my request.

    Miscellaneous items

    I welcome product improvement suggestions, code, questions, praise, money, beer, beer money :^), bug reports as well as criticism. You can send all of them to the trash, er, my secret bank account, er, squishdot@yahoo.com. Please prefix the subject line with a bracketed category name, for example [BUG REPORT] so that I can easily classify the messages. You can also sign up for a couple of mailing lists that have been setup if you want to get the latest news on Squishdot.

    If you wish to find out more, the other articles provide information on the configuration, future direction and other stuff regarding Squishdot and Zope.

    Also a comment about the default topics and images I used: I hope Digital Creations and Zope.org can pardon the liberties I have taken with their logos. Feel free to throw them out the moment you see them (except that one image used for Zope Dopes).

    I wish to thank the guinea pigs who tried using, as well as debugging and patching the earliest versions of the application -- they know who they are -- thanks for your patience. I also wish to thank Jeremy and John for helping me out with the 0.1.0 version of Squishdot with some of the graphics as well as the debugging.

    Lastly, I'd like to make special mention of Bruce Perens, whose generosity has given Squishdot the resources to have a nicer home on the web, but also contributed to making the product better. Maraming Salamat.

    -- Butch Landingin (Squishdot maintainer)

    %% lib/python/Products/Squishdot/demo/messages/message10.txt100666 0 0 10032 7160045536 24351 0ustar00unknownunknown 0 0 Customizing Squishdot (Part 4) Zope Development Butch Landingin butchland@yahoo.com 1 you-gotta-concentrate-extra-hard This is part 4 on customizing Squishdot. This one discusses the configuration tables and some related folders which control the navigational links to other parts of Squishdot as well as the semi-static information displayed on the squishboxes. %%

    The Configuration Tables

    There are three (3) tables control what navigational links and boxes are displayed on the left, right and bottom parts of the Squishdot pages. These are instances of the TinyTable product that are not part of the basic Zope distribution and must be downloaded separately. The TinyTable product is available from the Download Zope Products page at the Zope website.
    • the bottom_items table - controls the links that show up along the bottom part of the page. It consists of the following fields:
      • name - the title displayed for the link
      • urlname - the url's href parameter for this link
      • relurl - if set to blank means that the urlname given is an absolute url, otherwise the urlname given is relative to the value of topic_url (i.e. the url of the Squishdot folder)
    • the leftbox_items table - controls the links that show on the left part of the squishdot pages. On the "readmore" pages, additional links show up that display links to get back to the main page or main article -- these are hardcoded links that show up automatically and are not part of the list of items. The table itself consists of the same fields as the bottom_items table and play the same roles.
    • the rightbox_items table, in conjunction with the rightbox_methods folder, control what squishboxes are displayed on the right hand part of the main Squishdot page. Unlike the other options, these boxes do not show up on the other Squishdot pages. The righbox_items table is composed of the following fields:
      • box_title - the title of squishbox
      • box_contents - the id of the dtml method which should be located in the rightbox_methods folder from which the squishbox will get its contents from.
      • box_url - if the title of the squishbox has an attached link, then this field contains the url of that link. Otherwise, if the title has no link, then it will be blank (i.e. "").
      • rel_url - if the squishbox title has a box_url, this flag determines whether the url given is an absolute url (value = zero) or (value = 1) it is relative to the topic_url (i.e. the url of the Squishdot folder)
      We are also currently working on an example squishbox that incorporates a survey, so that you can run different surveys on your website by just updating the rightbox_items table.

    The rightbox_methods and misc_methods folder

    These folders contain the DTML methods that are incorporated into the Squishdot pages. For example, the rightbox_methods folder contains those DTML methods that are listed in the rightbox_items table (discussed above) that show up as squishboxes on the right hand part of the main page. The misc_methods folder holds those various misc_methods such as advertising (which controls what advertising banner is displayed at the top of the Squishdot pages). You can easily turnoff the Squishdot by taking out the html that displays the image in the advertising DTML method. You can also change the quote displayed on all the Squishdot by updating it in the quotation DTML method.Note: We are currently working on a product that will randomly generate quotes from a fortune cookie database, so that the quotations can updated automatically -- one less thing you have to administer.

    You can add your own rightbox_methods and/or update and/or delete the current ones in the folder -- just make sure you update the entries in the rightbox_items to match the DTML methods.

    This concludes the series of articles on customizing Squishdot.

    %% lib/python/Products/Squishdot/demo/messages/message2.txt100666 0 0 10156 7160045536 24301 0ustar00unknownunknown 0 0 Feature: Installation Instructions Help KmdrAdobo squishdot@yahoo.com 0 stuff-to-read If you can read this through your browser, then this means that you have already completed more than 90 percent of the installation tasks. Squishdot would have come up with a default configuration along with a set of topic subjects, images and articles.

    If you haven't installed Squishdot yet, there's some documentation at the Squishdot home page to help you on your way.

    If you're trying to find instructions on downloading or installing Zope, visit the Zope website for instructions on setting up Zope for your particular operating system and/or hardware platform.

    This article focuses on the minimum set of tasks to clean up the default configuration and prepare the site for initial use. %%

    Step 1 : Set the options and properties, and clean up the default configuration

    The first thing you need to do is to set the options in the Options tab of the management panel and set the moderation option, expiration days (if any), mail host, and maximum main page posts. Then you can also go to the Properties tab and set the site name, color scheme, etc. Next, you can go to the Postings and Subjects tabs and delete the postings and the subject topics. Now you have everything cleaned up and ready to go.

    Step 2 : Set up the topic subjects

    You may choose to use Squishdot without any subject categories. However, doing so imposes an additional burden to people posting articles because they need to discipline themselves when specifying a topic subject -- because when no topics have been specified, the topic subject becomes an enterable field, not a dropdown list -- so that it remains a usable criteria for searching. Building a specific set of topics makes things easier for the article posters, because they merely have to choose from a predefined set of topics.

    Step 3 : Set up the topic images

    You can also choose to use or not use topic images to associate with your subject topics. The default configuration will work without images, although some functionality will be taken away (namely, the anchor links associated with the line of topic images at the top of the main page, as well as the link associated with each article that leads to a search of all articles belonging to the subject topic).

    Step 4 : Set user access and controls

    Last, you need to give or restrict access (especially if you have the moderation options turned on) to those people moderating the article postings and/or comments by defining roles and assigning roles to particular users using the normal Zope access controls (i.e. user folders).

    Note: Make sure you set up the security privileges for both the TinyTable and the Squishdot products to match your particular user access requirements. For example, for Anonymous users to access Squishdot (in fancy demo mode), you might need to set the "Query TinyTable data" and "Access contents information" security privileges for the Anonymous role either at the root (i.e. topmost) folder or the Squishdot folder. If you wish restrict Anonymous users from posting articles and replies, you also might need to remove the "Add postings" privilege from the Anonymous role in security tab as well.

    Note for the 0.3.0 version: The Manage postings privilege does not include editing the contents of postings, you'd need to have Manager role privileges to be able to do this..(this is a known bug which will be worked on in the future)

    That's about it. If you wish to learn more about customizing Squishdot, you can read a bunch of articles devoted specifically to this topic. There are also other articles about the DTML/HTML used in Squishdot, as well as the classes, methods and variables that are available to manipulate it.

    %% lib/python/Products/Squishdot/demo/messages/message3.txt100666 0 0 14300 7160045536 24275 0ustar00unknownunknown 0 0 RFC: The Road(blocks) Ahead Squishdot Butch Landingin squishdot@yahoo.com 1 what-the-future-holds As more people use Squishdot, I hope to enhance it to become a more effective tool for their news publishing and discussion needs. I have sketched out a tentative plan for the changes we are planning. I welcome your comments and suggestions. %% As with all plans, it can change suddenly (Update for ver 0.3.0: it already did) and without warning. I are presenting this for review and comment, but don't hold me to it (Update for ver 0.3.0: I don't).

    These are the planned releases of Squishdot:

    • Version 0.1 - Initial release. Update for ver. 0.3.0 : Planned. Done. been there. done this.
    • Version 0.3 - Currently this version. Focus on usability features - based on the responses and suggestions I get, I hope to implement those features that make it more effective. Among the things I'm working on are:
      • A preview button/page -- so that you can preview and edit article/comment postings prior to finally submission
      • Converting the dept field into a more functional categorization (like subject topic) -- although this is under debate (alternate solution: keep dept field as is and add a new field named section)
      • Add a keywords field and index for additional categorization and searchability
      • Ability to modify the main page display criteria by different date periods (e.g. daily view, weekly view, monthly view, etc.)
      • Add posting date to search criteria
      Update for ver. 0.3.0 : Only the preview button/page described above was implemented, and instead an RSS/RDF page feature was added to allow content syndication. This document is now obsolete and will be replaced in the near future.

      On a minor note, we are also working on a fortune cookie Zope product (this will replace the static quote at the bottom of the page) and we will also try to bundle in a working Poll Product example so that you can run surveys as a Squishdot squishbox.Update for ver. 0.3.0: There are two fortune-cookie products available for Zope which can be used to replace the static quotes found at the bottom of the page, One is the Zippy tag implemented by Michel Pelletier and the other is the Fortune product by Lalo Martins. Check the Zope website for availability. Unfortunately, no Poll products were listed for Zope2.

    • Version 0.5 - first major architectural rewrite. We will start looking at performance issues in this version. Also continue to implement and evaluate features for usability. This release will include those features which we have put off in the 0.3 version which necessitate major changes in the interface and/or implementation.

      Among the ideas being floating around is the concept we call "article stalks" to which you can attach/detach articles to -- something like a section page of which the main page item list is (currently the only) one -- which have customizable color schemes, images, etc.

      Another major area of work planned for this release are user identification/customization features so that you can customize what and how users see the articles and what they can do with them.

    • Version 0.7 - continue evaluating/implementing features for usability. Our ideas here get fuzzier and fuzzier the farther we are away from actual implementation
    • Version 0.9 - last major architectural rewrite prior to releasing the 1.0 version. At this point in time (if we ever get there), we hopefully would have had enough feedback to be able to include the major features that are critical while taking those things out which just clutter up the interface. This will also serve as the beta release and hopefully things (code, documentation, etc.) will get cleaned up prior to version 1.0
    • Version 1.0 and Version 1.1 -- at this point, the development model will fork into a stable release series (even-numbered minor release numbers) and experimental release series (odd-numbered minor release numbers). Hopefully, there will no major interface changes at this point (other than addition) so that sites using the stable releases will be upwardly compatible with later releases. Major interface changes will spur the increment of major release number but as to when that will happen we don't know.

    Depending on how well (or how bad) users adopt Squishdot and contribute to improving it, as well as how busy we are going to get (on the stuff that we get paid for) we estimate the time between release 0.1 and 1.0 to be between 6 months to a year. But don't hold us to it. (Update to version 0.3.0: the jump from version 0.1.0 to 0.3.0 has already taken appx. 4 months, so this is really not likely to hold either) .

    Last minute addendum: As we have begun hearing about Zope2 and ZClasses, we might incorporate this into Squishdot to make it easier to customize. However, as we have been lagging a bit in learning about the new-fangled features of Zope2, ZODB3, etc. so we have not determined at what version or time we can incorporate the pixel-dust magic that will transform Squishdot into a subclassable ZClass, unless more knowledgeable Zope masters deign to impart their deep wisdom to us lowly mortals. We've also seen the Catalog portal demo and we are thinking a lot about how to integrate it with Squishdot (especially the personalization features).

    Update to version 0.3.0: We've added the preview button and also an RSS/RDF page... -- these are the two major new features in this feature release. I'm also working on a design document outlining Squishdot's future direction. The next major release will probably include bigger architectural changes to Squishdot (if all goes according to the general plan I've stated above) unless I get side-tracked by other more interesting projects.

    --Butch Landingin <squishdot@yahoo.com> (Squishdot maintainer) %% lib/python/Products/Squishdot/demo/messages/message4.txt100666 0 0 2150 7160045536 24256 0ustar00unknownunknown 0 0 Looking for testers Squishdot Zope Dope squishdot@yahoo.com 1 1-2-3-testing-testing As you know, Squishdot is currently still pretty much an alpha product. We'd like to change that and you can help. How? By using it, of course! Kick it around for a while and then tell us what you think about it. %% We especially want people to test it on different environments, especially Linux, BSD, and even on Windows NT. We also want to see how well it works with all kinds of browsers, especially the more uncommon ones such as Opera, Lynx, etc.

    Send your comments, bug reports, wish lists, etc. to squishdot@yahoo.com. Prefix the subject line with a bracketed comment such as "[BUG REPORT]", "[FEATURE REQUEST]","[SUPPORT QUESTION]", etc. so that we can easily classify your messages. We cannot promise a prompt response for your questions, however.

    You can also sign up for a couple of mailing lists that have been setup if you want to get the latest news on Squishdot. %% lib/python/Products/Squishdot/demo/messages/message5.txt100666 0 0 10105 7160045536 24276 0ustar00unknownunknown 0 0 Customizing Squishdot (Part 1) Zope Development Butch Landingin squishdot@yahoo.com 1 you-gotta-concentrate If you want more details on how to customize Squishdot then this is the article for you. It talks about all the things you can do with Squishdot so that 1) it fits your news publishing and discussion needs, and 2) it integrates seamlessly with the rest of your website. %% There are several major areas of customization :

    1. The Add Squishdot Page and Options Tab
    2. The Topic Subjects Tab
    3. The Images and Topic Images Folder
    4. The Properties Tab
    5. The Configuration (Tiny) Tables and Related Folders
    6. The DTML Methods

    Each one of these items will be discussed in turn, except the last item -- which has an entire article devoted just to it. Also, the classes, variables and methods that you can use to access/control Squishdot are also discussed in another article.

    The Add Squishdot Page and Options Tab

    These pages are actually very similar, the only difference being that the id/title fields being modifiable in the add page and the options for the default web site setup does not show up in the options tab (i.e. it's only applicable when you're adding the page).

    Aside from the id/title fields (which are fairly self-explanatory), you can set the following:

    • Mail Host - setting this to an actual mailhost object will enable the option to notify by email the article/comment poster when a reply was made to his posts.
    • Moderation Options - there are three available choices :
      • Posting both articles and comments are moderated -- this means that all postings must be reviewed in the postings tab before they can seen by ordinary users.
      • Only postings of articles are moderated -- unlike the option above, comments to articles are not reviewed and are automatically available for viewing.
      • No moderation -- this means both articles and their comments are automatically available for viewing.
    • Maximum posts - the number here refers to the maximum number of articles that are displayed on the main page before they start being moved to the older articles list. Based on this number, the minimum number of articles that are always displayed on the main page (regardless of posting date) is computed as one-third (1/3) of this.
    • Expiration options - these options control if and when articles expire (i.e. get deleted from the database. Articles can either :
      • Never expire - you have to manually delete each article if you want delete the older articles
      • Expire after a set number of days. You can set the number of days in the input box for that option. This way, old articles (along with their comments) always get cleaned up automatically.
    • Default website setup (Add Page only) - these options control what the look and feel of the website that gets automatically loaded when adding the Squishdot site. There are three(3) options available:
      • Plain vanilla web pages - this has the minimal set of features needed to establish a news publishing/discussion site. Use this if you want a very simple interface or plan to design your own look and feel. This option will not load any images, topics, or articles like this one you are currently reading.
      • Fancy demo with a slashdot-like theme - this gives you the same color scheme and look and feel of the Slashdot site. This is just to give ideas on how to implement features on that site. You can select this option even without the TinyTable product but it will not give you the same ease of configuration than if you did have it.
      • Fancy demo with a 'blue heaven' theme - this is like the Fancy demo above, except it has a different color scheme and some of the options are set differently. Both of them have the same navigational scheme and features (including the preloaded messages, subject topics, etc.)

    The next parts will discuss the rest of the topics. %% lib/python/Products/Squishdot/demo/messages/message6.txt100666 0 0 17526 7160045536 24315 0ustar00unknownunknown 0 0 Squishdot DTML Organization Zope DTML Butch Landingin butchland@yahoo.com 1 stuff-to-read This article delves into the structure and composition of the DTML methods that make up Squishdot. Hopefully, this will serve as a guide for those of you who wish to modify the look and feel of Squishdot and need to understand the interdependence of the methods and associated folders. %%

    The Main page

    The main page (index_html) displays the list of squishdot articles. It consists of the site header, the main table and the site footer.

    The main table consists of three columns, the leftmost column containing leftbox options, the middle column containing the articles themselves, and the rightmost column containing the various squishboxes specified in the rightbox options.

    In the case where the TinyTable product is not available and the default leftbox items and right box items are not loaded, each set of options are rendered by hardcoding them into the DTML, instead of being iterated over a table.

    The site header (site_header) contains the advertising banner and the topic image url list, as well as several properties such as the title images, the page title and the border background color.

    The site footer (site_footer) contains a search form, the quotation, the copyright announcement as well as the list of bottom links. Additional code is also provided so that if in case the TinyTable product is not available and the bottom items table is not loaded, then the bottom links are rendered by hardcoding them into the DTML, instead of iterating over the table.

    Each article contains the title, summary, topic subject, the topic image associated with the topic subject as well as a link to the read more page for the given article id.

    The Read More page

    The read more page (posting_html) displays the summary and body of the article, the comments, the optional file attachment, as well as some related links. It also displays the same left hand options as the main page, except for the addition of links to navigate back to the main table. It also provides a link back to the body of the article if you have navigated deep into a comment thread.

    The read more page consists of the site header, site footer and the main table. The site header and site footer are the same ones used in the main page.

    The main table consists of three columns, with the leftmost column similar in content to the leftmost column in the main page, except for some additional hardcoded links discussed above. The right hand column contains a squishbox containing items and URLs related to the article. If a file was attached to to the main article then a squishbox containing it would also be displayed.

    The middle column contains the summary and body of the article. In addition, adjoining rows contain the comments and replies to comments. This section probably contains the most complicated set of DTML tags in squishdot and represent an attempt to create a hierarchical display of comments.

    In the case that the number of comments exceed the threshold set in the comment spillover property in the Properties page, only the titles, names of the author and posting time are displayed along with a link to the body of the comment is displayed.

    The Add Posting page

    The add posting page is used for adding both a main article and for replying, albeit using differing parts of the page to do so. It contains the same site_header and site_footer used everywhere else. It has a main table consisting of two(2) columns, with the leftmost column containing the same left box items as the main page.

    The main column contains a form for submitting the article or comment for adding to the database. Depending on what object called it, it either displays an submission form for a main article or a comment. If it's a submission form for a comment, it displays the original article or comment to which you are replying to for convenience. Note: One the things we will be working on for the next feature release (0.3) will be to to add a preview page so that you can see exactly what your article or comment will look like prior to finally committing it to the database permanently and allow you to edit it or back it out of submission completely.

    The Preview Posting page (new for ver. 0.3.0)

    The preview posting page is used for previewing both main article and replies, by using differing parts of the page to do so. It contains the same site_header and site_footer used everywhere else.

    It integrates the contents of Read More page (posting_html) with the Add Posting page. The Preview posting page is displayed when the preview button on the Add Posting page is pressed or if the add button is pressed but an error message is displayed -- instead of transferring back to the add posting page, pressing OK on the error message display will go to the Preview posting page enabling you to see how your posting would look prior to actually submitting it. Otherwise, the structure of the tables on the page are the same as the ones used on the Add Posting and Read More pages.

    The Show Error page (new for ver. 0.3.0)

    This is the page that is displayed when there is a validation error during the adding, previewing or editing of the postings. It currently mimics the default Message Dialog display page used by zope when presenting the user with validation errors or confirmation messages. It contains the passed variables from the posting or preview page in hidden fields so that clicking on the OK button will pass them back to the preview posting page. This page can be modified to suit the rest of your website's theme.

    The Show Message page (new for ver. 0.3.0)

    This is the page that is displayed when there is a confirmation message during the adding, previewing or editing of the postings. Unlike the error page, it does not contain any hidden fields. Otherwise, it is just like the Show Error page. It currently mimics the default Message Dialog display page used by zope when presenting the user with validation errors or confirmation messages. This page can be modified to suit the rest of your website's theme.

    The ValidateArticle and ValidateComment DTML Methods (new for ver. 0.3.0)

    These DTML methods are not a displayable pages -- they are functions that are called on to validate an Article or a Comment prior to adding/updating them to the ZODB -- if there is no error, it returns a "_.None" otherwise, they return an error message which is then fed into the ShowError page. This makes the validation process more flexible and customizable for each Squishdot Installation.

    The Search page

    The search page is used to search through the articles and comments. It retains the same basic structure as every other page in Squishdot, meaning it uses both the site_header and site_footer documents. It has a main table consisting of two columns, with the leftmost column containing the same information as the leftmost column on the main page.

    The other column contains a submission form for searching. It specifies the criteria used for searching.

    The Search Results page

    The search results page is very similar to the search page, except that in the middle column, in addition to providing a submission form for searching, it displays a list of articles and comments that satisfied a previous query.

    the Mail Posting page

    The mail posting page contains the DTML to format a mail message that is sent when mail notification is enabled. It contains the text of the message so the original poster can readily see what replies have been made to his article or comment. %% lib/python/Products/Squishdot/demo/messages/message7.txt100666 0 0 6677 7160045536 24303 0ustar00unknownunknown 0 0 Squishdot Classes, Methods and Variables : What's Available Zope Doc Project Butch Landingin butchland@yahoo.com 1 really-dry-stuff This article covers the classes, methods, and variables that Squishdot defines. While every effort will be made to make this consistent with the actual sourcecode, if in doubt, UTSL (use the source, luke!). %% There are actually five classes defined in the Squishdot product:
    • The squishdot site -- the main folder which contains all the data
    • The posting -- a generic class for both main article and comment
    • The article -- a class derived from posting representing a main article
    • The comment -- a class derived from posting representing, well, a comment
    • A squishfile -- a class (copied almost verbatim from confera) representing a file attachment.
    The detailed descriptions of each class method are documented in the source code and will not be discussed in great detail.

    SquishSite class

    This is the main class of the product. It acts like a tree structure in two ways -- 1) as a regular Zope folder in which you can attach regular zope objects (e.g. dtml methods, folders, tiny tables, etc) and 2) as the root from which all postings (both articles and comments) descend from. In actuality, all postings are stored in a BTree persistent container variable named data. This object is shared by reference to all the descendants. The list of children are stored in the ids variable.

    It also maintains a list of subject topics and topic image urls. In addition, it holds the two sets of indexes that are used during searches. One set of indexes contains all indexes that applicable for both articles and comments, while the other set of indexes contains only those indexes which apply to articles.

    The more significant methods and services that the main class provides are :

    • the addPosting method -- adds an article
    • item_list - returns the latest articles
    • other_list - returns articles exceeding max_items count but still within current day
    • date_list(X) - returns the articles posted from X previous days ago
    • subject_image - returns the url of the image associated with a particular topic
    • search - returns a list of postings that fulfills some search criteria

    Posting class

    The posting class is the ancestor class of the Article and the Comment. It represents the common functionality of these two classes. Just like SquishdotSite class, it holds the list of children it has in the ids variable.

    Among the more significant methods that the posting provides are :

    • the addPosting method - adds a comment (i.e. a reply)
    • desc_items - returns list of descendants
    • manage_edit - edits the posting
    • index_html - displays the read more page for the posting

    Article class

    The difference between the article and the posting is that it has a summary text and dept field. Because of this, it has a slightly different method of being validated and edited.

    Comment class

    The comment (i.e. reply) inherits mostly from the posting class and carries no extended functionality.

    SquishFile

    The squishfile encapsulates a file attachment. It does not provide much functionality other than its name, size, file type and contents. %% lib/python/Products/Squishdot/demo/messages/message8.txt100666 0 0 5037 7160045536 24271 0ustar00unknownunknown 0 0 Customizing Squishdot (Part 2) Zope Development Butch Landingin butchland@yahoo.com 1 you-gotta-concentrate-really-hard This is part 2 on customizing Squishdot. This one discusses the Topic Subjects Tab and the Image/TopicImage folders. %%

    The Topics Subject Tab

    The Topic Subjects Tab is the third tab on the management panel for the Squishdot site. It controls what subject categories are available for selection when adding or searching for articles. If not specified, the topic subject field becomes a required input field when adding an article.

    You can associate an image url with each topic subject. This means you can locate your topic images outside of the Squishdot folder although in the default setup, the images are placed inside the Squishdot folder grouped under the TopicImages folder and the url is entered as such. It is recommended that for each topic subject, a different image be used so that as users become familiar with the icons, they can readily decode the topic subject from the graphic icon.

    You can also choose not to use any images. Although the site would work, some elements such as the topic subject menu bar that displays the associated image icons that runs across the top part would not be displayed, as well as the graphic icon that appears on the right part of the article summary on the main page would also not be present.

    The Images and TopicImages Folder

    The Images folder contain those images that are used to display the rounded edges and dropshadows that characterize the look and feel of Slashdot. They will need to be modified if you plan to use color schemes which have don't use white/black as the main backgrounds of the web pages.

    If you don't plan to use dropshadows or rounded edges, then the images will not be used. Otherwise, we have attached the images for the dropshadow and rounded edges in a file attachment (images.zip) attached to this article. These images are stored as XCF (GIMP) formats so you can modify the background colors to match your color scheme.

    Other images in Image folder include the advertisement banner, the title image (squishdot) and the blue/green dots that are used in the line at the bottom of the pages.

    The TopicImages folder contain the images used in subject topic. This is merely a convenient place to put them. The recommended size of the images are 50x50 pixels.

    The next part will discuss the Properties page. %% lib/python/Products/Squishdot/demo/messages/message9.txt100666 0 0 5070 7160045536 24267 0ustar00unknownunknown 0 0 Customizing Squishdot (Part 3) Zope Development Butch Landingin butchland@yahoo.com 1 you-gotta-concentrate-extra-hard This is part 3 on customizing Squishdot. This one discusses the important Properties Tab, which is crucial in customizing the look and feel of Squishdot. %%

    The Properties Tab

    The Properties tab contains those options that are intimately connected with the DTML methods that make up the default look and feel of Squishdot. These properties factor out the commonalities in the webpage design so that they are specified only in one area. By tweaking them, you can modify the names, color schemes, etc. and other characteristics of the webpages that Squishdot uses.

    The following are the properties currently defined by default (you can choose to add properties and use them when you modify, add or delete the DTML methods in Squishdot):

    • title -- used in the title element in the HTML head
    • rss_title, rss_description, rss_image_url are used to fill out the data included in your RSS/RDF channel which is used for content syndication.
    • the color scheme. Each one plays the following role:
      • color1 - background border color (outside the main table)
      • color2 - main background color (inside the main table)
      • color3 - main theme color (background color of title bars)
      • color4 - squishbox background color
      • color5 - text color on "Read More" page
      • linedot_image - url of a single pixel image of the same color as the one used in color3
    • drop_shadow - set to 1 if you want drop shadows, 0 for no drop shadows
    • round_edge - set to 1 if you want rounded edges, 0 for square edges
    • title_image - set to the url of the image logo of the site, which preferably should be around 50 pixels in height and no more than 200 pixels wide.
    • site_name - the name of your website. Maybe different from the title.
    • prevday_cnt - this is number of previous days for which articles are displayed on the Older Articles squishbox
    • comment_spillover - this is the number that sets the threshold at which if the number of comments exceed this threshold, the comments will be listed in summary format (with just the title and a link to the full text of the comments) will be displayed in the "Read More" page.
    • the admin_address and admin_name are used in the default squishboxes for contacting the sites administrator as well as providing the sender info when email notification is enabled.
    %% lib/python/Products/Squishdot/demo/misc_methods/advertising.dtml100666 0 0 744 7160045536 26044 0ustar00unknownunknown 0 0
    Advertisement
    lib/python/Products/Squishdot/demo/misc_methods/copyright.dtml100666 0 0 747 7160045536 25540 0ustar00unknownunknown 0 0 All trademarks and copyrights on this page are owned by their respective companies. Comments are owned by the Poster. The Rest ©1999 Butch Landingin. lib/python/Products/Squishdot/demo/misc_methods/quotation.dtml100666 0 0 543 7160045536 25545 0ustar00unknownunknown 0 0 "Any system that depends on reliability is unreliable." -- Nogg's Postulate lib/python/Products/Squishdot/demo/newtables/bottom_items.tbl100666 0 0 177 7160045536 25361 0ustar00unknownunknown 0 0 name urlname relurl:int "home","/",1 "post article","/addPostingForm",1 "search","/searchForm",1 "admin","/manage",1 lib/python/Products/Squishdot/demo/newtables/leftbox_items.tbl100666 0 0 270 7160045536 25512 0ustar00unknownunknown 0 0 name urlname relurl:int "up a level","/../index_html",1 "post article","/addPostingForm",1 "search","/searchForm",1 "admin","/manage",1 "about","/About",1 "rdf","/rdf",1 lib/python/Products/Squishdot/demo/newtables/rightbox_items.tbl100666 0 0 473 7160045536 25702 0ustar00unknownunknown 0 0 box_title box_contents box_url relurl:int "Features","features","/search?title=Feature&op=articles",1 "Older Stuff","prev_articles","",0 "Reviews","reviews","/search?title=Review&op=articles",1 "Request for Comments","request_comments","/search?title=RFC&op=articles",1 "Quick Links","quick_links","",0 lib/python/Products/Squishdot/demo/rightbox_items.tbl100666 0 0 433 7160045536 23712 0ustar00unknownunknown 0 0 box_title box_contents box_url relurl | Features|features|/search?title=Feature&op=articles|1 Older Stuff|prev_articles|| Reviews|reviews|/search?title=Review&op=articles|1 Request for Comments|request_comments|/search?title=RFC&op=articles|1 Quick Links|quick_links|| lib/python/Products/Squishdot/demo/rightbox_methods/features.dtml100666 0 0 3013 7160045536 26246 0ustar00unknownunknown 0 0 The Zope Dope has written about the capabilities of .

    Read Welcome to to learn about what it's all about.

    You can download the latest version of Squishdot from here and there. There's also some documentation available.

    You can also learn about installing and customizing .

    If you wish to create a Feature article, just submit an article and prefix it's title with Feature:.
    Then you can just send an email to add your feature to this section.

    Update: by : lib/python/Products/Squishdot/demo/rightbox_methods/prevarticles.dtml100666 0 0 2732 7160045536 27142 0ustar00unknownunknown 0 0

    Older Articles

  •   ()

     

  •   ()

    There are no previous articles. lib/python/Products/Squishdot/demo/rightbox_methods/quicklinks.dtml100666 0 0 3651 7160045536 26615 0ustar00unknownunknown 0 0 Squishdot has two homepages, an old one at members.tripod.com and a new one at squishdot.org.

    You can also visit Zope if you want to learn more about what it can do for you. I also have a Squishdot-related page at the zope site.

    If you're interested in technology as well as public policy, visit Technocrat.net. It runs on Squishdot, too.

    Here's another one running on Squishdot: GNotices. Visit the site to see the latest GNOME developments.

    And another site: FIAWOL. Visit it if you're one for whom Fandom Is A Way Of Life.

    You want to learn more about geekstuff? Want to know what inspired Squishdot? Read Slashdot and get the news for nerds.

    Squishdot is now syndicated as a My Netscape channel. You can click on the image below to add it to your Netscape MyChannel list. Add Squishdot to your MyChannel list

    Update: by : lib/python/Products/Squishdot/demo/rightbox_methods/reqcomments.dtml100666 0 0 2021 7160045536 26763 0ustar00unknownunknown 0 0 Request For Comments is 's section for requesting comments on proposals submitted.

    If you wish to create a Request for Comment document, just submit an article and prefix it's title with RFC:. Then you can just send the an email to add your RFC to this section.

    Here is an RFC:

  • RFC:The Road(blocks) ahead

    Update: by : lib/python/Products/Squishdot/demo/rightbox_methods/reviews.dtml100666 0 0 1574 7160045536 26126 0ustar00unknownunknown 0 0 Reviews is 's section for product or book reviews.

    If you wish to create a Review for a product or book, just submit an article and prefix it's title with Review:.

    Then you can just send an email to add your product or book review to this section.

    Update: by : lib/python/Products/Squishdot/demo/showError.dtml100666 0 0 3756 7160045536 23067 0ustar00unknownunknown 0 0
    TARGET="" >
    !
    "> "> "> "> " > "> "> "> "> lib/python/Products/Squishdot/demo/showMessage.dtml100666 0 0 1104 7160045536 23343 0ustar00unknownunknown 0 0
    TARGET="" >
    !
    lib/python/Products/Squishdot/demo/site_footer.dtml100666 0 0 4456 7160045536 23415 0ustar00unknownunknown 0 0
      Squishdot Powered
     
    [ ] | [ home | post article | search | admin ]
    lib/python/Products/Squishdot/demo/site_header.dtml100666 0 0 2415 7160045536 23340 0ustar00unknownunknown 0 0 <dtml-var title>

    Welcome to <dtml-var site_name> " border=0 alt="">
    lib/python/Products/Squishdot/demo/Squishdot_index_html.dtml100666 0 0 21744 7160045536 25310 0ustar00unknownunknown 0 0
     
     up a level
     post article
     search
     admin


      
    " border=0 alt="" align=right hspace=20 vspace=10> Posted by on
    from the dept.

    Read More...
    1"> ( comments, in body) ( comment, in body) ( in body)

      No Posted Articles

    No available articles posted.

      

               

    lib/python/Products/Squishdot/demo/Squishdot_mail_html.dtml100666 0 0 3717 7160045536 25103 0ustar00unknownunknown 0 0 From: To: Subject: Reply Notification X-Priority: 3 (Normal) Content-Type: multipart/alternative; boundary="194.193.44.38.99.2829.959159306.892.31043" --194.193.44.38.99.2829.959159306.892.31043 Content-Type: text/plain Content-Transfer-Encoding: 7bit Reply Notification A new reply has been posted to the message "" which you recently posted to "". The new reply may be found at / The message contents are as follows: Subject: From: <> Date: To stop receiving reply notifications for this message, go to /cancelNotify --194.193.44.38.99.2829.959159306.892.31043 Content-Type: text/html Content-Transfer-Encoding: 7bit Reply Notification

    A new reply has been posted to the message which you recently posted to .

    The message contents are as follows:
    Subject:
    From: <>
    Date:


    Click here to stop receiving reply notifications for this message. --194.193.44.38.99.2829.959159306.892.31043-- lib/python/Products/Squishdot/demo/Squishdot_posting_html.dtml100666 0 0 32050 7160045536 25654 0ustar00unknownunknown 0 0
     
     up a level
     post article
     search
     admin
     main
     parent
    1">  /index_html#">thread


      
    " border=0 alt="" align=right hspace=20 vspace=10> Posted by on
    from the dept.



    |  >

     


    by on
      Related Links
  • Articles on
  • Also by
  • Contact author
  •   File Attachment
  • Click to download attachment
    KB ( bytes)

  • comment_spillover"> replylevel"> ',prevlevel - level)">
    The Fine Print: The following comments are owned by whoever posted them.
    ( Reply )

    Over comments listed. Printing out index only.

    by on

    Click to download attachment
    KB ( bytes)

    [ Reply to this ]
    prevlevel">
      ',prevlevel - level)">

    • by on

      Click to download attachment
      KB ( bytes)

      [ Reply to this ]
    • by on
      Click to download attachment
      KB ( bytes)

    • replylevel"> ',prevlevel - level -1)">
       
    The Fine Print: The following comments are owned by whoever posted them.
    ( Reply )

    lib/python/Products/Squishdot/demo/Squishdot_previewForm.dtml100666 0 0 44170 7160045536 25460 0ustar00unknownunknown 0 0
     
     up a level
     post article
     search
     admin
     main
     parent
    1">  /index_html#">thread


        
    &op=articles">" border=0 alt="" align=right hspace=20 vspace=10> Posted by "> on   , @
    from the dept.





    Your Name (Required*)
    " SIZE=50>

    Your Email address (Required if reply notification is checkedOptional)
    " SIZE=50>

    Reply Notification (Optional)
    CHECKED> Notify me via email of responses to this message

    Article Title (Required*)
    " SIZE=50>
    (bad titles='Check This Out!' or 'An Article'. Put in a descriptive but brief title so readers can figure out right away what it's all about.)

    Topic Subject (Required*)

    (If your article does not seem to fit into any of the pre-defined categories,
    contact your web administrator to add it in.)
    " SIZE="40">
    (No topic subject categories have been set up.
    Topic subject categories allow you to pick the appropriate topic from a pre-defined list.
    Contact your web administrator if you want one (highly recommended).
    Otherwise, put in a keyword that can be used for searching.)

    Dept. (Optional)
    " SIZE=50>
    (This should be a short, colorful or funny quip about the article which will be displayed on the main page.
    Examples would be you-gotta-be-kidding dept. or eat-your-broccolli-and-no-complaining-about-it dept.
    Use your imagination (you got one, don't ya?)(Note: Don't type in the "dept." part.))

    Lead Summary (Required)

    (This is the text displayed in the main page.
    If there are more than 3 or 4 paragraphs, put the rest into the body.)

    Main Body (Optional)

    (This can be as long as you like.)

    Encoding

    If none of the above mean anything to you, select 'Plain'!

    File Attachment (Optional)

    (You can attach a file to your article which can then be retrieved by other readers.
    Try to keep the file sizes below 500Kb in order to conserve network and server resources.)
    Preview Note: Due to browser limitations, file attachment selections are not preserved
    in the preview panels and must be entered prior to adding.

    Allowed HTML
    <B> <I> <P> <A> <LI> <OL> <UL> <EM> <BR> <TT> <HR> <STRONG> <BLOCKQUOTE> <DIV .*> <DIV> <P .*>


    by "> on   , @

    Name " SIZE=50>
    Email" SIZE=50>
    Notify CHECKED> Notify me via email of responses to this message
    Title" MAXLENGTH=50 SIZE=50>
    Comment
    (Check those damned URLs! Don't forget the http://!)
    Encoding
    If none of the above mean anything to you, select 'Plain'!
    Attachment
    (You can attach a file to your reply which can then be retrieved by other readers.
    Try to keep the file sizes below 500Kb in order to conserve network and server resources.)
    Preview Note: Due to browser limitations, file attachment selections are not preserved
    in the preview panels and must be entered prior to adding
    Allowed HTML <B> <I> <P> <A> <LI> <OL> <UL> <EM> <BR> <TT> <HR> <STRONG> <BLOCKQUOTE> <DIV .*> <DIV> <P .*>
      Related Links
  • &op=articles"> Articles on
  • &op=articles"> Also by
  • Contact ">author
  • lib/python/Products/Squishdot/demo/Squishdot_searchForm.dtml100666 0 0 11640 7160045536 25240 0ustar00unknownunknown 0 0
     
     up a level
     post article
     search
     admin
     main


      Search
    " ALIGN=right BORDER=0 ALT="" HSPACE=30 VSPACE=10>

    Search Summary/Comments/Text (Optional)

    Put in a word or a phrase that will be matched in the article summary, body or reply comments

    CHECKED> Search articles only CHECKED> Search both articles and replies
    Limit search to main posts or include replies

    Subject site (Optional)

    Select a site if you want to further limit the search to a single subject topic
    Put in a keyword if you want to further limit the search to articles with a matching keyword (Exact match)

    Search Title (Optional)

    Put in a word or a phrase that will be matched in the article or comment title

    Search Author (Optional)

    Put in an author's name that will be matched in the article or comment title (Exact match) There are currently no messages to search.

    lib/python/Products/Squishdot/demo/Squishdot_searchResults.dtml100666 0 0 12465 7160045536 26004 0ustar00unknownunknown 0 0
     
     up a level
     post article
     search
     admin
     main


      Search Results
    Found matches.

    by on
    No messages were found matching your query.

      Next Search

    Search Summary/Comments/Text (Optional)

    Put in a word or a phrase that will be matched in the article summary, body or reply comments

    Search articles only Search both articles and replies
    Limit search to main posts or include replies

    Subject Topic (Optional)

    Select a topic if you want to further limit the search to a single subject topic
    Put in a keyword if you want to further limit the search to articles with a matching keyword (Exact match)

    Search Title (Optional)

    Put in a word or a phrase that will be matched in the article or comment title

    Search Author (Optional)

    Put in an author's name that will be matched in the article or comment title (Exact match) There are currently no messages to search.

    lib/python/Products/Squishdot/demo/TopicImages/dc.gif100666 0 0 1050 7160045536 23455 0ustar00unknownunknown 0 0 GIF89a#,̙̙̙ffffff3f333f33f!"Copyright (c) 1999 Butch Landingin!,#,@ dih4ྃ#ϴӾ(u5Ϸr—H:v=ϩkX d4zf,j[pKx5^E4x[_SAuM_ ~t.wo~v3bWo||rLzt}Gg~DuP2a.\4~ˆYO4Rζ21IͫN~I/UJz3.|Y X~*,8B6#qƼz4wVM\'+ڀ}A=I3YWZ}S\O/bl/v(5d;6F-9fT]0bjV̆^PNubk~q ϴrl+kӕcH.N'̅{GyP"KNe(B;lib/python/Products/Squishdot/demo/TopicImages/dope.gif100666 0 0 7175 7160045536 24034 0ustar00unknownunknown 0 0 GIF89a2: yB%"~Lk(}Y&־,*!W","Id6v42D+ɲXGU*Ep';->+²{wIDD3,%6# dA%i`i^!DE5'):+x(l(#*"gKS⍰z|f%}K.!"pTP6%'3#p2osR1Ûef6ݾ`(xAxx!$Z, j&oN$̅ZvOMb\KQloя}32'skiJxT*!vC[D.Xp7HWLf0"_Z܌NɂB<`p8BV7|]`%DkF'cO:P-"x\xjtydX#rC!6DGnat[CŅ[18>Y7ӂ~Tx7P.",-t7b,&!#Z7 YU_2$w<2>HL:+,p&?)5>:V/lJ$\h`;x\o;&#~~V`w@XH1>({< RD+"QE,!"&#qT8N/18(Rgzh͚@<"ŧ<2#X!=_#XF>!լj$jP6E-4s@k(Q%J@ΠpQ W?$OBL%5FB`r="EsOhpa#ր/4ND rt ri9 PI3rR[Z ^|5ܲV@2%XG4qL4 :AvFu 0@H 0AX`86 RKj`I N@!pA(G0 C(n#hڰ:ֱ.(2󍆩@P&p:DC C'R1dbZQEЦ^p8ġ@B 8"p2 &g8E-EȬ !l(+0o<]E)+ e(c +, AQAP !D lX`lhEdm @)z$xa@yvPt^GqI&x!$oHH+ /7H@#Ac:D(`'<`AȚa0ЂbBѨC00"-EJdTU 0aH@$V!,VZ!4F %3q/8;$D_ ARX(X%0qHH>Af+q#5k#  9-V<ć\O*qN*(҇(", q8/aIP FTb%@)0Z@c1,ZuG%1]ǧQєi V80C%"P0,$0f"(괹c [` q6X - H Ba.`WdOLSŧ&V$Ò1 7$V]X ]( _4*幠kJ-ׅƂKU*U*!áP umO2c-U`܍/ !09BD x-AD @AP ND%t|3v!i[$"ְF ð\L,,IXe] .(-?"{"!( lW5B h}cS2z!` c `aFċ u+֨"7D>,     7@$!G:ȁrEDJHAA.āxqF /> 0^E1~ɉ|riv8:\QAʺ R( ӅUxƆJ#|A+SDk_1:lp\4&*,P܍qi''@t1g@ D'9鄂6I.K]d!p %^oE+0YIы( WO-xC7Nz1ʐ"| G AdBUa|F("?|A&poa;T%R ~LCPsup pvadS0q1a!ND4''N)c X EDa0MR06pd8X^!epMp Q>Ie&2%4l 2@3p pP eoW'G07I2aQ-?3 pKMP 9a3@ r0 Gzq>%ab%a'sX@{ ڠ @ !%0^ #g"%"U4I8+WPcSpp e8.r!U XC#p B`XpX.`%"B@Xc/7Tu m 4 @r B +m$ " <@4@ |l{ XN@7p7=`~k pSxm7gpo% °{r5Ұ$Myp?7AVPU c'V `H0$H  D`};lib/python/Products/Squishdot/demo/TopicImages/dtml.gif100666 0 0 1463 7160045536 24037 0ustar00unknownunknown 0 0 GIF89a22̙VVV^^^ZZZzzzf>>>rrrfff"""BBBbbbJJJ3f~~~̙vvv6663̙:::NNN***FFF...RRRnnnjjjf!(c) 1999 Butch Landingin! ?,22@@pH,ȤRYhKSX8#l:,GYturl3U2bs^ i Ye?PEMlqc?!d%dHdReNd{}u\`M qD liM?"}jNadkCCEhP0_LH.*ST8؆/]*+l'\2y4A^l@e-5!aİl2ނNNLr664rJ6d"Tr֮srtp*bʰ..,FFDٖxܖtirZZ\ފޒnNԊBwvtMjjḷJthԳ2̪""$".cؒ̐ȮTndl{nyޔ;Ҧv224WRU&&$dJJLR|>><ފjf^dʾn:ҞRRT~r| ^^\žffdzz|ZԖ:lTԈ⦴bV\&̆z٪2d^jz|–tԺRNt~&\6bGBD.̌x BtӡƥZV\ZԓNFLdBlvnt憤z*&,~v|~"\.*,NjblچԲΖĦªbZd6dFNJL>z624jfgJFL2.4ڢRNQ护撬ڨ:lb^_njlrntZf^^ԔN|2d6lZVT!"Copyright (c) 1999 Butch Landingin! ,]?@ H*\ȰÇ 8@/fԁqǏ &8$!CF-Zq⥘F-؂ Zl$a'70B6L,T$r@ ,0+>rDh9tk覫{TLad"cp*H'@,@rM  :fD=bZFp B 2@: rP]!0I?s4,5 aT-tB"HQB BpXlt,- p2L' 0&$@9l980 X#Nht&-4B!:Dȁ?Ƞ=KA r M@2SШpGm3C o8y1'C1"IM`M Hh5Xa n zC# ` up6D+r'lgtH  N(-^ KHB` 2m @W +w+Y"! )Ȅ <̒/ẃ58+!RmEC4v4b< @i9,%|:/?!Xxxyx ^-*.+Ā ABQԂ@BvawD9| z xa'p @**'1zy}SL #*H#x  a@(Dʬ ],ZCrZ`p1D!4J!OY ?:aF <LU@ ; A rІj!|]N4 X@zԆ(@ї::{ l<H0aSBDrrtZZ\JLBFD*,VT"$.VT &VT~~|bd&64bd .vt*bd>nlbdnnl .><..,FD*jl.nl fdfdfdjlJJLffd&$NL jl&rt264"FDJNLjl2bd646:<*,"$rtjlBD64*~|rt6䶺&JL^bd&:<24""$VT:VT nlRRT.NL>><"rt**,&z|:<:<jl*JLBBDvtZ^\nlVVT.^\^\  2jl6rt:nlrt .24fjl"NL.,nl:^\"z|nrt*BD6Z\&$&vtVZ\VT.FDnl><&$&&$vtRT6z| .Z\.JL^^\vvt.,Z\"vt&nl&$bbd*vtfd664Z\&fdBrt.BD.RT224*,rt":<*,*VTjl"64"24*z|*><2JL!"Copyright (c) 1999 Butch Landingin! ,7>@ HOV)Th#B41' 80R8II`@ aJ2:(I*D"B$@j  F}d C4q(+}̘A`J2Hv`XبVDYKג35a( ݿ>%N4)]D$),";Xb -R2%hA }pڦb{CTcY ^#W9PRkE 4E4,CMbC, ^NP XQD/XREr ""uf0ؠ@MB(}(C  5pRKF4)$hوj 5t!K2pB(A!.٤@AXkm1ǖpB! 'p:jHKZL'dM A"_D&m |…s[hrU2 X?L_;Eny$"ޱ 2 ZZ X A ]xtG P"KL@,s*D"GR-3\Q{C.# .xlK+L]x@GvvC!idk12 M:@a) «QBdG%<@ 1vgl՛ hE5j; @K#:r$J $^tR:Tjjl"zFdJ: Tnv4vvtBd~~|NJLftZZ\fRdb2L^t>l *&$¾~b|6dB6""$Ēj|~Rd캺:2NNL~664 :dVVTFlVtZVLJJDnnlJ6LbRt"B>,bFdn^d2d욖..,6dvB\ffdb|ƒBl& ƞ22,zzt^^\&&$RRLrrlnZtfΚzR|::><6*FtZVTĚ2dV6D:24 &^Z\f̲􊊌RRT䖒**,6lfbdRl솂~z|jfdƖ’zvt̂zz|224NlRBrRNTrrtJJLܚ6d亶䒎&"$rnlʖԖ:lZV\**$~ft"vF\ "VBTjflzv|Nt~V|>lnBdbVB:l!"Copyright (c) 1999 Butch Landingin! ,22@ H*\ȰaAo 4q8pҡw=(R#PGqL&)B8!Bē'DF,lAeǎ~䤠@dZ%K$ L9@'N8J)ZѨ18"DZ9i*0W5Z-æ B(]۳2!F,iR| ̺kזѪv3nמ]؜ >_/̫(A`LbN9eH,4.yCّ95jhPA&LB@CHOfvF;L-\%XF3FHfkh]Y g ybt(tӽ߀c6On'#N5.Mg~gwy8ιCp03m0-߳~])3%+ 0 ~d9qG!$c t4oJ %45;s n rR $@%xH.`F+ܰ ZL60H}@ D<̉RF&F4)O|PUTjׯ JfF ztڔ">UvҺ\ě`|Ka}+^̸bG 0cVDv\&*Mm,mVoͩ[^S6Z(_μ=^QسkË_8 ;lib/python/Products/Squishdot/demo/TopicImages/zopedev.gif100666 0 0 4730 7160045536 24553 0ustar00unknownunknown 0 0 GIF89a20SRStjlsrtF=AnjlR:LtLR|h̨ƖV>Lў4Ƣt͘gО,jJ\Ϫ$yРlݮ|ʺ֪BlDzbĘv ຊ֦lf6LttDnJ\>lϢjbD&$(˟Φzʲ|v^lLV~vF\–:dNlZ2dδլF۶̐ҥ6®l99;oRda^]Ξ |޺GuÎdV4ʲl6d^TL-,,۹_rbl6lvjlGCI|bY^͞ʖƜvĴҷشɐffdf⺼BtѤ,Ԥ6d྾ !ʚްa{mt{ທҦ$2dȐ~`ݺTŻ:lڰԬʜ͖wPGRzX`|tdæ,Т2d6dزѡw! ,20@ H`-HŠÇI(Ѡj|iO 5n 8HX)'j E/u G3 OU|X$/dPFKD&.˫0!`@NPYt$"ԣD2BnKJU֨/ |=\u%]a]*H)RsW_/f}t|"iʞ,CbC GO CGQ#9 ;)S ovrFQ ̘%r1wgm݇o>#`:pWqoC-4' hB"](E  *؁HP Є*,Кc&1c4&vvpC@%Ґ#؈l8[.2BH82tLTb!}-h,Z Bcxأ v.ȋBy 5J8_W8)B` Sc: '.L ^3.X 0 7DamÈ2 #UFi&r pF^ZB8#>XXGo\o K[%F^surv1 s d* m|&Ʈ3 Lt!apٸ Vz&؀#iא@k&R8ri`͆ H\"dV ?Ds<DxA<g$t%(8Ij>4:.@+pXG8 X LM&\s9iqh~#Ď$^q7< s3jTA8 mT>EpN@͇'ҒVR5SB'jys{rhd_\U2X }j$: r"P.C ﺖ$Yʆ\䤜nftzwt _rv<~|^\Q\,OFOL4^lTLZ4 ذ8n&広֪$5/n<"$!"Copyright (c) 1999 Butch Landingin! ,<>@ H*\ȐƧ'U: >~tzKGȐaÓ'٥NKxEXILԸ0rhլٹfʔӧfʐ?1Ikӎr󔆚ަ8MLYw0%8i7 6iRkr lpH |sL1,3(aq25u^u}N,tEB#$68W,e.J%@:Y_ 5*ԓd.HB .ː *TBJ#@b%04aXP'E!Z--4 p2l.$B5BB9(pT$d.$ M LJhB $36:ȡ)q=7L!?ɬ҂3f lp hJf;`ԗMY9q) N[ Qf`CY4X_K3W$B(k|4CTJ`@&%(CPG a"Umd F4rEqɠ9U>%XЇ(3S] J7"K,3hTDk8+[@5}r9C3lM(AJK1$Mb %43LeSe,u["J0`E<$c86 ؽ)K5a0\TK99(:ZB0,Ad@μH5$R<*:p ;((1$핶P&Zl. $MuoRC{C<fx';B2w(A qNFTa- jU@' nȂdLC=> =@c |d@hA `E g"a F&ЅUFWl.`$b6]\N$!CX Ya( JD (HdFp  0C{< <фkh ֐e\zJ$^x|Q!1츆>1ODPAЁS8.фY0VBpdB&5 Rh+#d^}CgIP6Q4Mh@pXPI:)셶W(O$ \dT * \CQL0p MI(Y3pZ 7a $( H$%J ;`3ߒMY#iT ɀ.$+[9^0T 98A5'"hޙH' dc3C.`Ax>BA-jaAy n | m;Go 7JU{ޣgLb^@epglp}0@#a/Ƀ]!6D g8edAiLC#̌;1a/ w2*;9#Dcވ` a:ilFQ <dtml-var title> Edit this message using the form below.

    Title " SIZE="40">
    Subject " SIZE="40">
    Dept
    Author " SIZE="40">
    Email " SIZE="40">
    CHECKED> CHECKED> Notify author via email of responses to this message
    This item has been reviewed
    Summary
    Text
    Encoding
    Click to download attachment
    KB ( bytes)


    lib/python/Products/Squishdot/License.txt100666 0 0 3564 7160045536 21407 0ustar00unknownunknown 0 0 # # Copyright (c) 1999 Butch Landingin # All rights reserved. Written by Butch Landingin # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. The name of the author may not be used to endorse or promote products # derived from this software without specific prior written permission # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # In accordance with the license provided for by the software upon # which some of the source code has been derived or used, the following acknowledgement # is hereby provided : # # "This product includes software developed by Digital Creations # for use in the Z Object Publishing Environment # (http://www.zope.org/)." # # lib/python/Products/Squishdot/moderateArticle.dtml100666 0 0 2173 7160045536 23245 0ustar00unknownunknown 0 0 >Approve >Delete Edit
    by

    lib/python/Products/Squishdot/posting.gif100666 0 0 350 7160045536 21404 0ustar00unknownunknown 0 0 GIF89aPPP@@@@@!(c) 1999 Butch Landingin!,I# di#4lM`k0ln 8#N*+UjU7sX$8uB;lib/python/Products/Squishdot/README.txt100666 0 0 452 7160045536 20733 0ustar00unknownunknown 0 0 Squishdot SquishDot is a web-based news publishing and discussion product for the Z Object Publishing Environment(ZOPE). It allows you to build a web-based news site along with the capability to handle threaded discussions with a minimum of configuration and day-to-day management. lib/python/Products/Squishdot/refresh.txt100666 0 0 0 7276054154 21365 0ustar00unknownunknown 0 0 lib/python/Products/Squishdot/showError.dtml100666 0 0 4042 7160045536 22130 0ustar00unknownunknown 0 0 <dtml-var title>
    TARGET="" >
    !
    "> "> "> "> " > "> "> "> "> lib/python/Products/Squishdot/showMessage.dtml100666 0 0 1170 7160045536 22422 0ustar00unknownunknown 0 0 <dtml-var title>
    TARGET="" >
    !
    lib/python/Products/Squishdot/squishdot.gif100666 0 0 364 7160045536 21751 0ustar00unknownunknown 0 0 GIF89aPPP@@@@@!(c) 1999 Butch Landingin!,U#dI `oޢP3BcxHPǨl źgQrSp5o-~!;lib/python/Products/Squishdot/Squishdot.py100666 0 0 201407 7245046244 21656 0ustar00unknownunknown 0 0 ############################################################################## # # Zope Public License (ZPL) Version 0.9.7 # --------------------------------------- # # Copyright (c) Digital Creations. All rights reserved. # # This license has been certified as Open Source(tm). # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # 1. Redistributions in source code must retain the above copyright # notice, this list of conditions, and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions, and the following disclaimer in # the documentation and/or other materials provided with the # distribution. # # 3. Digital Creations requests that attribution be given to Zope # in any manner possible. Zope includes a "Powered by Zope" # button that is installed by default. While it is not a license # violation to remove this button, it is requested that the # attribution remain. A significant investment has been put # into Zope, and this effort will continue if the Zope community # continues to grow. This is one way to assure that growth. # # 4. All advertising materials and documentation mentioning # features derived from or use of this software must display # the following acknowledgement: # # "This product includes software developed by Digital Creations # for use in the Z Object Publishing Environment # (http://www.zope.org/)." # # In the event that the product being advertised includes an # intact Zope distribution (with copyright and license included) # then this clause is waived. # # 5. Names associated with Zope or Digital Creations must not be used to # endorse or promote products derived from this software without # prior written permission from Digital Creations. # # 6. Modified redistributions of any form whatsoever must retain # the following acknowledgment: # # "This product includes software developed by Digital Creations # for use in the Z Object Publishing Environment # (http://www.zope.org/)." # # Intact (re-)distributions of any official Zope release do not # require an external acknowledgement. # # 7. Modifications are encouraged but must be packaged separately as # patches to official Zope releases. Distributions that do not # clearly separate the patches from the original work must be clearly # labeled as unofficial distributions. Modifications which do not # carry the name Zope may be packaged in any form, as long as they # conform to all of the clauses above. # # # Disclaimer # # THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY # EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DIGITAL CREATIONS OR ITS # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF # USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT # OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # # # This software consists of contributions made by Digital Creations and # many individuals on behalf of Digital Creations. Specific # attributions are listed in the accompanying credits file. # ############################################################################## # # Portions Copyright (c) 1999 by Butch Landingin. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # including the original copyright, this copyright notice, the list of # conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # including the original copyright, this copyright notice, the list of # conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. The name of the author may not be used to endorse or promote products # derived from this software without specific prior written permission # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # In accordance with the license provided for by the software upon # which some of the source code has been derived or used, the following # acknowledgement is hereby provided : # # "This product includes software developed by Digital Creations # for use in the Z Object Publishing Environment # (http://www.zope.org/)." # ############################################################################## __doc__ = """Squishdot - a web-based news publishing and discussion system""" __version__='$Revision: 1.29 $'[11:-2] # Andy import sys, re , os # /Andy from Globals import Persistent from Globals import PersistentMapping from Globals import HTMLFile, MessageDialog import Globals from OFS.ObjectManager import ObjectManager from AccessControl.Role import RoleManager from IOBTree import BTree from intSet import intSet from Squishfile import Squishfile from OFS.Folder import Folder from Acquisition import Implicit from time import time, localtime, strftime, gmtime from string import strip,split,join from string import lower,rfind,atoi, replace from urllib import quote, unquote from DocumentTemplate.DT_Util import html_quote from OFS.Document import Document # ZCatalog imports from Products.ZCatalog import ZCatalog # Structured Text imports import StructuredText CRLF=re.compile('\r\n|\n\r') tagRegex = re.compile("<.*?>") # where we exist on the file system file_path = Globals.package_home(globals()) class Stack: def __init__(self): self.mlist = [] def pop(self): data = self.mlist[-1] del self.mlist[-1] return data def push(self,data): self.mlist.append(data) def isEmpty(self): return (len(self.mlist) == 0) def sameday(n, m): n = localtime(n) m = localtime(m) if m[0] == n[0] and m[1] == n[1] and m[2] == n[2]: return 1 else: return 0 def addDTML(obj,id,title,file): f=open(file_path+'/'+file+'.dtml') file=f.read() f.close() obj.manage_addDTMLMethod(id,title,file) return getattr(obj,id) def addImage(obj,id,file): f=open(file_path+'/'+file,'rb') contents=f.read() f.close() title='' tlen = len(contents) new_id = obj.manage_addImage(id,contents,title=title) img_obj = obj.__getitem__(new_id) img_obj.content_type = 'image/gif' def addTable(obj,id,fname): f=open(file_path+'/'+fname+'.tbl ') cols=file.readline() cols=cols[:-1] # takeout newline delim=file.readline() delim=delim[:-1] fcontent=file.read() file.close() title='' obj.manage_addTinyTable(id,title,delim,cols) tbl=getattr(obj,id) tbl.manage_editData(fcontent) def addNewTable(obj,id,fname): f=open(file_path+'/'+fname+'.tbl') cols=file.readline() cols=cols[:-1] # takeout newline fcontent=file.read() file.close() title='' obj.manage_addTinyTable(id,title,cols) tbl=getattr(obj,id) tbl.manage_editData(fcontent) def addArt(obj,file): f=open(file_path+'/'+file) file='' title = f.readline()[:-1] # removes newline char subject = f.readline()[:-1] author = f.readline()[:-1] email = f.readline()[:-1] notify= f.readline()[:-1] dept=f.readline()[:-1] summary='' currline=f.readline() while strip(currline) <> '%%' and currline <> '': summary = summary + currline currline=f.readline() body='' currline=f.readline() while strip(currline) <> '%%' and currline <> '': body = body + currline currline=f.readline() f.close() id = obj.addPosting(title,author,body,email,notify,file,summary,subject,dept,None,None,1) msg = obj.data[id] msg.reviewed = 1 return id PATH_SEP=re.compile('[\\/]') def addFile(file, ctype): try: f=open(file_path+'/'+file,'rb') except: return '' sf = Squishfile() sf._file = f.read() f.close() name=strip(PATH_SEP.split(file)[-1]) sf._name = name sf._ctype = ctype sf._created = time() sf._modified = sf._created return sf htmlhead = '''%s
    '''
    
    htmlend = '''
    
    ''' def addText(file,title): global htmlhead, htmlend try: f=open(file_path+'/'+file,'rb') except: return htmlhead + htmlend s = f.read() f.close() return (htmlhead % title) + html_quote(s) + htmlend readme = addText('README.txt','Readme') credits = addText('Credits.txt','Credits') license = addText('License.txt','License') changes = addText('Changes.txt','Changes') version = addText('version.txt','Version') class SquishSite(ZCatalog.ZCatalog, RoleManager): """A Squishdot Site is a self contained web-based news publishing and discussion system""" meta_type ='Squishdot Site' description='Squishdot Site' icon ='misc_/Squishdot/squishdot_img' root =1 squishlogo ='misc_/Squishdot/squishlogo' _properties=({'id':'title', 'type':'string','mode':'w'},) # Default encoding for old postings encoding = 'HTML' # Defaults for old sites mail_articles=0 mail_replies=0 # protected by 'Manage Postings' permission manage_postings = HTMLFile('Squishdot_manage_postings', globals()) # protected by 'Manage Postings' permission manage_moderation = HTMLFile('Squishdot_manage_moderation', globals()) # protected by 'Manage Postings' permission moderateArticle = HTMLFile('moderateArticle',globals()) # protected by 'Manage Squishdot' permission manage_editForm = HTMLFile('Squishdot_editForm', globals()) # protected by 'Manage Squishdot' permission manage_subjects = HTMLFile('Squishdot_manage_subjects', globals()) About = HTMLFile('about',globals()) About.__roles__=None Readme = Document(readme, __name__='Readme') Readme.__roles__=None Credits = Document(credits, __name__='Credits') Credits.__roles__=None License = Document(license, __name__='License') License.__roles__=None Changes = Document(changes, __name__='Changes') Changes.__roles__=None Version = Document(version, __name__='Version') Version.__roles__=None manage_options=({'label':'Contents', 'icon':icon, 'action':'manage_main', 'target':'manage_main'}, {'label':'View', 'icon':'', 'action':'index_html', 'target':'manage_main'}, {'label':'Postings', 'icon':'', 'action':'manage_postings', 'target':'manage_main'}, {'label':'Moderation', 'icon':'', 'action':'manage_moderation', 'target':'manage_main'}, {'label':'Subjects', 'icon':'', 'action':'manage_subjects', 'target':'manage_main'}, {'label':'Options', 'icon':'', 'action':'manage_editForm', 'target':'manage_main'}, {'label':'Properties', 'icon':'', 'action':'manage_propertiesForm', 'target':'manage_main'}, {'label':'Security', 'icon':'', 'action':'manage_access', 'target':'manage_main'} ) __ac_permissions__=Folder.__ac_permissions__+( ('Manage Squishdot', ['add_subject','delete_subjects','manage_edit', 'updateIndexing','manage_main','manage', 'manage_editForm','manage_subjects','manage_propertiesForm','manage_editProperties','subject_count'], ('Manager',)), ('Moderate Postings', ['manage_delete', 'manage_postings', 'recatalogPostings', 'manage_review', 'manage_moderation', 'moderateArticle','moderation_process','postingValues','item_count'], ('Manager',)), ('Add Postings', ['addPosting','suggest_author','suggest_email','render'], ('Anonymous', 'Manager')), ('View', ['search','index_html','dupString','striptags','has_subjects','subjects_list','subject_image','item_list', 'other_list','date_list','site_item_list','tpId','tpURL','this','site','site_url','has_items','desc_items','get_view_count','update_view_count'], ('Anonymous', 'Manager')), ) # updated by Andy # protected by 'Manage Squishdot' permission def updateIndexing(self,REQUEST=None): """ A a ZCatalog and appropriate indexes to this SquishSite if they aren't there already """ if not hasattr(self,'_catalog'): ZCatalog.ZCatalog.__init__(self, self.id, self.title) try: self._catalog.addIndex('author', 'FieldIndex') except: pass try: self._catalog.addIndex('textToSearch', 'TextIndex') except: pass try: self._catalog.addIndex('subject', 'FieldIndex') except: pass try: self._catalog.addIndex('reviewed', 'FieldIndex') except: pass try: self._catalog.addIndex('date_created', 'FieldIndex') except: pass self.recatalogPostings(REQUEST) # protected by 'Manage Postings' permission def recatalogPostings(self,REQUEST=None): """ Clear the Catalog and then Index all the postings. """ self._catalog.clear() for id in self.data.keys(): obj = self.data[id] self.catalog_object(obj,join(self.getPhysicalPath(),'/')+obj.thread_path()+'/'+`id`) return self.manage_main(self, REQUEST) # no permissions, only called from python def __init__(self, id, title, mhost, exp, moderated, max_itemlist, default_doc, mail_articles, mail_replies,parent): # Initialise ZCatalog ZCatalog.ZCatalog.__init__(self, id, title) t=time() self.id = id self.title = title self.created = t self.modified = t self.mail_host= mhost self.expire = exp self.mail_articles = mail_articles self.mail_replies = mail_replies self.moderated= 0 self.mod_comment = 0 if moderated == 'both': self.moderated = 1 self.mod_comment= 1 else: if moderated == 'articles': self.moderated = 1 self.mod_comment=0 if max_itemlist: self.max_itemlist=max_itemlist else: self.max_itemlist=30 # Set up the indexes # We get a 'title' TextIndex for free from ZCatalog.ZCatalog self._catalog.addIndex('author', 'FieldIndex') self._catalog.addIndex('textToSearch', 'TextIndex') self._catalog.addIndex('subject', 'FieldIndex') self._catalog.addIndex('reviewed', 'FieldIndex') self._catalog.addIndex('date_created', 'FieldIndex') self.data =BTree() # id -> Message self.ids =intSet() # ids of children self.subjects = PersistentMapping() # The List of subjects/categories self.defaultDocFile('validateArticle','Validate Article', 'validArticle') self.defaultDocFile('validateComment','Validate Comment', 'validComment') self.defaultDocFile('rdf','Netscape RDF/RSS channel page', 'Squishdot_rdf_rss') newprop = list(self._properties) newprop.append({'id':'rss_description', 'type': 'string', 'mode': 'w'}) newprop.append({'id':'rss_title', 'type': 'string', 'mode': 'w'}) newprop.append({'id':'rss_image_url', 'type': 'string', 'mode': 'w'}) newprop.append({'id':'admin_address', 'type': 'string', 'mode': 'w'}) if default_doc == 'plain': self.defaultDocFile('showMessage','Show Message', 'showMessage') self.defaultDocFile('showError','Show Error', 'showError') self.defaultDocFile('mail_html','Notification Email', 'Squishdot_mail_html') self.defaultDocFile('index_html','Squishdot Homepage', 'Squishdot_index_html') self.defaultDocFile('posting_html','Posting', 'Squishdot_posting_html') self.defaultDocFile('searchForm','Search Form', 'Squishdot_searchForm') self.defaultDocFile('showSearchResults','Search Results', 'Squishdot_searchResults') self.defaultDocFile('addPostingForm','Add Posting Form', 'addPostingForm') self.defaultDocFile('previewPosting','Preview Posting', 'Squishdot_previewForm') self._properties = tuple(newprop) self._updateProperty('rss_image_url','') self._updateProperty('admin_address','squishdot@yahoo.com') if default_doc == 'demo1' or default_doc == 'demo2': self.defaultDocFile('showMessage','Show Message', 'demo/showMessage') self.defaultDocFile('showError','Show Error', 'demo/showError') load_tbls = 1 tblver='' try: # check if TinyTable product exists # this is a nasty hack... file = '/TinyTable/About' f=open(file_path[:-9]+file+'.dtml') f.close() # file = '/TinyTable/version.txt' f=open(file_path[:-9]+file+'.dtml') tblver=f.readline() f.close() tblver=tblver[:-1] #takeout newline except: load_tbls = 0 self.defaultDocFile('mail_html','Notification Email', 'demo/Squishdot_mail_html') self.defaultDocFile('index_html','Squishdot Homepage', 'demo/Squishdot_index_html') self.defaultDocFile('posting_html','Posting', 'demo/Squishdot_posting_html') self.defaultDocFile('searchForm','Search Form', 'demo/Squishdot_searchForm') self.defaultDocFile('showSearchResults','Search Results', 'demo/Squishdot_searchResults') self.defaultDocFile('addPostingForm','Add Posting Form', 'demo/addPostingForm') self.defaultDocFile('site_footer','Site Footer', 'demo/site_footer') self.defaultDocFile('site_header','Site Header', 'demo/site_header') self.defaultDocFile('previewPosting','Preview Posting', 'demo/Squishdot_previewForm') self.manage_addFolder('Images','Images') self.manage_addFolder('TopicImages','Topic Images') self.manage_addFolder('misc_methods','Misc. methods') self.manage_addFolder('rightbox_methods','Right box methods') curr_folder = getattr(self,'misc_methods') addDTML(curr_folder,'advertising','advertising','demo/misc_methods/advertising') addDTML(curr_folder,'copyright_notice','copyright','demo/misc_methods/copyright') addDTML(curr_folder,'quotation','quotation','demo/misc_methods/quotation') curr_folder = getattr(self,'rightbox_methods') feat_method = addDTML(curr_folder,'features','Features','demo/rightbox_methods/features') prev_method = addDTML(curr_folder,'prev_articles','Previous Articles','demo/rightbox_methods/prevarticles') quik_method = addDTML(curr_folder,'quick_links','Quick Links','demo/rightbox_methods/quicklinks') rfc_method = addDTML(curr_folder,'request_comments','Requests for Comments','demo/rightbox_methods/reqcomments') rev_method = addDTML(curr_folder,'reviews','Reviews','demo/rightbox_methods/reviews') curr_folder = getattr(self,'Images') addImage(curr_folder,'botshadow_img','demo/Images/botshadow.gif') addImage(curr_folder,'roundedge_img','demo/Images/roundedge.gif') addImage(curr_folder,'rtbotshadow_img','demo/Images/rtbotshadow.gif') addImage(curr_folder,'rtshadow_img','demo/Images/rtshadow.gif') addImage(curr_folder,'sitetitle_img','demo/Images/sitetitle.gif') addImage(curr_folder,'bluepix_img','demo/Images/bluepix.gif') addImage(curr_folder,'greenpix_img','demo/Images/greenpix.gif') addImage(curr_folder,'advert_img','demo/Images/advert.gif') curr_folder = getattr(self,'TopicImages') # note: build images addImage(curr_folder,'dc_img', 'demo/TopicImages/dc.gif') addImage(curr_folder,'zope_img','demo/TopicImages/zope.gif') addImage(curr_folder,'dtml_img','demo/TopicImages/dtml.gif') addImage(curr_folder,'help_img','demo/TopicImages/help.gif') addImage(curr_folder,'squishdot_img','demo/TopicImages/squish.gif') addImage(curr_folder,'zopedev_img','demo/TopicImages/zopedev.gif') addImage(curr_folder,'zdp_img','demo/TopicImages/zdp.gif') addImage(curr_folder,'zserver_img','demo/TopicImages/zserver.gif') addImage(curr_folder,'dope_img','demo/TopicImages/dope.gif') if load_tbls and tblver: if tblver[10:] > '0-8-0': addNewTable(self,'bottom_items','demo/newtables/bottom_items') addNewTable(self,'leftbox_items','demo/newtables/leftbox_items') addNewTable(self,'rightbox_items','demo/newtables/rightbox_items') else: addTable(self,'bottom_items','demo/bottom_items') addTable(self,'leftbox_items','demo/leftbox_items') addTable(self,'rightbox_items','demo/rightbox_items') newprop.append({'id':'color1', 'type': 'string', 'mode': 'w'}) newprop.append({'id':'color2', 'type': 'string', 'mode': 'w'}) newprop.append({'id':'color3', 'type': 'string', 'mode': 'w'}) newprop.append({'id':'linedot_image', 'type': 'string', 'mode': 'w'}) newprop.append({'id':'color4', 'type': 'string', 'mode': 'w'}) newprop.append({'id':'color5', 'type': 'string', 'mode': 'w'}) newprop.append({'id':'drop_shadow', 'type': 'int', 'mode': 'w'}) newprop.append({'id':'round_edge', 'type': 'int', 'mode': 'w'}) newprop.append({'id':'title_image', 'type': 'string', 'mode': 'w'}) newprop.append({'id':'site_name', 'type': 'string', 'mode': 'w'}) newprop.append({'id':'comment_spillover', 'type': 'int', 'mode': 'w'}) newprop.append({'id':'prevday_cnt', 'type': 'int', 'mode': 'w'}) newprop.append({'id':'admin_name', 'type': 'string', 'mode': 'w'}) self._properties = tuple(newprop) self._updateProperty('color1','#000000') self._updateProperty('color2','#ffffff') if default_doc == 'demo1': self._updateProperty('color3','#006666') self._updateProperty('linedot_image','Images/greenpix_img') else: self._updateProperty('color3','#0066cc') self._updateProperty('linedot_image','Images/bluepix_img') self._updateProperty('color4','#cccccc') self._updateProperty('color5','#333333') self._updateProperty('drop_shadow',1) self._updateProperty('round_edge',1) self._updateProperty('title_image','Images/sitetitle_img') self._updateProperty('site_name','Squishdot') self._updateProperty('comment_spillover',10) self._updateProperty('prevday_cnt',7) self._updateProperty('admin_address','squishdot@yahoo.com') self._updateProperty('admin_name','the ZopeMeister') self._updateProperty('rss_image_url','Images/sitetitle_img') self.add_subject('Zope','TopicImages/zope_img') self.add_subject('Zope DTML','TopicImages/dtml_img') self.add_subject('Help','TopicImages/help_img') self.add_subject('Digital Creations','TopicImages/dc_img') self.add_subject('Squishdot','TopicImages/squishdot_img') self.add_subject('Zope Development','TopicImages/zopedev_img') self.add_subject('Zope Doc Project','TopicImages/zdp_img') self.add_subject('ZServer','TopicImages/zserver_img') self.add_subject('Zope Dopes','TopicImages/dope_img') wrapped=self.__of__(parent) id10 = addArt(wrapped,'demo/messages/message10.txt') id9 = addArt(wrapped,'demo/messages/message9.txt') id8 = addArt(wrapped,'demo/messages/message8.txt') id7 = addArt(wrapped,'demo/messages/message7.txt') id6 = addArt(wrapped,'demo/messages/message6.txt') id5 = addArt(wrapped,'demo/messages/message5.txt') id4 = addArt(wrapped,'demo/messages/message4.txt') id3 = addArt(wrapped,'demo/messages/message3.txt') id2 = addArt(wrapped,'demo/messages/message2.txt') id1 = addArt(wrapped,'demo/messages/message1.txt') raw = feat_method.raw % (str(id1),str(id2),str(id5)) feat_method.raw = raw raw = rfc_method.raw % str(id3) rfc_method.raw = raw art8 = self.data[id8] file8 = addFile('demo/messages/images.zip','application/x-zip-compressed') if file8: setattr(art8,file8._name,file8) art8.file=file8 else: art8.file='' #set rss related properties self._updateProperty('rss_description','Squishdot: Cool Dope on Zope') self._updateProperty('rss_title',title) def __len__(self): return 1 def __getitem__(self,n): try: id=atoi(n) except: raise AttributeError, n if self.ids.has_key(id): return self.data[id].__of__(self) raise AttributeError, n # protected by 'View' permission def dupString(self, dstr, count): # ''' returns a duplicate of dstr by count times''' return dstr * count # protected by 'View' permission def striptags(self,s): # ''' removes char sequences that invalidate RSS syntax''' return tagRegex.sub("",s) # protected by 'View' permission def has_subjects(self): # ''' returns true if site has subject topics defined''' return len(self.subjects) # protected by 'Manage Squishdot' permission def subject_count(self): # ''' gives count of subject topics defined''' return self.has_subjects() # protected by 'Manage Squishdot' permission def add_subject(self,subject='', imgurl='', REQUEST=None,RESPONSE=None): """ add a subject topic """ if subject is None: return MessageDialog(title='Data Missing', message='You must enter a subject!', action=REQUEST['URL1']+'/manage_subjects', target='manage_main' ) self.subjects[subject]= imgurl self._p_changed = 1 if REQUEST: return self.manage_subjects(self, REQUEST) # protected by 'Manage Squishdot' permission def delete_subjects(self,subjs=[],REQUEST=None): """ delete a subject topic""" for subj in subjs: del self.subjects[subj] self._p_changed = 1 if REQUEST: return self.manage_subjects(self, REQUEST) # protected by 'View' permission def subjects_list(self): # ''' lists all subjects ''' subjects = self.subjects.keys() subjects.sort() return subjects # protected by 'View' permission def subject_image(self,subj): # ''' returns an image url associated with the subject (can be an empty string)''' if self.subjects.has_key(subj): return self.subjects[subj] else: return '' setItem__roles__=[] def setItem(self,id,obj): # Make sure the object we store is not wrapped with # an acquisition wrapper, since we will be wrapping # it again manually in __getitem__ when it is needed. if hasattr(obj, 'aq_base'): obj=obj.aq_base self.ids.insert(id) self.data[id]=obj # No thread_path is needed here as objects are all being added to the SquishSite object. self.catalog_object(obj,join(self.getPhysicalPath(),'/')+'/'+`id`) delitem__roles__=[] def delItem(self,id): data=self.data item=data[id] if self.ids.has_key(id): self.ids.remove(id) else: data[item.thread[-1]].ids.remove(id) if self.moderated: if item.meta_type == 'Article': if not item.reviewed: for t in item.thread: obj=self.data[t] if obj.revsub > 0: obj.revsub=obj.revsub-1 else: for t in item.thread: obj=self.data[t] if obj.reply_cnt > 0: obj.reply_cnt = obj.reply_cnt-1 else: if self.mod_comment: if not item.reviewed: for t in item.thread: obj=self.data[t] if obj.revsub > 0: obj.revsub=obj.revsub-1 else: for t in item.thread: obj=self.data[t] if obj.reply_cnt > 0: obj.reply_cnt = obj.reply_cnt-1 else: for t in item.thread: obj=self.data[t] if obj.reply_cnt > 0: obj.reply_cnt = obj.reply_cnt-1 else: for t in item.thread: obj=self.data[t] if obj.reply_cnt > 0: obj.reply_cnt = obj.reply_cnt-1 ids=intSet() ids.insert(id) ids=item.sub_ids(ids,data) item=None # Un-catalog the objects to be deleted. for id in ids: obj = data[id] self.uncatalog_object(join(self.getPhysicalPath(),'/')+obj.thread_path()+'/'+`id`) for id in ids: del data[id] createId__roles__=[] def createId(self): id=int(time()) while 1: try: o=self.data[id] except: break id=id+1 return id defaultDocFile__roles__=[] def defaultDocFile(self,id,title,file): f=open(file_path+'/'+file+'.dtml') file=f.read() f.close() self.manage_addDTMLMethod(id,title,file) # protected by 'Manage Postings' permission def postingValues(self): # """ return list of articles """ return map(lambda x, p=self: x.__of__(p), self.data.map(self.ids)) rev_id_list__roles__=[] def rev_id_list(self): # """ returns reversed id list of reviewed articles """ rlist = map(None,self.ids) rlist = filter(lambda x,p=self : p.data[x].reviewed, rlist) rlist.reverse() return rlist # protected by 'View' permission def item_list(self): # """ returns latest articles """ currtime = int(time()) return map(lambda x, p=self: x.__of__(p), self.data.map(self.id_list(currtime))) id_list__roles__=[] def id_list(self, currtime): # ''' returns id list of latest articles at currtime ''' rlist = self.rev_id_list() try: max = int(self.REQUEST['max_itemlist']) except: max = self.max_itemlist min = max / 3 rlen = len(rlist) if rlen <= min: pass # take all elements else: today_list = self.date_id_list(currtime) # take only items from today tlen = len(today_list) if tlen <= min: rlist = rlist[:min] # take minimum elements even though some items came from yesterday else: if tlen >= max: rlist = today_list[:max] # take maximum elements from today else: rlist = today_list # take entire list of items from today return rlist other_id_list__roles__=[] def other_id_list(self, currtime): # '''returns id list of articles exceeding max but still within current day''' today_list = self.date_id_list(currtime) # take only items from today tlen = len(today_list) curr_list = self.id_list(currtime) # take items displayed on main page clen = len(curr_list) if tlen > clen: return today_list[clen:] # return items from today not displayed on main page else: return [] # protected by 'View' permission def other_list(self): # """returns articles exceeding max but still within current day""" currtime = int(time()) return map(lambda x, p=self: x.__of__(p), self.data.map(self.other_id_list(currtime))) date_id_list__roles__=[] def date_id_list(self, currtime): # """returns list from sameday """ rlist = self.rev_id_list() return filter(lambda x,p=currtime: sameday(x,p), rlist) # protected by 'View' permission def date_list(self, day=0): # """return list from day """ currtime = int(time()) - (86400 * day) return map(lambda x, p=self: x.__of__(p), self.data.map(self.date_id_list(currtime))) site_id_list__roles__=[] def site_id_list(self, currtime): # """ returns latest id list from currtime """ ilist = self.id_list(currtime) tdict = {} tlist = [] ilen = len(ilist) cnt = 0 while (cnt < ilen) and (len(tdict) < 5): id = ilist[cnt] item = self.data[id] if tdict.has_key(item.subject): pass else: tdict[item.subject] = id tlist.append(id) cnt = cnt + 1 return tlist # protected by 'View' permission def site_item_list(self): # """ returns latest articles from today """ currtime = int(time()) return map(lambda x, p=self: x.__of__(p), self.data.map(self.site_id_list(currtime))) # protected by 'View' permission def tpId(self): return self.id # protected by 'View' permission def tpURL(self): return self.id # protected by 'View' permission def this(self): return self # protected by 'View' permission def site(self): return (self,) # protected by 'View' permission def site_url(self): # """ url of the Squishdot main page """ return self.absolute_url() # protected by 'View' permission def has_items(self): return len(self.ids) # protected by 'Moderate Postings' permission def item_count(self): return len(self.data) # I _think_ this is protected by the 'Add Squishdot Sites' permission def mailhost_list(self): # """ list of mail hosts """ try: return self.superValues(('Mail Host',)) except: return [] # protected by 'View' permission def desc_items(self): # """ articles in descending order """ mlist = [] mstack = Stack() if self.has_items(): plist = [] for id in self.ids: plist.append(id) plist.reverse() for id in plist: mstack.push(id) while not mstack.isEmpty(): item_id = mstack.pop() item = self.data[item_id] mlist.append(item) if item.has_items(): plist = [] for id in item.ids: plist.append(id) plist.reverse() for id in plist: mstack.push(id) return map((lambda x, p=self: x.__of__(p)), mlist) expire_items__roles__=[] def expire_items(self): # """ run to delete articles which are past their expiration (assuming that it has been set)""" if self.expire: d=self.data t=int(time()-(self.expire * 86400.0)) ids=[] for id in d.keys(): if d[id].modified < t: ids.append(id) for id in ids: try: self.delItem(id) except: pass return '' # protected by 'Add Postings' permission def addPosting(self,title,author,body,email='',notify='',file='', summary='',subject='',dept='',REQUEST=None,RESPONSE=None,internal=0,encoding='HTML'): """ add an article """ title =strip(title) author=strip(author) email =strip(email) summary = strip(summary) if summary: summary =split(CRLF.sub('\n',summary),'\n') else: summary = None subject =strip(subject) dept =strip(dept) body = strip(body) if body: body =split(CRLF.sub('\n',body),'\n') else: body = None notify=notify reviewed=(not self.moderated) and 1 or 0 if not internal: message=self.validateArticle(REQUEST=REQUEST,title=title,author=author, email=email,summary=summary,dept=dept,body=body,notify=notify,encoding=encoding) if message: return self.showError(self, REQUEST=REQUEST,title='Data Missing', message=message, action=REQUEST['URL1']+'/previewPosting' ) try: file=Squishfile(file) except: file='' id=self.createId() msg=Article(id,intSet(),title,author,body,email,notify,reviewed,file,subject,dept,summary,encoding) msg=msg.__of__(self) self.setItem(id,msg) self.expire_items() if REQUEST: if self.mail_articles: self.sendEmail(msg,self.admin_address,REQUEST) sn = REQUEST['SCRIPT_NAME'] pi = REQUEST['PATH_INFO'] t=self.id gtime = gmtime(id) glist = list(gtime) glist[0] = glist[0] + 1 # add 1 year to expiry date glist[1] = 12 glist[2] = 31 glist[3] = 23 glist[4] = 59 glist[5] = 59 glist[6] = 0 glist[7] = 365 glist[8] = 0 gtime = tuple(glist) e = strftime('%A, %d-%b-%y %H:%M:%S GMT',gtime) resp=REQUEST['RESPONSE'] author = quote(author) resp.setCookie('_suggest_author',author,expires=e,path='/') email = quote(email) resp.setCookie('_suggest_email',email,expires=e,path='/') resp.setCookie('suggest_notify',notify,expires=e,path='/') if self.moderated: p2 = "%s/index_html" % self.absolute_url() else: p2 = "%s/%s/index_html" % (self.absolute_url(),id) return self.showMessage(self, REQUEST=REQUEST, title='Article Posted', message='Your article has been posted', action=p2 ) if internal: return id # protected by 'View' permission def search(self,REQUEST): """ fulfill a search request """ # Massage REQUEST so old form works with new searching... if REQUEST.has_key('body') and REQUEST['body']: REQUEST.set('textToSearch',REQUEST['body']) if REQUEST.has_key('op') and REQUEST['op']=='articles': REQUEST.set('meta_type','Article') REQUEST.set('reviewed',1) sr=self.__call__(REQUEST,1) rc=len(sr) return self.showSearchResults(self,REQUEST,search_results=sr, result_count=rc) # protected by 'Manage Squishdot' permission def manage_edit(self,mailhost='',exp=0,expire='0',moderated='none', max_itemlist=30, REQUEST=None, mail_articles=0, mail_replies=0): """ edit SquishDot options """ if exp: expire=atoi(expire) else: expire=0 if mailhost: try: v=getattr(self, mailhost) except: return MessageDialog(title='Invalid Mail Host', message='Cannot find the named mail host!', action=REQUEST['URL']+'/manage_main' ) self.mail_host=mailhost self.expire =expire self.mail_articles = mail_articles self.mail_replies = mail_replies if moderated == 'both': self.moderated = 1 self.mod_comment= 1 else: if moderated == 'articles': self.moderated = 1 self.mod_comment=0 else: if moderated == 'none': self.moderated = 0 self.mod_comment = 0 if max_itemlist: self.max_itemlist=max_itemlist else: self.max_itemlist=30 return self.manage_main(self, REQUEST) # protected by 'Moderate Postings' permission def manage_delete(self,ids=[],REQUEST=None): """ delete selected articles from a Squishdot site """ ids=map(atoi, ids) for id in ids: self.delItem(id) if REQUEST is not None: return self.manage_postings(self, REQUEST, management_view='Postings') # protected by 'Moderate Postings' permission def manage_review(self,ids=[],REQUEST=None): """ approve selected articles from a Squishdot site """ ids=map(atoi, ids) for id in ids: self.set_reviewed(self.data[id]) if REQUEST is not None: return self.manage_postings(self, REQUEST, management_view='Postings') # protected by 'Moderate Postings' permission def moderation_process(self, approve=None, delete=None, REQUEST=None): """ do the processing for things from the moderation tab """ if approve: self.manage_review(REQUEST['approve'],REQUEST) if delete: self.manage_delete(REQUEST['delete'],REQUEST) if REQUEST is not None: return self.manage_main(self, REQUEST) # protected by 'Add Postings' permission def suggest_author(self): author = '' try: author = self.REQUEST.cookies['_suggest_author'] except: pass if author : author = unquote(author) return author or None # protected by 'Add Postings' permission def suggest_email (self): email = '' try: email = self.REQUEST.cookies['_suggest_email'] except: pass if email : email = unquote(email) return email or None # Used for Bruce Perens' Batch Moderation Code # Indicate that posting has been reviewed set_reviewed__roles__=[] def set_reviewed(self, item): item.reviewed=1 for t in item.thread: obj=self.data[t] if obj.revsub > 0: obj.revsub=obj.revsub-1 obj.reply_cnt = obj.reply_cnt+1 # Searchable interface def __call__(self, REQUEST=None, internal=0, **kw): brains = apply(self.searchResults,(REQUEST,),kw) objects = map(lambda x,self=self,r=REQUEST: self.getobject(x.data_record_id_, r), brains) if internal: return objects return brains # This renders the raw document text into stuff that can be displayed with a dtml-var # When the following proposal happens, this method will become overridable: # http://dev.zope.org/Wikis/DevSite/Proposals/ReplaceableProperty # protected by 'Add Postings' permission def render(self,storedLines,format): if not storedLines: return '' if format=='Plain': return join(map(html_quote,storedLines),'
    \n') elif format=='HTML': return join(storedLines,'\n') elif format=='STX': return str(StructuredText.html_with_references(replace(join(storedLines,'\n'),'\r',''), level=3)) return 'Invalid Format!' sendEmail__roles__=[] def sendEmail(self,msg,address,REQUEST): # sends an email to the address using the mailhost, if there is one if self.mail_host: # reluctantly using try here as a failed notification shouldn't cause a Zope error on a site. try: mail =self.mail_html(self, REQUEST, newItem=(msg,), email=address) mhost=getattr(self,self.mail_host) mhost.send(mail) except: pass Globals.default__class_init__(SquishSite) class Posting(Persistent, Implicit,RoleManager): """Squishdot Posting""" __allow_access_to_unprotected_subobjects__=1 __ac_permissions__ = ( ('Moderate Postings', ['manage_edit', 'manage_editForm','manage_main','manage','postingValues'], ('Manager',)), ('Add Postings', ['suggest_title','addPosting'], ('Anonymous', 'Manager')), ('View', ['date_posted','body_len','date_created','time_created','attachment','thread_path','index_html','showBody', 'desc_items','dupString','striptags','tpId','tpURL','this','has_items','thread','title','author','body', 'email','subject','getThread'], ('Anonymous', 'Manager')), ) # protected by 'Moderate Postings' permission manage_editForm=HTMLFile('editPostingForm', globals()) # protected by 'Moderate Postings' permission manage =manage_editForm # protected by 'Moderate Postings' permission manage_main =manage_editForm meta_type='Posting' icon ='misc_/Squishdot/posting_img' root=0 # Default encoding for old postings encoding = 'HTML' # Andy def get_view_count(self): try: d = open(self._countfn(), 'rb').read() d = strip(str(d)) return int(d) except IOError: return 0 def update_view_count(self): try: d = int(self.get_view_count())+1 f = open(self._countfn(), 'wb') f.write(str(d)) except: # what shall we do in an error? pass def _countfn(self): return Globals.data_dir + os.sep + 'Squishdot' + os.sep + self.id # /Andy def __init__(self, id, thread, title, author, body, email, notify, reviewed, file, subject,level, encoding='HTML'): self.id =str(id) self.ids =intSet() self.thread =thread self.title =title self.author =author self.body =body self.email =email self.notify =notify self.created =id self.modified=id self.reviewed=reviewed self.subject =subject self.level =level self.encoding = encoding if file: setattr(self,file._name,file) self.file=file else: self.file='' self.revsub =0 self.reply_cnt =0 def getThread(self, index): """A better abstaction rather than accessing the list directly""" return self.thread[index] def __len__(self): return 1 def __getitem__(self,n): try: id=atoi(n) except: raise AttributeError, n if self.ids.has_key(id): return self.data[id].__of__(self) raise AttributeError, n setItem__roles__=[] def setItem(self,id,obj): # Make sure the object we store is not wrapped with # an acquisition wrapper, since we will be wrapping # it again manually in __getitem__ when it is needed. if hasattr(obj, 'aq_base'): obj=obj.aq_base self.ids.insert(id) self.data[id]=obj self.catalog_object(obj,join(self.getPhysicalPath(),'/')+obj.thread_path()+'/'+`id`) textToSearch__roles__=[] def textToSearch(self): # returns the text to search for a ZCatalog text='' for line in self.body: # strip out HTML and append a newline to each line. text = text+tagRegex.sub("",line)+'\n' return text # protected by 'View' permission def dupString(self, dstr, count): return dstr * count # protected by 'View' permission def striptags(self,s): # ''' removes char sequences that invalidate RSS syntax (should really be a util function)''' return tagRegex.sub("",s) # protected by 'View' permission def date_posted(self,fmstr='%A %B %d, @%I:%M%p'): # """ date when article was posted """ ltime = localtime(self.created) return strftime(fmstr,ltime) # protected by 'View' permission def body_len(self,divisor=None): # """ total body length of text """ tlen = 0 if not self.body: tlen = 0 else: for line in self.body: tlen = tlen + len(line) if divisor is None: if tlen == 0: return '' if tlen > 51200: tlen = tlen / 1024 return str(tlen) + ' Kb' else: return str(tlen) + ' bytes' if divisor < 1: return tlen else: return tlen/divisor # protected by 'Manage Postings' permission def postingValues(self): # """ return all replies """ return map(lambda x, p=self: x.__of__(p), self.data.map(self.ids)) # protected by 'View' permission def tpId(self): return self.id # protected by 'View' permission def tpURL(self): return self.id # protected by 'View' permission def this(self): return self # protected by 'View' permission def has_items(self): return len(self.ids) sub_ids__roles__=[] def sub_ids(self,ids,data): map(ids.insert, self.ids) for item in data.map(self.ids): ids=item.sub_ids(ids,data) return ids # protected by 'View' permission def desc_items(self): # """ return latest list of replies """ mlist = [] mstack = Stack() if self.has_items(): plist = [] for id in self.ids: plist.append(id) plist.reverse() for id in plist: mstack.push(id) while not mstack.isEmpty(): item_id = mstack.pop() item = self.data[item_id] mlist.append(item) if item.has_items(): plist = [] for id in item.ids: plist.append(id) plist.reverse() for id in plist: mstack.push(id) return map((lambda x, p=self: x.__of__(p)), mlist) # protected by 'View' permission def date_created(self): # """ date article was created """ t=localtime(self.created) return '%d/%d/%d' % (t[1],t[2],t[0]) # protected by 'View' permission def time_created(self): # """ time article was created """ t=localtime(self.created) return '%02d:%02d' % (t[3],t[4]) # protected by 'View' permission def attachment(self): # """ file attachment """ file=self.file return file and (file,) or None # protected by 'Add Postings' permission def suggest_title(self): # """ suggested title of reply """ t=self.title return (lower(t[:3])=='re:') and t or 'Re: %s' % t # protected by 'View' permission def thread_path(self): return join(map(lambda x: '/%s' % x, self.thread), '') # protected by 'View' permission def index_html(self,REQUEST): """ squishdot article main page (the read more page) """ return self.posting_html(self,REQUEST) doNotify__roles__=[] def doNotify(self, msg, REQUEST): # """ sends mail to notify person being replied to """ if self.notify and self.email: self.sendEmail(msg,self.email,REQUEST) cancelNotify__roles__=None def cancelNotify(self, REQUEST): """ cancels email notification of replies """ self.notify='' return self.showMessage(self, REQUEST=REQUEST, title='Cancelled Notification', message='You will no longer be notified of replies to this message', action=self.absolute_url() ) # protected by 'Add Postings' permission def addPosting(self,title,author,body,email='',notify='',file='', REQUEST=None,RESPONSE=None,encoding='HTML'): """ add a reply """ title =strip(title) author =strip(author) email =strip(email) body =strip(body) notify =notify reviewed=(not self.mod_comment) and 1 or 0 message=self.validateComment(REQUEST=REQUEST,title=title,author=author, email=email,body=body,notify=notify,encoding=encoding) if message: return self.showError(self, REQUEST=REQUEST,title='Data Missing', message=message, action=REQUEST['URL1'] + '/previewPosting' ) if body: body = split(CRLF.sub('\n',body),'\n') else: body = None try: file=Squishfile(file) except: file='' id=self.createId() thread=intSet() map(thread.insert, self.thread) thread.insert(atoi(self.id)) for t in thread: obj=self.data[t] obj.modified=id if not reviewed: obj.revsub=obj.revsub+1 else: obj.reply_cnt = obj.reply_cnt+1 msg=Comment(id, thread, title, author, body, email, notify, reviewed, file, self.subject, self.level+1,encoding=encoding) msg=msg.__of__(self) self.setItem(id, msg) if REQUEST: self.doNotify(msg,REQUEST) if self.mail_replies: self.sendEmail(msg,self.admin_address,REQUEST) t=self.site()[0].id gtime = gmtime(id) glist = list(gtime) glist[0] = glist[0] + 1 # add 1 year to expiry date glist[1] = 12 glist[2] = 31 glist[3] = 23 glist[4] = 59 glist[5] = 59 glist[6] = 0 glist[7] = 365 glist[8] = 0 gtime = tuple(glist) e = 'Friday, 31-Dec-99 23:59:59 GMT' e = strftime('%A, %d-%b-%y %H:%M:%S GMT',gtime) resp=REQUEST['RESPONSE'] author = quote(author) resp.setCookie('_suggest_author',author,expires=e,path='/') email = quote(email) resp.setCookie('_suggest_email',email,expires=e,path='/') resp.setCookie('suggest_notify',notify,expires=e,path='/') if self.mod_comment: p2 = "%s%s/%s/posting_html" % (self.absolute_url(),self.thread_path(),self.id) else: p2 = "%s%s/%s/%s/posting_html" % (self.absolute_url(),self.thread_path(),self.id,id) return self.showMessage(self, REQUEST=REQUEST, title='Reply Posted', message='Your reply has been posted', action=p2 ) # protected by 'Moderate Postings' permission def manage_edit(self,title,author,body,email='',notify='',reviewed='', REQUEST=None,RESPONSE=None,encoding='HTML'): """ edit replies """ id = self.id title = strip(title) author = strip(author) email = strip(email) message=self.validateComment(REQUEST=REQUEST,title=title,author=author, email=email,body=body,notify=notify,encoding=encoding) if message: return self.showError(self, REQUEST=REQUEST,title='Data Missing', message=message, action=REQUEST['URL1']+'/manage_editForm' ) body = split(CRLF.sub('\n',body),'\n') # un-catalog this posting, getPhysicalPath should be acquired from this posting's SquishSite self.uncatalog_object(join(self.getPhysicalPath(),'/')+self.thread_path()+'/'+id) self.title =title self.author=author self.email =email self.body =body self.notify=notify self.encoding=encoding # re-catalog this posting, getPhysicalPath should be acquired from this posting's SquishSite self.catalog_object(self, join(self.getPhysicalPath(),'/')+self.thread_path()+'/'+id) if self.mod_comment and (not self.reviewed) and reviewed: self.set_reviewed(self) if RESPONSE: RESPONSE.redirect('%s/manage_postings' % self.absolute_url()) # Used to display the body of the posting with the appropriate formatting # protected by 'View' permission def showBody(self): return self.render(self.body,self.encoding) Globals.default__class_init__(Posting) class Article(Posting): """ """ __ac_permissions__ = ( ('View', ['prev_item','next_item','showSummary','desc_items'], ('Anonymous', 'Manager')), ) meta_type ='Article' icon ='misc_/Squishdot/posting_img' def __init__(self, id, thread, title, author, body, email, notify, reviewed, file, subject, dept, summary, encoding='HTML'): Posting.__init__(self,id,thread,title,author,body, email, notify, reviewed, file, subject,0,encoding) self.summary = summary self.dept = dept textToSearch__roles__=[] def textToSearch(self): # returns the text to search for a ZCatalog text='' try: for line in self.summary: # strip out HTML and append a newline to each line. text = text+tagRegex.sub("",line)+'\n' except TypeError: pass try: for line in self.body: # strip out HTML and append a newline to each line. text = text+tagRegex.sub("",line)+'\n' except TypeError: pass return text # protected by 'Moderate Postings' permission def manage_edit(self,title,author,body,email='',notify='',reviewed='', subject='', dept='', summary='', REQUEST=None,RESPONSE=None,encoding='HTML'): """ edit an article """ title =strip(title) author=strip(author) email =strip(email) subject =strip(subject) dept =strip(dept) message=self.validateArticle(REQUEST=REQUEST,title=title,author=author, email=email,summary=summary,dept=dept,body=body,notify=notify,encoding=encoding) if message: return self.showError(self, REQUEST=REQUEST,title='Data Missing', message=message, action=REQUEST['URL1']+'/manage_editForm' ) id = self.id body =split(CRLF.sub('\n',body),'\n') summary =split(CRLF.sub('\n',summary),'\n') # un-catalog this posting, getPhysicalPath should be acquired from this posting's SquishSite self.uncatalog_object(join(self.getPhysicalPath(),'/')+self.thread_path()+'/'+id) self.title =title self.author=author self.email =email self.body =body self.summary =summary self.subject =subject self.dept =dept self.notify=notify self.encoding=encoding # re-catalog this posting, getPhysicalPath should be acquired from this posting's SquishSite self.catalog_object(self, join(self.getPhysicalPath(),'/')+self.thread_path()+'/'+id) if self.moderated and (not self.reviewed) and reviewed: self.set_reviewed(self) if RESPONSE: RESPONSE.redirect('%s/manage_postings' % self.absolute_url()) # protected by 'View' permission def prev_item(self): #""" return previous id in the item list""" parent = self.site()[0] currtime = int(time()) rlist = list(parent.id_list(currtime)) currpos = 0 try: currpos = rlist.index(int(self.id)) except: currpos = -1 if (currpos == 0) or (currpos < 0): return None else: previd = rlist[currpos - 1] obj = self.data[previd] return (obj.__of__(self),) # protected by 'View' permission def next_item(self): #""" return next id in the item list """ parent = self.site()[0] currtime = int(time()) rlist = list(parent.id_list(currtime)) currpos = 0 try: currpos = rlist.index(int(self.id)) except: currpos = -1 lastpos = len(rlist) - 1 if (currpos == lastpos) or (currpos < 0): return None else: nextid = rlist[currpos + 1] obj = self.data[nextid] return (obj.__of__(self),) # Used to display the summary of the article with the appropriate formatting # protected by 'View' permission def showSummary(self): return self.render(self.summary,self.encoding) Globals.default__class_init__(Article) class Comment(Posting): """ """ meta_type ='Comment' icon ='misc_/Squishdot/comment_img' Globals.default__class_init__(Comment) def manage_addSquishdot(self,id,title='',mailhost='',exp=0,expire='0', moderated=0, max_itemlist=30, default_doc='', mail_articles=0, mail_replies=0, REQUEST=None): """Create Squishdot Site""" if exp: try: expire=atoi(expire) except: expire=0 else: expire=0 if mailhost: try: v=getattr(self, mailhost) except: return MessageDialog(title='Invalid Mail Host', message='Cannot find the named mail host!', action=REQUEST['URL1']+'/manage_main' ) ob=SquishSite(id, title, mailhost, expire, moderated, max_itemlist, default_doc,mail_articles, mail_replies, parent=self) self._setObject(id, ob) if REQUEST: return self.manage_main(self,REQUEST,update_menu=1) lib/python/Products/Squishdot/Squishdot_editForm.dtml100666 0 0 7670 7160045536 23764 0ustar00unknownunknown 0 0 Options for <dtml-var title_or_id>
    Id
    Mail Host   No Mail Host objects could be found.
    You will not be able to recieve email notification of postings until you create a Mail Host object that is acquirable by your Squishdot Site.
    Options CHECKED> Posting both articles and comments are moderated
    CHECKED> Only posting of articles are moderated
    CHECKED> This site is not moderated
    CHECKED> Mail new articles to the admin address.
    CHECKED> Mail new replies to the admin address.
    CHECKED> Postings in this site expire after VALUE=""> days of inactivity
    CHECKED> Postings in this site do not expire
    VALUE="" SIZE="3"> maximum posts on main page



    Catalog Tools

    This method can be resource-expensive

    Only do this once, after upgrading from a pre-0.4.0 version of Squishdot

    lib/python/Products/Squishdot/Squishdot_index_html.dtml100666 0 0 6117 7234131343 24333 0ustar00unknownunknown 0 0

    Return to Post article Search

    " ALIGN="LEFT" ALT="">
    by
    from the dept.

    Read More 1"> ( comments) ( comment)

    " ALIGN="LEFT" ALT="">
    by
    from the dept.

    Read More 1"> ( comments) ( comment)

    Squishdot Powered lib/python/Products/Squishdot/Squishdot_mail_html.dtml100666 0 0 1277 7160045536 24156 0ustar00unknownunknown 0 0 From: To: Subject: [Squishdot] X-Priority: 3 (Normal) A new reply has been added to a message you recently posted to ''. In response to "", wrote: The new reply may be found at / To stop receiving reply notifications for this message, go to /cancelNotify lib/python/Products/Squishdot/Squishdot_manage_moderation.dtml100666 0 0 1150 7160045536 25647 0ustar00unknownunknown 0 0 Copyright (C) 2000 Bruce Perens. See License.txt with the Squishdot distribution. Unapproved postings in <dtml-var title_or_id>

    This Squishdot Site is not moderated.
    lib/python/Products/Squishdot/Squishdot_manage_postings.dtml100666 0 0 4136 7276054471 25371 0ustar00unknownunknown 0 0 Postings in <dtml-var title_or_id>

    There are postings in this site. To edit a posting, click on its title. To delete postings, select the postings you wish to delete and click "Delete". Note that deleting a posting automatically deletes all replies to that postings. To approve postings by setting them as reviewed, select the postings and click "Set Reviewed". There are currently no postings in this site.

    * Thread contains unreviewed postings
    * Unreviewed posting

    * * by by

    lib/python/Products/Squishdot/Squishdot_manage_subjects.dtml100666 0 0 3777 7160045536 25351 0ustar00unknownunknown 0 0 Subjects in <dtml-var title_or_id>

    There are subjects in this site. To add a subject, enter its name and the URL of its image. To delete messages, select the subjects you wish to delete and click "Delete". Note that deleting a subject automatically deletes the image associated with that subject. There are currently no subjects in this site.

    ">

    Subject
    Image URL
    lib/python/Products/Squishdot/Squishdot_posting_html.dtml100666 0 0 13203 7160045536 24727 0ustar00unknownunknown 0 0 1">
    Return to Topic Return to parent /index_html#">Return to main thread


    , by
    Subject :
    " ALIGN="RIGHT">
    from the dept.
    Summary :

    Text :

    Click to download attachment KB ( bytes)

    Reply


    maxlimit">
    Over comments, printing index only
    prevlevel">
    maxlimit">
    Over comments, printing index only
    prevlevel">

    Squishdot Powered lib/python/Products/Squishdot/Squishdot_previewForm.dtml100666 0 0 17421 7160045536 24533 0ustar00unknownunknown 0 0 1">
    Return to Topic Return to parent /index_html#">Return to main thread


      , @ by
    Subject :
    " ALIGN="RIGHT">
    from the dept.
    Summary :

    Text :


    Title " SIZE="40">
    Subject " SIZE="40">
    Dept " SIZE="40">
    Author " SIZE="40">
    Email " SIZE="40">
    CHECKED> Notify me via email of responses to this message
    Summary
    Text
    Encoding
    Attachment

    Squishdot Powered lib/python/Products/Squishdot/Squishdot_rdf_rss.dtml100666 0 0 2516 7160045536 23647 0ustar00unknownunknown 0 0 <dtml-var "striptags(rss_title)" > en <dtml-var "striptags(rss_title)" > / <dtml-var "striptags(title)"> / lib/python/Products/Squishdot/Squishdot_searchForm.dtml100666 0 0 4253 7160045536 24276 0ustar00unknownunknown 0 0

    Search

    Return to Topic Search Help

    Search for


    by title

    by subject
    by author
    There are currently no messages to search.

    Squishdot Powered lib/python/Products/Squishdot/Squishdot_searchResults.dtml100666 0 0 2355 7160045536 25035 0ustar00unknownunknown 0 0

    Search Results

    Return to Topic New search

    Found matches.

    by
    No messages were found matching your query.

    Squishdot Powered lib/python/Products/Squishdot/squishfile.gif100666 0 0 364 7160045536 22102 0ustar00unknownunknown 0 0 GIF89aPPP@@@@@!(c) 1999 Butch Landingin!,U#`м0L*׏'^G`=&iFzzz|&&$RT**, ^NNL"JFjffd::<"4,2|~VZRRT Zl ^|R 6DJVVTvvtbt..,JbLV ZZ\jjl 46TD &<^d.JZVԪ"NrrtV224Rfdb| $6\"6^Zbl:V*JR.F$4Bd̶&N^^\""$nnl~~|lB"J*|Fdb664VZ2lZ flR &FBZ>><FT<Vľ^ &N"R"2"N$"F"R., b D"$ ^D6*J6t, F&| bt>L24VT"N6|N 4FFD*FFV2NFTJ|2 2lB!(c) 1999 by Butch Landingin! ,K2@H*\0@G^u|`tRQG_/@GA!F`bFdMREp TJ*U5#TMSO?%V,$PF 0O2YKbo0-XqoŘllQKy"g-@xB'+O!d03 =$(Z6ؠF%{ tyIP  2{4a @L) <*YnH$0K)PAus\q";|AbEۣrn' &a]ݻ]Ut#F AEpY @P 4":t:~0 H+J-4 yS?ЈC=M)({zcE tR1G(!$8O>UT r%ɩ_`!z E BrFMܝx#T݁@p!PRR%V+l\|W^諴4T 3 v c-vnK%̺& }~6:zШ)@%Q<ixun4yUj< wS bYzdqlWf@38D@Tp em=&2inlՋ"`.` ҁ40@0@IXQ up+8E@? sUC@|!BL⨵܆2;lEos"+`l׺/2BG} F!ap"5F1"QOEX%+U,!qG' `_,pUD(qX b rItp h%z4N&t@rC# L0N!IArK/ɷ)  \0KXt030"ӑf% ɕ!|#:R$AIb:00qgY +CDr(ů.@40lva S(Ȝ:p |2IPWR'kE@" bt7^0:I8::rĐ&yJH~r 2* 8(i}G/g@QG<g2 :I@@;lib/python/Products/Squishdot/validArticle.dtml100666 0 0 1343 7160045536 22542 0ustar00unknownunknown 0 0 lib/python/Products/Squishdot/validComment.dtml100666 0 0 1277 7160045536 22567 0ustar00unknownunknown 0 0 lib/python/Products/Squishdot/version.txt100666 0 0 21 7160045536 21433 0ustar00unknownunknown 0 0 Squishdot-0-7-2 lib/python/Products/Squishdot/__init__.py100666 0 0 16677 7160045536 21426 0ustar00unknownunknown 0 0 ############################################################################## # # Zope Public License (ZPL) Version 0.9.7 # --------------------------------------- # # Copyright (c) Digital Creations. All rights reserved. # # This license has been certified as Open Source(tm). # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # 1. Redistributions in source code must retain the above copyright # notice, this list of conditions, and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions, and the following disclaimer in # the documentation and/or other materials provided with the # distribution. # # 3. Digital Creations requests that attribution be given to Zope # in any manner possible. Zope includes a "Powered by Zope" # button that is installed by default. While it is not a license # violation to remove this button, it is requested that the # attribution remain. A significant investment has been put # into Zope, and this effort will continue if the Zope community # continues to grow. This is one way to assure that growth. # # 4. All advertising materials and documentation mentioning # features derived from or use of this software must display # the following acknowledgement: # # "This product includes software developed by Digital Creations # for use in the Z Object Publishing Environment # (http://www.zope.org/)." # # In the event that the product being advertised includes an # intact Zope distribution (with copyright and license included) # then this clause is waived. # # 5. Names associated with Zope or Digital Creations must not be used to # endorse or promote products derived from this software without # prior written permission from Digital Creations. # # 6. Modified redistributions of any form whatsoever must retain # the following acknowledgment: # # "This product includes software developed by Digital Creations # for use in the Z Object Publishing Environment # (http://www.zope.org/)." # # Intact (re-)distributions of any official Zope release do not # require an external acknowledgement. # # 7. Modifications are encouraged but must be packaged separately as # patches to official Zope releases. Distributions that do not # clearly separate the patches from the original work must be clearly # labeled as unofficial distributions. Modifications which do not # carry the name Zope may be packaged in any form, as long as they # conform to all of the clauses above. # # # Disclaimer # # THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY # EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DIGITAL CREATIONS OR ITS # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF # USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT # OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # # # This software consists of contributions made by Digital Creations and # many individuals on behalf of Digital Creations. Specific # attributions are listed in the accompanying credits file. # ############################################################################## # # Portions Copyright (c) 1999 by Butch Landingin. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # including the original copyright, this copyright notice, the list of # conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # including the original copyright, this copyright notice, the list of # conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. The name of the author may not be used to endorse or promote products # derived from this software without specific prior written permission # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # In accordance with the license provided for by the software upon # which some of the source code has been derived or used, the following # acknowledgement is hereby provided : # # "This product includes software developed by Digital Creations # for use in the Z Object Publishing Environment # (http://www.zope.org/)." # ############################################################################## import Squishdot, Squishfile from Globals import HTMLFile from ImageFile import ImageFile __doc__ = Squishdot.__doc__ __version__='$Revision: 1.2 $'[11:-2] # Register the Squishdot Site class def initialize(context): try: # to register all the bits of the product context.registerClass( Squishdot.SquishSite, meta_type='Squishdot Site', constructors = ( manage_addSquishdotForm, Squishdot.manage_addSquishdot ) ) except: # If we can't register, complain! import sys, traceback, string type, val, tb = sys.exc_info() sys.stderr.write(string.join(traceback.format_exception(type, val, tb), '')) del type, val, tb # Load addSquishdotForm from disk manage_addSquishdotForm = HTMLFile('addSquishdotForm', globals()) # Load images from disk and make them accessible misc_={'squishdot_img': ImageFile('squishdot.gif',globals()), 'posting_img': ImageFile('posting.gif',globals()), 'comment_img': ImageFile('comment.gif',globals()), 'squishfile_img': ImageFile('squishfile.gif',globals()), 'squishlogo': ImageFile('squishlogo.gif',globals()) } # make the mailhost_list method accessible # does this need to be changed to the new system? methods={ 'mailhost_list': Squishdot.SquishSite.mailhost_list }