From db4cc265443e2ca1f59441f4f3306690c931252f Mon Sep 17 00:00:00 2001 From: Nicole Vreden Date: Sat, 26 Dec 2009 18:54:35 +0100 Subject: Python-EFL: Edje documentation Signed-off-by: Nicole Vreden --- doc/EFL/edjebook.pdf | 1423 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1423 insertions(+) create mode 100644 doc/EFL/edjebook.pdf diff --git a/doc/EFL/edjebook.pdf b/doc/EFL/edjebook.pdf new file mode 100644 index 0000000..ae2533d --- /dev/null +++ b/doc/EFL/edjebook.pdf @@ -0,0 +1,1423 @@ +%PDF-1.3 +%ª«¬­ +4 0 obj +<< /Type /Info +/Producer (FOP 0.20.5) >> +endobj +5 0 obj +<< /Length 245 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gaqco\IO3V'LhopMH=9Go*rTR/J3u.AiaF1?r1+DYfQ:6;%2N/V`cpoXF,ElXn;k?'1,)>[qHe_,+j1 +endstream +endobj +6 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 5 0 R +>> +endobj +7 0 obj +<< /Length 642 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GarnU9:)+j(u>'>=D#im(cCI+>r"uuVQ2ms2`"_nqIsUS/<](i^OFO;!L"K^groH%hZ[/\_;hF"M@uGPZj8ut"q_48(SN5eEJWc9!lo;6dL*[Hed'?g+BKHKGQF5r*+9qF&lZ,I[CipujHs%^%!<@KT,.U'BkKrd:BL%fD=703\;g7BKCghH)mF:@WA].gOpsR'ms/mipMYKZHlE6/"H+Br`j8`c2iM\oB'sRXkO4/MD-L8dQU&d*Rppk:B=jlR[O!Y!RJR/44YGaAS8MIoi%Q#F3V#;*_"Wp@^Vuj5[I*aFT:WWuhE]Fj4SX^?t#u@_F%E$Jo0]SKnMJZkk*"LV0,40Z5RaWsp;6+HI43%TD#fn].:3;,45@_,re'DK!YKd<>-RqVX4!r%p\+i*Pg$fB3Y[d;FccoNMN5TDfeVOEMn?3_?2nerH+ZkgJ;f#mElXRBp64I9.h*fMXr)"#lI,C63qlI9XQ?BW0KMMt7r0NKQOV7_(%V47MYpDpOqAG38_n#?S^+rVu_`gOY7K_'0@WRTjJm?/Tnoao8$E=jVSV05F*Ms7oh\SOFR)c,,bQ@V(9Gtni%2^.HZAMtW)^>~> +endstream +endobj +8 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 7 0 R +>> +endobj +9 0 obj +<< /Length 71 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Garg^iGoCd.c`?]8EV`b1=.gR0K1`91K?+0ZOMGdU/Zh'Y!=Te%#&:?HH*JE! +endstream +endobj +10 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 9 0 R +>> +endobj +11 0 obj +<< /Length 963 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gb"/jcVN:L'S,ZN.su0/iPi&B-bDZqM.tDL&S[$*6^g'T,>GsJ62U,;?d'"UCmkK8nC5Wo2fe4Vhg9fJmQi[THV>"`fF(N?:0b/p&EHkFJqSnbjSL)1)+W'mI@E^r,*NMjo7Xn&-O`_-Zo=KiGq&?*j.PihqG8cg&TOjOWg.L(-!ianZN(Y)g1:Sn(ZG&boP"%fRaJ$KWNVT"WFhN*oh>;$P*I.XX?D;X:%<[APo=;G+X7W"jIEo6%PebXW;iRg?p&C>3g:4-t>&\H8Cs&H,*<;F\Xqm.YqWq<1$CGmK#Jq8GApUNlV4J]u0MN+_/=I5M$Am?)<;Q"MDAa6'n?P[qBoG@6=Kdn,Lk\4Q;L1LiW,;ZZ:m[p^J``8H[hjB71Q"=",*9TsF%MTj^Qd]f?V_3)iJUiKW%#:r!`)t,5/*FKGl$.&Xf`V2gEE_0o_.@%7;ec1?,>^B&]ccmW7MHfMbBJqO^1CAfDE!i,$#kBC@Q?C)5$5c&_7H+&?\!8a@i3#e>;Vk(`e[R$b2]%J]31Y8M`A7\$90.(1-e*#DQuErf;Ng:942C&.dPBACT/o+hf%%CAh'.,f*iQR5X>A1k.NrORpeIblScWEV+_l@Z-kU&754FqJ:N.k4YdT7T$h=Q7je!,Y"kON8)FL^&C;X)#1";"%'F_].QWo3qZ`hLPZfZIh0is3Tp5``oLrqrf1h[Y6L-g7J=XGh5L6b(r^>9iigopV5fVY6&CAUr>EaiG1pb!/$+4]>gg44O#%(mj[ERB8^#3C=#m^h#ksGaD6HE"\\SD/?h8Bk%V/MAr_eqnHU3,sOEY.&TctA^U5'Is0W9[kY&>tnP2C,8;o9m>n+-YTc~> +endstream +endobj +12 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 11 0 R +/Annots 13 0 R +>> +endobj +13 0 obj +[ +14 0 R +16 0 R +18 0 R +20 0 R +22 0 R +24 0 R +26 0 R +28 0 R +30 0 R +32 0 R +34 0 R +36 0 R +38 0 R +40 0 R +42 0 R +44 0 R +] +endobj +14 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 120.0 655.001 190.26 645.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 15 0 R +/H /I +>> +endobj +16 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 644.001 193.44 634.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 17 0 R +/H /I +>> +endobj +18 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 633.001 260.93 623.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 19 0 R +/H /I +>> +endobj +20 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 120.0 622.001 234.71 612.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 21 0 R +/H /I +>> +endobj +22 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 611.001 239.83 601.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 23 0 R +/H /I +>> +endobj +24 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 120.0 600.001 241.64 590.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 25 0 R +/H /I +>> +endobj +26 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 120.0 589.001 266.96 579.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 27 0 R +/H /I +>> +endobj +28 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 120.0 578.001 280.81 568.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 29 0 R +/H /I +>> +endobj +30 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 120.0 567.001 310.81 557.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 31 0 R +/H /I +>> +endobj +32 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 556.001 232.33 546.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 33 0 R +/H /I +>> +endobj +34 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 120.0 545.001 250.54 535.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 35 0 R +/H /I +>> +endobj +36 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 534.001 206.22 524.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 37 0 R +/H /I +>> +endobj +38 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 523.001 202.6 513.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 39 0 R +/H /I +>> +endobj +40 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 144.0 512.001 222.61 502.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 41 0 R +/H /I +>> +endobj +42 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 120.0 501.001 238.59 491.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 43 0 R +/H /I +>> +endobj +44 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 120.0 490.001 195.25 480.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 45 0 R +/H /I +>> +endobj +46 0 obj +<< /Length 463 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gb"/gZ#7E4&4#u;`Jn,&8RHj]jD1&@m'4hh9_f7ueQp,>gj]dB6OjoEUW:rkQ,D@@>F7H:-EG>0Z?>aHk!8K_3\=3caVn3jCiqnLN9[s!r" +endstream +endobj +47 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 46 0 R +/Annots 48 0 R +>> +endobj +48 0 obj +[ +49 0 R +51 0 R +53 0 R +55 0 R +57 0 R +] +endobj +49 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 120.0 665.001 211.68 655.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 50 0 R +/H /I +>> +endobj +51 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 120.0 654.001 213.59 644.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 52 0 R +/H /I +>> +endobj +53 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 120.0 643.001 235.27 633.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 54 0 R +/H /I +>> +endobj +55 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 120.0 632.001 237.21 622.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 56 0 R +/H /I +>> +endobj +57 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 120.0 621.001 247.76 611.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 58 0 R +/H /I +>> +endobj +59 0 obj +<< /Length 336 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gb"/d5>T0N&B/jCMAt$IQ^^]O(](eX*nY!OA]W/,AQh)$mhfGK]HjQ6.(XEX7)c83YH()"]].)8lB_hJcmE!VCf%_4$n<#Y*B4D,1Rhb@K.N58DUJukrsUg:^cDEi[gY]mob"7]b2C^3TGZ&n8Qa\_FD&>P)BSSZ$s\tj/keDGQW\*K2^/6BRZSWGDH]W$Cn!Xb2KoZC/D=Qn+CchAb$rj8t0'92qeG!XG?0IK;$VI,k~> +endstream +endobj +60 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 59 0 R +/Annots 61 0 R +>> +endobj +61 0 obj +[ +62 0 R +64 0 R +] +endobj +62 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 120.0 665.001 242.22 655.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 63 0 R +/H /I +>> +endobj +64 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 120.0 654.001 242.46 644.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 65 0 R +/H /I +>> +endobj +66 0 obj +<< /Length 263 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gb"/c]+2\3$q9oN`!7tq=jD/kj6^GRoL9aT;'k--+^lT$UjiNK:dWATVT+4g?li%bo;)Op`JgcB"4=jXM"tmj*Hpai#8Z7;hJ@b=Q[&$n8h(6YRijH9Ee[/p,rii5%pZ%JtO0oe5As>:1R$`ok]N@M.>@)O*Y2$BYcf5H9/1%&6"_%n& +endstream +endobj +67 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 66 0 R +/Annots 68 0 R +>> +endobj +68 0 obj +[ +69 0 R +] +endobj +69 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 120.0 665.001 218.89 655.001 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 70 0 R +/H /I +>> +endobj +71 0 obj +<< /Length 130 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Garg^iGoCd.c`?]8EV`b1=.gR0K1`91K?+0ZOMGdU/Zh'Y!=Te%#&:?HH'(;l+ +endstream +endobj +72 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 71 0 R +>> +endobj +73 0 obj +<< /Length 3690 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gatm>c&^U?%_p=s&bPXk^sp\%S?KW6I8ces"l=\:Fq<=j.(1m.a-Q:4VeQ/-Pss,s*4o-W(V/a"9-cr''Ii.]e(q4"QEs#GCq%U@e);pM4l=LsWW14URmiLcf%XK9c8N#,CA.,nO%4>-Fo?LWDR%k?]5>,`cgKsfN$!t]3i;iS:"S9]^:^$8BD1t1OI.AajgpWm93\N]1u!VhcaKr]ER%eKCd3#!S#k%lc8M%_Q);67X-bFmGKS/EM\-b;J?oDLlj`H+Ek/S`VSY95GIoe>cQJq(Pl6I2mO4V0*p>.%O]H[L40<$S$@ct^$u$an.0TVs77rMdr&!U9tVQb)d5d5NW&=BFb(7-Yct#u=(IM!od:^IU4sna0I`Dbll^OO/ob[hXiUj<4l('+tL"@tL@!.K^d[FrG3n[fO/<(8!SDBC2d*o08bi#4bX/@d3.a@cP>h74;!_!rd7C9nNojnAtL"3Y6./TfY,LqJ5JMnfR!1I.-)LeNQ\*OkcphM$S[\%93Zg/6O9YU9u#j#`)-HeGsaWHQUqW[9h[>HmWIEj[ab*e&J5d(tD/>hc1^3?s)I5`">">BIB*^7H:[po4Koep1:R'2\^H6!m7d=7\kd=Y-:H/nC08FM4*us/&s7;a.due049piX]D-Xo%5IX3"k[onV]3PM@NVO4%%F?:61E!X/M$V/m>"Zo&C1g4(anX$&!:6JUCQqT,!W%J$S4d7+CAg^MS*W8$V+66;_OoF85W,2AoKKV[&/kY[\i]Tmi-2-4^Rmm6Qa0%nLjL&aau+OD._qqA`:rBT8U]b%Tl>)RrcBmdE#7i,&A>kC5e%[D@k+dUM(mk"UX^-[pfhb<8Upt\I\\&`m?(6QnI=A_PCc-eF#,=m'a;ollg@%Ii.-H;Fc#J\FX!D""OH/[G,k[-ie3jE/@*NOY&I\lsX8g=+A0A_OW9\@D;G.i=nd+`.pCBTkgA^RRk2^b/cK>Ed$'D"W!(P>AY$JCVpf8,qf*=dD/HL?A.'.@6C@O.=a53gIgF/u(]Fef/Be5L_GiHrR3Gkj21SY'@$03%WIu6A3CbQLYDpVQdJCe;[TbseB\cW)-r?1cX+>)l?jiN1h0(4^S1eq7`u*mb+c=3%h@[Sj%VIHlaqU7m+fU`SUJ_nB:pAm4DDt#F1)RC7*F)X%V_@aqQ`XgqX_:r%.6=S6[-_8`2)9dE%b-r*sPDJfH*am`$AT@_79JP'4TLO*oReO#d!ctXVGFt&\j\g*;H83n%Pdl4;#0Q<&g@&2<=[skq/2t21/8dV+6S7kG+N!cDX[F+(2Z-BACrC0*OPoWJ[M=3Xkf,NH?\l;9huj>k$<1t+-pC:lS4EX6.f*IoToM)"\?dj?,/`d\EDU&Wln&%*RiQQ>OK1ZOEO.kj&E>>S'>Q*EVJUr*UM,2Ec7ja41G4l3fgqiFip+p"[9n+-Bfjkq$Ji;"@D]EQ,2:*0l43G\D_XYWiO7'>h>-jPpCBNHYC$BX.t.KV63P43Wo*n8Xj>4[KF+8]?gfRqc?Qf(,WpS81T%OSqH)K1[i!0E*[sVPD1)@:1Qh[r`N@Hu.$jA5S&Ond?s$2OB\XHR6W=K+]/kqoMg!,D'i/AkOl[uJ#iO;0//HjE8QP975Sjf>8bWK)\P72%u0i3rS;@>f!l'e8ue6)U=;8dQdDak5T_<",)R8U;[ucjmSQXbP*M$?[me8.q?OO:r>JP;t_Y/BhD"&h`!8SG'gh]Jf)>%>C+QarbP+-R#UMt2c+\A`G1pEoDpi7n9h+/QmeQ-53(s\cuh/(&qrjKRqf8S[aK!tC#4Dtl[L^cklAUd]+R1ZiKKWukm^R9T*Z]*n?#i":IA.TGLbM\4q&dr"u=SO`lu(.`;hqj#0!mo7IXRp.'Q,^Qp@\b!3\qD_I!COEg'6)_$T]n!2r&bToDLuNWShj)F3$5#jE3@:nO&4$)(%%bW_FC#dAc;?8MfO6Q20"fG.>:.m:g-b^Iq70guSPY]QKM%GUTs9_uVrR1'FDU!S>?;?*8c8s^3mPoe4eiamSD'XbpZ"o6P52m$56q'cUHRf60AUB\(LCmj4L6pln,l(^jfa2Kn)^T/V*>b!&*rQo#V#[pf6HF7Y)?CV>sc$MahC<\G]mq!bk%]X/_e[!oDrllS7_$+q=:4J\QO_OtP0m0Ere_-Qj8rOfl1pq3"bt8Bl]N!W9BpB(IR,bk:0+Stg767HJ_P-VBgYU;,Zu1$`_6)gH/+S$jfp0%C%l-6Cf@WGaoET8Z0'L]l-e#tO:LK`(0,J,B3-5Z]YHWm(Djm(Y02G*%O3KuN"X7_pDhV4N]ahI$5;CX9KQT6E`a#)YRsC/_<`_XV!ePY96:t;q2%1XU5T +endstream +endobj +74 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 73 0 R +>> +endobj +75 0 obj +<< /Length 2983 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gat%&D3*Gm%K=)V_T8))!(X)69B`;7RN>A^>FPd+5u@cj1q%Oh-(Ql!B3Y#CQS[]YPV)@4#dB\O&ih4m_g+_sqhMf\^I5+Vp9H5Q4m_V7ec%1'q=$%>D*lQUV-35_nRhH5>lE^-pP5KpCA;]>2V`,]4S//dod9=nptZqhEN73cF-5lc(H/k\*.Oo9\[nA-u$f=;fQ7ZaLP(Mn-aos]QgeY@7F$5,!q]m8m<$n=-cqj)6<_u3F(LUo#Tn[.a(OQa8kDqJijWYju\a1HX7[@A'hGcY,gU@Y&i0Be%7@:D%E31nE,jrta9`7_*#[E3'MGo7H9.g@\5b6VT%:j25.=1I*83HSm<[H@"(kY@,Ag2u.PO5Y#`8Ldi/VX*Pkca%Vo%uf26mXl4u)'4&T.@^Ya(*^RgHLT@`ZIDDo]pO$U-PNnRbjhu.m.VTn4PRg?.Z.]4Oc\nNaXYa?(RKoBV&=P:ee\d2([C&!s;4'V%6!I.l;h#$B&.p+e&67`\GaI0dqsG_5N$Eq?A6S4C6/Hr13D4lPdS\K\B?nGn?oO8(D>ifY#RUhdLm8Z'!shX*EED@r7Y92BA%@[O*],"tOu8:^8:/#[=MI_?8PNBh[c6I`eB0fblj4@6##Zp?KYPo5i2V=VhOu5Se\)X9ML?G.Yhi7MWhJKri3DWlOUAohDV-::n@e>p#=s*KOW7:NK%7Vj_e;L!p75BMaD%EQX70j+1qedASM;cFB7?*,agdaYVV;>f07o&T0oTmcm7rdSIP:]J's428p>gY%#5sD(eV/W[\lP-5@L$?0ec^QaRTl5uM#R$4NUnfi>?p#"EQhY@l1W923<;%u9mEXdHs\c$Us1fnOS?iPU;I^DP,:B]-.QM!Pel]nBnZL6[#S`+)mJLr-4.F2A+&SEM'nqK&\JJi94<=[&rM;';@6SZBG^ab.[['Jr5#D,$oR5=JWcZb-ac8M`e)2h@)O_f3gA(rddC1re!t2gT=l\*q0kW#dFM0nPL2a"V=@*#\[U.6YRY[MmNS0A(*?kP3e1rfQ#;qMmR0%MUa(+,$#b]e8or_?G[5D,q1=4;T%#eRk4@ZKT&\79WXOC3S$>OotV^@"edrK&dS%/`h&T+lOQI+-)Ol+FY0F>q*+s(8=WR].iX,ofD&N5/I28bfbghih0hp[LMe2@jV`%Qr<0d>g:7,mW?E,@`iNE.%!n.63365M=e_k^ZqCm8`]c_i=PZ`24(\-Lo?E'gZ*uY1+*^fCbo]KBb0P<\EiZO]tMk-;JVQkk!DW-lZ"ODJgpoX91+>XXOVTjLEq%Ij3i^PV\3Pu%-D3NF'%napVP0[`S9:E%8l*b"HM1%VkH9l!c+TMWI25Am6&krJ+XZE8-$=Rpe[^kg3*$Bf#A#nG_2mtmb2OtekhNQCq=X;KM&-?;>fDrOI9#Lj\[omM0+R,j'f:_EGIS%>cB.OhB>J]V=L>-nS@,VN-TiAbEBa+4Hhc>P5n]'OXd!Fcg0l201soOPA.*Zi>Bp0TJ1Cr:Bm[L#Gh"\9,5)!9l!C3WFE:LR'SiW[RL"75BNg3o(mP0MQQjPbGS..)%h_&=EmB/C7m#r)RraMhoJkaFA8R>1D".L=N31GP@_RZ_;'a8uTc3%L`e@MDUojDpkZ4LY9hbm&c:&(qJtA5nV09hWdA#(Jc]nTG-nr+51,PpV\34nD4&#\c,G,\X>sHKRiQnjZU6XMh;j30Uh/lV"RWpH%f'CQSP04=1iSj28r8li(8B<8#Ej6Y&gT*WBG'AGJHiJ'\+rH7Shcj^f&\O;qT)6h:+j^-pAgaVU~> +endstream +endobj +76 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 75 0 R +>> +endobj +77 0 obj +<< /Length 963 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GatU39lJ`N&A@Zc/5D&O:3UmT;`uue4nR<_6`$f_>VLsh#Jdq\E7]kO#KfYQ]uG7_[.g,_bZRr,G\#k8\Jp%&/@C8D5ul2^jq/JJ6;[DcU?cEe<#P6@VjLqG-;kq^%2r0:%Fk%1gBVm+J0_[%_X+CtZjWgs;*.,/Tib3UZ=JVdpg=>0d.!*uL6'i1o[VR-DLK.9YuqmV:A.BdSg(&;i5[AOU%%GL*nqS;^gk]Rs9dK3sC_5c.*ZCff;Q<0Q[8g9j)J8$d.At)B&=BCD)5EXn'g8,?gRfkZM>(uW/S7]*L]<$bS&Nd/<-4WUT9tIAo*o^`sd%:o@[a3Hr(L0`N2B!+oCUMK4!OQemDLCj&mWOdL94if0K:C]KJb3:S5,sg`b4QH#$t*#F*ul+MpL*EuY0XT3Wna[<,BAu~> +endstream +endobj +78 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 77 0 R +>> +endobj +79 0 obj +<< /Length 1401 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gat=,hbW8l&:WfGLj3A@%/q-b[ng:i?#eR%:?:eaWj8b]Ak?Jj8L_@%rU8o-DXFf&-nD)C1S+"+GeTU"iDY,EoiVJ9!=Ii.#n!OW3'cU:#:*j".1cN2K6SI8F]PH"HjD>l[#R?IpI"Fo&HB"nVjJ0Cba,#%YLT-(?kbSEnU;quKdo`.Io?ST=Un%I[+1Q-]YRIDZ-#`4e-.-4,$TgXrMQ=ll[W@MdafP_dV8,X&FbG%;+8D'j,PVKcpVipJFN7<*(K7ML]Nb]&Te[0(i['EfOf8Km[gU<>q0JN,XphFqu!IbQSXG6pVA]l1"OPG!d>5!%bts.e;IecP!K>;8IhFo0,[chp06T4*lL"Ta.(^kgMB9;:]9-1R!d'tE=fRAs]2W!TA3qqn(26R0:ak.la48LjVSZra-:),V[pqq;=T+!/7FXg>*_p?FHkh7<9G0Nr>j17kV92DZ&;:"#c;S6=*1YBd!gcag4,ObZV'+-n`S]WcFA=355>lpVX>B3i-i/:CFSbXTUK)X2Ws9HH.-?[L\TOr'1U>'aDB-U2_#=Q-Pk..!gXh='HDCQRcfDUOn";cPk?WH5/#OjQg=7\g1M*V^d\;HDK9_E#&OW@bN[=4FCM%=&2mubPA5AdS1Xe(Lq2Wr42X3;tXK1M(hcC%i[\jmpH]:gS"H!a7Sn=S?>KI9.$``og[U\qFd:T%6>J2BT1uIr:kIo]L9'=ORWp)<,:aKhiQWVZmZZJD^4aFXB[duW-Ec8S5[%-f-/BtXKF;(;EXT&C,d6fU(HAQL1f3MCT?uki$af!d^&*@F_2!;2QmRf3QCB%P+,KX^>F*K^GhO\SWnIN%Z:2L<*QV6&%%n5Vl4'97kgLQZrqB(N~> +endstream +endobj +80 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 79 0 R +>> +endobj +81 0 obj +<< /Length 4988 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau0GD3*_c&cR6o_UpNP!ut>3]@0QBb9jnLQV2Bhe"BbFZph+MP=7tpleVL88t6dE:mQ9g(<$=_4qHP*,B>a`dU2EKr9

kQD)1+`Ys'dADjs`G*:_d)rmW[U@NqS-B]O\4uuTq`NRZ:I?!fFtMhA`\)onL=NMb]c'_RX*HOo]Y)^I/lf#PVJ^l/_d9b7,8c$)_?`XgYhFC4Pfc_Gq(178geog6JLG?:):_5W9BWa8k"W7E$@_s+UP+;a>[]q`NN[\Q)\\G"?PcI7i(HnP5+ES#O:4>HGNTGj2DtdFs'T6qsKqjL2)Zp+nBi*sN/UO>;gL6KFt3r43F[UBLYUQ4Ces+J]A+ICp29`2Ls_?6qFuAK8s.30:#r!92r;7N2`NNrU;`!:*[Uc>9*,M\`l#7ntS^J%,70Bd(?"f,(PXM-*dm/LGI"AX)K('X5+k;bPenD,`]nVV0Cuaj_SI[sdOgSO^S?ie=Rgo5hA*5"M@hC.=IPi5U?OQmG9F=qs>P'f!<^atd$-*,JJ&;huX+&Dc*(djNqe!Ss$L3QmH(_%>9qFe`L0BipSBmG)L=SEh*C^Q.=@G.["L3J)`bKG^i#?nU_a)D^]]%>b1(`I]SIlH<"2Ce0(_qLW$rpkB91L\CHisUo=;3La@+:QA+m^3+Bs3Y*%9a[o*#.`RbhU^ZWc*2-^FjiMX3IVF&!mtDV9X2[4V-0+b$g:5ih".Oa+$f8,7nLScG6"D_.8U#ltq/]`5df/,]".mBgeaXK]k-"[,LBlk#kHsQ:l7TN5O%HRJ4dX2scuq5>JRia5c[GZ!;,BHUkC.%L'4`!!5fITKC7q%+0@@K!L@L/.F-7C;:h^^nh+cMI^#=h2_aKc7M8*h$kt)DJX]SZ)NtZVSrfPi*p,9+#l9k6N-^"dL,:btB,K>)O!]]rMhgt?1GU[pp(tL6gYt9^^'Qh'9[Hgl&4OLLdb^8S<(0KCalLU'N,0jmA.D>:9#2AS.L(^lFI/k!)V^K\#]`oiAPg:Xf!#Dlj_D!jiGEhEA[`7pP7>PJ+Bc/0Rk!iH&-BA7BYeD+]E+55!0P+uiQN3RUe&bD8K4&5^nH0CPf`n,!tQ)jkpS$m'1)oN0BaJ*UjEgSX#D7QgT];2mVk3=\".m6D(K/b"$/h[!2N"X?uLgYOK/Zc.+l`EII0cYjJHeUTjaVOM[nI'6=^XA6VQpB"8(i\"g^LcCfk97GsUn3bkQCagD7/t`4cq%&E!d4783'="X"hUo19Lg/Z1#'6A0`#uleM9p%Rc0d##?baob-[$sV[V>1U1=q_+H$_GcrmOl)/c*dj8cjS#,p7$B(ib`NT2#P!u;2)W3;apDeC!`rdGs[%#(gN&Zu2!B^5duL)?[#K'>_d3MR3a'1)L9oD'/0+YZs1H@1g>h:cj'i;nVCihK]`6Q,RP72gHeePSQ7LE2!&>O&En-k&GJPjV$q;u#F(6Re]g%#9#stqf3lp:@,AtkRRs!&2i8<.EtJ)oLmaeb>r8HBRP;BXPb-U8XaA(tDa#s>59kaA)/h<0rP6cuaT+n<<*1ttBZ^nrXncMSR1]3nMcJre1^.^s85uJZR:H>c#622TmRU:S00!9R47_qE[*q)uJCV).C?-\.X6mcV$G`ptP7To08XHVi3&GiXl9]%EunJUlM[b*GHp;i8Xg3L^2(dNDp7:.R5H14[*P@6\48JUeaI9:%8P2EM5)D8[%k39eQ4Fi?O0#VWX%/+\R`E))V+0dt,dX]uA#0(nhnP=kfNA\^'K%3S:Wfl[_:I0(.2?Thq:"kNr40cCkb(kJPX&f!Xn^BleBVc/#X:aMUL!2rc_%L<_dTC']#=:X!okpah4(%%<]+J,>(]S!_\U(h`oKD-G7je1F[?LO-eV8iaKVT4l=VCM1X7RKU'\fd8%ik]IX"MlDa\K.D]`>Wng7HC0Eq/mKamkUn=![k_NpB:9.E\PJ$'c<2E555i*Q?UVnMO7&M7=JJge)-4&!hB+R;AHD7#4e]kOlI[Fd)*Da<@gel!IL_SP`Q^0-;(qb7KEmW]VS/HR`l&`-;>J;g4BHt0q":c4`U;G&b]%I`OZ'0%06,TCX6)0!T(0?NC,^)0%Lg'lKg1H0I8Ku%G#"`_C+TkocoMK/'PZX3H":1G7W#'3+$KGlq[N@N##e=r#+J_d:#kt1Y.Q-CF_6,k-B"$4,n`neR-%`=nVaVRW=bD71f(0TDjA.kaqZ!E,3.1#ugcHI@JCeH/mK6"f[uKUVn"i)Y,HLn=U;`'$Nr[p1%!.m6PG65thDHY1__InRrDE"rF#A0&AsBXuLrB0*+H/iiB7Tp7"FsqIL2'eq[cg^T/rW/Q%%(>If9KJ!8r>D'TIbDNh%+G;ZR)5\g7oWm*R;5bqB!L3!$G_PBo79=iqNjg$mbu-Mh5nhDD7Xf*8P1H9/7#E3LD8,n2iKcN/t0F$`:L^FI9uX@C9\^SH%iAAf[,p%d#CP0YYS+`)22=m(=X@8a3IZZC8.l$qpJV'E.,\Jtr61S?EgJhGrB1QS\C6l>"ur9AAAdgcD084T'#ARY%U\_B/Jl__Go@,K5oRR[K$L3@HHr)7TT)'GTe`:(*mT1;_[+fK8*CTQ_71;2PVYL]a@T1s:skl_0^0+,hWYs4]Cn\XSm6/[#fa96kYn6mYHL,!b>6*"[M-R7F04FoFi9[HPnM,_)PE_-%_/lT+Ys-LITmA*J^qMIUWpYSU-+*,PnVD%2!@'E"Q*14=2O0E$GB4-DDb^uG5BEBRR2I8:\2UF<=(hRP*1j,K/n:o2>WcbA[E)ZI$4!H#g&c&K#/q!a*#-;*a$1NSch:4jtjNn@BOb1bX(uMJCbT5oZ8mrOK(O6EQNN:_@9bYQ(REaSt+$WTl*XNKo=5Q]UaO]Z,O3A5/QaED74LgjSGd\rFuS,qtImA)8=/SSIrcq;7=pOO=4cVp1$@SUOVaEVDU1](^5$^q,n&$QlYO)puIP_lp^f.[9:%G(r"4Y)>qDQkVA:+n5)[fV?aQj,d3RheOZI2;sGSH.HaE#`7tS^B`R17="-JY"Si]:c_VXbYi;";mWg#S]IS_\2L*kAW(!/(`"e&64;,pQNu7Jo"3aCJYlCD#bU4'=41t5VQ7oM)3(ZC7"m!H4?N>2M2&t<]^UNj]=>oYTW>)#)n6!(0#:"\u,YHK&b5o33!JIX%Y)Di9#RB7AjW6p&K'THd'=moaZLK&[h-9)/ZNS`)UgjPV?pKq8-^tuKQ#6]e!6#:o/VgNPM,:K8R:)5J7na^4o4`KrZiaOtSTXVT*gj +endstream +endobj +82 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 81 0 R +>> +endobj +83 0 obj +<< /Length 5037 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau0GD3*_c&cR6o@c8uL=83J6IW%Gfg's,f%8r^YTW!d![coYrZKOjMqDQ+&'PGL4Uo!Mi7>h0Dmad.PUV!E_j1CHN)rHYHQ<]C>CqR8^TC2](Y6sl#SoiYu]6ca_:YaS!O8@sQX1]);=msSNkZXoQ0meHCV%R`J'kFqFk%IB'VEqK5aqSSpBWPJ+!,h4K[VV0WFgZL]$3.=]/u[^E3Xu(2\,L0HmISl@T[Neu85D;<="NID2/Z`NH'd"E!+U.NuL-D/j:JlZb8_1`H`bRnpVoLFBYmJcJB^c5"Lf*^FRk#NUYF.bjW0YoT]XFEO6r`73pUeUmMki%!Q\D)>Tg)u8@7Q]#[#kNl3-^N';Ec+B[RWn\!O*Q%'IX\E<,Y9eWN--c9"319`Z!)*h2)-%n0)CuQi7gkJZduZEn+73(DeiZ5=OK1PolM6*N@*FkCB$4j>)NUYuLgUe7#@ft^"QDs_MFSj8A6)gKiKqnA/+O,RAhjSrA75WQ?(>f%SaXiq@'$LKHP1&WC0$K>W8`jh\N?m"U8Om9bKG$[3q@ftqM/Rb.>&LcNQL.#3V`*3]Og!6/gnM*@2eA])4BffXkbgYRUN"e5Tpgag/"0NBT")6HDV`kd8/:<_b0osBB%?46ORLuZ4S8?I(/M\#BWfu:`o4A'=LOslR6%3P,PM5Er)=YaSC=(Xnb-J!bLcm5L$A6AD&E7;&UHrn/:o[19gb@W!)U8#OD9S#`+C:X>K*XZK$`P6iJ+6GiW-4rWXe<'Ugu*i^RKA`9fegXK#,IdU5.EO#;(&KgYU@W&F/(%]1!c_B8K2?OR_\^Xh8-4[X4:rVp%52mecV[oKKXO966CMbG.-BNb@[SsCalN-R'c[:lrTHFe(@Rf`jK5'E'W:cIj-h:fcSF.I5SEeN3!Eq[B@kJE+PW$NBf3aW0824@Ap.3ae@l';6Os[csp>-IR1Z3V&&&mMq1Pl;52V_DskZqB`uJM_[(8jQJd!!Lb8*eHG`+Up96mi38%r5_'up&F-")/rE&8SXs1=d16JW$1>lDbEE^'0h'fE["F*s$ijFrbja:(Y^)#^)q,Tp=$;-nlF5o$lCTJdt?%dIQ'r'_&,]rAgGNV%n*58R*E-joOn'e_6MGF`)j>hI&%(H@.oTK'qGnbW8piL3rc%BRTN%?t_*;CN/WPT:m;6?^)hj?/bbUjaHck4M+V$WBpPS[6(8QZP9%CeGegKQtOUiBU$]#,7HG7Y\sN$=s6I9_eb*da,p>lIY<3?-;o"1MO&*l"RqC?\hmVc:+pu1\V^8$7jVCHW7T3J#,G/SZrb+S_!!nSukg,+N,K*np3-07jD#4";D\A*V*@lCA77tZBoU(F[(92;sW-fGZ=Pm+`$V7)q3h6a*sSR?/DCUmHImRmAmo7jPd5H$'h7V0+^XmIVWK&I.S6;g!jlC,jVbN*)4g2b,7R6qKQXK-ef;A[sNIgi\^ibpMud?h1V-qf%4]o:6ke/Fg:eKIQM]:ldq0QPjrBr#Y:5995SocjF0feC-_dFr5*4o;+d"*Wh-T50QfN4#>)O5&'DN;q6gmJF2[$8AA\9(<8_Fo8c\*$fKr':HOFL]?ON[34:4d>*)*9iT8/](@o5b0q^Ct!4?!!"2Qpa%5EueYg?O:LYlr=2^rgc3lG]Ujq(s&A#%Dl+Ss2SX%G7J7dH3bX>3q86gWA=$N(g\^.3\.6$Sf:^X%*.Ia?OY-ZP(MofE4-]??=`A6dlH[TdmmF38P<>WXnK`\/!EhRb;j\YQS0)s)e%N^;B\di8Qk#\UAOK,=%D,mCD;(3#\q9(ir4-GkA96%-,lJ`*`1$Y=D3YEb`'[O1g[IgMLGHt:#lF:1VNL+*_A2H-&g+p.U>36d2J[A5g%kgR/=.\@hjK@Tk"32keTUGc9*=AQZ5,S]Aa/(15Yg(e5o;:F3]R#WItdr.pWZ1uCVSG%ZU$pmj5M9f"e01p]dFUg2&&;#B&Y-eoegk$Xk*)eh$"501HASC+6VSObA9Fm$V/S!H$9>g:--m.H&@)5/N#3&"3Uff+XqhnZ<($ar4iL`&-GaS.8u;V4G9"[8V2-I$`F\S[-UPrTGY&9doAflLn3Z9EN6p]Cm@;:O3gm"H3_9KGS/4dU(-TjkJ)bfa4qh:kJI%8Af#o:7)"3U:_`gZ$$(kp_MU=f@XlPb;>\)%VW\N&@9kVtt>-R#]_08I0p7UF+@.IIAc]h;A9SY$+Md$O;)D?nLhZ:?n3S/55aN:VLF_R;VHC>Et<%`q3,oZk%lqUh"Z["5WV(e7lKoetk65DU+E>GOF9Hn;/rB4[Mk$TM*:^bm;I-cuLN/rQ=M`#hWDa&P)B&nXhQ4L#]A4\d->K*fET[nukHkR+Qe6,g?[/EDO,>,Y&bIOQ4q7f?'%(EA9q7Hpq?1iKo-]Ll#_#T7nI$Lt-RSSaEh9j$^NiMHV992[Z'_XVFj#D>5S/;bB]@I0I#m_FL,`_/<+aK*S=,[82C*W]3N[d[Kg@O1k:QsY(L32qWBlj6PMD?p_*W!R>"MsH5YN=+l?)l1phOi>_k)$94+!m%su/8o2:pWA_c(32e[p^uI08_l^k^rkp<,5?PbcBb5f`5G;ULAEK&W^!$^^.0KDE'$IQ5"1IoE_q!o/bCqhE?Vp^!W,!<@Usa8%HDgY5Y88cp)Mr%HK(aTS]oT]+\7$D1qfu8l'.;qoGFJ\'+dCem%AXGW_J5"XYl0oK6m>c;5>p6u`(AVrQ@IQu#6+2rZZAMJoe4E]sn0id>;Gc]aaUYnTSl2&K6^"M[f+BQV\lJ\sW7X_BPfX>?-JJZQTU`>>Agejq4-F+n=\!eLiF1f1=q4qMdN*s"VA((9Zu^m)RDpt.f5qiSqMM"[T5dNQoYgE/rM7_LB4'Pr9O2&(FlZ93aFPT2KU083FA7p\>UCQ/\V<9I9[h/F1o&Ur]ELsOX3mJAAETCJ^!C2,!$nCnZg_NRh`nJ[(R":GO*>1+8&?ja5\d#gSo%oe`d0gb*,:b_c6$GX,[=oFGiFDY:$pe'7.4pI8L[>'tmJZ)WZBpZhQ9,Z%9,C[HCY^QWGqB3u&iP>K7Lo.cf9<'Sq^S(Y%\?gi>ot_I"H6:l-S(:kX@+%uWCV\=b,Yl]A=,TJ1eg)oI]uL1<1^OZ,H!`]]%E:^41tCdRr?p+`jp.@kL5jB.DFhpCbO'km-Zu\;2![FhnfQH^4]',jLgPqBD%[O-B<:B9j*mp#l5('8`2c~> +endstream +endobj +84 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 83 0 R +>> +endobj +85 0 obj +<< /Length 3420 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gat%&D0+aG&cV3*U$>9')'))X9Bdh]SU5LKfU&*`SPHBKJOn-S9S!NW>,QjW&A,_1.E]Ab^>O;+[TG'rMl#9IY($<'Hn^SUGd,;mika[*GS&WeGVG^Gj>*;pj5j[T+8k:r/k%)8mg!d/Ma]HE]IBF`8]^6DJZ>ZlK].P3%ADah2Q"j=LoA']c.a=CGpf1$&t50;?5P:-%/^nc2Q)1"7%U$,Z@*d*`TAZ8S.B$UqsRqaO,bD"lZ#`h%;M9Sf='[udZorH&Of1N9'm/",[AL1#lU.6C..-&Vii'Q-kIK[`.m/"6O;2%+=ZlU,krW\a.d*3$-bciWaQ9M'ZB.C,-+')CLn4cXdGh[icl?[lh,R8'j6o0S#MA&/[o[g(0\-Q59#%!btosp5j,u6;`R4E#n5E![7jUl_'$s#sQSPGPR";$u8:0uh,/Cn5oB_Q.tPr&>qb%SYJgt#oEX>R%t;^48d`FC@j6jtSE*$3Npl,SRm*)ZqI(tug2I&OGO*G_#Vc1*KnC<`sLJ.XNFVLP`>lUW2^p.Yj9LjA-6%<)uSi%Q(e-O3/J\7-K:(aKLF_JB%qZAJa(KZ/q11fKA"J@Q!PZ_]h=&',,0)`bosU2m)p61gQ1Xe]H+ih:-03':;-UbeC4gTeJLdUsMRZbo3h+c/m%i*\7;9;V=m+lm%+$ST7%[C6>ijS=t8e9SKm?c]UkrZ@559k+i94I8B#'*6d/YqoY)0I*@N9>AMj-F;Sbdl'L0in'NH*=1:(W?`ZC\rgJ`=oc@k&P"cmgjF4=e\4&p]]KL^_KM.BAM"4c@P7mPcCikAYQqY>FU<11ne+P.:i4&8fk<;_<)E((s9bl@_mg^\XFe#Eq5"W0&tAa9_gk(8DhY.#aQ*292M2nI(51:Y+6h%^Ul$J.;gbJ)PMWA5]372$-2E"7SM!pFdWS^!qcRGHHV>X=*BT@#Se#YUq"2QJOD3^#X,\1c%Cq^cjp*-kc2K6Pn"0$D0e]&=h&n/2,?;R1mR]c:N.U?l873ZBdfLm#]4R`'FM%,Qtcpu^b/HuZ8KD,f59%qo^XkG$g^4_OKni"F&AVNZK*7G<8W[ecb%'^YH^X*JomIXkf@P.CV^G+YRI-nDnfp]d#[BH.-LrV]5;-I+\%d356;;m*R$9UFZOf%'7Lk8;7_r(TQn-6dc5qPKA)M@`"k-rV\X7NLH&C_;%D7e7bB_.+G/<"DKX\[\%MWiI7VMc;qlNdV.Ba:kW?dtP;_lLV=NS7$[0LH!LDqnK?n7('8GgC$ZM*1++#hFiW>I+?87KgnZ(Q^bJd'PkU,TMBGHo969POkic8UgP%!QpK5fh,9s.OnXe3[,8.Ersf=r[VNl!IndaSTPCp"N3`l5kO)j5[T)p>7:'4i;hferJgbO(]&/&F2S503EqHq"/h8n02it(Nkm^D6bGMS#7Z:iU?H&pA-bE?/AjJ_F28YH$6Kbri7j+p$>.=kVi&Q(>$qQ@/&Ws5ff^f6-LX^WVoCa1%motGHjaVkPYk&^Z%(pLe%BfbI6&rJ)s0S/Lt^?a@:XR'@Ccjo/MBm&a\14(3`juPL7@E,[8)2D&\FVkcRVFu,(f8SHm&?u]hiN;.Q0@ZkfC=_JdGS:'-C>D9@LOe[hJIW_%bF776+Et_sp+PcOW>a[Q/;u4p.B,D$:G\IR\9a#[m_?Kou.MXCk/JOJ)qD21YK$Nlcju)a7#h;T?n<3E,s?P8O*Hb7d2:o&Q"7m],PJHqr:O:?$>0*ssaoXoOl&!s6+bP^PG0@HZ+aLh_O24Wacs.tHOu!?*TCR3Xq&J?[&]Dh%[E>u=E>^(F*%j(LpXBE7[lo!KhHYj2l5q"F6+rTOPL]RIW+]t\ph]Xe&!,[.J#_oH,>0YQkrgJWnV2DulO]>scg6V&q=)*mLi)\Kd_VI&S_:geo3p'3jMUl?;"2=E]WG1X)%_uEQ4i$i`11Ndl1T[4o;.."\Yol?17Ks"Z*?Iebh+4Zr>0p5c&M]9_0=N"s7u2oqqpj+h#?k!,6%>Z5M9O=0dDd>QBHn,Y7ZHHD=>irc%\KdSg5CX^8aq`a\X#kHCP8*uatF^+i&5&3C4(_P9>./ca[4(j=?Us7SXI:_YuBAL_gKT-@c#kLlaHpNH^6AO/c!9VfP]"EQ)Wt3r5X95bAhs"NKM,iemf`Q?@LSo#TS%T2P_]8Fn#$if=t"PU1_+6HZ:::G":)Q>i4\1cV"0L@"LH8IY)LJ*]36/='?%PA+&M4"$[(qR)aPhE.Mq2*$!*V(&RS%%,&r4iZlchUEhB@4'Kg8%jYGtCU&"o,YcHdr@n(%%R7?i-IHCFbc0":epa70]K5WZV-9H;1fTo,iaKC!*HFF4?9^E5%R*BJ@g:M,=qp/Fl:Fm&B:]:eIoaA-o7FN(7RDr1K>G5XWb`W2,+$I-]+o~> +endstream +endobj +86 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 85 0 R +>> +endobj +87 0 obj +<< /Length 305 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GarW5_+qok&;KX9`>j(8*MH<&hV8R/20!aJ#8?-KXAjOK]!BlLQaSeSA%9b_cS4r"X=Uolk"l?5RY.^KKf?l!VSbY683uMJV,1P1n@Vl<]4:$a'$^l]YgTnAYi%Lm%k`%'bIP(gl!!KJIW"W/_m'Y'FJgFtJA"Z2,qte--Bngh'tkce5c1QD@i3V&.f33&`b3hT*7sRjbj*Bj`cmCaksk-hXR0/VS%G^?o1NQ~> +endstream +endobj +88 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 87 0 R +>> +endobj +89 0 obj +<< /Length 2552 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gatm=9on>E&\[qBn8S[%B_5lh547k2!#'11%G!cSfc8X"AT:3U*JnZPn#m8@.]SA@\iToo?hg56@^0#d(<\o`*^5'*c`&RWV/M:H.DpHjQ$WBJ)6mSDd^d!^m&3@s'p!,lp\0YT'%3gXKWa^>)B5(Q%#X;<_"#/:WZrI&A.AgBmOM+N/JlB@B+-!41'(Uh>i)/(SDN=6]8.4,SX'K>XQCB)Om.^CJpCTmI0);6";iD!5f"lU^H@CbI8?99e^n[nm?R0E7!/E:17dc2K5':lk64@].'lt9Y2eC])'7H3#2a+CZ_=[eekYIR>!RV>)dQOmOB!O;%Zfsj$5in$HH]6K/6^_OX6.[?6(HL!RRlJNOG:$jFnuPVVJ+Aog&g:d!@9mp=$CdH:hnHZqN=kl?):@&V]pQQa;sekr(,NGjPq&uh&N=(%-1fO+fi42'5oV_:^m`Wp"pdd3>oQ&(L=$Pp3^8PK&<(DtT`1H^gC`TZ'esqs,NEX$T_ZX?'A70UW*49L;?(<@0:tJJm?P#%"!#$k(O7D/$/#ruNuF0@r6eNu^Gl4%iX"HH2\[I`h8B[73F66uRMR0Ln$RfM)gW+c]Du?kY2&$i1;k;ORVft>qT^52h6BYnSdVK0DDR1X15j,+c9+)m;7c)c%?bjCT3akNPb0mPVVtG8N8JN9K]/5F+2nNUi@P-]B3aDt;e%/mQka+!:!V3Ej'lgQB*Zk=Z:cbl10=Nb*ZO/)&M^$gjX8;b`q:do6IF/RTJ,&R'7^4:9D.is`^,\8S=]4gkNtKX<3,uD2L,>D4UKmFF2n^%`VnMD?'^3JS>#5e+)6q7]h@_c>+JOH>-Q8Q?%9_^oF<-#k/hMBOZ@1tS:A8<8S3i!t9*&'iF%SV0Jq**cm:2Ibhl,4cB/[Y=Yl9$77jaeK^rmBgXj7eQQ%@S@`'9bOP&&CG?O7n_&M_W';Mqp7AQChE8-o1`=sILL8LfCF>m)d_5^hk"0u+@l!E^6N=tMP] +endstream +endobj +90 0 obj +<> +stream +Gb"0W%ocMNhT'W!&-CscL(T55^glj>+rFHE,KD'Vgdf3Sm-<0$1o$0Zh3,pEf!]?$>M@Zj(@B!0AF3D:He@oA5GH@oCYN*TUAWE_1eB54@M9E,n+6G44,i2Ro=HtLM#[MUzz!!'gHPa@^i=gFj<^OPIIMMd:sZ80`:#lqb09he=dK-ZY&U]]j&NC!s%OmhRn,nNK%adhnFO1kKhabcBOW\f%&:Wm^&U\@Hl4:qMZ3j5VJ/6]F%mW+66daHk'>/>X`'!"^9qbKGg%Mqct>JqASl]BqNBt&-*gQTn`UJ.eF8P5_U6\!3"73!!!a[#QUMa%flZ0kTKqV$9\Ll:n`XE!%RUP!'l5Z!W]1G6NG[,j2^&4_"Po$YHT(nR57A,5X<%>B?nS9P"a1bpKS70JE!W5^67:tRFE91>e%!>!nF;NX4VJ92`Fh35X6[i"@*LJ*kqF/Mm.eJhL6U21\OeWse7RgSD@q0#N=.tE1\;,[f))TrsDa=p4cZ"1I',+lh$9]ZT4VYQSTXbhc$[V#Bm_51Ul`%)6Q2>OM_j$CMcH]0_p6XIHZh5g?O<"!kn2c3a>4=--Tm)?OUS&`eNi!b6UmGGcmVXE?_kr3kXf^jsgQJP9Wa[bA2)S$n0"&D&H:X'C.!V:KF"R/&o[(4/)om;=R6j8Tc5c]0T@j1m0^g,3-RUl53(KYpM26saBA!6l_-g[*1H=72Y2T$"k&gmQ[<K+%GK:cDei-bY>]LglRhMgbr<&.2r;oQ?@Q7-HL3T]p>OA4`!EsNC3oML)Vitd0D(>GpJC??KB??!Q7]HC?]5:)-Ca8ZMm[JeSNZnq`F2(D8bdbWd+9.io.#EA>IMn2%m$50odfFoTng"Q?iO;VqTWrcV_r7sVhZAFT%:'pT%:$mT$#6aVhth@l*nEM1j)%P^ri=Cg>#qZj:Ud9D4bK:ldooJ)`DA*O$0@'rU+m`e)QL):JX*H4oPBSg=)6]C/5d-MC(jJLMTRRTTTr%af<6]XO0CUgdA]W1CWGH#k0j!rQr1/]RIr!/$>QBn)pnP$k2@oYim7hG\fVU]oCa`&L1ucFM:&tdc-[M71T\f"SC'q/6G0`4@D/:*Wi$j$Jg&BZ#_9-(Xo<[r2[]PC!e,R@rfWfPE4g]^Rq]?(XkTLL`W:7eJ>-t^-1\2t?nHZY`!h)!)C29fX=3!f>8E_3.HDp>u*ia\aJMqGD+9.^[KD?`uEXAjS9j`:Aqr7khoFM9k<&ic&p3lO+%kUlc=UF-Kq;\b=cC)R3a_D-b5nAOn6\R2d:rW-ps8I5Vn'(Kuf`9$Qk?#T3He.++oFM9k<4LZ",ti=seF4G;5kj-Yhecf>\F;iarl^dLo(QVO4J@Nqkb5kKH`6f?Hi!&8a_3LQU6D+kO4ZIA>k4h@$@2u2*\)QOLDKd\nYTrO;D1j\(njH+9D2/LHt's_UT^aI_-)BEhDc;IVJ7";p:_hR@3]s;uE.q?j/[r64Xf[hF!3^5N\l8#S6*.*]8hIRJ,**AWOr;TSGerTd!D7h&ImR*KQ'P+..]I!W&c1[/h-UGHOn%nh-1+V8su5S%`1n,mO\6?D=Y:G4VD*8Q*/IK$eD@He%\"@(N^42,cpIt_G^dr.+niUlcSqJUG2bn>0;nO;F)J=653o8`Y=@e\Yf5+o0f<:G3D@U`eqIXZ0Pm\W^J/5'R`g7b$b+sS>MqF_5$6W-gFg]&_d+V8su5S%/KdmMGF9@Kf.".5Is56.XRZ#n[i]Di?(+`QWgTni'AHT.4S:h1hWIJ)81Wmg're)%c*^HueniPUF`c^q6kdG-o2oFQ+s*YNe_?>T**at%=Ua;#++coE+h?%=,=g*J>AQB?BFNF*`!EBAYeGR;g:HtCf.U@:b^,+'oFO+h4XB[H]p:`VR>mJ\]^I!1c2H"5[e)pm"(\7fA8$\TI]YrcpPM>p@8abm+Oo$p&)D":HUqD=)Z@,)]8c&#mgpDs5sFnH:[7n%/8S%+8_YeIf&O,H\^_+Qa?3mAnK1,Lfmtf*.$gokTQXT18m@kZY'f1&.P!%&9QbK#8P+c`/]DM]"[)uT%i+<%k?7O52)Vd/q#F&hKWl(M-S95>e,9ne`@q0"cDCJoX0'FGiHDj(>4jQt9@q&n`DCJoX0'FGiHDj(>4jU]p.4H^:SXlSC&[T/\Rp1d%\dNfiKH;Vi6dN)a5GbB[MTsZ#e1;XneOO-?4cpKP[:^TGN@-VPY\m_2t:]D_rA:>$X*e+)KHKZ@@:^fLO6F2G`_^m5ca_%4s)f."9Rr+?::U\JCSN9bl\bapL_2DCKe_AiJSXjW2AGuAt3Tn!?ZHLlZ@H,4^;]X&ikC59C=:\a[4*HKXQBk4G)]Qu7k7]19895nR-q3??Tk&N&8D&/VNulR.-OO-+1dNN]bP4@H+X+\<_;ik,.$PirWKqe&98(:k`G)kbBWTPtTi`m$k6_Y-AP[rWW$q>Bd>AetAlo:KkiKS*GCsbr4kSS,@mBj6]Bq<&5@=@9Y^,d=4(J47abu'e4oE(aE6Ama;bm7L'gLH@nNu4W2"Ankph-*/-c0b0/F5i_4jDXRS./\-2F\ZU7laS+RquAKp-@na^j;^Lf7E]uM>0#lppV(R()FoQkieA+p_Tn(Q`p1.2e2S`^P-'bJ]SMHeM9k_8teA@X0bQ%YW/te!?:jgh71`senX8C):V<@f2!>#(N@b>%R@Q:P5%^"F[DQlPt7&Vnn>LMGI34g'_%<$-%AkUW/%pa(h2FhOuCB]?oYHKm!?/GcJoK;bB$pBil\K7@2#2:i@&"TBhEb.O&JWB1PUPI,]&&lm_.5ZC]@)7HYk\0[fqH)i[/iCpqq^hd6m)iLLTJ@'Q-.lAsi$?%qi5nA'dTh6P%/_6Rd+rZPesIbT-=Yhk]uBc(j[S6H:[7n%-XB%H7/rC8Ec`Ukb/i>-j=ofY4V4icd5&BTSI"?TbQ]6\_b58bB+ScT0j..cpK8/6UD;p#f%L)GBYD^-ehqWhVN-,)Um-_fUluOcpLCO6UD;p#f%Le^4h8pfj//ER49^;fh?O2Fbt-!*qW89oT7Ee)$7$t9N4uUh;tW8W?!!"Co486MesaQH70)G8Ec`Ukb5E*a@OL%ChtYrLQ\TSMTS&!ns$@8MC_4g^N(mCo4),7QkZPH7/rC8Ec`U!SG;[S=JNq@.hb>lB6sZ#g8t^$jO.OLuW@564XAcPT^$RG[A`a.F:G&V2+sBUPI,lH^KqXTm;V@cX?][iu'q%XR(M*KnkGYLRs8B&pbtDRPek;014tqXG#q#&/H$.HQZsd9pe11q@P;aaF8E]+9"Np2q+p8FQ.u?s#PXa*g5hPr8fSS(_h4Z\*Yi<^$l)WL@XMpolSSMPb(Y%?VeY[o^Kc*BbMra9nVcY6UD="CO=-=h+H)B[Rmit`f6b^^R%)U5CjjgH3jB>0JP::5H[IBf!jO76%Nk`%0fF"VC.t.mVXtD4CFk__qoc'fnaZ.)%NSH6$toI!Fn3-0Xugq"Un)l!mA4$*4WD9H/td@Qpa.2SO,g)an"h7!gc595KH?uekmf?eJ[aU^U4D(SJSIWdsP+9*J(f0BSQcpL,1_4-LpETFh-lnAD&,PpY#.6*\Z1K.1bj$jYtD8Nj16UD="(OIQRkRcQu2ap4,k@[HsZ)uKM7qIb'#G?k58e5-0cpRikD`q'BFjYpQ1gpH8QA1(>9fLJFS[-;se^-ZM&&DV"W9W]DQX6E!4S)4(q>'[JX*A@+0(b61migF?!?^LN4gb"R6b;4\o1P!UC%V&HFR#+W0mOT-OO-?#O<1D3*opsE)E!C:FiTH7L-U%;SN??K=^`u@t/[t55M$6$6OO-?#^`KM%Hhf,0Ec]JY/^BkX>IO#g^&o*r8?VTh\J[R&%ftBOMf%4IW/*p%i6URXPN\EIW2E/ZQm=p-an6^X=J.^*[j*;BW_H9"s[9`\9H:Ug'OPS@QQ$ogK/f.d.YC-2t>Q40@,'ldToWYBS+4.0h474e0`b!pbIf33;^#U8]8C$n4ZI61:\[f9\&9N[K\r&A,Q&tZ8]a?5>,jV805nD)J*k&JEG7uOVg9nL$&9N[K\d-tsrpucX^9bDk`:g(10Cn,qcpMjMGT4g42V"e3;4l6e-_Q7_1bc`&@CcA`o/8s:(4ZAGbSf*OdY8g+dlf6859%M)'Rb]?*eGHu@ddWP9MS\,ru$ZSk?!T0k`@qS&bM0TmU9&CfcK!kO$5o5%m^_KFSn*_IQK0Bs.k='oAdDd>@il;54jqAq0Ye0ZpQ05-??-@cp6lJD!foYYjZ%FB*dE4-H^7Yd,(cGHp:p]c_a+gTPo_\2SDl<'=g8q!n9nW1BKNH"?Q/cpL&/]hhoPX]e/'`pbI<*_jhEe%pZ_5:1\IkTQUS?L-)iHKlsNJ\Jt:FMeR!*p\_*&paiITpP*6VcR6%r-\*/Mg9U?dS&*AkOuq^%gbB%o[$\+gdsH\6m3_dMA%>`@un1p%8HJVcpL&/IERsad`Rgh'>pjf)sbL:'qg>8*WgZOMgB^E'fqq6dZ&I-*g5P)G'A-X-R[[IP4nTmUX>HpQH&o7oD4L[oS"=fTn`tF4\SC;#R_$Hq^!SQWNrgmbu@bGQ^!`u5"*a8HK[:mfo/3-8[uMT'btnR_]U!Bka++qDF^83gG`]p,Orl"'G)"`o/4>rjfI`.Mr)"`p:6U2/JJK>GM#j!%RUP!'o)^d;d]:=05]9:A-pQzzz!5NrHQ^9@.ZD>7MhpDl_.OrT`auh[0!!(Ug%#1RR,b'K^9hfGLIX]#YBP_BsZ!!?UPLJ.8-be>$G3HF!j>%=C5ER17<5'2#r/S_gHsETV);R0*?a^.k`P//hY06LB%;Sz!!!#W'E0*D'WDr~> +endstream +endobj +91 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 89 0 R +>> +endobj +92 0 obj +<< /Length 2261 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gatm=?Z4s_%"I`D#l:hB89L6u`n8brd)0`Z71X;A#JX138hRo6W#*t;O%&rH1g'bgZUebic6C`i79"d;6@_rGo4\7-m+5Hr5*)\$M(%GaZ1u`IMAj/Rn=^Dp%?qsMj&\]!#@Mk4^J!UrgW#fU,ZP0!fPX8?<-g8a]1?n0o&1I'8`_Bi?QIW:7.L8%PF-MF'2t?Zi>TsJWKO4I-GnoRRNi0SMe13`E<>:.'nHE6Q+\O2qJi&F(LAOtSDnd#2$fQ&qN5oL(6^1h#7[648s0"g9>]+AQ&6V1f[Q$&b_Z\tb;A9mRR%/@el!6'/=i`F95MK(2.3]m1^1S'FWI^Ld1$;YELC[+QFDSGBL\Ah+J7BF/a::/i.M@P*df$IbISjk/R!['-8=_2&2=ERqJ=:uRU)g./(ZTK7.[3j%2V"^-<[Ba5^=jh_@mP\g8\B6bbM2:CHoIOIc^@A^iR,9o=31UA1[\qcK\)E/JBkU18<@3Oac5s"\Ot\leE6F@9K0gL1fsm%7?EWiMV^?#5W0XtXY3OdiU-Xco/I5V6i5GR_b#4D7a?&HPJZ*H9frVX'aK"[(%-f9oUc/::hBG'4^g.;-l(BKhe5")r['@nAgAJEC-X)i)]>1gTc+?gL?)QQA&/TlZ*.@2K#3`_G.tX=I%!cbaV!ie^q[(YN&A=o,g'g*b^tqM=KKa9":;j0q7[CI-*?naOr.7(2gXF0Z_RU&4k\Q<)gZe.X^Ipu?dlI!Q%AZa6,'Hih"?-,WM;fpY2<%M#D&?Ockr#/M[?JiNDA^R>GBo<ce-l-aYOfIao77K@mfl7HC*6o>gWN'CnhcpR4C4,8XHU%BOuQjSX',M:M?+K'/'u3C]0Q$),<0R@6+->'&b*M78#aC%Csd^p/#n"*\#-PIBtW-EXmFk[^bRhf!17*5_A"d"44GoRWVP`#;Z^+AI;Fh#Xee^,JLH[mHf#[(C!CPW;cY%lp#*,,:(inJN7,D2f@g^Ef"b4@5*3%1/@qjB\MqIu53"'+K'*oTG3\>93dWF!J/8MIb^`/Bj9[SUhjIf\(WHs)a&/BiB%fa_C1e-O4.crkQ%[dHZ^;Lqg`,qeg2?DS_HItkLU)Ib'TVDG[>"Cg#Fp'JMh`JA6TLjQf'c@%HH)A6LQDbJq6c9&5@&C*IZ=!6colc9fXtr7A0q;,o.j\i6@e,[eR8a.Ln=TNB/V?nFJX?E^r@atiG=J7mVL*"C19^1QiQd*Ie>GAZ1H5p%E;lAi?[mcKhk/6NiV*u#sb8X+m5WUak\2k#&qdDk`G`md6W!6(i2BtR*F^32-Jj"b*=s5oqEDq$lH?=@-Y22a\1%.?-LJ#9cB!YMNbYtYJJ"f6OX6A_9Ansd_.Y^eM_>o]th\h]UFe[r;kH-fs"B(7*h"B4.$T$,^U6URd)mE4Zi2eNr%r$iQVnc#2]p0pWKU%i"&joE0? +endstream +endobj +93 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 92 0 R +>> +endobj +94 0 obj +<< /Length 2147 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gatm=gQ(#H&:NH>0`89]2N7&?j=Ne985ULD]0IHqU7cAGAg<3d-*OX'qX:7?Uh6Dpc>K(%&F^+MiUCeu30`;agq:?s=(/mreO+HmXS+U3.PQA2.ZA[^*^hR'';&Z[;2#gUc+7pDnC5ee7Gq>nZqD=N-DPCTlH(uA47!RZdGEZI!!O/Ja@_rm$$&gI:g.U9rCsqIMGdFS$Wk-)t2UbE[V+RY:X03E,EeF_A[2/jaZnd[O*e(%RQtF+]-UpW:l'/U[?So3GC40Ze+Ktm+.KOJct'=H;0A\PG`L8V&!>%3p:d5a+jSm0iJa;b6JB^`4G<l%MP692&,=,M?Yb&`re]pk\*':Z-c+0Z<3DfmFN)N;i<([fseCYDj6M^\p2;YrPgr74$6)^g*kW,N7'^s6(W*MU-<<,_Pgduo\EH"8lGd@P;kM*,LQ]7^3e%uh3,_JZ!2W.84a:&0*&kKih3At[+O:Ja.GV)GG6t7(&6+CChb1%D)7aFBAS]ia34Z)K7MJ]crp4L#Q0rqa3kjeanIT==frQf00_hl_Biskt]`;)]f&UIQT(86,DeRhV$!R10Kd&(Ko@Gn4`r9dfCqY-8UcZG]4')PpUp=&3Ion-rS\]Wh$5_()F1P?LXNp.p$)AB/ZOXQ(^[G8/i1+[,&n,^em6-%H\p?!r_H0_/np?#s_5iC:2[kaADGVBgM3H-uo7Q&;dRjmN4!/S<8[I9KFk*ES3>R'.ds""(;u"CV2ka6uZ8TFu9#d!s*jN#;OUf!SQs`'H[p,n4cqS1IrHX/Sf!&o!IPX2G8QhImWSQ$[:At"EpC@YYf"EgAZuESQu7@DuniPTp_IicL&I;6c/UE-9:!49m_Y]/knW(aTB2Q9Gn/r^MRt/<=ih"H#CP\/;VH74m\_]uX;d>ph`kHZY@/ET,^q'fi?BZ3.STHs`9WQfF/e9[f5P1g($X7.n%Vt!A,+ltc!Tt@#Q3;HsSY"P/5LCAJ_a=;[t~> +endstream +endobj +95 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 94 0 R +>> +endobj +96 0 obj +<< /Length 2976 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gat=.hiHg+&UrWP_Ut4A!?4MCAKt!]iXXTb.%8XN+*r@ng9f+r/@gqV4t"GO*f;c7N3ngngDgdoqa:pL1IH1BhN.!7+$QkDE?q9tH?U/Wp36$N1B6?&&f69RUI:@:@XVMZlf!m8MgmD2Il/Hk5Jm)RPCY->7&8K4WW'-s4t0*d/KXb@mKfe1np%/K&Js"^a;9U-91.Y5h"OP!$"A@$R]j$/IFTX]iSK*a2R_?Tp/@9[Kd'FK_0;D:*G=F60Yc(MLN475:0&0`]>rE68/)AH4[$)&^$R?/PQ,pbEE1ns:l[I'n;+Og>h79)865'q32qOEQC1"S-V<^)$FRhD":)2Ue9VWC]Oe[,=a;s(aN1T6G*2J'_>;9aieen!Sm5De$0N#V+q5WrPW#P6>iE,/+ZeCVskhXcLh"*-"4`LVB&`M`AHH:"I!M,t,dd.Vp"PWeTEZ.1jg%L$U)FMXKg;kEdXJ=5ablD:`3N+1gF@M/gg,1I5;+_+YB%fmmDOS/')@s=(HFggj]pZD=)l_&oOkcX9`$..+?2?E5!Y\=)pnZ@p/Fi?PL+O")H[9LHgKMViE`NL'B[ruHotFnbV)_U]-FU([KQc&j&r7%'g4^7Y:#^g!OZ5$)Job4sY2^V'I4m+aYOBA@b3<4+TtZ%ok:d9K>491.71jdp&>RiogY\ig`'(/\1e),p_-2Y:2u;MTc[P#,E41:C41>8E.V+lW)*#3jARp!,?8rs&rg&Uip&P/2B`RRU#"5pV@*E"TL1^#H/j[Fj0T5]4W?$nQ5f<\qbM,`&pJ]?6\g#Gcq.8)6@2"rkF:[OrUpIJ;_WNGW+[(B7V'^^'9ria_VQ$T]]\]*:fJbG)I\i.]0Fd*e4tJ*FG,6iO7f8_cE-IHa1Qrqn4mMHBi..eI2Eir/ZUtrfYU4&,^!pl`dJ;_]ZfkV)XGFpC+\8.%H0O$[kmGS9eFjQ!`)6%70\)Fh<14Oir)?Ua't4`Q)iIt0c0A%S?d6QubA@6i&97m-k/H-;XF#=^XN`Ui#0J>9KtAoc>r`Fj#;AWn,;GPhQ`T+8TA3_4"M>,89fiP55+"rCJ4/>)/*h%Y%oAHWr)CuN_u\G]++9cE3WB1P+"qk*(2P'>P6AAqVd\`K.H>K-4T#lp:7Rl&\c8`S4MjO9Gp_S`;TbR2K^Uhj6J^;GeN$eet_ED5GGa,NGh+bI@q\#YLCa`b+*DEI#s&"Y'kt'=hgLPUYb:pe7iXu&.cc3=*Z(n(Zn`Qq(1Vk##bQY\[i+@m`5/l6WN&,#>D:c+CekY1/3aGW9rK$Ql-jXi#psFW"?+;&tS'SN%XYQmgQIM^o$*e:g7pcS0d[/#^HlfSE<2qOg\4k*.l%m-a)BrI.\a2[04/N)Vm?&q2Z&$jS.G8E'^L7\s.Y2U/H/(Fd/-C4DQ:(8(=%TnhbsTT\]6$%rs6g>,VHSTW91*DUn.U1C_oQ$a`5T5&,QF!&auFtBFBXM)HZ/]'=4f/6'PDfSAD8-j$rVQ-*.W&KH]n@rS%Af[RPZVtqI/<_A2m'GPYh&`A&,%HQ/F]c)"Y#pGp$k@fFX"9?PqUMVgdh>@_aj`)cl1&X@+tM[IM'%m))[7iLZ-%&O/W[=_JKoP+oj`5[R>Ya46i62+&,l1M?e.$.9Wjk\36L;GRoZ/cYWS[oC+Z";-:]\TmUn1oZ>`OIC+%8GGu'\#hc'UjPiX*5-JC:VdkX4$(+(6X1gO\r-b1Xr4n'%F\"pl%/'c*`?&hk/m.!TUMg#pI0gsR;bj0TLt51ddQ3D1?]UFNt1Ab^n1s(0e692XR&FNMb(.nd-pa.E18^ABS]AWAp=at+==8_f'/Z2LCsMr!2BG9>GQ^WT3-:%H42>)KhCWBP2!_iC^gjg@,CO$n@RG8<99fhZ+9LVNH8Q2sF/g;F:hq@gRsUXo~> +endstream +endobj +97 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 96 0 R +>> +endobj +98 0 obj +<< /Length 1380 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gat%#;3.5*&:WMDJb!n1>o\gn_Q%O:E`/sY-2Z1AZT'*GNK.lJnZItk8_:YT';i1m23>q92AV::d<*9^ZXCnlY"_2'b\G0]b#A)rr=XDtM.S^<+cAIe['j:&o8s37d`AZ0(GtQ^Y>.t5eQ4hJ$G0p2tK;Tumb8p$mq:sTNDOS(kBf[(%a0CnnS;e,LWZD/^0;@hQ$&U6rKgt!rV5:=V,>VAEi7#X^eKN85.ff3VW5fRZ['+!JBIXHp=,X`llHVq+MN]Zl4[AMK0';'q1?_[dF1+XJZ67$WfHh:rS'!3b-Y]AL"frf^PeM3"[f.en6qP&)"WS^dU4]Gm!ttr49$:o$eCi$tf%Ri1eM::A3)kmgHQ:X2I15=>\(@\h=3'@e!,nL4C2=4p/+be]BX,:l#-8eUTb]lI$AWSJRU0e`\L'1I@ul$F6lb'S--Aol@*j]"F`E$5p^?\mj>OTbUT:B20f?3!fR%]A-B!tI"kg'1GF2D3c3mjl9R>!XW46usX1+jWH/fMbo^>L3]e([T9]M:r?B/8i>hFo;X@H;c\*c9A:;!9lkfZEabE3^Hk"Whg=It&?9`Ct"I?2CVK"e'DIY%'\^2*cl,G11^3E8:ER5:[`h=\9"0k@TtG7oQ3p<:54i]g'@A4j++,m)GRBn1!t&p_0M#Zae]co)TPdFss),_c?$=YP@L2/KjqA_-W(U`T(MlIf>%7-j*9F!e5]fVu~> +endstream +endobj +99 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 98 0 R +>> +endobj +100 0 obj +<< /Length 1026 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GasJR9omaW&;KZP("&V1'YM_(;f4/?Q/Dch2oNNX:)fYS,u1p#^E+c246)D;l=JhW1GaJB[eim=m[oXb:.\;.6.p'fE7dPZe\P`PHc3aGZ)O4X`NHEomtUZeXVXL!J>TMX,3@h2^h0]%>i"daqdZE#\-B.17?"j660G\5>@Kng#S[;4,/%c7)M[OY#/9]P.NSI?[eEVHBb/Wf1`OX;Xqm;k^Jl1Dcf1i$aXkn`;aoM?tP=O/=gflp3ec5C!P*UA2#b>uW=C\DV1K`#8'+e!GmqZKBV-PcL''7]NmkCG/&Q1&7XrbqR<54`)J-,(=[+K+N^SAEh()JehU!q;HB$I^g-oMZlC-.$Yl\%XSCWdCW6b.-T]rpaTfG(+!\CCNG-%65q"H0'\C(ZRdZ@N6/Bc`Mt.T30OC!?doA(SCTPO70I"'QgGu[k_Sr81[Vn\q;0p1u)IVqnRo7.Rop5?*=qac5SOcY(urWM-\hF\bTh9\BSgDV3-6)e(LVP)L0VF^2+k5jhs:3XgU.6YtA[dYtBiLrthMnnh3X\GP(~> +endstream +endobj +101 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 100 0 R +>> +endobj +102 0 obj +<< /Length 2258 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gat=,H]Qpk&c[>FKolJk9s@:VAP#W=^aA^p[b)qY`]Y"q+*=kX>J*M$/(/U2qskbaPW85+HYp%'K"n!k3:A$hDLF>@et73gM.;%DhVC/trJ`m[i6Rr_*cYe#]Hgnsc.;"Ca4p>K4Xa@GT%sXfP'E\0Lh=+>)<,eaL4iS#b8'-tqo?05b4eE&GdSV+0B*7MrA7aYoh)./-/g&t3q3P6g]2`:^h4.C/H2FfG&=)Ot"%8e\n?fX0H@VPC-`r!uhUPOYS!N(=o7_^AbtmMqMslUoJ^?po1[P:`jn)%FMX-V3M3lWs(=S"o+M/gsVuHREBY9)%oI;WQ:/J`r<5Aca6#CD32t&6Yh^r3V/t1\eV''=P)P+065iFDI=JbZIW7kZ9>JodRYm%JB\@ZF*_:2AYMMI,9_FW*dtElbBm^G3nHYVinC&0bURmk0MX(>:(2PEmBWBl0,>RCZ*.kE[V_jBSB:'jC>;[HD]P+JP#j^:hP/]jo="l.ERnSV'K`qX%b>E%AaI449Ll]BU:t)]Ug4K\TVZHXG24tY1914[),?5O4a#soonC,IDR`=GJc=]`&*R^T4^(U_'qB1D/[7%`L^KfFR,pbZj)AA5ir^pZ[onQi2,Cm]J#jh)b5QaC/S&"3J-MLT2nYh-3W".`_D/b-i;(.W5,`n`c-83p*TFJ-%Y7qQSXFlP>?M#s<5(0!p"&qe1AX`IBD'O.#Tf)9jHN12CVfqkD9P?p2mM\bO2c9RB#)USh*jN\sESHaM+f;LMnB)IU:5.&B6_L0NVKb[BJ,<#(D@cO)seRF"mmP?N%525,^d$UOQZ%OL%:r=r>pl%ZCRM=7(d?RMNr'H/A4G*Ea@V5ld5Bbj#D2p]nD'u/cB:fa$MAf9n$4X#4'&WD,iT8!`3*:n\%ZR7GDh'um>5!B5>4=mfhk9+uI:)7jR@D^t\]EClmY5mN)]3_U[fB,WPAZRuAhCBCULR>n.;1?#d;A^3T[4CPBX8;93UGM^'\@h:'Dg%o8g($AK>S5XXtP@6G-K@'O<[f!3=r2QheLN8Xrq8^[H%4MhV5',';l":gTVI-g!43$JT:1a*,'L](L_*4Kc>@(t]\I,,G+B;4*fq`YGZd9r<*=.?8cfD?5ES*%(IWl&`Nj%l/r^Q.XH/rAKMgbtRr\KGg.VkWT@0J^9A6^oAn%UHDKFTNAPc0afpa+(1ReIS\klf?OTG97ltP1@;gf6$s`fXX$`!]I$ahf?Q#>BX#m:r3):7DfIr@].Kcckk;..X'[U.No7l4-ZMcou>X1d[gaKe2_>noI"%=Q]F]$jS:fcXe"`i*WH6%SRPtl?Ho`O59:Xjq:!(/?X7"C^SqFa!2n9Nr?Nn%!)Qfo:E8bQu#?V/I\`8+$!>QQ5VCGNJn4mKbUp2Pb=+c'Rbt4`kZ"L!4nYQA +endstream +endobj +103 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 102 0 R +>> +endobj +104 0 obj +<< /Length 3040 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gat%&D3*F0')oV[_?b+j,hQ]#/h=mU8CC5;75!8/S/r1'K>EgdRuJu!U1@o?k^Ph2MBc9(pTS#s%*@JPE8F.SgXXiTpY!FXOLJ>/YIqjBb$TDQcX6Ih;@lb[5cMM#*>\[(hN50]WY^S_`09ebHf)M=r+E;2aXmfE4imc4N:i>uVIq.t$;s$>W79#G5_?l&%?Jlr:o!N\.o'*PiK%p"k\n)]=+Qdc;=plWn-M$g%r[USb0'nLltI#8oiLEblQ:.;_hBlId/]6g?nRi?N%oJW&&*;@=\3KfJm!'rf@V4Lhk$dDGV6KK]Eeh^pI&K]t#Uf,d#lqHRY5g]sD'oF"79bXBqHm,#.0i+=R1@rfM8d[Y:qoEO=I5YHtRYq0"S-oV"I2m+2B@"LJ-`u][UH0_]"dOmCT:3(L7;Fom,8h"/gUuCr(Rk656L(e,c2e1TBGtT%5=-,#9#R;;9NjlKuBo=6cD\4R8&g1QHjM!^Yp!F%H!15o+fJTb2*N\`2%%cB9ja4dq%CQ="EVHTC"$=uSIC$(ri:_qMaIt9BS;i9OkglsCFsPY;k;&4cB%gXtk?Os$e;D`l)'R1f)rc$7),2hO"Xki[!No(cCK83@l2o_+eO)Yp[NeX;ZDt8R3uZj[i7klC,CLipg?To]ZXsCLJIcga,rQ!j-$RXqh+VPV.8,G!Ds9GkL*DCbT'$9*a?.6NQ^nH`5Z@OXfchRS4`lH&nO*bU`uI[_4Ws(thiqk2m=j.WVpp0O\Skes]3Y6r#[:;J%FCe_R@*'[;5N:n/fd(5a(a#tBl=o<-HeYTl@r8lMB[Z^D[ie&Ar+]+1I5U1HWHI!A9>0,[JUrZrGfpsPf=cue2C<"S'eZpOg_[ZF!FEC#l5+Yof1m51Z@UFY*/.*1=lH1'[bnP3V\`E1ac[5B?_KK+lIRL4=^F&L>\@3Nj-Pok8sb,%'6fJXW_JqZ9FAp=Om;=.df;T&SF(SmnsDk39e<\&kOa8En=]!:SO\#,S%3C%V#13Y=oF1@El`aYaSZ+;?1;i0_MoBRd\(SM5faAN03I+!k'KW:X0G<`Ng`A%UUH\)M+IjSSl%a5B@%7SZB7][&V/A,*^b-8:MRS.3.FMbd7hD7_NCR=36Sl\cJ6XZH+rLaKC'N"A;b<[]FJ!P9Xf60cGXa8hf'^O%.Qmi>;SGc(3abhE@15)EV?Q:*Woo!)Makk=AdK-jO;$:6&U>@<>;-%YgMQ+DTFXAk]a;m/B6A'p\%PuX[ehnS\:\-hd:sDrE"@Qj0s7Ald>\Qjom"`o2F!@J7[a+sH\T.jcKkjpU`ipqPG>udeVcQO)n+M'J^dTS$*!%Dn'X"EF34Hb>?bmq%Q\&\nBukk'fjP'5_6)tR.U!<_*[!C;)[nWWN9bQ4R6FGZsCA]bl"8Z'*Jt0ghhTH$mn`t[<#Z/]7Md\=U,rWWsc`I3TCAO=gab]dVb)HH(b'Ak5ci-1Zjuf)erFpEb,8-bg]^k(_LC]OJ9,V;#a4K`]oIm6860Wn]RH;^*0&h1hn=3s^Agpb&F>B@[_^]_)VPB21p\R\I%=;(jMl.:""SNXq+1L(Kd%bIT/]UG"-n1"(]~> +endstream +endobj +105 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 104 0 R +>> +endobj +106 0 obj +<< /Length 252 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gas2C0b;,D&;>=W`Jlp7*%b4I1sn^hR]mZb7]BF*X-?*NmmV!p'-ju6mgaU2VNUT7!g$7`1*mA&"G,5m5lPRhN)P[#k-49p6WS?'a2N,HnMtT6dE7irl0=@YBm!5Bb?<6dFC>8l8S4,j>P$E&6n0=,0sdYjUguokne7%YTOK25c(PqL3Le^ikc%.d(crJa`am'F24Ci%hI;193_d'>HW)u>Q2:,7p)p0Ihp_Zo3thW(hiTX65 +endstream +endobj +107 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 106 0 R +>> +endobj +108 0 obj +<< /Length 2157 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GauHLhfIO1%"?N0TspkB.AIuN/G3^Pj)!OoCY$#OG.h4CO_C5D/?4pK2uW%IOd$-NZCB]n94%CE,RAi!!QZ(XPOkijnRj,-")##*ELk@2kIC$M3HLh&:)#'$Ra%DRc?XX1HqVYOaX>A40909M7rdmccH-VNZ]AoN\X$\Ll#+OPou).EXF;*/&U>W/,CRK`%F8/%$e?mm^Bu"-Kk4Xt\'=MK5nl`*"8uulC>0fp.tsm4,>1lWJQU[3Z-OP!fl8V1R,1lOUhPf6BOrZ:A^5%V5>9D@knUtXd5a(m04PaS'[u1R(@hOj?IKUFel(iEXJTQso9;EZO_i\@6d&NT7=0C^%'&&mN**U2p[k/bpl;W-U3b#1*(Oae]Z;YXD],!Z.UHpBCjgh/r+jIj"5@M/4uK]:WeHria.$4Pf!9")]1jOg&):hq5Ugi#9%:L/+0:uHFM#%]f9[;nddR'-oVJ\Qk`]6+OAh#Q(Sr::-F'9h,jOkP(18V^j'3(]c+5rVje2laYTF,.@IYBJhf?p`)ijN=eIUGD[Or!G1Sm/RsD#d:9&aE\P7>M-C%C4muF+tIh=P+",B+`uhM[]2_5g2POY\>sUI<7R$/UG1gMu9/XUp%5R%Cfpi7(D*Rne)/2,;brV?UX'&RCgl%3P?kE3gmYBKF=*m@\cFSa^Q8i=MdQiFI-Dj7*id@'t+pH#hBjrF3f:O-8G%R,_Maj,]*8%eX$[8I#)D,_dm[D'(FFGsAl2,/p8cNV2<\gNGIZX`Z/*8h(m8C*@bP_--aV9faNOMA@B0gmnL+FOCqL+h3c-+%u'RU/iE1[V+BV%i[nAV$`UH>2k#3h`Nu>OO@W7BIUL"r26XQoFO-EcLpPOtb?h)sIM/p"i#H\/?g;Rkae6gJ8_<;#]^SlKm5bd@'rqaam>*ZnK3/aJ[qk2gP9CMFm$"ML50R'$Q5&s%4te'bnT&aK"hMUPc/u-i\*C(5&T'9U/1_<1jj+Sq2cSW&9gNj%-;@XBS"5S&#;eO3bEVEC+c5rlW0lEPO2=PoD2W>eaUZIIZUIc1H2SOpk"mh8#4M1&IeXpKTQ*#O#[`"&\GQ&)-t!eTq75fB-0DeOe?BOE$hKNBel!dG\bBl484DH#[LFkfnB1rlF]Ep@eb5XH!_H\f@,DNJbDZa6>F]93eqqf7NGKp3tIt=[&pCO1OS:jkm,\X^:!!pQ1:?0]8=F]GSBNrX8H7K:DlPf6Hd2)Z9W`!4n*/H)29$%mAK0Bd4oS%f=?FmW3&!I%tZP/(p/fI&QPS<<_+c]i3@V6AAJ%7T2FZ54K.]^Nah+SD9G*A9O(2p@)SIa$'gETDHs+N\gXA@l3l$RcWhqPQ"EdR59UX$D!S'[m0.Lk,_AX4LnRR(Ig4Ejep[(IE2YrVg]`O;mR:pj8T;A,hgZ~> +endstream +endobj +109 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 108 0 R +>> +endobj +110 0 obj +<< /Length 1425 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau0D>uTK;'Re<2nFd0#)QdOQQH`X,Yd9$][`u/iD'u)(9$lR"Xt5@ihliQ;pc=NdgFZrjnPst5F3jea:\#5&_(`n%G=Nb$cS$X^mlu1@I<]fQHjdr4pU-1rV.l^,.l3ASH_J]t0_Q$LdSADNj?s;7Kp:6FYmbjUY601AVL`(G]qTqD^\D^-Eo?r\^;&#.j(ci\.?2@PGMAYZQBBk"1aUP'p:B)\#ocZ1QjbpB2-qZL1VhBrP1?JO3/WP/p/ts#V]QVa<8A1.d$d3oR]E`m@ib2e!Gom>dT(kk5+/)pb77Oj&T>=d(0LeHK<Fm!NQidiUQGLJ<"/68pE<'`Q`qU93o.!@MF&8d0\[pg"uLE3V+l'LU't[!&1)JpmLYM[r1J1KHq5Ho]/\;b1*u*h]KKSt(a\gigl_9hRCXqcV3T3R$?jln5lp*cq;#$a$PD&r@68j%_+Ko:t,;gaO.fAE#6!$4P`<:mMOZ[A#08FK=63HL/Xm^ug;g4f&e@B'4Amjk0D!Q)9QU\K)acu2P+-d543pB7$#1jHd(W,4;e2b?N8Ears,&+[<^U++\9`~> +endstream +endobj +111 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 110 0 R +>> +endobj +112 0 obj +<< /Length 2746 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gat%%h36X&%=c.-@`M:4bXEn]".S($IGhHXu^9l0fm9sV1F4PiPQZ8je3J%pG:M=rFbmeZlh2ZMI#rZ3WH+1KW@K;IK(ahMtQLM_,q!lO'S2SP)J,Pes"CaWTIpH=)9HQqsTlC*g#,Cr^@@AjtE6a%QCqK&WX?]4*nG2Xs[YG8@qiKf4p\gk]n[:>lY2VD<*nh`s:ctSU?+LQ#UeQutQLUTJ\B[dhY&2Yc))G.H)O0XesNOM]YD=3CMs&%O-U6,>PRJG@?(!N0imXP'-YV%Y'UKuk*Aq@n+PU2MBREWk((8L.u-M>eAXiF%gk@%"J5!8c4q>J'WrcJ234/PMP##!h.^\qU>gq,Dc14S_&H1>C/eI<@Z\GJem&+@I5X<^-/\'&D?/Me<%31ToT2LgUI.mMGE%DI?$B(\*Y]sJ3$7Y"UN%S$3Lc>S;d7C1O2_Ud>Y+981k)IC8B>.iW7CZ:A:A@b-r_eDog31,10h)'Afe7eKRIp%B7=B0("$14fQs:Cc>!4C1QBdM\?t^?%p0!Z$da#'1'#ZXB_34?6L0K@X1._\]A5/\Da0._2ec.?`FbOjdq41hFk,F$So'(>AK`5&9^U>rUG+pbT_l4cYf!DeWQe@iH6E?$93/k]RhI&4H4nWs("-,#u)HijH9XIa+R/sXkI11UDQrh"h_b9adHB8+]ZMq1&BtqSgV!pCGh%];3IW1*t9%UoK81pH+_H^YQ#aSn*tUCjN`#7EPM+B_C1Se]-r[!G\_13Ji"(ZkMGuS>sC!ag*d9+']&8I0F?J6tsVi`':)HZ3-\K`:V(@R^3LF=G-[?)@0VY]Zsk?7h1-NanJhQi+m';-7`Q0[Qdd9nkfG&Q,(Y^@N=Qr!j#'1K8Rq67mtbo)^Y-K#@W0/,)To\G$<&gJm.Vsme"ed2lX4=Q)iC_;=q,+.[*q3X.;Ac3J:++u3c_mQZ4Ae[D!)mruWn'WF`[["/"9nd@'e3$`4A6]G.k0W=oDi*IH=9kKb6I=]%&4/!\N8_Ic\<^T;)';E*M#7Vb"O?%=YR/kP6O0.e&>m0O4Ok8\n=:*TJ53=\SF(mHX'(-:afVJ_#-)o9:m\1P#Z3-!%`[2FF`(4pNUV=i*!A`uiBfl1#<*dZik'AZC,jCA:)_$Bsb]QP3u"n"P5V!+tuNkh@@Th45C4&[#S.;INaDUY.=[7R0Gp!T4BG/L"#_h!7E0jd'9.dC>FD7.tucdJCD-6CnOPJk=K)&`-6&>n/2b!7TKTl\b/,qin21$D6^/=VS1\RGg`4c9rR].iKfZLcC:NCj]8:WG"RAfKpdT"?)p@L[r)'i4ESf.iIbp.>SQCd0(A>d0S@h!nG1I\=i-mg50qcB3R-r2Vr%M:K=pFY`3h'*&7Cr,MEnTa@sKtF2h`.M!6a+;f=6X\YN,A8Mk8XLgY#ri?F.u+Vr>00pL=Z#HiHF4k$NWeA40-dXA"bUA39WQ"Wa;o0S_)mLh9_+\_1-AiHnURr8L]s!.Ze)J-]@!>HWO!P(>?p3c8C_VFp\g-@B!c%suL]Fjma-!loHBplGNL&%l;K1aYRa,GkKT\]i'&OE26<N-.Nnc%Hi(C<`0XK0':aNS*pM7m>/2t?C@^jCJH0J-nj7Rp$PGh(-+.W(uJj?'V\*8YF)Y$fnl&G1K_CXHp]thU5f$r^"CES2k,Og+)+Mh)-/q!;`k#(ol=CC=b2%/Gh'==]ReiE*=3j/CXDT9ZPXsO:J"ThcWl\Gi<(D=YM"C]]fs/KaSi?_\L_-,m=1=P)kH476P--;\K[k*B7>,Dk]9Lob3%$)0,abpiXS##2jJ:8F5:,;rN'$-4R!L*2Fl19juYckqJ0`2F3nh5!XA093Dn`C5WLXXLdnG=X3/o%\;ApP4S[OH'TS'0&P2fDH%85iCIWEFJ%')Wd +endstream +endobj +113 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 112 0 R +>> +endobj +114 0 obj +<< /Length 3603 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gb!"sCN%udo"0CjSj,5c6VGq@pF-XMReDj(iq4$T>o9l5];p*Vg=%:Tn(6Gf6]+75*dbsC4TkdFZbq'/L,5(O0$g\(cmT:qTN,ZcKp5gs6N1iRC2P%M"tqm=RI!?>eJh2LIr8a(9_upYUHk&IrQ&U'4,R1M7?mjf#)kf`7IsNoo]'IM"e(g^Fkg:J6LgH[Qjji8h"=>O;\.IP,[_p?Q#Gp0ja0ca4$])"N8sC5-B6l/hnjPoGY1IeFkR[Ja6gMCXr*'].g#eIEMm>Y8j([oNUco=qfa@8+@a?^hR]ED?dI,Sa%7Hbj4,]DKqTL0YS-1k$1Go#k/XWtIgiq9P%>crL@V!Ag*"8>1&4+.Z:fmqGHaQir%bk2m8M?KO!C7AgF/Dn3P)Z$\hlRX+mV-K#lH3Mo3I5pRkZ-o#+]V_^qFrGZP9]49`i%M[Jd9B!.Yk&i=4)^JFJao19j@R.0N+*B\p*7pf7*r8(l6^,Dm3=GuoUrJ]UYDYdc643k7'I^q%;7'IP&VhRTWqH>0r@:36`KfWoM*sOEdq#Mq`tuEqM03(lWY(@b^>Gu$-rG7q0b)rM_cc=p&]nMC,3u3EZo)nTY^Rgqe^c^J*>2!(RVopYTE&-n'r9H`MhZ_m?,$>\\(#@jV1G\4$`/I>"tCP=:0nc0%)$V,Xp@B-mj]s:7c.^q[rOaqf0or^fKR;dAT0b`F[3W`gN&k'%MF*,1:Ted,]-5+>+39,Hq\mm's>ja9f)B*+H]\EaN1=:lg3.T:;0;[4((PdSHbu?'1Rr5YrlpA4p-FBiIh]Z^th[W+a0.IVAT'O[&!c9m41q]VKOt..W0MAMcAHDDjIS+i6>]88Ggp)FhOgt[(&Z&5UW@?hW&YHF>UCcYNk5r1^k$i3$-l>gc%/ueR`_(B#_H`EXTeJe^WQ4C$UR@>Dr[)@Oh#Fo%alJakY+eg*r_e'--BX%Z*h^e7CGW_f8[p3j+q36tTonZ9=T8h&db++>gUSFaoFrTL,,p<:4jkc*Z]]qLqNcFBbecBpS,NJ0-,)E$5aZ#"!"aSKjK9>%J>_Ufrrd>M"K@^.,T@AK'K!Oeg5T1b5i,FS>Fcl-\#&j1p%jHH=6jJ+Bcu;ZiikmQY6BX8c_GXV:'J@o[F]%[9NHg/@nH+HHr:)`8i58t>^H@aT\o/*oo87!]0NW8;JtBer':'cpAq7\V=X5li9<^0m#R5&u6%$4LhL535im:C5d[HNR;QP1:iZ1@N)Y8LHT&p'/gWWf*=SQ!R!0.Dr-<%ENS'^!bY=L,W+"\rP]!X/&5"L/cm0F8$$b"H"b:,%i-UYGf14`=-EPF:(8;AN5k)Ong>NA5>,cSU#J(X9#[,pf`$I?O'_p1+u+lIF>O*or*H&s*T15,+-W0-Y9UN6-8`%2iMNPl0sm%*7%nqR2+)q;^V-aJdWt+(0G*'>b\`!Cs?D[#@5ZHJKQh7b]+NoE!]dRMfF\;I@RjTDhSHKj\)!=mAp.A.Fj6&\bp_Gu=^*X=jrLh%@W`q/IDI.`"[V=0iNT_m:m<3-(hgDu=#:O6k,Q2c:u03Sq43%=o*q#Xc9(GJU^uBYs6H$W!]X<[,S*Gg5nA&U>!@i_j.QWS8_CI#K-i+/o-RCb-^edFR-Zn??Hnig.AolEdL]*,d3MUeM+7tTr8nHcgeR*Ljob"*2!q3BQBX1+6W<2%\EE'j4-J5:^Nlk/\'qINMDald0u50tUt+7YR-h?4\BD[ba*;k#jiaQo7a+qmkKTo@NDg<-e3h\5%@W>0'Lgf#D43R&k7\oBK2W/.Un%,iZli)rCHa>K8D\cdoT*HCmiT^E>Po`#^i?:)OfbfnJ''3tEou"nk(Z,7kbN*C_C<6ASEKi;q0n6/g+M"@.oCg+,C_(+%QSjirVcO4r$S&ca#'K>YXAG:VlW:PCfBkj.I[.?=/olF0.Eel'sn?t['3tJk_dQC4lUS&E7X7X46lIHH%'FRk$b`g%5[ak,A8J.OB8!_Tfl[9r$0c+Z%ADZSubbH\\VAsL@_[Em(OWD4hm&tapthhU%nUYZ%@OeUm3grIZ*OGglBR,i&/aYpi?o]<%$@oG1hA&kO@[>Y2+JpR2j0,?PPA0OA=+W2J`;nKIIj#\MX9faA<%&~> +endstream +endobj +115 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 114 0 R +>> +endobj +116 0 obj +<< /Length 303 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gas1Y4`A1k&Dd:8DPTYUZP+!aUi^"=P..GY#\W0)@b!G;r;2pY#6C*VHgc@Nh7KXuDsn#9EWg4rJn5!;4TRkja9j40($H*SNbW(&NG_6>n1)t^46j9Wi(^B7.Q+q*c]Wa"e\>cj7';CdEE[hS$$AIp[[GnZ7.8a\YALiZ[a''A\AZAZ51A!i[p@FV\(5]qEIbak6Up`g]*iXbUgTXWpj(n'Z_,_::.Hf<=&9t('GLV"@39Qa4*4YrT5g,]!M'&J@To@SLso&=$N!_)CRJsU+c.C7GEF,"rQ~> +endstream +endobj +117 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 116 0 R +>> +endobj +118 0 obj +<< /Length 1403 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gat%$>Ar7S'Roe[&H%am%E"*K>G'=jl*d`f()nZVFXRrnG-oqc.k>Ih@K1b2(1g)nASVS`R*7SJq9GPQS*B/-Q:3W"9!N'@(u]-g+q]QJ&kRt",a:bBQI0dprGd"gfpHTIIQrlGW0Bh'X@75SL"b^ZlaQ8>#I?+$mp*b0S"elg)-OW6?$>LF_0t2Z9f2Vrp&i.0@gW+UD1a>CT!E"PGQrYXado361TC7sf=W]V&@0hDiE>Y1@.$*kn6s'mN&EO@\,75X'$F)ii#ADu'P_15%!Yn8U;4j?FX@P9.VYueuZ$"6@YTa+kP;4T30[j,Hc$L(0"XI+];:\e^]-t_H#HYCN.M4:qfS?lUQPH@W\VOaPUi%]R8k7*u-UUmThpi6mV(t_qo*L2.6Bq,!E,-W:$F.>'e>UC='.6/M!1V-@n\,e#1nH*U)M"V`?6^%@$p]NV$]978G;1W2s%!h89MVU]TpmInIB.lKqX'SgE=u+EFlbCmYV!F#=8@M(.WLlDdL0>`S=gB\&cg9oVL8CPo83UJkILfHbtS/Ko$S?haVO]>uBfVY"qSdfSPb]'I(_.rE1Sd&L77Q[4&jQbr4uB4Pc:#$*;^61>$m+`Fi(cN38's_*cmPfMa0Mll-j($p[u)p2P",LtV9B0Qo2mqdF>3TAXPn]C%MP.CP!_g:m*0"P1A3eDW=PF`Vo:EF$")UR8n,KhMj,I]N[94budsm%\+bTnWlJ8:\LVSm2dM;!!!?!U+$jg'#DW#%QQPPNgo@7")J!V`;Ei./V!86DsomF#9eqi*cdAZ?=fC?[k"f@qO:X%h@sp=k-)X(8pIFmX,ftI7tI;=DK["mj;tO:^".#Zrc0rcr#Wk/LJ#=F0-LkD31MjGCm[pACQC,3)>WinXO?YcN#>QT\M@O:b3OI:_\WI9:Zq`"HuEQ'eS-%+7N)a+pfs,1L,R_*Hk*^;!X^O%_m)r32$ndYG2e)US\EmSfDI_oPoDE5M=rV-RtVcEm^PjH2=Z,u=`K6m_*a5m]>YBrn7TPK%Rp[2b5&CWqfa&Jofk8]o-XJ>*[naM~> +endstream +endobj +119 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 118 0 R +>> +endobj +120 0 obj +<< /Length 2087 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gatm>?#uMo'Rf_Z@.IjS3!>mDS.!fdr[\hCY*Z1fDt5ur;):H?""&h8`#CXSKhF2F1GBIGe(:cmX!8=$0&SQ@k#,(>i(kPBXDhIoFN"!jo"7/s&qedA2`FoaYge00M!ru)Dn`0KFR#K2maQ0jN#^GmW'm3H6:EF)H1"H,-JSaYKLjnel@%R?.sRs*Ih+XhIL(;l]"-/9,SoS#`j^GL>99JG3hYh3#*c^AJXOrbK&/!0MA7\C"fK4*iIG(sYb/<_4jg5DPI6ueJZ07IH8F$%^b(383,d%nSnL)dE`2[jBQU'r3SFd*f=+D`FnsjF*i$!?B)d<-ih4\Zj'5.8s_bl3pdqBU;cXV,??L/V3;@"J"RgA6tlo*Pbd:?VCcQd$Y"+L;E>j[rBJ1h+.Wl?lt:n8FI$%lII"GeS:n_B`dmBV9oc="(K5U!+&XA7%?DZ9*2X#qR>K^=keLr-JpimNVp5;8"\t,!I;s@X#s<_1kORV;44+WLcct"nnnrJ)U8"Kpq;pi4l;f\n$tRl0_1Cf@3d*\."Ah>3-ZGqD):^T35H)OB(8N"4KhQB\ACmV4IBHVG+X)eAp1,i7BP#eU0K`E^7W0j/AN(-`^>fJG0E8V7#0@<7TZYe42Zr2#[i$ptIU-VRl:oPSW]TpmZDuDc3.j)q$-m&j-tl6R\-QB(2;l`U2@+Jrk:)`J[dM-X?,'d#/90P1hcq!Lg+5T&G)n]OI6KbAPk>F97o+/^,/qZDbISGSLo2u3EJPKmrKd>Csf=Y\MDTYZHs<:Sr:O,o8l>/A0Vhh95[0B;"6O%^iRiMr#*01TQ,8OP/1/MCRTYtet787n<.M:#qiX"m,tG"Tk4ZCm9<_7g#Ig]UR*TmWor.k,P2IIU&1S5+6Pm?T228*$$h`$?k`A7^J+a26H?omrg]c54O0co""'u&dubM\AT*18e4W[-=R)-mF1+]%>CnGP=+AT"D]q$:Dnj>Z0kT-[Webn$iGfK^Zl&^[(?t73=TT;=&&sEF=T=J=B=G!=is*kSj*B'7p*rFHnlc]#i^38V6)Vg#C7;ma+*JOT#?sDE%t~> +endstream +endobj +121 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 120 0 R +>> +endobj +122 0 obj +<< /Length 2182 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gatm>gQ(#H&:NH>&H%amNE.'-epZ'S4i4D#ps'b-H5^YOC[E%V8OIR_C=(M`PK1S9$N_pZ:u.DL(j"NTY+r#k_HKM+HV1No,]901o4R,(qm+bJ!N!P7N%@B4^V_q:f'O-oi,=Cr;r'QjIDuVfCL"@/?Mjje8d,@sXbMB7mJ"C^fqeLtjZm'`R"<.c']b=3'VD^d+A3*Wj770YPg53KJXFk!%)ffEr(@@H&WW`!jl/^/'r_O/3pf^YQRu$YEO;0-4lHC-9+\H2^D[\NsEDA2Aq:]Gt*Euple'KeZQQ4;-`tIO&0:4:ssc;.VecQ\WNNM*L@SC;cW@"U^f)Q!jIL^6_rq'5M!JL+6==5r)+;G4_@4fV@ps)qnd40c*P:g-`8Ti4E+@Dqa6\437J9$EjKcYkU[>0YHB($I&MsY;Np7hoS>=>L_&_R4],:Y@[5O"OH>JsLI`Ul<-=H@>;^-4kCr65$eHN`+G?3K>fr,*`7tlnp;lBn'7//>+^Q%g4^0UaMRR&T+u]iDl;a7=e`Tr(*fo1r/D;;$c6$jh?m302=eN^;B^$>Zp&6L=kPQ2b^&uR1bG^sc/pepG69FS57$2<9BM.^T"-M')eO=J5_"?a)q11RrV6`qg:)lGW-oZ&9^N@hF1%&Pc*a`YZDR8*NTfain;S+J=I.JXYo$C$O'S%Zp)Sa@FNiIR5:tQE)&7DMm^4:\QkqqOZ:LS0Mmf+,":jWdX)$#=O.cGh?T.*Jt:AXm%,@BnIIK5frhik@c2W-a>ns]FjLTX`^;`L.\G+()Z3Arh+E/"ib,/gjnXCWceuu.RhJ6V.W`aHu-u5"3qN.**"4"Y&#?JS[-V:cEkcM)u!;_<[>U*7s0J_^`U>+QBi"9Ooc7BXlT/t9*T>/iaDp/,a6g9%CEB`(gEj0308VB?(GQAb>\AqVKpXkS\1l.!.J:s#ThdN=U8T2NGU[Q=\?]H&nJn4$'n8D3k!<4/hKL+*JWWJ_XVg/n9`)2@\RqPXc7ATAeBo;;u)EG@g:Q!5%2N9NZMOK1Bp_9*J:$CjEjtp77lZ,k@0'go[N9VOiQ"#9Wmp+(dDSN..R^0PDZ>-1f!X$)(:P9aD/NLi=#_OQP6)0^6H/]b?,847p!5\CQ;=(P7,d%=Bc:bW9^'Z[J5Q/fW+1kghMj;._krD%s!Tg8S/R"K,=TV4sM9`Y\)=gi1RJhT,`\MplFT=T.10n!D:k'U+bf&bl>;uNSNW1]p9eAF'hi2^\+X)IIM\h<`LSsnN=MASfj<$&2-jl+kscZ*JK)@Vk"Oc:8G-1ZFp"dOpm=DbVF@_uhoVk=.b]ITCcf8-f9_=\L!Qm>E8,/B,ej]PnKMlTTD#9CeI<"@/On'-Lp#8>QL90^eCRRnoOpD2=B+$oA>((i5RCA2ctJph8)ja$.JQ>NQ+*G1?O.#cBp?0>H%-FY4V>,Wqo2^D,YN['2Y4#Ck"bt[k"NG92e9ir`NU"Mh"5r>CmU?m]T#X]W,DLPUi>+D5er.&MbV\5W8Y0EU=+m:A+rTY-C@YLe';$'qo9d;_CalIhWA?)Jnt4V]09F+HLriJ^-B-s24.b5D.)dR)6U6+&2U"-glJ)[34nfK8@9G4Tis1GS&!+MC5)W;.$/j=<<$@X)u@8#--2Q[t4G\a*7J!hC!p7>Rcj@M5H?:&rUjiDniFN&~> +endstream +endobj +123 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 122 0 R +>> +endobj +124 0 obj +<< /Length 2173 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gatm>gN)%,&:O:SE:RPc\283c`HcK=V/_u/*B34VhXOipD;Pe_>U]6e^P'KKU>Ps*OAt,K)L$WlIj?OHm'9]/DE*G_]GM>+K'o;gjn3,pe\@l@aj:QOPG_1;0mnY_/:>R]jGEV9S[;r6a&$&e^8A/bLFZqRsAk%/[KK!m7S&@rpKP%_U,JR7n^?=rpY^NO#qUW?6p*Y=+%RF,"bHC:g_*n]Ld^RW2BFFYh9+-P71o-$jFs9=:Y;,DYU

$SEd5al$V0$,WQW5SL/dhk+(_lU'GTN>"6Q]r&D=&BpKgYW_Gor^m)PVqc-to'e`Q>1sWVWns0(4F1U&pb+)hS3gcSn&@Kbbot2ikQg:BiIPTs4:uZsRniGU*[r.8UEeSC,e0etE!*8]scK<@Z-=#N6*dK#1]D0e+U<6fkOgYe\d%W@#;C+Q1f(D'mP,I2Sd)ljro-S)n7\nb=!G<>0]@c*%?nYfLC^"7,+IA&qM';UYSP/2G1q+'Hu'dl=**77U8^'U=hr.AjT\WMZ^JkOh/oKNRWZr3WJ@SG]WOY"lmkHT9^fQ_5E_I`4ddG>#F%k?>&LiL*WPRXGGA?C]L0:T[oIp\P,G&c(JJn6//sSb/DOC[\11pTOe/YYcS.-`Wfj70LaYYpqY=2.&@Ps:h"2/G2(H<.q"?-c-V,7kdDYuLM0KalDOOA:p>LVBko>8'P$6We\J:0)&@VH:Bpg>bXX%iE,#j3/IRc=\[mD+tpp'DIMj&Z5CYXjFald`:r&G+">ar*l#hfCqJHUAH?iSSKi1X+e^5E*>'L"F/0l$8O8_AgSZBVcX1f$CV)i?EKo_UrR'j-WE\Rap^%E-f_PO-?pS#k>q@,X/;Z4dk/F2GD,oJE].NkSgk$7qVQjLS/lg,E\Xq&2(O5KHO4j#+'bW`e]Z)`j_Stj8Y:_B^6\U[oShPS&/ik86,WGq-q'/^P;ibcQUX(3i@fm6:6HN_$F:4EtLCNO^5"MXWN833jEQf]Sh'S]mCH^J3+R/&]',#4"\k!eKUsSpRk?pS'Efdp;E/M(6"X!],SAY+d2K8^2Y-p1LqG<^$U%fXI2'g\dnGR*mD$^M7t*\[W+Q$h[nsD]k:3@jf`D_=K]lAh^oe;76c]Lom8qVY,;F^jCNJ^1/MT\iSKQ2Miu*35pDha^$3RZtD$ZbAWKI]#^bl\uC59$\f`TRk],]]`G-8S^mo!b-*e;Woqi>M:C$h^+2hg!]XdHKLnnlLB"$!,0PIKO=H-d:Lg((OjGLk8S=AS/*q&cjMHR12`$-:-_gei5^kM(pM#DC6\Y.s48r^%~> +endstream +endobj +125 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 124 0 R +>> +endobj +126 0 obj +<< /Length 2097 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau0F?#uMo'Rf_Z@/Q85,Vg!qJE3\Dib@+AP9ukp5MYee[BQ(e_A;WBIso9[ckT*E[a*'BfkA]omQK`>8XhYO8+4``r]1C=lQ](i'F$9e&I[g]I44"',05go5'f",aA>Kq#80@#b^qgM#cEGDR%Xd=@.kgbGkdkeH?'qIIuo<.o)9SZj:-'Y;iE]$?VOBkK3,k[]<+`(^N"$K5=%Kk/Z+#@6M.2^6;Zd]Gg1l;eG2<\8lD!GJJMlTH+O5itI*?a<6b#&8Cl^B0D"16C>(T9rW#AB_1:Jc[n*n6BP2Cd;e0Ma.W\.A'UPC\-R=?#_P=ge+b;X!kaNO[D4Gua0cp-u")9Lt=[,e4P5G.Rq19q/Nl3AO4'a*B=<&sB)UWf`3;`_u&]J@Z+%C$ZT;!B**MXI3q3WJmpp75h6]pie>:O4qm.Vi\Q.AV'r.`R)*tg5$`R3k/U'U+r6k/PU!$Bn>O)<-@_T\h,fr*!1-R&gK9N"&D40)f7fS`Id(W)b8-N!=`Iei1-4Dq30rUaa[0Tl@qI;[)#_@aD]f/2Zo^$A\69pN;t[I&$NY,^`j9M!(%f8oE.SACT,2#M%['6S7j;,([VZJEG#2V_)T]0BnOFTBb]cP;nN9iE`YXK0aY5o].sJXDUpkSB\&::/puj.?Wci4W\$1^%Hh#qTri0iZXG2*9cP1R[F7Wd,jfeD=CuBCe#STpSXsk^0_Xi)4qm-A^!?gPR\DVn-;`fL,?e0@pS%'Q]FTG".1]?hnB4#qgVnrsdoiH4CQ]R"Itj)@4tfDeqYW=([6>,Shb+8\)\o5'if?QQ]FoDu5J[)+r>@l$$Q,mg&6hD_f21,&>m.!G"<[KO]rB-@CLMImCG7Zb-lN[,/'Me7C).;K&i/H;RtBq%G<=PLB\d+3@fsVNa05]))"p$I,h^tNp"Y9@L3&Uj?Xf[YS+Z[=/CM`L+!mo3c@\VC;d12Na/A)#`:@=!Mj':lWk'i"eMQ(lg(AV3!tR!1SUDhoZEIq@N=DFmRjg'Pb:Jd&,B`]mku*dH"+@1c6pm2`Su4^Gq]b@D+3FMORf%$a.^0u)<7Q3#Wsc.tg#he@8m:Md/D(:gA4\T)Euk9k`u3)2s4q1ZW6+n"BPUH1nR4Ml#SCH:/#>eOprWPr6HP*G:>2:YH,F=?af%A&]::mX'0ie=0Hki3O)[n>FsBB$b24QF7"Ka5phrjKC_E4TYP>Ihb/]6=_Fp2J7V]]L+B.o#)?9A;aO`.`o!egKr8hcWlW$@]_nW\Ll3Q>nk'gOM")_,Uh$Dd^)"ID*O?=5:lQQqa+mKt_fu%QtQ\R)*la&N_"ePYgp#fIl@?F;F+>AnOYZ=US$k`d:;+3R>DM`&IpUFEfGDh]#J&3VNE,U*+&4E25ABiOHmG>IEV$f`%elceYGl#l,Sl[[\Vl3$OEdK-@PkYR???M&864&D;/]G>:GT.Wj[7%2U(T.@ol`NhHL1(1D9i4,\6p\%h9n4E@K)Zuud=sSnjN4M*#6kqb>2:=]aOHDO~> +endstream +endobj +127 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 126 0 R +>> +endobj +128 0 obj +<< /Length 2141 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau0E95iTD&AJ$CkZ.pZ)"F;$F/g1W8XmSrZcJsq$<^#I=_OY6Us6mcqVOrJ*ZReJUr)=AYd2b;_jU>_V5qk[p#b9&$eK[6^r/[E'As.A%Qj^Xb.gR:U_gdO>YP`,`7XuR65U%l-ZBs?dJ4@I&B-Gmm7HZ9hpYG0^'Wj2o$A_#hf,Ar#@'X9He(X5BDGL1ToKg::SpB^:57TUPeX;.%'-L<.mSlphK[\2A5+'F49SGsT+*kiKF)r4jiU*1'nnCdiK&+$2]G+@A1TMHmhmn%efU3dI_'p1TSQM<]dt:-]"D2;\J[2`hK]"Lpj+5ifVWJI[B:N/s5@G_Q(*^P@"];LioL4KltRnq=l%!<H77=ofqs-0[jbql;5J75]S!sp502jMl5*7dcY3@+4DDmuR?XK4biLnb"15&8*N53s=JD>l45_kNnRQnU"*5iYbR3>ik5b>p&hGqll2s_W2SF#008+Z+2=h8sq8o13;+Ism7d?9JC'AX%%TPTnpPL[W<4^E"+!esIn@^!DoCgGAJ'K`#Koe_#sRqi&:CnXq"4.11oLoT/T"p;)Au:LL;E_V[T%OGVMjdt`aZ_8GXWQrHq%W6hLen/,#^:tT'n_C-o!'aWWuc%E8+OZgjD&$9p!-`'QA'Oj@tek?"GflM'CXY2H]aeS_PDJp)`!0/Ymf/[1"!<"hLatg"/=X&lM43@A^:;5>JO1h%.8BjHsg^8$cm<\rdX!oX]Zi')0OsMOnE63fXm@=bu2>R(eL8C'`'N9HVM5jVH5kcgJGCLXd06.e05JjJZl%Qngpr_B5ZbH)?j;"XAOMj\]/3PVSV#VgHRq$n:&e>;&$Rc`#fI:5@*/aR\LYl$jnPk#=s>M*:G[#Ua86i]]+3"Xe2J8"R>BM-bgFB*G;U$`8q)=19BaZ[Upd)$qR"9=c6gB6Qj[JW!&K67prL'!`/,&:-/K'TGT@O$dcN/>%E"/%6?UgAq@[Lm##9WdR$rLe`nFFS^uEChjGE.)R9B"Bri_'R!i@`\`Kgg&]hUDc^Zhb0[B2]q%&$NR`NKD#+?p+I%7&16$5Bpc3_m:2K70D_G02X:\ClK[<.*0k?]_sV\qrQ:iKY98:i*`_24/"\!s@$tR^=5Q!qe"P41O-RCq#h/+)V_n0XdBl`)EaQh-k/)YrAc3U=i/q*F)ObM,_@4:TtAL$g?1/(fZm2-LIF*J^;ODLL>&9Z;ggs8af9a%EW0BP#hJ#7=q#WT)fZsC'gs;LWMm1S?q>=c.'\*>.MfNs#).!IjPO8R'9:UJ_I.'[sBlSR0hYM.ouJ[Aae,J-JOJ%gPKgG(ug6F:lF)XONOQL_+a5,XD+LD?Ys#uAW=8S7`u]mZN8QhBf9(ZhL.(]QJUd=."4@X@&atf$TY&M^Q_Whn0cKb:qNXM"dl62c'.;lN7FrX\s0cZl5Je$=k.[29"A\6RM9=Nqs^jMAXM5D8?GMaa1aEe`W8 +endstream +endobj +129 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 128 0 R +>> +endobj +130 0 obj +<< /Length 2335 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GatU6foFfF'RcUW0]m'NUl)ZqCS$\9C"!i'&gK'#,1+ul=F_/Wb9W:Es5#8AiMB8+"S-/cWH0]6Et@`9k2l=%p%I\"Q+slE,1QAb9gfUIf^R@&+$MPkP?n-8p%!-2luBa'OAbL8_'\``8!;=D&pTA:@#cIgIsOjYIJ,">+(3GR)kYa_mtPXL6G/DtUPTfWc*lF*F7W`)]"G2;D#W7,J!D"4-Ec<()HakEl"M+J(mt:]nbBY4p?2(<3NiWs[agc0=V,je(b#<3V+k-N:,M?L#g0N+MliIW3K$W7-0Ql,m[F'P>M!SY6dEAuT)aLS9f^ZfmC^_'b5l_?.jr\X$QMFP*H2-]pb*HVfpcAHY.DDW_S)%i$eucNm`FSr)@Rj/Er$:W2ji0@0RmH'Z>d<,30N9!nPM.39^WCoTV9C'uu#&jo&F042E4=AW9b6B/1d[;)m:-CUl"#]\F'BU1?d4akAP@(h=6V?rHiP'3q'&.]`5c.kW/7I\F=TW3fSeb?Qd-Kl?O=Q8B@#_,YU(Ma98iWM;[7L(]9W!qI1*N>-LK9hQE0!&"iF[NueEN>^"334^`.`RQMA(9N4W5d1f)toj$7]VN3Yl,(3Y:Ws5ZOlh=[Q47#F^fDQ;"#-a9D>r60mi(`Nb2<>"B-GB=o5QL8Qh=-CIb"Q$Lni#O_4"bb;nAH!n4XC>i8kHlQQ9U$PbM8;@HSkTX;R[!5196Rr9?4.JJS.a].4Z0p"WV8m'HL[&i[iSsAN2,#!=a!t/'M,lm@GGfhU^L"Z,J'assA3kuk[2T625BON;5eJ^=F;c[n?IraJ`kF3uG059$Q\ImY94P'9=VB"C)mmj?4ua!nnNlTXqV%a:[Q3\a.o,?&5LW58?H5b%LV1f\h]]Q?J#f$G#;VB_/NTZi7osE7%e5IHC\_$^,(58o>e.R:+)OUJ7>o*S"(HeK^0.u!/]d;Y$P\LS$c1.r'=+7R("Q@L0me[lJ./Q1*]\8>-Q?J,dBqC]e[LVgq'#LJF4<,"qgM0QSRf6$tM^3u7i_"]Ljfb2u$^phVNXVia`"$AX7$"676]-E7IJd(qu:E_E8r*BfIjAEjeX2,b+aG@i=^cB>0:>1iKWF@(;9dNgg$KW4]\%s;6Piaa\taAG*6bU)I=X_dU7029L>7CB57Nb#IUgpWr?Y3gGC``90h;sZDFht;_QJ;1@Xg`=i.*cK?CD6W;Sk:nZ3k3(u"h*(s,0)cl2>?9Gsg,5(-qg%D*).!e;l0-Y&U4/Bea']dqd'8V%OHJ_A)fg(#DI4km?'ko6KkgFCbZYN,umJR6GTkK@WEKT_"N_OrZUnoLnm-IYW33Y32G^cBk&(_uE['4UIC#Qo<7l:Sfmd"S!:aS&k"l +endstream +endobj +131 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 130 0 R +>> +endobj +132 0 obj +<< /Length 1997 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gat=-gN)%,&:O:SB_7O"/;C\(eikOkP,`Y@2e(P+e=@":6P:aZWKL4$s*_^&YTs5Udl2?,4hFh_3EW@HKNF*$lCTSRZFrTW[d8j+!m@"YqJVl'Q*\TplIW'Ij+YElKC]I*VO$C=4I]M&W#$Vt,3TGIZP(s!>p&b<8!!\&0+'Xt`J",ZTEtsej\ft7=<=#dLWNnA<\,ke/:BVUHP6K3pfQ$`eLC&K%c`\&ScXu-E,04(o$^*)!CSj7n4835K@Y,/Jg9)/rhJX2@8E?1W)tqr(Wm7K>#s\tV6GkMGcYJhA&Yru<04O=CT`WeZ5D^#l)f^%2"3!N2dgpCnuR3^hmJ8!EO^`:[gB!_i'TLYESnigM0g636o[@(:"la-ibd\hd1$c`K_e^\o_hRTR[c6TLdE%ONBk6(i=L;md#r2I8i)L\Z0Wo8Z;h^:j4aWu7gccV3&mfn.QB?uE)M8f/^A*j$IJ;JV^ZI8C5liKe<;W<`Hb0#f63PC.r9in1o.gGqI5"Q!MXb*3dO'uPp"=kMA,bLgoZSY"!\\NDB-n`_VPb;;rU')`\/DmB00lc)AJVea?;_.(D0CpSDP&kYO&ji>u-6Wrcn2@'Y6MTa(6Cu6Rir2mOPD7l0_^0=jr*-U$;V3GbZ55dO3WVZB/k+k5T!StWMrR_Gn(kS:V0m^%.^1GHs)ud-C*XR?DDr[-d5cnt(Rca'VXekW?==;U2ZddS*=%-1pc\*Dah),\:0\7@2qi$+Sa\ui^=.-fD5:dpKVWlp(:EPmlY48%,V'i\,u=H4=)$5Ss3kX7V,p188t3n0rrNJa7b#g$W"V,]Eib<]C>ZYPr0I`FI-:b[3VlobDT^Dltbg[S#^)XiRU45\d..(e'l8il'*]\O6=Q6G*Epg1K@<7QU=]2S<*c`>!Rl1CUIZZOR8eBf2WjBT#W%M=_lFRTL.~> +endstream +endobj +133 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 132 0 R +>> +endobj +136 0 obj +<< + /Title (\376\377\0\102\0\165\0\151\0\154\0\144\0\151\0\156\0\147\0\40\0\111\0\156\0\164\0\145\0\162\0\146\0\141\0\143\0\145\0\163\0\40\0\167\0\151\0\164\0\150\0\40\0\105\0\144\0\152\0\145) + /Parent 134 0 R + /Next 138 0 R + /A 135 0 R +>> endobj +138 0 obj +<< + /Title (\376\377\0\124\0\141\0\142\0\154\0\145\0\40\0\157\0\146\0\40\0\103\0\157\0\156\0\164\0\145\0\156\0\164\0\163) + /Parent 134 0 R + /Prev 136 0 R + /Next 139 0 R + /A 137 0 R +>> endobj +139 0 obj +<< + /Title (\376\377\0\103\0\150\0\141\0\160\0\164\0\145\0\162\0\240\0\61\0\56\0\240\0\105\0\144\0\152\0\145\0\40\0\117\0\166\0\145\0\162\0\166\0\151\0\145\0\167) + /Parent 134 0 R + /First 140 0 R + /Last 141 0 R + /Prev 138 0 R + /Next 142 0 R + /Count -2 + /A 15 0 R +>> endobj +140 0 obj +<< + /Title (\376\377\0\111\0\156\0\164\0\162\0\157\0\144\0\165\0\143\0\164\0\151\0\157\0\156) + /Parent 139 0 R + /Next 141 0 R + /A 17 0 R +>> endobj +141 0 obj +<< + /Title (\376\377\0\105\0\144\0\152\0\145\0\40\0\104\0\141\0\164\0\141\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\163\0\40\0\50\0\105\0\104\0\103\0\51) + /Parent 139 0 R + /Prev 140 0 R + /A 19 0 R +>> endobj +142 0 obj +<< + /Title (\376\377\0\103\0\150\0\141\0\160\0\164\0\145\0\162\0\240\0\62\0\56\0\240\0\101\0\40\0\161\0\165\0\151\0\143\0\153\0\40\0\164\0\157\0\165\0\162\0\40\0\157\0\146\0\40\0\105\0\144\0\152\0\145\0\40\0\105\0\104\0\103) + /Parent 134 0 R + /First 143 0 R + /Last 143 0 R + /Prev 139 0 R + /Next 144 0 R + /Count -1 + /A 21 0 R +>> endobj +143 0 obj +<< + /Title (\376\377\0\127\0\162\0\151\0\164\0\164\0\151\0\156\0\147\0\40\0\171\0\157\0\165\0\162\0\40\0\146\0\151\0\162\0\163\0\164\0\40\0\105\0\104\0\103) + /Parent 142 0 R + /A 23 0 R +>> endobj +144 0 obj +<< + /Title (\376\377\0\103\0\150\0\141\0\160\0\164\0\145\0\162\0\240\0\63\0\56\0\240\0\120\0\141\0\162\0\164\0\163\0\72\0\40\0\111\0\156\0\164\0\145\0\162\0\146\0\141\0\143\0\145\0\40\0\143\0\157\0\155\0\160\0\157\0\156\0\141\0\156\0\164\0\163) + /Parent 134 0 R + /Prev 142 0 R + /Next 145 0 R + /A 25 0 R +>> endobj +145 0 obj +<< + /Title (\376\377\0\103\0\150\0\141\0\160\0\164\0\145\0\162\0\240\0\64\0\56\0\240\0\105\0\144\0\152\0\145\0\40\0\114\0\141\0\171\0\157\0\165\0\164\0\54\0\40\0\106\0\151\0\154\0\154\0\163\0\40\0\141\0\156\0\144\0\40\0\120\0\157\0\163\0\151\0\164\0\151\0\157\0\156\0\151\0\156\0\147) + /Parent 134 0 R + /Prev 144 0 R + /Next 146 0 R + /A 27 0 R +>> endobj +146 0 obj +<< + /Title (\376\377\0\103\0\150\0\141\0\160\0\164\0\145\0\162\0\240\0\65\0\56\0\240\0\120\0\162\0\157\0\147\0\162\0\141\0\155\0\163\0\72\0\40\0\102\0\162\0\151\0\156\0\147\0\40\0\171\0\157\0\165\0\162\0\40\0\151\0\156\0\164\0\145\0\162\0\146\0\141\0\143\0\145\0\40\0\164\0\157\0\40\0\154\0\151\0\146\0\145) + /Parent 134 0 R + /Prev 145 0 R + /Next 147 0 R + /A 29 0 R +>> endobj +147 0 obj +<< + /Title (\376\377\0\103\0\150\0\141\0\160\0\164\0\145\0\162\0\240\0\66\0\56\0\240\0\124\0\150\0\145\0\40\0\105\0\144\0\152\0\145\0\40\0\101\0\120\0\111\0\72\0\40\0\120\0\165\0\164\0\164\0\151\0\156\0\147\0\40\0\171\0\157\0\165\0\162\0\40\0\151\0\156\0\164\0\145\0\162\0\146\0\141\0\143\0\145\0\40\0\164\0\157\0\40\0\167\0\157\0\162\0\153) + /Parent 134 0 R + /First 148 0 R + /Last 148 0 R + /Prev 146 0 R + /Next 149 0 R + /Count -1 + /A 31 0 R +>> endobj +148 0 obj +<< + /Title (\376\377\0\123\0\151\0\147\0\156\0\141\0\154\0\163\0\40\0\141\0\156\0\144\0\40\0\103\0\141\0\154\0\154\0\142\0\141\0\143\0\153\0\163) + /Parent 147 0 R + /A 33 0 R +>> endobj +149 0 obj +<< + /Title (\376\377\0\103\0\150\0\141\0\160\0\164\0\145\0\162\0\240\0\67\0\56\0\240\0\105\0\144\0\152\0\145\0\40\0\120\0\162\0\157\0\147\0\162\0\141\0\155\0\155\0\145\0\162\0\163\0\40\0\107\0\165\0\151\0\144\0\145\0\154\0\151\0\156\0\145\0\163) + /Parent 134 0 R + /First 150 0 R + /Last 152 0 R + /Prev 147 0 R + /Next 153 0 R + /Count -3 + /A 35 0 R +>> endobj +150 0 obj +<< + /Title (\376\377\0\105\0\144\0\152\0\145\0\40\0\123\0\160\0\145\0\143\0\40\0\106\0\151\0\154\0\145\0\163) + /Parent 149 0 R + /Next 151 0 R + /A 37 0 R +>> endobj +151 0 obj +<< + /Title (\376\377\0\123\0\157\0\165\0\162\0\143\0\145\0\40\0\114\0\141\0\171\0\157\0\165\0\164) + /Parent 149 0 R + /Prev 150 0 R + /Next 152 0 R + /A 39 0 R +>> endobj +152 0 obj +<< + /Title (\376\377\0\124\0\150\0\145\0\155\0\145\0\40\0\104\0\151\0\163\0\164\0\162\0\151\0\142\0\165\0\164\0\151\0\157\0\156) + /Parent 149 0 R + /Prev 151 0 R + /A 41 0 R +>> endobj +153 0 obj +<< + /Title (\376\377\0\103\0\150\0\141\0\160\0\164\0\145\0\162\0\240\0\70\0\56\0\240\0\124\0\150\0\145\0\40\0\105\0\144\0\152\0\145\0\40\0\120\0\162\0\145\0\166\0\151\0\145\0\167\0\40\0\120\0\162\0\157\0\147\0\162\0\141\0\155) + /Parent 134 0 R + /Prev 149 0 R + /Next 154 0 R + /A 43 0 R +>> endobj +154 0 obj +<< + /Title (\376\377\0\101\0\160\0\160\0\145\0\156\0\144\0\151\0\170\0\240\0\101\0\56\0\240\0\105\0\104\0\103\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145) + /Parent 134 0 R + /Prev 153 0 R + /A 45 0 R +>> endobj +155 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F3 +/BaseFont /Helvetica-Bold +/Encoding /WinAnsiEncoding >> +endobj +156 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F5 +/BaseFont /Times-Roman +/Encoding /WinAnsiEncoding >> +endobj +157 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F6 +/BaseFont /Times-Italic +/Encoding /WinAnsiEncoding >> +endobj +158 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F1 +/BaseFont /Helvetica +/Encoding /WinAnsiEncoding >> +endobj +159 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F11 +/BaseFont /Courier-Bold +/Encoding /WinAnsiEncoding >> +endobj +160 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F9 +/BaseFont /Courier +/Encoding /WinAnsiEncoding >> +endobj +161 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F7 +/BaseFont /Times-Bold +/Encoding /WinAnsiEncoding >> +endobj +1 0 obj +<< /Type /Pages +/Count 38 +/Kids [6 0 R 8 0 R 10 0 R 12 0 R 47 0 R 60 0 R 67 0 R 72 0 R 74 0 R 76 0 R 78 0 R 80 0 R 82 0 R 84 0 R 86 0 R 88 0 R 91 0 R 93 0 R 95 0 R 97 0 R 99 0 R 101 0 R 103 0 R 105 0 R 107 0 R 109 0 R 111 0 R 113 0 R 115 0 R 117 0 R 119 0 R 121 0 R 123 0 R 125 0 R 127 0 R 129 0 R 131 0 R 133 0 R ] >> +endobj +2 0 obj +<< /Type /Catalog +/Pages 1 0 R + /Outlines 134 0 R + /PageMode /UseOutlines + >> +endobj +3 0 obj +<< +/Font << /F3 155 0 R /F5 156 0 R /F1 158 0 R /F6 157 0 R /F9 160 0 R /F11 159 0 R /F7 161 0 R >> +/ProcSet [ /PDF /ImageC /Text ] /XObject <> +>> +endobj +15 0 obj +<< +/S /GoTo +/D [74 0 R /XYZ 115.0 725.0 null] +>> +endobj +17 0 obj +<< +/S /GoTo +/D [74 0 R /XYZ 115.0 687.009 null] +>> +endobj +19 0 obj +<< +/S /GoTo +/D [74 0 R /XYZ 115.0 544.683 null] +>> +endobj +21 0 obj +<< +/S /GoTo +/D [76 0 R /XYZ 115.0 725.0 null] +>> +endobj +23 0 obj +<< +/S /GoTo +/D [76 0 R /XYZ 115.0 436.009 null] +>> +endobj +25 0 obj +<< +/S /GoTo +/D [88 0 R /XYZ 115.0 725.0 null] +>> +endobj +27 0 obj +<< +/S /GoTo +/D [91 0 R /XYZ 115.0 725.0 null] +>> +endobj +29 0 obj +<< +/S /GoTo +/D [101 0 R /XYZ 115.0 725.0 null] +>> +endobj +31 0 obj +<< +/S /GoTo +/D [103 0 R /XYZ 115.0 725.0 null] +>> +endobj +33 0 obj +<< +/S /GoTo +/D [105 0 R /XYZ 115.0 497.4 null] +>> +endobj +35 0 obj +<< +/S /GoTo +/D [109 0 R /XYZ 115.0 725.0 null] +>> +endobj +37 0 obj +<< +/S /GoTo +/D [109 0 R /XYZ 115.0 562.018 null] +>> +endobj +39 0 obj +<< +/S /GoTo +/D [113 0 R /XYZ 115.0 540.12 null] +>> +endobj +41 0 obj +<< +/S /GoTo +/D [113 0 R /XYZ 115.0 430.794 null] +>> +endobj +43 0 obj +<< +/S /GoTo +/D [115 0 R /XYZ 115.0 725.0 null] +>> +endobj +45 0 obj +<< +/S /GoTo +/D [119 0 R /XYZ 115.0 725.0 null] +>> +endobj +50 0 obj +<< +/S /GoTo +/D [91 0 R /XYZ 115.0 485.018 null] +>> +endobj +52 0 obj +<< +/S /GoTo +/D [91 0 R /XYZ 115.0 108.93 null] +>> +endobj +54 0 obj +<< +/S /GoTo +/D [95 0 R /XYZ 115.0 530.0 null] +>> +endobj +56 0 obj +<< +/S /GoTo +/D [97 0 R /XYZ 115.0 359.14 null] +>> +endobj +58 0 obj +<< +/S /GoTo +/D [109 0 R /XYZ 115.0 442.692 null] +>> +endobj +63 0 obj +<< +/S /GoTo +/D [115 0 R /XYZ 115.0 362.009 null] +>> +endobj +65 0 obj +<< +/S /GoTo +/D [119 0 R /XYZ 115.0 282.329 null] +>> +endobj +70 0 obj +<< +/S /GoTo +/D [76 0 R /XYZ 115.0 371.683 null] +>> +endobj +134 0 obj +<< + /First 136 0 R + /Last 154 0 R +>> endobj +135 0 obj +<< +/S /GoTo +/D [10 0 R /XYZ 115.0 725.0 null] +>> +endobj +137 0 obj +<< +/S /GoTo +/D [12 0 R /XYZ 115.0 715.0 null] +>> +endobj +xref +0 162 +0000000000 65535 f +0000095788 00000 n +0000096122 00000 n +0000096215 00000 n +0000000015 00000 n +0000000071 00000 n +0000000407 00000 n +0000000513 00000 n +0000001246 00000 n +0000001352 00000 n +0000001513 00000 n +0000001620 00000 n +0000002675 00000 n +0000002798 00000 n +0000002930 00000 n +0000096396 00000 n +0000003066 00000 n +0000096461 00000 n +0000003202 00000 n +0000096528 00000 n +0000003338 00000 n +0000096595 00000 n +0000003474 00000 n +0000096660 00000 n +0000003610 00000 n +0000096727 00000 n +0000003746 00000 n +0000096792 00000 n +0000003882 00000 n +0000096857 00000 n +0000004018 00000 n +0000096923 00000 n +0000004154 00000 n +0000096989 00000 n +0000004290 00000 n +0000097055 00000 n +0000004426 00000 n +0000097121 00000 n +0000004562 00000 n +0000097189 00000 n +0000004697 00000 n +0000097256 00000 n +0000004833 00000 n +0000097324 00000 n +0000004969 00000 n +0000097390 00000 n +0000005105 00000 n +0000005660 00000 n +0000005783 00000 n +0000005838 00000 n +0000097456 00000 n +0000005974 00000 n +0000097523 00000 n +0000006110 00000 n +0000097589 00000 n +0000006246 00000 n +0000097654 00000 n +0000006382 00000 n +0000097720 00000 n +0000006518 00000 n +0000006946 00000 n +0000007069 00000 n +0000007103 00000 n +0000097788 00000 n +0000007239 00000 n +0000097856 00000 n +0000007375 00000 n +0000007730 00000 n +0000007853 00000 n +0000007880 00000 n +0000097924 00000 n +0000008016 00000 n +0000008238 00000 n +0000008346 00000 n +0000012129 00000 n +0000012237 00000 n +0000015313 00000 n +0000015421 00000 n +0000016476 00000 n +0000016584 00000 n +0000018078 00000 n +0000018186 00000 n +0000023267 00000 n +0000023375 00000 n +0000028505 00000 n +0000028613 00000 n +0000032126 00000 n +0000032234 00000 n +0000032631 00000 n +0000032739 00000 n +0000035384 00000 n +0000043781 00000 n +0000043889 00000 n +0000046243 00000 n +0000046351 00000 n +0000048591 00000 n +0000048699 00000 n +0000051768 00000 n +0000051876 00000 n +0000053349 00000 n +0000053457 00000 n +0000054577 00000 n +0000054687 00000 n +0000057039 00000 n +0000057149 00000 n +0000060283 00000 n +0000060393 00000 n +0000060738 00000 n +0000060848 00000 n +0000063099 00000 n +0000063209 00000 n +0000064728 00000 n +0000064838 00000 n +0000067678 00000 n +0000067788 00000 n +0000071485 00000 n +0000071595 00000 n +0000071991 00000 n +0000072101 00000 n +0000073598 00000 n +0000073708 00000 n +0000075889 00000 n +0000075999 00000 n +0000078275 00000 n +0000078385 00000 n +0000080652 00000 n +0000080762 00000 n +0000082953 00000 n +0000083063 00000 n +0000085298 00000 n +0000085408 00000 n +0000087837 00000 n +0000087947 00000 n +0000090038 00000 n +0000097991 00000 n +0000098045 00000 n +0000090148 00000 n +0000098111 00000 n +0000090405 00000 n +0000090606 00000 n +0000090889 00000 n +0000091046 00000 n +0000091288 00000 n +0000091633 00000 n +0000091838 00000 n +0000092161 00000 n +0000092524 00000 n +0000092910 00000 n +0000093372 00000 n +0000093566 00000 n +0000093932 00000 n +0000094105 00000 n +0000094282 00000 n +0000094474 00000 n +0000094779 00000 n +0000095012 00000 n +0000095126 00000 n +0000095237 00000 n +0000095349 00000 n +0000095458 00000 n +0000095571 00000 n +0000095678 00000 n +trailer +<< +/Size 162 +/Root 2 0 R +/Info 4 0 R +>> +startxref +98177 +%%EOF -- cgit v1.2.3 From a17dacd5c86ca386bfe69c809f62b65ce54087b4 Mon Sep 17 00:00:00 2001 From: Zippy Date: Sun, 27 Dec 2009 13:38:42 +0100 Subject: doofer commit Signed-off-by: Zippy --- huhu.txt.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 huhu.txt.txt diff --git a/huhu.txt.txt b/huhu.txt.txt new file mode 100644 index 0000000..e69de29 -- cgit v1.2.3 From 01cf83532d3a749a4705f763f805fc363f53a4fd Mon Sep 17 00:00:00 2001 From: Zippy Date: Sun, 27 Dec 2009 13:44:45 +0100 Subject: initial silverlight - webapp import Signed-off-by: Zippy --- src/YalpClients/WebClient/App.xaml | 8 + src/YalpClients/WebClient/App.xaml.cs | 66 +++++ src/YalpClients/WebClient/Default.aspx.cs | 22 ++ src/YalpClients/WebClient/Default.aspx.designer.cs | 70 +++++ src/YalpClients/WebClient/MainPage.xaml | 284 +++++++++++++++++++++ src/YalpClients/WebClient/MainPage.xaml.cs | 198 ++++++++++++++ .../WebClient/Properties/AppManifest.xml | 16 ++ .../WebClient/Properties/AssemblyInfo.cs | 35 +++ src/YalpClients/WebClient/VideoPlayer.csproj | 103 ++++++++ src/YalpClients/WebClient/VideoPlayer.csproj.user | 28 ++ src/YalpClients/WebClient/VideoPlayer.sln | 20 ++ 11 files changed, 850 insertions(+) create mode 100644 src/YalpClients/WebClient/App.xaml create mode 100644 src/YalpClients/WebClient/App.xaml.cs create mode 100644 src/YalpClients/WebClient/Default.aspx.cs create mode 100644 src/YalpClients/WebClient/Default.aspx.designer.cs create mode 100644 src/YalpClients/WebClient/MainPage.xaml create mode 100644 src/YalpClients/WebClient/MainPage.xaml.cs create mode 100644 src/YalpClients/WebClient/Properties/AppManifest.xml create mode 100644 src/YalpClients/WebClient/Properties/AssemblyInfo.cs create mode 100644 src/YalpClients/WebClient/VideoPlayer.csproj create mode 100644 src/YalpClients/WebClient/VideoPlayer.csproj.user create mode 100644 src/YalpClients/WebClient/VideoPlayer.sln diff --git a/src/YalpClients/WebClient/App.xaml b/src/YalpClients/WebClient/App.xaml new file mode 100644 index 0000000..48a0475 --- /dev/null +++ b/src/YalpClients/WebClient/App.xaml @@ -0,0 +1,8 @@ + + + + + diff --git a/src/YalpClients/WebClient/App.xaml.cs b/src/YalpClients/WebClient/App.xaml.cs new file mode 100644 index 0000000..2a30f24 --- /dev/null +++ b/src/YalpClients/WebClient/App.xaml.cs @@ -0,0 +1,66 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Shapes; + +namespace VideoPlayer +{ + public partial class App : Application + { + + public App() + { + this.Startup += this.Application_Startup; + this.Exit += this.Application_Exit; + this.UnhandledException += this.Application_UnhandledException; + + InitializeComponent(); + } + + private void Application_Startup(object sender, StartupEventArgs e) + { + this.RootVisual = new MainPage(); + } + + private void Application_Exit(object sender, EventArgs e) + { + + } + private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e) + { + // If the app is running outside of the debugger then report the exception using + // the browser's exception mechanism. On IE this will display it a yellow alert + // icon in the status bar and Firefox will display a script error. + if (!System.Diagnostics.Debugger.IsAttached) + { + + // NOTE: This will allow the application to continue running after an exception has been thrown + // but not handled. + // For production applications this error handling should be replaced with something that will + // report the error to the website and stop the application. + e.Handled = true; + Deployment.Current.Dispatcher.BeginInvoke(delegate { ReportErrorToDOM(e); }); + } + } + private void ReportErrorToDOM(ApplicationUnhandledExceptionEventArgs e) + { + try + { + string errorMsg = e.ExceptionObject.Message + e.ExceptionObject.StackTrace; + errorMsg = errorMsg.Replace('"', '\'').Replace("\r\n", @"\n"); + + System.Windows.Browser.HtmlPage.Window.Eval("throw new Error(\"Unhandled Error in Silverlight Application " + errorMsg + "\");"); + } + catch (Exception) + { + } + } + } +} diff --git a/src/YalpClients/WebClient/Default.aspx.cs b/src/YalpClients/WebClient/Default.aspx.cs new file mode 100644 index 0000000..0bd1d7d --- /dev/null +++ b/src/YalpClients/WebClient/Default.aspx.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; + +namespace TwitterSearchApplication.Web +{ + public partial class _Default : System.Web.UI.Page + { + protected void Page_Load(object sender, EventArgs e) + { + + } + + protected void Button1_Click(object sender, EventArgs e) + { + + } + } +} diff --git a/src/YalpClients/WebClient/Default.aspx.designer.cs b/src/YalpClients/WebClient/Default.aspx.designer.cs new file mode 100644 index 0000000..6b1c246 --- /dev/null +++ b/src/YalpClients/WebClient/Default.aspx.designer.cs @@ -0,0 +1,70 @@ +//------------------------------------------------------------------------------ +// +// Dieser Code wurde von einem Tool generiert. +// Laufzeitversion:2.0.50727.4200 +// +// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn +// der Code erneut generiert wird. +// +//------------------------------------------------------------------------------ + +namespace TwitterSearchApplication.Web { + + + public partial class _Default { + + ///

+ /// form1-Steuerelement + /// + /// + /// Automatisch generiertes Feld + /// Um dies zu ändern, verschieben Sie die Felddeklaration aus der Designerdatei in eine Code-Behind-Datei. + /// + protected global::System.Web.UI.HtmlControls.HtmlForm form1; + + /// + /// Checkbox1-Steuerelement + /// + /// + /// Automatisch generiertes Feld + /// Um dies zu ändern, verschieben Sie die Felddeklaration aus der Designerdatei in eine Code-Behind-Datei. + /// + protected global::System.Web.UI.WebControls.CheckBox Checkbox1; + + /// + /// Button1-Steuerelement + /// + /// + /// Automatisch generiertes Feld + /// Um dies zu ändern, verschieben Sie die Felddeklaration aus der Designerdatei in eine Code-Behind-Datei. + /// + protected global::System.Web.UI.WebControls.Button Button1; + + /// + /// TextBox1-Steuerelement + /// + /// + /// Automatisch generiertes Feld + /// Um dies zu ändern, verschieben Sie die Felddeklaration aus der Designerdatei in eine Code-Behind-Datei. + /// + protected global::System.Web.UI.WebControls.TextBox TextBox1; + + /// + /// TextBox2-Steuerelement + /// + /// + /// Automatisch generiertes Feld + /// Um dies zu ändern, verschieben Sie die Felddeklaration aus der Designerdatei in eine Code-Behind-Datei. + /// + protected global::System.Web.UI.WebControls.TextBox TextBox2; + + /// + /// RadioButton1-Steuerelement + /// + /// + /// Automatisch generiertes Feld + /// Um dies zu ändern, verschieben Sie die Felddeklaration aus der Designerdatei in eine Code-Behind-Datei. + /// + protected global::System.Web.UI.WebControls.RadioButton RadioButton1; + } +} diff --git a/src/YalpClients/WebClient/MainPage.xaml b/src/YalpClients/WebClient/MainPage.xaml new file mode 100644 index 0000000..462b529 --- /dev/null +++ b/src/YalpClients/WebClient/MainPage.xaml @@ -0,0 +1,284 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/YalpClients/WebClient/MainPage.xaml.cs b/src/YalpClients/WebClient/MainPage.xaml.cs new file mode 100644 index 0000000..aa392f2 --- /dev/null +++ b/src/YalpClients/WebClient/MainPage.xaml.cs @@ -0,0 +1,198 @@ +using System; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Shapes; + +namespace VideoPlayer +{ + // For best full-screen video performance, set EnableGPUAcceleration="true" on the plug-in. + // If hosting Silverlight from .aspx, add EnableGPUAcceleration="true" to the + // element. If hosting Silverlight from .html, add + // under the tag. + + public partial class MainPage : UserControl + { + // mediaElement.Position updates TimelineSlider.Value, and + // updating TimelineSlider.Value updates mediaElement.Position, + // this variable helps us break the infinite loop + private bool duringTickEvent = false; + + private bool playVideoWhenSliderDragIsOver = false; + + public MainPage() + { + InitializeComponent(); + + mediaElement.Source = new Uri("file:///D:/Test/countdown.wmv"); + //mit Datei: + //mediaElement.Source = new Uri("file:///D:/Test/countdown.wmv"); + //http://www.shoutcast.com/shoutcast_player?stationid=7806&Genre=Electronic&ContentFlag=1 + // + CompositionTarget.Rendering += new EventHandler(CompositionTarget_Rendering); + Application.Current.Host.Content.FullScreenChanged += new EventHandler(Content_FullScreenChanged); + } + + private void MediaElement_MediaOpened(object sender, RoutedEventArgs e) + { + TimeSpan duration = mediaElement.NaturalDuration.TimeSpan; + totalTimeTextBlock.Text = TimeSpanToString(duration); + UpdateVideoSize(); + } + + #region play button + + private void BigPlayButton_Click(object sender, RoutedEventArgs e) + { + playPauseButton.IsChecked = true; + PlayPauseButton_Click(sender, e); + } + + private void PlayPauseButton_Click(object sender, RoutedEventArgs e) + { + bigPlayButton.Visibility = Visibility.Collapsed; + + // this will be the toggle button state after the click has been processed + if (playPauseButton.IsChecked == true) + mediaElement.Play(); + else + mediaElement.Pause(); + } + + #endregion + + #region timelineSlider + + private void Seek(double percentComplete) + { + if (duringTickEvent) + throw new Exception("Can't call Seek() now, you'll get an infinite loop"); + + TimeSpan duration = mediaElement.NaturalDuration.TimeSpan; + int newPosition = (int)(duration.TotalSeconds * percentComplete); + mediaElement.Position = new TimeSpan(0, 0, newPosition); + + // let the next CompositionTarget.Rendering take care of updating the text blocks + } + + private Slider GetSliderParent(object sender) + { + FrameworkElement element = (FrameworkElement)sender; + do + { + element = (FrameworkElement)VisualTreeHelper.GetParent(element); + } while (!(element is Slider)); + return (Slider)element; + } + + private void LeftTrack_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) + { + e.Handled = true; + FrameworkElement lefttrack = (sender as FrameworkElement).FindName("LeftTrack") as FrameworkElement; + FrameworkElement righttrack = (sender as FrameworkElement).FindName("RightTrack") as FrameworkElement; + double position = e.GetPosition(lefttrack).X; + double width = righttrack.TransformToVisual(lefttrack).Transform(new Point(righttrack.ActualWidth, righttrack.ActualHeight)).X; + double percent = position / width; + Slider slider = GetSliderParent(sender); + slider.Value = percent; + } + + private void HorizontalThumb_DragStarted(object sender, System.Windows.Controls.Primitives.DragStartedEventArgs e) + { + if (GetSliderParent(sender) != timelineSlider) return; + + bool notPlaying = (mediaElement.CurrentState == MediaElementState.Paused + || mediaElement.CurrentState == MediaElementState.Stopped); + + if (notPlaying) + { + playVideoWhenSliderDragIsOver = false; + } + else + { + playVideoWhenSliderDragIsOver = true; + mediaElement.Pause(); + } + } + + private void HorizontalThumb_DragCompleted(object sender, System.Windows.Controls.Primitives.DragCompletedEventArgs e) + { + if (playVideoWhenSliderDragIsOver) + mediaElement.Play(); + } + + private void TimelineSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs e) + { + if (duringTickEvent) + return; + + Seek(timelineSlider.Value); + } + + #endregion + + #region updating current time + + private void CompositionTarget_Rendering(object sender, EventArgs e) + { + duringTickEvent = true; + + TimeSpan duration = mediaElement.NaturalDuration.TimeSpan; + if (duration.TotalSeconds != 0) + { + double percentComplete = (mediaElement.Position.TotalSeconds / duration.TotalSeconds); + timelineSlider.Value = percentComplete; + string text = TimeSpanToString(mediaElement.Position); + if (this.currentTimeTextBlock.Text != text) + this.currentTimeTextBlock.Text = text; + } + + duringTickEvent = false; + } + + private static string TimeSpanToString(TimeSpan time) + { + return string.Format("{0:00}:{1:00}", (time.Hours * 60) + time.Minutes, time.Seconds); + } + #endregion + + private void MuteButton_Click(object sender, RoutedEventArgs e) + { + mediaElement.IsMuted = (bool)muteButton.IsChecked; + } + + #region fullscreen mode + + private void FullScreenButton_Click(object sender, RoutedEventArgs e) + { + var content = Application.Current.Host.Content; + content.IsFullScreen = !content.IsFullScreen; + } + + private void Content_FullScreenChanged(object sender, EventArgs e) + { + UpdateVideoSize(); + } + + private void UpdateVideoSize() + { + if (App.Current.Host.Content.IsFullScreen) + { + // mediaElement takes all available space + VideoRow.Height = new GridLength(1, GridUnitType.Star); + VideoColumn.Width = new GridLength(1, GridUnitType.Star); + } + else + { + // mediaElement is only as big as the source video + VideoRow.Height = new GridLength(1, GridUnitType.Auto); + VideoColumn.Width = new GridLength(1, GridUnitType.Auto); + } + } + + #endregion + } +} \ No newline at end of file diff --git a/src/YalpClients/WebClient/Properties/AppManifest.xml b/src/YalpClients/WebClient/Properties/AppManifest.xml new file mode 100644 index 0000000..2e175fc --- /dev/null +++ b/src/YalpClients/WebClient/Properties/AppManifest.xml @@ -0,0 +1,16 @@ + + + + + + diff --git a/src/YalpClients/WebClient/Properties/AssemblyInfo.cs b/src/YalpClients/WebClient/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..a7710f2 --- /dev/null +++ b/src/YalpClients/WebClient/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("VideoPlayer")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("MSIT")] +[assembly: AssemblyProduct("VideoPlayer")] +[assembly: AssemblyCopyright("Copyright © MSIT 2009")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("35c726b0-7859-4c8e-a45c-81dc889f321e")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/src/YalpClients/WebClient/VideoPlayer.csproj b/src/YalpClients/WebClient/VideoPlayer.csproj new file mode 100644 index 0000000..5e6c3f4 --- /dev/null +++ b/src/YalpClients/WebClient/VideoPlayer.csproj @@ -0,0 +1,103 @@ + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {9254F122-1734-4DEC-9859-49C16D114EBA} + {A1591282-1198-4647-A2B1-27E5FF5F6F3B};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} + Library + Properties + VideoPlayer + VideoPlayer + v3.5 + true + + + true + true + VideoPlayer.xap + Properties\AppManifest.xml + VideoPlayer.App + TestPage.html + true + true + false + true + + + + + true + full + false + Bin\Debug + DEBUG;TRACE;SILVERLIGHT + true + true + prompt + 4 + + + pdbonly + true + Bin\Release + TRACE;SILVERLIGHT + true + true + prompt + 4 + + + + + + + + + + + + + + + + App.xaml + + + MainPage.xaml + + + + + + Designer + MSBuild:MarkupCompilePass1 + + + Designer + MSBuild:MarkupCompilePass1 + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/YalpClients/WebClient/VideoPlayer.csproj.user b/src/YalpClients/WebClient/VideoPlayer.csproj.user new file mode 100644 index 0000000..47ceb7f --- /dev/null +++ b/src/YalpClients/WebClient/VideoPlayer.csproj.user @@ -0,0 +1,28 @@ + + + + + + + + DynamicPage + True + False + False + + + + + + + + + True + + + True + + + + + \ No newline at end of file diff --git a/src/YalpClients/WebClient/VideoPlayer.sln b/src/YalpClients/WebClient/VideoPlayer.sln new file mode 100644 index 0000000..9ef3f22 --- /dev/null +++ b/src/YalpClients/WebClient/VideoPlayer.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Web Developer Express 2008 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VideoPlayer", "VideoPlayer.csproj", "{9254F122-1734-4DEC-9859-49C16D114EBA}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {9254F122-1734-4DEC-9859-49C16D114EBA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9254F122-1734-4DEC-9859-49C16D114EBA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9254F122-1734-4DEC-9859-49C16D114EBA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9254F122-1734-4DEC-9859-49C16D114EBA}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal -- cgit v1.2.3 From c62ff958823168d7622b397609220db8b67fa731 Mon Sep 17 00:00:00 2001 From: Zippy Date: Sun, 27 Dec 2009 13:46:05 +0100 Subject: revert doofer commit Signed-off-by: Zippy --- build.xml | 462 +-- client.policy | 40 +- huhu.txt.txt | 0 removed-code/Client.java | 96 +- server.policy | 16 +- src/YalpAuth/YalpPGSqlAuth/DatabaseDefines.java | 130 +- src/YalpClients/SwtClient/GUI/GUI.java | 4208 ++++++++++---------- src/YalpClients/SwtClient/GUI/InitGUI.java | 116 +- src/YalpClients/SwtClient/GUI/LoadDialog.java | 220 +- .../SwtClient/GUI/SWTResourceManager.java | 290 +- src/YalpClients/SwtClient/GUI/SortListener.java | 126 +- src/YalpClients/SwtClient/GUI/StartDialog.java | 472 +-- src/YalpClients/SwtClient/Model.java | 1518 +++---- src/YalpClients/SwtClient/SwtClient.java | 122 +- src/YalpInputs/YalpPGSqlInput/DatabaseDefines.java | 130 +- src/YalpServer/ServerControlImpl.java | 904 ++--- src/YalpServer/ServerSettings.java | 136 +- src/YalpServer/YalpServer.java | 80 +- 18 files changed, 4533 insertions(+), 4533 deletions(-) delete mode 100644 huhu.txt.txt diff --git a/build.xml b/build.xml index f38dccc..66b2b53 100644 --- a/build.xml +++ b/build.xml @@ -1,231 +1,231 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Doing all - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Doing all + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client.policy b/client.policy index 0a0cdcc..d6dfbb2 100644 --- a/client.policy +++ b/client.policy @@ -1,20 +1,20 @@ -grant { - permission java.net.SocketPermission "*:80","connect,resolve"; - permission java.util.PropertyPermission "swt.version", "read"; - permission java.util.PropertyPermission "user.dir", "read"; - permission java.util.PropertyPermission "os.name", "read"; - - permission java.util.PropertyPermission "org.eclipse.swt.internal.carbon.smallFonts", "read"; - permission java.util.PropertyPermission "org.eclipse.swt.internal.carbon.noFocusRing", "read"; - permission java.lang.RuntimePermission "loadLibrary.swt-gtk-3448", "read"; - permission java.lang.RuntimePermission "loadLibrary.swt-pi-gtk-3448", "read"; - permission java.lang.RuntimePermission "loadLibrary.swt-pi-gtk", "read"; - permission java.lang.RuntimePermission "loadLibrary.swt-pi-carbon","read"; - permission java.lang.RuntimePermission "loadLibrary.swt-pi-carbon-3139" ,"read"; - permission java.lang.RuntimePermission "loadLibrary.swt-win32-3139" ,"read"; - permission java.lang.RuntimePermission "loadLibrary.swt-carbon-3139" ,"read"; - permission java.io.FilePermission "<>","read,write,execute"; - permission java.io.FilePermission "C:\\Programme\\VideoLAN\\VLC\\vlc","execute"; - permission java.io.FilePermission "/Applications/VLC.app/Contents/MacOS/VLC","execute"; - permission java.net.SocketPermission "*:1024-","connect,resolve"; -}; +grant { + permission java.net.SocketPermission "*:80","connect,resolve"; + permission java.util.PropertyPermission "swt.version", "read"; + permission java.util.PropertyPermission "user.dir", "read"; + permission java.util.PropertyPermission "os.name", "read"; + + permission java.util.PropertyPermission "org.eclipse.swt.internal.carbon.smallFonts", "read"; + permission java.util.PropertyPermission "org.eclipse.swt.internal.carbon.noFocusRing", "read"; + permission java.lang.RuntimePermission "loadLibrary.swt-gtk-3448", "read"; + permission java.lang.RuntimePermission "loadLibrary.swt-pi-gtk-3448", "read"; + permission java.lang.RuntimePermission "loadLibrary.swt-pi-gtk", "read"; + permission java.lang.RuntimePermission "loadLibrary.swt-pi-carbon","read"; + permission java.lang.RuntimePermission "loadLibrary.swt-pi-carbon-3139" ,"read"; + permission java.lang.RuntimePermission "loadLibrary.swt-win32-3139" ,"read"; + permission java.lang.RuntimePermission "loadLibrary.swt-carbon-3139" ,"read"; + permission java.io.FilePermission "<>","read,write,execute"; + permission java.io.FilePermission "C:\\Programme\\VideoLAN\\VLC\\vlc","execute"; + permission java.io.FilePermission "/Applications/VLC.app/Contents/MacOS/VLC","execute"; + permission java.net.SocketPermission "*:1024-","connect,resolve"; +}; diff --git a/huhu.txt.txt b/huhu.txt.txt deleted file mode 100644 index e69de29..0000000 diff --git a/removed-code/Client.java b/removed-code/Client.java index a945f48..5957cf2 100755 --- a/removed-code/Client.java +++ b/removed-code/Client.java @@ -1,48 +1,48 @@ -/* - * Copyright (c) 2006 Manuel Traut and Volker Dahnke - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: Manuel Traut and Volker Dahnke - */ - -package YalpClients.SwtClient; -import YalpClients.SwtClient.GUI.*; - -import org.eclipse.swt.*; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; - -/* - * Class Client - * - * Instances Model, LoadDialog and StartDialog - * - * @author Volker Dahnke - * - * @version 1 02-04-2006
- */ - public class Client implements Runnable{ - -/* - * enables the Class to be loaded dynamicly. - * Instances Model, LoadDialog and StartDialog. - */ - - public void run () { - - LoadDialog load = new LoadDialog( - new Shell(Display.getDefault(),SWT.NONE), SWT.NONE); - - load.show(); - final Model model = new Model(); - load.close(); - - StartDialog start = - new StartDialog(new Shell(Display.getDefault(),SWT.MIN),model, SWT.NONE); - - start.show(); - } -} +/* + * Copyright (c) 2006 Manuel Traut and Volker Dahnke + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: Manuel Traut and Volker Dahnke + */ + +package YalpClients.SwtClient; +import YalpClients.SwtClient.GUI.*; + +import org.eclipse.swt.*; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Shell; + +/* + * Class Client + * + * Instances Model, LoadDialog and StartDialog + * + * @author Volker Dahnke + * + * @version 1 02-04-2006
+ */ + public class Client implements Runnable{ + +/* + * enables the Class to be loaded dynamicly. + * Instances Model, LoadDialog and StartDialog. + */ + + public void run () { + + LoadDialog load = new LoadDialog( + new Shell(Display.getDefault(),SWT.NONE), SWT.NONE); + + load.show(); + final Model model = new Model(); + load.close(); + + StartDialog start = + new StartDialog(new Shell(Display.getDefault(),SWT.MIN),model, SWT.NONE); + + start.show(); + } +} diff --git a/server.policy b/server.policy index e07e45d..5ff3c7e 100644 --- a/server.policy +++ b/server.policy @@ -1,8 +1,8 @@ -grant { - permission java.io.FilePermission "<>","execute, read, write"; - permission java.io.FilePermission "C:\\Programme\\VideoLAN\\VLC\\vlc","execute"; - permission java.io.FilePermission "/Applications/VLC.app/Contents/MacOS/VLC","execute"; - permission java.net.SocketPermission "*:1024-","connect,accept,resolve"; - permission java.util.PropertyPermission "id3.default_language", "read"; - permission java.util.PropertyPermission "id3.default_encoding", "read"; -}; +grant { + permission java.io.FilePermission "<>","execute, read, write"; + permission java.io.FilePermission "C:\\Programme\\VideoLAN\\VLC\\vlc","execute"; + permission java.io.FilePermission "/Applications/VLC.app/Contents/MacOS/VLC","execute"; + permission java.net.SocketPermission "*:1024-","connect,accept,resolve"; + permission java.util.PropertyPermission "id3.default_language", "read"; + permission java.util.PropertyPermission "id3.default_encoding", "read"; +}; diff --git a/src/YalpAuth/YalpPGSqlAuth/DatabaseDefines.java b/src/YalpAuth/YalpPGSqlAuth/DatabaseDefines.java index 5ff92c7..70c00d7 100644 --- a/src/YalpAuth/YalpPGSqlAuth/DatabaseDefines.java +++ b/src/YalpAuth/YalpPGSqlAuth/DatabaseDefines.java @@ -1,65 +1,65 @@ -/* - * Copyright (c) 2006 Manuel Traut and Volker Dahnke - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: Manuel Traut and Volker Dahnke - */ -package YalpAuth.YalpPGSqlAuth; - -/* - * Class DatabaseDefines - * - * - * - * @author Manuel Traut - * - * @version 0.1 28-08-2008
- * - */ - -public class DatabaseDefines { - - public String dbConnection="jdbc:postgresql://10.0.3.20:5432/yalp_user"; - public String dbUser="yalp"; - public String dbPasswd="huhu"; - -/* - * set string for dbConnection - * @param dbConnection - * "jdbc:postgresql://:/"; - */ - public void setDBConnection(String dbConnection){ - this.dbConnection = dbConnection; - } - -/* - * set userName for db Edit - * @param dbUser - */ - public void setDBUser(String dbUser){ - this.dbUser = dbUser; - } - -/* - * set string for db Password - * @param DBPasswd - */ - public void setDBPasswd(String DBPasswd){ - this.dbPasswd = DBPasswd; - } - - public String getDBConnection(){ - return this.dbConnection; - } - - public String getDBUser(){ - return this.dbUser; - } - - public String getDBPasswd(){ - return this.dbPasswd; - } -} +/* + * Copyright (c) 2006 Manuel Traut and Volker Dahnke + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: Manuel Traut and Volker Dahnke + */ +package YalpAuth.YalpPGSqlAuth; + +/* + * Class DatabaseDefines + * + * + * + * @author Manuel Traut + * + * @version 0.1 28-08-2008
+ * + */ + +public class DatabaseDefines { + + public String dbConnection="jdbc:postgresql://10.0.3.20:5432/yalp_user"; + public String dbUser="yalp"; + public String dbPasswd="huhu"; + +/* + * set string for dbConnection + * @param dbConnection + * "jdbc:postgresql://:/"; + */ + public void setDBConnection(String dbConnection){ + this.dbConnection = dbConnection; + } + +/* + * set userName for db Edit + * @param dbUser + */ + public void setDBUser(String dbUser){ + this.dbUser = dbUser; + } + +/* + * set string for db Password + * @param DBPasswd + */ + public void setDBPasswd(String DBPasswd){ + this.dbPasswd = DBPasswd; + } + + public String getDBConnection(){ + return this.dbConnection; + } + + public String getDBUser(){ + return this.dbUser; + } + + public String getDBPasswd(){ + return this.dbPasswd; + } +} diff --git a/src/YalpClients/SwtClient/GUI/GUI.java b/src/YalpClients/SwtClient/GUI/GUI.java index 475f09b..ab9db71 100644 --- a/src/YalpClients/SwtClient/GUI/GUI.java +++ b/src/YalpClients/SwtClient/GUI/GUI.java @@ -1,2104 +1,2104 @@ -/* - * Copyright (c) 2006 Manuel Traut and Volker Dahnke - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: Manuel Traut and Volker Dahnke - */ - -package YalpClients.SwtClient.GUI; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.custom.*; -import org.eclipse.swt.graphics.*; -import org.eclipse.swt.layout.*; -import org.eclipse.swt.widgets.*; -import org.eclipse.swt.events.*; -import java.util.*; - -import YalpInterfaces.*; -import YalpClients.SwtClient.*; - -/* - * - * Class GUI - * - * - * - * @author Volker Dahnke / Manuel Traut - * - * @version 1 02-04-2006
- * - */ -public class GUI extends org.eclipse.swt.widgets.Composite { - - public Model model; - public Composite resultComposite; - public Composite playlistComposite; - public Composite bottemComposite; - public Table resultTable1; - public Table resultTable2; - public Composite composite1; - public Composite changeComposite; - public Table UserTable; - public Composite composite3; - - private AccessRights userKind; - private StyledText styledText1; - private CTabFolder cTabFolder1; - private CTabItem tab1; - private Composite container1; - private Composite topComposite; - private Group find; - private Group logo; - private CTabItem tab2; - private Composite container2; - private Group group1; - private Group group2; - private CLabel authorLabel; - private CLabel titleLabel; - private CLabel streamLabel2; - private CLabel actualStreamLabel2; - private CLabel actualStreamLabel1; - private CLabel streamLabel1; - private CLabel data2; - private CLabel data1; - private Button shutdown; - private TableColumn ip; - private TableColumn userName; - public Table iptable; - private Composite composite4; - - private Button submitButton; - private CLabel adminAddLabel; - private CLabel passwdAddLable; - private CLabel usernameAddLable; - private CLabel realnameAddLabel; - private CCombo adminAdd; - private Text realnameAdd; - private Text passwdAdd; - private Text usernameAdd; - private Group tab3group5; - private Button next; - private Button stop; - private Button play; - private CLabel cLabel2; - private Button save; - private Text userTableId; - private Text passwd; - private Text username; - private Text userTableName; - private CLabel adminLabel; - private CCombo adminCombo; - private CLabel nameLable; - private CLabel passwdLable; - private CLabel usernameLable; - private CLabel idLable; - private Group tab3group4; - private Button delete; - private Button add1; - private Group tab3Group3; - private Group tab3Group2; - private Group tab3Group1; - private Composite container3; - private Button deleteButton; - private Button addButton; - private StyledText status; - private Button saveButton; - private Text id; - private CLabel idLabel; - private CLabel cLabel1; - private CLabel nameLabel; - private CLabel pathLabel; - private CLabel lastEditLable; - private CLabel ownerIdLabel; - private CLabel resolutionLabel; - private CLabel vBitrateLabel; - private CLabel aBitrateLabel; - private CLabel durationLabel; - private CLabel yearLabel; - private CLabel categoryLabel; - private CLabel albumLabel; - private CCombo type; - private Text name; - private Text path; - private Text lastEdit; - private Text ownerId; - private Text resolution; - private Text vBitrate; - private Text aBitrate; - private Text duration; - private Text year; - private Text category; - private Text album; - private Text author; - private Text title; - private Composite composite2; - private Table playlistTable; - private Button add2; - private Button del; - private Boolean isNotPlaying=true; - private Boolean paused =true; - private CTabItem tab3; - private Composite parent; - private Display display; - final Image pauseImage=new Image(this.getDisplay(),"img/pause.gif"); - final Image playImage=new Image(this.getDisplay(),"img/play.gif"); - final Image forwardImage=new Image(this.getDisplay(),"img/forward.gif"); - { - //Register as a resource user - SWTResourceManager will - //handle the obtaining and disposing of resources - SWTResourceManager.registerResourceUser(this); - } - - public GUI( Composite parent, Display display, Model model, - AccessRights userKind, int style ) { - - super(parent, style); - - this.parent = parent; - this.display = display; - this.model = model; - this.userKind = userKind; - - initGUI(); - } - - private void initGUI() { - try { - this.setSize(800, 600); - this.setBackground(SWTResourceManager.getColor(192, 192, 192)); - GridLayout thisLayout = new GridLayout(1, true); - thisLayout.marginWidth = 5; - thisLayout.marginHeight = 5; - thisLayout.numColumns = 1; - thisLayout.makeColumnsEqualWidth = true; - thisLayout.horizontalSpacing = 5; - thisLayout.verticalSpacing = 5; - this.setLayout(thisLayout); - - { - if (this.userKind.value() == AccessRights._USER){ - cTabFolder1 = new CTabFolder(this, SWT.NONE); - GridData cTabFolder1LData = new GridData(); - cTabFolder1LData.widthHint = 787; - cTabFolder1LData.heightHint = 568; - cTabFolder1.setLayoutData(cTabFolder1LData); - { - tab1 = new CTabItem(cTabFolder1,SWT.NONE); - tab1.setText("Find"); - { - container1 = new Composite(cTabFolder1,SWT.NONE); - tab1.setControl(container1); - RowLayout container1Layout = new RowLayout(org.eclipse.swt.SWT.HORIZONTAL); - container1.setLayout(container1Layout); - { - topComposite = new Composite(container1,SWT.NONE); - GridLayout topCompositeLayout = new GridLayout(); - topCompositeLayout.makeColumnsEqualWidth = true; - topCompositeLayout.numColumns = 2; - topCompositeLayout.verticalSpacing = 2; - topCompositeLayout.horizontalSpacing = 5; - topComposite.setLayout(topCompositeLayout); - RowData topCompositeLData = new RowData(); - topCompositeLData.width = 783; - topCompositeLData.height = 566; - topComposite.setLayoutData(topCompositeLData); - { - find = new Group(topComposite,SWT.NONE); - this.find(find,resultComposite,playlistComposite,bottemComposite,1); - } - { - logo = new Group(topComposite,SWT.NONE); - this.logo(logo); - } - { - resultComposite = new Composite(topComposite,SWT.NONE); - resultTable1 = new Table(resultComposite,SWT.MULTI|SWT.FULL_SELECTION); - resultTable1.setToolTipText("Medias"); - resultTable1.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent evt) { - add2.setEnabled(true); - } - }); - this.resultTable(resultComposite,resultTable1,1); - } - { - playlistComposite = new Composite(topComposite,SWT.NONE); - FormLayout playlistCompositeLayout = new FormLayout(); - playlistComposite.setLayout(playlistCompositeLayout); - GridData playlistCompositeLData = new GridData(); - playlistCompositeLData.heightHint = 390; - playlistCompositeLData.horizontalAlignment = GridData.FILL; - playlistComposite.setLayoutData(playlistCompositeLData); - playlistComposite.setVisible(false); - playlistComposite.setSize(238, 390); - { - next = new Button(playlistComposite,SWT.PUSH | SWT.CENTER); - FormData nextLData = new FormData(); - nextLData.width = 45; - nextLData.height = 21; - nextLData.left = new FormAttachment(0, 1000, 185); - nextLData.top = new FormAttachment(0, 1000, 365); - next.setLayoutData(nextLData); - next.setEnabled(false); - next.setFont(SWTResourceManager.getFont("Times", 8, 1, false, false)); - next.setToolTipText("play next Title"); - next.setImage(forwardImage); - next.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent evt) { - model.next(); - } - }); - } - { - stop = new Button(playlistComposite,SWT.PUSH | SWT.CENTER); - FormData stopLData = new FormData(); - stopLData.width = 35; - stopLData.height = 21; - stopLData.left = new FormAttachment(0, 1000, 91); - stopLData.top = new FormAttachment(0, 1000, 365); - stop.setLayoutData(stopLData); - stop.setImage(new Image(this.getDisplay(),"img/stop.gif")); - stop.setEnabled(false); - stop.setToolTipText("stop"); - stop.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent evt) { - if (model.stop()){ - play.setEnabled(true); - next.setEnabled(false); - stop.setEnabled(false); - play.setImage(playImage); - play.setToolTipText("play"); - isNotPlaying=true; - } - - } - }); - } - { - play = new Button(playlistComposite,SWT.PUSH | SWT.CENTER); - FormData playLData = new FormData(); - playLData.width = 35; - playLData.height = 21; - playLData.left = new FormAttachment(0, 1000, 50); - playLData.top = new FormAttachment(0, 1000, 365); - play.setLayoutData(playLData); - play.setImage(playImage); - play.setEnabled(false); - play.setToolTipText("play"); - play.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent evt) { - stop.setEnabled(true); - if (playlistTable.getItemCount()>1)next.setEnabled(true); - del.setEnabled(false); - //add2.setEnabled(false); - if (isNotPlaying){ - play.setCursor(SWTResourceManager.getCursor(SWT.CURSOR_WAIT)); - if(model.play()){ - play.setImage(pauseImage); - play.setToolTipText("pause"); - play.setCursor(SWTResourceManager.getCursor(SWT.NONE)); - isNotPlaying= false; - }else; - }else{ - if(model.pause()){ - if (paused){ - play.setImage(playImage); - play.setToolTipText("play"); - paused=false; - }else{ - play.setImage(pauseImage); - play.setToolTipText("pause"); - paused=true; - } - }else; - } - - } - }); - } - { - add2 = new Button(playlistComposite,SWT.PUSH | SWT.CENTER); - FormData addLData = new FormData(); - addLData.width = 25; - addLData.height = 21; - addLData.left = new FormAttachment(0, 1000, 2); - addLData.top = new FormAttachment(0, 1000, 160); - add2.setLayoutData(addLData); - add2.setText(">>"); - add2.setEnabled(false); - add2.setToolTipText("add to Playlist"); - add2.setFont(SWTResourceManager.getFont("Times", 8, 1, false, false)); - add2.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent evt) { - if (System.getProperty("os.name")== "Mac OS X"){ - for (int i=resultTable1.getSelectionCount()-1;i>=0;i--){ - int id=new Integer(resultTable1.getSelection()[i].getText(0)).intValue(); - System.out.println(resultTable1.getSelection()[i].getText(1)); - model.add2PlayList(id); - } - }else{ - for (int i=0;i playlist=model.getToPlaylist(); - for(int i=0;i1&& !isNotPlaying)next.setEnabled(true); - } - }); - } - { - del = new Button(playlistComposite,SWT.PUSH | SWT.CENTER); - FormData delLData = new FormData(); - delLData.width = 25; - delLData.height = 21; - delLData.left = new FormAttachment(0, 1000, 2); - delLData.top = new FormAttachment(0, 1000, 200); - del.setLayoutData(delLData); - del.setEnabled(false); - del.setToolTipText("del from Playlist"); - del.setText("<<"); - del.setFont(SWTResourceManager.getFont("Times", 8, 1, false, false)); - del.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent evt) { - for (int i=playlistTable.getSelectionCount()-1;i>=0;i--){ - int pos = playlistTable.getSelectionIndices()[i]; - model.removeFromPlayList(pos); - } - - del.setEnabled(false); - while(playlistTable.getItemCount()!=0){ - playlistTable.remove(0); - } - ArrayList playlist=model.getToPlaylist(); - for(int i=0;i resultList = model.getUser(); - for (int i = 0; i < resultList.size(); i++) { - TableItem item; - YalpUser result = resultList.get(i); - item = new TableItem(UserTable,SWT.NONE); - item.setText(0,new Integer(result.id).toString()); - item.setText(1,result.name); - // item.setText(2,result.password); - item.setText(3,result.realName); - item.setText(4,model.accessRightsName(result.level)); - } - tab3group4.setVisible(false); - } - }); - } - { - add1 = new Button(tab3Group3,SWT.PUSH | SWT.CENTER); - add1.setText("Add"); - FormData addLData = new FormData(); - addLData.width = 45; - addLData.height = 21; - addLData.left = new FormAttachment(0, 1000, 7); - addLData.top = new FormAttachment(0, 1000, 254); - add1.setLayoutData(addLData); - add1.setToolTipText("add new User "); - add1.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent evt) { - tab3group5.setVisible(true); - } - }); - } - { - UserTable = new Table(tab3Group3,SWT.SINGLE|SWT.FULL_SELECTION); - FormData UserTableLData = new FormData(); - UserTableLData.width = 467; - UserTableLData.height = 224; - UserTableLData.left = new FormAttachment(11, 1000, 0); - UserTableLData.right = new FormAttachment(988, 1000, 0); - UserTableLData.top = new FormAttachment(19, 1000, 0); - UserTableLData.bottom = new FormAttachment(864, 1000, 0); - UserTable.setLayoutData(UserTableLData); - UserTable.setHeaderVisible(true); - UserTable.setToolTipText("registrated User"); - UserTable.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent evt) { - userTableId.setText(UserTable.getSelection()[0].getText(0)); - username.setText(UserTable.getSelection()[0].getText(1)); - passwd.setText(UserTable.getSelection()[0].getText(2)); - userTableName.setText(UserTable.getSelection()[0].getText(3)); - adminCombo.setText(UserTable.getSelection()[0].getText(4)); - tab3group4.setVisible(true); - } - }); - { - TableColumn id = new TableColumn(UserTable,SWT.BEGINNING); - id.setText("ID"); - id.setWidth(45); - id.setMoveable(true); - id.addListener(SWT.Selection, new SortListener(this,UserTable,0,5)); - TableColumn userName = new TableColumn(UserTable,SWT.BEGINNING); - userName.setMoveable(true); - userName.setText("Username"); - userName.setWidth(120); - userName.addListener(SWT.Selection, new SortListener(this,UserTable,1,5)); - TableColumn passwd = new TableColumn(UserTable,SWT.BEGINNING); - passwd.setMoveable(true); - passwd.setText("Password"); - passwd.setWidth(120); - passwd.addListener(SWT.Selection, new SortListener(this,UserTable,2,5)); - TableColumn name = new TableColumn(UserTable,SWT.BEGINNING); - name.setMoveable(true); - name.setText("Name"); - name.setWidth(130); - name.addListener(SWT.Selection, new SortListener(this,UserTable,3,5)); - TableColumn admin = new TableColumn(UserTable,SWT.BEGINNING); - admin.setMoveable(true); - admin.setText("Admin"); - admin.setWidth(74); - admin.addListener(SWT.Selection, new SortListener(this,UserTable,4,5)); - //TableColumn huhu=new TableColumn(UserTable,SWT.BEGINNING); - //huhu.dispose(); - ArrayList resultList = model.getUser(); - for (int i = 0; i < resultList.size(); i++) { - TableItem item; - YalpUser result = resultList.get(i); - item = new TableItem(UserTable,SWT.NONE); - item.setText(0,new Integer(result.id).toString()); - item.setText(1,result.name); - //item.setText(2,result.passwd); - item.setText(3,result.realName); - item.setText(4,model.accessRightsName(result.level)); - } - } - } - } - { - tab3group4 = new Group(container3,SWT.NONE); - FormLayout tab3group4Layout = new FormLayout(); - tab3group4.setLayout(tab3group4Layout); - tab3group4.setText("Edit User"); - GridData tab3group4LData = new GridData(); - tab3group4LData.widthHint = 256; - tab3group4LData.heightHint = 284; - tab3group4.setLayoutData(tab3group4LData); - tab3group4.setVisible(false); - { - save = new Button(tab3group4,SWT.PUSH | SWT.CENTER); - save.setText("save"); - FormData saveLData = new FormData(); - saveLData.width = 45; - saveLData.height = 21; - saveLData.left = new FormAttachment(0, 1000, 42); - saveLData.top = new FormAttachment(0, 1000, 157); - save.setLayoutData(saveLData); - save.setToolTipText("save Changes"); - save.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent evt) { - YalpUser toChange = new YalpUser(); - toChange.id = new Integer(userTableId.getText()).intValue(); - toChange.name = username.getText(); - model.changeUser(toChange, passwd.getText(), Action.EDIT); - while(UserTable.getItemCount()!=0){ - UserTable.remove(0); - } - ArrayList resultList = model.getUser(); - for (int i = 0; i < resultList.size(); i++) { - TableItem item; - YalpUser result = resultList.get(i); - item = new TableItem(UserTable,SWT.NONE); - item.setText(0,new Integer(result.id).toString()); - item.setText(1,result.name); - //item.setText(2,result.passwd); - item.setText(3,result.realName); - item.setText(4,model.accessRightsName(result.level)); - } - tab3group4.setVisible(false); - } - }); - } - { - userTableName = new Text(tab3group4,SWT.NONE); - FormData text2LData = new FormData(); - text2LData.width = 94; - text2LData.height = 14; - text2LData.left = new FormAttachment(0, 1000, 117); - text2LData.top = new FormAttachment(0, 1000, 112); - userTableName .setLayoutData(text2LData); - } - { - passwd = new Text(tab3group4,SWT.NONE); - FormData passwdLData = new FormData(); - passwdLData.width = 94; - passwdLData.height = 14; - passwdLData.left = new FormAttachment(0, 1000, 117); - passwdLData.top = new FormAttachment(0, 1000, 92); - passwd.setLayoutData(passwdLData); - } - { - username = new Text(tab3group4,SWT.NONE); - FormData usernameLData = new FormData(); - usernameLData.width = 94; - usernameLData.height = 14; - usernameLData.left = new FormAttachment(0, 1000, 117); - usernameLData.top = new FormAttachment(0, 1000, 72); - username.setLayoutData(usernameLData); - } - { - userTableId = new Text(tab3group4,SWT.NONE); - FormData text1LData = new FormData(); - text1LData.width = 94; - text1LData.height = 14; - text1LData.left = new FormAttachment(0, 1000, 117); - text1LData.top = new FormAttachment(0, 1000, 52); - userTableId.setLayoutData(text1LData); - userTableId.setEditable(false); - } - { - adminLabel = new CLabel(tab3group4,SWT.NONE); - adminLabel.setText("Admin:"); - FormData adminLabelLData = new FormData(); - adminLabelLData.width = 42; - adminLabelLData.height = 21; - adminLabelLData.left = new FormAttachment(0, 1000, 27); - adminLabelLData.top = new FormAttachment(0, 1000, 127); - adminLabel.setLayoutData(adminLabelLData); - } - { - idLable = new CLabel(tab3group4,SWT.NONE); - idLable.setText("Id:"); - FormData idLableLData = new FormData(); - idLableLData.width = 20; - idLableLData.height = 21; - idLableLData.left = new FormAttachment(107, 1000, 0); - idLableLData.right = new FormAttachment(185, 1000, 0); - idLableLData.top = new FormAttachment(167, 1000, 0); - idLableLData.bottom = new FormAttachment(241, 1000, 0); - idLable.setLayoutData(idLableLData); - } - { - usernameLable = new CLabel(tab3group4,SWT.NONE); - usernameLable.setText("Username:"); - FormData usernameLableLData = new FormData(); - usernameLableLData.width = 58; - usernameLableLData.height = 21; - usernameLableLData.left = new FormAttachment(107, 1000, 0); - usernameLableLData.right = new FormAttachment(333, 1000, 0); - usernameLableLData.top = new FormAttachment(237, 1000, 0); - usernameLableLData.bottom = new FormAttachment(311, 1000, 0); - usernameLable.setLayoutData(usernameLableLData); - } - { - passwdLable = new CLabel(tab3group4,SWT.NONE); - passwdLable.setText("Password:"); - FormData passwdLableLData = new FormData(); - passwdLableLData.width = 56; - passwdLableLData.height = 21; - passwdLableLData.left = new FormAttachment(107, 1000, 0); - passwdLableLData.right = new FormAttachment(326, 1000, 0); - passwdLableLData.top = new FormAttachment(308, 1000, 0); - passwdLableLData.bottom = new FormAttachment(382, 1000, 0); - passwdLable.setLayoutData(passwdLableLData); - } - { - nameLable = new CLabel(tab3group4,SWT.NONE); - nameLable.setText("Name:"); - FormData nameLableLData = new FormData(); - nameLableLData.width = 37; - nameLableLData.height = 21; - nameLableLData.left = new FormAttachment(107, 1000, 0); - nameLableLData.right = new FormAttachment(251, 1000, 0); - nameLableLData.top = new FormAttachment(378, 1000, 0); - nameLableLData.bottom = new FormAttachment(452, 1000, 0); - nameLable.setLayoutData(nameLableLData); - } - { - adminCombo = new CCombo(tab3group4,SWT.NONE); - FormData adminComboLData = new FormData(); - adminComboLData.width = 81; - adminComboLData.height = 16; - adminComboLData.left = new FormAttachment(458, 1000, 0); - adminComboLData.right = new FormAttachment(849, 1000, 0); - adminComboLData.top = new FormAttachment(466, 1000, 0); - adminComboLData.bottom = new FormAttachment(522, 1000, 0); - adminCombo.setLayoutData(adminComboLData); - { - adminCombo.add("true"); - adminCombo.add("false"); - } - } - } - tab3group5 = new Group(container3,SWT.NONE); - FormLayout tab3group5Layout = new FormLayout(); - tab3group5.setLayout(tab3group5Layout); - GridData tab3group5LData = new GridData(); - tab3group5LData.widthHint = 500; - tab3group5LData.heightHint = 99; - tab3group5.setLayoutData(tab3group5LData); - tab3group5.setText("Add User"); - tab3group5.setVisible(false); - { - submitButton = new Button(tab3group5,SWT.PUSH | SWT.CENTER); - submitButton.setText("Submit"); - FormData submitButtonLData = new FormData(); - submitButtonLData.width = 50; - submitButtonLData.height = 21; - submitButtonLData.left = new FormAttachment(0, 1000, 382); - submitButtonLData.top = new FormAttachment(0, 1000, 52); - submitButton.setLayoutData(submitButtonLData); - submitButton.setToolTipText("add User"); - submitButton.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent evt) { - System.out.println("submit"); - YalpUser toChange = new YalpUser(); - toChange.id = 100; - toChange.name = usernameAdd.getText(); - toChange.realName = realnameAdd.getText(); - model.changeUser(toChange, passwdAdd.getText(), Action.CREATE); - while(UserTable.getItemCount()!=0){ - UserTable.remove(0); - } - ArrayList resultList = model.getUser(); - for (int i = 0; i < resultList.size(); i++) { - TableItem item; - YalpUser result = resultList.get(i); - item = new TableItem(UserTable,SWT.NONE); - item.setText(0,new Integer(result.id).toString()); - item.setText(1,result.name); - //item.setText(2,result.passwd); - item.setText(3,result.realName); - item.setText(4,model.accessRightsName(result.level)); - } - } - }); - } - { - adminAddLabel = new CLabel(tab3group5,SWT.NONE); - adminAddLabel.setText("Admin:"); - FormData adminAddLabelLData = new FormData(); - adminAddLabelLData.width = 40; - adminAddLabelLData.height = 21; - adminAddLabelLData.left = new FormAttachment(0, 1000, 291); - adminAddLabelLData.top = new FormAttachment(0, 1000, 17); - adminAddLabel.setLayoutData(adminAddLabelLData); - } - { - passwdAddLable = new CLabel(tab3group5,SWT.NONE); - passwdAddLable.setText("Password:"); - FormData passwdAddLableLData = new FormData(); - passwdAddLableLData.width = 60; - passwdAddLableLData.height = 21; - passwdAddLableLData.left = new FormAttachment(0, 1000, 17); - passwdAddLableLData.top = new FormAttachment(0, 1000, 57); - passwdAddLable.setLayoutData(passwdAddLableLData); - } - { - usernameAddLable = new CLabel(tab3group5,SWT.NONE); - usernameAddLable.setText("Username:"); - FormData usernameAddLableLData = new FormData(); - usernameAddLableLData.width = 60; - usernameAddLableLData.height = 21; - usernameAddLableLData.left = new FormAttachment(0, 1000, 17); - usernameAddLableLData.top = new FormAttachment(0, 1000, 37); - usernameAddLable.setLayoutData(usernameAddLableLData); - } - { - realnameAddLabel = new CLabel(tab3group5,SWT.NONE); - realnameAddLabel.setText("Name:"); - FormData realnameAddLabelLData = new FormData(); - realnameAddLabelLData.width = 60; - realnameAddLabelLData.height = 21; - realnameAddLabelLData.left = new FormAttachment(0, 1000, 17); - realnameAddLabelLData.top = new FormAttachment(0, 1000, 17); - realnameAddLabel.setLayoutData(realnameAddLabelLData); - } - { - adminAdd = new CCombo(tab3group5,SWT.NONE); - FormData adminAddLData = new FormData(); - adminAddLData.width = 65; - adminAddLData.height = 12; - adminAddLData.left = new FormAttachment(0, 1000, 347); - adminAddLData.top = new FormAttachment(0, 1000, 22); - adminAdd.setLayoutData(adminAddLData); - adminAdd.setText("false"); - { - adminAdd.add("false"); - adminAdd.add("true"); - } - } - { - realnameAdd = new Text(tab3group5,SWT.NONE); - FormData realnameAddLData = new FormData(); - realnameAddLData.width = 174; - realnameAddLData.height = 14; - realnameAddLData.left = new FormAttachment(0, 1000, 82); - realnameAddLData.top = new FormAttachment(0, 1000, 22); - realnameAdd.setLayoutData(realnameAddLData); - } - { - usernameAdd = new Text(tab3group5,SWT.NONE); - FormData usernameAddLData = new FormData(); - usernameAddLData.width = 174; - usernameAddLData.height = 13; - usernameAddLData.left = new FormAttachment(165, 1000, 0); - usernameAddLData.right = new FormAttachment(525, 1000, 0); - usernameAddLData.top = new FormAttachment(429, 1000, 0); - usernameAddLData.bottom = new FormAttachment(560, 1000, 0); - usernameAdd.setLayoutData(usernameAddLData); - } - { - FormData PasswdAddLData = new FormData(); - PasswdAddLData.width = 174; - PasswdAddLData.height = 13; - PasswdAddLData.left = new FormAttachment(165, 1000, 0); - PasswdAddLData.right = new FormAttachment(525, 1000, 0); - PasswdAddLData.top = new FormAttachment(631, 1000, 0); - PasswdAddLData.bottom = new FormAttachment(762, 1000, 0); - passwdAdd = new Text(tab3group5,SWT.NONE); - passwdAdd.setLayoutData(PasswdAddLData); - } - } - } - cTabFolder1.setSelection(0); - } - else{ - GridData testLData = new GridData(); - testLData.widthHint = 792; - testLData.heightHint = 590; - Composite simpelUser = new Composite(this, SWT.NONE); - RowLayout testLayout = new RowLayout(org.eclipse.swt.SWT.HORIZONTAL); - simpelUser.setLayout(testLayout); - simpelUser.setLayoutData(testLData); - { - topComposite = new Composite(simpelUser,SWT.NONE); - GridLayout topCompositeLayout = new GridLayout(); - topCompositeLayout.makeColumnsEqualWidth = true; - topCompositeLayout.numColumns = 2; - topCompositeLayout.verticalSpacing = 2; - topCompositeLayout.horizontalSpacing = 5; - topComposite.setLayout(topCompositeLayout); - RowData topCompositeLData = new RowData(); - topCompositeLData.width = 783; - topCompositeLData.height = 566; - topComposite.setLayoutData(topCompositeLData); - { - find = new Group(topComposite,SWT.NONE); - this.find(find,resultComposite,playlistComposite,bottemComposite,1); - } - { - logo = new Group(topComposite,SWT.NONE); - this.logo(logo); - } - { - resultComposite = new Composite(topComposite,SWT.NONE); - resultTable1 = new Table(resultComposite,SWT.MULTI|SWT.FULL_SELECTION); - resultTable1.setToolTipText("Medias"); - resultTable1.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent evt) { - add2.setEnabled(true); - } - }); - this.resultTable(resultComposite,resultTable1,1); - } - { - playlistComposite = new Composite(topComposite,SWT.NONE); - FormLayout playlistCompositeLayout = new FormLayout(); - playlistComposite.setLayout(playlistCompositeLayout); - GridData playlistCompositeLData = new GridData(); - playlistCompositeLData.heightHint = 390; - playlistCompositeLData.horizontalAlignment = GridData.FILL; - playlistComposite.setLayoutData(playlistCompositeLData); - playlistComposite.setVisible(false); - playlistComposite.setSize(238, 390); - { - next = new Button(playlistComposite,SWT.PUSH | SWT.CENTER); - FormData nextLData = new FormData(); - nextLData.width = 45; - nextLData.height = 21; - nextLData.left = new FormAttachment(0, 1000, 185); - nextLData.top = new FormAttachment(0, 1000, 365); - next.setLayoutData(nextLData); - next.setEnabled(false); - next.setFont(SWTResourceManager.getFont("Times", 8, 1, false, false)); - next.setToolTipText("play next Title"); - next.setImage(forwardImage); - next.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent evt) { - model.next(); - } - }); - } - { - stop = new Button(playlistComposite,SWT.PUSH | SWT.CENTER); - FormData stopLData = new FormData(); - stopLData.width = 35; - stopLData.height = 21; - stopLData.left = new FormAttachment(0, 1000, 91); - stopLData.top = new FormAttachment(0, 1000, 365); - stop.setLayoutData(stopLData); - stop.setImage(new Image(this.getDisplay(),"img/stop.gif")); - stop.setEnabled(false); - stop.setToolTipText("stop"); - stop.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent evt) { - if (model.stop()){ - play.setEnabled(true); - next.setEnabled(false); - stop.setEnabled(false); - play.setImage(playImage); - play.setToolTipText("play"); - isNotPlaying=true; - } - - } - }); - } - { - play = new Button(playlistComposite,SWT.PUSH | SWT.CENTER); - FormData playLData = new FormData(); - playLData.width = 35; - playLData.height = 21; - playLData.left = new FormAttachment(0, 1000, 50); - playLData.top = new FormAttachment(0, 1000, 365); - play.setLayoutData(playLData); - play.setImage(playImage); - play.setEnabled(false); - play.setToolTipText("play"); - play.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent evt) { - stop.setEnabled(true); - if (playlistTable.getItemCount()>1)next.setEnabled(true); - del.setEnabled(false); - //add2.setEnabled(false); - if (isNotPlaying){ - play.setCursor(SWTResourceManager.getCursor(SWT.CURSOR_WAIT)); - if(model.play()){ - play.setImage(pauseImage); - play.setToolTipText("pause"); - play.setCursor(SWTResourceManager.getCursor(SWT.NONE)); - isNotPlaying= false; - }else; - }else{ - if(model.pause()){ - if (paused){ - play.setImage(playImage); - play.setToolTipText("play"); - paused=false; - }else{ - play.setImage(pauseImage); - play.setToolTipText("pause"); - paused=true; - } - }else; - } - - } - }); - } - { - add2 = new Button(playlistComposite,SWT.PUSH | SWT.CENTER); - FormData addLData = new FormData(); - addLData.width = 25; - addLData.height = 21; - addLData.left = new FormAttachment(0, 1000, 2); - addLData.top = new FormAttachment(0, 1000, 160); - add2.setLayoutData(addLData); - add2.setText(">>"); - add2.setEnabled(false); - add2.setToolTipText("add to Playlist"); - add2.setFont(SWTResourceManager.getFont("Times", 8, 1, false, false)); - add2.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent evt) { - if (System.getProperty("os.name")== "Mac OS X"){ - for (int i=resultTable1.getSelectionCount()-1;i>=0;i--){ - int id=new Integer(resultTable1.getSelection()[i].getText(0)).intValue(); - System.out.println(resultTable1.getSelection()[i].getText(1)); - model.add2PlayList(id); - } - }else{ - for (int i=0;i playlist=model.getToPlaylist(); - for(int i=0;i1&& !isNotPlaying)next.setEnabled(true); - } - }); - } - { - del = new Button(playlistComposite,SWT.PUSH | SWT.CENTER); - FormData delLData = new FormData(); - delLData.width = 25; - delLData.height = 21; - delLData.left = new FormAttachment(0, 1000, 2); - delLData.top = new FormAttachment(0, 1000, 200); - del.setLayoutData(delLData); - del.setEnabled(false); - del.setToolTipText("del from Playlist"); - del.setText("<<"); - del.setFont(SWTResourceManager.getFont("Times", 8, 1, false, false)); - del.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent evt) { - for (int i=playlistTable.getSelectionCount()-1;i>=0;i--){ - int pos = playlistTable.getSelectionIndices()[i]; - model.removeFromPlayList(pos); - } - - del.setEnabled(false); - while(playlistTable.getItemCount()!=0){ - playlistTable.remove(0); - } - ArrayList playlist=model.getToPlaylist(); - for(int i=0;i types = new ArrayList(); - - if( videoCheckBox.getSelection() ) - types.add(MediaType.VIDEO); - - if( audioCheckBox.getSelection() ) - types.add(MediaType.SOUND); - /* t.b.d. add IMAGE support */ - - if (tab==1){ - while(resultTable1.getItemCount()!=0){ - resultTable1.remove(0); - } - }else{ - while(resultTable2.getItemCount()!=0){ - resultTable2.remove(0); - } - } - returnVal= model.search(search, types, tab); - ArrayListresultList = model.getMedia(tab); - for( int i = 0; - (resultList != null) && (i < resultList.size()); - i++ ) - { - TableItem item; - Media result=resultList.get(i); - if (tab==1) item=new TableItem(resultTable1,SWT.NONE); - else item= new TableItem(resultTable2,SWT.NONE); - item.setText(0,new Integer(result.id).toString()); - item.setText(1,result.name); - /* t.b.d. add string_props support - if(result.author != null) - item.setText(2,result.author); - - if(result.album != null) - item.setText(3,result.album); - - if(result.year != null) - item.setText(4,result.year); - - if(result.category != null) - item.setText(5,result.category); - */ - if(result.type != null) - item.setText(6,model.getTypeName(result.type)); - - } - if (tab==1){ - if (returnVal==1)returnNum.setText(returnVal+" Media"); - else returnNum.setText(returnVal+" Medias"); - resultComposite.setVisible(true); - playlistComposite.setVisible(true); - //bottemComposite.setVisible(true); - } - if (tab==2){ - if (returnVal==1)returnNum.setText(returnVal+" Media"); - else returnNum.setText(returnVal+" Medias"); - composite1.setVisible(true); - } - } - - - private void deleteButtonWidgetSelected(SelectionEvent evt) { - try{ - for (int i=resultTable2.getSelectionCount()-1;i>=0;i--){ - - Media result = model.getMediaWithId( - new Integer(resultTable2.getSelection()[i].getText(0)).intValue(),2 ); - - changeComposite.setVisible(false); - deleteButton.setVisible(false); - model.changeMedia(result, Action.DELETE); - resultTable2.remove(resultTable2.getSelectionIndices()[i]); - } - }catch (Exception e){ - System.out.println("Exception in DeleteButton "+e); - } - } - private void addButtonWidgetSelected(SelectionEvent evt) { - System.out.println("browser not implemented in yalp v2"); - } - - - public void refillIpTable(){ - /* t.b.d. replace by session viewer - try{ - ArrayList list=model.srvCon.getClientInfo(); - while(iptable.getItemCount()!=0){ - iptable.remove(0); - } - for(ClientInfo info : list){ - TableItem item = new TableItem(iptable,SWT.NONE); - item.setText(0,info.getUserName()); - item.setText(1,info.getIp()); - } - }catch(Exception e){System.out.println("geht nicht "+e);} - */ - } - - public void show(){ - ((Shell)this.parent).setImage(new Image(display,"img/yalpV2_klein.gif")); - ((Shell)this.parent).setText("yalp"); - this.parent.addListener(SWT.Dispose,new org.eclipse.swt.widgets.Listener(){ - public void handleEvent(org.eclipse.swt.widgets.Event e) { - ShellClose(); - } - }); - Point size = this.getSize(); - java.awt.Dimension screen = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); - Rectangle shellBounds = this.parent.computeTrim((screen.width-size.x)/2,(screen.height-size.y)/2,size.x,size.y); - this.parent.setLayout(new FillLayout()); - this.parent.layout(); - this.parent.setBounds(shellBounds); - ((Shell)this.parent).open(); - while (!this.parent.isDisposed()) { - if (!display.readAndDispatch()) - display.sleep(); - } - } - public void ShellClose(){ - this.model.logoff(); - System.exit(0); - } - -} - +/* + * Copyright (c) 2006 Manuel Traut and Volker Dahnke + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: Manuel Traut and Volker Dahnke + */ + +package YalpClients.SwtClient.GUI; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.*; +import org.eclipse.swt.graphics.*; +import org.eclipse.swt.layout.*; +import org.eclipse.swt.widgets.*; +import org.eclipse.swt.events.*; +import java.util.*; + +import YalpInterfaces.*; +import YalpClients.SwtClient.*; + +/* + * + * Class GUI + * + * + * + * @author Volker Dahnke / Manuel Traut + * + * @version 1 02-04-2006
+ * + */ +public class GUI extends org.eclipse.swt.widgets.Composite { + + public Model model; + public Composite resultComposite; + public Composite playlistComposite; + public Composite bottemComposite; + public Table resultTable1; + public Table resultTable2; + public Composite composite1; + public Composite changeComposite; + public Table UserTable; + public Composite composite3; + + private AccessRights userKind; + private StyledText styledText1; + private CTabFolder cTabFolder1; + private CTabItem tab1; + private Composite container1; + private Composite topComposite; + private Group find; + private Group logo; + private CTabItem tab2; + private Composite container2; + private Group group1; + private Group group2; + private CLabel authorLabel; + private CLabel titleLabel; + private CLabel streamLabel2; + private CLabel actualStreamLabel2; + private CLabel actualStreamLabel1; + private CLabel streamLabel1; + private CLabel data2; + private CLabel data1; + private Button shutdown; + private TableColumn ip; + private TableColumn userName; + public Table iptable; + private Composite composite4; + + private Button submitButton; + private CLabel adminAddLabel; + private CLabel passwdAddLable; + private CLabel usernameAddLable; + private CLabel realnameAddLabel; + private CCombo adminAdd; + private Text realnameAdd; + private Text passwdAdd; + private Text usernameAdd; + private Group tab3group5; + private Button next; + private Button stop; + private Button play; + private CLabel cLabel2; + private Button save; + private Text userTableId; + private Text passwd; + private Text username; + private Text userTableName; + private CLabel adminLabel; + private CCombo adminCombo; + private CLabel nameLable; + private CLabel passwdLable; + private CLabel usernameLable; + private CLabel idLable; + private Group tab3group4; + private Button delete; + private Button add1; + private Group tab3Group3; + private Group tab3Group2; + private Group tab3Group1; + private Composite container3; + private Button deleteButton; + private Button addButton; + private StyledText status; + private Button saveButton; + private Text id; + private CLabel idLabel; + private CLabel cLabel1; + private CLabel nameLabel; + private CLabel pathLabel; + private CLabel lastEditLable; + private CLabel ownerIdLabel; + private CLabel resolutionLabel; + private CLabel vBitrateLabel; + private CLabel aBitrateLabel; + private CLabel durationLabel; + private CLabel yearLabel; + private CLabel categoryLabel; + private CLabel albumLabel; + private CCombo type; + private Text name; + private Text path; + private Text lastEdit; + private Text ownerId; + private Text resolution; + private Text vBitrate; + private Text aBitrate; + private Text duration; + private Text year; + private Text category; + private Text album; + private Text author; + private Text title; + private Composite composite2; + private Table playlistTable; + private Button add2; + private Button del; + private Boolean isNotPlaying=true; + private Boolean paused =true; + private CTabItem tab3; + private Composite parent; + private Display display; + final Image pauseImage=new Image(this.getDisplay(),"img/pause.gif"); + final Image playImage=new Image(this.getDisplay(),"img/play.gif"); + final Image forwardImage=new Image(this.getDisplay(),"img/forward.gif"); + { + //Register as a resource user - SWTResourceManager will + //handle the obtaining and disposing of resources + SWTResourceManager.registerResourceUser(this); + } + + public GUI( Composite parent, Display display, Model model, + AccessRights userKind, int style ) { + + super(parent, style); + + this.parent = parent; + this.display = display; + this.model = model; + this.userKind = userKind; + + initGUI(); + } + + private void initGUI() { + try { + this.setSize(800, 600); + this.setBackground(SWTResourceManager.getColor(192, 192, 192)); + GridLayout thisLayout = new GridLayout(1, true); + thisLayout.marginWidth = 5; + thisLayout.marginHeight = 5; + thisLayout.numColumns = 1; + thisLayout.makeColumnsEqualWidth = true; + thisLayout.horizontalSpacing = 5; + thisLayout.verticalSpacing = 5; + this.setLayout(thisLayout); + + { + if (this.userKind.value() == AccessRights._USER){ + cTabFolder1 = new CTabFolder(this, SWT.NONE); + GridData cTabFolder1LData = new GridData(); + cTabFolder1LData.widthHint = 787; + cTabFolder1LData.heightHint = 568; + cTabFolder1.setLayoutData(cTabFolder1LData); + { + tab1 = new CTabItem(cTabFolder1,SWT.NONE); + tab1.setText("Find"); + { + container1 = new Composite(cTabFolder1,SWT.NONE); + tab1.setControl(container1); + RowLayout container1Layout = new RowLayout(org.eclipse.swt.SWT.HORIZONTAL); + container1.setLayout(container1Layout); + { + topComposite = new Composite(container1,SWT.NONE); + GridLayout topCompositeLayout = new GridLayout(); + topCompositeLayout.makeColumnsEqualWidth = true; + topCompositeLayout.numColumns = 2; + topCompositeLayout.verticalSpacing = 2; + topCompositeLayout.horizontalSpacing = 5; + topComposite.setLayout(topCompositeLayout); + RowData topCompositeLData = new RowData(); + topCompositeLData.width = 783; + topCompositeLData.height = 566; + topComposite.setLayoutData(topCompositeLData); + { + find = new Group(topComposite,SWT.NONE); + this.find(find,resultComposite,playlistComposite,bottemComposite,1); + } + { + logo = new Group(topComposite,SWT.NONE); + this.logo(logo); + } + { + resultComposite = new Composite(topComposite,SWT.NONE); + resultTable1 = new Table(resultComposite,SWT.MULTI|SWT.FULL_SELECTION); + resultTable1.setToolTipText("Medias"); + resultTable1.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent evt) { + add2.setEnabled(true); + } + }); + this.resultTable(resultComposite,resultTable1,1); + } + { + playlistComposite = new Composite(topComposite,SWT.NONE); + FormLayout playlistCompositeLayout = new FormLayout(); + playlistComposite.setLayout(playlistCompositeLayout); + GridData playlistCompositeLData = new GridData(); + playlistCompositeLData.heightHint = 390; + playlistCompositeLData.horizontalAlignment = GridData.FILL; + playlistComposite.setLayoutData(playlistCompositeLData); + playlistComposite.setVisible(false); + playlistComposite.setSize(238, 390); + { + next = new Button(playlistComposite,SWT.PUSH | SWT.CENTER); + FormData nextLData = new FormData(); + nextLData.width = 45; + nextLData.height = 21; + nextLData.left = new FormAttachment(0, 1000, 185); + nextLData.top = new FormAttachment(0, 1000, 365); + next.setLayoutData(nextLData); + next.setEnabled(false); + next.setFont(SWTResourceManager.getFont("Times", 8, 1, false, false)); + next.setToolTipText("play next Title"); + next.setImage(forwardImage); + next.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent evt) { + model.next(); + } + }); + } + { + stop = new Button(playlistComposite,SWT.PUSH | SWT.CENTER); + FormData stopLData = new FormData(); + stopLData.width = 35; + stopLData.height = 21; + stopLData.left = new FormAttachment(0, 1000, 91); + stopLData.top = new FormAttachment(0, 1000, 365); + stop.setLayoutData(stopLData); + stop.setImage(new Image(this.getDisplay(),"img/stop.gif")); + stop.setEnabled(false); + stop.setToolTipText("stop"); + stop.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent evt) { + if (model.stop()){ + play.setEnabled(true); + next.setEnabled(false); + stop.setEnabled(false); + play.setImage(playImage); + play.setToolTipText("play"); + isNotPlaying=true; + } + + } + }); + } + { + play = new Button(playlistComposite,SWT.PUSH | SWT.CENTER); + FormData playLData = new FormData(); + playLData.width = 35; + playLData.height = 21; + playLData.left = new FormAttachment(0, 1000, 50); + playLData.top = new FormAttachment(0, 1000, 365); + play.setLayoutData(playLData); + play.setImage(playImage); + play.setEnabled(false); + play.setToolTipText("play"); + play.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent evt) { + stop.setEnabled(true); + if (playlistTable.getItemCount()>1)next.setEnabled(true); + del.setEnabled(false); + //add2.setEnabled(false); + if (isNotPlaying){ + play.setCursor(SWTResourceManager.getCursor(SWT.CURSOR_WAIT)); + if(model.play()){ + play.setImage(pauseImage); + play.setToolTipText("pause"); + play.setCursor(SWTResourceManager.getCursor(SWT.NONE)); + isNotPlaying= false; + }else; + }else{ + if(model.pause()){ + if (paused){ + play.setImage(playImage); + play.setToolTipText("play"); + paused=false; + }else{ + play.setImage(pauseImage); + play.setToolTipText("pause"); + paused=true; + } + }else; + } + + } + }); + } + { + add2 = new Button(playlistComposite,SWT.PUSH | SWT.CENTER); + FormData addLData = new FormData(); + addLData.width = 25; + addLData.height = 21; + addLData.left = new FormAttachment(0, 1000, 2); + addLData.top = new FormAttachment(0, 1000, 160); + add2.setLayoutData(addLData); + add2.setText(">>"); + add2.setEnabled(false); + add2.setToolTipText("add to Playlist"); + add2.setFont(SWTResourceManager.getFont("Times", 8, 1, false, false)); + add2.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent evt) { + if (System.getProperty("os.name")== "Mac OS X"){ + for (int i=resultTable1.getSelectionCount()-1;i>=0;i--){ + int id=new Integer(resultTable1.getSelection()[i].getText(0)).intValue(); + System.out.println(resultTable1.getSelection()[i].getText(1)); + model.add2PlayList(id); + } + }else{ + for (int i=0;i playlist=model.getToPlaylist(); + for(int i=0;i1&& !isNotPlaying)next.setEnabled(true); + } + }); + } + { + del = new Button(playlistComposite,SWT.PUSH | SWT.CENTER); + FormData delLData = new FormData(); + delLData.width = 25; + delLData.height = 21; + delLData.left = new FormAttachment(0, 1000, 2); + delLData.top = new FormAttachment(0, 1000, 200); + del.setLayoutData(delLData); + del.setEnabled(false); + del.setToolTipText("del from Playlist"); + del.setText("<<"); + del.setFont(SWTResourceManager.getFont("Times", 8, 1, false, false)); + del.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent evt) { + for (int i=playlistTable.getSelectionCount()-1;i>=0;i--){ + int pos = playlistTable.getSelectionIndices()[i]; + model.removeFromPlayList(pos); + } + + del.setEnabled(false); + while(playlistTable.getItemCount()!=0){ + playlistTable.remove(0); + } + ArrayList playlist=model.getToPlaylist(); + for(int i=0;i resultList = model.getUser(); + for (int i = 0; i < resultList.size(); i++) { + TableItem item; + YalpUser result = resultList.get(i); + item = new TableItem(UserTable,SWT.NONE); + item.setText(0,new Integer(result.id).toString()); + item.setText(1,result.name); + // item.setText(2,result.password); + item.setText(3,result.realName); + item.setText(4,model.accessRightsName(result.level)); + } + tab3group4.setVisible(false); + } + }); + } + { + add1 = new Button(tab3Group3,SWT.PUSH | SWT.CENTER); + add1.setText("Add"); + FormData addLData = new FormData(); + addLData.width = 45; + addLData.height = 21; + addLData.left = new FormAttachment(0, 1000, 7); + addLData.top = new FormAttachment(0, 1000, 254); + add1.setLayoutData(addLData); + add1.setToolTipText("add new User "); + add1.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent evt) { + tab3group5.setVisible(true); + } + }); + } + { + UserTable = new Table(tab3Group3,SWT.SINGLE|SWT.FULL_SELECTION); + FormData UserTableLData = new FormData(); + UserTableLData.width = 467; + UserTableLData.height = 224; + UserTableLData.left = new FormAttachment(11, 1000, 0); + UserTableLData.right = new FormAttachment(988, 1000, 0); + UserTableLData.top = new FormAttachment(19, 1000, 0); + UserTableLData.bottom = new FormAttachment(864, 1000, 0); + UserTable.setLayoutData(UserTableLData); + UserTable.setHeaderVisible(true); + UserTable.setToolTipText("registrated User"); + UserTable.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent evt) { + userTableId.setText(UserTable.getSelection()[0].getText(0)); + username.setText(UserTable.getSelection()[0].getText(1)); + passwd.setText(UserTable.getSelection()[0].getText(2)); + userTableName.setText(UserTable.getSelection()[0].getText(3)); + adminCombo.setText(UserTable.getSelection()[0].getText(4)); + tab3group4.setVisible(true); + } + }); + { + TableColumn id = new TableColumn(UserTable,SWT.BEGINNING); + id.setText("ID"); + id.setWidth(45); + id.setMoveable(true); + id.addListener(SWT.Selection, new SortListener(this,UserTable,0,5)); + TableColumn userName = new TableColumn(UserTable,SWT.BEGINNING); + userName.setMoveable(true); + userName.setText("Username"); + userName.setWidth(120); + userName.addListener(SWT.Selection, new SortListener(this,UserTable,1,5)); + TableColumn passwd = new TableColumn(UserTable,SWT.BEGINNING); + passwd.setMoveable(true); + passwd.setText("Password"); + passwd.setWidth(120); + passwd.addListener(SWT.Selection, new SortListener(this,UserTable,2,5)); + TableColumn name = new TableColumn(UserTable,SWT.BEGINNING); + name.setMoveable(true); + name.setText("Name"); + name.setWidth(130); + name.addListener(SWT.Selection, new SortListener(this,UserTable,3,5)); + TableColumn admin = new TableColumn(UserTable,SWT.BEGINNING); + admin.setMoveable(true); + admin.setText("Admin"); + admin.setWidth(74); + admin.addListener(SWT.Selection, new SortListener(this,UserTable,4,5)); + //TableColumn huhu=new TableColumn(UserTable,SWT.BEGINNING); + //huhu.dispose(); + ArrayList resultList = model.getUser(); + for (int i = 0; i < resultList.size(); i++) { + TableItem item; + YalpUser result = resultList.get(i); + item = new TableItem(UserTable,SWT.NONE); + item.setText(0,new Integer(result.id).toString()); + item.setText(1,result.name); + //item.setText(2,result.passwd); + item.setText(3,result.realName); + item.setText(4,model.accessRightsName(result.level)); + } + } + } + } + { + tab3group4 = new Group(container3,SWT.NONE); + FormLayout tab3group4Layout = new FormLayout(); + tab3group4.setLayout(tab3group4Layout); + tab3group4.setText("Edit User"); + GridData tab3group4LData = new GridData(); + tab3group4LData.widthHint = 256; + tab3group4LData.heightHint = 284; + tab3group4.setLayoutData(tab3group4LData); + tab3group4.setVisible(false); + { + save = new Button(tab3group4,SWT.PUSH | SWT.CENTER); + save.setText("save"); + FormData saveLData = new FormData(); + saveLData.width = 45; + saveLData.height = 21; + saveLData.left = new FormAttachment(0, 1000, 42); + saveLData.top = new FormAttachment(0, 1000, 157); + save.setLayoutData(saveLData); + save.setToolTipText("save Changes"); + save.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent evt) { + YalpUser toChange = new YalpUser(); + toChange.id = new Integer(userTableId.getText()).intValue(); + toChange.name = username.getText(); + model.changeUser(toChange, passwd.getText(), Action.EDIT); + while(UserTable.getItemCount()!=0){ + UserTable.remove(0); + } + ArrayList resultList = model.getUser(); + for (int i = 0; i < resultList.size(); i++) { + TableItem item; + YalpUser result = resultList.get(i); + item = new TableItem(UserTable,SWT.NONE); + item.setText(0,new Integer(result.id).toString()); + item.setText(1,result.name); + //item.setText(2,result.passwd); + item.setText(3,result.realName); + item.setText(4,model.accessRightsName(result.level)); + } + tab3group4.setVisible(false); + } + }); + } + { + userTableName = new Text(tab3group4,SWT.NONE); + FormData text2LData = new FormData(); + text2LData.width = 94; + text2LData.height = 14; + text2LData.left = new FormAttachment(0, 1000, 117); + text2LData.top = new FormAttachment(0, 1000, 112); + userTableName .setLayoutData(text2LData); + } + { + passwd = new Text(tab3group4,SWT.NONE); + FormData passwdLData = new FormData(); + passwdLData.width = 94; + passwdLData.height = 14; + passwdLData.left = new FormAttachment(0, 1000, 117); + passwdLData.top = new FormAttachment(0, 1000, 92); + passwd.setLayoutData(passwdLData); + } + { + username = new Text(tab3group4,SWT.NONE); + FormData usernameLData = new FormData(); + usernameLData.width = 94; + usernameLData.height = 14; + usernameLData.left = new FormAttachment(0, 1000, 117); + usernameLData.top = new FormAttachment(0, 1000, 72); + username.setLayoutData(usernameLData); + } + { + userTableId = new Text(tab3group4,SWT.NONE); + FormData text1LData = new FormData(); + text1LData.width = 94; + text1LData.height = 14; + text1LData.left = new FormAttachment(0, 1000, 117); + text1LData.top = new FormAttachment(0, 1000, 52); + userTableId.setLayoutData(text1LData); + userTableId.setEditable(false); + } + { + adminLabel = new CLabel(tab3group4,SWT.NONE); + adminLabel.setText("Admin:"); + FormData adminLabelLData = new FormData(); + adminLabelLData.width = 42; + adminLabelLData.height = 21; + adminLabelLData.left = new FormAttachment(0, 1000, 27); + adminLabelLData.top = new FormAttachment(0, 1000, 127); + adminLabel.setLayoutData(adminLabelLData); + } + { + idLable = new CLabel(tab3group4,SWT.NONE); + idLable.setText("Id:"); + FormData idLableLData = new FormData(); + idLableLData.width = 20; + idLableLData.height = 21; + idLableLData.left = new FormAttachment(107, 1000, 0); + idLableLData.right = new FormAttachment(185, 1000, 0); + idLableLData.top = new FormAttachment(167, 1000, 0); + idLableLData.bottom = new FormAttachment(241, 1000, 0); + idLable.setLayoutData(idLableLData); + } + { + usernameLable = new CLabel(tab3group4,SWT.NONE); + usernameLable.setText("Username:"); + FormData usernameLableLData = new FormData(); + usernameLableLData.width = 58; + usernameLableLData.height = 21; + usernameLableLData.left = new FormAttachment(107, 1000, 0); + usernameLableLData.right = new FormAttachment(333, 1000, 0); + usernameLableLData.top = new FormAttachment(237, 1000, 0); + usernameLableLData.bottom = new FormAttachment(311, 1000, 0); + usernameLable.setLayoutData(usernameLableLData); + } + { + passwdLable = new CLabel(tab3group4,SWT.NONE); + passwdLable.setText("Password:"); + FormData passwdLableLData = new FormData(); + passwdLableLData.width = 56; + passwdLableLData.height = 21; + passwdLableLData.left = new FormAttachment(107, 1000, 0); + passwdLableLData.right = new FormAttachment(326, 1000, 0); + passwdLableLData.top = new FormAttachment(308, 1000, 0); + passwdLableLData.bottom = new FormAttachment(382, 1000, 0); + passwdLable.setLayoutData(passwdLableLData); + } + { + nameLable = new CLabel(tab3group4,SWT.NONE); + nameLable.setText("Name:"); + FormData nameLableLData = new FormData(); + nameLableLData.width = 37; + nameLableLData.height = 21; + nameLableLData.left = new FormAttachment(107, 1000, 0); + nameLableLData.right = new FormAttachment(251, 1000, 0); + nameLableLData.top = new FormAttachment(378, 1000, 0); + nameLableLData.bottom = new FormAttachment(452, 1000, 0); + nameLable.setLayoutData(nameLableLData); + } + { + adminCombo = new CCombo(tab3group4,SWT.NONE); + FormData adminComboLData = new FormData(); + adminComboLData.width = 81; + adminComboLData.height = 16; + adminComboLData.left = new FormAttachment(458, 1000, 0); + adminComboLData.right = new FormAttachment(849, 1000, 0); + adminComboLData.top = new FormAttachment(466, 1000, 0); + adminComboLData.bottom = new FormAttachment(522, 1000, 0); + adminCombo.setLayoutData(adminComboLData); + { + adminCombo.add("true"); + adminCombo.add("false"); + } + } + } + tab3group5 = new Group(container3,SWT.NONE); + FormLayout tab3group5Layout = new FormLayout(); + tab3group5.setLayout(tab3group5Layout); + GridData tab3group5LData = new GridData(); + tab3group5LData.widthHint = 500; + tab3group5LData.heightHint = 99; + tab3group5.setLayoutData(tab3group5LData); + tab3group5.setText("Add User"); + tab3group5.setVisible(false); + { + submitButton = new Button(tab3group5,SWT.PUSH | SWT.CENTER); + submitButton.setText("Submit"); + FormData submitButtonLData = new FormData(); + submitButtonLData.width = 50; + submitButtonLData.height = 21; + submitButtonLData.left = new FormAttachment(0, 1000, 382); + submitButtonLData.top = new FormAttachment(0, 1000, 52); + submitButton.setLayoutData(submitButtonLData); + submitButton.setToolTipText("add User"); + submitButton.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent evt) { + System.out.println("submit"); + YalpUser toChange = new YalpUser(); + toChange.id = 100; + toChange.name = usernameAdd.getText(); + toChange.realName = realnameAdd.getText(); + model.changeUser(toChange, passwdAdd.getText(), Action.CREATE); + while(UserTable.getItemCount()!=0){ + UserTable.remove(0); + } + ArrayList resultList = model.getUser(); + for (int i = 0; i < resultList.size(); i++) { + TableItem item; + YalpUser result = resultList.get(i); + item = new TableItem(UserTable,SWT.NONE); + item.setText(0,new Integer(result.id).toString()); + item.setText(1,result.name); + //item.setText(2,result.passwd); + item.setText(3,result.realName); + item.setText(4,model.accessRightsName(result.level)); + } + } + }); + } + { + adminAddLabel = new CLabel(tab3group5,SWT.NONE); + adminAddLabel.setText("Admin:"); + FormData adminAddLabelLData = new FormData(); + adminAddLabelLData.width = 40; + adminAddLabelLData.height = 21; + adminAddLabelLData.left = new FormAttachment(0, 1000, 291); + adminAddLabelLData.top = new FormAttachment(0, 1000, 17); + adminAddLabel.setLayoutData(adminAddLabelLData); + } + { + passwdAddLable = new CLabel(tab3group5,SWT.NONE); + passwdAddLable.setText("Password:"); + FormData passwdAddLableLData = new FormData(); + passwdAddLableLData.width = 60; + passwdAddLableLData.height = 21; + passwdAddLableLData.left = new FormAttachment(0, 1000, 17); + passwdAddLableLData.top = new FormAttachment(0, 1000, 57); + passwdAddLable.setLayoutData(passwdAddLableLData); + } + { + usernameAddLable = new CLabel(tab3group5,SWT.NONE); + usernameAddLable.setText("Username:"); + FormData usernameAddLableLData = new FormData(); + usernameAddLableLData.width = 60; + usernameAddLableLData.height = 21; + usernameAddLableLData.left = new FormAttachment(0, 1000, 17); + usernameAddLableLData.top = new FormAttachment(0, 1000, 37); + usernameAddLable.setLayoutData(usernameAddLableLData); + } + { + realnameAddLabel = new CLabel(tab3group5,SWT.NONE); + realnameAddLabel.setText("Name:"); + FormData realnameAddLabelLData = new FormData(); + realnameAddLabelLData.width = 60; + realnameAddLabelLData.height = 21; + realnameAddLabelLData.left = new FormAttachment(0, 1000, 17); + realnameAddLabelLData.top = new FormAttachment(0, 1000, 17); + realnameAddLabel.setLayoutData(realnameAddLabelLData); + } + { + adminAdd = new CCombo(tab3group5,SWT.NONE); + FormData adminAddLData = new FormData(); + adminAddLData.width = 65; + adminAddLData.height = 12; + adminAddLData.left = new FormAttachment(0, 1000, 347); + adminAddLData.top = new FormAttachment(0, 1000, 22); + adminAdd.setLayoutData(adminAddLData); + adminAdd.setText("false"); + { + adminAdd.add("false"); + adminAdd.add("true"); + } + } + { + realnameAdd = new Text(tab3group5,SWT.NONE); + FormData realnameAddLData = new FormData(); + realnameAddLData.width = 174; + realnameAddLData.height = 14; + realnameAddLData.left = new FormAttachment(0, 1000, 82); + realnameAddLData.top = new FormAttachment(0, 1000, 22); + realnameAdd.setLayoutData(realnameAddLData); + } + { + usernameAdd = new Text(tab3group5,SWT.NONE); + FormData usernameAddLData = new FormData(); + usernameAddLData.width = 174; + usernameAddLData.height = 13; + usernameAddLData.left = new FormAttachment(165, 1000, 0); + usernameAddLData.right = new FormAttachment(525, 1000, 0); + usernameAddLData.top = new FormAttachment(429, 1000, 0); + usernameAddLData.bottom = new FormAttachment(560, 1000, 0); + usernameAdd.setLayoutData(usernameAddLData); + } + { + FormData PasswdAddLData = new FormData(); + PasswdAddLData.width = 174; + PasswdAddLData.height = 13; + PasswdAddLData.left = new FormAttachment(165, 1000, 0); + PasswdAddLData.right = new FormAttachment(525, 1000, 0); + PasswdAddLData.top = new FormAttachment(631, 1000, 0); + PasswdAddLData.bottom = new FormAttachment(762, 1000, 0); + passwdAdd = new Text(tab3group5,SWT.NONE); + passwdAdd.setLayoutData(PasswdAddLData); + } + } + } + cTabFolder1.setSelection(0); + } + else{ + GridData testLData = new GridData(); + testLData.widthHint = 792; + testLData.heightHint = 590; + Composite simpelUser = new Composite(this, SWT.NONE); + RowLayout testLayout = new RowLayout(org.eclipse.swt.SWT.HORIZONTAL); + simpelUser.setLayout(testLayout); + simpelUser.setLayoutData(testLData); + { + topComposite = new Composite(simpelUser,SWT.NONE); + GridLayout topCompositeLayout = new GridLayout(); + topCompositeLayout.makeColumnsEqualWidth = true; + topCompositeLayout.numColumns = 2; + topCompositeLayout.verticalSpacing = 2; + topCompositeLayout.horizontalSpacing = 5; + topComposite.setLayout(topCompositeLayout); + RowData topCompositeLData = new RowData(); + topCompositeLData.width = 783; + topCompositeLData.height = 566; + topComposite.setLayoutData(topCompositeLData); + { + find = new Group(topComposite,SWT.NONE); + this.find(find,resultComposite,playlistComposite,bottemComposite,1); + } + { + logo = new Group(topComposite,SWT.NONE); + this.logo(logo); + } + { + resultComposite = new Composite(topComposite,SWT.NONE); + resultTable1 = new Table(resultComposite,SWT.MULTI|SWT.FULL_SELECTION); + resultTable1.setToolTipText("Medias"); + resultTable1.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent evt) { + add2.setEnabled(true); + } + }); + this.resultTable(resultComposite,resultTable1,1); + } + { + playlistComposite = new Composite(topComposite,SWT.NONE); + FormLayout playlistCompositeLayout = new FormLayout(); + playlistComposite.setLayout(playlistCompositeLayout); + GridData playlistCompositeLData = new GridData(); + playlistCompositeLData.heightHint = 390; + playlistCompositeLData.horizontalAlignment = GridData.FILL; + playlistComposite.setLayoutData(playlistCompositeLData); + playlistComposite.setVisible(false); + playlistComposite.setSize(238, 390); + { + next = new Button(playlistComposite,SWT.PUSH | SWT.CENTER); + FormData nextLData = new FormData(); + nextLData.width = 45; + nextLData.height = 21; + nextLData.left = new FormAttachment(0, 1000, 185); + nextLData.top = new FormAttachment(0, 1000, 365); + next.setLayoutData(nextLData); + next.setEnabled(false); + next.setFont(SWTResourceManager.getFont("Times", 8, 1, false, false)); + next.setToolTipText("play next Title"); + next.setImage(forwardImage); + next.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent evt) { + model.next(); + } + }); + } + { + stop = new Button(playlistComposite,SWT.PUSH | SWT.CENTER); + FormData stopLData = new FormData(); + stopLData.width = 35; + stopLData.height = 21; + stopLData.left = new FormAttachment(0, 1000, 91); + stopLData.top = new FormAttachment(0, 1000, 365); + stop.setLayoutData(stopLData); + stop.setImage(new Image(this.getDisplay(),"img/stop.gif")); + stop.setEnabled(false); + stop.setToolTipText("stop"); + stop.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent evt) { + if (model.stop()){ + play.setEnabled(true); + next.setEnabled(false); + stop.setEnabled(false); + play.setImage(playImage); + play.setToolTipText("play"); + isNotPlaying=true; + } + + } + }); + } + { + play = new Button(playlistComposite,SWT.PUSH | SWT.CENTER); + FormData playLData = new FormData(); + playLData.width = 35; + playLData.height = 21; + playLData.left = new FormAttachment(0, 1000, 50); + playLData.top = new FormAttachment(0, 1000, 365); + play.setLayoutData(playLData); + play.setImage(playImage); + play.setEnabled(false); + play.setToolTipText("play"); + play.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent evt) { + stop.setEnabled(true); + if (playlistTable.getItemCount()>1)next.setEnabled(true); + del.setEnabled(false); + //add2.setEnabled(false); + if (isNotPlaying){ + play.setCursor(SWTResourceManager.getCursor(SWT.CURSOR_WAIT)); + if(model.play()){ + play.setImage(pauseImage); + play.setToolTipText("pause"); + play.setCursor(SWTResourceManager.getCursor(SWT.NONE)); + isNotPlaying= false; + }else; + }else{ + if(model.pause()){ + if (paused){ + play.setImage(playImage); + play.setToolTipText("play"); + paused=false; + }else{ + play.setImage(pauseImage); + play.setToolTipText("pause"); + paused=true; + } + }else; + } + + } + }); + } + { + add2 = new Button(playlistComposite,SWT.PUSH | SWT.CENTER); + FormData addLData = new FormData(); + addLData.width = 25; + addLData.height = 21; + addLData.left = new FormAttachment(0, 1000, 2); + addLData.top = new FormAttachment(0, 1000, 160); + add2.setLayoutData(addLData); + add2.setText(">>"); + add2.setEnabled(false); + add2.setToolTipText("add to Playlist"); + add2.setFont(SWTResourceManager.getFont("Times", 8, 1, false, false)); + add2.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent evt) { + if (System.getProperty("os.name")== "Mac OS X"){ + for (int i=resultTable1.getSelectionCount()-1;i>=0;i--){ + int id=new Integer(resultTable1.getSelection()[i].getText(0)).intValue(); + System.out.println(resultTable1.getSelection()[i].getText(1)); + model.add2PlayList(id); + } + }else{ + for (int i=0;i playlist=model.getToPlaylist(); + for(int i=0;i1&& !isNotPlaying)next.setEnabled(true); + } + }); + } + { + del = new Button(playlistComposite,SWT.PUSH | SWT.CENTER); + FormData delLData = new FormData(); + delLData.width = 25; + delLData.height = 21; + delLData.left = new FormAttachment(0, 1000, 2); + delLData.top = new FormAttachment(0, 1000, 200); + del.setLayoutData(delLData); + del.setEnabled(false); + del.setToolTipText("del from Playlist"); + del.setText("<<"); + del.setFont(SWTResourceManager.getFont("Times", 8, 1, false, false)); + del.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent evt) { + for (int i=playlistTable.getSelectionCount()-1;i>=0;i--){ + int pos = playlistTable.getSelectionIndices()[i]; + model.removeFromPlayList(pos); + } + + del.setEnabled(false); + while(playlistTable.getItemCount()!=0){ + playlistTable.remove(0); + } + ArrayList playlist=model.getToPlaylist(); + for(int i=0;i types = new ArrayList(); + + if( videoCheckBox.getSelection() ) + types.add(MediaType.VIDEO); + + if( audioCheckBox.getSelection() ) + types.add(MediaType.SOUND); + /* t.b.d. add IMAGE support */ + + if (tab==1){ + while(resultTable1.getItemCount()!=0){ + resultTable1.remove(0); + } + }else{ + while(resultTable2.getItemCount()!=0){ + resultTable2.remove(0); + } + } + returnVal= model.search(search, types, tab); + ArrayListresultList = model.getMedia(tab); + for( int i = 0; + (resultList != null) && (i < resultList.size()); + i++ ) + { + TableItem item; + Media result=resultList.get(i); + if (tab==1) item=new TableItem(resultTable1,SWT.NONE); + else item= new TableItem(resultTable2,SWT.NONE); + item.setText(0,new Integer(result.id).toString()); + item.setText(1,result.name); + /* t.b.d. add string_props support + if(result.author != null) + item.setText(2,result.author); + + if(result.album != null) + item.setText(3,result.album); + + if(result.year != null) + item.setText(4,result.year); + + if(result.category != null) + item.setText(5,result.category); + */ + if(result.type != null) + item.setText(6,model.getTypeName(result.type)); + + } + if (tab==1){ + if (returnVal==1)returnNum.setText(returnVal+" Media"); + else returnNum.setText(returnVal+" Medias"); + resultComposite.setVisible(true); + playlistComposite.setVisible(true); + //bottemComposite.setVisible(true); + } + if (tab==2){ + if (returnVal==1)returnNum.setText(returnVal+" Media"); + else returnNum.setText(returnVal+" Medias"); + composite1.setVisible(true); + } + } + + + private void deleteButtonWidgetSelected(SelectionEvent evt) { + try{ + for (int i=resultTable2.getSelectionCount()-1;i>=0;i--){ + + Media result = model.getMediaWithId( + new Integer(resultTable2.getSelection()[i].getText(0)).intValue(),2 ); + + changeComposite.setVisible(false); + deleteButton.setVisible(false); + model.changeMedia(result, Action.DELETE); + resultTable2.remove(resultTable2.getSelectionIndices()[i]); + } + }catch (Exception e){ + System.out.println("Exception in DeleteButton "+e); + } + } + private void addButtonWidgetSelected(SelectionEvent evt) { + System.out.println("browser not implemented in yalp v2"); + } + + + public void refillIpTable(){ + /* t.b.d. replace by session viewer + try{ + ArrayList list=model.srvCon.getClientInfo(); + while(iptable.getItemCount()!=0){ + iptable.remove(0); + } + for(ClientInfo info : list){ + TableItem item = new TableItem(iptable,SWT.NONE); + item.setText(0,info.getUserName()); + item.setText(1,info.getIp()); + } + }catch(Exception e){System.out.println("geht nicht "+e);} + */ + } + + public void show(){ + ((Shell)this.parent).setImage(new Image(display,"img/yalpV2_klein.gif")); + ((Shell)this.parent).setText("yalp"); + this.parent.addListener(SWT.Dispose,new org.eclipse.swt.widgets.Listener(){ + public void handleEvent(org.eclipse.swt.widgets.Event e) { + ShellClose(); + } + }); + Point size = this.getSize(); + java.awt.Dimension screen = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); + Rectangle shellBounds = this.parent.computeTrim((screen.width-size.x)/2,(screen.height-size.y)/2,size.x,size.y); + this.parent.setLayout(new FillLayout()); + this.parent.layout(); + this.parent.setBounds(shellBounds); + ((Shell)this.parent).open(); + while (!this.parent.isDisposed()) { + if (!display.readAndDispatch()) + display.sleep(); + } + } + public void ShellClose(){ + this.model.logoff(); + System.exit(0); + } + +} + diff --git a/src/YalpClients/SwtClient/GUI/InitGUI.java b/src/YalpClients/SwtClient/GUI/InitGUI.java index 6b1fa51..e432c50 100644 --- a/src/YalpClients/SwtClient/GUI/InitGUI.java +++ b/src/YalpClients/SwtClient/GUI/InitGUI.java @@ -1,58 +1,58 @@ -/* - * Copyright (c) 2006 Manuel Traut and Volker Dahnke - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: Manuel Traut and Volker Dahnke - */ - -package YalpClients.SwtClient.GUI; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; - -import YalpClients.SwtClient.*; -import YalpInterfaces.AccessRights; - -/* - * Class InitGUI - * - * - * - * @author Volker Dahnke / Manuel Traut - * - * @version 1 02-04-2006
- * - */ - -public class InitGUI { - private Model model; - private Display display; - private int time = 1000; - - public InitGUI(Model model,AccessRights kind){ - this.model=model; - this.display = Display.getDefault(); - final Runnable timer = new Runnable() { - public void run() { - serverStillAlive(this); - } - }; - display.timerExec(time, timer); - - GUI gui= new GUI( - new Shell(display ,SWT.MIN), display, model, kind, SWT.NULL ); - gui.show(); - } - - public void serverStillAlive(Runnable timer){ - model.serverStillAlive(); - if (!this.model.getLogoff()){ - this.display.timerExec(time, timer); - } - } - -} +/* + * Copyright (c) 2006 Manuel Traut and Volker Dahnke + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: Manuel Traut and Volker Dahnke + */ + +package YalpClients.SwtClient.GUI; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Shell; + +import YalpClients.SwtClient.*; +import YalpInterfaces.AccessRights; + +/* + * Class InitGUI + * + * + * + * @author Volker Dahnke / Manuel Traut + * + * @version 1 02-04-2006
+ * + */ + +public class InitGUI { + private Model model; + private Display display; + private int time = 1000; + + public InitGUI(Model model,AccessRights kind){ + this.model=model; + this.display = Display.getDefault(); + final Runnable timer = new Runnable() { + public void run() { + serverStillAlive(this); + } + }; + display.timerExec(time, timer); + + GUI gui= new GUI( + new Shell(display ,SWT.MIN), display, model, kind, SWT.NULL ); + gui.show(); + } + + public void serverStillAlive(Runnable timer){ + model.serverStillAlive(); + if (!this.model.getLogoff()){ + this.display.timerExec(time, timer); + } + } + +} diff --git a/src/YalpClients/SwtClient/GUI/LoadDialog.java b/src/YalpClients/SwtClient/GUI/LoadDialog.java index dcdc4a8..fbe068b 100644 --- a/src/YalpClients/SwtClient/GUI/LoadDialog.java +++ b/src/YalpClients/SwtClient/GUI/LoadDialog.java @@ -1,110 +1,110 @@ -/* - * Copyright (c) 2006 Manuel Traut and Volker Dahnke - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: Manuel Traut and Volker Dahnke - */ - -package YalpClients.SwtClient.GUI; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.custom.*; -import org.eclipse.swt.graphics.*; -import org.eclipse.swt.layout.*; -import org.eclipse.swt.widgets.*; - -/* - * Class LoadDialog - * - * - * - * @author Volker Dahnke / Manuel Traut - * - * @version 1 02-04-2006
- */ -public class LoadDialog extends Composite{ - - { - //Register as a resource user - SWTResourceManager will - //handle the obtaining and disposing of resources - SWTResourceManager.registerResourceUser(this); - } - - private CLabel cLabel1; - private CLabel cLabel2; - private CLabel cLabel3; - private Shell parent; - - public LoadDialog(Composite parent, int style) { - super(parent, style); - this.parent=(Shell)parent; - initDialog(); - } - - private void initDialog(){ - GridLayout thisLayout = new GridLayout(); - thisLayout.makeColumnsEqualWidth = true; - this.setLayout(thisLayout); - this.setSize(300,170); - { - Composite composite = new Composite(this, SWT.NONE); - FormLayout compositeLayout = new FormLayout(); - composite.setLayout(compositeLayout); - GridData compositeLData = new GridData(); - compositeLData.widthHint = 287; - compositeLData.heightHint = 165; - composite.setLayoutData(compositeLData); - composite.setVisible(true); - { - cLabel3 = new CLabel(composite, SWT.LEFT); - cLabel3.setText("Copyright (c) 2006 Manuel Traut and Volker Dahnke"); - FormData cLabel3LData = new FormData(); - cLabel3LData.width = 300; - cLabel3LData.height = 20; - cLabel3LData.left = new FormAttachment(0, 1000, 0); - cLabel3LData.top = new FormAttachment(0, 1000, 145); - cLabel3.setLayoutData(cLabel3LData); - cLabel3.setFont(SWTResourceManager.getFont("Times", 7, 0, false, false)); - } - { - cLabel2 = new CLabel(composite, SWT.CENTER); - cLabel2.setText("Loading..."); - FormData cLabel2LData = new FormData(); - cLabel2LData.width = 105; - cLabel2LData.height = 25; - cLabel2LData.left = new FormAttachment(0, 1000, 91); - cLabel2LData.top = new FormAttachment(0, 1000, 123); - cLabel2.setLayoutData(cLabel2LData); - cLabel2.setFont(SWTResourceManager.getFont("Times", 12, 1, false, false)); - } - { - cLabel1 = new CLabel(composite, SWT.CENTER); - FormData cLabel1LData = new FormData(); - cLabel1LData.width = 200; - cLabel1LData.height = 120; - cLabel1LData.left = new FormAttachment(0, 1000, 40); - cLabel1LData.top = new FormAttachment(0, 1000, 0); - cLabel1.setLayoutData(cLabel1LData); - cLabel1.setImage(new Image(this.getDisplay(),"img/yalpV2.gif")); - } - - } - } - - public void show(){ - Point size = this.getSize(); - java.awt.Dimension screen = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); - Rectangle shellBounds = this.parent.computeTrim((screen.width-size.x)/2,(screen.height-size.y)/2,size.x,size.y); - this.parent.setLayout(new FillLayout()); - this.parent.layout(); - this.parent.setBounds(shellBounds); - this.parent.open(); - } - - public void close(){ - this.parent.close(); - } -} +/* + * Copyright (c) 2006 Manuel Traut and Volker Dahnke + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: Manuel Traut and Volker Dahnke + */ + +package YalpClients.SwtClient.GUI; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.*; +import org.eclipse.swt.graphics.*; +import org.eclipse.swt.layout.*; +import org.eclipse.swt.widgets.*; + +/* + * Class LoadDialog + * + * + * + * @author Volker Dahnke / Manuel Traut + * + * @version 1 02-04-2006
+ */ +public class LoadDialog extends Composite{ + + { + //Register as a resource user - SWTResourceManager will + //handle the obtaining and disposing of resources + SWTResourceManager.registerResourceUser(this); + } + + private CLabel cLabel1; + private CLabel cLabel2; + private CLabel cLabel3; + private Shell parent; + + public LoadDialog(Composite parent, int style) { + super(parent, style); + this.parent=(Shell)parent; + initDialog(); + } + + private void initDialog(){ + GridLayout thisLayout = new GridLayout(); + thisLayout.makeColumnsEqualWidth = true; + this.setLayout(thisLayout); + this.setSize(300,170); + { + Composite composite = new Composite(this, SWT.NONE); + FormLayout compositeLayout = new FormLayout(); + composite.setLayout(compositeLayout); + GridData compositeLData = new GridData(); + compositeLData.widthHint = 287; + compositeLData.heightHint = 165; + composite.setLayoutData(compositeLData); + composite.setVisible(true); + { + cLabel3 = new CLabel(composite, SWT.LEFT); + cLabel3.setText("Copyright (c) 2006 Manuel Traut and Volker Dahnke"); + FormData cLabel3LData = new FormData(); + cLabel3LData.width = 300; + cLabel3LData.height = 20; + cLabel3LData.left = new FormAttachment(0, 1000, 0); + cLabel3LData.top = new FormAttachment(0, 1000, 145); + cLabel3.setLayoutData(cLabel3LData); + cLabel3.setFont(SWTResourceManager.getFont("Times", 7, 0, false, false)); + } + { + cLabel2 = new CLabel(composite, SWT.CENTER); + cLabel2.setText("Loading..."); + FormData cLabel2LData = new FormData(); + cLabel2LData.width = 105; + cLabel2LData.height = 25; + cLabel2LData.left = new FormAttachment(0, 1000, 91); + cLabel2LData.top = new FormAttachment(0, 1000, 123); + cLabel2.setLayoutData(cLabel2LData); + cLabel2.setFont(SWTResourceManager.getFont("Times", 12, 1, false, false)); + } + { + cLabel1 = new CLabel(composite, SWT.CENTER); + FormData cLabel1LData = new FormData(); + cLabel1LData.width = 200; + cLabel1LData.height = 120; + cLabel1LData.left = new FormAttachment(0, 1000, 40); + cLabel1LData.top = new FormAttachment(0, 1000, 0); + cLabel1.setLayoutData(cLabel1LData); + cLabel1.setImage(new Image(this.getDisplay(),"img/yalpV2.gif")); + } + + } + } + + public void show(){ + Point size = this.getSize(); + java.awt.Dimension screen = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); + Rectangle shellBounds = this.parent.computeTrim((screen.width-size.x)/2,(screen.height-size.y)/2,size.x,size.y); + this.parent.setLayout(new FillLayout()); + this.parent.layout(); + this.parent.setBounds(shellBounds); + this.parent.open(); + } + + public void close(){ + this.parent.close(); + } +} diff --git a/src/YalpClients/SwtClient/GUI/SWTResourceManager.java b/src/YalpClients/SwtClient/GUI/SWTResourceManager.java index 87dffc3..258c883 100644 --- a/src/YalpClients/SwtClient/GUI/SWTResourceManager.java +++ b/src/YalpClients/SwtClient/GUI/SWTResourceManager.java @@ -1,145 +1,145 @@ -package YalpClients.SwtClient.GUI; - -import java.util.HashMap; -import java.util.Iterator; -import java.util.Vector; - -import org.eclipse.swt.events.DisposeEvent; -import org.eclipse.swt.events.DisposeListener; -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.graphics.Cursor; -import org.eclipse.swt.graphics.Font; -import org.eclipse.swt.graphics.FontData; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Widget; - -/* - * Class to manage SWT resources (Font, Color, Image and Cursor) - * There are no restrictions on the use of this code. - * - * You may change this code and your changes will not be overwritten, - * but if you change the version number below then this class will be - * completely overwritten by Jigloo. - * #SWTResourceManager:version4.0.0# - */ -public class SWTResourceManager { - - private static HashMap resources = new HashMap(); - private static Vector users = new Vector(); - private static SWTResourceManager instance = new SWTResourceManager(); - - private static DisposeListener disposeListener = new DisposeListener() { - public void widgetDisposed(DisposeEvent e) { - users.remove(e.getSource()); - if (users.size() == 0) - dispose(); - } - }; - - /* - * This method should be called by *all* Widgets which use resources - * provided by this SWTResourceManager. When widgets are disposed, - * they are removed from the "users" Vector, and when no more - * registered Widgets are left, all resources are disposed. - *

- * If this method is not called for all Widgets then it should not be called - * at all, and the "dispose" method should be explicitly called after all - * resources are no longer being used. - */ - public static void registerResourceUser(Widget widget) { - if (users.contains(widget)) - return; - users.add(widget); - widget.addDisposeListener(disposeListener); - } - - public static void dispose() { - Iterator it = resources.keySet().iterator(); - while (it.hasNext()) { - Object resource = resources.get(it.next()); - if (resource instanceof Font) - ((Font) resource).dispose(); - else if (resource instanceof Color) - ((Color) resource).dispose(); - else if (resource instanceof Image) - ((Image) resource).dispose(); - else if (resource instanceof Cursor) - ((Cursor) resource).dispose(); - } - resources.clear(); - } - - public static Font getFont(String name, int size, int style) { - return getFont(name, size, style, false, false); - } - - public static Font getFont(String name, int size, int style, boolean strikeout, boolean underline) { - String fontName = name + "|" + size + "|" + style + "|" + strikeout + "|" + underline; - if (resources.containsKey(fontName)) - return (Font) resources.get(fontName); - FontData fd = new FontData(name, size, style); - if (strikeout || underline) { - try { - Class lfCls = Class.forName("org.eclipse.swt.internal.win32.LOGFONT"); - Object lf = FontData.class.getField("data").get(fd); - if (lf != null && lfCls != null) { - if (strikeout) - lfCls.getField("lfStrikeOut").set(lf, new Byte((byte) 1)); - if (underline) - lfCls.getField("lfUnderline").set(lf, new Byte((byte) 1)); - } - } catch (Throwable e) { - System.err.println( - "Unable to set underline or strikeout" + " (probably on a non-Windows platform). " + e); - } - } - Font font = new Font(Display.getDefault(), fd); - resources.put(fontName, font); - return font; - } - - public static Image getImage(String url, Control widget) { - Image img = getImage(url); - if(img != null && widget != null) - img.setBackground(widget.getBackground()); - return img; - } - - public static Image getImage(String url) { - try { - url = url.replace('\\', '/'); - if (url.startsWith("/")) - url = url.substring(1); - if (resources.containsKey(url)) - return (Image) resources.get(url); - Image img = new Image(Display.getDefault(), instance.getClass().getClassLoader().getResourceAsStream(url)); - if (img != null) - resources.put(url, img); - return img; - } catch (Exception e) { - System.err.println("SWTResourceManager.getImage: Error getting image "+url+", "+e); - return null; - } - } - - public static Color getColor(int red, int green, int blue) { - String name = "COLOR:" + red + "," + green + "," + blue; - if (resources.containsKey(name)) - return (Color) resources.get(name); - Color color = new Color(Display.getDefault(), red, green, blue); - resources.put(name, color); - return color; - } - - public static Cursor getCursor(int type) { - String name = "CURSOR:" + type; - if (resources.containsKey(name)) - return (Cursor) resources.get(name); - Cursor cursor = new Cursor(Display.getDefault(), type); - resources.put(name, cursor); - return cursor; - } - -} +package YalpClients.SwtClient.GUI; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Vector; + +import org.eclipse.swt.events.DisposeEvent; +import org.eclipse.swt.events.DisposeListener; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.Cursor; +import org.eclipse.swt.graphics.Font; +import org.eclipse.swt.graphics.FontData; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Widget; + +/* + * Class to manage SWT resources (Font, Color, Image and Cursor) + * There are no restrictions on the use of this code. + * + * You may change this code and your changes will not be overwritten, + * but if you change the version number below then this class will be + * completely overwritten by Jigloo. + * #SWTResourceManager:version4.0.0# + */ +public class SWTResourceManager { + + private static HashMap resources = new HashMap(); + private static Vector users = new Vector(); + private static SWTResourceManager instance = new SWTResourceManager(); + + private static DisposeListener disposeListener = new DisposeListener() { + public void widgetDisposed(DisposeEvent e) { + users.remove(e.getSource()); + if (users.size() == 0) + dispose(); + } + }; + + /* + * This method should be called by *all* Widgets which use resources + * provided by this SWTResourceManager. When widgets are disposed, + * they are removed from the "users" Vector, and when no more + * registered Widgets are left, all resources are disposed. + *

+ * If this method is not called for all Widgets then it should not be called + * at all, and the "dispose" method should be explicitly called after all + * resources are no longer being used. + */ + public static void registerResourceUser(Widget widget) { + if (users.contains(widget)) + return; + users.add(widget); + widget.addDisposeListener(disposeListener); + } + + public static void dispose() { + Iterator it = resources.keySet().iterator(); + while (it.hasNext()) { + Object resource = resources.get(it.next()); + if (resource instanceof Font) + ((Font) resource).dispose(); + else if (resource instanceof Color) + ((Color) resource).dispose(); + else if (resource instanceof Image) + ((Image) resource).dispose(); + else if (resource instanceof Cursor) + ((Cursor) resource).dispose(); + } + resources.clear(); + } + + public static Font getFont(String name, int size, int style) { + return getFont(name, size, style, false, false); + } + + public static Font getFont(String name, int size, int style, boolean strikeout, boolean underline) { + String fontName = name + "|" + size + "|" + style + "|" + strikeout + "|" + underline; + if (resources.containsKey(fontName)) + return (Font) resources.get(fontName); + FontData fd = new FontData(name, size, style); + if (strikeout || underline) { + try { + Class lfCls = Class.forName("org.eclipse.swt.internal.win32.LOGFONT"); + Object lf = FontData.class.getField("data").get(fd); + if (lf != null && lfCls != null) { + if (strikeout) + lfCls.getField("lfStrikeOut").set(lf, new Byte((byte) 1)); + if (underline) + lfCls.getField("lfUnderline").set(lf, new Byte((byte) 1)); + } + } catch (Throwable e) { + System.err.println( + "Unable to set underline or strikeout" + " (probably on a non-Windows platform). " + e); + } + } + Font font = new Font(Display.getDefault(), fd); + resources.put(fontName, font); + return font; + } + + public static Image getImage(String url, Control widget) { + Image img = getImage(url); + if(img != null && widget != null) + img.setBackground(widget.getBackground()); + return img; + } + + public static Image getImage(String url) { + try { + url = url.replace('\\', '/'); + if (url.startsWith("/")) + url = url.substring(1); + if (resources.containsKey(url)) + return (Image) resources.get(url); + Image img = new Image(Display.getDefault(), instance.getClass().getClassLoader().getResourceAsStream(url)); + if (img != null) + resources.put(url, img); + return img; + } catch (Exception e) { + System.err.println("SWTResourceManager.getImage: Error getting image "+url+", "+e); + return null; + } + } + + public static Color getColor(int red, int green, int blue) { + String name = "COLOR:" + red + "," + green + "," + blue; + if (resources.containsKey(name)) + return (Color) resources.get(name); + Color color = new Color(Display.getDefault(), red, green, blue); + resources.put(name, color); + return color; + } + + public static Cursor getCursor(int type) { + String name = "CURSOR:" + type; + if (resources.containsKey(name)) + return (Cursor) resources.get(name); + Cursor cursor = new Cursor(Display.getDefault(), type); + resources.put(name, cursor); + return cursor; + } + +} diff --git a/src/YalpClients/SwtClient/GUI/SortListener.java b/src/YalpClients/SwtClient/GUI/SortListener.java index a2ff35a..78598d6 100644 --- a/src/YalpClients/SwtClient/GUI/SortListener.java +++ b/src/YalpClients/SwtClient/GUI/SortListener.java @@ -1,63 +1,63 @@ -/* - * Copyright (c) 2006 Manuel Traut and Volker Dahnke - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: Manuel Traut and Volker Dahnke - */ - -package YalpClients.SwtClient.GUI; - -import java.text.Collator; -import java.util.Locale; -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.*; - -/* - * Class SortListener - * - * - * - * @author Volker Dahnke / Manuel Traut - * - * @version 1 02-04-2006
- */ -public class SortListener implements Listener{ - private Table table; - private int colum,numColum; - private GUI gui; - - public SortListener(GUI gui,Table table,int colum,int numColum){ - this.colum=colum; - this.numColum=numColum; - this.table=table; - this.gui=gui; - } - - public void handleEvent(Event e) { - TableItem[] items = table.getItems(); - Collator collator = Collator.getInstance(Locale.getDefault()); - for (int i = 1; i < items.length; i++) { - String value1 = items[i].getText(colum); - for (int j = 0; j < i; j++) { - String value2 = items[j].getText(colum); - if (collator.compare(value1, value2) < 0) { - String[] values= new String[numColum]; - for(int g=0;g + * + * @author Volker Dahnke / Manuel Traut + * + * @version 1 02-04-2006
+ */ +public class SortListener implements Listener{ + private Table table; + private int colum,numColum; + private GUI gui; + + public SortListener(GUI gui,Table table,int colum,int numColum){ + this.colum=colum; + this.numColum=numColum; + this.table=table; + this.gui=gui; + } + + public void handleEvent(Event e) { + TableItem[] items = table.getItems(); + Collator collator = Collator.getInstance(Locale.getDefault()); + for (int i = 1; i < items.length; i++) { + String value1 = items[i].getText(colum); + for (int j = 0; j < i; j++) { + String value2 = items[j].getText(colum); + if (collator.compare(value1, value2) < 0) { + String[] values= new String[numColum]; + for(int g=0;g - * - * @author Volker Dahnke / Manuel Traut - * - * @version 1 02-04-2006
- */ -public class StartDialog extends Composite { - - { - //Register as a resource user - SWTResourceManager will - //handle the obtaining and disposing of resources - SWTResourceManager.registerResourceUser(this); - } - private Display display; - private CLabel cLabel1; - private CLabel LogoLabel; - private Model model; - private Composite parent; - private Composite composite; - private CLabel logonLable; - private Button ok; - private Text passwd; - private Text username; - private CLabel passwdLable; - private CLabel usernameLable; - - - public StartDialog(Composite parent,Model model, int style) { - super(parent, style); - - this.parent=parent; - this.model=model; - this.display=Display.getDefault(); - initStartDialog(); - } - - private void initStartDialog(){ - GridLayout thisLayout = new GridLayout(); - thisLayout.makeColumnsEqualWidth = true; - this.setLayout(thisLayout); - this.setSize(300,150); - Listener listener =new Listener() { - public void handleEvent(org.eclipse.swt.widgets.Event evt) { - if (evt.character==SWT.CR){ - OkPressed(); - } - } - }; - addListener(SWT.KeyDown,listener); - { - composite = new Composite(this, SWT.NONE); - FormLayout compositeLayout = new FormLayout(); - composite.setLayout(compositeLayout); - GridData compositeLData = new GridData(); - compositeLData.widthHint = 287; - compositeLData.heightHint = 140; - composite.setLayoutData(compositeLData); - composite.setVisible(true); - composite.addKeyListener(new KeyAdapter() { - public void keyPressed(KeyEvent evt) { - if (evt.character==SWT.CR){ - OkPressed(); - } - } - }); - { - cLabel1 = new CLabel(composite, SWT.NONE); - FormData cLabel1LData = new FormData(); - cLabel1LData.width = 120; - cLabel1LData.height = 20; - cLabel1LData.left = new FormAttachment(0, 1000, 93); - cLabel1LData.top = new FormAttachment(0, 1000, 40); - cLabel1.setLayoutData(cLabel1LData); - Color col =display.getSystemColor(SWT.COLOR_RED); - cLabel1.setForeground(col); - cLabel1.setFont(SWTResourceManager.getFont("Times", 10, 1, false, false)); - } - { - LogoLabel = new CLabel(composite, SWT.NONE); - FormData LogoLabelLData = new FormData(); - LogoLabelLData.width = 70; - LogoLabelLData.height = 42; - LogoLabelLData.left = new FormAttachment(0, 1000, 77); - LogoLabelLData.top = new FormAttachment(0, 1000, 0); - LogoLabelLData.right = new FormAttachment(1000, 1000, -140); - LogoLabelLData.bottom = new FormAttachment(1000, 1000, -98); - LogoLabel.setLayoutData(LogoLabelLData); - LogoLabel.setImage(new Image(this.getDisplay(),"img/yalpV2_mittel.gif")); - } - { - logonLable = new CLabel(composite, SWT.BEGINNING); - logonLable.setText("Login"); - FormData logonLableLData = new FormData(); - logonLableLData.width = 70; - logonLableLData.height = 28; - logonLableLData.left = new FormAttachment(0, 1000, 147); - logonLableLData.top = new FormAttachment(0, 1000, 5); - logonLable.setLayoutData(logonLableLData); - logonLable.setFont(SWTResourceManager.getFont("Times", 14, 1, false, false)); - } - { - username = new Text(composite, SWT.NONE); - FormData usernameLData = new FormData(); - usernameLData.width = 117; - usernameLData.height = 15; - usernameLData.left = new FormAttachment(0, 1000, 120); - usernameLData.top = new FormAttachment(0, 1000, 65); - username.setLayoutData(usernameLData); - username.setFocus(); - username.addKeyListener(new KeyAdapter() { - public void keyPressed(KeyEvent evt) { - if (evt.character==SWT.CR){ - OkPressed(); - } - } - }); - } - { - passwd = new Text(composite, SWT.PASSWORD); - FormData passwdLData = new FormData(); - passwdLData.width = 117; - passwdLData.height = 15; - passwdLData.left = new FormAttachment(0, 1000, 120); - passwdLData.top = new FormAttachment(0, 1000, 88); - passwd.setLayoutData(passwdLData); - passwd.addKeyListener(new KeyAdapter() { - public void keyPressed(KeyEvent evt) { - if (evt.character==SWT.CR){ - OkPressed(); - } - } - }); - } - { - ok = new Button(composite, SWT.PUSH | SWT.CENTER); - ok.setText("OK"); - FormData okLData = new FormData(); - okLData.width = 65; - okLData.height = 21; - okLData.left = new FormAttachment(0, 1000, 110); - okLData.top = new FormAttachment(0, 1000, 115); - ok.setLayoutData(okLData); - ok.setFont(SWTResourceManager.getFont("Times", 10, 1, false, false)); - ok.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent evt) { - OkPressed(); - } - }); - } - { - passwdLable = new CLabel(composite, SWT.NONE); - passwdLable.setText("Password:"); - FormData passwdLableLData = new FormData(); - passwdLableLData.width = 70; - passwdLableLData.height = 20; - passwdLableLData.left = new FormAttachment(0, 1000, 35); - passwdLableLData.top = new FormAttachment(0, 1000, 83); - passwdLable.setLayoutData(passwdLableLData); - passwdLable.setFont(SWTResourceManager.getFont("Times", 10, 0, false, false)); - } - { - usernameLable = new CLabel(composite, SWT.NONE); - usernameLable.setText("Username:"); - FormData usernameLableLData = new FormData(); - usernameLableLData.width = 70; - usernameLableLData.height = 20; - usernameLableLData.left = new FormAttachment(0, 1000, 35); - usernameLableLData.top = new FormAttachment(0, 1000, 60); - usernameLable.setLayoutData(usernameLableLData); - usernameLable.setFont(SWTResourceManager.getFont("Times", 10, 0, false, false)); - } - } - this.layout(); - - } - private void OkPressed(){ - AccessRights kind; - kind = model.userVerify(username.getText(), passwd.getText()); - - if (kind.value() == AccessRights._NO_YALP_SERVER ) { - cLabel1.setText("Server offline"); - } else if (kind.value() == AccessRights._DENY ){ - cLabel1.setText("Access Denied"); - username.setText(""); - passwd.setText(""); - username.setFocus(); - } else { - display.close(); - InitGUI gui = new InitGUI(model, kind); - } - - } - - public void show(){ - ((Shell)this.parent).setImage(new Image(display,"img/yalpV2_klein.gif")); - ((Shell)this.parent).setText("yalp"); - Point size = this.getSize(); - java.awt.Dimension screen = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); - Rectangle shellBounds = this.parent.computeTrim((screen.width-size.x)/2,(screen.height-size.y)/2,size.x,size.y); - this.parent.setLayout(new FillLayout()); - this.parent.layout(); - this.parent.setBounds(shellBounds); - ((Shell)this.parent).open(); - while (!this.parent.isDisposed()) { - if (!display.readAndDispatch()) - display.sleep(); - } - } - - -} +/* + * Copyright (c) 2006 Manuel Traut and Volker Dahnke + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: Manuel Traut and Volker Dahnke + */ + +package YalpClients.SwtClient.GUI; + +import YalpClients.SwtClient.Model; +import YalpInterfaces.AccessRights; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.*; +import org.eclipse.swt.events.*; +import org.eclipse.swt.graphics.*; +import org.eclipse.swt.layout.*; +import org.eclipse.swt.widgets.*; + +/* + * Class StartDialog + * + * + * + * @author Volker Dahnke / Manuel Traut + * + * @version 1 02-04-2006
+ */ +public class StartDialog extends Composite { + + { + //Register as a resource user - SWTResourceManager will + //handle the obtaining and disposing of resources + SWTResourceManager.registerResourceUser(this); + } + private Display display; + private CLabel cLabel1; + private CLabel LogoLabel; + private Model model; + private Composite parent; + private Composite composite; + private CLabel logonLable; + private Button ok; + private Text passwd; + private Text username; + private CLabel passwdLable; + private CLabel usernameLable; + + + public StartDialog(Composite parent,Model model, int style) { + super(parent, style); + + this.parent=parent; + this.model=model; + this.display=Display.getDefault(); + initStartDialog(); + } + + private void initStartDialog(){ + GridLayout thisLayout = new GridLayout(); + thisLayout.makeColumnsEqualWidth = true; + this.setLayout(thisLayout); + this.setSize(300,150); + Listener listener =new Listener() { + public void handleEvent(org.eclipse.swt.widgets.Event evt) { + if (evt.character==SWT.CR){ + OkPressed(); + } + } + }; + addListener(SWT.KeyDown,listener); + { + composite = new Composite(this, SWT.NONE); + FormLayout compositeLayout = new FormLayout(); + composite.setLayout(compositeLayout); + GridData compositeLData = new GridData(); + compositeLData.widthHint = 287; + compositeLData.heightHint = 140; + composite.setLayoutData(compositeLData); + composite.setVisible(true); + composite.addKeyListener(new KeyAdapter() { + public void keyPressed(KeyEvent evt) { + if (evt.character==SWT.CR){ + OkPressed(); + } + } + }); + { + cLabel1 = new CLabel(composite, SWT.NONE); + FormData cLabel1LData = new FormData(); + cLabel1LData.width = 120; + cLabel1LData.height = 20; + cLabel1LData.left = new FormAttachment(0, 1000, 93); + cLabel1LData.top = new FormAttachment(0, 1000, 40); + cLabel1.setLayoutData(cLabel1LData); + Color col =display.getSystemColor(SWT.COLOR_RED); + cLabel1.setForeground(col); + cLabel1.setFont(SWTResourceManager.getFont("Times", 10, 1, false, false)); + } + { + LogoLabel = new CLabel(composite, SWT.NONE); + FormData LogoLabelLData = new FormData(); + LogoLabelLData.width = 70; + LogoLabelLData.height = 42; + LogoLabelLData.left = new FormAttachment(0, 1000, 77); + LogoLabelLData.top = new FormAttachment(0, 1000, 0); + LogoLabelLData.right = new FormAttachment(1000, 1000, -140); + LogoLabelLData.bottom = new FormAttachment(1000, 1000, -98); + LogoLabel.setLayoutData(LogoLabelLData); + LogoLabel.setImage(new Image(this.getDisplay(),"img/yalpV2_mittel.gif")); + } + { + logonLable = new CLabel(composite, SWT.BEGINNING); + logonLable.setText("Login"); + FormData logonLableLData = new FormData(); + logonLableLData.width = 70; + logonLableLData.height = 28; + logonLableLData.left = new FormAttachment(0, 1000, 147); + logonLableLData.top = new FormAttachment(0, 1000, 5); + logonLable.setLayoutData(logonLableLData); + logonLable.setFont(SWTResourceManager.getFont("Times", 14, 1, false, false)); + } + { + username = new Text(composite, SWT.NONE); + FormData usernameLData = new FormData(); + usernameLData.width = 117; + usernameLData.height = 15; + usernameLData.left = new FormAttachment(0, 1000, 120); + usernameLData.top = new FormAttachment(0, 1000, 65); + username.setLayoutData(usernameLData); + username.setFocus(); + username.addKeyListener(new KeyAdapter() { + public void keyPressed(KeyEvent evt) { + if (evt.character==SWT.CR){ + OkPressed(); + } + } + }); + } + { + passwd = new Text(composite, SWT.PASSWORD); + FormData passwdLData = new FormData(); + passwdLData.width = 117; + passwdLData.height = 15; + passwdLData.left = new FormAttachment(0, 1000, 120); + passwdLData.top = new FormAttachment(0, 1000, 88); + passwd.setLayoutData(passwdLData); + passwd.addKeyListener(new KeyAdapter() { + public void keyPressed(KeyEvent evt) { + if (evt.character==SWT.CR){ + OkPressed(); + } + } + }); + } + { + ok = new Button(composite, SWT.PUSH | SWT.CENTER); + ok.setText("OK"); + FormData okLData = new FormData(); + okLData.width = 65; + okLData.height = 21; + okLData.left = new FormAttachment(0, 1000, 110); + okLData.top = new FormAttachment(0, 1000, 115); + ok.setLayoutData(okLData); + ok.setFont(SWTResourceManager.getFont("Times", 10, 1, false, false)); + ok.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent evt) { + OkPressed(); + } + }); + } + { + passwdLable = new CLabel(composite, SWT.NONE); + passwdLable.setText("Password:"); + FormData passwdLableLData = new FormData(); + passwdLableLData.width = 70; + passwdLableLData.height = 20; + passwdLableLData.left = new FormAttachment(0, 1000, 35); + passwdLableLData.top = new FormAttachment(0, 1000, 83); + passwdLable.setLayoutData(passwdLableLData); + passwdLable.setFont(SWTResourceManager.getFont("Times", 10, 0, false, false)); + } + { + usernameLable = new CLabel(composite, SWT.NONE); + usernameLable.setText("Username:"); + FormData usernameLableLData = new FormData(); + usernameLableLData.width = 70; + usernameLableLData.height = 20; + usernameLableLData.left = new FormAttachment(0, 1000, 35); + usernameLableLData.top = new FormAttachment(0, 1000, 60); + usernameLable.setLayoutData(usernameLableLData); + usernameLable.setFont(SWTResourceManager.getFont("Times", 10, 0, false, false)); + } + } + this.layout(); + + } + private void OkPressed(){ + AccessRights kind; + kind = model.userVerify(username.getText(), passwd.getText()); + + if (kind.value() == AccessRights._NO_YALP_SERVER ) { + cLabel1.setText("Server offline"); + } else if (kind.value() == AccessRights._DENY ){ + cLabel1.setText("Access Denied"); + username.setText(""); + passwd.setText(""); + username.setFocus(); + } else { + display.close(); + InitGUI gui = new InitGUI(model, kind); + } + + } + + public void show(){ + ((Shell)this.parent).setImage(new Image(display,"img/yalpV2_klein.gif")); + ((Shell)this.parent).setText("yalp"); + Point size = this.getSize(); + java.awt.Dimension screen = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); + Rectangle shellBounds = this.parent.computeTrim((screen.width-size.x)/2,(screen.height-size.y)/2,size.x,size.y); + this.parent.setLayout(new FillLayout()); + this.parent.layout(); + this.parent.setBounds(shellBounds); + ((Shell)this.parent).open(); + while (!this.parent.isDisposed()) { + if (!display.readAndDispatch()) + display.sleep(); + } + } + + +} diff --git a/src/YalpClients/SwtClient/Model.java b/src/YalpClients/SwtClient/Model.java index 5423dc4..0ebc09c 100755 --- a/src/YalpClients/SwtClient/Model.java +++ b/src/YalpClients/SwtClient/Model.java @@ -1,759 +1,759 @@ -/* - * Copyright (c) 2006 Manuel Traut and Volker Dahnke - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: Manuel Traut and Volker Dahnke - */ - -package YalpClients.SwtClient; - -import YalpInterfaces.*; -import YalpClients.*; - -import java.beans.XMLDecoder; -import java.beans.XMLEncoder; -import java.io.*; -import java.net.Inet4Address; -import java.net.MalformedURLException; -import java.net.UnknownHostException; -import java.sql.SQLException; -import java.util.ArrayList; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.MessageBox; -import org.eclipse.swt.widgets.Shell; - -import org.omg.CosNaming.*; -import org.omg.CosNaming.NamingContextPackage.*; -import org.omg.CORBA.*; - -/* - * Class Model - * - * Implementiert die Schnittstellenfunktionen zur Steuerung des Servers - * (Datenbankinhalte schreiben, lesen; Streaming steuern - * - * @author Volker Dahnke / Manuel Traut - * - * @version 0.6 14-12-2005
- * - * @see client.GUI - */ - -public class Model { - - public ServerControlInterface srvCon; - private Process vlcPlayer; - private Output actualStream = new Output(); - private Output streamInfo = new Output(); - private ArrayList findMedia = new ArrayList(); - private ArrayList editMedia = new ArrayList(); - private ArrayList toPlaylist = new ArrayList(); - private ArrayList playList = new ArrayList(); - private ArrayList userList = new ArrayList(); - private ClientConfiguration settings; - private String clientIP; - private String curPasswd; - private AccessRights userGroup=AccessRights.DENY; - private String userName; - private Boolean playback = false; - private Boolean logoff= false; - private Session session = new Session(); -/* - * Instances srvConnection to Registry, DbConnection, ServerControl - * and VlcStreamer. Also instances Class variables - */ - public Model(String[] argv) { - - this.settings=new ClientConfiguration(); - loadConfig("ClientConfiguration.xml"); - writeConfig("ClientConfiguration.xml"); - - try { - ORB orb = ORB.init(argv, null); - - org.omg.CORBA.Object objRef = - orb.resolve_initial_references("NameService"); - - NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef); - - String name = "YALP_Server"; - srvCon = ServerControlInterfaceHelper.narrow(ncRef.resolve_str(name)); - } catch (Exception e) {// DEBUG - String errorStr="couldn't connect to YALP Server"; - - MessageBox messageBox = new MessageBox( - new Shell(Display.getDefault(),SWT.MIN), SWT.OK ); - - System.out.println(e); - messageBox.setMessage(errorStr); - messageBox.open(); - System.exit(0); - } - - // determine client IP Adress - try { - this.clientIP = Inet4Address.getLocalHost().getHostAddress(); - System.out.println(this.clientIP); - } catch (UnknownHostException e) { - String errorStr = "Model.model: determine IP failed"; - - MessageBox messageBox = new MessageBox( - new Shell(Display.getDefault(),SWT.MIN), SWT.OK ); - - System.out.println(errorStr); - messageBox.setMessage(errorStr); - messageBox.open(); - System.exit(0); - } - this.userList = new ArrayList(); - this.playList = new ArrayList(); - this.toPlaylist = new ArrayList(); - } - -/* - * write Configuration to XML File - * - * @param fileName - * @return boolean: true if succesful - */ - public boolean writeConfig(String fileName) { - try { - FileOutputStream srvConfigFile = new FileOutputStream(fileName); - XMLEncoder srvConfigWriter = new XMLEncoder(srvConfigFile); - srvConfigWriter.writeObject(settings.serverIP); - srvConfigWriter.writeObject(settings.classServerPort); - srvConfigWriter.writeObject(settings.registryPort); - srvConfigWriter.writeObject(settings.vlcCommand); - srvConfigWriter.close(); - } catch (FileNotFoundException fnfe) { - return false; - } - return true; - } - -/* - * load Configuration from XML File if possible - * - * @param fileName - * @return boolean: true if succesful - */ - public boolean loadConfig(String fileName){ - try{ - FileInputStream srvConfigFile = new FileInputStream(fileName); - XMLDecoder srvConfigLoader = new XMLDecoder(srvConfigFile); - System.out.println(srvConfigFile); - settings.serverIP = (String)srvConfigLoader.readObject(); - settings.classServerPort= (Integer)srvConfigLoader.readObject(); - settings.registryPort = (Integer)srvConfigLoader.readObject(); - settings.vlcCommand = (String)srvConfigLoader.readObject(); - srvConfigLoader.close(); - } catch(FileNotFoundException fnfe) { - System.out.println("Configuration not found, loading defaults..."); - return false; - } catch(ClassCastException cce) { - System.out.println("Errors in Configuration, loading defaults..."); - return false; - } - return true; - } - -/* - * get acutal srvConfig object - * - * @return ClientConfiguration: aktuelle Konfiguration - */ - public ClientConfiguration getConfig(){ - return this.settings; - } - -/* - * setzen und speichern eines ClientConfiguration Files - * - * @param set - * ClientConfiguration.xml - * @return boolean: true if succesful written Configuration - */ - public boolean setConfig(ClientConfiguration set){ - this.settings = set; - return this.writeConfig("ClientConfiguration.xml"); - } - -/* - * Sends YalpUsername and passwd to Server and returns YalpUsergroup - * - * @param username - * @param passwd - * @return AccessRights - */ - public AccessRights userVerify(String username,String passwd){ - this.userName=username; - this.curPasswd = passwd; - YalpErrorHolder err = new YalpErrorHolder(); - SessionHolder sess = new SessionHolder(); - try{ - // log on server - this.srvCon.clientLogon(this.userName,passwd,this.clientIP,sess,err); - this.session = sess.value; - this.userGroup = sess.value.me.level; - /* - } catch (RemoteException e) { - System.out.println("client.Model: Logon on Server failed 1"+ e); - e.printStackTrace(); - System.out.println("client.Model: Logon on Server failed 1"); - } catch (MalformedURLException e) { - System.out.println("client.Model: Logon on Server failed 2"); - } catch (SQLException e) { - System.out.println("client.Model: Logon on Server failed 3"); - } catch (NotBoundException e) { - System.out.println("client.Model: Logon on Server failed 4"); - */ - }catch(NullPointerException e){ - System.out.println("YALP Server couldn't be reached"); - this.userGroup = AccessRights.NO_YALP_SERVER; - } - return this.userGroup; - } - -/* - * Gets a list with all YalpUsers from the server - * - * @return ArrayList all registered YalpUsers - */ - public ArrayList getUser(){ - YalpErrorHolder err = new YalpErrorHolder(); - try{ - UsersHolder usr = new UsersHolder(); - this.srvCon.getUser(usr, err); - this.userList = new ArrayList(usr.value.length); - for(int i = 0; i < usr.value.length; i++) - this.userList.add(usr.value[i]); - }catch(Exception e){ - System.out.println("Exceoption in Model userList "+ e); - } - return userList; - } - -/* - * Sends User change request to server - * - * @param user - * Configuration with changes on specific YalpUser - */ - public void changeUser(YalpUser user, String passwd, Action action) { - YalpErrorHolder err = new YalpErrorHolder(); - try{ - this.srvCon.changeUser( user, - passwd, - action, - err ); - System.out.println(err.value.descr); - }catch(Exception e){ - System.out.println("Exceoption in Model changeUser "+ e); - } - } - -/* - * Sends Media change request to server and refreshes Model data - * - * @param media - * to change - * @return boolean: succesful changed media - */ - public Boolean changeMedia(Media media, Action action){ - YalpErrorHolder err = new YalpErrorHolder(); - try{ - this.srvCon.changeMedia(media, action, err); - if(err.value.code == YalpErrorCode.OK){ - Media result; - for (int i=0;i: ArrayList to create Playlist from - */ - public ArrayList getToPlaylist(){ - return this.toPlaylist; - } - -/* - * Creates new Stream with actual playlist - * - * @return Streaminfo: about new created Stream, Client should use this, - * information to get the Information howto receive the stream - */ - public Output createOutput(){ - /* t.b.d. former createStream */ - streamInfo.outputAction = Action.CREATE; - Media[] a = {}; - streamInfo.playlist = this.playList.toArray(a); - return this.streamInfo; - } - -/* - * Sends search request to server and refreshes Model data - * - * @param request - * Search Request - * @param kind - * 1 - search in first Window; other ints: search in other window - * (admins edit view) - * @return int: number of results - */ - public int search(String request, ArrayList types, int kind){ - YalpErrorHolder err = new YalpErrorHolder(); - MediasHolder result = new MediasHolder(); - try{ - MediaType[] a = {}; - if (kind == 1){ - srvCon.search(request, types.toArray(a), result, err); - for(int i = 0; i < result.value.length; i++) - findMedia.add(result.value[i]); - return findMedia.size(); - } else { - srvCon.search(request, types.toArray(a), result, err); - for(int i = 0; i < result.value.length; i++) - editMedia.add(result.value[i]); - return editMedia.size(); - } - } catch(Exception e){ - e.printStackTrace(); - System.out.println("Exceoption in Model search "+ e); - return 0; - } - } - -/* - * Returns the search result - * - * @param kind - * 1 - for searchMedia of mainwindow; 2 - for searchMedia of editView - * @return ArrayList: last found medias - */ - - public ArrayList getMedia(int kind){ - if (kind==1) return this.findMedia; - else return this.editMedia; - } - -/* - * Retuns search result with given id - * - * @param id - * of the result - * @param kind - * 1 - for mainWindow, 2 for admins editView - * @return Media: searchMedia, with specified ID - */ - public Media getMediaWithId(int id,int kind){ - ArrayList resultList; - if (kind==1)resultList= this.findMedia; - else resultList=this.editMedia; - for (int i=0;(i ownerList =this.userList; - for (YalpUser owner:ownerList){ - if (owner.name.equals(username)){ - return owner.id; - } - } - return 0; - } - -/* - * Returns MediaType as string - * - * @param mediatype - * @return string - */ - public String getTypeName(MediaType type) - { - switch(type.value()) - { - case MediaType._IMAGE: - return "image"; - case MediaType._SOUND: - return "sound"; - case MediaType._VIDEO: - return "video"; - default: - return "unknown"; - } - } - -/* - * Returns AccessRights as string - * - * @param mediatype - * @return string - */ - public String accessRightsName(AccessRights type) - { - switch(type.value()) - { - case AccessRights._USER: - return "user"; - case AccessRights._ADMIN: - return "admin"; - case AccessRights._DENY: - return "no login"; - default: - return "unknown"; - } - } - - -/* - * Sets class variable actualStream to given value - * - * @param aStream - * stream to srvControl via play, pause, etc - */ - public void setActualStream(Output aStream){ - actualStream = aStream; - } - -/* - * Starts Video Lan Player - * - * @return boolean: true if vlc can be started and a stream is actualStream - */ - private boolean startVLC(){ - - String vlcCmd = "/usr/bin/vlc" + - " --ignore-config --no-qt-privacy-ask --video-on-top --qt-display-mode=2"; - //settings.vlcCommand -/* - switch (this.actualStream.getAccess()){ - case UDP: - */ - vlcCmd += " udp://@:"; - /* - break; - case HTTP: - vlcCmd += "http://"; - break; - default: - System.out.println( - "client.Model.startVLC: playback this type is not supported" ); - } -*/ - vlcCmd += "9993"; // actualStream.info.params; - System.out.println(vlcCmd); - - try { - this.vlcPlayer = Runtime.getRuntime().exec(vlcCmd); - } catch (IOException e) { - System.out.println("client.Model.startVLC: starting vlcPlayer failed"); - return false; - } - return true; - } - -/* - * Stops Video Lan Player - * - */ - private void stopVLC(){ - playback = false; - if(vlcPlayer != null) - vlcPlayer.destroy(); - } - -/* - * Starts playback of actual playlist - * - * @return void - */ - public boolean play(){ - - playback = true; - - actualStream.outputAction = Action.CREATE; - actualStream.info = new AccessInfo( "bam", - "bam", - "vlc", - "params", - AccessType.STREAM ); - - Media[] a = new Media[playList.size()]; - actualStream.playlist = playList.toArray(a); - actualStream.destIp = clientIP; - - YalpErrorHolder err = new YalpErrorHolder(); - - OutputHolder tmp = new OutputHolder(); - tmp.value = actualStream; - - srvCon.control(tmp, err); - actualStream = tmp.value; - - actualStream.outputAction = Action.START; - OutputHolder tmp2 = new OutputHolder(actualStream); - srvCon.control(tmp2, err); - actualStream = tmp2.value; - startVLC(); - return true; - } - -/* - * Adds a new Media to Playlist. Only during playback - * - * @param name - * @param path - * @return boolean: true if succesful added - */ - public boolean add2Stream(String name, String path){ - - YalpErrorHolder err = new YalpErrorHolder(); - Media[] empty = {}; - this.actualStream.playlist = empty; - - Media media = new Media(); - media.path = path; - media.fileName = name; - - this.actualStream.playlist[this.actualStream.playlist.length] = media; - this.actualStream.outputAction = Action.CREATE; - - OutputHolder tmp = new OutputHolder(this.actualStream); - this.srvCon.control(tmp, err); - this.actualStream = tmp.value; - return true; - } - -/* - * Stops playback - * - * @return boolean: false - if srvConnection to streamer failed - */ - public boolean stop(){ - YalpErrorHolder err = new YalpErrorHolder(); - this.actualStream.outputAction = Action.STOP; - OutputHolder tmp = new OutputHolder(this.actualStream); - this.srvCon.control(tmp,err); - this.actualStream = tmp.value; - this.stopVLC(); - return true; - } - -/* - * jumps to next media in playlist - * - * @return boolean: false - if srvConnection to streamer failed - */ - public boolean next(){ - YalpErrorHolder err = new YalpErrorHolder(); - this.actualStream.outputAction = Action.FORWARD; - OutputHolder tmp = new OutputHolder(this.actualStream); - this.srvCon.control(tmp,err); - this.actualStream = tmp.value; - return true; - } - -/* - * Pauses playback - * - * @return boolean: false - if srvConnection to streamer failed - */ - public boolean pause(){ - YalpErrorHolder err = new YalpErrorHolder(); - this.actualStream.outputAction = Action.PAUSE; - OutputHolder tmp = new OutputHolder(this.actualStream); - this.srvCon.control(tmp,err); - this.actualStream = tmp.value; - return true; - } - -/* - * Causes the server to clean up and shutdown - * - */ - public void serverShutdown(){ - if (this.playback) - this.stop(); - this.srvCon.serverShutdown(); - } - -/* - * Checks if the server is still alive if not Client shutdown - * - */ - public void serverStillAlive(){ - // try{ - // srvCon.ping(); - /* }catch (RemoteException e){ - if (this.playback) - this.stopVLC(); - String errorStr="Server shutdown - Client is going down too"; - - MessageBox messageBox = new MessageBox( - new Shell(Display.getDefault(),SWT.MIN), SWT.OK); - - System.out.println(errorStr); - messageBox.setMessage(errorStr); - messageBox.open(); - System.exit(0); - } */ - } - -/* - * Returns client IP address - * - * @return String: ipAddress - */ - public String getClientIp(){ - return this.clientIP; - } - -/* - * Returns username of logged in user - * - * @return String: username - */ - public String getYalpUserName(){ - return this.userName; - } - -/* - * Returns indication if playback is runing - * - * @return boolean: true - if is play'in - */ - public Boolean getPlayback(){ - return this.playback; - } - -/* - * Get Total amount of streams played - * - * @return int: number of Streams totally played - * - public int getAllStreamNum(){ - try{ - return this.srvCon.getStreamCounter().getAllStreams(); - }catch (Exception e){ - System.out.println("Exception in Model.getAllStreamNum"+e); - } - return -1; - } - */ - -/* - * Gets amount of Streams actual playing - * - * @return int: number of Streams play'in at the moment - * - public int getActualStreamNum(){ - try{ - return this.srvCon.getStreamCounter().getActualStreams(); - }catch (Exception e){ - System.out.println("Exception in Model.getActualStreamNum"+e); - } - return -1; - } - */ - -/* - * Sets class variable logoff to true and logs off from server - */ - public void logoff(){ - YalpErrorHolder err = new YalpErrorHolder(); - try{ - this.logoff=true; - this.srvCon.clientLogoff(this.session, err); - }catch(Exception e) {// DEBUG - System.out.println("Model Exeptions in logoff"); - e.printStackTrace(); - } - } - -/* - * Returns indication if client is logging of - * - * @return Boolean: true - if is logging of - */ - public Boolean getLogoff(){ - return this.logoff; - } -} +/* + * Copyright (c) 2006 Manuel Traut and Volker Dahnke + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: Manuel Traut and Volker Dahnke + */ + +package YalpClients.SwtClient; + +import YalpInterfaces.*; +import YalpClients.*; + +import java.beans.XMLDecoder; +import java.beans.XMLEncoder; +import java.io.*; +import java.net.Inet4Address; +import java.net.MalformedURLException; +import java.net.UnknownHostException; +import java.sql.SQLException; +import java.util.ArrayList; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.MessageBox; +import org.eclipse.swt.widgets.Shell; + +import org.omg.CosNaming.*; +import org.omg.CosNaming.NamingContextPackage.*; +import org.omg.CORBA.*; + +/* + * Class Model + * + * Implementiert die Schnittstellenfunktionen zur Steuerung des Servers + * (Datenbankinhalte schreiben, lesen; Streaming steuern + * + * @author Volker Dahnke / Manuel Traut + * + * @version 0.6 14-12-2005
+ * + * @see client.GUI + */ + +public class Model { + + public ServerControlInterface srvCon; + private Process vlcPlayer; + private Output actualStream = new Output(); + private Output streamInfo = new Output(); + private ArrayList findMedia = new ArrayList(); + private ArrayList editMedia = new ArrayList(); + private ArrayList toPlaylist = new ArrayList(); + private ArrayList playList = new ArrayList(); + private ArrayList userList = new ArrayList(); + private ClientConfiguration settings; + private String clientIP; + private String curPasswd; + private AccessRights userGroup=AccessRights.DENY; + private String userName; + private Boolean playback = false; + private Boolean logoff= false; + private Session session = new Session(); +/* + * Instances srvConnection to Registry, DbConnection, ServerControl + * and VlcStreamer. Also instances Class variables + */ + public Model(String[] argv) { + + this.settings=new ClientConfiguration(); + loadConfig("ClientConfiguration.xml"); + writeConfig("ClientConfiguration.xml"); + + try { + ORB orb = ORB.init(argv, null); + + org.omg.CORBA.Object objRef = + orb.resolve_initial_references("NameService"); + + NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef); + + String name = "YALP_Server"; + srvCon = ServerControlInterfaceHelper.narrow(ncRef.resolve_str(name)); + } catch (Exception e) {// DEBUG + String errorStr="couldn't connect to YALP Server"; + + MessageBox messageBox = new MessageBox( + new Shell(Display.getDefault(),SWT.MIN), SWT.OK ); + + System.out.println(e); + messageBox.setMessage(errorStr); + messageBox.open(); + System.exit(0); + } + + // determine client IP Adress + try { + this.clientIP = Inet4Address.getLocalHost().getHostAddress(); + System.out.println(this.clientIP); + } catch (UnknownHostException e) { + String errorStr = "Model.model: determine IP failed"; + + MessageBox messageBox = new MessageBox( + new Shell(Display.getDefault(),SWT.MIN), SWT.OK ); + + System.out.println(errorStr); + messageBox.setMessage(errorStr); + messageBox.open(); + System.exit(0); + } + this.userList = new ArrayList(); + this.playList = new ArrayList(); + this.toPlaylist = new ArrayList(); + } + +/* + * write Configuration to XML File + * + * @param fileName + * @return boolean: true if succesful + */ + public boolean writeConfig(String fileName) { + try { + FileOutputStream srvConfigFile = new FileOutputStream(fileName); + XMLEncoder srvConfigWriter = new XMLEncoder(srvConfigFile); + srvConfigWriter.writeObject(settings.serverIP); + srvConfigWriter.writeObject(settings.classServerPort); + srvConfigWriter.writeObject(settings.registryPort); + srvConfigWriter.writeObject(settings.vlcCommand); + srvConfigWriter.close(); + } catch (FileNotFoundException fnfe) { + return false; + } + return true; + } + +/* + * load Configuration from XML File if possible + * + * @param fileName + * @return boolean: true if succesful + */ + public boolean loadConfig(String fileName){ + try{ + FileInputStream srvConfigFile = new FileInputStream(fileName); + XMLDecoder srvConfigLoader = new XMLDecoder(srvConfigFile); + System.out.println(srvConfigFile); + settings.serverIP = (String)srvConfigLoader.readObject(); + settings.classServerPort= (Integer)srvConfigLoader.readObject(); + settings.registryPort = (Integer)srvConfigLoader.readObject(); + settings.vlcCommand = (String)srvConfigLoader.readObject(); + srvConfigLoader.close(); + } catch(FileNotFoundException fnfe) { + System.out.println("Configuration not found, loading defaults..."); + return false; + } catch(ClassCastException cce) { + System.out.println("Errors in Configuration, loading defaults..."); + return false; + } + return true; + } + +/* + * get acutal srvConfig object + * + * @return ClientConfiguration: aktuelle Konfiguration + */ + public ClientConfiguration getConfig(){ + return this.settings; + } + +/* + * setzen und speichern eines ClientConfiguration Files + * + * @param set + * ClientConfiguration.xml + * @return boolean: true if succesful written Configuration + */ + public boolean setConfig(ClientConfiguration set){ + this.settings = set; + return this.writeConfig("ClientConfiguration.xml"); + } + +/* + * Sends YalpUsername and passwd to Server and returns YalpUsergroup + * + * @param username + * @param passwd + * @return AccessRights + */ + public AccessRights userVerify(String username,String passwd){ + this.userName=username; + this.curPasswd = passwd; + YalpErrorHolder err = new YalpErrorHolder(); + SessionHolder sess = new SessionHolder(); + try{ + // log on server + this.srvCon.clientLogon(this.userName,passwd,this.clientIP,sess,err); + this.session = sess.value; + this.userGroup = sess.value.me.level; + /* + } catch (RemoteException e) { + System.out.println("client.Model: Logon on Server failed 1"+ e); + e.printStackTrace(); + System.out.println("client.Model: Logon on Server failed 1"); + } catch (MalformedURLException e) { + System.out.println("client.Model: Logon on Server failed 2"); + } catch (SQLException e) { + System.out.println("client.Model: Logon on Server failed 3"); + } catch (NotBoundException e) { + System.out.println("client.Model: Logon on Server failed 4"); + */ + }catch(NullPointerException e){ + System.out.println("YALP Server couldn't be reached"); + this.userGroup = AccessRights.NO_YALP_SERVER; + } + return this.userGroup; + } + +/* + * Gets a list with all YalpUsers from the server + * + * @return ArrayList all registered YalpUsers + */ + public ArrayList getUser(){ + YalpErrorHolder err = new YalpErrorHolder(); + try{ + UsersHolder usr = new UsersHolder(); + this.srvCon.getUser(usr, err); + this.userList = new ArrayList(usr.value.length); + for(int i = 0; i < usr.value.length; i++) + this.userList.add(usr.value[i]); + }catch(Exception e){ + System.out.println("Exceoption in Model userList "+ e); + } + return userList; + } + +/* + * Sends User change request to server + * + * @param user + * Configuration with changes on specific YalpUser + */ + public void changeUser(YalpUser user, String passwd, Action action) { + YalpErrorHolder err = new YalpErrorHolder(); + try{ + this.srvCon.changeUser( user, + passwd, + action, + err ); + System.out.println(err.value.descr); + }catch(Exception e){ + System.out.println("Exceoption in Model changeUser "+ e); + } + } + +/* + * Sends Media change request to server and refreshes Model data + * + * @param media + * to change + * @return boolean: succesful changed media + */ + public Boolean changeMedia(Media media, Action action){ + YalpErrorHolder err = new YalpErrorHolder(); + try{ + this.srvCon.changeMedia(media, action, err); + if(err.value.code == YalpErrorCode.OK){ + Media result; + for (int i=0;i: ArrayList to create Playlist from + */ + public ArrayList getToPlaylist(){ + return this.toPlaylist; + } + +/* + * Creates new Stream with actual playlist + * + * @return Streaminfo: about new created Stream, Client should use this, + * information to get the Information howto receive the stream + */ + public Output createOutput(){ + /* t.b.d. former createStream */ + streamInfo.outputAction = Action.CREATE; + Media[] a = {}; + streamInfo.playlist = this.playList.toArray(a); + return this.streamInfo; + } + +/* + * Sends search request to server and refreshes Model data + * + * @param request + * Search Request + * @param kind + * 1 - search in first Window; other ints: search in other window + * (admins edit view) + * @return int: number of results + */ + public int search(String request, ArrayList types, int kind){ + YalpErrorHolder err = new YalpErrorHolder(); + MediasHolder result = new MediasHolder(); + try{ + MediaType[] a = {}; + if (kind == 1){ + srvCon.search(request, types.toArray(a), result, err); + for(int i = 0; i < result.value.length; i++) + findMedia.add(result.value[i]); + return findMedia.size(); + } else { + srvCon.search(request, types.toArray(a), result, err); + for(int i = 0; i < result.value.length; i++) + editMedia.add(result.value[i]); + return editMedia.size(); + } + } catch(Exception e){ + e.printStackTrace(); + System.out.println("Exceoption in Model search "+ e); + return 0; + } + } + +/* + * Returns the search result + * + * @param kind + * 1 - for searchMedia of mainwindow; 2 - for searchMedia of editView + * @return ArrayList: last found medias + */ + + public ArrayList getMedia(int kind){ + if (kind==1) return this.findMedia; + else return this.editMedia; + } + +/* + * Retuns search result with given id + * + * @param id + * of the result + * @param kind + * 1 - for mainWindow, 2 for admins editView + * @return Media: searchMedia, with specified ID + */ + public Media getMediaWithId(int id,int kind){ + ArrayList resultList; + if (kind==1)resultList= this.findMedia; + else resultList=this.editMedia; + for (int i=0;(i ownerList =this.userList; + for (YalpUser owner:ownerList){ + if (owner.name.equals(username)){ + return owner.id; + } + } + return 0; + } + +/* + * Returns MediaType as string + * + * @param mediatype + * @return string + */ + public String getTypeName(MediaType type) + { + switch(type.value()) + { + case MediaType._IMAGE: + return "image"; + case MediaType._SOUND: + return "sound"; + case MediaType._VIDEO: + return "video"; + default: + return "unknown"; + } + } + +/* + * Returns AccessRights as string + * + * @param mediatype + * @return string + */ + public String accessRightsName(AccessRights type) + { + switch(type.value()) + { + case AccessRights._USER: + return "user"; + case AccessRights._ADMIN: + return "admin"; + case AccessRights._DENY: + return "no login"; + default: + return "unknown"; + } + } + + +/* + * Sets class variable actualStream to given value + * + * @param aStream + * stream to srvControl via play, pause, etc + */ + public void setActualStream(Output aStream){ + actualStream = aStream; + } + +/* + * Starts Video Lan Player + * + * @return boolean: true if vlc can be started and a stream is actualStream + */ + private boolean startVLC(){ + + String vlcCmd = "/usr/bin/vlc" + + " --ignore-config --no-qt-privacy-ask --video-on-top --qt-display-mode=2"; + //settings.vlcCommand +/* + switch (this.actualStream.getAccess()){ + case UDP: + */ + vlcCmd += " udp://@:"; + /* + break; + case HTTP: + vlcCmd += "http://"; + break; + default: + System.out.println( + "client.Model.startVLC: playback this type is not supported" ); + } +*/ + vlcCmd += "9993"; // actualStream.info.params; + System.out.println(vlcCmd); + + try { + this.vlcPlayer = Runtime.getRuntime().exec(vlcCmd); + } catch (IOException e) { + System.out.println("client.Model.startVLC: starting vlcPlayer failed"); + return false; + } + return true; + } + +/* + * Stops Video Lan Player + * + */ + private void stopVLC(){ + playback = false; + if(vlcPlayer != null) + vlcPlayer.destroy(); + } + +/* + * Starts playback of actual playlist + * + * @return void + */ + public boolean play(){ + + playback = true; + + actualStream.outputAction = Action.CREATE; + actualStream.info = new AccessInfo( "bam", + "bam", + "vlc", + "params", + AccessType.STREAM ); + + Media[] a = new Media[playList.size()]; + actualStream.playlist = playList.toArray(a); + actualStream.destIp = clientIP; + + YalpErrorHolder err = new YalpErrorHolder(); + + OutputHolder tmp = new OutputHolder(); + tmp.value = actualStream; + + srvCon.control(tmp, err); + actualStream = tmp.value; + + actualStream.outputAction = Action.START; + OutputHolder tmp2 = new OutputHolder(actualStream); + srvCon.control(tmp2, err); + actualStream = tmp2.value; + startVLC(); + return true; + } + +/* + * Adds a new Media to Playlist. Only during playback + * + * @param name + * @param path + * @return boolean: true if succesful added + */ + public boolean add2Stream(String name, String path){ + + YalpErrorHolder err = new YalpErrorHolder(); + Media[] empty = {}; + this.actualStream.playlist = empty; + + Media media = new Media(); + media.path = path; + media.fileName = name; + + this.actualStream.playlist[this.actualStream.playlist.length] = media; + this.actualStream.outputAction = Action.CREATE; + + OutputHolder tmp = new OutputHolder(this.actualStream); + this.srvCon.control(tmp, err); + this.actualStream = tmp.value; + return true; + } + +/* + * Stops playback + * + * @return boolean: false - if srvConnection to streamer failed + */ + public boolean stop(){ + YalpErrorHolder err = new YalpErrorHolder(); + this.actualStream.outputAction = Action.STOP; + OutputHolder tmp = new OutputHolder(this.actualStream); + this.srvCon.control(tmp,err); + this.actualStream = tmp.value; + this.stopVLC(); + return true; + } + +/* + * jumps to next media in playlist + * + * @return boolean: false - if srvConnection to streamer failed + */ + public boolean next(){ + YalpErrorHolder err = new YalpErrorHolder(); + this.actualStream.outputAction = Action.FORWARD; + OutputHolder tmp = new OutputHolder(this.actualStream); + this.srvCon.control(tmp,err); + this.actualStream = tmp.value; + return true; + } + +/* + * Pauses playback + * + * @return boolean: false - if srvConnection to streamer failed + */ + public boolean pause(){ + YalpErrorHolder err = new YalpErrorHolder(); + this.actualStream.outputAction = Action.PAUSE; + OutputHolder tmp = new OutputHolder(this.actualStream); + this.srvCon.control(tmp,err); + this.actualStream = tmp.value; + return true; + } + +/* + * Causes the server to clean up and shutdown + * + */ + public void serverShutdown(){ + if (this.playback) + this.stop(); + this.srvCon.serverShutdown(); + } + +/* + * Checks if the server is still alive if not Client shutdown + * + */ + public void serverStillAlive(){ + // try{ + // srvCon.ping(); + /* }catch (RemoteException e){ + if (this.playback) + this.stopVLC(); + String errorStr="Server shutdown - Client is going down too"; + + MessageBox messageBox = new MessageBox( + new Shell(Display.getDefault(),SWT.MIN), SWT.OK); + + System.out.println(errorStr); + messageBox.setMessage(errorStr); + messageBox.open(); + System.exit(0); + } */ + } + +/* + * Returns client IP address + * + * @return String: ipAddress + */ + public String getClientIp(){ + return this.clientIP; + } + +/* + * Returns username of logged in user + * + * @return String: username + */ + public String getYalpUserName(){ + return this.userName; + } + +/* + * Returns indication if playback is runing + * + * @return boolean: true - if is play'in + */ + public Boolean getPlayback(){ + return this.playback; + } + +/* + * Get Total amount of streams played + * + * @return int: number of Streams totally played + * + public int getAllStreamNum(){ + try{ + return this.srvCon.getStreamCounter().getAllStreams(); + }catch (Exception e){ + System.out.println("Exception in Model.getAllStreamNum"+e); + } + return -1; + } + */ + +/* + * Gets amount of Streams actual playing + * + * @return int: number of Streams play'in at the moment + * + public int getActualStreamNum(){ + try{ + return this.srvCon.getStreamCounter().getActualStreams(); + }catch (Exception e){ + System.out.println("Exception in Model.getActualStreamNum"+e); + } + return -1; + } + */ + +/* + * Sets class variable logoff to true and logs off from server + */ + public void logoff(){ + YalpErrorHolder err = new YalpErrorHolder(); + try{ + this.logoff=true; + this.srvCon.clientLogoff(this.session, err); + }catch(Exception e) {// DEBUG + System.out.println("Model Exeptions in logoff"); + e.printStackTrace(); + } + } + +/* + * Returns indication if client is logging of + * + * @return Boolean: true - if is logging of + */ + public Boolean getLogoff(){ + return this.logoff; + } +} diff --git a/src/YalpClients/SwtClient/SwtClient.java b/src/YalpClients/SwtClient/SwtClient.java index 513d4ff..1950eaa 100755 --- a/src/YalpClients/SwtClient/SwtClient.java +++ b/src/YalpClients/SwtClient/SwtClient.java @@ -1,61 +1,61 @@ -/* - * - * Copyright (c) 2006 Manuel Traut and Volker Dahnke - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: Manuel Traut and Volker Dahnke - * - */ -package YalpClients.SwtClient; - -import YalpClients.SwtClient.GUI.*; - -import org.eclipse.swt.*; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; - - -/* - * Class SwtClient - * - * static main method - * - * @author Volker Dahnke / Manuel Traut - * - * @version 0.1 20-11-2005
- */ -public class SwtClient{ - -/* - * Client initialization - * - * @param argv - * arguments which are not used - */ - public static void main (String[] argv) { - try{ - System.setProperty("java.security.policy","client.policy"); - } - catch (Exception e) {//DEBUG - System.out.println ("Server SecurityManagerExeptions not caught jet " + e); - System.exit(0); - } - - LoadDialog load = new LoadDialog( - new Shell(Display.getDefault(),SWT.NONE), SWT.NONE); - - load.show(); - final Model model = new Model(argv); - load.close(); - - StartDialog start = - new StartDialog(new Shell(Display.getDefault(),SWT.MIN),model, SWT.NONE); - - start.show(); - - return; - } -} +/* + * + * Copyright (c) 2006 Manuel Traut and Volker Dahnke + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: Manuel Traut and Volker Dahnke + * + */ +package YalpClients.SwtClient; + +import YalpClients.SwtClient.GUI.*; + +import org.eclipse.swt.*; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Shell; + + +/* + * Class SwtClient + * + * static main method + * + * @author Volker Dahnke / Manuel Traut + * + * @version 0.1 20-11-2005
+ */ +public class SwtClient{ + +/* + * Client initialization + * + * @param argv + * arguments which are not used + */ + public static void main (String[] argv) { + try{ + System.setProperty("java.security.policy","client.policy"); + } + catch (Exception e) {//DEBUG + System.out.println ("Server SecurityManagerExeptions not caught jet " + e); + System.exit(0); + } + + LoadDialog load = new LoadDialog( + new Shell(Display.getDefault(),SWT.NONE), SWT.NONE); + + load.show(); + final Model model = new Model(argv); + load.close(); + + StartDialog start = + new StartDialog(new Shell(Display.getDefault(),SWT.MIN),model, SWT.NONE); + + start.show(); + + return; + } +} diff --git a/src/YalpInputs/YalpPGSqlInput/DatabaseDefines.java b/src/YalpInputs/YalpPGSqlInput/DatabaseDefines.java index b6ee2ce..0300ad3 100644 --- a/src/YalpInputs/YalpPGSqlInput/DatabaseDefines.java +++ b/src/YalpInputs/YalpPGSqlInput/DatabaseDefines.java @@ -1,65 +1,65 @@ -/* - * Copyright (c) 2006 Manuel Traut and Volker Dahnke - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: Manuel Traut and Volker Dahnke - */ -package YalpInputs.YalpPGSqlInput; - -/* - * Class DatabaseDefines - * - * - * - * @author Manuel Traut - * - * @version 0.1 28-08-2008
- * - */ - -public class DatabaseDefines { - - public String dbConnection="jdbc:postgresql://10.0.3.20:5432/yalp_media"; - public String dbUser="yalp"; - public String dbPasswd="huhu"; - -/* - * set string for dbConnection - * @param dbConnection - * "jdbc:postgresql://:/"; - */ - public void setDBConnection(String dbConnection){ - this.dbConnection = dbConnection; - } - -/* - * set userName for db Edit - * @param dbUser - */ - public void setDBUser(String dbUser){ - this.dbUser = dbUser; - } - -/* - * set string for db Password - * @param DBPasswd - */ - public void setDBPasswd(String DBPasswd){ - this.dbPasswd = DBPasswd; - } - - public String getDBConnection(){ - return this.dbConnection; - } - - public String getDBUser(){ - return this.dbUser; - } - - public String getDBPasswd(){ - return this.dbPasswd; - } -} +/* + * Copyright (c) 2006 Manuel Traut and Volker Dahnke + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: Manuel Traut and Volker Dahnke + */ +package YalpInputs.YalpPGSqlInput; + +/* + * Class DatabaseDefines + * + * + * + * @author Manuel Traut + * + * @version 0.1 28-08-2008
+ * + */ + +public class DatabaseDefines { + + public String dbConnection="jdbc:postgresql://10.0.3.20:5432/yalp_media"; + public String dbUser="yalp"; + public String dbPasswd="huhu"; + +/* + * set string for dbConnection + * @param dbConnection + * "jdbc:postgresql://:/"; + */ + public void setDBConnection(String dbConnection){ + this.dbConnection = dbConnection; + } + +/* + * set userName for db Edit + * @param dbUser + */ + public void setDBUser(String dbUser){ + this.dbUser = dbUser; + } + +/* + * set string for db Password + * @param DBPasswd + */ + public void setDBPasswd(String DBPasswd){ + this.dbPasswd = DBPasswd; + } + + public String getDBConnection(){ + return this.dbConnection; + } + + public String getDBUser(){ + return this.dbUser; + } + + public String getDBPasswd(){ + return this.dbPasswd; + } +} diff --git a/src/YalpServer/ServerControlImpl.java b/src/YalpServer/ServerControlImpl.java index f8e4579..1064dd0 100755 --- a/src/YalpServer/ServerControlImpl.java +++ b/src/YalpServer/ServerControlImpl.java @@ -1,452 +1,452 @@ -/* - * Copyright (c) 2006 Manuel Traut and Volker Dahnke - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: Manuel Traut and Volker Dahnke - */ - -package YalpServer; - -import YalpInterfaces.*; - -import java.net.*; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Properties; - -import org.omg.CosNaming.*; -import org.omg.CosNaming.NamingContextPackage.*; -import org.omg.CORBA.*; -import org.omg.PortableServer.*; -import org.omg.PortableServer.POA; - -import org.apache.log4j.Logger; -import org.apache.log4j.PropertyConfigurator; - -/* - * Class ServerControlImpl - * - * Implements functionality of the ServerControl Interface - * - * @author Volker Dahnke / Manuel Traut - * @version 0.6 14-12-2005
- * @see client - */ -public class ServerControlImpl extends ServerControlInterfacePOA -{ - private ORB orb; - - private InitServer srv; - private InputPluginHandler inputHandler; - private OutputPluginHandler outputHandler; - private AuthPluginHandler authHandler; - - private ArrayList sessions; - private ArrayList plugin_infos; - - private String log4jFile = "log4j_server.conf"; - - private static Logger logger = - Logger.getLogger("Yalp.Server.ServerControlImpl"); - -public ServerControlImpl() -{ - this.sessions = new ArrayList (); - this.plugin_infos = new ArrayList (); - - PropertyConfigurator.configureAndWatch(log4jFile); - logger.debug("ServerControlImpl()"); -} - - public void setORB(ORB _orb) - { - logger.debug("setOrb()"); - orb = _orb; - } - - public void init(InitServer _srv) - { - logger.debug("init()"); - srv = _srv; - inputHandler = srv.inputHandler; - outputHandler = srv.outputHandler; - authHandler = srv.authHandler; - } - -/* - * client logon - * - * @param userName - * @param password - * @param ipAdress - * @param session (out) - * @param error (out) - */ - public void clientLogon( String name, - String password, - String ipAddress, - SessionHolder session, - YalpErrorHolder err ) - { - logger.debug("clientLogon()"); - - YalpError error = new YalpError(); - error.code = YalpErrorCode.OK; - error.descr = "authentication successfull"; - error.msg = "nice isn't it"; - error.level = YalpErrorLevel.ERROR_LEVEL_INFO; - err.value = error; - - session.value = authHandler.logon(name, password, ipAddress, session, err); - - ArrayList all_plugins = new ArrayList(); - - PluginInfo[] t = {}; - session.value.availablePlugins = plugin_infos.toArray(t); - sessions.add(session.value); - } - -/* - * client logoff - * - * @param session - * @param error (out) - */ - public void clientLogoff( Session bye, YalpErrorHolder err) - { - logger.debug("clientLogoff"); - - YalpError error = new YalpError(); - error.code = YalpErrorCode.OK; - error.descr = "logged out"; - error.msg = "sad isn't it"; - error.level = YalpErrorLevel.ERROR_LEVEL_INFO; - err.value = error; - - sessions.remove(bye); - } - -/* - * get user list - * - * @param user list (out) - * @param error (out) - */ - public void getUser(UsersHolder list, YalpErrorHolder err) { - logger.debug("getUser()"); - YalpError error = new YalpError(); - error.code = YalpErrorCode.OK; - err = new YalpErrorHolder(error); - } - -/* - * change user details - * - * @param user - * @param password - * @param action (create, delete, alter) - * @param error (out) - */ - public void changeUser(YalpUser usr, String passwd, Action todo, - YalpErrorHolder err) { - logger.debug("changeUser()"); - YalpError error = new YalpError(); - error.code = YalpErrorCode.OK; - err = new YalpErrorHolder(error); - } - -/* - * alter media informations - * - * @param media to change - * @param action (update, delete, create) - * @param error (out) - */ - public void changeMedia( Media toChange, Action todo, YalpErrorHolder err ) { - logger.debug("changeMedia()"); - YalpError error = new YalpError(); - error.code = YalpErrorCode.OK; - err = new YalpErrorHolder(error); - } - -/* - * count yalp medias - * - * @param num (out) - * @param error (out) - */ - public void getNumOfMedias( IntHolder num, YalpErrorHolder err ) { - logger.debug("getNumOfMedias()"); - YalpError error = new YalpError(); - error.code = YalpErrorCode.OK; - err = new YalpErrorHolder(error); - } - -/* - * control yalp medias - * - * @param control description (inout) - * @param error (out) - */ - public void control( OutputHolder ctlOutput, YalpErrorHolder err ) { - logger.debug("control()"); - YalpError error = new YalpError(); - error.code = YalpErrorCode.OK; - error.descr = "streaming ;-)"; - error.msg = "nice isn't it"; - error.level = YalpErrorLevel.ERROR_LEVEL_INFO; - err.value = error; - - outputHandler.control(ctlOutput, err); - } - -/* - * search yalp media - * - * @param search string - * @param list of mediatypes - * @param result as list of medias (out) - */ - public void search( String str, MediaType[] types, MediasHolder result, - YalpErrorHolder err ) { - logger.debug("search()"); - YalpError error = new YalpError(); - inputHandler.search(str, types, result, err); - } - -/* - * register new output plugin - * - * @param plugin which should be registered - * @param error - */ - public void registerOutputPlugin( OutputPluginInterface itf, - PluginInfoHolder info, YalpErrorHolder err ) - { - logger.info("registering output plugin: " + info.value.name ); - - OutputPluginInterface outputItf; - - try { - outputItf = OutputPluginInterfaceHelper.narrow(itf); - } catch( Exception e ) { - e.printStackTrace(); - return; - } - - OutputPlugin newPlugin = new OutputPlugin(outputItf, info.value); - - PluginInfo inf = new PluginInfo(); - - if( newPlugin != null ) - inf = outputHandler.addPlugin( newPlugin ); - - info.value = inf; - plugin_infos.add( inf ); - - YalpError error = new YalpError(); - error.msg = "plugin registered"; - error.descr = ""; - error.code = YalpErrorCode.OK; - error.level = YalpErrorLevel.ERROR_LEVEL_INFO; - err.value = error; - } - -/* - * remove output plugin - * - * @param plugin which should be registered - * @param error - */ - public void removeOutputPlugin( PluginInfo itf, YalpErrorHolder err ) - { - logger.debug("removeOutputPlugin()"); - /* t.b.d. itf handling */ - YalpError error = new YalpError(); - error.code = YalpErrorCode.OK; - err = new YalpErrorHolder(error); - } - -/* - * get all registered output plugins - * - * @param plugin list - * @param error - */ - public void getOutputPlugins( PluginInfosHolder itfs, String name, - YalpErrorHolder err ) - { - logger.debug("getOutputPlugins()"); - /* t.b.d. itf handling */ - YalpError error = new YalpError(); - error.code = YalpErrorCode.OK; - err = new YalpErrorHolder(error); - } - -/* - * register new input plugin - * - * @param plugin which should be registered - * @param error - */ - public void registerInputPlugin( org.omg.CORBA.Object itf, - PluginInfoHolder info, YalpErrorHolder err ) - { - logger.info("registering input plugin: " + info.value.name ); - - InputPluginInterface inputItf; - - try { - inputItf = InputPluginInterfaceHelper.narrow(itf); - } catch( Exception e ) { - e.printStackTrace(); - return; - } - - InputPlugin newPlugin = new InputPlugin(inputItf, info.value); - - PluginInfo inf = new PluginInfo(); - - if( newPlugin != null ) - inf = inputHandler.addPlugin( newPlugin ); - - info.value = inf; - plugin_infos.add( inf ); - - YalpError error = new YalpError(); - error.msg = "plugin registered"; - error.descr = ""; - error.code = YalpErrorCode.OK; - error.level = YalpErrorLevel.ERROR_LEVEL_INFO; - err.value = error; - } - -/* - * remove input plugin - * - * @param plugin which should be registered - * @param error - */ - public void removeInputPlugin( PluginInfo itf, YalpErrorHolder err ) - { - logger.debug("removeInputPlugin()"); - /* t.b.d. itf handling */ - YalpError error = new YalpError(); - error.code = YalpErrorCode.OK; - err = new YalpErrorHolder(error); - } - -/* - * get all registered input plugins - * - * @param plugin list - * @param error - */ - public void getInputPlugins( PluginInfosHolder itfs, - String name, YalpErrorHolder err ) - { - logger.debug("getInputPlugins()"); - /* t.b.d. itf handling */ - YalpError error = new YalpError(); - error.code = YalpErrorCode.OK; - err = new YalpErrorHolder(error); - } - -/* - * register new auth plugin - * - * @param plugin which should be registered - * @param error - */ - public void registerAuthPlugin( org.omg.CORBA.Object itf, - PluginInfoHolder info, YalpErrorHolder err ) - { - logger.info("registering auth plugin: " + info.value.name ); - - AuthPluginInterface authItf; - - try { - authItf = AuthPluginInterfaceHelper.narrow(itf); - } catch( Exception e ) { - e.printStackTrace(); - return; - } - - AuthPlugin newPlugin = new AuthPlugin(authItf, info.value); - - PluginInfo inf = new PluginInfo(); - - if( newPlugin != null ) - inf = authHandler.addPlugin( newPlugin ); - - info.value = inf; - plugin_infos.add (inf); - - YalpError error = new YalpError(); - error.msg = "plugin registered"; - error.descr = ""; - error.code = YalpErrorCode.OK; - error.level = YalpErrorLevel.ERROR_LEVEL_INFO; - err.value = error; - } - -/* - * remove auth plugin - * - * @param plugin which should be registered - * @param error - */ - public void removeAuthPlugin( PluginInfo itf, - YalpErrorHolder err ) - { - logger.debug("removeAuthPlugin()"); - /* t.b.d. itf handling */ - YalpError error = new YalpError(); - error.code = YalpErrorCode.OK; - err = new YalpErrorHolder(error); - } - -/* - * get all registered auth plugins - * - * @param plugin list - * @param error - */ - public void getAuthPlugins( PluginInfosHolder itfs, - String name, YalpErrorHolder err ) - { - logger.debug("getAuthPlugins()"); - /* t.b.d. itf handling */ - YalpError error = new YalpError(); - error.code = YalpErrorCode.OK; - err = new YalpErrorHolder(error); - } - -/* - * to check if server is still ok - * - * @return Boolean true - if ok - */ - public void ping(YalpErrorHolder pong) { - logger.debug("ping()"); - YalpError err = new YalpError(); - err.descr = "PONG"; - err.msg = "huhu"; - err.level = YalpErrorLevel.ERROR_LEVEL_INFO; - err.code = YalpErrorCode.OK; - pong.value = err; - System.out.println("pong"); - } - -/* - * server shutdown - */ - public void serverShutdown() - { - logger.debug("server shutdown()"); - /* t.b.d. clear server shutdown */ - } -} +/* + * Copyright (c) 2006 Manuel Traut and Volker Dahnke + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: Manuel Traut and Volker Dahnke + */ + +package YalpServer; + +import YalpInterfaces.*; + +import java.net.*; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Properties; + +import org.omg.CosNaming.*; +import org.omg.CosNaming.NamingContextPackage.*; +import org.omg.CORBA.*; +import org.omg.PortableServer.*; +import org.omg.PortableServer.POA; + +import org.apache.log4j.Logger; +import org.apache.log4j.PropertyConfigurator; + +/* + * Class ServerControlImpl + * + * Implements functionality of the ServerControl Interface + * + * @author Volker Dahnke / Manuel Traut + * @version 0.6 14-12-2005
+ * @see client + */ +public class ServerControlImpl extends ServerControlInterfacePOA +{ + private ORB orb; + + private InitServer srv; + private InputPluginHandler inputHandler; + private OutputPluginHandler outputHandler; + private AuthPluginHandler authHandler; + + private ArrayList sessions; + private ArrayList plugin_infos; + + private String log4jFile = "log4j_server.conf"; + + private static Logger logger = + Logger.getLogger("Yalp.Server.ServerControlImpl"); + +public ServerControlImpl() +{ + this.sessions = new ArrayList (); + this.plugin_infos = new ArrayList (); + + PropertyConfigurator.configureAndWatch(log4jFile); + logger.debug("ServerControlImpl()"); +} + + public void setORB(ORB _orb) + { + logger.debug("setOrb()"); + orb = _orb; + } + + public void init(InitServer _srv) + { + logger.debug("init()"); + srv = _srv; + inputHandler = srv.inputHandler; + outputHandler = srv.outputHandler; + authHandler = srv.authHandler; + } + +/* + * client logon + * + * @param userName + * @param password + * @param ipAdress + * @param session (out) + * @param error (out) + */ + public void clientLogon( String name, + String password, + String ipAddress, + SessionHolder session, + YalpErrorHolder err ) + { + logger.debug("clientLogon()"); + + YalpError error = new YalpError(); + error.code = YalpErrorCode.OK; + error.descr = "authentication successfull"; + error.msg = "nice isn't it"; + error.level = YalpErrorLevel.ERROR_LEVEL_INFO; + err.value = error; + + session.value = authHandler.logon(name, password, ipAddress, session, err); + + ArrayList all_plugins = new ArrayList(); + + PluginInfo[] t = {}; + session.value.availablePlugins = plugin_infos.toArray(t); + sessions.add(session.value); + } + +/* + * client logoff + * + * @param session + * @param error (out) + */ + public void clientLogoff( Session bye, YalpErrorHolder err) + { + logger.debug("clientLogoff"); + + YalpError error = new YalpError(); + error.code = YalpErrorCode.OK; + error.descr = "logged out"; + error.msg = "sad isn't it"; + error.level = YalpErrorLevel.ERROR_LEVEL_INFO; + err.value = error; + + sessions.remove(bye); + } + +/* + * get user list + * + * @param user list (out) + * @param error (out) + */ + public void getUser(UsersHolder list, YalpErrorHolder err) { + logger.debug("getUser()"); + YalpError error = new YalpError(); + error.code = YalpErrorCode.OK; + err = new YalpErrorHolder(error); + } + +/* + * change user details + * + * @param user + * @param password + * @param action (create, delete, alter) + * @param error (out) + */ + public void changeUser(YalpUser usr, String passwd, Action todo, + YalpErrorHolder err) { + logger.debug("changeUser()"); + YalpError error = new YalpError(); + error.code = YalpErrorCode.OK; + err = new YalpErrorHolder(error); + } + +/* + * alter media informations + * + * @param media to change + * @param action (update, delete, create) + * @param error (out) + */ + public void changeMedia( Media toChange, Action todo, YalpErrorHolder err ) { + logger.debug("changeMedia()"); + YalpError error = new YalpError(); + error.code = YalpErrorCode.OK; + err = new YalpErrorHolder(error); + } + +/* + * count yalp medias + * + * @param num (out) + * @param error (out) + */ + public void getNumOfMedias( IntHolder num, YalpErrorHolder err ) { + logger.debug("getNumOfMedias()"); + YalpError error = new YalpError(); + error.code = YalpErrorCode.OK; + err = new YalpErrorHolder(error); + } + +/* + * control yalp medias + * + * @param control description (inout) + * @param error (out) + */ + public void control( OutputHolder ctlOutput, YalpErrorHolder err ) { + logger.debug("control()"); + YalpError error = new YalpError(); + error.code = YalpErrorCode.OK; + error.descr = "streaming ;-)"; + error.msg = "nice isn't it"; + error.level = YalpErrorLevel.ERROR_LEVEL_INFO; + err.value = error; + + outputHandler.control(ctlOutput, err); + } + +/* + * search yalp media + * + * @param search string + * @param list of mediatypes + * @param result as list of medias (out) + */ + public void search( String str, MediaType[] types, MediasHolder result, + YalpErrorHolder err ) { + logger.debug("search()"); + YalpError error = new YalpError(); + inputHandler.search(str, types, result, err); + } + +/* + * register new output plugin + * + * @param plugin which should be registered + * @param error + */ + public void registerOutputPlugin( OutputPluginInterface itf, + PluginInfoHolder info, YalpErrorHolder err ) + { + logger.info("registering output plugin: " + info.value.name ); + + OutputPluginInterface outputItf; + + try { + outputItf = OutputPluginInterfaceHelper.narrow(itf); + } catch( Exception e ) { + e.printStackTrace(); + return; + } + + OutputPlugin newPlugin = new OutputPlugin(outputItf, info.value); + + PluginInfo inf = new PluginInfo(); + + if( newPlugin != null ) + inf = outputHandler.addPlugin( newPlugin ); + + info.value = inf; + plugin_infos.add( inf ); + + YalpError error = new YalpError(); + error.msg = "plugin registered"; + error.descr = ""; + error.code = YalpErrorCode.OK; + error.level = YalpErrorLevel.ERROR_LEVEL_INFO; + err.value = error; + } + +/* + * remove output plugin + * + * @param plugin which should be registered + * @param error + */ + public void removeOutputPlugin( PluginInfo itf, YalpErrorHolder err ) + { + logger.debug("removeOutputPlugin()"); + /* t.b.d. itf handling */ + YalpError error = new YalpError(); + error.code = YalpErrorCode.OK; + err = new YalpErrorHolder(error); + } + +/* + * get all registered output plugins + * + * @param plugin list + * @param error + */ + public void getOutputPlugins( PluginInfosHolder itfs, String name, + YalpErrorHolder err ) + { + logger.debug("getOutputPlugins()"); + /* t.b.d. itf handling */ + YalpError error = new YalpError(); + error.code = YalpErrorCode.OK; + err = new YalpErrorHolder(error); + } + +/* + * register new input plugin + * + * @param plugin which should be registered + * @param error + */ + public void registerInputPlugin( org.omg.CORBA.Object itf, + PluginInfoHolder info, YalpErrorHolder err ) + { + logger.info("registering input plugin: " + info.value.name ); + + InputPluginInterface inputItf; + + try { + inputItf = InputPluginInterfaceHelper.narrow(itf); + } catch( Exception e ) { + e.printStackTrace(); + return; + } + + InputPlugin newPlugin = new InputPlugin(inputItf, info.value); + + PluginInfo inf = new PluginInfo(); + + if( newPlugin != null ) + inf = inputHandler.addPlugin( newPlugin ); + + info.value = inf; + plugin_infos.add( inf ); + + YalpError error = new YalpError(); + error.msg = "plugin registered"; + error.descr = ""; + error.code = YalpErrorCode.OK; + error.level = YalpErrorLevel.ERROR_LEVEL_INFO; + err.value = error; + } + +/* + * remove input plugin + * + * @param plugin which should be registered + * @param error + */ + public void removeInputPlugin( PluginInfo itf, YalpErrorHolder err ) + { + logger.debug("removeInputPlugin()"); + /* t.b.d. itf handling */ + YalpError error = new YalpError(); + error.code = YalpErrorCode.OK; + err = new YalpErrorHolder(error); + } + +/* + * get all registered input plugins + * + * @param plugin list + * @param error + */ + public void getInputPlugins( PluginInfosHolder itfs, + String name, YalpErrorHolder err ) + { + logger.debug("getInputPlugins()"); + /* t.b.d. itf handling */ + YalpError error = new YalpError(); + error.code = YalpErrorCode.OK; + err = new YalpErrorHolder(error); + } + +/* + * register new auth plugin + * + * @param plugin which should be registered + * @param error + */ + public void registerAuthPlugin( org.omg.CORBA.Object itf, + PluginInfoHolder info, YalpErrorHolder err ) + { + logger.info("registering auth plugin: " + info.value.name ); + + AuthPluginInterface authItf; + + try { + authItf = AuthPluginInterfaceHelper.narrow(itf); + } catch( Exception e ) { + e.printStackTrace(); + return; + } + + AuthPlugin newPlugin = new AuthPlugin(authItf, info.value); + + PluginInfo inf = new PluginInfo(); + + if( newPlugin != null ) + inf = authHandler.addPlugin( newPlugin ); + + info.value = inf; + plugin_infos.add (inf); + + YalpError error = new YalpError(); + error.msg = "plugin registered"; + error.descr = ""; + error.code = YalpErrorCode.OK; + error.level = YalpErrorLevel.ERROR_LEVEL_INFO; + err.value = error; + } + +/* + * remove auth plugin + * + * @param plugin which should be registered + * @param error + */ + public void removeAuthPlugin( PluginInfo itf, + YalpErrorHolder err ) + { + logger.debug("removeAuthPlugin()"); + /* t.b.d. itf handling */ + YalpError error = new YalpError(); + error.code = YalpErrorCode.OK; + err = new YalpErrorHolder(error); + } + +/* + * get all registered auth plugins + * + * @param plugin list + * @param error + */ + public void getAuthPlugins( PluginInfosHolder itfs, + String name, YalpErrorHolder err ) + { + logger.debug("getAuthPlugins()"); + /* t.b.d. itf handling */ + YalpError error = new YalpError(); + error.code = YalpErrorCode.OK; + err = new YalpErrorHolder(error); + } + +/* + * to check if server is still ok + * + * @return Boolean true - if ok + */ + public void ping(YalpErrorHolder pong) { + logger.debug("ping()"); + YalpError err = new YalpError(); + err.descr = "PONG"; + err.msg = "huhu"; + err.level = YalpErrorLevel.ERROR_LEVEL_INFO; + err.code = YalpErrorCode.OK; + pong.value = err; + System.out.println("pong"); + } + +/* + * server shutdown + */ + public void serverShutdown() + { + logger.debug("server shutdown()"); + /* t.b.d. clear server shutdown */ + } +} diff --git a/src/YalpServer/ServerSettings.java b/src/YalpServer/ServerSettings.java index 313e875..3faaa37 100755 --- a/src/YalpServer/ServerSettings.java +++ b/src/YalpServer/ServerSettings.java @@ -1,68 +1,68 @@ -/* - * Copyright (c) 2006 Manuel Traut and Volker Dahnke - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: Manuel Traut and Volker Dahnke - */ - -package YalpServer; - -/* - * Class ServerSettings - * - * - * - * @author Manuel Traut - * - * @version 0.1 27-03-2006
- * - * @see server.InitServer - */ - -public class ServerSettings{ - - static final long serialVersionUID = 0; - - public String imageDir = "/media/image"; - public String videoDir = "/media/video"; - public String soundDir = "/media/sound"; - - /** - * set Directories which contains media Files - * @param startDir - */ - public void setImageDir(String startDir){ - this.imageDir = startDir; - } - - /** - * set Directories which contains media Files - * @param startDir - */ - public void setVideoDir(String startDir){ - this.videoDir = startDir; - } - - /** - * set Directories which contains media Files - * @param startDir - */ - public void setSoundDir(String startDir){ - this.soundDir = startDir; - } - - public String getVideoDir(){ - return this.videoDir; - } - - public String getImageDir(){ - return this.imageDir; - } - - public String getSoundDir(){ - return this.soundDir; - } -} +/* + * Copyright (c) 2006 Manuel Traut and Volker Dahnke + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: Manuel Traut and Volker Dahnke + */ + +package YalpServer; + +/* + * Class ServerSettings + * + * + * + * @author Manuel Traut + * + * @version 0.1 27-03-2006
+ * + * @see server.InitServer + */ + +public class ServerSettings{ + + static final long serialVersionUID = 0; + + public String imageDir = "/media/image"; + public String videoDir = "/media/video"; + public String soundDir = "/media/sound"; + + /** + * set Directories which contains media Files + * @param startDir + */ + public void setImageDir(String startDir){ + this.imageDir = startDir; + } + + /** + * set Directories which contains media Files + * @param startDir + */ + public void setVideoDir(String startDir){ + this.videoDir = startDir; + } + + /** + * set Directories which contains media Files + * @param startDir + */ + public void setSoundDir(String startDir){ + this.soundDir = startDir; + } + + public String getVideoDir(){ + return this.videoDir; + } + + public String getImageDir(){ + return this.imageDir; + } + + public String getSoundDir(){ + return this.soundDir; + } +} diff --git a/src/YalpServer/YalpServer.java b/src/YalpServer/YalpServer.java index 0ddbe00..8cf57d3 100755 --- a/src/YalpServer/YalpServer.java +++ b/src/YalpServer/YalpServer.java @@ -1,40 +1,40 @@ -/* - * Copyright (c) 2006 Manuel Traut and Volker Dahnke - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: Manuel Traut and Volker Dahnke - */ -package YalpServer; - -/* - * Class Server - * - * static main method - * - * @author Volker Dahnke / Manuel Traut - * - * @version 0.1 20-11-2005
- */ -public class YalpServer{ - -/* - * starts Server initialization - * - * @param argv - * arguments which are not used - */ - public static void main (String[] argv) { - try{ - System.setProperty("java.security.policy","server.policy"); - } catch (Exception e) {//DEBUG - System.out.println ("Server SecurityManagerExeptions not caught jet " + e); - System.exit(0); - } - InitServer yalpServer = new InitServer(argv); - return; - } - -} +/* + * Copyright (c) 2006 Manuel Traut and Volker Dahnke + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: Manuel Traut and Volker Dahnke + */ +package YalpServer; + +/* + * Class Server + * + * static main method + * + * @author Volker Dahnke / Manuel Traut + * + * @version 0.1 20-11-2005
+ */ +public class YalpServer{ + +/* + * starts Server initialization + * + * @param argv + * arguments which are not used + */ + public static void main (String[] argv) { + try{ + System.setProperty("java.security.policy","server.policy"); + } catch (Exception e) {//DEBUG + System.out.println ("Server SecurityManagerExeptions not caught jet " + e); + System.exit(0); + } + InitServer yalpServer = new InitServer(argv); + return; + } + +} -- cgit v1.2.3