diff options
| author | Manuel Traut <manut@vogone.traut> | 2009-12-27 16:11:21 +0100 |
|---|---|---|
| committer | Manuel Traut <manut@vogone.traut> | 2009-12-27 16:11:21 +0100 |
| commit | cfbb5a8b9b4105793dc54974965aecc620adeed8 (patch) | |
| tree | a2099bfc722c2aeee5861faeeb87c3c1f473e23e | |
| parent | b794b9e4f98fc8ed1809953d9303b219d5aebc1d (diff) | |
| parent | c62ff958823168d7622b397609220db8b67fa731 (diff) | |
Merge branch 'damba' of ssh://mecka.net/home/git/yalp into damba
Conflicts:
build.xml
server.policy
Signed-off-by: Manuel Traut <manut@mecka.net>
29 files changed, 6821 insertions, 4303 deletions
@@ -1,3 +1,4 @@ +<<<<<<< HEAD <?xml version="1.0" encoding="UTF-8"?>
<project name="yalp" default="all" basedir=".">
@@ -229,3 +230,236 @@ </target>
</project>
+======= +<?xml version="1.0" encoding="UTF-8"?> + +<project name="yalp" default="all" basedir="."> + <property name="srcInterfaces" value="src/YalpInterfaces"/> + + <property name="srcInputs" value="src/YalpInputs"/> + <property name="srcOutputs" value="src/YalpOutputs"/> + <property name="srcAuth" value="src/YalpAuth"/> + <property name="srcServer" value="src/YalpServer"/> + <property name="srcClients" value="src/YalpClients"/> + <property name="srcPgSqlInputIndexer" value="${srcInputs}/YalpPGSqlInput/YalpPGSQLIndexer"/> + <property name="srcVlcTelnetOutput" value="${srcOutputs}/YalpVlcTelnetOutput"/> + <property name="srcPGSqlInput" value="${srcInputs}/YalpPGSqlInput"/> + <property name="srcPGSqlAuth" value="${srcAuth}/YalpPGSqlAuth"/> + + <property name="srcSwtClient" value="${srcClients}/SwtClient"/> + <property name="srcSwtClientGUI" value="${srcSwtClient}/GUI"/> + + <property name="src" value="src/"/> + <property name="doc" value="doc/"/> + <property name="sqldoc" value="${doc}/sql"/> + <property name="javadoc" value="${doc}/java"/> + <property name="doxydoc" value="${doc}/doxygen"/> + <property name="build" value="build/"/> + <property name="lib" value="lib/"/> + + <property name="log4jLibs" value="lib/log4j-1.2.15.jar"/> + <property name="vlctelnetLibs" value="lib/commons-net-1.4.1.jar"/> + <property name="swtLibs" value="/usr/share/swt-3/lib/swt.jar /usr/lib/java/swt.jar /usr/share/java/swt.jar"/> + <property name="indexerLibs" value="lib/yajil-0.3.3.jar"/> + <property name="dbLibs" value="lib/postgresql-8.1-404.jdbc3.jar"/> + + <property name="idlj" value="../idlj.sh"/> + <property name="psqldoc" value="./postgresql_autodoc/postgresql_autodoc"/> + + <path id="project.class.path"> + <pathelement location="{lib}"/> + <pathelement path="${java.class.path}"/> + <pathelement path="${additional.path}"/> + </path> + + <target name="all" depends="vlctelnetoutput, pgsqlinput, pgsqlindexer, pgsqlauth, server, swtclient" description="builds server and client"> + <echo>Doing all</echo> + </target> + + <target name="interfaces" description="Create stubs/skeletons from idl"> + <mkdir dir="${build}"/> + <exec dir="${src}" executable="${idlj}"> + <arg value="yalp.idl"/> + </exec> + <javac srcdir="${srcInterfaces}" destdir="${build}"/> + </target> + + <target name ="server" depends="interfaces" description="builds the Server"> + <javac debug="true" srcdir="${srcServer}" destdir="${build}"/> + <jar destfile="yalpServer.jar" basedir="${build}"> + <path id="project.class.path"> + <pathelement location="${lib}"/> + <pathelement path="${java.class.path}"/> + <pathelement path="${additional.path}"/> + </path> + <manifest> + <attribute name="Built-By" value="${user.name}"/> + <attribute name="Main-Class" value="YalpServer.YalpServer"/> + <attribute name="Class-Path" value="${log4jLibs}"/> + </manifest> + </jar> + </target> + + <target name ="outputs" description="builds output base files"> + <javac debug="true" srcdir="${srcOutputs}" destdir="${build}"/> + </target> + + <target name ="vlctelnetoutput" depends="interfaces, outputs" description="builds the vlctelnetoutput"> + <javac debug="true" srcdir="${srcVlcTelnetOutput}" destdir="${build}"/> + <jar destfile="yalpVlcTelnetOutput.jar" basedir="${build}"> + <path id="project.class.path"> + <pathelement location="${lib}"/> + <pathelement path="${java.class.path}"/> + <pathelement path="${additional.path}"/> + </path> + <manifest> + <attribute name="Built-By" value="${user.name}"/> + <attribute name="Main-Class" value="YalpOutputs.YalpVlcTelnetOutput.YalpVlcTelnetOutput"/> + <attribute name="Class-Path" value="${vlctelnetLibs} ${log4jLibs}"/> + </manifest> + </jar> + </target> + + <target name ="inputs" description="builds input base files"> + <javac debug="true" srcdir="${srcInputs}" destdir="${build}"/> + </target> + + <target name ="pgsqlinput" depends="interfaces, inputs" description="builds the pgsql input plugin"> + <javac debug="true" srcdir="${srcPGSqlInput}" destdir="${build}"/> + <jar destfile="yalpPGSqlInput.jar" basedir="${build}"> + <path id="project.class.path"> + <pathelement location="${lib}"/> + <pathelement path="${java.class.path}"/> + <pathelement path="${additional.path}"/> + </path> + <manifest> + <attribute name="Built-By" value="${user.name}"/> + <attribute name="Main-Class" value="YalpInputs.YalpPGSqlInput.YalpPGSqlInput"/> + <attribute name="Class-Path" value="${dbLibs} ${log4jLibs}"/> + </manifest> + </jar> + </target> + + <target name="pgsqlindexer" description="indexer for pgsqlinputplugin"> + <mkdir dir="${build}/indexer"/> + <javac debug="true" srcdir="${srcPgSqlInputIndexer}" destdir="${build}/indexer"/> + <jar destfile="yalpPGSqlIndexer.jar" basedir="${build}"> + <path id="project.class.path"> + <pathelement location="${lib}"/> + <pathelement path="${java.class.path}"/> + <pathelement path="${additional.path}"/> + </path> + <manifest> + <attribute name="Built-By" value="${user.name}"/> + <attribute name="Main-Class" value="YalpInputs.YalpPGSqlInput.YalpPGSQLIndexer.YalpPGSQLIndexer"/> + <attribute name="Class-Path" value="${indexerLibs}"/> + </manifest> + </jar> + </target> + + <target name ="auth" description="builds auth base files"> + <javac debug="true" srcdir="${srcAuth}" destdir="${build}"/> + </target> + + <target name ="pgsqlauth" depends="interfaces, auth" description="builds the pgsql auth plugin"> + <javac debug="true" srcdir="${srcPGSqlAuth}" destdir="${build}"/> + <jar destfile="yalpPGSqlAuth.jar" basedir="${build}"> + <path id="project.class.path"> + <pathelement location="${lib}"/> + <pathelement path="${java.class.path}"/> + <pathelement path="${additional.path}"/> + </path> + <manifest> + <attribute name="Built-By" value="${user.name}"/> + <attribute name="Main-Class" value="YalpAuth.YalpPGSqlAuth.YalpPGSqlAuth"/> + <attribute name="Class-Path" value="${dbLibs}"/> + </manifest> + </jar> + </target> + + <target name ="clients" depends="interfaces" description="builds the client bsae files"> + <javac debug="true" srcdir="${srcClients}" destdir="${build}"/> + </target> + + <target name ="swtclient" depends="clients" description="builds SWT GUI"> + <javac debug="true" srcdir="${srcSwtClient}" destdir="${build}"/> + <jar destfile="yalpSWTClient.jar" basedir="${build}"> + <path id="project.class.path"> + <pathelement location="${lib}"/> + <pathelement path="${java.class.path}"/> + <pathelement path="${additional.path}"/> + </path> + <manifest> + <attribute name="Built-By" value="${user.name}"/> + <attribute name="Main-Class" value="YalpClients.SwtClient.SwtClient"/> + <attribute name="Class-Path" value="${swtLibs}"/> + </manifest> + </jar> + </target> + + <target name="swtgui" depends="swtclient"> + <javac debug="true" srcdir="${srcSwtGUI}" destdir="${build}"> + <classpath refid="project.class.path"/> + </javac> + </target> + + <target name="clean" depends="cleandoc" description="Removes previous build"> + <delete verbose="true"> + <fileset dir="${build}"/> + <fileset dir="${srcInterfaces}"/> + </delete> + </target> + + <target name="runserver" depends="server" description="starts Server"> + <java jar="server.jar" fork="true"/> + </target> + + <target name="runclient" depends="swtclient" description="starts Client"> + <java jar="client.jar" fork="true"/> + </target> + + <target name="cleandoc" depends="cleandoxydoc, cleansqldoc, cleanjavadoc"/> + + <target name="cleansqldoc" description="Removes previous sqldoc"> + <delete verbose="true"> + <fileset dir="${sqldoc}"/> + </delete> + </target> + + <target name="cleandoxydoc" description="Removes previous doxygen"> + <delete verbose="true"> + <fileset dir="${doxydoc}"/> + </delete> + </target> + + <target name="cleanjavadoc" description="Removes previous javadoc"> + <delete verbose="true"> + <fileset dir="${javadoc}"/> + </delete> + </target> + + <target name="doc" depends="cleandoc" description="generates javadoc"> + <javadoc packagenames="org.umlgraph.doclet.*, YalpAuth.*, YalpServer, YalpClients.*, YalpInterfaces, YalpOutputs.*, YalpInputs.*" sourcepath="src" author="true" version="true" private="true" use="true" destdir="${javadoc}"> + <doclet name="org.umlgraph.doclet.UmlGraphDoc" path="./build-tools/UmlGraph-5.2.jar"> + <param name="-inferrel"/> + <param name="-inferdep"/> + <param name="-hide" value="java.*"/> + <param name="-collpackages" value="java.util.*"/> + <param name="-qualify"/> + <param name="-postfixpackage"/> + <param name="-nodefontsize" value="9"/> + <param name="-nodefontpackagesize" value="7"/> + <param name="-link" value="http://java.sun.com/javase/6/docs/guide/javadoc/doclet/spec"/> + <param name="-link" value="http://java.sun.com/javase/6/docs/api"/> + </doclet> + </javadoc> + <exec dir="." executable="${psqldoc}"> + <arg line="-d yalp -f ${sqldoc}/yalp -h localhost -u yalp -p 5432 --password=yalp -l ./postgresql_autodoc"/> + </exec> + <exec dir="." executable="/usr/bin/doxygen"> + <arg line="yalp.doxy"/> + </exec> + </target> + +</project> +>>>>>>> c62ff958823168d7622b397609220db8b67fa731 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 "<<ALL FILES>>","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 "<<ALL FILES>>","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/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`<kZN\+95_?c,5i,V:Xi)3$`@N=Sp%U<2E6@^hEejsb(fEZCtgp3Y:c!VT-rT7W*"Il^iFad#41Za&4Su3jU/q+!0E80g^67p^M^qXV1C<8b1KLSAeW]U)DUIj]91F>cpoXF,ElXn;k?'1,)>[qHe_,+j1<e;NREX9\!*&NgK&F?Fhg/h;J'.&[P!2Q2Y_u~> +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'?<b0(#HNotJr>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=j<OYo#@32DpGMOjQ(Bua0cVX,ZUZ_)Jj$>VSV05F*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!<E/X&V'~> +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><tq]6:[d-E!pRXdZ7=S"Vg1t+W'-GH#2V(S(gUf9ch7hY6NrS<$TJ=^i[n9bm6qIbu/\;\[G<b.V7,0Ru"SkY7UB4jss6!Z5=5(S7`#MS9L>;$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<ANU:d\`hJ3].T221<?2..-l"!Z$#S4rYDnAO&-E<7+=kXAI6-PGGHiqt]Xna\.L@%ZZL@q:4:6Xg-qHf/#\?CJ'TfESeUP`B\d*X1-&DannB8f-E0P")[AnQB#0EW8/:[pcLX+Z8Us)Mc@R-lf2CT829GV&;r9(B.lb"e>,&8RHj]jD1&@m'4hh9_f7ueQp,>gj]dB6OjoEUW:rkQ,D@@>F7H:-EG>0Z?>aHk!8K_3\=3ca<F4:Qmth$1\kD%PfQ40W?6bL90kQ\@W5oMP0P=74/WXV8$a;gM\e-G"M58+2;7o&"Q#rPkII2:K%%IoEs(8%2'Lea0fr'O.X"hQ9$A8QR!>Vn3jCiqnLN9[s!r"<bTTQg)T=[8Nd`@&I\.Gb=]5hptZ(YK[,fbCQOuJq`sY%?n]F:nP=[`\l'5JEqKs#tf"2=1dK7klR2e~> +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$<LX1J0A>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^/6BRZSW<lNdM/r%SbhbF,E;=7&kYS,FNX2DL6Y=J^-9m4m7e5fmdm2ff;\9#.bD8f.`P_.p"-AeBr(bs6Yb^3[<'OJqd9:=>GDH]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$q9o<KuYrVi]QLLUeh96K#iZ`OJ&P.MPh#X:I7>N`!7tq=jD/kj6^GRoL9aT;'k--+^lT$UjiNK:dWATVT+4g?li%bo;)Op`JgcB"4=jXM"tmj*Hpai#8Z7;hJ@b=Q[&$n8h(6YRijH9<eZ2mA&D*lDfA_]>Ee[/p,rii5%pZ%JtO0oe5As>:1R$`ok]N@M.>@)O*Y2$BYcf5H9/1%&6"_%n&<qPrjhd')_EAA!is^fh)<ljCl[?Q,<P!a~> +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+<?5(kRE.dNH[IJ1;6A'oX[qoo+kF9TA^=bS<Hb'r!S.1,C^D'k.nE]Kh2R!5=[;li~> +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#<uq(cYlEK_7)p[]:^56ku"lcY[iD)K%'Ck,pa*X),s)GMmXk'J(;BBqCBf[[!0W5In*P'^/&o^R0GOC86L0bL,B@Tu4TYCR)B'LU#^;#F,[ZKl5,@i2^[F7MngH^>k%lc8M%_Q);6<A!af<27l*&Y%!&?"/&DedcC?HJ=*r8F>7X-b<s."p\'mBkJl.eL9qrAY*"=9;f*FY0F?;128-N0YI!];NKA&2#_#@7LX$"R>FmGKS/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<4<dUDROa84d]oji2,E?*gX?F#_[RlPD`#DJ/\k<J*^?Jjl>l('+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#`)-HeGsa<tM9#:Ms?a@=SiASZLb1?92MfFiFVP6*%DL"TWL'"$k<8TZ$mfLdK2)EVnPTK[FG[X)bTZG]K^'W<?jPo*QZgC4t=J#HO21Qm'uY0Yb?!ePW`:?=LQ]a,RK1ZE`7C0?1#?WS`@8Xj^gpg[2X@r`qCKIkZkj;%o.-&kl/T*cE0SL^n:&X&BrN_8;-A#3.NNMd^1SU=@M3QQ*kMp:@qN4V6n,U!i-FK'.+>WHQUqW[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/Be<l6$N,A4KhGGof"))m(1,9)PP;YLYZhg?\0'3a7252\tq&,HdEOSRSL?Ki23S=:&7Nes&4g@no9'&\7nkntD1D;a%me!V2IuKD#%,#[C[R)(]<o#CA?r7F?[h/Vs7ekANHS>5L_GiHrR3Gkj21SY'@$03%WIu6A3CbQLYDpVQdJCe;[TbseB\cW)-r?1cX+>)l?jiN1h0(4^S1eq7`u*mb+c=3%h@[Sj%VIHlaqU7m+fU`SUJ_nB:p<cOp(oG!M]P9.@"N3!9X<S7`B>Am4DDt#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<=[s<JmU"-\C5L+`^6j4OUX@IitRuCF>kq/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+]/kq<Fb1UW2;jI`PmOZ)e%Df`rM_lqGVBK5j8U5MpJL?I&%I#W*cQ!$S-jJFI<@VRNMT1SK:3*:de=q(j6?`He<L'9F<>oMg!,D'i/AkOl[uJ#iO;0//HjE8QP975Sjf>8bWK)\P72%u0i3rS;@>f!l'e8ue6)U=;8dQdDak5T_<",<EJ"*i,ep&ZD#+ec5I)fr#RD((2*Y"$`tcNJ'j5NtFQX:n<kLN07?Yu3:X0H+OG5OI432k=%t$5!$/QWeR%eK.%`\u"Mu!t_K2YR.O%qk.I11*u#-?=)\&rb40(gK6=YDSA.nr(>)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]<K!VUH=b*Gt9_I;`Q(UMYfgLZD;*Wg-kV!VX*^+,*9fah0(Hui8Z3*%e+@/,LBe"kJ5GRs&Iu1/sbgI0g>+R1ZiKKWukm^R9T*Z]*n?<DJk,'$]Bnqng9>#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'Xbp<eO3HUlnTdR@S$CrFs+C&@!nqHq[5^6l>Z"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!<Ec1cNLc!pN2Y\A7);<SKa%==U'5h73q[c*Gq\k#PSg&20(J4Rps)F"[JGn!>W9BpB(IR,bk:0+Stg767<r=iia:!#E]Mu$1g[fHh!eM7<jDTR"Ts5+RSC]%Q$G!2q>HJ_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<u=8"N3F6\L&7n?_H!kf@1``%V'[3;U<.W<O.Ld.YR)HlTK0H6/o]:_Kl!p@bQ5aWHm:719./&t0P88-/[/mS]17;<us%#o+H=`IEC@gcALDFB%6=fIGkqlhsZdM%,N_bg_)GM0.S"]Y)ZQq"St*#Q.peFPLE_%;Zg6I`SVAZbtVVmQN`B40CAH+,ok;_4cOSXaIsG@co<4^OjCsf`~> +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<u7#aJ,e?iT<!a^K#>\[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%uf<?:G.Y?SiZt1n`qSi)s2I`6e*!jgZ;,J+_Rh%<[mW'W4J_Qojb+>26mXl4u)'4&T<rT^kIchXZXR^6HU^Emc<,%TS/qNdibYpYdGuR[2(Or>.@^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<H_Z':QBO;q>-4.F2A+&SEM'nqK&\JJi94<=[&rM;';@6SZBG^ab.[['Jr5#D,$oR5=JWcZb-ac8M`e)2h@)O_f3gA(rddC1re<Y/,8&FK(G.h.FgR@@N!:*ZN#g)sS_1G'eI+,dfNDjd4>!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<m5-^KCc_]KkhWEaKq>=WR].iX,ofD&N5/I2<C/V6=-)=ir)'q;](7n>8bfbghih0hp[LMe2@jV`%Qr<0d>g:7,mW?E,@`iNE.%!n.63365M<ZjUfdsk3rsn8U@i=4#.P$\U-p/<4(6Jf,pK!I[1(3D3l=f*-TI7o3NJ+N=O((qW&u'1>=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[`S<n\//$hqN_ta\GV5R)?rP'bV7*;8:m&3+in.c<5Wj2hn\ua7$_%'$_(+Dl41/qTcnrlW9"Ni=!V%L'mPq$Z>9: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@,<RiE-S4Y8Oggd;4c20gni/6$aEdQ_rM]hKX:*N1';+;UON]s*e]#3-r1&@kim1W4?tN,[b?*2WEl'F[oaf:3)D,%gVXAjG:]2<8&#GiREn61^m$9icOV(b;@d(LCDi(9[2BkE+1E4"<K7=rD:,02-/B&L)5e8V7R4Bf\k^udF8muaK\:^B2`hD3DKb>VN-T<Lq]i#U0]s//.!2XeVR"/QW\RfmH08aRD-8(&fUu*R>iAbEBa+4Hhc>P5n]'OXd!Fc<e_IHY4ORF_C1dU(%h%&jJK9=\.4:md*&C_dS$U-L5@L3HZ^H=Ri[PrBM80@$feeRW@Qec6[A]*YT_f(i]NWE:VCJe5+I0E#[ai<\S'Qq#SkV:0qutTT!aSj/B.Nbo:cB-ir3B;&hisf]5O-DC>g0l201soOPA.*Zi>Bp0TJ<CRHr9!3Lr2j%aSEb_(I`*//f4a?IdKE.+/[\[2-Q*ajrn]OlE)$e5u'-K*(s=2H_t_@puq\Eu1]\Cn'O%:)o++NbD#*:?[<W!a+*3UtFR5HuB[p1.h0u(iueRECR]Y%(17cK$;Oc)aE/7$h,E]5<B.us7.+dq$`B3&^L'Ed_^.\\W2=,71(spkm"o@eET%mUX&r4:scn^G_s/R,#I1n#5O]4HSYo)O3n?!dn4lUlj=Ob!;.1G!rC".m=JW\otk52Nea5ZK;4p5#k`m7)u1F+8nm;^HaDg^2!oZ5bf8cL6>1Cr:Bm[L#Gh"\9,5)!9l!C3WFE:LR'SiW[RL"75BNg3o(mP0MQQjPbGS..)<T&5Q9BiZgLOjo5Kg5Ui.m6%S3BM-kBUT$LN>%h_&=EmB/C7m#r)RraMhoJkaFA8R>1D".L=N31G<o;*:$Y(7A1^Y:_/(FKMK5U-I`,^N#?K\CtV.:B3t!mF^OHQKt<,#"qXTq()jXs_SAnIgHN\2EYDtbAT3nY;?o5o\JY!<5?%UWe%6\cgsA]706W8'lqX>P@_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_>VLs<Cgp)&Wp5*&Jt;QI]Yjqmfj/40Dq=MlSo;W$GFr]'$s59V%9PA-@)C\0'<[!Me;T%"A@tOK?^9<-?RKb,gK@n^]hX#%j3QSROLo"63>h#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^`s<QgakQb]6a:*7f*7g[ZZCq<lq_rih;#Fk,e_FdYL4\U`E;$IUl#-;if'`:<BfZ702/]!UJ4hei]U"g%+d5JhX2UV%]RNPK/a%2[*"%4gN"Vd_AD*\M^mGIgE=.ncojsOE9COJM?'23tr;f.8j#'R9aOjS^QCoWWK5STpGA@\)_A^`hB,Gd]i=&Y*S#)07X)@6jV?:$O/XqO_mePHJ^N"%f"LM=[8&GB`T[g#6J+ST@a2[3f/+MZ,WXpsTYj-[I+ATWF!EG:!_KhUOD!m1n<`lS:CN9cp&S6HOPa#-?p;P1=(ek<52"!+N:''s;)=4q'u)<Y\7='a.mq0;N`1<uGEQWfMkIU!VqVd`t0S^CqD19[E))<XQ7/#b^#6:A#X?;2\Ukf)+U7&o&p[XtP>d%:o@[a3Hr(L0`N2B!+oCUMK4!OQemDLCj&mWOdL94if0K:C]KJb3:S5,sg`b4QH#$t*#F*ul+MpL*EuY0XT3Wn<X)Y*cW_dI_Vulos9LK6'%L-T6H5bj"D'Vp?;9e->a[<,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"nVjJ<F-j`:h(S=[kMn3jM%&dT^CaY&F86M/?aeVn$7raCak7.PZ!RmL1dN82UqkC*4I_$&j2]IJcLo=b^[7>0Cba,#%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!IbQSXG6p<SGa(<O5U<nV(X3?["jF@0jN#R=hfc]bn#m*Xc?91OcS=ubY0`E(W*Sn(%$>VA]l1"OPG!d>5!%bts.e;IecP!K>;8IhFo0,[chp06T4*lL"Ta.(^kgMB9;:]9-1R!d'tE=fRA<DlL0PQ+*UJqLEF9dZ,TejrIcFKC8h_Z?h"A"g__N4k3Y+]/.jJJeoJa^0N7H(W$6KFlR\M&4L/!]0Es`30K+6BLs_!ftkW=_-&;!`LNJnQuor7KTg\'"G%8o5Le[I+g//'`ofN':NqB+b#d)PR.o6?0M!bZT'EWP$RpUGG0gaPP32Rqo_9F"B]c&Hi)oBn9'!ImFIWu@;m#I3rApEoOu?C"Or_nc+EBES]sK3"H;duhI##@7M8/*]8hq5_L+i4>s]2W!TA3qqn(26R0:ak.la48LjVSZra-:),V[pqq;=<J]tYLM`qKuaBIn^mY)2OG!Qj0RZ2G6SOka77N]b7><deU?#rf5)GPsU`p.M(qcb6u,58M>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[<GdcF@a/!Ca<ogsT&r4t(GsOYge7K8Xd6O8H`NT,`!qVa$NN@WHXW#g($87E%>=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<f!>~> +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<P/,`/:@ZHHRmPIhXQ,]<XF8M]VQFZbSFoji98r:B"nDc6OKo(fr[ilOhlE8!4Hbc#ZPWIp4u]2aW]-ui./U8<diF%/ZB0Cff)F&RmR<*+k'lqMIIWnIi5g2ad)D(.oWVo.PnO.oTcbL77jTgcYabiJWl=-J,.G(8mnD7**Ned?QJ2f5\MH5!D-00eg[s7lG[gL&gnmf)eVX$9+EZZCO>kQD)1+`Ys'dADjs`G*:_d)rmW[U@NqS-B]O\4uuTq`NRZ:I?!fFtMhA`\)onL=NMb]c'_RX*HOo]Y)^I/lf#PVJ^<r&Ym+Agk\YT"qmSgM@!:?gc+]Zr@hgXj6N<?;MAfZ]D!C2r#>l/_d9b7,8c$)_?`XgYhFC4Pfc_Gq(178geog6JLG?:):_5W9B<fFU=AJ.pe54jZmlnM`Q=u(1SENch@q>Wa8k"W7E$@_s+UP+;a>[]q`NN[\Q)\\<?BT+EoZgX+!?CUZ9uF-i\]oS!Rr.j?A_^f&bR3m)I]4/*uQB^EZ,/fi1rc?]ac;]orrt>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$r<eeic=)UDlK/Nn^H=\oP4fA-3T:SqZ2'(9=L-<`h5'Yj8oMu1Fc?Oop9e@l<;)<8oAR.$4D@WOX%fiENkM.&AS".]Ka[?e<p6T"\8^n9H%6ML2h!8T&,XRP.$hS0DWG0U0Aa:jh3o7#1`up3]Zi[SV9PUT=FdJRm#>pkB91L\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^^n<HtM+V.\0F_Lo&1i(#3.3[q3eoj%LgW3B]PC9E3=p5_p30.jUq!u)M;b,X3e[mP=UlEgBn#BVYFITm/f-01.c9R?>h+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^LcCfk97Gs<JU7PYXOPBD:94.hZ)gNTj9\J=n[gG_3&k_5Sbh>Un3bkQCagD7/t`4cq%&E!d<ck!/JB:6P`*rou5p)b;k@&*+%VQB&k`N7]"p?#ltH,g<@n<K)";1-a,mb=TIDt`JcWUgUW'RV:$.E:Se-iJ:pV6"dEXk3&8HVSCd\XO0C34ZLVf2ADkPrGFcH%Z@`Ebs(S_hYA5P5STeVHXi[Yp*K+RXt2R*?q$T;MTlgf-8rYN$4.AnOILk[iFJFoV"E.I&a'=D:s)rQ.``4I!d5ZbfMCUN9Ce\)Z[uNKguS6&>4783'="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:<E;&;/&M\1+WSeJ$D7PTd0Lm+i#b_3-(k-B@+oX'q$+-p0eeO=.\loSg;kn6C0@T8(i!9XA,s($u<=HeirhMOC5g:82oG<*-d!Z<,BMNcFF_IG)aOgX,b^rT$`,YW1gf4S!5U?trI64qU0O)q&kU/<u4%`[tZl[La`>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#6<K/,"CI"HiVM^PXBX%!!Wo]kMUu;^^)<?.NCnEDR":@JeAV;^bj80/DVpg0pkl%#pZoN&*[`7&GjL]cUQO?66X0REC&#J,[t8r'?Leh0:mkRZ+B4!Ff1+Y-,7>22TmRU: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$'<O5tr[U87Omb5!]D-BH.VmB[D*8(3rLZ^CY.HU`_TmLK?7VjC\h@'MO$r_RmPVBj.58f2*pT1W@Hs6ss0n*>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^FI<J]*_6&BO`DS%DG#sPVOB+3SFV]WJ6O,$Y8F#i!:3-?Q)5Z?5Tba]8A"f.(W6R<`]Z8m&]H?"];6pe.1@b$LfC&f:!MT?HLdb,LJh%kR];NK.8eKKOf;bHc1qo;9,PRW4PtqZ-1!/^FMqh5bDfbJ#iS?&Jp&'&(q$MG`mGfPUn[c#]GT(KK^h@^9sQ5.UHRr2:agXcM`M(M#\mi7(pJ"Q$W@Q05nP8)2F\LF"&\t>9uX@C9\^SH%iAAf[,p%d#CP0YYS+`)22=m(=X@8a3IZZC8.l$qpJV'E.,\Jtr61S?EgJhGrB1QS\C6l>"ur9AAAdgcD084T'#ARY%U\_B/Jl__Go@,K5oRR<P94mg0(+IlGHtZgnND+Wh*Sq*<>[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$<PdI`Uk'Z(&cCr=pVaVYj%%`Q%?-np%V@e-/%#ZM&m1\Lk_GZfq`%+1`>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,:<I#="IR$k!40pq7.meJTH;"8qrBkV#DO\f@iR)2?nMrJK(7U"_gX+SH"R]#)=!72f^]5/)oAi--c^],/6!0;IJBd>K8R:)5J<Kp>7na^4o4`KrZiaOtSTXVT*gj<f8!"K-cWS(;sAXSE*:rpgWKo]oaMh:ojkJQ@\BrhM[JGi&"n:^[tLaUS1R8\+-c~> +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>h<bHleEfiUC\DUq^3Mq<#<Bh0>0Dmad.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<gNHY/17r*fX1Zj\Ss4eE7pDD=gPQB[!]FHO@#Mm.oj4$QMkltfA^V3G_HgnT4pg$!M_dko$1ku*)HClkXTe)kXmqlU>@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_MFSj8<F"&^#d53?,)@QLV=c4DCPnGtH:0PFp1@'2XETr\+I7>A6)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<f0neDHN?<8@i>%?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.-BN<Oe#IqrV1NjaH97D*7HAl*l7]n4Ln(=#6@P]9FQ>b@[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@.<ml=nT*t3/M:gSoIWE^Q8G\esOE7%WI'D]Aah0,mWQmHMAZ\1G7Mqb5(srO$ZDlteV/@JO4#2(H5QrUs9pWo]J%j':"eg#t<9<&c0T,&g<7^Ilc;T,Gb1V\,Hk7KR-4?[1\LJ81NPa?QN'_IbUs\bPP+eQ7(W^a1e4hl/b#Z(Jk\@lqnman+/YlN6%j$4Lp`Lu"ld8l*_:Kp?T233ub_-T*q!H!=!aG)2eCgt#>oTK'qGnb<k\et8.5-e;1iEE*mWScP0*NdtNQ"uVg`$^:HIanX^C)BG9ip=p5PRruSB]jQU1Jk;g0.\)$+a9?/%;*_6Fd+pBn>W8piL3rc%BRTN%?t_*;CN/W<ji:P(*>PT:m;6?^)hj?/bbUjaHck4M+V$WBpPS[6(8QZP9%CeGegKQtOUiBU$]#,7HG7Y\sN$=s6I9_<cM7L-mTrN>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&<g!rf(J#<:2\ElJL*p,=]#jrrd;0R$/YPMMWVb3NFAF3Ndr@+.Y>A<eeKIb84pJpAil"sGS5S`\PTO-hn/4T^U@8?)tg@^qq`(du@om#oN,\/h<0c6Jg#;'L6gaphbY+6IFE$N6q!dnKGnk2Q0k`Q19DW?-L^N1ZXc=tRf=%*RUHltla>#%Dl+Ss2SX%G7J7dH3bX>3q86gWA=$N<g!i+5giT9\Z]rP(4#nu"eKCdA,:8*SUXXCtutitg/c8D:T=0<3sOV5Mt"AooolhG5cD-WR1EE,3PMGIGs#2i,VI#47X#WNdn1/B./Hg2S%E);c$30'mI@EK<L-"1ghhKjVcfYUT_k##-@05G@.N%X2A2e'$j*"T>(g\^.3\.6$Sf:^X%*.Ia?OY-ZP(MofE4-]??=`A6dlH[TdmmF38P<>WXnK`\/!EhRb;j\YQS0)<kX&dH$'SWP)&N""\)a:QLY]Ag-JT2f](=LB6H`M]duT7U'q_P;*t+4Ei^"j0i4"-8LYmTm]<P4X8`KV=l+<AT^I1/&#+p&lSAWrSs"&BN\s6I**PP\i[WH\&[3O<2u5GjdTap.pI,-8Y2VV2%OHCrRDellk=s%gf'C#Ij)C\R7A<jGqPdO,K<b9\`R$?(QdIBN:iqQqnRLdl&h3_XV*fX.d8Si<2R!>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&@)<!@8mM%6@%'?2PX)b7+r'_tL2sUgR"H4h$D#UW[hm2A"477A+@\(P`%!0#FFRQQ<.cfbD_qIj,=lUoZQ#T\H<0jb2R\P=V>5/N#<r5bL#'3#oq>3&"3Uff+XqhnZ<($ar4iL`&-GaS.8u;V4G9"[8V2-I$`F\S[-UPrTGY&9doAflLn3Z9EN6p]Cm@;:O3gm"H3_9KGS/4dU(-<p0ZHugLVZeNQr;A7)um[UpC@?,d%R/3JdNTKr(#I9F)eTr[SF/SfRR*Q;.4Wp&55YD`g-mb"XHs(##-Gg)F'SI:;e@_-544RPY]o6B5(-P3cHX3+U-ljY>TjkJ)bfa4qh:k<Th!E;7Pq(IfYq8Lescq,6?ULjnO+o0\]n_??,_W0$Q`mC?&,XAGGsEMY8hXl]N@&9m^Gs2$'GMD3kQE9MaHTheMH5Pb"`34[ZF!jtXSQGHmZrJILo]k0!8qoB7e-b?.8^3",oD4s%kXe3eUM"!iX>JI%8Af#o:7)"3U:_`gZ$$(kp_MU<m3DM0;,#t3SER#nM;RFm(_Q$UTiB78dAIjqE1)2"=F91anf+;Dh%p]`u?-i@EOY^ZNC_rDYMC;Q`K&f*&:5-"ma>=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<Zmd(+E"6=0N`FqR;B^aMhQPBWpAd2A_,G*!7Q"(2JY8'h\(,a66ns>_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%A<ohpVW=<'*VnH@5>XGW_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#gS<m4:s/a[[]5pRk&nY=B6$9XGp35.T[jNI8PC9\Bc%nqam>o%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=,TJ1<q$;HL2"J-eh2=]^=q1f?El+#]kMq3?ED!PHZP7_D7_](?9XbcY5ANGRS(=jKO_0JsZT=-3s,8.b_fEppDNf&RNna1/Hm$5`?f!HslS7N+p%-,f[4U.;92;HO)?CGa(hb._bJ&>eg)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\-Q5<Ybs[jjk?Yn<,@9[pW;RBK>9#%!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`><EO%Eo4M[g<4PB_bIRZiJIqL4aLVQWZp8!!=\&*mIT3Rr;Yub+S'eDH:9AH=<MgJlBuEH&]UPq2cr;W/AP2%o+_ss=QJc]YFYm;,*JL>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<jL<%[:%Zoep,O"W$epX8"H##Dh^Ib^O.-r$Q.3AJ/^>>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(8Dh<tM5d*(4j^plL=A=@WKed<JpQ=Qo`5X@!tIWB8;j;sB/@AWh!n+%M6nVhj8coi4)q&8WkKYbd03b'ZQh'+ffsPEc<@&Ru"FB=<[[ZVtBm]UQ^HcXYZO-;^<aQ4tfu^AW;#rU[qO0=Ml:pWXN%P.\A]?9Jcu&n3[_IN_O1OGV,EAG)T@2E'EkLk_P)ml$dEhqnkrbCL"TH25>Y.#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<FZ;JYI]PJXerDU*sS!IrV6FKARjcb^G$<aoN(sbkKER%-IoH`[3mjgQT!1!,'bBPqN*P#jbV0&=Xd8V=\5(7)$34#L]eGs2@ic!"6lH_a)&Z:gd,9.Q1'6/V`G[G0`0E]R5/8i#FG96N,^0Y&b.OM?*i0I"\k:Fh,%k!d-Q&4(SrB&[RG$=g-o&D(5/fG5VMF8CRV7QWHhj^kq0D:s'Y'edk-.+#-)6&Gf0E`QT#ICV2%`jkIm:2k#eikHdMZ-q>$D0e]&=h&n/2,<cK*T_NUHDBi/ei=[d0CAL53O7grT&Okq^j2D$t2b$:Ij'KcR*j!1a%ic/T>?;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&\F<bW4NDHoN%SYl"q&nc=AeeLQMM\&3S#H/=e3G)UgBBiNipEQ1>VkcRVFu,(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,>0YQkrgJWnV2Du<K5m;q6BVFd@#!`t&"**kSc?)'^IG#L#/OA5-mAf8[A'48cfk1R$S==*mTeh^S@MM_LCr"QZp:OeHF,EZk%8lV***sN^HOf(XEGQ:X4NS)>lO]>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<D8_;ft_Nu=]r!Y/stO\_H*n(8>^8aq`a\X#kHCP8*uatF^+i&5&3C4(_P9>./ca[4(j=?<V,C8!j2g'rKl(O`j1mO[2CYM5$dr&g038^")!>Us7SXI:_YuBAL_gKT-@c#kLlaHpNH^6AO/c!9VfP]"E<!e>Q)Wt3r5X95bAhs"NKM,iemf`Q?@LSo#TS%T2P_]8Fn#$if=t"PU1_+6HZ:::G":)Q>i4\1cV"0L@"L<V$Y[)-pn+F6@a[a.P'_=+F*Vo==?md@All];M3XG"5^5bA)f9R"Ij9n&KHD>H8I<YYKi.I3jG)7hQep+$3pD7;a,a0Y$bIUFq/b8mXUs>Y)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^?o1N<ZA@$=822gl#f&.(JZ/fDB])bq=L*_X!VC@BDC9f'7qmS72`W*'0QKOJ[^Z7A&J^+qD!V&?`>Q~> +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'*<dC,"G/`an4J]%,6afVS03`;b,[FE^I8Z?be`"1;kD,[5EA;M/\GEQcpW5VV<7U8$R=tA*pq$s&T>c`&RWV/M<F%P<Pj"/M=8uGErj#@ob*$L<JI90U;&Q3WeXs)7kHC@TQJ-dgI6T@--_`)j,hq]oi1Z^K.al$/i,qG0iA*QAejnC*<$SfC`$gZL>:H.DpHjQ$WBJ<t)"juSbF1u2d$WmhC)U)Z4$uuB#H!aLffZs\&\*jA@$6I\diEqQNb2^'1f:t1',`rMA\Q?Oc0E3Ml?mT06@=>)6mSDd^d!^m&3@s'p!,lp\0YT'%3gXKWa^>)B5(Q%#X;<JZHcjhLg7]OI,;?q19E5Mfid#)^GU"`AL/5<](KUqZ:K.QRc\eT3lJ]i+X-lqFK/@Ggk?2Z-4@@'kf4MP6F8d`^m><_"#/:WZrI&A.AgBmOM+N/JlB@B+-!41'(Uh>i)/(SDN=6]8.4,SX'K>XQCB)Om.^CJpCTmI0);6";iD<T6&o")OApXa^";jqYQp+Ib-<#;A^^Pu[H:1r**A>!5f"lU^H@CbI8?99e^n[nm?<JIFgKCs.'V`,/KBgg;VIMh:g8m[:!Hl97b@kRC\AX,WroRaf%V*jN)(%-SYM*1BCS:g%[[L,QK'@teZg0T]k?cSSK2g_J:tF"H]@p\As\XjDU*V#.bS#TU*hW`Q1"k3''E&,d!RG_AOb@Xrm'fCc)0N%8++qXk8FUr+3MJE9V/]8$k\n;66r-Y7,Y\$9X@I(-TMQQ.itK@^]Oo?%dfpud2)kTC^d"@&&$He4W3+#r%RQ5^nHYf^ds#i?=[=5s0S.@D2^[!mBtWRE2MRK($1\WcpA=s#=7*7>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]/5<rdZe^SVEP2$eZDh$;N,dHCPVcq;"BM4o^.;LkAeH1N$C1\i)M%A3T8ar'^ks(6B*tX(LD%OPjY0-;?CB^i.'<aX_@$n?(4]K6&O6gIKg"dnk]nnrBfX3Zbgc\5"7h<?Lt^EmL<]W!J']e/]@Q22#k/8cfRsTZ<2!T.Yhm9_k+VY4)!/2bWCC]g)NohtmA%p9T5AhWF=+YGP%VP/u4C,?>F+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^rmBgXj7e<N^W[*%RN$BF_kW5Bs&K.9F$C-cYC,L])o<EiGGIk"Kffl`JcU#X0XHDC]3'.D^M1U7+gtE9]/Op+`#uJWg:i%mg>QQ%@S@`'9bOP&&CG?O7n_&M_W';Mqp7AQCh<P6dC@G<&%TpF)T6.T%nbC\N4GmAJ@0;i"BZJ$-\faA=*a`YU3n4p%T];(1c@S7kdG;`2^SI$$a7lN6IU+9jeJ\Rc&sb%6j88bp]arD^K(QT4BOV:a%,_#5JPpP`HB2DmNj"KfK)DT8E@uT"RmpLr6^kICV7P5g:kl'KjcUI]s;;fVgVZmI=p(&Ussqp'*lWe%ANCj\N$MC"X;^TH$Zp,O!2N2,Ka`J]^&SYC37$(!_*P?/M&-/?h51Mfkf1NLD]*I:`#u%13sDZ^BF']f2G(g'SYr_K%_YcF`R_":Q!KTfooC,1N<:8Wtn0CI2,_pRa>E8-o1`=sILL<YC`b^o+&99SZV-J6;Y5i6D@T]?fjqhg(.-WMipAW8]J[.O\3rP(/9+/;44CG[qe2pcB/5DRq/)Ml-QP;@-Eir1#T;#Tbh1T;2dJg@qZebohu+b.rk6YaB(_V8Fk=HJ<T9b5=e51s;hq5D]YKA">8LfCF>m)d_5^hk"0u+@l!E^6N=tMP]<a[3*0]oR;s?O&VD3mcE(]c`sUY"o5R!k&bHrrmXN2DS,p]h'C`1Z^/Q%gU7<sC*:Q'FKEW\M"Zbgi^I&'55)8Hs75!pm/I(f/P'j~> +endstream +endobj +90 0 obj +<</Type /XObject +/Subtype /Image +/Name /Im1 +/Length 8197 +/Width 432 +/Height 219 +/BitsPerComponent 8 +/ColorSpace /DeviceRGB +/Filter [ /ASCII85Decode /FlateDecode ] +>> +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=Ht<GCK/Ho/cVjY4iD^5B1phn'%>LM#[MUzz!!'gHPa@^i=gFj<^OPIIMMd:sZ80`:#lqb09he=dK-<HDhe4jT['XL!='+MEjRi-<3P*O>ZY&U]]j&NC!s%OmhRn,nNK%adhnFO1kKhabcBOW\f%&:Wm^&U\@Hl4:qMZ3j5VJ<K:U\JCSN9bl\bapLSfY^rp@e2lB4nhpMuWjLOI;MNRCDUUUZHT8.[_03Rr?#DE#ScWmoNUn\7a,/2T,6KMi*BKQP6e<!PhL1n!gNj4JU<Vgt^,>/6]F%mW+66daHk'>/>X<f@QKc-=)B9!8n;;mk::oF_]sVN=?=+2E*$4.)>`'!"^9qbKGg%Mqct>JqASl]BqNB<B0sh!!:NPA&j>t&-*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<Qhdbsdc@$W?HJf^YAJ0"ccLC3YbcpJrJ:k9YhH3f0F.aUOJ%tW(p"aUI<TqCT;mS6MP[_&QQ^"m?YVPU,o5M<^B.eJhL6U21\:-q96=BLsH<@3p/ZEfY<<**.fPa#:R64XAc"SC%_77BYu?(RLRg<n<aB"GRbfN+a>.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[<<NM6D&^QcLe;iBht@KU-8JHTA%c7+)=XoIAB$nfV(HFhl]+jpn@ER_$A]CqsS;rgU:fk-gKu/"9gs*Id#X8cf)6RX7l2R]@t^qmq>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@<J*mGWgh%gbB%oFM`#+ea[A*eFGV,kMYp6VsG2KH:2@#R^3cFRA&7U\sn:4c^-S[m1ITcpNMI4ac/gIb6nX$9pf-j):7"n=bV&kb5lh*e*\i,pq&t'b50/ge;qK8Wf.JMP6aAA0'F5@<9g(TnbnsTu-UH[^YkT/RGMuZgYW'l=ubGc$Z=8H92("e&dg!N>D/:*Wi$j$Jg&BZ#_9-(Xo<[r2[]PC!e,R<Z1B.kTLL`W:4%&<Sr6u:HqRARHDc5.9!1Nd^_/?K"I\25j4oYdlk(jZ%Hr-PqKY(hoY*0A2;QIs6\lQJSWV"+S8LhHk28YF/aqp'.<RSQ6o<]D_C26;,%Lj3p"e<_KeHYJ^?c<j;t<*#5Hl:(G;MG,PcaW8(7%j[!/\mmMU`[4Tn(^'s@8W]g"p*O7P/l?@KG1F4"Bg^\if"s5':W!CNN85j4oY]6^F@n)n<`Sj/i"]T>@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\nY<UhU\UiXNoW]SDr$<"M[]o;#_X6Kr25=M;lBC<rpoX(Ru<IWn]q</3$EWN?4B%#64XgVpTUdE)gc8'CDT3*`9>TrO;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!<ZW9Wa1="?g;2fC<DS&VXCnD/;oLF!ga#_X6K!iq(lgU?Y<>D7h&ImR*KQ'P<XU[0^,K,t)fLPc*!U$A+cppEps;TtVgf3H5-*H_.blsY/XH3f0F.\,tddA&n_6e/sP^&9kfj<kWS_Z*&7`penb[^=*sQKOor5j4oYeK,JBlS'_YfJ?t'>+..]I!W&c1[/h-UGHOn%nh-1+V8su5S%`1n,mO\6?D=Y:G4VD*8Q*/IK$eD@He%\"@<V6kb1A!&(?.Ad\W<$J*)P!FT(n)at(un-[St`LE6MjLC3ZM!t/LB*F3k0:Eo]1-77/.&(-_NarZj1TnbnsTu-UHZ6f]@%kU!BN)m*W\2a*E`<m";p"(4U?Hf>(N^42,cpIt_G^dr.+niUlcSqJUG2bn>0;nO;F)J=65<lIDO+3BN`:J^)!hkAV=*o24*BFVO(Gn)"?$B.^XSMKt5Pl>3o8`Y=@e\Yf5+o0f<:G3D@U`eqIXZ0Pm\W^J/5'R`g7b$b+sS>MqF_5$6W-gFg]&_d+V8su5S%/KdmMGF9@Kf.".5Is56.XRZ<Nl3cD6I1]3hSHme#bmR@0Jo98;<C>#n[i]Di?(+`QWgTni'AHT.4S:h1hWIJ)81Wmg're)%c*^HueniPUF`c^q6kdG-o2oFQ+s*YNe_?>T**at%=Ua<oK[c'rQfX4Apf55rp&6g>;#++coE+h?%=,=g*J>AQB?BFNF*`!EBAYeGR;g:HtCf.U@:b^,+'oFO+h4XB[H]p:<qfL'emnOEM@UVbHjZEgd$.p%nIrFNFuRR+#Y$Pk:LNfI_$\p)Zf+V8suE4(HJP7E69=W99g$W><A935E<:R`"4ALE>`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'f<Df9PQ)NAHFC$a/hS'SWYX`YFuHi5WK.gnN44S4_?l/CU=kb3(!HY>1&.P!%&9QbK#8P+c`/]DM]"[)uT%i+<%k?7O52)Vd/q#F&h<u9U$[(3#XXh16]5j4oYeK->KWl(M-S95>e,9ne`@q0"cDCJoX0'FGiHDj(>4jQt9@q&n`DCJoX0'FGiHDj(>4jU]p.4H^:SXlSC&[T/\Rp1d%\dNfiKH;Vi6dN)a5GbB[MTsZ#e1;X<B"#.VW\\hM\fH)&KH;V5n)5'iTSLgtmNHA._-g[*Ib%$=6psGA1NqB]*I8!E*\(F^Tl(*dpbD(UH3<dN#X).[LRs8BMP5f'TSJ1Ab((OjTncO=LP-_kJ0'TALJje#j@Tpn*C::-K-#oDLJje#KHA9d*f?YH;P8g+H4PMq$QTH5kKlRNoM>neOO-?4cpKP[:^TGN@<m,YqcEFapCCP0;,L1k<i1-Qkb715LLTJ@'OK>-VPY\m_2t:]D_rA:>$<bLX/g8]Er,Y/*8TeZ=gN;?hCX1]o[*3V6S\40$9`\`fO.W<g2*6;DdHp`,FdAqDr:Kgo/2jjV5:#2F`i;P1c.%&Id#>X*e+)KHKZ@@:^fLO6F2G`_^m5ca_%4s)f."9Rr+?::U\JCSN9bl\bapL_2DCKe_AiJSXjW2AGuAt3Tn!?ZHLlZ@H,4^;]X&ikC59C=:\a[4*HKXQBk4<a[6"ZPTc9ojU.\Q6N8>G)]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]B<ifSXW5@]l*;`2r?0rc0Ei[D>q<&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!?:<G.uP/p'%cJt2qWlA_pHXdVQd:$h19%?/Li6u>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<fS9*=31Fd&<*im;>[/iCpqq^hd6m)iLLTJ@'Q-.lAsi$?%qi5nA'dTh6P%/_6Rd+<rm9$sRqe=[D'%_P&+@/0LI(_roM>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\<cj@Tpn*'b%*K-"4&mU8d_%&&H>TSMTS&!ns$@8MC_4g^N<P1&%:8]q#fgNP"::_ND^cpJ\t6`.9!<Lkk49N>(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::5<h@k2g5qiKH"/OA'g5V44o^TN"##*=hK"L[F\`SQ^;@\&oR/E8kO-V__l5b39C3r*YNc)qXdU$h<ECd/_;M^WLqumlBe<Q4^r2DD3U;s-\cHpq<P6?39C3r*g/$:Ci)TOrI]P^4FHqnm+J_q-(<SDWpSQM>H[IBf!jO76%Nk`%0fF"VC.t.mVXtD4CFk<KH>__qoc'fnaZ.)%NSH6$toI!Fn3-0Xugq"Un)l!mA4$*4WD9H/td@Qpa.2SO,g)an"h7!gc595KH?<B4hU)5*<lZgV;M"*qXs0@%A*)WZ\Qjks89`f$ifgjs#@[?JH:)d6$!S"bi)4IQJpkbe&7)jab:PZc[S]^I,`.q76j-L#sADSHcVG:Q*"<%P3hQhZR+33@UfZM#r*?Xl4$.*>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:FiTH7<NGnM?U0/`&pafaeO*>L-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<X*^nUtELT1F]W3hd5,5AKjlra8'^gkDqO3+0D6UD:a4g]Cl"BADt63;XSLPF7:`T/nCrR)X28E_4iLI:b.ddtd`G..373X#]Z`Z'C,dNX!.kTQUS!aE.^gpuR6(=Ub.W?b62Q9?S.TSJ1A!d^fE[?X?V-p4"aiT&q]Tnhk,ES4iB5P1&-ki%'poZfOG@UCm%$NIcq]C5=TK+ISo-Kk^u*0uTp>.^*[j*;BW_H9"s[9`\9H:Ug'OPS@QQ$ogK<mP3+NmP]8E97QlqlKU>/f.d.YC-2t>Q40@,'ldToWYBS+4<B\LDr2;3D@d3HK^<B#(DSMQ:1H-T0/NVC4-!&Vs#9ap\Nk8fsWVGcO*pj_IoQtc>.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;54jqAq0Ye<R^n1qI]1/o^iRjih46aS5O4Z-c@9.iN8U</gq$MZQu&IOj@TsO]?bk`!Ns`.j3U.()&V;pKd\?'^U,tC.R.]:Dm/M9RA#Ds8e8CLkPqI!`B"D74:47DZord2RD_EZq+jgR!^FTTacj$NKH>0ZpQ05-??-@cp6lJD!foYYjZ%FB*dE4-H^7Yd,(cGHp:p]c_a+gTPo_\2<quN(P^q+J\U&Ss'ac9^1;C1u<5btI+9Qp\0(uNMbMC&:$.)'8"pXkQXCfa?qgkpe?L[GWMs)=pfL,-9kb/gG[>SDl<'=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'bt<S92\\e4-VO*G'.r4Dm-n8"9"pKI`%Gq)"`o[l="46Uh)_J2HI#DJZ#/rrl"'G)"`npmU8d_N*[_2:I,NiM:7qKkTMt:_j$CM:?=9slk^-.V5*MS5_&!k5B2!*#!JdRl!`o9FWX:(;cQg4S#NBd=h8^S#6kLG64a$Oe!i)U+Z\t!:/4Q'E,^h(>nR_]U!Bka++qDF^83gG`]p,Orl"'G)"`o/4>rjfI`.Mr)"`p:6U2/JJK>GM#j<E[cpL,1!BgPhH:[6CTSK1*%gbB%oFM`#+ea[A*eFGVUqn*IR53lR+Ag=Q3KlT2&ebpi%g6EP:B:#`m3)Hp:r)f:!;jq>!%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><ZY&U]^"^eA"TZnP<`YO2P'QZ]2)[@uR=4u+c(@5XH<"ZnBjG#8jukOX1uQ5Z!8qpQenjp<ad2b%;l<g&@Xme0l-[/!hVR,UltlEU&HKT[L=Rn31Xe*tdmNG#1,BUV&J=;ei0F?ChJ['<$O[@:m+K9gfNrVr;3CN$C``_/^KRjL6$.3*qc!IZU.'uRnGO'0]k9/?S"#nLDdQ[O>$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`<L@$VGb;p&H+t)5-<b=EfZXMa>Z71X;A#JX138hRo6W#*t;O%&rH1g<J3o_:QB$9P`Rr,>'bgZUebic6C`i79"d;6@_rGo4\<HC76MnN0fk-*OmYI!>7-m+5Hr5*)\$M(%GaZ1u`IMAj/Rn=^Dp%?qsMj&\]!#@Mk4^J!UrgW#fU,ZP0!fPX8?<-g8a]1?<BYaRi=VS*%_m6ic:!_7qbf$2gY*#R\)fBTdKE7!)J6&[H(")&3dD#et])@.29KXe-n-_G!/N`(q9+r[+Rf&#RV>n0o&1I'8`_Bi?QIW:7.L8%PF-MF'2t?Zi>TsJWKO4I-GnoRRNi0SMe13`E<>:.'nHE6Q+\O2qJi&F<LjA6<6rutmO'%KKOpKNm`NL\uE"T?cWn7YaD80(keP$Z]Qp`KRD6\f"[e'12(.L%Ms+b%k_jCT@`TFj%:6o&Ha"2[.R>(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+J7B<g2-KHVDe'7iY?l^Z6nJt&N%d$Ai<8,T<S/YY;pn'[N+-oZj]))@Q5Sj\pOeuEcHqoL4c[45Ia2%d!G7c+ZlB`\uYb3.l`?)&XTE"N/U=*8E7J`3Q/-X%2BJR?2t;KZ,KeIBn9*RUOghlRL=iSrXcHGX'sJI&2;JjO(oGX/"E"_=I0;HE1Z0OiGrk+Ol!LKigr$>F/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<<R@Z(__ISkj<n]6d(jN!9l.#HT2j$FQ:iWbo^uB6RJ]\1#+PA8:?l<013jSkP:gOd6/Qm\Y^dbHc8a<C_F+D;/ch$(P=(VGO4F;&l-SPA,)60C:Naq(]K8SqXIZi5q?r22th<E>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"<gRDc]`]^=E280%'&_Ij.@AkFoL8JDD4PGK#iO^=ctfr9+0CIM:rmH8G(&0:SQ/F$pO+>d"44GoRWVP`#;Z^+AI;Fh#Xee^,JLH[mHf#[(C!CPW;cY%lp#*,,:(inJN7,D2f@g^Ef"b<O0LRl0XC1KUIanAq=jaX;9&I%alJb5JR<&*?YJ2;;@ZPWOu),J_'iI#cM-b%B6;6W7]PIeEn:g7]TX%Rkm?2>4@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?<hBGPcuVl<;6ZE'V#hC\98@$%V6f7Nd/col]d*PN?d\^6FO][m6IZ,#EMJ04%/NYrOd/@]@hqphhI]7KkAlI'$Tq?IV1HWg~> +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'<tE@%Dn!K[moHXO0P'G5p2o^`g$DS_*CMC`][4K"G:i&XHXVYEP[):'XpM$qeWF:G4-5"&[RF2Q/K(N;1(KeCRVtD6PYENI`OB;r$#G=sfoQ%^C,4rp4/:g0e\_n2p9HFnf\7gf':P>';&Z[;2#gUc+7pDnC5ee7Gq>nZqD=N-DPCTlH(uA47!RZdGEZI!!O/Ja@_rm$$&gI:g.U9rCsqIMGdFS$Wk-)t2UbE<BZ4N'k%TeA5nRoDX(Cnc;Zt#6]^OZ*.PhjBDVsj\'Sq)3#im4,)_,(1X`tPKf-hJ[G7*+(.%R(BgF)$Yi[C75IUXggkF-V5$?6$2U#\R.\f\JK]T]@hH_Lmce[aP]1R+.,6O3U(,:,![/.']H3k&RR8<P%3*Wkl"+&=a+>[V+RY:X03E,EeF_A[2/jaZnd[O*e(%RQtF+]-UpW:l'/U[?So3GC40Ze+Ktm+.KOJ<d@s*CA#!'EU/td#c)DQ2L_L8p/"1K#hs>ct'=H;0A\PG`L8V&!>%3p:d5a+jSm0iJa;b6JB^`4G<<pUF+(fCA;[ZSKg]]Q8l4!gR@NF:/nN]c;1!Ih5NJfqQk-7^KJm`FK@K5=:5`2AiK"4&D8"4=9^pe*SJKZFbbRWK.*PLkI?=(jC3It-:M#Do>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<gYS<t8Mr(,A:n`KklA:kh3rkXnHorfNdM]0rPG;fjC%cD/?Ee<[^)/C900Af,Q@nG_AQsUG-m&#Cm^OY^f1QaP*tlrj:$QX,g[SS$-;n=<V<m9ob5K`3nHP$W`qDK[jV6fB1<A&n;[q.[(ku2h_!'TUi&9"#CDPg0A!YB5Z`N%2'F+Q;O1*Ln?RcW&9'$-<N<4P`>.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,n4<k@8p)m]YF+U\!FVNPW-O21Z]bcG(1W3u.!K<6c'*Xp#/5ueQh0]M$gbK\!-/Hc3LS?'n0`6DHWP8,nO(,8_01<$NCngJ^",7JOt=\ZH#@.=Be;$L.fChkA"W.SSCdMG+U1,r9Sa$bQ5'QWFYEK%9oM_I9M#%olB]g9`$h`?#ZQNF_5!M@jm^[;gC].-&L:N%ZJ=-l*^*Y6<W#!?i@%@q$#.P>cqS1IrHX/Sf!&o!IPX2G8QhImWSQ$[:At"EpC@Y<N6_[(S$`ps<m-[7N<M[Z96h/<[qb9lg!Z?nlAG0jMTgQK".UQ&<9u'fW`j,2./6[r9%/'nZ$AuTSdkG^=PAk]9lZ<#]Yk+7_qg;1E.'[<--o]XBi.m\MN6m+"57'84Ngmcq=nTOLj@:bA8fj3pD2pCq>Yf"EgA<F/Z,GO['q`%q9n-8+6+JVA[jS8#$"Wi/6H4#OqfNn8_caK_6WBH(G3R2PS>ZuESQu7@Du<d>niPTp_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;<oH3]=gGV,rBsF[UI_'edrfq"jCN<YuR7UL)q):FkffsLUI<Kf_\2Op,;VuHiD;ukC53@e[Rtt]o)jgmt>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<Z'-V^;ha@G=5!2]?(sr5*9YnG'&ZF3>$/IFTX]iSK*a2R_?Tp/@9[Kd'FK_0;D:*G=F60Yc(MLN475:0&0`]>rE68/)AH4[$)&^$R<P+G67Tm]AY?qtl&$2kA,7udL^?ZK&4H?@gdbe$SELg_VC%_JPcV/OU@+UqG6eI,rjDFYqQ2L2]LljMc7(dbhl8o'nN<tFd@AaW&Dc"C'8;T2817AMj"sh3kgU.Qe%jqGB`0iWf'14Ob'9SGORu=;H8%-ie5E\s#Xd?-%ot5q+ZkTPhMNYqG)ND#r$fbXB%"ltrGU!k*Nb:cNNeqQ`Lb\YMa]r`(NEP<8_jCJ*:F=`%&0!RZJrV+n3HHZrbj#!$Yl3UY[t!![Bt$I$fO6BJ(e+ZHK.CF?mPdVN!CDH$7#8[-3"jtAVt,2$-oun@Fag0JO(0p,f6BlkSeEY&$E<Guos\QuGBc=`eb*P+DPk<p1Cf:7EffRu@>?/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:"<fk)C;"s_B&V9M-iR)=mEEAC`u]b:<:BoIJ$&+Xg?orDuVZ;VFmS,/-+ZSV0lHL.kt$^S>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[9LH<JDs),4;27l4(#g42`,_m3'Eudr$qiA=eFDbQAedWsLAu&9mRPI<#!:_05R-r)BKQ-Q=L;?ARCI#f.(aKPYa>gKMViE`NL'B[ruHotFnbV)_U]-FU([KQc&j&r7%'g4^7Y:#^g!OZ5$)Job4sY2^V'I4m+aYOBA@b3<4+<F%7PCX]a:[tuJCT`B''+i5g`Ltf_)72m@+G?i;q\9uL,@fnFr"5n2R5a6a!L4hT1KC<e-8Uk:lbg"dHc.dA#D*h:FkkSgQYH69L*6sF_a,qQras-+YpE9Ua"pT'IOn.H5n<rqjJk*(a(N#@(7"ZEa@=/4?D"'VUk[O&[RYFM%dVDPt:]4:H]1)?Cq.PiUAFN3U_./ebc+,,cFTj$a0Qr,rpAjXYk+3-Bl.:!d`ri!n\PELg1&b)q#d3uN(p<pE]E4gP`AR%MRW)[]9NN7KEO$=m,^A"Ypn]g>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:[OrUpI<h^CPX3+F%^/^m4t+k%Oi,AY_de((P%jL=>J;_WNGW+[(B7V'^^'9ria_VQ$T]]\]*:fJbG)I\i.]0Fd*e4tJ*FG,6iO7f8_cE-IHa1Qrqn4mMHBi..eI2Eir/ZUtrfYU4&,^!pl`dJ;_]ZfkV)XGFpC+\8.%H<B&,T<?edRE_*t>0O$[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<b(eZPHi_aC&gB&2V.oA%DkQ&/>_u\G]++9cE3WB1P+"qk*(2P'>P6AAqVd\`K.H>K-4T#lp:7Rl&\c8<ouCd#hjJ8[P)HcTpWc`L])f#CtT'aY>`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<G?Wo@aVXSg]c\H6YcX2U`ZaC8d,qGj<>&$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<a3bN;Y6UjkKnu7-+D#s0Y9Buj]IH>/m.!TUMg<NXCh:^m.uT<P'K9*Z^LLi[3Glt6X=ToH>#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+9LVNH<?UDo'FeqC[]JH>8Q2sF/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`/s<C=RaUotaeT63ESnmqjs_s*K`BR%])S<@b36)gd=-DoQ:3J)%_a4@D"QEHEaUEHL'b.(2>Y-2Z1AZT'*GNK.lJnZItk8_:YT<HfOuh8c;<h;@tS+49VVfo4=sWqV:%jP6467Mtq$(2jO_MG%I9JBIliYjNl7aPl(US5c7?ne6YCE5&1+n@N<Yah1t4)u;lbqbb&iN21RP022>';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]<Y45p]\XTu1gmHoB?%33@6nA_#C`aY*$FpO=T-O3Jt#(`!'N3MUd<2EVI+<TtR<"GXaV882a_M]m&I*<I\lH((2VgDtQN.!_[epOlJ;)IjO%p^P8[?GMQD@GjI=YZ(6FUs#A+SYOFfaNB9FYOWH&;HCH0H<@JqSg7J"-/)rl(3FjLlDXRMhM4a2@YOT/\R,Ug7U$_BM`MHEC7j>Zl4[AMK0';'q1?_[dF1+XJZ67$WfHh:rS'!3b-Y]AL"frf^PeM3"[f.en6qP&)"WS^dU4]Gm!ttr49$:o$eCi$tf%Ri1eM::A3)kmg<Sa[=VY?B8$2E$34'jXB*1<.dNtJCWMM%9W\o@eqJ$K%t4&PfI[T9=+p_h!-[X'MjND09TDr(Z9D=o;=TQJ-]fE^!aB)lC\!.jMlKZV!;91O!%G;"js^m/Z>HQ: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</?P/EC=1%AA)j9s=7RBr>%]A-B!tI"kg'1GF2D</3+/q^g71P5RU0[Tb0Y?='dh89er0F_Bg0_p<Tu3bS0m$s!Q?<R^(eX&08u,kY8p@]D4J)?j3KAA*;aesXtaEnb9ggt*V+Km#'m49^,R#ATPL?Jp@54e<(bbLa(q[Uh9>3c3mjl9R>!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\<Nb`InG@YpXh.$d([.[f(/UkE-9nK""TF;j,QQ&%3AGp#eU^#1fi!^AD>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!Gmq<s78<]s[ZS*C[1B4H1?CKj36<-_r:@X0/S'B8Taa9X"U@#^G3M..V&V\C;"HeWtlX/A[o;T^pJhW]fS*(!?=%GgLbKUhb@P'_jYr):e+IC#ngW#HmXGe]YL'GH&.Am,^Yf>ZKBV-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/B<MoFi!+bsD!6i-N_fTcDA%tatAW+LU0#J-04DJEEB^Sa`OTQYikHc3=f8'%X!msS?qgfZiDu6X'a2a>c`Mt.T30OC!?doA(SCTPO70I"'QgGu[k_Sr81[<c[)`@hI4`\5l!?CK_C]u^a0f1U]&q.uWoV5RGla'dr[O#WU`=u2Sj$-Q!3m_Vg%jHdHE*V,?gN@U"$Ks=,J\+F+cAr<gR2nijCeP)nfU@4FP(<pDC,C6aW+0Z1PE8js@\BD,(LiCg.e@/VRMieEdjaA&LoQh\7F2Yp7X!O%WeeL(pM1VP4^\u*kO'2PO7%I%`_hW*&6oX'cBi9*(W>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<m8f_M]VDN1FN>]2`<rc_CDTABhkpbZkD6JA%LYf4tYc*tgMm[:!j,\+%MFe_#JEW%B^S)8r@W93rYHZq%1@!_2:j,-@tR+!i-I4Xq^2(WQU!fHT:>:^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\TVZHXG24tY191<tp9%VY+2fGk)i6kloF0YX=ram"eV9gAU"e[ddt3(GM@2i0*NQQ@gf]g",s%f5"k?o=MF/R'p'(@jdDAf"p(s$pQatgV2eIO">4[),?5O4a#soonC,IDR`=GJc=]`&*R^T4^(U_'qB<H95oMk)%C:-O*d)g"HN,oEd-jN)N9$uj@]$<BD;3mq+0&nPi*U<c?p,[n4')15"+Of3%FdLZ2Y^Y&G&:dMTcI:Q8W3R)_V?G=!0=\Td?%FmiUgZLT>1D/[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"&qe<iDR3`.NB>1AX`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=<MXm]1cmJ,O9n*e_262)!j$GMciA&_!Us+f(uPTVRG`NsDSGV^F9KHQ;2j,DXb@$gFV'_Hb\oTdpV/c$rp)$6mOD\5t6n9-u[T?ecGAm&'dBhi&BbSs'h^N?'u6HU=n(]j9`B##)#%?)1^R#?RXqI?!#am)8?ao=IU+cM3ns+Z1uk!_Z>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<EMMfq;^oBBuSF>$s`fXX$`!]I$ahf?Q#>BX#m:r3):7DfIr@].Kcckk;..X'[U.No7l4-ZMcou>X1d[ga<j6-+aXpUK1*GYcR,!iE`O6`^oX%@;M=n]"N"6-b`c<(NW4ZO^-=udFMIe[0:bis[is-'5Y*qU[cK*V4_OYI_5h]ZDM3*k8lL2O2;Ra_Fs.uKJ%A1&LB%ohWs,U>Ke2_>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!4<u'^Q^Ku42au9irUu[etq,$_PSon73aX<.#LK,%KBWb]1cOQ?+k*+d,QRn[>nYQA<H'6]F5CoJ,mhN`T[?G%jqO)Mo5-:XH&V$U']MPFVhpNb.Ydg/GQ,"'kODNUaR9,\s[D)IGrnY4-F:gKE0al]Xo:o[;B"OPIhn30#Ii&C.+8p*DpM%Ak3dC.Vm\b;R@?:F![-6B'~> +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$><itD<l[$J5Y/9:TI&$**q2s(A%DOH5Mm"-BXDK%p!ld\[acTQiqSho5H'FI`'Va5N>W79#G5_?l&%?Jlr:o!N\.o'*PiK%p"k\n)]=+Qdc;=plWn-M$g%r[USb0'nLltI#8oiLEblQ:.;_hBlId<g'ZR^Y>/]6g?nRi?N%oJW&&*;@=\3KfJm!'rf@V4Lhk$dDGV6KK]Eeh^pI&K]t#Uf,d#lqHRY5g]sD'oF"79bXBqHm,#<j^\8S](AaS0r/o%HS`8l,[hcm$>.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(th<itsF#P$^JAg,Sn'R:<O7_!X!XR/P)^9-9C^_Uudl%]%^rCDo>iqk2m=j.WVpp0O\Skes]3Y6r#[:;J%FCe_R@*'<OXSkXfa:eNNqPqHfeO0\"lsL5%*6qFfUeY8eqQ>[;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<\&kO<CQn$8<hGepcN-5/9F-seuL)h6hfi\DWdOe:P"n`mF\.BUU@01eo<1[H]`$bseqtaIgm(3%hU<iIp['/qYn4j,F"4"[PMu@9&q'_&n1%R)YUbV.h*GIeZ_&Tfd3BJ4lMWWQ522;#og(PW[n7XS77XYbd,idHSZc,)(4PM#lL!Dq%rc8To_r+`8m]#4T4f>a8En=]!: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_NC<kLNk"URBtbCAF@r]<cp:,iV?70WH)AT%J!`IdJhi^`G(p-nYbR-M!JJ7/D$'`)dgXo<LnAZ_/EeC#N`D%85p0nJVsoXdQc0gNa_]TW+]0p.uZ*9_ZM7Q9#33faEW_HZ_;N.)Y=%doP#?H3\Yi<`L,t,56q`?$?i;:?c@<n%md`fcY\-DekfO[W,o`1kr`8:9bB$cfhu7SA)uFj1^t%#A*i!-\m/@35C5!3P`3JO'u15HoMq.!Lui`SmVr0LJuDbXm\ldp]7JHD^5gbFF'==^(3De.F;:@'[qe0@qW<Acm'u/pBqS9Huo`6\-9B&d'=Wh.Q4m1@+e]m8LCCph._[\bXWV#r:8gaLp(s8d7q]J:O&XLaHhg(MKF22W"Z>R=36Sl\cJ6XZH+rLaKC'N"A;b<[]FJ!P9Xf60cGXa8hf'^O%.Qmi>;SGc(3abhE@15)EV?Q:*Woo!)Mak<Q=A+Pe%W.[pV:ukDYi4bPF20X>k=AdK-jO;$:6&U>@<>;-%YgMQ+DTFXAk]a;m/B6A'p\%PuX[ehnS\:\-hd:sDrE"@Qj0<W@e"J:)ulaI\%df$b%#iV[5t8;0q!%&J0:kY'khQmUCO_tBq\GmC=?8429)=^ZE_=JiU$'9s8M^6b&"]C*$&%r_HT\c;L!Qb-%#5!OZEF[M1RFaWf-[4SH;QlK!7DX`@ihdl.\2opYT4<l[LB[V'TBYU==R5B<QmWUg@3#<BlAi"`r*u6^q;j[m8a[N([YMOX!bh54\+.bT[2u27p]6ku!lqu:ZIMALp6bO=#rQeS?3)es.(S:*ac!`WTH`Gr*%=4q0<W?BT'.l*?eOqjaB2Z&?k]kP/bTcW0"u%U\i7@t"60oG6k]XSSGhk57irmHto$t+Y6&9o8r[&K,MSH^JrkN/_k(bAO_aFCt5`8MmO_p@gGOrL1$;K%d$'TFgI+GKTp*Z4jcp-ufL;4mE,enoQ]G5SPE)C%N1f0#6'K2\N'`&cq>s7Ald>\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-1Zj<XC-NrXaB&#f_57eOV3\;&[Q1__h<('3MBWbgR)*UVC/R(P:SbEp25t1U'K1AI>uf)erFpEb,8<T0;61DSF;TY;UoLf14_+/\jb%4r4lL!2Ue;,$>-bg]^k(_LC]OJ9,V;#a4K`]oIm6860Wn<k)Y=gWF"mUc?,RX'SC=ClmMFufT[(XL^E,3V:WP*E\_.(gBE4N6<;iI4UhO4bS$S_'Tk36M2ppGl1%N!)N8)n5Du*fSe<Df\72I#EDbka<A?iiEa48qpjF^q"a!f5BZ"f,Co2N:>]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<T!^j&e;~> +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<sI(k*QNB*)K,HZiPkHt$S'/>"5@M/4uK]:WeHria.$4Pf!9"<?Q4o9/d].JRW2V9OONjI,3;BP:-jllnLq7\q[@C5A#-)6<[7*b"mab-%T#6ON)lZtL3*\_meis0K4p@(C/S=V#j<BEC7T*cV\khrcODFRV:[:EIN4OhW7Mh?W/FuA9_A#Y1'Fk6(MfhC7cOP!/-W\K!uc<$(siGAJN:J4/#aO]#0uD2Gp0k_k5<E<=DZB6J2Ga2'Q)*ai%.QLoH%#p$!if9crap.4mm@5R2+O9[0>)]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?kE3g<l8;ZCnT&)@fN"CJ3X<Tm<s7jN([f=-g?(Mr@7BLrQ7ZY%llqrCR/+s0MnUV1aT1Ua/T?4VbPW>mYBKF=*m@\cFSa^Q8i=MdQiFI-Dj7*id@'t+pH#hBjrF3f:O-8G%R,_<s0^]PF113bXd-rhdQj]t"B!hIV,X%Z@`=M&H!/(f;!kaS6-ZEMJ0/jMm/Q]pB%f5Wq4Ago<d!jF\S-8Q,_R9]g<@hS!aBTXH2K/MOC&kr_(e2?G>Maj,]*8%eX$[8I#)D,_dm[D'(FFGsAl2,/p8cNV2<\g<cRr4!]%JQMNK>NGIZX`Z/*8h(m8C*@bP_--aV9faNOMA@B0gmnL+FOCqL+h3c-+%u'RU/iE1[V+BV%i[nAV$`UH>2k#3h`Nu>OO@W7B<T[<="X[EUD7<fWbeP_6)oX1%5?W?X^)i5(gN#G$XGj6>IUL"r26XQoFO-EcLpPOtb?h)sIM/p"i#H\/?g;Rkae6gJ8_<;#]^<fV/\.LY]b_/Ohn(#2c/G9ngjRk]Hc*VO.Zqb7(u?ZbETd@HCHoR<]AN9GP;,T9ud-F5de]p%2>SlKm5bd@'rqaam>*ZnK3/aJ[qk2gP9CMFm$"ML50R'$Q5<AQE#PfDQYUg'[X*$@ej'5tmG,.pU^3prqI1Y&jHTVYqA,$#pD3MZtqi6lRf/Q_FMa7=)EZD$K5Mn*KP0(%UOpag1X#45H'!I8-*NpX:L:$1SI[0<&\$c2'@FFG1.VOdu<j\Jn5CE>&s%4te'bnT&aK"hMUPc/u-i\*C(5&T'9U/1_<1jj+Sq2cSW&9gNj%-;@XBS"5S&#;eO3bEVEC+c5rlW0lEPO2=PoD2<c/Q]$>W>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<nNr:ia':F6CZ`GlfqF0'f0&>`!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:</"E0@GAYKS/f(J:ls6"PA,n5f.h%:.(8M@(Zi\*.:f0>\#5&_(`n%G=Nb$cS$X^mlu1@I<]fQHjdr4pU-1rV.l^,.l3ASH_J]t0_<DnZ<$.;I81BJ>Q$LdSADNj?s;7Kp:6FYmbjUY601AVL`(G]qTqD^\D^-Eo?r\^;&#.j(ci\.?2@PGMAYZQBBk"1aUP'p:B)\#ocZ1QjbpB2-qZL1VhBr<p$XMj,#^:+Q-N2'qr.mDL@sL=IpQ]P7#7^'/j$cCoD3J_]"7I5nd$u(kH]PTYrG')J!RQ9-`b4=b*RVhi"Tma2W/^.XRr,&74<#ilO,[Jb#Wb0i"Ro8ahl3r/$Lk\C\c]M*O(orSM85q:t]&Ub-$Sl6biF++:QYP['BN6`(D23m0(k``Y$)sZ"M!P:F&@86bJ8O)i"a0eLI'ar=X+);L_^DXR`p95M3o@Ro=1d'#_W<,6_RSIaVi.b*u'e^phn_s4:aF//G"BG\qG`.d\JtWud1n(fBG'BXCWRjm=,$g2-D]Q/4/[aNsKnjlus;nj:H7mQWpp;,$r8ZY?gn!]c)LpZLY:epLoa2!#!!0CVm&bC85'iJ@,*IgmpKbJ9,uMKhqLYN3W>P1?JO3/WP/p/ts#V]QVa<8A1.d$d3oR]E`m@ib2e!Gom>dT(kk5+/)pb77Oj&T>=d(0LeHK<<UfZrYP3hDVp2M*js3E7g@r1e\JS8+'PnPK'UM#UKd$rqJW!o]GLGBD2a&7OH_B"+5ibg82+%$PkbES\Gb$eV*<Ks+XUF+PM(pLj[kpL`$",:K+IE@?Mc,fY?lDQKe:,hi3;lY=eTOJ*ILe:CsGMkmm\6&L[5u/4I'WiEGCWq2_7!$6Kpb=L"3I^W<!#7F<pYn_8Xo`.)G.8^cGIruBaAfOd^,GP?Uq.;WQ@S600*?>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<k23;7%eer=UCa!I<Z&MNEr^0/9^,A6mah-DV7uBo)i3+:6$9Mp%iZ\(qoat]CS`O@0%U?F,(%%ik/#ntmK>:t,;gaO.fAE#6!$4P`<:mMOZ[A#08FK=63HL/Xm^ug;g4f&e@B'4Amjk0<uJ)?i2\rAZerE7'!f,ZrFDXoNsFRO^Lh:?jH83E9o8PLbLs\P?nqFlE*E;<_03SBm$_"olDi1*[^D^Qs/qK>D!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]<ib&hSaCKr:")/nB)L$?GdnB1`C=2HV)r&aqN:t05d\g.mU#Yj8Upe,Ht_E-DXQ@'2b>".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^?<Ocff@aUHg8R!f*&(7s)Rr9W:&s?Ud*cDpFP`2r[d'uunZ)og,_EBu3O-f0%ackC+]'?0H*cS`PUBKt7@uM!fE"7EY>%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+]Z<sEPH:th&U._$BU`FB&AfRCI3EG[FQXK)7kQaQg]HQK`dh1?<B-V\J8h+;rs1m)@,5A)?RmdRoCqCa?D*_c]#hR_ThJ"]jaKX;S&$[c-*@ocb3J-#UB@-K=n'doL)*n*q5TBZ"K\;76tE_*'r0iE"rDi;@UY1]A]/Ki%?^4m\YPs]rSKdP#>Mq1&BtqSgV!pCGh%];3IW1*t9%UoK81pH+_H^YQ#aSn*tUCjN`#7EPM+B_C1Se]-r[!G\_13Ji"(ZkMGuS>sC!ag*d9<JnWG=HtsJd.`Eh(!YR<AT4):`_41Gu\NpuXN7Yinlmb!j'T1H$0GWmcF([+?2Q[FVG,Hc\I)NfT`d't1!s8iZ!#XHoFcc:f3\.B<c9/K;MQ6!LWC.pSIB)3WGVS6i817#WeU_B$f\3d4ViiR^o(*/+RMYXKV=k3uWp#o.*6c"B/kKk^oC-]Cn>+']&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`(4p<AGnQ-!DktB>NUV=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(><B&0p*2U/,QNf>?p3c8C_VFp\g-@B!c%suL]Fjma-!loHBplGNL&%l;K1aYRa,GkKT\]i'&OE26<<B"!bZ0ie;TAWGg?)72^a4a<9Vai7F-&>N-.Nnc%Hi(C<`0XK0':a<R3o?BE?EHSufciG^=#]kVq`Ho)!rt?M&]tSJ`68qEX9Sm<HUbhI8i&X9;S5'"_6PNJX?mmHAQe<h"8K&o1BgBW7VK`Do%VU2USnna$B0ia[Fc@G1R2ISeHYY'o:%X^2F$ha=\<$B&82KlJGa%%KTJo0G2\nq0^#3i\e\go6S7I+f`FEIX#YbKUAUepDAj0"EgqrDTC)Npi>NS*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<U&6R-BqE:d&C%N,q<MSNXSjKIfB)FE`o"KV2N8CE"Z"f*ctuIHrX\?F2F.~> +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\<S-=+>(cmT:qTN,ZcKp5gs6N1iRC2P%M"tqm=RI!?>eJh2LIr8a(9_upYUHk&IrQ&U'4,R1M7?mjf#)kf`7IsNoo]'IM"e(g^Fkg:J6LgH[Qjji8h"<B#3#G3Z\&N@C5'b=_=7^WA<H&E>=>O;\.IP,[_p?Q#Gp0ja0ca4$])"N8sC5-B6l/hnjPoGY1IeFkR[Ja6gMCXr*'].g#eIEMm<BmQ+>>Y8j([oNUco=qfa@8+@a?^hR]ED?dI,Sa%7Hb<F[A:6KZ+mVd'=DZ)RIAX3+(%JDj"+SJGe5_6b2UbMk[9o(<:Ap%=LG650I0Ni>j4,]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*7pf<bb_uCOd72#Q^+N+UX7[V1teN#jgRf%4&PBq4/q#dBshBH;[TK2m*\&-6aY9fW_u\@Wh,88X\j'DC9>7*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.^<AQc\+U_.1'+*obL">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?'1Rr5Yrlp<fMik@b;WEs"NkT?Vd1dYaCj%bt$W&1?-J[@JZbgOS)qn*Qp)KgjYR]ZFfHa7aM+kpO[AF:@s*V;@8kaGhGMk+cBfB23:gAH*!RmS[Y6q;&U.tXo^4;N?&*&f:h3n]DOl7pPd)Y/Z3S7X=?:me^,c!W5QCNuLu8+N@e@KXDrVmgrb>A4p-FBiIh]Z^th[W+a0.IV<fVr.5C\MN+*D@"im@.'.g;@6^kD/O%c1_A8=^5o<OJXZA.dEn)Qs!BY_SVufV9(kU^'H2Q1/;eS?OI\+g$o_"O;;XJKOo+QcoO?a?O[Aa/]P/qknZrFq^(O>AT'O[&!c9m41q]VKOt..W0MAM<V_KVUZeI?]X_.kQesHu9?K]:":lTM4;@nl:SVfXOVaSL(c`SFPEQ?/<K2<l0O.n$Zc0UO_BcT[p2asH94i)7gL#@&]OpKm@&L?m`LV#e-4%,BH--VKAg(s9ApMgse6nr]sfOQ,@h/1'K4hj"N4.'l(N^josUBEjN9LCjj&B9sN2/jk+PoL3mku;RD_)sN,B`Jbnh:I"Zd1@o,lJm<Kl!bS*MdCl1[(QB5KAYj%A"71o8HemQ*GPN7mFR=7F;fEM4oRKjVR(t2LST9r@13&qW.Q%P:A_0W3_7Pa$[8QuWYc[#7#7E%5S;Ik8Zq0Z.A9Gn]oN_:0!69&'ciA]M@*&J<ASEO(4IWeR-2)Y*HTi8AMML=brt]U"\$Tc7R0_79'L^V9HD5nD1W5-g*ch_E?oXRbb:".6!uK9&?@"(1,4'8!\67d,+?O,`5rF`7(PZ0B[n4\'9+q3h;-j^4_*!:6&2uLkF:5?Y$$h7+dNeSAs;uIV]K<6-c>cAHDDjIS+i6>]88Ggp)FhOgt[(&Z&5UW@?hW&YHF>U<V%bbeL4a!*&5JD(_>CcYNk5r1^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,N<R81bHd1!?H8:[&0!N$GPNU2$hr?g6<Tk.-h7%MZW4'U\a>J0-,)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-<<cuZrfZH\*o&18coo=[F0rNcj$r1_k8p]\2GSo>%ENS'^!bY=L,W+"\rP]!X/&5"L/cm0F8$$b"H"b:,%i-UYGf14`=-EPF:(8;AN5k)Ong<M"b[\pXphaRV,&cWRT;Nk=Z9^rVC-*+m#71q"!B^hilqsIuR:1NO+VkY\[hq+J((mPuXMoBjmMLUqj60LU\I'o4<SgG2CT;PH?k@m8f)`nl//7$+jX(5[mo&+[_oBae]3fhptem5EA[:2^P,g?u_rhG!i5,&jq,]^\I?qkPJ>>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@Rj<lkC=2)6>TDhSHKj\)!=mAp.A.Fj6<FI-%-:egHPo'B`Y3?NrqQT7e@QX9j2\@!a'@X[s2ZaWRoC,`h<#hMQXZo$PE@@.uXp"Y;J8Yi;8,b:1gn;%8)_Qb:sEF`j3bd#4!.T1/l4&*GASLGg:1uf)$J6j@.n=q+Iro^.Fp3l-aL+rMWL2L78R[>&\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%ADZS<bUent]B5T!!`*HmDaMiI%^T]Dl0</8HM3Y,fNmnc(PQJr.T2/[$G]8[/?Z>ubbH\\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"@39<cEuZKNKe!%k>Qa4*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?+<a_'ZtqD4T>$mp*b0S"elg)-OW6?$>LF_0t2Z9f2Vrp&i.0@gW+UD1a>CT!E"PGQrYXado36<P&C&Rg#J?Ml1K*\p)CU=/<()]$70nXBG.?`hPR9_7Tf*G4PTc&nqf=;L`(k*,sQEMPo2]X->1TC7sf=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.>'<aEP+6A#0.Y$b-N.Jp].%dFB*5P;gpE#Mt+>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$")<NMa8&B5qP</^H\Rg65>UR8n,KhMj,I]N[94budsm%\+bTnWlJ8:\LVSm2dM;!!!?!U+$jg'#DW#%QQPPNgo@7<bNE.md)]'%e(Kc)Z%IT0M+)J%WCB*Ng%$l"$&9)1?ma.HC5?bIdh0rW3Gu.;t0A[(AdIAs7#EnFG[>")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<LXW;,[4&r`\N;UBf>*^;!X^O%_m)r32$ndYG2e)US\EmSfDI_oPoDE5M=rV-RtVcEm^PjH2=Z,u=`K6m_*a5m<UeZ^$&RpcLsKU2!6<`7hN*+6CIPCm[m!Y<YDmIAKlc^)GXBA2a8:CXo_m]QWCB^KZC6d"26:1gi`&4j*7jXB8bdqkV):$9ktN?ZSSV_=4$BjLs>]>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!><G."1[,\om>mDS.!fdr[\hCY*Z1fDt5ur;):H?""&h8`#CXSKhF2F1GBIGe(:cmX<o4XS&1N3OWE$0"$OiS"C`#;o,QchB.*bMLi33V[%Mh[KBtB%^oZs%!%2ag^22JV!Bl/ACM-&!WN6DZs:!p/C&%AQ:q$?0V:u)!*dX+p%SFpMlS,L%]k/]jfa7<H.6prSk!CYe'iYP=CXVmhq779?9F220f"an6?CQ<kn+5<h^9':F]:aJ<jABH]*)hPjNZ*FYS[Pg5QQ2Rb.(!NWjm5mm.3bEgi%!q3Scs^^;bq>!8=$0&SQ@k#,(>i(kPBXDhIoFN"!jo"7/s&qedA2`F<QI,0OKT[uqnV1:$;_8]A3h\#F$9!O\'I;Ql"+\(/"-J@dlC")d0&[IPI7-HQ`T:,/F0Nlcr85W0+/`9eOHmlaPnloRG2]eVk!Gm33!B,+XW6D-P3l&M%g\_OJM=hQ08\mlahq&t\mZIs*5grI&u^?&K4V<YTR+nTijlpo%KrGj#-8(duH'e?:0Y&X<q1_[NJJdNCm"*0fW@q&WU&jIakn&6c6)>oa<NsE28gEnR)/Tpn;JR`2+T`8o&OoG.Zf:CO.!I(So'5ka"7$,@#M-b<#2kY']Da`FI+)i1_It4-@5J[58rU]anLsQ+L5G@$ipW)QkKY`3:,P4b5J&%Q$5=0e?^h6F,^E#:>Yge00M!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/<_4jg5<o1VGEZ>DPI6u<t`lC80g))/O71L]]l/YoOU[p$0WE49R<iq<K/6UW,*rcPp$k\Pd>eJZ07IH8F$%^b(383,d%nSnL)dE`2[jBQU'r3SFd*f=+D`FnsjF*i$!?B)d<h.'\ph1E!><-ih4\Zj'5.8s_bl3pdqBU;cXV,??L/V3;@"J"RgA6tlo*Pbd:?VCcQd$Y"+L;E>j[rBJ1h+.Wl?lt:n8FI$%lII"Ge<J[O9&+6jif1:i+=?`_6VQ\ULHq4tr+DYj-;61fcC"f%/t+BV>S:n_B`dmBV9oc="(K5U!+&XA7%?DZ9*2X#<ri2t:='i)dbt:l*5sYe<mc>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:)<S8_5e%DgEtBZoq"cTV`+_B0AI7SuITEhGRF\;60d/nGlm.0T_Qg@fY5"c9n`O<.MVFl2e42VT;D,'9pU"Mc)P=MMF(41op;_!Lsn;[YApKO`0=:_g:Au!l9+X^H+L:_PP0.eY*k96<A>`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<CZQGhjAp]j`1m$(9g_>?T228*$$h`$?k`A7^J+a26H?omrg]c54O0<?:JA[WBhX5:I!*f4bkX_a+F'I<<7mcrBi75om#"IlgK9D2>co""'u&dubM\AT*18e4W[-=R)-mF1+<YeuJ;RHdQdBe3$Vc=B-*0f*CuhstZEj$i't@l5!8DJtmjXj3%;q3gBtH%0#.,*!<8rndA:%D>]%>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.<ID4Ye$T]mb>'-epZ'S4i4D#ps'b-H5^YOC[E%V8OIR_C=(M`PK1S9$N_pZ:u.DL(j"NTY+r#k_HKM+HV1No,<Zi)@Ucc->]90<YTbDW4G&UssU`^kk22,tU1S">1o4R,(<m[EkhN[r3J#!J?]-mKj,C*TE06\=jFo->qm+bJ!N!P7N%@B4^V_q:f'O-oi,=Cr;r'QjIDuVfCL"@/?Mjje8d,@sXbMB7mJ"C^fqeLtjZm'`R"<.c']b=3'V<P\C;&9/jZ_/8>D^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/p<nZPu.O"eH%]o*:f$%L@gcenh2#2lj<GgReSjC:5([YI$5:MD_XPF#gfY<!"aVa8nq^=1+R-X/:Mguqn>epG69FS57$2<9BM.^T"-M')eO=J5_"?a)q11RrV6`qg:)lGW-oZ&9^N@hF1%&Pc*a`YZDR8*NTfain<mOjs'5ee$Lm/"V#O-lPR,KO&ciAMdAQigPR@8LPEeC@]+@=]_Rdb#7+^R]Z<)ZQ#b;rO6==c]Vb.68)W%YE-.oGG;QsU820h#TkSFC:mQrPHgNTjir\+UFE6JXk&W!=_N2idPe?ZpIgD7)lW-mf-A)XNTm$t1R.;G`74DG&)k'Cb;?r$mg-9^J`#Z"dp:IfL_c+?/2#76CU!-pet12>;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`(<DJoKsf5sco\j.">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<nMosp&4'707K3;p[PEb_B9Z21+*m^nY)-KmMK?SHTl^-VQ$'YBNI3u_!_9Y>\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<Ch]h7h:V:R[t!86^>+*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!<mZn5&p6Lq]m_76hXbpB^#F?m&3>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/*B34Vh<E9!,]P;r/kO$*^:p72!Xf>XOipD;Pe_>U]6e^P<F4H#c#/R@3srXN&]0)@GS*Pqk0a.bJbZ;,hX]n)UDF.C_o,'epd0q=+#,DUBX>'KKU>Ps*OAt,K)L$WlIj?OHm'9]/DE*G_<W6T---UrGW#"9lJ69i^Q(PJH(>]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<cFmV<Xj#LGA0:7tku*'i6a3.boCLJC!Za^jQ!%Ls0;LT#?7Q$qU=hG9Lr/!#UbqYNH.C\<qRi1'(qD^o+B^`Un7kR<8V,)Nbmj/I>,"bHC:g_*n]Ld^RW2BFFYh9+-P71o-$jFs9=:Y;,DYU<P>$SEd5al$V0$,WQW5SL/dhk+(_lU'GTN>"<Fr.$P^rRJOGIm.2O*lO*ni[9:Z.>6Q]r&D=&BpKgYW_Gor^m)PVqc-to'e`Q>1sWVWns0(4F1U&pb+)hS3gcSn&@Kbbot2ikQg:BiIPTs4:uZsRniGU*[r.8UEeSC,e0etE!*8]scK<@Z-=#N6*d<Zt+\j=i'-7/MqR#Cq)+^\/VNL;W%.'AEl.q'r"7%g'6R!]t+0n>K#1]D0e+U<6fkOgYe\d%W@#;C+Q1f(D'mP,I2Sd)ljro-S)n7\nb=!G<>0]<E<O5Ehee=^W.oW%-5_[^6d!b`k,PRm^U#HFkWCq-S,UUeg4lS6QD/,DrQ`__gHY5rATUZ3?8MbfZ7^^;eMnr@aCS*Vr-c:NH;*ep:Yd0b'8I3cEC7#0.c>@c*%?nY</QRHa9H/\nWUDd3G)(]K1GhuBe!q;G%USQF.!u<Z"0^n%R3YV'HSnXM4O).*8b8iGc88P>fLC^"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%<OG"G9!;[G_n6H&8jk?&7&4gW>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<Z7s/YGZ?=/qs1b;<SZ:;5)\AQaOW"nI3J'/Kjb/``$GT<-s!QJe5,pG'%@>\U[oShPS&/ik86,WGq-q'/^P;ibcQUX(3i@fm6:6HN_$F:4EtLCNO^5"MXWN833jEQf]Sh'S]mCH^J3+R/&]',#4"\k!eKUsSpRk?pS'E<cl?UE.nofXhGo2*OakC#"9Pf/TT+2N;448;'j"pJt"&*1HM*)MaXWE/e?G9CQlHpn:m9#6?CTPp=Lq\gSUh<K0e6S$XR`LD!hGqG>fdp;E/M(6"X!],SAY+d2K8^2Y<?$_;qj"CEnLFKhDQZASmWOF[H0=:gs`*QVG.]9#Z/"8ZpL15aWGAk^:oW_"?9PJ0]2d'=`GA/*#FWSNUM1()R%WS#aj/E`d#-E!0sR'hlTBH!!BQ2IdrSs2")9M]8Ff.3=6RI+(UUn9i0/%]*M,&BZ!YF*$to67r^:%L:KTTEpd=ha$0At?V/PBXcg9p67<?38>-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]$?VOBkK<nkQqm4UXdhYsZ4SU-\qd+>3,k[]<+`(^N"$K5=%Kk/Z+<L!PqJ&Vu,O];6d98@2qM<+HF(Xokbj'!l>#@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;`<f%3*,mM>_u&]J@Z+%C$ZT;!B**MXI3q3WJmpp75h6]pie>:O4qm.Vi\Q.AV'r.`R)*tg5$`R3k/U'U+r6k/PU!$<LQPs#I6-\K^:(Y"SA:So+oC$Zp2VZ%XbU*HCXIsD/]qi>Bn>O)<-@_T<OUR]J+*;<<aXnYkPCCD]WrbZ4sJg>\h,fr*!1-R<E""IkbT:o7V"b?(/j7%;:Su;Cdeh=Z)R"de<'^g1`MX#$</gO,;eRpe[F!<`4<ClC$g^9)A+"]d)ju[6-5'R8nC)Y,F(A\k>&gK9N"&D40)f7fS`Id(W)b8-N!=`Iei1-4Dq30rUaa[0Tl@qI;[)#_@aD]<oETT7:SjJl%l39s2$MJ]52g%D3EFm6SLF%/KXHLoA#]o[D>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<I=:ctAeZt30HYLErh@V[in.*e8)Ued$"6'm<>)<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+<qa@S1Em<Cr`W*\gLb(mqpfDDDTo$M:>B.o#)?9A;aO`.`o!egKr8hcWlW$@]_nW\Ll3Q>nk'gOM")_,Uh$Dd^)"ID*O?=5:lQQqa+mKt_fu%QtQ\R<h^.7hRmlg$T5Bn%79+O7u4RBo?He=6\Go1M(H[#["oe:oE.M%<.rD<>)*la&N_"e<Y`j*8%GnLWtY-2c8b/9V2gRJ6*iEn`2*0T9:/8O"'L\lYG*_mSFj<(C_7)^dj(,#WiF"@9:E0HM18dt-nWd!.Il/6]-j^8VmmeAE*B[@hCf"UM0!IE#.&GIP>PYgp#fIl@?F;F+>AnOYZ=US$k`d:;+3R>DM`&IpUFEfGDh]#J<Mn3mK/[nkm^F-s.1)8JeT27BAD>&3VNE,U*+&4E25ABiOHmG>IEV$f<piU'='D4C@8`fajL;`Jm&>`%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#<Oo^aCk(o#R/H*m%*#e5OtTc7K1O,_qFshA5Eo@<JM-(6(M=E$,ZrLMZ8ApSr.PM(=22ZCJ_TQNF"a?!p'6M-N?G<`d;%`ZC7ed?-A_IY(pRF3$2+mYBcCtiaB'-k@U>@'X9He(X5BDGL1T<Z*RJ][_>oKg::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<JHACOXE>%!<<o+O<1NDj%"&g^%X*eC_-H&F-YF<V,7fL\nRYZs^[kqK$^PV;7X3+<28VrG,FM9!nG@:24L\k-2<%gmXV">H77=ofqs-0[jbql;5J75]S!sp502jMl5*7dcY3@+4DDmuR?XK4biLnb"15&8*N<iK0E@15]ocKgdlj2:6(8X#2JXS:l3fj#rLU[JL)HU*]>53s=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.<Bb#d9&@duNUG#W)QS@]g+p?s3KjH]SbrdUELI&(k`fk[20oR_N4/LV(`jne0_/L+)V,-D"DjkR!VB8'"de:o>11oLoT/T"p;)Au:LL;E_V[T%OGVMjdt`aZ_8GXWQrHq%W6hLen/,#^:tT'n_C-o!'aWWuc%E8+OZgjD&$9p!-`'QA'Oj@tek?"GflM'CXY<IZLt&oHDje;.L[;kFCU!;qA>2H]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#+?<a3PSF`-q01CcqB=uYF:BmG4f@U\q_lodRV,@+hM3)=4&?,A;4ab!8mLHVAZn,F)Mh\k1^k+OK:#YEKdXs=[gi$\s!iM16A:,Q\6Gq1FQ<%dZ"9_FJ8669k_,P90B)S@UIT%!C0"+Q>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:T<D*Zt^!E)Qfqh`@TNG.ak]`[AAba&De2m<Pl?l%].JfEC0T^j?aG#'NcjE;#7eI=eP4*&s5@mE>tAL$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<U[Lu6f3_f\a><Z+!I$9Nn$RLX3LiC_`^OH-VK"pCr06s-_\DMe<Cj&u<!iU39ZNs"$6RSQoqA0@E#I=~> +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<J5T,UY'?2bu-?b./(5)<ooc?Ng,n/ToS6\)e[lI*<X%H9nZVpPT8'F.m6;9rT5+6ioUbps?8QL9F(#7\cV._bh*3SC>$:W2ji0@0<InGA/hHaCt:0Nh]rB`=aknco'J*[/h`-O,P8!R-$ehLr%GHlBM`]**;2Z:tW$@Gr'i&=e^@)[\+q.L^dg&C[!j/hta!nWI"2WQqeMFAE?hk.j1COpa@(FS'jOd/W\"]8n%?r-l*#/7;fD_arFHH/sb4n$^-\kBble!jL?!Aq(3:]g"NV'StE'fje@EbJ0m"'r'?@q%nU*G$IuArD5HKf-(fci_bb*fRe6mP;`/Gd-/>RmH'Z>d<,30N9!nPM.39^WCoTV9C'uu#&jo&F042E4=AW9b6<do:*3aQq[:]Bq/;/rr9)1W[g28VH)l]-'*M=t7G;-BP+VX&@&NTKl+hpr!Jfk4H=R;QH6t/9iD;cK6A/-M<\b.i:KnAf"\d3(1>B/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!nnNlT<DT;$q%b.6_\ko`,VcK1-V>XqV%a:[Q3\a.o,?&5LW58?H5b%LV1f\h]]Q?J#f$G#;VB_/<TfdH3dHV1j1sfg3=WB$Tg=f<VWMc;1TP!7qI[E1>NTZi7osE7%e5IHC\_$^,(58o>e.R:+)OUJ7>o*S"(HeK^0.u!/]d;Y$P\LS$c1.r'=+7R("Q@L0me[lJ./Q1*]\8>-Q<TQHKel+=a?EEYH.&oSh;#>?J,dBqC]e[LVgq'#LJF4<,"qgM0QSRf6$tM^3u7i_"]Ljfb2u$^phVNXVia`"$AX7$"676]-E7IJd(qu<LUj*`0I<_,pR%pTgiK>: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:<H_%u>nZ3k3(u"h*(s,0)cl<tC"t%\!8&[!Lc?C5.$cE.StNie1M4,2r)2B)QSc1sj4T-t+`V[0-)8?7s_9lE<aT:5f&,BO;81UO,"`_o\=b.Q`SWVhZ'*]P2r+Gn\2H1!H^5\B7b`;UP:&]K>2>?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"<HX1(e2YUq"Pm/+ioXtK;$q43R!4!4V'R8(2=4#h-(U,+(n'\t3;q55;.G5L5MRK8r#r\2MaA!1.4cg;7(/cU!%J$1a;O3%$)?$LP\l2LeNgb_#sSm^t%4=`!W_R";ZrsW;uAg-]S+"64=hu<P/Ys+[4Xbt#He#OHn&=t4nHdcG^)J^:_+FMkcSJQ+S<.,RX>S!:aS&k"l<A1M/Rbi;X3/4VjNb.8%Ln2U/n6K5N\*11JdnVL^0(*g.rGlBBs-cAC&be7)WY#Mg6mMTp=$K:CG9R\s/aj)VE3QWJJs/'0^n^[X:(rKV5K@@7kP~> +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/:BVUHP6</I1RBcL4caP+e6h@pAG=#])RJt^1@'2coi\pfc]?R2ELTNnLW:7HN#"]4?B^0ji'34hR8s%d<2[XGkFB0HHV1*:QDHf[`@ag[M@/$@l?>K3pfQ$`eLC&K%c`\&ScXu-E,04(o$^*)!CSj7n4835K@Y,/Jg9)/rhJX2@8E?1W)tqr(W<EnsIPf16[4NVpoJ-@Y!\VJ[nC]Bs]OheKK7(+):kih.Q%2HbNNJH<<G8:SkG@det]o!e<`,=q0X=!V`^k94rHZ3V^\%/MC`o$=D5TBX`+6fWukgg%QSC&ScJ_!WbJJA/s_mhC%hPStUAW+4V^j(FDprlIAJ;Q0t@\`)oBYOAFt3%>m7K>#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<`Hb<T<O/Ad-LSD93hn.]4fA3OV`,)=oZm5GXRquE4(uRqa@QmtRB,9Y*OE&X8U66a4:Y@#`2V/c]pjV8E]1'c^%1Z%Vp1bQi3U;L/2Rq[b.BTcN.gB"pJuJH]]5Z&)PQo(DHXBYF4kmj3sOOJ-!#PdT)8=X\9tfQVt!`O89@,V1k[Tu\LA'Fo7Utm(-fL_WDsba-+3#,eFrC3c3FuA1O,,FFYP@<&&u-a"=SJ1FQW\9rZ:G?%A<"scE-4E[$p.,EJ2jlS;3$+X$m;]5/0rNLJfVgWWW+/$6L<4VZ?s&b>0#f63PC.r9in1o.gGqI5"Q!MXb*3dO'uPp"=kM<X">A,bLgoZSY"!\\NDB-n`_VPb;;rU')`\/DmB00lc)AJVea?;_.(D0CpSDP&kYO&ji>u-6Wrcn2@'Y6MTa(6Cu6Rir2mOPD7l0_^0=jr*-U$;V3GbZ55dO3WVZB/k+k5T!StWMrR_Gn(kS:<Z-0N(^U\hqks"_IS^Um$e%=`$sm0"lOeLjKgoO/no_,_(3,Gkb=5tO1,<7P$Ba$DER3'M\Pi_MaZlE(dsBn!Y$+IJ%Wp?ng983a9eYT"FBCn.=*mjH,$t<c/C)[V&7GW`qm&k(YRu+#*-5Dm[O8kk9B'u8e`U;Q'0;ZWC4PJ3\cDqRQM9[[YV3PkR"#,q_.n8qgZi3m424]Y9<fj;IsuIF\6F@>V0m^%.^1GHs)ud-C*XR?DDr[-d5cnt(Rca'VXekW?==;U2ZddS*=%-1pc\*Dah),\:0\7@2qi$+Sa\ui^=.-fD5:dpKV<bP$1pm%$DAPsD0cDieUGu>Wlp(:EPmlY48%,V'i\,u=H4=)$5Ss3kX7V,p188t3n0rrNJa7b#g$W"V,]Eib<]C>ZYPr0I`FI-:b<V7!->[3VlobDT^Dltbg[S#^)XiRU45\d.<L!$-O7oo!G:YcM-SAGr,N[<n2+%kK8_]7bB7VW5ihTD]cI151hGRf=W;*ETG]()W9(?;9D(/$HGrpoLaqMHI$NkB=Kp=V1lU@08C#Yhk=o5sLcUuE6C]'@rKdqu,2B.:#=PM6cI$tUFE:QW"-Foa/0F050*o^7d@$6Mq,1WG/1UcC%nQ/rcED+P^pfHfoi+?`Dp(Gu=@Yir72_@/+UDnGK+uU#s5uJaP63G4B28>.(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 <</Im1 90 0 R + >> +>> +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 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
- *
- * <em>Instances Model, LoadDialog and StartDialog</em>
- *
- * @author Volker Dahnke
- *
- * @version 1 02-04-2006<br>
- */
- 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 + * + * <em>Instances Model, LoadDialog and StartDialog</em> + * + * @author Volker Dahnke + * + * @version 1 02-04-2006<br> + */ + 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 a7bb177..224e0c6 100644 --- a/server.policy +++ b/server.policy @@ -1,9 +1,20 @@ -grant {
- permission java.io.FilePermission "<<ALL FILES>>","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.net.SocketPermission "localhost:1050","connect,accept,resolve";
- permission java.util.PropertyPermission "id3.default_language", "read";
- permission java.util.PropertyPermission "id3.default_encoding", "read";
-};
+<<<<<<< HEAD +grant { + permission java.io.FilePermission "<<ALL FILES>>","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.net.SocketPermission "localhost:1050","connect,accept,resolve"; + permission java.util.PropertyPermission "id3.default_language", "read"; + permission java.util.PropertyPermission "id3.default_encoding", "read"; +}; +======= +grant { + permission java.io.FilePermission "<<ALL FILES>>","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"; +}; +>>>>>>> c62ff958823168d7622b397609220db8b67fa731 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
- *
- * <em></em>
- *
- * @author Manuel Traut
- *
- * @version 0.1 28-08-2008<br>
- *
- */
-
-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://<serverIP>:<portOfDB>/<dataBaseName>";
- */
- 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 + * + * <em></em> + * + * @author Manuel Traut + * + * @version 0.1 28-08-2008<br> + * + */ + +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://<serverIP>:<portOfDB>/<dataBaseName>"; + */ + 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
- *
- * <em></em>
- *
- * @author Volker Dahnke / Manuel Traut
- *
- * @version 1 02-04-2006<br>
- *
- */
-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<resultTable1.getSelectionCount();i++){
- int id=new Integer(resultTable1.getSelection()[i].getText(0)).intValue();
- System.out.println(resultTable1.getSelection()[i].getText(1));
- model.add2PlayList(id);
- }
- }
- while(playlistTable.getItemCount()!=0){
- playlistTable.remove(0);
- }
- ArrayList<Media> playlist=model.getToPlaylist();
- for(int i=0;i<playlist.size();i++){
- Media result=playlist.get(i);
- TableItem item = new TableItem(playlistTable,SWT.NONE);
- item.setText(0,result.name);
- item.setText(1,result.duration);
- }
- play.setEnabled(true);
- if (playlistTable.getItemCount()>1&& !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<Media> playlist=model.getToPlaylist();
- for(int i=0;i<playlist.size();i++){
- Media result=playlist.get(i);
- TableItem item = new TableItem(playlistTable,SWT.NONE);
- item.setText(0,result.name);
- item.setText(1,result.duration);
- }
- if (playlistTable.getItemCount()==0)play.setEnabled(false);
- }
- });
- }
- {
- playlistTable = new Table(playlistComposite,SWT.MULTI|SWT.FULL_SELECTION);
- playlistTable.setHeaderVisible(true);
- FormData playlistTableLData = new FormData();
- playlistTableLData.width = 184;
- playlistTableLData.height = 330;
- playlistTableLData.top = new FormAttachment(24, 1000, 0);
- playlistTableLData.left = new FormAttachment(0, 1000, 38);
- playlistTable.setLayoutData(playlistTableLData);
- playlistTable.setToolTipText("Playlist");
- playlistTable.addSelectionListener(new SelectionAdapter() {
- public void widgetSelected(SelectionEvent evt) {
- if (isNotPlaying)del.setEnabled(true);
- }
- });
- TableColumn title = new TableColumn(playlistTable,SWT.LEFT);
- title.setText("Title");
- title.setWidth(120);
- title.setMoveable(true);
- TableColumn duration = new TableColumn(playlistTable,SWT.RIGHT);
- duration.setText("Duration");
- duration.setWidth(80);
- duration.setMoveable(true);
- }
- }
- }
- /*{
- bottemComposite = new Composite(container1,SWT.NONE);
- bottemComposite.setVisible(false);
- GridLayout bottemCompositeLayout = new GridLayout();
- bottemCompositeLayout.makeColumnsEqualWidth = true;
- bottemCompositeLayout.verticalSpacing = 2;
- bottemCompositeLayout.horizontalSpacing = 5;
- bottemComposite.setLayout(bottemCompositeLayout);
- RowData bottemCompositeLData = new RowData();
- bottemCompositeLData.width = 777;
- bottemCompositeLData.height = 68;
- bottemComposite.setLayoutData(bottemCompositeLData);
- {
- styledText1 = new StyledText(bottemComposite,SWT.NONE);
- GridData styledText1LData = new GridData();
- styledText1LData.widthHint = 765;
- styledText1LData.heightHint = 55;
- styledText1.setLayoutData(styledText1LData);
- styledText1.setText("styledText1");
- styledText1.setSize(765, 55);
- }
- }*/
- }
- }
- {
- tab2 = new CTabItem(cTabFolder1,SWT.NONE);
- tab2.setText("Change");
- {
- container2 = new Composite(cTabFolder1,SWT.NONE);
- GridLayout container2Layout = new GridLayout();
- container2Layout.makeColumnsEqualWidth = true;
- container2.setLayout(container2Layout);
- tab2.setControl(container2);
- container2.setVisible(false);
- {
- composite2 = new Composite(container2,SWT.NONE);
- GridLayout composite2Layout = new GridLayout();
- composite2Layout.makeColumnsEqualWidth = true;
- composite2Layout.numColumns=2;
- composite2.setLayout(composite2Layout);
- GridData composite2LData = new GridData();
- composite2LData.widthHint = 780;
- composite2LData.heightHint = 497;
- composite2.setLayoutData(composite2LData);
- {
- group1 = new Group(composite2,SWT.NONE);
- this.find(group1,group2,composite1,changeComposite,2);
- }
- {
- group2 = new Group(composite2,SWT.NONE);
- this.logo(group2);
- }
- {
- composite1 = new Composite(composite2,SWT.NONE);
- {
- resultTable2 = new Table(composite1,SWT.MULTI|SWT.FULL_SELECTION);
- resultTable2.setToolTipText("Medias");
- resultTable2.addSelectionListener(new SelectionAdapter() {
- public void widgetSelected(SelectionEvent evt) {
- if(resultTable2.getSelectionCount()<2){
- int identity =new Integer(resultTable2.getSelection()[0].getText()).intValue();
- Media result = model.getMediaWithId(identity,2);
- if (result!=null){
- id.setText(new Integer(result.id).toString());
- title.setText(result.name);
- /* t.b.d. parse from string props
- author.setText(result.author);
- album.setText(result.album);
- category.setText(result.category);
- year.setText(result.year);
- */
- duration.setText(result.duration);
- /*
- aBitrate.setText(new Integer(result.aBitrate).toString());
- vBitrate.setText(new Integer(result.vBitrate).toString());
- resolution.setText(result.resolution);
- */
- ownerId.setText(result.owner.name);
- lastEdit.setText(result.lastEdit);
- path.setText(result.path);
- name.setText(result.name);
- String _type = model.getTypeName(result.type);
- type.setText(_type);
- changeComposite.setVisible(true);
- deleteButton.setVisible(true);
- }
- }else changeComposite.setVisible(false);
- }
- });
- this.resultTable(composite1,resultTable2,2);
- }
- }
- {
- changeComposite = new Composite(composite2,SWT.NONE);
- FormLayout changeCompositeLayout = new FormLayout();
- changeComposite.setLayout(changeCompositeLayout);
- GridData changeCompositeLData = new GridData();
- changeCompositeLData.widthHint = 238;
- changeCompositeLData.heightHint = 357;
- changeCompositeLData.verticalAlignment = GridData.BEGINNING;
- changeComposite.setLayoutData(changeCompositeLData);
- changeComposite.setVisible(false);
- {
- saveButton = new Button(changeComposite,SWT.PUSH | SWT.CENTER);
- saveButton.setText("Save");
- FormData saveButtonLData = new FormData();
- saveButtonLData.width = 40;
- saveButtonLData.height = 21;
- saveButtonLData.left = new FormAttachment(0, 1000, 30);
- saveButtonLData.top = new FormAttachment(0, 1000, 315);
- saveButton.setLayoutData(saveButtonLData);
- saveButton.setToolTipText("save Changes");
- saveButton.addSelectionListener(new SelectionAdapter() {
- public void widgetSelected(SelectionEvent evt) {
- saveButtonWidgetSelected(evt);
- }
- });
- }
- {
- id = new Text(changeComposite,SWT.NONE);
- FormData idLData = new FormData();
- idLData.width = 124;
- idLData.height = 14;
- idLData.left = new FormAttachment(0, 1000, 100);
- idLData.top = new FormAttachment(0, 1000, 10);
- id.setLayoutData(idLData);
- id.setEditable(false);
- }
- {
- idLabel = new CLabel(changeComposite,SWT.NONE);
- idLabel.setText("Id:");
- FormData idLabelLData = new FormData();
- idLabelLData.width = 60;
- idLabelLData.height = 21;
- idLabelLData.left = new FormAttachment(0, 1000, 20);
- idLabelLData.top = new FormAttachment(0, 1000, 5);
- idLabel.setLayoutData(idLabelLData);
- }
- {
- cLabel1 = new CLabel(changeComposite,SWT.NONE);
- cLabel1.setText("Type:");
- FormData cLabel1LData = new FormData();
- cLabel1LData.width = 60;
- cLabel1LData.height = 21;
- cLabel1LData.left = new FormAttachment(0, 1000, 20);
- cLabel1LData.top = new FormAttachment(0, 1000, 285);
- cLabel1.setLayoutData(cLabel1LData);
- }
- {
- nameLabel = new CLabel(changeComposite,SWT.NONE);
- nameLabel.setText("Name:");
- FormData nameLabelLData = new FormData();
- nameLabelLData.width = 60;
- nameLabelLData.height = 21;
- nameLabelLData.left = new FormAttachment(0, 1000, 20);
- nameLabelLData.top = new FormAttachment(0, 1000, 265);
- nameLabel.setLayoutData(nameLabelLData);
- }
- {
- pathLabel = new CLabel(changeComposite,SWT.NONE);
- pathLabel.setText("Path:");
- FormData pathLabelLData = new FormData();
- pathLabelLData.width = 60;
- pathLabelLData.height = 21;
- pathLabelLData.left = new FormAttachment(0, 1000, 20);
- pathLabelLData.top = new FormAttachment(0, 1000, 245);
- pathLabel.setLayoutData(pathLabelLData);
- }
- {
- lastEditLable = new CLabel(changeComposite,SWT.NONE);
- lastEditLable.setText("Last Edit:");
- FormData lastEditLableLData = new FormData();
- lastEditLableLData.width = 60;
- lastEditLableLData.height = 21;
- lastEditLableLData.left = new FormAttachment(0, 1000, 20);
- lastEditLableLData.top = new FormAttachment(0, 1000, 225);
- lastEditLable.setLayoutData(lastEditLableLData);
- }
- {
- ownerIdLabel = new CLabel(changeComposite,SWT.NONE);
- ownerIdLabel.setText("Owner:");
- FormData ownerIdLabelLData = new FormData();
- ownerIdLabelLData.width = 60;
- ownerIdLabelLData.height = 21;
- ownerIdLabelLData.left = new FormAttachment(0, 1000, 20);
- ownerIdLabelLData.top = new FormAttachment(0, 1000, 205);
- ownerIdLabel.setLayoutData(ownerIdLabelLData);
- }
- {
- resolutionLabel = new CLabel(changeComposite,SWT.NONE);
- resolutionLabel.setText("Resolution:");
- FormData resolutionLabelLData = new FormData();
- resolutionLabelLData.width = 60;
- resolutionLabelLData.height = 21;
- resolutionLabelLData.left = new FormAttachment(0, 1000, 20);
- resolutionLabelLData.top = new FormAttachment(0, 1000, 185);
- resolutionLabel.setLayoutData(resolutionLabelLData);
- }
- {
- vBitrateLabel = new CLabel(changeComposite,SWT.NONE);
- vBitrateLabel.setText("V-Bitrate:");
- FormData vBitrateLabelLData = new FormData();
- vBitrateLabelLData.width = 60;
- vBitrateLabelLData.height = 21;
- vBitrateLabelLData.left = new FormAttachment(0, 1000, 20);
- vBitrateLabelLData.top = new FormAttachment(0, 1000, 165);
- vBitrateLabel.setLayoutData(vBitrateLabelLData);
- }
- {
- aBitrateLabel = new CLabel(changeComposite,SWT.NONE);
- aBitrateLabel.setText("A-Bitrate:");
- FormData aBitrateLabelLData = new FormData();
- aBitrateLabelLData.width = 60;
- aBitrateLabelLData.height = 21;
- aBitrateLabelLData.left = new FormAttachment(0, 1000, 20);
- aBitrateLabelLData.top = new FormAttachment(0, 1000, 145);
- aBitrateLabel.setLayoutData(aBitrateLabelLData);
- }
- {
- durationLabel = new CLabel(changeComposite,SWT.NONE);
- durationLabel.setText("Duration:");
- FormData durationLabelLData = new FormData();
- durationLabelLData.width = 60;
- durationLabelLData.height = 21;
- durationLabelLData.left = new FormAttachment(0, 1000, 20);
- durationLabelLData.top = new FormAttachment(0, 1000, 125);
- durationLabel.setLayoutData(durationLabelLData);
- }
- {
- yearLabel = new CLabel(changeComposite,SWT.NONE);
- yearLabel.setText("Year:");
- FormData yearLabelLData = new FormData();
- yearLabelLData.width = 60;
- yearLabelLData.height = 21;
- yearLabelLData.left = new FormAttachment(0, 1000, 20);
- yearLabelLData.top = new FormAttachment(0, 1000, 105);
- yearLabel.setLayoutData(yearLabelLData);
- }
- {
- categoryLabel = new CLabel(changeComposite,SWT.NONE);
- categoryLabel.setText("Category:");
- FormData categoryLabelLData = new FormData();
- categoryLabelLData.width = 60;
- categoryLabelLData.height = 21;
- categoryLabelLData.left = new FormAttachment(0, 1000, 20);
- categoryLabelLData.top = new FormAttachment(0, 1000, 85);
- categoryLabel.setLayoutData(categoryLabelLData);
- }
- {
- albumLabel = new CLabel(changeComposite,SWT.NONE);
- albumLabel.setText("Album");
- FormData albumLabelLData = new FormData();
- albumLabelLData.width = 60;
- albumLabelLData.height = 21;
- albumLabelLData.left = new FormAttachment(0, 1000, 20);
- albumLabelLData.top = new FormAttachment(0, 1000, 65);
- albumLabel.setLayoutData(albumLabelLData);
- }
- {
- authorLabel = new CLabel(changeComposite,SWT.NONE);
- authorLabel.setText("Author:");
- FormData authorLabelLData = new FormData();
- authorLabelLData.width = 60;
- authorLabelLData.height = 21;
- authorLabelLData.left = new FormAttachment(0, 1000, 20);
- authorLabelLData.top = new FormAttachment(0, 1000, 45);
- authorLabel.setLayoutData(authorLabelLData);
- }
- {
- titleLabel = new CLabel(changeComposite,SWT.NONE);
- titleLabel.setText("Title:");
- FormData cLabel1LData1 = new FormData();
- cLabel1LData1.width = 60;
- cLabel1LData1.height = 21;
- cLabel1LData1.left = new FormAttachment(0, 1000, 20);
- cLabel1LData1.top = new FormAttachment(0, 1000, 25);
- titleLabel.setLayoutData(cLabel1LData1);
- }
- {
- type = new CCombo(changeComposite,SWT.NONE);
- FormData typeLData = new FormData();
- typeLData.width = 111;
- typeLData.height = 16;
- typeLData.left = new FormAttachment(0, 1000, 100);
- typeLData.top = new FormAttachment(0, 1000, 290);
- type.setLayoutData(typeLData);
- type.setCursor(SWTResourceManager.getCursor(SWT.CURSOR_HAND));
- {
- type.add("audio");
- type.add("video");
- }
- }
- {
- name = new Text(changeComposite,SWT.NONE);
- FormData nameLData = new FormData();
- nameLData.width = 124;
- nameLData.height = 14;
- nameLData.left = new FormAttachment(0, 1000, 100);
- nameLData.top = new FormAttachment(0, 1000, 270);
- name.setLayoutData(nameLData);
- name.setEditable(false);
- }
- {
- path = new Text(changeComposite,SWT.NONE);
- FormData pathLData = new FormData();
- pathLData.width = 124;
- pathLData.height = 14;
- pathLData.left = new FormAttachment(0, 1000, 100);
- pathLData.top = new FormAttachment(0, 1000, 250);
- path.setLayoutData(pathLData);
- path.setEditable(false);
- }
- {
- lastEdit = new Text(changeComposite,SWT.NONE);
- FormData lastEditLData = new FormData();
- lastEditLData.width = 124;
- lastEditLData.height = 14;
- lastEditLData.left = new FormAttachment(0, 1000, 100);
- lastEditLData.top = new FormAttachment(0, 1000, 230);
- lastEdit.setLayoutData(lastEditLData);
- lastEdit.setEditable(false);
- }
- {
- ownerId = new Text(changeComposite,SWT.NONE);
- FormData ownerIdLData = new FormData();
- ownerIdLData.width = 124;
- ownerIdLData.height = 14;
- ownerIdLData.left = new FormAttachment(0, 1000, 100);
- ownerIdLData.top = new FormAttachment(0, 1000, 210);
- ownerId.setLayoutData(ownerIdLData);
- ownerId.setEditable(false);
- }
- {
- resolution = new Text(changeComposite,SWT.NONE);
- FormData resolutionLData = new FormData();
- resolutionLData.width = 124;
- resolutionLData.height = 14;
- resolutionLData.left = new FormAttachment(0, 1000, 100);
- resolutionLData.top = new FormAttachment(0, 1000, 190);
- resolution.setLayoutData(resolutionLData);
- }
- {
- vBitrate = new Text(changeComposite,SWT.NONE);
- FormData vBitrateLData = new FormData();
- vBitrateLData.width = 124;
- vBitrateLData.height = 14;
- vBitrateLData.left = new FormAttachment(0, 1000, 100);
- vBitrateLData.top = new FormAttachment(0, 1000, 170);
- vBitrate.setLayoutData(vBitrateLData);
- }
- {
- aBitrate = new Text(changeComposite,SWT.NONE);
- FormData aBitrateLData = new FormData();
- aBitrateLData.width = 124;
- aBitrateLData.height = 14;
- aBitrateLData.left = new FormAttachment(0, 1000, 100);
- aBitrateLData.top = new FormAttachment(0, 1000, 150);
- aBitrate.setLayoutData(aBitrateLData);
- }
- {
- duration = new Text(changeComposite,SWT.NONE);
- FormData durationLData = new FormData();
- durationLData.width = 124;
- durationLData.height = 14;
- durationLData.left = new FormAttachment(0, 1000, 100);
- durationLData.top = new FormAttachment(0, 1000, 130);
- duration.setLayoutData(durationLData);
- }
- {
- year = new Text(changeComposite,SWT.NONE);
- FormData yearLData = new FormData();
- yearLData.width = 124;
- yearLData.height = 14;
- yearLData.left = new FormAttachment(0, 1000, 100);
- yearLData.top = new FormAttachment(0, 1000, 110);
- year.setLayoutData(yearLData);
- }
- {
- category = new Text(changeComposite,SWT.NONE);
- FormData categoryLData = new FormData();
- categoryLData.width = 124;
- categoryLData.height = 14;
- categoryLData.left = new FormAttachment(0, 1000, 100);
- categoryLData.top = new FormAttachment(0, 1000, 90);
- category.setLayoutData(categoryLData);
- category.setCursor(SWTResourceManager.getCursor(SWT.CURSOR_WAIT));
- }
- {
- album = new Text(changeComposite,SWT.NONE);
- FormData albumLData = new FormData();
- albumLData.width = 124;
- albumLData.height = 14;
- albumLData.left = new FormAttachment(0, 1000, 100);
- albumLData.top = new FormAttachment(0, 1000, 70);
- album.setLayoutData(albumLData);
- }
- {
- author = new Text(changeComposite,SWT.NONE);
- FormData authorLData = new FormData();
- authorLData.width = 124;
- authorLData.height = 14;
- authorLData.left = new FormAttachment(0, 1000, 100);
- authorLData.top = new FormAttachment(0, 1000, 50);
- author.setLayoutData(authorLData);
- }
- {
- title = new Text(changeComposite,SWT.NONE);
- FormData titleLData = new FormData();
- titleLData.width = 124;
- titleLData.height = 13;
- titleLData.top = new FormAttachment(0, 1000, 30);
- titleLData.left = new FormAttachment(0, 1000, 100);
- title.setLayoutData(titleLData);
- }
- }
- }
- {
- composite3 = new Composite(container2,SWT.NONE);
- FormLayout composite3Layout = new FormLayout();
- composite3.setLayout(composite3Layout);
- GridData composite3LData = new GridData();
- composite3LData.widthHint = 777;
- composite3LData.heightHint = 58;
- composite3.setLayoutData(composite3LData);
- {
- deleteButton = new Button(composite3,SWT.PUSH | SWT.CENTER);
- deleteButton.setText("Delete");
- deleteButton.setVisible(false);
- FormData deleteButtonLData = new FormData();
- deleteButtonLData.width = 150;
- deleteButtonLData.height = 30;
- deleteButtonLData.left = new FormAttachment(0, 1000, 470);
- deleteButtonLData.top = new FormAttachment(0, 1000, 15);
- deleteButton.setLayoutData(deleteButtonLData);
- deleteButton.setToolTipText("delete File from Database");
- deleteButton.addSelectionListener(new SelectionAdapter() {
- public void widgetSelected(SelectionEvent evt) {
- deleteButtonWidgetSelected(evt);
- }
- });
- }
- {
- addButton = new Button(composite3,SWT.PUSH | SWT.CENTER);
- addButton.setText("Add");
- FormData addButtonLData = new FormData();
- addButtonLData.width = 150;
- addButtonLData.height = 30;
- addButtonLData.left = new FormAttachment(0, 1000, 160);
- addButtonLData.top = new FormAttachment(0, 1000, 15);
- addButton.setLayoutData(addButtonLData);
- addButton.setToolTipText("add new Files to Database");
- addButton.addSelectionListener(new SelectionAdapter() {
- public void widgetSelected(SelectionEvent evt) {
- addButtonWidgetSelected(evt);
- }
- });
- }
- }
- }
- }
- {
- tab3 = new CTabItem(cTabFolder1,SWT.NONE);
- tab3.setText("Server");
- {
- container3 = new Composite(cTabFolder1,SWT.NONE);
- GridLayout container3Layout = new GridLayout();
- container3Layout.makeColumnsEqualWidth = true;
- container3Layout.numColumns=2;
- container3Layout.verticalSpacing = 0;
- container3Layout.horizontalSpacing = 5;
- container3.setLayout(container3Layout);
- tab3.setControl(container3);
- {
- tab3Group1 = new Group(container3,SWT.NONE);
- FormLayout tab3Group1Layout = new FormLayout();
- tab3Group1.setLayout(tab3Group1Layout);
- GridData tab3Group1LData = new GridData();
- tab3Group1LData.widthHint = 500;
- tab3Group1LData.heightHint = 129;
- tab3Group1LData.horizontalAlignment = GridData.CENTER;
- tab3Group1.setLayoutData(tab3Group1LData);
- {
- composite4 = new Composite(tab3Group1, SWT.NONE);
- FormLayout composite4Layout = new FormLayout();
- composite4.setLayout(composite4Layout);
- FormData composite4LData = new FormData();
- composite4LData.width = 504;
- composite4LData.height = 140;
- composite4LData.left = new FormAttachment(0, 1000, -3);
- composite4LData.top = new FormAttachment(0, 1000, -6);
- composite4.setLayoutData(composite4LData);
- {
- actualStreamLabel2 = new CLabel(
- composite4,
- SWT.NONE);
- FormData actualStreamLabel2LData = new FormData();
- actualStreamLabel2LData.width = 98;
- actualStreamLabel2LData.height = 21;
- actualStreamLabel2LData.left = new FormAttachment(0, 1000, 180);
- actualStreamLabel2LData.top = new FormAttachment(0, 1000, 65);
- actualStreamLabel2.setLayoutData(actualStreamLabel2LData);
- actualStreamLabel2.setFont(SWTResourceManager.getFont("Times", 8, 1, false, false));
- }
- {
- actualStreamLabel1 = new CLabel(
- composite4,
- SWT.NONE);
- actualStreamLabel1.setText("Actual Number of Streams:");
- FormData actualStreamLabel1LData = new FormData();
- actualStreamLabel1LData.width = 160;
- actualStreamLabel1LData.height = 21;
- actualStreamLabel1LData.left = new FormAttachment(0, 1000, 14);
- actualStreamLabel1LData.top = new FormAttachment(0, 1000, 65);
- actualStreamLabel1.setLayoutData(actualStreamLabel1LData);
- actualStreamLabel1.setFont(SWTResourceManager.getFont("Times", 8, 1, false, false));
- }
- {
- streamLabel2 = new CLabel(
- composite4,
- SWT.None);
- FormData streamLabel2LData = new FormData();
- streamLabel2LData.width = 98;
- streamLabel2LData.height = 21;
- streamLabel2LData.left = new FormAttachment(0, 1000, 180);
- streamLabel2LData.top = new FormAttachment(0, 1000, 40);
- streamLabel2.setLayoutData(streamLabel2LData);
- streamLabel2.setFont(SWTResourceManager.getFont("Times", 8, 1, false, false));
- }
- {
- streamLabel1 = new CLabel(
- composite4,
- SWT.NONE);
- streamLabel1.setText("Total Number of Streams:");
- FormData streamLabel1LData = new FormData();
- streamLabel1LData.width = 150;
- streamLabel1LData.height = 21;
- streamLabel1LData.left = new FormAttachment(0, 1000, 14);
- streamLabel1LData.top = new FormAttachment(0, 1000, 40);
- streamLabel1.setLayoutData(streamLabel1LData);
- streamLabel1.setFont(SWTResourceManager.getFont("Times", 8, 1, false, false));
- }
- {
- data2 = new CLabel(composite4, SWT.NONE);
- FormData data2LData = new FormData();
- data2LData.width = 98;
- data2LData.height = 21;
- data2LData.left = new FormAttachment(0, 1000, 180);
- data2LData.top = new FormAttachment(0, 1000, 15);
- data2.setLayoutData(data2LData);
- data2.setFont(SWTResourceManager.getFont("Times", 8, 1, false, false));
- }
- {
- data1 = new CLabel(composite4, SWT.NONE);
- data1.setText("Total Data in Database:");
- FormData data1LData = new FormData();
- data1LData.width = 150;
- data1LData.height = 21;
- data1LData.left = new FormAttachment(0, 1000, 14);
- data1LData.top = new FormAttachment(0, 1000, 15);
- data1.setLayoutData(data1LData);
- data1.setFont(SWTResourceManager.getFont("Times", 8, 1, false, false));
- }
- {
- shutdown = new Button(composite4, SWT.PUSH
- | SWT.CENTER);
- shutdown.setText("Shutdown");
- FormData shutdownLData = new FormData();
- shutdownLData.width = 77;
- shutdownLData.height = 21;
- shutdownLData.left = new FormAttachment(0, 1000, 35);
- shutdownLData.top = new FormAttachment(0, 1000, 105);
- shutdown.setLayoutData(shutdownLData);
- shutdown.setToolTipText("Server shutdown");
- shutdown.addSelectionListener(new SelectionAdapter() {
- public void widgetSelected(SelectionEvent evt) {
- model.serverShutdown();
- }
- });
- }
- {
- iptable = new Table(composite4, SWT.SINGLE);
- FormData iptableLData = new FormData();
- iptableLData.width = 173;
- iptableLData.height = 110;
- iptableLData.left = new FormAttachment(0, 1000, 308);
- iptableLData.top = new FormAttachment(0, 1000, 7);
- iptable.setLayoutData(iptableLData);
- iptable.setHeaderVisible(true);
- iptable.setToolTipText("User online");
- {
- userName = new TableColumn(
- iptable,
- SWT.CENTER);
- userName.setText("Username");
- userName.setWidth(70);
- }
- {
- ip = new TableColumn(iptable, SWT.BEGINNING);
- ip.setText("Ip");
- ip.setWidth(119);
- }
- final int time = 1000;
- final Runnable timer = new Runnable() {
- public void run() {
- refillIpTable();
- data2.setText("not supported in yalp2");
- streamLabel2.setText( /*new Integer(model.getAllStreamNum()).toString() */ "not supported in yalp2");
- display.timerExec(time, this);
- actualStreamLabel2.setText( /*new Integer(model.getActualStreamNum()).toString()*/ "not supported in yalp2");
- }
- };
- display.timerExec(time, timer);
- }
- }
- }
- {
- tab3Group2 = new Group(container3,SWT.NONE);
- this.logo(tab3Group2);
- }
- {
- tab3Group3 = new Group(container3,SWT.NONE);
- FormLayout tab3Group3Layout = new FormLayout();
- tab3Group3.setLayout(tab3Group3Layout);
- GridData tab3Group3LData = new GridData();
- tab3Group3LData.widthHint = 500;
- tab3Group3LData.heightHint = 284;
- tab3Group3LData.horizontalAlignment = GridData.CENTER;
- tab3Group3.setLayoutData(tab3Group3LData);
- tab3Group3.setText("User Management");
- {
- delete = new Button(tab3Group3,SWT.PUSH | SWT.CENTER);
- delete.setText("Delete");
- FormData deleteLData = new FormData();
- deleteLData.width = 45;
- deleteLData.height = 21;
- deleteLData.left = new FormAttachment(0, 1000, 447);
- deleteLData.top = new FormAttachment(0, 1000, 254);
- delete.setLayoutData(deleteLData);
- delete.setToolTipText("delete User");
- delete.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.DELETE);
- while(UserTable.getItemCount()!=0){
- UserTable.remove(0);
- }
- ArrayList<YalpUser> 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<YalpUser> 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<YalpUser> 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<YalpUser> 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<resultTable1.getSelectionCount();i++){
- int id=new Integer(resultTable1.getSelection()[i].getText(0)).intValue();
- System.out.println(resultTable1.getSelection()[i].getText(1));
- model.add2PlayList(id);
- }
- }
- while(playlistTable.getItemCount()!=0){
- playlistTable.remove(0);
- }
- ArrayList<Media> playlist=model.getToPlaylist();
- for(int i=0;i<playlist.size();i++){
- Media result=playlist.get(i);
- TableItem item = new TableItem(playlistTable,SWT.NONE);
- item.setText(0,result.name);
- item.setText(1,result.duration);
- }
- play.setEnabled(true);
- if (playlistTable.getItemCount()>1&& !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<Media> playlist=model.getToPlaylist();
- for(int i=0;i<playlist.size();i++){
- Media result=playlist.get(i);
- TableItem item = new TableItem(playlistTable,SWT.NONE);
- item.setText(0,result.name);
- item.setText(1,result.duration);
- }
- if (playlistTable.getItemCount()==0)play.setEnabled(false);
- }
- });
- }
- {
- playlistTable = new Table(playlistComposite,SWT.MULTI|SWT.FULL_SELECTION);
- playlistTable.setHeaderVisible(true);
- FormData playlistTableLData = new FormData();
- playlistTableLData.width = 184;
- playlistTableLData.height = 330;
- playlistTableLData.top = new FormAttachment(24, 1000, 0);
- playlistTableLData.left = new FormAttachment(0, 1000, 38);
- playlistTable.setLayoutData(playlistTableLData);
- playlistTable.setToolTipText("Playlist");
- playlistTable.addSelectionListener(new SelectionAdapter() {
- public void widgetSelected(SelectionEvent evt) {
- if (isNotPlaying)del.setEnabled(true);
- }
- });
- TableColumn title = new TableColumn(playlistTable,SWT.LEFT);
- title.setText("Title");
- title.setWidth(120);
- title.setMoveable(true);
- TableColumn duration = new TableColumn(playlistTable,SWT.RIGHT);
- duration.setText("Duration");
- duration.setWidth(80);
- duration.setMoveable(true);
- }
- }
- }
- }
- }
- this.layout();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
-
- //TODO:start find
- private void find(Group find,Composite resultComposite, Composite playlistComposite,Composite bottemComposite,int _tab){
- final Text searchField = new Text(find,SWT.NONE);
- final Button findButton = new Button(find,SWT.PUSH | SWT.CENTER);
- final Button allCheckBox = new Button(find,SWT.RADIO | SWT.LEFT);
- final Button videoCheckBox = new Button(find,SWT.RADIO | SWT.LEFT);
- final Button audioCheckBox = new Button(find,SWT.RADIO | SWT.LEFT);
- final CLabel returnNum= new CLabel(find, SWT.NONE);
- final int tab=_tab;
- {
- cLabel2 = new CLabel(find, SWT.NONE);
- if (tab==1)cLabel2.setText("find and stream mutimedia files");
- else cLabel2.setText("find and manage mutimedia files");
- FormData cLabel2LData = new FormData();
- cLabel2LData.width = 250;
- cLabel2LData.height = 21;
- cLabel2LData.left = new FormAttachment(0,1000,46);
- cLabel2LData.top = new FormAttachment(0,1000,13);
- cLabel2.setLayoutData(cLabel2LData);
- }
- {
-
- FormData allCheckBoxLData = new FormData();
- allCheckBoxLData.left = new FormAttachment(0, 1000, 95);
- allCheckBoxLData.top = new FormAttachment(0, 1000, 98);
- allCheckBoxLData.width = 56;
- allCheckBoxLData.height = 14;
- allCheckBox.setLayoutData(allCheckBoxLData);
- allCheckBox.setText("All");
- allCheckBox.setSelection(true);
- allCheckBox.setToolTipText("Find Audio and Video Files");
- allCheckBox.addKeyListener(new KeyAdapter() {
- public void keyPressed(KeyEvent evt) {
- if (evt.character == SWT.CR) {
- searchPressed(
- searchField,
- videoCheckBox,
- audioCheckBox,
- returnNum,
- tab);
- }
- }
- });
- }
- {
-
- FormData audioCheckBoxLData = new FormData();
- audioCheckBoxLData.left = new FormAttachment(0, 1000, 195);
- audioCheckBoxLData.top = new FormAttachment(0, 1000, 98);
- audioCheckBoxLData.width = 56;
- audioCheckBoxLData.height = 14;
- audioCheckBox.setLayoutData(audioCheckBoxLData);
- audioCheckBox.setText("Audio");
- audioCheckBox.setToolTipText("Find Audio Files");
- audioCheckBox
- .addKeyListener(new KeyAdapter() {
- public void keyPressed(KeyEvent evt) {
- if (evt.character == SWT.CR) {
- searchPressed(
- searchField,
- videoCheckBox,
- audioCheckBox,
- returnNum,
- tab);
- }
- }
- });
- }
- {
-
- FormData videoCheckBoxLData = new FormData();
- videoCheckBoxLData.left = new FormAttachment(0, 1000, 296);
- videoCheckBoxLData.top = new FormAttachment(0, 1000, 98);
- videoCheckBoxLData.width = 56;
- videoCheckBoxLData.height = 14;
- videoCheckBox.setLayoutData(videoCheckBoxLData);
- videoCheckBox.setText("Video");
- videoCheckBox.setToolTipText("Find Video Files");
- videoCheckBox
- .addKeyListener(new KeyAdapter() {
- public void keyPressed(KeyEvent evt) {
- if (evt.character == SWT.CR) {
- searchPressed(
- searchField,
- videoCheckBox,
- audioCheckBox,
- returnNum,
- tab);
- }
- }
- });
- }
-
-
- FormLayout findLayout = new FormLayout();
- find.setLayout(findLayout);
- GridData findLData = new GridData();
- findLData.widthHint = 497;
- findLData.heightHint = 130;
- find.setLayoutData(findLData);
- find.setSize(497, 104);
- find.addKeyListener(new KeyAdapter() {
- public void keyPressed(KeyEvent evt) {
- if (evt.character==SWT.CR){
- searchPressed(searchField,videoCheckBox,audioCheckBox,returnNum,tab);
- }
- }
- });
- {
- //searchField
- FormData searchFieldLData = new FormData();
- searchFieldLData.width = 344;
- searchFieldLData.height = 20;
- searchFieldLData.left = new FormAttachment(0,1000,37);
- searchFieldLData.top = new FormAttachment(0,1000,55);
- searchField.setLayoutData(searchFieldLData);
- searchField.setFont(SWTResourceManager.getFont("Times",12,0,false,false));
- searchField.setToolTipText("Keyword");
- searchField.addKeyListener(new KeyAdapter() {
- public void keyPressed(KeyEvent evt) {
- if (evt.character==SWT.CR){
- searchPressed(searchField,videoCheckBox,audioCheckBox,returnNum,tab);
- }
- }
- });
- }
- {
- //findButton
- findButton.setText("Find");
- FormData findButtonLData = new FormData(70,26);
- findButtonLData.width = 70;
- findButtonLData.height = 26;
- findButtonLData.left = new FormAttachment(0,1000,403);
- findButtonLData.top = new FormAttachment(0,1000,52);
- findButton.setLayoutData(findButtonLData);
- findButton.setSize(70, 26);
- findButton.setToolTipText("Find");
- findButton.addSelectionListener(new SelectionAdapter() {
- public void widgetSelected(SelectionEvent evt) {
- add2.setEnabled(false);
- searchPressed(searchField,videoCheckBox,audioCheckBox,returnNum,tab);
- }
- });
- }
- {
- returnNum.setText("");
- FormData returnNumLData = new FormData();
- returnNumLData.width = 63;
- returnNumLData.height = 21;
- returnNumLData.left = new FormAttachment(0, 1000, 410);
- returnNumLData.top = new FormAttachment(0, 1000, 93);
- returnNum.setLayoutData(returnNumLData);
- }
- }
-
- //TODO logo
- private void logo(Group logo){
- FormLayout logoLayout = new FormLayout();
- logo.setLayout(logoLayout);
- GridData logoLData = new GridData();
- logoLData.widthHint = 260;
- logoLData.heightHint = 130;
- logo.setLayoutData(logoLData);
- logoLayout.marginWidth=30;
- logoLayout.marginHeight=0;
- {
- cLabel2 = new CLabel(logo,SWT.NONE);
- cLabel2.setImage(new Image(this.getDisplay(),"img/yalpV2.gif"));
- }
-
-
-
- }
-
-
-
- //TODO resultComposite
- private void resultTable(Composite resultComposite,Table resultTable,int tab){
-
- resultComposite.setVisible(false);
- FormLayout resultCompositeLayout = new FormLayout();
- resultComposite.setLayout(resultCompositeLayout);
- GridData resultCompositeLData = new GridData();
- resultCompositeLData.widthHint = 502;
- if (tab==1)resultCompositeLData.heightHint = 390;
- else resultCompositeLData.heightHint = 380;
- resultComposite.setLayoutData(resultCompositeLData);
- {
- FormData resultTableLData = new FormData();
- resultTableLData.width = 482;
- if (tab==1)resultTableLData.height = 365;
- else resultTableLData.height = 313;
- resultTableLData.left = new FormAttachment(0, 1000, 0);
- resultTableLData.top = new FormAttachment(0, 1000, 7);
- resultTable.setLayoutData(resultTableLData);
- resultTable.setHeaderVisible(true);
- TableColumn id = new TableColumn(resultTable,SWT.RIGHT);
- id.setText("ID");
- id.setWidth(0);
- id.setMoveable(true);
- id.addListener(SWT.Selection, new SortListener(this,resultTable,0,8));
- TableColumn title = new TableColumn(resultTable,SWT.LEFT);
- title.setText("Title");
- title.setWidth(110);
- title.setMoveable(true);
- title.addListener(SWT.Selection, new SortListener(this,resultTable,1,8));
- TableColumn author = new TableColumn(resultTable,SWT.LEFT);
- author.setText("Author");
- author.setWidth(100);
- author.setMoveable(true);
- author.addListener(SWT.Selection, new SortListener(this,resultTable,2,8));
- TableColumn album = new TableColumn(resultTable,SWT.LEFT);
- album.setText("Album");
- album.setWidth(100);
- album.setMoveable(true);
- album.addListener(SWT.Selection, new SortListener(this,resultTable,3,8));
- TableColumn year = new TableColumn(resultTable,SWT.LEFT);
- year.setText("Year");
- year.setWidth(60);
- year.setMoveable(true);
- year.addListener(SWT.Selection, new SortListener(this,resultTable,4,8));
- TableColumn category = new TableColumn(resultTable,SWT.LEFT);
- category.setText("Category");
- category.setWidth(60);
- category.setMoveable(true);
- category.addListener(SWT.Selection, new SortListener(this,resultTable,5,8));
- TableColumn type = new TableColumn(resultTable,SWT.LEFT);
- type.setText("Type");
- type.setWidth(60);
- type.setMoveable(true);
- type.addListener(SWT.Selection, new SortListener(this,resultTable,6,8));
- }
-
- }
- private void saveButtonWidgetSelected(SelectionEvent evt) {
- try{
- int OwnerId = model.getOwnerid(ownerId.getText());
- Media media = new Media();
- media.id = new Integer(id.getText()).intValue();
- media.name = title.getText();
- media.duration = duration.getText();
- media.lastEdit = new Date(System.currentTimeMillis()).toString();
- media.path = path.getText();
- media.fileName = name.getText();
- /* t.b.d.
- author.getText();
- album.getText();
- category.getText();
- year.getText();
- new Integer(aBitrate.getText()).intValue();
- new Integer(vBitrate.getText()).intValue();
- resolution.getText();
- OwnerId;
- */
- if (model.changeMedia(media, Action.EDIT)) {
- int select=resultTable2.getSelectionIndex();
- TableItem item= new TableItem(resultTable2,SWT.NONE,select);
- item.setText(0,new Integer(media.id).toString());
- item.setText(1,media.name);
- /* t.b.d. read from string props
- item.setText(2,media.author.name);
- item.setText(3,media.album);
- item.setText(4,media.year);
- item.setText(5,media.category);
- */
- item.setText(6,model.getTypeName(media.type));
- resultTable2.remove(select+1);
- resultTable2.setSelection(select);
- changeComposite.setVisible(false);
- deleteButton.setVisible(false);
- }
- }catch (Exception e){
- System.out.println("Exception in SaveButton"+e);
- }
- }
-
- private void searchPressed(Text searchField,Button videoCheckBox,Button audioCheckBox,CLabel returnNum,int tab){
- String search = searchField.getText();
- int returnVal;
- ArrayList<MediaType> types = new ArrayList<MediaType>();
-
- 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);
- ArrayList<Media>resultList = 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<ClientInfo> 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 + * + * <em></em> + * + * @author Volker Dahnke / Manuel Traut + * + * @version 1 02-04-2006<br> + * + */ +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<resultTable1.getSelectionCount();i++){ + int id=new Integer(resultTable1.getSelection()[i].getText(0)).intValue(); + System.out.println(resultTable1.getSelection()[i].getText(1)); + model.add2PlayList(id); + } + } + while(playlistTable.getItemCount()!=0){ + playlistTable.remove(0); + } + ArrayList<Media> playlist=model.getToPlaylist(); + for(int i=0;i<playlist.size();i++){ + Media result=playlist.get(i); + TableItem item = new TableItem(playlistTable,SWT.NONE); + item.setText(0,result.name); + item.setText(1,result.duration); + } + play.setEnabled(true); + if (playlistTable.getItemCount()>1&& !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<Media> playlist=model.getToPlaylist(); + for(int i=0;i<playlist.size();i++){ + Media result=playlist.get(i); + TableItem item = new TableItem(playlistTable,SWT.NONE); + item.setText(0,result.name); + item.setText(1,result.duration); + } + if (playlistTable.getItemCount()==0)play.setEnabled(false); + } + }); + } + { + playlistTable = new Table(playlistComposite,SWT.MULTI|SWT.FULL_SELECTION); + playlistTable.setHeaderVisible(true); + FormData playlistTableLData = new FormData(); + playlistTableLData.width = 184; + playlistTableLData.height = 330; + playlistTableLData.top = new FormAttachment(24, 1000, 0); + playlistTableLData.left = new FormAttachment(0, 1000, 38); + playlistTable.setLayoutData(playlistTableLData); + playlistTable.setToolTipText("Playlist"); + playlistTable.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent evt) { + if (isNotPlaying)del.setEnabled(true); + } + }); + TableColumn title = new TableColumn(playlistTable,SWT.LEFT); + title.setText("Title"); + title.setWidth(120); + title.setMoveable(true); + TableColumn duration = new TableColumn(playlistTable,SWT.RIGHT); + duration.setText("Duration"); + duration.setWidth(80); + duration.setMoveable(true); + } + } + } + /*{ + bottemComposite = new Composite(container1,SWT.NONE); + bottemComposite.setVisible(false); + GridLayout bottemCompositeLayout = new GridLayout(); + bottemCompositeLayout.makeColumnsEqualWidth = true; + bottemCompositeLayout.verticalSpacing = 2; + bottemCompositeLayout.horizontalSpacing = 5; + bottemComposite.setLayout(bottemCompositeLayout); + RowData bottemCompositeLData = new RowData(); + bottemCompositeLData.width = 777; + bottemCompositeLData.height = 68; + bottemComposite.setLayoutData(bottemCompositeLData); + { + styledText1 = new StyledText(bottemComposite,SWT.NONE); + GridData styledText1LData = new GridData(); + styledText1LData.widthHint = 765; + styledText1LData.heightHint = 55; + styledText1.setLayoutData(styledText1LData); + styledText1.setText("styledText1"); + styledText1.setSize(765, 55); + } + }*/ + } + } + { + tab2 = new CTabItem(cTabFolder1,SWT.NONE); + tab2.setText("Change"); + { + container2 = new Composite(cTabFolder1,SWT.NONE); + GridLayout container2Layout = new GridLayout(); + container2Layout.makeColumnsEqualWidth = true; + container2.setLayout(container2Layout); + tab2.setControl(container2); + container2.setVisible(false); + { + composite2 = new Composite(container2,SWT.NONE); + GridLayout composite2Layout = new GridLayout(); + composite2Layout.makeColumnsEqualWidth = true; + composite2Layout.numColumns=2; + composite2.setLayout(composite2Layout); + GridData composite2LData = new GridData(); + composite2LData.widthHint = 780; + composite2LData.heightHint = 497; + composite2.setLayoutData(composite2LData); + { + group1 = new Group(composite2,SWT.NONE); + this.find(group1,group2,composite1,changeComposite,2); + } + { + group2 = new Group(composite2,SWT.NONE); + this.logo(group2); + } + { + composite1 = new Composite(composite2,SWT.NONE); + { + resultTable2 = new Table(composite1,SWT.MULTI|SWT.FULL_SELECTION); + resultTable2.setToolTipText("Medias"); + resultTable2.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent evt) { + if(resultTable2.getSelectionCount()<2){ + int identity =new Integer(resultTable2.getSelection()[0].getText()).intValue(); + Media result = model.getMediaWithId(identity,2); + if (result!=null){ + id.setText(new Integer(result.id).toString()); + title.setText(result.name); + /* t.b.d. parse from string props + author.setText(result.author); + album.setText(result.album); + category.setText(result.category); + year.setText(result.year); + */ + duration.setText(result.duration); + /* + aBitrate.setText(new Integer(result.aBitrate).toString()); + vBitrate.setText(new Integer(result.vBitrate).toString()); + resolution.setText(result.resolution); + */ + ownerId.setText(result.owner.name); + lastEdit.setText(result.lastEdit); + path.setText(result.path); + name.setText(result.name); + String _type = model.getTypeName(result.type); + type.setText(_type); + changeComposite.setVisible(true); + deleteButton.setVisible(true); + } + }else changeComposite.setVisible(false); + } + }); + this.resultTable(composite1,resultTable2,2); + } + } + { + changeComposite = new Composite(composite2,SWT.NONE); + FormLayout changeCompositeLayout = new FormLayout(); + changeComposite.setLayout(changeCompositeLayout); + GridData changeCompositeLData = new GridData(); + changeCompositeLData.widthHint = 238; + changeCompositeLData.heightHint = 357; + changeCompositeLData.verticalAlignment = GridData.BEGINNING; + changeComposite.setLayoutData(changeCompositeLData); + changeComposite.setVisible(false); + { + saveButton = new Button(changeComposite,SWT.PUSH | SWT.CENTER); + saveButton.setText("Save"); + FormData saveButtonLData = new FormData(); + saveButtonLData.width = 40; + saveButtonLData.height = 21; + saveButtonLData.left = new FormAttachment(0, 1000, 30); + saveButtonLData.top = new FormAttachment(0, 1000, 315); + saveButton.setLayoutData(saveButtonLData); + saveButton.setToolTipText("save Changes"); + saveButton.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent evt) { + saveButtonWidgetSelected(evt); + } + }); + } + { + id = new Text(changeComposite,SWT.NONE); + FormData idLData = new FormData(); + idLData.width = 124; + idLData.height = 14; + idLData.left = new FormAttachment(0, 1000, 100); + idLData.top = new FormAttachment(0, 1000, 10); + id.setLayoutData(idLData); + id.setEditable(false); + } + { + idLabel = new CLabel(changeComposite,SWT.NONE); + idLabel.setText("Id:"); + FormData idLabelLData = new FormData(); + idLabelLData.width = 60; + idLabelLData.height = 21; + idLabelLData.left = new FormAttachment(0, 1000, 20); + idLabelLData.top = new FormAttachment(0, 1000, 5); + idLabel.setLayoutData(idLabelLData); + } + { + cLabel1 = new CLabel(changeComposite,SWT.NONE); + cLabel1.setText("Type:"); + FormData cLabel1LData = new FormData(); + cLabel1LData.width = 60; + cLabel1LData.height = 21; + cLabel1LData.left = new FormAttachment(0, 1000, 20); + cLabel1LData.top = new FormAttachment(0, 1000, 285); + cLabel1.setLayoutData(cLabel1LData); + } + { + nameLabel = new CLabel(changeComposite,SWT.NONE); + nameLabel.setText("Name:"); + FormData nameLabelLData = new FormData(); + nameLabelLData.width = 60; + nameLabelLData.height = 21; + nameLabelLData.left = new FormAttachment(0, 1000, 20); + nameLabelLData.top = new FormAttachment(0, 1000, 265); + nameLabel.setLayoutData(nameLabelLData); + } + { + pathLabel = new CLabel(changeComposite,SWT.NONE); + pathLabel.setText("Path:"); + FormData pathLabelLData = new FormData(); + pathLabelLData.width = 60; + pathLabelLData.height = 21; + pathLabelLData.left = new FormAttachment(0, 1000, 20); + pathLabelLData.top = new FormAttachment(0, 1000, 245); + pathLabel.setLayoutData(pathLabelLData); + } + { + lastEditLable = new CLabel(changeComposite,SWT.NONE); + lastEditLable.setText("Last Edit:"); + FormData lastEditLableLData = new FormData(); + lastEditLableLData.width = 60; + lastEditLableLData.height = 21; + lastEditLableLData.left = new FormAttachment(0, 1000, 20); + lastEditLableLData.top = new FormAttachment(0, 1000, 225); + lastEditLable.setLayoutData(lastEditLableLData); + } + { + ownerIdLabel = new CLabel(changeComposite,SWT.NONE); + ownerIdLabel.setText("Owner:"); + FormData ownerIdLabelLData = new FormData(); + ownerIdLabelLData.width = 60; + ownerIdLabelLData.height = 21; + ownerIdLabelLData.left = new FormAttachment(0, 1000, 20); + ownerIdLabelLData.top = new FormAttachment(0, 1000, 205); + ownerIdLabel.setLayoutData(ownerIdLabelLData); + } + { + resolutionLabel = new CLabel(changeComposite,SWT.NONE); + resolutionLabel.setText("Resolution:"); + FormData resolutionLabelLData = new FormData(); + resolutionLabelLData.width = 60; + resolutionLabelLData.height = 21; + resolutionLabelLData.left = new FormAttachment(0, 1000, 20); + resolutionLabelLData.top = new FormAttachment(0, 1000, 185); + resolutionLabel.setLayoutData(resolutionLabelLData); + } + { + vBitrateLabel = new CLabel(changeComposite,SWT.NONE); + vBitrateLabel.setText("V-Bitrate:"); + FormData vBitrateLabelLData = new FormData(); + vBitrateLabelLData.width = 60; + vBitrateLabelLData.height = 21; + vBitrateLabelLData.left = new FormAttachment(0, 1000, 20); + vBitrateLabelLData.top = new FormAttachment(0, 1000, 165); + vBitrateLabel.setLayoutData(vBitrateLabelLData); + } + { + aBitrateLabel = new CLabel(changeComposite,SWT.NONE); + aBitrateLabel.setText("A-Bitrate:"); + FormData aBitrateLabelLData = new FormData(); + aBitrateLabelLData.width = 60; + aBitrateLabelLData.height = 21; + aBitrateLabelLData.left = new FormAttachment(0, 1000, 20); + aBitrateLabelLData.top = new FormAttachment(0, 1000, 145); + aBitrateLabel.setLayoutData(aBitrateLabelLData); + } + { + durationLabel = new CLabel(changeComposite,SWT.NONE); + durationLabel.setText("Duration:"); + FormData durationLabelLData = new FormData(); + durationLabelLData.width = 60; + durationLabelLData.height = 21; + durationLabelLData.left = new FormAttachment(0, 1000, 20); + durationLabelLData.top = new FormAttachment(0, 1000, 125); + durationLabel.setLayoutData(durationLabelLData); + } + { + yearLabel = new CLabel(changeComposite,SWT.NONE); + yearLabel.setText("Year:"); + FormData yearLabelLData = new FormData(); + yearLabelLData.width = 60; + yearLabelLData.height = 21; + yearLabelLData.left = new FormAttachment(0, 1000, 20); + yearLabelLData.top = new FormAttachment(0, 1000, 105); + yearLabel.setLayoutData(yearLabelLData); + } + { + categoryLabel = new CLabel(changeComposite,SWT.NONE); + categoryLabel.setText("Category:"); + FormData categoryLabelLData = new FormData(); + categoryLabelLData.width = 60; + categoryLabelLData.height = 21; + categoryLabelLData.left = new FormAttachment(0, 1000, 20); + categoryLabelLData.top = new FormAttachment(0, 1000, 85); + categoryLabel.setLayoutData(categoryLabelLData); + } + { + albumLabel = new CLabel(changeComposite,SWT.NONE); + albumLabel.setText("Album"); + FormData albumLabelLData = new FormData(); + albumLabelLData.width = 60; + albumLabelLData.height = 21; + albumLabelLData.left = new FormAttachment(0, 1000, 20); + albumLabelLData.top = new FormAttachment(0, 1000, 65); + albumLabel.setLayoutData(albumLabelLData); + } + { + authorLabel = new CLabel(changeComposite,SWT.NONE); + authorLabel.setText("Author:"); + FormData authorLabelLData = new FormData(); + authorLabelLData.width = 60; + authorLabelLData.height = 21; + authorLabelLData.left = new FormAttachment(0, 1000, 20); + authorLabelLData.top = new FormAttachment(0, 1000, 45); + authorLabel.setLayoutData(authorLabelLData); + } + { + titleLabel = new CLabel(changeComposite,SWT.NONE); + titleLabel.setText("Title:"); + FormData cLabel1LData1 = new FormData(); + cLabel1LData1.width = 60; + cLabel1LData1.height = 21; + cLabel1LData1.left = new FormAttachment(0, 1000, 20); + cLabel1LData1.top = new FormAttachment(0, 1000, 25); + titleLabel.setLayoutData(cLabel1LData1); + } + { + type = new CCombo(changeComposite,SWT.NONE); + FormData typeLData = new FormData(); + typeLData.width = 111; + typeLData.height = 16; + typeLData.left = new FormAttachment(0, 1000, 100); + typeLData.top = new FormAttachment(0, 1000, 290); + type.setLayoutData(typeLData); + type.setCursor(SWTResourceManager.getCursor(SWT.CURSOR_HAND)); + { + type.add("audio"); + type.add("video"); + } + } + { + name = new Text(changeComposite,SWT.NONE); + FormData nameLData = new FormData(); + nameLData.width = 124; + nameLData.height = 14; + nameLData.left = new FormAttachment(0, 1000, 100); + nameLData.top = new FormAttachment(0, 1000, 270); + name.setLayoutData(nameLData); + name.setEditable(false); + } + { + path = new Text(changeComposite,SWT.NONE); + FormData pathLData = new FormData(); + pathLData.width = 124; + pathLData.height = 14; + pathLData.left = new FormAttachment(0, 1000, 100); + pathLData.top = new FormAttachment(0, 1000, 250); + path.setLayoutData(pathLData); + path.setEditable(false); + } + { + lastEdit = new Text(changeComposite,SWT.NONE); + FormData lastEditLData = new FormData(); + lastEditLData.width = 124; + lastEditLData.height = 14; + lastEditLData.left = new FormAttachment(0, 1000, 100); + lastEditLData.top = new FormAttachment(0, 1000, 230); + lastEdit.setLayoutData(lastEditLData); + lastEdit.setEditable(false); + } + { + ownerId = new Text(changeComposite,SWT.NONE); + FormData ownerIdLData = new FormData(); + ownerIdLData.width = 124; + ownerIdLData.height = 14; + ownerIdLData.left = new FormAttachment(0, 1000, 100); + ownerIdLData.top = new FormAttachment(0, 1000, 210); + ownerId.setLayoutData(ownerIdLData); + ownerId.setEditable(false); + } + { + resolution = new Text(changeComposite,SWT.NONE); + FormData resolutionLData = new FormData(); + resolutionLData.width = 124; + resolutionLData.height = 14; + resolutionLData.left = new FormAttachment(0, 1000, 100); + resolutionLData.top = new FormAttachment(0, 1000, 190); + resolution.setLayoutData(resolutionLData); + } + { + vBitrate = new Text(changeComposite,SWT.NONE); + FormData vBitrateLData = new FormData(); + vBitrateLData.width = 124; + vBitrateLData.height = 14; + vBitrateLData.left = new FormAttachment(0, 1000, 100); + vBitrateLData.top = new FormAttachment(0, 1000, 170); + vBitrate.setLayoutData(vBitrateLData); + } + { + aBitrate = new Text(changeComposite,SWT.NONE); + FormData aBitrateLData = new FormData(); + aBitrateLData.width = 124; + aBitrateLData.height = 14; + aBitrateLData.left = new FormAttachment(0, 1000, 100); + aBitrateLData.top = new FormAttachment(0, 1000, 150); + aBitrate.setLayoutData(aBitrateLData); + } + { + duration = new Text(changeComposite,SWT.NONE); + FormData durationLData = new FormData(); + durationLData.width = 124; + durationLData.height = 14; + durationLData.left = new FormAttachment(0, 1000, 100); + durationLData.top = new FormAttachment(0, 1000, 130); + duration.setLayoutData(durationLData); + } + { + year = new Text(changeComposite,SWT.NONE); + FormData yearLData = new FormData(); + yearLData.width = 124; + yearLData.height = 14; + yearLData.left = new FormAttachment(0, 1000, 100); + yearLData.top = new FormAttachment(0, 1000, 110); + year.setLayoutData(yearLData); + } + { + category = new Text(changeComposite,SWT.NONE); + FormData categoryLData = new FormData(); + categoryLData.width = 124; + categoryLData.height = 14; + categoryLData.left = new FormAttachment(0, 1000, 100); + categoryLData.top = new FormAttachment(0, 1000, 90); + category.setLayoutData(categoryLData); + category.setCursor(SWTResourceManager.getCursor(SWT.CURSOR_WAIT)); + } + { + album = new Text(changeComposite,SWT.NONE); + FormData albumLData = new FormData(); + albumLData.width = 124; + albumLData.height = 14; + albumLData.left = new FormAttachment(0, 1000, 100); + albumLData.top = new FormAttachment(0, 1000, 70); + album.setLayoutData(albumLData); + } + { + author = new Text(changeComposite,SWT.NONE); + FormData authorLData = new FormData(); + authorLData.width = 124; + authorLData.height = 14; + authorLData.left = new FormAttachment(0, 1000, 100); + authorLData.top = new FormAttachment(0, 1000, 50); + author.setLayoutData(authorLData); + } + { + title = new Text(changeComposite,SWT.NONE); + FormData titleLData = new FormData(); + titleLData.width = 124; + titleLData.height = 13; + titleLData.top = new FormAttachment(0, 1000, 30); + titleLData.left = new FormAttachment(0, 1000, 100); + title.setLayoutData(titleLData); + } + } + } + { + composite3 = new Composite(container2,SWT.NONE); + FormLayout composite3Layout = new FormLayout(); + composite3.setLayout(composite3Layout); + GridData composite3LData = new GridData(); + composite3LData.widthHint = 777; + composite3LData.heightHint = 58; + composite3.setLayoutData(composite3LData); + { + deleteButton = new Button(composite3,SWT.PUSH | SWT.CENTER); + deleteButton.setText("Delete"); + deleteButton.setVisible(false); + FormData deleteButtonLData = new FormData(); + deleteButtonLData.width = 150; + deleteButtonLData.height = 30; + deleteButtonLData.left = new FormAttachment(0, 1000, 470); + deleteButtonLData.top = new FormAttachment(0, 1000, 15); + deleteButton.setLayoutData(deleteButtonLData); + deleteButton.setToolTipText("delete File from Database"); + deleteButton.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent evt) { + deleteButtonWidgetSelected(evt); + } + }); + } + { + addButton = new Button(composite3,SWT.PUSH | SWT.CENTER); + addButton.setText("Add"); + FormData addButtonLData = new FormData(); + addButtonLData.width = 150; + addButtonLData.height = 30; + addButtonLData.left = new FormAttachment(0, 1000, 160); + addButtonLData.top = new FormAttachment(0, 1000, 15); + addButton.setLayoutData(addButtonLData); + addButton.setToolTipText("add new Files to Database"); + addButton.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent evt) { + addButtonWidgetSelected(evt); + } + }); + } + } + } + } + { + tab3 = new CTabItem(cTabFolder1,SWT.NONE); + tab3.setText("Server"); + { + container3 = new Composite(cTabFolder1,SWT.NONE); + GridLayout container3Layout = new GridLayout(); + container3Layout.makeColumnsEqualWidth = true; + container3Layout.numColumns=2; + container3Layout.verticalSpacing = 0; + container3Layout.horizontalSpacing = 5; + container3.setLayout(container3Layout); + tab3.setControl(container3); + { + tab3Group1 = new Group(container3,SWT.NONE); + FormLayout tab3Group1Layout = new FormLayout(); + tab3Group1.setLayout(tab3Group1Layout); + GridData tab3Group1LData = new GridData(); + tab3Group1LData.widthHint = 500; + tab3Group1LData.heightHint = 129; + tab3Group1LData.horizontalAlignment = GridData.CENTER; + tab3Group1.setLayoutData(tab3Group1LData); + { + composite4 = new Composite(tab3Group1, SWT.NONE); + FormLayout composite4Layout = new FormLayout(); + composite4.setLayout(composite4Layout); + FormData composite4LData = new FormData(); + composite4LData.width = 504; + composite4LData.height = 140; + composite4LData.left = new FormAttachment(0, 1000, -3); + composite4LData.top = new FormAttachment(0, 1000, -6); + composite4.setLayoutData(composite4LData); + { + actualStreamLabel2 = new CLabel( + composite4, + SWT.NONE); + FormData actualStreamLabel2LData = new FormData(); + actualStreamLabel2LData.width = 98; + actualStreamLabel2LData.height = 21; + actualStreamLabel2LData.left = new FormAttachment(0, 1000, 180); + actualStreamLabel2LData.top = new FormAttachment(0, 1000, 65); + actualStreamLabel2.setLayoutData(actualStreamLabel2LData); + actualStreamLabel2.setFont(SWTResourceManager.getFont("Times", 8, 1, false, false)); + } + { + actualStreamLabel1 = new CLabel( + composite4, + SWT.NONE); + actualStreamLabel1.setText("Actual Number of Streams:"); + FormData actualStreamLabel1LData = new FormData(); + actualStreamLabel1LData.width = 160; + actualStreamLabel1LData.height = 21; + actualStreamLabel1LData.left = new FormAttachment(0, 1000, 14); + actualStreamLabel1LData.top = new FormAttachment(0, 1000, 65); + actualStreamLabel1.setLayoutData(actualStreamLabel1LData); + actualStreamLabel1.setFont(SWTResourceManager.getFont("Times", 8, 1, false, false)); + } + { + streamLabel2 = new CLabel( + composite4, + SWT.None); + FormData streamLabel2LData = new FormData(); + streamLabel2LData.width = 98; + streamLabel2LData.height = 21; + streamLabel2LData.left = new FormAttachment(0, 1000, 180); + streamLabel2LData.top = new FormAttachment(0, 1000, 40); + streamLabel2.setLayoutData(streamLabel2LData); + streamLabel2.setFont(SWTResourceManager.getFont("Times", 8, 1, false, false)); + } + { + streamLabel1 = new CLabel( + composite4, + SWT.NONE); + streamLabel1.setText("Total Number of Streams:"); + FormData streamLabel1LData = new FormData(); + streamLabel1LData.width = 150; + streamLabel1LData.height = 21; + streamLabel1LData.left = new FormAttachment(0, 1000, 14); + streamLabel1LData.top = new FormAttachment(0, 1000, 40); + streamLabel1.setLayoutData(streamLabel1LData); + streamLabel1.setFont(SWTResourceManager.getFont("Times", 8, 1, false, false)); + } + { + data2 = new CLabel(composite4, SWT.NONE); + FormData data2LData = new FormData(); + data2LData.width = 98; + data2LData.height = 21; + data2LData.left = new FormAttachment(0, 1000, 180); + data2LData.top = new FormAttachment(0, 1000, 15); + data2.setLayoutData(data2LData); + data2.setFont(SWTResourceManager.getFont("Times", 8, 1, false, false)); + } + { + data1 = new CLabel(composite4, SWT.NONE); + data1.setText("Total Data in Database:"); + FormData data1LData = new FormData(); + data1LData.width = 150; + data1LData.height = 21; + data1LData.left = new FormAttachment(0, 1000, 14); + data1LData.top = new FormAttachment(0, 1000, 15); + data1.setLayoutData(data1LData); + data1.setFont(SWTResourceManager.getFont("Times", 8, 1, false, false)); + } + { + shutdown = new Button(composite4, SWT.PUSH + | SWT.CENTER); + shutdown.setText("Shutdown"); + FormData shutdownLData = new FormData(); + shutdownLData.width = 77; + shutdownLData.height = 21; + shutdownLData.left = new FormAttachment(0, 1000, 35); + shutdownLData.top = new FormAttachment(0, 1000, 105); + shutdown.setLayoutData(shutdownLData); + shutdown.setToolTipText("Server shutdown"); + shutdown.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent evt) { + model.serverShutdown(); + } + }); + } + { + iptable = new Table(composite4, SWT.SINGLE); + FormData iptableLData = new FormData(); + iptableLData.width = 173; + iptableLData.height = 110; + iptableLData.left = new FormAttachment(0, 1000, 308); + iptableLData.top = new FormAttachment(0, 1000, 7); + iptable.setLayoutData(iptableLData); + iptable.setHeaderVisible(true); + iptable.setToolTipText("User online"); + { + userName = new TableColumn( + iptable, + SWT.CENTER); + userName.setText("Username"); + userName.setWidth(70); + } + { + ip = new TableColumn(iptable, SWT.BEGINNING); + ip.setText("Ip"); + ip.setWidth(119); + } + final int time = 1000; + final Runnable timer = new Runnable() { + public void run() { + refillIpTable(); + data2.setText("not supported in yalp2"); + streamLabel2.setText( /*new Integer(model.getAllStreamNum()).toString() */ "not supported in yalp2"); + display.timerExec(time, this); + actualStreamLabel2.setText( /*new Integer(model.getActualStreamNum()).toString()*/ "not supported in yalp2"); + } + }; + display.timerExec(time, timer); + } + } + } + { + tab3Group2 = new Group(container3,SWT.NONE); + this.logo(tab3Group2); + } + { + tab3Group3 = new Group(container3,SWT.NONE); + FormLayout tab3Group3Layout = new FormLayout(); + tab3Group3.setLayout(tab3Group3Layout); + GridData tab3Group3LData = new GridData(); + tab3Group3LData.widthHint = 500; + tab3Group3LData.heightHint = 284; + tab3Group3LData.horizontalAlignment = GridData.CENTER; + tab3Group3.setLayoutData(tab3Group3LData); + tab3Group3.setText("User Management"); + { + delete = new Button(tab3Group3,SWT.PUSH | SWT.CENTER); + delete.setText("Delete"); + FormData deleteLData = new FormData(); + deleteLData.width = 45; + deleteLData.height = 21; + deleteLData.left = new FormAttachment(0, 1000, 447); + deleteLData.top = new FormAttachment(0, 1000, 254); + delete.setLayoutData(deleteLData); + delete.setToolTipText("delete User"); + delete.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.DELETE); + while(UserTable.getItemCount()!=0){ + UserTable.remove(0); + } + ArrayList<YalpUser> 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<YalpUser> 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<YalpUser> 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<YalpUser> 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<resultTable1.getSelectionCount();i++){ + int id=new Integer(resultTable1.getSelection()[i].getText(0)).intValue(); + System.out.println(resultTable1.getSelection()[i].getText(1)); + model.add2PlayList(id); + } + } + while(playlistTable.getItemCount()!=0){ + playlistTable.remove(0); + } + ArrayList<Media> playlist=model.getToPlaylist(); + for(int i=0;i<playlist.size();i++){ + Media result=playlist.get(i); + TableItem item = new TableItem(playlistTable,SWT.NONE); + item.setText(0,result.name); + item.setText(1,result.duration); + } + play.setEnabled(true); + if (playlistTable.getItemCount()>1&& !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<Media> playlist=model.getToPlaylist(); + for(int i=0;i<playlist.size();i++){ + Media result=playlist.get(i); + TableItem item = new TableItem(playlistTable,SWT.NONE); + item.setText(0,result.name); + item.setText(1,result.duration); + } + if (playlistTable.getItemCount()==0)play.setEnabled(false); + } + }); + } + { + playlistTable = new Table(playlistComposite,SWT.MULTI|SWT.FULL_SELECTION); + playlistTable.setHeaderVisible(true); + FormData playlistTableLData = new FormData(); + playlistTableLData.width = 184; + playlistTableLData.height = 330; + playlistTableLData.top = new FormAttachment(24, 1000, 0); + playlistTableLData.left = new FormAttachment(0, 1000, 38); + playlistTable.setLayoutData(playlistTableLData); + playlistTable.setToolTipText("Playlist"); + playlistTable.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent evt) { + if (isNotPlaying)del.setEnabled(true); + } + }); + TableColumn title = new TableColumn(playlistTable,SWT.LEFT); + title.setText("Title"); + title.setWidth(120); + title.setMoveable(true); + TableColumn duration = new TableColumn(playlistTable,SWT.RIGHT); + duration.setText("Duration"); + duration.setWidth(80); + duration.setMoveable(true); + } + } + } + } + } + this.layout(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + //TODO:start find + private void find(Group find,Composite resultComposite, Composite playlistComposite,Composite bottemComposite,int _tab){ + final Text searchField = new Text(find,SWT.NONE); + final Button findButton = new Button(find,SWT.PUSH | SWT.CENTER); + final Button allCheckBox = new Button(find,SWT.RADIO | SWT.LEFT); + final Button videoCheckBox = new Button(find,SWT.RADIO | SWT.LEFT); + final Button audioCheckBox = new Button(find,SWT.RADIO | SWT.LEFT); + final CLabel returnNum= new CLabel(find, SWT.NONE); + final int tab=_tab; + { + cLabel2 = new CLabel(find, SWT.NONE); + if (tab==1)cLabel2.setText("find and stream mutimedia files"); + else cLabel2.setText("find and manage mutimedia files"); + FormData cLabel2LData = new FormData(); + cLabel2LData.width = 250; + cLabel2LData.height = 21; + cLabel2LData.left = new FormAttachment(0,1000,46); + cLabel2LData.top = new FormAttachment(0,1000,13); + cLabel2.setLayoutData(cLabel2LData); + } + { + + FormData allCheckBoxLData = new FormData(); + allCheckBoxLData.left = new FormAttachment(0, 1000, 95); + allCheckBoxLData.top = new FormAttachment(0, 1000, 98); + allCheckBoxLData.width = 56; + allCheckBoxLData.height = 14; + allCheckBox.setLayoutData(allCheckBoxLData); + allCheckBox.setText("All"); + allCheckBox.setSelection(true); + allCheckBox.setToolTipText("Find Audio and Video Files"); + allCheckBox.addKeyListener(new KeyAdapter() { + public void keyPressed(KeyEvent evt) { + if (evt.character == SWT.CR) { + searchPressed( + searchField, + videoCheckBox, + audioCheckBox, + returnNum, + tab); + } + } + }); + } + { + + FormData audioCheckBoxLData = new FormData(); + audioCheckBoxLData.left = new FormAttachment(0, 1000, 195); + audioCheckBoxLData.top = new FormAttachment(0, 1000, 98); + audioCheckBoxLData.width = 56; + audioCheckBoxLData.height = 14; + audioCheckBox.setLayoutData(audioCheckBoxLData); + audioCheckBox.setText("Audio"); + audioCheckBox.setToolTipText("Find Audio Files"); + audioCheckBox + .addKeyListener(new KeyAdapter() { + public void keyPressed(KeyEvent evt) { + if (evt.character == SWT.CR) { + searchPressed( + searchField, + videoCheckBox, + audioCheckBox, + returnNum, + tab); + } + } + }); + } + { + + FormData videoCheckBoxLData = new FormData(); + videoCheckBoxLData.left = new FormAttachment(0, 1000, 296); + videoCheckBoxLData.top = new FormAttachment(0, 1000, 98); + videoCheckBoxLData.width = 56; + videoCheckBoxLData.height = 14; + videoCheckBox.setLayoutData(videoCheckBoxLData); + videoCheckBox.setText("Video"); + videoCheckBox.setToolTipText("Find Video Files"); + videoCheckBox + .addKeyListener(new KeyAdapter() { + public void keyPressed(KeyEvent evt) { + if (evt.character == SWT.CR) { + searchPressed( + searchField, + videoCheckBox, + audioCheckBox, + returnNum, + tab); + } + } + }); + } + + + FormLayout findLayout = new FormLayout(); + find.setLayout(findLayout); + GridData findLData = new GridData(); + findLData.widthHint = 497; + findLData.heightHint = 130; + find.setLayoutData(findLData); + find.setSize(497, 104); + find.addKeyListener(new KeyAdapter() { + public void keyPressed(KeyEvent evt) { + if (evt.character==SWT.CR){ + searchPressed(searchField,videoCheckBox,audioCheckBox,returnNum,tab); + } + } + }); + { + //searchField + FormData searchFieldLData = new FormData(); + searchFieldLData.width = 344; + searchFieldLData.height = 20; + searchFieldLData.left = new FormAttachment(0,1000,37); + searchFieldLData.top = new FormAttachment(0,1000,55); + searchField.setLayoutData(searchFieldLData); + searchField.setFont(SWTResourceManager.getFont("Times",12,0,false,false)); + searchField.setToolTipText("Keyword"); + searchField.addKeyListener(new KeyAdapter() { + public void keyPressed(KeyEvent evt) { + if (evt.character==SWT.CR){ + searchPressed(searchField,videoCheckBox,audioCheckBox,returnNum,tab); + } + } + }); + } + { + //findButton + findButton.setText("Find"); + FormData findButtonLData = new FormData(70,26); + findButtonLData.width = 70; + findButtonLData.height = 26; + findButtonLData.left = new FormAttachment(0,1000,403); + findButtonLData.top = new FormAttachment(0,1000,52); + findButton.setLayoutData(findButtonLData); + findButton.setSize(70, 26); + findButton.setToolTipText("Find"); + findButton.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent evt) { + add2.setEnabled(false); + searchPressed(searchField,videoCheckBox,audioCheckBox,returnNum,tab); + } + }); + } + { + returnNum.setText(""); + FormData returnNumLData = new FormData(); + returnNumLData.width = 63; + returnNumLData.height = 21; + returnNumLData.left = new FormAttachment(0, 1000, 410); + returnNumLData.top = new FormAttachment(0, 1000, 93); + returnNum.setLayoutData(returnNumLData); + } + } + + //TODO logo + private void logo(Group logo){ + FormLayout logoLayout = new FormLayout(); + logo.setLayout(logoLayout); + GridData logoLData = new GridData(); + logoLData.widthHint = 260; + logoLData.heightHint = 130; + logo.setLayoutData(logoLData); + logoLayout.marginWidth=30; + logoLayout.marginHeight=0; + { + cLabel2 = new CLabel(logo,SWT.NONE); + cLabel2.setImage(new Image(this.getDisplay(),"img/yalpV2.gif")); + } + + + + } + + + + //TODO resultComposite + private void resultTable(Composite resultComposite,Table resultTable,int tab){ + + resultComposite.setVisible(false); + FormLayout resultCompositeLayout = new FormLayout(); + resultComposite.setLayout(resultCompositeLayout); + GridData resultCompositeLData = new GridData(); + resultCompositeLData.widthHint = 502; + if (tab==1)resultCompositeLData.heightHint = 390; + else resultCompositeLData.heightHint = 380; + resultComposite.setLayoutData(resultCompositeLData); + { + FormData resultTableLData = new FormData(); + resultTableLData.width = 482; + if (tab==1)resultTableLData.height = 365; + else resultTableLData.height = 313; + resultTableLData.left = new FormAttachment(0, 1000, 0); + resultTableLData.top = new FormAttachment(0, 1000, 7); + resultTable.setLayoutData(resultTableLData); + resultTable.setHeaderVisible(true); + TableColumn id = new TableColumn(resultTable,SWT.RIGHT); + id.setText("ID"); + id.setWidth(0); + id.setMoveable(true); + id.addListener(SWT.Selection, new SortListener(this,resultTable,0,8)); + TableColumn title = new TableColumn(resultTable,SWT.LEFT); + title.setText("Title"); + title.setWidth(110); + title.setMoveable(true); + title.addListener(SWT.Selection, new SortListener(this,resultTable,1,8)); + TableColumn author = new TableColumn(resultTable,SWT.LEFT); + author.setText("Author"); + author.setWidth(100); + author.setMoveable(true); + author.addListener(SWT.Selection, new SortListener(this,resultTable,2,8)); + TableColumn album = new TableColumn(resultTable,SWT.LEFT); + album.setText("Album"); + album.setWidth(100); + album.setMoveable(true); + album.addListener(SWT.Selection, new SortListener(this,resultTable,3,8)); + TableColumn year = new TableColumn(resultTable,SWT.LEFT); + year.setText("Year"); + year.setWidth(60); + year.setMoveable(true); + year.addListener(SWT.Selection, new SortListener(this,resultTable,4,8)); + TableColumn category = new TableColumn(resultTable,SWT.LEFT); + category.setText("Category"); + category.setWidth(60); + category.setMoveable(true); + category.addListener(SWT.Selection, new SortListener(this,resultTable,5,8)); + TableColumn type = new TableColumn(resultTable,SWT.LEFT); + type.setText("Type"); + type.setWidth(60); + type.setMoveable(true); + type.addListener(SWT.Selection, new SortListener(this,resultTable,6,8)); + } + + } + private void saveButtonWidgetSelected(SelectionEvent evt) { + try{ + int OwnerId = model.getOwnerid(ownerId.getText()); + Media media = new Media(); + media.id = new Integer(id.getText()).intValue(); + media.name = title.getText(); + media.duration = duration.getText(); + media.lastEdit = new Date(System.currentTimeMillis()).toString(); + media.path = path.getText(); + media.fileName = name.getText(); + /* t.b.d. + author.getText(); + album.getText(); + category.getText(); + year.getText(); + new Integer(aBitrate.getText()).intValue(); + new Integer(vBitrate.getText()).intValue(); + resolution.getText(); + OwnerId; + */ + if (model.changeMedia(media, Action.EDIT)) { + int select=resultTable2.getSelectionIndex(); + TableItem item= new TableItem(resultTable2,SWT.NONE,select); + item.setText(0,new Integer(media.id).toString()); + item.setText(1,media.name); + /* t.b.d. read from string props + item.setText(2,media.author.name); + item.setText(3,media.album); + item.setText(4,media.year); + item.setText(5,media.category); + */ + item.setText(6,model.getTypeName(media.type)); + resultTable2.remove(select+1); + resultTable2.setSelection(select); + changeComposite.setVisible(false); + deleteButton.setVisible(false); + } + }catch (Exception e){ + System.out.println("Exception in SaveButton"+e); + } + } + + private void searchPressed(Text searchField,Button videoCheckBox,Button audioCheckBox,CLabel returnNum,int tab){ + String search = searchField.getText(); + int returnVal; + ArrayList<MediaType> types = new ArrayList<MediaType>(); + + 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); + ArrayList<Media>resultList = 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<ClientInfo> 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
- *
- * <em></em>
- *
- * @author Volker Dahnke / Manuel Traut
- *
- * @version 1 02-04-2006<br>
- *
- */
-
-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 + * + * <em></em> + * + * @author Volker Dahnke / Manuel Traut + * + * @version 1 02-04-2006<br> + * + */ + +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
- *
- * <em></em>
- *
- * @author Volker Dahnke / Manuel Traut
- *
- * @version 1 02-04-2006<br>
- */
-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 + * + * <em></em> + * + * @author Volker Dahnke / Manuel Traut + * + * @version 1 02-04-2006<br> + */ +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.
- * <P>
- * 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. + * <P> + * 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
- *
- * <em></em>
- *
- * @author Volker Dahnke / Manuel Traut
- *
- * @version 1 02-04-2006<br>
- */
-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<numColum;g++){
- values[g]= items[i].getText(g);
- }
- items[i].dispose();
- TableItem item = new TableItem(table, SWT.NONE, j);
- item.setText(values);
- items = table.getItems();
- break;
- }
- }
- }
- gui.changeComposite.setVisible(false);
- table.setSelection(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 java.text.Collator; +import java.util.Locale; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.*; + +/* + * Class SortListener + * + * <em></em> + * + * @author Volker Dahnke / Manuel Traut + * + * @version 1 02-04-2006<br> + */ +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<numColum;g++){ + values[g]= items[i].getText(g); + } + items[i].dispose(); + TableItem item = new TableItem(table, SWT.NONE, j); + item.setText(values); + items = table.getItems(); + break; + } + } + } + gui.changeComposite.setVisible(false); + table.setSelection(0); + } +} + diff --git a/src/YalpClients/SwtClient/GUI/StartDialog.java b/src/YalpClients/SwtClient/GUI/StartDialog.java index 11ecc7f..8f828f0 100644 --- a/src/YalpClients/SwtClient/GUI/StartDialog.java +++ b/src/YalpClients/SwtClient/GUI/StartDialog.java @@ -1,236 +1,236 @@ -/*
- * 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
- *
- * <em></em>
- *
- * @author Volker Dahnke / Manuel Traut
- *
- * @version 1 02-04-2006<br>
- */
-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 + * + * <em></em> + * + * @author Volker Dahnke / Manuel Traut + * + * @version 1 02-04-2006<br> + */ +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
- *
- * <em>Implementiert die Schnittstellenfunktionen zur Steuerung des Servers
- * (Datenbankinhalte schreiben, lesen; Streaming steuern</em>
- *
- * @author Volker Dahnke / Manuel Traut
- *
- * @version 0.6 14-12-2005<br>
- *
- * @see client.GUI
- */
-
-public class Model {
-
- public ServerControlInterface srvCon;
- private Process vlcPlayer;
- private Output actualStream = new Output();
- private Output streamInfo = new Output();
- private ArrayList<Media> findMedia = new ArrayList<Media>();
- private ArrayList<Media> editMedia = new ArrayList<Media>();
- private ArrayList<Media> toPlaylist = new ArrayList<Media>();
- private ArrayList<Media> playList = new ArrayList<Media>();
- private ArrayList<YalpUser> userList = new ArrayList<YalpUser>();
- 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<YalpUser>();
- this.playList = new ArrayList<Media>();
- this.toPlaylist = new ArrayList<Media>();
- }
-
-/*
- * 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<YalpUser> all registered YalpUsers
- */
- public ArrayList<YalpUser> getUser(){
- YalpErrorHolder err = new YalpErrorHolder();
- try{
- UsersHolder usr = new UsersHolder();
- this.srvCon.getUser(usr, err);
- this.userList = new ArrayList<YalpUser>(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<this.editMedia.size();i++){
- result=this.editMedia.get(i);
- /* t.b.d. alter to new db desgin
- if (result.id==media.id){
- result.type=media.type;
- result.title=media.title;
- result.author=media.author;
- result.album=media.album;
- result.category=media.category;
- result.year=media.year;
- result.duration=media.duration;
- result.aBitrate=media.aBitrate;
- result.vBitrate=media.vBitrate;
- result.resolution=media.resolution;
- result.ownerId=media.ownerId;
- result.lastEdit=media.lastEdit;
- result.path=media.path;
- result.name=media.name;
- return true;
- }
- */
- }
- }
- } catch(Exception e) {
- System.out.println("Exceoption in Model changeUser "+ e);
- }
- return false;
- }
-
-/*
- * adds Media with given id to Playlist
- *
- * @param id
- */
- public void add2PlayList(int id){
- Boolean notfound=true;
- for (int i=0;(i<this.findMedia.size())&& (notfound);i++){
- Media result=this.findMedia.get(i);
- if (result.id==id){
- String name = result.name;
- String path = result.path;
- if(playback){
- this.add2Stream(name, path);
- }
- this.playList.add(result);
- this.toPlaylist.add(result);
- notfound=false;
- }
- }
- }
-
-/*
- * Removes Media with given id from Playlist
- *
- * @param id
- */
- public void removeFromPlayList(int id){
- /* t.b.d.
- this.playList.remItem(id);
- this.toPlaylist.remove(id);
- */
- }
-
-/*
- * Returns List with items to play
- *
- * @return ArrayList<Media>: ArrayList to create Playlist from
- */
- public ArrayList<Media> 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<MediaType> 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<Media>: last found medias
- */
-
- public ArrayList<Media> 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<Media> resultList;
- if (kind==1)resultList= this.findMedia;
- else resultList=this.editMedia;
- for (int i=0;(i<resultList.size());i++){
- Media result=resultList.get(i);
- if (result.id==id){
- return result;
- }
- }
- return null;
- }
-
-/*
- * Retuns id of YalpUser with given username
- *
- * @param username
- * @return int: useriD
- */
- public int getOwnerid(String username){
- ArrayList<YalpUser> 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 + * + * <em>Implementiert die Schnittstellenfunktionen zur Steuerung des Servers + * (Datenbankinhalte schreiben, lesen; Streaming steuern</em> + * + * @author Volker Dahnke / Manuel Traut + * + * @version 0.6 14-12-2005<br> + * + * @see client.GUI + */ + +public class Model { + + public ServerControlInterface srvCon; + private Process vlcPlayer; + private Output actualStream = new Output(); + private Output streamInfo = new Output(); + private ArrayList<Media> findMedia = new ArrayList<Media>(); + private ArrayList<Media> editMedia = new ArrayList<Media>(); + private ArrayList<Media> toPlaylist = new ArrayList<Media>(); + private ArrayList<Media> playList = new ArrayList<Media>(); + private ArrayList<YalpUser> userList = new ArrayList<YalpUser>(); + 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<YalpUser>(); + this.playList = new ArrayList<Media>(); + this.toPlaylist = new ArrayList<Media>(); + } + +/* + * 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<YalpUser> all registered YalpUsers + */ + public ArrayList<YalpUser> getUser(){ + YalpErrorHolder err = new YalpErrorHolder(); + try{ + UsersHolder usr = new UsersHolder(); + this.srvCon.getUser(usr, err); + this.userList = new ArrayList<YalpUser>(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<this.editMedia.size();i++){ + result=this.editMedia.get(i); + /* t.b.d. alter to new db desgin + if (result.id==media.id){ + result.type=media.type; + result.title=media.title; + result.author=media.author; + result.album=media.album; + result.category=media.category; + result.year=media.year; + result.duration=media.duration; + result.aBitrate=media.aBitrate; + result.vBitrate=media.vBitrate; + result.resolution=media.resolution; + result.ownerId=media.ownerId; + result.lastEdit=media.lastEdit; + result.path=media.path; + result.name=media.name; + return true; + } + */ + } + } + } catch(Exception e) { + System.out.println("Exceoption in Model changeUser "+ e); + } + return false; + } + +/* + * adds Media with given id to Playlist + * + * @param id + */ + public void add2PlayList(int id){ + Boolean notfound=true; + for (int i=0;(i<this.findMedia.size())&& (notfound);i++){ + Media result=this.findMedia.get(i); + if (result.id==id){ + String name = result.name; + String path = result.path; + if(playback){ + this.add2Stream(name, path); + } + this.playList.add(result); + this.toPlaylist.add(result); + notfound=false; + } + } + } + +/* + * Removes Media with given id from Playlist + * + * @param id + */ + public void removeFromPlayList(int id){ + /* t.b.d. + this.playList.remItem(id); + this.toPlaylist.remove(id); + */ + } + +/* + * Returns List with items to play + * + * @return ArrayList<Media>: ArrayList to create Playlist from + */ + public ArrayList<Media> 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<MediaType> 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<Media>: last found medias + */ + + public ArrayList<Media> 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<Media> resultList; + if (kind==1)resultList= this.findMedia; + else resultList=this.editMedia; + for (int i=0;(i<resultList.size());i++){ + Media result=resultList.get(i); + if (result.id==id){ + return result; + } + } + return null; + } + +/* + * Retuns id of YalpUser with given username + * + * @param username + * @return int: useriD + */ + public int getOwnerid(String username){ + ArrayList<YalpUser> 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
- *
- * <em>static main method</em>
- *
- * @author Volker Dahnke / Manuel Traut
- *
- * @version 0.1 20-11-2005<br>
- */
-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 + * + * <em>static main method</em> + * + * @author Volker Dahnke / Manuel Traut + * + * @version 0.1 20-11-2005<br> + */ +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/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 @@ +<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + x:Class="VideoPlayer.App" + > + <Application.Resources> + + </Application.Resources> +</Application> 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 @@ +//------------------------------------------------------------------------------ +// <auto-generated> +// 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. +// </auto-generated> +//------------------------------------------------------------------------------ + +namespace TwitterSearchApplication.Web { + + + public partial class _Default { + + /// <summary> + /// form1-Steuerelement + /// </summary> + /// <remarks> + /// Automatisch generiertes Feld + /// Um dies zu ändern, verschieben Sie die Felddeklaration aus der Designerdatei in eine Code-Behind-Datei. + /// </remarks> + protected global::System.Web.UI.HtmlControls.HtmlForm form1; + + /// <summary> + /// Checkbox1-Steuerelement + /// </summary> + /// <remarks> + /// Automatisch generiertes Feld + /// Um dies zu ändern, verschieben Sie die Felddeklaration aus der Designerdatei in eine Code-Behind-Datei. + /// </remarks> + protected global::System.Web.UI.WebControls.CheckBox Checkbox1; + + /// <summary> + /// Button1-Steuerelement + /// </summary> + /// <remarks> + /// Automatisch generiertes Feld + /// Um dies zu ändern, verschieben Sie die Felddeklaration aus der Designerdatei in eine Code-Behind-Datei. + /// </remarks> + protected global::System.Web.UI.WebControls.Button Button1; + + /// <summary> + /// TextBox1-Steuerelement + /// </summary> + /// <remarks> + /// Automatisch generiertes Feld + /// Um dies zu ändern, verschieben Sie die Felddeklaration aus der Designerdatei in eine Code-Behind-Datei. + /// </remarks> + protected global::System.Web.UI.WebControls.TextBox TextBox1; + + /// <summary> + /// TextBox2-Steuerelement + /// </summary> + /// <remarks> + /// Automatisch generiertes Feld + /// Um dies zu ändern, verschieben Sie die Felddeklaration aus der Designerdatei in eine Code-Behind-Datei. + /// </remarks> + protected global::System.Web.UI.WebControls.TextBox TextBox2; + + /// <summary> + /// RadioButton1-Steuerelement + /// </summary> + /// <remarks> + /// Automatisch generiertes Feld + /// Um dies zu ändern, verschieben Sie die Felddeklaration aus der Designerdatei in eine Code-Behind-Datei. + /// </remarks> + 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 @@ +<UserControl xmlns:chartingToolkit="clr-namespace:System.Windows.Controls.DataVisualization.Charting;assembly=System.Windows.Controls.DataVisualization.Toolkit" x:Class="VideoPlayer.MainPage" + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:vsm="clr-namespace:System.Windows;assembly=System.Windows" + mc:Ignorable="d" + Width="Auto" Height="Auto"> + + <UserControl.Resources> + <Style x:Key="roundThumbStyle" TargetType="Thumb"> + <Setter Property="Template"> + <Setter.Value> + <ControlTemplate TargetType="Thumb"> + <Ellipse Stroke="#FFFFFFFF" StrokeThickness="2" Fill="#FF484848"/> + </ControlTemplate> + </Setter.Value> + </Setter> + </Style> + <Grid x:Name="grid" Background="Transparent"> + + </Grid> + <Style x:Key="SliderStyle" TargetType="Slider"> + <Setter Property="Template"> + <Setter.Value> + <ControlTemplate TargetType="Slider"> + <Grid x:Name="Root" Background="Transparent"> + <Grid.Resources> + <ControlTemplate x:Key="RightRepeatButtonTemplate"> + <Rectangle Height="6" Margin="-5,0,0,0" Grid.Column="0" Grid.ColumnSpan="3" + StrokeThickness="0.5" RadiusY="3.5" RadiusX="3.5" Fill="#FF484848"/> + </ControlTemplate> + <ControlTemplate x:Key="LeftRepeatButtonTemplate"> + <Rectangle Height="6" Margin="0,0,-5,0" Grid.Column="0" Grid.ColumnSpan="3" + StrokeThickness="0.5" RadiusY="3.5" RadiusX="3.5" Fill="#FF7F7F7F"/> + </ControlTemplate> + </Grid.Resources> + <Grid x:Name="HorizontalTemplate"> + <Grid.ColumnDefinitions> + <ColumnDefinition Width="Auto"/> + <ColumnDefinition Width="Auto"/> + <ColumnDefinition Width="*"/> + </Grid.ColumnDefinitions> + + <RepeatButton x:Name="HorizontalTrackLargeChangeDecreaseRepeatButton" Grid.Column="0" + IsTabStop="False" Template="{StaticResource LeftRepeatButtonTemplate}"/> + <Rectangle x:Name="LeftTrack" Grid.Row="1" Fill="#00FFFFFF" Cursor="Hand" MouseLeftButtonDown="LeftTrack_MouseLeftButtonDown"/> + <Thumb Background="#00FFFFFF" Height="10" x:Name="HorizontalThumb" Width="10" + Grid.Column="1" Style="{StaticResource roundThumbStyle}" HorizontalAlignment="Left" + DragStarted="HorizontalThumb_DragStarted" DragCompleted="HorizontalThumb_DragCompleted" + Canvas.ZIndex="1"/> + <RepeatButton x:Name="HorizontalTrackLargeChangeIncreaseRepeatButton" Grid.Column="2" + IsTabStop="False" Template="{StaticResource RightRepeatButtonTemplate}"/> + <Rectangle x:Name="RightTrack" Grid.Column="2" Grid.Row="1" Fill="#00FFFFFF" Cursor="Hand" MouseLeftButtonDown="LeftTrack_MouseLeftButtonDown"/> + </Grid> + </Grid> + </ControlTemplate> + </Setter.Value> + </Setter> + </Style> + + <ControlTemplate x:Key="PlayButtonTemplate" TargetType="ToggleButton"> + <Grid x:Name="grid" Background="Transparent"> + <vsm:VisualStateManager.VisualStateGroups> + <vsm:VisualStateGroup x:Name="FocusStates"> + <vsm:VisualState x:Name="Focused"> + <Storyboard> + </Storyboard> + </vsm:VisualState> + <vsm:VisualState x:Name="Unfocused"> + <Storyboard/> + </vsm:VisualState> + </vsm:VisualStateGroup> + <vsm:VisualStateGroup x:Name="CommonStates"> + <vsm:VisualState x:Name="Normal"> + <Storyboard/> + </vsm:VisualState> + <vsm:VisualState x:Name="MouseOver"> + <Storyboard> + </Storyboard> + </vsm:VisualState> + <vsm:VisualState x:Name="Pressed"> + <Storyboard/> + </vsm:VisualState> + </vsm:VisualStateGroup> + <vsm:VisualStateGroup x:Name="CheckStates"> + <vsm:VisualState x:Name="Checked"> + <Storyboard> + <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000" + Storyboard.TargetName="playSymbol" + Storyboard.TargetProperty="(UIElement.Opacity)"> + <SplineDoubleKeyFrame KeyTime="00:00:00" Value="0"/> + </DoubleAnimationUsingKeyFrames> + <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000" + Storyboard.TargetName="pauseSymbol" + Storyboard.TargetProperty="(UIElement.Opacity)"> + <SplineDoubleKeyFrame KeyTime="00:00:00" Value="1"/> + </DoubleAnimationUsingKeyFrames> + </Storyboard> + </vsm:VisualState> + <vsm:VisualState x:Name="Unchecked"> + <Storyboard> + <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000" Storyboard.TargetName="pauseSymbol" Storyboard.TargetProperty="(UIElement.Opacity)"> + <SplineDoubleKeyFrame KeyTime="00:00:00" Value="0"/> + </DoubleAnimationUsingKeyFrames> + </Storyboard> + </vsm:VisualState> + </vsm:VisualStateGroup> + </vsm:VisualStateManager.VisualStateGroups> + <Grid Margin="11,3,0,0" HorizontalAlignment="Left" VerticalAlignment="Center" + Opacity="1" x:Name="playSymbol" Width="21" Height="22"> + <Path Width="14" Height="15" Stretch="Fill" Fill="#FF7F7F7F" + Data="F1 M 15.1997,22.542L 29.7776,14.89L 15.2707,6.99886L 15.1997,22.542 Z "/> + </Grid> + <Grid Margin="11,2,0,0" Opacity="0" x:Name="pauseSymbol" Width="31" Height="15"> + <Rectangle Stretch="Fill" Fill="#FF7F7F7F" HorizontalAlignment="Left" + Margin="0,0,0,0" Width="6"/> + <Rectangle Stretch="Fill" Fill="#FF7F7F7F" HorizontalAlignment="Stretch" + Margin="6,0,13,0" Width="6"/> + </Grid> + </Grid> + </ControlTemplate> + + <ControlTemplate x:Key="MuteButtonTemplate" TargetType="ToggleButton"> + <Grid Background="Transparent" Cursor="Hand"> + <vsm:VisualStateManager.VisualStateGroups> + <vsm:VisualStateGroup x:Name="FocusStates"> + <vsm:VisualState x:Name="Focused"> + <Storyboard> + </Storyboard> + </vsm:VisualState> + <vsm:VisualState x:Name="Unfocused"> + <Storyboard/> + </vsm:VisualState> + </vsm:VisualStateGroup> + <vsm:VisualStateGroup x:Name="CommonStates"> + <vsm:VisualState x:Name="Normal"> + <Storyboard/> + </vsm:VisualState> + <vsm:VisualState x:Name="MouseOver"> + <Storyboard> + </Storyboard> + </vsm:VisualState> + <vsm:VisualState x:Name="Pressed"> + <Storyboard/> + </vsm:VisualState> + </vsm:VisualStateGroup> + <vsm:VisualStateGroup x:Name="CheckStates"> + <vsm:VisualState x:Name="Checked"> + <Storyboard> + <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000" + Storyboard.TargetName="volumeSymbol" + Storyboard.TargetProperty="(UIElement.Opacity)"> + <SplineDoubleKeyFrame KeyTime="00:00:00" Value="0"/> + </DoubleAnimationUsingKeyFrames> + </Storyboard> + </vsm:VisualState> + <vsm:VisualState x:Name="Unchecked"> + <Storyboard> + <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000" + Storyboard.TargetName="volumeSymbol" + Storyboard.TargetProperty="(UIElement.Opacity)"> + <SplineDoubleKeyFrame KeyTime="00:00:00" Value="1"/> + </DoubleAnimationUsingKeyFrames> + </Storyboard> + </vsm:VisualState> + </vsm:VisualStateGroup> + </vsm:VisualStateManager.VisualStateGroups> + <Grid HorizontalAlignment="Left" VerticalAlignment="Top" + Width="17"> + <Path HorizontalAlignment="Left" Stretch="Fill" + Fill="#FF7F7F7F" Data="F1 M 23.1457,26.5056L 23.1457,33.8944L 25.7913,33.8944L 28.8235,37.4722L 30.5346,37.4722L 30.5665,23.0833L 28.8995,23.0833L 25.8679,26.5056L 23.1457,26.5056 Z " + Width="7.421" Height="14.389" UseLayoutRounding="False" + Margin="0,6.5,0,6.5"/> + + <Grid HorizontalAlignment="Right" Width="7.003" x:Name="volumeSymbol" + Height="27"> + <Path HorizontalAlignment="Right" VerticalAlignment="Stretch" + Width="2.398" + Data="M0.5,0.5 C0.5,0.5 2.5939558,2.7128265 2.5946648,7.0504856 C2.5953746,11.391507 0.50033337,13.889001 0.50033337,13.889001" + Stretch="Fill" Stroke="#FF7F7F7F" Margin="0,0,-0.398,0" UseLayoutRounding="False"/> + <Path HorizontalAlignment="Stretch" Margin="2.4,2.384,2.317,1.584" VerticalAlignment="Stretch" + Data="M0.5,0.50000006 C0.5,0.50000006 1.4786903,2.1275051 1.4781417,4.9569001 C1.4776551,7.4670725 0.35717732,9.892808 0.35717732,9.892808" Stretch="Fill" Stroke="#FF7F7F7F" UseLayoutRounding="False"/> + <Path HorizontalAlignment="Left" Margin="0,4.36,0,3.46" VerticalAlignment="Stretch" Width="1.542" + Data="M0.5,0.5 C0.5,0.5 1.0412779,1.4903735 1.042276,3.1459465 C1.0429831,4.3189368 0.66544437,6.0685911 0.66544437,6.0685911" Stretch="Fill" Stroke="#FF7F7F7F" d:LayoutOverrides="Width"/> + </Grid> + </Grid> + </Grid> + </ControlTemplate> + + <ControlTemplate x:Key="ButtonTemplate" TargetType="Button"> + <Grid Background="Transparent"> + <ContentPresenter Width="Auto"/> + </Grid> + </ControlTemplate> + </UserControl.Resources> + + <Border x:Name="layoutRoot" Background="#FF000000"> + <Grid HorizontalAlignment="Center" VerticalAlignment="Center"> + <Grid.RowDefinitions> + <RowDefinition Height="auto" x:Name="VideoRow"/> + <RowDefinition Height="auto"/> + </Grid.RowDefinitions> + <Grid.ColumnDefinitions> + <ColumnDefinition Width="auto" x:Name="VideoColumn"/> + </Grid.ColumnDefinitions> + + <MediaElement x:Name="mediaElement" AutoPlay="False" Stretch="Uniform" + MediaOpened="MediaElement_MediaOpened" + CacheMode="BitmapCache" + Grid.Row="0" Height="auto" Width="auto"/> + + <Button x:Name="bigPlayButton" Template="{StaticResource ButtonTemplate}" + Click="BigPlayButton_Click" Grid.Row="0" > + <Canvas Width="100" Height="100"> + <Path Width="100" Height="100" Canvas.Left="0" Canvas.Top="0" Stretch="Fill" + Fill="#77000000" Data="F1 M 15,0L 85,0C 93.2843,0 100,6.71573 100,15L 100,85C 100,93.2843 93.2843,100 85,100L 15,100C 6.71573,100 0,93.2843 0,85L 0,15C 0,6.71573 6.71573,0 15,0 Z "/> + <Path Width="40.8182" Height="47.1328" Canvas.Left="34.6439" + Canvas.Top="27.6003" Stretch="Fill" Fill="#FFFFFFFF" + Data="F1 M 75.4621,51.1667L 34.6439,27.6003L 34.6439,74.7331L 75.4621,51.1667 Z "/> + </Canvas> + </Button> + + <Grid x:Name="transportControls" VerticalAlignment="Bottom" Height="40" Background="#FF000000" + Grid.Row="1" > + <Grid.ColumnDefinitions> + <ColumnDefinition Width="Auto" /> + <ColumnDefinition Width="*" /> + <ColumnDefinition Width="0" /> + <ColumnDefinition Width="Auto" /> + <ColumnDefinition Width="Auto" MinWidth="10" /> + <ColumnDefinition Width="Auto" MinWidth="10" /> + </Grid.ColumnDefinitions> + + <!-- play symbol showing is checked = false, Pause symbol showing is checked = true--> + <ToggleButton x:Name="playPauseButton" Template="{StaticResource PlayButtonTemplate}" + Click="PlayPauseButton_Click" IsChecked="false"/> + + <Grid x:Name="time" Grid.Column="1" HorizontalAlignment="Stretch" VerticalAlignment="Center"> + <Grid.ColumnDefinitions> + <ColumnDefinition Width="*" /> + <ColumnDefinition Width="40" /> + <ColumnDefinition Width="10" /> + <ColumnDefinition Width="40" /> + </Grid.ColumnDefinitions> + + <Slider x:Name="timelineSlider" Margin="0,1.5,0,0" HorizontalAlignment="Stretch" + Maximum="1" Style="{StaticResource SliderStyle}" Grid.Column="0" + ValueChanged="TimelineSlider_ValueChanged" + Value="0"/> + <TextBlock x:Name="currentTimeTextBlock" Margin="0,1.5,0,0" Height="12" + FontFamily="Verdana" FontSize="10" Text="00:00" TextWrapping="Wrap" + Foreground="#FFFFFFFF" FontStyle="Normal" HorizontalAlignment="Right" + TextAlignment="Right" Grid.Column="1"/> + <TextBlock Margin="0,1.5,0,0" Height="12" FontFamily="Verdana" FontSize="10" + Text="/" TextWrapping="Wrap" Foreground="#FFFFFFFF" + FontStyle="Normal" HorizontalAlignment="Center" TextAlignment="Right" + Grid.Column="2"/> + <TextBlock x:Name="totalTimeTextBlock" Margin="0,1.5,0,0" Height="12" + FontFamily="Verdana" FontSize="10" Text="00:00" TextWrapping="Wrap" + Foreground="#FFFFFFFF" FontStyle="Normal" HorizontalAlignment="Left" + TextAlignment="Right" Grid.Column="3"/> + </Grid> + + <ToggleButton IsChecked="false" Grid.Column="3" x:Name="muteButton" + Template="{StaticResource MuteButtonTemplate}" Click="MuteButton_Click" + VerticalAlignment="Center" Margin="0,0,6,0"/> + + <Slider Grid.Column="4" HorizontalAlignment="Stretch" Margin="3,0,0,0" + VerticalAlignment="Center" Maximum="1" x:Name="volumeSlider" + Background="#FF777777" Style="{StaticResource SliderStyle}" Width="50" + Value="{Binding ElementName=mediaElement, Mode=TwoWay, Path=Volume, UpdateSourceTrigger=Default}"/> + + <Button x:Name="fullScreenButton" Grid.Column="5" Margin="8,10,4,10" Click="FullScreenButton_Click" + Template="{StaticResource ButtonTemplate}" VerticalAlignment="Center"> + <Path Height="14.375" HorizontalAlignment="Stretch" + VerticalAlignment="Bottom" RenderTransformOrigin="0.212389379739761,0.208695650100708" + Data="M10.181361,8.375 L12.844413,11.008244 L14.125,9.7418737 L14.125,14.375 L9.675765,14.374833 L10.906104,13.158273 L8.125,10.408315 L10.181361,8.375 z M3.9666855,8.375 L6,10.431361 L3.3667567,13.094413 L4.6331258,14.375 L0,14.375 L0.00016707927,9.925765 L1.2167276,11.156104 L3.9666855,8.375 z M9.4918737,0 L14.125,0 L14.124833,4.449235 L12.908273,3.2188957 L10.158315,6 L8.125,3.943639 L10.758244,1.2805867 L9.4918737,0 z M0,0 L4.449235,0.00016686507 L3.2188957,1.2167276 L6,3.9666855 L3.943639,6 L1.280587,3.3667567 L0,4.6331258 L0,0 z" + Fill="#FF7F7F7F" Stretch="Fill" Stroke="#FF000000" StrokeThickness="0" /> + </Button> + </Grid> + </Grid> + </Border> +</UserControl>
\ 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 + // <asp:Silverlight> element. If hosting Silverlight from .html, add + // <param name="enableGPUAcceleration" value="true" /> under the <object> 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<double> 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 @@ +<Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" +> + <Deployment.Parts> + </Deployment.Parts> + + <!-- Uncomment the markup and update the fields below to make your application offline enabled + <Deployment.ApplicationIdentity> + <ApplicationIdentity + ShortName="Out of Browser Silverlight Application" + Title="Window Title of Your Silverlight Application"> + <ApplicationIdentity.Blurb>Description of your Silverlight application</ApplicationIdentity.Blurb> + </ApplicationIdentity> + </Deployment.ApplicationIdentity> + --> +</Deployment> 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 @@ +<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <PropertyGroup> + <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> + <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> + <ProductVersion>9.0.30729</ProductVersion> + <SchemaVersion>2.0</SchemaVersion> + <ProjectGuid>{9254F122-1734-4DEC-9859-49C16D114EBA}</ProjectGuid> + <ProjectTypeGuids>{A1591282-1198-4647-A2B1-27E5FF5F6F3B};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids> + <OutputType>Library</OutputType> + <AppDesignerFolder>Properties</AppDesignerFolder> + <RootNamespace>VideoPlayer</RootNamespace> + <AssemblyName>VideoPlayer</AssemblyName> + <TargetFrameworkVersion>v3.5</TargetFrameworkVersion> + <SilverlightApplication>true</SilverlightApplication> + <SupportedCultures> + </SupportedCultures> + <XapOutputs>true</XapOutputs> + <GenerateSilverlightManifest>true</GenerateSilverlightManifest> + <XapFilename>VideoPlayer.xap</XapFilename> + <SilverlightManifestTemplate>Properties\AppManifest.xml</SilverlightManifestTemplate> + <SilverlightAppEntry>VideoPlayer.App</SilverlightAppEntry> + <TestPageFileName>TestPage.html</TestPageFileName> + <CreateTestPage>true</CreateTestPage> + <ValidateXaml>true</ValidateXaml> + <UsePlatformExtensions>false</UsePlatformExtensions> + <ThrowErrorsInValidation>true</ThrowErrorsInValidation> + <LinkedServerProject> + </LinkedServerProject> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> + <DebugSymbols>true</DebugSymbols> + <DebugType>full</DebugType> + <Optimize>false</Optimize> + <OutputPath>Bin\Debug</OutputPath> + <DefineConstants>DEBUG;TRACE;SILVERLIGHT</DefineConstants> + <NoStdLib>true</NoStdLib> + <NoConfig>true</NoConfig> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> + <DebugType>pdbonly</DebugType> + <Optimize>true</Optimize> + <OutputPath>Bin\Release</OutputPath> + <DefineConstants>TRACE;SILVERLIGHT</DefineConstants> + <NoStdLib>true</NoStdLib> + <NoConfig>true</NoConfig> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + </PropertyGroup> + <ItemGroup> + <Reference Include="System.Windows" /> + <Reference Include="mscorlib" /> + <Reference Include="system" /> + <Reference Include="System.Core" /> + <Reference Include="System.Net" /> + <Reference Include="System.Windows.Controls.DataVisualization.Toolkit, Version=2.0.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> + <Reference Include="System.Windows.Controls.Theming.ShinyRed, Version=2.0.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> + <Reference Include="System.Windows.Controls.Theming.Toolkit, Version=2.0.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> + <Reference Include="System.Xml" /> + <Reference Include="System.Windows.Browser" /> + </ItemGroup> + <ItemGroup> + <Compile Include="App.xaml.cs"> + <DependentUpon>App.xaml</DependentUpon> + </Compile> + <Compile Include="MainPage.xaml.cs"> + <DependentUpon>MainPage.xaml</DependentUpon> + </Compile> + <Compile Include="Properties\AssemblyInfo.cs" /> + </ItemGroup> + <ItemGroup> + <ApplicationDefinition Include="App.xaml"> + <SubType>Designer</SubType> + <Generator>MSBuild:MarkupCompilePass1</Generator> + </ApplicationDefinition> + <Page Include="MainPage.xaml"> + <SubType>Designer</SubType> + <Generator>MSBuild:MarkupCompilePass1</Generator> + </Page> + </ItemGroup> + <ItemGroup> + <None Include="Properties\AppManifest.xml" /> + </ItemGroup> + <ItemGroup> + <WCFMetadata Include="Service References\" /> + </ItemGroup> + <Import Project="$(MSBuildExtensionsPath)\Microsoft\Silverlight\v3.0\Microsoft.Silverlight.CSharp.targets" /> + <!-- To modify your build process, add your task inside one of the targets below and uncomment it. + Other similar extension points exist, see Microsoft.Common.targets. + <Target Name="BeforeBuild"> + </Target> + <Target Name="AfterBuild"> + </Target> + --> + <ProjectExtensions> + <VisualStudio> + <FlavorProperties GUID="{A1591282-1198-4647-A2B1-27E5FF5F6F3B}"> + <SilverlightProjectProperties /> + </FlavorProperties> + </VisualStudio> + </ProjectExtensions> +</Project>
\ 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 @@ +<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ProjectExtensions> + <VisualStudio> + <FlavorProperties GUID="{A1591282-1198-4647-A2B1-27E5FF5F6F3B}"> + <SilverlightProjectProperties> + <StartPageUrl> + </StartPageUrl> + <StartAction>DynamicPage</StartAction> + <AspNetDebugging>True</AspNetDebugging> + <NativeDebugging>False</NativeDebugging> + <SQLDebugging>False</SQLDebugging> + <ExternalProgram> + </ExternalProgram> + <StartExternalURL> + </StartExternalURL> + <StartCmdLineArguments> + </StartCmdLineArguments> + <StartWorkingDirectory> + </StartWorkingDirectory> + <ShowWebRefOnDebugPrompt>True</ShowWebRefOnDebugPrompt> + <OutOfBrowserProjectToDebug> + </OutOfBrowserProjectToDebug> + <ShowRiaSvcsOnDebugPrompt>True</ShowRiaSvcsOnDebugPrompt> + </SilverlightProjectProperties> + </FlavorProperties> + </VisualStudio> + </ProjectExtensions> +</Project>
\ 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 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
- *
- * <em></em>
- *
- * @author Manuel Traut
- *
- * @version 0.1 28-08-2008<br>
- *
- */
-
-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://<serverIP>:<portOfDB>/<dataBaseName>";
- */
- 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 + * + * <em></em> + * + * @author Manuel Traut + * + * @version 0.1 28-08-2008<br> + * + */ + +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://<serverIP>:<portOfDB>/<dataBaseName>"; + */ + 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
- *
- * <em>Implements functionality of the ServerControl Interface</em>
- *
- * @author Volker Dahnke / Manuel Traut
- * @version 0.6 14-12-2005<br>
- * @see client
- */
-public class ServerControlImpl extends ServerControlInterfacePOA
-{
- private ORB orb;
-
- private InitServer srv;
- private InputPluginHandler inputHandler;
- private OutputPluginHandler outputHandler;
- private AuthPluginHandler authHandler;
-
- private ArrayList<Session> sessions;
- private ArrayList<PluginInfo> plugin_infos;
-
- private String log4jFile = "log4j_server.conf";
-
- private static Logger logger =
- Logger.getLogger("Yalp.Server.ServerControlImpl");
-
-public ServerControlImpl()
-{
- this.sessions = new ArrayList<Session> ();
- this.plugin_infos = new ArrayList<PluginInfo> ();
-
- 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<PluginInfo> all_plugins = new ArrayList<PluginInfo>();
-
- 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 + * + * <em>Implements functionality of the ServerControl Interface</em> + * + * @author Volker Dahnke / Manuel Traut + * @version 0.6 14-12-2005<br> + * @see client + */ +public class ServerControlImpl extends ServerControlInterfacePOA +{ + private ORB orb; + + private InitServer srv; + private InputPluginHandler inputHandler; + private OutputPluginHandler outputHandler; + private AuthPluginHandler authHandler; + + private ArrayList<Session> sessions; + private ArrayList<PluginInfo> plugin_infos; + + private String log4jFile = "log4j_server.conf"; + + private static Logger logger = + Logger.getLogger("Yalp.Server.ServerControlImpl"); + +public ServerControlImpl() +{ + this.sessions = new ArrayList<Session> (); + this.plugin_infos = new ArrayList<PluginInfo> (); + + 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<PluginInfo> all_plugins = new ArrayList<PluginInfo>(); + + 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
- *
- * <em></em>
- *
- * @author Manuel Traut
- *
- * @version 0.1 27-03-2006<br>
- *
- * @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 + * + * <em></em> + * + * @author Manuel Traut + * + * @version 0.1 27-03-2006<br> + * + * @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
- *
- * <em>static main method</em>
- *
- * @author Volker Dahnke / Manuel Traut
- *
- * @version 0.1 20-11-2005<br>
- */
-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 + * + * <em>static main method</em> + * + * @author Volker Dahnke / Manuel Traut + * + * @version 0.1 20-11-2005<br> + */ +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; + } + +} |
