Subversion Repositories shark

Compare Revisions

Ignore whitespace Rev 1085 → Rev 1084

/demos/branches/pj/fsdemo/gbuffer.h
File deleted
/demos/branches/pj/fsdemo/gload.c
File deleted
/demos/branches/pj/fsdemo/gphoto.ok
File deleted
/demos/branches/pj/fsdemo/oldmakefile
File deleted
/demos/branches/pj/fsdemo/gload.h
File deleted
/demos/branches/pj/fsdemo/makefile
File deleted
/demos/branches/pj/fsdemo/gphoto.c
File deleted
/demos/branches/pj/fsdemo/gclock.c
File deleted
/demos/branches/pj/fsdemo/initfile.c
File deleted
/demos/branches/pj/fsdemo/xread.c
File deleted
/demos/branches/pj/fsdemo/gphoto.h
File deleted
/demos/branches/pj/fsdemo/gclock.h
File deleted
/demos/branches/pj/fsdemo/mutex.h
File deleted
/demos/branches/pj/fsdemo/xread.h
File deleted
/demos/branches/pj/fsdemo/config.h
File deleted
/demos/branches/pj/fsdemo/readme
File deleted
/demos/branches/pj/fsdemo/gvideo.c
File deleted
/demos/branches/pj/fsdemo/gbuffer.c
File deleted
/demos/branches/pj/fsdemo/gvideo.h
File deleted
/demos/branches/pj/fsdemo/mplay.c
File deleted
/demos/branches/pj/oldexamples/block/common.c
File deleted
/demos/branches/pj/oldexamples/block/makefile
File deleted
/demos/branches/pj/oldexamples/block/common.h
File deleted
/demos/branches/pj/oldexamples/block/idetest0.c
File deleted
/demos/branches/pj/oldexamples/block/idetest1.c
File deleted
/demos/branches/pj/oldexamples/block/idetest2.c
File deleted
/demos/branches/pj/oldexamples/block/idelin.c
File deleted
/demos/branches/pj/oldexamples/block/idetest3.c
File deleted
/demos/branches/pj/oldexamples/block/idetx430.c
File deleted
/demos/branches/pj/oldexamples/block/idernd.c
File deleted
/demos/branches/pj/oldexamples/kernel/teste.c
File deleted
/demos/branches/pj/oldexamples/kernel/testf.c
File deleted
/demos/branches/pj/oldexamples/kernel/testg.c
File deleted
/demos/branches/pj/oldexamples/kernel/testh.c
File deleted
/demos/branches/pj/oldexamples/kernel/testi.c
File deleted
/demos/branches/pj/oldexamples/kernel/testj.c
File deleted
/demos/branches/pj/oldexamples/kernel/testk.c
File deleted
/demos/branches/pj/oldexamples/kernel/testl.c
File deleted
/demos/branches/pj/oldexamples/kernel/testm.c
File deleted
/demos/branches/pj/oldexamples/kernel/testn.c
File deleted
/demos/branches/pj/oldexamples/kernel/testo.c
File deleted
/demos/branches/pj/oldexamples/kernel/testp.c
File deleted
/demos/branches/pj/oldexamples/kernel/testq.c
File deleted
/demos/branches/pj/oldexamples/kernel/test1.c
File deleted
/demos/branches/pj/oldexamples/kernel/testr.c
File deleted
/demos/branches/pj/oldexamples/kernel/test2.c
File deleted
/demos/branches/pj/oldexamples/kernel/tests.c
File deleted
/demos/branches/pj/oldexamples/kernel/test3.c
File deleted
/demos/branches/pj/oldexamples/kernel/test4.c
File deleted
/demos/branches/pj/oldexamples/kernel/testu.c
File deleted
/demos/branches/pj/oldexamples/kernel/test5.c
File deleted
/demos/branches/pj/oldexamples/kernel/test6.c
File deleted
/demos/branches/pj/oldexamples/kernel/sysend.c
File deleted
/demos/branches/pj/oldexamples/kernel/testw.c
File deleted
/demos/branches/pj/oldexamples/kernel/test7.c
File deleted
/demos/branches/pj/oldexamples/kernel/test8.c
File deleted
/demos/branches/pj/oldexamples/kernel/test9.c
File deleted
/demos/branches/pj/oldexamples/kernel/testz.c
File deleted
/demos/branches/pj/oldexamples/kernel/testss.c
File deleted
/demos/branches/pj/oldexamples/kernel/makefile
File deleted
/demos/branches/pj/oldexamples/kernel/perf1.c
File deleted
/demos/branches/pj/oldexamples/kernel/test7.ori
File deleted
/demos/branches/pj/oldexamples/kernel/perf2.c
File deleted
/demos/branches/pj/oldexamples/kernel/perf3.c
File deleted
/demos/branches/pj/oldexamples/kernel/perf4.c
File deleted
/demos/branches/pj/oldexamples/kernel/testa.c
File deleted
/demos/branches/pj/oldexamples/kernel/testb.c
File deleted
/demos/branches/pj/oldexamples/kernel/testc.c
File deleted
/demos/branches/pj/oldexamples/kernel/testd.c
File deleted
/demos/branches/pj/oldexamples/tracer/sa.c
File deleted
/demos/branches/pj/oldexamples/tracer/hello.c
File deleted
/demos/branches/pj/oldexamples/tracer/wait.c
File deleted
/demos/branches/pj/oldexamples/tracer/types.h
File deleted
/demos/branches/pj/oldexamples/tracer/util.c
File deleted
/demos/branches/pj/oldexamples/tracer/jdump.c
File deleted
/demos/branches/pj/oldexamples/tracer/util.h
File deleted
/demos/branches/pj/oldexamples/tracer/treec1.c
File deleted
/demos/branches/pj/oldexamples/tracer/hello1.c
File deleted
/demos/branches/pj/oldexamples/tracer/treec2.c
File deleted
/demos/branches/pj/oldexamples/tracer/road.c
File deleted
/demos/branches/pj/oldexamples/tracer/hello2.c
File deleted
/demos/branches/pj/oldexamples/tracer/distr.c
File deleted
/demos/branches/pj/oldexamples/tracer/treef1.c
File deleted
/demos/branches/pj/oldexamples/tracer/common.c
File deleted
/demos/branches/pj/oldexamples/tracer/tdump.c
File deleted
/demos/branches/pj/oldexamples/tracer/simple.c
File deleted
/demos/branches/pj/oldexamples/tracer/makefile
File deleted
/demos/branches/pj/oldexamples/tracer/common.h
File deleted
/demos/branches/pj/oldexamples/tracer/test0.c
File deleted
/demos/branches/pj/oldexamples/stdio/test2.c
File deleted
/demos/branches/pj/oldexamples/stdio/test3.c
File deleted
/demos/branches/pj/oldexamples/stdio/test4.c
File deleted
/demos/branches/pj/oldexamples/stdio/common.c
File deleted
/demos/branches/pj/oldexamples/stdio/makefile
File deleted
/demos/branches/pj/oldexamples/stdio/test0.c
File deleted
/demos/branches/pj/oldexamples/stdio/test1.c
File deleted
/demos/branches/pj/oldexamples/fs/makefile
File deleted
/demos/branches/pj/oldexamples/fs/common.h
File deleted
/demos/branches/pj/oldexamples/fs/test0.c
File deleted
/demos/branches/pj/oldexamples/fs/tree1.c
File deleted
/demos/branches/pj/oldexamples/fs/test1.c
File deleted
/demos/branches/pj/oldexamples/fs/test2.c
File deleted
/demos/branches/pj/oldexamples/fs/tree2.c
File deleted
/demos/branches/pj/oldexamples/fs/hello.c
File deleted
/demos/branches/pj/oldexamples/fs/testu.c
File deleted
/demos/branches/pj/oldexamples/fs/testw0.c
File deleted
/demos/branches/pj/oldexamples/fs/testw1.c
File deleted
/demos/branches/pj/oldexamples/fs/common.c
File deleted
/demos/branches/pj/oldexamples/mpeg/mpg123.c
File deleted
/demos/branches/pj/oldexamples/mpeg/makefile
File deleted
/demos/branches/pj/oldexamples/mpeg/mplay.c
File deleted
/demos/branches/pj/oldexamples/mpeg/mplay2.c
File deleted
/demos/branches/pj/oldexamples/mpeg/common.c
File deleted
/demos/branches/pj/dosfs/myfile.txt
File deleted
/demos/branches/pj/dosfs/initfile.c
File deleted
/demos/branches/pj/dosfs/readme.txt
File deleted
/demos/branches/pj/dosfs/makefile
File deleted
/demos/branches/pj/dosfs/dosfs.c
File deleted
/demos/branches/pj/soccer/iniziali.h
File deleted
/demos/branches/pj/soccer/soccer.c
File deleted
/demos/branches/pj/soccer/initfile.c
File deleted
/demos/branches/pj/soccer/calc.h
File deleted
/demos/branches/pj/soccer/stadio.h
File deleted
/demos/branches/pj/soccer/calc2.h
File deleted
/demos/branches/pj/soccer/position.h
File deleted
/demos/branches/pj/soccer/images.h
File deleted
/demos/branches/pj/soccer/readme
File deleted
/demos/branches/pj/soccer/makefile
File deleted
/demos/branches/pj/cash/testcash.c
File deleted
/demos/branches/pj/cash/cash.c
File deleted
/demos/branches/pj/cash/initcash.c
File deleted
/demos/branches/pj/cash/cash.h
File deleted
/demos/branches/pj/cash/readme.txt
File deleted
/demos/branches/pj/cash/makefile
File deleted
/demos/branches/pj/orbit/initfile.c
File deleted
/demos/branches/pj/orbit/orbit.dat
File deleted
/demos/branches/pj/orbit/makefile
File deleted
/demos/branches/pj/orbit/orbit.c
File deleted
/demos/branches/pj/thdemo/fftplay.c
File deleted
/demos/branches/pj/thdemo/jetctrl.c
File deleted
/demos/branches/pj/thdemo/camera.c
File deleted
/demos/branches/pj/thdemo/demo.h
File deleted
/demos/branches/pj/thdemo/readme.txt
File deleted
/demos/branches/pj/thdemo/camera2.c
File deleted
/demos/branches/pj/thdemo/ball.c
File deleted
/demos/branches/pj/thdemo/camera4.c
File deleted
/demos/branches/pj/thdemo/ball2.c
File deleted
/demos/branches/pj/thdemo/makefile
File deleted
/demos/branches/pj/thdemo/fft.c
File deleted
/demos/branches/pj/thdemo/initfile.c
File deleted
/demos/branches/pj/thdemo/demo.c
File deleted
/demos/branches/pj/simcity/reading.c
File deleted
/demos/branches/pj/simcity/simcity.c
File deleted
/demos/branches/pj/simcity/tasks.c
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/sprite/sp_5.raw
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/sprite/sp_6.raw
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/sprite/sp_7.raw
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/sprite/sp_0.raw
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/sprite/sp_1.raw
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/sprite/sp_2.raw
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/sprite/sp_3.raw
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/sprite/sp_4.raw
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/keyfunct.c
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/img/car_240n.raw
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/img/car_015n.raw
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/img/car_150n.raw
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/img/car_060n.raw
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/img/car_105n.raw
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/img/car_330n.raw
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/img/car_045n.raw
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/img/old_sk.raw
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/img/car_180n.raw
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/img/car_090n.raw
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/img/car_270n.raw
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/img/car_135n.raw
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/img/car_225n.raw
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/img/car_315n.raw
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/img/car_075n.raw
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/img/car_165n.raw
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/img/car_255n.raw
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/img/car_345n.raw
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/img/old.raw
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/img/car_195n.raw
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/img/car_285n.raw
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/img/car_000n.raw
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/img/Bb0.raw
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/img/bb1.raw
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/img/car_210n.raw
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/img/car_120n.raw
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/img/car_030n.raw
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/img/car_300n.raw
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/img/street.raw
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/misc.c
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/sem.raw
File deleted
/demos/branches/pj/simcity/makefile
File deleted
/demos/branches/pj/simcity/draw.c
File deleted
/demos/branches/pj/simcity/keyboard.c
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/include/simcity.h
File deleted
/demos/branches/pj/simcity/include/proc.h
File deleted
/demos/branches/pj/simcity/include/states.h
File deleted
/demos/branches/pj/simcity/include/car.h
File deleted
/demos/branches/pj/simcity/include/keyfunct.h
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/include/constant.h
File deleted
/demos/branches/pj/simcity/include/misc.h
File deleted
/demos/branches/pj/simcity/include/draw.h
File deleted
/demos/branches/pj/simcity/proc.c
File deleted
/demos/branches/pj/simcity/initfile.c
File deleted
/demos/branches/pj/simcity/sem/green_r.raw
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/sem/green_d.raw
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/sem/green_u.raw
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/sem/red_l.raw
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/sem/yellow_l.raw
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/sem/red_r.raw
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/sem/green_l.raw
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/sem/yellow_r.raw
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/sem/red_d.raw
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/sem/red_u.raw
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/sem/yellow_d.raw
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/sem/yellow_u.raw
File deleted
\ No newline at end of file
/demos/branches/pj/simcity/car.c
File deleted
\ No newline at end of file
/demos/branches/pj/edfact/edfact.h
File deleted
/demos/branches/pj/edfact/readme
File deleted
/demos/branches/pj/edfact/makefile
File deleted
/demos/branches/pj/edfact/initfile.c
File deleted
/demos/branches/pj/edfact/edfact.c
File deleted
/demos/branches/pj/edfact/testact.c
File deleted
/demos/branches/pj/myapp/myapp.c
File deleted
/demos/branches/pj/myapp/readme.txt
File deleted
/demos/branches/pj/myapp/mymod.h
File deleted
/demos/branches/pj/myapp/makefile
File deleted
/demos/branches/pj/myapp/initfile.c
File deleted
/demos/branches/pj/myapp/mymod.c
File deleted
/demos/branches/pj/static/static.c
File deleted
/demos/branches/pj/static/test1st.c
File deleted
/demos/branches/pj/static/static.h
File deleted
/demos/branches/pj/static/readme
File deleted
/demos/branches/pj/static/makefile
File deleted
/demos/branches/pj/static/initfile.c
File deleted
/demos/branches/pj/lights/param.dat
File deleted
/demos/branches/pj/lights/readme.txt
File deleted
/demos/branches/pj/lights/makefile
File deleted
/demos/branches/pj/lights/simlight.c
File deleted
/demos/branches/pj/lights/blaster.h
File deleted
/demos/branches/pj/lights/initfile.c
File deleted
/demos/branches/pj/pse51/ptest4
File deleted
\ No newline at end of file
Property changes:
Deleted: svn:executable
## -1 +0,0 ##
-*
\ No newline at end of property
Index: demos/branches/pj/pse51/ptest3.c
===================================================================
--- demos/branches/pj/pse51/ptest3.c (revision 1085)
+++ demos/branches/pj/pse51/ptest3.c (nonexistent)
@@ -1,229 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: ptest3.c,v 1.1.1.1 2002-09-02 09:37:47 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:47 $
- ------------
-
- Posix test 3:
-
- timers...
- it creates two periodic timers that queues signals, a periodic timer
- that create tasks and an one-shot timer.
-
- non standard function used:
- cprintf
- sys_gettime
- keyboard stuffs
- sys_end
-
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include <sys/types.h>
-#include <pthread.h>
-#include <time.h>
-
-#include <kernel/kern.h>
-#include <drivers/keyb.h>
-
-int count25 = 0, count26 = 0;
-
-void signal_handler(int signo, siginfo_t *info, void *extra)
-{
- switch (signo) {
- case 25:
- count25++;
- break;
- case 26:
- count26++;
- break;
- }
-
- cprintf("Signal %d code=%s value=%d task=%d count25=%d count26=%d time=%ldusec\n",
- info->si_signo,
- (info->si_code == SI_TIMER) ? "Timer" : "Other",
- info->si_value.sival_int,
- info->si_task,
- count25,
- count26,
- sys_gettime(NULL));
-}
-
-void fine(KEY_EVT *e)
-{
- sys_end();
-}
-
-void task_timer(union sigval value)
-{
- cprintf("task_timer: value = %d, time = %ldusec\n",
- value.sival_int, sys_gettime(NULL));
-}
-
-int main(int argc, char **argv)
-{
- int err;
- timer_t timer1, timer2, timer3;
- struct itimerspec timeout1, timeout2, timeout3, nulltimeout;
- struct sigaction sig_act;
- struct sigevent ev25, ev26, evtask;
- pthread_attr_t task_attr;
- struct sched_param task_param;
-
- KEY_EVT emerg;
- //keyb_set_map(itaMap);
- emerg.ascii = 'x';
- emerg.scan = KEY_X;
- emerg.flag = ALTL_BIT;
- keyb_hook(emerg,fine);
-
- sig_act.sa_sigaction = (void *) signal_handler;
- sig_act.sa_flags = SA_SIGINFO;
- sigemptyset(&sig_act.sa_mask);
-
- sigaction(25, &sig_act, NULL);
- sigaction(26, &sig_act, NULL);
-
- // set ev25, ev26, evtask
- ev25.sigev_notify = SIGEV_SIGNAL;
- ev25.sigev_signo = 25;
- ev25.sigev_value.sival_int = 555;
-
- ev26.sigev_notify = SIGEV_SIGNAL;
- ev26.sigev_signo = 26;
- ev26.sigev_value.sival_int = 666;
-
- evtask.sigev_notify = SIGEV_THREAD;
- evtask.sigev_value.sival_int = 777;
- evtask.sigev_notify_function = task_timer;
- evtask.sigev_notify_attributes = &task_attr;
-
- pthread_attr_init(&task_attr);
- pthread_attr_setdetachstate(&task_attr, PTHREAD_CREATE_DETACHED);
- pthread_attr_setschedpolicy(&task_attr, SCHED_FIFO);
- task_param.sched_priority = 10;
- pthread_attr_setschedparam(&task_attr, &task_param);
-
- // set timeout1, timeout2, nulltimeout
- timeout1.it_interval.tv_sec = 0;
- timeout1.it_interval.tv_nsec = 500000000;
- timeout1.it_value.tv_sec = 3;
- timeout1.it_value.tv_nsec = 0;
-
- timeout2.it_interval.tv_sec = 0;
- timeout2.it_interval.tv_nsec = 200000000;
- timeout2.it_value.tv_sec = 7;
- timeout2.it_value.tv_nsec = 0;
-
- timeout3.it_interval.tv_sec = 0;
- timeout3.it_interval.tv_nsec = 300000000;
- timeout3.it_value.tv_sec = 5;
- timeout3.it_value.tv_nsec = 0;
-
- NULL_TIMESPEC(&nulltimeout.it_value);
- NULL_TIMESPEC(&nulltimeout.it_interval);
-
- // create the timers
- err = timer_create(CLOCK_REALTIME, &ev25, &timer1);
- if (err == -1) { cprintf("main: unable to create timer 1\n"); }
-
- err = timer_create(CLOCK_REALTIME, &ev26, &timer2);
- if (err == -1) { cprintf("main: unable to create timer 2\n"); }
-
- err = timer_create(CLOCK_REALTIME, &evtask, &timer3);
- if (err == -1) { cprintf("main: unable to create timer 3\n"); }
-
- // arm the timers
- err = timer_settime(timer1, TIMER_ABSTIME, &timeout1, NULL);
- if (err == -1) { cprintf("main: unable to set timer 1\n"); }
-
- err = timer_settime(timer2, 0, &timeout2, NULL);
- if (err == -1) { cprintf("main: unable to set timer 2\n"); }
-
- err = timer_settime(timer3, TIMER_ABSTIME, &timeout3, NULL);
- if (err == -1) { cprintf("main: unable to set timer 3\n"); }
-
- cprintf("main: waiting signals...\n");
- while (sys_gettime(NULL) < 8500000) {
- //kern_deliver_pending_signals();
- }
-
- cprintf("main: disarm the timer2\n");
- err = timer_settime(timer2, 0, &nulltimeout, &timeout2);
- if (err == -1) { cprintf("main: unable to disarm timer 2\n"); }
-
- cprintf("main: timer2 disarmed, itvalue=%ld.%ld\n",
- timeout2.it_value.tv_sec,timeout2.it_value.tv_nsec/1000);
-
- while (sys_gettime(NULL) < 10000000) {
- //kern_deliver_pending_signals();
- }
-
- cprintf("main: disarm the timer1\n");
- err = timer_settime(timer1, TIMER_ABSTIME, &nulltimeout, &timeout1);
- if (err == -1) { cprintf("main: unable to disarm timer 1\n"); }
-
- cprintf("main: timer1 disarmed, itvalue=%ld.%ld\n",
- timeout1.it_value.tv_sec,timeout1.it_value.tv_nsec/1000);
-
- while (sys_gettime(NULL) < 12000000) {
- //kern_deliver_pending_signals();
- }
-
- cprintf("main: arm timer1\n");
- timeout1.it_interval.tv_sec = 0;
- timeout1.it_interval.tv_nsec = 0;
- timeout1.it_value.tv_sec = 13;
- timeout1.it_value.tv_nsec = 0;
- err = timer_settime(timer1, TIMER_ABSTIME, &timeout1, NULL);
- if (err == -1) { cprintf("main: unable to arm timer 1\n"); }
-
- while (sys_gettime(NULL) < 14000000) {
- //kern_deliver_pending_signals();
- }
-
-
-
- cprintf("main: ending...\n");
-
- return 0;
-}
Index: demos/branches/pj/pse51/ptest5
===================================================================
--- demos/branches/pj/pse51/ptest5 (revision 1085)
+++ demos/branches/pj/pse51/ptest5 (nonexistent)
@@ -1,403 +0,0 @@
-ELF"4àa4 ( €""H>H> È>HN#HN# Pî 덶°­üORäe‹Ká€uU¿€ Ç–eÆG1GeÆGGeÆG2GeÆG¸Tå"fe£hN#Áèfe£nN#HV#¿€ Ç’eÆG0GeÆGf¸0ŽØŽÀŽÐŽàŽè¼`#Ç0·%`a#Ç4·%`#£TV#‰XV#HV#êµ"8NV#üèbÑê U‰å‹Eê ‰öU‰åƒìÿ5ìÛ#hð+#èåƒÄÉÐU‰åƒìè};ÉÍvU‰åSƒì,ÆEÙxÆEÚ-ÆEØhô"ƒì‹EØf‰$ÆD$-è¼ ÇEôØ"ÇEð]èEì‰$è0jƒÄ jSjèUÇ$ ,#è‹äÇ$èdƒÄƒì jèN;ƒÄ=„vìƒì jèöcƒÄPh`,#èPäèÃmÇ$,#è?七Ä‹]üÉÉöU‰åƒìj ÿujh'èMè‰è‡¬è¶²è1™ƒÄ jjjèÿLèîv¸èƒÄÉÃU‰åWVSƒìX‹]}¨¾\V#ü¹ó¥E¸‰E¨fÇE¸ÇE¼ÇEÀfÇEÄÇEÐÇEÔÇEÜÇEà‰]ÈÇEØÇEÌjè8L‰EÐÇEÜÇEàƒMÌ
-è֜E¨‰$ècƒÄ…Àyƒì h ,#è»ãƒÄƒì SèoE¸ƒÄeô[^_]ÍvU‰åƒìŠU€=lW#„¶€ú*t€úªt
-€ú6t€ú¶uÆlW#¸é›„Òy,ÆlW#€ú¸uÆxW#ÆnW#ëՀúuÐÆxW#ëljöÆlW#€ú8u€ -xW#ÆnW#멀úu € -xW#뛉ö€ú5uf¾‚#·Àé)v€ú…•f¾ü#·Àé -v€úàuÆlW#éTÿÿÿv€ú*t€ú6u2ÆmW#€ú*u€ -xW#é/ÿÿÿ‰ö€ú6…$ÿÿÿ€ -xW# éÿÿÿv€úªt€ú¶u"ÆmW#€úªt €ú¶…öþÿÿÆxW#éêþÿÿ€úFu€=qW#•qW#ë.v€ú:u€=oW#•oW#ëv€úEu;€=pW#•pW#ƒì¶qW#P¶oW#P¶pW#Pèõ¸ƒÄé€úu€ -xW#éhþÿÿv€ú8u€ -xW#éTþÿÿv€út€ú¸uÆxW#é;þÿÿ‰ö¸„҈рúRt2€úOt-€úSt(€úPt#€úQt€úKt€úLt€úMt€úGt
-€úHt€úIu€=pW#uT€=mW#uK·Â -ÿë~€=oW#t/Bð< vBâ<vBÔ<w€=mW#t¶Âf¾€à#·ÀëG€=mW#t¶Âf¾€€‚#·Àë-v€=nW#t¶Âf¾€ ƒ#·Àëv¶Âf¾€à#·ÀÉÃU‰åWVSƒì,}؃ìjE×PèòƒÄ…À„¡ƒì ¶E×Pèöüÿÿ‰ÂƒÄf…Ò„†÷Âÿt  xW#ƒÈ@ë‰ö xW#ˆE؈UيE׈EÚ±»;؁#}8¾`#v݊D2:EÚuŠ2:EØuƒì Wÿ’d#±ƒÄC;؁#|ЄÉuƒìjW¿¢ƒ#Pèý¡ƒÄè-é<ÿÿÿU‰å‹E£hW#Šˆâ#ŠPˆã#ŠPˆä#ŠPˆå#ŠPˆæ#ŠPˆç#ŠPˆè#ŠPˆé#ŠPˆê#ŠP ˆë#ŠP
-ˆ‚‚#ŠP ˆƒ‚#ŠP ˆ„‚#ŠP -ˆ…‚#ŠPˆ†‚#ŠPˆ‡‚#ŠPˆˆ‚#ŠPˆ‰‚#ŠPˆŠ‚#ŠPˆ‹‚#ŠPˆì#ŠPˆŒ‚#ŠPˆí#ŠPˆ‚#ŠPˆú#ŠPˆš‚#ŠPˆû#ŠPˆ›‚#ŠPˆ‚#ŠPˆ§‚#ŠPˆ‚#ŠPˆ¨‚#ŠP ˆ ‚#ŠP!ˆ©‚#ŠP"ˆ‚#ŠP#ˆµ‚#ŠP$ˆ‚#ŠP%ˆ³‚#ŠP&ˆ‚#ŠP'ˆ´‚#ŠP(ˆ ‚#ŠP)ˆ«‚#ŠP*ˆ‚#ŠP+ˆ¹‚#ŠP,ˆî#ŠP-ˆŽ‚#ŠP.ˆï#ŠÖˆ‚#ŠP0ˆá#ŠP1ˆ‚#ŠP2ˆü#ŠP3ˆœ‚#ŠP4ˆä‚#ŠP5ˆς#ŠP6ˆЂ#ŠP7ˆт#ŠP8ˆ˂#ŠP9ˆ̂#ŠP:ˆ͂#ŠP;ˆǂ#ŠP<ˆȂ#ŠP=ˆɂ#ŠP>ˆ҂#ŠP?ˆӂ#ŠP@ˆ.‚#ŠPAˆ‚#ŠPBˆ‚#ŠPCˆ*‚#ŠPDˆ΂#ŠPEˆ·‚#ŠPFˆʂ#ŠPGˆþ#ŠPHˆž‚#ŠPIˆ‚#ŠPJˆ°‚#ŠPKˆ‚#ŠPLˆ®‚#ŠPMˆ‚#ŠPNˆ ‚#ŠPOˆò#ŠPPˆ’‚#ŠPQˆ‚#ŠPRˆ¡‚#ŠPSˆ‚#ŠPTˆ¢‚#ŠPUˆ‚#ŠPVˆ£‚#ŠPWˆ÷#ŠPXˆ—‚#ŠPYˆ‚#ŠPZˆ¤‚#ŠP[ˆ‚#ŠPRˆ¥‚#ŠP]ˆ‚#ŠP^ˆ¦‚#ŠP_ˆ‚#ŠP`ˆ²‚#ŠPaˆ‚#ŠPbˆ±‚#ŠPcˆø#ŠPdˆ˜‚#ŠPeˆù#ŠPfˆ™‚#ŠPgˆð#ŠPhˆ‚#ŠPiˆó#ŠPjˆ“‚#ŠPkˆÿ#ŠPlˆŸ‚#ŠPmˆô#ŠPnˆ”‚#ŠPoˆö#ŠPpˆ–‚#ŠPqˆ‚#ŠPrˆ¯‚#ŠPsˆñ#ŠPtˆ‘‚#ŠPuˆ -‚#ŠPvˆ­‚#ŠPwˆõ#ŠPxˆ•‚#ŠPyˆ ‚#ŠPzˆ¬‚#ŠP{ˆ:ƒ#ŠP|ˆ;ƒ#ŠP}ˆGƒ#Š@~¢Hƒ#]ÍvU‰åWVSƒì\‹]}ؾ€W#ü¹󥿸ƒ=tW#…Qº¾à#¹€‚#‰ö·ÂÆ0ÆBfúví…Ûu]؃{ÿuÇChV#ƒì ÿsèûÿÿÇ$jjjhÙ,#èϔf£¢ƒ#ƒÄ fƒøÿu ¸þÿÿÿéÞ‰öjjjhÙ,#è0˜f£¤ƒ#ƒÄfƒøÿuƒì ¿¢ƒ#P蕛¸ýÿÿÿ頍vÇ؁#ƒ{ÿuÇC "ƒ{tIÆE™cÆEš.ÆE˜ƒìÿsƒì‹E˜f‰$ÆD$.èÅÆE˜ƒÄÿsƒì‹E˜f‰$ŠEšˆD$襃ă;ÿuQfÇE¨ÇE¬ÇE°fÇE´ÇE¸ÇEÐÇEÈÐÇEÄ ÇEÀ¨aÇE¼
-ÇE̍E¨ë‹ƒì jjPh¨"hâ,#èÿ‰ÃƒÄ ‰¨ƒ#ƒøÿu'ƒì ¿¢ƒ#P蓚¿¤ƒ#‰$脚‰Ø钐ƒ=|W#uWƒì ÿ5¨ƒ#艉ǃąÿt4ƒì ¿¢ƒ#PèLš¿¤ƒ#‰$è=šƒÄÿ5¨ƒ#èg5¸üÿÿÿë=Ç|W#ëèƒì¶qW#P¶oW#P¶pW#PèûÇtW#‰øƒÄeô[^_]ÃU‰åƒì¶EPEèP¿¤ƒ#Pè0œƒÄ„Àt÷Eè@u¶Eéë‰ö¸ÉÐU‰åƒì ¶E Pÿu¿¤ƒ#Pèõ›·ÀƒÄÉÐU‰åSƒ=؁#0‹ -؁#Í»`#‹Ef‰ŠE
-ˆD‹E ‰‚d#A‰ -؁#‹$ÉÉöU‰åƒìèÉÍvU‰åƒìè±ÉÍvU‰åƒì¸ÿÿÿÿƒ=tW#t9蓃ì ÿ5¨ƒ#è-4¿¢ƒ#‰$è昿¤ƒ#‰$èט¸ƒÄÉÐU‰åƒìjèoÔÇ$è+ÔÇ$È,#èóÓè²-ƒÄÉÐU‰åWVSƒìŠEˆEó¿1¾d»`‰ö¹v‰òì©t"‰ÈA=þÿÿvì¸ÿÿÿÿ…Àu‰ÚŠEóî¸ë‰ö¸ë搸ÿÿÿÿÇEì¹d…Àt¸ÿÿÿÿët¸ë‰Êì©uî‹EìÿEì=þÿÿvé¸ÿÿÿÿ…Àu‰Úì¶Àë¸ÿÿÿÿƒøÿu
-¸þÿÿÿë3v=úu ¸ë"‰ö=þt ¸ýÿÿÿë‰ö‰øO…À9ÿÿÿ¸üÿÿÿƒÄ[^_]ÃU‰åVSƒìŠEˆE÷³Ô¾¹d‰ö‰Êì©t"‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë -¸ë搸ÿÿÿÿ…Àt¸ÿÿÿÿëL¸ë&»¹d‰ö‰Êì©tâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àuº`ŠE÷î¸ëv¸ÿÿÿÿ…Àt¸ÿÿÿÿëj¸ë&»¹d‰ö‰Êì©uâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àuºdì© tº`ì¶Ðëvºÿÿÿÿ‰Ð…Òx¸úú”ÀDþƒÄ[^]ÃU‰åWVSƒì »¾`‰ØK…À~^ƒì hÿè¼ýÿÿ‰ÂƒÄ…Òu{¿¹d‰Êì©u‰øG=þÿÿvì¸ÿÿÿÿ…Àu‰òì¶Ðëv¸ëꐺÿÿÿÿúªu›¸üÿÿÿúª…ƃì hõèMýÿÿ‰ÂƒÄ…Òt(¸ûÿÿÿ馉ö¸ýÿÿÿ隉ö¸ë.¸ëZ³`¾¹d‰Êì©tډðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî³e¾¹dv‰Êì©t®‰ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØîƒì hôèªüÿÿ‰ÂƒÄ¸…Ò•ÀHƒàƒèeô[^_]ÃU‰åWVSƒì ¾»d¹`‰Úì©t -‰Êì‰ðF=þÿvé³­¾¹d‰Êì©„‚‰ðF=þÿÿvè¸ÿÿÿÿ…ÀuºdˆØî¾»d¹`‰Úì©t -‰Êì‰ðF=þÿv鳪¾¹d‰Êì©t"‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ë搸놐¸ÿÿÿÿ…Àt¸÷ÿÿÿéݐ¸ë&»¹d‰ö‰Êì©uâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àu º`ì¶Àë¸ÿÿÿÿƒøUt¸ÿÿÿÿ錸ë&³«¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸öÿÿÿé9¸ë&»¹d‰ö‰Êì©uâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àu º`ì¶Àë¸ÿÿÿÿ…Àt¸þÿÿÿé鐸ë&³®¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…À…<èzüÿÿ…À…Žƒì hóèIúÿÿƒÄ…Àt
-¸ùÿÿÿépƒì jè.úÿÿƒÄ…Àt¸øÿÿÿéU¸ë.ÆŒW#³©¾¹d‰Êì©tډðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸ôÿÿÿéù¸ë&»¹d‰ö‰Êì©uâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àu º`ì¶Àë¸ÿÿÿÿ…Àt¸óÿÿÿ驐¸ë&³¨¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸õÿÿÿéU¸ë&³Ó¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸ðÿÿÿ鐸ë&³Z¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØî¸ë¸ÿÿÿÿ…Àt¸ïÿÿÿ魐ƌW#ëBv¸ë^¹þÿ¾d»`‰òì¶ø÷Çt‰Úì¶À÷Ç tƒøZt»IƒùÿuÙ³§¾¹d‰Êì©tª‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àté»þÿÿ‰ö¸ë:€=ŒW#„þÆŒW#³¨¾¹d‰Êì©tΉðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸îÿÿÿ鱐¸ëvƒì hóèWøÿÿ‰ÃÇ$dèIøÿÿÃÇ$èè;øÿÿÃÇ$è-øÿÿÃÇ$çèøÿÿþ§ƒÄ¿¹dv‰Êì©t’‰øG=þÿÿvì¸ÿÿÿÿ…Àuºd‰ðî¸ë¸ÿÿÿÿ…Àt¸íÿÿÿë…ÛuÆŒW#¸eô[^_]ÃU‰åVS¡ W#…Àt¡ W#H£ W#¸é²¸ë6ƒ=˜W#uKŠœW#¾¹dv‰Êì©t҉ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØîÿ˜W#뤍v¸ë:ƒ=˜W#uGǘW#³ô¾¹d‰Êì©tΉðF=þÿÿvì¸ÿÿÿÿ…À…Xÿÿÿº`ˆØîéKÿÿÿ‰ö¸[^]ÍvU‰åWVSƒì ¡¤W#@£¤W#¾õ³Ô¿¹dv‰Êì©t"‰øG=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ë搸ë.¸ÿÿÿÿ…Àu0»¹d‰Êì©tډØC=þÿÿvì¸ÿÿÿÿ…Àuº`‰ðîœúX‰Çƒì hõè5õÿÿ‰ÃƒÄ…Ût¸ûÿÿÿéù‰ö¸ë1¾§ÇEð¹dv‰Êì©tڋEðÿEð=þÿÿvé¸ÿÿÿÿ…Àu ºd‰ðî¸ë¸ë=¸ëq¸ÿÿÿÿþ`ÇEð¹d‰Êì©t΋EðÿEð=þÿÿvé¸ÿÿÿÿ…Àuºd‰ðî¾eÇEð¹dv‰Êì©tš‹EðÿEð=þÿÿvé¸ÿÿÿÿ…Àuº`‰ðîƒì hôè;ôÿÿÃĉøPÆW#‰Øeô[^_]ÐU‰åWVSƒì ¸ÿÿÿÿ€=ŒW#„ºœúX‰Æƒì hõèóóÿÿƒÄ…Àt(¸ûÿÿÿé—‰ö¸ë:¸ëf¸é“‰ö³`¿¹d‰Êì©tΉøG=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî³G¿¹dv‰Êì©t¢‰øG=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØ¿¹dv‰Êì©„rÿÿÿ‰øG=þÿÿvè¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt ¸îÿÿÿ鐃ì hôèÿòÿÿƒÄ…Àt¸Ûÿÿÿ飉ö¸ë:‰ðP¡¤W#@£¤W#¾ô³Ô¿¹d‰Êì©tΉøG=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë -¸ë.¸ÿÿÿÿ…Àu0»¹d‰Êì©tډØC=þÿÿvì¸ÿÿÿÿ…Àuº`‰ðîƍW#¸eô[^_]ÍvU‰åƒìÇĄ#ÇÀ„#ƒ=”W#t!úè‹õÿÿ£W#Ç”W#û…Àtúèôÿÿû¡W#…ÀuƒìÿuhŒ "jèQ¸ƒÄÉÍvU‰åVS¡ W#@£ W#³õ¾¹d‰Êì©t"‰ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØî¸ë -¸ë搸ÿÿÿÿ[^]ÍvU‰åVS¡ W#@£ W#³ô¾¹d‰Êì©t"‰ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØî¸ë -¸ë搸ÿÿÿÿ[^]ÍvU‰åƒì‹MœúX‰Â¡À„#@%ÿ£À„#Š€Àƒ#ˆ‰ÐP€9úu è(úÿÿë‰ö¸ÉÐU‰åƒìƒ=¬W#t(Ç$…#Ç …#Ç(…#ǬW#‹E£¨W#ƒ=”W#t!úèôÿÿ£W#Ç”W#û…Àtúèòÿÿû¡W#…Àu.¸ìÿÿÿ€=ŒW#t ƒìjÿhÈ "j èOƍW#¸ƒÄÉÉöU‰åS‹MœúX‰Ã¡ …#@ƒà?£ …#ºà„#ŠˆA¡ …#@ƒà?£ …#Šˆ¡ …#@ƒà?£ …#ŠˆA‰ØP¸‹$ÉÉöU‰åƒì€=W#tèäùÿÿƒì j èŽOƍW#¸ƒÄÉÐU‰åƒìƒ=”W#t!úè óÿÿ£W#Ç”W#û…Àtúè™ñÿÿû¡W#…Àt¸ë¶ŒW#ÉÍvU‰åVSŠEŠU€} t ƒ -œW#ë ‰öƒ%œW#„Àt ƒ -œW#ëƒ%œW#„Òtƒ -œW#ë¸ë6¸ëbƒ%œW#³õ¾¹d‰Êì©t҉ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØî³í¾¹dv‰Êì©t¦‰ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØîÿ˜W#[^]ÐU‰åSƒìœúX‰Ã€=W#tè–øÿÿè‘ðÿÿƒì hóèhîÿÿƒÄ…Àuƒì jèWîÿÿƒÄ…Àu‰ØP‹]üÉÍvU‰åº`ì¶ÈœúX‰Â¡À„#;Ą#t¡Ä„#ˆˆÀƒ#@%ÿ£Ä„#‰ÐP]ÉöU‰åƒìº`ì¶Ðƒ=(…#u €úúu¡¤W#H£¤W#郍v÷ÂÀuxÿ(…#œúX‰Á¡ …#;$…#t¡$…#ˆà„#@ƒà?£$…#ë"‰ö¡$…#+(…#ƒÀAƒà?£$…#Ç(…#‰ÈPƒ=(…#uÇ(…#ƒì ÿ5¨W#èƒÄÉÉöU‰åSƒì}™w‹UÑâU‰ÐÁà)Ðfƒ<ÅèÜ#uèùÝNj¸ÿÿÿÿ鏐ƒ=ÀÛ#tcœúX‰Ã‹UÑâU‰ÐÁà)ЍÅ0ö€ÁÜ# t ÿ€ÄÜ#ë-v‹EÑàE‰ÂÁâ)‹ÕÄÜ#ƒì‹• Ü#ÿuRÿP@ƒÄ‰ØPéèƒ¡…ÀtgœúX‰Ã‹UÑâU‰ÐÁà)ЍÅ0ö€ÁÜ# t ÿ€ÄÜ#ë2v‹EÑàE‰ÂÁâ)‹ÕÄÜ#ƒì‹• Ü#ÿuRÿP@蔃ĉØPé­úèJ²‹ìÛ#R‰ÑÁá)Ñ»ÀÜ#f‰DË‹UÑâU‰ÐÁà)ЍÅ0öD t ÿ€ÄÜ#ë?vƒìU‰ÐPjÿèW#‹MI‰ÐÁà)ЋÅÄÜ#ƒÄ‹• Ü#QRÿP@è/ƒÄ¡ìÛ#@‰ÂÁâ)ƒì ¿ÕÈÜ#P踱èƒÄû¸‹]üÉÐU‰åWVSƒì ‹]f…Ûuè>Ünj¸ÿÿÿÿé"‰öƒ=ÀÛ#„“œúX‰ÇÇEð}ð™s¾ÀÜ#‹UðÑâUð‰ÐÁà)ÐÁàf9\,uHƒÀ0öD0 t ÿ€ÄÜ#ë6ƒìEðPjÿèW#‹MðI‰ÐÁà)ЋÅÄÜ#ƒÄ‹• Ü#QRÿP@ƒÄÿEð}ð™~“‰øPé}‰ö蓟…À„›œúX‰ÇÇEð}ð™w¾ÀÜ#‹Eð@‰ÂÁâ)Õf9\,uJƒÀ0öD0 t ÿ€ÄÜ#ë8vƒìEðPjÿèW#‹MðI‰ÐÁà)ЋÅÄÜ#ƒÄ‹• Ü#QRÿP@ƒÄÿEð}ð™~èj‰øPéԐúè"°‹ìÛ#R‰ÑÁá)Ñf‰ÍÈÜ#ÇEð}ð™w¾ÀÜ#‹Eð@‰ÂÁâ)Õf9\,uJƒÀ0öD0 t ÿ€ÄÜ#ë8v‹MðI‰ÐÁà)ЋÅÄÜ#ƒì‹• Ü#QRÿP@ƒÄEðPjÿèW#ƒÄÿEð}ð™~èÞ ¡ìÛ#@‰ÂÁâ)ƒì ¿ÕÈÜ#Pèj¯èÁƒÄû¸eô[^_]ÃU‰åSƒìúè;¯‹ìÛ#R‰ÑÁá)Ñf‰ÍÈÜ#ƒìh¤Ü#jèl–ƒÄUð¡¨Ü#;øÛ#|¡¤Ü#+ôÛ#‰Eð¡¨Ü#+øÛ#ë!‰ö¡¤Ü#+ôÛ#H‰Eð¡¨Ü#+øÛ#ʚ;‰B‹Mð ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ôºÓMb‰Ø÷êÁú‰ØÁø)ÂыìÛ#R‰ÐÁà)Ð) Å Ý#ƒì Qè. ƒÄƒ=üÛ#ÿtƒì ÿ5üÛ#ÿÈÛ#ÇüÛ#ÿÿÿÿƒÄ‹ -ìÛ#I‰ÐÁà)ЋÅÄÜ#ƒì‹… Ü#QPÿRLè{ ƒÄhìÛ#jÿèW#ÇìÛ#ÿÿÿÿÇÜ#ÿÿÿÿèV ¡ìÛ#@‰ÂÁâ)¿ÕÈÜ#‰$èã­è:ƒÄû‹]üÉÐU‰åƒìhL'"è( ƒÄÉÍvU‰åƒìjè ƒÄÉÉöU‰åƒìƒ=´W#u(èè
-ƒì ¡ìÛ#@‰ÂÁâ)¿ÕÈÜ#Pèt­ƒÄÉÍvU‰åWVSƒìhê,#è]$ƒÄ»ÀÜ#ëv‹Eð@‰ÐÁà)ЁLÃ0€ƒì hdÜ#èÊ+‰EðƒÄƒøÿ„“@‰ÐÁà)ÐöDÃ1@u¾‹UðR‰ÃÁã)ÃÁã¾ÀÜ#¡°W#‰3@£°W#‹E ‰DƒìjÿuƒÔÜ#Pè ¾ÆD'ƒÃ fÇD3‹Mf‹%ÿf‰D3
-f‹A f‰D3 ƒÄ‰Ø‰ñº‹]ƒ{tf‹Sf‰T‹UðR‰ÁÁá)ÁÁáY0‹U‹B -‰ƒÀÜ#¿ÄÜ#Ç;¾ÈÜ#¡ìÛ#@‰ÂÁâ)‹DÖ0‰3ºÌÜ#ǍAP‹]ð‰˜ÀÜ#Ç8ÇÿÿÿÿÇ0ÿÿÿÿǁ Ý#°Ç8Ç0ǁÁÀǁÀÜ#Ç9ºۍƒ€ 
-Ç…$Ý#Bƒúvì‹Eð@‰ÐÁà)ÐÁàÀǂÈÜ#ÿÿÿÿǂÌÜ#Ý#‰Ý#º‹Mðɍ€ ‰ö
-Ç…Ý#Bƒú~ì»ëC;ðÛ#sƒì‹ Ü#ÿuSÿPƒÄ…Àxß;ðÛ#u7‹]ð[‰ÂÁâ)ÂfÇÕèÜ#ƒìhdÜ#SèÚ)è¡ÕDŽ鄉ö‹Eð@‰ÐÁà)Ѝ4ʼnžÄÜ#ƒì‹ Ü#ÿuÿuðSÿP,ƒÄ…ÀyWfdžèÜ#ƒìhdÜ#ÿuðèz)èAÕDžë'è3Õǃ釃ì ÿuðè9èÕdž¸ÿÿÿÿƒÄëjƒE‹U‹zü…ÿtY‰ö¾ëF;5äÛ#s0ƒìµ‹ƒ€Ü#WVÿP ƒÄ…Àxۃ싃€Ü#WÿuðVÿP$ƒÄ;5äÛ#t‡ƒE‹M‹yü…ÿu©‹Eðeô[^_]ÉöU‰åƒìEPÿuÿu ÿuè`üÿÿƒÄÉÍvU‰åWVSƒì ‹} ƒt6‹EÑàE‰ÂÁâ)‹G‰ÕÌÜ#‰Æ‹UÑâU‰ÐÁà)Ѓ ÅðÜ#@ën‰öƒì ‹UÑâU‰ÐÁà)зÅîÜ#Pè@‹UÑâU‰ÑÁá)Ñ»ÌÜ#‰ˉƋEÑàE‰ÂÁâ)ƒÄƒ<Óuƒì ÿuèìèËÓLjëtv‹EÑàE‰ÂÁâ)»ÀÜ#·DÓ.ƃì ·GPjÿwVh8."è-‰ÁƒÄ f…Éu?ƒì‹UÑâU‰ÐÁà)зDÃ.PVèƒÄÿuèvèUÓlj¸ÿÿÿÿƒÄëN‹EÑàE‰ÂÁâ)Âf‰ ÕÈÜ#ƒìU‰ÐPjÿèW#ƒÄöGu ÿàÛ#ëvöGuÿ Ü#¸eô[^_]ÍvU‰åWVSƒì ‹M‹U ‹]œúX‰ÇEPSRQè­úÿÿ‰ÆƒÄƒþÿ„ɍv‰ÐÁà)ЋÅÄÜ#‹… Ü#ƒx(„èà…À‰€»;äÛ#svƒì‹€Ü#VSÿP(ƒÄC;äÛ#råv‰ÃÁã)ÃÁ㋃ÄÜ#ƒì‹… Ü#VPÿR0fǃèÜ#ƒÄhdÜ#Vè\&ƒÄè ÒLJ‰øP¸ÿÿÿÿë#vƒìSVèŽýÿÿƒÄº…À”ÂJ ։øP‰ðeô[^_]ÃU‰åVS‹u»;äÛ#svƒì‹€Ü#VSÿP(ƒÄC;äÛ#råv‰ÃÁã)ÃÁ㋃ÄÜ#ƒì‹… Ü#VPÿR0fǃèÜ#ƒÄhdÜ#Vè¬%ƒÄeø[^]ÉöU‰åVS‹]è ƒì ¡ìÛ#@‰ÂÁâ)¾ÀÜ#SÿTÖú‰$èn¡ìÛ#@‰ÂÁâ)¿DÖ‰$èn¦ƒÄeø[^]ÃU‰åWVSƒì‹]‹}úû™w! [‰ÈÁà)ÈÁàºÀÜ#öD0tfƒ|(u û¸ÿÿÿÿéDžÿy$[‰ÁÁá)Á Í°¸ÄÜ#‹<Çë ‰öƒÿv¿[‰ÁÁá)Á Í°‰Mä¹ÈÜ#‰Mì‹Uä‹
-‰Â)úƒÂ‰Ð¾º÷ö‰Eð‹uä;tMۍƒ€4‹MðىÈÁà)ȍ Å°‰ö2‹…$Ý#‹] ‰ƒÃ‰] B»‰Ðº÷ó‹]ì;uÔû‰øƒÄ[^_]ÐU‰åSƒì‹]‹ -ìÛ#I‰ÐÁà)ЍÅö‚ðÜ#tɍ€È‚xÝ#…$Ý#¡¤Ü#;ôÛ#|;ôÛ#uA¡¨Ü#;øÛ#}4ƒìSÿ5ìÛ#ÿ5øÛ#ÿ5ôÛ#ÿ5¨Ü#ÿ5¤Ü#h-#è8¶ƒÄ è@ ‹]üÉÍvU‰åWVS‹ -ìÛ#I‰ÐÁà)ЍÅöƒðÜ#„›ɍ€ȍ‹°ÈÜ#ºÄÜ#‹t‚`‹”À¸ÌÜ#94s‰4‹ìÛ#[‰ÁÁá)ÁÁፁÀ°ÀÜ#¿ÄÜ#B‰8±°‹†ÈÜ#@º‰Ñº÷ñ‰–ÈÜ#ۍƒ€ØÐÇD‡`ƒ<>wÿ>[^_]ÉöU‰åWVS‹M‹] ‹u‹}úù™w!I‰ÐÁà)ÐÁàºÀÜ#öD0tfƒ|(uû¸ÿÿÿÿëy…ÛtI‰ÂÁâ)‹ՀÝ#‰…ötI‰ÂÁâ)‹Õ|Ý#‰…ÿtI‰ÂÁâ)‹ՄÝ#‰ƒ}t(ɍ€ȍ I‰ÊÁâ)ÊÕxÝ#‹…$Ý#‹U‰û¸[^_]ÉöU‰å‹Múù™w!I‰ÐÁà)ÐÁàºÀÜ#öD0tfƒ|(uû¸ÿÿÿÿë7I‰ÂÁâ)ÂÁ⍂ÀǀÀÜ#ǀÄÜ#ǂ|Ý#û¸]ÍvU‰åWVSƒì ƒ=ìÛ#ÿt¡ìÛ#@‰ÂÁâ)ÂöÕðÜ#…3ƒ=ìÛ#ÿ„ƒìh¤Ü#j證ƒÄU表Ü#;øÛ#|¡¤Ü#+ôÛ#‰E表Ü#+øÛ#ë"v¡¤Ü#+ôÛ#H‰E表Ü#+øÛ#ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ìºÓMb‰Ø÷êÁú‰ØÁø)ÂыìÛ#R‰ÐÁà)Ð) Å Ý#ƒì QènüÿÿƒÄƒ=üÛ#ÿtƒì ÿ5üÛ#ÿÈÛ#ÇüÛ#ÿÿÿÿƒÄ‹ -ìÛ#I‰ÐÁà)Ћ<ÅÄÜ#ƒì‹½ Ü#QWÿP<ƒÄ¿4½ƒì ‹† Ü#WÿP$‰ÃƒÄƒûÿt%ƒì[‰ÐÁà)ЋÅÄÜ#‹… Ü#SPÿR4ƒÄ븅Àx»ƒûÿuG뫍v‹5ìÛ#‰Ü#‰ìÛ#[‰ÐÁà)Ð;ÅÝ#t0»ÀÜ#‰ö¡ìÛ#@‰ÂÁâ)‹TÓP‰ìÛ# R‰ÈÁà)È;TÃPu×;5ìÛ#tƒìhìÛ#jÿèW#ƒÄ‹ -ìÛ#I‰ÐÁà)ÐÁà¾ÀÜ#fÇD(‹¸ÄÜ#ƒì‹½ Ü#‹Ü#¸;ìÛ#•ÀPQWÿS8¡ìÛ#@‰ÂÁâ)ƒÄöDÖ1„Ü¡Ü#;ìÛ#…Ë¡¤Ü#‰EèMè¡ìÛ#@‰ÂÁâ)»ÌÜ#‹DÓ@º@B‰Ö™÷þ’’’Áâ‰Ö5¨Ü#‰q¿¡/¸D‰ø÷î‰×Áÿ‰ð™‰þ)Ö¡ìÛ#@‰ÂÁâ)‹\Ó@ºƒÞC‰Ø÷êÁú‰ØÁø)2Eè‹AºÊš;‰Ó™÷û‰Qjhd<"ÿuìÿuèÿÄÛ#‰ÃƒÄƒûÿuƒìÿ5ìÛ#jèû7ƒÄ‰üÛ#¡¤Ü#£ôÛ#¡¨Ü#£øÛ#eô[^_]ÉöU‰åWVSƒìÇPœ%úÿuèD»ƒÄ¿ÄÜ#¾ÀÜ#‰ö[‰ÂÁâ)ÂÁâÇ:ÿÿÿÿǂÌÜ#ÆDB fÇD0fÇD0
-fÇD0 fÇD0B0Ç0Ç8ǀÈÜ#ǀÌÜ#‚Ý#Ç@Çǂ Ý#BP‰0Ç8ÇD`DŽÐ‚˜ß#Ç@Ǎ‚àÇ0ÿÿÿÿÇ8ÿÿÿÿ‚°Ç8ǀÈÜ#ǀÌÜ#ÂÀÇ2Ç:ºۍƒ€ v
-ÇD‡`Bƒúvï[‰ÐÁà)ЍÅÀǀÈÜ#ÿÿÿÿǀÌÜ#ºۍƒ€ 
-DŽ†ÐBƒú~ìCû™Žƒþÿÿ»¹ÈÜ#[‰ÂÁâ)C‰DÑP‰Ãû˜~åÇÀ™%ÿÿÿÿ»™¹ÌÜ#[‰ÂÁâ)Cÿ‰DÑP‰Ã…ÛéÇÝ#ÿÿÿÿÇdÜ#ÇèÛ#ÇàÛ#Ç Ü#ÇÜ#ÿÿÿÿÇìÛ#ÿÿÿÿÇüÛ#ÿÿÿÿÇøÛ#ÇôÛ#ÇðÛ#ÇäÛ#ÇÀÛ#èÚè}è42ƒì ÿuèqÉÿÿ£hÜ#ƒÄ=×Övƒì h`-#èÇ$è »ƒÄ¸ƒ=hÜ#”À‰Eè]è¡hÜ#‰CÇPœ%躂ƒì S豌Ç$ø<"èÇÇ$8'"聎Ç$P<"蕎ƒÄjjèEÿðW#ƒÄh¤Ü#jèLƒèOùÿÿèê›f£`Ü#¡ìÛ#@‰ÂÁâ)¾ÀÜ#¿DÖ‰$èϛÇ$è7ŽÿìW#ÇPœ%ƒÄ»ƒ=èÛ#ŸÃSjèɃă= Ü#teè„ Ç´W#ƒìh¤Ü#j軂è^›f£`Ü#è³øÿÿÇ$P<"èǍ¡ìÛ#@‰ÂÁâ)¿DÖ‰$è7›Ç$蟍ƒÄÇPœ%ƒìSjèCèÇPœ%ƒÄjjè(ƒÄúƒ=èÛ#t"ƒìÿ5èÛ#h‹-#èP¬Ç$ÿÿÿÿèX¹ƒÄƒì jèK¹ƒÄeô[^_]ÃU‰åSƒìƒ=´W#…•èW‰…Àuú腚‹ìÛ#R‰ÑÁá)Ñf‰ÍÈÜ#‹E£èÛ#Ç´W#ƒ=ìÛ#ÿ„ƒìh¤Ü#j藁ƒÄUð¡¨Ü#;øÛ#|¡¤Ü#+ôÛ#‰Eð¡¨Ü#+øÛ#ë ¡¤Ü#+ôÛ#H‰Eð¡¨Ü#+øÛ#ʚ;‰B‹Mð ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ôºÓMb‰Ø÷êÁú‰ØÁø)ÂыìÛ#R‰ÐÁà)Ð) Å Ý#ƒì QèZôÿÿƒÄƒ=üÛ#ÿtƒì ÿ5üÛ#ÿÈÛ#ÇüÛ#ÿÿÿÿƒÄ‹ -ìÛ#I‰ÐÁà)ЋÅÄÜ#ƒì‹… Ü#QPÿR<ÇÜ#ÿÿÿÿÇìÛ#ÿÿÿÿƒÄèü‡…Àtƒì ¿`Ü#Pè,™ƒÄëvƒì ¿`Ü#Pè™èkƒÄû‹]üÉÉöU‰åSƒìÇEøÿÿÿÿ»º Ü#¡ Ü#ƒx(t1ƒì‹šUøRSÿP(ƒÄ…Àu¸ÿÿÿÿëCƒûwº Ü#‹šƒx(uи‹]üÉÉöU‰åƒìè è+ÉÉöU‰åƒìÇüÛ#ÿÿÿÿè§êÿÿÉÐU‰åSƒìœúX‰Ãƒ=Pœ%tƒ= Ü#t‰ØPëƒì jè–ýÿÿƒÄ‰ØP‹]üÉÉöU‰åƒìÿuèzýÿÿƒÄÉÐU‰åSƒì‹UœúX‰ÃƒìRjèZ‰ÂƒÄ‰ØP‰Ð‹]üÉÉöU‰å¸èÛ#ƒ=ìÛ#ÿt‹ìÛ#R‰ÐÁà)ЍÅ Ý#]ÉöU‰åSƒìœúX‰Ãƒ=Pœ%tƒ= Ü#t‰ØPëƒì ÿuèíüÿÿƒÄ‰ØP‹]üÉÐU‰å]ÍvU‰åWVSƒì ÇEðÇE컍[ …ƒ¹H…#t[¿@…#ƒ<9tP‹ìÛ#ҍ‚€Ð؍…оÀÜ#ƒ<0t+ûƒì ÿ40ÿ9ƒÄú‹ìÛ#ҍ‚€Ð؋´†Ð uìCƒû~Œƒ}ìt -ÿEðƒ}ðŽmÿÿÿeô[^_]ÐU‰åVSº¾@…#»D…#¹H…#vRÁàÇ0B‰Çƒú~ãÇ8‹#ÿÿÿÿÇ@‹#ÇH…#Ç@…#ÇD…#ÿÿÿÿ[^]ÐU‰åS‹Múƒ=@‹#ÿu û¸ ënv¡@‹#@Ç•H…#‰¡@‹#@‹…D…#£@‹#‹@‹U ‰…@…#º»ÀÜ#‰öҍ‚€ÐDŽƒÐBú™~ßû¸‹$ÉÃU‰åú¡ìÛ#À’ÂU‹•Ý#û]ÍvU‰å‹Múƒùw -Iƒ<…H…#u û¸ë%v¡ìÛ#À’ÂʋE ‰•Ý#û¸]ÃU‰åS‹]œúX‰Áƒûw -[ƒ<…H…#u‰ÈP¸ë.v[Áà‹@‹#‰D…#ǀH…#‰@‹#‰ÈP¸‹$ÉÃU‰åWVSƒì ¡ìÛ#‰Eð‰ÂÑâ‰ÐÁà)ЍÅ¿ÀÜ#öD0 tm‹E‰‚ŒÝ#‹UðÑâUð‰ÐÁà)ЁLÇ0@‹UðÑâUð‰ÐÁà)ЍÅÀºÈÜ#ƒ<ÿt,‹4v‰ÃÁã)ÃÁ㋃ÄÜ#ƒì‹… Ü#VPÿRD‰tPƒÄ¹»ÀÜ#;MðtI‰ÐÁà)ЋUð9TÃP„ˆAù™~ۋUðÑâUð‰ÐÁà)Ѓ<ÅÝ#t[»ÄÜ#ûƒì ‹UðÑâUð‰ÐÁà)ЋDÃPÿpÿƒÄú‹EðÑàEð‰ÂÁâ)ÕP‹‹@‰‹UðÑâUð‰ÐÁà)Ѓ|ÃPu«èJüÿÿƒì ‹EðÑàEð‰ÂÁâ)»ÀÜ#¿DÓPèÔyƒÄEðPjÿèW#‹Eð@‰ÂÁâ)ՃÄöD0@u%ƒì·D.P‹Eð@‰ÂÁâ)Âÿ4ÕÌÜ#èÁ ƒÄ»;äÛ#sƒì‹€Ü#ÿuðSÿP(ƒÄC;äÛ#rã‹MðI‰ÐÁà)ЋÅÄÜ#ƒì‹… Ü#QPÿRPÇìÛ#ÿÿÿÿÇÜ#ÿÿÿÿ‹Eð@‰ÂÁâ)ƒÄöÕðÜ#u&ÿ -àÛ#ƒ=àÛ#uBèZúÿÿë;ƒìRjèY+ƒÄëg‹Eð@‰ÂÁâ)ÂöÕðÜ#uÿ - Ü#ƒ= Ü#uèúÿÿƒìh¤Ü#jèÒyƒÄƒ=üÛ#ÿtƒì ÿ5üÛ#ÿÈÛ#ÇüÛ#ÿÿÿÿƒÄè­ïÿÿeô[^_]ÐU‰åVS‹uúv‰ÐÁà)ÐÁàºÀÜ#öD0ufƒ|(uèѼNJû¸ÿÿÿÿ麍v‰ÐÁà)ÐöÅñÜ#tû雉ö;5ìÛ#uJv‰ÐÁà)лÀÜ#‹DÃ0©t0©u)ƒì jè¥üÿÿ¡ìÛ#@‰ÂÁâ)¿DÓ‰$襑ƒÄ»ëvC;¸W#}ƒìÝÿ°d‹#Vÿ`‹#ƒÄ…Àtٍv‰ÐÁà)Ё ÅðÜ#û¸eø[^]ÍvU‰åWVSƒì ‹Ef‰Eòf…Àuèâ»ÇŒ¸ÿÿÿÿé‰öú¡Ü#@‰ÂÁâ)Âf‹Mòf; ÕìÜ#”Eñ¾¿ÀÜ#‰öv‰ÐÁà)ÐÁà‹T0÷Â…ˆƒÀ fƒ|8t}÷Âuuf‹Mòf9L8 uj;5ìÛ#u!÷Ât÷Âuƒì jè{ûÿÿƒÄëC‰ö»ëC;¸W#}ƒìÝÿ°d‹#Vÿ`‹#ƒÄ…Àtٍv‰ÐÁà)ЁLÇ0Fþ™ŽNÿÿÿ€}ñt(ƒì ¡Ü#@‰ÂÁâ)¿ÕÈÜ#P萃Äëvû¸eô[^_]ÉöU‰åWVSƒì ¾¿ÀÜ#v‰ÐÁà)ÐÁàfƒ|(tL÷D0
-uB»ë‰öC;¸W#}ƒìÝÿ°d‹#Vÿ`‹#ƒÄ…Àtٍv‰ÐÁà)ЁLÇ0Fþ™~–eô[^_]ÉöU‰åSƒì¡ìÛ#@‰ÂÁâ)»ÀÜ#‹DÓ0©t7©u0©t)ƒì jè"úÿÿ¡ìÛ#@‰ÂÁâ)¿DÓ‰$è"ƒÄ‹]üÉÉöU‰åS‹M‹] ¡¸W#ʼnŠ`‹#‰šd‹#@£¸W#‹$ÉÍvU‰åƒìúÿuè½ùÿÿ¡ìÛ#@‰ÂÁâ)¿ÕÈÜ#‰$躎ƒÄÉÐU‰åVS¶uœúX‰Ãƒ=”Ž#ÿuèH¹Ç‚‰ØP¸ÿÿÿÿéۋ -”Ž#‰ÊÁâ‹‚ Œ#£”Ž#‹E‰‚Œ#‹E ‰‚Œ#‰ðƒà‰‚Œ#‰ðƒàƒøtOƒø
-ƒøt -ësvƒøtSëi‰ÈÁàǀ Œ#ÿÿÿÿƒ=€Ž#ÿu‰ -€Ž#ë¡„Ž#Áà‰ˆ Œ#‰ -„Ž#ëH‰ö‰ÊÁ⡈Ž#‰‚ Œ#‰ -ˆŽ#ë.‰ÊÁâ¡ŒŽ#‰‚ Œ#‰ -ŒŽ#ë‰ÊÁ⡐Ž#‰‚ Œ#‰ -Ž#‰ØP¸[^]ÐU‰åƒìƒ=ðÛ#uƒì hÀ-#èŒÇ$謃ġðÛ#P‰ðÛ#ÉÐU‰åƒìƒ=äÛ#uƒì hß-#èPÇ$èÌ«ƒÄ¡äÛ#P‰äÛ#ÉÐU‰åWVS‹E‹u ‹}»‹HÇöt<€9t5‹ ‰‡€: t€:t‰öC€< t€< uó€< uÆ Cÿ€< uÌÿ[^_]ÐU‰åWVSì¬‹EµTþÿÿ½Xþÿÿ»‹HDžTþÿÿöt<€9t5‹ ‰‡€: t€:t‰öC€< t€< uó€< uÆ Cÿ€< uÌÿƒì…XþÿÿPÿµTþÿÿèU¸ÿÿƒÄeô[^_]ÉöU‰å¸¹ Œ#v‰ÂÁâ@‰
-ƒø&~òÇ|Ž#ÿÿÿÿÇ€Ž#ÿÿÿÿÇ„Ž#ÿÿÿÿLjŽ#ÿÿÿÿÇŒŽ#ÿÿÿÿǐŽ#ÿÿÿÿÇ”Ž#]ÉöU‰åWVSƒì ‹E‹} ƒøt4ƒø ƒøtéЃøt3ƒøtB鳐‹€Ž#Ç€Ž#ÿÿÿÿë:‰ö‹ˆŽ#LjŽ#ÿÿÿÿë&‰ö‹ŒŽ#ÇŒŽ#ÿÿÿÿë‰ö‹Ž#ǐŽ#ÿÿÿÿÇÀÛ#ƒûÿtM¾ Œ#…ÿt‰ØÁàƒ¸Œ#uƒì ‰ØÁàÿ°Œ#ÿŒ#ƒÄ‰Ù‰ØÁà‹0‰Â¡”Ž#‰2‰ -”Ž#ƒûÿu¸ÇÀÛ#eô[^_]ÉöU‰åƒìEüPEøPEôPEðPèI‡Ç$ Ž#èÅӃÄjjhÿÿjh¤Ž#h Ž#èðɃÄjjhÿÿÿhhÀŽ#h Ž#èÐɃÄjjhÿÿÿþhh܎#h Ž#è°ÉƒÄ ƒ}ütƒì‹EüHPÿuøh Ž#èzȃă}ôtƒìÿuôÿuðh Ž#è^ȃÄÉÐU‰åƒì‹E…Àu¸ëƒìjPh Ž#èʃÄÉÍvU‰åƒìÿuÿuÿu ÿuh Ž#è¸ËƒÄ ÉÍvU‰åƒì ÿuÿuÿuÿuÿu ÿuh Ž#è²ËƒÄ ÉÐU‰åƒì ÿu ÿuh Ž#èfЃÄÉÐU‰åƒìÿuh Ž#èM΃ÄÉÃU‰åƒìÿuh Ž#èM҃ÄÉÃU‰åƒì jÿuh Ž#èSɃÄÉÉöU‰åƒì ÿu ÿuh Ž#èþσÄÉÐU‰åƒìh Ž#è ÎÇ$ Ž#è ҃ÄÉÍvU‰åWVSƒì} ‹uEðPh4.#VèÖ¥‰ÃƒÄƒûuƒ}ðvÇEðƒÆë ‰öÇEð‹Eðº;¼W#~hƒìWVh#蜃Äj
-VèK›ƒÄ»…À•ÃœúX‰Æƒìh#‹Eðÿ4…ÀW#h9.#è]™ƒÄ…Ûuƒì hÜ.#èI™ƒÄ‰ðPº‰Ðeô[^_]ÍvU‰åVSƒìu ‹]EôPh4.#S襃ăøuƒ}ôvÇEôƒÃëÇEô‹Eôº;¼W#~JƒìVSh#èB›ƒÄj
-S臚ƒÄœúX‰Ãƒìh#‹Eôÿ4…ÀW#h9.#裘ƒÄ‰ØPº‰Ðeø[^]ÉöU‰åVSƒì@‹u‹] ‹EfÇEÈÇEÌÇEÐfÇEÔÇEàÇEäÇEìÇEð‰EØÇEÜÇEè…ÛtT‹C‰E̋C‰EЃ{u
-ÇEÜ1됃eÜߋC ‰EàÇEÀƒì ÿ5“#è)7ƒÄ+C ‰EċC‰Eì‹C‰EðëD‰öÇEÌÇEЃMÜ ÇEàÇEÀƒì ÿ5“#èâ6ƒÄ‰EÄÇEìÇEðèI±‹ƒì jEÀPEÈPÿuhA.#èAÞÿÿ‰ƒÄ ƒøÿt ƒì PèòÒÿÿƒÄ豉¸ƒ>ÿ”ÀHƒàêƒÀeø[^]ÍvU‰åƒìÿ5“#èc6ƒÄÉÉöU‰åƒìÿ5“#èc6ƒÄÉÉöU‰åƒìÿ5“#è{5ƒÄÉÉöU‰å‹E‹U ‹M£“#‰“#‰ -“#]ÐU‰åVS‹]è°‹0ƒì Sètóÿÿ‰Ãèm°‰0ƒÄ¸…Û•À@eø[^]ÃU‰åƒìúÿuÿu ÿuÿ5“#èé5ƒÄûÉÍvU‰åWVSƒì ‹}‹uúÿ6ÿu Wÿ5“#è3‰ÃƒÄ…Ûu#ƒìÿ5“#èx5ƒÄ+PWÿ5“#èffƒÄû‰Øeô[^_]ÃU‰åSƒì ‹] Sÿuè¡eƒÄÿ5“#è75ƒÄ+‰¸‹]üÉÉöU‰åVSƒì‹u‹] …Ûtƒ;uÇEôƒìEôPë7ƒ;uÇEðƒìEðPë!vÇEèƒì jè_þÿÿ+CUè‰BƒÄRVèT*ƒÄeø[^]ÉöU‰åWVSƒì‹u ‹}ÇEðÿ5“#è“4‰ÃƒÄ9Þƒþ} ¸ëG‰öƒì ÿuèµ*ƒÄ W‰Ø)ðPÿuè eƒÄ…ÀtÇEð…ÿt‰Ø+‰ƒì ÿuèÙ*‹EðƒÄeô[^_]ÍvU‰åƒì‹Eúƒ8u -ÇûÿU ëû¸ÉÃU‰åWVSƒì¿ÿÿÿÿ‹E ‹‹E@‰ÐÁà)ÐÁà‹˜ß#‰U苀œß#‰Eìƒùÿtw ‰ÆȉÂÁâ)‹Eè‰Ã;՘ß#|[‰Eäv1‰ÐÁà)ЍÅ;š˜ß#u ‹Eì;‚œß#|1‰Ï‰ÐÁà)Ћ ÅÝ#ƒùÿt4 1‰ÐÁà)Ћ]ä;Řß#}«ƒÿÿt‰ÐÁà)ЋU‰ÅÝ#ë‹E‹U ‰ƒùÿtI‰ÐÁà)ЋU‰ÅÝ#‹E@‰ÐÁà)ЍÅP‰ˆÈÜ#‰¸ÌÜ#ƒÄ[^_]ÍvU‰åWVSƒì¿ÿÿÿÿ‹E ‹‹E@‰ÐÁà)лÄÜ#‰]ð‹´ÃЃùÿtCI‰ÐÁà)Ð;´ÃÐr0»ÈÜ#‰Ï‰ÐÁà)ЋLÃPƒùÿtI‰ÐÁà)ЋUð;´ÂÐsՃÿÿt‰ÐÁà)ЋU‰ÅÝ#ë
-‰ö‹E‹U ‰ƒùÿtI‰ÐÁà)ЋU‰ÅÝ#‹E@‰ÐÁà)ЍÅP‰ˆÈÜ#‰¸ÌÜ#ƒÄ[^_]ÍvU‰åWVS‹}‰ÐÁà)ЍÅP‹ÌÜ#‹°ÈÜ#ƒúÿu ‹E ‰0ë#‰öR‰ÁÁá)Á»ÈÜ#‰ÐÁà)ЋDÃP‰DËPƒþÿt!v‰ÁÁá)Á»ÌÜ#‰ÐÁà)ЋDÃP‰DËP[^_]ÃU‰åS‹]‹ ‰Èƒùÿt/I‰ÐÁà)ЋÅÝ#‰ƒøÿt@‰ÐÁà)ÐÇÅÝ#ÿÿÿÿ‰È‹$ÉÃU‰åS‹]‹M ƒ9ÿt‹@‰ÂÁâ)‰ÕÝ#[‰ÂÁâ)ÕP‹‰‚ÈÜ#ǂÌÜ#ÿÿÿÿ‰‹$ÉÃU‰åWVSƒì ‹M‹] ‹}ÇEðú¡ìÛ#@‰ÂÁâ)4ÕÀÜ#…ÿt‹F8‰…ÛtBƒùt"ƒù ƒùt ë*‰öƒùtë!‹F8 ‰F8ë‰ö‹÷Ð!F8ëv‹‰F8ëÇEð‹F8‰Ã÷Ћ •#‰Ñ…ÂtB‰ö‰Ø÷л!Ètv‰Ú©u
-CÑøuòºƒì R范ċ^8‰Ø÷Ћ - •#…ÁuÀ‹F8‰Ã÷ЋV<‰Ñ…Ât=‰Ø÷л!Ètv‰Ú©u
-CÑøuòºƒì Rè|ƒÄ‹^8‰Ø÷ЋN<…ÁuÃû‹Eðeô[^_]ÍvU‰åVS‹u‹M ¸…É„¸ƒù‡òv‰ÐÁà)Ðfƒ<ÅèÜ#u -¸éӍvú‰ÈÁàö€(“#uƒ¸ “#uû魉öv‰ÐÁà)ЍÅüÜ#ƒùvèÍ©Çë
-¸Óà »ëC;äW#}ƒìÝÿ°ä•#Vÿà•#ƒÄ…Àtٍv‰ÐÁà)ЍÅfƒ»èÜ#u&ƒìh$•#VèÔüÿÿ‹ƒÄÜ#ƒÄ‹… Ü#VPÿRDƒÄèSm…Àuèû¸eø[^]ÐU‰åWVSƒì‹]‹U ƒûvè©Ç¸ÿÿÿÿévœúX‰Á‰Mðƒ}t‰ÞÁæÆ “#ü¹‹}ó¥…Òt‰ßÁçÇ “#ü¹‰Öó¥…Ò„ºöB…°ƒ:‡§ƒ<@•#ÿtq4‰uìº@•#‹@Áà‰Eè‰ÇƒÇ‹ -`¢%¸`œ%‹U苉E䋇dœ%©t -ƒàý‰‡dœ%ë‰ö¾@•#‹Uì‹2@‰ Õ`œ%‰Áƒ}äÿu»‰ -`¢%ǝ@•#ÿÿÿÿƒûv -è¨Çë¸þÿÿÿˆÙÓÀ! •#‹uð‰ðP¸ƒÄ[^_]ÐU‰åWVSƒì,‹] ¸…Û„~¸ƒû‡pœúX‰Â‰UԉÞÁæ}ØÆ “#ü¹ó¥÷Eàuƒ}Øu ‰ÐPé5vƒûv膧Ǹÿÿÿÿ됸ˆÙÓà# •#…Àt -‹UԉÐPéûƒûvèN§Çë‰ö¸ˆÙÓà  •#‹5$•#ƒþÿ„ô¸‰ÇˆÙÓçvv‰ÐÁà)ЍÅÝ#ƒûvèý¦Ç¸ÿÿÿÿë‰ú#‰Ð…À„–v‰ÐÁà)ÐÁàfƒ¸èÜ#uüÜ#ƒûv -輦Çë 8ƒìh$•#Vèúÿÿv‰ÃÁã)ÃÁ㋃ÄÜ#ƒÄ‹… Ü#VPÿRDÃà¾ÀÜ#ƒÄƒ<3ÿtƒì ÿ43ÿÈÛ#Ç3ÿÿÿÿƒÄ‹MԉÈPéîv‰ÐÁà)Ћ4ÅÝ#ƒþÿ…ÿÿÿ¾¸‰ÇˆÙÓç‰öv‰ÐÁà)ÐÁàfƒ¸èÜ#„…øÜ#ƒûvèö¥Ç¸ÿÿÿÿ됉ú#‰Ð…Àu^v‰ÐÁà)ЍÅüÜ#ƒûvèÃ¥Çëv 8»ëvC;äW#}0ƒìÝÿ°ä•#Vÿà•#ƒÄ…ÀtÙëvFþ™ŽSÿÿÿèzi…Àuè9 -‹MԉÈP¸eô[^_]ÐU‰åWVSƒì,¸ƒ} „T¸ƒ} ‡EœúX‰Â‰Uԋu Áæ}ØÆ “#ü¹ó¥÷Eàuƒ}Øu ‰ÐPé ‰ö÷Eàu;ƒ} vèܤǸÿÿÿÿëv¸ŠM Óà# •#…Àt ‹UԉÐPéÃ=`¢%ÿu‹MԉÈP¸ 鮉ö‹5`¢%vÁà¹`œ%‹‰`¢%‹U ‰dœ%‹U‰hœ%‹U‰lœ%‹ìÛ#‰pœ%Çÿÿÿÿ‹E Áàº@•#ƒ<ÿu‰4ë>‰ö‹M ‹@•#‰ÁЃ<Å`œ%ÿt»`œ%
-‹Í 
-ƒ<ÃÿuîR‰4Å`œ%ƒ} vèé£Ç됸ŠM Óà  •#‹5$•#ƒþÿ„û¸‰ÃŠM Ó㐍v‰ÐÁà)ЍÅÝ#ƒ} v蘣Ǹÿÿÿÿë v‰Ú#‰Ð…À„šv‰ÐÁà)ÐÁàfƒ¸èÜ#uüÜ#ƒ} vèS£Çëv ƒìh$•#Vè¨öÿÿv‰ÃÁã)ÃÁ㋃ÄÜ#ƒÄ‹… Ü#VPÿRDÃà¾ÀÜ#ƒÄƒ<3ÿtƒì ÿ43ÿÈÛ#Ç3ÿÿÿÿƒÄ‹MԉÈPé÷v‰ÐÁà)Ћ4ÅÝ#ƒþÿ…ÿÿÿ¾¸‰ÃŠM Ó㐍v‰ÐÁà)ÐÁàfƒ¸èÜ#„…øÜ#ƒ} v艢Ǹÿÿÿÿë‰Ú#‰Ð…Àu^v‰ÐÁà)ЍÅüÜ#ƒ} vèV¢Çë‰ö »ëvC;äW#}0ƒìÝÿ°ä•#Vÿà•#ƒÄ…ÀtÙëvFþ™ŽSÿÿÿèf…Àuƒ=àW#uèÄ ‹MԉÈP¸eô[^_]ÃU‰åWVSƒì‹u‹]¡ìÛ#@‰ÂÁâ)<ÕÀÜ#èŠú¡ •##„Hºv©u=BÑøuô¾ƒ<µ@•#ÿue‹E ‰0Ç@Ç@W<ƒþvèa¡Ç됉Öëɸþÿÿÿ‰ñÓÀ!ƒþvè?¡Çëv¸þÿÿÿ‰ñÓÀ! •#ûév µº@•#‹[‹Å`œ%‰ƒøÿu"ƒþvèñ Ç됸þÿÿÿ‰ñÓÀ! •#W<ƒþv -èÌ Çë ¸þÿÿÿ‰ñÓÀ![Áâ¹dœ%‹
-‹u ‰‹‚hœ%‰F‹‚lœ%‰FƒÂ‹
-©t ƒàý‰
-ëv[¡`¢%‰Õ`œ%‰`¢%ûéI‰Öë‹G<#tUº©uéBÑøuô¾‹E ‰0Ç@Ç@W<ƒþvè Çëv¸þÿÿÿ‰ñÓÀ!ûéëv…Ûtƒ;uƒ{u -û¸ éÓ‰ö‹‰G@úèu‹ìÛ#R‰ÑÁá)Ñf‰ÍÈÜ#ƒìh¤Ü#jèN\ƒÄU表Ü#;øÛ#|¡¤Ü#+ôÛ#‰E表Ü#+øÛ#롤Ü#+ôÛ#H‰E表Ü#+øÛ#ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰ÁáºÓMb‹Eì÷êÁú‹EìÁø)ÂыìÛ#R‰ÐÁà)Ð) Å Ý#ƒì QèÏÿÿƒÄƒ=üÛ#ÿtƒì ÿ5üÛ#ÿÈÛ#ÇüÛ#ÿÿÿÿƒÄ‹ -ìÛ#I‰ÐÁà)ЋÅÄÜ#ƒì‹… Ü#QPÿRHƒÄh$•#ÿ5ìÛ#èæòÿÿ¡ìÛ#@‰ÂÁâ)ÂfÇÕèÜ#ƒÄ…Û„’ƒìEàPjè[U؃Ä‹Eà‰E؋EäC‰B…Ày -ÿM؁Bʚ;됁zÿɚ;~ ÿjʚ;ÿ5ìÛ#hän"ÿuÜÿuØÿÄÛ#‰ÃƒÄƒûÿuƒìÿ5ìÛ#jèù ƒÄ¡ìÛ#@‰ÂÁâ)‰Õ ß#ÇìÛ#ÿÿÿÿÇÜ#ÿÿÿÿè‡Ðÿÿƒì ¡ìÛ#@‰ÂÁâ)»ÀÜ#¿DÓPèsè”ÇG@¡ìÛ#@‰ÂÁâ)ƒÄöDÓ2tû¸ é~‰Öë%¡ •##„ûº‰ö©uáBÑøuô¾ƒ<µ@•#ÿu=‹M ‰1ÇAÇAƒþv -è@Çë¸þÿÿÿ‰ñÓÀ! •#ûé vƒì µƒ@•#Pèúðÿÿ‰ÇƒÄƒ»@•#ÿu#ƒþvèòœÇë‰ö¸þÿÿÿ‰ñÓÀ! •#Áâ¹dœ%‹
-‹] ‰‹‚hœ%‰C‹‚lœ%‰CƒÂ‹
-©t ƒàý‰
-ëv¡`¢%‰Õ`œ%‰=`¢%ûël‹G<#…Àuû¸ë`v‰Öë‹G<º#t ©uéBÑøuô¾‹E ‰0Ç@Ç@W<ƒþvè/œÇëv¸þÿÿÿ‰ñÓÀ!û¸eô[^_]ÍvU‰åWVSƒì ‹}¡ìÛ#@‰ÂÁâ)4ÕÀÜ#è¹ú‹F<#…Àt è¦û颋‰F@úèq‹ìÛ#R‰ÑÁá)Ñf‰ÍÈÜ#ƒìh¤Ü#jè6XƒÄU表Ü#;øÛ#|¡¤Ü#+ôÛ#‰E表Ü#+øÛ#롤Ü#+ôÛ#H‰E表Ü#+øÛ#ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ìºÓMb‰Ø÷êÁú‰ØÁø)ÂыìÛ#R‰ÐÁà)Ð) Å Ý#ƒì QèúÊÿÿƒÄƒ=üÛ#ÿtƒì ÿ5üÛ#ÿÈÛ#ÇüÛ#ÿÿÿÿƒÄ‹ -ìÛ#I‰ÐÁà)ЋÅÄÜ#ƒì‹… Ü#QPÿRHƒÄh$•#ÿ5ìÛ#èÍîÿÿ¡ìÛ#@‰ÂÁâ)»ÀÜ#fÇDÓ(ÇìÛ#ÿÿÿÿÇÜ#ÿÿÿÿè Íÿÿ¡ìÛ#@‰ÂÁâ)¿DÓ‰$è™oè‹F<#ƒÄ…Àuû¸ë èÿû¸eô[^_]ÐU‰åSƒì‹]úEðPjè¢VƒÄƒ=ȕ#ÿu
-ÇEèëWMèUð¡Ä•#;B|¡À•#+Eð‰Eè¡Ä•#+Bëv¡À•#+EðH‰Eè¡Ä•#+Eôʚ;‰Aƒì ÿ5ȕ#ÿÈÛ#ƒÄ…ÛtN]ð‹Eð£À•#‹Eô£Ä•#jhDo"ÿuôÿuðÿÄÛ#‰ÃƒÄƒûÿuƒìÿ5ìÛ#jè:ƒÄ‰ȕ#ë -vÇȕ#ÿÿÿÿû‹Eè‹]üÉÐU‰åVSƒì‹uƒ<µ@•#ÿuC‰uèÇEìÇEð¡ìÛ#‰Eôƒþvèü˜Ç鮐¸þÿÿÿ‰ñÓÀ! •#降 µº@•#‹[‹Å`œ%‰ƒøÿu"ƒþv豘Ç됸þÿÿÿ‰ñÓÀ! •#[Áà¹dœ%‹‰U苐hœ%‰U싐lœ%‰Uð‹pœ%‰UôP‹
-©tƒàý‰
-ë[¡`¢%‰Õ`œ%‰`¢%ƒìEèPVè
-ƒÄeø[^]ÃU‰åVSƒì¡ìÛ#@‰ÂÁâ)4ÕÀÜ#‹F0©…Í -‰F0‹F8‰Ã÷Ћ •#‰Ñ…ÂtA‰Ø÷л!Ètv‰Ú©u
-CÑøuòºƒì Rè„þÿÿƒÄ‹^8‰Ø÷Ћ - •#…ÁuÀ‹F8‰Ã÷ЋV<‰Ñ…ÂtZ‰Ø÷л!Ètv‰Ú©u
-CÑøuòº‰UèÇEìÇEð¡ìÛ#‰EôƒìEèPRèƒÄ‹^8‰Ø÷ЋN<…Áu¦f0ÿïÿÿeø[^]ÃU‰åWVSƒì,‹]œúX‰Â‰UÌ¡ìÛ#@‰ÂÁâ)ÕÀÜ#‰UЉÞÁæ}ØÆ “#ü¹ó¥÷Eàuƒ}Ø„îƒ}Øÿ„ä÷EàuCƒ}Øu=ƒìShL.#èw}ƒÄ÷Eàtƒì‹M ÿqhb.#èX}ƒÄƒì jè—ÓÿÿƒÄ‹UЋB8‰EԉƍUԃûv -èh–Çë ¸ˆÙÓà ‹EÔ E܉EԋUЃÂ<ƒûv -è<–Çë ¸þÿÿÿˆÙÓÀ!‹EԋUЉB8û÷Eàtƒìjÿu SÿUäëƒìj‹M ÿqSÿU؃Äú‹EЉp8‹ỦÐPeô[^_]ÃU‰åWVSƒì ‹}‰ÐÁà)ÐÁà¾ÀÜ#fƒ|(uF˜àƒ<3ÿtƒì ÿ43ÿÈÛ#Ç3ÿÿÿÿƒÄƒìh$•#Wèúèÿÿ‰ÂÁâ)‹ÕÄÜ#ƒÄë ‰ÐÁà)ÐÁàfƒ¸èÜ#u!‹ÄÜ#ƒì‹• Ü#WRÿPD¸ƒÄë‰ö¸eô[^_]ÍvU‰åWVSƒì º¿(“#¾$“#»,“#¹@•#‰ö‰ÐÁàǀ “#Ç8Ç0ÇÇ‘ÿÿÿÿBƒúvϺ»`œ%¹dœ%RÁàB‰ÇDƒú>~éÇH¢%ÿÿÿÿÇ\¢%Ç`¢%Ç •#Ç$•#ÿÿÿÿÇȕ#ÿÿÿÿº¹€–#»„–#‰öRÁàÇÇÿÿÿÿÆDBƒú~áƒìjhÄi"ènÚÿÿƒÄeô[^_]ÍvU‰å‹EǸ]ÐU‰å‹EÇÿÿÿÿ¸]ÐU‰åƒì‹U‹M ƒùvèê“Ǹÿÿÿÿ됸Óà ¸ÉÃU‰åƒì‹U‹M ƒùv趓Ǹÿÿÿÿ됸þÿÿÿÓÀ!¸ÉÃU‰åƒì‹M ƒùv腓Ǹÿÿÿÿë ¸Óà‹U#ÉÉöU‰åƒì ÿuÿu ÿuèÔçÿÿƒÄÉÍvU‰åWƒì$‹UEè‰E丹‹}äüó«ƒìjÿuäRèBñÿÿƒÄ…Àu -‹Uè‹E ‰¸‹}üÉÐU‰åƒì jÿu ÿuèñÿÿƒÄÉÃU‰åƒì‹E…Àu¸ëƒìPÿu ÿuèíðÿÿƒÄÉÃU‰åƒìÿuÿ5ìÛ#è`èÿÿƒÄÉÍvU‰åVSƒì ‹]‹E ‰EèÇEìÇEð脒‹0ƒìEØPEèPSèAéÿÿƒÄ»ÿÿÿÿ…Àu ÷Eàu‹]ØèT’‰0‰Øeø[^]ÐU‰å‹M¡ìÛ#@‰ÂÁâ)¡ •# ÕüÜ#‰¸]ÉöU‰åSƒì‹E‹U ú‹ìÛ#‰ìÛ#ÇàW#jPj jèœìÿÿƒÄÇàW#‰ìÛ#û‹]üÉÍvU‰åS‹M‹] ¡äW#ʼnŠà•#‰šä•#@£äW#‹$ÉÍvU‰åVS‹]Cÿƒøv苑Ç~¸ÿÿÿÿëp‰öœúX‰Æ[€<…ˆ–#u‰ðPèa‘ǸÿÿÿÿëF[Áâ¹€–#‹E ‰
-‹E‰‚„–#ÆD
-ƒìjh„o"Sè¹T·Ã‰$èÒeƒÄ‰ðP¸eø[^]ÍvU‰åƒì¸ÉÍvU‰åƒì ‹E‰EèÇEìÇEð‹ìÛ#‰UôUèRPè›ùÿÿƒÄÉÉöU‰åVS‹uv‰ÃÁã)ÃÁã¸ÀÜ#DŽàÿÿÿÿL0ƒìh$•#Vèõãÿÿ‹ƒÄÜ#ƒÄ‹… Ü#VPÿRDèç·ÿÿƒÄeø[^]ÐU‰åƒìÇȕ#ÿÿÿÿjjèWèÿÿè¾·ÿÿƒÄÉÐU‰åƒìEüÇEüÿÿÿÿPèôÿÿƒÄÉÐU‰åƒì‹E‹‰EüEüPjÿèW#‹UüRÁเ–#ƒÄƒ<t ûƒì RÿƒÄú‹Eü@ƒì ÿ4…„–#覱ÿÿƒÄÉÐU‰åWVSƒì ‹u ‹]ƒ}t讏Ǹÿÿÿÿén‰öúƒ=@ž#ÿt ƒ=`¢%ÿuûèƒÇ ¸ÿÿÿÿéCv¡@ž#‰‹@ž#Õ)пD—#‹DÇ0£@ž#‹Õ)й@—#ÇDÁ0…öu8‹Õ)ÐÇÁ‹Õ)ÐÇÇ‹Õ)ЉÅH—#닍<Å)Ǎ<ý@—#ü¹ó¥‹Õ)ЍŃº@—#u#¡`¢%‰‚h—#@Áàƒˆtœ%‹€`œ%£`¢%‹Õ)ÐÇÅT—#ÿÿÿÿ‹Õ)ЍÅX—#Ç@NjÕ)ЍÅ`—#Ç@NjÕ)ÐÇÅl—#û¸ƒÄ [^_]ÃU‰åSƒì‹]ƒûwúÝ)؃<Åp—#uûèÿÇ¸ÿÿÿÿ閍vÝ)ØÁàǀp—#ƒÀºD—#ƒ<ÿtƒì ÿ4ÿÈÛ#ƒÄÝ)ØÁàƒ¸@—#uE‹h—#R Åötœ%u¡`¢%‰`œ%‰`¢%Ý)؋Åh—#@ƒ$Åtœ%üû¸‹]üÉÃU‰åWVSƒìL‹E‰E´Áà+E´Áàƒ¸@—#…‹P ‹‚H—#@öÅtœ%t¸L—#ƒ< „ôÿéì‰ö‹M´Áá+M´Ááy LJL—#¾H—#‹7@‹`¢%‰Ý`œ%£`¢%jÿ41ÿ±D—#jèhçÿÿ‹7@ƒ Åtœ%錐‹E´Áà+E´Áà¹@—#ƒ<uwPƒ<
-tÿ°H—#ÿ°L—#ÿ4
-ëQvÇEÈÇEÌÇEÐÇEÔÇEØÇEÜÇEà‹E´Áà+E´ÁàH—#Rÿ°L—#EÈPEÄPèÙÙÿÿƒÄ‹E´Áà+E´Åƒ¸H—#u -ƒ¸L—#„Àº`—#‹E´Áà+E´ŋ‰E¸M¸‹D‰A‹E¸ƒX—#‰ƒ`—#‹Aƒ\—#‰B…Àyÿ‹`—#Bʚ;ë‰özÿɚ;~ ÿjʚ;‹E´Áà+E´ÿu´hPr"ÿ4Åd—#ÿ4Å`—#ÿÄÛ#‰ÃƒÄƒûÿuƒìÿ5ìÛ#jè+ùÿÿƒÄ‹E´Áà+E´‰ÅT—#ë‰ö‹E´Áà+E´ÇÅT—#ÿÿÿÿeô[^_]ÃU‰åWVSƒì‹u‹}ÇEäƒþw3ƒ}t-‹Exÿɚ;w!‹]{ ÿɚ;wúõ)ðƒ<Åp—#uûèÁŠÇ¸ÿÿÿÿ鐅ÿ„·õ)ðƒ<ÅT—#ÿuÇG ÇGëwƒìEèPjèGÇEäƒÄ¹`—#õ)ðō]è‹D;C|‹+Eè‰G‹D+Cë(¹`—#õ)òÁâ‹+EèH‰G‹D+Eìʚ;‰G ¹X—#õ)ðÁà‹‰‹D‰Gõ)ðÅºD—#ƒ<ÿtƒì ÿ4ÿÈÛ#ƒÄ‹Eƒxu
-ƒx „þºX—#õ)ð ŋ]‹‰
-‹C‰D
-÷E t¸`—#‹S‰‹S ‰Tëmvƒ}äuƒìEèPjèøEƒÄõ)ð ō‘`—#‹Eè‹]C‰`—#‹EìC ‰B…Àyÿ‰`—#Bʚ;ëzÿɚ;~ ÿjʚ;õ)ðVhPr"ÿ4Åd—#ÿ4Å`—#ÿÄÛ#‰ÃƒÄƒûÿuƒìÿ5ìÛ#jè­öÿÿƒÄõ)ð‰ÅT—#û¸eô[^_]ÃU‰åWVSƒì ‹]‹} ƒûwúÝ)؃<Åp—#uûèzˆÇ¸ÿÿÿÿ鷉öÝ)؃<ÅT—#ÿuÇG ÇGëoƒìEèPjèÒDƒÄ¹`—#Ý)؍ōuè‹D;F|‹+Eè‰G‹D+Fë'¹`—#Ý)ÚÁâ‹+EèH‰G‹D+Eìʚ;‰G ¹X—#Ý)ØÁà‹‰‹D‰Gû¸eô[^_]ÍvU‰åƒìƒ}t藇Çëv臇ǸÿÿÿÿÉÉöU‰åƒìƒ}tèg‡Ç¸ÿÿÿÿë‰öƒì ÿu èuÄÿÿ¸ƒÄÉÍvU‰åƒì‹E ƒ}tè,‡Ç¸ÿÿÿÿëv…Àt -ÇÇ@è¸ÉÃU‰åƒì‹UƒúwúÕ)Ѓ<Åp—#uûè܆ǸÿÿÿÿëvÕ)ЋÅl—#ûÉÐU‰åWVS¹»D—#¿@—#¾L—#‰öÍ)ÈÁàÇDÿÿÿÿX—#ÇBǍP0Ç:ÇD A‰‰Áƒù~ºÇ<ž#ÿÿÿÿÇ@ž#[^_]ÐU‰å]ÍvU‰å¸]ÉöU‰åVSœúX‰Ã¡ìÛ#@‰ÂÁâ)¾ÀÜ#‹DÖ0©t0©t)ƒì jè"Æÿÿ¡ìÛ#@‰ÂÁâ)¿DÖ‰$è"[ƒÄ‰ØPeø[^]ÃU‰åS‹]úût ¸ÿÿÿÿ…ÛuL¡ìÛ#@‰ÂÁâ)¹ÀÜ#‹DÑ0Áèƒà‹U ‰¡ìÛ#@‰ÂÁâ)Õ0‹
-%ÿþÿÿ ؉
-û¸‹$ÉÉöU‰åS‹]úût ¸ÿÿÿÿ…ÛuL¡ìÛ#@‰ÂÁâ)¹ÀÜ#‹DÑ0Áè ƒà‹U ‰¡ìÛ#@‰ÂÁâ)Õ0‹
-%ÿýÿÿ ؉
-û¸‹$ÉÉöU‰åWVSƒì ‹} ÇEðú‹EÇÿÿÿÿÇ@¾;5äÛ#s9v‹µ€Ü#ƒ{u ƒìWVÿS,ƒÄ…ÀxƒìWÿuVÿS0‰EðƒÄF;5äÛ#rÊû‹Eðeô[^_]ÉöU‰åƒì‹U¸ƒ:ÿt ¸ƒzu‹‹…€Ü#ƒìRÿ2ÿP4ƒÄÉÍvU‰åƒì‹U¸ƒ:ÿt‹‹…€Ü#ƒìRÿ2ÿP8ƒÄÉÉöU‰åƒì‹U¸ƒ:ÿt‹‹…€Ü#ƒìRÿ2ÿP<ƒÄÉÉöU‰åƒì‹U¸ƒ:ÿt‹‹…€Ü#ƒìRÿ2ÿP@ƒÄÉÉöU‰åVS‹u‹µ Ü#ƒìÿ°ôh™.#è^j»ƒÄ‰ö[‰ÐÁà)ÐÁà9°ÄÜ#……ƒÀ ºÀÜ#f|€ttfƒ|tlƒì f‹Dfƒøwƒì ·ÀP訃Äë%v·Ð¸s.#ú€t¸.#út¸‹.#P[‰ÐÁà)ÐÁàÿ°”ß#ÔÜ#PSh/#è¹iƒÄ Cû™ŽUÿÿÿeø[^]ÉöU‰åWVSƒì ‹E‹… Ü#‰Eð‹¸üƒì ‹Uð‹‚ðøPèk§‰ÆƒÄƒþÿu -¸ÿÿÿÿ…ÿtrOëՐv‰ÐÁà)Ѝ ÅöñÜ#tRQ@»ÌÜ#ƒ<D‹¤ß#‰ƒìý‰Ø‹Uð‚ðPVèX¥ƒÄ‹Eð˜ðSV聦ƒÄéiÿÿÿ‰ðeô[^_]ÉöU‰åWVSƒì‹E‹… Ü#‰Eð‹Mƒy(…©‹=ìÛ#‰ÐÁà)ЍžÄÜ#‹U93…‹M I‰ÂÁâ)ÂÁ⋄Љ„йÌÜ#‹D@‰D@‹„à‰„àƒÂ0¹ÀÜ#‹
-%ÿ÷ÿÿ‹\0ã ؉
-‹UðƒÂ¸ƒ¼º€ÿ•ÀH‹] ‰„š€é¢v‹U R‰ÂÁâ)ÂÁâ»ÄÜ#‹A‰„Ѓyt‹A‰‚ Ý#‹A‰„àë-‰ö‹] [‰ÐÁà)ÐÁà‹]ð‹“ô‰ Ý#‹“ô‰¤ß#ƒy$u‹E @‰ÐÁà)Ё ÅðÜ#¸ƒy ”ÀH‹U ‹Mð‰„‘ˆ¸ƒÄ[^_]ÃU‰åWVSƒì ‹U‹<• Ü#ƒ¿t8LJƒì‹E @‰ÐÁà)ЋŔß#‹—ðÂPÿu 襤酋E @‰ÐÁà)ЍÅöƒñÜ#t?K@¾ÌÜ#ƒ<11ºÄÜ#‹1„à‰1ƒì‹„Ћ—ðÂPÿu èG¤ë*ƒì‹E @‰ÐÁà)ЋŔß#‹—ðÂPÿu 诣ƒÄ‹E @‰ÐÁà)ÐfÇÅèÜ#€eô[^_]ÐU‰åWVSƒìH‹]ÇE¼ÇEÀfÇEÄÇEÈÇEÌÇEÐÇEÔÇEØÇEÜÇEà¶Ã -f‰E¸‹ Ü#‹€ø‰EÈÇE̍E¸jjPh"h¥.#è-¬ÿÿ‰ÆƒÄ ƒþÿuƒì h@/#èVËÿÿƒÄ‹< Ü#v‰ÐÁà)Ðfƒ<ÅèÜ#tµ€Gƒ<ÿtJÿëE‰öƒìv‰ÃÁã)ÃÁ㍃Ý#PjèJ;fǃèÜ#€ƒÄ‹ƒ”ß#‹—ðÂPVèࢃčeô[^_]ÐU‰åWVSƒì‹}hª.#è¾ÊÿÿèÆÿÿ‰EðƒÄ hPhÀ.#è£ÊÿÿÇ$èwÉÿÿ‰ÃƒÄShÞ.#è‡Êÿÿ‹Eð‰… Ü#ƒÄ jhê.#Sè=efÇCÆCÇCø…"ÇC$†"ÇC ì{"ÇC$Ì|"ÇC(0†"ÇC,Œ}"ÇC0<†"ÇC4D†"ÇC8P†"ÇC<"ÇC@†"ÇCD‡"ÇCHd‡"ÇCLl‡"ÇCPˆ"ÇCTLˆ"ÇCX€ˆ"ÇC\d‰"ÇC`„‰"ÇCdœ‰"ÇCh´‰"ÇCl̉"ÇCpä‰"ÇCtü‰"ÇCxŠ"ÇC|,Š"ǃ€DŠ"ǃ„\Š"¸ƒÄS‰öDŽ‚€ÿÿÿÿ@=™~í‹EH‰ƒüƒì ‹EÁàPè@Èÿÿ‰ƒð¾ƒÄ;u}ƒì ‹ƒððPè柃ÄF;u|åÿçw¿èÿ ¡v¿ ¡‰»ô‹E‰ƒøƒ} tƒìjÿuðh€"è8ÃÿÿƒÄeô[^_]ÐU‰åWVSƒì ‹M‹u ‹]‹ Ü#‰Eð…Éx[; -ðÛ#sS‹ Ü#‹@%ÿÿÿ=u=þ™wv‰ÐÁà)Ðfƒ<ÅèÜ#u -¸éèvv‰ÐÁà)Ð9 ÅÄÜ#t -¸&éȍv…Ûuv‰ÐÁà)Ё ÅðÜ#ë)ƒûuv‰ÐÁà)Ё$ÅðÜ#ÿ÷ÿÿë ¸郉öv‰ÐÁà)ÐÁà˜Ð¿ÄÜ#‹U9;t\f¸èÜ#€u=ƒì‹;‹Mð‹‘ðÂPV蘞‹E‰;ƒÄ‹Uð‹‚ð‹MÈPV赟ƒÄëv‰ÐÁà)ЋU‰Ŕß#¸eô[^_]ÍvU‰åVS‹M‹4 Ü#…Éx; -ðÛ#s‹ Ü#‹@%ÿÿÿ=t¸ÿÿÿÿëw¡ìÛ#@‰ÂÁâ)¸ÿÿÿÿ9 ÕÄÜ#uZúè!P‹ìÛ#R‰ÑÁá)Ñ»ÀÜ#f‰DËdžèX­ÿÿ¡ìÛ#@‰ÂÁâ)ƒì ¿DÓPèçOè>·ÿÿƒÄû¸eø[^]ÉöU‰å‹E‹… Ü#‹€ü]ÍvU‰å‹E‹… Ü#‹€ô]ÍvU‰åS‹]‹M …ÛxU;ðÛ#sM‹ Ü#‹@%ÿÿÿ=u7ù™wI‰ÐÁà)Ðfƒ<ÅèÜ#u¸ëMI‰ÐÁà)Ð9ÅÄÜ#t ¸&ë3‰öI‰ÁÁá)ÁÁá¸öñÜ#”À‹U‰‹‘”ß#‹E‰¸‹$ÉÉöU‰å‹E f8t·‹E -9Âu¸ë¸ÿÿÿÿ]ÐU‰å¸ÿÿÿÿ]ÉöU‰å¸]ÉöU‰å]ÍvU‰å¸]ÉöU‰åSƒì ‹E‹M ‹… Ü#I‰ÐÁà)ЋŔß#‹“ðÂPQè7œƒÄ‹]üÉÍvU‰åWVSƒì ‹E‹u ‹<… Ü#v‰ÐÁà)Ðfƒ<ÅèÜ#tµ€Gƒ<ÿtHÿëCƒìv‰ÃÁã)ÃÁ㍃Ý#PjèR5fǃèÜ#€ƒÄ‹ƒ”ß#‹—ðÂPVè蜃čeô[^_]ÐU‰åSƒì ‹E‹M ‹… Ü#I‰ÐÁà)ÐÁàfǀèÜ#€‹€”ß#‹“ðÂPQ蜜ƒÄ‹]üÉÃU‰å]ÍvU‰åWVSƒì ‹U‹• Ü#‰Eð‹U <•€‰ÆƒÆƒ<7~MƒìR‰ÃÁã)ÃÁ㍃Ý#Pjè‹4ÿ 7ƒÄ‹ƒ”ß#‹Mð‹‘ðÂPÿu 趛fǃèÜ#€ƒÄë‹E @‰ÐÁà)ÐfÇÅèÜ#eô[^_]ÐU‰åƒì‹E‹M ‹… Ü#ƒÀDŽˆ€ÿÿÿÿI‰ÐÁà)ÐfÇÅèÜ#hdÜ#QèðÉÿÿƒÄÉÍvU‰å‹E‹U ‹… Ü#ƒÀDŽ€R‰ÐÁà)ÐfÇÅèÜ#]ÃU‰åWVSƒì4‹u v‰EäÁà+EäfÇÅèÜ#EèPjè“3Mè»@B‹Eº÷ó‰Uà’€€‰E܋A‹U܍ЉE؉A»¡/¸D÷ë‰ÓÁû‹EØÁø)ÿƒÞC‹E÷ç‰×‰øÁèEè‹A»Êš;™÷û‰Ó‰YƒÄVhtŠ"ÿuìÿuèÿÄÛ#‰ÃƒÄƒûÿuƒìÿ5ìÛ#jèAäÿÿƒÄ v‰ÈÁà)ȉÅ ß#eô[^_]ÐU‰åƒìÿ5ìÛ#jèäÿÿ¸ƒÄÉÍvU‰åƒìÿ5ìÛ#jèñãÿÿƒÄÉÃU‰åƒìÿ5ìÛ#jèÙãÿÿƒÄÉÃU‰åƒìÿ5ìÛ#jèÁãÿÿƒÄÉÃU‰åƒìÿ5ìÛ#jè©ãÿÿƒÄÉÃU‰åƒìÿ5ìÛ#jè‘ãÿÿƒÄÉÃU‰åƒìÿ5ìÛ#jèyãÿÿƒÄÉÃU‰åƒìÿ5ìÛ#jèaãÿÿƒÄÉÃU‰åƒìÿ5ìÛ#jèIãÿÿƒÄÉÃU‰åƒìÿ5ìÛ#jè1ãÿÿƒÄÉÃU‰åƒìÿ5ìÛ#jèãÿÿƒÄÉÃU‰åWVSƒì‹MI‰ÃÁã)ÃÁãºÄÜ#‹‹4… Ü#¿ÀÜ#fÇD(€‹„Ћ–ðÂPQè9™Ç„àÿÿÿÿèQœÿÿƒÄeô[^_]ÉöU‰åVSƒì h`0#è
-Áÿÿè]¼ÿÿ‰ÆÇ$Œè׿ÿÿ‰Ã‰µ Ü#ƒÄ jhø/#Sè®[fÇCÆCÇC Œ"ÇCTŒ"ÇC `Œ"ÇC$ˆŒ"ÇC(ÇC, Œ"ÇC0¬Œ"ÇC4´Œ"ÇC8ÀŒ"ÇC<Ȍ"ÇC@äŒ"ÇCD "ÇCH4"ÇCL\"ÇCP„"ÇCT¬"ÇCXԍ"ÇC\ü"ÇC`(Ž"ÇCdPŽ"ÇChxŽ"ÇCl Ž"ÇCpȎ"ÇCtðŽ"ÇCx"ÇC|@"ǃ€h"ǃ„"ǃˆÿÿÿÿÇ$0#èô¿ÿÿƒÄ jVh¸"è,ºÿÿƒÄeø[^]ÉöU‰å‹M‹E ‹ Ü#fƒ8t·9Èu¸ƒºˆÿt¸ÿÿÿÿ]ÉöU‰å¸ÿÿÿÿ]ÉöU‰åƒì‹E‹… Ü#ÿ°ˆhe/#èìYƒÄÉÍvU‰å‹E‹… Ü#‹€ˆ]ÍvU‰å¸]ÉöU‰å]ÍvU‰å¸]ÉöU‰å]ÍvU‰å‹E @‰ÂÁâ)ÂfÇÕèÜ#]ÃU‰åƒìht/#èxYƒÄÿ5ìÛ#j è„àÿÿƒÄÉÍvU‰åƒìh{/#èPYƒÄÿ5ìÛ#j è\àÿÿƒÄÉÍvU‰åƒìh‚/#è(YƒÄÿ5ìÛ#j è4àÿÿƒÄÉÍvU‰åƒìh‰/#èYƒÄÿ5ìÛ#j è àÿÿƒÄÉÍvU‰åƒìh/#èØXƒÄÿ5ìÛ#j èäßÿÿƒÄÉÍvU‰åƒìh—/#è°XƒÄÿ5ìÛ#j è¼ßÿÿƒÄÉÍvU‰åƒìhž/#èˆXƒÄÿ5ìÛ#j è”ßÿÿƒÄÉÍvU‰åƒìh¥/#è`XƒÄÿ5ìÛ#jèlßÿÿ¸ƒÄÉÉöU‰åƒìh¬/#è4XƒÄÿ5ìÛ#jè@ßÿÿƒÄÉÍvU‰åƒìh³/#è XƒÄÿ5ìÛ#jèßÿÿƒÄÉÍvU‰åƒìhº/#èäWƒÄÿ5ìÛ#jèðÞÿÿƒÄÉÍvU‰åƒìhÁ/#è¼WƒÄÿ5ìÛ#jèÈÞÿÿƒÄÉÍvU‰åƒìhÈ/#è”WƒÄÿ5ìÛ#jè ÞÿÿƒÄÉÍvU‰åƒìhÏ/#èlWƒÄÿ5ìÛ#jèxÞÿÿƒÄÉÍvU‰åƒìhÖ/#èDWƒÄÿ5ìÛ#jèPÞÿÿƒÄÉÍvU‰åƒìhÝ/#èWƒÄÿ5ìÛ#jè(ÞÿÿƒÄÉÍvU‰åƒìhä/#èôVƒÄÿ5ìÛ#jèÞÿÿƒÄÉÍvU‰åƒìhë/#èÌVƒÄÿ5ìÛ#jèØÝÿÿƒÄÉÍvU‰åSƒì0‹]ÇEÜÇEàfÇEäÇEè¶Ãf‰EØÇEìEØjjPhD"hò/#趜ÿÿƒÄ ‹ Ü#‰Ã‰šˆƒûÿuƒì h 0#èÒ»ÿÿƒÄ[‰ÐÁà)ÐÇÅøÜ#ÿÿÿÿ‹]üÉÐU‰åôëýU‰åWVSƒì ‹} ¾ú»ëvCûÿ2Ý)ØÁàº`ž#€|t߃ìÿ4ÿuèaVƒÄ…Àuʾ…öt1ÿÀuèðnÇûéÜûÝ)؍…dž#éˉö÷Ç@uè¿nÇû髍v‹E‰Eð=ÿ~èžnÇû銉ö‹0¿#ƒúÿtqÕ)Ѝ<…w‹†dž#£0¿#ƒì ÿuèV@‰$臹ÿÿ»`ž#‰ƒÄÿuPè7U‹Eð‰‡hž#‡lž#‰$è(‘ÆDƒÄû‡dž#ëvènÇû¸eô[^_]ÍvU‰åWVSƒì ¾ú¿»`ž#vý)øÁà€|tƒìÿ4ÿuèUƒÄ…Àu¾Gÿÿ~ʅötJƒì ÿuèOUƒÄ@Pý)ûÁã¾`ž#ÿ43è%¹ÿÿƒÃÆD3¡0¿#‰ƒdž#‰=0¿#ƒÄûë‰öèSmÇû¸eô[^_]ÍvU‰åWVSƒì ‹}?ÿw‹Õ)Ѐ<…xž#uèmǸÿÿÿÿé‰öèÏæÿÿúè5B‹ìÛ#R‰ÑÁá)Ñf‰ÍÈÜ#‹Õ)Ѝ4…`ž#ƒ~ ÿu
-ƒ~…“ƒìWjÿèW#ƒÄh¤Ü#jè8)ƒÄU表Ü#;øÛ#|¡¤Ü#+ôÛ#‰E表Ü#+øÛ#ë!‰ö¡¤Ü#+ôÛ#H‰E表Ü#+øÛ#ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ìºÓMb‰Ø÷êÁú‰ØÁø)ÂыìÛ#R‰ÐÁà)Ð) Å Ý#ƒì Qèú›ÿÿƒÄƒ=üÛ#ÿtƒì ÿ5üÛ#ÿÈÛ#ÇüÛ#ÿÿÿÿƒÄ‹ -ìÛ#I‰ÐÁà)ЋÅÄÜ#ƒì‹… Ü#QPÿRH‹ -ìÛ#I‰ÐÁà)лÀÜ#fÇDÃ(Íǂ`º#‹‰‚dº#ƒÄF PQ辏ÇìÛ#ÿÿÿÿÇÜ#ÿÿÿÿèõÿÿ¡ìÛ#@‰ÂÁâ)¿DÓ‰$è…@èܧÿÿƒÄûèÿäÿÿë8ÿNƒìWjÿèW#¡ìÛ#@‰ÂÁâ)¿ÕÈÜ#‰$èF@蝧ÿÿƒÄû¸eô[^_]ÃU‰åWVSƒì ‹}‹]?ÿw‹Õ)Ѐ<…xž#uè¯jǸÿÿÿÿéVv…ÛuúëúèÒ?‹ìÛ#R‰ÑÁá)Ñf‰ÍÈÜ#‹Õ)Ѝ4…`ž#…Ûu0ƒ~ ÿu‹E 9F}èMjÇ û¸ÿÿÿÿéó‹E )Fûéâèäÿÿƒ~ ÿu ‹E 9F‘ƒìWjÿèW#ƒÄh¤Ü#jèš&ƒÄU表Ü#;øÛ#|¡¤Ü#+ôÛ#‰E表Ü#+øÛ#롤Ü#+ôÛ#H‰E表Ü#+øÛ#ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ìºÓMb‰Ø÷êÁú‰ØÁø)ÂыìÛ#R‰ÐÁà)Ð) Å Ý#ƒì Qè^™ÿÿƒÄƒ=üÛ#ÿtƒì ÿ5üÛ#ÿÈÛ#ÇüÛ#ÿÿÿÿƒÄ‹ -ìÛ#I‰ÐÁà)ЋÅÄÜ#ƒì‹… Ü#QPÿRH‹ -ìÛ#I‰ÐÁà)лÀÜ#fÇDÃ(͋E ‰‚`º#‹‰‚dº#ƒÄF PQè#ÇìÛ#ÿÿÿÿÇÜ#ÿÿÿÿèZ›ÿÿ¡ìÛ#@‰ÂÁâ)¿DÓ‰$èê=èA¥ÿÿƒÄûèdâÿÿë<‰ö‹E )FƒìWjÿèW#¡ìÛ#@‰ÂÁâ)¿ÕÈÜ#‰$è§=èþ¤ÿÿƒÄû¸eô[^_]ÐU‰åWVSƒì ‹}?ÿw‹Õ)Ѐ<…xž#uèhǸÿÿÿÿéU‰öè,…À„‡œúX‰Æ‹Õ)Ѝ…`ž#‹JA‰J‹Z ƒûÿtG‹Ý`º#9È<)Á‰È‰BƒìB PSèƊ[‰ÐÁà)ЋÅÄÜ#ƒÄ‹• Ü#SRÿPDèÿÿƒÄƒìWjÿèW#ƒÄ‰ðPé¼‰öúèª<‹Ü#R‰ÑÁá)Ñf‰ÍÈÜ#‹Õ)Ѝ…`ž#‹JA‰J‹Z ƒûÿtG‹Ý`º#9È<)Á‰È‰BƒìB PSè&Š[‰ÐÁà)ЋÅÄÜ#ƒÄ‹• Ü#SRÿPD荙ÿÿƒÄƒìWjÿèW#¡ìÛ#@‰ÂÁâ)¿ÕÈÜ#‰$è <èb£ÿÿƒÄû¸eô[^_]ÐU‰åWVSƒì ‹] ÇEð‹E8ÿw‹Õ)Ѐ<…xž#uèlfǸÿÿÿÿéÊèc*…À„ÃœúX‰Â‰Uì‹E‹Õ)Ѝ4…`ž#^‹^ ƒûÿts݉‹€`º#;F_¿`º#ÇEðv‹F+:‰FƒìF PS艍[‰ÐÁà)ЋÅÄÜ#ƒÄ‹• Ü#SRÿPD‹^ ƒÄƒûÿt݋:;F~°ƒìÿujÿèW#ƒÄƒ}ðtèÿÿ‹Uì‰ÐPéõúèÊ:‹Ü#R‰ÑÁá)Ñf‰ÍÈÜ#‹E‹Õ)Ѝ4…`ž#^‹^ ƒûÿtr݉‹€`º#;F^¿`º#ÇEð‰ö‹F+:‰FƒìF PSè.ˆ[‰ÐÁà)ЋÅÄÜ#ƒÄ‹• Ü#SRÿPD‹^ ƒÄƒûÿt݋:;F~°ƒìÿujÿèW#ƒÄƒ}ðtèd—ÿÿ¡ìÛ#@‰ÂÁâ)ƒì ¿ÕÈÜ#Pèð9èG¡ÿÿƒÄû¸eô[^_]ÉöU‰åWVSƒì ¾¿dž#õ)óÁãǃ`ž#‰4;ǃhž#ƒì ƒlž#PèB‡ƒÃF‰;ƃhž#ƒÄ‰Æþÿ~±ÇXº#ÿÿÿÿÇ0¿#ƒìjhøž"è:ªÿÿƒÄeô[^_]ÍvU‰åVS‹uú>ÿw‹Õ)Ѐ<…xž#uèÉcÇû¸ÿÿÿÿënvƒì ‹Õ)л`ž#ÿ4ƒèUKƒÄ@P‹Õ)Ðÿ4ƒè1¯ÿÿ‹Õ)ÐÆDƒ‹Õ)Ћ0¿#‰…tž#‹£0¿#ƒÄû¸eø[^]ÉöU‰åƒì‹Mú9ÿw‹Õ)Ѐ<…xž#uècÇû¸ÿÿÿÿëb‰ö‹Õ)Ѓ<…lž#ÿtèîbÇû¸ÿÿÿÿë8‹Õ)ÐÆ…xž#‹Õ)Ћ0¿#‰…tž#‹£0¿#û¸ÉÉöU‰åSƒì‹M‹] 9ÿw‹Õ)Ѐ<…xž#uèubǸÿÿÿÿë_ú‹Õ)ÐÁàƒ¸lž#ÿu ‹€hž#‰ë7‰öÇ‹Õ)Ћ…lž#¹ÈÜ#vÿ @‰ÐÁà)ЋDÁPƒøÿuëû¸‹]üÉÃU‰åVS‹u‹M¸ùÿ‡–ú‹0¿#‰ƒúÿtnÕ)Ћ…tž#£0¿#‹Õ)л`ž#ǃ‹Õ)Љ …hž#ƒì ‹Õ)Ѝ…lž#P聄‹Õ)ÐÆDƒƒÄëègaÇû¸ÿÿÿÿëû¸eø[^]ÍvU‰åƒì‹M9ÿw‹Õ)Ѐ<…xž#uèaǸÿÿÿÿë=ú‹Õ)Ѝ…`ž#ƒx ÿuƒxuèì`Ç û¸ÿÿÿÿë ‰öÿHû¸ÉÐU‰å‹E@‰ÂÁâ)¸fƒ<ÕèÜ#”À]ÐU‰åVS‹][‰ÐÁà)Ѝ4Åfƒ¾èÜ#uAƒì‹Ýdº#Õ)Ѝ…lž#PS考‹†ÄÜ#ƒÄ‹… Ü#SPÿRD¸ƒÄ됸eø[^]ÃU‰åVSƒ=ôW#…ÚÇôW#¹»€¢%¾„¢%‰ÁàP ÆÇ2ÿÿÿÿÆDAƒùváƒìjjh@¿#èÜýÿÿ¹ƒÄ¾ä¤%»à¤%‰ö‰ÁàQ‰0Ɖуù -véǧ%ÿÿÿÿƧ%Çؤ%¹¾D§%»@§%vÍ)ÈÁàQ‰0ƉуùvãÇpª%ÿÿÿÿÆlª%Ljª%eø[^]ÐU‰åWVSƒìŠEˆEóŠUˆUòfÇEæ¾<u€út €}óu€}òuè_Ǐ¸ÿÿÿÿé7‰öúƒ=ؤ%ÿuèí^ǍûÇEìÿÿÿÿ됡ؤ%€‹Õä¤%‰ؤ%û‰Eìƒ}ìÿu -¸ÿÿÿÿéìvƒì h@¿#ègñÿÿƒÄ‹]¾¹º÷ñ‰×ëf‰ö¿€<Å ¢%t0ƒìÿu¿ōƒ€¢%Pè³EƒÄ…Àu€»˜¢%„Ÿ¾ëG¹‰øº÷ñ‰×fÿEæfƒ}懜‰ó„Ût–¿Áãƃ ¢%ƒìÿuƒ€¢%Pè÷D‹E쉃”¢%ƒÄ€}óu‰Â’‹] f‰Åè¤%ëv‹E썀‹E ¯Ef‰Õè¤%úƒì ‹U썒Áã·ƒè¤%Pèݨÿÿºì¤%‰ƒÄû…Àu%è”]ǒƒì h@¿#èAõÿÿ¸ÿÿÿÿ魍v‹E썀ÁãS‰Uà¾à¤%‹ƒì¤%‰‚ä¤%‰2ƒìjjƒü¤%Pè:ûÿÿƒÄ ·D3Pjƒ¥%Pè#ûÿÿƒÄ jjÃ¥%SèûÿÿŠ]ó‹Eàˆ\0ƒÄúƒ=ˆª%ÿuèø\ǎûÇEèÿÿÿÿ롈ª%Å)‹•D§%‰ˆª%û‰Eèƒ}èÿu_ƒì h@¿#èvôÿÿ‹Eèéä‰öè§\ǐƒì h@¿#èTôÿÿ¸ÿÿÿÿéÀ‰öèƒ\Ǒƒì h@¿#è0ôÿÿ¸ÿÿÿÿ霉ö‹EèÁà+EèÁà¹@§%ŠUòˆT P‹]ì‰
-‹] f‰\
-ǀD§%ÿÿÿÿ‰ºH§%‹]썛ÆÕà¤%ƍ¿ōr¿€¢%€|>t%ƒì¶D>Pšœ¢%SèGõÿÿÆD>‰$èšøÿÿƒÄƒì h@¿#èŽóÿÿ¿EèƒÄeô[^_]ÍvU‰åWVSƒìŠEˆEóŠ]ÇEè¿ÆEç<u„Ût €}óu€ûuè‚[Ǐ¸ÿÿÿÿé0‰öúƒ=ˆª%ÿuèa[ǎûÇEìÿÿÿÿë ¡ˆª%Å)‹•D§%‰ˆª%û‰Eìƒ}ìÿu ¸ÿÿÿÿéߐ‹EìÁà+EìÁàº@§%ˆ\ ‹M f‰LǀD§%ÿÿÿÿƒì h@¿#è°íÿÿƒÄ‹U¾¹º÷ñ‰Öë]v¶€<Å ¢%u ¿ÆEçë8ƒìÿu¶ŀ¢%PèöAƒÄ…Àu¿ëF¹‰ðº÷ñ‰ÖÿEèƒ}è‡Ò‰ù„Ét €}çuR¶Á㸀¢%ÆD ÆDƒìÿuPè>AƒÄ jjÃœ¢%Sè/øÿÿÇ$@¿#èçñÿÿƒÄ jjSè:ïÿÿëM¶ōCº€¢%€|t'þDƒì h@¿#è®ñÿÿƒÄ jjƒœ¢%Pèûîÿÿ됃ì h@¿#è‹ñÿÿƒÄ¶‹<Ŕ¢%¿ŠUó:Åø¤%tèªYǓ¸ÿÿÿÿéX‰ö€}óu¿·Åè¤%9E u€}ót(¿·Åè¤%™÷} …ÒtèdYǔ¸ÿÿÿÿéƒì h@¿#è ìÿÿ¶‹Ť¢%ƒÄƒúÿ„­€}óu#è&YǕƒì h@¿#èÓðÿÿ¸ÿÿÿÿéЍÕ)з…T§%9E t"èíXǔƒì h@¿#èšðÿÿ¸ÿÿÿÿ鋋MìÁá+M썶Å »„¢%‹‰D§%‹Mì‰ ë/‰öèŸXǑƒì h@¿#èLðÿÿ¸ÿÿÿÿë@¶‹Uì‰Ť¢%ƒì h@¿#è*ðÿÿ‹EìÁà+EìÁàH‰±H§%º@§%‰<Æ¿EìƒÄeô[^_]ÉöU‰åWVSƒì¿E‰Eì‰ÇÁç)ÇÁ獗@§%‰Uðh@¿#èÏêÿÿ‹Mð‹Y›ÁãC‰E躄¢%‹€Áà°à¤%ƀà¤%F‰$èôÿÿF ‰$è„ôÿÿF$‰$èyôÿÿƒÄú·FPÿv èX£ÿÿû¹„¢%‹Eè‹ú ’¡Ø¤%‰Íä¤%‰ؤ%ûƇ@§%ƒÃ ‹Uð‹B‰ƒ„¢%ú¡ˆª%‰‡D§%‹Mì‰ -ˆª%ûƃ€¢%Ç$@¿#è
-ïÿÿƒÄeô[^_]ÍvU‰åWVSƒì ‹u ŠM¿UÕ)Ѝ…@§%‰Eð‹@€Åà¤%‹Eð€x uèûVǔ¸ÿÿév€;uèÞVǖ¸ÿÿéù‰ö€{tQ€{u,ƒì¶ÁP‹Uð·BPC PèÈëÿÿƒÄ…Àt;¸évƒì¶ÁP‹Uð·BPC PèœëÿÿƒÄ…ÀuÔƒì CPè-éÿÿƒÄ‹Uð·B‹{‰ÁÁéüó¥¨tf¥¨t¤·B‰ÁK‰K·S‰ÐC 9Ár‰È)ЉC€{u ƒì CPë8‰ö€{uƒì‹Uð·BPC$PèZïÿÿëƒì‹Uð·BPC$PèDïÿÿC‰$èíÿÿƒÄ¸eô[^_]ÐU‰åWVSƒì ‹} ŠM¿UÕ)Ѝ…@§%‰Eð‹@€Åà¤%‹Eð€x uè‹Uǔ¸ÿÿév€;uènUǖ¸ÿÿéù‰ö€{tQ€{u,ƒì¶ÁP‹Uð·BPC$PèXêÿÿƒÄ…Àt;¸évƒì¶ÁP‹Uð·BPC$Pè,êÿÿƒÄ…ÀuÔƒì CPè½çÿÿƒÄ‹Uð·B‹s‰ÁÁéüó¥¨tf¥¨t¤·B‰ÁK‰K·S‰ÐC 9Ár‰È)ЉC€{u ƒì CPë8‰ö€{uƒì‹Uð·BPC Pèêíÿÿëƒì‹Uð·BPC PèÔíÿÿC‰$è-ìÿÿƒÄ¸eô[^_]ÐU‰åSƒìh0#è;ƒÄÿ5ؤ%h‹0#è;»ƒÄÝ)ØÁà€¸@§%t8@§%‹B€Åà¤%ƒì ÿp ÿp$‹B€ŀ¢%PShŸ0#è®:ƒÄ Cƒûv­‹]üÉÃU‰åƒì`¿MÍ)ȋ…P§%’Åà¤%ÿp ÿp$RQhÀ0#E¨Pèf:ƒÄ ÉÐU‰åSƒì‹]h@¿#èHæÿÿ¿ÓÕ)Ѝ …‹X§%€Å ƒÄ€º€¢%u ‹D§%‰‚„¢%¿ÃÅ)ÂÁâƂ@§%ú‹ -ˆª%‰ŠD§%£ˆª%ûƒì h@¿#èÓêÿÿƒÄ‹]üÉÍvU‰åWVSƒì ‹u ‹E‹<…€Ü#ú‹^…Ûu-ƒì j èžÿÿƒÄ…ÀtÇÿÿÿÿÇ@Ç@ÿÿÿÿ‹U‰‰F‹;ìÛ#u û¸#é~ƒ;ÿtc¾ÀÜ#‰ö‹ -ìÛ#I‰ÐÁà)Ћ‰TÆP‹C‰„¬¡ìÛ#‰CÿCè…ÿÿ¡ìÛ#@‰ÂÁâ)ƒì ¿DÖPèŸ'èöŽÿÿƒÄûúƒ;ÿu¤¡ìÛ#ÿD‡D¡ìÛ#‰û¸eô[^_]ÉöU‰åWVSƒì ‹E ‹x¸…ÿ„À‹;ìÛ#tû¸髍vúè*'‹ìÛ# [‰ÊÁâ)Êf‰ÕÈÜ#‹E‹…€Ü#ÿL˜DÇÿÿÿÿ‹_ÇGÿÿÿÿƒûÿt-p ‰Ù[‰ÐÁà)ЉÅÝ#‹œž DŽŽ ÿÿÿÿƒûÿuÖÇGè„ÿÿ¡ìÛ#@‰ÂÁâ)ƒì ¿ÕÈÜ#Pè¢&èùÿÿƒÄû¸eô[^_]ÃU‰åVSƒì h$1#è~ÿÿè -™ÿÿ‰ÆÇ$èKœÿÿ‰Ã‰µ€Ü#ƒÄ jh81#Sè"8fÇCÍÆCÇCÇC8¯"ÇC „¯"ÇC$¯"ÇC(˜¯"ÇC,ȯ"ÇC0ô¯"ÇC4<°"ÇC8œ¬"ÇC<„°"ÇC@„­"ºƒÄsK •ÇD@DŽ ÿÿÿÿBú™~ݍeø[^]ÉöU‰åVS‹E‹…€Ü#ƒì h1#è7¾ƒÄƒÃƒìÿt³@h1#èû6ƒÄFþ™~ãeø[^]ÃU‰å¸ÿÿÿÿ]ÉöU‰å]ÍvU‰åƒì‹E‹U ‹…€Ü#ƒÀƒ|@tƒìRj
-èȽÿÿƒÄÉÍvU‰å‹U :t ‹E -9u
-¸ëv¸ÿÿÿÿ]ÐU‰åSƒì‹] j èӚÿÿ‰ÂƒÄ¸ …Òt!ÇÿÿÿÿÇBÇBÿÿÿÿ‹E‰‰S¸‹]üÉÍvU‰åSƒì‹] ‹Cƒxt ¸ë&‰öúƒ{tƒìj ÿsèäšÿÿÇCƒÄû¸‹]üÉÍvU‰åWVSƒì ‹}‹u ú‹^…Ûu*ƒì j è3šÿÿƒÄ…ÀtÇÿÿÿÿÇ@Ç@ÿÿÿÿ‰>‰Fƒ;ÿt
-û¸ë"‰ö¡ìÛ#‹½€Ü#ƒÂÿD‚@¡ìÛ#‰û¸eô[^_]ÃU‰åWVSƒì ‹E ‹U‹•€Ü#ú‹p¸…ö„V‹;ìÛ#u û¸#éA‹ìÛ#‹F ¿ÀÜ#;„“°v -¸é v¡ìÛ#‹Œƒ°‹“¬…Òt‰ö‹;ìÛ#…Š‹R…Òu븅À…†‹ -ìÛ#I‰ÂÁâ)‹ƒ¬‹‰D×P‹ƒ¬‹@‰„‹‹“¬¡ìÛ#‰B‹ƒ¬ÿ@èj€ÿÿ¡ìÛ#@‰ÂÁâ)ƒì ¿D×Pèù"èPŠÿÿƒÄûúéRÿÿÿ‰ö¸;J ’Àérÿÿÿ‹E‹…€Ü#¡ìÛ#ÿDƒD¡ìÛ#‰¹‹ƒ¬‹V ë‰ö‰Á‹A…Àt;P sò…Ét‰q됉³¬…Àt‰p‰F‰Nû¸eô[^_]ÍvU‰åWVS‹}‹E ‹ ½€Ü#ú‹X¸…Û„Ù‹;ìÛ#uû¸#éčv‹ìÛ#‹C ;„‘°s
-¸饡ìÛ#‹´°‹‘¬…Òt‰ö‹;ìÛ#u‹R…Òu︅Àuû¸ëk‰ö¸;r ’Àëåv‹ ½€Ü#¡ìÛ#ÿDD¡ìÛ#‰¾‹¬‹S 됉ƋF…Àt;P sò…öt‰^됉™¬…Àt‰X‰C‰sû¸[^_]ÉöU‰åWVSƒì ‹E ‹x¸…ÿ„ï‹;ìÛ#tû¸éڍvúè&!‹ìÛ# [‰ÊÁâ)Êf‰ÕÈÜ#‹E‹…€Ü#‰EðÿL˜DÇÿÿÿÿ‹_ÇGÿÿÿÿƒûÿt2‰ÆƒÆv‰Ù[‰ÐÁà)ЉÅÝ#‹œžDŽŽÿÿÿÿƒûÿuÖÇG‹O‹W…Éu -‹Eð‰¬ë‰ö‹G‰A…Òt‹G‰Bèã}ÿÿ¡ìÛ#@‰ÂÁâ)ƒì ¿ÕÈÜ#Pèo èƇÿÿƒÄû¸eô[^_]ÐU‰åVSƒì hd1#èJ—ÿÿèْÿÿ‰ÃÇ$€è–ÿÿ‰Æ‰4€Ü#ƒÄ jhx1#Vèî1fÇFÌÆFÇFÇF@¶"ÇF Ķ"ÇF$ð¶"ÇF( ·"ÇF,h·"ÇF0”·"ÇF4ì·"ÇF8ü°"ÇF<„²"ÇF@ˆ³"ºƒÄ^N•ÇD@DŽ°ÿÿÿÿDŽÿÿÿÿBú™~Òdž¬eø[^]ÐU‰å‹U‹M ¸ÿÿÿÿ…Òt;‹‹…€Ü#ƒxu‹@%ÿÿÿ=Ìu…Ét ‹B‹@ ‰ë
-‰ö¸ÿÿÿÿ됸]ÐU‰å‹U‹M¸ÿÿÿÿ…Òt@‹‹…€Ü#ƒxu‹@%ÿÿÿ=Ìt¸ÿÿÿÿ됅Ét‹B‹@ ‰‹R‹E ‰B ¸]ÃU‰å‹E‹M ‹U‹…€Ü#‰”ˆ°]ÃU‰åWVSƒì‹E‹<…€Ü#h1#è0»ƒÄwƒìÿtž@h1#èó/ƒÄCû™~ãƒì hB1#èÚ/»ƒÄ‰öƒìÿ´Ÿ°h^1#è¼/ƒÄCû™~àeô[^_]ÃU‰å‹U :t ‹E -9u
-¸ëv¸ÿÿÿÿ]ÐU‰åS‹E‹U ‹]‹ …€Ü#Áâ‹C‰„°ÇD
-D‹$ÉÉöU‰åVS‹E‹u ‹…€Ü#ƒ|³DtƒìVj
-èD¶ÿÿƒÄë vÇD³DDŽ³°ÿÿÿÿeø[^]ÉöU‰å‹U :t ‹E -9u
-¸ëv¸ÿÿÿÿ]ÐU‰åSƒì‹] jè3“ÿÿ‰ÂƒÄ¸ …Òt1ÇÿÿÿÿÇBÇBÿÿÿÿ‹E‹@‰B ÇB‹E‰‰S¸‹]üÉÍvU‰åSƒì‹] ‹Cƒxt ¸ë&‰öúƒ{tƒìjÿsè4“ÿÿÇCƒÄû¸‹]üÉÍvU‰åWVSƒì$·]Sh‚1#è .‰Ø-yƒÀÁèƒÄ ·À‰Eè@ÛÁã¿@·%ÿt8CP‰Eä·8Ph‰1#èá-ƒÄ ÿt;·D;Ph—1#èÊ-ƒÄ ÿt; s·>Ph¨1#è±-ƒÄ ÿt>·D>Ph¹1#èš-ƒÄ ‹Uä·D:P·DLPhÊ1#è~-‹UèÕƒÄ·ØShÛ1#èc-EóPEòPEìPS蹃ĶUóR¶UòRÿuìPh 2#è6-ƒÄ eô[^_]ÍvU‰åWVSƒì ‹E‹U‹]¹‹u ƒî‰ƒî‰º :&fƒ= :&yA¿Áfƒ<Byfù™~îfù™~ƒì hð1#èÎ,¸ƒÄé ¿Á<¹ :&‰Úf Ê€f‰Ǎ<ÿÁçº@·%‰tÇD _ÇDfŒÙf‰LfÇfÇDÇD _ ‹M‰ ÇDÇDO0ÇDÇD Ǎ_@ÇÇD‰t‰t fŒÉf‰L fŒÙf‰LfŒÛOPf‰\fŒÛf‰fÇD 0fÇD0O`fÇfÇDfÇDÇ¬·%¾`;&¹üó¥Å˜eô[^_]ÐU‰åVS‹u ¿E-‰Â…ÀyP‰ÐÁø@ÀÁà¹@·%f‰tX@Vf‰T f‰t ƒÀPf‰tf‰4[^]ÉöU‰å¿E-‰Â…ÀyP‰ÐÁøfDŽ :&]ÉöU‰åSƒì‹]¿E Ph2#Sè~3‰ØƒÄ‹]üÉÃU‰åVS趉Æès»‰öƒìh,Â"SèƒÄh¸»"SèìƒÄCƒû~ۉðeø[^]ÉöU‰åƒìèaÉÍvU‰åSƒì‹]‹øW#€82uºð°îƒìShb3#èˆ*ƒÄÁ㋃øW#@Ph½=#èp*ƒÄÿ³<X#ènƒÄ‹]üÉÉöU‰åƒìÿuhy3#èE*èèûÇ$èG7ƒÄÉÉöU‰åWVSƒì‹E‹} ƒ=„µ%„à…ÿ„Ø¡¬%€€€ źm¶‰È÷â‰È)ÐÑ草ÁÁé
-‰O¡¬%ÀP‰ÐÁà)кè‰Ó™÷û’’’щW¡¬%ÀP‰ÑÁá)ѾÓMb‰È÷îÁú‰ÈÁø‰Ó)øƒÞC÷o‰ÑÁù‹GÁø)Á‰È؉‹OÁú‰ÈÁø)’’’’’’Áâ)э ‰ ‰ ‰Áá‰O‹éԉö]衬%€€€ źm¶‰È÷â‰È)ÐÑ草ÁÁé
-¡¬%ÀP‰ÐÁà)кè‰Ö™÷þ’’’щS¡¬%ÀP‰ÑÁá)ѾÓMb‰È÷îÁú‰ÈÁø)‰Uè‹{¸ƒÞC÷ï‰ÑÁù‰øÁø)Á‰ÈEè‰ùÁú‰ÈÁø)’’’’’’Áâ)э ‰ ‰ ‰Áá‰K‹E荀€€€€€‰ÃÁã‰È÷îÁúÁù)ʍéèvƒøuc¸ƒ=ô«%…Ρø«%€€€€€€‰ÃÁã‹ -ü«%ºÓMb‰È÷êÁúÁù)ÊӅÿ„…¡ø«%‰¡ü«%éqvƒø…ç¶ä«%ƒøtƒø…Àt
-ë,ƒøtë%¹@°ë#v¹A°ëv¹B°ë v»ë"ºCÐî‰Êì¶ØìˆÁ‰ÊÁâf¶Ã‰Ó Ãf‹ -ð«%f)Ù·É -¬%º×®¬]‰È÷êÁú‰ÈÁø)¬%’BÁà)Ѝ‚‰ÂÁâ Ð)Á‰È£¬%f‰ð«%…ÿ„̍€€€ źm¶‰È÷â‰È)ÐÑ草ÁÁé
-‰O¡¬%ÀP‰ÐÁà)кè‰Ó™÷û’’’щW¡¬%ÀP‰ÑÁá)ѺÓMb‰È÷êÁú‰ÈÁø‰Ó)Ëw¸ƒÞC÷î‰ÑÁù‰ðÁø)Á‰È؉‰óÁú‰ÙÁù)ʍ’’’’’’Áâ‰Ø)Ѝ€€€Áà‰G‹¬%’’’4Õ¹Á6ۉð÷é‰Ó3‰ÁÁù
-‰ð™‰È)Ћ -¬%ɍ‘ÑÁâ)ʉÑÁá)эÈ鍃ø…ƒ=ô«%…rUè¡ø«%‰¡ü«%‰B»@¹C°Ò‰Êî‰Úì¶ÈìÁàf¶Ñ з𷀵%9Æv%h†3#j_h˜3#hŸ3#èm%Ç$èmƒÄ·€µ%)ó¯è«%·€µ%‰Ø‰Ñº÷ñ‰Ãº °
-îì©t‹ -è«%;ÍÌÌ̉ð÷âÁê9Ós‰Ëu荛€€‹V‰Eä‰F¸¡/¸D÷mä‰ÑÁù‹EäÁø)Á‰ÈEè‹N¸¡/¸D÷éÁú‰ÈÁø)’’’’’’’’’Áâ )щN¡ø«%€€€€€€Áà‰Eä‹ -ü«%ºÓMb‰È÷êÁúÁù)ʋEäÐÅÿt ‰ð‹‰‹@‰G‰Øëv¸eô[^_]ÍvU‰åVSƒìŠEˆE÷ÿ¤X#ƒ=¤X#uƒ=€X#tÿ€X#¶E÷€Áຬª%ƒ<uIÇö€°ª%tûƒì ¶]÷›Áã¾ ª%ÿ43ÿ“¤ª%ƒÄöDtú¶E÷€Ç…¬ª%ÿˆX#ƒ=¤X#uƒ=„X#tÿ„X#ÿ -¤X#eø[^]ÍvU‰åWVSº¿¬ª%¾¨ª%»¤ª%¹ ª%’ÁàÇ8‰0ÇÇBƒú~ÜǤX#[^_]ÐU‰åVS‹U‹] ‹uú’ƒ<…¬ª%t÷Æu¸ÿÿÿÿëH’ …ǁ¬ª%û…Ût‰™¤ª%º ª%¨ª%‰‰t
-됍’Ç…¬ª%¸[^]ÐU‰å¡¤X#]ÉöU‰åSƒì¶ä«%ƒøt!ƒø…Àt ë.‰öƒøtë%¹@°ë#v¹A°ëv¹B°ë v»ë"ºCÐî‰Êì¶ØìˆÁ‰ÊÁâf¶Ã‰Ó Ãf‹ -ð«%f)Ù·É -¬%º×®¬]‰È÷êÁú‰ÈÁø)¬%’BÁà)Ѝ‚‰ÂÁâ Ð)Á‰ -¬%f‰ð«%ÿ¤X#ƒ=¤X#uƒ=€X#tÿ€X#¡ü«%‰ÃD¿#º¡/¸D‰Ø÷êÁú‰ÙÁù)Êø«%’’’’’’’’’Á⠉Ø)Уü«%‹à«%ë$‹¡ì«%‰‰ì«%‰à«%ƒì ÿrÿRƒÄ‰Ú…Òt‹B ;ø«%;ø«%uƋB;ü«%~»ƒ=¤X#uƒ=„X#tÿ„X#ÿ -¤X#‹]üÉÃU‰åWVSƒì‹uhˆÐ"j@èØ -ƒÄƒ>t,ƒì h¹3#èß »ÿÿƒÄ¿@¹C°8‰ÊîˆØ‰úîëaƒì hÕ3#è³ ‹N‰ -è«%ɍA‰ÂÁâ‰Ñ)ÁºÓMb‰È÷âƒÄ‰ÑÁéu¹f‰ -€µ%‰Ë¿@¹C°4‰Êî‰úˆØî‰ØfÁèî‹£ô«%ƒ=ä;&~»A¹C°p‰ÊÚîîÆä«%ë%Æä«%»B¹C°°‰ÊÚîîºa°îº!ì%þî¹¾ ¬%»$¬%ƒùbIÁà8¬%‰0I‰LÃAƒùc~ßÇhµ%Çì«% ¬%Ç€X#Ç„X#¡è«%€€€Áà£D¿#Çü«%Çø«%Ǭ%Ǭ%fÇð«%ƒ=ô«%uÇÄÛ#xÇ"ÇÈÛ#È"ëÇÄÛ#`È"ÇÈÛ#ìÎ"eô[^_]ÃU‰å‹E£€X#]ÍvU‰å‹E£„X#]ÍvU‰å‹E£X#]ÍvU‰åWVSƒì ‹E‹U ‰Eè‰Uì¸ÿÿÿÿƒ=ì«%tl‹ -ì«%‹£ì«%‹E‰A‹Eè‰A ‹Eì‰A‹E‰A»‹à«%}è‹uè됋…Òt‰ð;B  -;B u‹G;B~‰Óëâ‰ö…Ût‰ ë‰ -à«%‰‹AƒÄ [^_]ÐU‰å‹E¹‹à«%됉ы…Òt;Buó¸ÿÿÿÿ…Òt$…Éu
-‹£à«%됋‰¡ì«%‰‰ì«%¸]ÃU‰åWVSƒì,‹E‹U ‰Eè‰Uì¸ÿÿÿÿƒ=ì«%„q‹5ì«%‹£ì«%‹E‰F‹Eè‰F ‹Eì‰F‹E‰Fº‹à«%}è‹Mè됋…Ût‰È;C  -;C u‹G;C~‰Úëâ‰ö…Òt‰2鐉5à«%ƒ=„µ%…ôƒìEàPjè3óÿÿ‹à«%ƒÄ‹Eà;B  -;B u‹Eä;B~ÇEÜÇEØëK}؋à«%Mà‹B;A|‹B +Eà‰E؉Ћ@+Aë ¡à«%‹@ +EàH‰EØ¡à«%‹@+Eäʚ;‰G‹E؍€€€€€€Áà‰EԋMÜ¿ÓMb‰È÷ïÁúÁù)ÊUԍҍB‰ÂÁâ)‰Ð÷çÁê¸ðúðw¸ÈúÇv‰Ðº@îfÁèFeô[^_]ÃU‰åWVSƒì¶ä«%ƒøtƒø…Àt
-ë,ƒøtë%¹@°ë#v¹A°ëv¹B°ë v»ë"ºCÐî‰Êì¶ØìˆÁ‰ÊÁâf¶Ã‰Ó Ãf‹ð«%f)Ú·Ò‰Ö5¬%¹×®¬]‰È÷î‰ÑÁù‰ðÁø)Á -¬%‰AÁà)ȍÁ‰ÁÁá ȉò)‰¬%f‰ð«%]荒’’ Õ¾m¶‰ð÷á‰Ö‰Ê)òÑê2‰ÁÁé
-¡¬%ÀP‰ÐÁà)кè‰Ö™÷þ’’’щS¡¬%ÀP‰ÑÁá)ѺÓMb‰È÷êÁú‰ÈÁø)‰Uè‹s¿ƒÞC‰ð÷ï‰ÑÁù‰ðÁø)Á‰ÈEè‰ðÁú‰ñÁù)ʍ’’’’’’Áâ)Ѝ€€€Áà‰Cƒ=à«%„/Ç„µ%‹à«%‹Eè;B ;B …Œ‹C;BŽ€ƒ=¤X#uƒ=€X#tÿ€X#ÿ¤X#‹à«%ë#‹¡ì«%‰‰ì«%‰à«%ƒì ÿrÿRƒÄ‰Ú…Òt‹B ;Eè -;EèűB;Eì~ă=¤X#uƒ=„X#tÿ„X#ÿ -¤X#¶ä«%ƒøt"ƒø …Àt -ë/vƒøtë%¹@°ë#v¹A°ëv¹B°ë v»ë"ºCÐî‰Êì¶ØìˆÁ‰ÊÁâf¶Ã‰Ó Ãf‹ð«%f)Ú·Ò‰Ö5¬%¹×®¬]‰È÷î‰ÑÁù‰ðÁø)Á -¬%‰AÁà)ȍÁ‰ÁÁá ȉò)‰¬%f‰ð«%]荒’’ Õ¾m¶‰ð÷á‰Ö‰Ê)òÑê2‰ÁÁé
-¡¬%ÀP‰ÐÁà)кè‰Ö™÷þ’’’щS¡¬%ÀP‰ÑÁá)ѺÓMb‰È÷êÁú‰ÈÁø)‰Uè‹s¿ƒÞC‰ð÷ï‰ÑÁù‰ðÁø)Á‰ÈEè‰ðÁú‰ñÁù)ʍ’’’’’’Áâ)Ѝ€€€Áà‰C‹à«%‹Mè;J 
-;J u;B~ÇEäÇEàëJ]à‹à«%Mè‹B;A|‹B +Eè‰Eà‰Ð‹@+Aë ¡à«%‹@ +EèH‰Eà¡à«%‹@+Eìʚ;‰C‹Eà€€€€€€‰ÆÁæ‹Mä»ÓMb‰È÷ëÁúÁù)ʍ2ҍB‰ÂÁâ)‰Ð÷ãÁê¸ðúðw¸ÈúÇv‰Ðº@îfÁèîÇ„µ%ë -‰öº@°î°ðîeô[^_]ÐU‰åVSƒì‹E»¹‹à«%ëv‰Ñ‹…Òt;Buó¸ÿÿÿÿ…Ò„I…Éu‹£à«%»ë‹‰¡ì«%‰‰ì«%ƒ=„µ%…ƒ=à«%uº@°î°ðéû‰ö…Û„òƒìEðPjèºìÿÿ‹à«%ƒÄ‹Eð;B  -;B u‹Eô;B~ÇEìÇEèëJ]è‹à«%Mð‹B;A|‹B +Eð‰Eè‰Ð‹@+Aë ¡à«%‹@ +EðH‰Eè¡à«%‹@+Eôʚ;‰C‹E荀€€€€€‰ÆÁæ‹Mì»ÓMb‰È÷ëÁúÁù)ʍ2ҍB‰ÂÁâ)‰Ð÷ãÁê¸ðúðw¸ÈúÇv‰Ðº@îfÁèeø[^]Éöú‹D$¼HÏ#PèŒëÿÿ`fff f¨f¸0ŽØŽÀ° º X#@£ŒX#1ÛfŒÓü¡ô«%ƒøtèùòÿÿëè6ùÿÿ°
-º îì¨t ¸@Pè–ÿÿÿf¡”X#f9šX#t f£šX#ÿ-–X#ƒ=X#t‹X#ÿÓf©f¡ffaωöU‰å‹EØf£šX#f£”X#]Ã1ÀÈÃU‰åf¸0ŽØŽÀ‹Ef;šX#t f£šX#ÿ-–X#]ÉöU‰åƒìjjjj@èaƒÄÉÃU‰åWVSƒì ‹]‹u ‹}聉€:y"…Ût‹B8‰…öt‹BÁà
-‰…ÿt)‹B4‰ë"‰ö…ÛtÇ…öt‹BÁà
-‰…ÿtÇ@ƒ}t ‹BÁà
-‹U‰ƒÄ [^_]ÍvU‰åƒìjjjj@è̓Ä·@0ÉÃU‰å¡XV#]ÉöU‰å]ÍvU‰åSƒì‹XV#誃ì Sèucÿÿè ƒÄ‹]üÉÃU‰åWVS‹M ‹u‹}Š]‰ÈÁàeèÿÿ Eè‰ÈÁèUèˆBáÿbÿÿÿ J‰ðˆB‹Ef‰Eè‹EÁè‰EäŠEäƒà ÃË@¶ÃÁàbÿÿÿ Bçüÿ=JV#‹‰‹B‰G[^_]ÐU‰åWVSƒì ‹] ‹u‹}·EMèJV#‹‰‹@‰A‰Ê¶JÁá¶B ÁÁá·B Á…ÛtŠBƒà¶ÐÁâ·Eè Љ…ötŠE툅ÿt
-ŠEî%ðˆ‰ÈƒÄ [^_]ÉöU‰å‹E ¶UÁâ¹`Y#fÇD
-8ƂeY#îƂdY#f‰
-Áèf‰D
-]ÍvU‰åº °îº!°@î°î°î°ÿ°°pî°î°î°ÿî]ÐU‰åº °îº!°î°î°î°ÿ°°pî°î°î°ÿî]ÐU‰å‹Mf…ÉtWfƒùw¸Óà
- X#ë7fƒùw<·Éƒé¸Óà
-¡X#¢¡X#º¡î<ÿu  X#©uƒÈ¢ X#º!î]ÃU‰å‹Mf…ÉtUfƒùw¸þÿÿÿÓÀ" X#ë5fƒùw:·Éƒé¸þÿÿÿÓÀ"¡X#¢¡X#º¡î  X#©t%û¢ X#º!î]ÉöU‰å¿”X#]ÃU‰åƒì‹Ef£”X#˜PèWüÿÿƒÄÉÐU‰å¿”X#]ÃU‰åƒì‹E‰Âf£”X#ƒ=¤X#uƒì ¿ÂPèüÿÿƒÄÉÐU‰åWVì¾¹¬X#ºìX#‰öµÇ¨Ø"ǨØ"Fƒþ~åƒì EÈPèÅèºÇà;&!4#‹EÈ£ä;&¶¨X#£è;&ƒÄ‹EУð;&‹EÔ£ô;&‹EØ£ø;&hQÚ"jè£ýÿÿƒÄh[Ú"jè”ýÿÿƒÄheÚ"jè…ýÿÿƒÄhlÚ"jèvýÿÿƒÄhsÚ"jègýÿÿƒÄhzÚ"jèXýÿÿƒÄhÚ"jèIýÿÿƒÄhÇÚ"jè:ýÿÿƒÄhˆÚ"jè+ýÿÿƒÄhÚ"j èýÿÿƒÄh–Ú"j
-è -ýÿÿƒÄhÚ"j èþüÿÿƒÄh¤Ú"j èïüÿÿƒÄh«Ú"j -èàüÿÿƒÄh²Ú"jèÑüÿÿƒÄh¹Ú"jèÂüÿÿƒÄhÀÚ"jè³üÿÿƒÄh€Ù"jAè¤üÿÿƒÄhˆÙ"jBè•üÿÿƒÄhÙ"jCè†üÿÿƒÄh˜Ù"jDèwüÿÿƒÄh Ù"jEèhüÿÿƒÄh¨Ù"jFèYüÿÿƒÄh°Ù"jGèJüÿÿƒÄh¸Ù"jpè;üÿÿƒÄhÀÙ"jqè,üÿÿƒÄhÈÙ"jrèüÿÿƒÄhÐÙ"jsèüÿÿƒÄhØÙ"jtèÿûÿÿƒÄhàÙ"juèðûÿÿƒÄhèÙ"jvèáûÿÿƒÄhðÙ"jwèÒûÿÿf -T;&€¾ƒÄvÀÅ@·%ƒì jh‰hØPõ·ÀPèúÿÿƒÄ Fþš~ǃì hÐèFùÿÿƒÄÛãݵTÿÿÿ›¿`;&µTÿÿÿ¹üó¥ ÀƒÈ""ÀÛãèƒûÿÿèúÿÿeø^_]ÍvU‰åSƒìº!°ÿîè’ûÿÿ¹@ºC°6Êîîƒ=ä;&~¹AºC°tî°‰Êî°ë»B¹C°°‰ÊÚîîºaî‹]üÉÃU‰å‹U‹E ‰•ìX#]ÉöU‰å‹U‹E ‰•¬X#]ÉöU‰åƒìh4#è
-è— ƒÄÉÉöœX‰Á5PœX9ÈtQ¸Ã¸ÜX‰Á5 PœX1ÈtQ¸øÃf1Àžf¸f»öóŸ€üu¸øÃƨX#Ûã¹âþfǪX#ZZÝ=ªX#¹âþf¡ªX#<u+Ù=ªX#¹âþf¡ªX#f%?fƒø?uƨX#ƨX#Éö`¸ëp`¸ëh`¸ë``¸ëX`¸ëP`¸ëH`¸ë@`¸ë8`¸ ë0`¸
-ë(`¸ ë `¸ ë`¸ -ë`¸ë`¸ë ¨Pf¸0ŽÀŽØüX1ÛfŒÓP‹…¬X#ÿÓ[° ƒûrº îº îf¡”X#f;šX#t f£šX#ÿ-–X#©¡aϸ鋸選ëz¸ës¸ël¸ëe¸ë^¸ëW¸ ëP¸
-ëI¸ ëB¸ ë;¸ -ë4¸ë-¸ë&¸ë` ¨f¸0ŽÀŽØüèש¡aÏPf¸0ŽØŽÀXfŒÓ‹=JV#ß1ۊŠ_Áãf‹_ÜfŒÒfŒÛŽÓSRPÿ…ìX#ƒÄX[ŽÐ)ÜÏU‰åWVSƒì ‹u¸¹ ‰÷üó«è|ýÿÿ…ÀtÇëUèŠýÿÿ…Àt7ÇFǸ¢‰^‰N‰V …Àt+¸¢‰F‰^‰N‰V ëÇècýÿÿ…ÀtÇ ƒÄ [^_]ÍvU‰åWV¿,Y#È·À-yƒÀÁø9ÂtU¿,Y#@ÀÝ4Ŭ·%›È·À-yƒÀÁøf£,Y#¿5,Y#¿ <&4v4ö4õ¬·%¹üó¥Ý% <&^_]ÉöU‰å¿,Y#]ÃU‰åWVSƒì(ŠM¡0Y#Áà ˜€ f¶Ž<&f£JÏ#f¶<&f£LÏ#€ù t%€ù €ù„óé‰ö€ù
-„#é‰öfƒJÏ#·JÏ#;<&Œ½fÇJÏ#·LÏ#¡”<&H9Â…¿¡<&H‰Eì‰Uèf¾Œ<&Áâf‰Uò¡0Y#Áà °€ ¿;}è:¹;Mì*_ÿv‰ø¯<&È·F‰Ø¯<&Èf‰FA;Mì~ÜG;}è~ƹ;MìKWÿ‰Ð¯<&Èf‹]òf‰FA;Mì~çé)‰öfÇHÏ#·JÏ#‰Áƒø~ºƒÂ·ÂƒÀ9È|óf‰HÏ#f¡HÏ#f£JÏ#éævfÇJÏ#·LÏ#¡”<&H9Â…¾¡<&H‰Eà‰UÜf¾Œ<&Áâf‰Uæ¡0Y#Áà °€ ¿;}Ü=v¹;Mà*_ÿv‰ø¯<&È·F‰Ø¯<&Èf‰FA;Mà~ÜG;}Ü~ƹ;MàGWÿ‰Ð¯<&Èf‹]æf‰FA;Mà~çé%‰öfÿ -JÏ#·JÏ#·LÏ#¯<&ÂÆS fÿJÏ#éõ‰ö·JÏ#·LÏ#¯<&Ј CfÿJÏ#·JÏ#;<&Ž¿fÇJÏ#·LÏ#¡”<&H9Â…š¡<&H‰EԉUÐf¾Œ<&Áâf‰UÚ¡0Y#Áà °€ ¿;}Ð=v¹;MÔ*_ÿv‰ø¯<&È·F‰Ø¯<&Èf‰FA;MÔ~ÜG;}Ð~ƹ;MÔ'Wÿ‰Ð¯<&Èf‹]Úf‰FA;MÔ~çëfÿLÏ#·5JÏ#·=LÏ#‰øf¯<&f‰EΡ0Y#Áà fEÎfuλÔ°‰Úî¹Õ‰ÊŠEÎî°‰Úîf‹EÎfÁè‰Êî‰óˆŽ<&‰ø¢<&ƒÄ([^_]ÐU‰åWVSƒì‹u‹} ‰øf¯<&f‰Eò¡0Y#Áà fEòfuò»Ô°‰Úî¹Õ‰ÊŠEòî°‰Úîf‹EòfÁè‰Êî‰ð¢Ž<&‰úˆ<&ƒÄ[^_]ÍvU‰åS¹Ô°
-‰Êî»Õ‰ÚŠEî° ‰Êî‰ÚŠE î‹$ÉÍvU‰åWVSƒìf¾EÁàf‰Eò¡0Y#Áà ¸€ ‹]ë0‹M ;M(sÿ‰Ø¯<&È·G‰ð¯<&Èf‰GA;M~ÜC;]~ʋM ;MSÿv‰Ð¯<&Èf‹]òf‰GA;M~çƒÄ[^_]ÍvU‰åWVSƒì ¡<&H‰Eð‹”<&K‰]ìf¾Œ<&Áàf‰Eê¡0Y#Áà °€ ¿9ß<‰ö¹;Mð*_ÿv‰ø¯<&È·F‰Ø¯<&Èf‰FA;Mð~ÜG;}ì~ƹ;MðWÿ‰Ð¯<&Èf‹]êf‰FA;Mð~çƒÄ [^_]ÍvU‰å·J‰<&¶„@£”<&¶„ÿ ¢Œ<&¶P¢Ž<&¶Q¢<&¶`¢OÏ#¶a¢NÏ#Ç4Y#Ç0Y#]ÃU‰åWVSƒì Ž<&¢P <&¢Q¶ÀP¶Ž<&PèŠýÿÿ¶NÏ#¶5OÏ#ƒÄ¹Ô°
-‰Êî¿Õ‰úˆØî° ‰Êî‰ú‰ðîeô[^_]ÍvU‰åSƒì‹]€;tŠCƒì ¾ÀPèiùÿÿƒÄ€;ué‹]üÉÃU‰åVS‹E‰ÃÁã £4Y#¹Ô° -‰Êî¾Õ‰òˆØî° ‰Êî‰ØfÁè‰òî[^]ÃU‰åVS‹u‹0Y#Áâ»`Ï#¶Ž<&‰¹€Ï#¶<&‰
-µŠ¢Ž<&Š
-¢<&‰50Y#[^]ÃU‰å¡4Y#]ÉöU‰å¡0Y#]ÉöU‰åWVSƒì ‹}f¾u Áæf¾E Ƌ]‹E9Ã3v‹M9ù#‰Ê¯<&¡0Y#Áà ÐØf‰´€ A9ù~ÞC;]~ЃìÿuÿuèüÿÿŠE¢<&ŠE¢Ž<&ƒÄeô[^_]ÍvU‰åWVSƒì ¡<&H‰Eð‹=”<&Of¾Œ<&ÁãƒË ¾9Æ4¹9ù%v‰Ê¯<&¡0Y#Áà Ððf‰œ€ A9ù~ÞF;uð~̃ìjjèûÿÿƍ<&ÆŽ<&ƒÄeô[^_]ÍvU‰åS‹U ‹]‹M¯<&¡0Y#Áà ÂU”€ ˆ
-ˆZ‹$ÉÉöU‰åS‹E ‹]‹M‰Â¯<&¡0Y#Áà ÂU”€ ¶B…Étˆ¶‰Â…Ûtˆ¾Â‹$ÉÐU‰åS‹E ‹MŠ]‰Â¯<&¡0Y#Áà ÂU”€ €9tŠˆABˆB€9uò‹$ÉÐU‰åƒìh<4#èTýÿÿôƒÄÉÉöU‰åƒìjèƒÄÉÉöU‰åƒìh4èƒÄÉÍvU‰åVS‹Ef£r¹d»þ¾v‰Êì©t Fþÿÿ~í¸@=Ÿ†~ø‰ÚˆÈö@=Ÿ†~øë‰öU‰åSƒìE Pÿuh Ï#èX‰ÃÇ$ Ï#è¢üÿÿ‰ØƒÄ‹]üÉÃU‰åWVSìð‹} ŠEˆ…ÿÿÿEPÿuÿÿÿSè‰ÆS¾…ÿÿÿPWÿuè±þÿÿ‰ðƒÄ eô[^_]ÃU‰åSƒìE Pÿuh Ñ#謉ÃÇ$ Ñ#è&üÿÿ‰ØƒÄ‹]üÉÃU‰åS‹M‹U ‰Ë€:tvŠˆBA€:uõƉ؋$ÉÍvU‰åVS‹]‹U ‹M‰Þë‰öŠˆBC€:t‰ÈI…ÀîƉð[^]ÐU‰å‹U‹M ë -¸€:tBAŠ:t)Ð]ÃU‰åS‹U‹] ‹M…Éëv¶¶Sÿ)Ð됊C8uíŠB„ÀtIu︋$ÉÐU‰å‹U¸€:tB@€:uù]ÍvU‰åS‹E‹] €8t‰Ú€:tŠv:
-tB€:uö@€8u下$ÉÉöU‰å‹E‹U €8t ‰ö8t @€8uö¸]ÍvU‰åS‹]‰Ú€;t‰öŠ
-AŸ<wAàˆB€:uì‰Ø‹$ÉÐU‰åS‹]‰Ú€;t‰öŠ
-A¿<wA ˆB€:uì‰Ø‹$ÉÐU‰åS‹U‹M ‰Ó€;tvB€:uú늈AB€9uõƉ؋$ÉÍvU‰åWVSƒì<‹u‹]ÇEèÇEäÇEàÇEÜÇEØÇEÔÇEпÇEÌÙîÝ]À‰uì‹E €8„D‹U €:%t…ÿuŠˆB‰U FÿEèév‹E €8%u%@‰E ¿ÇEä
-ÇEàÇEØÇE̋U ¾ƒè%ƒøS‡Ñÿ$… %#‰öÆ%FÿEè鼃ÉòFŠCüˆÿEè驐ƒ}Øt"ƒ}؃}Øtëƒ}ØuƒÃ‹Cü‰EÔë -vƒÃ¿Sü‰Uԃì ÿuÌÿuäj
-VÿuÔè¾ éœƒ}Øt"ƒ}؃}Øtëƒ}ØuƒÃ‹Cü‰EÐë -vƒÃ·Sü‰UЃì ÿuÌÿuäj
-VÿuÐè.éPƒ}Øt"ƒ}؃}Øtëƒ}ØuƒÃ‹Cü‰EÐë -vƒÃ·Sü‰UЃì ÿuÌÿuäjVÿuÐèâ鐃ËCü‰EЃì jÿuäjVPèÂé䐃ËSü€:tŠˆBFÿE܀:uò‹UÜUèévƒ}Øtƒ}؃}Øtëƒ}Øu ƒÃÝCøÝ]ÀƒìÿuÌÿuàÿuäVÿuÄÿuÀèYë~vƒ}Øtƒ}؃}Øtëƒ}Øu ƒÃÝCøÝ]ÀƒìÿuÌÿuàÿuäVÿuÄÿuÀè} -ë>vƒ}Øtƒ}؃}Øtëƒ}Øu ƒÃÝCøÝ]ÀƒìÿuÌÿuàÿuäVÿuÄÿuÀèa‰EÜEèÆ¿ƒÄ é±ÇEØé¥ÇEØ陃MÌ鐍vƒMÌ鄍v¿ƒMÌëvƒÿu?ƒìEìPj
-ÿu èb
-‰EäƒÄ‹E €80u ÷EÌtƒMÌ됃MÌ‹UìJ‰U ë4vƒÿu,ƒìEìPj
-ÿu è
-‰Eà‹EìH‰E ¿ƒÄë‰ö¿ÿE ‹U €:…¼üÿÿÆ‹Eèeô[^_]ÉöU‰åƒì EPÿu ÿuè7üÿÿƒÄÉÉöU‰åWVSƒì,‹u‹} ‹]ÇEìÇEèÇEäÇEàÇEÜÇEØÇEÔÇEЉuð€?„>€?%tƒ}Ôu ŠˆGFÿEìëá€?%uGÇEÔÇEè
-ÇEàÇEоƒè%ƒøS‡çÿ$…ð&#Æ%FÿEìéԃÉòFŠCüˆÿEìéÁƒ}àt&ƒ}àƒ}àt
-ë"ƒ}àt
-ëƒÃ‹CüëƒÃ‹CüëƒÃ¿Cü‰E܃ì ÿuÐÿuèj
-VÿuÜè鏐ƒ}àt&ƒ}àƒ}àt
-ë"ƒ}àt
-ëƒÃ‹CüëƒÃ‹CüëƒÃ·Cü‰E؃ì ÿuÐÿuèj
-ëBƒ}àt&ƒ}àƒ}àt
-ë"ƒ}àt
-ëƒÃ‹CüëƒÃ‹CüëƒÃ·Cü‰E؃ì ÿuÐÿuèjVÿuØè6‰EäEìÆÇEÔƒÄ éҍvƒÃ‹Sü€:tŠˆBFÿEä€:uò‹EäEì飍vÇEàé›ÇEà鏃MÐ醍vƒMÐë}‰öÇEÔƒMÐënvƒ}Ôu6ƒìEðPj
-W蓉EèƒÄ€?0u ÷EÐtƒMÐ됃MЋ}ðOë1‰öƒ}Ôu)ƒìEðPj
-WèW‹}ðOÇEÔƒÄë
-vÇEÔGé¼ýÿÿvÆ‹Eìeô[^_]ÉöU‰åƒì EPÿu ÿuèGýÿÿƒÄÉÉöU‰åWVSƒì,‹}‹uÇEèÇEäÇEàÇEÜÇEØ»‰}ì饐‹U €:%t…Ûu B‰U 鏍v‹E €8%u%@‰E »ÇEäÇEàÇEÜÇE؋U ¾ƒè*ƒøN‡Eÿ$…@(#‰öƒû…8ƒìEìPj
-ÿu èN‰E܃MØ‹EìH‰E ƒÄéŠGƒÆ‹^üˆëÝØÿEèéõƒÆ‹^üëG€?tƒì ¾PèBƒÄ…ÀuçÇEÔë#‰ö÷EØuŠˆCë‹UÜ9UÔ}ŠˆCÿEÔG€?tƒì ¾PèþƒÄ…ÀtÇÆ덉öƒìhH4#Wè&÷ÿÿ‰ÇƒÄ EìPj
-WèՉ‹}ìƒÄƒ}à…Wƒ}ät)ƒ}ä ƒ}ätéCÿÿÿƒ}ä…9ÿÿÿƒÆ‹Fü‰é,ÿÿÿƒÆ‹Füf‰éÿÿÿ‰öƒìhU4#Wè¶öÿÿ‰ÇƒÄ EìPj
-됃ìh`4#Wèšöÿÿ‰ÇƒÄ EìPjWè ‹}ìƒÄƒ}à…̓}ät+ƒ}ä -ƒ}äté¹þÿÿ‰öƒ}ä…­þÿÿƒÆ‹Vü‰é þÿÿƒÆ‹Vüf‰é‘þÿÿ‰öƒìhx4#Wè*öÿÿ‰ÇƒÄEìPWè;‹}ìƒÄƒ}àu`ƒ}ät)ƒ}ä ƒ}ätéMþÿÿƒ}ä…CþÿÿƒÆ‹FüÝé8þÿÿƒÆ‹FüÙé*þÿÿvÇEäë vÇEäëvÇEàëÝؐ»ÿE ‹E €8…Pýÿÿ‹Eèeô[^_]ÐU‰åƒì EPÿu ÿuèïüÿÿƒÄÉÉöU‰åWVSƒì,‹u ÇEп‹Eƒð‰EԋU‰U̅Òy‰Ñ÷ىM̃}y ‹E…Ày÷Ø됋E÷EÔu ƒ}yƒ}yGƒ}u‹EÐÆD(Ø0@‰EÐë8v…Àt1U؉Uȉöƒì º÷ủÃRèI‹MȋUЈ
-B‰UЉ؃Ä…Àu×}ЋEԃàƒøu‰ú;}} -‰öÆ FGB;U|õƒ}y ƒ}yÆ-ë ÷EÔtÆ+F‹Eԃàƒøu‰ú;}} Æ0FGB;U|õ‹UÐJx M؊
-ˆFJy÷‹Eԃàƒøu‰ú;}} Æ FGB;U|õƉøeô[^_]ÃU‰åƒì‹Eÿuÿu÷ØPÿu ÿuèŸþÿÿƒÄ ÉÉöU‰å‹E…Ày÷Ø]ÉöU‰åSƒì‹]èÁîÿÿƒì Sè1 -ÿÿU‰åWVSƒì‹M‹} ÙîÙÀÙ軀9-u ¾ÿÿÿÿë
-‰ö¾ëA€90túŠƒè0< w(Ý€)#ëÙˍv¾ƒè0AÜËÙËPÚ$XŠƒè0< vâÝۀ9.u9AŠƒè0< w/Ý€)#ëÙÉÙʉö¾ƒè0AÜÊÙÊPÚ$ÙÉXØʊƒè0< vÝÝÚÙÉÞùÞÁVÚ $^€9et €9E…“A€9-u
-¾ÿÿÿÿAë‰ö€9+u ¾Aëv¾Šƒè0< weÝ€)#¾ƒê0A·ÃÙÀPÚ $Ù}ð‹]ðÆEñ Ùmð‰]ðÛ]ìÙmð‹Eì·À‰$Û$‰$Ú$ZÙ}ð‹UðÆEñ Ùmð‰UðÛ]ìÙmð‹Eì‰ÃŠƒè0< v£Ý؅ö~!ºf…Ût4Ý€)#·Ã‰öÜÉB9Â|ùëvº·Ã‰Ã9Â}Ý€)#ÜùB9Ú|ùÝ؅ÿt‰ƒÄ[^_]ÐU‰åWVSƒì ‹]‹} ÇE쾀;-u ÇEðÿÿÿÿCë‰ö€;+u ÇEðCëÇEð€;0u>C€;0túë6ƒì ¾PCè‰ÂƒÄ9ú…Òy
-¸ëEv‰ð¯÷Ö9ð~ÇEìƒìW¾P聃ąÀu¶ƒ}t‹E‰ƒ}ìt¾ÿÿÿ¯uð‰ðeô[^_]ÉöU‰åWVSƒì ‹]‹} ÇEð¾€;0uC€;0tú€;xuKƒÿuFC€;0u@‰öC€;0túë6ƒì ¾PCè_‰ÂƒÄ9ú…Òy
-¸ëAv‰ð¯÷Ö9ðvÇEðƒìW¾PèуÄ…Àu¶ƒ}t‹E‰ƒ}ðt¾ÿÿÿ‰ðeô[^_]ÉöU‰åŠUBÐ< w ¾Âƒè0ë&vB¿<w ¾Âƒè7됍BŸ<w ¾ÂƒèW됾Â]ÍvU‰å‹Uƒú w B0¾À됍BöƒøwB7¾Àë¾Â]ÍvU‰åŠUƒê0¸€ú –À]ÉöU‰åŠUBÐ<vBŸ<w¸ë¸]ÐU‰åŠU€ú/~‹E 8Y#:Pÿ¸ë¸]ÐU‰åŠUBŸ<w Bà¾Àëv¾Â]ÍvU‰åŠUB¿<w B ¾Àëv¾Â]ÍvU‰åVS¾ƒì ¾]Sè%ƒÄ…Àuƒì Sè5ÿÿÿƒÄ…Àt¾‰ðeø[^]ÃU‰åŠUƒêA¸€ú9–À]ÉöU‰å¸€}/žÀ]ÍvU‰åŠUƒêa¸€ú–À]ÉöU‰åŠUB÷<v
-¸€ú u¸]ÉöU‰åŠUƒêA¸€ú–À]ÉöU‰åWVSƒì ÝEÝUè‹]‹}ÇEäSd$øÝ$èoƒÄ…Àtƒì Sè·îÿÿƒÄéPvÙîÝEèÚéßà€äE€üu Æ-C€uï€ë÷EtÆ+CÿEä݈)#ÝEèÚéßà€äE€üuÆ0ÆC¸éû‰öÙèÝEèÝáßà€äE€üu3¾Ýéßà€äE€üuHݘ4#ÝEèØÉÝUèNÝêßà€äE€ütëÝØë)vÝØÝؾݘ4#ÝEèë ÝEèØñÝUèFÝéßàöÄtîÝ؃ì Vè÷ùÿÿƒÄƒøc~ƒïë‰öƒø ~ƒïë‰ö…ö~Oƒì‹EƒÈPÿuWSÿuìÿuèèUEäƒÄ …öu‹Eäë;‰ö]äÆeCƒì jºgfff‰ð÷êÁú‰ðÁø)ƒÂRj
-SVè\ùÿÿ‹UäD‰EäƒÄ eô[^_]ÍvU‰åWVSìŒÝEݝþÿÿ‹]Dž€þÿÿ½¸þÿÿ¹K¸üó«ƒìSÿµ”þÿÿÿµþÿÿ貃ąÀtƒì SèúìÿÿƒÄé‰öÙî݅þÿÿÚéßà€äE€üuÆ-C€µ—þÿÿ€ëv÷Et
-Æ+Cÿ…€þÿÿƒì…˜þÿÿPÿµ”þÿÿÿµþÿÿèþݝpþÿÿ‹…pþÿÿ‹•tþÿÿ‰Æ‰×DžŒþÿÿƒÄ݅˜þÿÿÙèÙÉÝáßàöÄ…ø重vh$@jÿµœþÿÿÿµ˜þÿÿè$݅˜þÿÿÜ5)#ݝ˜þÿÿÙ½´þÿÿ‹´þÿÿƅµþÿÿ Ù­´þÿÿ‰´þÿÿß½¨þÿÿÙ­´þÿÿ‹…¨þÿÿ‰$èûÿÿ‹•Œþÿÿˆ„*¸þÿÿB‰•ŒþÿÿƒÄ݅˜þÿÿÙèÙÉÚéßàöÄ„oÿÿÿ‹•Œþÿÿ•€þÿÿ‰ÑI…¸þÿÿ‰…|þÿÿë‰ö‹•|þÿÿŠˆCI‹•Œþÿÿƒê‰ÐÁèH!Â9Ñ}ޅÉx‹Œþÿÿƒéx
-vÆ0CIyùÆëÝØÝØÆ0Cÿ…€þÿÿÝ 4#‰µpþÿÿ‰½tþÿÿ݅pþÿÿÚéßàöÄE…\‹E@9…€þÿÿLÆ.Cÿ…€þÿÿ‹Eƒà‰…ˆþÿÿDž„þÿÿDžŒþÿÿv‰µpþÿÿ‰½tþÿÿ݅pþÿÿܨ4#Ü -)#ݝpþÿÿ‹µpþÿÿ‹½tþÿÿƒì…˜þÿÿPWVèݝpþÿÿ‹•pþÿÿ‹tþÿÿ‰Ö‰Ï݅˜þÿÿÙ½´þÿÿ‹´þÿÿƅµþÿÿ Ù­´þÿÿ‰´þÿÿ۝¤þÿÿÙ­´þÿÿ‹…¤þÿÿƒÄ…Àtƒ½ˆþÿÿu
-Džˆþÿÿƒì PèÓùÿÿˆCÿ…€þÿÿÿ…ŒþÿÿƒÄƒ½ˆþÿÿt‹E9…Œþÿÿ~
-Dž„þÿÿ‹•€þÿÿ9U}
-Dž„þÿÿƒ½„þÿÿ„ýþÿÿKë
-‰öÿ€þÿÿ‰Ã€;0u Cÿ€{ÿ.uêCÆ‹…€þÿÿeô[^_]ÃU‰åWVSƒì‹]‹u ‹}WVSèZƒÄ…Àtƒì Wè¢éÿÿƒÄéñ‰öÙî‰]è‰uìÝEèÝáßàÝـäE€üuÙàëvÝ؉]è‰uìÝEèݘ)#ÙÉÝáßàÝـäE€üuÝØÆ0ÆG¸雺ÙèÙÉÝáßà€äE€üu/Ýáßà€äE€üu?ݘ4#ëÙɐÜÉÙÉJÝâßà€äE€ütìÝØëvÝÙݘ4#ë‰öØñÙÉBÙÉÝáßàöÄtðÝØÝ؍BƒøvƒìÿuÿuÿuWVSèÔùÿÿë‰öƒìÿuÿuÿuWVSèXûÿÿƒÄ eô[^_]ÐU‰åƒìSÙ}ü›f‹Eüf -? f‰EøÙmø›ÝEÙüÝ]ð›‹Uð‹Mô‹]‰‰KÝEÜeðeì›ÛâÙmü›[ÉÍvU‰åƒì‹E‹U ‰Eø‰Uü‹MUøf‹BfÁè%ÿ=ÿt¸ëk÷Bÿÿuƒ:t…Étƒìh°4#QèDçÿÿƒÄ¸ë@‰ö€zy…Étƒìh´4#Qè çÿÿƒÄ¸ë‰ö…Étƒìh¹4#QèçÿÿƒÄ¸ÉÃU‰åƒì¸ Ó#ƒ=DY#tÿDY#ÉÃU‰å‹E£DY#]ÍvU‰åƒì‹E‹U ‰Eø‰UüUø¹f‹BfÁè%ÿ=ÿu÷Bÿÿuƒ}øt¹‰ÈÉÉöU‰åSƒì‹E ‹]ÆPè‰âÿÿ‰ØƒÄ‹]üÉÍvU‰åVSƒì ÝEÝUð‹]‹uVSd$øÝ$èrÝ]èƒÄƒ=HY#ÿtWƒìVSèYÿÿÿƒÄ…ÀuFƒìÿuôÿuðèDÿÿÿƒÄ…Àu1Ùî‰]à‰uäÝEàÚéßà€äE€ô@uƒì jVSÿuôÿuðè4ƒÄ ëvÝEèeø[^]ÉöÝD$ ÝD$Ùø›ßàžzøÝÙͶ¼'U‰åVSƒì0ÝE‹]‹u‹EÝUà‰]è‰uìPÿú‡Èÿ$•°)#ÝØÇEغ¾4#ƒøc~ºÃ4#‰UÜÇEðÇEôƒ=HY#„}ƒì EØP誃ąÀ…uƒ=HY#…YƒìjhÉ4#éëvÝØÇEغÝ4#ƒøc~ºâ4#‰UÜÇEðÇEôƒ=HY#„ƒì EØPè>ƒÄ…À… ƒ=HY#…íƒìjhè4#év‰]à‰uäÝ]èÇEغü4#ƒøc~º5#‰UÜÇEðÇEôƒ=HY#„žƒì EØPè˃ąÀ…–ƒ=HY#…zƒìjh 5#é ÝØÇEغ5#ƒøc~º$5#‰U܃=HY#uÇEðàÇEôÿÿïGé¸ -¡<Y#‹@Y#‰Eð‰Uôé¡ -‰öÝØÇEغ²6#ƒøc~º¸6#‰U܃=HY#uÇEðàÇEôÿÿïGéh -¡<Y#‹@Y#‰Eð‰UôéQ -‰öÝØÇEغ+5#ƒøc~º/5#‰U܃=HY#uÇEðàÇEôÿÿïGé -¡<Y#‹@Y#‰Eð‰Uôé -‰öÝØÇEغ+5#ƒøc~º/5#‰UÜÇEðÇEôéÑ ‰öÝØÇEغ·/#ƒøc~º45#‰U܃=HY#uÇEðàÇEôÿÿïÇë¡<Y#‹@Y#ò€‰Eð‰Uôƒ=HY#„óƒì EØPè ƒÄ…À…ëƒ=HY#…σìjh85#éaÝØÇEغ·/#ƒøc~º45#‰U܃=HY#uÇEðàÇEôÿÿïÇë¡<Y#‹@Y#ò€‰Eð‰Uôƒ=HY#„gƒì EØP蔃ąÀ…_ƒ=HY#…Cƒìjh85#éÕ -ÝØÇEغx/#ƒøc~ºJ5#‰U܃=HY#uÇEðàÇEôÿÿïÇë¡<Y#‹@Y#ò€‰Eð‰Uôƒ=HY#„Û -ƒì EØPèƒÄ…À…Ó -ƒ=HY#…· -ƒìjhN5#éI -ÝØÇEغx/#ƒøc~ºJ5#‰U܃=HY#uÇEðàÇEôÿÿïÇë¡<Y#‹@Y#ò€‰Eð‰Uôƒ=HY#„O -ƒì EØPè| -ƒÄ…À…G -ƒ=HY#…+ -ƒìjhN5#é½ ÝØÇEغ`5#ƒøc~ºc5#‰U܃=HY#uÇEðàÇEôÿÿïÇë¡<Y#‹@Y#ò€‰Eð‰Uôƒ=HY#„à ƒì EØPèð ƒÄ…À…» ƒ=HY#…Ÿ ƒìjhg5#é1 ÝØÇEغ`5#ƒøc~ºc5#‰U܃=HY#uÇEðàÇEôÿÿïÇë¡<Y#‹@Y#ò€‰Eð‰Uôƒ=HY#„7 ƒì EØPèd ƒÄ…À…/ ƒ=HY#… ƒìjhg5#é¥ ÝØÇEغy5#ƒøc~º€5#‰U܃=HY#uÇEðàÇEôÿÿïGéP ¡<Y#‹@Y#‰Eð‰Uôé9 ‰öÝØÇEغy5#ƒøc~º€5#‰U܃=HY#uÇEðàÇEôÿÿïGë¡<Y#‹@Y#‰Eð‰Uôƒ=HY#„a ƒì EØPèŽ ƒÄ…À…Y ƒ=HY#…= ƒìjhˆ5#éÏ
-vÝØÇEغœ5#ƒøc~º 5#‰U܃=HY#uÇEðàÇEôÿÿïÇë¡<Y#‹@Y#ò€‰Eð‰Uôƒ=HY#„å ƒì EØPè ƒÄ…À…Ë
-ƒ=HY#…¯
-ƒìjh¥5#éA
-ÝØÇEغœ5#ƒøc~º 5#‰U܃=HY#uÇEðàÇEôÿÿïÇë¡<Y#‹@Y#ò€‰Eð‰Uôƒ=HY#„G
-ƒì EØPèt
-ƒÄ…À…?
-ƒ=HY#…#
-ƒìjh¶5#éµ ÝØÇEغÉ5#ƒøc~ºÏ5#‰U܃=HY#uÇEðàÇEôÿÿïÇë¡<Y#‹@Y#ò€‰Eð‰Uôƒ=HY#„Íƒì EØPèè ƒÄ…À…³ ƒ=HY#…— ƒìjhÖ5#é) ÝØÇEغÉ5#ƒøc~ºÏ5#‰U܃=HY#uÇEðàÇEôÿÿïÇë¡<Y#‹@Y#ò€‰Eð‰Uôƒ=HY#„/ ƒì EØPè\ ƒÄ…À…' ƒ=HY#… ƒìjhé5#靐ÝØÇEغþ5#ƒøc~º6#‰UÜÇEðÇEôƒ=HY#… ƒì EØPèòƒÄ…À…½ƒìjh6#jèÞõÿÿèeõÿÿÇ!ƒÄ降vÇEغþ5#ƒøc~º6#‰U܃=HY#uvÇEðàÇEôÿÿïG‰]ЉuÔÝEÐÜ -h7#Ý]Ћ]ЋuÔÙîÙÉÚéßà€äE€ü…¯ƒìVSèjƒÄ‰]ЉuÔÝEÐÙÉÚéßà€äE€ü@„‡ÇEðàÇEôÿÿïÇét¡<Y#‹@Y#‰Eð‰Uô‰]ЉuÔÝEÐÜ -h7#Ý]Ћ]ЋuÔÙîÙÉÚéßà€äE€ü…6ƒìVSèñƒÄ‰]ЉuÔÝEÐÙÉÚéßà€äE€ü@„¡<Y#‹@Y#ò€‰Eð‰UôéòvÝØÇEغþ5#ƒøc~º6#‰UÜÇEðÇEôéÁ‰öÝØÇEغþ5#ƒøc~º6#‰U܃=HY#uÇEðÇEôë¡<Y#‹@Y#ò€‰Eð‰Uôƒ=HY#„ãƒì EØPèƒÄ…À…Ûƒ=HY#…¿ƒìjh6#éQÝØÇEغþ5#ƒøc~º6#‰U܃=HY#uÇEðÇEôëÇEðÇEôøƒ=HY#„`ƒì EØP荃ąÀ…Xƒ=HY#…<ƒìj h@7#éΉöÇEغ96#ƒøc~º>6#‰U܃=HY#u6ÙîÙÉÚéßàöÄEuÇEðàÇEôÿÿïGém‰öÇEðàÇEôÿÿïÇéX‹ -<Y#‹@Y#‰Mð‰]ôÙîÙÉÚéßàöÄE„4‰È‰Úò€‰Eð‰UôéÝØÇEغD6#ƒøc~ºI6#‰U܃=HY#uÇEðÇEôëÇEðÇEôøƒ=HY#„Lƒì EØPèyƒÄ…À…Dƒ=HY#…(ƒìjhO6#麉öÇEغc6#ƒøc~ºh6#‰U܃=HY#uÝ]ðëÝØÇEðÇEôøƒ=HY#„Òƒì EØPèÿƒÄ…À…ʃ=HY#…®ƒìjhn6#é@ÝØÇEغƒ6#ƒøc~º6#‰UÜÇEðÇEôøƒ=HY#„iƒì EØP薃ąÀ…aƒ=HY#…Eƒìjh˜6#é׍vÝØÇEغ±6#ƒøc~º·6#‰UÜÇEðÇEôøƒ=HY#„ýƒì EØPè*ƒÄ…À…õƒ=HY#…Ùƒìjh¾6#ékvÝØÇEغÓ6#ƒøc~ºÙ6#‰UÜÇEðÇEôøƒ=HY#„‘ƒì EØP较ąÀ…‰ƒ=HY#…mƒìjhà6#éÿvÇEغÓ6#ƒøc~ºÙ6#‰UÜÜ5p7#Ý]ðƒ=HY#„,ƒì EØPèYƒÄ…À…$ƒ=HY#…ƒìjhõ6#隉öÇEغ7#ƒøc~º7#‰U܋ -<Y#‹@Y#‰Mð‰]ôÙîÙÉÚéßàöÄEtC‰È‰Úò€‰Eð‰Uôë1‰öÇEغ7#ƒøc~º7#‰U܍d$øÝ$jjè›Ý]ðƒÄƒ=HY#…jé|vÝØÇEغ7#ƒøcŽ•º7#鋍vÝØÇEغ·/#ƒøc~uº45#ën‰öÝØÇEغ+7#ƒøc~Yº.7#ëR‰öÝØÇEغx/#ƒøc~=ºJ5#ë6‰öÝØÇEغ27#ƒøc~!º57#ë‰öÝØÇEغ`5#ƒøc~ºc5#‰UÜÇEðÇEôƒ=HY#„¯ƒì EØPèʃąÀ…•ƒ=HY#…‹ƒìjÿuÜjè«îÿÿƒÄ jh7#jèšîÿÿƒÄëfÝØÇEغz5#ƒøc~º5#‰U܃=HY#uÇEðàÇEôÿÿïGë¡<Y#‹@Y#‰Eð‰Uôƒ=HY#tƒì EØPè2ƒÄ…À…ýè¶íÿÿÇ"éívÝØÇEغz5#ƒøc~º5#‰U܃=HY#uÇEðàÇEôÿÿïGë¡<Y#‹@Y#‰Eð‰Uôƒ=HY#„‰ƒì EØP趃Ä…À…ƒ=HY#uiƒìjh‰5#jè™íÿÿƒÄëSÇEغþ5#ƒøc~º6#‰UÜÝ]ðƒ=HY#ÿt ƒ=HY#uÇEðÇEôð?ë$‰öƒì EØPè@ƒÄ…ÀuèÈìÿÿÇ!ëÝØÝEðeø[^]ËT$â€‹D$%ÿÿÿ ЉD$ÝD$ÉöU‰å¸]ÉöÝD$ÙüÉö¼'U‰åWVSƒì ‹E ‰EðEƒEðƒeðøƒàø‰Eì‹Eð9EìsƒìjUhx7#h‚7#è˜ ƒÄ‹Eð9Eì„Ä‹E‹…Û„·‹C;C rƒìj`hx7#h7#è` ƒÄöCtƒìjahx7#hÀ7#èC ƒÄöC tƒìjbhx7#h8#è& ƒÄ‹Eì;CvL‹Eð;C sD‰Æ‹}ì;ss‹s;{ v‹{ 9÷wƒìjnhx7#h¡7#èæ ƒÄƒì‰ø)ðPVÿu蚃ċ…Û…Iÿÿÿeô[^_]ÐU‰åWVSƒì ‹u ‹E‹}‰ÂUƒÀƒàøƒâø9†ŒÇF‰F‰V ‹E‰F‰~ÇF‹MëF‰ö9óuƒìjlh08#h;8#èX ƒÄ‹F ;Cv‹F;C sƒìjmh08#h`8#è1 ƒÄ‰Ù‹…Ût9{±9{u‹S +S‹F +F9Âwœ‰‰1eô[^_]ÃU‰åWVSƒì ‹]‹} …ÛuƒìjLh8#h•8#èÙ
-ƒÄ…ÿuƒìjMh8#hž8#è¾
-ƒÄƒÇƒçø‹3…ö„rvƒ~uƒ~t‹F;FsƒìjUh8#hà8#è€
-ƒÄƒ~t‹F;F rƒìjUh8#h@9#è[
-ƒÄ‹F +F9FvƒìjUh8#h€9#è9
-ƒÄ‹F÷ЅE…åF‰Eð‹^…Û„ԍv÷Ãtƒìj^h8#hÀ9#èø ƒÄöCtƒìj_h8#h:#èÛ ƒÄƒ;t9wƒìj`h8#h@:#è» ƒÄ;^ rƒìjah8#h¶8#èŸ ƒÄ9{rGv‹‰‹C)ø‰B‹Eð‰ë
-v‹‹Uð‰9~sƒìjwh8#hÍ8#è\ ƒÄ)~‰Øë‰ö‰]ð‹…Û…/ÿÿÿ‹6…ö…‘þÿÿ¸eô[^_]ÃU‰åƒì jÿjÿuÿuÿuÿu ÿuèƒÄ ÉÐU‰åWVSƒì‹]‹EE ‰Eð…ÛuƒìjThi:#h•8#èۃă} uƒìjUhi:#hž8#较ċ;…ÿ„lƒuƒt‹G;Gsƒìj[hi:#hà8#舃ăt‹G;G rƒìj[hi:#h@9#ècƒÄ‹G +G9Gvƒìj[hi:#h€9#èAƒÄ‹G÷ЅE…á‹Uð9WƒÕ‹M9O †ÉG‰Eì‹_…Û„¸v÷Ãtƒìjkhi:#hÀ9#èèƒÄöCtƒìjlhi:#h:#è˃ă;t9wƒìjmhi:#h@:#諃Ä;_ rƒìjnhi:#h¶8#菃ċU 9S‚$‰Þ;]s‹u¹;M}ºÓâ‹E1ð…ÂtÖA;M|è‰ð)ØE ;C‡è‹M 1;Eð‡æ‰ðƒàø‰Eè9Øsƒìh‘hi:#ht:#èƒÄ9]èvC‹Uè)ډUä÷Âtƒìh–hi:#h :#èãƒÄ‹‹M艋C+Eä‰A‹Eä‰C‰]ì‰ðƒà‹U Tƒâø‰U ‹Mè9Qv‰ÊU ‹‰‹A+E ‰B‹Eì‰ë
-‹Uè‹‹M쉋E 9Gsƒìh´hi:#hÍ8#èkƒÄ‹U )W‰ðë‰ö‰]ì‹…Û…Kþÿÿ‹?…ÿ…•ýÿÿ¸eô[^_]ÃU‰åƒì jÿjjj ÿu hÿuèýÿÿƒÄ ÉÐU‰åWVSƒì‹]ShÒ:#èeÌÿÿ‹3ƒÄ…ö„ƒìÿvÿvÿv‹F +FPÿv ÿvh`;#è5ÌÿÿƒÄ ƒ~uƒ~t‹F;Fsƒìjahä:#hà8#袃ă~t‹F;F rƒìjahä:#h@9#è}ƒÄ‹F +F9Fvƒìjahä:#h€9#è[ƒÄ¿‹^…Û„¾ƒì ÿ3ÿs‰ØCPSh ;#è—ËÿÿƒÄ ÷Ãtƒìjihä:#hÀ9#èƒÄöCtƒìjjhä:#hà;#èóƒÄƒ{wƒìjkhä:#hë:#èփă;t9wƒìjlhä:#h@:#趃Ä;^ rƒìjmhä:#h¶8#蚃Ä{‹…Û…BÿÿÿƒìWh;#èäÊÿÿƒÄ9~tƒìjshä:#h;#è`ƒÄ‹6…ö…cþÿÿƒì h2;#è®ÊÿÿƒÄeô[^_]ÍvU‰åWVSƒì ‹u‹] ‰ßƒçø…öuƒìjNh{7#h•8#è ƒÄ…ÛuƒìjOh{7#h<#èñƒÄƒ}uƒìjPh{7#hž8#èԃĉ؃à‹UTƒâø‰U‹ëv‹…ÛuƒìjXh{7#h<#螃ă{uƒ{t‹C;CsƒìjYh{7#hà8#èsƒÄƒ{t‹C;C rƒìjYh{7#h@9#èNƒÄ‹C +C9CvƒìjYh{7#h€9#è,ƒÄ;{‚hÿÿÿ;{ ƒ_ÿÿÿ‹EC‹C +C9Cvƒìjbh{7#h€9#èòƒÄÇEð‹sëv‰uð‹6…öt9þróƒ}ðtm‹Eð@9ørc9øtƒìjnh{7#h@<#諃ąöt8‹U:9ðr.9ðtƒìjuh{7#h€<#肃ċEF‹UðB‹‰ëE‹E‹UðBë9ƒ}ðt
-‹Eð‰8ëv‰{…öt‹U:9ðr‰ÐF‰G‹‰ë ‹E‰G‰7eô[^_]ÃU‰åƒì hÿu ÿuèÒýÿÿƒÄÉÐU‰å‹EÇ]ÉöU‰åWVSƒì ÇEèÇEìÇEð‹E‹0…ö„Zƒ~uƒ~t‹F;Fsƒìj]h¦<#hà8#蠃ă~t‹F;F rƒìj]h¦<#h@9#è{ƒÄ‹F +F9Fvƒìj]h¦<#h€9#èYƒÄÿEð¿‹^…Û„¨v÷Ãtƒìjdh¦<#hÀ9#è$ƒÄöCtƒìjeh¦<#hà;#èƒÄƒ{wƒìjfh¦<#hë:#èêƒÄƒ;t9wƒìjgh¦<#h@:#èʃÄ;^ rƒìjhh¦<#h¶8#讃ÄÿEì{‹…Û…[ÿÿÿ9~tƒìjnh¦<#h;#肃Ä‹FEè‹6…ö…§þÿÿƒì ÿuìÿuðÿuèÿuhÀ<#è¾ÆÿÿƒÄ eô[^_]ÍvU‰åVS‹u‹] EƒìPÿuhÀÓ#è…ÈÿÿƒÄhÀÓ#ÿ5Ü#jSVh@=#è5ƒÄ eø[^]ÍvU‰åƒìÿ5ìÛ#jÿuÿu ÿuh=#èƒÄ ÉÉöU‰åƒì E PÿuhÀ×#èÈÿÿƒÄ jjhx #èì%ÿÿƒÄhÀ×#h£=#èŠÅÿÿÇ$MèFÿÿƒÄÉÐU‰åƒìhÀ×#h€=#ècÅÿÿƒÄÉÉöU‰åWVSƒì¿ÿÿÿÿ‹E ‹‹E@‰ÐÁà)лÄÜ#‰]ð‹´ÃЃùÿtCI‰ÐÁà)Ð;´ÃÐr0»ÈÜ#‰Ï‰ÐÁà)ЋLÃPƒùÿtI‰ÐÁà)ЋUð;´ÂÐsՃÿÿt‰ÐÁà)ЋU‰ÅÝ#ë
-‰ö‹E‹U ‰ƒùÿtI‰ÐÁà)ЋU‰ÅÝ#ë
-‹E‹U ‰B‹E@‰ÐÁà)ЍÅP‰ˆÈÜ#‰¸ÌÜ#ƒÄ[^_]ÍvU‰åWVSƒì¿ÿÿÿÿ‹E ‹‹E@‰ÐÁà)ÐÁà‹˜ß#‰U苀œß#‰Eìƒùÿtw ‰ÆȉÂÁâ)‹Eè‰Ã;՘ß#|[‰Eäv1‰ÐÁà)ЍÅ;š˜ß#u ‹Eì;‚œß#|1‰Ï‰ÐÁà)Ћ ÅÝ#ƒùÿt4 1‰ÐÁà)Ћ]ä;Řß#}«ƒÿÿt‰ÐÁà)ЋU‰ÅÝ#ë‹E‹U ‰ƒùÿtI‰ÐÁà)ЋU‰ÅÝ#ë
-‹E‹U ‰B‹E@‰ÐÁà)ЍÅP‰ˆÈÜ#‰¸ÌÜ#ƒÄ[^_]ÍvU‰å‹EÇÿÿÿÿÇ@ÿÿÿÿ]ÍvU‰åWVS‹uv‰ÐÁà)ЍÅP‹˜ÌÜ#¿ÈÜ#‹ 8ƒûÿt[‰ÐÁà)ЉLÇPëv‹E ‰ƒùÿt&I‰ÁÁá)Á»ÌÜ#v‰ÐÁà)ЋDÃP‰DËPë v‹E ‰X[^_]ÐU‰åS‹M‹‰Øƒûÿt=‹@‰ÂÁâ)‹ÕÝ#‰ƒøÿt@‰ÐÁà)ÐÇÅÝ#ÿÿÿÿë
-vÇAÿÿÿÿ‰Ø‹$ÉÉöU‰åS‹M‹] ƒ;ÿt)I‰ÐÁà)Ћ‰ÅÝ#‹@‰ÂÁâ)‰ ÕÝ#됉KI‰ÐÁà)ÐÇÅÝ#ÿÿÿÿI‰ÐÁà)ÐÇÅÝ#ÿÿÿÿ‰ ‹$ÉÃU‰åS‹M‹] ƒ{ÿt,I‰ÐÁà)ЋS‰ÅÝ#‹C@‰ÂÁâ)‰ ÕÝ#ë‰ö‰ I‰ÐÁà)ÐÇÅÝ#ÿÿÿÿI‰ÐÁà)ÐÇÅÝ#ÿÿÿÿ‰K‹$ÉÃU‰å‹E‹]ÉöU‰å‹E‹@]ÐU‰å·Eƒøt ƒø…Àtë-ƒøtƒøtë ¸Á=#됸Æ=#됸Ê=#됸Ð=#됸‘.#]ÐU‰åWVSƒìœúX‰Â‰Uä÷Et$ƒìEèPjèL—ÿÿƒÄ ÿuìÿuèhà=#èeÁÿÿƒÄ÷EtN¾;5ðÛ#sA¿ Ü#vƒì µ‹;¶BP·BPRVh >#è!ÁÿÿƒÄ‹;VÿP ƒÄF;5ðÛ#rÇ÷Etƒì hû=#èõÀÿÿèX&ÿÿƒÄ‹Uä‰ÐPeô[^_]Éö(é"ðë"ðë"ðë"ðë"ðë"\ë"ðë"hë"të"ðë"€ë"€ë"€ë"€ë"€ë"€ë"€ë"€ë"€ë"€ë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"ðë"4é"Hé"´ê"tê"ôê"Pë"Hé"ðë"ðë"Dë"ðë"Pë"ðë",ê"ðë"ðë"Lê"ðë"”é"ðë"ðë"àé"Ôì"´î"´î"´î"´î"´î",î"´î"8î"@î"´î"Pî"Pî"Pî"Pî"Pî"Pî"Pî"Pî"Pî"Pî"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"´î"àì"ôì"´î"´î"´î" î"ôì"´î"´î"î"´î" î"´î"´î"´î"´î"ìí"´î"Dí"´î"´î"ˆí"Àñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"ï"ï"ï"ï"ï"ï"ï"ï"ï"ï"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Ìñ"Àï"Dð"@ñ"@ñ"@ñ"´ñ"Dð"Ìñ"Ìñ"¨ñ"Ìñ"´ñ"Ìñ"Ìñ"Ìñ"Ìñ"Øï"Ìñ"´ð"Ìñ"Ìñ"Ðð"$@$@$##ü#l#¼# #\#Œ##¤#0#¼#H#Ô#$#¬#8#Ä#P #Ü #P
-#l #œ #( #¬ #< -#À -#8#¤##|#à#,#p#”#°#Ì#è##„#ü#„#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#ä#$##ü#l#¼# #\#Œ##¤#0#¼#H#Ô#$#¬#8#Ä#P #Ü #P
-#l #œ #( #¬ #< -#À -#8#¤##|#à#,#p#”#°#Ì#è##„#ü#„#SIGNAL HANDLER: pid=%d
-main: ending...
-main: alarm(5), waiting t=2 sec
-main: alarm(3) return %d, waiting t=6 sec
-Error during Keyboard Initialization!!!Ctrl-C pressed!
-KeybPortKeyTasktask_create
-scheduletime %lus %luns * caplasttime %lus %luns * exec=%d TIME = %lu
-The system tick must be less than 55 mSec!Abort detected
-Code : %u
-Too many scheduling levels!!!
-Too many resource levels!!!
-debug info noticewarn err crit alert emerg <%i>[%s] %sPosix task
-Signal number %d...
-with value : %d
-POSIX_ReadyPOSIX_DelayPOSIX_UnknownSlice: %d
-MainPOSIX_register_level
- alloco descrittore %d %d
- lev=%d
-POSIX schedulerPid: %d Name: %20s Prio: %3ld Status: %s
-
-Panic!!! can't create main task...
-dummy PID: %d
-Dummy1Dummy2Dummy3Dummy4Dummy5Dummy6Dummy7Dummy8Dummy9Dummy0DummyaDummybDummycDummydDummyeDummyfDummygDummyhDummyDummy (RR) Posto dummy_create
-
-Panic!!! can't create dummy task...
-Entro in dummy_register_level
-Port des :
-Free port des : %d
-%d %s vt: %d pn: %d
-%d pd: %d vt: %d pn: %d Resources owned by the tasks:
-%-4dPI_register_module
-PI module
-PC priority of the tasks:
-%-4ldPC_register_module
-PC moduleTR %x
-SS:SP %x:%lx
-Stack0 : %x:%lx
-Stack1 : %x:%lx
-Stack2 : %x:%lx
-CS : %x DS : %x
-Descriptor [%x] InfoNo more Descriptors...
-%x (Hex)Base : %lx Lim : %lx Acc : %x Gran %x
-2Coprocessor error#Page fault*General protection fault*Stack exception*Segment not present*Unvalid TSS#INTEL reserved*Double defect1FPU context switch*Unvalid opcode#BOUND limit exceeded#Overflow detected on INTO#Breakpoint trap#NMI detected#Debug fault#Division by 0Exception %d occurred
-ABORT %d !!!LL Time Panic!!!
-time.cError! File:%s Line:%d %sOne-shot timer selected...
-Periodic timer selected...
-Unhandled Exc or Int occured!!!
-32/LINUX CrossCompiled/ELFHalt called1234567890-+12345678901234567890xabcdefABCDEF1234567890.e+-0123456789ABCDEF$@ -Æ@,ú1°<NaN+Inf-Infacosacosfacos: DOMAIN error
-asinasinfasin: DOMAIN error
-atan2atan2fatan2: DOMAIN error
-hypothypotfexpexpfy0fy0: DOMAIN error
-y1fy1: DOMAIN error
-ynynfyn: DOMAIN error
-lgammalgammaflgamma: SING error
-loglogflog: SING error
-log: DOMAIN error
-log10log10flog10: SING error
-log10: DOMAIN error
-powpowfpow(0,0): DOMAIN error
-pow(0,neg): DOMAIN error
-sinhsinhfsqrtsqrtfsqrt: DOMAIN error
-fmodfmodffmod: DOMAIN error
-remainderremainderfremainder: DOMAIN error
-acoshacoshfacosh: DOMAIN error
-atanhatanhfatanh: DOMAIN error
-atanh: SING error
-scalbscalbfj0j0f: TLOSS error
-j1j1fjnjnfneg**non-integral: DOMAIN error
-à?addfree.cmax >= minreg->min < reg->maxnew_max > new_min(reg->min & (sizeof(struct lmm_node) - 1)) == 0(reg->max & (sizeof(struct lmm_node) - 1)) == 0addregio.cr != reg(reg->max <= r->min) || (reg->min >= r->max)alloc.clmm != 0size > 0reg->free >= 0(DWORD)node < reg->maxreg->free >= size(reg->nodes == 0 && reg->free == 0) || (DWORD)reg->nodes >= reg->minreg->nodes == 0 || (DWORD)reg->nodes < reg->maxreg->free <= reg->max - reg->min((DWORD)node & (sizeof(struct lmm_node) - 1)) == 0((DWORD)node->size & (sizeof(struct lmm_node) - 1)) == 0(node->next == 0) || (node->next > node)alloc_ge.canode >= node(split_size & (sizeof(struct lmm_node) - 1)) == 0lmm_dump(lmm=%p)
-dump.cnode->size >= sizeof(*node) free_check=%08lx
-reg->free == free_checklmm_dump done
- region %08lx-%08lx size=%08lx flags=%08lx pri=%d free=%08lx
- node %p-%08lx size=%08lx next=%p
-(node->size & (sizeof(struct lmm_node) - 1)) == 0block != 0reg != 0(DWORD)prevnode + prevnode->size == (DWORD)node(DWORD)node + size == (DWORD)nextnodestats.cLMM=%p: %u bytes in %u regions, %d nodes
-assertion %s failed in %s at line %i (task:%i_%i)
-MAGIC assertion failed in %s at line %i (task:%i_%i): %s
-KERNEL PANIC (sys_panic_stub): %s
-KERNEL PANIC (sys_panic): %s
-FreeExeSleepWaiting on joinTime (EXACT) : %lus %luns
-< Memory Dump >
-< Level %d : %s Code: %d Version: %d >
-8Œÿÿ’ÏÿÿšÏÿHN#ÿ`Y#ÿÿÿÿÿÿÿÿÿÿÿÿ1234567890!@#$%^&*()-_=+[{]};:'"`~/?,<.>\|   - -1234567890.+*/-+*-aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ 1234567890!"œ$%&/()='?^Š‚+*•‡…ø\|<_,:.;—õ   - -1234567890.+*/-+*-aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ[]@#hV#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ-.#&.#.#.#.#
-.#.#ü-#hy"py"py"S3#F3#83#'3# 3#ö2#æ2#Ò2#Ã2#³2#¦2#‘2#€2#f2#Z2#³2#G2#þþAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAš‡4#ðÿÿÿÿGCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)01.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.01.symtab.strtab.shstrtab.text.rodata.data.sbss.bss.comment.note"€%! %# &¨ )HN#È> /LY#àI5`Y#àI8ã :àILC,[h”aI
\ No newline at end of file
/demos/branches/pj/pse51/ptest5
Property changes:
Deleted: svn:executable
## -1 +0,0 ##
-*
\ No newline at end of property
Index: demos/branches/pj/pse51/pinit.c
===================================================================
--- demos/branches/pj/pse51/pinit.c (revision 1085)
+++ demos/branches/pj/pse51/pinit.c (nonexistent)
@@ -1,126 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: pinit.c,v 1.1.1.1 2002-09-02 09:37:47 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:47 $
- ------------
-
- This is a minimal initialization file for the PSE51 profile.
-
- It initializes the POSIX scheduler, the Hartik Ports and the Keyboard driver.
-
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-
-#include "kernel/kern.h"
-#include "modules/posix.h"
-#include "modules/dummy.h"
-
-#include "modules/pi.h"
-#include "modules/pc.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-
-#include "drivers/keyb.h"
-
-#include "pthread.h"
-#include "time.h"
-
-
-/*+ sysyem tick in us +*/
-#define TICK 1000
-
-/*+ RR tick in us +*/
-#define RRTICK 10000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- POSIX_register_level(RRTICK, POSIX_MAIN_YES, mb, 32);
- dummy_register_level();
-
- PI_register_module();
- PC_register_module();
-
- SEM_register_module();
-
- /* for the Pthread library */
- PTHREAD_register_module(1, 0, 1);
-
- /* for the real time clock extensions */
- TIMER_register_module();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
- NRT_TASK_MODEL m; // the scheduling model for the Keyboard
-
- KEYB_PARMS k = BASE_KEYB;
- keyb_def_task(k, &m);
-
- nrt_task_default_model(m);
- nrt_task_def_arg(m,arg);
- nrt_task_def_usemath(m);
- nrt_task_def_ctrl_jet(m);
- nrt_task_def_save_arrivals(m);
- nrt_task_def_unjoinable(m);
- nrt_task_def_weight(m, sched_get_priority_max(SCHED_RR));
- nrt_task_def_policy(m,SCHED_RR);
- nrt_task_def_inherit(m,PTHREAD_EXPLICIT_SCHED);
- nrt_task_def_nokill(m);
- nrt_task_def_system(m);
-
- HARTPORT_init();
-
- if (KEYB_init(&k) < 0)
- kern_printf("Error during Keyboard Initialization!!!");
-
- __call_main__(mb);
-
- return (void *)0;
-}
Index: demos/branches/pj/pse51/ptest4.c
===================================================================
--- demos/branches/pj/pse51/ptest4.c (revision 1085)
+++ demos/branches/pj/pse51/ptest4.c (nonexistent)
@@ -1,151 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: ptest4.c,v 1.1.1.1 2002-09-02 09:37:47 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:47 $
- ------------
-
- Posix test 4:
-
- the main task create 3 tasks, J1, J2, J3
- at t = 1 sec. it raise a signal to J1
- at t = 2 sec. it kills J2
-
- J1,J2,J3: it simply calls nanosleep
-
- non standard function used:
- cprintf
- sys_gettime
- keyboard stuffs
- sys_end
-
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include <sys/types.h>
-#include <pthread.h>
-#include <signal.h>
-#include <time.h>
-
-#include <kernel/kern.h>
-#include <drivers/keyb.h>
-
-void uscitaJ(void *arg)
-{
- cprintf("J: (pid=%d) AAAARRRRGGGHHH!!! killed by someone...\n", exec_shadow);
-}
-
-void *J(void *arg)
-{
- struct timespec t1, t2;
- int err;
-
- cprintf("J (pid=%d) starts and call nanosleep\n",exec_shadow);
-
- t1.tv_sec = 3;
- t1.tv_nsec = 0;
- NULL_TIMESPEC(&t2);
- pthread_cleanup_push(uscitaJ,NULL);
- err = nanosleep(&t1, &t2);
- pthread_cleanup_pop(0);
-
- cprintf("J (pid=%d) ending, nanosleep returns errno=%d, t2=%ld.%ld\n",
- exec_shadow, err, t2.tv_sec, t2.tv_nsec/1000);
-
- return 0;
-}
-
-void signal_handler(int signo, siginfo_t *info, void *extra)
-{
- cprintf("SIGNAL HANDLER: pid=%d\n",exec_shadow);
-}
-
-void fine(KEY_EVT *e)
-{
- sys_end();
-}
-
-
-int main(int argc, char **argv)
-{
- int err;
- pthread_t j1, j2, j3;
- struct sigaction sig_act;
-
- KEY_EVT emerg;
- //keyb_set_map(itaMap);
- emerg.ascii = 'x';
- emerg.scan = KEY_X;
- emerg.flag = ALTL_BIT;
- keyb_hook(emerg,fine);
-
- sig_act.sa_sigaction = (void *) signal_handler;
- sig_act.sa_flags = SA_SIGINFO;
- sigemptyset(&sig_act.sa_mask);
-
- sigaction(31, &sig_act, NULL);
-
- cprintf("main: creating J1\n");
- err = pthread_create(&j1, NULL, J, NULL);
- if (err) cprintf("Error creating J1\n");
-
- cprintf("main: creating J2\n");
- err = pthread_create(&j2, NULL, J, NULL);
- if (err) cprintf("Error creating J2\n");
-
- cprintf("main: creating J3\n");
- err = pthread_create(&j3, NULL, J, NULL);
- if (err) cprintf("Error creating J3\n");
-
- cprintf("main: waiting 1 sec\n");
- while (sys_gettime(NULL) < 1000000);
-
- cprintf("main: pthread_kill on j1, then wait until t=2 sec \n");
- pthread_kill(j1, 31);
-
- while (sys_gettime(NULL) < 2000000);
- cprintf("main: pthread_cancel(J2)\n");
- pthread_cancel(j2);
-
- cprintf("main: ending...\n");
-
- return 0;
-}
Index: demos/branches/pj/pse51/ptest6
===================================================================
--- demos/branches/pj/pse51/ptest6 (revision 1085)
+++ demos/branches/pj/pse51/ptest6 (nonexistent)
@@ -1,527 +0,0 @@
-ELF"4(4 ( €""H[H[ È[Hk#Hk# ðõ 덶°­üORäe‹Ká€uU¿€ Ç–eÆG1GeÆGGeÆG2GeÆG¸”#fe£hk#Áèfe£nk#Hs#¿€ Ç’eÆG0GeÆGf¸0ŽØŽÀŽÐŽàŽè¼`ž#ÇÐÛ%`~#ÇÔÛ%`ž#£Ts#‰Xs#Hs#êµ"8Ns#üè¢íê U‰å‹Eê ‰öU‰åSìŒÿuh€D#èAE„Pjd]ˆSÿ5L$èœ]ƒÄ Sÿu„PhÀD#èƒÄh,$ÿ5L$è_aƒÄ…Àtƒì謃Äÿ0h E#èéèÀAƒÄƒì h…H#èԃĐƒì jèòAƒÄ=?Bvìƒì h@E#è¯jj -hH#ÿ5L$è;XƒÄ …Àtƒìè@ƒÄÿ0hªH#è}èTAƒÄjhø"jhH$èêcjhä"jh$$è×cƒÄhÈH#èBƒÄ‹]üÉÉöU‰åSìh×H#è$E„Pjd]ˆSÿ5L$è\ƒÄ Sÿu„Ph E#èýÿÇ$ñH#èñÿƒÄ‰öƒì jèAƒÄ=_ãvìƒì hàE#èËÿjjh I#ÿ5L$èWWƒÄ …Àtƒìè\ƒÄÿ0h F#è™ÿèp@ƒÄƒì hI#è„ÿjjhI#ÿ5L$èWƒÄ …ÀtƒìèƒÄÿ0h@F#èRÿè)@ƒÄƒì hI#è=ÿjjhI#ÿ5L$èÉVƒÄ …Àtƒìè΃Äÿ0h`F#è ÿèâ?ƒÄƒì hI#èöþjj h I#ÿ5L$è‚VƒÄ …Àtƒì臃Äÿ0h€F#èÄþè›?ƒÄƒì hI#è¯þjjh,I#ÿ5L$è;VƒÄ …Àtƒìè@ƒÄÿ0h F#è}þèT?ƒÄƒì hI#èhþÇ$;I#è\þ¸ƒÄ‹]üÉÍvU‰åVSìœhJI#è7þƒÄƒì jèV?ƒÄ=¿‘!v썅tÿÿÿPjd]ˆSÿ5L$èxZSÿµtÿÿÿPhG#èöýƒÄ vƒì jè?ƒÄ=ÿž$v썅tÿÿÿPjd]ˆSÿ5L$è4ZSÿµtÿÿÿPhG#è²ýƒÄ vƒì jèÎ>ƒÄ=?¬'v썅tÿÿÿPjd]ˆSÿ5L$èðYSÿµtÿÿÿPhG#ènýƒÄ vƒì jèŠ>ƒÄ=¹*v썅tÿÿÿPjd]ˆSÿ5L$è¬YSÿµtÿÿÿPhG#è*ýƒÄ vƒì jèF>ƒÄ=¿Æ-v썅tÿÿÿPjduˆVÿ5L$èhYVÿµtÿÿÿPhG#èæüDžxÿÿÿè"Dž|ÿÿÿƒÄjè8@‰Ã‹‰E€…xÿÿÿ‰…tÿÿÿPjdVÿ5L$èYƒÄ VÿµtÿÿÿPhG#èü‹E€‰ƒÄ¸eø[^]ÍvU‰åSƒì<ÆEÉxÆEÊ-ÆEÈh@"ƒì‹EÈf‰$ÆD$-è˜ÇEô"ÇEð]èEì‰$輁ƒÄ jSjè§lÇ,$Ç0$Ç4$+ÇT$Ç\$ Ç`$Ø"Çd$$ƒÄÇ$Ç $Ç$Ç$Ç $Ç$ÇD$
-Ç$
-ÇEØÇEÜÇEàdEØPjjBhpI#è»K£L$ƒÄƒøÿuƒìèƒÄÿ0h€G#錍vƒìhT$ÿ5L$è[ƒÄ…Àtƒìè΃Äÿ0h G#ë[‰öƒì hàG#èÿújh"jhP$èt^ƒÄh H#èßúƒÄƒì jèþ;ƒÄ=ßg5vìƒì ÿ5$$èö_Ç$sI#è®ú¸ƒÄ‹]üÉÐU‰åƒìh`D#èújj hLH#ÿ5L$èRƒÄ …Àtƒìè!ƒÄÿ0hXH#ë ƒì hvH#èSú¸ƒÄÉÐU‰åƒìhÀF#è8úƒÄÉÍvU‰åSƒì‹] jèK;ƒÄPÿs ÿs¸dI#ƒ{t¸jI#Pÿ3h@G#èøùƒÄ ‹]üÉÃU‰åƒìèÁ:ÉÍvU‰åƒìj ÿujh'èý”è°žè7ÂèfÈèá®ƒÄ jjjèÃ^螌¸èƒÄÉÃU‰åWVSƒìX‹]}¨¾\s#ü¹ó¥E¸‰E¨fÇE¸ÇE¼ÇEÀfÇEÄÇEÐÇEÔÇEÜÇEà‰]ÈÇEØÇEÌjèü]‰EÐÇEÜÇEàƒMÌ
-膲E¨‰$ècƒÄ…Àyƒì h I#èkùƒÄƒì SèoE¸ƒÄeô[^_]ÍvU‰åƒìŠU€=lt#„¶€ú*t€úªt
-€ú6t€ú¶uÆlt#¸é›„Òy,Ælt#€ú¸uÆxt#Ænt#ëՀúuÐÆxt#ëljöÆlt#€ú8u€ -xt#Ænt#멀úu € -xt#뛉ö€ú5uf¾Ÿ#·Àé)v€ú…•f¾üž#·Àé -v€úàuÆlt#éTÿÿÿv€ú*t€ú6u2Æmt#€ú*u€ -xt#é/ÿÿÿ‰ö€ú6…$ÿÿÿ€ -xt# éÿÿÿv€úªt€ú¶u"Æmt#€úªt €ú¶…öþÿÿÆxt#éêþÿÿ€úFu€=qt#•qt#ë.v€ú:u€=ot#•ot#ëv€úEu;€=pt#•pt#ƒì¶qt#P¶ot#P¶pt#Pèõ¸ƒÄé€úu€ -xt#éhþÿÿv€ú8u€ -xt#éTþÿÿv€út€ú¸uÆxt#é;þÿÿ‰ö¸„҈рúRt2€úOt-€úSt(€úPt#€úQt€úKt€úLt€úMt€úGt
-€úHt€úIu€=pt#uT€=mt#uK·Â -ÿë~€=ot#t/Bð< vBâ<vBÔ<w€=mt#t¶Âf¾€àž#·ÀëG€=mt#t¶Âf¾€€Ÿ#·Àë-v€=nt#t¶Âf¾€  #·Àëv¶Âf¾€àž#·ÀÉÃU‰åWVSƒì,}؃ìjE×PèòƒÄ…À„¡ƒì ¶E×Pèöüÿÿ‰ÂƒÄf…Ò„†÷Âÿt  xt#ƒÈ@ë‰ö xt#ˆE؈UيE׈EÚ±»;؞#}8¾`ž#v݊D2:EÚuŠ2:EØuƒì Wÿ’dž#±ƒÄC;؞#|ЄÉuƒìjW¿¢ #Pè­·ƒÄè-é<ÿÿÿU‰å‹E£ht#Šˆâž#ŠPˆãž#ŠPˆäž#ŠPˆåž#ŠPˆæž#ŠPˆçž#ŠPˆèž#ŠPˆéž#ŠPˆêž#ŠP ˆëž#ŠP
-ˆ‚Ÿ#ŠP ˆƒŸ#ŠP ˆ„Ÿ#ŠP -ˆ…Ÿ#ŠPˆ†Ÿ#ŠPˆ‡Ÿ#ŠPˆˆŸ#ŠPˆ‰Ÿ#ŠPˆŠŸ#ŠPˆ‹Ÿ#ŠPˆìž#ŠPˆŒŸ#ŠPˆíž#ŠPˆŸ#ŠPˆúž#ŠPˆšŸ#ŠPˆûž#ŠPˆ›Ÿ#ŠPˆŸ#ŠPˆ§Ÿ#ŠPˆŸ#ŠPˆ¨Ÿ#ŠP ˆ Ÿ#ŠP!ˆ©Ÿ#ŠP"ˆŸ#ŠP#ˆµŸ#ŠP$ˆŸ#ŠP%ˆ³Ÿ#ŠP&ˆŸ#ŠP'ˆ´Ÿ#ŠP(ˆ Ÿ#ŠP)ˆ«Ÿ#ŠP*ˆŸ#ŠP+ˆ¹Ÿ#ŠP,ˆîž#ŠP-ˆŽŸ#ŠP.ˆïž#ŠÖˆŸ#ŠP0ˆáž#ŠP1ˆŸ#ŠP2ˆüž#ŠP3ˆœŸ#ŠP4ˆäŸ#ŠP5ˆϟ#ŠP6ˆП#ŠP7ˆџ#ŠP8ˆ˟#ŠP9ˆ̟#ŠP:ˆ͟#ŠP;ˆǟ#ŠP<ˆȟ#ŠP=ˆɟ#ŠP>ˆҟ#ŠP?ˆӟ#ŠP@ˆ.Ÿ#ŠPAˆŸ#ŠPBˆŸ#ŠPCˆ*Ÿ#ŠPDˆΟ#ŠPEˆ·Ÿ#ŠPFˆʟ#ŠPGˆþž#ŠPHˆžŸ#ŠPIˆŸ#ŠPJˆ°Ÿ#ŠPKˆŸ#ŠPLˆ®Ÿ#ŠPMˆŸ#ŠPNˆ Ÿ#ŠPOˆòž#ŠPPˆ’Ÿ#ŠPQˆŸ#ŠPRˆ¡Ÿ#ŠPSˆŸ#ŠPTˆ¢Ÿ#ŠPUˆŸ#ŠPVˆ£Ÿ#ŠPWˆ÷ž#ŠPXˆ—Ÿ#ŠPYˆŸ#ŠPZˆ¤Ÿ#ŠP[ˆŸ#ŠPRˆ¥Ÿ#ŠP]ˆŸ#ŠP^ˆ¦Ÿ#ŠP_ˆŸ#ŠP`ˆ²Ÿ#ŠPaˆŸ#ŠPbˆ±Ÿ#ŠPcˆøž#ŠPdˆ˜Ÿ#ŠPeˆùž#ŠPfˆ™Ÿ#ŠPgˆðž#ŠPhˆŸ#ŠPiˆóž#ŠPjˆ“Ÿ#ŠPkˆÿž#ŠPlˆŸŸ#ŠPmˆôž#ŠPnˆ”Ÿ#ŠPoˆöž#ŠPpˆ–Ÿ#ŠPqˆŸ#ŠPrˆ¯Ÿ#ŠPsˆñž#ŠPtˆ‘Ÿ#ŠPuˆ -Ÿ#ŠPvˆ­Ÿ#ŠPwˆõž#ŠPxˆ•Ÿ#ŠPyˆ Ÿ#ŠPzˆ¬Ÿ#ŠP{ˆ: #ŠP|ˆ; #ŠP}ˆG #Š@~¢H #]ÍvU‰åWVSƒì\‹]}ؾ€t#ü¹󥿸ƒ=tt#…Qº¾àž#¹€Ÿ#‰ö·ÂÆ0ÆBfúví…Ûu]؃{ÿuÇChs#ƒì ÿsèûÿÿÇ$jjjhÙI#èªf£¢ #ƒÄ fƒøÿu ¸þÿÿÿéÞ‰öjjjhÙI#èà­f£¤ #ƒÄfƒøÿuƒì ¿¢ #PèE±¸ýÿÿÿ頍vÇ؞#ƒ{ÿuÇC0"ƒ{tIÆE™cÆEš.ÆE˜ƒìÿsƒì‹E˜f‰$ÆD$.èÅÆE˜ƒÄÿsƒì‹E˜f‰$ŠEšˆD$襃ă;ÿuQfÇE¨ÇE¬ÇE°fÇE´ÇE¸ÇEÐÇEÈÐÇEÄ ÇEÀ¨aÇE¼
-ÇE̍E¨ë‹ƒì jjPh8 "hâI#èÿ‰ÃƒÄ ‰¨ #ƒøÿu'ƒì ¿¢ #PèC°¿¤ #‰$è4°‰Ø钐ƒ=|t#uWƒì ÿ5¨ #艉ǃąÿt4ƒì ¿¢ #Pèü¯¿¤ #‰$èí¯ƒÄÿ5¨ #èg5¸üÿÿÿë=Ç|t#ëèƒì¶qt#P¶ot#P¶pt#PèûÇtt#‰øƒÄeô[^_]ÃU‰åƒì¶EPEèP¿¤ #PèృÄ„Àt÷Eè@u¶Eéë‰ö¸ÉÐU‰åƒì ¶E Pÿu¿¤ #P襱·ÀƒÄÉÐU‰åSƒ=؞#0‹ -؞#Í»`ž#‹Ef‰ŠE
-ˆD‹E ‰‚dž#A‰ -؞#‹$ÉÉöU‰åƒìèÉÍvU‰åƒìè±ÉÍvU‰åƒì¸ÿÿÿÿƒ=tt#t9蓃ì ÿ5¨ #è-4¿¢ #‰$薮¿¤ #‰$臮¸ƒÄÉÐU‰åƒìjèêÇ$èÛéÇ$ÈI#è£éè²-ƒÄÉÐU‰åWVSƒìŠEˆEó¿1¾d»`‰ö¹v‰òì©t"‰ÈA=þÿÿvì¸ÿÿÿÿ…Àu‰ÚŠEóî¸ë‰ö¸ë搸ÿÿÿÿÇEì¹d…Àt¸ÿÿÿÿët¸ë‰Êì©uî‹EìÿEì=þÿÿvé¸ÿÿÿÿ…Àu‰Úì¶Àë¸ÿÿÿÿƒøÿu
-¸þÿÿÿë3v=úu ¸ë"‰ö=þt ¸ýÿÿÿë‰ö‰øO…À9ÿÿÿ¸üÿÿÿƒÄ[^_]ÃU‰åVSƒìŠEˆE÷³Ô¾¹d‰ö‰Êì©t"‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë -¸ë搸ÿÿÿÿ…Àt¸ÿÿÿÿëL¸ë&»¹d‰ö‰Êì©tâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àuº`ŠE÷î¸ëv¸ÿÿÿÿ…Àt¸ÿÿÿÿëj¸ë&»¹d‰ö‰Êì©uâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àuºdì© tº`ì¶Ðëvºÿÿÿÿ‰Ð…Òx¸úú”ÀDþƒÄ[^]ÃU‰åWVSƒì »¾`‰ØK…À~^ƒì hÿè¼ýÿÿ‰ÂƒÄ…Òu{¿¹d‰Êì©u‰øG=þÿÿvì¸ÿÿÿÿ…Àu‰òì¶Ðëv¸ëꐺÿÿÿÿúªu›¸üÿÿÿúª…ƃì hõèMýÿÿ‰ÂƒÄ…Òt(¸ûÿÿÿ馉ö¸ýÿÿÿ隉ö¸ë.¸ëZ³`¾¹d‰Êì©tډðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî³e¾¹dv‰Êì©t®‰ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØîƒì hôèªüÿÿ‰ÂƒÄ¸…Ò•ÀHƒàƒèeô[^_]ÃU‰åWVSƒì ¾»d¹`‰Úì©t -‰Êì‰ðF=þÿvé³­¾¹d‰Êì©„‚‰ðF=þÿÿvè¸ÿÿÿÿ…ÀuºdˆØî¾»d¹`‰Úì©t -‰Êì‰ðF=þÿv鳪¾¹d‰Êì©t"‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ë搸놐¸ÿÿÿÿ…Àt¸÷ÿÿÿéݐ¸ë&»¹d‰ö‰Êì©uâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àu º`ì¶Àë¸ÿÿÿÿƒøUt¸ÿÿÿÿ錸ë&³«¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸öÿÿÿé9¸ë&»¹d‰ö‰Êì©uâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àu º`ì¶Àë¸ÿÿÿÿ…Àt¸þÿÿÿé鐸ë&³®¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…À…<èzüÿÿ…À…Žƒì hóèIúÿÿƒÄ…Àt
-¸ùÿÿÿépƒì jè.úÿÿƒÄ…Àt¸øÿÿÿéU¸ë.ÆŒt#³©¾¹d‰Êì©tډðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸ôÿÿÿéù¸ë&»¹d‰ö‰Êì©uâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àu º`ì¶Àë¸ÿÿÿÿ…Àt¸óÿÿÿ驐¸ë&³¨¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸õÿÿÿéU¸ë&³Ó¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸ðÿÿÿ鐸ë&³Z¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØî¸ë¸ÿÿÿÿ…Àt¸ïÿÿÿ魐ƌt#ëBv¸ë^¹þÿ¾d»`‰òì¶ø÷Çt‰Úì¶À÷Ç tƒøZt»IƒùÿuÙ³§¾¹d‰Êì©tª‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àté»þÿÿ‰ö¸ë:€=Œt#„þÆŒt#³¨¾¹d‰Êì©tΉðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸îÿÿÿ鱐¸ëvƒì hóèWøÿÿ‰ÃÇ$dèIøÿÿÃÇ$èè;øÿÿÃÇ$è-øÿÿÃÇ$çèøÿÿþ§ƒÄ¿¹dv‰Êì©t’‰øG=þÿÿvì¸ÿÿÿÿ…Àuºd‰ðî¸ë¸ÿÿÿÿ…Àt¸íÿÿÿë…ÛuÆŒt#¸eô[^_]ÃU‰åVS¡ t#…Àt¡ t#H£ t#¸é²¸ë6ƒ=˜t#uKŠœt#¾¹dv‰Êì©t҉ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØîÿ˜t#뤍v¸ë:ƒ=˜t#uGǘt#³ô¾¹d‰Êì©tΉðF=þÿÿvì¸ÿÿÿÿ…À…Xÿÿÿº`ˆØîéKÿÿÿ‰ö¸[^]ÍvU‰åWVSƒì ¡¤t#@£¤t#¾õ³Ô¿¹dv‰Êì©t"‰øG=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ë搸ë.¸ÿÿÿÿ…Àu0»¹d‰Êì©tډØC=þÿÿvì¸ÿÿÿÿ…Àuº`‰ðîœúX‰Çƒì hõè5õÿÿ‰ÃƒÄ…Ût¸ûÿÿÿéù‰ö¸ë1¾§ÇEð¹dv‰Êì©tڋEðÿEð=þÿÿvé¸ÿÿÿÿ…Àu ºd‰ðî¸ë¸ë=¸ëq¸ÿÿÿÿþ`ÇEð¹d‰Êì©t΋EðÿEð=þÿÿvé¸ÿÿÿÿ…Àuºd‰ðî¾eÇEð¹dv‰Êì©tš‹EðÿEð=þÿÿvé¸ÿÿÿÿ…Àuº`‰ðîƒì hôè;ôÿÿÃĉøPÆt#‰Øeô[^_]ÐU‰åWVSƒì ¸ÿÿÿÿ€=Œt#„ºœúX‰Æƒì hõèóóÿÿƒÄ…Àt(¸ûÿÿÿé—‰ö¸ë:¸ëf¸é“‰ö³`¿¹d‰Êì©tΉøG=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî³G¿¹dv‰Êì©t¢‰øG=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØ¿¹dv‰Êì©„rÿÿÿ‰øG=þÿÿvè¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt ¸îÿÿÿ鐃ì hôèÿòÿÿƒÄ…Àt¸Ûÿÿÿ飉ö¸ë:‰ðP¡¤t#@£¤t#¾ô³Ô¿¹d‰Êì©tΉøG=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë -¸ë.¸ÿÿÿÿ…Àu0»¹d‰Êì©tډØC=þÿÿvì¸ÿÿÿÿ…Àuº`‰ðîƍt#¸eô[^_]ÍvU‰åƒìÇÄ¡#ÇÀ¡#ƒ=”t#t!úè‹õÿÿ£t#Ç”t#û…Àtúèôÿÿû¡t#…Àuƒìÿuh'"jèÅf¸ƒÄÉÍvU‰åVS¡ t#@£ t#³õ¾¹d‰Êì©t"‰ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØî¸ë -¸ë搸ÿÿÿÿ[^]ÍvU‰åVS¡ t#@£ t#³ô¾¹d‰Êì©t"‰ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØî¸ë -¸ë搸ÿÿÿÿ[^]ÍvU‰åƒì‹MœúX‰Â¡À¡#@%ÿ£À¡#Š€À #ˆ‰ÐP€9úu è(úÿÿë‰ö¸ÉÐU‰åƒìƒ=¬t#t(Ç$¢#Ç ¢#Ç(¢#Ǭt#‹E£¨t#ƒ=”t#t!úèôÿÿ£t#Ç”t#û…Àtúèòÿÿû¡t#…Àu.¸ìÿÿÿ€=Œt#t ƒìjÿhX'"j è/eƍt#¸ƒÄÉÉöU‰åS‹MœúX‰Ã¡ ¢#@ƒà?£ ¢#ºà¡#ŠˆA¡ ¢#@ƒà?£ ¢#Šˆ¡ ¢#@ƒà?£ ¢#ŠˆA‰ØP¸‹$ÉÉöU‰åƒì€=t#tèäùÿÿƒì j è>eƍt#¸ƒÄÉÐU‰åƒìƒ=”t#t!úè óÿÿ£t#Ç”t#û…Àtúè™ñÿÿû¡t#…Àt¸ë¶Œt#ÉÍvU‰åVSŠEŠU€} t ƒ -œt#ë ‰öƒ%œt#„Àt ƒ -œt#ëƒ%œt#„Òtƒ -œt#ë¸ë6¸ëbƒ%œt#³õ¾¹d‰Êì©t҉ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØî³í¾¹dv‰Êì©t¦‰ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØîÿ˜t#[^]ÐU‰åSƒìœúX‰Ã€=t#tè–øÿÿè‘ðÿÿƒì hóèhîÿÿƒÄ…Àuƒì jèWîÿÿƒÄ…Àu‰ØP‹]üÉÍvU‰åº`ì¶ÈœúX‰Â¡À¡#;Ä¡#t¡Ä¡#ˆˆÀ #@%ÿ£Ä¡#‰ÐP]ÉöU‰åƒìº`ì¶Ðƒ=(¢#u €úúu¡¤t#H£¤t#郍v÷ÂÀuxÿ(¢#œúX‰Á¡ ¢#;$¢#t¡$¢#ˆà¡#@ƒà?£$¢#ë"‰ö¡$¢#+(¢#ƒÀAƒà?£$¢#Ç(¢#‰ÈPƒ=(¢#uÇ(¢#ƒì ÿ5¨t#èƒÄÉÉöU‰åSƒì}™w‹UÑâU‰ÐÁà)Ðfƒ<ň$uè©óNj¸ÿÿÿÿ鏐ƒ=$tcœúX‰Ã‹UÑâU‰ÐÁà)ЍÅ0ö€a$ t ÿ€d$ë-v‹EÑàE‰ÂÁâ)‹Õd$ƒì‹•À$ÿuRÿP@ƒÄ‰ØPéè3·…ÀtgœúX‰Ã‹UÑâU‰ÐÁà)ЍÅ0ö€a$ t ÿ€d$ë2v‹EÑàE‰ÂÁâ)‹Õd$ƒì‹•À$ÿuRÿP@蔃ĉØPé­úèúNjŒ$R‰ÑÁá)Ñ»`$f‰DË‹UÑâU‰ÐÁà)ЍÅ0öD t ÿ€d$ë?vƒìU‰ÐPjÿìt#‹MI‰ÐÁà)ЋÅd$ƒÄ‹•À$QRÿP@è/ƒÄ¡Œ$@‰ÂÁâ)ƒì ¿Õh$PèhÇèƒÄû¸‹]üÉÐU‰åWVSƒì ‹]f…Ûuèîñnj¸ÿÿÿÿé"‰öƒ=$„“œúX‰ÇÇEð}ð™s¾`$‹UðÑâUð‰ÐÁà)ÐÁàf9\,uHƒÀ0öD0 t ÿ€d$ë6ƒìEðPjÿìt#‹MðI‰ÐÁà)ЋÅd$ƒÄ‹•À$QRÿP@ƒÄÿEð}ð™~“‰øPé}‰öèCµ…À„›œúX‰ÇÇEð}ð™w¾`$‹Eð@‰ÂÁâ)Õf9\,uJƒÀ0öD0 t ÿ€d$ë8vƒìEðPjÿìt#‹MðI‰ÐÁà)ЋÅd$ƒÄ‹•À$QRÿP@ƒÄÿEð}ð™~èj‰øPéԐúèÒŋŒ$R‰ÑÁá)Ñf‰Íh$ÇEð}ð™w¾`$‹Eð@‰ÂÁâ)Õf9\,uJƒÀ0öD0 t ÿ€d$ë8v‹MðI‰ÐÁà)ЋÅd$ƒì‹•À$QRÿP@ƒÄEðPjÿìt#ƒÄÿEð}ð™~èÞ ¡Œ$@‰ÂÁâ)ƒì ¿Õh$PèÅèÁƒÄû¸eô[^_]ÃU‰åSƒìúèëċŒ$R‰ÑÁá)Ñf‰Íh$ƒìhD$j謃čUð¡H$;˜$|¡D$+”$‰Eð¡H$+˜$ë!‰ö¡D$+”$H‰Eð¡H$+˜$ʚ;‰B‹Mð ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ôºÓMb‰Ø÷êÁú‰ØÁø)ÂыŒ$R‰ÐÁà)Ð) Ŭ$ƒì Qè. ƒÄƒ=œ$ÿtƒì ÿ5œ$ÿh$Çœ$ÿÿÿÿƒÄ‹ -Œ$I‰ÐÁà)ЋÅd$ƒì‹…À$QPÿRLè{ ƒÄhŒ$jÿìt#ÇŒ$ÿÿÿÿÇ $ÿÿÿÿèV ¡Œ$@‰ÂÁâ)¿Õh$‰$è“Ãè:ƒÄû‹]üÉÐU‰åƒìhÜ-"èصƒÄÉÍvU‰åƒìjèõƒÄÉÉöU‰åƒìƒ=´t#u(èè
-ƒì ¡Œ$@‰ÂÁâ)¿Õh$Pè$ÃÄÉÍvU‰åWVSƒìhêI#è!6ƒÄ»`$ëv‹Eð@‰ÐÁà)ЁLÃ0€ƒì h$èzA‰EðƒÄƒøÿ„“@‰ÐÁà)ÐöDÃ1@u¾‹UðR‰ÃÁã)ÃÁã¾`$¡°t#‰3@£°t#‹E ‰Dƒìjÿuƒt$PèPÔÆD'ƒÃ fÇD3‹Mf‹%ÿf‰D3
-f‹A f‰D3 ƒÄ‰Ø‰ñº‹]ƒ{tf‹Sf‰T‹UðR‰ÁÁá)ÁÁáY0‹U‹B -‰ƒ`$¿d$Ç;¾h$¡Œ$@‰ÂÁâ)‹DÖ0‰3ºl$ǍAP‹]ð‰˜`$Ç8ÇÿÿÿÿÇ0ÿÿÿÿǁÀ$°Ç8Ç0ǁÁÀǁ`$Ç9ºۍƒ€ 
-Ç…Ä$Bƒúvì‹Eð@‰ÐÁà)ÐÁàÀǂh$ÿÿÿÿǂl$´$‰0$º‹Mðɍ€ ‰ö
-Ç…0$Bƒú~ì»ëC;$sƒì‹À$ÿuSÿPƒÄ…Àxß;$u7‹]ð[‰ÂÁâ)ÂfÇՈ$ƒìh$SèŠ?èQëDŽ鄉ö‹Eð@‰ÐÁà)Ѝ4ʼnžd$ƒì‹À$ÿuÿuðSÿP,ƒÄ…ÀyWfdžˆ$ƒìh$ÿuðè*?èñêDžë'èãêǃ釃ì ÿuðè9èÈêdž¸ÿÿÿÿƒÄëjƒE‹U‹zü…ÿtY‰ö¾ëF;5„$s0ƒìµ‹ƒ $WVÿP ƒÄ…Àxۃ싃 $WÿuðVÿP$ƒÄ;5„$t‡ƒE‹M‹yü…ÿu©‹Eðeô[^_]ÉöU‰åƒìEPÿuÿu ÿuè`üÿÿƒÄÉÍvU‰åWVSƒì ‹} ƒt6‹EÑàE‰ÂÁâ)‹G‰Õl$‰Æ‹UÑâU‰ÐÁà)Ѓ Ő$@ën‰öƒì ‹UÑâU‰ÐÁà)зŎ$Pè@‹UÑâU‰ÑÁá)Ñ»l$‰ˉƋEÑàE‰ÂÁâ)ƒÄƒ<Óuƒì ÿuèìè{éLjëtv‹EÑàE‰ÂÁâ)»`$·DÓ.ƃì ·GPjÿwVhÈ4"èÝ¢‰ÁƒÄ f…Éu?ƒì‹UÑâU‰ÐÁà)зDÃ.PVèƒÄÿuèvèélj¸ÿÿÿÿƒÄëN‹EÑàE‰ÂÁâ)Âf‰ Õh$ƒìU‰ÐPjÿìt#ƒÄöGu ÿ€$ëvöGuÿ@$¸eô[^_]ÍvU‰åWVSƒì ‹M‹U ‹]œúX‰ÇEPSRQè­úÿÿ‰ÆƒÄƒþÿ„ɍv‰ÐÁà)ЋÅd$‹…À$ƒx(„èà…À‰€»;„$svƒì‹ $VSÿP(ƒÄC;„$råv‰ÃÁã)ÃÁ㋃d$ƒì‹…À$VPÿR0fǃˆ$ƒÄh$Vè <ƒÄèÐçLJ‰øP¸ÿÿÿÿë#vƒìSVèŽýÿÿƒÄº…À”ÂJ ։øP‰ðeô[^_]ÃU‰åVS‹u»;„$svƒì‹ $VSÿP(ƒÄC;„$råv‰ÃÁã)ÃÁ㋃d$ƒì‹…À$VPÿR0fǃˆ$ƒÄh$Vè\;ƒÄeø[^]ÉöU‰åVS‹]è ƒì ¡Œ$@‰ÂÁâ)¾`$SÿTÖú‰$èn¡Œ$@‰ÂÁâ)¿DÖ‰$較čeø[^]ÃU‰åWVSƒì‹]‹}úû™w! [‰ÈÁà)ÈÁàº`$öD0tfƒ|(u û¸ÿÿÿÿéDžÿy$[‰ÁÁá)Á Í°¸d$‹<Çë ‰öƒÿv¿[‰ÁÁá)Á Í°‰Mä¹h$‰Mì‹Uä‹
-‰Â)úƒÂ‰Ð¾º÷ö‰Eð‹uä;tMۍƒ€4‹MðىÈÁà)ȍ Å°‰ö2‹…Ä$‹] ‰ƒÃ‰] B»‰Ðº÷ó‹]ì;uÔû‰øƒÄ[^_]ÐU‰åSƒì‹]‹ -Œ$I‰ÐÁà)ЍÅö‚$tɍ€È‚$…Ä$¡D$;”$|;”$uA¡H$;˜$}4ƒìSÿ5Œ$ÿ5˜$ÿ5”$ÿ5H$ÿ5D$hJ#èèËƒÄ è@ ‹]üÉÍvU‰åWVS‹ -Œ$I‰ÐÁà)ЍÅöƒ$„›ɍ€ȍ‹°h$ºd$‹t‚`‹”À¸l$94s‰4‹Œ$[‰ÁÁá)ÁÁፁÀ°`$¿d$B‰8±°‹†h$@º‰Ñº÷ñ‰–h$ۍƒ€ØÐÇD‡`ƒ<>wÿ>[^_]ÉöU‰åWVS‹M‹] ‹u‹}úù™w!I‰ÐÁà)ÐÁàº`$öD0tfƒ|(uû¸ÿÿÿÿëy…ÛtI‰ÂÁâ)‹Õ $‰…ötI‰ÂÁâ)‹Õ$‰…ÿtI‰ÂÁâ)‹Õ$$‰ƒ}t(ɍ€ȍ I‰ÊÁâ)ÊÕ$‹…Ä$‹U‰û¸[^_]ÉöU‰å‹Múù™w!I‰ÐÁà)ÐÁàº`$öD0tfƒ|(uû¸ÿÿÿÿë7I‰ÂÁâ)ÂÁ⍂Àǀ`$ǀd$ǂ$û¸]ÍvU‰åWVSƒì ƒ=Œ$ÿt¡Œ$@‰ÂÁâ)ÂöՐ$…3ƒ=Œ$ÿ„ƒìhD$jè]ŸƒÄUè¡H$;˜$|¡D$+”$‰Eè¡H$+˜$ë"v¡D$+”$H‰Eè¡H$+˜$ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ìºÓMb‰Ø÷êÁú‰ØÁø)ÂыŒ$R‰ÐÁà)Ð) Ŭ$ƒì QènüÿÿƒÄƒ=œ$ÿtƒì ÿ5œ$ÿh$Çœ$ÿÿÿÿƒÄ‹ -Œ$I‰ÐÁà)Ћ<Åd$ƒì‹½À$QWÿP<ƒÄ¿4½ƒì ‹†À$WÿP$‰ÃƒÄƒûÿt%ƒì[‰ÐÁà)ЋÅd$‹…À$SPÿR4ƒÄ븅Àx»ƒûÿuG뫍v‹5Œ$‰ $‰Œ$[‰ÐÁà)Ð;Å°$t0»`$‰ö¡Œ$@‰ÂÁâ)‹TÓP‰Œ$ R‰ÈÁà)È;TÃPu×;5Œ$tƒìhŒ$jÿìt#ƒÄ‹ -Œ$I‰ÐÁà)ÐÁà¾`$fÇD(‹¸d$ƒì‹½À$‹ $¸;Œ$•ÀPQWÿS8¡Œ$@‰ÂÁâ)ƒÄöDÖ1„Ü¡ $;Œ$…Ë¡D$‰EèM行$@‰ÂÁâ)»l$‹DÓ@º@B‰Ö™÷þ’’’Áâ‰Ö5H$‰q¿¡/¸D‰ø÷î‰×Áÿ‰ð™‰þ)Ö¡Œ$@‰ÂÁâ)‹\Ó@ºƒÞC‰Ø÷êÁú‰ØÁø)2Eè‹AºÊš;‰Ó™÷û‰QjhôB"ÿuìÿuèÿ($‰ÃƒÄƒûÿuƒìÿ5Œ$jè«MƒÄ‰œ$¡D$£”$¡H$£˜$eô[^_]ÉöU‰åWVSƒìÇðÀ%úÿuèD»ƒÄ¿d$¾`$‰ö[‰ÂÁâ)ÂÁâÇ:ÿÿÿÿǂl$ÆDB fÇD0fÇD0
-fÇD0 fÇD0B0Ç0Ç8ǀh$ǀl$‚¤$Ç@Çǂ¬$BP‰0Ç8ÇD`DŽÐ‚8$Ç@Ǎ‚àÇ0ÿÿÿÿÇ8ÿÿÿÿ‚°Ç8ǀh$ǀl$ÂÀÇ2Ç:ºۍƒ€ v
-ÇD‡`Bƒúvï[‰ÐÁà)ЍÅÀǀh$ÿÿÿÿǀl$ºۍƒ€ 
-DŽ†ÐBƒú~ìCû™Žƒþÿÿ»¹h$[‰ÂÁâ)C‰DÑP‰Ãû˜~åÇ`¾%ÿÿÿÿ»™¹l$[‰ÂÁâ)Cÿ‰DÑP‰Ã…ÛéǼ$ÿÿÿÿÇ$Lj$Ç€$Ç@$Ç $ÿÿÿÿÇŒ$ÿÿÿÿÇœ$ÿÿÿÿǘ$Ç”$ǐ$Ç„$Ç$èÚè}èäGƒì ÿuèqÉÿÿ£$ƒÄ=×Övƒì h`J#èQ%Ç$è¹ÐƒÄ¸ƒ=$”À‰Eè]è¡$‰CÇðÀ%èj˜ƒì Sèa¢Ç$ˆC"èµÜÇ$È-"è1¤Ç$àB"èE¤ƒÄjjèEÿôt#ƒÄhD$jèü˜èOùÿÿ蚱f£$¡Œ$@‰ÂÁâ)¾`$¿DÖ‰$è±Ç$èç£ÿðt#ÇðÀ%ƒÄ»ƒ=ˆ$ŸÃSjèɃă=@$teè„ Ç´t#ƒìhD$jèk˜è±f£$è³øÿÿÇ$àB"èw£¡Œ$@‰ÂÁâ)¿DÖ‰$èç°Ç$èO£ƒÄÇðÀ%ƒìSjèCèr—ÇðÀ%ƒÄjjè(ƒÄúƒ=ˆ$t"ƒìÿ5ˆ$h‹J#èÂÇ$ÿÿÿÿèσăì jèû΃čeô[^_]ÃU‰åSƒìƒ=´t#…•èŸ…Àuúè5°‹Œ$R‰ÑÁá)Ñf‰Íh$‹E£ˆ$Ç´t#ƒ=Œ$ÿ„ƒìhD$jèG—ƒÄUð¡H$;˜$|¡D$+”$‰Eð¡H$+˜$ë ¡D$+”$H‰Eð¡H$+˜$ʚ;‰B‹Mð ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ôºÓMb‰Ø÷êÁú‰ØÁø)ÂыŒ$R‰ÐÁà)Ð) Ŭ$ƒì QèZôÿÿƒÄƒ=œ$ÿtƒì ÿ5œ$ÿh$Çœ$ÿÿÿÿƒÄ‹ -Œ$I‰ÐÁà)ЋÅd$ƒì‹…À$QPÿR<Ç $ÿÿÿÿÇŒ$ÿÿÿÿƒÄ謝…Àtƒì ¿$PèÜ®ƒÄëvƒì ¿$PèÄ®èkƒÄû‹]üÉÉöU‰åSƒìÇEøÿÿÿÿ»ºÀ$¡À$ƒx(t1ƒì‹šUøRSÿP(ƒÄ…Àu¸ÿÿÿÿëCƒûwºÀ$‹šƒx(uи‹]üÉÉöU‰åƒìè èÈ@ÉÉöU‰åƒìÇœ$ÿÿÿÿè§êÿÿÉÐU‰åSƒìœúX‰Ãƒ=ðÀ%tƒ=@$t‰ØPëƒì jè–ýÿÿƒÄ‰ØP‹]üÉÉöU‰åƒìÿuèzýÿÿƒÄÉÐU‰åSƒì‹UœúX‰ÃƒìRjè
-•‰ÂƒÄ‰ØP‰Ð‹]üÉÉöU‰å¸ˆ$ƒ=Œ$ÿt‹Œ$R‰ÐÁà)ЍÅÀ$]ÉöU‰åSƒìœúX‰Ãƒ=ðÀ%tƒ=@$t‰ØPëƒì ÿuèíüÿÿƒÄ‰ØP‹]üÉÐU‰å]ÍvU‰åWVSƒì ÇEðÇE컍[ …ƒ¹H¢#t[¿@¢#ƒ<9tP‹Œ$ҍ‚€Ð؍…о`$ƒ<0t+ûƒì ÿ40ÿ9ƒÄú‹Œ$ҍ‚€Ð؋´†Ð uìCƒû~Œƒ}ìt -ÿEðƒ}ðŽmÿÿÿeô[^_]ÐU‰åVSº¾@¢#»D¢#¹H¢#vRÁàÇ0B‰Çƒú~ãÇ8¨#ÿÿÿÿÇ@¨#ÇH¢#Ç@¢#ÇD¢#ÿÿÿÿ[^]ÐU‰åS‹Múƒ=@¨#ÿu û¸ ënv¡@¨#@Ç•H¢#‰¡@¨#@‹…D¢#£@¨#‹@‹U ‰…@¢#º»`$‰öҍ‚€ÐDŽƒÐBú™~ßû¸‹$ÉÃU‰åú¡Œ$À’ÂU‹•0$û]ÍvU‰å‹Múƒùw -Iƒ<…H¢#u û¸ë%v¡Œ$À’ÂʋE ‰•0$û¸]ÃU‰åS‹]œúX‰Áƒûw -[ƒ<…H¢#u‰ÈP¸ë.v[Áà‹@¨#‰D¢#ǀH¢#‰@¨#‰ÈP¸‹$ÉÃU‰åWVSƒì ¡Œ$‰Eð‰ÂÑâ‰ÐÁà)ЍÅ¿`$öD0 tm‹E‰‚,$‹UðÑâUð‰ÐÁà)ЁLÇ0@‹UðÑâUð‰ÐÁà)ЍÅÀºh$ƒ<ÿt,‹4v‰ÃÁã)ÃÁ㋃d$ƒì‹…À$VPÿRD‰tPƒÄ¹»`$;MðtI‰ÐÁà)ЋUð9TÃP„ˆAù™~ۋUðÑâUð‰ÐÁà)Ѓ<Å´$t[»d$ûƒì ‹UðÑâUð‰ÐÁà)ЋDÃPÿpÿƒÄú‹EðÑàEð‰ÂÁâ)ÕP‹‹@‰‹UðÑâUð‰ÐÁà)Ѓ|ÃPu«èJüÿÿƒì ‹EðÑàEð‰ÂÁâ)»`$¿DÓP脏ƒÄEðPjÿìt#‹Eð@‰ÂÁâ)ՃÄöD0@u%ƒì·D.P‹Eð@‰ÂÁâ)Âÿ4Õl$èÁ ƒÄ»;„$sƒì‹ $ÿuðSÿP(ƒÄC;„$rã‹MðI‰ÐÁà)ЋÅd$ƒì‹…À$QPÿRPÇŒ$ÿÿÿÿÇ $ÿÿÿÿ‹Eð@‰ÂÁâ)ƒÄöՐ$u&ÿ -€$ƒ=€$uBèZúÿÿë;ƒìRjè AƒÄëg‹Eð@‰ÂÁâ)ÂöՐ$uÿ -@$ƒ=@$uèúÿÿƒìhD$j肏ƒÄƒ=œ$ÿtƒì ÿ5œ$ÿh$Çœ$ÿÿÿÿƒÄè­ïÿÿeô[^_]ÐU‰åVS‹uúv‰ÐÁà)ÐÁàº`$öD0ufƒ|(uèÒNJû¸ÿÿÿÿ麍v‰ÐÁà)Ðöő$tû雉ö;5Œ$uJv‰ÐÁà)л`$‹DÃ0©t0©u)ƒì jè¥üÿÿ¡Œ$@‰ÂÁâ)¿DÓ‰$èU§ƒÄ»ëvC;¸t#}ƒìÝÿ°d¨#Vÿ`¨#ƒÄ…Àtٍv‰ÐÁà)Ё Ő$û¸eø[^]ÍvU‰åWVSƒì ‹Ef‰Eòf…Àuè’Ñnj¸ÿÿÿÿé‰öú¡ $@‰ÂÁâ)Âf‹Mòf; Ռ$”Eñ¾¿`$‰öv‰ÐÁà)ÐÁà‹T0÷Â…ˆƒÀ fƒ|8t}÷Âuuf‹Mòf9L8 uj;5Œ$u!÷Ât÷Âuƒì jè{ûÿÿƒÄëC‰ö»ëC;¸t#}ƒìÝÿ°d¨#Vÿ`¨#ƒÄ…Àtٍv‰ÐÁà)ЁLÇ0Fþ™ŽNÿÿÿ€}ñt(ƒì ¡ $@‰ÂÁâ)¿Õh$PèÌ¥ƒÄëvû¸eô[^_]ÉöU‰åWVSƒì ¾¿`$v‰ÐÁà)ÐÁàfƒ|(tL÷D0
-uB»ë‰öC;¸t#}ƒìÝÿ°d¨#Vÿ`¨#ƒÄ…Àtٍv‰ÐÁà)ЁLÇ0Fþ™~–eô[^_]ÉöU‰åSƒì¡Œ$@‰ÂÁâ)»`$‹DÓ0©t7©u0©t)ƒì jè"úÿÿ¡Œ$@‰ÂÁâ)¿DÓ‰$èÒ¤ƒÄ‹]üÉÉöU‰åS‹M‹] ¡¸t#ʼnŠ`¨#‰šd¨#@£¸t#‹$ÉÍvU‰åƒìúÿuè½ùÿÿ¡Œ$@‰ÂÁâ)¿Õh$‰$èj¤ƒÄÉÐU‰åVS¶uœúX‰Ãƒ=”«#ÿuèøÎǂ‰ØP¸ÿÿÿÿéۋ -”«#‰ÊÁâ‹‚ ©#£”«#‹E‰‚©#‹E ‰‚©#‰ðƒà‰‚©#‰ðƒàƒøtOƒø
-ƒøt -ësvƒøtSëi‰ÈÁàǀ ©#ÿÿÿÿƒ=€«#ÿu‰ -€«#ë¡„«#Áà‰ˆ ©#‰ -„«#ëH‰ö‰ÊÁ⡈«#‰‚ ©#‰ -ˆ«#ë.‰ÊÁâ¡Œ«#‰‚ ©#‰ -Œ«#ë‰ÊÁ⡐«#‰‚ ©#‰ -«#‰ØP¸[^]ÐU‰åƒìƒ=$uƒì hÀJ#èPÇ$è¸ÁƒÄ¡$P‰$ÉÐU‰åƒìƒ=„$uƒì hßJ#èÇ$è|ÁƒÄ¡„$P‰„$ÉÐU‰åWVS‹E‹u ‹}»‹HÇöt<€9t5‹ ‰‡€: t€:t‰öC€< t€< uó€< uÆ Cÿ€< uÌÿ[^_]ÐU‰åWVSì¬‹EµTþÿÿ½Xþÿÿ»‹HDžTþÿÿöt<€9t5‹ ‰‡€: t€:t‰öC€< t€< uó€< uÆ Cÿ€< uÌÿƒì…XþÿÿPÿµTþÿÿèy¶ÿÿƒÄeô[^_]ÉöU‰å¸¹ ©#v‰ÂÁâ@‰
-ƒø&~òÇ|«#ÿÿÿÿÇ€«#ÿÿÿÿÇ„«#ÿÿÿÿLj«#ÿÿÿÿÇŒ«#ÿÿÿÿǐ«#ÿÿÿÿÇ”«#]ÉöU‰åWVSƒì ‹E‹} ƒøt4ƒø ƒøtéЃøt3ƒøtB鳐‹€«#Ç€«#ÿÿÿÿë:‰ö‹ˆ«#Lj«#ÿÿÿÿë&‰ö‹Œ«#ÇŒ«#ÿÿÿÿë‰ö‹«#ǐ«#ÿÿÿÿÇ$ƒûÿtM¾ ©#…ÿt‰ØÁàƒ¸©#uƒì ‰ØÁàÿ°©#ÿ©#ƒÄ‰Ù‰ØÁà‹0‰Â¡”«#‰2‰ -”«#ƒûÿu¸Ç$eô[^_]ÉöU‰åƒìEüPEøPEôPEðPèùœÇ$ «#èuéƒÄjjhÿÿjh¤«#h «#è ßƒÄjjhÿÿÿhhÀ«#h «#è€ßƒÄjjhÿÿÿþhhÜ«#h «#è`៎ ƒ}ütƒì‹EüHPÿuøh «#è*ރă}ôtƒìÿuôÿuðh «#èރÄÉÐU‰åƒì‹E…Àu¸ëƒìjPh «#è¸ßƒÄÉÍvU‰åƒìÿuÿuÿu ÿuh «#èháƒÄ ÉÍvU‰åƒì ÿuÿuÿuÿuÿu ÿuh «#èbáƒÄ ÉÐU‰åƒì ÿu ÿuh «#èæƒÄÉÐU‰åƒìÿuh «#èýãƒÄÉÃU‰åƒìÿuh «#èýçƒÄÉÃU‰åƒì jÿuh «#è߃ÄÉÉöU‰åƒì ÿu ÿuh «#è®åƒÄÉÐU‰åƒìh «#è¼ãÇ$ «#èÐçƒÄÉÍvU‰åWVSƒì ¾ú»ë‰öCƒû/ۍCÁàö€¬#tèƒìÿ°¬#ÿuèo°ƒÄ…Àuо…öt#} ÀuèýÈÇûéِû‰ØéÕ÷E @uèÚÈÇû鶉ö÷E uè¾ÈÇ -û隉ö‹u‹=0³#ƒÿÿ„zƒì ÿuèK°@‰$èþÿÿÿWÁ⹬#‰
-ƒÄ…ÀuèmÈÇûéIƒìÿuÿG…ÿ³¬#è:¯ƒÄ…öt‹F‰ƒ¬#‹F‰ƒ ¬#ë vÿGÁàǀ¬#
-ǀ ¬#€ƒì ÿG…ƒ8¬#P臍ƒ@¬#‰$èyCº¬#ǹ¬#ÇÿÿÿÿÇD ƒÄ÷E t
-Ç ëÿGÇ…¬#ƒì ÿG4…‹†¬#¯† ¬#PèôüÿÿV‰‚¬#ƒÄ…Àu0ƒì ÿuè -¯ƒÄ@Pÿ¶¬#èAýÿÿè@ÇǃÄûéƒì ÿG…‹ƒ¬#@ÁàPè’üÿÿs‰† ¬#ƒÄ…ÀuNƒì ÿuè«®ƒÄ@Pÿ³¬#èßüÿÿƒÄ‹ƒ¬#¯ƒ ¬#Pÿ¶¬#èÃüÿÿèÂÆǃÄû雍v»ý‰ÁøGº¬#‰Uð‹‚ë+‰Î7WÁâ‹‚¬#‰Eì [C‹]ì‰D‹‰Ã‰ñ‹uð‹2H9Ã|ЍÿWÁ⾬#‹2@‹Š¬#ÇDüÿÿÿÿǂ ¬#‹D@£0³#û‰øë‰öèÆÇû¸ÿÿÿÿeô[^_]ÍvU‰åWVSƒì úƒ}w‹UҍBö…¬#uèàÅÇ û¸ÿÿÿÿ重vƒì ‹EÀXÁ㾬#ÿ43èh­ƒÄ@Pÿ43èŸûÿÿƒÄ¾¬#‹3¯ƒ ¬#P{ÿ47èûÿÿƒÄ‹3@ÁàPÿ· ¬#èiûÿÿǃ¬#¡0³#‰D@‹U‰0³#ƒÄû¸eô[^_]ÃU‰åWVSƒì ‹}»ú¾öFÁàö€¬#tƒìÿ°¬#Wè[¬ƒÄ…Àu»Fƒþ~ͅÛ„…ƒì W蜬ƒÄ@Pö^Áãÿ³¬#èÇúÿÿƒÄ‹ƒ¬#¯ƒ ¬#P{ÿ·¬#è¨úÿÿƒÄ‹ƒ¬#@ÁàPÿ· ¬#èúÿÿǃ¬#¡0³#‰ƒH¬#‰50³#ƒÄû¸ëvècÄÇû¸ÿÿÿÿeô[^_]ÍvU‰åWVSƒì‹}ÇEìÿÿÿÿÿG…‹ˆ¬#‹€ ¬#‰Eä‹U R‹]䋃‰EðƒùÿtBý‰Eà ‰ÆÈë'‰ö‰Mì‹UàG‹…¬#1‹Lƒƒùÿt4 1‹Uð;ƒvӃ}ìÿtÿG‹…¬#‹]ì[‹] ‰\‚됍ÿG‹U ‰…¬#ÿG‹…¬#‹] [‰L‚ƒÄ[^_]ÐU‰åVS‹][‰ÐÁà)Ѝ4Åfƒ¾ˆ$ uƒì‹Ýd®#ÀP•8¬#ë2[‰ÐÁà)Ѝ4Åfƒ¾ˆ$
-u=ƒì‹Ýd®#ÀP•@¬#RS賋–d$ƒÄ‹•À$SRÿPD¸ƒÄ븍eø[^]ÃU‰åVS‹][‰ÐÁà)Ѝ4Åfƒ¾ˆ$ u)¡Œ$ÇÅ`®#ƒì‹Ýd®#ÀP•8¬#ëB[‰ÐÁà)Ѝ4Åfƒ¾ˆ$
-uM¡Œ$ÇÅ`®#ƒì‹Ýd®#ÀP•@¬#RSèó‹–d$ƒÄ‹•À$SRÿPD¸ƒÄ븍eø[^]ÃU‰åWVSƒìLèÞ;úƒ=¼t#t+Ǽt#ƒìjhpX"èkòÿÿƒÄjhY"è0ƒÄƒ}w‹UҍBö…¬#uè³ÁÇ û¸ÿÿÿÿéV‰ö‹MɍA‹U;… ¬#vè†ÁÇZû¸ÿÿÿÿé)ƒ} vèiÁÇû¸ÿÿÿÿé ‹MɍAÁàƒ¸ ¬#ÿ…Ïö€¬#tè1ÁÇ û¸ÿÿÿÿéÔ¡Œ$ÇÅ`®#ƒìhD$jè}ƒÄUÀ¡H$;˜$|¡D$+”$‰EÀ¡H$+˜$ë"v¡D$+”$H‰EÀ¡H$+˜$ʚ;‰B‹MÀ ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ĺÓMb‰Ø÷êÁú‰ØÁø)ÂыŒ$R‰ÐÁà)Ð) Ŭ$ƒì Qè®ÚÿÿƒÄƒ=œ$ÿtƒì ÿ5œ$ÿh$Çœ$ÿÿÿÿƒÄ‹ -Œ$I‰ÐÁà)ЋÅd$ƒì‹…À$QPÿRH‹ -Œ$I‰ÐÁà)л`$fÇDÃ( ƒÄ‹UҍB…8¬#PQèf -ÇŒ$ÿÿÿÿÇ $ÿÿÿÿèµÜÿÿ¡Œ$@‰ÂÁâ)¿DÓ‰$èõ”èt'ès9¡Œ$ƒÄƒ<Å`®#t脿Çû¸ÿÿÿÿé'v‹MɍA…z ¹¬#‹‰E´B‹˜ ¬#‹u´v‹T“‰ÿ‹UҍB‰÷¯<… ¬#<…¬#‹MÁé‹u ‹Eüó¥¨tf¥¨t¤ҍB<…_¹ ¬#‹ ‹u´vÁà‹u‰4‹ ‹M‰Lƒìÿu´ÿuèzúÿÿƒÄƒ»¬#…dƒì ‡@¬#Pè׉ƃăþÿtqèܓ‹Œ$R‰ÑÁá)Ñ»`$f‰Dˍv‰ÐÁà)ЋÅd$ƒì‹…À$VPÿRDèMÛÿÿ¡Œ$@‰ÂÁâ)¿DÓ‰$荓è4åÿÿƒÄûéލv‹uöF…¹¬#‹
-©„·ƒàû‰
-B ƒ<ujÿ° ¬#ÿ°¬#jè•鋋UҍBÁàP ¹¬#ƒ<
-utƒÀ0ƒ<tÿ² ¬#ÿ²¬#ÿ4ëNÇEÈÇEÌÇEÐÇEÔÇEØÇEÜÇEà‹MɍAÁà,¬#Rÿ°0¬#EÈPE¼Pè)ƒÄû¸eô[^_]ÃU‰åWVSƒì,‹} è 7úƒ=¼t#t+Ǽt#ƒìjhpX"è˜íÿÿƒÄjhY"è1+ƒÄƒ}w‹UҍBö…¬#uèà¼Ç û¸ÿÿÿÿékv‹UҍB‹U;… ¬#vè²¼ÇZû¸ÿÿÿÿé=‹UҍBÁຬ#ƒ|ÿ…ÐöDtèx¼Ç û¸ÿÿÿÿév¡Œ$ÇÅ`®#ƒìhD$jèáxƒÄUè¡H$;˜$|¡D$+”$‰Eè¡H$+˜$ë"v¡D$+”$H‰Eè¡H$+˜$ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ìºÓMb‰Ø÷êÁú‰ØÁø)ÂыŒ$R‰ÐÁà)Ð) Ŭ$ƒì QèòÕÿÿƒÄƒ=œ$ÿtƒì ÿ5œ$ÿh$Çœ$ÿÿÿÿƒÄ‹ -Œ$I‰ÐÁà)ЋÅd$ƒì‹…À$QPÿRH‹ -Œ$I‰ÐÁà)о`$fÇDÆ(
-ƒÄ‹UҍB…@¬#PQèªÇŒ$ÿÿÿÿÇ $ÿÿÿÿèù×ÿÿ¡Œ$@‰ÂÁâ)¿DÖ‰$è9è¸"è·4¡Œ$ƒÄƒ<Å`®#tèȺÇû¸ÿÿÿÿéSv‹UҍB‹…¬#ҍBÁຠ¬#‰Þ¯4°¬#‹‰ÁÁéüó¥¨tf¥¨t¤‹UҍBÁà‰E܉ƃƹ¬#ÿ‹† ¬#‰Eà[<•‹T8‰–¬#‹U܃ ‰U܋
-‹Uà‰D:‹E܉ƒ}t‹† ¬#‹8‹U‰‹UҍB<…‹¬#[‹D‘‰Eäƒì ‡8¬#Pè
-‰ÆƒÄƒþÿtm菋Œ$R‰ÑÁá)Ñ¿`$f‰Dύv‰ÐÁà)ЋÅd$ƒì‹…À$VPÿRDè…Öÿÿ¡Œ$@‰ÂÁâ)¿D׉$èŎèlàÿÿƒÄûë‰öû‹Eäeô[^_]ÃU‰åVS‹U‹] úƒúwҍBö…¬#uè6¹Ç û¸ÿÿÿÿëwҍB …¾¬#‹1©t$…Ûu ƒàû‰1ûëIvè÷¸Çû¸ÿÿÿÿë8ҍBÁàƒˆ¬#$¬#‹‰‹S‰P‹S‰P‹S ‰P ‹S‰Pû¸[^]ÐU‰åSƒì‹]‹MúƒûwۍCö…¬#uè„¸Ç û¸ÿÿÿÿëd‰ö…Ét2ۍCÁà‹¬#â‰‹¬#‰Q‹ ¬#‰Q‹€¬#‰A  ۍ KÁỬ#‹%ÿ÷ÿÿ‹U ‹â Љû¸‹]üÉÐU‰åƒì‹U‹M úƒúwҍBö…¬#uèå·Ç û¸ÿÿÿÿë;vҍBÁà‹¬#â‰‹¬#‰Q‹ ¬#‰Q‹€¬#‰A û¸ÉÉöU‰åWVSƒì} ‹uEðPh4K#V詉Ãăûuƒ}ðvÇEðƒÆë ‰öÇEð‹Eðº;Àt#~hƒìWVh@³#èòŸƒÄj
-Vè7ŸƒÄ»…À•ÃœúX‰Æƒìh@³#‹Eðÿ4…Ät#h9K#èIƒÄ…Ûuƒì hÜK#è5ƒÄ‰ðPº‰Ðeô[^_]ÍvU‰åVSƒìu ‹]EôPh4K#Sèû¨ƒÄƒøuƒ}ôvÇEôƒÃëÇEô‹Eôº;Àt#~JƒìVSh@³#è.ŸƒÄj
-SèsžƒÄœúX‰Ãƒìh@³#‹Eôÿ4…Ät#h9K#菜ƒÄ‰ØPº‰Ðeø[^]ÉöU‰åVSƒì@‹u‹] ‹EfÇEÈÇEÌÇEÐfÇEÔÇEàÇEäÇEìÇEð‰EØÇEÜÇEè…ÛtT‹C‰E̋C‰EЃ{u
-ÇEÜ1됃eÜߋC ‰EàÇEÀƒì ÿ5@·#è;ƒÄ+C ‰EċC‰Eì‹C‰EðëD‰öÇEÌÇEЃMÜ ÇEàÇEÀƒì ÿ5@·#èÎ:ƒÄ‰EÄÇEìÇEðè5µ‹ƒì jEÀPEÈPÿuhAK#è}Ìÿÿ‰ƒÄ ƒøÿt ƒì Pè.ÁÿÿƒÄèþ´‰¸ƒ>ÿ”ÀHƒàêƒÀeø[^]ÍvU‰åƒìÿ5@·#èO:ƒÄÉÉöU‰åƒìÿ5@·#èO:ƒÄÉÉöU‰åƒìÿ5@·#èg9ƒÄÉÉöU‰å‹E‹U ‹M£@·#‰D·#‰ -H·#]ÐU‰åVS‹]èk´‹0ƒì Sè°áÿÿ‰ÃèY´‰0ƒÄ¸…Û•À@eø[^]ÃU‰åƒìúÿuÿu ÿuÿ5@·#èÕ9ƒÄûÉÍvU‰åWVSƒì ‹}‹uúÿ6ÿu Wÿ5@·#èk7‰ÃƒÄ…Ûu#ƒìÿ5@·#èd9ƒÄ+PWÿ5H·#èRjƒÄû‰Øeô[^_]ÃU‰åSƒì ‹] SÿuèiƒÄÿ5@·#è#9ƒÄ+‰¸‹]üÉÉöU‰åVSƒì‹u‹] …Ûtƒ;uÇEôƒìEôPë7ƒ;uÇEðƒìEðPë!vÇEèƒì jè_þÿÿ+CUè‰BƒÄRVè@.ƒÄeø[^]ÉöU‰åWVSƒì‹u ‹}ÇEðÿ5@·#è8‰ÃƒÄ9Þƒþ} ¸ëG‰öƒì ÿuè¡.ƒÄ W‰Ø)ðPÿuèøhƒÄ…ÀtÇEð…ÿt‰Ø+‰ƒì ÿuèÅ.‹EðƒÄeô[^_]ÍvU‰åƒì‹Eúƒ8u -ÇûÿU ëû¸ÉÃU‰åWVSƒì¿ÿÿÿÿ‹E ‹‹E@‰ÐÁà)лd$‰]ð‹´ÃЃùÿtCI‰ÐÁà)Ð;´ÃÐr0»h$‰Ï‰ÐÁà)ЋLÃPƒùÿtI‰ÐÁà)ЋUð;´ÂÐsՃÿÿt‰ÐÁà)ЋU‰Ÿ$ë
-‰ö‹E‹U ‰ƒùÿtI‰ÐÁà)ЋU‰ż$ë
-‹E‹U ‰B‹E@‰ÐÁà)ЍÅP‰ˆh$‰¸l$ƒÄ[^_]ÍvU‰åWVSƒì¿ÿÿÿÿ‹E ‹‹E@‰ÐÁà)ÐÁà‹8$‰U苀<$‰Eìƒùÿtw ‰ÆȉÂÁâ)‹Eè‰Ã;Õ8$|[‰Eäv1‰ÐÁà)ЍÅ;š8$u ‹Eì;‚<$|1‰Ï‰ÐÁà)Ћ Ÿ$ƒùÿt4 1‰ÐÁà)Ћ]ä;Å8$}«ƒÿÿt‰ÐÁà)ЋU‰Ÿ$ë‹E‹U ‰ƒùÿtI‰ÐÁà)ЋU‰ż$ë
-‹E‹U ‰B‹E@‰ÐÁà)ЍÅP‰ˆh$‰¸l$ƒÄ[^_]ÍvU‰å‹EÇÿÿÿÿÇ@ÿÿÿÿ]ÍvU‰åWVS‹uv‰ÐÁà)ЍÅP‹˜l$¿h$‹ 8ƒûÿt[‰ÐÁà)ЉLÇPëv‹E ‰ƒùÿt&I‰ÁÁá)Á»l$v‰ÐÁà)ЋDÃP‰DËPë v‹E ‰X[^_]ÐU‰åS‹M‹‰Øƒûÿt=‹@‰ÂÁâ)‹Õ¸$‰ƒøÿt@‰ÐÁà)ÐÇż$ÿÿÿÿë
-vÇAÿÿÿÿ‰Ø‹$ÉÉöU‰åS‹M‹] ƒ;ÿt)I‰ÐÁà)Ћ‰Ÿ$‹@‰ÂÁâ)‰ Õ¼$됉KI‰ÐÁà)ÐÇŸ$ÿÿÿÿI‰ÐÁà)ÐÇż$ÿÿÿÿ‰ ‹$ÉÃU‰åS‹M‹] ƒ{ÿt,I‰ÐÁà)ЋS‰ż$‹C@‰ÂÁâ)‰ Õ¸$ë‰ö‰ I‰ÐÁà)ÐÇż$ÿÿÿÿI‰ÐÁà)ÐÇŸ$ÿÿÿÿ‰K‹$ÉÃU‰å‹E‹]ÉöU‰å‹E‹@]ÐU‰åWVSƒì¿ÿÿÿÿ‹E ‹‹E@‰ÐÁà)ÐÁà‹8$‰U苀<$‰Eìƒùÿtw ‰ÆȉÂÁâ)‹Eè‰Ã;Õ8$|[‰Eäv1‰ÐÁà)ЍÅ;š8$u ‹Eì;‚<$|1‰Ï‰ÐÁà)Ћ Ÿ$ƒùÿt4 1‰ÐÁà)Ћ]ä;Å8$}«ƒÿÿt‰ÐÁà)ЋU‰Ÿ$ë‹E‹U ‰ƒùÿtI‰ÐÁà)ЋU‰ż$‹E@‰ÐÁà)ЍÅP‰ˆh$‰¸l$ƒÄ[^_]ÍvU‰åWVSƒì¿ÿÿÿÿ‹E ‹‹E@‰ÐÁà)лd$‰]ð‹´ÃЃùÿtCI‰ÐÁà)Ð;´ÃÐr0»h$‰Ï‰ÐÁà)ЋLÃPƒùÿtI‰ÐÁà)ЋUð;´ÂÐsՃÿÿt‰ÐÁà)ЋU‰Ÿ$ë
-‰ö‹E‹U ‰ƒùÿtI‰ÐÁà)ЋU‰ż$‹E@‰ÐÁà)ЍÅP‰ˆh$‰¸l$ƒÄ[^_]ÍvU‰åWVS‹}‰ÐÁà)ЍÅP‹l$‹°h$ƒúÿu ‹E ‰0ë#‰öR‰ÁÁá)Á»h$‰ÐÁà)ЋDÃP‰DËPƒþÿt!v‰ÁÁá)Á»l$‰ÐÁà)ЋDÃP‰DËP[^_]ÃU‰åS‹]‹ ‰Èƒùÿt/I‰ÐÁà)ЋŸ$‰ƒøÿt@‰ÐÁà)ÐÇż$ÿÿÿÿ‰È‹$ÉÃU‰åS‹]‹M ƒ9ÿt‹@‰ÂÁâ)‰Õ¼$[‰ÂÁâ)ÕP‹‰‚h$ǂl$ÿÿÿÿ‰‹$ÉÃU‰åWVSƒì ‹M‹] ‹}ÇEðú¡Œ$@‰ÂÁâ)4Õ`$…ÿt‹F8‰…ÛtBƒùt"ƒù ƒùt ë*‰öƒùtë!‹F8 ‰F8ë‰ö‹÷Ð!F8ëv‹‰F8ëÇEð‹F8‰Ã÷Ћ`¹#‰Ñ…ÂtB‰ö‰Ø÷л!Ètv‰Ú©u
-CÑøuòºƒì R范ċ^8‰Ø÷Ћ -`¹#…ÁuÀ‹F8‰Ã÷ЋV<‰Ñ…Ât=‰Ø÷л!Ètv‰Ú©u
-CÑøuòºƒì Rè|ƒÄ‹^8‰Ø÷ЋN<…ÁuÃû‹Eðeô[^_]ÍvU‰åVS‹u‹M ¸…É„¸ƒù‡òv‰ÐÁà)Ðfƒ<ň$u -¸éӍvú‰ÈÁàö€h·#uƒ¸`·#uû魉öv‰ÐÁà)ЍŜ$ƒùvèÍ©Çë
-¸Óà »ëC;èt#}ƒìÝÿ°$º#Vÿ º#ƒÄ…Àtٍv‰ÐÁà)ЍÅfƒ»ˆ$u&ƒìhd¹#VèÔüÿÿ‹ƒd$ƒÄ‹…À$VPÿRDƒÄèSm…Àuèû¸eø[^]ÐU‰åWVSƒì‹]‹U ƒûvè©Ç¸ÿÿÿÿévœúX‰Á‰Mðƒ}t‰ÞÁæÆ`·#ü¹‹}ó¥…Òt‰ßÁçÇ`·#ü¹‰Öó¥…Ò„ºöB…°ƒ:‡§ƒ<€¹#ÿtq4‰u캀¹#‹@Áà‰Eè‰ÇƒÇ‹ -Ç%¸Á%‹U苉E䋇Á%©t -ƒàý‰‡Á%ë‰ö¾€¹#‹Uì‹2@‰ ÕÁ%‰Áƒ}äÿu»‰ -Ç%ǝ€¹#ÿÿÿÿƒûv -è¨Çë¸þÿÿÿˆÙÓÀ!`¹#‹uð‰ðP¸ƒÄ[^_]ÐU‰åWVSƒì,‹] ¸…Û„~¸ƒû‡pœúX‰Â‰UԉÞÁæ}؁Æ`·#ü¹ó¥÷Eàuƒ}Øu ‰ÐPé5vƒûv膧Ǹÿÿÿÿ됸ˆÙÓà#`¹#…Àt -‹UԉÐPéûƒûvèN§Çë‰ö¸ˆÙÓà `¹#‹5d¹#ƒþÿ„ô¸‰ÇˆÙÓçvv‰ÐÁà)ЍÅ $ƒûvèý¦Ç¸ÿÿÿÿë‰ú#‰Ð…À„–v‰ÐÁà)ÐÁàfƒ¸ˆ$uœ$ƒûv -輦Çë 8ƒìhd¹#Vèúÿÿv‰ÃÁã)ÃÁ㋃d$ƒÄ‹…À$VPÿRDÃà¾`$ƒÄƒ<3ÿtƒì ÿ43ÿh$Ç3ÿÿÿÿƒÄ‹MԉÈPéîv‰ÐÁà)Ћ4Ÿ$ƒþÿ…ÿÿÿ¾¸‰ÇˆÙÓç‰öv‰ÐÁà)ÐÁàfƒ¸ˆ$„…˜$ƒûvèö¥Ç¸ÿÿÿÿ됉ú#‰Ð…Àu^v‰ÐÁà)ЍŜ$ƒûvèÃ¥Çëv 8»ëvC;èt#}0ƒìÝÿ°$º#Vÿ º#ƒÄ…ÀtÙëvFþ™ŽSÿÿÿèzi…Àuè9 -‹MԉÈP¸eô[^_]ÐU‰åWVSƒì,¸ƒ} „T¸ƒ} ‡EœúX‰Â‰Uԋu Áæ}؁Æ`·#ü¹ó¥÷Eàuƒ}Øu ‰ÐPé ‰ö÷Eàu;ƒ} vèܤǸÿÿÿÿëv¸ŠM Óà#`¹#…Àt ‹UԉÐPéÃ=Ç%ÿu‹MԉÈP¸ 鮉ö‹5Ç%vÁà¹Á%‹‰Ç%‹U ‰Á%‹U‰Á%‹U‰ Á%‹Œ$‰Á%Çÿÿÿÿ‹E Á຀¹#ƒ<ÿu‰4ë>‰ö‹M ‹€¹#‰ÁЃ<ÅÁ%ÿt»Á%
-‹Í 
-ƒ<ÃÿuîR‰4ÅÁ%ƒ} vèé£Ç됸ŠM Óà `¹#‹5d¹#ƒþÿ„û¸‰ÃŠM Ó㐍v‰ÐÁà)ЍÅ $ƒ} v蘣Ǹÿÿÿÿë v‰Ú#‰Ð…À„šv‰ÐÁà)ÐÁàfƒ¸ˆ$uœ$ƒ} vèS£Çëv ƒìhd¹#Vè¨öÿÿv‰ÃÁã)ÃÁ㋃d$ƒÄ‹…À$VPÿRDÃà¾`$ƒÄƒ<3ÿtƒì ÿ43ÿh$Ç3ÿÿÿÿƒÄ‹MԉÈPé÷v‰ÐÁà)Ћ4Ÿ$ƒþÿ…ÿÿÿ¾¸‰ÃŠM Ó㐍v‰ÐÁà)ÐÁàfƒ¸ˆ$„…˜$ƒ} v艢Ǹÿÿÿÿë‰Ú#‰Ð…Àu^v‰ÐÁà)ЍŜ$ƒ} vèV¢Çë‰ö »ëvC;èt#}0ƒìÝÿ°$º#Vÿ º#ƒÄ…ÀtÙëvFþ™ŽSÿÿÿèf…Àuƒ=ät#uèÄ ‹MԉÈP¸eô[^_]ÃU‰åWVSƒì‹u‹]¡Œ$@‰ÂÁâ)<Õ`$èŠú¡`¹##„Hºv©u=BÑøuô¾ƒ<µ€¹#ÿue‹E ‰0Ç@Ç@W<ƒþvèa¡Ç됉Öëɸþÿÿÿ‰ñÓÀ!ƒþvè?¡Çëv¸þÿÿÿ‰ñÓÀ!`¹#ûév µº€¹#‹[‹ÅÁ%‰ƒøÿu"ƒþvèñ Ç됸þÿÿÿ‰ñÓÀ!`¹#W<ƒþv -èÌ Çë ¸þÿÿÿ‰ñÓÀ![Áâ¹Á%‹
-‹u ‰‹‚Á%‰F‹‚ Á%‰FƒÂ‹
-©t ƒàý‰
-ëv[¡Ç%‰ÕÁ%‰Ç%ûéI‰Öë‹G<#tUº©uéBÑøuô¾‹E ‰0Ç@Ç@W<ƒþvè Çëv¸þÿÿÿ‰ñÓÀ!ûéëv…Ûtƒ;uƒ{u -û¸ éÓ‰ö‹‰G@úèu‹Œ$R‰ÑÁá)Ñf‰Íh$ƒìhD$jèN\ƒÄUè¡H$;˜$|¡D$+”$‰Eè¡H$+˜$ë¡D$+”$H‰Eè¡H$+˜$ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰ÁáºÓMb‹Eì÷êÁú‹EìÁø)ÂыŒ$R‰ÐÁà)Ð) Ŭ$ƒì Qèc¹ÿÿƒÄƒ=œ$ÿtƒì ÿ5œ$ÿh$Çœ$ÿÿÿÿƒÄ‹ -Œ$I‰ÐÁà)ЋÅd$ƒì‹…À$QPÿRHƒÄhd¹#ÿ5Œ$èæòÿÿ¡Œ$@‰ÂÁâ)ÂfÇՈ$ƒÄ…Û„’ƒìEàPjè[U؃Ä‹Eà‰E؋EäC‰B…Ày -ÿM؁Bʚ;됁zÿɚ;~ ÿjʚ;ÿ5Œ$h$‹"ÿuÜÿuØÿ($‰ÃƒÄƒûÿuƒìÿ5Œ$jèù ƒÄ¡Œ$@‰ÂÁâ)‰Õ@$ÇŒ$ÿÿÿÿÇ $ÿÿÿÿè׺ÿÿƒì ¡Œ$@‰ÂÁâ)»`$¿DÓPèsè”ÇG@¡Œ$@‰ÂÁâ)ƒÄöDÓ2tû¸ é~‰Öë%¡`¹##„ûº‰ö©uáBÑøuô¾ƒ<µ€¹#ÿu=‹M ‰1ÇAÇAƒþv -è@Çë¸þÿÿÿ‰ñÓÀ!`¹#ûé vƒì µƒ€¹#Pèúðÿÿ‰ÇƒÄƒ»€¹#ÿu#ƒþvèòœÇë‰ö¸þÿÿÿ‰ñÓÀ!`¹#Áâ¹Á%‹
-‹] ‰‹‚Á%‰C‹‚ Á%‰CƒÂ‹
-©t ƒàý‰
-ëv¡Ç%‰ÕÁ%‰=Ç%ûël‹G<#…Àuû¸ë`v‰Öë‹G<º#t ©uéBÑøuô¾‹E ‰0Ç@Ç@W<ƒþvè/œÇëv¸þÿÿÿ‰ñÓÀ!û¸eô[^_]ÍvU‰åWVSƒì ‹}¡Œ$@‰ÂÁâ)4Õ`$è¹ú‹F<#…Àt è¦û颋‰F@úèq‹Œ$R‰ÑÁá)Ñf‰Íh$ƒìhD$jè6XƒÄUè¡H$;˜$|¡D$+”$‰Eè¡H$+˜$ë¡D$+”$H‰Eè¡H$+˜$ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ìºÓMb‰Ø÷êÁú‰ØÁø)ÂыŒ$R‰ÐÁà)Ð) Ŭ$ƒì QèJµÿÿƒÄƒ=œ$ÿtƒì ÿ5œ$ÿh$Çœ$ÿÿÿÿƒÄ‹ -Œ$I‰ÐÁà)ЋÅd$ƒì‹…À$QPÿRHƒÄhd¹#ÿ5Œ$èÍîÿÿ¡Œ$@‰ÂÁâ)»`$fÇDÓ(ÇŒ$ÿÿÿÿÇ $ÿÿÿÿèY·ÿÿ¡Œ$@‰ÂÁâ)¿DÓ‰$è™oè‹F<#ƒÄ…Àuû¸ë èÿû¸eô[^_]ÐU‰åSƒì‹]úEðPjè¢VƒÄƒ=º#ÿu
-ÇEèëWMèUð¡º#;B|¡º#+Eð‰E衺#+Bëv¡º#+EðH‰E衺#+Eôʚ;‰Aƒì ÿ5º#ÿh$ƒÄ…ÛtN]ð‹Eð£º#‹Eô£º#jh„‹"ÿuôÿuðÿ($‰ÃƒÄƒûÿuƒìÿ5Œ$jè:ƒÄ‰º#ë -vǺ#ÿÿÿÿû‹Eè‹]üÉÐU‰åVSƒì‹uƒ<µ€¹#ÿuC‰uèÇEìÇEð¡Œ$‰Eôƒþvèü˜Ç鮐¸þÿÿÿ‰ñÓÀ!`¹#降 µº€¹#‹[‹ÅÁ%‰ƒøÿu"ƒþv豘Ç됸þÿÿÿ‰ñÓÀ!`¹#[Áà¹Á%‹‰U苐Á%‰U싐 Á%‰Uð‹Á%‰UôP‹
-©tƒàý‰
-ë[¡Ç%‰ÕÁ%‰Ç%ƒìEèPVè
-ƒÄeø[^]ÃU‰åVSƒì¡Œ$@‰ÂÁâ)4Õ`$‹F0©…Í -‰F0‹F8‰Ã÷Ћ`¹#‰Ñ…ÂtA‰Ø÷л!Ètv‰Ú©u
-CÑøuòºƒì Rè„þÿÿƒÄ‹^8‰Ø÷Ћ -`¹#…ÁuÀ‹F8‰Ã÷ЋV<‰Ñ…ÂtZ‰Ø÷л!Ètv‰Ú©u
-CÑøuòº‰UèÇEìÇEð¡Œ$‰EôƒìEèPRèƒÄ‹^8‰Ø÷ЋN<…Áu¦f0ÿïÿÿeø[^]ÃU‰åWVSƒì,‹]œúX‰Â‰UÌ¡Œ$@‰ÂÁâ)Õ`$‰UЉÞÁæ}؁Æ`·#ü¹ó¥÷Eàuƒ}Ø„îƒ}Øÿ„ä÷EàuCƒ}Øu=ƒìShLK#èw}ƒÄ÷Eàtƒì‹M ÿqhbK#èX}ƒÄƒì jèç½ÿÿƒÄ‹UЋB8‰EԉƍUԃûv -èh–Çë ¸ˆÙÓà ‹EÔ E܉EԋUЃÂ<ƒûv -è<–Çë ¸þÿÿÿˆÙÓÀ!‹EԋUЉB8û÷Eàtƒìjÿu SÿUäëƒìj‹M ÿqSÿU؃Äú‹EЉp8‹ỦÐPeô[^_]ÃU‰åWVSƒì ‹}‰ÐÁà)ÐÁà¾`$fƒ|(uF˜àƒ<3ÿtƒì ÿ43ÿh$Ç3ÿÿÿÿƒÄƒìhd¹#Wèúèÿÿ‰ÂÁâ)‹Õd$ƒÄë ‰ÐÁà)ÐÁàfƒ¸ˆ$u!‹d$ƒì‹•À$WRÿPD¸ƒÄë‰ö¸eô[^_]ÍvU‰åWVSƒì º¿h·#¾d·#»l·#¹€¹#‰ö‰ÐÁàǀ`·#Ç8Ç0ÇÇ‘ÿÿÿÿBƒúvϺ»Á%¹Á%RÁàB‰ÇDƒú>~éÇèÆ%ÿÿÿÿÇüÆ%ÇÇ%Ç`¹#Çd¹#ÿÿÿÿǺ#ÿÿÿÿº¹Àº#»Äº#‰öRÁàÇÇÿÿÿÿÆDBƒú~áƒìjh†"è¾ÄÿÿƒÄeô[^_]ÍvU‰å‹EǸ]ÐU‰å‹EÇÿÿÿÿ¸]ÐU‰åƒì‹U‹M ƒùvèê“Ǹÿÿÿÿ됸Óà ¸ÉÃU‰åƒì‹U‹M ƒùv趓Ǹÿÿÿÿ됸þÿÿÿÓÀ!¸ÉÃU‰åƒì‹M ƒùv腓Ǹÿÿÿÿë ¸Óà‹U#ÉÉöU‰åƒì ÿuÿu ÿuèÔçÿÿƒÄÉÍvU‰åWƒì$‹UEè‰E丹‹}äüó«ƒìjÿuäRèBñÿÿƒÄ…Àu -‹Uè‹E ‰¸‹}üÉÐU‰åƒì jÿu ÿuèñÿÿƒÄÉÃU‰åƒì‹E…Àu¸ëƒìPÿu ÿuèíðÿÿƒÄÉÃU‰åƒìÿuÿ5Œ$è`èÿÿƒÄÉÍvU‰åVSƒì ‹]‹E ‰EèÇEìÇEð脒‹0ƒìEØPEèPSèAéÿÿƒÄ»ÿÿÿÿ…Àu ÷Eàu‹]ØèT’‰0‰Øeø[^]ÐU‰å‹M¡Œ$@‰ÂÁâ)¡`¹# ՜$‰¸]ÉöU‰åSƒì‹E‹U ú‹Œ$‰Œ$Çät#jPj jèœìÿÿƒÄÇät#‰Œ$û‹]üÉÍvU‰åS‹M‹] ¡èt#ʼnŠ º#‰š$º#@£èt#‹$ÉÍvU‰åVS‹]Cÿƒøv苑Ç~¸ÿÿÿÿëp‰öœúX‰Æ[€<…Ⱥ#u‰ðPèa‘ǸÿÿÿÿëF[Áâ¹Àº#‹E ‰
-‹E‰‚ĺ#ÆD
-ƒìjhċ"Sè¹T·Ã‰$èÒeƒÄ‰ðP¸eø[^]ÍvU‰åƒì¸ÉÍvU‰åƒì ‹E‰EèÇEìÇEð‹Œ$‰UôUèRPè›ùÿÿƒÄÉÉöU‰åVS‹uv‰ÃÁã)ÃÁã¸`$DŽàÿÿÿÿL0ƒìhd¹#Vèõãÿÿ‹ƒd$ƒÄ‹…À$VPÿRDè7¢ÿÿƒÄeø[^]ÐU‰åƒìǺ#ÿÿÿÿjjèWèÿÿè¢ÿÿƒÄÉÐU‰åƒìEüÇEüÿÿÿÿPèôÿÿƒÄÉÐU‰åƒì‹E‹‰EüEüPjÿìt#‹UüRÁà¹Àº#ƒÄƒ<t ûƒì RÿƒÄú‹Eü@ƒì ÿ4…ĺ#èö›ÿÿƒÄÉÐU‰åWVSƒì ‹u ‹]ƒ}t讏Ǹÿÿÿÿén‰öúƒ=€Â#ÿt ƒ=Ç%ÿuûèƒÇ ¸ÿÿÿÿéCv¡€Â#‰‹€Â#Õ)п„»#‹DÇ0£€Â#‹Õ)й€»#ÇDÁ0…öu8‹Õ)ÐÇÁ‹Õ)ÐÇÇ‹Õ)Љň»#닍<Å)Ǎ<ý€»#ü¹ó¥‹Õ)ЍŃº€»#u#¡Ç%‰‚¨»#@ÁàƒˆÁ%‹€Á%£Ç%‹Õ)ÐÇŔ»#ÿÿÿÿ‹Õ)ЍŘ»#Ç@NjÕ)ЍÅ »#Ç@NjÕ)ÐÇŬ»#û¸ƒÄ [^_]ÃU‰åSƒì‹]ƒûwúÝ)؃<Å°»#uûèÿÇ¸ÿÿÿÿ閍vÝ)ØÁàǀ°»#ƒÀº„»#ƒ<ÿtƒì ÿ4ÿh$ƒÄÝ)ØÁàƒ¸€»#uE‹¨»#R ÅöÁ%u¡Ç%‰Á%‰Ç%Ý)؋Ũ»#@ƒ$ÅÁ%üû¸‹]üÉÃU‰åWVSƒìL‹E‰E´Áà+E´Áàƒ¸€»#…‹P ‹‚ˆ»#@öÅÁ%t¸Œ»#ƒ< „ôÿéì‰ö‹M´Áá+M´Ááy LJŒ»#¾ˆ»#‹7@‹Ç%‰ÝÁ%£Ç%jÿ41ÿ±„»#jèhçÿÿ‹7@ƒ ÅÁ%錐‹E´Áà+E´Áเ»#ƒ<uwPƒ<
-tÿ°ˆ»#ÿ°Œ»#ÿ4
-ëQvÇEÈÇEÌÇEÐÇEÔÇEØÇEÜÇEà‹E´Áà+E´Áàˆ»#Rÿ°Œ»#EÈPEÄPèíÕÿÿƒÄ‹E´Áà+E´Åƒ¸ˆ»#u -ƒ¸Œ»#„Àº »#‹E´Áà+E´ŋ‰E¸M¸‹D‰A‹E¸ƒ˜»#‰ƒ »#‹Aƒœ»#‰B…Àyÿ‹ »#Bʚ;ë‰özÿɚ;~ ÿjʚ;‹E´Áà+E´ÿu´hŽ"ÿ4Ť»#ÿ4Å »#ÿ($‰ÃƒÄƒûÿuƒìÿ5Œ$jè+ùÿÿƒÄ‹E´Áà+E´‰Ŕ»#ë‰ö‹E´Áà+E´ÇŔ»#ÿÿÿÿeô[^_]ÃU‰åWVSƒì‹u‹}ÇEäƒþw3ƒ}t-‹Exÿɚ;w!‹]{ ÿɚ;wúõ)ðƒ<Å°»#uûèÁŠÇ¸ÿÿÿÿ鐅ÿ„·õ)ðƒ<Ŕ»#ÿuÇG ÇGëwƒìEèPjèGÇEäƒÄ¹ »#õ)ðō]è‹D;C|‹+Eè‰G‹D+Cë(¹ »#õ)òÁâ‹+EèH‰G‹D+Eìʚ;‰G ¹˜»#õ)ðÁà‹‰‹D‰Gõ)ðÅº„»#ƒ<ÿtƒì ÿ4ÿh$ƒÄ‹Eƒxu
-ƒx „þº˜»#õ)ð ŋ]‹‰
-‹C‰D
-÷E t¸ »#‹S‰‹S ‰Tëmvƒ}äuƒìEèPjèøEƒÄõ)ð ō‘ »#‹Eè‹]C‰ »#‹EìC ‰B…Àyÿ‰ »#Bʚ;ëzÿɚ;~ ÿjʚ;õ)ðVhŽ"ÿ4Ť»#ÿ4Å »#ÿ($‰ÃƒÄƒûÿuƒìÿ5Œ$jè­öÿÿƒÄõ)ð‰Ŕ»#û¸eô[^_]ÃU‰åWVSƒì ‹]‹} ƒûwúÝ)؃<Å°»#uûèzˆÇ¸ÿÿÿÿ鷉öÝ)؃<Ŕ»#ÿuÇG ÇGëoƒìEèPjèÒDƒÄ¹ »#Ý)؍ōuè‹D;F|‹+Eè‰G‹D+Fë'¹ »#Ý)ÚÁâ‹+EèH‰G‹D+Eìʚ;‰G ¹˜»#Ý)ØÁà‹‰‹D‰Gû¸eô[^_]ÍvU‰åƒìƒ}t藇Çëv臇ǸÿÿÿÿÉÉöU‰åƒìƒ}tèg‡Ç¸ÿÿÿÿë‰öƒì ÿu èÅ®ÿÿ¸ƒÄÉÍvU‰åƒì‹E ƒ}tè,‡Ç¸ÿÿÿÿëv…Àt -ÇÇ@è¸ÉÃU‰åƒì‹UƒúwúÕ)Ѓ<Å°»#uûè܆ǸÿÿÿÿëvÕ)ЋŬ»#ûÉÐU‰åWVS¹»„»#¿€»#¾Œ»#‰öÍ)ÈÁàÇDÿÿÿÿ˜»#ÇBǍP0Ç:ÇD A‰‰Áƒù~ºÇ|Â#ÿÿÿÿÇ€Â#[^_]ÐU‰å]ÍvU‰å¸]ÉöU‰åVSœúX‰Ã¡Œ$@‰ÂÁâ)¾`$‹DÖ0©t0©t)ƒì jèr°ÿÿ¡Œ$@‰ÂÁâ)¿DÖ‰$è"[ƒÄ‰ØPeø[^]ÃU‰åS‹]úût ¸ÿÿÿÿ…ÛuL¡Œ$@‰ÂÁâ)¹`$‹DÑ0Áèƒà‹U ‰¡Œ$@‰ÂÁâ)Õ0‹
-%ÿþÿÿ ؉
-û¸‹$ÉÉöU‰åS‹]úût ¸ÿÿÿÿ…ÛuL¡Œ$@‰ÂÁâ)¹`$‹DÑ0Áè ƒà‹U ‰¡Œ$@‰ÂÁâ)Õ0‹
-%ÿýÿÿ ؉
-û¸‹$ÉÉöU‰åWVSƒì ‹} ÇEðú‹EÇÿÿÿÿÇ@¾;5„$s9v‹µ $ƒ{u ƒìWVÿS,ƒÄ…ÀxƒìWÿuVÿS0‰EðƒÄF;5„$rÊû‹Eðeô[^_]ÉöU‰åƒì‹U¸ƒ:ÿt ¸ƒzu‹‹… $ƒìRÿ2ÿP4ƒÄÉÍvU‰åƒì‹U¸ƒ:ÿt‹‹… $ƒìRÿ2ÿP8ƒÄÉÉöU‰åƒì‹U¸ƒ:ÿt‹‹… $ƒìRÿ2ÿP<ƒÄÉÉöU‰åƒì‹U¸ƒ:ÿt‹‹… $ƒìRÿ2ÿP@ƒÄÉÉöU‰åVS‹u‹µÀ$ƒìÿ°ôh™K#è^j»ƒÄ‰ö[‰ÐÁà)ÐÁà9°d$……ƒÀ º`$f|€ttfƒ|tlƒì f‹Dfƒøwƒì ·ÀPè0¤ƒÄë%v·Ð¸sK#ú€t¸K#út¸‹K#P[‰ÐÁà)ÐÁàÿ°4$t$PShL#è¹iƒÄ Cû™ŽUÿÿÿeø[^]ÉöU‰åWVSƒì ‹E‹…À$‰Eð‹¸üƒì ‹Uð‹‚ðøPèÔÿÿ‰ÆƒÄƒþÿu -¸ÿÿÿÿ…ÿtrOëՐv‰ÐÁà)Ѝ Åö‘$tRQ@»l$ƒ<D‹D$‰ƒìý‰Ø‹Uð‚ðPVèôÑÿÿƒÄ‹Eð˜ðSVèÓÿÿƒÄéiÿÿÿ‰ðeô[^_]ÉöU‰åWVSƒì‹E‹…À$‰Eð‹Mƒy(…©‹=Œ$‰ÐÁà)Ѝžd$‹U93…‹M I‰ÂÁâ)ÂÁ⋄Љ„йl$‹D@‰D@‹„à‰„àƒÂ0¹`$‹
-%ÿ÷ÿÿ‹\0ã ؉
-‹UðƒÂ¸ƒ¼º€ÿ•ÀH‹] ‰„š€é¢v‹U R‰ÂÁâ)ÂÁâ»d$‹A‰„Ѓyt‹A‰‚¬$‹A‰„àë-‰ö‹] [‰ÐÁà)ÐÁà‹]ð‹“ô‰¬$‹“ô‰D$ƒy$u‹E @‰ÐÁà)Ё Ő$¸ƒy ”ÀH‹U ‹Mð‰„‘ˆ¸ƒÄ[^_]ÃU‰åWVSƒì ‹U‹<•À$ƒ¿t8LJƒì‹E @‰ÐÁà)ЋÅ4$‹—ðÂPÿu èAÑÿÿ酋E @‰ÐÁà)ЍÅöƒ‘$t?K@¾l$ƒ<11ºd$‹1„à‰1ƒì‹„Ћ—ðÂPÿu èãÐÿÿë*ƒì‹E @‰ÐÁà)ЋÅ4$‹—ðÂPÿu èKÐÿÿƒÄ‹E @‰ÐÁà)ÐfÇň$€eô[^_]ÐU‰åWVSƒìH‹]ÇE¼ÇEÀfÇEÄÇEÈÇEÌÇEÐÇEÔÇEØÇEÜÇEà¶Ã -f‰E¸‹À$‹€ø‰EÈÇE̍E¸jjPh˜"h¥K#è}–ÿÿ‰ÆƒÄ ƒþÿuƒì h@L#èjÇÿÿƒÄ‹<À$v‰ÐÁà)Ðfƒ<ň$tµ€Gƒ<ÿtJÿëE‰öƒìv‰ÃÁã)ÃÁ㍃¤$PjèJ;fǃˆ$€ƒÄ‹ƒ4$‹—ðÂPVè|ÏÿÿƒÄeô[^_]ÐU‰åWVSƒì‹}hªK#èÒÆÿÿèa°ÿÿ‰EðƒÄ hPhÀK#è·ÆÿÿÇ$èdzÿÿ‰ÃƒÄShÞK#è›Æÿÿ‹Eð‰…À$ƒÄ jhêK#Sè=efÇCÆCÇC8¢"ÇCd¢"ÇC ,˜"ÇC$ ™"ÇC(p¢"ÇC,̙"ÇC0|¢"ÇC4„¢"ÇC8¢"ÇC<D›"ÇC@Т"ÇCD\£"ÇCH¤£"ÇCL¬£"ÇCPD¤"ÇCTŒ¤"ÇCXÀ¤"ÇC\¤¥"ÇC`Ä¥"ÇCdÜ¥"ÇChô¥"ÇCl ¦"ÇCp$¦"ÇCt<¦"ÇCxT¦"ÇC|l¦"ǃ€„¦"ǃ„œ¦"¸ƒÄS‰öDŽ‚€ÿÿÿÿ@=™~í‹EH‰ƒüƒì ‹EÁàP萲ÿÿ‰ƒð¾ƒÄ;u}ƒì ‹ƒððPè‚ÌÿÿƒÄF;u|åÿçw¿èÿ ¡v¿ ¡‰»ô‹E‰ƒøƒ} tƒìjÿuðh@œ"舭ÿÿƒÄeô[^_]ÐU‰åWVSƒì ‹M‹u ‹]‹À$‰Eð…Éx[; -$sS‹À$‹@%ÿÿÿ=u=þ™wv‰ÐÁà)Ðfƒ<ň$u -¸éèvv‰ÐÁà)Ð9 Åd$t -¸&éȍv…Ûuv‰ÐÁà)Ё Ő$ë)ƒûuv‰ÐÁà)Ё$Ő$ÿ÷ÿÿë ¸郉öv‰ÐÁà)ÐÁà˜Ð¿d$‹U9;t\f¸ˆ$€u=ƒì‹;‹Mð‹‘ðÂPVè4Ëÿÿ‹E‰;ƒÄ‹Uð‹‚ð‹MÈPVèQÌÿÿƒÄëv‰ÐÁà)ЋU‰Å4$¸eô[^_]ÍvU‰åVS‹M‹4À$…Éx; -$s‹À$‹@%ÿÿÿ=t¸ÿÿÿÿëw¡Œ$@‰ÂÁâ)¸ÿÿÿÿ9 Õd$uZúè!P‹Œ$R‰ÑÁá)Ñ»`$f‰DËdž託ÿÿ¡Œ$@‰ÂÁâ)ƒì ¿DÓPèçO莡ÿÿƒÄû¸eø[^]ÉöU‰å‹E‹…À$‹€ü]ÍvU‰å‹E‹…À$‹€ô]ÍvU‰åS‹]‹M …ÛxU;$sM‹À$‹@%ÿÿÿ=u7ù™wI‰ÐÁà)Ðfƒ<ň$u¸ëMI‰ÐÁà)Ð9Åd$t ¸&ë3‰öI‰ÁÁá)ÁÁá¸ö‘$”À‹U‰‹‘4$‹E‰¸‹$ÉÉöU‰å‹E f8t·‹E -9Âu¸ë¸ÿÿÿÿ]ÐU‰å¸ÿÿÿÿ]ÉöU‰å¸]ÉöU‰å]ÍvU‰å¸]ÉöU‰åSƒì ‹E‹M ‹…À$I‰ÐÁà)ЋÅ4$‹“ðÂPQèÓÈÿÿƒÄ‹]üÉÍvU‰åWVSƒì ‹E‹u ‹<…À$v‰ÐÁà)Ðfƒ<ň$tµ€Gƒ<ÿtHÿëCƒìv‰ÃÁã)ÃÁ㍃¤$PjèR5fǃˆ$€ƒÄ‹ƒ4$‹—ðÂPVè„ÉÿÿƒÄeô[^_]ÐU‰åSƒì ‹E‹M ‹…À$I‰ÐÁà)ÐÁàfǀˆ$€‹€4$‹“ðÂPQè8ÉÿÿƒÄ‹]üÉÃU‰å]ÍvU‰åWVSƒì ‹U‹•À$‰Eð‹U <•€‰ÆƒÆƒ<7~MƒìR‰ÃÁã)ÃÁ㍃¤$Pjè‹4ÿ 7ƒÄ‹ƒ4$‹Mð‹‘ðÂPÿu èRÈÿÿfǃˆ$€ƒÄë‹E @‰ÐÁà)ÐfÇň$eô[^_]ÐU‰åƒì‹E‹M ‹…À$ƒÀDŽˆ€ÿÿÿÿI‰ÐÁà)ÐfÇň$h$QèðÉÿÿƒÄÉÍvU‰å‹E‹U ‹…À$ƒÀDŽ€R‰ÐÁà)ÐfÇň$]ÃU‰åWVSƒì4‹u v‰EäÁà+EäfÇň$EèPjè“3Mè»@B‹Eº÷ó‰Uà’€€‰E܋A‹U܍ЉE؉A»¡/¸D÷ë‰ÓÁû‹EØÁø)ÿƒÞC‹E÷ç‰×‰øÁèEè‹A»Êš;™÷û‰Ó‰YƒÄVh´¦"ÿuìÿuèÿ($‰ÃƒÄƒûÿuƒìÿ5Œ$jèAäÿÿƒÄ v‰ÈÁà)ȉÅ@$eô[^_]ÐU‰åƒìÿ5Œ$jèäÿÿ¸ƒÄÉÍvU‰åƒìÿ5Œ$jèñãÿÿƒÄÉÃU‰åƒìÿ5Œ$jèÙãÿÿƒÄÉÃU‰åƒìÿ5Œ$jèÁãÿÿƒÄÉÃU‰åƒìÿ5Œ$jè©ãÿÿƒÄÉÃU‰åƒìÿ5Œ$jè‘ãÿÿƒÄÉÃU‰åƒìÿ5Œ$jèyãÿÿƒÄÉÃU‰åƒìÿ5Œ$jèaãÿÿƒÄÉÃU‰åƒìÿ5Œ$jèIãÿÿƒÄÉÃU‰åƒìÿ5Œ$jè1ãÿÿƒÄÉÃU‰åƒìÿ5Œ$jèãÿÿƒÄÉÃU‰åWVSƒì‹MI‰ÃÁã)ÃÁãºd$‹‹4…À$¿`$fÇD(€‹„Ћ–ðÂPQèÕÅÿÿDŽàÿÿÿÿ衆ÿÿƒÄeô[^_]ÉöU‰åVSƒì h`M#è½ÿÿè­¦ÿÿ‰ÆÇ$Œè'ªÿÿ‰Ã‰µÀ$ƒÄ jhøL#Sè®[fÇCÆCÇC`¨"ÇC”¨"ÇC  ¨"ÇC$Ȩ"ÇC(ÇC,à¨"ÇC0ì¨"ÇC4ô¨"ÇC8©"ÇC<©"ÇC@$©"ÇCDL©"ÇCHt©"ÇCLœ©"ÇCPÄ©"ÇCTì©"ÇCXª"ÇC\<ª"ÇC`hª"ÇCdª"ÇCh¸ª"ÇClàª"ÇCp«"ÇCt0«"ÇCxX«"ÇC|€«"ǃ€¨«"ǃ„Ы"ǃˆÿÿÿÿÇ$M#è¼ÿÿƒÄ jVhø«"è|¤ÿÿƒÄeø[^]ÉöU‰å‹M‹E ‹À$fƒ8t·9Èu¸ƒºˆÿt¸ÿÿÿÿ]ÉöU‰å¸ÿÿÿÿ]ÉöU‰åƒì‹E‹…À$ÿ°ˆheL#èìYƒÄÉÍvU‰å‹E‹…À$‹€ˆ]ÍvU‰å¸]ÉöU‰å]ÍvU‰å¸]ÉöU‰å]ÍvU‰å‹E @‰ÂÁâ)ÂfÇՈ$]ÃU‰åƒìhtL#èxYƒÄÿ5Œ$j è„àÿÿƒÄÉÍvU‰åƒìh{L#èPYƒÄÿ5Œ$j è\àÿÿƒÄÉÍvU‰åƒìh‚L#è(YƒÄÿ5Œ$j è4àÿÿƒÄÉÍvU‰åƒìh‰L#èYƒÄÿ5Œ$j è àÿÿƒÄÉÍvU‰åƒìhL#èØXƒÄÿ5Œ$j èäßÿÿƒÄÉÍvU‰åƒìh—L#è°XƒÄÿ5Œ$j è¼ßÿÿƒÄÉÍvU‰åƒìhžL#èˆXƒÄÿ5Œ$j è”ßÿÿƒÄÉÍvU‰åƒìh¥L#è`XƒÄÿ5Œ$jèlßÿÿ¸ƒÄÉÉöU‰åƒìh¬L#è4XƒÄÿ5Œ$jè@ßÿÿƒÄÉÍvU‰åƒìh³L#è XƒÄÿ5Œ$jèßÿÿƒÄÉÍvU‰åƒìhºL#èäWƒÄÿ5Œ$jèðÞÿÿƒÄÉÍvU‰åƒìhÁL#è¼WƒÄÿ5Œ$jèÈÞÿÿƒÄÉÍvU‰åƒìhÈL#è”WƒÄÿ5Œ$jè ÞÿÿƒÄÉÍvU‰åƒìhÏL#èlWƒÄÿ5Œ$jèxÞÿÿƒÄÉÍvU‰åƒìhÖL#èDWƒÄÿ5Œ$jèPÞÿÿƒÄÉÍvU‰åƒìhÝL#èWƒÄÿ5Œ$jè(ÞÿÿƒÄÉÍvU‰åƒìhäL#èôVƒÄÿ5Œ$jèÞÿÿƒÄÉÍvU‰åƒìhëL#èÌVƒÄÿ5Œ$jèØÝÿÿƒÄÉÍvU‰åSƒì0‹]ÇEÜÇEàfÇEäÇEè¶Ãf‰EØÇEìEØjjPh„¬"hòL#è‡ÿÿƒÄ ‹À$‰Ã‰šˆƒûÿuƒì h M#èæ·ÿÿƒÄ[‰ÐÁà)ÐÇŘ$ÿÿÿÿ‹]üÉÐU‰åôëýU‰åWVSƒì ‹} ¾ú»ëvCûÿ2Ý)ØÁຠÂ#€|t߃ìÿ4ÿuèaVƒÄ…Àuʾ…öt1ÿÀuèðnÇûéÜûÝ)؍…¤Â#éˉö÷Ç@uè¿nÇû髍v‹E‰Eð=ÿ~èžnÇû銉ö‹pã#ƒúÿtqÕ)Ѝ<…w‹†¤Â#£pã#ƒì ÿuèV@‰$è×£ÿÿ» Â#‰ƒÄÿuPè7U‹Eð‰‡¨Â#‡¬Â#‰$èĽÿÿÆDƒÄû‡¤Â#ëvènÇû¸eô[^_]ÍvU‰åWVSƒì ¾ú¿» Â#vý)øÁà€|tƒìÿ4ÿuèUƒÄ…Àu¾Gÿÿ~ʅötJƒì ÿuèOUƒÄ@Pý)ûÁã¾ Â#ÿ43èu£ÿÿƒÃÆD3¡pã#‰ƒ¤Â#‰=pã#ƒÄûë‰öèSmÇû¸eô[^_]ÍvU‰åWVSƒì ‹}?ÿw‹Õ)Ѐ<…¸Â#uèmǸÿÿÿÿé‰öèÏæÿÿúè5B‹Œ$R‰ÑÁá)Ñf‰Íh$‹Õ)Ѝ4… Â#ƒ~ ÿu
-ƒ~…“ƒìWjÿìt#ƒÄhD$jè8)ƒÄUè¡H$;˜$|¡D$+”$‰Eè¡H$+˜$ë!‰ö¡D$+”$H‰Eè¡H$+˜$ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ìºÓMb‰Ø÷êÁú‰ØÁø)ÂыŒ$R‰ÐÁà)Ð) Ŭ$ƒì QèJ†ÿÿƒÄƒ=œ$ÿtƒì ÿ5œ$ÿh$Çœ$ÿÿÿÿƒÄ‹ -Œ$I‰ÐÁà)ЋÅd$ƒì‹…À$QPÿRH‹ -Œ$I‰ÐÁà)л`$fÇDÃ(Íǂ Þ#‹‰‚¤Þ#ƒÄF PQèZ¼ÿÿÇŒ$ÿÿÿÿÇ $ÿÿÿÿèEˆÿÿ¡Œ$@‰ÂÁâ)¿DÓ‰$è…@è,’ÿÿƒÄûèÿäÿÿë8ÿNƒìWjÿìt#¡Œ$@‰ÂÁâ)¿Õh$‰$èF@èí‘ÿÿƒÄû¸eô[^_]ÃU‰åWVSƒì ‹}‹]?ÿw‹Õ)Ѐ<…¸Â#uè¯jǸÿÿÿÿéVv…ÛuúëúèÒ?‹Œ$R‰ÑÁá)Ñf‰Íh$‹Õ)Ѝ4… Â#…Ûu0ƒ~ ÿu‹E 9F}èMjÇ û¸ÿÿÿÿéó‹E )Fûéâèäÿÿƒ~ ÿu ‹E 9F‘ƒìWjÿìt#ƒÄhD$jèš&ƒÄUè¡H$;˜$|¡D$+”$‰Eè¡H$+˜$ë¡D$+”$H‰Eè¡H$+˜$ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ìºÓMb‰Ø÷êÁú‰ØÁø)ÂыŒ$R‰ÐÁà)Ð) Ŭ$ƒì Q讃ÿÿƒÄƒ=œ$ÿtƒì ÿ5œ$ÿh$Çœ$ÿÿÿÿƒÄ‹ -Œ$I‰ÐÁà)ЋÅd$ƒì‹…À$QPÿRH‹ -Œ$I‰ÐÁà)л`$fÇDÃ(͋E ‰‚ Þ#‹‰‚¤Þ#ƒÄF PQ迹ÿÿÇŒ$ÿÿÿÿÇ $ÿÿÿÿ誅ÿÿ¡Œ$@‰ÂÁâ)¿DÓ‰$èê=葏ÿÿƒÄûèdâÿÿë<‰ö‹E )FƒìWjÿìt#¡Œ$@‰ÂÁâ)¿Õh$‰$è§=èNÿÿƒÄû¸eô[^_]ÐU‰åWVSƒì ‹}?ÿw‹Õ)Ѐ<…¸Â#uèhǸÿÿÿÿéU‰öè,…À„‡œúX‰Æ‹Õ)Ѝ… Â#‹JA‰J‹Z ƒûÿtG‹Ý Þ#9È<)Á‰È‰BƒìB PSèb·ÿÿ[‰ÐÁà)ЋÅd$ƒÄ‹•À$SRÿPDèUyÿÿƒÄƒìWjÿìt#ƒÄ‰ðPé¼‰öúèª<‹ $R‰ÑÁá)Ñf‰Íh$‹Õ)Ѝ… Â#‹JA‰J‹Z ƒûÿtG‹Ý Þ#9È<)Á‰È‰BƒìB PSè¶ÿÿ[‰ÐÁà)ЋÅd$ƒÄ‹•À$SRÿPDè݃ÿÿƒÄƒìWjÿìt#¡Œ$@‰ÂÁâ)¿Õh$‰$è <貍ÿÿƒÄû¸eô[^_]ÐU‰åWVSƒì ‹] ÇEð‹E8ÿw‹Õ)Ѐ<…¸Â#uèlfǸÿÿÿÿéÊèc*…À„ÃœúX‰Â‰Uì‹E‹Õ)Ѝ4… Â#^‹^ ƒûÿts݉‹€ Þ#;F_¿ Þ#ÇEðv‹F+:‰FƒìF PS袵ÿÿ[‰ÐÁà)ЋÅd$ƒÄ‹•À$SRÿPD‹^ ƒÄƒûÿt݋:;F~°ƒìÿujÿìt#ƒÄƒ}ðtèdwÿÿ‹Uì‰ÐPéõúèÊ:‹ $R‰ÑÁá)Ñf‰Íh$‹E‹Õ)Ѝ4… Â#^‹^ ƒûÿtr݉‹€ Þ#;F^¿ Þ#ÇEð‰ö‹F+:‰FƒìF PSèÊ´ÿÿ[‰ÐÁà)ЋÅd$ƒÄ‹•À$SRÿPD‹^ ƒÄƒûÿt݋:;F~°ƒìÿujÿìt#ƒÄƒ}ðt贁ÿÿ¡Œ$@‰ÂÁâ)ƒì ¿Õh$Pèð9藋ÿÿƒÄû¸eô[^_]ÉöU‰åWVSƒì ¾¿¤Â#õ)óÁãǃ Â#‰4;ǃ¨Â#ƒì ƒ¬Â#PèÞ³ÿÿƒÃF‰;ƃ¨Â#ƒÄ‰Æþÿ~±Ç˜Þ#ÿÿÿÿÇpã#ƒìjh8»"芔ÿÿƒÄeô[^_]ÍvU‰åVS‹uú>ÿw‹Õ)Ѐ<…¸Â#uèÉcÇû¸ÿÿÿÿënvƒì ‹Õ)л Â#ÿ4ƒèUKƒÄ@P‹Õ)Ðÿ4ƒè™ÿÿ‹Õ)ÐÆDƒ‹Õ)Ћpã#‰…´Â#‹£pã#ƒÄû¸eø[^]ÉöU‰åƒì‹Mú9ÿw‹Õ)Ѐ<…¸Â#uècÇû¸ÿÿÿÿëb‰ö‹Õ)Ѓ<…¬Â#ÿtèîbÇû¸ÿÿÿÿë8‹Õ)ÐÆ…¸Â#‹Õ)Ћpã#‰…´Â#‹£pã#û¸ÉÉöU‰åSƒì‹M‹] 9ÿw‹Õ)Ѐ<…¸Â#uèubǸÿÿÿÿë_ú‹Õ)ÐÁàƒ¸¬Â#ÿu ‹€¨Â#‰ë7‰öÇ‹Õ)Ћ…¬Â#¹h$vÿ @‰ÐÁà)ЋDÁPƒøÿuëû¸‹]üÉÃU‰åVS‹u‹M¸ùÿ‡–ú‹pã#‰ƒúÿtnÕ)Ћ…´Â#£pã#‹Õ)л Â#ǃ‹Õ)Љ …¨Â#ƒì ‹Õ)Ѝ…¬Â#Pè±ÿÿ‹Õ)ÐÆDƒƒÄëègaÇû¸ÿÿÿÿëû¸eø[^]ÍvU‰åƒì‹M9ÿw‹Õ)Ѐ<…¸Â#uèaǸÿÿÿÿë=ú‹Õ)Ѝ… Â#ƒx ÿuƒxuèì`Ç û¸ÿÿÿÿë ‰öÿHû¸ÉÐU‰å‹E@‰ÂÁâ)¸fƒ<Ո$”À]ÐU‰åVS‹][‰ÐÁà)Ѝ4Åfƒ¾ˆ$uAƒì‹ݤÞ#Õ)Ѝ…¬Â#PSè°ÿÿ‹†d$ƒÄ‹…À$SPÿRD¸ƒÄ됸eø[^]ÃU‰åVSƒ=øt#…ÚÇøt#¹» Ç%¾$Ç%‰ÁàP ÆÇ2ÿÿÿÿÆDAƒùváƒìjjh€ã#èÜýÿÿ¹ƒÄ¾„É%»€É%‰ö‰ÁàQ‰0Ɖуù -véÇ´Ë%ÿÿÿÿÆ°Ë%ÇxÉ%¹¾äË%»àË%vÍ)ÈÁàQ‰0ƉуùvãÇÏ%ÿÿÿÿÆ Ï%Ç(Ï%eø[^]ÐU‰åWVSƒìŠEˆEóŠUˆUòfÇEæ¾<u€út €}óu€}òuè_Ǐ¸ÿÿÿÿé7‰öúƒ=xÉ%ÿuèí^ǍûÇEìÿÿÿÿ됡xÉ%€‹ՄÉ%‰xÉ%û‰Eìƒ}ìÿu -¸ÿÿÿÿéìvƒì h€ã#ègñÿÿƒÄ‹]¾¹º÷ñ‰×ëf‰ö¿€<Å@Ç%t0ƒìÿu¿ōƒ Ç%Pè³EƒÄ…Àu€»8Ç%„Ÿ¾ëG¹‰øº÷ñ‰×fÿEæfƒ}懜‰ó„Ût–¿Áãƃ@Ç%ƒìÿuƒ Ç%Pè÷D‹E쉃4Ç%ƒÄ€}óu‰Â’‹] f‰ňÉ%ëv‹E썀‹E ¯Ef‰ՈÉ%úƒì ‹U썒Áã·ƒˆÉ%Pè-“ÿÿºŒÉ%‰ƒÄû…Àu%è”]ǒƒì h€ã#èAõÿÿ¸ÿÿÿÿ魍v‹E썀ÁãS‰UྀÉ%‹ƒŒÉ%‰‚„É%‰2ƒìjjƒœÉ%Pè:ûÿÿƒÄ ·D3Pjƒ É%Pè#ûÿÿƒÄ jjÃ¤É%SèûÿÿŠ]ó‹Eàˆ\0ƒÄúƒ=(Ï%ÿuèø\ǎûÇEèÿÿÿÿë¡(Ï%Å)‹•äË%‰(Ï%û‰Eèƒ}èÿu_ƒì h€ã#èvôÿÿ‹Eèéä‰öè§\ǐƒì h€ã#èTôÿÿ¸ÿÿÿÿéÀ‰öèƒ\Ǒƒì h€ã#è0ôÿÿ¸ÿÿÿÿ霉ö‹EèÁà+EèÁà¹àË%ŠUòˆT P‹]ì‰
-‹] f‰\
-ǀäË%ÿÿÿÿ‰ºèË%‹]썛ÆՀÉ%ƍ¿ōr¿ Ç%€|>t%ƒì¶D>Pš<Ç%SèGõÿÿÆD>‰$èšøÿÿƒÄƒì h€ã#èŽóÿÿ¿EèƒÄeô[^_]ÍvU‰åWVSƒìŠEˆEóŠ]ÇEè¿ÆEç<u„Ût €}óu€ûuè‚[Ǐ¸ÿÿÿÿé0‰öúƒ=(Ï%ÿuèa[ǎûÇEìÿÿÿÿë ¡(Ï%Å)‹•äË%‰(Ï%û‰Eìƒ}ìÿu ¸ÿÿÿÿéߐ‹EìÁà+EìÁàºàË%ˆ\ ‹M f‰LǀäË%ÿÿÿÿƒì h€ã#è°íÿÿƒÄ‹U¾¹º÷ñ‰Öë]v¶€<Å@Ç%u ¿ÆEçë8ƒìÿu¶Å Ç%PèöAƒÄ…Àu¿ëF¹‰ðº÷ñ‰ÖÿEèƒ}è‡Ò‰ù„Ét €}çuR¶Á㸠Ç%ÆD ÆDƒìÿuPè>AƒÄ jjÃ<Ç%Sè/øÿÿÇ$€ã#èçñÿÿƒÄ jjSè:ïÿÿëM¶ōCº Ç%€|t'þDƒì h€ã#è®ñÿÿƒÄ jjƒ<Ç%Pèûîÿÿ됃ì h€ã#è‹ñÿÿƒÄ¶‹<Å4Ç%¿ŠUó:ŘÉ%tèªYǓ¸ÿÿÿÿéX‰ö€}óu¿·ňÉ%9E u€}ót(¿·ňÉ%™÷} …ÒtèdYǔ¸ÿÿÿÿéƒì h€ã#è ìÿÿ¶‹ÅDÇ%ƒÄƒúÿ„­€}óu#è&YǕƒì h€ã#èÓðÿÿ¸ÿÿÿÿéЍÕ)з…ôË%9E t"èíXǔƒì h€ã#èšðÿÿ¸ÿÿÿÿ鋋MìÁá+M썶Å »$Ç%‹‰äË%‹Mì‰ ë/‰öèŸXǑƒì h€ã#èLðÿÿ¸ÿÿÿÿë@¶‹Uì‰ÅDÇ%ƒì h€ã#è*ðÿÿ‹EìÁà+EìÁàH‰±èË%ºàË%‰<Æ¿EìƒÄeô[^_]ÉöU‰åWVSƒì¿E‰Eì‰ÇÁç)ÇÁ獗àË%‰Uðh€ã#èÏêÿÿ‹Mð‹Y›ÁãC‰Eèº$Ç%‹€Áà°€É%ƀ€É%F‰$èôÿÿF ‰$è„ôÿÿF$‰$èyôÿÿƒÄú·FPÿv 訍ÿÿû¹$Ç%‹Eè‹ú ’¡xÉ%‰̈́É%‰xÉ%ûƇàË%ƒÃ ‹Uð‹B‰ƒ$Ç%ú¡(Ï%‰‡äË%‹Mì‰ -(Ï%ûƃ Ç%Ç$€ã#è
-ïÿÿƒÄeô[^_]ÍvU‰åWVSƒì ‹u ŠM¿UÕ)Ѝ…àË%‰Eð‹@€ŀÉ%‹Eð€x uèûVǔ¸ÿÿév€;uèÞVǖ¸ÿÿéù‰ö€{tQ€{u,ƒì¶ÁP‹Uð·BPC PèÈëÿÿƒÄ…Àt;¸évƒì¶ÁP‹Uð·BPC PèœëÿÿƒÄ…ÀuÔƒì CPè-éÿÿƒÄ‹Uð·B‹{‰ÁÁéüó¥¨tf¥¨t¤·B‰ÁK‰K·S‰ÐC 9Ár‰È)ЉC€{u ƒì CPë8‰ö€{uƒì‹Uð·BPC$PèZïÿÿëƒì‹Uð·BPC$PèDïÿÿC‰$èíÿÿƒÄ¸eô[^_]ÐU‰åWVSƒì ‹} ŠM¿UÕ)Ѝ…àË%‰Eð‹@€ŀÉ%‹Eð€x uè‹Uǔ¸ÿÿév€;uènUǖ¸ÿÿéù‰ö€{tQ€{u,ƒì¶ÁP‹Uð·BPC$PèXêÿÿƒÄ…Àt;¸évƒì¶ÁP‹Uð·BPC$Pè,êÿÿƒÄ…ÀuÔƒì CPè½çÿÿƒÄ‹Uð·B‹s‰ÁÁéüó¥¨tf¥¨t¤·B‰ÁK‰K·S‰ÐC 9Ár‰È)ЉC€{u ƒì CPë8‰ö€{uƒì‹Uð·BPC Pèêíÿÿëƒì‹Uð·BPC PèÔíÿÿC‰$è-ìÿÿƒÄ¸eô[^_]ÐU‰åSƒìhM#è;ƒÄÿ5xÉ%h‹M#è;»ƒÄÝ)ØÁà€¸àË%t8àË%‹B€ŀÉ%ƒì ÿp ÿp$‹B€Å Ç%PShŸM#è®:ƒÄ Cƒûv­‹]üÉÃU‰åƒì`¿MÍ)ȋ…ðË%’ŀÉ%ÿp ÿp$RQhÀM#E¨Pèf:ƒÄ ÉÐU‰åSƒì‹]h€ã#èHæÿÿ¿ÓÕ)Ѝ …‹øË%€Å ƒÄ€º Ç%u ‹äË%‰‚$Ç%¿ÃÅ)ÂÁâƂàË%ú‹ -(Ï%‰ŠäË%£(Ï%ûƒì h€ã#èÓêÿÿƒÄ‹]üÉÍvU‰åWVSƒì ‹u ‹E‹<… $ú‹^…Ûu-ƒì j èdˆÿÿƒÄ…ÀtÇÿÿÿÿÇ@Ç@ÿÿÿÿ‹U‰‰F‹;Œ$u û¸#é~ƒ;ÿtc¾`$‰ö‹ -Œ$I‰ÐÁà)Ћ‰TÆP‹C‰„¬¡Œ$‰CÿCè`oÿÿ¡Œ$@‰ÂÁâ)ƒì ¿DÖPèŸ'èFyÿÿƒÄûúƒ;ÿu¤¡Œ$ÿD‡D¡Œ$‰û¸eô[^_]ÉöU‰åWVSƒì ‹E ‹x¸…ÿ„À‹;Œ$tû¸髍vúè*'‹Œ$ [‰ÊÁâ)Êf‰Õh$‹E‹… $ÿL˜DÇÿÿÿÿ‹_ÇGÿÿÿÿƒûÿt-p ‰Ù[‰ÐÁà)ЉÅ°$‹œž DŽŽ ÿÿÿÿƒûÿuÖÇGèfnÿÿ¡Œ$@‰ÂÁâ)ƒì ¿Õh$Pè¢&èIxÿÿƒÄû¸eô[^_]ÃU‰åVSƒì h$N#蒙ÿÿè]ƒÿÿ‰ÆÇ$蛆ÿÿ‰Ã‰µ $ƒÄ jh8N#Sè"8fÇCÍÆCÇCÇCxË"ÇC ÄË"ÇC$ÐË"ÇC(ØË"ÇC,Ì"ÇC04Ì"ÇC4|Ì"ÇC8ÜÈ"ÇC<ÄÌ"ÇC@ÄÉ"ºƒÄsK •ÇD@DŽ ÿÿÿÿBú™~ݍeø[^]ÉöU‰åVS‹E‹… $ƒì hN#è7¾ƒÄƒÃƒìÿt³@hN#èû6ƒÄFþ™~ãeø[^]ÃU‰å¸ÿÿÿÿ]ÉöU‰å]ÍvU‰åƒì‹E‹U ‹… $ƒÀƒ|@tƒìRj
-èȽÿÿƒÄÉÍvU‰å‹U :t ‹E -9u
-¸ëv¸ÿÿÿÿ]ÐU‰åSƒì‹] j è#…ÿÿ‰ÂƒÄ¸ …Òt!ÇÿÿÿÿÇBÇBÿÿÿÿ‹E‰‰S¸‹]üÉÍvU‰åSƒì‹] ‹Cƒxt ¸ë&‰öúƒ{tƒìj ÿsè4…ÿÿÇCƒÄû¸‹]üÉÍvU‰åWVSƒì ‹}‹u ú‹^…Ûu*ƒì j 胄ÿÿƒÄ…ÀtÇÿÿÿÿÇ@Ç@ÿÿÿÿ‰>‰Fƒ;ÿt
-û¸ë"‰ö¡Œ$‹½ $ƒÂÿD‚@¡Œ$‰û¸eô[^_]ÃU‰åWVSƒì ‹E ‹U‹• $ú‹p¸…ö„V‹;Œ$u û¸#éA‹Œ$‹F ¿`$;„“°v -¸é v¡Œ$‹Œƒ°‹“¬…Òt‰ö‹;Œ$…Š‹R…Òu븅À…†‹ -Œ$I‰ÂÁâ)‹ƒ¬‹‰D×P‹ƒ¬‹@‰„‹‹“¬¡Œ$‰B‹ƒ¬ÿ@èºjÿÿ¡Œ$@‰ÂÁâ)ƒì ¿D×Pèù"è tÿÿƒÄûúéRÿÿÿ‰ö¸;J ’Àérÿÿÿ‹E‹… $¡Œ$ÿDƒD¡Œ$‰¹‹ƒ¬‹V ë‰ö‰Á‹A…Àt;P sò…Ét‰q됉³¬…Àt‰p‰F‰Nû¸eô[^_]ÍvU‰åWVS‹}‹E ‹ ½ $ú‹X¸…Û„Ù‹;Œ$uû¸#éčv‹Œ$‹C ;„‘°s
-¸饡Œ$‹´°‹‘¬…Òt‰ö‹;Œ$u‹R…Òu︅Àuû¸ëk‰ö¸;r ’Àëåv‹ ½ $¡Œ$ÿDD¡Œ$‰¾‹¬‹S 됉ƋF…Àt;P sò…öt‰^됉™¬…Àt‰X‰C‰sû¸[^_]ÉöU‰åWVSƒì ‹E ‹x¸…ÿ„ï‹;Œ$tû¸éڍvúè&!‹Œ$ [‰ÊÁâ)Êf‰Õh$‹E‹… $‰EðÿL˜DÇÿÿÿÿ‹_ÇGÿÿÿÿƒûÿt2‰ÆƒÆv‰Ù[‰ÐÁà)ЉÅ°$‹œžDŽŽÿÿÿÿƒûÿuÖÇG‹O‹W…Éu -‹Eð‰¬ë‰ö‹G‰A…Òt‹G‰Bè3hÿÿ¡Œ$@‰ÂÁâ)ƒì ¿Õh$Pèo èrÿÿƒÄû¸eô[^_]ÐU‰åVSƒì hdN#è^“ÿÿè)}ÿÿ‰ÃÇ$€èg€ÿÿ‰Æ‰4 $ƒÄ jhxN#Vèî1fÇFÌÆFÇFÇF€Ò"ÇF Ó"ÇF$0Ó"ÇF(`Ó"ÇF,¨Ó"ÇF0ÔÓ"ÇF4,Ô"ÇF8<Í"ÇF<ÄÎ"ÇF@ÈÏ"ºƒÄ^N•ÇD@DŽ°ÿÿÿÿDŽÿÿÿÿBú™~Òdž¬eø[^]ÐU‰å‹U‹M ¸ÿÿÿÿ…Òt;‹‹… $ƒxu‹@%ÿÿÿ=Ìu…Ét ‹B‹@ ‰ë
-‰ö¸ÿÿÿÿ됸]ÐU‰å‹U‹M¸ÿÿÿÿ…Òt@‹‹… $ƒxu‹@%ÿÿÿ=Ìt¸ÿÿÿÿ됅Ét‹B‹@ ‰‹R‹E ‰B ¸]ÃU‰å‹E‹M ‹U‹… $‰”ˆ°]ÃU‰åWVSƒì‹E‹<… $hN#è0»ƒÄwƒìÿtž@hN#èó/ƒÄCû™~ãƒì hBN#èÚ/»ƒÄ‰öƒìÿ´Ÿ°h^N#è¼/ƒÄCû™~àeô[^_]ÃU‰å‹U :t ‹E -9u
-¸ëv¸ÿÿÿÿ]ÐU‰åS‹E‹U ‹]‹ … $Áâ‹C‰„°ÇD
-D‹$ÉÉöU‰åVS‹E‹u ‹… $ƒ|³DtƒìVj
-èD¶ÿÿƒÄë vÇD³DDŽ³°ÿÿÿÿeø[^]ÉöU‰å‹U :t ‹E -9u
-¸ëv¸ÿÿÿÿ]ÐU‰åSƒì‹] jèƒ}ÿÿ‰ÂƒÄ¸ …Òt1ÇÿÿÿÿÇBÇBÿÿÿÿ‹E‹@‰B ÇB‹E‰‰S¸‹]üÉÍvU‰åSƒì‹] ‹Cƒxt ¸ë&‰öúƒ{tƒìjÿsè„}ÿÿÇCƒÄû¸‹]üÉÍvU‰åWVSƒì$·]Sh‚N#è .‰Ø-yƒÀÁèƒÄ ·À‰Eè@ÛÁã¿àÛ%ÿt8CP‰Eä·8Ph‰N#èá-ƒÄ ÿt;·D;Ph—N#èÊ-ƒÄ ÿt; s·>Ph¨N#è±-ƒÄ ÿt>·D>Ph¹N#èš-ƒÄ ‹Uä·D:P·DLPhÊN#è~-‹UèÕƒÄ·ØShÛN#èc-EóPEòPEìPS蹃ĶUóR¶UòRÿuìPh O#è6-ƒÄ eô[^_]ÍvU‰åWVSƒì ‹E‹U‹]¹‹u ƒî‰ƒî‰ºÀ^&fƒ=À^&yA¿Áfƒ<Byfù™~îfù™~ƒì hðN#èÎ,¸ƒÄé ¿Á<¹À^&‰Úf Ê€f‰Ǎ<ÿÁçºàÛ%‰tÇD _ÇDfŒÙf‰LfÇfÇDÇD _ ‹M‰ ÇDÇDO0ÇDÇD Ǎ_@ÇÇD‰t‰t fŒÉf‰L fŒÙf‰LfŒÛOPf‰\fŒÛf‰fÇD 0fÇD0O`fÇfÇDfÇDÇLÜ%¾`&¹üó¥Å˜eô[^_]ÐU‰åVS‹u ¿E-‰Â…ÀyP‰ÐÁø@ÀÁà¹àÛ%f‰tX@Vf‰T f‰t ƒÀPf‰tf‰4[^]ÉöU‰å¿E-‰Â…ÀyP‰ÐÁøfDŽÀ^&]ÉöU‰åSƒì‹]¿E PhO#Sè~3‰ØƒÄ‹]üÉÃU‰åVS趉Æès»‰öƒìhlÞ"SèƒÄhø×"SèìƒÄCƒû~ۉðeø[^]ÉöU‰åƒìèaÉÍvU‰åSƒì‹]‹üt#€82uºð°îƒìShbP#èˆ*ƒÄÁ㋃üt#@Ph½Z#èp*ƒÄÿ³@u#ènƒÄ‹]üÉÉöU‰åƒìÿuhyP#èE*èèûÇ$èG7ƒÄÉÉöU‰åWVSƒì‹E‹} ƒ=$Ú%„à…ÿ„Ø¡ Ð%€€€ źm¶‰È÷â‰È)ÐÑ草ÁÁé
-‰O¡¤Ð%ÀP‰ÐÁà)кè‰Ó™÷û’’’щW¡¤Ð%ÀP‰ÑÁá)ѾÓMb‰È÷îÁú‰ÈÁø‰Ó)øƒÞC÷o‰ÑÁù‹GÁø)Á‰È؉‹OÁú‰ÈÁø)’’’’’’Áâ)э ‰ ‰ ‰Áá‰O‹éԉö]è¡ Ð%€€€ źm¶‰È÷â‰È)ÐÑ草ÁÁé
-¡¤Ð%ÀP‰ÐÁà)кè‰Ö™÷þ’’’щS¡¤Ð%ÀP‰ÑÁá)ѾÓMb‰È÷îÁú‰ÈÁø)‰Uè‹{¸ƒÞC÷ï‰ÑÁù‰øÁø)Á‰ÈEè‰ùÁú‰ÈÁø)’’’’’’Áâ)э ‰ ‰ ‰Áá‰K‹E荀€€€€€‰ÃÁã‰È÷îÁúÁù)ʍéèvƒøuc¸ƒ=”Ð%…Ρ˜Ð%€€€€€€‰ÃÁã‹ -œÐ%ºÓMb‰È÷êÁúÁù)ÊӅÿ„…¡˜Ð%‰¡œÐ%éqvƒø…綄Ð%ƒøtƒø…Àt
-ë,ƒøtë%¹@°ë#v¹A°ëv¹B°ë v»ë"ºCÐî‰Êì¶ØìˆÁ‰ÊÁâf¶Ã‰Ó Ãf‹ -Ð%f)Ù·É - Ð%º×®¬]‰È÷êÁú‰ÈÁø)¤Ð%’BÁà)Ѝ‚‰ÂÁâ Ð)Á‰È£ Ð%f‰Ð%…ÿ„̍€€€ źm¶‰È÷â‰È)ÐÑ草ÁÁé
-‰O¡¤Ð%ÀP‰ÐÁà)кè‰Ó™÷û’’’щW¡¤Ð%ÀP‰ÑÁá)ѺÓMb‰È÷êÁú‰ÈÁø‰Ó)Ëw¸ƒÞC÷î‰ÑÁù‰ðÁø)Á‰È؉‰óÁú‰ÙÁù)ʍ’’’’’’Áâ‰Ø)Ѝ€€€Áà‰G‹ Ð%’’’4Õ¹Á6ۉð÷é‰Ó3‰ÁÁù
-‰ð™‰È)Ћ -¤Ð%ɍ‘ÑÁâ)ʉÑÁá)эÈ鍃ø…ƒ=”Ð%…rU衘Ð%‰¡œÐ%‰B»@¹C°Ò‰Êî‰Úì¶ÈìÁàf¶Ñ зð· Ú%9Æv%h†P#j_h˜P#hŸP#èm%Ç$èmƒÄ· Ú%)ó¯ˆÐ%· Ú%‰Ø‰Ñº÷ñ‰Ãº °
-îì©t‹ -ˆÐ%;ÍÌÌ̉ð÷âÁê9Ós‰Ëu荛€€‹V‰Eä‰F¸¡/¸D÷mä‰ÑÁù‹EäÁø)Á‰ÈEè‹N¸¡/¸D÷éÁú‰ÈÁø)’’’’’’’’’Áâ )щN¡˜Ð%€€€€€€Áà‰Eä‹ -œÐ%ºÓMb‰È÷êÁúÁù)ʋEäÐÅÿt ‰ð‹‰‹@‰G‰Øëv¸eô[^_]ÍvU‰åVSƒìŠEˆE÷ÿ¨u#ƒ=¨u#uƒ=„u#tÿ„u#¶E÷€ÁàºLÏ%ƒ<uIÇö€PÏ%tûƒì ¶]÷›Áã¾@Ï%ÿ43ÿ“DÏ%ƒÄöDtú¶E÷€Ç…LÏ%ÿŒu#ƒ=¨u#uƒ=ˆu#tÿˆu#ÿ -¨u#eø[^]ÍvU‰åWVSº¿LÏ%¾HÏ%»DÏ%¹@Ï%’ÁàÇ8‰0ÇÇBƒú~ÜǨu#[^_]ÐU‰åVS‹U‹] ‹uú’ƒ<…LÏ%t÷Æu¸ÿÿÿÿëH’ …ǁLÏ%û…Ût‰™DÏ%º@Ï%HÏ%‰‰t
-됍’Ç…LÏ%¸[^]ÐU‰å¡¨u#]ÉöU‰åSƒì¶„Ð%ƒøt!ƒø…Àt ë.‰öƒøtë%¹@°ë#v¹A°ëv¹B°ë v»ë"ºCÐî‰Êì¶ØìˆÁ‰ÊÁâf¶Ã‰Ó Ãf‹ -Ð%f)Ù·É - Ð%º×®¬]‰È÷êÁú‰ÈÁø)¤Ð%’BÁà)Ѝ‚‰ÂÁâ Ð)Á‰ - Ð%f‰Ð%ÿ¨u#ƒ=¨u#uƒ=„u#tÿ„u#¡œÐ%‰Ã„ã#º¡/¸D‰Ø÷êÁú‰ÙÁù)ʘÐ%’’’’’’’’’Á⠉Ø)УœÐ%‹€Ð%ë$‹¡ŒÐ%‰‰ŒÐ%‰€Ð%ƒì ÿrÿRƒÄ‰Ú…Òt‹B ;˜Ð%;˜Ð%uƋB;œÐ%~»ƒ=¨u#uƒ=ˆu#tÿˆu#ÿ -¨u#‹]üÉÃU‰åWVSƒì‹uhÈì"j@èØ -ƒÄƒ>t,ƒì h¹P#èß »ÿÿƒÄ¿@¹C°8‰ÊîˆØ‰úîëaƒì hÕP#è³ ‹N‰ -ˆÐ%ɍA‰ÂÁâ‰Ñ)ÁºÓMb‰È÷âƒÄ‰ÑÁéu¹f‰ - Ú%‰Ë¿@¹C°4‰Êî‰úˆØî‰ØfÁèî‹£”Ð%ƒ=„`&~»A¹C°p‰ÊÚîîÆ„Ð%ë%Æ„Ð%»B¹C°°‰ÊÚîîºa°îº!ì%þî¹¾ÀÐ%»ÄÐ%ƒùbIÁàØÐ%‰0I‰LÃAƒùc~ßÇÚ%ÇŒÐ%ÀÐ%Ç„u#Lju#¡ˆÐ%€€€Áࣄã#ÇœÐ%ǘÐ%Ç Ð%ǤÐ%fǐÐ%ƒ=”Ð%uÇ($¸ã"Çh$Pä"ëÇ($ ä"Çh$,ë"eô[^_]ÃU‰å‹E£„u#]ÍvU‰å‹E£ˆu#]ÍvU‰å‹E£”u#]ÍvU‰åWVSƒì ‹E‹U ‰Eè‰Uì¸ÿÿÿÿƒ=ŒÐ%tl‹ -ŒÐ%‹£ŒÐ%‹E‰A‹Eè‰A ‹Eì‰A‹E‰A»‹€Ð%}è‹uè됋…Òt‰ð;B  -;B u‹G;B~‰Óëâ‰ö…Ût‰ ë‰ -€Ð%‰‹AƒÄ [^_]ÐU‰å‹E¹‹€Ð%됉ы…Òt;Buó¸ÿÿÿÿ…Òt$…Éu
-‹£€Ð%됋‰¡ŒÐ%‰‰ŒÐ%¸]ÃU‰åWVSƒì,‹E‹U ‰Eè‰Uì¸ÿÿÿÿƒ=ŒÐ%„q‹5ŒÐ%‹£ŒÐ%‹E‰F‹Eè‰F ‹Eì‰F‹E‰Fº‹€Ð%}è‹Mè됋…Ût‰È;C  -;C u‹G;C~‰Úëâ‰ö…Òt‰2鐉5€Ð%ƒ=$Ú%…ôƒìEàPjè3óÿÿ‹€Ð%ƒÄ‹Eà;B  -;B u‹Eä;B~ÇEÜÇEØëK}؋€Ð%Mà‹B;A|‹B +Eà‰E؉Ћ@+Aë ¡€Ð%‹@ +EàH‰EØ¡€Ð%‹@+Eäʚ;‰G‹E؍€€€€€€Áà‰EԋMÜ¿ÓMb‰È÷ïÁúÁù)ÊUԍҍB‰ÂÁâ)‰Ð÷çÁê¸ðúðw¸ÈúÇv‰Ðº@îfÁèFeô[^_]ÃU‰åWVSƒì¶„Ð%ƒøtƒø…Àt
-ë,ƒøtë%¹@°ë#v¹A°ëv¹B°ë v»ë"ºCÐî‰Êì¶ØìˆÁ‰ÊÁâf¶Ã‰Ó Ãf‹Ð%f)Ú·Ò‰Ö5 Ð%¹×®¬]‰È÷î‰ÑÁù‰ðÁø)Á -¤Ð%‰AÁà)ȍÁ‰ÁÁá ȉò)‰ Ð%f‰Ð%]荒’’ Õ¾m¶‰ð÷á‰Ö‰Ê)òÑê2‰ÁÁé
-¡¤Ð%ÀP‰ÐÁà)кè‰Ö™÷þ’’’щS¡¤Ð%ÀP‰ÑÁá)ѺÓMb‰È÷êÁú‰ÈÁø)‰Uè‹s¿ƒÞC‰ð÷ï‰ÑÁù‰ðÁø)Á‰ÈEè‰ðÁú‰ñÁù)ʍ’’’’’’Áâ)Ѝ€€€Áà‰Cƒ=€Ð%„/Ç$Ú%‹€Ð%‹Eè;B ;B …Œ‹C;BŽ€ƒ=¨u#uƒ=„u#tÿ„u#ÿ¨u#‹€Ð%ë#‹¡ŒÐ%‰‰ŒÐ%‰€Ð%ƒì ÿrÿRƒÄ‰Ú…Òt‹B ;Eè -;EèűB;Eì~ă=¨u#uƒ=ˆu#tÿˆu#ÿ -¨u#¶„Ð%ƒøt"ƒø …Àt -ë/vƒøtë%¹@°ë#v¹A°ëv¹B°ë v»ë"ºCÐî‰Êì¶ØìˆÁ‰ÊÁâf¶Ã‰Ó Ãf‹Ð%f)Ú·Ò‰Ö5 Ð%¹×®¬]‰È÷î‰ÑÁù‰ðÁø)Á -¤Ð%‰AÁà)ȍÁ‰ÁÁá ȉò)‰ Ð%f‰Ð%]荒’’ Õ¾m¶‰ð÷á‰Ö‰Ê)òÑê2‰ÁÁé
-¡¤Ð%ÀP‰ÐÁà)кè‰Ö™÷þ’’’щS¡¤Ð%ÀP‰ÑÁá)ѺÓMb‰È÷êÁú‰ÈÁø)‰Uè‹s¿ƒÞC‰ð÷ï‰ÑÁù‰ðÁø)Á‰ÈEè‰ðÁú‰ñÁù)ʍ’’’’’’Áâ)Ѝ€€€Áà‰C‹€Ð%‹Mè;J 
-;J u;B~ÇEäÇEàëJ]à‹€Ð%Mè‹B;A|‹B +Eè‰Eà‰Ð‹@+Aë ¡€Ð%‹@ +EèH‰EࡀÐ%‹@+Eìʚ;‰C‹Eà€€€€€€‰ÆÁæ‹Mä»ÓMb‰È÷ëÁúÁù)ʍ2ҍB‰ÂÁâ)‰Ð÷ãÁê¸ðúðw¸ÈúÇv‰Ðº@îfÁèîÇ$Ú%ë -‰öº@°î°ðîeô[^_]ÐU‰åVSƒì‹E»¹‹€Ð%ëv‰Ñ‹…Òt;Buó¸ÿÿÿÿ…Ò„I…Éu‹£€Ð%»ë‹‰¡ŒÐ%‰‰ŒÐ%ƒ=$Ú%…ƒ=€Ð%uº@°î°ðéû‰ö…Û„òƒìEðPjèºìÿÿ‹€Ð%ƒÄ‹Eð;B  -;B u‹Eô;B~ÇEìÇEèëJ]è‹€Ð%Mð‹B;A|‹B +Eð‰Eè‰Ð‹@+Aë ¡€Ð%‹@ +EðH‰E血Ð%‹@+Eôʚ;‰C‹E荀€€€€€‰ÆÁæ‹Mì»ÓMb‰È÷ëÁúÁù)ʍ2ҍB‰ÂÁâ)‰Ð÷ãÁê¸ðúðw¸ÈúÇv‰Ðº@îfÁèeø[^]Éöú‹D$¼ˆó#PèŒëÿÿ`fff f¨f¸0ŽØŽÀ° º u#@£u#1ÛfŒÓü¡”Ð%ƒøtèùòÿÿëè6ùÿÿ°
-º îì¨t ¸@Pè–ÿÿÿf¡˜u#f9žu#t f£žu#ÿ-šu#ƒ=”u#t‹”u#ÿÓf©f¡ffaωöU‰å‹EØf£žu#f£˜u#]Ã1ÀÈÃU‰åf¸0ŽØŽÀ‹Ef;žu#t f£žu#ÿ-šu#]ÉöU‰åƒìjjjj@èaƒÄÉÃU‰åWVSƒì ‹]‹u ‹}聉€:y"…Ût‹B8‰…öt‹BÁà
-‰…ÿt)‹B4‰ë"‰ö…ÛtÇ…öt‹BÁà
-‰…ÿtÇ@ƒ}t ‹BÁà
-‹U‰ƒÄ [^_]ÍvU‰åƒìjjjj@è̓Ä·@0ÉÃU‰å¡Xs#]ÉöU‰å]ÍvU‰åSƒì‹Xs#誃ì SèÅMÿÿè ƒÄ‹]üÉÃU‰åWVS‹M ‹u‹}Š]‰ÈÁàeèÿÿ Eè‰ÈÁèUèˆBáÿbÿÿÿ J‰ðˆB‹Ef‰Eè‹EÁè‰EäŠEäƒà ÃË@¶ÃÁàbÿÿÿ Bçüÿ=Js#‹‰‹B‰G[^_]ÐU‰åWVSƒì ‹] ‹u‹}·EMèJs#‹‰‹@‰A‰Ê¶JÁá¶B ÁÁá·B Á…ÛtŠBƒà¶ÐÁâ·Eè Љ…ötŠE툅ÿt
-ŠEî%ðˆ‰ÈƒÄ [^_]ÉöU‰å‹E ¶UÁâ¹`v#fÇD
-8Ƃev#îƂdv#f‰
-Áèf‰D
-]ÍvU‰åº °îº!°@î°î°î°ÿ°°pî°î°î°ÿî]ÐU‰åº °îº!°î°î°î°ÿ°°pî°î°î°ÿî]ÐU‰å‹Mf…ÉtWfƒùw¸Óà
-¤u#ë7fƒùw<·Éƒé¸Óà
-¥u#¢¥u#º¡î<ÿu ¤u#©uƒÈ¢¤u#º!î]ÃU‰å‹Mf…ÉtUfƒùw¸þÿÿÿÓÀ"¤u#ë5fƒùw:·Éƒé¸þÿÿÿÓÀ"¥u#¢¥u#º¡î ¤u#©t%û¢¤u#º!î]ÉöU‰å¿˜u#]ÃU‰åƒì‹Ef£˜u#˜PèWüÿÿƒÄÉÐU‰å¿˜u#]ÃU‰åƒì‹E‰Âf£˜u#ƒ=¨u#uƒì ¿ÂPèüÿÿƒÄÉÐU‰åWVì¾¹°u#ºðu#‰öµÇèô"Çèô"Fƒþ~åƒì EÈPèÅèºÇ€`&!Q#‹EÈ£„`&¶¬u#£ˆ`&ƒÄ‹EУ`&‹EÔ£”`&‹EØ£˜`&h‘ö"jè£ýÿÿƒÄh›ö"jè”ýÿÿƒÄh¥ö"jè…ýÿÿƒÄh¬ö"jèvýÿÿƒÄh³ö"jègýÿÿƒÄhºö"jèXýÿÿƒÄhÁö"jèIýÿÿƒÄh÷"jè:ýÿÿƒÄhÈö"jè+ýÿÿƒÄhÏö"j èýÿÿƒÄhÖö"j
-è -ýÿÿƒÄhÝö"j èþüÿÿƒÄhäö"j èïüÿÿƒÄhëö"j -èàüÿÿƒÄhòö"jèÑüÿÿƒÄhùö"jèÂüÿÿƒÄh÷"jè³üÿÿƒÄhÀõ"jAè¤üÿÿƒÄhÈõ"jBè•üÿÿƒÄhÐõ"jCè†üÿÿƒÄhØõ"jDèwüÿÿƒÄhàõ"jEèhüÿÿƒÄhèõ"jFèYüÿÿƒÄhðõ"jGèJüÿÿƒÄhøõ"jpè;üÿÿƒÄhö"jqè,üÿÿƒÄhö"jrèüÿÿƒÄhö"jsèüÿÿƒÄhö"jtèÿûÿÿƒÄh ö"juèðûÿÿƒÄh(ö"jvèáûÿÿƒÄh0ö"jwèÒûÿÿf -ô_&€¾ƒÄvÀÅàÛ%ƒì jh‰hØPõ·ÀPèúÿÿƒÄ Fþš~ǃì hÐèFùÿÿƒÄÛãݵTÿÿÿ›¿`&µTÿÿÿ¹üó¥ ÀƒÈ""ÀÛãèƒûÿÿèúÿÿeø^_]ÍvU‰åSƒìº!°ÿîè’ûÿÿ¹@ºC°6Êîîƒ=„`&~¹AºC°tî°‰Êî°ë»B¹C°°‰ÊÚîîºaî‹]üÉÃU‰å‹U‹E ‰•ðu#]ÉöU‰å‹U‹E ‰•°u#]ÉöU‰åƒìhQ#è
-è— ƒÄÉÉöœX‰Á5PœX9ÈtQ¸Ã¸ÜX‰Á5 PœX1ÈtQ¸øÃf1Àžf¸f»öóŸ€üu¸øÃƬu#Ûã¹âþfÇ®u#ZZÝ=®u#¹âþf¡®u#<u+Ù=®u#¹âþf¡®u#f%?fƒø?uƬu#Ƭu#Éö`¸ëp`¸ëh`¸ë``¸ëX`¸ëP`¸ëH`¸ë@`¸ë8`¸ ë0`¸
-ë(`¸ ë `¸ ë`¸ -ë`¸ë`¸ë ¨Pf¸0ŽÀŽØüX1ÛfŒÓP‹…°u#ÿÓ[° ƒûrº îº îf¡˜u#f;žu#t f£žu#ÿ-šu#©¡aϸ鋸選ëz¸ës¸ël¸ëe¸ë^¸ëW¸ ëP¸
-ëI¸ ëB¸ ë;¸ -ë4¸ë-¸ë&¸ë` ¨f¸0ŽÀŽØüèש¡aÏPf¸0ŽØŽÀXfŒÓ‹=Js#ß1ۊŠ_Áãf‹_ÜfŒÒfŒÛŽÓSRPÿ…ðu#ƒÄX[ŽÐ)ÜÏU‰åWVSƒì ‹u¸¹ ‰÷üó«è|ýÿÿ…ÀtÇëUèŠýÿÿ…Àt7ÇFǸ¢‰^‰N‰V …Àt+¸¢‰F‰^‰N‰V ëÇècýÿÿ…ÀtÇ ƒÄ [^_]ÍvU‰åWV¿0v#È·À-yƒÀÁø9ÂtU¿0v#@ÀÝ4ÅLÜ%›È·À-yƒÀÁøf£0v#¿50v#¿À`&4v4ö4õLÜ%¹üó¥Ý%À`&^_]ÉöU‰å¿0v#]ÃU‰åWVSƒì(ŠM¡4v#Áà ˜€ f¶.a&f£Šó#f¶-a&f£Œó#€ù t%€ù €ù„óé‰ö€ù
-„#é‰öfƒŠó#·Šó#;0a&Œ½fÇŠó#·Œó#¡4a&H9Â…¿¡0a&H‰Eì‰Uèf¾,a&Áâf‰Uò¡4v#Áà °€ ¿;}è:¹;Mì*_ÿv‰ø¯0a&È·F‰Ø¯0a&Èf‰FA;Mì~ÜG;}è~ƹ;MìKWÿ‰Ð¯0a&Èf‹]òf‰FA;Mì~çé)‰öfLjó#·Šó#‰Áƒø~ºƒÂ·ÂƒÀ9È|óf‰ˆó#f¡ˆó#f£Šó#éævfÇŠó#·Œó#¡4a&H9Â…¾¡0a&H‰Eà‰UÜf¾,a&Áâf‰Uæ¡4v#Áà °€ ¿;}Ü=v¹;Mà*_ÿv‰ø¯0a&È·F‰Ø¯0a&Èf‰FA;Mà~ÜG;}Ü~ƹ;MàGWÿ‰Ð¯0a&Èf‹]æf‰FA;Mà~çé%‰öfÿ -Šó#·Šó#·Œó#¯0a&ÂÆS fÿŠó#éõ‰ö·Šó#·Œó#¯0a&Ј CfÿŠó#·Šó#;0a&Ž¿fÇŠó#·Œó#¡4a&H9Â…š¡0a&H‰EԉUÐf¾,a&Áâf‰UÚ¡4v#Áà °€ ¿;}Ð=v¹;MÔ*_ÿv‰ø¯0a&È·F‰Ø¯0a&Èf‰FA;MÔ~ÜG;}Ð~ƹ;MÔ'Wÿ‰Ð¯0a&Èf‹]Úf‰FA;MÔ~çëfÿŒó#·5Šó#·=Œó#‰øf¯0a&f‰EΡ4v#Áà fEÎfuλÔ°‰Úî¹Õ‰ÊŠEÎî°‰Úîf‹EÎfÁè‰Êî‰óˆ.a&‰ø¢-a&ƒÄ([^_]ÐU‰åWVSƒì‹u‹} ‰øf¯0a&f‰Eò¡4v#Áà fEòfuò»Ô°‰Úî¹Õ‰ÊŠEòî°‰Úîf‹EòfÁè‰Êî‰ð¢.a&‰úˆ-a&ƒÄ[^_]ÍvU‰åS¹Ô°
-‰Êî»Õ‰ÚŠEî° ‰Êî‰ÚŠE î‹$ÉÍvU‰åWVSƒìf¾EÁàf‰Eò¡4v#Áà ¸€ ‹]ë0‹M ;M(sÿ‰Ø¯0a&È·G‰ð¯0a&Èf‰GA;M~ÜC;]~ʋM ;MSÿv‰Ð¯0a&Èf‹]òf‰GA;M~çƒÄ[^_]ÍvU‰åWVSƒì ¡0a&H‰Eð‹4a&K‰]ìf¾,a&Áàf‰Eê¡4v#Áà °€ ¿9ß<‰ö¹;Mð*_ÿv‰ø¯0a&È·F‰Ø¯0a&Èf‰FA;Mð~ÜG;}ì~ƹ;MðWÿ‰Ð¯0a&Èf‹]êf‰FA;Mð~çƒÄ [^_]ÍvU‰å·J‰0a&¶„@£4a&¶„ÿ ¢,a&¶P¢.a&¶Q¢-a&¶`¢ó#¶a¢Žó#Ç8v#Ç4v#]ÃU‰åWVSƒì .a&¢P -a&¢Q¶ÀP¶.a&PèŠýÿÿ¶Žó#¶5ó#ƒÄ¹Ô°
-‰Êî¿Õ‰úˆØî° ‰Êî‰ú‰ðîeô[^_]ÍvU‰åSƒì‹]€;tŠCƒì ¾ÀPèiùÿÿƒÄ€;ué‹]üÉÃU‰åVS‹E‰ÃÁã £8v#¹Ô° -‰Êî¾Õ‰òˆØî° ‰Êî‰ØfÁè‰òî[^]ÃU‰åVS‹u‹4v#Áâ» ó#¶.a&‰¹Àó#¶-a&‰
-µŠ¢.a&Š
-¢-a&‰54v#[^]ÃU‰å¡8v#]ÉöU‰å¡4v#]ÉöU‰åWVSƒì ‹}f¾u Áæf¾E Ƌ]‹E9Ã3v‹M9ù#‰Ê¯0a&¡4v#Áà ÐØf‰´€ A9ù~ÞC;]~ЃìÿuÿuèüÿÿŠE¢-a&ŠE¢.a&ƒÄeô[^_]ÍvU‰åWVSƒì ¡0a&H‰Eð‹=4a&Of¾,a&ÁãƒË ¾9Æ4¹9ù%v‰Ê¯0a&¡4v#Áà Ððf‰œ€ A9ù~ÞF;uð~̃ìjjèûÿÿÆ-a&Æ.a&ƒÄeô[^_]ÍvU‰åS‹U ‹]‹M¯0a&¡4v#Áà ÂU”€ ˆ
-ˆZ‹$ÉÉöU‰åS‹E ‹]‹M‰Â¯0a&¡4v#Áà ÂU”€ ¶B…Étˆ¶‰Â…Ûtˆ¾Â‹$ÉÐU‰åS‹E ‹MŠ]‰Â¯0a&¡4v#Áà ÂU”€ €9tŠˆABˆB€9uò‹$ÉÐU‰åƒìh<Q#èTýÿÿôƒÄÉÉöU‰åƒìjèƒÄÉÉöU‰åƒìh4èƒÄÉÍvU‰åVS‹Ef£r¹d»þ¾v‰Êì©t Fþÿÿ~í¸@=Ÿ†~ø‰ÚˆÈö@=Ÿ†~øë‰öU‰åSƒìE Pÿuhàó#èX‰ÃÇ$àó#è¢üÿÿ‰ØƒÄ‹]üÉÃU‰åWVSìð‹} ŠEˆ…ÿÿÿEPÿuÿÿÿSè‰ÆS¾…ÿÿÿPWÿuè±þÿÿ‰ðƒÄ eô[^_]ÃU‰åSƒìE Pÿuhàõ#謉ÃÇ$àõ#è&üÿÿ‰ØƒÄ‹]üÉÃU‰åS‹M‹U ‰Ë€:tvŠˆBA€:uõƉ؋$ÉÍvU‰åVS‹]‹U ‹M‰Þë‰öŠˆBC€:t‰ÈI…ÀîƉð[^]ÐU‰å‹U‹M ë -¸€:tBAŠ:t)Ð]ÃU‰åS‹U‹] ‹M…Éëv¶¶Sÿ)Ð됊C8uíŠB„ÀtIu︋$ÉÐU‰å‹U¸€:tB@€:uù]ÍvU‰åS‹E‹] €8t‰Ú€:tŠv:
-tB€:uö@€8u下$ÉÉöU‰å‹E‹U €8t ‰ö8t @€8uö¸]ÍvU‰åS‹]‰Ú€;t‰öŠ
-AŸ<wAàˆB€:uì‰Ø‹$ÉÐU‰åS‹]‰Ú€;t‰öŠ
-A¿<wA ˆB€:uì‰Ø‹$ÉÐU‰åS‹U‹M ‰Ó€;tvB€:uú늈AB€9uõƉ؋$ÉÍvU‰åWVSƒì<‹u‹]ÇEèÇEäÇEàÇEÜÇEØÇEÔÇEпÇEÌÙîÝ]À‰uì‹E €8„D‹U €:%t…ÿuŠˆB‰U FÿEèév‹E €8%u%@‰E ¿ÇEä
-ÇEàÇEØÇE̋U ¾ƒè%ƒøS‡Ñÿ$…>#‰öÆ%FÿEè鼃ÉòFŠCüˆÿEè驐ƒ}Øt"ƒ}؃}Øtëƒ}ØuƒÃ‹Cü‰EÔë -vƒÃ¿Sü‰Uԃì ÿuÌÿuäj
-VÿuÔè¾ éœƒ}Øt"ƒ}؃}Øtëƒ}ØuƒÃ‹Cü‰EÐë -vƒÃ·Sü‰UЃì ÿuÌÿuäj
-VÿuÐè.éPƒ}Øt"ƒ}؃}Øtëƒ}ØuƒÃ‹Cü‰EÐë -vƒÃ·Sü‰UЃì ÿuÌÿuäjVÿuÐèâ鐃ËCü‰EЃì jÿuäjVPèÂé䐃ËSü€:tŠˆBFÿE܀:uò‹UÜUèévƒ}Øtƒ}؃}Øtëƒ}Øu ƒÃÝCøÝ]ÀƒìÿuÌÿuàÿuäVÿuÄÿuÀèYë~vƒ}Øtƒ}؃}Øtëƒ}Øu ƒÃÝCøÝ]ÀƒìÿuÌÿuàÿuäVÿuÄÿuÀè} -ë>vƒ}Øtƒ}؃}Øtëƒ}Øu ƒÃÝCøÝ]ÀƒìÿuÌÿuàÿuäVÿuÄÿuÀèa‰EÜEèÆ¿ƒÄ é±ÇEØé¥ÇEØ陃MÌ鐍vƒMÌ鄍v¿ƒMÌëvƒÿu?ƒìEìPj
-ÿu èb
-‰EäƒÄ‹E €80u ÷EÌtƒMÌ됃MÌ‹UìJ‰U ë4vƒÿu,ƒìEìPj
-ÿu è
-‰Eà‹EìH‰E ¿ƒÄë‰ö¿ÿE ‹U €:…¼üÿÿÆ‹Eèeô[^_]ÉöU‰åƒì EPÿu ÿuè7üÿÿƒÄÉÉöU‰åWVSƒì,‹u‹} ‹]ÇEìÇEèÇEäÇEàÇEÜÇEØÇEÔÇEЉuð€?„>€?%tƒ}Ôu ŠˆGFÿEìëá€?%uGÇEÔÇEè
-ÇEàÇEоƒè%ƒøS‡çÿ$…P?#Æ%FÿEìéԃÉòFŠCüˆÿEìéÁƒ}àt&ƒ}àƒ}àt
-ë"ƒ}àt
-ëƒÃ‹CüëƒÃ‹CüëƒÃ¿Cü‰E܃ì ÿuÐÿuèj
-VÿuÜè鏐ƒ}àt&ƒ}àƒ}àt
-ë"ƒ}àt
-ëƒÃ‹CüëƒÃ‹CüëƒÃ·Cü‰E؃ì ÿuÐÿuèj
-ëBƒ}àt&ƒ}àƒ}àt
-ë"ƒ}àt
-ëƒÃ‹CüëƒÃ‹CüëƒÃ·Cü‰E؃ì ÿuÐÿuèjVÿuØè6‰EäEìÆÇEÔƒÄ éҍvƒÃ‹Sü€:tŠˆBFÿEä€:uò‹EäEì飍vÇEàé›ÇEà鏃MÐ醍vƒMÐë}‰öÇEÔƒMÐënvƒ}Ôu6ƒìEðPj
-W蓉EèƒÄ€?0u ÷EÐtƒMÐ됃MЋ}ðOë1‰öƒ}Ôu)ƒìEðPj
-WèW‹}ðOÇEÔƒÄë
-vÇEÔGé¼ýÿÿvÆ‹Eìeô[^_]ÉöU‰åƒì EPÿu ÿuèGýÿÿƒÄÉÉöU‰åWVSƒì,‹}‹uÇEèÇEäÇEàÇEÜÇEØ»‰}ì饐‹U €:%t…Ûu B‰U 鏍v‹E €8%u%@‰E »ÇEäÇEàÇEÜÇE؋U ¾ƒè*ƒøN‡Eÿ$… @#‰öƒû…8ƒìEìPj
-ÿu èN‰E܃MØ‹EìH‰E ƒÄéŠGƒÆ‹^üˆëÝØÿEèéõƒÆ‹^üëG€?tƒì ¾PèBƒÄ…ÀuçÇEÔë#‰ö÷EØuŠˆCë‹UÜ9UÔ}ŠˆCÿEÔG€?tƒì ¾PèþƒÄ…ÀtÇÆ덉öƒìhHQ#Wè&÷ÿÿ‰ÇƒÄ EìPj
-WèՉ‹}ìƒÄƒ}à…Wƒ}ät)ƒ}ä ƒ}ätéCÿÿÿƒ}ä…9ÿÿÿƒÆ‹Fü‰é,ÿÿÿƒÆ‹Füf‰éÿÿÿ‰öƒìhUQ#Wè¶öÿÿ‰ÇƒÄ EìPj
-됃ìh`Q#Wèšöÿÿ‰ÇƒÄ EìPjWè ‹}ìƒÄƒ}à…̓}ät+ƒ}ä -ƒ}äté¹þÿÿ‰öƒ}ä…­þÿÿƒÆ‹Vü‰é þÿÿƒÆ‹Vüf‰é‘þÿÿ‰öƒìhxQ#Wè*öÿÿ‰ÇƒÄEìPWè;‹}ìƒÄƒ}àu`ƒ}ät)ƒ}ä ƒ}ätéMþÿÿƒ}ä…CþÿÿƒÆ‹FüÝé8þÿÿƒÆ‹FüÙé*þÿÿvÇEäë vÇEäëvÇEàëÝؐ»ÿE ‹E €8…Pýÿÿ‹Eèeô[^_]ÐU‰åƒì EPÿu ÿuèïüÿÿƒÄÉÉöU‰åWVSƒì,‹u ÇEп‹Eƒð‰EԋU‰U̅Òy‰Ñ÷ىM̃}y ‹E…Ày÷Ø됋E÷EÔu ƒ}yƒ}yGƒ}u‹EÐÆD(Ø0@‰EÐë8v…Àt1U؉Uȉöƒì º÷ủÃRèI‹MȋUЈ
-B‰UЉ؃Ä…Àu×}ЋEԃàƒøu‰ú;}} -‰öÆ FGB;U|õƒ}y ƒ}yÆ-ë ÷EÔtÆ+F‹Eԃàƒøu‰ú;}} Æ0FGB;U|õ‹UÐJx M؊
-ˆFJy÷‹Eԃàƒøu‰ú;}} Æ FGB;U|õƉøeô[^_]ÃU‰åƒì‹Eÿuÿu÷ØPÿu ÿuèŸþÿÿƒÄ ÉÉöU‰å‹E…Ày÷Ø]ÉöU‰åSƒì‹]èÁîÿÿƒì SèñðþÿU‰åWVSƒì‹M‹} ÙîÙÀÙ軀9-u ¾ÿÿÿÿë
-‰ö¾ëA€90túŠƒè0< w(ÝàA#ëÙˍv¾ƒè0AÜËÙËPÚ$XŠƒè0< vâÝۀ9.u9AŠƒè0< w/ÝàA#ëÙÉÙʉö¾ƒè0AÜÊÙÊPÚ$ÙÉXØʊƒè0< vÝÝÚÙÉÞùÞÁVÚ $^€9et €9E…“A€9-u
-¾ÿÿÿÿAë‰ö€9+u ¾Aëv¾Šƒè0< weÝàA#¾ƒê0A·ÃÙÀPÚ $Ù}ð‹]ðÆEñ Ùmð‰]ðÛ]ìÙmð‹Eì·À‰$Û$‰$Ú$ZÙ}ð‹UðÆEñ Ùmð‰UðÛ]ìÙmð‹Eì‰ÃŠƒè0< v£Ý؅ö~!ºf…Ût4ÝàA#·Ã‰öÜÉB9Â|ùëvº·Ã‰Ã9Â}ÝàA#ÜùB9Ú|ùÝ؅ÿt‰ƒÄ[^_]ÐU‰åWVSƒì ‹]‹} ÇE쾀;-u ÇEðÿÿÿÿCë‰ö€;+u ÇEðCëÇEð€;0u>C€;0túë6ƒì ¾PCè‰ÂƒÄ9ú…Òy
-¸ëEv‰ð¯÷Ö9ð~ÇEìƒìW¾P聃ąÀu¶ƒ}t‹E‰ƒ}ìt¾ÿÿÿ¯uð‰ðeô[^_]ÉöU‰åWVSƒì ‹]‹} ÇEð¾€;0uC€;0tú€;xuKƒÿuFC€;0u@‰öC€;0túë6ƒì ¾PCè_‰ÂƒÄ9ú…Òy
-¸ëAv‰ð¯÷Ö9ðvÇEðƒìW¾PèуÄ…Àu¶ƒ}t‹E‰ƒ}ðt¾ÿÿÿ‰ðeô[^_]ÉöU‰åŠUBÐ< w ¾Âƒè0ë&vB¿<w ¾Âƒè7됍BŸ<w ¾ÂƒèW됾Â]ÍvU‰å‹Uƒú w B0¾À됍BöƒøwB7¾Àë¾Â]ÍvU‰åŠUƒê0¸€ú –À]ÉöU‰åŠUBÐ<vBŸ<w¸ë¸]ÐU‰åŠU€ú/~‹E <v#:Pÿ¸ë¸]ÐU‰åŠUBŸ<w Bà¾Àëv¾Â]ÍvU‰åŠUB¿<w B ¾Àëv¾Â]ÍvU‰åVS¾ƒì ¾]Sè%ƒÄ…Àuƒì Sè5ÿÿÿƒÄ…Àt¾‰ðeø[^]ÃU‰åŠUƒêA¸€ú9–À]ÉöU‰å¸€}/žÀ]ÍvU‰åŠUƒêa¸€ú–À]ÉöU‰åŠUB÷<v
-¸€ú u¸]ÉöU‰åŠUƒêA¸€ú–À]ÉöU‰åWVSƒì ÝEÝUè‹]‹}ÇEäSd$øÝ$èoƒÄ…Àtƒì Sè·îÿÿƒÄéPvÙîÝEèÚéßà€äE€üu Æ-C€uï€ë÷EtÆ+CÿEäÝèA#ÝEèÚéßà€äE€üuÆ0ÆC¸éû‰öÙèÝEèÝáßà€äE€üu3¾Ýéßà€äE€üuHݘQ#ÝEèØÉÝUèNÝêßà€äE€ütëÝØë)vÝØÝؾݘQ#ÝEèë ÝEèØñÝUèFÝéßàöÄtîÝ؃ì Vè÷ùÿÿƒÄƒøc~ƒïë‰öƒø ~ƒïë‰ö…ö~Oƒì‹EƒÈPÿuWSÿuìÿuèèUEäƒÄ …öu‹Eäë;‰ö]äÆeCƒì jºgfff‰ð÷êÁú‰ðÁø)ƒÂRj
-SVè\ùÿÿ‹UäD‰EäƒÄ eô[^_]ÍvU‰åWVSìŒÝEݝþÿÿ‹]Dž€þÿÿ½¸þÿÿ¹K¸üó«ƒìSÿµ”þÿÿÿµþÿÿ貃ąÀtƒì SèúìÿÿƒÄé‰öÙî݅þÿÿÚéßà€äE€üuÆ-C€µ—þÿÿ€ëv÷Et
-Æ+Cÿ…€þÿÿƒì…˜þÿÿPÿµ”þÿÿÿµþÿÿèþݝpþÿÿ‹…pþÿÿ‹•tþÿÿ‰Æ‰×DžŒþÿÿƒÄ݅˜þÿÿÙèÙÉÝáßàöÄ…ø重vh$@jÿµœþÿÿÿµ˜þÿÿè$݅˜þÿÿÜ5ðA#ݝ˜þÿÿÙ½´þÿÿ‹´þÿÿƅµþÿÿ Ù­´þÿÿ‰´þÿÿß½¨þÿÿÙ­´þÿÿ‹…¨þÿÿ‰$èûÿÿ‹•Œþÿÿˆ„*¸þÿÿB‰•ŒþÿÿƒÄ݅˜þÿÿÙèÙÉÚéßàöÄ„oÿÿÿ‹•Œþÿÿ•€þÿÿ‰ÑI…¸þÿÿ‰…|þÿÿë‰ö‹•|þÿÿŠˆCI‹•Œþÿÿƒê‰ÐÁèH!Â9Ñ}ޅÉx‹Œþÿÿƒéx
-vÆ0CIyùÆëÝØÝØÆ0Cÿ…€þÿÿÝ Q#‰µpþÿÿ‰½tþÿÿ݅pþÿÿÚéßàöÄE…\‹E@9…€þÿÿLÆ.Cÿ…€þÿÿ‹Eƒà‰…ˆþÿÿDž„þÿÿDžŒþÿÿv‰µpþÿÿ‰½tþÿÿ݅pþÿÿܨQ#Ü -ðA#ݝpþÿÿ‹µpþÿÿ‹½tþÿÿƒì…˜þÿÿPWVèݝpþÿÿ‹•pþÿÿ‹tþÿÿ‰Ö‰Ï݅˜þÿÿÙ½´þÿÿ‹´þÿÿƅµþÿÿ Ù­´þÿÿ‰´þÿÿ۝¤þÿÿÙ­´þÿÿ‹…¤þÿÿƒÄ…Àtƒ½ˆþÿÿu
-Džˆþÿÿƒì PèÓùÿÿˆCÿ…€þÿÿÿ…ŒþÿÿƒÄƒ½ˆþÿÿt‹E9…Œþÿÿ~
-Dž„þÿÿ‹•€þÿÿ9U}
-Dž„þÿÿƒ½„þÿÿ„ýþÿÿKë
-‰öÿ€þÿÿ‰Ã€;0u Cÿ€{ÿ.uêCÆ‹…€þÿÿeô[^_]ÃU‰åWVSƒì‹]‹u ‹}WVSèZƒÄ…Àtƒì Wè¢éÿÿƒÄéñ‰öÙî‰]è‰uìÝEèÝáßàÝـäE€üuÙàëvÝ؉]è‰uìÝEèÝøA#ÙÉÝáßàÝـäE€üuÝØÆ0ÆG¸雺ÙèÙÉÝáßà€äE€üu/Ýáßà€äE€üu?ݘQ#ëÙɐÜÉÙÉJÝâßà€äE€ütìÝØëvÝÙݘQ#ë‰öØñÙÉBÙÉÝáßàöÄtðÝØÝ؍BƒøvƒìÿuÿuÿuWVSèÔùÿÿë‰öƒìÿuÿuÿuWVSèXûÿÿƒÄ eô[^_]ÐU‰åƒìSÙ}ü›f‹Eüf -? f‰EøÙmø›ÝEÙüÝ]ð›‹Uð‹Mô‹]‰‰KÝEÜeðeì›ÛâÙmü›[ÉÍvU‰åƒì‹E‹U ‰Eø‰Uü‹MUøf‹BfÁè%ÿ=ÿt¸ëk÷Bÿÿuƒ:t…Étƒìh°Q#QèDçÿÿƒÄ¸ë@‰ö€zy…Étƒìh´Q#Qè çÿÿƒÄ¸ë‰ö…Étƒìh¹Q#QèçÿÿƒÄ¸ÉÃU‰åƒì¸à÷#ƒ=Hv#tÿHv#ÉÃU‰å‹E£Hv#]ÍvU‰åƒì‹E‹U ‰Eø‰UüUø¹f‹BfÁè%ÿ=ÿu÷Bÿÿuƒ}øt¹‰ÈÉÉöU‰åSƒì‹E ‹]ÆPè‰âÿÿ‰ØƒÄ‹]üÉÍvU‰åVSƒì ÝEÝUð‹]‹uVSd$øÝ$èrÝ]èƒÄƒ=Lv#ÿtWƒìVSèYÿÿÿƒÄ…ÀuFƒìÿuôÿuðèDÿÿÿƒÄ…Àu1Ùî‰]à‰uäÝEàÚéßà€äE€ô@uƒì jVSÿuôÿuðè4ƒÄ ëvÝEèeø[^]ÉöÝD$ ÝD$Ùø›ßàžzøÝÙͶ¼'U‰åVSƒì0ÝE‹]‹u‹EÝUà‰]è‰uìPÿú‡Èÿ$•B#ÝØÇEغ¾Q#ƒøc~ºÃQ#‰UÜÇEðÇEôƒ=Lv#„}ƒì EØP誃ąÀ…uƒ=Lv#…YƒìjhÉQ#éëvÝØÇEغÝQ#ƒøc~ºâQ#‰UÜÇEðÇEôƒ=Lv#„ƒì EØPè>ƒÄ…À… ƒ=Lv#…íƒìjhèQ#év‰]à‰uäÝ]èÇEغüQ#ƒøc~ºR#‰UÜÇEðÇEôƒ=Lv#„žƒì EØPè˃ąÀ…–ƒ=Lv#…zƒìjh R#é ÝØÇEغR#ƒøc~º$R#‰U܃=Lv#uÇEðàÇEôÿÿïGé¸ -¡@v#‹Dv#‰Eð‰Uôé¡ -‰öÝØÇEغ²S#ƒøc~º¸S#‰U܃=Lv#uÇEðàÇEôÿÿïGéh -¡@v#‹Dv#‰Eð‰UôéQ -‰öÝØÇEغ+R#ƒøc~º/R#‰U܃=Lv#uÇEðàÇEôÿÿïGé -¡@v#‹Dv#‰Eð‰Uôé -‰öÝØÇEغ+R#ƒøc~º/R#‰UÜÇEðÇEôéÑ ‰öÝØÇEغ·L#ƒøc~º4R#‰U܃=Lv#uÇEðàÇEôÿÿïÇë¡@v#‹Dv#ò€‰Eð‰Uôƒ=Lv#„óƒì EØPè ƒÄ…À…ëƒ=Lv#…σìjh8R#éaÝØÇEغ·L#ƒøc~º4R#‰U܃=Lv#uÇEðàÇEôÿÿïÇë¡@v#‹Dv#ò€‰Eð‰Uôƒ=Lv#„gƒì EØP蔃ąÀ…_ƒ=Lv#…Cƒìjh8R#éÕ -ÝØÇEغxL#ƒøc~ºJR#‰U܃=Lv#uÇEðàÇEôÿÿïÇë¡@v#‹Dv#ò€‰Eð‰Uôƒ=Lv#„Û -ƒì EØPèƒÄ…À…Ó -ƒ=Lv#…· -ƒìjhNR#éI -ÝØÇEغxL#ƒøc~ºJR#‰U܃=Lv#uÇEðàÇEôÿÿïÇë¡@v#‹Dv#ò€‰Eð‰Uôƒ=Lv#„O -ƒì EØPè| -ƒÄ…À…G -ƒ=Lv#…+ -ƒìjhNR#é½ ÝØÇEغ`R#ƒøc~ºcR#‰U܃=Lv#uÇEðàÇEôÿÿïÇë¡@v#‹Dv#ò€‰Eð‰Uôƒ=Lv#„à ƒì EØPèð ƒÄ…À…» ƒ=Lv#…Ÿ ƒìjhgR#é1 ÝØÇEغ`R#ƒøc~ºcR#‰U܃=Lv#uÇEðàÇEôÿÿïÇë¡@v#‹Dv#ò€‰Eð‰Uôƒ=Lv#„7 ƒì EØPèd ƒÄ…À…/ ƒ=Lv#… ƒìjhgR#é¥ ÝØÇEغyR#ƒøc~º€R#‰U܃=Lv#uÇEðàÇEôÿÿïGéP ¡@v#‹Dv#‰Eð‰Uôé9 ‰öÝØÇEغyR#ƒøc~º€R#‰U܃=Lv#uÇEðàÇEôÿÿïGë¡@v#‹Dv#‰Eð‰Uôƒ=Lv#„a ƒì EØPèŽ ƒÄ…À…Y ƒ=Lv#…= ƒìjhˆR#éÏ
-vÝØÇEغœR#ƒøc~º R#‰U܃=Lv#uÇEðàÇEôÿÿïÇë¡@v#‹Dv#ò€‰Eð‰Uôƒ=Lv#„å ƒì EØPè ƒÄ…À…Ë
-ƒ=Lv#…¯
-ƒìjh¥R#éA
-ÝØÇEغœR#ƒøc~º R#‰U܃=Lv#uÇEðàÇEôÿÿïÇë¡@v#‹Dv#ò€‰Eð‰Uôƒ=Lv#„G
-ƒì EØPèt
-ƒÄ…À…?
-ƒ=Lv#…#
-ƒìjh¶R#éµ ÝØÇEغÉR#ƒøc~ºÏR#‰U܃=Lv#uÇEðàÇEôÿÿïÇë¡@v#‹Dv#ò€‰Eð‰Uôƒ=Lv#„Íƒì EØPèè ƒÄ…À…³ ƒ=Lv#…— ƒìjhÖR#é) ÝØÇEغÉR#ƒøc~ºÏR#‰U܃=Lv#uÇEðàÇEôÿÿïÇë¡@v#‹Dv#ò€‰Eð‰Uôƒ=Lv#„/ ƒì EØPè\ ƒÄ…À…' ƒ=Lv#… ƒìjhéR#靐ÝØÇEغþR#ƒøc~ºS#‰UÜÇEðÇEôƒ=Lv#… ƒì EØPèòƒÄ…À…½ƒìjhS#jèÞõÿÿèeõÿÿÇ!ƒÄ降vÇEغþR#ƒøc~ºS#‰U܃=Lv#uvÇEðàÇEôÿÿïG‰]ЉuÔÝEÐÜ -hT#Ý]Ћ]ЋuÔÙîÙÉÚéßà€äE€ü…¯ƒìVSèjƒÄ‰]ЉuÔÝEÐÙÉÚéßà€äE€ü@„‡ÇEðàÇEôÿÿïÇét¡@v#‹Dv#‰Eð‰Uô‰]ЉuÔÝEÐÜ -hT#Ý]Ћ]ЋuÔÙîÙÉÚéßà€äE€ü…6ƒìVSèñƒÄ‰]ЉuÔÝEÐÙÉÚéßà€äE€ü@„¡@v#‹Dv#ò€‰Eð‰UôéòvÝØÇEغþR#ƒøc~ºS#‰UÜÇEðÇEôéÁ‰öÝØÇEغþR#ƒøc~ºS#‰U܃=Lv#uÇEðÇEôë¡@v#‹Dv#ò€‰Eð‰Uôƒ=Lv#„ãƒì EØPèƒÄ…À…Ûƒ=Lv#…¿ƒìjhS#éQÝØÇEغþR#ƒøc~ºS#‰U܃=Lv#uÇEðÇEôëÇEðÇEôøƒ=Lv#„`ƒì EØP荃ąÀ…Xƒ=Lv#…<ƒìj h@T#éΉöÇEغ9S#ƒøc~º>S#‰U܃=Lv#u6ÙîÙÉÚéßàöÄEuÇEðàÇEôÿÿïGém‰öÇEðàÇEôÿÿïÇéX‹ -@v#‹Dv#‰Mð‰]ôÙîÙÉÚéßàöÄE„4‰È‰Úò€‰Eð‰UôéÝØÇEغDS#ƒøc~ºIS#‰U܃=Lv#uÇEðÇEôëÇEðÇEôøƒ=Lv#„Lƒì EØPèyƒÄ…À…Dƒ=Lv#…(ƒìjhOS#麉öÇEغcS#ƒøc~ºhS#‰U܃=Lv#uÝ]ðëÝØÇEðÇEôøƒ=Lv#„Òƒì EØPèÿƒÄ…À…ʃ=Lv#…®ƒìjhnS#é@ÝØÇEغƒS#ƒøc~ºS#‰UÜÇEðÇEôøƒ=Lv#„iƒì EØP薃ąÀ…aƒ=Lv#…Eƒìjh˜S#é׍vÝØÇEغ±S#ƒøc~º·S#‰UÜÇEðÇEôøƒ=Lv#„ýƒì EØPè*ƒÄ…À…õƒ=Lv#…Ùƒìjh¾S#ékvÝØÇEغÓS#ƒøc~ºÙS#‰UÜÇEðÇEôøƒ=Lv#„‘ƒì EØP较ąÀ…‰ƒ=Lv#…mƒìjhàS#éÿvÇEغÓS#ƒøc~ºÙS#‰UÜÜ5pT#Ý]ðƒ=Lv#„,ƒì EØPèYƒÄ…À…$ƒ=Lv#…ƒìjhõS#隉öÇEغT#ƒøc~ºT#‰U܋ -@v#‹Dv#‰Mð‰]ôÙîÙÉÚéßàöÄEtC‰È‰Úò€‰Eð‰Uôë1‰öÇEغT#ƒøc~ºT#‰U܍d$øÝ$jjè›Ý]ðƒÄƒ=Lv#…jé|vÝØÇEغT#ƒøcŽ•ºT#鋍vÝØÇEغ·L#ƒøc~uº4R#ën‰öÝØÇEغ+T#ƒøc~Yº.T#ëR‰öÝØÇEغxL#ƒøc~=ºJR#ë6‰öÝØÇEغ2T#ƒøc~!º5T#ë‰öÝØÇEغ`R#ƒøc~ºcR#‰UÜÇEðÇEôƒ=Lv#„¯ƒì EØPèʃąÀ…•ƒ=Lv#…‹ƒìjÿuÜjè«îÿÿƒÄ jhT#jèšîÿÿƒÄëfÝØÇEغzR#ƒøc~ºR#‰U܃=Lv#uÇEðàÇEôÿÿïGë¡@v#‹Dv#‰Eð‰Uôƒ=Lv#tƒì EØPè2ƒÄ…À…ýè¶íÿÿÇ"éívÝØÇEغzR#ƒøc~ºR#‰U܃=Lv#uÇEðàÇEôÿÿïGë¡@v#‹Dv#‰Eð‰Uôƒ=Lv#„‰ƒì EØP趃Ä…À…ƒ=Lv#uiƒìjh‰R#jè™íÿÿƒÄëSÇEغþR#ƒøc~ºS#‰UÜÝ]ðƒ=Lv#ÿt ƒ=Lv#uÇEðÇEôð?ë$‰öƒì EØPè@ƒÄ…ÀuèÈìÿÿÇ!ëÝØÝEðeø[^]ËT$â€‹D$%ÿÿÿ ЉD$ÝD$ÉöU‰å¸]ÉöÝD$ÙüÉö¼'U‰åWVSƒì ‹E ‰EðEƒEðƒeðøƒàø‰Eì‹Eð9EìsƒìjUhxT#h‚T#è˜ ƒÄ‹Eð9Eì„Ä‹E‹…Û„·‹C;C rƒìj`hxT#hT#è` ƒÄöCtƒìjahxT#hÀT#èC ƒÄöC tƒìjbhxT#hU#è& ƒÄ‹Eì;CvL‹Eð;C sD‰Æ‹}ì;ss‹s;{ v‹{ 9÷wƒìjnhxT#h¡T#èæ ƒÄƒì‰ø)ðPVÿu蚃ċ…Û…Iÿÿÿeô[^_]ÐU‰åWVSƒì ‹u ‹E‹}‰ÂUƒÀƒàøƒâø9†ŒÇF‰F‰V ‹E‰F‰~ÇF‹MëF‰ö9óuƒìjlh0U#h;U#èX ƒÄ‹F ;Cv‹F;C sƒìjmh0U#h`U#è1 ƒÄ‰Ù‹…Ût9{±9{u‹S +S‹F +F9Âwœ‰‰1eô[^_]ÃU‰åWVSƒì ‹]‹} …ÛuƒìjLhU#h•U#èÙ
-ƒÄ…ÿuƒìjMhU#hžU#è¾
-ƒÄƒÇƒçø‹3…ö„rvƒ~uƒ~t‹F;FsƒìjUhU#hàU#è€
-ƒÄƒ~t‹F;F rƒìjUhU#h@V#è[
-ƒÄ‹F +F9FvƒìjUhU#h€V#è9
-ƒÄ‹F÷ЅE…åF‰Eð‹^…Û„ԍv÷Ãtƒìj^hU#hÀV#èø ƒÄöCtƒìj_hU#hW#èÛ ƒÄƒ;t9wƒìj`hU#h@W#è» ƒÄ;^ rƒìjahU#h¶U#èŸ ƒÄ9{rGv‹‰‹C)ø‰B‹Eð‰ë
-v‹‹Uð‰9~sƒìjwhU#hÍU#è\ ƒÄ)~‰Øë‰ö‰]ð‹…Û…/ÿÿÿ‹6…ö…‘þÿÿ¸eô[^_]ÃU‰åƒì jÿjÿuÿuÿuÿu ÿuèƒÄ ÉÐU‰åWVSƒì‹]‹EE ‰Eð…ÛuƒìjThiW#h•U#èۃă} uƒìjUhiW#hžU#较ċ;…ÿ„lƒuƒt‹G;Gsƒìj[hiW#hàU#舃ăt‹G;G rƒìj[hiW#h@V#ècƒÄ‹G +G9Gvƒìj[hiW#h€V#èAƒÄ‹G÷ЅE…á‹Uð9WƒÕ‹M9O †ÉG‰Eì‹_…Û„¸v÷ÃtƒìjkhiW#hÀV#èèƒÄöCtƒìjlhiW#hW#è˃ă;t9wƒìjmhiW#h@W#諃Ä;_ rƒìjnhiW#h¶U#菃ċU 9S‚$‰Þ;]s‹u¹;M}ºÓâ‹E1ð…ÂtÖA;M|è‰ð)ØE ;C‡è‹M 1;Eð‡æ‰ðƒàø‰Eè9Øsƒìh‘hiW#htW#èƒÄ9]èvC‹Uè)ډUä÷Âtƒìh–hiW#h W#èãƒÄ‹‹M艋C+Eä‰A‹Eä‰C‰]ì‰ðƒà‹U Tƒâø‰U ‹Mè9Qv‰ÊU ‹‰‹A+E ‰B‹Eì‰ë
-‹Uè‹‹M쉋E 9Gsƒìh´hiW#hÍU#èkƒÄ‹U )W‰ðë‰ö‰]ì‹…Û…Kþÿÿ‹?…ÿ…•ýÿÿ¸eô[^_]ÃU‰åƒì jÿjjj ÿu hÿuèýÿÿƒÄ ÉÐU‰åWVSƒì‹]ShÒW#èeÌÿÿ‹3ƒÄ…ö„ƒìÿvÿvÿv‹F +FPÿv ÿvh`X#è5ÌÿÿƒÄ ƒ~uƒ~t‹F;FsƒìjahäW#hàU#袃ă~t‹F;F rƒìjahäW#h@V#è}ƒÄ‹F +F9FvƒìjahäW#h€V#è[ƒÄ¿‹^…Û„¾ƒì ÿ3ÿs‰ØCPSh X#è—ËÿÿƒÄ ÷ÃtƒìjihäW#hÀV#èƒÄöCtƒìjjhäW#hàX#èóƒÄƒ{wƒìjkhäW#hëW#èփă;t9wƒìjlhäW#h@W#趃Ä;^ rƒìjmhäW#h¶U#蚃Ä{‹…Û…BÿÿÿƒìWhX#èäÊÿÿƒÄ9~tƒìjshäW#hX#è`ƒÄ‹6…ö…cþÿÿƒì h2X#è®ÊÿÿƒÄeô[^_]ÍvU‰åWVSƒì ‹u‹] ‰ßƒçø…öuƒìjNh{T#h•U#è ƒÄ…ÛuƒìjOh{T#hY#èñƒÄƒ}uƒìjPh{T#hžU#èԃĉ؃à‹UTƒâø‰U‹ëv‹…ÛuƒìjXh{T#hY#螃ă{uƒ{t‹C;CsƒìjYh{T#hàU#èsƒÄƒ{t‹C;C rƒìjYh{T#h@V#èNƒÄ‹C +C9CvƒìjYh{T#h€V#è,ƒÄ;{‚hÿÿÿ;{ ƒ_ÿÿÿ‹EC‹C +C9Cvƒìjbh{T#h€V#èòƒÄÇEð‹sëv‰uð‹6…öt9þróƒ}ðtm‹Eð@9ørc9øtƒìjnh{T#h@Y#諃ąöt8‹U:9ðr.9ðtƒìjuh{T#h€Y#肃ċEF‹UðB‹‰ëE‹E‹UðBë9ƒ}ðt
-‹Eð‰8ëv‰{…öt‹U:9ðr‰ÐF‰G‹‰ë ‹E‰G‰7eô[^_]ÃU‰åƒì hÿu ÿuèÒýÿÿƒÄÉÐU‰å‹EÇ]ÉöU‰åWVSƒì ÇEèÇEìÇEð‹E‹0…ö„Zƒ~uƒ~t‹F;Fsƒìj]h¦Y#hàU#蠃ă~t‹F;F rƒìj]h¦Y#h@V#è{ƒÄ‹F +F9Fvƒìj]h¦Y#h€V#èYƒÄÿEð¿‹^…Û„¨v÷Ãtƒìjdh¦Y#hÀV#è$ƒÄöCtƒìjeh¦Y#hàX#èƒÄƒ{wƒìjfh¦Y#hëW#èêƒÄƒ;t9wƒìjgh¦Y#h@W#èʃÄ;^ rƒìjhh¦Y#h¶U#讃ÄÿEì{‹…Û…[ÿÿÿ9~tƒìjnh¦Y#hX#肃Ä‹FEè‹6…ö…§þÿÿƒì ÿuìÿuðÿuèÿuhÀY#è¾ÆÿÿƒÄ eô[^_]ÍvU‰åVS‹u‹] EƒìPÿuhø#è…ÈÿÿƒÄhø#ÿ5 $jSVh@Z#è5ƒÄ eø[^]ÍvU‰åƒìÿ5Œ$jÿuÿu ÿuhZ#èƒÄ ÉÉöU‰åƒì E Pÿuhü#èÈÿÿƒÄ jjh¸<#è<ÿÿƒÄhü#h£Z#èŠÅÿÿÇ$Mè–ÿÿƒÄÉÐU‰åƒìhü#h€Z#ècÅÿÿƒÄÉÉöU‰å·Eƒøt ƒø…Àtë-ƒøtƒøtë ¸ÁZ#됸ÆZ#됸ÊZ#됸ÐZ#됸‘K#]ÐU‰åWVSƒìœúX‰Â‰Uä÷Et$ƒìEèPjè8›ÿÿƒÄ ÿuìÿuèhàZ#èQÅÿÿƒÄ÷EtN¾;5$sA¿À$vƒì µ‹;¶BP·BPRVh [#è -ÅÿÿƒÄ‹;VÿP ƒÄF;5$rÇ÷Etƒì hûZ#èáÄÿÿè”ÿÿƒÄ‹Uä‰ÐPeô[^_]Éöh#0#0#0#0#0#œ#0#¨#´#0#À#À#À#À#À#À#À#À#À#À#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#t#ˆ#ô#´#4##ˆ#0#0#„#0##0#l#0#0#Œ#0#Ô#0#0# # #ô
-#ô
-#ô
-#ô
-#ô
-#l
-#ô
-#x
-#€
-#ô
-#
-#
-#
-#
-#
-#
-#
-#
-#
-#
-#ô
-#ô
-#ô
-#ô
-#ô
-#ô
-#ô
-#ô
-#ô
-#ô
-#ô
-#ô
-#ô
-#ô
-#ô
-#ô
-#ô
-#ô
-#ô
-#ô
-#ô
-#ô
-#ô
-#ô
-#ô
-#ô
-#ô
-#ô
-#ô
-#ô
-#ô
-#ô
-#ô
-#ô
-#ô
-#ô
-#ô
-#ô
-#ô
-#ô
-#ô
-# #4 #ô
-#ô
-#ô
-#`
-#4 #ô
-#ô
-#T
-#ô
-#`
-#ô
-#ô
-#ô
-#ô
-#,
-#ô
-#„ #ô
-#ô
-#È ## # # # # #Ð #Ð #Ð #Ð #Ð #Ð #Ð #Ð #Ð #Ð # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #„ #€ -#€ -#€ -#ô -#„ # # #è -# #ô -# # # # # # #ô # # # -#$@$@d#Ð#<#¬#ü#L#œ#Ì#X #ä #p!#ü!#ˆ"###d##ì##x$#%#%#&#&#¬'#Ü'#h(#ì(#|)#*#x*#ä*#P+#¼+# ,#l,#°,#Ô,#ð,# -#(-#D-#Ä-#<.#Ä.#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#$/#d#Ð#<#¬#ü#L#œ#Ì#X #ä #p!#ü!#ˆ"###d##ì##x$#%#%#&#&#¬'#Ü'#h(#ì(#|)#*#x*#ä*#P+#¼+# ,#l,#°,#Ô,#ð,# -#(-#D-#Ä-#<.#Ä.#T1: started, sending a message
-T2: value = %d, receiving a message
-T2: received message: length=%ld, prio=%d, text=°%s°, notify...
-T2: mq_notify returns errno %d
-T2: 1 sec. reached, sending another message and creating T3 and T4,
-T3: received message: length=%ld, prio=%d, text=°%s°
-T3: 2 sec. reached, sending 5 messages
-T3: mq_send1 returns errno %d
-T3: mq_send2 returns errno %d
-T3: mq_send3 returns errno %d
-T3: mq_send4 returns errno %d
-T3: mq_send5 returns errno %d
-T4: AAAARRRRGGGHHH!!! killed by someone...
-T4: received message: length=%ld, prio=%d, text=°%s°
-Signal %d code=%s value=%d task=%d time=%ldusec
-main: mq_open returns errno %d
-main: mq_notify returns errno %d
-main: created mq, creating T1...
-main: waiting t= 3.5 sec., then kill T4...
-Donald DuckT1: mq_send returns errno %d
-T1: ending...
-T2: waiting t = 1 sec.
-Mickey MouseT2: mq_send returns errno %d
-T2: ending...
-T3: waiting a message...
-T3: waiting t = 1.5 sec.
-GoofyÛMinniePlutoRocker DuckOncle ScroodgeT3: ending...
-T4: waiting t = 2.2 sec.
-TimerOthermqmain: ending...
-Error during Keyboard Initialization!!!Ctrl-C pressed!
-KeybPortKeyTasktask_create
-scheduletime %lus %luns * caplasttime %lus %luns * exec=%d TIME = %lu
-The system tick must be less than 55 mSec!Abort detected
-Code : %u
-Too many scheduling levels!!!
-Too many resource levels!!!
-debug info noticewarn err crit alert emerg <%i>[%s] %sPosix task
-Signal number %d...
-with value : %d
-POSIX_ReadyPOSIX_DelayPOSIX_UnknownSlice: %d
-MainPOSIX_register_level
- alloco descrittore %d %d
- lev=%d
-POSIX schedulerPid: %d Name: %20s Prio: %3ld Status: %s
-
-Panic!!! can't create main task...
-dummy PID: %d
-Dummy1Dummy2Dummy3Dummy4Dummy5Dummy6Dummy7Dummy8Dummy9Dummy0DummyaDummybDummycDummydDummyeDummyfDummygDummyhDummyDummy (RR) Posto dummy_create
-
-Panic!!! can't create dummy task...
-Entro in dummy_register_level
-Port des :
-Free port des : %d
-%d %s vt: %d pn: %d
-%d pd: %d vt: %d pn: %d Resources owned by the tasks:
-%-4dPI_register_module
-PI module
-PC priority of the tasks:
-%-4ldPC_register_module
-PC moduleTR %x
-SS:SP %x:%lx
-Stack0 : %x:%lx
-Stack1 : %x:%lx
-Stack2 : %x:%lx
-CS : %x DS : %x
-Descriptor [%x] InfoNo more Descriptors...
-%x (Hex)Base : %lx Lim : %lx Acc : %x Gran %x
-2Coprocessor error#Page fault*General protection fault*Stack exception*Segment not present*Unvalid TSS#INTEL reserved*Double defect1FPU context switch*Unvalid opcode#BOUND limit exceeded#Overflow detected on INTO#Breakpoint trap#NMI detected#Debug fault#Division by 0Exception %d occurred
-ABORT %d !!!LL Time Panic!!!
-time.cError! File:%s Line:%d %sOne-shot timer selected...
-Periodic timer selected...
-Unhandled Exc or Int occured!!!
-32/LINUX CrossCompiled/ELFHalt called1234567890-+12345678901234567890xabcdefABCDEF1234567890.e+-0123456789ABCDEF$@ -Æ@,ú1°<NaN+Inf-Infacosacosfacos: DOMAIN error
-asinasinfasin: DOMAIN error
-atan2atan2fatan2: DOMAIN error
-hypothypotfexpexpfy0fy0: DOMAIN error
-y1fy1: DOMAIN error
-ynynfyn: DOMAIN error
-lgammalgammaflgamma: SING error
-loglogflog: SING error
-log: DOMAIN error
-log10log10flog10: SING error
-log10: DOMAIN error
-powpowfpow(0,0): DOMAIN error
-pow(0,neg): DOMAIN error
-sinhsinhfsqrtsqrtfsqrt: DOMAIN error
-fmodfmodffmod: DOMAIN error
-remainderremainderfremainder: DOMAIN error
-acoshacoshfacosh: DOMAIN error
-atanhatanhfatanh: DOMAIN error
-atanh: SING error
-scalbscalbfj0j0f: TLOSS error
-j1j1fjnjnfneg**non-integral: DOMAIN error
-à?addfree.cmax >= minreg->min < reg->maxnew_max > new_min(reg->min & (sizeof(struct lmm_node) - 1)) == 0(reg->max & (sizeof(struct lmm_node) - 1)) == 0addregio.cr != reg(reg->max <= r->min) || (reg->min >= r->max)alloc.clmm != 0size > 0reg->free >= 0(DWORD)node < reg->maxreg->free >= size(reg->nodes == 0 && reg->free == 0) || (DWORD)reg->nodes >= reg->minreg->nodes == 0 || (DWORD)reg->nodes < reg->maxreg->free <= reg->max - reg->min((DWORD)node & (sizeof(struct lmm_node) - 1)) == 0((DWORD)node->size & (sizeof(struct lmm_node) - 1)) == 0(node->next == 0) || (node->next > node)alloc_ge.canode >= node(split_size & (sizeof(struct lmm_node) - 1)) == 0lmm_dump(lmm=%p)
-dump.cnode->size >= sizeof(*node) free_check=%08lx
-reg->free == free_checklmm_dump done
- region %08lx-%08lx size=%08lx flags=%08lx pri=%d free=%08lx
- node %p-%08lx size=%08lx next=%p
-(node->size & (sizeof(struct lmm_node) - 1)) == 0block != 0reg != 0(DWORD)prevnode + prevnode->size == (DWORD)node(DWORD)node + size == (DWORD)nextnodestats.cLMM=%p: %u bytes in %u regions, %d nodes
-assertion %s failed in %s at line %i (task:%i_%i)
-MAGIC assertion failed in %s at line %i (task:%i_%i): %s
-KERNEL PANIC (sys_panic_stub): %s
-KERNEL PANIC (sys_panic): %s
-FreeExeSleepWaiting on joinTime (EXACT) : %lus %luns
-< Memory Dump >
-< Level %d : %s Code: %d Version: %d >
-8Œÿÿ’ÏÿÿšÏÿHk#ÿ`v#ÿÿÿÿÿÿÿÿÿÿÿÿ1234567890!@#$%^&*()-_=+[{]};:'"`~/?,<.>\|   - -1234567890.+*/-+*-aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ 1234567890!"œ$%&/()='?^Š‚+*•‡…ø\|<_,:.;—õ   - -1234567890.+*/-+*-aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ[]@#hs#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ-K#&K#K#K#K#
-K#K#üJ#¨•"°•"°•"SP#FP#8P#'P# P#öO#æO#ÒO#ÃO#³O#¦O#‘O#€O#fO#ZO#³O#GO#þþAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAš‡Q#ðÿÿÿÿGCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)01.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.01.symtab.strtab.shstrtab.text.rodata.data.sbss.bss.comment.note"€ä=!>#€>H )Hk#È[ /Pv#àf5`v#àfØê :àf‚Cbx|Þ~I
\ No newline at end of file
/demos/branches/pj/pse51/ptest6
Property changes:
Deleted: svn:executable
## -1 +0,0 ##
-*
\ No newline at end of property
Index: demos/branches/pj/pse51/ptest5.c
===================================================================
--- demos/branches/pj/pse51/ptest5.c (revision 1085)
+++ demos/branches/pj/pse51/ptest5.c (nonexistent)
@@ -1,109 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: ptest5.c,v 1.1.1.1 2002-09-02 09:37:47 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:47 $
- ------------
-
- Posix test 5:
- an alarm test
-
- non standard function used:
- cprintf
- sys_gettime
- keyboard stuffs
- sys_end
-
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include <sys/types.h>
-#include <pthread.h>
-#include <signal.h>
-#include <unistd.h>
-
-#include <kernel/kern.h>
-#include <drivers/keyb.h>
-
-
-
-void signal_handler(int signo, siginfo_t *info, void *extra)
-{
- cprintf("SIGNAL HANDLER: pid=%d\n",exec_shadow);
-}
-
-void fine(KEY_EVT *e)
-{
- sys_end();
-}
-
-
-int main(int argc, char **argv)
-{
- struct sigaction sig_act;
-
- KEY_EVT emerg;
- //keyb_set_map(itaMap);
- emerg.ascii = 'x';
- emerg.scan = KEY_X;
- emerg.flag = ALTL_BIT;
- keyb_hook(emerg,fine);
-
- sig_act.sa_sigaction = (void *) signal_handler;
- sig_act.sa_flags = SA_SIGINFO;
- sigemptyset(&sig_act.sa_mask);
-
- sigaction(SIGALRM, &sig_act, NULL);
-
- cprintf("main: alarm(5), waiting t=2 sec\n");
- alarm(5);
-
- while (sys_gettime(NULL) < 2000000);
-
- cprintf("main: alarm(3) return %d, waiting t=6 sec\n",alarm(3));
-
- pause();
-// while (sys_gettime(NULL) < 6000000);
-
- cprintf("main: ending...\n");
-
- return 0;
-}
Index: demos/branches/pj/pse51/ptest6.c
===================================================================
--- demos/branches/pj/pse51/ptest6.c (revision 1085)
+++ demos/branches/pj/pse51/ptest6.c (nonexistent)
@@ -1,300 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: ptest6.c,v 1.1.1.1 2002-09-02 09:37:47 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:47 $
- ------------
-
- Posix test 6:
-
- message queues
-
- main thread:
- set a sigevent to sigev_thread on a mailbox (that creates thread 2)
- creates thread 1
- waits t=3.5 sec.
- pthread_cancel(T4)
-
- thread 1:
- send a msg to the mailbox (the event fires and thread 2 is created)
-
- thread 2:
- receive the msg sent by thread 1
- set the event to a signal
- creates thread 3 and 4
- waits t = 1 sec
- send another msg
-
- thread 3:
- receive the msg sent by 2 (it blocks!)
- waits t = 2 sec
- send 5 msgs (with different priorities!!!
-
- thread 4:
- receives 5 msgs every 0.5 sec.
- then receive another message that never will arrive...
-
- non standard function used:
- cprintf
- sys_gettime
- keyboard stuffs
- sys_end
-
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include <sys/types.h>
-#include <pthread.h>
-#include <mqueue.h>
-
-#include <kernel/kern.h>
-#include <drivers/keyb.h>
-
-struct sigevent ev25, evtask;
-pthread_attr_t task_attr;
-struct sched_param task_param;
-mqd_t mq;
-pthread_t T1,T2,T3,T4,T5;
-
-#define MESSAGE_LENGTH 100
-
-void *t1(void *arg)
-{
- cprintf("T1: started, sending a message\n");
- if (mq_send(mq,"Donald Duck",12,1))
- { cprintf("T1: mq_send returns errno %d\n",errno); return 0; }
-
- cprintf("T1: ending...\n");
- return 0;
-}
-
-void *t4(void *arg);
-void *t3(void *arg);
-
-void t2(union sigval value)
-{
- ssize_t x;
- char buf[MESSAGE_LENGTH];
- int prio;
-
- cprintf("T2: value = %d, receiving a message\n", value.sival_int);
-
- x = mq_receive(mq,buf,MESSAGE_LENGTH,&prio);
-
- cprintf("T2: received message: length=%ld, prio=%d, text=°%s°, notify...\n",
- x,prio,buf);
-
- if (mq_notify(mq, &ev25))
- { cprintf("T2: mq_notify returns errno %d\n",errno); sys_end(); }
-
- cprintf("T2: waiting t = 1 sec.\n");
- while (sys_gettime(NULL)<1000000);
- cprintf("T2: 1 sec. reached, sending another message and creating T3 and T4, \n");
-
- if (mq_send(mq,"Mickey Mouse",13,1))
- { cprintf("T2: mq_send returns errno %d\n",errno); sys_end(); }
-
- pthread_create(&T3, NULL, t3, NULL);
- pthread_create(&T4, NULL, t4, NULL);
-
- cprintf("T2: ending...\n");
-}
-
-void *t3(void *arg)
-{
- ssize_t x;
- char buf[MESSAGE_LENGTH];
- int prio;
-
- cprintf("T3: waiting a message...\n");
-
- x = mq_receive(mq,buf,MESSAGE_LENGTH,&prio);
-
- // mickey mouse
- cprintf("T3: received message: length=%ld, prio=%d, text=°%s°\n",
- x,prio,buf);
-
- cprintf("T3: waiting t = 1.5 sec.\n");
- while (sys_gettime(NULL)<1500000);
- cprintf("T3: 2 sec. reached, sending 5 messages\n");
-
- if (mq_send(mq,"Goofy",6,1))
- { cprintf("T3: mq_send1 returns errno %d\n",errno); sys_end(); }
- cprintf("Û");
-
- if (mq_send(mq,"Minnie",7,1))
- { cprintf("T3: mq_send2 returns errno %d\n",errno); sys_end(); }
- cprintf("Û");
-
- if (mq_send(mq,"Pluto",6,2)) // NB: different priority!!!
- { cprintf("T3: mq_send3 returns errno %d\n",errno); sys_end(); }
- cprintf("Û");
-
- if (mq_send(mq,"Rocker Duck",12,2)) // NB: different priority!!!
- { cprintf("T3: mq_send4 returns errno %d\n",errno); sys_end(); }
- cprintf("Û");
-
- if (mq_send(mq,"Oncle Scroodge",15,2)) // NB: different priority!!!
- { cprintf("T3: mq_send5 returns errno %d\n",errno); sys_end(); }
- cprintf("Û");
-
- cprintf("T3: ending...\n");
-
- return 0;
-}
-
-void t4exit(void *arg)
-{
- cprintf("T4: AAAARRRRGGGHHH!!! killed by someone...\n");
-}
-
-void *t4(void *arg)
-{
- ssize_t x;
- char buf[MESSAGE_LENGTH];
- int prio;
-
- cprintf("T4: waiting t = 2.2 sec.\n");
-
- while (sys_gettime(NULL)<2200000);
- x = mq_receive(mq,buf,MESSAGE_LENGTH,&prio);
- cprintf("T4: received message: length=%ld, prio=%d, text=°%s°\n",x,prio,buf);
-
- while (sys_gettime(NULL)<2400000);
- x = mq_receive(mq,buf,MESSAGE_LENGTH,&prio);
- cprintf("T4: received message: length=%ld, prio=%d, text=°%s°\n",x,prio,buf);
- while (sys_gettime(NULL)<2600000);
-
- x = mq_receive(mq,buf,MESSAGE_LENGTH,&prio);
- cprintf("T4: received message: length=%ld, prio=%d, text=°%s°\n",x,prio,buf);
- while (sys_gettime(NULL)<2800000);
-
- x = mq_receive(mq,buf,MESSAGE_LENGTH,&prio);
- cprintf("T4: received message: length=%ld, prio=%d, text=°%s°\n",x,prio,buf);
- while (sys_gettime(NULL)<3000000);
-
- x = mq_receive(mq,buf,MESSAGE_LENGTH,&prio);
- cprintf("T4: received message: length=%ld, prio=%d, text=°%s°\n",x,prio,buf);
-
- pthread_cleanup_push(t4exit,NULL);
- x = mq_receive(mq,buf,MESSAGE_LENGTH,&prio);
- cprintf("T4: received message: length=%ld, prio=%d, text=°%s°\n",x,prio,buf);
- pthread_cleanup_pop(0);
-
- return 0;
-}
-
-void signal_handler(int signo, siginfo_t *info, void *extra)
-{
- cprintf("Signal %d code=%s value=%d task=%d time=%ldusec\n",
- info->si_signo,
- (info->si_code == SI_TIMER) ? "Timer" : "Other",
- info->si_value.sival_int,
- info->si_task,
- sys_gettime(NULL));
-}
-
-void fine(KEY_EVT *e)
-{
- sys_end();
-}
-
-int main(int argc, char **argv)
-{
-// int err;
- struct sigaction sig_act;
- struct mq_attr attr;
-
- KEY_EVT emerg;
- //keyb_set_map(itaMap);
- emerg.ascii = 'x';
- emerg.scan = KEY_X;
- emerg.flag = ALTL_BIT;
- keyb_hook(emerg,fine);
-
- sig_act.sa_sigaction = (void *) signal_handler;
- sig_act.sa_flags = SA_SIGINFO;
- sigemptyset(&sig_act.sa_mask);
- sigaction(25, &sig_act, NULL);
-
- // set ev25, evtask
- ev25.sigev_notify = SIGEV_SIGNAL;
- ev25.sigev_signo = 25;
- ev25.sigev_value.sival_int = 555;
-
- evtask.sigev_notify = SIGEV_THREAD;
- evtask.sigev_value.sival_int = 777;
- evtask.sigev_notify_function = t2;
- evtask.sigev_notify_attributes = &task_attr;
-
- // set pthread attributes
- pthread_attr_init(&task_attr);
- pthread_attr_setdetachstate(&task_attr, PTHREAD_CREATE_DETACHED);
- pthread_attr_setschedpolicy(&task_attr, SCHED_FIFO);
- task_param.sched_priority = 10;
- pthread_attr_setschedparam(&task_attr, &task_param);
-
- // set mqueue attributes
- attr.mq_flags = 0;
- attr.mq_maxmsg = 3;
- attr.mq_msgsize = MESSAGE_LENGTH;
-
- // create the message queue
- if ((mq = mq_open("mq", O_CREAT|O_RDWR, 0, &attr)) == -1)
- { cprintf("main: mq_open returns errno %d\n",errno); return 0; }
-
- if (mq_notify(mq, &evtask))
- { cprintf("main: mq_notify returns errno %d\n",errno); return 0; }
-
- cprintf("main: created mq, creating T1...\n");
-
- pthread_create(&T1, NULL, t1, NULL);
-
- cprintf("main: waiting t= 3.5 sec., then kill T4...\n");
-
- while (sys_gettime(NULL)<3500000);
-
- pthread_cancel(T4);
-
- cprintf("main: ending...\n");
-
- return 0;
-}
Index: demos/branches/pj/pse51/makefile
===================================================================
--- demos/branches/pj/pse51/makefile (revision 1085)
+++ demos/branches/pj/pse51/makefile (nonexistent)
@@ -1,25 +0,0 @@
-#
-#
-#
-
-ifndef BASE
-BASE=../..
-endif
-include $(BASE)/config/config.mk
-
-PROGS+= ptest1 ptest2 ptest3 ptest4 ptest5 ptest6
-
-include $(BASE)/config/example.mk
-
-ptest1:
- make -f $(SUBMAKE) APP=ptest1 INIT= OTHEROBJS="pinit.o"
-ptest2:
- make -f $(SUBMAKE) APP=ptest2 INIT= OTHEROBJS="pinit.o"
-ptest3:
- make -f $(SUBMAKE) APP=ptest3 INIT= OTHEROBJS="pinit.o"
-ptest4:
- make -f $(SUBMAKE) APP=ptest4 INIT= OTHEROBJS="pinit.o"
-ptest5:
- make -f $(SUBMAKE) APP=ptest5 INIT= OTHEROBJS="pinit.o"
-ptest6:
- make -f $(SUBMAKE) APP=ptest6 INIT= OTHEROBJS="pinit.o"
Index: demos/branches/pj/pse51/ptest1
===================================================================
--- demos/branches/pj/pse51/ptest1 (revision 1085)
+++ demos/branches/pj/pse51/ptest1 (nonexistent)
@@ -1,426 +0,0 @@
-ELF"4€g4 ( €""èCèC hDèS#èS# Pî 덶°­üORäe‹Ká€uU¿€ Ç–eÆG1GeÆGGeÆG2GeÆG¸,è"fe£T#Áèfe£T#è[#¿€ Ç’eÆG0GeÆGf¸0ŽØŽÀŽÐŽàŽè¼‡#Çм%g#ÇÔ¼%‡#£ô[#‰ø[#è[#êµ"8î[#üè:Ôê U‰å‹Eê ‰öU‰åƒì@ÆEéxÆEê-ÆEèhˆ"ƒì‹Eèf‰$ÆD$-èÁEä‰$èZmEäƒÄ jPjèÞUÇ$p1#èžçjh´"jEàPèOƒÄ …Àtƒì hƒ1#èxçƒÄƒì h–1#èhçjh"jEÜPèÊNƒÄ …Àtƒì h©1#èBçƒÄƒì h¼1#è2çjhd"jEØPè”NƒÄ …Àtƒì hÏ1#è çƒÄƒì hâ1#èüæjhè"jEÔPè^NƒÄ …Àtƒì hõ1#èÖæƒÄƒì h2#èÆæƒÄvƒì jè’=ƒÄ=? -vìƒì h1#èŸæƒÄjjèWXƒÄƒì jèb=ƒÄ=vìƒì h@1#èoæƒÄjh,jjèÀZƒÄƒì jè*=ƒÄ=ÿ4 vìƒì h2#è7æƒÄÿuÔèTOÇ$/2#è 渃ÄÉÉöU‰åƒìhà.#èæEü‰$è…kƒÄjEüPèŸkƒÄEøPEüPèClƒÄ ÿuøPh/#èÊ布ÄÉÃU‰åƒì4h@/#è°åEä‰$è1kƒÄjEäPèKkƒÄEèPEäPè7lƒÄÿuðÿuìÿuèPh€/#èpå¸ƒÄ ÉÉöU‰åƒì4hÀ/#èTåEä‰$èÕjƒÄjEäPèïjÇE؍EØÇ@£áƒÄ PEèPEäPèákƒÄÿuðÿuìÿuèPh0#èå¸ƒÄ ÉÃU‰åƒìh@0#èèäƒÄÉÍvU‰åVSƒì<h€0#èÎäEԉ$èOjƒÄjEÔPèijÇEÈ
-uÈÇFÇEØÐ"ÇEÜÇ$èª=‰Ã‹‰EàE؉ƒÄ VEèPEÔPè5k‹Uà‰ƒÄÿuðÿuìÿuèPhÀ0#èQä¸ƒÄ eø[^]ÉöU‰åƒìèÁ:ÉÍvU‰åƒìj ÿujh'èMè‰è‡¬è¶²è1™ƒÄ jjjèÿLèîv¸èƒÄÉÃU‰åWVSƒìX‹]}¨¾ü[#ü¹ó¥E¸‰E¨fÇE¸ÇE¼ÇEÀfÇEÄÇEÐÇEÔÇEÜÇEà‰]ÈÇEØÇEÌjè8L‰EÐÇEÜÇEàƒMÌ
-è֜E¨‰$ècƒÄ…Àyƒì h@2#è»ãƒÄƒì SèoE¸ƒÄeô[^_]ÍvU‰åƒìŠU€= ]#„¶€ú*t€úªt
-€ú6t€ú¶uÆ ]#¸é›„Òy,Æ ]#€ú¸uÆ]#Æ]#ëՀúuÐÆ]#ëljöÆ ]#€ú8u€ -]#Æ]#멀úu € -]#뛉ö€ú5uf¾µ‡#·Àé)v€ú…•f¾œ‡#·Àé -v€úàuÆ ]#éTÿÿÿv€ú*t€ú6u2Æ -]#€ú*u€ -]#é/ÿÿÿ‰ö€ú6…$ÿÿÿ€ -]# éÿÿÿv€úªt€ú¶u"Æ -]#€úªt €ú¶…öþÿÿÆ]#éêþÿÿ€úFu€=]#•]#ë.v€ú:u€=]#•]#ëv€úEu;€=]#•]#ƒì¶]#P¶]#P¶]#Pèõ¸ƒÄé€úu€ -]#éhþÿÿv€ú8u€ -]#éTþÿÿv€út€ú¸uÆ]#é;þÿÿ‰ö¸„҈рúRt2€úOt-€úSt(€úPt#€úQt€úKt€úLt€úMt€úGt
-€úHt€úIu€=]#uT€= -]#uK·Â -ÿë~€=]#t/Bð< vBâ<vBÔ<w€= -]#t¶Âf¾€€‡#·ÀëG€= -]#t¶Âf¾€ ˆ#·Àë-v€=]#t¶Âf¾€Àˆ#·Àëv¶Âf¾€€‡#·ÀÉÃU‰åWVSƒì,}؃ìjE×PèòƒÄ…À„¡ƒì ¶E×Pèöüÿÿ‰ÂƒÄf…Ò„†÷Âÿt  ]#ƒÈ@ë‰ö ]#ˆE؈UيE׈EÚ±»;x‡#}8¾‡#v݊D2:EÚuŠ2:EØuƒì Wÿ’‡#±ƒÄC;x‡#|ЄÉuƒìjW¿B‰#Pèý¡ƒÄè-é<ÿÿÿU‰å‹E£]#Šˆ‚‡#ŠPˆƒ‡#ŠPˆ„‡#ŠPˆ…‡#ŠPˆ†‡#ŠPˆ‡‡#ŠPˆˆ‡#ŠPˆ‰‡#ŠPˆŠ‡#ŠP ˆ‹‡#ŠP
-ˆ"ˆ#ŠP ˆ#ˆ#ŠP ˆ$ˆ#ŠP -ˆ%ˆ#ŠPˆ&ˆ#ŠPˆ'ˆ#ŠPˆ(ˆ#ŠPˆ)ˆ#ŠPˆ*ˆ#ŠPˆ+ˆ#ŠPˆŒ‡#ŠPˆ,ˆ#ŠPˆ‡#ŠPˆ-ˆ#ŠPˆš‡#ŠPˆ:ˆ#ŠPˆ›‡#ŠPˆ;ˆ#ŠPˆ§‡#ŠPˆGˆ#ŠPˆ¨‡#ŠPˆHˆ#ŠP ˆ©‡#ŠP!ˆIˆ#ŠP"ˆµ‡#ŠP#ˆUˆ#ŠP$ˆ³‡#ŠP%ˆSˆ#ŠP&ˆ´‡#ŠP'ˆTˆ#ŠP(ˆ«‡#ŠP)ˆKˆ#ŠP*ˆ¹‡#ŠP+ˆYˆ#ŠP,ˆŽ‡#ŠP-ˆ.ˆ#ŠP.ˆ‡#ŠÖˆ/ˆ#ŠP0ˆ‡#ŠP1ˆ!ˆ#ŠP2ˆœ‡#ŠP3ˆ<ˆ#ŠP4ˆ„ˆ#ŠP5ˆoˆ#ŠP6ˆpˆ#ŠP7ˆqˆ#ŠP8ˆkˆ#ŠP9ˆlˆ#ŠP:ˆmˆ#ŠP;ˆgˆ#ŠP<ˆhˆ#ŠP=ˆiˆ#ŠP>ˆrˆ#ŠP?ˆsˆ#ŠP@ˆ·#ŠPAˆ·‡#ŠPBˆµ‡#ŠPCˆʇ#ŠPDˆnˆ#ŠPEˆWˆ#ŠPFˆjˆ#ŠPGˆž‡#ŠPHˆ>ˆ#ŠPIˆ°‡#ŠPJˆPˆ#ŠPKˆ®‡#ŠPLˆNˆ#ŠPMˆ ‡#ŠPNˆ@ˆ#ŠPOˆ’‡#ŠPPˆ2ˆ#ŠPQˆ¡‡#ŠPRˆAˆ#ŠPSˆ¢‡#ŠPTˆBˆ#ŠPUˆ£‡#ŠPVˆCˆ#ŠPWˆ—‡#ŠPXˆ7ˆ#ŠPYˆ¤‡#ŠPZˆDˆ#ŠP[ˆ¥‡#ŠPRˆEˆ#ŠP]ˆ¦‡#ŠP^ˆFˆ#ŠP_ˆ²‡#ŠP`ˆRˆ#ŠPaˆ±‡#ŠPbˆQˆ#ŠPcˆ˜‡#ŠPdˆ8ˆ#ŠPeˆ™‡#ŠPfˆ9ˆ#ŠPgˆ‡#ŠPhˆ0ˆ#ŠPiˆ“‡#ŠPjˆ3ˆ#ŠPkˆŸ‡#ŠPlˆ?ˆ#ŠPmˆ”‡#ŠPnˆ4ˆ#ŠPoˆ–‡#ŠPpˆ6ˆ#ŠPqˆ¯‡#ŠPrˆOˆ#ŠPsˆ‘‡#ŠPtˆ1ˆ#ŠPuˆ­‡#ŠPvˆMˆ#ŠPwˆ•‡#ŠPxˆ5ˆ#ŠPyˆ¬‡#ŠPzˆLˆ#ŠP{ˆڈ#ŠP|ˆۈ#ŠP}ˆçˆ#Š@~¢èˆ#]ÍvU‰åWVSƒì\‹]}ؾ ]#ü¹󥿸ƒ=]#…Qº¾€‡#¹ ˆ#‰ö·ÂÆ0ÆBfúví…Ûu]؃{ÿuÇC\#ƒì ÿsèûÿÿÇ$jjjhy2#èϔf£B‰#ƒÄ fƒøÿu ¸þÿÿÿéÞ‰öjjjhy2#è0˜f£D‰#ƒÄfƒøÿuƒì ¿B‰#P蕛¸ýÿÿÿ頍vÇx‡#ƒ{ÿuÇCx"ƒ{tIÆE™cÆEš.ÆE˜ƒìÿsƒì‹E˜f‰$ÆD$.èÅÆE˜ƒÄÿsƒì‹E˜f‰$ŠEšˆD$襃ă;ÿuQfÇE¨ÇE¬ÇE°fÇE´ÇE¸ÇEÐÇEÈÐÇEÄ ÇEÀ¨aÇE¼
-ÇE̍E¨ë‹ƒì jjPh€"h‚2#èÿ‰ÃƒÄ ‰H‰#ƒøÿu'ƒì ¿B‰#P蓚¿D‰#‰$脚‰Ø钐ƒ=]#uWƒì ÿ5H‰#艉ǃąÿt4ƒì ¿B‰#PèLš¿D‰#‰$è=šƒÄÿ5H‰#èg5¸üÿÿÿë=Ç]#ëèƒì¶]#P¶]#P¶]#PèûÇ]#‰øƒÄeô[^_]ÃU‰åƒì¶EPEèP¿D‰#Pè0œƒÄ„Àt÷Eè@u¶Eéë‰ö¸ÉÐU‰åƒì ¶E Pÿu¿D‰#Pèõ›·ÀƒÄÉÐU‰åSƒ=x‡#0‹ -x‡#Í»‡#‹Ef‰ŠE
-ˆD‹E ‰‚‡#A‰ -x‡#‹$ÉÉöU‰åƒìèÉÍvU‰åƒìè±ÉÍvU‰åƒì¸ÿÿÿÿƒ=]#t9蓃ì ÿ5H‰#è-4¿B‰#‰$è昿D‰#‰$èט¸ƒÄÉÐU‰åƒìjèoÔÇ$è+ÔÇ$h2#èóÓè²-ƒÄÉÐU‰åWVSƒìŠEˆEó¿1¾d»`‰ö¹v‰òì©t"‰ÈA=þÿÿvì¸ÿÿÿÿ…Àu‰ÚŠEóî¸ë‰ö¸ë搸ÿÿÿÿÇEì¹d…Àt¸ÿÿÿÿët¸ë‰Êì©uî‹EìÿEì=þÿÿvé¸ÿÿÿÿ…Àu‰Úì¶Àë¸ÿÿÿÿƒøÿu
-¸þÿÿÿë3v=úu ¸ë"‰ö=þt ¸ýÿÿÿë‰ö‰øO…À9ÿÿÿ¸üÿÿÿƒÄ[^_]ÃU‰åVSƒìŠEˆE÷³Ô¾¹d‰ö‰Êì©t"‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë -¸ë搸ÿÿÿÿ…Àt¸ÿÿÿÿëL¸ë&»¹d‰ö‰Êì©tâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àuº`ŠE÷î¸ëv¸ÿÿÿÿ…Àt¸ÿÿÿÿëj¸ë&»¹d‰ö‰Êì©uâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àuºdì© tº`ì¶Ðëvºÿÿÿÿ‰Ð…Òx¸úú”ÀDþƒÄ[^]ÃU‰åWVSƒì »¾`‰ØK…À~^ƒì hÿè¼ýÿÿ‰ÂƒÄ…Òu{¿¹d‰Êì©u‰øG=þÿÿvì¸ÿÿÿÿ…Àu‰òì¶Ðëv¸ëꐺÿÿÿÿúªu›¸üÿÿÿúª…ƃì hõèMýÿÿ‰ÂƒÄ…Òt(¸ûÿÿÿ馉ö¸ýÿÿÿ隉ö¸ë.¸ëZ³`¾¹d‰Êì©tډðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî³e¾¹dv‰Êì©t®‰ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØîƒì hôèªüÿÿ‰ÂƒÄ¸…Ò•ÀHƒàƒèeô[^_]ÃU‰åWVSƒì ¾»d¹`‰Úì©t -‰Êì‰ðF=þÿvé³­¾¹d‰Êì©„‚‰ðF=þÿÿvè¸ÿÿÿÿ…ÀuºdˆØî¾»d¹`‰Úì©t -‰Êì‰ðF=þÿv鳪¾¹d‰Êì©t"‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ë搸놐¸ÿÿÿÿ…Àt¸÷ÿÿÿéݐ¸ë&»¹d‰ö‰Êì©uâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àu º`ì¶Àë¸ÿÿÿÿƒøUt¸ÿÿÿÿ錸ë&³«¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸öÿÿÿé9¸ë&»¹d‰ö‰Êì©uâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àu º`ì¶Àë¸ÿÿÿÿ…Àt¸þÿÿÿé鐸ë&³®¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…À…<èzüÿÿ…À…Žƒì hóèIúÿÿƒÄ…Àt
-¸ùÿÿÿépƒì jè.úÿÿƒÄ…Àt¸øÿÿÿéU¸ë.Æ,]#³©¾¹d‰Êì©tډðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸ôÿÿÿéù¸ë&»¹d‰ö‰Êì©uâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àu º`ì¶Àë¸ÿÿÿÿ…Àt¸óÿÿÿ驐¸ë&³¨¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸õÿÿÿéU¸ë&³Ó¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸ðÿÿÿ鐸ë&³Z¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØî¸ë¸ÿÿÿÿ…Àt¸ïÿÿÿ魐Æ,]#ëBv¸ë^¹þÿ¾d»`‰òì¶ø÷Çt‰Úì¶À÷Ç tƒøZt»IƒùÿuÙ³§¾¹d‰Êì©tª‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àté»þÿÿ‰ö¸ë:€=,]#„þÆ,]#³¨¾¹d‰Êì©tΉðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸îÿÿÿ鱐¸ëvƒì hóèWøÿÿ‰ÃÇ$dèIøÿÿÃÇ$èè;øÿÿÃÇ$è-øÿÿÃÇ$çèøÿÿþ§ƒÄ¿¹dv‰Êì©t’‰øG=þÿÿvì¸ÿÿÿÿ…Àuºd‰ðî¸ë¸ÿÿÿÿ…Àt¸íÿÿÿë…ÛuÆ,]#¸eô[^_]ÃU‰åVS¡@]#…Àt¡@]#H£@]#¸é²¸ë6ƒ=8]#uKŠ<]#¾¹dv‰Êì©t҉ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØîÿ8]#뤍v¸ë:ƒ=8]#uGÇ8]#³ô¾¹d‰Êì©tΉðF=þÿÿvì¸ÿÿÿÿ…À…Xÿÿÿº`ˆØîéKÿÿÿ‰ö¸[^]ÍvU‰åWVSƒì ¡D]#@£D]#¾õ³Ô¿¹dv‰Êì©t"‰øG=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ë搸ë.¸ÿÿÿÿ…Àu0»¹d‰Êì©tډØC=þÿÿvì¸ÿÿÿÿ…Àuº`‰ðîœúX‰Çƒì hõè5õÿÿ‰ÃƒÄ…Ût¸ûÿÿÿéù‰ö¸ë1¾§ÇEð¹dv‰Êì©tڋEðÿEð=þÿÿvé¸ÿÿÿÿ…Àu ºd‰ðî¸ë¸ë=¸ëq¸ÿÿÿÿþ`ÇEð¹d‰Êì©t΋EðÿEð=þÿÿvé¸ÿÿÿÿ…Àuºd‰ðî¾eÇEð¹dv‰Êì©tš‹EðÿEð=þÿÿvé¸ÿÿÿÿ…Àuº`‰ðîƒì hôè;ôÿÿÃĉøPÆ-]#‰Øeô[^_]ÐU‰åWVSƒì ¸ÿÿÿÿ€=,]#„ºœúX‰Æƒì hõèóóÿÿƒÄ…Àt(¸ûÿÿÿé—‰ö¸ë:¸ëf¸é“‰ö³`¿¹d‰Êì©tΉøG=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî³G¿¹dv‰Êì©t¢‰øG=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØ¿¹dv‰Êì©„rÿÿÿ‰øG=þÿÿvè¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt ¸îÿÿÿ鐃ì hôèÿòÿÿƒÄ…Àt¸Ûÿÿÿ飉ö¸ë:‰ðP¡D]#@£D]#¾ô³Ô¿¹d‰Êì©tΉøG=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë -¸ë.¸ÿÿÿÿ…Àu0»¹d‰Êì©tډØC=þÿÿvì¸ÿÿÿÿ…Àuº`‰ðîÆ-]#¸eô[^_]ÍvU‰åƒìÇdŠ#Ç`Š#ƒ=4]#t!úè‹õÿÿ£0]#Ç4]#û…Àtúèôÿÿû¡0]#…Àuƒìÿuhd#"jèQ¸ƒÄÉÍvU‰åVS¡@]#@£@]#³õ¾¹d‰Êì©t"‰ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØî¸ë -¸ë搸ÿÿÿÿ[^]ÍvU‰åVS¡@]#@£@]#³ô¾¹d‰Êì©t"‰ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØî¸ë -¸ë搸ÿÿÿÿ[^]ÍvU‰åƒì‹MœúX‰Â¡`Š#@%ÿ£`Š#Š€`‰#ˆ‰ÐP€9úu è(úÿÿë‰ö¸ÉÐU‰åƒìƒ=L]#t(ÇĊ#ÇÀŠ#ÇȊ#ÇL]#‹E£H]#ƒ=4]#t!úèôÿÿ£0]#Ç4]#û…Àtúèòÿÿû¡0]#…Àu.¸ìÿÿÿ€=,]#t ƒìjÿh #"j èOÆ-]#¸ƒÄÉÉöU‰åS‹MœúX‰Ã¡ÀŠ#@ƒà?£ÀŠ#º€Š#ŠˆA¡ÀŠ#@ƒà?£ÀŠ#Šˆ¡ÀŠ#@ƒà?£ÀŠ#ŠˆA‰ØP¸‹$ÉÉöU‰åƒì€=-]#tèäùÿÿƒì j èŽOÆ-]#¸ƒÄÉÐU‰åƒìƒ=4]#t!úè óÿÿ£0]#Ç4]#û…Àtúè™ñÿÿû¡0]#…Àt¸ë¶,]#ÉÍvU‰åVSŠEŠU€} t ƒ -<]#ë ‰öƒ%<]#„Àt ƒ -<]#ëƒ%<]#„Òtƒ -<]#ë¸ë6¸ëbƒ%<]#³õ¾¹d‰Êì©t҉ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØî³í¾¹dv‰Êì©t¦‰ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØîÿ8]#[^]ÐU‰åSƒìœúX‰Ã€=-]#tè–øÿÿè‘ðÿÿƒì hóèhîÿÿƒÄ…Àuƒì jèWîÿÿƒÄ…Àu‰ØP‹]üÉÍvU‰åº`ì¶ÈœúX‰Â¡`Š#;dŠ#t¡dŠ#ˆˆ`‰#@%ÿ£dŠ#‰ÐP]ÉöU‰åƒìº`ì¶Ðƒ=Ȋ#u €úúu¡D]#H£D]#郍v÷ÂÀuxÿȊ#œúX‰Á¡ÀŠ#;Ċ#t¡ÄŠ#ˆ€Š#@ƒà?£ÄŠ#ë"‰ö¡ÄŠ#+Ȋ#ƒÀAƒà?£ÄŠ#ÇȊ#‰ÈPƒ=Ȋ#uÇȊ#ƒì ÿ5H]#èƒÄÉÉöU‰åSƒì}™w‹UÑâU‰ÐÁà)Ðfƒ<ňâ#uèùÝNj¸ÿÿÿÿ鏐ƒ=`á#tcœúX‰Ã‹UÑâU‰ÐÁà)ЍÅ0ö€aâ# t ÿ€dâ#ë-v‹EÑàE‰ÂÁâ)‹Õdâ#ƒì‹•Àá#ÿuRÿP@ƒÄ‰ØPéèƒ¡…ÀtgœúX‰Ã‹UÑâU‰ÐÁà)ЍÅ0ö€aâ# t ÿ€dâ#ë2v‹EÑàE‰ÂÁâ)‹Õdâ#ƒì‹•Àá#ÿuRÿP@蔃ĉØPé­úèJ²‹Œá#R‰ÑÁá)Ñ»`â#f‰DË‹UÑâU‰ÐÁà)ЍÅ0öD t ÿ€dâ#ë?vƒìU‰ÐPjÿˆ]#‹MI‰ÐÁà)ЋÅdâ#ƒÄ‹•Àá#QRÿP@è/ƒÄ¡Œá#@‰ÂÁâ)ƒì ¿Õhâ#P踱èƒÄû¸‹]üÉÐU‰åWVSƒì ‹]f…Ûuè>Ünj¸ÿÿÿÿé"‰öƒ=`á#„“œúX‰ÇÇEð}ð™s¾`â#‹UðÑâUð‰ÐÁà)ÐÁàf9\,uHƒÀ0öD0 t ÿ€dâ#ë6ƒìEðPjÿˆ]#‹MðI‰ÐÁà)ЋÅdâ#ƒÄ‹•Àá#QRÿP@ƒÄÿEð}ð™~“‰øPé}‰ö蓟…À„›œúX‰ÇÇEð}ð™w¾`â#‹Eð@‰ÂÁâ)Õf9\,uJƒÀ0öD0 t ÿ€dâ#ë8vƒìEðPjÿˆ]#‹MðI‰ÐÁà)ЋÅdâ#ƒÄ‹•Àá#QRÿP@ƒÄÿEð}ð™~èj‰øPéԐúè"°‹Œá#R‰ÑÁá)Ñf‰Íhâ#ÇEð}ð™w¾`â#‹Eð@‰ÂÁâ)Õf9\,uJƒÀ0öD0 t ÿ€dâ#ë8v‹MðI‰ÐÁà)ЋÅdâ#ƒì‹•Àá#QRÿP@ƒÄEðPjÿˆ]#ƒÄÿEð}ð™~èÞ ¡Œá#@‰ÂÁâ)ƒì ¿Õhâ#Pèj¯èÁƒÄû¸eô[^_]ÃU‰åSƒìúè;¯‹Œá#R‰ÑÁá)Ñf‰Íhâ#ƒìhDâ#jèl–ƒÄUð¡Hâ#;˜á#|¡Dâ#+”á#‰Eð¡Hâ#+˜á#ë!‰ö¡Dâ#+”á#H‰Eð¡Hâ#+˜á#ʚ;‰B‹Mð ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ôºÓMb‰Ø÷êÁú‰ØÁø)ÂыŒá#R‰ÐÁà)Ð) Ŭâ#ƒì Qè. ƒÄƒ=œá#ÿtƒì ÿ5œá#ÿhá#Çœá#ÿÿÿÿƒÄ‹ -Œá#I‰ÐÁà)ЋÅdâ#ƒì‹…Àá#QPÿRLè{ ƒÄhŒá#jÿˆ]#ÇŒá#ÿÿÿÿÇ á#ÿÿÿÿèV ¡Œá#@‰ÂÁâ)¿Õhâ#‰$èã­è:ƒÄû‹]üÉÐU‰åƒìh$*"è( ƒÄÉÍvU‰åƒìjè ƒÄÉÉöU‰åƒìƒ=T]#u(èè
-ƒì ¡Œá#@‰ÂÁâ)¿Õhâ#Pèt­ƒÄÉÍvU‰åWVSƒìhŠ2#è]$ƒÄ»`â#ëv‹Eð@‰ÐÁà)ЁLÃ0€ƒì hâ#èÊ+‰EðƒÄƒøÿ„“@‰ÐÁà)ÐöDÃ1@u¾‹UðR‰ÃÁã)ÃÁã¾`â#¡P]#‰3@£P]#‹E ‰Dƒìjÿuƒtâ#Pè ¾ÆD'ƒÃ fÇD3‹Mf‹%ÿf‰D3
-f‹A f‰D3 ƒÄ‰Ø‰ñº‹]ƒ{tf‹Sf‰T‹UðR‰ÁÁá)ÁÁáY0‹U‹B -‰ƒ`â#¿dâ#Ç;¾hâ#¡Œá#@‰ÂÁâ)‹DÖ0‰3ºlâ#ǍAP‹]ð‰˜`â#Ç8ÇÿÿÿÿÇ0ÿÿÿÿǁÀâ#°Ç8Ç0ǁÁÀǁ`â#Ç9ºۍƒ€ 
-Ç…Äâ#Bƒúvì‹Eð@‰ÐÁà)ÐÁàÀǂhâ#ÿÿÿÿǂlâ#´â#‰0ã#º‹Mðɍ€ ‰ö
-Ç…0ã#Bƒú~ì»ëC;á#sƒì‹Àá#ÿuSÿPƒÄ…Àxß;á#u7‹]ð[‰ÂÁâ)ÂfÇՈâ#ƒìhâ#SèÚ)è¡ÕDŽ鄉ö‹Eð@‰ÐÁà)Ѝ4ʼnždâ#ƒì‹Àá#ÿuÿuðSÿP,ƒÄ…ÀyWfdžˆâ#ƒìhâ#ÿuðèz)èAÕDžë'è3Õǃ釃ì ÿuðè9èÕdž¸ÿÿÿÿƒÄëjƒE‹U‹zü…ÿtY‰ö¾ëF;5„á#s0ƒìµ‹ƒ â#WVÿP ƒÄ…Àxۃ싃 â#WÿuðVÿP$ƒÄ;5„á#t‡ƒE‹M‹yü…ÿu©‹Eðeô[^_]ÉöU‰åƒìEPÿuÿu ÿuè`üÿÿƒÄÉÍvU‰åWVSƒì ‹} ƒt6‹EÑàE‰ÂÁâ)‹G‰Õlâ#‰Æ‹UÑâU‰ÐÁà)Ѓ Őâ#@ën‰öƒì ‹UÑâU‰ÐÁà)зŎâ#Pè@‹UÑâU‰ÑÁá)Ñ»lâ#‰ˉƋEÑàE‰ÂÁâ)ƒÄƒ<Óuƒì ÿuèìèËÓLjëtv‹EÑàE‰ÂÁâ)»`â#·DÓ.ƃì ·GPjÿwVh1"è-‰ÁƒÄ f…Éu?ƒì‹UÑâU‰ÐÁà)зDÃ.PVèƒÄÿuèvèUÓlj¸ÿÿÿÿƒÄëN‹EÑàE‰ÂÁâ)Âf‰ Õhâ#ƒìU‰ÐPjÿˆ]#ƒÄöGu ÿ€á#ëvöGuÿ@â#¸eô[^_]ÍvU‰åWVSƒì ‹M‹U ‹]œúX‰ÇEPSRQè­úÿÿ‰ÆƒÄƒþÿ„ɍv‰ÐÁà)ЋÅdâ#‹…Àá#ƒx(„èà…À‰€»;„á#svƒì‹ â#VSÿP(ƒÄC;„á#råv‰ÃÁã)ÃÁ㋃dâ#ƒì‹…Àá#VPÿR0fǃˆâ#ƒÄhâ#Vè\&ƒÄè ÒLJ‰øP¸ÿÿÿÿë#vƒìSVèŽýÿÿƒÄº…À”ÂJ ։øP‰ðeô[^_]ÃU‰åVS‹u»;„á#svƒì‹ â#VSÿP(ƒÄC;„á#råv‰ÃÁã)ÃÁ㋃dâ#ƒì‹…Àá#VPÿR0fǃˆâ#ƒÄhâ#Vè¬%ƒÄeø[^]ÉöU‰åVS‹]è ƒì ¡Œá#@‰ÂÁâ)¾`â#SÿTÖú‰$èn¡Œá#@‰ÂÁâ)¿DÖ‰$èn¦ƒÄeø[^]ÃU‰åWVSƒì‹]‹}úû™w! [‰ÈÁà)ÈÁàº`â#öD0tfƒ|(u û¸ÿÿÿÿéDžÿy$[‰ÁÁá)Á Í°¸dâ#‹<Çë ‰öƒÿv¿[‰ÁÁá)Á Í°‰Mä¹hâ#‰Mì‹Uä‹
-‰Â)úƒÂ‰Ð¾º÷ö‰Eð‹uä;tMۍƒ€4‹MðىÈÁà)ȍ Å°‰ö2‹…Äâ#‹] ‰ƒÃ‰] B»‰Ðº÷ó‹]ì;uÔû‰øƒÄ[^_]ÐU‰åSƒì‹]‹ -Œá#I‰ÐÁà)ЍÅö‚â#tɍ€È‚ã#…Äâ#¡Dâ#;”á#|;”á#uA¡Hâ#;˜á#}4ƒìSÿ5Œá#ÿ5˜á#ÿ5”á#ÿ5Hâ#ÿ5Dâ#h 2#è8¶ƒÄ è@ ‹]üÉÍvU‰åWVS‹ -Œá#I‰ÐÁà)ЍÅöƒâ#„›ɍ€ȍ‹°hâ#ºdâ#‹t‚`‹”À¸lâ#94s‰4‹Œá#[‰ÁÁá)ÁÁፁÀ°`â#¿dâ#B‰8±°‹†hâ#@º‰Ñº÷ñ‰–hâ#ۍƒ€ØÐÇD‡`ƒ<>wÿ>[^_]ÉöU‰åWVS‹M‹] ‹u‹}úù™w!I‰ÐÁà)ÐÁàº`â#öD0tfƒ|(uû¸ÿÿÿÿëy…ÛtI‰ÂÁâ)‹Õ ã#‰…ötI‰ÂÁâ)‹Õã#‰…ÿtI‰ÂÁâ)‹Õ$ã#‰ƒ}t(ɍ€ȍ I‰ÊÁâ)ÊÕã#‹…Äâ#‹U‰û¸[^_]ÉöU‰å‹Múù™w!I‰ÐÁà)ÐÁàº`â#öD0tfƒ|(uû¸ÿÿÿÿë7I‰ÂÁâ)ÂÁ⍂Àǀ`â#ǀdâ#ǂã#û¸]ÍvU‰åWVSƒì ƒ=Œá#ÿt¡Œá#@‰ÂÁâ)ÂöՐâ#…3ƒ=Œá#ÿ„ƒìhDâ#j證ƒÄUè¡Hâ#;˜á#|¡Dâ#+”á#‰Eè¡Hâ#+˜á#ë"v¡Dâ#+”á#H‰Eè¡Hâ#+˜á#ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ìºÓMb‰Ø÷êÁú‰ØÁø)ÂыŒá#R‰ÐÁà)Ð) Ŭâ#ƒì QènüÿÿƒÄƒ=œá#ÿtƒì ÿ5œá#ÿhá#Çœá#ÿÿÿÿƒÄ‹ -Œá#I‰ÐÁà)Ћ<Ådâ#ƒì‹½Àá#QWÿP<ƒÄ¿4½ƒì ‹†Àá#WÿP$‰ÃƒÄƒûÿt%ƒì[‰ÐÁà)ЋÅdâ#‹…Àá#SPÿR4ƒÄ븅Àx»ƒûÿuG뫍v‹5Œá#‰ á#‰Œá#[‰ÐÁà)Ð;Å°â#t0»`â#‰ö¡Œá#@‰ÂÁâ)‹TÓP‰Œá# R‰ÈÁà)È;TÃPu×;5Œá#tƒìhŒá#jÿˆ]#ƒÄ‹ -Œá#I‰ÐÁà)ÐÁà¾`â#fÇD(‹¸dâ#ƒì‹½Àá#‹ á#¸;Œá#•ÀPQWÿS8¡Œá#@‰ÂÁâ)ƒÄöDÖ1„Ü¡ á#;Œá#…Ë¡Dâ#‰EèM行á#@‰ÂÁâ)»lâ#‹DÓ@º@B‰Ö™÷þ’’’Áâ‰Ö5Hâ#‰q¿¡/¸D‰ø÷î‰×Áÿ‰ð™‰þ)Ö¡Œá#@‰ÂÁâ)‹\Ó@ºƒÞC‰Ø÷êÁú‰ØÁø)2Eè‹AºÊš;‰Ó™÷û‰Qjh<?"ÿuìÿuèÿdá#‰ÃƒÄƒûÿuƒìÿ5Œá#jèû7ƒÄ‰œá#¡Dâ#£”á#¡Hâ#£˜á#eô[^_]ÉöU‰åWVSƒìÇð¡%úÿuèD»ƒÄ¿dâ#¾`â#‰ö[‰ÂÁâ)ÂÁâÇ:ÿÿÿÿǂlâ#ÆDB fÇD0fÇD0
-fÇD0 fÇD0B0Ç0Ç8ǀhâ#ǀlâ#‚¤â#Ç@Çǂ¬â#BP‰0Ç8ÇD`DŽÐ‚8å#Ç@Ǎ‚àÇ0ÿÿÿÿÇ8ÿÿÿÿ‚°Ç8ǀhâ#ǀlâ#ÂÀÇ2Ç:ºۍƒ€ v
-ÇD‡`Bƒúvï[‰ÐÁà)ЍÅÀǀhâ#ÿÿÿÿǀlâ#ºۍƒ€ 
-DŽ†ÐBƒú~ìCû™Žƒþÿÿ»¹hâ#[‰ÂÁâ)C‰DÑP‰Ãû˜~åÇ`Ÿ%ÿÿÿÿ»™¹lâ#[‰ÂÁâ)Cÿ‰DÑP‰Ã…ÛéǼâ#ÿÿÿÿÇâ#Ljá#Ç€á#Ç@â#Ç á#ÿÿÿÿÇŒá#ÿÿÿÿÇœá#ÿÿÿÿǘá#Ç”á#ǐá#Ç„á#Ç`á#èÚè}è42ƒì ÿuèqÉÿÿ£â#ƒÄ=×Övƒì h3#èÇ$è »ƒÄ¸ƒ=â#”À‰Eè]è¡â#‰CÇð¡%躂ƒì S豌Ç$Ð?"èÇÇ$*"聎Ç$(?"蕎ƒÄjjèEÿ]#ƒÄhDâ#jèLƒèOùÿÿèê›f£â#¡Œá#@‰ÂÁâ)¾`â#¿DÖ‰$èϛÇ$è7ŽÿŒ]#Çð¡%ƒÄ»ƒ=ˆá#ŸÃSjèɃă=@â#teè„ ÇT]#ƒìhDâ#j軂è^›f£â#è³øÿÿÇ$(?"èǍ¡Œá#@‰ÂÁâ)¿DÖ‰$è7›Ç$蟍ƒÄÇð¡%ƒìSjèCèÇð¡%ƒÄjjè(ƒÄúƒ=ˆá#t"ƒìÿ5ˆá#h+3#èP¬Ç$ÿÿÿÿèX¹ƒÄƒì jèK¹ƒÄeô[^_]ÃU‰åSƒìƒ=T]#…•èW‰…Àuú腚‹Œá#R‰ÑÁá)Ñf‰Íhâ#‹E£ˆá#ÇT]#ƒ=Œá#ÿ„ƒìhDâ#j藁ƒÄUð¡Hâ#;˜á#|¡Dâ#+”á#‰Eð¡Hâ#+˜á#ë ¡Dâ#+”á#H‰Eð¡Hâ#+˜á#ʚ;‰B‹Mð ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ôºÓMb‰Ø÷êÁú‰ØÁø)ÂыŒá#R‰ÐÁà)Ð) Ŭâ#ƒì QèZôÿÿƒÄƒ=œá#ÿtƒì ÿ5œá#ÿhá#Çœá#ÿÿÿÿƒÄ‹ -Œá#I‰ÐÁà)ЋÅdâ#ƒì‹…Àá#QPÿR<Ç á#ÿÿÿÿÇŒá#ÿÿÿÿƒÄèü‡…Àtƒì ¿â#Pè,™ƒÄëvƒì ¿â#Pè™èkƒÄû‹]üÉÉöU‰åSƒìÇEøÿÿÿÿ»ºÀá#¡Àá#ƒx(t1ƒì‹šUøRSÿP(ƒÄ…Àu¸ÿÿÿÿëCƒûwºÀá#‹šƒx(uи‹]üÉÉöU‰åƒìè è+ÉÉöU‰åƒìÇœá#ÿÿÿÿè§êÿÿÉÐU‰åSƒìœúX‰Ãƒ=ð¡%tƒ=@â#t‰ØPëƒì jè–ýÿÿƒÄ‰ØP‹]üÉÉöU‰åƒìÿuèzýÿÿƒÄÉÐU‰åSƒì‹UœúX‰ÃƒìRjèZ‰ÂƒÄ‰ØP‰Ð‹]üÉÉöU‰å¸ˆá#ƒ=Œá#ÿt‹Œá#R‰ÐÁà)ЍÅÀâ#]ÉöU‰åSƒìœúX‰Ãƒ=ð¡%tƒ=@â#t‰ØPëƒì ÿuèíüÿÿƒÄ‰ØP‹]üÉÐU‰å]ÍvU‰åWVSƒì ÇEðÇE컍[ …ƒ¹èŠ#t[¿àŠ#ƒ<9tP‹Œá#ҍ‚€Ð؍…о`â#ƒ<0t+ûƒì ÿ40ÿ9ƒÄú‹Œá#ҍ‚€Ð؋´†Ð uìCƒû~Œƒ}ìt -ÿEðƒ}ðŽmÿÿÿeô[^_]ÐU‰åVSº¾àŠ#»äŠ#¹èŠ#vRÁàÇ0B‰Çƒú~ãÇؐ#ÿÿÿÿÇà#ÇèŠ#ÇàŠ#ÇäŠ#ÿÿÿÿ[^]ÐU‰åS‹Múƒ=à#ÿu û¸ ënv¡à#@Ç•èŠ#‰¡à#@‹…äŠ#£à#‹@‹U ‰…àŠ#º»`â#‰öҍ‚€ÐDŽƒÐBú™~ßû¸‹$ÉÃU‰åú¡Œá#À’ÂU‹•0ã#û]ÍvU‰å‹Múƒùw -Iƒ<…èŠ#u û¸ë%v¡Œá#À’ÂʋE ‰•0ã#û¸]ÃU‰åS‹]œúX‰Áƒûw -[ƒ<…èŠ#u‰ÈP¸ë.v[Áà‹à#‰äŠ#ǀèŠ#‰à#‰ÈP¸‹$ÉÃU‰åWVSƒì ¡Œá#‰Eð‰ÂÑâ‰ÐÁà)ЍÅ¿`â#öD0 tm‹E‰‚,ã#‹UðÑâUð‰ÐÁà)ЁLÇ0@‹UðÑâUð‰ÐÁà)ЍÅÀºhâ#ƒ<ÿt,‹4v‰ÃÁã)ÃÁ㋃dâ#ƒì‹…Àá#VPÿRD‰tPƒÄ¹»`â#;MðtI‰ÐÁà)ЋUð9TÃP„ˆAù™~ۋUðÑâUð‰ÐÁà)Ѓ<Å´â#t[»dâ#ûƒì ‹UðÑâUð‰ÐÁà)ЋDÃPÿpÿƒÄú‹EðÑàEð‰ÂÁâ)ÕP‹‹@‰‹UðÑâUð‰ÐÁà)Ѓ|ÃPu«èJüÿÿƒì ‹EðÑàEð‰ÂÁâ)»`â#¿DÓPèÔyƒÄEðPjÿˆ]#‹Eð@‰ÂÁâ)ՃÄöD0@u%ƒì·D.P‹Eð@‰ÂÁâ)Âÿ4Õlâ#èÁ ƒÄ»;„á#sƒì‹ â#ÿuðSÿP(ƒÄC;„á#rã‹MðI‰ÐÁà)ЋÅdâ#ƒì‹…Àá#QPÿRPÇŒá#ÿÿÿÿÇ á#ÿÿÿÿ‹Eð@‰ÂÁâ)ƒÄöՐâ#u&ÿ -€á#ƒ=€á#uBèZúÿÿë;ƒìRjèY+ƒÄëg‹Eð@‰ÂÁâ)ÂöՐâ#uÿ -@â#ƒ=@â#uèúÿÿƒìhDâ#jèÒyƒÄƒ=œá#ÿtƒì ÿ5œá#ÿhá#Çœá#ÿÿÿÿƒÄè­ïÿÿeô[^_]ÐU‰åVS‹uúv‰ÐÁà)ÐÁàº`â#öD0ufƒ|(uèѼNJû¸ÿÿÿÿ麍v‰ÐÁà)Ðöőâ#tû雉ö;5Œá#uJv‰ÐÁà)л`â#‹DÃ0©t0©u)ƒì jè¥üÿÿ¡Œá#@‰ÂÁâ)¿DÓ‰$襑ƒÄ»ëvC;X]#}ƒìÝÿ°‘#Vÿ‘#ƒÄ…Àtٍv‰ÐÁà)Ё Őâ#û¸eø[^]ÍvU‰åWVSƒì ‹Ef‰Eòf…Àuèâ»ÇŒ¸ÿÿÿÿé‰öú¡ á#@‰ÂÁâ)Âf‹Mòf; Ռâ#”Eñ¾¿`â#‰öv‰ÐÁà)ÐÁà‹T0÷Â…ˆƒÀ fƒ|8t}÷Âuuf‹Mòf9L8 uj;5Œá#u!÷Ât÷Âuƒì jè{ûÿÿƒÄëC‰ö»ëC;X]#}ƒìÝÿ°‘#Vÿ‘#ƒÄ…Àtٍv‰ÐÁà)ЁLÇ0Fþ™ŽNÿÿÿ€}ñt(ƒì ¡ á#@‰ÂÁâ)¿Õhâ#P萃Äëvû¸eô[^_]ÉöU‰åWVSƒì ¾¿`â#v‰ÐÁà)ÐÁàfƒ|(tL÷D0
-uB»ë‰öC;X]#}ƒìÝÿ°‘#Vÿ‘#ƒÄ…Àtٍv‰ÐÁà)ЁLÇ0Fþ™~–eô[^_]ÉöU‰åSƒì¡Œá#@‰ÂÁâ)»`â#‹DÓ0©t7©u0©t)ƒì jè"úÿÿ¡Œá#@‰ÂÁâ)¿DÓ‰$è"ƒÄ‹]üÉÉöU‰åS‹M‹] ¡X]#ʼnŠ‘#‰š‘#@£X]#‹$ÉÍvU‰åƒìúÿuè½ùÿÿ¡Œá#@‰ÂÁâ)¿Õhâ#‰$躎ƒÄÉÐU‰åVS¶uœúX‰Ãƒ=4”#ÿuèH¹Ç‚‰ØP¸ÿÿÿÿéۋ -4”#‰ÊÁâ‹‚¬‘#£4”#‹E‰‚ ‘#‹E ‰‚¤‘#‰ðƒà‰‚¨‘#‰ðƒàƒøtOƒø
-ƒøt -ësvƒøtSëi‰ÈÁàǀ¬‘#ÿÿÿÿƒ= ”#ÿu‰ - ”#ë¡$”#Áà‰ˆ¬‘#‰ -$”#ëH‰ö‰ÊÁâ¡(”#‰‚¬‘#‰ -(”#ë.‰ÊÁâ¡,”#‰‚¬‘#‰ -,”#ë‰ÊÁâ¡0”#‰‚¬‘#‰ -0”#‰ØP¸[^]ÐU‰åƒìƒ=á#uƒì h`3#èŒÇ$謃ġá#P‰á#ÉÐU‰åƒìƒ=„á#uƒì h3#èPÇ$èÌ«ƒÄ¡„á#P‰„á#ÉÐU‰åWVS‹E‹u ‹}»‹HÇöt<€9t5‹ ‰‡€: t€:t‰öC€< t€< uó€< uÆ Cÿ€< uÌÿ[^_]ÐU‰åWVSì¬‹EµTþÿÿ½Xþÿÿ»‹HDžTþÿÿöt<€9t5‹ ‰‡€: t€:t‰öC€< t€< uó€< uÆ Cÿ€< uÌÿƒì…XþÿÿPÿµTþÿÿèQµÿÿƒÄeô[^_]ÉöU‰å¸¹¬‘#v‰ÂÁâ@‰
-ƒø&~òÇ”#ÿÿÿÿÇ ”#ÿÿÿÿÇ$”#ÿÿÿÿÇ(”#ÿÿÿÿÇ,”#ÿÿÿÿÇ0”#ÿÿÿÿÇ4”#]ÉöU‰åWVSƒì ‹E‹} ƒøt4ƒø ƒøtéЃøt3ƒøtB鳐‹ ”#Ç ”#ÿÿÿÿë:‰ö‹(”#Ç(”#ÿÿÿÿë&‰ö‹,”#Ç,”#ÿÿÿÿë‰ö‹0”#Ç0”#ÿÿÿÿÇ`á#ƒûÿtM¾¬‘#…ÿt‰ØÁàƒ¸¨‘#uƒì ‰ØÁàÿ°¤‘#ÿ ‘#ƒÄ‰Ù‰ØÁà‹0‰Â¡4”#‰2‰ -4”#ƒûÿu¸Ç`á#eô[^_]ÉöU‰åƒìEüPEøPEôPEðPèI‡Ç$@”#èÍӃÄjjhÿÿjhD”#h@”#èøɃÄjjhÿÿÿhh`”#h@”#èØɃÄjjhÿÿÿþhh|”#h@”#è¸ÉƒÄ ƒ}ütƒì‹EüHPÿuøh@”#è‚ȃă}ôtƒìÿuôÿuðh@”#èfȃÄÉÐU‰åƒì‹E…Àu¸ëƒìjPh@”#èʃÄÉÍvU‰åƒìÿuÿuÿu ÿuh@”#èÀËƒÄ ÉÍvU‰åƒì ÿuÿuÿuÿuÿu ÿuh@”#èºËƒÄ ÉÐU‰åƒì ÿu ÿuh@”#ènЃÄÉÐU‰åƒìÿuh@”#èU΃ÄÉÃU‰åƒìÿuh@”#èU҃ÄÉÃU‰åƒì jÿuh@”#è[ɃÄÉÉöU‰åƒì ÿu ÿuh@”#èЃÄÉÐU‰åƒìh@”#èÎÇ$@”#è(҃ÄÉÍvU‰åWVSƒì} ‹uEðPhÔ3#VèÖ¥‰ÃƒÄƒûuƒ}ðvÇEðƒÆë ‰öÇEð‹Eðº;\]#~hƒìWVh ”#蜃Äj
-VèK›ƒÄ»…À•ÃœúX‰Æƒìh ”#‹Eðÿ4…`]#hÙ3#è]™ƒÄ…Ûuƒì h|4#èI™ƒÄ‰ðPº‰Ðeô[^_]ÍvU‰åVSƒìu ‹]EôPhÔ3#S襃ăøuƒ}ôvÇEôƒÃëÇEô‹Eôº;\]#~JƒìVSh ”#èB›ƒÄj
-S臚ƒÄœúX‰Ãƒìh ”#‹Eôÿ4…`]#hÙ3#裘ƒÄ‰ØPº‰Ðeø[^]ÉöU‰åVSƒì@‹u‹] ‹EfÇEÈÇEÌÇEÐfÇEÔÇEàÇEäÇEìÇEð‰EØÇEÜÇEè…ÛtT‹C‰E̋C‰EЃ{u
-ÇEÜ1됃eÜߋC ‰EàÇEÀƒì ÿ5 ˜#è)7ƒÄ+C ‰EċC‰Eì‹C‰EðëD‰öÇEÌÇEЃMÜ ÇEàÇEÀƒì ÿ5 ˜#èâ6ƒÄ‰EÄÇEìÇEðèI±‹ƒì jEÀPEÈPÿuhá3#èAÞÿÿ‰ƒÄ ƒøÿt ƒì PèòÒÿÿƒÄ豉¸ƒ>ÿ”ÀHƒàêƒÀeø[^]ÍvU‰åƒìÿ5 ˜#èc6ƒÄÉÉöU‰åƒìÿ5 ˜#èc6ƒÄÉÉöU‰åƒìÿ5 ˜#è{5ƒÄÉÉöU‰å‹E‹U ‹M£ ˜#‰¤˜#‰ -¨˜#]ÐU‰åVS‹]è°‹0ƒì Sètóÿÿ‰Ãèm°‰0ƒÄ¸…Û•À@eø[^]ÃU‰åƒìúÿuÿu ÿuÿ5 ˜#èé5ƒÄûÉÍvU‰åWVSƒì ‹}‹uúÿ6ÿu Wÿ5 ˜#è3‰ÃƒÄ…Ûu#ƒìÿ5 ˜#èx5ƒÄ+PWÿ5¨˜#èffƒÄû‰Øeô[^_]ÃU‰åSƒì ‹] Sÿuè¡eƒÄÿ5 ˜#è75ƒÄ+‰¸‹]üÉÉöU‰åVSƒì‹u‹] …Ûtƒ;uÇEôƒìEôPë7ƒ;uÇEðƒìEðPë!vÇEèƒì jè_þÿÿ+CUè‰BƒÄRVèT*ƒÄeø[^]ÉöU‰åWVSƒì‹u ‹}ÇEðÿ5 ˜#è“4‰ÃƒÄ9Þƒþ} ¸ëG‰öƒì ÿuèµ*ƒÄ W‰Ø)ðPÿuè eƒÄ…ÀtÇEð…ÿt‰Ø+‰ƒì ÿuèÙ*‹EðƒÄeô[^_]ÍvU‰åƒì‹Eúƒ8u -ÇûÿU ëû¸ÉÃU‰åWVSƒì¿ÿÿÿÿ‹E ‹‹E@‰ÐÁà)ÐÁà‹8å#‰U苀<å#‰Eìƒùÿtw ‰ÆȉÂÁâ)‹Eè‰Ã;Õ8å#|[‰Eäv1‰ÐÁà)ЍÅ;š8å#u ‹Eì;‚<å#|1‰Ï‰ÐÁà)Ћ Ÿâ#ƒùÿt4 1‰ÐÁà)Ћ]ä;Å8å#}«ƒÿÿt‰ÐÁà)ЋU‰Ÿâ#ë‹E‹U ‰ƒùÿtI‰ÐÁà)ЋU‰żâ#‹E@‰ÐÁà)ЍÅP‰ˆhâ#‰¸lâ#ƒÄ[^_]ÍvU‰åWVSƒì¿ÿÿÿÿ‹E ‹‹E@‰ÐÁà)лdâ#‰]ð‹´ÃЃùÿtCI‰ÐÁà)Ð;´ÃÐr0»hâ#‰Ï‰ÐÁà)ЋLÃPƒùÿtI‰ÐÁà)ЋUð;´ÂÐsՃÿÿt‰ÐÁà)ЋU‰Ÿâ#ë
-‰ö‹E‹U ‰ƒùÿtI‰ÐÁà)ЋU‰żâ#‹E@‰ÐÁà)ЍÅP‰ˆhâ#‰¸lâ#ƒÄ[^_]ÍvU‰åWVS‹}‰ÐÁà)ЍÅP‹lâ#‹°hâ#ƒúÿu ‹E ‰0ë#‰öR‰ÁÁá)Á»hâ#‰ÐÁà)ЋDÃP‰DËPƒþÿt!v‰ÁÁá)Á»lâ#‰ÐÁà)ЋDÃP‰DËP[^_]ÃU‰åS‹]‹ ‰Èƒùÿt/I‰ÐÁà)ЋŸâ#‰ƒøÿt@‰ÐÁà)ÐÇżâ#ÿÿÿÿ‰È‹$ÉÃU‰åS‹]‹M ƒ9ÿt‹@‰ÂÁâ)‰Õ¼â#[‰ÂÁâ)ÕP‹‰‚hâ#ǂlâ#ÿÿÿÿ‰‹$ÉÃU‰åWVSƒì ‹M‹] ‹}ÇEðú¡Œá#@‰ÂÁâ)4Õ`â#…ÿt‹F8‰…ÛtBƒùt"ƒù ƒùt ë*‰öƒùtë!‹F8 ‰F8ë‰ö‹÷Ð!F8ëv‹‰F8ëÇEð‹F8‰Ã÷ЋÀš#‰Ñ…ÂtB‰ö‰Ø÷л!Ètv‰Ú©u
-CÑøuòºƒì R范ċ^8‰Ø÷Ћ -Àš#…ÁuÀ‹F8‰Ã÷ЋV<‰Ñ…Ât=‰Ø÷л!Ètv‰Ú©u
-CÑøuòºƒì Rè|ƒÄ‹^8‰Ø÷ЋN<…ÁuÃû‹Eðeô[^_]ÍvU‰åVS‹u‹M ¸…É„¸ƒù‡òv‰ÐÁà)Ðfƒ<ňâ#u -¸éӍvú‰ÈÁàö€È˜#uƒ¸À˜#uû魉öv‰ÐÁà)ЍŜâ#ƒùvèÍ©Çë
-¸Óà »ëC;„]#}ƒìÝÿ°„›#Vÿ€›#ƒÄ…Àtٍv‰ÐÁà)ЍÅfƒ»ˆâ#u&ƒìhĚ#VèÔüÿÿ‹ƒdâ#ƒÄ‹…Àá#VPÿRDƒÄèSm…Àuèû¸eø[^]ÐU‰åWVSƒì‹]‹U ƒûvè©Ç¸ÿÿÿÿévœúX‰Á‰Mðƒ}t‰ÞÁæÆÀ˜#ü¹‹}ó¥…Òt‰ßÁçÇÀ˜#ü¹‰Öó¥…Ò„ºöB…°ƒ:‡§ƒ<àš#ÿtq4‰uìºàš#‹@Áà‰Eè‰ÇƒÇ‹ -¨%¸¢%‹U苉E䋇¢%©t -ƒàý‰‡¢%ë‰ö¾àš#‹Uì‹2@‰ Õ¢%‰Áƒ}äÿu»‰ -¨%ǝàš#ÿÿÿÿƒûv -è¨Çë¸þÿÿÿˆÙÓÀ!Àš#‹uð‰ðP¸ƒÄ[^_]ÐU‰åWVSƒì,‹] ¸…Û„~¸ƒû‡pœúX‰Â‰UԉÞÁæ}؁ÆÀ˜#ü¹ó¥÷Eàuƒ}Øu ‰ÐPé5vƒûv膧Ǹÿÿÿÿ됸ˆÙÓà#Àš#…Àt -‹UԉÐPéûƒûvèN§Çë‰ö¸ˆÙÓà Àš#‹5Ě#ƒþÿ„ô¸‰ÇˆÙÓçvv‰ÐÁà)ЍÅ â#ƒûvèý¦Ç¸ÿÿÿÿë‰ú#‰Ð…À„–v‰ÐÁà)ÐÁàfƒ¸ˆâ#uœâ#ƒûv -輦Çë 8ƒìhĚ#Vèúÿÿv‰ÃÁã)ÃÁ㋃dâ#ƒÄ‹…Àá#VPÿRDÃà¾`â#ƒÄƒ<3ÿtƒì ÿ43ÿhá#Ç3ÿÿÿÿƒÄ‹MԉÈPéîv‰ÐÁà)Ћ4Ÿâ#ƒþÿ…ÿÿÿ¾¸‰ÇˆÙÓç‰öv‰ÐÁà)ÐÁàfƒ¸ˆâ#„…˜â#ƒûvèö¥Ç¸ÿÿÿÿ됉ú#‰Ð…Àu^v‰ÐÁà)ЍŜâ#ƒûvèÃ¥Çëv 8»ëvC;„]#}0ƒìÝÿ°„›#Vÿ€›#ƒÄ…ÀtÙëvFþ™ŽSÿÿÿèzi…Àuè9 -‹MԉÈP¸eô[^_]ÐU‰åWVSƒì,¸ƒ} „T¸ƒ} ‡EœúX‰Â‰Uԋu Áæ}؁ÆÀ˜#ü¹ó¥÷Eàuƒ}Øu ‰ÐPé ‰ö÷Eàu;ƒ} vèܤǸÿÿÿÿëv¸ŠM Óà#Àš#…Àt ‹UԉÐPéÃ=¨%ÿu‹MԉÈP¸ 鮉ö‹5¨%vÁ๢%‹‰¨%‹U ‰¢%‹U‰¢%‹U‰ ¢%‹Œá#‰¢%Çÿÿÿÿ‹E Áàºàš#ƒ<ÿu‰4ë>‰ö‹M ‹àš#‰ÁЃ<Å¢%ÿt»¢%
-‹Í 
-ƒ<ÃÿuîR‰4Å¢%ƒ} vèé£Ç됸ŠM Óà Àš#‹5Ě#ƒþÿ„û¸‰ÃŠM Ó㐍v‰ÐÁà)ЍÅ â#ƒ} v蘣Ǹÿÿÿÿë v‰Ú#‰Ð…À„šv‰ÐÁà)ÐÁàfƒ¸ˆâ#uœâ#ƒ} vèS£Çëv ƒìhĚ#Vè¨öÿÿv‰ÃÁã)ÃÁ㋃dâ#ƒÄ‹…Àá#VPÿRDÃà¾`â#ƒÄƒ<3ÿtƒì ÿ43ÿhá#Ç3ÿÿÿÿƒÄ‹MԉÈPé÷v‰ÐÁà)Ћ4Ÿâ#ƒþÿ…ÿÿÿ¾¸‰ÃŠM Ó㐍v‰ÐÁà)ÐÁàfƒ¸ˆâ#„…˜â#ƒ} v艢Ǹÿÿÿÿë‰Ú#‰Ð…Àu^v‰ÐÁà)ЍŜâ#ƒ} vèV¢Çë‰ö »ëvC;„]#}0ƒìÝÿ°„›#Vÿ€›#ƒÄ…ÀtÙëvFþ™ŽSÿÿÿèf…Àuƒ=€]#uèÄ ‹MԉÈP¸eô[^_]ÃU‰åWVSƒì‹u‹]¡Œá#@‰ÂÁâ)<Õ`â#èŠú¡Àš##„Hºv©u=BÑøuô¾ƒ<µàš#ÿue‹E ‰0Ç@Ç@W<ƒþvèa¡Ç됉Öëɸþÿÿÿ‰ñÓÀ!ƒþvè?¡Çëv¸þÿÿÿ‰ñÓÀ!Àš#ûév µºàš#‹[‹Å¢%‰ƒøÿu"ƒþvèñ Ç됸þÿÿÿ‰ñÓÀ!Àš#W<ƒþv -èÌ Çë ¸þÿÿÿ‰ñÓÀ![Áâ¹¢%‹
-‹u ‰‹‚¢%‰F‹‚ ¢%‰FƒÂ‹
-©t ƒàý‰
-ëv[¡¨%‰Õ¢%‰¨%ûéI‰Öë‹G<#tUº©uéBÑøuô¾‹E ‰0Ç@Ç@W<ƒþvè Çëv¸þÿÿÿ‰ñÓÀ!ûéëv…Ûtƒ;uƒ{u -û¸ éÓ‰ö‹‰G@úèu‹Œá#R‰ÑÁá)Ñf‰Íhâ#ƒìhDâ#jèN\ƒÄUè¡Hâ#;˜á#|¡Dâ#+”á#‰Eè¡Hâ#+˜á#ë¡Dâ#+”á#H‰Eè¡Hâ#+˜á#ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰ÁáºÓMb‹Eì÷êÁú‹EìÁø)ÂыŒá#R‰ÐÁà)Ð) Ŭâ#ƒì QèÏÿÿƒÄƒ=œá#ÿtƒì ÿ5œá#ÿhá#Çœá#ÿÿÿÿƒÄ‹ -Œá#I‰ÐÁà)ЋÅdâ#ƒì‹…Àá#QPÿRHƒÄhĚ#ÿ5Œá#èæòÿÿ¡Œá#@‰ÂÁâ)ÂfÇՈâ#ƒÄ…Û„’ƒìEàPjè[U؃Ä‹Eà‰E؋EäC‰B…Ày -ÿM؁Bʚ;됁zÿɚ;~ ÿjʚ;ÿ5Œá#h¼q"ÿuÜÿuØÿdá#‰ÃƒÄƒûÿuƒìÿ5Œá#jèù ƒÄ¡Œá#@‰ÂÁâ)‰Õ@å#ÇŒá#ÿÿÿÿÇ á#ÿÿÿÿè‡Ðÿÿƒì ¡Œá#@‰ÂÁâ)»`â#¿DÓPèsè”ÇG@¡Œá#@‰ÂÁâ)ƒÄöDÓ2tû¸ é~‰Öë%¡Àš##„ûº‰ö©uáBÑøuô¾ƒ<µàš#ÿu=‹M ‰1ÇAÇAƒþv -è@Çë¸þÿÿÿ‰ñÓÀ!Àš#ûé vƒì µƒàš#Pèúðÿÿ‰ÇƒÄƒ»àš#ÿu#ƒþvèòœÇë‰ö¸þÿÿÿ‰ñÓÀ!Àš#Áâ¹¢%‹
-‹] ‰‹‚¢%‰C‹‚ ¢%‰CƒÂ‹
-©t ƒàý‰
-ëv¡¨%‰Õ¢%‰=¨%ûël‹G<#…Àuû¸ë`v‰Öë‹G<º#t ©uéBÑøuô¾‹E ‰0Ç@Ç@W<ƒþvè/œÇëv¸þÿÿÿ‰ñÓÀ!û¸eô[^_]ÍvU‰åWVSƒì ‹}¡Œá#@‰ÂÁâ)4Õ`â#è¹ú‹F<#…Àt è¦û颋‰F@úèq‹Œá#R‰ÑÁá)Ñf‰Íhâ#ƒìhDâ#jè6XƒÄUè¡Hâ#;˜á#|¡Dâ#+”á#‰Eè¡Hâ#+˜á#ë¡Dâ#+”á#H‰Eè¡Hâ#+˜á#ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ìºÓMb‰Ø÷êÁú‰ØÁø)ÂыŒá#R‰ÐÁà)Ð) Ŭâ#ƒì QèúÊÿÿƒÄƒ=œá#ÿtƒì ÿ5œá#ÿhá#Çœá#ÿÿÿÿƒÄ‹ -Œá#I‰ÐÁà)ЋÅdâ#ƒì‹…Àá#QPÿRHƒÄhĚ#ÿ5Œá#èÍîÿÿ¡Œá#@‰ÂÁâ)»`â#fÇDÓ(ÇŒá#ÿÿÿÿÇ á#ÿÿÿÿè Íÿÿ¡Œá#@‰ÂÁâ)¿DÓ‰$è™oè‹F<#ƒÄ…Àuû¸ë èÿû¸eô[^_]ÐU‰åSƒì‹]úEðPjè¢VƒÄƒ=h›#ÿu
-ÇEèëWMèUð¡d›#;B|¡`›#+Eð‰Eè¡d›#+Bëv¡`›#+EðH‰Eè¡d›#+Eôʚ;‰Aƒì ÿ5h›#ÿhá#ƒÄ…ÛtN]ð‹Eð£`›#‹Eô£d›#jhr"ÿuôÿuðÿdá#‰ÃƒÄƒûÿuƒìÿ5Œá#jè:ƒÄ‰h›#ë -vÇh›#ÿÿÿÿû‹Eè‹]üÉÐU‰åVSƒì‹uƒ<µàš#ÿuC‰uèÇEìÇEð¡Œá#‰Eôƒþvèü˜Ç鮐¸þÿÿÿ‰ñÓÀ!Àš#降 µºàš#‹[‹Å¢%‰ƒøÿu"ƒþv豘Ç됸þÿÿÿ‰ñÓÀ!Àš#[Á๢%‹‰U苐¢%‰U싐 ¢%‰Uð‹¢%‰UôP‹
-©tƒàý‰
-ë[¡¨%‰Õ¢%‰¨%ƒìEèPVè
-ƒÄeø[^]ÃU‰åVSƒì¡Œá#@‰ÂÁâ)4Õ`â#‹F0©…Í -‰F0‹F8‰Ã÷ЋÀš#‰Ñ…ÂtA‰Ø÷л!Ètv‰Ú©u
-CÑøuòºƒì Rè„þÿÿƒÄ‹^8‰Ø÷Ћ -Àš#…ÁuÀ‹F8‰Ã÷ЋV<‰Ñ…ÂtZ‰Ø÷л!Ètv‰Ú©u
-CÑøuòº‰UèÇEìÇEð¡Œá#‰EôƒìEèPRèƒÄ‹^8‰Ø÷ЋN<…Áu¦f0ÿïÿÿeø[^]ÃU‰åWVSƒì,‹]œúX‰Â‰UÌ¡Œá#@‰ÂÁâ)Õ`â#‰UЉÞÁæ}؁ÆÀ˜#ü¹ó¥÷Eàuƒ}Ø„îƒ}Øÿ„ä÷EàuCƒ}Øu=ƒìShì3#èw}ƒÄ÷Eàtƒì‹M ÿqh4#èX}ƒÄƒì jè—ÓÿÿƒÄ‹UЋB8‰EԉƍUԃûv -èh–Çë ¸ˆÙÓà ‹EÔ E܉EԋUЃÂ<ƒûv -è<–Çë ¸þÿÿÿˆÙÓÀ!‹EԋUЉB8û÷Eàtƒìjÿu SÿUäëƒìj‹M ÿqSÿU؃Äú‹EЉp8‹ỦÐPeô[^_]ÃU‰åWVSƒì ‹}‰ÐÁà)ÐÁà¾`â#fƒ|(uF˜àƒ<3ÿtƒì ÿ43ÿhá#Ç3ÿÿÿÿƒÄƒìhĚ#Wèúèÿÿ‰ÂÁâ)‹Õdâ#ƒÄë ‰ÐÁà)ÐÁàfƒ¸ˆâ#u!‹dâ#ƒì‹•Àá#WRÿPD¸ƒÄë‰ö¸eô[^_]ÍvU‰åWVSƒì º¿È˜#¾Ä˜#»Ì˜#¹àš#‰ö‰ÐÁàǀÀ˜#Ç8Ç0ÇÇ‘ÿÿÿÿBƒúvϺ»¢%¹¢%RÁàB‰ÇDƒú>~éÇè§%ÿÿÿÿÇü§%Ǩ%ÇÀš#ÇĚ#ÿÿÿÿÇh›#ÿÿÿÿº¹ œ#»$œ#‰öRÁàÇÇÿÿÿÿÆDBƒú~áƒìjhœl"ènÚÿÿƒÄeô[^_]ÍvU‰å‹EǸ]ÐU‰å‹EÇÿÿÿÿ¸]ÐU‰åƒì‹U‹M ƒùvèê“Ǹÿÿÿÿ됸Óà ¸ÉÃU‰åƒì‹U‹M ƒùv趓Ǹÿÿÿÿ됸þÿÿÿÓÀ!¸ÉÃU‰åƒì‹M ƒùv腓Ǹÿÿÿÿë ¸Óà‹U#ÉÉöU‰åƒì ÿuÿu ÿuèÔçÿÿƒÄÉÍvU‰åWƒì$‹UEè‰E丹‹}äüó«ƒìjÿuäRèBñÿÿƒÄ…Àu -‹Uè‹E ‰¸‹}üÉÐU‰åƒì jÿu ÿuèñÿÿƒÄÉÃU‰åƒì‹E…Àu¸ëƒìPÿu ÿuèíðÿÿƒÄÉÃU‰åƒìÿuÿ5Œá#è`èÿÿƒÄÉÍvU‰åVSƒì ‹]‹E ‰EèÇEìÇEð脒‹0ƒìEØPEèPSèAéÿÿƒÄ»ÿÿÿÿ…Àu ÷Eàu‹]ØèT’‰0‰Øeø[^]ÐU‰å‹M¡Œá#@‰ÂÁâ)¡Àš# ՜â#‰¸]ÉöU‰åSƒì‹E‹U ú‹Œá#‰Œá#Ç€]#jPj jèœìÿÿƒÄÇ€]#‰Œá#û‹]üÉÍvU‰åS‹M‹] ¡„]#ʼnŠ€›#‰š„›#@£„]#‹$ÉÍvU‰åVS‹]Cÿƒøv苑Ç~¸ÿÿÿÿëp‰öœúX‰Æ[€<…(œ#u‰ðPèa‘ǸÿÿÿÿëF[Áâ¹ œ#‹E ‰
-‹E‰‚$œ#ÆD
-ƒìjh\r"Sè¹T·Ã‰$èÒeƒÄ‰ðP¸eø[^]ÍvU‰åƒì¸ÉÍvU‰åƒì ‹E‰EèÇEìÇEð‹Œá#‰UôUèRPè›ùÿÿƒÄÉÉöU‰åVS‹uv‰ÃÁã)ÃÁã¸`â#DŽàÿÿÿÿL0ƒìhĚ#Vèõãÿÿ‹ƒdâ#ƒÄ‹…Àá#VPÿRDèç·ÿÿƒÄeø[^]ÐU‰åƒìÇh›#ÿÿÿÿjjèWèÿÿè¾·ÿÿƒÄÉÐU‰åƒìEüÇEüÿÿÿÿPèôÿÿƒÄÉÐU‰åƒì‹E‹‰EüEüPjÿˆ]#‹UüRÁ๠œ#ƒÄƒ<t ûƒì RÿƒÄú‹Eü@ƒì ÿ4…$œ#覱ÿÿƒÄÉÐU‰åWVSƒì ‹u ‹]ƒ}t讏Ǹÿÿÿÿén‰öúƒ=à£#ÿt ƒ=¨%ÿuûèƒÇ ¸ÿÿÿÿéCv¡à£#‰‹à£#Õ)пäœ#‹DÇ0£à£#‹Õ)йàœ#ÇDÁ0…öu8‹Õ)ÐÇÁ‹Õ)ÐÇÇ‹Õ)ЉÅèœ#닍<Å)Ǎ<ýàœ#ü¹ó¥‹Õ)ЍŃºàœ#u#¡¨%‰‚#@Áàƒˆ¢%‹€¢%£¨%‹Õ)ÐÇÅôœ#ÿÿÿÿ‹Õ)ЍÅøœ#Ç@NjÕ)Ѝŝ#Ç@NjÕ)ÐÇÅ #û¸ƒÄ [^_]ÃU‰åSƒì‹]ƒûwúÝ)؃<ŝ#uûèÿÇ¸ÿÿÿÿ閍vÝ)ØÁàǀ#ƒÀºäœ#ƒ<ÿtƒì ÿ4ÿhá#ƒÄÝ)ØÁàƒ¸àœ#uE‹#R Åö¢%u¡¨%‰¢%‰¨%Ý)؋ŝ#@ƒ$Å¢%üû¸‹]üÉÃU‰åWVSƒìL‹E‰E´Áà+E´Áàƒ¸àœ#…‹P ‹‚èœ#@öÅ¢%t¸ìœ#ƒ< „ôÿéì‰ö‹M´Áá+M´Ááy LJìœ#¾èœ#‹7@‹¨%‰Ý¢%£¨%jÿ41ÿ±äœ#jèhçÿÿ‹7@ƒ Å¢%錐‹E´Áà+E´Áà¹àœ#ƒ<uwPƒ<
-tÿ°èœ#ÿ°ìœ#ÿ4
-ëQvÇEÈÇEÌÇEÐÇEÔÇEØÇEÜÇEà‹E´Áà+E´Áàèœ#Rÿ°ìœ#EÈPEÄPèÙÙÿÿƒÄ‹E´Áà+E´Åƒ¸èœ#u -ƒ¸ìœ#„Àº#‹E´Áà+E´ŋ‰E¸M¸‹D‰A‹E¸ƒøœ#‰ƒ#‹Aƒüœ#‰B…Àyÿ‹#Bʚ;ë‰özÿɚ;~ ÿjʚ;‹E´Áà+E´ÿu´h(u"ÿ4ŝ#ÿ4ŝ#ÿdá#‰ÃƒÄƒûÿuƒìÿ5Œá#jè+ùÿÿƒÄ‹E´Áà+E´‰Åôœ#ë‰ö‹E´Áà+E´ÇÅôœ#ÿÿÿÿeô[^_]ÃU‰åWVSƒì‹u‹}ÇEäƒþw3ƒ}t-‹Exÿɚ;w!‹]{ ÿɚ;wúõ)ðƒ<ŝ#uûèÁŠÇ¸ÿÿÿÿ鐅ÿ„·õ)ðƒ<Åôœ#ÿuÇG ÇGëwƒìEèPjèGÇEäƒÄ¹#õ)ðō]è‹D;C|‹+Eè‰G‹D+Cë(¹#õ)òÁâ‹+EèH‰G‹D+Eìʚ;‰G ¹øœ#õ)ðÁà‹‰‹D‰Gõ)ðÅºäœ#ƒ<ÿtƒì ÿ4ÿhá#ƒÄ‹Eƒxu
-ƒx „þºøœ#õ)ð ŋ]‹‰
-‹C‰D
-÷E t¸#‹S‰‹S ‰Tëmvƒ}äuƒìEèPjèøEƒÄõ)ð ō‘#‹Eè‹]C‰#‹EìC ‰B…Àyÿ‰#Bʚ;ëzÿɚ;~ ÿjʚ;õ)ðVh(u"ÿ4ŝ#ÿ4ŝ#ÿdá#‰ÃƒÄƒûÿuƒìÿ5Œá#jè­öÿÿƒÄõ)ð‰Åôœ#û¸eô[^_]ÃU‰åWVSƒì ‹]‹} ƒûwúÝ)؃<ŝ#uûèzˆÇ¸ÿÿÿÿ鷉öÝ)؃<Åôœ#ÿuÇG ÇGëoƒìEèPjèÒDƒÄ¹#Ý)؍ōuè‹D;F|‹+Eè‰G‹D+Fë'¹#Ý)ÚÁâ‹+EèH‰G‹D+Eìʚ;‰G ¹øœ#Ý)ØÁà‹‰‹D‰Gû¸eô[^_]ÍvU‰åƒìƒ}t藇Çëv臇ǸÿÿÿÿÉÉöU‰åƒìƒ}tèg‡Ç¸ÿÿÿÿë‰öƒì ÿu èuÄÿÿ¸ƒÄÉÍvU‰åƒì‹E ƒ}tè,‡Ç¸ÿÿÿÿëv…Àt -ÇÇ@è¸ÉÃU‰åƒì‹UƒúwúÕ)Ѓ<ŝ#uûè܆ǸÿÿÿÿëvÕ)ЋÅ #ûÉÐU‰åWVS¹»äœ#¿àœ#¾ìœ#‰öÍ)ÈÁàÇDÿÿÿÿøœ#ÇBǍP0Ç:ÇD A‰‰Áƒù~ºÇÜ£#ÿÿÿÿÇà£#[^_]ÐU‰å]ÍvU‰å¸]ÉöU‰åVSœúX‰Ã¡Œá#@‰ÂÁâ)¾`â#‹DÖ0©t0©t)ƒì jè"Æÿÿ¡Œá#@‰ÂÁâ)¿DÖ‰$è"[ƒÄ‰ØPeø[^]ÃU‰åS‹]úût ¸ÿÿÿÿ…ÛuL¡Œá#@‰ÂÁâ)¹`â#‹DÑ0Áèƒà‹U ‰¡Œá#@‰ÂÁâ)Õ0‹
-%ÿþÿÿ ؉
-û¸‹$ÉÉöU‰åS‹]úût ¸ÿÿÿÿ…ÛuL¡Œá#@‰ÂÁâ)¹`â#‹DÑ0Áè ƒà‹U ‰¡Œá#@‰ÂÁâ)Õ0‹
-%ÿýÿÿ ؉
-û¸‹$ÉÉöU‰åWVSƒì ‹} ÇEðú‹EÇÿÿÿÿÇ@¾;5„á#s9v‹µ â#ƒ{u ƒìWVÿS,ƒÄ…ÀxƒìWÿuVÿS0‰EðƒÄF;5„á#rÊû‹Eðeô[^_]ÉöU‰åƒì‹U¸ƒ:ÿt ¸ƒzu‹‹… â#ƒìRÿ2ÿP4ƒÄÉÍvU‰åƒì‹U¸ƒ:ÿt‹‹… â#ƒìRÿ2ÿP8ƒÄÉÉöU‰åƒì‹U¸ƒ:ÿt‹‹… â#ƒìRÿ2ÿP<ƒÄÉÉöU‰åƒì‹U¸ƒ:ÿt‹‹… â#ƒìRÿ2ÿP@ƒÄÉÉöU‰åVS‹u‹µÀá#ƒìÿ°ôh94#è^j»ƒÄ‰ö[‰ÐÁà)ÐÁà9°dâ#……ƒÀ º`â#f|€ttfƒ|tlƒì f‹Dfƒøwƒì ·ÀPè$¨ƒÄë%v·Ð¸4#ú€t¸4#út¸+4#P[‰ÐÁà)ÐÁàÿ°4å#tâ#PSh 4#è¹iƒÄ Cû™ŽUÿÿÿeø[^]ÉöU‰åWVSƒì ‹E‹…Àá#‰Eð‹¸üƒì ‹Uð‹‚ðøPès§‰ÆƒÄƒþÿu -¸ÿÿÿÿ…ÿtrOëՐv‰ÐÁà)Ѝ Åö‘â#tRQ@»lâ#ƒ<D‹Då#‰ƒìý‰Ø‹Uð‚ðPVè`¥ƒÄ‹Eð˜ðSV艦ƒÄéiÿÿÿ‰ðeô[^_]ÉöU‰åWVSƒì‹E‹…Àá#‰Eð‹Mƒy(…©‹=Œá#‰ÐÁà)Ѝždâ#‹U93…‹M I‰ÂÁâ)ÂÁ⋄Љ„йlâ#‹D@‰D@‹„à‰„àƒÂ0¹`â#‹
-%ÿ÷ÿÿ‹\0ã ؉
-‹UðƒÂ¸ƒ¼º€ÿ•ÀH‹] ‰„š€é¢v‹U R‰ÂÁâ)ÂÁâ»dâ#‹A‰„Ѓyt‹A‰‚¬â#‹A‰„àë-‰ö‹] [‰ÐÁà)ÐÁà‹]ð‹“ô‰¬â#‹“ô‰Då#ƒy$u‹E @‰ÐÁà)Ё Őâ#¸ƒy ”ÀH‹U ‹Mð‰„‘ˆ¸ƒÄ[^_]ÃU‰åWVSƒì ‹U‹<•Àá#ƒ¿t8LJƒì‹E @‰ÐÁà)ЋÅ4å#‹—ðÂPÿu 譤酋E @‰ÐÁà)ЍÅöƒ‘â#t?K@¾lâ#ƒ<11ºdâ#‹1„à‰1ƒì‹„Ћ—ðÂPÿu èO¤ë*ƒì‹E @‰ÐÁà)ЋÅ4å#‹—ðÂPÿu è·£ƒÄ‹E @‰ÐÁà)ÐfÇňâ#€eô[^_]ÐU‰åWVSƒìH‹]ÇE¼ÇEÀfÇEÄÇEÈÇEÌÇEÐÇEÔÇEØÇEÜÇEà¶Ã -f‰E¸‹Àá#‹€ø‰EÈÇE̍E¸jjPhà"hE4#è-¬ÿÿ‰ÆƒÄ ƒþÿuƒì hà4#èVËÿÿƒÄ‹<Àá#v‰ÐÁà)Ðfƒ<ňâ#tµ€Gƒ<ÿtJÿëE‰öƒìv‰ÃÁã)ÃÁ㍃¤â#PjèJ;fǃˆâ#€ƒÄ‹ƒ4å#‹—ðÂPVè袃čeô[^_]ÐU‰åWVSƒì‹}hJ4#è¾ÊÿÿèÆÿÿ‰EðƒÄ hPh`4#è£ÊÿÿÇ$èwÉÿÿ‰ÃƒÄSh~4#è‡Êÿÿ‹Eð‰…Àá#ƒÄ jhŠ4#Sè=efÇCÆCÇCЈ"ÇCüˆ"ÇC Ä~"ÇC$¤"ÇC(‰"ÇC,d€"ÇC0‰"ÇC4‰"ÇC8(‰"ÇC<܁"ÇC@h‰"ÇCDô‰"ÇCH<Š"ÇCLDŠ"ÇCP܊"ÇCT$‹"ÇCXX‹"ÇC\<Œ"ÇC`\Œ"ÇCdtŒ"ÇChŒŒ"ÇCl¤Œ"ÇCp¼Œ"ÇCtԌ"ÇCxìŒ"ÇC|"ǃ€"ǃ„4"¸ƒÄS‰öDŽ‚€ÿÿÿÿ@=™~í‹EH‰ƒüƒì ‹EÁàPè@Èÿÿ‰ƒð¾ƒÄ;u}ƒì ‹ƒððPèÄF;u|åÿçw¿èÿ ¡v¿ ¡‰»ô‹E‰ƒøƒ} tƒìjÿuðh؂"è8ÃÿÿƒÄeô[^_]ÐU‰åWVSƒì ‹M‹u ‹]‹Àá#‰Eð…Éx[; -á#sS‹Àá#‹@%ÿÿÿ=u=þ™wv‰ÐÁà)Ðfƒ<ňâ#u -¸éèvv‰ÐÁà)Ð9 Ådâ#t -¸&éȍv…Ûuv‰ÐÁà)Ё Őâ#ë)ƒûuv‰ÐÁà)Ё$Őâ#ÿ÷ÿÿë ¸郉öv‰ÐÁà)ÐÁà˜Ð¿dâ#‹U9;t\f¸ˆâ#€u=ƒì‹;‹Mð‹‘ðÂPV蠞‹E‰;ƒÄ‹Uð‹‚ð‹MÈPV轟ƒÄëv‰ÐÁà)ЋU‰Å4å#¸eô[^_]ÍvU‰åVS‹M‹4Àá#…Éx; -á#s‹Àá#‹@%ÿÿÿ=t¸ÿÿÿÿëw¡Œá#@‰ÂÁâ)¸ÿÿÿÿ9 Õdâ#uZúè!P‹Œá#R‰ÑÁá)Ñ»`â#f‰DËdžèX­ÿÿ¡Œá#@‰ÂÁâ)ƒì ¿DÓPèçOè>·ÿÿƒÄû¸eø[^]ÉöU‰å‹E‹…Àá#‹€ü]ÍvU‰å‹E‹…Àá#‹€ô]ÍvU‰åS‹]‹M …ÛxU;á#sM‹Àá#‹@%ÿÿÿ=u7ù™wI‰ÐÁà)Ðfƒ<ňâ#u¸ëMI‰ÐÁà)Ð9Ådâ#t ¸&ë3‰öI‰ÁÁá)ÁÁá¸ö‘â#”À‹U‰‹‘4å#‹E‰¸‹$ÉÉöU‰å‹E f8t·‹E -9Âu¸ë¸ÿÿÿÿ]ÐU‰å¸ÿÿÿÿ]ÉöU‰å¸]ÉöU‰å]ÍvU‰å¸]ÉöU‰åSƒì ‹E‹M ‹…Àá#I‰ÐÁà)ЋÅ4å#‹“ðÂPQè?œƒÄ‹]üÉÍvU‰åWVSƒì ‹E‹u ‹<…Àá#v‰ÐÁà)Ðfƒ<ňâ#tµ€Gƒ<ÿtHÿëCƒìv‰ÃÁã)ÃÁ㍃¤â#PjèR5fǃˆâ#€ƒÄ‹ƒ4å#‹—ðÂPVèðœƒÄeô[^_]ÐU‰åSƒì ‹E‹M ‹…Àá#I‰ÐÁà)ÐÁàfǀˆâ#€‹€4å#‹“ðÂPQ褜ƒÄ‹]üÉÃU‰å]ÍvU‰åWVSƒì ‹U‹•Àá#‰Eð‹U <•€‰ÆƒÆƒ<7~MƒìR‰ÃÁã)ÃÁ㍃¤â#Pjè‹4ÿ 7ƒÄ‹ƒ4å#‹Mð‹‘ðÂPÿu 辛fǃˆâ#€ƒÄë‹E @‰ÐÁà)ÐfÇňâ#eô[^_]ÐU‰åƒì‹E‹M ‹…Àá#ƒÀDŽˆ€ÿÿÿÿI‰ÐÁà)ÐfÇňâ#hâ#QèðÉÿÿƒÄÉÍvU‰å‹E‹U ‹…Àá#ƒÀDŽ€R‰ÐÁà)ÐfÇňâ#]ÃU‰åWVSƒì4‹u v‰EäÁà+EäfÇňâ#EèPjè“3Mè»@B‹Eº÷ó‰Uà’€€‰E܋A‹U܍ЉE؉A»¡/¸D÷ë‰ÓÁû‹EØÁø)ÿƒÞC‹E÷ç‰×‰øÁèEè‹A»Êš;™÷û‰Ó‰YƒÄVhL"ÿuìÿuèÿdá#‰ÃƒÄƒûÿuƒìÿ5Œá#jèAäÿÿƒÄ v‰ÈÁà)ȉÅ@å#eô[^_]ÐU‰åƒìÿ5Œá#jèäÿÿ¸ƒÄÉÍvU‰åƒìÿ5Œá#jèñãÿÿƒÄÉÃU‰åƒìÿ5Œá#jèÙãÿÿƒÄÉÃU‰åƒìÿ5Œá#jèÁãÿÿƒÄÉÃU‰åƒìÿ5Œá#jè©ãÿÿƒÄÉÃU‰åƒìÿ5Œá#jè‘ãÿÿƒÄÉÃU‰åƒìÿ5Œá#jèyãÿÿƒÄÉÃU‰åƒìÿ5Œá#jèaãÿÿƒÄÉÃU‰åƒìÿ5Œá#jèIãÿÿƒÄÉÃU‰åƒìÿ5Œá#jè1ãÿÿƒÄÉÃU‰åƒìÿ5Œá#jèãÿÿƒÄÉÃU‰åWVSƒì‹MI‰ÃÁã)ÃÁãºdâ#‹‹4…Àá#¿`â#fÇD(€‹„Ћ–ðÂPQèA™Ç„àÿÿÿÿèQœÿÿƒÄeô[^_]ÉöU‰åVSƒì h6#è
-Áÿÿè]¼ÿÿ‰ÆÇ$Œè׿ÿÿ‰Ã‰µÀá#ƒÄ jh˜5#Sè®[fÇCÆCÇCøŽ"ÇC,"ÇC 8"ÇC$`"ÇC(ÇC,x"ÇC0„"ÇC4Œ"ÇC8˜"ÇC< "ÇC@¼"ÇCDä"ÇCH "ÇCL4"ÇCP\"ÇCT„"ÇCX¬"ÇC\Ԑ"ÇC`‘"ÇCd(‘"ÇChP‘"ÇClx‘"ÇCp ‘"ÇCtȑ"ÇCxð‘"ÇC|’"ǃ€@’"ǃ„h’"ǃˆÿÿÿÿÇ$£5#èô¿ÿÿƒÄ jVh’"è,ºÿÿƒÄeø[^]ÉöU‰å‹M‹E ‹Àá#fƒ8t·9Èu¸ƒºˆÿt¸ÿÿÿÿ]ÉöU‰å¸ÿÿÿÿ]ÉöU‰åƒì‹E‹…Àá#ÿ°ˆh5#èìYƒÄÉÍvU‰å‹E‹…Àá#‹€ˆ]ÍvU‰å¸]ÉöU‰å]ÍvU‰å¸]ÉöU‰å]ÍvU‰å‹E @‰ÂÁâ)ÂfÇՈâ#]ÃU‰åƒìh5#èxYƒÄÿ5Œá#j è„àÿÿƒÄÉÍvU‰åƒìh5#èPYƒÄÿ5Œá#j è\àÿÿƒÄÉÍvU‰åƒìh"5#è(YƒÄÿ5Œá#j è4àÿÿƒÄÉÍvU‰åƒìh)5#èYƒÄÿ5Œá#j è àÿÿƒÄÉÍvU‰åƒìh05#èØXƒÄÿ5Œá#j èäßÿÿƒÄÉÍvU‰åƒìh75#è°XƒÄÿ5Œá#j è¼ßÿÿƒÄÉÍvU‰åƒìh>5#èˆXƒÄÿ5Œá#j è”ßÿÿƒÄÉÍvU‰åƒìhE5#è`XƒÄÿ5Œá#jèlßÿÿ¸ƒÄÉÉöU‰åƒìhL5#è4XƒÄÿ5Œá#jè@ßÿÿƒÄÉÍvU‰åƒìhS5#è XƒÄÿ5Œá#jèßÿÿƒÄÉÍvU‰åƒìhZ5#èäWƒÄÿ5Œá#jèðÞÿÿƒÄÉÍvU‰åƒìha5#è¼WƒÄÿ5Œá#jèÈÞÿÿƒÄÉÍvU‰åƒìhh5#è”WƒÄÿ5Œá#jè ÞÿÿƒÄÉÍvU‰åƒìho5#èlWƒÄÿ5Œá#jèxÞÿÿƒÄÉÍvU‰åƒìhv5#èDWƒÄÿ5Œá#jèPÞÿÿƒÄÉÍvU‰åƒìh}5#èWƒÄÿ5Œá#jè(ÞÿÿƒÄÉÍvU‰åƒìh„5#èôVƒÄÿ5Œá#jèÞÿÿƒÄÉÍvU‰åƒìh‹5#èÌVƒÄÿ5Œá#jèØÝÿÿƒÄÉÍvU‰åSƒì0‹]ÇEÜÇEàfÇEäÇEè¶Ãf‰EØÇEìEØjjPh“"h’5#趜ÿÿƒÄ ‹Àá#‰Ã‰šˆƒûÿuƒì hÀ5#èÒ»ÿÿƒÄ[‰ÐÁà)ÐÇŘâ#ÿÿÿÿ‹]üÉÐU‰åôëýU‰åWVSƒì ‹} ¾ú»ëvCûÿ2Ý)ØÁ຤#€|t߃ìÿ4ÿuèaVƒÄ…Àuʾ…öt1ÿÀuèðnÇûéÜûÝ)؍…¤#éˉö÷Ç@uè¿nÇû髍v‹E‰Eð=ÿ~èžnÇû銉ö‹ÐÄ#ƒúÿtqÕ)Ѝ<…w‹†¤#£ÐÄ#ƒì ÿuèV@‰$臹ÿÿ»¤#‰ƒÄÿuPè7U‹Eð‰‡¤#‡ ¤#‰$è0‘ÆDƒÄû‡¤#ëvènÇû¸eô[^_]ÍvU‰åWVSƒì ¾ú¿»¤#vý)øÁà€|tƒìÿ4ÿuèUƒÄ…Àu¾Gÿÿ~ʅötJƒì ÿuèOUƒÄ@Pý)ûÁ㾤#ÿ43è%¹ÿÿƒÃÆD3¡ÐÄ#‰ƒ¤#‰=ÐÄ#ƒÄûë‰öèSmÇû¸eô[^_]ÍvU‰åWVSƒì ‹}?ÿw‹Õ)Ѐ<…¤#uèmǸÿÿÿÿé‰öèÏæÿÿúè5B‹Œá#R‰ÑÁá)Ñf‰Íhâ#‹Õ)Ѝ4…¤#ƒ~ ÿu
-ƒ~…“ƒìWjÿˆ]#ƒÄhDâ#jè8)ƒÄUè¡Hâ#;˜á#|¡Dâ#+”á#‰Eè¡Hâ#+˜á#ë!‰ö¡Dâ#+”á#H‰Eè¡Hâ#+˜á#ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ìºÓMb‰Ø÷êÁú‰ØÁø)ÂыŒá#R‰ÐÁà)Ð) Ŭâ#ƒì Qèú›ÿÿƒÄƒ=œá#ÿtƒì ÿ5œá#ÿhá#Çœá#ÿÿÿÿƒÄ‹ -Œá#I‰ÐÁà)ЋÅdâ#ƒì‹…Àá#QPÿRH‹ -Œá#I‰ÐÁà)л`â#fÇDÃ(ÍǂÀ#‹‰‚À#ƒÄF PQèƏÇŒá#ÿÿÿÿÇ á#ÿÿÿÿèõÿÿ¡Œá#@‰ÂÁâ)¿DÓ‰$è…@èܧÿÿƒÄûèÿäÿÿë8ÿNƒìWjÿˆ]#¡Œá#@‰ÂÁâ)¿Õhâ#‰$èF@蝧ÿÿƒÄû¸eô[^_]ÃU‰åWVSƒì ‹}‹]?ÿw‹Õ)Ѐ<…¤#uè¯jǸÿÿÿÿéVv…ÛuúëúèÒ?‹Œá#R‰ÑÁá)Ñf‰Íhâ#‹Õ)Ѝ4…¤#…Ûu0ƒ~ ÿu‹E 9F}èMjÇ û¸ÿÿÿÿéó‹E )Fûéâèäÿÿƒ~ ÿu ‹E 9F‘ƒìWjÿˆ]#ƒÄhDâ#jèš&ƒÄUè¡Hâ#;˜á#|¡Dâ#+”á#‰Eè¡Hâ#+˜á#ë¡Dâ#+”á#H‰Eè¡Hâ#+˜á#ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ìºÓMb‰Ø÷êÁú‰ØÁø)ÂыŒá#R‰ÐÁà)Ð) Ŭâ#ƒì Qè^™ÿÿƒÄƒ=œá#ÿtƒì ÿ5œá#ÿhá#Çœá#ÿÿÿÿƒÄ‹ -Œá#I‰ÐÁà)ЋÅdâ#ƒì‹…Àá#QPÿRH‹ -Œá#I‰ÐÁà)л`â#fÇDÃ(͋E ‰‚À#‹‰‚À#ƒÄF PQè+ÇŒá#ÿÿÿÿÇ á#ÿÿÿÿèZ›ÿÿ¡Œá#@‰ÂÁâ)¿DÓ‰$èê=èA¥ÿÿƒÄûèdâÿÿë<‰ö‹E )FƒìWjÿˆ]#¡Œá#@‰ÂÁâ)¿Õhâ#‰$è§=èþ¤ÿÿƒÄû¸eô[^_]ÐU‰åWVSƒì ‹}?ÿw‹Õ)Ѐ<…¤#uèhǸÿÿÿÿéU‰öè,…À„‡œúX‰Æ‹Õ)Ѝ…¤#‹JA‰J‹Z ƒûÿtG‹ÝÀ#9È<)Á‰È‰BƒìB PSèΊ[‰ÐÁà)ЋÅdâ#ƒÄ‹•Àá#SRÿPDèÿÿƒÄƒìWjÿˆ]#ƒÄ‰ðPé¼‰öúèª<‹ á#R‰ÑÁá)Ñf‰Íhâ#‹Õ)Ѝ…¤#‹JA‰J‹Z ƒûÿtG‹ÝÀ#9È<)Á‰È‰BƒìB PSè.Š[‰ÐÁà)ЋÅdâ#ƒÄ‹•Àá#SRÿPD荙ÿÿƒÄƒìWjÿˆ]#¡Œá#@‰ÂÁâ)¿Õhâ#‰$è <èb£ÿÿƒÄû¸eô[^_]ÐU‰åWVSƒì ‹] ÇEð‹E8ÿw‹Õ)Ѐ<…¤#uèlfǸÿÿÿÿéÊèc*…À„ÃœúX‰Â‰Uì‹E‹Õ)Ѝ4…¤#^‹^ ƒûÿts݉‹€À#;F_¿À#ÇEðv‹F+:‰FƒìF PS艍[‰ÐÁà)ЋÅdâ#ƒÄ‹•Àá#SRÿPD‹^ ƒÄƒûÿt݋:;F~°ƒìÿujÿˆ]#ƒÄƒ}ðtèÿÿ‹Uì‰ÐPéõúèÊ:‹ á#R‰ÑÁá)Ñf‰Íhâ#‹E‹Õ)Ѝ4…¤#^‹^ ƒûÿtr݉‹€À#;F^¿À#ÇEð‰ö‹F+:‰FƒìF PSè6ˆ[‰ÐÁà)ЋÅdâ#ƒÄ‹•Àá#SRÿPD‹^ ƒÄƒûÿt݋:;F~°ƒìÿujÿˆ]#ƒÄƒ}ðtèd—ÿÿ¡Œá#@‰ÂÁâ)ƒì ¿Õhâ#Pèð9èG¡ÿÿƒÄû¸eô[^_]ÉöU‰åWVSƒì ¾¿¤#õ)óÁãǃ¤#‰4;ǃ¤#ƒì ƒ ¤#PèJ‡ƒÃF‰;ƃ¤#ƒÄ‰Æþÿ~±Çø¿#ÿÿÿÿÇÐÄ#ƒìjhС"è:ªÿÿƒÄeô[^_]ÍvU‰åVS‹uú>ÿw‹Õ)Ѐ<…¤#uèÉcÇû¸ÿÿÿÿënvƒì ‹Õ)л¤#ÿ4ƒèUKƒÄ@P‹Õ)Ðÿ4ƒè1¯ÿÿ‹Õ)ÐÆDƒ‹Õ)ЋÐÄ#‰…¤#‹£ÐÄ#ƒÄû¸eø[^]ÉöU‰åƒì‹Mú9ÿw‹Õ)Ѐ<…¤#uècÇû¸ÿÿÿÿëb‰ö‹Õ)Ѓ<… ¤#ÿtèîbÇû¸ÿÿÿÿë8‹Õ)ÐÆ…¤#‹Õ)ЋÐÄ#‰…¤#‹£ÐÄ#û¸ÉÉöU‰åSƒì‹M‹] 9ÿw‹Õ)Ѐ<…¤#uèubǸÿÿÿÿë_ú‹Õ)ÐÁàƒ¸ ¤#ÿu ‹€¤#‰ë7‰öÇ‹Õ)Ћ… ¤#¹hâ#vÿ @‰ÐÁà)ЋDÁPƒøÿuëû¸‹]üÉÃU‰åVS‹u‹M¸ùÿ‡–ú‹ÐÄ#‰ƒúÿtnÕ)Ћ…¤#£ÐÄ#‹Õ)л¤#ǃ‹Õ)Љ …¤#ƒì ‹Õ)Ѝ… ¤#P艄‹Õ)ÐÆDƒƒÄëègaÇû¸ÿÿÿÿëû¸eø[^]ÍvU‰åƒì‹M9ÿw‹Õ)Ѐ<…¤#uèaǸÿÿÿÿë=ú‹Õ)Ѝ…¤#ƒx ÿuƒxuèì`Ç û¸ÿÿÿÿë ‰öÿHû¸ÉÐU‰å‹E@‰ÂÁâ)¸fƒ<Ոâ#”À]ÐU‰åVS‹][‰ÐÁà)Ѝ4Åfƒ¾ˆâ#uAƒì‹ÝÀ#Õ)Ѝ… ¤#PS舃‹†dâ#ƒÄ‹…Àá#SPÿRD¸ƒÄ됸eø[^]ÃU‰åVSƒ=”]#…ÚÇ”]#¹» ¨%¾$¨%‰ÁàP ÆÇ2ÿÿÿÿÆDAƒùváƒìjjhàÄ#èÜýÿÿ¹ƒÄ¾„ª%»€ª%‰ö‰ÁàQ‰0Ɖуù -véÇ´¬%ÿÿÿÿÆ°¬%Çxª%¹¾ä¬%»à¬%vÍ)ÈÁàQ‰0ƉуùvãÇ°%ÿÿÿÿÆ °%Ç(°%eø[^]ÐU‰åWVSƒìŠEˆEóŠUˆUòfÇEæ¾<u€út €}óu€}òuè_Ǐ¸ÿÿÿÿé7‰öúƒ=xª%ÿuèí^ǍûÇEìÿÿÿÿ됡xª%€‹Մª%‰xª%û‰Eìƒ}ìÿu -¸ÿÿÿÿéìvƒì hàÄ#ègñÿÿƒÄ‹]¾¹º÷ñ‰×ëf‰ö¿€<Å@¨%t0ƒìÿu¿ōƒ ¨%Pè³EƒÄ…Àu€»8¨%„Ÿ¾ëG¹‰øº÷ñ‰×fÿEæfƒ}懜‰ó„Ût–¿Áãƃ@¨%ƒìÿuƒ ¨%Pè÷D‹E쉃4¨%ƒÄ€}óu‰Â’‹] f‰ňª%ëv‹E썀‹E ¯Ef‰Ոª%úƒì ‹U썒Áã·ƒˆª%PèݨÿÿºŒª%‰ƒÄû…Àu%è”]ǒƒì hàÄ#èAõÿÿ¸ÿÿÿÿ魍v‹E썀ÁãS‰Uྀª%‹ƒŒª%‰‚„ª%‰2ƒìjjƒœª%Pè:ûÿÿƒÄ ·D3Pjƒ ª%Pè#ûÿÿƒÄ jjÃ¤ª%SèûÿÿŠ]ó‹Eàˆ\0ƒÄúƒ=(°%ÿuèø\ǎûÇEèÿÿÿÿë¡(°%Å)‹•ä¬%‰(°%û‰Eèƒ}èÿu_ƒì hàÄ#èvôÿÿ‹Eèéä‰öè§\ǐƒì hàÄ#èTôÿÿ¸ÿÿÿÿéÀ‰öèƒ\Ǒƒì hàÄ#è0ôÿÿ¸ÿÿÿÿ霉ö‹EèÁà+EèÁà¹à¬%ŠUòˆT P‹]ì‰
-‹] f‰\
-ǀä¬%ÿÿÿÿ‰ºè¬%‹]썛ÆՀª%ƍ¿ōr¿ ¨%€|>t%ƒì¶D>Pš<¨%SèGõÿÿÆD>‰$èšøÿÿƒÄƒì hàÄ#èŽóÿÿ¿EèƒÄeô[^_]ÍvU‰åWVSƒìŠEˆEóŠ]ÇEè¿ÆEç<u„Ût €}óu€ûuè‚[Ǐ¸ÿÿÿÿé0‰öúƒ=(°%ÿuèa[ǎûÇEìÿÿÿÿë ¡(°%Å)‹•ä¬%‰(°%û‰Eìƒ}ìÿu ¸ÿÿÿÿéߐ‹EìÁà+EìÁàºà¬%ˆ\ ‹M f‰Lǀä¬%ÿÿÿÿƒì hàÄ#è°íÿÿƒÄ‹U¾¹º÷ñ‰Öë]v¶€<Å@¨%u ¿ÆEçë8ƒìÿu¶Å ¨%PèöAƒÄ…Àu¿ëF¹‰ðº÷ñ‰ÖÿEèƒ}è‡Ò‰ù„Ét €}çuR¶Á㸠¨%ÆD ÆDƒìÿuPè>AƒÄ jjÃ<¨%Sè/øÿÿÇ$àÄ#èçñÿÿƒÄ jjSè:ïÿÿëM¶ōCº ¨%€|t'þDƒì hàÄ#è®ñÿÿƒÄ jjƒ<¨%Pèûîÿÿ됃ì hàÄ#è‹ñÿÿƒÄ¶‹<Å4¨%¿ŠUó:Řª%tèªYǓ¸ÿÿÿÿéX‰ö€}óu¿·ňª%9E u€}ót(¿·ňª%™÷} …ÒtèdYǔ¸ÿÿÿÿéƒì hàÄ#è ìÿÿ¶‹ÅD¨%ƒÄƒúÿ„­€}óu#è&YǕƒì hàÄ#èÓðÿÿ¸ÿÿÿÿéЍÕ)з…ô¬%9E t"èíXǔƒì hàÄ#èšðÿÿ¸ÿÿÿÿ鋋MìÁá+M썶Å »$¨%‹‰ä¬%‹Mì‰ ë/‰öèŸXǑƒì hàÄ#èLðÿÿ¸ÿÿÿÿë@¶‹Uì‰ÅD¨%ƒì hàÄ#è*ðÿÿ‹EìÁà+EìÁàH‰±è¬%ºà¬%‰<Æ¿EìƒÄeô[^_]ÉöU‰åWVSƒì¿E‰Eì‰ÇÁç)ÇÁ獗à¬%‰UðhàÄ#èÏêÿÿ‹Mð‹Y›ÁãC‰Eèº$¨%‹€Áà°€ª%ƀ€ª%F‰$èôÿÿF ‰$è„ôÿÿF$‰$èyôÿÿƒÄú·FPÿv èX£ÿÿû¹$¨%‹Eè‹ú ’¡xª%‰̈́ª%‰xª%ûƇà¬%ƒÃ ‹Uð‹B‰ƒ$¨%ú¡(°%‰‡ä¬%‹Mì‰ -(°%ûƃ ¨%Ç$àÄ#è
-ïÿÿƒÄeô[^_]ÍvU‰åWVSƒì ‹u ŠM¿UÕ)Ѝ…à¬%‰Eð‹@€ŀª%‹Eð€x uèûVǔ¸ÿÿév€;uèÞVǖ¸ÿÿéù‰ö€{tQ€{u,ƒì¶ÁP‹Uð·BPC PèÈëÿÿƒÄ…Àt;¸évƒì¶ÁP‹Uð·BPC PèœëÿÿƒÄ…ÀuÔƒì CPè-éÿÿƒÄ‹Uð·B‹{‰ÁÁéüó¥¨tf¥¨t¤·B‰ÁK‰K·S‰ÐC 9Ár‰È)ЉC€{u ƒì CPë8‰ö€{uƒì‹Uð·BPC$PèZïÿÿëƒì‹Uð·BPC$PèDïÿÿC‰$èíÿÿƒÄ¸eô[^_]ÐU‰åWVSƒì ‹} ŠM¿UÕ)Ѝ…à¬%‰Eð‹@€ŀª%‹Eð€x uè‹Uǔ¸ÿÿév€;uènUǖ¸ÿÿéù‰ö€{tQ€{u,ƒì¶ÁP‹Uð·BPC$PèXêÿÿƒÄ…Àt;¸évƒì¶ÁP‹Uð·BPC$Pè,êÿÿƒÄ…ÀuÔƒì CPè½çÿÿƒÄ‹Uð·B‹s‰ÁÁéüó¥¨tf¥¨t¤·B‰ÁK‰K·S‰ÐC 9Ár‰È)ЉC€{u ƒì CPë8‰ö€{uƒì‹Uð·BPC Pèêíÿÿëƒì‹Uð·BPC PèÔíÿÿC‰$è-ìÿÿƒÄ¸eô[^_]ÐU‰åSƒìh6#è;ƒÄÿ5xª%h+6#è;»ƒÄÝ)ØÁà€¸à¬%t8à¬%‹B€ŀª%ƒì ÿp ÿp$‹B€Å ¨%PSh?6#è®:ƒÄ Cƒûv­‹]üÉÃU‰åƒì`¿MÍ)ȋ…ð¬%’ŀª%ÿp ÿp$RQh`6#E¨Pèf:ƒÄ ÉÐU‰åSƒì‹]hàÄ#èHæÿÿ¿ÓÕ)Ѝ …‹ø¬%€Å ƒÄ€º ¨%u ‹ä¬%‰‚$¨%¿ÃÅ)ÂÁâƂà¬%ú‹ -(°%‰Šä¬%£(°%ûƒì hàÄ#èÓêÿÿƒÄ‹]üÉÍvU‰åWVSƒì ‹u ‹E‹<… â#ú‹^…Ûu-ƒì j èžÿÿƒÄ…ÀtÇÿÿÿÿÇ@Ç@ÿÿÿÿ‹U‰‰F‹;Œá#u û¸#é~ƒ;ÿtc¾`â#‰ö‹ -Œá#I‰ÐÁà)Ћ‰TÆP‹C‰„¬¡Œá#‰CÿCè…ÿÿ¡Œá#@‰ÂÁâ)ƒì ¿DÖPèŸ'èöŽÿÿƒÄûúƒ;ÿu¤¡Œá#ÿD‡D¡Œá#‰û¸eô[^_]ÉöU‰åWVSƒì ‹E ‹x¸…ÿ„À‹;Œá#tû¸髍vúè*'‹Œá# [‰ÊÁâ)Êf‰Õhâ#‹E‹… â#ÿL˜DÇÿÿÿÿ‹_ÇGÿÿÿÿƒûÿt-p ‰Ù[‰ÐÁà)ЉÅ°â#‹œž DŽŽ ÿÿÿÿƒûÿuÖÇGè„ÿÿ¡Œá#@‰ÂÁâ)ƒì ¿Õhâ#Pè¢&èùÿÿƒÄû¸eô[^_]ÃU‰åVSƒì hÄ6#è~ÿÿè -™ÿÿ‰ÆÇ$èKœÿÿ‰Ã‰µ â#ƒÄ jhØ6#Sè"8fÇCÍÆCÇCÇC²"ÇC \²"ÇC$h²"ÇC(p²"ÇC, ²"ÇC0̲"ÇC4³"ÇC8t¯"ÇC<\³"ÇC@\°"ºƒÄsK •ÇD@DŽ ÿÿÿÿBú™~ݍeø[^]ÉöU‰åVS‹E‹… â#ƒì h 6#è7¾ƒÄƒÃƒìÿt³@h¿6#èû6ƒÄFþ™~ãeø[^]ÃU‰å¸ÿÿÿÿ]ÉöU‰å]ÍvU‰åƒì‹E‹U ‹… â#ƒÀƒ|@tƒìRj
-èȽÿÿƒÄÉÍvU‰å‹U :t ‹E -9u
-¸ëv¸ÿÿÿÿ]ÐU‰åSƒì‹] j èӚÿÿ‰ÂƒÄ¸ …Òt!ÇÿÿÿÿÇBÇBÿÿÿÿ‹E‰‰S¸‹]üÉÍvU‰åSƒì‹] ‹Cƒxt ¸ë&‰öúƒ{tƒìj ÿsèäšÿÿÇCƒÄû¸‹]üÉÍvU‰åWVSƒì ‹}‹u ú‹^…Ûu*ƒì j è3šÿÿƒÄ…ÀtÇÿÿÿÿÇ@Ç@ÿÿÿÿ‰>‰Fƒ;ÿt
-û¸ë"‰ö¡Œá#‹½ â#ƒÂÿD‚@¡Œá#‰û¸eô[^_]ÃU‰åWVSƒì ‹E ‹U‹• â#ú‹p¸…ö„V‹;Œá#u û¸#éA‹Œá#‹F ¿`â#;„“°v -¸é v¡Œá#‹Œƒ°‹“¬…Òt‰ö‹;Œá#…Š‹R…Òu븅À…†‹ -Œá#I‰ÂÁâ)‹ƒ¬‹‰D×P‹ƒ¬‹@‰„‹‹“¬¡Œá#‰B‹ƒ¬ÿ@èj€ÿÿ¡Œá#@‰ÂÁâ)ƒì ¿D×Pèù"èPŠÿÿƒÄûúéRÿÿÿ‰ö¸;J ’Àérÿÿÿ‹E‹… â#¡Œá#ÿDƒD¡Œá#‰¹‹ƒ¬‹V ë‰ö‰Á‹A…Àt;P sò…Ét‰q됉³¬…Àt‰p‰F‰Nû¸eô[^_]ÍvU‰åWVS‹}‹E ‹ ½ â#ú‹X¸…Û„Ù‹;Œá#uû¸#éčv‹Œá#‹C ;„‘°s
-¸饡Œá#‹´°‹‘¬…Òt‰ö‹;Œá#u‹R…Òu︅Àuû¸ëk‰ö¸;r ’Àëåv‹ ½ â#¡Œá#ÿDD¡Œá#‰¾‹¬‹S 됉ƋF…Àt;P sò…öt‰^됉™¬…Àt‰X‰C‰sû¸[^_]ÉöU‰åWVSƒì ‹E ‹x¸…ÿ„ï‹;Œá#tû¸éڍvúè&!‹Œá# [‰ÊÁâ)Êf‰Õhâ#‹E‹… â#‰EðÿL˜DÇÿÿÿÿ‹_ÇGÿÿÿÿƒûÿt2‰ÆƒÆv‰Ù[‰ÐÁà)ЉÅ°â#‹œžDŽŽÿÿÿÿƒûÿuÖÇG‹O‹W…Éu -‹Eð‰¬ë‰ö‹G‰A…Òt‹G‰Bèã}ÿÿ¡Œá#@‰ÂÁâ)ƒì ¿Õhâ#Pèo èƇÿÿƒÄû¸eô[^_]ÐU‰åVSƒì h7#èJ—ÿÿèْÿÿ‰ÃÇ$€è–ÿÿ‰Æ‰4 â#ƒÄ jh7#Vèî1fÇFÌÆFÇFÇF¹"ÇF œ¹"ÇF$ȹ"ÇF(ø¹"ÇF,@º"ÇF0lº"ÇF4ĺ"ÇF8Ô³"ÇF<\µ"ÇF@`¶"ºƒÄ^N•ÇD@DŽ°ÿÿÿÿDŽÿÿÿÿBú™~Òdž¬eø[^]ÐU‰å‹U‹M ¸ÿÿÿÿ…Òt;‹‹… â#ƒxu‹@%ÿÿÿ=Ìu…Ét ‹B‹@ ‰ë
-‰ö¸ÿÿÿÿ됸]ÐU‰å‹U‹M¸ÿÿÿÿ…Òt@‹‹… â#ƒxu‹@%ÿÿÿ=Ìt¸ÿÿÿÿ됅Ét‹B‹@ ‰‹R‹E ‰B ¸]ÃU‰å‹E‹M ‹U‹… â#‰”ˆ°]ÃU‰åWVSƒì‹E‹<… â#h 6#è0»ƒÄwƒìÿtž@h¿6#èó/ƒÄCû™~ãƒì hâ6#èÚ/»ƒÄ‰öƒìÿ´Ÿ°hþ6#è¼/ƒÄCû™~àeô[^_]ÃU‰å‹U :t ‹E -9u
-¸ëv¸ÿÿÿÿ]ÐU‰åS‹E‹U ‹]‹ … â#Áâ‹C‰„°ÇD
-D‹$ÉÉöU‰åVS‹E‹u ‹… â#ƒ|³DtƒìVj
-èD¶ÿÿƒÄë vÇD³DDŽ³°ÿÿÿÿeø[^]ÉöU‰å‹U :t ‹E -9u
-¸ëv¸ÿÿÿÿ]ÐU‰åSƒì‹] jè3“ÿÿ‰ÂƒÄ¸ …Òt1ÇÿÿÿÿÇBÇBÿÿÿÿ‹E‹@‰B ÇB‹E‰‰S¸‹]üÉÍvU‰åSƒì‹] ‹Cƒxt ¸ë&‰öúƒ{tƒìjÿsè4“ÿÿÇCƒÄû¸‹]üÉÍvU‰åWVSƒì$·]Sh"7#è .‰Ø-yƒÀÁèƒÄ ·À‰Eè@ÛÁã¿à¼%ÿt8CP‰Eä·8Ph)7#èá-ƒÄ ÿt;·D;Ph77#èÊ-ƒÄ ÿt; s·>PhH7#è±-ƒÄ ÿt>·D>PhY7#èš-ƒÄ ‹Uä·D:P·DLPhj7#è~-‹UèÕƒÄ·ØSh{7#èc-EóPEòPEìPS蹃ĶUóR¶UòRÿuìPhÀ7#è6-ƒÄ eô[^_]ÍvU‰åWVSƒì ‹E‹U‹]¹‹u ƒî‰ƒî‰ºÀ?&fƒ=À?&yA¿Áfƒ<Byfù™~îfù™~ƒì h7#èÎ,¸ƒÄé ¿Á<¹À?&‰Úf Ê€f‰Ǎ<ÿÁçºà¼%‰tÇD _ÇDfŒÙf‰LfÇfÇDÇD _ ‹M‰ ÇDÇDO0ÇDÇD Ǎ_@ÇÇD‰t‰t fŒÉf‰L fŒÙf‰LfŒÛOPf‰\fŒÛf‰fÇD 0fÇD0O`fÇfÇDfÇDÇL½%¾A&¹üó¥Å˜eô[^_]ÐU‰åVS‹u ¿E-‰Â…ÀyP‰ÐÁø@ÀÁà¹à¼%f‰tX@Vf‰T f‰t ƒÀPf‰tf‰4[^]ÉöU‰å¿E-‰Â…ÀyP‰ÐÁøfDŽÀ?&]ÉöU‰åSƒì‹]¿E Ph¨7#Sè~3‰ØƒÄ‹]üÉÃU‰åVS趉Æès»‰öƒìhÅ"SèƒÄh¾"SèìƒÄCƒû~ۉðeø[^]ÉöU‰åƒìèaÉÍvU‰åSƒì‹]‹˜]#€82uºð°îƒìSh9#èˆ*ƒÄÁ㋃˜]#@Ph]C#èp*ƒÄÿ³Ü]#ènƒÄ‹]üÉÉöU‰åƒìÿuh9#èE*èèûÇ$èG7ƒÄÉÉöU‰åWVSƒì‹E‹} ƒ=$»%„à…ÿ„Ø¡ ±%€€€ źm¶‰È÷â‰È)ÐÑ草ÁÁé
-‰O¡¤±%ÀP‰ÐÁà)кè‰Ó™÷û’’’щW¡¤±%ÀP‰ÑÁá)ѾÓMb‰È÷îÁú‰ÈÁø‰Ó)øƒÞC÷o‰ÑÁù‹GÁø)Á‰È؉‹OÁú‰ÈÁø)’’’’’’Áâ)э ‰ ‰ ‰Áá‰O‹éԉö]è¡ ±%€€€ źm¶‰È÷â‰È)ÐÑ草ÁÁé
-¡¤±%ÀP‰ÐÁà)кè‰Ö™÷þ’’’щS¡¤±%ÀP‰ÑÁá)ѾÓMb‰È÷îÁú‰ÈÁø)‰Uè‹{¸ƒÞC÷ï‰ÑÁù‰øÁø)Á‰ÈEè‰ùÁú‰ÈÁø)’’’’’’Áâ)э ‰ ‰ ‰Áá‰K‹E荀€€€€€‰ÃÁã‰È÷îÁúÁù)ʍéèvƒøuc¸ƒ=”±%…Ρ˜±%€€€€€€‰ÃÁã‹ -œ±%ºÓMb‰È÷êÁúÁù)ÊӅÿ„…¡˜±%‰¡œ±%éqvƒø…綄±%ƒøtƒø…Àt
-ë,ƒøtë%¹@°ë#v¹A°ëv¹B°ë v»ë"ºCÐî‰Êì¶ØìˆÁ‰ÊÁâf¶Ã‰Ó Ãf‹ -±%f)Ù·É - ±%º×®¬]‰È÷êÁú‰ÈÁø)¤±%’BÁà)Ѝ‚‰ÂÁâ Ð)Á‰È£ ±%f‰±%…ÿ„̍€€€ źm¶‰È÷â‰È)ÐÑ草ÁÁé
-‰O¡¤±%ÀP‰ÐÁà)кè‰Ó™÷û’’’щW¡¤±%ÀP‰ÑÁá)ѺÓMb‰È÷êÁú‰ÈÁø‰Ó)Ëw¸ƒÞC÷î‰ÑÁù‰ðÁø)Á‰È؉‰óÁú‰ÙÁù)ʍ’’’’’’Áâ‰Ø)Ѝ€€€Áà‰G‹ ±%’’’4Õ¹Á6ۉð÷é‰Ó3‰ÁÁù
-‰ð™‰È)Ћ -¤±%ɍ‘ÑÁâ)ʉÑÁá)эÈ鍃ø…ƒ=”±%…rU衘±%‰¡œ±%‰B»@¹C°Ò‰Êî‰Úì¶ÈìÁàf¶Ñ з𷠻%9Æv%h&9#j_h89#h?9#èm%Ç$èmƒÄ· »%)󯈱%· »%‰Ø‰Ñº÷ñ‰Ãº °
-îì©t‹ -ˆ±%;ÍÌÌ̉ð÷âÁê9Ós‰Ëu荛€€‹V‰Eä‰F¸¡/¸D÷mä‰ÑÁù‹EäÁø)Á‰ÈEè‹N¸¡/¸D÷éÁú‰ÈÁø)’’’’’’’’’Áâ )щN¡˜±%€€€€€€Áà‰Eä‹ -œ±%ºÓMb‰È÷êÁúÁù)ʋEäÐÅÿt ‰ð‹‰‹@‰G‰Øëv¸eô[^_]ÍvU‰åVSƒìŠEˆE÷ÿD^#ƒ=D^#uƒ= ^#tÿ ^#¶E÷€ÁàºL°%ƒ<uIÇö€P°%tûƒì ¶]÷›Áã¾@°%ÿ43ÿ“D°%ƒÄöDtú¶E÷€Ç…L°%ÿ(^#ƒ=D^#uƒ=$^#tÿ$^#ÿ -D^#eø[^]ÍvU‰åWVSº¿L°%¾H°%»D°%¹@°%’ÁàÇ8‰0ÇÇBƒú~ÜÇD^#[^_]ÐU‰åVS‹U‹] ‹uú’ƒ<…L°%t÷Æu¸ÿÿÿÿëH’ …ǁL°%û…Ût‰™D°%º@°%H°%‰‰t
-됍’Ç…L°%¸[^]ÐU‰å¡D^#]ÉöU‰åSƒì¶„±%ƒøt!ƒø…Àt ë.‰öƒøtë%¹@°ë#v¹A°ëv¹B°ë v»ë"ºCÐî‰Êì¶ØìˆÁ‰ÊÁâf¶Ã‰Ó Ãf‹ -±%f)Ù·É - ±%º×®¬]‰È÷êÁú‰ÈÁø)¤±%’BÁà)Ѝ‚‰ÂÁâ Ð)Á‰ - ±%f‰±%ÿD^#ƒ=D^#uƒ= ^#tÿ ^#¡œ±%‰ÃäÄ#º¡/¸D‰Ø÷êÁú‰ÙÁù)ʘ±%’’’’’’’’’Á⠉Ø)Уœ±%‹€±%ë$‹¡Œ±%‰‰Œ±%‰€±%ƒì ÿrÿRƒÄ‰Ú…Òt‹B ;˜±%;˜±%uƋB;œ±%~»ƒ=D^#uƒ=$^#tÿ$^#ÿ -D^#‹]üÉÃU‰åWVSƒì‹uh`Ó"j@èØ -ƒÄƒ>t,ƒì hY9#èß »ÿÿƒÄ¿@¹C°8‰ÊîˆØ‰úîëaƒì hu9#è³ ‹N‰ -ˆ±%ɍA‰ÂÁâ‰Ñ)ÁºÓMb‰È÷âƒÄ‰ÑÁéu¹f‰ - »%‰Ë¿@¹C°4‰Êî‰úˆØî‰ØfÁèî‹£”±%ƒ=„A&~»A¹C°p‰ÊÚîîÆ„±%ë%Æ„±%»B¹C°°‰ÊÚîîºa°îº!ì%þî¹¾À±%»Ä±%ƒùbIÁàØ±%‰0I‰LÃAƒùc~ßÇ»%ÇŒ±%À±%Ç ^#Ç$^#¡ˆ±%€€€Áà£äÄ#Çœ±%ǘ±%Ç ±%Ǥ±%fǐ±%ƒ=”±%uÇdá#PÊ"Çhá#èÊ"ëÇdá#8Ë"Çhá#ÄÑ"eô[^_]ÃU‰å‹E£ ^#]ÍvU‰å‹E£$^#]ÍvU‰å‹E£0^#]ÍvU‰åWVSƒì ‹E‹U ‰Eè‰Uì¸ÿÿÿÿƒ=Œ±%tl‹ -Œ±%‹£Œ±%‹E‰A‹Eè‰A ‹Eì‰A‹E‰A»‹€±%}è‹uè됋…Òt‰ð;B  -;B u‹G;B~‰Óëâ‰ö…Ût‰ ë‰ -€±%‰‹AƒÄ [^_]ÐU‰å‹E¹‹€±%됉ы…Òt;Buó¸ÿÿÿÿ…Òt$…Éu
-‹£€±%됋‰¡Œ±%‰‰Œ±%¸]ÃU‰åWVSƒì,‹E‹U ‰Eè‰Uì¸ÿÿÿÿƒ=Œ±%„q‹5Œ±%‹£Œ±%‹E‰F‹Eè‰F ‹Eì‰F‹E‰Fº‹€±%}è‹Mè됋…Ût‰È;C  -;C u‹G;C~‰Úëâ‰ö…Òt‰2鐉5€±%ƒ=$»%…ôƒìEàPjè3óÿÿ‹€±%ƒÄ‹Eà;B  -;B u‹Eä;B~ÇEÜÇEØëK}؋€±%Mà‹B;A|‹B +Eà‰E؉Ћ@+Aë ¡€±%‹@ +EàH‰EØ¡€±%‹@+Eäʚ;‰G‹E؍€€€€€€Áà‰EԋMÜ¿ÓMb‰È÷ïÁúÁù)ÊUԍҍB‰ÂÁâ)‰Ð÷çÁê¸ðúðw¸ÈúÇv‰Ðº@îfÁèFeô[^_]ÃU‰åWVSƒì¶„±%ƒøtƒø…Àt
-ë,ƒøtë%¹@°ë#v¹A°ëv¹B°ë v»ë"ºCÐî‰Êì¶ØìˆÁ‰ÊÁâf¶Ã‰Ó Ãf‹±%f)Ú·Ò‰Ö5 ±%¹×®¬]‰È÷î‰ÑÁù‰ðÁø)Á -¤±%‰AÁà)ȍÁ‰ÁÁá ȉò)‰ ±%f‰±%]荒’’ Õ¾m¶‰ð÷á‰Ö‰Ê)òÑê2‰ÁÁé
-¡¤±%ÀP‰ÐÁà)кè‰Ö™÷þ’’’щS¡¤±%ÀP‰ÑÁá)ѺÓMb‰È÷êÁú‰ÈÁø)‰Uè‹s¿ƒÞC‰ð÷ï‰ÑÁù‰ðÁø)Á‰ÈEè‰ðÁú‰ñÁù)ʍ’’’’’’Áâ)Ѝ€€€Áà‰Cƒ=€±%„/Ç$»%‹€±%‹Eè;B ;B …Œ‹C;BŽ€ƒ=D^#uƒ= ^#tÿ ^#ÿD^#‹€±%ë#‹¡Œ±%‰‰Œ±%‰€±%ƒì ÿrÿRƒÄ‰Ú…Òt‹B ;Eè -;EèűB;Eì~ă=D^#uƒ=$^#tÿ$^#ÿ -D^#¶„±%ƒøt"ƒø …Àt -ë/vƒøtë%¹@°ë#v¹A°ëv¹B°ë v»ë"ºCÐî‰Êì¶ØìˆÁ‰ÊÁâf¶Ã‰Ó Ãf‹±%f)Ú·Ò‰Ö5 ±%¹×®¬]‰È÷î‰ÑÁù‰ðÁø)Á -¤±%‰AÁà)ȍÁ‰ÁÁá ȉò)‰ ±%f‰±%]荒’’ Õ¾m¶‰ð÷á‰Ö‰Ê)òÑê2‰ÁÁé
-¡¤±%ÀP‰ÐÁà)кè‰Ö™÷þ’’’щS¡¤±%ÀP‰ÑÁá)ѺÓMb‰È÷êÁú‰ÈÁø)‰Uè‹s¿ƒÞC‰ð÷ï‰ÑÁù‰ðÁø)Á‰ÈEè‰ðÁú‰ñÁù)ʍ’’’’’’Áâ)Ѝ€€€Áà‰C‹€±%‹Mè;J 
-;J u;B~ÇEäÇEàëJ]à‹€±%Mè‹B;A|‹B +Eè‰Eà‰Ð‹@+Aë ¡€±%‹@ +EèH‰Eࡀ±%‹@+Eìʚ;‰C‹Eà€€€€€€‰ÆÁæ‹Mä»ÓMb‰È÷ëÁúÁù)ʍ2ҍB‰ÂÁâ)‰Ð÷ãÁê¸ðúðw¸ÈúÇv‰Ðº@îfÁèîÇ$»%ë -‰öº@°î°ðîeô[^_]ÐU‰åVSƒì‹E»¹‹€±%ëv‰Ñ‹…Òt;Buó¸ÿÿÿÿ…Ò„I…Éu‹£€±%»ë‹‰¡Œ±%‰‰Œ±%ƒ=$»%…ƒ=€±%uº@°î°ðéû‰ö…Û„òƒìEðPjèºìÿÿ‹€±%ƒÄ‹Eð;B  -;B u‹Eô;B~ÇEìÇEèëJ]è‹€±%Mð‹B;A|‹B +Eð‰Eè‰Ð‹@+Aë ¡€±%‹@ +EðH‰E血±%‹@+Eôʚ;‰C‹E荀€€€€€‰ÆÁæ‹Mì»ÓMb‰È÷ëÁúÁù)ʍ2ҍB‰ÂÁâ)‰Ð÷ãÁê¸ðúðw¸ÈúÇv‰Ðº@îfÁèeø[^]Éöú‹D$¼èÔ#PèŒëÿÿ`fff f¨f¸0ŽØŽÀ° º î¡,^#@£,^#1ÛfŒÓü¡”±%ƒøtèùòÿÿëè6ùÿÿ°
-º îì¨t ¸@Pè–ÿÿÿf¡4^#f9:^#t f£:^#ÿ-6^#ƒ=0^#t‹0^#ÿÓf©f¡ffaωöU‰å‹EØf£:^#f£4^#]Ã1ÀÈÃU‰åf¸0ŽØŽÀ‹Ef;:^#t f£:^#ÿ-6^#]ÉöU‰åƒìjjjj@èaƒÄÉÃU‰åWVSƒì ‹]‹u ‹}聉€:y"…Ût‹B8‰…öt‹BÁà
-‰…ÿt)‹B4‰ë"‰ö…ÛtÇ…öt‹BÁà
-‰…ÿtÇ@ƒ}t ‹BÁà
-‹U‰ƒÄ [^_]ÍvU‰åƒìjjjj@è̓Ä·@0ÉÃU‰å¡ø[#]ÉöU‰å]ÍvU‰åSƒì‹ø[#誃ì Sèucÿÿè ƒÄ‹]üÉÃU‰åWVS‹M ‹u‹}Š]‰ÈÁàeèÿÿ Eè‰ÈÁèUèˆBáÿbÿÿÿ J‰ðˆB‹Ef‰Eè‹EÁè‰EäŠEäƒà ÃË@¶ÃÁàbÿÿÿ Bçüÿ=ê[#‹‰‹B‰G[^_]ÐU‰åWVSƒì ‹] ‹u‹}·EMèê[#‹‰‹@‰A‰Ê¶JÁá¶B ÁÁá·B Á…ÛtŠBƒà¶ÐÁâ·Eè Љ…ötŠE툅ÿt
-ŠEî%ðˆ‰ÈƒÄ [^_]ÉöU‰å‹E ¶UÁâ¹_#fÇD
-8Ƃ_#îƂ_#f‰
-Áèf‰D
-]ÍvU‰åº °îº!°@î°î°î°ÿ°°pî°î°î°ÿî]ÐU‰åº °îº!°î°î°î°ÿ°°pî°î°î°ÿî]ÐU‰å‹Mf…ÉtWfƒùw¸Óà
-@^#ë7fƒùw<·Éƒé¸Óà
-A^#¢A^#º¡î<ÿu @^#©uƒÈ¢@^#º!î]ÃU‰å‹Mf…ÉtUfƒùw¸þÿÿÿÓÀ"@^#ë5fƒùw:·Éƒé¸þÿÿÿÓÀ"A^#¢A^#º¡î @^#©t%û¢@^#º!î]ÉöU‰å¿4^#]ÃU‰åƒì‹Ef£4^#˜PèWüÿÿƒÄÉÐU‰å¿4^#]ÃU‰åƒì‹E‰Âf£4^#ƒ=D^#uƒì ¿ÂPèüÿÿƒÄÉÐU‰åWVì¾¹L^#ºŒ^#‰öµÇ€Û"Ç€Û"Fƒþ~åƒì EÈPèÅèºÇ€A&Á9#‹EÈ£„A&¶H^#£ˆA&ƒÄ‹EУA&‹EÔ£”A&‹EØ£˜A&h)Ý"jè£ýÿÿƒÄh3Ý"jè”ýÿÿƒÄh=Ý"jè…ýÿÿƒÄhDÝ"jèvýÿÿƒÄhKÝ"jègýÿÿƒÄhRÝ"jèXýÿÿƒÄhYÝ"jèIýÿÿƒÄhŸÝ"jè:ýÿÿƒÄh`Ý"jè+ýÿÿƒÄhgÝ"j èýÿÿƒÄhnÝ"j
-è -ýÿÿƒÄhuÝ"j èþüÿÿƒÄh|Ý"j èïüÿÿƒÄhƒÝ"j -èàüÿÿƒÄhŠÝ"jèÑüÿÿƒÄh‘Ý"jèÂüÿÿƒÄh˜Ý"jè³üÿÿƒÄhXÜ"jAè¤üÿÿƒÄh`Ü"jBè•üÿÿƒÄhhÜ"jCè†üÿÿƒÄhpÜ"jDèwüÿÿƒÄhxÜ"jEèhüÿÿƒÄh€Ü"jFèYüÿÿƒÄhˆÜ"jGèJüÿÿƒÄhÜ"jpè;üÿÿƒÄh˜Ü"jqè,üÿÿƒÄh Ü"jrèüÿÿƒÄh¨Ü"jsèüÿÿƒÄh°Ü"jtèÿûÿÿƒÄh¸Ü"juèðûÿÿƒÄhÀÜ"jvèáûÿÿƒÄhÈÜ"jwèÒûÿÿf -ô@&€¾ƒÄvÀÅà¼%ƒì jh‰hØPõ·ÀPèúÿÿƒÄ Fþš~ǃì hÐèFùÿÿƒÄÛãݵTÿÿÿ›¿A&µTÿÿÿ¹üó¥ ÀƒÈ""ÀÛãèƒûÿÿèúÿÿeø^_]ÍvU‰åSƒìº!°ÿîè’ûÿÿ¹@ºC°6Êîîƒ=„A&~¹AºC°tî°‰Êî°ë»B¹C°°‰ÊÚîîºaî‹]üÉÃU‰å‹U‹E ‰•Œ^#]ÉöU‰å‹U‹E ‰•L^#]ÉöU‰åƒìh 9#è
-è— ƒÄÉÉöœX‰Á5PœX9ÈtQ¸Ã¸ÜX‰Á5 PœX1ÈtQ¸øÃf1Àžf¸f»öóŸ€üu¸øÃÆH^#Ûã¹âþfÇJ^#ZZÝ=J^#¹âþf¡J^#<u+Ù=J^#¹âþf¡J^#f%?fƒø?uÆH^#ÆH^#Éö`¸ëp`¸ëh`¸ë``¸ëX`¸ëP`¸ëH`¸ë@`¸ë8`¸ ë0`¸
-ë(`¸ ë `¸ ë`¸ -ë`¸ë`¸ë ¨Pf¸0ŽÀŽØüX1ÛfŒÓP‹…L^#ÿÓ[° ƒûrº îº îf¡4^#f;:^#t f£:^#ÿ-6^#©¡aϸ鋸選ëz¸ës¸ël¸ëe¸ë^¸ëW¸ ëP¸
-ëI¸ ëB¸ ë;¸ -ë4¸ë-¸ë&¸ë` ¨f¸0ŽÀŽØüèש¡aÏPf¸0ŽØŽÀXfŒÓ‹=ê[#ß1ۊŠ_Áãf‹_ÜfŒÒfŒÛŽÓSRPÿ…Œ^#ƒÄX[ŽÐ)ÜÏU‰åWVSƒì ‹u¸¹ ‰÷üó«è|ýÿÿ…ÀtÇëUèŠýÿÿ…Àt7ÇFǸ¢‰^‰N‰V …Àt+¸¢‰F‰^‰N‰V ëÇècýÿÿ…ÀtÇ ƒÄ [^_]ÍvU‰åWV¿Ì^#È·À-yƒÀÁø9ÂtU¿Ì^#@ÀÝ4ÅL½%›È·À-yƒÀÁøf£Ì^#¿5Ì^#¿ÀA&4v4ö4õL½%¹üó¥Ý%ÀA&^_]ÉöU‰å¿Ì^#]ÃU‰åWVSƒì(ŠM¡Ð^#Áà ˜€ f¶.B&f£êÔ#f¶-B&f£ìÔ#€ù t%€ù €ù„óé‰ö€ù
-„#é‰öfƒêÔ#·êÔ#;0B&Œ½fÇêÔ#·ìÔ#¡4B&H9Â…¿¡0B&H‰Eì‰Uèf¾,B&Áâf‰Uò¡Ð^#Áà °€ ¿;}è:¹;Mì*_ÿv‰ø¯0B&È·F‰Ø¯0B&Èf‰FA;Mì~ÜG;}è~ƹ;MìKWÿ‰Ð¯0B&Èf‹]òf‰FA;Mì~çé)‰öfÇèÔ#·êÔ#‰Áƒø~ºƒÂ·ÂƒÀ9È|óf‰èÔ#f¡èÔ#f£êÔ#éævfÇêÔ#·ìÔ#¡4B&H9Â…¾¡0B&H‰Eà‰UÜf¾,B&Áâf‰Uæ¡Ð^#Áà °€ ¿;}Ü=v¹;Mà*_ÿv‰ø¯0B&È·F‰Ø¯0B&Èf‰FA;Mà~ÜG;}Ü~ƹ;MàGWÿ‰Ð¯0B&Èf‹]æf‰FA;Mà~çé%‰öfÿ -êÔ#·êÔ#·ìÔ#¯0B&ÂÆS fÿêÔ#éõ‰ö·êÔ#·ìÔ#¯0B&Ј CfÿêÔ#·êÔ#;0B&Ž¿fÇêÔ#·ìÔ#¡4B&H9Â…š¡0B&H‰EԉUÐf¾,B&Áâf‰UÚ¡Ð^#Áà °€ ¿;}Ð=v¹;MÔ*_ÿv‰ø¯0B&È·F‰Ø¯0B&Èf‰FA;MÔ~ÜG;}Ð~ƹ;MÔ'Wÿ‰Ð¯0B&Èf‹]Úf‰FA;MÔ~çëfÿìÔ#·5êÔ#·=ìÔ#‰øf¯0B&f‰EΡÐ^#Áà fEÎfuλÔ°‰Úî¹Õ‰ÊŠEÎî°‰Úîf‹EÎfÁè‰Êî‰óˆ.B&‰ø¢-B&ƒÄ([^_]ÐU‰åWVSƒì‹u‹} ‰øf¯0B&f‰Eò¡Ð^#Áà fEòfuò»Ô°‰Úî¹Õ‰ÊŠEòî°‰Úîf‹EòfÁè‰Êî‰ð¢.B&‰úˆ-B&ƒÄ[^_]ÍvU‰åS¹Ô°
-‰Êî»Õ‰ÚŠEî° ‰Êî‰ÚŠE î‹$ÉÍvU‰åWVSƒìf¾EÁàf‰Eò¡Ð^#Áà ¸€ ‹]ë0‹M ;M(sÿ‰Ø¯0B&È·G‰ð¯0B&Èf‰GA;M~ÜC;]~ʋM ;MSÿv‰Ð¯0B&Èf‹]òf‰GA;M~çƒÄ[^_]ÍvU‰åWVSƒì ¡0B&H‰Eð‹4B&K‰]ìf¾,B&Áàf‰Eê¡Ð^#Áà °€ ¿9ß<‰ö¹;Mð*_ÿv‰ø¯0B&È·F‰Ø¯0B&Èf‰FA;Mð~ÜG;}ì~ƹ;MðWÿ‰Ð¯0B&Èf‹]êf‰FA;Mð~çƒÄ [^_]ÍvU‰å·J‰0B&¶„@£4B&¶„ÿ ¢,B&¶P¢.B&¶Q¢-B&¶`¢ïÔ#¶a¢îÔ#ÇÔ^#ÇÐ^#]ÃU‰åWVSƒì .B&¢P -B&¢Q¶ÀP¶.B&PèŠýÿÿ¶îÔ#¶5ïÔ#ƒÄ¹Ô°
-‰Êî¿Õ‰úˆØî° ‰Êî‰ú‰ðîeô[^_]ÍvU‰åSƒì‹]€;tŠCƒì ¾ÀPèiùÿÿƒÄ€;ué‹]üÉÃU‰åVS‹E‰ÃÁã £Ô^#¹Ô° -‰Êî¾Õ‰òˆØî° ‰Êî‰ØfÁè‰òî[^]ÃU‰åVS‹u‹Ð^#Áâ»Õ#¶.B&‰¹ Õ#¶-B&‰
-µŠ¢.B&Š
-¢-B&‰5Ð^#[^]ÃU‰å¡Ô^#]ÉöU‰å¡Ð^#]ÉöU‰åWVSƒì ‹}f¾u Áæf¾E Ƌ]‹E9Ã3v‹M9ù#‰Ê¯0B&¡Ð^#Áà ÐØf‰´€ A9ù~ÞC;]~ЃìÿuÿuèüÿÿŠE¢-B&ŠE¢.B&ƒÄeô[^_]ÍvU‰åWVSƒì ¡0B&H‰Eð‹=4B&Of¾,B&ÁãƒË ¾9Æ4¹9ù%v‰Ê¯0B&¡Ð^#Áà Ððf‰œ€ A9ù~ÞF;uð~̃ìjjèûÿÿÆ-B&Æ.B&ƒÄeô[^_]ÍvU‰åS‹U ‹]‹M¯0B&¡Ð^#Áà ÂU”€ ˆ
-ˆZ‹$ÉÉöU‰åS‹E ‹]‹M‰Â¯0B&¡Ð^#Áà ÂU”€ ¶B…Étˆ¶‰Â…Ûtˆ¾Â‹$ÉÐU‰åS‹E ‹MŠ]‰Â¯0B&¡Ð^#Áà ÂU”€ €9tŠˆABˆB€9uò‹$ÉÐU‰åƒìhÜ9#èTýÿÿôƒÄÉÉöU‰åƒìjèƒÄÉÉöU‰åƒìh4èƒÄÉÍvU‰åVS‹Ef£r¹d»þ¾v‰Êì©t Fþÿÿ~í¸@=Ÿ†~ø‰ÚˆÈö@=Ÿ†~øë‰öU‰åSƒìE Pÿuh@Õ#èX‰ÃÇ$@Õ#è¢üÿÿ‰ØƒÄ‹]üÉÃU‰åWVSìð‹} ŠEˆ…ÿÿÿEPÿuÿÿÿSè‰ÆS¾…ÿÿÿPWÿuè±þÿÿ‰ðƒÄ eô[^_]ÃU‰åSƒìE Pÿuh@×#謉ÃÇ$@×#è&üÿÿ‰ØƒÄ‹]üÉÃU‰åS‹M‹U ‰Ë€:tvŠˆBA€:uõƉ؋$ÉÍvU‰åVS‹]‹U ‹M‰Þë‰öŠˆBC€:t‰ÈI…ÀîƉð[^]ÐU‰å‹U‹M ë -¸€:tBAŠ:t)Ð]ÃU‰åS‹U‹] ‹M…Éëv¶¶Sÿ)Ð됊C8uíŠB„ÀtIu︋$ÉÐU‰å‹U¸€:tB@€:uù]ÍvU‰åS‹E‹] €8t‰Ú€:tŠv:
-tB€:uö@€8u下$ÉÉöU‰å‹E‹U €8t ‰ö8t @€8uö¸]ÍvU‰åS‹]‰Ú€;t‰öŠ
-AŸ<wAàˆB€:uì‰Ø‹$ÉÐU‰åS‹]‰Ú€;t‰öŠ
-A¿<wA ˆB€:uì‰Ø‹$ÉÐU‰åS‹U‹M ‰Ó€;tvB€:uú늈AB€9uõƉ؋$ÉÍvU‰åWVSƒì<‹u‹]ÇEèÇEäÇEàÇEÜÇEØÇEÔÇEпÇEÌÙîÝ]À‰uì‹E €8„D‹U €:%t…ÿuŠˆB‰U FÿEèév‹E €8%u%@‰E ¿ÇEä
-ÇEàÇEØÇE̋U ¾ƒè%ƒøS‡Ñÿ$…€(#‰öÆ%FÿEè鼃ÉòFŠCüˆÿEè驐ƒ}Øt"ƒ}؃}Øtëƒ}ØuƒÃ‹Cü‰EÔë -vƒÃ¿Sü‰Uԃì ÿuÌÿuäj
-VÿuÔè¾ éœƒ}Øt"ƒ}؃}Øtëƒ}ØuƒÃ‹Cü‰EÐë -vƒÃ·Sü‰UЃì ÿuÌÿuäj
-VÿuÐè.éPƒ}Øt"ƒ}؃}Øtëƒ}ØuƒÃ‹Cü‰EÐë -vƒÃ·Sü‰UЃì ÿuÌÿuäjVÿuÐèâ鐃ËCü‰EЃì jÿuäjVPèÂé䐃ËSü€:tŠˆBFÿE܀:uò‹UÜUèévƒ}Øtƒ}؃}Øtëƒ}Øu ƒÃÝCøÝ]ÀƒìÿuÌÿuàÿuäVÿuÄÿuÀèYë~vƒ}Øtƒ}؃}Øtëƒ}Øu ƒÃÝCøÝ]ÀƒìÿuÌÿuàÿuäVÿuÄÿuÀè} -ë>vƒ}Øtƒ}؃}Øtëƒ}Øu ƒÃÝCøÝ]ÀƒìÿuÌÿuàÿuäVÿuÄÿuÀèa‰EÜEèÆ¿ƒÄ é±ÇEØé¥ÇEØ陃MÌ鐍vƒMÌ鄍v¿ƒMÌëvƒÿu?ƒìEìPj
-ÿu èb
-‰EäƒÄ‹E €80u ÷EÌtƒMÌ됃MÌ‹UìJ‰U ë4vƒÿu,ƒìEìPj
-ÿu è
-‰Eà‹EìH‰E ¿ƒÄë‰ö¿ÿE ‹U €:…¼üÿÿÆ‹Eèeô[^_]ÉöU‰åƒì EPÿu ÿuè7üÿÿƒÄÉÉöU‰åWVSƒì,‹u‹} ‹]ÇEìÇEèÇEäÇEàÇEÜÇEØÇEÔÇEЉuð€?„>€?%tƒ}Ôu ŠˆGFÿEìëá€?%uGÇEÔÇEè
-ÇEàÇEоƒè%ƒøS‡çÿ$…Ð)#Æ%FÿEìéԃÉòFŠCüˆÿEìéÁƒ}àt&ƒ}àƒ}àt
-ë"ƒ}àt
-ëƒÃ‹CüëƒÃ‹CüëƒÃ¿Cü‰E܃ì ÿuÐÿuèj
-VÿuÜè鏐ƒ}àt&ƒ}àƒ}àt
-ë"ƒ}àt
-ëƒÃ‹CüëƒÃ‹CüëƒÃ·Cü‰E؃ì ÿuÐÿuèj
-ëBƒ}àt&ƒ}àƒ}àt
-ë"ƒ}àt
-ëƒÃ‹CüëƒÃ‹CüëƒÃ·Cü‰E؃ì ÿuÐÿuèjVÿuØè6‰EäEìÆÇEÔƒÄ éҍvƒÃ‹Sü€:tŠˆBFÿEä€:uò‹EäEì飍vÇEàé›ÇEà鏃MÐ醍vƒMÐë}‰öÇEÔƒMÐënvƒ}Ôu6ƒìEðPj
-W蓉EèƒÄ€?0u ÷EÐtƒMÐ됃MЋ}ðOë1‰öƒ}Ôu)ƒìEðPj
-WèW‹}ðOÇEÔƒÄë
-vÇEÔGé¼ýÿÿvÆ‹Eìeô[^_]ÉöU‰åƒì EPÿu ÿuèGýÿÿƒÄÉÉöU‰åWVSƒì,‹}‹uÇEèÇEäÇEàÇEÜÇEØ»‰}ì饐‹U €:%t…Ûu B‰U 鏍v‹E €8%u%@‰E »ÇEäÇEàÇEÜÇE؋U ¾ƒè*ƒøN‡Eÿ$… +#‰öƒû…8ƒìEìPj
-ÿu èN‰E܃MØ‹EìH‰E ƒÄéŠGƒÆ‹^üˆëÝØÿEèéõƒÆ‹^üëG€?tƒì ¾PèBƒÄ…ÀuçÇEÔë#‰ö÷EØuŠˆCë‹UÜ9UÔ}ŠˆCÿEÔG€?tƒì ¾PèþƒÄ…ÀtÇÆ덉öƒìhè9#Wè&÷ÿÿ‰ÇƒÄ EìPj
-WèՉ‹}ìƒÄƒ}à…Wƒ}ät)ƒ}ä ƒ}ätéCÿÿÿƒ}ä…9ÿÿÿƒÆ‹Fü‰é,ÿÿÿƒÆ‹Füf‰éÿÿÿ‰öƒìhõ9#Wè¶öÿÿ‰ÇƒÄ EìPj
-됃ìh:#Wèšöÿÿ‰ÇƒÄ EìPjWè ‹}ìƒÄƒ}à…̓}ät+ƒ}ä -ƒ}äté¹þÿÿ‰öƒ}ä…­þÿÿƒÆ‹Vü‰é þÿÿƒÆ‹Vüf‰é‘þÿÿ‰öƒìh:#Wè*öÿÿ‰ÇƒÄEìPWè;‹}ìƒÄƒ}àu`ƒ}ät)ƒ}ä ƒ}ätéMþÿÿƒ}ä…CþÿÿƒÆ‹FüÝé8þÿÿƒÆ‹FüÙé*þÿÿvÇEäë vÇEäëvÇEàëÝؐ»ÿE ‹E €8…Pýÿÿ‹Eèeô[^_]ÐU‰åƒì EPÿu ÿuèïüÿÿƒÄÉÉöU‰åWVSƒì,‹u ÇEп‹Eƒð‰EԋU‰U̅Òy‰Ñ÷ىM̃}y ‹E…Ày÷Ø됋E÷EÔu ƒ}yƒ}yGƒ}u‹EÐÆD(Ø0@‰EÐë8v…Àt1U؉Uȉöƒì º÷ủÃRèI‹MȋUЈ
-B‰UЉ؃Ä…Àu×}ЋEԃàƒøu‰ú;}} -‰öÆ FGB;U|õƒ}y ƒ}yÆ-ë ÷EÔtÆ+F‹Eԃàƒøu‰ú;}} Æ0FGB;U|õ‹UÐJx M؊
-ˆFJy÷‹Eԃàƒøu‰ú;}} Æ FGB;U|õƉøeô[^_]ÃU‰åƒì‹Eÿuÿu÷ØPÿu ÿuèŸþÿÿƒÄ ÉÉöU‰å‹E…Ày÷Ø]ÉöU‰åSƒì‹]èÁîÿÿƒì SèY
-ÿÿU‰åWVSƒì‹M‹} ÙîÙÀÙ軀9-u ¾ÿÿÿÿë
-‰ö¾ëA€90túŠƒè0< w(Ý`,#ëÙˍv¾ƒè0AÜËÙËPÚ$XŠƒè0< vâÝۀ9.u9AŠƒè0< w/Ý`,#ëÙÉÙʉö¾ƒè0AÜÊÙÊPÚ$ÙÉXØʊƒè0< vÝÝÚÙÉÞùÞÁVÚ $^€9et €9E…“A€9-u
-¾ÿÿÿÿAë‰ö€9+u ¾Aëv¾Šƒè0< weÝ`,#¾ƒê0A·ÃÙÀPÚ $Ù}ð‹]ðÆEñ Ùmð‰]ðÛ]ìÙmð‹Eì·À‰$Û$‰$Ú$ZÙ}ð‹UðÆEñ Ùmð‰UðÛ]ìÙmð‹Eì‰ÃŠƒè0< v£Ý؅ö~!ºf…Ût4Ý`,#·Ã‰öÜÉB9Â|ùëvº·Ã‰Ã9Â}Ý`,#ÜùB9Ú|ùÝ؅ÿt‰ƒÄ[^_]ÐU‰åWVSƒì ‹]‹} ÇE쾀;-u ÇEðÿÿÿÿCë‰ö€;+u ÇEðCëÇEð€;0u>C€;0túë6ƒì ¾PCè‰ÂƒÄ9ú…Òy
-¸ëEv‰ð¯÷Ö9ð~ÇEìƒìW¾P聃ąÀu¶ƒ}t‹E‰ƒ}ìt¾ÿÿÿ¯uð‰ðeô[^_]ÉöU‰åWVSƒì ‹]‹} ÇEð¾€;0uC€;0tú€;xuKƒÿuFC€;0u@‰öC€;0túë6ƒì ¾PCè_‰ÂƒÄ9ú…Òy
-¸ëAv‰ð¯÷Ö9ðvÇEðƒìW¾PèуÄ…Àu¶ƒ}t‹E‰ƒ}ðt¾ÿÿÿ‰ðeô[^_]ÉöU‰åŠUBÐ< w ¾Âƒè0ë&vB¿<w ¾Âƒè7됍BŸ<w ¾ÂƒèW됾Â]ÍvU‰å‹Uƒú w B0¾À됍BöƒøwB7¾Àë¾Â]ÍvU‰åŠUƒê0¸€ú –À]ÉöU‰åŠUBÐ<vBŸ<w¸ë¸]ÐU‰åŠU€ú/~‹E Ø^#:Pÿ¸ë¸]ÐU‰åŠUBŸ<w Bà¾Àëv¾Â]ÍvU‰åŠUB¿<w B ¾Àëv¾Â]ÍvU‰åVS¾ƒì ¾]Sè%ƒÄ…Àuƒì Sè5ÿÿÿƒÄ…Àt¾‰ðeø[^]ÃU‰åŠUƒêA¸€ú9–À]ÉöU‰å¸€}/žÀ]ÍvU‰åŠUƒêa¸€ú–À]ÉöU‰åŠUB÷<v
-¸€ú u¸]ÉöU‰åŠUƒêA¸€ú–À]ÉöU‰åWVSƒì ÝEÝUè‹]‹}ÇEäSd$øÝ$èoƒÄ…Àtƒì Sè·îÿÿƒÄéPvÙîÝEèÚéßà€äE€üu Æ-C€uï€ë÷EtÆ+CÿEäÝh,#ÝEèÚéßà€äE€üuÆ0ÆC¸éû‰öÙèÝEèÝáßà€äE€üu3¾Ýéßà€äE€üuHÝ8:#ÝEèØÉÝUèNÝêßà€äE€ütëÝØë)vÝØÝؾÝ8:#ÝEèë ÝEèØñÝUèFÝéßàöÄtîÝ؃ì Vè÷ùÿÿƒÄƒøc~ƒïë‰öƒø ~ƒïë‰ö…ö~Oƒì‹EƒÈPÿuWSÿuìÿuèèUEäƒÄ …öu‹Eäë;‰ö]äÆeCƒì jºgfff‰ð÷êÁú‰ðÁø)ƒÂRj
-SVè\ùÿÿ‹UäD‰EäƒÄ eô[^_]ÍvU‰åWVSìŒÝEݝþÿÿ‹]Dž€þÿÿ½¸þÿÿ¹K¸üó«ƒìSÿµ”þÿÿÿµþÿÿ貃ąÀtƒì SèúìÿÿƒÄé‰öÙî݅þÿÿÚéßà€äE€üuÆ-C€µ—þÿÿ€ëv÷Et
-Æ+Cÿ…€þÿÿƒì…˜þÿÿPÿµ”þÿÿÿµþÿÿèþݝpþÿÿ‹…pþÿÿ‹•tþÿÿ‰Æ‰×DžŒþÿÿƒÄ݅˜þÿÿÙèÙÉÝáßàöÄ…ø重vh$@jÿµœþÿÿÿµ˜þÿÿè$݅˜þÿÿÜ5p,#ݝ˜þÿÿÙ½´þÿÿ‹´þÿÿƅµþÿÿ Ù­´þÿÿ‰´þÿÿß½¨þÿÿÙ­´þÿÿ‹…¨þÿÿ‰$èûÿÿ‹•Œþÿÿˆ„*¸þÿÿB‰•ŒþÿÿƒÄ݅˜þÿÿÙèÙÉÚéßàöÄ„oÿÿÿ‹•Œþÿÿ•€þÿÿ‰ÑI…¸þÿÿ‰…|þÿÿë‰ö‹•|þÿÿŠˆCI‹•Œþÿÿƒê‰ÐÁèH!Â9Ñ}ޅÉx‹Œþÿÿƒéx
-vÆ0CIyùÆëÝØÝØÆ0Cÿ…€þÿÿÝ@:#‰µpþÿÿ‰½tþÿÿ݅pþÿÿÚéßàöÄE…\‹E@9…€þÿÿLÆ.Cÿ…€þÿÿ‹Eƒà‰…ˆþÿÿDž„þÿÿDžŒþÿÿv‰µpþÿÿ‰½tþÿÿ݅pþÿÿÜH:#Ü -p,#ݝpþÿÿ‹µpþÿÿ‹½tþÿÿƒì…˜þÿÿPWVèݝpþÿÿ‹•pþÿÿ‹tþÿÿ‰Ö‰Ï݅˜þÿÿÙ½´þÿÿ‹´þÿÿƅµþÿÿ Ù­´þÿÿ‰´þÿÿ۝¤þÿÿÙ­´þÿÿ‹…¤þÿÿƒÄ…Àtƒ½ˆþÿÿu
-Džˆþÿÿƒì PèÓùÿÿˆCÿ…€þÿÿÿ…ŒþÿÿƒÄƒ½ˆþÿÿt‹E9…Œþÿÿ~
-Dž„þÿÿ‹•€þÿÿ9U}
-Dž„þÿÿƒ½„þÿÿ„ýþÿÿKë
-‰öÿ€þÿÿ‰Ã€;0u Cÿ€{ÿ.uêCÆ‹…€þÿÿeô[^_]ÃU‰åWVSƒì‹]‹u ‹}WVSèZƒÄ…Àtƒì Wè¢éÿÿƒÄéñ‰öÙî‰]è‰uìÝEèÝáßàÝـäE€üuÙàëvÝ؉]è‰uìÝEèÝx,#ÙÉÝáßàÝـäE€üuÝØÆ0ÆG¸雺ÙèÙÉÝáßà€äE€üu/Ýáßà€äE€üu?Ý8:#ëÙɐÜÉÙÉJÝâßà€äE€ütìÝØëvÝÙÝ8:#ë‰öØñÙÉBÙÉÝáßàöÄtðÝØÝ؍BƒøvƒìÿuÿuÿuWVSèÔùÿÿë‰öƒìÿuÿuÿuWVSèXûÿÿƒÄ eô[^_]ÐU‰åƒìSÙ}ü›f‹Eüf -? f‰EøÙmø›ÝEÙüÝ]ð›‹Uð‹Mô‹]‰‰KÝEÜeðeì›ÛâÙmü›[ÉÍvU‰åƒì‹E‹U ‰Eø‰Uü‹MUøf‹BfÁè%ÿ=ÿt¸ëk÷Bÿÿuƒ:t…ÉtƒìhP:#QèDçÿÿƒÄ¸ë@‰ö€zy…ÉtƒìhT:#Qè çÿÿƒÄ¸ë‰ö…ÉtƒìhY:#QèçÿÿƒÄ¸ÉÃU‰åƒì¸@Ù#ƒ=ä^#tÿä^#ÉÃU‰å‹E£ä^#]ÍvU‰åƒì‹E‹U ‰Eø‰UüUø¹f‹BfÁè%ÿ=ÿu÷Bÿÿuƒ}øt¹‰ÈÉÉöU‰åSƒì‹E ‹]ÆPè‰âÿÿ‰ØƒÄ‹]üÉÍvU‰åVSƒì ÝEÝUð‹]‹uVSd$øÝ$èzÝ]èƒÄƒ=è^#ÿtWƒìVSèYÿÿÿƒÄ…ÀuFƒìÿuôÿuðèDÿÿÿƒÄ…Àu1Ùî‰]à‰uäÝEàÚéßà€äE€ô@uƒì jVSÿuôÿuðè<ƒÄ ëvÝEèeø[^]ÉöÝD$ ÝD$Ùø›ßàžzøÝÙͶ¼'U‰åVSƒì0ÝE‹]‹u‹EÝUà‰]è‰uìPÿú‡Èÿ$•,#ÝØÇEغ^:#ƒøc~ºc:#‰UÜÇEðÇEôƒ=è^#„}ƒì EØP誃ąÀ…uƒ=è^#…Yƒìjhi:#éëvÝØÇEغ}:#ƒøc~º‚:#‰UÜÇEðÇEôƒ=è^#„ƒì EØPè>ƒÄ…À… ƒ=è^#…íƒìjhˆ:#év‰]à‰uäÝ]èÇEغœ:#ƒøc~º¢:#‰UÜÇEðÇEôƒ=è^#„žƒì EØPè˃ąÀ…–ƒ=è^#…zƒìjh©:#é ÝØÇEغ¾:#ƒøc~ºÄ:#‰U܃=è^#uÇEðàÇEôÿÿïGé¸ -¡Ü^#‹à^#‰Eð‰Uôé¡ -‰öÝØÇEغR<#ƒøc~ºX<#‰U܃=è^#uÇEðàÇEôÿÿïGéh -¡Ü^#‹à^#‰Eð‰UôéQ -‰öÝØÇEغË:#ƒøc~ºÏ:#‰U܃=è^#uÇEðàÇEôÿÿïGé -¡Ü^#‹à^#‰Eð‰Uôé -‰öÝØÇEغË:#ƒøc~ºÏ:#‰UÜÇEðÇEôéÑ ‰öÝØÇEغW5#ƒøc~ºÔ:#‰U܃=è^#uÇEðàÇEôÿÿïÇë¡Ü^#‹à^#ò€‰Eð‰Uôƒ=è^#„óƒì EØPè ƒÄ…À…ëƒ=è^#…σìjhØ:#éaÝØÇEغW5#ƒøc~ºÔ:#‰U܃=è^#uÇEðàÇEôÿÿïÇë¡Ü^#‹à^#ò€‰Eð‰Uôƒ=è^#„gƒì EØP蔃ąÀ…_ƒ=è^#…CƒìjhØ:#éÕ -ÝØÇEغ5#ƒøc~ºê:#‰U܃=è^#uÇEðàÇEôÿÿïÇë¡Ü^#‹à^#ò€‰Eð‰Uôƒ=è^#„Û -ƒì EØPèƒÄ…À…Ó -ƒ=è^#…· -ƒìjhî:#éI -ÝØÇEغ5#ƒøc~ºê:#‰U܃=è^#uÇEðàÇEôÿÿïÇë¡Ü^#‹à^#ò€‰Eð‰Uôƒ=è^#„O -ƒì EØPè| -ƒÄ…À…G -ƒ=è^#…+ -ƒìjhî:#é½ ÝØÇEغ;#ƒøc~º;#‰U܃=è^#uÇEðàÇEôÿÿïÇë¡Ü^#‹à^#ò€‰Eð‰Uôƒ=è^#„à ƒì EØPèð ƒÄ…À…» ƒ=è^#…Ÿ ƒìjh;#é1 ÝØÇEغ;#ƒøc~º;#‰U܃=è^#uÇEðàÇEôÿÿïÇë¡Ü^#‹à^#ò€‰Eð‰Uôƒ=è^#„7 ƒì EØPèd ƒÄ…À…/ ƒ=è^#… ƒìjh;#é¥ ÝØÇEغ;#ƒøc~º ;#‰U܃=è^#uÇEðàÇEôÿÿïGéP ¡Ü^#‹à^#‰Eð‰Uôé9 ‰öÝØÇEغ;#ƒøc~º ;#‰U܃=è^#uÇEðàÇEôÿÿïGë¡Ü^#‹à^#‰Eð‰Uôƒ=è^#„a ƒì EØPèŽ ƒÄ…À…Y ƒ=è^#…= ƒìjh(;#éÏ
-vÝØÇEغ<;#ƒøc~º@;#‰U܃=è^#uÇEðàÇEôÿÿïÇë¡Ü^#‹à^#ò€‰Eð‰Uôƒ=è^#„å ƒì EØPè ƒÄ…À…Ë
-ƒ=è^#…¯
-ƒìjhE;#éA
-ÝØÇEغ<;#ƒøc~º@;#‰U܃=è^#uÇEðàÇEôÿÿïÇë¡Ü^#‹à^#ò€‰Eð‰Uôƒ=è^#„G
-ƒì EØPèt
-ƒÄ…À…?
-ƒ=è^#…#
-ƒìjhV;#éµ ÝØÇEغi;#ƒøc~ºo;#‰U܃=è^#uÇEðàÇEôÿÿïÇë¡Ü^#‹à^#ò€‰Eð‰Uôƒ=è^#„Íƒì EØPèè ƒÄ…À…³ ƒ=è^#…— ƒìjhv;#é) ÝØÇEغi;#ƒøc~ºo;#‰U܃=è^#uÇEðàÇEôÿÿïÇë¡Ü^#‹à^#ò€‰Eð‰Uôƒ=è^#„/ ƒì EØPè\ ƒÄ…À…' ƒ=è^#… ƒìjh‰;#靐ÝØÇEغž;#ƒøc~º¢;#‰UÜÇEðÇEôƒ=è^#… ƒì EØPèòƒÄ…À…½ƒìjh§;#jèÖõÿÿè]õÿÿÇ!ƒÄ降vÇEغž;#ƒøc~º¢;#‰U܃=è^#uvÇEðàÇEôÿÿïG‰]ЉuÔÝEÐÜ -=#Ý]Ћ]ЋuÔÙîÙÉÚéßà€äE€ü…¯ƒìVSèjƒÄ‰]ЉuÔÝEÐÙÉÚéßà€äE€ü@„‡ÇEðàÇEôÿÿïÇét¡Ü^#‹à^#‰Eð‰Uô‰]ЉuÔÝEÐÜ -=#Ý]Ћ]ЋuÔÙîÙÉÚéßà€äE€ü…6ƒìVSèñƒÄ‰]ЉuÔÝEÐÙÉÚéßà€äE€ü@„¡Ü^#‹à^#ò€‰Eð‰UôéòvÝØÇEغž;#ƒøc~º¢;#‰UÜÇEðÇEôéÁ‰öÝØÇEغž;#ƒøc~º¢;#‰U܃=è^#uÇEðÇEôë¡Ü^#‹à^#ò€‰Eð‰Uôƒ=è^#„ãƒì EØPèƒÄ…À…Ûƒ=è^#…¿ƒìjh¿;#éQÝØÇEغž;#ƒøc~º¢;#‰U܃=è^#uÇEðÇEôëÇEðÇEôøƒ=è^#„`ƒì EØP荃ąÀ…Xƒ=è^#…<ƒìj hà<#éΉöÇEغÙ;#ƒøc~ºÞ;#‰U܃=è^#u6ÙîÙÉÚéßàöÄEuÇEðàÇEôÿÿïGém‰öÇEðàÇEôÿÿïÇéX‹ -Ü^#‹à^#‰Mð‰]ôÙîÙÉÚéßàöÄE„4‰È‰Úò€‰Eð‰UôéÝØÇEغä;#ƒøc~ºé;#‰U܃=è^#uÇEðÇEôëÇEðÇEôøƒ=è^#„Lƒì EØPèyƒÄ…À…Dƒ=è^#…(ƒìjhï;#麉öÇEغ<#ƒøc~º<#‰U܃=è^#uÝ]ðëÝØÇEðÇEôøƒ=è^#„Òƒì EØPèÿƒÄ…À…ʃ=è^#…®ƒìjh<#é@ÝØÇEغ#<#ƒøc~º-<#‰UÜÇEðÇEôøƒ=è^#„iƒì EØP薃ąÀ…aƒ=è^#…Eƒìjh8<#é׍vÝØÇEغQ<#ƒøc~ºW<#‰UÜÇEðÇEôøƒ=è^#„ýƒì EØPè*ƒÄ…À…õƒ=è^#…Ùƒìjh^<#ékvÝØÇEغs<#ƒøc~ºy<#‰UÜÇEðÇEôøƒ=è^#„‘ƒì EØP较ąÀ…‰ƒ=è^#…mƒìjh€<#éÿvÇEغs<#ƒøc~ºy<#‰UÜÜ5=#Ý]ðƒ=è^#„,ƒì EØPèYƒÄ…À…$ƒ=è^#…ƒìjh•<#隉öÇEغ¨<#ƒøc~º®<#‰U܋ -Ü^#‹à^#‰Mð‰]ôÙîÙÉÚéßàöÄEtC‰È‰Úò€‰Eð‰Uôë1‰öÇEغ¨<#ƒøc~º®<#‰U܍d$øÝ$jjè›Ý]ðƒÄƒ=è^#…jé|vÝØÇEغµ<#ƒøcŽ•º¸<#鋍vÝØÇEغW5#ƒøc~uºÔ:#ën‰öÝØÇEغË<#ƒøc~YºÎ<#ëR‰öÝØÇEغ5#ƒøc~=ºê:#ë6‰öÝØÇEغÒ<#ƒøc~!ºÕ<#ë‰öÝØÇEغ;#ƒøc~º;#‰UÜÇEðÇEôƒ=è^#„¯ƒì EØPèʃąÀ…•ƒ=è^#…‹ƒìjÿuÜjè£îÿÿƒÄ jh¼<#jè’îÿÿƒÄëfÝØÇEغ;#ƒøc~º!;#‰U܃=è^#uÇEðàÇEôÿÿïGë¡Ü^#‹à^#‰Eð‰Uôƒ=è^#tƒì EØPè2ƒÄ…À…ýè®íÿÿÇ"éívÝØÇEغ;#ƒøc~º!;#‰U܃=è^#uÇEðàÇEôÿÿïGë¡Ü^#‹à^#‰Eð‰Uôƒ=è^#„‰ƒì EØP趃Ä…À…ƒ=è^#uiƒìjh);#jè‘íÿÿƒÄëSÇEغž;#ƒøc~º¢;#‰UÜÝ]ðƒ=è^#ÿt ƒ=è^#uÇEðÇEôð?ë$‰öƒì EØPè@ƒÄ…ÀuèÀìÿÿÇ!ëÝØÝEðeø[^]ËT$â€‹D$%ÿÿÿ ЉD$ÝD$ÉöU‰å¸]ÉöÝD$ÙüÉö¼'U‰åWVSƒì ‹E ‰EðEƒEðƒeðøƒàø‰Eì‹Eð9EìsƒìjUh=#h"=#è˜ ƒÄ‹Eð9Eì„Ä‹E‹…Û„·‹C;C rƒìj`h=#h-=#è` ƒÄöCtƒìjah=#h`=#èC ƒÄöC tƒìjbh=#h =#è& ƒÄ‹Eì;CvL‹Eð;C sD‰Æ‹}ì;ss‹s;{ v‹{ 9÷wƒìjnh=#hA=#èæ ƒÄƒì‰ø)ðPVÿu蚃ċ…Û…Iÿÿÿeô[^_]ÐU‰åWVSƒì ‹u ‹E‹}‰ÂUƒÀƒàøƒâø9†ŒÇF‰F‰V ‹E‰F‰~ÇF‹MëF‰ö9óuƒìjlhÐ=#hÛ=#èX ƒÄ‹F ;Cv‹F;C sƒìjmhÐ=#h>#è1 ƒÄ‰Ù‹…Ût9{±9{u‹S +S‹F +F9Âwœ‰‰1eô[^_]ÃU‰åWVSƒì ‹]‹} …ÛuƒìjLh->#h5>#èÙ
-ƒÄ…ÿuƒìjMh->#h>>#è¾
-ƒÄƒÇƒçø‹3…ö„rvƒ~uƒ~t‹F;FsƒìjUh->#h€>#è€
-ƒÄƒ~t‹F;F rƒìjUh->#hà>#è[
-ƒÄ‹F +F9FvƒìjUh->#h ?#è9
-ƒÄ‹F÷ЅE…åF‰Eð‹^…Û„ԍv÷Ãtƒìj^h->#h`?#èø ƒÄöCtƒìj_h->#h ?#èÛ ƒÄƒ;t9wƒìj`h->#hà?#è» ƒÄ;^ rƒìjah->#hV>#èŸ ƒÄ9{rGv‹‰‹C)ø‰B‹Eð‰ë
-v‹‹Uð‰9~sƒìjwh->#hm>#è\ ƒÄ)~‰Øë‰ö‰]ð‹…Û…/ÿÿÿ‹6…ö…‘þÿÿ¸eô[^_]ÃU‰åƒì jÿjÿuÿuÿuÿu ÿuèƒÄ ÉÐU‰åWVSƒì‹]‹EE ‰Eð…ÛuƒìjTh @#h5>#èۃă} uƒìjUh @#h>>#较ċ;…ÿ„lƒuƒt‹G;Gsƒìj[h @#h€>#舃ăt‹G;G rƒìj[h @#hà>#ècƒÄ‹G +G9Gvƒìj[h @#h ?#èAƒÄ‹G÷ЅE…á‹Uð9WƒÕ‹M9O †ÉG‰Eì‹_…Û„¸v÷Ãtƒìjkh @#h`?#èèƒÄöCtƒìjlh @#h ?#è˃ă;t9wƒìjmh @#hà?#諃Ä;_ rƒìjnh @#hV>#菃ċU 9S‚$‰Þ;]s‹u¹;M}ºÓâ‹E1ð…ÂtÖA;M|è‰ð)ØE ;C‡è‹M 1;Eð‡æ‰ðƒàø‰Eè9Øsƒìh‘h @#h@#èƒÄ9]èvC‹Uè)ډUä÷Âtƒìh–h @#h@@#èãƒÄ‹‹M艋C+Eä‰A‹Eä‰C‰]ì‰ðƒà‹U Tƒâø‰U ‹Mè9Qv‰ÊU ‹‰‹A+E ‰B‹Eì‰ë
-‹Uè‹‹M쉋E 9Gsƒìh´h @#hm>#èkƒÄ‹U )W‰ðë‰ö‰]ì‹…Û…Kþÿÿ‹?…ÿ…•ýÿÿ¸eô[^_]ÃU‰åƒì jÿjjj ÿu hÿuèýÿÿƒÄ ÉÐU‰åWVSƒì‹]Shr@#è]Ìÿÿ‹3ƒÄ…ö„ƒìÿvÿvÿv‹F +FPÿv ÿvhA#è-ÌÿÿƒÄ ƒ~uƒ~t‹F;Fsƒìjah„@#h€>#袃ă~t‹F;F rƒìjah„@#hà>#è}ƒÄ‹F +F9Fvƒìjah„@#h ?#è[ƒÄ¿‹^…Û„¾ƒì ÿ3ÿs‰ØCPSh@A#èËÿÿƒÄ ÷Ãtƒìjih„@#h`?#èƒÄöCtƒìjjh„@#h€A#èóƒÄƒ{wƒìjkh„@#h‹@#èփă;t9wƒìjlh„@#hà?#趃Ä;^ rƒìjmh„@#hV>#蚃Ä{‹…Û…BÿÿÿƒìWh§@#èÜÊÿÿƒÄ9~tƒìjsh„@#hº@#è`ƒÄ‹6…ö…cþÿÿƒì hÒ@#è¦ÊÿÿƒÄeô[^_]ÍvU‰åWVSƒì ‹u‹] ‰ßƒçø…öuƒìjNh=#h5>#è ƒÄ…ÛuƒìjOh=#h²A#èñƒÄƒ}uƒìjPh=#h>>#èԃĉ؃à‹UTƒâø‰U‹ëv‹…ÛuƒìjXh=#h½A#螃ă{uƒ{t‹C;CsƒìjYh=#h€>#èsƒÄƒ{t‹C;C rƒìjYh=#hà>#èNƒÄ‹C +C9CvƒìjYh=#h ?#è,ƒÄ;{‚hÿÿÿ;{ ƒ_ÿÿÿ‹EC‹C +C9Cvƒìjbh=#h ?#èòƒÄÇEð‹sëv‰uð‹6…öt9þróƒ}ðtm‹Eð@9ørc9øtƒìjnh=#hàA#諃ąöt8‹U:9ðr.9ðtƒìjuh=#h B#肃ċEF‹UðB‹‰ëE‹E‹UðBë9ƒ}ðt
-‹Eð‰8ëv‰{…öt‹U:9ðr‰ÐF‰G‹‰ë ‹E‰G‰7eô[^_]ÃU‰åƒì hÿu ÿuèÒýÿÿƒÄÉÐU‰å‹EÇ]ÉöU‰åWVSƒì ÇEèÇEìÇEð‹E‹0…ö„Zƒ~uƒ~t‹F;Fsƒìj]hFB#h€>#蠃ă~t‹F;F rƒìj]hFB#hà>#è{ƒÄ‹F +F9Fvƒìj]hFB#h ?#èYƒÄÿEð¿‹^…Û„¨v÷ÃtƒìjdhFB#h`?#è$ƒÄöCtƒìjehFB#h€A#èƒÄƒ{wƒìjfhFB#h‹@#èêƒÄƒ;t9wƒìjghFB#hà?#èʃÄ;^ rƒìjhhFB#hV>#讃ÄÿEì{‹…Û…[ÿÿÿ9~tƒìjnhFB#hº@#肃Ä‹FEè‹6…ö…§þÿÿƒì ÿuìÿuðÿuèÿuh`B#è¶ÆÿÿƒÄ eô[^_]ÍvU‰åVS‹u‹] EƒìPÿuh`Ù#è}ÈÿÿƒÄh`Ù#ÿ5 á#jSVhàB#è5ƒÄ eø[^]ÍvU‰åƒìÿ5Œá#jÿuÿu ÿuh B#èƒÄ ÉÉöU‰åƒì E Pÿuh`Ý#èÈÿÿƒÄ jjhX##èä%ÿÿƒÄh`Ý#hCC#è‚ÅÿÿÇ$Mè>ÿÿƒÄÉÐU‰åƒìh`Ý#h C#è[ÅÿÿƒÄÉÉöU‰åWVSƒì¿ÿÿÿÿ‹E ‹‹E@‰ÐÁà)лdâ#‰]ð‹´ÃЃùÿtCI‰ÐÁà)Ð;´ÃÐr0»hâ#‰Ï‰ÐÁà)ЋLÃPƒùÿtI‰ÐÁà)ЋUð;´ÂÐsՃÿÿt‰ÐÁà)ЋU‰Ÿâ#ë
-‰ö‹E‹U ‰ƒùÿtI‰ÐÁà)ЋU‰żâ#ë
-‹E‹U ‰B‹E@‰ÐÁà)ЍÅP‰ˆhâ#‰¸lâ#ƒÄ[^_]ÍvU‰åWVSƒì¿ÿÿÿÿ‹E ‹‹E@‰ÐÁà)ÐÁà‹8å#‰U苀<å#‰Eìƒùÿtw ‰ÆȉÂÁâ)‹Eè‰Ã;Õ8å#|[‰Eäv1‰ÐÁà)ЍÅ;š8å#u ‹Eì;‚<å#|1‰Ï‰ÐÁà)Ћ Ÿâ#ƒùÿt4 1‰ÐÁà)Ћ]ä;Å8å#}«ƒÿÿt‰ÐÁà)ЋU‰Ÿâ#ë‹E‹U ‰ƒùÿtI‰ÐÁà)ЋU‰żâ#ë
-‹E‹U ‰B‹E@‰ÐÁà)ЍÅP‰ˆhâ#‰¸lâ#ƒÄ[^_]ÍvU‰å‹EÇÿÿÿÿÇ@ÿÿÿÿ]ÍvU‰åWVS‹uv‰ÐÁà)ЍÅP‹˜lâ#¿hâ#‹ 8ƒûÿt[‰ÐÁà)ЉLÇPëv‹E ‰ƒùÿt&I‰ÁÁá)Á»lâ#v‰ÐÁà)ЋDÃP‰DËPë v‹E ‰X[^_]ÐU‰åS‹M‹‰Øƒûÿt=‹@‰ÂÁâ)‹Õ¸â#‰ƒøÿt@‰ÐÁà)ÐÇżâ#ÿÿÿÿë
-vÇAÿÿÿÿ‰Ø‹$ÉÉöU‰åS‹M‹] ƒ;ÿt)I‰ÐÁà)Ћ‰Ÿâ#‹@‰ÂÁâ)‰ Õ¼â#됉KI‰ÐÁà)ÐÇŸâ#ÿÿÿÿI‰ÐÁà)ÐÇżâ#ÿÿÿÿ‰ ‹$ÉÃU‰åS‹M‹] ƒ{ÿt,I‰ÐÁà)ЋS‰żâ#‹C@‰ÂÁâ)‰ Õ¸â#ë‰ö‰ I‰ÐÁà)ÐÇżâ#ÿÿÿÿI‰ÐÁà)ÐÇŸâ#ÿÿÿÿ‰K‹$ÉÃU‰å‹E‹]ÉöU‰å‹E‹@]ÐU‰å·Eƒøt ƒø…Àtë-ƒøtƒøtë ¸aC#됸fC#됸jC#됸pC#됸14#]ÐU‰åWVSƒìœúX‰Â‰Uä÷Et$ƒìEèPjèD—ÿÿƒÄ ÿuìÿuèh€C#è]ÁÿÿƒÄ÷EtN¾;5á#sA¿Àá#vƒì µ‹;¶BP·BPRVhÀC#èÁÿÿƒÄ‹;VÿP ƒÄF;5á#rÇ÷Etƒì h›C#èíÀÿÿèP&ÿÿƒÄ‹Uä‰ÐPeô[^_]Éöì"Èî"Èî"Èî"Èî"Èî"4î"Èî"@î"Lî"Èî"Xî"Xî"Xî"Xî"Xî"Xî"Xî"Xî"Xî"Xî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî"Èî" ì" ì"Œí"Lí"Ìí"(î" ì"Èî"Èî"î"Èî"(î"Èî"í"Èî"Èî"$í"Èî"lì"Èî"Èî"¸ì"¬ï"Œñ"Œñ"Œñ"Œñ"Œñ"ñ"Œñ"ñ"ñ"Œñ"(ñ"(ñ"(ñ"(ñ"(ñ"(ñ"(ñ"(ñ"(ñ"(ñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"Œñ"¸ï"Ìï"Œñ"Œñ"Œñ"øð"Ìï"Œñ"Œñ"ìð"Œñ"øð"Œñ"Œñ"Œñ"Œñ"Äð"Œñ"ð"Œñ"Œñ"`ð"˜ô"¤ô"¤ô"¤ô"¤ô"¤ô"hò"hò"hò"hò"hò"hò"hò"hò"hò"hò"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"¤ô"˜ò"ó"ô"ô"ô"Œô"ó"¤ô"¤ô"€ô"¤ô"Œô"¤ô"¤ô"¤ô"¤ô"°ò"¤ô"Œó"¤ô"¤ô"¨ó"$@$@#p#Ü#L#œ#ì#<#l#ø#„##œ#( #´ #
-#Œ
-# #¤ #0 #¼ #0 -#L#|##Œ## ##„#ð#\#À# #P#t##¬#È#ä#d#Ü#d#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä#Ä##p#Ü#L#œ#ì#<#l#ø#„##œ#( #´ #
-#Œ
-# #¤ #0 #¼ #0 -#L#|##Œ## ##„#ð#\#À# #P#t##¬#È#ä#d#Ü#d#J1 starts and call sigwait(31)
-J1 exit from sigwait(), err=%d, sig=%d
-J2 starts and call sigwaitinfo(30)
-J2 exit from sigwaitinfo(), err=%d, signo=%d code=%d value=%d
-J3 starts and call sigtimedwait(29)
-J3 exit from sigtimedwait(), err=%d, signo=%d code=%d value=%d
-J4: AAAARRRRGGGHHH!!! killed by someone...
-J4 starts and call sigtimedwait(28)
-J4 exit from sigtimedwait(), err=%d, signo=%d code=%d value=%d
-main: kill(31), then wait until t=0.4 sec
-main: sigqueue(30), then wait until t=0.8 sec
-main: creating J1
-Error creating J1
-main: creating J2
-Error creating J2
-main: creating J3
-Error creating J3
-main: creating J4
-Error creating J4
-main: waiting 0.2 sec
-main: kill(J4)
-main: ending...
-Error during Keyboard Initialization!!!Ctrl-C pressed!
-KeybPortKeyTasktask_create
-scheduletime %lus %luns * caplasttime %lus %luns * exec=%d TIME = %lu
-The system tick must be less than 55 mSec!Abort detected
-Code : %u
-Too many scheduling levels!!!
-Too many resource levels!!!
-debug info noticewarn err crit alert emerg <%i>[%s] %sPosix task
-Signal number %d...
-with value : %d
-POSIX_ReadyPOSIX_DelayPOSIX_UnknownSlice: %d
-MainPOSIX_register_level
- alloco descrittore %d %d
- lev=%d
-POSIX schedulerPid: %d Name: %20s Prio: %3ld Status: %s
-
-Panic!!! can't create main task...
-dummy PID: %d
-Dummy1Dummy2Dummy3Dummy4Dummy5Dummy6Dummy7Dummy8Dummy9Dummy0DummyaDummybDummycDummydDummyeDummyfDummygDummyhDummyDummy (RR) Posto dummy_create
-
-Panic!!! can't create dummy task...
-Entro in dummy_register_level
-Port des :
-Free port des : %d
-%d %s vt: %d pn: %d
-%d pd: %d vt: %d pn: %d Resources owned by the tasks:
-%-4dPI_register_module
-PI module
-PC priority of the tasks:
-%-4ldPC_register_module
-PC moduleTR %x
-SS:SP %x:%lx
-Stack0 : %x:%lx
-Stack1 : %x:%lx
-Stack2 : %x:%lx
-CS : %x DS : %x
-Descriptor [%x] InfoNo more Descriptors...
-%x (Hex)Base : %lx Lim : %lx Acc : %x Gran %x
-2Coprocessor error#Page fault*General protection fault*Stack exception*Segment not present*Unvalid TSS#INTEL reserved*Double defect1FPU context switch*Unvalid opcode#BOUND limit exceeded#Overflow detected on INTO#Breakpoint trap#NMI detected#Debug fault#Division by 0Exception %d occurred
-ABORT %d !!!LL Time Panic!!!
-time.cError! File:%s Line:%d %sOne-shot timer selected...
-Periodic timer selected...
-Unhandled Exc or Int occured!!!
-32/LINUX CrossCompiled/ELFHalt called1234567890-+12345678901234567890xabcdefABCDEF1234567890.e+-0123456789ABCDEF$@ -Æ@,ú1°<NaN+Inf-Infacosacosfacos: DOMAIN error
-asinasinfasin: DOMAIN error
-atan2atan2fatan2: DOMAIN error
-hypothypotfexpexpfy0fy0: DOMAIN error
-y1fy1: DOMAIN error
-ynynfyn: DOMAIN error
-lgammalgammaflgamma: SING error
-loglogflog: SING error
-log: DOMAIN error
-log10log10flog10: SING error
-log10: DOMAIN error
-powpowfpow(0,0): DOMAIN error
-pow(0,neg): DOMAIN error
-sinhsinhfsqrtsqrtfsqrt: DOMAIN error
-fmodfmodffmod: DOMAIN error
-remainderremainderfremainder: DOMAIN error
-acoshacoshfacosh: DOMAIN error
-atanhatanhfatanh: DOMAIN error
-atanh: SING error
-scalbscalbfj0j0f: TLOSS error
-j1j1fjnjnfneg**non-integral: DOMAIN error
-à?addfree.cmax >= minreg->min < reg->maxnew_max > new_min(reg->min & (sizeof(struct lmm_node) - 1)) == 0(reg->max & (sizeof(struct lmm_node) - 1)) == 0addregio.cr != reg(reg->max <= r->min) || (reg->min >= r->max)alloc.clmm != 0size > 0reg->free >= 0(DWORD)node < reg->maxreg->free >= size(reg->nodes == 0 && reg->free == 0) || (DWORD)reg->nodes >= reg->minreg->nodes == 0 || (DWORD)reg->nodes < reg->maxreg->free <= reg->max - reg->min((DWORD)node & (sizeof(struct lmm_node) - 1)) == 0((DWORD)node->size & (sizeof(struct lmm_node) - 1)) == 0(node->next == 0) || (node->next > node)alloc_ge.canode >= node(split_size & (sizeof(struct lmm_node) - 1)) == 0lmm_dump(lmm=%p)
-dump.cnode->size >= sizeof(*node) free_check=%08lx
-reg->free == free_checklmm_dump done
- region %08lx-%08lx size=%08lx flags=%08lx pri=%d free=%08lx
- node %p-%08lx size=%08lx next=%p
-(node->size & (sizeof(struct lmm_node) - 1)) == 0block != 0reg != 0(DWORD)prevnode + prevnode->size == (DWORD)node(DWORD)node + size == (DWORD)nextnodestats.cLMM=%p: %u bytes in %u regions, %d nodes
-assertion %s failed in %s at line %i (task:%i_%i)
-MAGIC assertion failed in %s at line %i (task:%i_%i): %s
-KERNEL PANIC (sys_panic_stub): %s
-KERNEL PANIC (sys_panic): %s
-FreeExeSleepWaiting on joinTime (EXACT) : %lus %luns
-< Memory Dump >
-< Level %d : %s Code: %d Version: %d >
-8Œÿÿ’ÏÿÿšÏÿèS#ÿ_#ÿÿÿÿÿÿÿÿÿÿÿÿ1234567890!@#$%^&*()-_=+[{]};:'"`~/?,<.>\|   - -1234567890.+*/-+*-aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ 1234567890!"œ$%&/()='?^Š‚+*•‡…ø\|<_,:.;—õ   - -1234567890.+*/-+*-aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ[]@#\#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÍ3#Æ3#¿3#¸3#±3#ª3#£3#œ3#@|"H|"H|"ó8#æ8#Ø8#Ç8#¬8#–8#†8#r8#c8#S8#F8#18# 8#8#ú7#S8#ç7#þþAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAš':#ðÿÿÿÿGCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)01.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.01.symtab.strtab.shstrtab.text.rodata.data.sbss.bss.comment.note"€p(!€(#)h )èS#hD /ì^#€O5_#€O8ã :€OLCÌ`h4gI
\ No newline at end of file
/demos/branches/pj/pse51/ptest1
Property changes:
Deleted: svn:executable
## -1 +0,0 ##
-*
\ No newline at end of property
Index: demos/branches/pj/pse51/ptest2
===================================================================
--- demos/branches/pj/pse51/ptest2 (revision 1085)
+++ demos/branches/pj/pse51/ptest2 (nonexistent)
@@ -1,437 +0,0 @@
-ELF"4`d4 ( €""È@È@ HAÈP#ÈP# Pî 덶°­üORäe‹Ká€uU¿€ Ç–eÆG1GeÆGGeÆG2GeÆG¸Ôæ"fe£èP#Áèfe£îP#ÈX#¿€ Ç’eÆG0GeÆGf¸0ŽØŽÀŽÐŽàŽè¼àƒ#Ç°¹%àc#Ç´¹%àƒ#£ÔX#‰ØX#ÈX#êµ"8ÎX#üèâÒê U‰å‹Eê ‰öU‰åƒì0ÆEéxÆEê-ÆEèh0"ƒì‹Eèf‰$ÆD$-èiÇ$’-#èaæƒÄh@"hLÞ#èã>ƒÄÿ5LÞ#h¬-#è<æÇ$À-#è0æh†h°"jEäPèMƒÄ …Àtƒì hÓ-#èæƒÄƒìÿuähæ-#èôåÇ$û-#èèåhE h°"jEàPèGMƒÄ …Àtƒì h.#è¿åƒÄƒìÿuàh!.#è¬åÇ$6.#è åƒÄƒì jèn<ƒÄ=vìƒì hM.#è{åƒÄÿuäè˜NƒÄÿuàèNÇ$c.#èY布ÄÉÍvU‰åƒìÿ5lÞ#hp-#è6åƒÄÉÐU‰åSƒì‹]Sÿ5lÞ#h€.#è庅ëQ‰Ø÷êÁúÁû)ڃÄRÿ5LÞ#è9>ƒÄ‹]üÉÐU‰åƒìÿ5LÞ#èû=ƒÄ Pÿ5lÞ#hÀ.#èÇäƒÄÉÉöU‰åSƒì ‹]h$"hÜX#è¯OƒÄÿ5lÞ#hà.#è”äƒÄSÿ5LÞ#èÉ=ƒÄÿ5LÞ#è—=ƒÄ Pÿ5lÞ#hÀ.#ècäƒÄÿ5lÞ#h€-#èP七Ä‹]üÉÍvU‰åƒìèÁ:ÉÍvU‰åƒìj ÿujh'èMè‰è‡¬è¶²è1™ƒÄ jjjèÿLèîv¸èƒÄÉÃU‰åWVSƒìX‹]}¨¾àX#ü¹ó¥E¸‰E¨fÇE¸ÇE¼ÇEÀfÇEÄÇEÐÇEÔÇEÜÇEà‰]ÈÇEØÇEÌjè8L‰EÐÇEÜÇEàƒMÌ
-è֜E¨‰$ècƒÄ…Àyƒì h /#è»ãƒÄƒì SèoE¸ƒÄeô[^_]ÍvU‰åƒìŠU€=ðY#„¶€ú*t€úªt
-€ú6t€ú¶uÆðY#¸é›„Òy,ÆðY#€ú¸uÆüY#ÆòY#ëՀúuÐÆüY#ëljöÆðY#€ú8u€ -üY#ÆòY#멀úu € -üY#뛉ö€ú5uf¾•„#·Àé)v€ú…•f¾|„#·Àé -v€úàuÆðY#éTÿÿÿv€ú*t€ú6u2ÆñY#€ú*u€ -üY#é/ÿÿÿ‰ö€ú6…$ÿÿÿ€ -üY# éÿÿÿv€úªt€ú¶u"ÆñY#€úªt €ú¶…öþÿÿÆüY#éêþÿÿ€úFu€=õY#•õY#ë.v€ú:u€=óY#•óY#ëv€úEu;€=ôY#•ôY#ƒì¶õY#P¶óY#P¶ôY#Pèõ¸ƒÄé€úu€ -üY#éhþÿÿv€ú8u€ -üY#éTþÿÿv€út€ú¸uÆüY#é;þÿÿ‰ö¸„҈рúRt2€úOt-€úSt(€úPt#€úQt€úKt€úLt€úMt€úGt
-€úHt€úIu€=ôY#uT€=ñY#uK·Â -ÿë~€=óY#t/Bð< vBâ<vBÔ<w€=ñY#t¶Âf¾€`„#·ÀëG€=ñY#t¶Âf¾€…#·Àë-v€=òY#t¶Âf¾€ …#·Àëv¶Âf¾€`„#·ÀÉÃU‰åWVSƒì,}؃ìjE×PèòƒÄ…À„¡ƒì ¶E×Pèöüÿÿ‰ÂƒÄf…Ò„†÷Âÿt  üY#ƒÈ@ë‰ö üY#ˆE؈UيE׈EÚ±»;X„#}8¾àƒ#v݊D2:EÚuŠ2:EØuƒì Wÿ’äƒ#±ƒÄC;X„#|ЄÉuƒìjW¿"†#Pèý¡ƒÄè-é<ÿÿÿU‰å‹E£ìY#Šˆb„#ŠPˆc„#ŠPˆd„#ŠPˆe„#ŠPˆf„#ŠPˆg„#ŠPˆh„#ŠPˆi„#ŠPˆj„#ŠP ˆk„#ŠP
-ˆ…#ŠP ˆ…#ŠP ˆ…#ŠP -ˆ…#ŠPˆ…#ŠPˆ…#ŠPˆ…#ŠPˆ …#ŠPˆ
-…#ŠPˆ …#ŠPˆl„#ŠPˆ …#ŠPˆm„#ŠPˆ -…#ŠPˆz„#ŠPˆ…#ŠPˆ{„#ŠPˆ…#ŠPˆ‡„#ŠPˆ'…#ŠPˆˆ„#ŠPˆ(…#ŠP ˆ‰„#ŠP!ˆ)…#ŠP"ˆ•„#ŠP#ˆ5…#ŠP$ˆ“„#ŠP%ˆ3…#ŠP&ˆ”„#ŠP'ˆ4…#ŠP(ˆ‹„#ŠP)ˆ+…#ŠP*ˆ™„#ŠP+ˆ9…#ŠP,ˆn„#ŠP-ˆ…#ŠP.ˆo„#ŠÖˆ…#ŠP0ˆa„#ŠP1ˆ…#ŠP2ˆ|„#ŠP3ˆ…#ŠP4ˆd…#ŠP5ˆO…#ŠP6ˆP…#ŠP7ˆQ…#ŠP8ˆK…#ŠP9ˆL…#ŠP:ˆM…#ŠP;ˆG…#ŠP<ˆH…#ŠP=ˆI…#ŠP>ˆR…#ŠP?ˆS…#ŠP@ˆ®„#ŠPAˆ—„#ŠPBˆ•„#ŠPCˆª„#ŠPDˆN…#ŠPEˆ7…#ŠPFˆJ…#ŠPGˆ~„#ŠPHˆ…#ŠPIˆ„#ŠPJˆ0…#ŠPKˆŽ„#ŠPLˆ.…#ŠPMˆ€„#ŠPNˆ …#ŠPOˆr„#ŠPPˆ…#ŠPQˆ„#ŠPRˆ!…#ŠPSˆ‚„#ŠPTˆ"…#ŠPUˆƒ„#ŠPVˆ#…#ŠPWˆw„#ŠPXˆ…#ŠPYˆ„„#ŠPZˆ$…#ŠP[ˆ…„#ŠPRˆ%…#ŠP]ˆ†„#ŠP^ˆ&…#ŠP_ˆ’„#ŠP`ˆ2…#ŠPaˆ‘„#ŠPbˆ1…#ŠPcˆx„#ŠPdˆ…#ŠPeˆy„#ŠPfˆ…#ŠPgˆp„#ŠPhˆ…#ŠPiˆs„#ŠPjˆ…#ŠPkˆ„#ŠPlˆ…#ŠPmˆt„#ŠPnˆ…#ŠPoˆv„#ŠPpˆ…#ŠPqˆ„#ŠPrˆ/…#ŠPsˆq„#ŠPtˆ…#ŠPuˆ„#ŠPvˆ-…#ŠPwˆu„#ŠPxˆ…#ŠPyˆŒ„#ŠPzˆ,…#ŠP{ˆº…#ŠP|ˆ»…#ŠP}ˆDž#Š@~¢È…#]ÍvU‰åWVSƒì\‹]}ؾZ#ü¹󥿸ƒ=øY#…Qº¾`„#¹…#‰ö·ÂÆ0ÆBfúví…Ûu]؃{ÿuÇCìX#ƒì ÿsèûÿÿÇ$jjjhY/#èϔf£"†#ƒÄ fƒøÿu ¸þÿÿÿéÞ‰öjjjhY/#è0˜f£$†#ƒÄfƒøÿuƒì ¿"†#P蕛¸ýÿÿÿ頍vÇX„#ƒ{ÿuÇC "ƒ{tIÆE™cÆEš.ÆE˜ƒìÿsƒì‹E˜f‰$ÆD$.èÅÆE˜ƒÄÿsƒì‹E˜f‰$ŠEšˆD$襃ă;ÿuQfÇE¨ÇE¬ÇE°fÇE´ÇE¸ÇEÐÇEÈÐÇEÄ ÇEÀ¨aÇE¼
-ÇE̍E¨ë‹ƒì jjPh("hb/#èÿ‰ÃƒÄ ‰(†#ƒøÿu'ƒì ¿"†#P蓚¿$†#‰$脚‰Ø钐ƒ=Z#uWƒì ÿ5(†#艉ǃąÿt4ƒì ¿"†#PèLš¿$†#‰$è=šƒÄÿ5(†#èg5¸üÿÿÿë=ÇZ#ëèƒì¶õY#P¶óY#P¶ôY#PèûÇøY#‰øƒÄeô[^_]ÃU‰åƒì¶EPEèP¿$†#Pè0œƒÄ„Àt÷Eè@u¶Eéë‰ö¸ÉÐU‰åƒì ¶E Pÿu¿$†#Pèõ›·ÀƒÄÉÐU‰åSƒ=X„#0‹ -X„#Í»àƒ#‹Ef‰ŠE
-ˆD‹E ‰‚äƒ#A‰ -X„#‹$ÉÉöU‰åƒìèÉÍvU‰åƒìè±ÉÍvU‰åƒì¸ÿÿÿÿƒ=øY#t9蓃ì ÿ5(†#è-4¿"†#‰$è昿$†#‰$èט¸ƒÄÉÐU‰åƒìjèoÔÇ$è+ÔÇ$H/#èóÓè²-ƒÄÉÐU‰åWVSƒìŠEˆEó¿1¾d»`‰ö¹v‰òì©t"‰ÈA=þÿÿvì¸ÿÿÿÿ…Àu‰ÚŠEóî¸ë‰ö¸ë搸ÿÿÿÿÇEì¹d…Àt¸ÿÿÿÿët¸ë‰Êì©uî‹EìÿEì=þÿÿvé¸ÿÿÿÿ…Àu‰Úì¶Àë¸ÿÿÿÿƒøÿu
-¸þÿÿÿë3v=úu ¸ë"‰ö=þt ¸ýÿÿÿë‰ö‰øO…À9ÿÿÿ¸üÿÿÿƒÄ[^_]ÃU‰åVSƒìŠEˆE÷³Ô¾¹d‰ö‰Êì©t"‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë -¸ë搸ÿÿÿÿ…Àt¸ÿÿÿÿëL¸ë&»¹d‰ö‰Êì©tâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àuº`ŠE÷î¸ëv¸ÿÿÿÿ…Àt¸ÿÿÿÿëj¸ë&»¹d‰ö‰Êì©uâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àuºdì© tº`ì¶Ðëvºÿÿÿÿ‰Ð…Òx¸úú”ÀDþƒÄ[^]ÃU‰åWVSƒì »¾`‰ØK…À~^ƒì hÿè¼ýÿÿ‰ÂƒÄ…Òu{¿¹d‰Êì©u‰øG=þÿÿvì¸ÿÿÿÿ…Àu‰òì¶Ðëv¸ëꐺÿÿÿÿúªu›¸üÿÿÿúª…ƃì hõèMýÿÿ‰ÂƒÄ…Òt(¸ûÿÿÿ馉ö¸ýÿÿÿ隉ö¸ë.¸ëZ³`¾¹d‰Êì©tډðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî³e¾¹dv‰Êì©t®‰ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØîƒì hôèªüÿÿ‰ÂƒÄ¸…Ò•ÀHƒàƒèeô[^_]ÃU‰åWVSƒì ¾»d¹`‰Úì©t -‰Êì‰ðF=þÿvé³­¾¹d‰Êì©„‚‰ðF=þÿÿvè¸ÿÿÿÿ…ÀuºdˆØî¾»d¹`‰Úì©t -‰Êì‰ðF=þÿv鳪¾¹d‰Êì©t"‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ë搸놐¸ÿÿÿÿ…Àt¸÷ÿÿÿéݐ¸ë&»¹d‰ö‰Êì©uâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àu º`ì¶Àë¸ÿÿÿÿƒøUt¸ÿÿÿÿ錸ë&³«¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸öÿÿÿé9¸ë&»¹d‰ö‰Êì©uâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àu º`ì¶Àë¸ÿÿÿÿ…Àt¸þÿÿÿé鐸ë&³®¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…À…<èzüÿÿ…À…Žƒì hóèIúÿÿƒÄ…Àt
-¸ùÿÿÿépƒì jè.úÿÿƒÄ…Àt¸øÿÿÿéU¸ë.ÆZ#³©¾¹d‰Êì©tډðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸ôÿÿÿéù¸ë&»¹d‰ö‰Êì©uâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àu º`ì¶Àë¸ÿÿÿÿ…Àt¸óÿÿÿ驐¸ë&³¨¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸õÿÿÿéU¸ë&³Ó¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸ðÿÿÿ鐸ë&³Z¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØî¸ë¸ÿÿÿÿ…Àt¸ïÿÿÿ魐ÆZ#ëBv¸ë^¹þÿ¾d»`‰òì¶ø÷Çt‰Úì¶À÷Ç tƒøZt»IƒùÿuÙ³§¾¹d‰Êì©tª‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àté»þÿÿ‰ö¸ë:€=Z#„þÆZ#³¨¾¹d‰Êì©tΉðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸îÿÿÿ鱐¸ëvƒì hóèWøÿÿ‰ÃÇ$dèIøÿÿÃÇ$èè;øÿÿÃÇ$è-øÿÿÃÇ$çèøÿÿþ§ƒÄ¿¹dv‰Êì©t’‰øG=þÿÿvì¸ÿÿÿÿ…Àuºd‰ðî¸ë¸ÿÿÿÿ…Àt¸íÿÿÿë…ÛuÆZ#¸eô[^_]ÃU‰åVS¡$Z#…Àt¡$Z#H£$Z#¸é²¸ë6ƒ=Z#uKŠ Z#¾¹dv‰Êì©t҉ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØîÿZ#뤍v¸ë:ƒ=Z#uGÇZ#³ô¾¹d‰Êì©tΉðF=þÿÿvì¸ÿÿÿÿ…À…Xÿÿÿº`ˆØîéKÿÿÿ‰ö¸[^]ÍvU‰åWVSƒì ¡(Z#@£(Z#¾õ³Ô¿¹dv‰Êì©t"‰øG=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ë搸ë.¸ÿÿÿÿ…Àu0»¹d‰Êì©tډØC=þÿÿvì¸ÿÿÿÿ…Àuº`‰ðîœúX‰Çƒì hõè5õÿÿ‰ÃƒÄ…Ût¸ûÿÿÿéù‰ö¸ë1¾§ÇEð¹dv‰Êì©tڋEðÿEð=þÿÿvé¸ÿÿÿÿ…Àu ºd‰ðî¸ë¸ë=¸ëq¸ÿÿÿÿþ`ÇEð¹d‰Êì©t΋EðÿEð=þÿÿvé¸ÿÿÿÿ…Àuºd‰ðî¾eÇEð¹dv‰Êì©tš‹EðÿEð=þÿÿvé¸ÿÿÿÿ…Àuº`‰ðîƒì hôè;ôÿÿÃĉøPÆZ#‰Øeô[^_]ÐU‰åWVSƒì ¸ÿÿÿÿ€=Z#„ºœúX‰Æƒì hõèóóÿÿƒÄ…Àt(¸ûÿÿÿé—‰ö¸ë:¸ëf¸é“‰ö³`¿¹d‰Êì©tΉøG=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî³G¿¹dv‰Êì©t¢‰øG=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØ¿¹dv‰Êì©„rÿÿÿ‰øG=þÿÿvè¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt ¸îÿÿÿ鐃ì hôèÿòÿÿƒÄ…Àt¸Ûÿÿÿ飉ö¸ë:‰ðP¡(Z#@£(Z#¾ô³Ô¿¹d‰Êì©tΉøG=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë -¸ë.¸ÿÿÿÿ…Àu0»¹d‰Êì©tډØC=þÿÿvì¸ÿÿÿÿ…Àuº`‰ðîÆZ#¸eô[^_]ÍvU‰åƒìÇD‡#Ç@‡#ƒ=Z#t!úè‹õÿÿ£Z#ÇZ#û…Àtúèôÿÿû¡Z#…Àuƒìÿuh ""jèQ¸ƒÄÉÍvU‰åVS¡$Z#@£$Z#³õ¾¹d‰Êì©t"‰ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØî¸ë -¸ë搸ÿÿÿÿ[^]ÍvU‰åVS¡$Z#@£$Z#³ô¾¹d‰Êì©t"‰ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØî¸ë -¸ë搸ÿÿÿÿ[^]ÍvU‰åƒì‹MœúX‰Â¡@‡#@%ÿ£@‡#Š€@†#ˆ‰ÐP€9úu è(úÿÿë‰ö¸ÉÐU‰åƒìƒ=0Z#t(Ǥ‡#Ç ‡#Ǩ‡#Ç0Z#‹E£,Z#ƒ=Z#t!úèôÿÿ£Z#ÇZ#û…Àtúèòÿÿû¡Z#…Àu.¸ìÿÿÿ€=Z#t ƒìjÿhH""j èOÆZ#¸ƒÄÉÉöU‰åS‹MœúX‰Ã¡ ‡#@ƒà?£ ‡#º`‡#ŠˆA¡ ‡#@ƒà?£ ‡#Šˆ¡ ‡#@ƒà?£ ‡#ŠˆA‰ØP¸‹$ÉÉöU‰åƒì€=Z#tèäùÿÿƒì j èŽOÆZ#¸ƒÄÉÐU‰åƒìƒ=Z#t!úè óÿÿ£Z#ÇZ#û…Àtúè™ñÿÿû¡Z#…Àt¸ë¶Z#ÉÍvU‰åVSŠEŠU€} t ƒ - Z#ë ‰öƒ% Z#„Àt ƒ - Z#ëƒ% Z#„Òtƒ - Z#ë¸ë6¸ëbƒ% Z#³õ¾¹d‰Êì©t҉ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØî³í¾¹dv‰Êì©t¦‰ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØîÿZ#[^]ÐU‰åSƒìœúX‰Ã€=Z#tè–øÿÿè‘ðÿÿƒì hóèhîÿÿƒÄ…Àuƒì jèWîÿÿƒÄ…Àu‰ØP‹]üÉÍvU‰åº`ì¶ÈœúX‰Â¡@‡#;D‡#t¡D‡#ˆˆ@†#@%ÿ£D‡#‰ÐP]ÉöU‰åƒìº`ì¶Ðƒ=¨‡#u €úúu¡(Z#H£(Z#郍v÷ÂÀuxÿ¨‡#œúX‰Á¡ ‡#;¤‡#t¡¤‡#ˆ`‡#@ƒà?£¤‡#ë"‰ö¡¤‡#+¨‡#ƒÀAƒà?£¤‡#Ǩ‡#‰ÈPƒ=¨‡#uǨ‡#ƒì ÿ5,Z#èƒÄÉÉöU‰åSƒì}™w‹UÑâU‰ÐÁà)Ðfƒ<Åhß#uèùÝNj¸ÿÿÿÿ鏐ƒ=@Þ#tcœúX‰Ã‹UÑâU‰ÐÁà)ЍÅ0ö€Aß# t ÿ€Dß#ë-v‹EÑàE‰ÂÁâ)‹ÕDß#ƒì‹• Þ#ÿuRÿP@ƒÄ‰ØPéèƒ¡…ÀtgœúX‰Ã‹UÑâU‰ÐÁà)ЍÅ0ö€Aß# t ÿ€Dß#ë2v‹EÑàE‰ÂÁâ)‹ÕDß#ƒì‹• Þ#ÿuRÿP@蔃ĉØPé­úèJ²‹lÞ#R‰ÑÁá)Ñ»@ß#f‰DË‹UÑâU‰ÐÁà)ЍÅ0öD t ÿ€Dß#ë?vƒìU‰ÐPjÿlZ#‹MI‰ÐÁà)ЋÅDß#ƒÄ‹• Þ#QRÿP@è/ƒÄ¡lÞ#@‰ÂÁâ)ƒì ¿ÕHß#P踱èƒÄû¸‹]üÉÐU‰åWVSƒì ‹]f…Ûuè>Ünj¸ÿÿÿÿé"‰öƒ=@Þ#„“œúX‰ÇÇEð}ð™s¾@ß#‹UðÑâUð‰ÐÁà)ÐÁàf9\,uHƒÀ0öD0 t ÿ€Dß#ë6ƒìEðPjÿlZ#‹MðI‰ÐÁà)ЋÅDß#ƒÄ‹• Þ#QRÿP@ƒÄÿEð}ð™~“‰øPé}‰ö蓟…À„›œúX‰ÇÇEð}ð™w¾@ß#‹Eð@‰ÂÁâ)Õf9\,uJƒÀ0öD0 t ÿ€Dß#ë8vƒìEðPjÿlZ#‹MðI‰ÐÁà)ЋÅDß#ƒÄ‹• Þ#QRÿP@ƒÄÿEð}ð™~èj‰øPéԐúè"°‹lÞ#R‰ÑÁá)Ñf‰ÍHß#ÇEð}ð™w¾@ß#‹Eð@‰ÂÁâ)Õf9\,uJƒÀ0öD0 t ÿ€Dß#ë8v‹MðI‰ÐÁà)ЋÅDß#ƒì‹• Þ#QRÿP@ƒÄEðPjÿlZ#ƒÄÿEð}ð™~èÞ ¡lÞ#@‰ÂÁâ)ƒì ¿ÕHß#Pèj¯èÁƒÄû¸eô[^_]ÃU‰åSƒìúè;¯‹lÞ#R‰ÑÁá)Ñf‰ÍHß#ƒìh$ß#jèl–ƒÄUð¡(ß#;xÞ#|¡$ß#+tÞ#‰Eð¡(ß#+xÞ#ë!‰ö¡$ß#+tÞ#H‰Eð¡(ß#+xÞ#ʚ;‰B‹Mð ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ôºÓMb‰Ø÷êÁú‰ØÁø)ÂыlÞ#R‰ÐÁà)Ð) Ōß#ƒì Qè. ƒÄƒ=|Þ#ÿtƒì ÿ5|Þ#ÿHÞ#Ç|Þ#ÿÿÿÿƒÄ‹ -lÞ#I‰ÐÁà)ЋÅDß#ƒì‹… Þ#QPÿRLè{ ƒÄhlÞ#jÿlZ#ÇlÞ#ÿÿÿÿÇ€Þ#ÿÿÿÿèV ¡lÞ#@‰ÂÁâ)¿ÕHß#‰$èã­è:ƒÄû‹]üÉÐU‰åƒìhÌ("è( ƒÄÉÍvU‰åƒìjè ƒÄÉÉöU‰åƒìƒ=8Z#u(èè
-ƒì ¡lÞ#@‰ÂÁâ)¿ÕHß#Pèt­ƒÄÉÍvU‰åWVSƒìhj/#è]$ƒÄ»@ß#ëv‹Eð@‰ÐÁà)ЁLÃ0€ƒì häÞ#èÊ+‰EðƒÄƒøÿ„“@‰ÐÁà)ÐöDÃ1@u¾‹UðR‰ÃÁã)ÃÁã¾@ß#¡4Z#‰3@£4Z#‹E ‰DƒìjÿuƒTß#Pè ¾ÆD'ƒÃ fÇD3‹Mf‹%ÿf‰D3
-f‹A f‰D3 ƒÄ‰Ø‰ñº‹]ƒ{tf‹Sf‰T‹UðR‰ÁÁá)ÁÁáY0‹U‹B -‰ƒ@ß#¿Dß#Ç;¾Hß#¡lÞ#@‰ÂÁâ)‹DÖ0‰3ºLß#ǍAP‹]ð‰˜@ß#Ç8ÇÿÿÿÿÇ0ÿÿÿÿǁ ß#°Ç8Ç0ǁÁÀǁ@ß#Ç9ºۍƒ€ 
-Ç…¤ß#Bƒúvì‹Eð@‰ÐÁà)ÐÁàÀǂHß#ÿÿÿÿǂLß#”ß#‰à#º‹Mðɍ€ ‰ö
-Ç…à#Bƒú~ì»ëC;pÞ#sƒì‹ Þ#ÿuSÿPƒÄ…Àxß;pÞ#u7‹]ð[‰ÂÁâ)ÂfÇÕhß#ƒìhäÞ#SèÚ)è¡ÕDŽ鄉ö‹Eð@‰ÐÁà)Ѝ4ʼnžDß#ƒì‹ Þ#ÿuÿuðSÿP,ƒÄ…ÀyWfdžhß#ƒìhäÞ#ÿuðèz)èAÕDžë'è3Õǃ釃ì ÿuðè9èÕdž¸ÿÿÿÿƒÄëjƒE‹U‹zü…ÿtY‰ö¾ëF;5dÞ#s0ƒìµ‹ƒß#WVÿP ƒÄ…Àxۃ싃ß#WÿuðVÿP$ƒÄ;5dÞ#t‡ƒE‹M‹yü…ÿu©‹Eðeô[^_]ÉöU‰åƒìEPÿuÿu ÿuè`üÿÿƒÄÉÍvU‰åWVSƒì ‹} ƒt6‹EÑàE‰ÂÁâ)‹G‰ÕLß#‰Æ‹UÑâU‰ÐÁà)Ѓ Åpß#@ën‰öƒì ‹UÑâU‰ÐÁà)зÅnß#Pè@‹UÑâU‰ÑÁá)Ñ»Lß#‰ˉƋEÑàE‰ÂÁâ)ƒÄƒ<Óuƒì ÿuèìèËÓLjëtv‹EÑàE‰ÂÁâ)»@ß#·DÓ.ƃì ·GPjÿwVh¸/"è-‰ÁƒÄ f…Éu?ƒì‹UÑâU‰ÐÁà)зDÃ.PVèƒÄÿuèvèUÓlj¸ÿÿÿÿƒÄëN‹EÑàE‰ÂÁâ)Âf‰ ÕHß#ƒìU‰ÐPjÿlZ#ƒÄöGu ÿ`Þ#ëvöGuÿ ß#¸eô[^_]ÍvU‰åWVSƒì ‹M‹U ‹]œúX‰ÇEPSRQè­úÿÿ‰ÆƒÄƒþÿ„ɍv‰ÐÁà)ЋÅDß#‹… Þ#ƒx(„èà…À‰€»;dÞ#svƒì‹ß#VSÿP(ƒÄC;dÞ#råv‰ÃÁã)ÃÁ㋃Dß#ƒì‹… Þ#VPÿR0fǃhß#ƒÄhäÞ#Vè\&ƒÄè ÒLJ‰øP¸ÿÿÿÿë#vƒìSVèŽýÿÿƒÄº…À”ÂJ ։øP‰ðeô[^_]ÃU‰åVS‹u»;dÞ#svƒì‹ß#VSÿP(ƒÄC;dÞ#råv‰ÃÁã)ÃÁ㋃Dß#ƒì‹… Þ#VPÿR0fǃhß#ƒÄhäÞ#Vè¬%ƒÄeø[^]ÉöU‰åVS‹]è ƒì ¡lÞ#@‰ÂÁâ)¾@ß#SÿTÖú‰$èn¡lÞ#@‰ÂÁâ)¿DÖ‰$èn¦ƒÄeø[^]ÃU‰åWVSƒì‹]‹}úû™w! [‰ÈÁà)ÈÁàº@ß#öD0tfƒ|(u û¸ÿÿÿÿéDžÿy$[‰ÁÁá)Á Í°¸Dß#‹<Çë ‰öƒÿv¿[‰ÁÁá)Á Í°‰Mä¹Hß#‰Mì‹Uä‹
-‰Â)úƒÂ‰Ð¾º÷ö‰Eð‹uä;tMۍƒ€4‹MðىÈÁà)ȍ Å°‰ö2‹…¤ß#‹] ‰ƒÃ‰] B»‰Ðº÷ó‹]ì;uÔû‰øƒÄ[^_]ÐU‰åSƒì‹]‹ -lÞ#I‰ÐÁà)ЍÅö‚pß#tɍ€È‚øß#…¤ß#¡$ß#;tÞ#|;tÞ#uA¡(ß#;xÞ#}4ƒìSÿ5lÞ#ÿ5xÞ#ÿ5tÞ#ÿ5(ß#ÿ5$ß#h€/#è8¶ƒÄ è@ ‹]üÉÍvU‰åWVS‹ -lÞ#I‰ÐÁà)ЍÅöƒpß#„›ɍ€ȍ‹°Hß#ºDß#‹t‚`‹”À¸Lß#94s‰4‹lÞ#[‰ÁÁá)ÁÁፁÀ°@ß#¿Dß#B‰8±°‹†Hß#@º‰Ñº÷ñ‰–Hß#ۍƒ€ØÐÇD‡`ƒ<>wÿ>[^_]ÉöU‰åWVS‹M‹] ‹u‹}úù™w!I‰ÐÁà)ÐÁàº@ß#öD0tfƒ|(uû¸ÿÿÿÿëy…ÛtI‰ÂÁâ)‹Õà#‰…ötI‰ÂÁâ)‹Õüß#‰…ÿtI‰ÂÁâ)‹Õà#‰ƒ}t(ɍ€ȍ I‰ÊÁâ)ÊÕøß#‹…¤ß#‹U‰û¸[^_]ÉöU‰å‹Múù™w!I‰ÐÁà)ÐÁàº@ß#öD0tfƒ|(uû¸ÿÿÿÿë7I‰ÂÁâ)ÂÁ⍂Àǀ@ß#ǀDß#ǂüß#û¸]ÍvU‰åWVSƒì ƒ=lÞ#ÿt¡lÞ#@‰ÂÁâ)ÂöÕpß#…3ƒ=lÞ#ÿ„ƒìh$ß#j證ƒÄUè¡(ß#;xÞ#|¡$ß#+tÞ#‰Eè¡(ß#+xÞ#ë"v¡$ß#+tÞ#H‰Eè¡(ß#+xÞ#ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ìºÓMb‰Ø÷êÁú‰ØÁø)ÂыlÞ#R‰ÐÁà)Ð) Ōß#ƒì QènüÿÿƒÄƒ=|Þ#ÿtƒì ÿ5|Þ#ÿHÞ#Ç|Þ#ÿÿÿÿƒÄ‹ -lÞ#I‰ÐÁà)Ћ<ÅDß#ƒì‹½ Þ#QWÿP<ƒÄ¿4½ƒì ‹† Þ#WÿP$‰ÃƒÄƒûÿt%ƒì[‰ÐÁà)ЋÅDß#‹… Þ#SPÿR4ƒÄ븅Àx»ƒûÿuG뫍v‹5lÞ#‰€Þ#‰lÞ#[‰ÐÁà)Ð;Őß#t0»@ß#‰ö¡lÞ#@‰ÂÁâ)‹TÓP‰lÞ# R‰ÈÁà)È;TÃPu×;5lÞ#tƒìhlÞ#jÿlZ#ƒÄ‹ -lÞ#I‰ÐÁà)ÐÁà¾@ß#fÇD(‹¸Dß#ƒì‹½ Þ#‹€Þ#¸;lÞ#•ÀPQWÿS8¡lÞ#@‰ÂÁâ)ƒÄöDÖ1„Ü¡€Þ#;lÞ#…Ë¡$ß#‰EèMè¡lÞ#@‰ÂÁâ)»Lß#‹DÓ@º@B‰Ö™÷þ’’’Áâ‰Ö5(ß#‰q¿¡/¸D‰ø÷î‰×Áÿ‰ð™‰þ)Ö¡lÞ#@‰ÂÁâ)‹\Ó@ºƒÞC‰Ø÷êÁú‰ØÁø)2Eè‹AºÊš;‰Ó™÷û‰Qjhä="ÿuìÿuèÿDÞ#‰ÃƒÄƒûÿuƒìÿ5lÞ#jèû7ƒÄ‰|Þ#¡$ß#£tÞ#¡(ß#£xÞ#eô[^_]ÉöU‰åWVSƒìÇО%úÿuèD»ƒÄ¿Dß#¾@ß#‰ö[‰ÂÁâ)ÂÁâÇ:ÿÿÿÿǂLß#ÆDB fÇD0fÇD0
-fÇD0 fÇD0B0Ç0Ç8ǀHß#ǀLß#‚„ß#Ç@ÇǂŒß#BP‰0Ç8ÇD`DŽÐ‚â#Ç@Ǎ‚àÇ0ÿÿÿÿÇ8ÿÿÿÿ‚°Ç8ǀHß#ǀLß#ÂÀÇ2Ç:ºۍƒ€ v
-ÇD‡`Bƒúvï[‰ÐÁà)ЍÅÀǀHß#ÿÿÿÿǀLß#ºۍƒ€ 
-DŽ†ÐBƒú~ìCû™Žƒþÿÿ»¹Hß#[‰ÂÁâ)C‰DÑP‰Ãû˜~åÇ@œ%ÿÿÿÿ»™¹Lß#[‰ÂÁâ)Cÿ‰DÑP‰Ã…ÛéÇœß#ÿÿÿÿÇäÞ#ÇhÞ#Ç`Þ#Ç ß#Ç€Þ#ÿÿÿÿÇlÞ#ÿÿÿÿÇ|Þ#ÿÿÿÿÇxÞ#ÇtÞ#ÇpÞ#ÇdÞ#Ç@Þ#èÚè}è42ƒì ÿuèqÉÿÿ£èÞ#ƒÄ=×Övƒì hà/#èÇ$è »ƒÄ¸ƒ=èÞ#”À‰Eè]è¡èÞ#‰CÇО%躂ƒì S豌Ç$x>"èÇÇ$¸("聎Ç$Ð="蕎ƒÄjjèEÿtZ#ƒÄh$ß#jèLƒèOùÿÿèê›f£àÞ#¡lÞ#@‰ÂÁâ)¾@ß#¿DÖ‰$èϛÇ$è7ŽÿpZ#ÇО%ƒÄ»ƒ=hÞ#ŸÃSjèɃă= ß#teè„ Ç8Z#ƒìh$ß#j軂è^›f£àÞ#è³øÿÿÇ$Ð="èǍ¡lÞ#@‰ÂÁâ)¿DÖ‰$è7›Ç$蟍ƒÄÇО%ƒìSjèCèÇО%ƒÄjjè(ƒÄúƒ=hÞ#t"ƒìÿ5hÞ#h 0#èP¬Ç$ÿÿÿÿèX¹ƒÄƒì jèK¹ƒÄeô[^_]ÃU‰åSƒìƒ=8Z#…•èW‰…Àuú腚‹lÞ#R‰ÑÁá)Ñf‰ÍHß#‹E£hÞ#Ç8Z#ƒ=lÞ#ÿ„ƒìh$ß#j藁ƒÄUð¡(ß#;xÞ#|¡$ß#+tÞ#‰Eð¡(ß#+xÞ#ë ¡$ß#+tÞ#H‰Eð¡(ß#+xÞ#ʚ;‰B‹Mð ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ôºÓMb‰Ø÷êÁú‰ØÁø)ÂыlÞ#R‰ÐÁà)Ð) Ōß#ƒì QèZôÿÿƒÄƒ=|Þ#ÿtƒì ÿ5|Þ#ÿHÞ#Ç|Þ#ÿÿÿÿƒÄ‹ -lÞ#I‰ÐÁà)ЋÅDß#ƒì‹… Þ#QPÿR<Ç€Þ#ÿÿÿÿÇlÞ#ÿÿÿÿƒÄèü‡…Àtƒì ¿àÞ#Pè,™ƒÄëvƒì ¿àÞ#Pè™èkƒÄû‹]üÉÉöU‰åSƒìÇEøÿÿÿÿ»º Þ#¡ Þ#ƒx(t1ƒì‹šUøRSÿP(ƒÄ…Àu¸ÿÿÿÿëCƒûwº Þ#‹šƒx(uи‹]üÉÉöU‰åƒìè è+ÉÉöU‰åƒìÇ|Þ#ÿÿÿÿè§êÿÿÉÐU‰åSƒìœúX‰Ãƒ=О%tƒ= ß#t‰ØPëƒì jè–ýÿÿƒÄ‰ØP‹]üÉÉöU‰åƒìÿuèzýÿÿƒÄÉÐU‰åSƒì‹UœúX‰ÃƒìRjèZ‰ÂƒÄ‰ØP‰Ð‹]üÉÉöU‰å¸hÞ#ƒ=lÞ#ÿt‹lÞ#R‰ÐÁà)ЍÅ ß#]ÉöU‰åSƒìœúX‰Ãƒ=О%tƒ= ß#t‰ØPëƒì ÿuèíüÿÿƒÄ‰ØP‹]üÉÐU‰å]ÍvU‰åWVSƒì ÇEðÇE컍[ …ƒ¹È‡#t[¿À‡#ƒ<9tP‹lÞ#ҍ‚€Ð؍…о@ß#ƒ<0t+ûƒì ÿ40ÿ9ƒÄú‹lÞ#ҍ‚€Ð؋´†Ð uìCƒû~Œƒ}ìt -ÿEðƒ}ðŽmÿÿÿeô[^_]ÐU‰åVSº¾À‡#»Ä‡#¹È‡#vRÁàÇ0B‰Çƒú~ãǸ#ÿÿÿÿÇÀ#Çȇ#ÇÀ‡#Çć#ÿÿÿÿ[^]ÐU‰åS‹Múƒ=À#ÿu û¸ ënv¡À#@Ǖȇ#‰¡À#@‹…ć#£À#‹@‹U ‰…À‡#º»@ß#‰öҍ‚€ÐDŽƒÐBú™~ßû¸‹$ÉÃU‰åú¡lÞ#À’ÂU‹•à#û]ÍvU‰å‹Múƒùw -Iƒ<…ȇ#u û¸ë%v¡lÞ#À’ÂʋE ‰•à#û¸]ÃU‰åS‹]œúX‰Áƒûw -[ƒ<…ȇ#u‰ÈP¸ë.v[Áà‹À#‰Ä‡#ǀȇ#‰À#‰ÈP¸‹$ÉÃU‰åWVSƒì ¡lÞ#‰Eð‰ÂÑâ‰ÐÁà)ЍÅ¿@ß#öD0 tm‹E‰‚ à#‹UðÑâUð‰ÐÁà)ЁLÇ0@‹UðÑâUð‰ÐÁà)ЍÅÀºHß#ƒ<ÿt,‹4v‰ÃÁã)ÃÁ㋃Dß#ƒì‹… Þ#VPÿRD‰tPƒÄ¹»@ß#;MðtI‰ÐÁà)ЋUð9TÃP„ˆAù™~ۋUðÑâUð‰ÐÁà)Ѓ<Ŕß#t[»Dß#ûƒì ‹UðÑâUð‰ÐÁà)ЋDÃPÿpÿƒÄú‹EðÑàEð‰ÂÁâ)ÕP‹‹@‰‹UðÑâUð‰ÐÁà)Ѓ|ÃPu«èJüÿÿƒì ‹EðÑàEð‰ÂÁâ)»@ß#¿DÓPèÔyƒÄEðPjÿlZ#‹Eð@‰ÂÁâ)ՃÄöD0@u%ƒì·D.P‹Eð@‰ÂÁâ)Âÿ4ÕLß#èÁ ƒÄ»;dÞ#sƒì‹ß#ÿuðSÿP(ƒÄC;dÞ#rã‹MðI‰ÐÁà)ЋÅDß#ƒì‹… Þ#QPÿRPÇlÞ#ÿÿÿÿÇ€Þ#ÿÿÿÿ‹Eð@‰ÂÁâ)ƒÄöÕpß#u&ÿ -`Þ#ƒ=`Þ#uBèZúÿÿë;ƒìRjèY+ƒÄëg‹Eð@‰ÂÁâ)ÂöÕpß#uÿ - ß#ƒ= ß#uèúÿÿƒìh$ß#jèÒyƒÄƒ=|Þ#ÿtƒì ÿ5|Þ#ÿHÞ#Ç|Þ#ÿÿÿÿƒÄè­ïÿÿeô[^_]ÐU‰åVS‹uúv‰ÐÁà)ÐÁàº@ß#öD0ufƒ|(uèѼNJû¸ÿÿÿÿ麍v‰ÐÁà)ÐöÅqß#tû雉ö;5lÞ#uJv‰ÐÁà)л@ß#‹DÃ0©t0©u)ƒì jè¥üÿÿ¡lÞ#@‰ÂÁâ)¿DÓ‰$襑ƒÄ»ëvC;<Z#}ƒìÝÿ°ä#Vÿà#ƒÄ…Àtٍv‰ÐÁà)Ё Åpß#û¸eø[^]ÍvU‰åWVSƒì ‹Ef‰Eòf…Àuèâ»ÇŒ¸ÿÿÿÿé‰öú¡€Þ#@‰ÂÁâ)Âf‹Mòf; Õlß#”Eñ¾¿@ß#‰öv‰ÐÁà)ÐÁà‹T0÷Â…ˆƒÀ fƒ|8t}÷Âuuf‹Mòf9L8 uj;5lÞ#u!÷Ât÷Âuƒì jè{ûÿÿƒÄëC‰ö»ëC;<Z#}ƒìÝÿ°ä#Vÿà#ƒÄ…Àtٍv‰ÐÁà)ЁLÇ0Fþ™ŽNÿÿÿ€}ñt(ƒì ¡€Þ#@‰ÂÁâ)¿ÕHß#P萃Äëvû¸eô[^_]ÉöU‰åWVSƒì ¾¿@ß#v‰ÐÁà)ÐÁàfƒ|(tL÷D0
-uB»ë‰öC;<Z#}ƒìÝÿ°ä#Vÿà#ƒÄ…Àtٍv‰ÐÁà)ЁLÇ0Fþ™~–eô[^_]ÉöU‰åSƒì¡lÞ#@‰ÂÁâ)»@ß#‹DÓ0©t7©u0©t)ƒì jè"úÿÿ¡lÞ#@‰ÂÁâ)¿DÓ‰$è"ƒÄ‹]üÉÉöU‰åS‹M‹] ¡<Z#ʼnŠà#‰šä#@£<Z#‹$ÉÍvU‰åƒìúÿuè½ùÿÿ¡lÞ#@‰ÂÁâ)¿ÕHß#‰$躎ƒÄÉÐU‰åVS¶uœúX‰Ãƒ=‘#ÿuèH¹Ç‚‰ØP¸ÿÿÿÿéۋ -‘#‰ÊÁâ‹‚ŒŽ#£‘#‹E‰‚€Ž#‹E ‰‚„Ž#‰ðƒà‰‚ˆŽ#‰ðƒàƒøtOƒø
-ƒøt -ësvƒøtSëi‰ÈÁàǀŒŽ#ÿÿÿÿƒ=‘#ÿu‰ -‘#ë¡‘#Áà‰ˆŒŽ#‰ -‘#ëH‰ö‰ÊÁâ¡‘#‰‚ŒŽ#‰ -‘#ë.‰ÊÁâ¡ ‘#‰‚ŒŽ#‰ - ‘#ë‰ÊÁâ¡‘#‰‚ŒŽ#‰ -‘#‰ØP¸[^]ÐU‰åƒìƒ=pÞ#uƒì h@0#èŒÇ$謃ġpÞ#P‰pÞ#ÉÐU‰åƒìƒ=dÞ#uƒì h_0#èPÇ$èÌ«ƒÄ¡dÞ#P‰dÞ#ÉÐU‰åWVS‹E‹u ‹}»‹HÇöt<€9t5‹ ‰‡€: t€:t‰öC€< t€< uó€< uÆ Cÿ€< uÌÿ[^_]ÐU‰åWVSì¬‹EµTþÿÿ½Xþÿÿ»‹HDžTþÿÿöt<€9t5‹ ‰‡€: t€:t‰öC€< t€< uó€< uÆ Cÿ€< uÌÿƒì…XþÿÿPÿµTþÿÿ詶ÿÿƒÄeô[^_]ÉöU‰å¸¹ŒŽ#v‰ÂÁâ@‰
-ƒø&~òÇü#ÿÿÿÿÇ‘#ÿÿÿÿÇ‘#ÿÿÿÿÇ‘#ÿÿÿÿÇ ‘#ÿÿÿÿÇ‘#ÿÿÿÿÇ‘#]ÉöU‰åWVSƒì ‹E‹} ƒøt4ƒø ƒøtéЃøt3ƒøtB鳐‹‘#Ç‘#ÿÿÿÿë:‰ö‹‘#Ç‘#ÿÿÿÿë&‰ö‹ ‘#Ç ‘#ÿÿÿÿë‰ö‹‘#Ç‘#ÿÿÿÿÇ@Þ#ƒûÿtM¾ŒŽ#…ÿt‰ØÁàƒ¸ˆŽ#uƒì ‰ØÁàÿ°„Ž#ÿ€Ž#ƒÄ‰Ù‰ØÁà‹0‰Â¡‘#‰2‰ -‘#ƒûÿu¸Ç@Þ#eô[^_]ÉöU‰åƒìEüPEøPEôPEðPèI‡Ç$ ‘#èÅӃÄjjhÿÿjh$‘#h ‘#èðɃÄjjhÿÿÿhh@‘#h ‘#èÐɃÄjjhÿÿÿþhh\‘#h ‘#è°ÉƒÄ ƒ}ütƒì‹EüHPÿuøh ‘#èzȃă}ôtƒìÿuôÿuðh ‘#è^ȃÄÉÐU‰åƒì‹E…Àu¸ëƒìjPh ‘#èʃÄÉÍvU‰åƒìÿuÿuÿu ÿuh ‘#è¸ËƒÄ ÉÍvU‰åƒì ÿuÿuÿuÿuÿu ÿuh ‘#è²ËƒÄ ÉÐU‰åƒì ÿu ÿuh ‘#èfЃÄÉÐU‰åƒìÿuh ‘#èM΃ÄÉÃU‰åƒìÿuh ‘#èM҃ÄÉÃU‰åƒì jÿuh ‘#èSɃÄÉÉöU‰åƒì ÿu ÿuh ‘#èþσÄÉÐU‰åƒìh ‘#è ÎÇ$ ‘#è ҃ÄÉÍvU‰åWVSƒì} ‹uEðPh´0#VèÖ¥‰ÃƒÄƒûuƒ}ðvÇEðƒÆë ‰öÇEð‹Eðº;@Z#~hƒìWVh€‘#蜃Äj
-VèK›ƒÄ»…À•ÃœúX‰Æƒìh€‘#‹Eðÿ4…DZ#h¹0#è]™ƒÄ…Ûuƒì h\1#èI™ƒÄ‰ðPº‰Ðeô[^_]ÍvU‰åVSƒìu ‹]EôPh´0#S襃ăøuƒ}ôvÇEôƒÃëÇEô‹Eôº;@Z#~JƒìVSh€‘#èB›ƒÄj
-S臚ƒÄœúX‰Ãƒìh€‘#‹Eôÿ4…DZ#h¹0#裘ƒÄ‰ØPº‰Ðeø[^]ÉöU‰åVSƒì@‹u‹] ‹EfÇEÈÇEÌÇEÐfÇEÔÇEàÇEäÇEìÇEð‰EØÇEÜÇEè…ÛtT‹C‰E̋C‰EЃ{u
-ÇEÜ1됃eÜߋC ‰EàÇEÀƒì ÿ5€•#è)7ƒÄ+C ‰EċC‰Eì‹C‰EðëD‰öÇEÌÇEЃMÜ ÇEàÇEÀƒì ÿ5€•#èâ6ƒÄ‰EÄÇEìÇEðèI±‹ƒì jEÀPEÈPÿuhÁ0#èAÞÿÿ‰ƒÄ ƒøÿt ƒì PèòÒÿÿƒÄ豉¸ƒ>ÿ”ÀHƒàêƒÀeø[^]ÍvU‰åƒìÿ5€•#èc6ƒÄÉÉöU‰åƒìÿ5€•#èc6ƒÄÉÉöU‰åƒìÿ5€•#è{5ƒÄÉÉöU‰å‹E‹U ‹M£€•#‰„•#‰ -ˆ•#]ÐU‰åVS‹]è°‹0ƒì Sètóÿÿ‰Ãèm°‰0ƒÄ¸…Û•À@eø[^]ÃU‰åƒìúÿuÿu ÿuÿ5€•#èé5ƒÄûÉÍvU‰åWVSƒì ‹}‹uúÿ6ÿu Wÿ5€•#è3‰ÃƒÄ…Ûu#ƒìÿ5€•#èx5ƒÄ+PWÿ5ˆ•#èffƒÄû‰Øeô[^_]ÃU‰åSƒì ‹] Sÿuè¡eƒÄÿ5€•#è75ƒÄ+‰¸‹]üÉÉöU‰åVSƒì‹u‹] …Ûtƒ;uÇEôƒìEôPë7ƒ;uÇEðƒìEðPë!vÇEèƒì jè_þÿÿ+CUè‰BƒÄRVèT*ƒÄeø[^]ÉöU‰åWVSƒì‹u ‹}ÇEðÿ5€•#è“4‰ÃƒÄ9Þƒþ} ¸ëG‰öƒì ÿuèµ*ƒÄ W‰Ø)ðPÿuè eƒÄ…ÀtÇEð…ÿt‰Ø+‰ƒì ÿuèÙ*‹EðƒÄeô[^_]ÍvU‰åƒì‹Eúƒ8u -ÇûÿU ëû¸ÉÃU‰åWVSƒì¿ÿÿÿÿ‹E ‹‹E@‰ÐÁà)ÐÁà‹â#‰U苀â#‰Eìƒùÿtw ‰ÆȉÂÁâ)‹Eè‰Ã;Õâ#|[‰Eäv1‰ÐÁà)ЍÅ;šâ#u ‹Eì;‚â#|1‰Ï‰ÐÁà)Ћ Řß#ƒùÿt4 1‰ÐÁà)Ћ]ä;Åâ#}«ƒÿÿt‰ÐÁà)ЋU‰Řß#ë‹E‹U ‰ƒùÿtI‰ÐÁà)ЋU‰Ŝß#‹E@‰ÐÁà)ЍÅP‰ˆHß#‰¸Lß#ƒÄ[^_]ÍvU‰åWVSƒì¿ÿÿÿÿ‹E ‹‹E@‰ÐÁà)лDß#‰]ð‹´ÃЃùÿtCI‰ÐÁà)Ð;´ÃÐr0»Hß#‰Ï‰ÐÁà)ЋLÃPƒùÿtI‰ÐÁà)ЋUð;´ÂÐsՃÿÿt‰ÐÁà)ЋU‰Řß#ë
-‰ö‹E‹U ‰ƒùÿtI‰ÐÁà)ЋU‰Ŝß#‹E@‰ÐÁà)ЍÅP‰ˆHß#‰¸Lß#ƒÄ[^_]ÍvU‰åWVS‹}‰ÐÁà)ЍÅP‹Lß#‹°Hß#ƒúÿu ‹E ‰0ë#‰öR‰ÁÁá)Á»Hß#‰ÐÁà)ЋDÃP‰DËPƒþÿt!v‰ÁÁá)Á»Lß#‰ÐÁà)ЋDÃP‰DËP[^_]ÃU‰åS‹]‹ ‰Èƒùÿt/I‰ÐÁà)ЋŘß#‰ƒøÿt@‰ÐÁà)ÐÇŜß#ÿÿÿÿ‰È‹$ÉÃU‰åS‹]‹M ƒ9ÿt‹@‰ÂÁâ)‰՜ß#[‰ÂÁâ)ÕP‹‰‚Hß#ǂLß#ÿÿÿÿ‰‹$ÉÃU‰åWVSƒì ‹M‹] ‹}ÇEðú¡lÞ#@‰ÂÁâ)4Õ@ß#…ÿt‹F8‰…ÛtBƒùt"ƒù ƒùt ë*‰öƒùtë!‹F8 ‰F8ë‰ö‹÷Ð!F8ëv‹‰F8ëÇEð‹F8‰Ã÷Ћ —#‰Ñ…ÂtB‰ö‰Ø÷л!Ètv‰Ú©u
-CÑøuòºƒì R范ċ^8‰Ø÷Ћ - —#…ÁuÀ‹F8‰Ã÷ЋV<‰Ñ…Ât=‰Ø÷л!Ètv‰Ú©u
-CÑøuòºƒì Rè|ƒÄ‹^8‰Ø÷ЋN<…ÁuÃû‹Eðeô[^_]ÍvU‰åVS‹u‹M ¸…É„¸ƒù‡òv‰ÐÁà)Ðfƒ<Åhß#u -¸éӍvú‰ÈÁàö€¨•#uƒ¸ •#uû魉öv‰ÐÁà)ЍÅ|ß#ƒùvèÍ©Çë
-¸Óà »ëC;hZ#}ƒìÝÿ°d˜#Vÿ`˜#ƒÄ…Àtٍv‰ÐÁà)ЍÅfƒ»hß#u&ƒìh¤—#VèÔüÿÿ‹ƒDß#ƒÄ‹… Þ#VPÿRDƒÄèSm…Àuèû¸eø[^]ÐU‰åWVSƒì‹]‹U ƒûvè©Ç¸ÿÿÿÿévœúX‰Á‰Mðƒ}t‰ÞÁæÆ •#ü¹‹}ó¥…Òt‰ßÁçÇ •#ü¹‰Öó¥…Ò„ºöB…°ƒ:‡§ƒ<À—#ÿtq4‰uìºÀ—#‹@Áà‰Eè‰ÇƒÇ‹ -à¤%¸àž%‹U苉E䋇äž%©t -ƒàý‰‡äž%ë‰ö¾À—#‹Uì‹2@‰ Õàž%‰Áƒ}äÿu»‰ -à¤%ǝÀ—#ÿÿÿÿƒûv -è¨Çë¸þÿÿÿˆÙÓÀ! —#‹uð‰ðP¸ƒÄ[^_]ÐU‰åWVSƒì,‹] ¸…Û„~¸ƒû‡pœúX‰Â‰UԉÞÁæ}؁Ơ•#ü¹ó¥÷Eàuƒ}Øu ‰ÐPé5vƒûv膧Ǹÿÿÿÿ됸ˆÙÓà# —#…Àt -‹UԉÐPéûƒûvèN§Çë‰ö¸ˆÙÓà  —#‹5¤—#ƒþÿ„ô¸‰ÇˆÙÓçvv‰ÐÁà)Ѝŀß#ƒûvèý¦Ç¸ÿÿÿÿë‰ú#‰Ð…À„–v‰ÐÁà)ÐÁàfƒ¸hß#u|ß#ƒûv -輦Çë 8ƒìh¤—#Vèúÿÿv‰ÃÁã)ÃÁ㋃Dß#ƒÄ‹… Þ#VPÿRDÃà¾@ß#ƒÄƒ<3ÿtƒì ÿ43ÿHÞ#Ç3ÿÿÿÿƒÄ‹MԉÈPéîv‰ÐÁà)Ћ4Řß#ƒþÿ…ÿÿÿ¾¸‰ÇˆÙÓç‰öv‰ÐÁà)ÐÁàfƒ¸hß#„…xß#ƒûvèö¥Ç¸ÿÿÿÿ됉ú#‰Ð…Àu^v‰ÐÁà)ЍÅ|ß#ƒûvèÃ¥Çëv 8»ëvC;hZ#}0ƒìÝÿ°d˜#Vÿ`˜#ƒÄ…ÀtÙëvFþ™ŽSÿÿÿèzi…Àuè9 -‹MԉÈP¸eô[^_]ÐU‰åWVSƒì,¸ƒ} „T¸ƒ} ‡EœúX‰Â‰Uԋu Áæ}؁Ơ•#ü¹ó¥÷Eàuƒ}Øu ‰ÐPé ‰ö÷Eàu;ƒ} vèܤǸÿÿÿÿëv¸ŠM Óà# —#…Àt ‹UԉÐPéÃ=à¤%ÿu‹MԉÈP¸ 鮉ö‹5à¤%vÁà¹àž%‹‰à¤%‹U ‰äž%‹U‰èž%‹U‰ìž%‹lÞ#‰ðž%Çÿÿÿÿ‹E ÁàºÀ—#ƒ<ÿu‰4ë>‰ö‹M ‹À—#‰ÁЃ<Åàž%ÿt»àž%
-‹Í 
-ƒ<ÃÿuîR‰4Åàž%ƒ} vèé£Ç됸ŠM Óà  —#‹5¤—#ƒþÿ„û¸‰ÃŠM Ó㐍v‰ÐÁà)Ѝŀß#ƒ} v蘣Ǹÿÿÿÿë v‰Ú#‰Ð…À„šv‰ÐÁà)ÐÁàfƒ¸hß#u|ß#ƒ} vèS£Çëv ƒìh¤—#Vè¨öÿÿv‰ÃÁã)ÃÁ㋃Dß#ƒÄ‹… Þ#VPÿRDÃà¾@ß#ƒÄƒ<3ÿtƒì ÿ43ÿHÞ#Ç3ÿÿÿÿƒÄ‹MԉÈPé÷v‰ÐÁà)Ћ4Řß#ƒþÿ…ÿÿÿ¾¸‰ÃŠM Ó㐍v‰ÐÁà)ÐÁàfƒ¸hß#„…xß#ƒ} v艢Ǹÿÿÿÿë‰Ú#‰Ð…Àu^v‰ÐÁà)ЍÅ|ß#ƒ} vèV¢Çë‰ö »ëvC;hZ#}0ƒìÝÿ°d˜#Vÿ`˜#ƒÄ…ÀtÙëvFþ™ŽSÿÿÿèf…Àuƒ=dZ#uèÄ ‹MԉÈP¸eô[^_]ÃU‰åWVSƒì‹u‹]¡lÞ#@‰ÂÁâ)<Õ@ß#èŠú¡ —##„Hºv©u=BÑøuô¾ƒ<µÀ—#ÿue‹E ‰0Ç@Ç@W<ƒþvèa¡Ç됉Öëɸþÿÿÿ‰ñÓÀ!ƒþvè?¡Çëv¸þÿÿÿ‰ñÓÀ! —#ûév µºÀ—#‹[‹Åàž%‰ƒøÿu"ƒþvèñ Ç됸þÿÿÿ‰ñÓÀ! —#W<ƒþv -èÌ Çë ¸þÿÿÿ‰ñÓÀ![Áâ¹äž%‹
-‹u ‰‹‚èž%‰F‹‚ìž%‰FƒÂ‹
-©t ƒàý‰
-ëv[¡à¤%‰Õàž%‰à¤%ûéI‰Öë‹G<#tUº©uéBÑøuô¾‹E ‰0Ç@Ç@W<ƒþvè Çëv¸þÿÿÿ‰ñÓÀ!ûéëv…Ûtƒ;uƒ{u -û¸ éÓ‰ö‹‰G@úèu‹lÞ#R‰ÑÁá)Ñf‰ÍHß#ƒìh$ß#jèN\ƒÄUè¡(ß#;xÞ#|¡$ß#+tÞ#‰Eè¡(ß#+xÞ#ë¡$ß#+tÞ#H‰Eè¡(ß#+xÞ#ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰ÁáºÓMb‹Eì÷êÁú‹EìÁø)ÂыlÞ#R‰ÐÁà)Ð) Ōß#ƒì QèÏÿÿƒÄƒ=|Þ#ÿtƒì ÿ5|Þ#ÿHÞ#Ç|Þ#ÿÿÿÿƒÄ‹ -lÞ#I‰ÐÁà)ЋÅDß#ƒì‹… Þ#QPÿRHƒÄh¤—#ÿ5lÞ#èæòÿÿ¡lÞ#@‰ÂÁâ)ÂfÇÕhß#ƒÄ…Û„’ƒìEàPjè[U؃Ä‹Eà‰E؋EäC‰B…Ày -ÿM؁Bʚ;됁zÿɚ;~ ÿjʚ;ÿ5lÞ#hdp"ÿuÜÿuØÿDÞ#‰ÃƒÄƒûÿuƒìÿ5lÞ#jèù ƒÄ¡lÞ#@‰ÂÁâ)‰Õ â#ÇlÞ#ÿÿÿÿÇ€Þ#ÿÿÿÿè‡Ðÿÿƒì ¡lÞ#@‰ÂÁâ)»@ß#¿DÓPèsè”ÇG@¡lÞ#@‰ÂÁâ)ƒÄöDÓ2tû¸ é~‰Öë%¡ —##„ûº‰ö©uáBÑøuô¾ƒ<µÀ—#ÿu=‹M ‰1ÇAÇAƒþv -è@Çë¸þÿÿÿ‰ñÓÀ! —#ûé vƒì µƒÀ—#Pèúðÿÿ‰ÇƒÄƒ»À—#ÿu#ƒþvèòœÇë‰ö¸þÿÿÿ‰ñÓÀ! —#Áâ¹äž%‹
-‹] ‰‹‚èž%‰C‹‚ìž%‰CƒÂ‹
-©t ƒàý‰
-ëv¡à¤%‰Õàž%‰=à¤%ûël‹G<#…Àuû¸ë`v‰Öë‹G<º#t ©uéBÑøuô¾‹E ‰0Ç@Ç@W<ƒþvè/œÇëv¸þÿÿÿ‰ñÓÀ!û¸eô[^_]ÍvU‰åWVSƒì ‹}¡lÞ#@‰ÂÁâ)4Õ@ß#è¹ú‹F<#…Àt è¦û颋‰F@úèq‹lÞ#R‰ÑÁá)Ñf‰ÍHß#ƒìh$ß#jè6XƒÄUè¡(ß#;xÞ#|¡$ß#+tÞ#‰Eè¡(ß#+xÞ#ë¡$ß#+tÞ#H‰Eè¡(ß#+xÞ#ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ìºÓMb‰Ø÷êÁú‰ØÁø)ÂыlÞ#R‰ÐÁà)Ð) Ōß#ƒì QèúÊÿÿƒÄƒ=|Þ#ÿtƒì ÿ5|Þ#ÿHÞ#Ç|Þ#ÿÿÿÿƒÄ‹ -lÞ#I‰ÐÁà)ЋÅDß#ƒì‹… Þ#QPÿRHƒÄh¤—#ÿ5lÞ#èÍîÿÿ¡lÞ#@‰ÂÁâ)»@ß#fÇDÓ(ÇlÞ#ÿÿÿÿÇ€Þ#ÿÿÿÿè Íÿÿ¡lÞ#@‰ÂÁâ)¿DÓ‰$è™oè‹F<#ƒÄ…Àuû¸ë èÿû¸eô[^_]ÐU‰åSƒì‹]úEðPjè¢VƒÄƒ=H˜#ÿu
-ÇEèëWMèUð¡D˜#;B|¡@˜#+Eð‰Eè¡D˜#+Bëv¡@˜#+EðH‰Eè¡D˜#+Eôʚ;‰Aƒì ÿ5H˜#ÿHÞ#ƒÄ…ÛtN]ð‹Eð£@˜#‹Eô£D˜#jhÄp"ÿuôÿuðÿDÞ#‰ÃƒÄƒûÿuƒìÿ5lÞ#jè:ƒÄ‰H˜#ë -vÇH˜#ÿÿÿÿû‹Eè‹]üÉÐU‰åVSƒì‹uƒ<µÀ—#ÿuC‰uèÇEìÇEð¡lÞ#‰Eôƒþvèü˜Ç鮐¸þÿÿÿ‰ñÓÀ! —#降 µºÀ—#‹[‹Åàž%‰ƒøÿu"ƒþv豘Ç됸þÿÿÿ‰ñÓÀ! —#[Áà¹äž%‹‰U苐èž%‰U싐ìž%‰Uð‹ðž%‰UôP‹
-©tƒàý‰
-ë[¡à¤%‰Õàž%‰à¤%ƒìEèPVè
-ƒÄeø[^]ÃU‰åVSƒì¡lÞ#@‰ÂÁâ)4Õ@ß#‹F0©…Í -‰F0‹F8‰Ã÷Ћ —#‰Ñ…ÂtA‰Ø÷л!Ètv‰Ú©u
-CÑøuòºƒì Rè„þÿÿƒÄ‹^8‰Ø÷Ћ - —#…ÁuÀ‹F8‰Ã÷ЋV<‰Ñ…ÂtZ‰Ø÷л!Ètv‰Ú©u
-CÑøuòº‰UèÇEìÇEð¡lÞ#‰EôƒìEèPRèƒÄ‹^8‰Ø÷ЋN<…Áu¦f0ÿïÿÿeø[^]ÃU‰åWVSƒì,‹]œúX‰Â‰UÌ¡lÞ#@‰ÂÁâ)Õ@ß#‰UЉÞÁæ}؁Ơ•#ü¹ó¥÷Eàuƒ}Ø„îƒ}Øÿ„ä÷EàuCƒ}Øu=ƒìShÌ0#èw}ƒÄ÷Eàtƒì‹M ÿqhâ0#èX}ƒÄƒì jè—ÓÿÿƒÄ‹UЋB8‰EԉƍUԃûv -èh–Çë ¸ˆÙÓà ‹EÔ E܉EԋUЃÂ<ƒûv -è<–Çë ¸þÿÿÿˆÙÓÀ!‹EԋUЉB8û÷Eàtƒìjÿu SÿUäëƒìj‹M ÿqSÿU؃Äú‹EЉp8‹ỦÐPeô[^_]ÃU‰åWVSƒì ‹}‰ÐÁà)ÐÁà¾@ß#fƒ|(uF˜àƒ<3ÿtƒì ÿ43ÿHÞ#Ç3ÿÿÿÿƒÄƒìh¤—#Wèúèÿÿ‰ÂÁâ)‹ÕDß#ƒÄë ‰ÐÁà)ÐÁàfƒ¸hß#u!‹Dß#ƒì‹• Þ#WRÿPD¸ƒÄë‰ö¸eô[^_]ÍvU‰åWVSƒì º¿¨•#¾¤•#»¬•#¹À—#‰ö‰ÐÁàǀ •#Ç8Ç0ÇÇ‘ÿÿÿÿBƒúvϺ»àž%¹äž%RÁàB‰ÇDƒú>~éÇȤ%ÿÿÿÿÇܤ%Çà¤%Ç —#Ǥ—#ÿÿÿÿÇH˜#ÿÿÿÿº¹™#»™#‰öRÁàÇÇÿÿÿÿÆDBƒú~áƒìjhDk"ènÚÿÿƒÄeô[^_]ÍvU‰å‹EǸ]ÐU‰å‹EÇÿÿÿÿ¸]ÐU‰åƒì‹U‹M ƒùvèê“Ǹÿÿÿÿ됸Óà ¸ÉÃU‰åƒì‹U‹M ƒùv趓Ǹÿÿÿÿ됸þÿÿÿÓÀ!¸ÉÃU‰åƒì‹M ƒùv腓Ǹÿÿÿÿë ¸Óà‹U#ÉÉöU‰åƒì ÿuÿu ÿuèÔçÿÿƒÄÉÍvU‰åWƒì$‹UEè‰E丹‹}äüó«ƒìjÿuäRèBñÿÿƒÄ…Àu -‹Uè‹E ‰¸‹}üÉÐU‰åƒì jÿu ÿuèñÿÿƒÄÉÃU‰åƒì‹E…Àu¸ëƒìPÿu ÿuèíðÿÿƒÄÉÃU‰åƒìÿuÿ5lÞ#è`èÿÿƒÄÉÍvU‰åVSƒì ‹]‹E ‰EèÇEìÇEð脒‹0ƒìEØPEèPSèAéÿÿƒÄ»ÿÿÿÿ…Àu ÷Eàu‹]ØèT’‰0‰Øeø[^]ÐU‰å‹M¡lÞ#@‰ÂÁâ)¡ —# Õ|ß#‰¸]ÉöU‰åSƒì‹E‹U ú‹lÞ#‰lÞ#ÇdZ#jPj jèœìÿÿƒÄÇdZ#‰lÞ#û‹]üÉÍvU‰åS‹M‹] ¡hZ#ʼnŠ`˜#‰šd˜#@£hZ#‹$ÉÍvU‰åVS‹]Cÿƒøv苑Ç~¸ÿÿÿÿëp‰öœúX‰Æ[€<…™#u‰ðPèa‘ǸÿÿÿÿëF[Áâ¹™#‹E ‰
-‹E‰‚™#ÆD
-ƒìjhq"Sè¹T·Ã‰$èÒeƒÄ‰ðP¸eø[^]ÍvU‰åƒì¸ÉÍvU‰åƒì ‹E‰EèÇEìÇEð‹lÞ#‰UôUèRPè›ùÿÿƒÄÉÉöU‰åVS‹uv‰ÃÁã)ÃÁã¸@ß#DŽàÿÿÿÿL0ƒìh¤—#Vèõãÿÿ‹ƒDß#ƒÄ‹… Þ#VPÿRDèç·ÿÿƒÄeø[^]ÐU‰åƒìÇH˜#ÿÿÿÿjjèWèÿÿè¾·ÿÿƒÄÉÐU‰åƒìEüÇEüÿÿÿÿPèôÿÿƒÄÉÐU‰åƒì‹E‹‰EüEüPjÿlZ#‹UüRÁ๙#ƒÄƒ<t ûƒì RÿƒÄú‹Eü@ƒì ÿ4…™#覱ÿÿƒÄÉÐU‰åWVSƒì ‹u ‹]ƒ}t讏Ǹÿÿÿÿén‰öúƒ=À #ÿt ƒ=à¤%ÿuûèƒÇ ¸ÿÿÿÿéCv¡À #‰‹À #Õ)пę#‹DÇ0£À #‹Õ)йÀ™#ÇDÁ0…öu8‹Õ)ÐÇÁ‹Õ)ÐÇÇ‹Õ)ЉÅș#닍<Å)Ǎ<ýÀ™#ü¹ó¥‹Õ)ЍŃºÀ™#u#¡à¤%‰‚è™#@Áàƒˆôž%‹€àž%£à¤%‹Õ)ÐÇÅԙ#ÿÿÿÿ‹Õ)ЍÅؙ#Ç@NjÕ)ЍÅà™#Ç@NjÕ)ÐÇÅì™#û¸ƒÄ [^_]ÃU‰åSƒì‹]ƒûwúÝ)؃<Åð™#uûèÿÇ¸ÿÿÿÿ閍vÝ)ØÁàǀð™#ƒÀºÄ™#ƒ<ÿtƒì ÿ4ÿHÞ#ƒÄÝ)ØÁàƒ¸À™#uE‹è™#R Åöôž%u¡à¤%‰àž%‰à¤%Ý)؋Åè™#@ƒ$Åôž%üû¸‹]üÉÃU‰åWVSƒìL‹E‰E´Áà+E´Áàƒ¸À™#…‹P ‹‚È™#@öÅôž%t¸Ì™#ƒ< „ôÿéì‰ö‹M´Áá+M´Ááy LJ̙#¾È™#‹7@‹à¤%‰Ýàž%£à¤%jÿ41ÿ±Ä™#jèhçÿÿ‹7@ƒ Åôž%錐‹E´Áà+E´Áà¹À™#ƒ<uwPƒ<
-tÿ°È™#ÿ°Ì™#ÿ4
-ëQvÇEÈÇEÌÇEÐÇEÔÇEØÇEÜÇEà‹E´Áà+E´ÁàÈ™#Rÿ°Ì™#EÈPEÄPèÙÙÿÿƒÄ‹E´Áà+E´Åƒ¸È™#u -ƒ¸Ì™#„Àºà™#‹E´Áà+E´ŋ‰E¸M¸‹D‰A‹E¸ƒØ™#‰ƒà™#‹AƒÜ™#‰B…Àyÿ‹à™#Bʚ;ë‰özÿɚ;~ ÿjʚ;‹E´Áà+E´ÿu´hÐs"ÿ4Åä™#ÿ4Åà™#ÿDÞ#‰ÃƒÄƒûÿuƒìÿ5lÞ#jè+ùÿÿƒÄ‹E´Áà+E´‰Åԙ#ë‰ö‹E´Áà+E´ÇÅԙ#ÿÿÿÿeô[^_]ÃU‰åWVSƒì‹u‹}ÇEäƒþw3ƒ}t-‹Exÿɚ;w!‹]{ ÿɚ;wúõ)ðƒ<Åð™#uûèÁŠÇ¸ÿÿÿÿ鐅ÿ„·õ)ðƒ<Åԙ#ÿuÇG ÇGëwƒìEèPjèGÇEäƒÄ¹à™#õ)ðō]è‹D;C|‹+Eè‰G‹D+Cë(¹à™#õ)òÁâ‹+EèH‰G‹D+Eìʚ;‰G ¹Ø™#õ)ðÁà‹‰‹D‰Gõ)ðÅºÄ™#ƒ<ÿtƒì ÿ4ÿHÞ#ƒÄ‹Eƒxu
-ƒx „þºØ™#õ)ð ŋ]‹‰
-‹C‰D
-÷E t¸à™#‹S‰‹S ‰Tëmvƒ}äuƒìEèPjèøEƒÄõ)ð ō‘à™#‹Eè‹]C‰à™#‹EìC ‰B…Àyÿ‰à™#Bʚ;ëzÿɚ;~ ÿjʚ;õ)ðVhÐs"ÿ4Åä™#ÿ4Åà™#ÿDÞ#‰ÃƒÄƒûÿuƒìÿ5lÞ#jè­öÿÿƒÄõ)ð‰Åԙ#û¸eô[^_]ÃU‰åWVSƒì ‹]‹} ƒûwúÝ)؃<Åð™#uûèzˆÇ¸ÿÿÿÿ鷉öÝ)؃<Åԙ#ÿuÇG ÇGëoƒìEèPjèÒDƒÄ¹à™#Ý)؍ōuè‹D;F|‹+Eè‰G‹D+Fë'¹à™#Ý)ÚÁâ‹+EèH‰G‹D+Eìʚ;‰G ¹Ø™#Ý)ØÁà‹‰‹D‰Gû¸eô[^_]ÍvU‰åƒìƒ}t藇Çëv臇ǸÿÿÿÿÉÉöU‰åƒìƒ}tèg‡Ç¸ÿÿÿÿë‰öƒì ÿu èuÄÿÿ¸ƒÄÉÍvU‰åƒì‹E ƒ}tè,‡Ç¸ÿÿÿÿëv…Àt -ÇÇ@è¸ÉÃU‰åƒì‹UƒúwúÕ)Ѓ<Åð™#uûè܆ǸÿÿÿÿëvÕ)ЋÅì™#ûÉÐU‰åWVS¹»Ä™#¿À™#¾Ì™#‰öÍ)ÈÁàÇDÿÿÿÿØ™#ÇBǍP0Ç:ÇD A‰‰Áƒù~ºÇ¼ #ÿÿÿÿÇÀ #[^_]ÐU‰å]ÍvU‰å¸]ÉöU‰åVSœúX‰Ã¡lÞ#@‰ÂÁâ)¾@ß#‹DÖ0©t0©t)ƒì jè"Æÿÿ¡lÞ#@‰ÂÁâ)¿DÖ‰$è"[ƒÄ‰ØPeø[^]ÃU‰åS‹]úût ¸ÿÿÿÿ…ÛuL¡lÞ#@‰ÂÁâ)¹@ß#‹DÑ0Áèƒà‹U ‰¡lÞ#@‰ÂÁâ)Õ0‹
-%ÿþÿÿ ؉
-û¸‹$ÉÉöU‰åS‹]úût ¸ÿÿÿÿ…ÛuL¡lÞ#@‰ÂÁâ)¹@ß#‹DÑ0Áè ƒà‹U ‰¡lÞ#@‰ÂÁâ)Õ0‹
-%ÿýÿÿ ؉
-û¸‹$ÉÉöU‰åWVSƒì ‹} ÇEðú‹EÇÿÿÿÿÇ@¾;5dÞ#s9v‹µß#ƒ{u ƒìWVÿS,ƒÄ…ÀxƒìWÿuVÿS0‰EðƒÄF;5dÞ#rÊû‹Eðeô[^_]ÉöU‰åƒì‹U¸ƒ:ÿt ¸ƒzu‹‹…ß#ƒìRÿ2ÿP4ƒÄÉÍvU‰åƒì‹U¸ƒ:ÿt‹‹…ß#ƒìRÿ2ÿP8ƒÄÉÉöU‰åƒì‹U¸ƒ:ÿt‹‹…ß#ƒìRÿ2ÿP<ƒÄÉÉöU‰åƒì‹U¸ƒ:ÿt‹‹…ß#ƒìRÿ2ÿP@ƒÄÉÉöU‰åVS‹u‹µ Þ#ƒìÿ°ôh1#è^j»ƒÄ‰ö[‰ÐÁà)ÐÁà9°Dß#……ƒÀ º@ß#f|€ttfƒ|tlƒì f‹Dfƒøwƒì ·ÀP訃Äë%v·Ð¸ó0#ú€t¸ÿ0#út¸ 1#P[‰ÐÁà)ÐÁàÿ°â#Tß#PSh€1#è¹iƒÄ Cû™ŽUÿÿÿeø[^]ÉöU‰åWVSƒì ‹E‹… Þ#‰Eð‹¸üƒì ‹Uð‹‚ðøPèk§‰ÆƒÄƒþÿu -¸ÿÿÿÿ…ÿtrOëՐv‰ÐÁà)Ѝ Åöqß#tRQ@»Lß#ƒ<D‹$â#‰ƒìý‰Ø‹Uð‚ðPVèX¥ƒÄ‹Eð˜ðSV聦ƒÄéiÿÿÿ‰ðeô[^_]ÉöU‰åWVSƒì‹E‹… Þ#‰Eð‹Mƒy(…©‹=lÞ#‰ÐÁà)ЍžDß#‹U93…‹M I‰ÂÁâ)ÂÁ⋄Љ„йLß#‹D@‰D@‹„à‰„àƒÂ0¹@ß#‹
-%ÿ÷ÿÿ‹\0ã ؉
-‹UðƒÂ¸ƒ¼º€ÿ•ÀH‹] ‰„š€é¢v‹U R‰ÂÁâ)ÂÁâ»Dß#‹A‰„Ѓyt‹A‰‚Œß#‹A‰„àë-‰ö‹] [‰ÐÁà)ÐÁà‹]ð‹“ô‰Œß#‹“ô‰$â#ƒy$u‹E @‰ÐÁà)Ё Åpß#¸ƒy ”ÀH‹U ‹Mð‰„‘ˆ¸ƒÄ[^_]ÃU‰åWVSƒì ‹U‹<• Þ#ƒ¿t8LJƒì‹E @‰ÐÁà)ЋÅâ#‹—ðÂPÿu 襤酋E @‰ÐÁà)ЍÅöƒqß#t?K@¾Lß#ƒ<11ºDß#‹1„à‰1ƒì‹„Ћ—ðÂPÿu èG¤ë*ƒì‹E @‰ÐÁà)ЋÅâ#‹—ðÂPÿu 诣ƒÄ‹E @‰ÐÁà)ÐfÇÅhß#€eô[^_]ÐU‰åWVSƒìH‹]ÇE¼ÇEÀfÇEÄÇEÈÇEÌÇEÐÇEÔÇEØÇEÜÇEà¶Ã -f‰E¸‹ Þ#‹€ø‰EÈÇE̍E¸jjPhˆ"h%1#è-¬ÿÿ‰ÆƒÄ ƒþÿuƒì hÀ1#èVËÿÿƒÄ‹< Þ#v‰ÐÁà)Ðfƒ<Åhß#tµ€Gƒ<ÿtJÿëE‰öƒìv‰ÃÁã)ÃÁ㍃„ß#PjèJ;fǃhß#€ƒÄ‹ƒâ#‹—ðÂPVèࢃčeô[^_]ÐU‰åWVSƒì‹}h*1#è¾ÊÿÿèÆÿÿ‰EðƒÄ hPh@1#è£ÊÿÿÇ$èwÉÿÿ‰ÃƒÄSh^1#è‡Êÿÿ‹Eð‰… Þ#ƒÄ jhj1#Sè=efÇCÆCÇCx‡"ÇC¤‡"ÇC l}"ÇC$L~"ÇC(°‡"ÇC, "ÇC0¼‡"ÇC4ć"ÇC8Ї"ÇC<„€"ÇC@ˆ"ÇCDœˆ"ÇCHäˆ"ÇCLìˆ"ÇCP„‰"ÇCT̉"ÇCXŠ"ÇC\äŠ"ÇC`‹"ÇCd‹"ÇCh4‹"ÇClL‹"ÇCpd‹"ÇCt|‹"ÇCx”‹"ÇC|¬‹"ǃ€Ä‹"ǃ„Ü‹"¸ƒÄS‰öDŽ‚€ÿÿÿÿ@=™~í‹EH‰ƒüƒì ‹EÁàPè@Èÿÿ‰ƒð¾ƒÄ;u}ƒì ‹ƒððPè柃ÄF;u|åÿçw¿èÿ ¡v¿ ¡‰»ô‹E‰ƒøƒ} tƒìjÿuðh€"è8ÃÿÿƒÄeô[^_]ÐU‰åWVSƒì ‹M‹u ‹]‹ Þ#‰Eð…Éx[; -pÞ#sS‹ Þ#‹@%ÿÿÿ=u=þ™wv‰ÐÁà)Ðfƒ<Åhß#u -¸éèvv‰ÐÁà)Ð9 ÅDß#t -¸&éȍv…Ûuv‰ÐÁà)Ё Åpß#ë)ƒûuv‰ÐÁà)Ё$Åpß#ÿ÷ÿÿë ¸郉öv‰ÐÁà)ÐÁà˜Ð¿Dß#‹U9;t\f¸hß#€u=ƒì‹;‹Mð‹‘ðÂPV蘞‹E‰;ƒÄ‹Uð‹‚ð‹MÈPV赟ƒÄëv‰ÐÁà)ЋU‰Åâ#¸eô[^_]ÍvU‰åVS‹M‹4 Þ#…Éx; -pÞ#s‹ Þ#‹@%ÿÿÿ=t¸ÿÿÿÿëw¡lÞ#@‰ÂÁâ)¸ÿÿÿÿ9 ÕDß#uZúè!P‹lÞ#R‰ÑÁá)Ñ»@ß#f‰DËdžèX­ÿÿ¡lÞ#@‰ÂÁâ)ƒì ¿DÓPèçOè>·ÿÿƒÄû¸eø[^]ÉöU‰å‹E‹… Þ#‹€ü]ÍvU‰å‹E‹… Þ#‹€ô]ÍvU‰åS‹]‹M …ÛxU;pÞ#sM‹ Þ#‹@%ÿÿÿ=u7ù™wI‰ÐÁà)Ðfƒ<Åhß#u¸ëMI‰ÐÁà)Ð9ÅDß#t ¸&ë3‰öI‰ÁÁá)ÁÁá¸öqß#”À‹U‰‹‘â#‹E‰¸‹$ÉÉöU‰å‹E f8t·‹E -9Âu¸ë¸ÿÿÿÿ]ÐU‰å¸ÿÿÿÿ]ÉöU‰å¸]ÉöU‰å]ÍvU‰å¸]ÉöU‰åSƒì ‹E‹M ‹… Þ#I‰ÐÁà)ЋÅâ#‹“ðÂPQè7œƒÄ‹]üÉÍvU‰åWVSƒì ‹E‹u ‹<… Þ#v‰ÐÁà)Ðfƒ<Åhß#tµ€Gƒ<ÿtHÿëCƒìv‰ÃÁã)ÃÁ㍃„ß#PjèR5fǃhß#€ƒÄ‹ƒâ#‹—ðÂPVè蜃čeô[^_]ÐU‰åSƒì ‹E‹M ‹… Þ#I‰ÐÁà)ÐÁàfǀhß#€‹€â#‹“ðÂPQ蜜ƒÄ‹]üÉÃU‰å]ÍvU‰åWVSƒì ‹U‹• Þ#‰Eð‹U <•€‰ÆƒÆƒ<7~MƒìR‰ÃÁã)ÃÁ㍃„ß#Pjè‹4ÿ 7ƒÄ‹ƒâ#‹Mð‹‘ðÂPÿu 趛fǃhß#€ƒÄë‹E @‰ÐÁà)ÐfÇÅhß#eô[^_]ÐU‰åƒì‹E‹M ‹… Þ#ƒÀDŽˆ€ÿÿÿÿI‰ÐÁà)ÐfÇÅhß#häÞ#QèðÉÿÿƒÄÉÍvU‰å‹E‹U ‹… Þ#ƒÀDŽ€R‰ÐÁà)ÐfÇÅhß#]ÃU‰åWVSƒì4‹u v‰EäÁà+EäfÇÅhß#EèPjè“3Mè»@B‹Eº÷ó‰Uà’€€‰E܋A‹U܍ЉE؉A»¡/¸D÷ë‰ÓÁû‹EØÁø)ÿƒÞC‹E÷ç‰×‰øÁèEè‹A»Êš;™÷û‰Ó‰YƒÄVhô‹"ÿuìÿuèÿDÞ#‰ÃƒÄƒûÿuƒìÿ5lÞ#jèAäÿÿƒÄ v‰ÈÁà)ȉÅ â#eô[^_]ÐU‰åƒìÿ5lÞ#jèäÿÿ¸ƒÄÉÍvU‰åƒìÿ5lÞ#jèñãÿÿƒÄÉÃU‰åƒìÿ5lÞ#jèÙãÿÿƒÄÉÃU‰åƒìÿ5lÞ#jèÁãÿÿƒÄÉÃU‰åƒìÿ5lÞ#jè©ãÿÿƒÄÉÃU‰åƒìÿ5lÞ#jè‘ãÿÿƒÄÉÃU‰åƒìÿ5lÞ#jèyãÿÿƒÄÉÃU‰åƒìÿ5lÞ#jèaãÿÿƒÄÉÃU‰åƒìÿ5lÞ#jèIãÿÿƒÄÉÃU‰åƒìÿ5lÞ#jè1ãÿÿƒÄÉÃU‰åƒìÿ5lÞ#jèãÿÿƒÄÉÃU‰åWVSƒì‹MI‰ÃÁã)ÃÁãºDß#‹‹4… Þ#¿@ß#fÇD(€‹„Ћ–ðÂPQè9™Ç„àÿÿÿÿèQœÿÿƒÄeô[^_]ÉöU‰åVSƒì hà2#è
-Áÿÿè]¼ÿÿ‰ÆÇ$Œè׿ÿÿ‰Ã‰µ Þ#ƒÄ jhx2#Sè®[fÇCÆCÇC "ÇCԍ"ÇC à"ÇC$Ž"ÇC(ÇC, Ž"ÇC0,Ž"ÇC44Ž"ÇC8@Ž"ÇC<HŽ"ÇC@dŽ"ÇCDŒŽ"ÇCH´Ž"ÇCL܎"ÇCP"ÇCT,"ÇCXT"ÇC\|"ÇC`¨"ÇCdЏ"ÇChø"ÇCl "ÇCpH"ÇCtp"ÇCx˜"ÇC|À"ǃ€è"ǃ„‘"ǃˆÿÿÿÿÇ$ƒ2#èô¿ÿÿƒÄ jVh8‘"è,ºÿÿƒÄeø[^]ÉöU‰å‹M‹E ‹ Þ#fƒ8t·9Èu¸ƒºˆÿt¸ÿÿÿÿ]ÉöU‰å¸ÿÿÿÿ]ÉöU‰åƒì‹E‹… Þ#ÿ°ˆhå1#èìYƒÄÉÍvU‰å‹E‹… Þ#‹€ˆ]ÍvU‰å¸]ÉöU‰å]ÍvU‰å¸]ÉöU‰å]ÍvU‰å‹E @‰ÂÁâ)ÂfÇÕhß#]ÃU‰åƒìhô1#èxYƒÄÿ5lÞ#j è„àÿÿƒÄÉÍvU‰åƒìhû1#èPYƒÄÿ5lÞ#j è\àÿÿƒÄÉÍvU‰åƒìh2#è(YƒÄÿ5lÞ#j è4àÿÿƒÄÉÍvU‰åƒìh 2#èYƒÄÿ5lÞ#j è àÿÿƒÄÉÍvU‰åƒìh2#èØXƒÄÿ5lÞ#j èäßÿÿƒÄÉÍvU‰åƒìh2#è°XƒÄÿ5lÞ#j è¼ßÿÿƒÄÉÍvU‰åƒìh2#èˆXƒÄÿ5lÞ#j è”ßÿÿƒÄÉÍvU‰åƒìh%2#è`XƒÄÿ5lÞ#jèlßÿÿ¸ƒÄÉÉöU‰åƒìh,2#è4XƒÄÿ5lÞ#jè@ßÿÿƒÄÉÍvU‰åƒìh32#è XƒÄÿ5lÞ#jèßÿÿƒÄÉÍvU‰åƒìh:2#èäWƒÄÿ5lÞ#jèðÞÿÿƒÄÉÍvU‰åƒìhA2#è¼WƒÄÿ5lÞ#jèÈÞÿÿƒÄÉÍvU‰åƒìhH2#è”WƒÄÿ5lÞ#jè ÞÿÿƒÄÉÍvU‰åƒìhO2#èlWƒÄÿ5lÞ#jèxÞÿÿƒÄÉÍvU‰åƒìhV2#èDWƒÄÿ5lÞ#jèPÞÿÿƒÄÉÍvU‰åƒìh]2#èWƒÄÿ5lÞ#jè(ÞÿÿƒÄÉÍvU‰åƒìhd2#èôVƒÄÿ5lÞ#jèÞÿÿƒÄÉÍvU‰åƒìhk2#èÌVƒÄÿ5lÞ#jèØÝÿÿƒÄÉÍvU‰åSƒì0‹]ÇEÜÇEàfÇEäÇEè¶Ãf‰EØÇEìEØjjPhđ"hr2#趜ÿÿƒÄ ‹ Þ#‰Ã‰šˆƒûÿuƒì h 2#èÒ»ÿÿƒÄ[‰ÐÁà)ÐÇÅxß#ÿÿÿÿ‹]üÉÐU‰åôëýU‰åWVSƒì ‹} ¾ú»ëvCûÿ2Ý)ØÁàºà #€|t߃ìÿ4ÿuèaVƒÄ…Àuʾ…öt1ÿÀuèðnÇûéÜûÝ)؍…ä #éˉö÷Ç@uè¿nÇû髍v‹E‰Eð=ÿ~èžnÇû銉ö‹°Á#ƒúÿtqÕ)Ѝ<…w‹†ä #£°Á#ƒì ÿuèV@‰$臹ÿÿ»à #‰ƒÄÿuPè7U‹Eð‰‡è #‡ì #‰$è(‘ÆDƒÄû‡ä #ëvènÇû¸eô[^_]ÍvU‰åWVSƒì ¾ú¿»à #vý)øÁà€|tƒìÿ4ÿuèUƒÄ…Àu¾Gÿÿ~ʅötJƒì ÿuèOUƒÄ@Pý)ûÁã¾à #ÿ43è%¹ÿÿƒÃÆD3¡°Á#‰ƒä #‰=°Á#ƒÄûë‰öèSmÇû¸eô[^_]ÍvU‰åWVSƒì ‹}?ÿw‹Õ)Ѐ<…ø #uèmǸÿÿÿÿé‰öèÏæÿÿúè5B‹lÞ#R‰ÑÁá)Ñf‰ÍHß#‹Õ)Ѝ4…à #ƒ~ ÿu
-ƒ~…“ƒìWjÿlZ#ƒÄh$ß#jè8)ƒÄUè¡(ß#;xÞ#|¡$ß#+tÞ#‰Eè¡(ß#+xÞ#ë!‰ö¡$ß#+tÞ#H‰Eè¡(ß#+xÞ#ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ìºÓMb‰Ø÷êÁú‰ØÁø)ÂыlÞ#R‰ÐÁà)Ð) Ōß#ƒì Qèú›ÿÿƒÄƒ=|Þ#ÿtƒì ÿ5|Þ#ÿHÞ#Ç|Þ#ÿÿÿÿƒÄ‹ -lÞ#I‰ÐÁà)ЋÅDß#ƒì‹… Þ#QPÿRH‹ -lÞ#I‰ÐÁà)л@ß#fÇDÃ(Íǂà¼#‹‰‚ä¼#ƒÄF PQ辏ÇlÞ#ÿÿÿÿÇ€Þ#ÿÿÿÿèõÿÿ¡lÞ#@‰ÂÁâ)¿DÓ‰$è…@èܧÿÿƒÄûèÿäÿÿë8ÿNƒìWjÿlZ#¡lÞ#@‰ÂÁâ)¿ÕHß#‰$èF@蝧ÿÿƒÄû¸eô[^_]ÃU‰åWVSƒì ‹}‹]?ÿw‹Õ)Ѐ<…ø #uè¯jǸÿÿÿÿéVv…ÛuúëúèÒ?‹lÞ#R‰ÑÁá)Ñf‰ÍHß#‹Õ)Ѝ4…à #…Ûu0ƒ~ ÿu‹E 9F}èMjÇ û¸ÿÿÿÿéó‹E )Fûéâèäÿÿƒ~ ÿu ‹E 9F‘ƒìWjÿlZ#ƒÄh$ß#jèš&ƒÄUè¡(ß#;xÞ#|¡$ß#+tÞ#‰Eè¡(ß#+xÞ#ë¡$ß#+tÞ#H‰Eè¡(ß#+xÞ#ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ìºÓMb‰Ø÷êÁú‰ØÁø)ÂыlÞ#R‰ÐÁà)Ð) Ōß#ƒì Qè^™ÿÿƒÄƒ=|Þ#ÿtƒì ÿ5|Þ#ÿHÞ#Ç|Þ#ÿÿÿÿƒÄ‹ -lÞ#I‰ÐÁà)ЋÅDß#ƒì‹… Þ#QPÿRH‹ -lÞ#I‰ÐÁà)л@ß#fÇDÃ(͋E ‰‚à¼#‹‰‚ä¼#ƒÄF PQè#ÇlÞ#ÿÿÿÿÇ€Þ#ÿÿÿÿèZ›ÿÿ¡lÞ#@‰ÂÁâ)¿DÓ‰$èê=èA¥ÿÿƒÄûèdâÿÿë<‰ö‹E )FƒìWjÿlZ#¡lÞ#@‰ÂÁâ)¿ÕHß#‰$è§=èþ¤ÿÿƒÄû¸eô[^_]ÐU‰åWVSƒì ‹}?ÿw‹Õ)Ѐ<…ø #uèhǸÿÿÿÿéU‰öè,…À„‡œúX‰Æ‹Õ)Ѝ…à #‹JA‰J‹Z ƒûÿtG‹Ýà¼#9È<)Á‰È‰BƒìB PSèƊ[‰ÐÁà)ЋÅDß#ƒÄ‹• Þ#SRÿPDèÿÿƒÄƒìWjÿlZ#ƒÄ‰ðPé¼‰öúèª<‹€Þ#R‰ÑÁá)Ñf‰ÍHß#‹Õ)Ѝ…à #‹JA‰J‹Z ƒûÿtG‹Ýà¼#9È<)Á‰È‰BƒìB PSè&Š[‰ÐÁà)ЋÅDß#ƒÄ‹• Þ#SRÿPD荙ÿÿƒÄƒìWjÿlZ#¡lÞ#@‰ÂÁâ)¿ÕHß#‰$è <èb£ÿÿƒÄû¸eô[^_]ÐU‰åWVSƒì ‹] ÇEð‹E8ÿw‹Õ)Ѐ<…ø #uèlfǸÿÿÿÿéÊèc*…À„ÃœúX‰Â‰Uì‹E‹Õ)Ѝ4…à #^‹^ ƒûÿts݉‹€à¼#;F_¿à¼#ÇEðv‹F+:‰FƒìF PS艍[‰ÐÁà)ЋÅDß#ƒÄ‹• Þ#SRÿPD‹^ ƒÄƒûÿt݋:;F~°ƒìÿujÿlZ#ƒÄƒ}ðtèÿÿ‹Uì‰ÐPéõúèÊ:‹€Þ#R‰ÑÁá)Ñf‰ÍHß#‹E‹Õ)Ѝ4…à #^‹^ ƒûÿtr݉‹€à¼#;F^¿à¼#ÇEð‰ö‹F+:‰FƒìF PSè.ˆ[‰ÐÁà)ЋÅDß#ƒÄ‹• Þ#SRÿPD‹^ ƒÄƒûÿt݋:;F~°ƒìÿujÿlZ#ƒÄƒ}ðtèd—ÿÿ¡lÞ#@‰ÂÁâ)ƒì ¿ÕHß#Pèð9èG¡ÿÿƒÄû¸eô[^_]ÉöU‰åWVSƒì ¾¿ä #õ)óÁãǃà #‰4;ǃè #ƒì ƒì #PèB‡ƒÃF‰;ƃè #ƒÄ‰Æþÿ~±Çؼ#ÿÿÿÿÇ°Á#ƒìjhx "è:ªÿÿƒÄeô[^_]ÍvU‰åVS‹uú>ÿw‹Õ)Ѐ<…ø #uèÉcÇû¸ÿÿÿÿënvƒì ‹Õ)лà #ÿ4ƒèUKƒÄ@P‹Õ)Ðÿ4ƒè1¯ÿÿ‹Õ)ÐÆDƒ‹Õ)Ћ°Á#‰…ô #‹£°Á#ƒÄû¸eø[^]ÉöU‰åƒì‹Mú9ÿw‹Õ)Ѐ<…ø #uècÇû¸ÿÿÿÿëb‰ö‹Õ)Ѓ<…ì #ÿtèîbÇû¸ÿÿÿÿë8‹Õ)ÐÆ…ø #‹Õ)Ћ°Á#‰…ô #‹£°Á#û¸ÉÉöU‰åSƒì‹M‹] 9ÿw‹Õ)Ѐ<…ø #uèubǸÿÿÿÿë_ú‹Õ)ÐÁàƒ¸ì #ÿu ‹€è #‰ë7‰öÇ‹Õ)Ћ…ì #¹Hß#vÿ @‰ÐÁà)ЋDÁPƒøÿuëû¸‹]üÉÃU‰åVS‹u‹M¸ùÿ‡–ú‹°Á#‰ƒúÿtnÕ)Ћ…ô #£°Á#‹Õ)лà #ǃ‹Õ)Љ …è #ƒì ‹Õ)Ѝ…ì #P聄‹Õ)ÐÆDƒƒÄëègaÇû¸ÿÿÿÿëû¸eø[^]ÍvU‰åƒì‹M9ÿw‹Õ)Ѐ<…ø #uèaǸÿÿÿÿë=ú‹Õ)Ѝ…à #ƒx ÿuƒxuèì`Ç û¸ÿÿÿÿë ‰öÿHû¸ÉÐU‰å‹E@‰ÂÁâ)¸fƒ<Õhß#”À]ÐU‰åVS‹][‰ÐÁà)Ѝ4Åfƒ¾hß#uAƒì‹Ýä¼#Õ)Ѝ…ì #PS考‹†Dß#ƒÄ‹… Þ#SPÿRD¸ƒÄ됸eø[^]ÃU‰åVSƒ=xZ#…ÚÇxZ#¹»¥%¾¥%‰ÁàP ÆÇ2ÿÿÿÿÆDAƒùváƒìjjhÀÁ#èÜýÿÿ¹ƒÄ¾d§%»`§%‰ö‰ÁàQ‰0Ɖуù -véÇ”©%ÿÿÿÿƐ©%ÇX§%¹¾Ä©%»À©%vÍ)ÈÁàQ‰0ƉуùvãÇð¬%ÿÿÿÿÆì¬%Ç­%eø[^]ÐU‰åWVSƒìŠEˆEóŠUˆUòfÇEæ¾<u€út €}óu€}òuè_Ǐ¸ÿÿÿÿé7‰öúƒ=X§%ÿuèí^ǍûÇEìÿÿÿÿ됡X§%€‹Õd§%‰X§%û‰Eìƒ}ìÿu -¸ÿÿÿÿéìvƒì hÀÁ#ègñÿÿƒÄ‹]¾¹º÷ñ‰×ëf‰ö¿€<Å ¥%t0ƒìÿu¿ōƒ¥%Pè³EƒÄ…Àu€»¥%„Ÿ¾ëG¹‰øº÷ñ‰×fÿEæfƒ}懜‰ó„Ût–¿Áãƃ ¥%ƒìÿuƒ¥%Pè÷D‹E쉃¥%ƒÄ€}óu‰Â’‹] f‰Åh§%ëv‹E썀‹E ¯Ef‰Õh§%úƒì ‹U썒Áã·ƒh§%Pèݨÿÿºl§%‰ƒÄû…Àu%è”]ǒƒì hÀÁ#èAõÿÿ¸ÿÿÿÿ魍v‹E썀ÁãS‰Uà¾`§%‹ƒl§%‰‚d§%‰2ƒìjjƒ|§%Pè:ûÿÿƒÄ ·D3Pjƒ€§%Pè#ûÿÿƒÄ jjÃ„§%SèûÿÿŠ]ó‹Eàˆ\0ƒÄúƒ=­%ÿuèø\ǎûÇEèÿÿÿÿë¡­%Å)‹•Ä©%‰­%û‰Eèƒ}èÿu_ƒì hÀÁ#èvôÿÿ‹Eèéä‰öè§\ǐƒì hÀÁ#èTôÿÿ¸ÿÿÿÿéÀ‰öèƒ\Ǒƒì hÀÁ#è0ôÿÿ¸ÿÿÿÿ霉ö‹EèÁà+EèÁà¹À©%ŠUòˆT P‹]ì‰
-‹] f‰\
-ǀĩ%ÿÿÿÿ‰ºÈ©%‹]썛ÆÕ`§%ƍ¿ōr¿¥%€|>t%ƒì¶D>Pš¥%SèGõÿÿÆD>‰$èšøÿÿƒÄƒì hÀÁ#èŽóÿÿ¿EèƒÄeô[^_]ÍvU‰åWVSƒìŠEˆEóŠ]ÇEè¿ÆEç<u„Ût €}óu€ûuè‚[Ǐ¸ÿÿÿÿé0‰öúƒ=­%ÿuèa[ǎûÇEìÿÿÿÿë ¡­%Å)‹•Ä©%‰­%û‰Eìƒ}ìÿu ¸ÿÿÿÿéߐ‹EìÁà+EìÁàºÀ©%ˆ\ ‹M f‰Lǀĩ%ÿÿÿÿƒì hÀÁ#è°íÿÿƒÄ‹U¾¹º÷ñ‰Öë]v¶€<Å ¥%u ¿ÆEçë8ƒìÿu¶Å¥%PèöAƒÄ…Àu¿ëF¹‰ðº÷ñ‰ÖÿEèƒ}è‡Ò‰ù„Ét €}çuR¶Á㸥%ÆD ÆDƒìÿuPè>AƒÄ jjÃ¥%Sè/øÿÿÇ$ÀÁ#èçñÿÿƒÄ jjSè:ïÿÿëM¶ōCº¥%€|t'þDƒì hÀÁ#è®ñÿÿƒÄ jjƒ¥%Pèûîÿÿ됃ì hÀÁ#è‹ñÿÿƒÄ¶‹<Å¥%¿ŠUó:Åx§%tèªYǓ¸ÿÿÿÿéX‰ö€}óu¿·Åh§%9E u€}ót(¿·Åh§%™÷} …ÒtèdYǔ¸ÿÿÿÿéƒì hÀÁ#è ìÿÿ¶‹Å$¥%ƒÄƒúÿ„­€}óu#è&YǕƒì hÀÁ#èÓðÿÿ¸ÿÿÿÿéЍÕ)з…Ô©%9E t"èíXǔƒì hÀÁ#èšðÿÿ¸ÿÿÿÿ鋋MìÁá+M썶Å »¥%‹‰Ä©%‹Mì‰ ë/‰öèŸXǑƒì hÀÁ#èLðÿÿ¸ÿÿÿÿë@¶‹Uì‰Å$¥%ƒì hÀÁ#è*ðÿÿ‹EìÁà+EìÁàH‰±È©%ºÀ©%‰<Æ¿EìƒÄeô[^_]ÉöU‰åWVSƒì¿E‰Eì‰ÇÁç)ÇÁ獗À©%‰UðhÀÁ#èÏêÿÿ‹Mð‹Y›ÁãC‰E躥%‹€Áà°`§%ƀ`§%F‰$èôÿÿF ‰$è„ôÿÿF$‰$èyôÿÿƒÄú·FPÿv èX£ÿÿû¹¥%‹Eè‹ú ’¡X§%‰Íd§%‰X§%ûƇÀ©%ƒÃ ‹Uð‹B‰ƒ¥%ú¡­%‰‡Ä©%‹Mì‰ -­%ûƃ¥%Ç$ÀÁ#è
-ïÿÿƒÄeô[^_]ÍvU‰åWVSƒì ‹u ŠM¿UÕ)Ѝ…À©%‰Eð‹@€Å`§%‹Eð€x uèûVǔ¸ÿÿév€;uèÞVǖ¸ÿÿéù‰ö€{tQ€{u,ƒì¶ÁP‹Uð·BPC PèÈëÿÿƒÄ…Àt;¸évƒì¶ÁP‹Uð·BPC PèœëÿÿƒÄ…ÀuÔƒì CPè-éÿÿƒÄ‹Uð·B‹{‰ÁÁéüó¥¨tf¥¨t¤·B‰ÁK‰K·S‰ÐC 9Ár‰È)ЉC€{u ƒì CPë8‰ö€{uƒì‹Uð·BPC$PèZïÿÿëƒì‹Uð·BPC$PèDïÿÿC‰$èíÿÿƒÄ¸eô[^_]ÐU‰åWVSƒì ‹} ŠM¿UÕ)Ѝ…À©%‰Eð‹@€Å`§%‹Eð€x uè‹Uǔ¸ÿÿév€;uènUǖ¸ÿÿéù‰ö€{tQ€{u,ƒì¶ÁP‹Uð·BPC$PèXêÿÿƒÄ…Àt;¸évƒì¶ÁP‹Uð·BPC$Pè,êÿÿƒÄ…ÀuÔƒì CPè½çÿÿƒÄ‹Uð·B‹s‰ÁÁéüó¥¨tf¥¨t¤·B‰ÁK‰K·S‰ÐC 9Ár‰È)ЉC€{u ƒì CPë8‰ö€{uƒì‹Uð·BPC Pèêíÿÿëƒì‹Uð·BPC PèÔíÿÿC‰$è-ìÿÿƒÄ¸eô[^_]ÐU‰åSƒìhÿ2#è;ƒÄÿ5X§%h 3#è;»ƒÄÝ)ØÁà€¸À©%t8À©%‹B€Å`§%ƒì ÿp ÿp$‹B€Å¥%PSh3#è®:ƒÄ Cƒûv­‹]üÉÃU‰åƒì`¿MÍ)ȋ…Щ%’Å`§%ÿp ÿp$RQh@3#E¨Pèf:ƒÄ ÉÐU‰åSƒì‹]hÀÁ#èHæÿÿ¿ÓÕ)Ѝ …‹Ø©%€Å ƒÄ€º¥%u ‹Ä©%‰‚¥%¿ÃÅ)ÂÁâƂÀ©%ú‹ -­%‰ŠÄ©%£­%ûƒì hÀÁ#èÓêÿÿƒÄ‹]üÉÍvU‰åWVSƒì ‹u ‹E‹<…ß#ú‹^…Ûu-ƒì j èžÿÿƒÄ…ÀtÇÿÿÿÿÇ@Ç@ÿÿÿÿ‹U‰‰F‹;lÞ#u û¸#é~ƒ;ÿtc¾@ß#‰ö‹ -lÞ#I‰ÐÁà)Ћ‰TÆP‹C‰„¬¡lÞ#‰CÿCè…ÿÿ¡lÞ#@‰ÂÁâ)ƒì ¿DÖPèŸ'èöŽÿÿƒÄûúƒ;ÿu¤¡lÞ#ÿD‡D¡lÞ#‰û¸eô[^_]ÉöU‰åWVSƒì ‹E ‹x¸…ÿ„À‹;lÞ#tû¸髍vúè*'‹lÞ# [‰ÊÁâ)Êf‰ÕHß#‹E‹…ß#ÿL˜DÇÿÿÿÿ‹_ÇGÿÿÿÿƒûÿt-p ‰Ù[‰ÐÁà)ЉŐß#‹œž DŽŽ ÿÿÿÿƒûÿuÖÇGè„ÿÿ¡lÞ#@‰ÂÁâ)ƒì ¿ÕHß#Pè¢&èùÿÿƒÄû¸eô[^_]ÃU‰åVSƒì h¤3#è~ÿÿè -™ÿÿ‰ÆÇ$èKœÿÿ‰Ã‰µß#ƒÄ jh¸3#Sè"8fÇCÍÆCÇCÇC¸°"ÇC ±"ÇC$±"ÇC(±"ÇC,H±"ÇC0t±"ÇC4¼±"ÇC8®"ÇC<²"ÇC@¯"ºƒÄsK •ÇD@DŽ ÿÿÿÿBú™~ݍeø[^]ÉöU‰åVS‹E‹…ß#ƒì h€3#è7¾ƒÄƒÃƒìÿt³@hŸ3#èû6ƒÄFþ™~ãeø[^]ÃU‰å¸ÿÿÿÿ]ÉöU‰å]ÍvU‰åƒì‹E‹U ‹…ß#ƒÀƒ|@tƒìRj
-èȽÿÿƒÄÉÍvU‰å‹U :t ‹E -9u
-¸ëv¸ÿÿÿÿ]ÐU‰åSƒì‹] j èӚÿÿ‰ÂƒÄ¸ …Òt!ÇÿÿÿÿÇBÇBÿÿÿÿ‹E‰‰S¸‹]üÉÍvU‰åSƒì‹] ‹Cƒxt ¸ë&‰öúƒ{tƒìj ÿsèäšÿÿÇCƒÄû¸‹]üÉÍvU‰åWVSƒì ‹}‹u ú‹^…Ûu*ƒì j è3šÿÿƒÄ…ÀtÇÿÿÿÿÇ@Ç@ÿÿÿÿ‰>‰Fƒ;ÿt
-û¸ë"‰ö¡lÞ#‹½ß#ƒÂÿD‚@¡lÞ#‰û¸eô[^_]ÃU‰åWVSƒì ‹E ‹U‹•ß#ú‹p¸…ö„V‹;lÞ#u û¸#éA‹lÞ#‹F ¿@ß#;„“°v -¸é v¡lÞ#‹Œƒ°‹“¬…Òt‰ö‹;lÞ#…Š‹R…Òu븅À…†‹ -lÞ#I‰ÂÁâ)‹ƒ¬‹‰D×P‹ƒ¬‹@‰„‹‹“¬¡lÞ#‰B‹ƒ¬ÿ@èj€ÿÿ¡lÞ#@‰ÂÁâ)ƒì ¿D×Pèù"èPŠÿÿƒÄûúéRÿÿÿ‰ö¸;J ’Àérÿÿÿ‹E‹…ß#¡lÞ#ÿDƒD¡lÞ#‰¹‹ƒ¬‹V ë‰ö‰Á‹A…Àt;P sò…Ét‰q됉³¬…Àt‰p‰F‰Nû¸eô[^_]ÍvU‰åWVS‹}‹E ‹ ½ß#ú‹X¸…Û„Ù‹;lÞ#uû¸#éčv‹lÞ#‹C ;„‘°s
-¸饡lÞ#‹´°‹‘¬…Òt‰ö‹;lÞ#u‹R…Òu︅Àuû¸ëk‰ö¸;r ’Àëåv‹ ½ß#¡lÞ#ÿDD¡lÞ#‰¾‹¬‹S 됉ƋF…Àt;P sò…öt‰^됉™¬…Àt‰X‰C‰sû¸[^_]ÉöU‰åWVSƒì ‹E ‹x¸…ÿ„ï‹;lÞ#tû¸éڍvúè&!‹lÞ# [‰ÊÁâ)Êf‰ÕHß#‹E‹…ß#‰EðÿL˜DÇÿÿÿÿ‹_ÇGÿÿÿÿƒûÿt2‰ÆƒÆv‰Ù[‰ÐÁà)ЉŐß#‹œžDŽŽÿÿÿÿƒûÿuÖÇG‹O‹W…Éu -‹Eð‰¬ë‰ö‹G‰A…Òt‹G‰Bèã}ÿÿ¡lÞ#@‰ÂÁâ)ƒì ¿ÕHß#Pèo èƇÿÿƒÄû¸eô[^_]ÐU‰åVSƒì hä3#èJ—ÿÿèْÿÿ‰ÃÇ$€è–ÿÿ‰Æ‰4ß#ƒÄ jhø3#Vèî1fÇFÌÆFÇFÇFÀ·"ÇF D¸"ÇF$p¸"ÇF( ¸"ÇF,è¸"ÇF0¹"ÇF4l¹"ÇF8|²"ÇF<´"ÇF@µ"ºƒÄ^N•ÇD@DŽ°ÿÿÿÿDŽÿÿÿÿBú™~Òdž¬eø[^]ÐU‰å‹U‹M ¸ÿÿÿÿ…Òt;‹‹…ß#ƒxu‹@%ÿÿÿ=Ìu…Ét ‹B‹@ ‰ë
-‰ö¸ÿÿÿÿ됸]ÐU‰å‹U‹M¸ÿÿÿÿ…Òt@‹‹…ß#ƒxu‹@%ÿÿÿ=Ìt¸ÿÿÿÿ됅Ét‹B‹@ ‰‹R‹E ‰B ¸]ÃU‰å‹E‹M ‹U‹…ß#‰”ˆ°]ÃU‰åWVSƒì‹E‹<…ß#h€3#è0»ƒÄwƒìÿtž@hŸ3#èó/ƒÄCû™~ãƒì hÂ3#èÚ/»ƒÄ‰öƒìÿ´Ÿ°hÞ3#è¼/ƒÄCû™~àeô[^_]ÃU‰å‹U :t ‹E -9u
-¸ëv¸ÿÿÿÿ]ÐU‰åS‹E‹U ‹]‹ …ß#Áâ‹C‰„°ÇD
-D‹$ÉÉöU‰åVS‹E‹u ‹…ß#ƒ|³DtƒìVj
-èD¶ÿÿƒÄë vÇD³DDŽ³°ÿÿÿÿeø[^]ÉöU‰å‹U :t ‹E -9u
-¸ëv¸ÿÿÿÿ]ÐU‰åSƒì‹] jè3“ÿÿ‰ÂƒÄ¸ …Òt1ÇÿÿÿÿÇBÇBÿÿÿÿ‹E‹@‰B ÇB‹E‰‰S¸‹]üÉÍvU‰åSƒì‹] ‹Cƒxt ¸ë&‰öúƒ{tƒìjÿsè4“ÿÿÇCƒÄû¸‹]üÉÍvU‰åWVSƒì$·]Sh4#è .‰Ø-yƒÀÁèƒÄ ·À‰Eè@ÛÁã¿À¹%ÿt8CP‰Eä·8Ph 4#èá-ƒÄ ÿt;·D;Ph4#èÊ-ƒÄ ÿt; s·>Ph(4#è±-ƒÄ ÿt>·D>Ph94#èš-ƒÄ ‹Uä·D:P·DLPhJ4#è~-‹UèÕƒÄ·ØSh[4#èc-EóPEòPEìPS蹃ĶUóR¶UòRÿuìPh 4#è6-ƒÄ eô[^_]ÍvU‰åWVSƒì ‹E‹U‹]¹‹u ƒî‰ƒî‰º <&fƒ= <&yA¿Áfƒ<Byfù™~îfù™~ƒì hp4#èÎ,¸ƒÄé ¿Á<¹ <&‰Úf Ê€f‰Ǎ<ÿÁçºÀ¹%‰tÇD _ÇDfŒÙf‰LfÇfÇDÇD _ ‹M‰ ÇDÇDO0ÇDÇD Ǎ_@ÇÇD‰t‰t fŒÉf‰L fŒÙf‰LfŒÛOPf‰\fŒÛf‰fÇD 0fÇD0O`fÇfÇDfÇDÇ,º%¾à=&¹üó¥Å˜eô[^_]ÐU‰åVS‹u ¿E-‰Â…ÀyP‰ÐÁø@ÀÁà¹À¹%f‰tX@Vf‰T f‰t ƒÀPf‰tf‰4[^]ÉöU‰å¿E-‰Â…ÀyP‰ÐÁøfDŽ <&]ÉöU‰åSƒì‹]¿E Phˆ4#Sè~3‰ØƒÄ‹]üÉÃU‰åVS趉Æès»‰öƒìh¬Ã"SèƒÄh8½"SèìƒÄCƒû~ۉðeø[^]ÉöU‰åƒìèaÉÍvU‰åSƒì‹]‹|Z#€82uºð°îƒìShâ5#èˆ*ƒÄÁ㋃|Z#@Ph=@#èp*ƒÄÿ³ÀZ#ènƒÄ‹]üÉÉöU‰åƒìÿuhù5#èE*èèûÇ$èG7ƒÄÉÉöU‰åWVSƒì‹E‹} ƒ=¸%„à…ÿ„Ø¡€®%€€€ źm¶‰È÷â‰È)ÐÑ草ÁÁé
-‰O¡„®%ÀP‰ÐÁà)кè‰Ó™÷û’’’щW¡„®%ÀP‰ÑÁá)ѾÓMb‰È÷îÁú‰ÈÁø‰Ó)øƒÞC÷o‰ÑÁù‹GÁø)Á‰È؉‹OÁú‰ÈÁø)’’’’’’Áâ)э ‰ ‰ ‰Áá‰O‹éԉö]血®%€€€ źm¶‰È÷â‰È)ÐÑ草ÁÁé
-¡„®%ÀP‰ÐÁà)кè‰Ö™÷þ’’’щS¡„®%ÀP‰ÑÁá)ѾÓMb‰È÷îÁú‰ÈÁø)‰Uè‹{¸ƒÞC÷ï‰ÑÁù‰øÁø)Á‰ÈEè‰ùÁú‰ÈÁø)’’’’’’Áâ)э ‰ ‰ ‰Áá‰K‹E荀€€€€€‰ÃÁã‰È÷îÁúÁù)ʍéèvƒøuc¸ƒ=t®%…Ρx®%€€€€€€‰ÃÁã‹ -|®%ºÓMb‰È÷êÁúÁù)ÊӅÿ„…¡x®%‰¡|®%éqvƒø…ç¶d®%ƒøtƒø…Àt
-ë,ƒøtë%¹@°ë#v¹A°ëv¹B°ë v»ë"ºCÐî‰Êì¶ØìˆÁ‰ÊÁâf¶Ã‰Ó Ãf‹ -p®%f)Ù·É -€®%º×®¬]‰È÷êÁú‰ÈÁø)„®%’BÁà)Ѝ‚‰ÂÁâ Ð)Á‰È£€®%f‰p®%…ÿ„̍€€€ źm¶‰È÷â‰È)ÐÑ草ÁÁé
-‰O¡„®%ÀP‰ÐÁà)кè‰Ó™÷û’’’щW¡„®%ÀP‰ÑÁá)ѺÓMb‰È÷êÁú‰ÈÁø‰Ó)Ëw¸ƒÞC÷î‰ÑÁù‰ðÁø)Á‰È؉‰óÁú‰ÙÁù)ʍ’’’’’’Áâ‰Ø)Ѝ€€€Áà‰G‹€®%’’’4Õ¹Á6ۉð÷é‰Ó3‰ÁÁù
-‰ð™‰È)Ћ -„®%ɍ‘ÑÁâ)ʉÑÁá)эÈ鍃ø…ƒ=t®%…rUè¡x®%‰¡|®%‰B»@¹C°Ò‰Êî‰Úì¶ÈìÁàf¶Ñ зð·¸%9Æv%h6#j_h6#h6#èm%Ç$èmƒÄ·¸%)ó¯h®%·¸%‰Ø‰Ñº÷ñ‰Ãº °
-îì©t‹ -h®%;ÍÌÌ̉ð÷âÁê9Ós‰Ëu荛€€‹V‰Eä‰F¸¡/¸D÷mä‰ÑÁù‹EäÁø)Á‰ÈEè‹N¸¡/¸D÷éÁú‰ÈÁø)’’’’’’’’’Áâ )щN¡x®%€€€€€€Áà‰Eä‹ -|®%ºÓMb‰È÷êÁúÁù)ʋEäÐÅÿt ‰ð‹‰‹@‰G‰Øëv¸eô[^_]ÍvU‰åVSƒìŠEˆE÷ÿ([#ƒ=([#uƒ=[#tÿ[#¶E÷€Áàº,­%ƒ<uIÇö€0­%tûƒì ¶]÷›Áã¾ ­%ÿ43ÿ“$­%ƒÄöDtú¶E÷€Ç…,­%ÿ [#ƒ=([#uƒ=[#tÿ[#ÿ -([#eø[^]ÍvU‰åWVSº¿,­%¾(­%»$­%¹ ­%’ÁàÇ8‰0ÇÇBƒú~ÜÇ([#[^_]ÐU‰åVS‹U‹] ‹uú’ƒ<…,­%t÷Æu¸ÿÿÿÿëH’ …ǁ,­%û…Ût‰™$­%º ­%(­%‰‰t
-됍’Ç…,­%¸[^]ÐU‰å¡([#]ÉöU‰åSƒì¶d®%ƒøt!ƒø…Àt ë.‰öƒøtë%¹@°ë#v¹A°ëv¹B°ë v»ë"ºCÐî‰Êì¶ØìˆÁ‰ÊÁâf¶Ã‰Ó Ãf‹ -p®%f)Ù·É -€®%º×®¬]‰È÷êÁú‰ÈÁø)„®%’BÁà)Ѝ‚‰ÂÁâ Ð)Á‰ -€®%f‰p®%ÿ([#ƒ=([#uƒ=[#tÿ[#¡|®%‰ÃÄÁ#º¡/¸D‰Ø÷êÁú‰ÙÁù)Êx®%’’’’’’’’’Á⠉Ø)У|®%‹`®%ë$‹¡l®%‰‰l®%‰`®%ƒì ÿrÿRƒÄ‰Ú…Òt‹B ;x®%;x®%uƋB;|®%~»ƒ=([#uƒ=[#tÿ[#ÿ -([#‹]üÉÃU‰åWVSƒì‹uhÒ"j@èØ -ƒÄƒ>t,ƒì h96#èß »ÿÿƒÄ¿@¹C°8‰ÊîˆØ‰úîëaƒì hU6#è³ ‹N‰ -h®%ɍA‰ÂÁâ‰Ñ)ÁºÓMb‰È÷âƒÄ‰ÑÁéu¹f‰ -¸%‰Ë¿@¹C°4‰Êî‰úˆØî‰ØfÁèî‹£t®%ƒ=d>&~»A¹C°p‰ÊÚîîÆd®%ë%Æd®%»B¹C°°‰ÊÚîîºa°îº!ì%þî¹¾ ®%»¤®%ƒùbIÁà¸®%‰0I‰LÃAƒùc~ßÇè·%Çl®% ®%Ç[#Ç[#¡h®%€€€Áà£ÄÁ#Ç|®%Çx®%Ç€®%Ç„®%fÇp®%ƒ=t®%uÇDÞ#øÈ"ÇHÞ#É"ëÇDÞ#àÉ"ÇHÞ#lÐ"eô[^_]ÃU‰å‹E£[#]ÍvU‰å‹E£[#]ÍvU‰å‹E£[#]ÍvU‰åWVSƒì ‹E‹U ‰Eè‰Uì¸ÿÿÿÿƒ=l®%tl‹ -l®%‹£l®%‹E‰A‹Eè‰A ‹Eì‰A‹E‰A»‹`®%}è‹uè됋…Òt‰ð;B  -;B u‹G;B~‰Óëâ‰ö…Ût‰ ë‰ -`®%‰‹AƒÄ [^_]ÐU‰å‹E¹‹`®%됉ы…Òt;Buó¸ÿÿÿÿ…Òt$…Éu
-‹£`®%됋‰¡l®%‰‰l®%¸]ÃU‰åWVSƒì,‹E‹U ‰Eè‰Uì¸ÿÿÿÿƒ=l®%„q‹5l®%‹£l®%‹E‰F‹Eè‰F ‹Eì‰F‹E‰Fº‹`®%}è‹Mè됋…Ût‰È;C  -;C u‹G;C~‰Úëâ‰ö…Òt‰2鐉5`®%ƒ=¸%…ôƒìEàPjè3óÿÿ‹`®%ƒÄ‹Eà;B  -;B u‹Eä;B~ÇEÜÇEØëK}؋`®%Mà‹B;A|‹B +Eà‰E؉Ћ@+Aë ¡`®%‹@ +EàH‰EØ¡`®%‹@+Eäʚ;‰G‹E؍€€€€€€Áà‰EԋMÜ¿ÓMb‰È÷ïÁúÁù)ÊUԍҍB‰ÂÁâ)‰Ð÷çÁê¸ðúðw¸ÈúÇv‰Ðº@îfÁèFeô[^_]ÃU‰åWVSƒì¶d®%ƒøtƒø…Àt
-ë,ƒøtë%¹@°ë#v¹A°ëv¹B°ë v»ë"ºCÐî‰Êì¶ØìˆÁ‰ÊÁâf¶Ã‰Ó Ãf‹p®%f)Ú·Ò‰Ö5€®%¹×®¬]‰È÷î‰ÑÁù‰ðÁø)Á -„®%‰AÁà)ȍÁ‰ÁÁá ȉò)‰€®%f‰p®%]荒’’ Õ¾m¶‰ð÷á‰Ö‰Ê)òÑê2‰ÁÁé
-¡„®%ÀP‰ÐÁà)кè‰Ö™÷þ’’’щS¡„®%ÀP‰ÑÁá)ѺÓMb‰È÷êÁú‰ÈÁø)‰Uè‹s¿ƒÞC‰ð÷ï‰ÑÁù‰ðÁø)Á‰ÈEè‰ðÁú‰ñÁù)ʍ’’’’’’Áâ)Ѝ€€€Áà‰Cƒ=`®%„/Ǹ%‹`®%‹Eè;B ;B …Œ‹C;BŽ€ƒ=([#uƒ=[#tÿ[#ÿ([#‹`®%ë#‹¡l®%‰‰l®%‰`®%ƒì ÿrÿRƒÄ‰Ú…Òt‹B ;Eè -;EèűB;Eì~ă=([#uƒ=[#tÿ[#ÿ -([#¶d®%ƒøt"ƒø …Àt -ë/vƒøtë%¹@°ë#v¹A°ëv¹B°ë v»ë"ºCÐî‰Êì¶ØìˆÁ‰ÊÁâf¶Ã‰Ó Ãf‹p®%f)Ú·Ò‰Ö5€®%¹×®¬]‰È÷î‰ÑÁù‰ðÁø)Á -„®%‰AÁà)ȍÁ‰ÁÁá ȉò)‰€®%f‰p®%]荒’’ Õ¾m¶‰ð÷á‰Ö‰Ê)òÑê2‰ÁÁé
-¡„®%ÀP‰ÐÁà)кè‰Ö™÷þ’’’щS¡„®%ÀP‰ÑÁá)ѺÓMb‰È÷êÁú‰ÈÁø)‰Uè‹s¿ƒÞC‰ð÷ï‰ÑÁù‰ðÁø)Á‰ÈEè‰ðÁú‰ñÁù)ʍ’’’’’’Áâ)Ѝ€€€Áà‰C‹`®%‹Mè;J 
-;J u;B~ÇEäÇEàëJ]à‹`®%Mè‹B;A|‹B +Eè‰Eà‰Ð‹@+Aë ¡`®%‹@ +EèH‰Eà¡`®%‹@+Eìʚ;‰C‹Eà€€€€€€‰ÆÁæ‹Mä»ÓMb‰È÷ëÁúÁù)ʍ2ҍB‰ÂÁâ)‰Ð÷ãÁê¸ðúðw¸ÈúÇv‰Ðº@îfÁèîǸ%ë -‰öº@°î°ðîeô[^_]ÐU‰åVSƒì‹E»¹‹`®%ëv‰Ñ‹…Òt;Buó¸ÿÿÿÿ…Ò„I…Éu‹£`®%»ë‹‰¡l®%‰‰l®%ƒ=¸%…ƒ=`®%uº@°î°ðéû‰ö…Û„òƒìEðPjèºìÿÿ‹`®%ƒÄ‹Eð;B  -;B u‹Eô;B~ÇEìÇEèëJ]è‹`®%Mð‹B;A|‹B +Eð‰Eè‰Ð‹@+Aë ¡`®%‹@ +EðH‰Eè¡`®%‹@+Eôʚ;‰C‹E荀€€€€€‰ÆÁæ‹Mì»ÓMb‰È÷ëÁúÁù)ʍ2ҍB‰ÂÁâ)‰Ð÷ãÁê¸ðúðw¸ÈúÇv‰Ðº@îfÁèeø[^]Éöú‹D$¼ÈÑ#PèŒëÿÿ`fff f¨f¸0ŽØŽÀ° º î¡[#@£[#1ÛfŒÓü¡t®%ƒøtèùòÿÿëè6ùÿÿ°
-º îì¨t ¸@Pè–ÿÿÿf¡[#f9[#t f£[#ÿ-[#ƒ=[#t‹[#ÿÓf©f¡ffaωöU‰å‹EØf£[#f£[#]Ã1ÀÈÃU‰åf¸0ŽØŽÀ‹Ef;[#t f£[#ÿ-[#]ÉöU‰åƒìjjjj@èaƒÄÉÃU‰åWVSƒì ‹]‹u ‹}聉€:y"…Ût‹B8‰…öt‹BÁà
-‰…ÿt)‹B4‰ë"‰ö…ÛtÇ…öt‹BÁà
-‰…ÿtÇ@ƒ}t ‹BÁà
-‹U‰ƒÄ [^_]ÍvU‰åƒìjjjj@è̓Ä·@0ÉÃU‰å¡ØX#]ÉöU‰å]ÍvU‰åSƒì‹ØX#誃ì Sèucÿÿè ƒÄ‹]üÉÃU‰åWVS‹M ‹u‹}Š]‰ÈÁàeèÿÿ Eè‰ÈÁèUèˆBáÿbÿÿÿ J‰ðˆB‹Ef‰Eè‹EÁè‰EäŠEäƒà ÃË@¶ÃÁàbÿÿÿ Bçüÿ=ÊX#‹‰‹B‰G[^_]ÐU‰åWVSƒì ‹] ‹u‹}·EMèÊX#‹‰‹@‰A‰Ê¶JÁá¶B ÁÁá·B Á…ÛtŠBƒà¶ÐÁâ·Eè Љ…ötŠE툅ÿt
-ŠEî%ðˆ‰ÈƒÄ [^_]ÉöU‰å‹E ¶UÁâ¹à[#fÇD
-8Ƃå[#îƂä[#f‰
-Áèf‰D
-]ÍvU‰åº °îº!°@î°î°î°ÿ°°pî°î°î°ÿî]ÐU‰åº °îº!°î°î°î°ÿ°°pî°î°î°ÿî]ÐU‰å‹Mf…ÉtWfƒùw¸Óà
-$[#ë7fƒùw<·Éƒé¸Óà
-%[#¢%[#º¡î<ÿu $[#©uƒÈ¢$[#º!î]ÃU‰å‹Mf…ÉtUfƒùw¸þÿÿÿÓÀ"$[#ë5fƒùw:·Éƒé¸þÿÿÿÓÀ"%[#¢%[#º¡î $[#©t%û¢$[#º!î]ÉöU‰å¿[#]ÃU‰åƒì‹Ef£[#˜PèWüÿÿƒÄÉÐU‰å¿[#]ÃU‰åƒì‹E‰Âf£[#ƒ=([#uƒì ¿ÂPèüÿÿƒÄÉÐU‰åWVì¾¹0[#ºp[#‰öµÇ(Ú"Ç(Ú"Fƒþ~åƒì EÈPèÅèºÇ`>&¡6#‹EÈ£d>&¶,[#£h>&ƒÄ‹EУp>&‹EÔ£t>&‹EØ£x>&hÑÛ"jè£ýÿÿƒÄhÛÛ"jè”ýÿÿƒÄhåÛ"jè…ýÿÿƒÄhìÛ"jèvýÿÿƒÄhóÛ"jègýÿÿƒÄhúÛ"jèXýÿÿƒÄhÜ"jèIýÿÿƒÄhGÜ"jè:ýÿÿƒÄhÜ"jè+ýÿÿƒÄhÜ"j èýÿÿƒÄhÜ"j
-è -ýÿÿƒÄhÜ"j èþüÿÿƒÄh$Ü"j èïüÿÿƒÄh+Ü"j -èàüÿÿƒÄh2Ü"jèÑüÿÿƒÄh9Ü"jèÂüÿÿƒÄh@Ü"jè³üÿÿƒÄhÛ"jAè¤üÿÿƒÄhÛ"jBè•üÿÿƒÄhÛ"jCè†üÿÿƒÄhÛ"jDèwüÿÿƒÄh Û"jEèhüÿÿƒÄh(Û"jFèYüÿÿƒÄh0Û"jGèJüÿÿƒÄh8Û"jpè;üÿÿƒÄh@Û"jqè,üÿÿƒÄhHÛ"jrèüÿÿƒÄhPÛ"jsèüÿÿƒÄhXÛ"jtèÿûÿÿƒÄh`Û"juèðûÿÿƒÄhhÛ"jvèáûÿÿƒÄhpÛ"jwèÒûÿÿf -Ô=&€¾ƒÄvÀÅÀ¹%ƒì jh‰hØPõ·ÀPèúÿÿƒÄ Fþš~ǃì hÐèFùÿÿƒÄÛãݵTÿÿÿ›¿à=&µTÿÿÿ¹üó¥ ÀƒÈ""ÀÛãèƒûÿÿèúÿÿeø^_]ÍvU‰åSƒìº!°ÿîè’ûÿÿ¹@ºC°6Êîîƒ=d>&~¹AºC°tî°‰Êî°ë»B¹C°°‰ÊÚîîºaî‹]üÉÃU‰å‹U‹E ‰•p[#]ÉöU‰å‹U‹E ‰•0[#]ÉöU‰åƒìh€6#è
-è— ƒÄÉÉöœX‰Á5PœX9ÈtQ¸Ã¸ÜX‰Á5 PœX1ÈtQ¸øÃf1Àžf¸f»öóŸ€üu¸øÃÆ,[#Ûã¹âþfÇ.[#ZZÝ=.[#¹âþf¡.[#<u+Ù=.[#¹âþf¡.[#f%?fƒø?uÆ,[#Æ,[#Éö`¸ëp`¸ëh`¸ë``¸ëX`¸ëP`¸ëH`¸ë@`¸ë8`¸ ë0`¸
-ë(`¸ ë `¸ ë`¸ -ë`¸ë`¸ë ¨Pf¸0ŽÀŽØüX1ÛfŒÓP‹…0[#ÿÓ[° ƒûrº îº îf¡[#f;[#t f£[#ÿ-[#©¡aϸ鋸選ëz¸ës¸ël¸ëe¸ë^¸ëW¸ ëP¸
-ëI¸ ëB¸ ë;¸ -ë4¸ë-¸ë&¸ë` ¨f¸0ŽÀŽØüèש¡aÏPf¸0ŽØŽÀXfŒÓ‹=ÊX#ß1ۊŠ_Áãf‹_ÜfŒÒfŒÛŽÓSRPÿ…p[#ƒÄX[ŽÐ)ÜÏU‰åWVSƒì ‹u¸¹ ‰÷üó«è|ýÿÿ…ÀtÇëUèŠýÿÿ…Àt7ÇFǸ¢‰^‰N‰V …Àt+¸¢‰F‰^‰N‰V ëÇècýÿÿ…ÀtÇ ƒÄ [^_]ÍvU‰åWV¿°[#È·À-yƒÀÁø9ÂtU¿°[#@ÀÝ4Å,º%›È·À-yƒÀÁøf£°[#¿5°[#¿ >&4v4ö4õ,º%¹üó¥Ý% >&^_]ÉöU‰å¿°[#]ÃU‰åWVSƒì(ŠM¡´[#Áà ˜€ f¶?&f£ÊÑ#f¶ -?&f£ÌÑ#€ù t%€ù €ù„óé‰ö€ù
-„#é‰öfƒÊÑ#·ÊÑ#;?&Œ½fÇÊÑ#·ÌÑ#¡?&H9Â…¿¡?&H‰Eì‰Uèf¾ ?&Áâf‰Uò¡´[#Áà °€ ¿;}è:¹;Mì*_ÿv‰ø¯?&È·F‰Ø¯?&Èf‰FA;Mì~ÜG;}è~ƹ;MìKWÿ‰Ð¯?&Èf‹]òf‰FA;Mì~çé)‰öfÇÈÑ#·ÊÑ#‰Áƒø~ºƒÂ·ÂƒÀ9È|óf‰ÈÑ#f¡ÈÑ#f£ÊÑ#éævfÇÊÑ#·ÌÑ#¡?&H9Â…¾¡?&H‰Eà‰UÜf¾ ?&Áâf‰Uæ¡´[#Áà °€ ¿;}Ü=v¹;Mà*_ÿv‰ø¯?&È·F‰Ø¯?&Èf‰FA;Mà~ÜG;}Ü~ƹ;MàGWÿ‰Ð¯?&Èf‹]æf‰FA;Mà~çé%‰öfÿ -ÊÑ#·ÊÑ#·ÌÑ#¯?&ÂÆS fÿÊÑ#éõ‰ö·ÊÑ#·ÌÑ#¯?&Ј CfÿÊÑ#·ÊÑ#;?&Ž¿fÇÊÑ#·ÌÑ#¡?&H9Â…š¡?&H‰EԉUÐf¾ ?&Áâf‰UÚ¡´[#Áà °€ ¿;}Ð=v¹;MÔ*_ÿv‰ø¯?&È·F‰Ø¯?&Èf‰FA;MÔ~ÜG;}Ð~ƹ;MÔ'Wÿ‰Ð¯?&Èf‹]Úf‰FA;MÔ~çëfÿÌÑ#·5ÊÑ#·=ÌÑ#‰øf¯?&f‰EΡ´[#Áà fEÎfuλÔ°‰Úî¹Õ‰ÊŠEÎî°‰Úîf‹EÎfÁè‰Êî‰óˆ?&‰ø¢ -?&ƒÄ([^_]ÐU‰åWVSƒì‹u‹} ‰øf¯?&f‰Eò¡´[#Áà fEòfuò»Ô°‰Úî¹Õ‰ÊŠEòî°‰Úîf‹EòfÁè‰Êî‰ð¢?&‰úˆ -?&ƒÄ[^_]ÍvU‰åS¹Ô°
-‰Êî»Õ‰ÚŠEî° ‰Êî‰ÚŠE î‹$ÉÍvU‰åWVSƒìf¾EÁàf‰Eò¡´[#Áà ¸€ ‹]ë0‹M ;M(sÿ‰Ø¯?&È·G‰ð¯?&Èf‰GA;M~ÜC;]~ʋM ;MSÿv‰Ð¯?&Èf‹]òf‰GA;M~çƒÄ[^_]ÍvU‰åWVSƒì ¡?&H‰Eð‹?&K‰]ìf¾ ?&Áàf‰Eê¡´[#Áà °€ ¿9ß<‰ö¹;Mð*_ÿv‰ø¯?&È·F‰Ø¯?&Èf‰FA;Mð~ÜG;}ì~ƹ;MðWÿ‰Ð¯?&Èf‹]êf‰FA;Mð~çƒÄ [^_]ÍvU‰å·J‰?&¶„@£?&¶„ÿ ¢ ?&¶P¢?&¶Q¢ -?&¶`¢ÏÑ#¶a¢ÎÑ#Ǹ[#Ç´[#]ÃU‰åWVSƒì ?&¢P  -?&¢Q¶ÀP¶?&PèŠýÿÿ¶ÎÑ#¶5ÏÑ#ƒÄ¹Ô°
-‰Êî¿Õ‰úˆØî° ‰Êî‰ú‰ðîeô[^_]ÍvU‰åSƒì‹]€;tŠCƒì ¾ÀPèiùÿÿƒÄ€;ué‹]üÉÃU‰åVS‹E‰ÃÁã £¸[#¹Ô° -‰Êî¾Õ‰òˆØî° ‰Êî‰ØfÁè‰òî[^]ÃU‰åVS‹u‹´[#Áâ»àÑ#¶?&‰¹Ò#¶ -?&‰
-µŠ¢?&Š
-¢ -?&‰5´[#[^]ÃU‰å¡¸[#]ÉöU‰å¡´[#]ÉöU‰åWVSƒì ‹}f¾u Áæf¾E Ƌ]‹E9Ã3v‹M9ù#‰Ê¯?&¡´[#Áà ÐØf‰´€ A9ù~ÞC;]~ЃìÿuÿuèüÿÿŠE¢ -?&ŠE¢?&ƒÄeô[^_]ÍvU‰åWVSƒì ¡?&H‰Eð‹=?&Of¾ ?&ÁãƒË ¾9Æ4¹9ù%v‰Ê¯?&¡´[#Áà Ððf‰œ€ A9ù~ÞF;uð~̃ìjjèûÿÿÆ -?&Æ?&ƒÄeô[^_]ÍvU‰åS‹U ‹]‹M¯?&¡´[#Áà ÂU”€ ˆ
-ˆZ‹$ÉÉöU‰åS‹E ‹]‹M‰Â¯?&¡´[#Áà ÂU”€ ¶B…Étˆ¶‰Â…Ûtˆ¾Â‹$ÉÐU‰åS‹E ‹MŠ]‰Â¯?&¡´[#Áà ÂU”€ €9tŠˆABˆB€9uò‹$ÉÐU‰åƒìh¼6#èTýÿÿôƒÄÉÉöU‰åƒìjèƒÄÉÉöU‰åƒìh4èƒÄÉÍvU‰åVS‹Ef£r¹d»þ¾v‰Êì©t Fþÿÿ~í¸@=Ÿ†~ø‰ÚˆÈö@=Ÿ†~øë‰öU‰åSƒìE Pÿuh Ò#èX‰ÃÇ$ Ò#è¢üÿÿ‰ØƒÄ‹]üÉÃU‰åWVSìð‹} ŠEˆ…ÿÿÿEPÿuÿÿÿSè‰ÆS¾…ÿÿÿPWÿuè±þÿÿ‰ðƒÄ eô[^_]ÃU‰åSƒìE Pÿuh Ô#謉ÃÇ$ Ô#è&üÿÿ‰ØƒÄ‹]üÉÃU‰åS‹M‹U ‰Ë€:tvŠˆBA€:uõƉ؋$ÉÍvU‰åVS‹]‹U ‹M‰Þë‰öŠˆBC€:t‰ÈI…ÀîƉð[^]ÐU‰å‹U‹M ë -¸€:tBAŠ:t)Ð]ÃU‰åS‹U‹] ‹M…Éëv¶¶Sÿ)Ð됊C8uíŠB„ÀtIu︋$ÉÐU‰å‹U¸€:tB@€:uù]ÍvU‰åS‹E‹] €8t‰Ú€:tŠv:
-tB€:uö@€8u下$ÉÉöU‰å‹E‹U €8t ‰ö8t @€8uö¸]ÍvU‰åS‹]‰Ú€;t‰öŠ
-AŸ<wAàˆB€:uì‰Ø‹$ÉÐU‰åS‹]‰Ú€;t‰öŠ
-A¿<wA ˆB€:uì‰Ø‹$ÉÐU‰åS‹U‹M ‰Ó€;tvB€:uú늈AB€9uõƉ؋$ÉÍvU‰åWVSƒì<‹u‹]ÇEèÇEäÇEàÇEÜÇEØÇEÔÇEпÇEÌÙîÝ]À‰uì‹E €8„D‹U €:%t…ÿuŠˆB‰U FÿEèév‹E €8%u%@‰E ¿ÇEä
-ÇEàÇEØÇE̋U ¾ƒè%ƒøS‡Ñÿ$… '#‰öÆ%FÿEè鼃ÉòFŠCüˆÿEè驐ƒ}Øt"ƒ}؃}Øtëƒ}ØuƒÃ‹Cü‰EÔë -vƒÃ¿Sü‰Uԃì ÿuÌÿuäj
-VÿuÔè¾ éœƒ}Øt"ƒ}؃}Øtëƒ}ØuƒÃ‹Cü‰EÐë -vƒÃ·Sü‰UЃì ÿuÌÿuäj
-VÿuÐè.éPƒ}Øt"ƒ}؃}Øtëƒ}ØuƒÃ‹Cü‰EÐë -vƒÃ·Sü‰UЃì ÿuÌÿuäjVÿuÐèâ鐃ËCü‰EЃì jÿuäjVPèÂé䐃ËSü€:tŠˆBFÿE܀:uò‹UÜUèévƒ}Øtƒ}؃}Øtëƒ}Øu ƒÃÝCøÝ]ÀƒìÿuÌÿuàÿuäVÿuÄÿuÀèYë~vƒ}Øtƒ}؃}Øtëƒ}Øu ƒÃÝCøÝ]ÀƒìÿuÌÿuàÿuäVÿuÄÿuÀè} -ë>vƒ}Øtƒ}؃}Øtëƒ}Øu ƒÃÝCøÝ]ÀƒìÿuÌÿuàÿuäVÿuÄÿuÀèa‰EÜEèÆ¿ƒÄ é±ÇEØé¥ÇEØ陃MÌ鐍vƒMÌ鄍v¿ƒMÌëvƒÿu?ƒìEìPj
-ÿu èb
-‰EäƒÄ‹E €80u ÷EÌtƒMÌ됃MÌ‹UìJ‰U ë4vƒÿu,ƒìEìPj
-ÿu è
-‰Eà‹EìH‰E ¿ƒÄë‰ö¿ÿE ‹U €:…¼üÿÿÆ‹Eèeô[^_]ÉöU‰åƒì EPÿu ÿuè7üÿÿƒÄÉÉöU‰åWVSƒì,‹u‹} ‹]ÇEìÇEèÇEäÇEàÇEÜÇEØÇEÔÇEЉuð€?„>€?%tƒ}Ôu ŠˆGFÿEìëá€?%uGÇEÔÇEè
-ÇEàÇEоƒè%ƒøS‡çÿ$…p(#Æ%FÿEìéԃÉòFŠCüˆÿEìéÁƒ}àt&ƒ}àƒ}àt
-ë"ƒ}àt
-ëƒÃ‹CüëƒÃ‹CüëƒÃ¿Cü‰E܃ì ÿuÐÿuèj
-VÿuÜè鏐ƒ}àt&ƒ}àƒ}àt
-ë"ƒ}àt
-ëƒÃ‹CüëƒÃ‹CüëƒÃ·Cü‰E؃ì ÿuÐÿuèj
-ëBƒ}àt&ƒ}àƒ}àt
-ë"ƒ}àt
-ëƒÃ‹CüëƒÃ‹CüëƒÃ·Cü‰E؃ì ÿuÐÿuèjVÿuØè6‰EäEìÆÇEÔƒÄ éҍvƒÃ‹Sü€:tŠˆBFÿEä€:uò‹EäEì飍vÇEàé›ÇEà鏃MÐ醍vƒMÐë}‰öÇEÔƒMÐënvƒ}Ôu6ƒìEðPj
-W蓉EèƒÄ€?0u ÷EÐtƒMÐ됃MЋ}ðOë1‰öƒ}Ôu)ƒìEðPj
-WèW‹}ðOÇEÔƒÄë
-vÇEÔGé¼ýÿÿvÆ‹Eìeô[^_]ÉöU‰åƒì EPÿu ÿuèGýÿÿƒÄÉÉöU‰åWVSƒì,‹}‹uÇEèÇEäÇEàÇEÜÇEØ»‰}ì饐‹U €:%t…Ûu B‰U 鏍v‹E €8%u%@‰E »ÇEäÇEàÇEÜÇE؋U ¾ƒè*ƒøN‡Eÿ$…À)#‰öƒû…8ƒìEìPj
-ÿu èN‰E܃MØ‹EìH‰E ƒÄéŠGƒÆ‹^üˆëÝØÿEèéõƒÆ‹^üëG€?tƒì ¾PèBƒÄ…ÀuçÇEÔë#‰ö÷EØuŠˆCë‹UÜ9UÔ}ŠˆCÿEÔG€?tƒì ¾PèþƒÄ…ÀtÇÆ덉öƒìhÈ6#Wè&÷ÿÿ‰ÇƒÄ EìPj
-WèՉ‹}ìƒÄƒ}à…Wƒ}ät)ƒ}ä ƒ}ätéCÿÿÿƒ}ä…9ÿÿÿƒÆ‹Fü‰é,ÿÿÿƒÆ‹Füf‰éÿÿÿ‰öƒìhÕ6#Wè¶öÿÿ‰ÇƒÄ EìPj
-됃ìhà6#Wèšöÿÿ‰ÇƒÄ EìPjWè ‹}ìƒÄƒ}à…̓}ät+ƒ}ä -ƒ}äté¹þÿÿ‰öƒ}ä…­þÿÿƒÆ‹Vü‰é þÿÿƒÆ‹Vüf‰é‘þÿÿ‰öƒìhø6#Wè*öÿÿ‰ÇƒÄEìPWè;‹}ìƒÄƒ}àu`ƒ}ät)ƒ}ä ƒ}ätéMþÿÿƒ}ä…CþÿÿƒÆ‹FüÝé8þÿÿƒÆ‹FüÙé*þÿÿvÇEäë vÇEäëvÇEàëÝؐ»ÿE ‹E €8…Pýÿÿ‹Eèeô[^_]ÐU‰åƒì EPÿu ÿuèïüÿÿƒÄÉÉöU‰åWVSƒì,‹u ÇEп‹Eƒð‰EԋU‰U̅Òy‰Ñ÷ىM̃}y ‹E…Ày÷Ø됋E÷EÔu ƒ}yƒ}yGƒ}u‹EÐÆD(Ø0@‰EÐë8v…Àt1U؉Uȉöƒì º÷ủÃRèI‹MȋUЈ
-B‰UЉ؃Ä…Àu×}ЋEԃàƒøu‰ú;}} -‰öÆ FGB;U|õƒ}y ƒ}yÆ-ë ÷EÔtÆ+F‹Eԃàƒøu‰ú;}} Æ0FGB;U|õ‹UÐJx M؊
-ˆFJy÷‹Eԃàƒøu‰ú;}} Æ FGB;U|õƉøeô[^_]ÃU‰åƒì‹Eÿuÿu÷ØPÿu ÿuèŸþÿÿƒÄ ÉÉöU‰å‹E…Ày÷Ø]ÉöU‰åSƒì‹]èÁîÿÿƒì Sè± ÿÿU‰åWVSƒì‹M‹} ÙîÙÀÙ軀9-u ¾ÿÿÿÿë
-‰ö¾ëA€90túŠƒè0< w(Ý+#ëÙˍv¾ƒè0AÜËÙËPÚ$XŠƒè0< vâÝۀ9.u9AŠƒè0< w/Ý+#ëÙÉÙʉö¾ƒè0AÜÊÙÊPÚ$ÙÉXØʊƒè0< vÝÝÚÙÉÞùÞÁVÚ $^€9et €9E…“A€9-u
-¾ÿÿÿÿAë‰ö€9+u ¾Aëv¾Šƒè0< weÝ+#¾ƒê0A·ÃÙÀPÚ $Ù}ð‹]ðÆEñ Ùmð‰]ðÛ]ìÙmð‹Eì·À‰$Û$‰$Ú$ZÙ}ð‹UðÆEñ Ùmð‰UðÛ]ìÙmð‹Eì‰ÃŠƒè0< v£Ý؅ö~!ºf…Ût4Ý+#·Ã‰öÜÉB9Â|ùëvº·Ã‰Ã9Â}Ý+#ÜùB9Ú|ùÝ؅ÿt‰ƒÄ[^_]ÐU‰åWVSƒì ‹]‹} ÇE쾀;-u ÇEðÿÿÿÿCë‰ö€;+u ÇEðCëÇEð€;0u>C€;0túë6ƒì ¾PCè‰ÂƒÄ9ú…Òy
-¸ëEv‰ð¯÷Ö9ð~ÇEìƒìW¾P聃ąÀu¶ƒ}t‹E‰ƒ}ìt¾ÿÿÿ¯uð‰ðeô[^_]ÉöU‰åWVSƒì ‹]‹} ÇEð¾€;0uC€;0tú€;xuKƒÿuFC€;0u@‰öC€;0túë6ƒì ¾PCè_‰ÂƒÄ9ú…Òy
-¸ëAv‰ð¯÷Ö9ðvÇEðƒìW¾PèуÄ…Àu¶ƒ}t‹E‰ƒ}ðt¾ÿÿÿ‰ðeô[^_]ÉöU‰åŠUBÐ< w ¾Âƒè0ë&vB¿<w ¾Âƒè7됍BŸ<w ¾ÂƒèW됾Â]ÍvU‰å‹Uƒú w B0¾À됍BöƒøwB7¾Àë¾Â]ÍvU‰åŠUƒê0¸€ú –À]ÉöU‰åŠUBÐ<vBŸ<w¸ë¸]ÐU‰åŠU€ú/~‹E ¼[#:Pÿ¸ë¸]ÐU‰åŠUBŸ<w Bà¾Àëv¾Â]ÍvU‰åŠUB¿<w B ¾Àëv¾Â]ÍvU‰åVS¾ƒì ¾]Sè%ƒÄ…Àuƒì Sè5ÿÿÿƒÄ…Àt¾‰ðeø[^]ÃU‰åŠUƒêA¸€ú9–À]ÉöU‰å¸€}/žÀ]ÍvU‰åŠUƒêa¸€ú–À]ÉöU‰åŠUB÷<v
-¸€ú u¸]ÉöU‰åŠUƒêA¸€ú–À]ÉöU‰åWVSƒì ÝEÝUè‹]‹}ÇEäSd$øÝ$èoƒÄ…Àtƒì Sè·îÿÿƒÄéPvÙîÝEèÚéßà€äE€üu Æ-C€uï€ë÷EtÆ+CÿEäÝ+#ÝEèÚéßà€äE€üuÆ0ÆC¸éû‰öÙèÝEèÝáßà€äE€üu3¾Ýéßà€äE€üuHÝ7#ÝEèØÉÝUèNÝêßà€äE€ütëÝØë)vÝØÝؾÝ7#ÝEèë ÝEèØñÝUèFÝéßàöÄtîÝ؃ì Vè÷ùÿÿƒÄƒøc~ƒïë‰öƒø ~ƒïë‰ö…ö~Oƒì‹EƒÈPÿuWSÿuìÿuèèUEäƒÄ …öu‹Eäë;‰ö]äÆeCƒì jºgfff‰ð÷êÁú‰ðÁø)ƒÂRj
-SVè\ùÿÿ‹UäD‰EäƒÄ eô[^_]ÍvU‰åWVSìŒÝEݝþÿÿ‹]Dž€þÿÿ½¸þÿÿ¹K¸üó«ƒìSÿµ”þÿÿÿµþÿÿ貃ąÀtƒì SèúìÿÿƒÄé‰öÙî݅þÿÿÚéßà€äE€üuÆ-C€µ—þÿÿ€ëv÷Et
-Æ+Cÿ…€þÿÿƒì…˜þÿÿPÿµ”þÿÿÿµþÿÿèþݝpþÿÿ‹…pþÿÿ‹•tþÿÿ‰Æ‰×DžŒþÿÿƒÄ݅˜þÿÿÙèÙÉÝáßàöÄ…ø重vh$@jÿµœþÿÿÿµ˜þÿÿè$݅˜þÿÿÜ5+#ݝ˜þÿÿÙ½´þÿÿ‹´þÿÿƅµþÿÿ Ù­´þÿÿ‰´þÿÿß½¨þÿÿÙ­´þÿÿ‹…¨þÿÿ‰$èûÿÿ‹•Œþÿÿˆ„*¸þÿÿB‰•ŒþÿÿƒÄ݅˜þÿÿÙèÙÉÚéßàöÄ„oÿÿÿ‹•Œþÿÿ•€þÿÿ‰ÑI…¸þÿÿ‰…|þÿÿë‰ö‹•|þÿÿŠˆCI‹•Œþÿÿƒê‰ÐÁèH!Â9Ñ}ޅÉx‹Œþÿÿƒéx
-vÆ0CIyùÆëÝØÝØÆ0Cÿ…€þÿÿÝ 7#‰µpþÿÿ‰½tþÿÿ݅pþÿÿÚéßàöÄE…\‹E@9…€þÿÿLÆ.Cÿ…€þÿÿ‹Eƒà‰…ˆþÿÿDž„þÿÿDžŒþÿÿv‰µpþÿÿ‰½tþÿÿ݅pþÿÿÜ(7#Ü -+#ݝpþÿÿ‹µpþÿÿ‹½tþÿÿƒì…˜þÿÿPWVèݝpþÿÿ‹•pþÿÿ‹tþÿÿ‰Ö‰Ï݅˜þÿÿÙ½´þÿÿ‹´þÿÿƅµþÿÿ Ù­´þÿÿ‰´þÿÿ۝¤þÿÿÙ­´þÿÿ‹…¤þÿÿƒÄ…Àtƒ½ˆþÿÿu
-Džˆþÿÿƒì PèÓùÿÿˆCÿ…€þÿÿÿ…ŒþÿÿƒÄƒ½ˆþÿÿt‹E9…Œþÿÿ~
-Dž„þÿÿ‹•€þÿÿ9U}
-Dž„þÿÿƒ½„þÿÿ„ýþÿÿKë
-‰öÿ€þÿÿ‰Ã€;0u Cÿ€{ÿ.uêCÆ‹…€þÿÿeô[^_]ÃU‰åWVSƒì‹]‹u ‹}WVSèZƒÄ…Àtƒì Wè¢éÿÿƒÄéñ‰öÙî‰]è‰uìÝEèÝáßàÝـäE€üuÙàëvÝ؉]è‰uìÝEèÝ+#ÙÉÝáßàÝـäE€üuÝØÆ0ÆG¸雺ÙèÙÉÝáßà€äE€üu/Ýáßà€äE€üu?Ý7#ëÙɐÜÉÙÉJÝâßà€äE€ütìÝØëvÝÙÝ7#ë‰öØñÙÉBÙÉÝáßàöÄtðÝØÝ؍BƒøvƒìÿuÿuÿuWVSèÔùÿÿë‰öƒìÿuÿuÿuWVSèXûÿÿƒÄ eô[^_]ÐU‰åƒìSÙ}ü›f‹Eüf -? f‰EøÙmø›ÝEÙüÝ]ð›‹Uð‹Mô‹]‰‰KÝEÜeðeì›ÛâÙmü›[ÉÍvU‰åƒì‹E‹U ‰Eø‰Uü‹MUøf‹BfÁè%ÿ=ÿt¸ëk÷Bÿÿuƒ:t…Étƒìh07#QèDçÿÿƒÄ¸ë@‰ö€zy…Étƒìh47#Qè çÿÿƒÄ¸ë‰ö…Étƒìh97#QèçÿÿƒÄ¸ÉÃU‰åƒì¸ Ö#ƒ=È[#tÿÈ[#ÉÃU‰å‹E£È[#]ÍvU‰åƒì‹E‹U ‰Eø‰UüUø¹f‹BfÁè%ÿ=ÿu÷Bÿÿuƒ}øt¹‰ÈÉÉöU‰åSƒì‹E ‹]ÆPè‰âÿÿ‰ØƒÄ‹]üÉÍvU‰åVSƒì ÝEÝUð‹]‹uVSd$øÝ$èrÝ]èƒÄƒ=Ì[#ÿtWƒìVSèYÿÿÿƒÄ…ÀuFƒìÿuôÿuðèDÿÿÿƒÄ…Àu1Ùî‰]à‰uäÝEàÚéßà€äE€ô@uƒì jVSÿuôÿuðè4ƒÄ ëvÝEèeø[^]ÉöÝD$ ÝD$Ùø›ßàžzøÝÙͶ¼'U‰åVSƒì0ÝE‹]‹u‹EÝUà‰]è‰uìPÿú‡Èÿ$•0+#ÝØÇEغ>7#ƒøc~ºC7#‰UÜÇEðÇEôƒ=Ì[#„}ƒì EØP誃ąÀ…uƒ=Ì[#…YƒìjhI7#éëvÝØÇEغ]7#ƒøc~ºb7#‰UÜÇEðÇEôƒ=Ì[#„ƒì EØPè>ƒÄ…À… ƒ=Ì[#…íƒìjhh7#év‰]à‰uäÝ]èÇEغ|7#ƒøc~º‚7#‰UÜÇEðÇEôƒ=Ì[#„žƒì EØPè˃ąÀ…–ƒ=Ì[#…zƒìjh‰7#é ÝØÇEغž7#ƒøc~º¤7#‰U܃=Ì[#uÇEðàÇEôÿÿïGé¸ -¡À[#‹Ä[#‰Eð‰Uôé¡ -‰öÝØÇEغ29#ƒøc~º89#‰U܃=Ì[#uÇEðàÇEôÿÿïGéh -¡À[#‹Ä[#‰Eð‰UôéQ -‰öÝØÇEغ«7#ƒøc~º¯7#‰U܃=Ì[#uÇEðàÇEôÿÿïGé -¡À[#‹Ä[#‰Eð‰Uôé -‰öÝØÇEغ«7#ƒøc~º¯7#‰UÜÇEðÇEôéÑ ‰öÝØÇEغ72#ƒøc~º´7#‰U܃=Ì[#uÇEðàÇEôÿÿïÇë¡À[#‹Ä[#ò€‰Eð‰Uôƒ=Ì[#„óƒì EØPè ƒÄ…À…ëƒ=Ì[#…σìjh¸7#éaÝØÇEغ72#ƒøc~º´7#‰U܃=Ì[#uÇEðàÇEôÿÿïÇë¡À[#‹Ä[#ò€‰Eð‰Uôƒ=Ì[#„gƒì EØP蔃ąÀ…_ƒ=Ì[#…Cƒìjh¸7#éÕ -ÝØÇEغø1#ƒøc~ºÊ7#‰U܃=Ì[#uÇEðàÇEôÿÿïÇë¡À[#‹Ä[#ò€‰Eð‰Uôƒ=Ì[#„Û -ƒì EØPèƒÄ…À…Ó -ƒ=Ì[#…· -ƒìjhÎ7#éI -ÝØÇEغø1#ƒøc~ºÊ7#‰U܃=Ì[#uÇEðàÇEôÿÿïÇë¡À[#‹Ä[#ò€‰Eð‰Uôƒ=Ì[#„O -ƒì EØPè| -ƒÄ…À…G -ƒ=Ì[#…+ -ƒìjhÎ7#é½ ÝØÇEغà7#ƒøc~ºã7#‰U܃=Ì[#uÇEðàÇEôÿÿïÇë¡À[#‹Ä[#ò€‰Eð‰Uôƒ=Ì[#„à ƒì EØPèð ƒÄ…À…» ƒ=Ì[#…Ÿ ƒìjhç7#é1 ÝØÇEغà7#ƒøc~ºã7#‰U܃=Ì[#uÇEðàÇEôÿÿïÇë¡À[#‹Ä[#ò€‰Eð‰Uôƒ=Ì[#„7 ƒì EØPèd ƒÄ…À…/ ƒ=Ì[#… ƒìjhç7#é¥ ÝØÇEغù7#ƒøc~º8#‰U܃=Ì[#uÇEðàÇEôÿÿïGéP ¡À[#‹Ä[#‰Eð‰Uôé9 ‰öÝØÇEغù7#ƒøc~º8#‰U܃=Ì[#uÇEðàÇEôÿÿïGë¡À[#‹Ä[#‰Eð‰Uôƒ=Ì[#„a ƒì EØPèŽ ƒÄ…À…Y ƒ=Ì[#…= ƒìjh8#éÏ
-vÝØÇEغ8#ƒøc~º 8#‰U܃=Ì[#uÇEðàÇEôÿÿïÇë¡À[#‹Ä[#ò€‰Eð‰Uôƒ=Ì[#„å ƒì EØPè ƒÄ…À…Ë
-ƒ=Ì[#…¯
-ƒìjh%8#éA
-ÝØÇEغ8#ƒøc~º 8#‰U܃=Ì[#uÇEðàÇEôÿÿïÇë¡À[#‹Ä[#ò€‰Eð‰Uôƒ=Ì[#„G
-ƒì EØPèt
-ƒÄ…À…?
-ƒ=Ì[#…#
-ƒìjh68#éµ ÝØÇEغI8#ƒøc~ºO8#‰U܃=Ì[#uÇEðàÇEôÿÿïÇë¡À[#‹Ä[#ò€‰Eð‰Uôƒ=Ì[#„Íƒì EØPèè ƒÄ…À…³ ƒ=Ì[#…— ƒìjhV8#é) ÝØÇEغI8#ƒøc~ºO8#‰U܃=Ì[#uÇEðàÇEôÿÿïÇë¡À[#‹Ä[#ò€‰Eð‰Uôƒ=Ì[#„/ ƒì EØPè\ ƒÄ…À…' ƒ=Ì[#… ƒìjhi8#靐ÝØÇEغ~8#ƒøc~º‚8#‰UÜÇEðÇEôƒ=Ì[#… ƒì EØPèòƒÄ…À…½ƒìjh‡8#jèÞõÿÿèeõÿÿÇ!ƒÄ降vÇEغ~8#ƒøc~º‚8#‰U܃=Ì[#uvÇEðàÇEôÿÿïG‰]ЉuÔÝEÐÜ -è9#Ý]Ћ]ЋuÔÙîÙÉÚéßà€äE€ü…¯ƒìVSèjƒÄ‰]ЉuÔÝEÐÙÉÚéßà€äE€ü@„‡ÇEðàÇEôÿÿïÇét¡À[#‹Ä[#‰Eð‰Uô‰]ЉuÔÝEÐÜ -è9#Ý]Ћ]ЋuÔÙîÙÉÚéßà€äE€ü…6ƒìVSèñƒÄ‰]ЉuÔÝEÐÙÉÚéßà€äE€ü@„¡À[#‹Ä[#ò€‰Eð‰UôéòvÝØÇEغ~8#ƒøc~º‚8#‰UÜÇEðÇEôéÁ‰öÝØÇEغ~8#ƒøc~º‚8#‰U܃=Ì[#uÇEðÇEôë¡À[#‹Ä[#ò€‰Eð‰Uôƒ=Ì[#„ãƒì EØPèƒÄ…À…Ûƒ=Ì[#…¿ƒìjhŸ8#éQÝØÇEغ~8#ƒøc~º‚8#‰U܃=Ì[#uÇEðÇEôëÇEðÇEôøƒ=Ì[#„`ƒì EØP荃ąÀ…Xƒ=Ì[#…<ƒìj hÀ9#éΉöÇEغ¹8#ƒøc~º¾8#‰U܃=Ì[#u6ÙîÙÉÚéßàöÄEuÇEðàÇEôÿÿïGém‰öÇEðàÇEôÿÿïÇéX‹ -À[#‹Ä[#‰Mð‰]ôÙîÙÉÚéßàöÄE„4‰È‰Úò€‰Eð‰UôéÝØÇEغÄ8#ƒøc~ºÉ8#‰U܃=Ì[#uÇEðÇEôëÇEðÇEôøƒ=Ì[#„Lƒì EØPèyƒÄ…À…Dƒ=Ì[#…(ƒìjhÏ8#麉öÇEغã8#ƒøc~ºè8#‰U܃=Ì[#uÝ]ðëÝØÇEðÇEôøƒ=Ì[#„Òƒì EØPèÿƒÄ…À…ʃ=Ì[#…®ƒìjhî8#é@ÝØÇEغ9#ƒøc~º -9#‰UÜÇEðÇEôøƒ=Ì[#„iƒì EØP薃ąÀ…aƒ=Ì[#…Eƒìjh9#é׍vÝØÇEغ19#ƒøc~º79#‰UÜÇEðÇEôøƒ=Ì[#„ýƒì EØPè*ƒÄ…À…õƒ=Ì[#…Ùƒìjh>9#ékvÝØÇEغS9#ƒøc~ºY9#‰UÜÇEðÇEôøƒ=Ì[#„‘ƒì EØP较ąÀ…‰ƒ=Ì[#…mƒìjh`9#éÿvÇEغS9#ƒøc~ºY9#‰UÜÜ5ð9#Ý]ðƒ=Ì[#„,ƒì EØPèYƒÄ…À…$ƒ=Ì[#…ƒìjhu9#隉öÇEغˆ9#ƒøc~ºŽ9#‰U܋ -À[#‹Ä[#‰Mð‰]ôÙîÙÉÚéßàöÄEtC‰È‰Úò€‰Eð‰Uôë1‰öÇEغˆ9#ƒøc~ºŽ9#‰U܍d$øÝ$jjè›Ý]ðƒÄƒ=Ì[#…jé|vÝØÇEغ•9#ƒøcŽ•º˜9#鋍vÝØÇEغ72#ƒøc~uº´7#ën‰öÝØÇEغ«9#ƒøc~Yº®9#ëR‰öÝØÇEغø1#ƒøc~=ºÊ7#ë6‰öÝØÇEغ²9#ƒøc~!ºµ9#ë‰öÝØÇEغà7#ƒøc~ºã7#‰UÜÇEðÇEôƒ=Ì[#„¯ƒì EØPèʃąÀ…•ƒ=Ì[#…‹ƒìjÿuÜjè«îÿÿƒÄ jhœ9#jèšîÿÿƒÄëfÝØÇEغú7#ƒøc~º8#‰U܃=Ì[#uÇEðàÇEôÿÿïGë¡À[#‹Ä[#‰Eð‰Uôƒ=Ì[#tƒì EØPè2ƒÄ…À…ýè¶íÿÿÇ"éívÝØÇEغú7#ƒøc~º8#‰U܃=Ì[#uÇEðàÇEôÿÿïGë¡À[#‹Ä[#‰Eð‰Uôƒ=Ì[#„‰ƒì EØP趃Ä…À…ƒ=Ì[#uiƒìjh 8#jè™íÿÿƒÄëSÇEغ~8#ƒøc~º‚8#‰UÜÝ]ðƒ=Ì[#ÿt ƒ=Ì[#uÇEðÇEôð?ë$‰öƒì EØPè@ƒÄ…ÀuèÈìÿÿÇ!ëÝØÝEðeø[^]ËT$â€‹D$%ÿÿÿ ЉD$ÝD$ÉöU‰å¸]ÉöÝD$ÙüÉö¼'U‰åWVSƒì ‹E ‰EðEƒEðƒeðøƒàø‰Eì‹Eð9EìsƒìjUhø9#h:#è˜ ƒÄ‹Eð9Eì„Ä‹E‹…Û„·‹C;C rƒìj`hø9#h -:#è` ƒÄöCtƒìjahø9#h@:#èC ƒÄöC tƒìjbhø9#h€:#è& ƒÄ‹Eì;CvL‹Eð;C sD‰Æ‹}ì;ss‹s;{ v‹{ 9÷wƒìjnhø9#h!:#èæ ƒÄƒì‰ø)ðPVÿu蚃ċ…Û…Iÿÿÿeô[^_]ÐU‰åWVSƒì ‹u ‹E‹}‰ÂUƒÀƒàøƒâø9†ŒÇF‰F‰V ‹E‰F‰~ÇF‹MëF‰ö9óuƒìjlh°:#h»:#èX ƒÄ‹F ;Cv‹F;C sƒìjmh°:#hà:#è1 ƒÄ‰Ù‹…Ût9{±9{u‹S +S‹F +F9Âwœ‰‰1eô[^_]ÃU‰åWVSƒì ‹]‹} …ÛuƒìjLh -;#h;#èÙ
-ƒÄ…ÿuƒìjMh -;#h;#è¾
-ƒÄƒÇƒçø‹3…ö„rvƒ~uƒ~t‹F;FsƒìjUh -;#h`;#è€
-ƒÄƒ~t‹F;F rƒìjUh -;#hÀ;#è[
-ƒÄ‹F +F9FvƒìjUh -;#h<#è9
-ƒÄ‹F÷ЅE…åF‰Eð‹^…Û„ԍv÷Ãtƒìj^h -;#h@<#èø ƒÄöCtƒìj_h -;#h€<#èÛ ƒÄƒ;t9wƒìj`h -;#hÀ<#è» ƒÄ;^ rƒìjah -;#h6;#èŸ ƒÄ9{rGv‹‰‹C)ø‰B‹Eð‰ë
-v‹‹Uð‰9~sƒìjwh -;#hM;#è\ ƒÄ)~‰Øë‰ö‰]ð‹…Û…/ÿÿÿ‹6…ö…‘þÿÿ¸eô[^_]ÃU‰åƒì jÿjÿuÿuÿuÿu ÿuèƒÄ ÉÐU‰åWVSƒì‹]‹EE ‰Eð…ÛuƒìjThé<#h;#èۃă} uƒìjUhé<#h;#较ċ;…ÿ„lƒuƒt‹G;Gsƒìj[hé<#h`;#舃ăt‹G;G rƒìj[hé<#hÀ;#ècƒÄ‹G +G9Gvƒìj[hé<#h<#èAƒÄ‹G÷ЅE…á‹Uð9WƒÕ‹M9O †ÉG‰Eì‹_…Û„¸v÷Ãtƒìjkhé<#h@<#èèƒÄöCtƒìjlhé<#h€<#è˃ă;t9wƒìjmhé<#hÀ<#諃Ä;_ rƒìjnhé<#h6;#菃ċU 9S‚$‰Þ;]s‹u¹;M}ºÓâ‹E1ð…ÂtÖA;M|è‰ð)ØE ;C‡è‹M 1;Eð‡æ‰ðƒàø‰Eè9Øsƒìh‘hé<#hô<#èƒÄ9]èvC‹Uè)ډUä÷Âtƒìh–hé<#h =#èãƒÄ‹‹M艋C+Eä‰A‹Eä‰C‰]ì‰ðƒà‹U Tƒâø‰U ‹Mè9Qv‰ÊU ‹‰‹A+E ‰B‹Eì‰ë
-‹Uè‹‹M쉋E 9Gsƒìh´hé<#hM;#èkƒÄ‹U )W‰ðë‰ö‰]ì‹…Û…Kþÿÿ‹?…ÿ…•ýÿÿ¸eô[^_]ÃU‰åƒì jÿjjj ÿu hÿuèýÿÿƒÄ ÉÐU‰åWVSƒì‹]ShR=#èeÌÿÿ‹3ƒÄ…ö„ƒìÿvÿvÿv‹F +FPÿv ÿvhà=#è5ÌÿÿƒÄ ƒ~uƒ~t‹F;Fsƒìjahd=#h`;#袃ă~t‹F;F rƒìjahd=#hÀ;#è}ƒÄ‹F +F9Fvƒìjahd=#h<#è[ƒÄ¿‹^…Û„¾ƒì ÿ3ÿs‰ØCPSh >#è—ËÿÿƒÄ ÷Ãtƒìjihd=#h@<#èƒÄöCtƒìjjhd=#h`>#èóƒÄƒ{wƒìjkhd=#hk=#èփă;t9wƒìjlhd=#hÀ<#趃Ä;^ rƒìjmhd=#h6;#蚃Ä{‹…Û…BÿÿÿƒìWh‡=#èäÊÿÿƒÄ9~tƒìjshd=#hš=#è`ƒÄ‹6…ö…cþÿÿƒì h²=#è®ÊÿÿƒÄeô[^_]ÍvU‰åWVSƒì ‹u‹] ‰ßƒçø…öuƒìjNhû9#h;#è ƒÄ…ÛuƒìjOhû9#h’>#èñƒÄƒ}uƒìjPhû9#h;#èԃĉ؃à‹UTƒâø‰U‹ëv‹…ÛuƒìjXhû9#h>#螃ă{uƒ{t‹C;CsƒìjYhû9#h`;#èsƒÄƒ{t‹C;C rƒìjYhû9#hÀ;#èNƒÄ‹C +C9CvƒìjYhû9#h<#è,ƒÄ;{‚hÿÿÿ;{ ƒ_ÿÿÿ‹EC‹C +C9Cvƒìjbhû9#h<#èòƒÄÇEð‹sëv‰uð‹6…öt9þróƒ}ðtm‹Eð@9ørc9øtƒìjnhû9#hÀ>#諃ąöt8‹U:9ðr.9ðtƒìjuhû9#h?#肃ċEF‹UðB‹‰ëE‹E‹UðBë9ƒ}ðt
-‹Eð‰8ëv‰{…öt‹U:9ðr‰ÐF‰G‹‰ë ‹E‰G‰7eô[^_]ÃU‰åƒì hÿu ÿuèÒýÿÿƒÄÉÐU‰å‹EÇ]ÉöU‰åWVSƒì ÇEèÇEìÇEð‹E‹0…ö„Zƒ~uƒ~t‹F;Fsƒìj]h&?#h`;#蠃ă~t‹F;F rƒìj]h&?#hÀ;#è{ƒÄ‹F +F9Fvƒìj]h&?#h<#èYƒÄÿEð¿‹^…Û„¨v÷Ãtƒìjdh&?#h@<#è$ƒÄöCtƒìjeh&?#h`>#èƒÄƒ{wƒìjfh&?#hk=#èêƒÄƒ;t9wƒìjgh&?#hÀ<#èʃÄ;^ rƒìjhh&?#h6;#讃ÄÿEì{‹…Û…[ÿÿÿ9~tƒìjnh&?#hš=#肃Ä‹FEè‹6…ö…§þÿÿƒì ÿuìÿuðÿuèÿuh@?#è¾ÆÿÿƒÄ eô[^_]ÍvU‰åVS‹u‹] EƒìPÿuh@Ö#è…ÈÿÿƒÄh@Ö#ÿ5€Þ#jSVhÀ?#è5ƒÄ eø[^]ÍvU‰åƒìÿ5lÞ#jÿuÿu ÿuh€?#èƒÄ ÉÉöU‰åƒì E Pÿuh@Ú#èÈÿÿƒÄ jjhø!#èì%ÿÿƒÄh@Ú#h#@#èŠÅÿÿÇ$MèFÿÿƒÄÉÐU‰åƒìh@Ú#h@#ècÅÿÿƒÄÉÉöU‰åWVSƒì¿ÿÿÿÿ‹E ‹‹E@‰ÐÁà)лDß#‰]ð‹´ÃЃùÿtCI‰ÐÁà)Ð;´ÃÐr0»Hß#‰Ï‰ÐÁà)ЋLÃPƒùÿtI‰ÐÁà)ЋUð;´ÂÐsՃÿÿt‰ÐÁà)ЋU‰Řß#ë
-‰ö‹E‹U ‰ƒùÿtI‰ÐÁà)ЋU‰Ŝß#ë
-‹E‹U ‰B‹E@‰ÐÁà)ЍÅP‰ˆHß#‰¸Lß#ƒÄ[^_]ÍvU‰åWVSƒì¿ÿÿÿÿ‹E ‹‹E@‰ÐÁà)ÐÁà‹â#‰U苀â#‰Eìƒùÿtw ‰ÆȉÂÁâ)‹Eè‰Ã;Õâ#|[‰Eäv1‰ÐÁà)ЍÅ;šâ#u ‹Eì;‚â#|1‰Ï‰ÐÁà)Ћ Řß#ƒùÿt4 1‰ÐÁà)Ћ]ä;Åâ#}«ƒÿÿt‰ÐÁà)ЋU‰Řß#ë‹E‹U ‰ƒùÿtI‰ÐÁà)ЋU‰Ŝß#ë
-‹E‹U ‰B‹E@‰ÐÁà)ЍÅP‰ˆHß#‰¸Lß#ƒÄ[^_]ÍvU‰å‹EÇÿÿÿÿÇ@ÿÿÿÿ]ÍvU‰åWVS‹uv‰ÐÁà)ЍÅP‹˜Lß#¿Hß#‹ 8ƒûÿt[‰ÐÁà)ЉLÇPëv‹E ‰ƒùÿt&I‰ÁÁá)Á»Lß#v‰ÐÁà)ЋDÃP‰DËPë v‹E ‰X[^_]ÐU‰åS‹M‹‰Øƒûÿt=‹@‰ÂÁâ)‹՘ß#‰ƒøÿt@‰ÐÁà)ÐÇŜß#ÿÿÿÿë
-vÇAÿÿÿÿ‰Ø‹$ÉÉöU‰åS‹M‹] ƒ;ÿt)I‰ÐÁà)Ћ‰Řß#‹@‰ÂÁâ)‰ ՜ß#됉KI‰ÐÁà)ÐÇŘß#ÿÿÿÿI‰ÐÁà)ÐÇŜß#ÿÿÿÿ‰ ‹$ÉÃU‰åS‹M‹] ƒ{ÿt,I‰ÐÁà)ЋS‰Ŝß#‹C@‰ÂÁâ)‰ ՘ß#ë‰ö‰ I‰ÐÁà)ÐÇŜß#ÿÿÿÿI‰ÐÁà)ÐÇŘß#ÿÿÿÿ‰K‹$ÉÃU‰å‹E‹]ÉöU‰å‹E‹@]ÐU‰å·Eƒøt ƒø…Àtë-ƒøtƒøtë ¸A@#됸F@#됸J@#됸P@#됸1#]ÐU‰åWVSƒìœúX‰Â‰Uä÷Et$ƒìEèPjèL—ÿÿƒÄ ÿuìÿuèh`@#èeÁÿÿƒÄ÷EtN¾;5pÞ#sA¿ Þ#vƒì µ‹;¶BP·BPRVh @#è!ÁÿÿƒÄ‹;VÿP ƒÄF;5pÞ#rÇ÷Etƒì h{@#èõÀÿÿèX&ÿÿƒÄ‹Uä‰ÐPeô[^_]Éö¨ê"pí"pí"pí"pí"pí"Üì"pí"èì"ôì"pí"í"í"í"í"í"í"í"í"í"í"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"pí"´ê"Èê"4ì"ôë"tì"Ðì"Èê"pí"pí"Äì"pí"Ðì"pí"¬ë"pí"pí"Ìë"pí"ë"pí"pí"`ë"Tî"4ð"4ð"4ð"4ð"4ð"¬ï"4ð"¸ï"Àï"4ð"Ðï"Ðï"Ðï"Ðï"Ðï"Ðï"Ðï"Ðï"Ðï"Ðï"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"4ð"`î"tî"4ð"4ð"4ð" ï"tî"4ð"4ð"”ï"4ð" ï"4ð"4ð"4ð"4ð"lï"4ð"Äî"4ð"4ð"ï"@ó"Ló"Ló"Ló"Ló"Ló"ñ"ñ"ñ"ñ"ñ"ñ"ñ"ñ"ñ"ñ"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"Ló"@ñ"Äñ"Àò"Àò"Àò"4ó"Äñ"Ló"Ló"(ó"Ló"4ó"Ló"Ló"Ló"Ló"Xñ"Ló"4ò"Ló"Ló"Pò"$@$@¤##|#ì#<#Œ#Ü# #˜#$#°#<#È#T#¤#, #¸ #D
-#Ð
-#\ #Ð #ì # -#¨ -#,#¼#@#¸#$##ü#`#¬#ð##0#L#h#„##|##d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#d#¤##|#ì#<#Œ#Ü# #˜#$#°#<#È#T#¤#, #¸ #D
-#Ð
-#\ #Ð #ì # -#¨ -#,#¼#@#¸#$##ü#`#¬#ð##0#L#h#„##|##ONCE: (pid=%d)
-J (pid=%d) exits
-main: creating prova_key
-main: provakey =%d
-main: creating J1
-Error creating J1
-main: J1 has PID %d
-main: creating J2
-Error creating J2
-main: J2 has PID %d
-main: waiting 0.4 sec
-main: kill J1 and J2
-main: ending...
-J (pid=%d) destructor called with value %d
-J (pid=%d) printtest value=%d
-J (pid=%d) starts and call setspecific
-Error during Keyboard Initialization!!!Ctrl-C pressed!
-KeybPortKeyTasktask_create
-scheduletime %lus %luns * caplasttime %lus %luns * exec=%d TIME = %lu
-The system tick must be less than 55 mSec!Abort detected
-Code : %u
-Too many scheduling levels!!!
-Too many resource levels!!!
-debug info noticewarn err crit alert emerg <%i>[%s] %sPosix task
-Signal number %d...
-with value : %d
-POSIX_ReadyPOSIX_DelayPOSIX_UnknownSlice: %d
-MainPOSIX_register_level
- alloco descrittore %d %d
- lev=%d
-POSIX schedulerPid: %d Name: %20s Prio: %3ld Status: %s
-
-Panic!!! can't create main task...
-dummy PID: %d
-Dummy1Dummy2Dummy3Dummy4Dummy5Dummy6Dummy7Dummy8Dummy9Dummy0DummyaDummybDummycDummydDummyeDummyfDummygDummyhDummyDummy (RR) Posto dummy_create
-
-Panic!!! can't create dummy task...
-Entro in dummy_register_level
-Port des :
-Free port des : %d
-%d %s vt: %d pn: %d
-%d pd: %d vt: %d pn: %d Resources owned by the tasks:
-%-4dPI_register_module
-PI module
-PC priority of the tasks:
-%-4ldPC_register_module
-PC moduleTR %x
-SS:SP %x:%lx
-Stack0 : %x:%lx
-Stack1 : %x:%lx
-Stack2 : %x:%lx
-CS : %x DS : %x
-Descriptor [%x] InfoNo more Descriptors...
-%x (Hex)Base : %lx Lim : %lx Acc : %x Gran %x
-2Coprocessor error#Page fault*General protection fault*Stack exception*Segment not present*Unvalid TSS#INTEL reserved*Double defect1FPU context switch*Unvalid opcode#BOUND limit exceeded#Overflow detected on INTO#Breakpoint trap#NMI detected#Debug fault#Division by 0Exception %d occurred
-ABORT %d !!!LL Time Panic!!!
-time.cError! File:%s Line:%d %sOne-shot timer selected...
-Periodic timer selected...
-Unhandled Exc or Int occured!!!
-32/LINUX CrossCompiled/ELFHalt called1234567890-+12345678901234567890xabcdefABCDEF1234567890.e+-0123456789ABCDEF$@ -Æ@,ú1°<NaN+Inf-Infacosacosfacos: DOMAIN error
-asinasinfasin: DOMAIN error
-atan2atan2fatan2: DOMAIN error
-hypothypotfexpexpfy0fy0: DOMAIN error
-y1fy1: DOMAIN error
-ynynfyn: DOMAIN error
-lgammalgammaflgamma: SING error
-loglogflog: SING error
-log: DOMAIN error
-log10log10flog10: SING error
-log10: DOMAIN error
-powpowfpow(0,0): DOMAIN error
-pow(0,neg): DOMAIN error
-sinhsinhfsqrtsqrtfsqrt: DOMAIN error
-fmodfmodffmod: DOMAIN error
-remainderremainderfremainder: DOMAIN error
-acoshacoshfacosh: DOMAIN error
-atanhatanhfatanh: DOMAIN error
-atanh: SING error
-scalbscalbfj0j0f: TLOSS error
-j1j1fjnjnfneg**non-integral: DOMAIN error
-à?addfree.cmax >= minreg->min < reg->maxnew_max > new_min(reg->min & (sizeof(struct lmm_node) - 1)) == 0(reg->max & (sizeof(struct lmm_node) - 1)) == 0addregio.cr != reg(reg->max <= r->min) || (reg->min >= r->max)alloc.clmm != 0size > 0reg->free >= 0(DWORD)node < reg->maxreg->free >= size(reg->nodes == 0 && reg->free == 0) || (DWORD)reg->nodes >= reg->minreg->nodes == 0 || (DWORD)reg->nodes < reg->maxreg->free <= reg->max - reg->min((DWORD)node & (sizeof(struct lmm_node) - 1)) == 0((DWORD)node->size & (sizeof(struct lmm_node) - 1)) == 0(node->next == 0) || (node->next > node)alloc_ge.canode >= node(split_size & (sizeof(struct lmm_node) - 1)) == 0lmm_dump(lmm=%p)
-dump.cnode->size >= sizeof(*node) free_check=%08lx
-reg->free == free_checklmm_dump done
- region %08lx-%08lx size=%08lx flags=%08lx pri=%d free=%08lx
- node %p-%08lx size=%08lx next=%p
-(node->size & (sizeof(struct lmm_node) - 1)) == 0block != 0reg != 0(DWORD)prevnode + prevnode->size == (DWORD)node(DWORD)node + size == (DWORD)nextnodestats.cLMM=%p: %u bytes in %u regions, %d nodes
-assertion %s failed in %s at line %i (task:%i_%i)
-MAGIC assertion failed in %s at line %i (task:%i_%i): %s
-KERNEL PANIC (sys_panic_stub): %s
-KERNEL PANIC (sys_panic): %s
-FreeExeSleepWaiting on joinTime (EXACT) : %lus %luns
-< Memory Dump >
-< Level %d : %s Code: %d Version: %d >
-8Œÿÿ’ÏÿÿšÏÿÈP#ÿà[#ÿÿÿÿÿÿÿÿÿÿÿÿ1234567890!@#$%^&*()-_=+[{]};:'"`~/?,<.>\|   - -1234567890.+*/-+*-aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ 1234567890!"œ$%&/()='?^Š‚+*•‡…ø\|<_,:.;—õ   - -1234567890.+*/-+*-aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ[]@#ìX#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ­0#¦0#Ÿ0#˜0#‘0#Š0#ƒ0#|0#èz"ðz"ðz"Ó5#Æ5#¸5#§5#Œ5#v5#f5#R5#C5#35#&5#5#5#æ4#Ú4#35#Ç4#þþAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAš7#ðÿÿÿÿGCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)01.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.01.symtab.strtab.shstrtab.text.rodata.data.sbss.bss.comment.note"€'! '# '¨ )ÈP#HA /Ð[#`L5à[#`L8ã :`LLC¬]hdI
\ No newline at end of file
/demos/branches/pj/pse51/ptest2
Property changes:
Deleted: svn:executable
## -1 +0,0 ##
-*
\ No newline at end of property
Index: demos/branches/pj/pse51/ptest1.c
===================================================================
--- demos/branches/pj/pse51/ptest1.c (revision 1085)
+++ demos/branches/pj/pse51/ptest1.c (nonexistent)
@@ -1,221 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: ptest1.c,v 1.1.1.1 2002-09-02 09:37:47 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:47 $
- ------------
-
- Posix test 1:
-
- the main task create 4 tasks, J1, J2, J3, J4
- at t = 0.2 sec. it raise a signal to J1
- at t = 0.4 sec. it raise a signal to J2
- at t = 0.8 sec. it kill J4
-
- J1: it simply calls sigwait
-
- J2: it simply calls sigwaitinfo
-
- J3: it simply calls sigtimedwait with a timeout of 0.5 sec.
-
- J4: it simply calls sigtimedwait with a -long- timeout
- (J4 will be killed by main)
-
- non standard function used:
- cprintf
- sys_gettime
- keyboard stuffs
- sys_end
-
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include <sys/types.h>
-#include <pthread.h>
-#include <signal.h>
-
-#include <kernel/kern.h>
-#include <drivers/keyb.h>
-
-void *J1(void *arg)
-{
- int sig, err;
- sigset_t mask;
-
- cprintf("J1 starts and call sigwait(31)\n");
-
- sigemptyset(&mask);
- sigaddset(&mask,31);
- err = sigwait(&mask,&sig);
-
- cprintf("J1 exit from sigwait(), err=%d, sig=%d\n", err, sig);
-
- return 0;
-}
-
-void *J2(void *arg)
-{
- int err;
- siginfo_t info;
- sigset_t mask;
-
- cprintf("J2 starts and call sigwaitinfo(30)\n");
-
- sigemptyset(&mask);
- sigaddset(&mask,30);
- err = sigwaitinfo(&mask,&info);
-
- cprintf("J2 exit from sigwaitinfo(), err=%d, signo=%d code=%d value=%d\n",
- err, info.si_signo, info.si_code, info.si_value.sival_int);
-
- return 0;
-}
-
-void *J3(void *arg)
-{
- int err;
- siginfo_t info;
- sigset_t mask;
- struct timespec t;
-
- cprintf("J3 starts and call sigtimedwait(29)\n");
-
- sigemptyset(&mask);
- sigaddset(&mask,29);
- t.tv_sec = 0;
- t.tv_nsec = 300000000;
- err = sigtimedwait(&mask,&info,&t);
-
- cprintf("J3 exit from sigtimedwait(), err=%d, signo=%d code=%d value=%d\n",
- err, info.si_signo, info.si_code, info.si_value.sival_int);
-
- return 0;
-}
-
-void uscitaJ4(void *arg)
-{
- cprintf("J4: AAAARRRRGGGHHH!!! killed by someone...\n");
-}
-
-void *J4(void *arg)
-{
- int err;
- siginfo_t info;
- sigset_t mask;
- struct timespec t;
-
- cprintf("J4 starts and call sigtimedwait(28)\n");
-
- sigemptyset(&mask);
- sigaddset(&mask,28);
- t.tv_sec = 10;
- t.tv_nsec = 0;
-
- pthread_cleanup_push(uscitaJ4,NULL);
- err = sigtimedwait(&mask,&info,&t);
- pthread_cleanup_pop(0);
-
- cprintf("J4 exit from sigtimedwait(), err=%d, signo=%d code=%d value=%d\n",
- err, info.si_signo, info.si_code, info.si_value.sival_int);
-
- return 0;
-}
-
-void fine(KEY_EVT *e)
-{
- sys_end();
-}
-
-
-int main(int argc, char **argv)
-{
- int err;
- sigset_t mask;
- pthread_t j1, j2, j3, j4;
- union sigval value;
-
- KEY_EVT emerg;
- //keyb_set_map(itaMap);
- emerg.ascii = 'x';
- emerg.scan = KEY_X;
- emerg.flag = ALTL_BIT;
- keyb_hook(emerg,fine);
-
-
- /* main blocks signals for all the tasks */
- sigfillset(&mask);
- pthread_sigmask(SIG_BLOCK, &mask, NULL);
-
- cprintf("main: creating J1\n");
- err = pthread_create(&j1, NULL, J1, NULL);
- if (err) cprintf("Error creating J1\n");
-
- cprintf("main: creating J2\n");
- err = pthread_create(&j2, NULL, J2, NULL);
- if (err) cprintf("Error creating J2\n");
-
- cprintf("main: creating J3\n");
- err = pthread_create(&j3, NULL, J3, NULL);
- if (err) cprintf("Error creating J3\n");
-
- cprintf("main: creating J4\n");
- err = pthread_create(&j4, NULL, J4, NULL);
- if (err) cprintf("Error creating J4\n");
-
- cprintf("main: waiting 0.2 sec\n");
- while (sys_gettime(NULL) < 200000);
-
- cprintf("main: kill(31), then wait until t=0.4 sec \n");
- kill(0, 31);
-
- while (sys_gettime(NULL) < 400000);
- cprintf("main: sigqueue(30), then wait until t=0.8 sec \n");
- value.sival_int = 300;
- sigqueue(0, 30, value);
-
- while (sys_gettime(NULL) < 800000);
- cprintf("main: kill(J4)\n");
- pthread_cancel(j4);
-
- cprintf("main: ending...\n");
-
- return 0;
-}
Index: demos/branches/pj/pse51/ptest3
===================================================================
--- demos/branches/pj/pse51/ptest3 (revision 1085)
+++ demos/branches/pj/pse51/ptest3 (nonexistent)
@@ -1,423 +0,0 @@
-ELF"4Àg4 ( €""(D(D ¨D(T#(T# Pî 덶°­üORäe‹Ká€uU¿€ Ç–eÆG1GeÆGGeÆG2GeÆG¸@é"fe£HT#Áèfe£NT#(\#¿€ Ç’eÆG0GeÆGf¸0ŽØŽÀŽÐŽàŽè¼@‡#ǽ%@g#ǽ%@‡#£4\#‰8\#(\#êµ"8.\#üèNÕê U‰å‹Eê ‰öU‰åSìüƅÿÿÿxƅÿÿÿ-ƅÿÿÿht"ƒì‹…ÿÿÿf‰$ÆD$-èÅÇE´"ÇE°]¨E¬‰$è9nƒÄ jSjè$YƒÄ jSjèYÇEˆÇEŒÇE+DžhÿÿÿDžlÿÿÿDžpÿÿÿšDžHÿÿÿDžPÿÿÿ DžTÿÿÿ„"…(ÿÿÿ‰…XÿÿÿƒÄ Dž(ÿÿÿDž,ÿÿÿDž8ÿÿÿDž<ÿÿÿDž@ÿÿÿDž0ÿÿÿDž4ÿÿÿ
-ÇEèÇEìeÍÇEðÇEôÇEØÇEÜÂë ÇEàÇEäÇEÈÇEÌ£áÇEÐÇEÔÇEÄÇEÀÇE¼ÇE¸…ÿÿÿPEˆPjèWqƒÄƒøÿuƒì h`1#èVçƒÄƒì…ÿÿÿP…hÿÿÿPjè'qƒÄƒøÿuƒì h€1#è&çƒÄƒì… ÿÿÿP…HÿÿÿPjè÷pƒÄƒøÿuƒì h 1#èöæƒÄjEèPjÿµÿÿÿè€uƒÄƒøÿuƒì hÜ/#èËæƒÄjEØPjÿµÿÿÿèUuƒÄƒøÿuƒì hù/#è æƒÄjEÈPjÿµ ÿÿÿè*uƒÄƒøÿuƒì h0#èuæƒÄƒì h30#èeæƒÄ‰öƒì jè2=ƒÄ=³vìƒì hM0#è?æEØPE¸PjÿµÿÿÿèÊtƒÄ ƒøÿuƒì hÀ1#èæƒÄƒì‹MäºÓMb‰È÷êÁú‰ÈÁø)ÂRÿuàhà1#èëåƒÄƒì jèº<ƒÄ=–˜vìƒì hf0#èÇåEèPE¸PjÿµÿÿÿèRtƒÄ ƒøÿuƒì h 2#èåƒÄƒì‹MôºÓMb‰È÷êÁú‰ÈÁø)ÂRÿuðh@2#èsåƒÄƒì jèB<ƒÄ=ÿ·vìƒì h0#èOåÇEèÇEìÇEð -ÇEôjEèPjÿµÿÿÿèÀsƒÄ ƒøÿuƒì h‘0#è åƒÄƒì jèÚ;ƒÄ=ŸÕvìƒì h®0#èç七Ä‹]üÉÉöU‰åSƒì‹E‹] ƒøt
-ƒøt -ëvÿ<\#ëÿ@\#ƒì jè€;ƒÄPÿ5@\#ÿ5<\#ÿs ÿs¸Ð/#ƒ{t¸Ö/#Pÿ3hÀ0#èqäƒÄ ‹]üÉÐU‰åƒìèé:ÉÍvU‰åSƒì‹]jè#;ƒÄ PSh 1#è8äƒÄ‹]üÉÃU‰åƒìj ÿujh'èMè‰è‡¬è¶²è1™ƒÄ jjjèÿLèîv¸èƒÄÉÃU‰åWVSƒìX‹]}¨¾D\#ü¹ó¥E¸‰E¨fÇE¸ÇE¼ÇEÀfÇEÄÇEÐÇEÔÇEÜÇEà‰]ÈÇEØÇEÌjè8L‰EÐÇEÜÇEàƒMÌ
-è֜E¨‰$ècƒÄ…Àyƒì h€2#è»ãƒÄƒì SèoE¸ƒÄeô[^_]ÍvU‰åƒìŠU€=T]#„¶€ú*t€úªt
-€ú6t€ú¶uÆT]#¸é›„Òy,ÆT]#€ú¸uÆ`]#ÆV]#ëՀúuÐÆ`]#ëljöÆT]#€ú8u€ -`]#ÆV]#멀úu € -`]#뛉ö€ú5uf¾õ‡#·Àé)v€ú…•f¾܇#·Àé -v€úàuÆT]#éTÿÿÿv€ú*t€ú6u2ÆU]#€ú*u€ -`]#é/ÿÿÿ‰ö€ú6…$ÿÿÿ€ -`]# éÿÿÿv€úªt€ú¶u"ÆU]#€úªt €ú¶…öþÿÿÆ`]#éêþÿÿ€úFu€=Y]#•Y]#ë.v€ú:u€=W]#•W]#ëv€úEu;€=X]#•X]#ƒì¶Y]#P¶W]#P¶X]#Pèõ¸ƒÄé€úu€ -`]#éhþÿÿv€ú8u€ -`]#éTþÿÿv€út€ú¸uÆ`]#é;þÿÿ‰ö¸„҈рúRt2€úOt-€úSt(€úPt#€úQt€úKt€úLt€úMt€úGt
-€úHt€úIu€=X]#uT€=U]#uK·Â -ÿë~€=W]#t/Bð< vBâ<vBÔ<w€=U]#t¶Âf¾€À‡#·ÀëG€=U]#t¶Âf¾€`ˆ#·Àë-v€=V]#t¶Âf¾€‰#·Àëv¶Âf¾€À‡#·ÀÉÃU‰åWVSƒì,}؃ìjE×PèòƒÄ…À„¡ƒì ¶E×Pèöüÿÿ‰ÂƒÄf…Ò„†÷Âÿt  `]#ƒÈ@ë‰ö `]#ˆE؈UيE׈EÚ±»;¸‡#}8¾@‡#v݊D2:EÚuŠ2:EØuƒì Wÿ’D‡#±ƒÄC;¸‡#|ЄÉuƒìjW¿‚‰#Pèý¡ƒÄè-é<ÿÿÿU‰å‹E£P]#Šˆ‡#ŠPˆÇ#ŠPˆć#ŠPˆŇ#ŠPˆƇ#ŠPˆLJ#ŠPˆȇ#ŠPˆɇ#ŠPˆʇ#ŠP ˆˇ#ŠP
-ˆbˆ#ŠP ˆcˆ#ŠP ˆdˆ#ŠP -ˆeˆ#ŠPˆfˆ#ŠPˆgˆ#ŠPˆhˆ#ŠPˆiˆ#ŠPˆjˆ#ŠPˆkˆ#ŠPˆ̇#ŠPˆlˆ#ŠPˆ͇#ŠPˆmˆ#ŠPˆڇ#ŠPˆzˆ#ŠPˆۇ#ŠPˆ{ˆ#ŠPˆç‡#ŠPˆ‡ˆ#ŠPˆè‡#ŠPˆˆˆ#ŠP ˆé‡#ŠP!ˆ‰ˆ#ŠP"ˆõ‡#ŠP#ˆ•ˆ#ŠP$ˆó‡#ŠP%ˆ“ˆ#ŠP&ˆô‡#ŠP'ˆ”ˆ#ŠP(ˆë‡#ŠP)ˆ‹ˆ#ŠP*ˆù‡#ŠP+ˆ™ˆ#ŠP,ˆ·#ŠP-ˆnˆ#ŠP.ˆχ#ŠÖˆoˆ#ŠP0ˆÁ‡#ŠP1ˆaˆ#ŠP2ˆ܇#ŠP3ˆ|ˆ#ŠP4ˆĈ#ŠP5ˆ¯ˆ#ŠP6ˆ°ˆ#ŠP7ˆ±ˆ#ŠP8ˆ«ˆ#ŠP9ˆ¬ˆ#ŠP:ˆ­ˆ#ŠP;ˆ§ˆ#ŠP<ˆ¨ˆ#ŠP=ˆ©ˆ#ŠP>ˆ²ˆ#ŠP?ˆ³ˆ#ŠP@ˆˆ#ŠPAˆ÷‡#ŠPBˆõ‡#ŠPCˆ
-ˆ#ŠPDˆ®ˆ#ŠPEˆ—ˆ#ŠPFˆªˆ#ŠPGˆއ#ŠPHˆ~ˆ#ŠPIˆð‡#ŠPJˆˆ#ŠPKˆî‡#ŠPLˆŽˆ#ŠPMˆà‡#ŠPNˆ€ˆ#ŠPOˆ҇#ŠPPˆrˆ#ŠPQˆá‡#ŠPRˆˆ#ŠPSˆâ‡#ŠPTˆ‚ˆ#ŠPUˆã‡#ŠPVˆƒˆ#ŠPWˆׇ#ŠPXˆwˆ#ŠPYˆä‡#ŠPZˆ„ˆ#ŠP[ˆå‡#ŠPRˆ…ˆ#ŠP]ˆæ‡#ŠP^ˆ†ˆ#ŠP_ˆò‡#ŠP`ˆ’ˆ#ŠPaˆñ‡#ŠPbˆ‘ˆ#ŠPcˆ؇#ŠPdˆxˆ#ŠPeˆه#ŠPfˆyˆ#ŠPgˆЇ#ŠPhˆpˆ#ŠPiˆӇ#ŠPjˆsˆ#ŠPkˆ߇#ŠPlˆˆ#ŠPmˆԇ#ŠPnˆtˆ#ŠPoˆև#ŠPpˆvˆ#ŠPqˆï‡#ŠPrˆˆ#ŠPsˆч#ŠPtˆqˆ#ŠPuˆí‡#ŠPvˆˆ#ŠPwˆՇ#ŠPxˆuˆ#ŠPyˆì‡#ŠPzˆŒˆ#ŠP{ˆ‰#ŠP|ˆ‰#ŠP}ˆ'‰#Š@~¢(‰#]ÍvU‰åWVSƒì\‹]}ؾh]#ü¹󥿸ƒ=\]#…Qº¾À‡#¹`ˆ#‰ö·ÂÆ0ÆBfúví…Ûu]؃{ÿuÇCP\#ƒì ÿsèûÿÿÇ$jjjh¹2#èϔf£‚‰#ƒÄ fƒøÿu ¸þÿÿÿéÞ‰öjjjh¹2#è0˜f£„‰#ƒÄfƒøÿuƒì ¿‚‰#P蕛¸ýÿÿÿ頍vǸ‡#ƒ{ÿuÇCŒ"ƒ{tIÆE™cÆEš.ÆE˜ƒìÿsƒì‹E˜f‰$ÆD$.èÅÆE˜ƒÄÿsƒì‹E˜f‰$ŠEšˆD$襃ă;ÿuQfÇE¨ÇE¬ÇE°fÇE´ÇE¸ÇEÐÇEÈÐÇEÄ ÇEÀ¨aÇE¼
-ÇE̍E¨ë‹ƒì jjPh” "hÂ2#èÿ‰ÃƒÄ ‰ˆ‰#ƒøÿu'ƒì ¿‚‰#P蓚¿„‰#‰$脚‰Ø钐ƒ=d]#uWƒì ÿ5ˆ‰#艉ǃąÿt4ƒì ¿‚‰#PèLš¿„‰#‰$è=šƒÄÿ5ˆ‰#èg5¸üÿÿÿë=Çd]#ëèƒì¶Y]#P¶W]#P¶X]#PèûÇ\]#‰øƒÄeô[^_]ÃU‰åƒì¶EPEèP¿„‰#Pè0œƒÄ„Àt÷Eè@u¶Eéë‰ö¸ÉÐU‰åƒì ¶E Pÿu¿„‰#Pèõ›·ÀƒÄÉÐU‰åSƒ=¸‡#0‹ -¸‡#Í»@‡#‹Ef‰ŠE
-ˆD‹E ‰‚D‡#A‰ -¸‡#‹$ÉÉöU‰åƒìèÉÍvU‰åƒìè±ÉÍvU‰åƒì¸ÿÿÿÿƒ=\]#t9蓃ì ÿ5ˆ‰#è-4¿‚‰#‰$è昿„‰#‰$èט¸ƒÄÉÐU‰åƒìjèoÔÇ$è+ÔÇ$¨2#èóÓè²-ƒÄÉÐU‰åWVSƒìŠEˆEó¿1¾d»`‰ö¹v‰òì©t"‰ÈA=þÿÿvì¸ÿÿÿÿ…Àu‰ÚŠEóî¸ë‰ö¸ë搸ÿÿÿÿÇEì¹d…Àt¸ÿÿÿÿët¸ë‰Êì©uî‹EìÿEì=þÿÿvé¸ÿÿÿÿ…Àu‰Úì¶Àë¸ÿÿÿÿƒøÿu
-¸þÿÿÿë3v=úu ¸ë"‰ö=þt ¸ýÿÿÿë‰ö‰øO…À9ÿÿÿ¸üÿÿÿƒÄ[^_]ÃU‰åVSƒìŠEˆE÷³Ô¾¹d‰ö‰Êì©t"‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë -¸ë搸ÿÿÿÿ…Àt¸ÿÿÿÿëL¸ë&»¹d‰ö‰Êì©tâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àuº`ŠE÷î¸ëv¸ÿÿÿÿ…Àt¸ÿÿÿÿëj¸ë&»¹d‰ö‰Êì©uâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àuºdì© tº`ì¶Ðëvºÿÿÿÿ‰Ð…Òx¸úú”ÀDþƒÄ[^]ÃU‰åWVSƒì »¾`‰ØK…À~^ƒì hÿè¼ýÿÿ‰ÂƒÄ…Òu{¿¹d‰Êì©u‰øG=þÿÿvì¸ÿÿÿÿ…Àu‰òì¶Ðëv¸ëꐺÿÿÿÿúªu›¸üÿÿÿúª…ƃì hõèMýÿÿ‰ÂƒÄ…Òt(¸ûÿÿÿ馉ö¸ýÿÿÿ隉ö¸ë.¸ëZ³`¾¹d‰Êì©tډðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî³e¾¹dv‰Êì©t®‰ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØîƒì hôèªüÿÿ‰ÂƒÄ¸…Ò•ÀHƒàƒèeô[^_]ÃU‰åWVSƒì ¾»d¹`‰Úì©t -‰Êì‰ðF=þÿvé³­¾¹d‰Êì©„‚‰ðF=þÿÿvè¸ÿÿÿÿ…ÀuºdˆØî¾»d¹`‰Úì©t -‰Êì‰ðF=þÿv鳪¾¹d‰Êì©t"‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ë搸놐¸ÿÿÿÿ…Àt¸÷ÿÿÿéݐ¸ë&»¹d‰ö‰Êì©uâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àu º`ì¶Àë¸ÿÿÿÿƒøUt¸ÿÿÿÿ錸ë&³«¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸öÿÿÿé9¸ë&»¹d‰ö‰Êì©uâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àu º`ì¶Àë¸ÿÿÿÿ…Àt¸þÿÿÿé鐸ë&³®¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…À…<èzüÿÿ…À…Žƒì hóèIúÿÿƒÄ…Àt
-¸ùÿÿÿépƒì jè.úÿÿƒÄ…Àt¸øÿÿÿéU¸ë.Æt]#³©¾¹d‰Êì©tډðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸ôÿÿÿéù¸ë&»¹d‰ö‰Êì©uâ‰ØC=þÿÿvì¸ÿÿÿÿ…Àu º`ì¶Àë¸ÿÿÿÿ…Àt¸óÿÿÿ驐¸ë&³¨¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸õÿÿÿéU¸ë&³Ó¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸ðÿÿÿ鐸ë&³Z¾¹d‰Êì©tâ‰ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØî¸ë¸ÿÿÿÿ…Àt¸ïÿÿÿ魐Æt]#ëBv¸ë^¹þÿ¾d»`‰òì¶ø÷Çt‰Úì¶À÷Ç tƒøZt»IƒùÿuÙ³§¾¹d‰Êì©tª‰ðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àté»þÿÿ‰ö¸ë:€=t]#„þÆt]#³¨¾¹d‰Êì©tΉðF=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt¸îÿÿÿ鱐¸ëvƒì hóèWøÿÿ‰ÃÇ$dèIøÿÿÃÇ$èè;øÿÿÃÇ$è-øÿÿÃÇ$çèøÿÿþ§ƒÄ¿¹dv‰Êì©t’‰øG=þÿÿvì¸ÿÿÿÿ…Àuºd‰ðî¸ë¸ÿÿÿÿ…Àt¸íÿÿÿë…ÛuÆt]#¸eô[^_]ÃU‰åVS¡ˆ]#…Àt¡ˆ]#H£ˆ]#¸é²¸ë6ƒ=€]#uKŠ„]#¾¹dv‰Êì©t҉ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØîÿ€]#뤍v¸ë:ƒ=€]#uGÇ€]#³ô¾¹d‰Êì©tΉðF=þÿÿvì¸ÿÿÿÿ…À…Xÿÿÿº`ˆØîéKÿÿÿ‰ö¸[^]ÍvU‰åWVSƒì ¡Œ]#@£Œ]#¾õ³Ô¿¹dv‰Êì©t"‰øG=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ë搸ë.¸ÿÿÿÿ…Àu0»¹d‰Êì©tډØC=þÿÿvì¸ÿÿÿÿ…Àuº`‰ðîœúX‰Çƒì hõè5õÿÿ‰ÃƒÄ…Ût¸ûÿÿÿéù‰ö¸ë1¾§ÇEð¹dv‰Êì©tڋEðÿEð=þÿÿvé¸ÿÿÿÿ…Àu ºd‰ðî¸ë¸ë=¸ëq¸ÿÿÿÿþ`ÇEð¹d‰Êì©t΋EðÿEð=þÿÿvé¸ÿÿÿÿ…Àuºd‰ðî¾eÇEð¹dv‰Êì©tš‹EðÿEð=þÿÿvé¸ÿÿÿÿ…Àuº`‰ðîƒì hôè;ôÿÿÃĉøPÆu]#‰Øeô[^_]ÐU‰åWVSƒì ¸ÿÿÿÿ€=t]#„ºœúX‰Æƒì hõèóóÿÿƒÄ…Àt(¸ûÿÿÿé—‰ö¸ë:¸ëf¸é“‰ö³`¿¹d‰Êì©tΉøG=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî³G¿¹dv‰Êì©t¢‰øG=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØ¿¹dv‰Êì©„rÿÿÿ‰øG=þÿÿvè¸ÿÿÿÿ…ÀuºdˆØî¸ë¸ÿÿÿÿ…Àt ¸îÿÿÿ鐃ì hôèÿòÿÿƒÄ…Àt¸Ûÿÿÿ飉ö¸ë:‰ðP¡Œ]#@£Œ]#¾ô³Ô¿¹d‰Êì©tΉøG=þÿÿvì¸ÿÿÿÿ…ÀuºdˆØî¸ë -¸ë.¸ÿÿÿÿ…Àu0»¹d‰Êì©tډØC=þÿÿvì¸ÿÿÿÿ…Àuº`‰ðîÆu]#¸eô[^_]ÍvU‰åƒìǤŠ#Ç Š#ƒ=|]#t!úè‹õÿÿ£x]#Ç|]#û…Àtúèôÿÿû¡x]#…Àuƒìÿuhx$"jèQ¸ƒÄÉÍvU‰åVS¡ˆ]#@£ˆ]#³õ¾¹d‰Êì©t"‰ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØî¸ë -¸ë搸ÿÿÿÿ[^]ÍvU‰åVS¡ˆ]#@£ˆ]#³ô¾¹d‰Êì©t"‰ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØî¸ë -¸ë搸ÿÿÿÿ[^]ÍvU‰åƒì‹MœúX‰Â¡ Š#@%ÿ£ Š#Š€ ‰#ˆ‰ÐP€9úu è(úÿÿë‰ö¸ÉÐU‰åƒìƒ=”]#t(Ç‹#Ç‹#Ç‹#Ç”]#‹E£]#ƒ=|]#t!úèôÿÿ£x]#Ç|]#û…Àtúèòÿÿû¡x]#…Àu.¸ìÿÿÿ€=t]#t ƒìjÿh´$"j èOÆu]#¸ƒÄÉÉöU‰åS‹MœúX‰Ã¡‹#@ƒà?£‹#ºÀŠ#ŠˆA¡‹#@ƒà?£‹#Šˆ¡‹#@ƒà?£‹#ŠˆA‰ØP¸‹$ÉÉöU‰åƒì€=u]#tèäùÿÿƒì j èŽOÆu]#¸ƒÄÉÐU‰åƒìƒ=|]#t!úè óÿÿ£x]#Ç|]#û…Àtúè™ñÿÿû¡x]#…Àt¸ë¶t]#ÉÍvU‰åVSŠEŠU€} t ƒ -„]#ë ‰öƒ%„]#„Àt ƒ -„]#ëƒ%„]#„Òtƒ -„]#ë¸ë6¸ëbƒ%„]#³õ¾¹d‰Êì©t҉ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØî³í¾¹dv‰Êì©t¦‰ðF=þÿÿvì¸ÿÿÿÿ…Àuº`ˆØîÿ€]#[^]ÐU‰åSƒìœúX‰Ã€=u]#tè–øÿÿè‘ðÿÿƒì hóèhîÿÿƒÄ…Àuƒì jèWîÿÿƒÄ…Àu‰ØP‹]üÉÍvU‰åº`ì¶ÈœúX‰Â¡ Š#;¤Š#t¡¤Š#ˆˆ ‰#@%ÿ£¤Š#‰ÐP]ÉöU‰åƒìº`ì¶Ðƒ=‹#u €úúu¡Œ]#H£Œ]#郍v÷ÂÀuxÿ‹#œúX‰Á¡‹#;‹#t¡‹#ˆÀŠ#@ƒà?£‹#ë"‰ö¡‹#+‹#ƒÀAƒà?£‹#Ç‹#‰ÈPƒ=‹#uÇ‹#ƒì ÿ5]#èƒÄÉÉöU‰åSƒì}™w‹UÑâU‰ÐÁà)Ðfƒ<ÅÈâ#uèùÝNj¸ÿÿÿÿ鏐ƒ= á#tcœúX‰Ã‹UÑâU‰ÐÁà)ЍÅ0ö€¡â# t ÿ€¤â#ë-v‹EÑàE‰ÂÁâ)‹Õ¤â#ƒì‹•â#ÿuRÿP@ƒÄ‰ØPéèƒ¡…ÀtgœúX‰Ã‹UÑâU‰ÐÁà)ЍÅ0ö€¡â# t ÿ€¤â#ë2v‹EÑàE‰ÂÁâ)‹Õ¤â#ƒì‹•â#ÿuRÿP@蔃ĉØPé­úèJ²‹Ìá#R‰ÑÁá)Ñ» â#f‰DË‹UÑâU‰ÐÁà)ЍÅ0öD t ÿ€¤â#ë?vƒìU‰ÐPjÿÐ]#‹MI‰ÐÁà)ЋŤâ#ƒÄ‹•â#QRÿP@è/ƒÄ¡Ìá#@‰ÂÁâ)ƒì ¿Õ¨â#P踱èƒÄû¸‹]üÉÐU‰åWVSƒì ‹]f…Ûuè>Ünj¸ÿÿÿÿé"‰öƒ= á#„“œúX‰ÇÇEð}ð™s¾ â#‹UðÑâUð‰ÐÁà)ÐÁàf9\,uHƒÀ0öD0 t ÿ€¤â#ë6ƒìEðPjÿÐ]#‹MðI‰ÐÁà)ЋŤâ#ƒÄ‹•â#QRÿP@ƒÄÿEð}ð™~“‰øPé}‰ö蓟…À„›œúX‰ÇÇEð}ð™w¾ â#‹Eð@‰ÂÁâ)Õf9\,uJƒÀ0öD0 t ÿ€¤â#ë8vƒìEðPjÿÐ]#‹MðI‰ÐÁà)ЋŤâ#ƒÄ‹•â#QRÿP@ƒÄÿEð}ð™~èj‰øPéԐúè"°‹Ìá#R‰ÑÁá)Ñf‰ͨâ#ÇEð}ð™w¾ â#‹Eð@‰ÂÁâ)Õf9\,uJƒÀ0öD0 t ÿ€¤â#ë8v‹MðI‰ÐÁà)ЋŤâ#ƒì‹•â#QRÿP@ƒÄEðPjÿÐ]#ƒÄÿEð}ð™~èÞ ¡Ìá#@‰ÂÁâ)ƒì ¿Õ¨â#Pèj¯èÁƒÄû¸eô[^_]ÃU‰åSƒìúè;¯‹Ìá#R‰ÑÁá)Ñf‰ͨâ#ƒìh„â#jèl–ƒÄUð¡ˆâ#;Øá#|¡„â#+Ôá#‰Eð¡ˆâ#+Øá#ë!‰ö¡„â#+Ôá#H‰Eð¡ˆâ#+Øá#ʚ;‰B‹Mð ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ôºÓMb‰Ø÷êÁú‰ØÁø)ÂыÌá#R‰ÐÁà)Ð) Åìâ#ƒì Qè. ƒÄƒ=Üá#ÿtƒì ÿ5Üá#ÿ¨á#ÇÜá#ÿÿÿÿƒÄ‹ -Ìá#I‰ÐÁà)ЋŤâ#ƒì‹…â#QPÿRLè{ ƒÄhÌá#jÿÐ]#ÇÌá#ÿÿÿÿÇàá#ÿÿÿÿèV ¡Ìá#@‰ÂÁâ)¿ըâ#‰$èã­è:ƒÄû‹]üÉÐU‰åƒìh8+"è( ƒÄÉÍvU‰åƒìjè ƒÄÉÉöU‰åƒìƒ=œ]#u(èè
-ƒì ¡Ìá#@‰ÂÁâ)¿ըâ#Pèt­ƒÄÉÍvU‰åWVSƒìhÊ2#è]$ƒÄ» â#ëv‹Eð@‰ÐÁà)ЁLÃ0€ƒì hDâ#èÊ+‰EðƒÄƒøÿ„“@‰ÐÁà)ÐöDÃ1@u¾‹UðR‰ÃÁã)ÃÁã¾ â#¡˜]#‰3@£˜]#‹E ‰Dƒìjÿuƒ´â#Pè ¾ÆD'ƒÃ fÇD3‹Mf‹%ÿf‰D3
-f‹A f‰D3 ƒÄ‰Ø‰ñº‹]ƒ{tf‹Sf‰T‹UðR‰ÁÁá)ÁÁáY0‹U‹B -‰ƒ â#¿¤â#Ç;¾¨â#¡Ìá#@‰ÂÁâ)‹DÖ0‰3º¬â#ǍAP‹]ð‰˜ â#Ç8ÇÿÿÿÿÇ0ÿÿÿÿǁã#°Ç8Ç0ǁÁÀǁ â#Ç9ºۍƒ€ 
-Ç…ã#Bƒúvì‹Eð@‰ÐÁà)ÐÁàÀǂ¨â#ÿÿÿÿǂ¬â#ôâ#‰pã#º‹Mðɍ€ ‰ö
-Ç…pã#Bƒú~ì»ëC;Ðá#sƒì‹â#ÿuSÿPƒÄ…Àxß;Ðá#u7‹]ð[‰ÂÁâ)ÂfÇÕÈâ#ƒìhDâ#SèÚ)è¡ÕDŽ鄉ö‹Eð@‰ÐÁà)Ѝ4ʼnž¤â#ƒì‹â#ÿuÿuðSÿP,ƒÄ…ÀyWfdžÈâ#ƒìhDâ#ÿuðèz)èAÕDžë'è3Õǃ釃ì ÿuðè9èÕdž¸ÿÿÿÿƒÄëjƒE‹U‹zü…ÿtY‰ö¾ëF;5Äá#s0ƒìµ‹ƒ`â#WVÿP ƒÄ…Àxۃ싃`â#WÿuðVÿP$ƒÄ;5Äá#t‡ƒE‹M‹yü…ÿu©‹Eðeô[^_]ÉöU‰åƒìEPÿuÿu ÿuè`üÿÿƒÄÉÍvU‰åWVSƒì ‹} ƒt6‹EÑàE‰ÂÁâ)‹G‰Õ¬â#‰Æ‹UÑâU‰ÐÁà)Ѓ ÅÐâ#@ën‰öƒì ‹UÑâU‰ÐÁà)зÅÎâ#Pè@‹UÑâU‰ÑÁá)Ñ»¬â#‰ˉƋEÑàE‰ÂÁâ)ƒÄƒ<Óuƒì ÿuèìèËÓLjëtv‹EÑàE‰ÂÁâ)» â#·DÓ.ƃì ·GPjÿwVh$2"è-‰ÁƒÄ f…Éu?ƒì‹UÑâU‰ÐÁà)зDÃ.PVèƒÄÿuèvèUÓlj¸ÿÿÿÿƒÄëN‹EÑàE‰ÂÁâ)Âf‰ Õ¨â#ƒìU‰ÐPjÿÐ]#ƒÄöGu ÿÀá#ëvöGuÿ€â#¸eô[^_]ÍvU‰åWVSƒì ‹M‹U ‹]œúX‰ÇEPSRQè­úÿÿ‰ÆƒÄƒþÿ„ɍv‰ÐÁà)ЋŤâ#‹…â#ƒx(„èà…À‰€»;Äá#svƒì‹`â#VSÿP(ƒÄC;Äá#råv‰ÃÁã)ÃÁ㋃¤â#ƒì‹…â#VPÿR0fǃÈâ#ƒÄhDâ#Vè\&ƒÄè ÒLJ‰øP¸ÿÿÿÿë#vƒìSVèŽýÿÿƒÄº…À”ÂJ ։øP‰ðeô[^_]ÃU‰åVS‹u»;Äá#svƒì‹`â#VSÿP(ƒÄC;Äá#råv‰ÃÁã)ÃÁ㋃¤â#ƒì‹…â#VPÿR0fǃÈâ#ƒÄhDâ#Vè¬%ƒÄeø[^]ÉöU‰åVS‹]è ƒì ¡Ìá#@‰ÂÁâ)¾ â#SÿTÖú‰$èn¡Ìá#@‰ÂÁâ)¿DÖ‰$èn¦ƒÄeø[^]ÃU‰åWVSƒì‹]‹}úû™w! [‰ÈÁà)ÈÁຠâ#öD0tfƒ|(u û¸ÿÿÿÿéDžÿy$[‰ÁÁá)Á Í°¸¤â#‹<Çë ‰öƒÿv¿[‰ÁÁá)Á Í°‰M乨â#‰Mì‹Uä‹
-‰Â)úƒÂ‰Ð¾º÷ö‰Eð‹uä;tMۍƒ€4‹MðىÈÁà)ȍ Å°‰ö2‹…ã#‹] ‰ƒÃ‰] B»‰Ðº÷ó‹]ì;uÔû‰øƒÄ[^_]ÐU‰åSƒì‹]‹ -Ìá#I‰ÐÁà)ЍÅö‚Ðâ#tɍ€È‚Xã#…ã#¡„â#;Ôá#|;Ôá#uA¡ˆâ#;Øá#}4ƒìSÿ5Ìá#ÿ5Øá#ÿ5Ôá#ÿ5ˆâ#ÿ5„â#hà2#è8¶ƒÄ è@ ‹]üÉÍvU‰åWVS‹ -Ìá#I‰ÐÁà)ЍÅöƒÐâ#„›ɍ€ȍ‹°¨â#º¤â#‹t‚`‹”À¸¬â#94s‰4‹Ìá#[‰ÁÁá)ÁÁፁÀ° â#¿¤â#B‰8±°‹†¨â#@º‰Ñº÷ñ‰–¨â#ۍƒ€ØÐÇD‡`ƒ<>wÿ>[^_]ÉöU‰åWVS‹M‹] ‹u‹}úù™w!I‰ÐÁà)ÐÁຠâ#öD0tfƒ|(uû¸ÿÿÿÿëy…ÛtI‰ÂÁâ)‹Õ`ã#‰…ötI‰ÂÁâ)‹Õ\ã#‰…ÿtI‰ÂÁâ)‹Õdã#‰ƒ}t(ɍ€ȍ I‰ÊÁâ)ÊÕXã#‹…ã#‹U‰û¸[^_]ÉöU‰å‹Múù™w!I‰ÐÁà)ÐÁຠâ#öD0tfƒ|(uû¸ÿÿÿÿë7I‰ÂÁâ)ÂÁ⍂Àǀ â#ǀ¤â#ǂ\ã#û¸]ÍvU‰åWVSƒì ƒ=Ìá#ÿt¡Ìá#@‰ÂÁâ)ÂöÕÐâ#…3ƒ=Ìá#ÿ„ƒìh„â#j證ƒÄU衈â#;Øá#|¡„â#+Ôá#‰E衈â#+Øá#ë"v¡„â#+Ôá#H‰E衈â#+Øá#ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ìºÓMb‰Ø÷êÁú‰ØÁø)ÂыÌá#R‰ÐÁà)Ð) Åìâ#ƒì QènüÿÿƒÄƒ=Üá#ÿtƒì ÿ5Üá#ÿ¨á#ÇÜá#ÿÿÿÿƒÄ‹ -Ìá#I‰ÐÁà)Ћ<Ťâ#ƒì‹½â#QWÿP<ƒÄ¿4½ƒì ‹†â#WÿP$‰ÃƒÄƒûÿt%ƒì[‰ÐÁà)ЋŤâ#‹…â#SPÿR4ƒÄ븅Àx»ƒûÿuG뫍v‹5Ìá#‰àá#‰Ìá#[‰ÐÁà)Ð;Åðâ#t0» â#‰ö¡Ìá#@‰ÂÁâ)‹TÓP‰Ìá# R‰ÈÁà)È;TÃPu×;5Ìá#tƒìhÌá#jÿÐ]#ƒÄ‹ -Ìá#I‰ÐÁà)ÐÁྠâ#fÇD(‹¸¤â#ƒì‹½â#‹àá#¸;Ìá#•ÀPQWÿS8¡Ìá#@‰ÂÁâ)ƒÄöDÖ1„Ü¡àá#;Ìá#…Ë¡„â#‰EèMè¡Ìá#@‰ÂÁâ)»¬â#‹DÓ@º@B‰Ö™÷þ’’’Áâ‰Ö5ˆâ#‰q¿¡/¸D‰ø÷î‰×Áÿ‰ð™‰þ)Ö¡Ìá#@‰ÂÁâ)‹\Ó@ºƒÞC‰Ø÷êÁú‰ØÁø)2Eè‹AºÊš;‰Ó™÷û‰QjhP@"ÿuìÿuèÿ¤á#‰ÃƒÄƒûÿuƒìÿ5Ìá#jèû7ƒÄ‰Üá#¡„â#£Ôá#¡ˆâ#£Øá#eô[^_]ÉöU‰åWVSƒìÇ0¢%úÿuèD»ƒÄ¿¤â#¾ â#‰ö[‰ÂÁâ)ÂÁâÇ:ÿÿÿÿǂ¬â#ÆDB fÇD0fÇD0
-fÇD0 fÇD0B0Ç0Ç8ǀ¨â#ǀ¬â#‚äâ#Ç@Çǂìâ#BP‰0Ç8ÇD`DŽÐ‚xå#Ç@Ǎ‚àÇ0ÿÿÿÿÇ8ÿÿÿÿ‚°Ç8ǀ¨â#ǀ¬â#ÂÀÇ2Ç:ºۍƒ€ v
-ÇD‡`Bƒúvï[‰ÐÁà)ЍÅÀǀ¨â#ÿÿÿÿǀ¬â#ºۍƒ€ 
-DŽ†ÐBƒú~ìCû™Žƒþÿÿ»¹¨â#[‰ÂÁâ)C‰DÑP‰Ãû˜~åÇ Ÿ%ÿÿÿÿ»™¹¬â#[‰ÂÁâ)Cÿ‰DÑP‰Ã…ÛéÇüâ#ÿÿÿÿÇDâ#ÇÈá#ÇÀá#Ç€â#Çàá#ÿÿÿÿÇÌá#ÿÿÿÿÇÜá#ÿÿÿÿÇØá#ÇÔá#ÇÐá#ÇÄá#Ç á#èÚè}è42ƒì ÿuèqÉÿÿ£Hâ#ƒÄ=×Övƒì h@3#èÇ$è »ƒÄ¸ƒ=Hâ#”À‰Eè]è¡Hâ#‰CÇ0¢%躂ƒì S豌Ç$ä@"èÇÇ$$+"聎Ç$<@"蕎ƒÄjjèEÿØ]#ƒÄh„â#jèLƒèOùÿÿèê›f£@â#¡Ìá#@‰ÂÁâ)¾ â#¿DÖ‰$èϛÇ$è7ŽÿÔ]#Ç0¢%ƒÄ»ƒ=Èá#ŸÃSjèɃă=€â#teè„ Çœ]#ƒìh„â#j軂è^›f£@â#è³øÿÿÇ$<@"èǍ¡Ìá#@‰ÂÁâ)¿DÖ‰$è7›Ç$蟍ƒÄÇ0¢%ƒìSjèCèÇ0¢%ƒÄjjè(ƒÄúƒ=Èá#t"ƒìÿ5Èá#hk3#èP¬Ç$ÿÿÿÿèX¹ƒÄƒì jèK¹ƒÄeô[^_]ÃU‰åSƒìƒ=œ]#…•èW‰…Àuú腚‹Ìá#R‰ÑÁá)Ñf‰ͨâ#‹E£Èá#Çœ]#ƒ=Ìá#ÿ„ƒìh„â#j藁ƒÄUð¡ˆâ#;Øá#|¡„â#+Ôá#‰Eð¡ˆâ#+Øá#ë ¡„â#+Ôá#H‰Eð¡ˆâ#+Øá#ʚ;‰B‹Mð ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ôºÓMb‰Ø÷êÁú‰ØÁø)ÂыÌá#R‰ÐÁà)Ð) Åìâ#ƒì QèZôÿÿƒÄƒ=Üá#ÿtƒì ÿ5Üá#ÿ¨á#ÇÜá#ÿÿÿÿƒÄ‹ -Ìá#I‰ÐÁà)ЋŤâ#ƒì‹…â#QPÿR<Çàá#ÿÿÿÿÇÌá#ÿÿÿÿƒÄèü‡…Àtƒì ¿@â#Pè,™ƒÄëvƒì ¿@â#Pè™èkƒÄû‹]üÉÉöU‰åSƒìÇEøÿÿÿÿ»ºâ#¡â#ƒx(t1ƒì‹šUøRSÿP(ƒÄ…Àu¸ÿÿÿÿëCƒûwºâ#‹šƒx(uи‹]üÉÉöU‰åƒìè è+ÉÉöU‰åƒìÇÜá#ÿÿÿÿè§êÿÿÉÐU‰åSƒìœúX‰Ãƒ=0¢%tƒ=€â#t‰ØPëƒì jè–ýÿÿƒÄ‰ØP‹]üÉÉöU‰åƒìÿuèzýÿÿƒÄÉÐU‰åSƒì‹UœúX‰ÃƒìRjèZ‰ÂƒÄ‰ØP‰Ð‹]üÉÉöU‰å¸Èá#ƒ=Ìá#ÿt‹Ìá#R‰ÐÁà)ЍÅã#]ÉöU‰åSƒìœúX‰Ãƒ=0¢%tƒ=€â#t‰ØPëƒì ÿuèíüÿÿƒÄ‰ØP‹]üÉÐU‰å]ÍvU‰åWVSƒì ÇEðÇE컍[ …ƒ¹(‹#t[¿ ‹#ƒ<9tP‹Ìá#ҍ‚€Ð؍…о â#ƒ<0t+ûƒì ÿ40ÿ9ƒÄú‹Ìá#ҍ‚€Ð؋´†Ð uìCƒû~Œƒ}ìt -ÿEðƒ}ðŽmÿÿÿeô[^_]ÐU‰åVSº¾ ‹#»$‹#¹(‹#vRÁàÇ0B‰Çƒú~ãÇ‘#ÿÿÿÿÇ ‘#Ç(‹#Ç ‹#Ç$‹#ÿÿÿÿ[^]ÐU‰åS‹Múƒ= ‘#ÿu û¸ ënv¡ ‘#@Ç•(‹#‰¡ ‘#@‹…$‹#£ ‘#‹@‹U ‰… ‹#º» â#‰öҍ‚€ÐDŽƒÐBú™~ßû¸‹$ÉÃU‰åú¡Ìá#À’ÂU‹•pã#û]ÍvU‰å‹Múƒùw -Iƒ<…(‹#u û¸ë%v¡Ìá#À’ÂʋE ‰•pã#û¸]ÃU‰åS‹]œúX‰Áƒûw -[ƒ<…(‹#u‰ÈP¸ë.v[Áà‹ ‘#‰$‹#ǀ(‹#‰ ‘#‰ÈP¸‹$ÉÃU‰åWVSƒì ¡Ìá#‰Eð‰ÂÑâ‰ÐÁà)ЍÅ¿ â#öD0 tm‹E‰‚lã#‹UðÑâUð‰ÐÁà)ЁLÇ0@‹UðÑâUð‰ÐÁà)ЍÅÀº¨â#ƒ<ÿt,‹4v‰ÃÁã)ÃÁ㋃¤â#ƒì‹…â#VPÿRD‰tPƒÄ¹» â#;MðtI‰ÐÁà)ЋUð9TÃP„ˆAù™~ۋUðÑâUð‰ÐÁà)Ѓ<Åôâ#t[»¤â#ûƒì ‹UðÑâUð‰ÐÁà)ЋDÃPÿpÿƒÄú‹EðÑàEð‰ÂÁâ)ÕP‹‹@‰‹UðÑâUð‰ÐÁà)Ѓ|ÃPu«èJüÿÿƒì ‹EðÑàEð‰ÂÁâ)» â#¿DÓPèÔyƒÄEðPjÿÐ]#‹Eð@‰ÂÁâ)ՃÄöD0@u%ƒì·D.P‹Eð@‰ÂÁâ)Âÿ4Õ¬â#èÁ ƒÄ»;Äá#sƒì‹`â#ÿuðSÿP(ƒÄC;Äá#rã‹MðI‰ÐÁà)ЋŤâ#ƒì‹…â#QPÿRPÇÌá#ÿÿÿÿÇàá#ÿÿÿÿ‹Eð@‰ÂÁâ)ƒÄöÕÐâ#u&ÿ -Àá#ƒ=Àá#uBèZúÿÿë;ƒìRjèY+ƒÄëg‹Eð@‰ÂÁâ)ÂöÕÐâ#uÿ -€â#ƒ=€â#uèúÿÿƒìh„â#jèÒyƒÄƒ=Üá#ÿtƒì ÿ5Üá#ÿ¨á#ÇÜá#ÿÿÿÿƒÄè­ïÿÿeô[^_]ÐU‰åVS‹uúv‰ÐÁà)ÐÁຠâ#öD0ufƒ|(uèѼNJû¸ÿÿÿÿ麍v‰ÐÁà)ÐöÅÑâ#tû雉ö;5Ìá#uJv‰ÐÁà)л â#‹DÃ0©t0©u)ƒì jè¥üÿÿ¡Ìá#@‰ÂÁâ)¿DÓ‰$襑ƒÄ»ëvC; ]#}ƒìÝÿ°D‘#Vÿ@‘#ƒÄ…Àtٍv‰ÐÁà)Ё ÅÐâ#û¸eø[^]ÍvU‰åWVSƒì ‹Ef‰Eòf…Àuèâ»ÇŒ¸ÿÿÿÿé‰öú¡àá#@‰ÂÁâ)Âf‹Mòf; ÕÌâ#”Eñ¾¿ â#‰öv‰ÐÁà)ÐÁà‹T0÷Â…ˆƒÀ fƒ|8t}÷Âuuf‹Mòf9L8 uj;5Ìá#u!÷Ât÷Âuƒì jè{ûÿÿƒÄëC‰ö»ëC; ]#}ƒìÝÿ°D‘#Vÿ@‘#ƒÄ…Àtٍv‰ÐÁà)ЁLÇ0Fþ™ŽNÿÿÿ€}ñt(ƒì ¡àá#@‰ÂÁâ)¿ըâ#P萃Äëvû¸eô[^_]ÉöU‰åWVSƒì ¾¿ â#v‰ÐÁà)ÐÁàfƒ|(tL÷D0
-uB»ë‰öC; ]#}ƒìÝÿ°D‘#Vÿ@‘#ƒÄ…Àtٍv‰ÐÁà)ЁLÇ0Fþ™~–eô[^_]ÉöU‰åSƒì¡Ìá#@‰ÂÁâ)» â#‹DÓ0©t7©u0©t)ƒì jè"úÿÿ¡Ìá#@‰ÂÁâ)¿DÓ‰$è"ƒÄ‹]üÉÉöU‰åS‹M‹] ¡ ]#ʼnŠ@‘#‰šD‘#@£ ]#‹$ÉÍvU‰åƒìúÿuè½ùÿÿ¡Ìá#@‰ÂÁâ)¿ըâ#‰$躎ƒÄÉÐU‰åVS¶uœúX‰Ãƒ=t”#ÿuèH¹Ç‚‰ØP¸ÿÿÿÿéۋ -t”#‰ÊÁâ‹‚ì‘#£t”#‹E‰‚à‘#‹E ‰‚ä‘#‰ðƒà‰‚è‘#‰ðƒàƒøtOƒø
-ƒøt -ësvƒøtSëi‰ÈÁàǀì‘#ÿÿÿÿƒ=`”#ÿu‰ -`”#ë¡d”#Áà‰ˆì‘#‰ -d”#ëH‰ö‰ÊÁâ¡h”#‰‚ì‘#‰ -h”#ë.‰ÊÁâ¡l”#‰‚ì‘#‰ -l”#ë‰ÊÁâ¡p”#‰‚ì‘#‰ -p”#‰ØP¸[^]ÐU‰åƒìƒ=Ðá#uƒì h 3#èŒÇ$謃ġÐá#P‰Ðá#ÉÐU‰åƒìƒ=Äá#uƒì h¿3#èPÇ$èÌ«ƒÄ¡Äá#P‰Äá#ÉÐU‰åWVS‹E‹u ‹}»‹HÇöt<€9t5‹ ‰‡€: t€:t‰öC€< t€< uó€< uÆ Cÿ€< uÌÿ[^_]ÐU‰åWVSì¬‹EµTþÿÿ½Xþÿÿ»‹HDžTþÿÿöt<€9t5‹ ‰‡€: t€:t‰öC€< t€< uó€< uÆ Cÿ€< uÌÿƒì…XþÿÿPÿµTþÿÿè=´ÿÿƒÄeô[^_]ÉöU‰å¸¹ì‘#v‰ÂÁâ@‰
-ƒø&~òÇ\”#ÿÿÿÿÇ`”#ÿÿÿÿÇd”#ÿÿÿÿÇh”#ÿÿÿÿÇl”#ÿÿÿÿÇp”#ÿÿÿÿÇt”#]ÉöU‰åWVSƒì ‹E‹} ƒøt4ƒø ƒøtéЃøt3ƒøtB鳐‹`”#Ç`”#ÿÿÿÿë:‰ö‹h”#Çh”#ÿÿÿÿë&‰ö‹l”#Çl”#ÿÿÿÿë‰ö‹p”#Çp”#ÿÿÿÿÇ á#ƒûÿtM¾ì‘#…ÿt‰ØÁàƒ¸è‘#uƒì ‰ØÁàÿ°ä‘#ÿà‘#ƒÄ‰Ù‰ØÁà‹0‰Â¡t”#‰2‰ -t”#ƒûÿu¸Ç á#eô[^_]ÉöU‰åƒìEüPEøPEôPEðPèI‡Ç$€”#èÉӃÄjjhÿÿjh„”#h€”#èôɃÄjjhÿÿÿhh ”#h€”#èÔɃÄjjhÿÿÿþhh¼”#h€”#è´ÉƒÄ ƒ}ütƒì‹EüHPÿuøh€”#è~ȃă}ôtƒìÿuôÿuðh€”#èbȃÄÉÐU‰åƒì‹E…Àu¸ëƒìjPh€”#è ʃÄÉÍvU‰åƒìÿuÿuÿu ÿuh€”#è¼ËƒÄ ÉÍvU‰åƒì ÿuÿuÿuÿuÿu ÿuh€”#è¶ËƒÄ ÉÐU‰åƒì ÿu ÿuh€”#èjЃÄÉÐU‰åƒìÿuh€”#èQ΃ÄÉÃU‰åƒìÿuh€”#èQ҃ÄÉÃU‰åƒì jÿuh€”#èWɃÄÉÉöU‰åƒì ÿu ÿuh€”#èЃÄÉÐU‰åƒìh€”#èÎÇ$€”#è$҃ÄÉÍvU‰åWVSƒì} ‹uEðPh4#VèÖ¥‰ÃƒÄƒûuƒ}ðvÇEðƒÆë ‰öÇEð‹Eðº;¤]#~hƒìWVhà”#蜃Äj
-VèK›ƒÄ»…À•ÃœúX‰Æƒìhà”#‹Eðÿ4…¨]#h4#è]™ƒÄ…Ûuƒì h¼4#èI™ƒÄ‰ðPº‰Ðeô[^_]ÍvU‰åVSƒìu ‹]EôPh4#S襃ăøuƒ}ôvÇEôƒÃëÇEô‹Eôº;¤]#~JƒìVShà”#èB›ƒÄj
-S臚ƒÄœúX‰Ãƒìhà”#‹Eôÿ4…¨]#h4#裘ƒÄ‰ØPº‰Ðeø[^]ÉöU‰åVSƒì@‹u‹] ‹EfÇEÈÇEÌÇEÐfÇEÔÇEàÇEäÇEìÇEð‰EØÇEÜÇEè…ÛtT‹C‰E̋C‰EЃ{u
-ÇEÜ1됃eÜߋC ‰EàÇEÀƒì ÿ5à˜#è)7ƒÄ+C ‰EċC‰Eì‹C‰EðëD‰öÇEÌÇEЃMÜ ÇEàÇEÀƒì ÿ5à˜#èâ6ƒÄ‰EÄÇEìÇEðèI±‹ƒì jEÀPEÈPÿuh!4#èAÞÿÿ‰ƒÄ ƒøÿt ƒì PèòÒÿÿƒÄ豉¸ƒ>ÿ”ÀHƒàêƒÀeø[^]ÍvU‰åƒìÿ5à˜#èc6ƒÄÉÉöU‰åƒìÿ5à˜#èc6ƒÄÉÉöU‰åƒìÿ5à˜#è{5ƒÄÉÉöU‰å‹E‹U ‹M£à˜#‰ä˜#‰ -è˜#]ÐU‰åVS‹]è°‹0ƒì Sètóÿÿ‰Ãèm°‰0ƒÄ¸…Û•À@eø[^]ÃU‰åƒìúÿuÿu ÿuÿ5à˜#èé5ƒÄûÉÍvU‰åWVSƒì ‹}‹uúÿ6ÿu Wÿ5à˜#è3‰ÃƒÄ…Ûu#ƒìÿ5à˜#èx5ƒÄ+PWÿ5è˜#èffƒÄû‰Øeô[^_]ÃU‰åSƒì ‹] Sÿuè¡eƒÄÿ5à˜#è75ƒÄ+‰¸‹]üÉÉöU‰åVSƒì‹u‹] …Ûtƒ;uÇEôƒìEôPë7ƒ;uÇEðƒìEðPë!vÇEèƒì jè_þÿÿ+CUè‰BƒÄRVèT*ƒÄeø[^]ÉöU‰åWVSƒì‹u ‹}ÇEðÿ5à˜#è“4‰ÃƒÄ9Þƒþ} ¸ëG‰öƒì ÿuèµ*ƒÄ W‰Ø)ðPÿuè eƒÄ…ÀtÇEð…ÿt‰Ø+‰ƒì ÿuèÙ*‹EðƒÄeô[^_]ÍvU‰åƒì‹Eúƒ8u -ÇûÿU ëû¸ÉÃU‰åWVSƒì¿ÿÿÿÿ‹E ‹‹E@‰ÐÁà)ÐÁà‹xå#‰U苀|å#‰Eìƒùÿtw ‰ÆȉÂÁâ)‹Eè‰Ã;Õxå#|[‰Eäv1‰ÐÁà)ЍÅ;šxå#u ‹Eì;‚|å#|1‰Ï‰ÐÁà)Ћ Åøâ#ƒùÿt4 1‰ÐÁà)Ћ]ä;Åxå#}«ƒÿÿt‰ÐÁà)ЋU‰Åøâ#ë‹E‹U ‰ƒùÿtI‰ÐÁà)ЋU‰Åüâ#‹E@‰ÐÁà)ЍÅP‰ˆ¨â#‰¸¬â#ƒÄ[^_]ÍvU‰åWVSƒì¿ÿÿÿÿ‹E ‹‹E@‰ÐÁà)л¤â#‰]ð‹´ÃЃùÿtCI‰ÐÁà)Ð;´ÃÐr0»¨â#‰Ï‰ÐÁà)ЋLÃPƒùÿtI‰ÐÁà)ЋUð;´ÂÐsՃÿÿt‰ÐÁà)ЋU‰Åøâ#ë
-‰ö‹E‹U ‰ƒùÿtI‰ÐÁà)ЋU‰Åüâ#‹E@‰ÐÁà)ЍÅP‰ˆ¨â#‰¸¬â#ƒÄ[^_]ÍvU‰åWVS‹}‰ÐÁà)ЍÅP‹¬â#‹°¨â#ƒúÿu ‹E ‰0ë#‰öR‰ÁÁá)Á»¨â#‰ÐÁà)ЋDÃP‰DËPƒþÿt!v‰ÁÁá)Á»¬â#‰ÐÁà)ЋDÃP‰DËP[^_]ÃU‰åS‹]‹ ‰Èƒùÿt/I‰ÐÁà)ЋÅøâ#‰ƒøÿt@‰ÐÁà)ÐÇÅüâ#ÿÿÿÿ‰È‹$ÉÃU‰åS‹]‹M ƒ9ÿt‹@‰ÂÁâ)‰Õüâ#[‰ÂÁâ)ÕP‹‰‚¨â#ǂ¬â#ÿÿÿÿ‰‹$ÉÃU‰åWVSƒì ‹M‹] ‹}ÇEðú¡Ìá#@‰ÂÁâ)4Õ â#…ÿt‹F8‰…ÛtBƒùt"ƒù ƒùt ë*‰öƒùtë!‹F8 ‰F8ë‰ö‹÷Ð!F8ëv‹‰F8ëÇEð‹F8‰Ã÷Ћ›#‰Ñ…ÂtB‰ö‰Ø÷л!Ètv‰Ú©u
-CÑøuòºƒì R范ċ^8‰Ø÷Ћ -›#…ÁuÀ‹F8‰Ã÷ЋV<‰Ñ…Ât=‰Ø÷л!Ètv‰Ú©u
-CÑøuòºƒì Rè|ƒÄ‹^8‰Ø÷ЋN<…ÁuÃû‹Eðeô[^_]ÍvU‰åVS‹u‹M ¸…É„¸ƒù‡òv‰ÐÁà)Ðfƒ<ÅÈâ#u -¸éӍvú‰ÈÁàö€™#uƒ¸™#uû魉öv‰ÐÁà)ЍÅÜâ#ƒùvèÍ©Çë
-¸Óà »ëC;Ì]#}ƒìÝÿ°Ä›#VÿÀ›#ƒÄ…Àtٍv‰ÐÁà)ЍÅfƒ»Èâ#u&ƒìh›#VèÔüÿÿ‹ƒ¤â#ƒÄ‹…â#VPÿRDƒÄèSm…Àuèû¸eø[^]ÐU‰åWVSƒì‹]‹U ƒûvè©Ç¸ÿÿÿÿévœúX‰Á‰Mðƒ}t‰ÞÁæÆ™#ü¹‹}ó¥…Òt‰ßÁçÇ™#ü¹‰Öó¥…Ò„ºöB…°ƒ:‡§ƒ< ›#ÿtq4‰uìº ›#‹@Áà‰Eè‰ÇƒÇ‹ -@¨%¸@¢%‹U苉E䋇D¢%©t -ƒàý‰‡D¢%ë‰ö¾ ›#‹Uì‹2@‰ Õ@¢%‰Áƒ}äÿu»‰ -@¨%ǝ ›#ÿÿÿÿƒûv -è¨Çë¸þÿÿÿˆÙÓÀ!›#‹uð‰ðP¸ƒÄ[^_]ÐU‰åWVSƒì,‹] ¸…Û„~¸ƒû‡pœúX‰Â‰UԉÞÁæ}؁ƙ#ü¹ó¥÷Eàuƒ}Øu ‰ÐPé5vƒûv膧Ǹÿÿÿÿ됸ˆÙÓà#›#…Àt -‹UԉÐPéûƒûvèN§Çë‰ö¸ˆÙÓà ›#‹5›#ƒþÿ„ô¸‰ÇˆÙÓçvv‰ÐÁà)ЍÅàâ#ƒûvèý¦Ç¸ÿÿÿÿë‰ú#‰Ð…À„–v‰ÐÁà)ÐÁàfƒ¸Èâ#uÜâ#ƒûv -輦Çë 8ƒìh›#Vèúÿÿv‰ÃÁã)ÃÁ㋃¤â#ƒÄ‹…â#VPÿRDÃྠâ#ƒÄƒ<3ÿtƒì ÿ43ÿ¨á#Ç3ÿÿÿÿƒÄ‹MԉÈPéîv‰ÐÁà)Ћ4Åøâ#ƒþÿ…ÿÿÿ¾¸‰ÇˆÙÓç‰öv‰ÐÁà)ÐÁàfƒ¸Èâ#„…Øâ#ƒûvèö¥Ç¸ÿÿÿÿ됉ú#‰Ð…Àu^v‰ÐÁà)ЍÅÜâ#ƒûvèÃ¥Çëv 8»ëvC;Ì]#}0ƒìÝÿ°Ä›#VÿÀ›#ƒÄ…ÀtÙëvFþ™ŽSÿÿÿèzi…Àuè9 -‹MԉÈP¸eô[^_]ÐU‰åWVSƒì,¸ƒ} „T¸ƒ} ‡EœúX‰Â‰Uԋu Áæ}؁ƙ#ü¹ó¥÷Eàuƒ}Øu ‰ÐPé ‰ö÷Eàu;ƒ} vèܤǸÿÿÿÿëv¸ŠM Óà#›#…Àt ‹UԉÐPéÃ=@¨%ÿu‹MԉÈP¸ 鮉ö‹5@¨%vÁà¹@¢%‹‰@¨%‹U ‰D¢%‹U‰H¢%‹U‰L¢%‹Ìá#‰P¢%Çÿÿÿÿ‹E Áຠ›#ƒ<ÿu‰4ë>‰ö‹M ‹ ›#‰ÁЃ<Å@¢%ÿt»@¢%
-‹Í 
-ƒ<ÃÿuîR‰4Å@¢%ƒ} vèé£Ç됸ŠM Óà ›#‹5›#ƒþÿ„û¸‰ÃŠM Ó㐍v‰ÐÁà)ЍÅàâ#ƒ} v蘣Ǹÿÿÿÿë v‰Ú#‰Ð…À„šv‰ÐÁà)ÐÁàfƒ¸Èâ#uÜâ#ƒ} vèS£Çëv ƒìh›#Vè¨öÿÿv‰ÃÁã)ÃÁ㋃¤â#ƒÄ‹…â#VPÿRDÃྠâ#ƒÄƒ<3ÿtƒì ÿ43ÿ¨á#Ç3ÿÿÿÿƒÄ‹MԉÈPé÷v‰ÐÁà)Ћ4Åøâ#ƒþÿ…ÿÿÿ¾¸‰ÃŠM Ó㐍v‰ÐÁà)ÐÁàfƒ¸Èâ#„…Øâ#ƒ} v艢Ǹÿÿÿÿë‰Ú#‰Ð…Àu^v‰ÐÁà)ЍÅÜâ#ƒ} vèV¢Çë‰ö »ëvC;Ì]#}0ƒìÝÿ°Ä›#VÿÀ›#ƒÄ…ÀtÙëvFþ™ŽSÿÿÿèf…Àuƒ=È]#uèÄ ‹MԉÈP¸eô[^_]ÃU‰åWVSƒì‹u‹]¡Ìá#@‰ÂÁâ)<Õ â#èŠú¡›##„Hºv©u=BÑøuô¾ƒ<µ ›#ÿue‹E ‰0Ç@Ç@W<ƒþvèa¡Ç됉Öëɸþÿÿÿ‰ñÓÀ!ƒþvè?¡Çëv¸þÿÿÿ‰ñÓÀ!›#ûév µº ›#‹[‹Å@¢%‰ƒøÿu"ƒþvèñ Ç됸þÿÿÿ‰ñÓÀ!›#W<ƒþv -èÌ Çë ¸þÿÿÿ‰ñÓÀ![Áâ¹D¢%‹
-‹u ‰‹‚H¢%‰F‹‚L¢%‰FƒÂ‹
-©t ƒàý‰
-ëv[¡@¨%‰Õ@¢%‰@¨%ûéI‰Öë‹G<#tUº©uéBÑøuô¾‹E ‰0Ç@Ç@W<ƒþvè Çëv¸þÿÿÿ‰ñÓÀ!ûéëv…Ûtƒ;uƒ{u -û¸ éÓ‰ö‹‰G@úèu‹Ìá#R‰ÑÁá)Ñf‰ͨâ#ƒìh„â#jèN\ƒÄU衈â#;Øá#|¡„â#+Ôá#‰E衈â#+Øá#ë¡„â#+Ôá#H‰E衈â#+Øá#ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰ÁáºÓMb‹Eì÷êÁú‹EìÁø)ÂыÌá#R‰ÐÁà)Ð) Åìâ#ƒì QèÏÿÿƒÄƒ=Üá#ÿtƒì ÿ5Üá#ÿ¨á#ÇÜá#ÿÿÿÿƒÄ‹ -Ìá#I‰ÐÁà)ЋŤâ#ƒì‹…â#QPÿRHƒÄh›#ÿ5Ìá#èæòÿÿ¡Ìá#@‰ÂÁâ)ÂfÇÕÈâ#ƒÄ…Û„’ƒìEàPjè[U؃Ä‹Eà‰E؋EäC‰B…Ày -ÿM؁Bʚ;됁zÿɚ;~ ÿjʚ;ÿ5Ìá#hÐr"ÿuÜÿuØÿ¤á#‰ÃƒÄƒûÿuƒìÿ5Ìá#jèù ƒÄ¡Ìá#@‰ÂÁâ)‰Հå#ÇÌá#ÿÿÿÿÇàá#ÿÿÿÿè‡Ðÿÿƒì ¡Ìá#@‰ÂÁâ)» â#¿DÓPèsè”ÇG@¡Ìá#@‰ÂÁâ)ƒÄöDÓ2tû¸ é~‰Öë%¡›##„ûº‰ö©uáBÑøuô¾ƒ<µ ›#ÿu=‹M ‰1ÇAÇAƒþv -è@Çë¸þÿÿÿ‰ñÓÀ!›#ûé vƒì µƒ ›#Pèúðÿÿ‰ÇƒÄƒ» ›#ÿu#ƒþvèòœÇë‰ö¸þÿÿÿ‰ñÓÀ!›#Áâ¹D¢%‹
-‹] ‰‹‚H¢%‰C‹‚L¢%‰CƒÂ‹
-©t ƒàý‰
-ëv¡@¨%‰Õ@¢%‰=@¨%ûël‹G<#…Àuû¸ë`v‰Öë‹G<º#t ©uéBÑøuô¾‹E ‰0Ç@Ç@W<ƒþvè/œÇëv¸þÿÿÿ‰ñÓÀ!û¸eô[^_]ÍvU‰åWVSƒì ‹}¡Ìá#@‰ÂÁâ)4Õ â#è¹ú‹F<#…Àt è¦û颋‰F@úèq‹Ìá#R‰ÑÁá)Ñf‰ͨâ#ƒìh„â#jè6XƒÄU衈â#;Øá#|¡„â#+Ôá#‰E衈â#+Øá#ë¡„â#+Ôá#H‰E衈â#+Øá#ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ìºÓMb‰Ø÷êÁú‰ØÁø)ÂыÌá#R‰ÐÁà)Ð) Åìâ#ƒì QèúÊÿÿƒÄƒ=Üá#ÿtƒì ÿ5Üá#ÿ¨á#ÇÜá#ÿÿÿÿƒÄ‹ -Ìá#I‰ÐÁà)ЋŤâ#ƒì‹…â#QPÿRHƒÄh›#ÿ5Ìá#èÍîÿÿ¡Ìá#@‰ÂÁâ)» â#fÇDÓ(ÇÌá#ÿÿÿÿÇàá#ÿÿÿÿè Íÿÿ¡Ìá#@‰ÂÁâ)¿DÓ‰$è™oè‹F<#ƒÄ…Àuû¸ë èÿû¸eô[^_]ÐU‰åSƒì‹]úEðPjè¢VƒÄƒ=¨›#ÿu
-ÇEèëWMèU𡤛#;B|¡ ›#+Eð‰E衤›#+Bëv¡ ›#+EðH‰E衤›#+Eôʚ;‰Aƒì ÿ5¨›#ÿ¨á#ƒÄ…ÛtN]ð‹E𣠛#‹Eô£¤›#jh0s"ÿuôÿuðÿ¤á#‰ÃƒÄƒûÿuƒìÿ5Ìá#jè:ƒÄ‰¨›#ë -vǨ›#ÿÿÿÿû‹Eè‹]üÉÐU‰åVSƒì‹uƒ<µ ›#ÿuC‰uèÇEìÇEð¡Ìá#‰Eôƒþvèü˜Ç鮐¸þÿÿÿ‰ñÓÀ!›#降 µº ›#‹[‹Å@¢%‰ƒøÿu"ƒþv豘Ç됸þÿÿÿ‰ñÓÀ!›#[Áà¹D¢%‹‰U苐H¢%‰U싐L¢%‰Uð‹P¢%‰UôP‹
-©tƒàý‰
-ë[¡@¨%‰Õ@¢%‰@¨%ƒìEèPVè
-ƒÄeø[^]ÃU‰åVSƒì¡Ìá#@‰ÂÁâ)4Õ â#‹F0©…Í -‰F0‹F8‰Ã÷Ћ›#‰Ñ…ÂtA‰Ø÷л!Ètv‰Ú©u
-CÑøuòºƒì Rè„þÿÿƒÄ‹^8‰Ø÷Ћ -›#…ÁuÀ‹F8‰Ã÷ЋV<‰Ñ…ÂtZ‰Ø÷л!Ètv‰Ú©u
-CÑøuòº‰UèÇEìÇEð¡Ìá#‰EôƒìEèPRèƒÄ‹^8‰Ø÷ЋN<…Áu¦f0ÿïÿÿeø[^]ÃU‰åWVSƒì,‹]œúX‰Â‰UÌ¡Ìá#@‰ÂÁâ)Õ â#‰UЉÞÁæ}؁ƙ#ü¹ó¥÷Eàuƒ}Ø„îƒ}Øÿ„ä÷EàuCƒ}Øu=ƒìSh,4#èw}ƒÄ÷Eàtƒì‹M ÿqhB4#èX}ƒÄƒì jè—ÓÿÿƒÄ‹UЋB8‰EԉƍUԃûv -èh–Çë ¸ˆÙÓà ‹EÔ E܉EԋUЃÂ<ƒûv -è<–Çë ¸þÿÿÿˆÙÓÀ!‹EԋUЉB8û÷Eàtƒìjÿu SÿUäëƒìj‹M ÿqSÿU؃Äú‹EЉp8‹ỦÐPeô[^_]ÃU‰åWVSƒì ‹}‰ÐÁà)ÐÁྠâ#fƒ|(uF˜àƒ<3ÿtƒì ÿ43ÿ¨á#Ç3ÿÿÿÿƒÄƒìh›#Wèúèÿÿ‰ÂÁâ)‹Õ¤â#ƒÄë ‰ÐÁà)ÐÁàfƒ¸Èâ#u!‹¤â#ƒì‹•â#WRÿPD¸ƒÄë‰ö¸eô[^_]ÍvU‰åWVSƒì º¿™#¾™#» ™#¹ ›#‰ö‰ÐÁàǀ™#Ç8Ç0ÇÇ‘ÿÿÿÿBƒúvϺ»@¢%¹D¢%RÁàB‰ÇDƒú>~éÇ(¨%ÿÿÿÿÇ<¨%Ç@¨%Ç›#Ç›#ÿÿÿÿǨ›#ÿÿÿÿº¹`œ#»dœ#‰öRÁàÇÇÿÿÿÿÆDBƒú~áƒìjh°m"ènÚÿÿƒÄeô[^_]ÍvU‰å‹EǸ]ÐU‰å‹EÇÿÿÿÿ¸]ÐU‰åƒì‹U‹M ƒùvèê“Ǹÿÿÿÿ됸Óà ¸ÉÃU‰åƒì‹U‹M ƒùv趓Ǹÿÿÿÿ됸þÿÿÿÓÀ!¸ÉÃU‰åƒì‹M ƒùv腓Ǹÿÿÿÿë ¸Óà‹U#ÉÉöU‰åƒì ÿuÿu ÿuèÔçÿÿƒÄÉÍvU‰åWƒì$‹UEè‰E丹‹}äüó«ƒìjÿuäRèBñÿÿƒÄ…Àu -‹Uè‹E ‰¸‹}üÉÐU‰åƒì jÿu ÿuèñÿÿƒÄÉÃU‰åƒì‹E…Àu¸ëƒìPÿu ÿuèíðÿÿƒÄÉÃU‰åƒìÿuÿ5Ìá#è`èÿÿƒÄÉÍvU‰åVSƒì ‹]‹E ‰EèÇEìÇEð脒‹0ƒìEØPEèPSèAéÿÿƒÄ»ÿÿÿÿ…Àu ÷Eàu‹]ØèT’‰0‰Øeø[^]ÐU‰å‹M¡Ìá#@‰ÂÁâ)¡›# ÕÜâ#‰¸]ÉöU‰åSƒì‹E‹U ú‹Ìá#‰Ìá#ÇÈ]#jPj jèœìÿÿƒÄÇÈ]#‰Ìá#û‹]üÉÍvU‰åS‹M‹] ¡Ì]#ʼnŠÀ›#‰šÄ›#@£Ì]#‹$ÉÍvU‰åVS‹]Cÿƒøv苑Ç~¸ÿÿÿÿëp‰öœúX‰Æ[€<…hœ#u‰ðPèa‘ǸÿÿÿÿëF[Áâ¹`œ#‹E ‰
-‹E‰‚dœ#ÆD
-ƒìjhps"Sè¹T·Ã‰$èÒeƒÄ‰ðP¸eø[^]ÍvU‰åƒì¸ÉÍvU‰åƒì ‹E‰EèÇEìÇEð‹Ìá#‰UôUèRPè›ùÿÿƒÄÉÉöU‰åVS‹uv‰ÃÁã)ÃÁ㸠â#DŽàÿÿÿÿL0ƒìh›#Vèõãÿÿ‹ƒ¤â#ƒÄ‹…â#VPÿRDèç·ÿÿƒÄeø[^]ÐU‰åƒìǨ›#ÿÿÿÿjjèWèÿÿè¾·ÿÿƒÄÉÐU‰åƒìEüÇEüÿÿÿÿPèôÿÿƒÄÉÐU‰åƒì‹E‹‰EüEüPjÿÐ]#‹UüRÁà¹`œ#ƒÄƒ<t ûƒì RÿƒÄú‹Eü@ƒì ÿ4…dœ#覱ÿÿƒÄÉÐU‰åWVSƒì ‹u ‹]ƒ}t讏Ǹÿÿÿÿén‰öúƒ= ¤#ÿt ƒ=@¨%ÿuûèƒÇ ¸ÿÿÿÿéCv¡ ¤#‰‹ ¤#Õ)п$#‹DÇ0£ ¤#‹Õ)й #ÇDÁ0…öu8‹Õ)ÐÇÁ‹Õ)ÐÇÇ‹Õ)ЉÅ(#닍<Å)Ǎ<ý #ü¹ó¥‹Õ)ЍŃº #u#¡@¨%‰‚H#@ÁàƒˆT¢%‹€@¢%£@¨%‹Õ)ÐÇÅ4#ÿÿÿÿ‹Õ)ЍÅ8#Ç@NjÕ)ЍÅ@#Ç@NjÕ)ÐÇÅL#û¸ƒÄ [^_]ÃU‰åSƒì‹]ƒûwúÝ)؃<ÅP#uûèÿÇ¸ÿÿÿÿ閍vÝ)ØÁàǀP#ƒÀº$#ƒ<ÿtƒì ÿ4ÿ¨á#ƒÄÝ)ØÁàƒ¸ #uE‹H#R ÅöT¢%u¡@¨%‰@¢%‰@¨%Ý)؋ÅH#@ƒ$ÅT¢%üû¸‹]üÉÃU‰åWVSƒìL‹E‰E´Áà+E´Áàƒ¸ #…‹P ‹‚(#@öÅT¢%t¸,#ƒ< „ôÿéì‰ö‹M´Áá+M´Ááy LJ,#¾(#‹7@‹@¨%‰Ý@¢%£@¨%jÿ41ÿ±$#jèhçÿÿ‹7@ƒ ÅT¢%錐‹E´Áà+E´Á๠#ƒ<uwPƒ<
-tÿ°(#ÿ°,#ÿ4
-ëQvÇEÈÇEÌÇEÐÇEÔÇEØÇEÜÇEà‹E´Áà+E´Áà(#Rÿ°,#EÈPEÄPèÙÙÿÿƒÄ‹E´Áà+E´Åƒ¸(#u -ƒ¸,#„Àº@#‹E´Áà+E´ŋ‰E¸M¸‹D‰A‹E¸ƒ8#‰ƒ@#‹Aƒ<#‰B…Àyÿ‹@#Bʚ;ë‰özÿɚ;~ ÿjʚ;‹E´Áà+E´ÿu´h<v"ÿ4ÅD#ÿ4Å@#ÿ¤á#‰ÃƒÄƒûÿuƒìÿ5Ìá#jè+ùÿÿƒÄ‹E´Áà+E´‰Å4#ë‰ö‹E´Áà+E´ÇÅ4#ÿÿÿÿeô[^_]ÃU‰åWVSƒì‹u‹}ÇEäƒþw3ƒ}t-‹Exÿɚ;w!‹]{ ÿɚ;wúõ)ðƒ<ÅP#uûèÁŠÇ¸ÿÿÿÿ鐅ÿ„·õ)ðƒ<Å4#ÿuÇG ÇGëwƒìEèPjèGÇEäƒÄ¹@#õ)ðō]è‹D;C|‹+Eè‰G‹D+Cë(¹@#õ)òÁâ‹+EèH‰G‹D+Eìʚ;‰G ¹8#õ)ðÁà‹‰‹D‰Gõ)ðÅº$#ƒ<ÿtƒì ÿ4ÿ¨á#ƒÄ‹Eƒxu
-ƒx „þº8#õ)ð ŋ]‹‰
-‹C‰D
-÷E t¸@#‹S‰‹S ‰Tëmvƒ}äuƒìEèPjèøEƒÄõ)ð ō‘@#‹Eè‹]C‰@#‹EìC ‰B…Àyÿ‰@#Bʚ;ëzÿɚ;~ ÿjʚ;õ)ðVh<v"ÿ4ÅD#ÿ4Å@#ÿ¤á#‰ÃƒÄƒûÿuƒìÿ5Ìá#jè­öÿÿƒÄõ)ð‰Å4#û¸eô[^_]ÃU‰åWVSƒì ‹]‹} ƒûwúÝ)؃<ÅP#uûèzˆÇ¸ÿÿÿÿ鷉öÝ)؃<Å4#ÿuÇG ÇGëoƒìEèPjèÒDƒÄ¹@#Ý)؍ōuè‹D;F|‹+Eè‰G‹D+Fë'¹@#Ý)ÚÁâ‹+EèH‰G‹D+Eìʚ;‰G ¹8#Ý)ØÁà‹‰‹D‰Gû¸eô[^_]ÍvU‰åƒìƒ}t藇Çëv臇ǸÿÿÿÿÉÉöU‰åƒìƒ}tèg‡Ç¸ÿÿÿÿë‰öƒì ÿu èuÄÿÿ¸ƒÄÉÍvU‰åƒì‹E ƒ}tè,‡Ç¸ÿÿÿÿëv…Àt -ÇÇ@è¸ÉÃU‰åƒì‹UƒúwúÕ)Ѓ<ÅP#uûè܆ǸÿÿÿÿëvÕ)ЋÅL#ûÉÐU‰åWVS¹»$#¿ #¾,#‰öÍ)ÈÁàÇDÿÿÿÿ8#ÇBǍP0Ç:ÇD A‰‰Áƒù~ºÇ¤#ÿÿÿÿÇ ¤#[^_]ÐU‰å]ÍvU‰å¸]ÉöU‰åVSœúX‰Ã¡Ìá#@‰ÂÁâ)¾ â#‹DÖ0©t0©t)ƒì jè"Æÿÿ¡Ìá#@‰ÂÁâ)¿DÖ‰$è"[ƒÄ‰ØPeø[^]ÃU‰åS‹]úût ¸ÿÿÿÿ…ÛuL¡Ìá#@‰ÂÁâ)¹ â#‹DÑ0Áèƒà‹U ‰¡Ìá#@‰ÂÁâ)Õ0‹
-%ÿþÿÿ ؉
-û¸‹$ÉÉöU‰åS‹]úût ¸ÿÿÿÿ…ÛuL¡Ìá#@‰ÂÁâ)¹ â#‹DÑ0Áè ƒà‹U ‰¡Ìá#@‰ÂÁâ)Õ0‹
-%ÿýÿÿ ؉
-û¸‹$ÉÉöU‰åWVSƒì ‹} ÇEðú‹EÇÿÿÿÿÇ@¾;5Äá#s9v‹µ`â#ƒ{u ƒìWVÿS,ƒÄ…ÀxƒìWÿuVÿS0‰EðƒÄF;5Äá#rÊû‹Eðeô[^_]ÉöU‰åƒì‹U¸ƒ:ÿt ¸ƒzu‹‹…`â#ƒìRÿ2ÿP4ƒÄÉÍvU‰åƒì‹U¸ƒ:ÿt‹‹…`â#ƒìRÿ2ÿP8ƒÄÉÉöU‰åƒì‹U¸ƒ:ÿt‹‹…`â#ƒìRÿ2ÿP<ƒÄÉÉöU‰åƒì‹U¸ƒ:ÿt‹‹…`â#ƒìRÿ2ÿP@ƒÄÉÉöU‰åVS‹u‹µâ#ƒìÿ°ôhy4#è^j»ƒÄ‰ö[‰ÐÁà)ÐÁà9°¤â#……ƒÀ º â#f|€ttfƒ|tlƒì f‹Dfƒøwƒì ·ÀPè ¨ƒÄë%v·Ð¸S4#ú€t¸_4#út¸k4#P[‰ÐÁà)ÐÁàÿ°tå#´â#PShà4#è¹iƒÄ Cû™ŽUÿÿÿeø[^]ÉöU‰åWVSƒì ‹E‹…â#‰Eð‹¸üƒì ‹Uð‹‚ðøPèo§‰ÆƒÄƒþÿu -¸ÿÿÿÿ…ÿtrOëՐv‰ÐÁà)Ѝ ÅöÑâ#tRQ@»¬â#ƒ<D‹„å#‰ƒìý‰Ø‹Uð‚ðPVè\¥ƒÄ‹Eð˜ðSV腦ƒÄéiÿÿÿ‰ðeô[^_]ÉöU‰åWVSƒì‹E‹…â#‰Eð‹Mƒy(…©‹=Ìá#‰ÐÁà)Ѝž¤â#‹U93…‹M I‰ÂÁâ)ÂÁ⋄Љ„й¬â#‹D@‰D@‹„à‰„àƒÂ0¹ â#‹
-%ÿ÷ÿÿ‹\0ã ؉
-‹UðƒÂ¸ƒ¼º€ÿ•ÀH‹] ‰„š€é¢v‹U R‰ÂÁâ)ÂÁ⻤â#‹A‰„Ѓyt‹A‰‚ìâ#‹A‰„àë-‰ö‹] [‰ÐÁà)ÐÁà‹]ð‹“ô‰ìâ#‹“ô‰„å#ƒy$u‹E @‰ÐÁà)Ё ÅÐâ#¸ƒy ”ÀH‹U ‹Mð‰„‘ˆ¸ƒÄ[^_]ÃU‰åWVSƒì ‹U‹<•â#ƒ¿t8LJƒì‹E @‰ÐÁà)ЋÅtå#‹—ðÂPÿu 詤酋E @‰ÐÁà)ЍÅöƒÑâ#t?K@¾¬â#ƒ<11º¤â#‹1„à‰1ƒì‹„Ћ—ðÂPÿu èK¤ë*ƒì‹E @‰ÐÁà)ЋÅtå#‹—ðÂPÿu è³£ƒÄ‹E @‰ÐÁà)ÐfÇÅÈâ#€eô[^_]ÐU‰åWVSƒìH‹]ÇE¼ÇEÀfÇEÄÇEÈÇEÌÇEÐÇEÔÇEØÇEÜÇEà¶Ã -f‰E¸‹â#‹€ø‰EÈÇE̍E¸jjPhô"h…4#è-¬ÿÿ‰ÆƒÄ ƒþÿuƒì h 5#èVËÿÿƒÄ‹<â#v‰ÐÁà)Ðfƒ<ÅÈâ#tµ€Gƒ<ÿtJÿëE‰öƒìv‰ÃÁã)ÃÁ㍃äâ#PjèJ;fǃÈâ#€ƒÄ‹ƒtå#‹—ðÂPVè䢃čeô[^_]ÐU‰åWVSƒì‹}hŠ4#è¾ÊÿÿèÆÿÿ‰EðƒÄ hPh 4#è£ÊÿÿÇ$èwÉÿÿ‰ÃƒÄSh¾4#è‡Êÿÿ‹Eð‰…â#ƒÄ jhÊ4#Sè=efÇCÆCÇCä‰"ÇCŠ"ÇC Ø"ÇC$¸€"ÇC(Š"ÇC,x"ÇC0(Š"ÇC40Š"ÇC8<Š"ÇC<ð‚"ÇC@|Š"ÇCD‹"ÇCHP‹"ÇCLX‹"ÇCPð‹"ÇCT8Œ"ÇCXlŒ"ÇC\P"ÇC`p"ÇCdˆ"ÇCh "ÇCl¸"ÇCpЍ"ÇCtè"ÇCxŽ"ÇC|Ž"ǃ€0Ž"ǃ„HŽ"¸ƒÄS‰öDŽ‚€ÿÿÿÿ@=™~í‹EH‰ƒüƒì ‹EÁàPè@Èÿÿ‰ƒð¾ƒÄ;u}ƒì ‹ƒððPèꟃÄF;u|åÿçw¿èÿ ¡v¿ ¡‰»ô‹E‰ƒøƒ} tƒìjÿuðhìƒ"è8ÃÿÿƒÄeô[^_]ÐU‰åWVSƒì ‹M‹u ‹]‹â#‰Eð…Éx[; -Ðá#sS‹â#‹@%ÿÿÿ=u=þ™wv‰ÐÁà)Ðfƒ<ÅÈâ#u -¸éèvv‰ÐÁà)Ð9 Ťâ#t -¸&éȍv…Ûuv‰ÐÁà)Ё ÅÐâ#ë)ƒûuv‰ÐÁà)Ё$ÅÐâ#ÿ÷ÿÿë ¸郉öv‰ÐÁà)ÐÁà˜Ð¿¤â#‹U9;t\f¸Èâ#€u=ƒì‹;‹Mð‹‘ðÂPV蜞‹E‰;ƒÄ‹Uð‹‚ð‹MÈPV蹟ƒÄëv‰ÐÁà)ЋU‰Åtå#¸eô[^_]ÍvU‰åVS‹M‹4â#…Éx; -Ðá#s‹â#‹@%ÿÿÿ=t¸ÿÿÿÿëw¡Ìá#@‰ÂÁâ)¸ÿÿÿÿ9 Õ¤â#uZúè!P‹Ìá#R‰ÑÁá)Ñ» â#f‰DËdžèX­ÿÿ¡Ìá#@‰ÂÁâ)ƒì ¿DÓPèçOè>·ÿÿƒÄû¸eø[^]ÉöU‰å‹E‹…â#‹€ü]ÍvU‰å‹E‹…â#‹€ô]ÍvU‰åS‹]‹M …ÛxU;Ðá#sM‹â#‹@%ÿÿÿ=u7ù™wI‰ÐÁà)Ðfƒ<ÅÈâ#u¸ëMI‰ÐÁà)Ð9Ťâ#t ¸&ë3‰öI‰ÁÁá)ÁÁá¸öÑâ#”À‹U‰‹‘tå#‹E‰¸‹$ÉÉöU‰å‹E f8t·‹E -9Âu¸ë¸ÿÿÿÿ]ÐU‰å¸ÿÿÿÿ]ÉöU‰å¸]ÉöU‰å]ÍvU‰å¸]ÉöU‰åSƒì ‹E‹M ‹…â#I‰ÐÁà)ЋÅtå#‹“ðÂPQè;œƒÄ‹]üÉÍvU‰åWVSƒì ‹E‹u ‹<…â#v‰ÐÁà)Ðfƒ<ÅÈâ#tµ€Gƒ<ÿtHÿëCƒìv‰ÃÁã)ÃÁ㍃äâ#PjèR5fǃÈâ#€ƒÄ‹ƒtå#‹—ðÂPVè윃čeô[^_]ÐU‰åSƒì ‹E‹M ‹…â#I‰ÐÁà)ÐÁàfǀÈâ#€‹€tå#‹“ðÂPQ蠜ƒÄ‹]üÉÃU‰å]ÍvU‰åWVSƒì ‹U‹•â#‰Eð‹U <•€‰ÆƒÆƒ<7~MƒìR‰ÃÁã)ÃÁ㍃äâ#Pjè‹4ÿ 7ƒÄ‹ƒtå#‹Mð‹‘ðÂPÿu 躛fǃÈâ#€ƒÄë‹E @‰ÐÁà)ÐfÇÅÈâ#eô[^_]ÐU‰åƒì‹E‹M ‹…â#ƒÀDŽˆ€ÿÿÿÿI‰ÐÁà)ÐfÇÅÈâ#hDâ#QèðÉÿÿƒÄÉÍvU‰å‹E‹U ‹…â#ƒÀDŽ€R‰ÐÁà)ÐfÇÅÈâ#]ÃU‰åWVSƒì4‹u v‰EäÁà+EäfÇÅÈâ#EèPjè“3Mè»@B‹Eº÷ó‰Uà’€€‰E܋A‹U܍ЉE؉A»¡/¸D÷ë‰ÓÁû‹EØÁø)ÿƒÞC‹E÷ç‰×‰øÁèEè‹A»Êš;™÷û‰Ó‰YƒÄVh`Ž"ÿuìÿuèÿ¤á#‰ÃƒÄƒûÿuƒìÿ5Ìá#jèAäÿÿƒÄ v‰ÈÁà)ȉŀå#eô[^_]ÐU‰åƒìÿ5Ìá#jèäÿÿ¸ƒÄÉÍvU‰åƒìÿ5Ìá#jèñãÿÿƒÄÉÃU‰åƒìÿ5Ìá#jèÙãÿÿƒÄÉÃU‰åƒìÿ5Ìá#jèÁãÿÿƒÄÉÃU‰åƒìÿ5Ìá#jè©ãÿÿƒÄÉÃU‰åƒìÿ5Ìá#jè‘ãÿÿƒÄÉÃU‰åƒìÿ5Ìá#jèyãÿÿƒÄÉÃU‰åƒìÿ5Ìá#jèaãÿÿƒÄÉÃU‰åƒìÿ5Ìá#jèIãÿÿƒÄÉÃU‰åƒìÿ5Ìá#jè1ãÿÿƒÄÉÃU‰åƒìÿ5Ìá#jèãÿÿƒÄÉÃU‰åWVSƒì‹MI‰ÃÁã)ÃÁ㺤â#‹‹4…â#¿ â#fÇD(€‹„Ћ–ðÂPQè=™Ç„àÿÿÿÿèQœÿÿƒÄeô[^_]ÉöU‰åVSƒì h@6#è
-Áÿÿè]¼ÿÿ‰ÆÇ$Œè׿ÿÿ‰Ã‰µâ#ƒÄ jhØ5#Sè®[fÇCÆCÇC "ÇC@"ÇC L"ÇC$t"ÇC(ÇC,Œ"ÇC0˜"ÇC4 "ÇC8¬"ÇC<´"ÇC@А"ÇCDø"ÇCH ‘"ÇCLH‘"ÇCPp‘"ÇCT˜‘"ÇCXÀ‘"ÇC\è‘"ÇC`’"ÇCd<’"ÇChd’"ÇClŒ’"ÇCp´’"ÇCtܒ"ÇCx“"ÇC|,“"ǃ€T“"ǃ„|“"ǃˆÿÿÿÿÇ$ã5#èô¿ÿÿƒÄ jVh¤“"è,ºÿÿƒÄeø[^]ÉöU‰å‹M‹E ‹â#fƒ8t·9Èu¸ƒºˆÿt¸ÿÿÿÿ]ÉöU‰å¸ÿÿÿÿ]ÉöU‰åƒì‹E‹…â#ÿ°ˆhE5#èìYƒÄÉÍvU‰å‹E‹…â#‹€ˆ]ÍvU‰å¸]ÉöU‰å]ÍvU‰å¸]ÉöU‰å]ÍvU‰å‹E @‰ÂÁâ)ÂfÇÕÈâ#]ÃU‰åƒìhT5#èxYƒÄÿ5Ìá#j è„àÿÿƒÄÉÍvU‰åƒìh[5#èPYƒÄÿ5Ìá#j è\àÿÿƒÄÉÍvU‰åƒìhb5#è(YƒÄÿ5Ìá#j è4àÿÿƒÄÉÍvU‰åƒìhi5#èYƒÄÿ5Ìá#j è àÿÿƒÄÉÍvU‰åƒìhp5#èØXƒÄÿ5Ìá#j èäßÿÿƒÄÉÍvU‰åƒìhw5#è°XƒÄÿ5Ìá#j è¼ßÿÿƒÄÉÍvU‰åƒìh~5#èˆXƒÄÿ5Ìá#j è”ßÿÿƒÄÉÍvU‰åƒìh…5#è`XƒÄÿ5Ìá#jèlßÿÿ¸ƒÄÉÉöU‰åƒìhŒ5#è4XƒÄÿ5Ìá#jè@ßÿÿƒÄÉÍvU‰åƒìh“5#è XƒÄÿ5Ìá#jèßÿÿƒÄÉÍvU‰åƒìhš5#èäWƒÄÿ5Ìá#jèðÞÿÿƒÄÉÍvU‰åƒìh¡5#è¼WƒÄÿ5Ìá#jèÈÞÿÿƒÄÉÍvU‰åƒìh¨5#è”WƒÄÿ5Ìá#jè ÞÿÿƒÄÉÍvU‰åƒìh¯5#èlWƒÄÿ5Ìá#jèxÞÿÿƒÄÉÍvU‰åƒìh¶5#èDWƒÄÿ5Ìá#jèPÞÿÿƒÄÉÍvU‰åƒìh½5#èWƒÄÿ5Ìá#jè(ÞÿÿƒÄÉÍvU‰åƒìhÄ5#èôVƒÄÿ5Ìá#jèÞÿÿƒÄÉÍvU‰åƒìhË5#èÌVƒÄÿ5Ìá#jèØÝÿÿƒÄÉÍvU‰åSƒì0‹]ÇEÜÇEàfÇEäÇEè¶Ãf‰EØÇEìEØjjPh0”"hÒ5#趜ÿÿƒÄ ‹â#‰Ã‰šˆƒûÿuƒì h6#èÒ»ÿÿƒÄ[‰ÐÁà)ÐÇÅØâ#ÿÿÿÿ‹]üÉÐU‰åôëýU‰åWVSƒì ‹} ¾ú»ëvCûÿ2Ý)ØÁàº@¤#€|t߃ìÿ4ÿuèaVƒÄ…Àuʾ…öt1ÿÀuèðnÇûéÜûÝ)؍…D¤#éˉö÷Ç@uè¿nÇû髍v‹E‰Eð=ÿ~èžnÇû銉ö‹Å#ƒúÿtqÕ)Ѝ<…w‹†D¤#£Å#ƒì ÿuèV@‰$臹ÿÿ»@¤#‰ƒÄÿuPè7U‹Eð‰‡H¤#‡L¤#‰$è,‘ÆDƒÄû‡D¤#ëvènÇû¸eô[^_]ÍvU‰åWVSƒì ¾ú¿»@¤#vý)øÁà€|tƒìÿ4ÿuèUƒÄ…Àu¾Gÿÿ~ʅötJƒì ÿuèOUƒÄ@Pý)ûÁã¾@¤#ÿ43è%¹ÿÿƒÃÆD3¡Å#‰ƒD¤#‰=Å#ƒÄûë‰öèSmÇû¸eô[^_]ÍvU‰åWVSƒì ‹}?ÿw‹Õ)Ѐ<…X¤#uèmǸÿÿÿÿé‰öèÏæÿÿúè5B‹Ìá#R‰ÑÁá)Ñf‰ͨâ#‹Õ)Ѝ4…@¤#ƒ~ ÿu
-ƒ~…“ƒìWjÿÐ]#ƒÄh„â#jè8)ƒÄU衈â#;Øá#|¡„â#+Ôá#‰E衈â#+Øá#ë!‰ö¡„â#+Ôá#H‰E衈â#+Øá#ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ìºÓMb‰Ø÷êÁú‰ØÁø)ÂыÌá#R‰ÐÁà)Ð) Åìâ#ƒì Qèú›ÿÿƒÄƒ=Üá#ÿtƒì ÿ5Üá#ÿ¨á#ÇÜá#ÿÿÿÿƒÄ‹ -Ìá#I‰ÐÁà)ЋŤâ#ƒì‹…â#QPÿRH‹ -Ìá#I‰ÐÁà)л â#fÇDÃ(Íǂ@À#‹‰‚DÀ#ƒÄF PQèÇÌá#ÿÿÿÿÇàá#ÿÿÿÿèõÿÿ¡Ìá#@‰ÂÁâ)¿DÓ‰$è…@èܧÿÿƒÄûèÿäÿÿë8ÿNƒìWjÿÐ]#¡Ìá#@‰ÂÁâ)¿ըâ#‰$èF@蝧ÿÿƒÄû¸eô[^_]ÃU‰åWVSƒì ‹}‹]?ÿw‹Õ)Ѐ<…X¤#uè¯jǸÿÿÿÿéVv…ÛuúëúèÒ?‹Ìá#R‰ÑÁá)Ñf‰ͨâ#‹Õ)Ѝ4…@¤#…Ûu0ƒ~ ÿu‹E 9F}èMjÇ û¸ÿÿÿÿéó‹E )Fûéâèäÿÿƒ~ ÿu ‹E 9F‘ƒìWjÿÐ]#ƒÄh„â#jèš&ƒÄU衈â#;Øá#|¡„â#+Ôá#‰E衈â#+Øá#ë¡„â#+Ôá#H‰E衈â#+Øá#ʚ;‰B‹Mè ‰ ‰ ‰ ‰ ‰ ‰Áá‹]ìºÓMb‰Ø÷êÁú‰ØÁø)ÂыÌá#R‰ÐÁà)Ð) Åìâ#ƒì Qè^™ÿÿƒÄƒ=Üá#ÿtƒì ÿ5Üá#ÿ¨á#ÇÜá#ÿÿÿÿƒÄ‹ -Ìá#I‰ÐÁà)ЋŤâ#ƒì‹…â#QPÿRH‹ -Ìá#I‰ÐÁà)л â#fÇDÃ(͋E ‰‚@À#‹‰‚DÀ#ƒÄF PQè'ÇÌá#ÿÿÿÿÇàá#ÿÿÿÿèZ›ÿÿ¡Ìá#@‰ÂÁâ)¿DÓ‰$èê=èA¥ÿÿƒÄûèdâÿÿë<‰ö‹E )FƒìWjÿÐ]#¡Ìá#@‰ÂÁâ)¿ըâ#‰$è§=èþ¤ÿÿƒÄû¸eô[^_]ÐU‰åWVSƒì ‹}?ÿw‹Õ)Ѐ<…X¤#uèhǸÿÿÿÿéU‰öè,…À„‡œúX‰Æ‹Õ)Ѝ…@¤#‹JA‰J‹Z ƒûÿtG‹Ý@À#9È<)Á‰È‰BƒìB PSèʊ[‰ÐÁà)ЋŤâ#ƒÄ‹•â#SRÿPDèÿÿƒÄƒìWjÿÐ]#ƒÄ‰ðPé¼‰öúèª<‹àá#R‰ÑÁá)Ñf‰ͨâ#‹Õ)Ѝ…@¤#‹JA‰J‹Z ƒûÿtG‹Ý@À#9È<)Á‰È‰BƒìB PSè*Š[‰ÐÁà)ЋŤâ#ƒÄ‹•â#SRÿPD荙ÿÿƒÄƒìWjÿÐ]#¡Ìá#@‰ÂÁâ)¿ըâ#‰$è <èb£ÿÿƒÄû¸eô[^_]ÐU‰åWVSƒì ‹] ÇEð‹E8ÿw‹Õ)Ѐ<…X¤#uèlfǸÿÿÿÿéÊèc*…À„ÃœúX‰Â‰Uì‹E‹Õ)Ѝ4…@¤#^‹^ ƒûÿts݉‹€@À#;F_¿@À#ÇEðv‹F+:‰FƒìF PSè
-‰[‰ÐÁà)ЋŤâ#ƒÄ‹•â#SRÿPD‹^ ƒÄƒûÿt݋:;F~°ƒìÿujÿÐ]#ƒÄƒ}ðtèÿÿ‹Uì‰ÐPéõúèÊ:‹àá#R‰ÑÁá)Ñf‰ͨâ#‹E‹Õ)Ѝ4…@¤#^‹^ ƒûÿtr݉‹€@À#;F^¿@À#ÇEð‰ö‹F+:‰FƒìF PSè2ˆ[‰ÐÁà)ЋŤâ#ƒÄ‹•â#SRÿPD‹^ ƒÄƒûÿt݋:;F~°ƒìÿujÿÐ]#ƒÄƒ}ðtèd—ÿÿ¡Ìá#@‰ÂÁâ)ƒì ¿Õ¨â#Pèð9èG¡ÿÿƒÄû¸eô[^_]ÉöU‰åWVSƒì ¾¿D¤#õ)óÁãǃ@¤#‰4;ǃH¤#ƒì ƒL¤#PèF‡ƒÃF‰;ƃH¤#ƒÄ‰Æþÿ~±Ç8À#ÿÿÿÿÇÅ#ƒìjhä¢"è:ªÿÿƒÄeô[^_]ÍvU‰åVS‹uú>ÿw‹Õ)Ѐ<…X¤#uèÉcÇû¸ÿÿÿÿënvƒì ‹Õ)л@¤#ÿ4ƒèUKƒÄ@P‹Õ)Ðÿ4ƒè1¯ÿÿ‹Õ)ÐÆDƒ‹Õ)ЋÅ#‰…T¤#‹£Å#ƒÄû¸eø[^]ÉöU‰åƒì‹Mú9ÿw‹Õ)Ѐ<…X¤#uècÇû¸ÿÿÿÿëb‰ö‹Õ)Ѓ<…L¤#ÿtèîbÇû¸ÿÿÿÿë8‹Õ)ÐÆ…X¤#‹Õ)ЋÅ#‰…T¤#‹£Å#û¸ÉÉöU‰åSƒì‹M‹] 9ÿw‹Õ)Ѐ<…X¤#uèubǸÿÿÿÿë_ú‹Õ)ÐÁàƒ¸L¤#ÿu ‹€H¤#‰ë7‰öÇ‹Õ)Ћ…L¤#¹¨â#vÿ @‰ÐÁà)ЋDÁPƒøÿuëû¸‹]üÉÃU‰åVS‹u‹M¸ùÿ‡–ú‹Å#‰ƒúÿtnÕ)Ћ…T¤#£Å#‹Õ)л@¤#ǃ‹Õ)Љ …H¤#ƒì ‹Õ)Ѝ…L¤#P腄‹Õ)ÐÆDƒƒÄëègaÇû¸ÿÿÿÿëû¸eø[^]ÍvU‰åƒì‹M9ÿw‹Õ)Ѐ<…X¤#uèaǸÿÿÿÿë=ú‹Õ)Ѝ…@¤#ƒx ÿuƒxuèì`Ç û¸ÿÿÿÿë ‰öÿHû¸ÉÐU‰å‹E@‰ÂÁâ)¸fƒ<ÕÈâ#”À]ÐU‰åVS‹][‰ÐÁà)Ѝ4Åfƒ¾Èâ#uAƒì‹ÝDÀ#Õ)Ѝ…L¤#PS脃‹†¤â#ƒÄ‹…â#SPÿRD¸ƒÄ됸eø[^]ÃU‰åVSƒ=Ü]#…ÚÇÜ]#¹»`¨%¾d¨%‰ÁàP ÆÇ2ÿÿÿÿÆDAƒùváƒìjjh Å#èÜýÿÿ¹ƒÄ¾Äª%»Àª%‰ö‰ÁàQ‰0Ɖуù -véÇô¬%ÿÿÿÿÆð¬%Ǹª%¹¾$­%» ­%vÍ)ÈÁàQ‰0ƉуùvãÇP°%ÿÿÿÿÆL°%Çh°%eø[^]ÐU‰åWVSƒìŠEˆEóŠUˆUòfÇEæ¾<u€út €}óu€}òuè_Ǐ¸ÿÿÿÿé7‰öúƒ=¸ª%ÿuèí^ǍûÇEìÿÿÿÿ됡¸ª%€‹ÕĪ%‰¸ª%û‰Eìƒ}ìÿu -¸ÿÿÿÿéìvƒì h Å#ègñÿÿƒÄ‹]¾¹º÷ñ‰×ëf‰ö¿€<ŀ¨%t0ƒìÿu¿ōƒ`¨%Pè³EƒÄ…Àu€»x¨%„Ÿ¾ëG¹‰øº÷ñ‰×fÿEæfƒ}懜‰ó„Ût–¿Áãƃ€¨%ƒìÿuƒ`¨%Pè÷D‹E쉃t¨%ƒÄ€}óu‰Â’‹] f‰ÅȪ%ëv‹E썀‹E ¯Ef‰ÕȪ%úƒì ‹U썒Á㷃Ȫ%PèݨÿÿºÌª%‰ƒÄû…Àu%è”]ǒƒì h Å#èAõÿÿ¸ÿÿÿÿ魍v‹E썀ÁãS‰Uà¾Àª%‹ƒÌª%‰‚Ī%‰2ƒìjjƒÜª%Pè:ûÿÿƒÄ ·D3Pjƒàª%Pè#ûÿÿƒÄ jjÃäª%SèûÿÿŠ]ó‹Eàˆ\0ƒÄúƒ=h°%ÿuèø\ǎûÇEèÿÿÿÿë¡h°%Å)‹•$­%‰h°%û‰Eèƒ}èÿu_ƒì h Å#èvôÿÿ‹Eèéä‰öè§\ǐƒì h Å#èTôÿÿ¸ÿÿÿÿéÀ‰öèƒ\Ǒƒì h Å#è0ôÿÿ¸ÿÿÿÿ霉ö‹EèÁà+EèÁ๠­%ŠUòˆT P‹]ì‰
-‹] f‰\
-ǀ$­%ÿÿÿÿ‰º(­%‹]썛ÆÕÀª%ƍ¿ōr¿`¨%€|>t%ƒì¶D>Pš|¨%SèGõÿÿÆD>‰$èšøÿÿƒÄƒì h Å#èŽóÿÿ¿EèƒÄeô[^_]ÍvU‰åWVSƒìŠEˆEóŠ]ÇEè¿ÆEç<u„Ût €}óu€ûuè‚[Ǐ¸ÿÿÿÿé0‰öúƒ=h°%ÿuèa[ǎûÇEìÿÿÿÿë ¡h°%Å)‹•$­%‰h°%û‰Eìƒ}ìÿu ¸ÿÿÿÿéߐ‹EìÁà+EìÁຠ­%ˆ\ ‹M f‰Lǀ$­%ÿÿÿÿƒì h Å#è°íÿÿƒÄ‹U¾¹º÷ñ‰Öë]v¶€<ŀ¨%u ¿ÆEçë8ƒìÿu¶Å`¨%PèöAƒÄ…Àu¿ëF¹‰ðº÷ñ‰ÖÿEèƒ}è‡Ò‰ù„Ét €}çuR¶Áã¸`¨%ÆD ÆDƒìÿuPè>AƒÄ jjÃ|¨%Sè/øÿÿÇ$ Å#èçñÿÿƒÄ jjSè:ïÿÿëM¶ōCº`¨%€|t'þDƒì h Å#è®ñÿÿƒÄ jjƒ|¨%Pèûîÿÿ됃ì h Å#è‹ñÿÿƒÄ¶‹<Åt¨%¿ŠUó:Åت%tèªYǓ¸ÿÿÿÿéX‰ö€}óu¿·ÅȪ%9E u€}ót(¿·ÅȪ%™÷} …ÒtèdYǔ¸ÿÿÿÿéƒì h Å#è ìÿÿ¶‹ń¨%ƒÄƒúÿ„­€}óu#è&YǕƒì h Å#èÓðÿÿ¸ÿÿÿÿéЍÕ)з…4­%9E t"èíXǔƒì h Å#èšðÿÿ¸ÿÿÿÿ鋋MìÁá+M썶Å »d¨%‹‰$­%‹Mì‰ ë/‰öèŸXǑƒì h Å#èLðÿÿ¸ÿÿÿÿë@¶‹Uì‰ń¨%ƒì h Å#è*ðÿÿ‹EìÁà+EìÁàH‰±(­%º ­%‰<Æ¿EìƒÄeô[^_]ÉöU‰åWVSƒì¿E‰Eì‰ÇÁç)ÇÁ獗 ­%‰Uðh Å#èÏêÿÿ‹Mð‹Y›ÁãC‰Eèºd¨%‹€Áà°Àª%ƀÀª%F‰$èôÿÿF ‰$è„ôÿÿF$‰$èyôÿÿƒÄú·FPÿv èX£ÿÿû¹d¨%‹Eè‹ú ’¡¸ª%‰ÍĪ%‰¸ª%ûƇ ­%ƒÃ ‹Uð‹B‰ƒd¨%ú¡h°%‰‡$­%‹Mì‰ -h°%ûƃ`¨%Ç$ Å#è
-ïÿÿƒÄeô[^_]ÍvU‰åWVSƒì ‹u ŠM¿UÕ)Ѝ… ­%‰Eð‹@€ÅÀª%‹Eð€x uèûVǔ¸ÿÿév€;uèÞVǖ¸ÿÿéù‰ö€{tQ€{u,ƒì¶ÁP‹Uð·BPC PèÈëÿÿƒÄ…Àt;¸évƒì¶ÁP‹Uð·BPC PèœëÿÿƒÄ…ÀuÔƒì CPè-éÿÿƒÄ‹Uð·B‹{‰ÁÁéüó¥¨tf¥¨t¤·B‰ÁK‰K·S‰ÐC 9Ár‰È)ЉC€{u ƒì CPë8‰ö€{uƒì‹Uð·BPC$PèZïÿÿëƒì‹Uð·BPC$PèDïÿÿC‰$èíÿÿƒÄ¸eô[^_]ÐU‰åWVSƒì ‹} ŠM¿UÕ)Ѝ… ­%‰Eð‹@€ÅÀª%‹Eð€x uè‹Uǔ¸ÿÿév€;uènUǖ¸ÿÿéù‰ö€{tQ€{u,ƒì¶ÁP‹Uð·BPC$PèXêÿÿƒÄ…Àt;¸évƒì¶ÁP‹Uð·BPC$Pè,êÿÿƒÄ…ÀuÔƒì CPè½çÿÿƒÄ‹Uð·B‹s‰ÁÁéüó¥¨tf¥¨t¤·B‰ÁK‰K·S‰ÐC 9Ár‰È)ЉC€{u ƒì CPë8‰ö€{uƒì‹Uð·BPC Pèêíÿÿëƒì‹Uð·BPC PèÔíÿÿC‰$è-ìÿÿƒÄ¸eô[^_]ÐU‰åSƒìh_6#è;ƒÄÿ5¸ª%hk6#è;»ƒÄÝ)ØÁà€¸ ­%t8 ­%‹B€ÅÀª%ƒì ÿp ÿp$‹B€Å`¨%PSh6#è®:ƒÄ Cƒûv­‹]üÉÃU‰åƒì`¿MÍ)ȋ…0­%’ÅÀª%ÿp ÿp$RQh 6#E¨Pèf:ƒÄ ÉÐU‰åSƒì‹]h Å#èHæÿÿ¿ÓÕ)Ѝ …‹8­%€Å ƒÄ€º`¨%u ‹$­%‰‚d¨%¿ÃÅ)ÂÁâƂ ­%ú‹ -h°%‰Š$­%£h°%ûƒì h Å#èÓêÿÿƒÄ‹]üÉÍvU‰åWVSƒì ‹u ‹E‹<…`â#ú‹^…Ûu-ƒì j èžÿÿƒÄ…ÀtÇÿÿÿÿÇ@Ç@ÿÿÿÿ‹U‰‰F‹;Ìá#u û¸#é~ƒ;ÿtc¾ â#‰ö‹ -Ìá#I‰ÐÁà)Ћ‰TÆP‹C‰„¬¡Ìá#‰CÿCè…ÿÿ¡Ìá#@‰ÂÁâ)ƒì ¿DÖPèŸ'èöŽÿÿƒÄûúƒ;ÿu¤¡Ìá#ÿD‡D¡Ìá#‰û¸eô[^_]ÉöU‰åWVSƒì ‹E ‹x¸…ÿ„À‹;Ìá#tû¸髍vúè*'‹Ìá# [‰ÊÁâ)Êf‰Õ¨â#‹E‹…`â#ÿL˜DÇÿÿÿÿ‹_ÇGÿÿÿÿƒûÿt-p ‰Ù[‰ÐÁà)ЉÅðâ#‹œž DŽŽ ÿÿÿÿƒûÿuÖÇGè„ÿÿ¡Ìá#@‰ÂÁâ)ƒì ¿Õ¨â#Pè¢&èùÿÿƒÄû¸eô[^_]ÃU‰åVSƒì h7#è~ÿÿè -™ÿÿ‰ÆÇ$èKœÿÿ‰Ã‰µ`â#ƒÄ jh7#Sè"8fÇCÍÆCÇCÇC$³"ÇC p³"ÇC$|³"ÇC(„³"ÇC,´³"ÇC0à³"ÇC4(´"ÇC8ˆ°"ÇC<p´"ÇC@p±"ºƒÄsK •ÇD@DŽ ÿÿÿÿBú™~ݍeø[^]ÉöU‰åVS‹E‹…`â#ƒì hà6#è7¾ƒÄƒÃƒìÿt³@hÿ6#èû6ƒÄFþ™~ãeø[^]ÃU‰å¸ÿÿÿÿ]ÉöU‰å]ÍvU‰åƒì‹E‹U ‹…`â#ƒÀƒ|@tƒìRj
-èȽÿÿƒÄÉÍvU‰å‹U :t ‹E -9u
-¸ëv¸ÿÿÿÿ]ÐU‰åSƒì‹] j èӚÿÿ‰ÂƒÄ¸ …Òt!ÇÿÿÿÿÇBÇBÿÿÿÿ‹E‰‰S¸‹]üÉÍvU‰åSƒì‹] ‹Cƒxt ¸ë&‰öúƒ{tƒìj ÿsèäšÿÿÇCƒÄû¸‹]üÉÍvU‰åWVSƒì ‹}‹u ú‹^…Ûu*ƒì j è3šÿÿƒÄ…ÀtÇÿÿÿÿÇ@Ç@ÿÿÿÿ‰>‰Fƒ;ÿt
-û¸ë"‰ö¡Ìá#‹½`â#ƒÂÿD‚@¡Ìá#‰û¸eô[^_]ÃU‰åWVSƒì ‹E ‹U‹•`â#ú‹p¸…ö„V‹;Ìá#u û¸#éA‹Ìá#‹F ¿ â#;„“°v -¸é v¡Ìá#‹Œƒ°‹“¬…Òt‰ö‹;Ìá#…Š‹R…Òu븅À…†‹ -Ìá#I‰ÂÁâ)‹ƒ¬‹‰D×P‹ƒ¬‹@‰„‹‹“¬¡Ìá#‰B‹ƒ¬ÿ@èj€ÿÿ¡Ìá#@‰ÂÁâ)ƒì ¿D×Pèù"èPŠÿÿƒÄûúéRÿÿÿ‰ö¸;J ’Àérÿÿÿ‹E‹…`â#¡Ìá#ÿDƒD¡Ìá#‰¹‹ƒ¬‹V ë‰ö‰Á‹A…Àt;P sò…Ét‰q됉³¬…Àt‰p‰F‰Nû¸eô[^_]ÍvU‰åWVS‹}‹E ‹ ½`â#ú‹X¸…Û„Ù‹;Ìá#uû¸#éčv‹Ìá#‹C ;„‘°s
-¸饡Ìá#‹´°‹‘¬…Òt‰ö‹;Ìá#u‹R…Òu︅Àuû¸ëk‰ö¸;r ’Àëåv‹ ½`â#¡Ìá#ÿDD¡Ìá#‰¾‹¬‹S 됉ƋF…Àt;P sò…öt‰^됉™¬…Àt‰X‰C‰sû¸[^_]ÉöU‰åWVSƒì ‹E ‹x¸…ÿ„ï‹;Ìá#tû¸éڍvúè&!‹Ìá# [‰ÊÁâ)Êf‰Õ¨â#‹E‹…`â#‰EðÿL˜DÇÿÿÿÿ‹_ÇGÿÿÿÿƒûÿt2‰ÆƒÆv‰Ù[‰ÐÁà)ЉÅðâ#‹œžDŽŽÿÿÿÿƒûÿuÖÇG‹O‹W…Éu -‹Eð‰¬ë‰ö‹G‰A…Òt‹G‰Bèã}ÿÿ¡Ìá#@‰ÂÁâ)ƒì ¿Õ¨â#Pèo èƇÿÿƒÄû¸eô[^_]ÐU‰åVSƒì hD7#èJ—ÿÿèْÿÿ‰ÃÇ$€è–ÿÿ‰Æ‰4`â#ƒÄ jhX7#Vèî1fÇFÌÆFÇFÇF,º"ÇF °º"ÇF$ܺ"ÇF( »"ÇF,T»"ÇF0€»"ÇF4Ø»"ÇF8è´"ÇF<p¶"ÇF@t·"ºƒÄ^N•ÇD@DŽ°ÿÿÿÿDŽÿÿÿÿBú™~Òdž¬eø[^]ÐU‰å‹U‹M ¸ÿÿÿÿ…Òt;‹‹…`â#ƒxu‹@%ÿÿÿ=Ìu…Ét ‹B‹@ ‰ë
-‰ö¸ÿÿÿÿ됸]ÐU‰å‹U‹M¸ÿÿÿÿ…Òt@‹‹…`â#ƒxu‹@%ÿÿÿ=Ìt¸ÿÿÿÿ됅Ét‹B‹@ ‰‹R‹E ‰B ¸]ÃU‰å‹E‹M ‹U‹…`â#‰”ˆ°]ÃU‰åWVSƒì‹E‹<…`â#hà6#è0»ƒÄwƒìÿtž@hÿ6#èó/ƒÄCû™~ãƒì h"7#èÚ/»ƒÄ‰öƒìÿ´Ÿ°h>7#è¼/ƒÄCû™~àeô[^_]ÃU‰å‹U :t ‹E -9u
-¸ëv¸ÿÿÿÿ]ÐU‰åS‹E‹U ‹]‹ …`â#Áâ‹C‰„°ÇD
-D‹$ÉÉöU‰åVS‹E‹u ‹…`â#ƒ|³DtƒìVj
-èD¶ÿÿƒÄë vÇD³DDŽ³°ÿÿÿÿeø[^]ÉöU‰å‹U :t ‹E -9u
-¸ëv¸ÿÿÿÿ]ÐU‰åSƒì‹] jè3“ÿÿ‰ÂƒÄ¸ …Òt1ÇÿÿÿÿÇBÇBÿÿÿÿ‹E‹@‰B ÇB‹E‰‰S¸‹]üÉÍvU‰åSƒì‹] ‹Cƒxt ¸ë&‰öúƒ{tƒìjÿsè4“ÿÿÇCƒÄû¸‹]üÉÍvU‰åWVSƒì$·]Shb7#è .‰Ø-yƒÀÁèƒÄ ·À‰Eè@ÛÁã¿ ½%ÿt8CP‰Eä·8Phi7#èá-ƒÄ ÿt;·D;Phw7#èÊ-ƒÄ ÿt; s·>Phˆ7#è±-ƒÄ ÿt>·D>Ph™7#èš-ƒÄ ‹Uä·D:P·DLPhª7#è~-‹UèÕƒÄ·ØSh»7#èc-EóPEòPEìPS蹃ĶUóR¶UòRÿuìPh8#è6-ƒÄ eô[^_]ÍvU‰åWVSƒì ‹E‹U‹]¹‹u ƒî‰ƒî‰º@&fƒ=@&yA¿Áfƒ<Byfù™~îfù™~ƒì hÐ7#èÎ,¸ƒÄé ¿Á<¹@&‰Úf Ê€f‰Ǎ<ÿÁçº ½%‰tÇD _ÇDfŒÙf‰LfÇfÇDÇD _ ‹M‰ ÇDÇDO0ÇDÇD Ǎ_@ÇÇD‰t‰t fŒÉf‰L fŒÙf‰LfŒÛOPf‰\fŒÛf‰fÇD 0fÇD0O`fÇfÇDfÇDÇŒ½%¾@A&¹üó¥Å˜eô[^_]ÐU‰åVS‹u ¿E-‰Â…ÀyP‰ÐÁø@ÀÁ๠½%f‰tX@Vf‰T f‰t ƒÀPf‰tf‰4[^]ÉöU‰å¿E-‰Â…ÀyP‰ÐÁøfDŽ@&]ÉöU‰åSƒì‹]¿E Phè7#Sè~3‰ØƒÄ‹]üÉÃU‰åVS趉Æès»‰öƒìhÆ"SèƒÄh¤¿"SèìƒÄCƒû~ۉðeø[^]ÉöU‰åƒìèaÉÍvU‰åSƒì‹]‹à]#€82uºð°îƒìShB9#èˆ*ƒÄÁ㋃à]#@PhC#èp*ƒÄÿ³$^#ènƒÄ‹]üÉÉöU‰åƒìÿuhY9#èE*èèûÇ$èG7ƒÄÉÉöU‰åWVSƒì‹E‹} ƒ=d»%„à…ÿ„Ø¡à±%€€€ źm¶‰È÷â‰È)ÐÑ草ÁÁé
-‰O¡ä±%ÀP‰ÐÁà)кè‰Ó™÷û’’’щW¡ä±%ÀP‰ÑÁá)ѾÓMb‰È÷îÁú‰ÈÁø‰Ó)øƒÞC÷o‰ÑÁù‹GÁø)Á‰È؉‹OÁú‰ÈÁø)’’’’’’Áâ)э ‰ ‰ ‰Áá‰O‹éԉö]è¡à±%€€€ źm¶‰È÷â‰È)ÐÑ草ÁÁé
-¡ä±%ÀP‰ÐÁà)кè‰Ö™÷þ’’’щS¡ä±%ÀP‰ÑÁá)ѾÓMb‰È÷îÁú‰ÈÁø)‰Uè‹{¸ƒÞC÷ï‰ÑÁù‰øÁø)Á‰ÈEè‰ùÁú‰ÈÁø)’’’’’’Áâ)э ‰ ‰ ‰Áá‰K‹E荀€€€€€‰ÃÁã‰È÷îÁúÁù)ʍéèvƒøuc¸ƒ=Ô±%…Ρر%€€€€€€‰ÃÁã‹ -ܱ%ºÓMb‰È÷êÁúÁù)ÊӅÿ„…¡Ø±%‰¡Ü±%éqvƒø…ç¶ı%ƒøtƒø…Àt
-ë,ƒøtë%¹@°ë#v¹A°ëv¹B°ë v»ë"ºCÐî‰Êì¶ØìˆÁ‰ÊÁâf¶Ã‰Ó Ãf‹ -б%f)Ù·É -à±%º×®¬]‰È÷êÁú‰ÈÁø)Âä±%’BÁà)Ѝ‚‰ÂÁâ Ð)Á‰È£à±%f‰б%…ÿ„̍€€€ źm¶‰È÷â‰È)ÐÑ草ÁÁé
-‰O¡ä±%ÀP‰ÐÁà)кè‰Ó™÷û’’’щW¡ä±%ÀP‰ÑÁá)ѺÓMb‰È÷êÁú‰ÈÁø‰Ó)Ëw¸ƒÞC÷î‰ÑÁù‰ðÁø)Á‰È؉‰óÁú‰ÙÁù)ʍ’’’’’’Áâ‰Ø)Ѝ€€€Áà‰G‹à±%’’’4Õ¹Á6ۉð÷é‰Ó3‰ÁÁù
-‰ð™‰È)Ћ -ä±%ɍ‘ÑÁâ)ʉÑÁá)эÈ鍃ø…ƒ=Ô±%…rUè¡Ø±%‰¡Ü±%‰B»@¹C°Ò‰Êî‰Úì¶ÈìÁàf¶Ñ зð·`»%9Æv%hf9#j_hx9#h9#èm%Ç$èmƒÄ·`»%)ó¯ȱ%·`»%‰Ø‰Ñº÷ñ‰Ãº °
-îì©t‹ -ȱ%;ÍÌÌ̉ð÷âÁê9Ós‰Ëu荛€€‹V‰Eä‰F¸¡/¸D÷mä‰ÑÁù‹EäÁø)Á‰ÈEè‹N¸¡/¸D÷éÁú‰ÈÁø)’’’’’’’’’Áâ )щN¡Ø±%€€€€€€Áà‰Eä‹ -ܱ%ºÓMb‰È÷êÁúÁù)ʋEäÐÅÿt ‰ð‹‰‹@‰G‰Øëv¸eô[^_]ÍvU‰åVSƒìŠEˆE÷ÿŒ^#ƒ=Œ^#uƒ=h^#tÿh^#¶E÷€Áຌ°%ƒ<uIÇö€°%tûƒì ¶]÷›Áã¾€°%ÿ43ÿ“„°%ƒÄöDtú¶E÷€Ç…Œ°%ÿp^#ƒ=Œ^#uƒ=l^#tÿl^#ÿ -Œ^#eø[^]ÍvU‰åWVSº¿Œ°%¾ˆ°%»„°%¹€°%’ÁàÇ8‰0ÇÇBƒú~ÜÇŒ^#[^_]ÐU‰åVS‹U‹] ‹uú’ƒ<…Œ°%t÷Æu¸ÿÿÿÿëH’ …ǁŒ°%û…Ût‰™„°%º€°%ˆ°%‰‰t
-됍’Ç…Œ°%¸[^]ÐU‰å¡Œ^#]ÉöU‰åSƒì¶ı%ƒøt!ƒø…Àt ë.‰öƒøtë%¹@°ë#v¹A°ëv¹B°ë v»ë"ºCÐî‰Êì¶ØìˆÁ‰ÊÁâf¶Ã‰Ó Ãf‹ -б%f)Ù·É -à±%º×®¬]‰È÷êÁú‰ÈÁø)Âä±%’BÁà)Ѝ‚‰ÂÁâ Ð)Á‰ -à±%f‰б%ÿŒ^#ƒ=Œ^#uƒ=h^#tÿh^#¡Ü±%‰Ã$Å#º¡/¸D‰Ø÷êÁú‰ÙÁù)Êر%’’’’’’’’’Á⠉Ø)Уܱ%‹À±%ë$‹¡Ì±%‰‰̱%‰À±%ƒì ÿrÿRƒÄ‰Ú…Òt‹B ;ر%;ر%uƋB;ܱ%~»ƒ=Œ^#uƒ=l^#tÿl^#ÿ -Œ^#‹]üÉÃU‰åWVSƒì‹uhtÔ"j@èØ -ƒÄƒ>t,ƒì h™9#èß »ÿÿƒÄ¿@¹C°8‰ÊîˆØ‰úîëaƒì hµ9#è³ ‹N‰ -ȱ%ɍA‰ÂÁâ‰Ñ)ÁºÓMb‰È÷âƒÄ‰ÑÁéu¹f‰ -`»%‰Ë¿@¹C°4‰Êî‰úˆØî‰ØfÁèî‹£Ô±%ƒ=ÄA&~»A¹C°p‰ÊÚîîÆı%ë%Æı%»B¹C°°‰ÊÚîîºa°îº!ì%þî¹¾²%»²%ƒùbIÁà²%‰0I‰LÃAƒùc~ßÇH»%Ç̱%²%Çh^#Çl^#¡È±%€€€Áà£$Å#Çܱ%Çر%Çà±%Çä±%fÇб%ƒ=Ô±%uǤá#dË"Ǩá#üË"ëÇ¤á#LÌ"Ǩá#ØÒ"eô[^_]ÃU‰å‹E£h^#]ÍvU‰å‹E£l^#]ÍvU‰å‹E£x^#]ÍvU‰åWVSƒì ‹E‹U ‰Eè‰Uì¸ÿÿÿÿƒ=̱%tl‹ -̱%‹£Ì±%‹E‰A‹Eè‰A ‹Eì‰A‹E‰A»‹À±%}è‹uè됋…Òt‰ð;B  -;B u‹G;B~‰Óëâ‰ö…Ût‰ ë‰ -À±%‰‹AƒÄ [^_]ÐU‰å‹E¹‹À±%됉ы…Òt;Buó¸ÿÿÿÿ…Òt$…Éu
-‹£À±%됋‰¡Ì±%‰‰̱%¸]ÃU‰åWVSƒì,‹E‹U ‰Eè‰Uì¸ÿÿÿÿƒ=̱%„q‹5̱%‹£Ì±%‹E‰F‹Eè‰F ‹Eì‰F‹E‰Fº‹À±%}è‹Mè됋…Ût‰È;C  -;C u‹G;C~‰Úëâ‰ö…Òt‰2鐉5À±%ƒ=d»%…ôƒìEàPjè3óÿÿ‹À±%ƒÄ‹Eà;B  -;B u‹Eä;B~ÇEÜÇEØëK}؋À±%Mà‹B;A|‹B +Eà‰E؉Ћ@+Aë ¡À±%‹@ +EàH‰EØ¡À±%‹@+Eäʚ;‰G‹E؍€€€€€€Áà‰EԋMÜ¿ÓMb‰È÷ïÁúÁù)ÊUԍҍB‰ÂÁâ)‰Ð÷çÁê¸ðúðw¸ÈúÇv‰Ðº@îfÁèFeô[^_]ÃU‰åWVSƒì¶ı%ƒøtƒø…Àt
-ë,ƒøtë%¹@°ë#v¹A°ëv¹B°ë v»ë"ºCÐî‰Êì¶ØìˆÁ‰ÊÁâf¶Ã‰Ó Ãf‹б%f)Ú·Ò‰Ö5à±%¹×®¬]‰È÷î‰ÑÁù‰ðÁø)Á -ä±%‰AÁà)ȍÁ‰ÁÁá ȉò)‰à±%f‰б%]荒’’ Õ¾m¶‰ð÷á‰Ö‰Ê)òÑê2‰ÁÁé
-¡ä±%ÀP‰ÐÁà)кè‰Ö™÷þ’’’щS¡ä±%ÀP‰ÑÁá)ѺÓMb‰È÷êÁú‰ÈÁø)‰Uè‹s¿ƒÞC‰ð÷ï‰ÑÁù‰ðÁø)Á‰ÈEè‰ðÁú‰ñÁù)ʍ’’’’’’Áâ)Ѝ€€€Áà‰Cƒ=À±%„/Çd»%‹À±%‹Eè;B ;B …Œ‹C;BŽ€ƒ=Œ^#uƒ=h^#tÿh^#ÿŒ^#‹À±%ë#‹¡Ì±%‰‰̱%‰À±%ƒì ÿrÿRƒÄ‰Ú…Òt‹B ;Eè -;EèűB;Eì~ă=Œ^#uƒ=l^#tÿl^#ÿ -Œ^#¶ı%ƒøt"ƒø …Àt -ë/vƒøtë%¹@°ë#v¹A°ëv¹B°ë v»ë"ºCÐî‰Êì¶ØìˆÁ‰ÊÁâf¶Ã‰Ó Ãf‹б%f)Ú·Ò‰Ö5à±%¹×®¬]‰È÷î‰ÑÁù‰ðÁø)Á -ä±%‰AÁà)ȍÁ‰ÁÁá ȉò)‰à±%f‰б%]荒’’ Õ¾m¶‰ð÷á‰Ö‰Ê)òÑê2‰ÁÁé
-¡ä±%ÀP‰ÐÁà)кè‰Ö™÷þ’’’щS¡ä±%ÀP‰ÑÁá)ѺÓMb‰È÷êÁú‰ÈÁø)‰Uè‹s¿ƒÞC‰ð÷ï‰ÑÁù‰ðÁø)Á‰ÈEè‰ðÁú‰ñÁù)ʍ’’’’’’Áâ)Ѝ€€€Áà‰C‹À±%‹Mè;J 
-;J u;B~ÇEäÇEàëJ]à‹À±%Mè‹B;A|‹B +Eè‰Eà‰Ð‹@+Aë ¡À±%‹@ +EèH‰Eà¡À±%‹@+Eìʚ;‰C‹Eà€€€€€€‰ÆÁæ‹Mä»ÓMb‰È÷ëÁúÁù)ʍ2ҍB‰ÂÁâ)‰Ð÷ãÁê¸ðúðw¸ÈúÇv‰Ðº@îfÁèîÇd»%ë -‰öº@°î°ðîeô[^_]ÐU‰åVSƒì‹E»¹‹À±%ëv‰Ñ‹…Òt;Buó¸ÿÿÿÿ…Ò„I…Éu‹£À±%»ë‹‰¡Ì±%‰‰̱%ƒ=d»%…ƒ=À±%uº@°î°ðéû‰ö…Û„òƒìEðPjèºìÿÿ‹À±%ƒÄ‹Eð;B  -;B u‹Eô;B~ÇEìÇEèëJ]è‹À±%Mð‹B;A|‹B +Eð‰Eè‰Ð‹@+Aë ¡À±%‹@ +EðH‰Eè¡À±%‹@+Eôʚ;‰C‹E荀€€€€€‰ÆÁæ‹Mì»ÓMb‰È÷ëÁúÁù)ʍ2ҍB‰ÂÁâ)‰Ð÷ãÁê¸ðúðw¸ÈúÇv‰Ðº@îfÁèeø[^]Éöú‹D$¼(Õ#PèŒëÿÿ`fff f¨f¸0ŽØŽÀ° º î¡t^#@£t^#1ÛfŒÓü¡Ô±%ƒøtèùòÿÿëè6ùÿÿ°
-º îì¨t ¸@Pè–ÿÿÿf¡|^#f9‚^#t f£‚^#ÿ-~^#ƒ=x^#t‹x^#ÿÓf©f¡ffaωöU‰å‹EØf£‚^#f£|^#]Ã1ÀÈÃU‰åf¸0ŽØŽÀ‹Ef;‚^#t f£‚^#ÿ-~^#]ÉöU‰åƒìjjjj@èaƒÄÉÃU‰åWVSƒì ‹]‹u ‹}聉€:y"…Ût‹B8‰…öt‹BÁà
-‰…ÿt)‹B4‰ë"‰ö…ÛtÇ…öt‹BÁà
-‰…ÿtÇ@ƒ}t ‹BÁà
-‹U‰ƒÄ [^_]ÍvU‰åƒìjjjj@è̓Ä·@0ÉÃU‰å¡8\#]ÉöU‰å]ÍvU‰åSƒì‹8\#誃ì Sèucÿÿè ƒÄ‹]üÉÃU‰åWVS‹M ‹u‹}Š]‰ÈÁàeèÿÿ Eè‰ÈÁèUèˆBáÿbÿÿÿ J‰ðˆB‹Ef‰Eè‹EÁè‰EäŠEäƒà ÃË@¶ÃÁàbÿÿÿ Bçüÿ=*\#‹‰‹B‰G[^_]ÐU‰åWVSƒì ‹] ‹u‹}·EMè*\#‹‰‹@‰A‰Ê¶JÁá¶B ÁÁá·B Á…ÛtŠBƒà¶ÐÁâ·Eè Љ…ötŠE툅ÿt
-ŠEî%ðˆ‰ÈƒÄ [^_]ÉöU‰å‹E ¶UÁâ¹@_#fÇD
-8ƂE_#îƂD_#f‰
-Áèf‰D
-]ÍvU‰åº °îº!°@î°î°î°ÿ°°pî°î°î°ÿî]ÐU‰åº °îº!°î°î°î°ÿ°°pî°î°î°ÿî]ÐU‰å‹Mf…ÉtWfƒùw¸Óà
-ˆ^#ë7fƒùw<·Éƒé¸Óà
-‰^#¢‰^#º¡î<ÿu ˆ^#©uƒÈ¢ˆ^#º!î]ÃU‰å‹Mf…ÉtUfƒùw¸þÿÿÿÓÀ"ˆ^#ë5fƒùw:·Éƒé¸þÿÿÿÓÀ"‰^#¢‰^#º¡î ˆ^#©t%û¢ˆ^#º!î]ÉöU‰å¿|^#]ÃU‰åƒì‹Ef£|^#˜PèWüÿÿƒÄÉÐU‰å¿|^#]ÃU‰åƒì‹E‰Âf£|^#ƒ=Œ^#uƒì ¿ÂPèüÿÿƒÄÉÐU‰åWVì¾¹”^#ºÔ^#‰öµÇ”Ü"Ç”Ü"Fƒþ~åƒì EÈPèÅèºÇÀA&:#‹EÈ£ÄA&¶^#£ÈA&ƒÄ‹EУÐA&‹EÔ£ÔA&‹EØ£ØA&h=Þ"jè£ýÿÿƒÄhGÞ"jè”ýÿÿƒÄhQÞ"jè…ýÿÿƒÄhXÞ"jèvýÿÿƒÄh_Þ"jègýÿÿƒÄhfÞ"jèXýÿÿƒÄhmÞ"jèIýÿÿƒÄh³Þ"jè:ýÿÿƒÄhtÞ"jè+ýÿÿƒÄh{Þ"j èýÿÿƒÄh‚Þ"j
-è -ýÿÿƒÄh‰Þ"j èþüÿÿƒÄhÞ"j èïüÿÿƒÄh—Þ"j -èàüÿÿƒÄhžÞ"jèÑüÿÿƒÄh¥Þ"jèÂüÿÿƒÄh¬Þ"jè³üÿÿƒÄhlÝ"jAè¤üÿÿƒÄhtÝ"jBè•üÿÿƒÄh|Ý"jCè†üÿÿƒÄh„Ý"jDèwüÿÿƒÄhŒÝ"jEèhüÿÿƒÄh”Ý"jFèYüÿÿƒÄhœÝ"jGèJüÿÿƒÄh¤Ý"jpè;üÿÿƒÄh¬Ý"jqè,üÿÿƒÄh´Ý"jrèüÿÿƒÄh¼Ý"jsèüÿÿƒÄhÄÝ"jtèÿûÿÿƒÄhÌÝ"juèðûÿÿƒÄhÔÝ"jvèáûÿÿƒÄhÜÝ"jwèÒûÿÿf -4A&€¾ƒÄvÀÅ ½%ƒì jh‰hØPõ·ÀPèúÿÿƒÄ Fþš~ǃì hÐèFùÿÿƒÄÛãݵTÿÿÿ›¿@A&µTÿÿÿ¹üó¥ ÀƒÈ""ÀÛãèƒûÿÿèúÿÿeø^_]ÍvU‰åSƒìº!°ÿîè’ûÿÿ¹@ºC°6Êîîƒ=ÄA&~¹AºC°tî°‰Êî°ë»B¹C°°‰ÊÚîîºaî‹]üÉÃU‰å‹U‹E ‰•Ô^#]ÉöU‰å‹U‹E ‰•”^#]ÉöU‰åƒìhà9#è
-è— ƒÄÉÉöœX‰Á5PœX9ÈtQ¸Ã¸ÜX‰Á5 PœX1ÈtQ¸øÃf1Àžf¸f»öóŸ€üu¸øÃƐ^#Ûã¹âþfÇ’^#ZZÝ=’^#¹âþf¡’^#<u+Ù=’^#¹âþf¡’^#f%?fƒø?uƐ^#Ɛ^#Éö`¸ëp`¸ëh`¸ë``¸ëX`¸ëP`¸ëH`¸ë@`¸ë8`¸ ë0`¸
-ë(`¸ ë `¸ ë`¸ -ë`¸ë`¸ë ¨Pf¸0ŽÀŽØüX1ÛfŒÓP‹…”^#ÿÓ[° ƒûrº îº îf¡|^#f;‚^#t f£‚^#ÿ-~^#©¡aϸ鋸選ëz¸ës¸ël¸ëe¸ë^¸ëW¸ ëP¸
-ëI¸ ëB¸ ë;¸ -ë4¸ë-¸ë&¸ë` ¨f¸0ŽÀŽØüèש¡aÏPf¸0ŽØŽÀXfŒÓ‹=*\#ß1ۊŠ_Áãf‹_ÜfŒÒfŒÛŽÓSRPÿ…Ô^#ƒÄX[ŽÐ)ÜÏU‰åWVSƒì ‹u¸¹ ‰÷üó«è|ýÿÿ…ÀtÇëUèŠýÿÿ…Àt7ÇFǸ¢‰^‰N‰V …Àt+¸¢‰F‰^‰N‰V ëÇècýÿÿ…ÀtÇ ƒÄ [^_]ÍvU‰åWV¿_#È·À-yƒÀÁø9ÂtU¿_#@ÀÝ4Ō½%›È·À-yƒÀÁøf£_#¿5_#¿B&4v4ö4õŒ½%¹üó¥Ý%B&^_]ÉöU‰å¿_#]ÃU‰åWVSƒì(ŠM¡_#Áà ˜€ f¶nB&f£*Õ#f¶mB&f£,Õ#€ù t%€ù €ù„óé‰ö€ù
-„#é‰öfƒ*Õ#·*Õ#;pB&Œ½fÇ*Õ#·,Õ#¡tB&H9Â…¿¡pB&H‰Eì‰Uèf¾lB&Áâf‰Uò¡_#Áà °€ ¿;}è:¹;Mì*_ÿv‰ø¯pB&È·F‰Ø¯pB&Èf‰FA;Mì~ÜG;}è~ƹ;MìKWÿ‰Ð¯pB&Èf‹]òf‰FA;Mì~çé)‰öfÇ(Õ#·*Õ#‰Áƒø~ºƒÂ·ÂƒÀ9È|óf‰(Õ#f¡(Õ#f£*Õ#éævfÇ*Õ#·,Õ#¡tB&H9Â…¾¡pB&H‰Eà‰UÜf¾lB&Áâf‰Uæ¡_#Áà °€ ¿;}Ü=v¹;Mà*_ÿv‰ø¯pB&È·F‰Ø¯pB&Èf‰FA;Mà~ÜG;}Ü~ƹ;MàGWÿ‰Ð¯pB&Èf‹]æf‰FA;Mà~çé%‰öfÿ -*Õ#·*Õ#·,Õ#¯pB&ÂÆS fÿ*Õ#éõ‰ö·*Õ#·,Õ#¯pB&Ј Cfÿ*Õ#·*Õ#;pB&Ž¿fÇ*Õ#·,Õ#¡tB&H9Â…š¡pB&H‰EԉUÐf¾lB&Áâf‰UÚ¡_#Áà °€ ¿;}Ð=v¹;MÔ*_ÿv‰ø¯pB&È·F‰Ø¯pB&Èf‰FA;MÔ~ÜG;}Ð~ƹ;MÔ'Wÿ‰Ð¯pB&Èf‹]Úf‰FA;MÔ~çëfÿ,Õ#·5*Õ#·=,Õ#‰øf¯pB&f‰EΡ_#Áà fEÎfuλÔ°‰Úî¹Õ‰ÊŠEÎî°‰Úîf‹EÎfÁè‰Êî‰óˆnB&‰ø¢mB&ƒÄ([^_]ÐU‰åWVSƒì‹u‹} ‰øf¯pB&f‰Eò¡_#Áà fEòfuò»Ô°‰Úî¹Õ‰ÊŠEòî°‰Úîf‹EòfÁè‰Êî‰ð¢nB&‰úˆmB&ƒÄ[^_]ÍvU‰åS¹Ô°
-‰Êî»Õ‰ÚŠEî° ‰Êî‰ÚŠE î‹$ÉÍvU‰åWVSƒìf¾EÁàf‰Eò¡_#Áà ¸€ ‹]ë0‹M ;M(sÿ‰Ø¯pB&È·G‰ð¯pB&Èf‰GA;M~ÜC;]~ʋM ;MSÿv‰Ð¯pB&Èf‹]òf‰GA;M~çƒÄ[^_]ÍvU‰åWVSƒì ¡pB&H‰Eð‹tB&K‰]ìf¾lB&Áàf‰Eê¡_#Áà °€ ¿9ß<‰ö¹;Mð*_ÿv‰ø¯pB&È·F‰Ø¯pB&Èf‰FA;Mð~ÜG;}ì~ƹ;MðWÿ‰Ð¯pB&Èf‹]êf‰FA;Mð~çƒÄ [^_]ÍvU‰å·J‰pB&¶„@£tB&¶„ÿ ¢lB&¶P¢nB&¶Q¢mB&¶`¢/Õ#¶a¢.Õ#Ç_#Ç_#]ÃU‰åWVSƒì nB&¢P mB&¢Q¶ÀP¶nB&PèŠýÿÿ¶.Õ#¶5/Õ#ƒÄ¹Ô°
-‰Êî¿Õ‰úˆØî° ‰Êî‰ú‰ðîeô[^_]ÍvU‰åSƒì‹]€;tŠCƒì ¾ÀPèiùÿÿƒÄ€;ué‹]üÉÃU‰åVS‹E‰ÃÁã £_#¹Ô° -‰Êî¾Õ‰òˆØî° ‰Êî‰ØfÁè‰òî[^]ÃU‰åVS‹u‹_#Áâ»@Õ#¶nB&‰¹`Õ#¶mB&‰
-µŠ¢nB&Š
-¢mB&‰5_#[^]ÃU‰å¡_#]ÉöU‰å¡_#]ÉöU‰åWVSƒì ‹}f¾u Áæf¾E Ƌ]‹E9Ã3v‹M9ù#‰Ê¯pB&¡_#Áà ÐØf‰´€ A9ù~ÞC;]~ЃìÿuÿuèüÿÿŠE¢mB&ŠE¢nB&ƒÄeô[^_]ÍvU‰åWVSƒì ¡pB&H‰Eð‹=tB&Of¾lB&ÁãƒË ¾9Æ4¹9ù%v‰Ê¯pB&¡_#Áà Ððf‰œ€ A9ù~ÞF;uð~̃ìjjèûÿÿÆmB&ÆnB&ƒÄeô[^_]ÍvU‰åS‹U ‹]‹M¯pB&¡_#Áà ÂU”€ ˆ
-ˆZ‹$ÉÉöU‰åS‹E ‹]‹M‰Â¯pB&¡_#Áà ÂU”€ ¶B…Étˆ¶‰Â…Ûtˆ¾Â‹$ÉÐU‰åS‹E ‹MŠ]‰Â¯pB&¡_#Áà ÂU”€ €9tŠˆABˆB€9uò‹$ÉÐU‰åƒìh:#èTýÿÿôƒÄÉÉöU‰åƒìjèƒÄÉÉöU‰åƒìh4èƒÄÉÍvU‰åVS‹Ef£r¹d»þ¾v‰Êì©t Fþÿÿ~í¸@=Ÿ†~ø‰ÚˆÈö@=Ÿ†~øë‰öU‰åSƒìE Pÿuh€Õ#èX‰ÃÇ$€Õ#è¢üÿÿ‰ØƒÄ‹]üÉÃU‰åWVSìð‹} ŠEˆ…ÿÿÿEPÿuÿÿÿSè‰ÆS¾…ÿÿÿPWÿuè±þÿÿ‰ðƒÄ eô[^_]ÃU‰åSƒìE Pÿuh€×#謉ÃÇ$€×#è&üÿÿ‰ØƒÄ‹]üÉÃU‰åS‹M‹U ‰Ë€:tvŠˆBA€:uõƉ؋$ÉÍvU‰åVS‹]‹U ‹M‰Þë‰öŠˆBC€:t‰ÈI…ÀîƉð[^]ÐU‰å‹U‹M ë -¸€:tBAŠ:t)Ð]ÃU‰åS‹U‹] ‹M…Éëv¶¶Sÿ)Ð됊C8uíŠB„ÀtIu︋$ÉÐU‰å‹U¸€:tB@€:uù]ÍvU‰åS‹E‹] €8t‰Ú€:tŠv:
-tB€:uö@€8u下$ÉÉöU‰å‹E‹U €8t ‰ö8t @€8uö¸]ÍvU‰åS‹]‰Ú€;t‰öŠ
-AŸ<wAàˆB€:uì‰Ø‹$ÉÐU‰åS‹]‰Ú€;t‰öŠ
-A¿<wA ˆB€:uì‰Ø‹$ÉÐU‰åS‹U‹M ‰Ó€;tvB€:uú늈AB€9uõƉ؋$ÉÍvU‰åWVSƒì<‹u‹]ÇEèÇEäÇEàÇEÜÇEØÇEÔÇEпÇEÌÙîÝ]À‰uì‹E €8„D‹U €:%t…ÿuŠˆB‰U FÿEèév‹E €8%u%@‰E ¿ÇEä
-ÇEàÇEØÇE̋U ¾ƒè%ƒøS‡Ñÿ$…€)#‰öÆ%FÿEè鼃ÉòFŠCüˆÿEè驐ƒ}Øt"ƒ}؃}Øtëƒ}ØuƒÃ‹Cü‰EÔë -vƒÃ¿Sü‰Uԃì ÿuÌÿuäj
-VÿuÔè¾ éœƒ}Øt"ƒ}؃}Øtëƒ}ØuƒÃ‹Cü‰EÐë -vƒÃ·Sü‰UЃì ÿuÌÿuäj
-VÿuÐè.éPƒ}Øt"ƒ}؃}Øtëƒ}ØuƒÃ‹Cü‰EÐë -vƒÃ·Sü‰UЃì ÿuÌÿuäjVÿuÐèâ鐃ËCü‰EЃì jÿuäjVPèÂé䐃ËSü€:tŠˆBFÿE܀:uò‹UÜUèévƒ}Øtƒ}؃}Øtëƒ}Øu ƒÃÝCøÝ]ÀƒìÿuÌÿuàÿuäVÿuÄÿuÀèYë~vƒ}Øtƒ}؃}Øtëƒ}Øu ƒÃÝCøÝ]ÀƒìÿuÌÿuàÿuäVÿuÄÿuÀè} -ë>vƒ}Øtƒ}؃}Øtëƒ}Øu ƒÃÝCøÝ]ÀƒìÿuÌÿuàÿuäVÿuÄÿuÀèa‰EÜEèÆ¿ƒÄ é±ÇEØé¥ÇEØ陃MÌ鐍vƒMÌ鄍v¿ƒMÌëvƒÿu?ƒìEìPj
-ÿu èb
-‰EäƒÄ‹E €80u ÷EÌtƒMÌ됃MÌ‹UìJ‰U ë4vƒÿu,ƒìEìPj
-ÿu è
-‰Eà‹EìH‰E ¿ƒÄë‰ö¿ÿE ‹U €:…¼üÿÿÆ‹Eèeô[^_]ÉöU‰åƒì EPÿu ÿuè7üÿÿƒÄÉÉöU‰åWVSƒì,‹u‹} ‹]ÇEìÇEèÇEäÇEàÇEÜÇEØÇEÔÇEЉuð€?„>€?%tƒ}Ôu ŠˆGFÿEìëá€?%uGÇEÔÇEè
-ÇEàÇEоƒè%ƒøS‡çÿ$…Ð*#Æ%FÿEìéԃÉòFŠCüˆÿEìéÁƒ}àt&ƒ}àƒ}àt
-ë"ƒ}àt
-ëƒÃ‹CüëƒÃ‹CüëƒÃ¿Cü‰E܃ì ÿuÐÿuèj
-VÿuÜè鏐ƒ}àt&ƒ}àƒ}àt
-ë"ƒ}àt
-ëƒÃ‹CüëƒÃ‹CüëƒÃ·Cü‰E؃ì ÿuÐÿuèj
-ëBƒ}àt&ƒ}àƒ}àt
-ë"ƒ}àt
-ëƒÃ‹CüëƒÃ‹CüëƒÃ·Cü‰E؃ì ÿuÐÿuèjVÿuØè6‰EäEìÆÇEÔƒÄ éҍvƒÃ‹Sü€:tŠˆBFÿEä€:uò‹EäEì飍vÇEàé›ÇEà鏃MÐ醍vƒMÐë}‰öÇEÔƒMÐënvƒ}Ôu6ƒìEðPj
-W蓉EèƒÄ€?0u ÷EÐtƒMÐ됃MЋ}ðOë1‰öƒ}Ôu)ƒìEðPj
-WèW‹}ðOÇEÔƒÄë
-vÇEÔGé¼ýÿÿvÆ‹Eìeô[^_]ÉöU‰åƒì EPÿu ÿuèGýÿÿƒÄÉÉöU‰åWVSƒì,‹}‹uÇEèÇEäÇEàÇEÜÇEØ»‰}ì饐‹U €:%t…Ûu B‰U 鏍v‹E €8%u%@‰E »ÇEäÇEàÇEÜÇE؋U ¾ƒè*ƒøN‡Eÿ$… ,#‰öƒû…8ƒìEìPj
-ÿu èN‰E܃MØ‹EìH‰E ƒÄéŠGƒÆ‹^üˆëÝØÿEèéõƒÆ‹^üëG€?tƒì ¾PèBƒÄ…ÀuçÇEÔë#‰ö÷EØuŠˆCë‹UÜ9UÔ}ŠˆCÿEÔG€?tƒì ¾PèþƒÄ…ÀtÇÆ덉öƒìh(:#Wè&÷ÿÿ‰ÇƒÄ EìPj
-WèՉ‹}ìƒÄƒ}à…Wƒ}ät)ƒ}ä ƒ}ätéCÿÿÿƒ}ä…9ÿÿÿƒÆ‹Fü‰é,ÿÿÿƒÆ‹Füf‰éÿÿÿ‰öƒìh5:#Wè¶öÿÿ‰ÇƒÄ EìPj
-됃ìh@:#Wèšöÿÿ‰ÇƒÄ EìPjWè ‹}ìƒÄƒ}à…̓}ät+ƒ}ä -ƒ}äté¹þÿÿ‰öƒ}ä…­þÿÿƒÆ‹Vü‰é þÿÿƒÆ‹Vüf‰é‘þÿÿ‰öƒìhX:#Wè*öÿÿ‰ÇƒÄEìPWè;‹}ìƒÄƒ}àu`ƒ}ät)ƒ}ä ƒ}ätéMþÿÿƒ}ä…CþÿÿƒÆ‹FüÝé8þÿÿƒÆ‹FüÙé*þÿÿvÇEäë vÇEäëvÇEàëÝؐ»ÿE ‹E €8…Pýÿÿ‹Eèeô[^_]ÐU‰åƒì EPÿu ÿuèïüÿÿƒÄÉÉöU‰åWVSƒì,‹u ÇEп‹Eƒð‰EԋU‰U̅Òy‰Ñ÷ىM̃}y ‹E…Ày÷Ø됋E÷EÔu ƒ}yƒ}yGƒ}u‹EÐÆD(Ø0@‰EÐë8v…Àt1U؉Uȉöƒì º÷ủÃRèI‹MȋUЈ
-B‰UЉ؃Ä…Àu×}ЋEԃàƒøu‰ú;}} -‰öÆ FGB;U|õƒ}y ƒ}yÆ-ë ÷EÔtÆ+F‹Eԃàƒøu‰ú;}} Æ0FGB;U|õ‹UÐJx M؊
-ˆFJy÷‹Eԃàƒøu‰ú;}} Æ FGB;U|õƉøeô[^_]ÃU‰åƒì‹Eÿuÿu÷ØPÿu ÿuèŸþÿÿƒÄ ÉÉöU‰å‹E…Ày÷Ø]ÉöU‰åSƒì‹]èÁîÿÿƒì SèE ÿÿU‰åWVSƒì‹M‹} ÙîÙÀÙ軀9-u ¾ÿÿÿÿë
-‰ö¾ëA€90túŠƒè0< w(Ý`-#ëÙˍv¾ƒè0AÜËÙËPÚ$XŠƒè0< vâÝۀ9.u9AŠƒè0< w/Ý`-#ëÙÉÙʉö¾ƒè0AÜÊÙÊPÚ$ÙÉXØʊƒè0< vÝÝÚÙÉÞùÞÁVÚ $^€9et €9E…“A€9-u
-¾ÿÿÿÿAë‰ö€9+u ¾Aëv¾Šƒè0< weÝ`-#¾ƒê0A·ÃÙÀPÚ $Ù}ð‹]ðÆEñ Ùmð‰]ðÛ]ìÙmð‹Eì·À‰$Û$‰$Ú$ZÙ}ð‹UðÆEñ Ùmð‰UðÛ]ìÙmð‹Eì‰ÃŠƒè0< v£Ý؅ö~!ºf…Ût4Ý`-#·Ã‰öÜÉB9Â|ùëvº·Ã‰Ã9Â}Ý`-#ÜùB9Ú|ùÝ؅ÿt‰ƒÄ[^_]ÐU‰åWVSƒì ‹]‹} ÇE쾀;-u ÇEðÿÿÿÿCë‰ö€;+u ÇEðCëÇEð€;0u>C€;0túë6ƒì ¾PCè‰ÂƒÄ9ú…Òy
-¸ëEv‰ð¯÷Ö9ð~ÇEìƒìW¾P聃ąÀu¶ƒ}t‹E‰ƒ}ìt¾ÿÿÿ¯uð‰ðeô[^_]ÉöU‰åWVSƒì ‹]‹} ÇEð¾€;0uC€;0tú€;xuKƒÿuFC€;0u@‰öC€;0túë6ƒì ¾PCè_‰ÂƒÄ9ú…Òy
-¸ëAv‰ð¯÷Ö9ðvÇEðƒìW¾PèуÄ…Àu¶ƒ}t‹E‰ƒ}ðt¾ÿÿÿ‰ðeô[^_]ÉöU‰åŠUBÐ< w ¾Âƒè0ë&vB¿<w ¾Âƒè7됍BŸ<w ¾ÂƒèW됾Â]ÍvU‰å‹Uƒú w B0¾À됍BöƒøwB7¾Àë¾Â]ÍvU‰åŠUƒê0¸€ú –À]ÉöU‰åŠUBÐ<vBŸ<w¸ë¸]ÐU‰åŠU€ú/~‹E  _#:Pÿ¸ë¸]ÐU‰åŠUBŸ<w Bà¾Àëv¾Â]ÍvU‰åŠUB¿<w B ¾Àëv¾Â]ÍvU‰åVS¾ƒì ¾]Sè%ƒÄ…Àuƒì Sè5ÿÿÿƒÄ…Àt¾‰ðeø[^]ÃU‰åŠUƒêA¸€ú9–À]ÉöU‰å¸€}/žÀ]ÍvU‰åŠUƒêa¸€ú–À]ÉöU‰åŠUB÷<v
-¸€ú u¸]ÉöU‰åŠUƒêA¸€ú–À]ÉöU‰åWVSƒì ÝEÝUè‹]‹}ÇEäSd$øÝ$èoƒÄ…Àtƒì Sè·îÿÿƒÄéPvÙîÝEèÚéßà€äE€üu Æ-C€uï€ë÷EtÆ+CÿEäÝh-#ÝEèÚéßà€äE€üuÆ0ÆC¸éû‰öÙèÝEèÝáßà€äE€üu3¾Ýéßà€äE€üuHÝx:#ÝEèØÉÝUèNÝêßà€äE€ütëÝØë)vÝØÝؾÝx:#ÝEèë ÝEèØñÝUèFÝéßàöÄtîÝ؃ì Vè÷ùÿÿƒÄƒøc~ƒïë‰öƒø ~ƒïë‰ö…ö~Oƒì‹EƒÈPÿuWSÿuìÿuèèUEäƒÄ …öu‹Eäë;‰ö]äÆeCƒì jºgfff‰ð÷êÁú‰ðÁø)ƒÂRj
-SVè\ùÿÿ‹UäD‰EäƒÄ eô[^_]ÍvU‰åWVSìŒÝEݝþÿÿ‹]Dž€þÿÿ½¸þÿÿ¹K¸üó«ƒìSÿµ”þÿÿÿµþÿÿ貃ąÀtƒì SèúìÿÿƒÄé‰öÙî݅þÿÿÚéßà€äE€üuÆ-C€µ—þÿÿ€ëv÷Et
-Æ+Cÿ…€þÿÿƒì…˜þÿÿPÿµ”þÿÿÿµþÿÿèþݝpþÿÿ‹…pþÿÿ‹•tþÿÿ‰Æ‰×DžŒþÿÿƒÄ݅˜þÿÿÙèÙÉÝáßàöÄ…ø重vh$@jÿµœþÿÿÿµ˜þÿÿè$݅˜þÿÿÜ5p-#ݝ˜þÿÿÙ½´þÿÿ‹´þÿÿƅµþÿÿ Ù­´þÿÿ‰´þÿÿß½¨þÿÿÙ­´þÿÿ‹…¨þÿÿ‰$èûÿÿ‹•Œþÿÿˆ„*¸þÿÿB‰•ŒþÿÿƒÄ݅˜þÿÿÙèÙÉÚéßàöÄ„oÿÿÿ‹•Œþÿÿ•€þÿÿ‰ÑI…¸þÿÿ‰…|þÿÿë‰ö‹•|þÿÿŠˆCI‹•Œþÿÿƒê‰ÐÁèH!Â9Ñ}ޅÉx‹Œþÿÿƒéx
-vÆ0CIyùÆëÝØÝØÆ0Cÿ…€þÿÿÝ€:#‰µpþÿÿ‰½tþÿÿ݅pþÿÿÚéßàöÄE…\‹E@9…€þÿÿLÆ.Cÿ…€þÿÿ‹Eƒà‰…ˆþÿÿDž„þÿÿDžŒþÿÿv‰µpþÿÿ‰½tþÿÿ݅pþÿÿ܈:#Ü -p-#ݝpþÿÿ‹µpþÿÿ‹½tþÿÿƒì…˜þÿÿPWVèݝpþÿÿ‹•pþÿÿ‹tþÿÿ‰Ö‰Ï݅˜þÿÿÙ½´þÿÿ‹´þÿÿƅµþÿÿ Ù­´þÿÿ‰´þÿÿ۝¤þÿÿÙ­´þÿÿ‹…¤þÿÿƒÄ…Àtƒ½ˆþÿÿu
-Džˆþÿÿƒì PèÓùÿÿˆCÿ…€þÿÿÿ…ŒþÿÿƒÄƒ½ˆþÿÿt‹E9…Œþÿÿ~
-Dž„þÿÿ‹•€þÿÿ9U}
-Dž„þÿÿƒ½„þÿÿ„ýþÿÿKë
-‰öÿ€þÿÿ‰Ã€;0u Cÿ€{ÿ.uêCÆ‹…€þÿÿeô[^_]ÃU‰åWVSƒì‹]‹u ‹}WVSèZƒÄ…Àtƒì Wè¢éÿÿƒÄéñ‰öÙî‰]è‰uìÝEèÝáßàÝـäE€üuÙàëvÝ؉]è‰uìÝEèÝx-#ÙÉÝáßàÝـäE€üuÝØÆ0ÆG¸雺ÙèÙÉÝáßà€äE€üu/Ýáßà€äE€üu?Ýx:#ëÙɐÜÉÙÉJÝâßà€äE€ütìÝØëvÝÙÝx:#ë‰öØñÙÉBÙÉÝáßàöÄtðÝØÝ؍BƒøvƒìÿuÿuÿuWVSèÔùÿÿë‰öƒìÿuÿuÿuWVSèXûÿÿƒÄ eô[^_]ÐU‰åƒìSÙ}ü›f‹Eüf -? f‰EøÙmø›ÝEÙüÝ]ð›‹Uð‹Mô‹]‰‰KÝEÜeðeì›ÛâÙmü›[ÉÍvU‰åƒì‹E‹U ‰Eø‰Uü‹MUøf‹BfÁè%ÿ=ÿt¸ëk÷Bÿÿuƒ:t…Étƒìh:#QèDçÿÿƒÄ¸ë@‰ö€zy…Étƒìh”:#Qè çÿÿƒÄ¸ë‰ö…Étƒìh™:#QèçÿÿƒÄ¸ÉÃU‰åƒì¸€Ù#ƒ=,_#tÿ,_#ÉÃU‰å‹E£,_#]ÍvU‰åƒì‹E‹U ‰Eø‰UüUø¹f‹BfÁè%ÿ=ÿu÷Bÿÿuƒ}øt¹‰ÈÉÉöU‰åSƒì‹E ‹]ÆPè‰âÿÿ‰ØƒÄ‹]üÉÍvU‰åVSƒì ÝEÝUð‹]‹uVSd$øÝ$èvÝ]èƒÄƒ=0_#ÿtWƒìVSèYÿÿÿƒÄ…ÀuFƒìÿuôÿuðèDÿÿÿƒÄ…Àu1Ùî‰]à‰uäÝEàÚéßà€äE€ô@uƒì jVSÿuôÿuðè8ƒÄ ëvÝEèeø[^]ÉöÝD$ ÝD$Ùø›ßàžzøÝÙͶ¼'U‰åVSƒì0ÝE‹]‹u‹EÝUà‰]è‰uìPÿú‡Èÿ$•-#ÝØÇEغž:#ƒøc~º£:#‰UÜÇEðÇEôƒ=0_#„}ƒì EØP誃ąÀ…uƒ=0_#…Yƒìjh©:#éëvÝØÇEغ½:#ƒøc~ºÂ:#‰UÜÇEðÇEôƒ=0_#„ƒì EØPè>ƒÄ…À… ƒ=0_#…íƒìjhÈ:#év‰]à‰uäÝ]èÇEغÜ:#ƒøc~ºâ:#‰UÜÇEðÇEôƒ=0_#„žƒì EØPè˃ąÀ…–ƒ=0_#…zƒìjhé:#é ÝØÇEغþ:#ƒøc~º;#‰U܃=0_#uÇEðàÇEôÿÿïGé¸ -¡$_#‹(_#‰Eð‰Uôé¡ -‰öÝØÇEغ’<#ƒøc~º˜<#‰U܃=0_#uÇEðàÇEôÿÿïGéh -¡$_#‹(_#‰Eð‰UôéQ -‰öÝØÇEغ ;#ƒøc~º;#‰U܃=0_#uÇEðàÇEôÿÿïGé -¡$_#‹(_#‰Eð‰Uôé -‰öÝØÇEغ ;#ƒøc~º;#‰UÜÇEðÇEôéÑ ‰öÝØÇEغ—5#ƒøc~º;#‰U܃=0_#uÇEðàÇEôÿÿïÇë¡$_#‹(_#ò€‰Eð‰Uôƒ=0_#„óƒì EØPè ƒÄ…À…ëƒ=0_#…σìjh;#éaÝØÇEغ—5#ƒøc~º;#‰U܃=0_#uÇEðàÇEôÿÿïÇë¡$_#‹(_#ò€‰Eð‰Uôƒ=0_#„gƒì EØP蔃ąÀ…_ƒ=0_#…Cƒìjh;#éÕ -ÝØÇEغX5#ƒøc~º*;#‰U܃=0_#uÇEðàÇEôÿÿïÇë¡$_#‹(_#ò€‰Eð‰Uôƒ=0_#„Û -ƒì EØPèƒÄ…À…Ó -ƒ=0_#…· -ƒìjh.;#éI -ÝØÇEغX5#ƒøc~º*;#‰U܃=0_#uÇEðàÇEôÿÿïÇë¡$_#‹(_#ò€‰Eð‰Uôƒ=0_#„O -ƒì EØPè| -ƒÄ…À…G -ƒ=0_#…+ -ƒìjh.;#é½ ÝØÇEغ@;#ƒøc~ºC;#‰U܃=0_#uÇEðàÇEôÿÿïÇë¡$_#‹(_#ò€‰Eð‰Uôƒ=0_#„à ƒì EØPèð ƒÄ…À…» ƒ=0_#…Ÿ ƒìjhG;#é1 ÝØÇEغ@;#ƒøc~ºC;#‰U܃=0_#uÇEðàÇEôÿÿïÇë¡$_#‹(_#ò€‰Eð‰Uôƒ=0_#„7 ƒì EØPèd ƒÄ…À…/ ƒ=0_#… ƒìjhG;#é¥ ÝØÇEغY;#ƒøc~º`;#‰U܃=0_#uÇEðàÇEôÿÿïGéP ¡$_#‹(_#‰Eð‰Uôé9 ‰öÝØÇEغY;#ƒøc~º`;#‰U܃=0_#uÇEðàÇEôÿÿïGë¡$_#‹(_#‰Eð‰Uôƒ=0_#„a ƒì EØPèŽ ƒÄ…À…Y ƒ=0_#…= ƒìjhh;#éÏ
-vÝØÇEغ|;#ƒøc~º€;#‰U܃=0_#uÇEðàÇEôÿÿïÇë¡$_#‹(_#ò€‰Eð‰Uôƒ=0_#„å ƒì EØPè ƒÄ…À…Ë
-ƒ=0_#…¯
-ƒìjh…;#éA
-ÝØÇEغ|;#ƒøc~º€;#‰U܃=0_#uÇEðàÇEôÿÿïÇë¡$_#‹(_#ò€‰Eð‰Uôƒ=0_#„G
-ƒì EØPèt
-ƒÄ…À…?
-ƒ=0_#…#
-ƒìjh–;#éµ ÝØÇEغ©;#ƒøc~º¯;#‰U܃=0_#uÇEðàÇEôÿÿïÇë¡$_#‹(_#ò€‰Eð‰Uôƒ=0_#„Íƒì EØPèè ƒÄ…À…³ ƒ=0_#…— ƒìjh¶;#é) ÝØÇEغ©;#ƒøc~º¯;#‰U܃=0_#uÇEðàÇEôÿÿïÇë¡$_#‹(_#ò€‰Eð‰Uôƒ=0_#„/ ƒì EØPè\ ƒÄ…À…' ƒ=0_#… ƒìjhÉ;#靐ÝØÇEغÞ;#ƒøc~ºâ;#‰UÜÇEðÇEôƒ=0_#… ƒì EØPèòƒÄ…À…½ƒìjhç;#jèÚõÿÿèaõÿÿÇ!ƒÄ降vÇEغÞ;#ƒøc~ºâ;#‰U܃=0_#uvÇEðàÇEôÿÿïG‰]ЉuÔÝEÐÜ -H=#Ý]Ћ]ЋuÔÙîÙÉÚéßà€äE€ü…¯ƒìVSèjƒÄ‰]ЉuÔÝEÐÙÉÚéßà€äE€ü@„‡ÇEðàÇEôÿÿïÇét¡$_#‹(_#‰Eð‰Uô‰]ЉuÔÝEÐÜ -H=#Ý]Ћ]ЋuÔÙîÙÉÚéßà€äE€ü…6ƒìVSèñƒÄ‰]ЉuÔÝEÐÙÉÚéßà€äE€ü@„¡$_#‹(_#ò€‰Eð‰UôéòvÝØÇEغÞ;#ƒøc~ºâ;#‰UÜÇEðÇEôéÁ‰öÝØÇEغÞ;#ƒøc~ºâ;#‰U܃=0_#uÇEðÇEôë¡$_#‹(_#ò€‰Eð‰Uôƒ=0_#„ãƒì EØPèƒÄ…À…Ûƒ=0_#…¿ƒìjhÿ;#éQÝØÇEغÞ;#ƒøc~ºâ;#‰U܃=0_#uÇEðÇEôëÇEðÇEôøƒ=0_#„`ƒì EØP荃ąÀ…Xƒ=0_#…<ƒìj h =#éΉöÇEغ<#ƒøc~º<#‰U܃=0_#u6ÙîÙÉÚéßàöÄEuÇEðàÇEôÿÿïGém‰öÇEðàÇEôÿÿïÇéX‹ -$_#‹(_#‰Mð‰]ôÙîÙÉÚéßàöÄE„4‰È‰Úò€‰Eð‰UôéÝØÇEغ$<#ƒøc~º)<#‰U܃=0_#uÇEðÇEôëÇEðÇEôøƒ=0_#„Lƒì EØPèyƒÄ…À…Dƒ=0_#…(ƒìjh/<#麉öÇEغC<#ƒøc~ºH<#‰U܃=0_#uÝ]ðëÝØÇEðÇEôøƒ=0_#„Òƒì EØPèÿƒÄ…À…ʃ=0_#…®ƒìjhN<#é@ÝØÇEغc<#ƒøc~ºm<#‰UÜÇEðÇEôøƒ=0_#„iƒì EØP薃ąÀ…aƒ=0_#…Eƒìjhx<#é׍vÝØÇEغ‘<#ƒøc~º—<#‰UÜÇEðÇEôøƒ=0_#„ýƒì EØPè*ƒÄ…À…õƒ=0_#…Ùƒìjhž<#ékvÝØÇEغ³<#ƒøc~º¹<#‰UÜÇEðÇEôøƒ=0_#„‘ƒì EØP较ąÀ…‰ƒ=0_#…mƒìjhÀ<#éÿvÇEغ³<#ƒøc~º¹<#‰UÜÜ5P=#Ý]ðƒ=0_#„,ƒì EØPèYƒÄ…À…$ƒ=0_#…ƒìjhÕ<#隉öÇEغè<#ƒøc~ºî<#‰U܋ -$_#‹(_#‰Mð‰]ôÙîÙÉÚéßàöÄEtC‰È‰Úò€‰Eð‰Uôë1‰öÇEغè<#ƒøc~ºî<#‰U܍d$øÝ$jjè›Ý]ðƒÄƒ=0_#…jé|vÝØÇEغõ<#ƒøcŽ•ºø<#鋍vÝØÇEغ—5#ƒøc~uº;#ën‰öÝØÇEغ =#ƒøc~Yº=#ëR‰öÝØÇEغX5#ƒøc~=º*;#ë6‰öÝØÇEغ=#ƒøc~!º=#ë‰öÝØÇEغ@;#ƒøc~ºC;#‰UÜÇEðÇEôƒ=0_#„¯ƒì EØPèʃąÀ…•ƒ=0_#…‹ƒìjÿuÜjè§îÿÿƒÄ jhü<#jè–îÿÿƒÄëfÝØÇEغZ;#ƒøc~ºa;#‰U܃=0_#uÇEðàÇEôÿÿïGë¡$_#‹(_#‰Eð‰Uôƒ=0_#tƒì EØPè2ƒÄ…À…ýè²íÿÿÇ"éívÝØÇEغZ;#ƒøc~ºa;#‰U܃=0_#uÇEðàÇEôÿÿïGë¡$_#‹(_#‰Eð‰Uôƒ=0_#„‰ƒì EØP趃Ä…À…ƒ=0_#uiƒìjhi;#jè•íÿÿƒÄëSÇEغÞ;#ƒøc~ºâ;#‰UÜÝ]ðƒ=0_#ÿt ƒ=0_#uÇEðÇEôð?ë$‰öƒì EØPè@ƒÄ…ÀuèÄìÿÿÇ!ëÝØÝEðeø[^]ËT$â€‹D$%ÿÿÿ ЉD$ÝD$ÉöU‰å¸]ÉöÝD$ÙüÉö¼'U‰åWVSƒì ‹E ‰EðEƒEðƒeðøƒàø‰Eì‹Eð9EìsƒìjUhX=#hb=#è˜ ƒÄ‹Eð9Eì„Ä‹E‹…Û„·‹C;C rƒìj`hX=#hm=#è` ƒÄöCtƒìjahX=#h =#èC ƒÄöC tƒìjbhX=#hà=#è& ƒÄ‹Eì;CvL‹Eð;C sD‰Æ‹}ì;ss‹s;{ v‹{ 9÷wƒìjnhX=#h=#èæ ƒÄƒì‰ø)ðPVÿu蚃ċ…Û…Iÿÿÿeô[^_]ÐU‰åWVSƒì ‹u ‹E‹}‰ÂUƒÀƒàøƒâø9†ŒÇF‰F‰V ‹E‰F‰~ÇF‹MëF‰ö9óuƒìjlh>#h>#èX ƒÄ‹F ;Cv‹F;C sƒìjmh>#h@>#è1 ƒÄ‰Ù‹…Ût9{±9{u‹S +S‹F +F9Âwœ‰‰1eô[^_]ÃU‰åWVSƒì ‹]‹} …ÛuƒìjLhm>#hu>#èÙ
-ƒÄ…ÿuƒìjMhm>#h~>#è¾
-ƒÄƒÇƒçø‹3…ö„rvƒ~uƒ~t‹F;FsƒìjUhm>#hÀ>#è€
-ƒÄƒ~t‹F;F rƒìjUhm>#h ?#è[
-ƒÄ‹F +F9FvƒìjUhm>#h`?#è9
-ƒÄ‹F÷ЅE…åF‰Eð‹^…Û„ԍv÷Ãtƒìj^hm>#h ?#èø ƒÄöCtƒìj_hm>#hà?#èÛ ƒÄƒ;t9wƒìj`hm>#h @#è» ƒÄ;^ rƒìjahm>#h–>#èŸ ƒÄ9{rGv‹‰‹C)ø‰B‹Eð‰ë
-v‹‹Uð‰9~sƒìjwhm>#h­>#è\ ƒÄ)~‰Øë‰ö‰]ð‹…Û…/ÿÿÿ‹6…ö…‘þÿÿ¸eô[^_]ÃU‰åƒì jÿjÿuÿuÿuÿu ÿuèƒÄ ÉÐU‰åWVSƒì‹]‹EE ‰Eð…ÛuƒìjThI@#hu>#èۃă} uƒìjUhI@#h~>#较ċ;…ÿ„lƒuƒt‹G;Gsƒìj[hI@#hÀ>#舃ăt‹G;G rƒìj[hI@#h ?#ècƒÄ‹G +G9Gvƒìj[hI@#h`?#èAƒÄ‹G÷ЅE…á‹Uð9WƒÕ‹M9O †ÉG‰Eì‹_…Û„¸v÷ÃtƒìjkhI@#h ?#èèƒÄöCtƒìjlhI@#hà?#è˃ă;t9wƒìjmhI@#h @#諃Ä;_ rƒìjnhI@#h–>#菃ċU 9S‚$‰Þ;]s‹u¹;M}ºÓâ‹E1ð…ÂtÖA;M|è‰ð)ØE ;C‡è‹M 1;Eð‡æ‰ðƒàø‰Eè9Øsƒìh‘hI@#hT@#èƒÄ9]èvC‹Uè)ډUä÷Âtƒìh–hI@#h€@#èãƒÄ‹‹M艋C+Eä‰A‹Eä‰C‰]ì‰ðƒà‹U Tƒâø‰U ‹Mè9Qv‰ÊU ‹‰‹A+E ‰B‹Eì‰ë
-‹Uè‹‹M쉋E 9Gsƒìh´hI@#h­>#èkƒÄ‹U )W‰ðë‰ö‰]ì‹…Û…Kþÿÿ‹?…ÿ…•ýÿÿ¸eô[^_]ÃU‰åƒì jÿjjj ÿu hÿuèýÿÿƒÄ ÉÐU‰åWVSƒì‹]Sh²@#èaÌÿÿ‹3ƒÄ…ö„ƒìÿvÿvÿv‹F +FPÿv ÿvh@A#è1ÌÿÿƒÄ ƒ~uƒ~t‹F;FsƒìjahÄ@#hÀ>#袃ă~t‹F;F rƒìjahÄ@#h ?#è}ƒÄ‹F +F9FvƒìjahÄ@#h`?#è[ƒÄ¿‹^…Û„¾ƒì ÿ3ÿs‰ØCPSh€A#è“ËÿÿƒÄ ÷ÃtƒìjihÄ@#h ?#èƒÄöCtƒìjjhÄ@#hÀA#èóƒÄƒ{wƒìjkhÄ@#hË@#èփă;t9wƒìjlhÄ@#h @#趃Ä;^ rƒìjmhÄ@#h–>#蚃Ä{‹…Û…BÿÿÿƒìWhç@#èàÊÿÿƒÄ9~tƒìjshÄ@#hú@#è`ƒÄ‹6…ö…cþÿÿƒì hA#èªÊÿÿƒÄeô[^_]ÍvU‰åWVSƒì ‹u‹] ‰ßƒçø…öuƒìjNh[=#hu>#è ƒÄ…ÛuƒìjOh[=#hòA#èñƒÄƒ}uƒìjPh[=#h~>#èԃĉ؃à‹UTƒâø‰U‹ëv‹…ÛuƒìjXh[=#hýA#螃ă{uƒ{t‹C;CsƒìjYh[=#hÀ>#èsƒÄƒ{t‹C;C rƒìjYh[=#h ?#èNƒÄ‹C +C9CvƒìjYh[=#h`?#è,ƒÄ;{‚hÿÿÿ;{ ƒ_ÿÿÿ‹EC‹C +C9Cvƒìjbh[=#h`?#èòƒÄÇEð‹sëv‰uð‹6…öt9þróƒ}ðtm‹Eð@9ørc9øtƒìjnh[=#h B#諃ąöt8‹U:9ðr.9ðtƒìjuh[=#h`B#肃ċEF‹UðB‹‰ëE‹E‹UðBë9ƒ}ðt
-‹Eð‰8ëv‰{…öt‹U:9ðr‰ÐF‰G‹‰ë ‹E‰G‰7eô[^_]ÃU‰åƒì hÿu ÿuèÒýÿÿƒÄÉÐU‰å‹EÇ]ÉöU‰åWVSƒì ÇEèÇEìÇEð‹E‹0…ö„Zƒ~uƒ~t‹F;Fsƒìj]h†B#hÀ>#蠃ă~t‹F;F rƒìj]h†B#h ?#è{ƒÄ‹F +F9Fvƒìj]h†B#h`?#èYƒÄÿEð¿‹^…Û„¨v÷Ãtƒìjdh†B#h ?#è$ƒÄöCtƒìjeh†B#hÀA#èƒÄƒ{wƒìjfh†B#hË@#èêƒÄƒ;t9wƒìjgh†B#h @#èʃÄ;^ rƒìjhh†B#h–>#讃ÄÿEì{‹…Û…[ÿÿÿ9~tƒìjnh†B#hú@#肃Ä‹FEè‹6…ö…§þÿÿƒì ÿuìÿuðÿuèÿuh B#èºÆÿÿƒÄ eô[^_]ÍvU‰åVS‹u‹] EƒìPÿuh Ù#èÈÿÿƒÄh Ù#ÿ5àá#jSVh C#è5ƒÄ eø[^]ÍvU‰åƒìÿ5Ìá#jÿuÿu ÿuhàB#èƒÄ ÉÉöU‰åƒì E Pÿuh Ý#èÈÿÿƒÄ jjhh$#èè%ÿÿƒÄh Ý#hƒC#è†ÅÿÿÇ$MèBÿÿƒÄÉÐU‰åƒìh Ý#h`C#è_ÅÿÿƒÄÉÉöU‰åWVSƒì¿ÿÿÿÿ‹E ‹‹E@‰ÐÁà)л¤â#‰]ð‹´ÃЃùÿtCI‰ÐÁà)Ð;´ÃÐr0»¨â#‰Ï‰ÐÁà)ЋLÃPƒùÿtI‰ÐÁà)ЋUð;´ÂÐsՃÿÿt‰ÐÁà)ЋU‰Åøâ#ë
-‰ö‹E‹U ‰ƒùÿtI‰ÐÁà)ЋU‰Åüâ#ë
-‹E‹U ‰B‹E@‰ÐÁà)ЍÅP‰ˆ¨â#‰¸¬â#ƒÄ[^_]ÍvU‰åWVSƒì¿ÿÿÿÿ‹E ‹‹E@‰ÐÁà)ÐÁà‹xå#‰U苀|å#‰Eìƒùÿtw ‰ÆȉÂÁâ)‹Eè‰Ã;Õxå#|[‰Eäv1‰ÐÁà)ЍÅ;šxå#u ‹Eì;‚|å#|1‰Ï‰ÐÁà)Ћ Åøâ#ƒùÿt4 1‰ÐÁà)Ћ]ä;Åxå#}«ƒÿÿt‰ÐÁà)ЋU‰Åøâ#ë‹E‹U ‰ƒùÿtI‰ÐÁà)ЋU‰Åüâ#ë
-‹E‹U ‰B‹E@‰ÐÁà)ЍÅP‰ˆ¨â#‰¸¬â#ƒÄ[^_]ÍvU‰å‹EÇÿÿÿÿÇ@ÿÿÿÿ]ÍvU‰åWVS‹uv‰ÐÁà)ЍÅP‹˜¬â#¿¨â#‹ 8ƒûÿt[‰ÐÁà)ЉLÇPëv‹E ‰ƒùÿt&I‰ÁÁá)Á»¬â#v‰ÐÁà)ЋDÃP‰DËPë v‹E ‰X[^_]ÐU‰åS‹M‹‰Øƒûÿt=‹@‰ÂÁâ)‹Õøâ#‰ƒøÿt@‰ÐÁà)ÐÇÅüâ#ÿÿÿÿë
-vÇAÿÿÿÿ‰Ø‹$ÉÉöU‰åS‹M‹] ƒ;ÿt)I‰ÐÁà)Ћ‰Åøâ#‹@‰ÂÁâ)‰ Õüâ#됉KI‰ÐÁà)ÐÇÅøâ#ÿÿÿÿI‰ÐÁà)ÐÇÅüâ#ÿÿÿÿ‰ ‹$ÉÃU‰åS‹M‹] ƒ{ÿt,I‰ÐÁà)ЋS‰Åüâ#‹C@‰ÂÁâ)‰ Õøâ#ë‰ö‰ I‰ÐÁà)ÐÇÅüâ#ÿÿÿÿI‰ÐÁà)ÐÇÅøâ#ÿÿÿÿ‰K‹$ÉÃU‰å‹E‹]ÉöU‰å‹E‹@]ÐU‰å·Eƒøt ƒø…Àtë-ƒøtƒøtë ¸¡C#됸¦C#됸ªC#됸°C#됸q4#]ÐU‰åWVSƒìœúX‰Â‰Uä÷Et$ƒìEèPjèH—ÿÿƒÄ ÿuìÿuèhÀC#èaÁÿÿƒÄ÷EtN¾;5Ðá#sA¿â#vƒì µ‹;¶BP·BPRVhD#èÁÿÿƒÄ‹;VÿP ƒÄF;5Ðá#rÇ÷Etƒì hÛC#èñÀÿÿèT&ÿÿƒÄ‹Uä‰ÐPeô[^_]Éöí"Üï"Üï"Üï"Üï"Üï"Hï"Üï"Tï"`ï"Üï"lï"lï"lï"lï"lï"lï"lï"lï"lï"lï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï"Üï" í"4í" î"`î"àî"<ï"4í"Üï"Üï"0ï"Üï"<ï"Üï"î"Üï"Üï"8î"Üï"€í"Üï"Üï"Ìí"Àð" ò" ò" ò" ò" ò"ò" ò"$ò",ò" ò"<ò"<ò"<ò"<ò"<ò"<ò"<ò"<ò"<ò"<ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò" ò"Ìð"àð" ò" ò" ò" ò"àð" ò" ò"ò" ò" ò" ò" ò" ò" ò"Øñ" ò"0ñ" ò" ò"tñ"¬õ"¸õ"¸õ"¸õ"¸õ"¸õ"|ó"|ó"|ó"|ó"|ó"|ó"|ó"|ó"|ó"|ó"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¸õ"¬ó"0ô",õ",õ",õ" õ"0ô"¸õ"¸õ"”õ"¸õ" õ"¸õ"¸õ"¸õ"¸õ"Äó"¸õ" ô"¸õ"¸õ"¼ô"$@$@#€#ì#\#¬#ü#L#|##”# #¬ #8
-#Ä
-# #œ #( #´ #@ -#Ì -#@#\#Œ##œ#,#°#(#”##l#Ð##`#„# #¼#Ø#ô#t#ì#t#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô#Ô##€#ì#\#¬#ü#L#|##”# #¬ #8
-#Ä
-# #œ #( #´ #@ -#Ì -#@#\#Œ##œ#,#°#(#”##l#Ð##`#„# #¼#Ø#ô#t#ì#t#TimerOthermain: unable to set timer 1
-main: unable to set timer 2
-main: unable to set timer 3
-main: waiting signals...
-main: disarm the timer2
-main: disarm the timer1
-main: arm timer1
-main: unable to arm timer 1
-main: ending...
-Signal %d code=%s value=%d task=%d count25=%d count26=%d time=%ldusec
-task_timer: value = %d, time = %ldusec
-main: unable to create timer 1
-main: unable to create timer 2
-main: unable to create timer 3
-main: unable to disarm timer 2
-main: timer2 disarmed, itvalue=%ld.%ld
-main: unable to disarm timer 1
-main: timer1 disarmed, itvalue=%ld.%ld
-Error during Keyboard Initialization!!!Ctrl-C pressed!
-KeybPortKeyTasktask_create
-scheduletime %lus %luns * caplasttime %lus %luns * exec=%d TIME = %lu
-The system tick must be less than 55 mSec!Abort detected
-Code : %u
-Too many scheduling levels!!!
-Too many resource levels!!!
-debug info noticewarn err crit alert emerg <%i>[%s] %sPosix task
-Signal number %d...
-with value : %d
-POSIX_ReadyPOSIX_DelayPOSIX_UnknownSlice: %d
-MainPOSIX_register_level
- alloco descrittore %d %d
- lev=%d
-POSIX schedulerPid: %d Name: %20s Prio: %3ld Status: %s
-
-Panic!!! can't create main task...
-dummy PID: %d
-Dummy1Dummy2Dummy3Dummy4Dummy5Dummy6Dummy7Dummy8Dummy9Dummy0DummyaDummybDummycDummydDummyeDummyfDummygDummyhDummyDummy (RR) Posto dummy_create
-
-Panic!!! can't create dummy task...
-Entro in dummy_register_level
-Port des :
-Free port des : %d
-%d %s vt: %d pn: %d
-%d pd: %d vt: %d pn: %d Resources owned by the tasks:
-%-4dPI_register_module
-PI module
-PC priority of the tasks:
-%-4ldPC_register_module
-PC moduleTR %x
-SS:SP %x:%lx
-Stack0 : %x:%lx
-Stack1 : %x:%lx
-Stack2 : %x:%lx
-CS : %x DS : %x
-Descriptor [%x] InfoNo more Descriptors...
-%x (Hex)Base : %lx Lim : %lx Acc : %x Gran %x
-2Coprocessor error#Page fault*General protection fault*Stack exception*Segment not present*Unvalid TSS#INTEL reserved*Double defect1FPU context switch*Unvalid opcode#BOUND limit exceeded#Overflow detected on INTO#Breakpoint trap#NMI detected#Debug fault#Division by 0Exception %d occurred
-ABORT %d !!!LL Time Panic!!!
-time.cError! File:%s Line:%d %sOne-shot timer selected...
-Periodic timer selected...
-Unhandled Exc or Int occured!!!
-32/LINUX CrossCompiled/ELFHalt called1234567890-+12345678901234567890xabcdefABCDEF1234567890.e+-0123456789ABCDEF$@ -Æ@,ú1°<NaN+Inf-Infacosacosfacos: DOMAIN error
-asinasinfasin: DOMAIN error
-atan2atan2fatan2: DOMAIN error
-hypothypotfexpexpfy0fy0: DOMAIN error
-y1fy1: DOMAIN error
-ynynfyn: DOMAIN error
-lgammalgammaflgamma: SING error
-loglogflog: SING error
-log: DOMAIN error
-log10log10flog10: SING error
-log10: DOMAIN error
-powpowfpow(0,0): DOMAIN error
-pow(0,neg): DOMAIN error
-sinhsinhfsqrtsqrtfsqrt: DOMAIN error
-fmodfmodffmod: DOMAIN error
-remainderremainderfremainder: DOMAIN error
-acoshacoshfacosh: DOMAIN error
-atanhatanhfatanh: DOMAIN error
-atanh: SING error
-scalbscalbfj0j0f: TLOSS error
-j1j1fjnjnfneg**non-integral: DOMAIN error
-à?addfree.cmax >= minreg->min < reg->maxnew_max > new_min(reg->min & (sizeof(struct lmm_node) - 1)) == 0(reg->max & (sizeof(struct lmm_node) - 1)) == 0addregio.cr != reg(reg->max <= r->min) || (reg->min >= r->max)alloc.clmm != 0size > 0reg->free >= 0(DWORD)node < reg->maxreg->free >= size(reg->nodes == 0 && reg->free == 0) || (DWORD)reg->nodes >= reg->minreg->nodes == 0 || (DWORD)reg->nodes < reg->maxreg->free <= reg->max - reg->min((DWORD)node & (sizeof(struct lmm_node) - 1)) == 0((DWORD)node->size & (sizeof(struct lmm_node) - 1)) == 0(node->next == 0) || (node->next > node)alloc_ge.canode >= node(split_size & (sizeof(struct lmm_node) - 1)) == 0lmm_dump(lmm=%p)
-dump.cnode->size >= sizeof(*node) free_check=%08lx
-reg->free == free_checklmm_dump done
- region %08lx-%08lx size=%08lx flags=%08lx pri=%d free=%08lx
- node %p-%08lx size=%08lx next=%p
-(node->size & (sizeof(struct lmm_node) - 1)) == 0block != 0reg != 0(DWORD)prevnode + prevnode->size == (DWORD)node(DWORD)node + size == (DWORD)nextnodestats.cLMM=%p: %u bytes in %u regions, %d nodes
-assertion %s failed in %s at line %i (task:%i_%i)
-MAGIC assertion failed in %s at line %i (task:%i_%i): %s
-KERNEL PANIC (sys_panic_stub): %s
-KERNEL PANIC (sys_panic): %s
-FreeExeSleepWaiting on joinTime (EXACT) : %lus %luns
-< Memory Dump >
-< Level %d : %s Code: %d Version: %d >
-8Œÿÿ’ÏÿÿšÏÿ(T#ÿ@_#ÿÿÿÿÿÿÿÿÿÿÿÿ1234567890!@#$%^&*()-_=+[{]};:'"`~/?,<.>\|   - -1234567890.+*/-+*-aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ 1234567890!"œ$%&/()='?^Š‚+*•‡…ø\|<_,:.;—õ   - -1234567890.+*/-+*-aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ[]@#P\#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ -4#4#ÿ3#ø3#ñ3#ê3#ã3#Ü3#T}"\}"\}"39#&9#9#9#ì8#Ö8#Æ8#²8#£8#“8#†8#q8#`8#F8#:8#“8#'8#þþAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAšg:#ðÿÿÿÿGCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)01.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.0101.01.symtab.strtab.shstrtab.text.rodata.data.sbss.bss.comment.note"€€)!€)#*¨ )(T#¨D /4_#ÀO5@_#ÀO8ã :ÀOLC ahtgI
\ No newline at end of file
/demos/branches/pj/pse51/ptest3
Property changes:
Deleted: svn:executable
## -1 +0,0 ##
-*
\ No newline at end of property
Index: demos/branches/pj/pse51/ptest2.c
===================================================================
--- demos/branches/pj/pse51/ptest2.c (revision 1085)
+++ demos/branches/pj/pse51/ptest2.c (nonexistent)
@@ -1,152 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: ptest2.c,v 1.1.1.1 2002-09-02 09:37:47 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:47 $
- ------------
-
- Posix test 2:
-
- pthread_once + thread_specific_data
-
- the main task:
- creates a key
- creates 2 tasks, J1, J2
- at t = 0.4 sec. it kills J1 and J2
-
- J1 and J2 will set and check the thread specific data
- and when the die, a destructor is called (twice, because the value
- is not set to null...)
-
- non standard function used:
- cprintf
- sys_gettime
- keyboard stuffs
- sys_end
-
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include <sys/types.h>
-#include <pthread.h>
-
-#include <kernel/kern.h>
-#include <drivers/keyb.h>
-
-pthread_key_t prova_key;
-
-pthread_once_t once = PTHREAD_ONCE_INIT;
-
-void once_init()
-{
- cprintf("ONCE: (pid=%d)\n", exec_shadow);
-}
-
-void destr_key(void *arg)
-{
- cprintf("J (pid=%d) destructor called with value %d\n", exec_shadow,(int)arg);
- pthread_setspecific(prova_key,(void *)((int)arg/100));
-}
-
-void print_test()
-{
- int val;
-
- val = (int)pthread_getspecific(prova_key);
- cprintf("J (pid=%d) printtest value=%d\n", exec_shadow, val);
-}
-
-void *J(void *arg)
-{
- pthread_once(&once, once_init);
- cprintf("J (pid=%d) starts and call setspecific\n", exec_shadow);
- pthread_setspecific(prova_key,arg);
- print_test();
- cprintf("J (pid=%d) exits\n", exec_shadow);
-
- return 0;
-}
-
-void fine(KEY_EVT *e)
-{
- sys_end();
-}
-
-
-int main(int argc, char **argv)
-{
- int err;
- pthread_t j1, j2;
-
- KEY_EVT emerg;
- //keyb_set_map(itaMap);
- emerg.ascii = 'x';
- emerg.scan = KEY_X;
- emerg.flag = ALTL_BIT;
- keyb_hook(emerg,fine);
-
-
- cprintf("main: creating prova_key\n");
- pthread_key_create(&prova_key, destr_key);
-
- cprintf("main: provakey =%d\n", prova_key);
-
- cprintf("main: creating J1\n");
- err = pthread_create(&j1, NULL, J, (void *)1414);
- if (err) cprintf("Error creating J1\n");
- cprintf("main: J1 has PID %d\n",j1);
-
- cprintf("main: creating J2\n");
- err = pthread_create(&j2, NULL, J, (void *)3141);
- if (err) cprintf("Error creating J2\n");
- cprintf("main: J2 has PID %d\n",j2);
-
- cprintf("main: waiting 0.4 sec\n");
- while (sys_gettime(NULL) < 400000);
-
- cprintf("main: kill J1 and J2\n");
- pthread_cancel(j1);
- pthread_cancel(j2);
-
- cprintf("main: ending...\n");
-
- return 0;
-}
Index: demos/branches/pj/pci6025e/initfile.c
===================================================================
--- demos/branches/pj/pci6025e/initfile.c (revision 1085)
+++ demos/branches/pj/pci6025e/initfile.c (nonexistent)
@@ -1,63 +0,0 @@
-/*
-* Filename: Initfile.c
-* Author: Marco Ziglioli (Doctor Stein)
-* Date: (I don't remeber... I'm sorry)
-* Description: this file is the same for every examples in this section
-*/
-
-/* This file is part of the S.Ha.R.K. Project - http://shark.sssup.it
- *
- * Copyright (C) 2001 Marco Ziglioli
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include <kernel/kern.h>
-#include <modules/edf.h>
-#include <modules/cbs.h>
-#include <modules/rr.h>
-#include <modules/hartport.h>
-#include <modules/dummy.h>
-#include <modules/sem.h>
-
-#include <drivers/keyb.h>
-
-#define TICK 1000
-#define RRTICK 5000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- EDF_register_level(EDF_ENABLE_ALL);
- CBS_register_level(CBS_ENABLE_ALL, 0);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- dummy_register_level();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- HARTPORT_init();
- KEYB_init(NULL);
-
- __call_main__(mb);
-
- return (void *)0;
-}
Index: demos/branches/pj/pci6025e/test_mes.c
===================================================================
--- demos/branches/pj/pci6025e/test_mes.c (revision 1085)
+++ demos/branches/pj/pci6025e/test_mes.c (nonexistent)
@@ -1,290 +0,0 @@
-/*****************************************************************************
-* Filename: test_mes.c *
-* Author: Marco Ziglioli (Doctor Stein) *
-* Date: 25/06/2001 *
-* Description: Test file for single period and pulsewidth measurement feature*
-* of PCI6025E timers/counters *
-*----------------------------------------------------------------------------*
-* Notes: board is configured to provide a frequency of 1 MHZ through its FOUT*
-* pin (50). PFI3 (41) and PFI6 (45) are configured like source pins *
-* counter 0 and counter 1. PFI4 (42) and PFI 5(44) are the gates for *
-* the two counters. Please connect DIO7(32) to PFI4 and DIO6(30) to *
-* PFI 5. *
-* With 'g' key a task is started which generate a square wave on DIO7 *
-* with a period of 2 secs. With 'h' key the same square wave is *
-* generated on DIO6. *
-* When measurement is performed data are stored into Hardware Save *
-* Registers: use key 's' to show this values *
-*****************************************************************************/
-
-
-/* This file is part of the S.Ha.R.K. Project - http://shark.sssup.it
- *
- * Copyright (C) 2001 Marco Ziglioli
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-#include <kernel/kern.h>
-#include <drivers/keyb.h>
-#include <drivers/glib.h>
-
-#include <drivers/pci6025e/timer.h>
-#include <drivers/pci6025e/dio_ppi.h>
-
-#define TASK_MET 20000
-#define TASK_WCET 50000
-#define TASK_PERIOD 100000
-
-#define PERIOD 1000000
-
-void endFun(KEY_EVT *);
-void gateEvent(KEY_EVT *);
-
-void drawInterface(void);
-void closeEvent(void *);
-
-TASK show_body(int);
-TASK gate_body(int);
-
-BYTE sys = 0;
-PID c0_gate_pid, c1_gate_pid, show_pid;
-int black = rgb16(0, 0, 0);
-
-int main(int argc, char **argv)
-{
- KEY_EVT k;
- int modenum;
- SOFT_TASK_MODEL show_model;
- HARD_TASK_MODEL gating;
-
- sys_atrunlevel(closeEvent, NULL, RUNLEVEL_BEFORE_EXIT);
-
- k.flag = CNTL_BIT;
- k.scan = KEY_X;
- k.ascii = 'x';
- keyb_hook(k, endFun);
-
- k.flag = CNTR_BIT;
- keyb_hook(k, endFun);
-
- k.flag = 0;
- k.scan = KEY_G;
- k.ascii = 'g';
- keyb_hook(k, gateEvent);
-
- k.scan = KEY_H;
- k.ascii = 'h';
- keyb_hook(k, gateEvent);
-
- k.scan = KEY_S;
- k.ascii = 's';
- keyb_hook(k, gateEvent);
-
- if(pci_init()==-1){
- sys = 10;
- sys_end();
- }
-
- if(!reMap()){
- sys = 11;
- sys_end();
- }
-
- soft_task_default_model(show_model);
- soft_task_def_level(show_model, 1);
- soft_task_def_met(show_model, TASK_MET);
- soft_task_def_wcet(show_model, TASK_WCET);
- soft_task_def_aperiodic(show_model);
- soft_task_def_period(show_model, TASK_PERIOD);
- if( (show_pid = task_create("Show task", show_body, &show_model, NULL))
- == NIL ){
- sys = 20;
- sys_end();
- }
-
- hard_task_default_model(gating);
- hard_task_def_mit(gating, PERIOD);
- hard_task_def_wcet(gating, 20000);
- hard_task_def_arg(gating, C0);
- if( (c0_gate_pid = task_create("C0 Gate task", gate_body, &gating, NULL)) == NIL ){
- sys = 21;
- sys_end();
- }
-
- hard_task_def_arg(gating, (void *)C1);
- if( (c1_gate_pid = task_create("C1 Gate task", gate_body, &gating, NULL)) == NIL ){
- sys = 22;
- sys_end();
- }
-
- if(grx_init()==-1){
- sys = 30;
- sys_end();
- }
-
- if( (modenum = grx_getmode(800, 600, 16)) == 0 ){
- sys = 31;
- sys_end();
- }
-
- grx_setmode(modenum);
- drawInterface();
- //Enable DIO to manage gates
- DIO_init();
- DIO_setup(0xFF);
- DIO_write(0x00);
-
- //All PFI configured as input
- PFIprogramming(0x0000);
- //Fout provide 1MHz: timebase = 20MHz; divided by 2; on FOUT pin also divided by 10
- setIntClock(0, 1, 10);
-
- //Reset both counters
- TIM_reset(2);
-
- //Source PFI3(41); Gate PFI 4(42); Measure period
- TIM_timeMeasurement(C0, 0x04, 0x45, 0, 0x00, 0);
-
- //Source PFI6(45); Gate PFI 5(44); Measure pulsewidth
- TIM_timeMeasurement(C1, 0x87, 0x46, 1, 0x00, 0);
-
- //Arm both counter
- TIM_arm(2);
-
- return 0;
-}
-
-TASK show_body(int dummy)
-{
- DWORD val;
- char buf[20];
-
- while(1){
- val = TIM_readHWSaveReg(C0);
- sprintf(buf, "%ld", val);
- grx_text(buf, 600, 471, rgb16(0, 255, 0), black);
- val = TIM_readHWSaveReg(C1);
- sprintf(buf, "%ld", val);
- grx_text(buf, 200, 471, rgb16(255, 0, 0), black);
-
- task_endcycle();
- }
-}
-
-TASK gate_body(int counter)
-{
- BYTE out;
-
- if(counter == C0) out = 0x80;
- else out = 0x40;
-
- while(1){
- DIO_write(out);
- if(counter == C0){
- if(out) out = 0x00;
- else out = 0x80;
- } else {
- if(out) out = 0x40;
- else out = 0x00;
- }
-
- task_endcycle();
- }
-}
-
-void drawInterface(void)
-{
- grx_rect(1, 1, 799, 120, rgb16(105, 0, 0));
- grx_rect(2, 2, 798, 119, rgb16(155, 0, 0));
- grx_rect(3, 3, 797, 118, rgb16(205, 0, 0));
- grx_rect(4, 4, 796, 117, rgb16(255, 0, 0));
-
- grx_text("Test program for single period and pulsewidth measurement features",
- 7, 10, rgb16(200, 200, 0), black);
-
- grx_text("This program measures single period and pulsewidth of a square wave",
- 7, 20, rgb16(0, 255, 0), black);
- grx_text("with frequency of 0.5 Hz", 7, 28, rgb16(0, 255, 0), black);
- grx_text("Please connect PFI3 & PFI6 (41 & 45) to FOUT pin (50) or to 1Mhz frequency source",
- 7, 40, rgb16(255, 0, 0), black);
- grx_text("Connect also DIO7 (32) to PFI4 (42) and DIO6 to PFI5 (44)",
- 7, 48, rgb16(255, 0, 0), black);
- grx_text("Commands:", 7, 60, rgb16(0, 120, 0), black);
- grx_text("Use 'g' to start wave generation on DIO7",
- 7, 70, rgb16(0, 255, 255), black);
- grx_text("Use 'h' to start wave generation on DIO6",
- 7, 78, rgb16(0, 255, 255), black);
- grx_text("Use 's' to show Hardware Save Registers content",
- 7, 86, rgb16(0, 255, 255), black);
- grx_text("CTRL-X to exit", 7, 105, rgb16(255, 255, 0), black);
-
- grx_rect(197, 127, 603, 423, rgb16(0, 255, 0));
- grx_rect(198, 128, 602, 422, rgb16(0, 205, 0));
- grx_rect(199, 129, 601, 421, rgb16(0, 155, 0));
- grx_rect(200, 130, 600, 420, rgb16(0, 105, 0));
- grx_line(215, 405, 215, 150, rgb16(255, 255, 255));
- grx_line(210, 400, 580, 400, rgb16(255, 255, 255));
- grx_line(220, 395, 220, 170, rgb16(0, 0, 255));
- grx_line(220, 170, 390, 170, rgb16(0, 0, 255));
- grx_line(390, 170, 390, 395, rgb16(0, 0, 255));
- grx_line(390, 395, 560, 395, rgb16(0, 0, 255));
- grx_line(220, 150, 560, 150, rgb16(0, 255, 0));
- grx_line(220, 155, 390, 155, rgb16(255, 0, 0));
-
- grx_rect(1, 450, 390, 503, rgb16(105, 0, 0));
- grx_rect(2, 451, 389, 502, rgb16(155, 0, 0));
- grx_rect(3, 452, 388, 501, rgb16(205, 0, 0));
- grx_rect(4, 453, 387, 500, rgb16(255, 0, 0));
- grx_text("Pulsewidth: [us]", 7, 471, rgb16(255, 0, 0), black);
-
- grx_rect(410, 450, 799, 503, rgb16(105, 0, 0));
- grx_rect(411, 451, 798, 502, rgb16(155, 0, 0));
- grx_rect(412, 452, 797, 501, rgb16(205, 0, 0));
- grx_rect(413, 453, 796, 500, rgb16(255, 0, 0));
- grx_text("Period: [us]", 416, 471, rgb16(0, 255, 0), black);
-}
-
-void endFun(KEY_EVT *k)
-{
- sys_end();
-}
-
-void gateEvent(KEY_EVT *k)
-{
- if(k->scan == KEY_G) task_activate(c0_gate_pid);
- if(k->scan == KEY_H) task_activate(c1_gate_pid);
- if(k->scan == KEY_S) task_activate(show_pid);
-}
-
-void closeEvent(void *arg)
-{
- TIM_disarm(2);
- grx_close();
-
- switch(sys){
- case 0: cprintf("OK\n"); break;
- case 10: cprintf("No PCI bus found\n"); break;
- case 11: cprintf("No NATIONAL board found\n"); break;
- case 20: cprintf("task <show value> down!!\n"); break;
- case 21: cprintf("task <C0 gate manage> down!!!\n"); break;
- case 22: cprintf("task <C1 gate manage> down!!!\n"); break;
- case 30: cprintf("Cannot init graphic envirorment\n"); break;
- case 31: cprintf("graphic mode 800x600x16 not supported\n"); break;
- default: cprintf("???????????????\n"); break;
- }
-}
Index: demos/branches/pj/pci6025e/test_ec.c
===================================================================
--- demos/branches/pj/pci6025e/test_ec.c (revision 1085)
+++ demos/branches/pj/pci6025e/test_ec.c (nonexistent)
@@ -1,405 +0,0 @@
-/*****************************************************************************
-* Filename: test_ec.c *
-* Author: Marco Ziglioli (Doctor Stein) *
-* Date: 20/06/2001 *
-* Description: Test program for gated event counting using PCI6025E board *
-*----------------------------------------------------------------------------*
-* Notes: FOUT are enabled to provide a frequency of 6250 Hz. You could *
-* connect PFI3 (pin 41) and PFI6 (pin 45) to this source for counting *
-* edges. Gated counting are enabled and PFI4 (pin 42) is gate pin for *
-* counter 0 and PFI5 (pin 44) is gate pin for counter 0. DIO 7 and 6 *
-* are als configured to switch between 0 and 5 V. Connect DIO 7 to *
-* gate 0 and DIO 6 to gate 1. Use 'g' (counter 0) and 'h' (counter 1) *
-* to change DIO lines value. On left area of the screen you should *
-* see counter while counting and on the right area you should lock *
-* counter values by pressing 's' key. *
-* Notice that line parameters are enabled and accept inital value *
-* for the two counters. If they aren't specified or they are wrong *
-* counters start from 0x00FFFFFF (counter 0 which counts down) and *
-* 0x00000000 (counter 1 which counts up). *
-* Last time addiction: TC Interrupts and Gate interrupts are enabled *
-* Bottom squares indicates when an interrupt is *
-* raised *
-*****************************************************************************/
-
-/* This file is part of the S.Ha.R.K. Project - http://shark.sssup.it
- *
- * Copyright (C) 2001 Marco Ziglioli
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include <kernel/kern.h>
-#include <drivers/keyb.h>
-#include <drivers/glib.h>
-
-#include <drivers/pci6025e/timer.h>
-#include <drivers/pci6025e/dio_ppi.h>
-
-#ifndef INT_NO
- #define INT_NO NIDevice_info[0].InterruptLevel
-#endif
-
-BYTE sys = 0;
-
-PID show_aper_pid;
-BYTE out = 0x00;
-
-int black = rgb16(0, 0, 0),
- white = rgb16(255, 255, 255);
-
-void endfun(KEY_EVT *);
-void close_event(void *);
-void show_evt(KEY_EVT *k);
-void gate_change(KEY_EVT *k);
-
-void drawInterface(void);
-
-void int_evt(int intno);
-
-TASK show_per(int);
-TASK show_aper(int);
-
-int main(int argc, char **argv)
-{
- KEY_EVT k;
- SOFT_TASK_MODEL show_per_mod, show_aper_mod;
- PID show_per_pid;
- int result, modenum;
- DWORD init_val_c0, init_val_c1;
-
- if(argc >= 3){
- if( (result = sscanf(argv[1], "%ld", &init_val_c0)) != 1)
- init_val_c0 = 0x00FFFFFF;
- if( (result = sscanf(argv[2], "%ld", &init_val_c1)) != 1)
- init_val_c1 = 0x00000000;
- }
- if(argc == 2){
- if( (result = sscanf(argv[1], "%ld", &init_val_c0)) != 1)
- init_val_c0 = 0x00FFFFFF;
- init_val_c1 = 0x00000000;
- }
- if(argc == 1){
- init_val_c0 = 0x00FFFFFF;
- init_val_c1 = 0x00000000;
- }
-
- sys_atrunlevel(close_event, NULL, RUNLEVEL_BEFORE_EXIT);
-
- k.flag = CNTL_BIT;
- k.scan = KEY_X;
- k.ascii = 'x';
- keyb_hook(k, endfun);
-
- k.flag = CNTR_BIT;
- keyb_hook(k, endfun);
-
- soft_task_default_model(show_aper_mod);
- soft_task_def_aperiodic(show_aper_mod);
- soft_task_def_level(show_aper_mod, 1);
- soft_task_def_period(show_aper_mod, 250000);
- soft_task_def_met(show_aper_mod, 30000);
- soft_task_def_wcet(show_aper_mod, 60000);
- if( (show_aper_pid = task_create("Show aperiodic task", show_aper, &show_aper_mod, NULL)) == NIL ){
- sys = 10;
- sys_end();
- }
-
- k.flag = 0;
- k.scan = KEY_S;
- k.ascii = 's';
- keyb_hook(k, show_evt);
-
- k.flag = 0;
- k.scan = KEY_G;
- k.ascii = 'g';
- keyb_hook(k, gate_change);
-
- k.scan = KEY_H;
- k.ascii = 'h';
- keyb_hook(k, gate_change);
-
- soft_task_default_model(show_per_mod);
- soft_task_def_level(show_per_mod, 1);
- soft_task_def_met(show_per_mod, 1000);
- soft_task_def_period(show_per_mod, 10000);
- if( (show_per_pid = task_create("Show periodic task", show_per, &show_per_mod, NULL)) == NIL){
- sys = 11;
- sys_end();
- }
-
- if(pci_init()==-1){
- sys = 20;
- sys_end();
- }
-
- if(!reMap()){
- sys = 21;
- sys_end();
- }
-
- if(grx_init()==-1){
- sys = 30;
- sys_end();
- }
-
- if( (modenum = grx_getmode(800, 600, 16)) == -1){
- sys = 31;
- sys_end();
- }
-
- grx_setmode(modenum);
-
- drawInterface();
-
- //Init DIO lines used to manage counters gates
- DIO_init();
- DIO_setup(0xFF);
- DIO_write(out);
-
- //All PFI are configured as input
- PFIprogramming(0x0000);
- //FOUT enable; Slow TIMEBASE, divided by two; divided by 16 on FOUT pin
- setIntClock(1, 1, 0);
-
- TIM_reset(2); //Reset both two counters
-
- //Source PFI3(41); Gate PFI 4(42); Down counting; counts rising edge;
- TIM_eventCounting(C0, 0x04, 0x45, 0x03, init_val_c0);
-
- //Source PFI6(45); Gate PFI 5(44); Up counting; counts rising edge;
- TIM_eventCounting(C1, 0x87, 0x46, 0x03, init_val_c1);
-
- //Set up interrupt group A and B enabling and programming to assert a request
- //both on line 2 and 3 respectively
- INT_setup(0x0A, 0x0B);
- INT_personalize(0x03); //Interrupt request polarity low; IRQ driven on line 0 and 1
-
- handler_set(INT_NO, int_evt, show_aper_pid);
-
- TIM_arm(2); //Arm both two counters
-
- task_activate(show_per_pid);
-
- return 0;
-}
-
-void drawInterface(void)
-{
- grx_rect(1, 1, 799, 99, rgb16(105, 0, 0));
- grx_rect(2, 2, 798, 98, rgb16(155, 0, 0));
- grx_rect(3, 3, 797, 97, rgb16(205, 0, 0));
- grx_rect(4, 4, 796, 96, rgb16(255, 0, 0));
-
- grx_text("Test program for Gated Event Counting capacity of PCI6025E timers",
- 7, 10, rgb16(50, 255, 50), black);
-
- grx_text("This program counting rise edges on counters source (PFI3 & PFI6) when releted gates",
- 7, 25, rgb16(0, 255, 255), black);
- grx_text("(PFI 42 & 44) are enabled. Frequency Out (FOUT) is enabled and provides a frequency of 6250 Hz",
- 7, 33, rgb16(0, 255, 255), black);
-
- grx_text("Instruction:",7, 43, rgb16(255, 0, 0), black);
- grx_text("Use 's' to lock counters value in right squares",
- 7, 51, rgb16(0, 255, 255), black);
- grx_text("Use 'g' to block or to release alternativly counter 0 (see top-left square)",
- 7, 58, rgb16(0, 255, 255), black);
-
- grx_text("Use 'h' to block or to release alternativly counter 1 (see bottom-left square)",
- 7, 65, rgb16(0, 255, 255), black);
-
- grx_text("Please connect DIO7 (pin 32) to PFI4 (pin 42) and DIO6 (pin 30) to PFI5 (pin 44)",
- 7, 78, rgb16(0, 255, 0), black);
- grx_text("CTRL-X for Exit", 7, 88, rgb16(200, 200, 0), black);
-
- grx_rect(1, 110, 355, 170, rgb16(0, 105, 0));
- grx_rect(2, 111, 354, 169, rgb16(0, 155, 0));
- grx_rect(3, 112, 353, 168, rgb16(0, 205, 0));
- grx_rect(4, 113, 352, 167, rgb16(0, 255, 0));
- grx_text("Counter 0 evolution", 7, 120, rgb16(255, 255, 0), black);
-
- grx_rect(455, 110, 799, 170, rgb16(0, 105, 0));
- grx_rect(456, 111, 798, 169, rgb16(0, 155, 0));
- grx_rect(457, 112, 797, 168, rgb16(0, 205, 0));
- grx_rect(458, 113, 796, 167, rgb16(0, 255, 0));
- grx_text("Counter 0 locked value", 461, 120, rgb16(255, 0, 255), black);
-
- grx_rect(360, 110, 450, 170, rgb16(0, 105, 0));
- grx_rect(361, 111, 449, 169, rgb16(0, 155, 0));
- grx_rect(362, 112, 448, 168, rgb16(0, 205, 0));
- grx_rect(363, 113, 447, 167, rgb16(0, 255, 0));
- grx_text("Gate0", 367, 120, rgb16(200, 255, 200), black);
- grx_text("0 V", 367, 145, rgb16(255, 0, 0), black);
-
- grx_rect(1, 190, 355, 260, rgb16(85, 85, 255));
- grx_rect(2, 191, 354, 259, rgb16(135, 135, 255));
- grx_rect(3, 192, 353, 258, rgb16(190, 190, 255));
- grx_rect(4, 193, 352, 257, rgb16(230, 239, 255));
- grx_text("Counter 1 evolution", 7, 200, white, black);
-
- grx_rect(455, 190, 799, 260, rgb16(85, 85, 255));
- grx_rect(456, 191, 798, 259, rgb16(135, 135, 255));
- grx_rect(457, 192, 797, 258, rgb16(190, 190, 255));
- grx_rect(458, 193, 796, 257, rgb16(230, 230, 255));
- grx_text("Counter 1 locked value", 461, 200, white, black);
-
- grx_rect(360, 190, 450, 260, rgb16(85, 85, 255));
- grx_rect(361, 191, 449, 259, rgb16(135, 135, 255));
- grx_rect(362, 192, 448, 258, rgb16(190, 190, 255));
- grx_rect(363, 193, 447, 257, rgb16(230, 230, 255));
- grx_text("Gate1", 367, 200, rgb16(255, 200, 255), black);
- grx_text("0 V", 367, 225, rgb16(255, 0, 0), black);
-
- grx_text("Counter 0 Interrupt events", 7, 340, rgb16(255, 200, 100), black);
- grx_text("Counter 1 Interrupt events", 461, 340, rgb16(255, 200, 100), black);
- grx_rect(1, 350, 355, 400, rgb16(105, 0, 0));
- grx_rect(2, 351, 354, 399, rgb16(155, 0, 0));
- grx_rect(3, 352, 353, 398, rgb16(205, 0, 0));
- grx_rect(4, 353, 352, 397, rgb16(255, 0, 0));
- grx_rect(455, 350, 799, 400, rgb16(105, 0, 0));
- grx_rect(456, 351, 798, 399, rgb16(155, 0, 0));
- grx_rect(457, 352, 797, 398, rgb16(205, 0, 0));
- grx_rect(458, 353, 796, 397, rgb16(255, 0, 0));
-}
-
-
-TASK show_per(int none)
-{
- DWORD val;
- char buf[30];
-
- while(1){
- val = TIM_readCounter(C0); //Read counter 0 value
- sprintf(buf, "HEX: %08lx DEC: %08ld", val ,val);
- grx_text(buf, 7, 145, rgb16(255, 0, 0), black);
-
- val = TIM_readCounter(C1); //Read counter 1 value
- sprintf(buf, "HEX: %08lx DEC: %08ld", val ,val);
- grx_text(buf, 7, 225, rgb16(255, 0, 0), black);
-
- task_endcycle();
- }
-}
-
-TASK show_aper(int dummy)
-{
- DWORD val;
- char buf[30];
-
- while(1){
- val = TIM_readCounter(C0);
- sprintf(buf, "HEX: %08lx DEC: %08ld", val, val);
- grx_text(buf, 461, 145, rgb16(80, 80, 255), black);
-
- val = TIM_readCounter(C1);
- sprintf(buf, "HEX: %08lx DEC: %08ld", val, val);
- grx_text(buf, 461, 225, rgb16(80, 80, 255), black);
-
- task_endcycle();
- }
-}
-
-void endfun(KEY_EVT *k)
-{
- sys_end();
-}
-
-void show_evt(KEY_EVT *k)
-{
- task_activate(show_aper_pid);
-}
-
-void gate_change(KEY_EVT *k)
-{
- if(k->ascii == 'g'){
- if( (out & 0x80) != 0){
- out &= 0x7F;
- grx_text("0 V", 367, 145, rgb16(255, 0, 0), black);
- } else {
- out |= 0x80;
- grx_text("5 V", 367, 145, rgb16(0, 255, 0), black);
- }
- } else {
- if( (out & 0x40) != 0){
- out &= 0xBF;
- grx_text("0 V", 367, 225, rgb16(255, 0, 0), black);
- } else {
- out |= 0x40;
- grx_text("5 V", 367, 225, rgb16(0, 255, 0), black);
- }
- }
-
- DIO_write(out);
-}
-
-void close_event(void *arg)
-{
- TIM_disarm(2); //Disable both two counters
- grx_close();
- handler_remove(INT_NO);
-
-
- switch(sys){
- case 0: cprintf("OK\n"); break;
- case 10: cprintf("Task <show aperiodic> down\n"); break;
- case 11: cprintf("Task <show periodic> down\n"); break;
- case 20: cprintf("No PCI bus\n"); break;
- case 21: cprintf("No National board on PCI bus\n"); break;
- case 30: cprintf("No graphic can be initialized\n"); break;
- case 31: cprintf("This graphic mode cannot be supported\n"); break;
- default: cprintf("???????????\n"); break;
- }
-}
-
-void int_evt(int intno)
-{
- WORD status;
-
- status = DAQ_STC_Windowed_Mode_Read(AI_STATUS_1);
- if( (status & 0x8000) != 0){
- if( (status & 0x0008) != 0){
- grx_text("INT Group A raised! G0 Rolls over", 7, 360, rgb16(0, 255, 0), black);
- set(interrupt_a_ack, 14);
- DAQ_STC_Windowed_Mode_Write(INTERRUPT_A_ACK, interrupt_a_ack);
- clr(interrupt_a_ack, 14);
- }
- if( (status & 0x0004) != 0){
- grx_text("INT Group A raised! G0 gate pressed", 7, 380, rgb16(0, 255, 0), black);
- set(interrupt_a_ack, 15);
- DAQ_STC_Windowed_Mode_Write(INTERRUPT_A_ACK, interrupt_a_ack);
- clr(interrupt_a_ack, 15);
- }
- return;
- }
-
- status = DAQ_STC_Windowed_Mode_Read(AO_STATUS_1);
- if( (status & 0x8000) != 0){
- if( (status & 0x0008) != 0){
- grx_text("INT Group B raised! G1 Rolls over", 461, 360, rgb16(0, 255, 0), black);
- set(interrupt_b_ack, 14);
- DAQ_STC_Windowed_Mode_Write(INTERRUPT_B_ACK, interrupt_b_ack);
- clr(interrupt_b_ack, 14);
- }
- if( (status & 0x0004) != 0){
- grx_text("INT Group B raised! G1 gate pressed", 461, 380, rgb16(0, 255, 0), black);
- set(interrupt_b_ack, 15);
- DAQ_STC_Windowed_Mode_Write(INTERRUPT_B_ACK, interrupt_b_ack);
- clr(interrupt_b_ack, 15);
- }
- return;
- }
-}
-/* End of file: Test_ec.c */
Index: demos/branches/pj/pci6025e/test_dac.c
===================================================================
--- demos/branches/pj/pci6025e/test_dac.c (revision 1085)
+++ demos/branches/pj/pci6025e/test_dac.c (nonexistent)
@@ -1,364 +0,0 @@
-/*****************************************************************************
-* Filename: test_dac.c *
-* Author: Marco Ziglioli (Doctor Stein) *
-* Date: 12/06/2001 *
-* Description: Little test program for Analog Output section of PCI6025E *
-*----------------------------------------------------------------------------*
-* Notes: Connect a multimeter to DAC1 output (pin 21) and watch *
-* tension value. Use '+' and '-' on numeric pad to increase *
-* and decrise voltage *
-* With this program it's possible to point out possible *
-* offset errors. To correct them no software are written but *
-* in National board package there's the program to calibrate *
-* the board. Otherwise you can see how much is the offset *
-* and you can compensate it through software value *
-*****************************************************************************/
-
-/* This file is part of the S.Ha.R.K. Project - http://shark.sssup.it
- *
- * Copyright (C) 2001 Marco Ziglioli
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include <drivers/glib.h>
-#include <drivers/keyb.h>
-#include <drivers/pci6025e/dac.h>
-
-#define TASK_VOLT_PERIOD 150E3
-#define TASK_VOLT_WCET 080E3
-#define TASK_DAC_PERIOD 050E3
-#define TASK_DAC_WCET 020E3
-
-#define CONV 10/2048
-
-#define TASK_GROUP 1
-
-WORD dac0_value = 0,
- dac1_value = 0;
-
-BYTE sys = 0;
-BYTE dac = 0;
-
-//some colors
-int black = rgb16(0, 0, 0),
- white = rgb16(255, 255, 255);
-
-void drawInterface(void);
-void endfun(KEY_EVT *);
-void inc(KEY_EVT *);
-void dec(KEY_EVT *);
-void change_dac(KEY_EVT *);
-void close_event(void *);
-TASK Voltage_body(int);
-TASK DAC_Check_body(int);
-
-int main(int argc, char **argv)
-{
- int modenum;
- KEY_EVT k;
- HARD_TASK_MODEL m, d;
- PID pid_m, pid_d;
-
- sys_atrunlevel(close_event, NULL, RUNLEVEL_BEFORE_EXIT);
-
- keyb_set_map(itaMap);
- k.flag = CNTR_BIT;
- k.scan = KEY_X;
- k.ascii = 'x';
- keyb_hook(k, endfun);
-
- k.flag = CNTL_BIT;
- keyb_hook(k, endfun);
-
- k.flag = 0;
- k.scan = 78;
- k.ascii = 43;
- keyb_hook(k, inc);
-
- k.flag = 0;
- k.scan = 74;
- k.ascii = 45;
- keyb_hook(k, dec);
-
- k.flag = 0;
- k.scan = KEY_V;
- k.ascii = 'v';
- keyb_hook(k, change_dac);
-
- hard_task_default_model(m);
- hard_task_def_wcet(m, TASK_VOLT_WCET);
- hard_task_def_mit(m, TASK_VOLT_PERIOD);
- hard_task_def_group(m, TASK_GROUP);
- pid_m = task_create("Voltage", Voltage_body, &m, NULL);
- if(pid_m == NIL){
- sys = 30;
- sys_end();
- }
-
- hard_task_default_model(d);
- hard_task_def_wcet(d, TASK_DAC_WCET);
- hard_task_def_mit(d, TASK_DAC_PERIOD);
- hard_task_def_group(d, TASK_GROUP);
- pid_d = task_create("DAC Check", DAC_Check_body, &d, NULL);
- if(pid_d == NIL){
- sys = 31;
- sys_end();
- }
-
- //Check if PCI bus is present
- if(pci_init()==-1){
- sys = 10;
- sys_end();
- }
- //Check if a NI board is on PCI bus
- if(!reMap()){
- sys = 11;
- sys_end();
- }
-
- if(grx_init()==-1){
- sys = 20;
- sys_end();
- }
-
- modenum = grx_getmode(800, 600, 16);
- if(modenum == -1){
- sys = 21;
- sys_end();
- }
- grx_setmode(modenum);
-
- drawInterface();
-
- //Analog output section set up
- DAC_Init();
-
- /*
- *AI_TIMEBASE div by 2; OUT_TIMEBASE div by 2; single DAC mode
- *TMRDACWR = 3 OUT_TIMEBASE period; FIFO flags polarity active low
- *TMRDACWR disabled; DMA PIO control = FIFO DATA interface mode
- *UPDATE signal timebase = AO_UPDATE pulse width
- *UPDATE pulsewidth = 3-3.5 OUT_TIMEBASE period
- *UPDATE signal polarity = HIGH Z
- */
- DAC_boardInit(0x02, 0x4000);
- /*
- *LDAC0 source = UPDATE
- *DAC0 update immediately
- *LDAC1 source = UPDATE
- *DAC1 update immediately
- */
- DAC_LDACSourceUpdate(0x00);
- //End of Analog output section setup
-
- group_activate(TASK_GROUP);
-
- return 0;
-}
-
-/*
-* Every time operator select a new value to send to a DAc this TASK makes
-* actions needed to perform the operation
-*/
-TASK Voltage_body(int dac_work)
-{
- WORD old0_value, old1_value;
- char buf[6];
- float volt;
-
- old0_value = dac0_value;
- old1_value = dac1_value;
- while(1){
- if(dac){
- if(dac1_value != old1_value){
- DAC_output(DAC1, dac1_value);
- old1_value = dac1_value;
- sprintf(buf, "%04d", dac1_value);
- grx_text(buf, 70, 120, rgb16(180, 0, 0), rgb16(255,255,140));
- sprintf(buf, "%04x", dac1_value);
- grx_text(buf, 300, 120, rgb16(180, 0, 0), rgb16(255,255,140));
- if( (dac1_value & 0x0800) == 0 )
- volt = (float)dac1_value * (float)CONV;
- else
- volt = (float)(dac1_value-0x0FFF) * (float)CONV;
- sprintf(buf, "%05.2f", volt);
- grx_text(buf, 70, 177, rgb16(180, 40, 180), black);
- }
- } else {
- if(dac0_value != old0_value){
- DAC_output(DAC0, dac0_value);
- old0_value = dac0_value;
- sprintf(buf, "%04d", dac0_value);
- grx_text(buf, 521, 120, rgb16(180, 0, 0), rgb16(255,255,140));
- sprintf(buf, "%04x", dac0_value);
- grx_text(buf, 754, 120, rgb16(180, 0, 0), rgb16(255,255,140));
- if( (dac0_value & 0x0800) == 0 )
- volt = (float)dac0_value * (float)CONV;
- else
- volt = (float)(dac0_value-0x0FFF) * (float)CONV;
- sprintf(buf, "%05.2f", volt);
- grx_text(buf, 521, 177, rgb16(180, 40, 180), black);
- }
- }
- task_endcycle();
- }
-}
-
-/*
-* This TASK show which is the DAC active
-*/
-TASK DAC_Check_body(int dummy)
-{
- BYTE old = dac;
- char buf[8];
-
- while(1){
- if(dac != old){
- old = dac;
- sprintf(buf, "DAC %d", dac);
- grx_text(buf, 385, 90, rgb16(255*dac, 255*(1-dac), 0), black);
- }
- task_endcycle();
- }
-}
-
-void drawInterface(void)
-{
- grx_rect(1, 1, 799, 69, rgb16(105, 0, 0));
- grx_rect(2, 2, 798, 68, rgb16(155, 0, 0));
- grx_rect(3, 3, 797, 67, rgb16(205, 0, 0));
- grx_rect(4, 4, 796, 66, rgb16(255, 0, 0));
-
- grx_text("Test program for Analog output section of PCI6025E",
- 7, 10, rgb16(50, 255, 50), black);
- grx_text("Use '+' and '-' on numeric pad to change tension",
- 7, 25, rgb16(0, 255, 255), black);
- grx_text("Connect a tester to DAC1 output (pin21) or to DAC0 output (pin20)",
- 7, 33, rgb16(0, 255, 255), black);
- grx_text("Use 'v' to alternate change active DAC",
- 7, 40, rgb16(0, 255, 255), black);
-
- grx_text("CTRL-X for Exit", 7, 55, rgb16(200, 200, 0), black);
-
- grx_rect(1, 80, 355, 150, rgb16(0, 105, 0));
- grx_rect(2, 81, 354, 149, rgb16(0, 155, 0));
- grx_rect(3, 82, 353, 148, rgb16(0, 205, 0));
- grx_rect(4, 83, 352, 147, rgb16(0, 255, 0));
-
- grx_rect(1, 160, 355, 199, rgb16(0, 105, 0));
- grx_rect(2, 161, 354, 198, rgb16(0, 155, 0));
- grx_rect(3, 162, 353, 197, rgb16(0, 205, 0));
- grx_rect(4, 163, 352, 196, rgb16(0, 255, 0));
-
- grx_rect(455, 80, 799, 150, rgb16(105, 105, 0));
- grx_rect(456, 81, 798, 149, rgb16(155, 155, 0));
- grx_rect(457, 82, 797, 148, rgb16(205, 205, 0));
- grx_rect(458, 83, 796, 147, rgb16(255, 255, 0));
-
- grx_rect(455, 160, 799, 199, rgb16(105, 105, 0));
- grx_rect(456, 161, 798, 198, rgb16(155, 155, 0));
- grx_rect(457, 162, 797, 197, rgb16(205, 205, 0));
- grx_rect(458, 163, 796, 196, rgb16(255, 255, 0));
-
- grx_rect(360, 80, 450, 105, rgb16(85, 85, 255));
- grx_rect(361, 81, 449, 104, rgb16(125, 125, 255));
- grx_rect(362, 82, 448, 103, rgb16(175, 175, 255));
- grx_rect(363, 83, 447, 102, rgb16(225, 225, 255));
-
- grx_rect(153, 93, 195, 103, rgb16(255, 0, 0));
- grx_text("DAC 1", 155, 95, rgb16(255, 170, 170), black);
-
- grx_rect(607, 93, 649, 103, rgb16(255, 0, 0));
- grx_text("DAC 0", 609, 95, rgb16(255, 255, 210), black);
-
- grx_text("Decimal", 7, 120, rgb16(120, 120, 255), black);
- grx_text("Hexadecimal", 200, 120, rgb16(120, 120, 255), black);
- grx_text("Tension", 7, 177, rgb16(120, 120, 255), black);
-
- grx_text("Decimal", 461, 120, rgb16(255, 120, 120), black);
- grx_text("Hexadecimal", 654, 120, rgb16(255, 120, 120), black);
- grx_text("Tension", 461, 177, rgb16(255, 120, 120), black);
-}
-
-void close_event(void *arg)
-{
- grx_close();
- switch(sys){
- case 0 : cprintf("Regular End\n"); break;
- case 1 : cprintf("End fun invoked\n"); break;
- case 10: cprintf("Pci bus not found\n"); break;
- case 11: cprintf("No National board found\n"); break;
- case 20: cprintf("Cannot initialize graphic envirorment\n"); break;
- case 21: cprintf("Cannot start envirorment in 800x600x16\n"); break;
- case 30: cprintf("Cannot create task <voltage>\n"); break;
- case 31: cprintf("Canot create task <DAC Check>\n"); break;
- case 40: cprintf("Break on clock end event\n"); break;
- default: cprintf("Unkwon exit event\n"); break;
- }
-}
-
-void endfun(KEY_EVT *k)
-{
- sys = 1;
- sys_end();
-}
-
-/*
-* Capture correct key event and increase output tension of active DAC
-*/
-void inc(KEY_EVT *k)
-{
- if(dac){
- if( (dac1_value & 0x0800) == 0 && dac1_value > 0x07FF )
- dac1_value = 0;
- else
- dac1_value++;
- } else {
- if( (dac0_value & 0x0800) == 0 && dac0_value > 0x07FF )
- dac0_value = 0;
- else
- dac0_value++;
- }
-}
-
-/*
-* Same as above but decrease tension
-*/
-void dec(KEY_EVT *k)
-{
- if(dac){
- if(dac1_value < 1)
- dac1_value = 0x0FFF;
- else
- dac1_value -= 1;
- } else {
- if(dac0_value < 1)
- dac0_value = 0x0FFF;
- else
- dac0_value -= 1;
- }
-}
-
-/*
-* Capture correct key event and change active DAC
-*/
-void change_dac(KEY_EVT *k)
-{
- if(dac) dac = 0;
- else dac = 1;
-}
-
Index: demos/branches/pj/pci6025e/test_ppi.c
===================================================================
--- demos/branches/pj/pci6025e/test_ppi.c (revision 1085)
+++ demos/branches/pj/pci6025e/test_ppi.c (nonexistent)
@@ -1,190 +0,0 @@
-/*****************************************************************************
-* Filename: Test_ppi.c *
-* Author: Marco Ziglioli (Doctor Stein) *
-* Date: 22/05/2001 *
-* Description: Test PPI82C55MSM on NI DAQ PCI6025E *
-*----------------------------------------------------------------------------*
-* Notes: Configures port A and port C in input and port B in output *
-* Test 1: *
-* Now connect port B to port A and watch on video value changes *
-* in counting order. After connect port B to port C and watch *
-* the same events on port C *
-* Test 2: *
-* Connect 8 LEDs on port B and port A and port C lines to Vcc or*
-* GND. Now run this test and watch 8 diode changing in counting *
-* mode and on screen port A and port C values displayed *
-*****************************************************************************/
-
-/* This file is part of the S.Ha.R.K. Project - http://shark.sssup.it
- *
- * Copyright (C) 2001 Marco Ziglioli
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-
-#include <drivers/keyb.h>
-#include <drivers/glib.h>
-#include <drivers/pci6025e/dio_ppi.h>
-
-void exit_fun(KEY_EVT *);
-TASK test_ppi(int);
-void close_event(void *);
-void draw_screen(void);
-
-BYTE system = 0;
-
-int main(int argc, char **argv)
-{
- HARD_TASK_MODEL m;
- KEY_EVT k;
- PID pid_m;
- int modenum;
-
- sys_atrunlevel(close_event, NULL, RUNLEVEL_BEFORE_EXIT);
-
- keyb_set_map(itaMap);
- k.flag = CNTL_BIT;
- k.scan = KEY_C;
- k.ascii = 'c';
- keyb_hook(k, exit_fun);
- k.flag = CNTR_BIT;
- k.scan = KEY_C;
- k.ascii = 'c';
- keyb_hook(k, exit_fun);
-
- hard_task_default_model(m);
- hard_task_def_wcet(m, 90000);
- hard_task_def_mit(m, 250000);
- pid_m = task_create("TEST PPI", test_ppi, &m, NULL);
- if(pid_m == NIL){
- system = 10;
- sys_end();
- }
-
- //Check if PCI bus is present
- if(pci_init() == -1){
- system = 20;
- sys_end();
- }
-
- //Look for a National board on PCI bus
- if(!reMap()){
- system = 21;
- sys_end();
- }
-
- //Start configuring DIO module
- PPI_init();
-
- grx_init();
- modenum = grx_getmode(640, 480, 16);
- if(modenum == -1){
- system = 30;
- sys_end();
- }
- grx_setmode(modenum);
-
- draw_screen();
-
- task_activate(pid_m);
-
- return 0;
-}
-
-void draw_screen(void)
-{
- grx_rect(5, 5, 610, 130, rgb16(255, 0, 0));
- grx_rect(4, 4, 611, 131, rgb16(0,255,255));
- grx_rect(3, 3, 612, 132, rgb16(255, 0, 0));
- grx_rect(15, 45, 195, 100, rgb16(255, 0, 0));
- grx_rect(215, 45, 395, 100, rgb16(0, 255, 0));
- grx_rect(415, 45, 595, 100, rgb16(200, 200, 255));
- grx_text("Test of PPI82C55MSM function (Hosted on PCI6025E)",
- 9, 7, rgb16(0, 255, 0), rgb16(0, 0, 0));
- grx_text("PORT A and PORT C are configured in input mode",
- 9, 20, rgb16(255, 70, 70), rgb16(0, 0, 0));
- grx_text("PORT B is configured in output mode",
- 9, 28, rgb16(255, 70, 70), rgb16(0, 0, 0));
- grx_text("PORT B (Output)", 35, 50, rgb16(200, 0, 0), rgb16(0, 0, 0));
- grx_text("PORT A (Input)", 235, 50, rgb16(30,255,30), rgb16(0, 0, 0));
- grx_text("PORT C (Input)", 435, 50, rgb16(200,200,255), rgb16(0, 0, 0));
- grx_text("CTRL + C to exit", 9, 115, rgb16(255,255,0), rgb16(0,0,0));
-}
-
-/*
-* At each activation this task sends out value on port B and reads values from
-* port A and C
-*/
-TASK test_ppi(int dummy)
-{
- BYTE val, pA, pC;
- int i;
- char buf[10];
-
- PPI_config(0x99); //Mode 0 for all; Port A, Port C input; Port B output
- val = 0;
- while(1){
- PPI_write(PPI_PORT_B, val); //sends out value
- pA = PPI_read(PPI_PORT_A); //reads from port A
- pC = PPI_read(PPI_PORT_C); //reads from port C
-
- for(i=7; i>=0; i--){
- if( (val>>i)%2 )
- grx_text("1", 25+10*(7-i), 75, rgb16(255,0,0), rgb16(0,0,0));
- else
- grx_text("0", 25+10*(7-i), 75, rgb16(255,0,0), rgb16(0,0,0));
- if( (pA>>i)%2 )
- grx_text("1", 225+10*(7-i), 75, rgb16(0,255,0), rgb16(0,0,0));
- else
- grx_text("0", 225+10*(7-i), 75, rgb16(0,255,0), rgb16(0,0,0));
- if( (pC>>i)%2 )
- grx_text("1", 425+10*(7-i), 75, rgb16(200,200,255), rgb16(0,0,0));
- else
- grx_text("0", 425+10*(7-i), 75, rgb16(200,200,255), rgb16(0,0,0));
- }
- sprintf(buf, "%03d", val);
- grx_text(buf, 140, 75, rgb16(255,0,0), rgb16(0,0,0));
- sprintf(buf, "%03d", pA);
- grx_text(buf, 340, 75, rgb16(0,255,0), rgb16(0,0,0));
- sprintf(buf, "%03d", pC);
- grx_text(buf, 540, 75, rgb16(200,200,255), rgb16(0,0,0));
- val++;
- task_endcycle();
- }
-}
-
-void close_event(void *arg)
-{
- grx_close();
- switch(system){
- case 0: kern_printf("Regular end\n"); break;
- case 10:kern_printf("Cannot create task 'TEST PPI'\n"); break;
- case 20:kern_printf("Pci bus don't find\n"); break;
- case 21:kern_printf("No National board on PC\n"); break;
- case 30:kern_printf("Cannot start graphic envirorment\n"); break;
- default: kern_printf("Unknown exit\n"); break;
- }
-}
-
-void exit_fun(KEY_EVT *k)
-{
- system = 0;
- sys_end();
-}
-
-/*end of file: test_ppi.c*/
Index: demos/branches/pj/pci6025e/test_bec.c
===================================================================
--- demos/branches/pj/pci6025e/test_bec.c (revision 1085)
+++ demos/branches/pj/pci6025e/test_bec.c (nonexistent)
@@ -1,336 +0,0 @@
-/*****************************************************************************
-* Filename: test_bec.c *
-* Author: Marco Ziglioli (Doctor Stein) *
-* Date: 20/06/2001 *
-* Description: Test program for buffered gated event counting using PCI6025E *
-* board *
-*----------------------------------------------------------------------------*
-* Notes: FOUT are enabled to provide a frequency of 6250 Hz. You could *
-* connect PFI3 (pin 41) and PFI6 (pin 45) to this source for counting *
-* edges. Gated counting are enabled and PFI4 (pin 42) is gate pin for *
-* counter 0 and PFI5 (pin 44) is gate pin for counter 0. DIO 7 and 6 *
-* are als configured to switch between 0 and 5 V. Connect DIO 7 to *
-* gate 0 and DIO 6 to gate 1. Use 'g' (counter 0) and 'h' (counter 1) *
-* to change DIO lines value. On left area of the screen you should *
-* see counter while counting and on the right area you should lock *
-* counter values by pressing 's' key. *
-* Notice that line parameters are enabled and accept inital value *
-* for the two counters. If they aren't specified or they are wrong *
-* counters start from 0x00FFFFFF (counter 0 which counts down) and *
-* 0x00000000 (counter 1 which counts up). *
-*****************************************************************************/
-
-/* This file is part of the S.Ha.R.K. Project - http://shark.sssup.it
- *
- * Copyright (C) 2001 Marco Ziglioli
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include <kernel/kern.h>
-#include <drivers/keyb.h>
-#include <drivers/glib.h>
-
-#include <drivers/pci6025e/timer.h>
-#include <drivers/pci6025e/dio_ppi.h>
-
-BYTE sys = 0;
-
-PID show_aper_pid;
-BYTE out = 0x00;
-
-int black = rgb16(0, 0, 0),
- white = rgb16(255, 255, 255);
-
-void endfun(KEY_EVT *);
-void close_event(void *);
-void show_evt(KEY_EVT *k);
-void gate_change(KEY_EVT *k);
-
-void drawInterface(void);
-
-TASK show_per(int);
-TASK show_aper(int);
-
-int main(int argc, char **argv)
-{
- KEY_EVT k;
- SOFT_TASK_MODEL show_per_mod, show_aper_mod;
- PID show_per_pid;
- int result, modenum;
- DWORD init_val_c0, init_val_c1;
-
- if(argc >= 3){
- if( (result = sscanf(argv[1], "%ld", &init_val_c0)) != 1)
- init_val_c0 = 0x00FFFFFF;
- if( (result = sscanf(argv[2], "%ld", &init_val_c1)) != 1)
- init_val_c1 = 0x00000000;
- }
- if(argc == 2){
- if( (result = sscanf(argv[1], "%ld", &init_val_c0)) != 1)
- init_val_c0 = 0x00FFFFFF;
- init_val_c1 = 0x00000000;
- }
- if(argc == 1){
- init_val_c0 = 0x00FFFFFF;
- init_val_c1 = 0x00000000;
- }
-
- sys_atrunlevel(close_event, NULL, RUNLEVEL_BEFORE_EXIT);
-
- k.flag = CNTL_BIT;
- k.scan = KEY_X;
- k.ascii = 'x';
- keyb_hook(k, endfun);
-
- k.flag = CNTR_BIT;
- keyb_hook(k, endfun);
-
- soft_task_default_model(show_aper_mod);
- soft_task_def_aperiodic(show_aper_mod);
- soft_task_def_level(show_aper_mod, 1);
- soft_task_def_period(show_aper_mod, 250000);
- soft_task_def_met(show_aper_mod, 30000);
- soft_task_def_wcet(show_aper_mod, 60000);
- if( (show_aper_pid = task_create("Show aperiodic task", show_aper, &show_aper_mod, NULL)) == NIL ){
- sys = 10;
- sys_end();
- }
-
- k.flag = 0;
- k.scan = KEY_S;
- k.ascii = 's';
- keyb_hook(k, show_evt);
-
- k.flag = 0;
- k.scan = KEY_G;
- k.ascii = 'g';
- keyb_hook(k, gate_change);
-
- k.scan = KEY_H;
- k.ascii = 'h';
- keyb_hook(k, gate_change);
-
- soft_task_default_model(show_per_mod);
- soft_task_def_level(show_per_mod, 1);
- soft_task_def_met(show_per_mod, 1000);
- soft_task_def_period(show_per_mod, 10000);
- if( (show_per_pid = task_create("Show periodic task", show_per, &show_per_mod, NULL)) == NIL){
- sys = 11;
- sys_end();
- }
-
- if(pci_init()==-1){
- sys = 20;
- sys_end();
- }
-
- if(!reMap()){
- sys = 21;
- sys_end();
- }
-
- if(grx_init()==-1){
- sys = 30;
- sys_end();
- }
-
- if( (modenum = grx_getmode(800, 600, 16)) == -1){
- sys = 31;
- sys_end();
- }
-
- grx_setmode(modenum);
-
- drawInterface();
-
- DIO_init();
- DIO_setup(0xFF);
- DIO_write(out);
-
- PFIprogramming(0x0000);
- setIntClock(1, 1, 0);
- TIM_reset(2); //Reset both two counters
-
-
- //Source PFI3(41); Gate PFI 4(42); Down counting; counts rising edge;
- TIM_bufferedEventCounting(C0, 0x04, 0x45, 0x01, init_val_c0);
-
- //Source PFI6(45); Gate PFI 5(44); Up counting; counts rising edge;
- TIM_bufferedEventCounting(C1, 0x87, 0x46, 0x00, init_val_c1);
-
- TIM_arm(2); //Arm both two counters
-
- task_activate(show_per_pid);
-
- return 0;
-}
-
-void drawInterface(void)
-{
- grx_rect(1, 1, 799, 99, rgb16(105, 0, 0));
- grx_rect(2, 2, 798, 98, rgb16(155, 0, 0));
- grx_rect(3, 3, 797, 97, rgb16(205, 0, 0));
- grx_rect(4, 4, 796, 96, rgb16(255, 0, 0));
-
- grx_text("Test program for Buffered Event Counting capacity of PCI6025E timers",
- 7, 10, rgb16(50, 255, 50), black);
-
- grx_text("This program counting rise edges on counters source (PFI3 & PFI6)",
- 7, 18, rgb16(0, 255, 255), black);
- grx_text("Counter 1 will be resetted every gate falling edge",
- 7, 26, rgb16(0, 255, 255), black);
- grx_text("(PFI 42 & 44) are enabled. Frequency Out (FOUT) is enabled and provides a frequency of 6250 Hz",
- 7, 34, rgb16(0, 255, 255), black);
-
- grx_text("Instruction:",7, 43, rgb16(255, 0, 0), black);
- grx_text("Use 's' to watch contents of Hardware save registers updated every time gate goes down",
- 7, 51, rgb16(0, 255, 255), black);
- grx_text("Use 'g' to generate an event on counter 0 gate (see top-left square)",
- 7, 58, rgb16(0, 255, 255), black);
-
- grx_text("Use 'h' to generate an event on counter 1 gate (see bottom-left square)",
- 7, 65, rgb16(0, 255, 255), black);
-
- grx_text("Please connect DIO7 (pin 32) to PFI4 (pin 42) and DIO6 (pin 30) to PFI5 (pin 44)",
- 7, 78, rgb16(0, 255, 0), black);
- grx_text("CTRL-X for Exit", 7, 88, rgb16(200, 200, 0), black);
-
- grx_rect(1, 110, 355, 170, rgb16(0, 105, 0));
- grx_rect(2, 111, 354, 169, rgb16(0, 155, 0));
- grx_rect(3, 112, 353, 168, rgb16(0, 205, 0));
- grx_rect(4, 113, 352, 167, rgb16(0, 255, 0));
- grx_text("Counter 0 evolution", 7, 120, rgb16(255, 255, 0), black);
-
- grx_rect(455, 110, 799, 170, rgb16(0, 105, 0));
- grx_rect(456, 111, 798, 169, rgb16(0, 155, 0));
- grx_rect(457, 112, 797, 168, rgb16(0, 205, 0));
- grx_rect(458, 113, 796, 167, rgb16(0, 255, 0));
- grx_text("Counter 0 locked value", 461, 120, rgb16(255, 0, 255), black);
-
- grx_rect(360, 110, 450, 170, rgb16(0, 105, 0));
- grx_rect(361, 111, 449, 169, rgb16(0, 155, 0));
- grx_rect(362, 112, 448, 168, rgb16(0, 205, 0));
- grx_rect(363, 113, 447, 167, rgb16(0, 255, 0));
- grx_text("Gate0", 367, 120, rgb16(200, 255, 200), black);
- grx_text("0 V", 367, 145, rgb16(255, 0, 0), black);
-
- grx_rect(1, 190, 355, 260, rgb16(85, 85, 255));
- grx_rect(2, 191, 354, 259, rgb16(135, 135, 255));
- grx_rect(3, 192, 353, 258, rgb16(190, 190, 255));
- grx_rect(4, 193, 352, 257, rgb16(230, 239, 255));
- grx_text("Counter 1 evolution", 7, 200, white, black);
-
- grx_rect(455, 190, 799, 260, rgb16(85, 85, 255));
- grx_rect(456, 191, 798, 259, rgb16(135, 135, 255));
- grx_rect(457, 192, 797, 258, rgb16(190, 190, 255));
- grx_rect(458, 193, 796, 257, rgb16(230, 230, 255));
- grx_text("Counter 1 locked value", 461, 200, white, black);
-
- grx_rect(360, 190, 450, 260, rgb16(85, 85, 255));
- grx_rect(361, 191, 449, 259, rgb16(135, 135, 255));
- grx_rect(362, 192, 448, 258, rgb16(190, 190, 255));
- grx_rect(363, 193, 447, 257, rgb16(230, 230, 255));
- grx_text("Gate1", 367, 200, rgb16(255, 200, 255), black);
- grx_text("0 V", 367, 225, rgb16(255, 0, 0), black);
-}
-
-TASK show_per(int none)
-{
- DWORD val;
- char buf[30];
-
- while(1){
- val = TIM_readCounter(C0); //Read from Hardware Save Register
- sprintf(buf, "HEX: %08lx DEC: %08ld", val ,val);
- grx_text(buf, 7, 145, rgb16(255, 0, 0), black);
-
- val = TIM_readCounter(C1); //Read from Hardware Save Register
- sprintf(buf, "HEX: %08lx DEC: %08ld", val ,val);
- grx_text(buf, 7, 225, rgb16(255, 0, 0), black);
-
- task_endcycle();
- }
-}
-
-TASK show_aper(int dummy)
-{
- DWORD val;
- char buf[30];
-
- while(1){
- val = TIM_readHWSaveReg(C0); //Read from Hardware Save Register
- sprintf(buf, "HEX: %08lx DEC: %08ld", val, val);
- grx_text(buf, 461, 145, rgb16(80, 80, 255), black);
-
- val = TIM_readHWSaveReg(C1); //Read from Hardware Save Register
- sprintf(buf, "HEX: %08lx DEC: %08ld", val, val);
- grx_text(buf, 461, 225, rgb16(80, 80, 255), black);
-
- task_endcycle();
- }
-}
-
-void endfun(KEY_EVT *k)
-{
- sys_end();
-}
-
-void show_evt(KEY_EVT *k)
-{
- task_activate(show_aper_pid);
-}
-
-void gate_change(KEY_EVT *k)
-{
- if(k->ascii == 'g'){
- if( (out & 0x80) != 0){
- out &= 0x7F;
- grx_text("0 V", 367, 145, rgb16(255, 0, 0), black);
- } else {
- out |= 0x80;
- grx_text("5 V", 367, 145, rgb16(0, 255, 0), black);
- }
- } else {
- if( (out & 0x40) != 0){
- out &= 0xBF;
- grx_text("0 V", 367, 225, rgb16(255, 0, 0), black);
- } else {
- out |= 0x40;
- grx_text("5 V", 367, 225, rgb16(0, 255, 0), black);
- }
- }
-
- DIO_write(out);
-}
-
-void close_event(void *arg)
-{
- TIM_disarm(2); //Disable both two counters
- grx_close();
-
- switch(sys){
- case 0: cprintf("OK\n"); break;
- case 10: cprintf("Task <show aperiodic> down\n"); break;
- case 11: cprintf("Task <show periodic> down\n"); break;
- case 20: cprintf("No PCI bus\n"); break;
- case 21: cprintf("No National board on PCI bus\n"); break;
- case 30: cprintf("No graphic can be initialized\n"); break;
- case 31: cprintf("This graphic mode cannot be supported\n"); break;
- default: cprintf("???????????\n"); break;
- }
-}
-/* End of file: Test_bec.c */
Index: demos/branches/pj/pci6025e/test_dio.c
===================================================================
--- demos/branches/pj/pci6025e/test_dio.c (revision 1085)
+++ demos/branches/pj/pci6025e/test_dio.c (nonexistent)
@@ -1,184 +0,0 @@
-/*****************************************************************************
-* Filename: Test_dio.c *
-* Author: Marco Ziglioli (Doctor Stein) *
-* Date: 22/03/2001 *
-* Last update: 22/03/2001 *
-* Description: Test STC digital lines (8 lines) *
-*----------------------------------------------------------------------------*
-* Notes: Configure DIO 4 5 6 7 in input and DIO 0 1 2 3 in output *
-* Two way to test this 8 lines: *
-* 1) Connect 4 LEDs to output lines and check LEDs lights *
-* themselves in counting order. Connect input lines to Vcc *
-* or GND and check on video that STC has readed the right *
-* nibble *
-* 2) Connect 4 output lines with 4 input lines and check on *
-* video that the nibble readed by STC change in counting *
-* order *
-*****************************************************************************/
-
-/* This file is part of the S.Ha.R.K. Project - http://shark.sssup.it
- *
- * Copyright (C) 2001 Marco Ziglioli
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include <drivers/glib.h>
-#include <drivers/keyb.h>
-#include <drivers/pci6025e/dio_ppi.h>
-
-BYTE system = 0;
-
-void close_event(void *);
-TASK test_DIO(int dummy);
-void exit_fun(KEY_EVT *);
-void draw_screen(void);
-
-
-int main(int argc, char **argv)
-{
- HARD_TASK_MODEL m;
- KEY_EVT k;
- PID pid_m;
- int modenum;
-
- sys_atrunlevel(close_event, NULL, RUNLEVEL_BEFORE_EXIT);
-
- keyb_set_map(itaMap);
- k.flag = CNTL_BIT;
- k.scan = KEY_C;
- k.ascii = 'c';
- keyb_hook(k, exit_fun);
- k.flag = CNTR_BIT;
- k.scan = KEY_C;
- k.ascii = 'c';
- keyb_hook(k, exit_fun);
-
- hard_task_default_model(m);
- hard_task_def_wcet(m, 90000);
- hard_task_def_mit(m, 250000);
- pid_m = task_create("TEST DIO", test_DIO, &m, NULL);
- if(pid_m == NIL){
- system = 10;
- sys_end();
- }
-
- //Check if PCI bus is present
- if(pci_init() == -1){
- system = 20;
- sys_end();
- }
-
- //Look for a National board on PCI bus
- if(!reMap()){
- system = 21;
- sys_end();
- }
-
- //Start configuring DIO module
- DIO_init();
-
- grx_init();
- modenum = grx_getmode(640, 480, 16);
- if(modenum == -1){
- system = 30;
- sys_end();
- }
- grx_setmode(modenum);
-
- draw_screen();
-
- task_activate(pid_m);
-
- return 0;
-}
-
-void draw_screen(void)
-{
- grx_rect(5, 5, 405, 130, rgb16(255, 0, 0));
- grx_rect(4, 4, 406, 131, rgb16(0,255,255));
- grx_rect(3, 3, 407, 132, rgb16(255, 0, 0));
- grx_rect(15, 45, 195, 100, rgb16(255, 0, 0));
- grx_rect(215, 45, 395, 100, rgb16(0, 255, 0));
- grx_text("Test of PCI6025E DIO function",
- 9, 7, rgb16(0, 255, 0), rgb16(0, 0, 0));
- grx_text("DIO 4-5-6-7 are configured in input mode",
- 9, 20, rgb16(255, 70, 70), rgb16(0, 0, 0));
- grx_text("DIO 0-1-2-3 are configured in output mode",
- 9, 28, rgb16(255, 70, 70), rgb16(0, 0, 0));
- grx_text("Output bits", 35, 50, rgb16(200, 0, 0), rgb16(0, 0, 0));
- grx_text("input bits", 235, 50, rgb16(30,255,30), rgb16(0, 0, 0));
- grx_text("CTRL + C to exit", 9, 115, rgb16(255,255,0), rgb16(0,0,0));
-}
-
-/*
-* At each activation this task change output value of lowest digitals line
-* and read value on highest digital lines, showing them at video
-*/
-TASK test_DIO(int dummy)
-{
- BYTE out_val = 0x00,
- in_val = 0;
- int i;
- char buf[10];
-
- //DIO 0..3 configured as output
- //DIO 4..7 configured as input
- DIO_setup(0x0F);
-
- while(1){
- DIO_write(out_val); //sends out value
- in_val = DIO_read() >> 4; //reads value
-
- for(i=3; i>=0; i--){
- if( (out_val>>i)%2 )
- grx_text("1", 25+10*(3-i), 75, rgb16(255,0,0), rgb16(0,0,0));
- else
- grx_text("0", 25+10*(3-i), 75, rgb16(255,0,0), rgb16(0,0,0));
- if( (in_val>>i)%2 )
- grx_text("1", 225+10*(3-i), 75, rgb16(0,255,0), rgb16(0,0,0));
- else
- grx_text("0", 225+10*(3-i), 75, rgb16(0,255,0), rgb16(0,0,0));
- }
- sprintf(buf, "%03d", out_val);
- grx_text(buf, 80, 75, rgb16(255,0,0), rgb16(0,0,0));
- sprintf(buf, "%03d", in_val);
- grx_text(buf, 280, 75, rgb16(0,255,0), rgb16(0,0,0));
-
- out_val = (out_val+1)%16;
- task_endcycle();
- }
-}
-
-void close_event(void *arg)
-{
- grx_close();
- switch(system){
- case 0: kern_printf("Regular end\n"); break;
- case 10:kern_printf("Cannot create task TEST DIO\n"); break;
- case 20:kern_printf("Pci bus don't find\n"); break;
- case 21:kern_printf("No National board on PC\n"); break;
- case 30:kern_printf("Cannot start graphic envirorment\n"); break;
- default: kern_printf("Unknown exit\n"); break;
- }
-}
-
-void exit_fun(KEY_EVT *k)
-{
- system = 0;
- sys_end();
-}
-
Index: demos/branches/pj/pci6025e/readme
===================================================================
--- demos/branches/pj/pci6025e/readme (revision 1085)
+++ demos/branches/pj/pci6025e/readme (nonexistent)
@@ -1,7 +0,0 @@
-These are the demos available for the National Instruments PCI6025e boards.
-
-These demos and the PCI driver have been made by
-Marco Ziglioli (zi_mar@libero.it). Please send any comments to:
-zi_mar@libero.it or to shark-help@gandalf.sssup.it.
-
-Paolo
Index: demos/branches/pj/pci6025e/makefile
===================================================================
--- demos/branches/pj/pci6025e/makefile (revision 1085)
+++ demos/branches/pj/pci6025e/makefile (nonexistent)
@@ -1,32 +0,0 @@
-#
-#
-# PCI6025E Examples and Test programs
-#
-#
-
-ifndef BASE
-BASE=../..
-endif
-include $(BASE)/config/config.mk
-
-PROGS= test_dac wave test_dio test_ppi test_ec test_bec test_mes test_bms
-
-include $(BASE)/config/example.mk
-
-test_dac:
- make -f $(SUBMAKE) APP=test_dac INIT= OTHEROBJS=initfile.o
-wave:
- make -f $(SUBMAKE) APP=wave INIT= OTHEROBJS=initfile.o
-test_dio:
- make -f $(SUBMAKE) APP=test_dio INIT= OTHEROBJS=initfile.o
-test_ppi:
- make -f $(SUBMAKE) APP=test_ppi INIT= OTHEROBJS=initfile.o
-test_ec:
- make -f $(SUBMAKE) APP=test_ec INIT= OTHEROBJS=initfile.o
-test_bec:
- make -f $(SUBMAKE) APP=test_bec INIT= OTHEROBJS=initfile.o
-test_mes:
- make -f $(SUBMAKE) APP=test_mes INIT= OTHEROBJS=initfile.o
-test_bms:
- make -f $(SUBMAKE) APP=test_bms INIT= OTHEROBJS=initfile.o
-
Index: demos/branches/pj/pci6025e/test_bms.c
===================================================================
--- demos/branches/pj/pci6025e/test_bms.c (revision 1085)
+++ demos/branches/pj/pci6025e/test_bms.c (nonexistent)
@@ -1,279 +0,0 @@
-/*****************************************************************************
-* Filename: test_bms.c *
-* Author: Marco Ziglioli (Doctor Stein) *
-* Date: 27/06/2001 *
-* Description: Test program for buffered period and semiperiod measurement *
-* capacity of National PCI6025E board *
-*----------------------------------------------------------------------------*
-* Notes: FOUT are enable and avaiable on pin 50 to provide 1 Mhz frequency *
-* You should connect source 0 (PIN 41) and source 1 (pin 45) to this *
-* freq source. Gate 0 (pin 42) and gate 1 (pin 44) must be connected *
-* rispectivly to DIO7 (pin 32) and DIO6 (pin 30). *
-* Use 'g' button to activate gate_action_task which generate a square *
-* wave with a freq of 0.5 Hz and Duty cycle of 75%. *
-* 's' button should show counters countent but gate_action_task *
-* when active shows counters content automatically so 's' button isn't*
-* useful. *
-*****************************************************************************/
-
-/* This file is part of the S.Ha.R.K. Project - http://shark.sssup.it
- *
- * Copyright (C) 2001 Marco Ziglioli
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include <kernel/kern.h>
-#include <drivers/keyb.h>
-#include <drivers/glib.h>
-
-#include <drivers/pci6025e/timer.h>
-#include <drivers/pci6025e/dio_ppi.h>
-
-#define SHOW_MET 30000
-#define SHOW_WCET 50000
-#define SHOW_PERIOD 1000000
-
-#define GATE_MET 2000
-#define GATE_WCET 5000
-#define GATE_PERIOD 2000000
-
-#define GATE_ACTION_P 500000
-#define GATE_ACTION_W 10000
-
-#define black rgb16(0, 0, 0)
-
-void endFun(KEY_EVT *);
-void gateEvent(KEY_EVT *);
-void showEvent(KEY_EVT *);
-
-void closeEvent(void *);
-
-void drawInterface(void);
-
-TASK show_val_body(int);
-TASK gate_action_body(int);
-
-BYTE sys = 0;
-PID show_val_pid, gate_action_pid;
-
-int main(int argc, char **argv)
-{
- KEY_EVT k;
- int modenum;
- SOFT_TASK_MODEL show_val_mod;
- HARD_TASK_MODEL gate_action_model;
-
- sys_atrunlevel(closeEvent, NULL, RUNLEVEL_BEFORE_EXIT);
-
- k.flag = CNTL_BIT;
- k.scan = KEY_X;
- k.ascii = 'x';
- keyb_hook(k, endFun);
-
- k.flag = CNTR_BIT;
- keyb_hook(k, endFun);
-
- k.flag = 0;
- k.scan = KEY_G;
- k.ascii = 'g';
- keyb_hook(k, gateEvent);
-
- k.scan = KEY_S;
- k.ascii = 's';
- keyb_hook(k, showEvent);
-
- if(pci_init()==-1){
- sys = 10;
- sys_end();
- }
-
- if(!reMap()){
- sys = 11;
- sys_end();
- }
-
- soft_task_default_model(show_val_mod);
- soft_task_def_aperiodic(show_val_mod);
- soft_task_def_level(show_val_mod, 1);
- soft_task_def_met(show_val_mod, SHOW_MET);
- soft_task_def_wcet(show_val_mod, SHOW_WCET);
- soft_task_def_period(show_val_mod, SHOW_PERIOD);
- if( (show_val_pid = task_create("Show task", show_val_body, &show_val_mod, NULL))
- == NIL ){
- sys = 20;
- sys_end();
- }
-
- hard_task_default_model(gate_action_model);
- hard_task_def_mit(gate_action_model, GATE_ACTION_P);
- hard_task_def_wcet(gate_action_model, GATE_ACTION_W);
- if( (gate_action_pid = task_create("Gate Action", gate_action_body, &gate_action_model, NULL))
- == NIL ){
- sys = 22;
- sys_end();
- }
-
- if(grx_init()==-1){
- sys = 30;
- sys_end();
- }
-
- if( (modenum = grx_getmode(800, 600, 16)) == -1){
- sys = 31;
- sys_end();
- }
-
- if(grx_setmode(modenum) == -1){
- sys = 32;
- sys_end();
- }
-
- drawInterface();
-
- DIO_init();
- DIO_setup(0xFF);
- DIO_write(0x00);
-
- //All PFI configured as input
- PFIprogramming(0x0000);
-
- //Fout provide 1MHz: timebase = 20MHz; divided by 2; on FOUT pin also divided by 10
- setIntClock(0, 1, 10);
-
- //Reset both counters
- TIM_reset(2);
-
- //C0 measures period on PFI3 with gate from PFI 4 driven by DIO7
- TIM_bufferedTimeMeasurement(C0, 0x04, 0x45, 0, 0);
-
- //C1 measures semiperiod on PFI 6 with gate from PFI 5 driven by FIO6
- TIM_bufferedTimeMeasurement(C1, 0x87, 0x46, 1, 0);
-
- //arm both counters
- TIM_arm(2);
-
- return 0;
-}
-
-void endFun(KEY_EVT *k)
-{
- sys_end();
-}
-
-void showEvent(KEY_EVT *k)
-{
- task_activate(show_val_pid);
-}
-
-void gateEvent(KEY_EVT *k)
-{
- task_activate(gate_action_pid);
-}
-
-void drawInterface(void)
-{
- grx_rect(1, 1, 799, 129, rgb16(105, 0, 0));
- grx_rect(2, 2, 798, 128, rgb16(155, 0, 0));
- grx_rect(3, 3, 797, 127, rgb16(205, 0, 0));
- grx_rect(4, 4, 796, 126, rgb16(255, 0, 0));
-
- grx_text("Test program for Buffered Period and Semiperiod measure through PCI6025E timers",
- 7, 10, rgb16(50, 255, 50), black);
-
- grx_text("This program counting rise edges on counters source (PFI3 & PFI6) between two rising",
- 7, 25, rgb16(0, 255, 255), black);
- grx_text("edges on gate (PFI 42) and beetwen each gate edge (PFI44).FOUT is enabled and",
- 7, 33, rgb16(0, 255, 255), black);
- grx_text("provides a frequency of 1 MHz", 7, 41, rgb16(0, 255, 255), black);
- grx_text("Instruction:",7, 53, rgb16(255, 0, 0), black);
- grx_text("Use 's' to see counters value",
- 7, 61, rgb16(0, 255, 255), black);
- grx_text("Use 'g' to enbale automatic tasks which generate square wave with freq of 0.5Hz",
- 7, 68, rgb16(0, 255, 255), black);
-
- grx_text("And duty cycle of 75%. Counter 0 must be loaded with about 2E6 ticks and counter 1",
- 7, 75, rgb16(0, 255, 255), black);
- grx_text("must be loaded alternativly with about 1.5E6 and 0.5E6 ticks",
- 7, 83, rgb16(0, 255, 255), black);
-
- grx_text("Please connect DIO7 (pin 32) to PFI4 (pin 42) and DIO6 (pin 30) to PFI5 (pin 44)",
- 7, 95, rgb16(0, 255, 0), black);
- grx_text("CTRL-X for Exit", 7, 110, rgb16(200, 200, 0), black);
-
- grx_rect(1, 147, 355, 183, rgb16(0, 105, 0));
- grx_rect(2, 148, 354, 182, rgb16(0, 155, 0));
- grx_rect(3, 149, 353, 181, rgb16(0, 205, 0));
- grx_rect(4, 150, 352, 180, rgb16(0, 255, 0));
- grx_text("Period", 7, 155, rgb16(255, 255, 0), black);
-
- grx_rect(455, 147, 799, 183, rgb16(0, 105, 0));
- grx_rect(456, 148, 798, 182, rgb16(0, 155, 0));
- grx_rect(457, 149, 797, 181, rgb16(0, 205, 0));
- grx_rect(458, 150, 796, 180, rgb16(0, 255, 0));
- grx_text("Semiperiod", 461, 155, rgb16(255, 0, 255), black);
-}
-
-TASK show_val_body(int dummy)
-{
- DWORD val;
- char buf[40];
-
- while(1){
- val = TIM_readHWSaveReg(C0);
- sprintf(buf,"C0 %07ld", val);
- grx_text(buf, 7, 165, rgb16(255, 0, 0), rgb16(0, 0, 0));
- val = TIM_readHWSaveReg(C1);
- sprintf(buf,"C1 %07ld", val);
- grx_text(buf, 461, 165, rgb16(0, 255, 0), rgb16(0, 0, 0));
-
- task_endcycle();
- }
-}
-
-TASK gate_action_body(int dummy)
-{
- int i;
- i = 0;
-
- while(1){
- if( (i%4)==0 ) DIO_write(0xC0);
- if( (i%4)==3 ) DIO_write(0x00);
-
- i++;
-
- task_activate(show_val_pid);
-
- task_endcycle();
- }
-}
-
-void closeEvent(void *arg)
-{
- grx_close();
- TIM_disarm(2);
- switch(sys){
- case 0: cprintf("Ok\n"); break;
- case 10: cprintf("No PCI\n"); break;
- case 11: cprintf("No National Board\n"); break;
- case 20: cprintf("task <show val> down\n"); break;
- case 22: cprintf("task <gate action> down\n"); break;
- case 30: cprintf("Cannot initialize grx\n"); break;
- case 31: cprintf("Resolution 800x600x16 not supported\n"); break;
- case 32: cprintf("Cannot sets up graphic envirorment\n"); break;
- default: cprintf("????????????\n"); break;
- }
-}
Index: demos/branches/pj/pci6025e/wave.c
===================================================================
--- demos/branches/pj/pci6025e/wave.c (revision 1085)
+++ demos/branches/pj/pci6025e/wave.c (nonexistent)
@@ -1,328 +0,0 @@
-/*****************************************************************************
-* Filename: wave.c *
-* Author: Marco Ziglioli (Doctor Stein) *
-* Date: 12/06/2001 *
-* Description: Little test program for Analog Output section of PCI6025E *
-*----------------------------------------------------------------------------*
-* Notes: Connect an oscilloscope to DACs output pins (20 & 21) and *
-* watch the waveforms. *
-* and decrise voltage *
-*****************************************************************************/
-
-/* This file is part of the S.Ha.R.K. Project - http://shark.sssup.it
- *
- * Copyright (C) 2001 Marco Ziglioli
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-
-#include <drivers/glib.h>
-#include <drivers/keyb.h>
-#include <modules/sem.h>
-
-#include <drivers/pci6025e/dac.h>
-
-#define MAX_VAL 500
-
-#define WAVE_PERIOD 1000
-#define WAVE_WCET 200
-#define GRAPH_PERIOD 1000
-#define GRAPH_WCET 550
-
-#define TASK_GROUP 1
-
-#define DAC0_CONV 0.1
-#define DAC1_CONV 0.05
-
-#define INC 40
-
-void createWaves(void);
-void drawInterface(void);
-
-void endfun(KEY_EVT *);
-void close_event(void *);
-
-TASK wave_body(int);
-TASK video_body(int);
-
-WORD wave0[MAX_VAL], wave1[MAX_VAL];
-int black = rgb16(0,0,0),
- white = rgb16(255, 255, 255);
-
-BYTE sys = 0;
-
-int main(int argc, char **argv)
-{
- KEY_EVT k;
- HARD_TASK_MODEL wave0, wave1;
- HARD_TASK_MODEL video;
- PID wave0_pid, wave1_pid, video_pid;
- int modenum;
-
- k.flag = CNTR_BIT;
- k.scan = KEY_X;
- k.ascii = 'x';
- keyb_hook(k, endfun);
-
- k.flag = CNTL_BIT;
- keyb_hook(k, endfun);
-
- sys_atrunlevel(close_event, NULL, RUNLEVEL_BEFORE_EXIT);
-
- hard_task_default_model(wave0);
- hard_task_def_wcet(wave0, WAVE_WCET);
- hard_task_def_mit(wave0, WAVE_PERIOD);
- hard_task_def_arg(wave0, 0);
- hard_task_def_group(wave0, TASK_GROUP);
- if( (wave0_pid = task_create("Wave 0", wave_body, &wave0, NULL)) == NIL ){
- sys = 10;
- sys_end();
- }
-
- hard_task_default_model(wave1);
- hard_task_def_wcet(wave1, WAVE_WCET);
- hard_task_def_mit(wave1, WAVE_PERIOD);
- hard_task_def_arg(wave1, (void *)1);
- hard_task_def_group(wave1, TASK_GROUP);
- if( (wave1_pid = task_create("Wave 1", wave_body, &wave1, NULL)) == NIL ){
- sys = 11;
- sys_end();
- }
-
- hard_task_default_model(video);
- hard_task_def_wcet(video, GRAPH_WCET);
- hard_task_def_mit(video, GRAPH_PERIOD);
- hard_task_def_group(video, TASK_GROUP);
- if( (video_pid = task_create("Video task", video_body, &video, NULL))
- == NIL ){
- sys = 12;
- sys_end();
- }
-
- if(pci_init() == -1){
- sys = 20;
- sys_end();
- }
-
- if(!reMap()){
- sys = 21;
- sys_end();
- }
-
- if(grx_init() == -1){
- sys = 30;
- sys_end();
- }
-
- if( (modenum = grx_getmode(800, 600, 16)) == -1 ){
- sys = 31;
- sys_end();
- }
-
- grx_setmode(modenum);
-
- createWaves();
- drawInterface();
- //Analog output section set up
- DAC_Init();
-
- /*
- *AI_TIMEBASE div by 2; OUT_TIMEBASE div by 2; single DAC mode
- *TMRDACWR = 3 OUT_TIMEBASE period; FIFO flags polarity active low
- *TMRDACWR disabled; DMA PIO control = FIFO DATA interface mode
- *UPDATE signal timebase = AO_UPDATE pulse width
- *UPDATE pulsewidth = 3-3.5 OUT_TIMEBASE period
- *UPDATE signal polarity = HIGH Z
- */
- DAC_boardInit(0x02, 0x4000);
-
- /*
- *LDAC0 source = UPDATE
- *DAC0 update immediately
- *LDAC1 source = UPDATE
- *DAC1 update immediately
- */
- DAC_LDACSourceUpdate(0x00);
- //End of Analog output section setup
-
-
- group_activate(TASK_GROUP);
-
- return 0;
-}
-
-void endfun(KEY_EVT *k)
-{
- sys_end();
-}
-
-void close_event(void *arg)
-{
- grx_close();
- switch(sys){
- case 0: cprintf("Regular End!\n"); break;
- case 10: cprintf("Cannot create <wave 0> task!\n"); break;
- case 11: cprintf("Cannot create <wave 1> task!\n"); break;
- case 12: cprintf("Cannot create <video> task!\n"); break;
- case 20: cprintf("No PCI bus found!\n"); break;
- case 21: cprintf("No NATIONAL PCI E-Series board found on PCI bus!\n");
- break;
- case 30: cprintf("Cannot start graphic envirorment!\n"); break;
- case 31: cprintf("800x600x16 video mode not supported!\n");
- default: cprintf("Unknown exit event!\n"); break;
- }
-}
-
-/*
-* Wave's samples generation
-*/
-void createWaves(void)
-{
- int i;
- WORD value0, value1;
- BYTE direction;
-
- /* Wave0
- * * * * * * * *
- ** ** ** ** ** ** ** **
- * ** * * ** ** ** ** ** *
- * * ** * * * * * *
- --------------------------...
-
- Wave 1
- * *
- * * * *
- * * * *
- * * * *
- -------*-------*-------*--...
- * * *
- * * *
- * *
- * */
-
- value0 = 0;
- value1 = 0;
- direction = 0;
- for(i=0; i<MAX_VAL; i++){
- wave0[i] = (value0 & 0x0FFF);
- wave1[i] = (value1 & 0x0FFF);
-
- value0 = (value0 + INC) % 2000;
- if(!direction) value1 += INC;
- else value1 -= INC;
-
- if(value1 >= 2000) direction = 1;
- if(value1 <= -2000) direction = 0;
- }
-}
-
-void drawInterface(void)
-{
- int i;
-
- grx_rect(1, 1, 799, 69, rgb16(105, 0, 105));
- grx_rect(2, 2, 798, 68, rgb16(155, 0, 155));
- grx_rect(3, 3, 797, 67, rgb16(205, 0, 205));
- grx_rect(4, 4, 796, 66, rgb16(255, 0, 255));
-
- grx_text("Test program for Analog output section of PCI6025E",
- 7, 10, rgb16(50, 255, 50), black);
- grx_text("DAC0 and DAC1 should generate saw-toothed wave and triangular wave",
- 7, 33, rgb16(0, 255, 255), black);
- grx_text("Use an oscilloscope to test this software",
- 7, 40, rgb16(0, 255, 255), black);
-
- grx_text("CTRL-X for Exit", 7, 55, rgb16(200, 200, 0), black);
-
- grx_text("DAC 0", 100, 92, rgb16(200, 200, 0), black);
- grx_rect(1, 100, 799, 325, rgb16(0, 105, 0));
- grx_rect(2, 101, 798, 324, rgb16(0, 155, 0));
- grx_rect(3, 102, 797, 323, rgb16(0, 205, 0));
- grx_rect(4, 103, 796, 322, rgb16(0, 255, 0));
- grx_line(19, 115, 19, 320, white);
- grx_line(14, 315, 530, 315, white);
-
- grx_text("DAC 1", 100, 362, rgb16(200, 200, 0), black);
- grx_rect(1, 370, 799, 595, rgb16(105, 0, 0));
- grx_rect(2, 371, 798, 594, rgb16(155, 0, 0));
- grx_rect(3, 372, 797, 593, rgb16(205, 0, 0));
- grx_rect(4, 373, 796, 592, rgb16(255, 0, 0));
- grx_line(19, 385, 19, 585, white);
- grx_line(14, 485, 530, 485, white);
-
- for(i=22; i<530; i+=2){
- //DAC0
- grx_plot(i, 115, white);
- grx_plot(i, 215, white);
- //DAC1
- grx_plot(i, 385, white);
- grx_plot(i, 435, white);
- grx_plot(i, 535, white);
- grx_plot(i, 585, white);
- }
-
- grx_text("5 V", 540, 211, rgb16(0, 255, 0), black);
- grx_text("10 V", 540, 111, rgb16(0, 255, 0), black);
- grx_text("+5 V", 540, 431, rgb16(0, 255, 0), black);
- grx_text("+10 V", 540, 381, rgb16(0, 255, 0), black);
- grx_text("-5 V", 540, 531, rgb16(255, 0, 0), black);
- grx_text("-10 V", 540, 581, rgb16(255, 0 , 0), black);
-}
-
-/*
-* Sends out waves' samples
-*/
-TASK wave_body(int wv)
-{
- int i = 0;
- while(1){
- if(wv)
- DAC_output(DAC1, wave1[i]);
- else
- DAC_output(DAC0, wave0[i]);
-
- i = (i + 1) % 500;
- task_endcycle();
- }
-}
-
-/*
-* Shows wave on screen
-*/
-TASK video_body(int dummy)
-{
- int i = 0;
- int n_tmp, o_tmp;
- //char buf[10];
-
- while(1){
- o_tmp = n_tmp;
- if( (wave1[i] & 0x0800) != 0 ) n_tmp = wave1[i]-0x0FFF;
- else n_tmp = wave1[i];
-
- if(i>0){
- grx_line(19+i, 314-wave0[i-1]*DAC0_CONV,
- 20+i, 314-wave0[i]*DAC0_CONV, rgb16(255, 255, 0));
- grx_line(19+i, 485-o_tmp*DAC1_CONV,
- 20+i, 485-n_tmp*DAC1_CONV, rgb16(0, 255, 255));
- }
-
- i = (i + 1) % 500;
- task_endcycle();
- }
-}
Index: demos/branches/pj/mix/mix.dat
===================================================================
--- demos/branches/pj/mix/mix.dat (revision 1085)
+++ demos/branches/pj/mix/mix.dat (nonexistent)
@@ -1,12 +0,0 @@
-TASK NAME PERIOD WCET
-------------------------------------------
-task1 watch: 1000000 200
-task2 tasto: 2000 200
-task3 palla: 2000 200
-task4 mosca: 20000 200
-task5 infor: 20000 300
-task6 ruota: 5000 400
-task7 color: 2000 200
-task8 pendo: 5000 400
-------------------------------------------
-
Index: demos/branches/pj/mix/initfile.c
===================================================================
--- demos/branches/pj/mix/initfile.c (revision 1085)
+++ demos/branches/pj/mix/initfile.c (nonexistent)
@@ -1,124 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- ------------
- CVS : $Id: initfile.c,v 1.1.1.1 2002-09-02 09:37:45 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:45 $
- ------------
-
- System initialization file
-
- This file contains the 2 functions needed to initialize the system.
-
- These functions register the following levels:
-
- an EDF (Earliest Deadline First) level
- a RR (Round Robin) level
- a CBS (Costant Bandwidth Server) level
- a Dummy level
-
- It can accept these task models:
-
- HARD_TASK_MODEL (wcet+mit) at level 0
- SOFT_TASK_MODEL (met, period) at level 1
- NRT_TASK_MODEL at level 2
-
- This file is similar to the configuration of kernel/init/hartik3.c
-
- TICK is set to 0 (one-shot timer is used)
-*/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/cbs.h"
-#include "modules/rr.h"
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-
-#include "drivers/keyb.h"
-
-
-/*+ sysyem tick in us +*/
-#define TICK 0
-
-/*+ RR tick in us +*/
-#define RRTICK 10000
-
-void read_file();
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- EDF_register_level(0);
- CBS_register_level(0, 0);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- dummy_register_level();
-
- SEM_register_module();
-
- CABS_register_module();
-
- read_file();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- KEYB_PARMS kparms = BASE_KEYB;
-
- HARTPORT_init();
-
- keyb_def_ctrlC(kparms, NULL);
- keyb_def_map(kparms,itaMap);
- KEYB_init(&kparms);
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
Index: demos/branches/pj/mix/readme
===================================================================
--- demos/branches/pj/mix/readme (revision 1085)
+++ demos/branches/pj/mix/readme (nonexistent)
@@ -1,7 +0,0 @@
-MIX
----
-
-This simple applications is a pout-pourri of simple graphic tasks
-that does different things with different timing constraints...
-
-Paolo
\ No newline at end of file
Index: demos/branches/pj/mix/makefile
===================================================================
--- demos/branches/pj/mix/makefile (revision 1085)
+++ demos/branches/pj/mix/makefile (nonexistent)
@@ -1,16 +0,0 @@
-#
-#
-#
-
-ifndef BASE
-BASE=../..
-endif
-include $(BASE)/config/config.mk
-
-PROGS= mix
-
-include $(BASE)/config/example.mk
-
-mix:
- make -f $(SUBMAKE) APP=mix INIT= OTHEROBJS="initfile.o" OTHERINCL=
-
Index: demos/branches/pj/mix/mix.c
===================================================================
--- demos/branches/pj/mix/mix.c (revision 1085)
+++ demos/branches/pj/mix/mix.c (nonexistent)
@@ -1,762 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- ------------
- CVS : $Id: mix.c,v 1.1.1.1 2002-09-02 09:37:45 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:45 $
- ------------
-*/
-
-/*
- * Copyright (C) 2000 Giorgio Buttazzo and Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*--------------------------------------------------------------*/
-/* DEMO with 9 INDEPENDENT TASKS */
-/*--------------------------------------------------------------*/
-
-#include <kernel/kern.h>
-#include <drivers/glib.h>
-#include <drivers/keyb.h>
-#include <semaphore.h>
-#include <stdlib.h>
-#include <math.h>
-
-#define PIG 3.1415
-#define ESC 27 /* ASCII code for ESCAPE */
-#define DURATA 10000 /* counter duration in tick */
-
-#define LW 200 /* window length */
-#define HW 150 /* window height */
-#define HLOAD 30 /* Y level for the max load */
-#define LLOAD (HW-HLOAD-5) /* length for the max load */
-
-#define XWL 10 /* left X of LEFT window */
-#define XWM 220 /* left X of MIDDLE window */
-#define XWR 430 /* left X RIGHT window */
-
-#define YWH 5 /* top Y of HIGH window */
-#define YWM 165 /* top Y of MIDDLE window */
-#define YWL 325 /* top Y of LOW window */
-
-char fbuf[1000]; /* buffer for reading a file */
-int flen; /* file length */
-int fine = 0; /* ending flag */
-
-sem_t mx_mat, mx_grf; /* mutex semaphores */
-
-int wcet[10]; /* array of task wcets */
-int period[10]; /* array of task periods */
-double load(long); /* load evaluation function */
-
-PID ptas;
-char talk[5][25] = {" SHARK Demonstration ",
- " RETIS Lab -- Scuola ",
- " Superiore S. Anna ",
- " HARD REAL-TIME DEMO ",
- " June 5, 2001 "};
-
-/*------------------------------------------------------*/
-/* file reading */
-/*------------------------------------------------------*/
-
-void read_file(void)
-{
- int err;
- DOS_FILE *fp;
-
- fp = DOS_fopen("mix.dat","r");
-
- if (!fp) {
- err = DOS_error();
- cprintf("Error %d opening myfile.txt...\n", err);
- flen = 0;
- return;
- }
-
- flen = DOS_fread(&fbuf, 1, 1000, fp);
- cprintf("Read %d bytes from file\n", flen);
- DOS_fclose(fp);
-}
-
-/*------------------------------------------------------*/
-/* get data from buffer */
-/*------------------------------------------------------*/
-
-void get_par(void)
-{
- int x = 0;
- int i;
-
- for (i=1; i<=8; i++) {
- while ((fbuf[x] != ':') && (x < flen)) x++;
- x++;
- sscanf(&fbuf[x], "%d %d", &period[i], &wcet[i]);
- cprintf("per[%d] = %d, wcet[%d] = %d\n",
- i, period[i], i, wcet[i]);
- }
-}
-
-/*--------------------------------------------------------------*/
-
-void byebye()
-{
- grx_close();
- kern_printf("Bye Bye!\n");
-}
-
-/*--------------------------------------------------------------*/
-
-void finish1()
-{
- sys_end();
-}
-
-/*--------------------------------------------------------------*/
-
-void finish2()
-{
- fine = 1;
-}
-
-/****************************************************************/
-/* PROCESSO OROLOGIO */
-/****************************************************************/
-
-#define LLAN 40 /* length of watch stick */
-
-TASK watch()
-{
- int x0 = XWL + LW/2;
- int y0 = YWH + HW/2;
- int grad;
- int xg, yg;
- int xt, yt, d;
- int sec, min;
- char s[5];
- double rad, x, y;
-
- xg = x0;
- yg = y0 - LLAN;
- xt = XWL + 78;
- yt = YWH + 12;
- sec = min = 0;
-
- while (1) {
- sec = (sec + 1) % 60;
- if (sec == 0) min++;
- grad = 90 - sec * 6;
- rad = (double)grad * PIG / 180.;
-
- sem_wait(&mx_mat);
- x = (double)x0 + (double)LLAN * cos(rad);
- y = (double)y0 - (double)LLAN * sin(rad);
- sem_post(&mx_mat);
-
- sem_wait(&mx_grf);
- grx_line(x0, y0, xg, yg, 0);
- sem_post(&mx_grf);
-
- xg = x;
- yg = y;
-
- sem_wait(&mx_grf);
- grx_line(x0, y0, xg, yg, 14);
- sem_post(&mx_grf);
-
- sem_wait(&mx_grf);
- grx_text("0 :0 ", xt, yt, 14, 0);
- sprintf(s, "%d", min);
- grx_text(s, xt+8, yt, 14, 0);
- sprintf(s, "%d", sec);
- if (sec > 9) d = 24; else d = 32;
- grx_text(s, xt+d, yt, 14, 0);
- sem_post(&mx_grf);
-
- task_endcycle();
- }
-}
-
-/****************************************************************/
-/* PROCESSO DI RIEMPIMENTO */
-/****************************************************************/
-
-#define CIMA (YWH+5) /* fondo del recipiente */
-#define FONDO (YWH+HW-5) /* cima del recipiente */
-#define LREC (XWM+75) /* lato sinistro recipiente */
-#define DREC 50 /* diametro del recipiente */
-
-TASK tasto()
-{
- int x, y;
- int x0; /* coord. sinistra recipiente */
- int col, cliq, bkg;
- int i;
- int liv; /* livello del liquido */
-
- cliq = 9;
- bkg = 14;
- x0 = LREC;
- x = x0 + DREC/2;
- y = CIMA;
- liv = FONDO;
-
- while (1) {
-
- col = cliq;
- for (i=0; i<2; i++) { /* disegna goccia */
- while (y < liv) {
- sem_wait(&mx_grf);
- grx_plot(x,y,col);
- sem_post(&mx_grf);
- y++;
- }
- y = CIMA;
- col = bkg;
- }
-
- liv--;
- sem_wait(&mx_grf);
- grx_line(x0+1, liv, x0+DREC-1, liv, cliq);
- sem_post(&mx_grf);
-
- if (liv <= CIMA+1) { /* swap colors */
- i = bkg; bkg = cliq; cliq = i;
- liv = FONDO;
- }
-
- task_endcycle();
- }
-}
-
-/****************************************************************/
-
-void kboar()
-{
- task_activate(ptas);
-}
-
-/****************************************************************/
-/* PROCESSO PALLA */
-/****************************************************************/
-
-#define VMIN 11. /* velocit… minima per suono */
-#define LP 3 /* lato della pallina */
-
-TASK palla()
-{
- int ox, oy; /* vecchia posizione pallina */
- int x0; /* posizione iniziale pallina */
- int xmin, xmax;
- int base, top;
- int xg, yg; /* coordinate grafiche pallina */
- double x, y; /* coordinate pallina */
- double G = 9.8;
- double vx, vy, v0; /* velocit… della pallina */
- double t, tx; /* variabile temporale */
- double dt; /* incremento temporale */
- double arg; /* variabile di appoggio */
-
- xmin = XWR+LP+1;
- xmax = XWR+LW-LP-1;
- base = YWH+HW-LP-1;
- top = HW-10-LP;
- x = ox = x0 = xmin;
- y = oy = top;
- arg = 2.*G*(double)top;
- vy = v0 = sqrt(arg);
- vx = 15.;
- tx = 0.0;
- t = vy / G;
- dt = .02;
-
- while (1) {
- x = x0 + vx*tx;
- y = base - vy*t + .5*G*t*t;
- if (y >= base) {
- t = 0.0;
- vy = v0;
- y = base - vy*t + .5*G*t*t;
- }
- if (x >= xmax) {
- tx = 0.0;
- x0 = xmax;
- vx = -vx;
- x = x0 + vx*tx;
- }
- if (x <= xmin) {
- tx = 0.0;
- x0 = xmin;
- vx = -vx;
- x = x0 + vx*tx;
- }
- xg = x; yg = y;
- sem_wait(&mx_grf);
- grx_disc(ox,oy,LP,0);
- grx_disc(xg,yg,LP,10);
- sem_post(&mx_grf);
- oy = yg; ox = xg;
- t += dt;
- tx += dt;
- task_endcycle();
- }
-}
-
-/****************************************************************/
-/* PROCESSO MOSCA */
-/****************************************************************/
-
-TASK mosca()
-{
- int x, y, Ax, Ay, h;
- int x0, y0, tet;
- int xmax,ymax;
- double A, B;
- double r;
- double rnd;
-
- xmax = LW/2-1; ymax = HW/2-1;
- x = 0; y = 0; tet = 0;
- x0 = XWL+LW/2; y0 = YWM+HW/2;
- A = 5.; B = 30.;
-
- while (1) {
-
- rnd = (rand()%100)/100.; /* rnd = [0,1] */
- h = (2. * B * rnd) - B; /* h = [-B,B] */
- tet = tet + h;
-
- if (tet > 360) tet = tet - 360;
- if (tet < 0) tet = tet + 360;
- r = tet * PIG / 180.;
-
- sem_wait(&mx_mat);
- Ax = (double)(A * cos(r));
- Ay = (double)(A * sin(r));
- sem_post(&mx_mat);
- x = x + Ax;
- y = y + Ay;
-
- if ((x >= xmax) || (x <= -xmax) ||
- (y >= ymax) || (y <= -ymax)) {
- x = x - Ax;
- y = y - Ay;
- tet = tet - 180;
- if (tet > 360) tet = tet - 360;
- if (tet < 0) tet = tet + 360;
- r = tet * PIG / 180.;
- sem_wait(&mx_mat);
- Ax = (double)(A * cos(r));
- Ay = (double)(A * sin(r));
- sem_post(&mx_mat);
- x = x + Ax;
- y = y + Ay;
- }
- sem_wait(&mx_grf);
- grx_plot(x+x0, y+y0, 10);
- sem_post(&mx_grf);
- task_endcycle();
- }
-}
-
-/****************************************************************/
-/* PROCESSO INFORMAZIONI */
-/****************************************************************/
-
-TASK infor()
-{
- char s[2];
- int x, y;
- int r;
- int i = 0;
- int leng;
- int col = 0;
-
- r = 0;
- x = XWM + 16;
- y = YWM + 40;
- s[1] = 0;
-
- leng = 0;
- while (talk[0][leng] != 0) leng++;
-
- while (1) {
- s[0] = talk[r][i];
- sem_wait(&mx_grf);
- grx_text(s,x+i*8,y+r*8,col+10,1);
- sem_post(&mx_grf);
- i++;
- if (i == leng) {
- i = 0;
- r = (r + 1) % 5;
- if (r == 0) col = (col + 1) % 6;
- }
- task_endcycle();
- }
-}
-
-/****************************************************************/
-/* PROCESSO RUOTA */
-/****************************************************************/
-
-TASK ruota()
-{
- int x0 = XWR + LW/2;
- int y0 = YWM + HW/2;
- int grad = 90;
- int xg, yg;
- double rad, x, y;
-
- xg = x0;
- yg = y0 + LLAN;
-
- while (1) {
-
- rad = (double)grad * PIG / 180.;
-
- sem_wait(&mx_mat);
- x = (double)x0 + (double)LLAN * cos(rad);
- y = (double)y0 + (double)LLAN * sin(rad);
- sem_post(&mx_mat);
-
- sem_wait(&mx_grf);
- grx_disc(xg, yg, 4, 0);
- sem_post(&mx_grf);
-
- xg = x; yg = y;
-
- sem_wait(&mx_grf);
- grx_disc(xg, yg, 4, 13);
- sem_post(&mx_grf);
-
- grad = (grad + 1) % 360;
-
- task_endcycle();
- }
-}
-
-/****************************************************************/
-/* PROCESSO COLORI */
-/****************************************************************/
-
-TASK color()
-{
- int xx0 = XWL+5;
- int yy0 = YWL+5;
- int n, col;
- int x, y;
-
- x = 0; y = 0;
-
- while (1) {
- n = 19. * ((rand()%100)/100.);
- x = xx0 + n * 10;
- n = 14. * ((rand()%100)/100.);
- y = yy0 + n * 10;
- col = 16. * ((rand()%100)/100.);
-
- /* xg = xx0 + x;
- yg = yy0 + y;
- x = (x + 10)%(LW-10);
- y = (y + 10)%(HW-10);
- */
- sem_wait(&mx_grf);
- grx_box(x, y, x+9, y+9, col);
- sem_post(&mx_grf);
-
- task_endcycle();
- }
-}
-
-/****************************************************************/
-/* PROCESSO PENDOLO */
-/****************************************************************/
-
-TASK pendo()
-{
- int x0 = XWM+LW/2;
- int y0 = YWL+10;
- int xg, yg;
- int col = 11;
- double x, y, teta;
- double v, a, dt;
- double g, l;
-
- g = 9.8;
- l = 80.;
- dt = 0.1;
- teta = 40. * PIG / 180.;
- v = 0.;
- sem_wait(&mx_mat);
- x = l * sin((double)teta);
- y = l * cos((double)teta);
- a = -(g/l) * sin((double)teta);
- sem_post(&mx_mat);
- xg = x0 + x;
- yg = y0 + y;
-
- while (1) {
-
- v += a * dt;
- teta += v * dt;
- sem_wait(&mx_mat);
- x = l * sin((double)teta);
- y = l * cos((double)teta);
- a = -(g/l) * sin((double)teta);
- sem_post(&mx_mat);
-
- sem_wait(&mx_grf);
- grx_line(x0, y0, xg, yg, 0);
- grx_circle(xg, yg, 5, 0);
- grx_disc(xg, yg, 4, 0);
- sem_post(&mx_grf);
-
- xg = x0+x; yg = y0+y;
-
- sem_wait(&mx_grf);
- grx_line(x0, y0, xg, yg, col);
- grx_circle(xg, yg, 5, col+2);
- grx_disc(xg, yg, 4, col+1);
- sem_post(&mx_grf);
-
- task_endcycle();
- }
-}
-
-/****************************** gener ******************************/
-
-TASK gener()
-{
- HARD_TASK_MODEL m;
- SOFT_TASK_MODEL am;
- PID pid;
-
- //---------------------------------------------
- hard_task_default_model(m);
- hard_task_def_wcet (m, wcet[1]);
- hard_task_def_mit (m, period[1]);
- hard_task_def_usemath (m);
- pid = task_create("watch", watch, &m, NULL);
- task_activate(pid);
- keyb_getch(BLOCK);
- //---------------------------------------------
- soft_task_default_model(am);
- soft_task_def_met (am, wcet[2]);
- soft_task_def_period (am, period[2]);
- soft_task_def_aperiodic(am);
- soft_task_def_usemath (am);
- ptas = task_create("tasto", tasto, &am, NULL);
- task_activate(ptas);
- keyb_getch(BLOCK);
- //---------------------------------------------
- hard_task_default_model(m);
- hard_task_def_wcet (m, wcet[3]);
- hard_task_def_mit (m, period[3]);
- hard_task_def_usemath (m);
- pid = task_create("palla", palla, &m, NULL);
- task_activate(pid);
- keyb_getch(BLOCK);
- //---------------------------------------------
- hard_task_default_model(m);
- hard_task_def_wcet (m, wcet[4]);
- hard_task_def_mit (m, period[4]);
- hard_task_def_usemath (m);
- pid = task_create("mosca", mosca, &m, NULL);
- task_activate(pid);
- keyb_getch(BLOCK);
- //---------------------------------------------
- hard_task_default_model(m);
- hard_task_def_wcet (m, wcet[5]);
- hard_task_def_mit (m, period[5]);
- hard_task_def_usemath (m);
- pid = task_create("infor", infor, &m, NULL);
- task_activate(pid);
- keyb_getch(BLOCK);
- //---------------------------------------------
- hard_task_default_model(m);
- hard_task_def_wcet (m, wcet[6]);
- hard_task_def_mit (m, period[6]);
- hard_task_def_usemath (m);
- pid = task_create("ruota", ruota, &m, NULL);
- task_activate(pid);
- keyb_getch(BLOCK);
- //---------------------------------------------
- hard_task_default_model(m);
- hard_task_def_wcet (m, wcet[7]);
- hard_task_def_mit (m, period[7]);
- hard_task_def_usemath (m);
- pid = task_create("color", color, &m, NULL);
- task_activate(pid);
- keyb_getch(BLOCK);
- //---------------------------------------------
- hard_task_default_model(m);
- hard_task_def_wcet (m, wcet[8]);
- hard_task_def_mit (m, period[8]);
- hard_task_def_usemath (m);
- pid = task_create("pendo", pendo, &m, NULL);
- task_activate(pid);
- //---------------------------------------------
-
- return NULL;
-}
-
-/****************************** MAIN ******************************/
-
-TASK main()
-{
- char s[20]; /* carattere letto da tastiera */
- int x0, y0;
- int x, y;
- TIME t1, count; /* contatori valutazione carico */
- double car; /* valore del carico corrente */
- TIME seme;
- PID pid;
- NRT_TASK_MODEL m2;
- KEY_EVT eva, evx, evs;
-
- set_exchandler_grx();
- sys_atrunlevel(byebye, NULL, RUNLEVEL_BEFORE_EXIT);
-
- /* set the keyboard handler */
- eva.ascii = 'a';
- eva.scan = KEY_A;
- eva.flag = 0;
- keyb_hook(eva,kboar);
-
- evx.ascii = 'x';
- evx.scan = KEY_X;
- evx.flag = ALTL_BIT;
- keyb_hook(evx,finish1);
-
- evs.ascii = ESC;
- evs.scan = KEY_ESC;
- evs.flag = 0;
- keyb_hook(evs,finish2);
-
- sem_init(&mx_mat,0,1);
- sem_init(&mx_grf,0,1);
-
- seme = sys_gettime(NULL);
- srand(seme);
-
- get_par();
- keyb_getch(BLOCK);
-
- grx_init();
- grx_open(640, 480, 8);
-
- grx_rect(XWL,YWH,XWL+LW,YWH+HW,14);
- grx_rect(XWM,YWH,XWM+LW,YWH+HW,14);
- grx_rect(XWR,YWH,XWR+LW,YWH+HW,14);
-
- grx_rect(XWL,YWM,XWL+LW,YWM+HW,14);
- grx_rect(XWM,YWM,XWM+LW,YWM+HW,14);
- grx_rect(XWR,YWM,XWR+LW,YWM+HW,14);
-
- grx_rect(XWL,YWL,XWL+LW,YWL+HW,14);
- grx_rect(XWM,YWL,XWM+LW,YWL+HW,14);
- grx_rect(XWR,YWL,XWR+LW,YWL+HW,14);
-
- x0 = XWL + LW/2;
- y0 = YWH + HW/2;
- grx_circle(x0, y0, LLAN+3, 12);
- grx_rect(XWL+74, YWH+7, XWL+120, YWH+22, 12);
-
- x0 = LREC;
- grx_line(x0, CIMA, x0, FONDO, 15);
- grx_line(x0+DREC, CIMA, x0+DREC, FONDO, 15);
- grx_line(x0, FONDO, x0+DREC, FONDO, 15);
- grx_box(x0+1, CIMA, x0+DREC-1, FONDO-1, 14);
- grx_text("Press A", XWM+16, YWH+48, 10, 0);
- grx_text("to fill", XWM+16, YWH+64, 10, 0);
-
- grx_text("Press:", XWM+18, YWM+HW-50, 10, 0);
- grx_text("ESC to exit", XWM+18, YWM+HW-40, 10, 0);
- grx_text("SPACE to create", XWM+18, YWM+HW-30, 10, 0);
-
- x0 = XWR + LW/2;
- y0 = YWM + HW/2;
- grx_circle(x0, y0, LLAN/3, 14);
- grx_disc(x0, y0, LLAN/3-1, 12);
-
- x0 = XWR+5;
- y0 = YWL+HW-5;
- grx_line(x0, YWL+HLOAD, x0+LW-10, YWL+HLOAD, 12);
- grx_text("SYSTEM WORKLOAD:", x0+5, YWL+HLOAD-10, 10, 0);
-
- count = 0;
- t1 = sys_gettime(NULL);
- do count++; while (sys_gettime(NULL) < (t1 + DURATA));
-
- nrt_task_default_model(m2);
- pid = task_create("gener", gener, &m2, NULL);
- task_activate(pid);
-
- x = 0;
- while (!fine) {
- car = load(count);
- y = (double)LLOAD*car;
- sem_wait(&mx_grf);
- grx_line(x0+x, y0-LLOAD+1, x0+x, y0, 0);
- grx_line(x0+x, y0-y, x0+x, y0, 15);
- grx_text(" ", x0+LW-60, YWL+HLOAD-10, 0, 0);
- sprintf(s, "%.3f", car);
- grx_text(s, x0+LW-50, YWL+HLOAD-10, 15, 0);
- sem_post(&mx_grf);
- x = (x + 1) % (LW-10);
- }
-
- sys_end();
-
- return NULL;
-}
-
-/****************************************************************/
-
-double load(long n)
-{
- TIME i, t1;
- double carico;
-
- i = 0;
- t1 = sys_gettime(NULL);
- do i++; while (sys_gettime(NULL) < (t1 + DURATA));
- carico = 1. - (double)i / (double)n;
- return(carico);
-}
-
-/****************************************************************/
Index: demos/branches/pj/cbs_ft/initfile.c
===================================================================
--- demos/branches/pj/cbs_ft/initfile.c (revision 1085)
+++ demos/branches/pj/cbs_ft/initfile.c (nonexistent)
@@ -1,112 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@hartik.sssup.it>
- *
- * Authors : Marco caccamo and Paolo Gai
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: initfile.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:41 $
- ------------
-
- This file contains the server CBS_FT
-
- Read CBS_FT.h for further details.
-
-**/
-
-/*
- * Copyright (C) 2000 Marco Caccamo and Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "kernel/kern.h"
-#include <modules/edf.h>
-#include <modules/rr.h>
-#include "cbs_ft.h"
-#include <modules/cbs.h>
-#include <modules/dummy.h>
-#include <drivers/keyb.h>
-#include <modules/hartport.h>
-#include <modules/sem.h>
-#include <modules/cabs.h>
-
-/*+ system tick in us +*/
-#define TICK 300
-#define RRTICK 5000
-
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- EDF_register_level(EDF_ENABLE_ALL);
- CBS_FT_register_level(CBS_FT_ENABLE_ALL, 0);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- CBS_register_level(CBS_ENABLE_ALL, 0);
- dummy_register_level();
-
- SEM_register_module();
- CABS_register_module();
-
- // periodic timer
- return TICK;
- // one-shot timer
- // return 0
-}
-
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- HARTPORT_init();
-
- KEYB_init(NULL);
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Index: demos/branches/pj/cbs_ft/cbs_ft.h
===================================================================
--- demos/branches/pj/cbs_ft/cbs_ft.h (revision 1085)
+++ demos/branches/pj/cbs_ft/cbs_ft.h (nonexistent)
@@ -1,166 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@hartik.sssup.it>
- *
- * Authors : Marco Caccamo and Paolo Gai
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: cbs_ft.h,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:41 $
- ------------
-
- This file contains the server CBS_FT
-
- Read CBS_FT.h for further details.
-
-**/
-
-/*
- * Copyright (C) 2000 Marco Caccamo and Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#ifndef __CBS_FT__
-#define __CBS_FT__
-
-
-
-#include <ll/string.h>
-#include <kernel/model.h>
-#include <kernel/descr.h>
-#include <kernel/var.h>
-#include <kernel/func.h>
-
-
-
-
-
-
-/*+ flags... +*/
-#define CBS_FT_ENABLE_GUARANTEE 1 /*+ Task Guarantee enabled +*/
-#define CBS_FT_ENABLE_ALL 1
-
-#define CBS_FT_FAILED_GUARANTEE 8 /*+ used in the module, unsettable
- in EDF_register_level... +*/
-
-
-#define PRIMARY 1
-#define BACKUP 2
-#define FT_PCLASS 0x0700 // Nuova classe di task, quelli fault_tolerant
-
-#define CBS_FT_LEVELNAME "CBSFT base"
-#define CBS_FT_LEVEL_CODE 110
-#define CBS_FT_LEVEL_VERSION 1
-
-
-/* The Fault-Tolerant Task model extends the base task model
- This model cannot be APERIODIC, only PERIODIC tasks are allowed.
- A faut-tolerant application is composed by two different tasks (primary and
- backup). The backup task is characterized by its WCET and its type (BACKUP).
- The primary task must define the task period, its average execution time
- (used as sort of prediction in order to recharge the budget using the
- capacity cash queue!), the budget (budget / period = U that is, the
- bandwidth assigned to the fault-tolerant application), its type (PRIMARY)
- and finally the PID of the corresponding backup task. */
-
-typedef struct {
- TASK_MODEL t;
-
- TIME wcetB; // WCET of the backup job (BACKUP TASK ONLY)
-
- TIME execP; // average exec. time of the primary job (PRIMARY TASK ONLY)
-
- TIME period; // period of the fault-tolerant task (PRIMARY TASK ONLY)
-
- int budget; // amount of guaranteed capacity (PRIMARY TASK ONLY)
-
- char type; // PRIMARY or BACKUP
-
- PID backup; // (PRIMARY TASK ONLY)
-
-} FT_TASK_MODEL;
-
-
-#define ft_task_default_model(m) \
- task_default_model((m).t,FT_PCLASS), \
- (m).period = 0, \
- (m).wcetB = 0, \
- (m).execP = 0, \
- (m).budget = 0, \
- (m).type = BACKUP, \
- (m).backup = NIL
-
-#define ft_task_def_level(m,l) task_def_level((m).t,l)
-#define ft_task_def_arg(m,a) task_def_arg((m).t,a)
-#define ft_task_def_stack(m,s) task_def_stack((m).t,s)
-#define ft_task_def_stackaddr(m,s) task_def_stackaddr((m).t,s)
-#define ft_task_def_usemath(m) task_def_usemath((m).t)
-#define ft_task_def_ctrl_jet(m) task_def_ctrl_jet((m).t)
-#define ft_task_def_group(m,g) task_def_group((m).t,g)
-#define ft_task_def_period(m,o) (m).period = (o)
-#define ft_task_def_budget(m,o) (m).budget = (o)
-#define ft_task_def_backup(m) (m).type = BACKUP
-#define ft_task_def_primary(m) (m).type = PRIMARY
-#define ft_task_def_backup_task(m,b) (m).backup = b
-#define ft_task_def_backup_wcet(m,b) (m).wcetB = b
-#define ft_task_def_primary_exec(m,b) (m).execP = b
-
-/************************************************************************/
-void CBS_FT_register_level(int flags, LEVEL master);
-
-
-bandwidth_t CBS_FT_usedbandwidth(LEVEL l);
-
-
-
-/* This function notifies to a primary task that the task itself has to
- suspend its execution (the task has to suspend itself with a
- task_endcycle() */
-char CBS_FT_Checkpoint(void);
-
-
-
-/* This function sets the checkpoint flag! hence, at the next checkpoint,
- that is:
-
- if (CBS_FT_Checkpoint()) {
- task_endcycle();
- continue;
- }
-
- the primary task will suspend itself switching to the backup task */
-void CBS_FT_Primary_Abort(void);
-
-/***************************************************************************/
-
-
-
-
-#endif
Index: demos/branches/pj/cbs_ft/prova.c
===================================================================
--- demos/branches/pj/cbs_ft/prova.c (revision 1085)
+++ demos/branches/pj/cbs_ft/prova.c (nonexistent)
@@ -1,429 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@hartik.sssup.it>
- *
- * Authors : Marco Caccamo and Paolo Gai
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: prova.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:41 $
- ------------
-
- testcash.c
- test for the CASH Module, directly derived from Test Number 13 (D)
-
-**/
-
-/*
- * Copyright (C) 2000 Marco Caccamo and Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-#include <modules/edf.h>
-#include "cbs_ft.h"
-#include <math.h>
-#include <stdlib.h>
-
-#define ASTER_LIM 60
-#define DISPLAY_MAX 15
-
-#define STAT_Y 9
-
-#define INPUT 0.5
-
-
-
-#define MAX_STAT 10000
-#define RVAL 1
-#define XVAL 2
-#define DVAL 3
-
-
-struct statistic {
- TIME r_time;
- TIME ex_time;
- long dead_post;
-};
-
-
-
- struct statistic stat[MAX_STAT];
- TIME val[MAX_STAT];
-
-int n_stat = 0;
-
-TASK hard_aster1p(void)
-{
- int i;
- int y = 1;
- int load1,j;
-
- char s[2];
-
- s[0] = 'P'; s[1] = 0;
-
-
- for (;;) {
- i = 1;
- while (i < ASTER_LIM) {
- load1 = 20000; //+ rand() % 25000;
- for (j=0; j<load1; j++) {
- if (CBS_FT_Checkpoint())
- break;
- puts_xy(i,y,rand()%15+1,s);
- }
- //kern_cli();
- //stat[n_stat].r_time = CBSGHD_get_response_time(1, exec_shadow);
- //jet_gettable(exec_shadow, &stat[n_stat].ex_time, 1);
- //kern_sti();
- //n_stat++;
- task_endcycle();
- puts_xy(i,y,WHITE," ");
- i++;
- }
- }
-}
-
-
-TASK hard_aster1b(void)
-{
- int i;
- int y = 1;
-
- int load1,j;
-
- char s[2];
-
- s[0] = 'B'; s[1] = 0;
-
- for (;;) {
- i = 1;
- while (i < ASTER_LIM) {
- load1 = 20000;// + rand()%4000;
- for (j=0; j<load1; j++) {
- puts_xy(i,y,rand()%15+1,s);
- }
- //kern_cli();
- //stat[n_stat].r_time = CBSGHD_get_response_time(1, exec_shadow);
- //jet_gettable(exec_shadow, &stat[n_stat].ex_time, 1);
- //kern_sti();
- //n_stat++;
- task_endcycle();
- puts_xy(i,y,WHITE," ");
- i++;
- }
- }
-}
-
-
-TASK hard_aster2p(void)
-{
- int i;
- int y = 3;
-
- int load1,j;
-
- char s[2];
-
- s[0] = 'P'; s[1] = 0;
-
- for (;;) {
- i = 1;
- while (i < ASTER_LIM) {
- load1 = 20000 + rand() % 20000;
- for (j=0; j<load1; j++) {
- if (CBS_FT_Checkpoint())
- break;
- puts_xy(i,y,rand()%15+1,s);
- }
- //kern_cli();
- //stat[n_stat].r_time = CBSGHD_get_response_time(5, exec_shadow);
- //jet_gettable(exec_shadow, &stat[n_stat].ex_time, 1);
- //kern_sti();
- //n_stat++;
- task_endcycle();
- puts_xy(i,y,WHITE," ");
- i++;
- }
- }
-}
-
-TASK hard_aster2b(void)
-{
- int i;
- int y = 3;
-
- int load1,j;
-
- char s[2];
-
- s[0] = 'T'; s[1] = 0;
-
- for (;;) {
- i = 1;
- while (i < ASTER_LIM) {
- load1 = 20000;
- for (j=0; j<load1; j++) {
- puts_xy(i,y,rand()%15+1,s);
- }
- //kern_cli();
- //stat[n_stat].r_time = CBSGHD_get_response_time(5, exec_shadow);
- //jet_gettable(exec_shadow, &stat[n_stat].ex_time, 1);
- //kern_sti();
- //n_stat++;
- task_endcycle();
- puts_xy(i,y,WHITE," ");
- i++;
- }
- }
-}
-
-
-TASK clock()
-{
- int s = 0, m = 0;
-
- while(1) {
- printf_xy(62,1,WHITE,"%2d:%2d",m,s);
- printf_xy(62,2,WHITE,"Utot=%12u",MAX_BANDWIDTH);
- printf_xy(62,3,WHITE,"Uedf=%12u",EDF_usedbandwidth(0));
- printf_xy(62,4,WHITE,"Ucbs=%12u",CBS_FT_usedbandwidth(1));
- task_endcycle();
-
- if (++s > 59) {
- s = 0;
- m++;
- }
- printf_xy(62,1,WHITE,"%2d:%2d",m,s);
- printf_xy(62,2,WHITE,"Utot=%12u",MAX_BANDWIDTH);
- printf_xy(62,3,WHITE,"Uedf=%12u",EDF_usedbandwidth(0));
- printf_xy(62,4,WHITE,"Ucbs=%12u",CBS_FT_usedbandwidth(1));
- task_endcycle();
- }
-}
-
-
-
-/* we consider the first ASTER_MAX + 2 tasks from the PID 2
- and plot on the screen the elapsed times... */
-TASK jetcontrol()
-{
- int i; /* a counter */
- TIME sum, max, curr, last[5];
- int nact;
- int j; /* the elements set by jet_gettable */
- PID p;
-
-
- kern_cli();
- printf_xy(0,STAT_Y,WHITE,"PID ³ Mean T.³ Max T. ³ N.A. ³ Curr. ³ Last1 ³ Last2 ³ Last3 ³ Last4 ³ Last5");
- kern_sti();
-
- for (;;) {
- for (i=0,p=0; i<DISPLAY_MAX+5 && p<MAX_PROC; p++) {
- if (jet_getstat(p, &sum, &max, &nact, &curr) == -1) continue;
-
- for (j=0; j<5; j++) last[j] = 0;
- jet_gettable(p, &last[0], 5);
- kern_cli();
- printf_xy(0,STAT_Y+i+1,WHITE,"%-3d ³ %-6ld ³ %-6ld ³ %-4d ³ %-7ld ³ %-5ld ³ %-5ld ³ %-5ld ³ %-5ld ³ %-5ld", p, sum/(nact==0 ? 1 : nact), max,
- nact, curr, last[0], last[1], last[2], last[3], last[4]);
- kern_sti();
- i++;
- }
- task_endcycle();
- }
-}
-
-
-void save_stat(struct statistic p[], int n, char *name, int type)
-{
- DOS_FILE *f;
- int i;
- char outstring[500];
-
-
- for(i = 0; i < 500; i++)
- outstring[i] = '0';
-
- f = DOS_fopen(name, "w");
- if (!f) {
- cprintf("Cannot open %s!!!", name);
- goto end1;
- }
-
- for(i = 0; i < n; i++) {
- if (type == RVAL)
- val[i] = p[i].r_time;
- if (type == XVAL)
- val[i] = p[i].ex_time;
- if (type == DVAL)
- val[i] = p[i].dead_post;
- }
-
- memset(outstring, 0, 300);
- sprintf(outstring, "%ld \n", (long int)n);
- cprintf("%s", outstring);
- DOS_fwrite(outstring, 1, strlen(outstring), f);
-
- for(i = 0; i < n; i++) {
- memset(outstring, 0, 300);
- sprintf(outstring, "%ld %lu\n", (long int)i, val[i]);
- //cprintf("%s", outstring);
- DOS_fwrite(outstring, 1, strlen(outstring), f);
- }
- DOS_fclose(f);
-end1:cprintf("OK?");
-}
-
-
-void result_save(void *p)
-{
- save_stat(stat, n_stat, "stat1.tim", RVAL);
-}
-
-
-void fine()
-{
- ll_abort(666);
-}
-
-int main(int argc, char **argv)
-{
- PID p1,p2,p3, p4, p5, p6;
-
- HARD_TASK_MODEL m;
- FT_TASK_MODEL ftb;
- FT_TASK_MODEL ftp;
-
- // int i;
- struct timespec fineprg;
-
-
- //sys_atrunlevel(result_save, NULL, RUNLEVEL_AFTER_EXIT);
- srand(7);
-
- hard_task_default_model(m);
- hard_task_def_wcet(m,500);
- hard_task_def_mit(m,500000);
- hard_task_def_periodic(m);
- hard_task_def_group(m,1);
- hard_task_def_ctrl_jet(m);
-
-
- p1 = task_create("Clock",clock,&m,NULL);
- if (p1 == -1) {
- perror("testhd.c(main): Could not create task <Clock> ...");
- sys_end();
- }
-
-
- hard_task_def_wcet(m,500);
- hard_task_def_periodic(m);
- hard_task_def_mit(m,100000);
-
-
- p2 = task_create("JetControl",jetcontrol,&m,NULL);
- if (p2 == -1) {
- perror("testhd.c(main): Could not create task <JetControl> ...");
- sys_end();
- }
-
-
- ft_task_default_model(ftb);
- ft_task_def_usemath(ftb);
- ft_task_def_backup(ftb);
- ft_task_def_ctrl_jet(ftb);
- ft_task_def_backup_wcet(ftb, 7000);
-
-
-
- p3 = task_create("Hard_aster1b", hard_aster1b, &ftb,NULL);
- if (p3 == -1) {
- perror("testhd.c(main): Could not create task <aster1b> ...");
- sys_end();
- }
-
- ft_task_default_model(ftp);
- ft_task_def_usemath(ftp);
- ft_task_def_ctrl_jet(ftp);
- ft_task_def_group(ftp, 1);
- ft_task_def_period(ftp, 50000);
- ft_task_def_budget(ftp, 15000);
- ft_task_def_primary_exec(ftp, 7300);
- ft_task_def_primary(ftp);
- ft_task_def_backup_task(ftp, p3);
-
-
- p4 = task_create("Hard_aster1p", hard_aster1p, &ftp, NULL);
- if (p4 == -1) {
- perror("testhd.c(main): Could not create task <aster1p> ...");
- sys_end();
- }
-
-
- ft_task_def_backup_wcet(ftb, 6700);
-
-
- p5 = task_create("Hard_aster2b", hard_aster2b, &ftb, NULL);
- if (p5 == -1) {
- perror("testhd.c(main): Could not create task <aster2b> ...");
- sys_end();
- }
-
-
- ft_task_def_period(ftp, 100000);
- ft_task_def_budget(ftp, 8000);
- ft_task_def_primary_exec(ftp, 11000);
- ft_task_def_backup_task(ftp, p5);
-
-
- p6 = task_create("Hard_aster2p", hard_aster2p, &ftp, NULL);
- if (p6 == -1) {
- perror("testhd.c(main): Could not create task <aster2p> ...");
- sys_end();
- }
-
-
- printf_xy(0,STAT_Y + 15,WHITE,"Hard asteroide PID= %-3d ",p3);
- printf_xy(0,STAT_Y + 17,WHITE,"Clock PID= %-3d ",p1);
- printf_xy(0,STAT_Y + 18,WHITE,"JetControl PID= %-3d ",p2);
-
-
-
- task_nopreempt();
- fineprg.tv_sec = 10;
- fineprg.tv_nsec = 0;
- kern_event_post(&fineprg,fine,NULL);
- group_activate(1);
- return 0;
-}
-
Index: demos/branches/pj/cbs_ft/readme.txt
===================================================================
--- demos/branches/pj/cbs_ft/readme.txt (revision 1085)
+++ demos/branches/pj/cbs_ft/readme.txt (nonexistent)
@@ -1,6 +0,0 @@
-This Example has been made by Marco Caccamo.
-
-There is not a lot of documentation available, so if you have problems please
-send an e-mail to Marco ( http://gandalf.sssup.it/~caccamo/ )
-
-Paolo
Index: demos/branches/pj/cbs_ft/makefile
===================================================================
--- demos/branches/pj/cbs_ft/makefile (revision 1085)
+++ demos/branches/pj/cbs_ft/makefile (nonexistent)
@@ -1,17 +0,0 @@
-#
-#
-#
-
-ifndef BASE
-BASE=../..
-endif
-include $(BASE)/config/config.mk
-
-PROGS= prova
-
-include $(BASE)/config/example.mk
-
-prova:
- make -f $(SUBMAKE) APP=prova INIT= OTHEROBJS="initfile.o cbs_ft.o" OTHERINCL=
-
-
Index: demos/branches/pj/cbs_ft/cbs_ft.c
===================================================================
--- demos/branches/pj/cbs_ft/cbs_ft.c (revision 1085)
+++ demos/branches/pj/cbs_ft/cbs_ft.c (nonexistent)
@@ -1,1009 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@hartik.sssup.it>
- *
- * Authors : Marco Caccamo and Paolo Gai
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: cbs_ft.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:41 $
- ------------
-
- This file contains the server CBS_FT
-
- Read CBS_FT.h for further details.
-
-**/
-
-/*
- * Copyright (C) 2000 Marco Caccamo and Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-#include "cbs_ft.h"
-
-/*+ 4 debug purposes +*/
-#undef CBS_FT_TEST
-
-#ifdef TESTG
-#include "drivers/glib.h"
-TIME x,oldx;
-extern TIME starttime;
-#endif
-
-
-
-
-/*+ Status used in the level +*/
-#define CBS_FT_IDLE APER_STATUS_BASE /*+ waiting the activation +*/
-#define CBS_FT_ZOMBIE APER_STATUS_BASE+1 /*+ waiting the period end +*/
-#define CBS_FT_DELAY APER_STATUS_BASE+2 /*+ waiting the delay end +*/
-
-/* structure of an element of the capacity queue */
-struct cap_queue {
- int cap;
- struct timespec dead;
- struct cap_queue *next;
-};
-
-/*+ the level redefinition for the CBS_FT level +*/
-typedef struct {
- level_des l; /*+ the standard level descriptor +*/
-
- /* The wcet are stored in the task descriptor, but we need
- an array for the deadlines. We can't use the timespec_priority
- field because it is used by the master level!!!...
- Notice that however the use of the timespec_priority field
- does not cause any problem... */
-
- struct timespec cbs_ft_dline[MAX_PROC]; /*+ CBS_FT deadlines +*/
-
-
- TIME period[MAX_PROC]; /*+ CBS_FT activation period +*/
-
-
- int maxcap[MAX_PROC]; /* amount of capacity reserved to a primary+backup
- couple */
-
- PID backup[MAX_PROC]; /* Backup task pointers, defined for primary tasks */
-
- char CP[MAX_PROC]; /* checkpoint flag */
-
- char P_or_B[MAX_PROC]; /* Type of task: PRIMARY or BACKUP */
-
-
- struct timespec reactivation_time[MAX_PROC];
- /*+ the time at witch the reactivation timer is post +*/
-
- int reactivation_timer[MAX_PROC]; /*+ the recativation timer +*/
-
- struct cap_queue *queue; /* pointer to the spare capacity queue */
-
- int flags; /*+ the init flags... +*/
-
- bandwidth_t U; /*+ the used bandwidth by the server +*/
-
- int idle; /* the idle flag... */
-
- struct timespec start_idle; /*gives the start time of the last idle period */
-
- LEVEL scheduling_level;
-
-} CBS_FT_level_des;
-
-
-
-/* insert a capacity in the queue capacity ordering by deadline */
-
-static int c_insert(struct timespec dead, int cap, struct cap_queue **que,
- PID p)
-{
- struct cap_queue *prev, *n, *new;
-
- prev = NULL;
- n = *que;
-
- while ((n != NULL) &&
- !TIMESPEC_A_LT_B(&dead, &n->dead)) {
- prev = n;
- n = n->next;
- }
-
-
- new = (struct cap_queue *)kern_alloc(sizeof(struct cap_queue));
- if (new == NULL) {
- kern_printf("\nNew cash_queue element failed\n");
- kern_raise(XUNVALID_TASK, p);
- return -1;
- }
- new->next = NULL;
- new->cap = cap;
- new->dead = dead;
-
- if (prev != NULL)
- prev->next = new;
- else
- *que = new;
-
- if (n != NULL)
- new->next = n;
- return 0;
-
-}
-
-/* extract the first element from the capacity queue */
-
-int c_extractfirst(struct cap_queue **que)
-{
- struct cap_queue *p = *que;
-
-
- if (*que == NULL) return(-1);
-
- *que = (*que)->next;
-
- kern_free(p, sizeof(struct cap_queue));
- return(1);
-}
-
-/* read data of the first element from the capacity queue */
-
-static void c_readfirst(struct timespec *d, int *c, struct cap_queue *que)
-{
- *d = que->dead;
- *c = que->cap;
-}
-
-/* write data of the first element from the capacity queue */
-
-static void c_writefirst(struct timespec dead, int cap, struct cap_queue *que)
-{
- que->dead = dead;
- que->cap = cap;
-}
-
-
-static void CBS_FT_activation(CBS_FT_level_des *lev,
- PID p,
- struct timespec *acttime)
-{
- JOB_TASK_MODEL job;
- int capacity;
-
- /* This rule is used when we recharge the budget at initial task activation
- and each time a new task instance must be activated */
-
- if (TIMESPEC_A_GT_B(acttime, &lev->cbs_ft_dline[p])) {
- /* we modify the deadline ... */
- TIMESPEC_ASSIGN(&lev->cbs_ft_dline[p], acttime);
- }
-
-
- if (proc_table[p].avail_time > 0)
- proc_table[p].avail_time = 0;
-
-
-
- /* A spare capacity is inserted in the capacity queue!! */
- ADDUSEC2TIMESPEC(lev->period[p], &lev->cbs_ft_dline[p]);
- capacity = lev->maxcap[p] - proc_table[ lev->backup[p] ].wcet;
- c_insert(lev->cbs_ft_dline[p], capacity, &lev->queue, p);
-
-
- /* it exploits available capacities from the capacity queue */
- while (proc_table[p].avail_time < proc_table[p].wcet &&
- lev->queue != NULL) {
- struct timespec dead;
- int cap, delta;
- delta = proc_table[p].wcet - proc_table[p].avail_time;
- c_readfirst(&dead, &cap, lev->queue);
- if (!TIMESPEC_A_GT_B(&dead, &lev->cbs_ft_dline[p])) {
- if (cap > delta) {
- proc_table[p].avail_time += delta;
- c_writefirst(dead, cap - delta, lev->queue);
- }
- else {
- proc_table[p].avail_time += cap;
- c_extractfirst(&lev->queue);
- }
- }
- else
- break;
- }
-
- /* If the budget is still less than 0, an exception is raised */
- if (proc_table[p].avail_time <= 0) {
- kern_printf("\nnegative value for the budget!\n");
- kern_raise(XUNVALID_TASK, p);
- return;
- }
-
-
-
- /*if (p==6)
- kern_printf("(act_time:%d dead:%d av_time:%d)\n",
- acttime->tv_sec*1000000+
- acttime->tv_nsec/1000,
- lev->cbs_ft_dline[p].tv_sec*1000000+
- lev->cbs_ft_dline[p].tv_nsec/1000,
- proc_table[p].avail_time); */
-
-
-
-
-
-
-#ifdef TESTG
- if (starttime && p == 3) {
- oldx = x;
- x = ((lev->cbs_ft_dline[p].tv_sec*1000000+lev->cbs_ft_dline[p].tv_nsec/1000)/5000 - starttime) + 20;
- // kern_printf("(a%d)",lev->cbs_ft_dline[p].tv_sec*1000000+lev->cbs_ft_dline[p].tv_nsec/1000);
- if (oldx > x) sys_end();
- if (x<640)
- grx_plot(x, 15, 8);
- }
-#endif
-
- /* and, finally, we reinsert the task in the master level */
- job_task_default_model(job, lev->cbs_ft_dline[p]);
- job_task_def_yesexc(job);
- level_table[ lev->scheduling_level ]->
- guest_create(lev->scheduling_level, p, (TASK_MODEL *)&job);
- level_table[ lev->scheduling_level ]->
- guest_activate(lev->scheduling_level, p);
-}
-
-
-static char *CBS_FT_status_to_a(WORD status)
-{
- if (status < MODULE_STATUS_BASE)
- return status_to_a(status);
-
- switch (status) {
- case CBS_FT_IDLE : return "CBS_FT_Idle";
- case CBS_FT_ZOMBIE : return "CBS_FT_Zombie";
- case CBS_FT_DELAY : return "CBS_FT_Delay";
- default : return "CBS_FT_Unknown";
- }
-}
-
-
-
-
-/* this is the periodic reactivation of the task... */
-static void CBS_FT_timer_reactivate(void *par)
-{
- PID p = (PID) par;
- CBS_FT_level_des *lev;
-
- lev = (CBS_FT_level_des *)level_table[proc_table[p].task_level];
-
- if (proc_table[p].status == CBS_FT_IDLE) {
- /* the task has finished the current activation and must be
- reactivated */
-
- /* request_time represents the time of the last instance release!! */
- TIMESPEC_ASSIGN(&proc_table[p].request_time, &lev->reactivation_time[p]);
-
- /* If idle=1, then we have to discharge the capacities stored in
- the capacity queue up to the length of the idle interval */
- if (lev->idle == 1) {
- TIME interval;
- struct timespec delta;
- lev->idle = 0;
- SUBTIMESPEC(&proc_table[p].request_time, &lev->start_idle, &delta);
- /* length of the idle interval expressed in usec! */
- interval = TIMESPEC2NANOSEC(&delta) / 1000;
-
- /* it discharges the available capacities from the capacity queue */
- while (interval > 0 && lev->queue != NULL) {
- struct timespec dead;
- int cap;
- c_readfirst(&dead, &cap, lev->queue);
- if (cap > interval) {
- c_writefirst(dead, cap - interval, lev->queue);
- interval = 0;
- }
- else {
- interval -= cap;
- c_extractfirst(&lev->queue);
- }
- }
- }
-
- CBS_FT_activation(lev,p,&lev->reactivation_time[p]);
-
-
- /* Set the reactivation timer */
- TIMESPEC_ASSIGN(&lev->reactivation_time[p], &lev->cbs_ft_dline[p]);
- lev->reactivation_timer[p] = kern_event_post(&lev->reactivation_time[p],
- CBS_FT_timer_reactivate,
- (void *)p);
- event_need_reschedule();
- }
- else {
- /* this situation cannot occur */
- kern_printf("\nTrying to reactivate a primary task which is not IDLE!\n");
- kern_raise(XUNVALID_TASK,p);
- }
-}
-
-
-
-static void CBS_FT_avail_time_check(CBS_FT_level_des *lev, PID p)
-{
-
- /*+ if the capacity became negative the remaining computation time
- is diminuished.... +*/
- /* if (p==4)
- kern_printf("(old dead:%d av_time:%d)\n",
- lev->cbs_ft_dline[p].tv_sec*1000000+
- lev->cbs_ft_dline[p].tv_nsec/1000,
- proc_table[p].avail_time); */
-
-
- int newcap = proc_table[p].wcet / 100 * 30;
- if (newcap <= 0)
- newcap = proc_table[p].wcet;
- /* it exploits available capacities from the capacity queue */
- while (proc_table[p].avail_time < newcap
- && lev->queue != NULL) {
- struct timespec dead;
- int cap, delta;
- delta = newcap - proc_table[p].avail_time;
- c_readfirst(&dead, &cap, lev->queue);
- if (!TIMESPEC_A_GT_B(&dead, &lev->cbs_ft_dline[p])) {
- if (cap > delta) {
- proc_table[p].avail_time += delta;
- c_writefirst(dead, cap - delta, lev->queue);
- }
- else {
- proc_table[p].avail_time += cap;
- c_extractfirst(&lev->queue);
- }
- }
- else
- break;
- }
-
-
-
- /*if (p==6)
- kern_printf("(ATC dead:%d av_time:%d)\n",
- lev->cbs_ft_dline[p].tv_sec*1000000+
- lev->cbs_ft_dline[p].tv_nsec/1000,
- proc_table[p].avail_time); */
-
-
-
- /* if the budget is still empty, the backup task must be woken up.
- Remind that a short chunk of primary will go ahead executing
- before the task switch occurs */
- if (proc_table[p].avail_time <= 0) {
- lev->CP[p] = 1;
- proc_table[p].avail_time += proc_table[ lev->backup[p] ].wcet;
- }
-
-
- /*if (p==6)
- kern_printf("(ATC1 dead:%d av_time:%d)\n",
- lev->cbs_ft_dline[p].tv_sec*1000000+
- lev->cbs_ft_dline[p].tv_nsec/1000,
- proc_table[p].avail_time); */
-
-
-
-}
-
-
-/*+ this function is called when a killed or ended task reach the
- period end +*/
-static void CBS_FT_timer_zombie(void *par)
-{
- PID p = (PID) par;
- CBS_FT_level_des *lev;
-
- lev = (CBS_FT_level_des *)level_table[proc_table[p].task_level];
-
- /* we finally put the task in the FREE status */
- proc_table[p].status = FREE;
- q_insertfirst(p,&freedesc);
-
-
- /* and free the allocated bandwidth */
- lev->U -= (MAX_BANDWIDTH / lev->period[p]) * (TIME)lev->maxcap[p];
-}
-
-
-static int CBS_FT_level_accept_task_model(LEVEL l, TASK_MODEL *m)
-{
-
- if (m->pclass == FT_PCLASS || m->pclass ==
- (FT_PCLASS | l)) {
- FT_TASK_MODEL *f = (FT_TASK_MODEL *) m;
-
- //kern_printf("accept :FAULT TOLERANT TASK found!!!!!!\n"); */
- if (f->type == PRIMARY && f->execP > 0 && f->budget < (int)f->period
- && f->backup != NIL) return 0;
- if (f->type == BACKUP && f->wcetB > 0)
- return 0;
- }
- return -1;
-}
-
-
-
-static int CBS_FT_level_accept_guest_model(LEVEL l, TASK_MODEL *m)
-{
- return -1;
-}
-
-static char *onoff(int i)
-{
- if (i)
- return "On ";
- else
- return "Off";
-}
-
-static void CBS_FT_level_status(LEVEL l)
-{
- CBS_FT_level_des *lev = (CBS_FT_level_des *)(level_table[l]);
- PID p;
-
- kern_printf("On-line guarantee : %s\n",
- onoff(lev->flags & CBS_FT_ENABLE_GUARANTEE));
- kern_printf("Used Bandwidth : %u/%u\n",
- lev->U, MAX_BANDWIDTH);
-
- for (p=0; p<MAX_PROC; p++)
- if (proc_table[p].task_level == l && proc_table[p].status != FREE )
- kern_printf("Pid: %2d Name: %10s Period: %9ld Dline: %9ld.%6ld Stat: %s\n",
- p,
- proc_table[p].name,
- lev->period[p],
- lev->cbs_ft_dline[p].tv_sec,
- lev->cbs_ft_dline[p].tv_nsec/1000,
- CBS_FT_status_to_a(proc_table[p].status));
-}
-
-static PID CBS_FT_level_scheduler(LEVEL l)
-{
- CBS_FT_level_des *lev = (CBS_FT_level_des *)(level_table[l]);
-
- /* it stores the actual time and set the IDLE flag in order to handle
- the capacity queue discharging!!! */
- lev->idle = 1;
- ll_gettime(TIME_EXACT, &lev->start_idle);
-
-
- /* the CBS_FT don't schedule anything...
- it's an EDF level or similar that do it! */
- return NIL;
-}
-
-
-/* The on-line guarantee is enabled only if the appropriate flag is set... */
-static int CBS_FT_level_guarantee(LEVEL l, bandwidth_t *freebandwidth)
-{
- CBS_FT_level_des *lev = (CBS_FT_level_des *)(level_table[l]);
-
- if (lev->flags & CBS_FT_FAILED_GUARANTEE) {
- *freebandwidth = 0;
- kern_printf("guarantee :garanzia fallita!!!!!!\n");
- return 0;
- }
- else if (*freebandwidth >= lev->U) {
- *freebandwidth -= lev->U;
- return 1;
- }
- else {
- kern_printf("guarantee :garanzia fallita per mancanza di banda!!!!!!\n");
- kern_printf("freeband: %d request band: %d", *freebandwidth, lev->U);
- return 0;
- }
-}
-
-
-static int CBS_FT_task_create(LEVEL l, PID p, TASK_MODEL *m)
-
-{
- CBS_FT_level_des *lev = (CBS_FT_level_des *)(level_table[l]);
-
- /* if the CBS_FT_task_create is called, then the pclass must be a
- valid pclass. */
- FT_TASK_MODEL *s = (FT_TASK_MODEL *)m;
-
-
-
- /* Enable budget check */
- proc_table[p].control |= CONTROL_CAP;
-
- proc_table[p].avail_time = 0;
- NULL_TIMESPEC(&lev->cbs_ft_dline[p]);
-
-
- if (s->type == PRIMARY) {
- proc_table[p].wcet = (int)s->execP;
- lev->period[p] = s->period;
- lev->maxcap[p] = s->budget;
- lev->backup[p] = s->backup;
- lev->CP[p] = 0;
- lev->P_or_B[p] = PRIMARY;
-
- /* update the bandwidth... */
- if (lev->flags & CBS_FT_ENABLE_GUARANTEE) {
- bandwidth_t b;
- b = (MAX_BANDWIDTH / lev->period[p]) * (TIME)lev->maxcap[p];
-
- /* really update lev->U, checking an overflow... */
- if (MAX_BANDWIDTH - lev->U > b)
- lev->U += b;
- else
- /* The task can NOT be guaranteed (U>MAX_BANDWIDTH)...
- (see EDF.c) */
- lev->flags |= CBS_FT_FAILED_GUARANTEE;
- }
- }
- else {
- proc_table[p].wcet = (int)s->wcetB;
- lev->P_or_B[p] = BACKUP;
-
- /* Backup tasks are unkillable tasks! */
- proc_table[p].control |= NO_KILL;
- }
-
- return 0; /* OK, also if the task cannot be guaranteed... */
-}
-
-
-static void CBS_FT_task_detach(LEVEL l, PID p)
-{
- /* the CBS_FT level doesn't introduce any dynamic allocated new field.
- we have only to reset the NO_GUARANTEE FIELD and decrement the allocated
- bandwidth */
-
- CBS_FT_level_des *lev = (CBS_FT_level_des *)(level_table[l]);
-
- if (lev->flags & CBS_FT_FAILED_GUARANTEE)
- lev->flags &= ~CBS_FT_FAILED_GUARANTEE;
- else
- lev->U -= (MAX_BANDWIDTH / lev->period[p]) * (TIME)lev->maxcap[p];
-}
-
-
-static int CBS_FT_task_eligible(LEVEL l, PID p)
-{
- return 0; /* if the task p is chosen, it is always eligible */
-}
-
-#ifdef __TEST1__
- extern int testactive;
- extern struct timespec s_stime[];
- extern TIME s_curr[];
- extern TIME s_PID[];
- extern int useds;
-#endif
-
-static void CBS_FT_task_dispatch(LEVEL l, PID p, int nostop)
-{
- CBS_FT_level_des *lev = (CBS_FT_level_des *)(level_table[l]);
- level_table[ lev->scheduling_level ]->
- guest_dispatch(lev->scheduling_level,p,nostop);
-
-#ifdef __TEST1__
- if (testactive)
- {
- TIMESPEC_ASSIGN(&s_stime[useds], &schedule_time);
- s_curr[useds] = proc_table[p].avail_time;
- s_PID[useds] = p;
- useds++;
- }
-#endif
-}
-
-static void CBS_FT_task_epilogue(LEVEL l, PID p)
-{
- CBS_FT_level_des *lev = (CBS_FT_level_des *)(level_table[l]);
-
- /* check if the budget is finished... */
- if (proc_table[p].avail_time <= 0) {
-
- /* A backup task cannot ever exhaust its budget! */
- if (lev->P_or_B[p] == BACKUP) {
- kern_printf("\nBACKUP wcet violation!\n");
- kern_raise(XWCET_VIOLATION,p);
- /* we kill the current activation */
- level_table[ lev->scheduling_level ]->
- guest_end(lev->scheduling_level, p);
- return;
- }
-
- /* we try to recharge the budget */
- CBS_FT_avail_time_check(lev, p);
-
- /* The budget must be greater than 0! */
- if (proc_table[p].avail_time <= 0) {
- kern_printf("\nBackup task starting with exhausted budget\n");
- kern_raise(XUNVALID_TASK, p);
- lev->CP[p] = 0;
- /* we kill the current activation */
- level_table[ lev->scheduling_level ]->
- guest_end(lev->scheduling_level, p);
- return;
- }
- }
-
- /* the task returns into the ready queue by
- calling the guest_epilogue... */
- level_table[ lev->scheduling_level ]->
- guest_epilogue(lev->scheduling_level,p);
-}
-
-
-static void CBS_FT_task_activate(LEVEL l, PID p)
-{
- CBS_FT_level_des *lev = (CBS_FT_level_des *)(level_table[l]);
-
- ll_gettime(TIME_EXACT, &proc_table[p].request_time);
-
-
-
- if (lev->P_or_B[p] == BACKUP) {
- kern_printf("\nTrying to activate a BACKUP task!\n");
- kern_raise(XUNVALID_TASK, p);
- }
- else {
-
- /* If idle=1, then we have to discharge the capacities stored in
- the capacity queue up to the length of the idle interval */
- if (lev->idle == 1) {
- TIME interval;
- struct timespec delta;
- lev->idle = 0;
- SUBTIMESPEC(&proc_table[p].request_time, &lev->start_idle, &delta);
- /* length of the idle interval expressed in usec! */
- interval = TIMESPEC2NANOSEC(&delta) / 1000;
-
- /* it discharge the available capacities from the capacity queue */
- while (interval > 0 && lev->queue != NULL) {
- struct timespec dead;
- int cap;
- c_readfirst(&dead, &cap, lev->queue);
- if (cap > interval) {
- c_writefirst(dead, cap - interval, lev->queue);
- interval = 0;
- }
- else {
- interval -= cap;
- c_extractfirst(&lev->queue);
- }
- }
- }
-
- CBS_FT_activation(lev, p, &proc_table[p].request_time);
-
-
- /* Set the reactivation timer */
- TIMESPEC_ASSIGN(&lev->reactivation_time[p], &lev->cbs_ft_dline[p]);
- lev->reactivation_timer[p] = kern_event_post(&lev->reactivation_time[p],
- CBS_FT_timer_reactivate,
- (void *)p);
-
- // kern_printf("act : %d %d |",lev->cbs_ft_dline[p].tv_nsec/1000,p);
- }
-}
-
-
-static void CBS_FT_task_insert(LEVEL l, PID p)
-{
- printk("CBS_FT_task_insert\n");
- kern_raise(XUNVALID_TASK,p);
-}
-
-
-static void CBS_FT_task_extract(LEVEL l, PID p)
-{
- printk("CBS_FT_task_extract\n");
- kern_raise(XUNVALID_TASK,p);
-}
-
-
-static void CBS_FT_task_endcycle(LEVEL l, PID p)
-{
- CBS_FT_level_des *lev = (CBS_FT_level_des *)(level_table[l]);
-
-
- level_table[ lev->scheduling_level ]->
- guest_end(lev->scheduling_level,p);
-
-
- proc_table[p].status = CBS_FT_IDLE;
-
-
- if (lev->P_or_B[p] == PRIMARY) {
- if (lev->CP[p]) {
- JOB_TASK_MODEL job;
-
- /* We have to start the backup task */
- TIMESPEC_ASSIGN(&lev->cbs_ft_dline[ lev->backup[p] ],
- &lev->cbs_ft_dline[p]);
- proc_table[ lev->backup[p] ].avail_time = proc_table[p].avail_time;
- lev->CP[p] = 0;
-
- /* and, finally, we insert the backup task in the master level */
- job_task_default_model(job, lev->cbs_ft_dline[p]);
- job_task_def_yesexc(job);
- level_table[ lev->scheduling_level ]->
- guest_create(lev->scheduling_level, lev->backup[p],
- (TASK_MODEL *)&job);
- level_table[ lev->scheduling_level ]->
- guest_activate(lev->scheduling_level, lev->backup[p]);
- }
- else {
- /* A spare capacity is inserted in the capacity queue!! */
- proc_table[p].avail_time += proc_table[ lev->backup[p] ].wcet;
- if (proc_table[p].avail_time > 0) {
- c_insert(lev->cbs_ft_dline[p], proc_table[p].avail_time,
- &lev->queue, p);
- proc_table[p].avail_time = 0;
- }
- }
- }
- else {
- /* this branch is for backup tasks:
- A spare capacity is inserted in the capacity queue!! */
- if (proc_table[p].avail_time > 0) {
- c_insert(lev->cbs_ft_dline[p], proc_table[p].avail_time,
- &lev->queue, p);
- proc_table[p].avail_time = 0;
- }
- }
-}
-
-
-static void CBS_FT_task_end(LEVEL l, PID p)
-{
- CBS_FT_level_des *lev = (CBS_FT_level_des *)(level_table[l]);
-
- /* A backup task cannot be killed, this behaviour can be modified
- in a new release */
- if (lev->P_or_B[p] == BACKUP) {
- kern_printf("\nKilling a BACKUP task!\n");
- kern_raise(XUNVALID_TASK, p);
- return;
- }
-
- /* check if the capacity becomes negative... */
- /* there is a while because if the wcet is << than the system tick
- we need to postpone the deadline many times */
- while (proc_table[p].avail_time < 0) {
- /* the CBS_FT rule for recharging the capacity */
- proc_table[p].avail_time += lev->maxcap[p];
- ADDUSEC2TIMESPEC(lev->period[p], &lev->cbs_ft_dline[p]);
- }
-
- level_table[ lev->scheduling_level ]->
- guest_end(lev->scheduling_level,p);
-
-
- /* we delete the reactivation timer */
- event_delete(lev->reactivation_timer[p]);
- lev->reactivation_timer[p] = -1;
-
-
- /* Finally, we post the zombie event. when the end period is reached,
- the task descriptor and banwidth are freed */
- proc_table[p].status = CBS_FT_ZOMBIE;
- lev->reactivation_timer[p] = kern_event_post(&lev->cbs_ft_dline[p],
- CBS_FT_timer_zombie,
- (void *)p);
-}
-
-
-static void CBS_FT_task_sleep(LEVEL l, PID p)
-{
- printk("CBS_FT_task_sleep\n");
- kern_raise(XUNVALID_TASK,p);
-}
-
-
-static void CBS_FT_task_delay(LEVEL l, PID p, TIME usdelay)
-{
- printk("CBS_FT_task_delay\n");
- kern_raise(XUNVALID_TASK,p);
-}
-
-
-static int CBS_FT_guest_create(LEVEL l, PID p, TASK_MODEL *m)
-{ kern_raise(XUNVALID_GUEST,exec_shadow); return 0; }
-
-static void CBS_FT_guest_detach(LEVEL l, PID p)
-{ kern_raise(XUNVALID_GUEST,exec_shadow); }
-
-static void CBS_FT_guest_dispatch(LEVEL l, PID p, int nostop)
-{ kern_raise(XUNVALID_GUEST,exec_shadow); }
-
-static void CBS_FT_guest_epilogue(LEVEL l, PID p)
-{ kern_raise(XUNVALID_GUEST,exec_shadow); }
-
-static void CBS_FT_guest_activate(LEVEL l, PID p)
-{ kern_raise(XUNVALID_GUEST,exec_shadow); }
-
-static void CBS_FT_guest_insert(LEVEL l, PID p)
-{ kern_raise(XUNVALID_GUEST,exec_shadow); }
-
-static void CBS_FT_guest_extract(LEVEL l, PID p)
-{ kern_raise(XUNVALID_GUEST,exec_shadow); }
-
-static void CBS_FT_guest_endcycle(LEVEL l, PID p)
-{ kern_raise(XUNVALID_GUEST,exec_shadow); }
-
-static void CBS_FT_guest_end(LEVEL l, PID p)
-{ kern_raise(XUNVALID_GUEST,exec_shadow); }
-
-static void CBS_FT_guest_sleep(LEVEL l, PID p)
-{ kern_raise(XUNVALID_GUEST,exec_shadow); }
-
-static void CBS_FT_guest_delay(LEVEL l, PID p,DWORD tickdelay)
-{ kern_raise(XUNVALID_GUEST,exec_shadow); }
-
-
-
-
-/* Registration functions */
-
-/*+ Registration function:
- int flags the init flags ... see CBS.h +*/
-void CBS_FT_register_level(int flags, LEVEL master)
-{
- LEVEL l; /* the level that we register */
- CBS_FT_level_des *lev; /* for readableness only */
- PID i; /* a counter */
-
- printk("CBS_FT_register_level\n");
-
- /* request an entry in the level_table */
- l = level_alloc_descriptor();
-
- printk(" alloco descrittore %d %d\n",l,sizeof(CBS_FT_level_des));
-
- /* alloc the space needed for the CBS_FT_level_des */
- lev = (CBS_FT_level_des *)kern_alloc(sizeof(CBS_FT_level_des));
-
- printk(" lev=%d\n",(int)lev);
-
- /* update the level_table with the new entry */
- level_table[l] = (level_des *)lev;
-
- /* fill the standard descriptor */
- strncpy(lev->l.level_name, CBS_FT_LEVELNAME, MAX_LEVELNAME);
- lev->l.level_code = CBS_FT_LEVEL_CODE;
- lev->l.level_version = CBS_FT_LEVEL_VERSION;
-
- lev->l.level_accept_task_model = CBS_FT_level_accept_task_model;
- lev->l.level_accept_guest_model = CBS_FT_level_accept_guest_model;
- lev->l.level_status = CBS_FT_level_status;
- lev->l.level_scheduler = CBS_FT_level_scheduler;
-
- if (flags & CBS_FT_ENABLE_GUARANTEE)
- lev->l.level_guarantee = CBS_FT_level_guarantee;
- else
- lev->l.level_guarantee = NULL;
-
- lev->l.task_create = CBS_FT_task_create;
- lev->l.task_detach = CBS_FT_task_detach;
- lev->l.task_eligible = CBS_FT_task_eligible;
- lev->l.task_dispatch = CBS_FT_task_dispatch;
- lev->l.task_epilogue = CBS_FT_task_epilogue;
- lev->l.task_activate = CBS_FT_task_activate;
- lev->l.task_insert = CBS_FT_task_insert;
- lev->l.task_extract = CBS_FT_task_extract;
- lev->l.task_endcycle = CBS_FT_task_endcycle;
- lev->l.task_end = CBS_FT_task_end;
- lev->l.task_sleep = CBS_FT_task_sleep;
- lev->l.task_delay = CBS_FT_task_delay;
-
- lev->l.guest_create = CBS_FT_guest_create;
- lev->l.guest_detach = CBS_FT_guest_detach;
- lev->l.guest_dispatch = CBS_FT_guest_dispatch;
- lev->l.guest_epilogue = CBS_FT_guest_epilogue;
- lev->l.guest_activate = CBS_FT_guest_activate;
- lev->l.guest_insert = CBS_FT_guest_insert;
- lev->l.guest_extract = CBS_FT_guest_extract;
- lev->l.guest_endcycle = CBS_FT_guest_endcycle;
- lev->l.guest_end = CBS_FT_guest_end;
- lev->l.guest_sleep = CBS_FT_guest_sleep;
- lev->l.guest_delay = CBS_FT_guest_delay;
-
- /* fill the CBS_FT descriptor part */
- for (i=0; i<MAX_PROC; i++) {
- NULL_TIMESPEC(&lev->cbs_ft_dline[i]);
- lev->period[i] = 0;
- NULL_TIMESPEC(&lev->reactivation_time[i]);
- lev->reactivation_timer[i] = -1;
- lev->maxcap[i] = 0;
- lev->backup[i] = NIL;
- lev->CP[i] = 0;
- lev->P_or_B[i] = PRIMARY;
- }
-
- lev->U = 0;
- lev->idle = 0;
- lev->queue = NULL;
-
- lev->scheduling_level = master;
-
- lev->flags = flags & 0x07;
-}
-
-
-
-bandwidth_t CBS_FT_usedbandwidth(LEVEL l)
-{
-
- CBS_FT_level_des *lev = (CBS_FT_level_des *)(level_table[l]);
- if (lev->l.level_code == CBS_FT_LEVEL_CODE &&
- lev->l.level_version == CBS_FT_LEVEL_VERSION)
- return lev->U;
- else
- return 0;
-}
-
-
-
-void CBS_FT_Primary_Abort()
-{
- PID p;
- CBS_FT_level_des *lev;
-
- kern_cli();
- p = exec_shadow;
- lev = (CBS_FT_level_des *)level_table[proc_table[p].task_level];
- lev->CP[p] = 1;
- kern_sti();
-}
-
-
-char CBS_FT_Checkpoint()
-{
- char f;
- PID p;
- CBS_FT_level_des *lev;
-
- kern_cli();
- p = exec_shadow;
- lev = (CBS_FT_level_des *)level_table[proc_table[p].task_level];
- f = lev->CP[p];
- kern_sti();
- return f;
-}
-
Index: demos/branches/pj/jumpball/readme.txt
===================================================================
--- demos/branches/pj/jumpball/readme.txt (revision 1085)
+++ demos/branches/pj/jumpball/readme.txt (nonexistent)
@@ -1,75 +0,0 @@
-----------------------------------
-Jumping Balls demo
-
-by
-
-Paolo Gai 1999-2001 - pj@sssup.it
-
-----------------------------------
-
-This demo was created to show some S.Ha.R.K. functionalities in the course
-of Informatica Industriale , University of Pavia, Italy.
-
-The demo is composed by an application (derived by the template application
-distributed on the web site) and two init files.
-
-The demo is composed by:
-
-MAKEFILE The makefile used to compile the application;
- demo is the rule to compile the application with a CBS scheduler
- demo2 is the rule to compile the application with a RR scheduler
-README.TXT This file
-DEMO.H Some constants used into the demo
-INITFIL1.C The CBS initfile
-INITFIL2.C The EDF initfile
-INITFILE.C A makefile that cover either EDF+CBS and RR
-BALL.C The Jumping balls part of the demo
-DEMO.C The main() function and some other utility function
-JETCTRL.C The JET part of the demo
-
-
-The demo works as follows:
-- It works at 640x480 16 bit colors
-- on the left, there is the jumping ball arena, on the rigth there is the
- statistics about the tasks into the system.
-
-- the tasks are guaranteed using CBS and EDF. The wcet and mean execution
- time on my portable after a few minutes are (us):
-
- JetCtrl 7400 max 7500 CBS met
- JetDummy 135 max 200 CBS met
- JetSlide 2100 max 2100 CBS met
- Balls 276 max 380 EDF wcet for hard ball,100 CBS met for soft ones
-
- The system should go overloaded with 40 soft balls.
-
-- The idea is the following:
- - first, an edf guaranteed ball is created.
- - then, create a set of soft ball using space. since their met is < than the
- real met, they posticipate the deadlines.
- - if they are killed, they remain for some seconds in the zombie state
- - if a set of soft ball arde created (i.e., 10), and after a while all the
- others are created, the bandwidth is fully used, and the task posticipate
- their deadlines. the first set of tasks stops jumping when the bandwidth
- is full utilized by the newest balls until all the tasks have similar
- deadlines.
- - Note on the left the slides that represents the relative ratio
- between the tasks.
- - Note that in overload conditions the EDF task is still guaranteed
- - Note that PI is used with EDF, also if no theory says that it is good:
- - S.Ha.R.K. allows that, it is the user that have to choose if that is
- a non-sense
- - PI is independent from the implemnentation of the scheduling modules
- - if the second init file is used, RR is used instead of EDF+CBS.
- - In overload condition RR perform differently from EDF+CBS, giving to
- each task an equal fraction of bandwidth
-
- - note also:
- - the redefinition of the standard exception handler
- - the redefinition of the keys and the initialization of the keyboard
- - the myend exit function
- - the main() that terminates
- - the two parts (ball and jet) can be excluded using a #define
-
-If You have any question, please contact the author...
-
Index: demos/branches/pj/jumpball/ball.c
===================================================================
--- demos/branches/pj/jumpball/ball.c (revision 1085)
+++ demos/branches/pj/jumpball/ball.c (nonexistent)
@@ -1,239 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: ball.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:41 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*--------------------------------------------------------------*/
-/* SIMULATION OF JUMPING BALLS */
-/*--------------------------------------------------------------*/
-
-#include "demo.h"
-#include <kernel/func.h>
-#include <stdlib.h>
-
-#define R 8 /* dimension of a ball */
-#define G 9.8 /* acceleration of gravity */
-
-static int ballexit = 0;
-static int npc = 0; /* number of tasks created */
-
-/*--------------------------------------------------------------*/
-/* Periodic task for ball simulation */
-/*--------------------------------------------------------------*/
-
-TASK palla(int i)
-{
-int x, y; /* coordinate grafiche pallina */
-int ox, oy; /* vecchia posizione pallina */
-int x0, y0; /* posizione iniziale X pallina */
-float vx, vy; /* velocit… della pallina */
-float vy0; /* velocita' pallina al primo rimbalzo */
-float ty, tx; /* variabile temporale */
-float dt; /* incremento temporale */
-
- y = oy = y0 = BALL_HEIGHT;
- x = ox = x0 = BALL_XMIN;
-
- vy0= sqrt(2. * G * (float)BALL_HEIGHT);
- vy = 0;
- vx = BALL_VELX + myrand(9);
- tx = 0;
- ty = 0;
- dt = ((float)PERIOD_BALL)/100000;
-
- while (1) {
- y = y0 + vy*ty - .5*G*ty*ty;
- x = x0 + vx * tx;
-
- if (y < 0) {
- y = 0;
-
- if (vy == 0.0)
- vy = vy0;
- else if (vy < BALL_VYMIN)
- vy = vy0 * (1.0 - myrand(50)/100.0);
- else
- vy = 0.9 * vy;
-
- ty = 0.0;
- y0 = 0;
- }
-
- if (x > BALL_XMAX) {
- tx = 0.0;
- x0 = BALL_XMAX;
- vx = -vx;
- x = x0 + vx * tx;
- }
-
- if (x < BALL_XMIN) {
- tx = 0.0;
- x0 = BALL_XMIN;
- vx = -vx;
- x = x0 + vx * tx;
- }
-
- mutex_lock(&mutex);
- grx_disc(ox, oy, R, 0);
- ox = x;
- oy = BALL_Y - y;
- mutex_unlock(&mutex);
-
- if (ballexit && i!=0xFFFF) {
- npc--;
- return 0;
- }
-
- mutex_lock(&mutex);
- grx_disc(ox, oy, R, i);
- mutex_unlock(&mutex);
-
- {
- int xxx;
- for (xxx=0; xxx<10000; xxx++);
- }
- ty += dt;
- tx += dt;
- task_endcycle();
- }
-}
-
-void killball(KEY_EVT *k)
-{
- ballexit = 1;
-}
-
-void ballfun(KEY_EVT *k)
-{
- SOFT_TASK_MODEL mp;
- int r,g,b;
- PID pid;
- char palla_str[]="palla ";
-
- if (npc == BALL_MAX_P) return;
-
- ballexit = 0;
-
- r = 64 + myrand(190);
- g = 64 + myrand(190);
- b = 64 + myrand(190);
-
- itoa(npc,palla_str+5);
-
- soft_task_default_model(mp);
- soft_task_def_level(mp,1);
- soft_task_def_ctrl_jet(mp);
- soft_task_def_arg(mp, (void *)rgb16(r,g,b));
- soft_task_def_group(mp, BALL_GROUP);
- soft_task_def_met(mp, WCET_BALL);
- soft_task_def_period(mp,PERIOD_BALL);
- soft_task_def_usemath(mp);
- pid = task_create(palla_str, palla, &mp, NULL);
-
- if (pid != NIL) {
- task_activate(pid);
- npc++;
- }
-}
-
-void hardball()
-{
- HARD_TASK_MODEL mp;
- int r,g,b;
- PID pid;
-
- r = 255;
- g = 255;
- b = 255;
-
- hard_task_default_model(mp);
- hard_task_def_ctrl_jet(mp);
- hard_task_def_arg(mp, (void *)rgb16(r,g,b));
- hard_task_def_wcet(mp, 380);
- hard_task_def_mit(mp,PERIOD_BALL);
- hard_task_def_usemath(mp);
- pid = task_create("pallaEDF", palla, &mp, NULL);
- if (pid == NIL) {
- grx_close();
- perror("Could not create task <pallaEDF>");
- sys_end();
- }
- else
- task_activate(pid);
-}
-
-
-/*--------------------------------------------------------------*/
-/* MAIN process */
-/*--------------------------------------------------------------*/
-
-void scenario_ball()
-{
- grx_text("Noise", 0, 45 /*BALL_Y-BALL_HEIGHT-15*/, rgb16(0,0,255), black);
- grx_line(0,55,383,55,red);
-//grx_line(0,BALL_Y-BALL_HEIGHT-6,383,BALL_Y-BALL_HEIGHT-6,red);
-
- grx_rect(BALL_XMIN-R-1, BALL_Y-BALL_HEIGHT-R-1,
- BALL_XMAX+R+1, BALL_Y+R+1, rgb16(0,200,0));
-}
-
-void init_ball(void)
-{
- KEY_EVT k;
-
- hardball();
-
- k.flag = 0;
- k.scan = KEY_SPC;
- k.ascii = ' ';
- keyb_hook(k,ballfun);
-
- k.flag = 0;
- k.scan = KEY_BKS;
- k.ascii = ' ';
- keyb_hook(k,killball);
-}
-
-/*--------------------------------------------------------------*/
Index: demos/branches/pj/jumpball/makefile
===================================================================
--- demos/branches/pj/jumpball/makefile (revision 1085)
+++ demos/branches/pj/jumpball/makefile (nonexistent)
@@ -1,19 +0,0 @@
-#
-#
-#
-
-ifndef BASE
-BASE=../..
-endif
-include $(BASE)/config/config.mk
-
-PROGS= demo
-
-include $(BASE)/config/example.mk
-
-demo:
- make -f $(SUBMAKE) APP=demo INIT= OTHEROBJS="initfil1.o ball.o jetctrl.o" OTHERINCL=
-
-demo2:
- make -f $(SUBMAKE) APP=demo INIT= OTHEROBJS="initfil2.o ball.o jetctrl.o" OTHERINCL=
-
Index: demos/branches/pj/jumpball/initfil1.c
===================================================================
--- demos/branches/pj/jumpball/initfil1.c (revision 1085)
+++ demos/branches/pj/jumpball/initfil1.c (nonexistent)
@@ -1,118 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: initfil1.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:41 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/cbs.h"
-#include "modules/rr.h"
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-#include "modules/pi.h"
-#include "modules/pc.h"
-#include "modules/srp.h"
-#include "modules/npp.h"
-#include "modules/nop.h"
-
-#include "drivers/keyb.h"
-
-
-/*+ sysyem tick in us +*/
-#define TICK 0
-
-/*+ RR tick in us +*/
-//#define RRTICK 10000
-#define RRTICK 2000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- EDF_register_level(EDF_ENABLE_ALL);
- CBS_register_level(CBS_ENABLE_ALL, 0);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- dummy_register_level();
-
-
- SEM_register_module();
-
- CABS_register_module();
-
- PI_register_module();
- NOP_register_module();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- KEYB_PARMS kparms = BASE_KEYB;
-
- HARTPORT_init();
-
- keyb_def_ctrlC(kparms, NULL);
- KEYB_init(&kparms);
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
-
-void app_mutex_init(mutex_t *m)
-{
- PI_mutexattr_t attr;
-
- PI_mutexattr_default(attr);
-
- mutex_init(m, &attr);
-}
-
Index: demos/branches/pj/jumpball/initfil2.c
===================================================================
--- demos/branches/pj/jumpball/initfil2.c (revision 1085)
+++ demos/branches/pj/jumpball/initfil2.c (nonexistent)
@@ -1,119 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: initfil2.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:41 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/cbs.h"
-#include "modules/rr.h"
-#include "modules/rrsoft.h"
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-#include "modules/pi.h"
-#include "modules/pc.h"
-#include "modules/srp.h"
-#include "modules/npp.h"
-#include "modules/nop.h"
-
-#include "drivers/keyb.h"
-
-
-/*+ sysyem tick in us +*/
-#define TICK 0
-
-/*+ RR tick in us +*/
-//#define RRTICK 10000
-#define RRTICK 2000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- RRSOFT_register_level(RRTICK, RR_MAIN_NO, mb, RRSOFT_ONLY_HARD|RRSOFT_ONLY_SOFT);
- RRSOFT_register_level(RRTICK, RR_MAIN_NO, mb, RRSOFT_ONLY_SOFT); //cbs
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- dummy_register_level();
-
-
- SEM_register_module();
-
- CABS_register_module();
-
- PI_register_module();
- NOP_register_module();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- KEYB_PARMS kparms = BASE_KEYB;
-
- HARTPORT_init();
-
- keyb_def_ctrlC(kparms, NULL);
- KEYB_init(&kparms);
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
-
-void app_mutex_init(mutex_t *m)
-{
- NOP_mutexattr_t attr;
-
- NOP_mutexattr_default(attr);
-
- mutex_init(m, &attr);
-}
-
Index: demos/branches/pj/jumpball/initfile.c
===================================================================
--- demos/branches/pj/jumpball/initfile.c (revision 1085)
+++ demos/branches/pj/jumpball/initfile.c (nonexistent)
@@ -1,141 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: initfile.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:41 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#define PI
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/cbs.h"
-#include "modules/rr.h"
-
-#ifndef PI
-#include "modules/rrsoft.h"
-#endif
-
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-#include "modules/pi.h"
-#include "modules/pc.h"
-#include "modules/srp.h"
-#include "modules/npp.h"
-#include "modules/nop.h"
-
-#include "drivers/keyb.h"
-
-
-/*+ sysyem tick in us +*/
-#define TICK 0
-
-/*+ RR tick in us +*/
-//#define RRTICK 10000
-#define RRTICK 2000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
-#ifdef PI
- EDF_register_level(EDF_ENABLE_ALL);
- CBS_register_level(CBS_ENABLE_ALL, 0);
-#else
- RRSOFT_register_level(RRTICK, RR_MAIN_NO, mb, RRSOFT_ONLY_HARD|RRSOFT_ONLY_SOFT);
- RRSOFT_register_level(RRTICK, RR_MAIN_NO, mb, RRSOFT_ONLY_SOFT); //cbs
-#endif
-
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- dummy_register_level();
-
-
- SEM_register_module();
-
- CABS_register_module();
-
- PI_register_module();
- NOP_register_module();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- HARTPORT_init();
-
- kern_printf("TIME=%d\n",sys_gettime(NULL));
- KEYB_init(NULL);
- kern_printf("TIME=%d\n",sys_gettime(NULL));
-// KEYB_init(NULL);
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
-
-#ifdef PI
-void app_mutex_init(mutex_t *m)
-{
- PI_mutexattr_t attr;
-
- PI_mutexattr_default(attr);
-
- mutex_init(m, &attr);
-}
-#else
-void app_mutex_init(mutex_t *m)
-{
- NOP_mutexattr_t attr;
-
- NOP_mutexattr_default(attr);
-
- mutex_init(m, &attr);
-}
-#endif
Index: demos/branches/pj/jumpball/demo.c
===================================================================
--- demos/branches/pj/jumpball/demo.c (revision 1085)
+++ demos/branches/pj/jumpball/demo.c (nonexistent)
@@ -1,252 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: demo.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:41 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "demo.h"
-#include <kernel/func.h>
-#include <string.h>
-#include <stdlib.h>
-#include <drivers/keyb.h>
-#include <drivers/glib.h>
-
-/* graphic mutex... */
-mutex_t mutex;
-
-/* useful colors... */
-int white;
-int black;
-int red;
-int gray;
-
-void app_mutex_init(mutex_t *m);
-
-static void version( void )
-{
- cprintf( "S.Ha.R.K. Pavia Demo 1.0\n" );
- cprintf( "------------------------\n" );
- cprintf( "by Paolo Gai 1999-2001\n" );
- cprintf( " <pj@sssup.it>\n" );
- cprintf( "------------------------\n" );
-}
-
-int myrand(int x)
-{
- return rand()%x;
-}
-
-void reverse(char s[])
-{
- int c, i, j;
-
- for (i = 0, j = strlen(s)-1; i<j; i++, j--)
- {
- c = s[i];
- s[i] = s[j];
- s[j] = c;
- }
-}
-
-char * itoa(int n, char *s)
-{
- int i, sign;
-
- if ((sign = n) < 0)
- n = -n;
-
- i = 0;
-
- do
- {
- s[i++] = n % 10 + '0';
- } while ((n /= 10) > 0);
-
- if (sign < 0)
- s[i++] = '-';
-
- s[i] = 0;
-
- reverse(s);
-
- return s;
-}
-
-
-void scenario()
-{
- grx_text("S.Ha.R.K. Pavia Demo 1.0", 0, 0, rgb16(0,255,0), black );
- grx_text("by Paolo Gai 1999-2001" , 0, 8, rgb16(0,255,0), black );
- grx_text(" pj@sssup.it" , 0,16, rgb16(0,255,0), black );
-
- grx_text("Ctrl-C, Ctrr-C, Enter: exit" ,320, 0, gray, black );
- grx_text("Alt-C : void stat." ,320, 8, gray, black );
- grx_text("Space : create noise ball",320,16, gray, black );
- grx_text("Backspace : kill noise balls" ,320,24, gray, black );
-
-
- #ifdef JET_ON
- scenario_jetcontrol();
- #endif
-
- #ifdef BALL_ON
- scenario_ball();
- #endif
-}
-
-
-void demo_exc_handler(int signo, siginfo_t *info, void *extra)
-{
- struct timespec t;
-
- grx_close();
-
- /* Default action for an kern exception is */
- kern_cli();
- ll_gettime(TIME_EXACT, &t),
- kern_printf("\nS.Ha.R.K. Exception raised!!!"
- "\nTime (s:ns) :%d:%d"
- "\nException number:%d"
- "\nPID :%d\n",
- t.tv_sec, t.tv_nsec, info->si_value.sival_int,
- info->si_task);
- sys_end();
-}
-
-void my_close(void *arg)
-{
- grx_close();
- kern_printf("my_close\n");
-}
-
-
-void endfun(KEY_EVT *k)
-{
- cprintf("Ctrl-Brk pressed! Ending...\n");
- sys_end();
-}
-
-void zerofun(KEY_EVT *k)
-{
- int i;
- for (i=0; i<MAX_PROC; i++) jet_delstat(i);
-}
-
-void printeventqueue(void *arg)
-{
- struct event *p;
- extern struct event *firstevent;
-
- kern_cli();
- grx_close();
- kern_cli();
- for (p = firstevent; p != NULL; p = p->next) {
- kern_printf("par:%d time:%d.%d p:%d handler:%d\n",
- p->par, p->time.tv_sec, p->time.tv_nsec/1000, p, p->handler);
- }
- kern_sti();
-}
-
-int main(int argc, char **argv)
-{
- int modenum;
-
- KEY_EVT k;
-
- srand(4);
-
- version();
-
- keyb_set_map(itaMap);
- k.flag = CNTR_BIT;
- k.scan = KEY_C;
- k.ascii = 'c';
- keyb_hook(k,endfun);
- k.flag = CNTL_BIT;
- k.scan = KEY_C;
- k.ascii = 'c';
- keyb_hook(k,endfun);
- k.flag = ALTL_BIT;
- k.scan = KEY_C;
- k.ascii = 'c';
- keyb_hook(k,zerofun);
- k.flag = 0;
- k.scan = KEY_ENT;
- k.ascii = 13;
- keyb_hook(k,endfun);
-
- set_exchandler_grx();
- sys_atrunlevel(my_close, NULL, RUNLEVEL_BEFORE_EXIT);
-
-
- grx_init();
- modenum = grx_getmode(640, 480, 16);
-
- grx_setmode(modenum);
-
- /* init the graphic mutex */
- app_mutex_init(&mutex);
-
- /* useful colors ... */
- white = rgb16(255,255,255);
- black = rgb16(0,0,0);
- red = rgb16(255,0,0);
- gray = rgb16(128,128,128);
-
- scenario();
-
- #ifdef JET_ON
- init_jetcontrol();
- #endif
-
- #ifdef BALL_ON
- init_ball();
- #endif
-
- group_activate(1);
-
- return 0;
-}
-
-
Index: demos/branches/pj/jumpball/jetctrl.c
===================================================================
--- demos/branches/pj/jumpball/jetctrl.c (revision 1085)
+++ demos/branches/pj/jumpball/jetctrl.c (nonexistent)
@@ -1,244 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: jetctrl.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:41 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-// JetControl
-
-#include "demo.h"
-#include "kernel/func.h"
-
-TASK jetdummy_task(void *arg)
-{
- TIME now_dummy, last_dummy, diff_dummy, slice;
- struct timespec now, last, diff;
- int x = 0;
- int height;
-
- NULL_TIMESPEC(&last);
- last_dummy = 0;
- for (;;) {
- task_nopreempt();
- jet_getstat(DUMMY_PID, NULL, NULL, NULL, &now_dummy);
- sys_gettime(&now);
- task_preempt();
-
- SUBTIMESPEC(&now, &last, &diff);
- slice = diff.tv_sec * 1000000 + diff.tv_nsec/1000;
- diff_dummy = now_dummy - last_dummy;
-
- height = (int)(JET_DUMMY_HEIGHT*((float)diff_dummy)/((float)slice));
-
- TIMESPEC_ASSIGN(&last, &now);
- last_dummy = now_dummy;
-
- mutex_lock(&mutex);
- grx_line(JET_DUMMY_X+x,JET_DUMMY_Y,
- JET_DUMMY_X+x,JET_DUMMY_Y+height ,black);
- grx_line(JET_DUMMY_X+x,JET_DUMMY_Y+height,
- JET_DUMMY_X+x,JET_DUMMY_Y+JET_DUMMY_HEIGHT,white);
- grx_line(JET_DUMMY_X+(x+1)%JET_DUMMY_WIDTH,JET_DUMMY_Y,
- JET_DUMMY_X+(x+1)%JET_DUMMY_WIDTH,JET_DUMMY_Y+JET_DUMMY_HEIGHT,255);
- mutex_unlock(&mutex);
-
- x = (x+1)%JET_DUMMY_WIDTH;
-
- task_endcycle();
- }
-}
-
-
-TASK jetctrl_task(void *arg)
-{
- char st[50];
- TIME sum, max;
- int n;
-
- PID i;
- int printed = 0;
-
- for (;;) {
- for (i=2, printed=0; i<MAX_PROC && printed<JET_NTASK; i++) {
- if (jet_getstat(i, &sum, &max, &n, NULL) != -1) {
- if (!n) n=1;
- sprintf(st, "%6d %6d %10s", (int)sum/n, (int)max, proc_table[i].name);
- mutex_lock(&mutex);
- grx_text(st, 384, JET_Y_NAME+16+printed*8, gray, black);
- mutex_unlock(&mutex);
- printed++;
- }
- }
- while (printed<JET_NTASK) {
- mutex_lock(&mutex);
- grx_text(" ",
- 384, JET_Y_NAME+16+printed*8, gray, black);
- mutex_unlock(&mutex);
- printed++;
- }
- task_endcycle();
- }
-}
-
-TASK jetslide_task(void *arg)
-{
- TIME sum, curr, max;
-
- TIME total[JET_NTASK];
- int slides[JET_NTASK];
-
- PID i;
- int printed = 0;
-
- for (;;) {
- // Fill the total array in a nonpreemptive section
- task_nopreempt();
- for (i=2, printed=0; i<MAX_PROC && printed<JET_NTASK; i++) {
- if (jet_getstat(i, &sum, NULL, NULL, &curr) != -1) {
- total[printed] = sum+curr;
- printed++;
- }
- }
- task_preempt();
-
- while (printed < JET_NTASK)
- total[printed++] = 0;
-
- // Compute the Max elapsed time
- max = 0;
- for (i=0; i<JET_NTASK; i++)
- if (total[i] > max) max = total[i];
- if (!max) max = 1;
-
- // Compute the slides width
- for (i=0; i<JET_NTASK; i++)
- slides[i] = (int)( (((float)total[i])/max) * JET_SLIDE_WIDTH);
-
- // print the data
- mutex_lock(&mutex);
- for (i=0; i<JET_NTASK; i++) {
- grx_box(JET_SLIDE_X, JET_Y_NAME+16+i*8,
- JET_SLIDE_X+slides[i], JET_Y_NAME+23+i*8, gray);
- grx_box(JET_SLIDE_X+slides[i], JET_Y_NAME+16+i*8,
- JET_SLIDE_X+JET_SLIDE_WIDTH, JET_Y_NAME+23+i*8, black);
- }
-
- while (i<JET_NTASK) {
- grx_box(JET_SLIDE_X, JET_Y_NAME+16+i*8,
- JET_SLIDE_X+JET_SLIDE_WIDTH, JET_Y_NAME+20+i*8, black);
- i++;
- }
- mutex_unlock(&mutex);
- task_endcycle();
- }
-}
-
-
-void scenario_jetcontrol(void)
-{
- grx_text("System load" , 384, 45, rgb16(0,0,255), black);
- grx_line(384,55,639,55,red);
-
- grx_text(" Mean Max Name Slide", 384, JET_Y_NAME, gray, black);
- grx_line(384,JET_Y_NAME+10,639,JET_Y_NAME+10,gray);
-
- grx_rect(JET_DUMMY_X-1, JET_DUMMY_Y-1,
- JET_DUMMY_X+JET_DUMMY_WIDTH, JET_DUMMY_Y+JET_DUMMY_HEIGHT+1, gray);
-
- grx_text("100%", JET_DUMMY_X-40, JET_DUMMY_Y, gray, black);
- grx_text(" 0%", JET_DUMMY_X-40, JET_DUMMY_Y+JET_DUMMY_HEIGHT-8, gray, black);
-
- grx_line(JET_DUMMY_X-1, JET_DUMMY_Y, JET_DUMMY_X-5, JET_DUMMY_Y, gray);
- grx_line(JET_DUMMY_X-1, JET_DUMMY_Y+JET_DUMMY_HEIGHT, JET_DUMMY_X-5, JET_DUMMY_Y+JET_DUMMY_HEIGHT, gray);
-}
-
-void init_jetcontrol(void)
-{
- SOFT_TASK_MODEL m3, m4, m5;
-
- PID p3, p4, p5;
-
- soft_task_default_model(m3);
- soft_task_def_level(m3,1);
- soft_task_def_period(m3, PERIOD_JETCTRL);
- soft_task_def_met(m3, WCET_JETCTRL);
- soft_task_def_ctrl_jet(m3);
- soft_task_def_group(m3, 1);
- p3 = task_create("jctrl", jetctrl_task, &m3, NULL);
- if (p3 == -1) {
- grx_close();
- perror("Could not create task <jetctrl>");
- sys_end();
- }
-
- soft_task_default_model(m4);
- soft_task_def_level(m4,1);
- soft_task_def_period(m4, PERIOD_JETDUMMY);
- soft_task_def_met(m4, WCET_JETDUMMY);
- soft_task_def_group(m4, 1);
- soft_task_def_usemath(m4);
- soft_task_def_ctrl_jet(m4);
- p4 = task_create("jdmy", jetdummy_task, &m4, NULL);
- if (p4 == -1) {
- grx_close();
- perror("Could not create task <jetdummy>");
- sys_end();
- }
-
- soft_task_default_model(m5);
- soft_task_def_level(m5,1);
- soft_task_def_period(m5, PERIOD_JETSLIDE);
- soft_task_def_met(m5, WCET_JETSLIDE);
- soft_task_def_group(m5, 1);
- soft_task_def_usemath(m5);
- soft_task_def_ctrl_jet(m5);
- p5 = task_create("jsli", jetslide_task, &m5, NULL);
- if (p5 == -1) {
- grx_close();
- perror("Could not create task <jetslide>");
- sys_end();
- }
-}
-
Index: demos/branches/pj/jumpball/demo.h
===================================================================
--- demos/branches/pj/jumpball/demo.h (revision 1085)
+++ demos/branches/pj/jumpball/demo.h (nonexistent)
@@ -1,147 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: demo.h,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:41 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-#include <ll/ll.h>
-#include <kernel/types.h>
-#include <kernel/descr.h>
-#include <math.h>
-#include <drivers/glib.h>
-#include <drivers/keyb.h>
-
-
-#define JET_ON
-#define BALL_ON
-
-/*
- *
- * WCET, Periods and Models
- *
- */
-
-
-/* define if you want NRT or SOFT... */
-#define TASK_TYPE SOFT
-//#define TASK_TYPE NRT
-
-#define WCET_JETCTRL 7500
-#define WCET_JETDUMMY 200
-#define WCET_JETSLIDE 2100
-
-#define PERIOD_JETCTRL 100000
-#define PERIOD_JETDUMMY 100000
-#define PERIOD_JETSLIDE 100000
-
-
-#define WCET_BALL 100
-
-#define PERIOD_BALL 10000
-
-/*
- *
- * Global Stuffs
- *
- */
-
-/* graphic mutex... */
-extern mutex_t mutex;
-
-/* useful colors... */
-extern int white;
-extern int black;
-extern int red;
-extern int gray;
-
-void init_jetcontrol();
-void init_ball(void);
-void scenario_jetcontrol();
-void scenario_ball();
-char *itoa(int n, char *s);
-int myrand(int x);
-
-
-
-/*
- *
- * JETCONTROL stuffs
- *
- */
-
-#define JET_NTASK 35
-#define JET_Y_NAME 170
-
-#define DUMMY_PID 1
-
-#define JET_DUMMY_WIDTH 210
-#define JET_DUMMY_HEIGHT 80
-
-/* the point (x, y) is the top left corner */
-#define JET_DUMMY_X 428
-#define JET_DUMMY_Y 65
-
-#define JET_SLIDE_WIDTH 50
-#define JET_SLIDE_X 576
-
-
-
-
-/*
- *
- * BALL stuffs
- *
- */
-
-// x and y corners are specified whithout consider a border of 3 pixels
-#define BALL_Y 450 /* position of the floor */
-#define BALL_HEIGHT 385 /* initial height of the ball */
-#define BALL_XMIN 10 /* min position X of the ball */
-#define BALL_XMAX 370 /* max position X of the ball */
-#define BALL_VELX 5. /* horizontal ball velocity */
-#define BALL_VYMIN 11. /* min ground speed */
-#define BALL_MAX_P 60 /* max number of balls */
-
-#define BALL_GROUP 2 /* task group of the balls */
Index: demos/branches/pj/robots/lab1m.txt
===================================================================
--- demos/branches/pj/robots/lab1m.txt (revision 1085)
+++ demos/branches/pj/robots/lab1m.txt (nonexistent)
@@ -1,9 +0,0 @@
-1
-540 380 15 270
-380 300 400 5
-430 060 460 400 0
-350 100 430 130 0
-000 100 300 130 0
-150 200 430 230 0
-120 300 150 400 0
-
Index: demos/branches/pj/robots/mouse2.c
===================================================================
--- demos/branches/pj/robots/mouse2.c (revision 1085)
+++ demos/branches/pj/robots/mouse2.c (nonexistent)
@@ -1,935 +0,0 @@
-/*--------------------------------------------------------------*/
-/* Title: Mouse */
-/* Autor: João Capucho */
-/* Date: 9/12/2000 */
-/* Description: */
-/* Simulation of small automats based on the */
-/* "micro-rato" conteste */
-/*--------------------------------------------------------------*/
-
-/*
- * Copyright (C) 2001 João Capucho
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-// Includes
-#include <ll/i386/x-dos.h>
-#include <kernel/kern.h>
-#include <drivers/glib.h>
-#include <drivers/keyb.h>
-#include <math.h>
-#include <stdlib.h>
-#include <limits.h>
-
-#define sqr(x) (x*x)
-
-// Error Types
-#define OK 0
-#define MEMORY_ERROR -1
-#define ILEGAL_PARAMETER -2
-
-// Types of sensors and motors
-#define NONE 0
-#define OBSTACLE 1
-#define BEACON 2
-#define GROUND 3
-#define STEP 4
-
-// Maze limits
-#define LAB_XMIN 40
-#define LAB_XMAX 600
-#define LAB_YMIN 40
-#define LAB_YMAX 440
-
-#define MOTOR_RIGHT 1
-#define MOTOR_LEFT 0
-
-#define BACKCOLOR 0 // Background color
-#define OUTCOLOR 14 // Color of the outside walls
-#define FINISHCOLOR 7 // Finishin area color
-#define NONBLOCKCOLOR 14 // Non block boxs
-#define BLOCKCOLOR 13 // Block boxs
-
-#define BOX_BLOCK 1 // The box blocks the beacon
-#define BOX_NON_BLOCK 2 // The box doesn´t block the beacon
-
-#define MAX_MOUSES 5 // Maximum of mouses in the Maze
-#define MAX_BOXS 100 // Maximum of boxs in the Maze
-#define MAX_SENSORS 20 // Maximum of sensors in each mouse
-#define SENSOR_MIN_GROUND 0 // Minimum value of a ground sensor
-#define SENSOR_MAX_GROUND 255 // Maximum value of a ground sensor
-#define SENSOR_MIN_OBSTACLE 77 // Minimum value of a obstacle sensor
-#define SENSOR_MAX_OBSTACLE 128 // Maximum value of a obstacle sensor
-#define SENSOR_MIN_BEACON 77 // Minimum value of a beacon sensor
-#define SENSOR_MAX_BEACON 128 // Maximum value of a beacon sensor
-#define BEACON_INTENSITY 400 // Maximun intensity of the beacon
-
-#define MOUSE_PERIOD 20000 // Period
-#define CALC_PERIOD 2000 // Period
-#define REFEREE_PERIOD 1000 // Period of the referee
-#define REDRAW_MOUSE_PERIOD 25000 // Period for redraw mouse
-#define REDRAW_MAZE_PERIOD 100000 // Period for redraw maze
-#define MOUSEGROUP 511
-
-struct SENSOR
-{
- int Type; // Tipe of sensor ( None - Obstacle - Beacon - Ground)
- int Radius; // Distance from de center of the mouse
- int Pos_Angle; // Angle between the sensor and the front of the mouse
- int Dir; // Angle between the direction of the sensores and the front of the mouse
- int Angle; // Half angle of visual field (between (Dir-Angle) and (Dir+Angle))
- int Intensity; // Sensativity of the sensor
- float Value; // Last value readed
-};
-
-struct MOTOR
-{
- int Radius; // Distance from de center of the mouse
- int V; // Current velocity
- float Old_V; // Previews velocity
-};
-
-struct MOUSE
-{
- float X, Y; // Current position of the center
- float Old_X, Old_Y; // Previous position of the center
- int Radius; // Size of the mouse ( every mouse is considered round )
- float Dir; // Points to the front
- float Old_Dir; // Previous front
- int NSensors; // Number of sensors in the mouse
- struct SENSOR Sensors[MAX_SENSORS]; // Pointer to the structer that contains the information of the sensors
- struct MOTOR Motors[2]; // Pointer to the structer that contains the information of the motors
- WORD NColision; // Total of colisions
- WORD PColision; // Auxiliar for colisions
- char Flag; // Initialization flag
-};
-
-
-
-struct BOX // Structer that represents the obstacles
-{ //in this case all the obstacles are boxs
- int Type; // Type of the obstatcle
- int X1, Y1, X2, Y2; // position of the box
-};
-
-struct SBEACON // Beacon information
-{
- int Intensity; // Intensity of the beacon
- int X, Y; // position of the beacon
-};
-
-struct MAZE
-{
- int X1, Y1, X2, Y2; // limites of the maze
- int NBoxs; // Number of objstacles in the maze
- struct BOX Boxs[MAX_BOXS]; // Information about all thr obstacles
- struct SBEACON Beacon; // Beacon data
- int Radius; // Size of the finishing area
-};
-
-int Seno[360+90]; // Sine table
-int Tang[180]; // Tangente table
-int NMouses=0;
-struct MOUSE Mouse[MAX_MOUSES]; // Global variable that represents all the mouses
-struct MAZE Maze; // Global variable that represents the maze
-
-// Init_Maze - Initialize the Maze
-// Beacon_X - Coordinate X of the beacon
-// Beacon_Y - Coordinate Y of the beacon
-// Intensity - Intensity of the beacon
-// NBoxs - Number of boxs in the maze
-// Return: OK - Sucess
-
-int Init_Maze(int Beacon_X, int Beacon_Y, int Intensity, int NBoxs)
-{
- int i;
- Maze.X1=LAB_XMIN;
- Maze.Y1=LAB_YMIN;
- Maze.X2=LAB_XMAX;
- Maze.Y2=LAB_YMAX;
- Maze.Beacon.X=Beacon_X+LAB_XMIN;
- Maze.Beacon.Y=Beacon_Y+LAB_YMIN;
- if (Intensity<BEACON_INTENSITY)
- Maze.Beacon.Intensity=Intensity;
- else
- Maze.Beacon.Intensity=BEACON_INTENSITY;
- if (NBoxs<MAX_BOXS)
- Maze.NBoxs=NBoxs;
- else
- Maze.NBoxs=MAX_BOXS;
- Maze.Radius=50;
- for(i=0; i < Maze.NBoxs; i++)
- Maze.Boxs[i].Type=NONE;
- return OK;
-}
-
-// Init_Box - Initialize data of the NBox obstacle
-// NBox - Identifier of the obstacle
-// X1 - Coordinate X
-// Y1 - Coordinate Y
-// X2 - Coordinate X
-// Y2 - Coordinate Y
-// Type - Type of the obstacle
-// Return: OK - Sucess
-
-int Init_Box(int NBox, int X1, int Y1, int X2, int Y2, int Type)
-{
- Maze.Boxs[NBox].Type=Type;
- if (X1<X2)
- {
- Maze.Boxs[NBox].X1=X1+LAB_XMIN;
- Maze.Boxs[NBox].X2=X2+LAB_XMIN;
- }
- else
- {
- Maze.Boxs[NBox].X1=X2+LAB_XMIN;
- Maze.Boxs[NBox].X2=X1+LAB_XMIN;
- }
- if (Y1<Y2)
- {
- Maze.Boxs[NBox].Y1=Y1+LAB_YMIN;
- Maze.Boxs[NBox].Y2=Y2+LAB_YMIN;
- }
- else
- {
- Maze.Boxs[NBox].Y1=Y2+LAB_YMIN;
- Maze.Boxs[NBox].Y2=Y1+LAB_YMIN;
- }
- return OK;
-}
-
-// Draw_Maze - Draws the outline of the maze and the obstacles
-// Return: OK - Sucess
-int Draw_Maze(void)
-{
- int i;
- grx_rect( Maze.X1, Maze.Y1, Maze.X2, Maze.Y2, OUTCOLOR);
- grx_rect( Maze.X1-1, Maze.Y1+1, Maze.X2+1, Maze.Y2+1, OUTCOLOR);
- grx_rect( Maze.X1-2, Maze.Y1+2, Maze.X2+2, Maze.Y2+2, OUTCOLOR);
- grx_circle(Maze.Beacon.X, Maze.Beacon.Y, Maze.Radius, FINISHCOLOR);
- grx_disc(Maze.Beacon.X, Maze.Beacon.Y, 10, 7);
- for (i=0; i<Maze.NBoxs; i++)
- {
- if (Maze.Boxs[i].Type==BOX_NON_BLOCK)
- grx_box(Maze.Boxs[i].X1, Maze.Boxs[i].Y1,
- Maze.Boxs[i].X2, Maze.Boxs[i].Y2, NONBLOCKCOLOR);
- if (Maze.Boxs[i].Type==BOX_BLOCK)
- grx_box(Maze.Boxs[i].X1, Maze.Boxs[i].Y1,
- Maze.Boxs[i].X2, Maze.Boxs[i].Y2, BLOCKCOLOR);
- }
- return OK;
-}
-
-int Init_Motor(int NMouse, int Motor, int Radius)
-{
- if ((NMouse<0) || (NMouse>=MAX_MOUSES))
- return ILEGAL_PARAMETER;
- if ((Motor<0) || (Motor>=2))
- return ILEGAL_PARAMETER;
- Mouse[NMouse].Motors[Motor].Radius=Radius;
- Mouse[NMouse].Motors[Motor].V=0;
- Mouse[NMouse].Motors[Motor].Old_V=0.0;
- return OK;
-}
-
-// Init_Mouse - inicialize the parameters of each mouse
-// NMouse - Identifier of the mouse
-// X - Coordinate X of the center
-// Y - Coordinate Y of the center
-// Radius - Radius of the mouse (size)
-// Dir - Angle of direction in witch i will start
-// NSensors - Number of sensors in the mouse (all types)
-//
-// Return: OK - Sucess
-// ILEGAL_PARAMETER - If NMouse negative of greater than maximum number of mouses
-// Note: All the types of sensors and motors are initialize to NONE
-
-int Init_Mouse(int NMouse, int X, int Y, int Radius, int Dir, int NSensors)
-{
- int i;
- if ((NMouse<0) || (NMouse>=MAX_MOUSES))
- return ILEGAL_PARAMETER;
- if ((NSensors<0) || (NSensors>MAX_SENSORS))
- return ILEGAL_PARAMETER;
- Mouse[NMouse].X=(float)X+LAB_XMIN;
- Mouse[NMouse].Y=(float)Y+LAB_YMIN;
- Mouse[NMouse].Radius=Radius;
- Mouse[NMouse].Dir=Dir;
- Mouse[NMouse].Old_Dir=Mouse[NMouse].Dir;
- Mouse[NMouse].NSensors=NSensors;
- Mouse[NMouse].Old_X=Mouse[NMouse].X;
- Mouse[NMouse].Old_Y=Mouse[NMouse].Y;
- Mouse[NMouse].NColision=0;
- Mouse[NMouse].PColision=0;
- for(i=0; i < Mouse[NMouse].NSensors; i++)
- Mouse[NMouse].Sensors[i].Type=NONE;
-
- Init_Motor(NMouse, MOTOR_LEFT, 10);
- Init_Motor(NMouse, MOTOR_RIGHT, -10);
-
- return OK;
-}
-
-// Init_Sensor - Initializes the sensor information
-// NMouse - Identifier of the mouse
-// Sensor - Identifier of the sensor to be used
-// Type - Type of sensor ( Ground, obstacle or beacon sensor )
-// Radius and Pos_Angle - Polar coordinates to determen the sensor position
-// Dir - Diretion of the sensor ( angle between the front and the sensor )
-// Angle - Half of the visual range
-// Intensity - Maximun distance of detect
-int Init_Sensor(int NMouse, int Sensor, int Type, int Radius,
- int Pos_Angle, int Dir, int Angle, int Intensity)
-{
- if ((NMouse<0) || (NMouse>=MAX_MOUSES))
- return ILEGAL_PARAMETER;
- if ((Sensor<0) || (Sensor>=Mouse[NMouse].NSensors))
- return ILEGAL_PARAMETER;
- Mouse[NMouse].Sensors[Sensor].Type=Type;
- Mouse[NMouse].Sensors[Sensor].Radius=Radius;
- Mouse[NMouse].Sensors[Sensor].Pos_Angle=Pos_Angle;
- Mouse[NMouse].Sensors[Sensor].Dir=Dir;
- Mouse[NMouse].Sensors[Sensor].Angle=Angle;
- Mouse[NMouse].Sensors[Sensor].Intensity=Intensity;
- if (Type == GROUND)
- Mouse[NMouse].Sensors[Sensor].Value=(float)SENSOR_MIN_GROUND;
- if (Type == OBSTACLE)
- Mouse[NMouse].Sensors[Sensor].Value=(float)SENSOR_MIN_OBSTACLE;
- if (Type == BEACON)
- Mouse[NMouse].Sensors[Sensor].Value=(float)SENSOR_MIN_BEACON;
- return OK;
-}
-
-int Set_Motor_Vel(int NMouse, int NMotor, int Vel)
-{
- if ((NMouse<0) || (NMouse>=MAX_MOUSES))
- return ILEGAL_PARAMETER;
- if ((NMotor<0) || (NMotor>2))
- return ILEGAL_PARAMETER;
- Mouse[NMouse].Motors[NMotor].V=Vel;
- return OK;
-}
-
-int Read_Sensor(int NMouse, int NSensor)
-{
- int X, Y, Dir, cr, sr, AuxX, AuxY;
- int Count, AuxCount, AngCount, AuxAngCount, RetColor, Intensity;
- float Auxf;
-
- /* Inicial verifications */
- if ((NMouse<0) || (NMouse>=MAX_MOUSES))
- return ILEGAL_PARAMETER;
- if ((NSensor<0) || (NSensor>Mouse[NMouse].NSensors))
- return ILEGAL_PARAMETER;
-
- /* If Sensor Not define exit */
- if ( Mouse[NMouse].Sensors[NSensor].Type == NONE )
- return OK;
-
- /* Calculate de position of the sensor and is direction */
- Dir=(int)Mouse[NMouse].Old_Dir+Mouse[NMouse].Sensors[NSensor].Dir;
- if (Dir >= 360)
- Dir -= 360;
- if (Dir < 0)
- Dir += 360;
- X= Mouse[NMouse].Old_X*65536.0+((Mouse[NMouse].Sensors[NSensor].Radius*Seno[Dir+90]));
- Y= Mouse[NMouse].Old_Y*65536.0+((Mouse[NMouse].Sensors[NSensor].Radius*Seno[Dir]));
-
- /* if the Sensor type is OBSTACLE */
- if ( Mouse[NMouse].Sensors[NSensor].Type == OBSTACLE )
- {
- Intensity=Mouse[NMouse].Sensors[NSensor].Intensity;
- AuxCount=Intensity;
- /* Scan all the visual field */
- for (AngCount=(-Mouse[NMouse].Sensors[NSensor].Angle);
- AngCount<=Mouse[NMouse].Sensors[NSensor].Angle;
- AngCount++)
- {
- AuxAngCount=Dir+AngCount;
- if (AuxAngCount >= 360)
- AuxAngCount -= 360;
- if (AuxAngCount < 0)
- AuxAngCount += 360;
- sr=Seno[AuxAngCount];
- cr=Seno[AuxAngCount+90];
- Count=Mouse[NMouse].Radius-Mouse[NMouse].Sensors[NSensor].Radius+2;
- AuxX = X+cr*Count;
- AuxY = Y+sr*Count;
- for (; Count<=AuxCount; Count++)
- {
- AuxX += cr;
- AuxY += sr;
- RetColor = grx_getpixel(AuxX >> 16, AuxY >> 16);
- if ((RetColor != BACKCOLOR)&&(RetColor != FINISHCOLOR))
- AuxCount=Count;
- }
- }
- Count=Mouse[NMouse].Sensors[NSensor].Intensity;
- Count*=Count;
- AuxCount*=AuxCount;
- Count = SENSOR_MAX_OBSTACLE-((SENSOR_MAX_OBSTACLE-SENSOR_MIN_OBSTACLE)
- *AuxCount)/Count;
- Mouse[NMouse].Sensors[NSensor].Value=
- (0.5*Mouse[NMouse].Sensors[NSensor].Value+0.5*(float)Count);
- }
- if ( Mouse[NMouse].Sensors[NSensor].Type == GROUND )
- {
- Mouse[NMouse].Sensors[NSensor].Value=(float)SENSOR_MIN_GROUND;
- AuxX=abs((X>>16)-Maze.Beacon.X);
- AuxY=abs((Y>>16)-Maze.Beacon.Y);
- if ((AuxX>50) || (AuxY>50))
- return OK;
- if ((AuxX*AuxX+AuxY*AuxY)<Maze.Radius*Maze.Radius)
- Mouse[NMouse].Sensors[NSensor].Value=(float)SENSOR_MAX_GROUND;
- }
-
- if ( Mouse[NMouse].Sensors[NSensor].Type == BEACON )
- {
- AuxX=(X>>16)-Maze.Beacon.X;
- AuxY=(Y>>16)-Maze.Beacon.Y;
- AngCount=0;
- if (AuxX!=0)
- {
- AuxAngCount=(AuxY<<16)/AuxX;
- if (AuxAngCount<0)
- AngCount=90;
- for (Count=AngCount;Count<AngCount+90;Count++)
- {
- if ((Tang[Count]<=AuxAngCount) && (Tang[Count+1]>AuxAngCount))
- break;
- }
- }
- else
- Count=90;
- if (AuxY<0)
- Count+=180;
- AuxAngCount=abs(180-abs(Dir-Count));
- Count=SENSOR_MIN_BEACON;
- if (AuxAngCount<Mouse[NMouse].Sensors[NSensor].Angle)
- {
- Count=AuxX*AuxX+AuxY*AuxY;
- AuxCount=(int)((float)Maze.Beacon.Intensity*(1.0+(0.4*(float)AuxAngCount)/(float)Mouse[NMouse].Sensors[NSensor].Angle));
- AuxCount*=AuxCount;
- if (Count<AuxCount)
- Count = SENSOR_MAX_OBSTACLE-((SENSOR_MAX_OBSTACLE-SENSOR_MIN_OBSTACLE)*Count)/AuxCount;
- else
- Count=SENSOR_MIN_BEACON;
- }
- Auxf=0.5*((float)Count);
- Auxf+=0.5*((float)Mouse[NMouse].Sensors[NSensor].Value);
- Mouse[NMouse].Sensors[NSensor].Value=Auxf;
- }
- return OK;
-}
-
-int GetSensor(int NMouse, int NSensor)
-{
- if ((NMouse<0) || (NMouse>=MAX_MOUSES))
- return ILEGAL_PARAMETER;
- if ((NSensor<0) || (NSensor>Mouse[NMouse].NSensors))
- return ILEGAL_PARAMETER;
- return (int)Mouse[NMouse].Sensors[NSensor].Value;
-}
-
-int Draw_Mouse(int NMouse, int Flag)
-{
- int Color;
- if (!Flag)
- Color=BACKCOLOR;
- else
- {
- Mouse[NMouse].Old_X=Mouse[NMouse].X;
- Mouse[NMouse].Old_Y=Mouse[NMouse].Y;
- Mouse[NMouse].Old_Dir=Mouse[NMouse].Dir;
- Color=2;
- }
- grx_circle(Mouse[NMouse].Old_X, Mouse[NMouse].Old_Y, Mouse[NMouse].Radius, Color);
- grx_line(Mouse[NMouse].Old_X, Mouse[NMouse].Old_Y,
- Mouse[NMouse].Old_X+((Mouse[NMouse].Radius*Seno[(int)Mouse[NMouse].Old_Dir+90]) >> 16),
- Mouse[NMouse].Old_Y+((Mouse[NMouse].Radius*Seno[(int)Mouse[NMouse].Old_Dir]) >> 16), Color);
- return OK;
-}
-
-TASK Redraw_Mouse_Task(int NMouse)
-{
- char str[40];
- TIME dwTicks;
- while(1)
- {
- dwTicks=sys_gettime(NULL);
- Draw_Mouse(NMouse, FALSE);
- Draw_Mouse(NMouse, TRUE);
- sprintf(str,"Colision: %4d", (int)Mouse[NMouse].NColision);
- grx_text(str, NMouse*150, 21, 7, 0);
- sprintf(str,"Motor: %4d Sensor 0: %4d Sensor 1: %4d Sensor 2: %4d Sensor 3: %4d",
- (int)Mouse[NMouse].Motors[0].Old_V+(int)Mouse[NMouse].Motors[1].Old_V,
- (int)Mouse[NMouse].Sensors[0].Value, (int)Mouse[NMouse].Sensors[1].Value,
- (int)Mouse[NMouse].Sensors[2].Value, (int)Mouse[NMouse].Sensors[3].Value);
- if (NMouse==0)
- grx_text(str, 1, 1, 7, 0);
- sprintf(str,"Sensor 4: %4d Sensor 5: %4d Ticks: %4d",
- (int)Mouse[NMouse].Sensors[4].Value, (int)Mouse[NMouse].Sensors[5].Value,
- (int)(sys_gettime(NULL)-dwTicks)/1000);
- if (NMouse==0)
- grx_text(str, 1, 11, 7, 0);
- task_endcycle();
- }
-}
-
-TASK Redraw_Maze_Task(void)
-{
- while(1)
- {
- Draw_Maze();
- task_endcycle();
- }
-}
-
-TASK Referee(void)
-{
- int Counter, Box_Min_X, Box_Max_X ,Box_Min_Y, Box_Max_Y;
- int deltaX, deltaY, Radius;
- int Colision;
- int NMouse;
-
- while(1)
- {
- for(NMouse=0;NMouse<NMouses;NMouse++)
- {
- Colision=0;
- Radius=Mouse[NMouse].Radius;
- if(Mouse[NMouse].Y<(Maze.Y1+Radius))
- Colision++;
- if(Mouse[NMouse].Y>(Maze.Y2-Radius))
- Colision++;
- if(Mouse[NMouse].X<(Maze.X1+Radius))
- Colision++;
- if(Mouse[NMouse].X>(Maze.X2-Radius))
- Colision++;
- for(Counter=0; Counter<Maze.NBoxs; Counter++)
- {
- Box_Min_X=Maze.Boxs[Counter].X1-1;
- Box_Max_X=Maze.Boxs[Counter].X2+1;
- Box_Min_Y=Maze.Boxs[Counter].Y1-1;
- Box_Max_Y=Maze.Boxs[Counter].Y2+1;
- Radius=Mouse[NMouse].Radius;
- if(Mouse[NMouse].Y<(Box_Min_Y-Radius))
- continue;
- if(Mouse[NMouse].Y>(Box_Max_Y+Radius))
- continue;
- if(Mouse[NMouse].X<(Box_Min_X-Radius))
- continue;
- if(Mouse[NMouse].X>(Box_Max_X+Radius))
- continue;
- if((Mouse[NMouse].X>=Box_Min_X) && (Mouse[NMouse].X<=Box_Max_X))
- if((Mouse[NMouse].Y>=(Box_Min_Y-Radius))
- && (Mouse[NMouse].Y<=(Box_Max_Y+Radius)))
- Colision++;
- if((Mouse[NMouse].Y>=Box_Min_Y) && (Mouse[NMouse].Y<=Box_Max_Y))
- if((Mouse[NMouse].X>=(Box_Min_X-Radius))
- && (Mouse[NMouse].X<=(Box_Max_X+Radius)))
- Colision++;
- Radius=sqr(Radius);
- deltaX=sqr(Mouse[NMouse].X-Box_Min_X);
- deltaY=sqr(Mouse[NMouse].Y-Box_Min_Y);
- if(deltaX+deltaY<=Radius)
- Colision++;
- deltaY=sqr(Mouse[NMouse].Y-Box_Max_Y);
- if(deltaX+deltaY<=Radius)
- Colision++;
- deltaX=sqr(Mouse[NMouse].X-Box_Max_X);
- deltaY=sqr(Mouse[NMouse].Y-Box_Min_Y);
- if(deltaX+deltaY<=Radius)
- Colision++;
- deltaY=sqr(Mouse[NMouse].Y-Box_Max_Y);
- if(deltaX+deltaY<=Radius)
- Colision++;
- }
- if (Mouse[NMouse].PColision && !Colision)
- Mouse[NMouse].NColision++;
-
- Mouse[NMouse].PColision=Colision;
- }
- task_endcycle();
- }
- return (void *)0;
-}
-
-TASK Calculate_Position(int NMouse)
-{
- float w, v, dt;
- int b;
- while(1)
- {
- b=(Mouse[NMouse].Motors[MOTOR_LEFT].Radius-
- Mouse[NMouse].Motors[MOTOR_RIGHT].Radius);
- if (b<0)
- b=-b;
- w=(Mouse[NMouse].Motors[MOTOR_LEFT].Old_V-
- Mouse[NMouse].Motors[MOTOR_RIGHT].Old_V);
- w/=(float)b;
- v=(Mouse[NMouse].Motors[MOTOR_LEFT].Old_V+
- Mouse[NMouse].Motors[MOTOR_RIGHT].Old_V);
- v/=2.0;
- dt=CALC_PERIOD/1000000.0;
- Mouse[NMouse].Dir += (180.0*w/PI)*dt;
- if (Mouse[NMouse].Dir >= 360)
- Mouse[NMouse].Dir -= 360;
- if (Mouse[NMouse].Dir < 0)
- Mouse[NMouse].Dir += 360;
- v *= dt/65536.0;
- b=(float)Seno[(int)Mouse[NMouse].Dir+90];
- Mouse[NMouse].X += v*b;
- b=(float)Seno[(int)Mouse[NMouse].Dir];
- Mouse[NMouse].Y += v*b;
- Mouse[NMouse].Motors[0].Old_V=
- (0.8187*Mouse[NMouse].Motors[0].Old_V+
- 0.1813*(float)Mouse[NMouse].Motors[0].V);
- Mouse[NMouse].Motors[1].Old_V=
- (0.8187*Mouse[NMouse].Motors[1].Old_V+
- 0.1813*(float)Mouse[NMouse].Motors[1].V);
- task_endcycle();
- }
-}
-
-#define SENSOR_LEFT 0
-#define SENSOR_FRONT 1
-#define SENSOR_RIGTH 2
-#define SENSOR_GROUND 3
-#define SENSOR_B_LEFT 4
-#define SENSOR_B_RIGHT 5
-#define MAX_SPEED 50
-#define DIST_DIR GetSensor(NMouse, SENSOR_RIGTH)
-#define DIST_ESQ GetSensor(NMouse, SENSOR_LEFT)
-#define DIST_FRENTE GetSensor(NMouse, SENSOR_FRONT)
-#define FAROL_ESQ GetSensor(NMouse, SENSOR_B_LEFT)
-#define FAROL_DIR GetSensor(NMouse, SENSOR_B_RIGHT)
-#define FAROL_LIM_INF SENSOR_MIN_BEACON+5
-
-#define DIST0 88 //Distancia minima optima
-#define DIST1 DIST0 + 5 // 60%
-#define DIST2 DIST1 + 10 // PARADO
-#define DIST3 DIST2 + 10 // TRAS
-
-#define DISTMAX 120
-#define NENHUM 0
-#define ESQUERDA 1
-#define DIREITA 2
-#define contorno ContornoArr[NMouse]
-
-TASK MouseTask(int NMouse)
-{
- int i;
- //char str[100];
- unsigned char flag;
- static unsigned char ContornoArr[MAX_MOUSES];
- signed char modulo;
-
- Init_Sensor(NMouse, SENSOR_LEFT, OBSTACLE, 14, -45, -45, 25, 15); // Left
- Init_Sensor(NMouse, SENSOR_FRONT, OBSTACLE, 14, 0, 0, 25, 15); // Center
- Init_Sensor(NMouse, SENSOR_RIGTH, OBSTACLE, 14, 45, 45, 25, 15); // Rigth
- Init_Sensor(NMouse, SENSOR_GROUND, GROUND, 10, 180, 180, 0, 20); // Ground
- Init_Sensor(NMouse, SENSOR_B_LEFT, BEACON, 4, -45, -25, 30, 0); // Left
- Init_Sensor(NMouse, SENSOR_B_RIGHT, BEACON, 4, 45, 25, 30, 0); // Rigth
- contorno = NENHUM;
- Mouse[NMouse].Flag=1;
-
- while(1)
- {
- for(i=0; i<8; i++)
- Read_Sensor(NMouse, i);
- Set_Motor_Vel(NMouse, MOTOR_RIGHT, MAX_SPEED);
- Set_Motor_Vel(NMouse, MOTOR_LEFT, MAX_SPEED);
-
- flag = ((DIST_DIR>DIST3) && contorno==ESQUERDA) ||
- ((DIST_ESQ>DIST3) && contorno==DIREITA);
-
- if ( (DIST_FRENTE>DISTMAX) || flag) {
- Set_Motor_Vel(NMouse, MOTOR_RIGHT, MAX_SPEED/2);
- Set_Motor_Vel(NMouse, MOTOR_LEFT, MAX_SPEED/2);
- if (contorno == ESQUERDA)
- Set_Motor_Vel(NMouse, MOTOR_RIGHT, -MAX_SPEED/2);
- else
- Set_Motor_Vel(NMouse, MOTOR_LEFT, -MAX_SPEED/2);
- }
- else {
-
- // ---------------- Contorno da Esquerda ---------------
- if (contorno!=DIREITA){
- if (DIST_ESQ>DIST1) { // Sensor da esquerda
- contorno = ESQUERDA;
- if (DIST_ESQ>DIST3) {
- Set_Motor_Vel(NMouse, MOTOR_RIGHT, -MAX_SPEED/2);
- Set_Motor_Vel(NMouse, MOTOR_LEFT, MAX_SPEED/2);
- }
- else
- if (DIST_ESQ>DIST2)
- Set_Motor_Vel(NMouse, MOTOR_RIGHT, 10);
- else
- Set_Motor_Vel(NMouse, MOTOR_RIGHT, MAX_SPEED*3/4);
- }
- else
- if (contorno== ESQUERDA) {
- if(DIST_ESQ<DIST0)
- Set_Motor_Vel(NMouse, MOTOR_LEFT, MAX_SPEED*3/10);
- }
- }
-
- // ---------------- Contorno da Direita ---------------
- if (contorno!=ESQUERDA){
- if (DIST_DIR>DIST1) { // Sensor da direita
- contorno = DIREITA;
- if (DIST_DIR>DIST3) {
- Set_Motor_Vel(NMouse, MOTOR_RIGHT, MAX_SPEED/2);
- Set_Motor_Vel(NMouse, MOTOR_LEFT, -MAX_SPEED/2);
- }
- else
- if (DIST_DIR>DIST2)
- Set_Motor_Vel(NMouse, MOTOR_LEFT, 10);
- else
- Set_Motor_Vel(NMouse, MOTOR_LEFT, MAX_SPEED*3/4);
- }
- else
- if (contorno== DIREITA) {
- if (DIST_DIR<DIST0)
- Set_Motor_Vel(NMouse, MOTOR_RIGHT, MAX_SPEED*3/10);
- }
- }
-
- // --------------- Desempancar contornos com o farol ------------
-
- if ((contorno == ESQUERDA && FAROL_DIR > FAROL_ESQ && FAROL_DIR > FAROL_LIM_INF) ||
- (contorno == DIREITA && FAROL_ESQ > FAROL_DIR && FAROL_ESQ > FAROL_LIM_INF) )
- contorno = NENHUM;
-
-
-
- if (contorno == NENHUM)
- {
- modulo = FAROL_DIR - FAROL_ESQ;
- if (modulo < 0 )
- modulo = - modulo;
-
- // Se nao estiver na direçao certa, ajustar
- if (modulo > 10) {
- if (FAROL_DIR > FAROL_ESQ)
- Set_Motor_Vel(NMouse, MOTOR_RIGHT, 0);
- else
- Set_Motor_Vel(NMouse, MOTOR_LEFT, 0);
- }
- else //velocidade controlada
- if (modulo > 2) {
- if (FAROL_DIR > FAROL_ESQ)
- Set_Motor_Vel(NMouse, MOTOR_RIGHT, MAX_SPEED*6/10);
- else
- Set_Motor_Vel(NMouse, MOTOR_LEFT, MAX_SPEED*6/10);
- }
- }
- }
- if (GetSensor(NMouse, SENSOR_GROUND)==SENSOR_MAX_GROUND)
- {
- Set_Motor_Vel(NMouse, MOTOR_RIGHT, 0);
- Set_Motor_Vel(NMouse, MOTOR_LEFT, 0);
- }
-
- task_endcycle();
- }
- return (void *)0;
-}
-
-void my_end(void *arg)
-{
- grx_close();
-}
-
-/* --------------------------------- Main program -----------------------------*/
-
-int main(int argc, char *argv[])
-{
- int i;
- char c;
- int pid;
-
- HARD_TASK_MODEL mp;
- SOFT_TASK_MODEL ms;
-
- // char StrAux[15];
-
- set_exchandler_grx();
-
- for (i=0; i<NMouses; i++)
- Mouse[i].Flag=0;
- for (i=0; i<(360+90); i++) // Inicializar a tabela de senos
- Seno[i]=(int)(65536.0*sin((float)i/180.0*PI));
-
- for (i=0; i<180; i++) // Inicializar a tabela de tangente
- if (i!=90)
- Tang[i]=(int)(((float)Seno[i]/(float)Seno[i+90])*65536.0);
- else
- Tang[i]=INT_MAX;
-
- // Definir fun‡Æo de saida
- sys_atrunlevel(my_end, (void *)NULL, RUNLEVEL_BEFORE_EXIT);
-
- hard_task_default_model(mp);
- hard_task_def_usemath(mp);
- hard_task_def_group(mp, MOUSEGROUP);
- hard_task_def_wcet(mp, 1); // wcet ignored by the configuration file!
-
- soft_task_default_model(ms);
- soft_task_def_group(ms, MOUSEGROUP);
- soft_task_def_met(ms, 1000);
-
- for (i=0;i<NMouses;i++)
- {
- hard_task_def_arg(mp, (void *)i);
- soft_task_def_arg(ms, (void *)i);
-
- hard_task_def_mit(mp, MOUSE_PERIOD);
- pid = task_create("Mouse", MouseTask, &mp, NULL);
- if (pid == NIL)
- {
- perror("Creating Mouse:");
- sys_end();
- }
-
- hard_task_def_mit(mp, CALC_PERIOD);
- pid = task_create("Calc", Calculate_Position, &mp, NULL);
- if (pid == NIL)
- {
- perror("Creating Calc:");
- sys_end();
- }
-
- soft_task_def_period(ms, REDRAW_MOUSE_PERIOD);
- pid = task_create("Redraw_Mouse", Redraw_Mouse_Task, &ms, NULL);
- if (pid == NIL)
- {
- perror("Creating Redraw_Moude:");
- sys_end();
- }
- }
-
- hard_task_def_mit(mp, REFEREE_PERIOD);
- pid = task_create("Referee1", Referee, &mp, NULL);
-
- hard_task_def_mit(mp, REDRAW_MAZE_PERIOD);
- pid = task_create("Redraw_Maze", Redraw_Maze_Task, &mp, NULL);
-
- grx_open(640,480,8);
- group_activate(MOUSEGROUP);
- do
- {
- c = keyb_getch(BLOCK);
- } while (c != ESC);
-
- task_nopreempt();
- sys_end();
- return 0;
-}
-
-/* the buffer b is scannedc to search for numbers
- at the first non-number the function stops */
-void geti(char *b, int *pos, int *res)
-{
- // skip first chars
- while (!isdigit(b[*pos]))
- (*pos)++;
-
-
- // read the numbers
- *res = 0;
- do {
- *res = (*res * 10) + b[*pos] - '0';
- (*pos)++;
- } while (isdigit(b[*pos]));
-}
-
-void read_cfg_file(int argc, char **argv)
-{
- int i, err, Temp1, Temp2, Temp3, Temp4, Temp5;
- DOS_FILE *fp;
- char myfilebuf[1000];
- int myfilebuf_length;
-
- int pos = 0;
-
- if (argc==2) {
- fp = DOS_fopen(argv[1],"r");
-
- if (fp) {
- /* read up to 1000 chars */
- myfilebuf_length = DOS_fread(&myfilebuf,1,1000,fp);
-
- /* check for errors */
- err = DOS_error();
-
- cprintf("Read %d bytes...\n", myfilebuf_length);
-
- if (err) {
- cprintf("Error %d reading file...Using default values\n", err);
- }
- else
- {
- geti(myfilebuf, &pos, &NMouses); // Number of Mouses
- for (i=0;i<NMouses;i++) {
- geti(myfilebuf, &pos, &Temp1); // Mouse X coordinate
- geti(myfilebuf, &pos, &Temp2); // Mouse Y coordinate
- geti(myfilebuf, &pos, &Temp3); // Mouse radius
- geti(myfilebuf, &pos, &Temp4); // Mouse orientation
- Init_Mouse(i, Temp1, Temp2, Temp3, Temp4, 6);
- }
- geti(myfilebuf, &pos, &Temp1); // Beacon X coordinate
- geti(myfilebuf, &pos, &Temp2); // Beacon Y coordinate
- geti(myfilebuf, &pos, &Temp3); // Beacon intensity
- geti(myfilebuf, &pos, &i); // Number of boxs
- Init_Maze(Temp1, Temp2, Temp3, i);
- for(; i>0; i--) {
- geti(myfilebuf, &pos, &Temp1); // Box X1 Coordinate
- geti(myfilebuf, &pos, &Temp2); // Box Y1 Coordinate
- geti(myfilebuf, &pos, &Temp3); // Box X2 Coordinate
- geti(myfilebuf, &pos, &Temp4); // Box Y2 Coordinate
- geti(myfilebuf, &pos, &Temp5); // Type of Box
- if (Temp5)
- Init_Box(i-1, Temp1, Temp2, Temp3, Temp4, BOX_BLOCK);
- else
- Init_Box(i-1, Temp1, Temp2, Temp3, Temp4, BOX_NON_BLOCK);
- }
- DOS_fclose(fp);
- return;
- }
- }
- else {
- /* error!! */
- err = DOS_error();
- /* note that if you call DOS_error() here, it return 0!!! */
- cprintf("Error %d opening myfile.txt...Using default values\n", err);
- }
-
- // Default value if no file is passed
- NMouses=2;
- Init_Maze(500, 350, 400, 1);
- Init_Box(0, 200, 200, 300, 250, BOX_NON_BLOCK);
- Init_Mouse(0, 100, 100, 15, 45, 6);
- Init_Mouse(1, 100, 150, 15, 90, 6);
- }
- else {
- cprintf("Wrong number of arguments...\n");
- l1_exit(0);
- }
-}
Index: demos/branches/pj/robots/lab.txt
===================================================================
--- demos/branches/pj/robots/lab.txt (revision 1085)
+++ demos/branches/pj/robots/lab.txt (nonexistent)
@@ -1,10 +0,0 @@
-2
-530 380 15 270
-480 380 15 270
-380 300 400 5
-430 060 460 400 0
-350 100 430 130 0
-000 100 300 130 0
-150 200 430 230 0
-120 300 150 400 0
-
Index: demos/branches/pj/robots/readme
===================================================================
--- demos/branches/pj/robots/readme (revision 1085)
+++ demos/branches/pj/robots/readme (nonexistent)
@@ -1,9 +0,0 @@
-Robots demo
------------
-
-This demo has been developed in the University of Alveiro, Portugal.
-
-See the included PDF files for more informations.
-
-Paolo
-pj@sssup.it
Index: demos/branches/pj/robots/makefile
===================================================================
--- demos/branches/pj/robots/makefile (revision 1085)
+++ demos/branches/pj/robots/makefile (nonexistent)
@@ -1,16 +0,0 @@
-#
-#
-#
-
-ifndef BASE
-BASE=../..
-endif
-include $(BASE)/config/config.mk
-
-PROGS = mouse2
-
-include $(BASE)/config/example.mk
-
-mouse2:
- make -f $(SUBMAKE) APP=mouse2 INIT= OTHEROBJS="initfile.o" OTHERINCL=
-
Index: demos/branches/pj/robots/lab3.txt
===================================================================
--- demos/branches/pj/robots/lab3.txt (revision 1085)
+++ demos/branches/pj/robots/lab3.txt (nonexistent)
@@ -1,11 +0,0 @@
-3
-540 380 15 270
-510 380 15 270
-480 380 15 270
-380 300 400 5
-430 060 460 400 0
-350 100 430 130 0
-000 100 300 130 0
-150 200 430 230 0
-120 300 150 400 0
-
Index: demos/branches/pj/robots/initfile.c
===================================================================
--- demos/branches/pj/robots/initfile.c (revision 1085)
+++ demos/branches/pj/robots/initfile.c (nonexistent)
@@ -1,104 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: initfile.c,v 1.1.1.1 2002-09-02 09:37:43 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:43 $
- ------------
-**/
-
-/*
- * Copyright (C) 2001 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/cbs.h"
-#include "modules/rr.h"
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-#include "drivers/keyb.h"
-
-/*+ sysyem tick in us +*/
-#define TICK 0
-
-/*+ RR tick in us +*/
-#define RRTICK 2000
-
-void read_cfgfile(int);
-
-int argc;
-char *argv[100];
-
-void read_cfg_file(int argc, char **argv);
-
-int main(int argc, char **argv);
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- EDF_register_level(0);
- CBS_register_level(0, 0);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- dummy_register_level();
-
- SEM_register_module();
-
- CABS_register_module();
-
- __compute_args__(mb, &argc, argv);
-
- read_cfg_file(argc, argv);
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- KEYB_PARMS kparms = BASE_KEYB;
-
- HARTPORT_init();
-
- keyb_def_ctrlC(kparms, NULL);
- KEYB_init(&kparms);
-
- return (void *)main(argc,argv);
-}
Index: demos/branches/pj/auto/keyb.c
===================================================================
--- demos/branches/pj/auto/keyb.c (revision 1085)
+++ demos/branches/pj/auto/keyb.c (nonexistent)
@@ -1,105 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * Massimiliano Giorgi <massy@gandalf.sssup.it>
- * Luca Abeni <luca@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-
-/**
- ------------
- CVS : $Id: keyb.c,v 1.1.1.1 2002-09-02 09:37:42 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:42 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Marco Dallera and Marco Fiocca
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * AUTO
- *
- * Another Unuseful Track simulatOr
- *
- * Authors: Marco Dallera
- * Marco Fiocca
- *
- */
-
-/* ------------------ */
-/* Keyboard handler */
-/* ------------------ */
-
-#include "include/auto.h"
-#include "include/const.h"
-
-
-void keyb_handler() {
- KEY_EVT k;
- keyb_set_map(itaMap);
-
- /* Exit keys: ENTER */
- k.flag = 0;
- k.scan = KEY_ENT;
- k.ascii = 13;
- keyb_hook(k, endfun);
-
- /* Creates a new HARD car */
- k.flag = 0;
- k.scan = KEY_H;
- k.ascii = 'h';
- keyb_hook(k, hard_car_create);
-
- /* Creates a new SOFT car */
- k.flag = 0;
- k.scan = KEY_S;
- k.ascii = 's';
- keyb_hook(k, soft_car_create);
-}
-
-
-void endfun(KEY_EVT *k)
-{
- grx_close();
- cprintf("Ctrl-Brk pressed! Ending...\n");
- sys_end();
-}
-
-
-void my_close(void *arg)
-{
- kern_printf("my_close\n");
-}
-
Index: demos/branches/pj/auto/edfact.h
===================================================================
--- demos/branches/pj/auto/edfact.h (revision 1085)
+++ demos/branches/pj/auto/edfact.h (nonexistent)
@@ -1,151 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * Massimiliano Giorgi <massy@gandalf.sssup.it>
- * Luca Abeni <luca@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: edfact.h,v 1.1.1.1 2002-09-02 09:37:42 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:42 $
- ------------
-
- This file contains the server EDFACT (EDF with pending activations)
-
- Title:
- EDFACT
-
- Task Models Accepted:
- HARD_TASK_MODEL - Hard Tasks (only Periodic)
- wcet field and mit field must be != 0. They are used to set the wcet
- and period of the tasks.
- periodicity field can be only PERIODIC
- drel field is ignored
-
- Guest Models Accepted:
- JOB_TASK_MODEL - a single guest task activation
- Identified by an absolute deadline and a period.
- period field is ignored
-
- Description:
- This module schedule his tasks following the classic EDF scheme.
- The task guarantee is based on the factor utilization approach.
- The tasks scheduled are only periodic.
- All the task are put in a queue and the scheduling is based on the
- deadline value.
- NO GUARANTEE is performed on guest tasks. The guarantee must be performed
- by the level that inserts guest tasks in the EDF level.
- If a task miss a deadline a counter is incremented.
- If a task exausts the wcet a counter is incremented
- No ZOMBIE support!!!!!!
-
- Exceptions raised:
- XUNVALID_GUEST XUNVALID_TASK
- some primitives are not implemented:
- task_sleep, task_delay, guest_endcycle, guest_sleep, guest_delay
-
- XACTIVATION
- If a task is actiated through task_activate or guest_activate more than
- one time
-
- Restrictions & special features:
- - This level doesn't manage the main task.
- - At init time we have to specify:
- . guarantee check
- (when all task are created the system will check that the task_set
- will not use more than the available bandwidth)
- - A function to return the used bandwidth of the level is provided.
- - Functions to return and reset the nact, wcet and dline miss counters
-
-**/
-
-/*
- * Copyright (C) 2001 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-#ifndef __EDFACT_H__
-#define __EDFACT_H__
-
-#include <ll/ll.h>
-#include <kernel/config.h>
-#include <sys/types.h>
-#include <kernel/types.h>
-#include <modules/codes.h>
-
-
-
-
-
-
-
-
-/*+ flags... +*/
-#define EDFACT_ENABLE_GUARANTEE 1 /*+ Task Guarantee enabled +*/
-#define EDFACT_ENABLE_ALL 1
-
-#define EDFACT_FAILED_GUARANTEE 8 /*+ used in the module, unsettabl
- in EDF_register_level... +*/
-
-
-
-
-
-#define ELASTIC_HARD_PCLASS 0x0600
-
-#define EDFACT_LEVELNAME "EDFACT base"
-#define EDFACT_LEVEL_CODE 166
-#define EDFACT_LEVEL_VERSION 1
-
-
-/*+ Registration function:
- int flags Options to be used in this level instance...
-+*/
-void EDFACT_register_level(int flags);
-
-/*+ Returns the used bandwidth of a level +*/
-bandwidth_t EDFACT_usedbandwidth(LEVEL l);
-
-/*+ returns respectively the number of dline, wcet or nact; -1 if error +*/
-int EDFACT_get_dline_miss(PID p);
-int EDFACT_get_wcet_miss(PID p);
-int EDFACT_get_nact(PID p);
-
-/*+ resets respectively the number of dline, wcet miss; -1 if error +*/
-int EDFACT_reset_dline_miss(PID p);
-int EDFACT_reset_wcet_miss(PID p);
-
-#endif
-
Index: demos/branches/pj/auto/info.c
===================================================================
--- demos/branches/pj/auto/info.c (revision 1085)
+++ demos/branches/pj/auto/info.c (nonexistent)
@@ -1,154 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * Massimiliano Giorgi <massy@gandalf.sssup.it>
- * Luca Abeni <luca@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-
-/**
- ------------
- CVS : $Id: info.c,v 1.1.1.1 2002-09-02 09:37:42 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:42 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Marco Dallera and Marco Fiocca
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * AUTO
- *
- * Another Unuseful Track simulatOr
- *
- * Authors: Marco Dallera
- * Marco Fiocca
- *
- */
-
-/* ------------------- */
-/* Information panel */
-/* ------------------- */
-
-#include "include/auto.h"
-#include "include/const.h"
-#include "include/utils.h"
-
-extern sem_t grx_mutex;
-
-/* ------------------------------------------------------------------ */
-
-void bar_display(point p1, int width, int height, int border, float var, float max, int color, char *name)
-{
- int background = BLACK;
- int amp = 0;
- point p2;
-
- p2.x = p1.x + width;
- p2.y = p1.y + height;
-
- sem_wait(&grx_mutex);
-
- grx_text(name, p1.x, p1.y + height + 3, color, background);
- grx_rect(p1.x - 1, p1.y - 1, p2.x + 1, p2.y + 1, border);
-
- grx_box(p1.x, p1.y, p2.x, p2.y, BLACK);
- amp = abs(round( var * (float)(p2.x - p1.x) / max ));
- grx_box(p1.x, p1.y, p1.x + amp, p2.y, color);
-
- sem_post(&grx_mutex);
-}
-
-/* ------------------------------------------------------------------ */
-
-void bidir_bar_display(point p1, int width, int height, int border, float var, float max, int color, char *name)
-{
- int background = BLACK;
- int amp = 0;
- point p2;
-
- p2.x = p1.x + width;
- p2.y = p1.y + height;
-
- sem_wait(&grx_mutex);
-
- grx_text(name, p1.x, p1.y + height + 3, color, background);
- grx_rect(p1.x - 1, p1.y - 1, p2.x + 1, p2.y + 1, border);
-
- grx_box(p1.x, p1.y, p2.x, p2.y, BLACK);
- amp = round( var * (float)((p2.x - p1.x)/2) / max );
- if (amp >= 0)
- grx_box((p1.x+p2.x)/2, p1.y, ((p1.x+p2.x)/2)+amp, p2.y, color);
- else
- grx_box((p1.x+p2.x)/2+amp, p1.y, ((p1.x+p2.x)/2), p2.y, color);
- grx_line((p1.x+p2.x)/2, p1.y-2, (p1.x+p2.x)/2, p2.y+2, border);
-
- sem_post(&grx_mutex);
-}
-
-/* ------------------------------------------------------------------ */
-
-void cmd_display()
-{
- point p1;
-
- p1.x = TRACK_X1;
- p1.y = TRACK_Y2+3;
-
- sem_wait(&grx_mutex);
- grx_rect(p1.x, p1.y, p1.x+CMD_WIDTH, p1.y+CMD_HEIGHT, BLUE);
- grx_rect(p1.x+1, p1.y+1, p1.x+CMD_WIDTH-1, p1.y+CMD_HEIGHT-1, CYAN);
- grx_rect(p1.x+2, p1.y+2, p1.x+CMD_WIDTH-2, p1.y+CMD_HEIGHT-2, LIGHTBLUE);
- grx_text("## Another Unuseful Track simulatOr ##",
- p1.x+8, p1.y+8, YELLOW, BLACK);
- grx_text("## -------------------------------- ##",
- p1.x+8, p1.y+16, YELLOW, BLACK);
- grx_text("Marco Dallera", p1.x+8, p1.y+24, GREEN, BLACK);
- grx_text("marchicchio@libero.it", p1.x+120, p1.y+24, GREEN, BLACK);
- grx_text("Marco Fiocca", p1.x+8, p1.y+32, GREEN, BLACK);
- grx_text("marqinho@tiscalinet.it", p1.x+120, p1.y+32, GREEN, BLACK);
-
- grx_text("Command keys ", p1.x+8, p1.y+48, LIGHTBLUE, BLACK);
- grx_text("------------------------", p1.x+8, p1.y+56, LIGHTBLUE, BLACK);
- grx_text("h create a HARD car", p1.x+8, p1.y+64, CYAN, BLACK);
- grx_text("s create a SOFT car", p1.x+8, p1.y+72, CYAN, BLACK);
- grx_text("ENTER exit to DOS", p1.x+8, p1.y+80, CYAN, BLACK);
-
- sem_post(&grx_mutex);
-
-}
-
-/* ------------------------------------------------------------------ */
-
Index: demos/branches/pj/auto/makefile
===================================================================
--- demos/branches/pj/auto/makefile (revision 1085)
+++ demos/branches/pj/auto/makefile (nonexistent)
@@ -1,23 +0,0 @@
-#
-# Auto Makefile
-#
-
-ifndef BASE
-BASE=../..
-endif
-include $(BASE)/config/config.mk
-
-PROGS= auto auto2 auto3
-
-include $(BASE)/config/example.mk
-
-auto:
- make -f $(SUBMAKE) APP=auto INIT= OTHEROBJS="initfil1.o sensor.o control.o keyb.o info.o utils.o tracks.o jetctrl.o"
-
-auto2:
- make -f $(SUBMAKE) APP=auto INIT= OTHEROBJS="initfil2.o sensor.o control.o keyb.o info.o utils.o tracks.o jetctrl.o"
-
-auto3:
- make -f $(SUBMAKE) APP=auto INIT= OTHEROBJS="initfil3.o sensor.o control.o keyb.o info.o utils.o tracks.o edfact.o jetctrl.o"
-
-
Index: demos/branches/pj/auto/utils.c
===================================================================
--- demos/branches/pj/auto/utils.c (revision 1085)
+++ demos/branches/pj/auto/utils.c (nonexistent)
@@ -1,131 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * Massimiliano Giorgi <massy@gandalf.sssup.it>
- * Luca Abeni <luca@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-
-/**
- ------------
- CVS : $Id: utils.c,v 1.1.1.1 2002-09-02 09:37:42 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:42 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Marco Dallera and Marco Fiocca
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * AUTO
- *
- * Another Unuseful Track simulatOr
- *
- * Authors: Marco Dallera
- * Marco Fiocca
- *
- */
-
-#include "include/auto.h"
-#include "include/utils.h"
-#include <string.h>
-#include <stdlib.h>
-
-float rand_01()
-{
- return (((float)(rand()%20) / 100.0) + 0.8);
-}
-
-int rand_color()
-{
- return (rand()%16);
-}
-
-int round(float value)
-{
- return ((int)(value + 0.5));
-}
-
-void reverse(char s[]) {
- int c, i, j;
-
- for (i = 0, j = strlen(s)-1; i<j; i++, j--) {
- c = s[i];
- s[i] = s[j];
- s[j] = c;
- }
-}
-
-char * itoa(int n, char *s) {
- int i, sign;
-
- if ((sign = n) < 0)
- n = -n;
- i = 0;
-
- do {
- s[i++] = n % 10 + '0';
- } while ((n /= 10) > 0);
-
- if (sign < 0)
- s[i++] = '-';
- s[i] = 0;
-
- reverse(s);
-
- return s;
-}
-
-time int2time(int t)
-{
- time ts;
-
- ts.dec = t % 10;
- ts.sec = (t/10) % 60;
- ts.min = (int)(t / 600);
-
- return ts;
-}
-
-
-
-
-
-
-
-
-
-
-
Index: demos/branches/pj/auto/include/utils.h
===================================================================
--- demos/branches/pj/auto/include/utils.h (revision 1085)
+++ demos/branches/pj/auto/include/utils.h (nonexistent)
@@ -1,76 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * Massimiliano Giorgi <massy@gandalf.sssup.it>
- * Luca Abeni <luca@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-
-/**
- ------------
- CVS : $Id: utils.h,v 1.1.1.1 2002-09-02 09:37:42 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:42 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Marco Dallera and Marco Fiocca
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * AUTO
- *
- * Another Unuseful Track simulatOr
- *
- * Authors: Marco Dallera
- * Marco Fiocca
- *
- */
-
-/* ------------------ */
-/* Useful functions */
-/* ------------------ */
-
-#ifndef __UTILS_H_
-
-#define __UTILS_H_
-
-float rand_01();
-int rand_color();
-int round(float value);
-char * itoa(int n, char *s);
-void reverse(char s[]);
-time int2time(int t);
-
-#endif
Index: demos/branches/pj/auto/include/const.h
===================================================================
--- demos/branches/pj/auto/include/const.h (revision 1085)
+++ demos/branches/pj/auto/include/const.h (nonexistent)
@@ -1,141 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * Massimiliano Giorgi <massy@gandalf.sssup.it>
- * Luca Abeni <luca@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-
-/**
- ------------
- CVS : $Id: const.h,v 1.1.1.1 2002-09-02 09:37:42 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:42 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Marco Dallera and Marco Fiocca
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * AUTO
- *
- * Another Unuseful Track simulatOr
- *
- * Authors: Marco Dallera
- * Marco Fiocca
- *
- */
-
-/* ------------------ */
-/* Useful constants */
-/* ------------------ */
-
-#ifndef __CONST_H_
-
-#define __CONST_H_
-
-/* Screen dimensions */
-#define SCREEN_WIDTH 800
-#define SCREEN_HEIGHT 600
-#define SCREEN_BIT_COLORS 8
-
-/* Visible area */
-#define TEL_WIDTH 50
-#define TEL_HEIGHT 50
-
-/* Car dimensions */
-#define CAR_WIDTH 12
-#define CAR_HEIGHT 12
-#define CAR_W 8
-#define CAR_H 10
-
-/* Track dimensions */
-#define TRACK_WIDTH 500
-#define TRACK_HEIGHT 500
-
-/* Track position */
-#define TRACK_X1 0
-#define TRACK_Y1 0
-#define TRACK_X2 TRACK_X1+TRACK_WIDTH-1
-#define TRACK_Y2 TRACK_Y1+TRACK_HEIGHT-1
-
-/* Max number of car on track */
-#define MAX_CAR_NUMBER 10
-#define DRIVERS_NUMBER 20
-#define MAX_DRIVER_NAME_LENGTH 20
-#define MAX_TRACK_NAME_LENGTH 20
-#define TRACK_NUMBER 4
-
-/* Lap direction */
-#define CLOCK 0
-#define ANTICLOCK 1
-
-/* Information display coords */
-#define CMD_WIDTH TRACK_WIDTH
-#define CMD_HEIGHT (SCREEN_HEIGHT-TRACK_HEIGHT-3)
-
-/* Car position limits */
-#define MIN_CAR_X (TRACK_X1 + CAR_WIDTH/2 + 4)
-#define MIN_CAR_Y (TRACK_Y1 + CAR_HEIGHT/2 + 4)
-#define MAX_CAR_X (TRACK_X2 - CAR_WIDTH/2 - 4)
-#define MAX_CAR_Y (TRACK_Y2 - CAR_HEIGHT/2 - 4)
-
-/* Road constants */
-#define LEFT_ONLY 10
-#define RIGHT_ONLY 11
-#define ROAD_OK 12
-#define NO_ROAD 13
-
-/* Collision constants */
-#define COLLISION_LEFT 20
-#define COLLISION_RIGHT 21
-#define COLLISION_BACK 22
-#define NO_COLL 0
-
-/* CAB constants */
-#define ROAD_MSG_DIM sizeof(road_info)
-#define ROAD_MSG_READER 4
-
-#define CAR_MSG_DIM sizeof(car_status)
-#define CAR_MSG_READER 5
-
-/* Tasks parameters */
-#define SENSOR_WCET 3000
-#define SENSOR_PERIOD 40000
-#define CONTROL_WCET 1000
-#define CONTROL_PERIOD 40000
-
-#endif
-
Index: demos/branches/pj/auto/include/auto.h
===================================================================
--- demos/branches/pj/auto/include/auto.h (revision 1085)
+++ demos/branches/pj/auto/include/auto.h (nonexistent)
@@ -1,188 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * Massimiliano Giorgi <massy@gandalf.sssup.it>
- * Luca Abeni <luca@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-
-/**
- ------------
- CVS : $Id: auto.h,v 1.1.1.1 2002-09-02 09:37:42 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:42 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Marco Dallera and Marco Fiocca
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * AUTO
- *
- * Another Unuseful Track simulatOr
- *
- * Authors: Marco Dallera
- * Marco Fiocca
- *
- */
-
-/* ------------------- */
-/* Useful structures */
-/* ------------------- */
-
-#ifndef __CAR_H_
-
-#define __CAR_H_
-
-#include <modules/cabs.h>
-#include <kernel/func.h>
-#include <kernel/model.h>
-#include <kernel/types.h>
-#include <drivers/keyb.h>
-#include <drivers/glib.h>
-#include <semaphore.h>
-#include <math.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include "const.h"
-
-#define degree_to_rad(a) ((M_PI/180.0)*(a))
-#define rad_to_degree(a) ((180.0/M_PI)*(a))
-
-typedef struct {
- int x;
- int y;
-} point;
-
-typedef struct {
- float x,y;
-} point_f;
-
-typedef struct {
- float mod;
- float phase;
-} vector;
-
-typedef struct {
- point_f pos;
- float orient;
-} car_status;
-
-typedef struct {
- int left_border;
- int right_border;
- int distance;
- float curve;
- point opps_list[MAX_CAR_NUMBER];
- int opps_number;
- int collision;
- int flag;
-} road_info;
-
-typedef struct {
- int left,center,right;
-} road_strip;
-
-typedef struct {
- PID sensor_pid,control_pid;
- int number;
- char driver[MAX_DRIVER_NAME_LENGTH];
- float max_speed, min_acc, max_acc;
- float rage;
- CAB road_status_cab;
- CAB car_status_cab;
- int color;
-} car_params;
-
-typedef struct {
- char name[MAX_TRACK_NAME_LENGTH]; // il nome del file
- point pole_pos; // la posizione di partenza
- float pole_orient; // la direzione di partenza
- int lap; // il senso di marcia: CLOCK, ANTICLOCK
- int selected; // it's a flag marking the actually selected track
-} track;
-
-typedef struct {
- int min;
- int sec;
- int dec;
-} time;
-
-extern car_params cars[MAX_CAR_NUMBER];
-extern char track_img[TRACK_WIDTH*TRACK_HEIGHT];
-extern track track_list[TRACK_NUMBER];
-
-/* ---------------------------------------- */
-/* Functions definition */
-/* ---------------------------------------- */
-
-/* CABs R/W functions */
-int set_car_status(car_status, CAB); // sends the new status according to the control law
-car_status get_car_status(CAB); // reads car status from a CAB
-int set_road_info(road_info, CAB); // sends the new road informations
-road_info get_road_info(CAB); // reads road status values from a CAB
-
-/* Keyboard functions */
-void keyb_handler();
-void endfun(KEY_EVT *);
-void my_close(void *);
-
-/* Display functions */
-void bar_display(point p1, int width, int height, int border, float var, float max, int color, char *name);
-void bidir_bar_display(point p1, int width, int height, int border, float var, float max, int color, char *name);
-void cmd_display();
-
-/* Closing function */
-void byebye();
-void error_msg();
-
-/* Tasks */
-TASK sensor(); // Camera car task
-TASK control(); // Car controller task
-TASK manual(); // Manual driving task
-TASK actuator(); // Graphic drawing task
-TASK info(); // Car informations display task
-
-/* Tasks management */
-void hard_car_create();
-void soft_car_create();
-void killcar();
-
-/* Tracks management */
-int track_init();
-
-#endif
-
Index: demos/branches/pj/auto/tracks/brazil.raw
===================================================================
--- demos/branches/pj/auto/tracks/brazil.raw (revision 1085)
+++ demos/branches/pj/auto/tracks/brazil.raw (nonexistent)
@@ -1,2 +0,0 @@
- -!"#
\ No newline at end of file
Index: demos/branches/pj/auto/tracks/demo1.raw
===================================================================
--- demos/branches/pj/auto/tracks/demo1.raw (revision 1085)
+++ demos/branches/pj/auto/tracks/demo1.raw (nonexistent)
@@ -1 +0,0 @@
-
\ No newline at end of file
Index: demos/branches/pj/auto/tracks/demo2.raw
===================================================================
--- demos/branches/pj/auto/tracks/demo2.raw (revision 1085)
+++ demos/branches/pj/auto/tracks/demo2.raw (nonexistent)
@@ -1 +0,0 @@
-
\ No newline at end of file
Index: demos/branches/pj/auto/tracks/monaco.raw
===================================================================
--- demos/branches/pj/auto/tracks/monaco.raw (revision 1085)
+++ demos/branches/pj/auto/tracks/monaco.raw (nonexistent)
@@ -1 +0,0 @@
-
\ No newline at end of file
Index: demos/branches/pj/auto/jetctrl.c
===================================================================
--- demos/branches/pj/auto/jetctrl.c (revision 1085)
+++ demos/branches/pj/auto/jetctrl.c (nonexistent)
@@ -1,155 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: jetctrl.c,v 1.1.1.1 2002-09-02 09:37:42 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:42 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * this file is directly derived from the demos/jumpball/jetctrl.c .
- * I just added this controls to check when the system will become overloaded
- */
-
-#define WCET_JETDUMMY 200
-#define PERIOD_JETDUMMY 100000
-#define DUMMY_PID 1
-
-#define JET_DUMMY_WIDTH (CMD_WIDTH-370)
-#define JET_DUMMY_HEIGHT (CMD_HEIGHT-40)
-
-/* the point (x, y) is the top left corner */
-#define JET_DUMMY_X (TRACK_X1+360)
-#define JET_DUMMY_Y (TRACK_Y2+32)
-
-// JetControl
-
-#include "semaphore.h"
-#include "include/const.h"
-#include "kernel/func.h"
-#include "drivers/glib.h"
-
-extern sem_t grx_mutex;
-
-/* useful colors... */
-int white;
-int black;
-extern int red;
-extern int lightgray;
-
-TASK jetdummy_task(void *arg)
-{
- TIME now_dummy, last_dummy, diff_dummy, slice;
- struct timespec now, last, diff;
- int x = 0;
- int height;
-
- NULL_TIMESPEC(&last);
- last_dummy = 0;
- for (;;) {
- task_nopreempt();
- jet_getstat(DUMMY_PID, NULL, NULL, NULL, &now_dummy);
- sys_gettime(&now);
- task_preempt();
-
- SUBTIMESPEC(&now, &last, &diff);
- slice = diff.tv_sec * 1000000 + diff.tv_nsec/1000;
- diff_dummy = now_dummy - last_dummy;
-
- height = (int)(JET_DUMMY_HEIGHT*((float)diff_dummy)/((float)slice));
-
- TIMESPEC_ASSIGN(&last, &now);
- last_dummy = now_dummy;
-
- sem_wait(&grx_mutex);
- grx_line(JET_DUMMY_X+x,JET_DUMMY_Y,
- JET_DUMMY_X+x,JET_DUMMY_Y+height ,black);
- grx_line(JET_DUMMY_X+x,JET_DUMMY_Y+height,
- JET_DUMMY_X+x,JET_DUMMY_Y+JET_DUMMY_HEIGHT,white);
- grx_line(JET_DUMMY_X+(x+1)%JET_DUMMY_WIDTH,JET_DUMMY_Y,
- JET_DUMMY_X+(x+1)%JET_DUMMY_WIDTH,JET_DUMMY_Y+JET_DUMMY_HEIGHT,255);
- sem_post(&grx_mutex);
-
- x = (x+1)%JET_DUMMY_WIDTH;
-
- task_endcycle();
- }
-}
-
-void init_jetcontrol(void)
-{
- SOFT_TASK_MODEL m4;
-
- PID p4;
-
- /* useful colors ... */
- white = WHITE;
- black = BLACK;
-
- /* scenario */
- sem_wait(&grx_mutex);
- grx_text("System load",
- JET_DUMMY_X+8, JET_DUMMY_Y-10, lightgray, black);
- grx_rect(JET_DUMMY_X-1, JET_DUMMY_Y-1,
- JET_DUMMY_X+JET_DUMMY_WIDTH, JET_DUMMY_Y+JET_DUMMY_HEIGHT+1, lightgray);
-
- grx_text("100%", JET_DUMMY_X-40, JET_DUMMY_Y, lightgray, black);
- grx_text(" 0%", JET_DUMMY_X-40, JET_DUMMY_Y+JET_DUMMY_HEIGHT-8, lightgray, black);
-
- grx_line(JET_DUMMY_X-1, JET_DUMMY_Y, JET_DUMMY_X-5, JET_DUMMY_Y, lightgray);
- grx_line(JET_DUMMY_X-1, JET_DUMMY_Y+JET_DUMMY_HEIGHT, JET_DUMMY_X-5, JET_DUMMY_Y+JET_DUMMY_HEIGHT, lightgray);
- sem_post(&grx_mutex);
-
- /* jetdummy task */
- soft_task_default_model(m4);
- soft_task_def_period(m4, PERIOD_JETDUMMY);
- soft_task_def_met(m4, WCET_JETDUMMY);
- soft_task_def_usemath(m4);
- p4 = task_create("jdmy", jetdummy_task, &m4, NULL);
- if (p4 == -1) {
- grx_close();
- perror("Could not create task <jetdummy>");
- sys_end();
- }
- task_activate(p4);
-}
-
Index: demos/branches/pj/auto/cars/car0.raw
===================================================================
--- demos/branches/pj/auto/cars/car0.raw (revision 1085)
+++ demos/branches/pj/auto/cars/car0.raw (nonexistent)
@@ -1 +0,0 @@
-
\ No newline at end of file
Index: demos/branches/pj/auto/cars/car1.raw
===================================================================
--- demos/branches/pj/auto/cars/car1.raw (revision 1085)
+++ demos/branches/pj/auto/cars/car1.raw (nonexistent)
@@ -1 +0,0 @@
-
\ No newline at end of file
Index: demos/branches/pj/auto/cars/car2.raw
===================================================================
--- demos/branches/pj/auto/cars/car2.raw (revision 1085)
+++ demos/branches/pj/auto/cars/car2.raw (nonexistent)
@@ -1 +0,0 @@
-
\ No newline at end of file
Index: demos/branches/pj/auto/cars/car3.raw
===================================================================
--- demos/branches/pj/auto/cars/car3.raw (revision 1085)
+++ demos/branches/pj/auto/cars/car3.raw (nonexistent)
@@ -1 +0,0 @@
-
\ No newline at end of file
Index: demos/branches/pj/auto/cars/car4.raw
===================================================================
--- demos/branches/pj/auto/cars/car4.raw (revision 1085)
+++ demos/branches/pj/auto/cars/car4.raw (nonexistent)
@@ -1 +0,0 @@
-
\ No newline at end of file
Index: demos/branches/pj/auto/cars/car5.raw
===================================================================
--- demos/branches/pj/auto/cars/car5.raw (revision 1085)
+++ demos/branches/pj/auto/cars/car5.raw (nonexistent)
@@ -1 +0,0 @@
-
\ No newline at end of file
Index: demos/branches/pj/auto/cars/car6.raw
===================================================================
--- demos/branches/pj/auto/cars/car6.raw (revision 1085)
+++ demos/branches/pj/auto/cars/car6.raw (nonexistent)
@@ -1 +0,0 @@
-
\ No newline at end of file
Index: demos/branches/pj/auto/cars/car7.raw
===================================================================
--- demos/branches/pj/auto/cars/car7.raw (revision 1085)
+++ demos/branches/pj/auto/cars/car7.raw (nonexistent)
@@ -1 +0,0 @@
-
\ No newline at end of file
Index: demos/branches/pj/auto/cars/boom.raw
===================================================================
--- demos/branches/pj/auto/cars/boom.raw (revision 1085)
+++ demos/branches/pj/auto/cars/boom.raw (nonexistent)
@@ -1 +0,0 @@
-      
\ No newline at end of file
Index: demos/branches/pj/auto/cars/car8.raw
===================================================================
--- demos/branches/pj/auto/cars/car8.raw (revision 1085)
+++ demos/branches/pj/auto/cars/car8.raw (nonexistent)
@@ -1 +0,0 @@
-
\ No newline at end of file
Index: demos/branches/pj/auto/cars/car9.raw
===================================================================
--- demos/branches/pj/auto/cars/car9.raw (revision 1085)
+++ demos/branches/pj/auto/cars/car9.raw (nonexistent)
@@ -1 +0,0 @@
-
\ No newline at end of file
Index: demos/branches/pj/auto/cars/car10.raw
===================================================================
--- demos/branches/pj/auto/cars/car10.raw (revision 1085)
+++ demos/branches/pj/auto/cars/car10.raw (nonexistent)
@@ -1 +0,0 @@
-
\ No newline at end of file
Index: demos/branches/pj/auto/cars/fumo.raw
===================================================================
--- demos/branches/pj/auto/cars/fumo.raw (revision 1085)
+++ demos/branches/pj/auto/cars/fumo.raw (nonexistent)
@@ -1 +0,0 @@
-!!!!!!!!!!!!!!!!!!!!!!
\ No newline at end of file
Index: demos/branches/pj/auto/cars/car11.raw
===================================================================
--- demos/branches/pj/auto/cars/car11.raw (revision 1085)
+++ demos/branches/pj/auto/cars/car11.raw (nonexistent)
@@ -1 +0,0 @@
-
\ No newline at end of file
Index: demos/branches/pj/auto/cars/car12.raw
===================================================================
--- demos/branches/pj/auto/cars/car12.raw (revision 1085)
+++ demos/branches/pj/auto/cars/car12.raw (nonexistent)
@@ -1 +0,0 @@
-
\ No newline at end of file
Index: demos/branches/pj/auto/cars/car13.raw
===================================================================
--- demos/branches/pj/auto/cars/car13.raw (revision 1085)
+++ demos/branches/pj/auto/cars/car13.raw (nonexistent)
@@ -1 +0,0 @@
-
\ No newline at end of file
Index: demos/branches/pj/auto/cars/car14.raw
===================================================================
--- demos/branches/pj/auto/cars/car14.raw (revision 1085)
+++ demos/branches/pj/auto/cars/car14.raw (nonexistent)
@@ -1 +0,0 @@
-
\ No newline at end of file
Index: demos/branches/pj/auto/cars/car15.raw
===================================================================
--- demos/branches/pj/auto/cars/car15.raw (revision 1085)
+++ demos/branches/pj/auto/cars/car15.raw (nonexistent)
@@ -1 +0,0 @@
-
\ No newline at end of file
Index: demos/branches/pj/auto/auto.c
===================================================================
--- demos/branches/pj/auto/auto.c (revision 1085)
+++ demos/branches/pj/auto/auto.c (nonexistent)
@@ -1,533 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * Massimiliano Giorgi <massy@gandalf.sssup.it>
- * Luca Abeni <luca@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-
-/**
- ------------
- CVS : $Id: auto.c,v 1.1.1.1 2002-09-02 09:37:42 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:42 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Marco Dallera and Marco Fiocca
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * AUTO
- *
- * Another Unuseful Track simulatOr
- *
- * Authors: Marco Dallera
- * Marco Fiocca
- *
- */
-
-#include "include/auto.h"
-#include "include/const.h"
-#include "include/utils.h"
-
-int car_number;
-car_params cars[MAX_CAR_NUMBER];
-char drivers[DRIVERS_NUMBER][MAX_DRIVER_NAME_LENGTH] = {
- "M.Schumacher",
- "D.Coulthard",
- "R.Schumacher",
- "M.Hakkinen",
- "R.Barrichello",
- "J.P.Montoya",
- "E.Irvine",
- "J.Trulli",
- "H.Frentzen",
- "J.Villeneuve",
- "J.Alesi",
- "G.Fisichella",
- "O.Panis",
- "O.Wurz",
- "J.Button",
- "P.P.Diniz",
- "P.De La Rosa",
- "T.Marques",
- "R.Zonta",
- "G.Mazzacane"
-};
-
-extern char sprite[18][CAR_WIDTH*CAR_HEIGHT];
-
-/* Semaphores */
-sem_t grx_mutex;
-
-/* Useful colors */
-int red = rgb16(255, 0, 0);
-int green = rgb16( 0, 255, 0);
-int blue = rgb16( 0, 0, 255);
-int lightgray = rgb16(192, 192, 192);
-
-/* JetCTRL Initialization */
-void init_jetcontrol(void);
-
-/* -------------------------------------------------------*/
-
-/* --------------------- */
-/* Handling car status */
-/* --------------------- */
-
-int set_car_status(car_status cs, CAB cab_id) {
- char *msg;
-
- msg = cab_reserve(cab_id);
- memcpy(msg, &cs, CAR_MSG_DIM);
- return(cab_putmes(cab_id, msg));
-}
-
-car_status get_car_status(CAB cab_id) {
- char *msg;
- car_status status;
-
- msg = cab_getmes(cab_id);
- memcpy(&status, msg, CAR_MSG_DIM);
- cab_unget(cab_id, msg);
-
- return (status);
-}
-
-/* ---------------------------- */
-/* Handling road informations */
-/* ---------------------------- */
-
-int set_road_info(road_info info, CAB road_status_cab) {
- char *msg;
-
- msg = cab_reserve(road_status_cab);
- memcpy(msg, &info, ROAD_MSG_DIM);
- return(cab_putmes(road_status_cab, msg));
-}
-
-road_info get_road_info(CAB road_status_cab) {
- char *msg;
- road_info info;
-
- msg = cab_getmes(road_status_cab);
- memcpy(&info, msg, ROAD_MSG_DIM);
- cab_unget(road_status_cab, msg);
-
- return (info);
-}
-
-/* -------------------------------------------------------*/
-
-/* Closing function */
-void byebye()
-{
- grx_close();
-
- // we need clear to reposition the cursor in the right place after
- // going back from the graphical mode.
- clear();
-
- kern_printf("Race is over!\n");
-}
-
-/* -------------------------------------------------------*/
-
-/* ------------------- */
-/* Hard car creation */
-/* ------------------- */
-
-void hard_car_create() {
- car_params cp;
- HARD_TASK_MODEL sensor_m, control_m;
- PID sensor_pid, control_pid;
- TIME seed; /* used to init the random seed */
- int drv_ind;
-
- if (car_number >= MAX_CAR_NUMBER) return;
-
- /* Randomize!!!! */
- seed = sys_gettime(NULL);
- srand(seed);
-
- /* CAB creation */
- cp.road_status_cab = cab_create("road_cab", ROAD_MSG_DIM, ROAD_MSG_READER);
- cp.car_status_cab = cab_create("car_cab", CAR_MSG_DIM, CAR_MSG_READER);
-
- /* Car parameters initialization */
- cp.max_speed = rand_01();
- cp.min_acc = cp.max_speed;
- cp.max_acc = cp.max_speed;
- cp.rage = cp.max_speed;
- cp.color = 3+car_number;
- cp.number = car_number;
- drv_ind = DRIVERS_NUMBER-1 - (int)(((cp.rage-0.8+0.005) * (float)DRIVERS_NUMBER) / 0.2);
-
- /* Sets driver's name without duplications */
- strcpy(cp.driver, drivers[drv_ind]);
- while (!strcmp(cp.driver,"***"))
- strcpy(cp.driver, drivers[++drv_ind%DRIVERS_NUMBER]);
- strcpy(drivers[drv_ind],"***");
-
- cars[car_number] = cp;
-
- /* ------------ */
- /* Task Calls */
- /* ------------ */
-
- /* sensor task creation */
- hard_task_default_model(sensor_m);
-
- hard_task_def_arg(sensor_m, (void *)car_number);
- hard_task_def_wcet(sensor_m, SENSOR_WCET);
- hard_task_def_mit(sensor_m, SENSOR_PERIOD);
- hard_task_def_usemath(sensor_m);
- sensor_pid = task_create("camera", sensor, &sensor_m, NULL);
- if(sensor_pid == -1)
- sys_end();
-
- /* control task creation */
- hard_task_default_model(control_m);
- hard_task_def_arg(control_m, (void *)car_number);
- hard_task_def_wcet(control_m, CONTROL_WCET);
- hard_task_def_mit(control_m, CONTROL_PERIOD);
- hard_task_def_usemath(control_m);
- control_pid = task_create("controller", control, &control_m, NULL);
- if(control_pid == -1)
- sys_end();
-
- cars[car_number].sensor_pid = sensor_pid;
- cars[car_number].control_pid = control_pid;
- car_number++; // increases cars number
-
- task_activate(sensor_pid);
- task_activate(control_pid);
-}
-
-/* -------------------------------------------------------*/
-
-/* ------------------- */
-/* Soft car creation */
-/* ------------------- */
-
-void soft_car_create() {
- car_params cp;
- SOFT_TASK_MODEL sensor_m, control_m;
- PID sensor_pid, control_pid;
- TIME seed; /* used to init the random seed */
- int drv_ind;
-
- if (car_number >= MAX_CAR_NUMBER) return;
-
- /* Randomize!!!! */
- seed = sys_gettime(NULL);
- srand(seed);
-
- /* CAB creation */
- cp.road_status_cab = cab_create("road_cab", ROAD_MSG_DIM, ROAD_MSG_READER);
- cp.car_status_cab = cab_create("car_cab", CAR_MSG_DIM, CAR_MSG_READER);
-
- /* Car parameters initialization */
- cp.max_speed = rand_01();
- cp.min_acc = cp.max_speed;
- cp.max_acc = cp.max_speed;
- cp.rage = cp.max_speed;
- cp.color = 8+car_number;
- cp.number = car_number;
- drv_ind = DRIVERS_NUMBER-1 - (int)(((cp.rage-0.8+0.005) * (float)DRIVERS_NUMBER) / 0.2);
-
- /* Sets driver's name without duplications */
- strcpy(cp.driver, drivers[drv_ind]);
- while (!strcmp(cp.driver,"***"))
- strcpy(cp.driver, drivers[++drv_ind%DRIVERS_NUMBER]);
- strcpy(drivers[drv_ind],"***");
- cars[car_number] = cp;
-
- /* ------------ */
- /* Task Calls */
- /* ------------ */
-
- /* sensor task creation */
- soft_task_default_model(sensor_m);
-
- soft_task_def_arg(sensor_m, (void *)car_number);
- soft_task_def_met(sensor_m, SENSOR_WCET);
- soft_task_def_period(sensor_m, SENSOR_PERIOD);
- soft_task_def_usemath(sensor_m);
- sensor_pid = task_create("camera", sensor, &sensor_m, NULL);
- if(sensor_pid == -1)
- sys_end();
-
- /* control task creation */
- soft_task_default_model(control_m);
- soft_task_def_arg(control_m, (void *)car_number);
- soft_task_def_met(control_m, CONTROL_WCET);
- soft_task_def_period(control_m, CONTROL_PERIOD);
- soft_task_def_usemath(control_m);
- control_pid = task_create("controller", control, &control_m, NULL);
- if(control_pid == -1)
- sys_end();
-
- cars[car_number].sensor_pid = sensor_pid;
- cars[car_number].control_pid = control_pid;
- car_number++; // increases cars number
-
- task_activate(sensor_pid);
- task_activate(control_pid);
-}
-
-/* -------------------------------------------------------*/
-
-/* ------------------- */
-/* The main function */
-/* ------------------- */
-
-int main(int argc, char **argv) {
- TIME seed; /* used to init the random seed */
-
- if (MAX_CAB < 30) {
- cprintf("The application needs at least 30 CABS.\n"
- "Please set the MAX_CAB #define to 30 or more...\n"
- "...(see include/modules/cabs.h)\n");
- sys_end();
- }
-
- /* Set the exception handler */
- set_exchandler_grx();
-
- /* Set the closing function */
- sys_atrunlevel(byebye, NULL, RUNLEVEL_BEFORE_EXIT);
-
- /* Keyboard handling */
- keyb_handler();
- kern_printf("KEYBOARD initialized...\n");
-
- /* Graphics mutex */
- sem_init(&grx_mutex, 0, 1);
-
- /* Graphics init */
- grx_init();
- grx_open(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BIT_COLORS);
-
- /* Track drawing */
- sem_wait(&grx_mutex);
- grx_setcolor(46,0,0,0);
- grx_setcolor(43,255,255,255);
- grx_setcolor(26,255,74,33);
- grx_setcolor(27,255,255,255);
- grx_setcolor(1,8,8,8);
- grx_setcolor(3,255,0,0);
- grx_setcolor(28,255,50,0);
- grx_setcolor(29,255,90,0);
- grx_setcolor(30,255,130,0);
- grx_setcolor(31,255,170,0);
- grx_setcolor(32,255,210,0);
- grx_setcolor(33,48,48,48);
-
- grx_putimage(TRACK_X1, TRACK_Y1, TRACK_X2, TRACK_Y2, track_img);
- sem_post(&grx_mutex);
-
- /* Command and info display */
- cmd_display();
-
- /* JetCTRL Initialization */
- init_jetcontrol();
-
- /* Randomize!!!! */
- seed = sys_gettime(NULL);
- srand(seed);
-
- car_number = 0;
-
- /* ------------ */
- /* Task Calls */
- /* ------------ */
-
- hard_car_create();
-
- return 0;
-}
-
-/* -------------------------------------------------------*/
-
-void read_track(int i)
-{
- DOS_FILE *f; // DOS file descriptor
- int file_length;
- int index;
- char filename[100];
- int err; // Error code
-
- /* Init track_list */
- track_init();
-
- /* Set the selected track from track_list */
- if (i < TRACK_NUMBER)
- index = i;
- else
- index = 0;
- cprintf("Selected index = %d\n", index);
-
- strcpy(filename, strcat("tracks/", track_list[index].name));
- cprintf("File to open = %s\n", filename);
- track_list[index].selected = 1;
-
- /* open the DOS file for reading (you can specify only "r" or "w") */
- f = DOS_fopen(filename,"r");
-
- /* check for open errors */
- if (!f) {
- err = DOS_error(); // error!!
-
- /* note that if you call DOS_error() here, it return 0!!! */
- cprintf("Error %d opening %s...\n", err, filename);
- file_length = 0;
- byebye();
- return;
- }
-
- /* read track file */
- file_length = DOS_fread(&track_img, 1, TRACK_WIDTH*TRACK_HEIGHT, f);
-
- /* check for errors */
- err = DOS_error();
-
- cprintf("Read %d bytes from %s...\n", file_length, filename);
-
- if (err) {
- cprintf("Error %d reading %s...\n", err, filename);
- file_length = 0;
- /* there is not return because I want to close the file! */
- }
-
- /* Close the file */
- cprintf("Closing file %s...\n", filename);
- DOS_fclose(f);
- cprintf("File %s closed successfully!\n", filename);
-
-}
-
-/* -------------------------------------------------------*/
-
-void read_sprites()
-{
- /* DOS file descriptor */
- DOS_FILE *f;
- int myfilebuf_length,i;
- char filename[100];
-
- /* Error code */
- int err;
- i=0;
-
- for ( i=0; i < 16; i++) {
- sprintf(filename,"cars/car%d.raw",i);
- f = DOS_fopen(filename,"r");
-
- // check for open errors
- if (!f) {
- // error!!
- err = DOS_error();
-
- // note that if you call DOS_error() here, it return 0!!!
- cprintf("Error %d opening %s...\n", err, filename);
- myfilebuf_length = 0;
- return;
- }
-
- // read from file
- myfilebuf_length = DOS_fread(&sprite[i][0],1,CAR_WIDTH*CAR_HEIGHT,f);
-
- // check for errors
- err = DOS_error();
-
- cprintf("Read %d bytes from %s...\n", myfilebuf_length, filename);
-
- if (err) {
- cprintf("Error %d reading %s...\n", err, filename);
- myfilebuf_length = 0;
- // there is not return because I want to close the file!
- }
-
- // Close the file
- DOS_fclose(f);
- }
-
- f = DOS_fopen("cars/boom.raw","r");
- if (!f) {
- err = DOS_error();
-
- cprintf("Error %d opening boom.raw...\n", err);
- myfilebuf_length = 0;
- return;
- }
-
- myfilebuf_length = DOS_fread(&sprite[16][0],1,CAR_WIDTH*CAR_HEIGHT,f);
-
- err = DOS_error();
-
- cprintf("Read %d bytes from boom.raw...\n", myfilebuf_length);
-
- if (err) {
- cprintf("Error %d reading boom.raw...\n", err);
- myfilebuf_length = 0;
- }
-
- DOS_fclose(f);
-
- f = DOS_fopen("cars/fumo.raw","r");
- if (!f) {
- err = DOS_error();
-
- cprintf("Error %d opening fumo.raw...\n", err);
- myfilebuf_length = 0;
- return;
- }
-
- myfilebuf_length = DOS_fread(&sprite[17][0],1,CAR_WIDTH*CAR_HEIGHT,f);
-
- err = DOS_error();
-
- cprintf("Read %d bytes from fumo.raw...\n", myfilebuf_length);
-
- if (err) {
- cprintf("Error %d reading fumo.raw...\n", err);
- myfilebuf_length = 0;
- }
-
- DOS_fclose(f);
-
-}
-
Index: demos/branches/pj/auto/sensor.c
===================================================================
--- demos/branches/pj/auto/sensor.c (revision 1085)
+++ demos/branches/pj/auto/sensor.c (nonexistent)
@@ -1,650 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * Massimiliano Giorgi <massy@gandalf.sssup.it>
- * Luca Abeni <luca@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-
-/**
- ------------
- CVS : $Id: sensor.c,v 1.1.1.1 2002-09-02 09:37:42 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:42 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Marco Dallera and Marco Fiocca
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * AUTO
- *
- * Another Unuseful Track simulatOr
- *
- * Authors: Marco Dallera
- * Marco Fiocca
- *
- */
-
-/* ------------ */
-/* Camera car */
-/* ------------ */
-
-#include "include/auto.h"
-#include "include/const.h"
-#include "include/utils.h"
-#include <drivers/glib.h>
-
-#define RADIUS 1
-#define TOLL_FACTOR 4.0
-#define MIN_DIFF 3
-#define ROAD_COLOR 27
-#define OFFROAD_COLOR 0
-#define DEBUG_COLOR GREEN
-#define OUT_OF_TRACK 230
-#define STRIP_DEFAULT TEL_WIDTH+1
-
-extern sem_t grx_mutex;
-extern car_params cars[MAX_CAR_NUMBER];
-
-void scanline(point_f *buffer, float x1, float y1, float x2, float y2, int factor);
-void get_camera_car(BYTE *buffer, car_status status);
-int find_track(BYTE *image, road_info *info);
-int find_opps(BYTE *image, road_info *info);
-void find_collision(BYTE *image, road_info *info, car_status status);
-
-/* ----------------------------------------------------------------- */
-
-TASK sensor(int index) {
- car_status actual_car_status; // the actual car state
- road_info actual_road_info; // the actual road informations
- BYTE image[TEL_WIDTH*TEL_HEIGHT]; // buffer contenente la visione della telecamera ruotata
-
- point sq1, sq2;
- point im1, im2;
-
- CAB road_status_cab = cars[index].road_status_cab;
- CAB car_status_cab = cars[index].car_status_cab;
-
- // Draws display squares
- sq1.x = TRACK_X1 + TRACK_WIDTH + TEL_HEIGHT;
- sq1.y = TEL_HEIGHT*index + 1 + index;
- sq2.x = sq1.x + TEL_WIDTH + 1;
- sq2.y = sq1.y + TEL_HEIGHT + 1;
-
- // Sets viewer coords
- im1.x = sq1.x + 1;
- im1.y = sq1.y + 1;
- im2.x = im1.x + TEL_WIDTH - 1;
- im2.y = im1.y + TEL_HEIGHT - 1;
-
- // Inizializza il cab della strada
- actual_road_info.left_border = TEL_WIDTH/2;
- actual_road_info.right_border = TEL_WIDTH/2;
- actual_road_info.distance = TEL_HEIGHT;
- actual_road_info.curve = 0.0;
- actual_road_info.opps_number = 0;
- actual_road_info.flag = ROAD_OK;
- actual_road_info.collision = NO_COLL;
- set_road_info(actual_road_info, road_status_cab);
-
- task_endcycle();
-
- while(1) {
- /* reads car informations */
- actual_car_status = get_car_status(car_status_cab);
-
- /* implementazione riconoscimento strada (sti cazzi!!!) */
- get_camera_car(image, actual_car_status);
- find_track(image, &actual_road_info);
- find_opps(image, &actual_road_info);
- find_collision(image, &actual_road_info, actual_car_status);
-
- sem_wait(&grx_mutex);
- grx_rect(sq1.x, sq1.y, sq2.x, sq2.y, cars[index].color);
- grx_putimage(im1.x, im1.y, im2.x, im2.y, image);
- sem_post(&grx_mutex);
-
- /* sends informations to control task */
- set_road_info(actual_road_info, road_status_cab);
- task_endcycle();
- }
-
-}
-
-/* ----------------------------------------------------------------- */
-
-void find_collision(BYTE *image, road_info *info, car_status status)
-{
- point_f lt,rt,lb,rb,ct;
- /* the lines used to scan the quadrilate */
- point_f height_line[CAR_HEIGHT];
- int i;
- BYTE pix;
-
- info->collision = NO_COLL;
-
- ct.x = status.pos.x + (float)(CAR_HEIGHT/2 + 1) * cos(degree_to_rad(status.orient));
- ct.y = status.pos.y - (float)(CAR_WIDTH/2 + 1) * sin(degree_to_rad(status.orient));
-
- lb.x = ct.x - (float)(CAR_WIDTH/2.0) * cos(degree_to_rad(90-status.orient));
- rb.x = ct.x + (float)(CAR_WIDTH/2.0) * cos(degree_to_rad(90-status.orient));
- lt.x = lb.x - (float)(CAR_HEIGHT) * cos(degree_to_rad(status.orient));
- rt.x = rb.x - (float)(CAR_HEIGHT) * cos(degree_to_rad(status.orient));
-
- lb.y = ct.y - (float)(CAR_WIDTH/2.0) * sin(degree_to_rad(90-status.orient));
- rb.y = ct.y + (float)(CAR_WIDTH/2.0) * sin(degree_to_rad(90-status.orient));
- lt.y = lb.y + (float)(CAR_HEIGHT) * sin(degree_to_rad(status.orient));
- rt.y = rb.y + (float)(CAR_HEIGHT) * sin(degree_to_rad(status.orient));
-
- sem_wait(&grx_mutex);
- scanline(height_line,rb.x,rb.y,rt.x,rt.y,CAR_HEIGHT);
- for (i=0; i < CAR_HEIGHT; i++) {
- pix = grx_getpixel(round(height_line[i].x),round(height_line[i].y));
- if (pix != OFFROAD_COLOR && pix != ROAD_COLOR)
- info->collision = COLLISION_RIGHT;
- }
- scanline(height_line,lb.x,lb.y,lt.x,lt.y,CAR_HEIGHT);
- for (i=0; i < CAR_HEIGHT; i++) {
- pix = grx_getpixel(round(height_line[i].x),round(height_line[i].y));
- if (pix != OFFROAD_COLOR && pix != ROAD_COLOR)
- info->collision = COLLISION_LEFT;
- }
- sem_post(&grx_mutex);
-
-}
-
-/* ----------------------------------------------------------------- */
-
-/* Puts in a buffer the image viewed from the camera according to the car status */
-void get_camera_car(BYTE *buffer, car_status status) {
- /*
- * lt ------ rt
- * | |
- * | |
- * lb --ct-- rb
- */
- point_f lt,rt,lb,rb,ct;
- /* the lines used to scan the quadrilate */
- point_f width_line[TEL_WIDTH];
- point_f height_line[TEL_HEIGHT];
- int i,j;
- int tmpx,tmpy,tx,ty;
- float x,y;
- BYTE *row;
-
- ct.x = status.pos.x + (float)(CAR_WIDTH/2 + 1) * cos(degree_to_rad(status.orient));
- ct.y = status.pos.y - (float)(CAR_WIDTH/2 + 1) * sin(degree_to_rad(status.orient));
-
- /* for now the visual starts from the center of the car */
- lb.x = ct.x - (float)(TEL_WIDTH/2.0) * cos(degree_to_rad(90-status.orient));
- rb.x = ct.x + (float)(TEL_WIDTH/2.0) * cos(degree_to_rad(90-status.orient));
- lt.x = lb.x + (float)(TEL_HEIGHT) * cos(degree_to_rad(status.orient));
- rt.x = rb.x + (float)(TEL_HEIGHT) * cos(degree_to_rad(status.orient));
-
- lb.y = ct.y - (float)(TEL_WIDTH/2.0) * sin(degree_to_rad(90-status.orient));
- rb.y = ct.y + (float)(TEL_WIDTH/2.0) * sin(degree_to_rad(90-status.orient));
- lt.y = lb.y - (float)(TEL_HEIGHT) * sin(degree_to_rad(status.orient));
- rt.y = rb.y - (float)(TEL_HEIGHT) * sin(degree_to_rad(status.orient));
-
- /* scan only 2 sense thanks to parallelism */
- /* ^ <-(height)
- * ! lt
- * ! |
- * ! |
- * ! lb ------ rb )
- * 0 -------------> <-(width
- */
- /* the width_line coordinates are relative, so in the for cycle
- they are summarized to absolute height_line values */
- scanline(width_line,0,0,rb.x - lb.x,rb.y - lb.y,TEL_WIDTH);
- scanline(height_line,lb.x,lb.y,lt.x,lt.y,TEL_HEIGHT);
-
- /* First fill row TEL_HEIGHT-1 of image and so on until row 0 */
- sem_wait(&grx_mutex);
- for (i=0; i < TEL_HEIGHT; i++) {
- x = height_line[i].x;
- y = height_line[i].y;
- row = &buffer[TEL_WIDTH * (TEL_HEIGHT-1-i)];
- for (j=0; j < TEL_WIDTH; j++) {
- tmpx = round(x + width_line[j].x);
- tmpy = round(y + width_line[j].y);
-
- // Test rispetto ai bordi
- if (tmpx >= 0 && tmpx < SCREEN_WIDTH && tmpy >= 0 && tmpy < SCREEN_HEIGHT) {
- tx = tmpx - TRACK_X1-1;
- ty = tmpy - TRACK_Y1-1;
- if (tx >= 0 && tx < TRACK_WIDTH && ty >= 0 && ty < TRACK_HEIGHT)
- row[j] = grx_getpixel(tmpx,tmpy);
- else
- row[j] = OUT_OF_TRACK;
- } else {
- row[j] = OUT_OF_TRACK;
- }
- }
- }
- sem_post(&grx_mutex);
-}
-
-/* ----------------------------------------------------------------- */
-
-void scanline(point_f *buffer, float x1, float y1, float x2, float y2, int factor) {
- int i;
- float x,y;
- float xstep,ystep;
-
- xstep = (x2 - x1) / factor;
- ystep = (y2 - y1) / factor;
-
- // Start scan at <x1, y1>
- x = x1;
- y = y1;
-
- for (i = 0; i < factor; i++) {
- buffer[i].x = x;
- buffer[i].y = y;
- x += xstep;
- y += ystep;
- }
-}
-
-/* ----------------------------------------------------------------- */
-
-/*
- * Approssima la curva quando non è più possibile farlo con la scansione
- * orizzontale
- * - image
- * - index l'indice da cui cominciare la ricerca della curva
- * - distance la distanza dalla curva
- */
-float approx_curve(BYTE *image, int index, int distance, int d_center, road_strip *strips) {
- BYTE *p,tmp;
- int i,j,k,ctrl=0;
- point ms_center,ct;
-
- // Decide se la curva e' verso sinistra o verso destra
- p = &image[(TEL_HEIGHT - index - 1) * TEL_WIDTH];
-
- ms_center.x = strips[index-1].left;
- for (i = 0; i < min(3,strips[index-1].left); i++) {
- // La curva è a destra
- tmp = *(p + round(ms_center.x) - i);
- if (tmp != ROAD_COLOR) {
- ms_center.x = strips[index-1].right;
- break;
- }
- }
-
- p += round(ms_center.x);
- // Scandisce la colonna fino alla fine della strada
- for (i = index; i < TEL_HEIGHT; i++, p -= TEL_WIDTH) {
- if (*p != ROAD_COLOR) break;
- }
-
- // Imposta il nuovo max_scost empirico
- ms_center.y = (i-1 + index) / 2;
-
- // i-1 è l'indice dell'ultima riga bianca
- p = &image[(TEL_HEIGHT - (i-1) - 1) * TEL_WIDTH + round(ms_center.x)];
- // scandisce da destra a sinistra
- if (round(ms_center.x) > 0) {
- for (j = 0; j < (round(ms_center.x) - strips[index-1].left); j++, p--) {
- if (*p != ROAD_COLOR) break;
- // scandisce dall'alto in basso finchè non trova nero
- for (k = i-1; k > index; k--) {
- tmp = *(p + (i-1-k)*TEL_WIDTH);
- if (tmp != ROAD_COLOR) {
- ms_center.y = (k + index) / 2;
- ctrl = 1;
- break;
- }
- }
- if (ctrl) break;
- }
- ct.x = ms_center.x - j/2;
- ct.y = ms_center.y;
- } else {
- // scandisce da sinistra a destra
- for (j = 0; j < (strips[index-1].right - round(ms_center.x)); j++, p++) {
- if (*p != ROAD_COLOR) break;
- // scandisce dall'alto in basso finchè non trova nero
- for (k = i-1; k > index; k--) {
- tmp = *(p + (i-1-k)*TEL_WIDTH);
- if (tmp != ROAD_COLOR) {
- ms_center.y = (k + index) / 2;
- ctrl = 1;
- break;
- }
- }
- if (ctrl) break;
- }
- ct.x = ms_center.x + j/2;
- ct.y = ms_center.y;
- }
-
- return rad_to_degree(atan2((double)(ct.y - distance),(double)(ct.x - d_center)));
-}
-
-/* ----------------------------------------------------------------- */
-
-int find_distance(road_strip *strips, int max_scost, int rett_tol) {
- int i, distance;
- int center_car = TEL_WIDTH/2;
-
- // La distanza non puo' essere maggiore del max_scost
- distance = max_scost;
-
- for (i=1; i < max_scost; i++) {
- // Calcola la distanza dalla curva
- if (abs(strips[i].center - center_car) > rett_tol) {
- distance = i;
- break;
- }
- }
- return distance;
-}
-
-/* ----------------------------------------------------------------- */
-
-/* Scandisce la linea row e inserisce nella strip index le informazioni.
- * Ritorna 1 se trova entrambi i bordi, altrimenti 0
- */
-int scan_strip(BYTE *row, int index, road_strip *strips) {
- // Tiene conto della posizione dei bordi precedenti per trattare
- // meglio il caso di curve molto strette, dove possono esistere
- // 2 bordi destri o sinistri
-
- // Per evitare problemi nei casi in cui siano possibili 2
- // bordi destri o sinistri
- int lfound = 0;
- int rfound = 0;
- int center_car = TEL_WIDTH/2;
- int i;
-
- // Parte dal secondo pixel e finisce al penultimo
- for(i=1; i < (TEL_WIDTH-1); i++) {
- // Se trova la strada controlla se si tratta di bordo
- // destro o sinistro
- if (row[i] == ROAD_COLOR) {
- // bordo sinistro
- if (row[i - 1] != ROAD_COLOR) {
- // Se ho già trovato questo tipo di bordo cerco
- // quello + plausibile ...
- if (lfound) {
- // Test sulla striscia precedente
- if (index > 0) {
- if (abs(i - strips[index-1].left) <
- abs(strips[index].left - strips[index-1].left))
- strips[index].left = i;
- } else {
- // Test sul centro della macchina
- if (abs(i - center_car) < abs(strips[0].left - center_car))
- strips[index].left = i;
- }
- lfound++;
- } else {
- // ... altrimenti lo inizializzo
- strips[index].left = i;
- lfound = 1;
- }
- // bordo destro
- } else if ((row[i + 1] != ROAD_COLOR) && lfound) {
- // Se ho già trovato questo tipo di bordo cerco
- // quello + plausibile ...
- if (rfound) {
- // Test sulla striscia precedente
- if (index > 0) {
- if (abs(i - strips[index-1].right) <
- abs(strips[index].right - strips[index-1].right))
- strips[index].right = i;
- } else {
- // Test sul centro della macchina
- if (abs(i - center_car) < abs(strips[0].right - center_car))
- strips[index].right = i;
- }
- rfound++;
- } else {
- // ... altrimenti lo inizializzo
- strips[index].right = i;
- rfound = 1;
- }
- }
- }
- }
-
- // Calcola il centro della strada se trova i bordi
- if (lfound && rfound)
- strips[index].center = (strips[index].left + strips[index].right) / 2;
-
- return (lfound && rfound);
-}
-
-/* ----------------------------------------------------------------- */
-
-void where_am_i(BYTE *row, road_strip strip, road_info *info) {
- int i;
- int lfound = 0;
- int rfound = 0;
- int car_center = TEL_WIDTH/2;
-
- for(i=1; i < (TEL_WIDTH-1); i++) {
- // Se trova la strada controlla se si tratta di bordo
- // destro o sinistro
- if (row[i] == ROAD_COLOR) {
- // bordo sinistro
- if (row[i - 1] != ROAD_COLOR) {
- strip.left = i;
- lfound = 1;
- break;
- } else if (row[i + 1] != ROAD_COLOR) {
- strip.right = i;
- rfound = 1;
- break;
- }
- }
- }
-
- if (lfound && rfound) {
- info->flag = ROAD_OK;
- }
- else if (lfound && !rfound) info->flag = LEFT_ONLY;
- else if (!lfound && rfound) info->flag = RIGHT_ONLY;
- else {
- if (row[car_center] == OFFROAD_COLOR) info->flag = NO_ROAD;
- else info->flag = ROAD_OK;
- }
- info->left_border = car_center - strip.left;
- info->right_border = strip.right - car_center;
-}
-
-/* ----------------------------------------------------------------- */
-
-/* Analizza l'immagine vista dalla telecamera inserendo le informazioni
- * necessarie in info, ovvero la distanza dai bordi destro e sinistro,
- * la distanza dalla prossima curva e il suo angolo di curvatura.
- * Per il momento ritorna -1 se non riesce a trovare entrambi i bordi della
- * strada; in futuro gestiremo anche questa situazione.
- */
-int find_track(BYTE *image, road_info *info) {
- // vettore contenente le informazioni su ogni striscia
- road_strip strips[TEL_HEIGHT];
- BYTE *row;
- int car_center = TEL_WIDTH/2;
- int max_scost=0;
- int once_scost=0;
- int j, rett_tol=0;
-
- info->flag = ROAD_OK;
-
- strips[0].left = STRIP_DEFAULT;
- strips[0].right = STRIP_DEFAULT;
- /* Tratta in modo personalizzato il primo tratto di strada per
- inizializzare alcune variabili e per capire situazioni particolari */
- row = &image[(TEL_HEIGHT - 1)*TEL_WIDTH];
- // Se trova i bordi ...
- if (scan_strip(row,0,strips)) {
- // ... calcola i bordi della strada e ...
- info->left_border = car_center - strips[0].left;
- info->right_border = strips[0].right - car_center;
- // ... inizializza la tolleranza per il rettilineo.
- rett_tol = (strips[0].right - strips[0].left) / TOLL_FACTOR;
- } else {
- // Se non trova il bordo ...
- // Mi sono perso, cercami la strada
- where_am_i(row,strips[0],info);
- return 1;
- }
-
- /* Ora controlla le altre strisce della strada */
-
- for(j=1; j < TEL_HEIGHT ; j++) {
- row = &image[(TEL_HEIGHT - j - 1)*TEL_WIDTH];
- // Se trova i bordi ...
- if (scan_strip(row, j, strips)) {
- // ... aggiorna l'indice di max scostamento.
- if (abs(strips[j].center - car_center) >
- abs(strips[max_scost].center - car_center)
- && abs(strips[j].center - car_center) > rett_tol) {
-
- max_scost = j;
- once_scost=1; // ha trovato almeno un max scost
- }
- } else {
- // Se max_scost non è mai stato settato, prendo il max
- if (!once_scost) {
- max_scost = j-1;
- once_scost = 1;
- }
-
- // se la distanza e il max_scost sono troppo vicini approssima la curva
- info->distance = find_distance(strips, max_scost, rett_tol);
- if ((max_scost - info->distance) < MIN_DIFF) {
- info->curve = approx_curve(image, j, info->distance,
- strips[info->distance].center,strips) - 90.0;
- return 1;
- }
- break;
- }
- }
-
- // Se max_scost non è mai stato settato, prendo il max
- if (!once_scost) max_scost = TEL_HEIGHT-1;
- max_scost = min(max_scost,TEL_HEIGHT-1);
-
- info->distance = find_distance(strips,max_scost,rett_tol);
-
- // calcola l'angolo di curvatura solo se il conto e' attendibile
- if ((info->distance < (TEL_HEIGHT*0.9)) &&
- ((max_scost - info->distance) >= MIN_DIFF))
- info->curve = rad_to_degree(atan2((double)(max_scost - info->distance),
- (double)(strips[max_scost].center - strips[info->distance].center)));
- else {
- // se i conti sono empirici, si guarda la posizione dei due centri
- if (strips[max_scost].center > strips[info->distance].center)
- info->curve = 88.0;
- else if (strips[max_scost].center < strips[info->distance].center)
- info->curve = 92.0;
- else
- info->curve = 90.0;
- }
- info->curve -= 90.0;
- return 0;
-}
-
-/* ----------------------------------------------------------------- */
-
-int find_opps(BYTE *image, road_info *info)
-{
- int i, j;
- int l_limit, r_limit; // the opposite empiric limits
- BYTE *row;
- int car_center = TEL_WIDTH/2;
- int opps_number = 0;
-
- // by default it needs to scan the entire row
- l_limit = TEL_WIDTH - 1;
- r_limit = 0;
-
- // Scans one row at a time
- for(j=1; j<TEL_HEIGHT; j++) {
- row = &image[(TEL_HEIGHT - j - 1) * TEL_WIDTH];
-
- // if some of the previous row has been identified as a car...
- if (opps_number > 0 &&
- j < (info->opps_list[opps_number - 1].y + CAR_HEIGHT + 1)) {
- // excludes CAR_HEIGHT lines from the bottom if the car
- l_limit = (car_center + info->opps_list[opps_number - 1].x) - CAR_WIDTH;
- r_limit = (car_center + info->opps_list[opps_number - 1].x) + CAR_WIDTH;
- }
- else {
- // it needs to scan the entire row
- l_limit = TEL_WIDTH - 1;
- r_limit = 0;
- }
-
- // Scans the current row
- for (i=0; i<TEL_WIDTH; i++) {
- if( (i < l_limit || i > r_limit) &&
- row[i] != ROAD_COLOR && row[i] != OFFROAD_COLOR &&
- row[i] != DEBUG_COLOR && row[i] != OUT_OF_TRACK) {
- // there is an opponent car!!
- // stores its position
- info->opps_list[opps_number].x = i - car_center; // left -, right +
- info->opps_list[opps_number].y = j;
-
- // increases number of opposites car in the sensor view range
- opps_number++;
- }
- }
- }
-
- info->opps_number = opps_number;
-
- return 0;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Index: demos/branches/pj/auto/readme
===================================================================
--- demos/branches/pj/auto/readme (revision 1085)
+++ demos/branches/pj/auto/readme (nonexistent)
@@ -1,51 +0,0 @@
-AUTO - Another Unuseful Track simulatOr
----------------------------------------
-
-by Marco Dallera and Marco Fiocca, 2001
-
----------------------------------------
-
-This project was done as a Lab assignment during the course of
-"Informatica Industriale" at the University of Pavia, Italy.
-
-It simulates a race between cars under a set of 4 tracks.
-
-The authors provided also some pages that describes the application
-(auto.ps, in italian, on the website).
-
-To run the application, just compile it and call "x auto th" where tn is
-the track number (0 to 4).
-
-Since the control algorithm is quite complex, you need a quite powerful
-machine. If you get an exception 8 (WCET violation), you need a faster PC.
-You can anyway run the application making "auto2", that uses RR instead of
-EDF or CBS, or "auto3", that uses the EDFACT Module (you need yo copy
-the edfact.c and edfact.h files in the application directory to do that).
-
-To be run, the application needs to be compiled with the
-#define MAX_CAB set to a number greater than 20 (see include/modules/cabs.h).
-
-The control algorithm of the cars is not yet perfect, and if you look to
-the race for a long time, sometimes some cars go in the wrong direction.
-If you find a better algorithm, send me a patch :-)
-
-The code you can find in this directory is the original code of the
-students except for the MAX_CAB test into main(), and for the idle time
-monitor (that I took from the jumpball example) that can be useful to know
-when the system is overloaded. For example, on my PC there is idle time until
-the system has 9 cars. The tenth make the PC overloaded until one of them
-crashes :-).
-
-Finally note that the WCET and PERIODS specified by the authors are not so
-correct, and with this setting you can run 8 cars maximum before crashing the
-system.
-
-Have a nice race...
-
-Paolo
-pj@sssup.it
-
-PS: Sometimes on my portable the demo crashes. I wonder why!... If someone
-finds why, please tell me, I will patch it...
-
-
Index: demos/branches/pj/auto/initfil1.c
===================================================================
--- demos/branches/pj/auto/initfil1.c (revision 1085)
+++ demos/branches/pj/auto/initfil1.c (nonexistent)
@@ -1,108 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: initfil1.c,v 1.1.1.1 2002-09-02 09:37:42 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:42 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/cbs.h"
-#include "modules/rr.h"
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-#include "drivers/keyb.h"
-
-/*+ sysyem tick in us +*/
-#define TICK 0
-
-/*+ RR tick in us +*/
-#define RRTICK 2000
-
-void read_track(int);
-void read_sprites();
-
-int argc;
-char *argv[100];
-
-int main(int argc, char **argv);
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- EDF_register_level(EDF_ENABLE_ALL);
- CBS_register_level(CBS_ENABLE_ALL, 0);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- dummy_register_level();
-
- SEM_register_module();
-
- CABS_register_module();
-
- __compute_args__(mb, &argc, argv);
-
- if (argc == 2)
- read_track(strtoi(argv[1], 10, NULL));
- else
- read_track(2);
-
- read_sprites();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- KEYB_PARMS kparms = BASE_KEYB;
-
- HARTPORT_init();
-
- keyb_def_ctrlC(kparms, NULL);
- KEYB_init(&kparms);
-
- return (void *)main(argc,argv);
-}
Index: demos/branches/pj/auto/initfil2.c
===================================================================
--- demos/branches/pj/auto/initfil2.c (revision 1085)
+++ demos/branches/pj/auto/initfil2.c (nonexistent)
@@ -1,108 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: initfil2.c,v 1.1.1.1 2002-09-02 09:37:42 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:42 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "kernel/kern.h"
-#include "modules/rr.h"
-#include "modules/rrsoft.h"
-#include "modules/dummy.h"
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-#include "drivers/keyb.h"
-
-/*+ sysyem tick in us +*/
-#define TICK 1000
-
-/*+ RR tick in us +*/
-#define RRTICK 2000
-
-void read_track(int);
-void read_sprites();
-
-int argc;
-char *argv[100];
-int main(int argc, char **argv);
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- RRSOFT_register_level(RRTICK, RR_MAIN_NO, mb, RRSOFT_ONLY_HARD|RRSOFT_ONLY_SOFT);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- dummy_register_level();
-
- SEM_register_module();
-
- CABS_register_module();
-
- __compute_args__(mb, &argc, argv);
-
- if (argc == 2)
- read_track(strtoi(argv[1], 10, NULL));
- else
- read_track(0);
-
- read_sprites();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- KEYB_PARMS kparms = BASE_KEYB;
-
- HARTPORT_init();
-
- keyb_def_ctrlC(kparms, NULL);
- KEYB_init(&kparms);
-
- return (void *)main(argc,argv);
-}
-
-
-
-
Index: demos/branches/pj/auto/control.c
===================================================================
--- demos/branches/pj/auto/control.c (revision 1085)
+++ demos/branches/pj/auto/control.c (nonexistent)
@@ -1,711 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * Massimiliano Giorgi <massy@gandalf.sssup.it>
- * Luca Abeni <luca@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-
-/**
- ------------
- CVS : $Id: control.c,v 1.1.1.1 2002-09-02 09:37:42 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:42 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Marco Dallera and Marco Fiocca
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * AUTO
- *
- * Another Unuseful Track simulatOr
- *
- * Authors: Marco Dallera
- * Marco Fiocca
- *
- */
-
-/* ------------- */
-/* Car control */
-/* ------------- */
-
-#include "include/auto.h"
-#include "include/const.h"
-#include "include/utils.h"
-
-#define TURN_QUANTUM 2
-#define KM 18.0 // pixel
-#define HOUR 3600.0 // seconds
-#define KPH (KM/HOUR) // 0.005 pixel/second
-#define HIGHWAY_LIMIT 6
-#define MAZE_LIMIT 45
-#define CURVE_LIMIT 25 // il limite della curva per cui imposta la traiettoria
-#define BORDER_LIMIT ((1.0 / params.rage) * 2.0)
-#define STEERING_LIMIT 3 // limite di sterzata
-
-/* Road state */
-#define HIGHWAY 1
-#define MIXED 2
-#define MAZE 3
-#define CENTER 10
-#define TOO_LEFT 11
-#define TOO_RIGHT 12
-
-/* Opponents relationship */
-#define ATTACK 20
-#define DEFENSE 21
-#define SUPERATTACK 22
-
-/* Car parameters */
-#define MAX_SPEED (300 * KPH)
-#define MIN_SPEED (10 * KPH)
-#define MIN_ACC (-0.1)
-#define MAX_ACC (0.02)
-
-extern sem_t grx_mutex;
-
-char track_img[TRACK_WIDTH*TRACK_HEIGHT];
-char sprite[18][CAR_WIDTH*CAR_HEIGHT];
-
-/* Display functions */
-void put_transimage(int x1, int y1, int x2, int y2, BYTE *img,int car_color, int color);
-void draw_car(point_f old_pos, car_status cs, int car_color, int fumo);
-void put_trackbox(int x1, int y1, int x2, int y2);
-void show_display(int, int, float, float, float, float);
-void car_crash(PID sp, PID cp, point_f old_pos, int free);
-
-/* ------------------------------------------------------------------ */
-
-TASK control(int index) {
- int i = 0; // general purpose counter
- car_status old_car_status; // the previous car state
- car_status actual_car_status; // the actual car state
- road_info actual_road_info; // the actual road informations
- int road_state; // the state of the road: HIGHWAY, MIXED; MAZE
- int car_align; // the car alignment with respect to road limits
- int opps_state; // the relationship with other cars
- float old_speed = 0; // the previous car speed value
- float actual_speed = 0; // the actual car speed value
- float old_acc = 0; // the previous acceleration value
- float acc = 0; // the new acceleration
- point polepos;
-
- // Variabili che dipendono dal tipo di macchina
- float max_speed; // maximum car speed
- float min_acc; // minimum acceleration
- float max_acc; // maximum acceleration
-
- int killed = 0; // flag for killed cars
- int crashed = 0; // flag for crashed cars
-
- /* Timing variables */
- float t = 0;
- float dt = (float)CONTROL_PERIOD/100000.0; // time quantum
- time ts = int2time(t);
- float crash_t = 0;
- time crash_ts = int2time(crash_t);
- float bestlap = 999999999.9;
- time bestlap_s = int2time(bestlap);
- int bestlap_done = 0;
- int laps = 0;
-
- /* Display vars */
- point spd_p, acc_p, time_p, drv_p;
- char *txt;
-
- /* Car data */
- car_params params; // car data structure
-
- /* ----------------------------------------------------- */
-
- txt = (char *)malloc(15*sizeof(char));
-
- params = cars[index];
-
- max_speed = params.max_speed * MAX_SPEED; // maximum car speed
- min_acc = params.min_acc * MIN_ACC; // minimum acceleration
- max_acc = params.max_acc * MAX_ACC; // maximum acceleration
-
- /* Get track data */
- while (track_list[i].selected == 0)
- i++;
-
- /* Same pole for all */
- polepos.x = track_list[i].pole_pos.x;
- polepos.y = track_list[i].pole_pos.y;
- actual_car_status.pos.x = polepos.x;
- actual_car_status.pos.y = polepos.y;
- actual_car_status.orient = track_list[i].pole_orient;
- set_car_status(actual_car_status, params.car_status_cab);
-
- /* Initialize old values */
- old_car_status = actual_car_status;
- old_acc = acc;
- old_speed = actual_speed;
-
- /* POWER IS NOTHING WITHOUT CONTROL */
- while(1) {
-
- if (crashed) {
- crash_t += dt;
- crash_ts = int2time(crash_t);
- if (crash_ts.sec > 2) {
- car_crash(params.sensor_pid,params.control_pid,
- old_car_status.pos, 1);
- killed=1;
- }
- }
-
- else {
-
- /* Reads road informations */
- actual_road_info = get_road_info(params.road_status_cab);
-
- /* Defines the state of the road */
- if (fabs(actual_road_info.curve) < HIGHWAY_LIMIT ||
- actual_road_info.distance > 0.9*TEL_HEIGHT) {
- road_state = HIGHWAY;
- } else if (fabs(actual_road_info.curve) > MAZE_LIMIT ||
- actual_road_info.distance < 0.1*TEL_HEIGHT) {
- road_state = MAZE;
- } else {
- road_state = MIXED;
- }
-
- /* Defines the car position whitin road borders */
- if (actual_road_info.left_border < BORDER_LIMIT)
- car_align = TOO_LEFT;
- else if (actual_road_info.right_border < BORDER_LIMIT)
- car_align = TOO_RIGHT;
- else car_align = CENTER;
-
- /* Sets the power percentage */
- switch (road_state)
- {
- case HIGHWAY:
- acc = max_acc; // tarella!!!!
- break;
- case MIXED:
- actual_speed = params.rage * (((float)actual_road_info.distance/(float)TEL_HEIGHT) /
- (fabs(actual_road_info.curve)/90.0)) * max_speed;
- acc = (actual_speed - old_speed) / dt;
- break;
- case MAZE:
- actual_speed = params.rage * (1.0 - (fabs(actual_road_info.curve)/90.0)) * max_speed;
- acc = (actual_speed - old_speed) / dt;
- break;
- default:
- acc = 0.0;
- }
-
- /* Can't go off road */
- /* When car is near a border, it steers to come in */
- switch (car_align)
- {
- case TOO_LEFT:
- actual_car_status.orient -= TURN_QUANTUM;
- break;
- case TOO_RIGHT:
- actual_car_status.orient += TURN_QUANTUM;
- break;
- }
-
- if (road_state != HIGHWAY) {
- // C'e' una curva vicina.
- // Se la curva e' a destra si tiene vicino al bordo di sinistra
- // per impostare la traiettoria migliore e viceversa
- if (actual_road_info.curve < 0 && actual_road_info.left_border > BORDER_LIMIT
- && fabs(actual_road_info.curve) > CURVE_LIMIT)
- actual_car_status.orient += TURN_QUANTUM;
- else if (actual_road_info.curve > 0 && actual_road_info.right_border > BORDER_LIMIT
- && fabs(actual_road_info.curve) > CURVE_LIMIT)
- actual_car_status.orient -= TURN_QUANTUM;
-
- // Fa la curva dolcemente
- if (actual_road_info.distance < ((1.0/params.rage) * (TEL_HEIGHT * 0.25))) {
- actual_car_status.orient += actual_road_info.curve * (params.rage/8.0);
- //actual_car_status.orient += actual_road_info.curve / 4.0;
- }
- }
-
- /* Defines the state of interactions with other cars */
- if (actual_road_info.opps_number > 0)
- {
- if (road_state == HIGHWAY && actual_road_info.opps_list[0].y > (TEL_HEIGHT/3.0))
- opps_state = ATTACK;
- else if (road_state == MAZE && actual_road_info.opps_list[0].y < (TEL_HEIGHT/3.0))
- opps_state = DEFENSE;
- else if (actual_road_info.opps_list[0].y < (TEL_HEIGHT/6.0) &&
- actual_road_info.opps_list[0].x != 0 &&
- (abs(actual_road_info.opps_list[0].x) < CAR_W/2)) {
- // Defends and steers to avoid opponents
- opps_state = DEFENSE;
- acc *= -((TEL_HEIGHT/6.0) / (actual_road_info.opps_list[0].y));
- actual_car_status.orient -= ((actual_road_info.opps_list[0].x) /
- abs(actual_road_info.opps_list[0].x)) * TURN_QUANTUM/2;
- }
- else if (actual_road_info.opps_list[0].y < (TEL_HEIGHT/3.0) &&
- actual_road_info.opps_list[0].x != 0 &&
- abs(actual_road_info.opps_list[0].x) < CAR_W/2) {
- // Attacks and steers to override the opponent
- opps_state = ATTACK;
- actual_car_status.orient -= ((actual_road_info.opps_list[0].x) /
- abs(actual_road_info.opps_list[0].x)) * TURN_QUANTUM;
- }
- else
- opps_state = DEFENSE;
-
- // Response to opponents positions
- if (opps_state == ATTACK)
- acc = max_acc;
- else if (opps_state == DEFENSE)
- acc *= 0.5;
- }
-
-
- /* Checking car position: road/offroad */
- if (actual_road_info.left_border * actual_road_info.right_border < 0)
- acc = 0.5 * min_acc;
-
- if (actual_road_info.flag != ROAD_OK) {
- switch (actual_road_info.flag) {
- case LEFT_ONLY:
- if (actual_road_info.left_border < 0)
- actual_car_status.orient -= TURN_QUANTUM;
- acc = 0.5 * max_acc;
- break;
- case RIGHT_ONLY:
- if (actual_road_info.right_border < 0)
- actual_car_status.orient += TURN_QUANTUM;
- acc = 0.5 * max_acc;
- break;
- case NO_ROAD:
- crashed = 1;
- car_crash(params.sensor_pid,params.control_pid,
- old_car_status.pos, 0);
- break;
- }
- }
-
- /* Checking collisions... */
- if (actual_road_info.collision != NO_COLL) {
- switch(actual_road_info.collision) {
- case COLLISION_LEFT:
- actual_car_status.orient -= TURN_QUANTUM;
- acc *= (0.5 * params.rage);
- break;
- case COLLISION_RIGHT:
- actual_car_status.orient += TURN_QUANTUM;
- acc *= (0.5 * params.rage);
- break;
- }
- }
-
- /* Checking acceleration range... */
- acc = max(min(max_acc,acc),min_acc);
- actual_speed = old_speed + acc*dt;
-
- /* Checking speed range... */
- actual_speed = min(max(actual_speed,MIN_SPEED),max_speed);
-
- /* Checking steering angle ... */
- if (fabs(actual_car_status.orient - old_car_status.orient) >
- STEERING_LIMIT) {
- if ((actual_car_status.orient - old_car_status.orient) > 0)
- actual_car_status.orient = old_car_status.orient + STEERING_LIMIT;
- else
- actual_car_status.orient = old_car_status.orient - STEERING_LIMIT;
- }
-
- /* Setting new car position... */
- actual_car_status.pos.x += actual_speed * cos(degree_to_rad(actual_car_status.orient));
- actual_car_status.pos.y -= actual_speed * sin(degree_to_rad(actual_car_status.orient));
-
- /* Checking track limits... */
- if (actual_car_status.pos.x < MIN_CAR_X)
- actual_car_status.pos.x = MIN_CAR_X;
- if (actual_car_status.pos.x > MAX_CAR_X)
- actual_car_status.pos.x = MAX_CAR_X;
- if (actual_car_status.pos.y < MIN_CAR_Y)
- actual_car_status.pos.y = MIN_CAR_Y;
- if (actual_car_status.pos.y > MAX_CAR_Y)
- actual_car_status.pos.y = MAX_CAR_Y;
-
- /* Sends new status to car_status_cab */
- set_car_status(actual_car_status, params.car_status_cab);
-
- if (!crashed) {
- /* Updates car */
- if (acc == min_acc)
- draw_car(old_car_status.pos,actual_car_status, params.color, 1);
- else
- draw_car(old_car_status.pos,actual_car_status, params.color, 0);
- }
-
- /* Sets display points */
- spd_p.x = TRACK_X1 + TRACK_WIDTH + TEL_HEIGHT + TEL_WIDTH + 9;
- spd_p.y = TEL_HEIGHT*index + 1 + index + 1;
- bar_display(spd_p, 70, 4, GREEN, actual_speed, max_speed, LIGHTGRAY, "Spd");
-
- acc_p.x = spd_p.x;
- acc_p.y = spd_p.y + 24;
- bidir_bar_display(acc_p, 70, 4, GREEN, acc, max(fabs(min_acc), max_acc), LIGHTGRAY, "Acc");
-
- sem_wait(&grx_mutex);
-
- /* Displays driver's name */
- drv_p.x = spd_p.x + 80;
- drv_p.y = spd_p.y;
- grx_text(params.driver, drv_p.x, drv_p.y, params.color, BLACK);
-
- /* Displays timer */
- time_p.x = spd_p.x + 80;
- time_p.y = spd_p.y + 8;
- if( (!bestlap_done) || (bestlap_done && t > 50))
- {
- /* Mins */
- txt = itoa(ts.min, txt);
- grx_text(txt, time_p.x, time_p.y, WHITE, BLACK);
- grx_text(":", time_p.x + 8, time_p.y, WHITE, BLACK);
- /* Secs */
- txt = itoa(ts.sec, txt);
- if (ts.sec < 10) {
- grx_text("0", time_p.x+16, time_p.y, WHITE, BLACK);
- grx_text(txt, time_p.x+24, time_p.y, WHITE, BLACK);
- }
- else
- grx_text(txt, time_p.x+16, time_p.y, WHITE, BLACK);
- /* Decs */
- grx_text(":", time_p.x+32, time_p.y, WHITE, BLACK);
- txt = itoa(ts.dec, txt);
- grx_text(txt, time_p.x+40, time_p.y, WHITE, BLACK);
- }
-
- /* Displays the best lap */
- if(bestlap_done == 1)
- {
- time_p.x = spd_p.x + 80;
- time_p.y = spd_p.y + 16;
- /* Mins */
- txt = itoa(bestlap_s.min, txt);
- grx_text(txt, time_p.x, time_p.y, YELLOW, BLACK);
- grx_text(":", time_p.x + 8, time_p.y, YELLOW, BLACK);
- /* Secs */
- txt = itoa(bestlap_s.sec, txt);
- if (bestlap_s.sec < 10) {
- grx_text("0", time_p.x+16, time_p.y, YELLOW, BLACK);
- grx_text(txt, time_p.x+24, time_p.y, YELLOW, BLACK);
- }
- else
- grx_text(txt, time_p.x+16, time_p.y, YELLOW, BLACK);
- /* Decs */
- grx_text(":", time_p.x+32, time_p.y, YELLOW, BLACK);
- txt = itoa(bestlap_s.dec, txt);
- grx_text(txt, time_p.x+40, time_p.y, YELLOW, BLACK);
- }
-
- /* Displays lap number */
- time_p.x = spd_p.x + 80;
- time_p.y = spd_p.y + 24;
- grx_text("Lap ", time_p.x, time_p.y, LIGHTGRAY, BLACK);
- txt = itoa(laps, txt);
- grx_text(txt, time_p.x+32, time_p.y, LIGHTGRAY, BLACK);
-
- sem_post(&grx_mutex);
-
- /* Control the best lap */
- t += dt;
- ts = int2time(t);
-
- /* Finish line */
- if ((track_list[i].lap == CLOCK &&
- (actual_car_status.pos.x >= polepos.x) && (old_car_status.pos.x < polepos.x)
- && (actual_car_status.pos.y > polepos.y-20) && (actual_car_status.pos.y < polepos.y+20)) ||
- (track_list[i].lap == ANTICLOCK &&
- (actual_car_status.pos.x <= polepos.x) && (old_car_status.pos.x > polepos.x)
- && (actual_car_status.pos.y > polepos.y-20) && (actual_car_status.pos.y < polepos.y+20))) {
- laps++; // increases lap number
-
- bestlap = min(bestlap,t);
- bestlap_s = int2time(bestlap);
- bestlap_done = 1;
- t = 0;
- ts = int2time(t);
- }
-
- /* Updates old values */
- old_car_status = actual_car_status;
- old_acc = acc;
- old_speed = actual_speed;
-
- } // end crashed
-
- task_endcycle();
-
- // Esce se e' morto
- if (killed) return 0;
- }
-}
-
-/* ------------------------------------------------------------------ */
-
-void car_crash(PID sp, PID cp, point_f old_pos, int free)
-{
- point p1, p2;
- p1.x = round(old_pos.x) - CAR_WIDTH/2 - 1;
- p1.y = round(old_pos.y) - CAR_HEIGHT/2 - 1;
- p2.x = p1.x + CAR_WIDTH + 1;
- p2.y = p1.y + CAR_HEIGHT + 1;
-
- sem_wait(&grx_mutex);
- /* Find the track box to redraw */
- put_trackbox(p1.x,p1.y,p2.x,p2.y);
-
- if (free == 0) {
- // Draw the explosion
- put_transimage(p1.x+1,p1.y+1,p2.x-1,p2.y-1,&sprite[16][0],0,0);
- }
- else if (free == 1) {
- // Delete the explosion
- put_trackbox(p1.x,p1.y,p2.x,p2.y);
- task_kill(sp);
- task_kill(cp);
- }
- sem_post(&grx_mutex);
-}
-
-/* ------------------------------------------------------------------ */
-
-void draw_car(point_f old_pos, car_status cs, int car_color, int fumo)
-{
- int index;
- point p1, p2;
- p1.x = round(old_pos.x) - CAR_WIDTH/2 - 1;
- p1.y = round(old_pos.y) - CAR_HEIGHT/2 - 1;
- p2.x = p1.x + CAR_WIDTH + 1;
- p2.y = p1.y + CAR_HEIGHT + 1;
-
- sem_wait(&grx_mutex);
- /* Find the track box to redraw */
- put_trackbox(p1.x,p1.y,p2.x,p2.y);
-
-
- p1.x = round(cs.pos.x) + (CAR_WIDTH/2 * cos(degree_to_rad(cs.orient)));
- p1.y = round(cs.pos.y) - (CAR_HEIGHT/2 * sin(degree_to_rad(cs.orient)));
- p2.x = round(cs.pos.x) - (CAR_WIDTH/2 * cos(degree_to_rad(cs.orient)));
- p2.y = round(cs.pos.y) + (CAR_HEIGHT/2 * sin(degree_to_rad(cs.orient)));
-
- index = ((((int)cs.orient%360)+360)%360);
- index = (int)(index + 11.25)%360;
- index /= 22.5;
-
- put_transimage(round(cs.pos.x) - CAR_WIDTH/2 + 1,round(cs.pos.y) - CAR_HEIGHT/2 + 1,
- round(cs.pos.x) + CAR_WIDTH/2 ,round(cs.pos.y) + CAR_HEIGHT/2,
- &sprite[index][0], car_color, 0);
- if (fumo)
- put_transimage(round(cs.pos.x) - CAR_WIDTH/2 + 1,round(cs.pos.y) - CAR_HEIGHT/2 + 1,
- round(cs.pos.x) + CAR_WIDTH/2 ,round(cs.pos.y) + CAR_HEIGHT/2,
- &sprite[17][0], car_color, 0);
- sem_post(&grx_mutex);
-}
-
-/* ------------------------------------------------------------------ */
-
-/* Copy a box of track_image to screen */
-void put_trackbox(int x1, int y1, int x2, int y2)
-{
- int y;
- int tx1,ty1,tx2,ty2;
- BYTE *addr;
-
- tx1 = x1-TRACK_X1+1;
- ty1 = y1-TRACK_Y1;
- tx2 = x2-TRACK_X1+1;
- ty2 = y2-TRACK_Y1;
-
- if (tx1 < 0) tx1 = 0;
- if (ty1 < 0) ty1 = 0;
- if (tx2 > TRACK_WIDTH-1) tx2 = TRACK_WIDTH-1;
- if (ty2 > TRACK_HEIGHT-1) ty2 = TRACK_HEIGHT-1;
-
- tx1 = max(tx1,0);
- ty1 = max(ty1,0);
- tx2 = min(tx2,TRACK_WIDTH-1);
- ty2 = min(ty2,TRACK_HEIGHT-1);
-
- addr = &track_img[0] + tx1 + TRACK_WIDTH * ty1;
-
- x1 = max(0,x1);
- y1 = max(0,y1);
-
- for (y = y1; y <= y2; y++) {
- grx_putimage(x1+1, y, x2, y, addr);
- addr += TRACK_WIDTH;
- }
-}
-
-/* ------------------------------------------------------------------ */
-
-void put_transimage(int x1, int y1, int x2, int y2, BYTE *img, int car_color,
- int color)
-{
- int x,y;
- BYTE *addr;
- addr = img;
-
-
- for (y = y1; y < y2; y++) {
- for ( x = x1; x < x2; x++, addr++) {
- if (*addr != color) {
- if (*addr == 26)
- grx_plot(x,y,car_color);
- else
- grx_plot(x,y,*addr);
-
- }
- }
- addr++;
- }
-}
-
-/* ------------------------------------------------------------------ */
-
-void show_display(int rs, int ca, float speed, float max_speed,
- float acc, float max_acc) {
- point hw, mx, mz; // three road states
- point tl, ct, tr; // three car alignments
- point sp1, sp2; // speed display coordinates
- point ap1, ap2; // acceleration display coordinates
- int s_amp = 0;
- int a_amp = 0;
-
- /* Leds coordinates */
- hw.x = 10;
- hw.y = SCREEN_HEIGHT-50;
- mx.x = 25;
- mx.y = SCREEN_HEIGHT-50;
- mz.x = 40;
- mz.y = SCREEN_HEIGHT-50;
- tl.x = 10;
- tl.y = SCREEN_HEIGHT-35;
- ct.x = 25;
- ct.y = SCREEN_HEIGHT-35;
- tr.x = 40;
- tr.y = SCREEN_HEIGHT-35;
- sp1.x = 10;
- sp1.y = SCREEN_HEIGHT-75;
- sp2.x = 110;
- sp2.y = SCREEN_HEIGHT-65;
- ap1.x = 10;
- ap1.y = SCREEN_HEIGHT-90;
- ap2.x = 110;
- ap2.y = SCREEN_HEIGHT-80;
-
- sem_wait(&grx_mutex);
-
- /* Writes out controller titles */
- grx_text("Road", mz.x+15, mz.y, YELLOW, BLACK);
- grx_text("Curve", tr.x+15, tr.y, YELLOW, BLACK);
- switch (rs)
- {
- case HIGHWAY:
- grx_box(hw.x, hw.y, hw.x+10, hw.y+10, GREEN);
- grx_box(mx.x, mx.y, mx.x+10, mx.y+10, BLACK);
- grx_box(mz.x, mz.y, mz.x+10, mz.y+10, BLACK);
- break;
- case MIXED:
- grx_box(hw.x, hw.y, hw.x+10, hw.y+10, BLACK);
- grx_box(mx.x, mx.y, mx.x+10, mx.y+10, YELLOW);
- grx_box(mz.x, mz.y, mz.x+10, mz.y+10, BLACK);
- break;
- case MAZE:
- grx_box(hw.x, hw.y, hw.x+10, hw.y+10, BLACK);
- grx_box(mx.x, mx.y, mx.x+10, mx.y+10, BLACK);
- grx_box(mz.x, mz.y, mz.x+10, mz.y+10, RED);
- break;
- }
-
- switch (ca)
- {
- case TOO_LEFT:
- grx_box(tl.x, tl.y, tl.x+10, tl.y+10, RED);
- grx_box(ct.x, ct.y, ct.x+10, ct.y+10, BLACK);
- grx_box(tr.x, tr.y, tr.x+10, tr.y+10, BLACK);
- break;
- case TOO_RIGHT:
- grx_box(tl.x, tl.y, tl.x+10, tl.y+10, BLACK);
- grx_box(ct.x, ct.y, ct.x+10, ct.y+10, BLACK);
- grx_box(tr.x, tr.y, tr.x+10, tr.y+10, BLUE);
- break;
- default:
- grx_box(tl.x, tl.y, tl.x+10, tl.y+10, BLACK);
- grx_box(ct.x, ct.y, ct.x+10, ct.y+10, WHITE);
- grx_box(tr.x, tr.y, tr.x+10, tr.y+10, BLACK);
- }
-
- /* Draws speed display */
- grx_text("Speed", sp1.x+120, sp1.y, YELLOW, BLACK);
- grx_rect(sp1.x-1, sp1.y-1, sp2.x+1, sp2.y+1, GREEN);
- /* Updates speed display */
- grx_box(sp1.x, sp1.y, sp2.x, sp2.y, BLACK);
- s_amp = round( (speed * (float)(sp2.x-sp1.x)) / max_speed );
- grx_box(sp1.x, sp1.y, sp1.x+s_amp, sp2.y, LIGHTGRAY);
-
- /* Draws acceleration display */
- grx_text("Acceleration", ap1.x+120, ap1.y, YELLOW, BLACK);
- grx_rect(ap1.x-1, ap1.y-1, ap2.x+1, ap2.y+1, GREEN);
- /* Updates acceleration display */
- grx_box(ap1.x, ap1.y, ap2.x, ap2.y, BLACK);
- a_amp = round( (float)acc * (float)((ap2.x-ap1.x)/2) / (float)max_acc );
- if (a_amp >= 0)
- grx_box((ap1.x+ap2.x)/2, ap1.y, ((ap1.x+ap2.x)/2)+a_amp, ap2.y, LIGHTGRAY);
- else
- grx_box((ap1.x+ap2.x)/2+a_amp, ap1.y, ((ap1.x+ap2.x)/2), ap2.y, LIGHTGRAY);
- grx_line((ap1.x+ap2.x)/2, ap1.y-2, (ap1.x+ap2.x)/2, ap2.y+2, WHITE);
- sem_post(&grx_mutex);
-}
-
-
-
-
-
-
-
-
-
-
-
-
Index: demos/branches/pj/auto/initfil3.c
===================================================================
--- demos/branches/pj/auto/initfil3.c (revision 1085)
+++ demos/branches/pj/auto/initfil3.c (nonexistent)
@@ -1,107 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: initfil3.c,v 1.1.1.1 2002-09-02 09:37:42 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:42 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "kernel/kern.h"
-#include "edfact.h"
-#include "modules/cbs.h"
-#include "modules/rr.h"
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-#include "drivers/keyb.h"
-
-/*+ sysyem tick in us +*/
-#define TICK 0
-
-/*+ RR tick in us +*/
-#define RRTICK 2000
-
-void read_track(int);
-void read_sprites();
-
-int argc;
-char *argv[100];
-int main(int argc, char **argv);
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- EDFACT_register_level(0);
- CBS_register_level(0, 0);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- dummy_register_level();
-
- SEM_register_module();
-
- CABS_register_module();
-
- __compute_args__(mb, &argc, argv);
-
- if (argc == 2)
- read_track(strtoi(argv[1], 10, NULL));
- else
- read_track(2);
-
- read_sprites();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- KEYB_PARMS kparms = BASE_KEYB;
-
- HARTPORT_init();
-
- keyb_def_ctrlC(kparms, NULL);
- KEYB_init(&kparms);
-
- return (void *) main(argc,argv);
-}
Index: demos/branches/pj/auto/edfact.c
===================================================================
--- demos/branches/pj/auto/edfact.c (revision 1085)
+++ demos/branches/pj/auto/edfact.c (nonexistent)
@@ -1,735 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: edfact.c,v 1.1.1.1 2002-09-02 09:37:42 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:42 $
- ------------
-**/
-
-/*
- * Copyright (C) 2001 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "edfact.h"
-#include <ll/stdio.h>
-#include <ll/string.h>
-#include <kernel/model.h>
-#include <kernel/descr.h>
-#include <kernel/var.h>
-#include <kernel/func.h>
-#include <kernel/trace.h>
-
-//#define edfact_printf kern_printf
-#define edfact_printf printk
-
-/*+ Status used in the level +*/
-#define EDFACT_READY MODULE_STATUS_BASE /*+ - Ready status +*/
-#define EDFACT_IDLE MODULE_STATUS_BASE+4 /*+ to wait the deadline +*/
-
-/*+ flags +*/
-#define EDFACT_FLAG_NORAISEEXC 2
-
-/*+ the level redefinition for the Earliest Deadline First level +*/
-typedef struct {
- level_des l; /*+ the standard level descriptor +*/
-
- TIME period[MAX_PROC]; /*+ The task periods; the deadlines are
- stored in the priority field +*/
- int deadline_timer[MAX_PROC];
- /*+ The task deadline timers +*/
-
- struct timespec deadline_timespec[MAX_PROC];
-
- int dline_miss[MAX_PROC]; /*+ Deadline miss counter +*/
- int wcet_miss[MAX_PROC]; /*+ Wcet miss counter +*/
-
- int nact[MAX_PROC]; /*+ Wcet miss counter +*/
-
- int flag[MAX_PROC];
- /*+ used to manage the JOB_TASK_MODEL and the
- periodicity +*/
-
- QUEUE ready; /*+ the ready queue +*/
-
- int flags; /*+ the init flags... +*/
-
- bandwidth_t U; /*+ the used bandwidth +*/
-
-} EDFACT_level_des;
-
-
-static void EDFACT_timer_deadline(void *par);
-
-static void EDFACT_internal_activate(EDFACT_level_des *lev, PID p)
-{
- TIMESPEC_ASSIGN(&proc_table[p].timespec_priority,
- &proc_table[p].request_time);
- ADDUSEC2TIMESPEC(lev->period[p], &proc_table[p].timespec_priority);
-
- TIMESPEC_ASSIGN(&lev->deadline_timespec[p],
- &proc_table[p].timespec_priority);
-
- /* Insert task in the correct position */
- proc_table[p].status = EDFACT_READY;
- q_timespec_insert(p,&lev->ready);
-
- /* needed because when there is a wcet miss I disable CONTROL_CAP */
- proc_table[p].control |= CONTROL_CAP;
-}
-
-static char *EDFACT_status_to_a(WORD status)
-{
- if (status < MODULE_STATUS_BASE)
- return status_to_a(status);
-
- switch (status) {
- case EDFACT_READY : return "EDFACT_Ready";
- case EDFACT_IDLE : return "EDFACT_Idle";
- default : return "EDFACT_Unknown";
- }
-}
-
-static void EDFACT_timer_deadline(void *par)
-{
- PID p = (PID) par;
- EDFACT_level_des *lev;
-
- lev = (EDFACT_level_des *)level_table[proc_table[p].task_level];
-
- switch (proc_table[p].status) {
- case EDFACT_IDLE:
- edfact_printf("I%d",p);
- TIMESPEC_ASSIGN(&proc_table[p].request_time,
- &proc_table[p].timespec_priority);
-
- EDFACT_internal_activate(lev,p);
-
- event_need_reschedule();
- break;
-
- default:
- edfact_printf("D%d",p);
- /* else, a deadline miss occurred!!! */
- lev->dline_miss[p]++;
-
- /* the task is into another state */
- lev->nact[p]++;
-
- /* Set the deadline timer */
- ADDUSEC2TIMESPEC(lev->period[p], &lev->deadline_timespec[p]);
- }
-
- /* Set the deadline timer */
- lev->deadline_timer[p] = kern_event_post(&lev->deadline_timespec[p],
- EDFACT_timer_deadline,
- (void *)p);
-
-}
-
-static void EDFACT_timer_guest_deadline(void *par)
-{
- PID p = (PID) par;
-
- edfact_printf("AAARRRGGGHHH!!!");
- kern_raise(XDEADLINE_MISS,p);
-}
-
-static int EDFACT_level_accept_task_model(LEVEL l, TASK_MODEL *m)
-{
- if (m->pclass == HARD_PCLASS || m->pclass == (HARD_PCLASS | l)) {
- HARD_TASK_MODEL *h = (HARD_TASK_MODEL *)m;
-
- if (h->wcet && h->mit && h->periodicity == PERIODIC)
- return 0;
- }
-
- return -1;
-}
-
-static int EDFACT_level_accept_guest_model(LEVEL l, TASK_MODEL *m)
-{
- if (m->pclass == JOB_PCLASS || m->pclass == (JOB_PCLASS | l))
- return 0;
- else
- return -1;
-}
-
-
-static char *onoff(int i)
-{
- if (i)
- return "On ";
- else
- return "Off";
-}
-
-static void EDFACT_level_status(LEVEL l)
-{
- EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
- PID p = lev->ready;
-
- kern_printf("On-line guarantee : %s\n",
- onoff(lev->flags & EDFACT_ENABLE_GUARANTEE));
- kern_printf("Used Bandwidth : %u/%u\n",
- lev->U, MAX_BANDWIDTH);
-
- while (p != NIL) {
- if ((proc_table[p].pclass) == JOB_PCLASS)
- kern_printf("Pid: %2d (GUEST)\n", p);
- else
- kern_printf("Pid: %2d Name: %10s %s: %9d Dline: %9d.%6d Stat: %s\n",
- p,
- proc_table[p].name,
- "Period ",
- lev->period[p],
- proc_table[p].timespec_priority.tv_sec,
- proc_table[p].timespec_priority.tv_nsec/1000,
- EDFACT_status_to_a(proc_table[p].status));
- p = proc_table[p].next;
- }
-
- for (p=0; p<MAX_PROC; p++)
- if (proc_table[p].task_level == l && proc_table[p].status != EDFACT_READY
- && proc_table[p].status != FREE )
- kern_printf("Pid: %2d Name: %10s %s: %9d Dline: %9d.%6d Stat: %s\n",
- p,
- proc_table[p].name,
- "Period ",
- lev->period[p],
- proc_table[p].timespec_priority.tv_sec,
- proc_table[p].timespec_priority.tv_nsec/1000,
- EDFACT_status_to_a(proc_table[p].status));
-}
-
-/* The scheduler only gets the first task in the queue */
-static PID EDFACT_level_scheduler(LEVEL l)
-{
- EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
-
-/* { // print 4 dbg the ready queue
- PID p= lev->ready;
- kern_printf("(s");
- while (p != NIL) {
- kern_printf("%d ",p);
- p = proc_table[p].next;
- }
- kern_printf(") ");
- }
- */
- return (PID)lev->ready;
-}
-
-/* The on-line guarantee is enabled only if the appropriate flag is set... */
-static int EDFACT_level_guarantee(LEVEL l, bandwidth_t *freebandwidth)
-{
- EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
-
- if (lev->flags & EDFACT_FAILED_GUARANTEE) {
- *freebandwidth = 0;
- return 0;
- }
- else
- if (*freebandwidth >= lev->U) {
- *freebandwidth -= lev->U;
- return 1;
- }
- else
- return 0;
-
-}
-
-static int EDFACT_task_create(LEVEL l, PID p, TASK_MODEL *m)
-{
- EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
-
- /* if the EDFACT_task_create is called, then the pclass must be a
- valid pclass. */
-
- HARD_TASK_MODEL *h = (HARD_TASK_MODEL *)m;
-
- lev->period[p] = h->mit;
-
- lev->flag[p] = 0;
- lev->deadline_timer[p] = -1;
- lev->dline_miss[p] = 0;
- lev->wcet_miss[p] = 0;
- lev->nact[p] = 0;
-
- /* Enable wcet check */
- proc_table[p].avail_time = h->wcet;
- proc_table[p].wcet = h->wcet;
- proc_table[p].control |= CONTROL_CAP;
-
- /* update the bandwidth... */
- if (lev->flags & EDFACT_ENABLE_GUARANTEE) {
- bandwidth_t b;
- b = (MAX_BANDWIDTH / h->mit) * h->wcet;
-
- /* really update lev->U, checking an overflow... */
- if (MAX_BANDWIDTH - lev->U > b)
- lev->U += b;
- else
- /* The task can NOT be guaranteed (U>MAX_BANDWIDTH)...
- in this case, we don't raise an exception... in fact, after the
- EDFACT_task_create the task_create will call level_guarantee that return
- -1... return -1 in EDFACT_task_create isn't correct, because:
- . generally, the guarantee must be done when also the resources
- are registered
- . returning -1 will cause the task_create to return with an errno
- ETASK_CREATE instead of ENO_GUARANTEE!!!
-
- Why I use the flag??? because if the lev->U overflows, if i.e. I set
- it to MAX_BANDWIDTH, I lose the correct allocated bandwidth...
- */
- lev->flags |= EDFACT_FAILED_GUARANTEE;
- }
-
- return 0; /* OK, also if the task cannot be guaranteed... */
-}
-
-static void EDFACT_task_detach(LEVEL l, PID p)
-{
- /* the EDFACT level doesn't introduce any dinamic allocated new field.
- we have only to reset the NO_GUARANTEE FIELD and decrement the allocated
- bandwidth */
-
- EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
-
- if (lev->flags & EDFACT_FAILED_GUARANTEE)
- lev->flags &= ~EDFACT_FAILED_GUARANTEE;
- else
- lev->U -= (MAX_BANDWIDTH / lev->period[p]) * proc_table[p].wcet;
-}
-
-static int EDFACT_task_eligible(LEVEL l, PID p)
-{
- return 0; /* if the task p is chosen, it is always eligible */
-}
-
-static void EDFACT_task_dispatch(LEVEL l, PID p, int nostop)
-{
- EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
-
- /* the task state is set EXE by the scheduler()
- we extract the task from the ready queue
- NB: we can't assume that p is the first task in the queue!!! */
- q_extract(p, &lev->ready);
-}
-
-static void EDFACT_task_epilogue(LEVEL l, PID p)
-{
- EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
-
- /* check if the wcet is finished... */
- if (proc_table[p].avail_time <= 0 && proc_table[p].control&CONTROL_CAP) {
- /* wcet finished: disable wcet event and count wcet miss */
- edfact_printf("W%d",p);
- proc_table[p].control &= ~CONTROL_CAP;
- lev->wcet_miss[p]++;
- }
-
- /* the task it returns into the ready queue... */
- q_timespec_insert(p,&lev->ready);
- proc_table[p].status = EDFACT_READY;
-}
-
-static void EDFACT_task_activate(LEVEL l, PID p)
-{
- EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
-
- /* Test if we are trying to activate a non sleeping task */
- /* save activation (only if needed... */
- if (proc_table[p].status != SLEEP) {
- /* a periodic task cannot be activated when it is already active */
- kern_raise(XACTIVATION,p);
- return;
- }
-
- ll_gettime(TIME_EXACT, &proc_table[p].request_time);
-
- EDFACT_internal_activate(lev,p);
-
- /* Set the deadline timer */
- lev->deadline_timer[p] = kern_event_post(&lev->deadline_timespec[p],
- EDFACT_timer_deadline,
- (void *)p);
-
-}
-
-static void EDFACT_task_insert(LEVEL l, PID p)
-{
- EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
-
- /* Insert task in the coEDFect position */
- proc_table[p].status = EDFACT_READY;
- q_timespec_insert(p,&lev->ready);
-}
-
-static void EDFACT_task_extract(LEVEL l, PID p)
-{
-}
-
-static void EDFACT_task_endcycle(LEVEL l, PID p)
-{
- EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
-
-
- /* we reset the capacity counters... */
- proc_table[p].avail_time = proc_table[p].wcet;
-
- if (lev->nact[p] > 0) {
- edfact_printf("E%d",p);
-
- /* Pending activation: reactivate the thread!!! */
- lev->nact[p]--;
-
- /* see also EDFACT_timer_deadline */
- ll_gettime(TIME_EXACT, &proc_table[p].request_time);
-
- EDFACT_internal_activate(lev,p);
-
- /* check if the deadline has already expired */
- if (TIMESPEC_A_LT_B(&proc_table[p].timespec_priority, &schedule_time)) {
- /* count the deadline miss */
- lev->dline_miss[p]++;
- event_delete(lev->deadline_timer[p]);
- }
-
- }
- else {
- edfact_printf("e%d",p);
-
- /* the task has terminated his job before it consume the wcet. All OK! */
- proc_table[p].status = EDFACT_IDLE;
-
- /* when the deadline timer fire, it recognize the situation and set
- correctly all the stuffs (like reactivation, request_time, etc... ) */
- }
-}
-
-static void EDFACT_task_end(LEVEL l, PID p)
-{
- EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
-
- edfact_printf("Û%d",p);
-
- /* we finally put the task in the ready queue */
- proc_table[p].status = FREE;
- q_insertfirst(p,&freedesc);
- /* and free the allocated bandwidth */
- lev->U -= (MAX_BANDWIDTH/lev->period[p]) * proc_table[p].wcet;
-
- if (lev->deadline_timer[p] != -1) {
- edfact_printf("²%d",p);
- event_delete(lev->deadline_timer[p]);
- }
-}
-
-static void EDFACT_task_sleep(LEVEL l, PID p)
-{ kern_raise(XUNVALID_TASK,exec_shadow); }
-
-static void EDFACT_task_delay(LEVEL l, PID p, TIME usdelay)
-{ kern_raise(XUNVALID_TASK,exec_shadow); }
-
-/* Guest Functions
- These functions manages a JOB_TASK_MODEL, that is used to put
- a guest task in the EDFACT ready queue. */
-
-static int EDFACT_guest_create(LEVEL l, PID p, TASK_MODEL *m)
-{
- EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
- JOB_TASK_MODEL *job = (JOB_TASK_MODEL *)m;
-
- /* if the EDFACT_guest_create is called, then the pclass must be a
- valid pclass. */
-
- TIMESPEC_ASSIGN(&proc_table[p].timespec_priority, &job->deadline);
-
- lev->deadline_timer[p] = -1;
- lev->dline_miss[p] = 0;
- lev->wcet_miss[p] = 0;
- lev->nact[p] = 0;
-
- if (job->noraiseexc)
- lev->flag[p] = EDFACT_FLAG_NORAISEEXC;
- else
- lev->flag[p] = 0;
-
- lev->period[p] = job->period;
-
- /* there is no bandwidth guarantee at this level, it is performed
- by the level that inserts guest tasks... */
-
- return 0; /* OK, also if the task cannot be guaranteed... */
-}
-
-static void EDFACT_guest_detach(LEVEL l, PID p)
-{
- /* the EDFACT level doesn't introduce any dinamic allocated new field.
- No guarantee is performed on guest tasks... so we don't have to reset
- the NO_GUARANTEE FIELD */
-}
-
-static void EDFACT_guest_dispatch(LEVEL l, PID p, int nostop)
-{
- EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
-
- /* the task state is set to EXE by the scheduler()
- we extract the task from the ready queue
- NB: we can't assume that p is the first task in the queue!!! */
- q_extract(p, &lev->ready);
-}
-
-static void EDFACT_guest_epilogue(LEVEL l, PID p)
-{
- EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
-
- /* the task has been preempted. it returns into the ready queue... */
- q_timespec_insert(p,&lev->ready);
- proc_table[p].status = EDFACT_READY;
-}
-
-static void EDFACT_guest_activate(LEVEL l, PID p)
-{
- EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
-
- /* Insert task in the correct position */
- q_timespec_insert(p,&lev->ready);
- proc_table[p].status = EDFACT_READY;
-
- /* Set the deadline timer */
- if (!(lev->flag[p] & EDFACT_FLAG_NORAISEEXC))
- lev->deadline_timer[p] = kern_event_post(&proc_table[p].timespec_priority,
- EDFACT_timer_guest_deadline,
- (void *)p);
-
-}
-
-static void EDFACT_guest_insert(LEVEL l, PID p)
-{
- EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
-
- /* Insert task in the correct position */
- q_timespec_insert(p,&lev->ready);
- proc_table[p].status = EDFACT_READY;
-}
-
-static void EDFACT_guest_extract(LEVEL l, PID p)
-{
-}
-
-static void EDFACT_guest_endcycle(LEVEL l, PID p)
-{ kern_raise(XUNVALID_GUEST,exec_shadow); }
-
-static void EDFACT_guest_end(LEVEL l, PID p)
-{
- EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
-
- //kern_printf("EDFACT_guest_end: dline timer %d\n",lev->deadline_timer[p]);
- if (proc_table[p].status == EDFACT_READY)
- {
- q_extract(p, &lev->ready);
- //kern_printf("(g_end rdy extr)");
- }
-
- /* we remove the deadline timer, because the slice is finished */
- if (lev->deadline_timer[p] != NIL) {
-// kern_printf("EDFACT_guest_end: dline timer %d\n",lev->deadline_timer[p]);
- event_delete(lev->deadline_timer[p]);
- lev->deadline_timer[p] = NIL;
- }
-
-}
-
-static void EDFACT_guest_sleep(LEVEL l, PID p)
-{ kern_raise(XUNVALID_GUEST,exec_shadow); }
-
-static void EDFACT_guest_delay(LEVEL l, PID p, TIME usdelay)
-{ kern_raise(XUNVALID_GUEST,exec_shadow); }
-
-/* Registration functions */
-
-/*+ Registration function:
- int flags the init flags ... see EDFACT.h +*/
-void EDFACT_register_level(int flags)
-{
- LEVEL l; /* the level that we register */
- EDFACT_level_des *lev; /* for readableness only */
- PID i; /* a counter */
-
- printk("EDFACT_register_level\n");
-
- /* request an entry in the level_table */
- l = level_alloc_descriptor();
-
- printk(" alloco descrittore %d %d\n",l,(int)sizeof(EDFACT_level_des));
-
- /* alloc the space needed for the EDFACT_level_des */
- lev = (EDFACT_level_des *)kern_alloc(sizeof(EDFACT_level_des));
-
- printk(" lev=%d\n",(int)lev);
-
- /* update the level_table with the new entry */
- level_table[l] = (level_des *)lev;
-
- /* fill the standard descriptor */
- strncpy(lev->l.level_name, EDFACT_LEVELNAME, MAX_LEVELNAME);
- lev->l.level_code = EDFACT_LEVEL_CODE;
- lev->l.level_version = EDFACT_LEVEL_VERSION;
-
- lev->l.level_accept_task_model = EDFACT_level_accept_task_model;
- lev->l.level_accept_guest_model = EDFACT_level_accept_guest_model;
- lev->l.level_status = EDFACT_level_status;
- lev->l.level_scheduler = EDFACT_level_scheduler;
-
- if (flags & EDFACT_ENABLE_GUARANTEE)
- lev->l.level_guarantee = EDFACT_level_guarantee;
- else
- lev->l.level_guarantee = NULL;
-
- lev->l.task_create = EDFACT_task_create;
- lev->l.task_detach = EDFACT_task_detach;
- lev->l.task_eligible = EDFACT_task_eligible;
- lev->l.task_dispatch = EDFACT_task_dispatch;
- lev->l.task_epilogue = EDFACT_task_epilogue;
- lev->l.task_activate = EDFACT_task_activate;
- lev->l.task_insert = EDFACT_task_insert;
- lev->l.task_extract = EDFACT_task_extract;
- lev->l.task_endcycle = EDFACT_task_endcycle;
- lev->l.task_end = EDFACT_task_end;
- lev->l.task_sleep = EDFACT_task_sleep;
- lev->l.task_delay = EDFACT_task_delay;
-
- lev->l.guest_create = EDFACT_guest_create;
- lev->l.guest_detach = EDFACT_guest_detach;
- lev->l.guest_dispatch = EDFACT_guest_dispatch;
- lev->l.guest_epilogue = EDFACT_guest_epilogue;
- lev->l.guest_activate = EDFACT_guest_activate;
- lev->l.guest_insert = EDFACT_guest_insert;
- lev->l.guest_extract = EDFACT_guest_extract;
- lev->l.guest_endcycle = EDFACT_guest_endcycle;
- lev->l.guest_end = EDFACT_guest_end;
- lev->l.guest_sleep = EDFACT_guest_sleep;
- lev->l.guest_delay = EDFACT_guest_delay;
-
- /* fill the EDFACT descriptor part */
- for(i=0; i<MAX_PROC; i++) {
- lev->period[i] = 0;
- lev->deadline_timer[i] = -1;
- lev->flag[i] = 0;
- lev->dline_miss[i] = 0;
- lev->wcet_miss[i] = 0;
- lev->nact[i] = 0;
- }
-
- lev->ready = NIL;
- lev->flags = flags & 0x07;
- lev->U = 0;
-}
-
-bandwidth_t EDFACT_usedbandwidth(LEVEL l)
-{
- EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
- if (lev->l.level_code == EDFACT_LEVEL_CODE &&
- lev->l.level_version == EDFACT_LEVEL_VERSION)
- return lev->U;
- else
- return 0;
-}
-
-int EDFACT_get_dline_miss(PID p)
-{
- LEVEL l = proc_table[p].task_level;
- EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
- if (lev->l.level_code == EDFACT_LEVEL_CODE &&
- lev->l.level_version == EDFACT_LEVEL_VERSION)
- return lev->dline_miss[p];
- else
- return -1;
-}
-
-int EDFACT_get_wcet_miss(PID p)
-{
- LEVEL l = proc_table[p].task_level;
- EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
- if (lev->l.level_code == EDFACT_LEVEL_CODE &&
- lev->l.level_version == EDFACT_LEVEL_VERSION)
- return lev->wcet_miss[p];
- else
- return -1;
-}
-
-int EDFACT_get_nact(PID p)
-{
- LEVEL l = proc_table[p].task_level;
- EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
- if (lev->l.level_code == EDFACT_LEVEL_CODE &&
- lev->l.level_version == EDFACT_LEVEL_VERSION)
- return lev->nact[p];
- else
- return -1;
-}
-
-int EDFACT_reset_dline_miss(PID p)
-{
- LEVEL l = proc_table[p].task_level;
- EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
- if (lev->l.level_code == EDFACT_LEVEL_CODE &&
- lev->l.level_version == EDFACT_LEVEL_VERSION)
- {
- lev->dline_miss[p] = 0;
- return 0;
- }
- else
- return -1;
-}
-
-int EDFACT_reset_wcet_miss(PID p)
-{
- LEVEL l = proc_table[p].task_level;
- EDFACT_level_des *lev = (EDFACT_level_des *)(level_table[l]);
- if (lev->l.level_code == EDFACT_LEVEL_CODE &&
- lev->l.level_version == EDFACT_LEVEL_VERSION)
- {
- lev->wcet_miss[p] = 0;
- return 0;
- }
- else
- return -1;
-}
-
Index: demos/branches/pj/auto/tracks.c
===================================================================
--- demos/branches/pj/auto/tracks.c (revision 1085)
+++ demos/branches/pj/auto/tracks.c (nonexistent)
@@ -1,111 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * Massimiliano Giorgi <massy@gandalf.sssup.it>
- * Luca Abeni <luca@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-
-/**
- ------------
- CVS : $Id: tracks.c,v 1.1.1.1 2002-09-02 09:37:42 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:42 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Marco Dallera and Marco Fiocca
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * AUTO
- *
- * Another Unuseful Track simulatOr
- *
- * Authors: Marco Dallera
- * Marco Fiocca
- *
- */
-
-/* -------------- */
-/* Track loader */
-/* -------------- */
-
-#include "include/auto.h"
-#include "include/const.h"
-
-track track_list[TRACK_NUMBER];
-
-int track_init()
-{
- track demo1;
- track demo2;
- track brazil;
- track monaco;
-
- strcpy(demo1.name, "demo1.raw");
- demo1.pole_pos.x = 150;
- demo1.pole_pos.y = 35;
- demo1.pole_orient = 0.0;
- demo1.lap = CLOCK;
- demo1.selected = 0;
-
- strcpy(demo2.name, "demo2.raw");
- demo2.pole_pos.x = 150;
- demo2.pole_pos.y = 30;
- demo2.pole_orient = 0.0;
- demo2.lap = CLOCK;
- demo2.selected = 0;
-
- strcpy(brazil.name, "brazil.raw");
- brazil.pole_pos.x = 140;
- brazil.pole_pos.y = 185;
- brazil.pole_orient = 225.0;
- brazil.lap = ANTICLOCK;
- brazil.selected = 0;
-
- strcpy(monaco.name, "monaco.raw");
- monaco.pole_pos.x = 35;
- monaco.pole_pos.y = 315;
- monaco.pole_orient = 85.0;
- monaco.lap = CLOCK;
- monaco.selected = 0;
-
- track_list[0] = demo1;
- track_list[1] = demo2;
- track_list[2] = brazil;
- track_list[3] = monaco;
-
- return 0;
-}
Index: demos/branches/pj/myapp2/myapp.c
===================================================================
--- demos/branches/pj/myapp2/myapp.c (revision 1085)
+++ demos/branches/pj/myapp2/myapp.c (nonexistent)
@@ -1,55 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
- *
- * Authors : Paolo Gai <pj@hartik.sssup.it>
- * (see authors.txt for full list of hartik's authors)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-// if you want to use some functions, types, task models provided
-// by your new module
-
-#include "mymod.h"
-
-// then, include any file you want here
-
-// then, the classic C-style function
-int main(int argc, char **argv)
-{
- // ... your stuff here
- return 0;
-}
-
-
-
-
-
-
-
-
Index: demos/branches/pj/myapp2/readme.txt
===================================================================
--- demos/branches/pj/myapp2/readme.txt (revision 1085)
+++ demos/branches/pj/myapp2/readme.txt (nonexistent)
@@ -1,7 +0,0 @@
-This is a template application, and it DOES NOTHING!!!
-
-This is only an example package.
-
-Please refer to the How To Compile reference guide for more informations.
-
-Paolo
Index: demos/branches/pj/myapp2/makefile
===================================================================
--- demos/branches/pj/myapp2/makefile (revision 1085)
+++ demos/branches/pj/myapp2/makefile (nonexistent)
@@ -1,16 +0,0 @@
-#
-#
-#
-
-ifndef BASE
-BASE=..
-endif
-include $(BASE)/config/config.mk
-
-PROGS= $(APP)
-
-include $(BASE)/config/example.mk
-
-$(APP):
- make -f $(SUBMAKE) INIT=hartik3.o OTHEROBJS=
-
Index: demos/branches/pj/slsh/makefile
===================================================================
--- demos/branches/pj/slsh/makefile (revision 1085)
+++ demos/branches/pj/slsh/makefile (nonexistent)
@@ -1,16 +0,0 @@
-#
-#
-#
-
-ifndef BASE
-BASE=../..
-endif
-
-include $(BASE)/config/config.mk
-
-PROGS=slshtest
-
-include $(BASE)/config/example.mk
-
-slshtest:
- make -f $(SUBMAKE) APP=slshtest INIT= OTHEROBJS="slshinit.o slsh.o" OTHERINCL=
Index: demos/branches/pj/slsh/slshinit.c
===================================================================
--- demos/branches/pj/slsh/slshinit.c (revision 1085)
+++ demos/branches/pj/slsh/slshinit.c (nonexistent)
@@ -1,117 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: slshinit.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:41 $
- ------------
-
- System initialization file
-
- The tick is set to TICK ms.
-
- This file contains the 2 functions needed to initialize the system.
-
- These functions register the following levels:
-
- a Slot Shifting level
- a Dummy level
-
- It can accept these task models:
-
- STATIC_TASK_MODEL
- HARD_TASK_MODEL(aperiodic)
- SOFT_TASK_MODEL
-
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-
-#include "kernel/kern.h"
-#include "slsh.h"
-#include "modules/rr2.h"
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "drivers/keyb.h"
-#include "modules/dummy.h"
-
-/*+ sysyem tick in us +*/
-#define TICK 300
-
-/* define RR tick in us*/
-#define RRTICK 10000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- SLSH_register_level();
- RR2_register_level(RRTICK, RR2_MAIN_YES, mb);
- dummy_register_level();
-
- SEM_register_module();
-
- return TICK;
-}
-
-NRT_TASK_MODEL nrt;
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- KEYB_PARMS k = BASE_KEYB;
-
- nrt_task_default_model(nrt);
- keyb_def_task(k,&nrt);
-
-
-
- HARTPORT_init();
-
- KEYB_init(NULL);
-
- __call_main__(mb);
-
- return 0;
-}
-
-
Index: demos/branches/pj/slsh/slsh.h
===================================================================
--- demos/branches/pj/slsh/slsh.h (revision 1085)
+++ demos/branches/pj/slsh/slsh.h (nonexistent)
@@ -1,205 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * Massimiliano Giorgi <massy@gandalf.sssup.it>
- * Luca Abeni <luca@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-
-/**
- ------------
- CVS : $Id: slsh.h,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:41 $
- ------------
- Author: Tomas Lennvall, Date: Feb 2000.
-
- This file contains the scheduling module for Slot shifting.
-
- Title:
- Slot Shifting
-
- Task Models Accepted:
- STATIC_TASK_MODEL - Periodic Hard tasks that are scheduled by
- an off-line scheduler, so that all guarantees regarding precedence, mutex
- deadline violation is taken care of. The tasks are in an executione schedule,
- that is the order in when they become ready. They have the following fields:
- est (earliest start time), wcet and absolute deadline.
-
- HARD_TASK_MODEL - Hard Tasks (Hard aperiodic requests)
- wcet field and drel field must be != 0. They are used to set the wcet
- and deadline of the tasks.
- periodicity field must be APERIODIC
- mit field is ignored.
-
- SOFT_TASK_MODEL - Soft Tasks (Unspecified tasks)
- wcet field must be != 0. periodicity filed must be APERIODIC
- period and met filed is ignored.
-
- Guest Models Accepted:
- NONE - Slot shifting handles all tasks by itself (at this moment).
-
- Description:
- This module schedules the offline scheduled tasks according to the slot-
- shifting paradigm, dividing time into slots of a fixed length and assigning
- tasks to execute in those slots. Slot-shifting also keeps track of the free
- bandwidth in the schedule by using disjoint intervals and sc (spare capacity).
- Each interval has a sc nr that represents the free bandwidth in that interval,
- the sc can be used by hard aperiodic tasks, static tasks from later interval or
- soft aperiodic tasks. Hard aperiodic tasks are guaranteed an incorporated in
- the schedule by reduction of sc before they execute. No guarantee is
- performed on the soft aperiodic tasks, they are run when no other task wants
- to execute and sc is available.
-
- Description:
- This module implements the Slot shifting algorithm, by Gerhard Fohler. Slot shifting
- schedules off-line scheduled tasks and also handles hard aperiodic requests by the
- guarantee alorithm. Slot shifting can also handle soft aperiodic tasks,
- called unspecified. That is tasks without a deadline.
-
- Exceptions raised:
- These exceptions are pclass-dependent...
- XDEADLINE_MISS
- If a task miss his deadline, the exception is raised.
-
- XWCET_VIOLATION
- If a task doesn't end the current cycle before if consume the wcet,
- an exception is raised, and the task is put in the EDF_WCET_VIOLATED
- state. To reactivate it, use EDF_task_activate via task_activate or
- manage directly the EDF data structure. Note that the exception is not
- handled properly, an XDEADLINE_MISS exeeption will also be raised at
- the period end...
-
- Restrictions & special features:
- - This level doesn't manage the main task.
- - At init time we can choose if the level have to activate
- . the wcet check
- (If a task require more time than declared, it is stopped and put in
- the state EDF_WCET_VIOLATED; a XWCET_VIOLATION exception is raised)
- . the task guarantee algorithm
- (when all task are created the system will check that the task_set
- will not use more than the available bandwidth)
- - The level use the priority and timespec_priority fields.
- - A function to return the used bandwidth of a level is provided.
- - The guest tasks don't provide the guest_endcycle function
-
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-#ifndef __SLSH_H__
-#define __SLSH_H__
-
-#include <ll/ll.h>
-#include <kernel/config.h>
-#include <sys/types.h>
-#include <kernel/types.h>
-#include <modules/codes.h>
-
-#define STATIC_PCLASS 0x0500
-
-#define SLSH_LEVELNAME "Slot Shifting"
-#define SLSH_LEVEL_CODE 5
-#define SLSH_LEVEL_VERSION 1
-
-
-
-/* -----------------------------------------------------------------------
- STATIC_TASK_MODEL: offline scheduled Tasks
- ----------------------------------------------------------------------- */
-/* Offline-scheduled tasks are hard periodic tasks that have been
- scheduled before runtime. All guarantees are made by the off-
- line scheduler so the tasks are already guaranteed.
-*/
-
-typedef struct {
- TASK_MODEL t;
- TIME est;
- TIME wcet;
- TIME dabs;
- int interval; /* used in slot shifting */
-} STATIC_TASK_MODEL;
-
-#define static_task_default_model(m) \
- task_default_model((m).t,STATIC_PCLASS), \
- (m).est = -1, \
- (m).dabs = 0, \
- (m).wcet = 0, \
- (m).interval = -1;
-#define static_task_def_level(m,l) task_def_level((m).t,l)
-#define static_task_def_arg(m,a) task_def_arg((m).t,a)
-#define static_task_def_stack(m,s) task_def_stack((m).t,s)
-#define static_task_def_group(m,g) task_def_group((m).t,g)
-#define static_task_def_usemath(m) task_def_usemath((m).t)
-#define static_task_def_system(m) task_def_system((m).t)
-#define static_task_def_nokill(m) task_def_nokill((m).t)
-#define static_task_def_ctrl_jet(m) task_def_ctrl_jet((m).t)
-#define static_task_def_est(m,p) (m).est = (p)
-#define static_task_def_dabs(m,d) (m).dabs = (d)
-#define static_task_def_wcet(m,w) (m).wcet = (w)
-#define static_task_def_interval(m,i) (m).interval = (i)
-#define static_task_def_trace(m) task_def_trace((m).t)
-#define static_task_def_notrace(m) task_def_notrace((m).t)
-
-
-
-
-/*#define min(a, b) ((a) < (b) ? (a) : (b))*/
-
-#define TIME2TIMESPEC(T, TS) \
-( \
- ((TS).tv_sec = ((T)/1000000)), \
- ((TS).tv_nsec = (((T)%1000000) * 1000)), \
- (TS) \
-)
-
-/* define the interval struct */
-typedef struct {
- int start; /* start of interval */
- int end; /* end of interval */
- int length; /* Length of interval */
- int maxt; /* maximum execution time in interval */
- int sc; /* spare capacity in interval */
-} SLSH_interval;
-
-/*+ Registration function: */
-void SLSH_register_level();
-
-void SLSH_set_interval(LEVEL l, int start, int end, int maxt);
-void SLSH_set_variables(LEVEL l, TIME length);
-
-#endif
-
Index: demos/branches/pj/slsh/slshtest.c
===================================================================
--- demos/branches/pj/slsh/slshtest.c (revision 1085)
+++ demos/branches/pj/slsh/slshtest.c (nonexistent)
@@ -1,173 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * Massimiliano Giorgi <massy@gandalf.sssup.it>
- * Luca Abeni <luca@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: slshtest.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:41 $
- ------------
-
- Slot shifting test
-
-
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai and Tomas Lennvall
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include <kernel/config.h>
-#include "kernel/kern.h"
-#include "slsh.h"
-#include "drivers/keyb.h"
-
-/* a slot length of 100 ms */
-#define SLOT_LENGTH 100000
-
-
-TASK static1(void)
-{
- int i = 0;
-
- kern_printf("Static1\n");
- while(sys_gettime(NULL) < 10000) i++;
-
- return 0;
-}
-
-TASK static2(void)
-{
- int i = 0;
-
- kern_printf("Static2\n");
- while(sys_gettime(NULL) < 10000) i++;
-
- return 0;
-}
-
-
-TASK static3(void)
-{
- kern_printf("Static3\n");
-
- return 0;
-}
-
-void my_end(KEY_EVT *e)
-{
- sys_end();
-}
-
-int main(int argc, char** argv)
-{
- STATIC_TASK_MODEL s;
- // HARD_TASK_MODEL h_aper;
- // SOFT_TASK_MODEL u;
- PID p1,p2,p3;
- struct timespec x;
-
- KEY_EVT emerg;
-
- kern_cli();
- x.tv_sec=5;
- kern_event_post(&x,(void (*)(void *))sys_end,NULL);
- kern_sti();
-
- //keyb_set_map(itaMap);
- emerg.ascii = 'x';
- emerg.scan = KEY_X;
- emerg.flag = ALTL_BIT;
- keyb_hook(emerg,my_end);
-
- /* set som variables in the scheduling level */
- SLSH_set_interval(0, 0, 8, 5);
- SLSH_set_interval(0, 8, 17, 7);
- SLSH_set_interval(0, 17, 20, 1);
-
- SLSH_set_variables(0, SLOT_LENGTH);
-
- static_task_default_model(s);
- static_task_def_group(s, 1);
-
- /* define time i ms */
- /* static1 task */
- static_task_def_est(s, 0);
- static_task_def_dabs(s, 800000);
- static_task_def_wcet(s, 500000);
- static_task_def_interval(s, 0);
-
- kern_printf("In main, before task creation\n");
-
- p1 = task_create("Static 1", static1, &s, NULL);
- if(p1 == NIL)
- kern_printf("Cannot create: Static1!\n");
-
- /* Static2 task */
- static_task_def_est(s, 800000);
- static_task_def_dabs(s, 1700000);
- static_task_def_wcet(s, 700000);
- static_task_def_interval(s, 1);
-
- p2 = task_create("Static 2", static2, &s, NULL);
- if(p2 == NIL)
- kern_printf("Cannot create: Static2!\n");
-
- /* Static3 task */
- static_task_def_est(s, 1700000);
- static_task_def_dabs(s, 2000000);
- static_task_def_wcet(s, 100000);
- static_task_def_interval(s, 2);
-
-
- p3 = task_create("Static3", static3, &s, NULL);
- if(p3 == NIL)
- kern_printf("Cannot create: Static3!\n");
-
-
- /* End task */
- /*hard_task_default_model(h_aper);
-
-
- hard_task_def_wcet(h_aper, 100000);
- */
- kern_printf("After task creation\n");
-
- group_activate(1);
-
- return 0;
-}
Index: demos/branches/pj/slsh/slsh.c
===================================================================
--- demos/branches/pj/slsh/slsh.c (revision 1085)
+++ demos/branches/pj/slsh/slsh.c (nonexistent)
@@ -1,842 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * Massimiliano Giorgi <massy@gandalf.sssup.it>
- * Luca Abeni <luca@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: slsh.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:41 $
- ------------
-
- This file contains the scheduling module for Slot-Shifting.
-
- Read slsh.h for further details.
-
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-#include "slsh.h"
-#include <ll/stdio.h>
-#include <ll/stdlib.h>
-#include <ll/string.h>
-#include <ll/math.h> /* for ceil(...) */
-#include <ll/ll.h> /* for memcpy(...) */
-#include <kernel/model.h>
-#include <kernel/descr.h>
-#include <kernel/var.h>
-#include <kernel/func.h>
-
-//#define eslsh_printf kern_printf
-#define slsh_printf printk
-
-/* Keeps information about static and guaranteed tasks */
-typedef struct {
- int est;
- int dabs;
- int interval;
-} SLSH_task;
-
-/*+ Status used in the level +*/
-#define SLSH_READY MODULE_STATUS_BASE
-#define SLSH_WAIT MODULE_STATUS_BASE + 1
-#define SLSH_IDLE MODULE_STATUS_BASE + 2
-#define SLSH_WCET_VIOLATED MODULE_STATUS_BASE + 3
-
-/*+ defines +*/
-#define MAX_INTERVALS 1000 /* 1000 intervals is max, for now */
-
-/******+ the level redefinition for the SLOT SHIFT level +*******/
-typedef struct {
- level_des l; /*+ the standard level descriptor+*/
-
- /* task lists */
- SLSH_task tasks[MAX_PROC]; /* est and dl's for static and guaranteed task */
-
- QUEUE idle_statics; /* finished static tasks */
-
- QQUEUE unspecified; /* tasks with only a wcet */
-
- /* the Intervals list */
- SLSH_interval intervals[MAX_INTERVALS];
- int current; /* current interval */
- int last; /* last interval */
-
- int slot; /* slot shifting time */
- TIME slot_length; /* slothlength in real system time*/
- int LCM; /* length (in slots) of ofline schedule */
-
- int slot_event; /* save the event */
-} SLSH_level_des;
-
-
-/* Which task models the Slot-Shifting module accepts */
-static int SLSH_level_accept_task_model(LEVEL l, TASK_MODEL* m)
-{
- HARD_TASK_MODEL* h;
- SOFT_TASK_MODEL* s;
-
- /* Check the models */
- switch(m->pclass)
- {
- case STATIC_PCLASS: /* offline scheduled tasks */
- return 0;
- case HARD_PCLASS: /* hard aperiodic tasks */
- h = (HARD_TASK_MODEL *) m;
- if(h->drel != 0 && h->wcet != 0) /* must be set */
- return 0;
- break;
- case SOFT_PCLASS: /* soft aperiodic tasks */
- s = (SOFT_TASK_MODEL *) m;
- if(s->wcet != 0) /* must be set */
- return 0;
- break;
- default:
- }
-
- return -1; /* Not accepted model */
-}
-
-
-static void SLSH_level_status(LEVEL l)
-{
- kern_printf("Level status not implemented\n");
-}
-
-/* check if some tasks are ready, return 0 if ready, -1 otherwise */
-static int SLSH_R(SLSH_task* tasks)
-{
- int s;
-
- /* for all static tasks */
- for(s = 0; tasks[s].est != -1; ++s)
- {
- if(proc_table[s].status == SLSH_READY)
- return 0;
- }
- return -1;
-}
-
-/* check if unspecified exists, return 0 if it exists, -1 otherwise */
-static int SLSH_T(QQUEUE unspecified)
-{
- if(unspecified.first != NIL)
- return 0;
- else
- return -1;
-}
-
-/* return the sc in an interval */
-static int SLSH_sc(SLSH_interval* intervals, int i)
-{
- return intervals[i].sc;
-}
-/* return a static task from current interval or a guaranted task */
-static PID SLSH_staticOrGuaranteed(SLSH_level_des* lev)
-{
- int lowest_dl = 0; /* lowest dl found */
- PID pid = 0; /* static or guaranteed task */
- int t;
-
- /* Decide according to EDF, go through all static & guaranteed tasks */
- for(t = 0; t < MAX_PROC; ++t)
- {
- /* static tasks */
- if(proc_table[t].pclass == STATIC_PCLASS)
- {
- /* static task must belong to current interval */
- if(lev->tasks[t].interval == lev->current)
- {
- /* only ready tasks */
- if(proc_table[t].status == SLSH_READY)
- {
- /* a new lower dl was found */
- if(lev->tasks[t].dabs < lowest_dl)
- {
- lowest_dl = lev->tasks[t].dabs;
- pid = t;
- }
- }
- }
- } /* guaranteed tasks */
- else if(proc_table[t].pclass == HARD_PCLASS)
- {
- /* only ready tasks */
- if(proc_table[t].status == SLSH_READY)
- {
- /* a new lower dl was found */
- if(lev->tasks[t].dabs < lowest_dl)
- {
- lowest_dl = lev->tasks[t].dabs;
- pid = t;
- }
- }
- }
- }/* for all tasks */
-
- return pid;
-}
-
-/* return a static task among the candidates, all ready statics */
-static PID SLSH_candidates(SLSH_task* tasks)
-{
- int lowest_dl = 0;
- PID pid;
- int t;
-
- /* Use the EDL algorithm again to decide which task to run */
- for(t = 0; t < MAX_PROC; ++t)
- {
- /* only static tasks */
- if(proc_table[t].pclass == STATIC_PCLASS)
- {
- /* only ready tasks */
- if(proc_table[t].status == SLSH_READY)
- {
- /* a new lower dl was found */
- if(tasks[t].dabs < lowest_dl)
- {
- lowest_dl = tasks[t].dabs;
- pid = t;
- }
- }/* all ready tasks */
- }/* all static tasks */
- }/* for all tasks */
-
- return pid;
-}
-
-/* decrease the sc in a interval by amount */
-void SLSH_decSc(SLSH_interval* intervals, int i, int amount)
-{
- intervals[i].sc -= amount;
-}
-
-void SLSH_incSc(SLSH_interval* intervals, int i, int amount)
-{
- intervals[i].sc += amount;
-}
-
-/* swap the sc between intervals, also consider intervals with negative sc */
-void SLSH_swapSc(SLSH_interval* intervals, int current, int task_interval)
-{
- /* decrease the sc in the current interval */
- SLSH_decSc(intervals, current, 1);
-
- /* update the other interval(s) */
- if(intervals[task_interval].sc < 0) /* negative sc */
- {
- /* special case, increase next interval sc by 1 and also current interval (borrowing) */
- if(task_interval == current + 1)
- {
- SLSH_incSc(intervals, task_interval, 1);
- SLSH_incSc(intervals, current, 1);
- }
- else /* increase every interval sc that is negative between current and task_interval */
- {
- while(task_interval > current && intervals[task_interval].sc < 0)
- {
- SLSH_incSc(intervals, task_interval, 1);
- task_interval--;
- }
- }
- }
- else /* ordinary swapping */
- SLSH_incSc(intervals, task_interval, 1);
-}
-
-/* The scheduler, decides which task to run. */
-static PID SLSH_level_scheduler(LEVEL l)
-{
- SLSH_level_des* lev = (SLSH_level_des *)(level_table[l]);
- PID pid;
-
- /* The scheduler choses among static, guaranteed (hard aperiodic) and
- unspecified (soft aperiodic) tasks */
- /* no ready tasks and no sc, execute idle task */
- if(SLSH_R(lev->tasks) == 0 && SLSH_sc(lev->intervals, lev->current) == 0)
- return NIL;
- /* must execute a static from current intervall or a guaranteed task */
- else if(SLSH_R(lev->tasks) > 0 && SLSH_sc(lev->intervals, lev->current) == 0)
- return SLSH_staticOrGuaranteed(lev);
- /* sc available... */
- else if(SLSH_R(lev->tasks) > 0 && SLSH_sc(lev->intervals, lev->current) > 0)
- {
- /* If unspecified exist, execute it according to FIFO order */
- if(SLSH_T(lev->unspecified) == 0)
- {
- SLSH_decSc(lev->intervals, lev->current, 1); /* decrease sc by 1 */
- return (PID)qq_getfirst(&lev->unspecified);
- }
- else /* No unspecified, execute task from candidates (statics) */
- {
- pid = SLSH_candidates(lev->tasks);
-
- /* sc needs to be swapped */
- if(lev->tasks[pid].interval != lev->current)
- SLSH_swapSc(lev->intervals, lev->tasks[pid].interval, lev->current);
-
- return pid;
- }
- }
-
- kern_printf("(SLSH s)");
- return NIL;
-}
-
-/* not used, slot-shifting handles all guarantees itself, it handles all bandwidth */
-static int SLSH_level_guarantee(LEVEL l, bandwidth_t *freebandwidth)
-{
- *freebandwidth = 0;
- return 1;
-}
-
-/* get the interval that x is in */
-static int SLSH_getInterval(SLSH_interval* intervals, int x, int last)
-{
- int i;
-
- /* search through the intervals */
- for(i = 0; i <= last; ++i)
- {
- /* I is in the interval where start is smaller or equal and end is bigger */
- if(intervals[i].start <= x && x < intervals[i].end)
- return i;
- }
- return -1;
-}
-
-/* get the start of the interval I */
-static int SLSH_intervalStart(SLSH_interval* intervals, int I)
-{
- return intervals[I].start;
-}
-
-/* split interval I into two parts, slow because of copying. OBS!!! no check if there is
- enough space in the intervals array */
-static void SLSH_splitInterval(SLSH_level_des* lev, int I, int dabs)
-{
- SLSH_interval left_interval;
- int i;
-
-
- lev->last++;
-
- /* move every interval above and including I */
- for(i = lev->last; i > I; --i)
- memcpy(&lev->intervals[i], &lev->intervals[i - 1], sizeof(SLSH_interval));
-
- /* Left interval start, end and length */
- left_interval.start = lev->intervals[I].start;
- left_interval.end = dabs;
- left_interval.length = left_interval.end - left_interval.start;
-
- /* Right interval (uses old interval struct) start and length end remains as the old value */
- lev->intervals[I + 1].start = dabs;
- lev->intervals[I + 1].length = lev->intervals[I + 1].end - lev->intervals[I + 1].start;
-
- /* check if sc still exists in the right interval */
- if(lev->intervals[I + 1].length - lev->intervals[I + 1].maxt > 0)
- {
- lev->intervals[I + 1].sc = lev->intervals[I + 1].length - lev->intervals[I + 1].maxt;
- left_interval.sc = left_interval.length; /* the whole interval is free, for now... */
- }
- else /* no sc in the right interval */
- {
- lev->intervals[I + 1].maxt = lev->intervals[I + 1].length;
- left_interval.sc = lev->intervals[I + 1].sc; /* all sc in left interval */
- lev->intervals[I + 1].sc = 0;
- }
-
- /* insert the new interval */
- memcpy(&lev->intervals[I], &left_interval, sizeof(SLSH_interval));
-}
-
-/* Reduce the sc from back to front by the wcet amount, interval splitting may be neccesary */
-static void SLSH_updateSc(SLSH_level_des* lev, HARD_TASK_MODEL* h)
-{
- int dabs = ceil((lev->slot + h->drel)/lev->slot_length); /* absolute deadline of request */
- int dabs_interval = SLSH_getInterval(lev->intervals, dabs, lev->last); /* interval where dabs is */
- int C = ceil(h->wcet/lev->slot_length); /* amount of sc to reduce */
- int sc = 0;
- int i;
-
- /* check if interval splitting is neccesary */
- if(lev->intervals[dabs_interval].end != dabs)
- SLSH_splitInterval(lev, dabs_interval, dabs);
-
- /* decrease sc in all intervals that are neccesary from dabs_interval o current */
- for(i = dabs_interval; i >= lev->current && C > 0; --i)
- {
- if((sc = SLSH_sc(lev->intervals, i)) >= 0) /* only decrease where sc exists */
- {
- if(sc > C) /* the last sc dec */
- {
- SLSH_decSc(lev->intervals, i, C);
- C = 0;
- }
- else /* to little sc in this interval, decrease it to 0 */
- {
- C -= SLSH_sc(lev->intervals, i);
- SLSH_decSc(lev->intervals, i, SLSH_sc(lev->intervals, i));
- }
- }
- }/* for all intervals */
-}
-
-/* the guarantee algorithm for hard aperiodic requests */
-static int SLSH_guarantee(SLSH_level_des* lev, HARD_TASK_MODEL* h)
-{
- int total_sc = 0;
- int temp, i;
- int dabs = ceil((lev->slot + h->drel)/lev->slot_length); /* absolute deadline of request */
- int dabs_interval = SLSH_getInterval(lev->intervals, dabs, lev->last); /* interval where dabs is */
-
- /* check if the sc up until request deadline is >= request wcet */
- /* 1. the sc of the current interal */
- total_sc = SLSH_sc(lev->intervals, lev->current);
-
- /* 2. the sc for all whole intervals between current and the interval
- with the request deadline */
- for(i = (lev->current) + 1; i < dabs_interval; ++i)
- {
- if((temp = SLSH_sc(lev->intervals, i)) > 0)
- total_sc += temp;
- }
-
- /* 3. the min of sc or the execution need in the last interval */
- total_sc += min(SLSH_sc(lev->intervals, dabs_interval),
- dabs - SLSH_intervalStart(lev->intervals,
- dabs_interval));
-
- if(total_sc >= h->wcet)
- { /* update the sc in the intervals from back to front */
- SLSH_updateSc(lev, h);
- return 0;
- }
- else
- return -1;
-}
-
-/* check if task model is accepted and store nessecary parameters */
-static int SLSH_task_create(LEVEL l, PID p, TASK_MODEL *m)
-{
- SLSH_level_des *lev = (SLSH_level_des *)(level_table[l]);
- STATIC_TASK_MODEL* s;
- HARD_TASK_MODEL* h;
- SOFT_TASK_MODEL* u;
-
- /* if the SLSH_task_create is called, then the pclass must be a
- valid pclass. Slot-shifting accepts STATIC_TASK, HARD_TASK
- and SOFT_TASK models with some restrictions */
-
- /* est, dl and wcet is saved in slotlengths */
- switch(m->pclass)
- {
- case STATIC_PCLASS: /* offline scheduled tasks */
- s = (STATIC_TASK_MODEL *) m;
- lev->tasks[p].est = ceil(s->est/lev->slot_length);
- lev->tasks[p].dabs = ceil(s->dabs/lev->slot_length);
- lev->tasks[p].interval = s->interval;
- proc_table[p].avail_time = s->wcet;
- proc_table[p].wcet = s->wcet;
- break;
- case HARD_PCLASS: /* hard aperiodic tasks */
- h = (HARD_TASK_MODEL *) m;
- if(SLSH_guarantee(lev, h) == 0)
- {
- /* convert drel to dabs */
- lev->tasks[p].dabs = ceil((lev->slot + h->drel)/lev->slot_length);
- proc_table[p].avail_time = h->wcet;
- proc_table[p].wcet = h->wcet;
- }
- else /* task not guaranteed */
- return -1;
- break;
- case SOFT_PCLASS:
- u = (SOFT_TASK_MODEL *) m;
- proc_table[p].avail_time = u->wcet;
- proc_table[p].wcet = u->wcet;
- qq_insertlast(p, &lev->unspecified); /* respect FIFO order */
- break;
- default: /* a task model not supported */
- return -1;
- }
- /* enable wcet check in the kernel */
- proc_table[p].control |= CONTROL_CAP;
-
- return 0;
-}
-
-static void SLSH_task_detach(LEVEL l, PID p)
-{
- /* do nothing */
-}
-
-/* check if a task chosen by scheduler is correct */
-static int SLSH_task_eligible(LEVEL l, PID p)
-{
- return 0; /* if the task p is chosen, it is always eligible */
-}
-
-/************* The slot end event handler *************/
-static void SLSH_slot_end(void* p)
-{
- SLSH_level_des* lev = (SLSH_level_des *) p;
- PID pid;
- int i;
-
- /* increase slot "time" by 1 */
- if(lev->slot < lev->LCM)
- {
- lev->slot++;
- /* check if new statics are ready */
- for(i = 0; lev->tasks[i].interval != -1; ++i)
- {
- if(lev->tasks[i].est <= lev->slot && proc_table[i].status == SLSH_WAIT)
- proc_table[i].status = SLSH_READY;
- }
-
- /* check if current (interval) needs updating */
- if(lev->current < SLSH_getInterval(lev->intervals, lev->slot, lev->last))
- lev->current++;
-
- }
- else /* restart from the beginning of the offline schedule */
- {
- lev->slot = 0;
-
- while((pid = q_getfirst(&lev->idle_statics)) != NIL)
- {
- if(lev->tasks[pid].est <= lev->slot)
- proc_table[pid].status = SLSH_READY;
- else
- proc_table[pid].status = SLSH_WAIT;
- }
- }
-
- /* call for a rescheduling, reset event flag and increase slot by 1 */
- lev->slot_event = -1;
- kern_printf("*");
- event_need_reschedule();
-}
-
-/* when a task becomes executing (EXE status) */
-static void SLSH_task_dispatch(LEVEL l, PID pid, int nostop)
-{
- SLSH_level_des *lev = (SLSH_level_des *)(level_table[l]);
- struct timespec t;
-
- /* the task state is set EXE by the scheduler()
- we extract the task from the unspecified queue.
- NB: we can't assume that p is the first task in the queue!!! */
-
- if(proc_table[pid].pclass == SOFT_PCLASS)
- qq_extract(pid, &lev->unspecified);
-
- /* also start the timer for one slot length */
- lev->slot_event = kern_event_post(&TIME2TIMESPEC(lev->slot_length, t),
- SLSH_slot_end, (void*) lev);
-}
-
-/* called when task is moved from EXE status */
-static void SLSH_task_epilogue(LEVEL l, PID pid)
-{
- SLSH_level_des *lev = (SLSH_level_des *)(level_table[l]);
-
- /* check if the wcet is finished... */
- if (proc_table[pid].avail_time <= 0)
- {
- /* if it is, raise a XWCET_VIOLATION exception */
- kern_raise(XWCET_VIOLATION, pid);
- proc_table[pid].status = SLSH_WCET_VIOLATED;
- }
- else /* the end of a slot. the task returns into the ready queue... */
- {
- if(proc_table[pid].pclass == SOFT_PCLASS)
- qq_insertfirst(pid,&lev->unspecified);
-
- proc_table[pid].status = SLSH_READY;
- }
-}
-
-/* when task go from SLEEP to SLSH_READY or SLSH_WAIT */
-static void SLSH_task_activate(LEVEL l, PID pid)
-{
- SLSH_level_des *lev = (SLSH_level_des *)(level_table[l]);
- WORD type = proc_table[pid].pclass;
-
- /* Test if we are trying to activate a non sleeping task */
- /* Ignore this; the task is already active */
- if (proc_table[pid].status != SLEEP && proc_table[pid].status != SLSH_WCET_VIOLATED)
- return;
-
- /* make task ready or waiting, dependong on slot (the time) for static tasks only*/
- if(type == STATIC_PCLASS && lev->tasks[pid].est <= lev->slot)
- proc_table[pid].status = SLSH_READY;
- else
- proc_table[pid].status = SLSH_WAIT;
-
- if(type == HARD_PCLASS)
- proc_table[pid].status = SLSH_READY;
-
- /* insert unspecified tasks in QQUEUE and make it ready */
- if(type == SOFT_PCLASS)
- {
- qq_insertlast(pid ,&lev->unspecified);
- proc_table[pid].status = SLSH_READY;
- }
-}
-
-/* when a task i returned to module from a semaphore, mutex ... */
-static void SLSH_task_insert(LEVEL l, PID pid)
-{
- SLSH_level_des *lev = (SLSH_level_des *)(level_table[l]);
-
- /* change staus of task */
- proc_table[pid].status = SLSH_READY;
-
- if(proc_table[pid].pclass == SOFT_PCLASS)
- qq_insertfirst(pid ,&lev->unspecified);
-}
-
-/* when a semaphore, mutex ... taskes a task from module */
-static void SLSH_task_extract(LEVEL l, PID pid)
-{
- /* Extract the running task from the level
- . we have already extract it from the ready queue at the dispatch time.
- . the capacity event have to be removed by the generic kernel
- . the wcet don't need modification...
- . the state of the task is set by the calling function
- . the deadline must remain...
-
- So, we do nothing!!!
- */
-}
-
-/* task has finished execution for this period */
-static void SLSH_task_endcycle(LEVEL l, PID pid)
-{
- /* do nothing */
-}
-
-/* the task has finihed its wcet, kill task (dont kill static tasks) */
-static void SLSH_task_end(LEVEL l, PID pid)
-{
- SLSH_level_des *lev = (SLSH_level_des *)(level_table[l]);
-
- if(proc_table[pid].pclass == SOFT_PCLASS)
- {
- if (proc_table[pid].status == SLSH_READY)
- qq_extract(pid, &lev->unspecified);
- }
- else if(proc_table[pid].pclass == HARD_PCLASS)
- {
- if (proc_table[pid].status == SLSH_READY)
- lev->tasks[pid].dabs = 0;
-
- }
- /* static tasks: put them in idle QUEUE, reset status and avail_time */
- else if(proc_table[pid].pclass == STATIC_PCLASS)
- {
- proc_table[pid].avail_time = proc_table[pid].wcet;
- proc_table[pid].status = SLSH_IDLE;
- q_insert(pid, &lev->idle_statics);
- }
-
- proc_table[pid].status = FREE;
-}
-
-/* called when a task should sleep but not execute for awhile, mabe a mode change */
-static void SLSH_task_sleep(LEVEL l, PID pid)
-{
-
- /* the task has terminated his job before it consume the wcet. All OK! */
- proc_table[pid].status = SLEEP;
-
- /* we reset the capacity counters... only for static tasks */
- if (proc_table[pid].pclass == STATIC_PCLASS)
- proc_table[pid].avail_time = proc_table[pid].wcet;
-
-}
-
-static void SLSH_task_delay(LEVEL l, PID p, TIME usdelay) { }
-
-/** Guest Functions, slot shifing accepts no guests, so all generates exceptions **/
-
-static int SLSH_level_accept_guest_model(LEVEL l, TASK_MODEL* m) { return -1; }
-
-static int SLSH_guest_create(LEVEL l, PID p, TASK_MODEL *m)
-{ kern_raise(XUNVALID_GUEST,exec_shadow); return 0; }
-
-static void SLSH_guest_detach(LEVEL l, PID p)
-{ kern_raise(XUNVALID_GUEST,exec_shadow); }
-
-static void SLSH_guest_dispatch(LEVEL l, PID p, int nostop)
-{ kern_raise(XUNVALID_GUEST,exec_shadow); }
-
-static void SLSH_guest_epilogue(LEVEL l, PID p)
-{ kern_raise(XUNVALID_GUEST,exec_shadow); }
-
-static void SLSH_guest_activate(LEVEL l, PID p)
-{ kern_raise(XUNVALID_GUEST,exec_shadow); }
-
-static void SLSH_guest_insert(LEVEL l, PID p)
-{ kern_raise(XUNVALID_GUEST,exec_shadow); }
-
-static void SLSH_guest_extract(LEVEL l, PID p)
-{ kern_raise(XUNVALID_GUEST,exec_shadow); }
-
-static void SLSH_guest_endcycle(LEVEL l, PID p)
-{ kern_raise(XUNVALID_GUEST,exec_shadow); }
-
-static void SLSH_guest_end(LEVEL l, PID p)
-{ kern_raise(XUNVALID_GUEST,exec_shadow); }
-
-static void SLSH_guest_sleep(LEVEL l, PID p)
-{ kern_raise(XUNVALID_GUEST,exec_shadow); }
-
-static void SLSH_guest_delay(LEVEL l, PID p, TIME usdelay)
-{ kern_raise(XUNVALID_GUEST,exec_shadow); }
-
-/******* Registration functions *******/
-
-/*+ Registration function: */
-void SLSH_register_level()
-{
- LEVEL l; /* the level that we register */
- SLSH_level_des *lev; /* for readableness only */
- PID i; /* a counter */
-
- kern_printf("SLSH_register_level\n");
-
- /* request an entry in the level_table */
- l = level_alloc_descriptor();
-
- /* alloc the space needed for the EDF_level_des */
- lev = (SLSH_level_des *)kern_alloc(sizeof(SLSH_level_des));
-
- /* update the level_table with the new entry */
- level_table[l] = (level_des *)lev;
-
- /* fill the standard descriptor */
- strncpy(lev->l.level_name, SLSH_LEVELNAME, MAX_LEVELNAME);
-
- lev->l.level_code = SLSH_LEVEL_CODE;
- lev->l.level_version = SLSH_LEVEL_VERSION;
-
- lev->l.level_accept_task_model = SLSH_level_accept_task_model;
- lev->l.level_accept_guest_model = SLSH_level_accept_guest_model;
- lev->l.level_status = SLSH_level_status;
- lev->l.level_scheduler = SLSH_level_scheduler;
-
- lev->l.level_guarantee = SLSH_level_guarantee;
-
- lev->l.task_create = SLSH_task_create;
- lev->l.task_detach = SLSH_task_detach;
- lev->l.task_eligible = SLSH_task_eligible;
- lev->l.task_dispatch = SLSH_task_dispatch;
- lev->l.task_epilogue = SLSH_task_epilogue;
- lev->l.task_activate = SLSH_task_activate;
- lev->l.task_insert = SLSH_task_insert;
- lev->l.task_extract = SLSH_task_extract;
- lev->l.task_endcycle = SLSH_task_endcycle;
- lev->l.task_end = SLSH_task_end;
- lev->l.task_sleep = SLSH_task_sleep;
- lev->l.task_delay = SLSH_task_delay;
-
- lev->l.guest_create = SLSH_guest_create;
- lev->l.guest_detach = SLSH_guest_detach;
- lev->l.guest_dispatch = SLSH_guest_dispatch;
- lev->l.guest_epilogue = SLSH_guest_epilogue;
- lev->l.guest_activate = SLSH_guest_activate;
- lev->l.guest_insert = SLSH_guest_insert;
- lev->l.guest_extract = SLSH_guest_extract;
- lev->l.guest_endcycle = SLSH_guest_endcycle;
- lev->l.guest_end = SLSH_guest_end;
- lev->l.guest_sleep = SLSH_guest_sleep;
- lev->l.guest_delay = SLSH_guest_delay;
-
- /* fill the SLSH descriptor part */
- for(i = 0; i < MAX_PROC; i++)
- {
- lev->tasks[i].est = -1;
- lev->tasks[i].dabs = 0;
- lev->tasks[i].interval = -1;
- }
-
- for(i = 0; i < MAX_INTERVALS; i++)
- {
- lev->intervals[i].start = -1;
- lev->intervals[i].end = -1;
- lev->intervals[i].length = 0;
- lev->intervals[i].maxt = 0;
- lev->intervals[i].sc = 0;
- }
-
- lev->current = 0;
- lev->last = NIL;
- lev->slot = 0;
- lev->slot_length = 0;
- lev->slot_event = -1;
-}
-
-
-void SLSH_set_interval(LEVEL l, int start, int end, int maxt)
-{
- SLSH_level_des* lev = (SLSH_level_des *)(level_table[l]);
- static int i = -1;
-
- i++;
- lev->intervals[i].start = start;
- lev->intervals[i].end = end;
- lev->intervals[i].length = end - start;
- lev->intervals[i].maxt = maxt;
- lev->intervals[i].sc = lev->intervals[i].length - maxt;
-
- lev->last = i;
-}
-
-void SLSH_set_variables(LEVEL l, TIME length)
-{
- SLSH_level_des* lev = (SLSH_level_des *)(level_table[l]);
-
- lev->slot_length = length;
-}
Index: demos/branches/pj/slsh/readme.txt
===================================================================
--- demos/branches/pj/slsh/readme.txt (revision 1085)
+++ demos/branches/pj/slsh/readme.txt (nonexistent)
@@ -1,6 +0,0 @@
-This Example has been made by Tomas Lenvall.
-
-There is not a lot of documentation available, so if you have problems please
-send an e-mail to Tomas ( mailto:tlv@mdh.se )
-
-Paolo
Index: demos/branches/pj/eli/eli.c
===================================================================
--- demos/branches/pj/eli/eli.c (revision 1085)
+++ demos/branches/pj/eli/eli.c (nonexistent)
@@ -1,782 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: eli.c,v 1.1.1.1 2002-09-02 09:37:45 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:45 $
- ------------
-
- This file is similar to the configuration of Hartik 3.3.1
-
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai and ALLEN-DESTRO
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "eli.h"
-
-
-//########################################
-// Definizione variabili globali
-//########################################
-char tastiera;
-long double Forza_x,Forza_y,Velocita_x,Velocita_y,Acc_x,Acc_y,Pos_x,Pos_y;
-long double Pos_pe_y[5];
-long double Pos_pe_x[5];
-long double T1=0;
-long double r;
-int n_peso=0;
-int peso_agganciato[5]={0,0,0,0,0};
-int pre_peso[5]={0,0,0,0,0};
-int libero_peso[5]={0,0,0,0,0};
-PID pid_peso[5];
-PID pid_ruspa[5];
-int x_r=200;
-int n_ruspa=5;
-int indietro;
-int eli_occ=0;
-int kill_p;
-
-//PID pid_r0,pid_r1,pid_r2,pid_r3,pid_r4;
-PID pid_kill_p,pid_pulisci_p,pid_kill_e,pid_pulisci_e;
-
-
-// Definizione del semaforo per l'utilizzo della modalita' grafica
-sem_t mutex;
-sem_t pu;
-
-
-
-
-//#######################################################################
-//############### DEFINIZIONE TASK ######################################
-//#######################################################################
-
-TASK kill_task(int i)
-{ int x,y,dim;
- while (1)
- {
-
- if(i==1)
- {
- x=Pos_pe_x[kill_p];
- y=Pos_pe_y[kill_p];
- dim=25;
- }
- else
- {
- x=Pos_x;
- y=Pos_y;
- dim=35;
- }
-
- PULISCI(x,y,dim);
- ESPLOSIONE(x,y);
-
- sem_wait(&pu);
-
- if(i==1) task_activate(pid_pulisci_p);
- else task_activate(pid_pulisci_e);
-
- task_endcycle();
-
- }
-
-
-}
-
-TASK pulisci(int i)
-{ int x,y,dim;
- while (1)
- {
-
- if(i==1)
- {
- x=Pos_pe_x[kill_p];
- y=Pos_pe_y[kill_p];
- dim=25;
- }
- else
- {
- x=Pos_x;
- y=Pos_y;
- dim=35;
- }
-
-
- task_delay(3000);
- PULISCI(x,y,dim);
-
- sem_post(&pu);
-
- task_endcycle();
- }
-}
-
-
-
-
-TASK elicottero(int i)
-{ long double x_old,x_new,y_old,y_new;
- TIME us_old,us_new;
- long double delta_T;
- long double Fx,Fy,Ax,Ay,Vx,Vy,m_el;
- int Destra_old,Destra_new;
- // int uccidi,colore;
- // int prova;
-
- m_el=1;
- Vx=0;Vy=0;
- Ax=0;Ay=0;
- Fx=0;Fy=0-m_el*G; // Fy=0;
- x_old=150;
- y_old=150;
- Destra_old=1;
- Destra_new=1;
-
- us_old=sys_gettime(NULL);
-
- while (1)
- {
-
- // prova=2;
-
-
- us_new=sys_gettime(NULL);
- delta_T=(us_new-us_old)/100000;
- // if(delta_T<0.9) prova=1;
- // if(delta_T<0) prova=4;
- // if(delta_T>1.1) prova=3;
-
-
- delta_T=1;
- Ax=(Fx-(r*Vx))/m_el;
- Ay=(Fy-(r*Vy)+m_el*G+T1)/m_el;
- x_new=x_old+Vx*delta_T+0.5*Ax*delta_T*delta_T;
- y_new=y_old+Vy*delta_T+0.5*Ay*delta_T*delta_T;
-
- // if(prova==1) {x_new=300; y_new=150;}
- // if(prova==3) {x_new=150; y_new=300;}
- // if(prova==2) {x_new=300; y_new=300;}
- // if(prova==4) {x_new=400; y_new=400;}
-
- Vx=Vx+Ax*delta_T;
- Vy=Vy+Ay*delta_T;
- if ((Vx>0)|| ((Vx==0) && (Destra_old==1))) Destra_new=1;
- else Destra_new=0;
-
- if ( ((y_new>=(Y0max-DIM_EL/2-2)) || ( (y_old<=400-DIM_EL/2-2) && (y_new>=400-DIM_EL/2-2) && (x_new>=X0min+151) && (x_new<=X0min+280) )) )
- {
- if ((x_new>=X0min+151) && (x_new<=X0min+280)) y_new=400-DIM_EL/2-2;
- else y_new=Y0max-DIM_EL/2-2;
- Vy=0;
- Vx=0;
- x_new=x_old;
- Ay=0;
- Ax=0;
- }
-
-
-
-
- sem_wait(&mutex);
-
- /*
- uccidi=0;
-
- colore=grx_getpixel(x_new-2*DIM_EL,y_new-DIM_EL);
- if ( (colore!=COL_SFONDO) && (colore!=YELLOW) && (colore!=RED)) uccidi=1;
- colore=grx_getpixel(x_new+2*DIM_EL,y_new-DIM_EL);
- if ( (colore!=COL_SFONDO) && (colore!=YELLOW) && (colore!=RED)) uccidi=1;
- colore=grx_getpixel(x_new-2*DIM_EL,y_new+DIM_EL/2);
- if ( (colore!=COL_SFONDO) && (colore!=YELLOW) && (colore!=RED)) uccidi=1;
- colore=grx_getpixel(x_new+2*DIM_EL,y_new+DIM_EL/2);
- if ( (colore!=COL_SFONDO) && (colore!=YELLOW) && (colore!=RED)) uccidi=1;
- colore=grx_getpixel(x_new,y_new);
- if ( (colore!=COL_SFONDO) && (colore!=YELLOW) && (colore!=RED)) uccidi=1;
- */
-
- if ((x_old>100) && (y_old>100) && (x_old<X0max) )
- {
- if (Destra_old==0) {ELICOTTERO_S(x_old,y_old,DIM_EL,COL_SFONDO,COL_SFONDO);}
- else {ELICOTTERO_D(x_old,y_old,DIM_EL,COL_SFONDO,COL_SFONDO);}
- }
-
- if ((x_new>100) && (y_new>100) && (x_new<X0max) )
- {
- /*
- if ( uccidi==1)
- {
- // grx_box(10,10,100,100,RED);
- // task_activate(pid_kill_e);
- // sem_post(&mutex);
- // eli_occ=0;
- sem_post(&mutex);
- task_abort();
- }
- */
-
-
- if (Destra_new==0) {ELICOTTERO_S(x_new,y_new,DIM_EL,COL_EL,COL_SFONDO);}
- else {ELICOTTERO_D(x_new,y_new,DIM_EL,COL_EL,COL_SFONDO);}
- }
- sem_post(&mutex);
-
- if (tastiera=='c') Fx=Fx+0.25;
- if (tastiera=='z') Fx=Fx-0.25;
- if (tastiera=='x') Fy=Fy+0.25;
- if (tastiera=='s') Fy=Fy-0.25;
-
- if (Fx>2) Fx=2;
- if (Fx<-2) Fx=-2;
- if (Fy>0) Fy=0;
- if (Fy<-17.5) Fy=-17.5;
-
- Forza_x=Fx;
- Forza_y=Fy;
- Acc_x=Ax;
- Acc_y=Ay;
- Velocita_x=Vx;
- Velocita_y=Vy;
- Pos_x=x_new;
- Pos_y=y_new;
-
-
- if ( (tastiera=='z') || (tastiera=='x') || (tastiera=='c') || (tastiera=='s') )
- tastiera='q';
-
-
- us_old=us_new;
- x_old=x_new;
- y_old=y_new;
- Destra_old=Destra_new;
-
- task_endcycle();
- }
-}
-
-
-
-TASK peso(int i)
-{
- long double delta_T;
- long double Ay,Vy;
- long double x_new,x_old,y_old,y_new;
- int scelta=0;
- int rit,colore,uccidi;
- double m_peso[5]={0.5,0.4,0.3,0.1,0.6};
- int delta_y1,delta_y2;
-
-
- // PID pid;
- // MODEL m = BASE_MODEL;
-
- Vy=0;
- Ay=0;
-
- x_old=700-DIM_PESO-1;
- y_old=Y0max-DIM_PESO*2-1;
- delta_T=1;
- x_new=700-DIM_PESO-1;
-
- libero_peso[i]=0;
-
- while (1 )
- {
- uccidi=0;
-
- if (scelta==0 )
- {
-
- y_new=y_old;
- if (x_new+DIM_PESO==x_r-1) x_new=x_new-1;
- else x_new=x_new;
- if (indietro==1) {scelta=1; libero_peso[i]=1;}
- }
-
- if (scelta==1 )
- {
- y_new=y_old;
- x_new=x_old;
- if (peso_agganciato[i]==1) scelta=2;
- }
- if (scelta==2)
- {
- eli_occ=1;
- Ay=(m_peso[i]*G-(r*Vy)-T1)/m_peso[i];
- if(peso_agganciato[i]==1) x_new=Pos_x;
- else x_new=x_old;
- y_new=y_old+Vy*delta_T+0.5*Ay*delta_T*delta_T;
- Vy=Vy+Ay*delta_T;
-
- delta_y1=Y0max-y_new;
- delta_y2=400-y_new;
-
- if ( (y_new>=(Y0max-2*DIM_PESO-1)) || ( (y_old<400-2*DIM_PESO-1) && (y_new>=400-2*DIM_PESO-1) && (x_new>=X0min+151-DIM_PESO) && (x_new<=X0min+280+DIM_PESO) ) )
- {
- if ((x_new>=X0min+151-DIM_PESO) && (x_new<=X0min+280+DIM_PESO))
- {
- if (delta_y2<6) uccidi=1;
- y_new=400-2*DIM_PESO-2;
- }
- else {
- if (delta_y1<6) uccidi=1;
- y_new=Y0max-2*DIM_PESO-2;
- }
- Vy=0;
- if(peso_agganciato[i]==0) {scelta=3; rit=0;}
- }
- }
- if (scelta==3)
- {
- x_new=x_new;
- y_new=y_new;
- eli_occ=0;
- if (y_new==400-2*DIM_PESO-2) rit++;
-
-
-
- if (rit==100) {
- peso_agganciato[i]=0;
- pre_peso[i]=0;
- sem_wait(&mutex);
- PESO(x_old,y_old,DIM_PESO,COL_SFONDO);
- sem_post(&mutex);
-
- return NULL;
- }
-
- if(peso_agganciato[i]==1) scelta=2;
- }
-
- sem_wait(&mutex);
-
-
- colore=grx_getpixel(x_new-DIM_PESO,y_new);
- if ( (colore!=COL_SFONDO) && (colore!=DELTA_COL+i*2) && (colore!=RED)) uccidi=1;
-
- colore=grx_getpixel(x_new+DIM_PESO,y_new);
- if ( (colore!=COL_SFONDO) && (colore!=DELTA_COL+i*2) && (colore!=RED)) uccidi=1;
-
- colore=grx_getpixel(x_new-DIM_PESO,y_new+2*DIM_PESO);
- if ( (colore!=COL_SFONDO) && (colore!=DELTA_COL+i*2) && (colore!=RED)) uccidi=1;
-
- colore=grx_getpixel(x_new+DIM_PESO,y_new+2*DIM_PESO);
- if ( (colore!=COL_SFONDO) && (colore!=DELTA_COL+i*2) && (colore!=RED)) uccidi=1;
-
- colore=grx_getpixel(x_new,y_new+DIM_PESO);
- if ( (colore!=COL_SFONDO) && (colore!=DELTA_COL+i*2) && (colore!=RED)) uccidi=1;
-
-
-
- if ((x_old>100) && (y_old>100) && (x_old<X0max) )
- {
- PESO(x_old,y_old,DIM_PESO,COL_SFONDO);
- }
-
- y_old=y_new;
- x_old=x_new;
- Pos_pe_y[i]=y_new;
- Pos_pe_x[i]=x_new;
-
-
- if ((x_new>100) && (y_new>100) && (x_new<X0max) )
- {
- if ( uccidi==1)
- {
- kill_p=i;
- task_activate(pid_kill_p);
- sem_post(&mutex);
- eli_occ=0;
- pre_peso[i]=0;
- peso_agganciato[i]=0;
- return NULL;
- }
-
- PESO(x_new,y_new,DIM_PESO,DELTA_COL+i*2);
- }
- sem_post(&mutex);
-
-
- task_endcycle();
- }
-
-
-}
-
-TASK ruspa(int i)
-{
- int x,y,ii;
- int end_peso[5]={370,420,470,520,570};
-
- PID pid;
- HARD_TASK_MODEL m_hard;
-
- pre_peso[i]=1;
-
- hard_task_default_model(m_hard);
- hard_task_def_wcet(m_hard,1); // wcet ignored!!!
- hard_task_def_mit(m_hard,PER_DISEGNA);
- hard_task_def_usemath(m_hard);
- hard_task_def_arg(m_hard,(void *)i);
- pid=task_create("peso2",peso,&m_hard,NULL);
- pid_peso[i]=pid;
- task_activate(pid_peso[i]);
-
-
- x=720;
- y=Y0max;
-
- indietro=0;
- while (x!=end_peso[i]+DIM_PESO)
- {
- sem_wait(&mutex);
- RUSPA_S(x+1,y,COL_SFONDO,COL_SFONDO);
- RUSPA_S(x,y,YELLOW-1,LIGHTBLUE);
- sem_post(&mutex);
- x_r=x;
- x--;
- task_endcycle();
- }
- sem_wait(&mutex);
- RUSPA_S(x+1,y,COL_SFONDO,COL_SFONDO);
- sem_post(&mutex);
- indietro=1;
- while (x!=730 )
- {
- sem_wait(&mutex);
- RUSPA_D(x-1+40,y,COL_SFONDO,COL_SFONDO);
- RUSPA_D(x+40,y,YELLOW-1,LIGHTBLUE);
- sem_post(&mutex);
- x++;
- task_endcycle();
- }
-
- ii=i+1;
-
- while(ii>4)
- {
- n_ruspa=5;
- if(pre_peso[4]==0){
- ii=4;
- if(pre_peso[3]==0){
- ii=3;
- if(pre_peso[2]==0){
- ii=2;
- if(pre_peso[1]==0){
- ii=1;
- if(pre_peso[0]==0){
- ii=0;
- }
- }
- }
- }
- }
- task_endcycle();
-
- }
-
- hard_task_def_arg(m_hard,(void *)ii);
- pid_ruspa[ii]=task_create("ruspa",ruspa,&m_hard,NULL);
- task_activate(pid_ruspa[ii]);
- n_ruspa=ii;
-
- return NULL;
-}
-
-
-
-
-TASK molla(int i)
-{
- double k=0.05;
- double x,x_old,y1_old,y2_old;
- double T1_old; //,T2_old;
-
- x_old=Pos_x;
- y1_old=Pos_y;
- y2_old=Pos_pe_y[n_peso];
-
- while (1)
- {
-
- sem_wait(&mutex);
- if ((x_old>100-DIM_EL) && (y1_old>100-DIM_EL) && (x_old<X0max) )
- {
- MOLLA(x_old,y1_old+DIM_EL,y2_old,COL_SFONDO)
- }
- else if( (y2_old>100) && (x_old<X0max) && (x_old>100) )
- {
- MOLLA(x_old,X0min+100,y2_old,COL_SFONDO)
- }
-
- x_old=Pos_x;
- y1_old=Pos_y;
-
- if(peso_agganciato[n_peso]==0) y2_old=y1_old+20;
- else y2_old=Pos_pe_y[n_peso];
-
- if ((x_old>100) && (y1_old>100-DIM_EL) && (x_old<X0max) )
- {
- MOLLA(x_old,y1_old+DIM_EL,y2_old,RED)
- }
- else if( (y2_old>100) && (x_old<X0max) && (x_old>100))
- {
- MOLLA(x_old,X0min+100,y2_old,RED)
- }
- sem_post(&mutex);
-
- x=y2_old-y1_old;
- x=x-20;
- T1=x*k;
- T1_old=T1;
-
- task_endcycle();
-
- }
-}
-
-TASK seleziona(int i)
-{ int w,deltax,deltay,disegna;
-
- eli_occ=0;
- disegna=0;
-
- while (1)
- {
- disegna=0;
- for (w=0;w<5;w++)
- {
- deltax=Pos_pe_x[w]-Pos_x;
- deltay=Pos_pe_y[w]-Pos_y-DIM_PESO-20+DIM_EL;
- if ( (pre_peso[w]==1) && (eli_occ==0) && (deltax<4) && (deltax>-4) && (deltay<3) && (deltay>-3) )
- {
- disegna=1;
- if ( (tastiera=='p') && (libero_peso[w]==1) )
- {
- eli_occ=1;
- peso_agganciato[w]=1;
- n_peso=w;
-
- }
- }
- }
-
- if(disegna==1)
- {
- sem_wait(&mutex);
- grx_box(X0max-90,Y0min+5,X0max-5,Y0min+95,RED);
- // grx_text("Ok", X0max-40, Y0min+50, COL_TESTO, RED);
- sem_post(&mutex);
- } else
- {
- sem_wait(&mutex);
- grx_box(X0max-95,Y0min+5,X0max-5,Y0min+95,COL_SFONDO);
- sem_post(&mutex);
- }
-
- if(eli_occ==1)
- {
- sem_wait(&mutex);
- grx_box(X0max-90-100,Y0min+5,X0max-5-100,Y0min+95,GREEN);
- // grx_text("Go", X0max-35-100, Y0min+50, COL_TESTO, GREEN);
- sem_post(&mutex);
- } else
- {
- sem_wait(&mutex);
- grx_box(X0max-90-100,Y0min+5,X0max-5-100,Y0min+95,COL_SFONDO);
- sem_post(&mutex);
- }
-
-
- if (tastiera=='l') peso_agganciato[n_peso]=0;
-
- task_endcycle();
-
- }
-}
-
-
-//###############################################################
-// ##
-// Funzione di uscita dal programma ##
-// ##
-//################################################################
-void my_end(KEY_EVT* e)
-{
- //####################################
- // Sezione esecutiva della funzione ##
- //####################################
-
- grx_close();
- cprintf("Ctrl-brk pressed!\n");
- sys_end();
-} // Fine della funzionemy_end
-
-//################################################################
-// ##
-// Funzione di uscita dal programma ##
-// ##
-//################################################################
-void end()
-{
- //####################################
- // Sezione esecutiva della funzione ##
- //####################################
-
- grx_close();
-} // Fine della funzione my_end
-
-
-
-//##############################################################
-// ##
-// Main ##
-// ##
-//##############################################################
-int main()
-{
- //########################################
- // Sezione dichiarativa delle variabili ##
- //########################################
- // Identficativi di task generici
- PID pid0, pid1, pid3, pid5; //, pid2,pid4,pid6;
-
- HARD_TASK_MODEL m_hard;
- NRT_TASK_MODEL m_nrt;
-
- // Ascoltatore di eventi
- KEY_EVT emerg;
- // Contatori
- int j;
-
-
- //####################################
- // Sezione esecutiva del main ##
- //####################################
-
- set_exchandler_grx();
-
- // Inizializzazione dei parametri hartik
- sem_init(&mutex,0,1);
- sem_init(&pu,0,1);
-
- emerg.ascii = 'x';
- emerg.scan = KEY_X;
- emerg.flag = ALTL_BIT;
- keyb_hook(emerg, my_end);
- sys_atrunlevel(end, NULL, RUNLEVEL_BEFORE_EXIT);
-
- if (grx_open(800, 600, 8) < 0)
- {
- cprintf("GRX Err\n");
- sys_abort(300);
- }
- cprintf("scheda ok\n");
-
- r=0.1;
-
- /* Disposizione degli elementi grafici statici */
- sem_wait(&mutex);
- draw_static();
- sem_post(&mutex);
-
- // Attivazione dei task
- hard_task_default_model(m_hard);
- hard_task_def_wcet(m_hard,1); // wcet ignored!!!
- hard_task_def_usemath(m_hard);
-
- hard_task_def_mit(m_hard,PER_DISEGNA);
- pid0=task_create("elicottero",elicottero,&m_hard,NULL);
- task_activate(pid0);
-
- hard_task_def_mit(m_hard,PER_DISEGNA);
- pid1=task_create("indicometro",disegna_stato,&m_hard,NULL);
- task_activate(pid1);
-
- hard_task_def_mit(m_hard,PER_MOLLA);
- pid3=task_create("molla",molla,&m_hard,NULL);
- task_activate(pid3);
-
- hard_task_def_mit(m_hard,PER_DISEGNA);
- pid5=task_create("seleziona",seleziona,&m_hard,NULL);
- task_activate(pid5);
-
-
- hard_task_def_mit(m_hard,PER_DISEGNA);
- hard_task_def_arg(m_hard,0);
- pid_ruspa[0]=task_create("ruspa",ruspa,&m_hard,NULL);
- task_activate(pid_ruspa[0]);
- n_ruspa=0;
-
- nrt_task_default_model(m_nrt);
- nrt_task_def_usemath(m_nrt);
- nrt_task_def_arg(m_nrt,0);
- pid_kill_e = task_create("kill_task",kill_task, &m_nrt, NULL);
- pid_pulisci_e = task_create("pulisci",pulisci, &m_nrt, NULL);
-
- nrt_task_def_arg(m_nrt,(void *)1);
- pid_kill_p = task_create("kill_task",kill_task, &m_nrt, NULL);
- pid_pulisci_p = task_create("pulisci",pulisci, &m_nrt, NULL);
-
-
-
-
- do {
- tastiera = keyb_getch(BLOCK);
-
- } while(tastiera!=ESC);
-
- task_kill(pid5);
- task_kill(pid3);
- task_kill(pid1);
- task_kill(pid0);
-
- task_kill(pid_kill_p);
- task_kill(pid_kill_e);
-
- if (n_ruspa!=5) task_kill(pid_ruspa[n_ruspa]);
- for(j=0;j<5;j++) { if (pre_peso[j]==1) task_kill(pid_peso[j]); }
-
- grx_close();
- sys_end();
-
- return 0;
-} // Fine del main
-
-/***************************<Fine del file>*******************************/
Index: demos/branches/pj/eli/makefile
===================================================================
--- demos/branches/pj/eli/makefile (revision 1085)
+++ demos/branches/pj/eli/makefile (nonexistent)
@@ -1,16 +0,0 @@
-#
-#
-#
-
-ifndef BASE
-BASE=../..
-endif
-include $(BASE)/config/config.mk
-
-PROGS= eli
-
-include $(BASE)/config/example.mk
-
-eli:
- make -f $(SUBMAKE) APP=eli INIT= OTHEROBJS="initfile.o draw.o" OTHERINCL=
-
Index: demos/branches/pj/eli/draw.c
===================================================================
--- demos/branches/pj/eli/draw.c (revision 1085)
+++ demos/branches/pj/eli/draw.c (nonexistent)
@@ -1,519 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: draw.c,v 1.1.1.1 2002-09-02 09:37:45 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:45 $
- ------------
-
- This file is similar to the configuration of Hartik 3.3.1
-
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai and ALLEN-DESTRO
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "eli.h"
-
-void draw_static()
-{
- int i;
- /************************************/
- /* Sezione esecutiva della funzione */
- /************************************/
-
- grx_rect(X0min,Y0min,X0max,Y0max,COL_CORNICE);
- // grx_rect(X0min+100,Y0min+100,X0max,Y0max,COL_CORNICE);
- grx_line(X0min,Y0min+100,X0min+100,Y0min+100,COL_CORNICE);
- // grx_line(X0min,Y0min+350,X0min+100,Y0min+350,COL_CORNICE);
-
- grx_line(X0min+25,Y0min+100,X0min+25,Y0max,COL_CORNICE);
- grx_line(X0min+50,Y0min+100,X0min+50,Y0max,COL_CORNICE);
- grx_line(X0min+75,Y0min+100,X0min+75,Y0max,COL_CORNICE);
-
- grx_line(X0min,Y0min+100+127,X0min+25,Y0min+100+127,LIGHTBLUE);
- grx_line(X0min+50,Y0min+100+127,X0min+100,Y0min+100+127,LIGHTBLUE);
- grx_line(X0min+50,Y0min+100+127+250,X0min+100,Y0min+100+127+250,LIGHTBLUE);
-
-
- grx_box(X0min+101+50,400,X0min+230+50,Y0max-1,BROWN);
- for(i=1;i<6;i++){
- grx_box(X0min+101+50+38,400+35*i-10,X0min+101+50+48,400+35*i,CYAN);
- grx_box(X0min+101+50+81,400+35*i-10,X0min+101+50+91,400+35*i,CYAN);
- }
- grx_box(X0min+101+50+60,Y0max-30,X0min+101+50+70,Y0max-1,GREEN);
-
-
- grx_box(700,520,X0max-1,Y0max-1,CYAN);
-
-
-
- grx_text("Fx", X0min+5, Y0min+90, COL_TESTO, COL_SFONDO);
- grx_text("Fy", X0min+30, Y0min+90, COL_TESTO, COL_SFONDO);
- grx_text("Ax", X0min+55, Y0min+90, COL_TESTO, COL_SFONDO);
- grx_text("Ay", X0min+80, Y0min+90, COL_TESTO, COL_SFONDO);
- // grx_text("M", X0min+10, Y0min+351, COL_TESTO, COL_SFONDO);
- // grx_text("P", X0min+35, Y0min+351, COL_TESTO, COL_SFONDO);
- grx_text("Vx", X0min+55, Y0min+351, COL_TESTO, COL_SFONDO);
- grx_text("Vy", X0min+80, Y0min+351, COL_TESTO, COL_SFONDO);
-
- grx_text("S : Su", X0min+110, Y0min+15, COL_TESTO, COL_SFONDO);
- grx_text("Z : Sinistra", X0min+110, Y0min+25, COL_TESTO, COL_SFONDO);
- grx_text("X : Giu", X0min+110, Y0min+35, COL_TESTO, COL_SFONDO);
- grx_text("C : Destra", X0min+110, Y0min+45, COL_TESTO, COL_SFONDO);
- grx_text("P : aggancia Peso", X0min+110, Y0min+55, COL_TESTO, COL_SFONDO);
- grx_text("L : Libera peso", X0min+110, Y0min+65, COL_TESTO, COL_SFONDO);
- grx_text("Esc : Usita Programma", X0min+110, Y0min+75, COL_TESTO, COL_SFONDO);
-
-
-} // Fine della funzione draw_static
-
-TASK disegna_stato(int i)
-{ //double j;
-
- while (1)
- {
-
- sem_wait(&mutex);
-
- grx_rect(X0min+100,Y0min+100,X0max,Y0max,COL_CORNICE);
-
- grx_box(700,565,770,Y0max-1,LIGHTCYAN);
-
- grx_box(X0min+101+50,400,X0min+230+50,420,BROWN);
-
-
- //####################### FORZA X #############################
- if ( 0.25<=Forza_x) grx_box(7,Y0min+210,26,Y0min+220,GREEN);
- else grx_box(7,Y0min+210,26,Y0min+220,COL_SFONDO);
- if ( 0.5<=Forza_x) grx_box(7,Y0min+195,26,Y0min+205,GREEN);
- else grx_box(7,Y0min+195,26,Y0min+205,COL_SFONDO);
- if ( 0.75<=Forza_x) grx_box(7,Y0min+180,26,Y0min+190,GREEN);
- else grx_box(7,Y0min+180,26,Y0min+190,COL_SFONDO);
- if ( 1<=Forza_x) grx_box(7,Y0min+165,26,Y0min+175,GREEN);
- else grx_box(7,Y0min+165,26,Y0min+175,COL_SFONDO);
- if ( 1.25<=Forza_x) grx_box(7,Y0min+150,26,Y0min+160,GREEN);
- else grx_box(7,Y0min+150,26,Y0min+160,COL_SFONDO);
- if ( 1.50<=Forza_x) grx_box(7,Y0min+135,26,Y0min+145,YELLOW);
- else grx_box(7,Y0min+135,26,Y0min+145,COL_SFONDO);
- if ( 1.75<=Forza_x) grx_box(7,Y0min+120,26,Y0min+130,RED);
- else grx_box(7,Y0min+120,26,Y0min+130,COL_SFONDO);
- if ( 2<=Forza_x) grx_box(7,Y0min+105,26,Y0min+115,RED);
- else grx_box(7,Y0min+105,26,Y0min+115,COL_SFONDO);
- //########### ------
- if (-0.25>=Forza_x) grx_box(7,Y0min+230,26,Y0min+240,GREEN);
- else grx_box(7,Y0min+230,26,Y0min+240,COL_SFONDO);
- if ( -0.5>=Forza_x) grx_box(7,Y0min+245,26,Y0min+255,GREEN);
- else grx_box(7,Y0min+245,26,Y0min+255,COL_SFONDO);
- if ( -0.75>=Forza_x) grx_box(7,Y0min+260,26,Y0min+270,GREEN);
- else grx_box(7,Y0min+260,26,Y0min+270,COL_SFONDO);
- if ( -1>=Forza_x) grx_box(7,Y0min+275,26,Y0min+285,GREEN);
- else grx_box(7,Y0min+275,26,Y0min+285,COL_SFONDO);
- if ( -1.25>=Forza_x) grx_box(7,Y0min+290,26,Y0min+300,GREEN);
- else grx_box(7,Y0min+290,26,Y0min+300,COL_SFONDO);
- if ( -1.50>=Forza_x) grx_box(7,Y0min+305,26,Y0min+315,YELLOW);
- else grx_box(7,Y0min+305,26,Y0min+315,COL_SFONDO);
- if ( -1.75>=Forza_x) grx_box(7,Y0min+320,26,Y0min+330,RED);
- else grx_box(7,Y0min+320,26,Y0min+330,COL_SFONDO);
- if ( -2>=Forza_x) grx_box(7,Y0min+335,26,Y0min+345,RED);
- else grx_box(7,Y0min+335,26,Y0min+345,COL_SFONDO);
- //####################### FORZA Y #############################
- if ( -0.5>=Forza_y) grx_box(32,Y0min+340,51,Y0min+345,GREEN);
- else grx_box(32,Y0min+340,51,Y0min+345,COL_SFONDO);
- if ( -1>=Forza_y) grx_box(32,Y0min+333,51,Y0min+338,GREEN);
- else grx_box(32,Y0min+333,51,Y0min+338,COL_SFONDO);
- if ( -1.5>=Forza_y) grx_box(32,Y0min+326,51,Y0min+331,GREEN);
- else grx_box(32,Y0min+326,51,Y0min+331,COL_SFONDO);
- if ( -2>=Forza_y) grx_box(32,Y0min+319,51,Y0min+324,GREEN);
- else grx_box(32,Y0min+319,51,Y0min+324,COL_SFONDO);
- if ( -2.5>=Forza_y) grx_box(32,Y0min+312,51,Y0min+317,GREEN);
- else grx_box(32,Y0min+312,51,Y0min+317,COL_SFONDO);
- if ( -3>=Forza_y) grx_box(32,Y0min+305,51,Y0min+310,GREEN);
- else grx_box(32,Y0min+305,51,Y0min+310,COL_SFONDO);
- if ( -3.5>=Forza_y) grx_box(32,Y0min+298,51,Y0min+303,GREEN);
- else grx_box(32,Y0min+298,51,Y0min+303,COL_SFONDO);
- if ( -4>=Forza_y) grx_box(32,Y0min+291,51,Y0min+296,GREEN);
- else grx_box(32,Y0min+291,51,Y0min+296,COL_SFONDO);
- if ( -4.5>=Forza_y) grx_box(32,Y0min+284,51,Y0min+289,GREEN);
- else grx_box(32,Y0min+284,51,Y0min+289,COL_SFONDO);
- if ( -5>=Forza_y) grx_box(32,Y0min+277,51,Y0min+282,GREEN);
- else grx_box(32,Y0min+277,51,Y0min+282,COL_SFONDO);
- if ( -5.5>=Forza_y) grx_box(32,Y0min+270,51,Y0min+275,GREEN);
- else grx_box(32,Y0min+270,51,Y0min+275,COL_SFONDO);
- if ( -6>=Forza_y) grx_box(32,Y0min+263,51,Y0min+268,GREEN);
- else grx_box(32,Y0min+263,51,Y0min+268,COL_SFONDO);
- if ( -6.5>=Forza_y) grx_box(32,Y0min+256,51,Y0min+261,GREEN);
- else grx_box(32,Y0min+256,51,Y0min+261,COL_SFONDO);
- if ( -7>=Forza_y) grx_box(32,Y0min+249,51,Y0min+254,GREEN);
- else grx_box(32,Y0min+249,51,Y0min+254,COL_SFONDO);
- if ( -7.5>=Forza_y) grx_box(32,Y0min+242,51,Y0min+247,GREEN);
- else grx_box(32,Y0min+242,51,Y0min+247,COL_SFONDO);
- if ( -8>=Forza_y) grx_box(32,Y0min+235,51,Y0min+240,GREEN);
- else grx_box(32,Y0min+235,51,Y0min+240,COL_SFONDO);
- if ( -8.5>=Forza_y) grx_box(32,Y0min+228,51,Y0min+233,GREEN);
- else grx_box(32,Y0min+228,51,Y0min+233,COL_SFONDO);
- if ( -9>=Forza_y) grx_box(32,Y0min+221,51,Y0min+226,GREEN);
- else grx_box(32,Y0min+221,51,Y0min+226,COL_SFONDO);
- if ( -9.5>=Forza_y) grx_box(32,Y0min+214,51,Y0min+219,GREEN);
- else grx_box(32,Y0min+214,51,Y0min+219,COL_SFONDO);
- if ( -10>=Forza_y) grx_box(32,Y0min+207,51,Y0min+212,GREEN);
- else grx_box(32,Y0min+207,51,Y0min+212,COL_SFONDO);
- if ( -10.5>=Forza_y) grx_box(32,Y0min+200,51,Y0min+205,GREEN);
- else grx_box(32,Y0min+200,51,Y0min+205,COL_SFONDO);
- if ( -11>=Forza_y) grx_box(32,Y0min+193,51,Y0min+198,GREEN);
- else grx_box(32,Y0min+193,51,Y0min+198,COL_SFONDO);
- if ( -11.5>=Forza_y) grx_box(32,Y0min+186,51,Y0min+191,GREEN);
- else grx_box(32,Y0min+186,51,Y0min+191,COL_SFONDO);
- if ( -12>=Forza_y) grx_box(32,Y0min+179,51,Y0min+184,GREEN);
- else grx_box(32,Y0min+179,51,Y0min+184,COL_SFONDO);
- if ( -12.5>=Forza_y) grx_box(32,Y0min+172,51,Y0min+177,GREEN);
- else grx_box(32,Y0min+172,51,Y0min+177,COL_SFONDO);
- if ( -13>=Forza_y) grx_box(32,Y0min+165,51,Y0min+170,GREEN);
- else grx_box(32,Y0min+165,51,Y0min+170,COL_SFONDO);
- if ( -13.5>=Forza_y) grx_box(32,Y0min+158,51,Y0min+163,GREEN);
- else grx_box(32,Y0min+158,51,Y0min+163,COL_SFONDO);
- if ( -14>=Forza_y) grx_box(32,Y0min+151,51,Y0min+156,GREEN);
- else grx_box(32,Y0min+151,51,Y0min+156,COL_SFONDO);
- if ( -14.5>=Forza_y) grx_box(32,Y0min+144,51,Y0min+149,GREEN);
- else grx_box(32,Y0min+144,51,Y0min+149,COL_SFONDO);
- if ( -15>=Forza_y) grx_box(32,Y0min+137,51,Y0min+142,YELLOW);
- else grx_box(32,Y0min+137,51,Y0min+142,COL_SFONDO);
- if ( -15.5>=Forza_y) grx_box(32,Y0min+130,51,Y0min+135,YELLOW);
- else grx_box(32,Y0min+130,51,Y0min+135,COL_SFONDO);
- if ( -16>=Forza_y) grx_box(32,Y0min+123,51,Y0min+128,RED);
- else grx_box(32,Y0min+123,51,Y0min+128,COL_SFONDO);
- if ( -16.5>=Forza_y) grx_box(32,Y0min+116,51,Y0min+121,RED);
- else grx_box(32,Y0min+116,51,Y0min+121,COL_SFONDO);
- if ( -17>=Forza_y) grx_box(32,Y0min+109,51,Y0min+114,RED);
- else grx_box(32,Y0min+109,51,Y0min+114,COL_SFONDO);
- if ( -17.5>=Forza_y) grx_box(32,Y0min+102,51,Y0min+107,RED);
- else grx_box(32,Y0min+102,51,Y0min+107,COL_SFONDO);
-
- //####################### ACCELERAZIONE X #############################
- if ( -2.125>=Acc_x)grx_box(56,Y0min+340,75,Y0min+345,RED);
- else grx_box(55,Y0min+340,75,Y0min+345,COL_SFONDO);
- if ( -2>=Acc_x) grx_box(56,Y0min+333,75,Y0min+338,RED);
- else grx_box(56,Y0min+333,75,Y0min+338,COL_SFONDO);
- if ( -1.875>=Acc_x)grx_box(56,Y0min+326,75,Y0min+331,RED);
- else grx_box(56,Y0min+326,75,Y0min+331,COL_SFONDO);
- if ( -1.750>=Acc_x) grx_box(56,Y0min+319,75,Y0min+324,YELLOW);
- else grx_box(56,Y0min+319,75,Y0min+324,COL_SFONDO);
- if ( -1.625>=Acc_x)grx_box(56,Y0min+312,75,Y0min+317,YELLOW);
- else grx_box(56,Y0min+312,75,Y0min+317,COL_SFONDO);
- if ( -1.5>=Acc_x) grx_box(56,Y0min+305,75,Y0min+310,GREEN);
- else grx_box(56,Y0min+305,75,Y0min+310,COL_SFONDO);
- if ( -1.375>=Acc_x)grx_box(56,Y0min+298,75,Y0min+303,GREEN);
- else grx_box(56,Y0min+298,75,Y0min+303,COL_SFONDO);
- if ( -1.250>=Acc_x) grx_box(56,Y0min+291,75,Y0min+296,GREEN);
- else grx_box(56,Y0min+291,75,Y0min+296,COL_SFONDO);
- if ( -1.125>=Acc_x)grx_box(56,Y0min+284,75,Y0min+289,GREEN);
- else grx_box(56,Y0min+284,75,Y0min+289,COL_SFONDO);
- if ( -1>=Acc_x) grx_box(56,Y0min+277,75,Y0min+282,GREEN);
- else grx_box(56,Y0min+277,75,Y0min+282,COL_SFONDO);
- if ( -0.875>=Acc_x)grx_box(56,Y0min+270,75,Y0min+275,GREEN);
- else grx_box(56,Y0min+270,75,Y0min+275,COL_SFONDO);
- if ( -0.750>=Acc_x) grx_box(56,Y0min+263,75,Y0min+268,GREEN);
- else grx_box(56,Y0min+263,75,Y0min+268,COL_SFONDO);
- if ( -0.625>=Acc_x)grx_box(56,Y0min+256,75,Y0min+261,GREEN);
- else grx_box(56,Y0min+256,75,Y0min+261,COL_SFONDO);
- if ( -0.5>=Acc_x) grx_box(56,Y0min+249,75,Y0min+254,GREEN);
- else grx_box(56,Y0min+249,75,Y0min+254,COL_SFONDO);
- if ( -0.375>=Acc_x)grx_box(56,Y0min+242,75,Y0min+247,GREEN);
- else grx_box(56,Y0min+242,75,Y0min+247,COL_SFONDO);
- if ( -0.250>=Acc_x) grx_box(56,Y0min+235,75,Y0min+240,GREEN);
- else grx_box(56,Y0min+235,75,Y0min+240,COL_SFONDO);
- if ( -0.125>=Acc_x)grx_box(56,Y0min+228,75,Y0min+233,GREEN);
- else grx_box(56,Y0min+228,75,Y0min+233,COL_SFONDO);
- //############# ------
- if ( 0.125<=Acc_x) grx_box(56,Y0min+221,75,Y0min+226,GREEN);
- else grx_box(56,Y0min+221,75,Y0min+226,COL_SFONDO);
- if ( 0.250<=Acc_x)grx_box(56,Y0min+214,75,Y0min+219,GREEN);
- else grx_box(56,Y0min+214,75,Y0min+219,COL_SFONDO);
- if ( 0.375<=Acc_x) grx_box(56,Y0min+207,75,Y0min+212,GREEN);
- else grx_box(56,Y0min+207,75,Y0min+212,COL_SFONDO);
- if (0.5<=Acc_x)grx_box(56,Y0min+200,75,Y0min+205,GREEN);
- else grx_box(56,Y0min+200,75,Y0min+205,COL_SFONDO);
- if ( 0.625<=Acc_x) grx_box(56,Y0min+193,75,Y0min+198,GREEN);
- else grx_box(56,Y0min+193,75,Y0min+198,COL_SFONDO);
- if (0.750<=Acc_x)grx_box(56,Y0min+186,75,Y0min+191,GREEN);
- else grx_box(56,Y0min+186,75,Y0min+191,COL_SFONDO);
- if (0.875<=Acc_x) grx_box(56,Y0min+179,75,Y0min+184,GREEN);
- else grx_box(56,Y0min+179,75,Y0min+184,COL_SFONDO);
- if (1<=Acc_x)grx_box(56,Y0min+172,75,Y0min+177,GREEN);
- else grx_box(56,Y0min+172,75,Y0min+177,COL_SFONDO);
- if (1.125<=Acc_x) grx_box(56,Y0min+165,75,Y0min+170,GREEN);
- else grx_box(56,Y0min+165,75,Y0min+170,COL_SFONDO);
- if (1.250<=Acc_x)grx_box(56,Y0min+158,75,Y0min+163,GREEN);
- else grx_box(56,Y0min+158,75,Y0min+163,COL_SFONDO);
- if (1.375<=Acc_x) grx_box(56,Y0min+151,75,Y0min+156,GREEN);
- else grx_box(56,Y0min+151,75,Y0min+156,COL_SFONDO);
- if (1.5<=Acc_x)grx_box(56,Y0min+144,75,Y0min+149,GREEN);
- else grx_box(56,Y0min+144,75,Y0min+149,COL_SFONDO);
- if (1.625<=Acc_x) grx_box(56,Y0min+137,75,Y0min+142,YELLOW);
- else grx_box(56,Y0min+137,75,Y0min+142,COL_SFONDO);
- if (1.750<=Acc_x)grx_box(56,Y0min+130,75,Y0min+135,YELLOW);
- else grx_box(56,Y0min+130,75,Y0min+135,COL_SFONDO);
- if (1.875<=Acc_x) grx_box(56,Y0min+123,75,Y0min+128,RED);
- else grx_box(56,Y0min+123,75,Y0min+128,COL_SFONDO);
- if (2<=Acc_x)grx_box(56,Y0min+116,75,Y0min+121,RED);
- else grx_box(56,Y0min+116,75,Y0min+121,COL_SFONDO);
- if (2.125<=Acc_x) grx_box(56,Y0min+109,75,Y0min+114,RED);
- else grx_box(56,Y0min+109,75,Y0min+114,COL_SFONDO);
- //####################### ACCELERAZIONE Y #############################
- if ( 2.5<=Acc_y) { grx_box(81,Y0min+340,100,Y0min+345,RED);
- grx_box(81+5,Y0min+340+1,100-5,Y0min+345-1,BLUE);
- }
- else grx_box(81,Y0min+340,100,Y0min+345,COL_SFONDO);
- if ( 2.200<=Acc_y) grx_box(81,Y0min+333,100,Y0min+338,RED);
- else grx_box(81,Y0min+333,100,Y0min+338,COL_SFONDO);
- if ( 1.950<=Acc_y) grx_box(81,Y0min+326,100,Y0min+331,RED);
- else grx_box(81,Y0min+326,100,Y0min+331,COL_SFONDO);
- if ( 1.750<=Acc_y) grx_box(81,Y0min+319,100,Y0min+324,YELLOW);
- else grx_box(81,Y0min+319,100,Y0min+324,COL_SFONDO);
- if ( 1.625<=Acc_y) grx_box(81,Y0min+312,100,Y0min+317,YELLOW);
- else grx_box(81,Y0min+312,100,Y0min+317,COL_SFONDO);
- if ( 1.5<=Acc_y) grx_box(81,Y0min+305,100,Y0min+310,GREEN);
- else grx_box(81,Y0min+305,100,Y0min+310,COL_SFONDO);
- if ( 1.375<=Acc_y) grx_box(81,Y0min+298,100,Y0min+303,GREEN);
- else grx_box(81,Y0min+298,100,Y0min+303,COL_SFONDO);
- if ( 1.250<=Acc_y) grx_box(81,Y0min+291,100,Y0min+296,GREEN);
- else grx_box(81,Y0min+291,100,Y0min+296,COL_SFONDO);
- if ( 1.125<=Acc_y) grx_box(81,Y0min+284,100,Y0min+289,GREEN);
- else grx_box(81,Y0min+284,100,Y0min+289,COL_SFONDO);
- if ( 1<=Acc_y) grx_box(81,Y0min+277,100,Y0min+282,GREEN);
- else grx_box(81,Y0min+277,100,Y0min+282,COL_SFONDO);
- if ( 0.875<=Acc_y) grx_box(81,Y0min+270,100,Y0min+275,GREEN);
- else grx_box(81,Y0min+270,100,Y0min+275,COL_SFONDO);
- if ( 0.750<=Acc_y) grx_box(81,Y0min+263,100,Y0min+268,GREEN);
- else grx_box(81,Y0min+263,100,Y0min+268,COL_SFONDO);
- if ( 0.625<=Acc_y) grx_box(81,Y0min+256,100,Y0min+261,GREEN);
- else grx_box(81,Y0min+256,100,Y0min+261,COL_SFONDO);
- if ( 0.5<=Acc_y) grx_box(81,Y0min+249,100,Y0min+254,GREEN);
- else grx_box(81,Y0min+249,100,Y0min+254,COL_SFONDO);
- if ( 0.375<=Acc_y) grx_box(81,Y0min+242,100,Y0min+247,GREEN);
- else grx_box(81,Y0min+242,100,Y0min+247,COL_SFONDO);
- if ( 0.25<=Acc_y) grx_box(81,Y0min+235,100,Y0min+240,GREEN);
- else grx_box(81,Y0min+235,100,Y0min+240,COL_SFONDO);
- if ( 0.125<=Acc_y) grx_box(81,Y0min+228,100,Y0min+233,GREEN);
- else grx_box(81,Y0min+228,100,Y0min+233,COL_SFONDO);
- //############# ------
- if ( -0.125>=Acc_y) grx_box(81,Y0min+221,100,Y0min+226,GREEN);
- else grx_box(81,Y0min+221,100,Y0min+226,COL_SFONDO);
- if ( -0.250>=Acc_y) grx_box(81,Y0min+214,100,Y0min+219,GREEN);
- else grx_box(81,Y0min+214,100,Y0min+219,COL_SFONDO);
- if ( -0.375>=Acc_y) grx_box(81,Y0min+207,100,Y0min+212,GREEN);
- else grx_box(81,Y0min+207,100,Y0min+212,COL_SFONDO);
- if (-0.5>=Acc_y) grx_box(81,Y0min+200,100,Y0min+205,GREEN);
- else grx_box(81,Y0min+200,100,Y0min+205,COL_SFONDO);
- if ( -0.625>=Acc_y) grx_box(81,Y0min+193,100,Y0min+198,GREEN);
- else grx_box(81,Y0min+193,100,Y0min+198,COL_SFONDO);
- if (-0.750>=Acc_y) grx_box(81,Y0min+186,100,Y0min+191,GREEN);
- else grx_box(81,Y0min+186,100,Y0min+191,COL_SFONDO);
- if (-0.875>=Acc_y) grx_box(81,Y0min+179,100,Y0min+184,GREEN);
- else grx_box(81,Y0min+179,100,Y0min+184,COL_SFONDO);
- if (-1>=Acc_y) grx_box(81,Y0min+172,100,Y0min+177,GREEN);
- else grx_box(81,Y0min+172,100,Y0min+177,COL_SFONDO);
- if (-1.125>=Acc_y) grx_box(81,Y0min+165,100,Y0min+170,YELLOW);
- else grx_box(81,Y0min+165,100,Y0min+170,COL_SFONDO);
- if (-1.250>=Acc_y) grx_box(81,Y0min+158,100,Y0min+163,YELLOW);
- else grx_box(81,Y0min+158,100,Y0min+163,COL_SFONDO);
- if (-1.375>=Acc_y) grx_box(81,Y0min+151,100,Y0min+156,YELLOW);
- else grx_box(81,Y0min+151,100,Y0min+156,COL_SFONDO);
- if (-1.5>=Acc_y) grx_box(81,Y0min+144,100,Y0min+149,YELLOW);
- else grx_box(81,Y0min+144,100,Y0min+149,COL_SFONDO);
- if (-1.625>=Acc_y) grx_box(81,Y0min+137,100,Y0min+142,RED);
- else grx_box(81,Y0min+137,100,Y0min+142,COL_SFONDO);
- if (-1.750>=Acc_y) grx_box(81,Y0min+130,100,Y0min+135,RED);
- else grx_box(81,Y0min+130,100,Y0min+135,COL_SFONDO);
- if (-1.875>=Acc_y) grx_box(81,Y0min+123,100,Y0min+128,RED);
- else grx_box(81,Y0min+123,100,Y0min+128,COL_SFONDO);
- if (-2>=Acc_y) grx_box(81,Y0min+116,100,Y0min+121,RED);
- else grx_box(81,Y0min+116,100,Y0min+121,COL_SFONDO);
- if (-2.3>=Acc_y) grx_box(81,Y0min+109,100,Y0min+114,RED);
- else grx_box(81,Y0min+109,100,Y0min+114,COL_SFONDO);
- //####################### VELOCITA X #############################
- //if ( -21.25>=Velocita_x)grx_box(56,Y0min+340+250,75,Y0min+345+250,RED);
- //else grx_box(55,Y0min+340+250,75,Y0min+345+250,COL_SFONDO);
- if ( -20>=Velocita_x) grx_box(56,Y0min+333+250,75,Y0min+338+250,RED);
- else grx_box(56,Y0min+333+250,75,Y0min+338+250,COL_SFONDO);
- if ( -18.75>=Velocita_x)grx_box(56,Y0min+326+250,75,Y0min+331+250,RED);
- else grx_box(56,Y0min+326+250,75,Y0min+331+250,COL_SFONDO);
- if ( -17.50>=Velocita_x)grx_box(56,Y0min+319+250,75,Y0min+324+250,YELLOW);
- else grx_box(56,Y0min+319+250,75,Y0min+324+250,COL_SFONDO);
- if ( -16.25>=Velocita_x)grx_box(56,Y0min+312+250,75,Y0min+317+250,YELLOW);
- else grx_box(56,Y0min+312+250,75,Y0min+317+250,COL_SFONDO);
- if ( -15>=Velocita_x) grx_box(56,Y0min+305+250,75,Y0min+310+250,GREEN);
- else grx_box(56,Y0min+305+250,75,Y0min+310+250,COL_SFONDO);
- if ( -13.75>=Velocita_x)grx_box(56,Y0min+298+250,75,Y0min+303+250,GREEN);
- else grx_box(56,Y0min+298+250,75,Y0min+303+250,COL_SFONDO);
- if ( -12.50>=Velocita_x)grx_box(56,Y0min+291+250,75,Y0min+296+250,GREEN);
- else grx_box(56,Y0min+291+250,75,Y0min+296+250,COL_SFONDO);
- if ( -11.25>=Velocita_x)grx_box(56,Y0min+284+250,75,Y0min+289+250,GREEN);
- else grx_box(56,Y0min+284+250,75,Y0min+289+250,COL_SFONDO);
- if ( -10>=Velocita_x) grx_box(56,Y0min+277+250,75,Y0min+282+250,GREEN);
- else grx_box(56,Y0min+277+250,75,Y0min+282+250,COL_SFONDO);
- if ( -8.75>=Velocita_x)grx_box(56,Y0min+270+250,75,Y0min+275+250,GREEN);
- else grx_box(56,Y0min+270+250,75,Y0min+275+250,COL_SFONDO);
- if ( -7.50>=Velocita_x)grx_box(56,Y0min+263+250,75,Y0min+268+250,GREEN);
- else grx_box(56,Y0min+263+250,75,Y0min+268+250,COL_SFONDO);
- if ( -6.25>=Velocita_x)grx_box(56,Y0min+256+250,75,Y0min+261+250,GREEN);
- else grx_box(56,Y0min+256+250,75,Y0min+261+250,COL_SFONDO);
- if ( -5>=Velocita_x) grx_box(56,Y0min+249+250,75,Y0min+254+250,GREEN);
- else grx_box(56,Y0min+249+250,75,Y0min+254+250,COL_SFONDO);
- if ( -3.75>=Velocita_x)grx_box(56,Y0min+242+250,75,Y0min+247+250,GREEN);
- else grx_box(56,Y0min+242+250,75,Y0min+247+250,COL_SFONDO);
- if ( -2.50>=Velocita_x)grx_box(56,Y0min+235+250,75,Y0min+240+250,GREEN);
- else grx_box(56,Y0min+235+250,75,Y0min+240+250,COL_SFONDO);
- if ( -1.25>=Velocita_x)grx_box(56,Y0min+228+250,75,Y0min+233+250,GREEN);
- else grx_box(56,Y0min+228+250,75,Y0min+233+250,COL_SFONDO);
- //############# ------
- if ( 1.25<=Velocita_x) grx_box(56,Y0min+221+250,75,Y0min+226+250,GREEN);
- else grx_box(56,Y0min+221+250,75,Y0min+226+250,COL_SFONDO);
- if ( 2.50<=Velocita_x) grx_box(56,Y0min+214+250,75,Y0min+219+250,GREEN);
- else grx_box(56,Y0min+214+250,75,Y0min+219+250,COL_SFONDO);
- if ( 3.75<=Velocita_x) grx_box(56,Y0min+207+250,75,Y0min+212+250,GREEN);
- else grx_box(56,Y0min+207+250,75,Y0min+212+250,COL_SFONDO);
- if (5<=Velocita_x) grx_box(56,Y0min+200+250,75,Y0min+205+250,GREEN);
- else grx_box(56,Y0min+200+250,75,Y0min+205+250,COL_SFONDO);
- if ( 6.25<=Velocita_x) grx_box(56,Y0min+193+250,75,Y0min+198+250,GREEN);
- else grx_box(56,Y0min+193+250,75,Y0min+198+250,COL_SFONDO);
- if (7.50<=Velocita_x) grx_box(56,Y0min+186+250,75,Y0min+191+250,GREEN);
- else grx_box(56,Y0min+186+250,75,Y0min+191+250,COL_SFONDO);
- if (8.75<=Velocita_x) grx_box(56,Y0min+179+250,75,Y0min+184+250,GREEN);
- else grx_box(56,Y0min+179+250,75,Y0min+184+250,COL_SFONDO);
- if (10<=Velocita_x) grx_box(56,Y0min+172+250,75,Y0min+177+250,GREEN);
- else grx_box(56,Y0min+172+250,75,Y0min+177+250,COL_SFONDO);
- if (11.25<=Velocita_x) grx_box(56,Y0min+165+250,75,Y0min+170+250,GREEN);
- else grx_box(56,Y0min+165+250,75,Y0min+170+250,COL_SFONDO);
- if (12.50<=Velocita_x) grx_box(56,Y0min+158+250,75,Y0min+163+250,GREEN);
- else grx_box(56,Y0min+158+250,75,Y0min+163+250,COL_SFONDO);
- if (13.75<=Velocita_x) grx_box(56,Y0min+151+250,75,Y0min+156+250,GREEN);
- else grx_box(56,Y0min+151+250,75,Y0min+156+250,COL_SFONDO);
- if (15<=Velocita_x) grx_box(56,Y0min+144+250,75,Y0min+149+250,GREEN);
- else grx_box(56,Y0min+144+250,75,Y0min+149+250,COL_SFONDO);
- if (16.25<=Velocita_x) grx_box(56,Y0min+137+250,75,Y0min+142+250,YELLOW);
- else grx_box(56,Y0min+137+250,75,Y0min+142+250,COL_SFONDO);
- if (17.50<=Velocita_x) grx_box(56,Y0min+130+250,75,Y0min+135+250,YELLOW);
- else grx_box(56,Y0min+130+250,75,Y0min+135+250,COL_SFONDO);
- if (18.75<=Velocita_x) grx_box(56,Y0min+123+250,75,Y0min+128+250,RED);
- else grx_box(56,Y0min+123+250,75,Y0min+128+250,COL_SFONDO);
- if (20<=Velocita_x) grx_box(56,Y0min+116+250,75,Y0min+121+250,RED);
- else grx_box(56,Y0min+116+250,75,Y0min+121+250,COL_SFONDO);
- if (21.25<=Velocita_x) grx_box(56,Y0min+109+250,75,Y0min+114+250,RED);
- else grx_box(56,Y0min+109+250,75,Y0min+114+250,COL_SFONDO);
-
- //####################### VELOCITA Y #############################
- // if ( 160<=Velocita_y)grx_box(81,Y0min+340+250,100,Y0min+345+250,RED);
- // else grx_box(81,Y0min+340+250,100,Y0min+345+250,COL_SFONDO);
- if ( 40<=Velocita_y) grx_box(81,Y0min+333+250,100,Y0min+338+250,RED);
- else grx_box(81,Y0min+333+250,100,Y0min+338+250,COL_SFONDO);
- if ( 37.5<=Velocita_y)grx_box(81,Y0min+326+250,100,Y0min+331+250,RED);
- else grx_box(81,Y0min+326+250,100,Y0min+331+250,COL_SFONDO);
- if ( 35<=Velocita_y)grx_box(81,Y0min+319+250,100,Y0min+324+250,YELLOW);
- else grx_box(81,Y0min+319+250,100,Y0min+324+250,COL_SFONDO);
- if ( 32.5<=Velocita_y)grx_box(81,Y0min+312+250,100,Y0min+317+250,YELLOW);
- else grx_box(81,Y0min+312+250,100,Y0min+317+250,COL_SFONDO);
- if ( 30<=Velocita_y) grx_box(81,Y0min+305+250,100,Y0min+310+250,GREEN);
- else grx_box(81,Y0min+305+250,100,Y0min+310+250,COL_SFONDO);
- if ( 27.5<=Velocita_y)grx_box(81,Y0min+298+250,100,Y0min+303+250,GREEN);
- else grx_box(81,Y0min+298+250,100,Y0min+303+250,COL_SFONDO);
- if ( 25<=Velocita_y)grx_box(81,Y0min+291+250,100,Y0min+296+250,GREEN);
- else grx_box(81,Y0min+291+250,100,Y0min+296+250,COL_SFONDO);
- if ( 22.5<=Velocita_y)grx_box(81,Y0min+284+250,100,Y0min+289+250,GREEN);
- else grx_box(81,Y0min+284+250,100,Y0min+289+250,COL_SFONDO);
- if ( 20<=Velocita_y) grx_box(81,Y0min+277+250,100,Y0min+282+250,GREEN);
- else grx_box(81,Y0min+277+250,100,Y0min+282+250,COL_SFONDO);
- if ( 17.5<=Velocita_y) grx_box(81,Y0min+270+250,100,Y0min+275+250,GREEN);
- else grx_box(81,Y0min+270+250,100,Y0min+275+250,COL_SFONDO);
- if ( 15<=Velocita_y) grx_box(81,Y0min+263+250,100,Y0min+268+250,GREEN);
- else grx_box(81,Y0min+263+250,100,Y0min+268+250,COL_SFONDO);
- if ( 12.5<=Velocita_y) grx_box(81,Y0min+256+250,100,Y0min+261+250,GREEN);
- else grx_box(81,Y0min+256+250,100,Y0min+261+250,COL_SFONDO);
- if ( 10<=Velocita_y) grx_box(81,Y0min+249+250,100,Y0min+254+250,GREEN);
- else grx_box(81,Y0min+249+250,100,Y0min+254+250,COL_SFONDO);
- if ( 7.5<=Velocita_y) grx_box(81,Y0min+242+250,100,Y0min+247+250,GREEN);
- else grx_box(81,Y0min+242+250,100,Y0min+247+250,COL_SFONDO);
- if ( 5<=Velocita_y) grx_box(81,Y0min+235+250,100,Y0min+240+250,GREEN);
- else grx_box(81,Y0min+235+250,100,Y0min+240+250,COL_SFONDO);
- if ( 2.5<=Velocita_y) grx_box(81,Y0min+228+250,100,Y0min+233+250,GREEN);
- else grx_box(81,Y0min+228+250,100,Y0min+233+250,COL_SFONDO);
- //############# ------
- if (-2.5>=Velocita_y) grx_box(81,Y0min+221+250,100,Y0min+226+250,GREEN);
- else grx_box(81,Y0min+221+250,100,Y0min+226+250,COL_SFONDO);
- if (-5>=Velocita_y) grx_box(81,Y0min+214+250,100,Y0min+219+250,GREEN);
- else grx_box(81,Y0min+214+250,100,Y0min+219+250,COL_SFONDO);
- if (-7.5>=Velocita_y) grx_box(81,Y0min+207+250,100,Y0min+212+250,GREEN);
- else grx_box(81,Y0min+207+250,100,Y0min+212+250,COL_SFONDO);
- if (-10>=Velocita_y) grx_box(81,Y0min+200+250,100,Y0min+205+250,GREEN);
- else grx_box(81,Y0min+200+250,100,Y0min+205+250,COL_SFONDO);
- if (-12.5>=Velocita_y) grx_box(81,Y0min+193+250,100,Y0min+198+250,GREEN);
- else grx_box(81,Y0min+193+250,100,Y0min+198+250,COL_SFONDO);
- if (-15>=Velocita_y) grx_box(81,Y0min+186+250,100,Y0min+191+250,GREEN);
- else grx_box(81,Y0min+186+250,100,Y0min+191+250,COL_SFONDO);
- if (-17.5>=Velocita_y) grx_box(81,Y0min+179+250,100,Y0min+184+250,GREEN);
- else grx_box(81,Y0min+179+250,100,Y0min+184+250,COL_SFONDO);
- if (-20>=Velocita_y) grx_box(81,Y0min+172+250,100,Y0min+177+250,GREEN);
- else grx_box(81,Y0min+172+250,100,Y0min+177+250,COL_SFONDO);
- if (-22.5>=Velocita_y) grx_box(81,Y0min+165+250,100,Y0min+170+250,GREEN);
- else grx_box(81,Y0min+165+250,100,Y0min+170+250,COL_SFONDO);
- if (-25>=Velocita_y) grx_box(81,Y0min+158+250,100,Y0min+163+250,GREEN);
- else grx_box(81,Y0min+158+250,100,Y0min+163+250,COL_SFONDO);
- if (-27.5>=Velocita_y) grx_box(81,Y0min+151+250,100,Y0min+156+250,GREEN);
- else grx_box(81,Y0min+151+250,100,Y0min+156+250,COL_SFONDO);
- if (-30>=Velocita_y) grx_box(81,Y0min+144+250,100,Y0min+149+250,GREEN);
- else grx_box(81,Y0min+144+250,100,Y0min+149+250,COL_SFONDO);
- if (-32.5>=Velocita_y) grx_box(81,Y0min+137+250,100,Y0min+142+250,YELLOW);
- else grx_box(81,Y0min+137+250,100,Y0min+142+250,COL_SFONDO);
- if (-35>=Velocita_y) grx_box(81,Y0min+130+250,100,Y0min+135+250,YELLOW);
- else grx_box(81,Y0min+130+250,100,Y0min+135+250,COL_SFONDO);
- if (-37.5>=Velocita_y) grx_box(81,Y0min+123+250,100,Y0min+128+250,RED);
- else grx_box(81,Y0min+123+250,100,Y0min+128+250,COL_SFONDO);
- if (-40>=Velocita_y) grx_box(81,Y0min+116+250,100,Y0min+121+250,RED);
- else grx_box(81,Y0min+116+250,100,Y0min+121+250,COL_SFONDO);
- if (-42.5>=Velocita_y) grx_box(81,Y0min+109+250,100,Y0min+114+250,RED);
- else grx_box(81,Y0min+109+250,100,Y0min+114+250,COL_SFONDO);
-
-
- sem_post(&mutex);
-
-
- task_endcycle();
- }
-}
-
-
Index: demos/branches/pj/eli/eli.h
===================================================================
--- demos/branches/pj/eli/eli.h (revision 1085)
+++ demos/branches/pj/eli/eli.h (nonexistent)
@@ -1,173 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: eli.h,v 1.1.1.1 2002-09-02 09:37:45 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:45 $
- ------------
-
- This file is similar to the configuration of Hartik 3.3.1
-
-**/
-
-/*
- * Copyright (C) 2000 ALLEN-DESTRO and Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-/***************************************/
-/* Corso di Informatica Industriale */
-/* Libreria con le funzioni di disegno */
-/* Creata da ALLEN-DESTRO */
-/***************************************/
-
-//########################################
-// Librerie standard del linguaggio C
-//#######################################
-#include <math.h>
-#include <stdlib.h>
-#include <string.h>
-
-//########################################
-// Librerie Hartik
-//########################################
-#include <kernel/kern.h>
-#include <drivers/glib.h>
-#include <drivers/keyb.h>
-#include <ll/i386/cons.h>
-#include <semaphore.h>
-
-//########################################
-// Definizione delle costanti del programma
-//########################################
-
-#define PER_DISEGNA 100000
-#define PER_MOLLA 100000
-#define PER_KILL 200000
-#define G 10
-#define DIM_EL 12
-#define DIM_PESO 10
-#define COL_EL YELLOW
-
-
-#define X0min 4 // Ascissa minima della finestra grafica
-#define Y0min 4 // Ordinata minima della finestra grafica
-#define X0max 796 // Ascissa massima della finestra grafica
-#define Y0max 596 // Ordinata massima della finestra grafica
-#define TERRA 400 // Ordinata della pista di atteraggio
-#define COL_SFONDO 0 // Colore di sfondo della finestra grafica
-#define COL_TESTO 7 // Colore del testo della finestra grafica
-#define COL_CORNICE RED // Colore cornici della finestra grafica
-#define DELTA_COL 32
-
-
-// Valore di pigreco
-#define PIGRECO 3.14159
-
-#define ELICOTTERO_S(x,y,dim,col,sfo) grx_disc(x,y,dim,col); \
- grx_box(x-dim,y,x+dim,y+dim,sfo); \
- grx_line(x-dim*2,y-dim,x+dim*2,y-dim,col); \
- grx_box(x-dim,y,x+(dim*2),y+(dim/3),col); \
- grx_line(x-dim,y+dim/2,x+2*dim,y+dim/2,col); \
- grx_circle(x+dim*2,y,dim/2,col); \
- grx_box(x-dim/10,y,x+dim/10,y+dim/2,col)
-
-#define ELICOTTERO_D(x,y,dim,col,sfo) grx_disc(x,y,dim,col); \
- grx_box(x-dim,y,x+dim,y+dim,sfo); \
- grx_line(x-dim*2,y-dim,x+dim*2,y-dim,col); \
- grx_box(x-(dim*2),y,x+dim,y+(dim/3),col); \
- grx_line(x-2*dim,y+dim/2,x+dim,y+dim/2,col); \
- grx_circle(x-dim*2,y,dim/2,col); \
- grx_box(x-dim/10,y,x+dim/10,y+dim/2,col)
-
-#define PESO(x,y,dim,col) grx_box(x-dim,y,x+dim,y+2*dim,col)
-
-#define MOLLA(x,y1,y2,col) { \
- int w; \
- for (w=y1;w<y2;w=w+2) grx_line(x-3,w,x+3,w,col); \
- }
-
-#define RUSPA_S(x,y,col,colvet) grx_box(x,y-20,x+2,y,col); \
- grx_line(x,y-10,x+5,y-10,col); \
- grx_box(x+5,y-30,x+20,y-5,col); \
- grx_box(x+5,y-10,x+40,y-5,col); \
- grx_disc(x+10,y-5,5,col); \
- grx_disc(x+30,y-5,5,col); \
- grx_box(x+5,y-25,x+12,y-15,colvet)
-
-#define RUSPA_D(x,y,col,colvet) grx_box(x-2,y-20,x,y,col); \
- grx_line(x-5,y-10,x,y-10,col); \
- grx_box(x-20,y-30,x-5,y-5,col); \
- grx_box(x-40,y-10,x-5,y-5,col); \
- grx_disc(x-10,y-5,5,col); \
- grx_disc(x-30,y-5,5,col); \
- grx_box(x-12,y-25,x-5,y-15,colvet)
-
-#define ESPLOSIONE(x,y) grx_box(x-2,y-2,x+1,y+1,RED+1); \
- grx_box(x-5,y-5,x-4,y-3,RED+1); \
- grx_box(x-6,y-2,x-4,y,RED+1); \
- grx_box(x+3,y+4,x+4,y+7,RED+1); \
- grx_box(x+5,y-6,x+8,y-4,RED+1); \
- grx_box(x-10,y+10,x-8,y+8,RED+1); \
- grx_box(x-1,y-10,x+1,y-8,RED+1); \
- grx_box(x-13,y-1,x-10,y+1,RED+1); \
- grx_box(x+8,y-7,x+10,y-5,RED+1); \
- grx_box(x,y+6,x-1,y+8,RED+1); \
- grx_box(x-DIM_PESO-1,y-1,x-DIM_PESO+1,y+1,RED+1); \
- grx_box(x-DIM_PESO-1,y+2*DIM_PESO-1,x-DIM_PESO+1,y+2*DIM_PESO+1,RED+1); \
- grx_box(x+DIM_PESO-1,y-1,x+DIM_PESO+1,y+1,RED+1); \
- grx_box(x+DIM_PESO-1,y+2*DIM_PESO-1,x+DIM_PESO+1,y+2*DIM_PESO+1,RED+1); \
- grx_box(x-1,y+DIM_PESO-1,x+1,y+DIM_PESO+1,RED+1); \
- grx_box(x+4,y+DIM_PESO-1,x+6,y+DIM_PESO+1,RED+1); \
-
-//#define PULISCI(x,y) grx_box(x-14,y-11,x+DIM_PESO+2,y+2*DIM_PESO+2,COL_SFONDO)
-#define PULISCI(x,y,d) grx_disc(x,y,d,COL_SFONDO)
-
-/*********************************************************************/
-/* */
-/* Funzione per disegnare gli elementi statici */
-/* */
-/*********************************************************************/
-extern char tastiera;
-extern long double Forza_x,Forza_y,Velocita_x,Velocita_y,Acc_x,Acc_y,Massa;
-// Definizione del semaforo per l'utilizzo della modalità grafica
-extern sem_t mutex;
-
-TASK disegna_stato(int i);
-
-
-
Index: demos/branches/pj/eli/initfile.c
===================================================================
--- demos/branches/pj/eli/initfile.c (revision 1085)
+++ demos/branches/pj/eli/initfile.c (nonexistent)
@@ -1,100 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: initfile.c,v 1.1.1.1 2002-09-02 09:37:45 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:45 $
- ------------
-
- This file is similar to the configuration of Hartik 3.3.1
-
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/cbs.h"
-#include "modules/rr.h"
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-
-#include "drivers/keyb.h"
-
-
-/*+ sysyem tick in us +*/
-#define TICK 1000
-
-/*+ RR tick in us +*/
-#define RRTICK 10000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- EDF_register_level(0);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- CBS_register_level(CBS_ENABLE_ALL, 0);
- dummy_register_level();
-
- SEM_register_module();
-
- CABS_register_module();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- HARTPORT_init();
-
- KEYB_init(NULL);
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
Index: demos/branches/pj/mpeg2/makefile.lib
===================================================================
--- demos/branches/pj/mpeg2/makefile.lib (revision 1085)
+++ demos/branches/pj/mpeg2/makefile.lib (nonexistent)
@@ -1,54 +0,0 @@
-#
-# The mpeg library
-#
-
-# (see sources for copyrights)
-
-ifndef BASE
-BASE=../..
-endif
-include $(BASE)/config/config.mk
-
-LIBRARY = mpeg2
-
-OBJS_PATH = $(BASE)/ports/mpeg2
-
-DECODER_SRC = util.c \
- video.c \
- parseblock.c \
- motionvector.c \
- decoders.c \
- jrevdct.c \
- wrapper.c \
- gdith.c \
- gdithmni.c \
- readfile.c \
- 16bit.c
-
-DITHER_SRC = fs2.c \
- fs2fast.c \
- fs4.c \
- hybrid.c \
- hybriderr.c \
- 2x2.c \
- gray.c \
- mono.c \
- ordered.c \
- ordered2.c \
- mb_ordered.c
-
-SRCS= $(DECODER_SRC) $(DITHER_SRC)
-
-OBJS= mpeg2dec.o getpic.o motion.o getvlc.o \
- gethdr.o getblk.o getbits.o store.o \
- recon.o spatscal.o idct.o idctref.o \
- display.o systems.o subspic.o verify.o
-
-#C_WARN += -Wno-unused -Wno-uninitialized -Wno-implicit-function-declaration \
-# -Wno-switch -Wno-return-type
-
-#C_DEF += -DNOCONTROLS
-#C_INC += -I.
-
-include $(BASE)/config/lib.mk
-
Index: demos/branches/pj/mpeg2/getbits.c
===================================================================
--- demos/branches/pj/mpeg2/getbits.c (revision 1085)
+++ demos/branches/pj/mpeg2/getbits.c (nonexistent)
@@ -1,202 +0,0 @@
-/* getbits.c, bit level routines */
-
-/*
- * All modifications (mpeg2decode -> mpeg2play) are
- * Copyright (C) 1996, Stefan Eckart. All Rights Reserved.
- */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "config.h"
-#include "global.h"
-
-/* initialize buffer, call once before first getbits or showbits */
-
-void Initialize_Buffer()
-{
- ld->Incnt = 0;
- ld->Rdptr = ld->Rdbfr + 2048;
- ld->Rdmax = ld->Rdptr;
-
-#ifdef VERIFY
- /* only the verifier uses this particular bit counter
- * Bitcnt keeps track of the current parser position with respect
- * to the video elementary stream being decoded, regardless
- * of whether or not it is wrapped within a systems layer stream
- */
- ld->Bitcnt = 0;
-#endif
-
- ld->Bfr = 0;
- Flush_Buffer(0); /* fills valid data into bfr */
-}
-
-void Fill_Buffer()
-{
- int Buffer_Level;
-
- Buffer_Level = read(ld->Infile,ld->Rdbfr,2048);
- ld->Rdptr = ld->Rdbfr;
-
- if (System_Stream_Flag)
- ld->Rdmax -= 2048;
-
-
- /* end of the bitstream file */
- if (Buffer_Level < 2048)
- {
- /* just to be safe */
- if (Buffer_Level < 0)
- Buffer_Level = 0;
-
- /* pad until the next to the next 32-bit word boundary */
- while (Buffer_Level & 3)
- ld->Rdbfr[Buffer_Level++] = 0;
-
- /* pad the buffer with sequence end codes */
- while (Buffer_Level < 2048)
- {
- ld->Rdbfr[Buffer_Level++] = SEQUENCE_END_CODE>>24;
- ld->Rdbfr[Buffer_Level++] = SEQUENCE_END_CODE>>16;
- ld->Rdbfr[Buffer_Level++] = SEQUENCE_END_CODE>>8;
- ld->Rdbfr[Buffer_Level++] = SEQUENCE_END_CODE&0xff;
- }
- }
-}
-
-
-/* MPEG-1 system layer demultiplexer */
-
-int Get_Byte()
-{
- while(ld->Rdptr >= ld->Rdbfr+2048)
- {
- read(ld->Infile,ld->Rdbfr,2048);
- ld->Rdptr -= 2048;
- ld->Rdmax -= 2048;
- }
- return *ld->Rdptr++;
-}
-
-/* extract a 16-bit word from the bitstream buffer */
-int Get_Word()
-{
- int Val;
-
- Val = Get_Byte();
- return (Val<<8) | Get_Byte();
-}
-
-
-/* return next n bits (right adjusted) without advancing */
-
-unsigned int Show_Bits(N)
-int N;
-{
- return ld->Bfr >> (32-N);
-}
-
-
-/* return next bit (could be made faster than Get_Bits(1)) */
-
-unsigned int Get_Bits1()
-{
- return Get_Bits(1);
-}
-
-
-/* advance by n bits */
-
-void Flush_Buffer(N)
-int N;
-{
- int Incnt;
-
- ld->Bfr <<= N;
-
- Incnt = ld->Incnt -= N;
-
- if (Incnt <= 24)
- {
- if (System_Stream_Flag && (ld->Rdptr >= ld->Rdmax-4))
- {
- do
- {
- if (ld->Rdptr >= ld->Rdmax)
- Next_Packet();
- ld->Bfr |= Get_Byte() << (24 - Incnt);
- Incnt += 8;
- }
- while (Incnt <= 24);
- }
- else if (ld->Rdptr < ld->Rdbfr+2044)
- {
- do
- {
- ld->Bfr |= *ld->Rdptr++ << (24 - Incnt);
- Incnt += 8;
- }
- while (Incnt <= 24);
- }
- else
- {
- do
- {
- if (ld->Rdptr >= ld->Rdbfr+2048)
- Fill_Buffer();
- ld->Bfr |= *ld->Rdptr++ << (24 - Incnt);
- Incnt += 8;
- }
- while (Incnt <= 24);
- }
- ld->Incnt = Incnt;
- }
-
-#ifdef VERIFY
- ld->Bitcnt += N;
-#endif /* VERIFY */
-
-}
-
-
-/* return next n bits (right adjusted) */
-
-unsigned int Get_Bits(N)
-int N;
-{
- unsigned int Val;
-
- Val = Show_Bits(N);
- Flush_Buffer(N);
-
- return Val;
-}
-
Index: demos/branches/pj/mpeg2/store.ori
===================================================================
--- demos/branches/pj/mpeg2/store.ori (revision 1085)
+++ demos/branches/pj/mpeg2/store.ori (nonexistent)
@@ -1,576 +0,0 @@
-/* store.c, picture output routines */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <fcntl.h>
-
-#include "config.h"
-#include "global.h"
-
-/* private prototypes */
-static void store_one _ANSI_ARGS_((char *outname, unsigned char *src[],
- int offset, int incr, int height));
-static void store_yuv _ANSI_ARGS_((char *outname, unsigned char *src[],
- int offset, int incr, int height));
-static void store_sif _ANSI_ARGS_((char *outname, unsigned char *src[],
- int offset, int incr, int height));
-static void store_ppm_tga _ANSI_ARGS_((char *outname, unsigned char *src[],
- int offset, int incr, int height, int tgaflag));
-static void store_yuv1 _ANSI_ARGS_((char *name, unsigned char *src,
- int offset, int incr, int width, int height));
-static void putbyte _ANSI_ARGS_((int c));
-static void putword _ANSI_ARGS_((int w));
-static void conv422to444 _ANSI_ARGS_((unsigned char *src, unsigned char *dst));
-static void conv420to422 _ANSI_ARGS_((unsigned char *src, unsigned char *dst));
-
-#define OBFRSIZE 4096
-static unsigned char obfr[OBFRSIZE];
-static unsigned char *optr;
-static int outfile;
-
-/*
- * store a picture as either one frame or two fields
- */
-void Write_Frame(src,frame)
-unsigned char *src[];
-int frame;
-{
- char outname[FILENAME_LENGTH];
-
- if (progressive_sequence || progressive_frame || Frame_Store_Flag)
- {
- /* progressive */
- sprintf(outname,Output_Picture_Filename,frame,'f');
- store_one(outname,src,0,Coded_Picture_Width,vertical_size);
- }
- else
- {
- /* interlaced */
- sprintf(outname,Output_Picture_Filename,frame,'a');
- store_one(outname,src,0,Coded_Picture_Width<<1,vertical_size>>1);
-
- sprintf(outname,Output_Picture_Filename,frame,'b');
- store_one(outname,src,
- Coded_Picture_Width,Coded_Picture_Width<<1,vertical_size>>1);
- }
-}
-
-/*
- * store one frame or one field
- */
-static void store_one(outname,src,offset,incr,height)
-char *outname;
-unsigned char *src[];
-int offset, incr, height;
-{
- switch (Output_Type)
- {
- case T_YUV:
- store_yuv(outname,src,offset,incr,height);
- break;
- case T_SIF:
- store_sif(outname,src,offset,incr,height);
- break;
- case T_TGA:
- store_ppm_tga(outname,src,offset,incr,height,1);
- break;
- case T_PPM:
- store_ppm_tga(outname,src,offset,incr,height,0);
- break;
-#ifdef DISPLAY
- case T_X11:
- dither(src);
- break;
-#endif
- default:
- break;
- }
-}
-
-/* separate headerless files for y, u and v */
-static void store_yuv(outname,src,offset,incr,height)
-char *outname;
-unsigned char *src[];
-int offset,incr,height;
-{
- int hsize;
- char tmpname[FILENAME_LENGTH];
-
- hsize = horizontal_size;
-
- sprintf(tmpname,"%s.Y",outname);
- store_yuv1(tmpname,src[0],offset,incr,hsize,height);
-
- if (chroma_format!=CHROMA444)
- {
- offset>>=1; incr>>=1; hsize>>=1;
- }
-
- if (chroma_format==CHROMA420)
- {
- height>>=1;
- }
-
- sprintf(tmpname,"%s.U",outname);
- store_yuv1(tmpname,src[1],offset,incr,hsize,height);
-
- sprintf(tmpname,"%s.V",outname);
- store_yuv1(tmpname,src[2],offset,incr,hsize,height);
-}
-
-/* auxiliary routine */
-static void store_yuv1(name,src,offset,incr,width,height)
-char *name;
-unsigned char *src;
-int offset,incr,width,height;
-{
- int i, j;
- unsigned char *p;
-
- if (!Quiet_Flag)
- fprintf(stderr,"saving %s\n",name);
-
- if ((outfile = open(name,O_CREAT|O_TRUNC|O_WRONLY|O_BINARY,0666))==-1)
- {
- sprintf(Error_Text,"Couldn't create %s\n",name);
- Error(Error_Text);
- }
-
- optr=obfr;
-
- for (i=0; i<height; i++)
- {
- p = src + offset + incr*i;
- for (j=0; j<width; j++)
- putbyte(*p++);
- }
-
- if (optr!=obfr)
- write(outfile,obfr,optr-obfr);
-
- close(outfile);
-}
-
-/*
- * store as headerless file in U,Y,V,Y format
- */
-static void store_sif (outname,src,offset,incr,height)
-char *outname;
-unsigned char *src[];
-int offset, incr, height;
-{
- int i,j;
- unsigned char *py, *pu, *pv;
- static unsigned char *u422, *v422;
-
- if (chroma_format==CHROMA444)
- Error("4:4:4 not supported for SIF format");
-
- if (chroma_format==CHROMA422)
- {
- u422 = src[1];
- v422 = src[2];
- }
- else
- {
- if (!u422)
- {
- if (!(u422 = (unsigned char *)malloc((Coded_Picture_Width>>1)
- *Coded_Picture_Height)))
- Error("malloc failed");
- if (!(v422 = (unsigned char *)malloc((Coded_Picture_Width>>1)
- *Coded_Picture_Height)))
- Error("malloc failed");
- }
-
- conv420to422(src[1],u422);
- conv420to422(src[2],v422);
- }
-
- strcat(outname,".SIF");
-
- if (!Quiet_Flag)
- fprintf(stderr,"saving %s\n",outname);
-
- if ((outfile = open(outname,O_CREAT|O_TRUNC|O_WRONLY|O_BINARY,0666))==-1)
- {
- sprintf(Error_Text,"Couldn't create %s\n",outname);
- Error(Error_Text);
- }
-
- optr = obfr;
-
- for (i=0; i<height; i++)
- {
- py = src[0] + offset + incr*i;
- pu = u422 + (offset>>1) + (incr>>1)*i;
- pv = v422 + (offset>>1) + (incr>>1)*i;
-
- for (j=0; j<horizontal_size; j+=2)
- {
- putbyte(*pu++);
- putbyte(*py++);
- putbyte(*pv++);
- putbyte(*py++);
- }
- }
-
- if (optr!=obfr)
- write(outfile,obfr,optr-obfr);
-
- close(outfile);
-}
-
-/*
- * store as PPM (PBMPLUS) or uncompressed Truevision TGA ('Targa') file
- */
-static void store_ppm_tga(outname,src,offset,incr,height,tgaflag)
-char *outname;
-unsigned char *src[];
-int offset, incr, height;
-int tgaflag;
-{
- int i, j;
- int y, u, v, r, g, b;
- int crv, cbu, cgu, cgv;
- unsigned char *py, *pu, *pv;
- static unsigned char tga24[14] = {0,0,2,0,0,0,0, 0,0,0,0,0,24,32};
- char header[FILENAME_LENGTH];
- static unsigned char *u422, *v422, *u444, *v444;
-
- if (chroma_format==CHROMA444)
- {
- u444 = src[1];
- v444 = src[2];
- }
- else
- {
- if (!u444)
- {
- if (chroma_format==CHROMA420)
- {
- if (!(u422 = (unsigned char *)malloc((Coded_Picture_Width>>1)
- *Coded_Picture_Height)))
- Error("malloc failed");
- if (!(v422 = (unsigned char *)malloc((Coded_Picture_Width>>1)
- *Coded_Picture_Height)))
- Error("malloc failed");
- }
-
- if (!(u444 = (unsigned char *)malloc(Coded_Picture_Width
- *Coded_Picture_Height)))
- Error("malloc failed");
-
- if (!(v444 = (unsigned char *)malloc(Coded_Picture_Width
- *Coded_Picture_Height)))
- Error("malloc failed");
- }
-
- if (chroma_format==CHROMA420)
- {
- conv420to422(src[1],u422);
- conv420to422(src[2],v422);
- conv422to444(u422,u444);
- conv422to444(v422,v444);
- }
- else
- {
- conv422to444(src[1],u444);
- conv422to444(src[2],v444);
- }
- }
-
- strcat(outname,tgaflag ? ".tga" : ".ppm");
-
- if (!Quiet_Flag)
- fprintf(stderr,"saving %s\n",outname);
-
- if ((outfile = open(outname,O_CREAT|O_TRUNC|O_WRONLY|O_BINARY,0666))==-1)
- {
- sprintf(Error_Text,"Couldn't create %s\n",outname);
- Error(Error_Text);
- }
-
- optr = obfr;
-
- if (tgaflag)
- {
- /* TGA header */
- for (i=0; i<12; i++)
- putbyte(tga24[i]);
-
- putword(horizontal_size); putword(height);
- putbyte(tga24[12]); putbyte(tga24[13]);
- }
- else
- {
- /* PPM header */
- sprintf(header,"P6\n%d %d\n255\n",horizontal_size,height);
-
- for (i=0; header[i]!=0; i++)
- putbyte(header[i]);
- }
-
- /* matrix coefficients */
- crv = Inverse_Table_6_9[matrix_coefficients][0];
- cbu = Inverse_Table_6_9[matrix_coefficients][1];
- cgu = Inverse_Table_6_9[matrix_coefficients][2];
- cgv = Inverse_Table_6_9[matrix_coefficients][3];
-
- for (i=0; i<height; i++)
- {
- py = src[0] + offset + incr*i;
- pu = u444 + offset + incr*i;
- pv = v444 + offset + incr*i;
-
- for (j=0; j<horizontal_size; j++)
- {
- u = *pu++ - 128;
- v = *pv++ - 128;
- y = 76309 * (*py++ - 16); /* (255/219)*65536 */
- r = Clip[(y + crv*v + 32768)>>16];
- g = Clip[(y - cgu*u - cgv*v + 32768)>>16];
- b = Clip[(y + cbu*u + 32786)>>16];
-
- if (tgaflag)
- {
- putbyte(b); putbyte(g); putbyte(r);
- }
- else
- {
- putbyte(r); putbyte(g); putbyte(b);
- }
- }
- }
-
- if (optr!=obfr)
- write(outfile,obfr,optr-obfr);
-
- close(outfile);
-}
-
-static void putbyte(c)
-int c;
-{
- *optr++ = c;
-
- if (optr == obfr+OBFRSIZE)
- {
- write(outfile,obfr,OBFRSIZE);
- optr = obfr;
- }
-}
-
-static void putword(w)
-int w;
-{
- putbyte(w); putbyte(w>>8);
-}
-
-/* horizontal 1:2 interpolation filter */
-static void conv422to444(src,dst)
-unsigned char *src,*dst;
-{
- int i, i2, w, j, im3, im2, im1, ip1, ip2, ip3;
-
- w = Coded_Picture_Width>>1;
-
- if (base.MPEG2_Flag)
- {
- for (j=0; j<Coded_Picture_Height; j++)
- {
- for (i=0; i<w; i++)
- {
- i2 = i<<1;
- im2 = (i<2) ? 0 : i-2;
- im1 = (i<1) ? 0 : i-1;
- ip1 = (i<w-1) ? i+1 : w-1;
- ip2 = (i<w-2) ? i+2 : w-1;
- ip3 = (i<w-3) ? i+3 : w-1;
-
- /* FIR filter coefficients (*256): 21 0 -52 0 159 256 159 0 -52 0 21 */
- /* even samples (0 0 256 0 0) */
- dst[i2] = src[i];
-
- /* odd samples (21 -52 159 159 -52 21) */
- dst[i2+1] = Clip[(int)(21*(src[im2]+src[ip3])
- -52*(src[im1]+src[ip2])
- +159*(src[i]+src[ip1])+128)>>8];
- }
- src+= w;
- dst+= Coded_Picture_Width;
- }
- }
- else
- {
- for (j=0; j<Coded_Picture_Height; j++)
- {
- for (i=0; i<w; i++)
- {
-
- i2 = i<<1;
- im3 = (i<3) ? 0 : i-3;
- im2 = (i<2) ? 0 : i-2;
- im1 = (i<1) ? 0 : i-1;
- ip1 = (i<w-1) ? i+1 : w-1;
- ip2 = (i<w-2) ? i+2 : w-1;
- ip3 = (i<w-3) ? i+3 : w-1;
-
- /* FIR filter coefficients (*256): 5 -21 70 228 -37 11 */
- dst[i2] = Clip[(int)( 5*src[im3]
- -21*src[im2]
- +70*src[im1]
- +228*src[i]
- -37*src[ip1]
- +11*src[ip2]+128)>>8];
-
- dst[i2+1] = Clip[(int)( 5*src[ip3]
- -21*src[ip2]
- +70*src[ip1]
- +228*src[i]
- -37*src[im1]
- +11*src[im2]+128)>>8];
- }
- src+= w;
- dst+= Coded_Picture_Width;
- }
- }
-}
-
-/* vertical 1:2 interpolation filter */
-static void conv420to422(src,dst)
-unsigned char *src,*dst;
-{
- int w, h, i, j, j2;
- int jm6, jm5, jm4, jm3, jm2, jm1, jp1, jp2, jp3, jp4, jp5, jp6, jp7;
-
- w = Coded_Picture_Width>>1;
- h = Coded_Picture_Height>>1;
-
- if (progressive_frame)
- {
- /* intra frame */
- for (i=0; i<w; i++)
- {
- for (j=0; j<h; j++)
- {
- j2 = j<<1;
- jm3 = (j<3) ? 0 : j-3;
- jm2 = (j<2) ? 0 : j-2;
- jm1 = (j<1) ? 0 : j-1;
- jp1 = (j<h-1) ? j+1 : h-1;
- jp2 = (j<h-2) ? j+2 : h-1;
- jp3 = (j<h-3) ? j+3 : h-1;
-
- /* FIR filter coefficients (*256): 5 -21 70 228 -37 11 */
- /* New FIR filter coefficients (*256): 3 -16 67 227 -32 7 */
- dst[w*j2] = Clip[(int)( 3*src[w*jm3]
- -16*src[w*jm2]
- +67*src[w*jm1]
- +227*src[w*j]
- -32*src[w*jp1]
- +7*src[w*jp2]+128)>>8];
-
- dst[w*(j2+1)] = Clip[(int)( 3*src[w*jp3]
- -16*src[w*jp2]
- +67*src[w*jp1]
- +227*src[w*j]
- -32*src[w*jm1]
- +7*src[w*jm2]+128)>>8];
- }
- src++;
- dst++;
- }
- }
- else
- {
- /* intra field */
- for (i=0; i<w; i++)
- {
- for (j=0; j<h; j+=2)
- {
- j2 = j<<1;
-
- /* top field */
- jm6 = (j<6) ? 0 : j-6;
- jm4 = (j<4) ? 0 : j-4;
- jm2 = (j<2) ? 0 : j-2;
- jp2 = (j<h-2) ? j+2 : h-2;
- jp4 = (j<h-4) ? j+4 : h-2;
- jp6 = (j<h-6) ? j+6 : h-2;
-
- /* Polyphase FIR filter coefficients (*256): 2 -10 35 242 -18 5 */
- /* New polyphase FIR filter coefficients (*256): 1 -7 30 248 -21 5 */
- dst[w*j2] = Clip[(int)( 1*src[w*jm6]
- -7*src[w*jm4]
- +30*src[w*jm2]
- +248*src[w*j]
- -21*src[w*jp2]
- +5*src[w*jp4]+128)>>8];
-
- /* Polyphase FIR filter coefficients (*256): 11 -38 192 113 -30 8 */
- /* New polyphase FIR filter coefficients (*256):7 -35 194 110 -24 4 */
- dst[w*(j2+2)] = Clip[(int)( 7*src[w*jm4]
- -35*src[w*jm2]
- +194*src[w*j]
- +110*src[w*jp2]
- -24*src[w*jp4]
- +4*src[w*jp6]+128)>>8];
-
- /* bottom field */
- jm5 = (j<5) ? 1 : j-5;
- jm3 = (j<3) ? 1 : j-3;
- jm1 = (j<1) ? 1 : j-1;
- jp1 = (j<h-1) ? j+1 : h-1;
- jp3 = (j<h-3) ? j+3 : h-1;
- jp5 = (j<h-5) ? j+5 : h-1;
- jp7 = (j<h-7) ? j+7 : h-1;
-
- /* Polyphase FIR filter coefficients (*256): 11 -38 192 113 -30 8 */
- /* New polyphase FIR filter coefficients (*256):7 -35 194 110 -24 4 */
- dst[w*(j2+1)] = Clip[(int)( 7*src[w*jp5]
- -35*src[w*jp3]
- +194*src[w*jp1]
- +110*src[w*jm1]
- -24*src[w*jm3]
- +4*src[w*jm5]+128)>>8];
-
- dst[w*(j2+3)] = Clip[(int)( 1*src[w*jp7]
- -7*src[w*jp5]
- +30*src[w*jp3]
- +248*src[w*jp1]
- -21*src[w*jm1]
- +5*src[w*jm3]+128)>>8];
- }
- src++;
- dst++;
- }
- }
-}
Index: demos/branches/pj/mpeg2/recon.c
===================================================================
--- demos/branches/pj/mpeg2/recon.c (revision 1085)
+++ demos/branches/pj/mpeg2/recon.c (nonexistent)
@@ -1,467 +0,0 @@
-/* Predict.c, motion compensation routines */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-#include <stdio.h>
-
-#include "config.h"
-#include "global.h"
-
-/* private prototypes */
-static void form_prediction _ANSI_ARGS_((unsigned char *src[], int sfield,
- unsigned char *dst[], int dfield,
- int lx, int lx2, int w, int h, int x, int y, int dx, int dy,
- int average_flag));
-
-static void form_component_prediction _ANSI_ARGS_((unsigned char *src, unsigned char *dst,
- int lx, int lx2, int w, int h, int x, int y, int dx, int dy, int average_flag));
-
-void form_predictions(bx,by,macroblock_type,motion_type,PMV,motion_vertical_field_select,dmvector,stwtype)
-int bx, by;
-int macroblock_type;
-int motion_type;
-int PMV[2][2][2], motion_vertical_field_select[2][2], dmvector[2];
-int stwtype;
-{
- int currentfield;
- unsigned char **predframe;
- int DMV[2][2];
- int stwtop, stwbot;
-
- stwtop = stwtype%3; /* 0:temporal, 1:(spat+temp)/2, 2:spatial */
- stwbot = stwtype/3;
-
- if ((macroblock_type & MACROBLOCK_MOTION_FORWARD)
- || (picture_coding_type==P_TYPE))
- {
- if (picture_structure==FRAME_PICTURE)
- {
- if ((motion_type==MC_FRAME)
- || !(macroblock_type & MACROBLOCK_MOTION_FORWARD))
- {
- /* frame-based prediction (broken into top and bottom halves
- for spatial scalability prediction purposes) */
- if (stwtop<2)
- form_prediction(forward_reference_frame,0,current_frame,0,
- Coded_Picture_Width,Coded_Picture_Width<<1,16,8,bx,by,
- PMV[0][0][0],PMV[0][0][1],stwtop);
-
- if (stwbot<2)
- form_prediction(forward_reference_frame,1,current_frame,1,
- Coded_Picture_Width,Coded_Picture_Width<<1,16,8,bx,by,
- PMV[0][0][0],PMV[0][0][1],stwbot);
- }
- else if (motion_type==MC_FIELD) /* field-based prediction */
- {
- /* top field prediction */
- if (stwtop<2)
- form_prediction(forward_reference_frame,motion_vertical_field_select[0][0],
- current_frame,0,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,
- bx,by>>1,PMV[0][0][0],PMV[0][0][1]>>1,stwtop);
-
- /* bottom field prediction */
- if (stwbot<2)
- form_prediction(forward_reference_frame,motion_vertical_field_select[1][0],
- current_frame,1,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,
- bx,by>>1,PMV[1][0][0],PMV[1][0][1]>>1,stwbot);
- }
- else if (motion_type==MC_DMV) /* dual prime prediction */
- {
- /* calculate derived motion vectors */
- Dual_Prime_Arithmetic(DMV,dmvector,PMV[0][0][0],PMV[0][0][1]>>1);
-
- if (stwtop<2)
- {
- /* predict top field from top field */
- form_prediction(forward_reference_frame,0,current_frame,0,
- Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,bx,by>>1,
- PMV[0][0][0],PMV[0][0][1]>>1,0);
-
- /* predict and add to top field from bottom field */
- form_prediction(forward_reference_frame,1,current_frame,0,
- Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,bx,by>>1,
- DMV[0][0],DMV[0][1],1);
- }
-
- if (stwbot<2)
- {
- /* predict bottom field from bottom field */
- form_prediction(forward_reference_frame,1,current_frame,1,
- Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,bx,by>>1,
- PMV[0][0][0],PMV[0][0][1]>>1,0);
-
- /* predict and add to bottom field from top field */
- form_prediction(forward_reference_frame,0,current_frame,1,
- Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,bx,by>>1,
- DMV[1][0],DMV[1][1],1);
- }
- }
- else
- /* invalid motion_type */
- printf("invalid motion_type\n");
- }
- else /* TOP_FIELD or BOTTOM_FIELD */
- {
- /* field picture */
- currentfield = (picture_structure==BOTTOM_FIELD);
-
- /* determine which frame to use for prediction */
- if ((picture_coding_type==P_TYPE) && Second_Field
- && (currentfield!=motion_vertical_field_select[0][0]))
- predframe = backward_reference_frame; /* same frame */
- else
- predframe = forward_reference_frame; /* previous frame */
-
- if ((motion_type==MC_FIELD)
- || !(macroblock_type & MACROBLOCK_MOTION_FORWARD))
- {
- /* field-based prediction */
- if (stwtop<2)
- form_prediction(predframe,motion_vertical_field_select[0][0],current_frame,0,
- Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,16,bx,by,
- PMV[0][0][0],PMV[0][0][1],stwtop);
- }
- else if (motion_type==MC_16X8)
- {
- if (stwtop<2)
- {
- form_prediction(predframe,motion_vertical_field_select[0][0],current_frame,0,
- Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,bx,by,
- PMV[0][0][0],PMV[0][0][1],stwtop);
-
- /* determine which frame to use for lower half prediction */
- if ((picture_coding_type==P_TYPE) && Second_Field
- && (currentfield!=motion_vertical_field_select[1][0]))
- predframe = backward_reference_frame; /* same frame */
- else
- predframe = forward_reference_frame; /* previous frame */
-
- form_prediction(predframe,motion_vertical_field_select[1][0],current_frame,0,
- Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,bx,by+8,
- PMV[1][0][0],PMV[1][0][1],stwtop);
- }
- }
- else if (motion_type==MC_DMV) /* dual prime prediction */
- {
- if (Second_Field)
- predframe = backward_reference_frame; /* same frame */
- else
- predframe = forward_reference_frame; /* previous frame */
-
- /* calculate derived motion vectors */
- Dual_Prime_Arithmetic(DMV,dmvector,PMV[0][0][0],PMV[0][0][1]);
-
- /* predict from field of same parity */
- form_prediction(forward_reference_frame,currentfield,current_frame,0,
- Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,16,bx,by,
- PMV[0][0][0],PMV[0][0][1],0);
-
- /* predict from field of opposite parity */
- form_prediction(predframe,!currentfield,current_frame,0,
- Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,16,bx,by,
- DMV[0][0],DMV[0][1],1);
- }
- else
- /* invalid motion_type */
- printf("invalid motion_type\n");
- }
- stwtop = stwbot = 1;
- }
-
- if (macroblock_type & MACROBLOCK_MOTION_BACKWARD)
- {
- if (picture_structure==FRAME_PICTURE)
- {
- if (motion_type==MC_FRAME)
- {
- /* frame-based prediction */
- if (stwtop<2)
- form_prediction(backward_reference_frame,0,current_frame,0,
- Coded_Picture_Width,Coded_Picture_Width<<1,16,8,bx,by,
- PMV[0][1][0],PMV[0][1][1],stwtop);
-
- if (stwbot<2)
- form_prediction(backward_reference_frame,1,current_frame,1,
- Coded_Picture_Width,Coded_Picture_Width<<1,16,8,bx,by,
- PMV[0][1][0],PMV[0][1][1],stwbot);
- }
- else /* field-based prediction */
- {
- /* top field prediction */
- if (stwtop<2)
- form_prediction(backward_reference_frame,motion_vertical_field_select[0][1],
- current_frame,0,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,
- bx,by>>1,PMV[0][1][0],PMV[0][1][1]>>1,stwtop);
-
- /* bottom field prediction */
- if (stwbot<2)
- form_prediction(backward_reference_frame,motion_vertical_field_select[1][1],
- current_frame,1,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,
- bx,by>>1,PMV[1][1][0],PMV[1][1][1]>>1,stwbot);
- }
- }
- else /* TOP_FIELD or BOTTOM_FIELD */
- {
- /* field picture */
- if (motion_type==MC_FIELD)
- {
- /* field-based prediction */
- form_prediction(backward_reference_frame,motion_vertical_field_select[0][1],
- current_frame,0,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,16,
- bx,by,PMV[0][1][0],PMV[0][1][1],stwtop);
- }
- else if (motion_type==MC_16X8)
- {
- form_prediction(backward_reference_frame,motion_vertical_field_select[0][1],
- current_frame,0,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,
- bx,by,PMV[0][1][0],PMV[0][1][1],stwtop);
-
- form_prediction(backward_reference_frame,motion_vertical_field_select[1][1],
- current_frame,0,Coded_Picture_Width<<1,Coded_Picture_Width<<1,16,8,
- bx,by+8,PMV[1][1][0],PMV[1][1][1],stwtop);
- }
- else
- /* invalid motion_type */
- printf("invalid motion_type\n");
- }
- }
-}
-
-static void form_prediction(src,sfield,dst,dfield,lx,lx2,w,h,x,y,dx,dy,average_flag)
-unsigned char *src[]; /* prediction source buffer */
-int sfield; /* prediction source field number (0 or 1) */
-unsigned char *dst[]; /* prediction destination buffer */
-int dfield; /* prediction destination field number (0 or 1)*/
-int lx,lx2; /* line strides */
-int w,h; /* prediction block/sub-block width, height */
-int x,y; /* pixel co-ordinates of top-left sample in current MB */
-int dx,dy; /* horizontal, vertical prediction address */
-int average_flag; /* add prediction error to prediction ? */
-{
- /* Y */
- form_component_prediction(src[0]+(sfield?lx2>>1:0),dst[0]+(dfield?lx2>>1:0),
- lx,lx2,w,h,x,y,dx,dy,average_flag);
-
- if (chroma_format!=CHROMA444)
- {
- lx>>=1; lx2>>=1; w>>=1; x>>=1; dx/=2;
- }
-
- if (chroma_format==CHROMA420)
- {
- h>>=1; y>>=1; dy/=2;
- }
-
- /* Cb */
- form_component_prediction(src[1]+(sfield?lx2>>1:0),dst[1]+(dfield?lx2>>1:0),
- lx,lx2,w,h,x,y,dx,dy,average_flag);
-
- /* Cr */
- form_component_prediction(src[2]+(sfield?lx2>>1:0),dst[2]+(dfield?lx2>>1:0),
- lx,lx2,w,h,x,y,dx,dy,average_flag);
-}
-
-/* ISO/IEC 13818-2 section 7.6.4: Forming predictions */
-/* NOTE: the arithmetic below produces numerically equivalent results
- * to 7.6.4, yet is more elegant. It differs in the following ways:
- *
- * 1. the vectors (dx, dy) are based on cartesian frame
- * coordiantes along a half-pel grid (always positive numbers)
- * In contrast, vector[r][s][t] are differential (with positive and
- * negative values). As a result, deriving the integer vectors
- * (int_vec[t]) from dx, dy is accomplished by a simple right shift.
- *
- * 2. Half pel flags (xh, yh) are equivalent to the LSB (Least
- * Significant Bit) of the half-pel coordinates (dx,dy).
- *
- *
- * NOTE: the work of combining predictions (ISO/IEC 13818-2 section 7.6.7)
- * is distributed among several other stages. This is accomplished by
- * folding line offsets into the source and destination (src,dst)
- * addresses (note the call arguments to form_prediction() in Predict()),
- * line stride variables lx and lx2, the block dimension variables (w,h),
- * average_flag, and by the very order in which Predict() is called.
- * This implementation design (implicitly different than the spec)
- * was chosen for its elegance.
-*/
-
-static void form_component_prediction(src,dst,lx,lx2,w,h,x,y,dx,dy,average_flag)
-unsigned char *src;
-unsigned char *dst;
-int lx; /* raster line increment */
-int lx2;
-int w,h;
-int x,y;
-int dx,dy;
-int average_flag; /* flag that signals bi-directional or Dual-Prime
- averaging (7.6.7.1 and 7.6.7.4). if average_flag==1,
- a previously formed prediction has been stored in
- pel_pred[] */
-{
- int xint; /* horizontal integer sample vector: analogous to int_vec[0] */
- int yint; /* vertical integer sample vectors: analogous to int_vec[1] */
- int xh; /* horizontal half sample flag: analogous to half_flag[0] */
- int yh; /* vertical half sample flag: analogous to half_flag[1] */
- int i, j, v;
- unsigned char *s; /* source pointer: analogous to pel_ref[][] */
- unsigned char *d; /* destination pointer: analogous to pel_pred[][] */
-
- /* half pel scaling for integer vectors */
- xint = dx>>1;
- yint = dy>>1;
-
- /* derive half pel flags */
- xh = dx & 1;
- yh = dy & 1;
-
- /* compute the linear address of pel_ref[][] and pel_pred[][]
- based on cartesian/raster cordinates provided */
- s = src + lx*(y+yint) + x + xint;
- d = dst + lx*y + x;
-
- if (!xh && !yh) /* no horizontal nor vertical half-pel */
- {
- if (average_flag)
- {
- for (j=0; j<h; j++)
- {
- for (i=0; i<w; i++)
- {
- v = d[i]+s[i];
- d[i] = (v+(v>=0?1:0))>>1;
- }
-
- s+= lx2;
- d+= lx2;
- }
- }
- else
- {
- for (j=0; j<h; j++)
- {
- for (i=0; i<w; i++)
- {
- d[i] = s[i];
- }
-
- s+= lx2;
- d+= lx2;
- }
- }
- }
- else if (!xh && yh) /* no horizontal but vertical half-pel */
- {
- if (average_flag)
- {
- for (j=0; j<h; j++)
- {
- for (i=0; i<w; i++)
- {
- v = d[i] + ((unsigned int)(s[i]+s[i+lx]+1)>>1);
- d[i]=(v+(v>=0?1:0))>>1;
- }
-
- s+= lx2;
- d+= lx2;
- }
- }
- else
- {
- for (j=0; j<h; j++)
- {
- for (i=0; i<w; i++)
- {
- d[i] = (unsigned int)(s[i]+s[i+lx]+1)>>1;
- }
-
- s+= lx2;
- d+= lx2;
- }
- }
- }
- else if (xh && !yh) /* horizontal but no vertical half-pel */
- {
- if (average_flag)
- {
- for (j=0; j<h; j++)
- {
- for (i=0; i<w; i++)
- {
- v = d[i] + ((unsigned int)(s[i]+s[i+1]+1)>>1);
- d[i] = (v+(v>=0?1:0))>>1;
- }
-
- s+= lx2;
- d+= lx2;
- }
- }
- else
- {
- for (j=0; j<h; j++)
- {
- for (i=0; i<w; i++)
- {
- d[i] = (unsigned int)(s[i]+s[i+1]+1)>>1;
- }
-
- s+= lx2;
- d+= lx2;
- }
- }
- }
- else /* if (xh && yh) horizontal and vertical half-pel */
- {
- if (average_flag)
- {
- for (j=0; j<h; j++)
- {
- for (i=0; i<w; i++)
- {
- v = d[i] + ((unsigned int)(s[i]+s[i+1]+s[i+lx]+s[i+lx+1]+2)>>2);
- d[i] = (v+(v>=0?1:0))>>1;
- }
-
- s+= lx2;
- d+= lx2;
- }
- }
- else
- {
- for (j=0; j<h; j++)
- {
- for (i=0; i<w; i++)
- {
- d[i] = (unsigned int)(s[i]+s[i+1]+s[i+lx]+s[i+lx+1]+2)>>2;
- }
-
- s+= lx2;
- d+= lx2;
- }
- }
- }
-}
Index: demos/branches/pj/mpeg2/systems.c
===================================================================
--- demos/branches/pj/mpeg2/systems.c (revision 1085)
+++ demos/branches/pj/mpeg2/systems.c (nonexistent)
@@ -1,200 +0,0 @@
-/* systems.c, systems-specific routines */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "config.h"
-#include "global.h"
-
-/* initialize buffer, call once before first getbits or showbits */
-
-/* parse system layer, ignore everything we don't need */
-void Next_Packet()
-{
- unsigned int code;
- int l;
-
- for(;;)
- {
- code = Get_Long();
-
- /* remove system layer byte stuffing */
- while ((code & 0xffffff00) != 0x100)
- code = (code<<8) | Get_Byte();
-
- switch(code)
- {
- case PACK_START_CODE: /* pack header */
- /* skip pack header (system_clock_reference and mux_rate) */
- ld->Rdptr += 8;
- break;
- case VIDEO_ELEMENTARY_STREAM:
- code = Get_Word(); /* packet_length */
- ld->Rdmax = ld->Rdptr + code;
-
- code = Get_Byte();
-
- if((code>>6)==0x02)
- {
- ld->Rdptr++;
- code=Get_Byte(); /* parse PES_header_data_length */
- ld->Rdptr+=code; /* advance pointer by PES_header_data_length */
- printf("MPEG-2 PES packet\n");
- return;
- }
- else if(code==0xff)
- {
- /* parse MPEG-1 packet header */
- while((code=Get_Byte())== 0xFF);
- }
-
- /* stuffing bytes */
- if(code>=0x40)
- {
- if(code>=0x80)
- {
- fprintf(stderr,"Error in packet header\n");
- exit(1);
- }
- /* skip STD_buffer_scale */
- ld->Rdptr++;
- code = Get_Byte();
- }
-
- if(code>=0x30)
- {
- if(code>=0x40)
- {
- fprintf(stderr,"Error in packet header\n");
- exit(1);
- }
- /* skip presentation and decoding time stamps */
- ld->Rdptr += 9;
- }
- else if(code>=0x20)
- {
- /* skip presentation time stamps */
- ld->Rdptr += 4;
- }
- else if(code!=0x0f)
- {
- fprintf(stderr,"Error in packet header\n");
- exit(1);
- }
- return;
- case ISO_END_CODE: /* end */
- /* simulate a buffer full of sequence end codes */
- l = 0;
- while (l<2048)
- {
- ld->Rdbfr[l++] = SEQUENCE_END_CODE>>24;
- ld->Rdbfr[l++] = SEQUENCE_END_CODE>>16;
- ld->Rdbfr[l++] = SEQUENCE_END_CODE>>8;
- ld->Rdbfr[l++] = SEQUENCE_END_CODE&0xff;
- }
- ld->Rdptr = ld->Rdbfr;
- ld->Rdmax = ld->Rdbfr + 2048;
- return;
- default:
- if(code>=SYSTEM_START_CODE)
- {
- /* skip system headers and non-video packets*/
- code = Get_Word();
- ld->Rdptr += code;
- }
- else
- {
- fprintf(stderr,"Unexpected startcode %08x in system layer\n",code);
- exit(1);
- }
- break;
- }
- }
-}
-
-
-
-void Flush_Buffer32()
-{
- int Incnt;
-
- ld->Bfr = 0;
-
- Incnt = ld->Incnt;
- Incnt -= 32;
-
- if (System_Stream_Flag && (ld->Rdptr >= ld->Rdmax-4))
- {
- while (Incnt <= 24)
- {
- if (ld->Rdptr >= ld->Rdmax)
- Next_Packet();
- ld->Bfr |= Get_Byte() << (24 - Incnt);
- Incnt += 8;
- }
- }
- else
- {
- while (Incnt <= 24)
- {
- if (ld->Rdptr >= ld->Rdbfr+2048)
- Fill_Buffer();
- ld->Bfr |= *ld->Rdptr++ << (24 - Incnt);
- Incnt += 8;
- }
- }
- ld->Incnt = Incnt;
-
-#ifdef VERIFY
- ld->Bitcnt += 32;
-#endif /* VERIFY */
-}
-
-
-unsigned int Get_Bits32()
-{
- unsigned int l;
-
- l = Show_Bits(32);
- Flush_Buffer32();
-
- return l;
-}
-
-
-int Get_Long()
-{
- int i;
-
- i = Get_Word();
- return (i<<16) | Get_Word();
-}
-
-
Index: demos/branches/pj/mpeg2/subspic.c
===================================================================
--- demos/branches/pj/mpeg2/subspic.c (revision 1085)
+++ demos/branches/pj/mpeg2/subspic.c (nonexistent)
@@ -1,392 +0,0 @@
-/* #define DEBUG */
-/* subspic.c, Frame buffer substitution routines */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <fcntl.h>
-
-#include "config.h"
-#include "global.h"
-
-/* private prototypes*/
-static void Read_Frame _ANSI_ARGS_((char *filename,
- unsigned char *frame_buffer[], int framenum));
-static void Copy_Frame _ANSI_ARGS_((unsigned char *src, unsigned char *dst,
- int width, int height, int parity, int incr));
-static int Read_Components _ANSI_ARGS_ ((char *filename,
- unsigned char *frame[3], int framenum));
-static int Read_Component _ANSI_ARGS_ ((char *fname, unsigned char *frame,
- int width, int height));
-static int Extract_Components _ANSI_ARGS_ ((char *filename,
- unsigned char *frame[3], int framenum));
-
-
-/* substitute frame buffer routine */
-void Substitute_Frame_Buffer (bitstream_framenum, sequence_framenum)
-int bitstream_framenum;
-int sequence_framenum;
-{
- /* static tracking variables */
- static int previous_temporal_reference;
- static int previous_bitstream_framenum;
- static int previous_anchor_temporal_reference;
- static int previous_anchor_bitstream_framenum;
- static int previous_picture_coding_type;
- static int bgate;
-
- /* local temporary variables */
- int substitute_display_framenum;
-
-
-#ifdef DEBUG
- printf("SUB: seq fn(%d) bitfn(%d) tempref(%d) picstr(%d) type(%d)\n",
- sequence_framenum, bitstream_framenum, temporal_reference,
- picture_structure, picture_coding_type);
-#endif
-
- /* we don't substitute at the first picture of a sequence */
- if((sequence_framenum!=0)||(Second_Field))
- {
- /* only at the start of the frame */
- if ((picture_structure==FRAME_PICTURE)||(!Second_Field))
- {
- if(picture_coding_type==P_TYPE)
- {
- /* the most recently decoded reference frame needs substituting */
- substitute_display_framenum = bitstream_framenum - 1;
-
- Read_Frame(Substitute_Picture_Filename, forward_reference_frame,
- substitute_display_framenum);
- }
- /* only the first B frame in a consequitve set of B pictures
- loads a substitute backward_reference_frame since all subsequent
- B frames predict from the same reference pictures */
- else if((picture_coding_type==B_TYPE)&&(bgate!=1))
- {
- substitute_display_framenum =
- (previous_temporal_reference - temporal_reference)
- + bitstream_framenum - 1;
-
- Read_Frame(Substitute_Picture_Filename, backward_reference_frame,
- substitute_display_framenum);
- }
- } /* P fields can predict from the two most recently decoded fields, even
- from the first field of the same frame being decoded */
- else if(Second_Field && (picture_coding_type==P_TYPE))
- {
- /* our favourite case: the IP field picture pair */
- if((previous_picture_coding_type==I_TYPE)&&(picture_coding_type==P_TYPE))
- {
- substitute_display_framenum = bitstream_framenum;
- }
- else /* our more generic P field picture pair */
- {
- substitute_display_framenum =
- (temporal_reference - previous_anchor_temporal_reference)
- + bitstream_framenum - 1;
- }
-
- Read_Frame(Substitute_Picture_Filename, current_frame, substitute_display_framenum);
- }
-#ifdef DEBUG
- else if((picture_coding_type!=B_TYPE)||(picture_coding_type!=D_TYPE))
- {
- printf("NO SUBS FOR THIS PICTURE\n");
- }
-#endif
- }
-
-
- /* set b gate so we don't redundantly load next time around */
- if(picture_coding_type==B_TYPE)
- bgate = 1;
- else
- bgate = 0;
-
- /* update general tracking variables */
- if((picture_structure==FRAME_PICTURE)||(!Second_Field))
- {
- previous_temporal_reference = temporal_reference;
- previous_bitstream_framenum = bitstream_framenum;
- }
-
- /* update reference frame tracking variables */
- if((picture_coding_type!=B_TYPE) &&
- ((picture_structure==FRAME_PICTURE)||Second_Field))
- {
- previous_anchor_temporal_reference = temporal_reference;
- previous_anchor_bitstream_framenum = bitstream_framenum;
- }
-
- previous_picture_coding_type = picture_coding_type;
-
-}
-
-
-/* Note: fields are only read to serve as the same-frame reference for
- a second field */
-static void Read_Frame(fname,frame,framenum)
-char *fname;
-unsigned char *frame[];
-int framenum;
-{
- int parity;
- int rerr = 0;
- int field_mode;
-
- if(framenum<0)
- printf("ERROR: framenum (%d) is less than zero\n", framenum);
-
-
- if(Big_Picture_Flag)
- rerr = Extract_Components(fname, substitute_frame, framenum);
- else
- rerr = Read_Components(fname, substitute_frame, framenum);
-
- if(rerr!=0)
- {
- printf("was unable to substitute frame\n");
- }
-
- /* now copy to the appropriate buffer */
- /* first field (which we are attempting to substitute) must be
- of opposite field parity to the current one */
- if((Second_Field)&&(picture_coding_type==P_TYPE))
- {
- parity = (picture_structure==TOP_FIELD ? 1:0);
- field_mode = (picture_structure==FRAME_PICTURE ? 0:1);
- }
- else
- {
- /* Like frame structued pictures, B pictures only substitute an entire frame
- since both fields always predict from the same frame (with respect
- to forward/backwards directions) */
- parity = 0;
- field_mode = 0;
- }
-
-
- Copy_Frame(substitute_frame[0], frame[0], Coded_Picture_Width,
- Coded_Picture_Height, parity, field_mode);
-
- Copy_Frame(substitute_frame[1], frame[1], Chroma_Width, Chroma_Height,
- parity, field_mode);
-
- Copy_Frame(substitute_frame[2], frame[2], Chroma_Width, Chroma_Height,
- parity, field_mode);
-
-#ifdef VERBOSE
- if(Verbose_Flag > NO_LAYER)
- printf("substituted %s %d\n",
- (field_mode ? (parity?"bottom field":"bottom field"):"frame"), framenum);
-#endif
-}
-
-
-
-
-static int Read_Components(filename, frame, framenum)
-char *filename;
-unsigned char *frame[3];
-int framenum;
-{
- int err = 0;
- char outname[FILENAME_LENGTH];
- char name[FILENAME_LENGTH];
-
- sprintf(outname,filename,framenum);
-
-
- sprintf(name,"%s.Y",outname);
- err += Read_Component(name, frame[0], Coded_Picture_Width,
- Coded_Picture_Height);
-
- sprintf(name,"%s.U",outname);
- err += Read_Component(name, frame[1], Chroma_Width, Chroma_Height);
-
- sprintf(name,"%s.V",outname);
- err += Read_Component(name, frame[2], Chroma_Width, Chroma_Height);
-
- return(err);
-}
-
-
-static int Read_Component(Filename, Frame, Width, Height)
-char *Filename;
-unsigned char *Frame;
-int Width;
-int Height;
-{
- int Size;
- int Bytes_Read;
- int Infile;
-
- Size = Width*Height;
-
-#ifdef DEBUG
- printf("SUBS: reading %s\n", filename);
-#endif
-
- if(!(Infile=open(Filename,O_RDONLY|O_BINARY))<0)
- {
- printf("ERROR: unable to open reference filename (%s)\n", Filename);
- return(-1);
- }
-
- Bytes_Read = read(Infile, Frame, Size);
-
- if(Bytes_Read!=Size)
- {
- printf("was able to read only %d bytes of %d of file %s\n",
- Bytes_Read, Size, Filename);
- }
-
- close(Infile);
- return(0);
-}
-
-
-/* optimization: do not open the big file each time. Open once at start
- of decoder, and close at the very last frame */
-
-/* Note: "big" files were used in E-mail exchanges almost exclusively by the
- MPEG Committee's syntax validation and conformance ad-hoc groups from
- the year 1993 until 1995 */
-static int Extract_Components(filename, frame, framenum)
-char *filename;
-unsigned char *frame[3];
-int framenum;
-{
-/* int err = 0; */
- FILE *fd;
- int line;
- int size, offset;
-
-
- if (!(fd = fopen(filename,"rb")))
- {
- sprintf(Error_Text,"Couldn't open %s\n",filename);
- return(-1);
- }
-
- /* compute size of each frame (in bytes) */
- size = (Coded_Picture_Width*Coded_Picture_Height);
-
- if(chroma_format==CHROMA444)
- size = (size * 3);
- else if(chroma_format==CHROMA422)
- size = (size * 2);
- else if(chroma_format==CHROMA420)
- size = ((size*3)>>1);
- else
- printf("ERROR: chroma_format (%d) not recognized\n", chroma_format);
-
-
- /* compute distance into "big" file */
- offset = size*framenum;
-
-#ifdef DEBUG
- printf("EXTRACTING: frame(%d) offset(%d), size (%d) from %s\n",
- framenum, offset, size, filename);
-#endif
-
- /* seek to location in big file where desired frame begins */
- /* note: this offset cannot exceed a few billion bytes due to the */
- /* obvious limitations of 32-bit integers */
- fseek(fd, offset, 0);
-
- /* Y */
- for (line=0; line<Coded_Picture_Height; line++)
- {
- fread(frame[0]+(line*Coded_Picture_Width),1,Coded_Picture_Width,fd);
- }
-
- /* Cb */
- for (line=0; line<Chroma_Height; line++)
- {
- fread(frame[1]+(line*Chroma_Width),1,Chroma_Width,fd);
- }
-
- /* Cr */
- for (line=0; line<Chroma_Height; line++)
- {
- fread(frame[2]+(line*Chroma_Width),1,Chroma_Width,fd);
- }
-
-
- fclose(fd);
- return(0);
-}
-
-
-static void Copy_Frame(src, dst, width, height, parity, field_mode)
-unsigned char *src;
-unsigned char *dst;
-int width;
-int height;
-int parity; /* field parity (top or bottom) to overwrite */
-int field_mode; /* 0 = frame, 1 = field */
-{
- int row, col;
- int s, d;
- int incr;
-
- s = d = 0;
-
-#ifdef DEBUG
- printf("COPYING (w=%d, h=%d, parity=%d, field_mode=%d)\n",
- width,height,parity,field_mode);
-#endif /* DEBUG */
-
- if(field_mode)
- {
- incr = 2;
-
- if(parity==0)
- s += width;
- }
- else
- {
- incr = 1;
- }
-
- for(row=0; row<height; row+=incr)
- {
- for(col=0; col<width; col++)
- {
- dst[d+col] = src[s+col];
- }
-
- d += (width*incr);
- s += (width*incr);
- }
-
-}
-
Index: demos/branches/pj/mpeg2/config.h
===================================================================
--- demos/branches/pj/mpeg2/config.h (revision 1085)
+++ demos/branches/pj/mpeg2/config.h (nonexistent)
@@ -1,45 +0,0 @@
-/* config.h, configuration defines */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-/* define NON_ANSI_COMPILER for compilers without function prototyping */
-/* #define NON_ANSI_COMPILER */
-
-#ifdef NON_ANSI_COMPILER
-#define _ANSI_ARGS_(x) ()
-#else
-#define _ANSI_ARGS_(x) x
-#endif
-
-#define RB "rb"
-#define WB "wb"
-
-#ifndef O_BINARY
-#define O_BINARY 0
-
-#endif
Index: demos/branches/pj/mpeg2/getpic.c
===================================================================
--- demos/branches/pj/mpeg2/getpic.c (revision 1085)
+++ demos/branches/pj/mpeg2/getpic.c (nonexistent)
@@ -1,1225 +0,0 @@
-/* getpic.c, picture decoding */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-#include <stdio.h>
-
-#include "config.h"
-#include "global.h"
-
-/* private prototypes*/
-static void picture_data _ANSI_ARGS_((int framenum));
-static void macroblock_modes _ANSI_ARGS_((int *pmacroblock_type, int *pstwtype,
- int *pstwclass, int *pmotion_type, int *pmotion_vector_count, int *pmv_format, int *pdmv,
- int *pmvscale, int *pdct_type));
-static void Clear_Block _ANSI_ARGS_((int comp));
-static void Sum_Block _ANSI_ARGS_((int comp));
-static void Saturate _ANSI_ARGS_((short *bp));
-static void Add_Block _ANSI_ARGS_((int comp, int bx, int by,
- int dct_type, int addflag));
-static void Update_Picture_Buffers _ANSI_ARGS_((void));
-static void frame_reorder _ANSI_ARGS_((int bitstream_framenum,
- int sequence_framenum));
-static void Decode_SNR_Macroblock _ANSI_ARGS_((int *SNRMBA, int *SNRMBAinc,
- int MBA, int MBAmax, int *dct_type));
-
-static void motion_compensation _ANSI_ARGS_((int MBA, int macroblock_type,
- int motion_type, int PMV[2][2][2], int motion_vertical_field_select[2][2],
- int dmvector[2], int stwtype, int dct_type));
-
-static void skipped_macroblock _ANSI_ARGS_((int dc_dct_pred[3],
- int PMV[2][2][2], int *motion_type, int motion_vertical_field_select[2][2],
- int *stwtype, int *macroblock_type));
-
-static int slice _ANSI_ARGS_((int framenum, int MBAmax));
-
-static int start_of_slice _ANSI_ARGS_ ((int MBAmax, int *MBA,
- int *MBAinc, int dc_dct_pred[3], int PMV[2][2][2]));
-
-static int decode_macroblock _ANSI_ARGS_((int *macroblock_type,
- int *stwtype, int *stwclass, int *motion_type, int *dct_type,
- int PMV[2][2][2], int dc_dct_pred[3],
- int motion_vertical_field_select[2][2], int dmvector[2]));
-
-
-/* decode one frame or field picture */
-void Decode_Picture(bitstream_framenum, sequence_framenum)
-int bitstream_framenum, sequence_framenum;
-{
-
- if (picture_structure==FRAME_PICTURE && Second_Field)
- {
- /* recover from illegal number of field pictures */
- printf("odd number of field pictures\n");
- Second_Field = 0;
- }
-
- /* IMPLEMENTATION: update picture buffer pointers */
- Update_Picture_Buffers();
-
-#ifdef VERIFY
- Check_Headers(bitstream_framenum, sequence_framenum);
-#endif /* VERIFY */
-
- /* ISO/IEC 13818-4 section 2.4.5.4 "frame buffer intercept method" */
- /* (section number based on November 1995 (Dallas) draft of the
- conformance document) */
- if(Ersatz_Flag)
- Substitute_Frame_Buffer(bitstream_framenum, sequence_framenum);
-
- /* form spatial scalable picture */
-
- /* form spatial scalable picture */
- /* ISO/IEC 13818-2 section 7.7: Spatial scalability */
- if (base.pict_scal && !Second_Field)
- {
- Spatial_Prediction();
- }
-
- /* decode picture data ISO/IEC 13818-2 section 6.2.3.7 */
- picture_data(bitstream_framenum);
-
- /* write or display current or previously decoded reference frame */
- /* ISO/IEC 13818-2 section 6.1.1.11: Frame reordering */
- frame_reorder(bitstream_framenum, sequence_framenum);
-
- if (picture_structure!=FRAME_PICTURE)
- Second_Field = !Second_Field;
-}
-
-
-/* decode all macroblocks of the current picture */
-/* stages described in ISO/IEC 13818-2 section 7 */
-static void picture_data(framenum)
-int framenum;
-{
- int MBAmax;
- int ret;
-
- /* number of macroblocks per picture */
- MBAmax = mb_width*mb_height;
-
- if (picture_structure!=FRAME_PICTURE)
- MBAmax>>=1; /* field picture has half as mnay macroblocks as frame */
-
- for(;;)
- {
- if((ret=slice(framenum, MBAmax))<0)
- return;
- }
-
-}
-
-
-
-/* decode all macroblocks of the current picture */
-/* ISO/IEC 13818-2 section 6.3.16 */
-static int slice(framenum, MBAmax)
-int framenum, MBAmax;
-{
- int MBA;
- int MBAinc, macroblock_type, motion_type, dct_type;
- int dc_dct_pred[3];
- int PMV[2][2][2], motion_vertical_field_select[2][2];
- int dmvector[2];
- int stwtype, stwclass;
- int SNRMBA, SNRMBAinc;
- int ret;
-
- MBA = 0; /* macroblock address */
- MBAinc = 0;
-
- if((ret=start_of_slice(MBAmax, &MBA, &MBAinc, dc_dct_pred, PMV))!=1)
- return(ret);
-
- if (Two_Streams && enhan.scalable_mode==SC_SNR)
- {
- SNRMBA=0;
- SNRMBAinc=0;
- }
-
- Fault_Flag=0;
-
- for (;;)
- {
-
- /* this is how we properly exit out of picture */
- if (MBA>=MBAmax)
- return(-1); /* all macroblocks decoded */
-
-#ifdef TRACE
- if (Trace_Flag)
- printf("frame %d, MB %d\n",framenum,MBA);
-#endif /* TRACE */
-
-#ifdef DISPLAY
- if (!progressive_frame && picture_structure==FRAME_PICTURE
- && MBA==(MBAmax>>1) && framenum!=0 && Output_Type==T_X11
- && !Display_Progressive_Flag)
- {
- Display_Second_Field();
- }
-#endif
-
- ld = &base;
-
- if (MBAinc==0)
- {
- if (base.scalable_mode==SC_DP && base.priority_breakpoint==1)
- ld = &enhan;
-
- if (!Show_Bits(23) || Fault_Flag) /* next_start_code or fault */
- {
-resync: /* if Fault_Flag: resynchronize to next next_start_code */
- Fault_Flag = 0;
- return(0); /* trigger: go to next slice */
- }
- else /* neither next_start_code nor Fault_Flag */
- {
- if (base.scalable_mode==SC_DP && base.priority_breakpoint==1)
- ld = &enhan;
-
- /* decode macroblock address increment */
- MBAinc = Get_macroblock_address_increment();
-
- if (Fault_Flag) goto resync;
- }
- }
-
- if (MBA>=MBAmax)
- {
- /* MBAinc points beyond picture dimensions */
- if (!Quiet_Flag)
- printf("Too many macroblocks in picture\n");
- return(-1);
- }
-
- if (MBAinc==1) /* not skipped */
- {
- ret = decode_macroblock(&macroblock_type, &stwtype, &stwclass,
- &motion_type, &dct_type, PMV, dc_dct_pred,
- motion_vertical_field_select, dmvector);
-
- if(ret==-1)
- return(-1);
-
- if(ret==0)
- goto resync;
-
- }
- else /* MBAinc!=1: skipped macroblock */
- {
- /* ISO/IEC 13818-2 section 7.6.6 */
- skipped_macroblock(dc_dct_pred, PMV, &motion_type,
- motion_vertical_field_select, &stwtype, &macroblock_type);
- }
-
- /* SCALABILITY: SNR */
- /* ISO/IEC 13818-2 section 7.8 */
- /* NOTE: we currently ignore faults encountered in this routine */
- if (Two_Streams && enhan.scalable_mode==SC_SNR)
- Decode_SNR_Macroblock(&SNRMBA, &SNRMBAinc, MBA, MBAmax, &dct_type);
-
- /* ISO/IEC 13818-2 section 7.6 */
- motion_compensation(MBA, macroblock_type, motion_type, PMV,
- motion_vertical_field_select, dmvector, stwtype, dct_type);
-
-
- /* advance to next macroblock */
- MBA++;
- MBAinc--;
-
- /* SCALABILITY: SNR */
- if (Two_Streams && enhan.scalable_mode==SC_SNR)
- {
- SNRMBA++;
- SNRMBAinc--;
- }
-
- if (MBA>=MBAmax)
- return(-1); /* all macroblocks decoded */
- }
-}
-
-
-/* ISO/IEC 13818-2 section 6.3.17.1: Macroblock modes */
-static void macroblock_modes(pmacroblock_type,pstwtype,pstwclass,
- pmotion_type,pmotion_vector_count,pmv_format,pdmv,pmvscale,pdct_type)
- int *pmacroblock_type, *pstwtype, *pstwclass;
- int *pmotion_type, *pmotion_vector_count, *pmv_format, *pdmv, *pmvscale;
- int *pdct_type;
-{
- int macroblock_type;
- int stwtype, stwcode, stwclass;
- int motion_type = 0;
- int motion_vector_count, mv_format, dmv, mvscale;
- int dct_type;
- static unsigned char stwc_table[3][4]
- = { {6,3,7,4}, {2,1,5,4}, {2,5,7,4} };
- static unsigned char stwclass_table[9]
- = {0, 1, 2, 1, 1, 2, 3, 3, 4};
-
- /* get macroblock_type */
- macroblock_type = Get_macroblock_type();
-
- if (Fault_Flag) return;
-
- /* get spatial_temporal_weight_code */
- if (macroblock_type & MB_WEIGHT)
- {
- if (spatial_temporal_weight_code_table_index==0)
- stwtype = 4;
- else
- {
- stwcode = Get_Bits(2);
-#ifdef TRACE
- if (Trace_Flag)
- {
- printf("spatial_temporal_weight_code (");
- Print_Bits(stwcode,2,2);
- printf("): %d\n",stwcode);
- }
-#endif /* TRACE */
- stwtype = stwc_table[spatial_temporal_weight_code_table_index-1][stwcode];
- }
- }
- else
- stwtype = (macroblock_type & MB_CLASS4) ? 8 : 0;
-
- /* SCALABILITY: derive spatial_temporal_weight_class (Table 7-18) */
- stwclass = stwclass_table[stwtype];
-
- /* get frame/field motion type */
- if (macroblock_type & (MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD))
- {
- if (picture_structure==FRAME_PICTURE) /* frame_motion_type */
- {
- motion_type = frame_pred_frame_dct ? MC_FRAME : Get_Bits(2);
-#ifdef TRACE
- if (!frame_pred_frame_dct && Trace_Flag)
- {
- printf("frame_motion_type (");
- Print_Bits(motion_type,2,2);
- printf("): %s\n",motion_type==MC_FIELD?"Field":
- motion_type==MC_FRAME?"Frame":
- motion_type==MC_DMV?"Dual_Prime":"Invalid");
- }
-#endif /* TRACE */
- }
- else /* field_motion_type */
- {
- motion_type = Get_Bits(2);
-#ifdef TRACE
- if (Trace_Flag)
- {
- printf("field_motion_type (");
- Print_Bits(motion_type,2,2);
- printf("): %s\n",motion_type==MC_FIELD?"Field":
- motion_type==MC_16X8?"16x8 MC":
- motion_type==MC_DMV?"Dual_Prime":"Invalid");
- }
-#endif /* TRACE */
- }
- }
- else if ((macroblock_type & MACROBLOCK_INTRA) && concealment_motion_vectors)
- {
- /* concealment motion vectors */
- motion_type = (picture_structure==FRAME_PICTURE) ? MC_FRAME : MC_FIELD;
- }
-#if 0
- else
- {
- printf("maroblock_modes(): unknown macroblock type\n");
- motion_type = -1;
- }
-#endif
-
- /* derive motion_vector_count, mv_format and dmv, (table 6-17, 6-18) */
- if (picture_structure==FRAME_PICTURE)
- {
- motion_vector_count = (motion_type==MC_FIELD && stwclass<2) ? 2 : 1;
- mv_format = (motion_type==MC_FRAME) ? MV_FRAME : MV_FIELD;
- }
- else
- {
- motion_vector_count = (motion_type==MC_16X8) ? 2 : 1;
- mv_format = MV_FIELD;
- }
-
- dmv = (motion_type==MC_DMV); /* dual prime */
-
- /* field mv predictions in frame pictures have to be scaled
- * ISO/IEC 13818-2 section 7.6.3.1 Decoding the motion vectors
- * IMPLEMENTATION: mvscale is derived for later use in motion_vectors()
- * it displaces the stage:
- *
- * if((mv_format=="field")&&(t==1)&&(picture_structure=="Frame picture"))
- * prediction = PMV[r][s][t] DIV 2;
- */
-
- mvscale = ((mv_format==MV_FIELD) && (picture_structure==FRAME_PICTURE));
-
- /* get dct_type (frame DCT / field DCT) */
- dct_type = (picture_structure==FRAME_PICTURE)
- && (!frame_pred_frame_dct)
- && (macroblock_type & (MACROBLOCK_PATTERN|MACROBLOCK_INTRA))
- ? Get_Bits(1)
- : 0;
-
-#ifdef TRACE
- if (Trace_Flag && (picture_structure==FRAME_PICTURE)
- && (!frame_pred_frame_dct)
- && (macroblock_type & (MACROBLOCK_PATTERN|MACROBLOCK_INTRA)))
- printf("dct_type (%d): %s\n",dct_type,dct_type?"Field":"Frame");
-#endif /* TRACE */
-
- /* return values */
- *pmacroblock_type = macroblock_type;
- *pstwtype = stwtype;
- *pstwclass = stwclass;
- *pmotion_type = motion_type;
- *pmotion_vector_count = motion_vector_count;
- *pmv_format = mv_format;
- *pdmv = dmv;
- *pmvscale = mvscale;
- *pdct_type = dct_type;
-}
-
-
-/* move/add 8x8-Block from block[comp] to backward_reference_frame */
-/* copy reconstructed 8x8 block from block[comp] to current_frame[]
- * ISO/IEC 13818-2 section 7.6.8: Adding prediction and coefficient data
- * This stage also embodies some of the operations implied by:
- * - ISO/IEC 13818-2 section 7.6.7: Combining predictions
- * - ISO/IEC 13818-2 section 6.1.3: Macroblock
-*/
-static void Add_Block(comp,bx,by,dct_type,addflag)
-int comp,bx,by,dct_type,addflag;
-{
- int cc,i, j, iincr;
- unsigned char *rfp;
- short *bp;
-
-
- /* derive color component index */
- /* equivalent to ISO/IEC 13818-2 Table 7-1 */
- cc = (comp<4) ? 0 : (comp&1)+1; /* color component index */
-
- if (cc==0)
- {
- /* luminance */
-
- if (picture_structure==FRAME_PICTURE)
- if (dct_type)
- {
- /* field DCT coding */
- rfp = current_frame[0]
- + Coded_Picture_Width*(by+((comp&2)>>1)) + bx + ((comp&1)<<3);
- iincr = (Coded_Picture_Width<<1) - 8;
- }
- else
- {
- /* frame DCT coding */
- rfp = current_frame[0]
- + Coded_Picture_Width*(by+((comp&2)<<2)) + bx + ((comp&1)<<3);
- iincr = Coded_Picture_Width - 8;
- }
- else
- {
- /* field picture */
- rfp = current_frame[0]
- + (Coded_Picture_Width<<1)*(by+((comp&2)<<2)) + bx + ((comp&1)<<3);
- iincr = (Coded_Picture_Width<<1) - 8;
- }
- }
- else
- {
- /* chrominance */
-
- /* scale coordinates */
- if (chroma_format!=CHROMA444)
- bx >>= 1;
- if (chroma_format==CHROMA420)
- by >>= 1;
- if (picture_structure==FRAME_PICTURE)
- {
- if (dct_type && (chroma_format!=CHROMA420))
- {
- /* field DCT coding */
- rfp = current_frame[cc]
- + Chroma_Width*(by+((comp&2)>>1)) + bx + (comp&8);
- iincr = (Chroma_Width<<1) - 8;
- }
- else
- {
- /* frame DCT coding */
- rfp = current_frame[cc]
- + Chroma_Width*(by+((comp&2)<<2)) + bx + (comp&8);
- iincr = Chroma_Width - 8;
- }
- }
- else
- {
- /* field picture */
- rfp = current_frame[cc]
- + (Chroma_Width<<1)*(by+((comp&2)<<2)) + bx + (comp&8);
- iincr = (Chroma_Width<<1) - 8;
- }
- }
-
- bp = ld->block[comp];
-
- if (addflag)
- {
- for (i=0; i<8; i++)
- {
- for (j=0; j<8; j++)
- {
- *rfp = Clip[*bp++ + *rfp];
- rfp++;
- }
-
- rfp+= iincr;
- }
- }
- else
- {
- for (i=0; i<8; i++)
- {
- for (j=0; j<8; j++)
- *rfp++ = Clip[*bp++ + 128];
-
- rfp+= iincr;
- }
- }
-}
-
-
-/* ISO/IEC 13818-2 section 7.8 */
-static void Decode_SNR_Macroblock(SNRMBA, SNRMBAinc, MBA, MBAmax, dct_type)
- int *SNRMBA, *SNRMBAinc;
- int MBA, MBAmax;
- int *dct_type;
-{
- int SNRmacroblock_type, SNRcoded_block_pattern, SNRdct_type, dummy;
- int slice_vert_pos_ext, quantizer_scale_code, comp, code;
-
- ld = &enhan;
-
- if (*SNRMBAinc==0)
- {
- if (!Show_Bits(23)) /* next_start_code */
- {
- next_start_code();
- code = Show_Bits(32);
-
- if (code<SLICE_START_CODE_MIN || code>SLICE_START_CODE_MAX)
- {
- /* only slice headers are allowed in picture_data */
- if (!Quiet_Flag)
- printf("SNR: Premature end of picture\n");
- return;
- }
-
- Flush_Buffer32();
-
- /* decode slice header (may change quantizer_scale) */
- slice_vert_pos_ext = slice_header();
-
- /* decode macroblock address increment */
- *SNRMBAinc = Get_macroblock_address_increment();
-
- /* set current location */
- *SNRMBA =
- ((slice_vert_pos_ext<<7) + (code&255) - 1)*mb_width + *SNRMBAinc - 1;
-
- *SNRMBAinc = 1; /* first macroblock in slice: not skipped */
- }
- else /* not next_start_code */
- {
- if (*SNRMBA>=MBAmax)
- {
- if (!Quiet_Flag)
- printf("Too many macroblocks in picture\n");
- return;
- }
-
- /* decode macroblock address increment */
- *SNRMBAinc = Get_macroblock_address_increment();
- }
- }
-
- if (*SNRMBA!=MBA)
- {
- /* streams out of sync */
- if (!Quiet_Flag)
- printf("Cant't synchronize streams\n");
- return;
- }
-
- if (*SNRMBAinc==1) /* not skipped */
- {
- macroblock_modes(&SNRmacroblock_type, &dummy, &dummy,
- &dummy, &dummy, &dummy, &dummy, &dummy,
- &SNRdct_type);
-
- if (SNRmacroblock_type & MACROBLOCK_PATTERN)
- *dct_type = SNRdct_type;
-
- if (SNRmacroblock_type & MACROBLOCK_QUANT)
- {
- quantizer_scale_code = Get_Bits(5);
- ld->quantizer_scale =
- ld->q_scale_type ? Non_Linear_quantizer_scale[quantizer_scale_code] : quantizer_scale_code<<1;
- }
-
- /* macroblock_pattern */
- if (SNRmacroblock_type & MACROBLOCK_PATTERN)
- {
- SNRcoded_block_pattern = Get_coded_block_pattern();
-
- if (chroma_format==CHROMA422)
- SNRcoded_block_pattern = (SNRcoded_block_pattern<<2) | Get_Bits(2); /* coded_block_pattern_1 */
- else if (chroma_format==CHROMA444)
- SNRcoded_block_pattern = (SNRcoded_block_pattern<<6) | Get_Bits(6); /* coded_block_pattern_2 */
- }
- else
- SNRcoded_block_pattern = 0;
-
- /* decode blocks */
- for (comp=0; comp<block_count; comp++)
- {
- Clear_Block(comp);
-
- if (SNRcoded_block_pattern & (1<<(block_count-1-comp)))
- Decode_MPEG2_Non_Intra_Block(comp);
- }
- }
- else /* SNRMBAinc!=1: skipped macroblock */
- {
- for (comp=0; comp<block_count; comp++)
- Clear_Block(comp);
- }
-
- ld = &base;
-}
-
-
-
-/* IMPLEMENTATION: set scratch pad macroblock to zero */
-static void Clear_Block(comp)
-int comp;
-{
- short *Block_Ptr;
- int i;
-
- Block_Ptr = ld->block[comp];
-
- for (i=0; i<64; i++)
- *Block_Ptr++ = 0;
-}
-
-
-/* SCALABILITY: add SNR enhancement layer block data to base layer */
-/* ISO/IEC 13818-2 section 7.8.3.4: Addition of coefficients from the two layes */
-static void Sum_Block(comp)
-int comp;
-{
- short *Block_Ptr1, *Block_Ptr2;
- int i;
-
- Block_Ptr1 = base.block[comp];
- Block_Ptr2 = enhan.block[comp];
-
- for (i=0; i<64; i++)
- *Block_Ptr1++ += *Block_Ptr2++;
-}
-
-
-/* limit coefficients to -2048..2047 */
-/* ISO/IEC 13818-2 section 7.4.3 and 7.4.4: Saturation and Mismatch control */
-static void Saturate(Block_Ptr)
-short *Block_Ptr;
-{
- int i, sum, val;
-
- sum = 0;
-
- /* ISO/IEC 13818-2 section 7.4.3: Saturation */
- for (i=0; i<64; i++)
- {
- val = Block_Ptr[i];
-
- if (val>2047)
- val = 2047;
- else if (val<-2048)
- val = -2048;
-
- Block_Ptr[i] = val;
- sum+= val;
- }
-
- /* ISO/IEC 13818-2 section 7.4.4: Mismatch control */
- if ((sum&1)==0)
- Block_Ptr[63]^= 1;
-
-}
-
-
-/* reuse old picture buffers as soon as they are no longer needed
- based on life-time axioms of MPEG */
-static void Update_Picture_Buffers()
-{
- int cc; /* color component index */
- unsigned char *tmp; /* temporary swap pointer */
-
- for (cc=0; cc<3; cc++)
- {
- /* B pictures do not need to be save for future reference */
- if (picture_coding_type==B_TYPE)
- {
- current_frame[cc] = auxframe[cc];
- }
- else
- {
- /* only update at the beginning of the coded frame */
- if (!Second_Field)
- {
- tmp = forward_reference_frame[cc];
-
- /* the previously decoded reference frame is stored
- coincident with the location where the backward
- reference frame is stored (backwards prediction is not
- needed in P pictures) */
- forward_reference_frame[cc] = backward_reference_frame[cc];
-
- /* update pointer for potential future B pictures */
- backward_reference_frame[cc] = tmp;
- }
-
- /* can erase over old backward reference frame since it is not used
- in a P picture, and since any subsequent B pictures will use the
- previously decoded I or P frame as the backward_reference_frame */
- current_frame[cc] = backward_reference_frame[cc];
- }
-
- /* IMPLEMENTATION:
- one-time folding of a line offset into the pointer which stores the
- memory address of the current frame saves offsets and conditional
- branches throughout the remainder of the picture processing loop */
- if (picture_structure==BOTTOM_FIELD)
- current_frame[cc]+= (cc==0) ? Coded_Picture_Width : Chroma_Width;
- }
-}
-
-
-/* store last frame */
-
-void Output_Last_Frame_of_Sequence(Framenum)
-int Framenum;
-{
- if (Second_Field)
- printf("last frame incomplete, not stored\n");
- else
- Write_Frame(backward_reference_frame,Framenum-1);
-}
-
-
-
-static void frame_reorder(Bitstream_Framenum, Sequence_Framenum)
-int Bitstream_Framenum, Sequence_Framenum;
-{
- /* tracking variables to insure proper output in spatial scalability */
- static int Oldref_progressive_frame, Newref_progressive_frame;
-
- if (Sequence_Framenum!=0)
- {
- if (picture_structure==FRAME_PICTURE || Second_Field)
- {
- if (picture_coding_type==B_TYPE)
- Write_Frame(auxframe,Bitstream_Framenum-1);
- else
- {
- Newref_progressive_frame = progressive_frame;
- progressive_frame = Oldref_progressive_frame;
-
- Write_Frame(forward_reference_frame,Bitstream_Framenum-1);
-
- Oldref_progressive_frame = progressive_frame = Newref_progressive_frame;
- }
- }
-#ifdef DISPLAY
- else if (Output_Type==T_X11)
- {
- if(!Display_Progressive_Flag)
- Display_Second_Field();
- }
-#endif
- }
- else
- Oldref_progressive_frame = progressive_frame;
-
-}
-
-
-/* ISO/IEC 13818-2 section 7.6 */
-static void motion_compensation(MBA, macroblock_type, motion_type, PMV,
- motion_vertical_field_select, dmvector, stwtype, dct_type)
-int MBA;
-int macroblock_type;
-int motion_type;
-int PMV[2][2][2];
-int motion_vertical_field_select[2][2];
-int dmvector[2];
-int stwtype;
-int dct_type;
-{
- int bx, by;
- int comp;
-
- /* derive current macroblock position within picture */
- /* ISO/IEC 13818-2 section 6.3.1.6 and 6.3.1.7 */
- bx = 16*(MBA%mb_width);
- by = 16*(MBA/mb_width);
-
- /* motion compensation */
- if (!(macroblock_type & MACROBLOCK_INTRA))
- form_predictions(bx,by,macroblock_type,motion_type,PMV,
- motion_vertical_field_select,dmvector,stwtype);
-
- /* SCALABILITY: Data Partitioning */
- if (base.scalable_mode==SC_DP)
- ld = &base;
-
- /* copy or add block data into picture */
- for (comp=0; comp<block_count; comp++)
- {
- /* SCALABILITY: SNR */
- /* ISO/IEC 13818-2 section 7.8.3.4: Addition of coefficients from
- the two a layers */
- if (Two_Streams && enhan.scalable_mode==SC_SNR)
- Sum_Block(comp); /* add SNR enhancement layer data to base layer */
-
- /* MPEG-2 saturation and mismatch control */
- /* base layer could be MPEG-1 stream, enhancement MPEG-2 SNR */
- /* ISO/IEC 13818-2 section 7.4.3 and 7.4.4: Saturation and Mismatch control */
- if ((Two_Streams && enhan.scalable_mode==SC_SNR) || ld->MPEG2_Flag)
- Saturate(ld->block[comp]);
-
- /* ISO/IEC 13818-2 section Annex A: inverse DCT */
- if (Reference_IDCT_Flag)
- Reference_IDCT(ld->block[comp]);
- else
- Fast_IDCT(ld->block[comp]);
-
- /* ISO/IEC 13818-2 section 7.6.8: Adding prediction and coefficient data */
- Add_Block(comp,bx,by,dct_type,(macroblock_type & MACROBLOCK_INTRA)==0);
- }
-
-}
-
-
-
-/* ISO/IEC 13818-2 section 7.6.6 */
-static void skipped_macroblock(dc_dct_pred, PMV, motion_type,
- motion_vertical_field_select, stwtype, macroblock_type)
-int dc_dct_pred[3];
-int PMV[2][2][2];
-int *motion_type;
-int motion_vertical_field_select[2][2];
-int *stwtype;
-int *macroblock_type;
-{
- int comp;
-
- /* SCALABILITY: Data Paritioning */
- if (base.scalable_mode==SC_DP)
- ld = &base;
-
- for (comp=0; comp<block_count; comp++)
- Clear_Block(comp);
-
- /* reset intra_dc predictors */
- /* ISO/IEC 13818-2 section 7.2.1: DC coefficients in intra blocks */
- dc_dct_pred[0]=dc_dct_pred[1]=dc_dct_pred[2]=0;
-
- /* reset motion vector predictors */
- /* ISO/IEC 13818-2 section 7.6.3.4: Resetting motion vector predictors */
- if (picture_coding_type==P_TYPE)
- PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0;
-
- /* derive motion_type */
- if (picture_structure==FRAME_PICTURE)
- *motion_type = MC_FRAME;
- else
- {
- *motion_type = MC_FIELD;
-
- /* predict from field of same parity */
- /* ISO/IEC 13818-2 section 7.6.6.1 and 7.6.6.3: P field picture and B field
- picture */
- motion_vertical_field_select[0][0]=motion_vertical_field_select[0][1] =
- (picture_structure==BOTTOM_FIELD);
- }
-
- /* skipped I are spatial-only predicted, */
- /* skipped P and B are temporal-only predicted */
- /* ISO/IEC 13818-2 section 7.7.6: Skipped macroblocks */
- *stwtype = (picture_coding_type==I_TYPE) ? 8 : 0;
-
- /* IMPLEMENTATION: clear MACROBLOCK_INTRA */
- *macroblock_type&= ~MACROBLOCK_INTRA;
-
-}
-
-
-/* return==-1 means go to next picture */
-/* the expression "start of slice" is used throughout the normative
- body of the MPEG specification */
-static int start_of_slice(MBAmax, MBA, MBAinc,
- dc_dct_pred, PMV)
-int MBAmax;
-int *MBA;
-int *MBAinc;
-int dc_dct_pred[3];
-int PMV[2][2][2];
-{
- unsigned int code;
- int slice_vert_pos_ext;
-
- ld = &base;
-
- Fault_Flag = 0;
-
- next_start_code();
- code = Show_Bits(32);
-
- if (code<SLICE_START_CODE_MIN || code>SLICE_START_CODE_MAX)
- {
- /* only slice headers are allowed in picture_data */
- if (!Quiet_Flag)
- printf("start_of_slice(): Premature end of picture\n");
-
- return(-1); /* trigger: go to next picture */
- }
-
- Flush_Buffer32();
-
- /* decode slice header (may change quantizer_scale) */
- slice_vert_pos_ext = slice_header();
-
-
- /* SCALABILITY: Data Partitioning */
- if (base.scalable_mode==SC_DP)
- {
- ld = &enhan;
- next_start_code();
- code = Show_Bits(32);
-
- if (code<SLICE_START_CODE_MIN || code>SLICE_START_CODE_MAX)
- {
- /* only slice headers are allowed in picture_data */
- if (!Quiet_Flag)
- printf("DP: Premature end of picture\n");
- return(-1); /* trigger: go to next picture */
- }
-
- Flush_Buffer32();
-
- /* decode slice header (may change quantizer_scale) */
- slice_vert_pos_ext = slice_header();
-
- if (base.priority_breakpoint!=1)
- ld = &base;
- }
-
- /* decode macroblock address increment */
- *MBAinc = Get_macroblock_address_increment();
-
- if (Fault_Flag)
- {
- printf("start_of_slice(): MBAinc unsuccessful\n");
- return(0); /* trigger: go to next slice */
- }
-
- /* set current location */
- /* NOTE: the arithmetic used to derive macroblock_address below is
- * equivalent to ISO/IEC 13818-2 section 6.3.17: Macroblock
- */
- *MBA = ((slice_vert_pos_ext<<7) + (code&255) - 1)*mb_width + *MBAinc - 1;
- *MBAinc = 1; /* first macroblock in slice: not skipped */
-
- /* reset all DC coefficient and motion vector predictors */
- /* reset all DC coefficient and motion vector predictors */
- /* ISO/IEC 13818-2 section 7.2.1: DC coefficients in intra blocks */
- dc_dct_pred[0]=dc_dct_pred[1]=dc_dct_pred[2]=0;
-
- /* ISO/IEC 13818-2 section 7.6.3.4: Resetting motion vector predictors */
- PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0;
- PMV[0][1][0]=PMV[0][1][1]=PMV[1][1][0]=PMV[1][1][1]=0;
-
- /* successfull: trigger decode macroblocks in slice */
- return(1);
-}
-
-
-/* ISO/IEC 13818-2 sections 7.2 through 7.5 */
-static int decode_macroblock(macroblock_type, stwtype, stwclass,
- motion_type, dct_type, PMV, dc_dct_pred,
- motion_vertical_field_select, dmvector)
-int *macroblock_type;
-int *stwtype;
-int *stwclass;
-int *motion_type;
-int *dct_type;
-int PMV[2][2][2];
-int dc_dct_pred[3];
-int motion_vertical_field_select[2][2];
-int dmvector[2];
-{
- /* locals */
- int quantizer_scale_code;
- int comp;
-
- int motion_vector_count;
- int mv_format;
- int dmv;
- int mvscale;
- int coded_block_pattern;
-
- /* SCALABILITY: Data Patitioning */
- if (base.scalable_mode==SC_DP)
- {
- if (base.priority_breakpoint<=2)
- ld = &enhan;
- else
- ld = &base;
- }
-
- /* ISO/IEC 13818-2 section 6.3.17.1: Macroblock modes */
- macroblock_modes(macroblock_type, stwtype, stwclass,
- motion_type, &motion_vector_count, &mv_format, &dmv, &mvscale,
- dct_type);
-
- if (Fault_Flag) return(0); /* trigger: go to next slice */
-
- if (*macroblock_type & MACROBLOCK_QUANT)
- {
- quantizer_scale_code = Get_Bits(5);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- printf("quantiser_scale_code (");
- Print_Bits(quantizer_scale_code,5,5);
- printf("): %d\n",quantizer_scale_code);
- }
-#endif /* TRACE */
-
- /* ISO/IEC 13818-2 section 7.4.2.2: Quantizer scale factor */
- if (ld->MPEG2_Flag)
- ld->quantizer_scale =
- ld->q_scale_type ? Non_Linear_quantizer_scale[quantizer_scale_code]
- : (quantizer_scale_code << 1);
- else
- ld->quantizer_scale = quantizer_scale_code;
-
- /* SCALABILITY: Data Partitioning */
- if (base.scalable_mode==SC_DP)
- /* make sure base.quantizer_scale is valid */
- base.quantizer_scale = ld->quantizer_scale;
- }
-
- /* motion vectors */
-
-
- /* ISO/IEC 13818-2 section 6.3.17.2: Motion vectors */
-
- /* decode forward motion vectors */
- if ((*macroblock_type & MACROBLOCK_MOTION_FORWARD)
- || ((*macroblock_type & MACROBLOCK_INTRA)
- && concealment_motion_vectors))
- {
- if (ld->MPEG2_Flag)
- motion_vectors(PMV,dmvector,motion_vertical_field_select,
- 0,motion_vector_count,mv_format,f_code[0][0]-1,f_code[0][1]-1,
- dmv,mvscale);
- else
- motion_vector(PMV[0][0],dmvector,
- forward_f_code-1,forward_f_code-1,0,0,full_pel_forward_vector);
- }
-
- if (Fault_Flag) return(0); /* trigger: go to next slice */
-
- /* decode backward motion vectors */
- if (*macroblock_type & MACROBLOCK_MOTION_BACKWARD)
- {
- if (ld->MPEG2_Flag)
- motion_vectors(PMV,dmvector,motion_vertical_field_select,
- 1,motion_vector_count,mv_format,f_code[1][0]-1,f_code[1][1]-1,0,
- mvscale);
- else
- motion_vector(PMV[0][1],dmvector,
- backward_f_code-1,backward_f_code-1,0,0,full_pel_backward_vector);
- }
-
- if (Fault_Flag) return(0); /* trigger: go to next slice */
-
- if ((*macroblock_type & MACROBLOCK_INTRA) && concealment_motion_vectors)
- Flush_Buffer(1); /* remove marker_bit */
-
- if (base.scalable_mode==SC_DP && base.priority_breakpoint==3)
- ld = &enhan;
-
- /* macroblock_pattern */
- /* ISO/IEC 13818-2 section 6.3.17.4: Coded block pattern */
- if (*macroblock_type & MACROBLOCK_PATTERN)
- {
- coded_block_pattern = Get_coded_block_pattern();
-
- if (chroma_format==CHROMA422)
- {
- /* coded_block_pattern_1 */
- coded_block_pattern = (coded_block_pattern<<2) | Get_Bits(2);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- printf("coded_block_pattern_1: ");
- Print_Bits(coded_block_pattern,2,2);
- printf(" (%d)\n",coded_block_pattern&3);
- }
-#endif /* TRACE */
- }
- else if (chroma_format==CHROMA444)
- {
- /* coded_block_pattern_2 */
- coded_block_pattern = (coded_block_pattern<<6) | Get_Bits(6);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- printf("coded_block_pattern_2: ");
- Print_Bits(coded_block_pattern,6,6);
- printf(" (%d)\n",coded_block_pattern&63);
- }
-#endif /* TRACE */
- }
- }
- else
- coded_block_pattern = (*macroblock_type & MACROBLOCK_INTRA) ?
- (1<<block_count)-1 : 0;
-
- if (Fault_Flag) return(0); /* trigger: go to next slice */
-
- /* decode blocks */
- for (comp=0; comp<block_count; comp++)
- {
- /* SCALABILITY: Data Partitioning */
- if (base.scalable_mode==SC_DP)
- ld = &base;
-
- Clear_Block(comp);
-
- if (coded_block_pattern & (1<<(block_count-1-comp)))
- {
- if (*macroblock_type & MACROBLOCK_INTRA)
- {
- if (ld->MPEG2_Flag)
- Decode_MPEG2_Intra_Block(comp,dc_dct_pred);
- else
- Decode_MPEG1_Intra_Block(comp,dc_dct_pred);
- }
- else
- {
- if (ld->MPEG2_Flag)
- Decode_MPEG2_Non_Intra_Block(comp);
- else
- Decode_MPEG1_Non_Intra_Block(comp);
- }
-
- if (Fault_Flag) return(0); /* trigger: go to next slice */
- }
- }
-
- if(picture_coding_type==D_TYPE)
- {
- /* remove end_of_macroblock (always 1, prevents startcode emulation) */
- /* ISO/IEC 11172-2 section 2.4.2.7 and 2.4.3.6 */
- marker_bit("D picture end_of_macroblock bit");
- }
-
- /* reset intra_dc predictors */
- /* ISO/IEC 13818-2 section 7.2.1: DC coefficients in intra blocks */
- if (!(*macroblock_type & MACROBLOCK_INTRA))
- dc_dct_pred[0]=dc_dct_pred[1]=dc_dct_pred[2]=0;
-
- /* reset motion vector predictors */
- if ((*macroblock_type & MACROBLOCK_INTRA) && !concealment_motion_vectors)
- {
- /* intra mb without concealment motion vectors */
- /* ISO/IEC 13818-2 section 7.6.3.4: Resetting motion vector predictors */
- PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0;
- PMV[0][1][0]=PMV[0][1][1]=PMV[1][1][0]=PMV[1][1][1]=0;
- }
-
- /* special "No_MC" macroblock_type case */
- /* ISO/IEC 13818-2 section 7.6.3.5: Prediction in P pictures */
- if ((picture_coding_type==P_TYPE)
- && !(*macroblock_type & (MACROBLOCK_MOTION_FORWARD|MACROBLOCK_INTRA)))
- {
- /* non-intra mb without forward mv in a P picture */
- /* ISO/IEC 13818-2 section 7.6.3.4: Resetting motion vector predictors */
- PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0;
-
- /* derive motion_type */
- /* ISO/IEC 13818-2 section 6.3.17.1: Macroblock modes, frame_motion_type */
- if (picture_structure==FRAME_PICTURE)
- *motion_type = MC_FRAME;
- else
- {
- *motion_type = MC_FIELD;
- /* predict from field of same parity */
- motion_vertical_field_select[0][0] = (picture_structure==BOTTOM_FIELD);
- }
- }
-
- if (*stwclass==4)
- {
- /* purely spatially predicted macroblock */
- /* ISO/IEC 13818-2 section 7.7.5.1: Resetting motion vector predictions */
- PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0;
- PMV[0][1][0]=PMV[0][1][1]=PMV[1][1][0]=PMV[1][1][1]=0;
- }
-
- /* successfully decoded macroblock */
- return(1);
-
-} /* decode_macroblock */
-
-
Index: demos/branches/pj/mpeg2/m.bat
===================================================================
--- demos/branches/pj/mpeg2/m.bat (revision 1085)
+++ demos/branches/pj/mpeg2/m.bat (nonexistent)
@@ -1 +0,0 @@
-x mpeg2dec -b /shark/mpeg2/m.m2v
Index: demos/branches/pj/mpeg2/changes
===================================================================
--- demos/branches/pj/mpeg2/changes (revision 1085)
+++ demos/branches/pj/mpeg2/changes (nonexistent)
@@ -1,95 +0,0 @@
-CHANGES
-----------
-
-January 9, 1996 to July 17, 1996
-- cleaned up some code which gave warnings.
-- altered some code to be compatible with Sun CC compiler.
- However, support in the makefile for non-ansi C compilers
- has been dropped (this is a stupid thing to support).
-
-December 20, 1995 to January 9, 1996:
-
-verified on HHI #22, TCEH #23 bitstreams.
-
- 1. new arguments format. Got to be so many argument fields that
- a new more consistent format was devised.
-
- 2. Frame_Store_Flag (-f) option now controls lower layer prediciton
- picture format (field or framewise)
-
- 3. getpic() structural changes
-
-
-Since December 18, 1995:
-
-1. added special case for current B pictures subsframe.c which
- loads entire reference frame for buffer substitution.
-
-2. fixed -l omission (-lXext) in Makefile that drives Tristan nuts everytime.
-
-
-Since December 14, 1995:
-
- 1. organized frame buffer substitution routines into subspic.c
- 2. added "big file" -b mode for Tristan ;-)
-
-
-Since July 4, 1994:
-
-1. Concatenated elementary sequences within same bitstream
-
- Decode can now handle concatenated elementary video sequences of
- arbitrary parameters.
-
-2. TRACE and VERBOSE #ifdef flags
-
-3. More disciplined naming convention
-
- normative variables and bitstream elements defined in 13818 are
- verbatim, lower case. Implementation specific routines and variables
- are capitolized.
-
-4. Spatial scalability corrections
- - see Carsten's document (spatscal.doc)
-
-5. D-pictures (picture_coding_type==D_TYPE)
-
- Only two small changes were necessary to accomodate D-pictures:
-
- a. in Decode_MPEG1_Intra_Block() added line which termines
- subroutine after DC coefficient has been processed.
-
- b. in picture_data(), added line which parses marker bit.
-
-
- 6. forced decoder to display frame progressively (regardless of whether
- the picture is frame structured or field structured) when -f flag
- is invoked in the command line arguements.
-
- also: progressive_frame now decides whether a frame is to be displayed
- as a frame picture to two field pictures, rather than the older convention
- of testing progressive_sequence.
-
- 7. Adapted systems parser from Stefan's mpeg2play to mpeg2decode.
- The major changes are:
-
- mpeg2dec.c:
- - fseek() called twice
-
- gethdr.c, getpic.c:
- instances of Flush_Bits(par,32) changed to Flush_Bits32(par)
-
- gethdr.c
- Get_Bits(par,32) changed to Get_32_Bits(par)
-
- global.h
- added rdmax, sysstream, and bfr[] to parameters struct.
-
- 8. Restructuring of getpic.c:
-
- a. moved picture pointer rotation into Update_Picture_Buffers()
- b. moved picture output logic into Output_Current_Frame() to
- in anticipation of 3:2 pulldown
-
-
-
Index: demos/branches/pj/mpeg2/const.h
===================================================================
--- demos/branches/pj/mpeg2/const.h (revision 1085)
+++ demos/branches/pj/mpeg2/const.h (nonexistent)
@@ -1,141 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * Massimiliano Giorgi <massy@gandalf.sssup.it>
- * Luca Abeni <luca@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-
-/**
- ------------
- CVS : $Id: const.h,v 1.1.1.1 2002-09-02 09:37:45 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:45 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Marco Dallera and Marco Fiocca
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * AUTO
- *
- * Another Unuseful Track simulatOr
- *
- * Authors: Marco Dallera
- * Marco Fiocca
- *
- */
-
-/* ------------------ */
-/* Useful constants */
-/* ------------------ */
-
-#ifndef __CONST_H_
-
-#define __CONST_H_
-
-/* Screen dimensions */
-#define SCREEN_WIDTH 800
-#define SCREEN_HEIGHT 600
-#define SCREEN_BIT_COLORS 8
-
-/* Visible area */
-#define TEL_WIDTH 50
-#define TEL_HEIGHT 50
-
-/* Car dimensions */
-#define CAR_WIDTH 12
-#define CAR_HEIGHT 12
-#define CAR_W 8
-#define CAR_H 10
-
-/* Track dimensions */
-#define TRACK_WIDTH 500
-#define TRACK_HEIGHT 500
-
-/* Track position */
-#define TRACK_X1 0
-#define TRACK_Y1 0
-#define TRACK_X2 TRACK_X1+TRACK_WIDTH-1
-#define TRACK_Y2 TRACK_Y1+TRACK_HEIGHT-1
-
-/* Max number of car on track */
-#define MAX_CAR_NUMBER 10
-#define DRIVERS_NUMBER 20
-#define MAX_DRIVER_NAME_LENGTH 20
-#define MAX_TRACK_NAME_LENGTH 20
-#define TRACK_NUMBER 4
-
-/* Lap direction */
-#define CLOCK 0
-#define ANTICLOCK 1
-
-/* Information display coords */
-#define CMD_WIDTH TRACK_WIDTH
-#define CMD_HEIGHT (SCREEN_HEIGHT-TRACK_HEIGHT-3)
-
-/* Car position limits */
-#define MIN_CAR_X (TRACK_X1 + CAR_WIDTH/2 + 4)
-#define MIN_CAR_Y (TRACK_Y1 + CAR_HEIGHT/2 + 4)
-#define MAX_CAR_X (TRACK_X2 - CAR_WIDTH/2 - 4)
-#define MAX_CAR_Y (TRACK_Y2 - CAR_HEIGHT/2 - 4)
-
-/* Road constants */
-#define LEFT_ONLY 10
-#define RIGHT_ONLY 11
-#define ROAD_OK 12
-#define NO_ROAD 13
-
-/* Collision constants */
-#define COLLISION_LEFT 20
-#define COLLISION_RIGHT 21
-#define COLLISION_BACK 22
-#define NO_COLL 0
-
-/* CAB constants */
-#define ROAD_MSG_DIM sizeof(road_info)
-#define ROAD_MSG_READER 4
-
-#define CAR_MSG_DIM sizeof(car_status)
-#define CAR_MSG_READER 5
-
-/* Tasks parameters */
-#define SENSOR_WCET 3000
-#define SENSOR_PERIOD 40000
-#define CONTROL_WCET 1000
-#define CONTROL_PERIOD 40000
-
-#endif
-
Index: demos/branches/pj/mpeg2/store.c
===================================================================
--- demos/branches/pj/mpeg2/store.c (revision 1085)
+++ demos/branches/pj/mpeg2/store.c (nonexistent)
@@ -1,529 +0,0 @@
-/* store.c, picture output routines */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <fcntl.h>
-
-#include "config.h"
-#include "global.h"
-#include "semaphore.h"
-#include "kernel/kern.h"
-
-//#debug DEBUG_MAILBOX
-
-static void conv422to444 _ANSI_ARGS_((unsigned char *src, unsigned char *dst));
-static void conv420to422 _ANSI_ARGS_((unsigned char *src, unsigned char *dst));
-
-__inline__ WORD down32to16(unsigned char r, unsigned char g, unsigned char b)
-{
- return ((b&0xf8)>>3)|((g&0xfc)<<3)|((r&0xf8)<<8);
-}
-
-#if 0
-void xWrite_Frame _ANSI_ARGS_((unsigned char *src[], int frame))
-{
- int i, j;
- int y, u, v, r, g, b;
-// int rm=0,gm=0,bm=0;
- int crv, cbu, cgu, cgv;
- unsigned char *py, *pu, *pv;
- int height, width;
-
- struct framebuf_struct *f;
-
- cprintf("%d ",frame);
-
- width = Coded_Picture_Width ;
- height= Coded_Picture_Height;
-
- f = get_free_framebuf();
-
- dither(src);
- f->f[i*width+j] = down32to16(r,g,b);
-
- f->n = frame;
- insert_frame(f);
-}
-#endif
-
-void Write_Frame _ANSI_ARGS_((unsigned char *src[], int frame))
-{
- int i, j;
- int y, u, v, r, g, b;
-// int rm=0,gm=0,bm=0;
- int crv, cbu, cgu, cgv;
- unsigned char *py, *pu, *pv;
- int height, width, incr;
- static unsigned char *u422, *v422, *u444, *v444;
-
- struct framebuf_struct *f;
-
- cprintf("%d ",frame);
-
- incr = width = Coded_Picture_Width ;
- height= Coded_Picture_Height;
-
- if (chroma_format==CHROMA444)
- {
- u444 = src[1];
- v444 = src[2];
- }
- else
- {
- if (!u444)
- {
- if (chroma_format==CHROMA420)
- {
- if (!(u422 = (unsigned char *)malloc((Coded_Picture_Width>>1)
- *Coded_Picture_Height)))
- Error("malloc failed");
- if (!(v422 = (unsigned char *)malloc((Coded_Picture_Width>>1)
- *Coded_Picture_Height)))
- Error("malloc failed");
- }
-
- if (!(u444 = (unsigned char *)malloc(Coded_Picture_Width
- *Coded_Picture_Height)))
- Error("malloc failed");
-
- if (!(v444 = (unsigned char *)malloc(Coded_Picture_Width
- *Coded_Picture_Height)))
- Error("malloc failed");
- }
-
- if (chroma_format==CHROMA420)
- {
- conv420to422(src[1],u422);
- conv420to422(src[2],v422);
- conv422to444(u422,u444);
- conv422to444(v422,v444);
- }
- else
- {
- conv422to444(src[1],u444);
- conv422to444(src[2],v444);
- }
- }
-
-
- f = get_free_framebuf();
-
- /* matrix coefficients */
- crv = Inverse_Table_6_9[matrix_coefficients][0];
- cbu = Inverse_Table_6_9[matrix_coefficients][1];
- cgu = Inverse_Table_6_9[matrix_coefficients][2];
- cgv = Inverse_Table_6_9[matrix_coefficients][3];
-
- for (i=0; i<height; i++)
- {
- py = src[0] + incr*i;
- pu = u444 + incr*i;
- pv = v444 + incr*i;
-
- for (j=0; j<width; j++)
- {
- u = *pu++ - 128;
- v = *pv++ - 128;
- y = 76309 * (*py++ - 16); /* (255/219)*65536 */
-
- r = Clip[(y + crv*v + 32768)>>16];
- g = Clip[(y - cgu*u - cgv*v + 32768)>>16];
- b = Clip[(y + cbu*u + 32786)>>16];
-
-// rm = max(rm,r);gm=max(gm,g);bm=max(bm,b);
-// cprintf("(r%dg%db%d)",rm,gm,bm);
- f->f[i*width+j] = down32to16(r,g,b);
-// r=g=b=rand()%255;
-// f->f[i*width+j] = down32to16(r,g,b);
- }
- }
-
- f->n = frame;
- insert_frame(f);
-}
-
-/*
-void Display_Image(Dithered_Image)
-unsigned char *Dithered_Image;
-{
- / * display dithered image */
-//}
-
-
-/* horizontal 1:2 interpolation filter */
-static void conv422to444(src,dst)
-unsigned char *src,*dst;
-{
- int i, i2, w, j, im3, im2, im1, ip1, ip2, ip3;
-
- w = Coded_Picture_Width>>1;
-
- if (base.MPEG2_Flag)
- {
- for (j=0; j<Coded_Picture_Height; j++)
- {
- for (i=0; i<w; i++)
- {
- i2 = i<<1;
- im2 = (i<2) ? 0 : i-2;
- im1 = (i<1) ? 0 : i-1;
- ip1 = (i<w-1) ? i+1 : w-1;
- ip2 = (i<w-2) ? i+2 : w-1;
- ip3 = (i<w-3) ? i+3 : w-1;
-
- /* FIR filter coefficients (*256): 21 0 -52 0 159 256 159 0 -52 0 21 */
- /* even samples (0 0 256 0 0) */
- dst[i2] = src[i];
-
- /* odd samples (21 -52 159 159 -52 21) */
- dst[i2+1] = Clip[(int)(21*(src[im2]+src[ip3])
- -52*(src[im1]+src[ip2])
- +159*(src[i]+src[ip1])+128)>>8];
- }
- src+= w;
- dst+= Coded_Picture_Width;
- }
- }
- else
- {
- for (j=0; j<Coded_Picture_Height; j++)
- {
- for (i=0; i<w; i++)
- {
-
- i2 = i<<1;
- im3 = (i<3) ? 0 : i-3;
- im2 = (i<2) ? 0 : i-2;
- im1 = (i<1) ? 0 : i-1;
- ip1 = (i<w-1) ? i+1 : w-1;
- ip2 = (i<w-2) ? i+2 : w-1;
- ip3 = (i<w-3) ? i+3 : w-1;
-
- /* FIR filter coefficients (*256): 5 -21 70 228 -37 11 */
- dst[i2] = Clip[(int)( 5*src[im3]
- -21*src[im2]
- +70*src[im1]
- +228*src[i]
- -37*src[ip1]
- +11*src[ip2]+128)>>8];
-
- dst[i2+1] = Clip[(int)( 5*src[ip3]
- -21*src[ip2]
- +70*src[ip1]
- +228*src[i]
- -37*src[im1]
- +11*src[im2]+128)>>8];
- }
- src+= w;
- dst+= Coded_Picture_Width;
- }
- }
-}
-
-/* vertical 1:2 interpolation filter */
-static void conv420to422(src,dst)
-unsigned char *src,*dst;
-{
- int w, h, i, j, j2;
- int jm6, jm5, jm4, jm3, jm2, jm1, jp1, jp2, jp3, jp4, jp5, jp6, jp7;
-
- w = Coded_Picture_Width>>1;
- h = Coded_Picture_Height>>1;
-
- if (progressive_frame)
- {
- /* intra frame */
- for (i=0; i<w; i++)
- {
- for (j=0; j<h; j++)
- {
- j2 = j<<1;
- jm3 = (j<3) ? 0 : j-3;
- jm2 = (j<2) ? 0 : j-2;
- jm1 = (j<1) ? 0 : j-1;
- jp1 = (j<h-1) ? j+1 : h-1;
- jp2 = (j<h-2) ? j+2 : h-1;
- jp3 = (j<h-3) ? j+3 : h-1;
-
- /* FIR filter coefficients (*256): 5 -21 70 228 -37 11 */
- /* New FIR filter coefficients (*256): 3 -16 67 227 -32 7 */
- dst[w*j2] = Clip[(int)( 3*src[w*jm3]
- -16*src[w*jm2]
- +67*src[w*jm1]
- +227*src[w*j]
- -32*src[w*jp1]
- +7*src[w*jp2]+128)>>8];
-
- dst[w*(j2+1)] = Clip[(int)( 3*src[w*jp3]
- -16*src[w*jp2]
- +67*src[w*jp1]
- +227*src[w*j]
- -32*src[w*jm1]
- +7*src[w*jm2]+128)>>8];
- }
- src++;
- dst++;
- }
- }
- else
- {
- /* intra field */
- for (i=0; i<w; i++)
- {
- for (j=0; j<h; j+=2)
- {
- j2 = j<<1;
-
- /* top field */
- jm6 = (j<6) ? 0 : j-6;
- jm4 = (j<4) ? 0 : j-4;
- jm2 = (j<2) ? 0 : j-2;
- jp2 = (j<h-2) ? j+2 : h-2;
- jp4 = (j<h-4) ? j+4 : h-2;
- jp6 = (j<h-6) ? j+6 : h-2;
-
- /* Polyphase FIR filter coefficients (*256): 2 -10 35 242 -18 5 */
- /* New polyphase FIR filter coefficients (*256): 1 -7 30 248 -21 5 */
- dst[w*j2] = Clip[(int)( 1*src[w*jm6]
- -7*src[w*jm4]
- +30*src[w*jm2]
- +248*src[w*j]
- -21*src[w*jp2]
- +5*src[w*jp4]+128)>>8];
-
- /* Polyphase FIR filter coefficients (*256): 11 -38 192 113 -30 8 */
- /* New polyphase FIR filter coefficients (*256):7 -35 194 110 -24 4 */
- dst[w*(j2+2)] = Clip[(int)( 7*src[w*jm4]
- -35*src[w*jm2]
- +194*src[w*j]
- +110*src[w*jp2]
- -24*src[w*jp4]
- +4*src[w*jp6]+128)>>8];
-
- /* bottom field */
- jm5 = (j<5) ? 1 : j-5;
- jm3 = (j<3) ? 1 : j-3;
- jm1 = (j<1) ? 1 : j-1;
- jp1 = (j<h-1) ? j+1 : h-1;
- jp3 = (j<h-3) ? j+3 : h-1;
- jp5 = (j<h-5) ? j+5 : h-1;
- jp7 = (j<h-7) ? j+7 : h-1;
-
- /* Polyphase FIR filter coefficients (*256): 11 -38 192 113 -30 8 */
- /* New polyphase FIR filter coefficients (*256):7 -35 194 110 -24 4 */
- dst[w*(j2+1)] = Clip[(int)( 7*src[w*jp5]
- -35*src[w*jp3]
- +194*src[w*jp1]
- +110*src[w*jm1]
- -24*src[w*jm3]
- +4*src[w*jm5]+128)>>8];
-
- dst[w*(j2+3)] = Clip[(int)( 1*src[w*jp7]
- -7*src[w*jp5]
- +30*src[w*jp3]
- +248*src[w*jp1]
- -21*src[w*jm1]
- +5*src[w*jm3]+128)>>8];
- }
- src++;
- dst++;
- }
- }
-}
-
-
-
-
-
-// Frame buffer for displaying pictures
-
-struct framebuf_struct *get_free_framebuf();
-void insert_frame(struct framebuf_struct *f);
-struct framebuf_struct *remove_frame();
-
-int framebuf_sz;
-
-// a queue of framebufs
-struct framebuf_struct *framebuf_first;
-struct framebuf_struct *framebuf_last;
-
-// free framebuf list
-struct framebuf_struct *framebuf_free;
-
-// some semaphores
-sem_t framebuf_sem;
-sem_t framebuf_count;
-sem_t framebuf_freecount;
-
-void allocate_framebuf()
-{
- struct framebuf_struct *f;
-
- f = (struct framebuf_struct *)malloc(sizeof(struct framebuf_struct));
- if (!f) {
- cputs("Not enough memory!!!\n");
- sys_end();
- }
-
- f->f = (WORD *)malloc(framebuf_sz);
- if (!f->f) {
- cputs("Not enough memory for buffer!!!\n");
- sys_end();
- }
-
- f->next = framebuf_free;
- framebuf_free = f;
- cprintf("(Alloc %d %d)\n",f,f->f);
-}
-
-void Initialize_framebuf(int sz)
-{
- int i;
-
- framebuf_first = NULL;
- framebuf_last = NULL;
- framebuf_free = NULL;
- framebuf_sz = sz;
-
- cprintf("Coded W=%d H=%d sz=%d\n",Coded_Picture_Width,Coded_Picture_Height,sz);
-
- for (i=0; i<MAX_FRAMEBUF; i++)
- allocate_framebuf();
-
- sem_init(&framebuf_sem,0,1);
- sem_init(&framebuf_count,0,0);
- sem_init(&framebuf_freecount,0,MAX_FRAMEBUF);
-}
-
-struct framebuf_struct *get_free_framebuf()
-{
- struct framebuf_struct *f;
-
-#ifdef DEBUG_MAILBOX
- cprintf("G");
-#endif
- sem_wait(&framebuf_freecount);
- sem_wait(&framebuf_sem);
-
- //if (!framebuf_free)
- // allocate_framebuf();
-
- f = framebuf_free;
-
- framebuf_free = framebuf_free->next;
-
- sem_post(&framebuf_sem);
-
- return f;
-}
-
-void insert_frame(struct framebuf_struct *f)
-{
- struct framebuf_struct *p, *q;
- int n;
-
-#ifdef DEBUG_MAILBOX
- cprintf("I");
-#endif
- sem_wait(&framebuf_sem);
-
- p = NULL;
- q = framebuf_first;
- n = f->n;
-
- while ((q != NULL) && (n >= q->n)) {
- p = q;
- q = q->next;
- }
-
- if (p)
- p->next = f;
- else
- framebuf_first = f;
-
- if (q)
- q->prev = f;
- else
- framebuf_last = f;
-
- f->next = q;
- f->prev = p;
-
- sem_post(&framebuf_count);
- sem_post(&framebuf_sem);
-}
-
-struct framebuf_struct *remove_frame()
-{
- struct framebuf_struct *f;
-
-#ifdef DEBUG_MAILBOX
- cprintf("R");
-#endif
- sem_wait(&framebuf_count);
- sem_wait(&framebuf_sem);
-
-
- // remove the first frame
- f = framebuf_first;
-
- if (!f)
- sys_abort(69); // should never happen
-
- framebuf_first = framebuf_first->next;
-
- if (framebuf_first)
- framebuf_first->prev = NULL;
- else
- framebuf_last = NULL;
-
- sem_post(&framebuf_sem);
-
- return f;
-}
-
-void give_back_framebuf(struct framebuf_struct *f)
-{
-#ifdef DEBUG_MAILBOX
- cprintf("B");
-#endif
- sem_wait(&framebuf_sem);
-
- f->next = framebuf_free;
- framebuf_free = f;
-
- sem_post(&framebuf_sem);
- sem_post(&framebuf_freecount);
-}
-
-
-
-
-
Index: demos/branches/pj/mpeg2/test.m2v
===================================================================
--- demos/branches/pj/mpeg2/test.m2v (revision 1085)
+++ demos/branches/pj/mpeg2/test.m2v (nonexistent)
@@ -1,73 +0,0 @@
-³€#ú 0µ‚µ#²MPEG-2 Verification Sequence
-¸_¿l@
-XXµÿ÷ÌSÐTñç!H <$¶óJÒˆ4*”¿FóJ“ a$°ó›Ñ*“Ò@ҔøPUño“=¾œæñ©^„Û!g"¥ý*¶óÔ¾¥qc֗ZµZ•#XN,r0§X°`Pã¥m+fÝÒIgz´â‚ ò$¶¤/°$¨…ZXʶJ_£s&î•öÕR䨫¡#›H¨l!-…BÌA„–l›Ãipb³Õ’gƒqòGY/‚¢–F -Öߧâȧ@¥EJ_‹s6WKXT%• æÐöý$Lµ}iÑG•Â×Çi”@Bí-»’e´aà?{reLRÃùí–D7!GidÞ+fJ–€E +4ãQ#l&ØP8{iªì˳Õ*@«NÅZ؞UȲ©d‹iQ±­Ñ V÷<?'‰Ð¿Š\lU%’À-) ªUk­KèLC a°ä&¶‹t < AMm-¬ÃM!,P“ɨ­n¡0*ùC‚À‰YVìR‚Š<ó&ÁVÄ.SÂÀûfɀS՚’!£éç!Gs²–ÖR£ÍÚCXáÔæó©UÒÏA瞣ì)»‹¶ê 
-8£Ûä[ê©MëÙ@ªù-ƒaV*µ§¬ …H¡v*žÕÈ°øð9BcfÙdž©R’ŽC›VͶŸŒuV?2K<Û
-À†¾~ò&ª]¡á§ -;Á¹4¸ˆ3?ÂCècu uæÈ`äˆ3Ðaþ-q¥»?Pº:ÛJ.Áð9¹q0ØC§àсU!Tmҗ©OæÅ K¡ØxôR¶ -môxAÈóõ
-ƒÛ›»6C6„(h cÙ Ë ¯ü£hb—|—×Ԑ5‡´7Ñ*y­AÕ–ƒÐåD2µ»M±< ‹áæ2cjÍÞ"ÚJ$”ï؇P¹@ó”åhÛ­ãËf–\Bèß ¦ì\*—e¨PXW†·SgžU4Þ6Ä:D€5­íy… ™ÂÚ6’èÈTnº[Djo˜ùÁnæÎ+½Ý©J&¨ÂgídXPæôÿzñ'ÚoÒ¾EI
-––dßJُ}ÙÜR]­ëVhé$ƒ[©[ˆs2¦ÍÉf.ÑäʉT–Är­m2š²Ñò­µhm +
-³VCÀy$0±¤Ú¥y¡AL»%ô°aGB‚t¶ù1£›ê›¼š”àD!BÔ`ÚXbÙ `B©ò7J¿Ö⏔>éÔl7e£(û
--B)ZÉ¡¾|¦"C)VŒ’–×Í´ŸI°àúQvTwƒU-S€!–Å8ó‹ÔXÊè·JÈ6T£%C‚!t±ìÕ©»2REñP¢´¶× -æ鷺¨²TP&FÁ2¸`JÑ£|Cɍ×v)r(Ö
-µ«Á†ãï–q
-Ÿý’(¦B’*µO~pN6¥Sà~PIg52dJŠ NÊzԚ -“l1Ş•e°„ƒ&TñfZ6U½«ä]–)~0 Â–0{u¹~ ÌY¹®´¥ˆR­£´ì°õãiсá­ôÞQú2c¤nŠ[kµ+ö‚ö•3:ÉTÒ¬Ø9[Fiɱ¼x«x²“g{?rŽÊ¤ÊÛÆƇÈßmÀ„iód(Ÿl×K¶îðxÄØ=C-¾n)sf»žÔ­¶ÙžYfð0õ¥6ñKöAÑÕ¬öÛJPÀÖ*¢¹†× …,@ëY—œž€IˆxJ Ød¡ ±_%ð“ 4¹˄óNX;å‹|ƒ}p1ÿûzÕNô,¡ƒ)ê}j -ƒŠROŽ6šZJZ]¡'ÐÚ
-kc’¡jpÑÅ&²l›Ï¹jÀê¥hiÖ u©KÃmµó -¡§›(QEí…6Ç;.]ðYv¨Y€<‹›0Ȓ¥†¡ŠÚÚҍä܂®¦†UªwˆÉ„ж’$’ƒvm«ÏCñ­4B–û,(­ÃÏyæìHSz óMééP²0¡ûYÖØ{Rù²-sÀ,˜OÁ= Âð^ÑVK£åª>·Ð>lîẘD›"”°=K0ožÊÞË·A6§‚:Z]£ ¾ -ÑTC®+wZ¶Žny‚PKô©˜!Ù#u­<"„’›/Km¡ÕÜÊÜ!KÕ°Lƒ¡L¬ñj®N(­£cñ¾+Òñ]û Áä¦×ґ{¡!¾Îu.ëß,,)³¥Æ÷7òßØú´J -¯º¡Á/‰cz(L{yÿ}®PíûY·#•.Ëi:¥€DÝt¦jˆ60SÌçT‘3qç¦L ¥RÆÖæfU§\ñŽ´6î¶',»k|֐›õñ>>MMï:tåîË%à¥ØùlB†8ûÛ÷ÖóÆÏÆñlHf™-§@Œ
-oÏù–¶ÐÖôÞÈúM×ò.[N)fÉõŠØ}a9MZNF©úvÀü¸”6DK(`E=³]6–X–.ȶŒy¨°¤9¸½~p¢ÉãV’¡MÝÄï](7^m5Nñ¬©u¼q(íÆ­ìòÍëiÃY¢` ۇ^™G@–õNô§QOÈßt¿L°üø6„ÝjµOºøPÂ;Y졛Ÿ-ù?¥(û¼µÝ×òÙìñîn 
-£¦ý”sÞ·œö^¥ýÏxIo„pXúþZü´j×®«m±BcsªP6ŽQ µý½Noaï`øèî~9y¦T.£Z‘(GvInQÊ°j\o×âÐO<É38ÖH­êRkyÎ o¯©Ûô¬ŽŽBYMó…:ãt¨çíý7±€…›1E·Ä¾ÚX|{µ}iM‰ÍÅCä`J“ãP,¶H¥†²±Oñ[úQ¶ƒI -!€xÊCe¨ŌÛÝÂó±×ä . [wJ÷Ì°Ø-2SlJÞgB倵ôÿÝ~x02Œiڐ£¢·ôµ÷Î9·ÌO¿oXøÞ`M»íÅâvñ?A>v•O\ÛV¿{Ï8<­ÕøŠù/•à‹ÒXɈÌýªQQ¾\‹@ -š›˜d++Só>¶ãì¦ç?hù|e–7ä:ÀFVúßÀ!?D\L¢¾æD»²–O?JoŒŠ¦@GÿšÇ8uµ¿9¸rK[í<=N3¥gÐüvÏÖñr,ˆ«‡·šQFÑ(õn3s¥»œû æé–~¯:ú¶ùãËm©u=¿Ð"äþëàvpF²­æ}-¾‰…]67˜›m³$
-Hsy1
-âςe$7<)¹©Ííá}´fç9T¢›ó¥ûgnÑ=åá“Ö{ù@Jw k|O þ\*-6wtôÖMéu€;ù. ^3m o=ÀQ‚Z¾&{·#ÈMû§µJ2ãÛôkTe˜¬±C+£y–ßt‹…“öOc[ÈMÂF¨Ë~ÝҀòñ±°q C«»Fñà€ZúÏF/K·àœÐ`ÿö½¾¼‚40zò÷8X:Îۃ¸}½Ø‹•4Ÿ&’µÍ®CåúÌhcxb8{öµ#=;Â>À @\‡æH¹œU7Æ·”ÆÒo–­ú [§:%'Yð Eƒ‡áu¾VGÉö™«&:õq\g….©[žSr Š9¹¬'D-|[ñ@ãªïŸœ°>A–ßµ“ßîéœ8@¡‹j©·»T†ß–ˆûžýŠ–oÿ¯s`°q„Ùëc~˜Êz/š‹`©‡šT™ nh@ xÔFÄ[ <3Õ¿tF7âRfðE”`K|„RýŠÈýBYÅDSߢÐc|ÔBÿ®žð×¾*Üô<)®þu7âEÛ2­ç~y”àÉ»¨_8;0Cõ|M9¼¤q­æÒ[z¡@…þ"r!7¨1
-nÒf¼!‚k°z G”À"£óßo•Ù؊…”}ômbêÉCç|ßiæäJŽr/è$qÀB¶—ìËՉ…VpòÃË°)¼Ž’]o£oäbˑJÒ!(*Ž¤¶é ‘ᐈ .9aMõûÎQ’H6aë
-:”ÇVÍ©¦‹ZRÛ> JҚ+:÷ÈùúÎÁ° ñ­P¼6þ³Cᔿ–›éÒù©áežyè2¥°Â]" -¡zÜøTkh{!ùB1¸T‘K ‡þ©U¸¯A{vÌo¹âj‘m…1<[Íw&!2;ŠYð)T±íxYcÛ¯èà¦ø̔šO¶QƝ™dZXŠûK•܋ɹ<ä1Ðí—Yéu
-kue… ñ}RÙaU£
--ø7ùŸ®2fGDÜ¥$ª´$ªÝ!GiÛ;A­Þ×Ìw;–ŸÁgÀ=Å7Çù¦Zx®Ì°µ9„ufMŒ*–1¾ó—$æ[xRþ…° ”b·¨¶ CãÜý_F¼NߌU¾}nT‡ ¹[¶RàæDÊԟ¿” ­×êÔ “.¦oñÃåSª[%,ã©ÍT‹CktR£dMV’ »€µ‚/÷˜rø0ÿù=àÁ瑍…‰sÈÄl-llàð¿;WÁ—ÿÀáð ™ÐñÑêpÐßÀ 4숇‘à`*ÿ0節pp‘ -€á T$ŒF½Cwh¸-P„DÀ°ÌO€ÐÂׇ’= -¼ŒpbQʉüƒÎäøÀş׀ӏ9GWÀàYFlÂÜøðbÿý„àwˆ¢G‘9„g€Ð–<Ï_"wƒðq´7
-dG7xÀD(åšÉ°aÁ`"€j¸6ÿ€h¼È Ȑ4ø{ž}|Àv ÷€Øã8Ÿ @Z ÐÞð6Ø `85‘þ8èÀ9¨nà¾çp*$®õÌ qª€À, ¡¿‘ÀjÒúà@-à6 _ÿ™Cwx €óŸHv`l~x“˜ˆú;‹)ÅՄ¤µÛ
- -n¤Z2BÂ@¢ýF#sâĔf6P¤!ø·E-¡hTR a(èz·Ê7Ô6à˜-„îÍ?Žÿn–æð&¥Ó÷I!JÃÉÊP(5ƪ<ðþúÀš~ùŤœ1Âhn…+l<ŸÄe§cYVÞrø6ü `wÿ…@î47pø Î3@°ø -ƒX€^ð¯C 0 £ @ñÿê€9õ -ÎØðât ÿþ(pát7õƒP€G,s€ÈžO¨ÔÂ)Š´qÔµCÇвQš8¦4â¶Á¯¨_€òÙñ
-J¡¥Œ¨3Ðs.—*]ƒZB8ú1¾Cž°kGʊ‹K’–‡†Œ8bځ­Ú„ì.ò2aUO* -z†7-C풖Q*Ià6ߜ|BÐe= -5օhœ Œ‚HÂö +F¬Ìʆ`Ó΂CþJ²lpíñ ´Ã· $«/¯ýð ²@rÖC)9cN'Ž-•r ‚ø=ÿü à€Ü ÀOã 4áFµ -ÌPø‚³à8ô° -õðfÿòp˜v8\ ßþ°5°°³mæèWáÊ$8…—Ð |G4ÀÓÿàGG™¿³Ãˆø:è÷KLÙFƒP³ì© :<0%c&Z›
-ª 7«=”ÈXÀʾ2’²·È7Ô4MðL‚`’
-nžwfû퐷a˜Þh^N:d¡Ô7ž³³‰e‡«›¤–œß¤×s˜à=À#<£²¤¨Ô»8@ÑãØçÏ}gQ5ÃZê ž³R”¿ÓÿâŸö2X©Š+- -’¾à|/­Rpӂ~Úè&~Ž1^£À²[v4ý /o{9y~ŒvZ4pf© -½&9KTð{y -ôjÀb'4>tXC2›î€®ÙaèçF£ö$ç û‡ãÂÜZr2`@Fß V㐰L…³¨œ:9.}=\-e@¡(xãƒ[¡ùXL§œ’”Pks¢–´ªIê¡a -Ó¦ÔK©V•H@?o•,1¾œ¦‰Ç7Q8G '™‘=őXq¯œÄ§Ç‘€9ÀjeœOàÇQò¸ê\ø¥l©R¡a@QÍ ½ˆ£èññV¡ÛªuJU-Ú*ÙOéFúo’o«hœ`˜% ‘ˆ%¡[1áafð<Öàg
-DÃÉãäoÙ<ÁÿìG<`ì´÷Ir“‰=!X¡/Íæ˜9]³Ñ5ËæDÒná‘Œ;h †_,„QX01$­€$<ôðüÊ’QJcÀ_øš¢ÚÕpف¦PÀòQ0°G1F‡°_€,ä²Ñ‡ð 'z©%œ!åp´…ͯª‚ª \öÚ¿ùf ¡ §¤mÄâwÿ›á"pێŸ ÒNËë[ºbðõ¼eo¿šÀzâsñ$– ÖÅ?T¤ô(¶ôÉ$-!ô -xB‡69—T«Iføâ›í͐ -´>yÈÛ EŽoS®²“y@r’›-ã”/*u8!»vËCBÿÙYM”惊P†Ä¾¾}U{tt1E@ æÁ*œYCáA¥§ŠUÚ·Gî<O…š ðæî;›ó·ÁǐÂÇ>Ç'C†—àxQá­è£Þ.Rt‘<hSu*Öè:+A;ìÕ_V QhŒbá-¿8€þ‚oý5à?ïúdcve4J@*¢b6+b+€ -Käx
-$¦$ï”A;þý¼â kÁ„º%‚<AÂa &-¿FÅcA+ÿ@ð&™âhnGÑY†+€˜ƒ`*P)`gè4 ¥ FB?$fðŸÍ€BP @®$ŒN±>]@’ -höd ž¨›°êã7ôšÖcÀÛVn {j¹š~e
-Œ2VÜPD ô -Zv}YEîQ „‚Ñóp6®O‰‰‹†a(Ð ¥MBJ -BCà ÉxGîmé £àpú
-_UžÖêh‰íùüG±:©*Ê ù±¹¶ à jØ<Ѐ ¼UoÓcÍ4J–c#Àа•¦lGð €
-pwà"aPД9áî €ñà>€P ÿA¿áTM•®•ï>Y=ï¨1B«h ÚV,Qжó@|ß^f@6څÂPpI>À_‘’ŒWl9húAa®X .Ð`-=C
-V$'áÅ£‰€¡h4j¢Q¶Ó¹±cF«8É ÐGç#4©àŠ -ŸXÎlj˜7ŽßÒíGœÂ~l0­(Ñöy©ÒЦ£':vh[5~A±®å8°‚Ù«sGZš Õ?Æ· ¬$Ï_9[Äç¤@›ÿ­çÐÙí¹­óîöÛ@âKAKô5#+Ü:O!÷_áóêks_L€y*VË5@Ù!±ºß ÁÍdp”<$` €*nhe‚oýÈ@À -øÔሠ,frg^@¯9 7&¥ÁoÿqÐà d0Ô(mŽêû+…†8¾dKPúÛÑ(ÆÆð’ÅiƁ9bƒÿiƒÿè”믣 ?þBU¦Š -;€ Y𣸵”‹/¿—ßËïÄäûúe÷é~—é|“/¿Kô¿Kô¿ÛïÐ=ÿý Å÷·¿ÿà`5¨NOµœ‰9Eüg›À“/¿—ߥü¾þ_~ÛçoÿÀâ4&à#Ù%€ z³‹î;¿ÚB7+ -~,þl” -eŒƒð̶Ê$óŒ¹aþF·=²ùˆvٲЎÎb5Q7Ìpq€Ü¼>²4MIìpfÿ”¥Í Í{/¿—ߥú_„äû| -ÀIGi¬hM @BØñÈπ–Ç1¸›ÍTSñ›x ºÊ?™•ƒ—À²µ-Âà37¬ªØ…êfˆe¡ ÿ…!$óã hN »j(Å_þâÂP. ÓŠ“òÏÿŽ¡9¿è?þ¥ûkíW<Œæ:BOÉ0~„YN…Нˆ ¥ Üé(í ÏBobl - \0'.<Bv¹ ’u ÔaÀÐÔ; dšàUáSͪ&Úԁˆ ɱ™Z~ÙM¢`fû!‰ã6ÏÇa9Í·ƒ?ò|D´ð‘BnƒÌ&Rk˜Œ*³/ö'‘ƒ VRÎÌzGšÿPfí€y¨Nl(ëçæÁ~ðфˆ'Õ à ÆåŒO>(%'ê˜"*ˆi á±7…’ä“©$ý ¡98Ði -p¿d…¼Ô'@LNDú˝”p\`xÓD¼“W‚¤t€’ -¿høKyô­Ï¢U -)ÖÀ|Á†¢ävËרMã¬h%dÏ·b7´v„½ Ò ‚
-éã~# ø¿ÄÎ.U¤ŸèNcŋ%"-SÖÙ©?Ñ
-¢u…Ž0]ôÎ<Œ¨ªy æ€éÄÁ :É¢^¬Z"¹Ù0œAËóàaIc*°gkР½½ˆ0º}úÀb€GBu„ÀjbyQi*INm¡¢ÊAÏóÑ ¡‰úá–Éʵ¬wÖã…Ñ;AÇ@à5æûK›Ÿ‹R'ùtN0ŒÁ€†€äd–R_n΋NC{›øb¾à¼áƒ\hxޅFQ9ÃçÐox{HPÓÿiD€ý?@áõ·
\ No newline at end of file
Index: demos/branches/pj/mpeg2/initfile.c
===================================================================
--- demos/branches/pj/mpeg2/initfile.c (revision 1085)
+++ demos/branches/pj/mpeg2/initfile.c (nonexistent)
@@ -1,256 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * CVS : $Id: initfile.c,v 1.1.1.1 2002-09-02 09:37:45 pj Exp $
- *
- * File: $File$
- * Revision: $Revision: 1.1.1.1 $
- * Last update: $Date: 2002-09-02 09:37:45 $
- */
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/rr.h"
-#include "modules/cbs.h"
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-#include "modules/pi.h"
-#include "modules/pc.h"
-#include "modules/srp.h"
-#include "modules/npp.h"
-#include "modules/nop.h"
-#include "modules/nopm.h"
-
-#include "drivers/keyb.h"
-
-#include <trace/trace.h>
-#include <trace/queues.h>
-
-#include <fs/bdevinit.h>
-#include <fs/fsinit.h>
-#include <fs/bdev.h>
-
-
-/*+ sysyem tick in us +*/
-#define TICK 1000
-
-/*+ RR tick in us +*/
-#define RRTICK 10000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
- extern int __register_sub_init_prologue(void);
- extern int __register_sub_init(void);
-
- __register_sub_init_prologue();
-
- EDF_register_level(EDF_ENABLE_ALL);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- CBS_register_level(CBS_ENABLE_ALL, 0);
- dummy_register_level();
-
- SEM_register_module();
-
- CABS_register_module();
-
- PI_register_module();
- PC_register_module();
- NPP_register_module();
- SRP_register_module();
- NOP_register_module();
- NOPM_register_module();
-
- __register_sub_init();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
- KEYB_PARMS keyb = BASE_KEYB;
- extern int __bdev_sub_init(void);
- extern int __fs_sub_init(void);
- extern void ctrlc_exit(KEY_EVT *k);
-
- HARTPORT_init();
-
- keyb_def_ctrlC(keyb, ctrlc_exit);
- KEYB_init(&keyb);
-
- __bdev_sub_init();
- __fs_sub_init();
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
-#define PSCANSCHED 1
-#define NOTRACE
-
-int __register_sub_init_prologue(void)
-{
-#ifndef NOTRACE
- int id;
-
- TRC_init_phase1(NULL);
- trc_register_fixed_queue();
- id=trc_create_queue(TRC_FIXED_QUEUE,NULL);
- trc_trace_class(TRC_CLASS_USER);
- trc_assign_class_to_queue(TRC_CLASS_USER,id);
-#endif
- return 0;
-}
-
-int __register_sub_init(void)
-{
-#if defined(EDFSCHED)
- extern void BD_EDF_register_module(void);
- BD_EDF_register_module();
-#elif defined(PSCANSCHED)
- extern void BD_PSCAN_register_module(void);
- BD_PSCAN_register_module();
-#endif
- return 0;
-}
-
-dev_t root_device=-1;
-dev_t temp_device=-1;
-
-int choose_root_callback(dev_t dev,u_int8_t fs)
-{
- if (fs==FS_MSDOS) return dev;
- return -1;
-}
-
-int choose_temp_callback(__dev_t dev,__uint8_t fs)
-{
- static int flag=0;
- if (fs==FS_MSDOS) {
- if (flag) return dev;
- flag=1;
- }
- return -1;
-}
-
-int __bdev_sub_init(void)
-{
- BDEV_PARMS bdev=BASE_BDEV;
-
- bdev_def_showinfo(bdev,FALSE);
- bdev_init(&bdev);
-
- root_device=bdev_scan_devices(choose_root_callback);
- if (root_device<0) {
- cprintf("can't find root device to mount on /!!!\n");
- sys_end();
- return -1;
- }
-
- /*
- temp_device=bdev_scan_devices(choose_temp_callback);
- if (temp_device<0) {
- cprintf("can't find a filesystem to mount on /TEMP!!!\n");
- }
- */
-
- return 0;
-}
-
-
-int __fs_sub_init(void)
-{
- extern int libc_initialize(void);
- FILESYSTEM_PARMS fs=BASE_FILESYSTEM;
- struct mount_opts opts;
- // int res;
-
- filesystem_def_rootdevice(fs,root_device);
- filesystem_def_fs(fs,FS_MSDOS);
- filesystem_def_showinfo(fs,FALSE);
- filesystem_def_options(fs,opts);
-
- memset(&opts,0,sizeof(struct mount_opts));
- opts.flags=MOUNT_FLAG_RW;
-
-
- filesystem_init(&fs);
-
- /*
- if (temp_device>=0) {
- memset(&opts,0,sizeof(struct mount_opts));
- opts.flags=MOUNT_FLAG_RW;
- res=mount(temp_device,FS_MSDOS,"/TEMP",&opts);
- if (res!=0) {
- cprintf("can't mount XXX on /TEMP (errno: %i)\n",errno);
- } else
- cprintf("mounted /TEMP rw\n");
- }
- */
-
- libc_initialize();
-
-#ifndef NOTRACE
- TRC_init_phase2();
-#endif
-
- return 0;
-}
-
-void ctrlc_exit(KEY_EVT *k)
-{
- extern void dump_sem_table(void);
- extern void dump_nop_table(void);
-#ifndef NOGRX
- grx_close();
-#endif
- cprintf("CTRL-C pressed!\n");
- sys_end();
-}
-
-
-
-
-
-
-
Index: demos/branches/pj/mpeg2/verify.c
===================================================================
--- demos/branches/pj/mpeg2/verify.c (revision 1085)
+++ demos/branches/pj/mpeg2/verify.c (nonexistent)
@@ -1,303 +0,0 @@
-/* verify.c
- *
- * Bitstream verification routines
- *
- *
- */
-#ifdef VERIFY
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <ctype.h>
-#include <fcntl.h>
-#include <math.h> /* needed for ceil() */
-
-#include "config.h"
-#include "global.h"
-
-/* #define DEBUG */
-#ifdef DEBUG
-#define PC
-#endif
-
-#ifdef PC
-#include <conio.h> /* needed for getch() */
-#endif /* PC */
-
-/*
- Check picture headers: due to the VBV definition of picture data,
- this routine must be called immediately before any picture data
- is parsed. (before the first slice start code, including any slice
- start code stuffing).
-*/
-
-
-static void Check_VBV_Delay _ANSI_ARGS_((int Bitstream_Framenum, int Sequence_Framenum));
-
-
-void Check_Headers(Bitstream_Framenum, Sequence_Framenum)
-int Bitstream_Framenum;
-int Sequence_Framenum;
-{
-
-
- if((!low_delay)&&(vbv_delay!=0)&&(vbv_delay!=0xFFFF))
- Check_VBV_Delay(Bitstream_Framenum, Sequence_Framenum);
-
- /* clear out the header tracking variables so we have an accurate
- count next time */
- Clear_Verify_Headers();
-}
-
-
-
-/*
- * Verify vbv_delay value in picture header
- * (low_delay==1 checks not implemented. this does not exhaustively test all
- * possibilities suggested in ISO/IEC 13818-2 Annex C. It only checks
- * for constant rate streams)
- *
- * Q:how do we tell a variable rate stream from a constant rate stream anyway?
- * it's not as simple as vbv_delay==0xFFFF, since we need meaningful
- * vbv_delay values to calculate the piecewise rate in the first place!
- *
- * Also: no special provisions at the beginning or end of a sequence
- */
-
-static void Check_VBV_Delay(Bitstream_Framenum, Sequence_Framenum)
-int Bitstream_Framenum;
-int Sequence_Framenum;
-{
- double B; /* buffer size */
- double Bn; /* buffer fullness for picture n */
- double R; /* bitrate */
- double I; /* time interval (t[n+1] - t[n]) */
- double T; /* inverse of the frame rate (frame period) */
-
- int d;
- int internal_vbv_delay;
-
- static int previous_IorP_picture_structure;
- static int previous_IorP_repeat_first_field;
- static int previous_IorP_top_field_first;
- static int previous_vbv_delay;
- static int previous_bitstream_position;
-
- static double previous_Bn;
- static double E; /* maximum quantization error or mismatch */
-
-
-
- if((Sequence_Framenum==0)&&(!Second_Field))
- { /* first coded picture of sequence */
-
- R = bit_rate;
-
- /* the initial buffer occupancy is taken on faith
- that is, we believe what is transmitted in the first coded picture header
- to be the true/actual buffer occupancy */
-
- Bn = (R * (double) vbv_delay) / 90000.0;
- B = 16 * 1024 * vbv_buffer_size;
-
-
- /* maximum quantization error in bitrate (bit_rate_value is quantized/
- rounded-up to units of 400 bits/sec as per ISO/IEC 13818-2
- section 6.3.3 */
-
- E = (400.0/frame_rate) + 400;
-
-#ifdef DEBUG
- printf("vbv_buffer_size (B) = %.0f, Bn=%f, E=%f, \nbitrate=%f, vbv_delay=%d frame_rate=%f\n",
- B, Bn, E, bit_rate, vbv_delay, frame_rate);
-#endif
-
- }
- else /* not the first coded picture of sequence */
- {
-
- /* derive the interval (I). The interval tells us how many constant rate bits
- * will have been downloaded to the buffer during the current picture period
- *
- * interval assumes that:
- * 1. whilst we are decoding the current I or P picture, we are displaying
- * the previous I or P picture which was stored in the reorder
- * buffer (pointed to by forward_reference_frame in this implementation)
- *
- * 2. B pictures are output ("displayed") at the time when they are decoded
- *
- */
-
- if(progressive_sequence) /* Annex C.9 (progressive_sequence==1, low_delay==0) */
- {
-
- T = 1/frame_rate; /* inverse of the frame rate (frame period) */
-
- if(picture_coding_type==B_TYPE)
- {
- if(repeat_first_field==1)
- {
- if(top_field_first==1)
- I = T*3; /* three frame periods */
- else
- I = T*2; /* two frame periods */
- }
- else
- I = T; /* one frame period */
- }
- else /* P or I frame */
- {
- if(previous_IorP_repeat_first_field==1)
- {
- if(previous_IorP_top_field_first==1)
- I = 3*T;
- else
- I = 2*T;
- }
- else
- I = T;
- }
- }
- else /* Annex C.11 (progressive_sequence==0, low_delay==0) */
- {
-
- T = 1/(2*frame_rate); /* inverse of two times the frame rate (field period) */
-
- if(picture_coding_type==B_TYPE)
- {
- if(picture_structure==FRAME_PICTURE)
- {
- if(repeat_first_field==0)
- I = 2*T; /* two field periods */
- else
- I = 3*T; /* three field periods */
- }
- else /* B field */
- {
- I = T; /* one field period */
- }
- }
- else /* I or P picture */
- {
- if(picture_structure==FRAME_PICTURE)
- {
- if(previous_IorP_repeat_first_field==0)
- I = 2*T;
- else
- I = 3*T;
- }
- else
- {
- if(Second_Field==0) /* first field of current frame */
- I = T;
- else /* second field of current frame */
- {
- /* formula: previous I or P display period (2*T or 3*T) minus the
- very recent decode period (T) of the first field of the current
- frame */
-
- if(previous_IorP_picture_structure!=FRAME_PICTURE
- || previous_IorP_repeat_first_field==0)
- I = 2*T - T; /* a net of one field period */
- else if(previous_IorP_picture_structure==FRAME_PICTURE
- && previous_IorP_repeat_first_field==1)
- I = 3*T - T; /* a net of two field periods */
- }
- }
- }
- }
-
- /* derive coded size of previous picture */
- d = ld->Bitcnt - previous_bitstream_position;
-
- /* Rate = Distance/Time */
-
- /* piecewise constant rate (variable rate stream) calculation
- * R = ((double) d /((previous_vbv_delay - vbv_delay)/90000 + I));
- */
-
- R = bit_rate;
-
- /* compute buffer fullness just before removing picture n
- *
- * Bn = previous_Bn + (I*R) - d; (recursive formula)
- *
- * where:
- *
- * n is the current picture
- *
- * Bn is the buffer fullness for the current picture
- *
- * previous_Bn is the buffer fullness of the previous picture
- *
- * (I*R ) is the bits accumulated during the current picture
- * period
- *
- * d is the number of bits removed during the decoding of the
- * previous picture
- */
-
- Bn = previous_Bn + (I*R) - d;
-
- /* compute internally derived vbv_delay (rouding up with ceil()) */
- internal_vbv_delay = (int) ceil((90000 * Bn / bit_rate));
-
-#ifdef DEBUG
- printf("\nvbv_delay: internal=%d, bitstream=%d\n", internal_vbv_delay, vbv_delay);
-
- printf("Bn=%f, prevBn=%f, I=%f, R=%f, d=%d\n", Bn, previous_Bn, I, R, d);
- printf("frame(%d), pictstruct(%d), picttype(%d)\n", Sequence_Framenum,
- picture_structure, picture_coding_type);
-
- /* report error */
- if(internal_vbv_delay != vbv_delay)
- {
- printf("WARNING: internal_vbv_delay(%d) != vbv_delay(%d)\n",
- internal_vbv_delay, vbv_delay);
- }
-#endif
-
- } /* not the first coded picture of sequence */
-
-
-#ifdef PC
- getch();
-#endif /* PC */
-
- /* update generic tracking variables */
- previous_bitstream_position = ld->Bitcnt ;
- previous_vbv_delay = vbv_delay;
- previous_Bn = Bn;
-
- /* reference picture: reordered/delayed output picture */
- if(picture_coding_type!=B_TYPE)
- {
- previous_IorP_repeat_first_field = repeat_first_field;
- previous_IorP_top_field_first = top_field_first;
- previous_IorP_picture_structure = picture_structure;
- }
-
-}
-
-
-
-/* variables to keep track of the occurance of redundant headers between pictures */
-void Clear_Verify_Headers()
-{
- verify_sequence_header = 0;
- verify_group_of_pictures_header = 0;
- verify_picture_header = 0;
- verify_slice_header = 0;
- verify_sequence_extension = 0;
- verify_sequence_display_extension = 0;
- verify_quant_matrix_extension = 0;
- verify_sequence_scalable_extension = 0;
- verify_picture_display_extension = 0;
- verify_picture_coding_extension = 0;
- verify_picture_spatial_scalable_extension = 0;
- verify_picture_temporal_scalable_extension = 0;
- verify_copyright_extension = 0;
-}
-
-#endif /* VERIFY */
-
Index: demos/branches/pj/mpeg2/motion.c
===================================================================
--- demos/branches/pj/mpeg2/motion.c (revision 1085)
+++ demos/branches/pj/mpeg2/motion.c (nonexistent)
@@ -1,236 +0,0 @@
-/* motion.c, motion vector decoding */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-#include <stdio.h>
-
-#include "config.h"
-#include "global.h"
-
-/* private prototypes */
-static void decode_motion_vector _ANSI_ARGS_((int *pred, int r_size, int motion_code,
- int motion_residualesidual, int full_pel_vector));
-
-/* ISO/IEC 13818-2 sections 6.2.5.2, 6.3.17.2, and 7.6.3: Motion vectors */
-void motion_vectors(PMV,dmvector,
- motion_vertical_field_select,s,motion_vector_count,mv_format,h_r_size,v_r_size,dmv,mvscale)
-int PMV[2][2][2];
-int dmvector[2];
-int motion_vertical_field_select[2][2];
-int s, motion_vector_count, mv_format, h_r_size, v_r_size, dmv, mvscale;
-{
- if (motion_vector_count==1)
- {
- if (mv_format==MV_FIELD && !dmv)
- {
- motion_vertical_field_select[1][s] = motion_vertical_field_select[0][s] = Get_Bits(1);
-#ifdef TRACE
- if (Trace_Flag)
- {
- printf("motion_vertical_field_select[][%d] (%d): %d\n",s,
- motion_vertical_field_select[0][s],motion_vertical_field_select[0][s]);
- }
-#endif /* TRACE */
- }
-
- motion_vector(PMV[0][s],dmvector,h_r_size,v_r_size,dmv,mvscale,0);
-
- /* update other motion vector predictors */
- PMV[1][s][0] = PMV[0][s][0];
- PMV[1][s][1] = PMV[0][s][1];
- }
- else
- {
- motion_vertical_field_select[0][s] = Get_Bits(1);
-#ifdef TRACE
- if (Trace_Flag)
- {
- printf("motion_vertical_field_select[0][%d] (%d): %d\n",s,
- motion_vertical_field_select[0][s],motion_vertical_field_select[0][s]);
- }
-#endif /* TRACE */
- motion_vector(PMV[0][s],dmvector,h_r_size,v_r_size,dmv,mvscale,0);
-
- motion_vertical_field_select[1][s] = Get_Bits(1);
-#ifdef TRACE
- if (Trace_Flag)
- {
- printf("motion_vertical_field_select[1][%d] (%d): %d\n",s,
- motion_vertical_field_select[1][s],motion_vertical_field_select[1][s]);
- }
-#endif /* TRACE */
- motion_vector(PMV[1][s],dmvector,h_r_size,v_r_size,dmv,mvscale,0);
- }
-}
-
-/* get and decode motion vector and differential motion vector
- for one prediction */
-void motion_vector(PMV,dmvector,
- h_r_size,v_r_size,dmv,mvscale,full_pel_vector)
-int *PMV;
-int *dmvector;
-int h_r_size;
-int v_r_size;
-int dmv; /* MPEG-2 only: get differential motion vectors */
-int mvscale; /* MPEG-2 only: field vector in frame pic */
-int full_pel_vector; /* MPEG-1 only */
-{
- int motion_code, motion_residual;
-
- /* horizontal component */
- /* ISO/IEC 13818-2 Table B-10 */
- motion_code = Get_motion_code();
-
- motion_residual = (h_r_size!=0 && motion_code!=0) ? Get_Bits(h_r_size) : 0;
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- if (h_r_size!=0 && motion_code!=0)
- {
- printf("motion_residual (");
- Print_Bits(motion_residual,h_r_size,h_r_size);
- printf("): %d\n",motion_residual);
- }
- }
-#endif /* TRACE */
-
-
- decode_motion_vector(&PMV[0],h_r_size,motion_code,motion_residual,full_pel_vector);
-
- if (dmv)
- dmvector[0] = Get_dmvector();
-
-
- /* vertical component */
- motion_code = Get_motion_code();
- motion_residual = (v_r_size!=0 && motion_code!=0) ? Get_Bits(v_r_size) : 0;
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- if (v_r_size!=0 && motion_code!=0)
- {
- printf("motion_residual (");
- Print_Bits(motion_residual,v_r_size,v_r_size);
- printf("): %d\n",motion_residual);
- }
- }
-#endif /* TRACE */
-
- if (mvscale)
- PMV[1] >>= 1; /* DIV 2 */
-
- decode_motion_vector(&PMV[1],v_r_size,motion_code,motion_residual,full_pel_vector);
-
- if (mvscale)
- PMV[1] <<= 1;
-
- if (dmv)
- dmvector[1] = Get_dmvector();
-
-#ifdef TRACE
- if (Trace_Flag)
- printf("PMV = %d,%d\n",PMV[0],PMV[1]);
-#endif /* TRACE */
-}
-
-/* calculate motion vector component */
-/* ISO/IEC 13818-2 section 7.6.3.1: Decoding the motion vectors */
-/* Note: the arithmetic here is more elegant than that which is shown
- in 7.6.3.1. The end results (PMV[][][]) should, however, be the same. */
-
-static void decode_motion_vector(pred,r_size,motion_code,motion_residual,full_pel_vector)
-int *pred;
-int r_size, motion_code, motion_residual;
-int full_pel_vector; /* MPEG-1 (ISO/IEC 11172-1) support */
-{
- int lim, vec;
-
- lim = 16<<r_size;
- vec = full_pel_vector ? (*pred >> 1) : (*pred);
-
- if (motion_code>0)
- {
- vec+= ((motion_code-1)<<r_size) + motion_residual + 1;
- if (vec>=lim)
- vec-= lim + lim;
- }
- else if (motion_code<0)
- {
- vec-= ((-motion_code-1)<<r_size) + motion_residual + 1;
- if (vec<-lim)
- vec+= lim + lim;
- }
- *pred = full_pel_vector ? (vec<<1) : vec;
-}
-
-
-/* ISO/IEC 13818-2 section 7.6.3.6: Dual prime additional arithmetic */
-void Dual_Prime_Arithmetic(DMV,dmvector,mvx,mvy)
-int DMV[][2];
-int *dmvector; /* differential motion vector */
-int mvx, mvy; /* decoded mv components (always in field format) */
-{
- if (picture_structure==FRAME_PICTURE)
- {
- if (top_field_first)
- {
- /* vector for prediction of top field from bottom field */
- DMV[0][0] = ((mvx +(mvx>0))>>1) + dmvector[0];
- DMV[0][1] = ((mvy +(mvy>0))>>1) + dmvector[1] - 1;
-
- /* vector for prediction of bottom field from top field */
- DMV[1][0] = ((3*mvx+(mvx>0))>>1) + dmvector[0];
- DMV[1][1] = ((3*mvy+(mvy>0))>>1) + dmvector[1] + 1;
- }
- else
- {
- /* vector for prediction of top field from bottom field */
- DMV[0][0] = ((3*mvx+(mvx>0))>>1) + dmvector[0];
- DMV[0][1] = ((3*mvy+(mvy>0))>>1) + dmvector[1] - 1;
-
- /* vector for prediction of bottom field from top field */
- DMV[1][0] = ((mvx +(mvx>0))>>1) + dmvector[0];
- DMV[1][1] = ((mvy +(mvy>0))>>1) + dmvector[1] + 1;
- }
- }
- else
- {
- /* vector for prediction from field of opposite 'parity' */
- DMV[0][0] = ((mvx+(mvx>0))>>1) + dmvector[0];
- DMV[0][1] = ((mvy+(mvy>0))>>1) + dmvector[1];
-
- /* correct for vertical field shift */
- if (picture_structure==TOP_FIELD)
- DMV[0][1]--;
- else
- DMV[0][1]++;
- }
-}
-
Index: demos/branches/pj/mpeg2/global.h
===================================================================
--- demos/branches/pj/mpeg2/global.h (revision 1085)
+++ demos/branches/pj/mpeg2/global.h (nonexistent)
@@ -1,515 +0,0 @@
-/* global.h, global variables */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-#include "mpeg2dec.h"
-
-/* choose between declaration (GLOBAL undefined)
- * and definition (GLOBAL defined)
- * GLOBAL is defined in exactly one file mpeg2dec.c)
- */
-
-#ifndef GLOBAL
-#define EXTERN extern
-#else
-#define EXTERN
-#endif
-
-/* prototypes of global functions */
-/* readpic.c */
-void Substitute_Frame_Buffer _ANSI_ARGS_ ((int bitstream_framenum,
- int sequence_framenum));
-
-/* Get_Bits.c */
-void Initialize_Buffer _ANSI_ARGS_((void));
-void Fill_Buffer _ANSI_ARGS_((void));
-unsigned int Show_Bits _ANSI_ARGS_((int n));
-unsigned int Get_Bits1 _ANSI_ARGS_((void));
-void Flush_Buffer _ANSI_ARGS_((int n));
-unsigned int Get_Bits _ANSI_ARGS_((int n));
-int Get_Byte _ANSI_ARGS_((void));
-int Get_Word _ANSI_ARGS_((void));
-
-/* systems.c */
-void Next_Packet _ANSI_ARGS_((void));
-int Get_Long _ANSI_ARGS_((void));
-void Flush_Buffer32 _ANSI_ARGS_((void));
-unsigned int Get_Bits32 _ANSI_ARGS_((void));
-
-
-/* getblk.c */
-void Decode_MPEG1_Intra_Block _ANSI_ARGS_((int comp, int dc_dct_pred[]));
-void Decode_MPEG1_Non_Intra_Block _ANSI_ARGS_((int comp));
-void Decode_MPEG2_Intra_Block _ANSI_ARGS_((int comp, int dc_dct_pred[]));
-void Decode_MPEG2_Non_Intra_Block _ANSI_ARGS_((int comp));
-
-/* gethdr.c */
-int Get_Hdr _ANSI_ARGS_((void));
-void next_start_code _ANSI_ARGS_((void));
-int slice_header _ANSI_ARGS_((void));
-void marker_bit _ANSI_ARGS_((char *text));
-
-/* getpic.c */
-void Decode_Picture _ANSI_ARGS_((int bitstream_framenum,
- int sequence_framenum));
-void Output_Last_Frame_of_Sequence _ANSI_ARGS_((int framenum));
-
-/* getvlc.c */
-int Get_macroblock_type _ANSI_ARGS_((void));
-int Get_motion_code _ANSI_ARGS_((void));
-int Get_dmvector _ANSI_ARGS_((void));
-int Get_coded_block_pattern _ANSI_ARGS_((void));
-int Get_macroblock_address_increment _ANSI_ARGS_((void));
-int Get_Luma_DC_dct_diff _ANSI_ARGS_((void));
-int Get_Chroma_DC_dct_diff _ANSI_ARGS_((void));
-
-/* idct.c */
-void Fast_IDCT _ANSI_ARGS_((short *block));
-void Initialize_Fast_IDCT _ANSI_ARGS_((void));
-
-/* Reference_IDCT.c */
-void Initialize_Reference_IDCT _ANSI_ARGS_((void));
-void Reference_IDCT _ANSI_ARGS_((short *block));
-
-/* motion.c */
-void motion_vectors _ANSI_ARGS_((int PMV[2][2][2], int dmvector[2],
- int motion_vertical_field_select[2][2], int s, int motion_vector_count,
- int mv_format, int h_r_size, int v_r_size, int dmv, int mvscale));
-void motion_vector _ANSI_ARGS_((int *PMV, int *dmvector,
- int h_r_size, int v_r_size, int dmv, int mvscale, int full_pel_vector));
-void Dual_Prime_Arithmetic _ANSI_ARGS_((int DMV[][2], int *dmvector, int mvx, int mvy));
-
-/* mpeg2dec.c */
-void Error _ANSI_ARGS_((char *text));
-void Warning _ANSI_ARGS_((char *text));
-void Print_Bits _ANSI_ARGS_((int code, int bits, int len));
-
-/* recon.c */
-void form_predictions _ANSI_ARGS_((int bx, int by, int macroblock_type,
- int motion_type, int PMV[2][2][2], int motion_vertical_field_select[2][2],
- int dmvector[2], int stwtype));
-
-/* spatscal.c */
-void Spatial_Prediction _ANSI_ARGS_((void));
-
-/* store.c */
-void Write_Frame _ANSI_ARGS_((unsigned char *src[], int frame));
-
-#ifdef DISPLAY
-/* display.c */
-void Initialize_Display_Process _ANSI_ARGS_((char *name));
-void Terminate_Display_Process _ANSI_ARGS_((void));
-void Display_Second_Field _ANSI_ARGS_((void));
-void dither _ANSI_ARGS_((unsigned char *src[]));
-void Initialize_Dither_Matrix _ANSI_ARGS_((void));
-#endif
-
-/* global variables */
-
-EXTERN char Version[]
-#ifdef GLOBAL
- ="mpeg2decode V1.2a, 96/07/19"
-#endif
-;
-
-EXTERN char Author[]
-#ifdef GLOBAL
- ="(C) 1996, MPEG Software Simulation Group"
-#endif
-;
-
-
-/* zig-zag and alternate scan patterns */
-EXTERN unsigned char scan[2][64]
-#ifdef GLOBAL
-=
-{
- { /* Zig-Zag scan pattern */
- 0,1,8,16,9,2,3,10,17,24,32,25,18,11,4,5,
- 12,19,26,33,40,48,41,34,27,20,13,6,7,14,21,28,
- 35,42,49,56,57,50,43,36,29,22,15,23,30,37,44,51,
- 58,59,52,45,38,31,39,46,53,60,61,54,47,55,62,63
- },
- { /* Alternate scan pattern */
- 0,8,16,24,1,9,2,10,17,25,32,40,48,56,57,49,
- 41,33,26,18,3,11,4,12,19,27,34,42,50,58,35,43,
- 51,59,20,28,5,13,6,14,21,29,36,44,52,60,37,45,
- 53,61,22,30,7,15,23,31,38,46,54,62,39,47,55,63
- }
-}
-#endif
-;
-
-/* default intra quantization matrix */
-EXTERN unsigned char default_intra_quantizer_matrix[64]
-#ifdef GLOBAL
-=
-{
- 8, 16, 19, 22, 26, 27, 29, 34,
- 16, 16, 22, 24, 27, 29, 34, 37,
- 19, 22, 26, 27, 29, 34, 34, 38,
- 22, 22, 26, 27, 29, 34, 37, 40,
- 22, 26, 27, 29, 32, 35, 40, 48,
- 26, 27, 29, 32, 35, 40, 48, 58,
- 26, 27, 29, 34, 38, 46, 56, 69,
- 27, 29, 35, 38, 46, 56, 69, 83
-}
-#endif
-;
-
-/* non-linear quantization coefficient table */
-EXTERN unsigned char Non_Linear_quantizer_scale[32]
-#ifdef GLOBAL
-=
-{
- 0, 1, 2, 3, 4, 5, 6, 7,
- 8,10,12,14,16,18,20,22,
- 24,28,32,36,40,44,48,52,
- 56,64,72,80,88,96,104,112
-}
-#endif
-;
-
-/* color space conversion coefficients
- * for YCbCr -> RGB mapping
- *
- * entries are {crv,cbu,cgu,cgv}
- *
- * crv=(255/224)*65536*(1-cr)/0.5
- * cbu=(255/224)*65536*(1-cb)/0.5
- * cgu=(255/224)*65536*(cb/cg)*(1-cb)/0.5
- * cgv=(255/224)*65536*(cr/cg)*(1-cr)/0.5
- *
- * where Y=cr*R+cg*G+cb*B (cr+cg+cb=1)
- */
-
-/* ISO/IEC 13818-2 section 6.3.6 sequence_display_extension() */
-
-EXTERN int Inverse_Table_6_9[8][4]
-#ifdef GLOBAL
-=
-{
- {117504, 138453, 13954, 34903}, /* no sequence_display_extension */
- {117504, 138453, 13954, 34903}, /* ITU-R Rec. 709 (1990) */
- {104597, 132201, 25675, 53279}, /* unspecified */
- {104597, 132201, 25675, 53279}, /* reserved */
- {104448, 132798, 24759, 53109}, /* FCC */
- {104597, 132201, 25675, 53279}, /* ITU-R Rec. 624-4 System B, G */
- {104597, 132201, 25675, 53279}, /* SMPTE 170M */
- {117579, 136230, 16907, 35559} /* SMPTE 240M (1987) */
-}
-#endif
-;
-
-
-
-
-
-/* output types (Output_Type) */
-#define T_YUV 0
-#define T_SIF 1
-#define T_TGA 2
-#define T_PPM 3
-#define T_X11 4
-#define T_X11HIQ 5
-
-/* decoder operation control variables */
-EXTERN int Output_Type;
-EXTERN int hiQdither;
-
-/* decoder operation control flags */
-EXTERN int Quiet_Flag;
-EXTERN int Trace_Flag;
-EXTERN int Fault_Flag;
-EXTERN int Verbose_Flag;
-EXTERN int Two_Streams;
-EXTERN int Spatial_Flag;
-EXTERN int Reference_IDCT_Flag;
-EXTERN int Frame_Store_Flag;
-EXTERN int System_Stream_Flag;
-EXTERN int Display_Progressive_Flag;
-EXTERN int Ersatz_Flag;
-EXTERN int Big_Picture_Flag;
-EXTERN int Verify_Flag;
-EXTERN int Stats_Flag;
-EXTERN int User_Data_Flag;
-EXTERN int Main_Bitstream_Flag;
-
-
-/* filenames */
-EXTERN char *Output_Picture_Filename;
-EXTERN char *Substitute_Picture_Filename;
-EXTERN char *Main_Bitstream_Filename;
-EXTERN char *Enhancement_Layer_Bitstream_Filename;
-
-
-/* buffers for multiuse purposes */
-EXTERN char Error_Text[256];
-EXTERN unsigned char *Clip;
-
-/* pointers to generic picture buffers */
-EXTERN unsigned char *backward_reference_frame[3];
-EXTERN unsigned char *forward_reference_frame[3];
-
-EXTERN unsigned char *auxframe[3];
-EXTERN unsigned char *current_frame[3];
-EXTERN unsigned char *substitute_frame[3];
-
-
-/* pointers to scalability picture buffers */
-EXTERN unsigned char *llframe0[3];
-EXTERN unsigned char *llframe1[3];
-
-EXTERN short *lltmp;
-EXTERN char *Lower_Layer_Picture_Filename;
-
-
-
-
-/* non-normative variables derived from normative elements */
-EXTERN int Coded_Picture_Width;
-EXTERN int Coded_Picture_Height;
-EXTERN int Chroma_Width;
-EXTERN int Chroma_Height;
-EXTERN int block_count;
-EXTERN int Second_Field;
-EXTERN int profile, level;
-
-/* normative derived variables (as per ISO/IEC 13818-2) */
-EXTERN int horizontal_size;
-EXTERN int vertical_size;
-EXTERN int mb_width;
-EXTERN int mb_height;
-EXTERN double bit_rate;
-EXTERN double frame_rate;
-
-
-
-/* headers */
-
-/* ISO/IEC 13818-2 section 6.2.2.1: sequence_header() */
-EXTERN int aspect_ratio_information;
-EXTERN int frame_rate_code;
-EXTERN int bit_rate_value;
-EXTERN int vbv_buffer_size;
-EXTERN int constrained_parameters_flag;
-
-/* ISO/IEC 13818-2 section 6.2.2.3: sequence_extension() */
-EXTERN int profile_and_level_indication;
-EXTERN int progressive_sequence;
-EXTERN int chroma_format;
-EXTERN int low_delay;
-EXTERN int frame_rate_extension_n;
-EXTERN int frame_rate_extension_d;
-
-/* ISO/IEC 13818-2 section 6.2.2.4: sequence_display_extension() */
-EXTERN int video_format;
-EXTERN int color_description;
-EXTERN int color_primaries;
-EXTERN int transfer_characteristics;
-EXTERN int matrix_coefficients;
-EXTERN int display_horizontal_size;
-EXTERN int display_vertical_size;
-
-/* ISO/IEC 13818-2 section 6.2.3: picture_header() */
-EXTERN int temporal_reference;
-EXTERN int picture_coding_type;
-EXTERN int vbv_delay;
-EXTERN int full_pel_forward_vector;
-EXTERN int forward_f_code;
-EXTERN int full_pel_backward_vector;
-EXTERN int backward_f_code;
-
-
-/* ISO/IEC 13818-2 section 6.2.3.1: picture_coding_extension() header */
-EXTERN int f_code[2][2];
-EXTERN int intra_dc_precision;
-EXTERN int picture_structure;
-EXTERN int top_field_first;
-EXTERN int frame_pred_frame_dct;
-EXTERN int concealment_motion_vectors;
-
-EXTERN int intra_vlc_format;
-
-EXTERN int repeat_first_field;
-
-EXTERN int chroma_420_type;
-EXTERN int progressive_frame;
-EXTERN int composite_display_flag;
-EXTERN int v_axis;
-EXTERN int field_sequence;
-EXTERN int sub_carrier;
-EXTERN int burst_amplitude;
-EXTERN int sub_carrier_phase;
-
-
-
-/* ISO/IEC 13818-2 section 6.2.3.3: picture_display_extension() header */
-EXTERN int frame_center_horizontal_offset[3];
-EXTERN int frame_center_vertical_offset[3];
-
-
-
-/* ISO/IEC 13818-2 section 6.2.2.5: sequence_scalable_extension() header */
-EXTERN int layer_id;
-EXTERN int lower_layer_prediction_horizontal_size;
-EXTERN int lower_layer_prediction_vertical_size;
-EXTERN int horizontal_subsampling_factor_m;
-EXTERN int horizontal_subsampling_factor_n;
-EXTERN int vertical_subsampling_factor_m;
-EXTERN int vertical_subsampling_factor_n;
-
-
-/* ISO/IEC 13818-2 section 6.2.3.5: picture_spatial_scalable_extension() header */
-EXTERN int lower_layer_temporal_reference;
-EXTERN int lower_layer_horizontal_offset;
-EXTERN int lower_layer_vertical_offset;
-EXTERN int spatial_temporal_weight_code_table_index;
-EXTERN int lower_layer_progressive_frame;
-EXTERN int lower_layer_deinterlaced_field_select;
-
-
-
-
-
-
-/* ISO/IEC 13818-2 section 6.2.3.6: copyright_extension() header */
-EXTERN int copyright_flag;
-EXTERN int copyright_identifier;
-EXTERN int original_or_copy;
-EXTERN int copyright_number_1;
-EXTERN int copyright_number_2;
-EXTERN int copyright_number_3;
-
-/* ISO/IEC 13818-2 section 6.2.2.6: group_of_pictures_header() */
-EXTERN int drop_flag;
-EXTERN int hour;
-EXTERN int minute;
-EXTERN int sec;
-EXTERN int frame;
-EXTERN int closed_gop;
-EXTERN int broken_link;
-
-
-
-/* layer specific variables (needed for SNR and DP scalability) */
-EXTERN struct layer_data {
- /* bit input */
- int Infile;
- unsigned char Rdbfr[2048];
- unsigned char *Rdptr;
- unsigned char Inbfr[16];
- /* from mpeg2play */
- unsigned int Bfr;
- unsigned char *Rdmax;
- int Incnt;
- int Bitcnt;
- /* sequence header and quant_matrix_extension() */
- int intra_quantizer_matrix[64];
- int non_intra_quantizer_matrix[64];
- int chroma_intra_quantizer_matrix[64];
- int chroma_non_intra_quantizer_matrix[64];
-
- int load_intra_quantizer_matrix;
- int load_non_intra_quantizer_matrix;
- int load_chroma_intra_quantizer_matrix;
- int load_chroma_non_intra_quantizer_matrix;
-
- int MPEG2_Flag;
- /* sequence scalable extension */
- int scalable_mode;
- /* picture coding extension */
- int q_scale_type;
- int alternate_scan;
- /* picture spatial scalable extension */
- int pict_scal;
- /* slice/macroblock */
- int priority_breakpoint;
- int quantizer_scale;
- int intra_slice;
- short block[12][64];
-} base, enhan, *ld;
-
-
-
-#ifdef VERIFY
-EXTERN int verify_sequence_header;
-EXTERN int verify_group_of_pictures_header;
-EXTERN int verify_picture_header;
-EXTERN int verify_slice_header;
-EXTERN int verify_sequence_extension;
-EXTERN int verify_sequence_display_extension;
-EXTERN int verify_quant_matrix_extension;
-EXTERN int verify_sequence_scalable_extension;
-EXTERN int verify_picture_display_extension;
-EXTERN int verify_picture_coding_extension;
-EXTERN int verify_picture_spatial_scalable_extension;
-EXTERN int verify_picture_temporal_scalable_extension;
-EXTERN int verify_copyright_extension;
-#endif /* VERIFY */
-
-
-EXTERN int Decode_Layer;
-
-/* verify.c */
-#ifdef VERIFY
-void Check_Headers _ANSI_ARGS_((int Bitstream_Framenum, int Sequence_Framenum));
-void Clear_Verify_Headers _ANSI_ARGS_((void));
-#endif /* VERIFY */
-
-
-EXTERN int global_MBA;
-EXTERN int global_pic;
-EXTERN int True_Framenum;
-
-// PJ
-
-void gvideo_init(void);
-
-// Insertion/removal from display buffer
-
-// number of preallocated frames
-#define MAX_FRAMEBUF 20
-
-struct framebuf_struct {
- int n;
- WORD *f;
- struct framebuf_struct *next;
- struct framebuf_struct *prev;
-};
-
-void Initialize_framebuf(int sz);
-struct framebuf_struct *get_free_framebuf();
-void insert_frame(struct framebuf_struct *f);
-struct framebuf_struct *remove_frame();
-void give_back_framebuf(struct framebuf_struct *f);
-void init_jetcontrol(void);
-
-
-
-
Index: demos/branches/pj/mpeg2/jetctrl.c
===================================================================
--- demos/branches/pj/mpeg2/jetctrl.c (revision 1085)
+++ demos/branches/pj/mpeg2/jetctrl.c (nonexistent)
@@ -1,163 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: jetctrl.c,v 1.1.1.1 2002-09-02 09:37:44 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:44 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * this file is directly derived from the demos/jumpball/jetctrl.c .
- * I just added this controls to check when the system will become overloaded
- */
-
-#define WCET_JETDUMMY 200
-#define PERIOD_JETDUMMY 100000
-#define DUMMY_PID 1
-
-#define JET_DUMMY_WIDTH (CMD_WIDTH-370)
-#define JET_DUMMY_HEIGHT (CMD_HEIGHT-40)
-
-/* the point (x, y) is the top left corner */
-#define JET_DUMMY_X (TRACK_X1+360)
-#define JET_DUMMY_Y (TRACK_Y2+32)
-
-// from jetdummy in the auto demo
-#define SCREEN_WIDTH 800
-#define SCREEN_HEIGHT 600
-/* Track dimensions */
-#define TRACK_WIDTH 500
-#define TRACK_HEIGHT 500
-/* Track position */
-#define TRACK_X1 0
-#define TRACK_Y1 0
-#define TRACK_X2 TRACK_X1+TRACK_WIDTH-1
-#define TRACK_Y2 TRACK_Y1+TRACK_HEIGHT-1
-#define CMD_WIDTH TRACK_WIDTH
-#define CMD_HEIGHT (SCREEN_HEIGHT-TRACK_HEIGHT-3)
-
-// JetControl
-
-#include "kernel/func.h"
-#include "drivers/glib.h"
-
-/* useful colors... */
-int white;
-int black;
-int red;
-int lightgray;
-
-TASK jetdummy_task(void *arg)
-{
- TIME now_dummy, last_dummy, diff_dummy, slice;
- struct timespec now, last, diff;
- int x = 0;
- int height;
-
- NULL_TIMESPEC(&last);
- last_dummy = 0;
- for (;;) {
- task_nopreempt();
- jet_getstat(DUMMY_PID, NULL, NULL, NULL, &now_dummy);
- sys_gettime(&now);
- task_preempt();
-
- SUBTIMESPEC(&now, &last, &diff);
- slice = diff.tv_sec * 1000000 + diff.tv_nsec/1000;
- diff_dummy = now_dummy - last_dummy;
-
- height = (int)(JET_DUMMY_HEIGHT*((float)diff_dummy)/((float)slice));
-
- TIMESPEC_ASSIGN(&last, &now);
- last_dummy = now_dummy;
-
- grx_line(JET_DUMMY_X+x,JET_DUMMY_Y,
- JET_DUMMY_X+x,JET_DUMMY_Y+height ,black);
- grx_line(JET_DUMMY_X+x,JET_DUMMY_Y+height,
- JET_DUMMY_X+x,JET_DUMMY_Y+JET_DUMMY_HEIGHT,white);
- grx_line(JET_DUMMY_X+(x+1)%JET_DUMMY_WIDTH,JET_DUMMY_Y,
- JET_DUMMY_X+(x+1)%JET_DUMMY_WIDTH,JET_DUMMY_Y+JET_DUMMY_HEIGHT,255);
-
- x = (x+1)%JET_DUMMY_WIDTH;
-
- task_endcycle();
- }
-}
-
-void init_jetcontrol(void)
-{
- SOFT_TASK_MODEL m4;
-
- PID p4;
-
- /* useful colors ... */
- white = rgb16(255,255,255);
- black = rgb16(0,0,0);
- red = rgb16(255,0,0);
- lightgray = rgb16(128,128,128);
-
- /* scenario */
- grx_text("System load",
- JET_DUMMY_X+8, JET_DUMMY_Y-10, lightgray, black);
- grx_rect(JET_DUMMY_X-1, JET_DUMMY_Y-1,
- JET_DUMMY_X+JET_DUMMY_WIDTH, JET_DUMMY_Y+JET_DUMMY_HEIGHT+1, lightgray);
-
- grx_text("100%", JET_DUMMY_X-40, JET_DUMMY_Y, lightgray, black);
- grx_text(" 0%", JET_DUMMY_X-40, JET_DUMMY_Y+JET_DUMMY_HEIGHT-8, lightgray, black);
-
- grx_line(JET_DUMMY_X-1, JET_DUMMY_Y, JET_DUMMY_X-5, JET_DUMMY_Y, lightgray);
- grx_line(JET_DUMMY_X-1, JET_DUMMY_Y+JET_DUMMY_HEIGHT, JET_DUMMY_X-5, JET_DUMMY_Y+JET_DUMMY_HEIGHT, lightgray);
-
- /* jetdummy task */
- soft_task_default_model(m4);
- soft_task_def_period(m4, PERIOD_JETDUMMY);
- soft_task_def_met(m4, WCET_JETDUMMY);
- soft_task_def_usemath(m4);
- p4 = task_create("jdmy", jetdummy_task, &m4, NULL);
- if (p4 == -1) {
- grx_close();
- perror("Could not create task <jetdummy>");
- sys_end();
- }
- task_activate(p4);
-}
-
Index: demos/branches/pj/mpeg2/getblk.c
===================================================================
--- demos/branches/pj/mpeg2/getblk.c (revision 1085)
+++ demos/branches/pj/mpeg2/getblk.c (nonexistent)
@@ -1,570 +0,0 @@
-/* getblk.c, DCT block decoding */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-#include <stdio.h>
-
-#include "config.h"
-#include "global.h"
-
-
-/* defined in getvlc.h */
-typedef struct {
- char run, level, len;
-} DCTtab;
-
-extern DCTtab DCTtabfirst[],DCTtabnext[],DCTtab0[],DCTtab1[];
-extern DCTtab DCTtab2[],DCTtab3[],DCTtab4[],DCTtab5[],DCTtab6[];
-extern DCTtab DCTtab0a[],DCTtab1a[];
-
-
-/* decode one intra coded MPEG-1 block */
-
-void Decode_MPEG1_Intra_Block(comp,dc_dct_pred)
-int comp;
-int dc_dct_pred[];
-{
- int val, i, j, sign;
- unsigned int code;
- DCTtab *tab;
- short *bp;
-
- bp = ld->block[comp];
-
- /* ISO/IEC 11172-2 section 2.4.3.7: Block layer. */
- /* decode DC coefficients */
- if (comp<4)
- bp[0] = (dc_dct_pred[0]+=Get_Luma_DC_dct_diff()) << 3;
- else if (comp==4)
- bp[0] = (dc_dct_pred[1]+=Get_Chroma_DC_dct_diff()) << 3;
- else
- bp[0] = (dc_dct_pred[2]+=Get_Chroma_DC_dct_diff()) << 3;
-
- if (Fault_Flag) return;
-
- /* D-pictures do not contain AC coefficients */
- if(picture_coding_type == D_TYPE)
- return;
-
- /* decode AC coefficients */
- for (i=1; ; i++)
- {
- code = Show_Bits(16);
- if (code>=16384)
- tab = &DCTtabnext[(code>>12)-4];
- else if (code>=1024)
- tab = &DCTtab0[(code>>8)-4];
- else if (code>=512)
- tab = &DCTtab1[(code>>6)-8];
- else if (code>=256)
- tab = &DCTtab2[(code>>4)-16];
- else if (code>=128)
- tab = &DCTtab3[(code>>3)-16];
- else if (code>=64)
- tab = &DCTtab4[(code>>2)-16];
- else if (code>=32)
- tab = &DCTtab5[(code>>1)-16];
- else if (code>=16)
- tab = &DCTtab6[code-16];
- else
- {
- if (!Quiet_Flag)
- printf("invalid Huffman code in Decode_MPEG1_Intra_Block()\n");
- Fault_Flag = 1;
- return;
- }
-
- Flush_Buffer(tab->len);
-
- if (tab->run==64) /* end_of_block */
- return;
-
- if (tab->run==65) /* escape */
- {
- i+= Get_Bits(6);
-
- val = Get_Bits(8);
- if (val==0)
- val = Get_Bits(8);
- else if (val==128)
- val = Get_Bits(8) - 256;
- else if (val>128)
- val -= 256;
-
- if((sign = (val<0)))
- val = -val;
- }
- else
- {
- i+= tab->run;
- val = tab->level;
- sign = Get_Bits(1);
- }
-
- if (i>=64)
- {
- if (!Quiet_Flag)
- fprintf(stderr,"DCT coeff index (i) out of bounds (intra)\n");
- Fault_Flag = 1;
- return;
- }
-
- j = scan[ZIG_ZAG][i];
- val = (val*ld->quantizer_scale*ld->intra_quantizer_matrix[j]) >> 3;
-
- /* mismatch control ('oddification') */
- if (val!=0) /* should always be true, but it's not guaranteed */
- val = (val-1) | 1; /* equivalent to: if ((val&1)==0) val = val - 1; */
-
- /* saturation */
- if (!sign)
- bp[j] = (val>2047) ? 2047 : val; /* positive */
- else
- bp[j] = (val>2048) ? -2048 : -val; /* negative */
- }
-}
-
-
-/* decode one non-intra coded MPEG-1 block */
-
-void Decode_MPEG1_Non_Intra_Block(comp)
-int comp;
-{
- int val, i, j, sign;
- unsigned int code;
- DCTtab *tab;
- short *bp;
-
- bp = ld->block[comp];
-
- /* decode AC coefficients */
- for (i=0; ; i++)
- {
- code = Show_Bits(16);
- if (code>=16384)
- {
- if (i==0)
- tab = &DCTtabfirst[(code>>12)-4];
- else
- tab = &DCTtabnext[(code>>12)-4];
- }
- else if (code>=1024)
- tab = &DCTtab0[(code>>8)-4];
- else if (code>=512)
- tab = &DCTtab1[(code>>6)-8];
- else if (code>=256)
- tab = &DCTtab2[(code>>4)-16];
- else if (code>=128)
- tab = &DCTtab3[(code>>3)-16];
- else if (code>=64)
- tab = &DCTtab4[(code>>2)-16];
- else if (code>=32)
- tab = &DCTtab5[(code>>1)-16];
- else if (code>=16)
- tab = &DCTtab6[code-16];
- else
- {
- if (!Quiet_Flag)
- printf("invalid Huffman code in Decode_MPEG1_Non_Intra_Block()\n");
- Fault_Flag = 1;
- return;
- }
-
- Flush_Buffer(tab->len);
-
- if (tab->run==64) /* end_of_block */
- return;
-
- if (tab->run==65) /* escape */
- {
- i+= Get_Bits(6);
-
- val = Get_Bits(8);
- if (val==0)
- val = Get_Bits(8);
- else if (val==128)
- val = Get_Bits(8) - 256;
- else if (val>128)
- val -= 256;
-
- if((sign = (val<0)))
- val = -val;
- }
- else
- {
- i+= tab->run;
- val = tab->level;
- sign = Get_Bits(1);
- }
-
- if (i>=64)
- {
- if (!Quiet_Flag)
- fprintf(stderr,"DCT coeff index (i) out of bounds (inter)\n");
- Fault_Flag = 1;
- return;
- }
-
- j = scan[ZIG_ZAG][i];
- val = (((val<<1)+1)*ld->quantizer_scale*ld->non_intra_quantizer_matrix[j]) >> 4;
-
- /* mismatch control ('oddification') */
- if (val!=0) /* should always be true, but it's not guaranteed */
- val = (val-1) | 1; /* equivalent to: if ((val&1)==0) val = val - 1; */
-
- /* saturation */
- if (!sign)
- bp[j] = (val>2047) ? 2047 : val; /* positive */
- else
- bp[j] = (val>2048) ? -2048 : -val; /* negative */
- }
-}
-
-
-/* decode one intra coded MPEG-2 block */
-
-void Decode_MPEG2_Intra_Block(comp,dc_dct_pred)
-int comp;
-int dc_dct_pred[];
-{
- int val, i, j, sign, nc, cc, run;
- unsigned int code;
- DCTtab *tab;
- short *bp;
- int *qmat;
- struct layer_data *ld1;
-
- /* with data partitioning, data always goes to base layer */
- ld1 = (ld->scalable_mode==SC_DP) ? &base : ld;
- bp = ld1->block[comp];
-
- if (base.scalable_mode==SC_DP)
- if (base.priority_breakpoint<64)
- ld = &enhan;
- else
- ld = &base;
-
- cc = (comp<4) ? 0 : (comp&1)+1;
-
- qmat = (comp<4 || chroma_format==CHROMA420)
- ? ld1->intra_quantizer_matrix
- : ld1->chroma_intra_quantizer_matrix;
-
- /* ISO/IEC 13818-2 section 7.2.1: decode DC coefficients */
- if (cc==0)
- val = (dc_dct_pred[0]+= Get_Luma_DC_dct_diff());
- else if (cc==1)
- val = (dc_dct_pred[1]+= Get_Chroma_DC_dct_diff());
- else
- val = (dc_dct_pred[2]+= Get_Chroma_DC_dct_diff());
-
- if (Fault_Flag) return;
-
- bp[0] = val << (3-intra_dc_precision);
-
- nc=0;
-
-#ifdef TRACE
- if (Trace_Flag)
- printf("DCT(%d)i:",comp);
-#endif /* TRACE */
-
- /* decode AC coefficients */
- for (i=1; ; i++)
- {
- code = Show_Bits(16);
- if (code>=16384 && !intra_vlc_format)
- tab = &DCTtabnext[(code>>12)-4];
- else if (code>=1024)
- {
- if (intra_vlc_format)
- tab = &DCTtab0a[(code>>8)-4];
- else
- tab = &DCTtab0[(code>>8)-4];
- }
- else if (code>=512)
- {
- if (intra_vlc_format)
- tab = &DCTtab1a[(code>>6)-8];
- else
- tab = &DCTtab1[(code>>6)-8];
- }
- else if (code>=256)
- tab = &DCTtab2[(code>>4)-16];
- else if (code>=128)
- tab = &DCTtab3[(code>>3)-16];
- else if (code>=64)
- tab = &DCTtab4[(code>>2)-16];
- else if (code>=32)
- tab = &DCTtab5[(code>>1)-16];
- else if (code>=16)
- tab = &DCTtab6[code-16];
- else
- {
- if (!Quiet_Flag)
- printf("invalid Huffman code in Decode_MPEG2_Intra_Block()\n");
- Fault_Flag = 1;
- return;
- }
-
- Flush_Buffer(tab->len);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- printf(" (");
- Print_Bits(code,16,tab->len);
- }
-#endif /* TRACE */
-
- if (tab->run==64) /* end_of_block */
- {
-#ifdef TRACE
- if (Trace_Flag)
- printf("): EOB\n");
-#endif /* TRACE */
- return;
- }
-
- if (tab->run==65) /* escape */
- {
-#ifdef TRACE
- if (Trace_Flag)
- {
- putchar(' ');
- Print_Bits(Show_Bits(6),6,6);
- }
-#endif /* TRACE */
-
- i+= run = Get_Bits(6);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- putchar(' ');
- Print_Bits(Show_Bits(12),12,12);
- }
-#endif /* TRACE */
-
- val = Get_Bits(12);
- if ((val&2047)==0)
- {
- if (!Quiet_Flag)
- printf("invalid escape in Decode_MPEG2_Intra_Block()\n");
- Fault_Flag = 1;
- return;
- }
- if((sign = (val>=2048)))
- val = 4096 - val;
- }
- else
- {
- i+= run = tab->run;
- val = tab->level;
- sign = Get_Bits(1);
-
-#ifdef TRACE
- if (Trace_Flag)
- printf("%d",sign);
-#endif /* TRACE */
- }
-
- if (i>=64)
- {
- if (!Quiet_Flag)
- fprintf(stderr,"DCT coeff index (i) out of bounds (intra2)\n");
- Fault_Flag = 1;
- return;
- }
-
-#ifdef TRACE
- if (Trace_Flag)
- printf("): %d/%d",run,sign ? -val : val);
-#endif /* TRACE */
-
- j = scan[ld1->alternate_scan][i];
- val = (val * ld1->quantizer_scale * qmat[j]) >> 4;
- bp[j] = sign ? -val : val;
- nc++;
-
- if (base.scalable_mode==SC_DP && nc==base.priority_breakpoint-63)
- ld = &enhan;
- }
-}
-
-
-/* decode one non-intra coded MPEG-2 block */
-
-void Decode_MPEG2_Non_Intra_Block(comp)
-int comp;
-{
- int val, i, j, sign, nc, run;
- unsigned int code;
- DCTtab *tab;
- short *bp;
- int *qmat;
- struct layer_data *ld1;
-
- /* with data partitioning, data always goes to base layer */
- ld1 = (ld->scalable_mode==SC_DP) ? &base : ld;
- bp = ld1->block[comp];
-
- if (base.scalable_mode==SC_DP)
- if (base.priority_breakpoint<64)
- ld = &enhan;
- else
- ld = &base;
-
- qmat = (comp<4 || chroma_format==CHROMA420)
- ? ld1->non_intra_quantizer_matrix
- : ld1->chroma_non_intra_quantizer_matrix;
-
- nc = 0;
-
-#ifdef TRACE
- if (Trace_Flag)
- printf("DCT(%d)n:",comp);
-#endif /* TRACE */
-
- /* decode AC coefficients */
- for (i=0; ; i++)
- {
- code = Show_Bits(16);
- if (code>=16384)
- {
- if (i==0)
- tab = &DCTtabfirst[(code>>12)-4];
- else
- tab = &DCTtabnext[(code>>12)-4];
- }
- else if (code>=1024)
- tab = &DCTtab0[(code>>8)-4];
- else if (code>=512)
- tab = &DCTtab1[(code>>6)-8];
- else if (code>=256)
- tab = &DCTtab2[(code>>4)-16];
- else if (code>=128)
- tab = &DCTtab3[(code>>3)-16];
- else if (code>=64)
- tab = &DCTtab4[(code>>2)-16];
- else if (code>=32)
- tab = &DCTtab5[(code>>1)-16];
- else if (code>=16)
- tab = &DCTtab6[code-16];
- else
- {
- if (!Quiet_Flag)
- printf("invalid Huffman code in Decode_MPEG2_Non_Intra_Block()\n");
- Fault_Flag = 1;
- return;
- }
-
- Flush_Buffer(tab->len);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- printf(" (");
- Print_Bits(code,16,tab->len);
- }
-#endif /* TRACE */
-
- if (tab->run==64) /* end_of_block */
- {
-#ifdef TRACE
- if (Trace_Flag)
- printf("): EOB\n");
-#endif /* TRACE */
- return;
- }
-
- if (tab->run==65) /* escape */
- {
-#ifdef TRACE
- if (Trace_Flag)
- {
- putchar(' ');
- Print_Bits(Show_Bits(6),6,6);
- }
-#endif /* TRACE */
-
- i+= run = Get_Bits(6);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- putchar(' ');
- Print_Bits(Show_Bits(12),12,12);
- }
-#endif /* TRACE */
-
- val = Get_Bits(12);
- if ((val&2047)==0)
- {
- if (!Quiet_Flag)
- printf("invalid escape in Decode_MPEG2_Intra_Block()\n");
- Fault_Flag = 1;
- return;
- }
- if((sign = (val>=2048)))
- val = 4096 - val;
- }
- else
- {
- i+= run = tab->run;
- val = tab->level;
- sign = Get_Bits(1);
-
-#ifdef TRACE
- if (Trace_Flag)
- printf("%d",sign);
-#endif /* TRACE */
- }
-
- if (i>=64)
- {
- if (!Quiet_Flag)
- fprintf(stderr,"DCT coeff index (i) out of bounds (inter2)\n");
- Fault_Flag = 1;
- return;
- }
-
-#ifdef TRACE
- if (Trace_Flag)
- printf("): %d/%d",run,sign?-val:val);
-#endif /* TRACE */
-
- j = scan[ld1->alternate_scan][i];
- val = (((val<<1)+1) * ld1->quantizer_scale * qmat[j]) >> 5;
- bp[j] = sign ? -val : val;
- nc++;
-
- if (base.scalable_mode==SC_DP && nc==base.priority_breakpoint-63)
- ld = &enhan;
- }
-}
Index: demos/branches/pj/mpeg2/spatscal.c
===================================================================
--- demos/branches/pj/mpeg2/spatscal.c (revision 1085)
+++ demos/branches/pj/mpeg2/spatscal.c (nonexistent)
@@ -1,331 +0,0 @@
-
-#include <stdio.h>
-#include "config.h"
-#include "global.h"
-
-/* private prototypes */
-static void Read_Lower_Layer_Component_Framewise _ANSI_ARGS_((int comp, int lw, int lh));
-static void Read_Lower_Layer_Component_Fieldwise _ANSI_ARGS_((int comp, int lw, int lh));
-static void Make_Spatial_Prediction_Frame _ANSI_ARGS_((int progressive_frame,
- int llprogressive_frame, unsigned char *fld0, unsigned char *fld1,
- short *tmp, unsigned char *dst, int llx0, int lly0, int llw, int llh,
- int horizontal_size, int vertical_size, int vm, int vn, int hm, int hn,
- int aperture));
-static void Deinterlace _ANSI_ARGS_((unsigned char *fld0, unsigned char *fld1,
- int j0, int lx, int ly, int aperture));
-static void Subsample_Vertical _ANSI_ARGS_((unsigned char *s, short *d,
- int lx, int lys, int lyd, int m, int n, int j0, int dj));
-static void Subsample_Horizontal _ANSI_ARGS_((short *s, unsigned char *d,
- int x0, int lx, int lxs, int lxd, int ly, int m, int n));
-
-
-
-/* get reference frame */
-void Spatial_Prediction()
-{
-
- if(Frame_Store_Flag)
- {
- Read_Lower_Layer_Component_Framewise(0,lower_layer_prediction_horizontal_size,
- lower_layer_prediction_vertical_size); /* Y */
- Read_Lower_Layer_Component_Framewise(1,lower_layer_prediction_horizontal_size>>1,
- lower_layer_prediction_vertical_size>>1); /* Cb ("U") */
- Read_Lower_Layer_Component_Framewise(2,lower_layer_prediction_horizontal_size>>1,
- lower_layer_prediction_vertical_size>>1); /* Cr ("V") */
- }
- else
- {
- Read_Lower_Layer_Component_Fieldwise(0,lower_layer_prediction_horizontal_size,
- lower_layer_prediction_vertical_size); /* Y */
- Read_Lower_Layer_Component_Fieldwise(1,lower_layer_prediction_horizontal_size>>1,
- lower_layer_prediction_vertical_size>>1); /* Cb ("U") */
- Read_Lower_Layer_Component_Fieldwise(2,lower_layer_prediction_horizontal_size>>1,
- lower_layer_prediction_vertical_size>>1); /* Cr ("V") */
- }
-
-
- Make_Spatial_Prediction_Frame /* Y */
- (progressive_frame,lower_layer_progressive_frame,llframe0[0],llframe1[0],
- lltmp,current_frame[0],lower_layer_horizontal_offset,
- lower_layer_vertical_offset,
- lower_layer_prediction_horizontal_size,
- lower_layer_prediction_vertical_size,
- horizontal_size,vertical_size,vertical_subsampling_factor_m,
- vertical_subsampling_factor_n,horizontal_subsampling_factor_m,
- horizontal_subsampling_factor_n,
- picture_structure!=FRAME_PICTURE); /* this changed from CD to DIS */
-
- Make_Spatial_Prediction_Frame /* Cb */
- (progressive_frame,lower_layer_progressive_frame,llframe0[1],llframe1[1],
- lltmp,current_frame[1],lower_layer_horizontal_offset/2,
- lower_layer_vertical_offset/2,
- lower_layer_prediction_horizontal_size>>1,
- lower_layer_prediction_vertical_size>>1,
- horizontal_size>>1,vertical_size>>1,vertical_subsampling_factor_m,
- vertical_subsampling_factor_n,horizontal_subsampling_factor_m,
- horizontal_subsampling_factor_n,1);
-
- Make_Spatial_Prediction_Frame /* Cr */
- (progressive_frame,lower_layer_progressive_frame,llframe0[2],llframe1[2],
- lltmp,current_frame[2],lower_layer_horizontal_offset/2,
- lower_layer_vertical_offset/2,
- lower_layer_prediction_horizontal_size>>1,
- lower_layer_prediction_vertical_size>>1,
- horizontal_size>>1,vertical_size>>1,vertical_subsampling_factor_m,
- vertical_subsampling_factor_n,horizontal_subsampling_factor_m,
- horizontal_subsampling_factor_n,1);
-
-}
-
-static void Read_Lower_Layer_Component_Framewise(comp,lw,lh)
- int comp;
- int lw, lh;
-{
- FILE *fd;
- char fname[256];
- char ext[3][3] = {".Y",".U",".V"};
-/* char *ext = {".Y",".U",".V"}; */
- int i,j;
-
- sprintf(fname,Lower_Layer_Picture_Filename,True_Framenum);
- strcat(fname,ext[comp]);
-#ifdef VERBOSE
- if (Verbose_Flag>1)
- printf("reading %s\n",fname);
-#endif VERBOSE
- fd=fopen(fname,"rb");
- if (fd==NULL) sys_abort(-1); // PJ exit(-1);
- for (j=0; j<lh; j++) {
- for (i=0; i<lw; i++)
- llframe0[comp][lw*j+i]=getc(fd);
- if (! lower_layer_progressive_frame) {
- j++;
- for (i=0; i<lw; i++)
- llframe1[comp][lw*j+i]=getc(fd);
- }
- }
- fclose(fd);
-}
-
-
-static void Read_Lower_Layer_Component_Fieldwise(comp,lw,lh)
- int comp;
- int lw, lh;
-{
- FILE *fd;
- char fname[256];
- char ext[3][3] = {".Y",".U",".V"};
-/* char *ext = {".Y",".U",".V"}; */
- int i,j;
-
- sprintf(fname,Lower_Layer_Picture_Filename,True_Framenum,lower_layer_progressive_frame ? 'f':'a');
- strcat(fname,ext[comp]);
-#ifdef VERBOSE
- if (Verbose_Flag>1)
- printf("reading %s\n",fname);
-#endif VERBOSE
- fd=fopen(fname,"rb");
- if (fd==NULL) sys_abort(-1); // PJ exit(-1);
- for (j=0; j<lh; j+=lower_layer_progressive_frame?1:2)
- for (i=0; i<lw; i++)
- llframe0[comp][lw*j+i]=getc(fd);
- fclose(fd);
-
- if (! lower_layer_progressive_frame) {
- sprintf(fname,Lower_Layer_Picture_Filename,True_Framenum,'b');
- strcat(fname,ext[comp]);
-#ifdef VERBOSE
- if (Verbose_Flag>1)
- printf("reading %s\n",fname);
-#endif VERBOSE
- fd=fopen(fname,"rb");
- if (fd==NULL) sys_abort(-1); // PJ exit(-1);
- for (j=1; j<lh; j+=2)
- for (i=0; i<lw; i++)
- llframe1[comp][lw*j+i]=getc(fd);
- fclose(fd);
- }
-}
-
-
-/* form spatial prediction */
-static void Make_Spatial_Prediction_Frame(progressive_frame,
- llprogressive_frame,fld0,fld1,tmp,dst,llx0,lly0,llw,llh,horizontal_size,
- vertical_size,vm,vn,hm,hn,aperture)
-int progressive_frame,llprogressive_frame;
-unsigned char *fld0,*fld1;
-short *tmp;
-unsigned char *dst;
-int llx0,lly0,llw,llh,horizontal_size,vertical_size,vm,vn,hm,hn,aperture;
-{
- int w, h, x0, llw2, llh2;
-
- llw2 = (llw*hn)/hm;
- llh2 = (llh*vn)/vm;
-
- if (llprogressive_frame)
- {
- /* progressive -> progressive / interlaced */
- Subsample_Vertical(fld0,tmp,llw,llh,llh2,vm,vn,0,1);
- }
- else if (progressive_frame)
- {
- /* interlaced -> progressive */
- if (lower_layer_deinterlaced_field_select)
- {
- Deinterlace(fld1,fld0,0,llw,llh,aperture);
- Subsample_Vertical(fld1,tmp,llw,llh,llh2,vm,vn,0,1);
- }
- else
- {
- Deinterlace(fld0,fld1,1,llw,llh,aperture);
- Subsample_Vertical(fld0,tmp,llw,llh,llh2,vm,vn,0,1);
- }
- }
- else
- {
- /* interlaced -> interlaced */
- Deinterlace(fld0,fld1,1,llw,llh,aperture);
- Deinterlace(fld1,fld0,0,llw,llh,aperture);
- Subsample_Vertical(fld0,tmp,llw,llh,llh2,vm,vn,0,2);
- Subsample_Vertical(fld1,tmp,llw,llh,llh2,vm,vn,1,2);
- }
-
- /* vertical limits */
- if (lly0<0)
- {
- tmp-= llw*lly0;
- llh2+= lly0;
- if (llh2<0)
- llh2 = 0;
- h = (vertical_size<llh2) ? vertical_size : llh2;
- }
- else
- {
- dst+= horizontal_size*lly0;
- h= vertical_size - lly0;
- if (h>llh2)
- h = llh2;
- }
-
- /* horizontal limits */
- if (llx0<0)
- {
- x0 = -llx0;
- llw2+= llx0;
- if (llw2<0)
- llw2 = 0;
- w = (horizontal_size<llw2) ? horizontal_size : llw2;
- }
- else
- {
- dst+= llx0;
- x0 = 0;
- w = horizontal_size - llx0;
- if (w>llw2)
- w = llw2;
- }
-
- Subsample_Horizontal(tmp,dst,x0,w,llw,horizontal_size,h,hm,hn);
-}
-
-/* deinterlace one field (interpolate opposite parity samples)
- *
- * deinterlacing is done in-place: if j0=1, fld0 contains the input field in
- * its even lines and the odd lines are interpolated by this routine
- * if j0=0, the input field is in the odd lines and the even lines are
- * interpolated
- *
- * fld0: field to be deinterlaced
- * fld1: other field (referenced by the two field aperture filter)
- * j0: 0: interpolate even (top) lines, 1: interpolate odd (bottom) lines
- * lx: width of fld0 and fld1
- * ly: height of the deinterlaced field (has to be even)
- * aperture: 1: use one field aperture filter (two field otherwise)
- */
-static void Deinterlace(fld0,fld1,j0,lx,ly,aperture)
-unsigned char *fld0,*fld1;
-int j0,lx,ly; /* ly has to be even */
-int aperture;
-{
- int i,j,v;
- unsigned char *p0, *p0m1, *p0p1, *p1, *p1m2, *p1p2;
-
- /* deinterlace one field */
- for (j=j0; j<ly; j+=2)
- {
- p0 = fld0+lx*j;
- p0m1 = (j==0) ? p0+lx : p0-lx;
- p0p1 = (j==ly-1) ? p0-lx : p0+lx;
-
- if (aperture)
- for (i=0; i<lx; i++)
- p0[i] = (unsigned int)(p0m1[i] + p0p1[i] + 1)>>1;
- else
- {
- p1 = fld1 + lx*j;
- p1m2 = (j<2) ? p1 : p1-2*lx;
- p1p2 = (j>=ly-2) ? p1 : p1+2*lx;
- for (i=0; i<lx; i++)
- {
- v = 8*(p0m1[i]+p0p1[i]) + 2*p1[i] - p1m2[i] - p1p2[i];
- p0[i] = Clip[(v + ((v>=0) ? 8 : 7))>>4];
- }
- }
- }
-}
-
-/* vertical resampling */
-static void Subsample_Vertical(s,d,lx,lys,lyd,m,n,j0,dj)
-unsigned char *s;
-short *d;
-int lx, lys, lyd, m, n, j0, dj;
-{
- int i, j, c1, c2, jd;
- unsigned char *s1, *s2;
- short *d1;
-
- for (j=j0; j<lyd; j+=dj)
- {
- d1 = d + lx*j;
- jd = (j*m)/n;
- s1 = s + lx*jd;
- s2 = (jd<lys-1)? s1+lx : s1;
- c2 = (16*((j*m)%n) + (n>>1))/n;
- c1 = 16 - c2;
- for (i=0; i<lx; i++)
- d1[i] = c1*s1[i] + c2*s2[i];
- }
-}
-
-/* horizontal resampling */
-static void Subsample_Horizontal(s,d,x0,lx,lxs,lxd,ly,m,n)
-short *s;
-unsigned char *d;
-int x0, lx, lxs, lxd, ly, m, n;
-{
- int i, i1, j, id, c1, c2, v;
- short *s1, *s2;
- unsigned char *d1;
-
- for (i1=0; i1<lx; i1++)
- {
- d1 = d + i1;
- i = x0 + i1;
- id = (i*m)/n;
- s1 = s+id;
- s2 = (id<lxs-1) ? s1+1 : s1;
- c2 = (16*((i*m)%n) + (n>>1))/n;
- c1 = 16 - c2;
- for (j=0; j<ly; j++)
- {
- v = c1*(*s1) + c2*(*s2);
- *d1 = (v + ((v>=0) ? 128 : 127))>>8;
- d1+= lxd;
- s1+= lxs;
- s2+= lxs;
- }
- }
-}
-
-
Index: demos/branches/pj/mpeg2/readme
===================================================================
--- demos/branches/pj/mpeg2/readme (revision 1085)
+++ demos/branches/pj/mpeg2/readme (nonexistent)
@@ -1,72 +0,0 @@
-This is the S.Ha.R.K. porting of the MPEG2 decoder from the
-MPEG Software Simulation Group.
-
----------------------------------------------------------------------------
-
-The original source code is available on the web at
-http://www.mpeg.org
-
-The demo uses the FAT16 filesystem and the graphics card.
-I just added these files:
-- gvideo.c Video initialization and output
-- jetctrl.c Idle time visualization
-- makefile S.Ha.R.K. Makefile for the demo
-- store.c interface between the original decoder and S.Ha.R.K.
-
-The original makefile and store.c files has also been renamed to store.ori.
-
----------------------------------------------------------------------------
-
-The demo simply intercets the Write_Frame function and puts the decoded
-frame into a buffer. The task created in gvideo is a periodic CBS task
-that reads a picture from the buffer and simply displays it.
-
-===========================================================================
-
-This is the original readme file:
-
-
-January 9, 1995:
-=====
-Pre-release caveats:
-
- - has only been tested with gcc. (I'm not sure we will even bother
- with acc, or cc in the future).
-
- - I'm fully aware of the warnings received by -Wall
-
- - Verifier still not integrated (due to complexity), although
- experimental vbv_delay code included in verify.c
-
-
-
-December 20, 1995
-===============================================================
-Frame buffer substitution edition of decoder.
-
-Restrictions:
- - temporal_reference in bitstream must be correct.
-
- - substitute pictures must have pixel (luminance samples) width
- and height equal to coded_picture_width (mb_width*16) and
- coded_picture_height (mb_height*16) rather than horizontal_size
- and vertical_size, respectively.
-
- - all input pictures must be interleaved into a frame.
-
- - frame count (index) is based on absolute display frame order with
- no repeated (3:2 pulldown) fields or frames.
-
---------------------------------------------------------
-Notes:
-
- - command line arguements in this edition differ from verifier
- style. This decoder's arguments are the same as the
- public distribution's (July 4, 1994) code .
-
- please note that this code, with frame buffer substitution, when it
- is released will use the verifier style of arguments.
-
- - Carsten's updated spatial scalability decoder routines have been
- incorperated.
-
Index: demos/branches/pj/mpeg2/gvideo.c
===================================================================
--- demos/branches/pj/mpeg2/gvideo.c (revision 1085)
+++ demos/branches/pj/mpeg2/gvideo.c (nonexistent)
@@ -1,157 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- * Copyright (C) 1999 Luca Abeni and Massimiliano Giorgi
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * CVS : $Id: gvideo.c,v 1.1.1.1 2002-09-02 09:37:45 pj Exp $
- *
- * File: $File$
- * Revision: $Revision: 1.1.1.1 $
- * Last update: $Date: 2002-09-02 09:37:45 $
- */
-
-//#include "config.h"
-
-#include <kernel/func.h>
-#include <kernel/model.h>
-#include <kernel/const.h>
-
-#include <drivers/glib.h>
-
-#include <stdlib.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <fcntl.h>
-
-#include "config.h"
-#include "global.h"
-
-#define COLORFG rgb16(255,255,255)
-#define COLORBG rgb16(0,0,0)
-
-#define SP rgb16(0,128,0)
-#define FG rgb16(255,255,255)
-#define BG rgb16(0,0,0)
-
-/* border size (pixels) */
-#define BO 4
-
-
-//#define NOGRX
-
-/*
- *
- */
-
-
-void draw_frame(int x, int y, int dx, int dy)
-{
-#ifndef NOGRX
- grx_box(x-1-BO,y-1-BO,x+dx+BO,y+dy+BO,SP);
- grx_rect(x-1-BO,y-1-BO,x+dx+BO,y+dy+BO,FG);
- grx_box(x,y,x+dx-1,y+dy-1,BG);
- grx_rect(x-1,y-1,x+dx,y+dy,FG);
-#endif
-}
-
-static TASK play(void *arg)
-{
- int x1,y1,x2,y2;
- int moreframes;
- struct framebuf_struct *fbuf;
-
- x1=1;
- y1=1;
- x2=x1+Coded_Picture_Width-1;
- y2=y1+Coded_Picture_Height-1;
-
- moreframes=1;
- task_nopreempt();
-
- while (moreframes) {
- fbuf = remove_frame();
-#ifndef NOGRX
- // grxlock();
-// grx_rect(10,10,10+5*fbuf->n,10+5*fbuf->n,FG);
- grx_putimage(x1, y1, x2, y2, fbuf->f);
- // grxunlock();
-#else
- cprintf("(%d %d)\n",fbuf->n, fbuf->f);
-#endif
- give_back_framebuf(fbuf);
- task_endcycle();
- }
-
- return NULL;
-}
-
-void gvideo_init(void)
-{
- SOFT_TASK_MODEL model;
- PID pid;
- int period,wcet;
-
-#ifndef NOGRX
- grx_init();
- grx_setmode(grx_getmode(800, 600, 16));
-#endif
-
- // draw_frame(0, 0, CodedImageWidth,CodedImageHeight);
-
- srand(7);
-
- period=1000000/20;
- wcet=20000;
-
- soft_task_default_model(model);
- soft_task_def_met(model,wcet);
- soft_task_def_wcet(model,wcet);
- soft_task_def_period(model,period);
- soft_task_def_periodic(model);
- soft_task_def_ctrl_jet(model);
-
- pid=task_create("Video",play,&model,NULL);
- if (pid!=-1) task_activate(pid);
-}
-
-
-
-
-
-
-
-
Index: demos/branches/pj/mpeg2/gethdr.c
===================================================================
--- demos/branches/pj/mpeg2/gethdr.c (revision 1085)
+++ demos/branches/pj/mpeg2/gethdr.c (nonexistent)
@@ -1,1077 +0,0 @@
-/* gethdr.c, header decoding */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-#include <stdio.h>
-
-#include "config.h"
-#include "global.h"
-
-
-/* private prototypes */
-static void sequence_header _ANSI_ARGS_((void));
-static void group_of_pictures_header _ANSI_ARGS_((void));
-static void picture_header _ANSI_ARGS_((void));
-static void extension_and_user_data _ANSI_ARGS_((void));
-static void sequence_extension _ANSI_ARGS_((void));
-static void sequence_display_extension _ANSI_ARGS_((void));
-static void quant_matrix_extension _ANSI_ARGS_((void));
-static void sequence_scalable_extension _ANSI_ARGS_((void));
-static void picture_display_extension _ANSI_ARGS_((void));
-static void picture_coding_extension _ANSI_ARGS_((void));
-static void picture_spatial_scalable_extension _ANSI_ARGS_((void));
-static void picture_temporal_scalable_extension _ANSI_ARGS_((void));
-static int extra_bit_information _ANSI_ARGS_((void));
-static void copyright_extension _ANSI_ARGS_((void));
-static void user_data _ANSI_ARGS_((void));
-static void user_data _ANSI_ARGS_((void));
-
-
-
-
-/* introduced in September 1995 to assist spatial scalable decoding */
-static void Update_Temporal_Reference_Tacking_Data _ANSI_ARGS_((void));
-/* private variables */
-static int Temporal_Reference_Base = 0;
-static int True_Framenum_max = -1;
-static int Temporal_Reference_GOP_Reset = 0;
-
-#define RESERVED -1
-static double frame_rate_Table[16] =
-{
- 0.0,
- ((23.0*1000.0)/1001.0),
- 24.0,
- 25.0,
- ((30.0*1000.0)/1001.0),
- 30.0,
- 50.0,
- ((60.0*1000.0)/1001.0),
- 60.0,
-
- RESERVED,
- RESERVED,
- RESERVED,
- RESERVED,
- RESERVED,
- RESERVED,
- RESERVED
-};
-
-/*
- * decode headers from one input stream
- * until an End of Sequence or picture start code
- * is found
- */
-int Get_Hdr()
-{
- unsigned int code;
-
- for (;;)
- {
- /* look for next_start_code */
- next_start_code();
- code = Get_Bits32();
-
- switch (code)
- {
- case SEQUENCE_HEADER_CODE:
- sequence_header();
- break;
- case GROUP_START_CODE:
- group_of_pictures_header();
- break;
- case PICTURE_START_CODE:
- picture_header();
- return 1;
- break;
- case SEQUENCE_END_CODE:
- return 0;
- break;
- default:
- if (!Quiet_Flag)
- fprintf(stderr,"Unexpected next_start_code %08x (ignored)\n",code);
- break;
- }
- }
-}
-
-
-/* align to start of next next_start_code */
-
-void next_start_code()
-{
- /* byte align */
- Flush_Buffer(ld->Incnt&7);
- while (Show_Bits(24)!=0x01L)
- Flush_Buffer(8);
-}
-
-
-/* decode sequence header */
-
-static void sequence_header()
-{
- int i;
- int pos;
-
- pos = ld->Bitcnt;
- horizontal_size = Get_Bits(12);
- vertical_size = Get_Bits(12);
- aspect_ratio_information = Get_Bits(4);
- frame_rate_code = Get_Bits(4);
- bit_rate_value = Get_Bits(18);
- marker_bit("sequence_header()");
- vbv_buffer_size = Get_Bits(10);
- constrained_parameters_flag = Get_Bits(1);
-
- if((ld->load_intra_quantizer_matrix = Get_Bits(1)))
- {
- for (i=0; i<64; i++)
- ld->intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8);
- }
- else
- {
- for (i=0; i<64; i++)
- ld->intra_quantizer_matrix[i] = default_intra_quantizer_matrix[i];
- }
-
- if((ld->load_non_intra_quantizer_matrix = Get_Bits(1)))
- {
- for (i=0; i<64; i++)
- ld->non_intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8);
- }
- else
- {
- for (i=0; i<64; i++)
- ld->non_intra_quantizer_matrix[i] = 16;
- }
-
- /* copy luminance to chrominance matrices */
- for (i=0; i<64; i++)
- {
- ld->chroma_intra_quantizer_matrix[i] =
- ld->intra_quantizer_matrix[i];
-
- ld->chroma_non_intra_quantizer_matrix[i] =
- ld->non_intra_quantizer_matrix[i];
- }
-
-#ifdef VERBOSE
- if (Verbose_Flag > NO_LAYER)
- {
- printf("sequence header (byte %d)\n",(pos>>3)-4);
- if (Verbose_Flag > SEQUENCE_LAYER)
- {
- printf(" horizontal_size=%d\n",horizontal_size);
- printf(" vertical_size=%d\n",vertical_size);
- printf(" aspect_ratio_information=%d\n",aspect_ratio_information);
- printf(" frame_rate_code=%d",frame_rate_code);
- printf(" bit_rate_value=%d\n",bit_rate_value);
- printf(" vbv_buffer_size=%d\n",vbv_buffer_size);
- printf(" constrained_parameters_flag=%d\n",constrained_parameters_flag);
- printf(" load_intra_quantizer_matrix=%d\n",ld->load_intra_quantizer_matrix);
- printf(" load_non_intra_quantizer_matrix=%d\n",ld->load_non_intra_quantizer_matrix);
- }
- }
-#endif /* VERBOSE */
-
-#ifdef VERIFY
- verify_sequence_header++;
-#endif /* VERIFY */
-
- extension_and_user_data();
-}
-
-
-
-/* decode group of pictures header */
-/* ISO/IEC 13818-2 section 6.2.2.6 */
-static void group_of_pictures_header()
-{
- int pos;
-
- if (ld == &base)
- {
- Temporal_Reference_Base = True_Framenum_max + 1; /* *CH* */
- Temporal_Reference_GOP_Reset = 1;
- }
- pos = ld->Bitcnt;
- drop_flag = Get_Bits(1);
- hour = Get_Bits(5);
- minute = Get_Bits(6);
- marker_bit("group_of_pictures_header()");
- sec = Get_Bits(6);
- frame = Get_Bits(6);
- closed_gop = Get_Bits(1);
- broken_link = Get_Bits(1);
-
-#ifdef VERBOSE
- if (Verbose_Flag > NO_LAYER)
- {
- printf("group of pictures (byte %d)\n",(pos>>3)-4);
- if (Verbose_Flag > SEQUENCE_LAYER)
- {
- printf(" drop_flag=%d\n",drop_flag);
- printf(" timecode %d:%02d:%02d:%02d\n",hour,minute,sec,frame);
- printf(" closed_gop=%d\n",closed_gop);
- printf(" broken_link=%d\n",broken_link);
- }
- }
-#endif /* VERBOSE */
-
-#ifdef VERIFY
- verify_group_of_pictures_header++;
-#endif /* VERIFY */
-
- extension_and_user_data();
-
-}
-
-
-/* decode picture header */
-
-/* ISO/IEC 13818-2 section 6.2.3 */
-static void picture_header()
-{
- int pos;
- int Extra_Information_Byte_Count;
-
- /* unless later overwritten by picture_spatial_scalable_extension() */
- ld->pict_scal = 0;
-
- pos = ld->Bitcnt;
- temporal_reference = Get_Bits(10);
- picture_coding_type = Get_Bits(3);
- vbv_delay = Get_Bits(16);
-
- if (picture_coding_type==P_TYPE || picture_coding_type==B_TYPE)
- {
- full_pel_forward_vector = Get_Bits(1);
- forward_f_code = Get_Bits(3);
- }
- if (picture_coding_type==B_TYPE)
- {
- full_pel_backward_vector = Get_Bits(1);
- backward_f_code = Get_Bits(3);
- }
-
-#ifdef VERBOSE
- if (Verbose_Flag>NO_LAYER)
- {
- printf("picture header (byte %d)\n",(pos>>3)-4);
- if (Verbose_Flag>SEQUENCE_LAYER)
- {
- printf(" temporal_reference=%d\n",temporal_reference);
- printf(" picture_coding_type=%d\n",picture_coding_type);
- printf(" vbv_delay=%d\n",vbv_delay);
- if (picture_coding_type==P_TYPE || picture_coding_type==B_TYPE)
- {
- printf(" full_pel_forward_vector=%d\n",full_pel_forward_vector);
- printf(" forward_f_code =%d\n",forward_f_code);
- }
- if (picture_coding_type==B_TYPE)
- {
- printf(" full_pel_backward_vector=%d\n",full_pel_backward_vector);
- printf(" backward_f_code =%d\n",backward_f_code);
- }
- }
- }
-#endif /* VERBOSE */
-
-#ifdef VERIFY
- verify_picture_header++;
-#endif /* VERIFY */
-
- Extra_Information_Byte_Count =
- extra_bit_information();
-
- extension_and_user_data();
-
- /* update tracking information used to assist spatial scalability */
- Update_Temporal_Reference_Tacking_Data();
-}
-
-/* decode slice header */
-
-/* ISO/IEC 13818-2 section 6.2.4 */
-int slice_header()
-{
- int slice_vertical_position_extension;
- int quantizer_scale_code;
- int pos;
- int slice_picture_id_enable = 0;
- int slice_picture_id = 0;
- int extra_information_slice = 0;
-
- pos = ld->Bitcnt;
-
- slice_vertical_position_extension =
- (ld->MPEG2_Flag && vertical_size>2800) ? Get_Bits(3) : 0;
-
- if (ld->scalable_mode==SC_DP)
- ld->priority_breakpoint = Get_Bits(7);
-
- quantizer_scale_code = Get_Bits(5);
- ld->quantizer_scale =
- ld->MPEG2_Flag ? (ld->q_scale_type ? Non_Linear_quantizer_scale[quantizer_scale_code] : quantizer_scale_code<<1) : quantizer_scale_code;
-
- /* slice_id introduced in March 1995 as part of the video corridendum
- (after the IS was drafted in November 1994) */
- if (Get_Bits(1))
- {
- ld->intra_slice = Get_Bits(1);
-
- slice_picture_id_enable = Get_Bits(1);
- slice_picture_id = Get_Bits(6);
-
- extra_information_slice = extra_bit_information();
- }
- else
- ld->intra_slice = 0;
-
-#ifdef VERBOSE
- if (Verbose_Flag>PICTURE_LAYER)
- {
- printf("slice header (byte %d)\n",(pos>>3)-4);
- if (Verbose_Flag>SLICE_LAYER)
- {
- if (ld->MPEG2_Flag && vertical_size>2800)
- printf(" slice_vertical_position_extension=%d\n",slice_vertical_position_extension);
-
- if (ld->scalable_mode==SC_DP)
- printf(" priority_breakpoint=%d\n",ld->priority_breakpoint);
-
- printf(" quantizer_scale_code=%d\n",quantizer_scale_code);
-
- printf(" slice_picture_id_enable = %d\n", slice_picture_id_enable);
-
- if(slice_picture_id_enable)
- printf(" slice_picture_id = %d\n", slice_picture_id);
-
- }
- }
-#endif /* VERBOSE */
-
-#ifdef VERIFY
- verify_slice_header++;
-#endif /* VERIFY */
-
-
- return slice_vertical_position_extension;
-}
-
-
-/* decode extension and user data */
-/* ISO/IEC 13818-2 section 6.2.2.2 */
-static void extension_and_user_data()
-{
- int code,ext_ID;
-
- next_start_code();
-
- while ((code = Show_Bits(32))==EXTENSION_START_CODE || code==USER_DATA_START_CODE)
- {
- if (code==EXTENSION_START_CODE)
- {
- Flush_Buffer32();
- ext_ID = Get_Bits(4);
- switch (ext_ID)
- {
- case SEQUENCE_EXTENSION_ID:
- sequence_extension();
- break;
- case SEQUENCE_DISPLAY_EXTENSION_ID:
- sequence_display_extension();
- break;
- case QUANT_MATRIX_EXTENSION_ID:
- quant_matrix_extension();
- break;
- case SEQUENCE_SCALABLE_EXTENSION_ID:
- sequence_scalable_extension();
- break;
- case PICTURE_DISPLAY_EXTENSION_ID:
- picture_display_extension();
- break;
- case PICTURE_CODING_EXTENSION_ID:
- picture_coding_extension();
- break;
- case PICTURE_SPATIAL_SCALABLE_EXTENSION_ID:
- picture_spatial_scalable_extension();
- break;
- case PICTURE_TEMPORAL_SCALABLE_EXTENSION_ID:
- picture_temporal_scalable_extension();
- break;
- case COPYRIGHT_EXTENSION_ID:
- copyright_extension();
- break;
- default:
- fprintf(stderr,"reserved extension start code ID %d\n",ext_ID);
- break;
- }
- next_start_code();
- }
- else
- {
-#ifdef VERBOSE
- if (Verbose_Flag>NO_LAYER)
- printf("user data\n");
-#endif /* VERBOSE */
- Flush_Buffer32();
- user_data();
- }
- }
-}
-
-
-/* decode sequence extension */
-
-/* ISO/IEC 13818-2 section 6.2.2.3 */
-static void sequence_extension()
-{
- int horizontal_size_extension;
- int vertical_size_extension;
- int bit_rate_extension;
- int vbv_buffer_size_extension;
- int pos;
-
- /* derive bit position for trace */
-#ifdef VERBOSE
- pos = ld->Bitcnt;
-#endif
-
- ld->MPEG2_Flag = 1;
-
- ld->scalable_mode = SC_NONE; /* unless overwritten by sequence_scalable_extension() */
- layer_id = 0; /* unless overwritten by sequence_scalable_extension() */
-
- profile_and_level_indication = Get_Bits(8);
- progressive_sequence = Get_Bits(1);
- chroma_format = Get_Bits(2);
- horizontal_size_extension = Get_Bits(2);
- vertical_size_extension = Get_Bits(2);
- bit_rate_extension = Get_Bits(12);
- marker_bit("sequence_extension");
- vbv_buffer_size_extension = Get_Bits(8);
- low_delay = Get_Bits(1);
- frame_rate_extension_n = Get_Bits(2);
- frame_rate_extension_d = Get_Bits(5);
-
- frame_rate = frame_rate_Table[frame_rate_code] *
- ((frame_rate_extension_n+1)/(frame_rate_extension_d+1));
-
- /* special case for 422 profile & level must be made */
- if((profile_and_level_indication>>7) & 1)
- { /* escape bit of profile_and_level_indication set */
-
- /* 4:2:2 Profile @ Main Level */
- if((profile_and_level_indication&15)==5)
- {
- profile = PROFILE_422;
- level = MAIN_LEVEL;
- }
- }
- else
- {
- profile = profile_and_level_indication >> 4; /* Profile is upper nibble */
- level = profile_and_level_indication & 0xF; /* Level is lower nibble */
- }
-
-
- horizontal_size = (horizontal_size_extension<<12) | (horizontal_size&0x0fff);
- vertical_size = (vertical_size_extension<<12) | (vertical_size&0x0fff);
-
-
- /* ISO/IEC 13818-2 does not define bit_rate_value to be composed of
- * both the original bit_rate_value parsed in sequence_header() and
- * the optional bit_rate_extension in sequence_extension_header().
- * However, we use it for bitstream verification purposes.
- */
-
- bit_rate_value += (bit_rate_extension << 18);
- bit_rate = ((double) bit_rate_value) * 400.0;
- vbv_buffer_size += (vbv_buffer_size_extension << 10);
-
-#ifdef VERBOSE
- if (Verbose_Flag>NO_LAYER)
- {
- printf("sequence extension (byte %d)\n",(pos>>3)-4);
-
- if (Verbose_Flag>SEQUENCE_LAYER)
- {
- printf(" profile_and_level_indication=%d\n",profile_and_level_indication);
-
- if (profile_and_level_indication<128)
- {
- printf(" profile=%d, level=%d\n",profile,level);
- }
-
- printf(" progressive_sequence=%d\n",progressive_sequence);
- printf(" chroma_format=%d\n",chroma_format);
- printf(" horizontal_size_extension=%d\n",horizontal_size_extension);
- printf(" vertical_size_extension=%d\n",vertical_size_extension);
- printf(" bit_rate_extension=%d\n",bit_rate_extension);
- printf(" vbv_buffer_size_extension=%d\n",vbv_buffer_size_extension);
- printf(" low_delay=%d\n",low_delay);
- printf(" frame_rate_extension_n=%d\n",frame_rate_extension_n);
- printf(" frame_rate_extension_d=%d\n",frame_rate_extension_d);
- }
- }
-#endif /* VERBOSE */
-
-#ifdef VERIFY
- verify_sequence_extension++;
-#endif /* VERIFY */
-
-
-}
-
-
-/* decode sequence display extension */
-
-static void sequence_display_extension()
-{
- int pos;
-
- pos = ld->Bitcnt;
- video_format = Get_Bits(3);
- color_description = Get_Bits(1);
-
- if (color_description)
- {
- color_primaries = Get_Bits(8);
- transfer_characteristics = Get_Bits(8);
- matrix_coefficients = Get_Bits(8);
- }
-
- display_horizontal_size = Get_Bits(14);
- marker_bit("sequence_display_extension");
- display_vertical_size = Get_Bits(14);
-
-#ifdef VERBOSE
- if (Verbose_Flag>NO_LAYER)
- {
- printf("sequence display extension (byte %d)\n",(pos>>3)-4);
- if (Verbose_Flag>SEQUENCE_LAYER)
- {
-
- printf(" video_format=%d\n",video_format);
- printf(" color_description=%d\n",color_description);
-
- if (color_description)
- {
- printf(" color_primaries=%d\n",color_primaries);
- printf(" transfer_characteristics=%d\n",transfer_characteristics);
- printf(" matrix_coefficients=%d\n",matrix_coefficients);
- }
- printf(" display_horizontal_size=%d\n",display_horizontal_size);
- printf(" display_vertical_size=%d\n",display_vertical_size);
- }
- }
-#endif /* VERBOSE */
-
-#ifdef VERIFY
- verify_sequence_display_extension++;
-#endif /* VERIFY */
-
-}
-
-
-/* decode quant matrix entension */
-/* ISO/IEC 13818-2 section 6.2.3.2 */
-static void quant_matrix_extension()
-{
- int i;
- int pos;
-
- pos = ld->Bitcnt;
-
- if((ld->load_intra_quantizer_matrix = Get_Bits(1)))
- {
- for (i=0; i<64; i++)
- {
- ld->chroma_intra_quantizer_matrix[scan[ZIG_ZAG][i]]
- = ld->intra_quantizer_matrix[scan[ZIG_ZAG][i]]
- = Get_Bits(8);
- }
- }
-
- if((ld->load_non_intra_quantizer_matrix = Get_Bits(1)))
- {
- for (i=0; i<64; i++)
- {
- ld->chroma_non_intra_quantizer_matrix[scan[ZIG_ZAG][i]]
- = ld->non_intra_quantizer_matrix[scan[ZIG_ZAG][i]]
- = Get_Bits(8);
- }
- }
-
- if((ld->load_chroma_intra_quantizer_matrix = Get_Bits(1)))
- {
- for (i=0; i<64; i++)
- ld->chroma_intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8);
- }
-
- if((ld->load_chroma_non_intra_quantizer_matrix = Get_Bits(1)))
- {
- for (i=0; i<64; i++)
- ld->chroma_non_intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8);
- }
-
-#ifdef VERBOSE
- if (Verbose_Flag>NO_LAYER)
- {
- printf("quant matrix extension (byte %d)\n",(pos>>3)-4);
- printf(" load_intra_quantizer_matrix=%d\n",
- ld->load_intra_quantizer_matrix);
- printf(" load_non_intra_quantizer_matrix=%d\n",
- ld->load_non_intra_quantizer_matrix);
- printf(" load_chroma_intra_quantizer_matrix=%d\n",
- ld->load_chroma_intra_quantizer_matrix);
- printf(" load_chroma_non_intra_quantizer_matrix=%d\n",
- ld->load_chroma_non_intra_quantizer_matrix);
- }
-#endif /* VERBOSE */
-
-#ifdef VERIFY
- verify_quant_matrix_extension++;
-#endif /* VERIFY */
-
-}
-
-
-/* decode sequence scalable extension */
-/* ISO/IEC 13818-2 section 6.2.2.5 */
-static void sequence_scalable_extension()
-{
- int pos;
-
- pos = ld->Bitcnt;
-
- /* values (without the +1 offset) of scalable_mode are defined in
- Table 6-10 of ISO/IEC 13818-2 */
- ld->scalable_mode = Get_Bits(2) + 1; /* add 1 to make SC_DP != SC_NONE */
-
- layer_id = Get_Bits(4);
-
- if (ld->scalable_mode==SC_SPAT)
- {
- lower_layer_prediction_horizontal_size = Get_Bits(14);
- marker_bit("sequence_scalable_extension()");
- lower_layer_prediction_vertical_size = Get_Bits(14);
- horizontal_subsampling_factor_m = Get_Bits(5);
- horizontal_subsampling_factor_n = Get_Bits(5);
- vertical_subsampling_factor_m = Get_Bits(5);
- vertical_subsampling_factor_n = Get_Bits(5);
- }
-
- if (ld->scalable_mode==SC_TEMP)
- Error("temporal scalability not implemented\n");
-
-#ifdef VERBOSE
- if (Verbose_Flag>NO_LAYER)
- {
- printf("sequence scalable extension (byte %d)\n",(pos>>3)-4);
- if (Verbose_Flag>SEQUENCE_LAYER)
- {
- printf(" scalable_mode=%d\n",ld->scalable_mode-1);
- printf(" layer_id=%d\n",layer_id);
- if (ld->scalable_mode==SC_SPAT)
- {
- printf(" lower_layer_prediction_horiontal_size=%d\n",
- lower_layer_prediction_horizontal_size);
- printf(" lower_layer_prediction_vertical_size=%d\n",
- lower_layer_prediction_vertical_size);
- printf(" horizontal_subsampling_factor_m=%d\n",
- horizontal_subsampling_factor_m);
- printf(" horizontal_subsampling_factor_n=%d\n",
- horizontal_subsampling_factor_n);
- printf(" vertical_subsampling_factor_m=%d\n",
- vertical_subsampling_factor_m);
- printf(" vertical_subsampling_factor_n=%d\n",
- vertical_subsampling_factor_n);
- }
- }
- }
-#endif /* VERBOSE */
-
-#ifdef VERIFY
- verify_sequence_scalable_extension++;
-#endif /* VERIFY */
-
-}
-
-
-/* decode picture display extension */
-/* ISO/IEC 13818-2 section 6.2.3.3. */
-static void picture_display_extension()
-{
- int i;
- int number_of_frame_center_offsets;
- int pos;
-
- pos = ld->Bitcnt;
- /* based on ISO/IEC 13818-2 section 6.3.12
- (November 1994) Picture display extensions */
-
- /* derive number_of_frame_center_offsets */
- if(progressive_sequence)
- {
- if(repeat_first_field)
- {
- if(top_field_first)
- number_of_frame_center_offsets = 3;
- else
- number_of_frame_center_offsets = 2;
- }
- else
- {
- number_of_frame_center_offsets = 1;
- }
- }
- else
- {
- if(picture_structure!=FRAME_PICTURE)
- {
- number_of_frame_center_offsets = 1;
- }
- else
- {
- if(repeat_first_field)
- number_of_frame_center_offsets = 3;
- else
- number_of_frame_center_offsets = 2;
- }
- }
-
-
- /* now parse */
- for (i=0; i<number_of_frame_center_offsets; i++)
- {
- frame_center_horizontal_offset[i] = Get_Bits(16);
- marker_bit("picture_display_extension, first marker bit");
-
- frame_center_vertical_offset[i] = Get_Bits(16);
- marker_bit("picture_display_extension, second marker bit");
- }
-
-#ifdef VERBOSE
- if (Verbose_Flag>NO_LAYER)
- {
- printf("picture display extension (byte %d)\n",(pos>>3)-4);
- if (Verbose_Flag>SEQUENCE_LAYER)
- {
-
- for (i=0; i<number_of_frame_center_offsets; i++)
- {
- printf(" frame_center_horizontal_offset[%d]=%d\n",i,
- frame_center_horizontal_offset[i]);
- printf(" frame_center_vertical_offset[%d]=%d\n",i,
- frame_center_vertical_offset[i]);
- }
- }
- }
-#endif /* VERBOSE */
-
-#ifdef VERIFY
- verify_picture_display_extension++;
-#endif /* VERIFY */
-
-}
-
-
-/* decode picture coding extension */
-static void picture_coding_extension()
-{
- int pos;
-
- pos = ld->Bitcnt;
-
- f_code[0][0] = Get_Bits(4);
- f_code[0][1] = Get_Bits(4);
- f_code[1][0] = Get_Bits(4);
- f_code[1][1] = Get_Bits(4);
-
- intra_dc_precision = Get_Bits(2);
- picture_structure = Get_Bits(2);
- top_field_first = Get_Bits(1);
- frame_pred_frame_dct = Get_Bits(1);
- concealment_motion_vectors = Get_Bits(1);
- ld->q_scale_type = Get_Bits(1);
- intra_vlc_format = Get_Bits(1);
- ld->alternate_scan = Get_Bits(1);
- repeat_first_field = Get_Bits(1);
- chroma_420_type = Get_Bits(1);
- progressive_frame = Get_Bits(1);
- composite_display_flag = Get_Bits(1);
-
- if (composite_display_flag)
- {
- v_axis = Get_Bits(1);
- field_sequence = Get_Bits(3);
- sub_carrier = Get_Bits(1);
- burst_amplitude = Get_Bits(7);
- sub_carrier_phase = Get_Bits(8);
- }
-
-#ifdef VERBOSE
- if (Verbose_Flag>NO_LAYER)
- {
- printf("picture coding extension (byte %d)\n",(pos>>3)-4);
- if (Verbose_Flag>SEQUENCE_LAYER)
- {
- printf(" forward horizontal f_code=%d\n", f_code[0][0]);
- printf(" forward vertical f_code=%d\n", f_code[0][1]);
- printf(" backward horizontal f_code=%d\n", f_code[1][0]);
- printf(" backward_vertical f_code=%d\n", f_code[1][1]);
- printf(" intra_dc_precision=%d\n",intra_dc_precision);
- printf(" picture_structure=%d\n",picture_structure);
- printf(" top_field_first=%d\n",top_field_first);
- printf(" frame_pred_frame_dct=%d\n",frame_pred_frame_dct);
- printf(" concealment_motion_vectors=%d\n",concealment_motion_vectors);
- printf(" q_scale_type=%d\n",ld->q_scale_type);
- printf(" intra_vlc_format=%d\n",intra_vlc_format);
- printf(" alternate_scan=%d\n",ld->alternate_scan);
- printf(" repeat_first_field=%d\n",repeat_first_field);
- printf(" chroma_420_type=%d\n",chroma_420_type);
- printf(" progressive_frame=%d\n",progressive_frame);
- printf(" composite_display_flag=%d\n",composite_display_flag);
-
- if (composite_display_flag)
- {
- printf(" v_axis=%d\n",v_axis);
- printf(" field_sequence=%d\n",field_sequence);
- printf(" sub_carrier=%d\n",sub_carrier);
- printf(" burst_amplitude=%d\n",burst_amplitude);
- printf(" sub_carrier_phase=%d\n",sub_carrier_phase);
- }
- }
- }
-#endif /* VERBOSE */
-
-#ifdef VERIFY
- verify_picture_coding_extension++;
-#endif /* VERIFY */
-}
-
-
-/* decode picture spatial scalable extension */
-/* ISO/IEC 13818-2 section 6.2.3.5. */
-static void picture_spatial_scalable_extension()
-{
- int pos;
-
- pos = ld->Bitcnt;
-
- ld->pict_scal = 1; /* use spatial scalability in this picture */
-
- lower_layer_temporal_reference = Get_Bits(10);
- marker_bit("picture_spatial_scalable_extension(), first marker bit");
- lower_layer_horizontal_offset = Get_Bits(15);
- if (lower_layer_horizontal_offset>=16384)
- lower_layer_horizontal_offset-= 32768;
- marker_bit("picture_spatial_scalable_extension(), second marker bit");
- lower_layer_vertical_offset = Get_Bits(15);
- if (lower_layer_vertical_offset>=16384)
- lower_layer_vertical_offset-= 32768;
- spatial_temporal_weight_code_table_index = Get_Bits(2);
- lower_layer_progressive_frame = Get_Bits(1);
- lower_layer_deinterlaced_field_select = Get_Bits(1);
-
-#ifdef VERBOSE
- if (Verbose_Flag>NO_LAYER)
- {
- printf("picture spatial scalable extension (byte %d)\n",(pos>>3)-4);
- if (Verbose_Flag>SEQUENCE_LAYER)
- {
- printf(" lower_layer_temporal_reference=%d\n",lower_layer_temporal_reference);
- printf(" lower_layer_horizontal_offset=%d\n",lower_layer_horizontal_offset);
- printf(" lower_layer_vertical_offset=%d\n",lower_layer_vertical_offset);
- printf(" spatial_temporal_weight_code_table_index=%d\n",
- spatial_temporal_weight_code_table_index);
- printf(" lower_layer_progressive_frame=%d\n",lower_layer_progressive_frame);
- printf(" lower_layer_deinterlaced_field_select=%d\n",lower_layer_deinterlaced_field_select);
- }
- }
-#endif /* VERBOSE */
-
-#ifdef VERIFY
- verify_picture_spatial_scalable_extension++;
-#endif /* VERIFY */
-
-}
-
-
-/* decode picture temporal scalable extension
- *
- * not implemented
- */
-/* ISO/IEC 13818-2 section 6.2.3.4. */
-static void picture_temporal_scalable_extension()
-{
- Error("temporal scalability not supported\n");
-
-#ifdef VERIFY
- verify_picture_temporal_scalable_extension++;
-#endif /* VERIFY */
-}
-
-
-/* decode extra bit information */
-/* ISO/IEC 13818-2 section 6.2.3.4. */
-static int extra_bit_information()
-{
- int Byte_Count = 0;
-
- while (Get_Bits1())
- {
- Flush_Buffer(8);
- Byte_Count++;
- }
-
- return(Byte_Count);
-}
-
-
-
-/* ISO/IEC 13818-2 section 5.3 */
-/* Purpose: this function is mainly designed to aid in bitstream conformance
- testing. A simple Flush_Buffer(1) would do */
-void marker_bit(text)
-char *text;
-{
- int marker;
-
- marker = Get_Bits(1);
-
-#ifdef VERIFY
- if(!marker)
- printf("ERROR: %s--marker_bit set to 0",text);
-#endif
-}
-
-
-/* ISO/IEC 13818-2 sections 6.3.4.1 and 6.2.2.2.2 */
-static void user_data()
-{
- /* skip ahead to the next start code */
- next_start_code();
-}
-
-
-
-/* Copyright extension */
-/* ISO/IEC 13818-2 section 6.2.3.6. */
-/* (header added in November, 1994 to the IS document) */
-
-
-static void copyright_extension()
-{
- int pos;
- int reserved_data;
-
- pos = ld->Bitcnt;
-
-
- copyright_flag = Get_Bits(1);
- copyright_identifier = Get_Bits(8);
- original_or_copy = Get_Bits(1);
-
- /* reserved */
- reserved_data = Get_Bits(7);
-
- marker_bit("copyright_extension(), first marker bit");
- copyright_number_1 = Get_Bits(20);
- marker_bit("copyright_extension(), second marker bit");
- copyright_number_2 = Get_Bits(22);
- marker_bit("copyright_extension(), third marker bit");
- copyright_number_3 = Get_Bits(22);
-
- if(Verbose_Flag>NO_LAYER)
- {
- printf("copyright_extension (byte %d)\n",(pos>>3)-4);
- if (Verbose_Flag>SEQUENCE_LAYER)
- {
- printf(" copyright_flag =%d\n",copyright_flag);
-
- printf(" copyright_identifier=%d\n",copyright_identifier);
-
- printf(" original_or_copy = %d (original=1, copy=0)\n",
- original_or_copy);
-
- printf(" copyright_number_1=%d\n",copyright_number_1);
- printf(" copyright_number_2=%d\n",copyright_number_2);
- printf(" copyright_number_3=%d\n",copyright_number_3);
- }
- }
-
-#ifdef VERIFY
- verify_copyright_extension++;
-#endif /* VERIFY */
-}
-
-
-
-/* introduced in September 1995 to assist Spatial Scalability */
-static void Update_Temporal_Reference_Tacking_Data()
-{
- static int temporal_reference_wrap = 0;
- static int temporal_reference_old = 0;
-
- if (ld == &base) /* *CH* */
- {
- if (picture_coding_type!=B_TYPE && temporal_reference!=temporal_reference_old)
- /* check first field of */
- {
- /* non-B-frame */
- if (temporal_reference_wrap)
- {/* wrap occured at previous I- or P-frame */
- /* now all intervening B-frames which could
- still have high temporal_reference values are done */
- Temporal_Reference_Base += 1024;
- temporal_reference_wrap = 0;
- }
-
- /* distinguish from a reset */
- if (temporal_reference<temporal_reference_old && !Temporal_Reference_GOP_Reset)
- temporal_reference_wrap = 1; /* we must have just passed a GOP-Header! */
-
- temporal_reference_old = temporal_reference;
- Temporal_Reference_GOP_Reset = 0;
- }
-
- True_Framenum = Temporal_Reference_Base + temporal_reference;
-
- /* temporary wrap of TR at 1024 for M frames */
- if (temporal_reference_wrap && temporal_reference <= temporal_reference_old)
- True_Framenum += 1024;
-
- True_Framenum_max = (True_Framenum > True_Framenum_max) ?
- True_Framenum : True_Framenum_max;
- }
-}
Index: demos/branches/pj/mpeg2/idctref.c
===================================================================
--- demos/branches/pj/mpeg2/idctref.c (revision 1085)
+++ demos/branches/pj/mpeg2/idctref.c (nonexistent)
@@ -1,108 +0,0 @@
-/* Reference_IDCT.c, Inverse Discrete Fourier Transform, double precision */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-/* Perform IEEE 1180 reference (64-bit floating point, separable 8x1
- * direct matrix multiply) Inverse Discrete Cosine Transform
-*/
-
-
-/* Here we use math.h to generate constants. Compiler results may
- vary a little */
-
-#include <math.h>
-
-#include "config.h"
-
-#ifndef PI
-# ifdef M_PI
-# define PI M_PI
-# else
-# define PI 3.14159265358979323846
-# endif
-#endif
-
-/* global declarations */
-void Initialize_Fast_IDCTref _ANSI_ARGS_((void));
-void Reference_IDCT _ANSI_ARGS_((short *block));
-
-/* private data */
-
-/* cosine transform matrix for 8x1 IDCT */
-static double c[8][8];
-
-/* initialize DCT coefficient matrix */
-
-void Initialize_Reference_IDCT()
-{
- int freq, time;
- double scale;
-
- for (freq=0; freq < 8; freq++)
- {
- scale = (freq == 0) ? sqrt(0.125) : 0.5;
- for (time=0; time<8; time++)
- c[freq][time] = scale*cos((PI/8.0)*freq*(time + 0.5));
- }
-}
-
-/* perform IDCT matrix multiply for 8x8 coefficient block */
-
-void Reference_IDCT(block)
-short *block;
-{
- int i, j, k, v;
- double partial_product;
- double tmp[64];
-
- for (i=0; i<8; i++)
- for (j=0; j<8; j++)
- {
- partial_product = 0.0;
-
- for (k=0; k<8; k++)
- partial_product+= c[k][j]*block[8*i+k];
-
- tmp[8*i+j] = partial_product;
- }
-
- /* Transpose operation is integrated into address mapping by switching
- loop order of i and j */
-
- for (j=0; j<8; j++)
- for (i=0; i<8; i++)
- {
- partial_product = 0.0;
-
- for (k=0; k<8; k++)
- partial_product+= c[k][i]*tmp[8*k+j];
-
- v = (int) floor(partial_product+0.5);
- block[8*i+j] = (v<-256) ? -256 : ((v>255) ? 255 : v);
- }
-}
Index: demos/branches/pj/mpeg2/spatial.doc
===================================================================
--- demos/branches/pj/mpeg2/spatial.doc (revision 1085)
+++ demos/branches/pj/mpeg2/spatial.doc (nonexistent)
@@ -1,154 +0,0 @@
-The following changes have been made to debug spatial scalability:
-
-gethdr.c
---------
-
-Temporal_reference is used to compute the frame number of each frame,
-named true_framenum. The periodic reset at each GOP header as well as
-the wrap of temporal_reference at 1024 cause a base value
-temp_ref_base to be incremented accordingly.
-
-spatscal.c
-----------
-
-getspatref()
-
-A potential problem: Variable char fname[32] was dimensioned
-statically and too small.
-
-true_framenum is used instead of lower_layer_temporal_reference to
-determine the lower layer frame to be read for spatial prediction.
-
-The verification of lower_layer_temporal_reference is not possible
-since the temporal reference values that have been encoded into the
-base layer bitstream are not available to the enhancement layer
-decoder.
-
-Since there is no decoder timing information available, the rules on
-which frames can legally be used as spatial prediction frames cannot
-be checked.
-
-Lower layer frames are read field-wise or frame-wise, depending on the
-lower_layer_progressive_frame flag. Consistency between layers is
-checked since the file format for frame and field pictures differs.
-
-Note that the base layer decoder must not use the -f option to enforce
-frame-wise storage.
-
-Note further that only yuv image format (option -o0) is supported as
-input format.
-
-spatpred()
-
-The code for the various combinations of llprog_frame, llfieldsel and
-prog_frame has been completed and verified with the tceh_conf23
-bitstream that uses all permissive combinations.
-
-
-getpic.c
---------
-
-A small bug when storing an I- or P-frame: The prog_frame flag that
-the decoder knows when storing the oldrefframe belongs to the current
-refframe. Therefore the old value of the flag needs to be memorized.
-
-
-store.c
--------
-
-A potential problem: the filename variables char outname[32],
-tmpname[32] are statically dimensioned and quite small.
-
-
-The concept of time in this video decoder software
---------------------------------------------------
-
-When decoding a non-scalable bitstream, the frame number (i.e.
-temporal position) of the current I- or P-frame can be derived
-implicitly from the number of preceding B-frames after they have been
-decoded. Therefore the temporal_reference entry in the picture header
-is somewhat redundant and does not necessarily have to be evaluated in
-the decoding process.
-
-Decoding of the enhancement layer of a spatial scalable hierarchy,
-however, requires to know the temporal position of each frame at the
-instant when it is decoded, since data from a lower layer reference
-frame has to be incorporated.
-
-In the architecture of this video-only decoder decoding of a spatial
-scalable hierarchy of bitstreams is done by calling mpeg2decode once
-for the base layer bitstream and a second time for the enhancement
-layer bitstream, indicating where the decoded base layer frames can be
-found (option -s<filename>).
-
-Here the concept of time is only present in the form of frame numbers.
-Therefore spatial scalable bitstream hierarchies can only be handled
-under the assumption that base and enhancement layer bitstreams are
-decoded to image sequences where corresponding images of both layers
-have identical frame numbers.
-
-More specifically this means that base and enhancement layer
-bitstreams must contain video with the same frame rate. Furthermore
-only the temporally coincident frame of the base layer can be accessed
-for spatial prediction by the enhancement layer decoder, since it is
-not possible to resolve unambiguously the lower_layer_temporal_reference
-which is meant to further specify the lower layer reference frame.
-
-======================== SPATIAL.DOC ========================0
-
-Decoding a spatial scalable hierarchy of bitstreams
----------------------------------------------------
-
-With this video-only decoder decoding of a spatial scalable hierarchy
-of bitstreams is done by calling mpeg2decode once for the base layer
-bitstream and a second time for the enhancement layer bitstream,
-indicating where the decoded base layer frames can be found
-(using option -s and supplying <spatial base filename>).
-
-mpeg2decode -r -o0 base.mpg base%d%c
-mpeg2decode -r -o0 -f -s base%d%c enh.mpg enh%d
-
-Note that the base layer decoder must not use the -f option to enforce
-frame-wise storage.
-
-Note further that only yuv image format (option -o0) is supported as
-input format.
-
-
-Timing / layer synchronisation in this video decoder software
--------------------------------------------------------------
-
-When decoding a non-scalable bitstream, the frame number (i.e.
-temporal position) of the current I- or P-frame can be derived
-implicitly from the number of preceding B-frames after they have been
-decoded. Therefore the temporal_reference entry in the picture header
-is somewhat redundant and does not necessarily have to be evaluated in
-the decoding process.
-
-Decoding of the enhancement layer of a spatial scalable hierarchy,
-however, requires to know the temporal position of each frame at the
-instant when it is decoded, since data from a lower layer reference
-frame has to be incorporated.
-
-The concept of time is only present in the form of frame numbers.
-Therefore spatial scalable bitstream hierarchies can only be handled
-under the assumption that base and enhancement layer bitstreams are
-decoded to image sequences where corresponding images of both layers
-have identical frame numbers.
-
-More specifically this means that base and enhancement layer
-bitstreams must contain video with the same frame rate. Furthermore
-only the temporally coincident frame of the base layer can be accessed
-for spatial prediction by the enhancement layer decoder, since it is
-not possible to resolve unambiguously the lower_layer_temporal_reference
-which is meant to further specify the lower layer reference frame.
-
-Lower layer frames are read field-wise or frame-wise, depending on the
-lower_layer_progressive_frame flag. Consistency between layers in this
-respect is checked since the file format for frame and field pictures
-differs.
-
-
-
-
-
Index: demos/branches/pj/mpeg2/idct.c
===================================================================
--- demos/branches/pj/mpeg2/idct.c (revision 1085)
+++ demos/branches/pj/mpeg2/idct.c (nonexistent)
@@ -1,211 +0,0 @@
-/* idct.c, inverse fast discrete cosine transform */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-/**********************************************************/
-/* inverse two dimensional DCT, Chen-Wang algorithm */
-/* (cf. IEEE ASSP-32, pp. 803-816, Aug. 1984) */
-/* 32-bit integer arithmetic (8 bit coefficients) */
-/* 11 mults, 29 adds per DCT */
-/* sE, 18.8.91 */
-/**********************************************************/
-/* coefficients extended to 12 bit for IEEE1180-1990 */
-/* compliance sE, 2.1.94 */
-/**********************************************************/
-
-/* this code assumes >> to be a two's-complement arithmetic */
-/* right shift: (-2)>>1 == -1 , (-3)>>1 == -2 */
-
-#include "config.h"
-
-#define W1 2841 /* 2048*sqrt(2)*cos(1*pi/16) */
-#define W2 2676 /* 2048*sqrt(2)*cos(2*pi/16) */
-#define W3 2408 /* 2048*sqrt(2)*cos(3*pi/16) */
-#define W5 1609 /* 2048*sqrt(2)*cos(5*pi/16) */
-#define W6 1108 /* 2048*sqrt(2)*cos(6*pi/16) */
-#define W7 565 /* 2048*sqrt(2)*cos(7*pi/16) */
-
-/* global declarations */
-void Initialize_Fast_IDCT _ANSI_ARGS_((void));
-void Fast_IDCT _ANSI_ARGS_((short *block));
-
-/* private data */
-static short iclip[1024]; /* clipping table */
-static short *iclp;
-
-/* private prototypes */
-static void idctrow _ANSI_ARGS_((short *blk));
-static void idctcol _ANSI_ARGS_((short *blk));
-
-/* row (horizontal) IDCT
- *
- * 7 pi 1
- * dst[k] = sum c[l] * src[l] * cos( -- * ( k + - ) * l )
- * l=0 8 2
- *
- * where: c[0] = 128
- * c[1..7] = 128*sqrt(2)
- */
-
-static void idctrow(blk)
-short *blk;
-{
- int x0, x1, x2, x3, x4, x5, x6, x7, x8;
-
- /* shortcut */
- if (!((x1 = blk[4]<<11) | (x2 = blk[6]) | (x3 = blk[2]) |
- (x4 = blk[1]) | (x5 = blk[7]) | (x6 = blk[5]) | (x7 = blk[3])))
- {
- blk[0]=blk[1]=blk[2]=blk[3]=blk[4]=blk[5]=blk[6]=blk[7]=blk[0]<<3;
- return;
- }
-
- x0 = (blk[0]<<11) + 128; /* for proper rounding in the fourth stage */
-
- /* first stage */
- x8 = W7*(x4+x5);
- x4 = x8 + (W1-W7)*x4;
- x5 = x8 - (W1+W7)*x5;
- x8 = W3*(x6+x7);
- x6 = x8 - (W3-W5)*x6;
- x7 = x8 - (W3+W5)*x7;
-
- /* second stage */
- x8 = x0 + x1;
- x0 -= x1;
- x1 = W6*(x3+x2);
- x2 = x1 - (W2+W6)*x2;
- x3 = x1 + (W2-W6)*x3;
- x1 = x4 + x6;
- x4 -= x6;
- x6 = x5 + x7;
- x5 -= x7;
-
- /* third stage */
- x7 = x8 + x3;
- x8 -= x3;
- x3 = x0 + x2;
- x0 -= x2;
- x2 = (181*(x4+x5)+128)>>8;
- x4 = (181*(x4-x5)+128)>>8;
-
- /* fourth stage */
- blk[0] = (x7+x1)>>8;
- blk[1] = (x3+x2)>>8;
- blk[2] = (x0+x4)>>8;
- blk[3] = (x8+x6)>>8;
- blk[4] = (x8-x6)>>8;
- blk[5] = (x0-x4)>>8;
- blk[6] = (x3-x2)>>8;
- blk[7] = (x7-x1)>>8;
-}
-
-/* column (vertical) IDCT
- *
- * 7 pi 1
- * dst[8*k] = sum c[l] * src[8*l] * cos( -- * ( k + - ) * l )
- * l=0 8 2
- *
- * where: c[0] = 1/1024
- * c[1..7] = (1/1024)*sqrt(2)
- */
-static void idctcol(blk)
-short *blk;
-{
- int x0, x1, x2, x3, x4, x5, x6, x7, x8;
-
- /* shortcut */
- if (!((x1 = (blk[8*4]<<8)) | (x2 = blk[8*6]) | (x3 = blk[8*2]) |
- (x4 = blk[8*1]) | (x5 = blk[8*7]) | (x6 = blk[8*5]) | (x7 = blk[8*3])))
- {
- blk[8*0]=blk[8*1]=blk[8*2]=blk[8*3]=blk[8*4]=blk[8*5]=blk[8*6]=blk[8*7]=
- iclp[(blk[8*0]+32)>>6];
- return;
- }
-
- x0 = (blk[8*0]<<8) + 8192;
-
- /* first stage */
- x8 = W7*(x4+x5) + 4;
- x4 = (x8+(W1-W7)*x4)>>3;
- x5 = (x8-(W1+W7)*x5)>>3;
- x8 = W3*(x6+x7) + 4;
- x6 = (x8-(W3-W5)*x6)>>3;
- x7 = (x8-(W3+W5)*x7)>>3;
-
- /* second stage */
- x8 = x0 + x1;
- x0 -= x1;
- x1 = W6*(x3+x2) + 4;
- x2 = (x1-(W2+W6)*x2)>>3;
- x3 = (x1+(W2-W6)*x3)>>3;
- x1 = x4 + x6;
- x4 -= x6;
- x6 = x5 + x7;
- x5 -= x7;
-
- /* third stage */
- x7 = x8 + x3;
- x8 -= x3;
- x3 = x0 + x2;
- x0 -= x2;
- x2 = (181*(x4+x5)+128)>>8;
- x4 = (181*(x4-x5)+128)>>8;
-
- /* fourth stage */
- blk[8*0] = iclp[(x7+x1)>>14];
- blk[8*1] = iclp[(x3+x2)>>14];
- blk[8*2] = iclp[(x0+x4)>>14];
- blk[8*3] = iclp[(x8+x6)>>14];
- blk[8*4] = iclp[(x8-x6)>>14];
- blk[8*5] = iclp[(x0-x4)>>14];
- blk[8*6] = iclp[(x3-x2)>>14];
- blk[8*7] = iclp[(x7-x1)>>14];
-}
-
-/* two dimensional inverse discrete cosine transform */
-void Fast_IDCT(block)
-short *block;
-{
- int i;
-
- for (i=0; i<8; i++)
- idctrow(block+8*i);
-
- for (i=0; i<8; i++)
- idctcol(block+i);
-}
-
-void Initialize_Fast_IDCT()
-{
- int i;
-
- iclp = iclip+512;
- for (i= -512; i<512; i++)
- iclp[i] = (i<-256) ? -256 : ((i>255) ? 255 : i);
-}
Index: demos/branches/pj/mpeg2/todo
===================================================================
--- demos/branches/pj/mpeg2/todo (revision 1085)
+++ demos/branches/pj/mpeg2/todo (nonexistent)
@@ -1,73 +0,0 @@
- 1. Test bitstream
- Small example bitstream (128x128 pixel dimensions) which employs all
- picture_structure (top field, bottom field, frame), picture_coding_type
- (I, P, and B), macroblock_type (forwards/backwards/interpolated,
- intra/non-intra, coded/not-coded, quant/no quant, etc.), and
- motion_type (field, frame, 16X8, dual prime) modes.
-
- 2. add trace printing for mpeg1 getblk routines.
-
- 3. modify getsys.c to parse program layer bitstreams (Systems)
- with variable-length packets.
-
- 4. 24 bit X11 display
- (borrow from Berkeley or find way for our code to use their interface)
-
- 5. MPEG-2 Transport layer systems streams parsing
-
- 6. Document IPR issue
-
- provide CableLabs URL
- how IPR relates to our disclaimer.
-
- 7. TIFF library support (YCbCr 4:4:4, 4:2:2, and 4:2:0 pictures)
-[deferred]
-
-10. IDCT rounding
- As per IDCT corridgendum (Savatier, MPEG 95/XXX)
- [done, but verified ?]
-
-
-12. green dots in can
- [ appears to be a display issue, probably related to convmat[]
- error ]
-
-19. move Dual_Prime calculation into picture_data()
-
-20. motion vector calculation to include tappable stages to test
- whether elements fall within [low:high] range.
-
-21. Integrate verifier routines
-
-22. Inter-layer verification routines
- - check base and enhancement layers (e.g. SNR)
-
-23. Spatial verification
- - considering that no base layer is available.
-
-24. SNR verification
- [ done ]
-
-25. DP verification
- [ not done. No longer any bitstreams with Data Partitioning distributed
- since DP is not part of any official Profile ]
-
-26. merge all global bitsteam element variables into
- common data structure (similar to layer_data). This is needed
- for the verifier (whether or not headers in SNR and DP streams
- are identical where needed to that of the base layer).
-
-27. investigate why MS-DOS wants an extra % sign for filename patterns
- when more than one filename pattern is used in the command line argument
-
-28. convert -t (trace) flag into levels, merge with Verbose.
-
-29. seek to a specified frame number (support for MCI-like functions)
-
-30. document the "flash" VLC table decoding method in detail.
- (namely how to map tables in Annex B to those in getvlc.h)
-
-31. MPEG-2 program stream compatibility
- (a few minor bits of difference in the system header ).
-
---------
Index: demos/branches/pj/mpeg2/makefile.ori
===================================================================
--- demos/branches/pj/mpeg2/makefile.ori (revision 1085)
+++ demos/branches/pj/mpeg2/makefile.ori (nonexistent)
@@ -1,98 +0,0 @@
-# Makefile for mpeg2decode
-
-# Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved.
-
-#
-# Disclaimer of Warranty
-#
-# These software programs are available to the user without any license fee or
-# royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
-# any and all warranties, whether express, implied, or statuary, including any
-# implied warranties or merchantability or of fitness for a particular
-# purpose. In no event shall the copyright-holder be liable for any
-# incidental, punitive, or consequential damages of any kind whatsoever
-# arising from the use of these programs.
-#
-# This disclaimer of warranty extends to the user of these programs and user's
-# customers, employees, agents, transferees, successors, and assigns.
-#
-# The MPEG Software Simulation Group does not represent or warrant that the
-# programs furnished hereunder are free of infringement of any third-party
-# patents.
-#
-# Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
-# are subject to royalty fees to patent holders. Many of these patents are
-# general enough such that they are unavoidable regardless of implementation
-# design.
-#
-#
-
-#WARNINGS = -Wall
-#VERIFY = -DVERIFY
-
-#disable this flag if you do not want bitstream element tracing
-#this will speed up the decoder some since it does not have to test
-#the trace flag at several critical inner loop locations.
-TRACE = -DTRACE
-
-#disable this flag if you do not need verbose trace, such as
-#header information
-VERBOSE = -DVERBOSE
-
-# uncomment the following two lines if you want to include X11 support
-
-#USE_DISP = -DDISPLAY
-#LIBS = -lX11
-
-# uncomment the following two lines if you want to use shared memory
-# (faster display if server and client run on the same machine)
-
-#USE_SHMEM = -DSH_MEM
-#LIBS = -lXext -lX11
-
-# if your X11 include files / libraries are in a non standard location:
-# set INCLUDEDIR to -I followed by the appropriate include file path and
-# set LIBRARYDIR to -L followed by the appropriate library path and
-
-#INCLUDEDIR = -I/usr/openwin/include
-#LIBRARYDIR = -L/usr/openwin/lib
-
-#
-# GNU gcc
-#
-CC = gcc
-CFLAGS = -O2 $(USE_DISP) $(USE_SHMEM) $(INCLUDEDIR) $(TRACE) $(VERBOSE) $(VERIFY) $(WARNINGS)
-
-OBJ = mpeg2dec.o getpic.o motion.o getvlc.o gethdr.o getblk.o getbits.o store.o recon.o spatscal.o idct.o idctref.o display.o systems.o subspic.o verify.o
-
-all: mpeg2decode
-
-pc: mpeg2dec.exe
-
-clean:
- rm -f *.o *% core mpeg2decode
-
-mpeg2dec.exe: mpeg2decode
- coff2exe mpeg2dec
-
-mpeg2decode: $(OBJ)
- $(CC) $(CFLAGS) $(LIBRARYDIR) -o mpeg2decode $(OBJ) -lm $(LIBS)
-
-display.o : display.c config.h global.h mpeg2dec.h
-getbits.o : getbits.c config.h global.h mpeg2dec.h
-getblk.o : getblk.c config.h global.h mpeg2dec.h
-gethdr.o : gethdr.c config.h global.h mpeg2dec.h
-getpic.o : getpic.c config.h global.h mpeg2dec.h
-getvlc.o : getvlc.c config.h global.h mpeg2dec.h getvlc.h
-idct.o : idct.c config.h
-idctref.o : idctref.c config.h
-motion.o : motion.c config.h global.h mpeg2dec.h
-mpeg2dec.o : mpeg2dec.c config.h global.h mpeg2dec.h
-recon.o : recon.c config.h global.h mpeg2dec.h
-spatscal.o : spatscal.c config.h global.h mpeg2dec.h
-store.o : store.c config.h global.h mpeg2dec.h
-
-# additions since July 4, 1994 edition
-systems.o : systems.c config.h global.h mpeg2dec.h
-subspic.o : subspic.c config.h global.h mpeg2dec.h
-verify.o: verify.c config.h global.h mpeg2dec.h
Index: demos/branches/pj/mpeg2/getvlc.c
===================================================================
--- demos/branches/pj/mpeg2/getvlc.c (revision 1085)
+++ demos/branches/pj/mpeg2/getvlc.c (nonexistent)
@@ -1,799 +0,0 @@
-/* getvlc.c, variable length decoding */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-#include <stdio.h>
-
-#include "config.h"
-#include "global.h"
-#include "getvlc.h"
-
-/* private prototypes */
-/* generic picture macroblock type processing functions */
-static int Get_I_macroblock_type _ANSI_ARGS_((void));
-static int Get_P_macroblock_type _ANSI_ARGS_((void));
-static int Get_B_macroblock_type _ANSI_ARGS_((void));
-static int Get_D_macroblock_type _ANSI_ARGS_((void));
-
-/* spatial picture macroblock type processing functions */
-static int Get_I_Spatial_macroblock_type _ANSI_ARGS_((void));
-static int Get_P_Spatial_macroblock_type _ANSI_ARGS_((void));
-static int Get_B_Spatial_macroblock_type _ANSI_ARGS_((void));
-static int Get_SNR_macroblock_type _ANSI_ARGS_((void));
-
-int Get_macroblock_type()
-{
- int macroblock_type = 0;
-
- if (ld->scalable_mode==SC_SNR)
- macroblock_type = Get_SNR_macroblock_type();
- else
- {
- switch (picture_coding_type)
- {
- case I_TYPE:
- macroblock_type = ld->pict_scal ? Get_I_Spatial_macroblock_type() : Get_I_macroblock_type();
- break;
- case P_TYPE:
- macroblock_type = ld->pict_scal ? Get_P_Spatial_macroblock_type() : Get_P_macroblock_type();
- break;
- case B_TYPE:
- macroblock_type = ld->pict_scal ? Get_B_Spatial_macroblock_type() : Get_B_macroblock_type();
- break;
- case D_TYPE:
- macroblock_type = Get_D_macroblock_type();
- break;
- default:
- printf("Get_macroblock_type(): unrecognized picture coding type\n");
- break;
- }
- }
-
- return macroblock_type;
-}
-
-static int Get_I_macroblock_type()
-{
-#ifdef TRACE
- if (Trace_Flag)
- printf("macroblock_type(I) ");
-#endif /* TRACE */
-
- if (Get_Bits1())
- {
-#ifdef TRACE
- if (Trace_Flag)
- printf("(1): Intra (1)\n");
-#endif /* TRACE */
- return 1;
- }
-
- if (!Get_Bits1())
- {
- if (!Quiet_Flag)
- printf("Invalid macroblock_type code\n");
- Fault_Flag = 1;
- }
-
-#ifdef TRACE
- if (Trace_Flag)
- printf("(01): Intra, Quant (17)\n");
-#endif /* TRACE */
-
- return 17;
-}
-
-static char *MBdescr[]={
- "", "Intra", "No MC, Coded", "",
- "Bwd, Not Coded", "", "Bwd, Coded", "",
- "Fwd, Not Coded", "", "Fwd, Coded", "",
- "Interp, Not Coded", "", "Interp, Coded", "",
- "", "Intra, Quant", "No MC, Coded, Quant", "",
- "", "", "Bwd, Coded, Quant", "",
- "", "", "Fwd, Coded, Quant", "",
- "", "", "Interp, Coded, Quant", ""
-};
-
-static int Get_P_macroblock_type()
-{
- int code;
-
-#ifdef TRACE
- if (Trace_Flag)
- printf("macroblock_type(P) (");
-#endif /* TRACE */
-
- if ((code = Show_Bits(6))>=8)
- {
- code >>= 3;
- Flush_Buffer(PMBtab0[code].len);
-#ifdef TRACE
- if (Trace_Flag)
- {
- Print_Bits(code,3,PMBtab0[code].len);
- printf("): %s (%d)\n",MBdescr[(int)PMBtab0[code].val],PMBtab0[code].val);
- }
-#endif /* TRACE */
- return PMBtab0[code].val;
- }
-
- if (code==0)
- {
- if (!Quiet_Flag)
- printf("Invalid macroblock_type code\n");
- Fault_Flag = 1;
- return 0;
- }
-
- Flush_Buffer(PMBtab1[code].len);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- Print_Bits(code,6,PMBtab1[code].len);
- printf("): %s (%d)\n",MBdescr[(int)PMBtab1[code].val],PMBtab1[code].val);
- }
-#endif /* TRACE */
-
- return PMBtab1[code].val;
-}
-
-static int Get_B_macroblock_type()
-{
- int code;
-
-#ifdef TRACE
- if (Trace_Flag)
- printf("macroblock_type(B) (");
-#endif /* TRACE */
-
- if ((code = Show_Bits(6))>=8)
- {
- code >>= 2;
- Flush_Buffer(BMBtab0[code].len);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- Print_Bits(code,4,BMBtab0[code].len);
- printf("): %s (%d)\n",MBdescr[(int)BMBtab0[code].val],BMBtab0[code].val);
- }
-#endif /* TRACE */
-
- return BMBtab0[code].val;
- }
-
- if (code==0)
- {
- if (!Quiet_Flag)
- printf("Invalid macroblock_type code\n");
- Fault_Flag = 1;
- return 0;
- }
-
- Flush_Buffer(BMBtab1[code].len);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- Print_Bits(code,6,BMBtab1[code].len);
- printf("): %s (%d)\n",MBdescr[(int)BMBtab1[code].val],BMBtab1[code].val);
- }
-#endif /* TRACE */
-
- return BMBtab1[code].val;
-}
-
-static int Get_D_macroblock_type()
-{
- if (!Get_Bits1())
- {
- if (!Quiet_Flag)
- printf("Invalid macroblock_type code\n");
- Fault_Flag=1;
- }
-
- return 1;
-}
-
-/* macroblock_type for pictures with spatial scalability */
-static int Get_I_Spatial_macroblock_type()
-{
- int code;
-
-#ifdef TRACE
- if (Trace_Flag)
- printf("macroblock_type(I,spat) (");
-#endif /* TRACE */
-
- code = Show_Bits(4);
-
- if (code==0)
- {
- if (!Quiet_Flag)
- printf("Invalid macroblock_type code\n");
- Fault_Flag = 1;
- return 0;
- }
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- Print_Bits(code,4,spIMBtab[code].len);
- printf("): %02x\n",spIMBtab[code].val);
- }
-#endif /* TRACE */
-
- Flush_Buffer(spIMBtab[code].len);
- return spIMBtab[code].val;
-}
-
-static int Get_P_Spatial_macroblock_type()
-{
- int code;
-
-#ifdef TRACE
- if (Trace_Flag)
- printf("macroblock_type(P,spat) (");
-#endif /* TRACE */
-
- code = Show_Bits(7);
-
- if (code<2)
- {
- if (!Quiet_Flag)
- printf("Invalid macroblock_type code\n");
- Fault_Flag = 1;
- return 0;
- }
-
- if (code>=16)
- {
- code >>= 3;
- Flush_Buffer(spPMBtab0[code].len);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- Print_Bits(code,4,spPMBtab0[code].len);
- printf("): %02x\n",spPMBtab0[code].val);
- }
-#endif /* TRACE */
-
- return spPMBtab0[code].val;
- }
-
- Flush_Buffer(spPMBtab1[code].len);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- Print_Bits(code,7,spPMBtab1[code].len);
- printf("): %02x\n",spPMBtab1[code].val);
- }
-#endif /* TRACE */
-
- return spPMBtab1[code].val;
-}
-
-static int Get_B_Spatial_macroblock_type()
-{
- int code;
- VLCtab *p;
-
-#ifdef TRACE
- if (Trace_Flag)
- printf("macroblock_type(B,spat) (");
-#endif /* TRACE */
-
- code = Show_Bits(9);
-
- if (code>=64)
- p = &spBMBtab0[(code>>5)-2];
- else if (code>=16)
- p = &spBMBtab1[(code>>2)-4];
- else if (code>=8)
- p = &spBMBtab2[code-8];
- else
- {
- if (!Quiet_Flag)
- printf("Invalid macroblock_type code\n");
- Fault_Flag = 1;
- return 0;
- }
-
- Flush_Buffer(p->len);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- Print_Bits(code,9,p->len);
- printf("): %02x\n",p->val);
- }
-#endif /* TRACE */
-
- return p->val;
-}
-
-static int Get_SNR_macroblock_type()
-{
- int code;
-
-#ifdef TRACE /* *CH* */
- if (Trace_Flag)
- printf("macroblock_type(SNR) (");
-#endif TRACE
-
- code = Show_Bits(3);
-
- if (code==0)
- {
- if (!Quiet_Flag)
- printf("Invalid macroblock_type code\n");
- Fault_Flag = 1;
- return 0;
- }
-
- Flush_Buffer(SNRMBtab[code].len);
-
-#ifdef TRACE /* *CH* */
- if (Trace_Flag)
- {
- Print_Bits(code,3,SNRMBtab[code].len);
- printf("): %s (%d)\n",MBdescr[(int)SNRMBtab[code].val],SNRMBtab[code].val);
- }
-#endif TRACE
-
-
- return SNRMBtab[code].val;
-}
-
-int Get_motion_code()
-{
- int code;
-
-#ifdef TRACE
- if (Trace_Flag)
- printf("motion_code (");
-#endif /* TRACE */
-
- if (Get_Bits1())
- {
-#ifdef TRACE
- if (Trace_Flag)
- printf("0): 0\n");
-#endif /* TRACE */
- return 0;
- }
-
- if ((code = Show_Bits(9))>=64)
- {
- code >>= 6;
- Flush_Buffer(MVtab0[code].len);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- Print_Bits(code,3,MVtab0[code].len);
- printf("%d): %d\n",
- Show_Bits(1),Show_Bits(1)?-MVtab0[code].val:MVtab0[code].val);
- }
-#endif /* TRACE */
-
- return Get_Bits1()?-MVtab0[code].val:MVtab0[code].val;
- }
-
- if (code>=24)
- {
- code >>= 3;
- Flush_Buffer(MVtab1[code].len);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- Print_Bits(code,6,MVtab1[code].len);
- printf("%d): %d\n",
- Show_Bits(1),Show_Bits(1)?-MVtab1[code].val:MVtab1[code].val);
- }
-#endif /* TRACE */
-
- return Get_Bits1()?-MVtab1[code].val:MVtab1[code].val;
- }
-
- if ((code-=12)<0)
- {
- if (!Quiet_Flag)
-/* HACK */
- printf("Invalid motion_vector code (MBA %d, pic %d)\n", global_MBA, global_pic);
- Fault_Flag=1;
- return 0;
- }
-
- Flush_Buffer(MVtab2[code].len);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- Print_Bits(code+12,9,MVtab2[code].len);
- printf("%d): %d\n",
- Show_Bits(1),Show_Bits(1)?-MVtab2[code].val:MVtab2[code].val);
- }
-#endif /* TRACE */
-
- return Get_Bits1() ? -MVtab2[code].val : MVtab2[code].val;
-}
-
-/* get differential motion vector (for dual prime prediction) */
-int Get_dmvector()
-{
-#ifdef TRACE
- if (Trace_Flag)
- printf("dmvector (");
-#endif /* TRACE */
-
- if (Get_Bits(1))
- {
-#ifdef TRACE
- if (Trace_Flag)
- printf(Show_Bits(1) ? "11): -1\n" : "10): 1\n");
-#endif /* TRACE */
- return Get_Bits(1) ? -1 : 1;
- }
- else
- {
-#ifdef TRACE
- if (Trace_Flag)
- printf("0): 0\n");
-#endif /* TRACE */
- return 0;
- }
-}
-
-int Get_coded_block_pattern()
-{
- int code;
-
-#ifdef TRACE
- if (Trace_Flag)
- printf("coded_block_pattern_420 (");
-#endif /* TRACE */
-
- if ((code = Show_Bits(9))>=128)
- {
- code >>= 4;
- Flush_Buffer(CBPtab0[code].len);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- Print_Bits(code,5,CBPtab0[code].len);
- printf("): ");
- Print_Bits(CBPtab0[code].val,6,6);
- printf(" (%d)\n",CBPtab0[code].val);
- }
-#endif /* TRACE */
-
- return CBPtab0[code].val;
- }
-
- if (code>=8)
- {
- code >>= 1;
- Flush_Buffer(CBPtab1[code].len);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- Print_Bits(code,8,CBPtab1[code].len);
- printf("): ");
- Print_Bits(CBPtab1[code].val,6,6);
- printf(" (%d)\n",CBPtab1[code].val);
- }
-#endif /* TRACE */
-
- return CBPtab1[code].val;
- }
-
- if (code<1)
- {
- if (!Quiet_Flag)
- printf("Invalid coded_block_pattern code\n");
- Fault_Flag = 1;
- return 0;
- }
-
- Flush_Buffer(CBPtab2[code].len);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- Print_Bits(code,9,CBPtab2[code].len);
- printf("): ");
- Print_Bits(CBPtab2[code].val,6,6);
- printf(" (%d)\n",CBPtab2[code].val);
- }
-#endif /* TRACE */
-
- return CBPtab2[code].val;
-}
-
-int Get_macroblock_address_increment()
-{
- int code, val;
-
-#ifdef TRACE
- if (Trace_Flag)
- printf("macroblock_address_increment (");
-#endif /* TRACE */
-
- val = 0;
-
- while ((code = Show_Bits(11))<24)
- {
- if (code!=15) /* if not macroblock_stuffing */
- {
- if (code==8) /* if macroblock_escape */
- {
-#ifdef TRACE
- if (Trace_Flag)
- printf("00000001000 ");
-#endif /* TRACE */
-
- val+= 33;
- }
- else
- {
- if (!Quiet_Flag)
- printf("Invalid macroblock_address_increment code\n");
-
- Fault_Flag = 1;
- return 1;
- }
- }
- else /* macroblock suffing */
- {
-#ifdef TRACE
- if (Trace_Flag)
- printf("00000001111 ");
-#endif /* TRACE */
- }
-
- Flush_Buffer(11);
- }
-
- /* macroblock_address_increment == 1 */
- /* ('1' is in the MSB position of the lookahead) */
- if (code>=1024)
- {
- Flush_Buffer(1);
-#ifdef TRACE
- if (Trace_Flag)
- printf("1): %d\n",val+1);
-#endif /* TRACE */
- return val + 1;
- }
-
- /* codes 00010 ... 011xx */
- if (code>=128)
- {
- /* remove leading zeros */
- code >>= 6;
- Flush_Buffer(MBAtab1[code].len);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- Print_Bits(code,5,MBAtab1[code].len);
- printf("): %d\n",val+MBAtab1[code].val);
- }
-#endif /* TRACE */
-
-
- return val + MBAtab1[code].val;
- }
-
- /* codes 00000011000 ... 0000111xxxx */
- code-= 24; /* remove common base */
- Flush_Buffer(MBAtab2[code].len);
-
-#ifdef TRACE
- if (Trace_Flag)
- {
- Print_Bits(code+24,11,MBAtab2[code].len);
- printf("): %d\n",val+MBAtab2[code].val);
- }
-#endif /* TRACE */
-
- return val + MBAtab2[code].val;
-}
-
-/* combined MPEG-1 and MPEG-2 stage. parse VLC and
- perform dct_diff arithmetic.
-
- MPEG-1: ISO/IEC 11172-2 section
- MPEG-2: ISO/IEC 13818-2 section 7.2.1
-
- Note: the arithmetic here is presented more elegantly than
- the spec, yet the results, dct_diff, are the same.
-*/
-
-int Get_Luma_DC_dct_diff()
-{
- int code, size, dct_diff;
-
-#ifdef TRACE
-/*
- if (Trace_Flag)
- printf("dct_dc_size_luminance: (");
-*/
-#endif /* TRACE */
-
- /* decode length */
- code = Show_Bits(5);
-
- if (code<31)
- {
- size = DClumtab0[code].val;
- Flush_Buffer(DClumtab0[code].len);
-#ifdef TRACE
-/*
- if (Trace_Flag)
- {
- Print_Bits(code,5,DClumtab0[code].len);
- printf("): %d",size);
- }
-*/
-#endif /* TRACE */
- }
- else
- {
- code = Show_Bits(9) - 0x1f0;
- size = DClumtab1[code].val;
- Flush_Buffer(DClumtab1[code].len);
-
-#ifdef TRACE
-/*
- if (Trace_Flag)
- {
- Print_Bits(code+0x1f0,9,DClumtab1[code].len);
- printf("): %d",size);
- }
-*/
-#endif /* TRACE */
- }
-
-#ifdef TRACE
-/*
- if (Trace_Flag)
- printf(", dct_dc_differential (");
-*/
-#endif /* TRACE */
-
- if (size==0)
- dct_diff = 0;
- else
- {
- dct_diff = Get_Bits(size);
-#ifdef TRACE
-/*
- if (Trace_Flag)
- Print_Bits(dct_diff,size,size);
-*/
-#endif /* TRACE */
- if ((dct_diff & (1<<(size-1)))==0)
- dct_diff-= (1<<size) - 1;
- }
-
-#ifdef TRACE
-/*
- if (Trace_Flag)
- printf("): %d\n",dct_diff);
-*/
-#endif /* TRACE */
-
- return dct_diff;
-}
-
-
-int Get_Chroma_DC_dct_diff()
-{
- int code, size, dct_diff;
-
-#ifdef TRACE
-/*
- if (Trace_Flag)
- printf("dct_dc_size_chrominance: (");
-*/
-#endif /* TRACE */
-
- /* decode length */
- code = Show_Bits(5);
-
- if (code<31)
- {
- size = DCchromtab0[code].val;
- Flush_Buffer(DCchromtab0[code].len);
-
-#ifdef TRACE
-/*
- if (Trace_Flag)
- {
- Print_Bits(code,5,DCchromtab0[code].len);
- printf("): %d",size);
- }
-*/
-#endif /* TRACE */
- }
- else
- {
- code = Show_Bits(10) - 0x3e0;
- size = DCchromtab1[code].val;
- Flush_Buffer(DCchromtab1[code].len);
-
-#ifdef TRACE
-/*
- if (Trace_Flag)
- {
- Print_Bits(code+0x3e0,10,DCchromtab1[code].len);
- printf("): %d",size);
- }
-*/
-#endif /* TRACE */
- }
-
-#ifdef TRACE
-/*
- if (Trace_Flag)
- printf(", dct_dc_differential (");
-*/
-#endif /* TRACE */
-
- if (size==0)
- dct_diff = 0;
- else
- {
- dct_diff = Get_Bits(size);
-#ifdef TRACE
-/*
- if (Trace_Flag)
- Print_Bits(dct_diff,size,size);
-*/
-#endif /* TRACE */
- if ((dct_diff & (1<<(size-1)))==0)
- dct_diff-= (1<<size) - 1;
- }
-
-#ifdef TRACE
-/*
- if (Trace_Flag)
- printf("): %d\n",dct_diff);
-*/
-#endif /* TRACE */
-
- return dct_diff;
-}
Index: demos/branches/pj/mpeg2/mpeg2dec.c
===================================================================
--- demos/branches/pj/mpeg2/mpeg2dec.c (revision 1085)
+++ demos/branches/pj/mpeg2/mpeg2dec.c (nonexistent)
@@ -1,770 +0,0 @@
-
-/* mpeg2dec.c, main(), initialization, option processing */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <ctype.h>
-#include <fcntl.h>
-
-#define GLOBAL
-#include "config.h"
-#include "global.h"
-
-/* private prototypes */
-static int video_sequence _ANSI_ARGS_((int *framenum));
-static int Decode_Bitstream _ANSI_ARGS_((void));
-static int Headers _ANSI_ARGS_((void));
-static void Initialize_Sequence _ANSI_ARGS_((void));
-static void Initialize_Decoder _ANSI_ARGS_((void));
-static void Deinitialize_Sequence _ANSI_ARGS_((void));
-static void Process_Options _ANSI_ARGS_((int argc, char *argv[]));
-
-
-#if OLD
-static int Get_Val _ANSI_ARGS_((char *argv[]));
-#endif
-
-/* #define DEBUG */
-
-static void Clear_Options();
-#ifdef DEBUG
-static void Print_Options();
-#endif
-
-int main(argc,argv)
-int argc;
-char *argv[];
-{
- int ret, code;
-
- Clear_Options();
-
- /* decode command line arguments */
- Process_Options(argc,argv);
-
-#ifdef DEBUG
- Print_Options();
-#endif
-
- ld = &base; /* select base layer context */
-
- /* open MPEG base layer bitstream file(s) */
- /* NOTE: this is either a base layer stream or a spatial enhancement stream */
- if ((base.Infile=open(Main_Bitstream_Filename,O_RDONLY|O_BINARY))<0)
- {
- fprintf(stderr,"Base layer input file %s not found\n", Main_Bitstream_Filename);
- exit(1);
- }
-
-
- if(base.Infile != 0)
- {
- Initialize_Buffer();
-
- if(Show_Bits(8)==0x47)
- {
- sprintf(Error_Text,"Decoder currently does not parse transport streams\n");
- Error(Error_Text);
- }
-
- next_start_code();
- code = Show_Bits(32);
-
- switch(code)
- {
- case SEQUENCE_HEADER_CODE:
- break;
- case PACK_START_CODE:
- System_Stream_Flag = 1;
- case VIDEO_ELEMENTARY_STREAM:
- System_Stream_Flag = 1;
- break;
- default:
- sprintf(Error_Text,"Unable to recognize stream type\n");
- Error(Error_Text);
- break;
- }
-
- lseek(base.Infile, 0l, 0);
- Initialize_Buffer();
- }
-
- if(base.Infile!=0)
- {
- lseek(base.Infile, 0l, 0);
- }
-
- Initialize_Buffer();
-
- if(Two_Streams)
- {
- ld = &enhan; /* select enhancement layer context */
-
- if ((enhan.Infile = open(Enhancement_Layer_Bitstream_Filename,O_RDONLY|O_BINARY))<0)
- {
- sprintf(Error_Text,"enhancment layer bitstream file %s not found\n",
- Enhancement_Layer_Bitstream_Filename);
-
- Error(Error_Text);
- }
-
- Initialize_Buffer();
- ld = &base;
- }
-
- Initialize_Decoder();
-
- ret = Decode_Bitstream();
-
- close(base.Infile);
-
- if (Two_Streams)
- close(enhan.Infile);
-
- return 0;
-}
-
-/* IMPLEMENTAION specific rouintes */
-static void Initialize_Decoder()
-{
- int i;
-
- /* Clip table */
- if (!(Clip=(unsigned char *)malloc(1024)))
- Error("Clip[] malloc failed\n");
-
- Clip += 384;
-
- for (i=-384; i<640; i++)
- Clip[i] = (i<0) ? 0 : ((i>255) ? 255 : i);
-
- /* IDCT */
- if (Reference_IDCT_Flag)
- Initialize_Reference_IDCT();
- else
- Initialize_Fast_IDCT();
-
-}
-
-/* mostly IMPLEMENTAION specific rouintes */
-static void Initialize_Sequence()
-{
- int cc, size;
- static int Table_6_20[3] = {6,8,12};
-
- /* check scalability mode of enhancement layer */
- if (Two_Streams && (enhan.scalable_mode!=SC_SNR) && (base.scalable_mode!=SC_DP))
- Error("unsupported scalability mode\n");
-
- /* force MPEG-1 parameters for proper decoder behavior */
- /* see ISO/IEC 13818-2 section D.9.14 */
- if (!base.MPEG2_Flag)
- {
- progressive_sequence = 1;
- progressive_frame = 1;
- picture_structure = FRAME_PICTURE;
- frame_pred_frame_dct = 1;
- chroma_format = CHROMA420;
- matrix_coefficients = 5;
- }
-
- /* round to nearest multiple of coded macroblocks */
- /* ISO/IEC 13818-2 section 6.3.3 sequence_header() */
- mb_width = (horizontal_size+15)/16;
- mb_height = (base.MPEG2_Flag && !progressive_sequence) ? 2*((vertical_size+31)/32)
- : (vertical_size+15)/16;
-
- Coded_Picture_Width = 16*mb_width;
- Coded_Picture_Height = 16*mb_height;
-
- /* ISO/IEC 13818-2 sections 6.1.1.8, 6.1.1.9, and 6.1.1.10 */
- Chroma_Width = (chroma_format==CHROMA444) ? Coded_Picture_Width
- : Coded_Picture_Width>>1;
- Chroma_Height = (chroma_format!=CHROMA420) ? Coded_Picture_Height
- : Coded_Picture_Height>>1;
-
- /* derived based on Table 6-20 in ISO/IEC 13818-2 section 6.3.17 */
- block_count = Table_6_20[chroma_format-1];
-
- for (cc=0; cc<3; cc++)
- {
- if (cc==0)
- size = Coded_Picture_Width*Coded_Picture_Height;
- else
- size = Chroma_Width*Chroma_Height;
-
- if (!(backward_reference_frame[cc] = (unsigned char *)malloc(size)))
- Error("backward_reference_frame[] malloc failed\n");
-
- if (!(forward_reference_frame[cc] = (unsigned char *)malloc(size)))
- Error("forward_reference_frame[] malloc failed\n");
-
- if (!(auxframe[cc] = (unsigned char *)malloc(size)))
- Error("auxframe[] malloc failed\n");
-
- if(Ersatz_Flag)
- if (!(substitute_frame[cc] = (unsigned char *)malloc(size)))
- Error("substitute_frame[] malloc failed\n");
-
-
- if (base.scalable_mode==SC_SPAT)
- {
- /* this assumes lower layer is 4:2:0 */
- if (!(llframe0[cc] = (unsigned char *)malloc((lower_layer_prediction_horizontal_size*lower_layer_prediction_vertical_size)/(cc?4:1))))
- Error("llframe0 malloc failed\n");
- if (!(llframe1[cc] = (unsigned char *)malloc((lower_layer_prediction_horizontal_size*lower_layer_prediction_vertical_size)/(cc?4:1))))
- Error("llframe1 malloc failed\n");
- }
- }
-
- /* SCALABILITY: Spatial */
- if (base.scalable_mode==SC_SPAT)
- {
- if (!(lltmp = (short *)malloc(lower_layer_prediction_horizontal_size*((lower_layer_prediction_vertical_size*vertical_subsampling_factor_n)/vertical_subsampling_factor_m)*sizeof(short))))
- Error("lltmp malloc failed\n");
- }
-
- // PJ
- Initialize_framebuf( Coded_Picture_Width*Coded_Picture_Height*sizeof(WORD) );
- gvideo_init();
- init_jetcontrol();
-
-#ifdef DISPLAY
- if (Output_Type==T_X11)
- {
- Initialize_Display_Process("");
- Initialize_Dither_Matrix();
- }
-#endif /* DISPLAY */
-
-}
-
-void Error(text)
-char *text;
-{
- fprintf(stderr,text);
- exit(1);
-}
-
-/* Trace_Flag output */
-void Print_Bits(code,bits,len)
-int code,bits,len;
-{
- int i;
- for (i=0; i<len; i++)
- printf("%d",(code>>(bits-1-i))&1);
-}
-
-
-
-/* option processing */
-static void Process_Options(argc,argv)
-int argc; /* argument count */
-char *argv[]; /* argument vector */
-{
- int i, LastArg, NextArg;
-
- /* at least one argument should be present */
- if (argc<2)
- {
- printf("\n%s, %s\n",Version,Author);
- printf("Usage: mpeg2decode {options}\n\
-Options: -b file main bitstream (base or spatial enhancement layer)\n\
- -cn file conformance report (n: level)\n\
- -e file enhancement layer bitstream (SNR or Data Partitioning)\n\
- -f store/display interlaced video in frame format\n\
- -g concatenated file format for substitution method (-x)\n\
- -in file information & statistics report (n: level)\n\
- -l file file name pattern for lower layer sequence\n\
- (for spatial scalability)\n\
- -on file output format (0:YUV 1:SIF 2:TGA 3:PPM 4:X11 5:X11HiQ)\n\
- -q disable warnings to stderr\n\
- -r use double precision reference IDCT\n\
- -t enable low level tracing to stdout\n\
- -u file print user_data to stdio or file\n\
- -vn verbose output (n: level)\n\
- -x file filename pattern of picture substitution sequence\n\n\
-File patterns: for sequential filenames, \"printf\" style, e.g. rec%%d\n\
- or rec%%d%%c for fieldwise storage\n\
-Levels: 0:none 1:sequence 2:picture 3:slice 4:macroblock 5:block\n\n\
-Example: mpeg2decode -b bitstream.mpg -f -r -o0 rec%%d\n\
- \n");
- exit(0);
- }
-
-
- Output_Type = -1;
- i = 1;
-
- /* command-line options are proceeded by '-' */
-
- while(i < argc)
- {
- /* check if this is the last argument */
- LastArg = ((argc-i)==1);
-
- /* parse ahead to see if another flag immediately follows current
- argument (this is used to tell if a filename is missing) */
- if(!LastArg)
- NextArg = (argv[i+1][0]=='-');
- else
- NextArg = 0;
-
- /* second character, [1], after '-' is the switch */
- if(argv[i][0]=='-')
- {
- switch(toupper(argv[i][1]))
- {
- /* third character. [2], is the value */
- case 'B':
- Main_Bitstream_Flag = 1;
-
- if(NextArg || LastArg)
- {
- printf("ERROR: -b must be followed the main bitstream filename\n");
- }
- else
- Main_Bitstream_Filename = argv[++i];
-
- break;
-
-
- case 'C':
-
-#ifdef VERIFY
- Verify_Flag = atoi(&argv[i][2]);
-
- if((Verify_Flag < NO_LAYER) || (Verify_Flag > ALL_LAYERS))
- {
- printf("ERROR: -c level (%d) out of range [%d,%d]\n",
- Verify_Flag, NO_LAYER, ALL_LAYERS);
- exit(ERROR);
- }
-#else /* VERIFY */
- printf("This program not compiled for Verify_Flag option\n");
-#endif /* VERIFY */
- break;
-
- case 'E':
- Two_Streams = 1; /* either Data Partitioning (DP) or SNR Scalability enhancment */
-
- if(NextArg || LastArg)
- {
- printf("ERROR: -e must be followed by filename\n");
- exit(ERROR);
- }
- else
- Enhancement_Layer_Bitstream_Filename = argv[++i];
-
- break;
-
-
- case 'F':
- Frame_Store_Flag = 1;
- break;
-
- case 'G':
- Big_Picture_Flag = 1;
- break;
-
-
- case 'I':
-#ifdef VERIFY
- Stats_Flag = atoi(&argv[i][2]);
-#else /* VERIFY */
- printf("WARNING: This program not compiled for -i option\n");
-#endif /* VERIFY */
- break;
-
- case 'L': /* spatial scalability flag */
- Spatial_Flag = 1;
-
- if(NextArg || LastArg)
- {
- printf("ERROR: -l must be followed by filename\n");
- exit(ERROR);
- }
- else
- Lower_Layer_Picture_Filename = argv[++i];
-
- break;
-
- case 'O':
-
- Output_Type = atoi(&argv[i][2]);
-
- if((Output_Type==4) || (Output_Type==5))
- Output_Picture_Filename = ""; /* no need of filename */
- else if(NextArg || LastArg)
- {
- printf("ERROR: -o must be followed by filename\n");
- exit(ERROR);
- }
- else
- /* filename is separated by space, so it becomes the next argument */
- Output_Picture_Filename = argv[++i];
-
-#ifdef DISPLAY
- if (Output_Type==T_X11HIQ)
- {
- hiQdither = 1;
- Output_Type=T_X11;
- }
-#endif /* DISPLAY */
- break;
-
- case 'Q':
- Quiet_Flag = 1;
- break;
-
- case 'R':
- Reference_IDCT_Flag = 1;
- break;
-
- case 'T':
-#ifdef TRACE
- Trace_Flag = 1;
-#else /* TRACE */
- printf("WARNING: This program not compiled for -t option\n");
-#endif /* TRACE */
- break;
-
- case 'U':
- User_Data_Flag = 1;
-
- case 'V':
-#ifdef VERBOSE
- Verbose_Flag = atoi(&argv[i][2]);
-#else /* VERBOSE */
- printf("This program not compiled for -v option\n");
-#endif /* VERBOSE */
- break;
-
-
- case 'X':
- Ersatz_Flag = 1;
-
- if(NextArg || LastArg)
- {
- printf("ERROR: -x must be followed by filename\n");
- exit(ERROR);
- }
- else
- Substitute_Picture_Filename = argv[++i];
-
- break;
-
-
-
- default:
- fprintf(stderr,"undefined option -%c ignored. Exiting program\n",
- argv[i][1]);
-
- exit(ERROR);
-
- } /* switch() */
- } /* if argv[i][0] == '-' */
-
- i++;
-
- /* check for bitstream filename argument (there must always be one, at the very end
- of the command line arguments */
-
- } /* while() */
-
-
- /* options sense checking */
-
- if(Main_Bitstream_Flag!=1)
- {
- printf("There must be a main bitstream specified (-b filename)\n");
- }
-
- /* force display process to show frame pictures */
- if((Output_Type==4 || Output_Type==5) && Frame_Store_Flag)
- Display_Progressive_Flag = 1;
- else
- Display_Progressive_Flag = 0;
-
-#ifdef VERIFY
- /* parse the bitstream, do not actually decode it completely */
-
-
-#if 0
- if(Output_Type==-1)
- {
- Decode_Layer = Verify_Flag;
- printf("FYI: Decoding bitstream elements up to: %s\n",
- Layer_Table[Decode_Layer]);
- }
- else
-#endif
- Decode_Layer = ALL_LAYERS;
-
-#endif /* VERIFY */
-
- /* no output type specified */
- if(Output_Type==-1)
- {
- Output_Type = 9;
- Output_Picture_Filename = "";
- }
-
-
-#ifdef DISPLAY
- if (Output_Type==T_X11)
- {
- if(Frame_Store_Flag)
- Display_Progressive_Flag = 1;
- else
- Display_Progressive_Flag = 0;
-
- Frame_Store_Flag = 1; /* to avoid calling dither() twice */
- }
-#endif
-
-
-}
-
-
-#ifdef OLD
-/*
- this is an old routine used to convert command line arguments
- into integers
-*/
-static int Get_Val(argv)
-char *argv[];
-{
- int val;
-
- if (sscanf(argv[1]+2,"%d",&val)!=1)
- return 0;
-
- while (isdigit(argv[1][2]))
- argv[1]++;
-
- return val;
-}
-#endif
-
-
-
-static int Headers()
-{
- int ret;
-
- ld = &base;
-
-
- /* return when end of sequence (0) or picture
- header has been parsed (1) */
-
- ret = Get_Hdr();
-
-
- if (Two_Streams)
- {
- ld = &enhan;
- if (Get_Hdr()!=ret && !Quiet_Flag)
- fprintf(stderr,"streams out of sync\n");
- ld = &base;
- }
-
- return ret;
-}
-
-
-
-static int Decode_Bitstream()
-{
- int ret;
- int Bitstream_Framenum;
-
- Bitstream_Framenum = 0;
-
- for(;;)
- {
-
-#ifdef VERIFY
- Clear_Verify_Headers();
-#endif /* VERIFY */
-
- ret = Headers();
-
- if(ret==1)
- {
- ret = video_sequence(&Bitstream_Framenum);
- }
- else
- return(ret);
- }
-
-}
-
-
-static void Deinitialize_Sequence()
-{
- int i;
-
- /* clear flags */
- base.MPEG2_Flag=0;
-
- for(i=0;i<3;i++)
- {
- free(backward_reference_frame[i]);
- free(forward_reference_frame[i]);
- free(auxframe[i]);
-
- if (base.scalable_mode==SC_SPAT)
- {
- free(llframe0[i]);
- free(llframe1[i]);
- }
- }
-
- if (base.scalable_mode==SC_SPAT)
- free(lltmp);
-
-#ifdef DISPLAY
- if (Output_Type==T_X11)
- Terminate_Display_Process();
-#endif
-}
-
-
-static int video_sequence(Bitstream_Framenumber)
-int *Bitstream_Framenumber;
-{
- int Bitstream_Framenum;
- int Sequence_Framenum;
- int Return_Value;
-
- Bitstream_Framenum = *Bitstream_Framenumber;
- Sequence_Framenum=0;
-
- Initialize_Sequence();
-
- /* decode picture whose header has already been parsed in
- Decode_Bitstream() */
-
-
- Decode_Picture(Bitstream_Framenum, Sequence_Framenum);
-
- /* update picture numbers */
- if (!Second_Field)
- {
- Bitstream_Framenum++;
- Sequence_Framenum++;
- }
-
- /* loop through the rest of the pictures in the sequence */
- while ((Return_Value=Headers()))
- {
- Decode_Picture(Bitstream_Framenum, Sequence_Framenum);
-
- if (!Second_Field)
- {
- Bitstream_Framenum++;
- Sequence_Framenum++;
- }
- }
-
- /* put last frame */
- if (Sequence_Framenum!=0)
- {
- Output_Last_Frame_of_Sequence(Bitstream_Framenum);
- }
-
- Deinitialize_Sequence();
-
-#ifdef VERIFY
- Clear_Verify_Headers();
-#endif /* VERIFY */
-
- *Bitstream_Framenumber = Bitstream_Framenum;
- return(Return_Value);
-}
-
-
-
-static void Clear_Options()
-{
- Verbose_Flag = 0;
- Output_Type = 0;
- Output_Picture_Filename = " ";
- hiQdither = 0;
- Output_Type = 0;
- Frame_Store_Flag = 0;
- Spatial_Flag = 0;
- Lower_Layer_Picture_Filename = " ";
- Reference_IDCT_Flag = 0;
- Trace_Flag = 0;
- Quiet_Flag = 0;
- Ersatz_Flag = 0;
- Substitute_Picture_Filename = " ";
- Two_Streams = 0;
- Enhancement_Layer_Bitstream_Filename = " ";
- Big_Picture_Flag = 0;
- Main_Bitstream_Flag = 0;
- Main_Bitstream_Filename = " ";
- Verify_Flag = 0;
- Stats_Flag = 0;
- User_Data_Flag = 0;
-}
-
-
-#ifdef DEBUG
-static void Print_Options()
-{
-
- printf("Verbose_Flag = %d\n", Verbose_Flag);
- printf("Output_Type = %d\n", Output_Type);
- printf("Output_Picture_Filename = %s\n", Output_Picture_Filename);
- printf("hiQdither = %d\n", hiQdither);
- printf("Output_Type = %d\n", Output_Type);
- printf("Frame_Store_Flag = %d\n", Frame_Store_Flag);
- printf("Spatial_Flag = %d\n", Spatial_Flag);
- printf("Lower_Layer_Picture_Filename = %s\n", Lower_Layer_Picture_Filename);
- printf("Reference_IDCT_Flag = %d\n", Reference_IDCT_Flag);
- printf("Trace_Flag = %d\n", Trace_Flag);
- printf("Quiet_Flag = %d\n", Quiet_Flag);
- printf("Ersatz_Flag = %d\n", Ersatz_Flag);
- printf("Substitute_Picture_Filename = %s\n", Substitute_Picture_Filename);
- printf("Two_Streams = %d\n", Two_Streams);
- printf("Enhancement_Layer_Bitstream_Filename = %s\n", Enhancement_Layer_Bitstream_Filename);
- printf("Big_Picture_Flag = %d\n", Big_Picture_Flag);
- printf("Main_Bitstream_Flag = %d\n", Main_Bitstream_Flag);
- printf("Main_Bitstream_Filename = %s\n", Main_Bitstream_Filename);
- printf("Verify_Flag = %d\n", Verify_Flag);
- printf("Stats_Flag = %d\n", Stats_Flag);
- printf("User_Data_Flag = %d\n", User_Data_Flag);
-
-}
-#endif
Index: demos/branches/pj/mpeg2/getvlc.h
===================================================================
--- demos/branches/pj/mpeg2/getvlc.h (revision 1085)
+++ demos/branches/pj/mpeg2/getvlc.h (nonexistent)
@@ -1,491 +0,0 @@
-/* getvlc.h, variable length code tables */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-/* NOTE: #define constants such as MACROBLOCK_QUANT are upper case
- as per C programming convention. However, the MPEG document
- (ISO/IEC 13818-2) lists them in all lower case (e.g. Annex B) */
-
-/* NOTE: the VLC tables are in a flash format---a transformation
- of the tables in Annex B to a form more convenient towards
- parallel (more than one-bit-at-a-time) decoding */
-
-typedef struct {
- char val, len;
-} VLCtab;
-
-typedef struct {
- char run, level, len;
-} DCTtab;
-
-/* Table B-3, macroblock_type in P-pictures, codes 001..1xx */
-static VLCtab PMBtab0[8] = {
- {ERROR,0},
- {MACROBLOCK_MOTION_FORWARD,3},
- {MACROBLOCK_PATTERN,2}, {MACROBLOCK_PATTERN,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,1},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,1},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,1},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,1}
-};
-
-/* Table B-3, macroblock_type in P-pictures, codes 000001..00011x */
-static VLCtab PMBtab1[8] = {
- {ERROR,0},
- {MACROBLOCK_QUANT|MACROBLOCK_INTRA,6},
- {MACROBLOCK_QUANT|MACROBLOCK_PATTERN,5}, {MACROBLOCK_QUANT|MACROBLOCK_PATTERN,5},
- {MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,5}, {MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,5},
- {MACROBLOCK_INTRA,5}, {MACROBLOCK_INTRA,5}
-};
-
-/* Table B-4, macroblock_type in B-pictures, codes 0010..11xx */
-static VLCtab BMBtab0[16] = {
- {ERROR,0},
- {ERROR,0},
- {MACROBLOCK_MOTION_FORWARD,4},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,4},
- {MACROBLOCK_MOTION_BACKWARD,3},
- {MACROBLOCK_MOTION_BACKWARD,3},
- {MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,3},
- {MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,3},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2}
-};
-
-/* Table B-4, macroblock_type in B-pictures, codes 000001..00011x */
-static VLCtab BMBtab1[8] = {
- {ERROR,0},
- {MACROBLOCK_QUANT|MACROBLOCK_INTRA,6},
- {MACROBLOCK_QUANT|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,6},
- {MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,6},
- {MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,5},
- {MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,5},
- {MACROBLOCK_INTRA,5},
- {MACROBLOCK_INTRA,5}
-};
-
-/* Table B-5, macroblock_type in spat. scal. I-pictures, codes 0001..1xxx */
-static VLCtab spIMBtab[16] = {
- {ERROR,0},
- {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS,4},
- {MACROBLOCK_QUANT|MACROBLOCK_INTRA,4},
- {MACROBLOCK_INTRA,4},
- {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,2}, {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,2},
- {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,2}, {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,2},
- {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1}, {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1},
- {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1}, {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1},
- {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1}, {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1},
- {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1}, {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,1}
-};
-
-/* Table B-6, macroblock_type in spat. scal. P-pictures, codes 0010..11xx */
-static VLCtab spPMBtab0[16] =
-{
- {ERROR,0},
- {ERROR,0},
- {MACROBLOCK_MOTION_FORWARD,4},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_FORWARD,4},
- {MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,3}, {MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,3},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,3}, {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,3},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,2}
-};
-
-/* Table B-6, macroblock_type in spat. scal. P-pictures, codes 0000010..000111x */
-static VLCtab spPMBtab1[16] = {
- {ERROR,0},
- {ERROR,0},
- {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,7},
- {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS,7},
- {MACROBLOCK_PATTERN,7},
- {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,7},
- {MACROBLOCK_QUANT|MACROBLOCK_INTRA,7},
- {MACROBLOCK_INTRA,7},
- {MACROBLOCK_QUANT|MACROBLOCK_PATTERN,6},
- {MACROBLOCK_QUANT|MACROBLOCK_PATTERN,6},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,6},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,6},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG,6},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG,6},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_PATTERN,6},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_PATTERN,6}
-};
-
-/* Table B-7, macroblock_type in spat. scal. B-pictures, codes 0010..11xx */
-static VLCtab spBMBtab0[14] = {
- {MACROBLOCK_MOTION_FORWARD,4},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,4},
- {MACROBLOCK_MOTION_BACKWARD,3},
- {MACROBLOCK_MOTION_BACKWARD,3},
- {MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,3},
- {MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,3},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2},
- {MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,2}
-};
-
-/* Table B-7, macroblock_type in spat. scal. B-pictures, codes 0000100..000111x */
-static VLCtab spBMBtab1[12] = {
- {MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,7},
- {MACROBLOCK_QUANT|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,7},
- {MACROBLOCK_INTRA,7},
- {MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,7},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_FORWARD,6},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_FORWARD,6},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,6},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,6},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_BACKWARD,6},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_BACKWARD,6},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,6},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,6}
-};
-
-/* Table B-7, macroblock_type in spat. scal. B-pictures, codes 00000100x..000001111 */
-static VLCtab spBMBtab2[8] = {
- {MACROBLOCK_QUANT|MACROBLOCK_INTRA,8},
- {MACROBLOCK_QUANT|MACROBLOCK_INTRA,8},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,8},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN,8},
- {SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG|MACROBLOCK_QUANT|MACROBLOCK_MOTION_BACKWARD|MACROBLOCK_PATTERN,9},
- {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_QUANT|MACROBLOCK_PATTERN,9},
- {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS,9},
- {PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS|MACROBLOCK_PATTERN,9}
-};
-
-/* Table B-8, macroblock_type in spat. scal. B-pictures, codes 001..1xx */
-static VLCtab SNRMBtab[8] = {
- {ERROR,0},
- {0,3},
- {MACROBLOCK_QUANT|MACROBLOCK_PATTERN,2},
- {MACROBLOCK_QUANT|MACROBLOCK_PATTERN,2},
- {MACROBLOCK_PATTERN,1},
- {MACROBLOCK_PATTERN,1},
- {MACROBLOCK_PATTERN,1},
- {MACROBLOCK_PATTERN,1}
-};
-
-/* Table B-10, motion_code, codes 0001 ... 01xx */
-static VLCtab MVtab0[8] =
-{ {ERROR,0}, {3,3}, {2,2}, {2,2}, {1,1}, {1,1}, {1,1}, {1,1}
-};
-
-/* Table B-10, motion_code, codes 0000011 ... 000011x */
-static VLCtab MVtab1[8] =
-{ {ERROR,0}, {ERROR,0}, {ERROR,0}, {7,6}, {6,6}, {5,6}, {4,5}, {4,5}
-};
-
-/* Table B-10, motion_code, codes 0000001100 ... 000001011x */
-static VLCtab MVtab2[12] =
-{ {16,9}, {15,9}, {14,9}, {13,9},
- {12,9}, {11,9}, {10,8}, {10,8},
- {9,8}, {9,8}, {8,8}, {8,8}
-};
-
-/* Table B-9, coded_block_pattern, codes 01000 ... 111xx */
-static VLCtab CBPtab0[32] =
-{ {ERROR,0}, {ERROR,0}, {ERROR,0}, {ERROR,0},
- {ERROR,0}, {ERROR,0}, {ERROR,0}, {ERROR,0},
- {62,5}, {2,5}, {61,5}, {1,5}, {56,5}, {52,5}, {44,5}, {28,5},
- {40,5}, {20,5}, {48,5}, {12,5}, {32,4}, {32,4}, {16,4}, {16,4},
- {8,4}, {8,4}, {4,4}, {4,4}, {60,3}, {60,3}, {60,3}, {60,3}
-};
-
-/* Table B-9, coded_block_pattern, codes 00000100 ... 001111xx */
-static VLCtab CBPtab1[64] =
-{ {ERROR,0}, {ERROR,0}, {ERROR,0}, {ERROR,0},
- {58,8}, {54,8}, {46,8}, {30,8},
- {57,8}, {53,8}, {45,8}, {29,8}, {38,8}, {26,8}, {37,8}, {25,8},
- {43,8}, {23,8}, {51,8}, {15,8}, {42,8}, {22,8}, {50,8}, {14,8},
- {41,8}, {21,8}, {49,8}, {13,8}, {35,8}, {19,8}, {11,8}, {7,8},
- {34,7}, {34,7}, {18,7}, {18,7}, {10,7}, {10,7}, {6,7}, {6,7},
- {33,7}, {33,7}, {17,7}, {17,7}, {9,7}, {9,7}, {5,7}, {5,7},
- {63,6}, {63,6}, {63,6}, {63,6}, {3,6}, {3,6}, {3,6}, {3,6},
- {36,6}, {36,6}, {36,6}, {36,6}, {24,6}, {24,6}, {24,6}, {24,6}
-};
-
-/* Table B-9, coded_block_pattern, codes 000000001 ... 000000111 */
-static VLCtab CBPtab2[8] =
-{ {ERROR,0}, {0,9}, {39,9}, {27,9}, {59,9}, {55,9}, {47,9}, {31,9}
-};
-
-/* Table B-1, macroblock_address_increment, codes 00010 ... 011xx */
-static VLCtab MBAtab1[16] =
-{ {ERROR,0}, {ERROR,0}, {7,5}, {6,5}, {5,4}, {5,4}, {4,4}, {4,4},
- {3,3}, {3,3}, {3,3}, {3,3}, {2,3}, {2,3}, {2,3}, {2,3}
-};
-
-/* Table B-1, macroblock_address_increment, codes 00000011000 ... 0000111xxxx */
-static VLCtab MBAtab2[104] =
-{
- {33,11}, {32,11}, {31,11}, {30,11}, {29,11}, {28,11}, {27,11}, {26,11},
- {25,11}, {24,11}, {23,11}, {22,11}, {21,10}, {21,10}, {20,10}, {20,10},
- {19,10}, {19,10}, {18,10}, {18,10}, {17,10}, {17,10}, {16,10}, {16,10},
- {15,8}, {15,8}, {15,8}, {15,8}, {15,8}, {15,8}, {15,8}, {15,8},
- {14,8}, {14,8}, {14,8}, {14,8}, {14,8}, {14,8}, {14,8}, {14,8},
- {13,8}, {13,8}, {13,8}, {13,8}, {13,8}, {13,8}, {13,8}, {13,8},
- {12,8}, {12,8}, {12,8}, {12,8}, {12,8}, {12,8}, {12,8}, {12,8},
- {11,8}, {11,8}, {11,8}, {11,8}, {11,8}, {11,8}, {11,8}, {11,8},
- {10,8}, {10,8}, {10,8}, {10,8}, {10,8}, {10,8}, {10,8}, {10,8},
- {9,7}, {9,7}, {9,7}, {9,7}, {9,7}, {9,7}, {9,7}, {9,7},
- {9,7}, {9,7}, {9,7}, {9,7}, {9,7}, {9,7}, {9,7}, {9,7},
- {8,7}, {8,7}, {8,7}, {8,7}, {8,7}, {8,7}, {8,7}, {8,7},
- {8,7}, {8,7}, {8,7}, {8,7}, {8,7}, {8,7}, {8,7}, {8,7}
-};
-
-/* Table B-12, dct_dc_size_luminance, codes 00xxx ... 11110 */
-static VLCtab DClumtab0[32] =
-{ {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2},
- {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2},
- {0, 3}, {0, 3}, {0, 3}, {0, 3}, {3, 3}, {3, 3}, {3, 3}, {3, 3},
- {4, 3}, {4, 3}, {4, 3}, {4, 3}, {5, 4}, {5, 4}, {6, 5}, {ERROR, 0}
-};
-
-/* Table B-12, dct_dc_size_luminance, codes 111110xxx ... 111111111 */
-static VLCtab DClumtab1[16] =
-{ {7, 6}, {7, 6}, {7, 6}, {7, 6}, {7, 6}, {7, 6}, {7, 6}, {7, 6},
- {8, 7}, {8, 7}, {8, 7}, {8, 7}, {9, 8}, {9, 8}, {10,9}, {11,9}
-};
-
-/* Table B-13, dct_dc_size_chrominance, codes 00xxx ... 11110 */
-static VLCtab DCchromtab0[32] =
-{ {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2},
- {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2},
- {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2},
- {3, 3}, {3, 3}, {3, 3}, {3, 3}, {4, 4}, {4, 4}, {5, 5}, {ERROR, 0}
-};
-
-/* Table B-13, dct_dc_size_chrominance, codes 111110xxxx ... 1111111111 */
-static VLCtab DCchromtab1[32] =
-{ {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6},
- {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6},
- {7, 7}, {7, 7}, {7, 7}, {7, 7}, {7, 7}, {7, 7}, {7, 7}, {7, 7},
- {8, 8}, {8, 8}, {8, 8}, {8, 8}, {9, 9}, {9, 9}, {10,10}, {11,10}
-};
-
-/* Table B-14, DCT coefficients table zero,
- * codes 0100 ... 1xxx (used for first (DC) coefficient)
- */
-DCTtab DCTtabfirst[12] =
-{
- {0,2,4}, {2,1,4}, {1,1,3}, {1,1,3},
- {0,1,1}, {0,1,1}, {0,1,1}, {0,1,1},
- {0,1,1}, {0,1,1}, {0,1,1}, {0,1,1}
-};
-
-/* Table B-14, DCT coefficients table zero,
- * codes 0100 ... 1xxx (used for all other coefficients)
- */
-DCTtab DCTtabnext[12] =
-{
- {0,2,4}, {2,1,4}, {1,1,3}, {1,1,3},
- {64,0,2}, {64,0,2}, {64,0,2}, {64,0,2}, /* EOB */
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2}
-};
-
-/* Table B-14, DCT coefficients table zero,
- * codes 000001xx ... 00111xxx
- */
-DCTtab DCTtab0[60] =
-{
- {65,0,6}, {65,0,6}, {65,0,6}, {65,0,6}, /* Escape */
- {2,2,7}, {2,2,7}, {9,1,7}, {9,1,7},
- {0,4,7}, {0,4,7}, {8,1,7}, {8,1,7},
- {7,1,6}, {7,1,6}, {7,1,6}, {7,1,6},
- {6,1,6}, {6,1,6}, {6,1,6}, {6,1,6},
- {1,2,6}, {1,2,6}, {1,2,6}, {1,2,6},
- {5,1,6}, {5,1,6}, {5,1,6}, {5,1,6},
- {13,1,8}, {0,6,8}, {12,1,8}, {11,1,8},
- {3,2,8}, {1,3,8}, {0,5,8}, {10,1,8},
- {0,3,5}, {0,3,5}, {0,3,5}, {0,3,5},
- {0,3,5}, {0,3,5}, {0,3,5}, {0,3,5},
- {4,1,5}, {4,1,5}, {4,1,5}, {4,1,5},
- {4,1,5}, {4,1,5}, {4,1,5}, {4,1,5},
- {3,1,5}, {3,1,5}, {3,1,5}, {3,1,5},
- {3,1,5}, {3,1,5}, {3,1,5}, {3,1,5}
-};
-
-/* Table B-15, DCT coefficients table one,
- * codes 000001xx ... 11111111
-*/
-DCTtab DCTtab0a[252] =
-{
- {65,0,6}, {65,0,6}, {65,0,6}, {65,0,6}, /* Escape */
- {7,1,7}, {7,1,7}, {8,1,7}, {8,1,7},
- {6,1,7}, {6,1,7}, {2,2,7}, {2,2,7},
- {0,7,6}, {0,7,6}, {0,7,6}, {0,7,6},
- {0,6,6}, {0,6,6}, {0,6,6}, {0,6,6},
- {4,1,6}, {4,1,6}, {4,1,6}, {4,1,6},
- {5,1,6}, {5,1,6}, {5,1,6}, {5,1,6},
- {1,5,8}, {11,1,8}, {0,11,8}, {0,10,8},
- {13,1,8}, {12,1,8}, {3,2,8}, {1,4,8},
- {2,1,5}, {2,1,5}, {2,1,5}, {2,1,5},
- {2,1,5}, {2,1,5}, {2,1,5}, {2,1,5},
- {1,2,5}, {1,2,5}, {1,2,5}, {1,2,5},
- {1,2,5}, {1,2,5}, {1,2,5}, {1,2,5},
- {3,1,5}, {3,1,5}, {3,1,5}, {3,1,5},
- {3,1,5}, {3,1,5}, {3,1,5}, {3,1,5},
- {1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
- {1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
- {1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
- {1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
- {1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
- {1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
- {1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
- {1,1,3}, {1,1,3}, {1,1,3}, {1,1,3},
- {64,0,4}, {64,0,4}, {64,0,4}, {64,0,4}, /* EOB */
- {64,0,4}, {64,0,4}, {64,0,4}, {64,0,4},
- {64,0,4}, {64,0,4}, {64,0,4}, {64,0,4},
- {64,0,4}, {64,0,4}, {64,0,4}, {64,0,4},
- {0,3,4}, {0,3,4}, {0,3,4}, {0,3,4},
- {0,3,4}, {0,3,4}, {0,3,4}, {0,3,4},
- {0,3,4}, {0,3,4}, {0,3,4}, {0,3,4},
- {0,3,4}, {0,3,4}, {0,3,4}, {0,3,4},
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
- {0,1,2}, {0,1,2}, {0,1,2}, {0,1,2},
- {0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
- {0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
- {0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
- {0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
- {0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
- {0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
- {0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
- {0,2,3}, {0,2,3}, {0,2,3}, {0,2,3},
- {0,4,5}, {0,4,5}, {0,4,5}, {0,4,5},
- {0,4,5}, {0,4,5}, {0,4,5}, {0,4,5},
- {0,5,5}, {0,5,5}, {0,5,5}, {0,5,5},
- {0,5,5}, {0,5,5}, {0,5,5}, {0,5,5},
- {9,1,7}, {9,1,7}, {1,3,7}, {1,3,7},
- {10,1,7}, {10,1,7}, {0,8,7}, {0,8,7},
- {0,9,7}, {0,9,7}, {0,12,8}, {0,13,8},
- {2,3,8}, {4,2,8}, {0,14,8}, {0,15,8}
-};
-
-/* Table B-14, DCT coefficients table zero,
- * codes 0000001000 ... 0000001111
- */
-DCTtab DCTtab1[8] =
-{
- {16,1,10}, {5,2,10}, {0,7,10}, {2,3,10},
- {1,4,10}, {15,1,10}, {14,1,10}, {4,2,10}
-};
-
-/* Table B-15, DCT coefficients table one,
- * codes 000000100x ... 000000111x
- */
-DCTtab DCTtab1a[8] =
-{
- {5,2,9}, {5,2,9}, {14,1,9}, {14,1,9},
- {2,4,10}, {16,1,10}, {15,1,9}, {15,1,9}
-};
-
-/* Table B-14/15, DCT coefficients table zero / one,
- * codes 000000010000 ... 000000011111
- */
-DCTtab DCTtab2[16] =
-{
- {0,11,12}, {8,2,12}, {4,3,12}, {0,10,12},
- {2,4,12}, {7,2,12}, {21,1,12}, {20,1,12},
- {0,9,12}, {19,1,12}, {18,1,12}, {1,5,12},
- {3,3,12}, {0,8,12}, {6,2,12}, {17,1,12}
-};
-
-/* Table B-14/15, DCT coefficients table zero / one,
- * codes 0000000010000 ... 0000000011111
- */
-DCTtab DCTtab3[16] =
-{
- {10,2,13}, {9,2,13}, {5,3,13}, {3,4,13},
- {2,5,13}, {1,7,13}, {1,6,13}, {0,15,13},
- {0,14,13}, {0,13,13}, {0,12,13}, {26,1,13},
- {25,1,13}, {24,1,13}, {23,1,13}, {22,1,13}
-};
-
-/* Table B-14/15, DCT coefficients table zero / one,
- * codes 00000000010000 ... 00000000011111
- */
-DCTtab DCTtab4[16] =
-{
- {0,31,14}, {0,30,14}, {0,29,14}, {0,28,14},
- {0,27,14}, {0,26,14}, {0,25,14}, {0,24,14},
- {0,23,14}, {0,22,14}, {0,21,14}, {0,20,14},
- {0,19,14}, {0,18,14}, {0,17,14}, {0,16,14}
-};
-
-/* Table B-14/15, DCT coefficients table zero / one,
- * codes 000000000010000 ... 000000000011111
- */
-DCTtab DCTtab5[16] =
-{
- {0,40,15}, {0,39,15}, {0,38,15}, {0,37,15},
- {0,36,15}, {0,35,15}, {0,34,15}, {0,33,15},
- {0,32,15}, {1,14,15}, {1,13,15}, {1,12,15},
- {1,11,15}, {1,10,15}, {1,9,15}, {1,8,15}
-};
-
-/* Table B-14/15, DCT coefficients table zero / one,
- * codes 0000000000010000 ... 0000000000011111
- */
-DCTtab DCTtab6[16] =
-{
- {1,18,16}, {1,17,16}, {1,16,16}, {1,15,16},
- {6,3,16}, {16,2,16}, {15,2,16}, {14,2,16},
- {13,2,16}, {12,2,16}, {11,2,16}, {31,1,16},
- {30,1,16}, {29,1,16}, {28,1,16}, {27,1,16}
-};
-
Index: demos/branches/pj/mpeg2/mpeg2dec.h
===================================================================
--- demos/branches/pj/mpeg2/mpeg2dec.h (revision 1085)
+++ demos/branches/pj/mpeg2/mpeg2dec.h (nonexistent)
@@ -1,129 +0,0 @@
-/* mpeg2dec.h, MPEG specific defines */
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-#define ERROR (-1)
-
-#define PICTURE_START_CODE 0x100
-#define SLICE_START_CODE_MIN 0x101
-#define SLICE_START_CODE_MAX 0x1AF
-#define USER_DATA_START_CODE 0x1B2
-#define SEQUENCE_HEADER_CODE 0x1B3
-#define SEQUENCE_ERROR_CODE 0x1B4
-#define EXTENSION_START_CODE 0x1B5
-#define SEQUENCE_END_CODE 0x1B7
-#define GROUP_START_CODE 0x1B8
-#define SYSTEM_START_CODE_MIN 0x1B9
-#define SYSTEM_START_CODE_MAX 0x1FF
-
-#define ISO_END_CODE 0x1B9
-#define PACK_START_CODE 0x1BA
-#define SYSTEM_START_CODE 0x1BB
-
-#define VIDEO_ELEMENTARY_STREAM 0x1e0
-
-/* scalable_mode */
-#define SC_NONE 0
-#define SC_DP 1
-#define SC_SPAT 2
-#define SC_SNR 3
-#define SC_TEMP 4
-
-/* picture coding type */
-#define I_TYPE 1
-#define P_TYPE 2
-#define B_TYPE 3
-#define D_TYPE 4
-
-/* picture structure */
-#define TOP_FIELD 1
-#define BOTTOM_FIELD 2
-#define FRAME_PICTURE 3
-
-/* macroblock type */
-#define MACROBLOCK_INTRA 1
-#define MACROBLOCK_PATTERN 2
-#define MACROBLOCK_MOTION_BACKWARD 4
-#define MACROBLOCK_MOTION_FORWARD 8
-#define MACROBLOCK_QUANT 16
-#define SPATIAL_TEMPORAL_WEIGHT_CODE_FLAG 32
-#define PERMITTED_SPATIAL_TEMPORAL_WEIGHT_CLASS 64
-
-
-/* motion_type */
-#define MC_FIELD 1
-#define MC_FRAME 2
-#define MC_16X8 2
-#define MC_DMV 3
-
-/* mv_format */
-#define MV_FIELD 0
-#define MV_FRAME 1
-
-/* chroma_format */
-#define CHROMA420 1
-#define CHROMA422 2
-#define CHROMA444 3
-
-/* extension start code IDs */
-
-#define SEQUENCE_EXTENSION_ID 1
-#define SEQUENCE_DISPLAY_EXTENSION_ID 2
-#define QUANT_MATRIX_EXTENSION_ID 3
-#define COPYRIGHT_EXTENSION_ID 4
-#define SEQUENCE_SCALABLE_EXTENSION_ID 5
-#define PICTURE_DISPLAY_EXTENSION_ID 7
-#define PICTURE_CODING_EXTENSION_ID 8
-#define PICTURE_SPATIAL_SCALABLE_EXTENSION_ID 9
-#define PICTURE_TEMPORAL_SCALABLE_EXTENSION_ID 10
-
-#define ZIG_ZAG 0
-
-#define PROFILE_422 (128+5)
-#define MAIN_LEVEL 8
-
-/* Layers: used by Verbose_Flag, Verifier_Flag, Stats_Flag, and Trace_Flag */
-#define NO_LAYER 0
-#define SEQUENCE_LAYER 1
-#define PICTURE_LAYER 2
-#define SLICE_LAYER 3
-#define MACROBLOCK_LAYER 4
-#define BLOCK_LAYER 5
-#define EVENT_LAYER 6
-#define ALL_LAYERS 7
-
-
-
-#define FILENAME_LENGTH 256
-
-
-
-
-#define MB_WEIGHT 32
-#define MB_CLASS4 64
-
Index: demos/branches/pj/mpeg2/makefile
===================================================================
--- demos/branches/pj/mpeg2/makefile (revision 1085)
+++ demos/branches/pj/mpeg2/makefile (nonexistent)
@@ -1,19 +0,0 @@
-#
-# The mpeg library
-#
-
-# (see sources for copyrights)
-
-ifndef BASE
-BASE=../..
-endif
-include $(BASE)/config/config.mk
-
-PROGS= mpeg2dec
-
-include $(BASE)/config/example.mk
-
-OBJS= "initfile.o jetctrl.o getpic.o motion.o getvlc.o gethdr.o getblk.o getbits.o store.o recon.o spatscal.o idct.o idctref.o systems.o subspic.o verify.o gvideo.o"
-
-mpeg2dec:
- make -f $(SUBMAKE) APP=mpeg2dec INIT= OTHEROBJS=$(OBJS) OTHERINCL=
Index: demos/branches/pj/mpeg2/examples
===================================================================
--- demos/branches/pj/mpeg2/examples (revision 1085)
+++ demos/branches/pj/mpeg2/examples (nonexistent)
@@ -1,49 +0,0 @@
-EXAMPLES:
-
-1. to decode a bitstream with double precision IDCT, such as
- to create a reference reconstruction set of frames:
-
- mpeg2decode -r -f -o0 rec%d -b bitstream.mpg
-
-2. to decode a bitstream with fast integer IDCT, such as
- to create a test reconstruction set of frames:
-
- mpeg2decode -f -o0 rec%d -b bitstream.mpg
-
-3. To substitute reference pictures with external reference
- pictures (ref%d):
-
- mpeg2decode -f -x ref%d -b bitstream.mpg -o0 rec%d
-
-
-4. Same as 3. only using a single large concatenated file for the
- sequence of reconstruction frames.
-
- mpeg2decode -f -g -x ref%d bitstream.mpg -o0 rec%d
-
-5. Decode an SNR enhancement bitstream at the same time as base layer
- stream:
-
- mpeg2decode -o0 rec%d -e snr_bitstream.mpg -b base_bitstream.mpg
-
-6. Decode a Spatially scalable bitstream
-
- Step 1: create lower layer reconstruction
-
- mpeg2decode -f -o0 llrec%d -b base_layer.mpg
-
- Step 2: decode enhancement bitstream, combined reconstruction.
-
- mpeg2decode -f -l llrec%d -b enhancement_layer.mpg -o0 rec%d
-
-------------
- where:
- -o0 specifies .Y, .U, .V input
- -f specifies field interleaved format
- -b is the bitstream flag
- -g specifies substitute file is a large concatendated one.
- -e substitution flag
- ref.pic filename of substitution sequence
- bitstream.mpg bitstream
- test%d output file pattern
-
Index: demos/branches/pj/mpeg2/ieee1180
===================================================================
--- demos/branches/pj/mpeg2/ieee1180 (revision 1085)
+++ demos/branches/pj/mpeg2/ieee1180 (nonexistent)
@@ -1,245 +0,0 @@
-IEEE 1180 report for mpeg2decode fast integer IDCT:
-
-From stefan@lis.e-technik.tu-muenchen.de Thu May 26 08:18:36 1994
-
-IEEE test conditions: -L = -256, +H = 255, sign = 1, #iters = 10000
-Peak absolute values of errors:
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
-Worst peak error = 1 (meets spec limit 1)
-
-Mean square errors:
- 0.0058 0.0118 0.0097 0.0057 0.0055 0.0117 0.0120 0.0063
- 0.0106 0.0157 0.0142 0.0099 0.0115 0.0168 0.0154 0.0123
- 0.0128 0.0156 0.0152 0.0095 0.0115 0.0147 0.0173 0.0096
- 0.0055 0.0115 0.0103 0.0078 0.0069 0.0092 0.0113 0.0071
- 0.0057 0.0134 0.0123 0.0067 0.0050 0.0109 0.0128 0.0065
- 0.0101 0.0172 0.0159 0.0093 0.0097 0.0148 0.0163 0.0130
- 0.0113 0.0171 0.0148 0.0103 0.0110 0.0153 0.0149 0.0093
- 0.0064 0.0123 0.0104 0.0065 0.0064 0.0111 0.0099 0.0066
-Worst pmse = 0.017300 (meets spec limit 0.06)
-Overall mse = 0.010998 (meets spec limit 0.02)
-
-Mean errors:
- 0.0014 0.0004 0.0003 0.0017 0.0003 0.0011 0.0010 -0.0001
- 0.0000 0.0003 0.0010 0.0003 0.0007 -0.0006 0.0004 0.0033
- 0.0000 -0.0008 -0.0006 0.0009 -0.0015 -0.0013 -0.0017 -0.0008
- -0.0017 0.0019 -0.0005 0.0010 0.0005 0.0000 -0.0017 -0.0001
- 0.0007 0.0034 0.0015 0.0021 0.0016 0.0007 -0.0006 0.0011
- -0.0007 0.0004 -0.0001 0.0003 0.0003 0.0004 0.0031 -0.0010
- 0.0009 -0.0005 -0.0004 0.0003 0.0008 -0.0015 -0.0007 -0.0007
- 0.0024 0.0001 0.0018 -0.0003 -0.0006 -0.0001 0.0009 0.0018
-Worst mean error = 0.003400 (meets spec limit 0.015)
-Overall mean error = 0.000352 (meets spec limit 0.0015)
-
-0 elements of IDCT(0) were not zero
-
-
-25.8u 0.1s 0:27 95% 0+216k 0+2io 0pf+0w
-IEEE test conditions: -L = -5, +H = 5, sign = 1, #iters = 10000
-Peak absolute values of errors:
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
-Worst peak error = 1 (meets spec limit 1)
-
-Mean square errors:
- 0.0008 0.0008 0.0006 0.0006 0.0006 0.0006 0.0007 0.0005
- 0.0005 0.0003 0.0005 0.0001 0.0003 0.0007 0.0007 0.0004
- 0.0004 0.0012 0.0011 0.0007 0.0010 0.0008 0.0010 0.0003
- 0.0004 0.0004 0.0001 0.0002 0.0004 0.0007 0.0009 0.0004
- 0.0005 0.0005 0.0004 0.0002 0.0006 0.0004 0.0012 0.0003
- 0.0008 0.0006 0.0007 0.0007 0.0003 0.0012 0.0011 0.0004
- 0.0006 0.0002 0.0001 0.0002 0.0005 0.0005 0.0007 0.0005
- 0.0008 0.0004 0.0006 0.0003 0.0008 0.0006 0.0002 0.0003
-Worst pmse = 0.001200 (meets spec limit 0.06)
-Overall mse = 0.000561 (meets spec limit 0.02)
-
-Mean errors:
- 0.0008 0.0006 0.0000 0.0006 0.0006 0.0002 0.0005 0.0003
- 0.0005 0.0003 0.0003 0.0001 0.0001 0.0001 0.0005 0.0002
- 0.0004 0.0006 0.0005 0.0007 0.0006 0.0004 0.0002 -0.0001
- 0.0002 0.0002 0.0001 0.0002 0.0004 0.0005 0.0003 0.0002
- 0.0003 0.0003 0.0004 0.0002 0.0006 0.0000 0.0002 0.0003
- -0.0002 0.0004 0.0007 0.0005 0.0001 0.0010 0.0005 -0.0002
- 0.0004 0.0000 0.0001 0.0000 0.0001 0.0003 0.0005 0.0003
- 0.0006 0.0000 0.0002 0.0003 0.0004 0.0002 0.0002 0.0001
-Worst mean error = 0.001000 (meets spec limit 0.015)
-Overall mean error = 0.000311 (meets spec limit 0.0015)
-
-0 elements of IDCT(0) were not zero
-
-
-25.7u 0.1s 0:27 95% 0+216k 0+3io 0pf+0w
-IEEE test conditions: -L = -300, +H = 300, sign = 1, #iters = 10000
-Peak absolute values of errors:
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
-Worst peak error = 1 (meets spec limit 1)
-
-Mean square errors:
- 0.0068 0.0097 0.0119 0.0064 0.0065 0.0105 0.0112 0.0050
- 0.0088 0.0130 0.0128 0.0088 0.0111 0.0152 0.0139 0.0109
- 0.0114 0.0127 0.0157 0.0099 0.0114 0.0137 0.0153 0.0109
- 0.0052 0.0097 0.0120 0.0060 0.0067 0.0114 0.0099 0.0065
- 0.0062 0.0096 0.0091 0.0064 0.0076 0.0092 0.0111 0.0058
- 0.0096 0.0139 0.0166 0.0112 0.0092 0.0141 0.0122 0.0103
- 0.0121 0.0138 0.0131 0.0089 0.0108 0.0172 0.0127 0.0104
- 0.0070 0.0109 0.0092 0.0055 0.0057 0.0128 0.0102 0.0069
-Worst pmse = 0.017200 (meets spec limit 0.06)
-Overall mse = 0.010316 (meets spec limit 0.02)
-
-Mean errors:
- -0.0010 0.0015 0.0001 -0.0004 0.0005 -0.0001 0.0008 0.0000
- 0.0004 0.0016 0.0006 0.0000 -0.0001 0.0004 0.0011 0.0001
- -0.0008 0.0013 0.0015 0.0003 0.0010 0.0005 -0.0005 0.0021
- 0.0006 0.0013 -0.0004 0.0000 0.0007 -0.0002 -0.0009 0.0003
- 0.0004 0.0004 -0.0001 -0.0004 0.0014 0.0018 0.0017 -0.0002
- 0.0024 0.0007 -0.0002 -0.0018 0.0004 0.0001 0.0010 0.0009
- 0.0001 -0.0002 0.0005 0.0003 -0.0016 0.0004 0.0013 -0.0006
- -0.0012 -0.0017 -0.0008 0.0003 0.0001 0.0018 0.0008 -0.0005
-Worst mean error = 0.002400 (meets spec limit 0.015)
-Overall mean error = 0.000309 (meets spec limit 0.0015)
-
-0 elements of IDCT(0) were not zero
-
-
-25.8u 0.0s 0:27 95% 0+216k 0+4io 0pf+0w
-IEEE test conditions: -L = -256, +H = 255, sign = -1, #iters = 10000
-Peak absolute values of errors:
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
-Worst peak error = 1 (meets spec limit 1)
-
-Mean square errors:
- 0.0061 0.0118 0.0097 0.0057 0.0058 0.0113 0.0115 0.0061
- 0.0105 0.0159 0.0138 0.0097 0.0113 0.0166 0.0149 0.0123
- 0.0129 0.0155 0.0152 0.0095 0.0112 0.0145 0.0173 0.0094
- 0.0059 0.0112 0.0105 0.0076 0.0071 0.0091 0.0113 0.0073
- 0.0061 0.0130 0.0128 0.0066 0.0051 0.0108 0.0126 0.0067
- 0.0099 0.0168 0.0161 0.0095 0.0100 0.0149 0.0166 0.0132
- 0.0113 0.0171 0.0150 0.0101 0.0110 0.0157 0.0152 0.0094
- 0.0062 0.0121 0.0102 0.0065 0.0061 0.0112 0.0099 0.0065
-Worst pmse = 0.017300 (meets spec limit 0.06)
-Overall mse = 0.010980 (meets spec limit 0.02)
-
-Mean errors:
- -0.0005 0.0006 0.0001 -0.0007 0.0006 -0.0003 -0.0003 0.0011
- 0.0011 0.0003 -0.0002 0.0005 -0.0001 0.0008 0.0001 -0.0027
- 0.0013 0.0015 0.0010 -0.0001 0.0020 0.0019 0.0025 0.0016
- 0.0023 -0.0008 0.0011 -0.0002 0.0007 0.0003 0.0019 0.0009
- -0.0003 -0.0030 -0.0002 -0.0012 -0.0009 0.0000 0.0010 -0.0005
- 0.0009 0.0002 0.0015 0.0007 0.0002 0.0001 -0.0026 0.0018
- 0.0001 0.0011 0.0010 0.0005 -0.0004 0.0023 0.0014 0.0014
- -0.0014 0.0007 -0.0014 0.0009 0.0013 0.0006 -0.0007 -0.0007
-Worst mean error = 0.003000 (meets spec limit 0.015)
-Overall mean error = 0.000355 (meets spec limit 0.0015)
-
-0 elements of IDCT(0) were not zero
-
-
-25.8u 0.1s 0:27 95% 0+216k 0+3io 0pf+0w
-IEEE test conditions: -L = -5, +H = 5, sign = -1, #iters = 10000
-Peak absolute values of errors:
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
-Worst peak error = 1 (meets spec limit 1)
-
-Mean square errors:
- 0.0010 0.0007 0.0008 0.0004 0.0008 0.0004 0.0005 0.0007
- 0.0005 0.0007 0.0005 0.0004 0.0006 0.0005 0.0005 0.0003
- 0.0003 0.0011 0.0009 0.0007 0.0008 0.0006 0.0011 0.0006
- 0.0003 0.0004 0.0002 0.0002 0.0003 0.0006 0.0008 0.0006
- 0.0004 0.0005 0.0006 0.0006 0.0003 0.0007 0.0007 0.0003
- 0.0013 0.0006 0.0008 0.0005 0.0004 0.0006 0.0008 0.0004
- 0.0003 0.0003 0.0003 0.0002 0.0005 0.0004 0.0006 0.0005
- 0.0005 0.0003 0.0006 0.0005 0.0011 0.0007 0.0005 0.0003
-Worst pmse = 0.001300 (meets spec limit 0.06)
-Overall mse = 0.000561 (meets spec limit 0.02)
-
-Mean errors:
- 0.0002 0.0005 0.0008 0.0000 0.0002 0.0004 0.0003 0.0007
- 0.0001 0.0003 0.0003 0.0002 0.0006 0.0003 0.0001 0.0003
- -0.0001 0.0007 0.0003 0.0001 0.0002 0.0006 0.0005 0.0006
- 0.0001 0.0004 0.0002 0.0002 0.0001 0.0002 0.0004 0.0004
- 0.0002 0.0005 0.0006 0.0004 0.0001 0.0005 0.0005 0.0003
- 0.0009 0.0002 0.0000 0.0001 0.0004 0.0000 0.0006 0.0004
- 0.0003 0.0003 0.0003 0.0002 0.0003 0.0000 0.0004 0.0003
- 0.0003 0.0003 0.0004 0.0003 0.0007 0.0005 0.0005 0.0003
-Worst mean error = 0.000900 (meets spec limit 0.015)
-Overall mean error = 0.000333 (meets spec limit 0.0015)
-
-0 elements of IDCT(0) were not zero
-
-
-25.7u 0.1s 0:27 95% 0+216k 0+0io 0pf+0w
-IEEE test conditions: -L = -300, +H = 300, sign = -1, #iters = 10000
-Peak absolute values of errors:
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
- 1 1 1 1 1 1 1 1
-Worst peak error = 1 (meets spec limit 1)
-
-Mean square errors:
- 0.0067 0.0097 0.0118 0.0060 0.0066 0.0107 0.0113 0.0049
- 0.0082 0.0132 0.0128 0.0088 0.0110 0.0152 0.0140 0.0109
- 0.0122 0.0125 0.0156 0.0098 0.0113 0.0139 0.0152 0.0106
- 0.0054 0.0097 0.0121 0.0064 0.0067 0.0110 0.0096 0.0062
- 0.0064 0.0099 0.0090 0.0067 0.0078 0.0089 0.0112 0.0057
- 0.0098 0.0136 0.0165 0.0111 0.0090 0.0138 0.0120 0.0103
- 0.0121 0.0135 0.0131 0.0087 0.0107 0.0168 0.0128 0.0102
- 0.0069 0.0109 0.0091 0.0057 0.0061 0.0125 0.0103 0.0070
-Worst pmse = 0.016800 (meets spec limit 0.06)
-Overall mse = 0.010283 (meets spec limit 0.02)
-
-Mean errors:
- 0.0015 -0.0009 0.0006 0.0012 0.0002 0.0007 -0.0001 0.0005
- 0.0004 -0.0010 0.0000 0.0004 0.0006 0.0004 -0.0004 0.0007
- 0.0018 -0.0009 -0.0006 0.0000 -0.0003 -0.0001 0.0014 -0.0006
- -0.0002 -0.0011 0.0009 0.0004 -0.0003 0.0010 0.0010 0.0000
- 0.0004 0.0001 0.0010 0.0011 -0.0008 -0.0017 -0.0006 0.0009
- -0.0020 0.0000 0.0007 0.0021 0.0002 0.0002 -0.0004 -0.0003
- 0.0003 0.0005 -0.0003 -0.0001 0.0017 0.0002 -0.0004 0.0010
- 0.0015 0.0023 0.0013 0.0003 0.0005 -0.0011 -0.0003 0.0006
-Worst mean error = 0.002300 (meets spec limit 0.015)
-Overall mean error = 0.000252 (meets spec limit 0.0015)
-
-0 elements of IDCT(0) were not zero
-
-
-25.8u 0.0s 0:27 94% 0+216k 0+3io 0pf+0w
-
Index: demos/branches/pj/base/fly.c
===================================================================
--- demos/branches/pj/base/fly.c (revision 1085)
+++ demos/branches/pj/base/fly.c (nonexistent)
@@ -1,220 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: fly.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:41 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai and Giorgio Buttazzo
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*--------------------------------------------------------------*/
-/* SIMULATION OF RANDOM FLIES */
-/*--------------------------------------------------------------*/
-
-#include <kernel/kern.h>
-#include <drivers/glib.h>
-#include <drivers/keyb.h>
-#include <semaphore.h>
-#include <stdlib.h>
-#include <math.h>
-
-#define YMENU 10 /* menu level */
-#define XMIN 50
-#define XMAX 600
-#define YMIN 100
-#define YMAX 450
-#define VEL 5 /* linear velocity (def. = 5) */
-#define ANG 30 /* angolo massimo sterzata (30) */
-#define D 3 /* raggio mosca */
-#define ESC 27 /* ASCII code of ESCAPE key */
-#define MAX_P 35 /* max number of flies */
-#define FLYGROUP 1
-
-double tick = 1.0; /* system tick = 1 ms */
-int fly_period = 40000; /* task period */
-int fly_wcet = 1000; /* task wcet */
-PID pid;
-sem_t mutex;
-
-/*--------------------------------------------------------------*/
-
-void draw_fly(int x, int y, int c)
-{
- sem_wait(&mutex);
- grx_disc(x, y, D, c);
- sem_post(&mutex);
-}
-
-/******************************************************************/
-
-TASK fly(void *arg)
-{
-int x, y;
-int ox, oy;
-int dx, dy, da;
-int teta, col;
-int outx, outy;
-double r;
-int i = (int)arg;
-
- x = ox = (XMIN+XMAX)/2;
- y = oy = (YMIN+YMAX)/2;
- teta = 0;
- col = 2 + i; /* colore fly */
-
- while (1) {
-
- da = rand()%(2*ANG) - ANG; /* da = [-ANG,ANG] */
- teta += da;
-
- if (teta > 360) teta -= 360;
- if (teta < 0) teta += 360;
- r = (double)teta * PI / 180.;
-
- dx = (float)(VEL * cos(r));
- dy = (float)(VEL * sin(r));
- x += dx;
- y += dy;
-
- outx = (x >= XMAX) || (x <= XMIN);
- outy = (y >= YMAX) || (y <= YMIN);
-
- if (outx || outy) {
- x = x - dx;
- y = y - dy;
- if (outx) teta = 180 - teta;
- if (outy) teta = -teta;
- if (teta > 360) teta -= 360;
- if (teta < 0) teta += 360;
- r = (double)teta * PI / 180.;
-
- dx = (float)(VEL * cos(r));
- dy = (float)(VEL * sin(r));
-
- x += dx;
- y += dy;
- }
-
- draw_fly(ox, oy, 0);
- draw_fly(x, y, col);
- ox = x; oy = y;
-
- task_endcycle();
- }
-}
-
-/****************************************************************/
-
-/* This function is called when the system exits */
-void byebye(void *arg)
-{
- grx_close();
- kern_printf("Bye Bye!\n");
-}
-
-/****************************** MAIN ******************************/
-
-int main(int argc, char **argv)
-{
- HARD_TASK_MODEL m;
-
- char c; /* character from keyboard */
- int i = 0; /* number of tasks created */
- TIME seme; /* used to init the random seed */
-
- /* Set the exception handler */
- set_exchandler_grx();
-
- /* Set the closing function */
- sys_atrunlevel(byebye, NULL, RUNLEVEL_BEFORE_EXIT);
-
- /* graphic card Initialization */
- if (grx_init() < 1) {
- sys_abort(1);
- }
-
- if (grx_open(640, 480, 8) < 0) {
- kern_printf("GRX Err\n");
- sys_abort(1);
- }
- kern_printf("Video card ok!\n");
-
- /* The scenario */
- grx_rect(XMIN-D-1, YMIN-D-1, XMAX+D+1, YMAX+D+1, 14);
- grx_text("Simulation of Random Flies", XMIN, YMENU+10, 13, 0);
- grx_text("SPACE create a fly" , XMIN, YMENU+20, 12, 0);
- grx_text("ESC exit to DOS" , XMIN, YMENU+30, 12, 0);
-
- /* The program waits a space to create a fly */
- c = keyb_getch(BLOCK);
-
- /* randomize!!!! */
- seme = sys_gettime(NULL);
- srand(seme);
-
- do {
- if ((c == ' ') && (i < MAX_P)) {
- hard_task_default_model(m);
- hard_task_def_ctrl_jet (m);
- hard_task_def_arg (m, (void *)i);
- hard_task_def_wcet (m, fly_wcet);
- hard_task_def_mit (m, fly_period);
- hard_task_def_group (m, FLYGROUP);
- hard_task_def_usemath (m);
- pid = task_create("fly", fly, &m, NULL);
- if (pid == NIL) {
- grx_close();
- perror("Could not create task <fly>");
- sys_abort(1);
- }
- task_activate(pid);
- i++;
- }
- c = keyb_getch(BLOCK);
-
- } while (c != ESC);
-
- sys_end();
-
- return 0;
-}
-
-/*--------------------------------------------------------------*/
Index: demos/branches/pj/base/ego.c
===================================================================
--- demos/branches/pj/base/ego.c (revision 1085)
+++ demos/branches/pj/base/ego.c (nonexistent)
@@ -1,279 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/**
- ------------
- CVS : $Id: ego.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:41 $
- ------------
-**/
-
-/*
- * Copyright (C) 2000 Paolo Gai and Giorgio Buttazzo
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/****************************************************************/
-/* PERIODIC PROCESS TEST */
-/****************************************************************/
-
-#include <kernel/kern.h>
-#include <drivers/glib.h>
-#include <drivers/keyb.h>
-
-#include <semaphore.h>
-
-#define X0 10
-
-/* task periods */
-#define PERIOD_T1 100000
-#define PERIOD_T2 200000
-#define PERIOD_T3 300000
-
-/* X position of the text printed by each task */
-int y[3] = {100, 180, 260};
-
-/* text printed by each task */
-char talk[3][50] = { "I am ego1 and I print a character every 100 ms",
- "I am ego2 and I print a character every 200 ms",
- "I am ego3 and I print a character every 300 ms"};
-
-/* A semaphore used to access Video Cards in mutual exclusion */
-sem_t mutex;
-
-/***************************************************************/
-
-TASK ego(void *arg)
-{
-int i = (int)arg;
-int leng;
-char s[2];
-int x;
-int j = 0;
-
- /* compute the length of the string to print */
- leng = 0;
- while (talk[i][leng] != 0) leng++;
-
- x = X0;
- s[1] = 0;
- task_endcycle();
-
- while (1) {
- s[0] = talk[i][j];
- sem_wait(&mutex);
- /* grx_text("TEST", 100,100,12,0); */
- grx_text(s,x,y[i],12+i,0);
- sem_post(&mutex);
- x += 8;
- if (++j == leng) {
- j = 0;
- x = X0;
- y[i] += 8;
- if (y[i]>340) y[i]=100;
- }
- task_endcycle();
- }
-}
-
-
-/****************************************************************/
-
-/* This is the exception handler. It is called when an exception
- is raised.
- It exits from the graphical mode, then it prints a message and
- shutdown the kernel using sys_abort()
-*/
-
-void demo_exc_handler(int signo, siginfo_t *info, void *extra)
-{
- struct timespec t;
-
- grx_close();
-
- /* Default action for an kern exception is */
- kern_cli();
- ll_gettime(TIME_EXACT, &t),
- kern_printf("\nS.Ha.R.K. Exception raised!!!"
- "\nTime (s:ns) :%ld:%ld"
- "\nException number:%d (numbers in include/bits/errno.h)"
- "\nPID :%d\n",
- t.tv_sec, t.tv_nsec, info->si_value.sival_int,
- info->si_task);
- sys_abort(1);
-}
-
-/******************************************************************/
-
-/* This function is called when Alt-X is pressed.
- It simply shutdown the system using sys_end.
- Note that the byebye() function is called only if we exit from
- the system using sys_end()!!!!
-*/
-void my_end(KEY_EVT* e)
-{
- sys_end();
-}
-
-/******************************************************************/
-
-/* This function is called when the system exit correctly after Alt-X.
- It exits from the graphic mode and then it prints a small greeting.
- Note that:
- - The function calls grx_exit, so it must be registered using
- RUNLEVEL_BEFORE_EXIT (RUNLEVEL_AFTER_EXIT does not work because
- at that point the kernel is already returned in real mode!!!)
- - When an exception is raised, the exception handler is called.
- Since the exception handler already exits from the graphic mode,
- this funcion has not to be called. For this reason:
- . we registered byebye using the flag NO_AT_ABORT
- . the exception handler exits using sys_abort; in that way byebye is
- NOT called
-*/
-
-void byebye(void *arg)
-{
- grx_close();
- kern_printf("Bye Bye!\n");
-}
-
-/****************************** MAIN ******************************/
-
-int main(int argc, char **argv)
-{
- PID pid1, pid2, pid3;
- KEY_EVT emerg;
- HARD_TASK_MODEL m1, m2, m3;
- struct sigaction action;
-
- /* Init the standard S.Ha.R.K. exception handler */
- action.sa_flags = SA_SIGINFO; /* Set the signal action */
- action.sa_sigaction = demo_exc_handler;
- action.sa_handler = 0;
- sigfillset(&action.sa_mask); /* we block all the other signals... */
-
- if (sigaction(SIGHEXC, &action, NULL) == -1) { /* set the signal */
- perror("Error initializing signals...");
- sys_end();
- }
-
- /* Set the closing function */
- sys_atrunlevel(byebye, NULL, RUNLEVEL_BEFORE_EXIT|NO_AT_ABORT);
-
- /* Initializes the semaphore */
- sem_init(&mutex,0,1);
-
- /* graphic card Initialization */
- if (grx_init() < 1) {
- sys_abort(1);
- }
-
- if (grx_open(640, 480, 8) < 0) {
- kern_printf("GRX Err\n");
- sys_abort(1);
- }
- kern_printf("Video card ok!\n");
-
- /* set the keyboard handler to exit correctly */
- emerg.ascii = 'x';
- emerg.scan = KEY_X;
- emerg.flag = ALTL_BIT;
- keyb_hook(emerg,my_end);
-
- emerg.ascii = 'x';
- emerg.scan = KEY_X;
- emerg.flag = ALTR_BIT;
- keyb_hook(emerg,my_end);
-
- /* a small banner */
- grx_text("EGO Test",8,8,WHITE,0);
- grx_text("Press Alt-X to exit",8,16,WHITE,0);
-
- /* ego1 creation */
- hard_task_default_model(m1);
- hard_task_def_ctrl_jet (m1);
- hard_task_def_arg (m1, (void *)0);
- hard_task_def_wcet (m1, 5000);
- hard_task_def_mit (m1, PERIOD_T1);
- hard_task_def_group (m1,1);
- pid1 = task_create("ego1", ego, &m1, NULL);
- if (pid1 == NIL) {
- grx_close();
- perror("Could not create task <ego1>");
- sys_abort(1);
- }
-
- /* ego2 creation */
- hard_task_default_model(m2);
- hard_task_def_ctrl_jet (m2);
- hard_task_def_arg (m2, (void *)1);
- hard_task_def_wcet (m2, 5000);
- hard_task_def_mit (m2, PERIOD_T2);
- hard_task_def_group (m2,1);
- pid2 = task_create("ego2", ego, &m2, NULL);
- if (pid2 == NIL) {
- grx_close();
- perror("Could not create task <ego2>");
- sys_abort(1);
- }
-
- /* ego3 creation */
- hard_task_default_model(m3);
- hard_task_def_ctrl_jet (m3);
- hard_task_def_arg (m3, (void *)2);
- hard_task_def_wcet (m3, 5000);
- hard_task_def_mit (m3, PERIOD_T3);
- hard_task_def_group (m3,1);
- pid3 = task_create("ego3", ego, &m3, NULL);
- if (pid3 == NIL) {
- grx_close();
- perror("Could not create task <ego3>");
- sys_abort(1);
- }
-
- /* and finally we activate the three threads... */
- group_activate(1);
-
- /*
- now the task main ends, but the system does not shutdown because
- there are the three task ego1, ego2, and ego3 running.
-
- The demo will finish if a Alt-X key is pressed.
- */
-
- return 0;
-}
-
-/****************************************************************/
Index: demos/branches/pj/base/makefile
===================================================================
--- demos/branches/pj/base/makefile (revision 1085)
+++ demos/branches/pj/base/makefile (nonexistent)
@@ -1,22 +0,0 @@
-#
-#
-#
-
-ifndef BASE
-BASE=../..
-endif
-include $(BASE)/config/config.mk
-
-PROGS= ego fly cabs
-
-include $(BASE)/config/example.mk
-
-ego:
- make -f $(SUBMAKE) APP=ego INIT= OTHEROBJS="initfile.o" OTHERINCL=
-
-fly:
- make -f $(SUBMAKE) APP=fly INIT= OTHEROBJS="initfile.o" OTHERINCL=
-
-cabs:
- make -f $(SUBMAKE) APP=cabs INIT= OTHEROBJS="initfile.o" OTHERINCL=
-
Index: demos/branches/pj/base/cabs.dat
===================================================================
--- demos/branches/pj/base/cabs.dat (revision 1085)
+++ demos/branches/pj/base/cabs.dat (nonexistent)
@@ -1,11 +0,0 @@
-----------------------------------------------------
-system tick (ms): 1
-----------------------------------------------------
-
-task periods (ticks)
-----------------------------------------------------
-producer 1: 200 consumer 1: 400
-producer 2: 100 consumer 2: 400
-producer 3: 300 consumer 3: 150
-producer 4: 800 consumer 4: 200
-----------------------------------------------------
Index: demos/branches/pj/base/initfile.c
===================================================================
--- demos/branches/pj/base/initfile.c (revision 1085)
+++ demos/branches/pj/base/initfile.c (nonexistent)
@@ -1,120 +0,0 @@
-/*
- * Project: S.Ha.R.K.
- *
- * Coordinators:
- * Giorgio Buttazzo <giorgio@sssup.it>
- * Paolo Gai <pj@gandalf.sssup.it>
- *
- * Authors :
- * Paolo Gai <pj@gandalf.sssup.it>
- * (see the web pages for full authors list)
- *
- * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
- *
- * http://www.sssup.it
- * http://retis.sssup.it
- * http://shark.sssup.it
- */
-
-/*
- ------------
- CVS : $Id: initfile.c,v 1.1.1.1 2002-09-02 09:37:41 pj Exp $
-
- File: $File$
- Revision: $Revision: 1.1.1.1 $
- Last update: $Date: 2002-09-02 09:37:41 $
- ------------
-
- System initialization file
-
- This file contains the 2 functions needed to initialize the system.
-
- These functions register the following levels:
-
- an EDF (Earliest Deadline First) level
- a RR (Round Robin) level
- a CBS (Costant Bandwidth Server) level
- a Dummy level
-
- It can accept these task models:
-
- HARD_TASK_MODEL (wcet+mit) at level 0
- SOFT_TASK_MODEL (met, period) at level 1
- NRT_TASK_MODEL at level 2
-
- This file is similar to the configuration of kernel/init/hartik3.c
-
- TICK is set to 0 (one-shot timer is used)
-*/
-
-/*
- * Copyright (C) 2000 Paolo Gai
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "kernel/kern.h"
-#include "modules/edf.h"
-#include "modules/cbs.h"
-#include "modules/rr.h"
-#include "modules/dummy.h"
-
-#include "modules/sem.h"
-#include "modules/hartport.h"
-#include "modules/cabs.h"
-
-#include "drivers/keyb.h"
-
-
-/*+ sysyem tick in us +*/
-#define TICK 0
-
-/*+ RR tick in us +*/
-#define RRTICK 10000
-
-TIME __kernel_register_levels__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- EDF_register_level(EDF_ENABLE_ALL);
- CBS_register_level(CBS_ENABLE_ALL, 0);
- RR_register_level(RRTICK, RR_MAIN_YES, mb);
- dummy_register_level();
-
- SEM_register_module();
-
- CABS_register_module();
-
- return TICK;
-}
-
-TASK __init__(void *arg)
-{
- struct multiboot_info *mb = (struct multiboot_info *)arg;
-
- KEYB_PARMS kparms = BASE_KEYB;
-
- HARTPORT_init();
-
- keyb_def_ctrlC(kparms, NULL);
- keyb_def_map(kparms,itaMap);
- KEYB_init(&kparms);
-
- __call_main__(mb);
-
- return (void *)0;
-}
-
Index: demos/branches/pj/base/cabs.c
===================================================================
--- demos/branches/pj/base/cabs.c (revision 1085)
+++ demos/branches/pj/base/cabs.c (nonexistent)
@@ -1,323 +0,0 @@
-/*--------------------------------------------------------------*/
-/* TEST ON CABS */
-/*--------------------------------------------------------------*/
-
-#include <kernel/kern.h>
-#include <modules/cabs.h>
-#include <drivers/glib.h>
-#include <drivers/keyb.h>
-#include <string.h>
-
-#define NCAB 4 /* max number of CABs */
-#define NCAR 26 /* generated characters */
-
-#define YP 32 /* level of arrows */
-#define R 20 /* task radius */
-#define YY (YP+R+32) /* level of writing */
-#define DELTA (2*R+72) /* total channel hight */
-#define X1 120 /* start column for P1 */
-#define X2 360 /* start column for P2 */
-
-#define XP1 (X1+64) /* X position of task 1 */
-#define XP2 (X2+64) /* X position of task 2 */
-#define XC (XP1+96) /* X position of CAB */
-#define L 52 /* CAB rectangle length */
-
-void my_exit(KEY_EVT *k);
-void draw_channel(int i);
-void create_channel(int i);
-void get_data();
-
-TASK producer(void *arg);
-TASK consumer(void *arg);
-
-char *cname[NCAB] = {"cab1", "cab2", "cab3", "cab4"};
-char *pname1[NCAB] = {"wr1", "wr2", "wr3", "wr4"};
-char *pname2[NCAB] = {"rd1", "rd2", "rd3", "rd4"};
-
-CAB cid[NCAB]; /* CAB identifiers */
-PID p1[NCAB], p2[NCAB]; /* task identifiers */
-
-/* Task Periods */
-TIME t1[NCAB] = {200000, 100000, 300000, 800000};
-TIME t2[NCAB] = {400000, 400000, 150000, 200000};
-
-/* Task WCETS */
-TIME w1[NCAB] = {10000, 10000, 10000, 10000};
-TIME w2[NCAB] = {10000, 10000, 10000, 10000};
-
-
-/****************************************************************/
-
-/* This is the exception handler. It is called when an exception
- is raised.
- It exits from the graphical mode, then it prints a message and
- shutdown the kernel using sys_abort()
-*/
-
-void demo_exc_handler(int signo, siginfo_t *info, void *extra)
-{
- struct timespec t;
-
- grx_close();
-
- /* Default action for an kern exception is */
- kern_cli();
- ll_gettime(TIME_EXACT, &t),
- kern_printf("\nS.Ha.R.K. Exception raised!!!"
- "\nTime (s:ns) :%ld:%ld"
- "\nException number:%d (numbers in include/bits/errno.h)"
- "\nPID :%d\n",
- t.tv_sec, t.tv_nsec, info->si_value.sival_int,
- info->si_task);
- sys_abort(1);
-}
-
-/******************************************************************/
-
-/* This function is called when Alt-X is pressed.
- It simply shutdown the system using sys_end.
- Note that the byebye() function is called only if we exit from
- the system using sys_end()!!!!
-*/
-void my_end(KEY_EVT* e)
-{
- sys_end();
-}
-
-/******************************************************************/
-
-/* This function is called when the system exit correctly after Alt-X.
- It exits from the graphic mode and then it prints a small greeting.
- Note that:
- - The function calls grx_exit, so it must be registered using
- RUNLEVEL_BEFORE_EXIT (RUNLEVEL_AFTER_EXIT does not work because
- at that point the kernel is already returned in real mode!!!)
- - When an exception is raised, the exception handler is called.
- Since the exception handler already exits from the graphic mode,
- this funcion has not to be called. For this reason:
- . we registered byebye using the flag NO_AT_ABORT
- . the exception handler exits using sys_abort; in that way byebye is
- NOT called
-*/
-
-
-/*--------------------------------------------------------------*/
-/* User exit function */
-/*--------------------------------------------------------------*/
-
-void byebye(void *arg)
-{
- grx_close();
- kern_printf("Bye Bye!\n");
-}
-
-/*--------------------------------------------------------------*/
-/* Main task */
-/*--------------------------------------------------------------*/
-
-
-/****************************** MAIN ******************************/
-
-int main(int argc, char **argv)
-{
- struct sigaction action;
-
- char c = 0; /* character from keyboard */
-
- /* Init the standard S.Ha.R.K. exception handler */
- action.sa_flags = SA_SIGINFO; /* Set the signal action */
- action.sa_sigaction = demo_exc_handler;
- action.sa_handler = 0;
- sigfillset(&action.sa_mask); /* we block all the other signals... */
-
- if (sigaction(SIGHEXC, &action, NULL) == -1) { /* set the signal */
- perror("Error initializing signals...");
- sys_end();
- }
-
- /* Set the closing function */
- sys_atrunlevel(byebye, NULL, RUNLEVEL_BEFORE_EXIT|NO_AT_ABORT);
-
- /* graphic card Initialization */
- if (grx_init() < 1) {
- sys_abort(1);
- }
-
- if (grx_open(640, 480, 8) < 0) {
- kern_printf("GRX Err\n");
- sys_abort(1);
- }
- kern_printf("Video card ok!\n");
-
- grx_clear(BLACK);
-
- grx_text("Press a key [1-4]", 10, 16, 7, 0);
- grx_text("to create a pair", 10, 24, 7, 0);
- grx_text("ESC to exit demo", 10, 48, 7, 0);
-
- while (c != 27) {
- c = keyb_getch(BLOCK);
- if ((c >= '1') && (c <= '1'+NCAB-1))
- create_channel(c-'1');
- }
-
- sys_end();
-
- return 0;
-}
-
-
-/*--------------------------------------------------------------*/
-/* write data in a cab */
-/*--------------------------------------------------------------*/
-
-TASK producer(void *arg)
-{
-int i = (int)arg;
-char c; /* message character */
-char *p; /* pointer to a cab buffer */
-char s[2]; /* string to display */
-int k = 0;
-int x, y;
-int col = 13;
-int ybase = YY + i*DELTA;
-
- x = X1;
- y = ybase;
- s[1] = 0;
-
- k = 0;
- while (1) {
- c = 'A' + k;
- p = cab_reserve(cid[i]);
- *p = c;
- cab_putmes(cid[i], p);
-
- s[0] = c;
- k = (k + 1) % NCAR;
- grx_text(s,x,y,col,0);
-
- x += 8;
- if (x >= (X1 + NCAR*8)) {
- x = X1;
- y = y + 8;
- if (y >= ybase+16) {
- y = ybase;
- col = col % 15 + 1;
- }
- }
-
- task_endcycle();
- }
-}
-
-/*--------------------------------------------------------------*/
-/* read data from a cab */
-/*--------------------------------------------------------------*/
-
-TASK consumer(void *arg)
-{
-int i = (int)arg;
-char *p;
-char s[2];
-int x, y;
-int col = 13;
-int ybase = YY + i*DELTA;
-
- x = X2;
- y = ybase;
- s[1] = 0;
-
- while (1) {
- p = cab_getmes(cid[i]);
- s[0] = *p - 'A' + 'a';
- cab_unget(cid[i], p);
-
- grx_text(s,x,y,col,0);
- x += 8;
-
- if (x >= (X2 + NCAR*8)) {
- x = X2;
- y = y + 8;
- if (y >= ybase+16) {
- y = ybase;
- col = col % 15 + 1;
- }
- }
- task_endcycle();
- }
-}
-
-/*--------------------------------------------------------------*/
-/* create the two tasks and a channel */
-/*--------------------------------------------------------------*/
-
-void create_channel(int i)
-{
- HARD_TASK_MODEL m;
-
- draw_channel(i);
- cid[i] = cab_create(cname[i], 1, 2);
-
- hard_task_default_model(m);
- hard_task_def_ctrl_jet (m);
- hard_task_def_arg (m, (void *)i);
- hard_task_def_wcet (m, w1[i]);
- hard_task_def_mit (m, t1[i]);
- hard_task_def_usemath (m);
- p1[i] = task_create(pname1[i], producer, &m, NULL);
- if (p1[i] == NIL) {
- grx_close();
- perror("Could not create task <producer>");
- sys_abort(1);
- }
- task_activate(p1[i]);
-
- hard_task_default_model(m);
- hard_task_def_ctrl_jet (m);
- hard_task_def_arg (m, (void *)i);
- hard_task_def_wcet (m, w2[i]);
- hard_task_def_mit (m, t2[i]);
- hard_task_def_usemath (m);
- p2[i] = task_create(pname2[i], consumer, &m, NULL);
- if (p2[i] == NIL) {
- grx_close();
- perror("Could not create task <consumer>");
- sys_abort(1);
- }
- task_activate(p2[i]);
-}
-
-/*--------------------------------------------------------------*/
-/* Disegna i processi e il canale di comunicazione */
-/*--------------------------------------------------------------*/
-
-void draw_channel(int i)
-{
-char buffer[32]; /* buffer per sprintf */
-int yc = YP + i*DELTA; /* altezza del canale */
-
- grx_circle(XP1,yc,R,2);
- grx_text("P1",XP1-8,yc-4,12,0);
-
- grx_circle(XP2,yc,R,2);
- grx_text("P2",XP2-8,yc-4,12,0);
-
- grx_rect(XC,yc-R,XC+L,yc+R,3);
- grx_text("CAB",XC+16,yc-4,12,0);
-
- grx_line(XP1+R,yc,XC,yc,4);
- grx_line(XC+L,yc,XP2-R,yc,4);
-
- grx_text("T1 = ms",X1+40,yc+R+16,14,0);
- sprintf(buffer,"%ld", t1[i]);
- grx_text(buffer,X1+88,yc+R+16,14,0);
-
- grx_text("T2 = ms",X2+40,yc+R+16,14,0);
- sprintf(buffer,"%ld", t2[i]);
- grx_text(buffer,X2+88,yc+R+16,14,0);
-}
-
-/*--------------------------------------------------------------*/
-
Index: demos/branches/pj/readme.txt
===================================================================
--- demos/branches/pj/readme.txt (revision 1085)
+++ demos/branches/pj/readme.txt (nonexistent)
@@ -1,7 +0,0 @@
-Hi, these are the S.Ha.R.K. demos...
-
-the old examples directory is now called demos/oldexamples...
-
-Enjoy
-
-PJ